Version 2.2.1-dev.1.0

Merge commit '1dd45592712299947974158e4d3937397d099ac1' into dev
diff --git a/.gitignore b/.gitignore
index 2e3efaa3..8012a26 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,6 +39,9 @@
 .clang_complete
 cmake-build-debug
 
+# VS project files
+.vs
+
 # VSCode project files
 .vscode
 .history
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 263f5b5..e111253 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,14 +1,53 @@
+## 2.2.1-dev.1.0
+
+### Tool Changes
+
+#### Pub client
+
+* Added a CHANGELOG validator that complains if you `pub publish` without mentioning the current
+  version.
+* Added support for `pub global activate`ing package from a custom pub URL.
+* Added subcommand: `pub logout`. Logs you out of the current session.
+
+#### dart2js
+
+*  `--dump-info=binary`
+
+   A binary format was added to dump-info. The old JSON format is still
+   available and provided by default, but we are starting to deprecate it.
+
+   The new binary format is more compact and cheaper to generate.  On some large
+   apps we tested, it was 4x faster to serialize and used 6x less memory.
+
+   To use it today, use `--dump-info=binary`, instead of `--dump-info`.
+
+   What to expect next?
+   * The [visualizer tool][visualizer] will not be updated to support this new
+     format, but you can find several command-line tools at
+     `package:dart2js_info` that provide similar features to those in the
+     visualizer.
+
+   * The command-line tools in `package:dart2js_info` also work with the old
+     JSON format, so you can start using it even before you enable the new
+     format.
+
+   * In a future release `--dump-info` will default to `--dump-info=binary`. At
+     that point, there will be an option to fallback to the JSON format, but the
+     visualizer tool will be deprecated.
+
+   * A release after that, the JSON format will no longer be available from
+     dart2js, but may be availabe from a command-line tool in
+     `package:dart2js_info`.
+
+[visualizer]: https://dart-lang.github.io/dump-info-visualizer/
+
 ## 2.2.1-dev.0.0
 
 * Cherry-pick 6f8415245d4dd298730facf83e03de69fc29bbd3 to dev
 * Cherry-pick e7d263b05f7f66d15f778df60ee60625e9a3c5f4 to dev
 * Cherry-pick dc8a56bc0ece296915c7016e0a8241c7068eca18 to dev
 
-## 2.2.0-dev.2.1
-
-* Cherry-pick 765e6338a803ee17472b1fa715ffcfbd4ea46bfb to dev
-
-## 2.2.0-dev.2.0
+## 2.2.0 - 2019-02-26
 
 ### Language
 
diff --git a/DEPS b/DEPS
index e8098e9..88c3561 100644
--- a/DEPS
+++ b/DEPS
@@ -36,7 +36,7 @@
   "chromium_git": "https://chromium.googlesource.com",
   "fuchsia_git": "https://fuchsia.googlesource.com",
 
-  "co19_2_rev": "31f7dc1e222910ce64ab57ffee286382b03446a4",
+  "co19_2_rev": "b54821029f62b5b5873925cfef6c01f1100d1982",
 
   # As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
   # should be kept up to date with the revisions pulled by the Flutter engine.
@@ -65,7 +65,7 @@
   "convert_tag": "2.0.2",
   "crypto_tag" : "2.0.6",
   "csslib_tag" : "0.14.4+1",
-  "dart2js_info_tag" : "0.5.15",
+  "dart2js_info_tag" : "0.6.0",
 
   # Note: updates to dart_style have to be coordinated carefully with
   # the infrastructure-team so that the internal formatter in
@@ -81,13 +81,13 @@
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
   "dart_style_tag": "1.2.2",  # Please see the note above before updating.
 
-  "dartdoc_tag" : "v0.28.1+2",
+  "dartdoc_tag" : "v0.28.2",
   "fixnum_tag": "0.10.9",
   "glob_tag": "1.1.7",
-  "html_tag" : "0.13.3+2",
+  "html_tag" : "0.13.4+1",
   "http_io_rev": "57da05a66f5bf7df3dd7aebe7b7efe0dfc477baa",
   "http_multi_server_tag" : "2.0.5",
-  "http_parser_tag" : "3.1.1",
+  "http_parser_tag" : "3.1.3",
   "http_retry_tag": "0.1.1",
   "http_tag" : "0.12.0",
   "http_throttle_tag" : "1.0.2",
@@ -106,13 +106,13 @@
   "oauth2_tag": "1.2.1",
   "observatory_pub_packages_rev": "0894122173b0f98eb08863a7712e78407d4477bc",
   "package_config_tag": "1.0.5",
-  "package_resolver_tag": "1.0.4",
+  "package_resolver_tag": "1.0.10",
   "path_tag": "1.6.2",
   "plugin_tag": "f5b4b0e32d1406d62daccea030ba6457d14b1c47",
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "1.3.6",
   "protobuf_tag": "0.9.0",
-  "pub_rev": "9f00679ef47bc79cadc18e143720ade6c06c0100",
+  "pub_rev": "3c060aae47985e9a248b850f1d0450304a5c97e3",
   "pub_semver_tag": "1.4.2",
   "quiver_tag": "2.0.0+1",
   "resource_rev": "2.1.5",
@@ -124,7 +124,7 @@
   "source_map_stack_trace_tag": "1.1.5",
   "source_maps-0.9.4_rev": "38524",
   "source_maps_tag": "8af7cc1a1c3a193c1fba5993ce22a546a319c40e",
-  "source_span_tag": "1.4.1",
+  "source_span_tag": "1.5.5",
   "stack_trace_tag": "1.9.3",
   "stream_channel_tag": "1.6.8",
   "string_scanner_tag": "1.0.3",
@@ -157,7 +157,7 @@
   Var("dart_root") + "/tools/sdks": {
       "packages": [{
           "package": "dart/dart-sdk/${{platform}}",
-          "version": "version:2.1.1-dev.1.0",
+          "version": "version:2.2.1-dev.0.0",
       }],
       "dep_type": "cipd",
   },
@@ -437,7 +437,7 @@
     ],
   },
   {
-    "name": "7zip",
+    "name": "front_end_benchmark_data",
     "pattern": ".",
     "action": [
       "download_from_google_storage",
@@ -445,10 +445,10 @@
       "--no_resume",
       "--bucket",
       "dart-dependencies",
-      "--platform=win32",
+      "--recursive",
       "--extract",
-      "-s",
-      Var('dart_root') + "/third_party/7zip.tar.gz.sha1",
+      "--directory",
+      Var('dart_root') + "/pkg/front_end/test/fasta/types",
     ],
   },
   {
@@ -495,4 +495,30 @@
     'pattern': '.',
     'action': ['python', 'sdk/build/vs_toolchain.py', 'update'],
   },
+  {
+    # Download dill files for all supported ABI versions, if necessary.
+    'name': 'abiversions',
+    'pattern': '.',
+    'action': ['python', 'sdk/tools/download_abi_dills.py'],
+  },
 ]
+
+hooks_os = {
+  "win": [
+    {
+      "name": "7zip",
+      "pattern": ".",
+      "action": [
+        "download_from_google_storage",
+        "--no_auth",
+        "--no_resume",
+        "--bucket",
+        "dart-dependencies",
+        "--platform=win32",
+        "--extract",
+        "-s",
+        Var('dart_root') + "/third_party/7zip.tar.gz.sha1",
+      ],
+    },
+  ]
+}
diff --git a/build/linux/sysroot_scripts/install-sysroot.py b/build/linux/sysroot_scripts/install-sysroot.py
index 4500023..304824d9 100755
--- a/build/linux/sysroot_scripts/install-sysroot.py
+++ b/build/linux/sysroot_scripts/install-sysroot.py
@@ -131,8 +131,6 @@
   if os.path.exists(stamp):
     with open(stamp) as s:
       if s.read() == url:
-        print '%s %s sysroot image already up to date: %s' % \
-            (target_platform, target_arch, sysroot)
         return
 
   print 'Installing Debian %s %s root image: %s' % \
diff --git a/docs/language/dart.sty b/docs/language/dart.sty
index 0ad847e..77d8efa 100644
--- a/docs/language/dart.sty
+++ b/docs/language/dart.sty
@@ -107,27 +107,28 @@
 \newcommand{\Case}[1]{\textbf{Case }$\langle\hspace{0.1em}${#1}$\hspace{0.1em}\rangle$\textbf{.}}
 \newcommand{\EndCase}{\mbox{}\hfill$\scriptscriptstyle\Box$\xspace}
 
-\newenvironment{dartCode}[1][!ht] {
+\newenvironment{dartCode}[1][!ht] {%
   \def\@programcr{\@addfield\strut}%
   \let\\=\@programcr%
   \relax\@vobeyspaces\obeylines%
   \ttfamily\color{commentaryColor}%
-  \vspace{1em}
+  \vspace{1em}%
 }{\normalcolor\vspace{1em}}
 
-\newenvironment{normativeDartCode}[1][!ht] {
+\newenvironment{normativeDartCode}[1][!ht] {%
   \def\@programcr{\@addfield\strut}%
   \let\\=\@programcr%
   \relax\@vobeyspaces\obeylines%
   \ttfamily\color{normativeColor}%
-  \vspace{1em}
+  \vspace{1em}%
 }{\normalcolor\vspace{1em}}
 
 % Used for comments in a code context.
 \def\comment#1{\textsf{#1}}
 
-% A commonly used name for an identifier
+% A commonly used metavariable for an identifier, operator.
 \newcommand{\id}{\metavar{id}}
+\newcommand{\op}{\metavar{op}}
 
 % Used for defining occurrence of phrase, with customized index entry.
 \newcommand{\IndexCustom}[2]{%
@@ -142,7 +143,7 @@
 \newcommand{\Index}[1]{\IndexCustom{#1}{#1}}
 
 % Same appearance, but not adding an entry to the index.
-\newcommand{\NoIndex}[1]{
+\newcommand{\NoIndex}[1]{%
   \leavevmode\marginpar{\ensuremath{\diamond}}\emph{#1}}
 
 % Used to specify comma separated lists of similar symbols.
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 04bdb83..6cb53cc 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -173,6 +173,9 @@
 % - Integrate generalized-void.md. Introduces syntactic support for using
 %   `void` in many new locations, including variable type annotations and
 %   actual type arguments; also adds errors for using values of type `void`.
+% - Integrate implicit_creation.md, specifying how some constant expressions
+%   can be written without `const`, and all occurrences of `new` can be
+%   omitted.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -419,24 +422,85 @@
 \IndexCustom{fresh variable}{variable!fresh},
 it means a variable with a name that doesn't occur anywhere
 in the current program.
-When the specification introduces a fresh variable bound to a value, the fresh variable is implicitly bound in a surrounding scope.
+When the specification introduces a fresh variable bound to an object,
+the fresh variable is implicitly bound in a surrounding scope.
 
 \LMHash{}%
-References to otherwise unspecified names of program entities (such as classes or functions) are interpreted as the names of members of the Dart core library.
+References to otherwise unspecified names of program entities
+(such as classes or functions)
+are interpreted as the names of members of the Dart core library.
 
-\commentary{
-Examples would be the classes \code{Object} and \code{Type} representing the root of the class hierarchy and the reification of run-time types respectively.
+\commentary{%
+Examples would be the classes \code{Object} and \code{Type}
+representing, respectively, the root of the class hierarchy and
+the reification of run-time types.
+%
+It would be possible to declare, e.g.,
+a local variable named \code{Object},
+so it is generally incorrect to assume that
+the name \code{Object} will actually resolve to said core class.
+However, we will generally omit mentioning this, for brevity.%
 }
 
+%% TODO(eernst): We need to get rid of the concept of `is equivalent to`,
+%% cf. language issue https://github.com/dart-lang/language/issues/227.
+%% In this CL the phrase `treated as` has been introduced in a few places,
+%% and the above-mentioned issue 227 will give rise to a complete revision
+%% of this aspect of this document. In particular, the next paragraph will
+%% be deleted.
+
 \LMHash{}%
 When the specification says that one piece of syntax \Index{is equivalent to}
 another piece of syntax, it means that it is equivalent in all ways,
 and the former syntax should generate the same compile-time errors
 and have the same run-time behavior as the latter, if any.
-\commentary{
-Error messages, if any, should always refer to the original syntax.
+\commentary{%
+Error messages, if any, should always refer to the original syntax.%
 }
-If execution or evaluation of a construct is said to be equivalent to execution or evaluation of another construct, then only the run-time behavior is equivalent, and compile-time errors apply only for the original syntax.
+If execution or evaluation of a construct is said to be
+equivalent to execution or evaluation of another construct,
+then only the run-time behavior is equivalent,
+and compile-time errors apply only for the original syntax.
+
+\LMHash{}%
+When the specification says that one piece of syntax $s$ is
+\Index{treated as}
+another piece of syntax $s'$,
+it means that the static analysis of $s$ is the static analysis of $s'$
+(\commentary{in particular, exactly the same compile-time errors occur}).
+Moreover, if $s$ has no compile-time errors then
+the behavior of $s$ at run time is exactly the behavior of $s'$.
+
+\rationale{%
+Error \emph{messages}, if any, should always refer to the original syntax $s$.%
+}
+
+\commentary{%
+In short, whenever $s$ is treated as $s'$,
+the reader should immediately switch to the section about $s'$
+in order to get any further information about
+the static analysis and dynamic semantics of $s$.%
+}
+
+\rationale{%
+The notion of being `treated as' is similar to the notion of syntactic sugar:
+``$s$ is treated as $s'$''
+could as well have been worded
+``$s$ is desugared into $s'$''.
+Of course, it should then actually be called ``semantic sugar'',
+because the applicability of the transformation and the construction of $s'$
+may rely on information from static analysis.
+
+The point is that we only specify the static analysis and dynamic semantics
+of a core language which is a subset of Dart
+(just slightly smaller than Dart),
+and desugaring transforms any given Dart program to
+a program in that core language.
+This helps keeping the language specification consistent and comprehensible,
+because it shows directly
+that some language features are introducing essential semantics,
+and others are better described as mere abbreviations of existing constructs.%
+}
 
 
 \section{Overview}
@@ -852,6 +916,12 @@
 is a variable whose declaration includes the modifier \CONST{}.
 A constant variable must be initialized to a constant expression (\ref{constants}) or a compile-time error occurs.
 
+\commentary{%
+An initializing expression of a constant variable occurs in a constant context
+(\ref{constantContexts}),
+which means that \CONST{} modifiers need not be specified explicitly.%
+}
+
 \LMHash{}%
 A \IndexCustom{final variable}{variable!final}
 is a variable whose binding is fixed upon initialization;
@@ -3056,7 +3126,7 @@
 
 \LMHash{}%
 Then if any instance variable of $i$ declared by the immediately enclosing class
-is not yet bound to a value,
+is not yet bound to an object,
 all such variables are initialized with the null object (\ref{null}).
 
 \LMHash{}%
@@ -4588,13 +4658,13 @@
 
 \begin{normativeDartCode}
 $m$ \CLASS{} $E$ \{
-  \FINAL{} int index;
-  \CONST{} $E$(\THIS{}.index);
-  $m_0$ \STATIC{} \CONST{} $E$ $\id_0$ = \CONST{} $E$(0);
-  $\ldots$
-  $m_{n-1}$ \STATIC{} \CONST{} $E$ $\id_{n-1}$ = const $E$(n - 1);
-  \STATIC{} \CONST{} List<$E$> values = const <$E$>[\id$_0, \ldots, $ \id$_{n-1}$];
-  String toString() => \{ 0: `$E$.\id$_0$', $\ldots$, n-1: `$E$.\id$_{n-1}$'\}[index]
+\ \ \FINAL{} int index;
+\ \ \CONST{} $E$(\THIS{}.index);
+\ \ $m_0$ \STATIC{} \CONST{} $E$ $\id_0$ = \CONST{} $E$(0);
+\ \ $\ldots$
+\ \ $m_{n-1}$ \STATIC{} \CONST{} $E$ $\id_{n-1}$ = const $E$(n - 1);
+\ \ \STATIC{} \CONST{} List<$E$> values = const <$E$>[\id$_0, \ldots, $ \id$_{n-1}$];
+\ \ String toString() => \{ 0: `$E$.\id$_0$', $\ldots$, n-1: `$E$.\id$_{n-1}$'\}[index]
 \}
 \end{normativeDartCode}
 
@@ -5720,82 +5790,91 @@
 Dart supports metadata which is used to attach user defined annotations to program structures.
 
 \begin{grammar}
-<metadata> ::= (`@' <qualified> (`.' <identifier>)? (<arguments>)?)*
+<metadata> ::= (`@' <qualified> (`.' <identifier>)? <arguments>?)*
 \end{grammar}
 
 \LMHash{}%
-Metadata consists of a series of annotations, each of which begin with the character @, followed by a constant expression that starts with an identifier.
-It is a compile-time error if the expression is not one of the following:
+Metadata consists of a series of annotations,
+each of which begin with the character \lit{@},
+followed by a constant expression $e$ derivable from
+\syntax{<qualified> (`.' <identifier>)? <arguments>?}.
+It is a compile-time error if $e$ is not one of the following:
 \begin{itemize}
 \item A reference to a constant variable.
 \item A call to a constant constructor.
 \end{itemize}
 
+\commentary{%
+The expression $e$ occurs in a constant context
+(\ref{constantContexts}),
+which means that \CONST{} modifiers need not be specified explicitly.
+}
+
 \LMHash{}%
-Metadata is associated with the abstract syntax tree of the program construct $p$ that immediately follows the metadata, assuming $p$ is not itself metadata or a comment.
-Metadata can be retrieved at run time via a reflective call, provided the annotated program construct $p$ is accessible via reflection.
+Metadata is associated with the abstract syntax tree
+of the program construct $p$ that immediately follows the metadata,
+and which is not itself metadata or a comment.
+Metadata can be retrieved at run time via a reflective call,
+provided the annotated program construct $p$ is accessible via reflection.
 
 \commentary{
-Obviously, metadata can also be retrieved statically by parsing the program and evaluating the constants via a suitable interpreter.
-In fact many if not most uses of metadata are entirely static.
+Obviously, metadata can also be retrieved statically by
+parsing the program and evaluating the constants via a suitable interpreter.
+In fact, many if not most uses of metadata are entirely static.
 }
 
 \rationale{
-It is important that no run-time overhead be incurred by the introduction of metadata that is not actually used.
-Because metadata only involves constants, the time at which it is computed is irrelevant so that implementations may skip the metadata during ordinary parsing and execution and evaluate it lazily.
+It is important that no run-time overhead be incurred by
+the introduction of metadata that is not actually used.
+Because metadata only involves constants,
+the time at which it is computed is irrelevant.
+So implementations may skip the metadata during ordinary parsing and execution,
+and evaluate it lazily.
 }
 
 \commentary{
-It is possible to associate metadata with constructs that may not be accessible via reflection, such as local variables (though it is conceivable that in the future, richer reflective libraries might provide access to these as well).
+It is possible to associate metadata with constructs
+that may not be accessible via reflection,
+such as local variables
+(though it is conceivable that in the future,
+richer reflective libraries might provide access to these as well).
 This is not as useless as it might seem.
 As noted above, the data can be retrieved statically if source code is available.
 }
 
 \LMHash{}%
-Metadata can appear before a library, part header, class, typedef, type parameter, constructor, factory, function, parameter, or variable declaration and before an import, export or part directive.
+Metadata can appear before a library, part header, class,
+typedef, type parameter, constructor, factory, function,
+parameter, or variable declaration,
+and before an import, export, or part directive.
 
 \LMHash{}%
-The constant expression given in an annotation is type checked and evaluated in the scope surrounding the declaration being annotated.
+The constant expression given in an annotation is type checked and evaluated
+in the scope surrounding the declaration being annotated.
 
 
 \section{Expressions}
 \LMLabel{expressions}
 
 \LMHash{}%
-\label{evaluation}
-An \Index{expression} is a fragment of Dart code that can be evaluated at run time.
-Evaluating an expression either
-\IndexCustom{produces a value}{expression!produces a value}
-(an object),
-or it
-\IndexCustom{throws}{expression!throws}
-an exception object and an associated stack trace.
-In the former case, we also say that the expression
-\NoIndex{evaluates to a value}.
+An \Index{expression} is a fragment of Dart code
+that can be evaluated at run time.
 
 \LMHash{}%
 Every expression has an associated static type (\ref{staticTypes}) and
-may have an associated static context type.
-\commentary{The static context type represents
-the type expectation of the surrounding context,
-the expression or statement that the expression itself is part of.
-Some contexts may not introduce any static context type.}
-The static context type may affect the static type and evaluation
-of the expression.
+may have an associated static context type
+%% TODO(eernst): This ref is undefined until CL 92782 is landed.
+%% (\ref{contextTypes}),
+which may affect the static type and evaluation of the expression.
 Every value has an associated dynamic type (\ref{dynamicTypeSystem}).
 
-\LMHash{}%
-If evaluation of one expression, $e$, is defined in terms of evaluation of another expression, typically a subexpression of $e$,
-and the evaluation of the other expression throws an exception and a stack trace,
-the evaluation of $e$ stops at that point and throws the same exception object and stack trace.
-
 \begin{grammar}
 <expression> ::= <assignableExpression> <assignmentOperator> <expression>
   \alt <conditionalExpression> <cascadeSection>*
   \alt <throwExpression>
 
-<expressionWithoutCascade> ::= <assignableExpression> <assignmentOperator>
-  \gnewline{} <expressionWithoutCascade>
+<expressionWithoutCascade> ::= \gnewline{}
+  <assignableExpression> <assignmentOperator> <expressionWithoutCascade>
   \alt <conditionalExpression>
   \alt <throwExpressionWithoutCascade>
 
@@ -5815,11 +5894,50 @@
 An expression $e$ may always be enclosed in parentheses, but this never has any semantic effect on $e$.
 
 \commentary{
-Sadly, it may have an effect on the surrounding expression.
-Given a class $C$ with static method $m => 42$, $C.m()$ returns 42, but $(C).m()$ produces a \code{NoSuchMethodError}.
+However, it may have an effect on the surrounding expression.
+For instance, given a class \code{C} with a static method
+\code{m() => 42}, \code{C.m()} returns 42,
+but \code{(C).m()} is a compile-time error.
+%
+The point is that the meaning of \code{C.m()}
+is specified in terms of several parts,
+rather than being specified in a strictly compositional manner.
+Concretely, the meaning of \code{C} and \code{(C)} as expressions is the same,
+but the meaning of \code{C.m()} is not defined in terms of
+the meaning of \code{C} as an expression,
+and it differs from the meaning of \code{(C).m()}.
+% A strictly compositional evaluation would always evaluate every subexpression
+% using the same rules (`evaluation` is always the same thing), and then it
+% would combine the evaluation results into the result of the whole expression.
+% We won't expand on that here, and in particular we won't discuss whether
+% compositional evaluation is even meaningful in the context of side-effects.
+% But it's still useful to keep in mind that we have these "highly
+% non-compositional" elements in the semantics, such as static method
+% lookups.
 }
 
 
+\subsection{Expression Evaluation}
+\LMLabel{expressionEvaluation}
+
+\LMHash{}%
+Evaluation of an expression either
+\IndexCustom{produces an object}{expression!produces an object}
+or it
+\IndexCustom{throws}{expression!throws}
+an exception object and an associated stack trace.
+In the former case, we also say that the expression
+\NoIndex{evaluates to an object}.
+
+\LMHash{}%
+If evaluation of one expression, $e$,
+is defined in terms of evaluation of another expression $e_1$,
+typically a subexpression of $e$,
+and the evaluation of $e_1$ throws an exception and a stack trace,
+the evaluation of $e$ stops at that point
+and throws the same exception object and stack trace.
+
+
 \subsection{Object Identity}
 \LMLabel{objectIdentity}
 
@@ -5865,7 +5983,8 @@
 All usages of the word 'constant' in Dart are associated with compile time.
 A potentially constant expression is an expression that will generally yield
 a constant value when the value of certain parameters is given.
-The constant expressions is a subset of the potentially constant expressions that \emph{can} be evaluated entirely at compile time.
+The constant expressions is a subset of the potentially constant expressions
+that \emph{can} be evaluated entirely at compile time.
 }
 
 \rationale{
@@ -5884,11 +6003,17 @@
 \begin{itemize}
 \item A literal boolean, \TRUE{} or \FALSE{} (\ref{booleans}), is a potentially constant and constant expression.
 
-\item A literal number (\ref{numbers}) is a potentially constant and constant expression if it evaluates to a value of type \code{int} or \code{double}.
-% A too-large integer literal does not evaluate to a value.
+\item A literal number (\ref{numbers}) is a potentially constant and constant expression
+  if it evaluates to an instance of type \code{int} or \code{double}.
+  % A too-large integer literal does not evaluate to an object.
 
-\item A literal string (\ref{strings}) with string interpolations (\ref{stringInterpolation} with expressions $e_1$, \ldots{}, $e_n$ is a potentially constant expression if $e_1$, \ldots{}, $e_n$ are potentially constant expressions.
-The literal is further a constant expression if $e_1$, \ldots{}, $e_n$ are constant expressions evaluating to values that are instances of \code{int}, \code{double} \code{String}, \code{bool} or \code{Null}.
+\item A literal string (\ref{strings}) with string interpolations
+  (\ref{stringInterpolation})
+  with expressions $e_1$, \ldots{}, $e_n$ is a potentially constant expression
+  if $e_1$, \ldots{}, $e_n$ are potentially constant expressions.
+  The literal is further a constant expression
+  if $e_1$, \ldots{}, $e_n$ are constant expressions
+  evaluating to instances of \code{int}, \code{double} \code{String}, \code{bool} or \code{Null}.
 \commentary{These requirements hold trivially if there are no interpolations in the string}.
 \rationale{It would be tempting to allow string interpolation where the
 interpolated value is any compile-time constant. However, this would require
@@ -5921,7 +6046,7 @@
 \code{\CONST{} $C$<$T_1,\ \ldots,\ T_k$>(\metavar{arguments})} or
 \code{\CONST{} $C$<$T_1,\ \ldots,\ T_k$>.\id(\metavar{arguments})},
 or either expression without the leading \CONST{} that occurs in a constant context, is a potentially constant expression.
-It is further a constant expression if the invocation evaluates to a value.
+It is further a constant expression if the invocation evaluates to an object.
 % \ref{const} requires each actual argument to be a constant expression,
 % but here we also catch errors during evaluation, e.g., `C(1, 0)` where
 % `C(double x, double y): z = x / y;`.
@@ -5932,19 +6057,19 @@
 \code{\CONST{} <$T$>[$e_1$, \ldots{}, $e_n$]}, or
 \code{<$T$>[$e_1$, \ldots{}, $e_n$]}
 that occurs in a constant context, is a potentially constant expression if $T$ is a constant type expression, and $e_1$, \ldots{} , $e_n$ are constant expressions.
-It is further a constant expression if the list literal evaluates to a value.
+It is further a constant expression if the list literal evaluates to an object.
 
 \item A constant set literal (\ref{set}),
 \code{\CONST{} <$T$>\{$e_1$, \ldots{}, $e_n$\}}, or
 \code{<$T$>\{$e_1$, \ldots{}, $e_n$\}}
 that occurs in a constant context, is a potentially constant expression if $T$ is a constant type expression, and $e_1$, \ldots{} , $e_n$ are constant expressions.
-It is further a constant expression if the list literal evaluates to a value.
+It is further a constant expression if the list literal evaluates to an object.
 
 \item A constant map literal (\ref{maps}),
 \code{\CONST{} <$K$, $V$>\{$k_1$: $v_1$, \ldots{}, $k_n$: $v_n$\}}, or
 \code{<$K$, $V$>\{$k_1$: $v_1$, \ldots{}, $k_n$: $v_n$\}} that occurs in a constant context,
 is a potentially constant expression.
-It is further a constant expression if the map literal evaluates to a value.
+It is further a constant expression if the map literal evaluates to an object.
 
 \item A parenthesized expression \code{($e$)} is a potentially constant expression if $e$ is a potentially constant expression. It is further a constant expression if $e$ is a constant expression.
 
@@ -5952,66 +6077,108 @@
 
 \item An expression of the form \code{$e_1$\,!=\,$e_2$} is equivalent to \code{!($e_1$\,==\,$e_2$)} in every way, including whether it is potentially constant or constant.
 
-\item An expression of the form \code{$e_1$\,==\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if both $e_1$ and $e_2$ are constant and either $e_1$ evaluates to a value that is an instance of \code{int}, \code{double}, \code{String}, \code{bool} or \code{Null}, or if $e_2$ evaluates to the null object (\ref{null}).
-%TODO: Consider adding enum instances here.
+\item An expression of the form \code{$e_1$\,==\,$e_2$} is potentially constant
+  if $e_1$ and $e_2$ are both potentially constant expressions.
+  It is further constant if both $e_1$ and $e_2$ are constant and
+  either $e_1$ evaluates to an object that is an instance of
+  \code{int}, \code{double}, \code{String}, \code{bool} or \code{Null},
+  or if $e_2$ evaluates to the null object (\ref{null}).
+  %TODO: Consider adding enum instances here.
 
-\item An expression of the form \code{!$e_1$} is potentially constant if $e_1$ is potentially constant. It is further constant if $e_1$ is a constant expression that evaluates to a value of type \code{bool}.
+\item An expression of the form \code{!$e_1$} is potentially constant if $e_1$ is potentially constant. It is further constant if $e_1$ is a constant expression that evaluates to an instance of type \code{bool}.
 
 \item An expression of the form \code{$e_1$\,\&\&\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if $e_1$ is a constant expression and either
 \begin{enumerate}
 \item $e_1$ evaluates to \FALSE{}, or
-\item $e_1$ evaluates to \TRUE{} and $e_2$ is a constant expression that evaluates to a value of type \code{bool}.
+\item $e_1$ evaluates to \TRUE{} and $e_2$ is a constant expression that evaluates to an instance of type \code{bool}.
 \end{enumerate}
 
 \item An expression of the form \code{$e_1$\,||\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if $e_1$ is a constant expression and either
 \begin{enumerate}
 \item $e_1$ evaluates to \TRUE{}, or
-\item $e_1$ evaluates to \FALSE{} and $e_2$ is a constant expression that evaluates to a value of type \code{bool}.
+\item $e_1$ evaluates to \FALSE{} and $e_2$ is a constant expression that evaluates to an instance of type \code{bool}.
 \end{enumerate}
 
-\item An expression of the form \code{\~{}$e_1$} is a potentially constant expression if $e_1$ is a potentially constant expression. It is further a constant expression if $e_1$ is a constant expression that evaluates to a value of type \code{int}.
+\item An expression of the form \code{\~{}$e_1$} is a potentially constant expression if $e_1$ is a potentially constant expression. It is further a constant expression if $e_1$ is a constant expression that evaluates to an instance of type \code{int}.
 
-\item An expression of one of the forms \code{$e_1$\,\&\,$e_2$}, \code{$e_1$\,|\,$e_2$}, or \code{$e_1$\,\^\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if both $e_1$ and $e_2$ are constant expressions that both evaluate to values that are both instances of \code{int}, or that are both instances of \code{bool}.
-% The bool case is new in 2.1.
+\item An expression of one of the forms \code{$e_1$\,\&\,$e_2$},
+  \code{$e_1$\,|\,$e_2$}, or \code{$e_1$\,\^\,$e_2$} is potentially constant
+  if $e_1$ and $e_2$ are both potentially constant expressions.
+  It is further constant if both $e_1$ and $e_2$ are constant expressions that
+  both evaluate to instances of \code{int}, or both to instances of \code{bool}.
+  % The bool case is new in 2.1.
 
-\item An expression of one of the forms \code{$e_1$\,\~{}/\,$e_2$}, \code{$e_1$\,\gtgt\,$e_2$}, \code{$e_1$\,\gtgtgt\,$e_2$}, or \code{$e_1$\,\ltlt\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if both $e_1$ and $e_2$ are constant expressions that evaluate to values that are instances of \code{int}.
+\item An expression of one of the forms \code{$e_1$\,\~{}/\,$e_2$},
+  \code{$e_1$\,\gtgt\,$e_2$}, \code{$e_1$\,\gtgtgt\,$e_2$},
+  or \code{$e_1$\,\ltlt\,$e_2$} is potentially constant
+  if $e_1$ and $e_2$ are both potentially constant expressions.
+  It is further constant if both $e_1$ and $e_2$ are constant expressions that
+  both evaluate to an instance of \code{int}.
 
-\item An expression of the form \code{$e_1$\,+\,$e_2$} is a potentially constant expression if $e_1$ and $e_2$ are both potentially constant expressions. It is further a constant expression if both $e_1$ and $e_2$ are constant expressions and either both evaluate to values that are instances of \code{int} or \code{double}, or both evaluate to values of type \code{String}.
+\item An expression of the form \code{$e_1$\,+\,$e_2$} is
+  a potentially constant expression if $e_1$ and $e_2$
+  are both potentially constant expressions.
+  It is further a constant expression if both $e_1$ and $e_2$ are constant expressions
+  and either both evaluate to an instance of \code{int} or \code{double},
+  or both evaluate to an instance of \code{String}.
 
-\item An expression of the form \code{-$e_1$} is a potentially constant expression if $e_1$ is a potentially constant expression. It is further a constant expression if $e_1$ is a constant expression that evaluates to a value that is an instance of \code{int} or \code{double}.
+\item An expression of the form \code{-$e_1$} is a potentially constant expression
+  if $e_1$ is a potentially constant expression.
+  It is further a constant expression if $e_1$ is a constant expression that
+  evaluates to an instance of type \code{int} or \code{double}.
 
-\item An expression of the form \code{$e_1$\,-\,$e_2$}, \code{$e_1$\,*\,$e_2$}, \code{$e_1$\,/\,$e_2$}, \code{$e_1$\,\%\,$e_2$}, \code{$e_1$\,<\,$e_2$}, \code{$e_1$\,<=\,$e_2$}, \code{$e_1$\,>\,$e_2$}, or \code{$e_1$\,>=\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if both $e_1$ and $e_2$ are constant expressions that evaluate to values that are instances of \code{int} or \code{double}.
+\item An expression of the form \code{$e_1$\,-\,$e_2$}, \code{$e_1$\,*\,$e_2$},
+  \code{$e_1$\,/\,$e_2$}, \code{$e_1$\,\%\,$e_2$}, \code{$e_1$\,<\,$e_2$},
+  \code{$e_1$\,<=\,$e_2$}, \code{$e_1$\,>\,$e_2$}, or \code{$e_1$\,>=\,$e_2$}
+  is potentially constant
+  if $e_1$ and $e_2$ are both potentially constant expressions.
+  It is further constant if both $e_1$ and $e_2$ are constant expressions that
+  evaluate to instances of \code{int} or \code{double}.
 
-\item An expression of the form \code{$e_1$\,?\,$e_2$\,:\,$e_3$} is potentially constant if $e_1$, $e_2$, and $e_3$ are all potentially constant expressions. It is constant if $e_1$ is a constant expression and either
+\item An expression of the form \code{$e_1$\,?\,$e_2$\,:\,$e_3$}
+  is potentially constant if $e_1$, $e_2$, and $e_3$
+  are all potentially constant expressions.
+  It is constant if $e_1$ is a constant expression and either
 \begin{enumerate}
 \item $e_1$ evaluates to \TRUE{} and $e_2$ is a constant expression, or
 \item $e_1$ evaluates to \FALSE{} and $e_3$ is a constant expression.
 \end{enumerate}
 
-\item An expression of the form \code{$e_1$\,??\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if $e_1$ is a constant expression and either
+\item An expression of the form \code{$e_1$\,??\,$e_2$} is potentially constant
+  if $e_1$ and $e_2$ are both potentially constant expressions.
+  It is further constant if $e_1$ is a constant expression and either
 \begin{enumerate}
-\item $e_1$ evaluates to a non-\NULL{} value, or
-\item $e_1$ evaluates to \NULL{} and $e_2$ is a constant expression.
+\item $e_1$ evaluates to an object which is not the null object, or
+\item $e_1$ evaluates to the null object, and $e_2$ is a constant expression.
 \end{enumerate}
 
-\item An expression of the form \code{$e$.length} is potentially constant if $e$ is a potentially constant expression. It is further constant if $e$ is a constant expression that evaluates to a \code{String}.
+\item An expression of the form \code{$e$.length} is potentially constant
+  if $e$ is a potentially constant expression.
+  It is further constant if $e$ is a constant expression that
+  evaluates to an instance of \code{String}.
 
 % New in 2.1.
-\item An expression of the form \code{$e$ as $T$} is potentially constant if $e$ is a potentially constant expression and $T$ is a constant type expression, and it is further constant if $e$ is constant.
+\item An expression of the form \code{$e$ as $T$} is potentially constant
+  if $e$ is a potentially constant expression
+  and $T$ is a constant type expression,
+  and it is further constant if $e$ is constant.
 \commentary{
 It is a compile-time error to evaluate the constant expression
 if the cast operation would throw, that is,
-if the value the $e$ evaluates to is not \NULL{} and not of type $T$.
+if $e$ evaluates to an object which is not the null object and not of type $T$.
 }
 
 % New in 2.1.
-\item An expression of the form \code{$e$ is $T$} is potentially constant if $e$ is a potentially constant expression and $T$ is a constant type expression, and it is further constant if $e$ is constant.
+\item An expression of the form \code{$e$ is $T$} is potentially constant
+  if $e$ is a potentially constant expression
+  and $T$ is a constant type expression,
+  and it is further constant if $e$ is constant.
 
 % New in 2.1.
 \item{}
-An expression of the form \code{$e$ is! $T$} is equivalent to \code{!($e$ is $T$)} in every way,
-including whether it's potentially constant or constant.
-
+  An expression of the form \code{$e$ is! $T$}
+  is equivalent to \code{!($e$ is $T$)} in every way,
+  including whether it's potentially constant or constant.
 \end{itemize}
 
 \LMHash{}%
@@ -6060,7 +6227,12 @@
 
 \commentary{
 Note that there is no requirement that every constant expression evaluate correctly.
-Only when a constant expression is required (e.g., to initialize a constant variable, or as a default value of a formal parameter, or as metadata) do we insist that a constant expression actually be evaluated successfully at compile time.
+Only when a constant expression is required
+(e.g., to initialize a constant variable,
+or as a default value of a formal parameter,
+or as metadata)
+do we insist that a constant expression actually
+be evaluated successfully at compile time.
 
 The above is not dependent on program control-flow.
 The mere presence of a required compile-time constant whose evaluation would fail within a program is an error.
@@ -6149,6 +6321,48 @@
 \end{grammar}
 
 
+\subsubsection{Constant Contexts}
+\LMLabel{constantContexts}
+
+\LMHash{}%
+Let $e$ be an expression; $e$ occurs in a
+\Index{constant context}
+if{}f one of the following applies:
+
+% We avoid the circularity "constant context depends on constant list literal,
+% etc., which depends on constant context" by mentioning the \CONST{} modifier
+% explicitly here. So 'constant context' is consistently a lower-level concept
+% based on syntax, and 'constant X expressions' (like 'constant list literal')
+% are built on top of this.
+
+\begin{itemize}
+\item $e$ is an element of a list or set literal whose first token is \CONST,
+  or $e$ is a key or a value of an entry
+  of a map literal whose first token is \CONST.
+\item $e$ occurs as \code{@$e$} in a construct derived from \synt{metadata}.
+\item $e$ is an actual argument in an expression derived from
+  \synt{constObjectExpression}.
+\item $e$ is the initializing expression of a constant variable declaration
+  (\ref{variables}).
+\item $e$ is a switch case expression
+  (\ref{switch}).
+\item $e$ is an immediate subexpression of
+  an expression $e_0$ which occurs in a constant context,
+  where $e_0$ is
+  %% May be added later:
+  %% not a \THROW{} expression (\ref{throw}) and
+  not a function literal
+  (\ref{functionExpressions}).
+\end{itemize}
+
+\rationale{%
+A constant context is introduced in situations where
+an expression is required to be constant.
+This is used to allow the \CONST{} modifier to be omitted
+in cases where it does not contribute any new information.%
+}
+
+
 \subsection{Null}
 \LMLabel{null}
 
@@ -6668,9 +6882,14 @@
 using an index that is not a member of its set of indices.
 
 \LMHash{}%
-If a list literal begins with the reserved word \CONST{}, it is a
-\IndexCustom{constant list literal}{literal!list!constant}
-which is a constant expression (\ref{constants}) and therefore evaluated at compile time.
+If a list literal $\ell$ begins with the reserved word \CONST{}
+or $\ell$ occurs in a constant context
+(\ref{constantContexts}),
+it is a
+\IndexCustom{constant list literal}{literal!list!constant},
+which is a constant expression
+(\ref{constants})
+and therefore evaluated at compile time.
 Otherwise, it is a
 \IndexCustom{run-time list literal}{literal!list!run-time}
 and it is evaluated at run time.
@@ -6679,35 +6898,57 @@
 % This error can occur because being constant is a dynamic property, here.
 Attempting to mutate a constant list literal will result in a dynamic error.
 
+\commentary{%
+% The following is true either directly or indirectly: There is a \CONST{}
+% modifier on the literal list, or we use the "immediate subexpression" rule
+% about constant contexts.
+Note that the element expressions of a constant list literal
+occur in a constant context
+(\ref{constantContexts}),
+which means that \CONST{} modifiers need not be specified explicitly.%
+}
+
 \LMHash{}%
-It is a compile-time error if an element of a constant list literal is not a constant expression.
-It is a compile-time error if the type argument of a constant list literal is
-not a constant type expression.
-\rationale{
-The binding of a type parameter is not known at compile time, so we cannot use type parameters inside constant expressions.
+It is a compile-time error if an element of a constant list literal
+is not a constant expression.
+It is a compile-time error if the type argument of a constant list literal
+is not a constant type expression.
+
+\rationale{%
+The binding of a formal type parameter is not known at compile time,
+so we cannot use type parameters inside constant expressions.%
 }
 
 \LMHash{}%
 The value of a constant list literal
-\code{\CONST{} <$E$>[$e_1, \ldots, e_n$]}
+\code{\CONST?\,\,<$E$>[$e_1, \ldots, e_n$]}
 is an object $a$ whose class implements the built-in class
 \code{List<$E$>}.
-The $i$th element of $a$ is $v_{i+1}$, where $v_i$ is the value of the compile-time expression $e_i$.
+Let $v_i$ be the value of the constant expression $e_i$, $i \in 1 .. n$.
+The $i$th element of $a$ (at index $i - 1$) is $v_i$.
+%
+%% TODO(eernst): If inference is specified to provide all type arguments,
+%% we should delete the following.
 The value of a constant list literal
-\code{\CONST{} [$e_1, \ldots, e_n$]}
+\code{\CONST?\,\,[$e_1, \ldots, e_n$]}
 is defined as the value of the constant list literal
-\code{\CONST{} <\DYNAMIC{}>[$e_1, \ldots, e_n$]}.
+% For a constant list literal, it is never an error to have the \CONST, even if
+% it was omitted above. So we remove the `?`, making the next line well-defined.
+\code{\CONST\,\,<\DYNAMIC>[$e_1, \ldots, e_n$]}.
 
 \LMHash{}%
 Let
-$list_1 =$ \code{\CONST{} <$V$>[$e_{11}, \ldots, e_{1n}$]}
+$list_1 =$ \code{\CONST?\,\,<$V$>[$e_{11}, \ldots, e_{1n}$]}
 and
-$list_2 =$ \code{\CONST{} <$U$>[$e_{21}, \ldots, e_{2n}$]}
-be two constant list literals and let the elements of $list_1$ and $list_2$ evaluate to $o_{11}, \ldots, o_{1n}$ and $o_{21}, \ldots, o_{2n}$ respectively.
-If{}f \code{identical($o_{1i}$, $o_{2i}$)} for $i \in 1 .. n$ and $V = U$ then \code{identical($list_1$, $list_2$)}.
+$list_2 =$ \code{\CONST?\,\,<$U$>[$e_{21}, \ldots, e_{2n}$]}
+be two constant list literals and
+let the elements of $list_1$ and $list_2$ evaluate to
+$o_{11}, \ldots, o_{1n}$ and $o_{21}, \ldots, o_{2n}$ respectively.
+If{}f \code{identical($o_{1i}$, $o_{2i}$)} for $i \in 1 .. n$ and $V == U$
+then \code{identical($list_1$, $list_2$)}.
 
-\commentary{
-In other words, constant list literals are canonicalized.
+\commentary{%
+In other words, constant list literals are canonicalized.%
 }
 
 \LMHash{}%
@@ -6746,10 +6987,12 @@
 }
 
 \LMHash{}%
+%% TODO(eernst): If inference is specified to provide all type arguments,
+%% we should delete the following.
 A run-time list literal
 \code{[$e_1, \ldots, e_n$]}
 is evaluated as
-\code{<\DYNAMIC{}>[$e_1, \ldots, e_n$]}.
+\code{<\DYNAMIC>[$e_1, \ldots, e_n$]}.
 
 \commentary{
 There is no restriction precluding nesting of list literals.
@@ -6761,15 +7004,18 @@
 
 \LMHash{}%
 The static type of a list literal of the form
-\code{\CONST{} <$E$>[$e_1, \ldots, e_n$]}
+\code{\CONST\,\,<$E$>[$e_1, \ldots, e_n$]}
 or the form
 \code{<$E$>[$e_1, \ldots, e_n$]}
 is \code{List<$E$>}.
+%
+%% TODO(eernst): If inference is specified to provide all type arguments,
+%% we should delete the following.
 The static type of a list literal of the form
-\code{\CONST{} [$e_1, \ldots, e_n$]}
+\code{\CONST\,\,[$e_1, \ldots, e_n$]}
 or the form
 \code{[$e_1, \ldots, e_n$]}
-is \code{List<\DYNAMIC{}>}.
+is \code{List<\DYNAMIC>}.
 
 
 \subsection{Maps}
@@ -6811,9 +7057,14 @@
 or more than two type arguments.
 
 \LMHash{}%
-If a map literal begins with the reserved word \CONST{}, it is a
+If a map literal $\ell$ begins with the reserved word \CONST{},
+or if $\ell$ occurs in a constant context
+(\ref{constantContexts}),
+it is a
 \IndexCustom{constant map literal}{literal!map!constant}
-which is a constant expression (\ref{constants}) and therefore evaluated at compile time.
+which is a constant expression
+(\ref{constants})
+and therefore evaluated at compile time.
 Otherwise, it is a
 \IndexCustom{run-time map literal}{literal!map!run-time}
 and it is evaluated at run time.
@@ -6821,6 +7072,16 @@
 % This error can occur because being constant is a dynamic property, here.
 Attempting to mutate a constant map literal will result in a dynamic error.
 
+\commentary{%
+% The following is true either directly or indirectly: There is a \CONST{}
+% modifier on the literal map, or we use the "immediate subexpression" rule
+% about constant contexts.
+Note that the key and value expressions of a constant list literal
+occur in a constant context
+(\ref{constantContexts}),
+which means that \CONST{} modifiers need not be specified explicitly.%
+}
+
 \LMHash{}%
 It is a compile-time error if
 either a key or a value of an entry in a constant map literal
@@ -6835,26 +7096,38 @@
 
 \LMHash{}%
 The value of a constant map literal
-\code{\CONST{} <$K, V$>\{$k_1:e_1, \ldots, k_n:e_n$\}}
+\code{\CONST?\,\,<$K, V$>\{$k_1:e_1, \ldots, k_n:e_n$\}}
 is an object $m$ whose class implements the built-in class
 \code{Map<$K, V$>}.
-The entries of $m$ are $u_i:v_i, i \in 1 .. n$, where $u_i$ is the value of the compile-time expression $k_i$ and $v_i$ is the value of the compile-time expression $e_i$.
+The entries of $m$ are $u_i:v_i, i \in 1 .. n$,
+where $u_i$ is the value of the compile-time expression $k_i$,
+and $v_i$ is the value of the compile-time expression $e_i$.
+%
+%% TODO(eernst): If inference is specified to provide all type arguments,
+%% we should delete the following.
 The value of a constant map literal
-\code{\CONST{} \{$k_1:e_1, \ldots, k_n:e_n$\}}
-is defined as the value of a constant map literal
-\code{\CONST{} <\DYNAMIC{}, \DYNAMIC{}>\{$k_1:e_1, \ldots, k_n:e_n$\}}.
+\code{\CONST?\,\,\{$k_1:e_1, \ldots, k_n:e_n$\}}
+is defined as the value of the constant map literal
+% For a constant map literal, it is never an error to have the \CONST, even if
+% it was omitted above. So we remove the `?`, making the next line well-defined.
+\code{\CONST\,\,<\DYNAMIC, \DYNAMIC>\{$k_1:e_1, \ldots, k_n:e_n$\}}.
 
 \LMHash{}%
-Let
-$map_1 =$ \code{\CONST{} <$K, V$>\{$k_{11}:e_{11}, \ldots, k_{1n}:e_{1n}$\}}
-and
-$map_2 =$ \code{\CONST{} <$J, U$>\{$k_{21}:e_{21}, \ldots, k_{2n}:e_{2n}$\}}
-be two constant map literals.
-Let the keys of $map_1$ and $map_2$ evaluate to $s_{11}, \ldots, s_{1n}$ and $s_{21}, \ldots, s_{2n}$ respectively, and let the elements of $map_1$ and $map_2$ evaluate to $o_{11}, \ldots, o_{1n}$ and $o_{21}, \ldots, o_{2n}$ respectively.
-If{}f \code{identical($o_{1i}$, $o_{2i}$)} and \code{identical($s_{1i}$, $s_{2i}$)} for $i \in 1 .. n$, and $K = J, V = U$ then \code{identical($map_1$, $map_2$)}.
+Let $map_1$ be a constant map literal of the form
+\code{\CONST?\,\,<$K, V$>\{$k_{11}:e_{11}, \ldots, k_{1n}:e_{1n}$\}}
+and $map_2$ a constant map literal of the form
+\code{\CONST?\,\,<$J, U$>\{$k_{21}:e_{21}, \ldots, k_{2n}:e_{2n}$\}}.
+Let the keys of $map_1$ and $map_2$ evaluate to
+$s_{11}, \ldots, s_{1n}$ and $s_{21}, \ldots, s_{2n}$, respectively,
+and let the elements of $map_1$ and $map_2$ evaluate to
+$o_{11}, \ldots, o_{1n}$ and $o_{21}, \ldots, o_{2n}$, respectively.
+If{}f
+\code{identical($o_{1i}$, $o_{2i}$)} and
+\code{identical($s_{1i}$, $s_{2i}$)}
+for $i \in 1 .. n$, and $K == J, V == U$, then \code{identical($map_1$, $map_2$)}.
 
-\commentary{
-In other words, constant map literals are canonicalized.
+\commentary{%
+In other words, constant map literals are canonicalized.%
 }
 
 \LMHash{}%
@@ -6888,11 +7161,13 @@
 the \lit{==} operator inherited from the \code{Object} class.
 
 \LMHash{}%
+%% TODO(eernst): If inference is specified to provide all type arguments,
+%% we should delete the following.
 A run-time map literal
 \code{\{$k_1:e_1, \ldots, k_n:e_n$\}}
 is evaluated as
 
-\code{<\DYNAMIC{}, \DYNAMIC{}>\{$k_1:e_1, \ldots, k_n:e_n$\}}.
+\code{<\DYNAMIC, \DYNAMIC>\{$k_1:e_1, \ldots, k_n:e_n$\}}.
 
 \LMHash{}%
 A map literal is ordered:
@@ -6911,11 +7186,14 @@
 \code{<$K, V$>\{$k_1:e_1, \ldots, k_n:e_n$\}}
 is
 \code{Map<$K, V$>}.
+%
+%% TODO(eernst): If inference is specified to provide all type arguments,
+%% we should delete the following.
 The static type of a map literal of the form
 \code{\CONST{} \{$k_1:e_1, \ldots, k_n:e_n$\}}
 or the form
 \code{\{$k_1:e_1, \ldots, k_n:e_n$\}} is
-\code{Map<\DYNAMIC{}, \DYNAMIC{}>}.
+\code{Map<\DYNAMIC, \DYNAMIC>}.
 
 
 \subsection{Sets}
@@ -6930,7 +7208,8 @@
 \end{grammar}
 
 \LMHash{}%
-A \synt{setOrMapLiteral} is either set literal or a map literal (\ref {maps}).
+A \synt{setOrMapLiteral} is either a set literal or a map literal
+(\ref{maps}).
 A set literal derived from \synt{setOrMapLiteral}
 is treated the same way as one derived from \synt{setLiteral},
 as described below.
@@ -6939,17 +7218,21 @@
 A set literal consists of zero or more element expressions.
 It is a compile-time error if a set literal has more than one type argument.
 
-\LMHash{}%
-\rationale{
+\rationale{%
 A set literal with no type argument is always converted to a literal
 with a type argument by type inference (\ref{overview}), so the following
-section only address the behavior of literals with type arguments.}
+section only address the behavior of literals with type arguments.%
+}
 
 \LMHash{}%
-If a set literal begins with the reserved word \CONST{},
-or if it occurs in a constant context, then it is a
+If a set literal $\ell$ begins with the reserved word \CONST{}
+or $\ell$ occurs in a constant context
+(\ref{constantContexts}),
+it is a
 \IndexCustom{constant set literal}{literal!set!constant}
-which is a constant expression (\ref{constants}) and therefore evaluated at compile time.
+which is a constant expression
+(\ref{constants})
+and therefore evaluated at compile time.
 Otherwise, it is a
 \IndexCustom{run-time set literal}{literal!set!run-time}
 and it is evaluated at run time.
@@ -6957,6 +7240,16 @@
 % This error can occur because being constant is a dynamic property, here.
 Attempting to mutate a constant set literal will result in a dynamic error.
 
+\commentary{%
+% The following is true either directly or indirectly: There is a \CONST{}
+% modifier on the literal set, or we use the "immediate subexpression" rule
+% about constant contexts.
+Note that the element expressions of a constant set literal
+occur in a constant context
+(\ref{constantContexts}),
+which means that \CONST{} modifiers need not be specified explicitly.%
+}
+
 \LMHash{}%
 It is a compile-time error if an element expression in a constant set literal
 is not a constant expression.
@@ -6972,11 +7265,21 @@
 (\ref{equality}).
 
 \LMHash{}%
-The value of a constant set literal with element expressions
-$e_1, \dots, e_n$ and type argument $E$
+The value of a constant set literal
+\code{\CONST?\,\,<$E$>\{$e_1, \ldots, e_n$\}}
 is an object $s$ whose class implements the built-in class
 \code{Set<$E$>}.
-The elements of $m$ are $v_i, i \in 1 .. n$, where $v_i$ is the value of the constant expression $e_i$.
+The elements of $m$ are $v_i, i \in 1 .. n$,
+where $v_i$ is the value of the constant expression $e_i$.
+%
+%% TODO(eernst): If inference is specified to provide all type arguments,
+%% we should delete the following.
+The value of a constant set literal
+\code{\CONST?\,\,\{$e_1, \ldots, e_n$\}}
+is defined as the value of the constant set literal
+% For a constant set literal, it is never an error to have the \CONST, even if
+% it was omitted above. So we remove the `?`, making the next line well-defined.
+\code{\CONST\,\,<\DYNAMIC>\{$e_1, \ldots, e_n$\}}.
 
 \LMHash{}%
 Let $set_1$ be a constant set literal with type argument $E$
@@ -6988,12 +7291,13 @@
 If{}f \code{identical($v_{1i}$, $v_{2i}$)}
 for $i \in 1 .. n$, and $E$ and $F$ is the same type,
 then \code{identical($set_1$, $set_2$)}.
-\commentary{
+
+\commentary{%
 In other words, constant set literals are canonicalized if they have
 the same type and the same values in the same order.
+Two constant set literals are never identical
+if they have a different number of elements.%
 }
-Two constant set literals are never identical if they have different numbers
-of elements.
 
 \LMHash{}%
 A run-time set literal with element expressions $e_1, \ldots, e_n$
@@ -7024,12 +7328,28 @@
 }
 
 \LMHash{}%
+%% TODO(eernst): If inference is specified to provide all type arguments,
+%% we should delete the following.
+A run-time set literal
+\code{\{$e_1, \ldots, e_n$\}}
+is evaluated as
+\code{<\DYNAMIC>\{$e_1, \ldots, e_n$\}}.
+
+\LMHash{}%
 The static type of a set literal of the form
-\code{\CONST{} <$E$>\{$e_1, \ldots, e_n$\}}
+\code{\CONST\,\,<$E$>\{$e_1, \ldots, e_n$\}}
 or the form
 \code{<$E$>\{$e_1, \ldots, e_n$\}}
 is
 \code{Set<$E$>}.
+%
+%% TODO(eernst): If inference is specified to provide all type arguments,
+%% we should delete the following.
+The static type of a list literal of the form
+\code{\CONST\,\,\{$e_1, \ldots, e_n$\}}
+or the form
+\code{\{$e_1, \ldots, e_n$\}}
+is \code{Set<\DYNAMIC>}.
 
 
 \subsection{Throw}
@@ -7048,7 +7368,8 @@
 Evaluation of a throw expression of the form \code{\THROW{} $e$;} proceeds as follows:
 
 \LMHash{}%
-The expression $e$ is evaluated to a value $v$ (\ref{evaluation}).
+The expression $e$ is evaluated to an object $v$
+(\ref{expressionEvaluation}).
 
 \commentary{
 There is no requirement that the expression $e$ must evaluate to any special kind of object.
@@ -7058,7 +7379,7 @@
 If $v$ is the null object (\ref{null}), then a \code{NullThrownError} is thrown.
 Otherwise let $t$ be a stack trace corresponding to the current execution state,
 and the \THROW{} statement throws with $v$ as exception object
-and $t$ as stack trace (\ref{evaluation}).
+and $t$ as stack trace (\ref{expressionEvaluation}).
 
 \LMHash{}%
 If $v$ is an instance of class \code{Error} or a subclass thereof,
@@ -7553,7 +7874,7 @@
 If execution of $q$ completes normally (\ref{statementCompletion}), $e$ evaluates to $i$.
 Otherwise execution of $q$ throws an exception object $x$ and stack trace $t$,
 and then evaluation of $e$ also throws exception object $x$ and stack trace $t$
-(\ref{evaluation}).
+(\ref{expressionEvaluation}).
 \EndCase
 
 \LMHash{}%
@@ -7586,7 +7907,8 @@
 Otherwise, if the execution completes normally or returns with no value,
 then $e$ evaluates to the null object (\ref{null}).
 Otherwise the execution throws an exception $x$ and stack trace $t$,
-and then evaluation of $e$ also throws $x$ and $t$ (\ref{evaluation}).
+and then evaluation of $e$ also throws $x$ and $t$
+(\ref{expressionEvaluation}).
 
 \rationale{
 A factory constructor can be declared in an abstract class and used safely,
@@ -7760,8 +8082,8 @@
 %% TODO(eernst): Delete some \CONST{} when integrating implicit-creation.md
 \begin{dartCode}
 \CLASS{} A \{
-   \FINAL{} x;
-   \CONST{} A(p): x = p * 10;
+  \FINAL{} x;
+  \CONST{} A(p): x = p * 10;
 \}
 \\
 \CLASS{} IntPair \{
@@ -7830,13 +8152,20 @@
 If $f$ is synchronous and is not a generator (\ref{functions}) then execution of the body of $f$ begins immediately.
 If the execution of the body of $f$ returns a value, $v$, (\ref{statementCompletion}), the invocation evaluates to $v$.
 If the execution completes normally or it returns without a value, the invocation evaluates to the null object (\ref{null}).
-If the execution throws an exception object and stack trace, the invocation throws the same exception object and stack trace (\ref{evaluation}).
+If the execution throws an exception object and stack trace,
+the invocation throws the same exception object and stack trace
+(\ref{expressionEvaluation}).
 
-\commentary{
+\commentary{%
 A complete function body can never break or continue (\ref{statementCompletion})
-because a \BREAK{} or \CONTINUE{} statement must always occur inside the statement that is the target of the \BREAK{} or \CONTINUE{}.
+because a \BREAK{} or \CONTINUE{} statement must always occur inside
+the statement that is the target of the \BREAK{} or \CONTINUE{}.
 This means that a function body can only either complete normally, throw, or return.
-Completing normally or returning without a value is treated the same as returning the null object (\ref{null}), so the result of executing a function body can always be used as the result of evaluating an expression, either by evaluating to a value or by the evaluation throwing.
+Completing normally or returning without a value is treated
+the same as returning the null object (\ref{null}),
+so the result of executing a function body can always be used as
+the result of evaluating an expression,
+either by evaluating to an object, or by the evaluation throwing.%
 }
 
 \LMHash{}%
@@ -8348,6 +8677,7 @@
 \LMHash{}%
 An unqualified function invocation $i$ has the form
 
+\noindent
 \code{\id<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
 \noindent
@@ -8365,37 +8695,46 @@
 
 \LMHash{}%
 If there exists a lexically visible declaration named \id,
-let $f_{id}$ be the innermost such declaration.
+let $D_{id}$ be the innermost such declaration.
 Then:
 \begin{itemize}
-\item It is a compile-time error if $f_{id}$ denotes a type
-  (\commentary{that is, if \id{} is a type literal or type variable}),
-  unless \id{} denotes a constructor.
-\item It is a compile-time error if $f_{id}$ is an import directive
-  where \id{} is declared to be a library prefix.
-\item
-If $f_{id}$ is
-a local function,
-a library function,
-a library or static getter or a variable,
-$i$ is interpreted as a function expression invocation
-(\ref{functionExpressionInvocation}).
-\item
-Otherwise, if $f_{id}$ is a static method of the enclosing class $C$,
-$i$ is equivalent to
-\code{$C$.\id<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
+\item Consider the situation where $D_{id}$ is a type declaration.
+  If $D_{id}$ is a declaration of a class $C$
+  that has a constructor named $C$
+  then the meaning of $i$ depends on the context:
+  If $i$ occurs in a constant context
+  (\ref{constantContexts}),
+  then $i$ is equivalent to \code{\CONST\,\,$i$};
+  if $i$ does not occur in a constant context
+  then $i$ is equivalent to \code{\NEW\,\,$i$}.
+  Otherwise a compile-time error occurs
+  (\commentary{that is, if $D_{id}$ does not declare a class,
+    or it declares a class that has no constructor named $C$}).
+\item Otherwise, if $D_{id}$ is an import directive
+  where \id{} is declared to be a library prefix,
+  a compile-time error occurs.
+\item Otherwise, if $D_{id}$ declares
+  a local function,
+  a library function, or
+  a library or static getter, or a variable,
+  then $i$ is treated as a function expression invocation
+  (\ref{functionExpressionInvocation}).
+\item Otherwise, if $D_{id}$ is a static method of the enclosing class $C$,
+  $i$ is equivalent to
+  \code{$C$.\id<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 \item Otherwise, if $i$ occurs in an instance method body,
-$i$ is equivalent to the ordinary method invocation
+  $i$ is equivalent to the ordinary method invocation
 
-\code{\THIS{}.\id<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
+  \code{\THIS{}.\id<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 \end{itemize}
 
-\commentary{
-Otherwise $i$ must occur inside a top-level or static function
+\commentary{%
+Otherwise \id{} is not in scope, and
+$i$ must occur inside a top-level or static function
 (be it function, method, getter, or setter)
 or a top-level or static variable initializer,
-in which case a compile-time error occurs
-(\ref{unqualifiedInvocation}).
+in which case a compile-time error occurs,
+as specified earlier in this section.%
 }
 
 
@@ -8405,6 +8744,7 @@
 \LMHash{}%
 A function expression invocation $i$ has the form
 
+\noindent
 \code{$e_f$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
 \noindent
@@ -8415,38 +8755,69 @@
 }
 
 \LMHash{}%
-If $e_f$ is an identifier \id, then \id{} must necessarily denote
-a local function, a library function, a library or static getter or a variable as described above,
-or $i$ is not considered a function expression invocation.
-It is a compile-time error if $e_f$ is a type literal,
-unless $e_f$ denotes a constructor.
+Consider the situation where $e_f$ denotes a class $C$
+that contains a declaration of a constructor named $C$,
+or it is of the form \code{$e'_f$.\id} where
+$e'_f$ denotes a class $C$ that contains a declaration of
+a constructor named \code{$C$.\id}.
+If $i$ occurs in a constant context
+(\ref{constantContexts})
+then $i$ is treated as \code{\CONST\,\,$i$},
+and if $i$ does not occur in a constant context
+then $i$ is treated as \code{\NEW\,\,$i$}.
 
-\commentary{
-This error was already specified elsewhere
-(\ref{unqualifiedInvocation})
-for the case where $e_f$ is an identifier,
-but $e_f$ may also have other forms, e.g., \code{p.C}.
+\commentary{%
+When $i$ is treated as another construct $i'$,
+both the static analysis and the dynamic semantics
+is specified in the section about $i'$
+(\ref{notation}).%
 }
 
 \LMHash{}%
-If $e_f$ is a property extraction expression (\ref{propertyExtraction}),
-then $i$ isn't a function expression invocation and is instead recognized as an ordinary method invocation (\ref{ordinaryInvocation}).
+Otherwise, it is a compile-time error if $e_f$ is a type literal.
 
-\commentary{
-\code{$a.b(x)$} is parsed as a method invocation of method \code{$b()$} on object \code{$a$}, not as an invocation of getter \code{$b$} on \code{$a$} followed by a function call \code{$(a.b)(x)$}.
+\commentary{%
+This error was already specified elsewhere
+(\ref{unqualifiedInvocation})
+for the case where $e_f$ is an identifier,
+but $e_f$ may also have other forms, e.g., \code{p.C}.%
+}
+
+\LMHash{}%
+Otherwise, if $e_f$ is an identifier \id, then \id{} must necessarily denote
+a local function, a library function, a library or static getter,
+or a variable as described above,
+or $i$ would not have been treated as a function expression invocation.
+
+\LMHash{}%
+If $e_f$ is a property extraction expression
+(\ref{propertyExtraction})
+then $i$ treated as an ordinary method invocation
+(\ref{ordinaryInvocation}).
+
+\commentary{%
+\code{$a.b(x)$} is treated as a method invocation of method
+\code{$b()$} on object \code{$a$},
+not as an invocation of getter \code{$b$} on \code{$a$}
+followed by a function call \code{$(a.b)(x)$}.
 If a method or getter \code{$b$} exists, the two will be equivalent.
-However, if \code{$b$} is not defined on \code{$a$}, the resulting invocation of \code{noSuchMethod()} would differ.
-The \code{Invocation} passed to \code{noSuchMethod()} would describe a call to a method \code{$b$} with argument \code{$x$} in the former case, and a call to a getter \code{$b$} (with no arguments) in the latter.
+However, if \code{$b$} is not defined on \code{$a$},
+the resulting invocation of \code{noSuchMethod()} would differ.
+The \code{Invocation} passed to \code{noSuchMethod()} would describe
+a call to a method \code{$b$} with argument \code{$x$} in the former case,
+and a call to a getter \code{$b$} (with no arguments) in the latter.%
 }
 
 \LMHash{}%
 Let $F$ be the static type of $e_f$.
 The static analysis of $i$ is performed as specified in Section~\ref{bindingActualsToFormals},
+using $F$ as the static type of the invoked function,
 and the static type of $i$ is as specified there.
 
 \LMHash{}%
 Evaluation of a function expression invocation
 
+\noindent
 \code{$e_f$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
 \noindent
@@ -8454,8 +8825,10 @@
 Let $f$ be a fresh variable bound to $o$.
 If $o$ is a function object then the function invocation
 
-\code{$f$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
+\noindent
+\code{$f$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
+\noindent
 is evaluated by binding actuals to formals as specified in Section~\ref{bindingActualsToFormals},
 and executing the body of $f$ with those bindings;
 the returned result is then the result of evaluating $i$.
@@ -8466,6 +8839,7 @@
 the following ordinary method invocation is evaluated,
 and its result is then the result of evaluating $i$:
 
+\noindent
 \code{$f$.call<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 \LMHash{}%
@@ -8495,7 +8869,9 @@
 when the static type of $e_f$ is \DYNAMIC{}.
 The run-time semantics ensures that
 a function invocation may amount to an invocation of the instance method \CALL{}.
-However, an interface type with a method named \CALL{} is not itself a subtype of any function type.
+However, an interface type with a method named \CALL{}
+is not itself a subtype of any function type
+(\ref{subtypeRules}).
 }
 
 
@@ -8915,7 +9291,7 @@
 If $o$ is the null object, $i$ evaluates to the null object (\ref{null}).
 Otherwise let $v$ be a fresh variable bound to $o$ and evaluate
 \code{$v$.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
-to a value $r$.
+to an object $r$.
 Then $e$ evaluates to $r$.
 \EndCase
 
@@ -8986,7 +9362,7 @@
 proceeds as follows:
 
 \LMHash{}%
-First, the expression $e$ is evaluated to a value $o$.
+First, the expression $e$ is evaluated to an object $o$.
 Let $f$ be the result of looking up
 (\ref{lookup})
 method $m$ in $o$ with respect to the current library $L$.
@@ -8998,7 +9374,7 @@
 The body of $f$ is then executed with respect to the bindings
 that resulted from the evaluation of the argument list,
 and with \THIS{} bound to $o$.
-The value of $i$ is the value returned by the execution of $f$'s body.
+The value of $i$ is the object returned by the execution of $f$'s body.
 
 \LMHash{}%
 If the method lookup failed,
@@ -9238,7 +9614,7 @@
 Otherwise evaluate $e$ to an object $o$.
 If $o$ is the null object, $i$ evaluates to the null object (\ref{null}).
 Otherwise let $x$ be a fresh variable bound to $o$
-and evaluate \code{$x$.\id} to a value $r$.
+and evaluate \code{$x$.\id} to an object $r$.
 Then $i$ evaluates to $r$.
 \EndCase
 
@@ -10176,7 +10552,7 @@
 proceeds as follows:
 Evaluate $v$ to an object $o$.
 If $o$ is not the null object (\ref{null}), $a$ evaluates to $o$.
-Otherwise evaluate \code{$v$ = $e$} to a value $r$,
+Otherwise evaluate \code{$v$ = $e$} to an object $r$,
 and then $a$ evaluates to $r$.
 \EndCase
 
@@ -10195,7 +10571,7 @@
 where $C$ is a type literal proceeds as follow:
 Evaluate \code{$C$.$v$} to an object $o$.
 If $o$ is not the null object (\ref{null}), $a$ evaluates to $o$.
-Otherwise evaluate \code{$C$.$v$ = $e$} to a value $r$,
+Otherwise evaluate \code{$C$.$v$ = $e$} to an object $r$,
 and then $a$ evaluates to $r$.
 \EndCase
 
@@ -10451,7 +10827,8 @@
 A \Index{logical boolean expression} is either an equality expression (\ref{equality}), or an invocation of a logical boolean operator on an expression $e_1$ with argument $e_2$.
 
 \LMHash{}%
-Evaluation of a logical boolean expression $b$ of the form $e_1 || e_2$ causes the evaluation of $e_1$ to a value $o_1$.
+Evaluation of a logical boolean expression $b$ of the form $e_1 || e_2$ causes
+the evaluation of $e_1$ to an object $o_1$.
 % This error can occur due to implicit casts and null.
 It is a dynamic error if the run-time type of $o_1$ is not \code{bool}.
 If $o_1$ is \TRUE, the result of evaluating $b$ is \TRUE, otherwise $e_2$ is evaluated to an object $o_2$.
@@ -10806,7 +11183,9 @@
 Next, the stream associated with the innermost enclosing asynchronous for loop (\ref{asynchronousFor-in}), if any, is paused.
 The current invocation of the function body immediately enclosing $a$ is suspended until after $f$ completes.
 At some time after $f$ is completed, control returns to the current invocation.
-If $f$ has completed with an error $x$ and stack trace $t$, $a$ throws $x$ and $t$ (\ref{evaluation}).
+If $f$ has completed with an error $x$ and stack trace $t$,
+$a$ throws $x$ and $t$
+(\ref{expressionEvaluation}).
 If $f$ completes with a value $v$, $a$ evaluates to $v$.
 
 %Otherwise, the value of $a$ is the value of $e$. If evaluation of $e$ raises an exception $x$, $a$ raises $x$.
@@ -10843,10 +11222,14 @@
 
 \begin{grammar}
 <postfixExpression> ::= <assignableExpression> <postfixOperator>
+  \alt <constructorInvocation> <selector>*
   \alt <primary> <selector>*
 
 <postfixOperator> ::= <incrementOperator>
 
+<constructorInvocation> ::= \gnewline{}
+  <typeName> <typeArguments> `.' <identifier> <arguments>
+
 <selector> ::= <assignableSelector>
   \alt <argumentPart>
 
@@ -10855,153 +11238,182 @@
 \end{grammar}
 
 \LMHash{}%
-A \Index{postfix expression} is either a primary expression, a function, method or getter invocation, or an invocation of a postfix operator on an expression $e$.
+A \Index{postfix expression} is either a primary expression;
+a function, method or getter invocation;
+an invocation of a named constructor;
+or an invocation of a postfix operator on an expression $e$.
+All but the latter two are specified elsewhere.
 
 \LMHash{}%
-Evaluation of a postfix expression $e$ of the form \code{$v$++}, where $v$ is an identifier, proceeds as follows:
+\Case{Constructor Invocations}
+Consider a \synt{constructorInvocation} $e$ of the form
+\code{$n$<\metavar{typeArguments}>.\id(\metavar{arguments})}.
+If $n$ does not denote a class $C$
+that declares a constructor named \code{$C$.\id},
+a compile-time error occurs.
 
 \LMHash{}%
-Evaluate $v$ to an object $r$ and let $y$ be a fresh variable bound to $r$.
-Evaluate \code{$v$ = $y$ + 1}.
-Then $e$ evaluates to $r$.
+Otherwise, if $e$ occurs in a constant context
+(\ref{constantContexts})
+then $e$ is treated as \code{\CONST\,\,$e$},
+and if $e$ does not occur in a constant context
+then $e$ is treated as \code{\NEW\,\,$e$}.
 
-\LMHash{}%
-The static type of such an expression is the static type of $v$.
-
-\rationale{
-The above ensures that if $v$ is a variable, the getter gets called exactly once.
-Likewise in the cases below.
+% We might add support for passing type arguments to static methods,
+% but that is not a feature which is coming any time soon.
+\commentary{%
+Note that $e$ cannot be anything other than an instance creation
+(constant or not)
+because $e$ provides actual type arguments to $n$,
+which is not supported if $n$ denotes a library prefix,
+nor if $e$ is a static method invocation.
 }
+\EndCase
 
 \LMHash{}%
-Evaluation of a postfix expression $e$ of the form \code{$C$.$v$++}
+\Case{\code{$v$++}, \code{$v$-{}-}}
+Consider a postfix expression $e$ of the form \code{$v$\,\op},
+where $v$ is an identifier and \op{} is either \lit{++} or \lit{-{}-}.
+A compile-time error occurs unless $v$ denotes a variable,
+or $v$ denotes a getter and there is an associated setter \code{$v$=}.
+Let $T$ be the static type of the variable $v$ or the return type of the getter.
+A compile-time error occurs if $T$ is not \DYNAMIC{}
+and $T$ does not have an operator \lit{+} (when \op{} is \lit{++})
+or operator \lit{-} (when \op{} is \lit{-{}-}),
+or if the return type of this operator is not assignable to
+the variable respectively the argument type of the setter.
+A compile-time error occurs if \code{int} is not assignable to
+the parameter type of said operator.
+The static type of $e$ is $T$.
+
+\LMHash{}%
+Evaluation of a postfix expression $e$
+of the form \code{$v$++} respectively \code{$v$-{}-},
+where $v$ is an identifier, proceeds as follows:
+Evaluate $v$ to an object $r$ and let $y$ be a fresh variable bound to $r$.
+%% TODO(eernst): In order to eliminate syntactic sugar, we should probably
+%% rewrite this to specify the effect directly (cases to remember: `v` is a
+%% local variable/parameter, instance/static/global/imported getter).
+Evaluate \code{$v$ = $y$ + 1} respectively \code{$v$ = $y$ - 1}.
+Then $e$ evaluates to $r$.
+
+\rationale{%
+The above ensures that if the evaluation involves a getter,
+it gets called exactly once.
+Likewise in the cases below.%
+}
+\EndCase
+
+\LMHash{}%
+\Case{\code{$C$.$v$++}, \code{$C$.$v$-{}-}}
+Consider a postfix expression $e$ of the form \code{$C$.$v$\,\op},
+where $C$ is a type literal and \op{} is either \lit{++} or \lit{-{}-}.
+A compile-time error occurs unless \code{$C$.$v$} denotes a static getter
+and there is an associated static setter \code{$v$=}
+(\commentary{possibly implicitly induced by a static variable}).
+Let $T$ be the return type of said getter.
+A compile-time error occurs if $T$ is not \DYNAMIC{}
+and $T$ does not have an operator \lit{+} (when \op{} is \lit{++})
+or operator \lit{-} (when \op{} is \lit{-{}-}),
+or if the return type of this operator is not assignable to
+the argument type of the setter.
+A compile-time error occurs if \code{int} is not assignable to
+the parameter type of said operator.
+The static type of $e$ is $T$.
+
+\LMHash{}%
+Evaluation of a postfix expression $e$
+of the form \code{$C$.$v$++} respectively \code{$C$.$v$-{}-}
 where $C$ is a type literal proceeds as follows:
-
-\LMHash{}%
-Evaluate \code{$C$.$v$} to a value $r$
+Evaluate \code{$C$.$v$} to an object $r$
 and let $y$ be a fresh variable bound to $r$.
-Evaluate \code{$C$.$v$ = $y$ + 1}.
+Evaluate \code{$C$.$v$ = $y$ + 1} respectively \code{$C$.$v$ = $y$ - 1}.
 Then $e$ evaluates to $r$.
+\EndCase
 
 \LMHash{}%
-The static type of such an expression is the static type of \code{$C$.$v$}.
+\Case{\code{$e_1$.$v$++}, \code{$e_1$.$v$-{}-}}
+Consider a postfix expression $e$ of the form \code{$e_1$.$v$\,\op}
+where \op{} is either \lit{++} or \lit{-{}-}.
+Let $S$ be the static type of $e_1$.
+A compile-time error occurs unless $S$ has
+a getter named $v$ and a setter named \code{$v$=}
+(\commentary{possibly implicitly induced by an instance variable}).
+Let $T$ be the return type of said getter.
+A compile-time error occurs if $T$ is not \DYNAMIC{}
+and $T$ does not have an operator \lit{+} (when \op{} is \lit{++})
+or operator \lit{-} (when \op{} is \lit{-{}-}),
+or if the return type of this operator is not assignable to
+the argument type of the setter.
+A compile-time error occurs if \code{int} is not assignable to
+the parameter type of said operator.
+The static type of $e$ is $T$.
 
 \LMHash{}%
-Evaluation of a postfix expression $e$ of the form \code{$e_1$.$v$++}
+Evaluation of a postfix expression $e$
+of the form \code{$e_1$.$v$++} respectively \code{$e_1$.$v$-{}-}
 proceeds as follows:
-
-\LMHash{}%
 Evaluate $e_1$ to an object $u$ and let $x$ be a fresh variable bound to $u$.
-Evaluate \code{$x$.$v$} to a value $r$
+Evaluate \code{$x$.$v$} to an object $r$
 and let $y$ be a fresh variable bound to $r$.
-Evaluate \code{$x$.$v$ = $y$ + 1}.
+Evaluate \code{$x$.$v$ = $y$ + 1} respectively \code{$x$.$v$ = $y$ - 1}.
 Then $e$ evaluates to $r$.
+\EndCase
 
 \LMHash{}%
-The static type of such an expression is the static type of \code{$e_1$.$v$}.
+\Case{\code{$e_1$[$e_2$]++}, \code{$e_1$[$e_2$]-{}-}}
+Consider a postfix expression $e$ of the form \code{$e_1$[$e_2$]\,\op}
+where \op{} is either \lit{++} or \lit{-{}-}.
+Let $S_1$ be the static type of $e_1$
+and $S_2$ be the static type of $e_2$.
+A compile-time error occurs unless $S_1$ has
+an operator \lit{[]} and an operator \lit{[]=}.
+Let $T$ be the return type of the former.
+A compile-time error occurs unless $S_2$ is assignable to
+the first parameter type of said operator \lit{[]=}.
+A compile-time error occurs if $T$ is not \DYNAMIC{}
+and $T$ does not have an operator \lit{+} (when \op{} is \lit{++})
+or operator \lit{-} (when \op{} is \lit{-{}-}),
+or if the return type of this operator is not assignable to
+the second argument type of said operator \lit{[]=}.
+% We allow `e1[e2]++;` also when the entry has static type double,
+% so we can't just say 'assignable'.
+A compile-time error occurs if passing the integer literal \code{1}
+as an argument to said operator \lit{+} or \lit{-} would be an error.
+The static type of $e$ is $T$.
 
 \LMHash{}%
-Evaluation of a postfix expression $e$ of the form \code{$e_1$[$e_2$]++}
+Evaluation of a postfix expression $e$
+of the form \code{$e_1$[$e_2$]++} respectively \code{$e_1$[$e_2$]-{}-}
 proceeds as follows:
-
-\LMHash{}%
 Evaluate $e_1$ to an object $u$ and $e_2$ to an object $v$.
 Let $a$ and $i$ be fresh variables bound to $u$ and $v$ respectively.
 Evaluate \code{$a$[$i$]} to an object $r$
 and let $y$ be a fresh variable bound to $r$.
-Evaluate \code{$a$[$i$] = $y$ + 1}.
+Evaluate \code{$a$[$i$] = $y$ + 1} respectively \code{$a$[$i$] = $y$ - 1}.
 Then $e$ evaluates to $r$.
+\EndCase
 
 \LMHash{}%
-The static type of such an expression is the static type of \code{$e_1$[$e_2$]}.
+\Case{\code{$e_1$?.$v$++}, \code{$e_1$?.$v$-{}-}}
+Consider a postfix expression $e$ of the form \code{$e_1$?.$v$\,\op}
+where \op{} is either \lit{++} or \lit{-{}-}.
+Exactly the same compile-time errors that would be caused by \code{$e_1$.$v$\,\op}
+are also generated in the case of \code{$e_1$?.$v$\,\op}.
+The static type of $e$ is the static type of \code{$e_1$.$v$}.
 
 \LMHash{}%
-Evaluation of a postfix expression $e$ of the form \code{$v$-{}-}, where $v$ is an identifier, proceeds as follows:
-
-\LMHash{}%
-Evaluate the expression $v$ to an object $r$
-and let $y$ be a fresh variable bound to $r$.
-Evaluate \code{$v$ = $y$ - 1}.
-Then $e$ evaluates to $r$.
-
-\LMHash{}%
-The static type of such an expression is the static type of $v$.
-
-\LMHash{}%
-Evaluation of a postfix expression $e$ of the form \code{$C$.$v$-{}-}
+Evaluation of a postfix expression $e$
+of the form \code{$e_1$?.$v$++} respectively \code{$e_1$?.$v$-{}-}
 proceeds as follows:
-
-\LMHash{}%
-Evaluate \code{$C$.$v$} to a value $r$
-and let $y$ be a fresh variable bound to $r$.
-Evaluate \code{$C$.$v$ = $y$ - 1}.
-Then $e$ evaluates to $r$.
-
-\LMHash{}%
-The static type of such an expression is the static type of \code{$C$.$v$}.
-
-\LMHash{}%
-Evaluation of a postfix expression of the form \code{$e_1$.$v$-{}-}
-proceeds as follows:
-
-\LMHash{}%
-Evaluate $e_1$ to an object $u$ and let $x$ be a fresh variable bound to $u$.
-Evaluate \code{$x$.$v$} to a value $r$
-and let $y$ be a fresh variable bound to $r$.
-Evaluate \code{$x$.$v$ = $y$ - 1}.
-Then $e$ evaluates to $r$.
-
-\LMHash{}%
-The static type of such an expression is the static type of \code{$e_1$.$v$}.
-
-\LMHash{}%
-Evaluation of a postfix expression $e$ of the form \code{$e_1$[$e_2$]-{}-}
-proceeds as follows:
-
-\LMHash{}%
-Evaluate $e_1$ to an object $u$ and $e_2$ to an object $v$.
-Let $a$ and $i$ be fresh variables bound to $u$ and $v$ respectively.
-Evaluate \code{$a$[$i$]} to an object $r$
-and let $y$ be a fresh variable bound to $r$.
-Evaluate \code{$a$[$i$] = $y$ - 1}.
-Then $e$ evaluates to $r$.
-
-\LMHash{}%
-The static type of such an expression is the static type of \code{$e_1$[$e_2$]}.
-
-\LMHash{}%
-Evaluation of a postfix expression $e$ of the form \code{$e_1$?.$v$++}
-proceeds as follows:
-
-\LMHash{}%
 If $e_1$ is a type literal, evaluation of $e$ is equivalent to
-evaluation of \code{$e_1$.$v$++}.
-
-\LMHash{}%
+evaluation of \code{$e_1$.$v$++} respectively \code{$e_1$.$v$-{}-}.
 Otherwise evaluate $e_1$ to an object $u$.
 if $u$ is the null object, $e$ evaluates to the null object (\ref{null}).
 Otherwise let $x$ be a fresh variable bound to $u$.
-Evaluate \code{$x$.$v$++} to an object $o$.
+Evaluate \code{$x$.$v$++} respectively \code{$x$.$v$-{}-} to an object $o$.
 Then $e$ evaluates to $o$.
-
-\LMHash{}%
-The static type of such an expression is the static type of \code{$e_1$.$v$}.
-
-\LMHash{}%
-Evaluation of a postfix expression $e$ of the form \code{$e_1$?.$v$-{}-}
-proceeds as follows:
-
-If $e_1$ is a type literal, evaluation of $e$ is equivalent to
-evaluation of \code{$e_1$.$v$-{}-}.
-
-Otherwise evaluate $e_1$ to an object $u$.
-If $u$ is the null object, $e$ evaluates to the null object (\ref{null}).
-Otherwise let $x$ be a fresh variable bound to $u$.
-Evaluate \code{$x$.$v$-{}-} to an object $o$.
-Then $e$ evaluates to $o$.
-
-\LMHash{}%
-The static type of such an expression is the static type of \code{$e_1$.$v$}.
+\EndCase
 
 
 \subsection{Assignable Expressions}
@@ -11017,10 +11429,13 @@
 }
 
 \begin{grammar}
-<assignableExpression> ::= <primary> (<argumentPart>* <assignableSelector>)+
+<assignableExpression> ::= <primary> <assignableSelectorPart>+
   \alt \SUPER{} <unconditionalAssignableSelector>
+  \alt <constructorInvocation> <assignableSelectorPart>+
   <identifier>
 
+<assignableSelectorPart> ::= <argumentPart>* <assignableSelector>
+
 <unconditionalAssignableSelector> ::= `[' <expression> `]'
   \alt `.' <identifier>
 
@@ -11213,7 +11628,7 @@
 Evaluation of the is-expression \code{$e$ \IS{} $T$} proceeds as follows:
 
 \LMHash{}%
-The expression $e$ is evaluated to a value $v$.
+The expression $e$ is evaluated to an object $v$.
 If the dynamic type of $v$ is a subtype of $T$,
 the is-expression evaluates to \TRUE.
 Otherwise it evaluates to \FALSE.
@@ -11281,7 +11696,7 @@
  Evaluation of the cast expression \code{$e$ \AS{} $T$} proceeds as follows:
 
 \LMHash{}%
-The expression $e$ is evaluated to a value $v$.
+The expression $e$ is evaluated to an object $v$.
 % This error can occur, by design of `as`.
 It is a dynamic type error if $o$ is not the null object (\ref{null}),
 and the dynamic type of $o$ is not a subtype of $T$.
@@ -11296,7 +11711,8 @@
 
 \LMHash{}%
 A \Index{statement} is a fragment of Dart code that can be executed at run time.
-Statements, unlike expressions, do not evaluate to a value, but are instead executed for their effect on the program state and control flow.
+Statements, unlike expressions, do not evaluate to an object,
+but are instead executed for their effect on the program state and control flow.
 
 \begin{grammar}
 <statements> ::= <statement>*
@@ -11422,8 +11838,8 @@
 
 \LMHash{}%
 Execution of an expression statement \code{$e$;} proceeds by evaluating $e$.
-If the expression evaluates to a value, then the value is ignored
-and the execution completes normally.
+If the expression evaluates to an object,
+then the object is ignored and the execution completes normally.
 
 
 \subsection{Local Variable Declaration}
@@ -11560,9 +11976,9 @@
 \begin{dartCode}
 \CLASS{} C \{\}
 perverse() \{
-   \VAR{} v = \NEW{} C(); // \comment{compile-time error}
-   C aC; // \comment{compile-time error}
-   \VAR{} C = 10;
+  \VAR{} v = \NEW{} C(); // \comment{compile-time error}
+  C aC; // \comment{compile-time error}
+  \VAR{} C = 10;
 \}
 \end{dartCode}
 
@@ -11765,7 +12181,7 @@
 If this is the first iteration of the for loop, let $v'$ be $v$.
 Otherwise, let $v'$ be the variable $v''$ created in the previous execution of step \ref{allocateFreshVar}.
 \item
-The expression $[v'/v]c$ is evaluated to a value $o$.
+The expression $[v'/v]c$ is evaluated to an object $o$.
 % This error can occur due to implicit casts and null.
 It is a dynamic error if the run-time type of $o$ is not \code{bool}.
 If $o$ is \FALSE{}, the for loop completes normally.
@@ -11825,8 +12241,8 @@
 \begin{normativeDartCode}
 \VAR{} $n0$ = $e$.iterator;
 \WHILE{} ($n0$.moveNext()) \{
-   $D$ \id{} = $n0$.current;
-   $s$
+\ \ $D$ \id{} = $n0$.current;
+\ \ $s$
 \}
 \end{normativeDartCode}
 
@@ -12004,33 +12420,41 @@
 \end{grammar}
 
 \LMHash{}%
- Given a switch statement of the form
+Consider a switch statement of the form
 
 \begin{normativeDartCode}
 \SWITCH{} ($e$) \{
-   $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
-   $\ldots$
-   $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
-   $label_{(n+1)1} \ldots label_{(n+1)j_{n+1}}$ \DEFAULT{}: $s_{n+1}$
+\ \ $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
+\ \ $\ldots$
+\ \ $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
+\ \ $label_{(n+1)1} \ldots label_{(n+1)j_{n+1}}$ \DEFAULT{}: $s_{n+1}$
 \}
 \end{normativeDartCode}
 
+\noindent
 or the form
 
 \begin{normativeDartCode}
 \SWITCH{} ($e$) \{
-   $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
-   $\ldots$
-   $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
+\ \ $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
+\ \ $\ldots$
+\ \ $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
 \}
 \end{normativeDartCode}
 
-it is a compile-time error unless the expressions $e_k$ are constant expressions for all $k \in 1 .. n$.
-It is a compile-time error if the values of the expressions $e_k$ are not either:
+\commentary{%
+Note that each expression $e_j, j \in 1 .. n$ occurs in a constant context
+(\ref{constantContexts}),
+which means that \CONST{} modifiers need not be specified explicitly.%
+}
+
+\LMHash{}%
+It is a compile-time error unless each expression $e_j, j \in 1 .. n$ is constant.
+It is a compile-time error if the value of the expressions $e_j, j \in 1 .. n$ are not either:
 \begin{itemize}
-\item instances of the same class $C$, for all $k \in 1 .. n$, or
-\item instances of a class that implements \code{int}, for all $k \in 1 .. n$, or
-\item instances of a class that implements \code{String}, for all $k \in 1 .. n$.
+\item instances of the same class $C$, for all $j \in 1 .. n$, or
+\item instances of a class that implements \code{int}, for all $j \in 1 .. n$, or
+\item instances of a class that implements \code{String}, for all $j \in 1 .. n$.
 \end{itemize}
 
 \commentary{
@@ -12067,10 +12491,10 @@
 
 \begin{normativeDartCode}
 \SWITCH{} ($e$) \{
-   $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
-   $\ldots$
-   $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
-   $label_{(n+1)1} \ldots label_{(n+1)j_{n+1}}$ \DEFAULT{}: $s_{n+1}$
+\ \ $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
+\ \ $\ldots$
+\ \ $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
+\ \ $label_{(n+1)1} \ldots label_{(n+1)j_{n+1}}$ \DEFAULT{}: $s_{n+1}$
 \}
 \end{normativeDartCode}
 
@@ -12078,9 +12502,9 @@
 
 \begin{normativeDartCode}
 \SWITCH{} ($e$) \{
-   $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
-   $\ldots$
-   $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
+\ \ $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
+\ \ $\ldots$
+\ \ $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
 \}
 \end{normativeDartCode}
 
@@ -12106,10 +12530,10 @@
 
 \begin{normativeDartCode}
 \SWITCH{} ($e$) \{
-   $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
-   $\ldots$
-   $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
-   $label_{(n+1)1} \ldots label_{(n+1)j_{n+1}}$ \DEFAULT{}: $s_{n+1}$
+\ \ $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
+\ \ $\ldots$
+\ \ $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
+\ \ $label_{(n+1)1} \ldots label_{(n+1)j_{n+1}}$ \DEFAULT{}: $s_{n+1}$
 \}
 \end{normativeDartCode}
 
@@ -12129,9 +12553,9 @@
 
 \begin{normativeDartCode}
 \SWITCH{} ($e$) \{
-   $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
-   $\ldots$
-   $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
+\ \ $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
+\ \ $\ldots$
+\ \ $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
 \}
 \end{normativeDartCode}
 
@@ -12200,9 +12624,9 @@
 
 \begin{normativeDartCode}
 \SWITCH{} ($e$) \{
-   $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
-   $\ldots$
-   $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
+\ \ $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
+\ \ $\ldots$
+\ \ $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
 \}
 \end{normativeDartCode}
 
@@ -12210,10 +12634,10 @@
 
 \begin{normativeDartCode}
 \SWITCH{} ($e$) \{
-   $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
-   $\ldots$
-   $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
-   $label_{(n+1)1} \ldots label_{(n+1)j_{n+1}}$ \DEFAULT{}: $s_{n+1}$
+\ \ $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
+\ \ $\ldots$
+\ \ $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
+\ \ $label_{(n+1)1} \ldots label_{(n+1)j_{n+1}}$ \DEFAULT{}: $s_{n+1}$
 \}
 \end{normativeDartCode}
 
@@ -12785,7 +13209,7 @@
 \item
   The getter \code{current} is invoked on $i$.
   If the invocation throws
-  (\ref{evaluation}),
+  (\ref{expressionEvaluation}),
   execution of $s$ throws the same exception object and stack trace
   (\ref{statementCompletion}).
   Otherwise, the result $x$ of the getter invocation is added to
diff --git a/pkg/analysis_server/README.md b/pkg/analysis_server/README.md
index d596f5c..d93666c 100644
--- a/pkg/analysis_server/README.md
+++ b/pkg/analysis_server/README.md
@@ -12,7 +12,9 @@
 
 Clients (typically tools, such as an editor) are expected to run the analysis
 server in a separate process and communicate with it using a JSON protocol. The
-protocol is specified in the file [`analysis_server/doc/api.html`][api].
+original protocol is specified in the file [`analysis_server/doc/api.html`][api]
+and (less complete) [Language Server Protocol][lsp_spec] support is documented
+in [`tool/lsp_spec/README.md`](tool/lsp_spec/README.md).
 
 ## Features and bugs
 
@@ -20,3 +22,4 @@
 
 [tracker]: https://github.com/dart-lang/sdk/issues
 [api]: https://htmlpreview.github.io/?https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/doc/api.html
+[lsp_spec]: https://microsoft.github.io/language-server-protocol/
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index f7ed499..c8b0845 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -109,7 +109,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  1.23.0
+  1.25.0
 </h1>
 <p>
   This document contains a specification of the API provided by the
@@ -256,6 +256,9 @@
 </ul>
 
 <p><a href="#domain_completion">Completion</a></p><ul><li><a href="#request_completion.getSuggestions">completion.getSuggestions</a></li>
+<li><a href="#request_completion.setSubscriptions">completion.setSubscriptions</a></li>
+<li><a href="#request_completion.registerLibraryPaths">completion.registerLibraryPaths</a></li>
+<li><a href="#request_completion.getSuggestionDetails">completion.getSuggestionDetails</a></li>
 </ul>
 
 <p><a href="#domain_search">Search</a></p><ul><li><a href="#request_search.findElementReferences">search.findElementReferences</a></li>
@@ -1451,6 +1454,7 @@
   
   
   
+  
 <h3>Requests</h3><dl><dt class="request"><a name="request_completion.getSuggestions">completion.getSuggestions</a></dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "completion.getSuggestions"
@@ -1489,6 +1493,117 @@
           The identifier used to associate results with this
           completion request.
         </p>
+      </dd></dl></dd><dt class="request"><a name="request_completion.setSubscriptions">completion.setSubscriptions</a></dt><dd><div class="box"><pre>request: {
+  "id": String
+  "method": "completion.setSubscriptions"
+  "params": {
+    "<b>subscriptions</b>": List&lt;<a href="#type_CompletionService">CompletionService</a>&gt;
+  }
+}</pre><br><pre>response: {
+  "id": String
+  "error": <span style="color:#999999">optional</span> <a href="#type_RequestError">RequestError</a>
+}</pre></div>
+    <p>
+      Subscribe for completion services. All previous subscriptions are
+      replaced by the given set of services.
+    </p>
+    <p>
+      It is an error if any of the elements in the list are not valid
+      services. If there is an error, then the current subscriptions will
+      remain unchanged.
+    </p>
+    
+  <h4>parameters:</h4><dl><dt class="field"><b>subscriptions: List&lt;<a href="#type_CompletionService">CompletionService</a>&gt;</b></dt><dd>
+        
+        <p>A list of the services being subscribed to.</p>
+      </dd></dl></dd><dt class="request"><a name="request_completion.registerLibraryPaths">completion.registerLibraryPaths</a></dt><dd><div class="box"><pre>request: {
+  "id": String
+  "method": "completion.registerLibraryPaths"
+  "params": {
+    "<b>paths</b>": List&lt;<a href="#type_LibraryPathSet">LibraryPathSet</a>&gt;
+  }
+}</pre><br><pre>response: {
+  "id": String
+  "error": <span style="color:#999999">optional</span> <a href="#type_RequestError">RequestError</a>
+}</pre></div>
+    <p>
+      The client can make this request to express interest in certain
+      libraries to receive completion suggestions from based on the client path.
+      If this request is received before the client has used
+      'completion.setSubscriptions' to subscribe to the <tt>AVAILABLE_SUGGESTION_SETS</tt>
+      service, then an error of type <tt>NOT_SUBSCRIBED_TO_AVAILABLE_SUGGESTION_SETS</tt>
+      will be generated. All previous paths are replaced by the given set of paths.
+    </p>
+    
+  <h4>parameters:</h4><dl><dt class="field"><b>paths: List&lt;<a href="#type_LibraryPathSet">LibraryPathSet</a>&gt;</b></dt><dd>
+        
+        <p>
+          A list of objects each containing a path and the additional libraries from which
+          the client is interested in receiving completion suggestions.
+          If one configured path is beneath another, the descendent
+          will override the ancestors' configured libraries of interest.
+        </p>
+      </dd></dl></dd><dt class="request"><a name="request_completion.getSuggestionDetails">completion.getSuggestionDetails</a></dt><dd><div class="box"><pre>request: {
+  "<b>id</b>": String
+  "method": "completion.getSuggestionDetails"
+  "params": {
+    "<b>file</b>": <a href="#type_FilePath">FilePath</a>
+    "<b>id</b>": int
+    "<b>label</b>": String
+    "<b>offset</b>": int
+  }
+}</pre><br><pre>response: {
+  "id": String
+  "error": <span style="color:#999999">optional</span> <a href="#type_RequestError">RequestError</a>
+  "result": {
+    "<b>completion</b>": String
+    "<b>change</b>": <span style="color:#999999">optional</span> <a href="#type_SourceChange">SourceChange</a>
+  }
+}</pre></div>
+    <p>
+      Clients must make this request when the user has selected a completion
+      suggestion from an <tt>AvailableSuggestionSet</tt>. Analysis server will respond with
+      the text to insert as well as any <tt>SourceChange</tt> that needs to be applied
+      in case the completion requires an additional import to be added. It is an error
+      if the id is no longer valid, for instance if the library has been removed after
+      the completion suggestion is accepted.
+    </p>
+    
+    
+  <h4>parameters:</h4><dl><dt class="field"><b>file: <a href="#type_FilePath">FilePath</a></b></dt><dd>
+        
+        <p>
+          The path of the file into which this completion is being inserted.
+        </p>
+      </dd><dt class="field"><b>id: int</b></dt><dd>
+        
+        <p>
+          The identifier of the <tt>AvailableSuggestionSet</tt> containing
+          the selected label.
+        </p>
+      </dd><dt class="field"><b>label: String</b></dt><dd>
+        
+        <p>
+          The label from the <tt>AvailableSuggestionSet</tt> with the `id`
+          for which insertion information is requested.
+        </p>
+      </dd><dt class="field"><b>offset: int</b></dt><dd>
+        
+        <p>
+          The offset in the file where the completion will be inserted.
+        </p>
+      </dd></dl><h4>returns:</h4><dl><dt class="field"><b>completion: String</b></dt><dd>
+        
+        <p>
+          The full text to insert, including any optional import prefix.
+        </p>
+      </dd><dt class="field"><b>change: <a href="#type_SourceChange">SourceChange</a><span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          A change for the client to apply in case the library containing
+          the accepted completion suggestion needs to be imported. The field
+          will be omitted if there are no additional changes that need to be made.
+        </p>
       </dd></dl></dd></dl><h3>Notifications</h3><dl><dt class="notification"><a name="notification_completion.results">completion.results</a></dt><dd><div class="box"><pre>notification: {
   "event": "completion.results"
   "params": {
@@ -1498,7 +1613,7 @@
     "<b>results</b>": List&lt;<a href="#type_CompletionSuggestion">CompletionSuggestion</a>&gt;
     "<b>isLast</b>": bool
     "<b>includedSuggestionSets</b>": <span style="color:#999999">optional</span> List&lt;<a href="#type_IncludedSuggestionSet">IncludedSuggestionSet</a>&gt;
-    "<b>includedSuggestionKinds</b>": <span style="color:#999999">optional</span> List&lt;<a href="#type_ElementKind">ElementKind</a>&gt;
+    "<b>includedElementKinds</b>": <span style="color:#999999">optional</span> List&lt;<a href="#type_ElementKind">ElementKind</a>&gt;
     "<b>includedSuggestionRelevanceTags</b>": <span style="color:#999999">optional</span> List&lt;<a href="#type_IncludedSuggestionRelevanceTag">IncludedSuggestionRelevanceTag</a>&gt;
   }
 }</pre></div>
@@ -1551,19 +1666,13 @@
       </dd><dt class="field"><b>includedSuggestionSets: List&lt;<a href="#type_IncludedSuggestionSet">IncludedSuggestionSet</a>&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
         
         <p>
-          This field is experimental.
-        </p>
-        <p>
           References to <tt>AvailableSuggestionSet</tt> objects previously sent
           to the client. The client can include applicable names from the
           referenced library in code completion suggestions.
         </p>
-      </dd><dt class="field"><b>includedSuggestionKinds: List&lt;<a href="#type_ElementKind">ElementKind</a>&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
+      </dd><dt class="field"><b>includedElementKinds: List&lt;<a href="#type_ElementKind">ElementKind</a>&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
         
         <p>
-          This field is experimental.
-        </p>
-        <p>
           The client is expected to check this list against the
           <tt>ElementKind</tt> sent in <tt>IncludedSuggestionSet</tt> to decide
           whether or not these symbols should should be presented to the user.
@@ -1571,9 +1680,6 @@
       </dd><dt class="field"><b>includedSuggestionRelevanceTags: List&lt;<a href="#type_IncludedSuggestionRelevanceTag">IncludedSuggestionRelevanceTag</a>&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
         
         <p>
-          This field is experimental.
-        </p>
-        <p>
           The client is expected to check this list against the values of the
           field <tt>relevanceTags</tt> of <tt>AvailableSuggestion</tt> to
           decide if the suggestion should be given a different relevance than
@@ -1586,6 +1692,34 @@
           than one <tt>IncludedSuggestionRelevanceTag</tt>, the maximum
           relevance boost is used.
         </p>
+      </dd></dl></dd><dt class="notification"><a name="notification_completion.availableSuggestions">completion.availableSuggestions</a></dt><dd><div class="box"><pre>notification: {
+  "event": "completion.availableSuggestions"
+  "params": {
+    "<b>changedLibraries</b>": <span style="color:#999999">optional</span> List&lt;<a href="#type_AvailableSuggestionSet">AvailableSuggestionSet</a>&gt;
+    "<b>removedLibraries</b>": <span style="color:#999999">optional</span> List&lt;int&gt;
+  }
+}</pre></div>
+    <p>
+      Reports the pre-computed, candidate completions from symbols defined
+      in a corresponding library. This notification may be sent multiple times.
+      When a notification is processed, clients should replace any previous
+      information about the libraries in the list of changedLibraries, discard
+      any information about the libraries in the list of removedLibraries, and
+      preserve any previously received information about any libraries that are
+      not included in either list.
+    </p>
+    
+  <h4>parameters:</h4><dl><dt class="field"><b>changedLibraries: List&lt;<a href="#type_AvailableSuggestionSet">AvailableSuggestionSet</a>&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          A list of pre-computed, potential completions coming from
+          this set of completion suggestions.
+        </p>
+      </dd><dt class="field"><b>removedLibraries: List&lt;int&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          A list of library ids that no longer apply.
+        </p>
       </dd></dl></dd></dl>
 <h2 class="domain"><a name="domain_search">search domain</a></h2>
   <p>
@@ -2698,6 +2832,7 @@
   
   
   
+  
 <dl><dt class="typeDefinition"><a name="type_AddContentOverlay">AddContentOverlay: object</a></dt><dd>
     <p>
       A directive to begin overlaying the contents of a file. The supplied
@@ -2881,12 +3016,95 @@
           The name of the current target of analysis. This field is
           omitted if analyzing is false.
         </p>
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_AvailableSuggestion">AvailableSuggestion: object</a></dt><dd>
+    <p>
+      A partial completion suggestion that can be used in combination with
+      info from <tt>completion.results</tt> to build completion suggestions
+      for not yet imported library tokens.
+    </p>
+    
+  <dl><dt class="field"><b>label: String</b></dt><dd>
+        
+        <p>
+          The identifier to present to the user for code completion.
+        </p>
+      </dd><dt class="field"><b>element: <a href="#type_Element">Element</a></b></dt><dd>
+        
+        <p>
+          Information about the element reference being suggested.
+        </p>
+      </dd><dt class="field"><b>defaultArgumentListString: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          A default String for use in generating argument list source contents
+          on the client side.
+        </p>
+      </dd><dt class="field"><b>defaultArgumentListTextRanges: List&lt;int&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          Pairs of offsets and lengths describing 'defaultArgumentListString'
+          text ranges suitable for use by clients to set up linked edits of
+          default argument source contents. For example, given an argument list
+          string 'x, y', the corresponding text range [0, 1, 3, 1], indicates
+          two text ranges of length 1, starting at offsets 0 and 3. Clients can
+          use these ranges to treat the 'x' and 'y' values specially for linked
+          edits.
+        </p>
+      </dd><dt class="field"><b>docComplete: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The Dartdoc associated with the element being suggested. This field
+          is omitted if there is no Dartdoc associated with the element.
+        </p>
+      </dd><dt class="field"><b>docSummary: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          An abbreviated version of the Dartdoc associated with the element being suggested.
+          This field is omitted if there is no Dartdoc associated with the element.
+        </p>
+      </dd><dt class="field"><b>parameterNames: List&lt;String&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          If the element is an executable, the names of the formal parameters of
+          all kinds - required, optional positional, and optional named. The
+          names of positional parameters are empty strings. Omitted if the element
+          is not an executable.
+        </p>
+      </dd><dt class="field"><b>parameterTypes: List&lt;String&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          If the element is an executable, the declared types of the formal parameters
+          of all kinds - required, optional positional, and optional named.
+          Omitted if the element is not an executable.
+        </p>
+      </dd><dt class="field"><b>relevanceTags: List&lt;<a href="#type_AvailableSuggestionRelevanceTag">AvailableSuggestionRelevanceTag</a>&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          This field is set if the relevance of this suggestion might be
+          changed depending on where completion is requested.
+        </p>
+      </dd><dt class="field"><b>requiredParameterCount: int<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
       </dd></dl></dd><dt class="typeDefinition"><a name="type_AvailableSuggestionRelevanceTag">AvailableSuggestionRelevanceTag: String</a></dt><dd>
     
     <p>
       The opaque tag value.
     </p>
-  </dd><dt class="typeDefinition"><a name="type_ChangeContentOverlay">ChangeContentOverlay: object</a></dt><dd>
+  </dd><dt class="typeDefinition"><a name="type_AvailableSuggestionSet">AvailableSuggestionSet: object</a></dt><dd>
+    
+  <dl><dt class="field"><b>id: int</b></dt><dd>
+        
+        <p>
+          The id associated with the library.
+        </p>
+      </dd><dt class="field"><b>uri: String</b></dt><dd>
+        
+        <p>
+          The URI of the library.
+        </p>
+      </dd><dt class="field"><b>items: List&lt;<a href="#type_AvailableSuggestion">AvailableSuggestion</a>&gt;</b></dt><dd>
+        
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_ChangeContentOverlay">ChangeContentOverlay: object</a></dt><dd>
     <p>
       A directive to modify an existing file content overlay. One or more ranges
       of text are deleted from the old file content overlay and replaced with
@@ -2945,7 +3163,20 @@
       An identifier used to associate completion results with a
       completion request.
     </p>
-  </dd><dt class="typeDefinition"><a name="type_CompletionSuggestion">CompletionSuggestion: object</a></dt><dd>
+  </dd><dt class="typeDefinition"><a name="type_CompletionService">CompletionService: String</a></dt><dd>
+    <p>
+      An enumeration of the completion services to which a client can subscribe.
+    </p>
+    
+  <dl><dt class="value">AVAILABLE_SUGGESTION_SETS</dt><dd>
+        
+        <p>
+          The client will receive notifications once subscribed with completion suggestion sets from
+          the libraries of interest. The client should keep an up-to-date record of these in
+          memory so that it will be able to union these candidates with other
+          completion suggestions when applicable at completion time.
+        </p>
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_CompletionSuggestion">CompletionSuggestion: object</a></dt><dd>
     <p>
       A suggestion for how to complete partially entered text. Many of the
       fields are optional, depending on the kind of element being suggested.
@@ -2977,12 +3208,6 @@
           is only defined if the displayed text should be different than the
           completion.  Otherwise it is omitted.
         </p>
-      </dd><dt class="field"><b>elementUri: String<span style="color:#999999"> (optional)</span></b></dt><dd>
-        
-        <p>
-          The URI of the element corresponding to this suggestion. It will be
-          set whenever analysis server is able to compute it.
-        </p>
       </dd><dt class="field"><b>selectionOffset: int</b></dt><dd>
         
         <p>
@@ -3093,12 +3318,6 @@
           The type of the options parameter being suggested. This field is
           omitted if the parameterName field is omitted.
         </p>
-      </dd><dt class="field"><b>importUri: String<span style="color:#999999"> (optional)</span></b></dt><dd>
-        
-        <p>
-          The import to be added if the suggestion is out of scope and needs
-          an import to be added to be in scope.
-        </p>
       </dd></dl></dd><dt class="typeDefinition"><a name="type_CompletionSuggestionKind">CompletionSuggestionKind: String</a></dt><dd>
     <p>
       An enumeration of the kinds of elements that can be included in a
@@ -3716,6 +3935,57 @@
         <p>
           The names of the elements imported from the library.
         </p>
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_IncludedSuggestionRelevanceTag">IncludedSuggestionRelevanceTag: object</a></dt><dd>
+    <p>
+      Each <tt>AvailableSuggestion</tt> can specify zero or more tags in the
+      field <tt>relevanceTags</tt>, so that when the included tag is equal to
+      one of the <tt>relevanceTags</tt>, the suggestion is given higher
+      relevance than the whole <tt>IncludedSuggestionSet</tt>.
+    </p>
+    
+  <dl><dt class="field"><b>tag: <a href="#type_AvailableSuggestionRelevanceTag">AvailableSuggestionRelevanceTag</a></b></dt><dd>
+        
+        <p>
+          The opaque value of the tag.
+        </p>
+      </dd><dt class="field"><b>relevanceBoost: int</b></dt><dd>
+        
+        <p>
+          The boost to the relevance of the completion suggestions that match
+          this tag, which is added to the relevance of the containing
+          <tt>IncludedSuggestionSet</tt>.
+        </p>
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_IncludedSuggestionSet">IncludedSuggestionSet: object</a></dt><dd>
+    <p>
+      A reference to an <tt>AvailableSuggestionSet</tt> noting
+      that the library's members which match the kind of this ref
+      should be presented to the user.
+    </p>
+    
+  <dl><dt class="field"><b>id: int</b></dt><dd>
+        
+        <p>
+          Clients should use it to access the set of precomputed completions
+          to be displayed to the user.
+        </p>
+      </dd><dt class="field"><b>relevance: int</b></dt><dd>
+        
+        <p>
+          The relevance of completion suggestions from this
+          library where a higher number indicates a higher relevance.
+        </p>
+      </dd><dt class="field"><b>displayUri: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The optional string that should be displayed instead of the
+          <tt>uri</tt> of the referenced <tt>AvailableSuggestionSet</tt>.
+        </p>
+        <p>
+          For example libraries in the "test" directory of a package have only
+          "file://" URIs, so are usually long, and don't look nice, but actual
+          import directives will use relative URIs, which are short, so we
+          probably want to display such relative URIs to the user.
+        </p>
       </dd></dl></dd><dt class="typeDefinition"><a name="type_KytheEntry">KytheEntry: object</a></dt><dd>
     <p>
       This object matches the format and documentation of the Entry object
@@ -3787,6 +4057,24 @@
         <p>
           The language this name belongs to.
         </p>
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_LibraryPathSet">LibraryPathSet: object</a></dt><dd>
+    <p>
+      A list of associations between paths and the libraries that should be
+      included for code completion when editing a file beneath that path.
+    </p>
+    
+  <dl><dt class="field"><b>scope: <a href="#type_FilePath">FilePath</a></b></dt><dd>
+        
+        <p>
+          The filepath for which this request's libraries should be active
+          in completion suggestions. This object associates filesystem regions
+          to libraries and library directories of interest to the client.
+        </p>
+      </dd><dt class="field"><b>libraryPaths: List&lt;<a href="#type_FilePath">FilePath</a>&gt;</b></dt><dd>
+        
+        <p>
+          The paths of the libraries of interest to the client for completion suggestions.
+        </p>
       </dd></dl></dd><dt class="typeDefinition"><a name="type_LinkedEditGroup">LinkedEditGroup: object</a></dt><dd>
     <p>
       A collection of positions that should be linked (edited simultaneously)
@@ -5110,7 +5398,7 @@
   TODO: TBD
 </p>
 <h2 class="domain"><a name="index">Index</a></h2>
-<h3>Domains</h3><h4>server (<a href="#domain_server">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_server.getVersion">getVersion</a></li><li><a href="#request_server.shutdown">shutdown</a></li><li><a href="#request_server.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_server.connected">connected</a></li><li><a href="#notification_server.error">error</a></li><li><a href="#notification_server.status">status</a></li></ul></div></div><h4>analysis (<a href="#domain_analysis">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_analysis.getErrors">getErrors</a></li><li><a href="#request_analysis.getHover">getHover</a></li><li><a href="#request_analysis.getLibraryDependencies">getLibraryDependencies</a></li><li><a href="#request_analysis.getNavigation">getNavigation</a></li><li><a href="#request_analysis.getReachableSources">getReachableSources</a></li><li><a href="#request_analysis.reanalyze">reanalyze</a></li><li><a href="#request_analysis.setAnalysisRoots">setAnalysisRoots</a></li><li><a href="#request_analysis.setGeneralSubscriptions">setGeneralSubscriptions</a></li><li><a href="#request_analysis.setPriorityFiles">setPriorityFiles</a></li><li><a href="#request_analysis.setSubscriptions">setSubscriptions</a></li><li><a href="#request_analysis.updateContent">updateContent</a></li><li><a href="#request_analysis.updateOptions">updateOptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_analysis.analyzedFiles">analyzedFiles</a></li><li><a href="#notification_analysis.closingLabels">closingLabels</a></li><li><a href="#notification_analysis.errors">errors</a></li><li><a href="#notification_analysis.flushResults">flushResults</a></li><li><a href="#notification_analysis.folding">folding</a></li><li><a href="#notification_analysis.highlights">highlights</a></li><li><a href="#notification_analysis.implemented">implemented</a></li><li><a href="#notification_analysis.invalidate">invalidate</a></li><li><a href="#notification_analysis.navigation">navigation</a></li><li><a href="#notification_analysis.occurrences">occurrences</a></li><li><a href="#notification_analysis.outline">outline</a></li><li><a href="#notification_analysis.overrides">overrides</a></li></ul></div></div><h4>completion (<a href="#domain_completion">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_completion.getSuggestions">getSuggestions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_completion.results">results</a></li><li><a href="#notification_completion.availableSuggestions">availableSuggestions</a></li></ul></div></div><h4>search (<a href="#domain_search">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_search.findElementReferences">findElementReferences</a></li><li><a href="#request_search.findMemberDeclarations">findMemberDeclarations</a></li><li><a href="#request_search.findMemberReferences">findMemberReferences</a></li><li><a href="#request_search.findTopLevelDeclarations">findTopLevelDeclarations</a></li><li><a href="#request_search.getTypeHierarchy">getTypeHierarchy</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_search.results">results</a></li></ul></div></div><h4>edit (<a href="#domain_edit">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_edit.format">format</a></li><li><a href="#request_edit.getAssists">getAssists</a></li><li><a href="#request_edit.getAvailableRefactorings">getAvailableRefactorings</a></li><li><a href="#request_edit.getFixes">getFixes</a></li><li><a href="#request_edit.getRefactoring">getRefactoring</a></li><li><a href="#request_edit.sortMembers">sortMembers</a></li><li><a href="#request_edit.organizeDirectives">organizeDirectives</a></li></ul></div><h4>execution (<a href="#domain_execution">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_execution.createContext">createContext</a></li><li><a href="#request_execution.deleteContext">deleteContext</a></li><li><a href="#request_execution.getSuggestions">getSuggestions</a></li><li><a href="#request_execution.mapUri">mapUri</a></li><li><a href="#request_execution.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_execution.launchData">launchData</a></li></ul></div></div><h4>diagnostic (<a href="#domain_diagnostic">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_diagnostic.getDiagnostics">getDiagnostics</a></li><li><a href="#request_diagnostic.getServerPort">getServerPort</a></li></ul></div><h3>Types (<a href="#types">↑</a>)</h3><div class="subindex"><ul><li><a href="#type_AddContentOverlay">AddContentOverlay</a></li><li><a href="#type_AnalysisError">AnalysisError</a></li><li><a href="#type_AnalysisErrorFixes">AnalysisErrorFixes</a></li><li><a href="#type_AnalysisErrorSeverity">AnalysisErrorSeverity</a></li><li><a href="#type_AnalysisErrorType">AnalysisErrorType</a></li><li><a href="#type_AnalysisOptions">AnalysisOptions</a></li><li><a href="#type_AnalysisService">AnalysisService</a></li><li><a href="#type_AnalysisStatus">AnalysisStatus</a></li><li><a href="#type_AvailableSuggestionRelevanceTag">AvailableSuggestionRelevanceTag</a></li><li><a href="#type_ChangeContentOverlay">ChangeContentOverlay</a></li><li><a href="#type_ClosingLabel">ClosingLabel</a></li><li><a href="#type_CompletionId">CompletionId</a></li><li><a href="#type_CompletionSuggestion">CompletionSuggestion</a></li><li><a href="#type_CompletionSuggestionKind">CompletionSuggestionKind</a></li><li><a href="#type_ContextData">ContextData</a></li><li><a href="#type_Element">Element</a></li><li><a href="#type_ElementDeclaration">ElementDeclaration</a></li><li><a href="#type_ElementKind">ElementKind</a></li><li><a href="#type_ExecutableFile">ExecutableFile</a></li><li><a href="#type_ExecutableKind">ExecutableKind</a></li><li><a href="#type_ExecutionContextId">ExecutionContextId</a></li><li><a href="#type_ExecutionService">ExecutionService</a></li><li><a href="#type_FileKind">FileKind</a></li><li><a href="#type_FilePath">FilePath</a></li><li><a href="#type_FoldingKind">FoldingKind</a></li><li><a href="#type_FoldingRegion">FoldingRegion</a></li><li><a href="#type_GeneralAnalysisService">GeneralAnalysisService</a></li><li><a href="#type_HighlightRegion">HighlightRegion</a></li><li><a href="#type_HighlightRegionType">HighlightRegionType</a></li><li><a href="#type_HoverInformation">HoverInformation</a></li><li><a href="#type_ImplementedClass">ImplementedClass</a></li><li><a href="#type_ImplementedMember">ImplementedMember</a></li><li><a href="#type_ImportedElements">ImportedElements</a></li><li><a href="#type_KytheEntry">KytheEntry</a></li><li><a href="#type_KytheVName">KytheVName</a></li><li><a href="#type_LinkedEditGroup">LinkedEditGroup</a></li><li><a href="#type_LinkedEditSuggestion">LinkedEditSuggestion</a></li><li><a href="#type_LinkedEditSuggestionKind">LinkedEditSuggestionKind</a></li><li><a href="#type_Location">Location</a></li><li><a href="#type_NavigationRegion">NavigationRegion</a></li><li><a href="#type_NavigationTarget">NavigationTarget</a></li><li><a href="#type_Occurrences">Occurrences</a></li><li><a href="#type_Outline">Outline</a></li><li><a href="#type_OverriddenMember">OverriddenMember</a></li><li><a href="#type_Override">Override</a></li><li><a href="#type_Position">Position</a></li><li><a href="#type_PostfixTemplateDescriptor">PostfixTemplateDescriptor</a></li><li><a href="#type_PubStatus">PubStatus</a></li><li><a href="#type_RefactoringFeedback">RefactoringFeedback</a></li><li><a href="#type_RefactoringKind">RefactoringKind</a></li><li><a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a></li><li><a href="#type_RefactoringMethodParameterKind">RefactoringMethodParameterKind</a></li><li><a href="#type_RefactoringOptions">RefactoringOptions</a></li><li><a href="#type_RefactoringProblem">RefactoringProblem</a></li><li><a href="#type_RefactoringProblemSeverity">RefactoringProblemSeverity</a></li><li><a href="#type_RemoveContentOverlay">RemoveContentOverlay</a></li><li><a href="#type_RequestError">RequestError</a></li><li><a href="#type_RequestErrorCode">RequestErrorCode</a></li><li><a href="#type_RuntimeCompletionExpression">RuntimeCompletionExpression</a></li><li><a href="#type_RuntimeCompletionExpressionType">RuntimeCompletionExpressionType</a></li><li><a href="#type_RuntimeCompletionExpressionTypeKind">RuntimeCompletionExpressionTypeKind</a></li><li><a href="#type_RuntimeCompletionVariable">RuntimeCompletionVariable</a></li><li><a href="#type_SearchId">SearchId</a></li><li><a href="#type_SearchResult">SearchResult</a></li><li><a href="#type_SearchResultKind">SearchResultKind</a></li><li><a href="#type_ServerService">ServerService</a></li><li><a href="#type_SourceChange">SourceChange</a></li><li><a href="#type_SourceEdit">SourceEdit</a></li><li><a href="#type_SourceFileEdit">SourceFileEdit</a></li><li><a href="#type_TypeHierarchyItem">TypeHierarchyItem</a></li></ul></div><h3>Refactorings (<a href="#refactorings">↑</a>)</h3><div class="subindex"><ul><li><a href="#refactoring_CONVERT_GETTER_TO_METHOD">CONVERT_GETTER_TO_METHOD</a></li><li><a href="#refactoring_CONVERT_METHOD_TO_GETTER">CONVERT_METHOD_TO_GETTER</a></li><li><a href="#refactoring_EXTRACT_LOCAL_VARIABLE">EXTRACT_LOCAL_VARIABLE</a></li><li><a href="#refactoring_EXTRACT_METHOD">EXTRACT_METHOD</a></li><li><a href="#refactoring_EXTRACT_WIDGET">EXTRACT_WIDGET</a></li><li><a href="#refactoring_INLINE_LOCAL_VARIABLE">INLINE_LOCAL_VARIABLE</a></li><li><a href="#refactoring_INLINE_METHOD">INLINE_METHOD</a></li><li><a href="#refactoring_MOVE_FILE">MOVE_FILE</a></li><li><a href="#refactoring_RENAME">RENAME</a></li></ul></div>
+<h3>Domains</h3><h4>server (<a href="#domain_server">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_server.getVersion">getVersion</a></li><li><a href="#request_server.shutdown">shutdown</a></li><li><a href="#request_server.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_server.connected">connected</a></li><li><a href="#notification_server.error">error</a></li><li><a href="#notification_server.status">status</a></li></ul></div></div><h4>analysis (<a href="#domain_analysis">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_analysis.getErrors">getErrors</a></li><li><a href="#request_analysis.getHover">getHover</a></li><li><a href="#request_analysis.getLibraryDependencies">getLibraryDependencies</a></li><li><a href="#request_analysis.getNavigation">getNavigation</a></li><li><a href="#request_analysis.getReachableSources">getReachableSources</a></li><li><a href="#request_analysis.reanalyze">reanalyze</a></li><li><a href="#request_analysis.setAnalysisRoots">setAnalysisRoots</a></li><li><a href="#request_analysis.setGeneralSubscriptions">setGeneralSubscriptions</a></li><li><a href="#request_analysis.setPriorityFiles">setPriorityFiles</a></li><li><a href="#request_analysis.setSubscriptions">setSubscriptions</a></li><li><a href="#request_analysis.updateContent">updateContent</a></li><li><a href="#request_analysis.updateOptions">updateOptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_analysis.analyzedFiles">analyzedFiles</a></li><li><a href="#notification_analysis.closingLabels">closingLabels</a></li><li><a href="#notification_analysis.errors">errors</a></li><li><a href="#notification_analysis.flushResults">flushResults</a></li><li><a href="#notification_analysis.folding">folding</a></li><li><a href="#notification_analysis.highlights">highlights</a></li><li><a href="#notification_analysis.implemented">implemented</a></li><li><a href="#notification_analysis.invalidate">invalidate</a></li><li><a href="#notification_analysis.navigation">navigation</a></li><li><a href="#notification_analysis.occurrences">occurrences</a></li><li><a href="#notification_analysis.outline">outline</a></li><li><a href="#notification_analysis.overrides">overrides</a></li></ul></div></div><h4>completion (<a href="#domain_completion">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_completion.getSuggestions">getSuggestions</a></li><li><a href="#request_completion.setSubscriptions">setSubscriptions</a></li><li><a href="#request_completion.registerLibraryPaths">registerLibraryPaths</a></li><li><a href="#request_completion.getSuggestionDetails">getSuggestionDetails</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_completion.results">results</a></li><li><a href="#notification_completion.availableSuggestions">availableSuggestions</a></li></ul></div></div><h4>search (<a href="#domain_search">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_search.findElementReferences">findElementReferences</a></li><li><a href="#request_search.findMemberDeclarations">findMemberDeclarations</a></li><li><a href="#request_search.findMemberReferences">findMemberReferences</a></li><li><a href="#request_search.findTopLevelDeclarations">findTopLevelDeclarations</a></li><li><a href="#request_search.getTypeHierarchy">getTypeHierarchy</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_search.results">results</a></li></ul></div></div><h4>edit (<a href="#domain_edit">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_edit.format">format</a></li><li><a href="#request_edit.getAssists">getAssists</a></li><li><a href="#request_edit.getAvailableRefactorings">getAvailableRefactorings</a></li><li><a href="#request_edit.getFixes">getFixes</a></li><li><a href="#request_edit.getRefactoring">getRefactoring</a></li><li><a href="#request_edit.sortMembers">sortMembers</a></li><li><a href="#request_edit.organizeDirectives">organizeDirectives</a></li></ul></div><h4>execution (<a href="#domain_execution">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_execution.createContext">createContext</a></li><li><a href="#request_execution.deleteContext">deleteContext</a></li><li><a href="#request_execution.getSuggestions">getSuggestions</a></li><li><a href="#request_execution.mapUri">mapUri</a></li><li><a href="#request_execution.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_execution.launchData">launchData</a></li></ul></div></div><h4>diagnostic (<a href="#domain_diagnostic">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_diagnostic.getDiagnostics">getDiagnostics</a></li><li><a href="#request_diagnostic.getServerPort">getServerPort</a></li></ul></div><h3>Types (<a href="#types">↑</a>)</h3><div class="subindex"><ul><li><a href="#type_AddContentOverlay">AddContentOverlay</a></li><li><a href="#type_AnalysisError">AnalysisError</a></li><li><a href="#type_AnalysisErrorFixes">AnalysisErrorFixes</a></li><li><a href="#type_AnalysisErrorSeverity">AnalysisErrorSeverity</a></li><li><a href="#type_AnalysisErrorType">AnalysisErrorType</a></li><li><a href="#type_AnalysisOptions">AnalysisOptions</a></li><li><a href="#type_AnalysisService">AnalysisService</a></li><li><a href="#type_AnalysisStatus">AnalysisStatus</a></li><li><a href="#type_AvailableSuggestion">AvailableSuggestion</a></li><li><a href="#type_AvailableSuggestionRelevanceTag">AvailableSuggestionRelevanceTag</a></li><li><a href="#type_AvailableSuggestionSet">AvailableSuggestionSet</a></li><li><a href="#type_ChangeContentOverlay">ChangeContentOverlay</a></li><li><a href="#type_ClosingLabel">ClosingLabel</a></li><li><a href="#type_CompletionId">CompletionId</a></li><li><a href="#type_CompletionService">CompletionService</a></li><li><a href="#type_CompletionSuggestion">CompletionSuggestion</a></li><li><a href="#type_CompletionSuggestionKind">CompletionSuggestionKind</a></li><li><a href="#type_ContextData">ContextData</a></li><li><a href="#type_Element">Element</a></li><li><a href="#type_ElementDeclaration">ElementDeclaration</a></li><li><a href="#type_ElementKind">ElementKind</a></li><li><a href="#type_ExecutableFile">ExecutableFile</a></li><li><a href="#type_ExecutableKind">ExecutableKind</a></li><li><a href="#type_ExecutionContextId">ExecutionContextId</a></li><li><a href="#type_ExecutionService">ExecutionService</a></li><li><a href="#type_FileKind">FileKind</a></li><li><a href="#type_FilePath">FilePath</a></li><li><a href="#type_FoldingKind">FoldingKind</a></li><li><a href="#type_FoldingRegion">FoldingRegion</a></li><li><a href="#type_GeneralAnalysisService">GeneralAnalysisService</a></li><li><a href="#type_HighlightRegion">HighlightRegion</a></li><li><a href="#type_HighlightRegionType">HighlightRegionType</a></li><li><a href="#type_HoverInformation">HoverInformation</a></li><li><a href="#type_ImplementedClass">ImplementedClass</a></li><li><a href="#type_ImplementedMember">ImplementedMember</a></li><li><a href="#type_ImportedElements">ImportedElements</a></li><li><a href="#type_IncludedSuggestionRelevanceTag">IncludedSuggestionRelevanceTag</a></li><li><a href="#type_IncludedSuggestionSet">IncludedSuggestionSet</a></li><li><a href="#type_KytheEntry">KytheEntry</a></li><li><a href="#type_KytheVName">KytheVName</a></li><li><a href="#type_LibraryPathSet">LibraryPathSet</a></li><li><a href="#type_LinkedEditGroup">LinkedEditGroup</a></li><li><a href="#type_LinkedEditSuggestion">LinkedEditSuggestion</a></li><li><a href="#type_LinkedEditSuggestionKind">LinkedEditSuggestionKind</a></li><li><a href="#type_Location">Location</a></li><li><a href="#type_NavigationRegion">NavigationRegion</a></li><li><a href="#type_NavigationTarget">NavigationTarget</a></li><li><a href="#type_Occurrences">Occurrences</a></li><li><a href="#type_Outline">Outline</a></li><li><a href="#type_OverriddenMember">OverriddenMember</a></li><li><a href="#type_Override">Override</a></li><li><a href="#type_Position">Position</a></li><li><a href="#type_PostfixTemplateDescriptor">PostfixTemplateDescriptor</a></li><li><a href="#type_PubStatus">PubStatus</a></li><li><a href="#type_RefactoringFeedback">RefactoringFeedback</a></li><li><a href="#type_RefactoringKind">RefactoringKind</a></li><li><a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a></li><li><a href="#type_RefactoringMethodParameterKind">RefactoringMethodParameterKind</a></li><li><a href="#type_RefactoringOptions">RefactoringOptions</a></li><li><a href="#type_RefactoringProblem">RefactoringProblem</a></li><li><a href="#type_RefactoringProblemSeverity">RefactoringProblemSeverity</a></li><li><a href="#type_RemoveContentOverlay">RemoveContentOverlay</a></li><li><a href="#type_RequestError">RequestError</a></li><li><a href="#type_RequestErrorCode">RequestErrorCode</a></li><li><a href="#type_RuntimeCompletionExpression">RuntimeCompletionExpression</a></li><li><a href="#type_RuntimeCompletionExpressionType">RuntimeCompletionExpressionType</a></li><li><a href="#type_RuntimeCompletionExpressionTypeKind">RuntimeCompletionExpressionTypeKind</a></li><li><a href="#type_RuntimeCompletionVariable">RuntimeCompletionVariable</a></li><li><a href="#type_SearchId">SearchId</a></li><li><a href="#type_SearchResult">SearchResult</a></li><li><a href="#type_SearchResultKind">SearchResultKind</a></li><li><a href="#type_ServerService">ServerService</a></li><li><a href="#type_SourceChange">SourceChange</a></li><li><a href="#type_SourceEdit">SourceEdit</a></li><li><a href="#type_SourceFileEdit">SourceFileEdit</a></li><li><a href="#type_TypeHierarchyItem">TypeHierarchyItem</a></li></ul></div><h3>Refactorings (<a href="#refactorings">↑</a>)</h3><div class="subindex"><ul><li><a href="#refactoring_CONVERT_GETTER_TO_METHOD">CONVERT_GETTER_TO_METHOD</a></li><li><a href="#refactoring_CONVERT_METHOD_TO_GETTER">CONVERT_METHOD_TO_GETTER</a></li><li><a href="#refactoring_EXTRACT_LOCAL_VARIABLE">EXTRACT_LOCAL_VARIABLE</a></li><li><a href="#refactoring_EXTRACT_METHOD">EXTRACT_METHOD</a></li><li><a href="#refactoring_EXTRACT_WIDGET">EXTRACT_WIDGET</a></li><li><a href="#refactoring_INLINE_LOCAL_VARIABLE">INLINE_LOCAL_VARIABLE</a></li><li><a href="#refactoring_INLINE_METHOD">INLINE_METHOD</a></li><li><a href="#refactoring_MOVE_FILE">MOVE_FILE</a></li><li><a href="#refactoring_RENAME">RENAME</a></li></ul></div>
 
 
 </body></html>
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index e0484bf..116d1e3 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -22,6 +22,9 @@
 const jsonEncoder = const JsonEncoder.withIndent('    ');
 
 class ApplyWorkspaceEditParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ApplyWorkspaceEditParams.canParse, ApplyWorkspaceEditParams.fromJson);
+
   ApplyWorkspaceEditParams(this.label, this.edit) {
     if (edit == null) {
       throw 'edit is required but was not provided';
@@ -52,6 +55,7 @@
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
+        (obj['label'] == null || obj['label'] is String) &&
         obj.containsKey('edit') &&
         WorkspaceEdit.canParse(obj['edit']);
   }
@@ -77,6 +81,9 @@
 }
 
 class ApplyWorkspaceEditResponse implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ApplyWorkspaceEditResponse.canParse, ApplyWorkspaceEditResponse.fromJson);
+
   ApplyWorkspaceEditResponse(this.applied) {
     if (applied == null) {
       throw 'applied is required but was not provided';
@@ -123,6 +130,9 @@
 }
 
 class CancelParams implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(CancelParams.canParse, CancelParams.fromJson);
+
   CancelParams(this.id) {
     if (id == null) {
       throw 'id is required but was not provided';
@@ -172,6 +182,9 @@
 }
 
 class ClientCapabilities implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ClientCapabilities.canParse, ClientCapabilities.fromJson);
+
   ClientCapabilities(this.workspace, this.textDocument, this.experimental);
   static ClientCapabilities fromJson(Map<String, dynamic> json) {
     final workspace = json['workspace'] != null
@@ -208,7 +221,12 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['workspace'] == null ||
+            WorkspaceClientCapabilities.canParse(obj['workspace'])) &&
+        (obj['textDocument'] == null ||
+            TextDocumentClientCapabilities.canParse(obj['textDocument'])) &&
+        (obj['experimental'] == null || true);
   }
 
   @override
@@ -241,6 +259,9 @@
 /// A CodeAction must set either `edit` and/or a `command`. If both are
 /// supplied, the `edit` is applied first, then the `command` is executed.
 class CodeAction implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(CodeAction.canParse, CodeAction.fromJson);
+
   CodeAction(this.title, this.kind, this.diagnostics, this.edit, this.command) {
     if (title == null) {
       throw 'title is required but was not provided';
@@ -300,7 +321,14 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('title') &&
-        obj['title'] is String;
+        obj['title'] is String &&
+        (obj['kind'] == null || CodeActionKind.canParse(obj['kind'])) &&
+        (obj['diagnostics'] == null ||
+            (obj['diagnostics'] is List &&
+                (obj['diagnostics']
+                    .every((item) => Diagnostic.canParse(item))))) &&
+        (obj['edit'] == null || WorkspaceEdit.canParse(obj['edit'])) &&
+        (obj['command'] == null || Command.canParse(obj['command']));
   }
 
   @override
@@ -335,6 +363,9 @@
 /// Contains additional diagnostic information about the context in which a code
 /// action is run.
 class CodeActionContext implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      CodeActionContext.canParse, CodeActionContext.fromJson);
+
   CodeActionContext(this.diagnostics, this.only) {
     if (diagnostics == null) {
       throw 'diagnostics is required but was not provided';
@@ -375,7 +406,10 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('diagnostics') &&
         (obj['diagnostics'] is List &&
-            (obj['diagnostics'].every((item) => Diagnostic.canParse(item))));
+            (obj['diagnostics'].every((item) => Diagnostic.canParse(item)))) &&
+        (obj['only'] == null ||
+            (obj['only'] is List &&
+                (obj['only'].every((item) => CodeActionKind.canParse(item)))));
   }
 
   @override
@@ -474,6 +508,9 @@
 
 /// Code Action options.
 class CodeActionOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      CodeActionOptions.canParse, CodeActionOptions.fromJson);
+
   CodeActionOptions(this.codeActionKinds);
   static CodeActionOptions fromJson(Map<String, dynamic> json) {
     if (CodeActionRegistrationOptions.canParse(json)) {
@@ -501,7 +538,11 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['codeActionKinds'] == null ||
+            (obj['codeActionKinds'] is List &&
+                (obj['codeActionKinds']
+                    .every((item) => CodeActionKind.canParse(item)))));
   }
 
   @override
@@ -527,6 +568,9 @@
 
 /// Params for the CodeActionRequest
 class CodeActionParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      CodeActionParams.canParse, CodeActionParams.fromJson);
+
   CodeActionParams(this.textDocument, this.range, this.context) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -604,6 +648,10 @@
 
 class CodeActionRegistrationOptions
     implements TextDocumentRegistrationOptions, CodeActionOptions, ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      CodeActionRegistrationOptions.canParse,
+      CodeActionRegistrationOptions.fromJson);
+
   CodeActionRegistrationOptions(this.documentSelector, this.codeActionKinds);
   static CodeActionRegistrationOptions fromJson(Map<String, dynamic> json) {
     final documentSelector = json['documentSelector']
@@ -639,9 +687,14 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('documentSelector') &&
-        (obj['documentSelector'] is List &&
-            (obj['documentSelector']
-                .every((item) => DocumentFilter.canParse(item))));
+        (obj['documentSelector'] == null ||
+            (obj['documentSelector'] is List &&
+                (obj['documentSelector']
+                    .every((item) => DocumentFilter.canParse(item))))) &&
+        (obj['codeActionKinds'] == null ||
+            (obj['codeActionKinds'] is List &&
+                (obj['codeActionKinds']
+                    .every((item) => CodeActionKind.canParse(item)))));
   }
 
   @override
@@ -674,6 +727,9 @@
 /// performance reasons the creation of a code lens and resolving should be done
 /// in two stages.
 class CodeLens implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(CodeLens.canParse, CodeLens.fromJson);
+
   CodeLens(this.range, this.command, this.data) {
     if (range == null) {
       throw 'range is required but was not provided';
@@ -713,7 +769,9 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('range') &&
-        Range.canParse(obj['range']);
+        Range.canParse(obj['range']) &&
+        (obj['command'] == null || Command.canParse(obj['command'])) &&
+        (obj['data'] == null || true);
   }
 
   @override
@@ -742,6 +800,9 @@
 
 /// Code Lens options.
 class CodeLensOptions implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(CodeLensOptions.canParse, CodeLensOptions.fromJson);
+
   CodeLensOptions(this.resolveProvider);
   static CodeLensOptions fromJson(Map<String, dynamic> json) {
     final resolveProvider = json['resolveProvider'];
@@ -760,7 +821,8 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['resolveProvider'] == null || obj['resolveProvider'] is bool);
   }
 
   @override
@@ -783,6 +845,9 @@
 }
 
 class CodeLensParams implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(CodeLensParams.canParse, CodeLensParams.fromJson);
+
   CodeLensParams(this.textDocument) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -832,6 +897,10 @@
 
 class CodeLensRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      CodeLensRegistrationOptions.canParse,
+      CodeLensRegistrationOptions.fromJson);
+
   CodeLensRegistrationOptions(this.resolveProvider, this.documentSelector);
   static CodeLensRegistrationOptions fromJson(Map<String, dynamic> json) {
     final resolveProvider = json['resolveProvider'];
@@ -860,10 +929,12 @@
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
+        (obj['resolveProvider'] == null || obj['resolveProvider'] is bool) &&
         obj.containsKey('documentSelector') &&
-        (obj['documentSelector'] is List &&
-            (obj['documentSelector']
-                .every((item) => DocumentFilter.canParse(item))));
+        (obj['documentSelector'] == null ||
+            (obj['documentSelector'] is List &&
+                (obj['documentSelector']
+                    .every((item) => DocumentFilter.canParse(item)))));
   }
 
   @override
@@ -890,6 +961,9 @@
 
 /// Represents a color in RGBA space.
 class Color implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(Color.canParse, Color.fromJson);
+
   Color(this.red, this.green, this.blue, this.alpha) {
     if (red == null) {
       throw 'red is required but was not provided';
@@ -972,6 +1046,9 @@
 }
 
 class ColorInformation implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ColorInformation.canParse, ColorInformation.fromJson);
+
   ColorInformation(this.range, this.color) {
     if (range == null) {
       throw 'range is required but was not provided';
@@ -1028,6 +1105,9 @@
 }
 
 class ColorPresentation implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ColorPresentation.canParse, ColorPresentation.fromJson);
+
   ColorPresentation(this.label, this.textEdit, this.additionalTextEdits) {
     if (label == null) {
       throw 'label is required but was not provided';
@@ -1074,7 +1154,12 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('label') &&
-        obj['label'] is String;
+        obj['label'] is String &&
+        (obj['textEdit'] == null || TextEdit.canParse(obj['textEdit'])) &&
+        (obj['additionalTextEdits'] == null ||
+            (obj['additionalTextEdits'] is List &&
+                (obj['additionalTextEdits']
+                    .every((item) => TextEdit.canParse(item)))));
   }
 
   @override
@@ -1103,6 +1188,9 @@
 }
 
 class ColorPresentationParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ColorPresentationParams.canParse, ColorPresentationParams.fromJson);
+
   ColorPresentationParams(this.textDocument, this.color, this.range) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -1177,6 +1265,9 @@
 
 /// Color provider options.
 class ColorProviderOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ColorProviderOptions.canParse, ColorProviderOptions.fromJson);
+
   static ColorProviderOptions fromJson(Map<String, dynamic> json) {
     return new ColorProviderOptions();
   }
@@ -1209,6 +1300,9 @@
 }
 
 class Command implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(Command.canParse, Command.fromJson);
+
   Command(this.title, this.command, this.arguments) {
     if (title == null) {
       throw 'title is required but was not provided';
@@ -1250,7 +1344,10 @@
         obj.containsKey('title') &&
         obj['title'] is String &&
         obj.containsKey('command') &&
-        obj['command'] is String;
+        obj['command'] is String &&
+        (obj['arguments'] == null ||
+            (obj['arguments'] is List &&
+                (obj['arguments'].every((item) => true))));
   }
 
   @override
@@ -1281,6 +1378,9 @@
 /// Contains additional information about the context in which a completion
 /// request is triggered.
 class CompletionContext implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      CompletionContext.canParse, CompletionContext.fromJson);
+
   CompletionContext(this.triggerKind, this.triggerCharacter) {
     if (triggerKind == null) {
       throw 'triggerKind is required but was not provided';
@@ -1314,7 +1414,8 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('triggerKind') &&
-        obj['triggerKind'] is num;
+        CompletionTriggerKind.canParse(obj['triggerKind']) &&
+        (obj['triggerCharacter'] == null || obj['triggerCharacter'] is String);
   }
 
   @override
@@ -1340,6 +1441,9 @@
 }
 
 class CompletionItem implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(CompletionItem.canParse, CompletionItem.fromJson);
+
   CompletionItem(
       this.label,
       this.kind,
@@ -1544,7 +1648,29 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('label') &&
-        obj['label'] is String;
+        obj['label'] is String &&
+        (obj['kind'] == null || CompletionItemKind.canParse(obj['kind'])) &&
+        (obj['detail'] == null || obj['detail'] is String) &&
+        (obj['documentation'] == null ||
+            (obj['documentation'] is String ||
+                MarkupContent.canParse(obj['documentation']))) &&
+        (obj['deprecated'] == null || obj['deprecated'] is bool) &&
+        (obj['preselect'] == null || obj['preselect'] is bool) &&
+        (obj['sortText'] == null || obj['sortText'] is String) &&
+        (obj['filterText'] == null || obj['filterText'] is String) &&
+        (obj['insertText'] == null || obj['insertText'] is String) &&
+        (obj['insertTextFormat'] == null ||
+            InsertTextFormat.canParse(obj['insertTextFormat'])) &&
+        (obj['textEdit'] == null || TextEdit.canParse(obj['textEdit'])) &&
+        (obj['additionalTextEdits'] == null ||
+            (obj['additionalTextEdits'] is List &&
+                (obj['additionalTextEdits']
+                    .every((item) => TextEdit.canParse(item))))) &&
+        (obj['commitCharacters'] == null ||
+            (obj['commitCharacters'] is List &&
+                (obj['commitCharacters'].every((item) => item is String)))) &&
+        (obj['command'] == null || Command.canParse(obj['command'])) &&
+        (obj['data'] == null || true);
   }
 
   @override
@@ -1599,68 +1725,40 @@
 
 /// The kind of a completion entry.
 class CompletionItemKind {
-  const CompletionItemKind._(this._value);
+  const CompletionItemKind(this._value);
   const CompletionItemKind.fromJson(this._value);
 
   final num _value;
 
   static bool canParse(Object obj) {
-    switch (obj) {
-      case 1:
-      case 2:
-      case 3:
-      case 4:
-      case 5:
-      case 6:
-      case 7:
-      case 8:
-      case 9:
-      case 10:
-      case 11:
-      case 12:
-      case 13:
-      case 14:
-      case 15:
-      case 16:
-      case 17:
-      case 18:
-      case 19:
-      case 20:
-      case 21:
-      case 22:
-      case 23:
-      case 24:
-      case 25:
-        return true;
-    }
-    return false;
+    return obj is num;
   }
 
-  static const Text = const CompletionItemKind._(1);
-  static const Method = const CompletionItemKind._(2);
-  static const Function = const CompletionItemKind._(3);
-  static const Constructor = const CompletionItemKind._(4);
-  static const Field = const CompletionItemKind._(5);
-  static const Variable = const CompletionItemKind._(6);
-  static const Class = const CompletionItemKind._(7);
-  static const Interface = const CompletionItemKind._(8);
-  static const Module = const CompletionItemKind._(9);
-  static const Property = const CompletionItemKind._(10);
-  static const Unit = const CompletionItemKind._(11);
-  static const Value = const CompletionItemKind._(12);
-  static const Enum = const CompletionItemKind._(13);
-  static const Keyword = const CompletionItemKind._(14);
-  static const Snippet = const CompletionItemKind._(15);
-  static const Color = const CompletionItemKind._(16);
-  static const File = const CompletionItemKind._(17);
-  static const Reference = const CompletionItemKind._(18);
-  static const Folder = const CompletionItemKind._(19);
-  static const EnumMember = const CompletionItemKind._(20);
-  static const Constant = const CompletionItemKind._(21);
-  static const Struct = const CompletionItemKind._(22);
-  static const Event = const CompletionItemKind._(23);
-  static const Operator = const CompletionItemKind._(24);
-  static const TypeParameter = const CompletionItemKind._(25);
+  static const Text = const CompletionItemKind(1);
+  static const Method = const CompletionItemKind(2);
+  static const Function = const CompletionItemKind(3);
+  static const Constructor = const CompletionItemKind(4);
+  static const Field = const CompletionItemKind(5);
+  static const Variable = const CompletionItemKind(6);
+  static const Class = const CompletionItemKind(7);
+  static const Interface = const CompletionItemKind(8);
+  static const Module = const CompletionItemKind(9);
+  static const Property = const CompletionItemKind(10);
+  static const Unit = const CompletionItemKind(11);
+  static const Value = const CompletionItemKind(12);
+  static const Enum = const CompletionItemKind(13);
+  static const Keyword = const CompletionItemKind(14);
+  static const Snippet = const CompletionItemKind(15);
+  static const Color = const CompletionItemKind(16);
+  static const File = const CompletionItemKind(17);
+  static const Reference = const CompletionItemKind(18);
+  static const Folder = const CompletionItemKind(19);
+  static const EnumMember = const CompletionItemKind(20);
+  static const Constant = const CompletionItemKind(21);
+  static const Struct = const CompletionItemKind(22);
+  static const Event = const CompletionItemKind(23);
+  static const Operator = const CompletionItemKind(24);
+  static const TypeParameter = const CompletionItemKind(25);
 
   Object toJson() => _value;
 
@@ -1676,6 +1774,9 @@
 /// Represents a collection of completion items ([CompletionItem]) to be
 /// presented in the editor.
 class CompletionList implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(CompletionList.canParse, CompletionList.fromJson);
+
   CompletionList(this.isIncomplete, this.items) {
     if (isIncomplete == null) {
       throw 'isIncomplete is required but was not provided';
@@ -1742,6 +1843,9 @@
 
 /// Completion options.
 class CompletionOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      CompletionOptions.canParse, CompletionOptions.fromJson);
+
   CompletionOptions(this.resolveProvider, this.triggerCharacters);
   static CompletionOptions fromJson(Map<String, dynamic> json) {
     final resolveProvider = json['resolveProvider'];
@@ -1771,7 +1875,11 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['resolveProvider'] == null || obj['resolveProvider'] is bool) &&
+        (obj['triggerCharacters'] == null ||
+            (obj['triggerCharacters'] is List &&
+                (obj['triggerCharacters'].every((item) => item is String))));
   }
 
   @override
@@ -1798,6 +1906,9 @@
 }
 
 class CompletionParams implements TextDocumentPositionParams, ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      CompletionParams.canParse, CompletionParams.fromJson);
+
   CompletionParams(this.context, this.textDocument, this.position) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -1843,6 +1954,8 @@
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
+        (obj['context'] == null ||
+            CompletionContext.canParse(obj['context'])) &&
         obj.containsKey('textDocument') &&
         TextDocumentIdentifier.canParse(obj['textDocument']) &&
         obj.containsKey('position') &&
@@ -1875,6 +1988,10 @@
 
 class CompletionRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      CompletionRegistrationOptions.canParse,
+      CompletionRegistrationOptions.fromJson);
+
   CompletionRegistrationOptions(
       this.triggerCharacters, this.resolveProvider, this.documentSelector);
   static CompletionRegistrationOptions fromJson(Map<String, dynamic> json) {
@@ -1925,10 +2042,15 @@
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
+        (obj['triggerCharacters'] == null ||
+            (obj['triggerCharacters'] is List &&
+                (obj['triggerCharacters'].every((item) => item is String)))) &&
+        (obj['resolveProvider'] == null || obj['resolveProvider'] is bool) &&
         obj.containsKey('documentSelector') &&
-        (obj['documentSelector'] is List &&
-            (obj['documentSelector']
-                .every((item) => DocumentFilter.canParse(item))));
+        (obj['documentSelector'] == null ||
+            (obj['documentSelector'] is List &&
+                (obj['documentSelector']
+                    .every((item) => DocumentFilter.canParse(item)))));
   }
 
   @override
@@ -1997,6 +2119,9 @@
 }
 
 class ConfigurationItem implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ConfigurationItem.canParse, ConfigurationItem.fromJson);
+
   ConfigurationItem(this.scopeUri, this.section);
   static ConfigurationItem fromJson(Map<String, dynamic> json) {
     final scopeUri = json['scopeUri'];
@@ -2022,7 +2147,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['scopeUri'] == null || obj['scopeUri'] is String) &&
+        (obj['section'] == null || obj['section'] is String);
   }
 
   @override
@@ -2046,6 +2173,9 @@
 }
 
 class ConfigurationParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ConfigurationParams.canParse, ConfigurationParams.fromJson);
+
   ConfigurationParams(this.items) {
     if (items == null) {
       throw 'items is required but was not provided';
@@ -2097,6 +2227,9 @@
 
 /// Create file operation
 class CreateFile implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(CreateFile.canParse, CreateFile.fromJson);
+
   CreateFile(this.kind, this.uri, this.options) {
     if (kind == null) {
       throw 'kind is required but was not provided';
@@ -2138,7 +2271,8 @@
         obj.containsKey('kind') &&
         obj['kind'] is String &&
         obj.containsKey('uri') &&
-        obj['uri'] is String;
+        obj['uri'] is String &&
+        (obj['options'] == null || CreateFileOptions.canParse(obj['options']));
   }
 
   @override
@@ -2167,6 +2301,9 @@
 
 /// Options to create a file.
 class CreateFileOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      CreateFileOptions.canParse, CreateFileOptions.fromJson);
+
   CreateFileOptions(this.overwrite, this.ignoreIfExists);
   static CreateFileOptions fromJson(Map<String, dynamic> json) {
     final overwrite = json['overwrite'];
@@ -2192,7 +2329,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['overwrite'] == null || obj['overwrite'] is bool) &&
+        (obj['ignoreIfExists'] == null || obj['ignoreIfExists'] is bool);
   }
 
   @override
@@ -2219,6 +2358,9 @@
 
 /// Delete file operation
 class DeleteFile implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(DeleteFile.canParse, DeleteFile.fromJson);
+
   DeleteFile(this.kind, this.uri, this.options) {
     if (kind == null) {
       throw 'kind is required but was not provided';
@@ -2260,7 +2402,8 @@
         obj.containsKey('kind') &&
         obj['kind'] is String &&
         obj.containsKey('uri') &&
-        obj['uri'] is String;
+        obj['uri'] is String &&
+        (obj['options'] == null || DeleteFileOptions.canParse(obj['options']));
   }
 
   @override
@@ -2289,6 +2432,9 @@
 
 /// Delete file options
 class DeleteFileOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DeleteFileOptions.canParse, DeleteFileOptions.fromJson);
+
   DeleteFileOptions(this.recursive, this.ignoreIfNotExists);
   static DeleteFileOptions fromJson(Map<String, dynamic> json) {
     final recursive = json['recursive'];
@@ -2314,7 +2460,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['recursive'] == null || obj['recursive'] is bool) &&
+        (obj['ignoreIfNotExists'] == null || obj['ignoreIfNotExists'] is bool);
   }
 
   @override
@@ -2340,6 +2488,9 @@
 }
 
 class Diagnostic implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(Diagnostic.canParse, Diagnostic.fromJson);
+
   Diagnostic(this.range, this.severity, this.code, this.source, this.message,
       this.relatedInformation) {
     if (range == null) {
@@ -2411,8 +2562,16 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('range') &&
         Range.canParse(obj['range']) &&
+        (obj['severity'] == null ||
+            DiagnosticSeverity.canParse(obj['severity'])) &&
+        (obj['code'] == null || obj['code'] is String) &&
+        (obj['source'] == null || obj['source'] is String) &&
         obj.containsKey('message') &&
-        obj['message'] is String;
+        obj['message'] is String &&
+        (obj['relatedInformation'] == null ||
+            (obj['relatedInformation'] is List &&
+                (obj['relatedInformation'].every(
+                    (item) => DiagnosticRelatedInformation.canParse(item)))));
   }
 
   @override
@@ -2454,6 +2613,10 @@
 /// should be used to point to code locations that cause or related to a
 /// diagnostics, e.g when duplicating a symbol in a scope.
 class DiagnosticRelatedInformation implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DiagnosticRelatedInformation.canParse,
+      DiagnosticRelatedInformation.fromJson);
+
   DiagnosticRelatedInformation(this.location, this.message) {
     if (location == null) {
       throw 'location is required but was not provided';
@@ -2513,33 +2676,26 @@
 }
 
 class DiagnosticSeverity {
-  const DiagnosticSeverity._(this._value);
+  const DiagnosticSeverity(this._value);
   const DiagnosticSeverity.fromJson(this._value);
 
   final num _value;
 
   static bool canParse(Object obj) {
-    switch (obj) {
-      case 1:
-      case 2:
-      case 3:
-      case 4:
-        return true;
-    }
-    return false;
+    return obj is num;
   }
 
   /// Reports an error.
-  static const Error = const DiagnosticSeverity._(1);
+  static const Error = const DiagnosticSeverity(1);
 
   /// Reports a warning.
-  static const Warning = const DiagnosticSeverity._(2);
+  static const Warning = const DiagnosticSeverity(2);
 
   /// Reports an information.
-  static const Information = const DiagnosticSeverity._(3);
+  static const Information = const DiagnosticSeverity(3);
 
   /// Reports a hint.
-  static const Hint = const DiagnosticSeverity._(4);
+  static const Hint = const DiagnosticSeverity(4);
 
   Object toJson() => _value;
 
@@ -2553,6 +2709,10 @@
 }
 
 class DidChangeConfigurationParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DidChangeConfigurationParams.canParse,
+      DidChangeConfigurationParams.fromJson);
+
   DidChangeConfigurationParams(this.settings);
   static DidChangeConfigurationParams fromJson(Map<String, dynamic> json) {
     final settings = json['settings'];
@@ -2569,7 +2729,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic> && obj.containsKey('settings') && true;
+    return obj is Map<String, dynamic> &&
+        obj.containsKey('settings') &&
+        (obj['settings'] == null || true);
   }
 
   @override
@@ -2592,6 +2754,10 @@
 }
 
 class DidChangeTextDocumentParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DidChangeTextDocumentParams.canParse,
+      DidChangeTextDocumentParams.fromJson);
+
   DidChangeTextDocumentParams(this.textDocument, this.contentChanges) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -2668,6 +2834,10 @@
 }
 
 class DidChangeWatchedFilesParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DidChangeWatchedFilesParams.canParse,
+      DidChangeWatchedFilesParams.fromJson);
+
   DidChangeWatchedFilesParams(this.changes) {
     if (changes == null) {
       throw 'changes is required but was not provided';
@@ -2722,6 +2892,10 @@
 /// Describe options to be used when registering for text document change
 /// events.
 class DidChangeWatchedFilesRegistrationOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DidChangeWatchedFilesRegistrationOptions.canParse,
+      DidChangeWatchedFilesRegistrationOptions.fromJson);
+
   DidChangeWatchedFilesRegistrationOptions(this.watchers) {
     if (watchers == null) {
       throw 'watchers is required but was not provided';
@@ -2776,6 +2950,10 @@
 }
 
 class DidChangeWorkspaceFoldersParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DidChangeWorkspaceFoldersParams.canParse,
+      DidChangeWorkspaceFoldersParams.fromJson);
+
   DidChangeWorkspaceFoldersParams(this.event) {
     if (event == null) {
       throw 'event is required but was not provided';
@@ -2823,6 +3001,9 @@
 }
 
 class DidCloseTextDocumentParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DidCloseTextDocumentParams.canParse, DidCloseTextDocumentParams.fromJson);
+
   DidCloseTextDocumentParams(this.textDocument) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -2871,6 +3052,9 @@
 }
 
 class DidOpenTextDocumentParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DidOpenTextDocumentParams.canParse, DidOpenTextDocumentParams.fromJson);
+
   DidOpenTextDocumentParams(this.textDocument) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -2919,6 +3103,9 @@
 }
 
 class DidSaveTextDocumentParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DidSaveTextDocumentParams.canParse, DidSaveTextDocumentParams.fromJson);
+
   DidSaveTextDocumentParams(this.textDocument, this.text) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -2952,7 +3139,8 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('textDocument') &&
-        TextDocumentIdentifier.canParse(obj['textDocument']);
+        TextDocumentIdentifier.canParse(obj['textDocument']) &&
+        (obj['text'] == null || obj['text'] is String);
   }
 
   @override
@@ -2976,6 +3164,9 @@
 }
 
 class DocumentFilter implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(DocumentFilter.canParse, DocumentFilter.fromJson);
+
   DocumentFilter(this.language, this.scheme, this.pattern);
   static DocumentFilter fromJson(Map<String, dynamic> json) {
     final language = json['language'];
@@ -3020,7 +3211,10 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['language'] == null || obj['language'] is String) &&
+        (obj['scheme'] == null || obj['scheme'] is String) &&
+        (obj['pattern'] == null || obj['pattern'] is String);
   }
 
   @override
@@ -3048,6 +3242,9 @@
 }
 
 class DocumentFormattingParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DocumentFormattingParams.canParse, DocumentFormattingParams.fromJson);
+
   DocumentFormattingParams(this.textDocument, this.options) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -3115,6 +3312,9 @@
 /// special attention. Usually a document highlight is visualized by changing
 /// the background color of its range.
 class DocumentHighlight implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DocumentHighlight.canParse, DocumentHighlight.fromJson);
+
   DocumentHighlight(this.range, this.kind) {
     if (range == null) {
       throw 'range is required but was not provided';
@@ -3146,7 +3346,8 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('range') &&
-        Range.canParse(obj['range']);
+        Range.canParse(obj['range']) &&
+        (obj['kind'] == null || DocumentHighlightKind.canParse(obj['kind']));
   }
 
   @override
@@ -3171,29 +3372,23 @@
 
 /// A document highlight kind.
 class DocumentHighlightKind {
-  const DocumentHighlightKind._(this._value);
+  const DocumentHighlightKind(this._value);
   const DocumentHighlightKind.fromJson(this._value);
 
   final num _value;
 
   static bool canParse(Object obj) {
-    switch (obj) {
-      case 1:
-      case 2:
-      case 3:
-        return true;
-    }
-    return false;
+    return obj is num;
   }
 
   /// A textual occurrence.
-  static const Text = const DocumentHighlightKind._(1);
+  static const Text = const DocumentHighlightKind(1);
 
   /// Read-access of a symbol, like reading a variable.
-  static const Read = const DocumentHighlightKind._(2);
+  static const Read = const DocumentHighlightKind(2);
 
   /// Write-access of a symbol, like writing to a variable.
-  static const Write = const DocumentHighlightKind._(3);
+  static const Write = const DocumentHighlightKind(3);
 
   Object toJson() => _value;
 
@@ -3209,6 +3404,9 @@
 /// A document link is a range in a text document that links to an internal or
 /// external resource, like another text document or a web site.
 class DocumentLink implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(DocumentLink.canParse, DocumentLink.fromJson);
+
   DocumentLink(this.range, this.target, this.data) {
     if (range == null) {
       throw 'range is required but was not provided';
@@ -3246,7 +3444,9 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('range') &&
-        Range.canParse(obj['range']);
+        Range.canParse(obj['range']) &&
+        (obj['target'] == null || obj['target'] is String) &&
+        (obj['data'] == null || true);
   }
 
   @override
@@ -3275,6 +3475,9 @@
 
 /// Document link options.
 class DocumentLinkOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DocumentLinkOptions.canParse, DocumentLinkOptions.fromJson);
+
   DocumentLinkOptions(this.resolveProvider);
   static DocumentLinkOptions fromJson(Map<String, dynamic> json) {
     final resolveProvider = json['resolveProvider'];
@@ -3293,7 +3496,8 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['resolveProvider'] == null || obj['resolveProvider'] is bool);
   }
 
   @override
@@ -3316,6 +3520,9 @@
 }
 
 class DocumentLinkParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DocumentLinkParams.canParse, DocumentLinkParams.fromJson);
+
   DocumentLinkParams(this.textDocument) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -3365,6 +3572,10 @@
 
 class DocumentLinkRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DocumentLinkRegistrationOptions.canParse,
+      DocumentLinkRegistrationOptions.fromJson);
+
   DocumentLinkRegistrationOptions(this.resolveProvider, this.documentSelector);
   static DocumentLinkRegistrationOptions fromJson(Map<String, dynamic> json) {
     final resolveProvider = json['resolveProvider'];
@@ -3394,10 +3605,12 @@
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
+        (obj['resolveProvider'] == null || obj['resolveProvider'] is bool) &&
         obj.containsKey('documentSelector') &&
-        (obj['documentSelector'] is List &&
-            (obj['documentSelector']
-                .every((item) => DocumentFilter.canParse(item))));
+        (obj['documentSelector'] == null ||
+            (obj['documentSelector'] is List &&
+                (obj['documentSelector']
+                    .every((item) => DocumentFilter.canParse(item)))));
   }
 
   @override
@@ -3424,6 +3637,10 @@
 
 /// Format document on type options.
 class DocumentOnTypeFormattingOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DocumentOnTypeFormattingOptions.canParse,
+      DocumentOnTypeFormattingOptions.fromJson);
+
   DocumentOnTypeFormattingOptions(
       this.firstTriggerCharacter, this.moreTriggerCharacter) {
     if (firstTriggerCharacter == null) {
@@ -3459,7 +3676,10 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('firstTriggerCharacter') &&
-        obj['firstTriggerCharacter'] is String;
+        obj['firstTriggerCharacter'] is String &&
+        (obj['moreTriggerCharacter'] == null ||
+            (obj['moreTriggerCharacter'] is List &&
+                (obj['moreTriggerCharacter'].every((item) => item is String))));
   }
 
   @override
@@ -3486,6 +3706,10 @@
 }
 
 class DocumentOnTypeFormattingParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DocumentOnTypeFormattingParams.canParse,
+      DocumentOnTypeFormattingParams.fromJson);
+
   DocumentOnTypeFormattingParams(
       this.textDocument, this.position, this.ch, this.options) {
     if (textDocument == null) {
@@ -3579,6 +3803,10 @@
 
 class DocumentOnTypeFormattingRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DocumentOnTypeFormattingRegistrationOptions.canParse,
+      DocumentOnTypeFormattingRegistrationOptions.fromJson);
+
   DocumentOnTypeFormattingRegistrationOptions(this.firstTriggerCharacter,
       this.moreTriggerCharacter, this.documentSelector) {
     if (firstTriggerCharacter == null) {
@@ -3625,10 +3853,15 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('firstTriggerCharacter') &&
         obj['firstTriggerCharacter'] is String &&
+        (obj['moreTriggerCharacter'] == null ||
+            (obj['moreTriggerCharacter'] is List &&
+                (obj['moreTriggerCharacter']
+                    .every((item) => item is String)))) &&
         obj.containsKey('documentSelector') &&
-        (obj['documentSelector'] is List &&
-            (obj['documentSelector']
-                .every((item) => DocumentFilter.canParse(item))));
+        (obj['documentSelector'] == null ||
+            (obj['documentSelector'] is List &&
+                (obj['documentSelector']
+                    .every((item) => DocumentFilter.canParse(item)))));
   }
 
   @override
@@ -3657,6 +3890,10 @@
 }
 
 class DocumentRangeFormattingParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DocumentRangeFormattingParams.canParse,
+      DocumentRangeFormattingParams.fromJson);
+
   DocumentRangeFormattingParams(this.textDocument, this.range, this.options) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -3737,6 +3974,9 @@
 /// have two ranges: one that encloses its definition and one that points to its
 /// most interesting range, e.g. the range of an identifier.
 class DocumentSymbol implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(DocumentSymbol.canParse, DocumentSymbol.fromJson);
+
   DocumentSymbol(this.name, this.detail, this.kind, this.deprecated, this.range,
       this.selectionRange, this.children) {
     if (name == null) {
@@ -3820,12 +4060,18 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('name') &&
         obj['name'] is String &&
+        (obj['detail'] == null || obj['detail'] is String) &&
         obj.containsKey('kind') &&
         SymbolKind.canParse(obj['kind']) &&
+        (obj['deprecated'] == null || obj['deprecated'] is bool) &&
         obj.containsKey('range') &&
         Range.canParse(obj['range']) &&
         obj.containsKey('selectionRange') &&
-        Range.canParse(obj['selectionRange']);
+        Range.canParse(obj['selectionRange']) &&
+        (obj['children'] == null ||
+            (obj['children'] is List &&
+                (obj['children']
+                    .every((item) => DocumentSymbol.canParse(item)))));
   }
 
   @override
@@ -3862,6 +4108,9 @@
 }
 
 class DocumentSymbolParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      DocumentSymbolParams.canParse, DocumentSymbolParams.fromJson);
+
   DocumentSymbolParams(this.textDocument) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -3947,6 +4196,9 @@
 
 /// Execute command options.
 class ExecuteCommandOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ExecuteCommandOptions.canParse, ExecuteCommandOptions.fromJson);
+
   ExecuteCommandOptions(this.commands) {
     if (commands == null) {
       throw 'commands is required but was not provided';
@@ -3997,6 +4249,9 @@
 }
 
 class ExecuteCommandParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ExecuteCommandParams.canParse, ExecuteCommandParams.fromJson);
+
   ExecuteCommandParams(this.command, this.arguments) {
     if (command == null) {
       throw 'command is required but was not provided';
@@ -4028,7 +4283,10 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('command') &&
-        obj['command'] is String;
+        obj['command'] is String &&
+        (obj['arguments'] == null ||
+            (obj['arguments'] is List &&
+                (obj['arguments'].every((item) => true))));
   }
 
   @override
@@ -4056,6 +4314,10 @@
 
 /// Execute command registration options.
 class ExecuteCommandRegistrationOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ExecuteCommandRegistrationOptions.canParse,
+      ExecuteCommandRegistrationOptions.fromJson);
+
   ExecuteCommandRegistrationOptions(this.commands) {
     if (commands == null) {
       throw 'commands is required but was not provided';
@@ -4154,29 +4416,23 @@
 
 /// The file event type.
 class FileChangeType {
-  const FileChangeType._(this._value);
+  const FileChangeType(this._value);
   const FileChangeType.fromJson(this._value);
 
   final num _value;
 
   static bool canParse(Object obj) {
-    switch (obj) {
-      case 1:
-      case 2:
-      case 3:
-        return true;
-    }
-    return false;
+    return obj is num;
   }
 
   /// The file got created.
-  static const Created = const FileChangeType._(1);
+  static const Created = const FileChangeType(1);
 
   /// The file got changed.
-  static const Changed = const FileChangeType._(2);
+  static const Changed = const FileChangeType(2);
 
   /// The file got deleted.
-  static const Deleted = const FileChangeType._(3);
+  static const Deleted = const FileChangeType(3);
 
   Object toJson() => _value;
 
@@ -4191,6 +4447,9 @@
 
 /// An event describing a file change.
 class FileEvent implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(FileEvent.canParse, FileEvent.fromJson);
+
   FileEvent(this.uri, this.type) {
     if (uri == null) {
       throw 'uri is required but was not provided';
@@ -4247,6 +4506,9 @@
 }
 
 class FileSystemWatcher implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      FileSystemWatcher.canParse, FileSystemWatcher.fromJson);
+
   FileSystemWatcher(this.globPattern, this.kind) {
     if (globPattern == null) {
       throw 'globPattern is required but was not provided';
@@ -4290,7 +4552,8 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('globPattern') &&
-        obj['globPattern'] is String;
+        obj['globPattern'] is String &&
+        (obj['kind'] == null || WatchKind.canParse(obj['kind']));
   }
 
   @override
@@ -4315,6 +4578,9 @@
 
 /// Represents a folding range.
 class FoldingRange implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(FoldingRange.canParse, FoldingRange.fromJson);
+
   FoldingRange(this.startLine, this.startCharacter, this.endLine,
       this.endCharacter, this.kind) {
     if (startLine == null) {
@@ -4377,8 +4643,11 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('startLine') &&
         obj['startLine'] is num &&
+        (obj['startCharacter'] == null || obj['startCharacter'] is num) &&
         obj.containsKey('endLine') &&
-        obj['endLine'] is num;
+        obj['endLine'] is num &&
+        (obj['endCharacter'] == null || obj['endCharacter'] is num) &&
+        (obj['kind'] == null || FoldingRangeKind.canParse(obj['kind']));
   }
 
   @override
@@ -4411,29 +4680,23 @@
 
 /// Enum of known range kinds
 class FoldingRangeKind {
-  const FoldingRangeKind._(this._value);
+  const FoldingRangeKind(this._value);
   const FoldingRangeKind.fromJson(this._value);
 
   final String _value;
 
   static bool canParse(Object obj) {
-    switch (obj) {
-      case r'comment':
-      case r'imports':
-      case r'region':
-        return true;
-    }
-    return false;
+    return obj is String;
   }
 
   /// Folding range for a comment
-  static const Comment = const FoldingRangeKind._(r'comment');
+  static const Comment = const FoldingRangeKind(r'comment');
 
   /// Folding range for a imports or includes
-  static const Imports = const FoldingRangeKind._(r'imports');
+  static const Imports = const FoldingRangeKind(r'imports');
 
   /// Folding range for a region (e.g. `#region`)
-  static const Region = const FoldingRangeKind._(r'region');
+  static const Region = const FoldingRangeKind(r'region');
 
   Object toJson() => _value;
 
@@ -4447,6 +4710,9 @@
 }
 
 class FoldingRangeParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      FoldingRangeParams.canParse, FoldingRangeParams.fromJson);
+
   FoldingRangeParams(this.textDocument) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -4496,6 +4762,10 @@
 
 /// Folding range provider options.
 class FoldingRangeProviderOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      FoldingRangeProviderOptions.canParse,
+      FoldingRangeProviderOptions.fromJson);
+
   static FoldingRangeProviderOptions fromJson(Map<String, dynamic> json) {
     return new FoldingRangeProviderOptions();
   }
@@ -4529,6 +4799,9 @@
 
 /// Value-object describing what options formatting should use.
 class FormattingOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      FormattingOptions.canParse, FormattingOptions.fromJson);
+
   FormattingOptions(this.tabSize, this.insertSpaces) {
     if (tabSize == null) {
       throw 'tabSize is required but was not provided';
@@ -4590,6 +4863,9 @@
 
 /// The result of a hover request.
 class Hover implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(Hover.canParse, Hover.fromJson);
+
   Hover(this.contents, this.range) {
     if (contents == null) {
       throw 'contents is required but was not provided';
@@ -4627,7 +4903,9 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('contents') &&
-        (obj['contents'] is String || MarkupContent.canParse(obj['contents']));
+        (obj['contents'] is String ||
+            MarkupContent.canParse(obj['contents'])) &&
+        (obj['range'] == null || Range.canParse(obj['range']));
   }
 
   @override
@@ -4651,6 +4929,9 @@
 }
 
 class InitializeParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      InitializeParams.canParse, InitializeParams.fromJson);
+
   InitializeParams(
       this.processId,
       this.rootPath,
@@ -4736,11 +5017,18 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('processId') &&
-        obj['processId'] is num &&
+        (obj['processId'] == null || obj['processId'] is num) &&
+        (obj['rootPath'] == null || obj['rootPath'] is String) &&
         obj.containsKey('rootUri') &&
-        obj['rootUri'] is String &&
+        (obj['rootUri'] == null || obj['rootUri'] is String) &&
+        (obj['initializationOptions'] == null || true) &&
         obj.containsKey('capabilities') &&
-        ClientCapabilities.canParse(obj['capabilities']);
+        ClientCapabilities.canParse(obj['capabilities']) &&
+        (obj['trace'] == null || obj['trace'] is String) &&
+        (obj['workspaceFolders'] == null ||
+            (obj['workspaceFolders'] is List &&
+                (obj['workspaceFolders']
+                    .every((item) => WorkspaceFolder.canParse(item)))));
   }
 
   @override
@@ -4777,6 +5065,9 @@
 }
 
 class InitializeResult implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      InitializeResult.canParse, InitializeResult.fromJson);
+
   InitializeResult(this.capabilities) {
     if (capabilities == null) {
       throw 'capabilities is required but was not provided';
@@ -4825,6 +5116,9 @@
 }
 
 class InitializedParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      InitializedParams.canParse, InitializedParams.fromJson);
+
   static InitializedParams fromJson(Map<String, dynamic> json) {
     return new InitializedParams();
   }
@@ -4896,6 +5190,9 @@
 }
 
 class Location implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(Location.canParse, Location.fromJson);
+
   Location(this.uri, this.range) {
     if (uri == null) {
       throw 'uri is required but was not provided';
@@ -4949,6 +5246,9 @@
 }
 
 class LocationLink implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(LocationLink.canParse, LocationLink.fromJson);
+
   LocationLink(this.originSelectionRange, this.targetUri, this.targetRange,
       this.targetSelectionRange) {
     if (targetUri == null) {
@@ -5012,6 +5312,8 @@
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
+        (obj['originSelectionRange'] == null ||
+            Range.canParse(obj['originSelectionRange'])) &&
         obj.containsKey('targetUri') &&
         obj['targetUri'] is String &&
         obj.containsKey('targetRange') &&
@@ -5047,6 +5349,9 @@
 }
 
 class LogMessageParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      LogMessageParams.canParse, LogMessageParams.fromJson);
+
   LogMessageParams(this.type, this.message) {
     if (type == null) {
       throw 'type is required but was not provided';
@@ -5127,6 +5432,9 @@
 /// *Please Note* that clients might sanitize the return markdown. A client
 /// could decide to remove HTML from the markdown to avoid script execution.
 class MarkupContent implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(MarkupContent.canParse, MarkupContent.fromJson);
+
   MarkupContent(this.kind, this.value) {
     if (kind == null) {
       throw 'kind is required but was not provided';
@@ -5158,7 +5466,7 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('kind') &&
-        obj['kind'] is String &&
+        MarkupKind.canParse(obj['kind']) &&
         obj.containsKey('value') &&
         obj['value'] is String;
   }
@@ -5221,6 +5529,9 @@
 }
 
 class Message implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(Message.canParse, Message.fromJson);
+
   Message(this.jsonrpc) {
     if (jsonrpc == null) {
       throw 'jsonrpc is required but was not provided';
@@ -5275,6 +5586,9 @@
 }
 
 class MessageActionItem implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      MessageActionItem.canParse, MessageActionItem.fromJson);
+
   MessageActionItem(this.title) {
     if (title == null) {
       throw 'title is required but was not provided';
@@ -5320,33 +5634,26 @@
 }
 
 class MessageType {
-  const MessageType._(this._value);
+  const MessageType(this._value);
   const MessageType.fromJson(this._value);
 
   final num _value;
 
   static bool canParse(Object obj) {
-    switch (obj) {
-      case 1:
-      case 2:
-      case 3:
-      case 4:
-        return true;
-    }
-    return false;
+    return obj is num;
   }
 
   /// An error message.
-  static const Error = const MessageType._(1);
+  static const Error = const MessageType(1);
 
   /// A warning message.
-  static const Warning = const MessageType._(2);
+  static const Warning = const MessageType(2);
 
   /// An information message.
-  static const Info = const MessageType._(3);
+  static const Info = const MessageType(3);
 
   /// A log message.
-  static const Log = const MessageType._(4);
+  static const Log = const MessageType(4);
 
   Object toJson() => _value;
 
@@ -5550,6 +5857,9 @@
 }
 
 class NotificationMessage implements Message, IncomingMessage, ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      NotificationMessage.canParse, NotificationMessage.fromJson);
+
   NotificationMessage(this.method, this.params, this.jsonrpc) {
     if (method == null) {
       throw 'method is required but was not provided';
@@ -5589,6 +5899,7 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('method') &&
         Method.canParse(obj['method']) &&
+        (obj['params'] == null || true) &&
         obj.containsKey('jsonrpc') &&
         obj['jsonrpc'] is String;
   }
@@ -5620,6 +5931,9 @@
 /// Represents a parameter of a callable-signature. A parameter can have a label
 /// and a doc-comment.
 class ParameterInformation implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ParameterInformation.canParse, ParameterInformation.fromJson);
+
   ParameterInformation(this.label, this.documentation) {
     if (label == null) {
       throw 'label is required but was not provided';
@@ -5668,7 +5982,10 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('label') &&
-        obj['label'] is String;
+        obj['label'] is String &&
+        (obj['documentation'] == null ||
+            (obj['documentation'] is String ||
+                MarkupContent.canParse(obj['documentation'])));
   }
 
   @override
@@ -5694,6 +6011,9 @@
 }
 
 class Position implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(Position.canParse, Position.fromJson);
+
   Position(this.line, this.character) {
     if (line == null) {
       throw 'line is required but was not provided';
@@ -5756,6 +6076,9 @@
 }
 
 class PublishDiagnosticsParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      PublishDiagnosticsParams.canParse, PublishDiagnosticsParams.fromJson);
+
   PublishDiagnosticsParams(this.uri, this.diagnostics) {
     if (uri == null) {
       throw 'uri is required but was not provided';
@@ -5820,6 +6143,9 @@
 }
 
 class Range implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(Range.canParse, Range.fromJson);
+
   Range(this.start, this.end) {
     if (start == null) {
       throw 'start is required but was not provided';
@@ -5877,6 +6203,9 @@
 }
 
 class RangeAndPlaceholder implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      RangeAndPlaceholder.canParse, RangeAndPlaceholder.fromJson);
+
   RangeAndPlaceholder(this.range, this.placeholder) {
     if (range == null) {
       throw 'range is required but was not provided';
@@ -5931,6 +6260,9 @@
 }
 
 class ReferenceContext implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ReferenceContext.canParse, ReferenceContext.fromJson);
+
   ReferenceContext(this.includeDeclaration) {
     if (includeDeclaration == null) {
       throw 'includeDeclaration is required but was not provided';
@@ -5977,6 +6309,9 @@
 }
 
 class ReferenceParams implements TextDocumentPositionParams, ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(ReferenceParams.canParse, ReferenceParams.fromJson);
+
   ReferenceParams(this.context, this.textDocument, this.position) {
     if (context == null) {
       throw 'context is required but was not provided';
@@ -6055,6 +6390,9 @@
 
 /// General parameters to register for a capability.
 class Registration implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(Registration.canParse, Registration.fromJson);
+
   Registration(this.id, this.method, this.registerOptions) {
     if (id == null) {
       throw 'id is required but was not provided';
@@ -6095,7 +6433,8 @@
         obj.containsKey('id') &&
         obj['id'] is String &&
         obj.containsKey('method') &&
-        obj['method'] is String;
+        obj['method'] is String &&
+        (obj['registerOptions'] == null || true);
   }
 
   @override
@@ -6123,6 +6462,9 @@
 }
 
 class RegistrationParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      RegistrationParams.canParse, RegistrationParams.fromJson);
+
   RegistrationParams(this.registrations) {
     if (registrations == null) {
       throw 'registrations is required but was not provided';
@@ -6176,6 +6518,9 @@
 
 /// Rename file operation
 class RenameFile implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(RenameFile.canParse, RenameFile.fromJson);
+
   RenameFile(this.kind, this.oldUri, this.newUri, this.options) {
     if (kind == null) {
       throw 'kind is required but was not provided';
@@ -6227,7 +6572,8 @@
         obj.containsKey('oldUri') &&
         obj['oldUri'] is String &&
         obj.containsKey('newUri') &&
-        obj['newUri'] is String;
+        obj['newUri'] is String &&
+        (obj['options'] == null || RenameFileOptions.canParse(obj['options']));
   }
 
   @override
@@ -6258,6 +6604,9 @@
 
 /// Rename file options
 class RenameFileOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      RenameFileOptions.canParse, RenameFileOptions.fromJson);
+
   RenameFileOptions(this.overwrite, this.ignoreIfExists);
   static RenameFileOptions fromJson(Map<String, dynamic> json) {
     final overwrite = json['overwrite'];
@@ -6283,7 +6632,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['overwrite'] == null || obj['overwrite'] is bool) &&
+        (obj['ignoreIfExists'] == null || obj['ignoreIfExists'] is bool);
   }
 
   @override
@@ -6310,6 +6661,9 @@
 
 /// Rename options
 class RenameOptions implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(RenameOptions.canParse, RenameOptions.fromJson);
+
   RenameOptions(this.prepareProvider);
   static RenameOptions fromJson(Map<String, dynamic> json) {
     final prepareProvider = json['prepareProvider'];
@@ -6328,7 +6682,8 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['prepareProvider'] == null || obj['prepareProvider'] is bool);
   }
 
   @override
@@ -6351,6 +6706,9 @@
 }
 
 class RenameParams implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(RenameParams.canParse, RenameParams.fromJson);
+
   RenameParams(this.textDocument, this.position, this.newName) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -6429,6 +6787,9 @@
 
 class RenameRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      RenameRegistrationOptions.canParse, RenameRegistrationOptions.fromJson);
+
   RenameRegistrationOptions(this.prepareProvider, this.documentSelector);
   static RenameRegistrationOptions fromJson(Map<String, dynamic> json) {
     final prepareProvider = json['prepareProvider'];
@@ -6457,10 +6818,12 @@
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
+        (obj['prepareProvider'] == null || obj['prepareProvider'] is bool) &&
         obj.containsKey('documentSelector') &&
-        (obj['documentSelector'] is List &&
-            (obj['documentSelector']
-                .every((item) => DocumentFilter.canParse(item))));
+        (obj['documentSelector'] == null ||
+            (obj['documentSelector'] is List &&
+                (obj['documentSelector']
+                    .every((item) => DocumentFilter.canParse(item)))));
   }
 
   @override
@@ -6486,6 +6849,9 @@
 }
 
 class RequestMessage implements Message, IncomingMessage, ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(RequestMessage.canParse, RequestMessage.fromJson);
+
   RequestMessage(this.id, this.method, this.params, this.jsonrpc) {
     if (id == null) {
       throw 'id is required but was not provided';
@@ -6538,6 +6904,7 @@
         (obj['id'] is num || obj['id'] is String) &&
         obj.containsKey('method') &&
         Method.canParse(obj['method']) &&
+        (obj['params'] == null || true) &&
         obj.containsKey('jsonrpc') &&
         obj['jsonrpc'] is String;
   }
@@ -6605,6 +6972,9 @@
 }
 
 class ResponseError<D> implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(ResponseError.canParse, ResponseError.fromJson);
+
   ResponseError(this.code, this.message, this.data) {
     if (code == null) {
       throw 'code is required but was not provided';
@@ -6647,7 +7017,8 @@
         obj.containsKey('code') &&
         ErrorCodes.canParse(obj['code']) &&
         obj.containsKey('message') &&
-        obj['message'] is String;
+        obj['message'] is String &&
+        (obj['data'] == null || obj['data'] is String);
   }
 
   @override
@@ -6675,6 +7046,9 @@
 }
 
 class ResponseMessage implements Message, ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(ResponseMessage.canParse, ResponseMessage.fromJson);
+
   ResponseMessage(this.id, this.result, this.error, this.jsonrpc) {
     if (jsonrpc == null) {
       throw 'jsonrpc is required but was not provided';
@@ -6724,7 +7098,9 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('id') &&
-        (obj['id'] is num || obj['id'] is String) &&
+        (obj['id'] == null || (obj['id'] is num || obj['id'] is String)) &&
+        (obj['result'] == null || true) &&
+        (obj['error'] == null || ResponseError.canParse(obj['error'])) &&
         obj.containsKey('jsonrpc') &&
         obj['jsonrpc'] is String;
   }
@@ -6757,6 +7133,9 @@
 
 /// Save options.
 class SaveOptions implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(SaveOptions.canParse, SaveOptions.fromJson);
+
   SaveOptions(this.includeText);
   static SaveOptions fromJson(Map<String, dynamic> json) {
     final includeText = json['includeText'];
@@ -6775,7 +7154,8 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['includeText'] == null || obj['includeText'] is bool);
   }
 
   @override
@@ -6798,6 +7178,9 @@
 }
 
 class ServerCapabilities implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ServerCapabilities.canParse, ServerCapabilities.fromJson);
+
   ServerCapabilities(
       this.textDocumentSync,
       this.hoverProvider,
@@ -7102,7 +7485,60 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['textDocumentSync'] == null ||
+            (TextDocumentSyncOptions.canParse(obj['textDocumentSync']) ||
+                obj['textDocumentSync'] is num)) &&
+        (obj['hoverProvider'] == null || obj['hoverProvider'] is bool) &&
+        (obj['completionProvider'] == null ||
+            CompletionOptions.canParse(obj['completionProvider'])) &&
+        (obj['signatureHelpProvider'] == null ||
+            SignatureHelpOptions.canParse(obj['signatureHelpProvider'])) &&
+        (obj['definitionProvider'] == null ||
+            obj['definitionProvider'] is bool) &&
+        (obj['typeDefinitionProvider'] == null ||
+            (obj['typeDefinitionProvider'] is bool || true)) &&
+        (obj['implementationProvider'] == null ||
+            (obj['implementationProvider'] is bool || true)) &&
+        (obj['referencesProvider'] == null ||
+            obj['referencesProvider'] is bool) &&
+        (obj['documentHighlightProvider'] == null ||
+            obj['documentHighlightProvider'] is bool) &&
+        (obj['documentSymbolProvider'] == null ||
+            obj['documentSymbolProvider'] is bool) &&
+        (obj['workspaceSymbolProvider'] == null ||
+            obj['workspaceSymbolProvider'] is bool) &&
+        (obj['codeActionProvider'] == null ||
+            (obj['codeActionProvider'] is bool ||
+                CodeActionOptions.canParse(obj['codeActionProvider']))) &&
+        (obj['codeLensProvider'] == null ||
+            CodeLensOptions.canParse(obj['codeLensProvider'])) &&
+        (obj['documentFormattingProvider'] == null ||
+            obj['documentFormattingProvider'] is bool) &&
+        (obj['documentRangeFormattingProvider'] == null ||
+            obj['documentRangeFormattingProvider'] is bool) &&
+        (obj['documentOnTypeFormattingProvider'] == null ||
+            DocumentOnTypeFormattingOptions.canParse(
+                obj['documentOnTypeFormattingProvider'])) &&
+        (obj['renameProvider'] == null ||
+            (obj['renameProvider'] is bool ||
+                RenameOptions.canParse(obj['renameProvider']))) &&
+        (obj['documentLinkProvider'] == null ||
+            DocumentLinkOptions.canParse(obj['documentLinkProvider'])) &&
+        (obj['colorProvider'] == null ||
+            (obj['colorProvider'] is bool ||
+                ColorProviderOptions.canParse(obj['colorProvider']) ||
+                true)) &&
+        (obj['foldingRangeProvider'] == null ||
+            (obj['foldingRangeProvider'] is bool ||
+                FoldingRangeProviderOptions.canParse(
+                    obj['foldingRangeProvider']) ||
+                true)) &&
+        (obj['executeCommandProvider'] == null ||
+            ExecuteCommandOptions.canParse(obj['executeCommandProvider'])) &&
+        (obj['workspace'] == null ||
+            ServerCapabilitiesWorkspace.canParse(obj['workspace'])) &&
+        (obj['experimental'] == null || true);
   }
 
   @override
@@ -7174,6 +7610,10 @@
 }
 
 class ServerCapabilitiesWorkspace implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ServerCapabilitiesWorkspace.canParse,
+      ServerCapabilitiesWorkspace.fromJson);
+
   ServerCapabilitiesWorkspace(this.workspaceFolders);
   static ServerCapabilitiesWorkspace fromJson(Map<String, dynamic> json) {
     final workspaceFolders = json['workspaceFolders'] != null
@@ -7196,7 +7636,10 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['workspaceFolders'] == null ||
+            ServerCapabilitiesWorkspaceFolders.canParse(
+                obj['workspaceFolders']));
   }
 
   @override
@@ -7219,6 +7662,10 @@
 }
 
 class ServerCapabilitiesWorkspaceFolders implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ServerCapabilitiesWorkspaceFolders.canParse,
+      ServerCapabilitiesWorkspaceFolders.fromJson);
+
   ServerCapabilitiesWorkspaceFolders(this.supported, this.changeNotifications);
   static ServerCapabilitiesWorkspaceFolders fromJson(
       Map<String, dynamic> json) {
@@ -7251,7 +7698,10 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['supported'] == null || obj['supported'] is bool) &&
+        (obj['changeNotifications'] == null ||
+            obj['changeNotifications'] is bool);
   }
 
   @override
@@ -7277,6 +7727,9 @@
 }
 
 class ShowMessageParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ShowMessageParams.canParse, ShowMessageParams.fromJson);
+
   ShowMessageParams(this.type, this.message) {
     if (type == null) {
       throw 'type is required but was not provided';
@@ -7335,6 +7788,9 @@
 }
 
 class ShowMessageRequestParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      ShowMessageRequestParams.canParse, ShowMessageRequestParams.fromJson);
+
   ShowMessageRequestParams(this.type, this.message, this.actions) {
     if (type == null) {
       throw 'type is required but was not provided';
@@ -7379,7 +7835,11 @@
         obj.containsKey('type') &&
         MessageType.canParse(obj['type']) &&
         obj.containsKey('message') &&
-        obj['message'] is String;
+        obj['message'] is String &&
+        (obj['actions'] == null ||
+            (obj['actions'] is List &&
+                (obj['actions']
+                    .every((item) => MessageActionItem.canParse(item)))));
   }
 
   @override
@@ -7410,6 +7870,9 @@
 /// Signature help represents the signature of something callable. There can be
 /// multiple signature but only one active and only one active parameter.
 class SignatureHelp implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(SignatureHelp.canParse, SignatureHelp.fromJson);
+
   SignatureHelp(this.signatures, this.activeSignature, this.activeParameter) {
     if (signatures == null) {
       throw 'signatures is required but was not provided';
@@ -7463,7 +7926,9 @@
         obj.containsKey('signatures') &&
         (obj['signatures'] is List &&
             (obj['signatures']
-                .every((item) => SignatureInformation.canParse(item))));
+                .every((item) => SignatureInformation.canParse(item)))) &&
+        (obj['activeSignature'] == null || obj['activeSignature'] is num) &&
+        (obj['activeParameter'] == null || obj['activeParameter'] is num);
   }
 
   @override
@@ -7493,6 +7958,9 @@
 
 /// Signature help options.
 class SignatureHelpOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      SignatureHelpOptions.canParse, SignatureHelpOptions.fromJson);
+
   SignatureHelpOptions(this.triggerCharacters);
   static SignatureHelpOptions fromJson(Map<String, dynamic> json) {
     final triggerCharacters = json['triggerCharacters']
@@ -7514,7 +7982,10 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['triggerCharacters'] == null ||
+            (obj['triggerCharacters'] is List &&
+                (obj['triggerCharacters'].every((item) => item is String))));
   }
 
   @override
@@ -7540,6 +8011,10 @@
 
 class SignatureHelpRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      SignatureHelpRegistrationOptions.canParse,
+      SignatureHelpRegistrationOptions.fromJson);
+
   SignatureHelpRegistrationOptions(
       this.triggerCharacters, this.documentSelector);
   static SignatureHelpRegistrationOptions fromJson(Map<String, dynamic> json) {
@@ -7573,10 +8048,14 @@
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
+        (obj['triggerCharacters'] == null ||
+            (obj['triggerCharacters'] is List &&
+                (obj['triggerCharacters'].every((item) => item is String)))) &&
         obj.containsKey('documentSelector') &&
-        (obj['documentSelector'] is List &&
-            (obj['documentSelector']
-                .every((item) => DocumentFilter.canParse(item))));
+        (obj['documentSelector'] == null ||
+            (obj['documentSelector'] is List &&
+                (obj['documentSelector']
+                    .every((item) => DocumentFilter.canParse(item)))));
   }
 
   @override
@@ -7605,6 +8084,9 @@
 /// Represents the signature of something callable. A signature can have a
 /// label, like a function-name, a doc-comment, and a set of parameters.
 class SignatureInformation implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      SignatureInformation.canParse, SignatureInformation.fromJson);
+
   SignatureInformation(this.label, this.documentation, this.parameters) {
     if (label == null) {
       throw 'label is required but was not provided';
@@ -7655,7 +8137,14 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('label') &&
-        obj['label'] is String;
+        obj['label'] is String &&
+        (obj['documentation'] == null ||
+            (obj['documentation'] is String ||
+                MarkupContent.canParse(obj['documentation']))) &&
+        (obj['parameters'] == null ||
+            (obj['parameters'] is List &&
+                (obj['parameters']
+                    .every((item) => ParameterInformation.canParse(item)))));
   }
 
   @override
@@ -7685,6 +8174,9 @@
 
 /// Static registration options to be returned in the initialize request.
 class StaticRegistrationOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      StaticRegistrationOptions.canParse, StaticRegistrationOptions.fromJson);
+
   StaticRegistrationOptions(this.id);
   static StaticRegistrationOptions fromJson(Map<String, dynamic> json) {
     final id = json['id'];
@@ -7704,7 +8196,8 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['id'] == null || obj['id'] is String);
   }
 
   @override
@@ -7729,6 +8222,9 @@
 /// Represents information about programming constructs like variables, classes,
 /// interfaces etc.
 class SymbolInformation implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      SymbolInformation.canParse, SymbolInformation.fromJson);
+
   SymbolInformation(this.name, this.kind, this.deprecated, this.location,
       this.containerName) {
     if (name == null) {
@@ -7800,8 +8296,10 @@
         obj['name'] is String &&
         obj.containsKey('kind') &&
         SymbolKind.canParse(obj['kind']) &&
+        (obj['deprecated'] == null || obj['deprecated'] is bool) &&
         obj.containsKey('location') &&
-        Location.canParse(obj['location']);
+        Location.canParse(obj['location']) &&
+        (obj['containerName'] == null || obj['containerName'] is String);
   }
 
   @override
@@ -7834,70 +8332,41 @@
 
 /// A symbol kind.
 class SymbolKind {
-  const SymbolKind._(this._value);
+  const SymbolKind(this._value);
   const SymbolKind.fromJson(this._value);
 
   final num _value;
 
   static bool canParse(Object obj) {
-    switch (obj) {
-      case 1:
-      case 2:
-      case 3:
-      case 4:
-      case 5:
-      case 6:
-      case 7:
-      case 8:
-      case 9:
-      case 10:
-      case 11:
-      case 12:
-      case 13:
-      case 14:
-      case 15:
-      case 16:
-      case 17:
-      case 18:
-      case 19:
-      case 20:
-      case 21:
-      case 22:
-      case 23:
-      case 24:
-      case 25:
-      case 26:
-        return true;
-    }
-    return false;
+    return obj is num;
   }
 
-  static const File = const SymbolKind._(1);
-  static const Module = const SymbolKind._(2);
-  static const Namespace = const SymbolKind._(3);
-  static const Package = const SymbolKind._(4);
-  static const Class = const SymbolKind._(5);
-  static const Method = const SymbolKind._(6);
-  static const Property = const SymbolKind._(7);
-  static const Field = const SymbolKind._(8);
-  static const Constructor = const SymbolKind._(9);
-  static const Enum = const SymbolKind._(10);
-  static const Interface = const SymbolKind._(11);
-  static const Function = const SymbolKind._(12);
-  static const Variable = const SymbolKind._(13);
-  static const Constant = const SymbolKind._(14);
-  static const Str = const SymbolKind._(15);
-  static const Number = const SymbolKind._(16);
-  static const Boolean = const SymbolKind._(17);
-  static const Array = const SymbolKind._(18);
-  static const Obj = const SymbolKind._(19);
-  static const Key = const SymbolKind._(20);
-  static const Null = const SymbolKind._(21);
-  static const EnumMember = const SymbolKind._(22);
-  static const Struct = const SymbolKind._(23);
-  static const Event = const SymbolKind._(24);
-  static const Operator = const SymbolKind._(25);
-  static const TypeParameter = const SymbolKind._(26);
+  static const File = const SymbolKind(1);
+  static const Module = const SymbolKind(2);
+  static const Namespace = const SymbolKind(3);
+  static const Package = const SymbolKind(4);
+  static const Class = const SymbolKind(5);
+  static const Method = const SymbolKind(6);
+  static const Property = const SymbolKind(7);
+  static const Field = const SymbolKind(8);
+  static const Constructor = const SymbolKind(9);
+  static const Enum = const SymbolKind(10);
+  static const Interface = const SymbolKind(11);
+  static const Function = const SymbolKind(12);
+  static const Variable = const SymbolKind(13);
+  static const Constant = const SymbolKind(14);
+  static const Str = const SymbolKind(15);
+  static const Number = const SymbolKind(16);
+  static const Boolean = const SymbolKind(17);
+  static const Array = const SymbolKind(18);
+  static const Obj = const SymbolKind(19);
+  static const Key = const SymbolKind(20);
+  static const Null = const SymbolKind(21);
+  static const EnumMember = const SymbolKind(22);
+  static const Struct = const SymbolKind(23);
+  static const Event = const SymbolKind(24);
+  static const Operator = const SymbolKind(25);
+  static const TypeParameter = const SymbolKind(26);
 
   Object toJson() => _value;
 
@@ -7914,6 +8383,10 @@
 /// events.
 class TextDocumentChangeRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentChangeRegistrationOptions.canParse,
+      TextDocumentChangeRegistrationOptions.fromJson);
+
   TextDocumentChangeRegistrationOptions(this.syncKind, this.documentSelector) {
     if (syncKind == null) {
       throw 'syncKind is required but was not provided';
@@ -7951,9 +8424,10 @@
         obj.containsKey('syncKind') &&
         obj['syncKind'] is num &&
         obj.containsKey('documentSelector') &&
-        (obj['documentSelector'] is List &&
-            (obj['documentSelector']
-                .every((item) => DocumentFilter.canParse(item))));
+        (obj['documentSelector'] == null ||
+            (obj['documentSelector'] is List &&
+                (obj['documentSelector']
+                    .every((item) => DocumentFilter.canParse(item)))));
   }
 
   @override
@@ -7980,6 +8454,10 @@
 
 /// Text document specific client capabilities.
 class TextDocumentClientCapabilities implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilities.canParse,
+      TextDocumentClientCapabilities.fromJson);
+
   TextDocumentClientCapabilities(
       this.synchronization,
       this.completion,
@@ -8244,7 +8722,67 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['synchronization'] == null ||
+            TextDocumentClientCapabilitiesSynchronization.canParse(
+                obj['synchronization'])) &&
+        (obj['completion'] == null ||
+            TextDocumentClientCapabilitiesCompletion.canParse(
+                obj['completion'])) &&
+        (obj['hover'] == null ||
+            TextDocumentClientCapabilitiesHover.canParse(obj['hover'])) &&
+        (obj['signatureHelp'] == null ||
+            TextDocumentClientCapabilitiesSignatureHelp.canParse(
+                obj['signatureHelp'])) &&
+        (obj['references'] == null ||
+            TextDocumentClientCapabilitiesReferences.canParse(
+                obj['references'])) &&
+        (obj['documentHighlight'] == null ||
+            TextDocumentClientCapabilitiesDocumentHighlight.canParse(
+                obj['documentHighlight'])) &&
+        (obj['documentSymbol'] == null ||
+            TextDocumentClientCapabilitiesDocumentSymbol.canParse(
+                obj['documentSymbol'])) &&
+        (obj['formatting'] == null ||
+            TextDocumentClientCapabilitiesFormatting.canParse(
+                obj['formatting'])) &&
+        (obj['rangeFormatting'] == null ||
+            TextDocumentClientCapabilitiesRangeFormatting.canParse(
+                obj['rangeFormatting'])) &&
+        (obj['onTypeFormatting'] == null ||
+            TextDocumentClientCapabilitiesOnTypeFormatting.canParse(
+                obj['onTypeFormatting'])) &&
+        (obj['declaration'] == null ||
+            TextDocumentClientCapabilitiesDeclaration.canParse(
+                obj['declaration'])) &&
+        (obj['definition'] == null ||
+            TextDocumentClientCapabilitiesDefinition.canParse(
+                obj['definition'])) &&
+        (obj['typeDefinition'] == null ||
+            TextDocumentClientCapabilitiesTypeDefinition.canParse(
+                obj['typeDefinition'])) &&
+        (obj['implementation'] == null ||
+            TextDocumentClientCapabilitiesImplementation.canParse(
+                obj['implementation'])) &&
+        (obj['codeAction'] == null ||
+            TextDocumentClientCapabilitiesCodeAction.canParse(
+                obj['codeAction'])) &&
+        (obj['codeLens'] == null ||
+            TextDocumentClientCapabilitiesCodeLens.canParse(obj['codeLens'])) &&
+        (obj['documentLink'] == null ||
+            TextDocumentClientCapabilitiesDocumentLink.canParse(
+                obj['documentLink'])) &&
+        (obj['colorProvider'] == null ||
+            TextDocumentClientCapabilitiesColorProvider.canParse(
+                obj['colorProvider'])) &&
+        (obj['rename'] == null ||
+            TextDocumentClientCapabilitiesRename.canParse(obj['rename'])) &&
+        (obj['publishDiagnostics'] == null ||
+            TextDocumentClientCapabilitiesPublishDiagnostics.canParse(
+                obj['publishDiagnostics'])) &&
+        (obj['foldingRange'] == null ||
+            TextDocumentClientCapabilitiesFoldingRange.canParse(
+                obj['foldingRange']));
   }
 
   @override
@@ -8308,6 +8846,10 @@
 }
 
 class TextDocumentClientCapabilitiesCodeAction implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesCodeAction.canParse,
+      TextDocumentClientCapabilitiesCodeAction.fromJson);
+
   TextDocumentClientCapabilitiesCodeAction(
       this.dynamicRegistration, this.codeActionLiteralSupport);
   static TextDocumentClientCapabilitiesCodeAction fromJson(
@@ -8343,7 +8885,12 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool) &&
+        (obj['codeActionLiteralSupport'] == null ||
+            TextDocumentClientCapabilitiesCodeActionLiteralSupport.canParse(
+                obj['codeActionLiteralSupport']));
   }
 
   @override
@@ -8369,6 +8916,10 @@
 }
 
 class TextDocumentClientCapabilitiesCodeActionKind implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesCodeActionKind.canParse,
+      TextDocumentClientCapabilitiesCodeActionKind.fromJson);
+
   TextDocumentClientCapabilitiesCodeActionKind(this.valueSet) {
     if (valueSet == null) {
       throw 'valueSet is required but was not provided';
@@ -8399,7 +8950,7 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('valueSet') &&
         (obj['valueSet'] is List &&
-            (obj['valueSet'].every((item) => item is String)));
+            (obj['valueSet'].every((item) => CodeActionKind.canParse(item))));
   }
 
   @override
@@ -8425,6 +8976,10 @@
 
 class TextDocumentClientCapabilitiesCodeActionLiteralSupport
     implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesCodeActionLiteralSupport.canParse,
+      TextDocumentClientCapabilitiesCodeActionLiteralSupport.fromJson);
+
   TextDocumentClientCapabilitiesCodeActionLiteralSupport(this.codeActionKind) {
     if (codeActionKind == null) {
       throw 'codeActionKind is required but was not provided';
@@ -8477,6 +9032,10 @@
 }
 
 class TextDocumentClientCapabilitiesCodeLens implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesCodeLens.canParse,
+      TextDocumentClientCapabilitiesCodeLens.fromJson);
+
   TextDocumentClientCapabilitiesCodeLens(this.dynamicRegistration);
   static TextDocumentClientCapabilitiesCodeLens fromJson(
       Map<String, dynamic> json) {
@@ -8496,7 +9055,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool);
   }
 
   @override
@@ -8519,6 +9080,10 @@
 }
 
 class TextDocumentClientCapabilitiesColorProvider implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesColorProvider.canParse,
+      TextDocumentClientCapabilitiesColorProvider.fromJson);
+
   TextDocumentClientCapabilitiesColorProvider(this.dynamicRegistration);
   static TextDocumentClientCapabilitiesColorProvider fromJson(
       Map<String, dynamic> json) {
@@ -8541,7 +9106,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool);
   }
 
   @override
@@ -8564,6 +9131,10 @@
 }
 
 class TextDocumentClientCapabilitiesCompletion implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesCompletion.canParse,
+      TextDocumentClientCapabilitiesCompletion.fromJson);
+
   TextDocumentClientCapabilitiesCompletion(this.dynamicRegistration,
       this.completionItem, this.completionItemKind, this.contextSupport);
   static TextDocumentClientCapabilitiesCompletion fromJson(
@@ -8611,7 +9182,16 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool) &&
+        (obj['completionItem'] == null ||
+            TextDocumentClientCapabilitiesCompletionItem.canParse(
+                obj['completionItem'])) &&
+        (obj['completionItemKind'] == null ||
+            TextDocumentClientCapabilitiesCompletionItemKind.canParse(
+                obj['completionItemKind'])) &&
+        (obj['contextSupport'] == null || obj['contextSupport'] is bool);
   }
 
   @override
@@ -8641,6 +9221,10 @@
 }
 
 class TextDocumentClientCapabilitiesCompletionItem implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesCompletionItem.canParse,
+      TextDocumentClientCapabilitiesCompletionItem.fromJson);
+
   TextDocumentClientCapabilitiesCompletionItem(
       this.snippetSupport,
       this.commitCharactersSupport,
@@ -8707,7 +9291,17 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['snippetSupport'] == null || obj['snippetSupport'] is bool) &&
+        (obj['commitCharactersSupport'] == null ||
+            obj['commitCharactersSupport'] is bool) &&
+        (obj['documentationFormat'] == null ||
+            (obj['documentationFormat'] is List &&
+                (obj['documentationFormat']
+                    .every((item) => MarkupKind.canParse(item))))) &&
+        (obj['deprecatedSupport'] == null ||
+            obj['deprecatedSupport'] is bool) &&
+        (obj['preselectSupport'] == null || obj['preselectSupport'] is bool);
   }
 
   @override
@@ -8740,6 +9334,10 @@
 }
 
 class TextDocumentClientCapabilitiesCompletionItemKind implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesCompletionItemKind.canParse,
+      TextDocumentClientCapabilitiesCompletionItemKind.fromJson);
+
   TextDocumentClientCapabilitiesCompletionItemKind(this.valueSet);
   static TextDocumentClientCapabilitiesCompletionItemKind fromJson(
       Map<String, dynamic> json) {
@@ -8768,7 +9366,11 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['valueSet'] == null ||
+            (obj['valueSet'] is List &&
+                (obj['valueSet']
+                    .every((item) => CompletionItemKind.canParse(item)))));
   }
 
   @override
@@ -8793,6 +9395,10 @@
 }
 
 class TextDocumentClientCapabilitiesDeclaration implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesDeclaration.canParse,
+      TextDocumentClientCapabilitiesDeclaration.fromJson);
+
   TextDocumentClientCapabilitiesDeclaration(
       this.dynamicRegistration, this.linkSupport);
   static TextDocumentClientCapabilitiesDeclaration fromJson(
@@ -8826,7 +9432,10 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool) &&
+        (obj['linkSupport'] == null || obj['linkSupport'] is bool);
   }
 
   @override
@@ -8852,6 +9461,10 @@
 }
 
 class TextDocumentClientCapabilitiesDefinition implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesDefinition.canParse,
+      TextDocumentClientCapabilitiesDefinition.fromJson);
+
   TextDocumentClientCapabilitiesDefinition(
       this.dynamicRegistration, this.linkSupport);
   static TextDocumentClientCapabilitiesDefinition fromJson(
@@ -8880,7 +9493,10 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool) &&
+        (obj['linkSupport'] == null || obj['linkSupport'] is bool);
   }
 
   @override
@@ -8906,6 +9522,10 @@
 }
 
 class TextDocumentClientCapabilitiesDocumentHighlight implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesDocumentHighlight.canParse,
+      TextDocumentClientCapabilitiesDocumentHighlight.fromJson);
+
   TextDocumentClientCapabilitiesDocumentHighlight(this.dynamicRegistration);
   static TextDocumentClientCapabilitiesDocumentHighlight fromJson(
       Map<String, dynamic> json) {
@@ -8926,7 +9546,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool);
   }
 
   @override
@@ -8949,6 +9571,10 @@
 }
 
 class TextDocumentClientCapabilitiesDocumentLink implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesDocumentLink.canParse,
+      TextDocumentClientCapabilitiesDocumentLink.fromJson);
+
   TextDocumentClientCapabilitiesDocumentLink(this.dynamicRegistration);
   static TextDocumentClientCapabilitiesDocumentLink fromJson(
       Map<String, dynamic> json) {
@@ -8968,7 +9594,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool);
   }
 
   @override
@@ -8991,6 +9619,10 @@
 }
 
 class TextDocumentClientCapabilitiesDocumentSymbol implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesDocumentSymbol.canParse,
+      TextDocumentClientCapabilitiesDocumentSymbol.fromJson);
+
   TextDocumentClientCapabilitiesDocumentSymbol(this.dynamicRegistration,
       this.symbolKind, this.hierarchicalDocumentSymbolSupport);
   static TextDocumentClientCapabilitiesDocumentSymbol fromJson(
@@ -9030,7 +9662,14 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool) &&
+        (obj['symbolKind'] == null ||
+            TextDocumentClientCapabilitiesSymbolKind.canParse(
+                obj['symbolKind'])) &&
+        (obj['hierarchicalDocumentSymbolSupport'] == null ||
+            obj['hierarchicalDocumentSymbolSupport'] is bool);
   }
 
   @override
@@ -9060,6 +9699,10 @@
 }
 
 class TextDocumentClientCapabilitiesFoldingRange implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesFoldingRange.canParse,
+      TextDocumentClientCapabilitiesFoldingRange.fromJson);
+
   TextDocumentClientCapabilitiesFoldingRange(
       this.dynamicRegistration, this.rangeLimit, this.lineFoldingOnly);
   static TextDocumentClientCapabilitiesFoldingRange fromJson(
@@ -9103,7 +9746,11 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool) &&
+        (obj['rangeLimit'] == null || obj['rangeLimit'] is num) &&
+        (obj['lineFoldingOnly'] == null || obj['lineFoldingOnly'] is bool);
   }
 
   @override
@@ -9131,6 +9778,10 @@
 }
 
 class TextDocumentClientCapabilitiesFormatting implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesFormatting.canParse,
+      TextDocumentClientCapabilitiesFormatting.fromJson);
+
   TextDocumentClientCapabilitiesFormatting(this.dynamicRegistration);
   static TextDocumentClientCapabilitiesFormatting fromJson(
       Map<String, dynamic> json) {
@@ -9150,7 +9801,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool);
   }
 
   @override
@@ -9173,6 +9826,10 @@
 }
 
 class TextDocumentClientCapabilitiesHover implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesHover.canParse,
+      TextDocumentClientCapabilitiesHover.fromJson);
+
   TextDocumentClientCapabilitiesHover(
       this.dynamicRegistration, this.contentFormat);
   static TextDocumentClientCapabilitiesHover fromJson(
@@ -9205,7 +9862,13 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool) &&
+        (obj['contentFormat'] == null ||
+            (obj['contentFormat'] is List &&
+                (obj['contentFormat']
+                    .every((item) => MarkupKind.canParse(item)))));
   }
 
   @override
@@ -9232,6 +9895,10 @@
 }
 
 class TextDocumentClientCapabilitiesImplementation implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesImplementation.canParse,
+      TextDocumentClientCapabilitiesImplementation.fromJson);
+
   TextDocumentClientCapabilitiesImplementation(
       this.dynamicRegistration, this.linkSupport);
   static TextDocumentClientCapabilitiesImplementation fromJson(
@@ -9265,7 +9932,10 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool) &&
+        (obj['linkSupport'] == null || obj['linkSupport'] is bool);
   }
 
   @override
@@ -9291,6 +9961,10 @@
 }
 
 class TextDocumentClientCapabilitiesOnTypeFormatting implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesOnTypeFormatting.canParse,
+      TextDocumentClientCapabilitiesOnTypeFormatting.fromJson);
+
   TextDocumentClientCapabilitiesOnTypeFormatting(this.dynamicRegistration);
   static TextDocumentClientCapabilitiesOnTypeFormatting fromJson(
       Map<String, dynamic> json) {
@@ -9311,7 +9985,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool);
   }
 
   @override
@@ -9334,6 +10010,10 @@
 }
 
 class TextDocumentClientCapabilitiesParameterInformation implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesParameterInformation.canParse,
+      TextDocumentClientCapabilitiesParameterInformation.fromJson);
+
   TextDocumentClientCapabilitiesParameterInformation(this.labelOffsetSupport);
   static TextDocumentClientCapabilitiesParameterInformation fromJson(
       Map<String, dynamic> json) {
@@ -9357,7 +10037,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['labelOffsetSupport'] == null ||
+            obj['labelOffsetSupport'] is bool);
   }
 
   @override
@@ -9380,6 +10062,10 @@
 }
 
 class TextDocumentClientCapabilitiesPublishDiagnostics implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesPublishDiagnostics.canParse,
+      TextDocumentClientCapabilitiesPublishDiagnostics.fromJson);
+
   TextDocumentClientCapabilitiesPublishDiagnostics(this.relatedInformation);
   static TextDocumentClientCapabilitiesPublishDiagnostics fromJson(
       Map<String, dynamic> json) {
@@ -9400,7 +10086,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['relatedInformation'] == null ||
+            obj['relatedInformation'] is bool);
   }
 
   @override
@@ -9423,6 +10111,10 @@
 }
 
 class TextDocumentClientCapabilitiesRangeFormatting implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesRangeFormatting.canParse,
+      TextDocumentClientCapabilitiesRangeFormatting.fromJson);
+
   TextDocumentClientCapabilitiesRangeFormatting(this.dynamicRegistration);
   static TextDocumentClientCapabilitiesRangeFormatting fromJson(
       Map<String, dynamic> json) {
@@ -9443,7 +10135,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool);
   }
 
   @override
@@ -9466,6 +10160,10 @@
 }
 
 class TextDocumentClientCapabilitiesReferences implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesReferences.canParse,
+      TextDocumentClientCapabilitiesReferences.fromJson);
+
   TextDocumentClientCapabilitiesReferences(this.dynamicRegistration);
   static TextDocumentClientCapabilitiesReferences fromJson(
       Map<String, dynamic> json) {
@@ -9485,7 +10183,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool);
   }
 
   @override
@@ -9508,6 +10208,10 @@
 }
 
 class TextDocumentClientCapabilitiesRename implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesRename.canParse,
+      TextDocumentClientCapabilitiesRename.fromJson);
+
   TextDocumentClientCapabilitiesRename(
       this.dynamicRegistration, this.prepareSupport);
   static TextDocumentClientCapabilitiesRename fromJson(
@@ -9537,7 +10241,10 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool) &&
+        (obj['prepareSupport'] == null || obj['prepareSupport'] is bool);
   }
 
   @override
@@ -9563,6 +10270,10 @@
 }
 
 class TextDocumentClientCapabilitiesSignatureHelp implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesSignatureHelp.canParse,
+      TextDocumentClientCapabilitiesSignatureHelp.fromJson);
+
   TextDocumentClientCapabilitiesSignatureHelp(
       this.dynamicRegistration, this.signatureInformation);
   static TextDocumentClientCapabilitiesSignatureHelp fromJson(
@@ -9595,7 +10306,12 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool) &&
+        (obj['signatureInformation'] == null ||
+            TextDocumentClientCapabilitiesSignatureInformation.canParse(
+                obj['signatureInformation']));
   }
 
   @override
@@ -9621,6 +10337,10 @@
 }
 
 class TextDocumentClientCapabilitiesSignatureInformation implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesSignatureInformation.canParse,
+      TextDocumentClientCapabilitiesSignatureInformation.fromJson);
+
   TextDocumentClientCapabilitiesSignatureInformation(
       this.documentationFormat, this.parameterInformation);
   static TextDocumentClientCapabilitiesSignatureInformation fromJson(
@@ -9656,7 +10376,14 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['documentationFormat'] == null ||
+            (obj['documentationFormat'] is List &&
+                (obj['documentationFormat']
+                    .every((item) => MarkupKind.canParse(item))))) &&
+        (obj['parameterInformation'] == null ||
+            TextDocumentClientCapabilitiesParameterInformation.canParse(
+                obj['parameterInformation']));
   }
 
   @override
@@ -9683,6 +10410,10 @@
 }
 
 class TextDocumentClientCapabilitiesSymbolKind implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesSymbolKind.canParse,
+      TextDocumentClientCapabilitiesSymbolKind.fromJson);
+
   TextDocumentClientCapabilitiesSymbolKind(this.valueSet);
   static TextDocumentClientCapabilitiesSymbolKind fromJson(
       Map<String, dynamic> json) {
@@ -9710,7 +10441,10 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['valueSet'] == null ||
+            (obj['valueSet'] is List &&
+                (obj['valueSet'].every((item) => SymbolKind.canParse(item)))));
   }
 
   @override
@@ -9735,6 +10469,10 @@
 }
 
 class TextDocumentClientCapabilitiesSynchronization implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesSynchronization.canParse,
+      TextDocumentClientCapabilitiesSynchronization.fromJson);
+
   TextDocumentClientCapabilitiesSynchronization(this.dynamicRegistration,
       this.willSave, this.willSaveWaitUntil, this.didSave);
   static TextDocumentClientCapabilitiesSynchronization fromJson(
@@ -9779,7 +10517,13 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool) &&
+        (obj['willSave'] == null || obj['willSave'] is bool) &&
+        (obj['willSaveWaitUntil'] == null ||
+            obj['willSaveWaitUntil'] is bool) &&
+        (obj['didSave'] == null || obj['didSave'] is bool);
   }
 
   @override
@@ -9809,6 +10553,10 @@
 }
 
 class TextDocumentClientCapabilitiesTypeDefinition implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentClientCapabilitiesTypeDefinition.canParse,
+      TextDocumentClientCapabilitiesTypeDefinition.fromJson);
+
   TextDocumentClientCapabilitiesTypeDefinition(
       this.dynamicRegistration, this.linkSupport);
   static TextDocumentClientCapabilitiesTypeDefinition fromJson(
@@ -9842,7 +10590,10 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool) &&
+        (obj['linkSupport'] == null || obj['linkSupport'] is bool);
   }
 
   @override
@@ -9871,6 +10622,10 @@
 /// are omitted the new text is considered to be the full content of the
 /// document.
 class TextDocumentContentChangeEvent implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentContentChangeEvent.canParse,
+      TextDocumentContentChangeEvent.fromJson);
+
   TextDocumentContentChangeEvent(this.range, this.rangeLength, this.text) {
     if (text == null) {
       throw 'text is required but was not provided';
@@ -9906,6 +10661,8 @@
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
+        (obj['range'] == null || Range.canParse(obj['range'])) &&
+        (obj['rangeLength'] == null || obj['rangeLength'] is num) &&
         obj.containsKey('text') &&
         obj['text'] is String;
   }
@@ -9935,6 +10692,9 @@
 }
 
 class TextDocumentEdit implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentEdit.canParse, TextDocumentEdit.fromJson);
+
   TextDocumentEdit(this.textDocument, this.edits) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -10000,6 +10760,9 @@
 }
 
 class TextDocumentIdentifier implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentIdentifier.canParse, TextDocumentIdentifier.fromJson);
+
   TextDocumentIdentifier(this.uri) {
     if (uri == null) {
       throw 'uri is required but was not provided';
@@ -10048,6 +10811,9 @@
 }
 
 class TextDocumentItem implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentItem.canParse, TextDocumentItem.fromJson);
+
   TextDocumentItem(this.uri, this.languageId, this.version, this.text) {
     if (uri == null) {
       throw 'uri is required but was not provided';
@@ -10133,6 +10899,9 @@
 }
 
 class TextDocumentPositionParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentPositionParams.canParse, TextDocumentPositionParams.fromJson);
+
   TextDocumentPositionParams(this.textDocument, this.position) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -10202,6 +10971,10 @@
 }
 
 class TextDocumentRegistrationOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentRegistrationOptions.canParse,
+      TextDocumentRegistrationOptions.fromJson);
+
   TextDocumentRegistrationOptions(this.documentSelector);
   static TextDocumentRegistrationOptions fromJson(Map<String, dynamic> json) {
     if (TextDocumentChangeRegistrationOptions.canParse(json)) {
@@ -10251,9 +11024,10 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('documentSelector') &&
-        (obj['documentSelector'] is List &&
-            (obj['documentSelector']
-                .every((item) => DocumentFilter.canParse(item))));
+        (obj['documentSelector'] == null ||
+            (obj['documentSelector'] is List &&
+                (obj['documentSelector']
+                    .every((item) => DocumentFilter.canParse(item)))));
   }
 
   @override
@@ -10277,30 +11051,24 @@
 
 /// Represents reasons why a text document is saved.
 class TextDocumentSaveReason {
-  const TextDocumentSaveReason._(this._value);
+  const TextDocumentSaveReason(this._value);
   const TextDocumentSaveReason.fromJson(this._value);
 
   final num _value;
 
   static bool canParse(Object obj) {
-    switch (obj) {
-      case 1:
-      case 2:
-      case 3:
-        return true;
-    }
-    return false;
+    return obj is num;
   }
 
   /// Manually triggered, e.g. by the user pressing save, by starting debugging,
   /// or by an API call.
-  static const Manual = const TextDocumentSaveReason._(1);
+  static const Manual = const TextDocumentSaveReason(1);
 
   /// Automatic after a delay.
-  static const AfterDelay = const TextDocumentSaveReason._(2);
+  static const AfterDelay = const TextDocumentSaveReason(2);
 
   /// When the editor lost focus.
-  static const FocusOut = const TextDocumentSaveReason._(3);
+  static const FocusOut = const TextDocumentSaveReason(3);
 
   Object toJson() => _value;
 
@@ -10315,6 +11083,10 @@
 
 class TextDocumentSaveRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentSaveRegistrationOptions.canParse,
+      TextDocumentSaveRegistrationOptions.fromJson);
+
   TextDocumentSaveRegistrationOptions(this.includeText, this.documentSelector);
   static TextDocumentSaveRegistrationOptions fromJson(
       Map<String, dynamic> json) {
@@ -10345,10 +11117,12 @@
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
+        (obj['includeText'] == null || obj['includeText'] is bool) &&
         obj.containsKey('documentSelector') &&
-        (obj['documentSelector'] is List &&
-            (obj['documentSelector']
-                .every((item) => DocumentFilter.canParse(item))));
+        (obj['documentSelector'] == null ||
+            (obj['documentSelector'] is List &&
+                (obj['documentSelector']
+                    .every((item) => DocumentFilter.canParse(item)))));
   }
 
   @override
@@ -10376,30 +11150,24 @@
 /// Defines how the host (editor) should sync document changes to the language
 /// server.
 class TextDocumentSyncKind {
-  const TextDocumentSyncKind._(this._value);
+  const TextDocumentSyncKind(this._value);
   const TextDocumentSyncKind.fromJson(this._value);
 
   final num _value;
 
   static bool canParse(Object obj) {
-    switch (obj) {
-      case 0:
-      case 1:
-      case 2:
-        return true;
-    }
-    return false;
+    return obj is num;
   }
 
   /// Documents should not be synced at all.
-  static const None = const TextDocumentSyncKind._(0);
+  static const None = const TextDocumentSyncKind(0);
 
   /// Documents are synced by always sending the full content of the document.
-  static const Full = const TextDocumentSyncKind._(1);
+  static const Full = const TextDocumentSyncKind(1);
 
   /// Documents are synced by sending the full content on open. After that only
   /// incremental updates to the document are send.
-  static const Incremental = const TextDocumentSyncKind._(2);
+  static const Incremental = const TextDocumentSyncKind(2);
 
   Object toJson() => _value;
 
@@ -10413,6 +11181,9 @@
 }
 
 class TextDocumentSyncOptions implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      TextDocumentSyncOptions.canParse, TextDocumentSyncOptions.fromJson);
+
   TextDocumentSyncOptions(this.openClose, this.change, this.willSave,
       this.willSaveWaitUntil, this.save);
   static TextDocumentSyncOptions fromJson(Map<String, dynamic> json) {
@@ -10467,7 +11238,14 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['openClose'] == null || obj['openClose'] is bool) &&
+        (obj['change'] == null ||
+            TextDocumentSyncKind.canParse(obj['change'])) &&
+        (obj['willSave'] == null || obj['willSave'] is bool) &&
+        (obj['willSaveWaitUntil'] == null ||
+            obj['willSaveWaitUntil'] is bool) &&
+        (obj['save'] == null || SaveOptions.canParse(obj['save']));
   }
 
   @override
@@ -10499,6 +11277,9 @@
 }
 
 class TextEdit implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(TextEdit.canParse, TextEdit.fromJson);
+
   TextEdit(this.range, this.newText) {
     if (range == null) {
       throw 'range is required but was not provided';
@@ -10558,6 +11339,9 @@
 
 /// General parameters to unregister a capability.
 class Unregistration implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(Unregistration.canParse, Unregistration.fromJson);
+
   Unregistration(this.id, this.method) {
     if (id == null) {
       throw 'id is required but was not provided';
@@ -10615,6 +11399,9 @@
 }
 
 class UnregistrationParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      UnregistrationParams.canParse, UnregistrationParams.fromJson);
+
   UnregistrationParams(this.unregisterations) {
     if (unregisterations == null) {
       throw 'unregisterations is required but was not provided';
@@ -10668,6 +11455,10 @@
 
 class VersionedTextDocumentIdentifier
     implements TextDocumentIdentifier, ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      VersionedTextDocumentIdentifier.canParse,
+      VersionedTextDocumentIdentifier.fromJson);
+
   VersionedTextDocumentIdentifier(this.version, this.uri) {
     if (uri == null) {
       throw 'uri is required but was not provided';
@@ -10702,7 +11493,7 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('version') &&
-        obj['version'] is num &&
+        (obj['version'] == null || obj['version'] is num) &&
         obj.containsKey('uri') &&
         obj['uri'] is String;
   }
@@ -10728,29 +11519,23 @@
 }
 
 class WatchKind {
-  const WatchKind._(this._value);
+  const WatchKind(this._value);
   const WatchKind.fromJson(this._value);
 
   final num _value;
 
   static bool canParse(Object obj) {
-    switch (obj) {
-      case 1:
-      case 2:
-      case 4:
-        return true;
-    }
-    return false;
+    return obj is num;
   }
 
   /// Interested in create events.
-  static const Create = const WatchKind._(1);
+  static const Create = const WatchKind(1);
 
   /// Interested in change events
-  static const Change = const WatchKind._(2);
+  static const Change = const WatchKind(2);
 
   /// Interested in delete events
-  static const Delete = const WatchKind._(4);
+  static const Delete = const WatchKind(4);
 
   Object toJson() => _value;
 
@@ -10765,6 +11550,9 @@
 
 /// The parameters send in a will save text document notification.
 class WillSaveTextDocumentParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      WillSaveTextDocumentParams.canParse, WillSaveTextDocumentParams.fromJson);
+
   WillSaveTextDocumentParams(this.textDocument, this.reason) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -10827,6 +11615,10 @@
 
 /// Workspace specific client capabilities.
 class WorkspaceClientCapabilities implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      WorkspaceClientCapabilities.canParse,
+      WorkspaceClientCapabilities.fromJson);
+
   WorkspaceClientCapabilities(
       this.applyEdit,
       this.workspaceEdit,
@@ -10932,7 +11724,24 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['applyEdit'] == null || obj['applyEdit'] is bool) &&
+        (obj['workspaceEdit'] == null ||
+            WorkspaceClientCapabilitiesWorkspaceEdit.canParse(
+                obj['workspaceEdit'])) &&
+        (obj['didChangeConfiguration'] == null ||
+            WorkspaceClientCapabilitiesDidChangeConfiguration.canParse(
+                obj['didChangeConfiguration'])) &&
+        (obj['didChangeWatchedFiles'] == null ||
+            WorkspaceClientCapabilitiesDidChangeWatchedFiles.canParse(
+                obj['didChangeWatchedFiles'])) &&
+        (obj['symbol'] == null ||
+            WorkspaceClientCapabilitiesSymbol.canParse(obj['symbol'])) &&
+        (obj['executeCommand'] == null ||
+            WorkspaceClientCapabilitiesExecuteCommand.canParse(
+                obj['executeCommand'])) &&
+        (obj['workspaceFolders'] == null || obj['workspaceFolders'] is bool) &&
+        (obj['configuration'] == null || obj['configuration'] is bool);
   }
 
   @override
@@ -10970,6 +11779,10 @@
 }
 
 class WorkspaceClientCapabilitiesDidChangeConfiguration implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      WorkspaceClientCapabilitiesDidChangeConfiguration.canParse,
+      WorkspaceClientCapabilitiesDidChangeConfiguration.fromJson);
+
   WorkspaceClientCapabilitiesDidChangeConfiguration(this.dynamicRegistration);
   static WorkspaceClientCapabilitiesDidChangeConfiguration fromJson(
       Map<String, dynamic> json) {
@@ -10990,7 +11803,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool);
   }
 
   @override
@@ -11013,6 +11828,10 @@
 }
 
 class WorkspaceClientCapabilitiesDidChangeWatchedFiles implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      WorkspaceClientCapabilitiesDidChangeWatchedFiles.canParse,
+      WorkspaceClientCapabilitiesDidChangeWatchedFiles.fromJson);
+
   WorkspaceClientCapabilitiesDidChangeWatchedFiles(this.dynamicRegistration);
   static WorkspaceClientCapabilitiesDidChangeWatchedFiles fromJson(
       Map<String, dynamic> json) {
@@ -11035,7 +11854,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool);
   }
 
   @override
@@ -11058,6 +11879,10 @@
 }
 
 class WorkspaceClientCapabilitiesExecuteCommand implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      WorkspaceClientCapabilitiesExecuteCommand.canParse,
+      WorkspaceClientCapabilitiesExecuteCommand.fromJson);
+
   WorkspaceClientCapabilitiesExecuteCommand(this.dynamicRegistration);
   static WorkspaceClientCapabilitiesExecuteCommand fromJson(
       Map<String, dynamic> json) {
@@ -11077,7 +11902,9 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool);
   }
 
   @override
@@ -11100,6 +11927,10 @@
 }
 
 class WorkspaceClientCapabilitiesSymbol implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      WorkspaceClientCapabilitiesSymbol.canParse,
+      WorkspaceClientCapabilitiesSymbol.fromJson);
+
   WorkspaceClientCapabilitiesSymbol(this.dynamicRegistration, this.symbolKind);
   static WorkspaceClientCapabilitiesSymbol fromJson(Map<String, dynamic> json) {
     final dynamicRegistration = json['dynamicRegistration'];
@@ -11129,7 +11960,11 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['dynamicRegistration'] == null ||
+            obj['dynamicRegistration'] is bool) &&
+        (obj['symbolKind'] == null ||
+            WorkspaceClientCapabilitiesSymbolKind.canParse(obj['symbolKind']));
   }
 
   @override
@@ -11155,6 +11990,10 @@
 }
 
 class WorkspaceClientCapabilitiesSymbolKind implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      WorkspaceClientCapabilitiesSymbolKind.canParse,
+      WorkspaceClientCapabilitiesSymbolKind.fromJson);
+
   WorkspaceClientCapabilitiesSymbolKind(this.valueSet);
   static WorkspaceClientCapabilitiesSymbolKind fromJson(
       Map<String, dynamic> json) {
@@ -11182,7 +12021,10 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['valueSet'] == null ||
+            (obj['valueSet'] is List &&
+                (obj['valueSet'].every((item) => SymbolKind.canParse(item)))));
   }
 
   @override
@@ -11207,6 +12049,10 @@
 }
 
 class WorkspaceClientCapabilitiesWorkspaceEdit implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      WorkspaceClientCapabilitiesWorkspaceEdit.canParse,
+      WorkspaceClientCapabilitiesWorkspaceEdit.fromJson);
+
   WorkspaceClientCapabilitiesWorkspaceEdit(
       this.documentChanges, this.resourceOperations, this.failureHandling);
   static WorkspaceClientCapabilitiesWorkspaceEdit fromJson(
@@ -11250,7 +12096,14 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['documentChanges'] == null || obj['documentChanges'] is bool) &&
+        (obj['resourceOperations'] == null ||
+            (obj['resourceOperations'] is List &&
+                (obj['resourceOperations']
+                    .every((item) => ResourceOperationKind.canParse(item))))) &&
+        (obj['failureHandling'] == null ||
+            FailureHandlingKind.canParse(obj['failureHandling']));
   }
 
   @override
@@ -11279,6 +12132,9 @@
 }
 
 class WorkspaceEdit implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(WorkspaceEdit.canParse, WorkspaceEdit.fromJson);
+
   WorkspaceEdit(this.changes, this.documentChanges);
   static WorkspaceEdit fromJson(Map<String, dynamic> json) {
     final changes = json['changes']
@@ -11342,7 +12198,23 @@
   }
 
   static bool canParse(Object obj) {
-    return obj is Map<String, dynamic>;
+    return obj is Map<String, dynamic> &&
+        (obj['changes'] == null ||
+            (obj['changes'] is Map &&
+                (obj['changes'].keys.every((item) =>
+                    item is String &&
+                    obj['changes'].values.every((item) => (item is List &&
+                        (item.every((item) => TextEdit.canParse(item))))))))) &&
+        (obj['documentChanges'] == null ||
+            ((obj['documentChanges'] is List &&
+                    (obj['documentChanges']
+                        .every((item) => TextDocumentEdit.canParse(item)))) ||
+                (obj['documentChanges'] is List &&
+                    (obj['documentChanges'].every((item) =>
+                        (TextDocumentEdit.canParse(item) ||
+                            CreateFile.canParse(item) ||
+                            RenameFile.canParse(item) ||
+                            DeleteFile.canParse(item)))))));
   }
 
   @override
@@ -11369,6 +12241,9 @@
 }
 
 class WorkspaceFolder implements ToJsonable {
+  static const jsonHandler =
+      const LspJsonHandler(WorkspaceFolder.canParse, WorkspaceFolder.fromJson);
+
   WorkspaceFolder(this.uri, this.name) {
     if (uri == null) {
       throw 'uri is required but was not provided';
@@ -11426,6 +12301,10 @@
 
 /// The workspace folder change event.
 class WorkspaceFoldersChangeEvent implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      WorkspaceFoldersChangeEvent.canParse,
+      WorkspaceFoldersChangeEvent.fromJson);
+
   WorkspaceFoldersChangeEvent(this.added, this.removed) {
     if (added == null) {
       throw 'added is required but was not provided';
@@ -11496,6 +12375,9 @@
 
 /// The parameters of a Workspace Symbol Request.
 class WorkspaceSymbolParams implements ToJsonable {
+  static const jsonHandler = const LspJsonHandler(
+      WorkspaceSymbolParams.canParse, WorkspaceSymbolParams.fromJson);
+
   WorkspaceSymbolParams(this.query) {
     if (query == null) {
       throw 'query is required but was not provided';
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
index 7a4edc4..7093987 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
@@ -189,6 +189,19 @@
   dynamic get params;
 }
 
+/// A helper to allow handlers to declare both a JSON validation function and
+/// parse function.
+class LspJsonHandler<T> {
+  final bool Function(Map<String, Object>) validateParams;
+  final T Function(Map<String, Object>) convertParams;
+
+  const LspJsonHandler(this.validateParams, this.convertParams);
+}
+
+bool _alwaysTrue(_) => true;
+Null _alwaysNull(_) => null;
+const NullJsonHandler = const LspJsonHandler<Null>(_alwaysTrue, _alwaysNull);
+
 abstract class ToJsonable {
   Object toJson();
 }
diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index d599adc..0125a30 100644
--- a/pkg/analysis_server/lib/protocol/protocol_constants.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_constants.dart
@@ -6,7 +6,7 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
-const String PROTOCOL_VERSION = '1.23.0';
+const String PROTOCOL_VERSION = '1.25.0';
 
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES_DIRECTORIES = 'directories';
@@ -118,8 +118,8 @@
     'removedLibraries';
 const String COMPLETION_NOTIFICATION_RESULTS = 'completion.results';
 const String COMPLETION_NOTIFICATION_RESULTS_ID = 'id';
-const String COMPLETION_NOTIFICATION_RESULTS_INCLUDED_SUGGESTION_KINDS =
-    'includedSuggestionKinds';
+const String COMPLETION_NOTIFICATION_RESULTS_INCLUDED_ELEMENT_KINDS =
+    'includedElementKinds';
 const String
     COMPLETION_NOTIFICATION_RESULTS_INCLUDED_SUGGESTION_RELEVANCE_TAGS =
     'includedSuggestionRelevanceTags';
@@ -140,6 +140,9 @@
 const String COMPLETION_REQUEST_GET_SUGGESTION_DETAILS_ID = 'id';
 const String COMPLETION_REQUEST_GET_SUGGESTION_DETAILS_LABEL = 'label';
 const String COMPLETION_REQUEST_GET_SUGGESTION_DETAILS_OFFSET = 'offset';
+const String COMPLETION_REQUEST_LIST_TOKEN_DETAILS =
+    'completion.listTokenDetails';
+const String COMPLETION_REQUEST_LIST_TOKEN_DETAILS_FILE = 'file';
 const String COMPLETION_REQUEST_REGISTER_LIBRARY_PATHS =
     'completion.registerLibraryPaths';
 const String COMPLETION_REQUEST_REGISTER_LIBRARY_PATHS_PATHS = 'paths';
@@ -151,6 +154,7 @@
 const String COMPLETION_RESPONSE_GET_SUGGESTION_DETAILS_CHANGE = 'change';
 const String COMPLETION_RESPONSE_GET_SUGGESTION_DETAILS_COMPLETION =
     'completion';
+const String COMPLETION_RESPONSE_LIST_TOKEN_DETAILS_TOKENS = 'tokens';
 const String DIAGNOSTIC_REQUEST_GET_DIAGNOSTICS = 'diagnostic.getDiagnostics';
 const String DIAGNOSTIC_REQUEST_GET_SERVER_PORT = 'diagnostic.getServerPort';
 const String DIAGNOSTIC_RESPONSE_GET_DIAGNOSTICS_CONTEXTS = 'contexts';
diff --git a/pkg/analysis_server/lib/protocol/protocol_generated.dart b/pkg/analysis_server/lib/protocol/protocol_generated.dart
index 9f29f1a..72a9529 100644
--- a/pkg/analysis_server/lib/protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_generated.dart
@@ -5076,6 +5076,8 @@
  * {
  *   "label": String
  *   "element": Element
+ *   "defaultArgumentListString": optional String
+ *   "defaultArgumentListTextRanges": optional List<int>
  *   "docComplete": optional String
  *   "docSummary": optional String
  *   "parameterNames": optional List<String>
@@ -5091,6 +5093,10 @@
 
   Element _element;
 
+  String _defaultArgumentListString;
+
+  List<int> _defaultArgumentListTextRanges;
+
   String _docComplete;
 
   String _docSummary;
@@ -5130,6 +5136,42 @@
   }
 
   /**
+   * A default String for use in generating argument list source contents on
+   * the client side.
+   */
+  String get defaultArgumentListString => _defaultArgumentListString;
+
+  /**
+   * A default String for use in generating argument list source contents on
+   * the client side.
+   */
+  void set defaultArgumentListString(String value) {
+    this._defaultArgumentListString = value;
+  }
+
+  /**
+   * Pairs of offsets and lengths describing 'defaultArgumentListString' text
+   * ranges suitable for use by clients to set up linked edits of default
+   * argument source contents. For example, given an argument list string 'x,
+   * y', the corresponding text range [0, 1, 3, 1], indicates two text ranges
+   * of length 1, starting at offsets 0 and 3. Clients can use these ranges to
+   * treat the 'x' and 'y' values specially for linked edits.
+   */
+  List<int> get defaultArgumentListTextRanges => _defaultArgumentListTextRanges;
+
+  /**
+   * Pairs of offsets and lengths describing 'defaultArgumentListString' text
+   * ranges suitable for use by clients to set up linked edits of default
+   * argument source contents. For example, given an argument list string 'x,
+   * y', the corresponding text range [0, 1, 3, 1], indicates two text ranges
+   * of length 1, starting at offsets 0 and 3. Clients can use these ranges to
+   * treat the 'x' and 'y' values specially for linked edits.
+   */
+  void set defaultArgumentListTextRanges(List<int> value) {
+    this._defaultArgumentListTextRanges = value;
+  }
+
+  /**
    * The Dartdoc associated with the element being suggested. This field is
    * omitted if there is no Dartdoc associated with the element.
    */
@@ -5214,7 +5256,9 @@
   }
 
   AvailableSuggestion(String label, Element element,
-      {String docComplete,
+      {String defaultArgumentListString,
+      List<int> defaultArgumentListTextRanges,
+      String docComplete,
       String docSummary,
       List<String> parameterNames,
       List<String> parameterTypes,
@@ -5222,6 +5266,8 @@
       int requiredParameterCount}) {
     this.label = label;
     this.element = element;
+    this.defaultArgumentListString = defaultArgumentListString;
+    this.defaultArgumentListTextRanges = defaultArgumentListTextRanges;
     this.docComplete = docComplete;
     this.docSummary = docSummary;
     this.parameterNames = parameterNames;
@@ -5249,6 +5295,19 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, "element");
       }
+      String defaultArgumentListString;
+      if (json.containsKey("defaultArgumentListString")) {
+        defaultArgumentListString = jsonDecoder.decodeString(
+            jsonPath + ".defaultArgumentListString",
+            json["defaultArgumentListString"]);
+      }
+      List<int> defaultArgumentListTextRanges;
+      if (json.containsKey("defaultArgumentListTextRanges")) {
+        defaultArgumentListTextRanges = jsonDecoder.decodeList(
+            jsonPath + ".defaultArgumentListTextRanges",
+            json["defaultArgumentListTextRanges"],
+            jsonDecoder.decodeInt);
+      }
       String docComplete;
       if (json.containsKey("docComplete")) {
         docComplete = jsonDecoder.decodeString(
@@ -5281,6 +5340,8 @@
             json["requiredParameterCount"]);
       }
       return new AvailableSuggestion(label, element,
+          defaultArgumentListString: defaultArgumentListString,
+          defaultArgumentListTextRanges: defaultArgumentListTextRanges,
           docComplete: docComplete,
           docSummary: docSummary,
           parameterNames: parameterNames,
@@ -5297,6 +5358,12 @@
     Map<String, dynamic> result = {};
     result["label"] = label;
     result["element"] = element.toJson();
+    if (defaultArgumentListString != null) {
+      result["defaultArgumentListString"] = defaultArgumentListString;
+    }
+    if (defaultArgumentListTextRanges != null) {
+      result["defaultArgumentListTextRanges"] = defaultArgumentListTextRanges;
+    }
     if (docComplete != null) {
       result["docComplete"] = docComplete;
     }
@@ -5326,6 +5393,9 @@
     if (other is AvailableSuggestion) {
       return label == other.label &&
           element == other.element &&
+          defaultArgumentListString == other.defaultArgumentListString &&
+          listEqual(defaultArgumentListTextRanges,
+              other.defaultArgumentListTextRanges, (int a, int b) => a == b) &&
           docComplete == other.docComplete &&
           docSummary == other.docSummary &&
           listEqual(parameterNames, other.parameterNames,
@@ -5344,6 +5414,8 @@
     int hash = 0;
     hash = JenkinsSmiHash.combine(hash, label.hashCode);
     hash = JenkinsSmiHash.combine(hash, element.hashCode);
+    hash = JenkinsSmiHash.combine(hash, defaultArgumentListString.hashCode);
+    hash = JenkinsSmiHash.combine(hash, defaultArgumentListTextRanges.hashCode);
     hash = JenkinsSmiHash.combine(hash, docComplete.hashCode);
     hash = JenkinsSmiHash.combine(hash, docSummary.hashCode);
     hash = JenkinsSmiHash.combine(hash, parameterNames.hashCode);
@@ -6211,6 +6283,184 @@
 }
 
 /**
+ * completion.listTokenDetails params
+ *
+ * {
+ *   "file": FilePath
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class CompletionListTokenDetailsParams implements RequestParams {
+  String _file;
+
+  /**
+   * The path to the file from which tokens should be returned.
+   */
+  String get file => _file;
+
+  /**
+   * The path to the file from which tokens should be returned.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
+
+  CompletionListTokenDetailsParams(String file) {
+    this.file = file;
+  }
+
+  factory CompletionListTokenDetailsParams.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder.decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "file");
+      }
+      return new CompletionListTokenDetailsParams(file);
+    } else {
+      throw jsonDecoder.mismatch(
+          jsonPath, "completion.listTokenDetails params", json);
+    }
+  }
+
+  factory CompletionListTokenDetailsParams.fromRequest(Request request) {
+    return new CompletionListTokenDetailsParams.fromJson(
+        new RequestDecoder(request), "params", request.params);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    return result;
+  }
+
+  @override
+  Request toRequest(String id) {
+    return new Request(id, "completion.listTokenDetails", toJson());
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is CompletionListTokenDetailsParams) {
+      return file == other.file;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, file.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * completion.listTokenDetails result
+ *
+ * {
+ *   "tokens": List<TokenDetails>
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class CompletionListTokenDetailsResult implements ResponseResult {
+  List<TokenDetails> _tokens;
+
+  /**
+   * A list of the file's scanned tokens including analysis information about
+   * them.
+   */
+  List<TokenDetails> get tokens => _tokens;
+
+  /**
+   * A list of the file's scanned tokens including analysis information about
+   * them.
+   */
+  void set tokens(List<TokenDetails> value) {
+    assert(value != null);
+    this._tokens = value;
+  }
+
+  CompletionListTokenDetailsResult(List<TokenDetails> tokens) {
+    this.tokens = tokens;
+  }
+
+  factory CompletionListTokenDetailsResult.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<TokenDetails> tokens;
+      if (json.containsKey("tokens")) {
+        tokens = jsonDecoder.decodeList(
+            jsonPath + ".tokens",
+            json["tokens"],
+            (String jsonPath, Object json) =>
+                new TokenDetails.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "tokens");
+      }
+      return new CompletionListTokenDetailsResult(tokens);
+    } else {
+      throw jsonDecoder.mismatch(
+          jsonPath, "completion.listTokenDetails result", json);
+    }
+  }
+
+  factory CompletionListTokenDetailsResult.fromResponse(Response response) {
+    return new CompletionListTokenDetailsResult.fromJson(
+        new ResponseDecoder(REQUEST_ID_REFACTORING_KINDS.remove(response.id)),
+        "result",
+        response.result);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["tokens"] =
+        tokens.map((TokenDetails value) => value.toJson()).toList();
+    return result;
+  }
+
+  @override
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is CompletionListTokenDetailsResult) {
+      return listEqual(
+          tokens, other.tokens, (TokenDetails a, TokenDetails b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, tokens.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
  * completion.registerLibraryPaths params
  *
  * {
@@ -6344,7 +6594,7 @@
  *   "results": List<CompletionSuggestion>
  *   "isLast": bool
  *   "includedSuggestionSets": optional List<IncludedSuggestionSet>
- *   "includedSuggestionKinds": optional List<ElementKind>
+ *   "includedElementKinds": optional List<ElementKind>
  *   "includedSuggestionRelevanceTags": optional List<IncludedSuggestionRelevanceTag>
  * }
  *
@@ -6363,7 +6613,7 @@
 
   List<IncludedSuggestionSet> _includedSuggestionSets;
 
-  List<ElementKind> _includedSuggestionKinds;
+  List<ElementKind> _includedElementKinds;
 
   List<IncludedSuggestionRelevanceTag> _includedSuggestionRelevanceTags;
 
@@ -6453,8 +6703,6 @@
   }
 
   /**
-   * This field is experimental.
-   *
    * References to AvailableSuggestionSet objects previously sent to the
    * client. The client can include applicable names from the referenced
    * library in code completion suggestions.
@@ -6463,8 +6711,6 @@
       _includedSuggestionSets;
 
   /**
-   * This field is experimental.
-   *
    * References to AvailableSuggestionSet objects previously sent to the
    * client. The client can include applicable names from the referenced
    * library in code completion suggestions.
@@ -6474,28 +6720,22 @@
   }
 
   /**
-   * This field is experimental.
-   *
    * The client is expected to check this list against the ElementKind sent in
    * IncludedSuggestionSet to decide whether or not these symbols should should
    * be presented to the user.
    */
-  List<ElementKind> get includedSuggestionKinds => _includedSuggestionKinds;
+  List<ElementKind> get includedElementKinds => _includedElementKinds;
 
   /**
-   * This field is experimental.
-   *
    * The client is expected to check this list against the ElementKind sent in
    * IncludedSuggestionSet to decide whether or not these symbols should should
    * be presented to the user.
    */
-  void set includedSuggestionKinds(List<ElementKind> value) {
-    this._includedSuggestionKinds = value;
+  void set includedElementKinds(List<ElementKind> value) {
+    this._includedElementKinds = value;
   }
 
   /**
-   * This field is experimental.
-   *
    * The client is expected to check this list against the values of the field
    * relevanceTags of AvailableSuggestion to decide if the suggestion should be
    * given a different relevance than the IncludedSuggestionSet that contains
@@ -6509,8 +6749,6 @@
       _includedSuggestionRelevanceTags;
 
   /**
-   * This field is experimental.
-   *
    * The client is expected to check this list against the values of the field
    * relevanceTags of AvailableSuggestion to decide if the suggestion should be
    * given a different relevance than the IncludedSuggestionSet that contains
@@ -6528,7 +6766,7 @@
   CompletionResultsParams(String id, int replacementOffset,
       int replacementLength, List<CompletionSuggestion> results, bool isLast,
       {List<IncludedSuggestionSet> includedSuggestionSets,
-      List<ElementKind> includedSuggestionKinds,
+      List<ElementKind> includedElementKinds,
       List<IncludedSuggestionRelevanceTag> includedSuggestionRelevanceTags}) {
     this.id = id;
     this.replacementOffset = replacementOffset;
@@ -6536,7 +6774,7 @@
     this.results = results;
     this.isLast = isLast;
     this.includedSuggestionSets = includedSuggestionSets;
-    this.includedSuggestionKinds = includedSuggestionKinds;
+    this.includedElementKinds = includedElementKinds;
     this.includedSuggestionRelevanceTags = includedSuggestionRelevanceTags;
   }
 
@@ -6591,11 +6829,11 @@
                 new IncludedSuggestionSet.fromJson(
                     jsonDecoder, jsonPath, json));
       }
-      List<ElementKind> includedSuggestionKinds;
-      if (json.containsKey("includedSuggestionKinds")) {
-        includedSuggestionKinds = jsonDecoder.decodeList(
-            jsonPath + ".includedSuggestionKinds",
-            json["includedSuggestionKinds"],
+      List<ElementKind> includedElementKinds;
+      if (json.containsKey("includedElementKinds")) {
+        includedElementKinds = jsonDecoder.decodeList(
+            jsonPath + ".includedElementKinds",
+            json["includedElementKinds"],
             (String jsonPath, Object json) =>
                 new ElementKind.fromJson(jsonDecoder, jsonPath, json));
       }
@@ -6611,7 +6849,7 @@
       return new CompletionResultsParams(
           id, replacementOffset, replacementLength, results, isLast,
           includedSuggestionSets: includedSuggestionSets,
-          includedSuggestionKinds: includedSuggestionKinds,
+          includedElementKinds: includedElementKinds,
           includedSuggestionRelevanceTags: includedSuggestionRelevanceTags);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "completion.results params", json);
@@ -6637,8 +6875,8 @@
           .map((IncludedSuggestionSet value) => value.toJson())
           .toList();
     }
-    if (includedSuggestionKinds != null) {
-      result["includedSuggestionKinds"] = includedSuggestionKinds
+    if (includedElementKinds != null) {
+      result["includedElementKinds"] = includedElementKinds
           .map((ElementKind value) => value.toJson())
           .toList();
     }
@@ -6669,7 +6907,7 @@
           isLast == other.isLast &&
           listEqual(includedSuggestionSets, other.includedSuggestionSets,
               (IncludedSuggestionSet a, IncludedSuggestionSet b) => a == b) &&
-          listEqual(includedSuggestionKinds, other.includedSuggestionKinds,
+          listEqual(includedElementKinds, other.includedElementKinds,
               (ElementKind a, ElementKind b) => a == b) &&
           listEqual(
               includedSuggestionRelevanceTags,
@@ -6690,7 +6928,7 @@
     hash = JenkinsSmiHash.combine(hash, results.hashCode);
     hash = JenkinsSmiHash.combine(hash, isLast.hashCode);
     hash = JenkinsSmiHash.combine(hash, includedSuggestionSets.hashCode);
-    hash = JenkinsSmiHash.combine(hash, includedSuggestionKinds.hashCode);
+    hash = JenkinsSmiHash.combine(hash, includedElementKinds.hashCode);
     hash =
         JenkinsSmiHash.combine(hash, includedSuggestionRelevanceTags.hashCode);
     return JenkinsSmiHash.finish(hash);
@@ -16076,6 +16314,7 @@
  * {
  *   "id": int
  *   "relevance": int
+ *   "displayUri": optional String
  * }
  *
  * Clients may not extend, implement or mix-in this class.
@@ -16085,6 +16324,8 @@
 
   int _relevance;
 
+  String _displayUri;
+
   /**
    * Clients should use it to access the set of precomputed completions to be
    * displayed to the user.
@@ -16115,9 +16356,34 @@
     this._relevance = value;
   }
 
-  IncludedSuggestionSet(int id, int relevance) {
+  /**
+   * The optional string that should be displayed instead of the uri of the
+   * referenced AvailableSuggestionSet.
+   *
+   * For example libraries in the "test" directory of a package have only
+   * "file://" URIs, so are usually long, and don't look nice, but actual
+   * import directives will use relative URIs, which are short, so we probably
+   * want to display such relative URIs to the user.
+   */
+  String get displayUri => _displayUri;
+
+  /**
+   * The optional string that should be displayed instead of the uri of the
+   * referenced AvailableSuggestionSet.
+   *
+   * For example libraries in the "test" directory of a package have only
+   * "file://" URIs, so are usually long, and don't look nice, but actual
+   * import directives will use relative URIs, which are short, so we probably
+   * want to display such relative URIs to the user.
+   */
+  void set displayUri(String value) {
+    this._displayUri = value;
+  }
+
+  IncludedSuggestionSet(int id, int relevance, {String displayUri}) {
     this.id = id;
     this.relevance = relevance;
+    this.displayUri = displayUri;
   }
 
   factory IncludedSuggestionSet.fromJson(
@@ -16139,7 +16405,12 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, "relevance");
       }
-      return new IncludedSuggestionSet(id, relevance);
+      String displayUri;
+      if (json.containsKey("displayUri")) {
+        displayUri = jsonDecoder.decodeString(
+            jsonPath + ".displayUri", json["displayUri"]);
+      }
+      return new IncludedSuggestionSet(id, relevance, displayUri: displayUri);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "IncludedSuggestionSet", json);
     }
@@ -16150,6 +16421,9 @@
     Map<String, dynamic> result = {};
     result["id"] = id;
     result["relevance"] = relevance;
+    if (displayUri != null) {
+      result["displayUri"] = displayUri;
+    }
     return result;
   }
 
@@ -16159,7 +16433,9 @@
   @override
   bool operator ==(other) {
     if (other is IncludedSuggestionSet) {
-      return id == other.id && relevance == other.relevance;
+      return id == other.id &&
+          relevance == other.relevance &&
+          displayUri == other.displayUri;
     }
     return false;
   }
@@ -16169,6 +16445,7 @@
     int hash = 0;
     hash = JenkinsSmiHash.combine(hash, id.hashCode);
     hash = JenkinsSmiHash.combine(hash, relevance.hashCode);
+    hash = JenkinsSmiHash.combine(hash, displayUri.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 }
@@ -21260,6 +21537,138 @@
 }
 
 /**
+ * TokenDetails
+ *
+ * {
+ *   "lexeme": String
+ *   "type": String
+ *   "validElementKinds": List<ElementKind>
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class TokenDetails implements HasToJson {
+  String _lexeme;
+
+  String _type;
+
+  List<ElementKind> _validElementKinds;
+
+  /**
+   * The raw token text.
+   */
+  String get lexeme => _lexeme;
+
+  /**
+   * The raw token text.
+   */
+  void set lexeme(String value) {
+    assert(value != null);
+    this._lexeme = value;
+  }
+
+  /**
+   * The type of this token.
+   */
+  String get type => _type;
+
+  /**
+   * The type of this token.
+   */
+  void set type(String value) {
+    assert(value != null);
+    this._type = value;
+  }
+
+  /**
+   * The kinds of elements which could validly replace this token.
+   */
+  List<ElementKind> get validElementKinds => _validElementKinds;
+
+  /**
+   * The kinds of elements which could validly replace this token.
+   */
+  void set validElementKinds(List<ElementKind> value) {
+    assert(value != null);
+    this._validElementKinds = value;
+  }
+
+  TokenDetails(
+      String lexeme, String type, List<ElementKind> validElementKinds) {
+    this.lexeme = lexeme;
+    this.type = type;
+    this.validElementKinds = validElementKinds;
+  }
+
+  factory TokenDetails.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String lexeme;
+      if (json.containsKey("lexeme")) {
+        lexeme = jsonDecoder.decodeString(jsonPath + ".lexeme", json["lexeme"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "lexeme");
+      }
+      String type;
+      if (json.containsKey("type")) {
+        type = jsonDecoder.decodeString(jsonPath + ".type", json["type"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "type");
+      }
+      List<ElementKind> validElementKinds;
+      if (json.containsKey("validElementKinds")) {
+        validElementKinds = jsonDecoder.decodeList(
+            jsonPath + ".validElementKinds",
+            json["validElementKinds"],
+            (String jsonPath, Object json) =>
+                new ElementKind.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "validElementKinds");
+      }
+      return new TokenDetails(lexeme, type, validElementKinds);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "TokenDetails", json);
+    }
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["lexeme"] = lexeme;
+    result["type"] = type;
+    result["validElementKinds"] =
+        validElementKinds.map((ElementKind value) => value.toJson()).toList();
+    return result;
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is TokenDetails) {
+      return lexeme == other.lexeme &&
+          type == other.type &&
+          listEqual(validElementKinds, other.validElementKinds,
+              (ElementKind a, ElementKind b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lexeme.hashCode);
+    hash = JenkinsSmiHash.combine(hash, type.hashCode);
+    hash = JenkinsSmiHash.combine(hash, validElementKinds.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
  * TypeHierarchyItem
  *
  * {
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 745f48d..c60be02 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -18,7 +18,6 @@
 import 'package:analysis_server/src/channel/channel.dart';
 import 'package:analysis_server/src/computer/computer_highlights.dart';
 import 'package:analysis_server/src/computer/computer_highlights2.dart';
-import 'package:analysis_server/src/computer/computer_outline.dart';
 import 'package:analysis_server/src/computer/new_notifications.dart';
 import 'package:analysis_server/src/context_manager.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
@@ -62,8 +61,6 @@
 import 'package:analyzer/src/dart/analysis/status.dart' as nd;
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
@@ -295,15 +292,6 @@
     analysisDriverScheduler.notify(null);
   }
 
-  /// Notify the declarations tracker that the file with the given [path] was
-  /// changed - added, updated, or removed.  Schedule processing of the file.
-  void notifyDeclarationsTracker(String path) {
-    if (declarationsTracker != null) {
-      declarationsTracker.changeFile(path);
-      analysisDriverScheduler.notify(null);
-    }
-  }
-
   void disposeDeclarationsTracker() {
     declarationsTracker = null;
     analysisDriverScheduler.outOfBandWorker = null;
@@ -398,6 +386,15 @@
         resourceProvider.pathContext.normalize(path) == path;
   }
 
+  /// Notify the declarations tracker that the file with the given [path] was
+  /// changed - added, updated, or removed.  Schedule processing of the file.
+  void notifyDeclarationsTracker(String path) {
+    if (declarationsTracker != null) {
+      declarationsTracker.changeFile(path);
+      analysisDriverScheduler.notify(null);
+    }
+  }
+
   /// Read all files, resolve all URIs, and perform required analysis in
   /// all current analysis drivers.
   void reanalyze() {
@@ -605,9 +602,7 @@
       });
     }
 
-    if (options.enableUXExperiment2) {
-      detachableFileSystemManager?.dispose();
-    }
+    detachableFileSystemManager?.dispose();
 
     // Defer closing the channel and shutting down the instrumentation server so
     // that the shutdown response can be sent and logged.
@@ -777,15 +772,6 @@
 
   /// Whether to enable parsing via the Fasta parser.
   bool useFastaParser = true;
-
-  /// User Experience, Experiment #1. This experiment changes the notion of
-  /// what analysis roots are and priority files: the analysis root is set to be
-  /// the priority files' containing directory.
-  bool enableUXExperiment1 = false;
-
-  /// User Experience, Experiment #2. This experiment introduces the notion of
-  /// an intermittent file system.
-  bool enableUXExperiment2 = false;
 }
 
 class ServerContextManagerCallbacks extends ContextManagerCallbacks {
@@ -898,12 +884,7 @@
         if (analysisServer._hasAnalysisServiceSubscription(
             AnalysisService.OUTLINE, path)) {
           _runDelayed(() {
-            SourceKind sourceKind =
-                unit.directives.any((d) => d is PartOfDirective)
-                    ? SourceKind.PART
-                    : SourceKind.LIBRARY;
-            sendAnalysisNotificationOutline(
-                analysisServer, path, result.lineInfo, sourceKind, unit);
+            sendAnalysisNotificationOutline(analysisServer, result);
           });
         }
         if (analysisServer._hasAnalysisServiceSubscription(
@@ -915,8 +896,7 @@
         if (analysisServer._hasFlutterServiceSubscription(
             FlutterService.OUTLINE, path)) {
           _runDelayed(() {
-            sendFlutterNotificationOutline(analysisServer, path, result.content,
-                result.lineInfo, unit, result.typeProvider);
+            sendFlutterNotificationOutline(analysisServer, result);
           });
         }
         // TODO(scheglov) Implement notifications for AnalysisService.IMPLEMENTED.
@@ -1014,20 +994,6 @@
     }
   }
 
-  String _computeLibraryName(CompilationUnit unit) {
-    for (Directive directive in unit.directives) {
-      if (directive is LibraryDirective && directive.name != null) {
-        return directive.name.name;
-      }
-    }
-    for (Directive directive in unit.directives) {
-      if (directive is PartOfDirective && directive.libraryName != null) {
-        return directive.libraryName.name;
-      }
-    }
-    return null;
-  }
-
   server.AnalysisNavigationParams _computeNavigationParams(
       String path, CompilationUnit unit) {
     NavigationCollectorImpl collector = new NavigationCollectorImpl();
@@ -1043,29 +1009,6 @@
     return collector.allOccurrences;
   }
 
-  // ignore: unused_element
-  server.AnalysisOutlineParams _computeOutlineParams(
-      String path, CompilationUnit unit, LineInfo lineInfo) {
-    // compute FileKind
-    SourceKind sourceKind = unit.directives.any((d) => d is PartOfDirective)
-        ? SourceKind.PART
-        : SourceKind.LIBRARY;
-    server.FileKind fileKind = server.FileKind.LIBRARY;
-    if (sourceKind == SourceKind.LIBRARY) {
-      fileKind = server.FileKind.LIBRARY;
-    } else if (sourceKind == SourceKind.PART) {
-      fileKind = server.FileKind.PART;
-    }
-    // compute library name
-    String libraryName = _computeLibraryName(unit);
-    // compute Outline
-    DartUnitOutlineComputer computer =
-        new DartUnitOutlineComputer(path, lineInfo, unit);
-    server.Outline outline = computer.compute();
-    return new server.AnalysisOutlineParams(path, fileKind, outline,
-        libraryName: libraryName);
-  }
-
   /// Run [f] in a new [Future].
   ///
   /// This method is used to delay sending notifications. If there is a more
diff --git a/pkg/analysis_server/lib/src/computer/computer_folding.dart b/pkg/analysis_server/lib/src/computer/computer_folding.dart
index 4edf2fc..9326583 100644
--- a/pkg/analysis_server/lib/src/computer/computer_folding.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_folding.dart
@@ -107,6 +107,7 @@
  */
 class _DartUnitFoldingComputerVisitor extends RecursiveAstVisitor<void> {
   final DartUnitFoldingComputer _computer;
+
   _DartUnitFoldingComputerVisitor(this._computer);
 
   @override
@@ -191,13 +192,6 @@
   }
 
   @override
-  void visitMapLiteral(MapLiteral node) {
-    _computer._addRegion(
-        node.leftBracket.end, node.rightBracket.offset, FoldingKind.LITERAL);
-    super.visitMapLiteral(node);
-  }
-
-  @override
   void visitMethodDeclaration(MethodDeclaration node) {
     _computer._addRegionForAnnotations(node.metadata);
     super.visitMethodDeclaration(node);
@@ -230,4 +224,11 @@
     _computer._recordDirective(node);
     super.visitPartOfDirective(node);
   }
+
+  @override
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
+    _computer._addRegion(
+        node.leftBracket.end, node.rightBracket.offset, FoldingKind.LITERAL);
+    super.visitSetOrMapLiteral(node);
+  }
 }
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 0076909..11a75c4 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -487,14 +487,6 @@
   }
 
   @override
-  void visitForEachStatement(ForEachStatement node) {
-    computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
-    computer._addRegion_token(node.inKeyword, HighlightRegionType.KEYWORD);
-    super.visitForEachStatement(node);
-  }
-
-  @override
   void visitForElement(ForElement node) {
     computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
@@ -502,12 +494,6 @@
   }
 
   @override
-  void visitForStatement(ForStatement node) {
-    computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
-    super.visitForStatement(node);
-  }
-
-  @override
   void visitForStatement2(ForStatement2 node) {
     computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
@@ -615,27 +601,6 @@
   }
 
   @override
-  void visitListLiteral2(ListLiteral2 node) {
-    computer._addRegion_node(node, HighlightRegionType.LITERAL_LIST);
-    computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    super.visitListLiteral2(node);
-  }
-
-  @override
-  void visitMapLiteral(MapLiteral node) {
-    computer._addRegion_node(node, HighlightRegionType.LITERAL_MAP);
-    computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    super.visitMapLiteral(node);
-  }
-
-  @override
-  void visitMapLiteral2(MapLiteral2 node) {
-    computer._addRegion_node(node, HighlightRegionType.LITERAL_MAP);
-    computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    super.visitMapLiteral2(node);
-  }
-
-  @override
   void visitMethodDeclaration(MethodDeclaration node) {
     computer._addRegion_token(
         node.externalKeyword, HighlightRegionType.BUILT_IN);
@@ -700,17 +665,17 @@
   }
 
   @override
-  void visitSetLiteral(SetLiteral node) {
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
+    if (node.isMap) {
+      computer._addRegion_node(node, HighlightRegionType.LITERAL_MAP);
+      // TODO(brianwilkerson) Add a highlight region for set literals. This
+      //  would be a breaking change, but would be consistent with list and map
+      //  literals.
+//    } else if (node.isSet) {
 //    computer._addRegion_node(node, HighlightRegionType.LITERAL_SET);
+    }
     computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    super.visitSetLiteral(node);
-  }
-
-  @override
-  void visitSetLiteral2(SetLiteral2 node) {
-//    computer._addRegion_node(node, HighlightRegionType.LITERAL_SET);
-    computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    super.visitSetLiteral2(node);
+    super.visitSetOrMapLiteral(node);
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
index 1f0326f..ad84927 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
@@ -578,14 +578,6 @@
   }
 
   @override
-  void visitForEachStatement(ForEachStatement node) {
-    computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
-    computer._addRegion_token(node.inKeyword, HighlightRegionType.KEYWORD);
-    super.visitForEachStatement(node);
-  }
-
-  @override
   void visitForElement(ForElement node) {
     computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
@@ -593,12 +585,6 @@
   }
 
   @override
-  void visitForStatement(ForStatement node) {
-    computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
-    super.visitForStatement(node);
-  }
-
-  @override
   void visitForStatement2(ForStatement2 node) {
     computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
@@ -712,27 +698,6 @@
   }
 
   @override
-  void visitListLiteral2(ListLiteral2 node) {
-    computer._addRegion_node(node, HighlightRegionType.LITERAL_LIST);
-    computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    super.visitListLiteral2(node);
-  }
-
-  @override
-  void visitMapLiteral(MapLiteral node) {
-    computer._addRegion_node(node, HighlightRegionType.LITERAL_MAP);
-    computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    super.visitMapLiteral(node);
-  }
-
-  @override
-  void visitMapLiteral2(MapLiteral2 node) {
-    computer._addRegion_node(node, HighlightRegionType.LITERAL_MAP);
-    computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    super.visitMapLiteral2(node);
-  }
-
-  @override
   void visitMethodDeclaration(MethodDeclaration node) {
     computer._addRegion_token(
         node.externalKeyword, HighlightRegionType.BUILT_IN);
@@ -797,17 +762,17 @@
   }
 
   @override
-  void visitSetLiteral(SetLiteral node) {
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
+    if (node.isMap) {
+      computer._addRegion_node(node, HighlightRegionType.LITERAL_MAP);
+      // TODO(brianwilkerson) Add a highlight region for set literals. This
+      //  would be a breaking change, but would be consistent with list and map
+      //  literals.
+//    } else if (node.isSet) {
 //    computer._addRegion_node(node, HighlightRegionType.LITERAL_SET);
+    }
     computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    super.visitSetLiteral(node);
-  }
-
-  @override
-  void visitSetLiteral2(SetLiteral2 node) {
-//    computer._addRegion_node(node, HighlightRegionType.LITERAL_SET);
-    computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    super.visitSetLiteral2(node);
+    super.visitSetOrMapLiteral(node);
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index c11bac0..7b32719 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -3,33 +3,32 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/collections.dart';
-import 'package:analysis_server/src/utilities/flutter.dart' as flutter;
+import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart' as engine;
 import 'package:analyzer/dart/element/type.dart' as engine;
 import 'package:analyzer/source/line_info.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
 /**
  * A computer for [CompilationUnit] outline.
  */
 class DartUnitOutlineComputer {
-  final String file;
-  final CompilationUnit unit;
-  final LineInfo lineInfo;
+  final ResolvedUnitResult resolvedUnit;
   final bool withBasicFlutter;
+  final Flutter flutter;
 
-  DartUnitOutlineComputer(this.file, this.lineInfo, this.unit,
-      {this.withBasicFlutter: false});
+  DartUnitOutlineComputer(this.resolvedUnit, {this.withBasicFlutter: false})
+      : flutter = Flutter.of(resolvedUnit.session);
 
   /**
    * Returns the computed outline, not `null`.
    */
   Outline compute() {
     List<Outline> unitContents = <Outline>[];
-    for (CompilationUnitMember unitMember in unit.declarations) {
+    for (CompilationUnitMember unitMember in resolvedUnit.unit.declarations) {
       if (unitMember is ClassDeclaration) {
         unitContents.add(_newClassOutline(
             unitMember, _outlinesForMembers(unitMember.members)));
@@ -85,10 +84,11 @@
   }
 
   Location _getLocationOffsetLength(int offset, int length) {
-    CharacterLocation lineLocation = lineInfo.getLocation(offset);
+    CharacterLocation lineLocation = resolvedUnit.lineInfo.getLocation(offset);
     int startLine = lineLocation.lineNumber;
     int startColumn = lineLocation.columnNumber;
-    return new Location(file, offset, length, startLine, startColumn);
+    return new Location(
+        resolvedUnit.path, offset, length, startLine, startColumn);
   }
 
   Outline _newClassOutline(ClassDeclaration node, List<Outline> classContents) {
@@ -229,10 +229,10 @@
 
   Outline _newGenericTypeAliasOutline(GenericTypeAlias node) {
     var functionType = node.functionType;
-    TypeAnnotation returnType = functionType.returnType;
+    TypeAnnotation returnType = functionType?.returnType;
     SimpleIdentifier nameNode = node.name;
     String name = nameNode.name;
-    FormalParameterList parameters = functionType.parameters;
+    FormalParameterList parameters = functionType?.parameters;
     String parametersStr = _safeToSource(parameters);
     String returnTypeStr = _safeToSource(returnType);
     Element element = new Element(
@@ -297,8 +297,8 @@
   Outline _newUnitOutline(List<Outline> unitContents) {
     Element element = new Element(
         ElementKind.COMPILATION_UNIT, '<unit>', Element.makeFlags(),
-        location: _getLocationNode(unit));
-    return _nodeOutline(unit, element, unitContents);
+        location: _getLocationNode(resolvedUnit.unit));
+    return _nodeOutline(resolvedUnit.unit, element, unitContents);
   }
 
   Outline _newVariableOutline(String typeName, ElementKind kind,
@@ -434,12 +434,13 @@
 
   @override
   visitInstanceCreationExpression(InstanceCreationExpression node) {
-    if (outlineComputer.withBasicFlutter && flutter.isWidgetCreation(node)) {
+    if (outlineComputer.withBasicFlutter &&
+        outlineComputer.flutter.isWidgetCreation(node)) {
       List<Outline> children = <Outline>[];
       node.argumentList
           .accept(new _FunctionBodyOutlinesVisitor(outlineComputer, children));
 
-      String text = flutter.getWidgetPresentationText(node);
+      String text = outlineComputer.flutter.getWidgetPresentationText(node);
       Element element = new Element(ElementKind.CONSTRUCTOR_INVOCATION, text, 0,
           location: outlineComputer._getLocationOffsetLength(node.offset, 0));
 
diff --git a/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart b/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
index a587098..5271020 100644
--- a/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
@@ -39,11 +39,29 @@
    * Compute and return the list of imported elements.
    */
   List<ImportedElements> compute() {
+    if (_regionIncludesDirectives()) {
+      return const <ImportedElements>[];
+    }
     _Visitor visitor =
         new _Visitor(unit.declaredElement.library, offset, offset + length);
     unit.accept(visitor);
     return visitor.importedElements.values.toList();
   }
+
+  /**
+   * Return `true` if the region being copied includes any directives. This
+   * really only needs to check for import and export directives, but excluding
+   * other directives is unlikely to hurt the UX.
+   */
+  bool _regionIncludesDirectives() {
+    NodeList<Directive> directives = unit.directives;
+    if (directives.isEmpty) {
+      return false;
+    }
+    // This might be overly restrictive if there are directives after the first
+    // declaration, but that should be a rare case given that it's invalid.
+    return offset < directives.last.end;
+  }
 }
 
 /**
@@ -99,14 +117,11 @@
         String prefix = '';
         AstNode parent = node.parent;
         if (parent is PrefixedIdentifier && parent.identifier == node) {
-          SimpleIdentifier prefixIdentifier = parent.prefix;
-          if (prefixIdentifier.offset <= endOffset &&
-              prefixIdentifier.end >= startOffset) {
-            Element prefixElement = prefixIdentifier.staticElement;
-            if (prefixElement is PrefixElement) {
-              prefix = prefixElement.name;
-            }
-          }
+          prefix = _getPrefixFrom(parent.prefix);
+        } else if (parent is MethodInvocation &&
+            parent.methodName == node &&
+            parent.target is SimpleIdentifier) {
+          prefix = _getPrefixFrom(parent.target);
         }
         String key = '$prefix;$path';
         ImportedElements elements = importedElements.putIfAbsent(
@@ -120,6 +135,16 @@
     }
   }
 
+  String _getPrefixFrom(SimpleIdentifier identifier) {
+    if (identifier.offset <= endOffset && identifier.end >= startOffset) {
+      Element prefixElement = identifier.staticElement;
+      if (prefixElement is PrefixElement) {
+        return prefixElement.name;
+      }
+    }
+    return '';
+  }
+
   static bool _isConstructorDeclarationReturnType(SimpleIdentifier node) {
     AstNode parent = node.parent;
     return parent is ConstructorDeclaration && parent.returnType == node;
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 6886c65..d284e43 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -27,7 +27,6 @@
 import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
-import 'package:path/path.dart';
 
 // TODO(devoncarew): See #31456 for the tracking issue to remove this flag.
 final bool disableManageImportsOnPaste = true;
@@ -360,10 +359,6 @@
    * Implement the 'analysis.setAnalysisRoots' request.
    */
   Response setAnalysisRoots(Request request) {
-    if (server.options.enableUXExperiment1) {
-      return new AnalysisSetAnalysisRootsResult().toResponse(request.id);
-    }
-
     var params = new AnalysisSetAnalysisRootsParams.fromRequest(request);
     List<String> includedPathList = params.included;
     List<String> excludedPathList = params.excluded;
@@ -385,8 +380,7 @@
     Map<String, String> packageRoots =
         params.packageRoots ?? <String, String>{};
 
-    if (server.options.enableUXExperiment2 &&
-        server.detachableFileSystemManager != null) {
+    if (server.detachableFileSystemManager != null) {
       server.detachableFileSystemManager.setAnalysisRoots(
           request.id, includedPathList, excludedPathList, packageRoots);
     } else {
@@ -418,45 +412,6 @@
       }
     }
 
-    if (server.options.enableUXExperiment1) {
-      // If this experiment is enabled, set the analysis root to be the
-      // containing directory.
-
-      List<String> includedPathList = new List<String>();
-
-      // Reference the priority files, remove files that don't end in dart, yaml
-      // or html suffixes and sort from shortest to longest file paths.
-      List<String> priorityFiles = params.files;
-      priorityFiles.removeWhere((s) =>
-          !s.endsWith('.dart') && !s.endsWith('.yaml') && !s.endsWith('.html'));
-
-      Context pathContext = server.resourceProvider.pathContext;
-      List<String> containingDirectories = <String>[];
-      for (String filePath in priorityFiles) {
-        containingDirectories.add(pathContext.dirname(filePath));
-      }
-      containingDirectories.sort();
-
-      // For each file, add the contained directory to includedPathList iff
-      // some other parent containing directory has not already been added.
-      for (String containedDir in containingDirectories) {
-        // Check that no parent directories have already been added (we have
-        // guarantees here as the list was sorted above.)
-        bool parentDirectoryInListAlready = false;
-        for (int i = 0; i < includedPathList.length; i++) {
-          if (containedDir.startsWith(includedPathList[i])) {
-            parentDirectoryInListAlready = true;
-          }
-        }
-        if (!parentDirectoryInListAlready) {
-          includedPathList.add(containedDir);
-        }
-      }
-
-      server.setAnalysisRoots(
-          request.id, includedPathList, <String>[], <String, String>{});
-    }
-
     server.setPriorityFiles(request.id, params.files);
     //
     // Forward the request to the plugins.
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index b9d51ae..d4f29d6 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -17,6 +17,7 @@
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -62,6 +63,12 @@
   CompletionRequestImpl _currentRequest;
 
   /**
+   * The identifiers of the latest `getSuggestionDetails` request.
+   * We use it to abort previous requests.
+   */
+  int _latestGetSuggestionDetailsId = 0;
+
+  /**
    * Initialize a new request handler for the given [server].
    */
   CompletionDomainHandler(AnalysisServer server) : super(server);
@@ -76,7 +83,7 @@
   Future<CompletionResult> computeSuggestions(
     CompletionRequestImpl request,
     CompletionGetSuggestionsParams params,
-    Set<ElementKind> includedSuggestionKinds,
+    Set<ElementKind> includedElementKinds,
     List<IncludedSuggestionRelevanceTag> includedSuggestionRelevanceTags,
   ) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
@@ -103,7 +110,7 @@
       performance.logStartTime(COMPUTE_SUGGESTIONS_TAG);
 
       var manager = new DartCompletionManager(
-        includedSuggestionKinds: includedSuggestionKinds,
+        includedElementKinds: includedElementKinds,
         includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
       );
 
@@ -173,11 +180,6 @@
       return;
     }
 
-    var analysisDriver = server.getAnalysisDriver(file);
-    var session = analysisDriver.currentSession;
-    var resolvedLibrary = await session.getResolvedLibrary(file);
-    var requestedLibraryElement = await session.getLibraryByUri(library.uriStr);
-
     // The label might be `MyEnum.myValue`, but we import only `MyEnum`.
     var requestedName = params.label;
     if (requestedName.contains('.')) {
@@ -187,26 +189,59 @@
       );
     }
 
-    var completion = params.label;
-    var builder = DartChangeBuilder(session);
-    await builder.addFileEdit(file, (builder) {
-      var result = builder.importLibraryElement(
-        targetLibrary: resolvedLibrary,
-        targetPath: file,
-        targetOffset: params.offset,
-        requestedLibrary: requestedLibraryElement,
-        requestedName: requestedName,
-      );
-      if (result.prefix != null) {
-        completion = '${result.prefix}.$completion';
-      }
-    });
+    const timeout = Duration(milliseconds: 1000);
+    var timer = Stopwatch()..start();
+    var id = ++_latestGetSuggestionDetailsId;
+    while (id == _latestGetSuggestionDetailsId && timer.elapsed < timeout) {
+      try {
+        var analysisDriver = server.getAnalysisDriver(file);
+        var session = analysisDriver.currentSession;
+        var resolvedLibrary = await session.getResolvedLibrary(file);
+        var requestedLibraryElement = await session.getLibraryByUri(
+          library.uriStr,
+        );
 
+        var requestedElement =
+            requestedLibraryElement.exportNamespace.get(requestedName);
+        if (requestedElement == null) {
+          server.sendResponse(Response.invalidParameter(
+            request,
+            'label',
+            'No such element: $requestedName',
+          ));
+          return;
+        }
+
+        var completion = params.label;
+        var builder = DartChangeBuilder(session);
+        await builder.addFileEdit(file, (builder) {
+          var result = builder.importLibraryElement(
+            targetLibrary: resolvedLibrary,
+            targetPath: file,
+            targetOffset: params.offset,
+            requestedLibrary: requestedLibraryElement,
+            requestedElement: requestedElement,
+          );
+          if (result.prefix != null) {
+            completion = '${result.prefix}.$completion';
+          }
+        });
+
+        server.sendResponse(
+          CompletionGetSuggestionDetailsResult(
+            completion,
+            change: builder.sourceChange,
+          ).toResponse(request.id),
+        );
+        return;
+      } on InconsistentAnalysisException {
+        // Loop around to try again.
+      }
+    }
+
+    // Timeout or abort, send the empty response.
     server.sendResponse(
-      CompletionGetSuggestionDetailsResult(
-        completion,
-        change: builder.sourceChange,
-      ).toResponse(request.id),
+      CompletionGetSuggestionDetailsResult('').toResponse(request.id),
     );
   }
 
@@ -283,10 +318,10 @@
 
     // If the client opted into using available suggestion sets,
     // create the kinds set, so signal the completion manager about opt-in.
-    Set<ElementKind> includedSuggestionKinds;
+    Set<ElementKind> includedElementKinds;
     List<IncludedSuggestionRelevanceTag> includedSuggestionRelevanceTags;
     if (_subscriptions.contains(CompletionService.AVAILABLE_SUGGESTION_SETS)) {
-      includedSuggestionKinds = Set<ElementKind>();
+      includedElementKinds = Set<ElementKind>();
       includedSuggestionRelevanceTags = <IncludedSuggestionRelevanceTag>[];
     }
 
@@ -294,11 +329,11 @@
     computeSuggestions(
       completionRequest,
       params,
-      includedSuggestionKinds,
+      includedElementKinds,
       includedSuggestionRelevanceTags,
     ).then((CompletionResult result) {
       List<IncludedSuggestionSet> includedSuggestionSets;
-      if (includedSuggestionKinds != null && resolvedUnit != null) {
+      if (includedElementKinds != null && resolvedUnit != null) {
         includedSuggestionSets = computeIncludedSetList(
           server.declarationsTracker,
           resolvedUnit,
@@ -315,7 +350,7 @@
         result.replacementLength,
         result.suggestions,
         includedSuggestionSets,
-        includedSuggestionKinds?.toList(),
+        includedElementKinds?.toList(),
         includedSuggestionRelevanceTags,
       );
       performance.logElapseTime(SEND_NOTIFICATION_TAG);
@@ -353,7 +388,7 @@
     int replacementLength,
     Iterable<CompletionSuggestion> results,
     List<IncludedSuggestionSet> includedSuggestionSets,
-    List<ElementKind> includedSuggestionKinds,
+    List<ElementKind> includedElementKinds,
     List<IncludedSuggestionRelevanceTag> includedSuggestionRelevanceTags,
   ) {
     server.sendNotification(
@@ -364,7 +399,7 @@
         results,
         true,
         includedSuggestionSets: includedSuggestionSets,
-        includedSuggestionKinds: includedSuggestionKinds,
+        includedElementKinds: includedElementKinds,
         includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
       ).toNotification(),
     );
diff --git a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
index 69f51f6..9b00766 100644
--- a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
+++ b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
@@ -43,7 +43,11 @@
     }
 
     includedSetList.add(
-      protocol.IncludedSuggestionSet(library.id, relevance),
+      protocol.IncludedSuggestionSet(
+        library.id,
+        relevance,
+        displayUri: _getRelativeFileUri(resolvedUnit, library.uri),
+      ),
     );
   }
 
@@ -80,6 +84,21 @@
   ).toNotification();
 }
 
+/// Computes the best URI to import [what] into the [unit] library.
+String _getRelativeFileUri(ResolvedUnitResult unit, Uri what) {
+  if (what.scheme == 'file') {
+    var pathContext = unit.session.resourceProvider.pathContext;
+
+    var libraryPath = unit.libraryElement.source.fullName;
+    var libraryFolder = pathContext.dirname(libraryPath);
+
+    var whatPath = pathContext.fromUri(what);
+    var relativePath = pathContext.relative(whatPath, from: libraryFolder);
+    return pathContext.split(relativePath).join('/');
+  }
+  return null;
+}
+
 protocol.AvailableSuggestion _protocolAvailableSuggestion(
     Declaration declaration) {
   var label = declaration.name;
@@ -87,15 +106,25 @@
     label = '${declaration.name2}.${declaration.name}';
   }
 
+  List<String> relevanceTags;
+  if (declaration.relevanceTags == null) {
+    relevanceTags = null;
+  } else {
+    relevanceTags = List<String>.from(declaration.relevanceTags);
+    relevanceTags.add(declaration.name);
+  }
+
   return protocol.AvailableSuggestion(
     label,
     _protocolElement(declaration),
+    defaultArgumentListString: declaration.defaultArgumentListString,
+    defaultArgumentListTextRanges: declaration.defaultArgumentListTextRanges,
     docComplete: declaration.docComplete,
     docSummary: declaration.docSummary,
     parameterNames: declaration.parameterNames,
     parameterTypes: declaration.parameterTypes,
     requiredParameterCount: declaration.requiredParameterCount,
-    relevanceTags: declaration.relevanceTags,
+    relevanceTags: relevanceTags,
   );
 }
 
diff --git a/pkg/analysis_server/lib/src/edit/edit_dartfix.dart b/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
index 9b5c226..931932e 100644
--- a/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
@@ -100,11 +100,13 @@
           hasErrors = true;
         }
         await processLints(result);
-        await processCodeTasks(result);
+        if (numPhases > 0) {
+          await processCodeTasks(0, result);
+        }
       });
-      if (needsSecondPass) {
+      for (int phase = 1; phase < numPhases; phase++) {
         await processResources((ResolvedUnitResult result) async {
-          await processCodeTasks2(result);
+          await processCodeTasks(phase, result);
         });
       }
       await finishLints();
diff --git a/pkg/analysis_server/lib/src/edit/fix/dartfix_listener.dart b/pkg/analysis_server/lib/src/edit/fix/dartfix_listener.dart
index 73805d4..c1e9639 100644
--- a/pkg/analysis_server/lib/src/edit/fix/dartfix_listener.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/dartfix_listener.dart
@@ -19,6 +19,20 @@
 
   DartFixListener(this.server);
 
+  /// Record an edit to be sent to the client.
+  ///
+  /// The associated suggestion should be separately added by calling
+  /// [addSuggestion].
+  void addEditWithoutSuggestion(Source source, SourceEdit edit) {
+    sourceChange.addEdit(source.fullName, -1, edit);
+  }
+
+  /// Record a recommendation to be sent to the client.
+  void addRecommendation(String description, [Location location]) {
+    otherSuggestions
+        .add(new DartFixSuggestion(description, location: location));
+  }
+
   /// Record a source change to be sent to the client.
   void addSourceChange(
       String description, Location location, SourceChange change) {
@@ -48,10 +62,12 @@
     }
   }
 
-  /// Record a recommendation to be sent to the client.
-  void addRecommendation(String description, [Location location]) {
-    otherSuggestions
-        .add(new DartFixSuggestion(description, location: location));
+  /// Record a suggestion to be sent to the client.
+  ///
+  /// The associated edits should be separately added by calling
+  /// [addEditWithoutRecommendation].
+  void addSuggestion(String description, Location location) {
+    suggestions.add(new DartFixSuggestion(description, location: location));
   }
 
   /// Return the [Location] representing the specified offset and length
diff --git a/pkg/analysis_server/lib/src/edit/fix/fix_code_task.dart b/pkg/analysis_server/lib/src/edit/fix/fix_code_task.dart
index 71d491b..eaa28ad 100644
--- a/pkg/analysis_server/lib/src/edit/fix/fix_code_task.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/fix_code_task.dart
@@ -2,55 +2,50 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:math' show max;
+
 import 'package:analysis_server/src/edit/edit_dartfix.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 
 /// A general task for performing a fix.
 abstract class FixCodeTask {
-  /// [processUnit] is called for each compilation unit.
-  Future<void> processUnit(ResolvedUnitResult result);
+  /// Number of times [processUnit] should be called for each compilation unit.
+  int get numPhases;
 
-  /// [finish] is called after [processUnit] (and [processUnit2] if this
-  /// is a FixCodeTask2) has been called for each compilation unit.
+  /// [processUnit] is called for each phase and compilation unit.
+  ///
+  /// First [processUnit] will be called once for each compilation unit with
+  /// [phase] set to 0; then it will be called for each compilation unit with
+  /// [phase] set to 1; and so on through `numPhases-1`.
+  Future<void> processUnit(int phase, ResolvedUnitResult result);
+
+  /// [finish] is called after [processUnit] has been called for each
+  /// phase and compilation unit.
   Future<void> finish();
 }
 
-/// A general task for performing a fix which needs a 2nd pass.
-abstract class FixCodeTask2 extends FixCodeTask {
-  /// [processUnit2] is called for each compilation unit
-  /// after [processUnit] has been called for each compilation unit.
-  Future<void> processUnit2(ResolvedUnitResult result);
-}
-
 /// A processor used by [EditDartFix] to manage [FixCodeTask]s.
 mixin FixCodeProcessor {
-  final codeTasks = <FixCodeTask>[];
-  final codeTasks2 = <FixCodeTask2>[];
+  final _codeTasks = <FixCodeTask>[];
+
+  int _numPhases = 0;
 
   Future<void> finishCodeTasks() async {
-    for (FixCodeTask task in codeTasks) {
+    for (FixCodeTask task in _codeTasks) {
       await task.finish();
     }
   }
 
-  bool get needsSecondPass => codeTasks2.isNotEmpty;
+  int get numPhases => _numPhases;
 
-  Future<void> processCodeTasks(ResolvedUnitResult result) async {
-    for (FixCodeTask task in codeTasks) {
-      await task.processUnit(result);
-    }
-  }
-
-  Future<void> processCodeTasks2(ResolvedUnitResult result) async {
-    for (FixCodeTask2 task in codeTasks) {
-      await task.processUnit2(result);
+  Future<void> processCodeTasks(int phase, ResolvedUnitResult result) async {
+    for (FixCodeTask task in _codeTasks) {
+      await task.processUnit(phase, result);
     }
   }
 
   void registerCodeTask(FixCodeTask task) {
-    codeTasks.add(task);
-    if (task is FixCodeTask2) {
-      codeTasks2.add(task);
-    }
+    _codeTasks.add(task);
+    _numPhases = max(_numPhases, task.numPhases);
   }
 }
diff --git a/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart b/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
index c80cf39..bc5b11b 100644
--- a/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
@@ -7,19 +7,16 @@
 import 'package:analysis_server/src/edit/fix/fix_code_task.dart';
 import 'package:analysis_server/src/nullability/provisional_api.dart';
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
 /// [NonNullableFix] visits each named type in a resolved compilation unit
 /// and determines whether the associated variable or parameter can be null
 /// then adds or removes a '?' trailing the named type as appropriate.
-class NonNullableFix extends FixCodeTask2 {
+class NonNullableFix extends FixCodeTask {
   /// TODO(paulberry): stop using permissive mode once the migration logic is
   /// mature enough.
   static const bool _usePermissiveMode = true;
 
-  static void task(DartFixRegistrar registrar, DartFixListener listener) {
-    registrar.registerCodeTask(new NonNullableFix(listener));
-  }
-
   final DartFixListener listener;
 
   final NullabilityMigration migration;
@@ -30,18 +27,29 @@
             permissive: _usePermissiveMode);
 
   @override
+  int get numPhases => 2;
+
+  @override
   Future<void> finish() async {
     migration.finish();
   }
 
   @override
-  Future<void> processUnit(ResolvedUnitResult result) async {
-    migration.prepareInput(result);
+  Future<void> processUnit(int phase, ResolvedUnitResult result) async {
+    switch (phase) {
+      case 0:
+        migration.prepareInput(result);
+        break;
+      case 1:
+        migration.processInput(result);
+        break;
+      default:
+        throw new ArgumentError('Unsupported phase $phase');
+    }
   }
 
-  @override
-  Future<void> processUnit2(ResolvedUnitResult result) async {
-    migration.processInput(result);
+  static void task(DartFixRegistrar registrar, DartFixListener listener) {
+    registrar.registerCodeTask(new NonNullableFix(listener));
   }
 }
 
@@ -51,9 +59,13 @@
   NullabilityMigrationAdapter(this.listener);
 
   @override
+  void addEdit(SingleNullabilityFix fix, SourceEdit edit) {
+    listener.addEditWithoutSuggestion(fix.source, edit);
+  }
+
+  @override
   void addFix(SingleNullabilityFix fix) {
     // TODO(danrubel): Update the description based upon the [fix.kind]
-    listener.addSourceEdits(
-        fix.kind.appliedMessage, fix.location, fix.source, fix.sourceEdits);
+    listener.addSuggestion(fix.kind.appliedMessage, fix.location);
   }
 }
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart b/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
index 054a199..3cc2d2e 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
@@ -5,24 +5,19 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/flutter/flutter_outline_computer.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/src/generated/resolver.dart';
-import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 
 void sendFlutterNotificationOutline(
-    AnalysisServer server,
-    String file,
-    String content,
-    LineInfo lineInfo,
-    CompilationUnit dartUnit,
-    TypeProvider typeProvider) {
+    AnalysisServer server, ResolvedUnitResult resolvedUnit) {
   _sendNotification(server, () {
-    var computer = new FlutterOutlineComputer(
-        file, content, lineInfo, dartUnit, typeProvider);
+    var computer = new FlutterOutlineComputer(resolvedUnit);
     protocol.FlutterOutline outline = computer.compute();
     // send notification
-    var params = new protocol.FlutterOutlineParams(file, outline,
-        instrumentedCode: computer.instrumentedCode);
+    var params = new protocol.FlutterOutlineParams(
+      resolvedUnit.path,
+      outline,
+      instrumentedCode: computer.instrumentedCode,
+    );
     server.sendNotification(params.toNotification());
   });
 }
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
index d6fae03..2239929 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
@@ -6,11 +6,11 @@
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 /// Computer for Flutter specific outlines.
@@ -28,11 +28,8 @@
 }
 ''';
 
-  final String file;
-  final String content;
-  final LineInfo lineInfo;
-  final CompilationUnit unit;
-  final TypeProvider typeProvider;
+  final ResolvedUnitResult resolvedUnit;
+  Flutter flutter;
 
   final List<protocol.FlutterOutline> _depthFirstOrder = [];
 
@@ -45,18 +42,20 @@
   final List<protocol.SourceEdit> instrumentationEdits = [];
   String instrumentedCode;
 
-  FlutterOutlineComputer(
-      this.file, this.content, this.lineInfo, this.unit, this.typeProvider);
+  FlutterOutlineComputer(this.resolvedUnit);
 
   protocol.FlutterOutline compute() {
     protocol.Outline dartOutline = new DartUnitOutlineComputer(
-            file, lineInfo, unit,
-            withBasicFlutter: false)
-        .compute();
+      resolvedUnit,
+      withBasicFlutter: false,
+    ).compute();
+
+    flutter = Flutter.of(resolvedUnit.session);
 
     // Find widget classes.
     // IDEA plugin only supports rendering widgets in libraries.
-    if (unit.declaredElement.source == unit.declaredElement.librarySource) {
+    var unitElement = resolvedUnit.unit.declaredElement;
+    if (unitElement.source == unitElement.librarySource) {
       _findWidgets();
     }
 
@@ -64,14 +63,16 @@
     var flutterDartOutline = _convert(dartOutline);
 
     // Create outlines for widgets.
-    unit.accept(new _FlutterOutlineBuilder(this));
+    resolvedUnit.unit.accept(new _FlutterOutlineBuilder(this));
 
     // Compute instrumented code.
     if (widgets.values.any((w) => w.hasDesignTimeConstructor)) {
       _rewriteRelativeDirectives();
       instrumentationEdits.sort((a, b) => b.offset - a.offset);
-      instrumentedCode =
-          SourceEdit.applySequence(content, instrumentationEdits);
+      instrumentedCode = SourceEdit.applySequence(
+        resolvedUnit.content,
+        instrumentationEdits,
+      );
       instrumentedCode += RENDER_APPEND;
     }
 
@@ -91,7 +92,7 @@
 
     String name = parameter.displayName;
 
-    String label = content.substring(argument.offset, argument.end);
+    var label = resolvedUnit.content.substring(argument.offset, argument.end);
     if (label.contains('\n')) {
       label = '…';
     }
@@ -116,7 +117,7 @@
         }
       } else if (argument is ListLiteral) {
         label = '[…]';
-      } else if (argument is MapLiteral) {
+      } else if (argument is SetOrMapLiteral) {
         label = '{…}';
       }
       attributes.add(new protocol.FlutterOutlineAttribute(name, label));
@@ -167,7 +168,7 @@
   /// a widget reference outline item.
   protocol.FlutterOutline _createOutline(Expression node, bool withGeneric) {
     DartType type = node.staticType;
-    if (!isWidgetType(type)) {
+    if (!flutter.isWidgetType(type)) {
       return null;
     }
     String className = type.element.displayName;
@@ -178,8 +179,9 @@
       var attributes = <protocol.FlutterOutlineAttribute>[];
       var children = <protocol.FlutterOutline>[];
       for (var argument in node.argumentList.arguments) {
-        bool isWidgetArgument = isWidgetType(argument.staticType);
-        bool isWidgetListArgument = isListOfWidgetsType(argument.staticType);
+        bool isWidgetArgument = flutter.isWidgetType(argument.staticType);
+        bool isWidgetListArgument =
+            flutter.isListOfWidgetsType(argument.staticType);
 
         String parentAssociationLabel;
         Expression childrenExpression;
@@ -199,7 +201,7 @@
           }
         } else if (isWidgetListArgument) {
           if (childrenExpression is ListLiteral) {
-            for (var element in childrenExpression.elements) {
+            for (var element in childrenExpression.elements2) {
               var child = _createOutline(element, true);
               if (child != null) {
                 children.add(child);
@@ -284,13 +286,13 @@
     }
 
     ClassElement stateElement;
-    if (stateType is InterfaceType && isState(stateType.element)) {
+    if (stateType is InterfaceType && flutter.isState(stateType.element)) {
       stateElement = stateType.element;
     } else {
       return null;
     }
 
-    for (var stateNode in unit.declarations) {
+    for (var stateNode in resolvedUnit.unit.declarations) {
       if (stateNode is ClassDeclaration &&
           stateNode.declaredElement == stateElement) {
         return stateNode;
@@ -302,7 +304,7 @@
 
   /// Fill [widgets] with information about classes that can be rendered.
   void _findWidgets() {
-    for (var widget in unit.declarations) {
+    for (var widget in resolvedUnit.unit.declarations) {
       if (widget is ClassDeclaration) {
         int nameOffset = widget.name.offset;
 
@@ -310,10 +312,10 @@
         bool hasDesignTimeConstructor = designTimeConstructor != null;
 
         InterfaceType superType = widget.declaredElement.supertype;
-        if (isExactlyStatelessWidgetType(superType)) {
+        if (flutter.isExactlyStatelessWidgetType(superType)) {
           widgets[nameOffset] =
               new _WidgetClass(nameOffset, hasDesignTimeConstructor);
-        } else if (isExactlyStatefulWidgetType(superType)) {
+        } else if (flutter.isExactlyStatefulWidgetType(superType)) {
           ClassDeclaration state = _findState(widget);
           if (state != null) {
             widgets[nameOffset] =
@@ -349,7 +351,7 @@
   /// The instrumented code is put into a temporary directory for Dart VM to
   /// run. So, any relative URIs must be changed to corresponding absolute URIs.
   void _rewriteRelativeDirectives() {
-    for (var directive in unit.directives) {
+    for (var directive in resolvedUnit.unit.directives) {
       if (directive is UriBasedDirective) {
         String uriContent = directive.uriContent;
         Source source = directive.uriSource;
diff --git a/pkg/analysis_server/lib/src/lsp/constants.dart b/pkg/analysis_server/lib/src/lsp/constants.dart
index aaf762f..2c4999c 100644
--- a/pkg/analysis_server/lib/src/lsp/constants.dart
+++ b/pkg/analysis_server/lib/src/lsp/constants.dart
@@ -41,6 +41,7 @@
   static const FileHasErrors = const ErrorCodes(-32008);
   static const ClientFailedToApplyEdit = const ErrorCodes(-32009);
   static const RenameNotValid = const ErrorCodes(-32010);
+  static const ServerShuttingDown = const ErrorCodes(-32011);
 
   /// An error raised when the server detects that the server and client are out
   /// of sync and cannot recover. For example if a textDocument/didChange notification
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_diagnostic_server.dart b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_diagnostic_server.dart
index 7a3dec6..5d75dde 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_diagnostic_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_diagnostic_server.dart
@@ -17,7 +17,7 @@
   Method get handlesMessage => CustomMethods.DiagnosticServer;
 
   @override
-  void convertParams(Map<String, dynamic> json) => null;
+  LspJsonHandler<void> get jsonHandler => NullJsonHandler;
 
   @override
   Future<ErrorOr<DartDiagnosticServer>> handle(void _) async {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
index 6823eb8..c43057f 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
@@ -9,14 +9,24 @@
 
 class WorkspaceFoldersHandler
     extends MessageHandler<DidChangeWorkspaceFoldersParams, void> {
-  WorkspaceFoldersHandler(LspAnalysisServer server) : super(server);
+  // Whether to update analysis roots based on the open workspace folders.
+  bool updateAnalysisRoots;
+
+  WorkspaceFoldersHandler(LspAnalysisServer server, this.updateAnalysisRoots)
+      : super(server);
+
   Method get handlesMessage => Method.workspace_didChangeWorkspaceFolders;
 
   @override
-  DidChangeWorkspaceFoldersParams convertParams(Map<String, dynamic> json) =>
-      DidChangeWorkspaceFoldersParams.fromJson(json);
+  LspJsonHandler<DidChangeWorkspaceFoldersParams> get jsonHandler =>
+      DidChangeWorkspaceFoldersParams.jsonHandler;
 
   ErrorOr<void> handle(DidChangeWorkspaceFoldersParams params) {
+    // Don't do anything if our analysis roots are not based on open workspaces.
+    if (!updateAnalysisRoots) {
+      return success();
+    }
+
     final added = params?.event?.added
         ?.map((wf) => Uri.parse(wf.uri).toFilePath())
         ?.toList();
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
index 3788e2c..c55a22e 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
@@ -29,8 +29,8 @@
   Method get handlesMessage => Method.textDocument_codeAction;
 
   @override
-  CodeActionParams convertParams(Map<String, dynamic> json) =>
-      CodeActionParams.fromJson(json);
+  LspJsonHandler<CodeActionParams> get jsonHandler =>
+      CodeActionParams.jsonHandler;
 
   Future<ErrorOr<List<Either2<Command, CodeAction>>>> handle(
       CodeActionParams params) async {
@@ -115,9 +115,7 @@
     int length,
     ResolvedUnitResult unit,
   ) async {
-    // TODO(dantup): Is it acceptable not to support these for clients that can't
-    // handle Code Action literals? (Doing so requires we encode this into a
-    // command/arguments set and allow the client to call us back later).
+    // We only support these for clients that advertise codeActionLiteralSupport.
     if (!clientSupportsLiteralCodeActions ||
         !clientSupportedCodeActionKinds.contains(CodeActionKind.Refactor)) {
       return const [];
@@ -168,9 +166,7 @@
     Range range,
     ResolvedUnitResult unit,
   ) async {
-    // TODO(dantup): Is it acceptable not to support these for clients that can't
-    // handle Code Action literals? (Doing so requires we encode this into a
-    // command/arguments set and allow the client to call us back later).
+    // We only support these for clients that advertise codeActionLiteralSupport.
     if (!clientSupportsLiteralCodeActions ||
         !clientSupportedCodeActionKinds.contains(CodeActionKind.QuickFix)) {
       return const [];
@@ -214,9 +210,7 @@
     Range range,
     ResolvedUnitResult unit,
   ) async {
-    // TODO(dantup): Is it acceptable not to support these for clients that can't
-    // handle Code Action literals? (Doing so requires we encode this into a
-    // command/arguments set and allow the client to call us back later).
+    // We only support these for clients that advertise codeActionLiteralSupport.
     if (!clientSupportsLiteralCodeActions ||
         !clientSupportedCodeActionKinds.contains(CodeActionKind.Refactor)) {
       return const [];
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
index 1f845ef..67a3fa8 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -45,8 +45,8 @@
   Method get handlesMessage => Method.textDocument_completion;
 
   @override
-  CompletionParams convertParams(Map<String, dynamic> json) =>
-      CompletionParams.fromJson(json);
+  LspJsonHandler<CompletionParams> get jsonHandler =>
+      CompletionParams.jsonHandler;
 
   Future<ErrorOr<List<CompletionItem>>> handle(CompletionParams params) async {
     final completionCapabilities =
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
index 90912c6..51f7b2f 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
@@ -19,8 +19,8 @@
   Method get handlesMessage => Method.textDocument_definition;
 
   @override
-  TextDocumentPositionParams convertParams(Map<String, dynamic> json) =>
-      TextDocumentPositionParams.fromJson(json);
+  LspJsonHandler<TextDocumentPositionParams> get jsonHandler =>
+      TextDocumentPositionParams.jsonHandler;
 
   Future<ErrorOr<List<Location>>> handle(
       TextDocumentPositionParams params) async {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
index cc21c40..c2fabbd 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
@@ -18,8 +18,8 @@
   Method get handlesMessage => Method.textDocument_documentHighlight;
 
   @override
-  TextDocumentPositionParams convertParams(Map<String, dynamic> json) =>
-      TextDocumentPositionParams.fromJson(json);
+  LspJsonHandler<TextDocumentPositionParams> get jsonHandler =>
+      TextDocumentPositionParams.jsonHandler;
 
   Future<ErrorOr<List<DocumentHighlight>>> handle(
       TextDocumentPositionParams params) async {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart
index 7810b7f..6c5b120 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart
@@ -44,8 +44,8 @@
   Method get handlesMessage => Method.textDocument_documentSymbol;
 
   @override
-  DocumentSymbolParams convertParams(Map<String, dynamic> json) =>
-      DocumentSymbolParams.fromJson(json);
+  LspJsonHandler<DocumentSymbolParams> get jsonHandler =>
+      DocumentSymbolParams.jsonHandler;
 
   Future<ErrorOr<Either2<List<DocumentSymbol>, List<SymbolInformation>>>>
       handle(DocumentSymbolParams params) async {
@@ -112,8 +112,7 @@
     String path,
     ResolvedUnitResult unit,
   ) {
-    final computer =
-        new DartUnitOutlineComputer(path, unit.lineInfo, unit.unit);
+    final computer = new DartUnitOutlineComputer(unit);
     final outline = computer.compute();
 
     if (clientSupportsDocumentSymbol) {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart
index a1bb950..b40f4b4 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart
@@ -27,8 +27,8 @@
   Method get handlesMessage => Method.workspace_executeCommand;
 
   @override
-  ExecuteCommandParams convertParams(Map<String, dynamic> json) =>
-      ExecuteCommandParams.fromJson(json);
+  LspJsonHandler<ExecuteCommandParams> get jsonHandler =>
+      ExecuteCommandParams.jsonHandler;
 
   Future<ErrorOr<Object>> handle(ExecuteCommandParams params) async {
     final handler = commandHandlers[params.command];
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
index 4f3f320..c301118 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
+import 'dart:io';
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
@@ -10,19 +11,29 @@
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 
 class ExitMessageHandler extends MessageHandler<void, void> {
-  ExitMessageHandler(LspAnalysisServer server) : super(server);
+  final bool clientDidCallShutdown;
+
+  ExitMessageHandler(
+    LspAnalysisServer server, {
+    this.clientDidCallShutdown = false,
+  }) : super(server);
+
   Method get handlesMessage => Method.exit;
 
   @override
-  void convertParams(Map<String, dynamic> json) => null;
+  LspJsonHandler<void> get jsonHandler => NullJsonHandler;
 
   @override
   Future<ErrorOr<void>> handle(void _) async {
-    // TODO(dantup): Spec says we should exit with a code of 1 if we had not
-    // received a shutdown request prior to exit.
-    // TODO(dantup): Probably we should add a new state for "shutting down"
-    // that refuses any more requests between shutdown and exit.
+    // Set a flag that the server shutdown is being controlled here to ensure
+    // that the normal code that shuts down the server when the channel closes
+    // does not fire.
+    server.willExit = true;
+
     await server.shutdown();
+    new Future(() {
+      exit(clientDidCallShutdown ? 0 : 1);
+    });
     return success();
   }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_folding.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_folding.dart
index 96e1a4a..50d8ca3 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_folding.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_folding.dart
@@ -17,8 +17,8 @@
   Method get handlesMessage => Method.textDocument_foldingRange;
 
   @override
-  FoldingRangeParams convertParams(Map<String, dynamic> json) =>
-      FoldingRangeParams.fromJson(json);
+  LspJsonHandler<FoldingRangeParams> get jsonHandler =>
+      FoldingRangeParams.jsonHandler;
 
   Future<ErrorOr<List<FoldingRange>>> handle(FoldingRangeParams params) async {
     final path = pathOfDoc(params.textDocument);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
index 37d6a9d..7426410 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
@@ -18,8 +18,8 @@
   Method get handlesMessage => Method.textDocument_onTypeFormatting;
 
   @override
-  DocumentOnTypeFormattingParams convertParams(Map<String, dynamic> json) =>
-      DocumentOnTypeFormattingParams.fromJson(json);
+  LspJsonHandler<DocumentOnTypeFormattingParams> get jsonHandler =>
+      DocumentOnTypeFormattingParams.jsonHandler;
 
   ErrorOr<List<TextEdit>> formatFile(String path) {
     final file = server.resourceProvider.getFile(path);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
index b4e0b60..effe549 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
@@ -18,8 +18,8 @@
   Method get handlesMessage => Method.textDocument_formatting;
 
   @override
-  DocumentFormattingParams convertParams(Map<String, dynamic> json) =>
-      DocumentFormattingParams.fromJson(json);
+  LspJsonHandler<DocumentFormattingParams> get jsonHandler =>
+      DocumentFormattingParams.jsonHandler;
 
   ErrorOr<List<TextEdit>> formatFile(String path) {
     final file = server.resourceProvider.getFile(path);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
index d9302ae..aba64c8 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
@@ -20,8 +20,8 @@
   Method get handlesMessage => Method.textDocument_hover;
 
   @override
-  TextDocumentPositionParams convertParams(Map<String, dynamic> json) =>
-      TextDocumentPositionParams.fromJson(json);
+  LspJsonHandler<TextDocumentPositionParams> get jsonHandler =>
+      TextDocumentPositionParams.jsonHandler;
 
   Future<ErrorOr<Hover>> handle(TextDocumentPositionParams params) async {
     final pos = params.position;
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
index a67c282..88423de 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
@@ -16,30 +16,41 @@
   Method get handlesMessage => Method.initialize;
 
   @override
-  InitializeParams convertParams(Map<String, dynamic> json) =>
-      InitializeParams.fromJson(json);
+  LspJsonHandler<InitializeParams> get jsonHandler =>
+      InitializeParams.jsonHandler;
 
   ErrorOr<InitializeResult> handle(InitializeParams params) {
     final openWorkspacePaths = <String>[];
 
-    if (params.workspaceFolders != null) {
-      params.workspaceFolders.forEach((wf) {
-        openWorkspacePaths.add(Uri.parse(wf.uri).toFilePath());
-      });
-    }
-    if (params.rootUri != null) {
-      openWorkspacePaths.add(Uri.parse(params.rootUri).toFilePath());
-      // ignore: deprecated_member_use_from_same_package
-    } else if (params.rootPath != null) {
-      // This is deprecated according to LSP spec, but we still want to support
-      // it in case older clients send us it.
-      // ignore: deprecated_member_use_from_same_package
-      openWorkspacePaths.add(params.rootPath);
+    // The onlyAnalyzeProjectsWithOpenFiles flag allows opening huge folders
+    // without setting them as analysis roots. Instead, analysis roots will be
+    // based only on the open files.
+    final onlyAnalyzeProjectsWithOpenFiles = params.initializationOptions !=
+            null
+        ? params.initializationOptions['onlyAnalyzeProjectsWithOpenFiles'] ==
+            true
+        : false;
+
+    if (!onlyAnalyzeProjectsWithOpenFiles) {
+      if (params.workspaceFolders != null) {
+        params.workspaceFolders.forEach((wf) {
+          openWorkspacePaths.add(Uri.parse(wf.uri).toFilePath());
+        });
+      }
+      if (params.rootUri != null) {
+        openWorkspacePaths.add(Uri.parse(params.rootUri).toFilePath());
+        // ignore: deprecated_member_use_from_same_package
+      } else if (params.rootPath != null) {
+        // This is deprecated according to LSP spec, but we still want to support
+        // it in case older clients send us it.
+        // ignore: deprecated_member_use_from_same_package
+        openWorkspacePaths.add(params.rootPath);
+      }
     }
 
     server.handleClientConnection(params.capabilities);
-    server.messageHandler =
-        new InitializingStateMessageHandler(server, openWorkspacePaths);
+    server.messageHandler = new InitializingStateMessageHandler(
+        server, openWorkspacePaths, onlyAnalyzeProjectsWithOpenFiles);
 
     final codeActionLiteralSupport =
         params.capabilities.textDocument?.codeAction?.codeActionLiteralSupport;
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
index 3462d78..463ac9e 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
@@ -10,18 +10,23 @@
 
 class IntializedMessageHandler extends MessageHandler<InitializedParams, void> {
   final List<String> openWorkspacePaths;
-  IntializedMessageHandler(LspAnalysisServer server, this.openWorkspacePaths)
+  final bool onlyAnalyzeProjectsWithOpenFiles;
+  IntializedMessageHandler(LspAnalysisServer server, this.openWorkspacePaths,
+      this.onlyAnalyzeProjectsWithOpenFiles)
       : super(server);
   Method get handlesMessage => Method.initialized;
 
   @override
-  InitializedParams convertParams(Map<String, dynamic> json) =>
-      InitializedParams.fromJson(json);
+  LspJsonHandler<InitializedParams> get jsonHandler =>
+      InitializedParams.jsonHandler;
 
   ErrorOr<void> handle(InitializedParams params) {
-    server.messageHandler = new InitializedStateMessageHandler(server);
+    server.messageHandler = new InitializedStateMessageHandler(
+        server, onlyAnalyzeProjectsWithOpenFiles);
 
-    server.setAnalysisRoots(openWorkspacePaths);
+    if (!onlyAnalyzeProjectsWithOpenFiles) {
+      server.setAnalysisRoots(openWorkspacePaths);
+    }
 
     return success();
   }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
index 5f3fe45..c025819 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
@@ -24,8 +24,8 @@
   Method get handlesMessage => Method.textDocument_references;
 
   @override
-  ReferenceParams convertParams(Map<String, dynamic> json) =>
-      ReferenceParams.fromJson(json);
+  LspJsonHandler<ReferenceParams> get jsonHandler =>
+      ReferenceParams.jsonHandler;
 
   @override
   Future<ErrorOr<List<Location>>> handle(ReferenceParams params) async {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
index 8cd06e5..b006c00 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
@@ -18,7 +18,7 @@
       : super(server);
 
   @override
-  void convertParams(Map<String, dynamic> json) => null;
+  LspJsonHandler<void> get jsonHandler => NullJsonHandler;
 
   @override
   ErrorOr<void> handle(void _) {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
index 5433077..16ed7cd 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
@@ -16,8 +16,8 @@
   Method get handlesMessage => Method.textDocument_prepareRename;
 
   @override
-  TextDocumentPositionParams convertParams(Map<String, dynamic> json) =>
-      TextDocumentPositionParams.fromJson(json);
+  LspJsonHandler<TextDocumentPositionParams> get jsonHandler =>
+      TextDocumentPositionParams.jsonHandler;
 
   @override
   Future<ErrorOr<RangeAndPlaceholder>> handle(
@@ -68,8 +68,7 @@
   Method get handlesMessage => Method.textDocument_rename;
 
   @override
-  RenameParams convertParams(Map<String, dynamic> json) =>
-      RenameParams.fromJson(json);
+  LspJsonHandler<RenameParams> get jsonHandler => RenameParams.jsonHandler;
 
   @override
   Future<ErrorOr<WorkspaceEdit>> handle(RenameParams params) async {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
index 82e50f6..c16a394 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_states.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 
@@ -12,12 +13,17 @@
   Method get handlesMessage => Method.shutdown;
 
   @override
-  void convertParams(Map<String, dynamic> json) => null;
+  LspJsonHandler<void> get jsonHandler => NullJsonHandler;
 
   @override
   ErrorOr<void> handle(void _) {
+    // Move to the Shutting Down state so we won't process any more
+    // requests and the Exit notification will know it was a clean shutdown.
+    server.messageHandler = new ShuttingDownStateMessageHandler(server);
+
     // We can clean up and shut down here, but we cannot terminate the server
     // because that must be done after the exit notification.
+
     return success();
   }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
index 3f3e195..53ced13 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
@@ -17,8 +17,8 @@
   Method get handlesMessage => Method.textDocument_signatureHelp;
 
   @override
-  TextDocumentPositionParams convertParams(Map<String, dynamic> json) =>
-      TextDocumentPositionParams.fromJson(json);
+  LspJsonHandler<TextDocumentPositionParams> get jsonHandler =>
+      TextDocumentPositionParams.jsonHandler;
 
   Future<ErrorOr<SignatureHelp>> handle(
       TextDocumentPositionParams params) async {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
index 7594631..cd79433 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
@@ -14,6 +14,7 @@
 import 'package:analysis_server/src/lsp/handlers/handler_document_highlights.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_document_symbols.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_execute_command.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_exit.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_folding.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_format_on_type.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_formatting.dart';
@@ -22,6 +23,7 @@
 import 'package:analysis_server/src/lsp/handlers/handler_initialized.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_references.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_rename.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_shutdown.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_signature_help.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_text_document_changes.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_change_workspace_folders.dart';
@@ -45,14 +47,23 @@
 }
 
 class InitializedStateMessageHandler extends ServerStateMessageHandler {
-  InitializedStateMessageHandler(LspAnalysisServer server) : super(server) {
+  InitializedStateMessageHandler(
+    LspAnalysisServer server,
+    bool onlyAnalyzeProjectsWithOpenFiles,
+  ) : super(server) {
     reject(Method.initialize, ServerErrorCodes.ServerAlreadyInitialized,
         'Server already initialized');
     reject(Method.initialized, ServerErrorCodes.ServerAlreadyInitialized,
         'Server already initialized');
-    registerHandler(new TextDocumentOpenHandler(server));
+    registerHandler(new ShutdownMessageHandler(server));
+    registerHandler(new ExitMessageHandler(server));
+    registerHandler(
+      new TextDocumentOpenHandler(server, onlyAnalyzeProjectsWithOpenFiles),
+    );
     registerHandler(new TextDocumentChangeHandler(server));
-    registerHandler(new TextDocumentCloseHandler(server));
+    registerHandler(
+      new TextDocumentCloseHandler(server, onlyAnalyzeProjectsWithOpenFiles),
+    );
     registerHandler(new HoverHandler(server));
     registerHandler(new CompletionHandler(server));
     registerHandler(new SignatureHelpHandler(server));
@@ -64,7 +75,9 @@
     registerHandler(new DocumentSymbolHandler(server));
     registerHandler(new CodeActionHandler(server));
     registerHandler(new ExecuteCommandHandler(server));
-    registerHandler(new WorkspaceFoldersHandler(server));
+    registerHandler(
+      new WorkspaceFoldersHandler(server, !onlyAnalyzeProjectsWithOpenFiles),
+    );
     registerHandler(new PrepareRenameHandler(server));
     registerHandler(new RenameHandler(server));
     registerHandler(new FoldingHandler(server));
@@ -74,12 +87,15 @@
 }
 
 class InitializingStateMessageHandler extends ServerStateMessageHandler {
-  InitializingStateMessageHandler(
-      LspAnalysisServer server, List<String> openWorkspacePaths)
+  InitializingStateMessageHandler(LspAnalysisServer server,
+      List<String> openWorkspacePaths, bool onlyAnalyzeProjectsWithOpenFiles)
       : super(server) {
     reject(Method.initialize, ServerErrorCodes.ServerAlreadyInitialized,
         'Server already initialized');
-    registerHandler(new IntializedMessageHandler(server, openWorkspacePaths));
+    registerHandler(new ShutdownMessageHandler(server));
+    registerHandler(new ExitMessageHandler(server));
+    registerHandler(new IntializedMessageHandler(
+        server, openWorkspacePaths, onlyAnalyzeProjectsWithOpenFiles));
   }
 
   @override
@@ -97,6 +113,8 @@
 
 class UninitializedStateMessageHandler extends ServerStateMessageHandler {
   UninitializedStateMessageHandler(LspAnalysisServer server) : super(server) {
+    registerHandler(new ShutdownMessageHandler(server));
+    registerHandler(new ExitMessageHandler(server));
     registerHandler(new InitializeMessageHandler(server));
   }
 
@@ -110,3 +128,20 @@
         'Unable to handle ${message.method} before client has sent initialize request');
   }
 }
+
+class ShuttingDownStateMessageHandler extends ServerStateMessageHandler {
+  ShuttingDownStateMessageHandler(LspAnalysisServer server) : super(server) {
+    registerHandler(
+        new ExitMessageHandler(server, clientDidCallShutdown: true));
+  }
+
+  @override
+  FutureOr<ErrorOr<Object>> handleUnknownMessage(IncomingMessage message) {
+    // Silently drop non-requests.
+    if (message is! RequestMessage) {
+      return success();
+    }
+    return failure(ServerErrorCodes.ServerShuttingDown,
+        'Unable to handle ${message.method} after shutdown request');
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
index ea42bec..e083f5d 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
@@ -4,11 +4,15 @@
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/context_manager.dart'
+    show ContextManagerImpl;
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
 import 'package:analysis_server/src/lsp/source_edits.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:path/path.dart' show dirname, join;
 
 class TextDocumentChangeHandler
     extends MessageHandler<DidChangeTextDocumentParams, void> {
@@ -16,8 +20,8 @@
   Method get handlesMessage => Method.textDocument_didChange;
 
   @override
-  DidChangeTextDocumentParams convertParams(Map<String, dynamic> json) =>
-      DidChangeTextDocumentParams.fromJson(json);
+  LspJsonHandler<DidChangeTextDocumentParams> get jsonHandler =>
+      DidChangeTextDocumentParams.jsonHandler;
 
   ErrorOr<void> handle(DidChangeTextDocumentParams params) {
     final path = pathOfDoc(params.textDocument);
@@ -50,19 +54,44 @@
 
 class TextDocumentCloseHandler
     extends MessageHandler<DidCloseTextDocumentParams, void> {
-  TextDocumentCloseHandler(LspAnalysisServer server) : super(server);
+  /// Whether analysis roots are based on open files and should be updated.
+  bool updateAnalysisRoots;
+
+  TextDocumentCloseHandler(LspAnalysisServer server, this.updateAnalysisRoots)
+      : super(server);
+
   Method get handlesMessage => Method.textDocument_didClose;
 
   @override
-  DidCloseTextDocumentParams convertParams(Map<String, dynamic> json) =>
-      DidCloseTextDocumentParams.fromJson(json);
+  LspJsonHandler<DidCloseTextDocumentParams> get jsonHandler =>
+      DidCloseTextDocumentParams.jsonHandler;
 
   ErrorOr<void> handle(DidCloseTextDocumentParams params) {
     final path = pathOfDoc(params.textDocument);
     return path.mapResult((path) {
       server.removePriorityFile(path);
-      server.documentVersions[path] = null;
+      server.documentVersions.remove(path);
       server.updateOverlay(path, null);
+
+      if (updateAnalysisRoots) {
+        // If there are no other open files in this context, we can remove it
+        // from the analysis roots.
+        final contextFolder = server.contextManager.getContextFolderFor(path);
+        var hasOtherFilesInContext = false;
+        for (var otherDocPath in server.documentVersions.keys) {
+          if (server.contextManager.getContextFolderFor(otherDocPath) ==
+              contextFolder) {
+            hasOtherFilesInContext = true;
+            break;
+          }
+        }
+        if (!hasOtherFilesInContext) {
+          final projectFolder =
+              _findProjectFolder(server.resourceProvider, path);
+          server.updateAnalysisRoots([], [projectFolder]);
+        }
+      }
+
       return success();
     });
   }
@@ -70,12 +99,17 @@
 
 class TextDocumentOpenHandler
     extends MessageHandler<DidOpenTextDocumentParams, void> {
-  TextDocumentOpenHandler(LspAnalysisServer server) : super(server);
+  /// Whether analysis roots are based on open files and should be updated.
+  bool updateAnalysisRoots;
+
+  TextDocumentOpenHandler(LspAnalysisServer server, this.updateAnalysisRoots)
+      : super(server);
+
   Method get handlesMessage => Method.textDocument_didOpen;
 
   @override
-  DidOpenTextDocumentParams convertParams(Map<String, dynamic> json) =>
-      DidOpenTextDocumentParams.fromJson(json);
+  LspJsonHandler<DidOpenTextDocumentParams> get jsonHandler =>
+      DidOpenTextDocumentParams.jsonHandler;
 
   ErrorOr<void> handle(DidOpenTextDocumentParams params) {
     final doc = params.textDocument;
@@ -90,11 +124,62 @@
       );
       server.updateOverlay(path, doc.text);
 
+      final driver = server.contextManager.getDriverFor(path);
       // If the file did not exist, and is "overlay only", it still should be
       // analyzed. Add it to driver to which it should have been added.
-      server.contextManager.getDriverFor(path)?.addFile(path);
+
+      driver?.addFile(path);
+
+      // If there was no current driver for this file, then we may need to add
+      // its project folder as an analysis root.
+      if (updateAnalysisRoots && driver == null) {
+        final projectFolder = _findProjectFolder(server.resourceProvider, path);
+        if (projectFolder != null) {
+          server.updateAnalysisRoots([projectFolder], []);
+        } else {
+          // There was no pubspec - ideally we should add just the file
+          // here but we don't currently support that.
+          // https://github.com/dart-lang/sdk/issues/32256
+
+          // Send a warning to the user, but only if we haven't already in the
+          // last 60 seconds.
+          if (lastSentAnalyzeOpenFilesWarnings == null ||
+              (DateTime.now()
+                      .difference(lastSentAnalyzeOpenFilesWarnings)
+                      .inSeconds >
+                  60)) {
+            lastSentAnalyzeOpenFilesWarnings = DateTime.now();
+            server.showMessageToUser(
+                MessageType.Warning,
+                'When using onlyAnalyzeProjectsWithOpenFiles, files opened that '
+                'are not contained within project folders containing pubspec.yaml, '
+                '.packages or BUILD files will not be analyzed.');
+          }
+        }
+      }
 
       return success();
     });
   }
+
+  DateTime lastSentAnalyzeOpenFilesWarnings;
+}
+
+/// Finds the nearest ancestor to [filePath] that contains a pubspec/.packages/build file.
+String _findProjectFolder(ResourceProvider resourceProvider, String filePath) {
+  // TODO(dantup): Is there something we can reuse for this?
+  var folder = dirname(filePath);
+  while (folder != dirname(folder)) {
+    final pubspec =
+        resourceProvider.getFile(join(folder, ContextManagerImpl.PUBSPEC_NAME));
+    final packages = resourceProvider
+        .getFile(join(folder, ContextManagerImpl.PACKAGE_SPEC_NAME));
+    final build = resourceProvider.getFile(join(folder, 'BUILD'));
+
+    if (pubspec.exists || packages.exists || build.exists) {
+      return folder;
+    }
+    folder = dirname(folder);
+  }
+  return null;
 }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
index 3d41c0e..0f748d5 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
@@ -20,8 +20,8 @@
   Method get handlesMessage => Method.workspace_symbol;
 
   @override
-  WorkspaceSymbolParams convertParams(Map<String, dynamic> json) =>
-      WorkspaceSymbolParams.fromJson(json);
+  LspJsonHandler<WorkspaceSymbolParams> get jsonHandler =>
+      WorkspaceSymbolParams.jsonHandler;
 
   Future<ErrorOr<List<SymbolInformation>>> handle(
       WorkspaceSymbolParams params) async {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
index 78684ec..29d6800 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
@@ -7,9 +7,7 @@
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
-import 'package:analysis_server/src/lsp/handlers/handler_exit.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_reject.dart';
-import 'package:analysis_server/src/lsp/handlers/handler_shutdown.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 
@@ -68,7 +66,8 @@
   /// The method that this handler can handle.
   Method get handlesMessage;
 
-  P convertParams(Map<String, dynamic> json);
+  /// A handler that can parse and validate JSON params.
+  LspJsonHandler<P> get jsonHandler;
 
   FutureOr<ErrorOr<R>> handle(P params);
 
@@ -76,7 +75,12 @@
   /// return value will be sent back in a [ResponseMessage].
   /// [NotificationMessage]s are not expected to return results.
   FutureOr<ErrorOr<R>> handleMessage(IncomingMessage message) {
-    final params = convertParams(message.params);
+    if (!jsonHandler.validateParams(message.params)) {
+      return error(ErrorCodes.InvalidParams,
+          'Invalid params for ${message.method}', null);
+    }
+
+    final params = jsonHandler.convertParams(message.params);
     return handle(params);
   }
 }
@@ -86,11 +90,7 @@
   final LspAnalysisServer server;
   final Map<Method, MessageHandler> _messageHandlers = {};
 
-  ServerStateMessageHandler(this.server) {
-    // All server states support shutdown and exit.
-    registerHandler(new ShutdownMessageHandler(server));
-    registerHandler(new ExitMessageHandler(server));
-  }
+  ServerStateMessageHandler(this.server);
 
   ErrorOr<Object> failure<Object>(ErrorCodes code, String message,
           [String data]) =>
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 5f99c59..a1c6cf2 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -132,6 +132,10 @@
 
   LspPerformance performanceStats = new LspPerformance();
 
+  /// Whether or not the server is controlling the shutdown and will exit
+  /// automatically.
+  bool willExit = false;
+
   /**
    * Initialize a newly created server to send and receive messages to the given
    * [channel].
@@ -248,14 +252,14 @@
         // requests we've sent) then show an error.
         final completer = completers[id];
         if (completer == null) {
-          showError('Response with ID $id was unexpected');
+          showErrorMessageToUser('Response with ID $id was unexpected');
         } else {
           completers.remove(id);
           completer.complete(message);
         }
       },
       (stringID) {
-        showError('Unexpected String ID for response $stringID');
+        showErrorMessageToUser('Unexpected String ID for response $stringID');
       },
     );
   }
@@ -284,7 +288,7 @@
               sendErrorResponse(message, result.error);
             }
           } else {
-            showError('Unknown message type');
+            showErrorMessageToUser('Unknown message type');
           }
         } catch (error, stackTrace) {
           final errorMessage = message is ResponseMessage
@@ -345,11 +349,11 @@
     } else if (message is ResponseMessage) {
       // For bad response messages where we can't respond with an error, send it as
       // show instead of log.
-      showError(error.message);
+      showErrorMessageToUser(error.message);
     } else {
       // For notifications where we couldn't respond with an error, send it as
       // show instead of log.
-      showError(error.message);
+      showErrorMessageToUser(error.message);
     }
 
     // Handle fatal errors where the client/server state is out of sync and we
@@ -402,7 +406,7 @@
     message = exception == null ? message : '$message: $exception';
 
     // Show message (without stack) to the user.
-    showError(message);
+    showErrorMessageToUser(message);
 
     logException(message, exception, stackTrace);
   }
@@ -442,10 +446,14 @@
     return contextManager.isInAnalysisRoot(file);
   }
 
-  void showError(String message) {
+  void showErrorMessageToUser(String message) {
+    showMessageToUser(MessageType.Error, message);
+  }
+
+  void showMessageToUser(MessageType type, String message) {
     channel.sendNotification(new NotificationMessage(
       Method.window_showMessage,
-      new ShowMessageParams(MessageType.Error, message),
+      new ShowMessageParams(type, message),
       jsonRpcVersion,
     ));
   }
diff --git a/pkg/analysis_server/lib/src/nullability/constraint_gatherer.dart b/pkg/analysis_server/lib/src/nullability/constraint_gatherer.dart
index ec6f294..d0802ad 100644
--- a/pkg/analysis_server/lib/src/nullability/constraint_gatherer.dart
+++ b/pkg/analysis_server/lib/src/nullability/constraint_gatherer.dart
@@ -181,6 +181,11 @@
   }
 
   @override
+  DecoratedType visitBooleanLiteral(BooleanLiteral node) {
+    return DecoratedType(node.staticType, null);
+  }
+
+  @override
   DecoratedType visitClassDeclaration(ClassDeclaration node) {
     node.members.accept(this);
     return null;
@@ -217,7 +222,8 @@
       }
     } else {
       _handleAssignment(
-          getOrComputeElementType(node.declaredElement), defaultValue);
+          getOrComputeElementType(node.declaredElement), defaultValue,
+          canInsertChecks: false);
     }
     return null;
   }
@@ -234,8 +240,12 @@
     assert(_currentFunctionType == null);
     _currentFunctionType =
         _variables.decoratedElementType(node.declaredElement);
-    node.functionExpression.body.accept(this);
-    _currentFunctionType = null;
+    _inConditionalControlFlow = false;
+    try {
+      node.functionExpression.body.accept(this);
+    } finally {
+      _currentFunctionType = null;
+    }
     return null;
   }
 
@@ -259,16 +269,22 @@
     if (trueGuard != null) {
       _guards.add(trueGuard);
     }
-    node.thenStatement.accept(this);
-    if (trueGuard != null) {
-      _guards.removeLast();
+    try {
+      node.thenStatement.accept(this);
+    } finally {
+      if (trueGuard != null) {
+        _guards.removeLast();
+      }
     }
     if (falseGuard != null) {
       _guards.add(falseGuard);
     }
-    node.elseStatement?.accept(this);
-    if (falseGuard != null) {
-      _guards.removeLast();
+    try {
+      node.elseStatement?.accept(this);
+    } finally {
+      if (falseGuard != null) {
+        _guards.removeLast();
+      }
     }
     return null;
   }
@@ -284,8 +300,12 @@
     assert(_currentFunctionType == null);
     _currentFunctionType =
         _variables.decoratedElementType(node.declaredElement);
-    node.body.accept(this);
-    _currentFunctionType = null;
+    _inConditionalControlFlow = false;
+    try {
+      node.body.accept(this);
+    } finally {
+      _currentFunctionType = null;
+    }
     return null;
   }
 
@@ -400,14 +420,37 @@
   void _checkAssignment(DecoratedType destinationType, DecoratedType sourceType,
       Expression expression) {
     if (sourceType.nullable != null) {
-      if (destinationType.nullable != null) {
-        _recordConstraint(sourceType.nullable, destinationType.nullable);
-      } else {
-        assert(expression != null); // TODO(paulberry)
-        var checkNotNull = CheckExpression(expression);
-        _recordConstraint(sourceType.nullable, checkNotNull);
-        _variables.recordExpressionChecks(
-            expression, ExpressionChecks(_source, checkNotNull));
+      _guards.add(sourceType.nullable);
+      var destinationNonNullIntent = destinationType.nonNullIntent;
+      try {
+        CheckExpression checkNotNull;
+        if (expression != null) {
+          checkNotNull = CheckExpression(expression);
+          _variables.recordExpressionChecks(
+              _source, expression, ExpressionChecks(checkNotNull));
+        }
+        // nullable_src => nullable_dst | check_expr
+        _recordFact(ConstraintVariable.or(
+            _constraints, destinationType.nullable, checkNotNull));
+        if (checkNotNull != null) {
+          // nullable_src & nonNullIntent_dst => check_expr
+          if (destinationNonNullIntent != null) {
+            _recordConstraint(destinationNonNullIntent, checkNotNull);
+          }
+        }
+      } finally {
+        _guards.removeLast();
+      }
+      var sourceNonNullIntent = sourceType.nonNullIntent;
+      if (!_inConditionalControlFlow && sourceNonNullIntent != null) {
+        if (destinationType.nullable == null) {
+          // The destination type can never be nullable so this demonstrates
+          // non-null intent.
+          _recordFact(sourceNonNullIntent);
+        } else if (destinationNonNullIntent != null) {
+          // Propagate non-null intent from the destination to the source.
+          _recordConstraint(destinationNonNullIntent, sourceNonNullIntent);
+        }
       }
     }
     // TODO(paulberry): it's a cheat to pass in expression=null for the
@@ -449,9 +492,11 @@
   /// Creates the necessary constraint(s) for an assignment of the given
   /// [expression] to a destination whose type is [destinationType].
   DecoratedType _handleAssignment(
-      DecoratedType destinationType, Expression expression) {
+      DecoratedType destinationType, Expression expression,
+      {bool canInsertChecks = true}) {
     var sourceType = expression.accept(this);
-    _checkAssignment(destinationType, sourceType, expression);
+    _checkAssignment(
+        destinationType, sourceType, canInsertChecks ? expression : null);
     return sourceType;
   }
 
@@ -491,13 +536,17 @@
   void _recordConstraint(
       ConstraintVariable condition, ConstraintVariable consequence) {
     _guards.add(condition);
-    _recordFact(consequence);
-    _guards.removeLast();
+    try {
+      _recordFact(consequence);
+    } finally {
+      _guards.removeLast();
+    }
   }
 
   /// Records a constraint having [consequence] as its right hand side.  Any
   /// [_guards] are used as the right hand side.
   void _recordFact(ConstraintVariable consequence) {
+    assert(consequence != null);
     _constraints.record(_guards, consequence);
   }
 }
diff --git a/pkg/analysis_server/lib/src/nullability/constraint_variable_gatherer.dart b/pkg/analysis_server/lib/src/nullability/constraint_variable_gatherer.dart
index d3a89538..f917e72 100644
--- a/pkg/analysis_server/lib/src/nullability/constraint_variable_gatherer.dart
+++ b/pkg/analysis_server/lib/src/nullability/constraint_variable_gatherer.dart
@@ -149,10 +149,9 @@
     var nullable = node.question == null
         ? TypeIsNullable(node.end)
         : ConstraintVariable.always;
-    var decoratedType = DecoratedTypeAnnotation(
-        type, nullable, _source, node.end,
+    var decoratedType = DecoratedTypeAnnotation(type, nullable, node.end,
         typeArguments: typeArguments);
-    _variables.recordDecoratedTypeAnnotation(node, decoratedType);
+    _variables.recordDecoratedTypeAnnotation(_source, node, decoratedType);
     return decoratedType;
   }
 
@@ -172,8 +171,11 @@
         namedParameters: {},
         namedParameterOptionalVariables: {});
     _currentFunctionType = functionType;
-    parameters.accept(this);
-    _currentFunctionType = previousFunctionType;
+    try {
+      parameters.accept(this);
+    } finally {
+      _currentFunctionType = previousFunctionType;
+    }
     _variables.recordDecoratedElementType(declaredElement, functionType);
   }
 }
@@ -190,7 +192,7 @@
 
   /// Associates decorated type information with the given [type] node.
   void recordDecoratedTypeAnnotation(
-      TypeAnnotation node, DecoratedTypeAnnotation type);
+      Source source, TypeAnnotation node, DecoratedTypeAnnotation type);
 
   /// Associates a constraint variable with the question of whether the given
   /// named parameter should be optional (should not have a `required`
@@ -229,5 +231,6 @@
   void recordDecoratedExpressionType(Expression node, DecoratedType type);
 
   /// Associates a set of nullability checks with the given expression [node].
-  void recordExpressionChecks(Expression expression, ExpressionChecks checks);
+  void recordExpressionChecks(
+      Source source, Expression expression, ExpressionChecks checks);
 }
diff --git a/pkg/analysis_server/lib/src/nullability/decorated_type.dart b/pkg/analysis_server/lib/src/nullability/decorated_type.dart
index 53c023b..2dde11f 100644
--- a/pkg/analysis_server/lib/src/nullability/decorated_type.dart
+++ b/pkg/analysis_server/lib/src/nullability/decorated_type.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' show SourceEdit;
 
 /// Representation of a type in the code to be migrated.  In addition to
@@ -178,13 +177,10 @@
 /// the source code to reflect its nullability.
 class DecoratedTypeAnnotation extends DecoratedType
     implements PotentialModification {
-  @override
-  final Source source;
-
   final int _offset;
 
   DecoratedTypeAnnotation(
-      DartType type, ConstraintVariable nullable, this.source, this._offset,
+      DartType type, ConstraintVariable nullable, this._offset,
       {List<DecoratedType> typeArguments = const []})
       : super(type, nullable, typeArguments: typeArguments);
 
diff --git a/pkg/analysis_server/lib/src/nullability/expression_checks.dart b/pkg/analysis_server/lib/src/nullability/expression_checks.dart
index 3c4af10..14f47db 100644
--- a/pkg/analysis_server/lib/src/nullability/expression_checks.dart
+++ b/pkg/analysis_server/lib/src/nullability/expression_checks.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/nullability/transitional_api.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
 /// Container for information gathered during nullability migration about the
@@ -14,14 +13,11 @@
 /// that the expression is not null.  We need to add other checks, e.g. to check
 /// that a List<int?> is actually a List<int>.
 class ExpressionChecks extends PotentialModification {
-  @override
-  final Source source;
-
   /// Constraint variable whose value will be `true` if this expression requires
   /// a null check.
   final CheckExpression nullCheck;
 
-  ExpressionChecks(this.source, this.nullCheck);
+  ExpressionChecks(this.nullCheck);
 
   @override
   bool get isEmpty => !nullCheck.value;
diff --git a/pkg/analysis_server/lib/src/nullability/provisional_api.dart b/pkg/analysis_server/lib/src/nullability/provisional_api.dart
index 6352b4d..3fa023b 100644
--- a/pkg/analysis_server/lib/src/nullability/provisional_api.dart
+++ b/pkg/analysis_server/lib/src/nullability/provisional_api.dart
@@ -77,9 +77,16 @@
             permissive: permissive, assumptions: assumptions);
 
   void finish() {
-    _analyzerMigration.finish().forEach((pm) {
-      listener.addFix(_SingleNullabilityFix(pm));
-    });
+    for (var entry in _analyzerMigration.finish().entries) {
+      var source = entry.key;
+      for (var potentialModification in entry.value) {
+        var fix = _SingleNullabilityFix(source, potentialModification);
+        listener.addFix(fix);
+        for (var edit in potentialModification.modifications) {
+          listener.addEdit(fix, edit);
+        }
+      }
+    }
   }
 
   void prepareInput(ResolvedUnitResult result) {
@@ -94,6 +101,10 @@
 /// [NullabilityMigrationListener] is used by [NullabilityMigration]
 /// to communicate source changes or "fixes" to the client.
 abstract class NullabilityMigrationListener {
+  /// [addEdit] is called once for each source edit, in the order in which they
+  /// appear in the source file.
+  void addEdit(SingleNullabilityFix fix, SourceEdit edit);
+
   /// [addFix] is called once for each source change.
   void addFix(SingleNullabilityFix fix);
 }
@@ -110,26 +121,19 @@
 
   /// File to change.
   Source get source;
-
-  /// Individual source edits to achieve the change.  May be returned in any
-  /// order.
-  Iterable<SourceEdit> get sourceEdits;
 }
 
 /// Implementation of [SingleNullabilityFix] used internally by
 /// [NullabilityMigration].
 class _SingleNullabilityFix extends SingleNullabilityFix {
   @override
-  final List<SourceEdit> sourceEdits;
-
-  @override
   final Source source;
 
   @override
   final NullabilityFixKind kind;
 
   factory _SingleNullabilityFix(
-      analyzer.PotentialModification potentialModification) {
+      Source source, analyzer.PotentialModification potentialModification) {
     // TODO(paulberry): once everything is migrated into the analysis server,
     // the migration engine can just create SingleNullabilityFix objects
     // directly and set their kind appropriately; we won't need to translate the
@@ -148,11 +152,10 @@
     } else {
       throw new UnimplementedError('TODO(paulberry)');
     }
-    return _SingleNullabilityFix._(potentialModification.modifications.toList(),
-        potentialModification.source, kind);
+    return _SingleNullabilityFix._(source, kind);
   }
 
-  _SingleNullabilityFix._(this.sourceEdits, this.source, this.kind);
+  _SingleNullabilityFix._(this.source, this.kind);
 
   /// TODO(paulberry): do something better
   Location get location => null;
diff --git a/pkg/analysis_server/lib/src/nullability/transitional_api.dart b/pkg/analysis_server/lib/src/nullability/transitional_api.dart
index 4f0c81a..ff2a53f 100644
--- a/pkg/analysis_server/lib/src/nullability/transitional_api.dart
+++ b/pkg/analysis_server/lib/src/nullability/transitional_api.dart
@@ -41,11 +41,7 @@
 
   final _KeepNode elseStatement;
 
-  @override
-  final Source source;
-
-  factory ConditionalModification(
-      Source source, AstNode node, ConditionalDiscard discard) {
+  factory ConditionalModification(AstNode node, ConditionalDiscard discard) {
     if (node is IfStatement) {
       return ConditionalModification._(
           node.offset,
@@ -54,22 +50,14 @@
           discard,
           _KeepNode(node.condition),
           _KeepNode(node.thenStatement),
-          _KeepNode(node.elseStatement),
-          source);
+          _KeepNode(node.elseStatement));
     } else {
       throw new UnimplementedError('TODO(paulberry)');
     }
   }
 
-  ConditionalModification._(
-      this.offset,
-      this.end,
-      this.isStatement,
-      this.discard,
-      this.condition,
-      this.thenStatement,
-      this.elseStatement,
-      this.source);
+  ConditionalModification._(this.offset, this.end, this.isStatement,
+      this.discard, this.condition, this.thenStatement, this.elseStatement);
 
   @override
   bool get isEmpty => discard.keepTrue.value && discard.keepFalse.value;
@@ -171,7 +159,7 @@
       this.assumptions: const NullabilityMigrationAssumptions()})
       : _permissive = permissive;
 
-  List<PotentialModification> finish() {
+  Map<Source, List<PotentialModification>> finish() {
     _constraints.applyHeuristics();
     return _variables.getPotentialModifications();
   }
@@ -205,21 +193,18 @@
       {this.defaultParameterHandling:
           DefaultParameterHandling.option2_addRequiredNamedParameters,
       this.namedNoDefaultParameterHeuristic:
-          NamedNoDefaultParameterHeuristic.assumeRequired});
+          NamedNoDefaultParameterHeuristic.assumeNullable});
 }
 
 /// Records information about the possible addition of a `@required` annotation
 /// to the source code.
 class PotentiallyAddRequired extends PotentialModification {
-  @override
-  final Source source;
-
   final ConstraintVariable _optionalVariable;
 
   final int _offset;
 
   PotentiallyAddRequired(
-      this.source, DefaultFormalParameter parameter, this._optionalVariable)
+      DefaultFormalParameter parameter, this._optionalVariable)
       : _offset = parameter.offset;
 
   @override
@@ -238,14 +223,12 @@
   /// Gets the individual migrations that need to be done, considering the
   /// solution to the constraint equations.
   Iterable<SourceEdit> get modifications;
-
-  Source get source;
 }
 
 class Variables implements VariableRecorder, VariableRepository {
   final _decoratedElementTypes = <Element, DecoratedType>{};
 
-  final _potentialModifications = <PotentialModification>[];
+  final _potentialModifications = <Source, List<PotentialModification>>{};
 
   @override
   DecoratedType decoratedElementType(Element element, {bool create: false}) =>
@@ -253,14 +236,14 @@
           ? DecoratedType.forElement(element)
           : throw StateError('No element found');
 
-  List<PotentialModification> getPotentialModifications() =>
-      _potentialModifications.where((m) => !m.isEmpty).toList();
+  Map<Source, List<PotentialModification>> getPotentialModifications() =>
+      _potentialModifications;
 
   @override
   void recordConditionalDiscard(
       Source source, AstNode node, ConditionalDiscard conditionalDiscard) {
-    _potentialModifications
-        .add(ConditionalModification(source, node, conditionalDiscard));
+    _addPotentialModification(
+        source, ConditionalModification(node, conditionalDiscard));
   }
 
   void recordDecoratedElementType(Element element, DecoratedType type) {
@@ -270,20 +253,26 @@
   void recordDecoratedExpressionType(Expression node, DecoratedType type) {}
 
   void recordDecoratedTypeAnnotation(
-      TypeAnnotation node, DecoratedTypeAnnotation type) {
-    _potentialModifications.add(type);
+      Source source, TypeAnnotation node, DecoratedTypeAnnotation type) {
+    _addPotentialModification(source, type);
   }
 
   @override
-  void recordExpressionChecks(Expression expression, ExpressionChecks checks) {
-    _potentialModifications.add(checks);
+  void recordExpressionChecks(
+      Source source, Expression expression, ExpressionChecks checks) {
+    _addPotentialModification(source, checks);
   }
 
   @override
   void recordPossiblyOptional(Source source, DefaultFormalParameter parameter,
       ConstraintVariable variable) {
-    _potentialModifications
-        .add(PotentiallyAddRequired(source, parameter, variable));
+    _addPotentialModification(
+        source, PotentiallyAddRequired(parameter, variable));
+  }
+
+  void _addPotentialModification(
+      Source source, PotentialModification potentialModification) {
+    (_potentialModifications[source] ??= []).add(potentialModification);
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index 87aa99d..f275ee9 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -14,6 +14,7 @@
 import 'package:analysis_server/src/domains/analysis/implemented_dart.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -116,24 +117,28 @@
   });
 }
 
-void sendAnalysisNotificationOutline(AnalysisServer server, String file,
-    LineInfo lineInfo, SourceKind sourceKind, CompilationUnit dartUnit) {
+void sendAnalysisNotificationOutline(
+    AnalysisServer server, ResolvedUnitResult resolvedUnit) {
   _sendNotification(server, () {
-    // compute FileKind
-    protocol.FileKind fileKind = protocol.FileKind.LIBRARY;
-    if (sourceKind == SourceKind.LIBRARY) {
-      fileKind = protocol.FileKind.LIBRARY;
-    } else if (sourceKind == SourceKind.PART) {
+    protocol.FileKind fileKind;
+    if (resolvedUnit.unit.directives.any((d) => d is PartOfDirective)) {
       fileKind = protocol.FileKind.PART;
+    } else {
+      fileKind = protocol.FileKind.LIBRARY;
     }
+
     // compute library name
-    String libraryName = _computeLibraryName(dartUnit);
+    String libraryName = _computeLibraryName(resolvedUnit.unit);
+
     // compute Outline
-    var computer = new DartUnitOutlineComputer(file, lineInfo, dartUnit,
-        withBasicFlutter: true);
-    protocol.Outline outline = computer.compute();
+    protocol.Outline outline = new DartUnitOutlineComputer(
+      resolvedUnit,
+      withBasicFlutter: true,
+    ).compute();
+
     // send notification
-    var params = new protocol.AnalysisOutlineParams(file, fileKind, outline,
+    var params = new protocol.AnalysisOutlineParams(
+        resolvedUnit.path, fileKind, outline,
         libraryName: libraryName);
     server.sendNotification(params.toNotification());
   });
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
index ecfe285..6ecd84c 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
@@ -2,11 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:convert';
+
 import 'package:analysis_server/src/plugin/plugin_locator.dart';
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:path/src/context.dart';
 
@@ -98,7 +101,18 @@
    * [driver].
    */
   String _getSdkPath(AnalysisDriver driver) {
-    String sdkRoot = driver.sourceFactory.forUri('dart:core').fullName;
+    var coreSource = driver.sourceFactory.forUri('dart:core');
+
+    // TODO(scheglov) Debug for https://github.com/dart-lang/sdk/issues/35226
+    if (coreSource == null) {
+      var sdk = driver.sourceFactory.dartSdk;
+      if (sdk is AbstractDartSdk) {
+        var sdkJson = JsonEncoder.withIndent('  ').convert(sdk.debugInfo());
+        throw StateError('No dart:core, sdk: $sdkJson');
+      }
+    }
+
+    String sdkRoot = coreSource.fullName;
     while (resourceProvider.pathContext.basename(sdkRoot) != 'lib') {
       String parent = resourceProvider.pathContext.dirname(sdkRoot);
       if (parent == sdkRoot) {
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 305b455..1d493ed 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -276,19 +276,6 @@
   static const String TRAIN_USING = "train-using";
 
   /**
-   * User Experience, Experiment #1. This experiment changes the notion of
-   * what analysis roots are and priority files: the analysis root is set to be
-   * the priority files' containing directory.
-   */
-  static const String UX_EXPERIMENT_1 = "ux-experiment-1";
-
-  /**
-   * User Experience, Experiment #2. This experiment introduces the notion of an
-   * intermittent file system.
-   */
-  static const String UX_EXPERIMENT_2 = "ux-experiment-2";
-
-  /**
    * The instrumentation server that is to be used by the analysis server.
    */
   InstrumentationServer instrumentationServer;
@@ -333,8 +320,6 @@
     analysisServerOptions.cacheFolder = results[CACHE_FOLDER];
     analysisServerOptions.useFastaParser = results[USE_FASTA_PARSER];
     analysisServerOptions.useLanguageServerProtocol = results[USE_LSP];
-    analysisServerOptions.enableUXExperiment1 = results[UX_EXPERIMENT_1];
-    analysisServerOptions.enableUXExperiment2 = results[UX_EXPERIMENT_2];
 
     bool disableAnalyticsForSession = results[SUPPRESS_ANALYTICS_FLAG];
     if (results.wasParsed(TRAIN_USING)) {
@@ -570,8 +555,12 @@
       LspStdioAnalysisServer stdioServer =
           new LspStdioAnalysisServer(socketServer);
       stdioServer.serveStdio().then((_) async {
-        socketServer.analysisServer.shutdown();
-        exit(0);
+        // Only shutdown the server and exit if the server is not already
+        // handling the shutdown.
+        if (!socketServer.analysisServer.willExit) {
+          socketServer.analysisServer.shutdown();
+          exit(0);
+        }
       });
     });
   }
@@ -699,16 +688,6 @@
     parser.addOption(TRAIN_USING,
         help: "Pass in a directory to analyze for purposes of training an "
             "analysis server snapshot.");
-    parser.addFlag(UX_EXPERIMENT_1,
-        help: "User Experience, Experiment #1, "
-            "this experiment changes the notion of analysis roots and priority "
-            "files.",
-        hide: true);
-    parser.addFlag(UX_EXPERIMENT_2,
-        help: "User Experience, Experiment #2, "
-            "this experiment introduces the notion of an intermittent file "
-            "system.",
-        hide: true);
 
     return parser;
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
index 4c4b692..3558966 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
@@ -8,7 +8,7 @@
     hide Element, ElementKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/utilities.dart';
-import 'package:analysis_server/src/utilities/flutter.dart' as flutter;
+import 'package:analysis_server/src/utilities/flutter.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -182,6 +182,7 @@
       // Optionally add Flutter child widget details.
       Element element = parameter.enclosingElement;
       if (element is ConstructorElement) {
+        var flutter = Flutter.of(request.result.session);
         if (flutter.isWidget(element.enclosingElement)) {
           String value = getDefaultStringParameterValue(parameter);
           if (value == '<Widget>[]') {
@@ -212,7 +213,6 @@
       if (parameter is FieldFormalParameterElement) {
         _setDocumentation(suggestion, parameter.field?.documentationComment);
         suggestion.element = convertElement(parameter);
-        suggestion.elementUri = parameter.source.toString();
       }
 
       suggestions.add(suggestion);
@@ -260,6 +260,7 @@
   }
 
   bool _isInFlutterCreation(DartCompletionRequest request) {
+    var flutter = Flutter.of(request.result.session);
     AstNode containingNode = request?.target?.containingNode;
     InstanceCreationExpression newExpr = containingNode != null
         ? flutter.identifyNewExpression(containingNode.parent)
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index 7661185..a53579e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -60,15 +60,15 @@
   /// fill this set with kinds of elements that are applicable at the
   /// completion location, so should be suggested from available suggestion
   /// sets.
-  final Set<protocol.ElementKind> includedSuggestionKinds;
+  final Set<protocol.ElementKind> includedElementKinds;
 
-  /// If [includedSuggestionKinds] is not null, must be also not `null`, and
+  /// If [includedElementKinds] is not null, must be also not `null`, and
   /// will be filled with tags for suggestions that should be given higher
   /// relevance than other included suggestions.
   final List<IncludedSuggestionRelevanceTag> includedSuggestionRelevanceTags;
 
   DartCompletionManager({
-    this.includedSuggestionKinds,
+    this.includedElementKinds,
     this.includedSuggestionRelevanceTags,
   });
 
@@ -121,8 +121,8 @@
       new VariableNameContributor()
     ];
 
-    if (includedSuggestionKinds != null) {
-      _addIncludedSuggestionKinds(dartRequest);
+    if (includedElementKinds != null) {
+      _addIncludedElementKinds(dartRequest);
       _addIncludedSuggestionRelevanceTags(dartRequest);
     } else {
       contributors.add(new ImportedReferenceContributor());
@@ -177,12 +177,12 @@
     return suggestions;
   }
 
-  void _addIncludedSuggestionKinds(DartCompletionRequestImpl request) {
+  void _addIncludedElementKinds(DartCompletionRequestImpl request) {
     var opType = request.opType;
 
     if (!opType.includeIdentifiers) return;
 
-    var kinds = includedSuggestionKinds;
+    var kinds = includedElementKinds;
     if (kinds != null) {
       if (opType.includeTypeNameSuggestions) {
         kinds.add(protocol.ElementKind.CLASS);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
index ef19706..5a66b56 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
@@ -6,7 +6,7 @@
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
-import 'package:analysis_server/src/utilities/flutter.dart' as flutter;
+import 'package:analysis_server/src/utilities/flutter.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -134,7 +134,8 @@
     }
     if (element is MethodElement &&
         element.name == 'setState' &&
-        flutter.isExactState(element.enclosingElement)) {
+        Flutter.of(request.result.session)
+            .isExactState(element.enclosingElement)) {
       // Find the line indentation.
       String content = request.result.content;
       int lineStartOffset = request.offset;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index 64bac8e..ecc25d3 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -306,7 +306,7 @@
   }
 
   @override
-  visitForEachStatement(ForEachStatement node) {
+  visitForEachParts(ForEachParts node) {
     if (entity == node.inKeyword) {
       Token previous = node.findPrevious(node.inKeyword);
       if (previous is SyntheticStringToken && previous.lexeme == 'in') {
@@ -344,19 +344,13 @@
   }
 
   @override
-  visitForStatement(ForStatement node) {
-    // Actual: for (va^)
-    // Parsed: for (va^; ;)
-    if (node.initialization == entity && entity is SimpleIdentifier) {
-      if (_isNextTokenSynthetic(entity, TokenType.SEMICOLON)) {
-        _addSuggestion(Keyword.VAR, DART_RELEVANCE_HIGH);
-      }
-    }
+  visitForParts(ForParts node) {
     // Actual: for (int x i^)
     // Parsed: for (int x; i^;)
     // Handle the degenerate case while typing - for (int x i^)
     if (node.condition == entity &&
         entity is SimpleIdentifier &&
+        node is ForPartsWithDeclarations &&
         node.variables != null) {
       if (_isPreviousTokenSynthetic(entity, TokenType.SEMICOLON)) {
         _addSuggestion(Keyword.IN, DART_RELEVANCE_HIGH);
@@ -365,6 +359,15 @@
   }
 
   @override
+  visitForStatement2(ForStatement2 node) {
+    // Actual: for (va^)
+    // Parsed: for (va^; ;)
+    if (node.forLoopParts == entity) {
+      _addSuggestion(Keyword.VAR, DART_RELEVANCE_HIGH);
+    }
+  }
+
+  @override
   visitFunctionExpression(FunctionExpression node) {
     if (entity == node.body) {
       FunctionBody body = node.body;
@@ -776,9 +779,7 @@
       node.thisOrAncestorOfType<DoStatement>() != null;
 
   bool _inForLoop(AstNode node) =>
-      node.thisOrAncestorMatching(
-          (p) => p is ForStatement || p is ForEachStatement) !=
-      null;
+      node.thisOrAncestorMatching((p) => p is ForStatement2) != null;
 
   bool _inLoop(AstNode node) =>
       _inDoLoop(node) || _inForLoop(node) || _inWhileLoop(node);
@@ -813,15 +814,6 @@
     return false;
   }
 
-  static bool _isNextTokenSynthetic(Object entity, TokenType type) {
-    if (entity is AstNode) {
-      Token token = entity.beginToken;
-      Token nextToken = token.next;
-      return nextToken.isSynthetic && nextToken.type == type;
-    }
-    return false;
-  }
-
   static bool _isPreviousTokenSynthetic(Object entity, TokenType type) {
     if (entity is AstNode) {
       Token token = entity.beginToken;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
index d89ed2f..77b4ebf 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
@@ -103,7 +103,6 @@
         suggestion.element = createLocalElement(
             request.source, protocol.ElementKind.LABEL, label.label,
             returnType: NO_RETURN_TYPE);
-        suggestion.elementUri = request.source.toString();
       }
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index b1d8459..50be06c 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -54,8 +54,10 @@
 
         // Do not suggest loop variable of a ForEachStatement
         // when completing the expression of the ForEachStatement
-        if (node is ForEachStatement) {
+        if (node is ForStatement2 && node.forLoopParts is ForEachParts) {
           node = node.parent;
+        } else if (node is ForEachParts) {
+          node = node.parent.parent;
         }
 
         _LocalVisitor visitor = new _LocalVisitor(
@@ -295,6 +297,19 @@
   }
 
   @override
+  void declaredMixin(MixinDeclaration declaration) {
+    if (optype.includeTypeNameSuggestions) {
+      _addLocalSuggestion_includeTypeNameSuggestions(
+          declaration.documentationComment,
+          declaration.name,
+          NO_RETURN_TYPE,
+          protocol.ElementKind.MIXIN,
+          isAbstract: true,
+          isDeprecated: isDeprecated(declaration));
+    }
+  }
+
+  @override
   void declaredParam(SimpleIdentifier id, TypeAnnotation typeName) {
     if (optype.includeReturnValueSuggestions) {
       _addLocalSuggestion_includeReturnValueSuggestions(
@@ -358,7 +373,6 @@
           isDeprecated: isDeprecated,
           parameters: param?.toSource(),
           returnType: typeName);
-      suggestion.elementUri = request.source.toString();
       if ((elemKind == protocol.ElementKind.METHOD ||
               elemKind == protocol.ElementKind.FUNCTION) &&
           param != null) {
@@ -400,7 +414,6 @@
             constantDeclaration.name.length,
             0,
             0));
-    suggestion.elementUri = request.source.uri.toString();
   }
 
   void _addLocalSuggestion_includeReturnValueSuggestions(
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
index e2d567d..cd4c94c 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
@@ -117,7 +117,6 @@
         false,
         displayText: displayText);
     suggestion.element = protocol.convertElement(signature.element);
-    suggestion.elementUri = signature.element.source.toString();
     return suggestion;
   }
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index c7186e2..abce4e7 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -10,21 +10,16 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/visitor.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/util/comment.dart';
-import 'package:path/path.dart' as path;
 
 /**
- * Return a suggestion based upon the given element
- * or `null` if a suggestion is not appropriate for the given element.
- * If the suggestion is not currently in scope, then specify
- * importForSource as the source to which an import should be added.
+ * Return a suggestion based upon the given element or `null` if a suggestion
+ * is not appropriate for the given element.
  */
 CompletionSuggestion createSuggestion(Element element,
     {String completion,
     CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-    int relevance: DART_RELEVANCE_DEFAULT,
-    Source importForSource}) {
+    int relevance: DART_RELEVANCE_DEFAULT}) {
   if (element == null) {
     return null;
   }
@@ -51,7 +46,6 @@
   suggestion.docSummary = getDartDocSummary(doc);
 
   suggestion.element = protocol.convertElement(element);
-  suggestion.elementUri = element.source.uri.toString();
   Element enclosingElement = element.enclosingElement;
   if (enclosingElement is ClassElement) {
     suggestion.declaringType = enclosingElement.displayName;
@@ -79,34 +73,6 @@
     addDefaultArgDetails(
         suggestion, element, requiredParameters, namedParameters);
   }
-  if (importForSource != null) {
-    String srcPath = path.dirname(importForSource.fullName);
-    LibraryElement libElem = element.library;
-    if (libElem != null) {
-      Source libSource = libElem.source;
-      if (libSource != null) {
-        UriKind uriKind = libSource.uriKind;
-        if (uriKind == UriKind.DART_URI) {
-          suggestion.importUri = libSource.uri.toString();
-        } else if (uriKind == UriKind.PACKAGE_URI) {
-          suggestion.importUri = libSource.uri.toString();
-        } else if (uriKind == UriKind.FILE_URI &&
-            element.source.uriKind == UriKind.FILE_URI) {
-          try {
-            suggestion.importUri =
-                path.relative(libSource.fullName, from: srcPath);
-          } catch (_) {
-            // ignored
-          }
-        }
-      }
-    }
-    if (suggestion.importUri == null) {
-      // Do not include out of scope suggestions
-      // for which we cannot determine an import
-      return null;
-    }
-  }
   return suggestion;
 }
 
@@ -166,7 +132,6 @@
     CompletionSuggestion suggestion = createSuggestion(element,
         completion: completion, kind: kind, relevance: relevance);
     if (suggestion != null) {
-      suggestion.elementUri = element.source.uri.toString();
       if (element.isSynthetic && element is PropertyAccessorElement) {
         String cacheKey;
         if (element.isGetter) {
diff --git a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
index 86231ae..b159f5d 100644
--- a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
@@ -460,8 +460,7 @@
         // Disallow control-flow statements.
         if (astNode is DoStatement ||
             astNode is IfStatement ||
-            astNode is ForEachStatement ||
-            astNode is ForStatement ||
+            astNode is ForStatement2 ||
             astNode is SwitchStatement ||
             astNode is TryStatement ||
             astNode is WhileStatement) {
diff --git a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
index 303ddd5..f32aa2d 100644
--- a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
@@ -185,8 +185,7 @@
     if (node is Statement) {
       if (errors.isEmpty) {
         if (_complete_ifStatement() ||
-            _complete_forStatement() ||
-            _complete_forEachStatement() ||
+            _complete_forStatement2() ||
             _complete_whileStatement() ||
             _complete_controlFlowBlock()) {
           return completion;
@@ -194,8 +193,7 @@
       } else {
         if (_complete_ifStatement() ||
             _complete_doStatement() ||
-            _complete_forStatement() ||
-            _complete_forEachStatement() ||
+            _complete_forStatement2() ||
             _complete_functionDeclarationStatement() ||
             _complete_switchStatement() ||
             _complete_tryStatement() ||
@@ -395,8 +393,7 @@
     }
     AstNode outer = node.parent.parent;
     if (!(outer is DoStatement ||
-        outer is ForStatement ||
-        outer is ForEachStatement ||
+        outer is ForStatement2 ||
         outer is IfStatement ||
         outer is WhileStatement)) {
       return false;
@@ -523,17 +520,22 @@
     return true;
   }
 
-  bool _complete_forEachStatement() {
-    if (node is! ForEachStatement) {
-      return false;
+  bool _complete_forEachStatement(
+      ForStatement2 forNode, ForEachParts forEachParts) {
+    AstNode name;
+    if (forEachParts is ForEachPartsWithIdentifier) {
+      name = forEachParts.identifier;
+    } else if (forEachParts is ForEachPartsWithDeclaration) {
+      name = forEachParts.loopVariable;
+    } else {
+      throw new StateError('Unrecognized for loop parts');
     }
-    ForEachStatement forNode = node;
     return _complete_forEachStatementRest(
         forNode.forKeyword,
         forNode.leftParenthesis,
-        forNode.identifier ?? forNode.loopVariable,
-        forNode.inKeyword,
-        forNode.iterable,
+        name,
+        forEachParts.inKeyword,
+        forEachParts.iterable,
         forNode.rightParenthesis,
         forNode.body);
   }
@@ -584,11 +586,7 @@
     return true;
   }
 
-  bool _complete_forStatement() {
-    if (node is! ForStatement) {
-      return false;
-    }
-    ForStatement forNode = node;
+  bool _complete_forStatement(ForStatement2 forNode, ForParts forParts) {
     SourceBuilder sb;
     int replacementLength = 0;
     if (forNode.leftParenthesis.isSynthetic) {
@@ -601,21 +599,21 @@
       sb.setExitOffset();
       sb.append(')');
     } else {
-      if (!forNode.rightSeparator.isSynthetic) {
+      if (!forParts.rightSeparator.isSynthetic) {
         // Fully-defined init, cond, updaters so nothing more needed here.
         // emptyParts, noError
         sb = new SourceBuilder(file, forNode.rightParenthesis.offset + 1);
-      } else if (!forNode.leftSeparator.isSynthetic) {
-        if (_isSyntheticExpression(forNode.condition)) {
+      } else if (!forParts.leftSeparator.isSynthetic) {
+        if (_isSyntheticExpression(forParts.condition)) {
           String text = utils
               .getNodeText(forNode)
-              .substring(forNode.leftSeparator.offset - forNode.offset);
+              .substring(forParts.leftSeparator.offset - forNode.offset);
           Match match =
               new RegExp(r';\s*(/\*.*\*/\s*)?\)[ \t]*').matchAsPrefix(text);
           if (match != null) {
             // emptyCondition, emptyInitializersEmptyCondition
             replacementLength = match.end - match.start;
-            sb = new SourceBuilder(file, forNode.leftSeparator.offset);
+            sb = new SourceBuilder(file, forParts.leftSeparator.offset);
             sb.append('; ${match.group(1) == null ? '' : match.group(1)}; )');
             String suffix = text.substring(match.end);
             if (suffix.trim().isNotEmpty) {
@@ -627,7 +625,7 @@
                 replacementLength -= eol.length;
               }
             }
-            exitPosition = _newPosition(forNode.leftSeparator.offset + 2);
+            exitPosition = _newPosition(forParts.leftSeparator.offset + 2);
           } else {
             return false; // Line comment in condition
           }
@@ -636,25 +634,27 @@
           sb = new SourceBuilder(file, forNode.rightParenthesis.offset);
           replacementLength = 1;
           sb.append('; )');
-          exitPosition = _newPosition(forNode.rightSeparator.offset + 2);
+          exitPosition = _newPosition(forParts.rightSeparator.offset + 2);
         }
-      } else if (_isSyntheticExpression(forNode.initialization)) {
+      } else if (forParts is ForPartsWithExpression &&
+          _isSyntheticExpression(forParts.initialization)) {
         // emptyInitializers
         exitPosition = _newPosition(forNode.rightParenthesis.offset);
         sb = new SourceBuilder(file, forNode.rightParenthesis.offset);
-      } else if (forNode.initialization is SimpleIdentifier &&
-          forNode.initialization.beginToken.lexeme == 'in') {
+      } else if (forParts is ForPartsWithExpression &&
+          forParts.initialization is SimpleIdentifier &&
+          forParts.initialization.beginToken.lexeme == 'in') {
         // looks like a for/each statement missing the loop variable
         return _complete_forEachStatementRest(
             forNode.forKeyword,
             forNode.leftParenthesis,
             null,
-            forNode.initialization.beginToken,
+            forParts.initialization.beginToken,
             null,
             forNode.rightParenthesis,
             forNode.body);
       } else {
-        int start = forNode.condition.offset + forNode.condition.length;
+        int start = forParts.condition.offset + forParts.condition.length;
         String text =
             utils.getNodeText(forNode).substring(start - forNode.offset);
         if (text.startsWith(new RegExp(r'\s*\)'))) {
@@ -687,6 +687,19 @@
     return true;
   }
 
+  bool _complete_forStatement2() {
+    var node = this.node;
+    if (node is ForStatement2) {
+      var forLoopParts = node.forLoopParts;
+      if (forLoopParts is ForParts) {
+        return _complete_forStatement(node, forLoopParts);
+      } else if (forLoopParts is ForEachParts) {
+        return _complete_forEachStatement(node, forLoopParts);
+      }
+    }
+    return false;
+  }
+
   bool _complete_functionDeclaration() {
     if (node is! MethodDeclaration && node is! FunctionDeclaration) {
       return false;
@@ -1141,7 +1154,9 @@
       return true;
     }
     AstNode p = n.parent;
-    return p is! Statement && p?.parent is! Statement;
+    return p is! Statement &&
+        p?.parent is! Statement &&
+        p?.parent?.parent is! Statement;
   }
 
   bool _isSyntheticExpression(Expression expr) {
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 7bc89e0..2b18345 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -104,6 +104,9 @@
       'dart.assist.convert.toConstructorNormalParameter',
       30,
       "Convert to normal parameter");
+  static const CONVERT_TO_NULL_AWARE = const AssistKind(
+      'dart.assist.convert.toNullAware', 30, "Convert to use '?.'",
+      associatedErrorCodes: <String>['prefer_null_aware_operators']);
   static const CONVERT_TO_SET_LITERAL = const AssistKind(
       'dart.assist.convert.toSetLiteral', 30, "Convert to set literal",
       // todo (brianwilkerson): unify w/ fix
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 18b210c..f092854 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -13,9 +13,10 @@
 import 'package:analysis_server/src/services/correction/statement_analyzer.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analysis_server/src/services/search/hierarchy.dart';
-import 'package:analysis_server/src/utilities/flutter.dart' as flutter;
+import 'package:analysis_server/src/utilities/flutter.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/precedence.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -53,6 +54,7 @@
   final TypeProvider typeProvider;
   final String file;
   final CorrectionUtils utils;
+  final Flutter flutter;
 
   final List<Assist> assists = <Assist>[];
 
@@ -66,7 +68,8 @@
         sessionHelper = AnalysisSessionHelper(context.resolveResult.session),
         typeProvider = context.resolveResult.typeProvider,
         file = context.resolveResult.path,
-        utils = new CorrectionUtils(context.resolveResult);
+        utils = new CorrectionUtils(context.resolveResult),
+        flutter = Flutter.of(context.resolveResult.session);
 
   /**
    * Returns the EOL to use for this [CompilationUnit].
@@ -114,6 +117,7 @@
     await _addProposal_convertToIsNotEmpty();
     await _addProposal_convertToMultilineString();
     await _addProposal_convertToNormalParameter();
+    await _addProposal_convertToNullAware();
     await _addProposal_convertToSingleQuotedString();
     await _addProposal_encapsulateField();
     await _addProposal_exchangeOperands();
@@ -219,12 +223,16 @@
     DeclaredIdentifier declaredIdentifier =
         node.thisOrAncestorOfType<DeclaredIdentifier>();
     if (declaredIdentifier == null) {
-      ForEachStatement forEach = node.thisOrAncestorOfType<ForEachStatement>();
+      ForStatement2 forEach = node.thisOrAncestorMatching(
+          (node) => node is ForStatement2 && node.forLoopParts is ForEachParts);
+      ForEachParts forEachParts = forEach?.forLoopParts;
       int offset = node.offset;
       if (forEach != null &&
-          forEach.iterable != null &&
-          offset < forEach.iterable.offset) {
-        declaredIdentifier = forEach.loopVariable;
+          forEachParts.iterable != null &&
+          offset < forEachParts.iterable.offset) {
+        declaredIdentifier = forEachParts is ForEachPartsWithDeclaration
+            ? forEachParts.loopVariable
+            : null;
       }
     }
     if (declaredIdentifier == null) {
@@ -442,15 +450,15 @@
     CascadeExpression cascade = invocation.thisOrAncestorOfType();
     NodeList<Expression> sections = cascade.cascadeSections;
     Expression target = cascade.target;
-    if (target is! ListLiteral2 || sections[0] != invocation) {
+    if (target is! ListLiteral || sections[0] != invocation) {
       _coverageMarker();
       return;
     }
 
     bool isEmptyListLiteral(Expression expression) =>
-        expression is ListLiteral2 && expression.elements.isEmpty;
+        expression is ListLiteral && expression.elements2.isEmpty;
 
-    ListLiteral2 list = target;
+    ListLiteral list = target;
     Expression argument = invocation.argumentList.arguments[0];
     String elementText;
     if (argument is BinaryExpression &&
@@ -475,7 +483,7 @@
     elementText ??= '...${utils.getNodeText(argument)}';
     DartChangeBuilder changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addSimpleInsertion(list.elements.last.end, ', $elementText');
+      builder.addSimpleInsertion(list.elements2.last.end, ', $elementText');
       builder.addDeletion(range.node(invocation));
     });
     _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_TO_SPREAD);
@@ -549,8 +557,7 @@
       nodeToReplace = parent;
       parent = parent.parent;
     }
-    // TODO(brianwilkerson) Consider adding support for map literals.
-    if (parent is ListLiteral2 || parent is SetLiteral2) {
+    if (parent is ListLiteral || (parent is SetOrMapLiteral && parent.isSet)) {
       ConditionalExpression conditional = node;
       Expression condition = conditional.condition.unParenthesized;
       Expression thenExpression = conditional.thenExpression.unParenthesized;
@@ -857,10 +864,6 @@
       hasTypeArgs = target.typeArguments != null;
       openRange = range.token(target.leftBracket);
       closeRange = range.startEnd(target.rightBracket, invocation);
-    } else if (target is ListLiteral2) {
-      hasTypeArgs = target.typeArguments != null;
-      openRange = range.token(target.leftBracket);
-      closeRange = range.startEnd(target.rightBracket, invocation);
     } else {
       _coverageMarker();
       return;
@@ -1129,11 +1132,6 @@
         elementTypeArguments = elements.typeArguments;
         elementsRange =
             range.endStart(elements.leftBracket, elements.rightBracket);
-      } else if (arguments[0] is ListLiteral2) {
-        ListLiteral2 elements = arguments[0] as ListLiteral2;
-        elementTypeArguments = elements.typeArguments;
-        elementsRange =
-            range.endStart(elements.leftBracket, elements.rightBracket);
       } else {
         // TODO(brianwilkerson) Consider handling other iterables. Literal sets
         //  could be treated like lists, and arbitrary iterables by using a
@@ -1430,26 +1428,30 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     // find enclosing ForEachStatement
-    ForEachStatement forEachStatement =
-        node.thisOrAncestorOfType<ForEachStatement>();
+    ForStatement2 forEachStatement = node.thisOrAncestorMatching(
+        (node) => node is ForStatement2 && node.forLoopParts is ForEachParts);
     if (forEachStatement == null) {
       _coverageMarker();
       return;
     }
+    ForEachParts forEachParts = forEachStatement.forLoopParts;
     if (selectionOffset < forEachStatement.offset ||
         forEachStatement.rightParenthesis.end < selectionOffset) {
       _coverageMarker();
       return;
     }
     // loop should declare variable
-    DeclaredIdentifier loopVariable = forEachStatement.loopVariable;
+    DeclaredIdentifier loopVariable =
+        forEachParts is ForEachPartsWithDeclaration
+            ? forEachParts.loopVariable
+            : null;
     if (loopVariable == null) {
       _coverageMarker();
       return;
     }
     // iterable should be VariableElement
     String listName;
-    Expression iterable = forEachStatement.iterable;
+    Expression iterable = forEachParts.iterable;
     if (iterable is SimpleIdentifier &&
         iterable.staticElement is VariableElement) {
       listName = iterable.name;
@@ -1593,7 +1595,7 @@
     var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       if (getExpressionParentPrecedence(prefExpression) >=
-          TokenClass.RELATIONAL_OPERATOR.precedence) {
+          Precedence.relational) {
         builder.addDeletion(range.token(prefExpression.operator));
       } else {
         builder.addDeletion(
@@ -1647,7 +1649,7 @@
     var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       if (getExpressionParentPrecedence(prefExpression) >=
-          TokenClass.RELATIONAL_OPERATOR.precedence) {
+          Precedence.relational) {
         builder.addDeletion(range.token(prefExpression.operator));
       } else {
         builder.addDeletion(
@@ -1794,6 +1796,95 @@
     }
   }
 
+  Future<void> _addProposal_convertToNullAware() async {
+    AstNode node = this.node;
+    if (node is! ConditionalExpression) {
+      _coverageMarker();
+      return;
+    }
+    ConditionalExpression conditional = node;
+    Expression condition = conditional.condition.unParenthesized;
+    SimpleIdentifier identifier;
+    Expression nullExpression;
+    Expression nonNullExpression;
+    int periodOffset;
+
+    if (condition is BinaryExpression) {
+      //
+      // Identify the variable being compared to `null`, or return if the
+      // condition isn't a simple comparison of `null` to a variable's value.
+      //
+      Expression leftOperand = condition.leftOperand;
+      Expression rightOperand = condition.rightOperand;
+      if (leftOperand is NullLiteral && rightOperand is SimpleIdentifier) {
+        identifier = rightOperand;
+      } else if (rightOperand is NullLiteral &&
+          leftOperand is SimpleIdentifier) {
+        identifier = leftOperand;
+      } else {
+        _coverageMarker();
+        return;
+      }
+      if (identifier.staticElement is! LocalElement) {
+        _coverageMarker();
+        return;
+      }
+      //
+      // Identify the expression executed when the variable is `null` and when
+      // it is non-`null`. Return if the `null` expression isn't a null literal
+      // or if the non-`null` expression isn't a method invocation whose target
+      // is the save variable being compared to `null`.
+      //
+      if (condition.operator.type == TokenType.EQ_EQ) {
+        nullExpression = conditional.thenExpression;
+        nonNullExpression = conditional.elseExpression;
+      } else if (condition.operator.type == TokenType.BANG_EQ) {
+        nonNullExpression = conditional.thenExpression;
+        nullExpression = conditional.elseExpression;
+      }
+      if (nullExpression == null || nonNullExpression == null) {
+        _coverageMarker();
+        return;
+      }
+      if (nullExpression.unParenthesized is! NullLiteral) {
+        _coverageMarker();
+        return;
+      }
+      Expression unwrappedExpression = nonNullExpression.unParenthesized;
+      Expression target;
+      Token operator;
+      if (unwrappedExpression is MethodInvocation) {
+        target = unwrappedExpression.target;
+        operator = unwrappedExpression.operator;
+      } else if (unwrappedExpression is PrefixedIdentifier) {
+        target = unwrappedExpression.prefix;
+        operator = unwrappedExpression.period;
+      } else {
+        _coverageMarker();
+        return;
+      }
+      if (operator.type != TokenType.PERIOD) {
+        _coverageMarker();
+        return;
+      }
+      if (!(target is SimpleIdentifier &&
+          target.staticElement == identifier.staticElement)) {
+        _coverageMarker();
+        return;
+      }
+      periodOffset = operator.offset;
+
+      DartChangeBuilder changeBuilder = _newDartChangeBuilder();
+      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addDeletion(range.startStart(node, nonNullExpression));
+        builder.addSimpleInsertion(periodOffset, '?');
+        builder.addDeletion(range.endEnd(nonNullExpression, node));
+      });
+      _addAssistFromBuilder(
+          changeBuilder, DartAssistKind.CONVERT_TO_NULL_AWARE);
+    }
+  }
+
   Future<void> _addProposal_convertToSingleQuotedString() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -2120,9 +2211,13 @@
     }
 
     var statefulWidgetClass = await sessionHelper.getClass(
-        flutter.WIDGETS_LIBRARY_URI, 'StatefulWidget');
-    var stateClass =
-        await sessionHelper.getClass(flutter.WIDGETS_LIBRARY_URI, 'State');
+      flutter.widgetsUri,
+      'StatefulWidget',
+    );
+    var stateClass = await sessionHelper.getClass(
+      flutter.widgetsUri,
+      'State',
+    );
     if (statefulWidgetClass == null || stateClass == null) {
       return;
     }
@@ -2233,12 +2328,12 @@
 
     AstNode parentList = widget.parent;
     if (parentList is ListLiteral) {
-      List<Expression> parentElements = parentList.elements;
+      List<CollectionElement> parentElements = parentList.elements2;
       int index = parentElements.indexOf(widget);
       if (index != parentElements.length - 1) {
         var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-          Expression nextWidget = parentElements[index + 1];
+          CollectionElement nextWidget = parentElements[index + 1];
           var nextRange = range.node(nextWidget);
           var nextText = utils.getRangeText(nextRange);
 
@@ -2267,12 +2362,12 @@
 
     AstNode parentList = widget.parent;
     if (parentList is ListLiteral) {
-      List<Expression> parentElements = parentList.elements;
+      List<CollectionElement> parentElements = parentList.elements2;
       int index = parentElements.indexOf(widget);
       if (index > 0) {
         var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-          Expression previousWidget = parentElements[index - 1];
+          CollectionElement previousWidget = parentElements[index - 1];
           var previousRange = range.node(previousWidget);
           var previousText = utils.getRangeText(previousRange);
 
@@ -2299,13 +2394,13 @@
     }
 
     // Prepare the list of our children.
-    List<Expression> childrenExpressions;
+    List<CollectionElement> childrenExpressions;
     {
       var childrenArgument = flutter.findChildrenArgument(widgetCreation);
       var childrenExpression = childrenArgument?.expression;
       if (childrenExpression is ListLiteral &&
-          childrenExpression.elements.isNotEmpty) {
-        childrenExpressions = childrenExpression.elements;
+          childrenExpression.elements2.isNotEmpty) {
+        childrenExpressions = childrenExpression.elements2;
       } else {
         return;
       }
@@ -2410,7 +2505,7 @@
     String widgetSrc = utils.getNodeText(widgetExpr);
 
     var streamBuilderElement = await sessionHelper.getClass(
-      flutter.WIDGETS_LIBRARY_URI,
+      flutter.widgetsUri,
       'StreamBuilder',
     );
     if (streamBuilderElement == null) {
@@ -2460,21 +2555,21 @@
     await _addProposal_flutterWrapWidgetImpl();
     await _addProposal_flutterWrapWidgetImpl(
         kind: DartAssistKind.FLUTTER_WRAP_CENTER,
-        parentLibraryUri: flutter.WIDGETS_LIBRARY_URI,
+        parentLibraryUri: flutter.widgetsUri,
         parentClassName: 'Center',
         widgetValidator: (expr) {
           return !flutter.isExactWidgetTypeCenter(expr.staticType);
         });
     await _addProposal_flutterWrapWidgetImpl(
         kind: DartAssistKind.FLUTTER_WRAP_CONTAINER,
-        parentLibraryUri: flutter.WIDGETS_LIBRARY_URI,
+        parentLibraryUri: flutter.widgetsUri,
         parentClassName: 'Container',
         widgetValidator: (expr) {
           return !flutter.isExactWidgetTypeContainer(expr.staticType);
         });
     await _addProposal_flutterWrapWidgetImpl(
         kind: DartAssistKind.FLUTTER_WRAP_PADDING,
-        parentLibraryUri: flutter.WIDGETS_LIBRARY_URI,
+        parentLibraryUri: flutter.widgetsUri,
         parentClassName: 'Padding',
         leadingLines: ['padding: const EdgeInsets.all(8.0),'],
         widgetValidator: (expr) {
@@ -2588,7 +2683,7 @@
       ClassElement parentClassElement =
           await sessionHelper.getClass(parentLibraryUri, parentClassName);
       ClassElement widgetClassElement =
-          await sessionHelper.getClass(flutter.WIDGETS_LIBRARY_URI, 'Widget');
+          await sessionHelper.getClass(flutter.widgetsUri, 'Widget');
       if (parentClassElement == null || widgetClassElement == null) {
         return;
       }
@@ -2630,11 +2725,11 @@
 
     await addAssist(
         kind: DartAssistKind.FLUTTER_WRAP_COLUMN,
-        parentLibraryUri: flutter.WIDGETS_LIBRARY_URI,
+        parentLibraryUri: flutter.widgetsUri,
         parentClassName: 'Column');
     await addAssist(
         kind: DartAssistKind.FLUTTER_WRAP_ROW,
-        parentLibraryUri: flutter.WIDGETS_LIBRARY_URI,
+        parentLibraryUri: flutter.widgetsUri,
         parentClassName: 'Row');
   }
 
@@ -3112,7 +3207,7 @@
     if (node is! ListLiteral) {
       return;
     }
-    if ((node as ListLiteral).elements.any((Expression exp) =>
+    if ((node as ListLiteral).elements2.any((CollectionElement exp) =>
         !(exp is InstanceCreationExpression &&
             flutter.isWidgetCreation(exp)))) {
       _coverageMarker();
@@ -3904,10 +3999,8 @@
   /// placed inside curly braces, would lexically make the resulting literal a
   /// set literal rather than a map literal.
   bool _listHasUnambiguousElement(AstNode node) {
-    if (node is ListLiteral && node.elements.length > 0) {
-      return true;
-    } else if (node is ListLiteral2) {
-      for (CollectionElement element in node.elements) {
+    if (node is ListLiteral && node.elements2.length > 0) {
+      for (CollectionElement element in node.elements2) {
         if (_isUnambiguousElement(element)) {
           return true;
         }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index f193dd1..ec60587 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -78,7 +78,8 @@
             errorCode.name == LintNames.prefer_collection_literals ||
             errorCode.name == LintNames.prefer_conditional_assignment ||
             errorCode.name == LintNames.prefer_const_declarations ||
-            errorCode.name == LintNames.unnecessary_brace_in_string_interp ||
+            errorCode.name == LintNames.unnecessary_brace_in_string_interps ||
+            errorCode.name == LintNames.unnecessary_const ||
             errorCode.name == LintNames.unnecessary_lambdas ||
             errorCode.name == LintNames.unnecessary_this));
 
@@ -131,6 +132,8 @@
       'ADD_SUPER_CONSTRUCTOR_INVOCATION',
       50,
       "Add super constructor {0} invocation");
+  static const CHANGE_ARGUMENT_NAME =
+      const FixKind('CHANGE_ARGUMENT_NAME', 60, "Change to '{0}'");
   static const CHANGE_TO = const FixKind('CHANGE_TO', 51, "Change to '{0}'");
   static const CHANGE_TO_NEAREST_PRECISE_VALUE = const FixKind(
       'CHANGE_TO_NEAREST_PRECISE_VALUE',
@@ -206,6 +209,8 @@
   static const REMOVE_AWAIT = const FixKind('REMOVE_AWAIT', 50, "Remove await");
   static const REMOVE_DEAD_CODE =
       const FixKind('REMOVE_DEAD_CODE', 50, "Remove dead code");
+  static const REMOVE_DUPLICATE_CASE = const FixKind(
+      'REMOVE_DUPLICATE_CASE', 50, "Remove duplicate case statement");
   static const REMOVE_EMPTY_CATCH =
       const FixKind('REMOVE_EMPTY_CATCH', 50, "Remove empty catch clause");
   static const REMOVE_EMPTY_CONSTRUCTOR_BODY = const FixKind(
@@ -241,6 +246,8 @@
   static const REMOVE_UNNECESSARY_CAST = const FixKind(
       'REMOVE_UNNECESSARY_CAST', 50, "Remove unnecessary cast",
       appliedTogetherMessage: "Remove all unnecessary casts in file");
+  static const REMOVE_UNNECESSARY_CONST = const FixKind(
+      'REMOVE_UNNECESSARY_CONST', 50, "Remove unnecessary const keyword");
   static const REMOVE_UNUSED_CATCH_CLAUSE = const FixKind(
       'REMOVE_UNUSED_CATCH_CLAUSE', 50, "Remove unused 'catch' clause");
   static const REMOVE_UNUSED_CATCH_STACK = const FixKind(
@@ -248,6 +255,8 @@
   static const REMOVE_UNUSED_IMPORT = const FixKind(
       'REMOVE_UNUSED_IMPORT', 50, "Remove unused import",
       appliedTogetherMessage: "Remove all unused imports in this file");
+  static const REMOVE_UNNECESSARY_NEW = const FixKind(
+      'REMOVE_UNNECESSARY_NEW', 50, "Remove unnecessary new keyword");
   static const RENAME_TO_CAMEL_CASE =
       const FixKind('RENAME_TO_CAMEL_CASE', 50, "Rename to '{0}'");
   static const REPLACE_BOOLEAN_WITH_BOOL = const FixKind(
@@ -290,4 +299,6 @@
       'USE_NOT_EQ_NULL', 50, "Use != null instead of 'is! Null'",
       appliedTogetherMessage:
           "Use != null instead of 'is! Null' everywhere in file");
+  static const USE_RETHROW =
+      const FixKind('USE_RETHROW', 50, "Replace throw with rethrow");
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index c6600c1..322e99a 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -15,9 +15,10 @@
 import 'package:analysis_server/src/services/correction/strings.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analysis_server/src/services/search/hierarchy.dart';
-import 'package:analysis_server/src/utilities/flutter.dart' as flutter;
+import 'package:analysis_server/src/utilities/flutter.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/precedence.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -174,6 +175,7 @@
   final LibraryElement unitLibraryElement;
   final CompilationUnit unit;
   final CorrectionUtils utils;
+  final Flutter flutter;
 
   final AnalysisError error;
   final int errorOffset;
@@ -194,6 +196,7 @@
         unitLibraryElement = context.resolveResult.libraryElement,
         unit = context.resolveResult.unit,
         utils = CorrectionUtils(context.resolveResult),
+        flutter = Flutter.of(context.resolveResult.session),
         error = context.error,
         errorOffset = context.error.offset,
         errorLength = context.error.length;
@@ -227,6 +230,7 @@
       await _addFix_replaceWithConstInstanceCreation();
     }
     if (errorCode == CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT ||
+        errorCode == CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT ||
         errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT) {
       await _addFix_addAsync();
     }
@@ -468,7 +472,8 @@
     }
     if (errorCode == CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER ||
         errorCode == StaticWarningCode.UNDEFINED_NAMED_PARAMETER) {
-      await _addFix_addMissingNamedArgument();
+      await _addFix_addMissingParameterNamed();
+      await _addFix_changeArgumentName();
     }
     if (errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE) {
       await _addFix_illegalAsyncReturnType();
@@ -581,6 +586,9 @@
       if (name == LintNames.empty_statements) {
         await _addFix_removeEmptyStatement();
       }
+      if (name == LintNames.no_duplicate_case_values) {
+        await _addFix_removeCaseStatement();
+      }
       if (name == LintNames.non_constant_identifier_names) {
         await _addFix_renameToCamelCase();
       }
@@ -602,18 +610,27 @@
       if (name == LintNames.type_init_formals) {
         await _addFix_removeTypeAnnotation();
       }
-      if (name == LintNames.unnecessary_brace_in_string_interp) {
+      if (name == LintNames.unnecessary_brace_in_string_interps) {
         await _addFix_removeInterpolationBraces();
       }
+      if (name == LintNames.unnecessary_const) {
+        await _addFix_removeConstKeyword();
+      }
       if (name == LintNames.unnecessary_lambdas) {
         await _addFix_replaceWithTearOff();
       }
-      if (name == LintNames.unnecessary_override) {
+      if (name == LintNames.unnecessary_new) {
+        await _addFix_removeNewKeyword();
+      }
+      if (name == LintNames.unnecessary_overrides) {
         await _addFix_removeMethodDeclaration();
       }
       if (name == LintNames.unnecessary_this) {
         await _addFix_removeThisExpression();
       }
+      if (name == LintNames.use_rethrow_when_possible) {
+        await _addFix_replaceWithRethrow();
+      }
     }
     // done
     return fixes;
@@ -675,7 +692,7 @@
       // TODO(brianwilkerson) Consider updating the right operand.
       return;
     }
-    bool needsParentheses = target.precedence < 15;
+    bool needsParentheses = target.precedence2 < Precedence.postfix;
     if (((_isDartCoreIterable(fromType) || _isDartCoreList(fromType)) &&
             _isDartCoreList(toType)) ||
         (_isDartCoreSet(fromType) && _isDartCoreSet(toType))) {
@@ -740,70 +757,6 @@
     }
   }
 
-  Future<void> _addFix_addMissingNamedArgument() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    // Prepare the name of the missing parameter.
-    if (this.node is! SimpleIdentifier) {
-      return;
-    }
-    SimpleIdentifier node = this.node;
-    String name = node.name;
-
-    // We expect that the node is part of a NamedExpression.
-    if (node.parent?.parent is! NamedExpression) {
-      return;
-    }
-    NamedExpression namedExpression = node.parent.parent;
-
-    // We should be in an ArgumentList.
-    if (namedExpression.parent is! ArgumentList) {
-      return;
-    }
-    AstNode argumentList = namedExpression.parent;
-
-    // Prepare the invoked element.
-    var context = new _ExecutableParameters(sessionHelper, argumentList.parent);
-    if (context == null) {
-      return;
-    }
-
-    // We cannot add named parameters when there are positional positional.
-    if (context.optionalPositional.isNotEmpty) {
-      return;
-    }
-
-    Future<void> addParameter(int offset, String prefix, String suffix) async {
-      // TODO(brianwilkerson) Determine whether this await is necessary.
-      await null;
-      if (offset != null) {
-        var changeBuilder = _newDartChangeBuilder();
-        await changeBuilder.addFileEdit(context.file, (builder) {
-          builder.addInsertion(offset, (builder) {
-            builder.write(prefix);
-            builder.writeParameterMatchingArgument(
-                namedExpression, 0, new Set<String>());
-            builder.write(suffix);
-          });
-        });
-        _addFixFromBuilder(
-            changeBuilder, DartFixKind.ADD_MISSING_PARAMETER_NAMED,
-            args: [name]);
-      }
-    }
-
-    if (context.named.isNotEmpty) {
-      var prevNode = await context.getParameterNode(context.named.last);
-      await addParameter(prevNode?.end, ', ', '');
-    } else if (context.required.isNotEmpty) {
-      var prevNode = await context.getParameterNode(context.required.last);
-      await addParameter(prevNode?.end, ', {', '}');
-    } else {
-      var parameterList = await context.getParameterList();
-      await addParameter(parameterList?.leftParenthesis?.end, '{', '}');
-    }
-  }
-
   Future<void> _addFix_addMissingParameter() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -874,6 +827,66 @@
     }
   }
 
+  Future<void> _addFix_addMissingParameterNamed() async {
+    // Prepare the name of the missing parameter.
+    if (this.node is! SimpleIdentifier) {
+      return;
+    }
+    SimpleIdentifier node = this.node;
+    String name = node.name;
+
+    // We expect that the node is part of a NamedExpression.
+    if (node.parent?.parent is! NamedExpression) {
+      return;
+    }
+    NamedExpression namedExpression = node.parent.parent;
+
+    // We should be in an ArgumentList.
+    if (namedExpression.parent is! ArgumentList) {
+      return;
+    }
+    AstNode argumentList = namedExpression.parent;
+
+    // Prepare the invoked element.
+    var context = new _ExecutableParameters(sessionHelper, argumentList.parent);
+    if (context == null) {
+      return;
+    }
+
+    // We cannot add named parameters when there are positional positional.
+    if (context.optionalPositional.isNotEmpty) {
+      return;
+    }
+
+    Future<void> addParameter(int offset, String prefix, String suffix) async {
+      if (offset != null) {
+        var changeBuilder = _newDartChangeBuilder();
+        await changeBuilder.addFileEdit(context.file, (builder) {
+          builder.addInsertion(offset, (builder) {
+            builder.write(prefix);
+            builder.writeParameterMatchingArgument(
+                namedExpression, 0, new Set<String>());
+            builder.write(suffix);
+          });
+        });
+        _addFixFromBuilder(
+            changeBuilder, DartFixKind.ADD_MISSING_PARAMETER_NAMED,
+            args: [name]);
+      }
+    }
+
+    if (context.named.isNotEmpty) {
+      var prevNode = await context.getParameterNode(context.named.last);
+      await addParameter(prevNode?.end, ', ', '');
+    } else if (context.required.isNotEmpty) {
+      var prevNode = await context.getParameterNode(context.required.last);
+      await addParameter(prevNode?.end, ', {', '}');
+    } else {
+      var parameterList = await context.getParameterList();
+      await addParameter(parameterList?.leftParenthesis?.end, '{', '}');
+    }
+  }
+
   Future<void> _addFix_addMissingRequiredArgument() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -1029,6 +1042,57 @@
     }
   }
 
+  Future<void> _addFix_changeArgumentName() async {
+    const int maxDistance = 4;
+
+    List<String> getNamedParameterNames() {
+      AstNode namedExpression = node?.parent?.parent;
+      if (node is SimpleIdentifier &&
+          namedExpression is NamedExpression &&
+          namedExpression.name == node.parent &&
+          namedExpression.parent is ArgumentList) {
+        var parameters = _ExecutableParameters(
+          sessionHelper,
+          namedExpression.parent.parent,
+        );
+        return parameters.namedNames;
+      }
+      return null;
+    }
+
+    int computeDistance(String current, String proposal) {
+      if ((current == 'child' && proposal == 'children') ||
+          (current == 'children' && proposal == 'child')) {
+        // Special case handling for 'child' and 'children' is unnecessary if
+        // `maxDistance >= 3`, but is included to prevent regression in case the
+        // value is changed to improve results.
+        return 1;
+      }
+      return levenshtein(current, proposal, maxDistance, caseSensitive: false);
+    }
+
+    List<String> names = getNamedParameterNames();
+    if (names == null || names.isEmpty) {
+      return;
+    }
+
+    SimpleIdentifier argumentName = node;
+    String invalidName = argumentName.name;
+    for (String proposedName in names) {
+      int distance = computeDistance(invalidName, proposedName);
+      if (distance <= maxDistance) {
+        DartChangeBuilder changeBuilder = _newDartChangeBuilder();
+        await changeBuilder.addFileEdit(file, (builder) {
+          builder.addSimpleReplacement(range.node(argumentName), proposedName);
+        });
+        // TODO(brianwilkerson) Create a way to use the distance as part of the
+        //  computation of the priority (so that closer names sort first).
+        _addFixFromBuilder(changeBuilder, DartFixKind.CHANGE_ARGUMENT_NAME,
+            args: [proposedName]);
+      }
+    }
+  }
+
   Future<void> _addFix_changeToNearestPreciseValue() async {
     IntegerLiteral integer = node;
     String lexeme = integer.literal.lexeme;
@@ -1108,7 +1172,7 @@
 
     // child: [widget1, widget2]
     if (expression is ListLiteral &&
-        expression.elements.every(flutter.isWidgetExpression)) {
+        expression.elements2.every(flutter.isWidgetExpression)) {
       var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addSimpleReplacement(range.node(named.name), 'children:');
@@ -1129,8 +1193,8 @@
         node.parent?.parent is NamedExpression) {
       NamedExpression named = node.parent?.parent;
       Expression expression = named.expression;
-      if (expression is ListLiteral && expression.elements.length == 1) {
-        Expression widget = expression.elements[0];
+      if (expression is ListLiteral && expression.elements2.length == 1) {
+        CollectionElement widget = expression.elements2[0];
         if (flutter.isWidgetExpression(widget)) {
           String widgetText = utils.getNodeText(widget);
           String indentOld = utils.getLinePrefix(widget.offset);
@@ -1342,7 +1406,7 @@
         flutter.isExactlyStatefulWidgetType(superType)) {
       // Specialize for Flutter widgets.
       ClassElement keyClass =
-          await sessionHelper.getClass(flutter.WIDGETS_LIBRARY_URI, 'Key');
+          await sessionHelper.getClass(flutter.widgetsUri, 'Key');
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
           builder.write(targetLocation.prefix);
@@ -2638,6 +2702,28 @@
     }
   }
 
+  Future<void> _addFix_removeCaseStatement() async {
+    if (coveredNode is SwitchCase) {
+      var changeBuilder = _newDartChangeBuilder();
+      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addDeletion(utils.getLinesRange(range.node(coveredNode)));
+      });
+      _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_DUPLICATE_CASE);
+    }
+  }
+
+  Future<void> _addFix_removeConstKeyword() async {
+    final instanceCreationExpression = node;
+    if (instanceCreationExpression is InstanceCreationExpression) {
+      final constToken = instanceCreationExpression.keyword;
+      var changeBuilder = _newDartChangeBuilder();
+      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addDeletion(range.startStart(constToken, constToken.next));
+      });
+      _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNNECESSARY_CONST);
+    }
+  }
+
   Future<void> _addFix_removeDeadCode() async {
     AstNode coveringNode = this.coveredNode;
     if (coveringNode is Expression) {
@@ -2859,6 +2945,18 @@
     }
   }
 
+  Future<void> _addFix_removeNewKeyword() async {
+    final instanceCreationExpression = node;
+    if (instanceCreationExpression is InstanceCreationExpression) {
+      final newToken = instanceCreationExpression.keyword;
+      var changeBuilder = _newDartChangeBuilder();
+      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addDeletion(range.startStart(newToken, newToken.next));
+      });
+      _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNNECESSARY_NEW);
+    }
+  }
+
   Future<void> _addFix_removeParameters_inGetterDeclaration() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -2956,7 +3054,7 @@
     }
     AsExpression asExpression = coveredNode as AsExpression;
     Expression expression = asExpression.expression;
-    int expressionPrecedence = getExpressionPrecedence(expression);
+    Precedence expressionPrecedence = getExpressionPrecedence(expression);
     // remove 'as T' from 'e as T'
     var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
@@ -3142,6 +3240,16 @@
     }
   }
 
+  Future<void> _addFix_replaceWithRethrow() async {
+    if (coveredNode is ThrowExpression) {
+      var changeBuilder = _newDartChangeBuilder();
+      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addSimpleReplacement(range.node(coveredNode), 'rethrow');
+      });
+      _addFixFromBuilder(changeBuilder, DartFixKind.USE_RETHROW);
+    }
+  }
+
   Future<void> _addFix_replaceWithIdentifier() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -4144,7 +4252,7 @@
    * [exprPrecedence] - the effective precedence of [expr].
    */
   void _removeEnclosingParentheses(
-      DartFileEditBuilder builder, Expression expr, int exprPrecedence) {
+      DartFileEditBuilder builder, Expression expr, Precedence exprPrecedence) {
     while (expr.parent is ParenthesizedExpression) {
       ParenthesizedExpression parenthesized =
           expr.parent as ParenthesizedExpression;
@@ -4230,6 +4338,7 @@
   static const String empty_catches = 'empty_catches';
   static const String empty_constructor_bodies = 'empty_constructor_bodies';
   static const String empty_statements = 'empty_statements';
+  static const String no_duplicate_case_values = 'no_duplicate_case_values';
   static const String non_constant_identifier_names =
       'non_constant_identifier_names';
   static const String prefer_collection_literals = 'prefer_collection_literals';
@@ -4240,11 +4349,14 @@
   static const String prefer_final_locals = 'prefer_final_locals';
   static const String prefer_is_not_empty = 'prefer_is_not_empty';
   static const String type_init_formals = 'type_init_formals';
-  static const String unnecessary_brace_in_string_interp =
-      'unnecessary_brace_in_string_interp';
+  static const String unnecessary_brace_in_string_interps =
+      'unnecessary_brace_in_string_interps';
+  static const String unnecessary_const = 'unnecessary_const';
   static const String unnecessary_lambdas = 'unnecessary_lambdas';
-  static const String unnecessary_override = 'unnecessary_override';
+  static const String unnecessary_new = 'unnecessary_new';
+  static const String unnecessary_overrides = 'unnecessary_overrides';
   static const String unnecessary_this = 'unnecessary_this';
+  static const String use_rethrow_when_possible = 'use_rethrow_when_possible';
 }
 
 /**
@@ -4317,6 +4429,10 @@
 
   String get file => executable.source.fullName;
 
+  List<String> get namedNames {
+    return named.map((parameter) => parameter.name).toList();
+  }
+
   /**
    * Return the [FormalParameterList] of the [executable], or `null` is cannot
    * be found.
diff --git a/pkg/analysis_server/lib/src/services/correction/organize_directives.dart b/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
index 14e218e..3c3ff33 100644
--- a/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
+++ b/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
@@ -76,17 +76,36 @@
    * Organize all [Directive]s.
    */
   void _organizeDirectives() {
+    var lineInfo = unit.lineInfo;
     List<_DirectiveInfo> directives = [];
     for (Directive directive in unit.directives) {
       if (directive is UriBasedDirective) {
         _DirectivePriority priority = getDirectivePriority(directive);
         if (priority != null) {
           int offset = directive.offset;
-          int length = directive.length;
-          String text = code.substring(offset, offset + length);
+
+          int end = directive.end;
+          int line = lineInfo.getLocation(end).lineNumber;
+          Token comment = directive.endToken.next.precedingComments;
+          while (comment != null) {
+            if (lineInfo.getLocation(comment.offset).lineNumber == line) {
+              end = comment.end;
+            }
+            comment = comment.next;
+          }
+
+          String text = code.substring(offset, end);
           String uriContent = directive.uri.stringValue;
-          directives
-              .add(new _DirectiveInfo(directive, priority, uriContent, text));
+          directives.add(
+            new _DirectiveInfo(
+              directive,
+              priority,
+              uriContent,
+              offset,
+              end,
+              text,
+            ),
+          );
         }
       }
     }
@@ -94,8 +113,8 @@
     if (directives.isEmpty) {
       return;
     }
-    int firstDirectiveOffset = directives.first.directive.offset;
-    int lastDirectiveEnd = directives.last.directive.end;
+    int firstDirectiveOffset = directives.first.offset;
+    int lastDirectiveEnd = directives.last.end;
     // sort
     directives.sort();
     // append directives with grouping
@@ -125,29 +144,6 @@
       directivesCode = sb.toString();
       directivesCode = directivesCode.trimRight();
     }
-    // append comment tokens which otherwise would be removed completely
-    {
-      bool firstCommentToken = true;
-      Token token = unit.beginToken;
-      while (token != null &&
-          token.type != TokenType.EOF &&
-          token.end < lastDirectiveEnd) {
-        Token commentToken = token.precedingComments;
-        while (commentToken != null) {
-          int offset = commentToken.offset;
-          int end = commentToken.end;
-          if (offset > firstDirectiveOffset && offset < lastDirectiveEnd) {
-            if (firstCommentToken) {
-              directivesCode += endOfLine;
-              firstCommentToken = false;
-            }
-            directivesCode += code.substring(offset, end) + endOfLine;
-          }
-          commentToken = commentToken.next;
-        }
-        token = token.next;
-      }
-    }
     // prepare code
     String beforeDirectives = code.substring(0, firstDirectiveOffset);
     String afterDirectives = code.substring(lastDirectiveEnd);
@@ -200,9 +196,24 @@
   final UriBasedDirective directive;
   final _DirectivePriority priority;
   final String uri;
+
+  /// The offset of the first token, usually the keyword.
+  final int offset;
+
+  /// The offset after the least token, including the end-of-line comment.
+  final int end;
+
+  /// The text between [offset] and [end].
   final String text;
 
-  _DirectiveInfo(this.directive, this.priority, this.uri, this.text);
+  _DirectiveInfo(
+    this.directive,
+    this.priority,
+    this.uri,
+    this.offset,
+    this.end,
+    this.text,
+  );
 
   @override
   int compareTo(_DirectiveInfo other) {
diff --git a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
index 184c81b..3575661 100644
--- a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
@@ -105,23 +105,33 @@
   }
 
   @override
-  Object visitForStatement(ForStatement node) {
-    super.visitForStatement(node);
-    List<AstNode> selectedNodes = this.selectedNodes;
-    bool containsInit = _contains(selectedNodes, node.initialization) ||
-        _contains(selectedNodes, node.variables);
-    bool containsCondition = _contains(selectedNodes, node.condition);
-    bool containsUpdaters = _containsAny(selectedNodes, node.updaters);
-    bool containsBody = _contains(selectedNodes, node.body);
-    if (containsInit && containsCondition) {
-      invalidSelection(
-          "Operation not applicable to a 'for' statement's initializer and condition.");
-    } else if (containsCondition && containsUpdaters) {
-      invalidSelection(
-          "Operation not applicable to a 'for' statement's condition and updaters.");
-    } else if (containsUpdaters && containsBody) {
-      invalidSelection(
-          "Operation not applicable to a 'for' statement's updaters and body.");
+  Object visitForStatement2(ForStatement2 node) {
+    super.visitForStatement2(node);
+    var forLoopParts = node.forLoopParts;
+    if (forLoopParts is ForParts) {
+      List<AstNode> selectedNodes = this.selectedNodes;
+      bool containsInit;
+      if (forLoopParts is ForPartsWithExpression) {
+        containsInit = _contains(selectedNodes, forLoopParts.initialization);
+      } else if (forLoopParts is ForPartsWithDeclarations) {
+        containsInit = _contains(selectedNodes, forLoopParts.variables);
+      } else {
+        throw new StateError('Unrecognized for loop parts');
+      }
+      bool containsCondition = _contains(selectedNodes, forLoopParts.condition);
+      bool containsUpdaters =
+          _containsAny(selectedNodes, forLoopParts.updaters);
+      bool containsBody = _contains(selectedNodes, node.body);
+      if (containsInit && containsCondition) {
+        invalidSelection(
+            "Operation not applicable to a 'for' statement's initializer and condition.");
+      } else if (containsCondition && containsUpdaters) {
+        invalidSelection(
+            "Operation not applicable to a 'for' statement's condition and updaters.");
+      } else if (containsUpdaters && containsBody) {
+        invalidSelection(
+            "Operation not applicable to a 'for' statement's updaters and body.");
+      }
     }
     return null;
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 9ea11e0..3ac28b5 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/precedence.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -300,17 +301,17 @@
 }
 
 /**
- * Returns [getExpressionPrecedence] for the parent of [node], or `0` if the
- * parent node is a [ParenthesizedExpression].
+ * Returns [getExpressionPrecedence] for the parent of [node], or
+ * ASSIGNMENT_PRECEDENCE if the parent node is a [ParenthesizedExpression].
  *
  * The reason is that `(expr)` is always executed after `expr`.
  */
-int getExpressionParentPrecedence(AstNode node) {
+Precedence getExpressionParentPrecedence(AstNode node) {
   AstNode parent = node.parent;
   if (parent is ParenthesizedExpression) {
-    return 0;
+    return Precedence.assignment;
   } else if (parent is IndexExpression && parent.index == node) {
-    return 0;
+    return Precedence.assignment;
   } else if (parent is AssignmentExpression &&
       node == parent.rightHandSide &&
       parent.parent is CascadeExpression) {
@@ -319,19 +320,20 @@
     // expressions are equal it sometimes means that we don't need parentheses
     // (such as replacing the `b` in `a + b` with `c + d`) and sometimes do
     // (such as replacing the `v` in `..f = v` with `a..b`).
-    return 3;
+    return Precedence.conditional;
   }
   return getExpressionPrecedence(parent);
 }
 
 /**
- * Returns the precedence of [node] it is an [Expression], negative otherwise.
+ * Returns the precedence of [node] it is an [Expression], NO_PRECEDENCE
+ * otherwise.
  */
-int getExpressionPrecedence(AstNode node) {
+Precedence getExpressionPrecedence(AstNode node) {
   if (node is Expression) {
-    return node.precedence;
+    return node.precedence2;
   }
-  return -1000;
+  return Precedence.none;
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index bce5382..074f91c 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -964,13 +964,23 @@
   }
 
   @override
-  Object visitForStatement(ForStatement node) {
-    super.visitForStatement(node);
-    if (identical(node.variables, firstSelectedNode)) {
-      invalidSelection(
-          "Cannot extract initialization part of a 'for' statement.");
-    } else if (node.updaters.contains(lastSelectedNode)) {
-      invalidSelection("Cannot extract increment part of a 'for' statement.");
+  Object visitForParts(ForParts node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  Object visitForStatement2(ForStatement2 node) {
+    super.visitForStatement2(node);
+    var forLoopParts = node.forLoopParts;
+    if (forLoopParts is ForParts) {
+      if (forLoopParts is ForPartsWithDeclarations &&
+          identical(forLoopParts.variables, firstSelectedNode)) {
+        invalidSelection(
+            "Cannot extract initialization part of a 'for' statement.");
+      } else if (forLoopParts.updaters.contains(lastSelectedNode)) {
+        invalidSelection("Cannot extract increment part of a 'for' statement.");
+      }
     }
     return null;
   }
@@ -1094,11 +1104,11 @@
   }
 
   @override
-  visitForEachStatement(ForEachStatement node) {
+  visitForStatement2(ForStatement2 node) {
     if (node.awaitKeyword != null) {
       result = true;
     }
-    super.visitForEachStatement(node);
+    super.visitForStatement2(node);
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index b182f37..347c778 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -35,6 +35,7 @@
   final int length;
 
   CorrectionUtils utils;
+  Flutter flutter;
 
   ClassElement classBuildContext;
   ClassElement classKey;
@@ -75,6 +76,7 @@
       this.searchEngine, this.resolveResult, this.offset, this.length)
       : sessionHelper = new AnalysisSessionHelper(resolveResult.session) {
     utils = new CorrectionUtils(resolveResult);
+    flutter = Flutter.of(resolveResult.session);
   }
 
   @override
@@ -182,8 +184,8 @@
     _enclosingClassElement = _enclosingClassNode?.declaredElement;
 
     // new MyWidget(...)
-    InstanceCreationExpression newExpression = identifyNewExpression(node);
-    if (isWidgetCreation(newExpression)) {
+    var newExpression = flutter.identifyNewExpression(node);
+    if (flutter.isWidgetCreation(newExpression)) {
       _expression = newExpression;
       return new RefactoringStatus();
     }
@@ -201,7 +203,7 @@
       if (statements.isNotEmpty) {
         var lastStatement = statements.last;
         if (lastStatement is ReturnStatement &&
-            isWidgetExpression(lastStatement.expression)) {
+            flutter.isWidgetExpression(lastStatement.expression)) {
           _statements = statements;
           _statementsRange = range.startEnd(statements.first, statements.last);
           return new RefactoringStatus();
@@ -219,7 +221,7 @@
       }
       if (node is MethodDeclaration) {
         DartType returnType = node.returnType?.type;
-        if (isWidgetType(returnType) && node.body != null) {
+        if (flutter.isWidgetType(returnType) && node.body != null) {
           _method = node;
           return new RefactoringStatus();
         }
@@ -240,10 +242,11 @@
     Future<ClassElement> getClass(String name) async {
       // TODO(brianwilkerson) Determine whether this await is necessary.
       await null;
-      const uri = 'package:flutter/widgets.dart';
-      var element = await sessionHelper.getClass(uri, name);
+      var element = await sessionHelper.getClass(flutter.widgetsUri, name);
       if (element == null) {
-        result.addFatalError("Unable to find '$name' in $uri");
+        result.addFatalError(
+          "Unable to find '$name' in ${flutter.widgetsUri}",
+        );
       }
       return element;
     }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
index 00b8883..2d7efec 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
@@ -12,6 +12,7 @@
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/precedence.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
@@ -192,7 +193,7 @@
 
   static bool _shouldUseParenthesis(Expression init, AstNode node) {
     // check precedence
-    int initPrecedence = getExpressionPrecedence(init);
+    Precedence initPrecedence = getExpressionPrecedence(init);
     if (initPrecedence < getExpressionParentPrecedence(node)) {
       return true;
     }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index 4d7b4e2..c552695 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -14,6 +14,7 @@
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/precedence.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
@@ -66,7 +67,7 @@
       argument = (argument as NamedExpression).expression;
     }
     // prepare argument properties
-    int argumentPrecedence;
+    Precedence argumentPrecedence;
     String argumentSource;
     if (argument != null) {
       argumentPrecedence = getExpressionPrecedence(argument);
@@ -79,7 +80,7 @@
         return;
       }
       // an optional parameter
-      argumentPrecedence = -1000;
+      argumentPrecedence = Precedence.none;
       argumentSource = parameter.defaultValueCode;
       if (argumentSource == null) {
         argumentSource = 'null';
@@ -414,8 +415,9 @@
 }
 
 class _ParameterOccurrence {
-  final int parentPrecedence;
+  final Precedence parentPrecedence;
   final SourceRange range;
+
   _ParameterOccurrence(this.parentPrecedence, this.range);
 }
 
@@ -735,8 +737,8 @@
     _implicitThisOffsets.add(offset - _base);
   }
 
-  void addParameterOccurrence(
-      ParameterElement parameter, SourceRange identifierRange, int precedence) {
+  void addParameterOccurrence(ParameterElement parameter,
+      SourceRange identifierRange, Precedence precedence) {
     if (parameter != null) {
       List<_ParameterOccurrence> occurrences = _parameters[parameter];
       if (occurrences == null) {
@@ -846,7 +848,7 @@
     }
     // OK, add occurrence
     SourceRange nodeRange = range.node(node);
-    int parentPrecedence = getExpressionParentPrecedence(node);
+    Precedence parentPrecedence = getExpressionParentPrecedence(node);
     result.addParameterOccurrence(
         parameterElement, nodeRange, parentPrecedence);
   }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
index cb8683f..26d14d3 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -13,7 +13,7 @@
 import 'package:analysis_server/src/services/refactoring/rename.dart';
 import 'package:analysis_server/src/services/search/element_visitors.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
-import 'package:analysis_server/src/utilities/flutter.dart' as flutter;
+import 'package:analysis_server/src/utilities/flutter.dart';
 import 'package:analyzer/dart/ast/ast.dart' show Identifier;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/generated/java_core.dart';
@@ -144,6 +144,7 @@
   }
 
   void _findFlutterStateClass() {
+    var flutter = Flutter.of(element.session);
     if (flutter.isStatefulWidgetDeclaration(element)) {
       var oldStateName = oldName + 'State';
       _flutterWidgetState = element.library.getType(oldStateName) ??
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index 793b9c3..aac3156 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -1319,7 +1319,6 @@
   Future generateContent(Map<String, String> params) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    DiagnosticsSite diagnosticsSite = site;
 
     buf.writeln('<div class="columns">');
 
@@ -1328,14 +1327,6 @@
     buf.writeln(writeOption('Server type', server.runtimeType));
     buf.writeln(writeOption('Instrumentation enabled',
         AnalysisEngine.instance.instrumentationService.isActive));
-    bool uxExp1 =
-        diagnosticsSite.socketServer.analysisServerOptions.enableUXExperiment1;
-    bool uxExp2 =
-        diagnosticsSite.socketServer.analysisServerOptions.enableUXExperiment2;
-    if (uxExp1 || uxExp2) {
-      buf.writeln(writeOption('UX Experiment 1', uxExp1));
-      buf.writeln(writeOption('ux Experiment 2', uxExp2));
-    }
     buf.writeln(writeOption('Server process ID', pid));
     buf.writeln('</div>');
 
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index 3c63b01..71fcd4a 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -3,430 +3,456 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/strings.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 
-const WIDGETS_LIBRARY_URI = 'package:flutter/widgets.dart';
+class Flutter {
+  static const _nameCenter = 'Center';
+  static const _nameContainer = 'Container';
+  static const _namePadding = 'Padding';
+  static const _nameState = 'State';
+  static const _nameStatefulWidget = 'StatefulWidget';
+  static const _nameStatelessWidget = 'StatelessWidget';
+  static const _nameStreamBuilder = 'StreamBuilder';
+  static const _nameWidget = 'Widget';
 
-const _BASIC_URI = "package:flutter/src/widgets/basic.dart";
-const _CENTER_NAME = "Center";
-const _CONTAINER_NAME = "Container";
-const _CONTAINER_URI = "package:flutter/src/widgets/container.dart";
-const _PADDING_NAME = "Padding";
-const _STATE_NAME = "State";
-const _STATEFUL_WIDGET_NAME = "StatefulWidget";
-const _STATELESS_WIDGET_NAME = "StatelessWidget";
-const _STREAM_BUILDER_NAME = "StreamBuilder";
-const _STREAM_BUILDER_URI = "package:flutter/src/widgets/async.dart";
-const _WIDGET_NAME = "Widget";
-const _WIDGET_URI = "package:flutter/src/widgets/framework.dart";
-final _frameworkUri = Uri.parse('package:flutter/src/widgets/framework.dart');
+  static final mobile = Flutter._('flutter', 'package:flutter');
+  static final web = Flutter._('flutter_web', 'package:flutter_web');
 
-void convertChildToChildren(
-    InstanceCreationExpression childArg,
-    NamedExpression namedExp,
-    String eol,
-    Function getNodeText,
-    Function getLinePrefix,
-    Function getIndent,
-    Function getText,
-    Function _addInsertEdit,
-    Function _addRemoveEdit,
-    Function _addReplaceEdit,
-    Function rangeNode) {
-  int childLoc = namedExp.offset + 'child'.length;
-  _addInsertEdit(childLoc, 'ren');
-  int listLoc = childArg.offset;
-  String childArgSrc = getNodeText(childArg);
-  if (!childArgSrc.contains(eol)) {
-    _addInsertEdit(listLoc, '<Widget>[');
-    _addInsertEdit(listLoc + childArg.length, ']');
-  } else {
-    int newlineLoc = childArgSrc.lastIndexOf(eol);
-    if (newlineLoc == childArgSrc.length) {
-      newlineLoc -= 1;
+  static final _uriFlutterWebWidgets =
+      Uri.parse('package:flutter_web/widgets.dart');
+
+  final String packageName;
+  final String widgetsUri;
+
+  final Uri _uriAsync;
+  final Uri _uriBasic;
+  final Uri _uriContainer;
+  final Uri _uriFramework;
+  final Uri _uriWidgetsIcon;
+  final Uri _uriWidgetsText;
+
+  factory Flutter.of(AnalysisSession session) {
+    if (session.uriConverter.uriToPath(_uriFlutterWebWidgets) != null) {
+      return web;
     }
-    String indentOld = getLinePrefix(childArg.offset + 1 + newlineLoc);
-    String indentNew = '$indentOld${getIndent(1)}';
-    // The separator includes 'child:' but that has no newlines.
-    String separator =
-        getText(namedExp.offset, childArg.offset - namedExp.offset);
-    String prefix = separator.contains(eol) ? "" : "$eol$indentNew";
-    if (prefix.isEmpty) {
-      _addInsertEdit(namedExp.offset + 'child:'.length, ' <Widget>[');
-      _addRemoveEdit(new SourceRange(childArg.offset - 2, 2));
-    } else {
+    return mobile;
+  }
+
+  Flutter._(this.packageName, String uriPrefix)
+      : widgetsUri = '$uriPrefix/widgets.dart',
+        _uriAsync = Uri.parse('$uriPrefix/src/widgets/async.dart'),
+        _uriBasic = Uri.parse('$uriPrefix/src/widgets/basic.dart'),
+        _uriContainer = Uri.parse('$uriPrefix/src/widgets/container.dart'),
+        _uriFramework = Uri.parse('$uriPrefix/src/widgets/framework.dart'),
+        _uriWidgetsIcon = Uri.parse('$uriPrefix/src/widgets/icon.dart'),
+        _uriWidgetsText = Uri.parse('$uriPrefix/src/widgets/text.dart');
+
+  void convertChildToChildren(
+      InstanceCreationExpression childArg,
+      NamedExpression namedExp,
+      String eol,
+      Function getNodeText,
+      Function getLinePrefix,
+      Function getIndent,
+      Function getText,
+      Function _addInsertEdit,
+      Function _addRemoveEdit,
+      Function _addReplaceEdit,
+      Function rangeNode) {
+    int childLoc = namedExp.offset + 'child'.length;
+    _addInsertEdit(childLoc, 'ren');
+    int listLoc = childArg.offset;
+    String childArgSrc = getNodeText(childArg);
+    if (!childArgSrc.contains(eol)) {
       _addInsertEdit(listLoc, '<Widget>[');
-    }
-    String newChildArgSrc = childArgSrc.replaceAll(
-        new RegExp("^$indentOld", multiLine: true), "$indentNew");
-    newChildArgSrc = "$prefix$newChildArgSrc,$eol$indentOld]";
-    _addReplaceEdit(rangeNode(childArg), newChildArgSrc);
-  }
-}
-
-void convertChildToChildren2(
-    DartFileEditBuilder builder,
-    Expression childArg,
-    NamedExpression namedExp,
-    String eol,
-    Function getNodeText,
-    Function getLinePrefix,
-    Function getIndent,
-    Function getText,
-    Function rangeNode) {
-  int childLoc = namedExp.offset + 'child'.length;
-  builder.addSimpleInsertion(childLoc, 'ren');
-  int listLoc = childArg.offset;
-  String childArgSrc = getNodeText(childArg);
-  if (!childArgSrc.contains(eol)) {
-    builder.addSimpleInsertion(listLoc, '<Widget>[');
-    builder.addSimpleInsertion(listLoc + childArg.length, ']');
-  } else {
-    int newlineLoc = childArgSrc.lastIndexOf(eol);
-    if (newlineLoc == childArgSrc.length) {
-      newlineLoc -= 1;
-    }
-    String indentOld = getLinePrefix(childArg.offset + 1 + newlineLoc);
-    String indentNew = '$indentOld${getIndent(1)}';
-    // The separator includes 'child:' but that has no newlines.
-    String separator =
-        getText(namedExp.offset, childArg.offset - namedExp.offset);
-    String prefix = separator.contains(eol) ? "" : "$eol$indentNew";
-    if (prefix.isEmpty) {
-      builder.addSimpleInsertion(
-          namedExp.offset + 'child:'.length, ' <Widget>[');
-      builder.addDeletion(new SourceRange(childArg.offset - 2, 2));
+      _addInsertEdit(listLoc + childArg.length, ']');
     } else {
-      builder.addSimpleInsertion(listLoc, '<Widget>[');
+      int newlineLoc = childArgSrc.lastIndexOf(eol);
+      if (newlineLoc == childArgSrc.length) {
+        newlineLoc -= 1;
+      }
+      String indentOld = getLinePrefix(childArg.offset + 1 + newlineLoc);
+      String indentNew = '$indentOld${getIndent(1)}';
+      // The separator includes 'child:' but that has no newlines.
+      String separator =
+          getText(namedExp.offset, childArg.offset - namedExp.offset);
+      String prefix = separator.contains(eol) ? "" : "$eol$indentNew";
+      if (prefix.isEmpty) {
+        _addInsertEdit(namedExp.offset + 'child:'.length, ' <Widget>[');
+        _addRemoveEdit(new SourceRange(childArg.offset - 2, 2));
+      } else {
+        _addInsertEdit(listLoc, '<Widget>[');
+      }
+      String newChildArgSrc = childArgSrc.replaceAll(
+          new RegExp("^$indentOld", multiLine: true), "$indentNew");
+      newChildArgSrc = "$prefix$newChildArgSrc,$eol$indentOld]";
+      _addReplaceEdit(rangeNode(childArg), newChildArgSrc);
     }
-    String newChildArgSrc = childArgSrc.replaceAll(
-        new RegExp("^$indentOld", multiLine: true), "$indentNew");
-    newChildArgSrc = "$prefix$newChildArgSrc,$eol$indentOld]";
-    builder.addSimpleReplacement(rangeNode(childArg), newChildArgSrc);
   }
-}
 
-/**
- * Return the named expression representing the `child` argument of the given
- * [newExpr], or `null` if none.
- */
-NamedExpression findChildArgument(InstanceCreationExpression newExpr) =>
-    newExpr.argumentList.arguments
-        .firstWhere(isChildArgument, orElse: () => null);
-
-/**
- * Return the named expression representing the `children` argument of the
- * given [newExpr], or `null` if none.
- */
-NamedExpression findChildrenArgument(InstanceCreationExpression newExpr) =>
-    newExpr.argumentList.arguments
-        .firstWhere(isChildrenArgument, orElse: () => null);
-
-/**
- * Return the Flutter instance creation expression that is the value of the
- * 'child' argument of the given [newExpr], or null if none.
- */
-InstanceCreationExpression findChildWidget(InstanceCreationExpression newExpr) {
-  NamedExpression child = findChildArgument(newExpr);
-  return getChildWidget(child);
-}
-
-/**
- * If the given [node] is a simple identifier, find the named expression whose
- * name is the given [name] that is an argument to a Flutter instance creation
- * expression. Return null if any condition cannot be satisfied.
- */
-NamedExpression findNamedExpression(AstNode node, String name) {
-  if (node is! SimpleIdentifier) {
-    return null;
+  void convertChildToChildren2(
+      DartFileEditBuilder builder,
+      Expression childArg,
+      NamedExpression namedExp,
+      String eol,
+      Function getNodeText,
+      Function getLinePrefix,
+      Function getIndent,
+      Function getText,
+      Function rangeNode) {
+    int childLoc = namedExp.offset + 'child'.length;
+    builder.addSimpleInsertion(childLoc, 'ren');
+    int listLoc = childArg.offset;
+    String childArgSrc = getNodeText(childArg);
+    if (!childArgSrc.contains(eol)) {
+      builder.addSimpleInsertion(listLoc, '<Widget>[');
+      builder.addSimpleInsertion(listLoc + childArg.length, ']');
+    } else {
+      int newlineLoc = childArgSrc.lastIndexOf(eol);
+      if (newlineLoc == childArgSrc.length) {
+        newlineLoc -= 1;
+      }
+      String indentOld = getLinePrefix(childArg.offset + 1 + newlineLoc);
+      String indentNew = '$indentOld${getIndent(1)}';
+      // The separator includes 'child:' but that has no newlines.
+      String separator =
+          getText(namedExp.offset, childArg.offset - namedExp.offset);
+      String prefix = separator.contains(eol) ? "" : "$eol$indentNew";
+      if (prefix.isEmpty) {
+        builder.addSimpleInsertion(
+            namedExp.offset + 'child:'.length, ' <Widget>[');
+        builder.addDeletion(new SourceRange(childArg.offset - 2, 2));
+      } else {
+        builder.addSimpleInsertion(listLoc, '<Widget>[');
+      }
+      String newChildArgSrc = childArgSrc.replaceAll(
+          new RegExp("^$indentOld", multiLine: true), "$indentNew");
+      newChildArgSrc = "$prefix$newChildArgSrc,$eol$indentOld]";
+      builder.addSimpleReplacement(rangeNode(childArg), newChildArgSrc);
+    }
   }
-  SimpleIdentifier namedArg = node;
-  NamedExpression namedExp;
-  if (namedArg.parent is Label && namedArg.parent.parent is NamedExpression) {
-    namedExp = namedArg.parent.parent;
-    if (namedArg.name != name || namedExp.expression == null) {
+
+  /**
+   * Return the named expression representing the `child` argument of the given
+   * [newExpr], or `null` if none.
+   */
+  NamedExpression findChildArgument(InstanceCreationExpression newExpr) =>
+      newExpr.argumentList.arguments
+          .firstWhere(isChildArgument, orElse: () => null);
+
+  /**
+   * Return the named expression representing the `children` argument of the
+   * given [newExpr], or `null` if none.
+   */
+  NamedExpression findChildrenArgument(InstanceCreationExpression newExpr) =>
+      newExpr.argumentList.arguments
+          .firstWhere(isChildrenArgument, orElse: () => null);
+
+  /**
+   * Return the Flutter instance creation expression that is the value of the
+   * 'child' argument of the given [newExpr], or null if none.
+   */
+  InstanceCreationExpression findChildWidget(
+      InstanceCreationExpression newExpr) {
+    NamedExpression child = findChildArgument(newExpr);
+    return getChildWidget(child);
+  }
+
+  /**
+   * If the given [node] is a simple identifier, find the named expression whose
+   * name is the given [name] that is an argument to a Flutter instance creation
+   * expression. Return null if any condition cannot be satisfied.
+   */
+  NamedExpression findNamedExpression(AstNode node, String name) {
+    if (node is! SimpleIdentifier) {
       return null;
     }
-  } else {
-    return null;
-  }
-  if (namedExp.parent?.parent is! InstanceCreationExpression) {
-    return null;
-  }
-  InstanceCreationExpression newExpr = namedExp.parent.parent;
-  if (newExpr == null || !isWidgetCreation(newExpr)) {
-    return null;
-  }
-  return namedExp;
-}
-
-/**
- * Return the expression that is a Flutter Widget that is the value of the
- * given [child], or null if none.
- */
-Expression getChildWidget(NamedExpression child) {
-  Expression expression = child?.expression;
-  if (isWidgetExpression(expression)) {
-    return expression;
-  }
-  return null;
-}
-
-/**
- * Return the presentation for the given Flutter `Widget` creation [node].
- */
-String getWidgetPresentationText(InstanceCreationExpression node) {
-  ClassElement element = node.staticElement?.enclosingElement;
-  if (!isWidget(element)) {
-    return null;
-  }
-  List<Expression> arguments = node.argumentList.arguments;
-  if (_isExactWidget(
-      element, 'Icon', 'package:flutter/src/widgets/icon.dart')) {
-    if (arguments.isNotEmpty) {
-      String text = arguments[0].toString();
-      String arg = shorten(text, 32);
-      return 'Icon($arg)';
+    SimpleIdentifier namedArg = node;
+    NamedExpression namedExp;
+    if (namedArg.parent is Label && namedArg.parent.parent is NamedExpression) {
+      namedExp = namedArg.parent.parent;
+      if (namedArg.name != name || namedExp.expression == null) {
+        return null;
+      }
     } else {
-      return 'Icon';
+      return null;
     }
-  }
-  if (_isExactWidget(
-      element, 'Text', 'package:flutter/src/widgets/text.dart')) {
-    if (arguments.isNotEmpty) {
-      String text = arguments[0].toString();
-      String arg = shorten(text, 32);
-      return 'Text($arg)';
-    } else {
-      return 'Text';
+    if (namedExp.parent?.parent is! InstanceCreationExpression) {
+      return null;
     }
+    InstanceCreationExpression newExpr = namedExp.parent.parent;
+    if (newExpr == null || !isWidgetCreation(newExpr)) {
+      return null;
+    }
+    return namedExp;
   }
-  return element.name;
-}
 
-/**
- * Return the instance creation expression that surrounds the given
- * [node], if any, else null. The [node] may be the instance creation
- * expression itself or the identifier that names the constructor.
- */
-InstanceCreationExpression identifyNewExpression(AstNode node) {
-  InstanceCreationExpression newExpr;
-  if (node is SimpleIdentifier) {
-    if (node.parent is ConstructorName &&
-        node.parent.parent is InstanceCreationExpression) {
-      newExpr = node.parent.parent;
-    } else if (node.parent?.parent is ConstructorName &&
-        node.parent.parent?.parent is InstanceCreationExpression) {
-      newExpr = node.parent.parent.parent;
+  /**
+   * Return the expression that is a Flutter Widget that is the value of the
+   * given [child], or null if none.
+   */
+  Expression getChildWidget(NamedExpression child) {
+    Expression expression = child?.expression;
+    if (isWidgetExpression(expression)) {
+      return expression;
     }
-  } else if (node is InstanceCreationExpression) {
-    newExpr = node;
+    return null;
   }
-  return newExpr;
-}
 
-/**
- * Attempt to find and return the closest expression that encloses the [node]
- * and is an independent Flutter `Widget`.  Return `null` if nothing found.
- */
-Expression identifyWidgetExpression(AstNode node) {
-  for (; node != null; node = node.parent) {
-    if (isWidgetExpression(node)) {
-      var parent = node.parent;
-      if (parent is ArgumentList ||
-          parent is ListLiteral ||
-          parent is NamedExpression && parent.expression == node ||
-          parent is Statement) {
-        return node;
+  /**
+   * Return the presentation for the given Flutter `Widget` creation [node].
+   */
+  String getWidgetPresentationText(InstanceCreationExpression node) {
+    ClassElement element = node.staticElement?.enclosingElement;
+    if (!isWidget(element)) {
+      return null;
+    }
+    List<Expression> arguments = node.argumentList.arguments;
+    if (_isExactWidget(element, 'Icon', _uriWidgetsIcon)) {
+      if (arguments.isNotEmpty) {
+        String text = arguments[0].toString();
+        String arg = shorten(text, 32);
+        return 'Icon($arg)';
+      } else {
+        return 'Icon';
       }
     }
-    if (node is ArgumentList || node is Statement || node is FunctionBody) {
-      return null;
+    if (_isExactWidget(element, 'Text', _uriWidgetsText)) {
+      if (arguments.isNotEmpty) {
+        String text = arguments[0].toString();
+        String arg = shorten(text, 32);
+        return 'Text($arg)';
+      } else {
+        return 'Text';
+      }
     }
+    return element.name;
   }
-  return null;
-}
 
-/**
- * Return `true` is the given [argument] is the `child` argument.
- */
-bool isChildArgument(Expression argument) =>
-    argument is NamedExpression && argument.name.label.name == 'child';
-
-/**
- * Return `true` is the given [argument] is the `child` argument.
- */
-bool isChildrenArgument(Expression argument) =>
-    argument is NamedExpression && argument.name.label.name == 'children';
-
-/**
- * Return `true` if the given [type] is the Flutter class `StatefulWidget`.
- */
-bool isExactlyStatefulWidgetType(DartType type) {
-  return type is InterfaceType &&
-      _isExactWidget(type.element, _STATEFUL_WIDGET_NAME, _WIDGET_URI);
-}
-
-/**
- * Return `true` if the given [type] is the Flutter class `StatelessWidget`.
- */
-bool isExactlyStatelessWidgetType(DartType type) {
-  return type is InterfaceType &&
-      _isExactWidget(type.element, _STATELESS_WIDGET_NAME, _WIDGET_URI);
-}
-
-/// Return `true` if the given [element] is the Flutter class `State`.
-bool isExactState(ClassElement element) {
-  return _isExactWidget(element, _STATE_NAME, _WIDGET_URI);
-}
-
-/**
- * Return `true` if the given [type] is the Flutter class `Center`.
- */
-bool isExactWidgetTypeCenter(DartType type) {
-  return type is InterfaceType &&
-      _isExactWidget(type.element, _CENTER_NAME, _BASIC_URI);
-}
-
-/**
- * Return `true` if the given [type] is the Flutter class `Container`.
- */
-bool isExactWidgetTypeContainer(DartType type) {
-  return type is InterfaceType &&
-      _isExactWidget(type.element, _CONTAINER_NAME, _CONTAINER_URI);
-}
-
-/**
- * Return `true` if the given [type] is the Flutter class `Padding`.
- */
-bool isExactWidgetTypePadding(DartType type) {
-  return type is InterfaceType &&
-      _isExactWidget(type.element, _PADDING_NAME, _BASIC_URI);
-}
-
-/**
- * Return `true` if the given [type] is the Flutter class `StreamBuilder`.
- */
-bool isExactWidgetTypeStreamBuilder(DartType type) {
-  return type is InterfaceType &&
-      _isExactWidget(type.element, _STREAM_BUILDER_NAME, _STREAM_BUILDER_URI);
-}
-
-/**
- * Return `true` if the given [type] is the Flutter class `Widget`, or its
- * subtype.
- */
-bool isListOfWidgetsType(DartType type) {
-  return type is InterfaceType &&
-      type.element.library.isDartCore &&
-      type.element.name == 'List' &&
-      type.typeArguments.length == 1 &&
-      isWidgetType(type.typeArguments[0]);
-}
-
-/// Return `true` if the given [element] has the Flutter class `State` as
-/// a superclass.
-bool isState(ClassElement element) {
-  return _hasSupertype(element, _frameworkUri, _STATE_NAME);
-}
-
-/**
- * Return `true` if the given [element] is a [ClassElement] that extends
- * the Flutter class `StatefulWidget`.
- */
-bool isStatefulWidgetDeclaration(Element element) {
-  if (element is ClassElement) {
-    return isExactlyStatefulWidgetType(element.supertype);
+  /**
+   * Return the instance creation expression that surrounds the given
+   * [node], if any, else null. The [node] may be the instance creation
+   * expression itself or the identifier that names the constructor.
+   */
+  InstanceCreationExpression identifyNewExpression(AstNode node) {
+    InstanceCreationExpression newExpr;
+    if (node is SimpleIdentifier) {
+      if (node.parent is ConstructorName &&
+          node.parent.parent is InstanceCreationExpression) {
+        newExpr = node.parent.parent;
+      } else if (node.parent?.parent is ConstructorName &&
+          node.parent.parent?.parent is InstanceCreationExpression) {
+        newExpr = node.parent.parent.parent;
+      }
+    } else if (node is InstanceCreationExpression) {
+      newExpr = node;
+    }
+    return newExpr;
   }
-  return false;
-}
 
-/**
- * Return `true` if the given [element] is the Flutter class `Widget`, or its
- * subtype.
- */
-bool isWidget(ClassElement element) {
-  if (element == null) {
+  /**
+   * Attempt to find and return the closest expression that encloses the [node]
+   * and is an independent Flutter `Widget`.  Return `null` if nothing found.
+   */
+  Expression identifyWidgetExpression(AstNode node) {
+    for (; node != null; node = node.parent) {
+      if (isWidgetExpression(node)) {
+        var parent = node.parent;
+        if (parent is ArgumentList ||
+            parent is ListLiteral ||
+            parent is NamedExpression && parent.expression == node ||
+            parent is Statement) {
+          return node;
+        }
+      }
+      if (node is ArgumentList || node is Statement || node is FunctionBody) {
+        return null;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return `true` is the given [argument] is the `child` argument.
+   */
+  bool isChildArgument(Expression argument) =>
+      argument is NamedExpression && argument.name.label.name == 'child';
+
+  /**
+   * Return `true` is the given [argument] is the `child` argument.
+   */
+  bool isChildrenArgument(Expression argument) =>
+      argument is NamedExpression && argument.name.label.name == 'children';
+
+  /**
+   * Return `true` if the given [type] is the Flutter class `StatefulWidget`.
+   */
+  bool isExactlyStatefulWidgetType(DartType type) {
+    return type is InterfaceType &&
+        _isExactWidget(type.element, _nameStatefulWidget, _uriFramework);
+  }
+
+  /**
+   * Return `true` if the given [type] is the Flutter class `StatelessWidget`.
+   */
+  bool isExactlyStatelessWidgetType(DartType type) {
+    return type is InterfaceType &&
+        _isExactWidget(type.element, _nameStatelessWidget, _uriFramework);
+  }
+
+  /// Return `true` if the given [element] is the Flutter class `State`.
+  bool isExactState(ClassElement element) {
+    return _isExactWidget(element, _nameState, _uriFramework);
+  }
+
+  /**
+   * Return `true` if the given [type] is the Flutter class `Center`.
+   */
+  bool isExactWidgetTypeCenter(DartType type) {
+    return type is InterfaceType &&
+        _isExactWidget(type.element, _nameCenter, _uriBasic);
+  }
+
+  /**
+   * Return `true` if the given [type] is the Flutter class `Container`.
+   */
+  bool isExactWidgetTypeContainer(DartType type) {
+    return type is InterfaceType &&
+        _isExactWidget(type.element, _nameContainer, _uriContainer);
+  }
+
+  /**
+   * Return `true` if the given [type] is the Flutter class `Padding`.
+   */
+  bool isExactWidgetTypePadding(DartType type) {
+    return type is InterfaceType &&
+        _isExactWidget(type.element, _namePadding, _uriBasic);
+  }
+
+  /**
+   * Return `true` if the given [type] is the Flutter class `StreamBuilder`.
+   */
+  bool isExactWidgetTypeStreamBuilder(DartType type) {
+    return type is InterfaceType &&
+        _isExactWidget(type.element, _nameStreamBuilder, _uriAsync);
+  }
+
+  /**
+   * Return `true` if the given [type] is the Flutter class `Widget`, or its
+   * subtype.
+   */
+  bool isListOfWidgetsType(DartType type) {
+    return type is InterfaceType &&
+        type.element.library.isDartCore &&
+        type.element.name == 'List' &&
+        type.typeArguments.length == 1 &&
+        isWidgetType(type.typeArguments[0]);
+  }
+
+  /// Return `true` if the given [element] has the Flutter class `State` as
+  /// a superclass.
+  bool isState(ClassElement element) {
+    return _hasSupertype(element, _uriFramework, _nameState);
+  }
+
+  /**
+   * Return `true` if the given [element] is a [ClassElement] that extends
+   * the Flutter class `StatefulWidget`.
+   */
+  bool isStatefulWidgetDeclaration(Element element) {
+    if (element is ClassElement) {
+      return isExactlyStatefulWidgetType(element.supertype);
+    }
     return false;
   }
-  if (_isExactWidget(element, _WIDGET_NAME, _WIDGET_URI)) {
-    return true;
-  }
-  for (InterfaceType type in element.allSupertypes) {
-    if (_isExactWidget(type.element, _WIDGET_NAME, _WIDGET_URI)) {
+
+  /**
+   * Return `true` if the given [element] is the Flutter class `Widget`, or its
+   * subtype.
+   */
+  bool isWidget(ClassElement element) {
+    if (element == null) {
+      return false;
+    }
+    if (_isExactWidget(element, _nameWidget, _uriFramework)) {
       return true;
     }
-  }
-  return false;
-}
-
-/**
- * Return `true` if the given [expr] is a constructor invocation for a
- * class that has the Flutter class `Widget` as a superclass.
- */
-bool isWidgetCreation(InstanceCreationExpression expr) {
-  ClassElement element = expr?.staticElement?.enclosingElement;
-  return isWidget(element);
-}
-
-/**
- * Return `true` if the given [node] is the Flutter class `Widget`, or its
- * subtype.
- */
-bool isWidgetExpression(AstNode node) {
-  if (node == null) {
-    return false;
-  }
-  if (node.parent is TypeName || node.parent?.parent is TypeName) {
-    return false;
-  }
-  if (node.parent is ConstructorName) {
-    return false;
-  }
-  if (node is NamedExpression) {
-    return false;
-  }
-  if (node is Expression) {
-    return isWidgetType(node.staticType);
-  }
-  return false;
-}
-
-/**
- * Return `true` if the given [type] is the Flutter class `Widget`, or its
- * subtype.
- */
-bool isWidgetType(DartType type) {
-  return type is InterfaceType && isWidget(type.element);
-}
-
-/// Return `true` if the given [element] has a supertype with the [requiredName]
-/// defined in the file with the [requiredUri].
-bool _hasSupertype(ClassElement element, Uri requiredUri, String requiredName) {
-  if (element == null) {
-    return false;
-  }
-  for (InterfaceType type in element.allSupertypes) {
-    if (type.name == requiredName) {
-      Uri uri = type.element.source.uri;
-      if (uri == requiredUri) {
+    for (InterfaceType type in element.allSupertypes) {
+      if (_isExactWidget(type.element, _nameWidget, _uriFramework)) {
         return true;
       }
     }
+    return false;
   }
-  return false;
-}
 
-/**
- * Return `true` if the given [element] is the exact [type] defined in the
- * file with the given [uri].
- */
-bool _isExactWidget(ClassElement element, String type, String uri) {
-  return element != null &&
-      element.name == type &&
-      element.source.uri.toString() == uri;
+  /**
+   * Return `true` if the given [expr] is a constructor invocation for a
+   * class that has the Flutter class `Widget` as a superclass.
+   */
+  bool isWidgetCreation(InstanceCreationExpression expr) {
+    ClassElement element = expr?.staticElement?.enclosingElement;
+    return isWidget(element);
+  }
+
+  /**
+   * Return `true` if the given [node] is the Flutter class `Widget`, or its
+   * subtype.
+   */
+  bool isWidgetExpression(AstNode node) {
+    if (node == null) {
+      return false;
+    }
+    if (node.parent is TypeName || node.parent?.parent is TypeName) {
+      return false;
+    }
+    if (node.parent is ConstructorName) {
+      return false;
+    }
+    if (node is NamedExpression) {
+      return false;
+    }
+    if (node is Expression) {
+      return isWidgetType(node.staticType);
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given [type] is the Flutter class `Widget`, or its
+   * subtype.
+   */
+  bool isWidgetType(DartType type) {
+    return type is InterfaceType && isWidget(type.element);
+  }
+
+  /// Return `true` if the given [element] has a supertype with the [requiredName]
+  /// defined in the file with the [requiredUri].
+  bool _hasSupertype(
+      ClassElement element, Uri requiredUri, String requiredName) {
+    if (element == null) {
+      return false;
+    }
+    for (InterfaceType type in element.allSupertypes) {
+      if (type.name == requiredName) {
+        Uri uri = type.element.source.uri;
+        if (uri == requiredUri) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given [element] is the exact [type] defined in the
+   * file with the given [uri].
+   */
+  bool _isExactWidget(ClassElement element, String type, Uri uri) {
+    return element != null && element.name == type && element.source.uri == uri;
+  }
 }
diff --git a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
index 4aa6ddc..a7c001b 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
@@ -1178,8 +1178,8 @@
   @failingTest
   test_KEYWORD_awaitForIn_map() async {
     addTestFile('''
-f(a, b) async {
-  return {await for(var b in a) b};
+f(a) async {
+  return {await for(var b in a) b : 0};
 }
 ''');
     await prepareHighlights();
@@ -1191,7 +1191,7 @@
   @failingTest
   test_KEYWORD_awaitForIn_set() async {
     addTestFile('''
-f(a, b) async {
+f(a) async {
   return {await for(var b in a) b};
 }
 ''');
diff --git a/pkg/analysis_server/test/analysis/notification_highlights_test.dart b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
index b992bc9..78517c2 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
@@ -1027,8 +1027,8 @@
   @failingTest
   test_KEYWORD_awaitForIn_map() async {
     addTestFile('''
-f(a, b) async {
-  return {await for(var b in a) b};
+f(a) async {
+  return {await for(var b in a) b : 0};
 }
 ''');
     await prepareHighlights();
@@ -1040,7 +1040,7 @@
   @failingTest
   test_KEYWORD_awaitForIn_set() async {
     addTestFile('''
-f(a, b) async {
+f(a) async {
   return {await for(var b in a) b};
 }
 ''');
diff --git a/pkg/analysis_server/test/integration/coverage.md b/pkg/analysis_server/test/integration/coverage.md
index 6f13a5e..1728314 100644
--- a/pkg/analysis_server/test/integration/coverage.md
+++ b/pkg/analysis_server/test/integration/coverage.md
@@ -33,6 +33,7 @@
 - [ ] completion.availableSuggestions
 - [ ] completion.getSuggestionDetails
 - [x] completion.getSuggestions
+- [ ] completion.listTokenDetails
 - [ ] completion.registerLibraryPaths
 - [ ] completion.results
 - [ ] completion.setSubscriptions
diff --git a/pkg/analysis_server/test/integration/linter/lint_names_test.dart b/pkg/analysis_server/test/integration/linter/lint_names_test.dart
new file mode 100644
index 0000000..1a515bf
--- /dev/null
+++ b/pkg/analysis_server/test/integration/linter/lint_names_test.dart
@@ -0,0 +1,105 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/scanner/reader.dart';
+import 'package:analyzer/src/dart/scanner/scanner.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/lint/linter.dart';
+import 'package:analyzer/src/lint/registry.dart';
+import 'package:analyzer/src/string_source.dart';
+import 'package:linter/src/rules.dart';
+import 'package:meta/meta.dart';
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+
+main() {
+  // Set prefix for local or bot execution.
+  final pathPrefix =
+      FileSystemEntity.isDirectorySync(path.join('test', 'integration'))
+          ? ''
+          : path.join('pkg', 'analysis_server');
+
+  /// Ensure server lint name representations correspond w/ actual lint rules.
+  /// See, e.g., https://dart-review.googlesource.com/c/sdk/+/95743.
+  group('lint_names', () {
+    var fixFileContents = new File(path.join(pathPrefix, 'lib', 'src',
+            'services', 'correction', 'fix_internal.dart'))
+        .readAsStringSync();
+    var parser = new CompilationUnitParser();
+    var cu = parser.parse(contents: fixFileContents, name: 'fix_internal.dart');
+    var lintNamesClass = cu.declarations
+        .firstWhere((m) => m is ClassDeclaration && m.name.name == 'LintNames');
+
+    var collector = new _FixCollector();
+    lintNamesClass.accept(collector);
+    for (var name in collector.lintNames) {
+      test(name, () {
+        expect(registeredLintNames, contains(name));
+      });
+    }
+  });
+}
+
+List<LintRule> _registeredLints;
+
+Iterable<String> get registeredLintNames => registeredLints.map((r) => r.name);
+
+List<LintRule> get registeredLints {
+  if (_registeredLints == null) {
+    if (Registry.ruleRegistry.isEmpty) {
+      registerLintRules();
+    }
+    _registeredLints = Registry.ruleRegistry.toList();
+  }
+  return _registeredLints;
+}
+
+class CompilationUnitParser {
+  CompilationUnit parse({@required String contents, @required String name}) {
+    var reader = new CharSequenceReader(contents);
+    var stringSource = new StringSource(contents, name);
+    var errorListener = new _ErrorListener();
+    var scanner = new Scanner(stringSource, reader, errorListener);
+    var startToken = scanner.tokenize();
+    errorListener.throwIfErrors();
+
+    var parser = new Parser(stringSource, errorListener);
+    var cu = parser.parseCompilationUnit(startToken);
+    errorListener.throwIfErrors();
+
+    return cu;
+  }
+}
+
+class _ErrorListener implements AnalysisErrorListener {
+  final errors = <AnalysisError>[];
+
+  @override
+  void onError(AnalysisError error) {
+    errors.add(error);
+  }
+
+  void throwIfErrors() {
+    if (errors.isNotEmpty) {
+      throw new Exception(errors);
+    }
+  }
+}
+
+class _FixCollector extends GeneralizingAstVisitor<void> {
+  final List<String> lintNames = <String>[];
+
+  @override
+  void visitFieldDeclaration(FieldDeclaration node) {
+    for (var v in node.fields.variables) {
+      lintNames.add(v.name.name);
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/integration/lsp_server/initialization_test.dart b/pkg/analysis_server/test/integration/lsp_server/initialization_test.dart
new file mode 100644
index 0000000..8d364dc
--- /dev/null
+++ b/pkg/analysis_server/test/integration/lsp_server/initialization_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'integration_tests.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InitializationTest);
+  });
+}
+
+@reflectiveTest
+class InitializationTest extends AbstractLspAnalysisServerIntegrationTest {
+  test_initialize_invalidParams() async {
+    final params = {'processId': 'invalid'};
+    final request = new RequestMessage(
+      Either2<num, String>.t1(1),
+      Method.initialize,
+      params,
+      jsonRpcVersion,
+    );
+    final response = await sendRequestToServer(request);
+    expect(response.id, equals(request.id));
+    expect(response.error, isNotNull);
+    expect(response.error.code, equals(ErrorCodes.InvalidParams));
+    expect(response.result, isNull);
+  }
+}
diff --git a/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart b/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
index 8f21d53..f8a1713 100644
--- a/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:analysis_server/lsp_protocol/protocol_custom_generated.dart';
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/src/lsp/channel/lsp_byte_stream_channel.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -25,6 +26,29 @@
   @override
   Stream<Message> get serverToClient => client.serverToClient;
 
+  /// Sends a request to the server and unwraps the result. Throws if the
+  /// response was not successful or returned an error.
+  Future<T> expectSuccessfulResponseTo<T>(RequestMessage request) async {
+    final resp = await sendRequestToServer(request);
+    if (resp.error != null) {
+      throw resp.error;
+      // TODO(dantup): It would be better if we had some code-gen'd way
+      // to be able to deserialise into the correct types. We could either
+      // code-gen this list, or code-gen the LSP client (used in tests) to
+      // give strongly typed sendXxx functions that return the correct types.
+    } else if (T == DartDiagnosticServer) {
+      return DartDiagnosticServer.fromJson(resp.result) as T;
+    } else if (T == Null) {
+      return resp.result == null
+          ? null
+          : throw 'Expected Null response but got ${resp.result}';
+    } else {
+      throw 'Unable to deserialise ${resp.result.runtimeType} into $T.\n\n'
+          'You may need to extend expectSuccessfulResponseTo in '
+          'AbstractLspAnalysisServerIntegrationTest';
+    }
+  }
+
   @override
   void sendNotificationToServer(NotificationMessage notification) =>
       client.channel.sendNotification(notification);
@@ -46,6 +70,12 @@
       client.channel.sendResponse(response);
 
   Future setUp() async {
+    // Set up temporary folder for the test.
+    projectFolderPath = Directory.systemTemp
+        .createTempSync('analysisServer')
+        .resolveSymbolicLinksSync();
+    projectFolderUri = Uri.file(projectFolderPath);
+
     client = new LspServerClient();
     await client.start();
     client.serverToClient.listen((message) {
@@ -121,6 +151,13 @@
       }
     });
 
+    // If the server writes to stderr, fail tests with a more useful message
+    // (rather than having the test just hang waiting for a response).
+    _process.stderr.listen((data) {
+      final message = String.fromCharCodes(data);
+      throw 'Analysis Server wrote to stderr:\n\n$message';
+    });
+
     channel = new LspByteStreamServerChannel(
         _process.stdout, _process.stdin, InstrumentationService.NULL_SERVICE);
     channel.listen(_serverToClient.add);
diff --git a/pkg/analysis_server/test/integration/lsp_server/server_test.dart b/pkg/analysis_server/test/integration/lsp_server/server_test.dart
index 0e3c8c0..0b90316 100644
--- a/pkg/analysis_server/test/integration/lsp_server/server_test.dart
+++ b/pkg/analysis_server/test/integration/lsp_server/server_test.dart
@@ -2,6 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:convert';
+import 'dart:io';
+
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -15,7 +18,28 @@
 
 @reflectiveTest
 class ServerTest extends AbstractLspAnalysisServerIntegrationTest {
-  test_exit_afterShutdown() async {
+  test_diagnosticServer() async {
+    await initialize();
+
+    // Send the custom request to the LSP server to get the Dart diagnostic
+    // server info.
+    final server = await getDiagnosticServer();
+
+    expect(server.port, isNotNull);
+    expect(server.port, isNonZero);
+    expect(server.port, isPositive);
+
+    // Ensure the server was actually started.
+    final client = new HttpClient();
+    HttpClientRequest request = await client
+        .getUrl(Uri.parse('http://localhost:${server.port}/status'));
+    final response = await request.close();
+    final responseBody = await utf8.decodeStream(response);
+    expect(responseBody, contains('<title>Analysis Server</title>'));
+  }
+
+  test_exit_inintializedWithShutdown() async {
+    await initialize();
     await sendShutdown();
     sendExit();
 
@@ -29,8 +53,11 @@
     expect(exitCode, equals(0));
   }
 
-  @failingTest
-  test_exit_withoutShutdown() async {
+  test_exit_initializedWithoutShutdown() async {
+    // Send a request that we can wait for, to ensure the server is fully ready
+    // before we send exit. Otherwise the exit notification won't be handled for
+    // a long time (while the server starts up) and will exceed the 10s timeout.
+    await initialize();
     sendExit();
 
     await client.channel.closed.timeout(const Duration(seconds: 10),
@@ -40,7 +67,33 @@
     final exitCode = await client.exitCode.timeout(const Duration(seconds: 10),
         onTimeout: () => fail('Server process did not exit within 10 seconds'));
 
-    // TODO(dantup): Fix the server so this works.
+    expect(exitCode, equals(1));
+  }
+
+  test_exit_uninintializedWithShutdown() async {
+    await sendShutdown();
+    sendExit();
+
+    await client.channel.closed.timeout(const Duration(seconds: 10),
+        onTimeout: () =>
+            fail('Server channel did not close within 10 seconds'));
+
+    final exitCode = await client.exitCode.timeout(const Duration(seconds: 10),
+        onTimeout: () => fail('Server process did not exit within 10 seconds'));
+
+    expect(exitCode, equals(0));
+  }
+
+  test_exit_uninitializedWithoutShutdown() async {
+    // This tests the same as test_exit_withoutShutdown but without sending
+    // initialize. It can't be as strict with the timeout as the server may take
+    // time to start up (we can't tell when it's ready without sending a request).
+
+    sendExit();
+
+    await client.channel.closed;
+    final exitCode = await client.exitCode;
+
     expect(exitCode, equals(1));
   }
 }
diff --git a/pkg/analysis_server/test/integration/lsp_server/test_all.dart b/pkg/analysis_server/test/integration/lsp_server/test_all.dart
new file mode 100644
index 0000000..7f67613
--- /dev/null
+++ b/pkg/analysis_server/test/integration/lsp_server/test_all.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'initialization_test.dart' as initialization_test;
+import 'server_test.dart' as server_test;
+
+main() {
+  defineReflectiveSuite(() {
+    initialization_test.main();
+    server_test.main();
+  }, name: 'lsp integration');
+}
diff --git a/pkg/analysis_server/test/integration/support/integration_test_methods.dart b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
index c536416..cfd4d3a 100644
--- a/pkg/analysis_server/test/integration/support/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
@@ -1155,6 +1155,33 @@
   }
 
   /**
+   * Inspect analysis server's knowledge about all of a file's tokens including
+   * their lexeme, type, and what element kinds would have been appropriate for
+   * the token's program location.
+   *
+   * Parameters
+   *
+   * file: FilePath
+   *
+   *   The path to the file from which tokens should be returned.
+   *
+   * Returns
+   *
+   * tokens: List<TokenDetails>
+   *
+   *   A list of the file's scanned tokens including analysis information about
+   *   them.
+   */
+  Future<CompletionListTokenDetailsResult> sendCompletionListTokenDetails(
+      String file) async {
+    var params = new CompletionListTokenDetailsParams(file).toJson();
+    var result = await server.send("completion.listTokenDetails", params);
+    ResponseDecoder decoder = new ResponseDecoder(null);
+    return new CompletionListTokenDetailsResult.fromJson(
+        decoder, 'result', result);
+  }
+
+  /**
    * Reports the completion suggestions that should be presented to the user.
    * The set of suggestions included in the notification is always a complete
    * list that supersedes any previously reported suggestions.
@@ -1194,15 +1221,11 @@
    *
    * includedSuggestionSets: List<IncludedSuggestionSet> (optional)
    *
-   *   This field is experimental.
-   *
    *   References to AvailableSuggestionSet objects previously sent to the
    *   client. The client can include applicable names from the referenced
    *   library in code completion suggestions.
    *
-   * includedSuggestionKinds: List<ElementKind> (optional)
-   *
-   *   This field is experimental.
+   * includedElementKinds: List<ElementKind> (optional)
    *
    *   The client is expected to check this list against the ElementKind sent
    *   in IncludedSuggestionSet to decide whether or not these symbols should
@@ -1211,8 +1234,6 @@
    * includedSuggestionRelevanceTags: List<IncludedSuggestionRelevanceTag>
    * (optional)
    *
-   *   This field is experimental.
-   *
    *   The client is expected to check this list against the values of the
    *   field relevanceTags of AvailableSuggestion to decide if the suggestion
    *   should be given a different relevance than the IncludedSuggestionSet
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index ef2ded9..3369f94 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -169,6 +169,8 @@
  * {
  *   "label": String
  *   "element": Element
+ *   "defaultArgumentListString": optional String
+ *   "defaultArgumentListTextRanges": optional List<int>
  *   "docComplete": optional String
  *   "docSummary": optional String
  *   "parameterNames": optional List<String>
@@ -182,6 +184,8 @@
           "label": isString,
           "element": isElement
         }, optionalFields: {
+          "defaultArgumentListString": isString,
+          "defaultArgumentListTextRanges": isListOf(isInt),
           "docComplete": isString,
           "docSummary": isString,
           "parameterNames": isListOf(isString),
@@ -262,7 +266,6 @@
  *   "relevance": int
  *   "completion": String
  *   "displayText": optional String
- *   "elementUri": optional String
  *   "selectionOffset": int
  *   "selectionLength": int
  *   "isDeprecated": bool
@@ -280,7 +283,6 @@
  *   "hasNamedParameters": optional bool
  *   "parameterName": optional String
  *   "parameterType": optional String
- *   "importUri": optional String
  * }
  */
 final Matcher isCompletionSuggestion =
@@ -294,7 +296,6 @@
           "isPotential": isBool
         }, optionalFields: {
           "displayText": isString,
-          "elementUri": isString,
           "docSummary": isString,
           "docComplete": isString,
           "declaringType": isString,
@@ -307,8 +308,7 @@
           "requiredParameterCount": isInt,
           "hasNamedParameters": isBool,
           "parameterName": isString,
-          "parameterType": isString,
-          "importUri": isString
+          "parameterType": isString
         }));
 
 /**
@@ -963,11 +963,13 @@
  * {
  *   "id": int
  *   "relevance": int
+ *   "displayUri": optional String
  * }
  */
 final Matcher isIncludedSuggestionSet = new LazyMatcher(() =>
     new MatchesJsonObject(
-        "IncludedSuggestionSet", {"id": isInt, "relevance": isInt}));
+        "IncludedSuggestionSet", {"id": isInt, "relevance": isInt},
+        optionalFields: {"displayUri": isString}));
 
 /**
  * KytheEntry
@@ -1610,6 +1612,22 @@
     {"file": isFilePath, "fileStamp": isInt, "edits": isListOf(isSourceEdit)}));
 
 /**
+ * TokenDetails
+ *
+ * {
+ *   "lexeme": String
+ *   "type": String
+ *   "validElementKinds": List<ElementKind>
+ * }
+ */
+final Matcher isTokenDetails =
+    new LazyMatcher(() => new MatchesJsonObject("TokenDetails", {
+          "lexeme": isString,
+          "type": isString,
+          "validElementKinds": isListOf(isElementKind)
+        }));
+
+/**
  * TypeHierarchyItem
  *
  * {
@@ -2208,6 +2226,28 @@
         "completion.getSuggestions result", {"id": isCompletionId}));
 
 /**
+ * completion.listTokenDetails params
+ *
+ * {
+ *   "file": FilePath
+ * }
+ */
+final Matcher isCompletionListTokenDetailsParams = new LazyMatcher(() =>
+    new MatchesJsonObject(
+        "completion.listTokenDetails params", {"file": isFilePath}));
+
+/**
+ * completion.listTokenDetails result
+ *
+ * {
+ *   "tokens": List<TokenDetails>
+ * }
+ */
+final Matcher isCompletionListTokenDetailsResult = new LazyMatcher(() =>
+    new MatchesJsonObject("completion.listTokenDetails result",
+        {"tokens": isListOf(isTokenDetails)}));
+
+/**
  * completion.registerLibraryPaths params
  *
  * {
@@ -2233,7 +2273,7 @@
  *   "results": List<CompletionSuggestion>
  *   "isLast": bool
  *   "includedSuggestionSets": optional List<IncludedSuggestionSet>
- *   "includedSuggestionKinds": optional List<ElementKind>
+ *   "includedElementKinds": optional List<ElementKind>
  *   "includedSuggestionRelevanceTags": optional List<IncludedSuggestionRelevanceTag>
  * }
  */
@@ -2246,7 +2286,7 @@
           "isLast": isBool
         }, optionalFields: {
           "includedSuggestionSets": isListOf(isIncludedSuggestionSet),
-          "includedSuggestionKinds": isListOf(isElementKind),
+          "includedElementKinds": isListOf(isElementKind),
           "includedSuggestionRelevanceTags":
               isListOf(isIncludedSuggestionRelevanceTag)
         }));
diff --git a/pkg/analysis_server/test/integration/test_all.dart b/pkg/analysis_server/test/integration/test_all.dart
index ce11216..3479ca8 100644
--- a/pkg/analysis_server/test/integration/test_all.dart
+++ b/pkg/analysis_server/test/integration/test_all.dart
@@ -12,6 +12,7 @@
 import 'edit/test_all.dart' as edit_test_all;
 import 'execution/test_all.dart' as execution_test_all;
 import 'kythe/test_all.dart' as kythe_test_all;
+import 'linter/lint_names_test.dart' as lint_names_test;
 import 'search/test_all.dart' as search_test_all;
 import 'server/test_all.dart' as server_test_all;
 
@@ -27,6 +28,7 @@
     edit_test_all.main();
     execution_test_all.main();
     kythe_test_all.main();
+    lint_names_test.main();
     search_test_all.main();
     server_test_all.main();
 
diff --git a/pkg/analysis_server/test/lsp/completion_test.dart b/pkg/analysis_server/test/lsp/completion_test.dart
index 26685ec..b3554c1 100644
--- a/pkg/analysis_server/test/lsp/completion_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_test.dart
@@ -6,6 +6,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../tool/lsp_spec/matchers.dart';
 import 'server_abstract.dart';
 
 main() {
@@ -89,6 +90,20 @@
     );
   }
 
+  test_completionTriggerKinds_invalidParams() async {
+    await initialize();
+
+    final invalidTriggerKind = CompletionTriggerKind.fromJson(-1);
+    final request = getCompletion(
+      mainFileUri,
+      new Position(0, 0),
+      context: new CompletionContext(invalidTriggerKind, 'A'),
+    );
+
+    await expectLater(
+        request, throwsA(isResponseError(ErrorCodes.InvalidParams)));
+  }
+
   test_gettersAndSetters() async {
     final content = '''
     class MyClass {
diff --git a/pkg/analysis_server/test/lsp/initialization_test.dart b/pkg/analysis_server/test/lsp/initialization_test.dart
index edbad6e..26b7028 100644
--- a/pkg/analysis_server/test/lsp/initialization_test.dart
+++ b/pkg/analysis_server/test/lsp/initialization_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -38,9 +39,24 @@
     );
   }
 
+  test_initialize_invalidParams() async {
+    final params = {'processId': 'invalid'};
+    final request = new RequestMessage(
+      Either2<num, String>.t1(1),
+      Method.initialize,
+      params,
+      jsonRpcVersion,
+    );
+    final response = await sendRequestToServer(request);
+    expect(response.id, equals(request.id));
+    expect(response.error, isNotNull);
+    expect(response.error.code, equals(ErrorCodes.InvalidParams));
+    expect(response.result, isNull);
+  }
+
   test_initialize_onlyAllowedOnce() async {
     await initialize();
-    final response = await initialize();
+    final response = await initialize(throwOnFailure: false);
     expect(response, isNotNull);
     expect(response.result, isNull);
     expect(response.error, isNotNull);
@@ -58,6 +74,85 @@
     expect(server.contextManager.includedPaths, equals([projectFolderPath]));
   }
 
+  test_onlyAnalyzeProjectsWithOpenFiles_withPubpsec() async {
+    final nestedFilePath = join(
+        projectFolderPath, 'nested', 'deeply', 'in', 'folders', 'test.dart');
+    final nestedFileUri = Uri.file(nestedFilePath);
+    await newFile(nestedFilePath);
+    final pubspecPath = join(projectFolderPath, 'pubspec.yaml');
+    await newFile(pubspecPath);
+
+    // The project folder shouldn't be added to start with.
+    await initialize(
+      rootUri: projectFolderUri,
+      initializationOptions: {'onlyAnalyzeProjectsWithOpenFiles': true},
+    );
+    expect(server.contextManager.includedPaths, equals([]));
+
+    // Opening a file nested within the project should add the project folder.
+    await openFile(nestedFileUri, '');
+    expect(server.contextManager.includedPaths, equals([projectFolderPath]));
+
+    // Closing the file should remove it.
+    await closeFile(nestedFileUri);
+    expect(server.contextManager.includedPaths, equals([]));
+  }
+
+  test_onlyAnalyzeProjectsWithOpenFiles_multipleFiles() async {
+    final file1 = join(projectFolderPath, 'file1.dart');
+    final file1Uri = Uri.file(file1);
+    await newFile(file1);
+    final file2 = join(projectFolderPath, 'file2.dart');
+    final file2Uri = Uri.file(file2);
+    await newFile(file2);
+    final pubspecPath = join(projectFolderPath, 'pubspec.yaml');
+    await newFile(pubspecPath);
+
+    await initialize(
+      rootUri: projectFolderUri,
+      initializationOptions: {'onlyAnalyzeProjectsWithOpenFiles': true},
+    );
+
+    // Opening both files should only add the project folder once.
+    await openFile(file1Uri, '');
+    await openFile(file2Uri, '');
+    expect(server.contextManager.includedPaths, equals([projectFolderPath]));
+
+    // Closing only one of the files should not remove the project folder
+    // since there are still open files.
+    await closeFile(file1Uri);
+    expect(server.contextManager.includedPaths, equals([projectFolderPath]));
+
+    // Closing the last file should remove the project folder.
+    await closeFile(file2Uri);
+    expect(server.contextManager.includedPaths, equals([]));
+  }
+
+  test_onlyAnalyzeProjectsWithOpenFiles_withoutPubpsec() async {
+    final nestedFilePath = join(
+        projectFolderPath, 'nested', 'deeply', 'in', 'folders', 'test.dart');
+    final nestedFileUri = Uri.file(nestedFilePath);
+    await newFile(nestedFilePath);
+
+    // The project folder shouldn't be added to start with.
+    await initialize(
+      rootUri: projectFolderUri,
+      initializationOptions: {'onlyAnalyzeProjectsWithOpenFiles': true},
+    );
+    expect(server.contextManager.includedPaths, equals([]));
+
+    // Opening a file nested within the project will still not add the project
+    // folder because there was no pubspec.
+    final messageFromServer = await expectNotification<ShowMessageParams>(
+      (notification) => notification.method == Method.window_showMessage,
+      () => openFile(nestedFileUri, ''),
+    );
+    expect(server.contextManager.includedPaths, equals([]));
+    expect(messageFromServer.type, MessageType.Warning);
+    expect(messageFromServer.message,
+        contains('using onlyAnalyzeProjectsWithOpenFiles'));
+  }
+
   test_initialize_workspaceFolders() async {
     await initialize(workspaceFolders: [projectFolderUri]);
     expect(server.contextManager.includedPaths, equals([projectFolderPath]));
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index a1735ec..108a850 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -279,6 +279,20 @@
     return notificationFromServer.params as T;
   }
 
+  Future<T> expectNotification<T>(
+    bool Function(NotificationMessage) test,
+    FutureOr<void> f(), {
+    Duration timeout = const Duration(seconds: 5),
+  }) async {
+    final firstError = notificationsFromServer.firstWhere(test);
+    await f();
+
+    final notificationFromServer = await firstError.timeout(timeout);
+
+    expect(notificationFromServer, isNotNull);
+    return notificationFromServer.params as T;
+  }
+
   /// Expects a [method] request from the server after executing [f].
   Future<RequestMessage> expectRequest(
     Method method,
@@ -295,16 +309,7 @@
     return requestFromServer;
   }
 
-  /// Sends a request to the server and unwraps the result. Throws if the
-  /// response was not successful or returned an error.
-  Future<T> expectSuccessfulResponseTo<T>(RequestMessage request) async {
-    final resp = await sendRequestToServer(request);
-    if (resp.error != null) {
-      throw resp.error;
-    } else {
-      return resp.result as T;
-    }
-  }
+  Future<T> expectSuccessfulResponseTo<T>(RequestMessage request);
 
   Future<List<TextEdit>> formatDocument(String fileUri) {
     final request = makeRequest(
@@ -509,6 +514,8 @@
     List<Uri> workspaceFolders,
     TextDocumentClientCapabilities textDocumentCapabilities,
     WorkspaceClientCapabilities workspaceCapabilities,
+    Map<String, Object> initializationOptions,
+    bool throwOnFailure = true,
   }) async {
     // Assume if none of the project options were set, that we want to default to
     // opening the test project folder.
@@ -521,7 +528,7 @@
             null,
             rootPath,
             rootUri?.toString(),
-            null,
+            initializationOptions,
             new ClientCapabilities(
               workspaceCapabilities,
               textDocumentCapabilities,
@@ -533,9 +540,13 @@
     expect(response.id, equals(request.id));
 
     if (response.error == null) {
-      final notification = makeNotification(Method.initialized, null);
+      final notification =
+          makeNotification(Method.initialized, new InitializedParams());
       sendNotificationToServer(notification);
       await pumpEventQueue();
+    } else if (throwOnFailure) {
+      throw 'Error during initialize request: '
+          '${response.error.code}: ${response.error.message}';
     }
 
     return response;
@@ -731,6 +742,17 @@
 
   Stream<Message> get serverToClient => channel.serverToClient;
 
+  /// Sends a request to the server and unwraps the result. Throws if the
+  /// response was not successful or returned an error.
+  Future<T> expectSuccessfulResponseTo<T>(RequestMessage request) async {
+    final resp = await sendRequestToServer(request);
+    if (resp.error != null) {
+      throw resp.error;
+    } else {
+      return resp.result as T;
+    }
+  }
+
   Future sendNotificationToServer(NotificationMessage notification) async {
     channel.sendNotificationToServer(notification);
     await pumpEventQueue();
diff --git a/pkg/analysis_server/test/lsp/server_test.dart b/pkg/analysis_server/test/lsp/server_test.dart
index f935b60..eb79236 100644
--- a/pkg/analysis_server/test/lsp/server_test.dart
+++ b/pkg/analysis_server/test/lsp/server_test.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:convert';
-import 'dart:io';
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -65,31 +62,6 @@
     );
   }
 
-  @failingTest
-  test_diagnosticServer() async {
-    // TODO(dantup): This test fails because server.diagnosticServer is not
-    // set up in these tests. This needs moving to an integration test (which
-    // we don't yet have for LSP, but the existing server does have that we
-    // can mirror).
-    await initialize();
-
-    // Send the custom request to the LSP server to get the Dart diagnostic
-    // server info.
-    final server = await getDiagnosticServer();
-
-    expect(server.port, isNotNull);
-    expect(server.port, isNonZero);
-    expect(server.port, isPositive);
-
-    // Ensure the server was actually started.
-    final client = new HttpClient();
-    HttpClientRequest request = await client
-        .getUrl(Uri.parse('http://localhost:${server.port}/status'));
-    final response = await request.close();
-    final responseBody = await utf8.decodeStream(response);
-    expect(responseBody, contains('<title>Analysis Server</title>'));
-  }
-
   test_unknownOptionalNotifications_silentlyDropped() async {
     await initialize();
     final notification =
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index 9bb1010..e7047ba 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -102,7 +102,6 @@
   CompletionSuggestion assertSuggest(String completion,
       {CompletionSuggestionKind csKind: CompletionSuggestionKind.INVOCATION,
       int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       ElementKind elemKind: null,
       bool isDeprecated: false,
       bool isPotential: false,
@@ -124,7 +123,6 @@
     } else {
       expect(cs.relevance, equals(relevance), reason: completion);
     }
-    expect(cs.importUri, importUri);
     expect(cs.selectionOffset, equals(selectionOffset ?? completion.length));
     expect(cs.selectionLength, equals(0));
     expect(cs.isDeprecated, equals(isDeprecated));
@@ -160,7 +158,6 @@
 
   CompletionSuggestion assertSuggestClass(String name,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
       bool isDeprecated: false,
       String elemFile,
@@ -169,7 +166,6 @@
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
-        importUri: importUri,
         isDeprecated: isDeprecated,
         elemFile: elemFile,
         elemKind: ElementKind.CLASS,
@@ -201,14 +197,12 @@
 
   CompletionSuggestion assertSuggestConstructor(String name,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       String elementName,
       int elemOffset,
       String defaultArgListString: _UNCHECKED,
       List<int> defaultArgumentListTextRanges}) {
     CompletionSuggestion cs = assertSuggest(name,
         relevance: relevance,
-        importUri: importUri,
         elemKind: ElementKind.CONSTRUCTOR,
         elemOffset: elemOffset,
         defaultArgListString: defaultArgListString,
@@ -248,13 +242,11 @@
 
   CompletionSuggestion assertSuggestField(String name, String type,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
       bool isDeprecated: false}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
-        importUri: importUri,
         elemKind: ElementKind.FIELD,
         isDeprecated: isDeprecated);
     // The returnType represents the type of a field
@@ -274,13 +266,11 @@
       {CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
       bool isDeprecated: false,
       int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       String defaultArgListString: _UNCHECKED,
       List<int> defaultArgumentListTextRanges}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
-        importUri: importUri,
         isDeprecated: isDeprecated,
         defaultArgListString: defaultArgListString,
         defaultArgumentListTextRanges: defaultArgumentListTextRanges);
@@ -308,16 +298,14 @@
   }
 
   CompletionSuggestion assertSuggestFunctionTypeAlias(
-      String name, String returnType,
-      {bool isDeprecated: false,
-      int relevance: DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      String importUri}) {
+    String name,
+    String returnType, {
+    bool isDeprecated: false,
+    int relevance: DART_RELEVANCE_DEFAULT,
+    CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
+  }) {
     CompletionSuggestion cs = assertSuggest(name,
-        csKind: kind,
-        relevance: relevance,
-        importUri: importUri,
-        isDeprecated: isDeprecated);
+        csKind: kind, relevance: relevance, isDeprecated: isDeprecated);
     if (returnType != null) {
       expect(cs.returnType, returnType);
     } else if (isNullExpectedReturnTypeConsideredDynamic) {
@@ -344,13 +332,11 @@
 
   CompletionSuggestion assertSuggestGetter(String name, String returnType,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
       bool isDeprecated: false}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
-        importUri: importUri,
         elemKind: ElementKind.GETTER,
         isDeprecated: isDeprecated);
     expect(cs.returnType, returnType != null ? returnType : 'dynamic');
@@ -368,7 +354,6 @@
   CompletionSuggestion assertSuggestMethod(
       String name, String declaringType, String returnType,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
       bool isDeprecated: false,
       String defaultArgListString: _UNCHECKED,
@@ -376,7 +361,6 @@
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
-        importUri: importUri,
         isDeprecated: isDeprecated,
         defaultArgListString: defaultArgListString,
         defaultArgumentListTextRanges: defaultArgumentListTextRanges);
@@ -395,16 +379,36 @@
     return cs;
   }
 
-  CompletionSuggestion assertSuggestName(String name,
+  CompletionSuggestion assertSuggestMixin(String name,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.IDENTIFIER,
-      bool isDeprecated: false}) {
+      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
+      bool isDeprecated: false,
+      String elemFile,
+      String elemName,
+      int elemOffset}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
-        importUri: importUri,
-        isDeprecated: isDeprecated);
+        isDeprecated: isDeprecated,
+        elemFile: elemFile,
+        elemKind: ElementKind.MIXIN,
+        elemOffset: elemOffset);
+    Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.kind, equals(ElementKind.MIXIN));
+    expect(element.name, equals(elemName ?? name));
+    expect(element.parameters, isNull);
+    expect(element.returnType, isNull);
+    assertHasNoParameterInfo(cs);
+    return cs;
+  }
+
+  CompletionSuggestion assertSuggestName(String name,
+      {int relevance: DART_RELEVANCE_DEFAULT,
+      CompletionSuggestionKind kind: CompletionSuggestionKind.IDENTIFIER,
+      bool isDeprecated: false}) {
+    CompletionSuggestion cs = assertSuggest(name,
+        csKind: kind, relevance: relevance, isDeprecated: isDeprecated);
     expect(cs.completion, equals(name));
     expect(cs.element, isNull);
     assertHasNoParameterInfo(cs);
@@ -413,13 +417,9 @@
 
   CompletionSuggestion assertSuggestSetter(String name,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION}) {
     CompletionSuggestion cs = assertSuggest(name,
-        csKind: kind,
-        relevance: relevance,
-        importUri: importUri,
-        elemKind: ElementKind.SETTER);
+        csKind: kind, relevance: relevance, elemKind: ElementKind.SETTER);
     Element element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.SETTER));
@@ -434,12 +434,14 @@
     return cs;
   }
 
-  CompletionSuggestion assertSuggestTopLevelVar(String name, String returnType,
-      {int relevance: DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      String importUri}) {
-    CompletionSuggestion cs = assertSuggest(name,
-        csKind: kind, relevance: relevance, importUri: importUri);
+  CompletionSuggestion assertSuggestTopLevelVar(
+    String name,
+    String returnType, {
+    int relevance: DART_RELEVANCE_DEFAULT,
+    CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
+  }) {
+    CompletionSuggestion cs =
+        assertSuggest(name, csKind: kind, relevance: relevance);
     if (returnType != null) {
       expect(cs.returnType, returnType);
     } else if (isNullExpectedReturnTypeConsideredDynamic) {
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index 0c2b22f..49d5f95 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
@@ -43,9 +43,8 @@
 void main() {f^}''');
     await computeSuggestions();
 
-    CompletionSuggestion cs = assertSuggestFunction('foo', 'bool',
+    assertSuggestFunction('foo', 'bool',
         defaultArgListString: 'bar, baz: null');
-    expect(cs.elementUri, equals('package:test/b.dart'));
   }
 
   test_ArgumentList() async {
@@ -1924,6 +1923,17 @@
     assertNoSuggestions();
   }
 
+  test_extendsClause() async {
+    newFile('/home/test/lib/a.dart', content: 'class A {}');
+    addTestSource('''
+import 'a.dart';
+
+class B extends ^
+''');
+    await computeSuggestions();
+    assertSuggestClass('A');
+  }
+
   test_FieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
@@ -2446,6 +2456,17 @@
     assertNotSuggested('int');
   }
 
+  test_implementsClause() async {
+    newFile('/home/test/lib/a.dart', content: 'class A {}');
+    addTestSource('''
+import 'a.dart';
+
+class B implements ^
+''');
+    await computeSuggestions();
+    assertSuggestClass('A');
+  }
+
   test_implicitCreation() async {
     addSource('/home/test/lib/a.dart', '''
 class A {
@@ -4432,4 +4453,15 @@
     assertNotSuggested('x');
     assertNotSuggested('e');
   }
+
+  test_withClause_mixin() async {
+    newFile('/home/test/lib/a.dart', content: 'mixin M {}');
+    addTestSource('''
+import 'a.dart';
+
+class B extends A with ^
+''');
+    await computeSuggestions();
+    assertSuggestMixin('M');
+  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
index af3d4f8..e13ad70 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/library_member_contributor.dart';
-import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -27,8 +26,7 @@
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
     addTestSource('import "dart:async" as bar; foo() {bar.^}');
     await computeSuggestions();
-    CompletionSuggestion cs = assertSuggestClass('Future');
-    expect(cs.elementUri, equals('dart:async'));
+    assertSuggestClass('Future');
     assertNotSuggested('loadLibrary');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
index f38def7..8e5f942 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
-import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -43,8 +42,7 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    CompletionSuggestion cs = assertSuggestConstructor('A');
-    expect(cs.elementUri, 'package:test/a.dart');
+    assertSuggestConstructor('A');
     // Suggested by LocalConstructorContributor
     assertNotSuggested('B.bar');
     // Suggested by ImportedReferenceContributor
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index 3844a66..4fbe052 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -82,11 +82,10 @@
 void main() {h^}''');
     await computeSuggestions();
 
-    CompletionSuggestion cs = assertSuggestFunction('hasLength', 'bool',
+    assertSuggestFunction('hasLength', 'bool',
         relevance: DART_RELEVANCE_LOCAL_FUNCTION,
         defaultArgListString: 'a, b',
         defaultArgumentListTextRanges: [0, 1, 3, 1]);
-    expect(cs.elementUri, equals(convertPath('/home/test/lib/test.dart')));
   }
 
   test_ArgDefaults_function_none() async {
@@ -2408,6 +2407,20 @@
     assertNotSuggested('U');
   }
 
+  test_expression_typeParameter_mixinDeclaration() async {
+    addTestSource('''
+mixin M<T> {
+  void m() {
+    ^
+  }
+}
+class B<U> {}
+''');
+    await computeSuggestions();
+    assertSuggestTypeParameter('T');
+    assertNotSuggested('U');
+  }
+
   test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
     addSource('/home/test/lib/a.dart', '''
@@ -2450,6 +2463,17 @@
     assertNoSuggestions();
   }
 
+  test_extendsClause() async {
+    addTestSource('''
+class A {}
+mixin M {}
+class B extends ^
+''');
+    await computeSuggestions();
+    assertSuggestClass('A');
+    assertNotSuggested('M');
+  }
+
   test_FieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
@@ -2990,6 +3014,17 @@
     assertNotSuggested('MC');
   }
 
+  test_implementsClause() async {
+    addTestSource('''
+class A {}
+mixin M {}
+class B implements ^
+''');
+    await computeSuggestions();
+    assertSuggestClass('A');
+    assertSuggestMixin('M');
+  }
+
   test_ImportDirective_dart() async {
     // SimpleStringLiteral  ImportDirective
     addTestSource('''
@@ -4848,4 +4883,14 @@
     assertNotSuggested('x');
     assertNotSuggested('e');
   }
+
+  test_withClause_mixin() async {
+    addTestSource('''
+class A {}
+mixin M {}
+class B extends A with ^
+''');
+    await computeSuggestions();
+    assertSuggestMixin('M');
+  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
index da7ec8f..830b314 100644
--- a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
@@ -383,7 +383,6 @@
     }
     expect(cs.kind, equals(CompletionSuggestionKind.OVERRIDE));
     expect(cs.relevance, equals(DART_RELEVANCE_HIGH));
-    expect(cs.importUri, null);
     if (selectionOffset != null && selectionLength != null) {
       expect(cs.selectionOffset, selectionOffset);
       expect(cs.selectionLength, selectionLength);
diff --git a/pkg/analysis_server/test/services/correction/organize_directives_test.dart b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
index 8c53f7a..2a56e73 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -24,6 +24,26 @@
 class OrganizeDirectivesTest extends AbstractSingleUnitTest {
   List<AnalysisError> testErrors;
 
+  test_docComment_beforeDirective_hasUnresolvedIdentifier() async {
+    await _computeUnitAndErrors(r'''
+/// Library documentation comment A
+/// Library documentation comment B
+import 'a.dart';
+import 'b.dart';
+
+B b;
+''');
+    // validate change
+    _assertOrganize(r'''
+/// Library documentation comment A
+/// Library documentation comment B
+import 'a.dart';
+import 'b.dart';
+
+B b;
+''');
+  }
+
   test_keep_duplicateImports_withDifferentPrefix() async {
     await _computeUnitAndErrors(r'''
 import 'dart:async' as async1;
@@ -286,12 +306,9 @@
 // header
 library lib;
 
-import 'a.dart';
-import 'b.dart';
-import 'c.dart';
-// c
-// aa
-// bbb
+import 'a.dart';// aa
+import 'b.dart';// bbb
+import 'c.dart';// c
 
 /** doc */
 main() {
diff --git a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
index 420f69a..7c54046 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -281,7 +281,7 @@
 ''');
     _createRefactoringForStartEndComments();
     return _assertConditionsFatal(
-        "Operation not applicable to a 'for' statement's updaters and body.");
+        "Not all selected statements are enclosed by the same parent statement.");
   }
 
   test_bad_methodName_reference() async {
diff --git a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
index 8e123ae..c3d7bbf 100644
--- a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
@@ -14,14 +14,36 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(ImportElementsComputerTest);
+    defineReflectiveTests(ImportedElementsComputerTest);
   });
 }
 
 @reflectiveTest
-class ImportElementsComputerTest extends AbstractContextTest {
+class ImportedElementsComputerTest extends AbstractContextTest {
   String sourcePath;
 
+  List<ImportedElements> importedElements;
+
+  void assertElements(List<ImportedElements> expectedElementsList) {
+    expect(importedElements, hasLength(expectedElementsList.length));
+    for (ImportedElements expectedElements in expectedElementsList) {
+      String expectedPath = convertPath(expectedElements.path);
+      bool found = false;
+      for (ImportedElements actualElements in importedElements) {
+        if (expectedPath == actualElements.path &&
+            actualElements.prefix == expectedElements.prefix) {
+          expect(actualElements.elements,
+              unorderedEquals(expectedElements.elements));
+          found = true;
+          break;
+        }
+      }
+      if (!found) {
+        fail('Expected elements from $expectedPath, but none found.');
+      }
+    }
+  }
+
   setUp() {
     super.setUp();
     sourcePath = convertPath('/home/test/lib/test.dart');
@@ -29,126 +51,104 @@
 
   test_dartAsync_noPrefix() async {
     String selection = "Future<String> f = null;";
-    String content = """
+    String content = '''
 import 'dart:async';
 printer() {
   $selection
   print(await f);
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(2));
-    ImportedElements elements1 = elementsList[0];
-    ImportedElements elements2 = elementsList[1];
-    ImportedElements asyncElements;
-    ImportedElements coreElements;
-    if (elements1.path == convertPath('/sdk/lib/core/core.dart')) {
-      coreElements = elements1;
-      asyncElements = elements2;
-    } else {
-      coreElements = elements2;
-      asyncElements = elements1;
-    }
-    expect(coreElements, isNotNull);
-    expect(coreElements.path, convertPath('/sdk/lib/core/core.dart'));
-    expect(coreElements.prefix, '');
-    expect(coreElements.elements, unorderedEquals(['String']));
-
-    expect(asyncElements, isNotNull);
-    expect(asyncElements.path, convertPath('/sdk/lib/async/async.dart'));
-    expect(asyncElements.prefix, '');
-    expect(asyncElements.elements, unorderedEquals(['Future']));
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/sdk/lib/core/core.dart', '', ['String']),
+      new ImportedElements('/sdk/lib/async/async.dart', '', ['Future']),
+    ]);
   }
 
   test_dartAsync_prefix() async {
     String selection = "a.Future<String> f = null;";
-    String content = """
+    String content = '''
 import 'dart:async' as a;
 printer() {
   $selection
   print(await f);
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(2));
-    ImportedElements elements1 = elementsList[0];
-    ImportedElements elements2 = elementsList[1];
-    ImportedElements asyncElements;
-    ImportedElements coreElements;
-    if (elements1.path == convertPath('/sdk/lib/core/core.dart')) {
-      coreElements = elements1;
-      asyncElements = elements2;
-    } else {
-      coreElements = elements2;
-      asyncElements = elements1;
-    }
-    expect(coreElements, isNotNull);
-    expect(coreElements.path, convertPath('/sdk/lib/core/core.dart'));
-    expect(coreElements.prefix, '');
-    expect(coreElements.elements, unorderedEquals(['String']));
-
-    expect(asyncElements, isNotNull);
-    expect(asyncElements.path, convertPath('/sdk/lib/async/async.dart'));
-    expect(asyncElements.prefix, 'a');
-    expect(asyncElements.elements, unorderedEquals(['Future']));
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/sdk/lib/core/core.dart', '', ['String']),
+      new ImportedElements('/sdk/lib/async/async.dart', 'a', ['Future']),
+    ]);
   }
 
   test_dartCore_noPrefix() async {
     String selection = "String s = '';";
-    String content = """
+    String content = '''
 blankLine() {
   $selection
   print(s);
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(1));
-    ImportedElements elements = elementsList[0];
-    expect(elements, isNotNull);
-    expect(elements.path, convertPath('/sdk/lib/core/core.dart'));
-    expect(elements.prefix, '');
-    expect(elements.elements, unorderedEquals(['String']));
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/sdk/lib/core/core.dart', '', ['String']),
+    ]);
   }
 
   test_dartCore_prefix() async {
     String selection = "core.String s = '';";
-    String content = """
+    String content = '''
 import 'dart:core' as core;
 blankLine() {
   $selection
   print(s);
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(1));
-    ImportedElements elements = elementsList[0];
-    expect(elements, isNotNull);
-    expect(elements.path, convertPath('/sdk/lib/core/core.dart'));
-    expect(elements.prefix, 'core');
-    expect(elements.elements, unorderedEquals(['String']));
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/sdk/lib/core/core.dart', 'core', ['String']),
+    ]);
   }
 
   test_dartMath_noPrefix() async {
     String selection = "new Random();";
-    String content = """
+    String content = '''
 import 'dart:math';
 bool randomBool() {
   Random r = $selection
   return r.nextBool();
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(1));
-    ImportedElements elements = elementsList[0];
-    expect(elements, isNotNull);
-    expect(elements.path, convertPath('/sdk/lib/math/math.dart'));
-    expect(elements.prefix, '');
-    expect(elements.elements, unorderedEquals(['Random']));
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/sdk/lib/math/math.dart', '', ['Random']),
+    ]);
+  }
+
+  test_import_simple() async {
+    String selection = "import 'dart:math';";
+    String content = '''
+$selection
+bool randomBool() {
+  Random r = new Random();
+  return r.nextBool();
+}
+''';
+    await _computeElements(content, selection);
+    expect(importedElements, hasLength(0));
+  }
+
+  test_import_simple_show() async {
+    String selection = "import 'dart:math' show Random;";
+    String content = '''
+$selection
+bool randomBool() {
+  Random r = new Random();
+  return r.nextBool();
+}
+''';
+    await _computeElements(content, selection);
+    expect(importedElements, hasLength(0));
   }
 
   test_multiple() async {
@@ -164,34 +164,23 @@
 
 $selection
 ''';
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(2));
-
-    ImportedElements mathElements = elementsList[0];
-    expect(mathElements, isNotNull);
-    expect(mathElements.path, convertPath('/sdk/lib/math/math.dart'));
-    expect(mathElements.prefix, '');
-    expect(mathElements.elements, unorderedEquals(['Random']));
-
-    ImportedElements coreElements = elementsList[1];
-    expect(coreElements, isNotNull);
-    expect(coreElements.path, convertPath('/sdk/lib/core/core.dart'));
-    expect(coreElements.prefix, '');
-    expect(coreElements.elements, unorderedEquals(['String', 'print']));
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/sdk/lib/core/core.dart', '', ['String', 'print']),
+      new ImportedElements('/sdk/lib/math/math.dart', '', ['Random']),
+    ]);
   }
 
   test_none_comment() async {
     String selection = 'comment';
-    String content = """
+    String content = '''
 // Method $selection.
 blankLine() {
   print('');
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(0));
+''';
+    await _computeElements(content, selection);
+    expect(importedElements, hasLength(0));
   }
 
   test_none_constructorDeclarationReturnType() async {
@@ -201,38 +190,35 @@
   A.named();
 }
 ''';
-    String content = """
+    String content = '''
 $selection
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(0));
+''';
+    await _computeElements(content, selection);
+    expect(importedElements, hasLength(0));
   }
 
   test_none_partialNames() async {
     String selection = 'x + y';
-    String content = """
+    String content = '''
 plusThree(int xx) {
   int yy = 2;
   print(x${selection}y);
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(0));
+''';
+    await _computeElements(content, selection);
+    expect(importedElements, hasLength(0));
   }
 
   test_none_wholeNames() async {
     String selection = 'x + y + 1';
-    String content = """
+    String content = '''
 plusThree(int x) {
   int y = 2;
   print($selection);
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(0));
+''';
+    await _computeElements(content, selection);
+    expect(importedElements, hasLength(0));
   }
 
   test_package_multipleInSame() async {
@@ -245,20 +231,16 @@
 }
 ''');
     String selection = "A.a + B.b";
-    String content = """
+    String content = '''
 import 'package:foo/foo.dart';
 blankLine() {
   print($selection);
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(1));
-    ImportedElements elements = elementsList[0];
-    expect(elements, isNotNull);
-    expect(elements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
-    expect(elements.prefix, '');
-    expect(elements.elements, unorderedEquals(['A', 'B']));
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/.pub-cache/foo/lib/foo.dart', '', ['A', 'B']),
+    ]);
   }
 
   test_package_noPrefix() async {
@@ -268,43 +250,86 @@
 }
 ''');
     String selection = "Foo.first";
-    String content = """
+    String content = '''
 import 'package:foo/foo.dart';
 blankLine() {
   print($selection);
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(1));
-    ImportedElements elements = elementsList[0];
-    expect(elements, isNotNull);
-    expect(elements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
-    expect(elements.prefix, '');
-    expect(elements.elements, unorderedEquals(['Foo']));
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/.pub-cache/foo/lib/foo.dart', '', ['Foo']),
+    ]);
   }
 
-  test_package_prefix_selected() async {
+  test_package_prefix_selected_class() async {
     addPackageFile('foo', 'foo.dart', '''
 class Foo {
   static String first = '';
 }
 ''');
     String selection = "f.Foo.first";
-    String content = """
+    String content = '''
 import 'package:foo/foo.dart' as f;
 blankLine() {
   print($selection);
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(1));
-    ImportedElements elements = elementsList[0];
-    expect(elements, isNotNull);
-    expect(elements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
-    expect(elements.prefix, 'f');
-    expect(elements.elements, unorderedEquals(['Foo']));
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['Foo']),
+    ]);
+  }
+
+  test_package_prefix_selected_function() async {
+    addPackageFile('foo', 'foo.dart', '''
+String foo() => '';
+''');
+    String selection = "f.foo()";
+    String content = '''
+import 'package:foo/foo.dart' as f;
+blankLine() {
+  print($selection);
+}
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['foo']),
+    ]);
+  }
+
+  test_package_prefix_selected_getter() async {
+    addPackageFile('foo', 'foo.dart', '''
+String foo = '';
+''');
+    String selection = "f.foo";
+    String content = '''
+import 'package:foo/foo.dart' as f;
+blankLine() {
+  print($selection);
+}
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['foo']),
+    ]);
+  }
+
+  test_package_prefix_selected_setter() async {
+    addPackageFile('foo', 'foo.dart', '''
+String foo = '';
+''');
+    String selection = "f.foo";
+    String content = '''
+import 'package:foo/foo.dart' as f;
+main() {
+  $selection = '';
+}
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['foo=']),
+    ]);
   }
 
   test_package_prefix_unselected() async {
@@ -314,20 +339,16 @@
 }
 ''');
     String selection = "Foo.first";
-    String content = """
+    String content = '''
 import 'package:foo/foo.dart' as f;
 blankLine() {
   print(f.$selection);
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(1));
-    ImportedElements elements = elementsList[0];
-    expect(elements, isNotNull);
-    expect(elements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
-    expect(elements.prefix, '');
-    expect(elements.elements, unorderedEquals(['Foo']));
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/.pub-cache/foo/lib/foo.dart', '', ['Foo']),
+    ]);
   }
 
   test_package_prefixedAndNot() async {
@@ -338,64 +359,64 @@
 }
 ''');
     String selection = "f.Foo.first + Foo.second";
-    String content = """
+    String content = '''
 import 'package:foo/foo.dart';
 import 'package:foo/foo.dart' as f;
 blankLine() {
   print($selection);
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-
-    expect(elementsList, hasLength(2));
-    ImportedElements elements1 = elementsList[0];
-    ImportedElements elements2 = elementsList[1];
-    ImportedElements notPrefixedElements;
-    ImportedElements prefixedElements;
-    if (elements1.prefix == '') {
-      prefixedElements = elements2;
-      notPrefixedElements = elements1;
-    } else {
-      prefixedElements = elements1;
-      notPrefixedElements = elements2;
-    }
-
-    expect(notPrefixedElements, isNotNull);
-    expect(
-        notPrefixedElements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
-    expect(notPrefixedElements.prefix, '');
-    expect(notPrefixedElements.elements, unorderedEquals(['Foo']));
-
-    expect(prefixedElements, isNotNull);
-    expect(prefixedElements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
-    expect(prefixedElements.prefix, 'f');
-    expect(prefixedElements.elements, unorderedEquals(['Foo']));
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements('/.pub-cache/foo/lib/foo.dart', '', ['Foo']),
+      new ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['Foo']),
+    ]);
   }
 
   test_self() async {
     String selection = 'A parent;';
-    String content = """
+    String content = '''
 class A {
   $selection
 }
-""";
-    List<ImportedElements> elementsList = await _computeElements(
-        content, content.indexOf(selection), selection.length);
-    expect(elementsList, hasLength(1));
-    ImportedElements elements = elementsList[0];
-    expect(elements, isNotNull);
-    expect(elements.path, sourcePath);
-    expect(elements.prefix, '');
-    expect(elements.elements, unorderedEquals(['A']));
+''';
+    await _computeElements(content, selection);
+    assertElements([
+      new ImportedElements(sourcePath, '', ['A']),
+    ]);
   }
 
-  Future<List<ImportedElements>> _computeElements(
-      String sourceContent, int offset, int length) async {
-    newFile(sourcePath, content: sourceContent);
+  test_wholeFile_noImports() async {
+    String content = '''
+blankLine() {
+  String s = '';
+  print(s);
+}
+''';
+    await _computeElements(content, content);
+    assertElements([
+      new ImportedElements('/sdk/lib/core/core.dart', '', ['String', 'print']),
+    ]);
+  }
+
+  test_wholeFile_withImports() async {
+    String content = '''
+import 'dart:math';
+bool randomBool() {
+  Random r = new Random();
+  return r.nextBool();
+}
+''';
+    await _computeElements(content, content);
+    expect(importedElements, hasLength(0));
+  }
+
+  Future<void> _computeElements(String content, String selection) async {
+    // TODO(brianwilkerson) Automatically extract the selection from the content.
+    newFile(sourcePath, content: content);
     ResolvedUnitResult result = await session.getResolvedUnit(sourcePath);
-    ImportedElementsComputer computer =
-        new ImportedElementsComputer(result.unit, offset, length);
-    return computer.compute();
+    ImportedElementsComputer computer = new ImportedElementsComputer(
+        result.unit, content.indexOf(selection), selection.length);
+    importedElements = computer.compute();
   }
 }
diff --git a/pkg/analysis_server/test/src/computer/outline_computer_test.dart b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
index 643d144c..6fee770 100644
--- a/pkg/analysis_server/test/src/computer/outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
@@ -34,9 +34,9 @@
     newFile(testPath, content: code);
     var resolveResult = await session.getResolvedUnit(testPath);
     return new DartUnitOutlineComputer(
-            testPath, resolveResult.lineInfo, resolveResult.unit,
-            withBasicFlutter: true)
-        .compute();
+      resolveResult,
+      withBasicFlutter: true,
+    ).compute();
   }
 }
 
@@ -413,6 +413,66 @@
     }
   }
 
+  test_genericTypeAlias_incomplete() async {
+    Outline unitOutline = await _computeOutline('''
+typedef F = Object;
+''');
+    List<Outline> topOutlines = unitOutline.children;
+    expect(topOutlines, hasLength(1));
+    // F
+    Outline outline_F = topOutlines[0];
+    Element element_F = outline_F.element;
+    expect(element_F.kind, ElementKind.FUNCTION_TYPE_ALIAS);
+    expect(element_F.name, "F");
+    {
+      Location location = element_F.location;
+      expect(location.offset, testCode.indexOf("F ="));
+      expect(location.length, 'F'.length);
+    }
+    expect(element_F.parameters, '');
+    expect(element_F.returnType, '');
+  }
+
+  test_genericTypeAlias_minimal() async {
+    Outline unitOutline = await _computeOutline('''
+typedef F = void Function();
+''');
+    List<Outline> topOutlines = unitOutline.children;
+    expect(topOutlines, hasLength(1));
+    // F
+    Outline outline_F = topOutlines[0];
+    Element element_F = outline_F.element;
+    expect(element_F.kind, ElementKind.FUNCTION_TYPE_ALIAS);
+    expect(element_F.name, "F");
+    {
+      Location location = element_F.location;
+      expect(location.offset, testCode.indexOf("F ="));
+      expect(location.length, 'F'.length);
+    }
+    expect(element_F.parameters, '()');
+    expect(element_F.returnType, 'void');
+  }
+
+  test_genericTypeAlias_noReturnType() async {
+    Outline unitOutline = await _computeOutline('''
+typedef F = Function();
+''');
+    List<Outline> topOutlines = unitOutline.children;
+    expect(topOutlines, hasLength(1));
+    // F
+    Outline outline_F = topOutlines[0];
+    Element element_F = outline_F.element;
+    expect(element_F.kind, ElementKind.FUNCTION_TYPE_ALIAS);
+    expect(element_F.name, "F");
+    {
+      Location location = element_F.location;
+      expect(location.offset, testCode.indexOf("F ="));
+      expect(location.length, 'F'.length);
+    }
+    expect(element_F.parameters, '()');
+    expect(element_F.returnType, '');
+  }
+
   test_groupAndTest() async {
     Outline outline = await _computeOutline('''
 void group(name, closure) {}
diff --git a/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart b/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart
index ecf6d0cd..2da217e 100644
--- a/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart
+++ b/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart
@@ -72,7 +72,8 @@
     "flags": 0
   },
   "relevanceTags": [
-    "package:test/a.dart::A"
+    "package:test/a.dart::A",
+    "A"
   ]
 }
 ''');
@@ -106,7 +107,8 @@
     "flags": 0
   },
   "relevanceTags": [
-    "package:test/a.dart::MyEnum"
+    "package:test/a.dart::MyEnum",
+    "MyEnum"
   ]
 }
 ''');
@@ -126,7 +128,8 @@
     "flags": 0
   },
   "relevanceTags": [
-    "package:test/a.dart::MyEnum"
+    "package:test/a.dart::MyEnum",
+    "aaa"
   ]
 }
 ''');
@@ -146,7 +149,8 @@
     "flags": 0
   },
   "relevanceTags": [
-    "package:test/a.dart::MyEnum"
+    "package:test/a.dart::MyEnum",
+    "bbb"
   ]
 }
 ''');
@@ -181,7 +185,8 @@
     "returnType": ""
   },
   "relevanceTags": [
-    "dart:core::bool"
+    "dart:core::bool",
+    "boolV"
   ]
 }
 ''');
@@ -202,7 +207,8 @@
     "returnType": ""
   },
   "relevanceTags": [
-    "dart:core::int"
+    "dart:core::int",
+    "intV"
   ]
 }
 ''');
@@ -223,7 +229,8 @@
     "returnType": ""
   },
   "relevanceTags": [
-    "dart:core::double"
+    "dart:core::double",
+    "doubleV"
   ]
 }
 ''');
@@ -244,7 +251,8 @@
     "returnType": ""
   },
   "relevanceTags": [
-    "dart:core::String"
+    "dart:core::String",
+    "stringV"
   ]
 }
 ''');
diff --git a/pkg/analysis_server/test/src/domains/completion/get_suggestion_details_test.dart b/pkg/analysis_server/test/src/domains/completion/get_suggestion_details_test.dart
index 84fdccb..4dbfd3c 100644
--- a/pkg/analysis_server/test/src/domains/completion/get_suggestion_details_test.dart
+++ b/pkg/analysis_server/test/src/domains/completion/get_suggestion_details_test.dart
@@ -32,9 +32,11 @@
 
     var set = await waitForSetWithUri('package:test/a.dart');
     var result = await _getSuggestionDetails(
-      id: set.id,
-      label: 'MyEnum.aaa',
-      offset: testCode.indexOf('} // ref'),
+      _buildRequest(
+        id: set.id,
+        label: 'MyEnum.aaa',
+        offset: testCode.indexOf('} // ref'),
+      ),
     );
 
     expect(result.completion, 'MyEnum.aaa');
@@ -54,9 +56,11 @@
 
     var mathSet = await waitForSetWithUri('dart:math');
     var result = await _getSuggestionDetails(
-      id: mathSet.id,
-      label: 'sin',
-      offset: testCode.indexOf('} // ref'),
+      _buildRequest(
+        id: mathSet.id,
+        label: 'sin',
+        offset: testCode.indexOf('} // ref'),
+      ),
     );
 
     expect(result.completion, 'sin');
@@ -72,15 +76,42 @@
 
     var mathSet = await waitForSetWithUri('dart:math');
     var result = await _getSuggestionDetails(
-      id: mathSet.id,
-      label: 'sin',
-      offset: testCode.indexOf('} // ref'),
+      _buildRequest(
+        id: mathSet.id,
+        label: 'sin',
+        offset: testCode.indexOf('} // ref'),
+      ),
     );
 
     expect(result.completion, 'math.sin');
     _assertEmptyChange(result.change);
   }
 
+  test_invalid_label() async {
+    addTestFile(r'''
+import 'dart:math';
+
+main() {} // ref
+''');
+
+    var mathSet = await waitForSetWithUri('dart:math');
+
+    var response = await waitResponse(
+      _buildRequest(id: mathSet.id, label: 'foo', offset: 0),
+    );
+
+    expect(response.error.code, RequestErrorCode.INVALID_PARAMETER);
+  }
+
+  test_invalid_library() async {
+    addTestFile('');
+
+    var response = await waitResponse(
+      _buildRequest(id: -1, label: 'foo', offset: 0),
+    );
+    expect(response.error.code, RequestErrorCode.INVALID_PARAMETER);
+  }
+
   test_newImport() async {
     addTestFile(r'''
 main() {} // ref
@@ -88,9 +119,11 @@
 
     var mathSet = await waitForSetWithUri('dart:math');
     var result = await _getSuggestionDetails(
-      id: mathSet.id,
-      label: 'sin',
-      offset: testCode.indexOf('} // ref'),
+      _buildRequest(
+        id: mathSet.id,
+        label: 'sin',
+        offset: testCode.indexOf('} // ref'),
+      ),
     );
 
     expect(result.completion, 'sin');
@@ -116,21 +149,23 @@
     expect(SourceEdit.applySequence(testCode, edits), expected);
   }
 
-  Future<CompletionGetSuggestionDetailsResult> _getSuggestionDetails({
+  Request _buildRequest({
     String file,
     @required int id,
     @required String label,
     @required int offset,
-  }) async {
-    file ??= testFile;
-    var response = await waitResponse(
-      CompletionGetSuggestionDetailsParams(
-        file,
-        id,
-        label,
-        offset,
-      ).toRequest('0'),
-    );
+  }) {
+    return CompletionGetSuggestionDetailsParams(
+      file ?? testFile,
+      id,
+      label,
+      offset,
+    ).toRequest('0');
+  }
+
+  Future<CompletionGetSuggestionDetailsResult> _getSuggestionDetails(
+      Request request) async {
+    var response = await waitResponse(request);
     return CompletionGetSuggestionDetailsResult.fromResponse(response);
   }
 }
diff --git a/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart b/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
index 0de95fdf..57d2907 100644
--- a/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
+++ b/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
@@ -22,14 +22,65 @@
     var asyncSet = await waitForSetWithUri('dart:async');
 
     var results = await _getSuggestions(testFile, 0);
-    expect(results.includedSuggestionKinds, isNotEmpty);
+    expect(results.includedElementKinds, isNotEmpty);
 
     var includedIdSet = results.includedSuggestionSets.map((set) => set.id);
     expect(includedIdSet, contains(mathSet.id));
     expect(includedIdSet, contains(asyncSet.id));
   }
 
-  test_includedSuggestionKinds_type() async {
+  test_defaultArgumentListString() async {
+    newFile('/home/test/lib/a.dart', content: r'''
+void fff(int aaa, int bbb) {}
+
+void ggg({int aaa, @required int bbb, @required int ccc}) {}
+''');
+
+    var aSet = await waitForSetWithUri('package:test/a.dart');
+
+    var fff = aSet.items.singleWhere((e) => e.label == 'fff');
+    expect(fff.defaultArgumentListString, 'aaa, bbb');
+    expect(fff.defaultArgumentListTextRanges, [0, 3, 5, 3]);
+
+    var ggg = aSet.items.singleWhere((e) => e.label == 'ggg');
+    expect(ggg.defaultArgumentListString, 'bbb: null, ccc: null');
+    expect(ggg.defaultArgumentListTextRanges, [5, 4, 16, 4]);
+  }
+
+  test_displayUri_file() async {
+    var aPath = '/home/test/test/a.dart';
+    newFile(aPath, content: 'class A {}');
+
+    var aSet = await waitForSetWithUri(toUriStr(aPath));
+
+    var testPath = newFile('/home/test/test/sub/test.dart').path;
+    var results = await _getSuggestions(testPath, 0);
+
+    expect(
+      results.includedSuggestionSets.singleWhere((set) {
+        return set.id == aSet.id;
+      }).displayUri,
+      '../a.dart',
+    );
+  }
+
+  test_displayUri_package() async {
+    var aPath = '/home/test/lib/a.dart';
+    newFile(aPath, content: 'class A {}');
+
+    var aSet = await waitForSetWithUri('package:test/a.dart');
+    var testPath = newFile('/home/test/lib/test.dart').path;
+
+    var results = await _getSuggestions(testPath, 0);
+    expect(
+      results.includedSuggestionSets.singleWhere((set) {
+        return set.id == aSet.id;
+      }).displayUri,
+      isNull,
+    );
+  }
+
+  test_includedElementKinds_type() async {
     addTestFile(r'''
 class X extends {} // ref
 ''');
@@ -40,7 +91,7 @@
     );
 
     expect(
-      results.includedSuggestionKinds,
+      results.includedElementKinds,
       unorderedEquals([
         ElementKind.CLASS,
         ElementKind.CLASS_TYPE_ALIAS,
@@ -51,7 +102,7 @@
     );
   }
 
-  test_includedSuggestionKinds_value() async {
+  test_includedElementKinds_value() async {
     addTestFile(r'''
 main() {
   print(); // ref
@@ -64,7 +115,7 @@
     );
 
     expect(
-      results.includedSuggestionKinds,
+      results.includedElementKinds,
       unorderedEquals([
         ElementKind.CLASS,
         ElementKind.CLASS_TYPE_ALIAS,
diff --git a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
index 18df136..0109174 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
@@ -102,6 +102,11 @@
     expect(attribute.label, '…');
   }
 
+  test_attributes_setLiteral() async {
+    var attribute = await _getAttribute('test', '{1, 2}');
+    expect(attribute.label, '{…}');
+  }
+
   test_attributes_string_interpolation() async {
     FlutterOutline unitOutline = await _computeOutline(r'''
 import 'package:flutter/widgets.dart';
@@ -626,8 +631,7 @@
     testCode = code;
     newFile(testPath, content: code);
     resolveResult = await session.getResolvedUnit(testPath);
-    computer = new FlutterOutlineComputer(testPath, testCode,
-        resolveResult.lineInfo, resolveResult.unit, resolveResult.typeProvider);
+    computer = new FlutterOutlineComputer(resolveResult);
     return computer.compute();
   }
 
diff --git a/pkg/analysis_server/test/src/nullability/migration_visitor_test.dart b/pkg/analysis_server/test/src/nullability/migration_visitor_test.dart
index 88c6a34..e9db0d5 100644
--- a/pkg/analysis_server/test/src/nullability/migration_visitor_test.dart
+++ b/pkg/analysis_server/test/src/nullability/migration_visitor_test.dart
@@ -107,11 +107,13 @@
 class Int {
   Int operator+(Int other) => this;
 }
-Int f(Int i, Int j) => i + j;
+Int f(Int i, Int j) => (i + j);
 ''');
 
-    assertConstraint([decoratedTypeAnnotation('Int operator+').nullable],
-        decoratedTypeAnnotation('Int f').nullable);
+    assertConstraint(
+        [decoratedTypeAnnotation('Int operator+').nullable],
+        _either(decoratedTypeAnnotation('Int f').nullable,
+            checkExpression('(i + j)').nullCheck));
   }
 
   test_binaryExpression_add_result_not_null() async {
@@ -136,11 +138,13 @@
 class Int {
   Int operator+(Int other) => this;
 }
-Int f(Int i, Int j) => i + j;
+Int f(Int i, Int j) => i + j/*check*/;
 ''');
 
-    assertConstraint([decoratedTypeAnnotation('Int j').nullable],
-        decoratedTypeAnnotation('Int other').nullable);
+    assertConstraint(
+        [decoratedTypeAnnotation('Int j').nullable],
+        _either(decoratedTypeAnnotation('Int other').nullable,
+            checkExpression('j/*check*/').nullCheck));
   }
 
   test_binaryExpression_equal() async {
@@ -151,6 +155,15 @@
     assertNoConstraints(decoratedTypeAnnotation('bool f').nullable);
   }
 
+  test_boolLiteral() async {
+    await analyze('''
+bool f() {
+  return true;
+}
+''');
+    assertNoConstraints(decoratedTypeAnnotation('bool').nullable);
+  }
+
   test_conditionalExpression_condition_check() async {
     await analyze('''
 int f(bool b, int i, int j) {
@@ -172,13 +185,14 @@
 
     var nullable_i = decoratedTypeAnnotation('int i').nullable;
     var nullable_j = decoratedTypeAnnotation('int j').nullable;
-    var nullable_i_or_nullable_j = _mockOr(nullable_i, nullable_j);
+    var nullable_i_or_nullable_j = _either(nullable_i, nullable_j);
     var nullable_conditional = decoratedExpressionType('(b ?').nullable;
     var nullable_return = decoratedTypeAnnotation('int f').nullable;
     assertConstraint([nullable_i], nullable_conditional);
     assertConstraint([nullable_j], nullable_conditional);
     assertConstraint([nullable_conditional], nullable_i_or_nullable_j);
-    assertConstraint([nullable_conditional], nullable_return);
+    assertConstraint([nullable_conditional],
+        _either(nullable_return, checkExpression('(b ? i : j)').nullCheck));
   }
 
   test_conditionalExpression_left_non_null() async {
@@ -229,11 +243,13 @@
 
   test_functionDeclaration_expression_body() async {
     await analyze('''
-int/*1*/ f(int/*2*/ i) => i;
+int/*1*/ f(int/*2*/ i) => i/*3*/;
 ''');
 
-    assertConstraint([decoratedTypeAnnotation('int/*2*/').nullable],
-        decoratedTypeAnnotation('int/*1*/').nullable);
+    assertConstraint(
+        [decoratedTypeAnnotation('int/*2*/').nullable],
+        _either(decoratedTypeAnnotation('int/*1*/').nullable,
+            checkExpression('i/*3*/').nullCheck));
   }
 
   test_functionDeclaration_parameter_named_default_notNull() async {
@@ -339,28 +355,49 @@
     assertConstraint([], decoratedTypeAnnotation('int').nullable);
   }
 
+  test_functionDeclaration_resets_unconditional_control_flow() async {
+    await analyze('''
+void f(bool b, int i, int j) {
+  assert(i != null);
+  if (b) return;
+  assert(j != null);
+}
+void g(int k) {
+  assert(k != null);
+}
+''');
+    assertConstraint([], decoratedTypeAnnotation('int i').nonNullIntent);
+    assertNoConstraints(decoratedTypeAnnotation('int j').nonNullIntent);
+    assertConstraint([], decoratedTypeAnnotation('int k').nonNullIntent);
+  }
+
   test_functionInvocation_parameter_fromLocalParameter() async {
     await analyze('''
 void f(int/*1*/ i) {}
 void test(int/*2*/ i) {
-  f(i);
+  f(i/*3*/);
 }
 ''');
 
-    assertConstraint([decoratedTypeAnnotation('int/*2*/').nullable],
-        decoratedTypeAnnotation('int/*1*/').nullable);
+    var int_1 = decoratedTypeAnnotation('int/*1*/');
+    var int_2 = decoratedTypeAnnotation('int/*2*/');
+    var i_3 = checkExpression('i/*3*/');
+    assertConstraint([int_2.nullable], _either(int_1.nullable, i_3.nullCheck));
+    assertConstraint([int_2.nullable, int_1.nonNullIntent], i_3.nullCheck);
+    assertConstraint([int_1.nonNullIntent], int_2.nonNullIntent);
   }
 
   test_functionInvocation_parameter_named() async {
     await analyze('''
 void f({int i: 0}) {}
 void g(int j) {
-  f(i: j);
+  f(i: j/*check*/);
 }
 ''');
     var nullable_i = decoratedTypeAnnotation('int i').nullable;
     var nullable_j = decoratedTypeAnnotation('int j').nullable;
-    assertConstraint([nullable_j], nullable_i);
+    assertConstraint([nullable_j],
+        _either(nullable_i, checkExpression('j/*check*/').nullCheck));
   }
 
   test_functionInvocation_parameter_named_missing() async {
@@ -400,19 +437,23 @@
 ''');
 
     assertConstraint(
-        [ConstraintVariable.always], decoratedTypeAnnotation('int').nullable);
+        [ConstraintVariable.always],
+        _either(decoratedTypeAnnotation('int').nullable,
+            checkExpression('null').nullCheck));
   }
 
   test_functionInvocation_return() async {
     await analyze('''
 int/*1*/ f() => 0;
 int/*2*/ g() {
-  return f();
+  return (f());
 }
 ''');
 
-    assertConstraint([decoratedTypeAnnotation('int/*1*/').nullable],
-        decoratedTypeAnnotation('int/*2*/').nullable);
+    assertConstraint(
+        [decoratedTypeAnnotation('int/*1*/').nullable],
+        _either(decoratedTypeAnnotation('int/*2*/').nullable,
+            checkExpression('(f())').nullCheck));
   }
 
   test_if_condition() async {
@@ -458,9 +499,9 @@
     await analyze('''
 int f(int i, int j, int k) {
   if (i == null) {
-    return j;
+    return j/*check*/;
   } else {
-    return k;
+    return k/*check*/;
   }
 }
 ''');
@@ -468,8 +509,10 @@
     var nullable_j = decoratedTypeAnnotation('int j').nullable;
     var nullable_k = decoratedTypeAnnotation('int k').nullable;
     var nullable_return = decoratedTypeAnnotation('int f').nullable;
-    assertConstraint([nullable_i, nullable_j], nullable_return);
-    assertConstraint([nullable_k], nullable_return);
+    assertConstraint([nullable_i, nullable_j],
+        _either(nullable_return, checkExpression('j/*check*/').nullCheck));
+    assertConstraint([nullable_k],
+        _either(nullable_return, checkExpression('k/*check*/').nullCheck));
     var discard = statementDiscard('if (i == null)');
     expect(discard.keepTrue, same(nullable_i));
     expect(discard.keepFalse, same(ConstraintVariable.always));
@@ -480,9 +523,9 @@
     await analyze('''
 int f(bool b, int i, int j) {
   if (b) {
-    return i;
+    return i/*check*/;
   } else {
-    return j;
+    return j/*check*/;
   }
 }
 ''');
@@ -490,15 +533,17 @@
     var nullable_i = decoratedTypeAnnotation('int i').nullable;
     var nullable_j = decoratedTypeAnnotation('int j').nullable;
     var nullable_return = decoratedTypeAnnotation('int f').nullable;
-    assertConstraint([nullable_i], nullable_return);
-    assertConstraint([nullable_j], nullable_return);
+    assertConstraint([nullable_i],
+        _either(nullable_return, checkExpression('i/*check*/').nullCheck));
+    assertConstraint([nullable_j],
+        _either(nullable_return, checkExpression('j/*check*/').nullCheck));
   }
 
   test_if_without_else() async {
     await analyze('''
 int f(bool b, int i) {
   if (b) {
-    return i;
+    return i/*check*/;
   }
   return 0;
 }
@@ -506,7 +551,8 @@
 
     var nullable_i = decoratedTypeAnnotation('int i').nullable;
     var nullable_return = decoratedTypeAnnotation('int f').nullable;
-    assertConstraint([nullable_i], nullable_return);
+    assertConstraint([nullable_i],
+        _either(nullable_return, checkExpression('i/*check*/').nullCheck));
   }
 
   test_intLiteral() async {
@@ -518,13 +564,31 @@
     assertNoConstraints(decoratedTypeAnnotation('int').nullable);
   }
 
+  test_methodDeclaration_resets_unconditional_control_flow() async {
+    await analyze('''
+class C {
+  void f(bool b, int i, int j) {
+    assert(i != null);
+    if (b) return;
+    assert(j != null);
+  }
+  void g(int k) {
+    assert(k != null);
+  }
+}
+''');
+    assertConstraint([], decoratedTypeAnnotation('int i').nonNullIntent);
+    assertNoConstraints(decoratedTypeAnnotation('int j').nonNullIntent);
+    assertConstraint([], decoratedTypeAnnotation('int k').nonNullIntent);
+  }
+
   test_methodInvocation_parameter_contravariant() async {
     await analyze('''
 class C<T> {
   void f(T t) {}
 }
 void g(C<int> c, int i) {
-  c.f(i);
+  c.f(i/*check*/);
 }
 ''');
 
@@ -532,8 +596,11 @@
     var nullable_c_t =
         decoratedTypeAnnotation('C<int>').typeArguments[0].nullable;
     var nullable_t = decoratedTypeAnnotation('T t').nullable;
-    var nullable_c_t_or_nullable_t = _mockOr(nullable_c_t, nullable_t);
-    assertConstraint([nullable_i], nullable_c_t_or_nullable_t);
+    var nullable_c_t_or_nullable_t = _either(nullable_c_t, nullable_t);
+    assertConstraint(
+        [nullable_i],
+        _either(nullable_c_t_or_nullable_t,
+            checkExpression('i/*check*/').nullCheck));
   }
 
   test_methodInvocation_parameter_generic() async {
@@ -541,14 +608,16 @@
 class C<T> {}
 void f(C<int/*1*/>/*2*/ c) {}
 void g(C<int/*3*/>/*4*/ c) {
-  f(c);
+  f(c/*check*/);
 }
 ''');
 
     assertConstraint([decoratedTypeAnnotation('int/*3*/').nullable],
         decoratedTypeAnnotation('int/*1*/').nullable);
-    assertConstraint([decoratedTypeAnnotation('C<int/*3*/>/*4*/').nullable],
-        decoratedTypeAnnotation('C<int/*1*/>/*2*/').nullable);
+    assertConstraint(
+        [decoratedTypeAnnotation('C<int/*3*/>/*4*/').nullable],
+        _either(decoratedTypeAnnotation('C<int/*1*/>/*2*/').nullable,
+            checkExpression('c/*check*/').nullCheck));
   }
 
   test_methodInvocation_parameter_named() async {
@@ -557,12 +626,13 @@
   void f({int i: 0}) {}
 }
 void g(C c, int j) {
-  c.f(i: j);
+  c.f(i: j/*check*/);
 }
 ''');
     var nullable_i = decoratedTypeAnnotation('int i').nullable;
     var nullable_j = decoratedTypeAnnotation('int j').nullable;
-    assertConstraint([nullable_j], nullable_i);
+    assertConstraint([nullable_j],
+        _either(nullable_i, checkExpression('j/*check*/').nullCheck));
   }
 
   test_methodInvocation_target_check() async {
@@ -579,6 +649,19 @@
         checkExpression('c.m').nullCheck);
   }
 
+  test_methodInvocation_target_demonstrates_non_null_intent() async {
+    await analyze('''
+class C {
+  void m() {}
+}
+void test(C c) {
+  c.m();
+}
+''');
+
+    assertConstraint([], decoratedTypeAnnotation('C c').nonNullIntent);
+  }
+
   test_parenthesizedExpression() async {
     await analyze('''
 int f() {
@@ -587,7 +670,9 @@
 ''');
 
     assertConstraint(
-        [ConstraintVariable.always], decoratedTypeAnnotation('int').nullable);
+        [ConstraintVariable.always],
+        _either(decoratedTypeAnnotation('int').nullable,
+            checkExpression('(null)').nullCheck));
   }
 
   test_return_implicit_null() async {
@@ -610,7 +695,9 @@
 ''');
 
     assertConstraint(
-        [ConstraintVariable.always], decoratedTypeAnnotation('int').nullable);
+        [ConstraintVariable.always],
+        _either(decoratedTypeAnnotation('int').nullable,
+            checkExpression('null').nullCheck));
   }
 
   test_stringLiteral() async {
@@ -655,7 +742,7 @@
   /// the purpose of inspecting constraint equations in unit tests.  No
   /// additional constraints will be recorded in [_constraints] as a consequence
   /// of creating this variable.
-  ConstraintVariable _mockOr(ConstraintVariable a, ConstraintVariable b) =>
+  ConstraintVariable _either(ConstraintVariable a, ConstraintVariable b) =>
       ConstraintVariable.or(_MockConstraints(), a, b);
 }
 
@@ -937,14 +1024,16 @@
     _decoratedExpressionTypes[_normalizeExpression(node)] = type;
   }
 
-  void recordDecoratedTypeAnnotation(TypeAnnotation node, DecoratedType type) {
-    super.recordDecoratedTypeAnnotation(node, type);
+  void recordDecoratedTypeAnnotation(
+      Source source, TypeAnnotation node, DecoratedType type) {
+    super.recordDecoratedTypeAnnotation(source, node, type);
     _decoratedTypeAnnotations[node] = type;
   }
 
   @override
-  void recordExpressionChecks(Expression expression, ExpressionChecks checks) {
-    super.recordExpressionChecks(expression, checks);
+  void recordExpressionChecks(
+      Source source, Expression expression, ExpressionChecks checks) {
+    super.recordExpressionChecks(source, expression, checks);
     _expressionChecks[_normalizeExpression(expression)] = checks;
   }
 
diff --git a/pkg/analysis_server/test/src/nullability/provisional_api_test.dart b/pkg/analysis_server/test/src/nullability/provisional_api_test.dart
index 8f9f86e..1698262 100644
--- a/pkg/analysis_server/test/src/nullability/provisional_api_test.dart
+++ b/pkg/analysis_server/test/src/nullability/provisional_api_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/nullability/provisional_api.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -11,23 +12,23 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(ProvisionalApiTest);
-    defineReflectiveTests(ProvisionalApiTestPermissive);
-    defineReflectiveTests(ProvisionalApiTestWithReset);
+    defineReflectiveTests(_ProvisionalApiTest);
+    defineReflectiveTests(_ProvisionalApiTestPermissive);
+    defineReflectiveTests(_ProvisionalApiTestWithReset);
   });
 }
 
 /// Tests of the provisional API.
 @reflectiveTest
-class ProvisionalApiTest extends ProvisionalApiTestBase
-    with ProvisionalApiTestCases {
+class _ProvisionalApiTest extends _ProvisionalApiTestBase
+    with _ProvisionalApiTestCases {
   @override
-  bool get usePermissiveMode => false;
+  bool get _usePermissiveMode => false;
 }
 
 /// Base class for provisional API tests.
-abstract class ProvisionalApiTestBase extends AbstractContextTest {
-  bool get usePermissiveMode;
+abstract class _ProvisionalApiTestBase extends AbstractContextTest {
+  bool get _usePermissiveMode;
 
   /// Hook invoked after calling `prepareInput` on each input.
   void _afterPrepare() {}
@@ -41,9 +42,9 @@
     for (var path in input.keys) {
       newFile(path, content: input[path]);
     }
-    var listener = new TestMigrationListener();
+    var listener = new _TestMigrationListener();
     var migration = NullabilityMigration(listener,
-        permissive: usePermissiveMode, assumptions: assumptions);
+        permissive: _usePermissiveMode, assumptions: assumptions);
     for (var path in input.keys) {
       migration.prepareInput(await session.getResolvedUnit(path));
     }
@@ -53,10 +54,10 @@
     }
     migration.finish();
     var sourceEdits = <String, List<SourceEdit>>{};
-    for (var fix in listener.fixes) {
-      var path = fix.source.fullName;
+    for (var entry in listener._edits.entries) {
+      var path = entry.key.fullName;
       expect(expectedOutput.keys, contains(path));
-      (sourceEdits[path] ??= []).addAll(fix.sourceEdits);
+      sourceEdits[path] = entry.value;
     }
     for (var path in expectedOutput.keys) {
       var sourceEditsForPath = sourceEdits[path] ?? [];
@@ -79,7 +80,119 @@
 }
 
 /// Mixin containing test cases for the provisional API.
-mixin ProvisionalApiTestCases on ProvisionalApiTestBase {
+mixin _ProvisionalApiTestCases on _ProvisionalApiTestBase {
+  test_conditional_assert_statement_does_not_imply_non_null_intent() async {
+    var content = '''
+void f(bool b, int i) {
+  if (b) return;
+  assert(i != null);
+}
+void g(bool b, int i) {
+  if (b) f(b, i);
+}
+main() {
+  g(true, null);
+}
+''';
+    var expected = '''
+void f(bool b, int? i) {
+  if (b) return;
+  assert(i != null);
+}
+void g(bool b, int? i) {
+  if (b) f(b, i);
+}
+main() {
+  g(true, null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  test_conditional_dereference_does_not_imply_non_null_intent() async {
+    var content = '''
+void f(bool b, int i) {
+  if (b) i.abs();
+}
+void g(bool b, int i) {
+  if (b) f(b, i);
+}
+main() {
+  g(false, null);
+}
+''';
+    var expected = '''
+void f(bool b, int? i) {
+  if (b) i!.abs();
+}
+void g(bool b, int? i) {
+  if (b) f(b, i);
+}
+main() {
+  g(false, null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  test_conditional_non_null_usage_does_not_imply_non_null_intent() async {
+    var content = '''
+void f(bool b, int i, int j) {
+  if (b) i.gcd(j);
+}
+void g(bool b, int i, int j) {
+  if (b) f(b, i, j);
+}
+main() {
+  g(false, 0, null);
+}
+''';
+    var expected = '''
+void f(bool b, int i, int? j) {
+  if (b) i.gcd(j!);
+}
+void g(bool b, int i, int? j) {
+  if (b) f(b, i, j);
+}
+main() {
+  g(false, 0, null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  test_conditional_usage_does_not_propagate_non_null_intent() async {
+    var content = '''
+void f(int i) {
+  assert(i != null);
+}
+void g(bool b, int i) {
+  if (b) f(i);
+}
+void h(bool b1, bool b2, int i) {
+  if (b1) g(b2, i);
+}
+main() {
+  h(true, false, null);
+}
+''';
+    var expected = '''
+void f(int i) {
+  assert(i != null);
+}
+void g(bool b, int? i) {
+  if (b) f(i!);
+}
+void h(bool b1, bool b2, int? i) {
+  if (b1) g(b2, i);
+}
+main() {
+  h(true, false, null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   test_data_flow_generic_inward() async {
     var content = '''
 class C<T> {
@@ -577,23 +690,133 @@
     await _checkMultipleFileChanges(
         {path1: file1, path2: file2}, {path1: expected1, path2: expected2});
   }
+
+  test_unconditional_assert_statement_implies_non_null_intent() async {
+    var content = '''
+void f(int i) {
+  assert(i != null);
+}
+void g(bool b, int i) {
+  if (b) f(i);
+}
+main() {
+  g(false, null);
+}
+''';
+    var expected = '''
+void f(int i) {
+  assert(i != null);
+}
+void g(bool b, int? i) {
+  if (b) f(i!);
+}
+main() {
+  g(false, null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  test_unconditional_dereference_implies_non_null_intent() async {
+    var content = '''
+void f(int i) {
+  i.abs();
+}
+void g(bool b, int i) {
+  if (b) f(i);
+}
+main() {
+  g(false, null);
+}
+''';
+    var expected = '''
+void f(int i) {
+  i.abs();
+}
+void g(bool b, int? i) {
+  if (b) f(i!);
+}
+main() {
+  g(false, null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  test_unconditional_non_null_usage_implies_non_null_intent() async {
+    var content = '''
+void f(int i, int j) {
+  i.gcd(j);
+}
+void g(bool b, int i, int j) {
+  if (b) f(i, j);
+}
+main() {
+  g(false, 0, null);
+}
+''';
+    var expected = '''
+void f(int i, int j) {
+  i.gcd(j);
+}
+void g(bool b, int i, int? j) {
+  if (b) f(i, j!);
+}
+main() {
+  g(false, 0, null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  test_unconditional_usage_propagates_non_null_intent() async {
+    var content = '''
+void f(int i) {
+  assert(i != null);
+}
+void g(int i) {
+  f(i);
+}
+void h(bool b, int i) {
+  if (b) g(i);
+}
+main() {
+  h(false, null);
+}
+''';
+    var expected = '''
+void f(int i) {
+  assert(i != null);
+}
+void g(int i) {
+  f(i);
+}
+void h(bool b, int? i) {
+  if (b) g(i!);
+}
+main() {
+  h(false, null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
 }
 
 @reflectiveTest
-class ProvisionalApiTestPermissive extends ProvisionalApiTestBase
-    with ProvisionalApiTestCases {
+class _ProvisionalApiTestPermissive extends _ProvisionalApiTestBase
+    with _ProvisionalApiTestCases {
   @override
-  bool get usePermissiveMode => true;
+  bool get _usePermissiveMode => true;
 }
 
 /// Tests of the provisional API, where the driver is reset between calls to
 /// `prepareInput` and `processInput`, ensuring that the migration algorithm
 /// sees different AST and element objects during different phases.
 @reflectiveTest
-class ProvisionalApiTestWithReset extends ProvisionalApiTestBase
-    with ProvisionalApiTestCases {
+class _ProvisionalApiTestWithReset extends _ProvisionalApiTestBase
+    with _ProvisionalApiTestCases {
   @override
-  bool get usePermissiveMode => false;
+  bool get _usePermissiveMode => false;
 
   @override
   void _afterPrepare() {
@@ -601,11 +824,14 @@
   }
 }
 
-class TestMigrationListener implements NullabilityMigrationListener {
-  final fixes = <SingleNullabilityFix>[];
+class _TestMigrationListener implements NullabilityMigrationListener {
+  final _edits = <Source, List<SourceEdit>>{};
 
   @override
-  void addFix(SingleNullabilityFix fix) {
-    fixes.add(fix);
+  void addEdit(SingleNullabilityFix fix, SourceEdit edit) {
+    (_edits[fix.source] ??= []).add(edit);
   }
+
+  @override
+  void addFix(SingleNullabilityFix fix) {}
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_if_element_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_if_element_test.dart
index fda239f..8d8e3ef 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_if_element_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_if_element_test.dart
@@ -21,10 +21,8 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_IF_ELEMENT;
 
   void setUp() {
-    createAnalysisOptionsFile(experiments: [
-      EnableString.control_flow_collections,
-      EnableString.set_literals
-    ]);
+    createAnalysisOptionsFile(
+        experiments: [EnableString.control_flow_collections]);
     super.setUp();
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_null_aware_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_null_aware_test.dart
new file mode 100644
index 0000000..5677205
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_null_aware_test.dart
@@ -0,0 +1,167 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToNormalParameterTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToNormalParameterTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_TO_NULL_AWARE;
+
+  test_equal_differentTarget() async {
+    await resolveTestUnit('''
+abstract class A {
+  int m();
+}
+int f(A a1, A a2) => a1 == null ? null : a2.m();
+''');
+    await assertNoAssistAt('?');
+  }
+
+  test_equal_notComparedToNull() async {
+    await resolveTestUnit('''
+abstract class A {
+  int m();
+}
+int f(A a1, A a2) => a1 == a2 ? a2.m() : a1.m();
+''');
+    await assertNoAssistAt('?');
+  }
+
+  test_equal_notIdentifier() async {
+    await resolveTestUnit('''
+abstract class A {
+  int m();
+}
+int f(A a) => a.m() == null ? 0 : a.m();
+''');
+    await assertNoAssistAt('?');
+  }
+
+  test_equal_notInvocation() async {
+    await resolveTestUnit('''
+abstract class A {
+  int m();
+  int operator +(A a);
+}
+int f(A a1) => a1 == null ? null : a1 + a1;
+''');
+    await assertNoAssistAt('?');
+  }
+
+  test_equal_notNullPreserving() async {
+    await resolveTestUnit('''
+abstract class A {
+  int m();
+}
+int f(A a1, A a2) => a1 == null ? a2.m() : a1.m();
+''');
+    await assertNoAssistAt('?');
+  }
+
+  test_equal_notPeriod() async {
+    await resolveTestUnit('''
+abstract class A {
+  int m();
+}
+int f(A a1) => a1 == null ? null : a1?.m();
+''');
+    await assertNoAssistAt('? ');
+  }
+
+  test_equal_nullOnLeft() async {
+    await resolveTestUnit('''
+abstract class A {
+  int m();
+}
+int f(A a) => null == a ? null : a.m();
+''');
+    await assertHasAssistAt('?', '''
+abstract class A {
+  int m();
+}
+int f(A a) => a?.m();
+''');
+  }
+
+  test_equal_nullOnRight() async {
+    await resolveTestUnit('''
+abstract class A {
+  int m();
+}
+int f(A a) => a == null ? null : a.m();
+''');
+    await assertHasAssistAt('?', '''
+abstract class A {
+  int m();
+}
+int f(A a) => a?.m();
+''');
+  }
+
+  test_equal_prefixedIdentifier() async {
+    await resolveTestUnit('''
+class A {
+  int p;
+}
+int f(A a) => null == a ? null : a.p;
+''');
+    await assertHasAssistAt('?', '''
+class A {
+  int p;
+}
+int f(A a) => a?.p;
+''');
+  }
+
+  test_notEqual_notNullPreserving() async {
+    await resolveTestUnit('''
+abstract class A {
+  int m();
+}
+int f(A a1, A a2) => a1 != null ? a1.m() : a2.m();
+''');
+    await assertNoAssistAt('?');
+  }
+
+  test_notEqual_nullOnLeft() async {
+    await resolveTestUnit('''
+abstract class A {
+  int m();
+}
+int f(A a) => null != a ? a.m() : null;
+''');
+    await assertHasAssistAt('?', '''
+abstract class A {
+  int m();
+}
+int f(A a) => a?.m();
+''');
+  }
+
+  test_notEqual_nullOnRight() async {
+    await resolveTestUnit('''
+abstract class A {
+  int m();
+}
+int f(A a) => a != null ? a.m() : null;
+''');
+    await assertHasAssistAt('?', '''
+abstract class A {
+  int m();
+}
+int f(A a) => a?.m();
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
index 86c5872..1d75bb9 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
@@ -31,6 +31,7 @@
 import 'convert_to_map_literal_test.dart' as convert_to_map_literal;
 import 'convert_to_multiline_string_test.dart' as convert_to_multiline_string;
 import 'convert_to_normal_parameter_test.dart' as convert_to_normal_parameter;
+import 'convert_to_null_aware_test.dart' as convert_to_null_aware;
 import 'convert_to_set_literal_test.dart' as convert_to_set_literal;
 import 'convert_to_single_quoted_string_test.dart'
     as convert_to_single_quoted_string;
@@ -99,6 +100,7 @@
     convert_to_map_literal.main();
     convert_to_multiline_string.main();
     convert_to_normal_parameter.main();
+    convert_to_null_aware.main();
     convert_to_set_literal.main();
     convert_to_single_quoted_string.main();
     convert_to_spread.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart
index 49938b4..4d4c30e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart
@@ -52,10 +52,7 @@
 main() async {
   await foo();
 }
-''', errorFilter: (AnalysisError error) {
-      return error.errorCode ==
-          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
-    });
+''');
   }
 
   test_blockFunctionBody_getter() async {
@@ -132,8 +129,7 @@
   return 42;
 }
 ''', errorFilter: (AnalysisError error) {
-      return error.errorCode ==
-          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
+      return error.errorCode == CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT;
     });
   }
 
@@ -151,10 +147,7 @@
   await foo();
   return 42;
 }
-''', errorFilter: (AnalysisError error) {
-      return error.errorCode ==
-          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
-    });
+''');
   }
 
   test_returnFuture_nonFuture() async {
@@ -171,10 +164,7 @@
   await foo();
   return 42;
 }
-''', errorFilter: (AnalysisError error) {
-      return error.errorCode ==
-          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
-    });
+''');
   }
 
   test_returnFuture_noType() async {
@@ -191,9 +181,6 @@
   await foo();
   return 42;
 }
-''', errorFilter: (AnalysisError error) {
-      return error.errorCode ==
-          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
-    });
+''');
   }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_argument_name_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_argument_name_test.dart
new file mode 100644
index 0000000..b24488f
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_argument_name_test.dart
@@ -0,0 +1,200 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ChangeArgumentNameTest);
+  });
+}
+
+@reflectiveTest
+class ChangeArgumentNameTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CHANGE_ARGUMENT_NAME;
+
+  test_child_constructor() async {
+    await resolveTestUnit('''
+f() => new A(children: 2);
+class A {
+  A({int child});
+}
+''');
+    await assertHasFix('''
+f() => new A(child: 2);
+class A {
+  A({int child});
+}
+''');
+  }
+
+  test_child_function() async {
+    await resolveTestUnit('''
+f() {
+  g(children: 0);
+}
+void g({int child}) {}
+''');
+    await assertHasFix('''
+f() {
+  g(child: 0);
+}
+void g({int child}) {}
+''');
+  }
+
+  test_child_method() async {
+    await resolveTestUnit('''
+f(A a) {
+  a.m(children: 0);
+}
+class A {
+  void m({int child}) {}
+}
+''');
+    await assertHasFix('''
+f(A a) {
+  a.m(child: 0);
+}
+class A {
+  void m({int child}) {}
+}
+''');
+  }
+
+  test_children_constructor() async {
+    await resolveTestUnit('''
+f() => new A(child: 2);
+class A {
+  A({int children});
+}
+''');
+    await assertHasFix('''
+f() => new A(children: 2);
+class A {
+  A({int children});
+}
+''');
+  }
+
+  test_children_function() async {
+    await resolveTestUnit('''
+f() {
+  g(child: 0);
+}
+void g({int children}) {}
+''');
+    await assertHasFix('''
+f() {
+  g(children: 0);
+}
+void g({int children}) {}
+''');
+  }
+
+  test_children_method() async {
+    await resolveTestUnit('''
+f(A a) {
+  a.m(child: 0);
+}
+class A {
+  void m({int children}) {}
+}
+''');
+    await assertHasFix('''
+f(A a) {
+  a.m(children: 0);
+}
+class A {
+  void m({int children}) {}
+}
+''');
+  }
+
+  test_default_constructor() async {
+    await resolveTestUnit('''
+f() => new A(boot: 2);
+class A {
+  A({int boat});
+}
+''');
+    await assertHasFix('''
+f() => new A(boat: 2);
+class A {
+  A({int boat});
+}
+''');
+  }
+
+  test_default_function() async {
+    await resolveTestUnit('''
+f() {
+  g(boot: 0);
+}
+void g({int boat}) {}
+''');
+    await assertHasFix('''
+f() {
+  g(boat: 0);
+}
+void g({int boat}) {}
+''');
+  }
+
+  test_default_method() async {
+    await resolveTestUnit('''
+f(A a) {
+  a.m(boot: 0);
+}
+class A {
+  void m({int boat}) {}
+}
+''');
+    await assertHasFix('''
+f(A a) {
+  a.m(boat: 0);
+}
+class A {
+  void m({int boat}) {}
+}
+''');
+  }
+
+  test_tooDistant_constructor() async {
+    await resolveTestUnit('''
+f() => new A(bbbbb: 2);
+class A {
+  A({int aaaaaaa});
+}
+''');
+    await assertNoFix();
+  }
+
+  test_tooDistant_function() async {
+    await resolveTestUnit('''
+f() {
+  g(bbbbb: 0);
+}
+void g({int aaaaaaa}) {}
+''');
+    await assertNoFix();
+  }
+
+  test_tooDistant_method() async {
+    await resolveTestUnit('''
+f(A a) {
+  a.m(bbbbb: 0);
+}
+class A {
+  void m({int aaaaaaa}) {}
+}
+''');
+    await assertNoFix();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
index 78de092..08bf63e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -318,6 +319,53 @@
 ''');
   }
 
+  test_withFunction_functionTopLevelVariable() async {
+    addSource('/home/test/lib/lib.dart', 'var myFunction = () {};');
+    await resolveTestUnit('''
+main() {
+  myFunction();
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+main() {
+  myFunction();
+}
+''');
+  }
+
+  @failingTest
+  test_withFunction_nonFunctionType() async {
+    // TODO Remove preferFunctionOverTopLevelVariable test once this is passing
+    addSource('/home/test/lib/lib.dart', 'int zero = 0;');
+    await resolveTestUnit('''
+main() {
+  zero();
+}
+''');
+    await assertNoFix();
+  }
+
+  test_withFunction_preferFunctionOverTopLevelVariable() async {
+    _configureMyPkg({
+      'b.dart': 'var myFunction = () {};',
+      'a.dart': 'myFunction() {}',
+    });
+    await resolveTestUnit('''
+main() {
+  myFunction();
+}
+''');
+    await assertHasFix('''
+import 'package:my_pkg/a.dart';
+
+main() {
+  myFunction();
+}
+''');
+  }
+
   test_withFunction_unresolvedMethod() async {
     addSource('/home/test/lib/lib.dart', '''
 library lib;
@@ -362,51 +410,20 @@
 ''');
   }
 
-  test_withFunction_functionTopLevelVariable() async {
-    addSource('/home/test/lib/lib.dart', 'var myFunction = () {};');
+  test_withMixin() async {
+    addSource('/home/test/lib/lib.dart', '''
+mixin Test {}
+''');
     await resolveTestUnit('''
-main() {
-  myFunction();
-}
+class X = Object with Test;
 ''');
     await assertHasFix('''
 import 'package:test/lib.dart';
 
-main() {
-  myFunction();
-}
-''');
-  }
-
-  test_withFunction_preferFunctionOverTopLevelVariable() async {
-    _configureMyPkg({
-      'b.dart': 'var myFunction = () {};',
-      'a.dart': 'myFunction() {}',
+class X = Object with Test;
+''', errorFilter: (error) {
+      return error.errorCode == StaticWarningCode.UNDEFINED_CLASS;
     });
-    await resolveTestUnit('''
-main() {
-  myFunction();
-}
-''');
-    await assertHasFix('''
-import 'package:my_pkg/a.dart';
-
-main() {
-  myFunction();
-}
-''');
-  }
-
-  @failingTest
-  test_withFunction_nonFunctionType() async {
-    // TODO Remove preferFunctionOverTopLevelVariable test once this is passing
-    addSource('/home/test/lib/lib.dart', 'int zero = 0;');
-    await resolveTestUnit('''
-main() {
-  zero();
-}
-''');
-    await assertNoFix();
   }
 
   test_withTopLevelVariable() async {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_duplicate_case_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_duplicate_case_test.dart
new file mode 100644
index 0000000..0f1f928
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_duplicate_case_test.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveDuplicateCaseTest);
+  });
+}
+
+@reflectiveTest
+class RemoveDuplicateCaseTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_DUPLICATE_CASE;
+
+  @override
+  String get lintCode => LintNames.no_duplicate_case_values;
+
+  test_removeStringCase() async {
+    await resolveTestUnit('''
+void switchString() {
+  String v = 'a';
+  switch (v) {
+    case 'a':
+      print('a');
+      break;
+    case 'b':
+      print('b');
+      break;
+    case 'a' /*LINT*/:
+      print('a');
+      break;
+    default:
+      print('?);
+  }
+}
+''');
+    await assertHasFix('''
+void switchString() {
+  String v = 'a';
+  switch (v) {
+    case 'a':
+      print('a');
+      break;
+    case 'b':
+      print('b');
+      break;
+    default:
+      print('?);
+  }
+}
+''');
+  }
+
+  test_removeIntCase() async {
+    await resolveTestUnit('''
+void switchInt() {
+  switch (2) {
+    case 1:
+      print('a');
+      break;
+    case 2:
+    case 2 /*LINT*/:
+    default:
+      print('?);
+  }
+}
+''');
+    await assertHasFix('''
+void switchInt() {
+  switch (2) {
+    case 1:
+      print('a');
+      break;
+    case 2:
+    default:
+      print('?);
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_interpolation_braces_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_interpolation_braces_test.dart
index 2fdfad9a..b48e7d8 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_interpolation_braces_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_interpolation_braces_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.REMOVE_INTERPOLATION_BRACES;
 
   @override
-  String get lintCode => LintNames.unnecessary_brace_in_string_interp;
+  String get lintCode => LintNames.unnecessary_brace_in_string_interps;
 
   test_withSpace() async {
     await resolveTestUnit(r'''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
index 443d382..666a59c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.REMOVE_METHOD_DECLARATION;
 
   @override
-  String get lintCode => LintNames.unnecessary_override;
+  String get lintCode => LintNames.unnecessary_overrides;
 
   test_getter() async {
     await resolveTestUnit('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_const_test.dart
new file mode 100644
index 0000000..440b948
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_const_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnnecessaryConstTest);
+  });
+}
+
+@reflectiveTest
+class UnnecessaryConstTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_UNNECESSARY_CONST;
+
+  @override
+  String get lintCode => LintNames.unnecessary_const;
+
+  test_constConstructor() async {
+    await resolveTestUnit('''
+class A { const A(); }
+m(){
+  const a = /*LINT*/const A();
+}
+''');
+    await assertHasFix('''
+class A { const A(); }
+m(){
+  const a = /*LINT*/A();
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_new_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_new_test.dart
new file mode 100644
index 0000000..b1cad87
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_new_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnnecessaryNewTest);
+  });
+}
+
+@reflectiveTest
+class UnnecessaryNewTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_UNNECESSARY_NEW;
+
+  @override
+  String get lintCode => LintNames.unnecessary_new;
+
+  test_constructor() async {
+    await resolveTestUnit('''
+class A { A(); }
+m(){
+  final a = /*LINT*/new A();
+}
+''');
+    await assertHasFix('''
+class A { A(); }
+m(){
+  final a = /*LINT*/A();
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 6a259e9..07369fb 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -74,6 +74,8 @@
 import 'remove_type_annotation_test.dart' as remove_type_annotation;
 import 'remove_type_arguments_test.dart' as remove_type_arguments;
 import 'remove_unnecessary_cast_test.dart' as remove_unnecessary_cast;
+import 'remove_unnecessary_const_test.dart' as remove_unnecessary_const;
+import 'remove_unnecessary_new_test.dart' as remove_unnecessary_new;
 import 'remove_unused_catch_clause_test.dart' as remove_unused_catch_clause;
 import 'remove_unused_catch_stack_test.dart' as remove_unused_catch_stack;
 import 'remove_unused_import_test.dart' as remove_unused_import;
@@ -159,6 +161,8 @@
     remove_type_annotation.main();
     remove_type_arguments.main();
     remove_unnecessary_cast.main();
+    remove_unnecessary_const.main();
+    remove_unnecessary_new.main();
     remove_unused_catch_clause.main();
     remove_unused_catch_stack.main();
     remove_unused_import.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/use_rethrow_test.dart b/pkg/analysis_server/test/src/services/correction/fix/use_rethrow_test.dart
new file mode 100644
index 0000000..5a49867
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/use_rethrow_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UseRethrowTest);
+  });
+}
+
+@reflectiveTest
+class UseRethrowTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.USE_RETHROW;
+
+  @override
+  String get lintCode => LintNames.use_rethrow_when_possible;
+
+  test_rethrow() async {
+    await resolveTestUnit('''
+void bad1() {
+  try {} catch (e) {
+    throw/*LINT*/ e;
+  }
+}
+''');
+    await assertHasFix('''
+void bad1() {
+  try {} catch (e) {
+    rethrow;
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/utilities/flutter_test.dart b/pkg/analysis_server/test/src/utilities/flutter_test.dart
index 20193cb..6bb17e3 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_test.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_test.dart
@@ -17,6 +17,8 @@
 
 @reflectiveTest
 class FlutterTest extends AbstractSingleUnitTest {
+  final flutter = Flutter.mobile;
+
   @override
   void setUp() {
     super.setUp();
@@ -29,7 +31,7 @@
 var w = const Icon(Icons.book);
 ''');
     var w = _getTopVariableCreation('w');
-    expect(getWidgetPresentationText(w), "Icon(Icons.book)");
+    expect(flutter.getWidgetPresentationText(w), "Icon(Icons.book)");
   }
 
   test_getWidgetPresentationText_icon_withoutArguments() async {
@@ -39,7 +41,7 @@
 var w = const Icon();
 ''');
     var w = _getTopVariableCreation('w');
-    expect(getWidgetPresentationText(w), "Icon");
+    expect(flutter.getWidgetPresentationText(w), "Icon");
   }
 
   test_getWidgetPresentationText_notWidget() async {
@@ -48,7 +50,7 @@
 var w = new Object();
 ''');
     var w = _getTopVariableCreation('w');
-    expect(getWidgetPresentationText(w), isNull);
+    expect(flutter.getWidgetPresentationText(w), isNull);
   }
 
   test_getWidgetPresentationText_text() async {
@@ -57,7 +59,7 @@
 var w = const Text('foo');
 ''');
     var w = _getTopVariableCreation('w');
-    expect(getWidgetPresentationText(w), "Text('foo')");
+    expect(flutter.getWidgetPresentationText(w), "Text('foo')");
   }
 
   test_getWidgetPresentationText_text_longText() async {
@@ -67,7 +69,9 @@
 ''');
     var w = _getTopVariableCreation('w');
     expect(
-        getWidgetPresentationText(w), "Text('abcabcabcabcab...cabcabcabcabc')");
+      flutter.getWidgetPresentationText(w),
+      "Text('abcabcabcabcab...cabcabcabcabc')",
+    );
   }
 
   test_getWidgetPresentationText_text_withoutArguments() async {
@@ -77,7 +81,7 @@
 var w = const Text();
 ''');
     var w = _getTopVariableCreation('w');
-    expect(getWidgetPresentationText(w), "Text");
+    expect(flutter.getWidgetPresentationText(w), "Text");
   }
 
   test_getWidgetPresentationText_unresolved() async {
@@ -87,7 +91,7 @@
 var w = new Foo();
 ''');
     var w = _getTopVariableCreation('w');
-    expect(getWidgetPresentationText(w), isNull);
+    expect(flutter.getWidgetPresentationText(w), isNull);
   }
 
   test_identifyWidgetExpression_node_instanceCreation() async {
@@ -116,11 +120,14 @@
       ConstructorName constructorName = creation.constructorName;
       TypeName typeName = constructorName.type;
       ArgumentList argumentList = creation.argumentList;
-      expect(identifyWidgetExpression(creation), creation);
-      expect(identifyWidgetExpression(constructorName), creation);
-      expect(identifyWidgetExpression(typeName), creation);
-      expect(identifyWidgetExpression(argumentList), isNull);
-      expect(identifyWidgetExpression(argumentList.arguments[0]), isNull);
+      expect(flutter.identifyWidgetExpression(creation), creation);
+      expect(flutter.identifyWidgetExpression(constructorName), creation);
+      expect(flutter.identifyWidgetExpression(typeName), creation);
+      expect(flutter.identifyWidgetExpression(argumentList), isNull);
+      expect(
+        flutter.identifyWidgetExpression(argumentList.arguments[0]),
+        isNull,
+      );
     }
 
     // new MyWidget.named(5678);
@@ -130,13 +137,16 @@
       ConstructorName constructorName = creation.constructorName;
       TypeName typeName = constructorName.type;
       ArgumentList argumentList = creation.argumentList;
-      expect(identifyWidgetExpression(creation), creation);
-      expect(identifyWidgetExpression(constructorName), creation);
-      expect(identifyWidgetExpression(typeName), creation);
-      expect(identifyWidgetExpression(typeName.name), creation);
-      expect(identifyWidgetExpression(constructorName.name), creation);
-      expect(identifyWidgetExpression(argumentList), isNull);
-      expect(identifyWidgetExpression(argumentList.arguments[0]), isNull);
+      expect(flutter.identifyWidgetExpression(creation), creation);
+      expect(flutter.identifyWidgetExpression(constructorName), creation);
+      expect(flutter.identifyWidgetExpression(typeName), creation);
+      expect(flutter.identifyWidgetExpression(typeName.name), creation);
+      expect(flutter.identifyWidgetExpression(constructorName.name), creation);
+      expect(flutter.identifyWidgetExpression(argumentList), isNull);
+      expect(
+        flutter.identifyWidgetExpression(argumentList.arguments[0]),
+        isNull,
+      );
     }
   }
 
@@ -155,18 +165,21 @@
     {
       MethodInvocation invocation = findNodeAtString(
           "createEmptyText();", (node) => node is MethodInvocation);
-      expect(identifyWidgetExpression(invocation), invocation);
+      expect(flutter.identifyWidgetExpression(invocation), invocation);
       ArgumentList argumentList = invocation.argumentList;
-      expect(identifyWidgetExpression(argumentList), isNull);
+      expect(flutter.identifyWidgetExpression(argumentList), isNull);
     }
 
     {
       MethodInvocation invocation = findNodeAtString(
           "createText('xyz');", (node) => node is MethodInvocation);
-      expect(identifyWidgetExpression(invocation), invocation);
+      expect(flutter.identifyWidgetExpression(invocation), invocation);
       ArgumentList argumentList = invocation.argumentList;
-      expect(identifyWidgetExpression(argumentList), isNull);
-      expect(identifyWidgetExpression(argumentList.arguments[0]), isNull);
+      expect(flutter.identifyWidgetExpression(argumentList), isNull);
+      expect(
+        flutter.identifyWidgetExpression(argumentList.arguments[0]),
+        isNull,
+      );
     }
   }
 
@@ -181,7 +194,7 @@
 Text createEmptyText() => new Text('');
 ''');
     Expression childExpression = findNodeAtString('child: ');
-    expect(identifyWidgetExpression(childExpression), isNull);
+    expect(flutter.identifyWidgetExpression(childExpression), isNull);
   }
 
   test_identifyWidgetExpression_node_prefixedIdentifier_identifier() async {
@@ -197,7 +210,7 @@
 }
 ''');
     SimpleIdentifier bar = findNodeAtString('bar; // ref');
-    expect(identifyWidgetExpression(bar), bar.parent);
+    expect(flutter.identifyWidgetExpression(bar), bar.parent);
   }
 
   test_identifyWidgetExpression_node_prefixedIdentifier_prefix() async {
@@ -213,7 +226,7 @@
 }
 ''');
     SimpleIdentifier foo = findNodeAtString('foo.bar');
-    expect(identifyWidgetExpression(foo), foo.parent);
+    expect(flutter.identifyWidgetExpression(foo), foo.parent);
   }
 
   test_identifyWidgetExpression_node_simpleIdentifier() async {
@@ -225,7 +238,7 @@
 }
 ''');
     Expression expression = findNodeAtString('widget; // ref');
-    expect(identifyWidgetExpression(expression), expression);
+    expect(flutter.identifyWidgetExpression(expression), expression);
   }
 
   test_identifyWidgetExpression_null() async {
@@ -239,15 +252,15 @@
 
 Text createEmptyText() => new Text('');
 ''');
-    expect(identifyWidgetExpression(null), isNull);
+    expect(flutter.identifyWidgetExpression(null), isNull);
     {
       Expression expression = findNodeAtString("42;");
-      expect(identifyWidgetExpression(expression), isNull);
+      expect(flutter.identifyWidgetExpression(expression), isNull);
     }
 
     {
       Expression expression = findNodeAtString("intVariable;");
-      expect(identifyWidgetExpression(expression), isNull);
+      expect(flutter.identifyWidgetExpression(expression), isNull);
     }
   }
 
@@ -263,7 +276,7 @@
 void useWidget(Widget w) {}
 ''');
     Expression expression = findNodeAtString("text); // ref");
-    expect(identifyWidgetExpression(expression), expression);
+    expect(flutter.identifyWidgetExpression(expression), expression);
   }
 
   test_identifyWidgetExpression_parent_expressionStatement() async {
@@ -275,7 +288,7 @@
 }
 ''');
     Expression expression = findNodeAtString("widget; // ref");
-    expect(identifyWidgetExpression(expression), expression);
+    expect(flutter.identifyWidgetExpression(expression), expression);
   }
 
   test_identifyWidgetExpression_parent_listLiteral() async {
@@ -287,7 +300,7 @@
 }
 ''');
     Expression expression = findNodeAtString("widget]; // ref");
-    expect(identifyWidgetExpression(expression), expression);
+    expect(flutter.identifyWidgetExpression(expression), expression);
   }
 
   test_identifyWidgetExpression_parent_namedExpression() async {
@@ -302,7 +315,7 @@
 void useWidget({Widget child}) {}
 ''');
     Expression expression = findNodeAtString("text); // ref");
-    expect(identifyWidgetExpression(expression), expression);
+    expect(flutter.identifyWidgetExpression(expression), expression);
   }
 
   test_identifyWidgetExpression_parent_returnStatement() async {
@@ -314,7 +327,7 @@
 }
 ''');
     Expression expression = findNodeAtString("widget; // ref");
-    expect(identifyWidgetExpression(expression), expression);
+    expect(flutter.identifyWidgetExpression(expression), expression);
   }
 
   test_isWidget() async {
@@ -328,19 +341,19 @@
 class NotWidget extends State {}
 ''');
     var myStatelessWidget = testUnitElement.getType('MyStatelessWidget');
-    expect(isWidget(myStatelessWidget), isTrue);
+    expect(flutter.isWidget(myStatelessWidget), isTrue);
 
     var myStatefulWidget = testUnitElement.getType('MyStatefulWidget');
-    expect(isWidget(myStatefulWidget), isTrue);
+    expect(flutter.isWidget(myStatefulWidget), isTrue);
 
     var myContainer = testUnitElement.getType('MyContainer');
-    expect(isWidget(myContainer), isTrue);
+    expect(flutter.isWidget(myContainer), isTrue);
 
     var notFlutter = testUnitElement.getType('NotFlutter');
-    expect(isWidget(notFlutter), isFalse);
+    expect(flutter.isWidget(notFlutter), isFalse);
 
     var notWidget = testUnitElement.getType('NotWidget');
-    expect(isWidget(notWidget), isFalse);
+    expect(flutter.isWidget(notWidget), isFalse);
   }
 
   test_isWidgetCreation() async {
@@ -350,13 +363,13 @@
 var a = new Object();
 var b = new Text('bbb');
 ''');
-    expect(isWidgetCreation(null), isFalse);
+    expect(flutter.isWidgetCreation(null), isFalse);
 
     InstanceCreationExpression a = _getTopVariableCreation('a');
-    expect(isWidgetCreation(a), isFalse);
+    expect(flutter.isWidgetCreation(a), isFalse);
 
     InstanceCreationExpression b = _getTopVariableCreation('b');
-    expect(isWidgetCreation(b), isTrue);
+    expect(flutter.isWidgetCreation(b), isTrue);
   }
 
   test_isWidgetExpression() async {
@@ -381,46 +394,46 @@
 ''');
     {
       Expression expression = findNodeAtString('named(); // use');
-      expect(isWidgetExpression(expression), isFalse);
+      expect(flutter.isWidgetExpression(expression), isFalse);
       var creation = expression.parent.parent as InstanceCreationExpression;
-      expect(isWidgetExpression(creation), isTrue);
+      expect(flutter.isWidgetExpression(creation), isTrue);
     }
 
     {
       Expression expression = findNodeAtString("new Text('abc')");
-      expect(isWidgetExpression(expression), isTrue);
+      expect(flutter.isWidgetExpression(expression), isTrue);
     }
 
     {
       Expression expression = findNodeAtString("text;");
-      expect(isWidgetExpression(expression), isTrue);
+      expect(flutter.isWidgetExpression(expression), isTrue);
     }
 
     {
       Expression expression = findNodeAtString(
           "createEmptyText();", (node) => node is MethodInvocation);
-      expect(isWidgetExpression(expression), isTrue);
+      expect(flutter.isWidgetExpression(expression), isTrue);
     }
 
     {
       SimpleIdentifier expression = findNodeAtString('Container(');
-      expect(isWidgetExpression(expression), isFalse);
+      expect(flutter.isWidgetExpression(expression), isFalse);
     }
 
     {
       NamedExpression expression =
           findNodeAtString('child: ', (n) => n is NamedExpression);
-      expect(isWidgetExpression(expression), isFalse);
+      expect(flutter.isWidgetExpression(expression), isFalse);
     }
 
     {
       Expression expression = findNodeAtString("42;");
-      expect(isWidgetExpression(expression), isFalse);
+      expect(flutter.isWidgetExpression(expression), isFalse);
     }
 
     {
       Expression expression = findNodeAtString("intVariable;");
-      expect(isWidgetExpression(expression), isFalse);
+      expect(flutter.isWidgetExpression(expression), isFalse);
     }
   }
 
diff --git a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
index df7a3c8..b4cb36e 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
@@ -99,6 +99,44 @@
       expect(jsonMap, isNot(contains('error')));
     });
 
+    test('canParse returns false for out-of-spec (restricted) enum values', () {
+      expect(MarkupKind.canParse('NotAMarkupKind'), isFalse);
+    });
+
+    test('canParse returns true for in-spec (restricted) enum values', () {
+      expect(MarkupKind.canParse('plaintext'), isTrue);
+    });
+
+    test('canParse returns true for out-of-spec (unrestricted) enum values',
+        () {
+      expect(SymbolKind.canParse(-1), isTrue);
+    });
+
+    test('canParse allows nulls in nullable and undefinable fields', () {
+      // The only required field in InitializeParams is capabilities, and all
+      // of the fields on that are optional.
+      final canParse = InitializeParams.canParse({
+        'processId': null,
+        'rootUri': null,
+        'capabilities': <String, Object>{}
+      });
+      expect(canParse, isTrue);
+    });
+
+    test('canParse validates optional fields', () {
+      expect(RenameFileOptions.canParse(<String, Object>{}), isTrue);
+      expect(RenameFileOptions.canParse({'overwrite': true}), isTrue);
+      expect(RenameFileOptions.canParse({'overwrite': 1}), isFalse);
+    });
+
+    test('canParse ignores fields not in the spec', () {
+      expect(
+          RenameFileOptions.canParse({'overwrite': true, 'invalidField': true}),
+          isTrue);
+      expect(RenameFileOptions.canParse({'overwrite': 1, 'invalidField': true}),
+          isFalse);
+    });
+
     test('ResponseMessage can include a null result', () {
       final id = new Either2<num, String>.t1(1);
       final resp = new ResponseMessage(id, null, null, jsonRpcVersion);
@@ -169,6 +207,16 @@
       expect(params.textDocument,
           const TypeMatcher<VersionedTextDocumentIdentifier>());
     });
+
+    test('parses JSON with unknown fields', () {
+      final input =
+          '{"id":1,"invalidField":true,"method":"foo","jsonrpc":"test"}';
+      final message = RequestMessage.fromJson(jsonDecode(input));
+      expect(message.id.valueEquals(1), isTrue);
+      expect(message.method, equals(new Method("foo")));
+      expect(message.params, isNull);
+      expect(message.jsonrpc, equals("test"));
+    });
   });
 
   test('objects with lists can round-trip through to json and back', () {
diff --git a/pkg/analysis_server/tool/lsp_spec/README.md b/pkg/analysis_server/tool/lsp_spec/README.md
index 5c0ab08..f5420ac 100644
--- a/pkg/analysis_server/tool/lsp_spec/README.md
+++ b/pkg/analysis_server/tool/lsp_spec/README.md
@@ -1,8 +1,10 @@
 # Language Server Protocol
 
-## LSP Support Status
+[Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP) support is available in the Dart analysis server from version 2.2.0 of the SDK (which was included in version 1.2.1 of Flutter). The supported messages are detailed below (for the version of the SDK that matches this README).
 
-Support for [the Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP) is **not production ready** but available as a preview to allow testing/integration work.
+## Using the Dart LSP server in editors
+
+- [Using Dart LSP in Vim](README_vim.md)
 
 ## Running the Server
 
@@ -63,9 +65,9 @@
 | textDocument/documentSymbol | ✅ | ✅ | ✅ | ✅ |
 | textDocument/codeAction (sortMembers) | ✅ | ✅ | ✅ | ✅ |
 | textDocument/codeAction (organiseImports) | ✅ | ✅ | ✅ | ✅ |
-| textDocument/codeAction (refactors) | | | | |
-| textDocument/codeAction (assists) | ✅ | ✅ | ✅ | ✅ |
-| textDocument/codeAction (fixes) | ✅ | ✅ | ✅ | ✅ |
+| textDocument/codeAction (refactors) | | | | | <!-- Only if the client advertises `codeActionLiteralSupport` with Refactors -->
+| textDocument/codeAction (assists) | ✅ | ✅ | ✅ | ✅ | Only if the client advertises `codeActionLiteralSupport` with `Refactor`
+| textDocument/codeAction (fixes) | ✅ | ✅ | ✅ | ✅ | Only if the client advertises `codeActionLiteralSupport` with `QuickFix`
 | textDocument/codeLens | | | | |
 | codeLens/resolve | | | | |
 | textDocument/documentLink | | | | |
diff --git a/pkg/analysis_server/tool/lsp_spec/README_vim.md b/pkg/analysis_server/tool/lsp_spec/README_vim.md
new file mode 100644
index 0000000..19dd029
--- /dev/null
+++ b/pkg/analysis_server/tool/lsp_spec/README_vim.md
@@ -0,0 +1,75 @@
+# Using Dart LSP in Vim
+
+## Prerequisites
+
+To use Dart’s LSP server with Vim you’ll need to be using at least version 2.2.0
+of the Dart SDK (which shipped in version 1.2.1 of Flutter). A Vim plugin manager
+is not required but may simplify setup. The steps below have been written assuming
+use of [vim-plug](https://github.com/junegunn/vim-plug).
+
+
+## Install the Plugins
+
+Install the [dart-vim-plugin](https://github.com/dart-lang/dart-vim-plugin) and
+[vim-lsc](https://github.com/natebosch/vim-lsc) plugins. Using vim-plug this can
+be done by adding the following to `.vimrc` then reloading and running
+`:PlugInstall`:
+
+```
+call plug#begin('~/.vim/plugged')
+Plug 'dart-lang/dart-vim-plugin'
+Plug 'natebosch/vim-lsc'
+call plug#end()
+```
+
+Note: Other LSP plugins are available for Vim but this document assumes vim-lsc.
+
+
+## Configure vim-lsc
+
+Next tell vim-lsc how to invoke the LSP server. You’ll need the path to the Dart
+SDK (which may be inside the Flutter SDK at bin/cache/dart-sdk for Flutter) and
+add this to `.vimrc` and reload.
+
+```
+let g:lsc_server_commands = {'dart': '~/dart-sdk/bin/dart ~/dart-sdk/bin/snapshots/analysis_server.dart.snapshot --lsp'}
+let g:lsc_auto_map = v:true " Use defaults
+```
+
+This will set up the LSP server for Dart files using default keybindings. More
+info on configuring vim-lsc can be found at
+[natebosch/vim-lsc#configuration](https://github.com/natebosch/vim-lsc#configuration).
+
+
+## Test the Plugins
+
+Open a Dart file in Vim and confirm that you see syntax highlighting (this is
+provided by dart-vim-plugin) and that invalid code is highlighted (this is
+provided by the LSP server via vim-lsc), with the error showing along the bottom
+of the window.
+
+
+## Keybindings and Commands
+
+Keybindings and commands are documented in the
+[vim-lsc README](https://github.com/natebosch/vim-lsc#configuration).
+
+
+## Supported Features
+
+Available features are those supported by both the vim-lsc plugin
+([see here](https://github.com/natebosch/vim-lsc#features)) and the Dart LSP
+server ([see here](https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/tool/lsp_spec/README.md#message-status)).
+
+
+## Troubleshooting
+
+If you find an issue with the LSP server you can enable logging in the server by
+adding the following switches to the LSP server command in `.vimrc`:
+
+```
+--instrumentation-log-file /path/to/logs/lsp-vim.txt
+```
+
+Issues should be opened in the [dart-lang/sdk](https://github.com/dart-lang/sdk)
+repository.
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index 839da75..2967651 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -21,10 +21,17 @@
 /// in the spec (it's important the server doesn't crash on deserialising
 /// newer values).
 bool enumClassAllowsAnyValue(String name) {
-  // TODO(dantup): This should return true by default, and allow opt-out for
-  // those things we know are not supported. This behaviour matches the old
-  // code in order to simplify diffs while migrating.
-  return name == 'ErrorCodes' || name == 'CodeActionKind' || name == 'Method';
+  // The types listed here are the ones that have a guaranteed restricted type
+  // in the LSP spec, for example:
+  //
+  //   export type CompletionTriggerKind = 1 | 2 | 3;
+  //
+  // The other enum types use string/number/etc. in the referencing classes.
+  return name != 'CompletionTriggerKind' &&
+      name != 'FailureHandlingKind' &&
+      name != 'InsertTextFormat' &&
+      name != 'MarkupKind' &&
+      name != 'ResourceOperationKind';
 }
 
 String generateDartForTypes(List<AstNode> types) {
@@ -157,11 +164,21 @@
     ..writeIndented('return obj is Map<String, dynamic>');
   // In order to consider this valid for parsing, all fields that may not be
   // undefined must be present and also type check for the correct type.
-  final requiredFields =
-      _getAllFields(interface).where((f) => !f.allowsUndefined);
-  for (var field in requiredFields) {
-    buffer.write(" && obj.containsKey('${field.name}') && ");
+  // Any fields that are optional but present, must still type check.
+  final fields = _getAllFields(interface);
+  for (var field in fields) {
+    if (!field.allowsUndefined) {
+      buffer.write(" && obj.containsKey('${field.name}') && ");
+    } else {
+      buffer.write(" && ");
+    }
+    if (field.allowsNull || field.allowsUndefined) {
+      buffer.write("(obj['${field.name}'] == null || ");
+    }
     _writeTypeCheckCondition(buffer, "obj['${field.name}']", field.type);
+    if (field.allowsNull || field.allowsUndefined) {
+      buffer.write(")");
+    }
   }
   buffer
     ..writeln(';')
@@ -206,6 +223,15 @@
   }
 }
 
+void _writeJsonHandler(IndentableStringBuffer buffer, Interface interface) {
+  buffer
+    ..writeIndented('static const jsonHandler = ')
+    ..write('const LspJsonHandler(')
+    ..write('${interface.name}.canParse, ${interface.name}.fromJson')
+    ..writeln(');')
+    ..writeln();
+}
+
 void _writeDocCommentsAndAnnotations(
     IndentableStringBuffer buffer, AstNode node) {
   var comment = node.commentText?.trim();
@@ -241,7 +267,7 @@
     ..indent();
   if (allowsAnyValue) {
     buffer.writeIndentedln('return ');
-    _writeTypeCheckCondition(buffer, 'obj', consts.first.type);
+    _writeTypeCheckCondition(buffer, 'obj', typeOfValues);
     buffer.writeln(';');
   } else {
     buffer
@@ -414,7 +440,7 @@
   for (final subclassName in _subtypes[interface.name] ?? const <String>[]) {
     final subclass = _interfaces[subclassName];
     buffer
-      ..writeIndentedln('if (${subclass.nameWithTypeArgs}.canParse(json)) {')
+      ..writeIndentedln('if (${subclass.name}.canParse(json)) {')
       ..indent()
       ..writeln('return ${subclass.nameWithTypeArgs}.fromJson(json);')
       ..outdent()
@@ -439,13 +465,13 @@
     ..writeIndentedln('@override')
     ..writeIndentedln('int get hashCode {')
     ..indent()
-    ..writeIndented('int hash = 0;');
+    ..writeIndentedln('int hash = 0;');
   for (var field in _getAllFields(interface)) {
-    buffer
-        .write('hash = JenkinsSmiHash.combine(hash, ${field.name}.hashCode);');
+    buffer.writeIndentedln(
+        'hash = JenkinsSmiHash.combine(hash, ${field.name}.hashCode);');
   }
   buffer
-    ..writeln('return JenkinsSmiHash.finish(hash);')
+    ..writeIndentedln('return JenkinsSmiHash.finish(hash);')
     ..outdent()
     ..writeIndentedln('}');
 }
@@ -464,6 +490,7 @@
   buffer
     ..writeln('{')
     ..indent();
+  _writeJsonHandler(buffer, interface);
   _writeConstructor(buffer, interface);
   _writeFromJsonConstructor(buffer, interface);
   // Handle Consts and Fields separately, since we need to include superclass
@@ -596,18 +623,19 @@
 
 void _writeTypeCheckCondition(
     IndentableStringBuffer buffer, String valueCode, TypeBase type) {
-  type = resolveTypeAlias(type, resolveEnumClasses: true);
+  type = resolveTypeAlias(type);
 
-  final resolvedDartType = type.dartTypeWithTypeArgs;
-  if (resolvedDartType == 'dynamic') {
+  final dartType = type.dartType;
+  final fullDartType = type.dartTypeWithTypeArgs;
+  if (fullDartType == 'dynamic') {
     buffer.write('true');
   } else if (_isSimpleType(type)) {
-    buffer.write('$valueCode is $resolvedDartType');
+    buffer.write('$valueCode is $fullDartType');
   } else if (_isSpecType(type)) {
-    buffer.write('$resolvedDartType.canParse($valueCode)');
+    buffer.write('$dartType.canParse($valueCode)');
   } else if (type is ArrayType) {
     buffer.write('($valueCode is List');
-    if (resolvedDartType != 'dynamic') {
+    if (fullDartType != 'dynamic') {
       // TODO(dantup): If we're happy to assume we never have two lists in a union
       // we could skip this bit.
       buffer.write(' && ($valueCode.every((item) => ');
@@ -617,8 +645,8 @@
     buffer.write(')');
   } else if (type is MapType) {
     buffer.write('($valueCode is Map');
-    if (resolvedDartType != 'dynamic') {
-      buffer..write(' && ((')..write('$valueCode.keys.every((item) => ');
+    if (fullDartType != 'dynamic') {
+      buffer..write(' && (')..write('$valueCode.keys.every((item) => ');
       _writeTypeCheckCondition(buffer, 'item', type.indexType);
       buffer..write('&& $valueCode.values.every((item) => ');
       _writeTypeCheckCondition(buffer, 'item', type.valueType);
@@ -636,7 +664,7 @@
     }
     buffer.write(')');
   } else {
-    throw 'Unable to type check $valueCode against $resolvedDartType';
+    throw 'Unable to type check $valueCode against $fullDartType';
   }
 }
 
diff --git a/pkg/analysis_server/tool/spec/codegen_java.dart b/pkg/analysis_server/tool/spec/codegen_java.dart
index 56bdc8b..6204f68 100644
--- a/pkg/analysis_server/tool/spec/codegen_java.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java.dart
@@ -51,6 +51,7 @@
   static const Map<String, String> _typeRenames = const {
     'bool': 'boolean',
     'int': 'int',
+    'AvailableSuggestionRelevanceTag': 'String',
     'ExecutionContextId': 'String',
     'FilePath': 'String',
     'DebugContextId': 'String',
diff --git a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
index 895f4f4..1ad467a 100644
--- a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
+++ b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
@@ -417,6 +417,16 @@
   public void completion_getSuggestions(String file, int offset, GetSuggestionsConsumer consumer);
 
   /**
+   * {@code completion.listTokenDetails}
+   *
+   * Inspect analysis server's knowledge about all of a file's tokens including their lexeme, type,
+   * and what element kinds would have been appropriate for the token's program location.
+   *
+   * @param file The path to the file from which tokens should be returned.
+   */
+  public void completion_listTokenDetails(String file, ListTokenDetailsConsumer consumer);
+
+  /**
    * {@code completion.registerLibraryPaths}
    *
    * The client can make this request to express interest in certain libraries to receive completion
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/AvailableSuggestion.java b/pkg/analysis_server/tool/spec/generated/java/types/AvailableSuggestion.java
index a25dd89..d7fc466 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/AvailableSuggestion.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/AvailableSuggestion.java
@@ -47,6 +47,20 @@
   private final Element element;
 
   /**
+   * A default String for use in generating argument list source contents on the client side.
+   */
+  private final String defaultArgumentListString;
+
+  /**
+   * Pairs of offsets and lengths describing 'defaultArgumentListString' text ranges suitable for use
+   * by clients to set up linked edits of default argument source contents. For example, given an
+   * argument list string 'x, y', the corresponding text range [0, 1, 3, 1], indicates two text
+   * ranges of length 1, starting at offsets 0 and 3. Clients can use these ranges to treat the 'x'
+   * and 'y' values specially for linked edits.
+   */
+  private final int[] defaultArgumentListTextRanges;
+
+  /**
    * The Dartdoc associated with the element being suggested. This field is omitted if there is no
    * Dartdoc associated with the element.
    */
@@ -75,16 +89,18 @@
    * This field is set if the relevance of this suggestion might be changed depending on where
    * completion is requested.
    */
-  private final List<AvailableSuggestionRelevanceTag> relevanceTags;
+  private final List<String> relevanceTags;
 
   private final Integer requiredParameterCount;
 
   /**
    * Constructor for {@link AvailableSuggestion}.
    */
-  public AvailableSuggestion(String label, Element element, String docComplete, String docSummary, List<String> parameterNames, List<String> parameterTypes, List<AvailableSuggestionRelevanceTag> relevanceTags, Integer requiredParameterCount) {
+  public AvailableSuggestion(String label, Element element, String defaultArgumentListString, int[] defaultArgumentListTextRanges, String docComplete, String docSummary, List<String> parameterNames, List<String> parameterTypes, List<String> relevanceTags, Integer requiredParameterCount) {
     this.label = label;
     this.element = element;
+    this.defaultArgumentListString = defaultArgumentListString;
+    this.defaultArgumentListTextRanges = defaultArgumentListTextRanges;
     this.docComplete = docComplete;
     this.docSummary = docSummary;
     this.parameterNames = parameterNames;
@@ -100,6 +116,8 @@
       return
         ObjectUtilities.equals(other.label, label) &&
         ObjectUtilities.equals(other.element, element) &&
+        ObjectUtilities.equals(other.defaultArgumentListString, defaultArgumentListString) &&
+        Arrays.equals(other.defaultArgumentListTextRanges, defaultArgumentListTextRanges) &&
         ObjectUtilities.equals(other.docComplete, docComplete) &&
         ObjectUtilities.equals(other.docSummary, docSummary) &&
         ObjectUtilities.equals(other.parameterNames, parameterNames) &&
@@ -113,13 +131,15 @@
   public static AvailableSuggestion fromJson(JsonObject jsonObject) {
     String label = jsonObject.get("label").getAsString();
     Element element = Element.fromJson(jsonObject.get("element").getAsJsonObject());
+    String defaultArgumentListString = jsonObject.get("defaultArgumentListString") == null ? null : jsonObject.get("defaultArgumentListString").getAsString();
+    int[] defaultArgumentListTextRanges = jsonObject.get("defaultArgumentListTextRanges") == null ? null : JsonUtilities.decodeIntArray(jsonObject.get("defaultArgumentListTextRanges").getAsJsonArray());
     String docComplete = jsonObject.get("docComplete") == null ? null : jsonObject.get("docComplete").getAsString();
     String docSummary = jsonObject.get("docSummary") == null ? null : jsonObject.get("docSummary").getAsString();
     List<String> parameterNames = jsonObject.get("parameterNames") == null ? null : JsonUtilities.decodeStringList(jsonObject.get("parameterNames").getAsJsonArray());
     List<String> parameterTypes = jsonObject.get("parameterTypes") == null ? null : JsonUtilities.decodeStringList(jsonObject.get("parameterTypes").getAsJsonArray());
-    List<AvailableSuggestionRelevanceTag> relevanceTags = jsonObject.get("relevanceTags") == null ? null : AvailableSuggestionRelevanceTag.fromJsonArray(jsonObject.get("relevanceTags").getAsJsonArray());
+    List<String> relevanceTags = jsonObject.get("relevanceTags") == null ? null : JsonUtilities.decodeStringList(jsonObject.get("relevanceTags").getAsJsonArray());
     Integer requiredParameterCount = jsonObject.get("requiredParameterCount") == null ? null : jsonObject.get("requiredParameterCount").getAsInt();
-    return new AvailableSuggestion(label, element, docComplete, docSummary, parameterNames, parameterTypes, relevanceTags, requiredParameterCount);
+    return new AvailableSuggestion(label, element, defaultArgumentListString, defaultArgumentListTextRanges, docComplete, docSummary, parameterNames, parameterTypes, relevanceTags, requiredParameterCount);
   }
 
   public static List<AvailableSuggestion> fromJsonArray(JsonArray jsonArray) {
@@ -135,6 +155,24 @@
   }
 
   /**
+   * A default String for use in generating argument list source contents on the client side.
+   */
+  public String getDefaultArgumentListString() {
+    return defaultArgumentListString;
+  }
+
+  /**
+   * Pairs of offsets and lengths describing 'defaultArgumentListString' text ranges suitable for use
+   * by clients to set up linked edits of default argument source contents. For example, given an
+   * argument list string 'x, y', the corresponding text range [0, 1, 3, 1], indicates two text
+   * ranges of length 1, starting at offsets 0 and 3. Clients can use these ranges to treat the 'x'
+   * and 'y' values specially for linked edits.
+   */
+  public int[] getDefaultArgumentListTextRanges() {
+    return defaultArgumentListTextRanges;
+  }
+
+  /**
    * The Dartdoc associated with the element being suggested. This field is omitted if there is no
    * Dartdoc associated with the element.
    */
@@ -185,7 +223,7 @@
    * This field is set if the relevance of this suggestion might be changed depending on where
    * completion is requested.
    */
-  public List<AvailableSuggestionRelevanceTag> getRelevanceTags() {
+  public List<String> getRelevanceTags() {
     return relevanceTags;
   }
 
@@ -198,6 +236,8 @@
     HashCodeBuilder builder = new HashCodeBuilder();
     builder.append(label);
     builder.append(element);
+    builder.append(defaultArgumentListString);
+    builder.append(defaultArgumentListTextRanges);
     builder.append(docComplete);
     builder.append(docSummary);
     builder.append(parameterNames);
@@ -211,6 +251,16 @@
     JsonObject jsonObject = new JsonObject();
     jsonObject.addProperty("label", label);
     jsonObject.add("element", element.toJson());
+    if (defaultArgumentListString != null) {
+      jsonObject.addProperty("defaultArgumentListString", defaultArgumentListString);
+    }
+    if (defaultArgumentListTextRanges != null) {
+      JsonArray jsonArrayDefaultArgumentListTextRanges = new JsonArray();
+      for (int elt : defaultArgumentListTextRanges) {
+        jsonArrayDefaultArgumentListTextRanges.add(new JsonPrimitive(elt));
+      }
+      jsonObject.add("defaultArgumentListTextRanges", jsonArrayDefaultArgumentListTextRanges);
+    }
     if (docComplete != null) {
       jsonObject.addProperty("docComplete", docComplete);
     }
@@ -233,8 +283,8 @@
     }
     if (relevanceTags != null) {
       JsonArray jsonArrayRelevanceTags = new JsonArray();
-      for (AvailableSuggestionRelevanceTag elt : relevanceTags) {
-        jsonArrayRelevanceTags.add(elt.toJson());
+      for (String elt : relevanceTags) {
+        jsonArrayRelevanceTags.add(new JsonPrimitive(elt));
       }
       jsonObject.add("relevanceTags", jsonArrayRelevanceTags);
     }
@@ -252,6 +302,10 @@
     builder.append(label + ", ");
     builder.append("element=");
     builder.append(element + ", ");
+    builder.append("defaultArgumentListString=");
+    builder.append(defaultArgumentListString + ", ");
+    builder.append("defaultArgumentListTextRanges=");
+    builder.append(StringUtils.join(defaultArgumentListTextRanges, ", ") + ", ");
     builder.append("docComplete=");
     builder.append(docComplete + ", ");
     builder.append("docSummary=");
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java b/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java
index 83f2643..8b87048 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java
@@ -60,12 +60,6 @@
   private final String displayText;
 
   /**
-   * The URI of the element corresponding to this suggestion. It will be set whenever analysis server
-   * is able to compute it.
-   */
-  private final String elementUri;
-
-  /**
    * The offset, relative to the beginning of the completion, of where the selection should be placed
    * after insertion.
    */
@@ -167,20 +161,13 @@
   private final String parameterType;
 
   /**
-   * The import to be added if the suggestion is out of scope and needs an import to be added to be
-   * in scope.
-   */
-  private final String importUri;
-
-  /**
    * Constructor for {@link CompletionSuggestion}.
    */
-  public CompletionSuggestion(String kind, int relevance, String completion, String displayText, String elementUri, int selectionOffset, int selectionLength, boolean isDeprecated, boolean isPotential, String docSummary, String docComplete, String declaringType, String defaultArgumentListString, int[] defaultArgumentListTextRanges, Element element, String returnType, List<String> parameterNames, List<String> parameterTypes, Integer requiredParameterCount, Boolean hasNamedParameters, String parameterName, String parameterType, String importUri) {
+  public CompletionSuggestion(String kind, int relevance, String completion, String displayText, int selectionOffset, int selectionLength, boolean isDeprecated, boolean isPotential, String docSummary, String docComplete, String declaringType, String defaultArgumentListString, int[] defaultArgumentListTextRanges, Element element, String returnType, List<String> parameterNames, List<String> parameterTypes, Integer requiredParameterCount, Boolean hasNamedParameters, String parameterName, String parameterType) {
     this.kind = kind;
     this.relevance = relevance;
     this.completion = completion;
     this.displayText = displayText;
-    this.elementUri = elementUri;
     this.selectionOffset = selectionOffset;
     this.selectionLength = selectionLength;
     this.isDeprecated = isDeprecated;
@@ -198,7 +185,6 @@
     this.hasNamedParameters = hasNamedParameters;
     this.parameterName = parameterName;
     this.parameterType = parameterType;
-    this.importUri = importUri;
   }
 
   @Override
@@ -210,7 +196,6 @@
         other.relevance == relevance &&
         ObjectUtilities.equals(other.completion, completion) &&
         ObjectUtilities.equals(other.displayText, displayText) &&
-        ObjectUtilities.equals(other.elementUri, elementUri) &&
         other.selectionOffset == selectionOffset &&
         other.selectionLength == selectionLength &&
         other.isDeprecated == isDeprecated &&
@@ -227,8 +212,7 @@
         ObjectUtilities.equals(other.requiredParameterCount, requiredParameterCount) &&
         ObjectUtilities.equals(other.hasNamedParameters, hasNamedParameters) &&
         ObjectUtilities.equals(other.parameterName, parameterName) &&
-        ObjectUtilities.equals(other.parameterType, parameterType) &&
-        ObjectUtilities.equals(other.importUri, importUri);
+        ObjectUtilities.equals(other.parameterType, parameterType);
     }
     return false;
   }
@@ -238,7 +222,6 @@
     int relevance = jsonObject.get("relevance").getAsInt();
     String completion = jsonObject.get("completion").getAsString();
     String displayText = jsonObject.get("displayText") == null ? null : jsonObject.get("displayText").getAsString();
-    String elementUri = jsonObject.get("elementUri") == null ? null : jsonObject.get("elementUri").getAsString();
     int selectionOffset = jsonObject.get("selectionOffset").getAsInt();
     int selectionLength = jsonObject.get("selectionLength").getAsInt();
     boolean isDeprecated = jsonObject.get("isDeprecated").getAsBoolean();
@@ -256,8 +239,7 @@
     Boolean hasNamedParameters = jsonObject.get("hasNamedParameters") == null ? null : jsonObject.get("hasNamedParameters").getAsBoolean();
     String parameterName = jsonObject.get("parameterName") == null ? null : jsonObject.get("parameterName").getAsString();
     String parameterType = jsonObject.get("parameterType") == null ? null : jsonObject.get("parameterType").getAsString();
-    String importUri = jsonObject.get("importUri") == null ? null : jsonObject.get("importUri").getAsString();
-    return new CompletionSuggestion(kind, relevance, completion, displayText, elementUri, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary, docComplete, declaringType, defaultArgumentListString, defaultArgumentListTextRanges, element, returnType, parameterNames, parameterTypes, requiredParameterCount, hasNamedParameters, parameterName, parameterType, importUri);
+    return new CompletionSuggestion(kind, relevance, completion, displayText, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary, docComplete, declaringType, defaultArgumentListString, defaultArgumentListTextRanges, element, returnType, parameterNames, parameterTypes, requiredParameterCount, hasNamedParameters, parameterName, parameterType);
   }
 
   public static List<CompletionSuggestion> fromJsonArray(JsonArray jsonArray) {
@@ -339,14 +321,6 @@
   }
 
   /**
-   * The URI of the element corresponding to this suggestion. It will be set whenever analysis server
-   * is able to compute it.
-   */
-  public String getElementUri() {
-    return elementUri;
-  }
-
-  /**
    * True if the function or method being suggested has at least one named parameter. This field is
    * omitted if the parameterNames field is omitted.
    */
@@ -355,14 +329,6 @@
   }
 
   /**
-   * The import to be added if the suggestion is out of scope and needs an import to be added to be
-   * in scope.
-   */
-  public String getImportUri() {
-    return importUri;
-  }
-
-  /**
    * True if the suggested element is deprecated.
    */
   public boolean isDeprecated() {
@@ -461,7 +427,6 @@
     builder.append(relevance);
     builder.append(completion);
     builder.append(displayText);
-    builder.append(elementUri);
     builder.append(selectionOffset);
     builder.append(selectionLength);
     builder.append(isDeprecated);
@@ -479,7 +444,6 @@
     builder.append(hasNamedParameters);
     builder.append(parameterName);
     builder.append(parameterType);
-    builder.append(importUri);
     return builder.toHashCode();
   }
 
@@ -491,9 +455,6 @@
     if (displayText != null) {
       jsonObject.addProperty("displayText", displayText);
     }
-    if (elementUri != null) {
-      jsonObject.addProperty("elementUri", elementUri);
-    }
     jsonObject.addProperty("selectionOffset", selectionOffset);
     jsonObject.addProperty("selectionLength", selectionLength);
     jsonObject.addProperty("isDeprecated", isDeprecated);
@@ -549,9 +510,6 @@
     if (parameterType != null) {
       jsonObject.addProperty("parameterType", parameterType);
     }
-    if (importUri != null) {
-      jsonObject.addProperty("importUri", importUri);
-    }
     return jsonObject;
   }
 
@@ -567,8 +525,6 @@
     builder.append(completion + ", ");
     builder.append("displayText=");
     builder.append(displayText + ", ");
-    builder.append("elementUri=");
-    builder.append(elementUri + ", ");
     builder.append("selectionOffset=");
     builder.append(selectionOffset + ", ");
     builder.append("selectionLength=");
@@ -602,9 +558,7 @@
     builder.append("parameterName=");
     builder.append(parameterName + ", ");
     builder.append("parameterType=");
-    builder.append(parameterType + ", ");
-    builder.append("importUri=");
-    builder.append(importUri);
+    builder.append(parameterType);
     builder.append("]");
     return builder.toString();
   }
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionRelevanceTag.java b/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionRelevanceTag.java
index d079df2..0db15bd 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionRelevanceTag.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionRelevanceTag.java
@@ -40,7 +40,7 @@
   /**
    * The opaque value of the tag.
    */
-  private final AvailableSuggestionRelevanceTag tag;
+  private final String tag;
 
   /**
    * The boost to the relevance of the completion suggestions that match this tag, which is added to
@@ -51,7 +51,7 @@
   /**
    * Constructor for {@link IncludedSuggestionRelevanceTag}.
    */
-  public IncludedSuggestionRelevanceTag(AvailableSuggestionRelevanceTag tag, int relevanceBoost) {
+  public IncludedSuggestionRelevanceTag(String tag, int relevanceBoost) {
     this.tag = tag;
     this.relevanceBoost = relevanceBoost;
   }
@@ -68,7 +68,7 @@
   }
 
   public static IncludedSuggestionRelevanceTag fromJson(JsonObject jsonObject) {
-    AvailableSuggestionRelevanceTag tag = AvailableSuggestionRelevanceTag.fromJson(jsonObject.get("tag").getAsJsonObject());
+    String tag = jsonObject.get("tag").getAsString();
     int relevanceBoost = jsonObject.get("relevanceBoost").getAsInt();
     return new IncludedSuggestionRelevanceTag(tag, relevanceBoost);
   }
@@ -96,7 +96,7 @@
   /**
    * The opaque value of the tag.
    */
-  public AvailableSuggestionRelevanceTag getTag() {
+  public String getTag() {
     return tag;
   }
 
@@ -110,7 +110,7 @@
 
   public JsonObject toJson() {
     JsonObject jsonObject = new JsonObject();
-    jsonObject.add("tag", tag.toJson());
+    jsonObject.addProperty("tag", tag);
     jsonObject.addProperty("relevanceBoost", relevanceBoost);
     return jsonObject;
   }
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionSet.java b/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionSet.java
index 344ac5b..808e465 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionSet.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionSet.java
@@ -48,11 +48,22 @@
   private final int relevance;
 
   /**
+   * The optional string that should be displayed instead of the uri of the referenced
+   * AvailableSuggestionSet.
+   *
+   * For example libraries in the "test" directory of a package have only "file://" URIs, so are
+   * usually long, and don't look nice, but actual import directives will use relative URIs, which
+   * are short, so we probably want to display such relative URIs to the user.
+   */
+  private final String displayUri;
+
+  /**
    * Constructor for {@link IncludedSuggestionSet}.
    */
-  public IncludedSuggestionSet(int id, int relevance) {
+  public IncludedSuggestionSet(int id, int relevance, String displayUri) {
     this.id = id;
     this.relevance = relevance;
+    this.displayUri = displayUri;
   }
 
   @Override
@@ -61,7 +72,8 @@
       IncludedSuggestionSet other = (IncludedSuggestionSet) obj;
       return
         other.id == id &&
-        other.relevance == relevance;
+        other.relevance == relevance &&
+        ObjectUtilities.equals(other.displayUri, displayUri);
     }
     return false;
   }
@@ -69,7 +81,8 @@
   public static IncludedSuggestionSet fromJson(JsonObject jsonObject) {
     int id = jsonObject.get("id").getAsInt();
     int relevance = jsonObject.get("relevance").getAsInt();
-    return new IncludedSuggestionSet(id, relevance);
+    String displayUri = jsonObject.get("displayUri") == null ? null : jsonObject.get("displayUri").getAsString();
+    return new IncludedSuggestionSet(id, relevance, displayUri);
   }
 
   public static List<IncludedSuggestionSet> fromJsonArray(JsonArray jsonArray) {
@@ -85,6 +98,18 @@
   }
 
   /**
+   * The optional string that should be displayed instead of the uri of the referenced
+   * AvailableSuggestionSet.
+   *
+   * For example libraries in the "test" directory of a package have only "file://" URIs, so are
+   * usually long, and don't look nice, but actual import directives will use relative URIs, which
+   * are short, so we probably want to display such relative URIs to the user.
+   */
+  public String getDisplayUri() {
+    return displayUri;
+  }
+
+  /**
    * Clients should use it to access the set of precomputed completions to be displayed to the user.
    */
   public int getId() {
@@ -104,6 +129,7 @@
     HashCodeBuilder builder = new HashCodeBuilder();
     builder.append(id);
     builder.append(relevance);
+    builder.append(displayUri);
     return builder.toHashCode();
   }
 
@@ -111,6 +137,9 @@
     JsonObject jsonObject = new JsonObject();
     jsonObject.addProperty("id", id);
     jsonObject.addProperty("relevance", relevance);
+    if (displayUri != null) {
+      jsonObject.addProperty("displayUri", displayUri);
+    }
     return jsonObject;
   }
 
@@ -121,7 +150,9 @@
     builder.append("id=");
     builder.append(id + ", ");
     builder.append("relevance=");
-    builder.append(relevance);
+    builder.append(relevance + ", ");
+    builder.append("displayUri=");
+    builder.append(displayUri);
     builder.append("]");
     return builder.toString();
   }
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/TokenDetails.java b/pkg/analysis_server/tool/spec/generated/java/types/TokenDetails.java
new file mode 100644
index 0000000..6a27a41
--- /dev/null
+++ b/pkg/analysis_server/tool/spec/generated/java/types/TokenDetails.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * for details. All rights reserved. Use of this source code is governed by a
+ * BSD-style license that can be found in the LICENSE file.
+ *
+ * This file has been automatically generated. Please do not edit it manually.
+ * To regenerate the file, use the script "pkg/analysis_server/tool/spec/generate_files".
+ */
+package org.dartlang.analysis.server.protocol;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import com.google.common.collect.Lists;
+import com.google.dart.server.utilities.general.JsonUtilities;
+import com.google.dart.server.utilities.general.ObjectUtilities;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import java.util.ArrayList;
+import java.util.Iterator;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * A scanned token along with its inferred type information.
+ *
+ * @coverage dart.server.generated.types
+ */
+@SuppressWarnings("unused")
+public class TokenDetails {
+
+  public static final TokenDetails[] EMPTY_ARRAY = new TokenDetails[0];
+
+  public static final List<TokenDetails> EMPTY_LIST = Lists.newArrayList();
+
+  /**
+   * The raw token text.
+   */
+  private final String lexeme;
+
+  /**
+   * The type of this token.
+   */
+  private final String type;
+
+  /**
+   * The kinds of elements which could validly replace this token.
+   */
+  private final List<String> validElementKinds;
+
+  /**
+   * Constructor for {@link TokenDetails}.
+   */
+  public TokenDetails(String lexeme, String type, List<String> validElementKinds) {
+    this.lexeme = lexeme;
+    this.type = type;
+    this.validElementKinds = validElementKinds;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof TokenDetails) {
+      TokenDetails other = (TokenDetails) obj;
+      return
+        ObjectUtilities.equals(other.lexeme, lexeme) &&
+        ObjectUtilities.equals(other.type, type) &&
+        ObjectUtilities.equals(other.validElementKinds, validElementKinds);
+    }
+    return false;
+  }
+
+  public static TokenDetails fromJson(JsonObject jsonObject) {
+    String lexeme = jsonObject.get("lexeme").getAsString();
+    String type = jsonObject.get("type").getAsString();
+    List<String> validElementKinds = JsonUtilities.decodeStringList(jsonObject.get("validElementKinds").getAsJsonArray());
+    return new TokenDetails(lexeme, type, validElementKinds);
+  }
+
+  public static List<TokenDetails> fromJsonArray(JsonArray jsonArray) {
+    if (jsonArray == null) {
+      return EMPTY_LIST;
+    }
+    ArrayList<TokenDetails> list = new ArrayList<TokenDetails>(jsonArray.size());
+    Iterator<JsonElement> iterator = jsonArray.iterator();
+    while (iterator.hasNext()) {
+      list.add(fromJson(iterator.next().getAsJsonObject()));
+    }
+    return list;
+  }
+
+  /**
+   * The raw token text.
+   */
+  public String getLexeme() {
+    return lexeme;
+  }
+
+  /**
+   * The type of this token.
+   */
+  public String getType() {
+    return type;
+  }
+
+  /**
+   * The kinds of elements which could validly replace this token.
+   */
+  public List<String> getValidElementKinds() {
+    return validElementKinds;
+  }
+
+  @Override
+  public int hashCode() {
+    HashCodeBuilder builder = new HashCodeBuilder();
+    builder.append(lexeme);
+    builder.append(type);
+    builder.append(validElementKinds);
+    return builder.toHashCode();
+  }
+
+  public JsonObject toJson() {
+    JsonObject jsonObject = new JsonObject();
+    jsonObject.addProperty("lexeme", lexeme);
+    jsonObject.addProperty("type", type);
+    JsonArray jsonArrayValidElementKinds = new JsonArray();
+    for (String elt : validElementKinds) {
+      jsonArrayValidElementKinds.add(new JsonPrimitive(elt));
+    }
+    jsonObject.add("validElementKinds", jsonArrayValidElementKinds);
+    return jsonObject;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder builder = new StringBuilder();
+    builder.append("[");
+    builder.append("lexeme=");
+    builder.append(lexeme + ", ");
+    builder.append("type=");
+    builder.append(type + ", ");
+    builder.append("validElementKinds=");
+    builder.append(StringUtils.join(validElementKinds, ", "));
+    builder.append("]");
+    return builder.toString();
+  }
+
+}
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index fd11715..9948e9c 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -7,7 +7,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  <version>1.23.0</version>
+  <version>1.25.0</version>
 </h1>
 <p>
   This document contains a specification of the API provided by the
@@ -1412,7 +1412,7 @@
       </field>
     </result>
   </request>
-  <request method="setSubscriptions" experimental="true">
+  <request method="setSubscriptions">
     <p>
       Subscribe for completion services. All previous subscriptions are
       replaced by the given set of services.
@@ -1431,7 +1431,7 @@
       </field>
     </params>
   </request>
-  <request method="registerLibraryPaths" experimental="true">
+  <request method="registerLibraryPaths">
     <p>
       The client can make this request to express interest in certain
       libraries to receive completion suggestions from based on the client path.
@@ -1454,7 +1454,7 @@
       </field>
     </params>
   </request>
-  <request method="getSuggestionDetails" experimental="true">
+  <request method="getSuggestionDetails">
     <p>
       Clients must make this request when the user has selected a completion
       suggestion from an <tt>AvailableSuggestionSet</tt>. Analysis server will respond with
@@ -1508,6 +1508,32 @@
       </field>
     </result>
   </request>
+  <request method="listTokenDetails" experimental="true">
+    <p>
+      Inspect analysis server's knowledge about all of a file's tokens including
+      their lexeme, type, and what element kinds would have been appropriate for
+      the token's program location.
+    </p>
+    <params>
+      <field name="file">
+        <ref>FilePath</ref>
+        <p>
+          The path to the file from which tokens should be returned.
+        </p>
+      </field>
+    </params>
+    <result>
+      <field name="tokens">
+        <list>
+          <ref>TokenDetails</ref>
+        </list>
+        <p>
+          A list of the file's scanned tokens including analysis information
+          about them.
+        </p>
+      </field>
+    </result>
+  </request>
   <notification event="results">
     <p>
       Reports the completion suggestions that should be presented
@@ -1567,22 +1593,16 @@
           <ref>IncludedSuggestionSet</ref>
         </list>
         <p>
-          This field is experimental.
-        </p>
-        <p>
           References to <tt>AvailableSuggestionSet</tt> objects previously sent
           to the client. The client can include applicable names from the
           referenced library in code completion suggestions.
         </p>
       </field>
-      <field name="includedSuggestionKinds" optional="true">
+      <field name="includedElementKinds" optional="true">
         <list>
           <ref>ElementKind</ref>
         </list>
         <p>
-          This field is experimental.
-        </p>
-        <p>
           The client is expected to check this list against the
           <tt>ElementKind</tt> sent in <tt>IncludedSuggestionSet</tt> to decide
           whether or not these symbols should should be presented to the user.
@@ -1593,9 +1613,6 @@
           <ref>IncludedSuggestionRelevanceTag</ref>
         </list>
         <p>
-          This field is experimental.
-        </p>
-        <p>
           The client is expected to check this list against the values of the
           field <tt>relevanceTags</tt> of <tt>AvailableSuggestion</tt> to
           decide if the suggestion should be given a different relevance than
@@ -1611,7 +1628,7 @@
       </field>
     </params>
   </notification>
-  <notification event="availableSuggestions" experimental="true">
+  <notification event="availableSuggestions">
     <p>
       Reports the pre-computed, candidate completions from symbols defined
       in a corresponding library. This notification may be sent multiple times.
@@ -3525,7 +3542,7 @@
       The identifier for a execution context.
     </p>
   </type>
-  <type name="AvailableSuggestion" experimental="true">
+  <type name="AvailableSuggestion">
     <p>
       A partial completion suggestion that can be used in combination with
       info from <tt>completion.results</tt> to build completion suggestions
@@ -3544,6 +3561,27 @@
           Information about the element reference being suggested.
         </p>
       </field>
+      <field name="defaultArgumentListString" optional="true">
+        <ref>String</ref>
+        <p>
+          A default String for use in generating argument list source contents
+          on the client side.
+        </p>
+      </field>
+      <field name="defaultArgumentListTextRanges" optional="true">
+        <list>
+          <ref>int</ref>
+        </list>
+        <p>
+          Pairs of offsets and lengths describing 'defaultArgumentListString'
+          text ranges suitable for use by clients to set up linked edits of
+          default argument source contents. For example, given an argument list
+          string 'x, y', the corresponding text range [0, 1, 3, 1], indicates
+          two text ranges of length 1, starting at offsets 0 and 3. Clients can
+          use these ranges to treat the 'x' and 'y' values specially for linked
+          edits.
+        </p>
+      </field>
       <field name="docComplete" optional="true">
         <ref>String</ref>
         <p>
@@ -3599,7 +3637,7 @@
       The opaque tag value.
     </p>
   </type>
-  <type name="AvailableSuggestionSet" experimental="true">
+  <type name="AvailableSuggestionSet">
     <object>
       <field name="id">
         <ref>int</ref>
@@ -3620,7 +3658,7 @@
       </field>
     </object>
   </type>
-  <type name="IncludedSuggestionSet" experimental="true">
+  <type name="IncludedSuggestionSet">
     <p>
       A reference to an <tt>AvailableSuggestionSet</tt> noting
       that the library's members which match the kind of this ref
@@ -3641,9 +3679,22 @@
           library where a higher number indicates a higher relevance.
         </p>
       </field>
+      <field name="displayUri" optional="true">
+        <ref>String</ref>
+        <p>
+          The optional string that should be displayed instead of the
+          <tt>uri</tt> of the referenced <tt>AvailableSuggestionSet</tt>.
+        </p>
+        <p>
+          For example libraries in the "test" directory of a package have only
+          "file://" URIs, so are usually long, and don't look nice, but actual
+          import directives will use relative URIs, which are short, so we
+          probably want to display such relative URIs to the user.
+        </p>
+      </field>
     </object>
   </type>
-  <type name="IncludedSuggestionRelevanceTag" experimental="true">
+  <type name="IncludedSuggestionRelevanceTag">
     <p>
       Each <tt>AvailableSuggestion</tt> can specify zero or more tags in the
       field <tt>relevanceTags</tt>, so that when the included tag is equal to
@@ -3667,7 +3718,7 @@
       </field>
     </object>
   </type>
-  <type name="CompletionService" experimental="true">
+  <type name="CompletionService">
     <p>
       An enumeration of the completion services to which a client can subscribe.
     </p>
@@ -3683,7 +3734,7 @@
       </value>
     </enum>
   </type>
-  <type name="LibraryPathSet" experimental="true">
+  <type name="LibraryPathSet">
     <p>
       A list of associations between paths and the libraries that should be
       included for code completion when editing a file beneath that path.
@@ -3833,6 +3884,33 @@
       <value><code>INTERFACE</code></value>
     </enum>
   </type>
+  <type name="TokenDetails" experimental="true">
+    <p>
+      A scanned token along with its inferred type information.
+    </p>
+    <object>
+      <field name="lexeme">
+        <ref>String</ref>
+        <p>
+          The raw token text.
+        </p>
+      </field>
+      <field name="type">
+        <ref>String</ref>
+        <p>
+          The type of this token.
+        </p>
+      </field>
+      <field name="validElementKinds">
+        <list>
+          <ref>ElementKind</ref>
+        </list>
+        <p>
+          The kinds of elements which could validly replace this token.
+        </p>
+      </field>
+    </object>
+  </type>
   <type name="ExecutionService">
     <p>
       An enumeration of the services provided by the execution
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
index d599adc..0125a30 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
@@ -6,7 +6,7 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
-const String PROTOCOL_VERSION = '1.23.0';
+const String PROTOCOL_VERSION = '1.25.0';
 
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES_DIRECTORIES = 'directories';
@@ -118,8 +118,8 @@
     'removedLibraries';
 const String COMPLETION_NOTIFICATION_RESULTS = 'completion.results';
 const String COMPLETION_NOTIFICATION_RESULTS_ID = 'id';
-const String COMPLETION_NOTIFICATION_RESULTS_INCLUDED_SUGGESTION_KINDS =
-    'includedSuggestionKinds';
+const String COMPLETION_NOTIFICATION_RESULTS_INCLUDED_ELEMENT_KINDS =
+    'includedElementKinds';
 const String
     COMPLETION_NOTIFICATION_RESULTS_INCLUDED_SUGGESTION_RELEVANCE_TAGS =
     'includedSuggestionRelevanceTags';
@@ -140,6 +140,9 @@
 const String COMPLETION_REQUEST_GET_SUGGESTION_DETAILS_ID = 'id';
 const String COMPLETION_REQUEST_GET_SUGGESTION_DETAILS_LABEL = 'label';
 const String COMPLETION_REQUEST_GET_SUGGESTION_DETAILS_OFFSET = 'offset';
+const String COMPLETION_REQUEST_LIST_TOKEN_DETAILS =
+    'completion.listTokenDetails';
+const String COMPLETION_REQUEST_LIST_TOKEN_DETAILS_FILE = 'file';
 const String COMPLETION_REQUEST_REGISTER_LIBRARY_PATHS =
     'completion.registerLibraryPaths';
 const String COMPLETION_REQUEST_REGISTER_LIBRARY_PATHS_PATHS = 'paths';
@@ -151,6 +154,7 @@
 const String COMPLETION_RESPONSE_GET_SUGGESTION_DETAILS_CHANGE = 'change';
 const String COMPLETION_RESPONSE_GET_SUGGESTION_DETAILS_COMPLETION =
     'completion';
+const String COMPLETION_RESPONSE_LIST_TOKEN_DETAILS_TOKENS = 'tokens';
 const String DIAGNOSTIC_REQUEST_GET_DIAGNOSTICS = 'diagnostic.getDiagnostics';
 const String DIAGNOSTIC_REQUEST_GET_SERVER_PORT = 'diagnostic.getServerPort';
 const String DIAGNOSTIC_RESPONSE_GET_DIAGNOSTICS_CONTEXTS = 'contexts';
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
index 6d464ab..04b3cdc 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
@@ -5076,6 +5076,8 @@
  * {
  *   "label": String
  *   "element": Element
+ *   "defaultArgumentListString": optional String
+ *   "defaultArgumentListTextRanges": optional List<int>
  *   "docComplete": optional String
  *   "docSummary": optional String
  *   "parameterNames": optional List<String>
@@ -5091,6 +5093,10 @@
 
   Element _element;
 
+  String _defaultArgumentListString;
+
+  List<int> _defaultArgumentListTextRanges;
+
   String _docComplete;
 
   String _docSummary;
@@ -5130,6 +5136,42 @@
   }
 
   /**
+   * A default String for use in generating argument list source contents on
+   * the client side.
+   */
+  String get defaultArgumentListString => _defaultArgumentListString;
+
+  /**
+   * A default String for use in generating argument list source contents on
+   * the client side.
+   */
+  void set defaultArgumentListString(String value) {
+    this._defaultArgumentListString = value;
+  }
+
+  /**
+   * Pairs of offsets and lengths describing 'defaultArgumentListString' text
+   * ranges suitable for use by clients to set up linked edits of default
+   * argument source contents. For example, given an argument list string 'x,
+   * y', the corresponding text range [0, 1, 3, 1], indicates two text ranges
+   * of length 1, starting at offsets 0 and 3. Clients can use these ranges to
+   * treat the 'x' and 'y' values specially for linked edits.
+   */
+  List<int> get defaultArgumentListTextRanges => _defaultArgumentListTextRanges;
+
+  /**
+   * Pairs of offsets and lengths describing 'defaultArgumentListString' text
+   * ranges suitable for use by clients to set up linked edits of default
+   * argument source contents. For example, given an argument list string 'x,
+   * y', the corresponding text range [0, 1, 3, 1], indicates two text ranges
+   * of length 1, starting at offsets 0 and 3. Clients can use these ranges to
+   * treat the 'x' and 'y' values specially for linked edits.
+   */
+  void set defaultArgumentListTextRanges(List<int> value) {
+    this._defaultArgumentListTextRanges = value;
+  }
+
+  /**
    * The Dartdoc associated with the element being suggested. This field is
    * omitted if there is no Dartdoc associated with the element.
    */
@@ -5214,7 +5256,9 @@
   }
 
   AvailableSuggestion(String label, Element element,
-      {String docComplete,
+      {String defaultArgumentListString,
+      List<int> defaultArgumentListTextRanges,
+      String docComplete,
       String docSummary,
       List<String> parameterNames,
       List<String> parameterTypes,
@@ -5222,6 +5266,8 @@
       int requiredParameterCount}) {
     this.label = label;
     this.element = element;
+    this.defaultArgumentListString = defaultArgumentListString;
+    this.defaultArgumentListTextRanges = defaultArgumentListTextRanges;
     this.docComplete = docComplete;
     this.docSummary = docSummary;
     this.parameterNames = parameterNames;
@@ -5249,6 +5295,19 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, "element");
       }
+      String defaultArgumentListString;
+      if (json.containsKey("defaultArgumentListString")) {
+        defaultArgumentListString = jsonDecoder.decodeString(
+            jsonPath + ".defaultArgumentListString",
+            json["defaultArgumentListString"]);
+      }
+      List<int> defaultArgumentListTextRanges;
+      if (json.containsKey("defaultArgumentListTextRanges")) {
+        defaultArgumentListTextRanges = jsonDecoder.decodeList(
+            jsonPath + ".defaultArgumentListTextRanges",
+            json["defaultArgumentListTextRanges"],
+            jsonDecoder.decodeInt);
+      }
       String docComplete;
       if (json.containsKey("docComplete")) {
         docComplete = jsonDecoder.decodeString(
@@ -5281,6 +5340,8 @@
             json["requiredParameterCount"]);
       }
       return new AvailableSuggestion(label, element,
+          defaultArgumentListString: defaultArgumentListString,
+          defaultArgumentListTextRanges: defaultArgumentListTextRanges,
           docComplete: docComplete,
           docSummary: docSummary,
           parameterNames: parameterNames,
@@ -5297,6 +5358,12 @@
     Map<String, dynamic> result = {};
     result["label"] = label;
     result["element"] = element.toJson();
+    if (defaultArgumentListString != null) {
+      result["defaultArgumentListString"] = defaultArgumentListString;
+    }
+    if (defaultArgumentListTextRanges != null) {
+      result["defaultArgumentListTextRanges"] = defaultArgumentListTextRanges;
+    }
     if (docComplete != null) {
       result["docComplete"] = docComplete;
     }
@@ -5326,6 +5393,9 @@
     if (other is AvailableSuggestion) {
       return label == other.label &&
           element == other.element &&
+          defaultArgumentListString == other.defaultArgumentListString &&
+          listEqual(defaultArgumentListTextRanges,
+              other.defaultArgumentListTextRanges, (int a, int b) => a == b) &&
           docComplete == other.docComplete &&
           docSummary == other.docSummary &&
           listEqual(parameterNames, other.parameterNames,
@@ -5344,6 +5414,8 @@
     int hash = 0;
     hash = JenkinsSmiHash.combine(hash, label.hashCode);
     hash = JenkinsSmiHash.combine(hash, element.hashCode);
+    hash = JenkinsSmiHash.combine(hash, defaultArgumentListString.hashCode);
+    hash = JenkinsSmiHash.combine(hash, defaultArgumentListTextRanges.hashCode);
     hash = JenkinsSmiHash.combine(hash, docComplete.hashCode);
     hash = JenkinsSmiHash.combine(hash, docSummary.hashCode);
     hash = JenkinsSmiHash.combine(hash, parameterNames.hashCode);
@@ -6211,6 +6283,184 @@
 }
 
 /**
+ * completion.listTokenDetails params
+ *
+ * {
+ *   "file": FilePath
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class CompletionListTokenDetailsParams implements RequestParams {
+  String _file;
+
+  /**
+   * The path to the file from which tokens should be returned.
+   */
+  String get file => _file;
+
+  /**
+   * The path to the file from which tokens should be returned.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
+
+  CompletionListTokenDetailsParams(String file) {
+    this.file = file;
+  }
+
+  factory CompletionListTokenDetailsParams.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder.decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "file");
+      }
+      return new CompletionListTokenDetailsParams(file);
+    } else {
+      throw jsonDecoder.mismatch(
+          jsonPath, "completion.listTokenDetails params", json);
+    }
+  }
+
+  factory CompletionListTokenDetailsParams.fromRequest(Request request) {
+    return new CompletionListTokenDetailsParams.fromJson(
+        new RequestDecoder(request), "params", request.params);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    return result;
+  }
+
+  @override
+  Request toRequest(String id) {
+    return new Request(id, "completion.listTokenDetails", toJson());
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is CompletionListTokenDetailsParams) {
+      return file == other.file;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, file.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * completion.listTokenDetails result
+ *
+ * {
+ *   "tokens": List<TokenDetails>
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class CompletionListTokenDetailsResult implements ResponseResult {
+  List<TokenDetails> _tokens;
+
+  /**
+   * A list of the file's scanned tokens including analysis information about
+   * them.
+   */
+  List<TokenDetails> get tokens => _tokens;
+
+  /**
+   * A list of the file's scanned tokens including analysis information about
+   * them.
+   */
+  void set tokens(List<TokenDetails> value) {
+    assert(value != null);
+    this._tokens = value;
+  }
+
+  CompletionListTokenDetailsResult(List<TokenDetails> tokens) {
+    this.tokens = tokens;
+  }
+
+  factory CompletionListTokenDetailsResult.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<TokenDetails> tokens;
+      if (json.containsKey("tokens")) {
+        tokens = jsonDecoder.decodeList(
+            jsonPath + ".tokens",
+            json["tokens"],
+            (String jsonPath, Object json) =>
+                new TokenDetails.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "tokens");
+      }
+      return new CompletionListTokenDetailsResult(tokens);
+    } else {
+      throw jsonDecoder.mismatch(
+          jsonPath, "completion.listTokenDetails result", json);
+    }
+  }
+
+  factory CompletionListTokenDetailsResult.fromResponse(Response response) {
+    return new CompletionListTokenDetailsResult.fromJson(
+        new ResponseDecoder(REQUEST_ID_REFACTORING_KINDS.remove(response.id)),
+        "result",
+        response.result);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["tokens"] =
+        tokens.map((TokenDetails value) => value.toJson()).toList();
+    return result;
+  }
+
+  @override
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is CompletionListTokenDetailsResult) {
+      return listEqual(
+          tokens, other.tokens, (TokenDetails a, TokenDetails b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, tokens.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
  * completion.registerLibraryPaths params
  *
  * {
@@ -6344,7 +6594,7 @@
  *   "results": List<CompletionSuggestion>
  *   "isLast": bool
  *   "includedSuggestionSets": optional List<IncludedSuggestionSet>
- *   "includedSuggestionKinds": optional List<ElementKind>
+ *   "includedElementKinds": optional List<ElementKind>
  *   "includedSuggestionRelevanceTags": optional List<IncludedSuggestionRelevanceTag>
  * }
  *
@@ -6363,7 +6613,7 @@
 
   List<IncludedSuggestionSet> _includedSuggestionSets;
 
-  List<ElementKind> _includedSuggestionKinds;
+  List<ElementKind> _includedElementKinds;
 
   List<IncludedSuggestionRelevanceTag> _includedSuggestionRelevanceTags;
 
@@ -6453,8 +6703,6 @@
   }
 
   /**
-   * This field is experimental.
-   *
    * References to AvailableSuggestionSet objects previously sent to the
    * client. The client can include applicable names from the referenced
    * library in code completion suggestions.
@@ -6463,8 +6711,6 @@
       _includedSuggestionSets;
 
   /**
-   * This field is experimental.
-   *
    * References to AvailableSuggestionSet objects previously sent to the
    * client. The client can include applicable names from the referenced
    * library in code completion suggestions.
@@ -6474,28 +6720,22 @@
   }
 
   /**
-   * This field is experimental.
-   *
    * The client is expected to check this list against the ElementKind sent in
    * IncludedSuggestionSet to decide whether or not these symbols should should
    * be presented to the user.
    */
-  List<ElementKind> get includedSuggestionKinds => _includedSuggestionKinds;
+  List<ElementKind> get includedElementKinds => _includedElementKinds;
 
   /**
-   * This field is experimental.
-   *
    * The client is expected to check this list against the ElementKind sent in
    * IncludedSuggestionSet to decide whether or not these symbols should should
    * be presented to the user.
    */
-  void set includedSuggestionKinds(List<ElementKind> value) {
-    this._includedSuggestionKinds = value;
+  void set includedElementKinds(List<ElementKind> value) {
+    this._includedElementKinds = value;
   }
 
   /**
-   * This field is experimental.
-   *
    * The client is expected to check this list against the values of the field
    * relevanceTags of AvailableSuggestion to decide if the suggestion should be
    * given a different relevance than the IncludedSuggestionSet that contains
@@ -6509,8 +6749,6 @@
       _includedSuggestionRelevanceTags;
 
   /**
-   * This field is experimental.
-   *
    * The client is expected to check this list against the values of the field
    * relevanceTags of AvailableSuggestion to decide if the suggestion should be
    * given a different relevance than the IncludedSuggestionSet that contains
@@ -6528,7 +6766,7 @@
   CompletionResultsParams(String id, int replacementOffset,
       int replacementLength, List<CompletionSuggestion> results, bool isLast,
       {List<IncludedSuggestionSet> includedSuggestionSets,
-      List<ElementKind> includedSuggestionKinds,
+      List<ElementKind> includedElementKinds,
       List<IncludedSuggestionRelevanceTag> includedSuggestionRelevanceTags}) {
     this.id = id;
     this.replacementOffset = replacementOffset;
@@ -6536,7 +6774,7 @@
     this.results = results;
     this.isLast = isLast;
     this.includedSuggestionSets = includedSuggestionSets;
-    this.includedSuggestionKinds = includedSuggestionKinds;
+    this.includedElementKinds = includedElementKinds;
     this.includedSuggestionRelevanceTags = includedSuggestionRelevanceTags;
   }
 
@@ -6591,11 +6829,11 @@
                 new IncludedSuggestionSet.fromJson(
                     jsonDecoder, jsonPath, json));
       }
-      List<ElementKind> includedSuggestionKinds;
-      if (json.containsKey("includedSuggestionKinds")) {
-        includedSuggestionKinds = jsonDecoder.decodeList(
-            jsonPath + ".includedSuggestionKinds",
-            json["includedSuggestionKinds"],
+      List<ElementKind> includedElementKinds;
+      if (json.containsKey("includedElementKinds")) {
+        includedElementKinds = jsonDecoder.decodeList(
+            jsonPath + ".includedElementKinds",
+            json["includedElementKinds"],
             (String jsonPath, Object json) =>
                 new ElementKind.fromJson(jsonDecoder, jsonPath, json));
       }
@@ -6611,7 +6849,7 @@
       return new CompletionResultsParams(
           id, replacementOffset, replacementLength, results, isLast,
           includedSuggestionSets: includedSuggestionSets,
-          includedSuggestionKinds: includedSuggestionKinds,
+          includedElementKinds: includedElementKinds,
           includedSuggestionRelevanceTags: includedSuggestionRelevanceTags);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "completion.results params", json);
@@ -6637,8 +6875,8 @@
           .map((IncludedSuggestionSet value) => value.toJson())
           .toList();
     }
-    if (includedSuggestionKinds != null) {
-      result["includedSuggestionKinds"] = includedSuggestionKinds
+    if (includedElementKinds != null) {
+      result["includedElementKinds"] = includedElementKinds
           .map((ElementKind value) => value.toJson())
           .toList();
     }
@@ -6669,7 +6907,7 @@
           isLast == other.isLast &&
           listEqual(includedSuggestionSets, other.includedSuggestionSets,
               (IncludedSuggestionSet a, IncludedSuggestionSet b) => a == b) &&
-          listEqual(includedSuggestionKinds, other.includedSuggestionKinds,
+          listEqual(includedElementKinds, other.includedElementKinds,
               (ElementKind a, ElementKind b) => a == b) &&
           listEqual(
               includedSuggestionRelevanceTags,
@@ -6690,7 +6928,7 @@
     hash = JenkinsSmiHash.combine(hash, results.hashCode);
     hash = JenkinsSmiHash.combine(hash, isLast.hashCode);
     hash = JenkinsSmiHash.combine(hash, includedSuggestionSets.hashCode);
-    hash = JenkinsSmiHash.combine(hash, includedSuggestionKinds.hashCode);
+    hash = JenkinsSmiHash.combine(hash, includedElementKinds.hashCode);
     hash =
         JenkinsSmiHash.combine(hash, includedSuggestionRelevanceTags.hashCode);
     return JenkinsSmiHash.finish(hash);
@@ -16076,6 +16314,7 @@
  * {
  *   "id": int
  *   "relevance": int
+ *   "displayUri": optional String
  * }
  *
  * Clients may not extend, implement or mix-in this class.
@@ -16085,6 +16324,8 @@
 
   int _relevance;
 
+  String _displayUri;
+
   /**
    * Clients should use it to access the set of precomputed completions to be
    * displayed to the user.
@@ -16115,9 +16356,34 @@
     this._relevance = value;
   }
 
-  IncludedSuggestionSet(int id, int relevance) {
+  /**
+   * The optional string that should be displayed instead of the uri of the
+   * referenced AvailableSuggestionSet.
+   *
+   * For example libraries in the "test" directory of a package have only
+   * "file://" URIs, so are usually long, and don't look nice, but actual
+   * import directives will use relative URIs, which are short, so we probably
+   * want to display such relative URIs to the user.
+   */
+  String get displayUri => _displayUri;
+
+  /**
+   * The optional string that should be displayed instead of the uri of the
+   * referenced AvailableSuggestionSet.
+   *
+   * For example libraries in the "test" directory of a package have only
+   * "file://" URIs, so are usually long, and don't look nice, but actual
+   * import directives will use relative URIs, which are short, so we probably
+   * want to display such relative URIs to the user.
+   */
+  void set displayUri(String value) {
+    this._displayUri = value;
+  }
+
+  IncludedSuggestionSet(int id, int relevance, {String displayUri}) {
     this.id = id;
     this.relevance = relevance;
+    this.displayUri = displayUri;
   }
 
   factory IncludedSuggestionSet.fromJson(
@@ -16139,7 +16405,12 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, "relevance");
       }
-      return new IncludedSuggestionSet(id, relevance);
+      String displayUri;
+      if (json.containsKey("displayUri")) {
+        displayUri = jsonDecoder.decodeString(
+            jsonPath + ".displayUri", json["displayUri"]);
+      }
+      return new IncludedSuggestionSet(id, relevance, displayUri: displayUri);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "IncludedSuggestionSet", json);
     }
@@ -16150,6 +16421,9 @@
     Map<String, dynamic> result = {};
     result["id"] = id;
     result["relevance"] = relevance;
+    if (displayUri != null) {
+      result["displayUri"] = displayUri;
+    }
     return result;
   }
 
@@ -16159,7 +16433,9 @@
   @override
   bool operator ==(other) {
     if (other is IncludedSuggestionSet) {
-      return id == other.id && relevance == other.relevance;
+      return id == other.id &&
+          relevance == other.relevance &&
+          displayUri == other.displayUri;
     }
     return false;
   }
@@ -16169,6 +16445,7 @@
     int hash = 0;
     hash = JenkinsSmiHash.combine(hash, id.hashCode);
     hash = JenkinsSmiHash.combine(hash, relevance.hashCode);
+    hash = JenkinsSmiHash.combine(hash, displayUri.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 }
@@ -21260,6 +21537,138 @@
 }
 
 /**
+ * TokenDetails
+ *
+ * {
+ *   "lexeme": String
+ *   "type": String
+ *   "validElementKinds": List<ElementKind>
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class TokenDetails implements HasToJson {
+  String _lexeme;
+
+  String _type;
+
+  List<ElementKind> _validElementKinds;
+
+  /**
+   * The raw token text.
+   */
+  String get lexeme => _lexeme;
+
+  /**
+   * The raw token text.
+   */
+  void set lexeme(String value) {
+    assert(value != null);
+    this._lexeme = value;
+  }
+
+  /**
+   * The type of this token.
+   */
+  String get type => _type;
+
+  /**
+   * The type of this token.
+   */
+  void set type(String value) {
+    assert(value != null);
+    this._type = value;
+  }
+
+  /**
+   * The kinds of elements which could validly replace this token.
+   */
+  List<ElementKind> get validElementKinds => _validElementKinds;
+
+  /**
+   * The kinds of elements which could validly replace this token.
+   */
+  void set validElementKinds(List<ElementKind> value) {
+    assert(value != null);
+    this._validElementKinds = value;
+  }
+
+  TokenDetails(
+      String lexeme, String type, List<ElementKind> validElementKinds) {
+    this.lexeme = lexeme;
+    this.type = type;
+    this.validElementKinds = validElementKinds;
+  }
+
+  factory TokenDetails.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String lexeme;
+      if (json.containsKey("lexeme")) {
+        lexeme = jsonDecoder.decodeString(jsonPath + ".lexeme", json["lexeme"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "lexeme");
+      }
+      String type;
+      if (json.containsKey("type")) {
+        type = jsonDecoder.decodeString(jsonPath + ".type", json["type"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "type");
+      }
+      List<ElementKind> validElementKinds;
+      if (json.containsKey("validElementKinds")) {
+        validElementKinds = jsonDecoder.decodeList(
+            jsonPath + ".validElementKinds",
+            json["validElementKinds"],
+            (String jsonPath, Object json) =>
+                new ElementKind.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "validElementKinds");
+      }
+      return new TokenDetails(lexeme, type, validElementKinds);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "TokenDetails", json);
+    }
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["lexeme"] = lexeme;
+    result["type"] = type;
+    result["validElementKinds"] =
+        validElementKinds.map((ElementKind value) => value.toJson()).toList();
+    return result;
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is TokenDetails) {
+      return lexeme == other.lexeme &&
+          type == other.type &&
+          listEqual(validElementKinds, other.validElementKinds,
+              (ElementKind a, ElementKind b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lexeme.hashCode);
+    hash = JenkinsSmiHash.combine(hash, type.hashCode);
+    hash = JenkinsSmiHash.combine(hash, validElementKinds.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
  * TypeHierarchyItem
  *
  * {
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 591419d..88eea40 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,45 @@
+##
+* Deprecated AST structures that will no longer be used after the
+  control_flow_collections and spread_collections experiments are enabled.  The
+  following AST node types are deprecated:
+  * `ForEachStatement` (use `ForStatement2` instead)
+  * `ForStatement` (use `ForStatement2` instead)
+  * `MapLiteral` (use `SetOrMapLiteral` instead)
+  * `SetLiteral` (use `SetOrMapLiteral` instead)
+* Deprecated visit methods that will no longer be used after the
+  control_flow_collections and spread_collections experiments are enabled.  The
+  following visit methods are deprecated:
+  * `visitForEachStatement` (override `visitForStatement2` instead)
+  * `visitForStatement` (override `visitForStatement2` instead)
+  * `visitMapLiteral` (override `visitSetOrMapLiteral` instead)
+  * `visitSetLiteral` (override `visitSetOrMapLiteral` instead)
+
+## 0.35.3
+* Further updates to the AST structure for the control_flow_collections and
+  spread_collections experiments.  The following AST node types will be
+  deprecated soon:
+  * `ForEachStatement` (use `ForStatement2` instead)
+  * `ForStatement` (use `ForStatement2` instead)
+  * `MapLiteral` (use `SetOrMapLiteral` instead)
+  * `SetLiteral` (use `SetOrMapLiteral` instead)
+* Deprecated `Expression.precedence`.  In analyzer version 0.36.0, its return
+  type will be changed to `Precedence`.  Clients that wish to prepare for the
+  change can switch to `Expression.precedence2`.
+* Bug fixes: #35908, #35993 (workaround).
+
+## 0.35.2
+* Updated support in the AST structure for the control_flow_collections and
+  spread_collections experiments.  The following methods are now deprecated:
+  * `AstFactory.mapLiteral2` and `AstFactory.setLiteral2` (replaced by
+    `AstFactory.setOrMapLiteral`).
+  * `AstVisitor.visitListLiteral2` (clients should not need to override this
+    anymore).
+  * `AstVisitor.visitMapLiteral2 and AstVisitor.visitSetLiteral2` (replaced by
+    `AstVisitor.visitSetOrMapLiteral`).
+* Started to add support for strict-inference as an analysis option.
+* Bug fixes: #35870, #35922, #35936, #35940,
+  https://github.com/flutter/flutter-intellij/issues/3204
+
 ## 0.35.1
 * The new "set literals" language feature is now enabled by default.
 * The dev_dependency analysis_tool was created so that clients do not have to
diff --git a/pkg/analyzer/doc/support/dart.js b/pkg/analyzer/doc/support/dart.js
deleted file mode 100644
index f8d686e..0000000
--- a/pkg/analyzer/doc/support/dart.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-(function() {
-// Bootstrap support for Dart scripts on the page as this script.
-if (navigator.userAgent.indexOf('(Dart)') === -1) {
-  // TODO:
-  // - Support in-browser compilation.
-  // - Handle inline Dart scripts.
-
-  // Fall back to compiled JS. Run through all the scripts and
-  // replace them if they have a type that indicate that they source
-  // in Dart code (type="application/dart").
-  var scripts = document.getElementsByTagName("script");
-  var length = scripts.length;
-  for (var i = 0; i < length; ++i) {
-    if (scripts[i].type == "application/dart") {
-      // Remap foo.dart to foo.dart.js.
-      if (scripts[i].src && scripts[i].src != '') {
-        var script = document.createElement('script');
-        script.src = scripts[i].src.replace(/\.dart(?=\?|$)/, '.dart.js');
-        var parent = scripts[i].parentNode;
-        // TODO(vsm): Find a solution for issue 8455 that works with more
-        // than one script.
-        document.currentScript = script;
-        parent.replaceChild(script, scripts[i]);
-      }
-    }
-  }
-}
-})();
diff --git a/pkg/analyzer/doc/support/style.css b/pkg/analyzer/doc/support/style.css
deleted file mode 100644
index 0964121..0000000
--- a/pkg/analyzer/doc/support/style.css
+++ /dev/null
@@ -1,29 +0,0 @@
-*, *:before, *:after {
-    -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
-}
-button {
-    position: fixed;
-    padding: 10px;
-    top: 5px;
-    left: 5px;
-    opacity: 0.8;
-    display: none;
-}
-g > * {
-    transition-property: stroke, stroke-width, transform, fill, font-size;
-    transition-duration: .2s;
-}
-g.active > text {
-    fill: blue;
-    font-size: 100%;
-}
-g.active > polygon, g.active > ellipse, g.active > path {
-    stroke: blue;
-    stroke-width: 3px !important;
-}
-g.active.edge > polygon {
-    fill: blue;
-}
-html, body { margin:10px; padding:0; }
-svg {  height:100%; width:100%; }
-svg.zoom {height: inherit; width: inherit;}
diff --git a/pkg/analyzer/doc/support/viz.js b/pkg/analyzer/doc/support/viz.js
deleted file mode 100644
index 488db0c..0000000
--- a/pkg/analyzer/doc/support/viz.js
+++ /dev/null
@@ -1,1302 +0,0 @@
-function k($a){throw $a;}var p=void 0,q=!0,r=null,G=!1;function M(){return function(){}}
-window.Viz=function($a,ec,ab){function ob(a){eval.call(r,a)}function J(a,b){a||aa("Assertion failed: "+b)}function pb(a){try{var b=e["_"+a];b||(b=eval("_"+a))}catch(c){}J(b,"Cannot call unknown function "+a+" (perhaps LLVM optimizations or closure removed it?)");return b}function qb(a,b,c,f){function d(a,b){if("string"==b){if(a===r||a===p||0===a)return 0;a=V(a);b="array"}if("array"==b){i||(i=l.kd());var c=l.hd(a.length);rb(a,c);return c}return a}var i=0,e=0,f=f?f.map(function(a){return d(a,c[e++])}):
-[];a=a.apply(r,f);"string"==b?b=R(a):(J("array"!=b),b=a);i&&l.jd(i);return b}function ta(a,b,c){c=c||"i8";"*"===c.charAt(c.length-1)&&(c="i32");switch(c){case "i1":v[a]=b;break;case "i8":v[a]=b;break;case "i16":ea[a>>1]=b;break;case "i32":t[a>>2]=b;break;case "i64":na=[b>>>0,(N=b,1<=+ua(N)?0<N?(va(+Ia(N/4294967296),4294967295)|0)>>>0:~~+Ja((N-+(~~N>>>0))/4294967296)>>>0:0)];t[a>>2]=na[0];t[a+4>>2]=na[1];break;case "float":wa[a>>2]=b;break;case "double":oa[a>>3]=b;break;default:aa("invalid type for setValue: "+
-c)}}function pa(a,b){b=b||"i8";"*"===b.charAt(b.length-1)&&(b="i32");switch(b){case "i1":return v[a];case "i8":return v[a];case "i16":return ea[a>>1];case "i32":return t[a>>2];case "i64":return t[a>>2];case "float":return wa[a>>2];case "double":return oa[a>>3];default:aa("invalid type for setValue: "+b)}return r}function D(a,b,c,f){var d,i;"number"===typeof a?(d=q,i=a):(d=G,i=a.length);var e="string"===typeof b?b:r,c=c==L?f:[ia,l.hd,l.md,l.Ub][c===p?S:c](Math.max(i,e?1:b.length));if(d){f=c;J(0==(c&
-3));for(a=c+(i&-4);f<a;f+=4)t[f>>2]=0;for(a=c+i;f<a;)v[f++|0]=0;return c}if("i8"===e)return a.subarray||a.slice?T.set(a,c):T.set(new Uint8Array(a),c),c;for(var f=0,j,g;f<i;){var x=a[f];"function"===typeof x&&(x=l.Ni(x));d=e||b[f];0===d?f++:("i64"==d&&(d="i32"),ta(c+f,x,d),g!==d&&(j=l.Lc(d),g=d),f+=j)}return c}function R(a,b){for(var c=G,f,d=0;;){f=T[a+d|0];if(128<=f)c=q;else if(0==f&&!b)break;d++;if(b&&d==b)break}b||(b=d);var i="";if(!c){for(;0<b;)f=String.fromCharCode.apply(String,T.subarray(a,a+
-Math.min(b,1024))),i=i?i+f:f,a+=1024,b-=1024;return i}c=new l.pb;for(d=0;d<b;d++)f=T[a+d|0],i+=c.ic(f);return i}function fc(a){try{if("Object._main"==a||"_main"==a)return"main()";"number"===typeof a&&(a=R(a));if("_"!==a[0]||"_"!==a[1]||"Z"!==a[2])return a;switch(a[3]){case "n":return"operator new()";case "d":return"operator delete()"}var b=3,c={v:"void",b:"bool",c:"char",s:"short",i:"int",l:"long",f:"float",d:"double",w:"wchar_t",a:"signed char",h:"unsigned char",t:"unsigned short",j:"unsigned int",
-m:"unsigned long",x:"long long",y:"unsigned long long",z:"..."},f=[],d=q,i=function(e,h,g){var h=h||Infinity,m="",s=[],y;if("N"===a[b]){b++;"K"===a[b]&&b++;for(y=[];"E"!==a[b];)if("S"===a[b]){b++;var A=a.indexOf("_",b);y.push(f[a.substring(b,A)||0]||"?");b=A+1}else if("C"===a[b])y.push(y[y.length-1]),b+=2;else{var A=parseInt(a.substr(b)),F=A.toString().length;if(!A||!F){b--;break}var P=a.substr(b+F,A);y.push(P);f.push(P);b+=F+A}b++;y=y.join("::");h--;if(0===h)return e?[y]:y}else if(("K"===a[b]||d&&
-"L"===a[b])&&b++,A=parseInt(a.substr(b)))F=A.toString().length,y=a.substr(b+F,A),b+=F+A;d=G;"I"===a[b]?(b++,A=i(q),F=i(q,1,q),m+=F[0]+" "+y+"<"+A.join(", ")+">"):m=y;a:for(;b<a.length&&0<h--;)if(y=a[b++],y in c)s.push(c[y]);else switch(y){case "P":s.push(i(q,1,q)[0]+"*");break;case "R":s.push(i(q,1,q)[0]+"&");break;case "L":b++;A=a.indexOf("E",b)-b;s.push(a.substr(b,A));b+=A+2;break;case "A":A=parseInt(a.substr(b));b+=A.toString().length;"_"!==a[b]&&k("?");b++;s.push(i(q,1,q)[0]+" ["+A+"]");break;
-case "E":break a;default:m+="?"+y;break a}!g&&(1===s.length&&"void"===s[0])&&(s=[]);return e?s:m+("("+s.join(", ")+")")};return i()}catch(e){return a}}function bb(){var a=Error().stack;return a?a.replace(/__Z[\w\d_]+/g,function(a){var c=fc(a);return a===c?a:a+" ["+c+"]"}):"(no stack trace available)"}function qa(a){for(;0<a.length;){var b=a.shift();if("function"==typeof b)b();else{var c=b.Ka;"number"===typeof c?b.uc===p?l.Dc("v",c):l.Dc("vi",c,[b.uc]):c(b.uc===p?r:b.uc)}}}function sb(a){cb.unshift(a)}
-function tb(a){ub.unshift(a)}function V(a,b,c){a=(new l.pb).re(a);c&&(a.length=c);b||a.push(0);return a}function rb(a,b){for(var c=0;c<a.length;c++)v[b+c|0]=a[c]}function Ka(a,b,c){for(var f=0;f<a.length;f++)v[b+f|0]=a.charCodeAt(f);c||(v[b+a.length|0]=0)}function La(a,b){return 0<=a?a:32>=b?2*Math.abs(1<<b-1)+a:Math.pow(2,b)+a}function vb(a,b){if(0>=a)return a;var c=32>=b?Math.abs(1<<b-1):Math.pow(2,b-1);if(a>=c&&(32>=b||a>c))a=-2*c+a;return a}function db(){fa++;e.monitorRunDependencies&&e.monitorRunDependencies(fa)}
-function Ma(){fa--;e.monitorRunDependencies&&e.monitorRunDependencies(fa);if(0==fa&&(eb!==r&&(clearInterval(eb),eb=r),xa)){var a=xa;xa=r;a()}}function H(a){return t[Na>>2]=a}function fb(a,b,c){a=d.D(a);if(!a)return H(g.H),-1;try{return d.P(a,v,b,c)}catch(f){return d.sa(f),-1}}function wb(a,b,c){if(a in Oa){if(Oa[a].length>c-1)return H(g.qc);Ka(Oa[a],b);return 0}return H(g.B)}function ya(a){ya.buffer||(ya.buffer=ia(256));wb(a,ya.buffer,256);return ya.buffer}function Pa(a){return 0>a||0===a&&-Infinity===
-1/a}function gb(a,b){function c(a){var c;"double"===a?c=oa[b+d>>3]:"i64"==a?(c=[t[b+d>>2],t[b+(d+8)>>2]],d+=8):(a="i32",c=t[b+d>>2]);d+=Math.max(l.$d(a),l.Aa(a,r,q));return c}for(var f=a,d=0,e=[],h,j;;){var g=f;h=v[f];if(0===h)break;j=v[f+1|0];if(37==h){var x=G,m=G,s=G,y=G,A=G;a:for(;;){switch(j){case 43:x=q;break;case 45:m=q;break;case 35:s=q;break;case 48:if(y)break a;else{y=q;break}case 32:A=q;break;default:break a}f++;j=v[f+1|0]}var F=0;if(42==j)F=c("i32"),f++,j=v[f+1|0];else for(;48<=j&&57>=
-j;)F=10*F+(j-48),f++,j=v[f+1|0];var P=G,E=-1;if(46==j){E=0;P=q;f++;j=v[f+1|0];if(42==j)E=c("i32"),f++;else for(;;){j=v[f+1|0];if(48>j||57<j)break;E=10*E+(j-48);f++}j=v[f+1|0]}-1===E&&(E=6,P=G);var C;switch(String.fromCharCode(j)){case "h":j=v[f+2|0];104==j?(f++,C=1):C=2;break;case "l":j=v[f+2|0];108==j?(f++,C=8):C=4;break;case "L":case "q":case "j":C=8;break;case "z":case "t":case "I":C=4;break;default:C=r}C&&f++;j=v[f+1|0];switch(String.fromCharCode(j)){case "d":case "i":case "u":case "o":case "x":case "X":case "p":g=
-100==j||105==j;C=C||4;var n=h=c("i"+8*C),w;8==C&&(h=l.Mf(h[0],h[1],117==j));4>=C&&(h=(g?vb:La)(h&Math.pow(256,C)-1,8*C));var u=Math.abs(h),g="";if(100==j||105==j)w=8==C&&za?za.stringify(n[0],n[1],r):vb(h,8*C).toString(10);else if(117==j)w=8==C&&za?za.stringify(n[0],n[1],q):La(h,8*C).toString(10),h=Math.abs(h);else if(111==j)w=(s?"0":"")+u.toString(8);else if(120==j||88==j){g=s&&0!=h?"0x":"";if(8==C&&za)if(n[1]){w=(n[1]>>>0).toString(16);for(s=(n[0]>>>0).toString(16);8>s.length;)s="0"+s;w+=s}else w=
-(n[0]>>>0).toString(16);else if(0>h){h=-h;w=(u-1).toString(16);n=[];for(s=0;s<w.length;s++)n.push((15-parseInt(w[s],16)).toString(16));for(w=n.join("");w.length<2*C;)w="f"+w}else w=u.toString(16);88==j&&(g=g.toUpperCase(),w=w.toUpperCase())}else 112==j&&(0===u?w="(nil)":(g="0x",w=u.toString(16)));if(P)for(;w.length<E;)w="0"+w;0<=h&&(x?g="+"+g:A&&(g=" "+g));"-"==w.charAt(0)&&(g="-"+g,w=w.substr(1));for(;g.length+w.length<F;)m?w+=" ":y?w="0"+w:g=" "+g;w=g+w;w.split("").forEach(function(a){e.push(a.charCodeAt(0))});
-break;case "f":case "F":case "e":case "E":case "g":case "G":h=c("double");if(isNaN(h))w="nan",y=G;else if(isFinite(h)){P=G;C=Math.min(E,20);if(103==j||71==j)P=q,E=E||1,C=parseInt(h.toExponential(C).split("e")[1],10),E>C&&-4<=C?(j=(103==j?"f":"F").charCodeAt(0),E-=C+1):(j=(103==j?"e":"E").charCodeAt(0),E--),C=Math.min(E,20);if(101==j||69==j)w=h.toExponential(C),/[eE][-+]\d$/.test(w)&&(w=w.slice(0,-1)+"0"+w.slice(-1));else if(102==j||70==j)w=h.toFixed(C),0===h&&Pa(h)&&(w="-"+w);g=w.split("e");if(P&&
-!s)for(;1<g[0].length&&-1!=g[0].indexOf(".")&&("0"==g[0].slice(-1)||"."==g[0].slice(-1));)g[0]=g[0].slice(0,-1);else for(s&&-1==w.indexOf(".")&&(g[0]+=".");E>C++;)g[0]+="0";w=g[0]+(1<g.length?"e"+g[1]:"");69==j&&(w=w.toUpperCase());0<=h&&(x?w="+"+w:A&&(w=" "+w))}else w=(0>h?"-":"")+"inf",y=G;for(;w.length<F;)w=m?w+" ":y&&("-"==w[0]||"+"==w[0])?w[0]+"0"+w.slice(1):(y?"0":" ")+w;97>j&&(w=w.toUpperCase());w.split("").forEach(function(a){e.push(a.charCodeAt(0))});break;case "s":y=(x=c("i8*"))?Aa(x):6;
-P&&(y=Math.min(y,E));if(!m)for(;y<F--;)e.push(32);if(x)for(s=0;s<y;s++)e.push(T[x++|0]);else e=e.concat(V("(null)".substr(0,y),q));if(m)for(;y<F--;)e.push(32);break;case "c":for(m&&e.push(c("i8"));0<--F;)e.push(32);m||e.push(c("i8"));break;case "n":m=c("i32*");t[m>>2]=e.length;break;case "%":e.push(h);break;default:for(s=g;s<f+2;s++)e.push(v[s])}f+=2}else e.push(h),f+=1}return e}function hb(a,b,c,f){c=gb(c,f);f=b===p?c.length:Math.min(c.length,Math.max(b-1,0));if(0>a)var a=-a,d=ia(f+1),a=t[a>>2]=
-d;for(d=0;d<f;d++)v[a+d|0]=c[d];if(f<b||b===p)v[a+d|0]=0;return c.length}function xb(a,b,c){for(var f=0;f<c;){var d=T[a+f|0],e=T[b+f|0];if(d==e&&0==d)break;if(0==d)return-1;if(0==e)return 1;if(d==e)f++;else return d>e?1:-1}return 0}function yb(a){return 32==a||9<=a&&13>=a}function zb(a,b,c,f,d,e,h){for(;yb(v[a]);)a++;var j=1;45==v[a]?(j=-1,a++):43==v[a]&&a++;if(c){if(16==c&&48==v[a]&&(120==v[a+1|0]||88==v[a+1|0]))a+=2}else 48==v[a]&&(120==v[a+1|0]||88==v[a+1|0]?(c=16,a+=2):(c=8,a++));c||(c=10);for(var l,
-x=0;0!=(l=v[a])&&!(l=parseInt(String.fromCharCode(l),c),isNaN(l));)x=x*c+l,a++;x*=j;b&&(t[b>>2]=a);h&&(Math.abs(x)>d?(x=d,H(g.qc)):x=La(x,e));if(x>d||x<f)x=x>d?d:f,H(g.qc);return 64==e?(u.setTempRet0((N=x,1<=+ua(N)?0<N?(va(+Ia(N/4294967296),4294967295)|0)>>>0:~~+Ja((N-+(~~N>>>0))/4294967296)>>>0:0)),x>>>0)|0:x}function Ab(a,b,c){return zb(a,b,c,-2147483648,2147483647,32)}function Bb(a){return/^[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?/.exec(a)}function Q(a,b,c,f){Q.whiteSpace||(Q.whiteSpace={},Q.whiteSpace[32]=
-1,Q.whiteSpace[9]=1,Q.whiteSpace[10]=1,Q.whiteSpace[11]=1,Q.whiteSpace[12]=1,Q.whiteSpace[13]=1);var a=R(a),d=0;if(0<=a.indexOf("%n"))var e=b,b=function(){d++;return e()},h=c,c=function(){d--;return h()};var j=0,g=0,x=0,m,j=0;a:for(;j<a.length;)if("%"===a[j]&&"n"==a[j+1]){var s=t[f+x>>2],x=x+l.Aa("void*",r,q);t[s>>2]=d;j+=2}else{if("%"===a[j]){var y=a.indexOf("c",j+1);if(0<y){var A=1;y>j+1&&(m=a.substring(j+1,y),A=parseInt(m),A!=m&&(A=0));if(A){s=t[f+x>>2];x+=l.Aa("void*",r,q);g++;for(var F=0;F<A;F++)m=
-b(),v[s++|0]=m;j+=y-j+1;continue}}}if("%"===a[j]&&0<a.indexOf("[",j+1)&&(y=/\%([0-9]*)\[(\^)?(\]?[^\]]*)\]/.exec(a.substring(j)))){for(var A=parseInt(y[1])||Infinity,P="^"===y[2],E=y[3];m=/([^\-])\-([^\-])/.exec(E);){for(var s=m[1].charCodeAt(0),F=m[2].charCodeAt(0),C="";s<=F;C+=String.fromCharCode(s++));E=E.replace(m[1]+"-"+m[2],C)}s=t[f+x>>2];x+=l.Aa("void*",r,q);g++;for(F=0;F<A;F++)if(m=b(),P)if(0>E.indexOf(String.fromCharCode(m)))v[s++|0]=m;else{c();break}else if(0<=E.indexOf(String.fromCharCode(m)))v[s++|
-0]=m;else{c();break}v[s++|0]=0;j+=y[0].length;continue}for(;;){m=b();if(0==m)return g;if(!(m in Q.whiteSpace))break}c();if("%"===a[j]){j++;s=G;"*"==a[j]&&(s=q,j++);for(m=j;48<=a[j].charCodeAt(0)&&57>=a[j].charCodeAt(0);)j++;var n;j!=m&&(n=parseInt(a.slice(m,j),10));P=A=y=G;"l"==a[j]?(y=q,j++,"l"==a[j]&&(P=q,j++)):"h"==a[j]&&(A=q,j++);E=a[j];j++;F=0;C=[];if("f"==E||"e"==E||"g"==E||"F"==E||"E"==E||"G"==E){for(m=b();0<m&&!(m in Q.whiteSpace);)C.push(String.fromCharCode(m)),m=b();m=(m=Bb(C.join("")))?
-m[0].length:0;for(F=0;F<C.length-m+1;F++)c();C.length=m}else{m=b();var w=q;if(("x"==E||"X"==E)&&48==m){var u=b();120==u||88==u?m=b():c()}for(;(F<n||isNaN(n))&&0<m;)if(!(m in Q.whiteSpace)&&("s"==E||("d"===E||"u"==E||"i"==E)&&(48<=m&&57>=m||w&&45==m)||("x"===E||"X"===E)&&(48<=m&&57>=m||97<=m&&102>=m||65<=m&&70>=m))&&(j>=a.length||m!==a[j].charCodeAt(0)))C.push(String.fromCharCode(m)),m=b(),F++,w=G;else break;c()}if(0===C.length)return 0;if(!s){m=C.join("");s=t[f+x>>2];x+=l.Aa("void*",r,q);switch(E){case "d":case "u":case "i":A?
-ea[s>>1]=parseInt(m,10):P?(na=[parseInt(m,10)>>>0,(N=parseInt(m,10),1<=+ua(N)?0<N?(va(+Ia(N/4294967296),4294967295)|0)>>>0:~~+Ja((N-+(~~N>>>0))/4294967296)>>>0:0)],t[s>>2]=na[0],t[s+4>>2]=na[1]):t[s>>2]=parseInt(m,10);break;case "X":case "x":t[s>>2]=parseInt(m,16);break;case "F":case "f":case "E":case "e":case "G":case "g":case "E":y?oa[s>>3]=parseFloat(m):wa[s>>2]=parseFloat(m);break;case "s":m=V(m);for(F=0;F<m.length;F++)v[s+F|0]=m[F]}g++}}else{if(a[j].charCodeAt(0)in Q.whiteSpace){for(m=b();m in
-Q.whiteSpace;){if(0>=m)break a;m=b()}c(m)}else if(m=b(),a[j].charCodeAt(0)!==m){c(m);break a}j++}}return g}function Cb(a,b,c){return hb(a,p,b,c)}function Qa(){Qa.$||(Qa.$=D([0],"i8",ja));return Qa.$}function Ba(a,b,c){a=d.D(a);if(!a)return H(g.H),-1;try{return d.write(a,v,b,c)}catch(f){return d.sa(f),-1}}function Db(a,b,c,f){c*=b;if(0==c)return 0;a=Ba(f,a,c);if(-1==a){if(b=d.D(f))b.error=q;return 0}return Math.floor(a/b)}function Eb(a,b,c){c=gb(b,c);b=l.kd();a=Db(D(c,"i8",ib),1,c.length,a);l.jd(b);
-return a}function Fb(a,b,c){var f,d,e,h;if(0==a&&0==(a=pa(c,"i8*")))return 0;a:for(;;){d=pa(a++,"i8");for(f=b;0!=(e=pa(f++,"i8"));)if(d==e)continue a;break}if(0==d)return ta(c,0,"i8*"),0;for(h=a-1;;){d=pa(a++,"i8");f=b;do if((e=pa(f++,"i8"))==d)return 0==d?a=0:ta(a-1,0,"i8"),ta(c,a,"i8*"),h;while(0!=e)}aa("strtok_r error!")}function Gb(a){e.exit(a)}function Ca(a){var b,c;Ca.xc?(c=t[Hb>>2],b=t[c>>2]):(Ca.xc=q,U.USER="root",U.PATH="/",U.PWD="/",U.HOME="/home/emscripten",U.LANG="en_US.UTF-8",U._="./this.program",
-b=D(1024,"i8",S),c=D(256,"i8*",S),t[c>>2]=b,t[Hb>>2]=c);var f=[],d=0,e;for(e in a)if("string"===typeof a[e]){var h=e+"="+a[e];f.push(h);d+=h.length}1024<d&&k(Error("Environment size exceeded TOTAL_ENV_SIZE!"));for(a=0;a<f.length;a++)h=f[a],Ka(h,b),t[c+4*a>>2]=b,b+=h.length+1;t[c+4*f.length>>2]=0}function Da(a){if(0===a)return 0;a=R(a);if(!U.hasOwnProperty(a))return 0;Da.$&&Ib(Da.$);Da.$=D(V(U[a]),"i8",ja);return Da.$}function Jb(a,b,c){c=t[c>>2];a=R(a);try{return d.open(a,b,c).da}catch(f){return d.sa(f),
--1}}function Kb(a,b){var c,b=R(b);if("r"==b[0])c=-1!=b.indexOf("+")?2:0;else if("w"==b[0])c=-1!=b.indexOf("+")?2:1,c|=576;else if("a"==b[0])c=-1!=b.indexOf("+")?2:1,c|=64,c|=1024;else return H(g.B),0;c=Jb(a,c,D([511,0,0,0],"i32",ib));return-1==c?0:c}function Lb(a){a=d.D(a);if(!a)return H(g.H),-1;try{return d.close(a),0}catch(b){return d.sa(b),-1}}function Mb(a){if(d.D(a))return 0;H(g.H);return-1}function ra(a,b){var c=La(a&255);v[ra.$|0]=c;if(-1==Ba(b,ra.$,1)){if(c=d.D(b))c.error=q;return-1}return c}
-function Nb(a,b,c,f){c*=b;if(0==c)return 0;var e=0,i=d.D(f);if(!i)return H(g.H),0;for(;i.pd.length&&0<c;)v[a++|0]=i.pd.pop(),c--,e++;a=fb(f,a,c);if(-1==a)return i&&(i.error=q),0;e+=a;e<c&&(i.Ua=q);return Math.floor(e/b)}function Ea(a){var b=d.D(a);if(!b||b.Ua||b.error)return-1;a=Nb(Ea.$,1,1,a);return 0==a?-1:-1==a?(b.error=q,-1):T[Ea.$|0]}function Ob(a,b,c){a="string"!==typeof a?R(a):a;try{var f=c?d.Kf(a):d.ld(a);t[b>>2]=f.Cc;t[b+4>>2]=0;t[b+8>>2]=f.ac;t[b+12>>2]=f.mode;t[b+16>>2]=f.Wc;t[b+20>>2]=
-f.uid;t[b+24>>2]=f.Mc;t[b+28>>2]=f.Pa;t[b+32>>2]=0;t[b+36>>2]=f.size;t[b+40>>2]=4096;t[b+44>>2]=f.sb;t[b+48>>2]=Math.floor(f.wc.getTime()/1E3);t[b+52>>2]=0;t[b+56>>2]=Math.floor(f.Uc.getTime()/1E3);t[b+60>>2]=0;t[b+64>>2]=Math.floor(f.Ac.getTime()/1E3);t[b+68>>2]=0;t[b+72>>2]=f.ac;return 0}catch(e){return d.sa(e),-1}}function Pb(a,b,c){a=d.D(a);if(!a)return H(g.H),-1;try{return d.ga(a,b,c)}catch(f){return d.sa(f),-1}}function Qb(a,b){return Ba(b,a,Aa(a))}function Fa(a,b,c){var f=d.Ud(b||"/tmp");if(!f||
-!f.Pc)if(b="/tmp",f=d.Ud(b),!f||!f.Pc)return 0;c=c||"file";do c+=String.fromCharCode(65+Math.floor(25*Math.random()));while(c in f.u);b=b+"/"+c;Fa.buffer||(Fa.buffer=ia(256));a||(a=Fa.buffer);Ka(b,a);return a}function Ra(){Ra.mode&&(Ra.mode=D(V("w+"),"i8",ja));return Kb(Fa(0),Ra.mode)}function Rb(a){var b=Rb;b.xc||(Z=Z+4095&-4096,b.xc=q,J(l.Ub),b.We=l.Ub,l.Ub=function(){aa("cannot dynamically allocate, sbrk now has control")});var c=Z;0!=a&&b.We(a);return c}function jb(a){this.name="ExitStatus";this.message=
-"Program terminated with exit("+a+")";this.status=a}function kb(a){function b(){if(!e.calledRun){e.calledRun=q;Sa||(Sa=q,qa(ka));qa(lb);e._main&&mb&&e.callMain(a);if(e.postRun)for("function"==typeof e.postRun&&(e.postRun=[e.postRun]);e.postRun.length;)tb(e.postRun.shift());qa(ub)}}a=a||e.arguments;Ta===r&&(Ta=Date.now());if(0<fa)e.ab("run() called, but dependencies remain, so not running");else{if(e.preRun)for("function"==typeof e.preRun&&(e.preRun=[e.preRun]);e.preRun.length;)sb(e.preRun.shift());
-qa(cb);!(0<fa)&&!e.calledRun&&(e.setStatus?(e.setStatus("Running..."),setTimeout(function(){setTimeout(function(){e.setStatus("")},1);ba||b()},1)):b())}}function Sb(a){ba=q;X=Tb;qa(Ua);k(new jb(a))}function aa(a){a&&(e.print(a),e.ab(a));ba=q;k("abort() at "+bb())}"undefined"===typeof ab&&(ab="dot");var e={"return":"",print:function(a){e["return"]+=a+"\n"}},Va={},ga;for(ga in e)e.hasOwnProperty(ga)&&(Va[ga]=e[ga]);var ca="object"===typeof process&&"function"===typeof require,Wa="object"===typeof window,
-Xa="function"===typeof importScripts,gc=!Wa&&!ca&&!Xa;if(ca){e.print||(e.print=function(a){process.stdout.write(a+"\n")});e.printErr||(e.printErr=function(a){process.stderr.write(a+"\n")});var Ub=require("fs"),Vb=require("path");e.read=function(a,b){var a=Vb.normalize(a),c=Ub.readFileSync(a);!c&&a!=Vb.resolve(a)&&(a=path.join(__dirname,"..","src",a),c=Ub.readFileSync(a));c&&!b&&(c=c.toString());return c};e.readBinary=function(a){return e.read(a,q)};e.load=function(a){ob(read(a))};e.arguments=process.argv.slice(2);
-module.exports=e}else gc?(e.print||(e.print=print),"undefined"!=typeof printErr&&(e.printErr=printErr),e.read="undefined"!=typeof read?read:function(){k("no read() available (jsc?)")},e.readBinary=function(a){return read(a,"binary")},"undefined"!=typeof scriptArgs?e.arguments=scriptArgs:"undefined"!=typeof arguments&&(e.arguments=arguments),this.Module=e,eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined")):Wa||Xa?(e.read=function(a){var b=new XMLHttpRequest;
-b.open("GET",a,G);b.send(r);return b.responseText},"undefined"!=typeof arguments&&(e.arguments=arguments),"undefined"!==typeof console?(e.print||(e.print=function(a){console.log(a)}),e.printErr||(e.printErr=function(a){console.log(a)})):e.print||(e.print=M()),Wa?this.Module=e:e.load=importScripts):k("Unknown runtime environment. Where are we?");"undefined"==!e.load&&e.read&&(e.load=function(a){ob(e.read(a))});e.print||(e.print=M());e.printErr||(e.printErr=e.print);e.arguments||(e.arguments=[]);e.print=
-e.print;e.ab=e.printErr;e.preRun=[];e.postRun=[];for(ga in Va)Va.hasOwnProperty(ga)&&(e[ga]=Va[ga]);var l={kd:function(){return X},jd:function(a){X=a},Ii:function(a,b){b=b||4;return 1==b?a:isNumber(a)&&isNumber(b)?Math.ceil(a/b)*b:isNumber(b)&&isPowerOfTwo(b)?"((("+a+")+"+(b-1)+")&"+-b+")":"Math.ceil(("+a+")/"+b+")*"+b},Ff:function(a){return a in l.Re||a in l.Pe},Gf:function(a){return"*"==a[a.length-1]},If:function(a){return isPointerType(a)?G:isArrayType(a)||/<?{ ?[^}]* ?}>?/.test(a)?q:"%"==a[0]},
-Re:{i1:0,i8:0,i16:0,i32:0,i64:0},Pe:{"float":0,"double":0},cj:function(a,b){return(a|0|b|0)+4294967296*(Math.round(a/4294967296)|Math.round(b/4294967296))},ti:function(a,b){return((a|0)&(b|0))+4294967296*(Math.round(a/4294967296)&Math.round(b/4294967296))},Ij:function(a,b){return((a|0)^(b|0))+4294967296*(Math.round(a/4294967296)^Math.round(b/4294967296))},Lc:function(a){switch(a){case "i1":case "i8":return 1;case "i16":return 2;case "i32":return 4;case "i64":return 8;case "float":return 4;case "double":return 8;
-default:return"*"===a[a.length-1]?l.Fa:"i"===a[0]?(a=parseInt(a.substr(1)),J(0===a%8),a/8):0}},$d:function(a){return Math.max(l.Lc(a),l.Fa)},lf:function(a,b){var c={};return b?a.filter(function(a){return c[a[b]]?G:c[a[b]]=q}):a.filter(function(a){return c[a]?G:c[a]=q})},set:function(){for(var a="object"===typeof arguments[0]?arguments[0]:arguments,b={},c=0;c<a.length;c++)b[a[c]]=0;return b},fi:8,Aa:function(a,b,c){return c||!c&&("i64"==a||"double"==a)?8:!a?Math.min(b,8):Math.min(b||(a?l.$d(a):0),
-l.Fa)},Ye:function(a){a.ja=0;a.Ta=0;var b=[],c=-1,f=0;a.Xd=a.Gc.map(function(d){f++;var e,h;l.Ff(d)||l.Gf(d)?(e=l.Lc(d),h=l.Aa(d,e)):l.If(d)?"0"===d[1]?(e=0,h=Types.types[d]?l.Aa(r,Types.types[d].Ta):a.Ta||QUANTUM_SIZE):(e=Types.types[d].ja,h=l.Aa(r,Types.types[d].Ta)):"b"==d[0]?(e=d.substr(1)|0,h=1):"<"===d[0]?e=h=Types.types[d].ja:"i"===d[0]?(e=h=parseInt(d.substr(1))/8,J(0===e%1,"cannot handle non-byte-size field "+d)):J(G,"invalid type for calculateStructAlignment");a.dj&&(h=1);a.Ta=Math.max(a.Ta,
-h);d=l.qb(a.ja,h);a.ja=d+e;0<=c&&b.push(d-c);return c=d});a.ne&&"["===a.ne[0]&&(a.ja=parseInt(a.ne.substr(1))*a.ja/2);a.ja=l.qb(a.ja,a.Ta);0==b.length?a.Wd=a.ja:1==l.lf(b).length&&(a.Wd=b[0]);a.$i=1!=a.Wd;return a.Xd},sf:function(a,b,c){var f,d;if(b){c=c||0;f=("undefined"===typeof Types?l.zj:Types.types)[b];if(!f)return r;if(f.Gc.length!=a.length)return printErr("Number of named fields must match the type for "+b+": possibly duplicate struct names. Cannot return structInfo"),r;d=f.Xd}else f={Gc:a.map(function(a){return a[0]})},
-d=l.Ye(f);var e={ki:f.ja};b?a.forEach(function(a,b){if("string"===typeof a)e[a]=d[b]+c;else{var g,x;for(x in a)g=x;e[g]=l.sf(a[g],f.Gc[b],d[b])}}):a.forEach(function(a,b){e[a[1]]=d[b]});return e},Dc:function(a,b,c){return c&&c.length?(c.splice||(c=Array.prototype.slice.call(c)),c.splice(0,0,b),e["dynCall_"+a].apply(r,c)):e["dynCall_"+a].call(r,b)},Wb:[],mi:function(a){for(var b=0;b<l.Wb.length;b++)if(!l.Wb[b])return l.Wb[b]=a,2*(1+b);k("Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.")},
-lj:function(a){l.Wb[(a-2)/2]=r},Li:function(a,b){l.vc||(l.vc={});var c=l.vc[a];if(c)return c;for(var c=[],f=0;f<b;f++)c.push(String.fromCharCode(36)+f);a=R(a);'"'===a[0]&&(a.indexOf('"',1)===a.length-1?a=a.substr(1,a.length-2):aa("invalid EM_ASM input |"+a+"|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)"));return l.vc[a]=eval("(function("+c.join(",")+"){ "+a+" })")},Fb:function(a){l.Fb.fd||(l.Fb.fd={});l.Fb.fd[a]||(l.Fb.fd[a]=1,e.ab(a))},Ic:{},Mi:function(a,
-b){J(b);l.Ic[a]||(l.Ic[a]=function(){return l.Dc(b,a,arguments)});return l.Ic[a]},pb:function(){var a=[],b=0;this.ic=function(c){c&=255;if(0==a.length){if(0==(c&128))return String.fromCharCode(c);a.push(c);b=192==(c&224)?1:224==(c&240)?2:3;return""}if(b&&(a.push(c),b--,0<b))return"";var c=a[0],f=a[1],d=a[2],e=a[3];2==a.length?c=String.fromCharCode((c&31)<<6|f&63):3==a.length?c=String.fromCharCode((c&15)<<12|(f&63)<<6|d&63):(c=(c&7)<<18|(f&63)<<12|(d&63)<<6|e&63,c=String.fromCharCode(Math.floor((c-
-65536)/1024)+55296,(c-65536)%1024+56320));a.length=0;return c};this.re=function(a){for(var a=unescape(encodeURIComponent(a)),b=[],d=0;d<a.length;d++)b.push(a.charCodeAt(d));return b}},hd:function(a){var b=X;X=X+a|0;X=X+7&-8;return b},md:function(a){var b=la;la=la+a|0;la=la+7&-8;return b},Ub:function(a){var b=Z;Z=Z+a|0;Z=Z+7&-8;Z>=ha&&aa("Cannot enlarge memory arrays in asm.js. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+ha+", or (2) set Module.TOTAL_MEMORY before the program runs.");
-return b},qb:function(a,b){return Math.ceil(a/(b?b:8))*(b?b:8)},Mf:function(a,b,c){return c?+(a>>>0)+4294967296*+(b>>>0):+(a>>>0)+4294967296*+(b|0)},J:8,Fa:4,ji:0};e.Runtime=l;var ba=G,N,na;e.ccall=function(a,b,c,f){return qb(pb(a),b,c,f)};e.cwrap=function(a,b,c){var f=pb(a);return function(){return qb(f,b,c,Array.prototype.slice.call(arguments))}};e.setValue=ta;e.getValue=pa;var ja=0,ib=1,S=2,L=4;e.ALLOC_NORMAL=ja;e.ALLOC_STACK=ib;e.ALLOC_STATIC=S;e.ALLOC_DYNAMIC=3;e.ALLOC_NONE=L;e.allocate=D;e.Pointer_stringify=
-R;e.UTF16ToString=function(a){for(var b=0,c="";;){var f=ea[a+2*b>>1];if(0==f)return c;++b;c+=String.fromCharCode(f)}};e.stringToUTF16=function(a,b){for(var c=0;c<a.length;++c)ea[b+2*c>>1]=a.charCodeAt(c);ea[b+2*a.length>>1]=0};e.UTF32ToString=function(a){for(var b=0,c="";;){var f=t[a+4*b>>2];if(0==f)return c;++b;65536<=f?(f-=65536,c+=String.fromCharCode(55296|f>>10,56320|f&1023)):c+=String.fromCharCode(f)}};e.stringToUTF32=function(a,b){for(var c=0,f=0;f<a.length;++f){var d=a.charCodeAt(f);if(55296<=
-d&&57343>=d)var e=a.charCodeAt(++f),d=65536+((d&1023)<<10)|e&1023;t[b+4*c>>2]=d;++c}t[b+4*c>>2]=0};for(var v,T,ea,Wb,t,Ya,wa,oa,Xb=0,la=0,Zb=0,X=0,nb=0,$b=0,Z=0,hc=e.TOTAL_STACK||5242880,ha=e.TOTAL_MEMORY||16777216,da=4096;da<ha||da<2*hc;)da=16777216>da?2*da:da+16777216;da!==ha&&(e.ab("increasing TOTAL_MEMORY to "+da+" to be more reasonable"),ha=da);J("undefined"!==typeof Int32Array&&"undefined"!==typeof Float64Array&&!!(new Int32Array(1)).subarray&&!!(new Int32Array(1)).set,"Cannot fallback to non-typed array case: Code is too specialized");
-var $=new ArrayBuffer(ha);v=new Int8Array($);ea=new Int16Array($);t=new Int32Array($);T=new Uint8Array($);Wb=new Uint16Array($);Ya=new Uint32Array($);wa=new Float32Array($);oa=new Float64Array($);t[0]=255;J(255===T[0]&&0===T[3],"Typed arrays 2 must be run on a little-endian system");e.HEAP=p;e.HEAP8=v;e.HEAP16=ea;e.HEAP32=t;e.HEAPU8=T;e.HEAPU16=Wb;e.HEAPU32=Ya;e.HEAPF32=wa;e.HEAPF64=oa;var cb=[],ka=[],lb=[],Ua=[],ub=[],Sa=G;e.addOnPreRun=e.ri=sb;e.addOnInit=e.oi=function(a){ka.unshift(a)};e.addOnPreMain=
-e.qi=function(a){lb.unshift(a)};e.addOnExit=e.ni=function(a){Ua.unshift(a)};e.addOnPostRun=e.pi=tb;e.intArrayFromString=V;e.intArrayToString=function(a){for(var b=[],c=0;c<a.length;c++){var f=a[c];255<f&&(f&=255);b.push(String.fromCharCode(f))}return b.join("")};e.writeStringToMemory=function(a,b,c){a=V(a,c);for(c=0;c<a.length;)v[b+c|0]=a[c],c+=1};e.writeArrayToMemory=rb;e.writeAsciiToMemory=Ka;if(!Math.imul||-5!==Math.imul(4294967295,5))Math.imul=function(a,b){var c=a&65535,f=b&65535;return c*f+
-((a>>>16)*f+c*(b>>>16)<<16)|0};Math.Pi=Math.imul;var ua=Math.abs,ic=Math.cos,jc=Math.sin,kc=Math.tan,lc=Math.acos,mc=Math.asin,nc=Math.atan2,oc=Math.exp,ac=Math.sqrt,Ja=Math.ceil,Ia=Math.floor,pc=Math.pow,va=Math.min,fa=0,eb=r,xa=r;e.addRunDependency=db;e.removeRunDependency=Ma;e.preloadedImages={};e.preloadedAudios={};Xb=8;la=Xb+215424;ka.push({Ka:function(){qc()}});var ma;ma=ma=D([0,0,0,0,0,0,0,0],"i8",S);var Ga;Ga=Ga=D([0,0,0,0,0,0,0,0],"i8",S);var Ha;Ha=Ha=D([0,0,0,0,0,0,0,0],"i8",S);D([31,139,
-8,0,0,0,0,0,0,3,0,0,0,0,0,0,56,98,1,0,128,40,2,0,152,65,3,0,32,181,1,0,168,155,1,0,72,133,1,0,144,111,1,0,88,90,1,0,16,71,1,0,152,65,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,0,0,0,38,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,0,0,0,54,0,0,0,36,0,0,0,6,0,0,0,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,169,2,0,144,169,2,0,160,169,2,0,176,169,2,0,192,169,2,0,208,169,2,0,224,169,2,0,240,169,2,0,144,169,2,0,144,169,2,0,208,169,2,0,208,169,2,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,51,51,51,51,51,211,63,0,0,0,0,0,0,248,63,0,0,0,0,0,0,0,0,97,108,110,117,109,0,97,108,112,104,97,0,98,108,97,110,107,0,99,110,116,114,108,0,100,105,103,105,116,0,103,114,97,112,104,0,108,111,119,101,114,0,112,114,105,110,116,0,112,117,110,99,116,0,115,112,97,99,101,0,117,112,112,101,114,0,120,100,105,103,105,
-116,0,0,0,0,0,0,0,0,216,122,2,0,192,107,2,0,232,87,2,0,248,75,2,0,168,64,2,0,104,52,2,0,144,40,2,0,160,28,2,0,152,18,2,0,136,8,2,0,232,255,1,0,56,246,1,0,248,233,1,0,176,224,1,0,192,218,1,0,128,215,1,0,48,0,0,0,0,0,0,0,116,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,0,122,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,8,0,0,0,46,0,0,0,14,0,0,0,48,0,0,0,42,0,0,0,0,0,0,0,38,0,0,0,96,0,0,0,36,0,0,0,100,0,0,0,70,0,0,0,26,
-0,0,0,4,0,0,0,156,0,0,0,42,0,0,0,106,0,0,0,112,0,0,0,54,0,0,0,28,0,0,0,74,0,0,0,20,0,0,0,32,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
-8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,0,0,0,0,0,0,0,0,0,1,1,188,0,0,0,186,0,0,0,84,0,0,0,12,0,0,0,14,0,0,0,84,0,0,0,70,0,0,0,72,0,0,0,74,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,0,52,0,0,0,116,0,0,0,88,132,1,0,110,0,0,0,224,59,2,0,114,0,0,0,176,217,1,0,102,0,0,0,208,189,1,0,97,0,0,0,216,162,1,0,101,0,0,0,112,140,1,0,119,0,0,0,
-224,118,1,0,87,0,0,0,96,98,1,0,115,0,0,0,224,77,1,0,83,0,0,0,192,59,1,0,100,0,0,0,144,140,2,0,68,0,0,0,64,124,2,0,0,0,0,0,0,0,0,0,104,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,0,0,0,0,0,0,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,0,0,0,0,0,0,60,0,0,0,38,0,0,0,8,0,0,0,16,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,
-0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,
-208,63,88,168,53,205,59,78,213,63,37,117,2,154,8,27,218,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,44,212,154,230,29,167,234,63,106,222,113,138,142,228,232,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,93,220,70,3,120,11,226,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,208,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,
-0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,93,220,70,3,120,11,226,63,93,220,70,3,120,11,226,63,93,220,70,3,120,11,226,63,13,113,172,139,219,104,220,63,100,93,220,70,3,120,237,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,16,122,54,171,62,87,229,63,210,111,95,7,206,25,231,63,120,11,36,40,126,140,227,63,181,21,251,203,238,201,225,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,88,168,53,205,59,78,213,
-63,136,133,90,211,188,227,216,63,210,111,95,7,206,25,231,63,120,11,36,40,126,140,227,63,196,66,173,105,222,113,236,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,181,21,251,203,238,201,225,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,181,21,251,203,238,201,225,63,120,11,36,40,126,140,227,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,134,56,214,197,109,52,238,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,120,11,36,40,126,140,227,63,88,168,53,205,59,78,213,
-63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,166,10,70,37,117,2,222,63,0,0,0,0,0,0,224,63,88,168,53,205,59,78,213,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,13,113,172,139,219,104,220,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,106,222,113,138,142,228,232,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,
-0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,88,168,53,205,59,78,213,63,136,133,90,211,188,227,216,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,210,111,95,7,206,25,231,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,13,113,172,139,219,104,220,63,244,108,86,125,174,182,222,63,17,54,60,189,82,150,201,63,244,108,86,125,174,182,222,63,59,1,77,132,13,79,225,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,
-0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,
-0,208,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,62,232,217,172,250,92,197,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,130,115,70,148,246,6,199,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,7,240,22,72,80,252,
-220,63,162,180,55,248,194,100,214,63,88,168,53,205,59,78,213,63,13,113,172,139,219,104,220,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,208,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,208,63,88,168,53,205,59,
-78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,196,66,173,105,222,113,236,63,0,0,0,0,0,0,
-208,63,127,217,61,121,88,168,209,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,120,11,36,40,126,140,227,63,210,111,95,7,206,25,231,63,196,66,173,105,222,113,236,63,19,242,65,207,102,213,211,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,16,122,54,171,62,87,229,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,211,188,227,20,29,201,209,63,
-0,0,0,0,0,0,224,63,210,111,95,7,206,25,231,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,72,210,1,0,64,0,0,0,144,164,1,0,144,0,0,0,232,161,1,0,76,0,0,0,72,66,1,0,174,0,0,0,56,160,1,0,196,0,0,0,128,158,1,0,10,0,0,0,96,188,1,0,102,0,0,0,16,64,1,0,92,0,0,0,248,154,1,0,130,0,0,0,88,153,1,0,190,0,0,0,104,151,1,0,78,0,0,0,8,149,1,0,36,0,0,0,128,146,1,0,116,0,0,0,208,142,1,0,54,0,0,0,72,61,1,0,158,0,0,0,80,138,1,0,32,0,0,0,136,136,1,0,38,0,0,0,120,134,
-1,0,58,0,0,0,208,132,1,0,58,0,0,0,80,131,1,0,128,0,0,0,152,129,1,0,136,0,0,0,18,17,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,17,34,35,36,17,37,38,39,40,41,42,43,44,17,45,46,47,16,16,48,16,16,16,16,16,16,16,49,50,51,16,52,53,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,54,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
-17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,55,17,17,17,17,56,17,57,58,59,60,61,62,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,63,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,64,65,17,66,67,68,69,70,71,72,73,16,16,16,74,75,76,77,78,16,16,16,79,80,16,16,16,16,81,16,16,16,16,16,16,16,16,16,17,17,17,82,83,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,84,
-16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,85,16,16,16,16,86,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,87,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,88,89,90,91,16,16,16,16,
-16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,92,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,254,255,255,7,254,255,255,7,0,0,0,0,0,4,32,4,255,255,127,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,195,255,3,0,
-31,80,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,223,60,64,215,255,255,251,255,255,255,255,255,255,255,255,255,191,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,3,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,254,255,255,255,127,2,254,255,255,255,255,0,0,0,0,0,255,191,182,0,255,255,255,7,7,0,0,0,255,7,255,255,255,255,255,255,255,254,255,195,255,255,255,255,255,255,255,255,255,255,255,255,239,31,254,225,255,159,0,0,255,255,255,255,255,255,0,224,255,255,
-255,255,255,255,255,255,255,255,255,255,3,0,255,255,255,255,255,7,48,4,255,255,255,252,255,31,0,0,255,255,255,1,0,0,0,0,0,0,0,0,253,31,0,0,0,0,0,0,240,3,255,127,255,255,255,255,255,255,255,239,255,223,225,255,207,255,254,254,238,159,249,255,255,253,197,227,159,89,128,176,207,255,3,0,238,135,249,255,255,253,109,195,135,25,2,94,192,255,63,0,238,191,251,255,255,253,237,227,191,27,1,0,207,255,0,0,238,159,249,255,255,253,237,227,159,25,192,176,207,255,2,0,236,199,61,214,24,199,255,195,199,29,129,0,192,
-255,0,0,238,223,253,255,255,253,239,227,223,29,96,3,207,255,0,0,236,223,253,255,255,253,239,227,223,29,96,64,207,255,6,0,236,223,253,255,255,255,255,231,223,93,128,0,207,255,0,252,236,255,127,252,255,255,251,47,127,128,95,255,0,0,12,0,254,255,255,255,255,127,255,7,63,32,255,3,0,0,0,0,150,37,240,254,174,236,255,59,95,32,255,243,0,0,0,0,1,0,0,0,255,3,0,0,255,254,255,255,255,31,254,255,3,255,255,254,255,255,255,31,0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,249,255,3,255,255,231,193,255,255,127,64,255,
-51,255,255,255,255,191,32,255,255,255,255,255,247,255,255,255,255,255,255,255,255,255,61,127,61,255,255,255,255,255,61,255,255,255,255,61,127,61,255,127,255,255,255,255,255,255,255,61,255,255,255,255,255,255,255,255,135,0,0,0,0,255,255,0,0,255,255,255,255,255,255,255,255,255,255,31,0,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,159,255,255,254,255,255,7,255,255,255,
-255,255,255,255,255,255,199,1,0,255,223,15,0,255,255,15,0,255,255,15,0,255,223,13,0,255,255,255,255,255,255,207,255,255,1,128,16,255,3,0,0,0,0,255,3,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,7,255,255,255,255,255,255,255,255,63,0,255,255,255,31,255,15,255,1,192,255,255,255,255,63,31,0,255,255,255,255,255,15,255,255,255,3,255,3,0,0,0,0,255,255,255,15,255,255,255,255,255,255,255,127,254,255,31,0,255,3,255,3,128,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,239,255,239,15,255,
-3,0,0,0,0,255,255,255,255,255,243,255,255,255,255,255,255,191,255,3,0,255,255,255,255,255,255,63,0,255,227,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,222,111,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,63,63,255,255,255,255,63,63,255,170,255,255,255,63,255,255,255,255,255,255,223,95,220,31,207,15,255,31,220,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,128,0,0,255,31,0,0,0,0,0,0,0,0,0,0,0,0,132,252,47,62,80,189,255,243,224,67,
-0,0,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,255,255,255,255,255,255,3,0,0,255,255,255,255,255,127,255,255,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,120,12,0,255,255,255,255,191,32,255,255,255,255,255,255,255,128,0,0,255,255,127,0,127,127,127,127,127,127,127,127,255,255,255,255,0,0,0,0,0,128,0,0,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,254,3,62,31,254,255,255,255,255,255,255,255,255,
-255,127,224,254,255,255,255,255,255,255,255,255,255,255,247,224,255,255,255,255,63,254,255,255,255,255,255,255,255,255,255,255,127,0,0,255,255,255,7,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,0,0,0,0,0,0,255,255,255,255,255,63,
-255,31,255,255,255,15,0,0,255,255,255,255,255,127,240,143,255,255,255,128,255,255,255,255,255,255,255,255,255,255,0,0,0,0,128,255,252,255,255,255,255,255,255,255,255,255,255,255,255,121,15,0,255,7,0,0,0,0,0,0,0,0,0,255,187,247,255,255,255,0,0,0,255,255,255,255,255,255,15,0,255,255,255,255,255,255,255,255,15,0,255,3,0,0,252,8,255,255,255,255,255,7,255,255,255,255,7,0,255,255,255,31,255,255,255,255,255,255,247,255,0,128,255,3,0,0,0,0,255,255,255,255,255,255,127,0,255,63,255,3,255,255,127,4,255,255,
-255,255,255,255,255,127,5,0,0,56,255,255,60,0,126,126,126,0,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,7,255,3,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,255,127,248,255,255,255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255,255,255,255,255,255,255,255,255,255,255,3,0,0,0,0,127,0,248,224,255,253,127,95,219,255,255,255,255,255,255,255,255,255,255,255,255,255,3,0,0,0,248,255,255,255,255,255,255,255,255,
-255,255,255,255,63,0,0,255,255,255,255,255,255,255,255,252,255,255,255,255,255,255,0,0,0,0,0,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,255,3,254,255,255,7,254,255,255,7,192,255,255,255,255,255,255,255,255,255,255,127,252,252,252,28,0,0,0,0,255,239,255,255,127,255,255,183,255,63,255,63,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,7,0,0,0,0,0,0,0,0,255,255,255,255,255,255,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,255,255,255,31,255,255,255,255,255,255,1,0,0,0,0,0,255,255,255,127,0,0,255,255,255,7,0,0,0,0,0,0,255,255,255,63,255,255,255,255,15,255,62,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,3,0,0,0,0,0,0,0,0,0,0,63,253,255,255,255,255,191,145,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,63,0,255,255,255,3,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,192,0,0,0,0,0,0,0,0,111,240,239,254,255,255,15,0,0,0,0,0,255,
-255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,63,0,255,255,63,0,255,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,192,255,0,0,252,255,255,255,255,255,255,1,0,0,255,255,255,1,255,3,255,255,255,255,255,255,199,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,30,0,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,63,0,255,3,0,0,0,0,0,0,255,255,
-255,255,255,255,255,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,31,0,255,255,255,255,255,127,0,0,248,255,0,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,255,255,255,255,
-255,255,255,255,255,255,223,255,255,255,255,255,255,255,255,223,100,222,255,235,239,255,255,255,255,255,255,255,191,231,223,223,255,255,255,123,95,252,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255,253,255,255,247,255,255,255,247,255,255,223,255,255,255,223,255,255,127,255,255,255,127,255,255,255,253,255,255,255,253,255,255,247,207,255,255,255,255,255,255,239,255,
-255,255,150,254,247,10,132,234,150,170,150,247,247,94,255,251,255,15,238,251,255,15,0,0,0,0,0,0,0,0,18,16,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,16,16,34,35,16,36,37,38,39,40,41,42,43,16,44,45,46,17,47,48,17,17,49,17,17,17,50,51,52,53,54,55,56,57,17,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,58,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
-16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,59,16,60,61,62,63,64,65,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,66,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,67,16,16,68,16,69,70,71,16,72,16,73,16,16,16,16,74,75,76,77,16,16,78,16,79,80,16,16,16,16,81,16,16,16,16,16,16,16,16,16,16,16,16,16,82,16,16,16,16,16,16,16,16,
-16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,83,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,84,85,86,87,
-16,16,88,89,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,90,16,91,92,93,94,95,96,97,98,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,254,255,0,252,1,0,0,248,1,0,0,120,0,0,0,0,255,251,223,251,0,0,128,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,0,252,255,224,175,255,255,255,255,255,255,
-255,255,255,255,223,255,255,255,255,255,32,64,176,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,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,252,0,0,0,0,0,134,254,255,255,255,0,64,73,0,0,0,0,0,24,0,223,255,0,200,0,0,0,0,0,0,0,1,0,60,0,0,0,0,0,0,0,0,0,0,0,0,16,224,1,30,0,96,255,191,0,0,0,0,0,0,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,207,3,0,0,0,3,0,32,255,127,0,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,0,0,0,16,0,32,30,0,48,0,1,0,0,0,0,0,0,0,0,16,
-0,32,0,0,0,0,252,15,0,0,0,0,0,0,0,16,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,32,0,0,0,0,3,0,0,0,0,0,0,0,0,16,0,32,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,255,7,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,255,0,0,0,0,0,0,0,16,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,63,2,0,0,0,0,0,0,0,0,0,4,0,0,0,0,16,0,0,0,0,0,0,128,0,128,192,223,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,254,255,255,255,0,252,255,255,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,192,255,223,255,7,0,0,0,0,0,0,0,0,0,0,128,6,0,252,0,0,24,62,0,0,128,191,
-0,204,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,96,255,255,255,31,0,0,255,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,24,0,0,0,0,0,0,0,0,0,56,0,0,0,0,16,0,0,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,254,127,47,0,0,255,3,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,255,255,255,255,0,0,0,192,0,0,0,0,0,0,0,0,1,0,224,159,0,0,0,0,127,
-63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,0,252,255,255,255,31,0,0,0,0,0,12,0,0,0,0,0,0,64,0,12,240,0,0,0,0,0,0,192,248,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,255,0,255,255,255,33,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,127,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,3,224,0,224,0,224,0,96,128,248,255,255,255,252,255,255,255,255,255,127,31,252,241,127,255,127,0,0,255,255,255,3,0,0,255,255,255,255,1,0,123,3,208,193,175,66,0,12,31,188,255,255,0,0,0,0,0,2,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,255,255,255,127,0,0,0,255,7,0,0,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,252,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,255,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,0,0,0,0,0,0,0,0,0,0,224,135,3,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,127,255,15,0,0,0,0,0,0,0,0,255,255,255,251,255,255,255,255,255,255,255,255,255,255,15,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,255,15,30,255,255,255,1,252,193,224,0,0,0,0,0,0,0,0,0,0,0,30,1,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,255,255,255,255,
-15,0,0,0,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,0,0,0,0,0,0,192,0,224,0,0,0,0,0,0,0,0,0,0,0,128,15,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,127,0,3,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,8,0,0,0,15,255,3,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,16,192,
-0,0,255,255,3,7,0,0,0,0,0,248,0,0,0,0,8,128,0,0,0,0,0,0,0,0,0,0,8,0,255,63,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,128,11,0,0,0,0,0,0,0,128,2,0,0,192,0,0,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,255,255,
-255,3,127,0,255,255,255,255,247,255,127,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,254,255,0,252,1,0,0,248,1,0,0,248,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,0,48,135,255,255,255,255,255,143,255,0,0,0,0,0,0,224,255,255,7,255,15,0,0,0,0,0,0,255,255,255,255,255,63,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,143,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,255,0,255,1,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,254,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,63,252,255,63,0,0,0,3,0,0,0,0,0,0,254,3,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,225,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,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,7,0,0,0,0,0,
-0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,255,255,255,255,127,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,127,0,255,255,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,0,0,0,2,0,0,8,0,0,0,8,0,0,32,
-0,0,0,32,0,0,128,0,0,0,128,0,0,0,2,0,0,0,2,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,255,255,255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,127,254,127,254,255,254,255,0,0,0,0,255,7,255,255,255,127,255,255,255,255,255,255,255,15,255,255,255,255,255,7,0,0,0,0,0,0,0,0,192,255,255,255,7,0,255,255,255,255,255,7,255,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,1,0,191,255,255,255,255,255,255,255,255,31,255,255,15,0,255,
-255,255,255,223,7,0,0,255,255,1,0,255,255,255,255,255,255,255,127,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,30,255,255,255,255,255,255,255,63,15,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,255,255,255,255,255,255,255,255,225,255,0,0,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,2,
-0,0,0,4,0,0,0,0,0,0,0,80,197,1,0,248,168,1,0,160,146,1,0,200,124,1,0,72,103,1,0,168,82,1,0,32,64,1,0,232,144,2,0,160,128,2,0,128,112,2,0,48,93,2,0,224,79,2,0,168,68,2,0,32,56,2,0,144,44,2,0,160,32,2,0,96,22,2,0,248,10,2,0,0,3,2,0,64,250,1,0,96,237,1,0,152,227,1,0,248,219,1,0,240,216,1,0,168,213,1,0,136,210,1,0,200,207,1,0,64,204,1,0,176,200,1,0,32,197,1,0,240,191,1,0,168,188,1,0,104,186,1,0,96,184,1,0,152,182,1,0,16,180,1,0,136,177,1,0,200,174,1,0,216,171,1,0,152,168,1,0,168,164,1,0,32,162,1,0,88,
-160,1,0,192,158,1,0,176,156,1,0,24,155,1,0,152,153,1,0,160,151,1,0,32,149,1,0,136,146,1,0,216,142,1,0,240,139,1,0,88,138,1,0,144,136,1,0,128,134,1,0,216,132,1,0,88,131,1,0,160,129,1,0,88,127,1,0,168,124,1,0,88,120,1,0,64,118,1,0,32,116,1,0,160,114,1,0,192,112,1,0,56,111,1,0,88,109,1,0,128,107,1,0,176,105,1,0,40,103,1,0,216,99,1,0,216,97,1,0,144,95,1,0,96,93,1,0,224,91,1,0,16,90,1,0,72,88,1,0,152,86,1,0,152,84,1,0,128,82,1,0,32,79,1,0,72,77,1,0,136,75,1,0,24,74,1,0,88,72,1,0,208,70,1,0,56,69,1,0,152,
-67,1,0,24,66,1,0,224,63,1,0,24,61,1,0,0,59,1,0,40,57,1,0,200,55,1,0,64,54,1,0,8,53,1,0,240,51,1,0,136,147,2,0,0,146,2,0,168,144,2,0,184,141,2,0,24,140,2,0,88,138,2,0,0,137,2,0,120,135,2,0,64,134,2,0,232,132,2,0,120,131,2,0,200,129,2,0,80,128,2,0,64,125,2,0,168,123,2,0,72,122,2,0,240,120,2,0,152,119,2,0,56,118,2,0,248,116,2,0,200,115,2,0,80,114,2,0,96,112,2,0,120,109,2,0,56,108,2,0,248,106,2,0,232,105,2,0,136,104,2,0,88,102,2,0,240,100,2,0,168,99,2,0,216,94,2,0,232,92,2,0,48,90,2,0,184,88,2,0,104,
-87,2,0,96,86,2,0,64,85,2,0,64,84,2,0,56,83,2,0,56,82,2,0,216,80,2,0,208,79,2,0,176,77,2,0,128,76,2,0,128,75,2,0,168,74,2,0,168,73,2,0,216,72,2,0,232,71,2,0,0,0,0,0,8,0,0,0,0,0,0,0,160,0,0,0,170,0,0,0,32,0,0,0,58,0,0,0,70,0,0,0,12,0,0,0,34,0,0,0,36],"i8",L,l.J);D([64,0,0,0,174,0,0,0,66,0,0,0,140,0,0,0,34,0,0,0,178,0,0,0,0,0,0,0,0,0,0,0,106,0,0,0,0,0,0,0,62,0,0,0,44,0,0,0,12,0,0,0,66,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,
-0,0,255,255,255,255,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,0,0,0,0,105,108,108,45,99,111,110,100,105,116,105,111,110,101,100,0,12,0,8,0,140,0,8,0,76,0,8,0,204,0,8,0,44,0,8,0,172,0,8,0,108,0,8,0,236,0,8,0,28,0,8,0,156,0,8,0,92,0,8,0,220,0,8,0,60,0,8,0,188,0,8,0,124,0,8,0,252,0,8,0,2,0,8,0,130,0,8,0,66,0,8,0,194,0,8,0,34,0,8,0,162,0,8,0,98,0,8,0,226,0,8,0,18,0,8,0,146,0,8,0,82,0,8,0,210,0,8,0,50,0,8,0,178,0,8,0,114,0,8,0,242,0,8,0,10,0,8,0,138,0,8,0,74,0,8,0,202,0,8,0,42,0,8,0,170,
-0,8,0,106,0,8,0,234,0,8,0,26,0,8,0,154,0,8,0,90,0,8,0,218,0,8,0,58,0,8,0,186,0,8,0,122,0,8,0,250,0,8,0,6,0,8,0,134,0,8,0,70,0,8,0,198,0,8,0,38,0,8,0,166,0,8,0,102,0,8,0,230,0,8,0,22,0,8,0,150,0,8,0,86,0,8,0,214,0,8,0,54,0,8,0,182,0,8,0,118,0,8,0,246,0,8,0,14,0,8,0,142,0,8,0,78,0,8,0,206,0,8,0,46,0,8,0,174,0,8,0,110,0,8,0,238,0,8,0,30,0,8,0,158,0,8,0,94,0,8,0,222,0,8,0,62,0,8,0,190,0,8,0,126,0,8,0,254,0,8,0,1,0,8,0,129,0,8,0,65,0,8,0,193,0,8,0,33,0,8,0,161,0,8,0,97,0,8,0,225,0,8,0,17,0,8,0,145,0,8,
-0,81,0,8,0,209,0,8,0,49,0,8,0,177,0,8,0,113,0,8,0,241,0,8,0,9,0,8,0,137,0,8,0,73,0,8,0,201,0,8,0,41,0,8,0,169,0,8,0,105,0,8,0,233,0,8,0,25,0,8,0,153,0,8,0,89,0,8,0,217,0,8,0,57,0,8,0,185,0,8,0,121,0,8,0,249,0,8,0,5,0,8,0,133,0,8,0,69,0,8,0,197,0,8,0,37,0,8,0,165,0,8,0,101,0,8,0,229,0,8,0,21,0,8,0,149,0,8,0,85,0,8,0,213,0,8,0,53,0,8,0,181,0,8,0,117,0,8,0,245,0,8,0,13,0,8,0,141,0,8,0,77,0,8,0,205,0,8,0,45,0,8,0,173,0,8,0,109,0,8,0,237,0,8,0,29,0,8,0,157,0,8,0,93,0,8,0,221,0,8,0,61,0,8,0,189,0,8,0,125,
-0,8,0,253,0,8,0,19,0,9,0,19,1,9,0,147,0,9,0,147,1,9,0,83,0,9,0,83,1,9,0,211,0,9,0,211,1,9,0,51,0,9,0,51,1,9,0,179,0,9,0,179,1,9,0,115,0,9,0,115,1,9,0,243,0,9,0,243,1,9,0,11,0,9,0,11,1,9,0,139,0,9,0,139,1,9,0,75,0,9,0,75,1,9,0,203,0,9,0,203,1,9,0,43,0,9,0,43,1,9,0,171,0,9,0,171,1,9,0,107,0,9,0,107,1,9,0,235,0,9,0,235,1,9,0,27,0,9,0,27,1,9,0,155,0,9,0,155,1,9,0,91,0,9,0,91,1,9,0,219,0,9,0,219,1,9,0,59,0,9,0,59,1,9,0,187,0,9,0,187,1,9,0,123,0,9,0,123,1,9,0,251,0,9,0,251,1,9,0,7,0,9,0,7,1,9,0,135,0,9,
-0,135,1,9,0,71,0,9,0,71,1,9,0,199,0,9,0,199,1,9,0,39,0,9,0,39,1,9,0,167,0,9,0,167,1,9,0,103,0,9,0,103,1,9,0,231,0,9,0,231,1,9,0,23,0,9,0,23,1,9,0,151,0,9,0,151,1,9,0,87,0,9,0,87,1,9,0,215,0,9,0,215,1,9,0,55,0,9,0,55,1,9,0,183,0,9,0,183,1,9,0,119,0,9,0,119,1,9,0,247,0,9,0,247,1,9,0,15,0,9,0,15,1,9,0,143,0,9,0,143,1,9,0,79,0,9,0,79,1,9,0,207,0,9,0,207,1,9,0,47,0,9,0,47,1,9,0,175,0,9,0,175,1,9,0,111,0,9,0,111,1,9,0,239,0,9,0,239,1,9,0,31,0,9,0,31,1,9,0,159,0,9,0,159,1,9,0,95,0,9,0,95,1,9,0,223,0,9,0,
-223,1,9,0,63,0,9,0,63,1,9,0,191,0,9,0,191,1,9,0,127,0,9,0,127,1,9,0,255,0,9,0,255,1,9,0,0,0,7,0,64,0,7,0,32,0,7,0,96,0,7,0,16,0,7,0,80,0,7,0,48,0,7,0,112,0,7,0,8,0,7,0,72,0,7,0,40,0,7,0,104,0,7,0,24,0,7,0,88,0,7,0,56,0,7,0,120,0,7,0,4,0,7,0,68,0,7,0,36,0,7,0,100,0,7,0,20,0,7,0,84,0,7,0,52,0,7,0,116,0,7,0,3,0,8,0,131,0,8,0,67,0,8,0,195,0,8,0,35,0,8,0,163,0,8,0,99,0,8,0,227,0,8,0,184,40,0,0,88,102,0,0,1,1,0,0,30,1,0,0,15,0,0,0,0,0,0,0,0,0,5,0,16,0,5,0,8,0,5,0,24,0,5,0,4,0,5,0,20,0,5,0,12,0,5,0,28,0,
-5,0,2,0,5,0,18,0,5,0,10,0,5,0,26,0,5,0,6,0,5,0,22,0,5,0,14,0,5,0,30,0,5,0,1,0,5,0,17,0,5,0,9,0,5,0,25,0,5,0,5,0,5,0,21,0,5,0,13,0,5,0,29,0,5,0,3,0,5,0,19,0,5,0,11,0,5,0,27,0,5,0,7,0,5,0,23,0,5,0,80,45,0,0,208,102,0,0,0,0,0,0,30,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,72,103,0,0,0,0,0,0,19,0,0,0,7,0,0,0,0,0,0,0,46,0,0,0,6,0,0,0,80,0,0,0,18,0,0,0,34,0,0,0,82,0,0,0,22,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,0,0,0,0,28,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,52,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,0,0,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,176,193,0,0,0,0,0,0,0,0,0,0,0,0,0,160,1,0,0,16,0,0,0,1,0,0,0,0,0,0,0,0,16,0,2,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,176,193,0,0,0,0,0,0,0,0,0,0,0,16,64,144,37,0,0,147,0,0,0,1,0,0,0,0,0,0,0,0,32,3,2,0,0,0,0,0,0,0,0,0,0,16,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,0,0,16,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,144,195,0,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,16,0,0,0,0,0,0,0,0,0,0,0,0,16,64,128,101,0,0,8,0,0,0,1,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,0,0,0,0,5,0,0,0,0,0,0,0,56,0,0,0,32,0,0,0,8,0,0,0,90,0,0,0,86,0,0,0,32,0,0,0,232,22,2,0,96,69,2,0,248,56,2,0,64,45,2,0,64,33,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,0,0,
-112,0,0,0,2,0,0,0,0,0,0,0,50,0,0,0,0,0,0,0,118,0,0,0,108,0,0,0,166,0,0,0,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,102,0,0,0,110,0,0,0,14,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,14,0,0,0,2,0,0,0,2,0,0,0,50,0,0,0,28,0,0,0,14,0,0,0,8,124,1,0,232,119,1,0,248,117,1,0,104,65,3,0,88,114,1,0,136,112,1,0,240,110,1,0,16,109,1,0,104,65,3,0,32,107,1,0,72,105,1,0,104,65,3,0,128,102,1,0,112,99,1,0,128,97,1,0,40,95,1,0,24,93,1,0,136,91,1,0,184,89,1,0,24,88,1,0,56,86,1,0,80,84,1,0,32,82,
-1,0,208,78,1,0,24,77,1,0,80,75,1,0,120,74,1,0,32,72,1,0,168,70,1,0,8,69,1,0,104,67,1,0,192,65,1,0,112,63,1,0,200,60,1,0,104,65,3,0,144,58,1,0,240,56,1,0,136,55,1,0,232,53,1,0,104,65,3,0,224,52,1,0,208,51,1,0,72,147,2,0,216,145,2,0,200,60,1,0,104,65,3,0,96,144,2,0,128,141,2,0,160,139,2,0,240,137,2,0,112,136,2,0,72,135,2,0,32,134,2,0,200,132,2,0,88,131,2,0,168,129,2,0,48,128,2,0,104,65,3,0,8,125,2,0,120,123,2,0,24,122,2,0,184,120,2,0,104,119,2,0,104,65,3,0,16,118,2,0,216,116,2,0,176,115,2,0,56,114,
-2,0,64,112,2,0,96,109,2,0,40,108,2,0,216,106,2,0,184,105,2,0,200,104,2,0,8,103,2,0,224,100,2,0,200,60,1,0,104,65,3,0,144,99,2,0,192,94,2,0,200,92,2,0,24,88,1,0,104,65,3,0,248,89,2,0,144,88,2,0,80,87,2,0,48,86,2,0,56,85,2,0,48,84,2,0,40,83,2,0,240,81,2,0,208,80,2,0,192,79,2,0,24,88,1,0,104,65,3,0,128,77,2,0,112,76,2,0,112,75,2,0,144,74,2,0,232,73,2,0,192,72,2,0,208,71,2,0,216,70,2,0,200,60,1,0,104,65,3,0,168,69,2,0,128,68,2,0,88,66,2,0,32,65,2,0,24,64,2,0,240,62,2,0,216,61,2,0,8,61,2,0,0,60,2,0,176,
-58,2,0,128,57,2,0,200,60,1,0,104,65,3,0,240,55,2,0,8,54,2,0,104,65,3,0,0,53,2,0,208,51,2,0,224,50,2,0,208,49,2,0,0,49,2,0,24,48,2,0,24,47,2,0,176,45,2,0,96,44,2,0,104,65,3,0,144,42,2,0,104,65,3,0,88,41,2,0,232,39,2,0,224,38,2,0,224,37,2,0,0,37,2,0,8,36,2,0,200,60,1,0,104,65,3,0,240,34,2,0,104,65,3,0,184,33,2,0,128,32,2,0,80,30,2,0,56,29,2,0,80,28,2,0,168,27,2,0,240,26,2,0,24,88,1,0,104,65,3,0,24,26,2,0,104,65,3,0,80,25,2,0,56,24,2,0,72,23,2,0,56,22,2,0,64,20,2,0,48,19,2,0,32,18,2,0,104,65,3,0,0,17,
-2,0,128,15,2,0,112,14,2,0,184,13,2,0,232,12,2,0,240,11,2,0,208,10,2,0,168,9,2,0,104,65,3,0,240,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,125,2,0,136,109,2,0,64,90,2,0,0,0,0,0,0,0,0,0,4,0,0,0,224,77,2,0,0,0,0,0,0,0,0,0,128,66,2,0,136,109,2,0,64,90,2,0,0,0,0,0,40,54,2,0,5,0,0,0,224,77,2,0,0,0,0,0,192,42,2,0,112,30,2,0,136,109,2,0,88,20,2,0,0,0,0,0,0,0,0,0,6,0,0,0,224,77,2,0,184,9,2,0,0,0,0,0,96,1,2,0,136,109,2,0,88,20,2,0,0,0,0,0,40,54,2,0,7,0,0,0,224,77,2,0,184,9,2,0,192,42,2,0,104,248,1,0,216,235,
-1,0,88,20,2,0,0,0,0,0,0,0,0,0,10,0,0,0,112,226,1,0,184,9,2,0,0,0,0,0,56,219,1,0,216,235,1,0,88,20,2,0,0,0,0,0,192,42,2,0,11,0,0,0,112,226,1,0,184,9,2,0,192,42,2,0,240,215,1,0,216,235,1,0,240,212,1,0,0,0,0,0,0,0,0,0,8,0,0,0,112,226,1,0,0,0,0,0,0,0,0,0,208,209,1,0,216,235,1,0,240,212,1,0,0,0,0,0,192,42,2,0,9,0,0,0,112,226,1,0,0,0,0,0,192,42,2,0,56,207,1,0,56,207,1,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,128,203,1,0,0,0,0,0,0,0,0,0,224,199,1,0,56,207,1,0,184,9,2,0,0,0,0,0,0,0,0,0,14,0,0,0,128,203,1,0,184,
-9,2,0,0,0,0,0,56,196,1,0,56,207,1,0,184,9,2,0,0,0,0,0,40,54,2,0,15,0,0,0,128,203,1,0,184,9,2,0,192,42,2,0,224,190,1,0,56,207,1,0,0,0,0,0,0,0,0,0,40,54,2,0,13,0,0,0,128,203,1,0,0,0,0,0,192,42,2,0,248,187,1,0,248,187,1,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,224,77,2,0,0,0,0,0,0,0,0,0,248,185,1,0,248,187,1,0,184,9,2,0,0,0,0,0,0,0,0,0,18,0,0,0,224,77,2,0,184,9,2,0,0,0,0,0,200,183,1,0,248,187,1,0,184,9,2,0,0,0,0,0,40,54,2,0,19,0,0,0,224,77,2,0,184,9,2,0,192,42,2,0,200,181,1,0,248,187,1,0,0,0,0,0,112,179,1,
-0,0,0,0,0,20,0,0,0,224,77,2,0,0,0,0,0,0,0,0,0,216,176,1,0,248,187,1,0,184,9,2,0,112,179,1,0,0,0,0,0,22,0,0,0,224,77,2,0,184,9,2,0,0,0,0,0,0,174,1,0,248,187,1,0,184,9,2,0,112,179,1,0,40,54,2,0,23,0,0,0,224,77,2,0,184,9,2,0,192,42,2,0,80,171,1,0,248,187,1,0,0,0,0,0,112,179,1,0,40,54,2,0,21,0,0,0,224,77,2,0,0,0,0,0,192,42,2,0,32,168,1,0,248,187,1,0,0,0,0,0,0,0,0,0,40,54,2,0,17,0,0,0,224,77,2,0,0,0,0,0,192,42,2,0,16,164,1,0,144,161,1,0,184,9,2,0,0,0,0,0,0,0,0,0,26,0,0,0,112,226,1,0,184,9,2,0,0,0,0,0,
-232,159,1,0,144,161,1,0,184,9,2,0,0,0,0,0,192,42,2,0,27,0,0,0,112,226,1,0,184,9,2,0,192,42,2,0,64,158,1,0,144,161,1,0,0,0,0,0,0,0,0,0,192,42,2,0,25,0,0,0,112,226,1,0,0,0,0,0,192,42,2,0,96,156,1,0,144,161,1,0,184,154,1,0,0,0,0,0,0,0,0,0,24,0,0,0,112,226,1,0,0,0,0,0,0,0,0,0,16,153,1,0,48,151,1,0,184,9,2,0,0,0,0,0,0,0,0,0,30,0,0,0,112,226,1,0,184,9,2,0,0,0,0,0,200,148,1,0,48,151,1,0,184,9,2,0,0,0,0,0,192,42,2,0,31,0,0,0,112,226,1,0,184,9,2,0,192,42,2,0,24,146,1,0,48,151,1,0,0,0,0,0,0,0,0,0,192,42,2,
-0,29,0,0,0,112,226,1,0,0,0,0,0,192,42,2,0,112,142,1,0,48,151,1,0,184,154,1,0,0,0,0,0,0,0,0,0,28,0,0,0,112,226,1,0,0,0,0,0,0,0,0,0,144,139,1,0,144,139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,216,137,1,0,0,0,0,0,0,0,0,0,48,136,1,0,16,134,1,0,184,9,2,0,0,0,0,0,0,0,0,0,2,0,0,0,112,226,1,0,184,9,2,0,0,0,0,0,136,132,1,0,16,134,1,0,184,9,2,0,0,0,0,0,192,42,2,0,3,0,0,0,112,226,1,0,184,9,2,0,192,42,2,0,224,130,1,0,16,134,1,0,0,0,0,0,0,0,0,0,192,42,2,0,1,0,0,0,112,226,1,0,0,0,0,0,192,42,2,0,48,129,1,0,16,134,
-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,226,1,0,0,0,0,0,0,0,0,0,0,127,1,0,32,124,1,0,8,120,1,0,0,0,0,0,192,42,2,0,33,0,0,0,112,226,1,0,0,0,0,0,192,42,2,0,16,118,1,0,224,115,1,0,0,0,0,0,0,0,0,0,0,0,0,0,34,0,0,0,216,137,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,18,0,0,0,34,0,0,0,184,0,0,0,22,0,0,0,48,0,0,0,32,57,1,0,184,55,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,18,0,0,0,34,0,0,0,52,0,0,0,0,0,0,0,38,0,0,0,
-100,111,116,32,112,105,99,32,112,108,117,103,105,110,58,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,0,0,0,134,0,0,0,0,0,0,0,0,0,0,0,40,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,96,0,0,0,24,0,0,0,10,0,0,0,68,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,
-0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,180,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,49,1,83,0,127,1,48,1,105,0,120,1,255,0,129,1,83,2,130,1,131,1,132,1,133,1,134,1,84,2,135,1,136,1,137,1,86,2,138,1,87,2,139,1,140,1,142,1,221,1,143,1,89,2,144,1,91,2,145,1,146,1,147,1,96,2,148,1,99,2,150,1,105,2,151,1,104,2,152,1,153,1,156,1,111,2,157,1,114,2,159,1,117,2,166,1,128,2,167,1,168,1,169,1,131,2,172,1,173,1,174,1,136,2,175,1,176,1,177,1,138,2,178,1,139,2,183,1,146,
-2,184,1,185,1,188,1,189,1,196,1,198,1,196,1,197,1,197,1,198,1,199,1,201,1,199,1,200,1,200,1,201,1,202,1,204,1,202,1,203,1,203,1,204,1,241,1,243,1,241,1,242,1,242,1,243,1,244,1,245,1,246,1,149,1,247,1,191,1,32,2,158,1,134,3,172,3,136,3,173,3,137,3,174,3,138,3,175,3,140,3,204,3,142,3,205,3,143,3,206,3,153,3,69,3,153,3,190,31,163,3,194,3,247,3,248,3,250,3,251,3,96,30,155,30,223,0,223,0,158,30,223,0,89,31,81,31,91,31,83,31,93,31,85,31,95,31,87,31,188,31,179,31,204,31,195,31,236,31,229,31,252,31,243,31,
-58,2,101,44,59,2,60,2,61,2,154,1,62,2,102,44,65,2,66,2,67,2,128,1,68,2,137,2,69,2,140,2,244,3,184,3,249,3,242,3,253,3,123,3,254,3,124,3,255,3,125,3,192,4,207,4,38,33,201,3,42,33,107,0,43,33,229,0,50,33,78,33,131,33,132,33,96,44,97,44,98,44,107,2,99,44,125,29,100,44,125,2,109,44,81,2,110,44,113,2,111,44,80,2,112,44,82,2,114,44,115,44,117,44,118,44,126,44,63,2,127,44,64,2,242,44,243,44,125,167,121,29,139,167,140,167,141,167,101,2,170,167,102,2,199,16,39,45,205,16,45,45,118,3,119,3,156,3,181,0,146,3,
-208,3,152,3,209,3,166,3,213,3,160,3,214,3,154,3,240,3,161,3,241,3,149,3,245,3,207,3,215,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,1,0,
-0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,153,153,153,153,153,217,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,45,0,0,1,0,0,0,1,0,
-0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,
-51,51,51,51,51,227,63,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,24,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,128,102,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,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,128,102,64,154,153,153,153,153,153,217,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,128,102,64,123,20,174,71,225,122,228,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,
-20,174,71,225,122,228,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,51,51,51,
-51,51,211,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,128,70,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,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,1,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,
-0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,128,70,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,158,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,67,68,65,84,65,91,0,0,96,0,0,0,144,0,0,0,128,0,0,0,144,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,56,0,0,0,52,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,249,1,0,240,236,1,0,32,227,1,0,200,219,1,0,72,216,1,0,112,213,1,0,56,210,1,0,152,207,1,0,0,204,1,0,104,200,1,0,176,
-196,1,0,176,191,1,0,88,188,1,0,64,186,1,0,8,184,1,0,24,182,1,0,208,179,1,0,40,177,1,0,72,174,1,0,168,171,1,0,120,168,1,0,0,0,0,0,2,3,4,5,6,7,8,0,0,9,10,11,12,13,14,15,16,17,0,0,0,0,0,0,0,0,0,0,0,0,18,19,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,23,0,0,0,0,0,0,0,0,0,0,0,0,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,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,4,254,255,255,135,254,255,255,7,0,0,0,0,0,0,0,0,255,255,127,255,255,255,127,255,255,255,255,255,255,255,243,127,254,253,255,
-255,255,255,255,127,255,255,255,255,255,255,255,255,15,224,255,255,255,255,49,252,255,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,1,0,248,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,215,255,255,251,255,255,255,255,127,127,84,253,255,15,0,254,223,255,255,255,255,255,255,255,255,254,223,255,255,255,255,3,0,255,255,255,255,255,255,159,25,255,255,255,207,63,3,0,0,0,0,0,0,254,255,255,255,127,2,254,255,255,255,127,0,0,0,0,0,0,0,0,0,255,255,255,7,7,0,0,0,0,0,254,255,255,7,254,
-7,0,0,0,0,254,255,255,255,255,255,255,255,255,124,255,127,47,0,96,0,0,0,224,255,255,255,255,255,255,35,0,0,0,255,3,0,0,0,224,159,249,255,255,253,197,3,0,0,0,176,3,0,3,0,224,135,249,255,255,253,109,3,0,0,0,94,0,0,28,0,224,175,251,255,255,253,237,35,0,0,0,0,1,0,0,0,224,159,249,255,255,253,205,35,0,0,0,176,3,0,0,0,224,199,61,214,24,199,191,3,0,0,0,0,0,0,0,0,224,223,253,255,255,253,239,3,0,0,0,0,3,0,0,0,224,223,253,255,255,253,239,3,0,0,0,64,3,0,0,0,224,223,253,255,255,253,255,3,0,0,0,0,3,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,127,13,0,63,0,0,0,0,0,0,0,150,37,240,254,174,108,13,32,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,254,255,255,255,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,255,255,255,255,63,0,255,255,255,255,127,0,237,218,7,0,0,0,0,80,1,80,49,130,171,98,44,0,0,0,0,64,0,201,128,245,7,0,0,0,0,8,1,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,3,255,255,63,63,255,
-255,255,255,63,63,255,170,255,255,255,63,255,255,255,255,255,255,223,95,220,31,207,15,255,31,220,31,0,0,0,0,64,76,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,254,3,0,0,254,255,255,255,255,255,255,255,255,255,31,0,254,255,255,255,255,255,255,255,255,255,255,7,224,255,255,255,255,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,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,255,7,254,255,255,135,254,255,255,7,0,0,0,0,0,0,128,0,255,255,127,255,255,255,127,255,255,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,1,0,248,3,0,3,0,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,3,0,0,0,192,215,255,255,251,255,255,255,255,127,127,84,253,255,15,0,254,223,255,255,255,255,255,255,255,255,254,223,255,255,255,255,123,0,255,255,255,255,255,255,159,25,255,255,255,207,63,3,0,0,0,0,0,0,254,
-255,255,255,127,2,254,255,255,255,127,0,254,255,251,255,255,187,22,0,255,255,255,7,7,0,0,0,0,0,254,255,255,7,255,255,7,0,255,3,255,255,255,255,255,255,255,255,255,124,255,127,239,255,255,61,255,3,238,255,255,255,255,255,255,243,255,63,30,255,207,255,0,0,238,159,249,255,255,253,197,211,159,57,128,176,207,255,3,0,228,135,249,255,255,253,109,211,135,57,0,94,192,255,31,0,238,175,251,255,255,253,237,243,191,59,0,0,193,255,0,0,238,159,249,255,255,253,205,243,143,57,192,176,195,255,0,0,236,199,61,214,24,
-199,191,195,199,61,128,0,128,255,0,0,238,223,253,255,255,253,239,195,223,61,96,0,195,255,0,0,236,223,253,255,255,253,239,195,223,61,96,64,195,255,0,0,236,223,253,255,255,253,255,195,207,61,128,0,195,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,127,255,7,255,127,255,3,0,0,0,0,150,37,240,254,174,108,255,59,95,63,255,3,0,0,0,0,0,0,0,3,255,3,160,194,255,254,255,255,255,3,254,255,223,15,191,254,255,63,254,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,255,31,2,0,0,
-0,160,0,0,0,254,255,62,0,254,255,255,255,255,255,255,255,255,255,31,102,254,255,255,255,255,255,255,255,255,255,255,119,25,3,26,27,28,29,30,0,0,31,32,33,34,35,36,37,16,17,0,0,0,0,0,0,0,0,0,0,0,0,18,19,38,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,23,0,0,0,0,0,0,0,0,0,0,0,0,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,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,0,0,0,0,0,0,0,0,0,0,0,44,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,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,46,57,57,0,0,0,0,0,154,153,153,153,153,153,169,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0,98,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,28,0,0,0,114,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,0,0,0,30,0,0,0,76,0,0,0,88,0,0,0,68,0,0,0,20,0,0,0,24,0,0,0,126,0,0,0,146,0,0,0,32,0,0,0,96,0,0,0,24,0,0,0,26,0,0,0,16,0,0,0,4,0,0,0,22,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,
-3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,
-22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,38,0,0,0,96,0,0,0,36,0,0,0,100,0,0,0,70,0,0,0,26,0,0,0,4,0,0,0,156,0,0,0,42,0,0,0,106,0,0,0,112,0,0,0,54,0,0,0,28,0,0,0,74,0,0,0,10,0,0,0,24,0,0,0,1],"i8",L,l.J+10256);D([21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,
-27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,
-22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,208,1,0,8,0,0,0,3,0,0,0,144,204,1,0,200,201,1,0,11,0,0,0,6,0,0,0,96,197,1,0,64,192,1,0,2,0,0,0,1,0,0,0,0,189,1,0,144,186,1,0,4,0,0,0,2,0,0,0,136,184,1,0,192,182,1,0,4,0,0,0,4,0,0,0,80,180,1,0,216,177,1,0,5,0,0,0,5,0,0,0,56,175,1,0,80,172,1,0,4,0,0,0,7,0,0,0,24,169,1,0,72,165,1,0,5,0,0,0,9,
-0,0,0,96,162,1,0,224,159,1,0,4,0,0,0,10,0,0,0,240,158,1,0,88,156,1,0,4,0,0,0,12,0,0,0,80,155,1,0,1,208,209,210,211,212,213,214,215,216,217,0,0,0,0,0,32,0,0,0,9,0,0,0,10,0,0,0,13,0,0,0,11,0,0,0,12,0,0,0,133,0,0,0,0,32,0,0,1,32,0,0,2,32,0,0,3,32,0,0,4,32,0,0,5,32,0,0,6,32,0,0,8,32,0,0,9,32,0,0,10,32,0,0,40,32,0,0,41,32,0,0,95,32,0,0,0,48,0,0,0,0,0,0,38,0,0,0,96,0,0,0,36,0,0,0,100,0,0,0,70,0,0,0,26,0,0,0,4,0,0,0,156,0,0,0,42,0,0,0,106,0,0,0,112,0,0,0,54,0,0,0,28,0,0,0,74,0,0,0,20,0,0,0,32,0,0,0,1,0,
-0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,
-5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,0,0,0,0,0,0,0,0,0,1,1,188,0,0,0,186,0,0,0,84,0,0,0,12,0,0,0,14,0,0,0,84,0,0,0,70,0,0,0,72,0,0,0,74,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,42,0,0,0,4,0,0,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,40,0,0,0,108,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,1,0,0,48,
-1,0,0,176,0,0,0,0,0,0,0,120,109,108,61,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,88,77,76,47,49,57,57,56,47,110,97,109,101,115,112,97,99,101,0,0,0,0,0,0,0,0,56,227,1,0,18,0,0,0,208,219,1,0,66,0,0,0,1,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,3,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,29,30,31,32,33,34,35,36,37,38,0,0,25,17,18,19,21,32,49,78,29,30,96,31,1,50,86,25,25,25,2,25,52,51,49,198,214,4,104,58,32,55,32,71,32,63,32,32,93,32,32,5,6,87,88,52,4,7,8,9,10,11,
-12,13,80,94,95,4,85,98,5,6,101,80,103,89,7,8,9,10,11,12,13,105,4,83,55,106,107,54,25,17,18,19,21,57,60,4,5,6,58,84,65,0,7,8,9,10,11,12,13,5,6,0,90,0,0,7,8,9,10,11,12,13,4,39,41,43,0,46,0,61,0,0,0,0,0,4,5,6,0,63,0,0,7,8,9,10,11,12,13,5,6,0,0,0,0,7,8,9,10,11,12,13,4,0,71,0,0,66,75,0,0,0,0,0,0,4,5,6,0,76,77,68,7,8,9,10,11,12,13,5,6,4,0,0,0,7,8,9,10,11,12,13,0,0,0,5,6,0,0,0,0,7,8,9,10,11,12,13,38,40,42,44,45,47,48,0,0,0,0,0,0,0,0,0,38,40,42,45,0,0,0,0,0,2,3,3,1,1,2,1,1,1,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,2,1,1,2,0,6,1,3,3,3,3,1,0,1,2,3,0,4,1,2,3,0,4,0,4,0,4,0,3,2,1,2,1,2,1,0,0,0,0,0,0,0,39,40,40,40,41,42,42,43,43,43,43,43,43,43,43,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,58,59,59,61,60,62,62,62,62,62,63,63,64,64,64,66,65,67,67,67,69,68,70,68,71,68,72,68,73,73,74,74,75,75,0,0,0,0,0,0,184,255,184,255,239,255,191,0,246,255,255,255,38,0,0,0,42,0,1,0,41,0,184,255,184,255,2,0,44,0,184,255,184,255,184,255,184,255,184,255,254,255,96,0,184,255,22,0,14,0,184,255,191,255,184,255,184,255,185,
-255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,0,0,0,0,0,0,11,0,184,255,169,0,8,0,184,255,184,255,6,0,184,255,184,255,184,255,184,255,184,255,184,255,184,255,3,0,169,0,184,255,169,0,169,0,169,0,169,0,169,0,169,0,169,0,184,255,250,255,184,255,5,0,247,255,184,255,184,255,184,255,184,255,169,0,169,0,169,0,169,0,10,0,32,0,9,0,60,0,15,0,73,0,12,0,100,0,113,0,17,0,140,0,153,0,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,
-255,184,255,184,255,184,255,184,255,184,255,184,255,26,0,184,255,149,0,184,255,21,0,43,0,184,255,34,0,184,255,26,0,13,0,30,0,184,255,10,0,184,255,184,255,184,255,184,255,53,0,184,255,184,255,50,0,184,255,184,255,184,255,37,0,184,255,21,0,184,255,61,0,65,0,184,255,66,0,184,255,184,255,184,255,184,255,184,255,255,3,14,15,16,33,53,34,56,35,59,20,62,36,64,22,67,23,69,24,37,26,70,27,28,72,73,74,81,82,100,99,102,91,92,79,97,0,0,0,0,4,43,0,33,32,0,17,19,21,25,27,29,23,0,5,7,43,43,43,0,43,0,0,9,8,37,0,0,
-1,31,2,6,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,34,3,35,18,10,38,20,11,39,22,13,41,24,16,26,12,40,28,14,30,15,0,47,0,44,0,43,63,0,45,0,43,0,49,42,36,62,46,61,0,54,52,0,56,48,65,0,50,0,60,0,0,59,0,64,51,55,53,57,0,0,0,0,2,2,2,2,2,15,12,72,0,3,81,8,1,8,79,17,18,19,7,21,11,30,12,10,30,12,97,15,38,14,40,5,42,16,44,45,6,47,48,26,27,28,29,11,12,32,33,34,35,36,37,38,31,23,24,12,22,4,26,27,10,31,25,80,32,33,34,35,36,37,38,10,12,75,14,10,10,39,80,80,80,80,80,41,43,12,26,27,15,75,46,255,32,33,34,35,36,37,38,26,27,
-255,80,255,255,32,33,34,35,36,37,38,12,17,18,19,255,21,255,19,255,255,255,255,255,12,26,27,255,16,255,255,32,33,34,35,36,37,38,26,27,255,255,255,255,32,33,34,35,36,37,38,12,255,5,255,255,17,9,255,255,255,255,255,255,12,26,27,255,20,21,18,32,33,34,35,36,37,38,26,27,12,255,255,255,32,33,34,35,36,37,38,255,255,255,26,27,255,255,255,255,32,33,34,35,36,37,38,17,18,19,20,21,22,23,255,255,255,255,255,255,255,255,255,33,34,35,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,76,1,0,1,0,0,0,224,1,0,0,192,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,0,64,166,1,0,1,0,0,0,72,4,0,0,224,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,0,248,2,2,0,1,0,0,0,224,39,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,72,102,2,0,1,0,0,0,40,48,0,0,32,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,56,125,1,0,255,255,255,255,232,56,0,0,64,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,192,73,1,0,1,0,0,0,176,77,0,0,96,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,128,161,1,0,1,
-0,0,0,160,101,0,0,128,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,112,233,1,0,1,0,0,0,48,112,0,0,160,47,0,0,4,0,0,0,88,190,1,0,1,0,0,0,96,0,0,0,160,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,0,208,59,1,0,168,34,1,0,0,0,0,0,0,0,0,0,56,179,1,0,184,34,1,0,184,185,1,0,200,34,1,0,15,0,0,0,88,71,1,0,1,0,0,0,176,111,0,0,0,0,0,0,16,0,0,0,96,26,2,0,1,0,0,0,176,111,0,0,0,0,0,0,17,0,0,0,208,208,1,0,1,0,0,0,176,111,0,0,0,0,0,0,17,0,0,0,176,178,1,0,1,0,0,0,176,111,0,0,0,0,0,0,17,0,0,0,32,
-154,1,0,1,0,0,0,176,111,0,0,0,0,0,0,19,0,0,0,192,131,1,0,1,0,0,0,208,111,0,0,0,0,0,0,20,0,0,0,16,110,1,0,1,0,0,0,208,111,0,0,0,0,0,0,21,0,0,0,24,89,1,0,1,0,0,0,208,111,0,0,0,0,0,0,21,0,0,0,232,69,1,0,1,0,0,0,208,111,0,0,0,0,0,0,21,0,0,0,120,52,1,0,1,0,0,0,208,111,0,0,0,0,0,0,22,0,0,0,136,133,2,0,1,0,0,0,152,111,0,0,0,0,0,0,23,0,0,0,144,117,2,0,1,0,0,0,152,111,0,0,0,0,0,0,24,0,0,0,136,101,2,0,1,0,0,0,152,111,0,0,0,0,0,0,24,0,0,0,152,83,2,0,1,0,0,0,152,111,0,0,0,0,0,0,24,0,0,0,80,72,2,0,1,0,0,0,152,
-111,0,0,0,0,0,0,25,0,0,0,128,60,2,0,1,0,0,0,192,111,0,0,0,0,0,0,25,0,0,0,128,48,2,0,1,0,0,0,192,111,0,0,0,0,0,0,26,0,0,0,128,36,2,0,1,0,0,0,184,111,0,0,0,0,0,0,10,0,0,0,144,25,2,0,1,0,0,0,200,111,0,0,0,0,0,0,11,0,0,0,40,14,2,0,1,0,0,0,200,111,0,0,0,0,0,0,12,0,0,0,40,6,2,0,1,0,0,0,200,111,0,0,0,0,0,0,12,0,0,0,120,253,1,0,1,0,0,0,200,111,0,0,0,0,0,0,12,0,0,0,144,241,1,0,1,0,0,0,200,111,0,0,0,0,0,0,14,0,0,0,32,231,1,0,1,0,0,0,200,111,0,0,0,0,0,0,14,0,0,0,216,221,1,0,1,0,0,0,200,111,0,0,0,0,0,0,13,0,
-0,0,32,218,1,0,1,0,0,0,200,111,0,0,0,0,0,0,5,0,0,0,136,214,1,0,1,0,0,0,200,111,0,0,0,0,0,0,6,0,0,0,0,212,1,0,1,0,0,0,200,111,0,0,0,0,0,0,7,0,0,0,168,208,1,0,1,0,0,0,200,111,0,0,0,0,0,0,7,0,0,0,88,205,1,0,1,0,0,0,200,111,0,0,0,0,0,0,7,0,0,0,96,202,1,0,1,0,0,0,200,111,0,0,0,0,0,0,9,0,0,0,56,198,1,0,1,0,0,0,200,111,0,0,0,0,0,0,9,0,0,0,0,194,1,0,1,0,0,0,200,111,0,0,0,0,0,0,8,0,0,0,184,189,1,0,1,0,0,0,200,111,0,0,0,0,0,0,0,0,0,0,32,187,1,0,1,0,0,0,144,111,0,0,0,0,0,0,1,0,0,0,232,184,1,0,1,0,0,0,144,111,
-0,0,0,0,0,0,2,0,0,0,8,183,1,0,1,0,0,0,144,111,0,0,0,0,0,0,2,0,0,0,208,180,1,0,1,0,0,0,144,111,0,0,0,0,0,0,2,0,0,0,144,178,1,0,1,0,0,0,144,111,0,0,0,0,0,0,4,0,0,0,216,175,1,0,1,0,0,0,144,111,0,0,0,0,0,0,4,0,0,0,72,173,1,0,1,0,0,0,144,111,0,0,0,0,0,0,3,0,0,0,168,169,1,0,1,0,0,0,144,111,0,0,0,0,0,0,18,0,0,0,128,166,1,0,1,0,0,0,176,111,0,0,0,0,0,0,27,0,0,0,192,162,1,0,1,0,0,0,160,111,0,0,0,0,0,0,28,0,0,0,200,160,1,0,1,0,0,0,160,111,0,0,0,0,0,0,29,0,0,0,40,159,1,0,1,0,0,0,160,111,0,0,0,0,0,0,29,0,0,0,
-120,157,1,0,1,0,0,0,160,111,0,0,0,0,0,0,29,0,0,0,128,155,1,0,1,0,0,0,160,111,0,0,0,0,0,0,30,0,0,0,8,154,1,0,1,0,0,0,168,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,179,1,0,0,0,0,0,48,71,0,0,240,179,2,0,1,0,0,0,0,84,2,0,0,0,0,0,24,102,0,0,240,179,2,0,3,0,0,0,104,231,1,0,0,0,0,0,216,3,0,0,240,179,2,0,4,0,0,0,216,189,1,0,0,0,0,0,200,20,1,0,240,179,2,0,5,0,0,0,224,162,1,0,0,0,0,0,192,57,0,0,240,179,2,0,6,0,0,0,120,140,1,0,0,0,0,0,136,69,0,0,240,179,2,0,7,0,0,0,240,118,1,0,0,0,0,
-0,168,69,0,0,240,179,2,0,7,0,0,0,112,98,1,0,0,0,0,0,168,69,0,0,240,179,2,0,7,0,0,0,240,77,1,0,0,0,0,0,160,69,0,0,240,179,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,24,84,2,0,0,0,0,0,40,112,0,0,32,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,240,176,1,0,50,0,0,0,72,82,2,0,44,0,0,0,8,229,1,0,44,0,0,0,184,188,1,0,22,0,0,0,168,161,1,0,22,0,0,0,88,139,1,0,40,0,0,0,192,117,1,0,40,0,0,0,40,97,1,0,16,0,0,0,160,76,1,0,16,0,0,0,24,58,1,0,4,0,0,0,240,138,2,0,4,0,0,0,160,122,2,0,
-26,0,0,0,56,107,2,0,26,0,0,0,152,87,2,0,32,0,0,0,0,0,0,0,16,58,1,0,1,0,0,0,0,0,0,0,88,113,0,0,1,0,0,0,8,139,2,0,1,0,0,0,0,0,0,0,32,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,77,2,0,1,0,0,0,0,0,0,0,144,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,2,0,1,0,0,0,0,0,0,0,0,114,0,0,1,0,0,0,32,251,1,0,1,0,0,0,0,0,0,0,200,113,0,0,0,0,0,0,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,126,2,0,1,0,0,0,0,0,0,0,56,114,0,0,1,0,0,0,136,1,2,0,1,0,0,0,0,0,0,0,56,114,0,
-0,2,0,0,0,8,200,1,0,1,0,0,0,0,0,0,0,80,115,0,0,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,56,2,0,255,255,255,255,0,0,0,0,112,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,32,25,2,0,1,0,0,0,0,0,0,0,168,114,0,0,2,0,0,0,80,208,1,0,1,0,0,0,0,0,0,0,224,114,0,0,0,0,0,0,0,178,1,0,1,0,0,0,0,0,0,0,224,114,0,0,3,0,0,0,176,153,1,0,1,0,0,0,0,0,0,0,224,114,0,0,0,0,0,0,240,130,1,0,1,0,0,0,0,0,0,0,168,114,0,0,3,0,0,0,240,108,1,0,1,0,0,0,0,0,0,0,168,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,184,73,2,0,1,0,0,0,0,0,0,0,24,115,0,0,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,163,1,0,1,0,0,0,0,0,0,0,136,115,0,0,0,0,0,0,96,141,1,0,1,0,0,0,0,0,0,0,136,115,0,0,1,0,0,0,96,119,1,0,1,0,0,0,0,0,0,0,192,115,0,0,2,0,0,0,32,99,1,0,1,0,0,0,0,0,0,0,136,115,0,0,3,0,0,0,120,78,1,0,1,0,0,0,0,0,0,0,136,115,0,0,4,0,0,0,80,60,1,0,1,0,0,0,0,0,0,0,136,115,0,0,5,0,0,0,48,141,2,0,1,0,0,0,0,0,0,0,136,115,0,0,6,0,0,0,176,124,2,0,1,0,0,0,0,0,0,0,136,115,0,0,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,12,0,0,0,116,0,0,0,22,0,0,0,86,0,0,0,162,0,0,0,88,0,0,0,14,0,0,0,110,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,12,0,0,0,32,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,203,1,0,96,200,1,0,168,196,1,0,0,0,0,0,100,0,0,0,101,0,0,0,102,0,0,0,100,0,0,0,104,191,1,0,80,188,1,0,56,186,1,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,255,255,255,255,168,163,2,0,64,163,2,0,16,163,2,0,56,163,2,0,40,163,2,0,24,163,2,0,0,0,0,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,0,0,0,
-0,0,0,0,0,0,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,0,0,0,0,0,0,65,66,0,0,192,38,2,0,65,73,0,0,120,27,2,0,65,82,0,0,208,16,2,0,65,88,0,0,128,7,2,0,66,32,0,0,248,254,1,0,66,73,0,0,152,244,1,0,67,66,0,0,136,232,1,0,67,79,0,0,160,223,1,0,67,88,0,0,120,218,1,0,72,32,0,0,56,215,1,0,72,66,0,0,88,212,1,0,72,73,0,0,24,209,1,0,72,88,0,0,248,205,1,0,72,98,0,0,168,202,1,0,72,105,0,0,136,198,1,0,72,114,0,0,216,194,1,0,72,120,0,0,40,190,1,0,73,32,0,0,96,187,1,0,75,66,0,0,88,185,1,0,75,73,
-0,0,88,183,1,0,75,82,0,0,48,181,1,0,75,88,0,0,216,178,1,0,78,66,0,0,16,176,1,0,78,73,0,0,136,173,1,0,78,82,0,0,32,170,1,0,78,88,0,0,72,167,1,0,80,65,0,0,16,163,1,0,80,66,0,0,8,161,1,0,80,73,0,0,112,159,1,0,80,88,0,0,200,157,1,0,82,32,0,0,200,155,1,0,83,32,0,0,72,154,1,0,90,68,0,0,136,152,1,0,0,0,0,0,0,0,0,0,96,188,1,0,46,0,0,0,72,186,1,0,6,0,0,0,16,184,1,0,192,0,0,0,248,220,1,0,168,186,1,0,208,137,1,0,120,160,1,0,0,95,1,0,192,115,1,0,160,56,1,0,8,75,1,0,0,0,0,0,0,0,0,0,248,220,1,0,168,186,1,0,120,
-160,1,0,208,137,1,0,192,115,1,0,0,95,1,0,8,75,1,0,160,56,1,0,0,0,0,0,0,0,0,0,84,0,0,0,30,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,94,0,0,0,72,0,0,0,22,0,0,0,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,0,0,30,0,0,0,120,0,0,0,22,0,0,0,4,0,0,0,28,0,0,0,44,0,0,0,0,0,0,0,176,0,0,0,142,0,0,0,40,102,0,0,0,0,0,0,1,0,0,0,1,0,0,0,255,255,255,255,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,6,0,0,0,7,0,0,0,7,0,0,0,8,0,0,0,8,0,0,0,9,0,0,0,9,0,0,0,10,0,0,0,10,0,0,0,11,0,0,0,11,0,0,0,12,0,0,0,12,0,0,0,13,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,0,0,0,7,0,0,0,0,0,0,0,76,0,0,0,152,0,0,0,34,0,0,0,114,0,0,0,0,0,0,0,2,0,0,0,72,171,1,0,198,0,0,0,24,168,1,0,193,0,0,0,8,164,1,0,194,0,0,0,136,161,1,0,192,0,0,0,216,159,1,0,145,3,0,0,56,158,1,0,197,0,0,0,72,156,1,0,195,0,0,0,176,154,1,0,196,0,0,0,0,153,1,0,146,3,0,0,32,151,1,0,199,0,0,0,176,148,1,0,167,3,0,0,8,146,1,0,33,32,0,0,88,142,1,0,148,3,0,0,136,139,1,0,208,0,0,0,200,137,1,0,201,0,0,0,40,136,1,0,202,
-0,0,0,8,134,1,0,200,0,0,0,128,132,1,0,149,3,0,0,216,130,1,0,151,3,0,0,40,129,1,0,203,0,0,0,248,126,1,0,147,3,0,0,24,124,1,0,205,0,0,0,0,120,1,0,206,0,0,0,8,118,1,0,204,0,0,0,216,115,1,0,153,3,0,0,104,114,1,0,207,0,0,0,144,112,1,0,154,3,0,0,16,111,1,0,155,3,0,0,40,109,1,0,156,3,0,0,80,107,1,0,209,0,0,0,104,105,1,0,157,3,0,0,168,102,1,0,82,1,0,0,128,99,1,0,211,0,0,0,176,97,1,0,212,0,0,0,96,95,1,0,210,0,0,0,48,93,1,0,169,3,0,0,176,91,1,0,159,3,0,0,224,89,1,0,216,0,0,0,32,88,1,0,213,0,0,0,88,86,1,0,214,
-0,0,0,112,84,1,0,166,3,0,0,96,82,1,0,160,3,0,0,248,78,1,0,51,32,0,0,56,77,1,0,168,3,0,0,120,75,1,0,161,3,0,0,200,73,1,0,96,1,0,0,72,72,1,0,163,3,0,0,192,70,1,0,222,0,0,0,40,69,1,0,164,3,0,0,136,67,1,0,152,3,0,0,232,65,1,0,218,0,0,0,152,63,1,0,219,0,0,0,216,60,1,0,217,0,0,0,184,58,1,0,165,3,0,0,24,57,1,0,220,0,0,0,176,55,1,0,158,3,0,0,32,54,1,0,221,0,0,0,248,52,1,0,120,1,0,0,224,51,1,0,150,3,0,0,120,147,2,0,225,0,0,0,232,145,2,0,226,0,0,0,112,144,2,0,180,0,0,0,168,141,2,0,230,0,0,0,224,139,2,0,224,
-0,0,0,64,138,2,0,53,33,0,0,200,136,2,0,177,3,0,0,112,135,2,0,38,0,0,0,56,134,2,0,39,34,0,0,224,132,2,0,32,34,0,0,112,131,2,0,229,0,0,0,192,129,2,0,72,34,0,0,72,128,2,0,227,0,0,0,56,125,2,0,228,0,0,0,160,123,2,0,30,32,0,0,64,122,2,0,178,3,0,0,224,120,2,0,166,0,0,0,144,119,2,0,34,32,0,0,48,118,2,0,41,34,0,0,240,116,2,0,231,0,0,0,192,115,2,0,184,0,0,0,72,114,2,0,162,0,0,0,88,112,2,0,199,3,0,0,112,109,2,0,198,2,0,0,48,108,2,0,99,38,0,0,240,106,2,0,69,34,0,0,200,105,2,0,169,0,0,0,128,104,2,0,181,33,0,
-0,80,102,2,0,42,34,0,0,232,100,2,0,164,0,0,0,160,99,2,0,211,33,0,0,208,94,2,0,32,32,0,0,224,92,2,0,147,33,0,0,40,90,2,0,176,0,0,0,176,88,2,0,180,3,0,0,96,87,2,0,102,38,0,0,104,86,2,0,247,0,0,0,80,85,2,0,233,0,0,0,80,84,2,0,234,0,0,0,64,83,2,0,232,0,0,0,64,82,2,0,5,34,0,0,224,80,2,0,3,32,0,0,216,79,2,0,2,32,0,0,192,77,2,0,181,3,0,0,136,76,2,0,97,34,0,0,136,75,2,0,183,3,0,0,176,74,2,0,240,0,0,0,192,73,2,0,235,0,0,0,224,72,2,0,172,32,0,0,248,71,2,0,3,34,0,0,240,70,2,0,146,1,0,0,192,69,2,0,0,34,0,0,160,
-68,2,0,189,0,0,0,120,66,2,0,188,0,0,0,56,65,2,0,190,0,0,0,48,64,2,0,68,32,0,0,16,63,2,0,179,3,0,0,248,61,2,0,101,34,0,0,24,61,2,0,62,0,0,0,16,60,2,0,212,33,0,0,200,58,2,0,148,33,0,0,144,57,2,0,101,38,0,0,16,56,2,0,38,32,0,0,32,54,2,0,237,0,0,0,16,53,2,0,238,0,0,0,0,52,2,0,161,0,0,0,240,50,2,0,236,0,0,0,224,49,2,0,17,33,0,0,16,49,2,0,30,34,0,0,40,48,2,0,43,34,0,0,40,47,2,0,185,3,0,0,232,45,2,0,191,0,0,0,104,44,2,0,8,34,0,0,184,42,2,0,239,0,0,0,144,41,2,0,186,3,0,0,24,40,2,0,208,33,0,0,248,38,2,0,187,
-3,0,0,0,38,2,0,41,35,0,0,32,37,2,0,171,0,0,0,40,36,2,0,144,33,0,0,24,35,2,0,8,35,0,0,200,33,2,0,28,32,0,0,152,32,2,0,100,34,0,0,104,30,2,0,10,35,0,0,80,29,2,0,23,34,0,0,104,28,2,0,202,37,0,0,176,27,2,0,14,32,0,0,0,27,2,0,57,32,0,0,40,26,2,0,24,32,0,0,48,25,2,0,60,0,0,0,72,24,2,0,175,0,0,0,88,23,2,0,20,32,0,0,88,22,2,0,181,0,0,0,80,20,2,0,183,0,0,0,72,19,2,0,18,34,0,0,56,18,2,0,188,3,0,0,80,17,2,0,7,34,0,0,200,15,2,0,160,0,0,0,160,14,2,0,19,32,0,0,240,13,2,0,96,34,0,0,240,12,2,0,11,34,0,0,32,12,2,
-0,172,0,0,0,8,11,2,0,9,34,0,0,176,9,2,0,132,34,0,0,0,9,2,0,241,0,0,0,80,8,2,0,189,3,0,0,192,7,2,0,243,0,0,0,8,7,2,0,244,0,0,0,128,6,2,0,83,1,0,0,232,5,2,0,242,0,0,0,72,5,2,0,62,32,0,0,112,4,2,0,201,3,0,0,16,3,2,0,191,3,0,0,88,1,2,0,149,34,0,0,72,0,2,0,40,34,0,0,176,255,1,0,170,0,0,0,32,255,1,0,186,0,0,0,144,254,1,0,248,0,0,0,216,253,1,0,245,0,0,0,8,253,1,0,151,34,0,0,32,252,1,0,246,0,0,0,112,251,1,0,182,0,0,0,88,250,1,0,2,34,0,0,96,248,1,0,48,32,0,0,232,246,1,0,165,34,0,0,200,245,1,0,198,3,0,0,200,
-244,1,0,192,3,0,0,104,243,1,0,214,3,0,0,8,242,1,0,177,0,0,0,48,241,1,0,163,0,0,0,24,240,1,0,50,32,0,0,200,238,1,0,15,34,0,0,120,237,1,0,29,34,0,0,208,235,1,0,200,3,0,0,168,234,1,0,34,0,0,0,192,233,1,0,210,33,0,0,192,232,1,0,26,34,0,0,0,232,1,0,42,35,0,0,136,231,1,0,187,0,0,0,216,230,1,0,146,33,0,0,240,229,1,0,9,35,0,0,0,229,1,0,29,32,0,0,216,227,1,0,28,33,0,0,104,226,1,0,174,0,0,0,120,225,1,0,11,35,0,0,128,224,1,0,193,3,0,0,192,223,1,0,15,32,0,0,248,222,1,0,58,32,0,0,72,222,1,0,25,32,0,0,160,221,
-1,0,26,32,0,0,240,220,1,0,97,1,0,0,144,220,1,0,197,34,0,0,24,220,1,0,167,0,0,0,48,219,1,0,173,0,0,0,0,219,1,0,195,3,0,0,184,218,1,0,194,3,0,0,144,218,1,0,60,34,0,0,80,218,1,0,96,38,0,0,56,218,1,0,130,34,0,0,8,218,1,0,134,34,0,0,184,217,1,0,17,34,0,0,104,217,1,0,131,34,0,0,0,217,1,0,185,0,0,0,232,215,1,0,178,0,0,0,192,215,1,0,179,0,0,0,120,215,1,0,135,34,0,0,72,215,1,0,223,0,0,0,224,214,1,0,196,3,0,0,160,214,1,0,52,34,0,0,128,214,1,0,184,3,0,0,48,214,1,0,209,3,0,0,0,214,1,0,9,32,0,0,184,213,1,0,254,
-0,0,0,232,212,1,0,220,2,0,0,192,212,1,0,215,0,0,0,136,212,1,0,34,33,0,0,104,212,1,0,209,33,0,0,64,212,1,0,250,0,0,0,24,212,1,0,145,33,0,0,248,211,1,0,251,0,0,0,152,211,1,0,249,0,0,0,40,211,1,0,168,0,0,0,152,210,1,0,210,3,0,0,200,209,1,0,197,3,0,0,120,209,1,0,252,0,0,0,80,209,1,0,24,33,0,0,48,209,1,0,190,3,0,0,0,209,1,0,253,0,0,0,200,208,1,0,165,0,0,0,160,208,1,0,255,0,0,0,72,208,1,0,182,3,0,0,40,208,1,0,13,32,0,0,216,207,1,0,12,32,0,0,42,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,18,0,0,0,0,
-0,0,0,20,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,200,79,0,0,56,25,1,0,88,2,0,0,184,22,1,0,184,22,1,0,80,78,0,0,88,2,0,0,0,0,0,0,8,0,0,0,48,0,0,0,0,0,0,0,60,0,0,0,32,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,146,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,79,84,65,84,73,79,78,40,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,124,0,0,0,0,0,0,0,78,77,84,79,75,69,78,83,0,0,0,0,0,0,0,0,78,77,84,79,75,69,78,0,73,68,82,69,70,83,0,0,73,68,82,69,70,0,0,0,73,68,0,0,0,0,0,0,69,78,84,73,84,89,0,0,69,78,84,73,84,73,69,83,0,0,0,0,0,0,0,0,67,68,65,84,65,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,64,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,64,0,0,0,0,0,0,82,64,96,0,0,0,0,0,0,0,0,0,0,0,0,0,66,64,0,0,0,0,0,0,66,64,0,0,0,0,0,32,131,64,0,0,0,0,0,192,136,64,
-0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,150,64,0,0,0,0,0,128,
-150,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,64,0,0,0,0,0,0,66,64,0,0,0,0,0,32,131,64,0,0,0,0,0,192,136,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,114,1,0,216,112,1,0,0,0,0,0,0,0,0,0,95,112,137,0,255,9,47,15,10,0,0,0,100,0,0,0,232,3,0,0,16,39,0,
-0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5,0,0,0,0,150,48,7,119,44,97,14,238,186,81,9,153,25,196,109,7,143,244,106,112,53,165,99,233,163,149,100,158,50,136,219,14,164,184,220,121,30,233,213,224,136,217,210,151,43,76,182,9,189,124,177,126,7,45,184,231,145,29,191,144,100,16,183,29,242,32,176,106,72,113,185,243,222,65,190,132,125,212,218,26,235,228,221,109,81,181,212,244,199,133,211,131,86,152,108,19,192,168,107,100,122,249,98,253,236,201,101,138,79,92,1,20,217,108,6,99,99,61,15,250,245,13,8,
-141,200,32,110,59,94,16,105,76,228,65,96,213,114,113,103,162,209,228,3,60,71,212,4,75,253,133,13,210,107,181,10,165,250,168,181,53,108,152,178,66,214,201,187,219,64,249,188,172,227,108,216,50,117,92,223,69,207,13,214,220,89,61,209,171,172,48,217,38,58,0,222,81,128,81,215,200,22,97,208,191,181,244,180,33,35,196,179,86,153,149,186,207,15,165,189,184,158,184,2,40,8,136,5,95,178,217,12,198,36,233,11,177,135,124,111,47,17,76,104,88,171,29,97,193,61,45,102,182,144,65,220,118,6,113,219,1,188,32,210,152,
-42,16,213,239,137,133,177,113,31,181,182,6,165,228,191,159,51,212,184,232,162,201,7,120,52,249,0,15,142,168,9,150,24,152,14,225,187,13,106,127,45,61,109,8,151,108,100,145,1,92,99,230,244,81,107,107,98,97,108,28,216,48,101,133,78,0,98,242,237,149,6,108,123,165,1,27,193,244,8,130,87,196,15,245,198,217,176,101,80,233,183,18,234,184,190,139,124,136,185,252,223,29,221,98,73,45,218,21,243,124,211,140,101,76,212,251,88,97,178,77,206,81,181,58,116,0,188,163,226,48,187,212,65,165,223,74,215,149,216,61,109,
-196,209,164,251,244,214,211,106,233,105,67,252,217,110,52,70,136,103,173,208,184,96,218,115,45,4,68,229,29,3,51,95,76,10,170,201,124,13,221,60,113,5,80,170,65,2,39,16,16,11,190,134,32,12,201,37,181,104,87,179,133,111,32,9,212,102,185,159,228,97,206,14,249,222,94,152,201,217,41,34,152,208,176,180,168,215,199,23,61,179,89,129,13,180,46,59,92,189,183,173,108,186,192,32,131,184,237,182,179,191,154,12,226,182,3,154,210,177,116,57,71,213,234,175,119,210,157,21,38,219,4,131,22,220,115,18,11,99,227,132,59,
-100,148,62,106,109,13,168,90,106,122,11,207,14,228,157,255,9,147,39,174,0,10,177,158,7,125,68,147,15,240,210,163,8,135,104,242,1,30,254,194,6,105,93,87,98,247,203,103,101,128,113,54,108,25,231,6,107,110,118,27,212,254,224,43,211,137,90,122,218,16,204,74,221,103,111,223,185,249,249,239,190,142,67,190,183,23,213,142,176,96,232,163,214,214,126,147,209,161,196,194,216,56,82,242,223,79,241,103,187,209,103,87,188,166,221,6,181,63,75,54,178,72,218,43,13,216,76,27,10,175,246,74,3,54,96,122,4,65,195,239,96,
-223,85,223,103,168,239,142,110,49,121,190,105,70,140,179,97,203,26,131,102,188,160,210,111,37,54,226,104,82,149,119,12,204,3,71,11,187,185,22,2,34,47,38,5,85,190,59,186,197,40,11,189,178,146,90,180,43,4,106,179,92,167,255,215,194,49,207,208,181,139,158,217,44,29,174,222,91,176,194,100,155,38,242,99,236,156,163,106,117,10,147,109,2,169,6,9,156,63,54,14,235,133,103,7,114,19,87,0,5,130,74,191,149,20,122,184,226,174,43,177,123,56,27,182,12,155,142,210,146,13,190,213,229,183,239,220,124,33,223,219,11,
-212,210,211,134,66,226,212,241,248,179,221,104,110,131,218,31,205,22,190,129,91,38,185,246,225,119,176,111,119,71,183,24,230,90,8,136,112,106,15,255,202,59,6,102,92,11,1,17,255,158,101,143,105,174,98,248,211,255,107,97,69,207,108,22,120,226,10,160,238,210,13,215,84,131,4,78,194,179,3,57,97,38,103,167,247,22,96,208,77,71,105,73,219,119,110,62,74,106,209,174,220,90,214,217,102,11,223,64,240,59,216,55,83,174,188,169,197,158,187,222,127,207,178,71,233,255,181,48,28,242,189,189,138,194,186,202,48,147,
-179,83,166,163,180,36,5,54,208,186,147,6,215,205,41],"i8",L,l.J+20497);D([87,222,84,191,103,217,35,46,122,102,179,184,74,97,196,2,27,104,93,148,43,111,42,55,190,11,180,161,142,12,195,27,223,5,90,141,239,2,45,0,0,0,0,65,49,27,25,130,98,54,50,195,83,45,43,4,197,108,100,69,244,119,125,134,167,90,86,199,150,65,79,8,138,217,200,73,187,194,209,138,232,239,250,203,217,244,227,12,79,181,172,77,126,174,181,142,45,131,158,207,28,152,135,81,18,194,74,16,35,217,83,211,112,244,120,146,65,239,97,85,215,174,46,
-20,230,181,55,215,181,152,28,150,132,131,5,89,152,27,130,24,169,0,155,219,250,45,176,154,203,54,169,93,93,119,230,28,108,108,255,223,63,65,212,158,14,90,205,162,36,132,149,227,21,159,140,32,70,178,167,97,119,169,190,166,225,232,241,231,208,243,232,36,131,222,195,101,178,197,218,170,174,93,93,235,159,70,68,40,204,107,111,105,253,112,118,174,107,49,57,239,90,42,32,44,9,7,11,109,56,28,18,243,54,70,223,178,7,93,198,113,84,112,237,48,101,107,244,247,243,42,187,182,194,49,162,117,145,28,137,52,160,7,144,
-251,188,159,23,186,141,132,14,121,222,169,37,56,239,178,60,255,121,243,115,190,72,232,106,125,27,197,65,60,42,222,88,5,79,121,240,68,126,98,233,135,45,79,194,198,28,84,219,1,138,21,148,64,187,14,141,131,232,35,166,194,217,56,191,13,197,160,56,76,244,187,33,143,167,150,10,206,150,141,19,9,0,204,92,72,49,215,69,139,98,250,110,202,83,225,119,84,93,187,186,21,108,160,163,214,63,141,136,151,14,150,145,80,152,215,222,17,169,204,199,210,250,225,236,147,203,250,245,92,215,98,114,29,230,121,107,222,181,84,
-64,159,132,79,89,88,18,14,22,25,35,21,15,218,112,56,36,155,65,35,61,167,107,253,101,230,90,230,124,37,9,203,87,100,56,208,78,163,174,145,1,226,159,138,24,33,204,167,51,96,253,188,42,175,225,36,173,238,208,63,180,45,131,18,159,108,178,9,134,171,36,72,201,234,21,83,208,41,70,126,251,104,119,101,226,246,121,63,47,183,72,36,54,116,27,9,29,53,42,18,4,242,188,83,75,179,141,72,82,112,222,101,121,49,239,126,96,254,243,230,231,191,194,253,254,124,145,208,213,61,160,203,204,250,54,138,131,187,7,145,154,120,
-84,188,177,57,101,167,168,75,152,131,59,10,169,152,34,201,250,181,9,136,203,174,16,79,93,239,95,14,108,244,70,205,63,217,109,140,14,194,116,67,18,90,243,2,35,65,234,193,112,108,193,128,65,119,216,71,215,54,151,6,230,45,142,197,181,0,165,132,132,27,188,26,138,65,113,91,187,90,104,152,232,119,67,217,217,108,90,30,79,45,21,95,126,54,12,156,45,27,39,221,28,0,62,18,0,152,185,83,49,131,160,144,98,174,139,209,83,181,146,22,197,244,221,87,244,239,196,148,167,194,239,213,150,217,246,233,188,7,174,168,141,
-28,183,107,222,49,156,42,239,42,133,237,121,107,202,172,72,112,211,111,27,93,248,46,42,70,225,225,54,222,102,160,7,197,127,99,84,232,84,34,101,243,77,229,243,178,2,164,194,169,27,103,145,132,48,38,160,159,41,184,174,197,228,249,159,222,253,58,204,243,214,123,253,232,207,188,107,169,128,253,90,178,153,62,9,159,178,127,56,132,171,176,36,28,44,241,21,7,53,50,70,42,30,115,119,49,7,180,225,112,72,245,208,107,81,54,131,70,122,119,178,93,99,78,215,250,203,15,230,225,210,204,181,204,249,141,132,215,224,74,
-18,150,175,11,35,141,182,200,112,160,157,137,65,187,132,70,93,35,3,7,108,56,26,196,63,21,49,133,14,14,40,66,152,79,103,3,169,84,126,192,250,121,85,129,203,98,76,31,197,56,129,94,244,35,152,157,167,14,179,220,150,21,170,27,0,84,229,90,49,79,252,153,98,98,215,216,83,121,206,23,79,225,73,86,126,250,80,149,45,215,123,212,28,204,98,19,138,141,45,82,187,150,52,145,232,187,31,208,217,160,6,236,243,126,94,173,194,101,71,110,145,72,108,47,160,83,117,232,54,18,58,169,7,9,35,106,84,36,8,43,101,63,17,228,121,
-167,150,165,72,188,143,102,27,145,164,39,42,138,189,224,188,203,242,161,141,208,235,98,222,253,192,35,239,230,217,189,225,188,20,252,208,167,13,63,131,138,38,126,178,145,63,185,36,208,112,248,21,203,105,59,70,230,66,122,119,253,91,181,107,101,220,244,90,126,197,55,9,83,238,118,56,72,247,177,174,9,184,240,159,18,161,51,204,63,138,114,253,36,147,0,0,0,0,55,106,194,1,110,212,132,3,89,190,70,2,220,168,9,7,235,194,203,6,178,124,141,4,133,22,79,5,184,81,19,14,143,59,209,15,214,133,151,13,225,239,85,12,
-100,249,26,9,83,147,216,8,10,45,158,10,61,71,92,11,112,163,38,28,71,201,228,29,30,119,162,31,41,29,96,30,172,11,47,27,155,97,237,26,194,223,171,24,245,181,105,25,200,242,53,18,255,152,247,19,166,38,177,17,145,76,115,16,20,90,60,21,35,48,254,20,122,142,184,22,77,228,122,23,224,70,77,56,215,44,143,57,142,146,201,59,185,248,11,58,60,238,68,63,11,132,134,62,82,58,192,60,101,80,2,61,88,23,94,54,111,125,156,55,54,195,218,53,1,169,24,52,132,191,87,49,179,213,149,48,234,107,211,50,221,1,17,51,144,229,107,
-36,167,143,169,37,254,49,239,39,201,91,45,38,76,77,98,35,123,39,160,34,34,153,230,32,21,243,36,33,40,180,120,42,31,222,186,43,70,96,252,41,113,10,62,40,244,28,113,45,195,118,179,44,154,200,245,46,173,162,55,47,192,141,154,112,247,231,88,113,174,89,30,115,153,51,220,114,28,37,147,119,43,79,81,118,114,241,23,116,69,155,213,117,120,220,137,126,79,182,75,127,22,8,13,125,33,98,207,124,164,116,128,121,147,30,66,120,202,160,4,122,253,202,198,123,176,46,188,108,135,68,126,109,222,250,56,111,233,144,250,110,
-108,134,181,107,91,236,119,106,2,82,49,104,53,56,243,105,8,127,175,98,63,21,109,99,102,171,43,97,81,193,233,96,212,215,166,101,227,189,100,100,186,3,34,102,141,105,224,103,32,203,215,72,23,161,21,73,78,31,83,75,121,117,145,74,252,99,222,79,203,9,28,78,146,183,90,76,165,221,152,77,152,154,196,70,175,240,6,71,246,78,64,69,193,36,130,68,68,50,205,65,115,88,15,64,42,230,73,66,29,140,139,67,80,104,241,84,103,2,51,85,62,188,117,87,9,214,183,86,140,192,248,83,187,170,58,82,226,20,124,80,213,126,190,81,232,
-57,226,90,223,83,32,91,134,237,102,89,177,135,164,88,52,145,235,93,3,251,41,92,90,69,111,94,109,47,173,95,128,27,53,225,183,113,247,224,238,207,177,226,217,165,115,227,92,179,60,230,107,217,254,231,50,103,184,229,5,13,122,228,56,74,38,239,15,32,228,238,86,158,162,236,97,244,96,237,228,226,47,232,211,136,237,233,138,54,171,235,189,92,105,234,240,184,19,253,199,210,209,252,158,108,151,254,169,6,85,255,44,16,26,250,27,122,216,251,66,196,158,249,117,174,92,248,72,233,0,243,127,131,194,242,38,61,132,240,
-17,87,70,241,148,65,9,244,163,43,203,245,250,149,141,247,205,255,79,246,96,93,120,217,87,55,186,216,14,137,252,218,57,227,62,219,188,245,113,222,139,159,179,223,210,33,245,221,229,75,55,220,216,12,107,215,239,102,169,214,182,216,239,212,129,178,45,213,4,164,98,208,51,206,160,209,106,112,230,211,93,26,36,210,16,254,94,197,39,148,156,196,126,42,218,198,73,64,24,199,204,86,87,194,251,60,149,195,162,130,211,193,149,232,17,192,168,175,77,203,159,197,143,202,198,123,201,200,241,17,11,201,116,7,68,204,67,
-109,134,205,26,211,192,207,45,185,2,206,64,150,175,145,119,252,109,144,46,66,43,146,25,40,233,147,156,62,166,150,171,84,100,151,242,234,34,149,197,128,224,148,248,199,188,159,207,173,126,158,150,19,56,156,161,121,250,157,36,111,181,152,19,5,119,153,74,187,49,155,125,209,243,154,48,53,137,141,7,95,75,140,94,225,13,142,105,139,207,143,236,157,128,138,219,247,66,139,130,73,4,137,181,35,198,136,136,100,154,131,191,14,88,130,230,176,30,128,209,218,220,129,84,204,147,132,99,166,81,133,58,24,23,135,13,114,
-213,134,160,208,226,169,151,186,32,168,206,4,102,170,249,110,164,171,124,120,235,174,75,18,41,175,18,172,111,173,37,198,173,172,24,129,241,167,47,235,51,166,118,85,117,164,65,63,183,165,196,41,248,160,243,67,58,161,170,253,124,163,157,151,190,162,208,115,196,181,231,25,6,180,190,167,64,182,137,205,130,183,12,219,205,178,59,177,15,179,98,15,73,177,85,101,139,176,104,34,215,187,95,72,21,186,6,246,83,184,49,156,145,185,180,138,222,188,131,224,28,189,218,94,90,191,237,52,152,190,0,0,0,0,101,103,188,184,
-139,200,9,170,238,175,181,18,87,151,98,143,50,240,222,55,220,95,107,37,185,56,215,157,239,40,180,197,138,79,8,125,100,224,189,111,1,135,1,215,184,191,214,74,221,216,106,242,51,119,223,224,86,16,99,88,159,87,25,80,250,48,165,232,20,159,16,250,113,248,172,66,200,192,123,223,173,167,199,103,67,8,114,117,38,111,206,205,112,127,173,149,21,24,17,45,251,183,164,63,158,208,24,135,39,232,207,26,66,143,115,162,172,32,198,176,201,71,122,8,62,175,50,160,91,200,142,24,181,103,59,10,208,0,135,178,105,56,80,47,
-12,95,236,151,226,240,89,133,135,151,229,61,209,135,134,101,180,224,58,221,90,79,143,207,63,40,51,119,134,16,228,234,227,119,88,82,13,216,237,64,104,191,81,248,161,248,43,240,196,159,151,72,42,48,34,90,79,87,158,226,246,111,73,127,147,8,245,199,125,167,64,213,24,192,252,109,78,208,159,53,43,183,35,141,197,24,150,159,160,127,42,39,25,71,253,186,124,32,65,2,146,143,244,16,247,232,72,168,61,88,20,155,88,63,168,35,182,144,29,49,211,247,161,137,106,207,118,20,15,168,202,172,225,7,127,190,132,96,195,6,
-210,112,160,94,183,23,28,230,89,184,169,244,60,223,21,76,133,231,194,209,224,128,126,105,14,47,203,123,107,72,119,195,162,15,13,203,199,104,177,115,41,199,4,97,76,160,184,217,245,152,111,68,144,255,211,252,126,80,102,238,27,55,218,86,77,39,185,14,40,64,5,182,198,239,176,164,163,136,12,28,26,176,219,129,127,215,103,57,145,120,210,43,244,31,110,147,3,247,38,59,102,144,154,131,136,63,47,145,237,88,147,41,84,96,68,180,49,7,248,12,223,168,77,30,186,207,241,166,236,223,146,254,137,184,46,70,103,23,155,
-84,2,112,39,236,187,72,240,113,222,47,76,201,48,128,249,219,85,231,69,99,156,160,63,107,249,199,131,211,23,104,54,193,114,15,138,121,203,55,93,228,174,80,225,92,64,255,84,78,37,152,232,246,115,136,139,174,22,239,55,22,248,64,130,4,157,39,62,188,36,31,233,33,65,120,85,153,175,215,224,139,202,176,92,51,59,182,89,237,94,209,229,85,176,126,80,71,213,25,236,255,108,33,59,98,9,70,135,218,231,233,50,200,130,142,142,112,212,158,237,40,177,249,81,144,95,86,228,130,58,49,88,58,131,9,143,167,230,110,51,31,8,
-193,134,13,109,166,58,181,164,225,64,189,193,134,252,5,47,41,73,23,74,78,245,175,243,118,34,50,150,17,158,138,120,190,43,152,29,217,151,32,75,201,244,120,46,174,72,192,192,1,253,210,165,102,65,106,28,94,150,247,121,57,42,79,151,150,159,93,242,241,35,229,5,25,107,77,96,126,215,245,142,209,98,231,235,182,222,95,82,142,9,194,55,233,181,122,217,70,0,104,188,33,188,208,234,49,223,136,143,86,99,48,97,249,214,34,4,158,106,154,189,166,189,7,216,193,1,191,54,110,180,173,83,9,8,21,154,78,114,29,255,41,206,
-165,17,134,123,183,116,225,199,15,205,217,16,146,168,190,172,42,70,17,25,56,35,118,165,128,117,102,198,216,16,1,122,96,254,174,207,114,155,201,115,202,34,241,164,87,71,150,24,239,169,57,173,253,204,94,17,69,6,238,77,118,99,137,241,206,141,38,68,220,232,65,248,100,81,121,47,249,52,30,147,65,218,177,38,83,191,214,154,235,233,198,249,179,140,161,69,11,98,14,240,25,7,105,76,161,190,81,155,60,219,54,39,132,53,153,146,150,80,254,46,46,153,185,84,38,252,222,232,158,18,113,93,140,119,22,225,52,206,46,54,
-169,171,73,138,17,69,230,63,3,32,129,131,187,118,145,224,227,19,246,92,91,253,89,233,73,152,62,85,241,33,6,130,108,68,97,62,212,170,206,139,198,207,169,55,126,56,65,127,214,93,38,195,110,179,137,118,124,214,238,202,196,111,214,29,89,10,177,161,225,228,30,20,243,129,121,168,75,215,105,203,19,178,14,119,171,92,161,194,185,57,198,126,1,128,254,169,156,229,153,21,36,11,54,160,54,110,81,28,142,167,22,102,134,194,113,218,62,44,222,111,44,73,185,211,148,240,129,4,9,149,230,184,177,123,73,13,163,30,46,177,
-27,72,62,210,67,45,89,110,251,195,246,219,233,166,145,103,81,31,169,176,204,122,206,12,116,148,97,185,102,241,6,5,222,0,0,0,0,119,7,48,150,238,14,97,44,153,9,81,186,7,109,196,25,112,106,244,143,233,99,165,53,158,100,149,163,14,219,136,50,121,220,184,164,224,213,233,30,151,210,217,136,9,182,76,43,126,177,124,189,231,184,45,7,144,191,29,145,29,183,16,100,106,176,32,242,243,185,113,72,132,190,65,222,26,218,212,125,109,221,228,235,244,212,181,81,131,211,133,199,19,108,152,86,100,107,168,192,253,98,249,
-122,138,101,201,236,20,1,92,79,99,6,108,217,250,15,61,99,141,8,13,245,59,110,32,200,76,105,16,94,213,96,65,228,162,103,113,114,60,3,228,209,75,4,212,71,210,13,133,253,165,10,181,107,53,181,168,250,66,178,152,108,219,187,201,214,172,188,249,64,50,216,108,227,69,223,92,117,220,214,13,207,171,209,61,89,38,217,48,172,81,222,0,58,200,215,81,128,191,208,97,22,33,180,244,181,86,179,196,35,207,186,149,153,184,189,165,15,40,2,184,158,95,5,136,8,198,12,217,178,177,11,233,36,47,111,124,135,88,104,76,17,193,
-97,29,171,182,102,45,61,118,220,65,144,1,219,113,6,152,210,32,188,239,213,16,42,113,177,133,137,6,182,181,31,159,191,228,165,232,184,212,51,120,7,201,162,15,0,249,52,150,9,168,142,225,14,152,24,127,106,13,187,8,109,61,45,145,100,108,151,230,99,92,1,107,107,81,244,28,108,97,98,133,101,48,216,242,98,0,78,108,6,149,237,27,1,165,123,130,8,244,193,245,15,196,87,101,176,217,198,18,183,233,80,139,190,184,234,252,185,136,124,98,221,29,223,21,218,45,73,140,211,124,243,251,212,76,101,77,178,97,88,58,181,81,
-206,163,188,0,116,212,187,48,226,74,223,165,65,61,216,149,215,164,209,196,109,211,214,244,251,67,105,233,106,52,110,217,252,173,103,136,70,218,96,184,208,68,4,45,115,51,3,29,229,170,10,76,95,221,13,124,201,80,5,113,60,39,2,65,170,190,11,16,16,201,12,32,134,87,104,181,37,32,111,133,179,185,102,212,9,206,97,228,159,94,222,249,14,41,217,201,152,176,208,152,34,199,215,168,180,89,179,61,23,46,180,13,129,183,189,92,59,192,186,108,173,237,184,131,32,154,191,179,182,3,182,226,12,116,177,210,154,234,213,71,
-57,157,210,119,175,4,219,38,21,115,220,22,131,227,99,11,18,148,100,59,132,13,109,106,62,122,106,90,168,228,14,207,11,147,9,255,157,10,0,174,39,125,7,158,177,240,15,147,68,135,8,163,210,30,1,242,104,105,6,194,254,247,98,87,93,128,101,103,203,25,108,54,113,110,107,6,231,254,212,27,118,137,211,43,224,16,218,122,90,103,221,74,204,249,185,223,111,142,190,239,249,23,183,190,67,96,176,142,213,214,214,163,232,161,209,147,126,56,216,194,196,79,223,242,82,209,187,103,241,166,188,87,103,63,181,6,221,72,178,
-54,75,216,13,43,218,175,10,27,76,54,3,74,246,65,4,122,96,223,96,239,195,168,103,223,85,49,110,142,239,70,105,190,121,203,97,179,140,188,102,131,26,37,111,210,160,82,104,226,54,204,12,119,149,187,11,71,3,34,2,22,185,85,5,38,47,197,186,59,190,178,189,11,40,43,180,90,146,92,179,106,4,194,215,255,167,181,208,207,49,44,217,158,139,91,222,174,29,155,100,194,176,236,99,242,38,117,106,163,156,2,109,147,10,156,9,6,169,235,14,54,63,114,7,103,133,5,0,87,19,149,191,74,130,226,184,122,20,123,177,43,174,12,182,
-27,56,146,210,142,155,229,213,190,13,124,220,239,183,11,219,223,33,134,211,210,212,241,212,226,66,104,221,179,248,31,218,131,110,129,190,22,205,246,185,38,91,111,176,119,225,24,183,71,119,136,8,90,230,255,15,106,112,102,6,59,202,17,1,11,92,143,101,158,255,248,98,174,105,97,107,255,211,22,108,207,69,160,10,226,120,215,13,210,238,78,4,131,84,57,3,179,194,167,103,38,97,208,96,22,247,73,105,71,77,62,110,119,219,174,209,106,74,217,214,90,220,64,223,11,102,55,216,59,240,169,188,174,83,222,187,158,197,71,
-178,207,127,48,181,255,233,189,189,242,28,202,186,194,138,83,179,147,48,36,180,163,166,186,208,54,5,205,215,6,147,84,222,87,41,35,217,103,191,179,102,122,46,196,97,74,184,93,104,27,2,42,111,43,148,180,11,190,55,195,12,142,161,90,5,223,27,45,2,239,141,0,0,0,0,25,27,49,65,50,54,98,130,43,45,83,195,100,108,197,4,125,119,244,69,86,90,167,134,79,65,150,199,200,217,138,8,209,194,187,73,250,239,232,138,227,244,217,203,172,181,79,12,181,174,126,77,158,131,45,142,135,152,28,207,74,194,18,81,83,217,35,16,120,
-244,112,211,97,239,65,146,46,174,215,85,55,181,230,20,28,152,181,215,5,131,132,150,130,27,152,89,155,0,169,24,176,45,250,219,169,54,203,154,230,119,93,93,255,108,108,28,212,65,63,223,205,90,14,158,149,132,36,162,140,159,21,227,167,178,70,32,190,169,119,97,241,232,225,166,232,243,208,231,195,222,131,36,218,197,178,101,93,93,174,170,68,70,159,235,111,107,204,40,118,112,253,105,57,49,107,174,32,42,90,239,11,7,9,44,18,28,56,109,223,70,54,243,198,93,7,178,237,112,84,113,244,107,101,48,187,42,243,247,162,
-49,194,182,137,28,145,117,144,7,160,52,23,159,188,251,14,132,141,186,37,169,222,121,60,178,239,56,115,243,121,255,106,232,72,190,65,197,27,125,88,222,42,60,240,121,79,5,233,98,126,68,194,79,45,135,219,84,28,198,148,21,138,1,141,14,187,64,166,35,232,131,191,56,217,194,56,160,197,13,33,187,244,76,10,150,167,143,19,141,150,206,92,204,0,9,69,215,49,72,110,250,98,139,119,225,83,202,186,187,93,84,163,160,108,21,136,141,63,214,145,150,14,151,222,215,152,80,199,204,169,17,236,225,250,210,245,250,203,147,
-114,98,215,92,107,121,230,29,64,84,181,222,89,79,132,159,22,14,18,88,15,21,35,25,36,56,112,218,61,35,65,155,101,253,107,167,124,230,90,230,87,203,9,37,78,208,56,100,1,145,174,163,24,138,159,226,51,167,204,33,42,188,253,96,173,36,225,175,180,63,208,238,159,18,131,45,134,9,178,108,201,72,36,171,208,83,21,234,251,126,70,41,226,101,119,104,47,63,121,246,54,36,72,183,29,9,27,116,4,18,42,53,75,83,188,242,82,72,141,179,121,101,222,112,96,126,239,49,231,230,243,254,254,253,194,191,213,208,145,124,204,203,
-160,61,131,138,54,250,154,145,7,187,177,188,84,120,168,167,101,57,59,131,152,75,34,152,169,10,9,181,250,201,16,174,203,136,95,239,93,79,70,244,108,14,109,217,63,205,116,194,14,140,243,90,18,67,234,65,35,2,193,108,112,193,216,119,65,128,151,54,215,71,142,45,230,6,165,0,181,197,188,27,132,132,113,65,138,26,104,90,187,91,67,119,232,152,90,108,217,217,21,45,79,30,12,54,126,95,39,27,45,156,62,0,28,221,185,152,0,18,160,131,49,83,139,174,98,144,146,181,83,209,221,244,197,22,196,239,244,87,239,194,167,148,
-246,217,150,213,174,7,188,233,183,28,141,168,156,49,222,107,133,42,239,42,202,107,121,237,211,112,72,172,248,93,27,111,225,70,42,46,102,222,54,225,127,197,7,160,84,232,84,99,77,243,101,34,2,178,243,229,27,169,194,164,48,132,145,103,41,159,160,38,228,197,174,184,253,222,159,249,214,243,204,58,207,232,253,123,128,169,107,188,153,178,90,253,178,159,9,62,171,132,56,127,44,28,36,176,53,7,21,241,30,42,70,50,7,49,119,115,72,112,225,180,81,107,208,245,122,70,131,54,99,93,178,119,203,250,215,78,210,225,230,
-15,249,204,181,204,224,215,132,141,175,150,18,74,182,141,35,11,157,160,112,200,132,187,65,137,3,35,93,70,26,56,108,7,49,21,63,196,40,14,14,133,103,79,152,66,126,84,169,3,85,121,250,192,76,98,203,129,129,56,197,31,152,35,244,94,179,14,167,157,170,21,150,220,229,84,0,27,252,79,49,90,215,98,98,153,206,121,83,216,73,225,79,23,80,250,126,86,123,215,45,149,98,204,28,212,45,141,138,19,52,150,187,82,31,187,232,145,6,160,217,208,94,126,243,236,71,101,194,173,108,72,145,110,117,83,160,47,58,18,54,232,35,9,
-7,169,8,36,84,106,17,63,101,43,150,167,121,228,143,188,72,165,164,145,27,102,189,138,42,39,242,203,188,224,235,208,141,161,192,253,222,98,217,230,239,35,20,188,225,189,13,167,208,252,38,138,131,63,63,145,178,126,112,208,36,185,105,203,21,248,66,230,70,59,91,253,119,122,220,101,107,181,197,126,90,244,238,83,9,55,247,72,56,118,184,9,174,177,161,18,159,240,138,63,204,51,147,36,253,114,0,0,0,0,1,194,106,55,3,132,212,110,2,70,190,89,7,9,168,220,6,203,194,235,4,141,124,178,5,79,22,133,14,19,81,184,15,209,
-59,143,13,151,133,214,12,85,239,225,9,26,249,100,8,216,147,83,10,158,45,10,11,92,71,61,28,38,163,112,29,228,201,71,31,162,119,30,30,96,29,41,27,47,11,172,26,237,97,155,24,171,223,194,25,105,181,245,18,53,242,200,19,247,152,255,17,177,38,166,16,115,76,145,21,60,90,20,20,254,48,35,22,184,142,122,23,122,228,77,56,77,70,224,57,143,44,215,59,201,146,142,58,11,248,185,63,68,238,60,62,134,132,11,60,192,58,82,61,2,80,101,54,94,23,88,55,156,125,111,53,218,195,54,52,24,169,1,49,87,191,132,48,149,213,179,50,
-211,107,234,51,17,1,221,36,107,229,144,37,169,143,167,39,239,49,254,38,45,91,201,35,98,77,76,34,160,39,123,32,230,153,34,33,36,243,21,42,120,180,40,43,186,222,31,41,252,96,70,40,62,10,113,45,113,28,244,44,179,118,195,46,245,200,154,47,55,162,173,112,154,141,192,113,88,231,247,115,30,89,174,114,220,51,153,119,147,37,28,118,81,79,43,116,23,241,114,117,213,155,69,126,137,220,120,127,75,182,79,125,13,8,22,124,207,98,33,121,128,116,164,120,66,30,147,122,4,160,202,123,198,202,253,108,188,46,176,109,126,
-68,135,111,56,250,222,110,250,144,233,107,181,134,108,106,119,236,91,104,49,82,2,105,243,56,53,98,175,127,8,99,109,21,63,97,43,171,102,96,233,193,81,101,166,215,212,100,100,189,227,102,34,3,186,103,224,105,141,72,215,203,32,73,21,161,23,75,83,31,78,74,145,117,121,79,222,99,252,78,28,9,203,76,90,183,146,77,152,221,165,70,196,154,152,71,6,240,175,69,64,78,246,68,130,36,193,65,205,50,68,64,15,88,115,66,73,230,42,67,139,140,29,84,241,104,80,85,51,2,103,87,117,188,62,86,183,214,9,83,248,192,140,82,58,
-170,187,80,124,20,226,81,190,126,213,90,226,57,232,91,32,83,223,89,102,237,134,88,164,135,177,93,235,145,52,92,41,251,3,94,111,69,90,95,173,47,109,225,53,27,128,224,247,113,183,226,177,207,238,227,115,165,217,230,60,179,92,231,254,217,107,229,184,103,50,228,122,13,5,239,38,74,56,238,228,32,15,236,162,158,86,237,96,244,97,232,47,226,228,233,237,136,211,235,171,54,138,234,105,92,189,253,19,184,240,252,209,210,199,254,151,108,158,255,85,6,169,250,26,16,44,251,216,122,27,249,158,196,66,248,92,174,117,
-243,0,233,72,242,194,131,127,240,132,61,38,241,70,87,17,244,9,65,148,245,203,43,163,247,141,149,250,246,79,255,205,217,120,93,96,216,186,55,87,218,252,137,14,219,62,227,57,222,113,245,188,223,179,159,139,221,245,33,210,220,55,75,229,215,107,12,216,214,169,102,239,212,239,216,182,213,45,178,129,208,98,164,4,209,160,206,51,211,230,112,106,210,36,26,93,197,94,254,16,196,156,148,39,198,218,42,126,199,24,64,73,194,87,86,204,195,149,60,251,193,211,130,162,192,17,232,149,203,77,175,168,202,143,197,159,200,
-201,123,198,201,11,17,241,204,68,7,116,205,134,109,67,207,192,211,26,206,2,185,45,145,175,150,64,144,109,252,119,146,43,66,46,147,233,40,25,150,166,62,156,151,100,84,171,149,34,234,242,148,224,128,197,159,188,199,248,158,126,173,207,156,56,19,150,157,250,121,161,152,181,111,36,153,119,5,19,155,49,187,74,154,243,209,125,141,137,53,48,140,75,95,7,142,13,225,94,143,207,139,105,138,128,157,236,139,66,247,219,137,4,73,130,136,198,35,181,131,154,100,136,130,88,14,191,128,30,176,230,129,220,218,209,132,
-147,204,84,133,81,166,99,135,23,24,58,134,213,114,13,169,226,208,160,168,32,186,151,170,102,4,206,171,164,110,249,174,235,120,124,175,41,18,75,173,111,172,18,172,173,198,37,167,241,129,24,166,51,235,47,164,117,85,118,165,183,63,65,160,248,41,196,161,58,67,243,163,124,253,170,162,190,151,157,181,196,115,208,180,6,25,231,182,64,167,190,183,130,205,137,178,205,219,12,179,15,177,59,177,73,15,98,176,139,101,85,187,215,34,104,186,21,72,95,184,83,246,6,185,145,156,49,188,222,138,180,189,28,224,131,191,90,
-94,218,190,152,52,237,0,0,0,0,184,188,103,101,170,9,200,139,18,181,175,238,143,98,151,87,55,222,240,50,37,107,95,220,157,215,56,185,197,180,40,239,125,8,79,138,111,189,224,100,215,1,135,1,74,214,191,184,242,106,216,221,224,223,119,51,88,99,16,86,80,25,87,159,232,165,48,250,250,16,159,20,66,172,248,113,223,123,192,200,103,199,167,173,117,114,8,67,205,206,111,38,149,173,127,112,45,17,24,21,63,164,183,251,135,24,208,158,26,207,232,39,162,115,143,66,176,198,32,172,8,122,71,201,160,50,175,62,24,142,200,
-91,10,59,103,181,178,135,0,208,47,80,56,105,151,236,95,12,133,89,240,226,61,229,151,135,101,134,135,209,221,58,224,180,207,143,79,90,119,51,40,63,234,228,16,134,82,88,119,227,64,237,216,13,248,81,191,104,240,43,248,161,72,151,159,196,90,34,48,42,226,158,87,79,127,73,111,246,199,245,8,147,213,64,167,125,109,252,192,24,53,159,208,78,141,35,183,43,159,150,24,197,39,42,127,160,186,253,71,25,2,65,32,124,16,244,143,146,168,72,232,247,155,20,88,61,35,168,63,88,49,29,144,182,137,161,247,211,20,118,207,106,
-172,202,168,15,190,127,7,225,6,195,96,132,94,160,112,210,230,28,23,183,244,169,184,89,76,21,223,60,209,194,231,133,105,126,128,224,123,203,47,14,195,119,72,107,203,13,15,162,115,177,104,199,97,4,199,41,217,184,160,76,68,111,152,245,252,211,255,144,238,102,80,126,86,218,55,27,14,185,39,77,182,5,64,40,164,176,239,198,28,12,136,163,129,219,176,26,57,103,215,127,43,210,120,145,147,110,31,244,59,38,247,3,131,154,144,102,145,47,63,136,41,147,88,237,180,68,96,84,12,248,7,49,30,77,168,223,166,241,207,186,
-254,146,223,236,70,46,184,137,84,155,23,103,236,39,112,2,113,240,72,187,201,76,47,222,219,249,128,48,99,69,231,85,107,63,160,156,211,131,199,249,193,54,104,23,121,138,15,114,228,93,55,203,92,225,80,174,78,84,255,64,246,232,152,37,174,139,136,115,22,55,239,22,4,130,64,248,188,62,39,157,33,233,31,36,153,85,120,65,139,224,215,175,51,92,176,202,237,89,182,59,85,229,209,94,71,80,126,176,255,236,25,213,98,59,33,108,218,135,70,9,200,50,233,231,112,142,142,130,40,237,158,212,144,81,249,177,130,228,86,95,
-58,88,49,58,167,143,9,131,31,51,110,230,13,134,193,8,181,58,166,109,189,64,225,164,5,252,134,193,23,73,41,47,175,245,78,74,50,34,118,243,138,158,17,150,152,43,190,120,32,151,217,29,120,244,201,75,192,72,174,46,210,253,1,192,106,65,102,165,247,150,94,28,79,42,57,121,93,159,150,151,229,35,241,242,77,107,25,5,245,215,126,96,231,98,209,142,95,222,182,235,194,9,142,82,122,181,233,55,104,0,70,217,208,188,33,188,136,223,49,234,48,99,86,143,34,214,249,97,154,106,158,4,7,189,166,189,191,1,193,216,173,180,
-110,54,21,8,9,83,29,114,78,154,165,206,41,255,183,123,134,17,15,199,225,116,146,16,217,205,42,172,190,168,56,25,17,70,128,165,118,35,216,198,102,117,96,122,1,16,114,207,174,254,202,115,201,155,87,164,241,34,239,24,150,71,253,173,57,169,69,17,94,204,118,77,238,6,206,241,137,99,220,68,38,141,100,248,65,232,249,47,121,81,65,147,30,52,83,38,177,218,235,154,214,191,179,249,198,233,11,69,161,140,25,240,14,98,161,76,105,7,60,155,81,190,132,39,54,219,150,146,153,53,46,46,254,80,38,84,185,153,158,232,222,
-252,140,93,113,18,52,225,22,119,169,54,46,206,17,138,73,171,3,63,230,69,187,131,129,32,227,224,145,118,91,92,246,19,73,233,89,253,241,85,62,152,108,130,6,33,212,62,97,68,198,139,206,170,126,55,169,207,214,127,65,56,110,195,38,93,124,118,137,179,196,202,238,214,89,29,214,111,225,161,177,10,243,20,30,228,75,168,121,129,19,203,105,215,171,119,14,178,185,194,161,92,1,126,198,57,156,169,254,128,36,21,153,229,54,160,54,11,142,28,81,110,134,102,22,167,62,218,113,194,44,111,222,44,148,211,185,73,9,4,129,
-240,177,184,230,149,163,13,73,123,27,177,46,30,67,210,62,72,251,110,89,45,233,219,246,195,81,103,145,166,204,176,169,31,116,12,206,122,102,185,97,148,222,5,6,241,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,
-50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,
-27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,
-63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,
-97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,
-218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,
-227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,
-124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,
-81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,
-50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,
-27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,
-63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,
-97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,
-218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,
-227,63,81,218,27,124,97,50,227,63,12,0,0,0,4,0,0,0,6,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,9,0,0,0,8,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,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,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,41,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,51,0,0,0,52,0,0,0,53,0,0,0,54,0,0,0,55,0,0,0,56,0,0,0,57,0,0,0,58,0,0,0,61,0,0,0,62,0,0,0,63,0,0,0,64,0,0,0,65,0,0,
-0,66,0,0,0,67,0,0,0,68,0,0,0,71,0,0,0,72,0,0,0,73,0,0,0,74,0,0,0,75,0,0,0,76,0,0,0,77,0,0,0,78,0,0,0,81,0,0,0,82,0,0,0,83,0,0,0,84,0,0,0,85,0,0,0,86,0,0,0,87,0,0,0,88,0,0,0,8,0,0,0,4,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,0,0,0,0,86,0,0,0,4,0,4,0,8,0,4,0,106,0,0,0,4,0,5,0,16,0,8,0,106,0,0,0,4,0,6,0,32,0,32,0,106,0,0,0,4,0,4,0,16,0,16,0,132,0,0,0,8,0,16,0,32,0,32,0,132,0,0,0,8,0,16,0,128,0,128,0,132,0,0,0,8,0,32,0,128,0,0,1,132,0,0,0,32,0,128,0,2,1,0,4,132,
-0,0,0,32,0,2,1,2,1,0,16,132,0,0,0,88,247,1,0,85,93,201,127,201,127,255,0,0,196,1,0,187,45,212,190,174,212,255,0,144,167,1,0,20,119,253,253,192,134,255,0,80,145,1,0,85,93,201,127,201,127,255,0,248,122,1,0,187,45,212,190,174,212,255,0,72,101,1,0,20,119,253,253,192,134,255,0,168,80,1,0,42,102,255,255,255,153,255,0,216,61,1,0,85,93,201,127,201,127,255,0,40,142,2,0,187,45,212,190,174,212,255,0,104,125,2,0,20,119,253,253,192,134,255,0,72,109,2,0,42,102,255,255,255,153,255,0,192,89,2,0,151,173,176,56,108,
-176,255,0,32,77,2,0,85,93,201,127,201,127,255,0,216,65,2,0,187,45,212,190,174,212,255,0,136,53,2,0,20,119,253,253,192,134,255,0,0,42,2,0,42,102,255,255,255,153,255,0,152,29,2,0,151,173,176,56,108,176,255,0,128,19,2,0,232,252,240,240,2,127,255,0,24,9,2,0,85,93,201,127,201,127,255,0,88,0,2,0,187,45,212,190,174,212,255,0,200,246,1,0,20,119,253,253,192,134,255,0,16,231,1,0,42,102,255,255,255,153,255,0,192,221,1,0,151,173,176,56,108,176,255,0,16,218,1,0,232,252,240,240,2,127,255,0,176,215,1,0,17,224,191,
-191,91,23,255,0,232,211,1,0,85,93,201,127,201,127,255,0,144,208,1,0,187,45,212,190,174,212,255,0,24,205,1,0,20,119,253,253,192,134,255,0,80,202,1,0,42,102,255,255,255,153,255,0,232,197,1,0,151,173,176,56,108,176,255,0,168,193,1,0,232,252,240,240,2,127,255,0,248,192,1,0,17,224,191,191,91,23,255,0,112,189,1,0,0,0,102,102,102,102,255,0,192,186,1,0,147,25,247,222,235,247,255,0,168,184,1,0,142,75,225,158,202,225,255,0,120,181,1,0,145,188,189,49,130,189,255,0,112,180,1,0,159,16,255,239,243,255,255,0,16,
-178,1,0,143,46,231,189,215,231,255,0,80,175,1,0,143,127,214,107,174,214,255,0,120,172,1,0,147,208,181,33,113,181,255,0,72,169,1,0,159,16,255,239,243,255,255,0,8,166,1,0,143,46,231,189,215,231,255,0,136,162,1,0,143,127,214,107,174,214,255,0,152,160,1,0,145,188,189,49,130,189,255,0,24,159,1,0,149,241,156,8,81],"i8",L,l.J+30737);D([156,255,0,104,157,1,0,159,16,255,239,243,255,255,0,120,154,1,0,148,43,239,198,219,239,255,0,248,153,1,0,142,75,225,158,202,225,255,0,248,151,1,0,143,127,214,107,174,214,255,
-0,56,150,1,0,145,188,189,49,130,189,255,0,216,146,1,0,149,241,156,8,81,156,255,0,72,144,1,0,159,16,255,239,243,255,255,0,72,140,1,0,148,43,239,198,219,239,255,0,168,138,1,0,142,75,225,158,202,225,255,0,208,136,1,0,143,127,214,107,174,214,255,0,32,135,1,0,144,169,198,66,146,198,255,0,32,133,1,0,147,208,181,33,113,181,255,0,152,131,1,0,151,241,148,8,69,148,255,0,232,129,1,0,148,8,255,247,251,255,255,0,80,128,1,0,147,25,247,222,235,247,255,0,8,125,1,0,148,43,239,198,219,239,255,0,8,122,1,0,142,75,225,
-158,202,225,255,0,160,118,1,0,143,127,214,107,174,214,255,0,144,116,1,0,144,169,198,66,146,198,255,0,208,114,1,0,147,208,181,33,113,181,255,0,48,113,1,0,151,241,148,8,69,148,255,0,168,111,1,0,148,8,255,247,251,255,255,0,208,109,1,0,147,25,247,222,235,247,255,0,224,107,1,0,148,43,239,198,219,239,255,0,56,106,1,0,142,75,225,158,202,225,255,0,128,103,1,0,143,127,214,107,174,214,255,0,104,100,1,0,144,169,198,66,146,198,255,0,24,98,1,0,147,208,181,33,113,181,255,0,224,95,1,0,149,241,156,8,81,156,255,0,
-248,93,1,0,152,235,107,8,48,107,255,0,80,92,1,0,23,239,84,84,48,5,255,0,120,90,1,0,119,255,60,0,60,48,255,0,168,88,1,0,23,236,140,140,81,10,255,0,248,86,1,0,24,194,191,191,129,45,255,0,64,85,1,0,29,112,223,223,194,125,255,0,16,83,1,0,30,52,246,246,232,195,255,0,184,80,1,0,121,38,234,199,234,229,255,0,192,77,1,0,120,95,205,128,205,193,255,0,240,75,1,0,124,165,151,53,151,143,255,0,184,74,1,0,124,252,102,1,102,94,255,0,232,72,1,0,23,239,84,84,48,5,255,0,72,71,1,0,124,252,102,1,102,94,255,0,200,69,1,
-0,119,255,60,0,60,48,255,0,16,68,1,0,23,236,140,140,81,10,255,0,176,66,1,0,24,194,191,191,129,45,255,0,88,64,1,0,29,112,223,223,194,125,255,0,48,62,1,0,30,52,246,246,232,195,255,0,160,59,1,0,0,0,245,245,245,245,255,0,232,57,1,0,121,38,234,199,234,229,255,0,112,56,1,0,120,95,205,128,205,193,255,0,208,54,1,0,124,165,151,53,151,143,255,0,104,53,1,0,28,135,216,216,179,101,255,0,88,52,1,0,0,0,245,245,245,245,255,0,248,147,2,0,123,127,180,90,180,172,255,0,176,146,2,0,21,215,166,166,97,26,255,0,32,145,2,
-0,29,112,223,223,194,125,255,0,24,143,2,0,120,95,205,128,205,193,255,0,112,140,2,0,121,253,133,1,133,113,255,0,224,138,2,0,21,215,166,166,97,26,255,0,96,137,2,0,29,112,223,223,194,125,255,0,232,135,2,0,0,0,245,245,245,245,255,0,160,134,2,0,120,95,205,128,205,193,255,0,104,133,2,0,121,253,133,1,133,113,255,0,224,131,2,0,23,236,140,140,81,10,255,0,152,130,2,0,28,135,216,216,179,101,255,0,248,128,2,0,30,52,246,246,232,195,255,0,248,126,2,0,121,38,234,199,234,229,255,0,16,124,2,0,123,127,180,90,180,172,
-255,0,184,122,2,0,124,252,102,1,102,94,255,0,80,121,2,0,23,236,140,140,81,10,255,0,248,119,2,0,28,135,216,216,179,101,255,0,208,118,2,0,30,52,246,246,232,195,255,0,128,117,2,0,0,0,245,245,245,245,255,0,48,116,2,0,121,38,234,199,234,229,255,0,8,115,2,0,123,127,180,90,180,172,255,0,248,112,2,0,124,252,102,1,102,94,255,0,40,109,2,0,23,236,140,140,81,10,255,0,152,108,2,0,24,194,191,191,129,45,255,0,104,107,2,0,29,112,223,223,194,125,255,0,80,106,2,0,30,52,246,246,232,195,255,0,48,105,2,0,121,38,234,199,
-234,229,255,0,168,103,2,0,120,95,205,128,205,193,255,0,120,101,2,0,124,165,151,53,151,143,255,0,32,100,2,0,124,252,102,1,102,94,255,0,144,98,2,0,23,236,140,140,81,10,255,0,128,93,2,0,24,194,191,191,129,45,255,0,104,91,2,0,29,112,223,223,194,125,255,0,16,89,2,0,30,52,246,246,232,195,255,0,176,87,2,0,0,0,245,245,245,245,255,0,184,86,2,0,121,38,234,199,234,229,255,0,152,85,2,0,120,95,205,128,205,193,255,0,192,84,2,0,124,165,151,53,151,143,255,0,136,83,2,0,124,252,102,1,102,94,255,0,144,82,2,0,135,20,
-249,229,245,249,255,0,120,81,2,0,117,74,216,153,216,201,255,0,40,80,2,0,103,185,162,44,162,95,255,0,216,78,2,0,136,14,251,237,248,251,255,0,208,76,2,0,127,54,226,178,226,226,255,0,232,75,2,0,113,120,194,102,194,164,255,0,0,75,2,0,98,190,139,35,139,69,255,0,0,74,2,0,136,14,251,237,248,251,255,0,48,73,2,0,127,54,226,178,226,226,255,0,64,72,2,0,113,120,194,102,194,164,255,0,56,71,2,0,103,185,162,44,162,95,255,0,104,70,2,0,102,255,109,0,109,44,255,0,16,69,2,0,136,14,251,237,248,251,255,0,80,67,2,0,119,
-34,236,204,236,230,255,0,152,65,2,0,117,74,216,153,216,201,255,0,152,64,2,0,113,120,194,102,194,164,255,0,128,63,2,0,103,185,162,44,162,95,255,0,80,62,2,0,102,255,109,0,109,44,255,0,96,61,2,0,136,14,251,237,248,251,255,0,192,59,2,0,119,34,236,204,236,230,255,0,48,59,2,0,117,74,216,153,216,201,255,0,48,58,2,0,113,120,194,102,194,164,255,0,128,56,2,0,105,159,174,65,174,118,255,0,8,55,2,0,98,190,139,35,139,69,255,0,88,53,2,0,102,255,88,0,88,36,255,0,88,52,2,0,134,6,253,247,252,253,255,0,64,51,2,0,135,
-20,249,229,245,249,255,0,8,50,2,0,119,34,236,204,236,230,255,0,88,49,2,0,117,74,216,153,216,201,255,0,112,48,2,0,113,120,194,102,194,164,255,0,112,47,2,0,105,159,174,65,174,118,255,0,144,46,2,0,98,190,139,35,139,69,255,0,224,44,2,0,102,255,88,0,88,36,255,0,96,43,2,0,134,6,253,247,252,253,255,0,216,41,2,0,135,20,249,229,245,249,255,0,80,40,2,0,119,34,236,204,236,230,255,0,80,39,2,0,117,74,216,153,216,201,255,0,72,38,2,0,113,120,194,102,194,164,255,0,104,37,2,0,105,159,174,65,174,118,255,0,112,36,2,
-0,98,190,139,35,139,69,255,0,96,35,2,0,102,255,109,0,109,44,255,0,88,34,2,0,101,255,68,0,68,27,255,0,240,32,2,0,144,20,244,224,236,244,255,0,96,31,2,0,148,70,218,158,188,218,255,0,168,29,2,0,196,123,167,136,86,167,255,0,144,28,2,0,136,14,251,237,248,251,255,0,224,27,2,0,146,53,227,179,205,227,255,0,48,27,2,0,162,74,198,140,150,198,255,0,120,26,2,0,202,149,157,136,65,157,255,0,128,25,2,0,136,14,251,237,248,251,255,0,160,24,2,0,146,53,227,179,205,227,255,0,224,23,2,0,162,74,198,140,150,198,255,0,168,
-22,2,0,196,123,167,136,86,167,255,0,112,21,2,0,214,225,129,129,15,124,255,0,160,19,2,0,136,14,251,237,248,251,255,0,136,18,2,0,148,43,230,191,211,230,255,0,152,17,2,0,148,70,218,158,188,218,255,0,40,16,2,0,162,74,198,140,150,198,255,0,24,15,2,0,196,123,167,136,86,167,255,0,24,14,2,0,214,225,129,129,15,124,255,0,24,13,2,0,136,14,251,237,248,251,255,0,144,12,2,0,148,43,230,191,211,230,255,0,48,11,2,0,148,70,218,158,188,218,255,0,64,10,2,0,162,74,198,140,150,198,255,0,56,9,2,0,190,100,177,140,107,177,
-255,0,120,8,2,0,202,149,157,136,65,157,255,0,232,7,2,0,213,252,110,110,1,107,255,0,48,7,2,0,134,6,253,247,252,253,255,0,168,6,2,0,144,20,244,224,236,244,255,0,24,6,2,0,148,43,230,191,211,230,255,0,112,5,2,0,148,70,218,158,188,218,255,0,224,4,2,0,162,74,198,140,150,198,255,0,112,3,2,0,190,100,177,140,107,177,255,0,0,2,2,0,202,149,157,136,65,157,255,0,224,0,2,0,213,252,110,110,1,107,255,0,216,255,1,0,134,6,253,247,252,253,255,0,72,255,1,0,144,20,244,224,236,244,255,0,184,254,1,0,148,43,230,191,211,
-230,255,0,32,254,1,0,148,70,218,158,188,218,255,0,136,253,1,0,162,74,198,140,150,198,255,0,104,252,1,0,190,100,177,140,107,177,255,0,184,251,1,0,202,149,157,136,65,157,255,0,160,250,1,0,214,225,129,129,15,124,255,0,208,248,1,0,213,255,77,77,0,75,255,0,152,246,1,0,114,211,158,27,158,119,255,0,40,246,1,0,18,252,217,217,95,2,255,0,16,245,1,0,173,95,179,117,112,179,255,0,40,244,1,0,114,211,158,27,158,119,255,0,208,242,1,0,18,252,217,217,95,2,255,0,168,241,1,0,173,95,179,117,112,179,255,0,136,240,1,0,
-233,209,231,231,41,138,255,0,128,239,1,0,114,211,158,27,158,119,255,0,152,237,1,0,18,252,217,217,95,2,255,0,152,236,1,0,173,95,179,117,112,179,255,0,216,234,1,0,233,209,231,231,41,138,255,0,16,234,1,0,62,208,166,102,166,30,255,0,232,232,1,0,114,211,158,27,158,119,255,0,56,232,1,0,18,252,217,217,95,2,255,0,176,231,1,0,173,95,179,117,112,179,255,0,56,231,1,0,233,209,231,231,41,138,255,0,32,230,1,0,62,208,166,102,166,30,255,0,128,229,1,0,31,252,230,230,171,2,255,0,24,228,1,0,114,211,158,27,158,119,255,
-0,232,226,1,0,18,252,217,217,95,2,255,0,176,225,1,0,173,95,179,117,112,179,255,0,200,224,1,0,233,209,231,231,41,138,255,0,0,224,1,0,62,208,166,102,166,30,255,0,88,223,1,0,31,252,230,230,171,2,255,0,96,222,1,0,27,210,166,166,118,29,255,0,232,221,1,0,114,211,158,27,158,119,255,0,0,221,1,0,18,252,217,217,95,2,255,0,168,220,1,0,173,95,179,117,112,179,255,0,48,220,1,0,233,209,231,231,41,138,255,0,144,219,1,0,62,208,166,102,166,30,255,0,8,219,1,0,31,252,230,230,171,2,255,0,200,218,1,0,27,210,166,166,118,
-29,255,0,168,218,1,0,0,0,102,102,102,102,255,0,104,218,1,0,76,25,243,224,243,219,255,0,64,218,1,0,95,61,221,168,221,181,255,0,40,218,1,0,140,170,202,67,162,202,255,0,192,217,1,0,65,17,249,240,249,232,255,0,160,217,1,0,87,46,228,186,228,188,255,0,24,217,1,0,123,101,204,123,204,196,255,0,40,216,1,0,141,197,190,43,140,190,255,0,200,215,1,0,65,17,249,240,249,232,255,0,152,215,1,0,87,46,228,186,228,188,255,0,96,215,1,0,123,101,204,123,204,196,255,0,40,215,1,0,140,170,202,67,162,202,255,0,168,214,1,0,145,
-243,172,8,104,172,255,0,144,214,1,0,65,17,249,240,249,232,255,0,64,214,1,0,77,41,235,204,235,197,255,0,16,214,1,0,95,61,221,168,221,181,255,0,208,213,1,0,123,101,204,123,204,196,255,0,64,213,1,0,140,170,202,67,162,202,255,0,200,212,1,0,145,243,172,8,104,172,255,0,160,212,1,0,65,17,249,240,249,232,255,0,112,212,1,0,77,41,235,204,235,197,255,0,72,212,1,0,95,61,221,168,221,181,255,0,32,212,1,0,123,101,204,123,204,196,255,0,8,212,1,0,137,160,211,78,179,211,255,0,184,211,1,0,141,197,190,43,140,190,255,
-0,64,211,1,0,147,242,158,8,88,158,255,0,248,210,1,0,60,12,252,247,252,240,255,0,16,210,1,0,76,25,243,224,243,219,255,0,128,209,1,0,77,41,235,204,235,197,255,0,96,209,1,0,95,61,221,168,221,181,255,0,56,209,1,0,123,101,204,123,204,196,255,0,8,209,1,0,137,160,211,78,179,211,255,0,224,208,1,0,141,197,190,43,140,190,255,0,184,208,1,0,147,242,158,8,88,158,255,0,96,208,1,0,60,12,252,247,252,240,255,0,56,208,1,0,76,25,243,224,243,219,255,0,248,207,1,0,77,41,235,204,235,197,255,0,120,207,1,0,95,61,221,168,
-221,181,255,0,16,207,1,0,123,101,204,123,204,196,255,0,208,206,1,0,137,160,211,78,179,211,255,0,80,206,1,0,141,197,190,43,140,190,255,0,232,205,1,0,145,243,172,8,104,172,255,0,160,205,1,0,150,239,129,8,64,129,255,0,96,205,1,0,74,21,245,229,245,224,255,0,208,204,1,0,80,72,217,161,217,155,255,0,184,204,1,0,98,178,163,49,163,84,255,0,104,204,1,0,73,15,248,237,248,233,255,0,192,203,1,0,78,54,228,186,228,179,255,0,88,203,1,0,86,104,196,116,196,118,255,0,48,203,1,0,98,190,139,35,139,69,255,0,224,202,1,
-0,73,15,248,237,248,233,255,0,152,202,1,0,78,54,228,186,228,179,255,0,120,202,1,0,86,104,196,116,196,118,255,0,104,202,1,0,98,178,163,49,163,84,255,0,32,202,1,0,102,255,109,0,109,44,255,0,0,202,1,0,73,15,248,237,248,233,255,0,224,200,1,0,77,44,233,199,233,192,255,0,48,200,1,0,80,72,217,161,217,155,255,0,184,199,1,0,86,104,196,116,196,118,255,0,8,199,1,0,98,178,163,49,163,84,255,0,192,198,1,0,102,255,109,0,109,44,255,0,104,198,1,0,73,15,248,237,248,233,255,0,64,198,1,0,77,44,233,199,233,192,255,0,
-40,198,1,0,80,72,217,161,217,155,255,0,176,197,1,0,86,104,196,116,196,118,255,0,136,197,1,0,96,158,171,65,171,93,255,0,64,197,1,0,98,190,139,35,139,69,255,0,136,196,1,0,108,255,90,0,90,50,255,0,24,196,1,0,72,7,252,247,252,245,255,0,112,195,1,0,74,21,245,229,245,224,255,0,0,195,1,0,77,44,233,199,233,192,255,0,200,194,1,0,80,72,217,161,217,155,255,0,168,194,1,0,86,104,196,116,196,118,255,0,8,194,1,0,96,158,171,65,171,93,255,0,112,193,1,0,98,190,139,35,139,69,255,0,8,193,1,0,108,255,90,0,90,50,255,0,
-32,192,1,0,72,7,252,247,252,245,255,0,56,191,1,0,74,21,245,229,245,224,255,0,168,190,1,0,77,44,233,199,233,192,255,0,112,190,1,0,80,72,217,161,217,155,255,0,72,190,1,0,86,104,196,116,196,118,255,0,24,190,1,0,96,158,171,65,171,93,255,0,248,189,1,0,98,190,139,35,139,69,255,0,192,189,1,0,102,255,109,0,109,44,255,0,144,189,1,0,101,255,68,0,68,27,255,0,128,189,1,0,0,0,240,240,240,240,255,0,240,188,1,0,0,0,189,189,189,189,255,0,32,188,1,0,0,0,99,99,99,99,255,0,208,187,1,0,0,0,247,247,247,247,255,0,176,
-187,1,0,0,0,204,204,204,204,255,0,112,187,1,0,0,0,150,150,150,150,255,0,80,187,1,0,0,0,82,82,82,82,255,0,56,187,1,0,0,0,247,247,247,247,255,0,16,187,1,0,0,0,204,204,204,204,255,0,224,186,1,0,0,0,150,150,150,150,255,0,208,186,1,0,0,0,99,99,99,99,255,0,128,186,1,0,0,0,37,37,37,37,255,0,40,186,1,0,0,0,247,247,247,247,255,0,168,185,1,0,0,0,217,217,217,217,255,0,128,185,1,0,0,0,189,189,189,189,255,0,104,185,1,0,0,0,150,150,150,150,255,0,72,185,1,0,0,0,99,99,99,99,255,0,16,185,1,0,0,0,37,37,37,37,255,0,
-248,184,1,0,0,0,247,247,247,247,255,0,200,184,1,0,0,0,217,217,217,217,255,0,184,184,1,0,0,0,189,189,189,189,255,0,120,184,1,0,0,0,150,150,150,150,255,0,232,183,1,0,0,0,115,115,115,115,255,0,168,183,1,0,0,0,82,82,82,82,255,0,136,183,1,0,0,0,37,37,37,37,255,0,112,183,1,0,0,0,255,255,255,255,255,0,72,183,1,0,0,0,240,240,240,240,255,0,48,183,1,0,0,0,217,217,217,217,255,0,24,183,1,0,0,0,189,189,189,189,255,0,224,182,1,0,0,0,150,150,150,150,255,0,208,182,1,0,0,0,115,115,115,115,255,0,176,182,1,0,0,0,82,
-82,82,82,255,0,240,181,1,0,0,0,37,37,37,37,255,0,160,181,1,0,0,0,255,255,255,255,255,0,96,181,1,0,0,0,240,240,240,240,255,0,64,181,1,0,0,0,217,217,217,217,255,0,16,181,1,0,0,0,189,189,189,189,255,0,248,180,1,0,0,0,150,150,150,150,255,0,224,180,1,0,0,0,115,115,115,115,255,0,144,180,1,0,0,0,82,82,82,82,255,0,128,180,1,0,0,0,37,37,37,37,255,0,64,180,1,0,0,0,0,0,0,0,255,0,176,179,1,0,21,48,254,254,230,206,255,0,72,179,1,0,19,147,253,253,174,107,255,0,24,179,1,0,14,240,230,230,85,13,255,0,240,178,1,0,
-19,32,254,254,237,222,255,0,200,178,1,0,20,120,253,253,190,133,255,0,184,178,1,0,17,194,253,253,141,60,255,0,160,178,1,0,13,253,217,217,71,1,255,0,48,178,1,0,19,32,254,254,237,222,255,0,32,178,1,0,20,120,253,253,190,133,255,0,200,177,1,0,17,194,253,253,141,60,255,0,8,177,1,0,14,240,230,230,85,13,255,0,96,176,1,0,13,250,166,166,54,3,255,0,80,176,1,0,19,32,254,254,237,222,255,0,40,176,1,0,21,91,253,253,208,162,255,0,0,176,1,0,19,147,253,253,174,107,255,0,240,175,1,0,17,194,253,253,141,60,255,0,224,
-175,1,0,14,240,230,230,85,13,255,0,112,175,1,0,13,250,166,166,54,3,255,0,96,175,1,0,19,32,254,254,237,222,255,0,40,175,1,0,21,91,253,253,208,162,255,0,48,174,1,0,19,147,253,253,174,107,255,0,216,173,1,0,17,194,253,253,141,60,255,0,200,173,1,0,16,234,241,241,105,19,255,0,160,173,1,0,13,253,217,217,72,1,255,0,120,173,1,0,12,247,140,140,45,4,255,0,104,173,1,0,21,20,255,255,245,235,255,0,88,173,1,0,21,48,254,254,230,206,255,0,248,172,1,0,21,91,253,253,208,162,255,0,136,172,1,0,19,147,253,253,174,107,
-255,0,64,172,1,0,17,194,253,253,141,60,255,0,144,171,1,0,16,234,241,241,105,19,255,0,8,171,1,0,13,253,217,217,72,1,255,0,200,170,1,0,12,247,140,140,45,4,255,0,128,170,1,0,21,20,255,255,245,235,255,0,16,170,1,0,21,48,254,254,230,206,255,0,208,169,1,0,21,91,253,253,208,162,255,0,184,169,1,0,19,147,253,253,174,107,255,0,152,169,1,0,17,194,253,253,141,60,255,0,88,169,1,0,16,234,241,241,105,19,255,0,8,169,1,0,13,253,217,217,72,1,255,0,96,168,1,0,13,250,166,166,54,3,255,0,232,167,1,0,12,246,127,127,39,
-4,255,0,208,167,1,0,25,54,254,254,232,200,255,0,120,167,1,0,19,121,253,253,187,132,255,0,48,167,1,0,5,197,227,227,74,51,255,0,240,166,1,0,26,37,254,254,240,217,255,0,136,166,1,0,24,115,253,253,204,138,255,0,80,166,1,0,13,164,252,252,141,89,255,0,24,166,1,0,3,218,215,215,48,31,255,0,56,165,1,0,26,37,254,254,240,217,255,0,104,164,1,0,24,115,253,253,204,138,255,0,112,163,1,0,13,164,252,252,141,89,255,0,96,163,1,0,5,197,227,227,74,51,255,0,32,163,1,0,0,255,179,179,0,0,255,0,0,163,1,0,26,37,254,254,240,
-217,255,0,240,162,1,0,24,95,253,253,212,158,255,0,200,162,1,0,19,121,253,253,187,132,255,0,168,162,1,0,13,164,252,252,141,89,255,0,152,162,1,0,5,197,227,227,74,51,255,0,80,162,1,0,0,255,179,179,0,0,255,0,200,161,1,0,26,37,254,254,240,217,255,0,96,161,1,0,24,95,253,253,212,158,255,0,64,161,1,0,19,121,253,253,187,132,255,0,32,161,1,0,13,164,252,252,141,89,255,0,248,160,1,0,7,178,239,239,101,72,255,0,224,160,1,0,3,218,215,215,48,31,255,0,208,160,1,0,0,255,153,153,0,0,255,0,184,160,1,0,24,18,255,255,
-247,236,255,0,168,160,1,0,25,54,254,254,232,200,255,0,136,160,1,0,24,95,253,253,212,158,255,0,16,160,1,0,19,121,253,253,187,132,255,0,184,159,1,0,13,164,252,252,141,89,255,0,168,159,1,0,7,178,239,239,101,72,255,0,128,159,1,0,3,218,215,215,48,31,255,0,96,159,1,0,0,255,153,153,0,0,255,0,80,159,1,0,24,18,255,255,247,236,255,0,56,159,1,0,25,54,254,254,232,200,255,0,8,159,1,0,24,95,253,253,212,158,255,0,248,158,1,0,19,121,253,253,187,132,255,0,224,158,1,0,13,164,252,252,141,89,255,0,96,158,1,0,7,178,239,
-239,101,72,255,0,24,158,1,0,3,218,215,215,48,31,255,0,8,158,1,0,0,255,179,179,0,0,255,0,224,157,1,0,0,255,127,127,0,0,255,0,184,157,1,0,142,68,227,166,206,227,255,0,168,157,1,0,190,153,154,106,61,154,255,0,128,157,1,0,144,211,180,31,120,180,255,0,48,157,1,0,65,97,223,178,223,138,255,0,32,157,1,0,82,184,160,51,160,44,255,0,16,157,1,0,0,99,251,251,154,153,255,0,136,156,1,0,254,225,227,227,26,28,255,0,16,156,1,0,23,143,253,253,191,111,255,0,0,156,1,0,21,255,255,255,127,0,255,0,216,155,1,0,198,42,214,
-202,178,214,255,0,184,155,1,0,142,68,227,166,206,227,255,0,152,155,1,0,190,153,154,106,61,154,255,0,136,155,1,0,42,102,255,255,255,153,255,0,104,155,1,0,144,211,180,31,120,180,255,0,88,155,1,0,65,97,223,178,223,138,255,0,64,155,1,0,82,184,160,51,160,44,255,0,200,154,1,0,0,99,251,251,154,153,255,0,136,154,1,0,254,225,227,227,26,28,255,0,104,154,1,0,23,143,253,253,191,111,255,0,80,154,1,0,21,255,255,255,127,0,255,0,56,154,1,0,198,42,214,202,178,214,255,0,40,154,1,0,142,68,227,166,206,227,255,0,16,154,
-1,0,190,153,154,106,61,154,255,0,232,153,1,0,42,102,255,255,255,153,255,0,216,153,1,0,15,197,177,177,89,40,255,0,200,153,1,0,144,211,180,31,120,180,255,0,56,153,1,0,65,97,223,178,223,138,255,0,200,152,1,0,82,184,160,51,160,44,255,0,184,152,1,0,0,99,251,251,154,153,255,0,152,152,1,0,254,225,227,227,26,28,255,0,120,152,1,0,23,143,253,253,191,111,255,0,104,152,1,0,21,255,255,255,127,0,255,0,88,152,1,0,198,42,214,202,178,214,255,0,232,151,1,0,142,68,227,166,206,227,255,0,216,151,1,0,144,211,180,31,120,
-180,255,0,200,151,1,0,65,97,223,178,223,138,255,0,80,151,1,0,142,68,227,166,206,227,255,0,224,150,1,0,144,211,180,31,120,180,255,0,208,150,1,0,65,97,223,178,223,138,255,0,176,150,1,0,82,184,160,51,160,44,255,0,152,150,1,0,142,68,227,166,206,227,255,0,136,150,1,0,144,211,180,31,120,180,255,0,120,150,1,0,65,97,223,178,223,138,255,0,40,150,1,0,82,184,160,51,160,44,255,0,192,149,1,0,0,99,251,251,154,153,255,0,152,149,1,0,142,68,227,166,206,227,255,0,240,148,1,0,144,211,180,31,120,180,255,0,248,147,1,
-0,65,97,223,178,223,138,255,0,208,147,1,0,82,184,160,51,160,44,255,0,184,147,1,0,0,99,251,251,154,153,255,0,136,147,1,0,254,225,227,227,26,28,255,0,104,147,1,0,142,68,227,166,206,227,255,0,72,147,1,0,144,211,180,31,120,180,255,0,200,146,1,0,65,97,223,178,223,138,255,0,184,146,1,0,82,184,160,51,160,44,255,0,168,146,1,0,0,99,251,251,154,153,255,0,88,146,1,0,254,225,227,227,26,28,255,0,200,145,1,0,23,143,253,253,191,111,255,0,184,145,1,0,142,68,227,166,206,227,255,0,128,145,1,0,144,211,180,31,120,180,
-255,0,40,145,1,0,65,97,223,178,223,138,255,0,16,145,1,0,82,184,160,51,160,44,255,0,144,144,1,0,0,99,251,251,154,153,255,0,56,144,1,0,254,225,227,227,26,28,255,0,208,143,1,0,23,143,253,253,191,111,255,0,48,143,1,0,21,255,255,255,127,0,255,0,168,142,1,0,142,68,227,166,206,227,255,0,152,141,1,0,144,211,180,31,120,180,255,0,136,141,1,0,65,97,223,178,223,138,255,0,80,141,1,0,82,184,160,51,160,44,255,0,144,140,1,0,0,99,251,251,154,153,255,0,128,140,1,0,254,225,227,227,26,28,255,0,96,140,1,0,23,143,253,
-253,191,111,255,0,56,140,1,0,21,255,255,255,127,0,255,0,16,140,1,0,198,42,214,202,178,214,255,0,0,140,1,0,3,78,251,251,180,174,255,0,184,139,1,0,146,53,227,179,205,227,255,0,96,139,1,0,77,41,235,204,235,197,255,0,72,139,1,0,3,78,251,251,180,174,255,0,48,139,1,0,146,53,227,179,205,227,255,0,248,138,1,0,77,41,235,204,235,197,255,0,224,138,1,0,202,27,228,222,203,228,255,0,208,138,1,0,3,78,251,251,180,174,255,0,152,138,1,0,146,53,227,179,205,227,255,0,136,138,1,0,77,41,235,204,235,197,255,0,120,138,1,
-0,202,27,228,222,203,228,255,0,240,137,1,0,24,88,254,254,217,166,255,0,160,137,1,0,3,78,251,251,180,174,255,0,144,137,1,0,146,53,227,179,205,227,255,0,120,137,1,0,77,41,235,204,235,197,255,0,24,137,1,0,202,27,228,222,203,228,255,0,8,137,1,0,24,88,254,254,217,166,255,0,248,136,1,0,42,50,255,255,255,204,255,0,192,136,1,0,3,78,251,251,180,174,255,0,176,136,1,0,146,53,227,179,205,227,255,0,160,136,1,0,77,41,235,204,235,197,255,0,80,136,1,0,202,27,228,222,203,228,255,0,8,136,1,0,24,88,254,254,217,166,
-255,0,248,135,1,0,42,50,255,255,255,204,255,0,200,135,1,0,28,44,229,229,216,189,255,0,120,135,1,0,3,78,251,251,180,174,255,0,104,135,1,0,146,53,227,179,205,227,255,0,88,135,1,0,77,41,235,204,235,197,255,0,16,135,1,0,202,27,228,222,203,228,255,0,0,135,1,0,24,88,254,254,217,166,255,0,240,134,1,0,42,50,255,255,255,204,255,0,40,134,1,0,28,44,229,229,216,189,255,0,216,133,1,0,233,35,253,253,218,236,255,0,200,133,1,0,3,78,251,251,180,174,255,0,176,133,1,0,146,53,227,179,205,227,255,0,104,133,1,0,77,41,
-235,204,235,197,255,0,88,133,1,0,202,27,228,222,203,228,255,0,56,133,1,0,24,88,254,254,217,166,255,0,16,133,1,0,42,50,255,255,255,204,255,0,0,133,1,0,28,44,229,229,216,189,255,0,240,132,1,0,233,35,253,253,218,236,255,0,176,132,1,0,0,0,242,242,242,242,255,0,72,132,1,0,108,53,226,179,226,205,255,0,56,132,1,0,17,81,253,253,205,172,255,0,16,132,1,0,155,31,232,203,213,232,255,0,216,131,1,0,108,53,226,179,226,205,255,0,200,131,1,0,17,81,253,253,205,172,255,0,176,131,1,0,155,31,232,203,213,232,255,0,136,
-131,1,0,228,43,244,244,202,228,255,0,120,131,1,0,108,53,226,179,226,205,255,0,104,131,1,0,17,81,253,253,205,172,255,0,16,131,1,0,155,31,232,203,213,232,255,0,176,130,1,0,228,43,244,244,202,228,255,0,160,130,1,0,56,45,245,230,245,201,255,0,128,130,1,0,108,53,226,179,226,205,255,0,56,130,1,0,17,81,253,253,205,172,255,0,40,130,1,0,155,31,232,203,213,232,255,0,24,130,1,0,228,43,244,244,202,228,255,0,216,129,1,0,56,45,245,230,245,201,255,0,200,129,1,0,35,81,255,255,242,174,255,0,184,129,1,0,108,53,226,
-179,226,205,255,0,112,129,1,0,17,81,253,253,205,172,255,0,8,129,1,0,155,31,232,203,213,232,255,0,248,128,1,0,228,43,244,244,202,228,255,0,224,128,1,0,56,45,245,230,245,201,255,0,144,128,1,0,35,81,255,255,242,174,255,0,128,128,1,0,25,39,241,241,226,204,255,0,112,128,1,0,108,53,226,179,226,205,255,0,64,128,1,0,17,81,253,253,205,172,255,0,176,127,1,0,155,31,232,203,213,232,255,0,152,127,1,0,228,43,244,244,202,228,255,0,56,127,1,0,56,45,245,230,245,201,255,0,160,126,1,0,35,81,255,255,242,174,255,0,80,
-126,1,0,25,39,241,241,226,204,255,0,24,126,1,0,0,0,204,204,204,204,255,0,136,125,1,0,230,253,142,142,1,82,255,0,104,125,1,0,77,191,100,39,100,25,255,0,64,125,1,0,230,220,197,197,27,125,255,0,248,124,1,0,232,118,222,222,119,174,255,0,232,124,1,0,229,62,241,241,182,218,255,0,216,124,1,0,233,29,253,253,224,239,255,0,144,124,1,0,59,38,245,230,245,208,255,0,248,123,1,0,61,103,225,184,225,134,255,0,232,123,1,0,63,166,188,127,188,65,255,0,152,123,1,0,68,197,146,77,146,33,255,0,8,123,1,0,230,253,142,142,
-1,82,255,0,112,122,1,0,68,197,146,77,146,33,255,0,80,122,1,0,77,191,100,39,100,25,255,0,248,121,1,0,230,220,197,197,27,125,255,0,104,121,1,0,232,118,222,222,119,174,255,0,168,120,1,0,229,62,241,241,182,218,255,0,64,120,1,0,233,29,253,253,224,239,255,0,208,119,1,0,0,0,247,247,247,247,255,0,160,119,1,0,59,38,245,230,245,208,255,0,80,119,1,0,61,103,225,184,225,134,255,0,8,119,1,0,63,166,188,127,188,65,255,0,248,118,1,0,231,76,233,233,163,201,255,0,208,118,1,0,0,0,247,247,247,247,255,0,144,118,1,0,63,
-129,215,161,215,106,255,0,128,118,1,0,228,220,208,208,28,139,255,0,112,118,1,0,229,62,241,241,182,218,255,0,40,118,1,0,61,103,225,184,225,134,255,0,232,117,1,0,72,198,172,77,172,38,255,0,200,117,1,0,228,220,208,208,28,139,255,0,144,117,1,0,229,62,241,241,182,218,255,0,48,117,1,0,0,0,247,247,247,247,255,0,184,116,1,0,61,103,225,184,225,134,255,0,168,116,1,0,72,198,172,77,172,38,255,0,128,116,1,0,230,220,197,197,27,125,255,0,112,116,1,0,231,76,233,233,163,201,255,0,96,116,1,0,233,29,253,253,224,239,
-255,0,8,116,1,0,59,38,245,230,245,208,255,0,200,115,1,0,63,129,215,161,215,106,255,0,176,115,1,0,68,197,146,77,146,33,255,0,144,115,1,0,230,220,197,197,27,125,255,0,88,115,1,0,231,76,233,233,163,201,255,0,56,115,1,0,233,29,253,253,224,239,255,0,40,115,1,0,0,0,247,247,247,247,255,0,16,115,1,0,59,38,245,230,245,208,255,0,224,114,1,0,63,129,215,161,215,106,255,0,192,114,1,0,68,197,146,77,146,33,255,0,128,114,1,0,230,220,197,197,27,125,255,0,72,114,1,0,232,118,222,222,119,174,255,0,56,114,1,0,229,62,
-241,241,182,218,255,0,0,114,1,0,233,29,253,253,224,239,255,0,112,113,1,0,59,38,245,230,245,208,255,0,96,113,1,0,61,103,225,184,225,134,255,0,80,113,1,0,63,166,188,127,188,65,255,0,32,113,1,0,68,197,146,77,146,33,255,0,248,112,1,0,230,220,197,197,27,125,255,0,232,112,1,0,232,118,222,222,119,174,255,0,160,112,1,0,229,62,241,241,182,218,255,0,120,112,1,0,233,29,253,253,224,239,255,0,96,112,1,0,0,0,247,247,247,247,255,0,40,112,1,0,59,38,245,230,245,208,255,0,248,111,1,0,61,103,225,184,225,134,255,0,232,
-111,1,0,63,166,188,127,188,65,255,0,216,111,1,0,68,197,146,77,146,33,255,0,128,111,1,0,206,255,75,64,0,75,255,0,112,111,1,0,101,255,68,0,68,27,255,0,96,111,1,0,206,173,131,118,42,131,255,0,32,111,1,0,199,87,171,153,112,171,255,0,224,110,1,0,199,51,207,194,165,207,255,0,208,110,1,0,210,21,232,231,212,232,255,0,96,110,1,0,76,30,240,217,240,211,255,0,40,110,1,0,80,68,219,166,219,160,255,0,24,110,1,0,88,123,174,90,174,97,255,0,0,110,1,0,97,197,120,27,120,55,255,0,192,109,1,0,206,255,75,64,0,75,255,0,
-176,109,1,0,97,197,120,27,120,55,255,0,160,109,1,0,101,255,68,0,68,27,255,0,56,109,1,0,206,173,131,118,42,131,255,0,0,109,1,0,199,87,171,153,112,171,255,0,224,108,1,0,199,51,207,194,165,207,255,0,184,108,1,0,210,21,232,231,212,232,255,0,72,108,1,0,0,0,247,247,247,247,255,0,56,108,1,0,76,30,240,217,240,211,255,0,40,108,1,0,80,68,219,166,219,160,255,0,208,107,1,0,88,123,174,90,174,97,255,0,192,107,1,0,196,70,195,175,141,195,255,0,176,107,1,0,0,0,247,247,247,247,255,0,96,107,1,0,82,90,191,127,191,123,
-255,0,16,107,1,0,201,168,148,123,50,148,255,0,0,107,1,0,199,51,207,194,165,207,255,0,216,106,1,0,80,68,219,166,219,160,255,0,136,106,1,0,102,255,136,0,136,55,255,0,120,106,1,0,201,168,148,123,50,148,255,0,104,106,1,0,199,51,207,194,165,207,255,0,40,106,1,0,0,0,247,247,247,247,255,0,8,106,1,0,80,68,219,166,219,160,255,0,216,105,1,0,102,255,136,0,136,55,255,0,144,105,1,0,206,173,131,118,42,131,255,0,32,105,1,0,196,70,195,175,141,195,255,0,152,104,1,0,210,21,232,231,212,232,255,0,112,104,1,0,76,30,240,
-217,240,211,255,0,208,103,1,0,82,90,191,127,191,123,255,0,192,103,1,0,97,197,120,27,120,55,255,0,168,103,1,0,206,173,131,118,42,131,255,0,112,103,1,0,196,70,195,175,141,195,255,0,96,103,1,0,210,21,232,231,212,232,255,0,80,103,1,0,0,0,247,247,247,247,255,0,16,103,1,0,76,30,240,217,240,211,255,0,112,102,1,0,82,90,191,127,191,123,255,0,96,102,1,0,97,197,120,27,120,55,255,0,40,102,1,0,206,173,131,118,42,131,255,0,176,101,1,0,199,87,171,153,112,171,255,0,144,101,1,0,199,51,207,194,165,207,255,0,8,101,
-1,0,210,21,232,231,212,232,255,0,232,100,1,0,76,30,240,217,240,211,255,0,120,100,1,0,80,68,219,166,219,160,255,0,0,100,1,0,88,123,174,90,174,97,255,0,184,99,1,0,97,197,120,27,120,55,255,0,88,99,1,0,206,173,131,118,42,131,255,0,72,99,1,0,199,87,171,153,112,171,255,0,248,98,1,0,199,51,207,194,165,207,255,0,136,98,1,0,210,21,232,231,212,232,255,0,120,98,1,0,0,0,247,247,247,247,255,0,80,98,1,0,76,30,240,217,240,211,255,0,40,98,1,0,80,68,219,166,219,160,255,0,8,98,1,0,88,123,174,90,174,97,255,0,248,97,
-1,0,97,197,120,27,120,55,255,0,192,97,1,0,189,11,242,236,231,242,255,0,112,97,1,0,151,61,219,166,189,219,255,0,80,97,1,0,141,197,190,43,140,190,255,0,48,97,1,0,185,8,246,241,238,246,255,0,168,96,1,0,155,40,225,189,201,225,255,0,144,96,1,0,145,112,207,116,169,207,255,0,248,95,1,0,143,247,176,5,112,176,255,0,208,95,1,0,185,8,246,241,238,246,255,0,192,95,1,0,155,40,225,189,201,225,255,0,176,95,1,0,145,112,207,116,169,207,255,0,112,95,1,0,141,197,190,43,140,190,255,0,24,95,1,0,143,247,141,4,90,141,255,
-0,8,95,1,0,185,8,246,241,238,246,255,0,216,94,1,0,168,24,230,208,209,230,255,0,120,94,1,0,151,61,219,166,189,219,255,0,104,94,1,0,145,112,207,116,169,207,255,0,72,94,1,0,141,197,190,43,140,190,255,0,232,93,1,0,143,247,141,4,90,141,255,0,216,93,1,0,185,8,246,241,238,246,255,0,168,93,1,0,168,24,230,208,209,230,255,0,72,93,1,0,151,61,219,166,189,219,255,0,8,93,1,0,145,112,207,116,169,207,255,0,248,92,1,0,142,183,192,54,144,192,255,0,216,92,1,0,143,247,176,5,112,176,255,0,160,92,1,0,143,248,123,3,78,
-123,255,0,144,92,1,0,233,8,255,255,247,251,255,0,128,92,1,0,189,11,242,236,231,242,255,0,64,92,1,0,168,24,230,208,209,230,255,0,48,92,1,0,151,61,219,166,189,219,255,0,8,92,1,0,145,112,207,116,169,207,255,0,192,91,1,0,142,183,192,54,144,192,255,0,120,91,1,0,143,247,176,5,112,176,255,0,104,91,1,0,143,248,123,3,78,123,255,0,56,91,1,0,233,8,255,255,247,251,255,0,40,91,1,0,189,11,242,236,231,242,255,0,176,90,1,0,168,24,230,208,209,230,255,0,160,90,1,0,151,61,219,166,189,219,255,0,104,90,1,0,145,112,207,
-116,169,207,255,0,72,90,1,0,142,183,192,54,144,192,255,0,56,90,1,0,143,247,176,5,112,176,255,0,240,89,1,0,143,247,141,4,90,141,255,0,168,89,1,0,143,249,88,2,56,88,255,0,152,89,1,0,200,14,240,236,226,240,255,0,120,89,1,0,151,61,219,166,189,219,255,0,104,89,1,0,130,208,153,28,144,153,255,0,40,89,1,0,207,8,247,246,239,247,255,0,8,89,1,0,155,40,225,189,201,225,255,0,152,88,1,0,143,128,207,103,169,207,255,0,136,88,1,0,130,251,138,2,129,138,255,0,120,88,1,0,207,8,247,246,239,247,255,0,56,88,1,0,155,40,
-225,189,201,225,255,0,8,88,1,0,143,128,207,103,169,207,255,0,248,87,1,0,130,208,153,28,144,153,255,0,224,87,1,0,119,252,108,1,108,89,255,0,208,87,1,0,207,8,247,246,239,247,255,0,72,87,1,0,168,24,230,208,209,230,255,0,56,87,1,0,151,61,219,166,189,219,255,0,232,86,1,0,143,128,207,103,169,207,255,0,216,86,1,0,130,208,153,28,144,153,255,0,200,86,1,0,119,252,108,1,108,89,255,0,136,86,1,0,207,8,247,246,239,247,255,0,40,86,1,0,168,24,230,208,209,230,255,0,24,86,1,0,151,61,219,166,189,219,255,0,0,86,1,0,
-143,128,207,103,169,207,255,0,240,85,1,0,142,183,192,54,144,192,255,0,176,85,1,0,130,251,138,2,129,138,255,0,160,85,1,0,118,252,100,1,100,80,255,0,48,85,1,0,233,8,255,255,247,251,255,0,0,85,1,0,200,14,240,236,226,240,255,0,232,84,1,0,168,24,230,208,209,230,255,0,136,84,1,0,151,61,219,166,189,219,255,0,64,84,1,0,143,128,207,103,169,207,255,0,16,84,1,0,142,183,192,54,144,192,255,0,240,83,1,0,130,251,138,2,129,138,255,0,216,83,1,0,118,252,100,1,100,80,255,0,72,83,1,0,233,8,255,255,247,251,255,0,40,83,
-1,0,200,14,240,236,226,240,255,0,0,83,1,0,168,24,230,208,209,230,255,0,240,82,1,0,151,61,219,166,189,219,255,0,176,82,1,0,143,128,207,103,169,207,255,0,112,82,1,0,142,183,192,54,144,192,255,0,16,82,1,0,130,251,138,2,129,138,255,0,0,82,1,0,119,252,108,1,108,89,255,0,160,81,1,0,117,251,70,1,70,54,255,0,136,81,1,0,18,238,127,127,59,8,255,0,8,81,1,0,195,255,75,45,0,75,255,0,208,80,1,0,20,246,179,179,88,6,255,0,128,80,1,0,22,232,224,224,130,20,255,0,56,80,1,0,23,155,253,253,184,99,255,0,104,79,1,0,24,
-72,254,254,224,182,255,0,16,79,1,0,165,20,235,216,218,235,255,0,184,78,1,0,177,47,210,178,171,210,255,0,168,78,1,0,179,84,172,128,115,172,255,0,88,78,1,0,189,181,136,84,39,136,255,0,72,78,1,0,18,238,127,127,59,8,255,0,248,77,1,0,189,181,136,84,39,136,255,0,208,77,1,0,195,255,75,45,0,75,255,0,176,77,1,0,20,246,179,179,88,6,255,0,160,77,1,0,22,232,224,224,130,20,255,0,144,77,1,0,23,155,253,253,184,99,255,0,88,77,1,0,24,72,254,254,224,182,255,0,8,77,1,0,0,0,247,247,247,247,255,0,240,76,1,0,165,20,235,
-216,218,235,255,0,216,76,1,0,177,47,210,178,171,210,255,0,200,76,1,0,179,84,172,128,115,172,255,0,144,76,1,0,23,187,241,241,163,64,255,0,104,76,1,0,0,0,247,247,247,247,255,0,224,75,1,0,178,69,195,153,142,195,255,0,208,75,1,0,17,253,230,230,97,1,255,0,192,75,1,0,23,155,253,253,184,99,255,0,144,75,1,0,177,47,210,178,171,210,255,0,64,75,1,0,185,155,153,94,60,153,255,0,48,75,1,0,17,253,230,230,97,1,255,0,16,75,1,0,23,155,253,253,184,99,255,0,248,74,1,0,0,0,247,247,247,247,255,0,224,74,1,0,177,47,210,
-178,171,210,255,0,208,74,1,0,185,155,153,94,60,153,255,0,168,74,1,0,20,246,179,179,88,6,255,0,152,74,1,0,23,187,241,241,163,64,255,0,104,74,1,0,24,72,254,254,224,182,255,0,40,74,1,0,165,20,235,216,218,235,255,0,176,73,1,0,178,69,195,153,142,195,255,0,160,73,1,0,189,181,136,84,39,136,255,0,136,73,1,0,20,246,179,179,88,6,255,0,120,73,1,0,23,187,241,241,163,64,255,0,8,73,1,0,24,72,254,254,224,182,255,0,248,72,1,0,0,0,247,247,247,247,255,0,216,72,1,0,165,20,235,216,218,235,255,0,200,72,1,0,178,69,195,
-153,142,195,255,0,184,72,1,0,189,181,136,84,39,136,255,0,96,72,1,0,20,246,179,179,88,6,255,0,16,72,1,0,22,232,224,224,130,20,255,0,0,72,1,0,23,155,253,253,184,99,255,0,176,71,1,0,24,72,254,254,224,182,255,0,128,71,1,0,165,20,235,216,218,235,255,0,112,71,1,0,177,47,210,178,171,210,255,0,96,71,1,0,179,84,172,128,115,172,255,0,56,71,1,0,189,181,136,84,39,136,255,0,40,71,1,0,20,246,179,179,88,6,255,0,0,71,1,0,22,232,224,224,130,20,255,0,216,70,1,0,23,155,253,253,184,99,255,0,152,70,1,0,24,72,254,254,
-224,182,255,0,136,70,1,0,0,0,247,247,247,247,255,0,72,70,1,0,165,20,235,216,218,235,255,0,56,70,1,0,177,47,210,178,171,210,255,0,240,69,1,0,179,84,172,128,115,172,255,0,216,69,1,0,189,181,136,84,39,136,255,0,184,69,1,0,188,14,239,231,225,239,255,0,168,69,1,0,214,67,201,201,148,199,255,0,152,69,1,0,234,222,221,221,28,119,255,0,64,69,1,0,185,8,246,241,238,246,255,0,248,68,1,0,211,41,216,215,181,216,255,0,232,68,1,0,228,139,223,223,101,176,255,0,160,68,1,0,239,232,206,206,18,86,255,0,144,68,1,0,185,
-8,246,241,238,246,255,0,96,68,1,0,211,41,216,215,181,216,255,0,56,68,1,0,228,139,223,223,101,176,255],"i8",L,l.J+40977);D([68,1,0,234,222,221,221,28,119,255,0,240,67,1,0,236,255,152,152,0,67,255,0,224,67,1,0,185,8,246,241,238,246,255,0,176,67,1,0,204,38,218,212,185,218,255,0,88,67,1,0,214,67,201,201,148,199,255,0,72,67,1,0,228,139,223,223,101,176,255,0,0,67,1,0,234,222,221,221,28,119,255,0,240,66,1,0,236,255,152,152,0,67,255,0,208,66,1,0,185,8,246,241,238,246,255,0,192,66,1,0,204,38,218,212,185,218,
-255,0,160,66,1,0,214,67,201,201,148,199,255,0,136,66,1,0,228,139,223,223,101,176,255,0,104,66,1,0,233,209,231,231,41,138,255,0,40,66,1,0,239,232,206,206,18,86,255,0,176,65,1,0,236,255,145,145,0,63,255,0,128,65,1,0,195,5,249,247,244,249,255,0,8,65,1,0,188,14,239,231,225,239,255,0,240,64,1,0,204,38,218,212,185,218,255,0,168,64,1,0,214,67,201,201,148,199,255,0,104,64,1,0,228,139,223,223,101,176,255,0,72,64,1,0,233,209,231,231,41,138,255,0,56,64,1,0,239,232,206,206,18,86,255,0,40,64,1,0,236,255,145,145,
-0,63,255,0,240,63,1,0,195,5,249,247,244,249,255,0,96,63,1,0,188,14,239,231,225,239,255,0,80,63,1,0,204,38,218,212,185,218,255,0,208,62,1,0,214,67,201,201,148,199,255,0,184,62,1,0,228,139,223,223,101,176,255,0,160,62,1,0,233,209,231,231,41,138,255,0,80,62,1,0,239,232,206,206,18,86,255,0,32,62,1,0,236,255,152,152,0,67,255,0,192,61,1,0,242,255,103,103,0,31,255,0,104,61,1,0,180,8,245,239,237,245,255,0,40,61,1,0,168,37,220,188,189,220,255,0,176,60,1,0,176,100,177,117,107,177,255,0,160,60,1,0,182,7,247,
-242,240,247,255,0,8,60,1,0,173,28,226,203,201,226,255,0,240,59,1,0,173,58,200,158,154,200,255,0,224,59,1,0,182,128,163,106,81,163,255,0,176,59,1,0,182,7,247,242,240,247,255,0,144,59,1,0,173,28,226,203,201,226,255,0,128,59,1,0,173,58,200,158,154,200,255,0,112,59,1,0,176,100,177,117,107,177,255,0,240,58,1,0,188,185,143,84,39,143,255,0,128,58,1,0,182,7,247,242,240,247,255,0,104,58,1,0,170,18,235,218,218,235,255,0,64,58,1,0,168,37,220,188,189,220,255,0,48,58,1,0,173,58,200,158,154,200,255,0,32,58,1,0,
-176,100,177,117,107,177,255,0,0,58,1,0,188,185,143,84,39,143,255,0,216,57,1,0,182,7,247,242,240,247,255,0,160,57,1,0,170,18,235,218,218,235,255,0,144,57,1,0,168,37,220,188,189,220,255,0,56,57,1,0,173,58,200,158,154,200,255,0,224,56,1,0,172,83,186,128,125,186,255,0,208,56,1,0,182,128,163,106,81,163,255,0,184,56,1,0,190,216,134,74,20,134,255,0,168,56,1,0,191,2,253,252,251,253,255,0,144,56,1,0,180,8,245,239,237,245,255,0,128,56,1,0,170,18,235,218,218,235,255,0,96,56,1,0,168,37,220,188,189,220,255,0,
-80,56,1,0,173,58,200,158,154,200,255,0,64,56,1,0,172,83,186,128,125,186,255,0,8,56,1,0,182,128,163,106,81,163,255,0,120,55,1,0,190,216,134,74,20,134,255,0,104,55,1,0,191,2,253,252,251,253,255,0,16,55,1,0,180,8,245,239,237,245,255,0,0,55,1,0,170,18,235,218,218,235,255,0,240,54,1,0,168,37,220,188,189,220,255,0,224,54,1,0,173,58,200,158,154,200,255,0,192,54,1,0,172,83,186,128,125,186,255,0,176,54,1,0,182,128,163,106,81,163,255,0,160,54,1,0,188,185,143,84,39,143,255,0,80,54,1,0,191,255,125,63,0,125,255,
-0,216,53,1,0,242,255,103,103,0,31,255,0,200,53,1,0,150,241,97,5,48,97,255,0,176,53,1,0,249,220,178,178,24,43,255,0,160,53,1,0,5,163,214,214,96,77,255,0,136,53,1,0,13,119,244,244,165,130,255,0,120,53,1,0,15,54,253,253,219,199,255,0,88,53,1,0,142,32,240,209,229,240,255,0,72,53,1,0,141,87,222,146,197,222,255,0,56,53,1,0,143,167,195,67,147,195,255,0,24,53,1,0,148,206,172,33,102,172,255,0,208,52,1,0,242,255,103,103,0,31,255,0,192,52,1,0,148,206,172,33,102,172,255,0,160,52,1,0,150,241,97,5,48,97,255,0,
-144,52,1,0,249,220,178,178,24,43,255,0,128,52,1,0,5,163,214,214,96,77,255,0,104,52,1,0,13,119,244,244,165,130,255,0,72,52,1,0,15,54,253,253,219,199,255,0,56,52,1,0,0,0,247,247,247,247,255,0,40,52,1,0,142,32,240,209,229,240,255,0,0,52,1,0,141,87,222,146,197,222,255,0,192,51,1,0,143,167,195,67,147,195,255,0,176,51,1,0,12,150,239,239,138,98,255,0,136,51,1,0,0,0,247,247,247,247,255,0,120,51,1,0,143,128,207,103,169,207,255,0,104,51,1,0,248,255,202,202,0,32,255,0,88,51,1,0,13,119,244,244,165,130,255,0,
-232,147,2,0,141,87,222,146,197,222,255,0,216,147,2,0,143,247,176,5,113,176,255,0,200,147,2,0,248,255,202,202,0,32,255,0,152,147,2,0,13,119,244,244,165,130,255,0,56,147,2,0,0,0,247,247,247,247,255,0,40,147,2,0,141,87,222,146,197,222,255,0,240,146,2,0,143,247,176,5,113,176,255,0,224,146,2,0,249,220,178,178,24,43,255,0,208,146,2,0,12,150,239,239,138,98,255,0,192,146,2,0,15,54,253,253,219,199,255,0,160,146,2,0,142,32,240,209,229,240,255,0,128,146,2,0,143,128,207,103,169,207,255,0,104,146,2,0,148,206,
-172,33,102,172,255,0,56,146,2,0,249,220,178,178,24,43,255,0,200,145,2,0,12,150,239,239,138,98,255,0,168,145,2,0,15,54,253,253,219,199,255,0,120,145,2,0,0,0,247,247,247,247,255,0,96,145,2,0,142,32,240,209,229,240,255,0,80,145,2,0,143,128,207,103,169,207,255,0,48,145,2,0,148,206,172,33,102,172,255,0,16,145,2,0,249,220,178,178,24,43,255,0,0,145,2,0,5,163,214,214,96,77,255,0,240,144,2,0,13,119,244,244,165,130,255,0,184,144,2,0,15,54,253,253,219,199,255,0,72,144,2,0,142,32,240,209,229,240,255,0,56,144,
-2,0,141,87,222,146,197,222,255,0,224,143,2,0,143,167,195,67,147,195,255,0,168,143,2,0,148,206,172,33,102,172,255,0,144,143,2,0,249,220,178,178,24,43,255,0,112,143,2,0,5,163,214,214,96,77,255,0,8,143,2,0,13,119,244,244,165,130,255,0,192,142,2,0,15,54,253,253,219,199,255,0,24,142,2,0,0,0,247,247,247,247,255,0,224,141,2,0,142,32,240,209,229,240,255,0,104,141,2,0,141,87,222,146,197,222,255,0,88,141,2,0,143,167,195,67,147,195,255,0,240,140,2,0,148,206,172,33,102,172,255,0,192,140,2,0,242,255,103,103,0,
-31,255,0,160,140,2,0,0,0,26,26,26,26,255,0,128,140,2,0,249,220,178,178,24,43,255,0,96,140,2,0,5,163,214,214,96,77,255,0,80,140,2,0,13,119,244,244,165,130,255,0,64,140,2,0,15,54,253,253,219,199,255,0,32,140,2,0,0,0,224,224,224,224,255,0,144,139,2,0,0,0,186,186,186,186,255,0,120,139,2,0,0,0,135,135,135,135,255,0,56,139,2,0,0,0,77,77,77,77,255,0,40,139,2,0,242,255,103,103,0,31,255,0,24,139,2,0,0,0,77,77,77,77,255,0,248,138,2,0,0,0,26,26,26,26,255,0,208,138,2,0,249,220,178,178,24,43,255,0,184,138,2,0,
-5,163,214,214,96,77,255,0,144,138,2,0,13,119,244,244,165,130,255,0,96,138,2,0,15,54,253,253,219,199,255,0,224,137,2,0,0,0,255,255,255,255,255,0,208,137,2,0,0,0,224,224,224,224,255,0,168,137,2,0,0,0,186,186,186,186,255,0,152,137,2,0,0,0,135,135,135,135,255,0,136,137,2,0,12,150,239,239,138,98,255,0,112,137,2,0,0,0,255,255,255,255,255,0,80,137,2,0,0,0,153,153,153,153,255,0,64,137,2,0,248,255,202,202,0,32,255,0,48,137,2,0,13,119,244,244,165,130,255,0,8,137,2,0,0,0,186,186,186,186,255,0,96,136,2,0,0,0,
-64,64,64,64,255,0,80,136,2,0,248,255,202,202,0,32,255,0,40,136,2,0,13,119,244,244,165,130,255,0,24,136,2,0,0,0,255,255,255,255,255,0,8,136,2,0,0,0,186,186,186,186,255,0,248,135,2,0,0,0,64,64,64,64,255,0,216,135,2,0,249,220,178,178,24,43,255,0,200,135,2,0,12,150,239,239,138,98,255,0,184,135,2,0,15,54,253,253,219,199,255,0,136,135,2,0,0,0,224,224,224,224,255,0,56,135,2,0,0,0,153,153,153,153,255,0,40,135,2,0,0,0,77,77,77,77,255,0,232,134,2,0,249,220,178,178,24,43,255,0,216,134,2,0,12,150,239,239,138,
-98,255,0,200,134,2,0,15,54,253,253,219,199,255,0,176,134,2,0,0,0,255,255,255,255,255,0,144,134,2,0,0,0,224,224,224,224,255,0,128,134,2,0,0,0,153,153,153,153,255,0,112,134,2,0,0,0,77,77,77,77,255,0,72,134,2,0,249,220,178,178,24,43,255,0,16,134,2,0,5,163,214,214,96,77,255,0,0,134,2,0,13,119,244,244,165,130,255,0,184,133,2,0,15,54,253,253,219,199,255,0,168,133,2,0,0,0,224,224,224,224,255,0,152,133,2,0,0,0,186,186,186,186,255,0,120,133,2,0,0,0,135,135,135,135,255,0,88,133,2,0,0,0,77,77,77,77,255,0,72,
-133,2,0,249,220,178,178,24,43,255,0,56,133,2,0,5,163,214,214,96,77,255,0,248,132,2,0,13,119,244,244,165,130,255,0,184,132,2,0,15,54,253,253,219,199,255,0,168,132,2,0,0,0,255,255,255,255,255,0,72,132,2,0,0,0,224,224,224,224,255,0,56,132,2,0,0,0,186,186,186,186,255,0,40,132,2,0,0,0,135,135,135,135,255,0,24,132,2,0,0,0,77,77,77,77,255,0,208,131,2,0,3,32,253,253,224,221,255,0,192,131,2,0,244,92,250,250,159,181,255,0,176,131,2,0,227,220,197,197,27,138,255,0,136,131,2,0,13,28,254,254,235,226,255,0,72,131,
-2,0,252,72,251,251,180,185,255,0,56,131,2,0,238,147,247,247,104,161,255,0,216,130,2,0,224,253,174,174,1,126,255,0,200,130,2,0,13,28,254,254,235,226,255,0,184,130,2,0,252,72,251,251,180,185,255,0,168,130,2,0,238,147,247,247,104,161,255,0,136,130,2,0,227,220,197,197,27,138,255,0,72,130,2,0,213,252,122,122,1,119,255,0,56,130,2,0,13,28,254,254,235,226,255,0,224,129,2,0,3,60,252,252,197,192,255,0,152,129,2,0,244,92,250,250,159,181,255,0,120,129,2,0,238,147,247,247,104,161,255,0,88,129,2,0,227,220,197,
-197,27,138,255,0,56,129,2,0,213,252,122,122,1,119,255,0,40,129,2,0,13,28,254,254,235,226,255,0,8,129,2,0,3,60,252,252,197,192,255,0,232,128,2,0,244,92,250,250,159,181,255,0,200,128,2,0,238,147,247,247,104,161,255,0,184,128,2,0,230,195,221,221,52,151,255,0,128,128,2,0,224,253,174,174,1,126,255,0,16,128,2,0,213,252,122,122,1,119,255,0,0,128,2,0,14,12,255,255,247,243,255,0,144,127,2,0,3,32,253,253,224,221,255,0,88,127,2,0,3,60,252,252,197,192,255,0,64,127,2,0,244,92,250,250,159,181,255,0,32,127,2,0,
-238,147,247,247,104,161,255,0,232,126,2,0,230,195,221,221,52,151,255,0,136,126,2,0,224,253,174,174,1,126,255,0,216,125,2,0,213,252,122,122,1,119,255,0,40,125,2,0,14,12,255,255,247,243,255,0,248,124,2,0,3,32,253,253,224,221,255,0,232,124,2,0,3,60,252,252,197,192,255,0,128,124,2,0,244,92,250,250,159,181,255,0,112,124,2,0,238,147,247,247,104,161,255,0,96,124,2,0,230,195,221,221,52,151,255,0,48,124,2,0,224,253,174,174,1,126,255,0,0,124,2,0,213,252,122,122,1,119,255,0,240,123,2,0,199,255,106,73,0,106,
-255,0,224,123,2,0,245,255,165,165,0,38,255,0,184,123,2,0,167,171,149,49,54,149,255,0,104,123,2,0,2,208,215,215,48,39,255,0,72,123,2,0,10,184,244,244,109,67,255,0,0,123,2,0,20,157,253,253,174,97,255,0,240,122,2,0,30,110,254,254,224,144,255,0,224,122,2,0,136,24,248,224,243,248,255,0,200,122,2,0,138,67,233,171,217,233,255,0,168,122,2,0,143,113,209,116,173,209,255,0,144,122,2,0,151,157,180,69,117,180,255,0,120,122,2,0,245,255,165,165,0,38,255,0,88,122,2,0,151,157,180,69,117,180,255,0,8,122,2,0,167,171,
-149,49,54,149,255,0,248,121,2,0,2,208,215,215,48,39,255,0,200,121,2,0,10,184,244,244,109,67,255,0,184,121,2,0,20,157,253,253,174,97,255,0,168,121,2,0,30,110,254,254,224,144,255,0,152,121,2,0,42,64,255,255,255,191,255,0,64,121,2,0,136,24,248,224,243,248,255,0,48,121,2,0,138,67,233,171,217,233,255,0,32,121,2,0,143,113,209,116,173,209,255,0,0,121,2,0,13,164,252,252,141,89,255,0,168,120,2,0,42,64,255,255,255,191,255,0,152,120,2,0,143,86,219,145,191,219,255,0,88,120,2,0,254,225,215,215,25,28,255,0,72,
-120,2,0,20,157,253,253,174,97,255,0,56,120,2,0,138,67,233,171,217,233,255,0,40,120,2,0,145,193,182,44,123,182,255,0,24,120,2,0,254,225,215,215,25,28,255,0,8,120,2,0,20,157,253,253,174,97,255,0,232,119,2,0,42,64,255,255,255,191,255,0,160,119,2,0,138,67,233,171,217,233,255,0,88,119,2,0,145,193,182,44,123,182,255,0,72,119,2,0,2,208,215,215,48,39,255,0,40,119,2,0,13,164,252,252,141,89,255,0,8,119,2,0,30,110,254,254,224,144,255,0,240,118,2,0,136,24,248,224,243,248,255,0,224,118,2,0,143,86,219,145,191,
-219,255,0,184,118,2,0,151,157,180,69,117,180,255,0,168,118,2,0,2,208,215,215,48,39,255,0,152,118,2,0,13,164,252,252,141,89,255,0,64,118,2,0,30,110,254,254,224,144,255,0,0,118,2,0,42,64,255,255,255,191,255,0,240,117,2,0,136,24,248,224,243,248,255,0,208,117,2,0,143,86,219,145,191,219,255,0,192,117,2,0,151,157,180,69,117,180,255,0,176,117,2,0,2,208,215,215,48,39,255,0,160,117,2,0,10,184,244,244,109,67,255,0,112,117,2,0,20,157,253,253,174,97,255,0,96,117,2,0,30,110,254,254,224,144,255,0,64,117,2,0,136,
-24,248,224,243,248,255,0,0,117,2,0,138,67,233,171,217,233,255,0,200,116,2,0,143,113,209,116,173,209,255,0,184,116,2,0,151,157,180,69,117,180,255,0,136,116,2,0,2,208,215,215,48,39,255,0,120,116,2,0,10,184,244,244,109,67,255,0,104,116,2,0,20,157,253,253,174,97,255,0,88,116,2,0,30,110,254,254,224,144,255,0,32,116,2,0,42,64,255,255,255,191,255,0,16,116,2,0,136,24,248,224,243,248,255,0,0,116,2,0,138,67,233,171,217,233,255,0,216,115,2,0,143,113,209,116,173,209,255,0,160,115,2,0,151,157,180,69,117,180,255,
-0,144,115,2,0,245,255,165,165,0,38,255,0,72,115,2,0,107,255,104,0,104,55,255,0,56,115,2,0,2,208,215,215,48,39,255,0,40,115,2,0,10,184,244,244,109,67,255,0,24,115,2,0,20,157,253,253,174,97,255,0,248,114,2,0,31,115,254,254,224,139,255,0,176,114,2,0,51,106,239,217,239,139,255,0,160,114,2,0,62,130,217,166,217,106,255,0,88,114,2,0,83,121,189,102,189,99,255,0,40,114,2,0,103,211,152,26,152,80,255,0,8,114,2,0,245,255,165,165,0,38,255,0,192,113,2,0,103,211,152,26,152,80,255,0,96,113,2,0,107,255,104,0,104,
-55,255,0,80,113,2,0,2,208,215,215,48,39,255,0,40,113,2,0,10,184,244,244,109,67,255,0,24,113,2,0,20,157,253,253,174,97,255,0,8,113,2,0,31,115,254,254,224,139,255,0,216,112,2,0,42,64,255,255,255,191,255,0,104,112,2,0,51,106,239,217,239,139,255,0,32,112,2,0,62,130,217,166,217,106,255,0,16,112,2,0,83,121,189,102,189,99,255,0,216,111,2,0,13,164,252,252,141,89,255,0,176,111,2,0,42,64,255,255,255,191,255,0,152,111,2,0,66,136,207,145,207,96,255,0,32,111,2,0,254,225,215,215,25,28,255,0,240,110,2,0,20,157,
-253,253,174,97,255,0,152,110,2,0,62,130,217,166,217,106,255,0,56,110,2,0,98,210,150,26,150,65,255,0,152,109,2,0,254,225,215,215,25,28,255,0,56,109,2,0,20,157,253,253,174,97,255,0,24,109,2,0,42,64,255,255,255,191,255,0,240,108,2,0,62,130,217,166,217,106,255,0,216,108,2,0,98,210,150,26,150,65,255,0,200,108,2,0,2,208,215,215,48,39,255,0,184,108,2,0,13,164,252,252,141,89,255,0,136,108,2,0,31,115,254,254,224,139,255,0,120,108,2,0,51,106,239,217,239,139,255,0,104,108,2,0,66,136,207,145,207,96,255,0,80,
-108,2,0,103,211,152,26,152,80,255,0,24,108,2,0,2,208,215,215,48,39,255,0,0,108,2,0,13,164,252,252,141,89,255,0,240,107,2,0,31,115,254,254,224,139,255,0,216,107,2,0,42,64,255,255,255,191,255,0,200,107,2,0,51,106,239,217,239,139,255,0,176,107,2,0,66,136,207,145,207,96,255,0,88,107,2,0,103,211,152,26,152,80,255,0,72,107,2,0,2,208,215,215,48,39,255,0,40,107,2,0,10,184,244,244,109,67,255,0,16,107,2,0,20,157,253,253,174,97,255,0,200,106,2,0,31,115,254,254,224,139,255,0,184,106,2,0,51,106,239,217,239,139,
-255,0,160,106,2,0,62,130,217,166,217,106,255,0,128,106,2,0,83,121,189,102,189,99,255,0,112,106,2,0,103,211,152,26,152,80,255,0,96,106,2,0,2,208,215,215,48,39,255,0,64,106,2,0,10,184,244,244,109,67,255,0,40,106,2,0,20,157,253,253,174,97,255,0,24,106,2,0,31,115,254,254,224,139,255,0,248,105,2,0,42,64,255,255,255,191,255,0,168,105,2,0,51,106,239,217,239,139,255,0,152,105,2,0,62,130,217,166,217,106,255,0,120,105,2,0,83,121,189,102,189,99,255,0,96,105,2,0,103,211,152,26,152,80,255,0,80,105,2,0,13,44,254,
-254,224,210,255,0,64,105,2,0,9,139,252,252,146,114,255,0,32,105,2,0,1,211,222,222,45,38,255,0,8,105,2,0,13,37,254,254,229,217,255,0,184,104,2,0,11,108,252,252,174,145,255,0,152,104,2,0,7,179,251,251,106,74,255,0,104,104,2,0,253,224,203,203,24,29,255,0,88,104,2,0,13,37,254,254,229,217,255,0,72,104,2,0,11,108,252,252,174,145,255,0,16,104,2,0,7,179,251,251,106,74,255,0,0,104,2,0,1,211,222,222,45,38,255,0,240,103,2,0,253,231,165,165,15,21,255,0,152,103,2,0,13,37,254,254,229,217,255,0,56,103,2,0,12,92,
-252,252,187,161,255,0,248,102,2,0,9,139,252,252,146,114,255,0,104,102,2,0,7,179,251,251,106,74,255,0,56,102,2,0,1,211,222,222,45,38,255,0,40,102,2,0,253,231,165,165,15,21,255,0,24,102,2,0,13,37,254,254,229,217,255,0,184,101,2,0,12,92,252,252,187,161,255,0,168,101,2,0,9,139,252,252,146,114,255,0,152,101,2,0,7,179,251,251,106,74,255,0,104,101,2,0,3,208,239,239,59,44,255,0,88,101,2,0,253,224,203,203,24,29,255,0,72,101,2,0,251,255,153,153,0,13,255,0,40,101,2,0,14,15,255,255,245,240,255,0,208,100,2,0,
-13,44,254,254,224,210,255,0,192,100,2,0,12,92,252,252,187,161,255,0,176,100,2,0,9,139,252,252,146,114,255,0,120,100,2,0,7,179,251,251,106,74,255,0,104,100,2,0,3,208,239,239,59,44,255,0,80,100,2,0,253,224,203,203,24,29,255,0,16,100,2,0,251,255,153,153,0,13,255,0,0,100,2,0,14,15,255,255,245,240,255,0,216,99,2,0,13,44,254,254,224,210,255,0,192,99,2,0,12,92,252,252,187,161,255,0,128,99,2,0,9,139,252,252,146,114,255,0,112,99,2,0,7,179,251,251,106,74,255,0,96,99,2,0,3,208,239,239,59,44,255,0,16,99,2,0,
-253,224,203,203,24,29,255,0,248,98,2,0,253,231,165,165,15,21,255,0,232,98,2,0,249,255,103,103,0,13,255,0,216,98,2,0,254,225,228,228,26,28,255,0,176,98,2,0,146,178,184,55,126,184,255,0,96,95,2,0,83,147,175,77,175,74,255,0,64,95,2,0,254,225,228,228,26,28,255,0,176,94,2,0,146,178,184,55,126,184,255,0,96,94,2,0,83,147,175,77,175,74,255,0,24,94,2,0,207,132,163,152,78,163,255,0,200,93,2,0,254,225,228,228,26,28,255,0,168,93,2,0,146,178,184,55,126,184,255,0,144,93,2,0,83,147,175,77,175,74,255,0,112,93,2,
-0,207,132,163,152,78,163,255,0,88,93,2,0,21,255,255,255,127,0,255,0,72,93,2,0,254,225,228,228,26,28,255,0,240,92,2,0,146,178,184,55,126,184,255,0,184,92,2,0,83,147,175,77,175,74,255,0,152,92,2,0,207,132,163,152,78,163,255,0,96,92,2,0,21,255,255,255,127,0,255,0,32,92,2,0,42,204,255,255,255,51,255,0,8,92,2,0,254,225,228,228,26,28,255,0,176,91,2,0,146,178,184,55,126,184,255,0,88,91,2,0,83,147,175,77,175,74,255,0,200,90,2,0,207,132,163,152,78,163,255,0,104,90,2,0,21,255,255,255,127,0,255,0,72,90,2,0,
-42,204,255,255,255,51,255,0,216,89,2,0,15,193,166,166,86,40,255,0,168,89,2,0,254,225,228,228,26,28,255,0,152,89,2,0,146,178,184,55,126,184,255,0,64,89,2,0,83,147,175,77,175,74,255,0,48,89,2,0,207,132,163,152,78,163,255,0,32,89,2,0,21,255,255,255,127,0,255,0,0,89,2,0,42,204,255,255,255,51,255,0,240,88,2,0,15,193,166,166,86,40,255,0,224,88,2,0,232,121,247,247,129,191,255,0,208,88,2,0,254,225,228,228,26,28,255,0,128,88,2,0,146,178,184,55,126,184,255,0,88,88,2,0,83,147,175,77,175,74,255,0,72,88,2,0,207,
-132,163,152,78,163,255,0,16,88,2,0,21,255,255,255,127,0,255,0,0,88,2,0,42,204,255,255,255,51,255,0,240,87,2,0,15,193,166,166,86,40,255,0,208,87,2,0,232,121,247,247,129,191,255,0,192,87,2,0,0,0,153,153,153,153,255,0,160,87,2,0,114,120,194,102,194,165,255,0,136,87,2,0,11,155,252,252,141,98,255,0,64,87,2,0,156,77,203,141,160,203,255,0,40,87,2,0,114,120,194,102,194,165,255,0,24,87,2,0,11,155,252,252,141,98,255,0,232,86,2,0,156,77,203,141,160,203,255,0,216,86,2,0,228,102,231,231,138,195,255,0,200,86,2,
-0,114,120,194,102,194,165,255,0,168,86,2,0,11,155,252,252,141,98,255,0,152,86,2,0,156,77,203,141,160,203,255,0,128,86,2,0,228,102,231,231,138,195,255,0,112,86,2,0,58,155,216,166,216,84,255,0,32,86,2,0,114,120,194,102,194,165,255,0,16,86,2,0,11,155,252,252,141,98,255,0,0,86,2,0,156,77,203,141,160,203,255,0,200,85,2,0,228,102,231,231,138,195,255,0,184,85,2,0,58,155,216,166,216,84,255,0,168,85,2,0,34,208,255,255,217,47,255,0,136,85,2,0,114,120,194,102,194,165,255,0,120,85,2,0,11,155,252,252,141,98,255,
-0,104,85,2,0,156,77,203,141,160,203,255,0,88,85,2,0,228,102,231,231,138,195,255,0,40,85,2,0,58,155,216,166,216,84,255,0,24,85,2,0,34,208,255,255,217,47,255,0,8,85,2,0,25,90,229,229,196,148,255,0,240,84,2,0,114,120,194,102,194,165,255,0,224,84,2,0,11,155,252,252,141,98,255,0,208,84,2,0,156,77,203,141,160,203,255,0,176,84,2,0,228,102,231,231,138,195,255,0,160,84,2,0,58,155,216,166,216,84,255,0,136,84,2,0,34,208,255,255,217,47,255,0,88,84,2,0,25,90,229,229,196,148,255,0,32,84,2,0,0,0,179,179,179,179,
-255,0,8,84,2,0,120,84,211,141,211,199,255,0,240,83,2,0,211,82,189,188,128,189,255,0,200,83,2,0,42,76,255,255,255,179,255,0,184,83,2,0,175,37,218,190,186,218,255,0,168,83,2,0,4,139,251,251,128,114,255,0,120,83,2,0,144,100,211,128,177,211,255,0,104,83,2,0,22,156,253,253,180,98,255,0,88,83,2,0,58,134,222,179,222,105,255,0,72,83,2,0,233,47,252,252,205,229,255,0,24,83,2,0,0,0,217,217,217,217,255,0,8,83,2,0,120,84,211,141,211,199,255,0,248,82,2,0,211,82,189,188,128,189,255,0,216,82,2,0,77,41,235,204,235,
-197,255,0,200,82,2,0,42,76,255,255,255,179,255,0,184,82,2,0,175,37,218,190,186,218,255,0,128,82,2,0,4,139,251,251,128,114,255,0,112,82,2,0,144,100,211,128,177,211,255,0,96,82,2,0,22,156,253,253,180,98,255,0,80,82,2,0,58,134,222,179,222,105,255,0,224,81,2,0,233,47,252,252,205,229,255,0,208,81,2,0,0,0,217,217,217,217,255,0,192,81,2,0,120,84,211,141,211,199,255,0,168,81,2,0,211,82,189,188,128,189,255,0,152,81,2,0,77,41,235,204,235,197,255,0,136,81,2,0,37,144,255,255,237,111,255,0,104,81,2,0,42,76,255,
-255,255,179,255,0,48,81,2,0,175,37,218,190,186,218,255,0,16,81,2,0,4,139,251,251,128,114,255,0,232,80,2,0,144,100,211,128,177,211,255,0,192,80,2,0,22,156,253,253,180,98,255,0,152,80,2,0,58,134,222,179,222,105,255,0,136,80,2,0,233,47,252,252,205,229,255,0,104,80,2,0,0,0,217,217,217,217,255,0,88,80,2,0,120,84,211,141,211,199,255,0,64,80,2,0,42,76,255,255,255,179,255,0,24,80,2,0,175,37,218,190,186,218,255,0,8,80,2,0,120,84,211,141,211,199,255,0,248,79,2,0,42,76,255,255,255,179,255,0,232,79,2,0,175,37,
-218,190,186,218,255,0,176,79,2,0,4,139,251,251,128,114,255,0,152,79,2,0,120,84,211,141,211,199,255,0,136,79,2,0,42,76,255,255,255,179,255,0,72,79,2,0,175,37,218,190,186,218,255,0,48,79,2,0,4,139,251,251,128,114,255,0,248,78,2,0,144,100,211,128,177,211,255,0,200,78,2,0,120,84,211,141,211,199,255,0,176,78,2,0,42,76,255,255,255,179,255,0,16,78,2,0,175,37,218,190,186,218,255,0,240,77,2,0,4,139,251,251,128,114,255,0,104,77,2,0,144,100,211,128,177,211,255,0,88,77,2,0,22,156,253,253,180,98,255,0,16,77,2,
-0,120,84,211,141,211,199,255,0,0,77,2,0,42,76,255,255,255,179,255,0,240,76,2,0,175,37,218,190,186,218,255,0,224,76,2,0,4,139,251,251,128,114,255,0,192,76,2,0,144,100,211,128,177,211,255,0,176,76,2,0,22,156,253,253,180,98,255,0,160,76,2,0,58,134,222,179,222,105,255,0,144,76,2,0,120,84,211,141,211,199,255,0,96,76,2,0,42,76,255,255,255,179,255,0,64,76,2,0,175,37,218,190,186,218,255,0,48,76,2,0,4,139,251,251,128,114,255,0,32,76,2,0,144,100,211,128,177,211,255,0,16,76,2,0,22,156,253,253,180,98,255,0,0,
-76,2,0,58,134,222,179,222,105,255,0,216,75,2,0,233,47,252,252,205,229,255,0,200,75,2,0,120,84,211,141,211,199,255,0,184,75,2,0,42,76,255,255,255,179,255,0,152,75,2,0,175,37,218,190,186,218,255,0,96,75,2,0,4,139,251,251,128,114,255,0,80,75,2,0,144,100,211,128,177,211,255,0,64,75,2,0,22,156,253,253,180,98,255,0,48,75,2,0,58,134,222,179,222,105,255,0,32,75,2,0,233,47,252,252,205,229,255,0,16,75,2,0,0,0,217,217,217,217,255,0,240,74,2,0,237,253,158,158,1,66,255,0,224,74,2,0,177,130,162,94,79,162,255,0,
-208,74,2,0,250,180,213,213,62,79,255,0,184,74,2,0,10,184,244,244,109,67,255,0,128,74,2,0,20,157,253,253,174,97,255,0,112,74,2,0,31,115,254,254,224,139,255,0,96,74,2,0,49,96,245,230,245,152,255,0,80,74,2,0,79,65,221,171,221,164,255,0,64,74,2,0,114,120,194,102,194,165,255,0,48,74,2,0,143,187,189,50,136,189,255,0,32,74,2,0,237,253,158,158,1,66,255,0,16,74,2,0,143,187,189,50,136,189,255,0,216,73,2,0,177,130,162,94,79,162,255,0,200,73,2,0,250,180,213,213,62,79,255,0,152,73,2,0,10,184,244,244,109,67,255,
-0,128,73,2,0,20,157,253,253,174,97,255,0,112,73,2,0,31,115,254,254,224,139,255,0,96,73,2,0,42,64,255,255,255,191,255,0,80,73,2,0,49,96,245,230,245,152,255,0,64,73,2,0,79,65,221,171,221,164,255,0,32,73,2,0,114,120,194,102,194,165,255,0,16,73,2,0,13,164,252,252,141,89,255,0,0,73,2,0,42,64,255,255,255,191,255,0,232,72,2,0,81,77,213,153,213,148,255,0,176,72,2,0,254,225,215,215,25,28,255,0,160,72,2,0,20,157,253,253,174,97,255,0,144,72,2,0,79,65,221,171,221,164,255,0,128,72,2,0,143,196,186,43,131,186,255,
-0,112,72,2,0,254,225,215,215,25,28,255,0,96,72,2,0,20,157,253,253,174,97,255,0,48,72,2,0,42,64,255,255,255,191,255,0,32,72,2,0,79,65,221,171,221,164,255,0,16,72,2,0,143,196,186,43,131,186,255,0,0,72,2,0,250,180,213,213,62,79,255,0,192,71,2,0,13,164,252,252,141,89,255,0,176,71,2,0,31,115,254,254,224,139,255,0,160,71,2,0,49,96,245,230,245,152,255,0,144,71,2,0,81,77,213,153,213,148,255,0,128,71,2,0,143,187,189,50,136,189,255,0,112,71,2,0,250,180,213,213,62,79,255,0,40,71,2,0,13,164,252,252,141,89,255,
-0,24,71,2,0,31,115,254,254,224,139,255,0,8,71,2,0,42,64,255,255,255,191,255,0,248,70,2,0,49,96,245,230,245,152,255,0,200,70,2,0,81,77,213,153,213,148,255,0,184,70,2,0,143,187,189,50,136,189,255,0,168,70,2,0,250,180,213,213,62,79,255,0,152,70,2,0,10,184,244,244,109,67,255,0,136,70,2,0,20,157,253,253,174,97,255,0,120,70,2,0,31,115,254,254,224,139,255,0,88,70,2,0,49,96,245,230,245,152,255,0,48,70,2,0,79,65,221,171,221,164,255,0,24,70,2,0,114,120,194,102,194,165,255,0,248,69,2,0,143,187,189,50,136,189,
-255,0,152,69,2,0,250,180,213,213,62,79,255,0,120,69,2,0,10,184,244,244,109,67,255,0,104,69,2,0,20,157,253,253,174,97,255,0,80,69,2,0,31,115,254,254,224,139,255,0,64,69,2,0,42,64,255,255,255,191,255,0,48,69,2,0,49,96,245,230,245,152,255,0,0,69,2,0,79,65,221,171,221,164,255,0,240,68,2,0,114,120,194,102,194,165,255,0,224,68,2,0,143,187,189,50,136,189,255,0,184,68,2,0,147,15,255,240,248,255,255,0,104,68,2,0,24,35,250,250,235,215,255,0,88,68,2,0,127,255,255,0,255,255,255,0,40,68,2,0,113,128,255,127,255,
-212,255,0,0,68,2,0,127,15,255,240,255,255,255,0,232,67,2,0,42,26,245,245,245,220,255,0,120,67,2,0,23,58,255,255,228,196,255,0,64,67,2,0,0,0,0,0,0,0,255,0,24,67,2,0,25,49,255,255,235,205,255,0,176,66,2,0,170,255,255,0,0,255,255,0,160,66,2,0,192,206,226,138,43,226,255,0,56,66,2,0,0,190,165,165,42,42,255,0,40,66,2,0,23,99,222,222,184,135,255,0,232,65,2,0,128,103,160,95,158,160,255,0,200,65,2,0,63,255,255,127,255,0,255,0,184,65,2,0,17,218,210,210,105,30,255,0,168,65,2,0,11,175,255,255,127,80,255,0,128,
-65,2,0,154,147,237,100,149,237,255,0,112,65,2,0,33,34,255,255,248,220,255,0,96,65,2,0,246,231,220,220,20,60,255,0,64,65,2,0,127,255,255,0,255,255,255,0,16,65,2,0,170,255,139,0,0,139,255,0,248,64,2,0,127,255,139,0,139,139,255,0,224,64,2,0,30,239,184,184,134,11,255,0,208,64,2,0,0,0,169,169,169,169,255,0,192,64,2,0,85,255,100,0,100,0,255,0,176,64,2,0,0,0,169,169,169,169,255,0,136,64,2,0,39,110,189,189,183,107,255,0,112,64,2,0,212,255,139,139,0,139,255,0,88,64,2,0,58,142,107,85,107,47,255,0,72,64,2,0,
-23,255,255,255,140,0,255,0,8,64,2,0,198,192,204,153,50,204,255,0,232,63,2,0,0,255,139,139,0,0,255,0,216,63,2,0,10,121,233,233,150,122,255,0,192,63,2,0,85,61,188,143,188,143,255,0,168,63,2,0,175,143,139,72,61,139,255,0,144,63,2,0,127,103,79,47,79,79,255,0,104,63,2,0,127,103,79,47,79,79,255,0,80,63,2,0,128,255,209,0,206,209,255,0,64,63,2,0,199,255,211,148,0,211,255,0,48,63,2,0,232,235,255,255,20,147,255,0,184,62,2,0,138,255,255,0,191,255,255,0,168,62,2,0,0,0,105,105,105,105,255,0,152,62,2,0,0,0,105,
-105,105,105,255,0,136,62,2,0,148,225,255,30,144,255,255,0,120,62,2,0,0,206,178,178,34,34,255,0,96,62,2,0,28,15,255,255,250,240,255,0,56,62,2,0,85,192,139,34,139,34,255,0,32,62,2,0,212,255,255,255,0,255,255,0,16,62,2,0,0,0,220,220,220,220,255,0,0,62,2,0,170,7,255,248,248,255,255,0,200,61,2,0,35,255,255,255,215,0,255,0,184,61,2,0,30,217,218,218,165,32,255,0,168,61,2,0,0,0,128,128,128,128,255,0,152,61,2,0,85,255,128,0,128,0,255,0,128,61,2,0,59,208,255,173,255,47,255,0,112,61,2,0,0,0,128,128,128,128,
-255,0,80,61,2,0,85,15,255,240,255,240,255,0,64,61,2,0,233,150,255,255,105,180,255,0,48,61,2,0,0,140,205,205,92,92,255,0,32,61,2,0,194,255,130,75,0,130,255,0,232,60,2,0,42,15,255,255,255,240,255,0,216,60,2,0,38,106,240,240,230,140,255,0,200,60,2,0,170,20,250,230,230,250,255,0,176,60,2,0,240,15,255,255,240,245,255,0,160,60,2,0,64,255,252,124,252,0,255,0,136,60,2,0,38,49,255,255,250,205,255,0,104,60,2,0,137,63,230,173,216,230,255,0,88,60,2,0,0,119,240,240,128,128,255,0,72,60,2,0,127,31,255,224,255,255,
-255,0,24,60,2,0,42,40,250,250,250,210,255,0,208,59,2,0,0,0,211,211,211,211,255,0,176,59,2,0,85,100,238,144,238,144,255,0,160,59,2,0,0,0,211,211,211,211,255,0,144,59,2,0,248,73,255,255,182,193,255,0,120,59,2,0,12,132,255,255,160,122,255,0,96,59,2,0,125,209,178,32,178,170,255,0,24,59,2,0,143,117,250,135,206,250,255,0,0,59,2,0,148,56,153,119,136,153,255,0,232,58,2,0,148,56,153,119,136,153,255,0,208,58,2,0,151,52,222,176,196,222,255,0,144,58,2,0,42,31,255,255,255,224,255,0,128,58,2,0,85,255,255,0,255,
-0,255,0,112,58,2,0,85,192,205,50,205,50,255,0,96,58,2,0,21,20,250,250,240,230,255,0,80,58,2,0,212,255,255,255,0,255,255,0,64,58,2,0,0,255,128,128,0,0,255,0,24,58,2,0,113,128,205,102,205,170,255,0,240,57,2,0,170,255,205,0,0,205,255,0,208,57,2,0,204,152,211,186,85,211,255,0,152,57,2,0,183,124,219,147,112,219,255,0,88,57,2,0,103,169,179,60,179,113,255,0,56,57,2,0,176,143,238,123,104,238,255,0,24,57,2,0,111,255,250,0,250,154,255,0,0,57,2,0,125,167,209,72,209,204,255,0,224,56,2,0,228,228,199,199,21,133,
-255,0,200,56,2,0,170,198,112,25,25,112,255,0,112,56,2,0,106,9,255,245,255,250,255,0,96,56,2,0,4,30,255,255,228,225,255,0,80,56,2,0,26,73,255,255,228,181,255,0,48,56,2,0,25,81,255,255,222,173,255,0,200,55,2,0,170,255,128,0,0,128,255,0,184,55,2,0,27,23,253,253,245,230,255,0,152,55,2,0,42,255,128,128,128,0,255,0,104,55,2,0,56,192,142,107,142,35,255,0,80,55,2,0,27,255,255,255,165,0,255,0,32,55,2,0,11,255,255,255,69,0,255,0,248,54,2,0,214,123,218,218,112,214,255,0,200,54,2,0,38,72,238,238,232,170,255,
-0,80,54,2,0,85,100,251,152,251,152,255,0,56,54,2,0,127,67,238,175,238,238,255,0,216,53,2,0,241,124,219,219,112,147,255,0,200,53,2,0,26,41,255,255,239,213,255,0,168,53,2,0,20,70,255,255,218,185,255,0,152,53,2,0,20,176,205,205,133,63,255,0,120,53,2,0,247,63,255,255,192,203,255,0,104,53,2,0,212,70,221,221,160,221,255,0,72,53,2,0,132,59,230,176,224,230,255,0,56,53,2,0,212,255,128,128,0,128,255,0,40,53,2,0,0,255,255,255,0,0,255,0,24,53,2,0,0,61,188,188,143,143,255,0,216,52,2,0,159,181,225,65,105,225,255,
-0,192,52,2,0,17,220,139,139,69,19,255,0,160,52,2,0,4,138,250,250,128,114,255,0,144,52,2,0,19,154,244,244,164,96,255,0,128,52,2,0,103,170,139,46,139,87,255,0,112,52,2,0,17,16,255,255,245,238,255,0,72,52,2,0,13,183,160,160,82,45,255,0,56,52,2,0,0,0,192,192,192,192,255,0,40,52,2,0,139,108,235,135,206,235,255,0,8,52,2,0,175,143,205,106,90,205,255,0,184,51,2,0,148,56,144,112,128,144,255,0,168,51,2,0,148,56,144,112,128,144,255,0,136,51,2,0,0,5,255,255,250,250,255,0,112,51,2,0,106,255,255,0,255,127,255,
-0,96,51,2,0,146,155,180,70,130,180,255,0,80,51,2,0,24,84,210,210,180,140,255,0,48,51,2,0,127,255,128,0,128,128,255,0,32,51,2,0,212,29,216,216,191,216,255,0,16,51,2,0,6,184,255,255,99,71,255,0,0,51,2,0,123,182,224,64,224,208,255,0,192,50,2,0,212,115,238,238,130,238,255,0,128,50,2,0,27,68,245,245,222,179,255,0,112,50,2,0,0,0,255,255,255,255,255,0,96,50,2,0,0,0,245,245,245,245,255,0,80,50,2,0,42,255,255,255,255,0,255,0,56,50,2,0,56,192,205,154,205,50,255,0,40,50,2,0,45,67,252,247,252,185,255,0,24,50,
-2,0,68,91,221,173,221,142,255,0,248,49,2,0,98,178,163,49,163,84,255,0,232,49,2,0,42,50,255,255,255,204,255,0,184,49,2,0,62,85,230,194,230,153,255,0,168,49,2,0,85,100,198,120,198,121,255,0,152,49,2,0,99,187,132,35,132,67,255,0,136,49,2,0,42,50,255,255,255,204,255,0,120,49,2,0,62,85,230,194,230,153,255,0,104,49,2,0,85,100,198,120,198,121,255,0,72,49,2,0,98,178,163,49,163,84,255,0,56,49,2,0,107,255,104,0,104,55,255,0,40,49,2,0,42,50,255,255,255,204,255,0,24,49,2,0,55,81,240,217,240,163,255,0,216,48,
-2,0,68,91,221,173,221,142,255,0,200,48,2,0,85,100,198,120,198,121,255,0,184,48,2,0,98,178,163,49,163,84,255,0,168,48,2,0,107,255,104,0,104,55,255,0,152,48,2,0,42,50,255,255,255,204,255,0,136,48,2,0,55,81,240,217,240,163,255,0,96,48,2,0,68,91,221,173,221,142,255,0,80,48,2,0,85,100,198,120,198,121,255,0,64,48,2,0,96,158,171,65,171,93,255,0,48,48,2,0,99,187,132,35,132,67,255,0,0,48,2,0,108,255,90,0,90,50,255,0,240,47,2,0,42,25,255,255,255,229,255,0,224,47,2,0,45,67,252,247,252,185,255,0,208,47,2,0,55,
-81,240,217,240,163,255,0,192,47,2,0,68,91,221,173,221,142,255,0,176,47,2,0,85,100,198,120,198,121,255,0,96,47,2,0,96,158,171,65,171,93,255,0,80,47,2,0,99,187,132,35,132,67,255,0,64,47,2,0,108,255,90,0,90,50,255,0,48,47,2,0,42,25,255,255,255,229,255,0,240,46,2,0,45,67,252,247,252,185,255,0,224,46,2,0,55,81,240,217,240,163,255,0,208,46,2,0,68,91,221,173,221,142,255,0,192,46,2,0,85,100,198,120,198,121,255,0,176,46,2,0,96,158,171,65,171,93,255,0,160,46,2,0,99,187,132,35,132,67,255,0,128,46,2,0,107,255,
-104,0,104,55,255,0,88,46,2,0,110,255,69,0,69,41,255,0,24,46,2,0,49,73,248,237,248,177,255,0,240,45,2,0,117,97,205,127,205,187,255,0,152,45,2,0,144,194,184,44,127,184,255,0,112,45,2,0,42,50,255,255,255,204,255,0,88,45,2,0,99,66,218,161,218,180,255,0,72,45,2,0,132,170,196,65,182,196,255,0,48,45,2,0,150,203,168,34,94,168,255,0,32,45,2,0,42,50,255,255,255,204,255,0,208,44,2,0,99,66,218,161,218,180,255,0,192,44,2,0,132,170,196,65,182,196,255,0,176,44,2,0,144,194,184,44,127,184,255,0,160,44,2,0,164,191,
-148,37,52,148,255,0,72,44,2,0,42,50,255,255,255,204,255,0,56,44,2,0,69,58,233,199,233,180,255,0,32,44,2,0,117,97,205,127,205,187,255,0,208,43,2,0,132,170,196,65,182,196,255,0,184,43,2,0,144,194,184,44,127,184,255,0,144,43,2,0,164,191,148,37,52,148,255,0,80,43,2,0,42,50,255,255,255,204,255,0,48,43,2,0,69,58,233,199,233,180,255,0,232,42,2,0,117,97,205,127,205,187,255,0,216,42,2,0,132,170,196,65,182,196,255,0,104,42,2,0,139,216,192,29,145,192,255,0,88,42,2,0,150,203,168,34,94,168,255,0,48,42,2,0,158,
-231,132,12,44,132,255,0,32,42,2,0,42,38,255,255,255,217,255,0,16,42,2,0,49,73,248,237,248,177,255,0,232,41,2,0,69,58,233,199,233,180,255,0,200,41,2,0,117,97,205,127,205,187,255,0,184,41,2,0,132,170,196,65,182,196,255,0,168,41,2,0,139,216,192,29,145,192,255,0,152,41,2,0,150,203,168,34,94,168,255,0,240,40,2,0,158,231,132,12,44,132,255,0,224,40,2,0,42,38,255,255,255,217,255,0,200,40,2,0,49,73,248,237,248,177,255,0,184,40,2,0,69,58,233,199,233,180,255,0,168,40,2,0,117,97,205,127,205,187,255,0,152,40,
-2,0,132,170,196,65,182,196,255,0,112,40,2,0,139,216,192,29,145,192,255,0,96,40,2,0,150,203,168,34,94,168,255,0,64,40,2,0,164,191,148,37,52,148,255,0,32,40,2,0,158],"i8",L,l.J+51217);D([231,88,8,29,88,255,0,176,39,2,0,37,66,255,255,247,188,255,0,160,39,2,0,28,175,254,254,196,79,255,0,144,39,2,0,16,238,217,217,95,14,255,0,128,39,2,0,42,42,255,255,255,212,255,0,112,39,2,0,28,112,254,254,217,142,255,0,96,39,2,0,22,213,254,254,153,41,255,0,64,39,2,0,15,252,204,204,76,2,255,0,48,39,2,0,42,42,255,255,255,
-212,255,0,32,39,2,0,28,112,254,254,217,142,255,0,16,39,2,0,22,213,254,254,153,41,255,0,176,38,2,0,16,238,217,217,95,14,255,0,160,38,2,0,13,248,153,153,52,4,255,0,136,38,2,0,42,42,255,255,255,212,255,0,120,38,2,0,31,109,254,254,227,145,255,0,104,38,2,0,28,175,254,254,196,79,255,0,88,38,2,0,22,213,254,254,153,41,255,0,56,38,2,0,16,238,217,217,95,14,255,0,40,38,2,0,13,248,153,153,52,4,255,0,24,38,2,0,42,42,255,255,255,212,255,0,8,38,2,0,31,109,254,254,227,145,255,0,200,37,2,0,28,175,254,254,196,79,255,
-0,184,37,2,0,22,213,254,254,153,41,255,0,168,37,2,0,18,233,236,236,112,20,255,0,152,37,2,0,15,252,204,204,76,2,255,0,136,37,2,0,12,247,140,140,45,4,255,0,120,37,2,0,42,25,255,255,255,229,255,0,88,37,2,0,37,66,255,255,247,188,255,0,72,37,2,0,31,109,254,254,227,145,255,0,56,37,2,0,28,175,254,254,196,79,255,0,40,37,2,0,22,213,254,254,153,41,255,0,232,36,2,0,18,233,236,236,112,20,255,0,208,36,2,0,15,252,204,204,76,2,255,0,192,36,2,0,12,247,140,140,45,4,255,0,176,36,2,0,42,25,255,255,255,229,255,0,160,
-36,2,0,37,66,255,255,247,188,255,0,144,36,2,0,31,109,254,254,227,145,255,0,96,36,2,0,28,175,254,254,196,79,255,0,80,36,2,0,22,213,254,254,153,41,255,0,64,36,2,0,18,233,236,236,112,20,255,0,48,36,2,0,15,252,204,204,76,2,255,0,240,35,2,0,13,248,153,153,52,4,255,0,224,35,2,0,13,240,102,102,37,6,255,0,208,35,2,0,34,95,255,255,237,160,255,0,192,35,2,0,24,178,254,254,178,76,255,0,176,35,2,0,5,221,240,240,59,32,255,0,160,35,2,0,42,77,255,255,255,178,255,0,80,35,2,0,29,162,254,254,204,92,255,0,64,35,2,0,
-17,194,253,253,141,60,255,0,48,35,2,0,254,225,227,227,26,28,255,0,32,35,2,0,42,77,255,255,255,178,255,0,184,34,2,0,29,162,254,254,204,92,255,0,168,34,2,0,17,194,253,253,141,60,255,0,152,34,2,0,5,221,240,240,59,32,255,0,136,34,2,0,246,255,189,189,0,38,255,0,120,34,2,0,42,77,255,255,255,178,255,0,104,34,2,0,30,136,254,254,217,118,255,0,72,34,2,0,24,178,254,254,178,76,255,0,48,34,2,0,17,194,253,253,141,60,255,0,248,33,2,0,5,221,240,240,59,32,255,0,232,33,2,0,246,255,189,189,0,38,255,0,136,33,2,0,42,
-77,255,255,255,178,255,0,120,33,2,0,30,136,254,254,217,118,255,0,88,33,2,0,24,178,254,254,178,76,255,0,72,33,2,0,17,194,253,253,141,60,255,0,48,33,2,0,7,212,252,252,78,42,255,0,32,33,2,0,254,225,227,227,26,28,255,0,224,32,2,0,245,255,177,177,0,38,255,0,208,32,2,0,42,50,255,255,255,204,255,0,192,32,2,0,34,95,255,255,237,160,255,0,176,32,2,0,30,136,254,254,217,118,255,0,40,32,2,0,24,178,254,254,178,76,255,0,24,32,2,0,17,194,253,253,141,60,255,0,0,32,2,0,7,212,252,252,78,42,255,0,176,31,2,0,254,225,
-227,227,26,28,255,0,152,31,2,0,245,255,177,177,0,38,255,0,128,31,2,0,42,50,255,255,255,204,255,0,80,31,2,0,34,95,255,255,237,160,255,0,24,31,2,0,30,136,254,254,217,118,255,0,160,30,2,0,24,178,254,254,178,76,255,0,128,30,2,0,17,194,253,253,141,60,255,0,16,30,2,0,7,212,252,252,78,42,255,0,0,30,2,0,254,225,227,227,26,28,255,0,232,29,2,0,246,255,189,189,0,38,255,0,216,29,2,0,242,255,128,128,0,38,255,0,200,29,2,0,147,15,255,240,248,255,255,0,184,29,2,0,24,35,250,250,235,215,255,0,136,29,2,0,23,36,255,
-255,239,219,255,0,120,29,2,0,23,36,238,238,223,204,255,0,104,29,2,0,23,36,205,205,192,176,255,0,88,29,2,0,24,34,139,139,131,120,255,0,40,29,2,0,113,128,255,127,255,212,255,0,240,28,2,0,113,128,255,127,255,212,255,0,208,28,2,0,113,128,238,118,238,198,255,0,192,28,2,0,113,128,205,102,205,170,255,0,176,28,2,0,113,128,139,69,139,116,255,0,168,28,2,0,127,15,255,240,255,255,255,0,136,28,2,0,127,15,255,240,255,255,255,0,128,28,2,0,127,15,238,224,238,238,255,0,120,28,2,0,127,14,205,193,205,205,255,0,112,
-28,2,0,127,14,139,131,139,139,255,0,72,28,2,0,42,26,245,245,245,220,255,0,16,28,2,0,23,58,255,255,228,196,255,0,8,28,2,0,23,58,255,255,228,196,255,0,0,28,2,0,23,58,238,238,213,183,255,0,248,27,2,0,22,58,205,205,183,158,255,0,240,27,2,0,23,58,139,139,125,107,255,0,216,27,2,0,0,0,0,0,0,0,255,0,200,27,2,0,25,49,255,255,235,205,255,0,192,27,2,0,170,255,255,0,0,255,255,0,184,27,2,0,170,255,255,0,0,255,255,0,160,27,2,0,170,255,238,0,0,238,255,0,112,27,2,0,170,255,205,0,0,205,255,0,104,27,2,0,170,255,139,
-0,0,139,255,0,80,27,2,0,192,206,226,138,43,226,255,0,72,27,2,0,0,190,165,165,42,42,255,0,64,27,2,0,0,191,255,255,64,64,255,0,40,27,2,0,0,191,238,238,59,59,255,0,32,27,2,0,0,191,205,205,51,51,255,0,24,27,2,0,0,190,139,139,35,35,255,0,8,27,2,0,23,99,222,222,184,135,255,0,224,26,2,0,23,100,255,255,211,155,255,0,200,26,2,0,23,99,238,238,197,145,255,0,184,26,2,0,23,99,205,205,170,125,255,0,168,26,2,0,23,99,139,139,115,85,255,0,152,26,2,0,128,103,160,95,158,160,255,0,136,26,2,0,131,103,255,152,245,255,
-255,0,104,26,2,0,131,102,238,142,229,238,255,0,80,26,2,0,131,103,205,122,197,205,255,0,64,26,2,0,131,102,139,83,134,139,255,0,48,26,2,0,63,255,255,127,255,0,255,0,8,26,2,0,63,255,255,127,255,0,255,0,232,25,2,0,63,255,238,118,238,0,255,0,200,25,2,0,63,255,205,102,205,0,255,0,184,25,2,0,63,255,139,69,139,0,255,0,168,25,2,0,17,218,210,210,105,30,255,0,152,25,2,0,17,219,255,255,127,36,255,0,112,25,2,0,17,219,238,238,118,33,255,0,96,25,2,0,17,218,205,205,102,29,255,0,64,25,2,0,17,220,139,139,69,19,255,
-0,56,25,2,0,11,175,255,255,127,80,255,0,24,25,2,0,7,169,255,255,114,86,255,0,248,24,2,0,6,169,238,238,106,80,255,0,240,24,2,0,6,169,205,205,91,69,255,0,232,24,2,0,6,168,139,139,62,47,255,0,216,24,2,0,154,147,237,100,149,237,255,0,200,24,2,0,33,34,255,255,248,220,255,0,144,24,2,0,33,34,255,255,248,220,255,0,128,24,2,0,34,35,238,238,232,205,255,0,112,24,2,0,34,34,205,205,200,177,255,0,80,24,2,0,35,34,139,139,136,120,255,0,48,24,2,0,246,231,220,220,20,60,255,0,16,24,2,0,127,255,255,0,255,255,255,0,8,
-24,2,0,127,255,255,0,255,255,255,0,0,24,2,0,127,255,238,0,238,238,255,0,248,23,2,0,127,255,205,0,205,205,255,0,240,23,2,0,127,255,139,0,139,139,255,0,208,23,2,0,30,239,184,184,134,11,255,0,184,23,2,0,30,240,255,255,185,15,255,0,112,23,2,0,30,240,238,238,173,14,255,0,96,23,2,0,30,240,205,205,149,12,255,0,56,23,2,0,30,240,139,139,101,8,255,0,32,23,2,0,85,255,100,0,100,0,255,0,0,23,2,0,39,110,189,189,183,107,255,0,240,22,2,0,58,142,107,85,107,47,255,0,216,22,2,0,58,143,255,202,255,112,255,0,200,22,2,
-0,58,143,238,188,238,104,255,0,152,22,2,0,58,143,205,162,205,90,255,0,136,22,2,0,58,143,139,110,139,61,255,0,120,22,2,0,23,255,255,255,140,0,255,0,104,22,2,0,21,255,255,255,127,0,255,0,40,22,2,0,21,255,238,238,118,0,255,0,16,22,2,0,21,255,205,205,102,0,255,0,216,21,2,0,21,255,139,139,69,0,255,0,192,21,2,0,198,192,204,153,50,204,255,0,168,21,2,0,198,193,255,191,62,255,255,0,144,21,2,0,198,192,238,178,58,238,255,0,96,21,2,0,198,192,205,154,50,205,255,0,32,21,2,0,198,192,139,104,34,139,255,0,128,20,
-2,0,10,121,233,233,150,122,255,0,112,20,2,0,85,61,188,143,188,143,255,0,32,20,2,0,85,62,255,193,255,193,255,0,248,19,2,0,85,62,238,180,238,180,255,0,224,19,2,0,85,62,205,155,205,155,255,0,208,19,2,0,85,62,139,105,139,105,255,0,192,19,2,0,175,143,139,72,61,139,255,0,176,19,2,0,127,103,79,47,79,79,255,0,144,19,2,0,127,104,255,151,255,255,255,0,112,19,2,0,127,103,238,141,238,238,255,0,96,19,2,0,127,104,205,121,205,205,255,0,80,19,2,0,127,104,139,82,139,139,255,0,32,19,2,0,127,103,79,47,79,79,255,0,248,
-18,2,0,128,255,209,0,206,209,255,0,208,18,2,0,199,255,211,148,0,211,255,0,192,18,2,0,232,235,255,255,20,147,255,0,176,18,2,0,232,235,255,255,20,147,255,0,160,18,2,0,232,235,238,238,18,137,255,0,120,18,2,0,232,235,205,205,16,118,255,0,104,18,2,0,231,236,139,139,10,80,255,0,88,18,2,0,138,255,255,0,191,255,255,0,64,18,2,0,138,255,255,0,191,255,255,0,16,18,2,0,138,255,238,0,178,238,255,0,232,17,2,0,138,255,205,0,154,205,255,0,216,17,2,0,138,255,139,0,104,139,255,0,192,17,2,0,0,0,105,105,105,105,255,0,
-184,17,2,0,0,0,105,105,105,105,255,0,168,17,2,0,148,225,255,30,144,255,255,0,136,17,2,0,148,225,255,30,144,255,255,0,120,17,2,0,148,225,238,28,134,238,255,0,104,17,2,0,148,225,205,24,116,205,255,0,88,17,2,0,148,225,139,16,78,139,255,0,240,16,2,0,0,206,178,178,34,34,255,0,192,16,2,0,0,207,255,255,48,48,255,0,176,16,2,0,0,207,238,238,44,44,255,0,160,16,2,0,0,207,205,205,38,38,255,0,72,16,2,0,0,207,139,139,26,26,255,0,56,16,2,0,28,15,255,255,250,240,255,0,24,16,2,0,85,192,139,34,139,34,255,0,8,16,2,
-0,0,0,220,220,220,220,255,0,248,15,2,0,170,7,255,248,248,255,255,0,240,15,2,0,35,255,255,255,215,0,255,0,120,15,2,0,35,255,255,255,215,0,255,0,88,15,2,0,35,255,238,238,201,0,255,0,80,15,2,0,35,255,205,205,173,0,255,0,72,15,2,0,35,255,139,139,117,0,255,0,56,15,2,0,30,217,218,218,165,32,255,0,40,15,2,0,30,218,255,255,193,37,255,0,8,15,2,0,30,218,238,238,180,34,255,0,248,14,2,0,30,218,205,205,155,29,255,0,232,14,2,0,30,218,139,139,105,20,255,0,168,14,2,0,0,0,192,192,192,192,255,0,104,14,2,0,0,0,0,0,
-0,0,255,0,88,14,2,0,0,0,3,3,3,3,255,0,80,14,2,0,0,0,26,26,26,26,255,0,64,14,2,0,0,0,255,255,255,255,255,0,56,14,2,0,0,0,28,28,28,28,255,0,48,14,2,0,0,0,31,31,31,31,255,0,16,14,2,0,0,0,33,33,33,33,255,0,8,14,2,0,0,0,36,36,36,36,255,0,0,14,2,0,0,0,38,38,38,38,255,0,248,13,2,0,0,0,41,41,41,41,255,0,176,13,2,0,0,0,43,43,43,43,255,0,144,13,2,0,0,0,46,46,46,46,255,0,136,13,2,0,0,0,48,48,48,48,255,0,128,13,2,0,0,0,5,5,5,5,255,0,120,13,2,0,0,0,51,51,51,51,255,0,112,13,2,0,0,0,54,54,54,54,255,0,16,13,2,0,
-0,0,56,56,56,56,255,0,8,13,2,0,0,0,59,59,59,59,255,0,0,13,2,0,0,0,61,61,61,61,255,0,248,12,2,0,0,0,64,64,64,64,255,0,224,12,2,0,0,0,66,66,66,66,255,0,192,12,2,0,0,0,69,69,69,69,255,0,184,12,2,0,0,0,71,71,71,71,255,0,176,12,2,0,0,0,74,74,74,74,255,0,168,12,2,0,0,0,8,8,8,8,255,0,160,12,2,0,0,0,77,77,77,77,255,0,136,12,2,0,0,0,79,79,79,79,255,0,128,12,2,0,0,0,82,82,82,82,255,0,48,12,2,0,0,0,84,84,84,84,255,0,40,12,2,0,0,0,87,87,87,87,255,0,232,11,2,0,0,0,89,89,89,89,255,0,200,11,2,0,0,0,92,92,92,92,
-255,0,168,11,2,0,0,0,94,94,94,94,255,0,160,11,2,0,0,0,97,97,97,97,255,0,136,11,2,0,0,0,99,99,99,99,255,0,128,11,2,0,0,0,10,10,10,10,255,0,40,11,2,0,0,0,102,102,102,102,255,0,32,11,2,0,0,0,105,105,105,105,255,0,24,11,2,0,0,0,107,107,107,107,255,0,16,11,2,0,0,0,110,110,110,110,255,0,200,10,2,0,0,0,112,112,112,112,255,0,168,10,2,0,0,0,115,115,115,115,255,0,152,10,2,0,0,0,117,117,117,117,255,0,112,10,2,0,0,0,120,120,120,120,255,0,96,10,2,0,0,0,122,122,122,122,255,0,80,10,2,0,0,0,125,125,125,125,255,0,
-56,10,2,0,0,0,13,13,13,13,255,0,32,10,2,0,0,0,127,127,127,127,255,0,208,9,2,0,0,0,130,130,130,130,255,0,200,9,2,0,0,0,133,133,133,133,255,0,144,9,2,0,0,0,135,135,135,135,255,0,112,9,2,0,0,0,138,138,138,138,255,0,96,9,2,0,0,0,140,140,140,140,255,0,88,9,2,0,0,0,143,143,143,143,255,0,80,9,2,0,0,0,145,145,145,145,255,0,72,9,2,0,0,0,148,148,148,148,255,0,48,9,2,0,0,0,150,150,150,150,255,0,40,9,2,0,0,0,15,15,15,15,255,0,16,9,2,0,0,0,153,153,153,153,255,0,8,9,2,0,0,0,156,156,156,156,255,0,232,8,2,0,0,0,
-158,158,158,158,255,0,200,8,2,0,0,0,161,161,161,161,255,0,168,8,2,0,0,0,163,163,163,163,255,0,160,8,2,0,0,0,166,166,166,166,255,0,152,8,2,0,0,0,168,168,168,168,255,0,144,8,2,0,0,0,171,171,171,171,255,0,112,8,2,0,0,0,173,173,173,173,255,0,104,8,2,0,0,0,176,176,176,176,255,0,96,8,2,0,0,0,18,18,18,18,255,0,88,8,2,0,0,0,179,179,179,179,255,0,56,8,2,0,0,0,181,181,181,181,255,0,24,8,2,0,0,0,184,184,184,184,255,0,16,8,2,0,0,0,186,186,186,186,255,0,8,8,2,0,0,0,189,189,189,189,255,0,0,8,2,0,0,0,191,191,191,
-191,255,0,248,7,2,0,0,0,194,194,194,194,255,0,224,7,2,0,0,0,196,196,196,196,255,0,216,7,2,0,0,0,199,199,199,199,255,0,208,7,2,0,0,0,201,201,201,201,255,0,200,7,2,0,0,0,20,20,20,20,255,0,168,7,2,0,0,0,204,204,204,204,255,0,120,7,2,0,0,0,207,207,207,207,255,0,112,7,2,0,0,0,209,209,209,209,255,0,104,7,2,0,0,0,212,212,212,212,255,0,96,7,2,0,0,0,214,214,214,214,255,0,64,7,2,0,0,0,217,217,217,217,255,0,40,7,2,0,0,0,219,219,219,219,255,0,32,7,2,0,0,0,222,222,222,222,255,0,24,7,2,0,0,0,224,224,224,224,255,
-0,16,7,2,0,0,0,227,227,227,227,255,0,240,6,2,0,0,0,23,23,23,23,255,0,216,6,2,0,0,0,229,229,229,229,255,0,208,6,2,0,0,0,232,232,232,232,255,0,200,6,2,0,0,0,235,235,235,235,255,0,192,6,2,0,0,0,237,237,237,237,255,0,184,6,2,0,0,0,240,240,240,240,255,0,160,6,2,0,0,0,242,242,242,242,255,0,152,6,2,0,0,0,245,245,245,245,255,0,144,6,2,0,0,0,247,247,247,247,255,0,136,6,2,0,0,0,250,250,250,250,255,0,112,6,2,0,0,0,252,252,252,252,255,0,96,6,2,0,85,255,255,0,255,0,255,0,88,6,2,0,85,255,255,0,255,0,255,0,80,6,
-2,0,85,255,238,0,238,0,255,0,64,6,2,0,85,255,205,0,205,0,255,0,56,6,2,0,85,255,139,0,139,0,255,0,8,6,2,0,59,208,255,173,255,47,255,0,0,6,2,0,0,0,192,192,192,192,255,0,248,5,2,0,0,0,0,0,0,0,255,0,240,5,2,0,0,0,3,3,3,3,255,0,208,5,2,0,0,0,26,26,26,26,255,0,200,5,2,0,0,0,255,255,255,255,255,0,192,5,2,0,0,0,28,28,28,28,255,0,184,5,2,0,0,0,31,31,31,31,255,0,176,5,2,0,0,0,33,33,33,33,255,0,168,5,2,0,0,0,36,36,36,36,255,0,136,5,2,0,0,0,38,38,38,38,255,0,128,5,2,0,0,0,41,41,41,41,255,0,104,5,2,0,0,0,43,43,
-43,43,255,0,80,5,2,0,0,0,46,46,46,46,255,0,48,5,2,0,0,0,48,48,48,48,255,0,16,5,2,0,0,0,5,5,5,5,255,0,8,5,2,0,0,0,51,51,51,51,255,0,0,5,2,0,0,0,54,54,54,54,255,0,248,4,2,0,0,0,56,56,56,56,255,0,240,4,2,0,0,0,59,59,59,59,255,0,216,4,2,0,0,0,61,61,61,61,255,0,208,4,2,0,0,0,64,64,64,64,255,0,136,4,2,0,0,0,66,66,66,66,255,0,128,4,2,0,0,0,69,69,69,69,255,0,64,4,2,0,0,0,71,71,71,71,255,0,32,4,2,0,0,0,74,74,74,74,255,0,232,3,2,0,0,0,8,8,8,8,255,0,224,3,2,0,0,0,77,77,77,77,255,0,200,3,2,0,0,0,79,79,79,79,
-255,0,192,3,2,0,0,0,82,82,82,82,255,0,104,3,2,0,0,0,84,84,84,84,255,0,96,3,2,0,0,0,87,87,87,87,255,0,88,3,2,0,0,0,89,89,89,89,255,0,80,3,2,0,0,0,92,92,92,92,255,0,240,2,2,0,0,0,94,94,94,94,255,0,168,2,2,0,0,0,97,97,97,97,255,0,152,2,2,0,0,0,99,99,99,99,255,0,72,2,2,0,0,0,10,10,10,10,255,0,56,2,2,0,0,0,102,102,102,102,255,0,32,2,2,0,0,0,105,105,105,105,255,0,248,1,2,0,0,0,107,107,107,107,255,0,216,1,2,0,0,0,110,110,110,110,255,0,144,1,2,0,0,0,112,112,112,112,255,0,128,1,2,0,0,0,115,115,115,115,255,
-0,56,1,2,0,0,0,117,117,117,117,255,0,48,1,2,0,0,0,120,120,120,120,255,0,24,1,2,0,0,0,122,122,122,122,255,0,0,1,2,0,0,0,125,125,125,125,255,0,248,0,2,0,0,0,13,13,13,13,255,0,240,0,2,0,0,0,127,127,127,127,255,0,216,0,2,0,0,0,130,130,130,130,255,0,176,0,2,0,0,0,133,133,133,133,255,0,168,0,2,0,0,0,135,135,135,135,255,0,64,0,2,0,0,0,138,138,138,138,255,0,32,0,2,0,0,0,140,140,140,140,255,0,24,0,2,0,0,0,143,143,143,143,255,0,8,0,2,0,0,0,145,145,145,145,255,0,0,0,2,0,0,0,148,148,148,148,255,0,248,255,1,0,
-0,0,150,150,150,150,255,0,240,255,1,0,0,0,15,15,15,15,255,0,208,255,1,0,0,0,153,153,153,153,255,0,200,255,1,0,0,0,156,156,156,156,255,0,192,255,1,0,0,0,158,158,158,158,255,0,184,255,1,0,0,0,161,161,161,161,255,0,160,255,1,0,0,0,163,163,163,163,255,0,152,255,1,0,0,0,166,166,166,166,255,0,144,255,1,0,0,0,168,168,168,168,255,0,104,255,1,0,0,0,171,171,171,171,255,0,96,255,1,0,0,0,173,173,173,173,255,0,88,255,1,0,0,0,176,176,176,176,255,0,64,255,1,0,0,0,18,18,18,18,255,0,56,255,1,0,0,0,179,179,179,179,
-255,0,48,255,1,0,0,0,181,181,181,181,255,0,40,255,1,0,0,0,184,184,184,184,255,0,8,255,1,0,0,0,186,186,186,186,255,0,240,254,1,0,0,0,189,189,189,189,255,0,232,254,1,0,0,0,191,191,191,191,255,0,224,254,1,0,0,0,194,194,194,194,255,0,216,254,1,0,0,0,196,196,196,196,255,0,208,254,1,0,0,0,199,199,199,199,255,0,176,254,1,0,0,0,201,201,201,201,255,0,168,254,1,0,0,0,20,20,20,20,255,0,160,254,1,0,0,0,204,204,204,204,255,0,152,254,1,0,0,0,207,207,207,207,255,0,128,254,1,0,0,0,209,209,209,209,255,0,120,254,1,
-0,0,0,212,212,212,212,255,0,112,254,1,0,0,0,214,214,214,214,255,0,104,254,1,0,0,0,217,217,217,217,255,0,80,254,1,0,0,0,219,219,219,219,255,0,64,254,1,0,0,0,222,222,222,222,255,0,56,254,1,0,0,0,224,224,224,224,255,0,48,254,1,0,0,0,227,227,227,227,255,0,24,254,1,0,0,0,23,23,23,23,255,0,224,253,1,0,0,0,229,229,229,229,255,0,200,253,1,0,0,0,232,232,232,232,255,0,192,253,1,0,0,0,235,235,235,235,255,0,184,253,1,0,0,0,237,237,237,237,255,0,176,253,1,0,0,0,240,240,240,240,255,0,168,253,1,0,0,0,242,242,242,
-242,255,0,152,253,1,0,0,0,245,245,245,245,255,0,128,253,1,0,0,0,247,247,247,247,255,0,112,253,1,0,0,0,250,250,250,250,255,0,104,253,1,0,0,0,252,252,252,252,255,0,16,253,1,0,85,15,255,240,255,240,255,0,240,252,1,0,85,15,255,240,255,240,255,0,224,252,1,0,85,15,238,224,238,224,255,0,208,252,1,0,85,14,205,193,205,193,255,0,192,252,1,0,85,14,139,131,139,131,255,0,184,252,1,0,233,150,255,255,105,180,255,0,168,252,1,0,234,145,255,255,110,180,255,0,88,252,1,0,235,141,238,238,106,167,255,0,72,252,1,0,236,
-135,205,205,96,144,255,0,56,252,1,0,234,148,139,139,58,98,255,0,40,252,1,0,0,140,205,205,92,92,255,0,8,252,1,0,0,148,255,255,106,106,255,0,248,251,1,0,0,148,238,238,99,99,255,0,232,251,1,0,0,149,205,205,85,85,255,0,216,251,1,0,0,148,139,139,58,58,255,0,208,251,1,0,194,255,130,75,0,130,255,0,200,251,1,0,42,0,255,255,255,254,0,0,176,251,1,0,42,15,255,255,255,240,255,0,168,251,1,0,42,15,255,255,255,240,255,0,128,251,1,0,42,15,238,238,238,224,255,0,120,251,1,0,42,14,205,205,205,193,255,0,96,251,1,0,42,
-14,139,139,139,131,255,0,88,251,1,0,38,106,240,240,230,140,255,0,48,251,1,0,39,112,255,255,246,143,255,0,24,251,1,0,39,112,238,238,230,133,255,0,0,251,1,0,39,111,205,205,198,115,255,0,248,250,1,0,39,111,139,139,134,78,255,0,144,250,1,0,170,20,250,230,230,250,255,0,128,250,1,0,240,15,255,255,240,245,255,0,112,250,1,0,240,15,255,255,240,245,255,0,96,250,1,0,239,15,238,238,224,229,255,0,48,250,1,0,240,14,205,205,193,197,255,0,32,250,1,0,239,14,139,139,131,134,255,0,216,249,1,0,64,255,252,124,252,0,255,
-0,192,249,1,0,38,49,255,255,250,205,255,0,128,249,1,0,38,49,255,255,250,205,255,0,104,249,1,0,37,50,238,238,233,191,255,0,8,249,1,0,38,49,205,205,201,165,255,0,224,248,1,0,39,49,139,139,137,112,255,0,144,248,1,0,137,63,230,173,216,230,255,0,128,248,1,0,138,64,255,191,239,255,255,0,192,247,1,0,138,64,238,178,223,238,255,0,176,247,1,0,138,63,205,154,192,205,255,0,152,247,1,0,137,64,139,104,131,139,255,0,136,247,1,0,0,119,240,240,128,128,255,0,120,247,1,0,127,31,255,224,255,255,255,0,104,247,1,0,127,
-31,255,224,255,255,255,0,72,247,1,0,127,31,238,209,238,238,255,0,56,247,1,0,127,31,205,180,205,205,255,0,40,247,1,0,127,31,139,122,139,139,255,0,240,246,1,0,35,115,238,238,221,130,255,0,184,246,1,0,35,116,255,255,236,139,255,0,168,246,1,0,35,115,238,238,220,130,255,0,120,246,1,0,35,115,205,205,190,112,255,0,104,246,1,0,35,115,139,139,129,76,255,0,80,246,1,0,42,40,250,250,250,210,255,0,64,246,1,0,0,0,211,211,211,211,255,0,24,246,1,0,0,0,211,211,211,211,255,0,0,246,1,0,248,73,255,255,182,193,255,0,
-240,245,1,0,249,81,255,255,174,185,255,0,224,245,1,0,248,81,238,238,162,173,255,0,176,245,1,0,249,80,205,205,140,149,255,0,120,245,1,0,249,80,139,139,95,101,255,0,96,245,1,0,12,132,255,255,160,122,255,0,80,245,1,0,12,132,255,255,160,122,255,0,48,245,1,0,11,132,238,238,149,114,255,0,32,245,1,0,12,133,205,205,129,98,255,0,0,245,1,0,12,133,139,139,87,66,255,0,240,244,1,0,125,209,178,32,178,170,255,0,224,244,1,0,143,117,250,135,206,250,255,0,208,244,1,0,143,79,255,176,226,255,255,0,176,244,1,0,143,79,
-238,164,211,238,255,0,136,244,1,0,142,79,205,141,182,205,255,0,104,244,1,0,143,78,139,96,123,139,255,0,88,244,1,0,175,143,255,132,112,255,255,0,72,244,1,0,148,56,153,119,136,153,255,0,56,244,1,0,148,56,153,119,136,153,255,0,24,244,1,0,151,52,222,176,196,222,255,0,200,243,1,0,151,53,255,202,225,255,255,0,184,243,1,0,151,53,238,188,210,238,255,0,120,243,1,0,151,53,205,162,181,205,255,0,72,243,1,0,150,53,139,110,123,139,255,0,56,243,1,0,42,31,255,255,255,224,255,0,40,243,1,0,42,31,255,255,255,224,255,
-0,24,243,1,0,42,31,238,238,238,209,255,0,8,243,1,0,42,31,205,205,205,180,255,0,248,242,1,0,42,31,139,139,139,122,255,0,192,242,1,0,85,192,205,50,205,50,255,0,168,242,1,0,21,20,250,250,240,230,255,0,112,242,1,0,212,255,255,255,0,255,255,0,16,242,1,0,212,255,255,255,0,255,255,0,240,241,1,0,212,255,238,238,0,238,255,0,224,241,1,0,212,255,205,205,0,205,255,0,208,241,1,0,212,255,139,139,0,139,255,0,200,241,1,0,239,185,176,176,48,96,255,0,192,241,1,0,228,203,255,255,52,179,255,0,184,241,1,0,228,203,238,
-238,48,167,255,0,136,241,1,0,228,204,205,205,41,144,255,0,128,241,1,0,228,203,139,139,28,98,255,0,104,241,1,0,113,128,205,102,205,170,255,0,56,241,1,0,170,255,205,0,0,205,255,0,24,241,1,0,204,152,211,186,85,211,255,0,8,241,1,0,203,153,255,224,102,255,255,0,248,240,1,0,203,153,238,209,95,238,255,0,232,240,1,0,203,153,205,180,82,205,255,0,208,240,1,0,203,154,139,122,55,139,255,0,184,240,1,0,183,124,219,147,112,219,255,0,120,240,1,0,183,125,255,171,130,255,255,0,104,240,1,0,183,125,238,159,121,238,255,
-0,88,240,1,0,183,125,205,137,104,205,255,0,40,240,1,0,183,124,139,93,71,139,255,0,248,239,1,0,103,169,179,60,179,113,255,0,232,239,1,0,176,143,238,123,104,238,255,0,208,239,1,0,111,255,250,0,250,154,255,0,184,239,1,0,125,167,209,72,209,204,255,0,160,239,1,0,228,228,199,199,21,133,255,0,144,239,1,0,170,198,112,25,25,112,255,0,112,239,1,0,106,9,255,245,255,250,255,0,96,239,1,0,4,30,255,255,228,225,255,0,48,239,1,0,4,30,255,255,228,225,255,0,0,239,1,0,4,30,238,238,213,210,255,0,176,238,1,0,3,29,205,
-205,183,181,255,0,160,238,1,0,5,29,139,139,125,123,255,0,72,238,1,0,26,73,255,255,228,181,255,0,56,238,1,0,25,81,255,255,222,173,255,0,16,238,1,0,25,81,255,255,222,173,255,0,0,238,1,0,25,82,238,238,207,161,255,0,200,237,1,0,25,82,205,205,179,139,255,0,168,237,1,0,25,82,139,139,121,94,255,0,144,237,1,0,170,255,128,0,0,128,255,0,128,237,1,0,170,255,128,0,0,128,255,0,88,237,1,0,42,0,255,255,255,254,0,0,80,237,1,0,27,23,253,253,245,230,255,0,56,237,1,0,56,192,142,107,142,35,255,0,24,237,1,0,56,193,255,
-192,255,62,255,0,248,236,1,0,56,192,238,179,238,58,255,0,200,236,1,0,56,192,205,154,205,50,255,0,136,236,1,0,56,192,139,105,139,34,255,0,96,236,1,0,27,255,255,255,165,0,255,0,0,236,1,0,27,255,255,255,165,0,255,0,232,235,1,0,27,255,238,238,154,0,255,0,64,235,1,0,27,255,205,205,133,0,255,0,56,235,1,0,27,255,139,139,90,0,255,0,32,235,1,0,11,255,255,255,69,0,255,0,16,235,1,0,11,255,255,255,69,0,255,0,248,234,1,0,11,255,238,238,64,0,255,0,232,234,1,0,11,255,205,205,55,0,255,0,200,234,1,0,11,255,139,139,
-37,0,255,0,192,234,1,0,214,123,218,218,112,214,255,0,184,234,1,0,214,124,255,255,131,250,255,0,176,234,1,0,214,124,238,238,122,233,255,0,144,234,1,0,214,124,205,205,105,201,255,0,136,234,1,0,213,124,139,139,71,137,255,0,104,234,1,0,38,72,238,238,232,170,255,0,88,234,1,0,85,100,251,152,251,152,255,0,72,234,1,0,85,101,255,154,255,154,255,0,56,234,1,0,85,100,238,144,238,144,255,0,0,234,1,0,85,100,205,124,205,124,255,0,232,233,1,0,85,100,139,84,139,84,255,0,216,233,1,0,127,67,238,175,238,238,255,0,200,
-233,1,0,127,68,255,187,255,255,255,0,120,233,1,0,127,68,238,174,238,238,255,0,96,233,1,0,127,68,205,150,205,205,255,0,72,233,1,0,127,67,139,102,139,139,255,0,56,233,1,0,241,124,219,219,112,147,255,0,40,233,1,0,241,125,255,255,130,171,255,0,24,233,1,0,241,125,238,238,121,159,255,0,8,233,1,0,241,125,205,205,104,137,255,0,248,232,1,0,241,124,139,139,71,93,255,0,216,232,1,0,26,41,255,255,239,213,255,0,200,232,1,0,20,70,255,255,218,185,255,0,152,232,1,0,20,70,255,255,218,185,255,0,120,232,1,0,19,69,238,
-238,203,173,255,0,104,232,1,0,19,69,205,205,175,149,255,0,88,232,1,0,20,69,139,139,119,101,255,0,80,232,1,0,20,176,205,205,133,63,255,0,72,232,1,0,247,63,255,255,192,203,255,0,48,232,1,0,245,73,255,255,181,197,255,0,40,232,1,0,245,73,238,238,169,184,255,0,24,232,1,0,245,74,205,205,145,158,255,0,16,232,1,0,245,73,139,139,99,108,255,0,240,231,1,0,212,70,221,221,160,221,255,0,232,231,1,0,212,68,255,255,187,255,255,0,224,231,1,0,212,68,238,238,174,238,255,0,216,231,1,0,212,68,205,205,150,205,255,0,208,
-231,1,0,212,67,139,139,102,139,255,0,192,231,1,0,132,59,230,176,224,230,255,0,168,231,1,0,196,221,240,160,32,240,255,0,160,231,1,0,191,207,255,155,48,255,255,0,152,231,1,0,192,207,238,145,44,238,255,0,144,231,1,0,192,207,205,125,38,205,255,0,120,231,1,0,192,207,139,85,26,139,255,0,112,231,1,0,0,255,255,255,0,0,255,0,96,231,1,0,0,255,255,255,0,0,255,0,88,231,1,0,0,255,238,238,0,0,255,0,80,231,1,0,0,255,205,205,0,0,255,0,72,231,1,0,0,255,139,139,0,0,255,0,40,231,1,0,0,61,188,188,143,143,255,0,0,231,
-1,0,0,62,255,255,193,193,255,0,240,230,1,0,0,62,238,238,180,180,255,0,224,230,1,0,0,62,205,205,155,155,255,0,184,230,1,0,0,62,139,139,105,105,255,0,168,230,1,0,159,181,225,65,105,225,255,0,152,230,1,0,159,183,255,72,118,255,255,0,136,230,1,0,159,183,238,67,110,238,255,0,120,230,1,0,159,182,205,58,95,205,255,0,104,230,1,0,159,183,139,39,64,139,255,0,16,230,1,0,17,220,139,139,69,19,255,0,8,230,1,0,4,138,250,250,128,114,255,0,0,230,1,0,9,150,255,255,140,105,255,0,248,229,1,0,9,150,238,238,130,98,255,
-0,216,229,1,0,9,150,205,205,112,84,255,0,208,229,1,0,9,150,139,139,76,57,255,0,192,229,1,0,19,154,244,244,164,96,255,0,176,229,1,0,103,170,139,46,139,87,255,0,160,229,1,0,103,171,255,84,255,159,255,0,144,229,1,0,103,171,238,78,238,148,255,0,112,229,1,0,103,171,205,67,205,128,255,0,96,229,1,0,103,170,139,46,139,87,255,0,64,229,1,0,17,16,255,255,245,238,255,0,16,229,1,0,17,16,255,255,245,238,255,0,200,228,1,0,18,17,238,238,229,222,255,0,184,228,1,0,18,17,205,205,197,191,255,0,144,228,1,0,18,16,139,
-139,134,130,255,0,136,228,1,0,13,183,160,160,82,45,255,0,88,228,1,0,13,184,255,255,130,71,255,0,80,228,1,0,13,184,238,238,121,66,255,0,16,228,1,0,13,184,205,205,104,57,255,0,8,228,1,0,13,185,139,139,71,38,255,0,0,228,1,0,139,108,235,135,206,235,255,0,224,227,1,0,144,120,255,135,206,255,255,0,168,227,1,0,144,120,238,126,192,238,255,0,128,227,1,0,144,120,205,108,166,205,255,0,104,227,1,0,145,119,139,74,112,139,255,0,72,227,1,0,175,143,205,106,90,205,255,0,40,227,1,0,175,144,255,131,111,255,255,0,8,
-227,1,0,175,144,238,122,103,238,255,0,216,226,1,0,175,144,205,105,89,205,255,0,176,226,1,0,175,144,139,71,60,139,255,0,144,226,1,0,148,56,144,112,128,144,255,0,128,226,1,0,149,56,255,198,226,255,255,0,40,226,1,0,149,56,238,185,211,238,255,0,0,226,1,0,148,57,205,159,182,205,255,0,232,225,1,0,149,56,139,108,123,139,255,0,208,225,1,0,148,56,144,112,128,144,255,0,200,225,1,0,0,5,255,255,250,250,255,0,192,225,1,0,0,5,255,255,250,250,255,0,168,225,1,0,0,5,238,238,233,233,255,0,160,225,1,0,0,4,205,205,201,
-201,255,0,152,225,1,0,0,3,139,139,137,137,255,0,136,225,1,0,106,255,255,0,255,127,255,0,56,225,1,0,106,255,255,0,255,127,255,0,40,225,1,0,106,255,238,0,238,118,255,0,8,225,1,0,106,255,205,0,205,102,255,0,248,224,1,0,106,255,139,0,139,69,255,0,232,224,1,0,146,155,180,70,130,180,255,0,216,224,1,0,146,156,255,99,184,255,255,0,184,224,1,0,146,156,238,92,172,238,255,0,160,224,1,0,146,156,205,79,148,205,255,0,144,224,1,0,147,155,139,54,100,139,255,0,136,224,1,0,24,84,210,210,180,140,255,0,64,224,1,0,20,
-176,255,255,165,79,255,0,56,224,1,0,20,176,238,238,154,73,255,0,48,224,1,0,20,176,205,205,133,63,255,0,40,224,1,0,20,176,139,139,90,43,255,0,32,224,1,0,212,29,216,216,191,216,255,0,16,224,1,0,212,30,255,255,225,255,255,0,240,223,1,0,212,30,238,238,210,238,255,0,224,223,1,0,212,29,205,205,181,205,255,0,208,223,1,0,212,29,139,139,123,139,255,0,200,223,1,0,6,184,255,255,99,71,255,0,168,223,1,0,6,184,255,255,99,71,255,0,152,223,1,0,6,184,238,238,92,66,255,0,144,223,1,0,6,184,205,205,79,57,255,0,136,223,
-1,0,6,185,139,139,54,38,255,0,120,223,1,0,42,0,255,255,255,254,0,0,104,223,1,0,123,182,224,64,224,208,255,0,72,223,1,0,129,255,255,0,245,255,255,0,56,223,1,0,129,255,238,0,229,238,255,0,40,223,1,0,129,255,205,0,197,205,255,0,0,223,1,0,129,255,139,0,134,139,255,0,216,222,1,0,212,115,238,238,130,238,255,0,200,222,1,0,227,215,208,208,32,144,255,0,176,222,1,0,235,193,255,255,62,150,255,0,160,222,1,0,235,192,238,238,58,140,255,0,144,222,1,0,235,192,205,205,50,120,255,0,128,222,1,0,235,192,139,139,34,82,
-255,0,120,222,1,0,27,68,245,245,222,179,255,0,112,222,1,0,27,69,255,255,231,186,255,0,88,222,1,0,27,68,238,238,216,174,255,0,80,222,1,0,27,68,205,205,186,150,255,0,40,222,1,0,27,67,139,139,126,102,255,0,32,222,1,0,0,0,255,255,255,255,255,0,16,222,1,0,0,0,245,245,245,245,255,0,8,222,1,0,42,255,255,255,255,0,255,0,0,222,1,0,42,255,255,255,255,0,255,0,248,221,1,0,42,255,238,238,238,0,255,0,224,221,1,0,42,255,205,205,205,0,255,0,208,221,1,0,42,255,139,139,139,0,255,0,176,221,1,0,56,192,205,154,205,50,
-255,0,0,0,0,0,81,160,79,228,73,210,14,64,180,200,118,190,159,58,53,192,58,34,223,165,212,37,213,191,243,130,62,71,154,46,138,63,159,229,121,112,119,214,249,191,126,253,16,27,44,156,230,63,150,236,216,8,196,235,204,63,205,206,162,119,42,224,208,63,176,227,191,64,16,32,237,191,173,161,212,94,68,219,216,63,59,161,124,230,81,150,118,63,211,110,112,249,122,132,123,63,129,204,206,162,119,42,228,191,209,173,215,244,160,160,200,63,106,223,55,25,176,63,132,63,190,202,144,25,94,255,132,63,28,150,6,126,84,195,
-196,191,165,73,41,232,246,226,35,64,169,217,3,173,192,144,193,63,8,196,144,65,147,105,137,63,250,68,158,36,93,51,208,191,1,240,153,54,45,194,94,63,13,156,125,47,207,148,151,63,137,181,248,20,0,227,137,63,229,169,88,70,52,203,177,191,143,0,201,207,161,103,166,191,92,181,198,251,204,180,136,63,77,164,143,84,58,179,144,63,230,199,4,161,97,214,160,191,199,105,103,28,19,247,130,191,42,127,107,229,45,112,92,191,228,87,98,84,8,154,117,63,209,241,135,85,114,4,183,63,149,212,9,104,34,60,51,192,100,35,16,175,
-235,119,16,192,167,33,170,240,103,120,199,63,218,255,0,107,213,174,193,63,78,40,68,192,33,84,247,191,170,72,133,177,133,32,245,63,157,104,87,33,229,39,246,63,77,46,198,192,58,142,205,63,89,107,40,181,23,209,220,191,3,63,170,97,191,39,204,63,166,71,83,61,153,127,218,63,182,129,59,80,167,60,174,63,81,76,222,0,51,223,185,191,245,118,149,255,218,11,166,63,212,165,53,188,15,246,148,63,31,173,32,188,44,220,144,63,40,44,241,128,178,201,35,64,35,90,225,76,2,138,183,63,72,163,101,81,150,41,127,63,187,180,
-134,247,193,158,147,63,23,168,123,83,71,125,160,191,33,43,174,224,109,148,139,63,51,115,220,132,214,30,181,191,160,120,132,137,245,252,143,63,105,53,36,238,177,244,145,191,184,205,51,122,94,191,106,63,146,62,173,162,63,52,205,191,126,176,231,198,79,62,152,191,7,35,155,80,45,199,164,63,62,24,194,123,88,185,145,191,45,124,125,173,75,141,198,63,46,0,0,0,154,0,0,0,72,210,1,0,110,0,0,0,128,168,1,0,40,0,0,0,144,164,1,0,144,0,0,0,232,161,1,0,76,0,0,0,56,160,1,0,196,0,0,0,128,158,1,0,10,0,0,0,96,188,1,0,
-102,0,0,0,160,156,1,0,134,0,0,0,248,154,1,0,130,0,0,0,88,153,1,0,190,0,0,0,104,151,1,0,78,0,0,0,8,149,1,0,36,0,0,0,128,146,1,0,116,0,0,0,208,142,1,0,54,0,0,0,232,139,1,0,164,0,0,0,80,138,1,0,32,0,0,0,136,136,1,0,38,0,0,0,120,134,1,0,58,0,0,0,208,132,1,0,58,0,0,0,80,131,1,0,128,0,0,0,152,129,1,0,136,0,0,0,8,0,0,0,4,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,0,0,0,0,0,0,65,0,32,26,192,0,32,31,0,1,1,47,50,1,1,5,57,1,1,15,74,1,1,45,121,1,1,5,112,3,1,3,145,3,32,17,163,3,32,9,0,4,80,16,
-16,4,32,32,96,4,1,33,138,4,1,53,193,4,1,13,208,4,1,63,20,5,1,19,49,5,48,38,160,1,1,5,179,1,1,3,205,1,1,15,222,1,1,17,248,1,1,39,34,2,1,17,216,3,1,23,0,30,1,149,160,30,1,95,8,31,248,8,24,31,248,6,40,31,248,8,56,31,248,8,72,31,248,6,104,31,248,8,136,31,248,8,152,31,248,8,168,31,248,8,184,31,248,2,186,31,182,2,200,31,170,4,216,31,248,2,218,31,156,2,232,31,248,2,234,31,144,2,248,31,128,2,250,31,130,2,70,2,1,9,16,5,1,3,96,33,16,16,0,44,48,47,103,44,1,5,128,44,1,99,235,44,1,3,64,166,1,45,128,166,1,23,34,
-167,1,13,50,167,1,61,121,167,1,3,126,167,1,9,144,167,1,3,160,167,1,9,33,255,32,26,0,0,0,0,72,210,1,0,68,0,0,0,16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15,0,0,0,0,0,116,0,0,0,18,0,0,0,34,0,0,0,66,0,0,0,104,0,0,0,52,0,0,0,94,0,0,0,62,0,0,0,94,0,0,0,10,0,0,0,154,0,0,0,50,0,0,0,48,0,0,0,20,0,0,0,2,0,0,0,36,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,
-24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,
-22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22],"i8",L,l.J+61457);D([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,10,0,0,0,12,0,0,0,14,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,28,0,0,0,32,0,0,0,40,0,0,0,48,0,0,0,56,0,0,0,64,0,0,0,80,0,0,0,96,0,0,0,112,0,0,0,128,0,0,0,160,0,0,0,192,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,6,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,24,0,0,0,32,0,0,0,48,0,0,0,64,0,0,0,96,0,0,0,128,0,0,0,192,0,0,0,0,1,0,0,128,1,0,0,0,2,0,
-0,0,3,0,0,0,4,0,0,0,6,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,24,0,0,0,32,0,0,0,48,0,0,0,64,0,0,0,96,0,0,16,164,2,0,208,163,2,0,200,163,2,0,192,163,2,0,224,163,2,0,232,163,2,0,152,163,2,0,136,163,2,0,38,0,0,0,96,0,0,0,36,0,0,0,100,0,0,0,70,0,0,0,26,0,0,0,4,0,0,0,156,0,0,0,42,0,0,0,106,0,0,0,112,0,0,0,54,0,0,0,28,0,0,0,74,0,0,0,12,0,0,0,24,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,
-18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,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,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,
-63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,
-227,20,29,201,209,63,244,108,86,125,174,182,214,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,196,66,173,105,222,113,236,63,16,122,54,171,62,87,229,63,245,219,215,129,115,70,204,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,136,133,90,211,188,227,216,63,1,77,132,13,79,175,226,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,
-201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,1,77,132,13,79,175,226,63,1,77,132,13,79,175,226,63,1,77,132,13,79,175,226,63,181,21,251,203,238,201,225,63,204,93,75,200,7,61,240,63,16,122,54,171,62,87,229,63,16,122,54,171,62,87,229,63,210,111,95,7,206,25,231,63,210,111,
-95,7,206,25,231,63,16,122,54,171,62,87,229,63,120,11,36,40,126,140,227,63,106,222,113,138,142,228,232,63,210,111,95,7,206,25,231,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,16,122,54,171,62,87,229,63,181,21,251,203,238,201,225,63,44,212,154,230,29,167,234,63,210,111,95,7,206,25,231,63,106,222,113,138,142,228,232,63,16,122,54,171,62,87,229,63,106,222,113,138,142,228,232,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,120,11,36,40,126,140,227,63,210,111,95,7,206,25,231,63,16,122,54,
-171,62,87,229,63,134,56,214,197,109,52,238,63,16,122,54,171,62,87,229,63,16,122,54,171,62,87,229,63,120,11,36,40,126,140,227,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,166,10,70,37,117,2,222,63,181,21,251,203,238,201,225,63,72,191,125,29,56,103,204,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,224,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,181,
-21,251,203,238,201,225,63,72,191,125,29,56,103,204,63,72,191,125,29,56,103,204,63,0,0,0,0,0,0,224,63,72,191,125,29,56,103,204,63,44,212,154,230,29,167,234,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,224,63,210,111,95,7,206,25,231,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,2,154,8,27,158,
-94,213,63,224,190,14,156,51,162,208,63,2,154,8,27,158,94,213,63,1,77,132,13,79,175,226,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,
-227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,
-201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,62,232,217,172,250,92,197,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,29,56,103,68,105,111,200,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,
-209,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,231,29,167,232,72,46,225,63,162,180,55,248,194,100,214,63,72,191,125,29,56,103,204,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,211,188,227,20,29,201,209,63,120,11,36,40,126,140,227,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,
-88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,240,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,
-20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,240,63,211,188,227,20,29,201,209,63,234,149,178,12,113,172,215,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,
-211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,106,222,113,138,142,228,232,63,0,0,0,0,0,0,240,63,152,221,147,135,133,90,215,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,196,66,173,105,222,113,236,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,72,191,125,29,
-56,103,204,63,120,11,36,40,126,140,227,63,134,56,214,197,109,52,238,63,120,11,36,40,126,140,227,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,1,0,0,0,64,95,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,96,0,0,0,0,0,0,0,0,0,0,3,0,0,0,128,98,0,0,3,0,0,0,88,98,0,0,3,0,0,0,200,97,0,0,3,0,0,0,80,97,0,0,3,0,0,0,16,97,0,0,3,0,0,0,232,96,0,0,3,0,0,0,168,96,0,0,3,0,0,0,160,97,0,0,3,0,0,0,224,186,2,0,0,0,0,0,248,90,0,0,0,0,0,0,208,90,0,0,0,0,0,0,168,
-90,0,0,0,0,0,0,88,90,0,0,0,0,0,0,48,90,0,0,0,0,0,0,8,90,0,0,0,0,0,0,224,89,0,0,0,0,0,0,128,90,0,0,0,0,0,0,160,186,2,0,4,0,0,0,88,91,0,0,0,0,0,0,0,0,0,0,8,153,1,0,40,151,1,0,184,148,1,0,16,146,1,0,96,142,1,0,0,0,0,0,0,0,0,0,128,65,3,0,0,0,0,0,80,2,2,0,1,0,0,0,184,249,1,0,7,0,0,0,16,237,1,0,3,0,0,0,64,227,1,0,5,0,0,0,216,219,1,0,15,0,0,0,168,216,1,0,8,0,0,0,168,216,1,0,16,0,0,0,128,213,1,0,4,0,0,0,128,213,1,0,17,0,0,0,80,210,1,0,5,0,0,0,80,210,1,0,2,0,0,0,168,207,1,0,6,0,0,0,16,204,1,0,4,0,0,0,120,
-200,1,0,7,0,0,0,224,196,1,0,7,0,0,0,192,191,1,0,5,0,0,0,104,188,1,0,8,0,0,0,80,186,1,0,8,0,0,0,104,188,1,0,9,0,0,0,32,184,1,0,7,0,0,0,56,182,1,0,10,0,0,0,248,179,1,0,7,0,0,0,104,177,1,0,11,0,0,0,120,174,1,0,6,0,0,0,184,171,1,0,12,0,0,0,136,168,1,0,9,0,0,0,184,171,1,0,13,0,0,0,152,164,1,0,8,0,0,0,240,161,1,0,14,0,0,0,72,160,1,0,8,0,0,0,144,158,1,0,18,0,0,0,168,156,1,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,110,114,0,0,0,0,0,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,
-47,50,48,48,48,47,120,109,108,110,115,47,0,0,0,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,88,77,76,47,49,57,57,56,47,110,97,109,101,115,112,97,99,101,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,23,17,2,2,2,2,2,2,2,2,2,2,2,2,2,18,16,2,19,2,2,22,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,20,2,21,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,2,15,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,3,4,5,6,7,8,9,10,11,12,13,0,0,0,34,12,13,14,35,15,9,16,17,10,16,17,201,16,17,45,69,70,252,1,6,246,15,7,246,36,2,16,17,47,48,54,77,78,40,38,59,60,42,54,49,57,61,63,47,58,64,216,68,48,62,37,55,67,53,75,43,56,73,76,0,0,0,0,0,2,2,1,0,3,3,1,0,1,0,1,1,1,0,2,1,1,0,2,2,3,1,1,0,0,5,0,1,3,1,3,5,3,1,1,1,1,2,
-0,1,0,4,2,0,2,1,1,3,2,1,0,3,2,1,0,1,1,0,1,1,1,3,0,0,24,25,25,25,26,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,36,36,38,39,37,37,40,40,41,41,41,42,42,43,43,43,44,44,45,45,46,47,47,48,49,49,50,51,52,54,53,55,55,55,56,56,56,57,57,58,58,0,238,238,255,238,238,238,238,238,238,31,32,238,0,239,238,238,238,12,238,238,238,8,13,238,238,238,248,238,238,238,238,238,238,245,238,0,0,0,0,0,18,238,238,20,9,3,238,254,238,238,238,1,238,238,238,1,238,238,10,254,238,19,25,21,238,19,1,238,238,238,238,11,17,238,238,
-238,238,238,238,238,238,238,1,238,238,22,9,1,1,29,15,23,238,238,26,23,27,238,238,28,238,238,238,238,1,25,251,238,238,238,1,238,16,238,238,30,238,238,238,238,255,3,8,4,33,5,11,18,19,39,20,21,22,41,50,65,23,24,25,26,44,51,52,66,71,72,27,74,28,29,46,30,79,31,32,0,0,0,0,0,0,3,9,0,0,0,1,14,2,11,12,8,35,36,37,54,59,61,0,13,16,18,27,22,28,18,39,50,34,23,51,30,60,6,7,53,5,15,17,20,24,41,0,19,41,0,0,0,0,0,55,21,40,29,30,0,33,38,52,31,48,62,25,44,0,27,0,32,26,42,0,43,58,46,47,0,49,56,57,45,11,3,4,5,15,7,3,
-12,13,6,12,13,14,12,13,26,21,22,0,1,0,3,7,14,6,15,8,12,13,18,19,42,16,17,9,16,47,48,17,50,23,19,13,20,18,46,18,20,65,19,50,19,44,64,42,66,25,44,66,70,0,0,0,0,0,0,10,0,11,0,12,0,13,0,14,0,10,0,15,0,16,0,17,0,18,0,19,0,10,0,20,0,21,0,21,0,21,0,22,0,23,0,21,0,24,0,21,0,21,0,25,0,21,0,21,0,21,0,26,0,21,0,21,0,10,0,21,0,21,0,21,0,22,0,23,0,24,0,21,0,21,0,25,0,21,0,21,0,21,0,26,0,21,0,21,0,12,0,12,0,35,0,29,0,29,0,31,0,32,0,31,0,32,0,35,0,36,0,37,0,44,0,49,0,46,0,45,0,41,0,36,0,37,0,39,0,40,0,50,0,41,0,
-51,0,42,0,52,0,53,0,54,0,58,0,49,0,48,0,59,0,33,0,66,0,33,0,61,0,62,0,67,0,50,0,51,0,68,0,52,0,53,0,54,0,46,0,88,0,41,0,43,0,88,0,66,0,65,0,69,0,71,0,67,0,70,0,88,0,58,0,68,0,88,0,59,0,88,0,72,0,65,0,73,0,43,0,74,0,75,0,78,0,69,0,71,0,70,0,76,0,77,0,79,0,80,0,43,0,81,0,72,0,82,0,83,0,73,0,74,0,84,0,75,0,78,0,85,0,86,0,76,0,77,0,79,0,87,0,80,0,81,0,88,0,82,0,83,0,27,0,88,0,88,0,84,0,88,0,85,0,86,0,88,0,88,0,88,0,87,0,28,0,28,0,28,0,28,0,28,0,28,0,28,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,34,0,34,0,34,
-0,34,0,34,0,34,0,34,0,38,0,88,0,38,0,38,0,38,0,38,0,38,0,47,0,47,0,55,0,88,0,55,0,55,0,55,0,55,0,55,0,56,0,88,0,56,0,88,0,56,0,56,0,56,0,57,0,88,0,57,0,57,0,57,0,57,0,57,0,60,0,60,0,88,0,60,0,60,0,60,0,60,0,63,0,88,0,63,0,63,0,63,0,63,0,64,0,88,0,64,0,64,0,64,0,64,0,64,0,9,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,
-0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,5,0,0,0,1,0,0,0,6,0,0,0,7,0,0,0,7,0,0,0,1,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,3,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,2,0,0,
-0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,6,0,0,0,1,0,0,0,1,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,1,0,0,0,1,0,0,0,11,0,0,0,1,0,0,0,12,0,0,0,1,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,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,19,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,1,0,0,0,30,0,0,0,1,0,0,0,1,0,0,0,19,0,0,0,1,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,19,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,39,0,0,0,40,0,0,0,41,0,0,0,19,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,19,0,0,0,19,0,0,0,19,0,
-0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,
-0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,
-19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,88,0,1,0,89,0,89,0,90,0,90,0,91,0,91,0,88,0,88,0,88,0,88,0,88,0,92,0,88,0,88,0,88,0,93,0,88,0,88,0,94,0,94,0,94,0,94,0,94,0,94,0,95,0,96,0,97,0,98,0,98,0,88,0,88,0,99,0,88,0,88,0,88,0,92,0,88,0,88,0,93,0,88,0,93,0,88,0,100,0,93,0,88,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,95,0,96,0,97,0,97,0,88,0,98,0,88,0,88,0,99,0,100,0,93,0,94,0,94,0,94,0,94,0,94,0,94,0,
-94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,0,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,4,0,7,0,3,0,4,0,5,0,5,0,6,0,6,0,8,0,7,0,7,0,17,0,22,0,18,0,17,0,18,0,8,0,8,0,15,0,15,0,23,0,15,0,24,0,15,0,25,0,26,0,26,0,29,0,22,0,94,0,29,0,5,0,49,0,6,0,33,
-0,33,0,50,0,23,0,24,0,51,0,25,0,26,0,26,0,41,0,43,0,41,0,43,0,46,0,49,0,46,0,52,0,54,0,50,0,53,0,57,0,58,0,51,0,57,0,58,0,65,0,66,0,65,0,67,0,40,0,68,0,69,0,72,0,52,0,54,0,53,0,70,0,71,0,74,0,76,0,16,0,77,0,66,0,78,0,80,0,67,0,68,0,81,0,69,0,72,0,82,0,84,0,70,0,71,0,74,0,86,0,76,0,77,0,9,0,78,0,80,0,2,0,0,0,0,0,81,0,0,0,82,0,84,0,0,0,0,0,0,0,86,0,89,0,89,0,89,0,89,0,89,0,89,0,89,0,90,0,90,0,90,0,90,0,90,0,90,0,90,0,91,0,91,0,91,0,91,0,91,0,91,0,91,0,92,0,0,0,92,0,92,0,92,0,92,0,92,0,93,0,93,0,95,
-0,0,0,95,0,95,0,95,0,95,0,95,0,96,0,0,0,96,0,0,0,96,0,96,0,96,0,97,0,0,0,97,0,97,0,97,0,97,0,97,0,98,0,98,0,0,0,98,0,98,0,98,0,98,0,99,0,0,0,99,0,99,0,99,0,99,0,100,0,0,0,100,0,100,0,100,0,100,0,100,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,0,0,0,0,0,0,0,0,137,0,43,0,44,0,48,0,50,0,45,0,52,0,139,0,224,0,224,0,
-224,0,224,0,0,0,58,0,111,0,52,0,52,0,224,0,224,0,0,0,37,0,50,0,43,0,47,0,44,0,0,0,0,0,68,0,0,0,0,0,224,0,78,0,0,0,224,0,224,0,224,0,0,0,224,0,100,0,82,0,224,0,83,0,224,0,0,0,86,0,224,0,0,0,59,0,63,0,72,0,80,0,74,0,83,0,0,0,0,0,95,0,96,0,224,0,0,0,224,0,224,0,0,0,0,0,98,0,81,0,91,0,86,0,94,0,95,0,98,0,99,0,0,0,98,0,0,0,104,0,96,0,99,0,0,0,97,0,114,0,110,0,0,0,107,0,0,0,115,0,0,0,224,0,152,0,159,0,166,0,173,0,176,0,70,0,182,0,189,0,196,0,203,0,210,0,216,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,25,0,25,0,30,
-0,30,0,33,0,31,0,10,0,2,0,21,0,9,0,31,0,31,0,31,0,20,0,26,0,1,0,19,0,19,0,19,0,19,0,19,0,19,0,8,0,4,0,5,0,25,0,2,0,22,0,25,0,30,0,29,0,28,0,27,0,9,0,18,0,0,0,20,0,17,0,20,0,3,0,7,0,20,0,20,0,19,0,19,0,19,0,19,0,19,0,19,0,19,0,8,0,4,0,5,0,5,0,6,0,25,0,24,0,23,0,30,0,7,0,20,0,19,0,19,0,19,0,19,0,19,0,19,0,19,0,12,0,19,0,11,0,19,0,19,0,19,0,13,0,19,0,19,0,19,0,15,0,19,0,14,0,19,0,16,0,0,0,0,0,0,0,0,0,112,111,108,121,32,37,115,0,47,114,100,98,117,52,47,50,0,0,0,0,0,0,0,0,47,114,100,98,117,52,47,49,0,
-0,0,0,0,0,0,0,47,114,100,98,117,51,47,51,0,0,0,0,0,0,0,0,47,114,100,98,117,51,47,50,0,0,0,0,0,0,0,0,60,33,45,45,32,80,97,103,101,115,58,32,37,100,32,45,45,62,10,0,0,0,0,0,47,114,100,98,117,51,47,49,0,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,57,0,0,0,0,0,0,0,47,115,101,116,95,115,99,97,108,101,32,123,0,0,0,0,90,101,116,97,0,0,0,0,109,97,114,103,105,110,0,0,109,105,100,110,105,103,104,116,98,108,117,101,0,0,0,0,47,114,100,98,117,49,49,47,56,0,0,0,0,0,0,0,100,101,99,111,114,97,116,101,0,0,0,0,0,0,0,
-0,116,97,114,103,101,116,0,0,47,114,100,98,117,49,49,47,55,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,54,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,53,0,0,0,0,0,0,0,47,98,114,98,103,51,47,50,0,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,52,0,0,0,0,0,0,0,106,112,103,58,102,105,103,0,47,114,100,98,117,49,49,47,51,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,50,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,49,49,0,0,0,0,0,0,60,47,84,73,84,76,69,62,0,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,49,48,0,0,0,0,0,0,47,114,
-100,98,117,49,49,47,49,0,0,0,0,0,0,0,47,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,49,46,48,32,100,101,102,0,89,117,109,108,0,0,0,0,92,78,0,0,0,0,0,0,109,101,100,105,117,109,118,105,111,108,101,116,114,101,100,0,47,114,100,98,117,49,48,47,57,0,0,0,0,0,0,0,109,105,110,108,101,110,0,0,104,101,97,100,85,82,76,0,47,114,100,98,117,49,48,47,56,0,0,0,0,0,0,0,47,114,100,98,117,49,48,47,55,0,0,0,0,0,0,0,47,114,100,98,117,49,48,47,54,0,0,0,0,0,0,0,47,98,114,98,103,51,47,49,0,0,0,0,0,0,0,0,47,114,100,
-98,117,49,48,47,53,0,0,0,0,0,0,0,47,114,100,98,117,49,48,47,52,0,0,0,0,0,0,0,118,101,101,0,0,0,0,0,47,114,100,98,117,49,48,47,51,0,0,0,0,0,0,0,47,114,100,98,117,49,48,47,50,0,0,0,0,0,0,0,60,84,73,84,76,69,62,0,47,114,100,98,117,49,48,47,49,48,0,0,0,0,0,0,47,114,100,98,117,49,48,47,49,0,0,0,0,0,0,0,47,99,111,111,114,100,102,111,110,116,32,99,111,111,114,100,45,102,111,110,116,45,102,97,109,105,108,121,32,102,105,110,100,102,111,110,116,32,56,32,115,99,97,108,101,102,111,110,116,32,100,101,102,0,0,
-0,89,97,99,117,116,101,0,0,98,97,100,32,108,97,98,101,108,32,102,111,114,109,97,116,32,37,115,10,0,0,0,0,109,101,100,105,117,109,116,117,114,113,117,111,105,115,101,0,47,112,117,114,112,108,101,115,57,47,57,0,0,0,0,0,108,97,98,101,108,97,110,103,108,101,0,0,0,0,0,0,46,46,46,32,37,115,32,46,46,46,10,0,0,0,0,0,114,101,109,105,110,99,114,111,115,115,0,0,0,0,0,0,104,101,97,100,104,114,101,102,0,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,57,47,56,0,0,0,0,0,47,112,117,114,112,108,101,115,57,47,55,0,0,
-0,0,0,47,112,117,114,112,108,101,115,57,47,54,0,0,0,0,0,47,98,114,98,103,49,49,47,57,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,57,47,53,0,0,0,0,0,47,112,117,114,112,108,101,115,57,47,52,0,0,0,0,0,47,112,117,114,112,108,101,115,57,47,51,0,0,0,0,0,47,112,117,114,112,108,101,115,57,47,50,0,0,0,0,0,60,77,69,84,65,32,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101,110,116,45,84,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,104,116,109,108,59,32,99,104,97,114,
-115,101,116,61,85,84,70,45,56,34,62,10,0,0,0,0,47,112,117,114,112,108,101,115,57,47,49,0,0,0,0,0,47,112,117,114,112,108,101,115,56,47,56,0,0,0,0,0,47,100,101,102,97,117,108,116,45,102,111,110,116,45,102,97,109,105,108,121,32,47,84,105,109,101,115,45,82,111,109,97,110,32,100,101,102,0,0,0,88,105,0,0,0,0,0,0,102,105,108,108,101,100,0,0,102,105,108,108,32,0,0,0,109,101,100,105,117,109,115,112,114,105,110,103,103,114,101,101,110,0,0,0,0,0,0,0,97,103,114,101,99,111,114,100,95,99,97,108,108,98,97,99,107,
-32,111,102,32,97,32,98,97,100,32,111,98,106,101,99,116,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,56,47,55,0,0,0,0,0,108,97,98,101,108,100,105,115,116,97,110,99,101,0,0,0,67,69,76,76,83,66,79,82,68,69,82,0,0,0,0,0,116,97,105,108,85,82,76,0,47,112,117,114,112,108,101,115,56,47,54,0,0,0,0,0,47,112,117,114,112,108,101,115,56,47,53,0,0,0,0,0,47,112,117,114,112,108,101,115,56,47,52,0,0,0,0,0,47,98,114,98,103,49,49,47,56,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,56,47,51,0,0,0,0,0,47,112,117,114,112,
-108,101,115,56,47,50,0,0,0,0,0,121,101,108,108,111,119,0,0,47,112,117,114,112,108,101,115,56,47,49,0,0,0,0,0,47,112,117,114,112,108,101,115,55,47,55,0,0,0,0,0,60,72,69,65,68,62,0,0,47,112,117,114,112,108,101,115,55,47,54,0,0,0,0,0,47,112,117,114,112,108,101,115,55,47,53,0,0,0,0,0,47,99,111,111,114,100,45,102,111,110,116,45,102,97,109,105,108,121,32,47,84,105,109,101,115,45,82,111,109,97,110,32,100,101,102,0,0,0,0,0,85,117,109,108,0,0,0,0,105,110,118,105,115,0,0,0,109,101,100,105,117,109,115,108,97,
-116,101,98,108,117,101,0,47,112,117,114,112,108,101,115,55,47,52,0,0,0,0,0,108,97,98,101,108,102,111,110,116,99,111,108,111,114,0,0,85,110,107,110,111,119,110,32,118,97,108,117,101,32,37,115,32,102,111,114,32,67,79,76,85,77,78,83,32,45,32,105,103,110,111,114,101,100,10,0,116,97,105,108,104,114,101,102,0,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,55,47,51,0,0,0,0,0,47,112,117,114,112,108,101,115,55,47,50,0,0,0,0,0,33,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,
-91,48,93,46,116,97,107,101,110,91,105,93,0,0,0,0,0,0,47,112,117,114,112,108,101,115,55,47,49,0,0,0,0,0,47,98,114,98,103,49,49,47,55,0,0,0,0,0,0,0,123,37,115,125,0,0,0,0,47,112,117,114,112,108,101,115,54,47,54,0,0,0,0,0,118,109,108,58,118,109,108,0,112,108,117,115,0,0,0,0,47,112,117,114,112,108,101,115,54,47,53,0,0,0,0,0,47,112,117,114,112,108,101,115,54,47,52,0,0,0,0,0,47,112,117,114,112,108,101,115,54,47,51,0,0,0,0,0,60,47,66,79,68,89,62,10,60,47,72,84,77,76,62,10,0,0,0,0,0,0,0,0,47,112,117,114,
-112,108,101,115,54,47,50,0,0,0,0,0,101,100,103,101,0,0,0,0,47,112,117,114,112,108,101,115,54,47,49,0,0,0,0,0,37,37,66,101,103,105,110,82,101,115,111,117,114,99,101,58,32,112,114,111,99,115,101,116,32,103,114,97,112,104,118,105,122,32,48,32,48,0,0,0,85,112,115,105,108,111,110,0,37,46,53,103,32,37,46,53,103,32,116,114,97,110,115,108,97,116,101,32,110,101,119,112,97,116,104,32,117,115,101,114,95,115,104,97,112,101,95,37,100,10,0,0,0,0,0,0,47,112,117,114,112,108,101,115,53,47,53,0,0,0,0,0,109,101,100,
-105,117,109,115,101,97,103,114,101,101,110,0,0,108,97,98,101,108,102,111,110,116,110,97,109,101,0,0,0,85,110,107,110,111,119,110,32,118,97,108,117,101,32,37,115,32,102,111,114,32,82,79,87,83,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,78,68,95,111,117,116,40,118,41,46,115,105,122,101,32,61,61,32,50,0,0,0,0,0,108,97,98,101,108,85,82,76,0,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,53,47,52,0,0,0,0,0,47,112,117,114,112,108,101,115,53,47,51,0,0,0,0,0,47,112,117,114,112,108,101,115,53,47,50,0,0,
-0,0,0,47,98,114,98,103,49,49,47,54,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,53,47,49,0,0,0,0,0,91,94,91,58,115,112,97,99,101,58,93,93,0,0,0,0,110,101,97,116,111,95,108,97,121,111,117,116,0,0,0,0,47,112,117,114,112,108,101,115,52,47,52,0,0,0,0,0,47,112,117,114,112,108,101,115,52,47,51,0,0,0,0,0,37,100,0,0,0,0,0,0,47,112,117,114,112,108,101,115,52,47,50,0,0,0,0,0,60,33,45,45,32,105,110,115,101,114,116,32,97,110,121,32,111,116,104,101,114,32,78,79,78,45,73,69,32,104,116,109,108,32,99,111,110,116,
-101,110,116,32,104,101,114,101,32,45,45,62,10,0,0,0,0,0,120,100,111,116,58,120,100,111,116,0,0,0,0,0,0,0,100,101,102,108,97,116,105,111,110,32,102,105,110,105,115,104,32,112,114,111,98,108,101,109,32,37,100,32,99,110,116,61,37,100,10,0,0,0,0,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,112,110,108,115,0,0,0,0,0,0,47,112,117,114,112,108,101,115,52,47,49,0,0,0,0,0,47,112,117,114,112,108,101,115,51,47,51,0,0,0,0,0,116,114,117,101,0,0,0,0,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,0,85,103,
-114,97,118,101,0,0,110,111,100,101,32,37,115,44,32,112,111,114,116,32,37,115,32,117,110,114,101,99,111,103,110,105,122,101,100,10,0,0,91,105,110,116,101,114,110,97,108,32,97,114,105,97,108,93,0,0,0,0,0,0,0,0,109,101,100,105,117,109,112,117,114,112,108,101,0,0,0,0,47,112,117,114,112,108,101,115,51,47,50,0,0,0,0,0,108,97,98,101,108,102,111,110,116,115,105,122,101,0,0,0,114,111,119,115,0,0,0,0,108,97,98,101,108,104,114,101,102,0,0,0,0,0,0,0,110,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,51,47,49,0,
-0,0,0,0,119,0,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,98,111,120,32,48,32,104,97,115,32,76,76,32,99,111,111,114,100,32,62,32,85,82,32,99,111,111,114,100,10,0,0,0,0,47,112,117,114,100,57,47,57,0,0,0,0,0,0,0,0,84,82,65,73,76,69,82,0,47,97,99,99,101,110,116,53,47,49,0,0,0,0,0,0,101,100,103,101,0,0,0,0,116,114,111,117,98,108,101,32,105,110,32,105,110,105,116,95,114,97,110,107,10,0,0,0,10,102,105,110,97,108,32,101,32,61,32,37,
-102,0,0,0,38,103,116,59,0,0,0,0,47,112,117,114,100,57,47,56,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,53,0,0,0,0,0,0,0,37,115,58,37,115,0,0,0,110,111,100,101,0,0,0,0,47,112,117,114,100,57,47,55,0,0,0,0,0,0,0,0,83,101,116,116,105,110,103,32,117,112,32,115,116,114,101,115,115,32,102,117,110,99,116,105,111,110,0,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,100,101,108,120,32,62,61,32,48,0,0,0,0,0,0,0,47,112,117,114,100,57,47,54,0,0,0,0,0,0,0,0,84,68,0,0,0,0,0,0,47,112,117,114,100,
-57,47,53,0,0,0,0,0,0,0,0,101,115,101,112,0,0,0,0,47,112,117,114,100,57,47,52,0,0,0,0,0,0,0,0,60,68,73,86,32,105,100,61,39,95,110,111,116,86,77,76,50,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,34,62,10,0,0,0,0,0,0,0,0,37,115,32,45,62,32,37,115,58,32,104,101,97,100,32,105,115,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,0,0,0,0,0,0,110,111,100,101,0,0,0,0,47,112,117,114,100,57,47,51,0,0,0,0,0,0,
-0,0,47,112,117,114,100,57,47,50,0,0,0,0,0,0,0,0,99,108,101,97,114,116,111,109,97,114,107,0,0,0,0,0,111,114,116,104,111,103,111,110,97,108,32,108,105,110,101,115,0,0,0,0,0,0,0,0,85,99,105,114,99,0,0,0,110,111,100,101,32,37,115,44,32,112,111,114,116,32,37,115,44,32,117,110,114,101,99,111,103,110,105,122,101,100,32,99,111,109,112,97,115,115,32,112,111,105,110,116,32,39,37,115,39,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,109,101,100,105,117,109,111,114,99,104,105,100,0,0,0,0,47,112,117,114,100,
-57,47,49,0,0,0,0,0,0,0,0,116,97,105,108,108,97,98,101,108,0,0,0,0,0,0,0,99,111,108,117,109,110,115,0,101,100,103,101,85,82,76,0,98,105,115,113,117,101,0,0,47,112,117,114],"i8",L,l.J+71716);D([100,56,47,56,0,0,0,0,0,0,0,0,47,112,117,114,100,56,47,55,0,0,0,0,0,0,0,0,47,112,117,114,100,56,47,54,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,52,0,0,0,0,0,0,0,47,112,117,114,100,56,47,53,0,0,0,0,0,0,0,0,44,10,0,0,0,0,0,0,110,111,100,101,32,37,115,32,105,110,32,103,114,97,112,104,32,37,115,32,104,97,115,32,110,
-111,32,112,111,115,105,116,105,111,110,10,0,0,0,0,47,112,117,114,100,56,47,52,0,0,0,0,0,0,0,0,37,115,32,115,97,118,101,32,112,111,105,110,116,32,115,105,122,101,32,97,110,100,32,102,111,110,116,10,46,110,114,32,46,83,32,92,110,40,46,115,10,46,110,114,32,68,70,32,92,110,40,46,102,10,0,0,47,112,117,114,100,56,47,51,0,0,0,0,0,0,0,0,127,98,111,116,0,0,0,0,47,112,117,114,100,56,47,50,0,0,0,0,0,0,0,0,60,72,50,62,83,111,114,114,121,44,32,116,104,105,115,32,100,105,97,103,114,97,109,32,119,105,108,108,32,
-111,110,108,121,32,100,105,115,112,108,97,121,32,99,111,114,114,101,99,116,108,121,32,111,110,32,73,110,116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,32,53,32,40,97,110,100,32,117,112,41,32,98,114,111,119,115,101,114,115,46,60,47,72,50,62,10,0,0,0,0,0,47,112,117,114,100,56,47,49,0,0,0,0,0,0,0,0,104,112,0,0,0,0,0,0,37,108,102,37,50,115,0,0,115,101,116,108,105,110,101,119,105,100,116,104,0,0,0,0,47,112,117,114,100,55,47,55,0,0,0,0,0,0,0,0,47,67,111,117,114,105,101,114,45,66,111,108,100,
-79,98,108,105,113,117,101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,0,85,97,99,117,116,101,0,0,102,108,101,120,32,115,99,97,110,110,101,114,32,112,117,115,104,45,98,97,99,107,32,111,118,101,114,102,108,111,119,0,95,0,0,0,0,0,0,0,109,101,100,105,117,109,98,108,117,101,0,0,0,0,0,0,47,112,117,114,100,55,47,54,0,0,0,0,0,0,0,0,104,101,97,100,108,97,98,101,108,0,0,0,0,0,0,0,99,101,108,108,98,111,114,100,101,114,0,0,0,0,0,0,101,100,103,101,104,114,101,102,0,0,0,0,0,0,0,0,47,112,117,114,
-100,55,47,53,0,0,0,0,0,0,0,0,117,110,102,105,108,108,101,100,0,0,0,0,0,0,0,0,47,112,117,114,100,55,47,52,0,0,0,0,0,0,0,0,111,117,116,0,0,0,0,0,47,112,117,114,100,55,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,51,0,0,0,0,0,0,0,47,112,117,114,100,55,47,50,0,0,0,0,0,0,0,0,47,112,117,114,100,55,47,49,0,0,0,0,0,0,0,0,37,115,32,84,105,116,108,101,58,32,37,115,10,0,0,0,47,112,117,114,100,54,47,54,0,0,0,0,0,0,0,0,47,112,117,114,100,54,47,53,0,0,0,0,0,0,0,0,60,33,45,45,32,116,104,105,115,32,115,104,111,
-117,108,100,32,111,110,108,121,32,100,105,115,112,108,97,121,32,111,110,32,78,79,78,45,73,69,32,98,114,111,119,115,101,114,115,32,45,45,62,10,0,0,0,47,112,117,114,100,54,47,52,0,0,0,0,0,0,0,0,47,112,117,114,100,54,47,51,0,0,0,0,0,0,0,0,47,67,111,117,114,105,101,114,45,66,111,108,100,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,84,104,101,116,97,0,0,0,119,101,100,103,101,100,0,0,109,101,100,105,117,109,97,113,117,97,109,97,114,105,110,101,0,0,0,0,0,0,0,0,47,112,117,114,100,54,47,50,
-0,0,0,0,0,0,0,0,97,114,114,111,119,116,97,105,108,0,0,0,0,0,0,0,60,84,65,66,76,69,62,0,85,82,76,0,0,0,0,0,47,112,117,114,100,54,47,49,0,0,0,0,0,0,0,0,47,112,117,114,100,53,47,53,0,0,0,0,0,0,0,0,47,112,117,114,100,53,47,52,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,50,0,0,0,0,0,0,0,100,117,112,108,105,99,97,116,101,32,97,116,116,114,105,98,117,116,101,0,0,0,0,0,47,112,117,114,100,53,47,51,0,0,0,0,0,0,0,0,99,105,114,99,108,101,32,37,115,32,37,100,44,37,100,44,37,100,10,0,0,0,0,0,47,112,117,114,100,53,
-47,50,0,0,0,0,0,0,0,0,37,115,32,67,114,101,97,116,111,114,58,32,37,115,32,118,101,114,115,105,111,110,32,37,115,32,40,37,115,41,10,0,47,112,117,114,100,53,47,49,0,0,0,0,0,0,0,0,47,112,117,114,100,52,47,52,0,0,0,0,0,0,0,0,60,68,73,86,32,105,100,61,39,95,110,111,116,86,77,76,49,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,34,62,10,0,0,0,0,0,0,0,0,47,112,117,114,100,52,47,51,0,0,0,0,0,0,0,0,47,112,117,114,100,52,47,50,0,0,0,0,0,0,0,0,47,67,111,
-117,114,105,101,114,45,79,98,108,105,113,117,101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,84,97,117,0,0,0,0,0,115,116,114,105,112,101,100,0,109,97,114,111,111,110,0,0,47,112,117,114,100,52,47,49,0,0,0,0,0,0,0,0,97,114,114,111,119,104,101,97,100,0,0,0,0,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,65,76,73,71,78,32,105,110,32,84,68,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,0,104,114,101,102,0,0,0,0,47,112,117,114,100,51,47,51,0,0,0,0,0,0,0,
-0,47,112,117,114,100,51,47,50,0,0,0,0,0,0,0,0,47,112,117,114,100,51,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,49,49,0,0,0,0,0,0,47,112,117,111,114,57,47,57,0,0,0,0,0,0,0,0,106,112,101,58,102,105,103,0,47,112,117,111,114,57,47,56,0,0,0,0,0,0,0,0,37,115,32,114,101,115,116,111,114,101,32,112,111,105,110,116,32,115,105,122,101,32,97,110,100,32,102,111,110,116,10,46,112,115,32,92,110,40,46,83,10,46,102,116,32,92,110,40,68,70,10,0,0,0,0,0,47,112,117,111,114,57,47,55,0,0,0,0,0,0,0,0,47,112,117,111,
-114,57,47,54,0,0,0,0,0,0,0,0,60,33,45,45,32,105,110,115,101,114,116,32,97,110,121,32,111,116,104,101,114,32,104,116,109,108,32,99,111,110,116,101,110,116,32,104,101,114,101,32,45,45,62,10,0,0,0,0,47,112,117,111,114,57,47,53,0,0,0,0,0,0,0,0,47,112,117,111,114,57,47,52,0,0,0,0,0,0,0,0,47,67,111,117,114,105,101,114,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,84,72,79,82,78,0,0,0,114,97,100,105,97,108,0,0,109,97,103,101,110,116,97,0,47,112,117,111,114,57,47,51,0,0,0,0,0,0,0,0,100,105,114,
-0,0,0,0,0,69,88,84,0,0,0,0,0,32,45,45,32,0,0,0,0,47,112,117,111,114,57,47,50,0,0,0,0,0,0,0,0,105,110,99,111,109,112,97,116,105,98,108,101,32,118,101,114,115,105,111,110,0,0,0,0,47,112,117,111,114,57,47,49,0,0,0,0,0,0,0,0,47,112,117,111,114,56,47,56,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,49,48,0,0,0,0,0,0,112,110,103,58,115,118,103,0,47,112,117,111,114,56,47,55,0,0,0,0,0,0,0,0,47,112,117,111,114,56,47,54,0,0,0,0,0,0,0,0,47,112,117,111,114,56,47,53,0,0,0,0,0,0,0,0,37,115,37,115,32,117,110,115,117,
-112,112,111,114,116,101,100,10,0,0,0,0,0,0,0,105,110,118,0,0,0,0,0,47,112,117,111,114,56,47,52,0,0,0,0,0,0,0,0,60,68,73,86,32,105,100,61,39,95,86,77,76,50,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,118,105,115,105,98,105,108,105,116,121,58,104,105,100,100,101,110,34,62,10,0,0,47,112,117,111,114,56,47,51,0,0,0,0,0,0,0,0,47,112,117,111,114,56,47,50,0,0,0,0,0,0,0,0,47,72,101,108,118,101,116,105,99,97,45,66,111,108,100,79,98,108,105,113,117,
-101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,83,105,103,109,97,0,0,0,105,110,118,105,115,0,0,0,108,105,110,101,110,0,0,0,47,112,117,111,114,56,47,49,0,0,0,0,0,0,0,0,108,97,98,101,108,102,108,111,97,116,0,0,0,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,66,65,76,73,71,78,32,105,110,32,84,68,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,32,45,62,32,0,0,0,0,47,112,117,111,114,55,47,55,0,0,0,0,0,0,0,0,47,112,117,111,114,55,47,54,0,0,0,0,0,0,0,
-0,47,112,117,111,114,55,47,53,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,49,0,0,0,0,0,0,0,47,112,117,111,114,55,47,52,0,0,0,0,0,0,0,0,47,112,117,111,114,55,47,51,0,0,0,0,0,0,0,0,100,101,102,105,110,101,32,97,116,116,114,115,48,32,37,37,32,37,37,59,32,100,101,102,105,110,101,32,117,110,102,105,108,108,101,100,32,37,37,32,37,37,59,32,100,101,102,105,110,101,32,114,111,117,110,100,101,100,32,37,37,32,37,37,59,32,100,101,102,105,110,101,32,100,105,97,103,111,110,97,108,115,32,37,37,32,37,37,10,0,0,0,0,
-0,0,0,47,112,117,111,114,55,47,50,0,0,0,0,0,0,0,0,47,112,117,111,114,55,47,49,0,0,0,0,0,0,0,0,60,47,68,73,86,62,10,0,47,112,117,111,114,54,47,54,0,0,0,0,0,0,0,0,47,112,117,111,114,54,47,53,0,0,0,0,0,0,0,0,109,97,112,0,0,0,0,0,83,99,97,114,111,110,0,0,100,105,97,103,111,110,97,108,115,0,0,0,0,0,0,0,101,108,108,105,112,115,101,32,97,116,116,114,115,37,100,32,37,115,119,105,100,32,37,46,53,102,32,104,116,32,37,46,53,102,32,97,116,32,40,37,46,53,102,44,37,46,53,102,41,59,10,0,0,0,0,0,108,105,109,101,
-103,114,101,101,110,0,0,0,0,0,0,0,47,112,117,111,114,54,47,52,0,0,0,0,0,0,0,0,119,101,105,103,104,116,0,0,66,79,82,68,69,82,0,0,105,110,32,101,100,103,101,32,37,115,37,115,37,115,10,0,111,117,116,32,111,102,32,109,101,109,111,114,121,10,0,0,47,112,117,111,114,54,47,51,0,0,0,0,0,0,0,0,47,72,101,108,118,101,116,105,99,97,45,66,111,108,100,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,47,112,117,111,114,54,47,50,0,0,0,0,0,0,0,0,47,112,117,111,114,54,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,
-49,48,47,57,0,0,0,0,0,0,0,118,103,0,0,0,0,0,0,47,112,117,111,114,53,47,53,0,0,0,0,0,0,0,0,47,112,117,111,114,53,47,52,0,0,0,0,0,0,0,0,68,111,116,58,32,91,10,0,47,112,117,111,114,53,47,51,0,0,0,0,0,0,0,0,119,104,105,116,101,0,0,0,47,112,117,111,114,53,47,50,0,0,0,0,0,0,0,0,60,47,118,58,103,114,111,117,112,62,10,0,0,0,0,0,47,112,117,111,114,53,47,49,0,0,0,0,0,0,0,0,47,112,117,111,114,52,47,52,0,0,0,0,0,0,0,0,47,72,101,108,118,101,116,105,99,97,45,79,98,108,105,113,117,101,32,115,116,97,114,110,101,
-116,73,83,79,32,100,101,102,0,0,0,0,0,0,0,82,104,111,0,0,0,0,0,114,111,117,110,100,101,100,0,108,105,109,101,0,0,0,0,47,112,117,111,114,52,47,51,0,0,0,0,0,0,0,0,122,0,0,0,0,0,0,0,67,69,76,76,80,65,68,68,73,78,71,0,0,0,0,0,110,111,110,101,0,0,0,0,47,112,117,111,114,52,47,50,0,0,0,0,0,0,0,0,47,112,117,111,114,52,47,49,0,0,0,0,0,0,0,0,47,112,117,111,114,51,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,49,48,47,56,0,0,0,0,0,0,0,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,
-48,93,46,99,111,117,110,116,91,48,93,32,62,61,32,114,116,112,45,62,77,105,110,70,105,108,108,32,38,38,32,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,49,93,32,62,61,32,114,116,112,45,62,77,105,110,70,105,108,108,0,0,47,112,117,111,114,51,47,50,0,0,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,118,109,108,0,0,0,0,0,47,112,117,111,114,51,47,49,0,0,0,0,0,0,0,0,75,80,95,68,111,119,110,0,109,97,120,112,115,104,116,
-32,61,32,37,102,10,109,97,120,112,115,119,105,100,32,61,32,37,102,10,0,0,0,0,0,47,112,117,111,114,49,49,47,57,0,0,0,0,0,0,0,47,112,117,111,114,49,49,47,56,0,0,0,0,0,0,0,62,10,0,0,0,0,0,0,47,112,117,111,114,49,49,47,55,0,0,0,0,0,0,0,110,111,100,101,0,0,0,0,47,112,117,111,114,49,49,47,54,0,0,0,0,0,0,0,47,72,101,108,118,101,116,105,99,97,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,0,0,0,80,115,105,0,0,0,0,0,102,105,108,108,101,100,0,0,108,105,103,104,116,121,101,108,108,111,119,0,0,
-0,0,0,47,112,117,111,114,49,49,47,53,0,0,0,0,0,0,0,118,101,114,116,105,99,101,115,0,0,0,0,0,0,0,0,67,69,76,76,83,80,65,67,73,78,71,0,0,0,0,0,98,111,116,104,0,0,0,0,47,112,117,111,114,49,49,47,52,0,0,0,0,0,0,0,47,112,117,111,114,49,49,47,51,0,0,0,0,0,0,0,47,112,117,111,114,49,49,47,50,0,0,0,0,0,0,0,47,98,114,98,103,49,48,47,55,0,0,0,0,0,0,0,47,112,117,111,114,49,49,47,49,49,0,0,0,0,0,0,91,91,58,115,112,97,99,101,58,93,93,0,0,0,0,0,110,111,112,50,0,0,0,0,47,112,117,111,114,49,49,47,49,48,0,0,0,0,0,
-0,37,115,32,109,97,120,112,115,104,116,32,97,110,100,32,109,97,120,112,115,119,105,100,32,97,114,101,32,112,114,101,100,101,102,105,110,101,100,32,116,111,32,49,49,46,48,32,97,110,100,32,56,46,53,32,105,110,32,103,112,105,99,10,0,47,112,117,111,114,49,49,47,49,0,0,0,0,0,0,0,47,112,117,111,114,49,48,47,57,0,0,0,0,0,0,0,32,116,97,114,103,101,116,61,34,37,115,34,0,0,0,0,112,108,97,105,110,45,101,120,116,58,100,111,116,0,0,0,111,114,100,101,114,0,0,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,
-32,100,113,46,112,110,108,115,0,0,47,112,117,111,114,49,48,47,56,0,0,0,0,0,0,0,47,112,117,111,114,49,48,47,55,0,0,0,0,0,0,0,110,111,0,0,0,0,0,0,47,84,105,109,101,115,45,66,111,108,100,73,116,97,108,105,99,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,0,0,0,0,80,114,105,109,101,0,0,0,104,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,47,112,117,111,114,49,48,47,54,0,0,0,0,0,0,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,0,0,99,111,109,109,101,110,116,0,67,79,76,83,80,65,78,
-32,118,97,108,117,101,32,99,97,110,110,111,116,32,98,101,32,48,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,98,97,99,107,0,0,0,0,47,112,117,111,114,49,48,47,53,0,0,0,0,0,0,0,110,0,0,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,85,110,97,98,108,101,32,116,111,32,114,101,99,108,97,105,109,32,98,111,120,32,115,112,97,99,101,32,105,110,32,115,112,108,105,110,101,32,114,111,117,116,105,110,103,32,102,111,114,32,101,100,103,101,32,34,37,115,34,32,45,62,32,34,37,115,34,46,32,83,111,
-109,101,116,104,105,110,103,32,105,115,32,112,114,111,98,97,98,108,121,32,115,101,114,105,111,117,115,108,121,32,119,114,111,110,103,46,10,0,0,0,0,69,78,68,0,0,0,0,0,32,91,37,100,93,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,37,112,32,34,37,115,34,10,0,0,0,0,0,0,47,112,117,111,114,49,48,47,52,0,0,0,0,0,0,0,104,101,97,100,112,111,114,116,0,0,0,0,0,0,0,0,97,100,100,95,116,114,101,101,95,101,100,103,101,58,32,101,109,112,116,121,32,105,110,101,100,103,
-101,32,108,105,115,116,10,0,0,0,0,0,0,0,47,112,117,111,114,49,48,47,51,0,0,0,0,0,0,0,37,46,50,102,32,115,101,99,10,0,0,0,0,0,0,0,38,108,116,59,0,0,0,0,47,97,99,99,101,110,116,52,47,52,0,0,0,0,0,0,47,98,114,98,103,49,48,47,54,0,0,0,0,0,0,0,103,114,97,112,104,0,0,0,47,112,117,111,114,49,48,47,50,0,0,0,0,0,0,0,58,32,37,46,50,102,32,115,101,99,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,60,84,65,66,76,69,62,0,47,112,117,111,114,49,48,47,49,48,0,0,0,0,0,0,84,72,0,0,0,0,0,0,37,115,
-32,109,97,120,112,115,104,116,32,97,110,100,32,109,97,120,112,115,119,105,100,32,104,97,118,101,32,110,111,32,109,101,97,110,105,110,103,32,105,110,32,68,87,66,32,50,46,48,44,32,115,101,116,32,112,97,103,101,32,98,111,117,110,100,97,114,105,101,115,32,105,110,32,103,112,105,99,32,97,110,100,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,10,0,0,0,0,47,112,117,111,114,49,48,47,49,0,0,0,0,0,0,0,115,101,112,0,0,0,0,0,47,112,117,98,117,103,110,57,47,57,0,0,0,0,0,0,32,116,105,116,108,101,61,
-34,37,115,34,0,0,0,0,0,37,115,32,119,97,115,32,97,108,114,101,97,100,121,32,105,110,32,97,32,114,97,110,107,115,101,116,44,32,100,101,108,101,116,101,100,32,102,114,111,109,32,99,108,117,115,116,101,114,32,37,115,10,0,0,0,99,108,117,115,116,0,0,0,47,112,117,98,117,103,110,57,47,56,0,0,0,0,0,0,47,112,117,98,117,103,110,57,47,55,0,0,0,0,0,0,47,84,105,109,101,115,45,66,111,108,100,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,0,0,67,114,101,97,116,105,110,103,32,101,100,103,101,115,32,
-117,115,105,110,103,32,37,115,10,0,0,0,0,0,0,0,0,80,105,0,0,0,0,0,0,102,97,108,115,101,0,0,0,47,112,117,98,117,103,110,57,47,54,0,0,0,0,0,0,108,105,103,104,116,115,108,97,116,101,103,114,101,121,0,0,103,114,111,117,112,0,0,0,67,79,76,83,80,65,78,0,102,111,114,119,97,114,100,0,98,101,105,103,101,0,0,0,47,112,117,98,117,103,110,57,47,53,0,0,0,0,0,0,37,115,32,45,62,32,37,115,58,32,116,97,105,108,32,110,111,116,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,
-0,0,0,0,0,47,112,117,98,117,103,110,57,47,52,0,0,0,0,0,0,47,112,117,98,117,103,110,57,47,51,0,0,0,0,0,0,47,98,114,98,103,49,48,47,53,0,0,0,0,0,0,0,47,62,10,0,0,0,0,0,47,112,117,98,117,103,110,57,47,50,0,0,0,0,0,0,32,91,0,0,0,0,0,0,99,108,117,115,116,101,114,0,47,112,117,98,117,103,110,57,47,49,0,0,0,0,0,0,102,97,105,108,117,114,101,32,109,97,108,108,111,99,39,105,110,103,32,102,111,114,32,114,101,115,117,108,116,32,115,116,114,105,110,103,0,0,0,0,37,115,32,46,80,83,32,119,47,111,32,97,114,103,115,
-32,99,97,117,115,101,115,32,71,78,85,32,112,105,99,32,116,111,32,115,99,97,108,101,32,100,114,97,119,105,110,103,32,116,111,32,102,105,116,32,56,46,53,120,49,49,32,112,97,112,101,114,59,32,68,87,66,32,100,111,101,115,32,110,111,116,10,0,0,0,0,0,0,47,112,117,98,117,103,110,56,47,56,0,0,0,0,0,0,127,116,111,112,0,0,0,0,47,112,117,98,117,103,110,56,47,55,0,0,0,0,0,0,32,104,114,101,102,61,34,37,115,34,0,0,0,0,0,0,47,112,117,98,117,103,110,56,47,54,0,0,0,0,0,0,110,115,108,105,109,105,116,0,119,105,100,
-116,104,0,0,0,32,115,101,116,108,105,110,101,119,105,100,116,104,10,0,0,47,112,117,98,117,103,110,56,47,53,0,0,0,0,0,0,47,84,105,109,101,115,45,73,116,97,108,105,99,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,80,104,105,0,0,0,0,0,105,109,97,103,101,0,0,0,39,10,0,0,0,0,0,0,47,112,117,98,117,103,110,56,47,52,0,0,0,0,0,0,108,105,103,104,116,115,108,97,116,101,103,114,97,121,0,0,108,97,121,101,114,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,70,73,
-88,69,68,83,73,90,69,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,0,0,0,58,0,0,0,0,0,0,0,47,112,117,98,117,103,110,56,47,51,0,0,0,0,0,0,102,105,108,108,101,100,0,0,47,112,117,98,117,103,110,56,47,50,0,0,0,0,0,0,78,68,95,111,114,100,101,114,40,118,41,32,60,32,78,68,95,111,114,100,101,114,40,119,41,0,0,0,0,0,0,0,47,112,117,98,117,103,110,56,47,49,0,0,0,0,0,0,47,98,114,98,103,49,48,47,52,0,0,0,0,0,0,0,34,32,119,105,100,116,104,61,34,37,103,112,120,34,32,104,101,105,103,104,116,61,34,37,103,112,120,
-34,32,112,114,101,115,101,114,118,101,65,115,112,101,99,116,82,97,116,105,111,61,34,120,77,105,110,89,77,105,110,32,109,101,101,116,34,32,120,61,34,37,103,34,32,121,61,34,37,103,34,0,0,47,112,117,98,117,103,110,55,47,55,0,0,0,0,0,0,47,112,117,98,117,103,110,55,47,54,0,0,0,0,0,0,108,105,110,101,116,104,105,99,107,32,61,32,48,59,32,111,108,100,108,105,110,101,116,104,105,99,107,32,61,32,108,105,110,101,116,104,105,99,107,10,0,0,0,0,0,0,0,0,47,112,117,98,117,103,110,55,47,53,0,0,0,0,0,0,47,112,117,98,
-117,103,110,55,47,52,0,0,0,0,0,0,60,97,0,0,0,0,0,0,47,112,117,98,117,103,110,55,47,51,0,0,0,0,0,0,47,112,117,98,117,103,110,55,47,50,0,0,0,0,0,0,47,84,105,109,101,115,45,82,111,109,97,110,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,0,79,117,109,108,0,0,0,0,105,110,32,110,111,100,101,32,37,115,10,0,0,0,0,0,97,103,100,101,108,101,116,101,32,111,110,32,119,114,111,110,103,32,103,114,97,112,104,0,47,112,117,98,117,103,110,55,47,49,0,0,0,0,0,0,108,105,103,104,116,115,107,121,98,108,117,
-101,0,0,0,0,110,111,106,117,115,116,105,102,121,0,0,0,0,0,0,0,65,76,83,69,0,0,0,0,116,97,112,101,114,101,100,0,47,112,117,98,117,103,110,54,47,54,0,0,0,0,0,0,47,112,117,98,117,103,110,54,47,53,0,0,0,0,0,0,47,112,117,98,117,103,110,54,47,52,0,0,0,0,0,0,47,98,114,98,103,49,48,47,51,0,0,0,0,0,0,0,109,105,115,109,97,116,99,104,101,100,32,116,97,103,0,0,32,116,114,97,110,115,102,111,114,109,61,34,114,111,116,97,116,101,40,37,100,32,37,103,32,37,103,41,34,0,0,0,47,112,117,98,117,103,110,54,47,51,0,0,0,
-0,0,0,47,112,117,98,117,103,110,54,47,50,0,0,0,0,0,0,114,101,99,116,32,37,115,32,37,100,44,37,100,32,37,100,44,37,100,10,0,0,0,0,37,115,32,71,78,85,32,112,105,99,32,115,117,112,112,111,114,116,115,32,97,32,108,105,110,101,116,104,105,99,107,32,118,97,114,105,97,98,108,101,32,116,111,32,115,101,116,32,108,105,110,101,32,116,104,105,99,107,110,101,115,115,59,32,68,87,66,32,97,110,100,32,49,48,116,104,32,69,100,46,32,100,111,32,110,111,116,10,0,0,0,0,0,0,0,0,47,112,117,98,117,103,110,54,47,49,0,0,0,
-0,0,0,47,112,117,98,117,103,110,53,47,53,0,0,0,0,0,0,60,47,97,62,10,0,0,0,47,112,117,98,117,103,110,53,47,52,0,0,0,0,0,0,47,112,117,98,117,103,110,53,47,51,0,0,0,0,0,0,125,32,100,101,102,0,0,0,79,116,105,108,100,101,0,0,116,114,97,110,115,112,97,114,101,110,116,0,0,0,0,0,47,112,117,98,117,103,110,53,47,50,0,0,0,0,0,0,108,105,103,104,116,115,101,97,103,114,101,101,110,0,0,0,105,109,97,103,101,115,99,97,108,101,0,0,0,0,0,0,82,85,69,0,0,0,0,0,37,115,45,37,115,0,0,0,47,112,117,98,117,103,110,53,47,49,
-0,0,0,0,0,0,47,112,117,98,117,103,110,52,47,52,0,0,0,0,0,0,47,112,117,98,117,103,110,52,47,51,0,0,0,0,0,0,47,98,114,98,103,49,48,47,50,0,0,0,0,0,0,0,34,32,119,105,100,116,104,61,34,37,103,112,120,34,32,104,101,105,103,104,116,61,34,37,103,112,120,34,32,112,114,101,115,101,114,118,101,65,115,112,101,99,116,82,97,116,105,111,61,34,120,77,105,100,89,77,105,100,32,109,101,101,116,34,32,120,61,34,37,103,34,32,121,61,34,37,103,34,0,0,47,112,117,98,117,103,110,52,47,50,0,0,0,0,0,0,106,112,101,103,58,102,
-105,103,0,0,0,0,0,0,0,0,47,112,117,98,117,103,110,52,47,49,0,0,0,0,0,0,98,111,120,114,97,100,32,61,32,48,32,37,115,32,110,111,32,114,111,117,110,100,101,100,32,99,111,114,110,101,114,115,32,105,110,32,103,114,97,112,104,118,105,122,10,0,0,0,47,112,117,98,117,103,110,51,47,51,0,0,0,0,0,0,47,112,117,98,117,103,110,51,47,50,0,0,0,0,0,0,60,47,118,58,114,101,99,116,62,10,0,0,0,0,0,0,47,112,117,98,117,103,110,51,47,49,0,0,0,0,0,0,47,112,117,98,117,57,47,57,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,99,117,
-114,114,101,110,116,100,105,99,116,32,101,110,100,32,100,101,102,105,110,101,102,111,110,116,0,0,0,0,0,0,79,115,108,97,115,104,0,0,98,108,97,99,107,0,0,0,47,112,117,98,117,57,47,56,0,0,0,0,0,0,0,0,102,105,120,101,100,115,105,122,101,0,0,0,0,0,0,0,108,105,103,104,116,115,97,108,109,111,110,0,0,0,0,0,71,82,65,68,73,69,78,84,65,78,71,76,69,0,0,0,48,0,0,0,0,0,0,0,47,112,117,98,117,57,47,55,0,0,0,0,0,0,0,0,47,112,117,98,117,57,47,54,0,0,0,0,0,0,0,0,98,117,102,102,101,114,32,101,114,114,111,114,0,0,0,0,
-47,112,117,98,117,57,47,53,0,0,0,0,0,0,0,0,47,98,114,98,103,49,48,47,49,48,0,0,0,0,0,0,60,105,109,97,103,101,32,120,108,105,110,107,58,104,114,101,102,61,34,0,0,0,0,0,47,112,117,98,117,57,47,52,0,0,0,0,0,0,0,0,47,112,117,98,117,57,47,51,0,0,0,0,0,0,0,0,37,115,32,71,78,85,32,112,105,99,32,115,117,112,112,111,114,116,115,32,97,32,98,111,120,114,97,100,32,118,97,114,105,97,98,108,101,32,116,111,32,100,114,97,119,32,98,111,120,101,115,32,119,105,116,104,32,114,111,117,110,100,101,100,32,99,111,114,110,
-101,114,115,59,32,68,87,66,32,97,110,100,32,49,48,116,104,32,69,100,46,32,100,111,32,110,111,116,10,0,0,0,0,0,0,47,112,117,98,117,57,47,50,0,0,0,0,0,0,0,0,47,112,117,98,117,57,47,49,0,0,0,0,0,0,0,0,110,111,110,101,0,0,0,0,60,47,99,101,110,116,101,114,62,60,47,118,58,116,101,120,116,98,111,120,62,10,0,0,47,112,117,98,117,56,47,56,0,0,0,0,0,0,0,0,47,112,117,98,117,56,47,55,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,47,69,110,99,111,100,105,110,103,32,69,110,99,111,100,105,110,103,86,101,99,116,111,114,
-32,100,101,102,0,0,0,0,79,109,105,99,114,111,110,0,35,102,56,102,56,102,56,0,47,112,117,98,117,56,47,54,0,0,0,0,0,0,0,0,100,105,115,116,111,114,116,105,111,110,0,0,0,0,0,0,108,105,103,104,116,112,105,110,107,0,0,0,0,0,0,0,72,69,73,71,72,84,0,0,116,97,105,108,108,97,98,101,108,0,0,0,0,0,0,0,47,112,117,98,117,56,47,53,0,0,0,0,0,0,0,0,69,68,95,116,111,95,118,105,114,116,40,101,41,32,61,61,32,78,85,76,76,0,0,0,47,112,117,98,117,56,47,52,0,0,0,0,0,0,0,0,47,112,117,98,117,56,47,51,0,0,0,0,0,0,0,0,47,98,
-114,98,103,49,48,47,49,0,0,0,0,0,0,0,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,47,112,117,98,117,56,47,50,0,0,0,0,0,0,0,0,47,112,117,98,117,56,47,49,0,0,0,0,0,0,0,0,47,112,117,98,117,55,47,55,0,0,0,0,0,0,0,0,97,114,114,111,119,104,101,97,100,32,61,32,55,32,37,115,32,110,111,116,32,117,115,101,100,32,98,121,32,103,114,97,112,104,118,105,122,10,0,0,47,112,117,98,117,55,47,54,0,0,0,0,0,0,0,0,34,62,60,99,101,110,116,101,114,62,0,0,0,0,0,0,
-47,112,117,98,117,55,47,53,0,0,0,0,0,0,0,0,47,112,117,98,117,55,47,52,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,125,32,102,111,114,97,108,108,0,0,0,0,0,0,0,0,79,109,101,103,97,0,0,0,35,49,48,49,48,49,48,0,32,37,100,0,0,0,0,0,47,112,117,98,117,55,47,51,0,0,0,0,0,0,0,0,115,107,101,119,0,0,0,0,108,105,103,104,116,103,114,101,121,0,0,0,0,0,0,0,82,79,87,83,80,65,78,32,118,97,108,117,101,32,99,97,110,110,111,116,32,98,101,32,48,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,104,101,97,100,108,97,98,101,
-108,0,0,0,0,0,0,0,47,112,117,98,117,55,47,50,0,0,0,0,0,0,0,0,114,101,99,116,46,98,111,117,110,100,97,114,121,91,51,93,32,60,32,73,78,84,95,77,65,88,0,0,0,0,0,0,47,112,117,98,117,55,47,49,0,0,0,0,0,0,0,0,47,112,117,98,117,54,47,54,0,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,57,0,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,32,37,100,32,37,115,10,0,0,0,0,0,0,0,47,112,
-117,98,117,54,47,53,0,0,0,0,0,0,0,0,100,101,108,116,97,32,60,61,32,48,120,70,70,70,70,0,47,112,117,98,117,54,47,52,0,0,0,0,0,0,0,0,47,112,117,98,117,54,47,51,0,0,0,0,0,0,0,0,37,115,32,97,114,114,111,119,104,101,97,100,32,105,115,32,117,110,100,101,102,105,110,101,100,32,105,110,32,68,87,66,32,50,44,32,105,110,105,116,105,97,108,108,121,32,49,32,105,110,32,103,112,105,99,44,32,50,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,10,0,0,0,0,0,47,112,117,98,117,54,47,50,0,0,0,0,0,0,0,0,99,111,
-108,111,114,58,35,37,48,50,120,37,48,50,120,37,48,50,120,59,0,0,0,0,114,101,100,0,0,0,0,0,47,112,117,98,117,54,47,49,0,0,0,0,0,0,0,0,47,112,117,98,117,53,47,53,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,123,32,49,32,105,110,100,101,120,32,47,70,73,68,32,110,101,32,123,32,100,101,102,32,125,123,32,112,111,112,32,112,111,112,32,125,32,105,102,101,108,115,101,0,0,0,0,0,79,103,114,97,118,101,0,0,35,102,48,102,48,102,48,0,47,112,117,98,117,53,47,52,0,0,0,0,0,0,0,0,112,101,114,105,112,104,101,114,105,101,
-115,0,0,0,0,0,108,105,103,104,116,103,114,101,101,110,0,0,0,0,0,0,82,79,87,83,80,65,78,0,108,97,98,101,108,0,0,0,47,112,117,98,117,53,47,51,0,0,0,0,0,0,0,0,47,112,117,98,117,53,47,50,0,0,0,0,0,0,0,0,47,112,117,98,117,53,47,49,0,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,56,0,0,0,0,0,0,0,125,10,0,0,0,0,0,0,47,112,117,98,117,52,47,52,0,0,0,0,0,0,0,0,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,48,93,32,43,32,114,116,112,45,62,115,112,
-108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,49,93,32,61,61,32,78,79,68,69,67,65,82,68,32,43,32,49,0,0,0,69,114,114,111,114,32,100,117,114,105,110,103,32,99,111,110,118,101,114,115,105,111,110,32,116,111,32,34,85,84,70,45,56,34,46,32,32,81,117,105,116,105,110,103,46,10,0,0,47,112,117,98,117,52,47,51,0,0,0,0,0,0,0,0,49,48,48,48,48,0,0,0,47,112,117,98,117,52,47,50,0,0,0,0,0,0,0,0,37,115,32,97,114,114,111,119,104,101,97,100,32,104,97,115,32,110,111,32,109,101,
-97,110,105,110,103,32,105,110,32,68,87,66,32,50,44,32,97,114,114,111,119,104,101,97,100,32,61,32,55,32,109,97,107,101,115,32,102,105,108,108,101,100,32,97,114,114,111,119,104,101,97,100,115,32,105,110,32,103,112,105,99,32,97,110,100,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,10,0,0,0,0,0,0,0,0,68,111,119,110,0,0,0,0,47,112,117,98,117,52,47,49,0,0,0,0,0,0,0,0,99,111,108,111,114,58,37,115,59,0,0,0,0,0,0,0,47,112,117,98,117,51,47,51,0,0,0,0,0,0,0,0,32,45,100,97,115,104,32,50,0,0,0,0,0,
-0,0,0,47,112,117,98,117,51,47,50,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,100,117,112,32,100,117,112,32,102,105,110,100,102,111,110,116,32,100,117,112,32,108,101,110,103,116,104,32,100,105,99,116,32,98,101,103,105,110,0,0,79,99,105,114,99,0,0,0,35,101,48,101,48,101,48,0,47,112,117,98,117,51,47,49,0,0,0,0,0,0,0,0,115,105,100,101,115,0,0,0,108,105,103,104,116,103,114,97,121,0,0,0,0,0,0,0,68,65,83,72,69,68,0,0,102,97,108,115,101,0,0,0,47,112,114,103,110,57,47,57,0,0,0,0,0,0,0,0,47,112,114,103,110,57,
-47,56,0,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,55,0,0,0,0,0,0,0,47,112,114,103,110,57,47,55,0,0,0,0,0,0,0,0,110,101,101,100,32,100,105,99,116,105,111,110,97,114,121,0,32,32,125,10,0,0,0,0,47,112,114,103,110,57,47,54,0,0,0,0,0,0,0,0,91,94,91,58,97,108,110,117,109,58,93,95,93,0,0,0,110,111,112,49,0,0,0,0,47,112,114,103,110,57,47,53,0,0,0,0,0,0,0,0,47,112,114,103,110,57,47,52,0,0,0,0,0,0,0,0,88,32,101,108,115,101,32,90,10,9,100,101,102,105,110,101,32,115,101,116,102,105,108,108,118,97,108,32,89,32,
-102,105,108,108,118,97,108,32,61,32,89,59,10,9,100,101,102,105,110,101,32,98,111,108,100,32,89,32,89,59,10,9,100,101,102,105,110,101,32,102,105,108,108,101,100,32,89,32,102,105,108,108,32,89,59,10,90,10,0,0,0,0,0,0,0,0,47,112,114,103,110,57,47,51,0,0,0,0,0,0,0,0,32,102,111,110,116,45,115,105,122,101,58,32,37,46,50,102,112,116,59,0,0,0,0,0,112,108,97,105,110,58,100,111,116,0,0,0,0,0,0,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,100,113,46,112,110,108,115,0,0,0,47,112,114,103,110,57,47,50,0,
-0,0,0,0,0,0,0,47,112,114,103,110,57,47,49,0,0,0,0,0,0,0,0,102,97,108,115,101,0,0,0,47,115,116,97,114,110,101,116,73,83,79,32,123,0,0,0,79,97,99,117,116,101,0,0,100,121,110,97,109,105,99,32,108,111,97,100,105,110,103,32,110,111,116,32,97,118,97,105,108,97,98,108,101,10,0,0,35,101,56,101,56,101,56,0,97,114,105,97,108,0,0,0,47,112,114,103,110,56,47,56,0,0,0,0,0,0,0,0,112,101,110,119,105,100,116,104,0,0,0,0,0,0,0,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,121,101,108,108,111,119,0,0,0,
-0,68,79,84,84,69,68,0,0,105,110,118,105,115,0,0,0,47,112,114,103,110,56,47,55,0,0,0,0,0,0,0,0,101,0,0,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,80,114,111,117,116,101,115,112,108,105,110,101,32,102,97,105,108,101,100,10,0,0,0,66,69,71,73,78,0,0,0,111,98,106,101,99,116,115,10,0,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,54,0,0,0,0,0,0,0,47,112,114,103,110,56,47,54,0,0,0,0,0,0,0,0,116,97,105,108,112,111,114,116,0,
-0,0,0,0,0,0,0,97,100,100,95,116,114,101,101,95,101,100,103,101,58,32,101,109,112,116,121,32,111,117,116,101,100,103,101,32,108,105,115,116,10,0,0,0,0,0,0,38,97,109,112,59,0,0,0,83,101,116,116,105,110,103,32,117,112,32,115,112,114,105,110,103,32,109,111,100,101,108,58,32,0,0,0,0,0,0,0,47,112,114,103,110,56,47,53,0,0,0,0,0,0,0,0,104,101,97,100,112,111,114,116,0,0,0,0,0,0,0,0,47,112,114,103,110,56,47,52,0,0,0,0,0,0,0,0,32,32,32,32,116,101,120,116,117,114,101,32,73,109,97,103,101,84,101,120,116,117,114,
-101,32,123,32,117,114,108,32,34,37,115,34,32,125,10,0,0,99,108,117,115,116,101,114,0,47,97,99,99,101,110,116,52,47,51,0,0,0,0,0,0,83,101,116,116,105,110,103,32,105,110,105,116,105,97,108,32,112,111,115,105,116,105,111,110,115,0,0,0,0,0,0,0,99,108,117,115,116,101,114,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,112,114,103,110,56,47,51,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,84,82,0,0,0,0,0,0,47,112,114,103,110,56,47,50,0,0,0,0,0,0,0,0,9,37,115,9,115,111,114,114,121,44,32,116,104,101,32,103,
-114,111,102,102,32,102,111,108,107,115,32,99,104,97,110,103,101,100,32,103,112,105,99,59,32,115,101,110,100,32,97,110,121,32,99,111,109,112,108,97,105,110,116,32,116,111,32,116,104,101,109,59,10,0,0,0,85,110,104,97,110,100,108,101,100,32,97,100,106,117,115,116,32,111,112,116,105,111,110,32,37,115,10,0,0,0,0,0,47,112,114,103,110,56,47,49,0,0,0,0,0,0,0,0,98,101,122,45,62,101,102,108,97,103,0,0,0,0,0,0,102,111,110,116,45,115,116,121,108,101,58,32,37,115,59,0,103,114,97,112,104,0,0,0,47,112,114,103,110,
-55,47,55,0,0,0,0,0,0,0,0,47,112,114,103,110,55,47,54,0,0,0,0,0,0,0,0,37,32,83,101,116,32,117,112,32,73,83,79,32,76,97,116,105,110,32,49,32,99,104,97,114,97,99,116,101,114,32,101,110,99,111,100,105,110,103,0,79,69,108,105,103,0,0,0,115,111,109,101,32,110,111,100,101,115,32,119,105,116,104,32,109,97,114,103,105,110,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,116,111,117,99,104,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,
-100,103,101,115,10,0,0,0,0,0,0,0,35,51,48,51,48,51,48,0,47,112,114,103,110,55,47,53,0,0,0,0,0,0,0,0,120,108,97,98,101,108,0,0,108,105,103,104,116,99,121,97,110,0,0,0,0,0,0,0,73,78,86,73,83,0,0,0,45,45,0,0,0,0,0,0,97,122,117,114,101,0,0,0,47,112,114,103,110,55,47,52,0,0,0,0,0,0,0,0,47,112,114,103,110,55,47,51,0,0,0,0,0,0,0,0,47,112,114,103,110,55,47,50,0,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,53,0,0,0,0,0,0,0,32,32,32,32,125,10,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,112,114,
-103,110,55,47,49,0,0,0,0,0,0,0,0,93,0,0,0,0,0,0,0,47,112,114,103,110,54,47,54,0,0,0,0,0,0,0,0,47,112,114,103,110,54,47,53,0,0,0,0,0,0,0,0,9,37,115,9,105,110,115,116,97,108,108,32,97,32,109,111,114,101,32,114,101,99,101,110,116,32,118,101,114,115,105,111,110,32,111,102,32,103,112,105,99,32,111,114,32,115,119,105,116,99,104,32,116,111,32,68,87,66,32,111,114,32,49,48,116,104,32,69,100,105,116,105,111,110,32,112],"i8",L,l.J+81956);D([105,99,59,10,0,0,0,0,0,0,0,0,76,97,121,111,117,116,32,119,97,115,32,
-110,111,116,32,100,111,110,101,10,0,0,0,0,110,45,62,98,114,97,110,99,104,91,105,93,46,99,104,105,108,100,0,0,0,0,0,0,127,114,111,111,116,0,0,0,47,112,114,103,110,54,47,52,0,0,0,0,0,0,0,0,102,111,110,116,45,115,116,114,101,116,99,104,58,32,37,115,59,0,0,0,0,0,0,0,47,112,114,103,110,54,47,51,0,0,0,0,0,0,0,0,69,100,103,101,32,108,101,110,103,116,104,32,37,102,32,108,97,114,103,101,114,32,116,104,97,110,32,109,97,120,105,109,117,109,32,37,117,32,97,108,108,111,119,101,100,46,10,67,104,101,99,107,32,102,
-111,114,32,111,118,101,114,119,105,100,101,32,110,111,100,101,40,115,41,46,10,0,0,0,0,0,99,97,110,110,111,116,32,99,111,109,112,105,108,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,37,115,0,0,0,0,47,112,114,103,110,54,47,50,0,0,0,0,0,0,0,0,32,93,32,32,37,100,32,102,97,108,115,101,32,37,115,10,0,0,0,0,0,0,0,0,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,52,53,32,47,104,121,112,104,101,110,32,112,117,116,0,0,0,78,117,0,0,0,0,0,0,35,102,99,102,99,102,99,0,
-32,105,110,32,108,105,110,101,32,37,100,32,110,101,97,114,32,39,0,0,0,0,0,0,47,112,114,103,110,54,47,49,0,0,0,0,0,0,0,0,102,111,110,116,99,111,108,111,114,0,0,0,0,0,0,0,108,105,103,104,116,99,111,114,97,108,0,0,0,0,0,0,73,78,86,73,83,73,66,76,69,0,0,0,0,0,0,0,45,62,0,0,0,0,0,0,47,112,114,103,110,53,47,53,0,0,0,0,0,0,0,0,115,101,116,108,105,110,101,119,105,100,116,104,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,47,112,114,103,110,53,47,52,0,0,0,0,0,0,0,0,115,117,114,112,114,105,115,
-101,10,0,0,0,0,0,0,0,47,112,114,103,110,53,47,51,0,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,52,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,100,105,102,102,117,115,101,67,111,108,111,114,32,49,32,49,32,49,10,0,0,0,0,0,47,112,114,103,110,53,47,50,0,0,0,0,0,0,0,0,47,112,114,103,110,53,47,49,0,0,0,0,0,0,0,0,47,112,114,103,110,52,47,52,0,0,0,0,0,0,0,0,9,37,115,32,105,102,32,121,111,117,32,117,115,101,32,103,112,105,99,32,97,110,100,32,105,116,32,98,97,114,102,115,32,111,110,32,101,110,99,111,117,110,116,101,
-114,105,110,103,32,34,115,111,108,105,100,34,44,10,0,0,0,0,0,0,47,112,114,103,110,52,47,51,0,0,0,0,0,0,0,0,102,111,110,116,45,119,101,105,103,104,116,58,32,37,115,59,0,0,0,0,0,0,0,0,47,112,114,103,110,52,47,50,0,0,0,0,0,0,0,0,47,112,114,103,110,52,47,49,0,0,0,0,0,0,0,0,73,83,79,76,97,116,105,110,49,69,110,99,111,100,105,110,103,32,48,32,50,53,53,32,103,101,116,105,110,116,101,114,118,97,108,32,112,117,116,105,110,116,101,114,118,97,108,0,78,116,105,108,100,101,0,0,35,56,48,56,48,56,48,0,47,112,114,
-103,110,51,47,51,0,0,0,0,0,0,0,0,102,111,110,116,110,97,109,101,0,0,0,0,0,0,0,0,108,105,103,104,116,98,108,117,101,0,0,0,0,0,0,0,83,79,76,73,68,0,0,0,98,122,46,115,105,122,101,32,37,32,51,32,61,61,32,49,0,0,0,0,0,0,0,0,47,112,114,103,110,51,47,50,0,0,0,0,0,0,0,0,47,112,114,103,110,51,47,49,0,0,0,0,0,0,0,0,47,112,114,103,110,49,49,47,57,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,51,0,0,0,0,0,0,0,112,97,114,116,105,97,108,32,99,104,97,114,97,99,116,101,114,0,0,0,0,0,0,0,32,32,32,32,32,32,97,109,98,105,
-101,110,116,73,110,116,101,110,115,105,116,121,32,48,46,51,51,10,0,0,0,0,47,112,114,103,110,49,49,47,56,0,0,0,0,0,0,0,47,112,114,103,110,49,49,47,55,0,0,0,0,0,0,0,47,112,114,103,110,49,49,47,54,0,0,0,0,0,0,0,105,102,32,102,105,108,108,118,97,108,32,62,32,48,46,52,32,116,104,101,110,32,88,10,9,100,101,102,105,110,101,32,115,101,116,102,105,108,108,118,97,108,32,89,32,102,105,108,108,118,97,108,32,61,32,49,32,45,32,89,59,10,9,100,101,102,105,110,101,32,98,111,108,100,32,89,32,116,104,105,99,107,110,
-101,115,115,32,50,32,89,59,10,0,0,0,0,47,112,114,103,110,49,49,47,53,0,0,0,0,0,0,0,102,111,110,116,45,102,97,109,105,108,121,58,32,39,37,115,39,59,0,0,0,0,0,0,47,112,114,103,110,49,49,47,52,0,0,0,0,0,0,0,99,109,97,112,120,95,110,112,58,109,97,112,0,0,0,0,47,112,114,103,110,49,49,47,51,0,0,0,0,0,0,0,32,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,48,0,0,0,0,0,0,0,77,117,0,0,0,0,0,0,115,116,97,114,0,0,0,0,47,112,114,103,110,49,49,47,50,0,0,0,0,0,0,0,102,111,110,116,115,105,122,101,0,0,0,0,
-0,0,0,0,108,101,109,111,110,99,104,105,102,102,111,110,0,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,83,84,89,76,69,32,45,32,105,103,110,111,114,101,100,10,0,0,0,98,122,46,115,105,122,101,32,62,32,48,0,0,0,0,0,47,112,114,103,110,49,49,47,49,49,0,0,0,0,0,0,47,112,114,103,110,49,49,47,49,48,0,0,0,0,0,0,47,112,114,103,110,49,49,47,49,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,50,0,0,0,0,0,0,0,32,32,32,32,109,97,116,101,114,105,97,108,32,77,97,116,101,114,105,97,108,
-32,123,10,0,0,0,0,0,0,0,0,47,112,114,103,110,49,48,47,57,0,0,0,0,0,0,0,103,105,102,58,102,105,103,0,47,112,114,103,110,49,48,47,56,0,0,0,0,0,0,0,47,112,114,103,110,49,48,47,55,0,0,0,0,0,0,0,37,115,32,71,78,85,32,112,105,99,32,118,115,46,32,49,48,116,104,32,69,100,105,116,105,111,110,32,100,92,40,101,39,116,101,110,116,101,10,0,47,112,114,103,110,49,48,47,54,0,0,0,0,0,0,0,60,118,58,116,101,120,116,98,111,120,32,105,110,115,101,116,61,34,48,44,48,44,48,44,48,34,32,115,116,121,108,101,61,34,112,111,
-115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,118,45,116,101,120,116,45,119,114,97,112,112,105,110,103,58,39,102,97,108,115,101,39,59,112,97,100,100,105,110,103,58,39,48,39,59,0,0,0,0,0,0,0,47,112,114,103,110,49,48,47,53,0,0,0,0,0,0,0,47,112,114,103,110,49,48,47,52,0,0,0,0,0,0,0,47,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,50,53,54,32,97,114,114,97,121,32,100,101,102,0,0,0,76,97,109,98,100,97,0,0,77,114,101,99,111,114,100,0,47,112,114,103,110,49,48,47,51,0,0,0,0,0,0,
-0,115,116,121,108,101,0,0,0,108,97,119,110,103,114,101,101,110,0,0,0,0,0,0,0,65,68,73,65,76,0,0,0,115,112,108,45,62,115,105,122,101,32,62,32,48,0,0,0,47,112,114,103,110,49,48,47,50,0,0,0,0,0,0,0,47,112,114,103,110,49,48,47,49,48,0,0,0,0,0,0,47,112,114,103,110,49,48,47,49,0,0,0,0,0,0,0,105,110,115,117,102,102,105,99,105,101,110,116,32,109,101,109,111,114,121,0,0,0,0,0,47,98,108,117,101,115,57,47,49,0,0,0,0,0,0,0,32,32,97,112,112,101,97,114,97,110,99,101,32,65,112,112,101,97,114,97,110,99,101,32,123,
-10,0,0,0,0,0,0,47,112,105,121,103,57,47,57,0,0,0,0,0,0,0,0,47,112,105,121,103,57,47,56,0,0,0,0,0,0,0,0,47,112,105,121,103,57,47,55,0,0,0,0,0,0,0,0,114,101,115,101,116,32,37,115,32,115,101,116,32,116,111,32,107,110,111,119,110,32,115,116,97,116,101,10,0,0,0,0,47,112,105,121,103,57,47,54,0,0,0,0,0,0,0,0,32,115,116,114,111,107,101,100,61,34,102,97,108,115,101,34,32,102,105,108,108,101,100,61,34,102,97,108,115,101,34,62,10,0,0,0,0,0,0,0,47,112,105,121,103,57,47,53,0,0,0,0,0,0,0,0,100,111,116,0,0,0,0,
-0,47,112,105,121,103,57,47,52,0,0,0,0,0,0,0,0,109,97,114,107,0,0,0,0,75,97,112,112,97,0,0,0,114,101,99,111,114,100,0,0,47,112,105,121,103,57,47,51,0,0,0,0,0,0,0,0,102,105,108,108,99,111,108,111,114,0,0,0,0,0,0,0,108,97,118,101,110,100,101,114,98,108,117,115,104,0,0,0,79,85,78,68,69,68,0,0,115,101,116,108,105,110,101,119,105,100,116,104,0,49,0,0,47,112,105,121,103,57,47,50,0,0,0,0,0,0,0,0,47,112,105,121,103,57,47,49,0,0,0,0,0,0,0,0,109,101,114,103,101,95,111,110,101,119,97,121,32,103,108,105,116,99,
-104,10,0,0,0,0,47,112,105,121,103,56,47,56,0,0,0,0,0,0,0,0,47,98,108,117,101,115,56,47,56,0,0,0,0,0,0,0,83,104,97,112,101,32,123,10,0,0,0,0,0,0,0,0,47,112,105,121,103,56,47,55,0,0,0,0,0,0,0,0,47,112,105,121,103,56,47,54,0,0,0,0,0,0,0,0,47,112,105,121,103,56,47,53,0,0,0,0,0,0,0,0,105,102,32,98,111,120,114,97,100,32,62,32,49,46,48,32,38,38,32,100,97,115,104,119,105,100,32,60,32,48,46,48,55,53,32,116,104,101,110,32,88,10,9,102,105,108,108,118,97,108,32,61,32,49,59,10,9,100,101,102,105,110,101,32,102,
-105,108,108,32,89,32,89,59,10,9,100,101,102,105,110,101,32,115,111,108,105,100,32,89,32,89,59,10,9,100,101,102,105,110,101,32,114,101,115,101,116,32,89,32,115,99,97,108,101,61,49,46,48,32,89,59,10,88,10,0,0,0,0,47,112,105,121,103,56,47,52,0,0,0,0,0,0,0,0,60,118,58,114,101,99,116,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,0,0,0,0,0,0,47,112,105,121,103,56,47,51,0,0,0,0,0,0,0,0,47,112,105,121,103,56,47,50,0,0,0,0,0,0,0,0,47,115,101,116,117,112,
-76,97,116,105,110,49,32,123,0,0,73,117,109,108,0,0,0,0,108,112,114,111,109,111,116,101,114,0,0,0,0,0,0,0,47,112,105,121,103,56,47,49,0,0,0,0,0,0,0,0,99,111,108,111,114,0,0,0,32,37,115,10,0,0,0,0,108,97,118,101,110,100,101,114,0,0,0,0,0,0,0,0,32,44,0,0,0,0,0,0,115,111,108,105,100,0,0,0,47,112,105,121,103,55,47,55,0,0,0,0,0,0,0,0,47,98,108,117,101,115,56,47,55,0,0,0,0,0,0,0,47,112,105,121,103,55,47,54,0,0,0,0,0,0,0,0,114,101,99,116,46,98,111,117,110,100,97,114,121,91,50,93,32,60,32,73,78,84,95,77,65,
-88,0,0,0,0,0,0,47,112,105,121,103,55,47,53,0,0,0,0,0,0,0,0,110,0,0,0,0,0,0,0,47,112,105,121,103,55,47,52,0,0,0,0,0,0,0,0,47,112,105,121,103,55,47,51,0,0,0,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,47,112,105,121,103,55,47,50,0,0,0,0,0,0,0,0,37,115,32,68,87,66,32,50,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,100,101,102,105,110,105,116,105,111,110,115,10,0,0,0,0,0,47,112,105,121,103,55,47,49,0,0,0,0,0,0,0,0,60,47,118,58,111,118,97,108,62,10,0,0,0,0,0,0,47,112,105,
-121,103,54,47,54,0,0,0,0,0,0,0,0,109,97,103,101,110,116,97,0,47,112,105,121,103,54,47,53,0,0,0,0,0,0,0,0,73,111,116,97,0,0,0,0,68,105,110,103,98,97,116,115,0,0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,114,97,114,114,111,119,0,0,47,112,105,121,103,54,47,52,0,0,0,0,0,0,0,0,115,104,97,112,101,0,0,0,107,104,97,107,105,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,86,65,76,73,71,78,32,45,32,105,103,110,111,114,101,100,10,0,0,84,105,109,101,115,
-45,82,111,109,97,110,0,0,0,0,0,47,112,105,121,103,54,47,51,0,0,0,0,0,0,0,0,47,112,105,121,103,54,47,50,0,0,0,0,0,0,0,0,47,112,105,121,103,54,47,49,0,0,0,0,0,0,0,0,47,98,108,117,101,115,56,47,54,0,0,0,0,0,0,0,111,98,106,0,0,0,0,0,47,112,105,121,103,53,47,53,0,0,0,0,0,0,0,0,47,112,105,121,103,53,47,52,0,0,0,0,0,0,0,0,38,35,51,57,59,0,0,0,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,112,97,114,116,105,116,105,111,110,91,105,93,32,61,61,32,48,32,124,124,32,
-114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,112,97,114,116,105,116,105,111,110,91,105,93,32,61,61,32,49,0,0,0,0,0,0,0,0,47,112,105,121,103,53,47,51,0,0,0,0,0,0,0,0,37,115,32,114,101,115,101,116,32,119,111,114,107,115,32,105,110,32,103,112,105,99,32,97,110,100,32,49,48,116,104,32,101,100,105,116,105,111,110,44,32,98,117,116,32,105,115,110,39,116,32,100,101,102,105,110,101,100,32,105,110,32,68,87,66,32,50,10,0,0,0,0,115,111,117,114,99,101,0,0,47,112,105,
-121,103,53,47,50,0,0,0,0,0,0,0,0,32,119,105,100,116,104,58,32,37,46,50,102,59,32,104,101,105,103,104,116,58,32,37,46,50,102,34,0,0,0,0,0,75,80,95,85,112,0,0,0,47,112,105,121,103,53,47,49,0,0,0,0,0,0,0,0,32,45,100,97,115,104,32,53,0,0,0,0,0,0,0,0,47,112,105,121,103,52,47,52,0,0,0,0,0,0,0,0,68,111,116,68,105,99,116,32,98,101,103,105,110,0,0,0,73,103,114,97,118,101,0,0,90,97,112,102,68,105,110,103,98,97,116,115,0,0,0,0,108,97,114,114,111,119,0,0,47,112,105,121,103,52,47,51,0,0,0,0,0,0,0,0,119,105,100,
-116,104,0,0,0,105,118,111,114,121,0,0,0,73,68,68,76,69,0,0,0,101,32,33,61,32,78,85,76,76,0,0,0,0,0,0,0,112,101,110,119,105,100,116,104,0,0,0,0,0,0,0,0,47,112,105,121,103,52,47,50,0,0,0,0,0,0,0,0,47,112,105,121,103,52,47,49,0,0,0,0,0,0,0,0,47,112,105,121,103,51,47,51,0,0,0,0,0,0,0,0,47,98,108,117,101,115,56,47,53,0,0,0,0,0,0,0,103,114,101,115,116,111,114,101,10,0,0,0,0,0,0,0,105,110,102,105,110,105,116,121,0,0,0,0,0,0,0,0,47,112,105,121,103,51,47,50,0,0,0,0,0,0,0,0,91,91,58,97,108,110,117,109,58,93,
-95,93,0,0,0,0,110,111,112,0,0,0,0,0,47,112,105,121,103,51,47,49,0,0,0,0,0,0,0,0,47,112,105,121,103,49,49,47,57,0,0,0,0,0,0,0,37,115,32,68,87,66,32,50,32,100,111,101,115,110,39,116,32,117,115,101,32,102,105,108,108,32,97,110,100,32,100,111,101,115,110,39,116,32,100,101,102,105,110,101,32,102,105,108,108,118,97,108,10,0,0,0,47,112,105,121,103,49,49,47,56,0,0,0,0,0,0,0,99,97,110,111,110,58,100,111,116,0,0,0,0,0,0,0,32,108,101,102,116,58,32,37,46,50,102,59,32,116,111,112,58,32,37,46,50,102,59,0,108,105,
-98,112,97,116,104,47,37,115,58,37,100,58,32,37,115,10,0,0,0,0,0,0,47,112,105,121,103,49,49,47,55,0,0,0,0,0,0,0,103,118,119,114,105,116,101,95,110,111,95,122,32,112,114,111,98,108,101,109,32,37,100,10,0,0,0,0,0,0,0,0,47,112,105,121,103,49,49,47,54,0,0,0,0,0,0,0,47,0,0,0,0,0,0,0,47,68,111,116,68,105,99,116,32,50,48,48,32,100,105,99,116,32,100,101,102,0,0,0,73,99,105,114,99,0,0,0,109,101,100,105,117,109,0,0,114,97,110,107,0,0,0,0,114,112,114,111,109,111,116,101,114,0,0,0,0,0,0,0,91,105,110,116,101,114,
-110,97,108,32,99,111,117,114,105,101,114,93,0,0,0,0,0,0,47,112,105,121,103,49,49,47,53,0,0,0,0,0,0,0,104,101,105,103,104,116,0,0,105,110,100,105,103,111,0,0,79,80,0,0,0,0,0,0,112,101,114,105,112,104,101,114,105,101,115,0,0,0,0,0,114,45,62,98,111,117,110,100,97,114,121,91,105,93,32,60,61,32,114,45,62,98,111,117,110,100,97,114,121,91,78,85,77,68,73,77,83,32,43,32,105,93,0,0,0,0,0,0,47,112,105,121,103,49,49,47,52,0,0,0,0,0,0,0,115,0,0,0,0,0,0,0,87,97,114,110,105,110,103,58,32,110,111,100,101,32,37,115,
-44,32,112,111,115,105,116,105,111,110,32,37,115,44,32,101,120,112,101,99,116,101,100,32,116,119,111,32,102,108,111,97,116,115,10,0,0,0,0,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,80,115,104,111,114,116,101,115,116,112,97,116,104,32,102,97,105,108,101,100,10,0,0,69,79,70,0,0,0,0,0,37,100,32,111,98,106,115,32,37,100,32,120,108,97,98,101,108,115,32,102,111,114,99,101,61,37,100,32,98,98,61,40,37,46,48,50,102,44,37,46,48,50,102,41,32,40,37,46,48,50,102,44,37,46,48,50,102,41,10,
-0,0,0,0,0,47,112,105,121,103,49,49,47,51,0,0,0,0,0,0,0,108,105,103,104,116,103,114,101,121,0,0,0,0,0,0,0,97,100,100,95,116,114,101,101,95,101,100,103,101,58,32,109,105,115,115,105,110,103,32,116,114,101,101,32,101,100,103,101,10,0,0,0,0,0,0,0,108,97,98,101,108,115,46,99,0,0,0,0,0,0,0,0,115,116,97,114,116,61,37,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,119,105,116,104,32,109,111,100,101,61,115,101,108,102,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,0,0,0,0,47,112,105,121,103,
-49,49,47,50,0,0,0,0,0,0,0,47,98,108,117,101,115,56,47,52,0,0,0,0,0,0,0,97,103,100,105,99,116,111,102,58,32,117,110,107,110,111,119,110,32,107,105,110,100,32,37,100,10,0,0,0,0,0,0,117,115,101,114,95,115,104,97,112,101,95,37,100,10,0,0,37,102,0,0,0,0,0,0,47,112,105,121,103,49,49,47,49,49,0,0,0,0,0,0,58,32,37,46,50,102,32,115,101,99,10,0,0,0,0,0,47,112,105,121,103,49,49,47,49,48,0,0,0,0,0,0,71,114,97,112,104,32,37,115,32,104,97,115,32,97,114,114,97,121,32,112,97,99,107,105,110,103,32,119,105,116,104,
-32,117,115,101,114,32,118,97,108,117,101,115,32,98,117,116,32,110,111,32,34,115,111,114,116,118,34,32,97,116,116,114,105,98,117,116,101,115,32,97,114,101,32,100,101,102,105,110,101,100,46,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,99,111,108,103,0,0,0,0,119,101,105,103,104,116,0,0,47,97,99,99,101,110,116,52,47,50,0,0,0,0,0,0,47,112,105,121,103,49,49,47,49,0,0,0,0,0,0,0,84,65,66,76,69,0,0,0,37,115,32,102,105,108,108,32,104,97,115,32,110,111,32,109,101,97,110,105,110,103,32,105,
-110,32,68,87,66,32,50,44,32,103,112,105,99,32,99,97,110,32,117,115,101,32,102,105,108,108,32,111,114,32,102,105,108,108,101,100,44,32,49,48,116,104,32,69,100,105,116,105,111,110,32,117,115,101,115,32,102,105,108,108,32,111,110,108,121,10,0,0,0,0,0,0,65,100,106,117,115,116,105,110,103,32,37,115,32,117,115,105,110,103,32,37,115,10,0,0,47,112,105,121,103,49,48,47,57,0,0,0,0,0,0,0,99,111,109,112,111,117,110,100,46,99,0,0,0,0,0,0,32,32,60,118,58,111,118,97,108,32,115,116,121,108,101,61,34,112,111,115,
-105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,0,0,0,0,0,105,100,0,0,0,0,0,0,47,112,105,121,103,49,48,47,56,0,0,0,0,0,0,0,47,112,105,121,103,49,48,47,55,0,0,0,0,0,0,0,37,37,66,101,103,105,110,80,114,111,108,111,103,0,0,0,73,97,99,117,116,101,0,0,85,82,87,32,67,104,97,110,99,101,114,121,32,76,0,0,116,104,101,32,98,111,117,110,100,105,110,103,32,98,111,120,101,115,32,111,102,32,115,111,109,101,32,110,111,100,101,115,32,116,111,117,99,104,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,
-32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,0,0,0,115,105,103,110,97,116,117,114,101,0,0,0,0,0,0,0,47,112,105,121,103,49,48,47,54,0,0,0,0,0,0,0,109,97,114,103,105,110,0,0,105,110,100,105,97,110,114,101,100,0,0,0,0,0,0,0,79,84,84,79,77,0,0,0,112,97,103,101,100,105,114,0,97,113,117,97,109,97,114,105,110,101,0,0,0,0,0,0,47,112,105,121,103,49,48,47,53,0,0,0,0,0,0,0,47,112,105,121,103,49,48,47,52,0,0,0,0,0,0,0,47,112,105,121,103,49,48,47,51,0,0,0,0,0,0,0,47,
-98,108,117,101,115,56,47,51,0,0,0,0,0,0,0,103,115,97,118,101,32,37,103,32,37,103,32,116,114,97,110,115,108,97,116,101,32,110,101,119,112,97,116,104,10,0,0,112,105,99,0,0,0,0,0,47,112,105,121,103,49,48,47,50,0,0,0,0,0,0,0,101,110,100,32,37,115,10,0,32,91,107,101,121,61,0,0,98,98,0,0,0,0,0,0,47,112,105,121,103,49,48,47,49,48,0,0,0,0,0,0,116,97,105,108,112,111,114,116,0,0,0,0,0,0,0,0,47,112,105,121,103,49,48,47,49,0,0,0,0,0,0,0,37,115,32,102,105,108,108,118,97,108,32,105,115,32,48,46,51,32,105,110,32,
-49,48,116,104,32,69,100,105,116,105,111,110,32,40,102,105,108,108,32,48,32,109,101,97,110,115,32,98,108,97,99,107,41,44,32,48,46,53,32,105,110,32,103,112,105,99,32,40,102,105,108,108,32,48,32,109,101,97,110,115,32,119,104,105,116,101,41,44,32,117,110,100,101,102,105,110,101,100,32,105,110,32,68,87,66,32,50,10,0,0,0,115,101,97,114,99,104,115,105,122,101,0,0,0,0,0,0,47,112,97,115,116,101,108,50,56,47,56,0,0,0,0,0,120,32,101,32,34,47,62,0,110,32,38,38,32,105,32,62,61,32,48,32,38,38,32,105,32,60,32,78,
-79,68,69,67,65,82,68,0,0,0,0,0,47,112,97,115,116,101,108,50,56,47,55,0,0,0,0,0,99,111,110,116,97,105,110,95,110,111,100,101,115,32,99,108,117,115,116,32,37,115,32,114,97,110,107,32,37,100,32,109,105,115,115,105,110,103,32,110,111,100,101,10,0,0,0,0,47,77,101,100,105,97,66,111,120,0,0,0,0,0,0,0,47,112,97,115,116,101,108,50,56,47,54,0,0,0,0,0,32,93,32,32,37,100,32,116,114,117,101,32,37,115,10,0,91,32,123,67,97,116,97,108,111,103,125,32,60,60,32,47,85,82,73,32,60,60,32,47,66,97,115,101,32,40,37,115,
-41,32,62,62,32,62,62,10,47,80,85,84,32,112,100,102,109,97,114,107,10,0,0,0,71,97,109,109,97,0,0,0,90,97,112,102,67,104,97,110,99,101,114,121,45,77,101,100,105,117,109,73,116,97,108,105,99,0,0,0,0,0,0,0,97,115,115,101,109,98,108,121,0,0,0,0,0,0,0,0,58,32,0,0,0,0,0,0,47,112,97,115,116,101,108,50,56,47,53,0,0,0,0,0,103,114,97,100,105,101,110,116,97,110,103,108,101,0,0,0,104,111,116,112,105,110,107,0,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,0,87,73,68,84,72,0,0,0,66,76,0,0,0,0,0,0,99,97,110,
-110,111,116,32,114,101,97,108,108,111,99,32,111,112,115,0,0,0,0,0,0,47,112,97,115,116,101,108,50,56,47,52,0,0,0,0,0,98,111,108,100,0,0,0,0,47,112,97,115,116,101,108,50,56,47,51,0,0,0,0,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,37,100,58,32,71,68,95,114,97,110,107,40,103,41,91,37,100,93,46,118,32,43,32,78,68,95,111,114,100,101,114,40,37,115,41,32,91,37,100,93,32,62,32,71,68,95,114,97,110,107,40,103,41,91,37,100,93,46,97,118,32,43,32,71,68,95,114,97,110,107,
-40,82,111,111,116,41,91,37,100,93,46,97,110,32,91,37,100,93,10,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,112,97,115,116,101,108,50,56,47,50,0,0,0,0,0,47,98,108,117,101,115,56,47,50,0,0,0,0,0,0,0,93,32,32,37,100,32,102,97,108,115,101,32,37,115,10,0,47,112,97,115,116,101,108,50,56,47,49,0,0,0,0,0,47,112,97,115,116,101,108,50,55,47,55,0,0,0,0,0,47,112,97,115,116,101,108,50,55,47,54,0,0,0,0,0,37,115,32,100,97,115,104,119,105,100,32,105,115,32,48,46,49,32,105,110,32,49,48,116,104,32,69,
-100,105,116,105,111,110,44,32,48,46,48,53,32,105,110,32,68,87,66,32,50,32,97,110,100,32,105,110,32,103,112,105,99,10,0,0,0,47,112,97,115,116,101,108,50,55,47,53,0,0,0,0,0,108,32,0,0,0,0,0,0,47,112,97,115,116,101,108,50,55,47,52,0,0,0,0,0,47,112,97,115,116,101,108,50,55,47,51,0,0,0,0,0,115,101,116,117,112,76,97,116,105,110,49,10,0,0,0,0,69,117,109,108,0,0,0,0,84,105,109,101,115,45,82,111,109,97,110,0,0,0,0,0,110,111,118,101,114,104,97,110,103,0,0,0,0,0,0,0,109,101,109,111,114,121,32,97,108,108,111,
-99,97,116,105,111,110,32,102,97,105,108,117,114,101,0,0,0,0,0,0,0,47,112,97,115,116,101,108,50,55,47,50,0,0,0,0,0,111,114,100,101,114,105,110,103,0,0,0,0,0,0,0,0,37,108,102,44,37,108,102,0,119,105,100,116,104,0,0,0,104,111,110,101,121,100,101,119,0,0,0,0,0,0,0,0,112,97,100,0,0,0,0,0,47,112,97,115,116,101,108,50,55,47,49,0,0,0,0,0,47,112,97,115,116,101,108,50,54,47,54,0,0,0,0,0,47,112,97,115,116,101,108,50,54,47,53,0,0,0,0,0,47,98,108,117,101,115,56,47,49,0,0,0,0,0,0,0,117,110,99,108,111,115,101,100,
-32,116,111,107,101,110,0,0,93,32,32,37,100,32,116,114,117,101,32,37,115,10,0,0,47,112,97,115,116,101,108,50,54,47,52,0,0,0,0,0,47,112,97,115,116,101,108,50,54,47,51,0,0,0,0,0,47,112,97,115,116,101,108,50,54,47,50,0,0,0,0,0,37,115,32,98,111,120,114,97,100,32,105,115,32,110,111,119,32,48,46,48,32,105,110,32,103,112,105,99,44,32,101,108,115,101,32,105,116,32,114,101,109,97,105,110,115,32,50,46,48,10,0,0,0,0,0,0,47,112,97,115,116,101,108,50,54,47,49,0,0,0,0,0,37,46,48,102,32,37,46,48,102,32,0,0,0,0,0,
-0,47,112,97,115,116,101,108,50,53,47,53,0,0,0,0,0,47,112,97,115,116,101,108,50,53,47,52,0,0,0,0,0,37,37,69,110,100,67,111,109,109,101,110,116,115,10,115,97,118,101,10,0,0,0,0,0,69,116,97,0,0,0,0,0,84,105,109,101,115,45,73,116,97,108,105,99,0,0,0,0,105,109,97,112,95,110,112,58,109,97,112,0,0,0,0,0,116,104,114,101,101,112,111,118,101,114,104,97,110,103,0,0,47,112,97,115,116,101,108,50,53,47,51,0,0,0,0,0,114,101,115,111,108,117,116,105,111,110,0,0,0,0,0,0,115,99,97,108,101,32,61,32,40,37,102,44,37,102,
-41,10,0,0,0,0,0,0,0,0,116,97,105,108,95,108,112,0,118,97,108,105,103,110,0,0,103,114,101,121,0,0,0,0,37,108,102,44,37,108,102,0,47,112,97,115,116,101,108,50,53,47,50,0,0,0,0,0,47,112,97,115,116,101,108,50,53,47,49,0,0,0,0,0,47,112,97,115,116,101,108,50,52,47,52,0,0,0,0,0,47,98,108,117,101,115,55,47,55,0,0,0,0,0,0,0,37,103,32,37,103,32,0,0,47,112,97,115,116,101,108,50,52,47,51,0,0,0,0,0,112,110,103,58,102,105,103,0,47,112,97,115,116,101,108,50,52,47,50,0,0,0,0,0,47,112,97,115,116,101,108,50,52,47,
-49,0,0,0,0,0,115,99,97,108,101,61,49,46,48,32,37,115,32,114,101,113,117,105,114,101,100,32,102,111,114,32,99,111,109,112,97,114,105,115,111,110,115,10,0,0,47,112,97,115,116,101,108,50,51,47,51,0,0,0,0,0,32,102,105,108,108,101,100,61,34,102,97,108,115,101,34,32,0,0,0,0,0,0,0,0,47,112,97,115,116,101,108,50,51,47,50,0,0,0,0,0,47,112,97,115,116,101,108,50,51,47,49,0,0,0,0,0,9,0,0,0,0,0,0,0,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,69,112,
-115,105,108,111,110,0,84,105,109,101,115,45,66,111,108,100,73,116,97,108,105,99,0,0,0,0,0,0,0,0,102,105,118,101,112,111,118,101,114,104,97,110,103,0,0,0,47,112,97,115,116,101,108,49,57,47,57,0,0,0,0,0,100,112,105,0,0,0,0,0,104,101,97,100,95,108,112,0,116,111,111,108,116,105,112,0,103,114,101,101,110,121,101,108,108,111,119,0,0,0,0,0,109,97,114,103,105,110,0,0,47,112,97,115,116,101,108,49,57,47,56,0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,55,0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,54,0,0,0,
-0,0,47,98,108,117,101,115,55,47,54,0,0,0,0,0,0,0,91,32,0,0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,53,0,0,0,0,0,100,97,116,97,32,101,114,114,111,114,0,0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,52,0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,51,0,0,0,0,0,98,111,120,114,97,100,61,50,46,48,32,37,115,32,119,105,108,108,32,98,101,32,114,101,115,101,116,32,116,111,32,48,46,48,32,98,121,32,103,112,105,99,32,111,110,108,121,10,0,0,0,0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,50,0,0,0,0,0,34,32,0,
-0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,49,0,0,0,0,0,47,112,97,115,116,101,108,49,56,47,56,0,0,0,0,0,100,105,97,109,111,110,100,0,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,40,97,116,101,110,100,41,10,0,69,103,114,97,118,101,0,0,84,105,109,101,115,0,0,0,114,101,115,116,114,105,99,116,105,111,110,115,105,116,101,0,47,112,97,115,116,101,108,49,56,47,55,0,0,0,0,0,99,111,110,99,101,110,116,114,97,116,101,0,0,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,32,105,110,32,112,111,115,
-32,97,116,116,114,105,98,117,116,101,32,102,111,114,32,101,100,103,101,32,40,37,115,44,37,115,41,10,0,116,105,116,108,101,0,0,0,103,114,101,101,110,0,0,0,84,104,101,32,99,104,97,114,97,99,116,101,114,32,39,37,99,39,32,97,112,112,101,97,114,115,32,105,110,32,98,111,116,104,32,116,104,101,32,108,97,121,101,114,115,101,112,32,97,110,100,32,108,97,121,101,114,108,105,115,116,115,101,112,32,97,116,116,114,105,98,117,116,101,115,32,45,32,108,97,121,101,114,108,105,115,116,115,101,112,32,105,103,110,111,
-114,101,100,46,10,0,0,0,0,47,112,97,115,116,101,108,49,56,47,54,0,0,0,0,0,47,112,97,115,116,101,108,49,56,47,53,0,0,0,0,0,47,112,97,115,116,101,108,49,56,47,52,0,0,0,0,0,47,98,108,117,101,115,55,47,53,0,0,0,0,0,0,0,117,115,45,62,110,97,109,101,0,0,0,0,0,0,0,0,102,105,110,100,95,102,97,115,116,95,110,111,100,101,40,103,44,32,110,41,0,0,0,0,47,112,97,115,116,101,108,49,56,47,51,0,0,0,0,0,47,112,97,115,116,101,108,49,56,47,50,0,0,0,0,0,47,112,97,115,116,101,108,49,56,47,49,0,0,0,0,0,37,115,32,110,111,
-110,45,102,97,116,97,108,32,114,117,110,45,116,105,109,101,32,112,105,99,32,118,101,114,115,105,111,110,32,100,101,116,101,114,109,105,110,97,116,105,111,110,44,32,118,101,114,115,105,111,110,32,50,10,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,55,0,0,0,0,0,32,102,105,108,108,101,100,61,34,116,114,117,101,34,32,102,105,108,108,99,111,108,111,114,61,34,0,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,54,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,53,0,0,0,0,0,37,37,80,97,103,101,115,58,32,49,10,0,
-0,0,0,0,69,99,105,114,99,0,0,0,84,105,109,101,115,45,66,111,108,100,0,0,0,0,0,0,112,114,105,109,101,114,115,105,116,101,0,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,52,0,0,0,0,0,99,108,117,115,116,101,114,114,97,110,107,0,0,0,0,0,10,0,0,0,0,0,0,0,37,108,102,44,37,108,102,37,110,0,0,0,0,0,0,0,116,97,114,103,101,116,0,0,103,114,97,121,0,0,0,0,44,0,0,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,51,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,50,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,49,0,0,0,
-0,0,47,98,108,117,101,115,55,47,52,0,0,0,0,0,0,0,117,115,0,0,0,0,0,0,115,105,122,101,61,61,102,114,101,101,100,0,0,0,0,0,47,112,97,115,116,101,108,49,54,47,54,0,0,0,0,0,47,112,97,115,116,101,108,49,54,47,53,0,0,0,0,0,47,112,97,115,116,101,108,49,54,47,52,0,0,0,0,0,37,115,32,100,111,110,39,116,32,99,104,97,110,103,101,32,97,110,121,116,104,105,110,103,32,98,101,108,111,119,32,116,104,105,115,32,108,105,110,101,32,105,110,32,116,104,105,115,32,100,114,97,119,105,110,103,10,0,0,0,0,0,0,0,65,103,110,
-111,100,101,105,110,102,111,95,116,0,0,0,0,47,112,97,115,116,101,108,49,54,47,51,0,0,0,0,0,34,0,0,0,0,0,0,0,47,112,97,115,116,101,108,49,54,47,50,0,0,0,0,0,47,112,97,115,116,101,108,49,54,47,49,0,0,0,0,0,37,37,80,97,103,101,115,58,32,40,97,116,101,110,100,41,10,0,0,0,0,0,0,0,69,97,99,117,116,101,0,0,103,114,101,101,110,0,0,0,102,97,110,116,97,115,121,0,112,114,111,116,101,105,110,115,116,97,98,0,0,0,0,0,47,112,97,115,116,101,108,49,53,47,53,0,0,0,0,0,108,97,110,100,115,99,97,112,101,0,0,0,0,0,0,0,
-112,111,115,32,97,116,116,114,105,98,117,116,101,32,102,111,114,32,101,100,103,101,32,40,37,115,44,37,115,41,32,100,111,101,115,110,39,116,32,104,97,118,101,32,51,110,43,49,32,112,111,105,110,116,115,10,0,0,0,0,0,0,0,0,115,116,121,108,101,0,0,0,103,111,108,100,101,110,114,111,100,0,0,0,0,0,0,0,108,97,121,101,114,108,105,115,116,115,101,112,0,0,0,0,47,112,97,115,116,101,108,49,53,47,52,0,0,0,0,0,47,112,97,115,116,101,108,49,53,47,51,0,0,0,0,0,47,112,97,115,116,101,108,49,53,47,50,0,0,0,0,0,47,98,108,
-117,101,115,55,47,51,0,0,0,0,0,0,0,103,118,108,111,97,100,105,109,97,103,101,95,99,111,114,101,46,99,0,0,0,0,0,0,47,112,97,115,116,101,108,49,53,47,49,0,0,0,0,0,47,112,97,115,116,101,108,49,52,47,52,0,0,0,0,0,38,113,117,111,116,59,0,0,47,112,97,115,116,101,108,49,52,47,51,0,0,0,0,0,46,110,114,32,83,70,32,37,46,48,102,10,115,99,97,108,101,116,104,105,99,107,110,101,115,115,32,61,32,37,46,48,102,10,0,0,0,0,0,0,47,112,97,115,116,101,108,49,52,47,50,0,0,0,0,0,114,97,110,107,0,0,0,0,47,112,97,115,116,
-101,108,49,52,47,49,0,0,0,0,0,85,112,0,0,0,0,0,0,47,112,97,115,116,101,108,49,51,47,51,0,0,0,0,0,32,45,102,105,108,108,32,0,37,37,37,37,84,105,116,108,101,58,32,37,115,10,0,0,69,84,72,0,0,0,0,0,83,121,109,98,111,108,0,0,111,98,106,112,45,62,108,98,108,0,0,0,0,0,0,0,112,114,111,116,101,97,115,101,115,105,116,101,0,0,0,0,47,112,97,115,116,101,108,49,51,47,50,0,0,0,0,0,111,114,105,101,110,116,97,116,105,111,110,0,0,0,0,0,32,101,44,37,108,102,44,37,108,102,37,110,0,0,0,0,114,111,119,115,112,97,110,0,
-103,111,108,100,0,0,0,0,58,9,32,0,0,0,0,0,47,112,97,115,116,101,108,49,51,47,49,0,0,0,0,0,47,112,97,105,114,101,100,57,47,57,0,0,0,0,0,0,116,114,105,101,115,32,61,32,37,100,44,32,109,111,100,101,32,61,32,37,115,10,0,0,47,112,97,105,114,101,100,57,47,56,0,0,0,0,0,0,47,98,108,117,101,115,55,47,50,0,0,0,0,0,0,0,106,111,98,0,0,0,0,0,47,112,97,105,114,101,100,57,47,55,0,0,0,0,0,0,27,0,0,0,0,0,0,0,111,115,97,103,101,0,0,0,47,112,97,105,114,101,100,57,47,54,0,0,0,0,0,0,47,112,97,105,114,101,100,57,47,53,
-0,0,0,0,0,0,37,115,32,116,111,32,99,104,97,110,103,101,32,100,114,97,119,105,110,103,32,115,105,122,101,44,32,109,117,108,116,105,112,108,121,32,116,104,101,32,119,105,100,116,104,32,97,110,100,32,104,101,105,103,104,116,32,111,110,32,116,104,101,32,46,80,83,32,108,105,110,101,32,97,98,111,118,101,32,97,110,100,32,116,104,101,32,110,117,109,98,101,114,32,111,110,32,116,104,101,32,116,119,111,32,108,105,110,101,115,32,98,101,108,111,119,32,40,114,111,117,110,100,101,100,32,116,111,32,116,104,101,32,
-110,101,97,114,101,115,116,32,105,110,116,101,103,101,114,41,32,98,121,32,97,32,115,99,97,108,101,32,102,97,99,116,111,114,10,0,0,0,0,0,0,0,0,47,112,97,105,114,101,100,57,47,52,0,0,0,0,0,0,103,118,58,100,111,116,0,0,99,32,0,0,0,0,0,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,111,112,115,0,0,0,0,0,0,0,47,112,97,105,114,101,100,57,47,51,0,0,0,0,0,0,47,112,97,105,114,101,100,57,47,50,0,0,0,0,0,0,80,97,116,104,32,112,114,111,118,105,100,101,100,32,116,111,32,102,105,108,101,58,32,34,37,115,34,
-32,104,97,115,32,98,101,101,110,32,105,103,110,111,114,101,100,32,98,101,99,97,117,115,101,32,102,105,108,101,115,32,97,114,101,32,111,110,108,121,32,112,101,114,109,105,116,116,101,100,32,116,111,32,98,101,32,108,111,97,100,101,100,32,102,114,111,109,32,116,104,101,32,100,105,114,101,99,116,111,114,105,101,115,32,105,110,32,34,37,115,34,32,119,104,101,110,32,114,117,110,110,105,110,103,32,105,110,32,97,110,32,104,116,116,112,32,115,101,114,118,101,114,46,10,0,0,0,0,0,0,0,0,37,100,32,37,100,32,115,
-101,116,108,97,121,101,114,10,0,68,101,108,116,97,0,0,0,108,111,97,100,105,109,97,103,101,0,0,0,0,0,0,0,80,97,108,97,116,105,110,111,45,82,111,109,97,110,0,0,100,101,102,108,97,116,105,111,110,32,112,114,111,98,108,101,109,32,37,100,10,0,0,0,114,110,97,115,116,97,98,0,99,111,117,114,0,0,0,0,47,112,97,105,114,101,100,57,47,49,0,0,0,0,0,0,114,111,116,97,116,101,0,0,115,44,37,108,102,44,37,108,102,37,110,0,0,0,0,0,112,111,114,116,0,0,0,0,103,104,111,115,116,119,104,105,116,101,0,0,0,0,0,0,108,97,121,
-101,114,115,101,112,0,0,0,0,0,0,0,0,100,111,116,105,110,105,116,46,99,0,0,0,0,0,0,0,108,101,118,101,108,32,62,61,32,48,32,38,38,32,108,101,118,101,108,32,60,61,32,40,42,110,41,45,62,108,101,118,101,108,0,0,0,0,0,0,47,112,97,105,114,101,100,56,47,56,0,0,0,0,0,0,99,117,115,116,111,109,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,101,100,103,101,32,105,115,32,97,32,108,111,111,112,32,97,116,32,37,115,10,0,0,99,97,110,39,116,
-32,111,112,101,110,32,108,105,98,114,97,114,121,32,102,105,108,101,32,37,115,10,0,0,0,0,0,37,100,32,111,117,116,32,111,102,32,37,100,32,101,120,116,101,114,105,111,114,32,108,97,98,101,108,115,32,112,111,115,105,116,105,111,110,101,100,46,10,0,0,0,0,0,0,0,47,112,97,105,114,101,100,56,47,55,0,0,0,0,0,0,117,112,100,97,116,101,58,32,109,105,115,109,97,116,99,104,101,100,32,108,99,97,32,105,110,32,116,114,101,101,117,112,100,97,116,101,115,10,0,0,107,105,110,100,32,61,61,32,76,84,95,78,79,78,69,0,83,
-101,116,116,105,110,103,32,105,110,105,116,105,97,108,32,112,111,115,105],"i8",L,l.J+92196);D([116,105,111,110,115,10,0,0,0,0,0,0,47,112,97,105,114,101,100,56,47,54,0,0,0,0,0,0,47,98,108,117,101,115,55,47,49,0,0,0,0,0,0,0,97,103,97,112,112,108,121,58,32,117,110,107,110,111,119,110,32,111,98,106,101,99,116,32,116,121,112,101,32,37,100,10,0,0,0,0,0,0,0,0,32,47,62,10,0,0,0,0,97,115,112,101,99,116,0,0,47,112,97,105,114,101,100,56,47,53,0,0,0,0,0,0,67,97,108,99,117,108,97,116,105,110,103,32,115,104,111,
-114,116,101,115,116,32,112,97,116,104,115,0,0,0,0,0,0,115,111,114,116,118,0,0,0,37,102,32,45,32,37,102,32,37,102,32,37,102,32,37,102,32,61,32,37,102,32,40,37,102,32,37,102,32,37,102,32,37,102,41,10,0,0,0,0,114,111,119,103,0,0,0,0,109,101,109,111,114,121,32,101,120,104,97,117,115,116,101,100,0,0,0,0,0,0,0,0,47,112,97,105,114,101,100,56,47,52,0,0,0,0,0,0,114,97,110,107,115,101,112,0,47,112,97,105,114,101,100,56,47,51,0,0,0,0,0,0,85,110,99,108,111,115,101,100,32,99,111,109,109,101,110,116,10,0,0,0,0,
-0,0,0,47,97,99,99,101,110,116,52,47,49,0,0,0,0,0,0,46,80,83,32,37,46,53,102,32,37,46,53,102,10,0,0,114,111,111,116,32,61,32,37,115,10,0,0,0,0,0,0,47,112,97,105,114,101,100,56,47,50,0,0,0,0,0,0,98,101,122,45,62,115,102,108,97,103,0,0,0,0,0,0,37,115,37,46,48,102,44,37,46,48,102,32,0,0,0,0,101,109,105,116,46,99,0,0,47,112,97,105,114,101,100,56,47,49,0,0,0,0,0,0,47,112,97,105,114,101,100,55,47,55,0,0,0,0,0,0,91,32,47,67,114,111,112,66,111,120,32,91,37,100,32,37,100,32,37,100,32,37,100,93,32,47,80,65,
-71,69,83,32,112,100,102,109,97,114,107,10,0,0,0,0,0,0,0,0,68,97,103,103,101,114,0,0,100,101,118,105,99,101,0,0,80,97,108,97,116,105,110,111,45,73,116,97,108,105,99,0,114,105,98,111,115,105,116,101,0,0,0,0,0,0,0,0,82,79,85,78,68,40,71,68,95,98,98,40,103,41,46,76,76,46,121,41,32,61,61,32,48,0,0,0,0,0,0,0,47,112,97,105,114,101,100,55,47,54,0,0,0,0,0,0,99,101,110,116,101,114,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,105,100,0,0,0,0,0,0,103,97,105,110,115,98,111,114,111,0,0,0,0,0,0,0,97,
-108,108,0,0,0,0,0,97,113,117,97,0,0,0,0,47,112,97,105,114,101,100,55,47,53,0,0,0,0,0,0,47,112,97,105,114,101,100,55,47,52,0,0,0,0,0,0,47,112,97,105,114,101,100,55,47,51,0,0,0,0,0,0,47,98,108,117,101,115,54,47,54,0,0,0,0,0,0,0,60,118,58,105,109,97,103,101,32,115,114,99,61,34,37,115,34,32,115,116,121,108,101,61,34,32,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,119,105,100,116,104,58,37,46,50,102,59,32,104,101,105,103,104,116,58,37,46,50,102,59,32,108,101,102,116,58,37,46,
-50,102,32,59,32,116,111,112,58,37,46,50,102,34,0,0,0,0,0,47,112,97,105,114,101,100,55,47,50,0,0,0,0,0,0,59,10,0,0,0,0,0,0,108,112,0,0,0,0,0,0,47,112,97,105,114,101,100,55,47,49,0,0,0,0,0,0,108,97,121,111,117,116,32,37,115,10,0,0,0,0,0,0,47,112,97,105,114,101,100,54,47,54,0,0,0,0,0,0,114,111,116,97,116,105,111,110,0,0,0,0,0,0,0,0,108,101,118,101,108,32,103,114,97,112,104,32,114,101,99,0,47,112,97,105,114,101,100,54,47,53,0,0,0,0,0,0,109,32,0,0,0,0,0,0,47,112,97,105,114,101,100,54,47,52,0,0,0,0,0,0,
-110,101,119,0,0,0,0,0,110,101,120,116,35,105,116,101,114,61,37,100,10,0,0,0,47,112,97,105,114,101,100,54,47,51,0,0,0,0,0,0,34,37,115,34,32,119,97,115,32,110,111,116,32,102,111,117,110,100,32,97,115,32,97,32,102,105,108,101,32,111,114,32,97,115,32,97,32,115,104,97,112,101,32,108,105,98,114,97,114,121,32,109,101,109,98,101,114,10,0,0,0,0,0,0,32,0,0,0,0,0,0,0,99,97,110,118,97,115,32,115,105,122,101,32,40,37,100,44,37,100,41,32,101,120,99,101,101,100,115,32,80,68,70,32,108,105,109,105,116,32,40,37,100,
-41,10,9,40,115,117,103,103,101,115,116,32,115,101,116,116,105,110,103,32,97,32,98,111,117,110,100,105,110,103,32,98,111,120,32,115,105,122,101,44,32,115,101,101,32,100,111,116,40,49,41,41,10,0,0,67,104,105,0,0,0,0,0,116,101,120,116,108,97,121,111,117,116,0,0,0,0,0,0,80,97,108,97,116,105,110,111,45,66,111,108,100,73,116,97,108,105,99,0,0,0,0,0,105,110,115,117,108,97,116,111,114,0,0,0,0,0,0,0,47,112,97,105,114,101,100,54,47,50,0,0,0,0,0,0,112,97,103,101,0,0,0,0,104,114,101,102,0,0,0,0,99,111,109,112,
-114,101,115,115,32,37,103,32,10,0,0,0,102,117,99,104,115,105,97,0,84,104,101,32,108,97,121,101,114,115,101,108,101,99,116,32,97,116,116,114,105,98,117,116,101,32,34,37,115,34,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,97,110,121,32,108,97,121,101,114,32,115,112,101,99,105,102,101,100,32,98,121,32,116,104,101,32,108,97,121,101,114,115,32,97,116,116,114,105,98,117,116,101,32,45,32,105,103,110,111,114,101,100,46,10,0,0,0,0,112,105,110,0,0,0,0,0,47,112,97,105,114,101,100,54,47,49,0,0,0,
-0,0,0,105,110,118,105,115,105,98,108,101,0,0,0,0,0,0,0,99,108,117,115,116,101,114,0,47,112,97,105,114,101,100,53,47,53,0,0,0,0,0,0,37,108,102,44,37,108,102,37,99,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,37,100,58,32,114,97,110,107,32,37,100,32,110,111,116,32,105,110,32,114,97,110,107,32,114,97,110,103,101,32,91,37,100,44,37,100,93,10,0,0,0,0,47,112,97,105,114,101,100,53,47,52,0,0,0,0,0,0,47,98,108,117,101,115,54,47,53,0,0,0,0,
-0,0,0,36,99,32,99,114,101,97,116,101,32,105,109,97,103,101,32,37,46,50,102,32,37,46,50,102,32,45,105,109,97,103,101,32,34,112,104,111,116,111,95,37,115,34,10,0,0,0,0,47,112,97,105,114,101,100,53,47,51,0,0,0,0,0,0,47,112,97,105,114,101,100,53,47,50,0,0,0,0,0,0,47,112,97,105,114,101,100,53,47,49,0,0,0,0,0,0,93,10,46,80,69,10,0,0,47,112,97,105,114,101,100,52,47,52,0,0,0,0,0,0,47,62,60,47,118,58,115,104,97,112,101,62,10,0,0,0,47,112,97,105,114,101,100,52,47,51,0,0,0,0,0,0,47,112,97,105,114,101,100,52,
-47,50,0,0,0,0,0,0,37,103,32,37,103,32,115,101,116,95,115,99,97,108,101,32,37,100,32,114,111,116,97,116,101,32,37,103,32,37,103,32,116,114,97,110,115,108,97,116,101,10,0,0,0,0,0,0,67,99,101,100,105,108,0,0,108,97,121,111,117,116,0,0,80,97,108,97,116,105,110,111,32,76,105,110,111,116,121,112,101,0,0,0,0,0,0,0,117,116,114,0,0,0,0,0,47,112,97,105,114,101,100,52,47,49,0,0,0,0,0,0,115,105,122,101,0,0,0,0,104,101,105,103,104,116,0,0,99,111,110,106,117,103,97,116,101,95,103,114,97,100,105,101,110,116,58,
-32,117,110,101,120,112,101,99,116,101,100,32,108,101,110,103,116,104,32,48,32,118,101,99,116,111,114,10,0,102,111,114,101,115,116,103,114,101,101,110,0,0,0,0,0,108,97,121,101,114,115,101,108,101,99,116,0,0,0,0,0,112,111,115,0,0,0,0,0,47,112,97,105,114,101,100,51,47,51,0,0,0,0,0,0,47,112,97,105,114,101,100,51,47,50,0,0,0,0,0,0,47,112,97,105,114,101,100,51,47,49,0,0,0,0,0,0,47,98,108,117,101,115,54,47,52,0,0,0,0,0,0,0,110,111,116,32,119,101,108,108,45,102,111,114,109,101,100,32,40,105,110,118,97,108,
-105,100,32,116,111,107,101,110,41,0,105,109,97,103,101,32,99,114,101,97,116,101,32,112,104,111,116,111,32,34,112,104,111,116,111,95,37,115,34,32,45,102,105,108,101,32,34,37,115,34,10,0,0,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,57,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,56,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,55,0,0,0,0,0,90,97,112,102,68,105,110,103,98,97,116,115,0,0,0,0,47,112,97,105,114,101,100,49,50,47,54,0,0,0,0,0,60,118,58,112,97,116,104,32,32,118,61,34,0,0,0,0,47,112,97,105,
-114,101,100,49,50,47,53,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,52,0,0,0,0,0,103,115,97,118,101,10,37,100,32,37,100,32,37,100,32,37,100,32,98,111,120,112,114,105,109,32,99,108,105,112,32,110,101,119,112,97,116,104,10,0,66,101,116,97,0,0,0,0,114,101,110,100,101,114,0,0,80,97,108,97,116,105,110,111,45,66,111,108,100,0,0,0,116,101,114,109,105,110,97,116,111,114,0,0,0,0,0,0,112,105,110,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,51,0,0,0,0,0,102,111,110,116,110,97,109,101,115,0,0,0,0,0,0,0,103,
-114,97,100,105,101,110,116,97,110,103,108,101,0,0,0,67,97,108,99,117,108,97,116,105,110,103,32,99,105,114,99,117,105,116,32,109,111,100,101,108,0,0,0,0,0,0,0,98,108,111,99,107,116,114,101,101,46,99,0,0,0,0,0,102,108,111,114,97,108,119,104,105,116,101,0,0,0,0,0,108,97,121,101,114,115,0,0,99,109,97,112,120,58,109,97,112,0,0,0,0,0,0,0,100,105,109,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,50,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,49,50,0,0,0,0,47,112,97,105,114,101,100,49,50,47,49,49,0,0,0,0,
-47,98,108,117,101,115,54,47,51,0,0,0,0,0,0,0,103,105,102,58,116,107,0,0,47,112,97,105,114,101,100,49,50,47,49,48,0,0,0,0,106,112,103,58,115,118,103,0,47,112,97,105,114,101,100,49,50,47,49,0,0,0,0,0,47,112,97,105,114,101,100,49,49,47,57,0,0,0,0,0,83,121,109,98,111,108,0,0,47,112,97,105,114,101,100,49,49,47,56,0,0,0,0,0,32,62,0,0,0,0,0,0,47,112,97,105,114,101,100,49,49,47,55,0,0,0,0,0,47,98,108,117,101,115,54,47,50,0,0,0,0,0,0,0,47,112,97,105,114,101,100,49,49,47,54,0,0,0,0,0,37,100,32,37,100,32,37,
-100,32,98,101,103,105,110,112,97,103,101,10,0,0,0,0,0,65,117,109,108,0,0,0,0,114,111,109,97,110,0,0,0,99,100,115,0,0,0,0,0,47,112,97,105,114,101,100,49,49,47,53,0,0,0,0,0,97,114,114,97,121,0,0,0,115,104,111,119,98,111,120,101,115,0,0,0,0,0,0,0,37,108,102,44,37,108,102,0,102,105,120,101,100,115,105,122,101,0,0,0,0,0,0,0,110,111,114,109,97,108,105,122,101,0,0,0,0,0,0,0,102,105,114,101,98,114,105,99,107,0,0,0,0,0,0,0,100,103,101,115,102,105,114,115,116,0,0,0,0,0,0,0,100,105,109,101,110,0,0,0,47,112,
-97,105,114,101,100,49,49,47,52,0,0,0,0,0,105,99,111,0,0,0,0,0,47,112,97,105,114,101,100,49,49,47,51,0,0,0,0,0,47,112,97,105,114,101,100,49,49,47,50,0,0,0,0,0,98,111,120,0,0,0,0,0,106,112,103,58,118,109,108,0,47,112,97,105,114,101,100,49,49,47,49,49,0,0,0,0,47,112,97,105,114,101,100,49,49,47,49,48,0,0,0,0,115,116,114,101,97,109,32,101,114,114,111,114,0,0,0,0,47,112,97,105,114,101,100,49,49,47,49,0,0,0,0,0,84,105,109,101,115,45,82,111,109,97,110,0,0,0,0,0,47,112,97,105,114,101,100,49,48,47,57,0,0,0,
-0,0,32,119,105,100,116,104,58,32,37,100,59,32,104,101,105,103,104,116,58,32,37,100,34,0,47,112,97,105,114,101,100,49,48,47,56,0,0,0,0,0,47,112,97,105,114,101,100,49,48,47,55,0,0,0,0,0,60,60,32,47,80,97,103,101,83,105,122,101,32,91,37,100,32,37,100,93,32,62,62,32,115,101,116,112,97,103,101,100,101,118,105,99,101,10,0,0,65,116,105,108,100,101,0,0,38,97,109,112,59,0,0,0,0,0,1,0,0,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,82,111,109,97,110,0,0,112,114,111,109,111,116,101,114,
-0,0,0,0,0,0,0,0,47,112,97,105,114,101,100,49,48,47,54,0,0,0,0,0,101,113,117,97,108,108,121,0,99,111,108,115,112,97,110,0,112,114,105,115,109,0,0,0,100,111,100,103,101,114,98,108,117,101,0,0,0,0,0,0,111,100,101,115,102,105,114,115,116,0,0,0,0,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,97,116,116,114,105,98,117,116,101,32,34,109,111,100,101,34,32,105,110,32,103,114,97,112,104,32,37,115,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,47,112,97,105,114,101,100,49,
-48,47,53,0,0,0,0,0,47,112,97,105,114,101,100,49,48,47,52,0,0,0,0,0,47,112,97,105,114,101,100,49,48,47,51,0,0,0,0,0,65,114,114,111,119,32,116,121,112,101,32,34,37,115,34,32,117,110,107,110,111,119,110,32,45,32,105,103,110,111,114,105,110,103,10,0,0,0,0,0,47,98,108,117,101,115,54,47,49,0,0,0,0,0,0,0,106,112,101,58,118,109,108,0,47,112,97,105,114,101,100,49,48,47,50,0,0,0,0,0,78,68,95,110,101,120,116,40,118,41,32,61,61,32,78,85,76,76,0,0,0,0,0,0,47,112,97,105,114,101,100,49,48,47,49,48,0,0,0,0,47,112,
-97,105,114,101,100,49,48,47,49,0,0,0,0,0,80,97,108,97,116,105,110,111,45,66,111,108,100,73,116,97,108,105,99,0,0,0,0,0,47,111,114,114,100,57,47,57,0,0,0,0,0,0,0,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,118,109,108,46,99,0,0,0,0,0,47,111,114,114,100,57,47,56,0,0,0,0,0,0,0,0,47,111,114,114,100,57,47,55,0,0,0,0,0,0,0,0,80,111,114,116,114,97,105,116,0,0,0,0,0,0,0,0,65,114,105,110,103,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,73,116,97,108,105,99,0,77,99,105,114,
-99,108,101,0,47,111,114,114,100,57,47,54,0,0,0,0,0,0,0,0,114,97,110,107,115,101,112,0,95,37,100,0,0,0,0,0,99,101,108,108,115,112,97,99,105,110,103,0,0,0,0,0,121,120,32,112,115,101,117,100,111,45,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,0,0,0,0,0,0,0,32,37,100,32,37,100,0,0,100,105,109,103,114,101,121,0,111,117,116,112,117,116,111,114,100,101,114,0,0,0,0,0,109,97,106,111,114,0,0,0,47,111,114,114,100,57,47,53,0,0,0,0,0,0,0,0,114,105,102,102,0,0,0,0,47,111,
-114,114,100,57,47,52,0,0,0,0,0,0,0,0,47,111,114,114,100,57,47,51,0,0,0,0,0,0,0,0,47,98,108,117,101,115,53,47,53,0,0,0,0,0,0,0,106,112,101,103,58,118,109,108,0,0,0,0,0,0,0,0,47,111,114,114,100,57,47,50,0,0,0,0,0,0,0,0,118,112,0,0,0,0,0,0,47,111,114,114,100,57,47,49,0,0,0,0,0,0,0,0,47,111,114,114,100,56,47,56,0,0,0,0,0,0,0,0,80,97,108,97,116,105,110,111,45,73,116,97,108,105,99,0,47,111,114,114,100,56,47,55,0,0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,48,0,0,0,0,0,0,0,47,111,
-114,114,100,56,47,54,0,0,0,0,0,0,0,0,47,111,114,114,100,56,47,53,0,0,0,0,0,0,0,0,76,97,110,100,115,99,97,112,101,0,0,0,0,0,0,0,65,108,112,104,97,0,0,0,82,73,70,70,0,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,66,111,108,100,73,116,97,108,105,99,0,0,0,0,0,77,115,113,117,97,114,101,0,47,111,114,114,100,56,47,52,0,0,0,0,0,0,0,0,110,111,100,101,115,101,112,0,116,114,97,110,115,112,97,114,101,110,116,0,0,0,0,0,99,101,108,108,112,97,100,100,105,110,103,0,0,0,0,0,112,111,114,116,
-104,111,121,120,0,0,0,0,0,0,0,0,100,105,109,103,114,97,121,0,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,0,0,0,0,0,99,121,97,110,0,0,0,0,75,75,0,0,0,0,0,0,47,111,114,114,100,56,47,51,0,0,0,0,0,0,0,0,47,98,108,117,101,115,53,47,52,0,0,0,0,0,0,0,47,111,114,114,100,56,47,50,0,0,0,0,0,0,0,0,47,111,114,114,100,56,47,49,0,0,0,0,0,0,0,0,103,105,102,58,118,109,108,0,47,111,114,114,100,55,47,55,0,0,0,0,0,0,0,0,47,111,114,114,100,55,47,54,0,0,0,0,0,0,0,0,38,35,49,54,48,59,0,0,47,111,
-114,114,100,55,47,53,0,0,0,0,0,0,0,0,80,97,108,97,116,105,110,111,45,66,111,108,100,0,0,0,113,0,0,0,0,0,0,0,47,111,114,114,100,55,47,52,0,0,0,0,0,0,0,0,35,37,48,50,120,37,48,50,120,37,48,50,120,0,0,0,47,111,114,114,100,55,47,51,0,0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,111,114,114,100,55,47,50,0,0,0,0,0,0,0,0,32,99,114,101,97,116,101,32,108,105,110,101,32,0,0,0,102,105,103,0,0,0,0,0,65,103,114,97,118,101,0,0,67,101,110,116,117,114,121,32,83,99,104,111,111,108,98,111,
-111,107,32,76,0,0,0,0,75,80,95,82,105,103,104,116,0,0,0,0,0,0,0,0,77,100,105,97,109,111,110,100,0,0,0,0,0,0,0,0,47,111,114,114,100,55,47,49,0,0,0,0,0,0,0,0,82,76,0,0,0,0,0,0,100,111,116,116,101,100,0,0,98,111,114,100,101,114,0,0,120,121,32,112,115,101,117,100,111,45,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,0,0,0,0,0,0,0,97,99,116,117,97,108,0,0,100,101,101,112,115,107,121,98,108,117,101,0,0,0,0,0,37,108,102,44,37,108,102,44,37,108,102,44,37,91,94,44,93,
-37,115,0,0,0,0,0,109,111,100,101,0,0,0,0,47,111,114,114,100,54,47,54,0,0,0,0,0,0,0,0,120,109,108,0,0,0,0,0,37,37,37,37,80,97,103,101,79,114,105,101,110,116,97,116,105,111,110,58,32,37,115,10,0,0,0,0,0,0,0,0,47,98,108,117,101,115,53,47,51,0,0,0,0,0,0,0,47,111,114,114,100,54,47,53,0,0,0,0,0,0,0,0,47,111,114,114,100,54,47,52,0,0,0,0,0,0,0,0,57,58,112,114,105,115,109,0,112,110,103,58,118,109,108,0,47,111,114,114,100,54,47,51,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,112,97,116,99,104,119,111,114,107,0,0,0,0,0,
-0,0,47,111,114,114,100,54,47,50,0,0,0,0,0,0,0,0,47,111,114,114,100,54,47,49,0,0,0,0,0,0,0,0,80,97,108,97,116,105,110,111,45,82,111,109,97,110,0,0,47,111,114,114,100,53,47,53,0,0,0,0,0,0,0,0,100,111,116,58,100,111,116,0,110,111,110,101,0,0,0,0,99,97,110,110,111,116,32,102,105,110,100,32,116,114,105,97,110,103,108,101,32,112,97,116,104,0,0,0,0,0,0,0,47,111,114,114,100,53,47,52,0,0,0,0,0,0,0,0,47,111,114,114,100,53,47,51,0,0,0,0,0,0,0,0,102,105,108,101,32,108,111,97,100,105,110,103,32,105,115,32,100,
-105,115,97,98,108,101,100,32,98,101,99,97,117,115,101,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,99,111,110,116,97,105,110,115,32,83,69,82,86,69,82,95,78,65,77,69,61,34,37,115,34,10,97,110,100,32,116,104,101,32,71,86,95,70,73,76,69,95,80,65,84,72,32,118,97,114,105,97,98,108,101,32,105,115,32,117,110,115,101,116,32,111,114,32,101,109,112,116,121,46,10,0,0,0,0,37,46,48,50,102,0,0,0,65,99,105,114,99,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,66,111,108,
-100,0,0,0,114,32,38,38,32,115,0,0,117,110,100,101,114,108,105,110,101,0,0,0,0,0,0,0,102,111,110,116,110,97,109,101,58,32,117,110,97,98,108,101,32,116,111,32,114,101,115,111,108,118,101,32,34,37,115,34,10,0,0,0,0,0,0,0,47,111,114,114,100,53,47,50,0,0,0,0,0,0,0,0,66,84,0,0,0,0,0,0,70,65,76,83,69,0,0,0,100,97,115,104,101,100,0,0,98,103,99,111,108,111,114,0,112,111,114,116,104,111,120,121,0,0,0,0,0,0,0,0,100,101,101,112,112,105,110,107,0,0,0,0,0,0,0,0,37,108,102,44,37,108,102,44,37,108,102,44,39,37,91,
-94,39,93,39,0,0,0,0,0,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,102,97,105,108,117,114,101,10,0,0,0,0,0,0,85,110,107,110,111,119,110,32,118,97,108,117,101,32,37,115,32,102,111,114,32,97,116,116,114,105,98,117,116,101,32,34,109,111,100,101,108,34,32,105,110,32,103,114,97,112,104,32,37,115,32,45,32,105,103,110,111,114,101,100,10,0,0,0,114,32,38,38,32,110,0,0,47,111,114,114,100,53,47,49,0,0,0,0,0,0,0,0,60,63,120,109,108,0,0,0,37,37,37,37,80,97,103,101,66,111,117,110,100,105,
-110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,0,0,0,101,112,115,102,0,0,0,0,99,111,109,112,46,99,0,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,105,108,108,101,103,97,108,32,118,97,108,117,101,115,32,111,102,32,112,114,101,118,32,37,100,32,97,110,100,32,110,101,120,116,32,37,100,44,32,108,105,110,101,32,37,100,10,0,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,118,32,61,61,32,110,0,0,37,100,32,111,117,116,32,111,102,32,37,100,32,108,97,98,101,108,115,32,112,111,
-115,105,116,105,111,110,101,100,46,10,0,0,0,0,0,0,0,0,47,98,108,117,101,115,53,47,50,0,0,0,0,0,0,0,47,111,114,114,100,52,47,52,0,0,0,0,0,0,0,0,98,108,97,99,107,0,0,0,115,101,97,114,99,104,115,105,122,101,0,0,0,0,0,0,116,107,0,0,0,0,0,0,45,45,0,0,0,0,0,0,47,111,114,114,100,52,47,51,0,0,0,0,0,0,0,0,100,101,102,97,117,108,116,100,105,115,116,0,0,0,0,0,58,32,0,0,0,0,0,0,115,111,114,116,118,0,0,0,115,118,103,58,115,118,103,0,47,111,114,114,100,52,47,50,0,0,0,0,0,0,0,0,67,97,108,99,117,108,97,116,105,110,
-103,32,77,68,83,32,109,111,100,101,108,0,0,0,108,97,121,111,117,116,32,37,115,10,0,0,0,0,0,0,114,101,99,32,37,102,32,37,102,32,37,102,32,37,102,10,0,0,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,114,111,111,116,0,0,0,0,47,111,114,114,100,52,47,49,0,0,0,0,0,0,0,0,76,97,98,101,108,32,99,108,111,115,101,100,32,98,101,102,111,114,101,32,101,110,100,32,111,102,32,72,84,77,76,32,101,108,101,109,101,110,116,10,0,0,0,0,0,0,0,0,47,111,114,114,100,51,47,51,0,0,0,0,0,0,0,0,111,118,101,
-114,108,97,112,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,66,111,108,100,73,116,97,108,105,99,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,47,111,114,114,100,51,47,50,0,0,0,0,0,0,0,0,99,111,110,99,46,99,0,0,47,97,99,99,101,110,116,51,47,51,0,0,0,0,0,0,115,97,109,112,108,101,112,111,105,110,116,115,0,0,0,0,69,68,95,116,111,95,118,105,114,116,40,101,41,32,61,61,32,78,85,76,76,0,0,0,34,32,47,62,0,0,0,0,47,111,114,114,100,51,47,49,0,0,0,0,0,0,0,0,111,98,106,0,0,
-0,0,0,47,111,114,97,110,103,101,115,57,47,57,0,0,0,0,0,120,100,111,116,32,118,101,114,115,105,111,110,32,34,37,115,34,32,116,111,111,32,108,111,110,103,0,0,0,0,0,0,65,97,99,117,116,101,0,0,72,101,108,118,101,116,105,99,97,45,79,98,108,105,113,117,101,0,0,0,0,0,0,0,110,0,0,0,0,0,0,0,105,110,118,104,111,117,115,101,0,0,0,0,0,0,0,0,110,101,97,116,111,115,112,108,105,110,101,115,46,99,0,0,47,111,114,97,110,103,101,115,57,47,56,0,0,0,0,0,76,82,0,0,0,0,0,0,50,48,0,0,0,0,0,0,98,97,108,105,103,110,0,0,112,
-111,114,116,104,111,95,121,120,0,0,0,0,0,0,0,100,97,114,107,118,105,111,108,101,116,0,0,0,0,0,0,118,105,101,119,112,111,114,116,0,0,0,0,0,0,0,0,105,115,32,105,110,97,112,112,114,111,112,114,105,97,116,101,46,32,82,101,118,101,114,116,105,110,103,32,116,111,32,116,104,101,32,115,104,111,114,116,101,115,116,32,112,97,116,104,32,109,111,100,101,108,46,10,0,0,0,0,0,0,0,0,97,110,116,105,113,117,101,119,104,105,116,101,0,0,0,0,47,111,114,97,110,103,101,115,57,47,55,0,0,0,0,0,101,112,115,0,0,0,0,0,37,37,
-37,37,80,97,103,101,58,32,37,100,32,37,100,10,0,0,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,47,98,108,117,101,115,53,47,49,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,57,47,54,0,0,0,0,0,37,115,32,45,62,32,37,115,58,32,116,97,105,108,32,105,115,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,57,47,53,0,0,0,0,0,115,118,103,58,120,100,111,116,0,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,57,47,
-52,0,0,0,0,0,32,45,45,32,0,0,0,0,47,111,114,97,110,103,101,115,57,47,51,0,0,0,0,0,110,111,100,101,32,37,115,44,32,112,111,115,105,116,105,111,110,32,37,115,44,32,101,120,112,101,99,116,101,100,32,116,119,111,32,100,111,117,98,108,101,115,10,0,0,0,0,0,47,111,114,97,110,103,101,115,57,47,50,0,0,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,82,111,109,97,110,0,0,115,112,108,105,110,101,115,32,97,110,100,32,99,108,117,115,116,101,114,32,101,100,103,101,115,32,110,111,116,32,115,
-117,112,112,111,114,116,101,100,32,45,32,117,115,105,110,103,32,108,105,110,101,32,115,101,103,109,101,110,116,115,10,0,0,114,111,111,116,0,0,0,0,47,111,114,97,110,103,101,115,57,47,49,0,0,0,0,0,108,101,118,101,108,32,97,115,115,105,103,110,109,101,110,116,32,99,111,110,115,116,114,97,105,110,116,115,0,0,0,0,34,32,100,97,115,104,115,116,121,108,101,61,34,100,111,116,0,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,56,47,56,0,0,0,0,0,98,98,0,0,0,0,0,0,71,111,105,110,103,32,116,111,32,97,112,112,108,121,
-32,97,110,111,116,104,101,114,32,101,120,112,97,110,115,105,111,110,46,10,0,0,0,0,0,0,47,111,114,97,110,103,101,115,56,47,55,0,0,0,0,0,37,115,32,119,104,105,108,101,32,111,112,101,110,105,110,103,32,37,115,10,0,0,0,0,91,32,0,0,0,0,0,0,95,116,108,100,114,97,119,95,0,0,0,0,0,0,0,0,65,69,108,105,103,0,0,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,79,98,108,105,113,117,101,0,0,0,0,0,0,0,0,105,32,60,32,78,79,68,69,67,65,82,68,0,0,0,0,105,110,118,116,114,97,112,101,122,105,117,109,0,
-0,0,0,47,111,114,97,110,103,101,115,56,47,54,0,0,0,0,0,114,97,110,107,100,105,114,0,49,57,0,0,0,0,0,0,60,84,68,62,0,0,0,0,112,115,101,117,100,111,45,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,0,0,100,97,114,107,116,117,114,113,117,111,105,115,101,0,0,0,112,97,103,101,100,105,114,61,37,115,32,105,103,110,111,114,101,100,10,0,0,0,0,0,101,100,103,101,115,32,105,110,32,103,114,97,112,104,32,37,115,32,104,97,118,101,32,110,111,32,108,101,110,32,97,116,116,114,
-105,98,117,116,101,46,32,72,101,110,99,101,44,32,116,104,101,32,109,100,115,32,109,111,100,101,108,10,0,0,47,111,114,97,110,103,101,115,56,47,53,0,0,0,0,0,197,208,211,198,0,0,0,0,37,37,37,37,69,110,100,80,97,103,101,58,32,37,100,10,0,0,0,0,0,0,0,0,105,110,118,105,115,0,0,0,47,98,108,117,101,115,52,47,52,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,56,47,52,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,
-37,100,58,32,78,68,95,111,114,100,101,114,40,37,115,41,32,91,37,100,93,32,62,32,71,68,95,114,97,110,107,40,82,111,111,116,41,91,37,100,93,46,97,110,32,91,37,100,93,10,0,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,56,47,51,0,0,0,0,0,112,114,101,102,105,120,32,109,117,115,116,32,110,111,116,32,98,101,32,98,111,117,110,100,32,116,111,32,111,110,101,32,111,102,32,116,104,101,32,114,101,115,101,114,118,101,100,32,110,97,109,101,115,112,97,99,101,32,110,97,109,101,115,0,101,112,115,58,120,100,111,116,0,
-0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,56,47,50,0,0,0,0,0,47,111,114,97,110,103,101,115,56,47,49,0,0,0,0,0,47,111,114,97,110,103,101,115,55,47,55,0,0,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,73,116,97,108,105,99,0,47,111,114,97,110,103,101,115,55,47,54,0,0,0,0,0,34,32,100,97,115,104,115,116,121,108,101,61,34,100,97,115,104,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,55,47,53,0,0,0,0,0,47,111,114,97,110,103,101,115,55,47,52,0,0,0,0,0,95,104,108,100,114,97,119,95,0,0,
-0,0,0,0,0,0,98,122,46,115,105,122,101,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,66,111,108,100,79,98,108,105,113,117,101,0,0,0,0,105,110,118,116,114,105,97,110,103,108,101,0,0,0,0,0,47,111,114,97,110,103,101,115,55,47,51,0,0,0,0,0,113,117,97,110,116,117,109,0,49,56,0,0,0,0,0,0,37,115,32,118,97,108,117,101,32,37,115,32,60,32,37,100,32,45,32,116,111,111,32,115,109,97,108,108,32,45,32,105,103,110,111,114,101,100,0,0,112,111,114,116,104,111,0,0,101,100,103,101,32,108,97,98,101,108,
-115,32,119,105,116,104,32,115,112,108,105,110,101,115,61,99,117,114,118,101,100,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,100,111,116,32,45,32,117,115,101,32,120,108,97,98,101,108,115,10,0,0,0,0,0,100,97,114,107,115,108,97,116,101,103,114,101,121,0,0,0,77,111,114,101,32,116,104,97,110,32,50,32,99,111,108,111,114,115,32,115,112,101,99,105,102,105,101,100,32,102,111,114,32,97,32,103,114,97,100,105,101,110,116,32,45,32,105,103,110,111,114,105,110,103,32,114,101,109,97,105,110,
-105,110,103,10,0,0,0,0,0,0,0,109,100,115,0,0,0,0,0,47,111,114,97,110,103,101,115,55,47,50,0,0,0,0,0,112,100,102,0,0,0,0,0,37,37,80,97,103,101,84,114,97,105,108,101,114,10,0,0,47,98,108,117,101,115,52,47,51,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,55,47,49,0,0,0,0,0,47,111,114,97,110,103,101,115,54,47,54,0,0,0,0,0,114,101,115,101,114,118,101,100,32,112,114,101,102,105,120,32,40,120,109,108,110,115,41,32,109,117,115,116,32,110,111,116,32,98,101,32,100,101,99,108,97,114,101,100,32,111,114,32,117,
-110,100,101,99,108,97,114,101,100,0,0,0,0,0,0,110,111,32,101,108,101,109,101,110,116,32,102,111,117,110,100,0,0,0,0,0,0,0,0,112,115,58,120,100,111,116,0,47,111,114,97,110,103,101,115,54,47,53,0,0,0,0,0,47,111,114,97,110,103,101,115,54,47,52,0,0,0,0,0,47,111,114,97,110,103,101,115,54,47,51,0,0,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,66,111,108,100,0,0,0,47,111,114,97,110,103,101,115,54,47,50,0,0,0,0,0,34,32,119,101,105,103,104,116,61,34,37,46,48,102,112,116,0,0,0,0,0,0,
-0,0,47,111,114,97,110,103,101,115,54,47,49,0,0,0,0,0,47,111,114,97,110,103,101,115,53,47,53,0,0,0,0,0,95,116,100,114,97,119,95,0,100,101,115,116,105,110,97,116,105,111,110,32,112,111,105,110,116,32,110,111,116,32,105,110,32,97,110,121,32,116,114,105,97,110,103,108,101,0,0,0,84,119,111,32,99,108,117,115,116,101,114,115,32,110,97,109,101,100,32,37,115,32,45,32,116,104,101,32,115,101,99,111,110,100,32,119,105,108,108,32,98,101,32,105,103,110,111,114,101,100,10,0,0,0,0,0,72,101,108,118,101,116,105,99,
-97,45,78,97,114,114,111,119,45,66,111,108,100,0,0,0,81,0,0,0,0,0,0,0,116,114,105,112,108,101,111,99,116,97,103,111,110,0,0,0,47,111,114,97,110,103,101,115,53,47,52,0,0,0,0,0,105,109,97,103,101,112,97,116,104,0,0,0,0,0,0,0,49,55,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,37,115,32,118,97,108,117,101,32,37,115,32,62,32,37,100,32,45,32,116,111,111,32,108,97,114,103,101,32,45,32,105,103,110,111,114,101,100,0,0,121,120,32,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,
-116,114,97,105,110,116,115,0,0,0,0,0,0,0,100,97,114,107,115,108,97,116,101,103,114,97,121,0,0,0,114,101,110,100,101,114,101,114,32,102,111,114,32,37,115,32,105,115,32,117,110,97,118,97,105,108,97,98,108,101,10,0,115,104,111,114,116,112,97,116,104,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,53,47,51,0,0,0,0,0,37,80,68,70,45,0,0,0,101,110,100,112,97,103,101,10,115,104,111,119,112,97,103,101,10,103,114,101,115,116,111,114,101,10,0,0,0,0,0,0,105,109,97,112,58,109,97,112,0,0,0,0,0,0,0,0,47,98,108,117,
-101,115,52,47,50,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,53,47,50,0,0,0,0,0,47,111,114,97,110,103,101,115,53,47,49,0,0,0,0,0,114,101,115,101,114,118,101,100,32,112,114,101,102,105,120,32,40,120,109,108,41,32,109,117,115,116,32,110,111,116,32,98,101,32,117,110,100,101,99,108,97,114,101,100,32,111,114,32,98,111,117,110,100,32,116,111,32,97,110,111,116,104,101,114,32,110,97,109,101,115,112,97,99,101,32,110,97,109,101,0,106,112,103,58,120,100,111,116,0,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,
-52,47,52,0,0,0,0,0,106,112,101,58,115,118,103,0,47,111,114,97,110,103,101,115,52,47,51,0,0,0,0,0,47,111,114,97,110,103,101,115,52,47,50,0,0,0,0,0,66,111,111,107,109,97,110,45,68,101,109,105,73,116,97,108,105,99,0,0,0,0,0,0,47,111,114,97,110,103,101,115,52,47,49,0,0,0,0,0,60,118,58,115,116,114,111,107,101,32,99,111,108,111,114,61,34,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,51,47,51,0,0,0,0,0,110,101,97,116,111,0,0,0,41,10,0,0,0,0,0,0,100,111,116,95,108,97,121,111,117,116,0,0,0,0,0,0,47,111,114,
-97,110,103,101,115,51,47,50,0,0,0,0,0,95,104,100,114,97,119,95,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,99,111,110,100,101,110,115,101,100,0,0,0,0,0,0,0,97,103,114,97,112,104,111,102,32,97,32,98,97,100,32,111,98,106,101,99,116,0,0,0,100,111,117,98,108,101,111,99,116,97,103,111,110,0,0,0,112,111,115,0,0,0,0,0,47,111,114,97,110,103,101,115,51,47,49,0,0,0,0,0,71,68,70,79,78,84,80,65,84,72,61,0,0,0,0,0,49,54,0,0,0,0,0,0,73,109,112,114,111,112,101,114,32,37,115,32,118,97,108,117,101,32,
-37,115,32,45,32,105,103,110,111,114,101,100,0,0,111,114,116,104,111,121,120,0,115,45,62,115,122,32,62,32,48,0,0,0,0,0,0,0,100,97,114,107,115,108,97,116,101,98,108,117,101,0,0,0,108,97,121,111,117,116,32,119,97,115,32,110,111,116,32,100,111,110,101,10,0,0,0,0,115,117,98,115,101,116,0,0,47,103,114,101,121,115,57,47,57,0,0,0,0,0,0,0,106,112,101,103,0,0,0,0,48,32,48,32,48,32,101,100,103,101,99,111,108,111,114,10,0,0,0,0,0,0,0,0,47,98,108,117,101,115,52,47,49,0,0,0,0,0,0,0,47,103,114,101,121,115,57,47,
-56,0,0,0,0,0,0,0,47,103,114,101,121,115,57,47,55,0,0,0,0,0,0,0,99,97,110,110,111,116,32,115,117,115,112,101,110,100,32,105,110,32,101,120,116,101,114,110,97,108,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,0,0,0,0,0,106,112,101,58,120,100,111,116,0,0,0,0,0,0,0,0,47,103,114,101,121,115,57,47,54,0,0,0,0,0,0,0,32,50,10,0,0,0,0,0,47,103,114,101,121,115,57,47,53,0,0,0,0,0,0,0,116,101,101,0,0,0,0,0,47,103,114,101,121,115,57,47,52,0,0,0,0,0,0,0,102,105,108,101,32,101,114,114,111,114,0,
-0,0,0,0,0,66,111,111,107,109,97,110,45,76,105,103,104,116,0,0,0,47,103,114,101,121,115,57,47,51,0,0,0,0,0,0,0,60,47,118,58,115,104,97,112,101,62,10,0,0,0,0,0,47,103,114,101,121,115,57,47,50,0,0,0,0,0,0,0,32,40,0,0,0,0,0,0,47,98,108,117,101,115,51,47,51,0,0,0,0,0,0,0,85,115,105,110,103,32,37,115,58,32,37,115,58,37,115,10,0,0,0,0,0,0,0,0,47,103,114,101,121,115,57,47,49,0,0,0,0,0,0,0,95,108,100,114,97,119,95,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,72,101,108,118,101,116,105,99,97,45,
-78,97,114,114,111,119,0,0,0,0,0,0,0,0,100,111,117,98,108,101,99,105,114,99,108,101,0,0,0,0,47,103,114,101,121,115,56,47,56,0,0,0,0,0,0,0,112,97,99,107,46,99,0,0,68,79,84,70,79,78,84,80,65,84,72,0,0,0,0,0,49,53,0,0,0,0,0,0,115,99,97,108,101,0,0,0,80,79,73,78,84,45,83,73,90,69,0,0,0,0,0,0,120,121,32,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,0,0,0,0,0,0,69,68,95,116,111,95,118,105,114,116,40,111,114,105,103,41,32,33,61,32,78,85,76,76,0,0,0,0,0,0,0,0,103,118,
-82,101,110,100,101,114,74,111,98,115,32,37,115,58,32,37,46,50,102,32,115,101,99,115,46,10,0,0,0,0,100,97,114,107,115,101,97,103,114,101,101,110,0,0,0,0,99,105,114,99,117,105,116,0,47,103,114,101,121,115,56,47,55,0,0,0,0,0,0,0,255,216,255,224,0,0,0,0,37,37,32,37,115,10,0,0,47,103,114,101,121,115,56,47,54,0,0,0,0,0,0,0,47,103,114,101,121,115,56,47,53,0,0,0,0,0,0,0,112,97,114,115,105,110,103,32,102,105,110,105,115,104,101,100,0,0,0,0,0,0,0,0,106,112,101,103,58,120,100,111,116,0,0,0,0,0,0,0,47,103,114,
-101,121,115,56,47,52,0,0,0,0,0,0,0,49,50,48,48,0,0,0,0,47,103,114,101,121,115,56,47,51,0,0,0,0,0,0,0,117,32,33,61,32,118,0,0,47,103,114,101,121,115,56,47,50,0,0,0,0,0,0,0,66,111,111,107,109,97,110,45,76,105,103,104,116,73,116,97,108,105,99,0,0,0,0,0,47,103,114,101,121,115,56,47,49,0,0,0,0,0,0,0,34,47,62,0,0,0,0,0,47,103,114,101,121,115,55,47,55,0,0,0,0,0,0,0,32,118,101,114,115,105,111,110,32,0,0,0,0,0,0,0,47,103,114,101,121,115,55,47,54,0,0,0,0,0,0,0,49,46,54,0,0,0,0,0,115,112,108,105,110,101,115,
-0,72,101,108,118,101,116,105,99,97,45,66,111,108,100,79,98,108,105,113,117,101,0,0,0,115,113,117,97,114,101,0,0,47,103,114,101,121,115,55,47,53,0,0,0,0,0,0,0,102,111,110,116,112,97,116,104,0,0,0,0,0,0,0,0,49,52,0,0,0,0,0,0,112,111,105,110,116,45,115,105,122,101,0,0,0,0,0,0,111,114,116,104,111,120,121,0,46,92,34,32],"i8",L,l.J+102436);D([0,0,0,0,76,97,121,111,117,116,32,119,97,115,32,110,111,116,32,100,111,110,101,46,32,32,77,105,115,115,105,110,103,32,108,97,121,111,117,116,32,112,108,117,103,105,
-110,115,63,32,10,0,100,97,114,107,115,97,108,109,111,110,0,0,0,0,0,0,109,111,100,101,108,0,0,0,47,103,114,101,121,115,55,47,52,0,0,0,0,0,0,0,103,105,102,0,0,0,0,0,103,115,97,118,101,10,0,0,34,32,110,97,109,101,61,34,0,0,0,0,0,0,0,0,47,98,108,117,101,115,51,47,50,0,0,0,0,0,0,0,47,103,114,101,121,115,55,47,51,0,0,0,0,0,0,0,47,103,114,101,121,115,55,47,50,0,0,0,0,0,0,0,112,97,114,115,105,110,103,32,97,98,111,114,116,101,100,0,103,105,102,58,120,100,111,116,0,0,0,0,0,0,0,0,47,103,114,101,121,115,55,47,
-49,0,0,0,0,0,0,0,45,50,10,0,0,0,0,0,47,103,114,101,121,115,54,47,54,0,0,0,0,0,0,0,111,98,106,112,49,45,62,115,122,46,120,32,61,61,32,48,32,38,38,32,111,98,106,112,49,45,62,115,122,46,121,32,61,61,32,48,0,0,0,0,47,103,114,101,121,115,54,47,53,0,0,0,0,0,0,0,66,111,111,107,109,97,110,45,68,101,109,105,0,0,0,0,47,103,114,101,121,115,54,47,52,0,0,0,0,0,0,0,32,101,32,0,0,0,0,0,47,103,114,101,121,115,54,47,51,0,0,0,0,0,0,0,35,32,71,101,110,101,114,97,116,101,100,32,98,121,32,0,99,103,0,0,0,0,0,0,47,103,
-114,101,121,115,54,47,50,0,0,0,0,0,0,0,99,111,114,101,0,0,0,0,49,46,50,0,0,0,0,0,85,110,107,110,111,119,110,32,34,115,112,108,105,110,101,115,34,32,118,97,108,117,101,58,32,34,37,115,34,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,66,111,108,100,0,0,114,101,99,116,97,110,103,108,101,0,0,0,0,0,0,0,58,0,0,0,0,0,0,0,37,99,37,108,100,0,0,0,47,103,114,101,121,115,54,47,49,0,0,0,0,0,0,0,115,118,103,0,0,0,0,0,49,51,0,0,0,0,0,0,102,97,99,101,0,0,0,0,111,114,
-116,104,111,95,121,120,0,0,0,0,0,0,0,0,67,0,0,0,0,0,0,0,100,97,114,107,114,101,100,0,95,110,101,97,116,111,95,99,99,0,0,0,0,0,0,0,47,103,114,101,121,115,53,47,53,0,0,0,0,0,0,0,71,73,70,56,0,0,0,0,103,114,101,115,116,111,114,101,10,0,0,0,0,0,0,0,98,108,117,101,0,0,0,0,60,109,97,112,32,105,100,61,34,0,0,0,0,0,0,0,47,98,108,117,101,115,51,47,49,0,0,0,0,0,0,0,47,103,114,101,121,115,53,47,52,0,0,0,0,0,0,0,47,103,114,101,121,115,53,47,51,0,0,0,0,0,0,0,112,97,114,115,101,114,32,110,111,116,32,115,117,115,
-112,101,110,100,101,100,0,0,0,0,106,32,61,61,32,48,0,0,47,103,114,101,121,115,53,47,50,0,0,0,0,0,0,0,112,110,103,58,120,100,111,116,0,0,0,0,0,0,0,0,83,105,110,103,108,101,10,0,47,103,114,101,121,115,53,47,49,0,0,0,0,0,0,0,38,35,52,53,59,0,0,0,47,103,114,101,121,115,52,47,52,0,0,0,0,0,0,0,84,105,109,101,115,45,73,116,97,108,105,99,0,0,0,0,47,103,114,101,121,115,52,47,51,0,0,0,0,0,0,0,110,45,62,99,111,117,110,116,32,43,32,40,42,110,110,41,45,62,99,111,117,110,116,32,61,61,32,78,79,68,69,67,65,82,68,
-32,43,32,49,0,32,108,32,0,0,0,0,0,47,103,114,101,121,115,52,47,50,0,0,0,0,0,0,0,32,80,97,103,101,115,58,32,37,100,10,0,0,0,0,0,47,103,114,101,121,115,52,47,49,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,49,46,52,0,0,0,0,0,101,115,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,120,120,120,0,0,0,0,0,114,101,99,116,0,0,0,0,37,100,0,0,0,0,0,0,47,103,114,101,121,115,51,47,51,0,0,0,0,0,0,0,99,99,32,40,37,100,32,99,101,108,108,115,41,32,97,116,32,40,37,100,44,37,100,41,10,0,0,0,0,0,0,0,112,115,0,0,0,0,0,
-0,49,50,0,0,0,0,0,0,99,111,108,111,114,0,0,0,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,0,102,105,120,101,100,0,0,0,117,110,109,97,116,99,104,101,100,32,39,40,39,32,105,110,32,115,116,121,108,101,58,32,37,115,10,0,0,0,0,0,100,97,114,107,111,114,99,104,105,100,0,0,0,0,0,0,82,105,103,104,116,0,0,0,37,115,32,97,116,116,114,105,98,117,116,101,32,118,97,108,117,101,32,109,117,115,116,32,98,101,32,49,32,111,114,32,50,32,45,32,105,103,110,111,114,105,110,103,10,
-0,0,0,47,103,114,101,121,115,51,47,50,0,0,0,0,0,0,0,98,109,112,0,0,0,0,0,32,32,47,66,111,114,100,101,114,32,91,32,48,32,48,32,48,32,93,10,32,32,47,65,99,116,105,111,110,32,60,60,32,47,83,117,98,116,121,112,101,32,47,85,82,73,32,47,85,82,73,32,37,115,32,62,62,10,32,32,47,83,117,98,116,121,112,101,32,47,76,105,110,107,10,47,65,78,78,32,112,100,102,109,97,114,107,10,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,47,97,99,99,101,110,116,56,47,56,0,0,0,0,0,0,47,103,114,101,121,115,51,47,49,0,0,0,0,0,0,0,47,103,114,
-101,101,110,115,57,47,57,0,0,0,0,0,0,112,97,114,115,101,114,32,115,117,115,112,101,110,100,101,100,0,0,0,0,0,0,0,0,115,118,103,58,100,111,116,0,47,103,114,101,101,110,115,57,47,56,0,0,0,0,0,0,12,0,0,0,0,0,0,0,99,105,114,99,111,0,0,0,120,76,97,121,111,117,116,32,0,0,0,0,0,0,0,0,49,48,48,46,48,48,10,0,47,103,114,101,101,110,115,57,47,55,0,0,0,0,0,0,105,110,112,117,116,115,99,97,108,101,0,0,0,0,0,0,47,103,114,101,101,110,115,57,47,54,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,
-119,45,66,111,108,100,79,98,108,105,113,117,101,0,0,0,0,47,103,114,101,101,110,115,57,47,53,0,0,0,0,0,0,120,100,111,116,0,0,0,0,37,46,48,102,44,37,46,48,102,32,0,0,0,0,0,0,47,103,114,101,101,110,115,57,47,52,0,0,0,0,0,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,111,112,115,0,0,0,0,0,0,32,84,105,116,108,101,58,32,0,0,0,0,0,0,0,0,47,103,114,101,101,110,115,57,47,51,0,0,0,0,0,0,117,32,61,61,32,85,70,95,102,105,110,100,40,117,41,0,120,100,111,116,118,101,114,115,105,111,110,0,0,0,0,0,114,
-117,101,0,0,0,0,0,67,111,117,114,105,101,114,45,79,98,108,105,113,117,101,0,99,111,109,112,111,110,101,110,116,0,0,0,0,0,0,0,37,46,53,103,44,37,46,53,103,44,37,46,53,103,44,37,46,53,103,32,0,0,0,0,102,111,110,116,110,97,109,101,58,32,34,37,115,34,32,114,101,115,111,108,118,101,100,32,116,111,58,32,37,115,10,0,47,103,114,101,101,110,115,57,47,50,0,0,0,0,0,0,98,98,91,37,115,93,32,37,46,53,103,32,37,46,53,103,32,37,46,53,103,32,37,46,53,103,10,0,0,0,0,0,103,100,0,0,0,0,0,0,103,101,116,115,112,108,105,
-110,101,112,111,105,110,116,115,58,32,110,111,32,115,112,108,105,110,101,32,112,111,105,110,116,115,32,97,118,97,105,108,97,98,108,101,32,102,111,114,32,101,100,103,101,32,40,37,115,44,37,115,41,10,0,0,0,49,49,0,0,0,0,0,0,60,70,79,78,84,62,0,0,111,114,116,104,111,0,0,0,100,105,115,116,111,114,116,105,111,110,0,0,0,0,0,0,116,114,117,110,99,97,116,105,110,103,32,115,116,121,108,101,32,39,37,115,39,10,0,0,100,97,114,107,111,114,97,110,103,101,0,0,0,0,0,0,114,32,38,38,32,114,114,0,114,0,0,0,0,0,0,0,115,
-116,114,101,115,115,119,116,0,0,0,0,0,0,0,0,47,103,114,101,101,110,115,57,47,49,0,0,0,0,0,0,115,104,97,112,101,102,105,108,101,0,0,0,0,0,0,0,66,77,0,0,0,0,0,0,32,93,10,0,0,0,0,0,99,95,99,110,116,32,61,61,32,48,0,0,0,0,0,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,99,97,110,110,111,116,32,102,105,110,100,32,78,79,82,77,65,76,32,101,100,103,101,10,0,0,0,0,0,0,0,69,114,114,111,114,32,105,110,105,116,105,97,108,105,122,105,110,103,32,102,111,114,32,100,101,102,108,97,116,105,111,
-110,10,0,0,0,0,0,0,0,99,97,110,39,116,32,102,105,110,100,32,108,105,98,114,97,114,121,32,102,105,108,101,32,37,115,10,0,0,0,0,0,100,101,102,97,117,108,116,32,0,0,0,0,0,0,0,0,102,111,114,99,101,108,97,98,101,108,115,0,0,0,0,0,47,97,99,99,101,110,116,56,47,55,0,0,0,0,0,0,47,103,114,101,101,110,115,56,47,56,0,0,0,0,0,0,115,111,108,105,100,0,0,0,37,115,37,100,32,110,111,100,101,115,32,37,100,32,101,100,103,101,115,32,37,100,32,105,116,101,114,32,37,46,50,102,32,115,101,99,10,0,0,0,115,112,97,110,45,62,
-102,111,110,116,0,0,0,0,0,0,95,110,101,119,95,114,97,110,107,0,0,0,0,0,0,0,45,62,0,0,0,0,0,0,47,103,114,101,101,110,115,56,47,55,0,0,0,0,0,0,105,108,108,101,103,97,108,32,99,104,97,114,97,99,116,101,114,40,115,41,32,105,110,32,112,117,98,108,105,99,32,105,100,0,0,0,0,0,0,0,47,97,99,99,101,110,116,56,47,54,0,0,0,0,0,0,117,115,101,114,111,117,116,58,32,99,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,10,0,0,0,0,0,68,97,109,112,105,110,103,0,103,99,58,32,79,
-117,116,32,111,102,32,109,101,109,111,114,121,10,0,0,0,0,0,0,101,112,115,58,100,111,116,0,47,103,114,101,101,110,115,56,47,54,0,0,0,0,0,0,102,100,112,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,116,97,114,116,61,115,101,108,102,32,45,32,105,103,110,111,114,105,110,103,10,0,0,0,0,0,105,115,32,117,110,100,101,102,105,110,101,100,46,32,82,101,118,101,114,116,105,110,103,32,116,111,32,116,104,101,32,115,104,111,114,116,101,115,116,32,112,97,116,104,32,109,111,100,101,108,46,
-10,0,0,0,0,32,32,0,0,0,0,0,0,48,0,0,0,0,0,0,0,37,46,48,51,102,0,0,0,37,100,0,0,0,0,0,0,76,101,116,116,101,114,10,0,47,103,114,101,101,110,115,56,47,53,0,0,0,0,0,0,37,46,48,51,108,102,32,0,45,45,0,0,0,0,0,0,47,103,114,101,101,110,115,56,47,52,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,0,0,0,0,0,0,0,0,95,99,108,111,110,101,95,37,100,0,0,0,0,0,0,0,47,103,114,101,101,110,115,56,47,51,0,0,0,0,0,0,116,104,101,32,97,115,112,101,99,116,32,97,116,116,114,105,98,117,116,101,32,104,
-97,115,32,98,101,101,110,32,100,105,115,97,98,108,101,100,32,100,117,101,32,116,111,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,102,108,97,119,115,32,45,32,97,116,116,114,105,98,117,116,101,32,105,103,110,111,114,101,100,46,10,0,0,0,0,0,0,0,0,47,103,114,101,101,110,115,56,47,50,0,0,0,0,0,0,109,97,107,101,80,111,108,121,58,32,117,110,107,110,111,119,110,32,115,104,97,112,101,32,116,121,112,101,32,37,115,10,0,0,0,0,0,0,0,0,78,68,95,105,110,40,114,105,103,104,116,41,46,115,105,122,101,
-32,43,32,78,68,95,111,117,116,40,114,105,103,104,116,41,46,115,105,122,101,32,61,61,32,48,0,0,0,0,0,32,109,32,0,0,0,0,0,110,111,32,109,101,109,111,114,121,32,102,114,111,109,32,122,109,97,108,108,111,99,40,41,10,0,0,0,0,0,0,0,47,97,99,99,101,110,116,51,47,50,0,0,0,0,0,0,35,0,0,0,0,0,0,0,47,103,114,101,101,110,115,56,47,49,0,0,0,0,0,0,95,100,114,97,119,95,0,0,112,108,105,110,101,0,0,0,67,111,117,114,105,101,114,45,66,111,108,100,79,98,108,105,113,117,101,0,0,0,0,0,100,105,103,114,97,112,104,0,98,111,
-120,51,100,0,0,0,37,46,50,102,0,0,0,0,82,79,85,78,68,40,71,68,95,98,98,40,103,41,46,76,76,46,120,41,32,61,61,32,48,0,0,0,0,0,0,0,47,103,114,101,101,110,115,55,47,55,0,0,0,0,0,0,99,111,108,117,109,110,32,109,97,106,111,114,0,0,0,0,110,111,110,101,0,0,0,0,49,48,0,0,0,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,65,76,73,71,78,32,45,32,105,103,110,111,114,101,100,10,0,0,0,120,32,97,110,100,32,121,32,115,99,97,108,105,110,103,0,111,114,105,101,110,116,97,116,105,111,
-110,0,0,0,0,0,117,110,109,97,116,99,104,101,100,32,39,41,39,32,105,110,32,115,116,121,108,101,58,32,37,115,10,0,0,0,0,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,0,0,108,97,121,111,117,116,32,97,98,111,114,116,101,100,10,0,47,103,114,101,101,110,115,55,47,54,0,0,0,0,0,0,97,108,105,99,101,98,108,117,101,0,0,0,0,0,0,0,112,115,0,0,0,0,0,0,91,32,47,82,101,99,116,32,91,32,0,0,0,0,0,0,98,97,115,101,32,114,101,102,101,114,101,114,10,0,0,0,47,103,114,101,101,110,115,55,47,53,0,0,0,0,0,0,110,
-0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,103,114,101,101,110,115,55,47,52,0,0,0,0,0,0,116,101,120,116,32,100,101,99,108,97,114,97,116,105,111,110,32,110,111,116,32,119,101,108,108,45,102,111,114,109,101,100,0,0,0,0,0,0,0,0,47,97,99,99,101,110,116,56,47,53,0,0,0,0,0,0,37,115,32,45,62,32,37,115,58,32,104,101,97,100,32,110,111,116,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,0,0,0,0,0,47,103,114,101,101,110,115,55,47,51,0,0,0,
-0,0,0,112,115,58,100,111,116,0,0,47,103,114,101,101,110,115,55,47,50,0,0,0,0,0,0,73,110,99,104,101,115,10,0,32,45,62,32,0,0,0,0,37,108,102,0,0,0,0,0,47,103,114,101,101,110,115,55,47,49,0,0,0,0,0,0,108,105,103,104,116,103,114,101,121,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,79,98,108,105,113,117,101,0,0,0,0,0,0,0,0,109,101,109,111,114,121,32,101,120,104,97,117,115,116,101,100,0,0,0,0,0,0,0,0,47,103,114,101,101,110,115,54,47,54,0,0,0,0,0,0,99,108,117,115,116,101,114,
-0,100,105,109,0,0,0,0,0,97,114,116,105,99,117,108,97,116,105,111,110,95,112,111,115,0,0,0,0,0,0,0,0,60,118,58,112,97,116,104,32,118,61,34,0,0,0,0,0,47,103,114,101,101,110,115,54,47,53,0,0,0,0,0,0,99,111,109,112,111,117,110,100,69,100,103,101,115,58,32,99,111,117,108,100,32,110,111,116,32,99,111,110,115,116,114,117,99,116,32,111,98,115,116,97,99,108,101,115,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,
-0,0,0,0,0,114,111,117,116,101,115,112,108,105,110,101,115,105,110,105,116,58,32,99,97,110,110,111,116,32,97,108,108,111,99,97,116,101,32,112,115,10,0,0,0,32,45,97,110,99,104,111,114,32,101,0,0,0,0,0,0,68,117,109,109,121,61,37,100,10,0,0,0,0,0,0,0,47,103,114,101,101,110,115,54,47,52,0,0,0,0,0,0,114,0,0,0,0,0,0,0,37,100,32,0,0,0,0,0,111,108,121,108,105,110,101,0,67,111,117,114,105,101,114,45,66,111,108,100,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,0,0,0,0,0,103,114,97,112,104,0,0,0,101,112,115,58,
-112,115,0,0,102,111,108,100,101,114,0,0,37,46,53,103,44,37,46,53,103,44,37,46,53,103,44,37,46,53,103,0,0,0,0,0,47,103,114,101,101,110,115,54,47,51,0,0,0,0,0,0,114,111,119,32,109,97,106,111,114,0,0,0,0,0,0,0,115,104,97,112,101,102,105,108,101,0,0,0,0,0,0,0,103,108,111,98,97,108,0,0,57,0,0,0,0,0,0,0,69,78,84,69,82,0,0,0,115,99,97,108,101,120,121,0,115,107,101,119,0,0,0,0,110,101,115,116,105,110,103,32,110,111,116,32,97,108,108,111,119,101,100,32,105,110,32,115,116,121,108,101,58,32,37,115,10,0,0,0,
-0,0,0,0,100,97,114,107,109,97,103,101,110,116,97,0,0,0,0,0,98,0,0,0,0,0,0,0,37,100,32,110,111,100,101,115,32,37,46,50,102,32,115,101,99,10,0,0,0,0,0,0,47,103,114,101,101,110,115,54,47,50,0,0,0,0,0,0,47,112,97,116,104,98,111,120,32,123,10,32,32,32,32,47,88,32,101,120,99,104,32,110,101,103,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,89,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,120,32,101,120,99,104,32,110,101,103,32,37,46,53,103,32,115,117,98,
-32,100,101,102,10,32,32,32,32,47,121,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,110,101,119,112,97,116,104,32,120,32,121,32,109,111,118,101,116,111,10,32,32,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,32,32,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,125,32,100,101,102,10,0,0,37,33,80,83,45,65,100,111,98,101,45,0,0,0,0,0,32,37,115,32,
-97,108,105,103,110,101,100,116,101,120,116,10,0,0,0,0,0,0,0,0,60,47,109,97,112,62,10,0,100,111,116,116,101,100,0,0,47,103,114,101,101,110,115,54,47,49,0,0,0,0,0,0,109,105,110,99,114,111,115,115,46,99,0,0,0,0,0,0,47,103,114,101,101,110,115,53,47,53,0,0,0,0,0,0,88,77,76,32,100,101,99,108,97,114,97,116,105,111,110,32,110,111,116,32,119,101,108,108,45,102,111,114,109,101,100,0,47,97,99,99,101,110,116,56,47,52,0,0,0,0,0,0,106,112,103,58,100,111,116,0,47,103,114,101,101,110,115,53,47,52,0,0,0,0,0,0,47,
-103,114,101,101,110,115,53,47,51,0,0,0,0,0,0,67,101,110,116,101,114,10,0,103,114,97,112,104,32,0,0,47,103,114,101,101,110,115,53,47,50,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,66,111,108,100,0,0,0,58,0,0,0,0,0,0,0,110,101,116,119,111,114,107,32,115,105,109,112,108,101,120,58,32,0,0,0,0,0,0,0,47,103,114,101,101,110,115,53,47,49,0,0,0,0,0,0,37,115,37,115,37,115,0,0,111,117,116,32,111,102,32,109,101,109,111,114,121,10,0,0,32,119,105,100,116,104,58,32,37,100,59,32,104,
-101,105,103,104,116,58,32,37,100,34,32,102,105,108,108,101,100,61,34,102,97,108,115,101,34,62,0,47,103,114,101,101,110,115,52,47,52,0,0,0,0,0,0,32,45,97,110,99,104,111,114,32,119,0,0,0,0,0,0,98,111,120,0,0,0,0,0,47,103,114,101,101,110,115,52,47,51,0,0,0,0,0,0,84,32,0,0,0,0,0,0,114,116,104,111,0,0,0,0,115,104,97,112,101,0,0,0,109,111,110,111,115,112,97,99,101,0,0,0,0,0,0,0,115,117,98,103,114,97,112,104,0,0,0,0,0,0,0,0,116,97,98,0,0,0,0,0,101,44,37,46,53,103,44,37,46,53,103,32,0,0,0,0,34,34,0,0,0,0,
-0,0,47,103,114,101,101,110,115,52,47,50,0,0,0,0,0,0,97,114,114,97,121,32,112,97,99,107,105,110,103,58,32,37,115,32,37,100,32,114,111,119,115,32,37,100,32,99,111,108,117,109,110,115,10,0,0,0,108,111,99,97,108,0,0,0,56,0,0,0,0,0,0,0,69,70,84,0,0,0,0,0,111,108,100,32,115,99,97,108,105,110,103,0,0,0,0,0,112,101,114,105,112,104,101,114,105,101,115,0,0,0,0,0,105,110,32,99,108,117,115,116,101,114,32,37,115,10,0,0,100,97,114,107,107,104,97,107,105,0,0,0,0,0,0,0,105,110,118,105,115,0,0,0,109,97,106,111,114,
-105,122,97,116,105,111,110,10,0,0,0,47,103,114,101,101,110,115,52,47,49,0,0,0,0,0,0,105,110,32,108,97,98,101,108,32,111,102,32,103,114,97,112,104,32,37,115,10,0,0,0,112,110,103,0,0,0,0,0,32,109,111,118,101,116,111,32,0,0,0,0,0,0,0,0,115,116,121,108,101,0,0,0,34,62,10,0,0,0,0,0,47,103,114,101,101,110,115,51,47,51,0,0,0,0,0,0,108,97,98,101,108,0,0,0,47,103,114,101,101,110,115,51,47,50,0,0,0,0,0,0,105,110,99,111,109,112,108,101,116,101,32,109,97,114,107,117,112,32,105,110,32,112,97,114,97,109,101,116,
-101,114,32,101,110,116,105,116,121,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,0,0,0,0,47,97,99,99,101,110,116,56,47,51,0,0,0,0,0,0,95,95,0,0,0,0,0,0,71,68,95,114,97,110,107,40,103,41,91,114,93,46,110,32,60,61,32,71,68,95,114,97,110,107,40,103,41,91,114,93,46,97,110,0,0,0,0,0,106,112,101,58,100,111,116,0,47,103,114,101,101,110,115,51,47,49,0,0,0,0,0,0,104,101,97,100,32,110,111,100,101,32,37,115,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,0,0,0,
-37,115,58,32,0,0,0,0,47,103,110,98,117,57,47,57,0,0,0,0,0,0,0,0,80,111,114,116,114,97,105,116,10,0,0,0,0,0,0,0,116,97,105,108,32,110,111,100,101,32,37,115,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,0,0,0,47,103,110,98,117,57,47,56,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,66,111,108,100,79,98,108,105,113,117,101,0,0,0,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,
-114,32,37,115,10,0,71,68,95,109,105,110,114,97,110,107,40,103,41,32,61,61,32,48,0,0,0,0,0,0,47,103,110,98,117,57,47,55,0,0,0,0,0,0,0,0,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,83,99,97,110,110,105,110,103,32,103,114,97,112,104,32,37,115,44,32,37,100,32,110,111,100,101,115,10,0,0,0,0,32,60,118,58,115,104,97,112,101,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,97,98,115,111,108,
-117,116,101,59,32,0,0,0,0,47,103,110,98,117,57,47,54,0,0,0,0,0,0,0,0,32,37,100,125,0,0,0,0,99,108,117,115,116,101,114,32,99,121,99,108,101,32,37,115,32,45,45,32,37,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,10,0,0,0,47,103,110,98,117,57,47,53,0,0,0,0,0,0,0,0,116,32,37,100,32,0,0,0,111,0,0,0,0,0,0,0,110,97,109,101,0,0,0,0,67,111,117,114,105,101,114,0,110,111,100,101,0,0,0,0,114,0,0,0,0,0,0,0,110,111,116,101,0,0,0,0,115,44,37,46,53,103,44,37,46,53,103,32,0,0,0,0,115,117,98,103,114,97,
-112,104,0,0,0,0,0,0,0,0,47,103,110,98,117,57,47,52,0,0,0,0,0,0,0,0,32,114,49,32,37,102,32,114,50,32,37,102,10,0,0,0,55,0,0,0,0,0,0,0,73,71,72,84,0,0,0,0,111,115,99,97,108,101,0,0,115,105,100,101,115,0,0,0,116,114,97,110,115,112,97,114,101,110,116,0,0,0,0,0,100,97,114,107,103,114,101,121,0,0,0,0,0,0,0,0,122,119,110,106,0,0,0,0,95,99,99,95,0,0,0,0,99,111,110,118,101,114,116,32,103,114,97,112,104,58,32,0,47,103,110,98,117,57,47,51,0,0,0,0,0,0,0,0,137,80,78,71,13,10,26,10,0,0,0,0,0,0,0,0,32,47,37,115,
-32,115,101,116,95,102,111,110,116,10,0,0,122,119,106,0,0,0,0,0,34,47,62,10,0,0,0,0,47,103,110,98,117,57,47,50,0,0,0,0,0,0,0,0,122,101,116,97,0,0,0,0,99,109,97,112,58,109,97,112,0,0,0,0,0,0,0,0,47,103,110,98,117,57,47,49,0,0,0,0,0,0,0,0,109,117,115,116,32,110,111,116,32,117,110,100,101,99,108,97,114,101,32,112,114,101,102,105,120,0,0,0,0,0,0,0,47,97,99,99,101,110,116,56,47,50,0,0,0,0,0,0,121,117,109,108,0,0,0,0,106,112,101,103,58,100,111,116,0,0,0,0,0,0,0,0,47,103,110,98,117,56,47,56,0,0,0,0,0,0,0,
-0,121,101,110,0,0,0,0,0,106,112,101,103,58,115,118,103,0,0,0,0,0,0,0,0,47,103,110,98,117,56,47,55,0,0,0,0,0,0,0,0,35,32,80,97,103,101,115,58,32,37,100,10,0,0,0,0,121,97,99,117,116,101,0,0,47,103,110,98,117,56,47,54,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,79,98,108,105,113,117,101,0,0,0,0,0,0,0,120,105,0,0,0,0,0,0,47,103,110,98,117,56,47,53,0,0,0,0,0,0,0,0,101,100,103,101,0,0,0,0,119,101,105,101,114,112,0,0,32,45,45,62,10,0,0,0,47,103,110,98,117,56,47,52,0,0,0,0,0,0,0,0,34,0,0,0,0,0,0,
-0,117,117,109,108,0,0,0,0,47,103,110,98,117,56,47,51,0,0,0,0,0,0,0,0,70,32,0,0,0,0,0,0,115,111,117,114,99,101,32,112,111,105,110,116,32,110,111,116,32,105,110,32,97,110,121,32,116,114,105,97,110,103,108,101,0,0,0,0,0,0,0,0,111,110,101,0,0,0,0,0,117,112,115,105,108,111,110,0,66,111,111,107,109,97,110,45,76,105,103,104,116,73,116,97,108,105,99,0,0,0,0,0,119,0,0,0,0,0,0,0,111,99,116,97,103,111,110,0,37,46,53,103,32,37,46,53,103,0,0,0,0,0,0,0,100,105,103,114,97,112,104,0,47,103,110,98,117,56,47,50,0,
-0,0,0,0,0,0,0,114,111,111,116,32,37,100,32,40,37,102,41,32,37,100,32,40,37,102,41,10,0,0,0,54,0,0,0,0,0,0,0,98,111,120,0,0,0,0,0,97,108,105,103,110,0,0,0,105,112,115,101,112,0,0,0,111,114,100,101,114,105,110,103,0,0,0,0,0,0,0,0,108,105,103,104,116,103,114,101,121,0,0,0,0,0,0,0,114,101,112,111,115,105,116,105,111,110,32,37,115,10,0,0,100,97,114,107,103,114,101,101,110,0,0,0,0,0,0,0,117,112,115,105,104,0,0,0,97,103,114,111,111,116,32,111,102,32,97,32,98,97,100,32,111,98,106,101,99,116,0,0,109,111,100,
-101,108,32,37,100,32,115,109,97,114,116,95,105,110,105,116,32,37,100,32,115,116,114,101,115,115,119,116,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,37,100,32,116,111,108,32,37,102,10,0,0,0,0,0,0,0,0,47,103,110,98,117,56,47,49,0,0,0,0,0,0,0,0,40,108,105,98,41,0,0,0,32,101,108,108,105,112,115,101,95,112,97,116,104,32,115,116,114,111,107,101,10,0,0,0,117,109,108,0,0,0,0,0,44,37,100,44,37,100,0,0,97,114,101,97,0,0,0,0,47,103,110,98,117,55,47,55,0,0,0,0,0,0,0,0,105,109,97,103,101,115,99,97,
-108,101,0,0,0,0,0,0,83,121,110,116,97,120,32,101,114,114,111,114,58,32,110,111,110,45,115,112,97,99,101,32,115,116,114,105,110,103,32,117,115,101,100,32,98,101,102,111,114,101,32,60,84,65,66,76,69,62,0,0,0,0,0,0,117,103,114,97,118,101,0,0,109,100,115,77,111,100,101,108,58,32,100,101,108,116,97,32,61,32,37,102,10,0,0,0,47,103,110,98,117,55,47,54,0,0,0,0,0,0,0,0,117,110,98,111,117,110,100,32,112,114,101,102,105,120,0,0,114,111,111,116,32,61,32,37,115,10,0,0,0,0,0,0,47,97,99,99,101,110,116,56,47,49,
-0,0,0,0,0,0,117,99,105,114,99,0,0,0,103,105,102,58,100,111,116,0,47,103,110,98,117,55,47,53,0,0,0,0,0,0,0,0,117,97,114,114,0,0,0,0,47,103,110,98,117,55,47,52,0,0,0,0,0,0,0,0,35,32,84,105,116,108,101,58,32,37,115,10,0,0,0,0,117,97,99,117,116,101,0,0,47,103,110,98,117,55,47,51,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,66,111,108,100,0,0,117,65,114,114,0,0,0,0,47,103,110,98,117,55,47,50,0,0,0,0,0,0,0,0,115,104,97,112,101,0,0,0,116,114,97,100,101,0,0,0,32,32,32,32,32,32,60,33,45,45,32,0,0,0,
-0,0,47,103,110,98,117,55,47,49,0,0,0,0,0,0,0,0,32,45,102,111,110,116,32,123,0,0,0,0,0,0,0,0,116,105,109,101,115,0,0,0,47,103,110,98,117,54,47,54,0,0,0,0,0,0,0,0,101,32,0,0,0,0,0,0,105,110,101,0,0,0,0,0,116,105,108,100,101,0,0,0,108,105,103,104,116,0,0,0,116,97,105,108,112,111,114,116,0,0,0,0,0,0,0,0,115,101,112,116,97,103,111,110,0,0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,115,97,109,112,108,101,112,111,105,110,116,115,0,0,0,0,115,116,114,105,99,116,0,0,47,103,110,98,117,
-54,47,53,0,0,0,0,0,0,0,0,97,32,37,102,32,98,32,37,102,32,99,32,37,102,32,100,32,37,102,32,114,32,37,102,10,0,0,0,0,0,0,0,53,0,0,0,0,0,0,0,60,66,82,62,0,0,0,0,118,112,115,99,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,112,104,97,115,101,0,0,0,98,103,99,111,108,111,114,0,100,97,114,107,103,114,97,121,0,0,0,0,0,0,0,0,116,104,111,114,110,0,0,0,110,101,97,116,111,105,110,105,116,46,99,0,0,0,0,0,47,103,110,98,117,54,47,52,0,0,0,0,0,0,0,0,119,101,98,112,0,0,0,0,32,101,108,108,105,112,115,
-101,95,112,97,116,104,32,102,105,108,108,10,0,0,0,0,0,116,104,105,110,115,112,0,0,37,100,44,37,100,0,0,0,47,103,110,98,117,54,47,51,0,0,0,0,0,0,0,0,37,115,32,105,110,32,108,105,110,101,32,37,100,32,10,0,116,104,101,116,97,115,121,109,0,0,0,0,0,0,0,0,47,103,110,98,117,54,47,50,0,0,0,0,0,0,0,0,99,97,110,110,111,116,32,99,104,97,110,103,101,32,115,101,116,116,105,110,103,32,111,110,99,101,32,112,97,114,115,105,110,103,32,104,97,115,32,98,101,103,117,110,0,0,0,0,116,104,101,116,97,0,0,0,112,110,103,58,
-100,111,116,0,47,103,110,98,117,54,47,49,0,0,0,0,0,0,0,0,116,104,101,114,101,52,0,0,47,103,110,98,117,53,47,53,0,0,0,0,0,0,0,0,35,32,71,101,110,101,114,97,116,101,100,32,98,121,32,37,115,32,118,101,114,115,105,111,110,32,37,115,32,40,37,115,41,10,0,0,0,0,0,0,116,97,117,0,0,0,0,0,76,97,121,111,117,116,32,116,121,112,101,58,32,34,37,115,34,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,46,32,85,115,101,32,111,110,101,32,111,102,58,37,115,10,0,0,0,0,0,0,0,0,99,114,111,119,0,0,0,0,47,103,110,
-98,117,53,47,52,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,115,122,108,105,103,0,0,0,110,32,33,61,32,78,68,95,110,101,120,116,40,110,41,0,47,103,110,98,117,53,47,51,0,0,0,0,0,0,0,0,119,105,100,116,104,0,0,0,115,117,112,101,0,0,0,0,121,101,108,108,111,119,0,0,95,115,112,97,110,95,37,100,0,0,0,0,0,0,0,0,47,103,110,98,117,53,47,50,0,0,0,0,0,0,0,0,125,0,0,0,0,0,0,0,47,97,99,99,101,110,116,55,47,55,0,0,0,0,0,0,115,117,112,51,0,0,0,0,47,103,110,98,117,53,47,49,0,0,0,0,0,0,0,0,69,32,
-0,0,0,0,0,0,97,108,115,101,0,0,0,0,115,117,112,50,0,0,0,0,66,111,111,107,109,97,110,45,76,105,103,104,116,0,0,0,104,101,97,100,112,111,114,116,0,0,0,0,0,0,0,0,104,101,120,97,103,111,110,0,114,101,99,111,114,100,0,0,93,59,10,0,0,0,0,0,47,103,110,98,117,52,47,52,0,0,0,0,0,0,0,0,112,105,110,102,111,0,0,0,37,108,102,0,0,0,0,0,52,0,0,0,0,0,0,0,85,115,105,110,103,32,100,101,102,97,117,108,116,32,99,97,108,99,117,108,97,116,105,111,110,32,102,111,114,32,114,111,111,116,32,110,111,100,101,10,0,0,0,0,0,0,
-0,0,73,108,108,101,103,97,108,32,97,116,116,114,105,98,117,116,101,32,37,115,32,105,110,32,37,115,32,45,32,105,103,110,111,114,101,100,10,0,0,0,99,111,109,112,114,101,115,115,0,0,0,0,0,0,0,0,69,68,95,116,111,95,118,105,114,116,40,111,114,105,103,41,32,61,61,32,78,85,76,76,0,0,0,0,0,0,0,0,102,105,108,108,99,111,108,111,114,0,0,0,0,0,0,0,37,115,32,37,115,10,0,0,100,97,114,107,103,111,108,100,101,110,114,111,100,0,0,0,115,117,112,49,0,0,0,0,78,68,95,105,100,40,110,112,41,32,61,61,32,105,0,0,47,103,110,
-98,117,52,47,51,0,0,0,0,0,0,0,0,97,103,116,97,105,108,40,101,41,32,61,61,32,85,70,95,102,105,110,100,40,97,103,116,97,105,108,40,101,41,41,0,87,69,66,80,0,0,0,0,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,0,0,0,0,0,0,0,115,117,112,0,0,0,0,0,37,100,44,37,100,44,37,100,44,37,100,0,0,0,0,0,80,97,99,107,105,110,103,58,32,99,111,109,112,117,116,101,32,103,114,105,100,32,115,105,122,101,10,0,0,0,0,0,47,103,110,98,117,52,47,50,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,115,117,109,0,0,0,0,0,47,
-103,110,98,117,52,47,49,0,0,0,0,0,0,0,0,114,101,113,117,101,115,116,101,100,32,102,101,97,116,117,114,101,32,114,101,113,117,105,114,101,115,32,88,77,76,95,68,84,68,32,115,117,112,112,111,114,116,32,105,110,32,69,120,112,97,116,0,0,0,0,0,115,117,98,101,0,0,0,0,47,97,99,99,101,110,116,55,47,54,0,0,0,0,0,0,115,118,103,58,109,97,112,0,47,103,110,98,117,51,47,51,0,0,0,0,0,0,0,0,115,117,98,0,0,0,0,0,47,103,110,98,117,51,47,50,0,0,0,0,0,0,0,0,115,112,97,100,101,115,0,0,35,70,73,71,32,51,46,50,10,0,0,0,
-0,0,0,0,47,103,110,98,117,51,47,49,0,0,0,0,0,0,0,0,67,111,117,114,105,101,114,45,66,111,108,100,79,98,108,105,113,117,101,0,0,0,0,0,115,105,109,0,0,0,0,0,108,112,32,33,61,32,99,108,112,0,0,0,0,0,0,0,47,100,97,114,107,50,56,47,56,0,0,0,0,0,0,0,115,105,103,109,97,102,0,0,119,104,105,116,101,0,0,0,47,100,97,114,107,50,56,47,55,0,0,0,0,0,0,0,99,111,109,98,105,65,82,32,61,32,37,108,102,10,0,0,32,45,116,101,120,116,32,123,0,0,0,0,0,0,0,0,41,10,0,0,0,0,0,0,115,105,103,109,97,0,0,0,47,100,97,114,107,50,56,
-47,54,0,0,0,0,0,0,0,37,115,37,100,32,45,0,0,111,109,112,111,117,110,100,0,32,40,0,0,0,0,0,0,115,104,121,0,0,0,0,0,66,111,111,107,109,97,110,45,68,101,109,105,73,116,97,108,105,99,0,0,0,0,0,0,107,101,121,0,0,0,0,0,99,111,110,115,116,114,97,105,110,116,46,99,0,0,0,0,112,101,110,116,97,103,111,110,0,0,0,0,0,0,0,0,109,97,120,105,116,101,114,0,37,46,53,103,0,0,0,0,10,0,0,0,0,0,0,0,47,100,97,114,107,50,56,47,53,0,0,0,0,0,0,0,108,105,98,112,97,99,107,58,32,100,105,115,99,32,61,32,37,102,32,40,32,60,32,48,
-41,10,0,0,0,0,0,0,92,78,0,0,0,0,0,0,51,0,0,0,0,0,0,0,115,114,99,0,0,0,0,0,115,99,97,108,105,110,103,0,104,101,105,103,104,116,0,0,112,101,110,99,111,108,111,114,0,0,0,0,0,0,0,0,100,97,114,107,99,121,97,110,0,0,0,0,0,0,0,0,32,118,101,114,115,105,111,110,32,0,0,0,0,0,0,0,115,101,99,116,0,0,0,0,98,111,120,0,0,0,0,0,108,101,110,0,0,0,0,0,47,100,97,114,107,50,56,47,52,0,0,0,0,0,0,0,97,103,104,101,97,100,40,101,41,32,61,61,32,85,70,95,102,105,110,100,40,97,103,104,101,97,100,40,101,41,41,0,115,118,103,
-0,0,0,0,0,99,108,111,115,101,112,97,116,104,32,102,105,108,108,10,0,60,33,45,45,32,71,101,110,101,114,97,116,101,100,32,98,121,32,0,0,0,0,0,0,115,100,111,116,0,0,0,0,37,100,44,37,100,44,37,100,0,0,0,0,0,0,0,0,47,100,97,114,107,50,56,47,51,0,0,0,0,0,0,0,32,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,71,114,97,112,104,105,99,115,47,83,86,71,47,49,46,49,47,68,84,68,47,115,118,103,49,49,46,100,116,100,34,62,10,0,0,0,115,99,97,114,111,110,0,0,98,108,97,99,107,0,0,0,47,100,97,114,
-107,50,56,47,50,0,0,0,0,0,0,0,101,110,116,105,116,121,32,100,101,99,108,97,114,101,100,32,105,110,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,0,0,0,0,0,95,98,97,99,107,103,114,111,117,110,100,0,0,0,0,0,47,37,115,47,37,115,0,0,88,49,49,47,0,0,0,0,105,103,104,116,103,114,101,121,0,0,0,0,0,0,0,0,104,105,116,101,0,0,0,0,60,33,68,79,67,84,89,80,69,32,115,118,103,32,80,85,66,76,73,67,32,34,45,47,47,87,51,67,47,47,68,84,68,32,83,86,71,32,49,46,49,47,47,69,78,34,10,0,115,98,113,117,111,
-0,0,0,108,97,99,107,0,0,0,0,121,101,108,108,111,119,103,114,101,101,110,0,0,0,0,0,47,97,99,99,101,110,116,55,47,53,0,0,0,0,0,0,121,101,108,108,111,119,52,0,101,112,115,58,109,97,112,0,121,101,108,108,111,119,51,0,47,100,97,114,107,50,56,47,49,0,0,0,0,0,0,0,121,101,108,108,111,119,50,0,121,101,108,108,111,119,49,0,121,101,108,108,111,119,0,0,119,104,105,116,101,115,109,111,107,101,0,0,0,0,0,0,119,104,105,116,101,0,0,0,119,104,101,97,116,52,0,0,34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,
-115,34,63,62,10,0,0,0,0,114,115,113,117,111,0,0,0,119,104,101,97,116,51,0,0,119,104,101,97,116,50,0,0,47,100,97,114,107,50,55,47,55,0,0,0,0,0,0,0,119,104,101,97,116,49,0,0,119,104,101,97,116,0,0,0,118,105,111,108,101,116,114,101,100,52,0,0,0,0,0,0,118,105,111,108,101,116,114,101,100,51,0,0,0,0,0,0,118,105,111,108,101,116,114,101,100,50,0,0,0,0,0,0,118,105,111,108,101,116,114,101,100,49,0,0,0,0,0,0,38,103,116,59,0,0,0,0,118,105,111,108,101,116,114,101,100,0,0,0,0,0,0,0,118,105,111,108,101,116,0,0,
-60,63,120,109,108,45,115,116,121,108,101,115,104,101,101,116,32,104,114,101,102,61,34,0,114,115,97,113,117,111,0,0,116,117,114,113,117,111,105,115,101,52,0,0,0,0,0,0,35,32,101,110,100,32,111,102,32,70,73,71,32,102,105,108,101,10,0,0,0,0,0,0,116,117,114,113,117,111,105,115,101,51,0,0,0,0,0,0,116,117,114,113,117,111,105,115,101,50,0,0,0,0,0,0,116,117,114,113,117,111,105,115,101,49,0,0,0,0,0,0,47,100,97,114,107,50,55,47,54,0,0,0,0,0,0,0,116,117,114,113,117,111,105,115,101,0,0,0,0,0,0,0,116,114,97,110,
-115,112,97,114,101,110,116,0,0,0,0,0,116,111,109,97,116,111,52,0,116,111,109,97,116,111,51,0,116,111,109,97,116,111,50,0,67,111,117,114,105,101,114,0,116,111,109,97,116,111,49,0,115,116,121,108,101,115,104,101,101,116,0,0,0,0,0,0,114,108,109,0,0,0,0,0,116,111,109,97,116,111,0,0,116,104,105,115,116,108,101,52,0,0,0,0,0,0,0,0,116,104,105,115,116,108,101,51,0,0,0,0,0,0,0,0,116,104,105,115,116,108,101,50,0,0,0,0,0,0,0,0,47,100,97,114,107,50,55,47,53,0,0,0,0,0,0,0,116,104,105,115,116,108,101,49,0,0,0,
-0,0,0,0,0,116,104,105,115,116,108,101,0,116,97,110,52],"i8",L,l.J+112676);D([0,0,0,0,116,97,110,51,0,0,0,0,116,97,110,50,0,0,0,0,116,97,110,49,0,0,0,0,60,63,120,109,108,32,118,101,114,115,105,111,110,61,34,49,46,48,34,32,101,110,99,111,100,105,110,103,61,34,85,84,70,45,56,34,32,115,116,97,110,100,97,108,111,110,101,61,34,110,111,34,63,62,10,0,114,104,111,0,0,0,0,0,116,97,110,0,0,0,0,0,115,116,101,101,108,98,108,117,101,52,0,0,0,0,0,0,115,116,101,101,108,98,108,117,101,51,0,0,0,0,0,0,116,101,97,108,
-0,0,0,0,115,116,101,101,108,98,108,117,101,50,0,0,0,0,0,0,47,100,97,114,107,50,55,47,52,0,0,0,0,0,0,0,115,116,101,101,108,98,108,117,101,49,0,0,0,0,0,0,115,116,101,101,108,98,108,117,101,0,0,0,0,0,0,0,115,112,114,105,110,103,103,114,101,101,110,52,0,0,0,0,115,112,114,105,110,103,103,114,101,101,110,51,0,0,0,0,32,99,114,101,97,116,101,32,116,101,120,116,32,0,0,0,115,112,114,105,110,103,103,114,101,101,110,50,0,0,0,0,115,112,114,105,110,103,103,114,101,101,110,49,0,0,0,0,32,120,109,108,110,115,58,120,
-108,105,110,107,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,49,57,57,57,47,120,108,105,110,107,34,0,0,0,0,0,114,102,108,111,111,114,0,0,98,0,0,0,0,0,0,0,115,112,114,105,110,103,103,114,101,101,110,0,0,0,0,0,115,110,111,119,52,0,0,0,115,110,111,119,51,0,0,0,115,110,111,119,50,0,0,0,47,100,97,114,107,50,55,47,51,0,0,0,0,0,0,0,115,110,111,119,49,0,0,0,115,110,111,119,0,0,0,0,115,108,97,116,101,103,114,101,121,0,0,0,0,0,0,0,35,32,0,0,0,0,0,0,115,108,97,116,101,103,114,97,121,
-52,0,0,0,0,0,0,37,46,48,51,102,0,0,0,115,108,97,116,101,103,114,97,121,51,0,0,0,0,0,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,111,112,115,0,0,0,0,0,0,0,115,108,97,116,101,103,114,97,121,50,0,0,0,0,0,0,117,114,118,101,100,0,0,0,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,50,48,48,48,47,115,118,103,34,0,0,0,0,0,114,101,103,0,0,0,0,0,115,101,114,105,102,0,0,0,104,114,101,102,0,0,0,0,115,108,97,116,101,103,114,97,121,49,0,0,0,0,0,0,115,108,97,
-116,101,103,114,97,121,0,0,0,0,0,0,0,104,111,117,115,101,0,0,0,99,99,37,115,43,37,100,0,115,108,97,116,101,98,108,117,101,52,0,0,0,0,0,0,37,46,53,103,44,37,46,53,103,0,0,0,0,0,0,0,101,100,103,101,0,0,0,0,115,108,97,116,101,98,108,117,101,51,0,0,0,0,0,0,47,100,97,114,107,50,55,47,50,0,0,0,0,0,0,0,32,32,37,100,32,37,100,32,99,101,108,108,10,0,0,0,115,108,97,116,101,98,108,117,101,50,0,0,0,0,0,0,108,97,98,101,108,0,0,0,50,0,0,0,0,0,0,0,115,108,97,116,101,98,108,117,101,49,0,0,0,0,0,0,115,99,97,108,101,
-0,0,0,115,99,97,108,101,0,0,0,115,108,97,116,101,98,108,117,101,0,0,0,0,0,0,0,116,97,105,108,99,108,105,112,0,0,0,0,0,0,0,0,115,107,121,98,108,117,101,52,0,0,0,0,0,0,0,0,99,111,108,111,114,0,0,0,115,107,121,98,108,117,101,51,0,0,0,0,0,0,0,0,99,108,117,115,116,101,114,0,100,97,114,107,98,108,117,101,0,0,0,0,0,0,0,0,115,107,121,98,108,117,101,50,0,0,0,0,0,0,0,0,32,118,105,101,119,66,111,120,61,34,37,46,50,102,32,37,46,50,102,32,37,46,50,102,32,37,46,50,102,34,0,0,114,101,97,108,0,0,0,0,115,107,121,
-98,108,117,101,49,0,0,0,0,0,0,0,0,100,111,116,115,112,108,105,110,101,115,46,99,0,0,0,0,115,107,121,98,108,117,101,0,115,105,101,110,110,97,52,0,115,105,101,110,110,97,51,0,47,100,97,114,107,50,55,47,49,0,0,0,0,0,0,0,83,111,108,118,105,110,103,32,109,111,100,101,108,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,37,100,32,116,111,108,32,37,102,10,0,0,115,105,101,110,110,97,50,0,115,105,101,110,110,97,49,0,40,78,68,95,85,70,95,115,105,122,101,40,110,41,32,60,61,32,49,41,32,124,124,32,40,110,
-32,61,61,32,108,101,97,100,101,114,41,0,0,0,115,105,101,110,110,97,0,0,115,101,97,115,104,101,108,108,52,0,0,0,0,0,0,0,60,115,118,103,0,0,0,0,32,99,117,114,118,101,116,111,10,0,0,0,0,0,0,0,115,101,97,115,104,101,108,108,51,0,0,0,0,0,0,0,115,101,97,115,104,101,108,108,50,0,0,0,0,0,0,0,60,115,118,103,32,119,105,100,116,104,61,34,37,100,112,116,34,32,104,101,105,103,104,116,61,34,37,100,112,116,34,10,0,0,0,0,0,0,0,0,114,100,113,117,111,0,0,0,75,80,95,76,101,102,116,0,115,101,97,115,104,101,108,108,49,
-0,0,0,0,0,0,0,102,108,97,116,105,110,100,101,120,40,97,103,116,97,105,108,40,101,41,41,32,60,32,77,45,62,110,99,111,108,115,0,115,101,97,115,104,101,108,108,0,0,0,0,0,0,0,0,32,99,111,111,114,100,115,61,34,0,0,0,0,0,0,0,115,101,97,103,114,101,101,110,52,0,0,0,0,0,0,0,115,101,97,103,114,101,101,110,51,0,0,0,0,0,0,0,47,100,97,114,107,50,54,47,54,0,0,0,0,0,0,0,115,101,97,103,114,101,101,110,50,0,0,0,0,0,0,0,115,101,97,103,114,101,101,110,49,0,0,0,0,0,0,0,115,101,97,103,114,101,101,110,0,0,0,0,0,0,0,0,
-115,97,110,100,121,98,114,111,119,110,0,0,0,0,0,0,115,97,108,109,111,110,52,0,115,97,108,109,111,110,51,0,32,80,97,103,101,115,58,32,37,100,32,45,45,62,10,0,114,99,101,105,108,0,0,0,115,97,108,109,111,110,50,0,115,97,108,109,111,110,49,0,115,97,108,109,111,110,0,0,115,97,100,100,108,101,98,114,111,119,110,0,0,0,0,0,47,100,97,114,107,50,54,47,53,0,0,0,0,0,0,0,117,110,101,120,112,101,99,116,101,100,32,112,97,114,115,101,114,32,115,116,97,116,101,32,45,32,112,108,101,97,115,101,32,115,101,110,100,32,
-97,32,98,117,103,32,114,101,112,111,114,116,0,0,0,0,0,0,114,111,121,97,108,98,108,117,101,52,0,0,0,0,0,0,114,111,121,97,108,98,108,117,101,51,0,0,0,0,0,0,114,111,121,97,108,98,108,117,101,50,0,0,0,0,0,0,114,111,121,97,108,98,108,117,101,49,0,0,0,0,0,0,114,111,121,97,108,98,108,117,101,0,0,0,0,0,0,0,114,111,115,121,98,114,111,119,110,52,0,0,0,0,0,0,32,84,105,116,108,101,58,32,0,0,0,0,0,0,0,0,114,97,114,114,0,0,0,0,114,111,115,121,98,114,111,119,110,51,0,0,0,0,0,0,114,111,115,121,98,114,111,119,110,
-50,0,0,0,0,0,0,114,111,115,121,98,114,111,119,110,49,0,0,0,0,0,0,47,97,99,99,101,110,116,55,47,52,0,0,0,0,0,0,112,115,58,109,97,112,0,0,114,111,115,121,98,114,111,119,110,0,0,0,0,0,0,0,47,100,97,114,107,50,54,47,52,0,0,0,0,0,0,0,114,101,100,52,0,0,0,0,114,101,100,51,0,0,0,0,114,101,100,50,0,0,0,0,114,101,100,49,0,0,0,0,116,119,111,112,105,0,0,0,114,101,100,0,0,0,0,0,112,117,114,112,108,101,52,0,60,33,45,45,0,0,0,0,114,97,113,117,111,0,0,0,112,117,114,112,108,101,51,0,112,117,114,112,108,101,50,0,
-112,117,114,112,108,101,49,0,112,117,114,112,108,101,0,0,47,100,97,114,107,50,54,47,51,0,0,0,0,0,0,0,112,111,119,100,101,114,98,108,117,101,0,0,0,0,0,0,112,108,117,109,52,0,0,0,112,108,117,109,51,0,0,0,112,108,117,109,50,0,0,0,112,108,117,109,49,0,0,0,112,108,117,109,0,0,0,0,60,47,115,118,103,62,10,0,114,97,110,103,0,0,0,0,111,118,101,114,108,97,112,0,112,105,110,107,52,0,0,0,112,105,110,107,51,0,0,0,37,48,51,111,0,0,0,0,112,105,110,107,50,0,0,0,112,105,110,107,49,0,0,0,47,100,97,114,107,50,54,47,
-50,0,0,0,0,0,0,0,112,105,110,107,0,0,0,0,112,101,114,117,0,0,0,0,112,101,97,99,104,112,117,102,102,52,0,0,0,0,0,0,112,101,97,99,104,112,117,102,102,51,0,0,0,0,0,0,112,101,97,99,104,112,117,102,102,50,0,0,0,0,0,0,67,111,117,114,105,101,114,45,66,111,108,100,0,0,0,0,112,101,97,99,104,112,117,102,102,49,0,0,0,0,0,0,34,32,99,108,97,115,115,61,34,108,97,121,101,114,34,62,10,0,0,0,0,0,0,0,114,97,100,105,99,0,0,0,112,101,97,99,104,112,117,102,102,0,0,0,0,0,0,0,112,97,112,97,121,97,119,104,105,112,0,0,0,
-0,0,0,47,100,97,114,107,50,54,47,49,0,0,0,0,0,0,0,112,97,108,101,118,105,111,108,101,116,114,101,100,52,0,0,112,97,108,101,118,105,111,108,101,116,114,101,100,51,0,0,112,97,108,101,118,105,111,108,101,116,114,101,100,50,0,0,112,97,108,101,118,105,111,108,101,116,114,101,100,49,0,0,112,97,108,101,118,105,111,108,101,116,114,101,100,0,0,0,112,97,108,101,116,117,114,113,117,111,105,115,101,52,0,0,85,82,76,0,0,0,0,0,112,97,108,101,116,117,114,113,117,111,105,115,101,51,0,0,100,111,116,0,0,0,0,0,112,97,
-108,101,116,117,114,113,117,111,105,115,101,50,0,0,32,116,114,97,110,115,102,111,114,109,61,34,115,99,97,108,101,40,37,103,32,37,103,41,32,114,111,116,97,116,101,40,37,100,41,32,116,114,97,110,115,108,97,116,101,40,37,103,32,37,103,41,34,62,10,0,114,65,114,114,0,0,0,0,112,97,108,101,116,117,114,113,117,111,105,115,101,49,0,0,112,97,108,101,116,117,114,113,117,111,105,115,101,0,0,0,112,97,108,101,103,114,101,101,110,52,0,0,0,0,0,0,115,105,108,118,101,114,0,0,112,97,108,101,103,114,101,101,110,51,0,
-0,0,0,0,0,47,100,97,114,107,50,53,47,53,0,0,0,0,0,0,0,108,105,98,112,97,116,104,47,37,115,58,37,100,58,32,37,115,10,0,0,0,0,0,0,112,97,108,101,103,114,101,101,110,50,0,0,0,0,0,0,112,97,108,101,103,114,101,101,110,49,0,0,0,0,0,0,112,97,108,101,103,114,101,101,110,0,0,0,0,0,0,0,112,97,108,101,103,111,108,100,101,110,114,111,100,0,0,0,32,99,114,101,97,116,101,32,111,118,97,108,32,0,0,0,111,114,99,104,105,100,52,0,111,114,99,104,105,100,51,0,34,32,99,108,97,115,115,61,34,103,114,97,112,104,34,0,113,117,
-111,116,0,0,0,0,111,114,99,104,105,100,50,0,111,114,99,104,105,100,49,0,111,114,99,104,105,100,0,0,111,114,97,110,103,101,114,101,100,52,0,0,0,0,0,0,47,100,97,114,107,50,53,47,52,0,0,0,0,0,0,0,111,114,97,110,103,101,114,101,100,51,0,0,0,0,0,0,111,114,97,110,103,101,114,101,100,50,0,0,0,0,0,0,117,116,105,108,115,46,99,0,111,114,97,110,103,101,114,101,100,49,0,0,0,0,0,0,111,114,97,110,103,101,114,101,100,0,0,0,0,0,0,0,50,32,0,0,0,0,0,0,111,114,97,110,103,101,52,0,111,114,97,110,103,101,51,0,73,110,
-118,97,108,105,100,32,37,100,45,98,121,116,101,32,85,84,70,56,32,102,111,117,110,100,32,105,110,32,105,110,112,117,116,32,111,102,32,103,114,97,112,104,32,37,115,32,45,32,116,114,101,97,116,101,100,32,97,115,32,76,97,116,105,110,45,49,46,32,80,101,114,104,97,112,115,32,34,45,71,99,104,97,114,115,101,116,61,108,97,116,105,110,49,34,32,105,115,32,110,101,101,100,101,100,63,10,0,0,0,0,34,32,99,108,97,115,115,61,34,99,108,117,115,116,101,114,34,62,0,0,0,0,0,0,112,115,105,0,0,0,0,0,85,82,87,32,66,111,
-111,107,109,97,110,32,76,0,0,0,111,114,97,110,103,101,50,0,103,114,97,112,104,118,105,122,0,0,0,0,0,0,0,0,111,114,97,110,103,101,49,0,112,97,114,97,108,108,101,108,111,103,114,97,109,0,0,0,103,114,97,112,104,32,37,115,44,32,99,111,111,114,100,32,37,115,44,32,101,120,112,101,99,116,101,100,32,102,111,117,114,32,100,111,117,98,108,101,115,10,0,0,0,0,0,0,98,97,100,32,101,100,103,101,32,108,101,110,32,34,37,115,34,0,0,0,0,0,0,0,111,114,97,110,103,101,0,0,44,37,46,53,103,0,0,0,102,111,110,116,45,62,110,
-97,109,101,0,0,0,0,0,0,110,111,100,101,0,0,0,0,111,108,105,118,101,100,114,97,98,52,0,0,0,0,0,0,47,100,97,114,107,50,53,47,51,0,0,0,0,0,0,0,37,115,32,110,111,46,32,99,101,108,108,115,32,37,100,32,87,32,37,100,32,72,32,37,100,10,0,0,0,0,0,0,111,108,105,118,101,100,114,97,98,51,0,0,0,0,0,0,80,45,62,101,110,100,46,116,104,101,116,97,32,60,32,50,32,42,32,77,95,80,73,0,49,0,0,0,0,0,0,0,111,108,105,118,101,100,114,97,98,50,0,0,0,0,0,0,60,73,77,71,62,0,0,0,86,111,114,111,110,111,105,0,111,108,105,118,101,
-100,114,97,98,49,0,0,0,0,0,0,108,97,98,101,108,102,111,110,116,115,105,122,101,0,0,0,111,108,105,118,101,100,114,97,98,0,0,0,0,0,0,0,35,102,56,102,56,102,56,0,111,108,100,108,97,99,101,0,110,111,110,101,0,0,0,0,99,121,97,110,0,0,0,0,34,32,99,108,97,115,115,61,34,110,111,100,101,34,62,0,112,114,111,112,0,0,0,0,110,97,118,121,98,108,117,101,0,0,0,0,0,0,0,0,110,97,118,121,0,0,0,0,47,100,97,114,107,50,53,47,50,0,0,0,0,0,0,0,110,97,118,97,106,111,119,104,105,116,101,52,0,0,0,0,110,45,62,108,101,118,101,
-108,32,62,61,32,48,0,0,0,110,97,118,97,106,111,119,104,105,116,101,51,0,0,0,0,116,104,101,32,103,114,97,112,104,32,105,110,116,111,32,99,111,110,110,101,99,116,101,100,32,99,111,109,112,111,110,101,110,116,115,46,10,0,0,0,110,97,118,97,106,111,119,104,105,116,101,50,0,0,0,0,110,97,118,97,106,111,119,104,105,116,101,49,0,0,0,0,114,97,110,107,46,99,0,0,115,104,97,112,101,115,46,99,0,0,0,0,0,0,0,0,110,97,118,97,106,111,119,104,105,116,101,0,0,0,0,0,109,111,99,99,97,115,105,110,0,0,0,0,0,0,0,0,37,37,
-37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,0,0,0,0,115,116,114,111,107,101,10,0,99,99,37,115,95,37,100,0,99,97,110,110,111,116,32,114,101,45,97,108,108,111,99,97,116,101,32,112,115,10,0,0,109,105,115,116,121,114,111,115,101,52,0,0,0,0,0,0,109,105,115,116,121,114,111,115,101,51,0,0,0,0,0,0,95,37,115,0,0,0,0,0,112,114,111,100,0,0,0,0,108,97,98,101,108,58,32,97,114,101,97,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,114,116,114,101,101,10,0,0,
-0,0,0,0,0,0,10,0,0,0,0,0,0,0,109,105,115,116,121,114,111,115,101,50,0,0,0,0,0,0,102,108,97,116,105,110,100,101,120,40,97,103,104,101,97,100,40,101,41,41,32,60,32,77,45,62,110,114,111,119,115,0,109,105,115,116,121,114,111,115,101,49,0,0,0,0,0,0,108,111,115,116,32,37,115,32,37,115,32,101,100,103,101,10,0,0,0,0,0,0,0,0,32,97,108,116,61,34,34,0,109,105,115,116,121,114,111,115,101,0,0,0,0,0,0,0,109,105,110,116,99,114,101,97,109,0,0,0,0,0,0,0,47,100,97,114,107,50,53,47,49,0,0,0,0,0,0,0,109,105,100,110,
-105,103,104,116,98,108,117,101,0,0,0,0,109,101,100,105,117,109,118,105,111,108,101,116,114,101,100,0,110,111,100,101,32,0,0,0,109,101,100,105,117,109,116,117,114,113,117,111,105,115,101,0,37,100,32,0,0,0,0,0,109,101,100,105,117,109,115,112,114,105,110,103,103,114,101,101,110,0,0,0,0,0,0,0,109,101,100,105,117,109,115,108,97,116,101,98,108,117,101,0,109,101,100,105,117,109,115,101,97,103,114,101,101,110,0,0,60,47,116,105,116,108,101,62,10,0,0,0,0,0,0,0,112,114,105,109,101,0,0,0,49,46,50,46,53,0,0,0,
-109,101,100,105,117,109,112,117,114,112,108,101,52,0,0,0,105,110,32,108,97,98,101,108,32,111,102,32,101,100,103,101,32,37,115,32,37,115,32,37,115,10,0,0,0,0,0,0,109,101,100,105,117,109,112,117,114,112,108,101,51,0,0,0,109,101,100,105,117,109,112,117,114,112,108,101,50,0,0,0,109,101,100,105,117,109,112,117,114,112,108,101,49,0,0,0,47,100,97,114,107,50,52,47,52,0,0,0,0,0,0,0,100,111,99,117,109,101,110,116,32,105,115,32,110,111,116,32,115,116,97,110,100,97,108,111,110,101,0,0,0,0,0,0,109,101,100,105,
-117,109,112,117,114,112,108,101,0,0,0,0,87,97,114,110,105,110,103,0,109,101,100,105,117,109,111,114,99,104,105,100,52,0,0,0,101,112,115,105,108,111,110,0,109,101,100,105,117,109,111,114,99,104,105,100,51,0,0,0,109,101,100,105,117,109,111,114,99,104,105,100,50,0,0,0,109,101,100,105,117,109,111,114,99,104,105,100,49,0,0,0,109,101,100,105,117,109,111,114,99,104,105,100,0,0,0,0,92,69,0,0,0,0,0,0,112,111,117,110,100,0,0,0,109,101,100,105,117,109,98,108,117,101,0,0,0,0,0,0,65,103,114,97,112,104,105,110,
-102,111,95,116,0,0,0,0,99,111,109,112,111,117,110,100,0,0,0,0,0,0,0,0,109,101,100,105,117,109,97,113,117,97,109,97,114,105,110,101,0,0,0,0,0,0,0,0,109,97,114,111,111,110,52,0,109,97,114,111,111,110,51,0,106,112,103,58,109,97,112,0,35,37,50,120,37,50,120,37,50,120,37,50,120,0,0,0,47,100,97,114,107,50,52,47,51,0,0,0,0,0,0,0,109,97,114,111,111,110,50,0,109,97,114,111,111,110,49,0,109,97,114,111,111,110,0,0,109,97,103,101,110,116,97,52,0,0,0,0,0,0,0,0,109,97,103,101,110,116,97,51,0,0,0,0,0,0,0,0,109,
-97,103,101,110,116,97,50,0,0,0,0,0,0,0,0,60,116,105,116,108,101,62,0,112,108,117,115,109,110,0,0,109,97,103,101,110,116,97,49,0,0,0,0,0,0,0,0,37,115,32,58,32,37,102,32,37,102,32,37,102,32,37,102,10,0,0,0,0,0,0,0,103,114,97,112,104,32,105,115,32,100,105,115,99,111,110,110,101,99,116,101,100,46,32,72,101,110,99,101,44,32,116,104,101,32,99,105,114,99,117,105,116,32,109,111,100,101,108,10,0,0,0,0,0,0,0,0,109,97,103,101,110,116,97,0,37,115,32,99,111,111,114,100,32,37,46,53,103,32,37,46,53,103,32,104,116,
-32,37,102,32,119,105,100,116,104,32,37,102,10,0,0,0,0,0,0,98,108,97,99,107,0,0,0,108,105,110,101,110,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,0,0,0,0,108,105,109,101,103,114,101,101,110,0,0,0,0,0,0,0,47,100,97,114,107,50,52,47,50,0,0,0,0,0,0,0,82,97,110,107,32,115,101,112,97,114,97,116,105,111,110,32,61,32,0,0,0,0,0,0,108,105,103,104,116,121,101,108,108,111,119,52,0,0,0,0,108,105,103,104,116,121,101,108,108,111,119,51,0,0,0,0,108,105,103,104,116,121,101,108,108,111,119,50,0,0,0,0,108,105,
-103,104,116,121,101,108,108,111,119,49,0,0,0,0,108,105,103,104,116,121,101,108,108,111,119,0,0,0,0,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,52,0,34,32,99,108,97,115,115,61,34,101,100,103,101,34,62,0,112,105,118,0,0,0,0,0,84,48,0,0,0,0,0,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,51,0,109,97,107,101,83,112,108,105,110,101,58,32,102,97,105,108,101,100,32,116,111,32,109,97,107,101,32,115,112,108,105,110,101,32,101,100,103,101,32,40,37,115,44,37,115,41,10,0,108,105,103,104,
-116,115,116,101,101,108,98,108,117,101,50,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,49,0,60,47,72,84,77,76,62,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,46,52,102,32,37,100,32,37,46,49,102,32,37,46,49,102,32,37,100,32,37,100,32,37,115,92,48,48,49,10,0,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,0,0,47,100,97,114,107,50,52,47,49,0,0,0,0,0,0,0,108,105,103,104,116,115,108,97,116,101,103,114,101,121,0,0,108,105,103,104,116,115,108,97,116,
-101,103,114,97,121,0,0,108,105,103,104,116,115,108,97,116,101,98,108,117,101,0,0,108,105,103,104,116,115,107,121,98,108,117,101,52,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,108,105,103,104,116,115,107,121,98,108,117,101,51,0,0,0,84,105,109,101,115,45,66,111,108,100,73,116,97,108,105,99,0,0,0,0,0,0,0,0,108,105,103,104,116,115,107,121,98,108,117,101,50,0,0,0,60,103,32,105,100,61,34,0,112,105,0,0,0,0,0,0,108,105,103,104,116,115,107,121,98,108,117,101,49,0,0,0,108,105,103,104,116,115,
-107,121,98,108,117,101,0,0,0,0,108,105,103,104,116,115,101,97,103,114,101,101,110,0,0,0,108,105,103,104,116,115,97,108,109,111,110,52,0,0,0,0,47,100,97,114,107,50,51,47,51,0,0,0,0,0,0,0,108,105,103,104,116,115,97,108,109,111,110,51,0,0,0,0,108,105,103,104,116,115,97,108,109,111,110,50,0,0,0,0,108,97,98,101,108,102,111,110,116,110,97,109,101,0,0,0,108,105,103,104,116,115,97,108,109,111,110,49,0,0,0,0,108,105,103,104,116,115,97,108,109,111,110,0,0,0,0,0,37,108,102,44,37,100,0,0,108,105,103,104,116,
-112,105,110,107,52,0,0,0,0,0,0,109,97,107,101,65,100,100,80,111,108,121,58,32,117,110,107,110,111,119,110,32,115,104,97,112,101,32,116,121,112,101,32,37,115,10,0,0,0,0,0,108,105,103,104,116,112,105,110,107,51,0,0,0,0,0,0,62,10,0,0,0,0,0,0,112,104,105,0,0,0,0,0,50,48,49,52,48,49,49,49,46,50,51,49,53,0,0,0,108,105,103,104,116,112,105,110,107,50,0,0,0,0,0,0,108,105,103,104,116,112,105,110,107,49,0,0,0,0,0,0,108,105,103,104,116,112,105,110,107,0,0,0,0,0,0,0,32,32,34,37,115,34,10,0,108,105,103,104,116,
-103,114,101,121,0,0,0,0,0,0,0,47,100,97,114,107,50,51,47,50,0,0,0,0,0,0,0,114,101,100,0,0,0,0,0,108,105,103,104,116,103,114,97,121,0,0,0,0,0,0,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,121,101,108,108,111,119,0,0,0,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,52,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,51,0,32,45,111,117,116,108,105,110,101,32,0,0,0,0,0,0,47,100,97,114,107,50,51,47,49,0,0,0,0,0,0,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,
-50,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,49,0,47,97,99,99,101,110,116,55,47,51,0,0,0,0,0,0,32,116,97,114,103,101,116,61,34,0,0,0,0,0,0,0,112,101,114,112,0,0,0,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,0,0,100,101,103,101,110,101,114,97,116,101,32,99,111,110,99,101,110,116,114,97,116,101,100,32,114,97,110,107,32,37,115,44,37,100,10,0,0,0,0,0,108,105,103,104,116,99,121,97,110,52,0,0,0,0,0,0,108,105,103,104,116,99,121,97,110,51,0,0,0,0,0,0,108,105,103,104,116,99,121,
-97,110,50,0,0,0,0,0,0,47,97,99,99,101,110,116,51,47,49,0,0,0,0,0,0,108,105,103,104,116,99,121,97,110,49,0,0,0,0,0,0,108,105,103,104,116,99,121,97,110,0,0,0,0,0,0,0,108,105,103,104,116,99,111,114,97,108,0,0,0,0,0,0,108,105,103,104,116,98,108,117,101,52,0,0,0,0,0,0,67,32,0,0,0,0,0,0,108,105,103,104,116,98,108,117,101,51,0,0,0,0,0,0,108,105,103,104,116,98,108,117,101,50,0,0,0,0,0,0,85,84,70,56,32,99,111,100,101,115,32,62,32,52,32,98,121,116,101,115,32,97,114,101,32,110,111,116,32,99,117,114,114,101,
-110,116,108,121,32,115,117,112,112,111,114,116,101,100,32,40,103,114,97,112,104,32,37,115,41,32,45,32,116,114,101,97,116,101,100,32,97,115,32,76,97,116,105,110,45,49,46,32,80,101,114,104,97,112,115,32,34,45,71,99,104,97,114,115,101,116,61,108,97,116,105,110,49,34,32,105,115,32,110,101,101,100,101,100,63,10,0,0,0,0,0,0,0,0,32,120,108,105,110,107,58,116,105,116,108,101,61,34,0,0,112,101,114,109,105,108,0,0,66,111,111,107,109,97,110,45,68,101,109,105,0,0,0,0,45,45,0,0,0,0,0,0,108,105,103,104,116,98,
-108,117,101,49,0,0,0,0,0,0,108,105,103,104,116,98,108,117,101,0,0,0,0,0,0,0,116,114,97,112,101,122,105,117,109,0,0,0,0,0,0,0,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,37,99,0,0,0,0,0,0,0,37,108,102,0,0,0,0,0,47,98,117,112,117,57,47,57,0,0,0,0,0,0,0,0,108,101,109,111,110,99,104,105,102,102,111,110,52,0,0,0,37,46,53,103,44,37,46,53,103,44,37,46,53,103,0,0,103,114,97,112,104,0,0,0,108,101,109,111,110,99,104,105,102,102,111,110,51,0,0,0,99,99,32,40,37,100,32,99,101,108,108,115,41,32,97,116,
-32,40,37,100,44,37,100,41,32,40,37,100,44,37,100,41,10,0,0,0,0,0,0,0,79,114,116,104,111,103,111,110,97,108,32,101,100,103,101,115,32,110,111,116,32,121,101,116,32,115,117,112,112,111,114,116,101,100,10,0,0,0,0,0,108,101,109,111,110,99,104,105,102,102,111,110,50,0,0,0,48,0,0,0,0,0,0,0,108,101,109,111,110,99,104,105,102,102,111,110,49,0,0,0,85,110,107,110,111,119,110,32,72,84,77,76,32,101,108,101,109,101,110,116,32,60,37,115,62,32,111,110,32,108,105,110,101,32,37,100,32,10,0,0,118,111,114,111,110,111,
-105,0,108,101,109,111,110,99,104,105,102,102,111,110,0,0,0,0,105,112,0,0,0,0,0,0,108,97,119,110,103,114,101,101,110,0,0,0,0,0,0,0,99,111,110,99,101,110,116,114,97,116,101,61,116,114,117,101,32,109,97,121,32,110,111,116,32,119,111,114,107,32,99,111,114,114,101,99,116,108,121,46,10,0,0,0,0,0,0,0,35,49,48,49,48,49,48,0,108,97,118,101,110,100,101,114,98,108,117,115,104,52,0,0,108,97,118,101,110,100,101,114,98,108,117,115,104,51,0,0,99,114,105,109,115,111,110,0,32,120,108,105,110,107,58,104,114,101,102,
-61,34,0,0,0,112,97,114,116,0,0,0,0,108,97,118,101,110,100,101,114,98,108,117,115,104,50,0,0,108,97,118,101,110,100,101,114,98,108,117,115,104,49,0,0,108,97,118,101,110,100,101,114,98,108,117,115,104,0,0,0,108,97,118,101,110,100,101,114,0,0,0,0,0,0,0,0,47,98,117,112,117,57,47,56,0,0,0,0,0,0,0,0,65,108,116,101,114,110,97,116,105,118,101,108,121,44,32,99,111,110,115,105,100,101,114,32,114,117,110,110,105,110,103,32,110,101,97,116,111,32,117,115,105,110,103,32,45,71,112,97,99,107,61,116,114,117,101,32,
-111,114,32,100,101,99,111,109,112,111,115,105,110,103,10,0,107,104,97,107,105,52,0,0,107,104,97,107,105,51,0,0,108,101,97,100,101,114,32,33,61,32,78,85,76,76,0,0,107,104,97,107,105,50,0,0,115,118,103,122,58,115,118,103,0,0,0,0,0,0,0,0,107,104,97,107,105,49,0,0,37,37,66,111,117,110,100,105,110,103,66,111,120,58,0,0,32,108,105,110,101,116,111,10,0,0,0,0,0,0,0,0,107,104,97,107,105,0,0,0,105,118,111,114,121,52,0,0,60,97,0,0,0,0,0,0,112,97,114,97,0,0,0,0,105,118,111,114,121,51,0,0,105,118,111,114,121,
-50,0,0,78,68,95,114,97,110,107,40,118,41,32,61,61,32,114,0,32,116,105,116,108,101,61,34,0,0,0,0,0,0,0,0,105,118,111,114,121,49,0,0,105,118,111,114,121,0,0,0,47,98,117,112,117,57,47,55,0,0,0,0,0,0,0,0,105,110,118,105,115,0,0,0,105,110,100,105,103,111,0,0,105,110,100,105,97,110,114,101,100,52,0,0,0,0,0,0,105,110,100,105,97,110,114,101,100,51,0,0,0,0,0,0,105,110,100,105,97,110,114,101,100,50,0,0,0,0,0,0,105,110,100,105,97,110,114,101,100,49,0,0,0,0,0,0,32,105,100,61,34,97,95,0,111,117,109,108,0,0,0,
-0,105,110,100,105,97,110,114,101,100,0,0,0,0,0,0,0,104,111,116,112,105,110,107,52,0,0,0,0,0,0,0,0,104,111,116,112,105,110,107,51,0,0,0,0,0,0,0,0,104,111,116,112,105,110,107,50,0,0,0,0,0,0,0,0,47,98,117,112,117,57,47,54,0,0,0,0,0,0,0,0,101,114,114,111,114,32,105,110,32,112,114,111,99,101,115,115,105,110,103,32,101,120,116,101,114,110,97,108,32,101,110,116,105,116,121,32,114,101,102,101,114,101,110,99,101,0,0,0,104,111,116,112,105,110,107,49,0,0,0,0,0,0,0,0,104,111,116,112,105,110,107,0,104,111,110,
-101,121,100,101,119,52,0,0,0,0,0,0,0,104,111,110,101,121,100,101,119,51,0,0,0,0,0,0,0,104,111,110,101,121,100,101,119,50,0,0,0,0,0,0,0,104,111,110,101,121,100,101,119,49,0,0,0,0,0,0,0,60,103,0,0,0,0,0,0,111,116,105,109,101,115,0,0,104,111,110,101,121,100,101,119,0,0,0,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,116,111,111,32,109,97,110,121,32,40,62,32,37,100,41,32,115,97,109,101,123,104,101,97,100,44,116,97,105,108,125,32,103,114,111,117,112,115,32,102,111,114,32,110,111,100,
-101,32,37,115,10,0,0,0,0,0,103,114,101,121,57,57,0,0,103,114,101,121,57,56,0,0,106,112,101,58,109,97,112,0,103,114,101,121,57,55,0,0,47,98,117,112,117,57,47,53,0,0,0,0,0,0,0,0,103,114,101,121,57,54,0,0,98,111,116,104,0,0,0,0,103,114,101,121,57,53,0,0,103,114,101,121,57,52,0,0,103,114,101,121,57,51,0,0,103,114,101,121,57,50,0,0,103,114,101,121,57,49,0,0,60,47,103,62,10,0,0,0,111,116,105,108,100,101,0,0,103,114,101,121,57,48,0,0,37,115,32,45,62,32,37,115,58,32,115,112,108,105,110,101,32,115,105,122,
-101,32,62,32,49,32,110,111,116,32,115,117,112,112,111,114,116,101,100,10,0,0,0,0,0,0,0,0,103,114,101,121,57,0,0,0,47,98,117,112,117,57,47,52,0,0,0,0,0,0,0,0,103,114,101,121,56,57,0,0,103,114,101,121,56,56,0,0,103,114,101,121,56,55,0,0,9,0,0,0,0,0,0,0,103,114,101,121,56,54,0,0,37,108,102,44,37,108,102,37,99,0,0,0,0,0,0,0,103,114,101,121,56,53,0,0,103,114,101,121,56,52,0,0,103,114,101,121,56,51,0,0,103,114,101,121,56,50,0,0,60,47,97,62,10,0,0,0,111,115,108,97,115,104,0,0,103,114,101,121,56,49,0,0,103,
-114,101,121,56,48,0,0,103,114,101,121,56,0,0,0,103,114,101,121,55,57,0,0,47,98,117,112,117,57,47,51,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,103,114,101,121,55,56,0,0,103,114,101,121,55,55,0,0,103,114,101,121,55,54,0,0,103,114,101,121,55,53,0,0,103,114,101,121,55,52,0,0,84,105,109,101,115,45,66,111,108,100,0,0,0,0,0,0,103,114,101,121,55,51,0,0,60,47,116,101,120,116,62,10,0,0,0,0,0,0,0,0,111,114,100,109,0,0,0,0,103,114,101,121,55,50,0,0,103,114,101,121,55,49,0,0,103,114,101,121,55,48,0,0,103,114,101,121,55,
-0,0,0,47,98,117,112,117,57,47,50,0,0,0,0,0,0,0,0,103,114,101,121,54,57,0,0,103,114,101,121,54,56,0,0,103,114,101,121,54,55,0,0,77,97,120,114,97,110,107,32,61,32,37,100,44,32,109,105,110,114,97,110,107,32,61,32,37,100,10,0,0,0,0,0,103,114,101,121,54,54,0,0,103,114,101,121,54,53,0,0,103,114,101,121,54,52,0,0,62,0,0,0,0,0,0,0,111,114,100,102,0,0,0,0,103,114,101,121,54,51,0,0,103,114,101,121,54,50,0,0,103,114,101,121,54,49,0,0,103,114,101,121,54,48,0,0,47,98,117,112,117,57,47,49,0,0,0,0,0,0,0,0,112,117,
-114,112,108,101,0,0,103,114,101,121,54,0,0,0,103,114,101,121,53,57,0,0,103,114,101,121,53,56,0,0,103,114,101,121,53,55,0,0,119,104,105,116,101,0,0,0,103,114,101,121,53,54,0,0,103,114,101,121,53,53,0,0,32,102,105,108,108,61,34,35,37,48,50,120,37,48,50,120,37,48,50,120,34,0,0,0,103,114,101,121,53,52,0,0,111,114,0,0,0,0,0,0,104,101,105,103,104,116,0,0,47,97,99,99,101,110,116,55,47,50,0,0,0,0,0,0,97,100,100,105,110,103,32,37,100,32,105,116,101,109,115,44,32,116,111,116,97,108,32,97,114,101,97,32,61,32,
-37,102,44,32,119,32,61,32,37,102,44,32,97,114,101,97,47,119,61,37,102,10,0,0,0,0,109,105,110,100,105,115,116,0,103,114,101,121,53,51,0,0,103,114,101,121,53,50,0,0,65,82,61,37,48,46,52,108,102,9,32,65,114,101,97,61,32,37,48,46,52,108,102,9,0,0,0,0,0,0,0,0,103,114,101,121,53,49,0,0,47,98,117,112,117,56,47,56,0,0,0,0,0,0,0,0,103,114,101,121,53,48,0,0,103,114,101,121,53,0,0,0,103,114,101,121,52,57,0,0,117,115,45,62,110,97,109,101,0,0,0,0,0,0,0,0,103,114,101,121,52,56,0,0,115,101,116,108,105,110,101,119,
-105,100,116,104,0,0,0,0,103,114,101,121,52,55,0,0,103,114,101,121,52,54,0,0,37,100,0,0,0,0,0,0,32,102,105,108,108,61,34,37,115,34,0,0,0,0,0,0,111,112,108,117,115,0,0,0,65,118,97,110,116,71,97,114,100,101,45,68,101,109,105,79,98,108,105,113,117,101,0,0,45,62,0,0,0,0,0,0,103,114,101,121,52,53,0,0,112,115,50,58,112,115,0,0,103,114,101,121,52,52,0,0,100,105,97,109,111,110,100,0,95,112,111,114,116,95,37,115,95,40,37,100,41,95,40,37,100,41,95,37,108,100,0,0,32,105,110,32,37,115,32,45,32,115,101,116,116,
-105,110,103,32,116,111,32,37,46,48,50,102,10,0,0,0,0,0,0,103,114,101,121,52,51,0,0,98,98,0,0,0,0,0,0,37,100,32,37,49,91,34,93,37,110,0,0,0,0,0,0,103,114,101,121,52,50,0,0,47,98,117,112,117,56,47,55,0,0,0,0,0,0,0,0,112,111,115,91,37,100,93,32,37,100,32,37,100,10,0,0,103,114,101,121,52,49,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,103,114,101,121,52,48,0,0,73,77,71,0,0,0,0,0,103,114,101,121,52,0,0,0,110,111,110,101,0,0,0,0,111,117,116,32,111,102,32,100,121,110,97,109,105,99,32,109,101,
-109,111,114,121,32,105,110,32,97,97,103,95,99,114,101,97,116,101,95,98,117,102,102,101,114,40,41,0,0,0,0,108,97,98,101,108,95,102,108,111,97,116,0,0,0,0,0,103,114,101,121,51,57,0,0,35,102,48,102,48,102,48,0,103,114,101,121,51,56,0,0,32,102,111,110,116,45,115,105,122,101,61,34,37,46,50,102,34,0,0,0,0,0,0,0,115,101,103,35,37,100,32,58,32,40,37,46,51,102,44,32,37,46,51,102,41,32,40,37,46,51,102,44,32,37,46,51,102,41,10,0,0,0,0,0,103,114,101,121,51,55,0,0,115,118,103,0,0,0,0,0,99,111,114,110,115,105,
-108,107,0,0,0,0,0,0,0,0,111,109,105,99,114,111,110,0,76,97,121,111,117,116,32,116,121,112,101,58,32,34,37,115,34,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,46,32,85,115,101,32,111,110,101,32,111,102,58,37,115,10,0,0,0,0,0,0,0,0,103,114,101,121,51,54,0,0,103,114,101,121,51,53,0,0,103,114,101,121,51,52,0,0,103,114,101,121,51,51,0,0,47,98,117,112,117,56,47,54,0,0,0,0,0,0,0,0,123,10,0,0,0,0,0,0,105,115,32,117,110,100,101,102,105,110,101,100,46,32,82,101,118,101,114,116,105,110,103,32,116,
-111,32,116,104,101,32,115,104,111,114,116,101,115,116,32,112,97,116,104,32,109,111,100,101,108,46,10,0,0,0,0,103,114,101,121,51,50,0,0,103,114,101,121,51,49,0,0,108,101,118,101,108,32,110,111,100,101,32,114,101,99,0,0,103,114,101,121,51,48,0,0,103,114,101,121,51,0,0,0,40,91,97,45,122,93,91,97,45,122,65,45,90,93,42,41,61,34,40,91,94,34,93,42,41,34,0,0,0,0,0,0,32,109,111,118,101,116,111,10,0,0,0,0,0,0,0,0,103,114,101,121,50,57,0,0,32,98,97,115,101,108,105,110,101,45,115,104,105,102,116,61,34,115,117,
-98,34,0,0,0,103,114,101,121,50,56,0,0,37,37,37,37,67,114,101,97,116,111,114,58,32,37,115,32,118,101,114,115,105,111,110,32,37,115,32,40,37,115,41,10,0,0,0,0,0,0,0,0,111,109,101,103,97,0,0,0,114,32,38,38,32,110,0,0,103,114,101,121,50,55,0,0,103,114,101,121,50,54,0,0,99,111,110,115,116,114,97,105,110,105,110,103,95,102,108,97,116,95,101,100,103,101,40,103,44,118,44,101,41,32,61,61,32,70,65,76,83,69,0,0,100,97,115,104,101,100,0,0,32,116,97,114,103,101,116,61,34,0,0,0,0,0,0,0,103,114,101,121,50,53,0,
-0,103,114,101,121,50,52,0,0,47,98,117,112,117,56,47,53,0,0,0,0,0,0,0,0,103,114,101,121,50,51,0,0,103,114,101,121,50,50,0,0,103,114,101,121,50,49,0,0,103,114,101,121,50,48,0,0,103,114,101,121,50,0,0,0,32,98,97,115,101,108,105,110,101,45,115,104,105,102,116,61,34,115,117,112,101,114,34,0,103,114,101,121,49,57,0,0,32,69,80,83,70,45,51,46,48,10,0,0,0,0,0,0,111,108,105,110,101,0,0,0,103,114,101,121,49,56,0,0,99,108,117,115,116,101,114,46,99,0,0,0,0,0,0,0,103,114,101,121,49,55,0,0,47,98,117,112,117,56,
-47,52,0,0,0,0,0,0,0,0,103,114,101,121,49,54,0,0,103,114,101,121,49,53,0,0,117,110,99,108,111,115,101,100,32,67,68,65,84,65,32,115,101,99,116,105,111,110,0,0,103,114,101,121,49,52,0,0,103,114,101,121,49,51,0,0,103,114,101,121,49,50,0,0,103,114,101,121,49,49,0,0,103,114,101,121,49,48,48,0,103,114,101,121,49,48,0,0,37,33,80,83,45,65,100,111,98,101,45,51,46,48,0,0,111,103,114,97,118,101,0,0,103,114,101,121,49,0,0,0,103,114,101,121,48,0,0,0,103,114,101,121,0,0,0,0,103,114,101,101,110,121,101,108,108,111,
-119,0,0,0,0,0,47,98,117,112,117,56,47,51,0,0,0,0,0,0,0,0,106,112,101,103,58,109,97,112,0,0,0,0,0,0,0,0,103,114,101,101,110,52,0,0,103,114,101,101,110,51,0,0,98,97,99,107,0,0,0,0,103,114,101,101,110,50,0,0,103,114,101,101,110,49,0,0,103,114,101,101,110,0,0,0,44,0,0,0,0,0,0,0,103,114,97,121,57,57,0,0,37,37,69,79,70,10,0,0,111,101,108,105,103,0,0,0,103,114,97,121,57,56,0,0,103,114,97,121,57,55,0,0,103,114,97,121,57,54,0,0,103,114,97,121,57,53,0,0,47,98,117,112,117,56,47,50,0,0,0,0,0,0,0,0,103,114,97,
-121,57,52,0,0,103,114,97,121,57,51,0,0,103,114,97,121,57,50,0,0,103,114,97,121,57,49,0,0,103,114,97,121,57,48,0,0,37,115,108,105,110,101,45,116,104,114,111,117,103,104,0,0,103,114,97,121,57,0,0,0,101,110,100,10,114,101,115,116,111,114,101,10,0,0,0,0,111,99,105,114,99,0,0,0,103,114,97,121,56,57,0,0,103,114,97,121,56,56,0,0,103,114,97,121,56,55,0,0,103,114,97,121,56,54,0,0,47,98,117,112,117,56,47,49,0,0,0,0,0,0,0,0,103,114,97,121,56,53,0,0,37,100,32,37,100,32,35,37,48,50,120,37,48,50,120,37,48,50,120,
-10,0,0,0,0,103,114,97,121,56,52,0,0,103,114,97,121,56,51,0,0,103,114,97,121,56,50,0,0,103,114,97,121,56,49,0,0,65,118,97,110,116,71,97,114,100,101,45,68,101,109,105,79,98,108,105,113,117,101,0,0,117,110,100,101,114,108,105,110,101,0,0,0,0,0,0,0,103,114,97,121,56,48,0,0,37,37,37,37,80,97,103,101,115,58,32,37,100,10,0,0,111,97,99,117,116,101,0,0,103,114,97,121,56,0,0,0,103,114,97,121,55,57,0,0,103,114,97,121,55,56,0,0,103,114,97,121,55,55,0,0,47,98,117,112,117,55,47,55,0,0,0,0,0,0,0,0,103,114,97,121,
-55,54,0,0,103,114,97,121,55,53,0,0,103,114,97,121,55,52,0,0,103,114,97,121,55,51,0,0,103,114,97,121,55,50,0,0,32,116,101,120,116,45,100,101,99,111,114,97],"i8",L,l.J+122916);D([116,105,111,110,61,34,0,0,0,0,0,0,103,114,97,121,55,49,0,0,37,37,84,114,97,105,108,101,114,10,0,0,0,0,0,0,110,117,0,0,0,0,0,0,103,114,97,121,55,48,0,0,103,114,97,121,55,0,0,0,103,114,97,121,54,57,0,0,103,114,97,121,54,56,0,0,47,98,117,112,117,55,47,54,0,0,0,0,0,0,0,0,111,108,105,118,101,0,0,0,103,114,97,121,54,55,0,0,103,114,
-97,121,54,54,0,0,103,114,97,121,54,53,0,0,103,114,97,121,54,52,0,0,32,99,114,101,97,116,101,32,112,111,108,121,103,111,110,32,0,0,0,0,0,0,0,0,103,114,97,121,54,51,0,0,32,102,111,110,116,45,115,116,121,108,101,61,34,105,116,97,108,105,99,34,0,0,0,0,103,114,97,121,54,50,0,0,37,37,69,110,100,83,101,116,117,112,0,0,0,0,0,0,110,116,105,108,100,101,0,0,103,114,97,121,54,49,0,0,103,114,97,121,54,48,0,0,47,97,99,99,101,110,116,55,47,49,0,0,0,0,0,0,103,114,97,121,54,0,0,0,103,114,97,121,53,57,0,0,47,98,117,
-112,117,55,47,53,0,0,0,0,0,0,0,0,103,114,97,121,53,56,0,0,103,114,97,121,53,55,0,0,103,114,97,121,53,54,0,0,103,114,97,121,53,53,0,0,98,111,108,100,0,0,0,0,103,114,97,121,53,52,0,0,32,102,111,110,116,45,119,101,105,103,104,116,61,34,98,111,108,100,34,0,0,0,0,0,103,114,97,121,53,51,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,125,32,105,102,0,0,0,0,110,115,117,98,0,0,0,0,98,111,108,100,0,0,0,0,116,111,111,108,116,105,112,0,103,114,97,121,53,50,0,0,103,114,97,121,53,49,0,0,112,108,97,105,
-110,116,101,120,116,0,0,0,0,0,0,0,95,112,111,114,116,95,37,115,95,37,115,95,37,115,95,37,108,100,0,0,0,0,0,0,67,97,108,99,117,108,97,116,105,110,103,32,115,104,111,114,116,101,115,116,32,112,97,116,104,115,58,32,0,0,0,0,103,114,97,121,53,48,0,0,108,104,101,105,103,104,116,0,92,76,0,0,0,0,0,0,103,114,97,121,53,0,0,0,47,98,117,112,117,55,47,52,0,0,0,0,0,0,0,0,103,114,97,121,52,57,0,0,45,45,0,0,0,0,0,0,103,114,97,121,52,56,0,0,86,82,0,0,0,0,0,0,103,114,97,121,52,55,0,0,111,118,101,114,108,97,112,95,
-115,99,97,108,105,110,103,0,104,101,97,100,99,108,105,112,0,0,0,0,0,0,0,0,103,114,97,121,52,54,0,0,35,101,48,101,48,101,48,0,103,114,97,121,52,53,0,0,32,102,111,110,116,45,102,97,109,105,108,121,61,34,37,115,34,0,0,0,0,0,0,0,103,114,97,121,52,52,0,0,32,32,32,32,117,115,101,114,100,105,99,116,32,40,62,62,41,32,99,118,110,32,40,91,41,32,99,118,110,32,108,111,97,100,32,112,117,116,0,0,99,111,114,110,102,108,111,119,101,114,98,108,117,101,0,0,110,111,116,105,110,0,0,0,103,114,97,121,52,51,0,0,103,114,
-97,121,52,50,0,0,103,114,97,121,52,49,0,0,103,114,97,121,52,48,0,0,47,98,117,112,117,55,47,51,0,0,0,0,0,0,0,0,103,114,97,112,104,32,0,0,103,114,97,112,104,32,37,115,32,105,115,32,100,105,115,99,111,110,110,101,99,116,101,100,46,32,72,101,110,99,101,44,32,116,104,101,32,99,105,114,99,117,105,116,32,109,111,100,101,108,10,0,0,0,0,0,103,114,97,121,52,0,0,0,103,114,97,121,51,57,0,0,108,101,118,101,108,32,101,100,103,101,32,114,101,99,0,0,103,114,97,121,51,56,0,0,103,114,97,121,51,55,0,0,109,109,0,0,0,
-0,0,0,110,101,119,112,97,116,104,32,0,0,0,0,0,0,0,0,103,114,97,121,51,54,0,0,32,102,111,110,116,45,115,116,121,108,101,61,34,37,115,34,0,0,0,0,0,0,0,0,103,114,97,121,51,53,0,0,32,32,32,32,117,115,101,114,100,105,99,116,32,40,60,60,41,32,99,118,110,32,40,91,41,32,99,118,110,32,108,111,97,100,32,112,117,116,0,0,108,105,110,101,0,0,0,0,110,111,116,0,0,0,0,0,103,114,97,121,51,52,0,0,103,114,97,121,51,51,0,0,109,105,110,99,114,111,115,115,58,32,112,97,115,115,32,37,100,32,105,116,101,114,32,37,100,32,
-116,114,121,105,110,103,32,37,100,32,99,117,114,95,99,114,111,115,115,32,37,100,32,98,101,115,116,95,99,114,111,115,115,32,37,100,10,0,32,104,114,101,102,61,34,0,103,114,97,121,51,50,0,0,103,114,97,121,51,49,0,0,47,98,117,112,117,55,47,50,0,0,0,0,0,0,0,0,103,114,97,121,51,48,0,0,103,114,97,121,51,0,0,0,103,114,97,121,50,57,0,0,103,114,97,121,50,56,0,0,103,114,97,121,50,55,0,0,32,102,111,110,116,45,115,116,114,101,116,99,104,61,34,37,115,34,0,0,0,0,0,0,103,114,97,121,50,54,0,0,50,32,108,116,32,123,
-0,0,110,105,0,0,0,0,0,0,103,114,97,121,50,53,0,0,103,114,97,121,50,52,0,0,103,114,97,121,50,51,0,0,103,114,97,121,50,50,0,0,47,98,117,112,117,55,47,49,0,0,0,0,0,0,0,0,101,110,99,111,100,105,110,103,32,115,112,101,99,105,102,105,101,100,32,105,110,32,88,77,76,32,100,101,99,108,97,114,97,116,105,111,110,32,105,115,32,105,110,99,111,114,114,101,99,116,0,0,0,0,0,0,111,117,116,32,111,102,32,109,101,109,111,114,121,0,0,0,103,114,97,121,50,49,0,0,103,114,97,121,50,48,0,0,103,114,97,121,50,0,0,0,103,114,
-97,121,49,57,0,0,103,114,97,121,49,56,0,0,32,102,111,110,116,45,119,101,105,103,104,116,61,34,37,115,34,0,0,0,0,0,0,0,103,114,97,121,49,55,0,0,47,108,97,110,103,117,97,103,101,108,101,118,101,108,32,119,104,101,114,101,32,123,112,111,112,32,108,97,110,103,117,97,103,101,108,101,118,101,108,125,123,49,125,32,105,102,101,108,115,101,0,0,0,0,0,0,110,101,0,0,0,0,0,0,103,114,97,121,49,54,0,0,103,114,97,121,49,53,0,0,103,114,97,121,49,52,0,0,103,114,97,121,49,51,0,0,47,98,117,112,117,54,47,54,0,0,0,0,0,
-0,0,0,103,105,102,58,109,97,112,0,103,114,97,121,49,50,0,0,103,114,97,121,49,49,0,0,103,114,97,121,49,48,48,0,102,111,114,119,97,114,100,0,103,114,97,121,49,48,0,0,103,114,97,121,49,0,0,0,44,37,115,0,0,0,0,0,103,114,97,121,48,0,0,0,37,32,109,97,107,101,32,39,60,60,39,32,97,110,100,32,39,62,62,39,32,115,97,102,101,32,111,110,32,80,83,32,76,101,118,101,108,32,49,32,100,101,118,105,99,101,115,0,110,100,97,115,104,0,0,0,103,114,97,121,0,0,0,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,
-32,108,105,110,101,32,37,100,58,32,37,115,32,37,115,32,114,97,110,107,32,37,100,32,105,32,61,32,37,100,32,97,110,32,61,32,48,10,0,0,103,111,108,100,101,110,114,111,100,52,0,0,0,0,0,0,103,111,108,100,101,110,114,111,100,51,0,0,0,0,0,0,103,111,108,100,101,110,114,111,100,50,0,0,0,0,0,0,47,98,117,112,117,54,47,53,0,0,0,0,0,0,0,0,103,111,108,100,101,110,114,111,100,49,0,0,0,0,0,0,103,111,108,100,101,110,114,111,100,0,0,0,0,0,0,0,103,111,108,100,52,0,0,0,103,111,108,100,51,0,0,0,103,111,108,100,50,0,0,
-0,32,102,111,110,116,45,102,97,109,105,108,121,61,34,37,115,0,0,0,0,0,0,0,0,103,111,108,100,49,0,0,0,47,112,100,102,109,97,114,107,32,119,104,101,114,101,32,123,112,111,112,125,32,123,117,115,101,114,100,105,99,116,32,47,112,100,102,109,97,114,107,32,47,99,108,101,97,114,116,111,109,97,114,107,32,108,111,97,100,32,112,117,116,125,32,105,102,101,108,115,101,0,0,0,110,98,115,112,0,0,0,0,112,101,110,100,32,100,105,99,116,111,102,32,97,32,98,97,100,32,111,98,106,101,99,116,0,0,0,0,0,0,0,0,103,111,108,
-100,0,0,0,0,103,104,111,115,116,119,104,105,116,101,0,0,0,0,0,0,103,97,105,110,115,98,111,114,111,0,0,0,0,0,0,0,102,111,114,101,115,116,103,114,101,101,110,0,0,0,0,0,47,98,117,112,117,54,47,52,0,0,0,0,0,0,0,0,102,108,111,114,97,108,119,104,105,116,101,0,0,0,0,0,102,105,114,101,98,114,105,99,107,52,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,51,102,32,37,100,32,37,46,52,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,
-37,100,32,37,100,10,0,0,0,0,0,0,0,0,102,105,114,101,98,114,105,99,107,51,0,0,0,0,0,0,102,105,114,101,98,114,105,99,107,50,0,0,0,0,0,0,102,105,114,101,98,114,105,99,107,49,0,0,0,0,0,0,65,118,97,110,116,71,97,114,100,101,45,66,111,111,107,0,32,120,61,34,37,103,34,32,121,61,34,37,103,34,0,0,102,105,114,101,98,114,105,99,107,0,0,0,0,0,0,0,37,32,109,97,107,101,32,115,117,114,101,32,112,100,102,109,97,114,107,32,105,115,32,104,97,114,109,108,101,115,115,32,102,111,114,32,80,83,45,105,110,116,101,114,112,
-114,101,116,101,114,115,32,111,116,104,101,114,32,116,104,97,110,32,68,105,115,116,105,108,108,101,114,0,0,0,0,0,0,0,0,110,97,98,108,97,0,0,0,100,111,100,103,101,114,98,108,117,101,52,0,0,0,0,0,100,111,100,103,101,114,98,108,117,101,51,0,0,0,0,0,100,111,100,103,101,114,98,108,117,101,50,0,0,0,0,0,100,111,100,103,101,114,98,108,117,101,49,0,0,0,0,0,47,98,117,112,117,54,47,51,0,0,0,0,0,0,0,0,100,111,100,103,101,114,98,108,117,101,0,0,0,0,0,0,100,105,109,103,114,101,121,0,100,105,109,103,114,97,121,
-0,102,111,110,116,115,105,122,101,0,0,0,0,0,0,0,0,100,101,101,112,115,107,121,98,108,117,101,52,0,0,0,0,100,101,101,112,115,107,121,98,108,117,101,51,0,0,0,0,32,116,101,120,116,45,97,110,99,104,111,114,61,34,109,105,100,100,108,101,34,0,0,0,100,101,101,112,115,107,121,98,108,117,101,50,0,0,0,0,37,32,47,97,114,114,111,119,119,105,100,116,104,32,53,32,100,101,102,0,0,0,0,0,109,117,0,0,0,0,0,0,100,101,101,112,115,107,121,98,108,117,101,49,0,0,0,0,102,108,97,116,46,99,0,0,100,101,101,112,115,107,121,
-98,108,117,101,0,0,0,0,0,100,101,101,112,112,105,110,107,52,0,0,0,0,0,0,0,100,101,101,112,112,105,110,107,51,0,0,0,0,0,0,0,47,98,117,112,117,54,47,50,0,0,0,0,0,0,0,0,110,97,118,121,0,0,0,0,100,101,101,112,112,105,110,107,50,0,0,0,0,0,0,0,100,101,101,112,112,105,110,107,49,0,0,0,0,0,0,0,100,101,101,112,112,105,110,107,0,0,0,0,0,0,0,0,100,97,114,107,118,105,111,108,101,116,0,0,0,0,0,0,32,45,115,109,111,111,116,104,32,98,101,122,105,101,114,32,0,0,0,0,0,0,0,0,100,97,114,107,116,117,114,113,117,111,105,
-115,101,0,0,0,32,116,101,120,116,45,97,110,99,104,111,114,61,34,101,110,100,34,0,0,0,0,0,0,100,97,114,107,115,108,97,116,101,103,114,101,121,0,0,0,37,32,47,97,114,114,111,119,108,101,110,103,116,104,32,49,48,32,100,101,102,0,0,0,109,105,110,117,115,0,0,0,100,97,114,107,115,108,97,116,101,103,114,97,121,52,0,0,100,97,114,107,115,108,97,116,101,103,114,97,121,51,0,0,100,97,114,107,115,108,97,116,101,103,114,97,121,50,0,0,47,97,99,99,101,110,116,54,47,54,0,0,0,0,0,0,100,97,114,107,115,108,97,116,101,
-103,114,97,121,49,0,0,47,98,117,112,117,54,47,49,0,0,0,0,0,0,0,0,100,97,114,107,115,108,97,116,101,103,114,97,121,0,0,0,100,97,114,107,115,108,97,116,101,98,108,117,101,0,0,0,100,97,114,107,115,101,97,103,114,101,101,110,52,0,0,0,100,97,114,107,115,101,97,103,114,101,101,110,51,0,0,0,102,105,108,108,101,100,0,0,100,97,114,107,115,101,97,103,114,101,101,110,50,0,0,0,32,116,101,120,116,45,97,110,99,104,111,114,61,34,115,116,97,114,116,34,0,0,0,0,100,97,114,107,115,101,97,103,114,101,101,110,49,0,0,
-0,95,95,99,108,117,115,116,101,114,110,111,100,101,115,0,0,49,32,115,101,116,109,105,116,101,114,108,105,109,105,116,0,109,105,100,100,111,116,0,0,100,101,109,105,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,100,97,114,107,115,101,97,103,114,101,101,110,0,0,0,0,100,97,114,107,115,97,108,109,111,110,0,0,0,0,0,0,110,111,110,101,0,0,0,0,110,111,100,101,32,34,37,115,34,32,105,115,32,99,111,110,116,97,105,110,101,100,32,105,110,32,116,119,111,32,110,111,110,45,99,111,109,112,97,114,97,
-98,108,101,32,99,108,117,115,116,101,114,115,32,34,37,115,34,32,97,110,100,32,34,37,115,34,10,0,0,0,0,101,110,100,32,112,111,114,116,58,32,40,37,46,53,103,44,32,37,46,53,103,41,44,32,116,97,110,103,101,110,116,32,97,110,103,108,101,58,32,37,46,53,103,44,32,37,115,10,0,0,0,0,0,0,0,0,115,116,117,102,102,46,99,0,100,97,114,107,111,114,99,104,105,100,52,0,0,0,0,0,108,119,105,100,116,104,0,0,92,84,0,0,0,0,0,0,32,115,112,108,105,116,115,32,105,110,116,111,32,116,119,111,32,116,111,107,101,110,115,10,0,
-0,0,0,0,0,0,0,100,97,114,107,111,114,99,104,105,100,51,0,0,0,0,0,47,98,117,112,117,53,47,53,0,0,0,0,0,0,0,0,115,116,101,112,32,115,105,122,101,32,61,32,37,100,10,0,100,97,114,107,111,114,99,104,105,100,50,0,0,0,0,0,45,62,0,0,0,0,0,0,100,97,114,107,111,114,99,104,105,100,49,0,0,0,0,0,72,82,0,0,0,0,0,0,100,97,114,107,111,114,99,104,105,100,0,0,0,0,0,0,37,100,0,0,0,0,0,0,100,97,114,107,111,114,97,110,103,101,52,0,0,0,0,0,78,68,95,114,97,110,107,40,102,114,111,109,41,32,60,32,78,68,95,114,97,110,107,
-40,116,111,41,0,0,0,0,0,35,101,56,101,56,101,56,0,100,97,114,107,111,114,97,110,103,101,51,0,0,0,0,0,60,116,101,120,116,0,0,0,100,97,114,107,111,114,97,110,103,101,50,0,0,0,0,0,49,52,32,100,101,102,97,117,108,116,45,102,111,110,116,45,102,97,109,105,108,121,32,115,101,116,95,102,111,110,116,0,109,105,99,114,111,0,0,0,99,111,114,97,108,0,0,0,100,97,114,107,111,114,97,110,103,101,49,0,0,0,0,0,100,97,114,107,111,114,97,110,103,101,0,0,0,0,0,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,52,
-0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,51,0,47,98,117,112,117,53,47,52,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,109,97,120,105,116,101,114,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,50,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,49,0,115,97,109,101,0,0,0,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,0,0,100,97,114,107,107,104,97,107,105,0,0,0,0,0,0,0,99,109,0,0,0,0,0,0,10,0,0,0,0,0,0,0,100,97,114,107,103,114,101,101,110,0,0,0,0,0,0,0,47,62,10,0,0,0,
-0,0,100,97,114,107,103,111,108,100,101,110,114,111,100,52,0,0,37,37,66,101,103,105,110,83,101,116,117,112,0,0,0,0,109,100,97,115,104,0,0,0,100,97,114,107,103,111,108,100,101,110,114,111,100,51,0,0,100,97,114,107,103,111,108,100,101,110,114,111,100,50,0,0,109,101,114,103,101,50,58,32,103,114,97,112,104,32,37,115,44,32,114,97,110,107,32,37,100,32,104,97,115,32,111,110,108,121,32,37,100,32,60,32,37,100,32,110,111,100,101,115,10,0,0,0,0,0,0,0,100,97,114,107,103,111,108,100,101,110,114,111,100,49,0,0,
-34,0,0,0,0,0,0,0,100,97,114,107,103,111,108,100,101,110,114,111,100,0,0,0,47,98,117,112,117,53,47,51,0,0,0,0,0,0,0,0,99,121,97,110,52,0,0,0,99,121,97,110,51,0,0,0,99,121,97,110,50,0,0,0,99,121,97,110,49,0,0,0,99,121,97,110,0,0,0,0,32,114,120,61,34,37,103,34,32,114,121,61,34,37,103,34,0,0,0,0,0,0,0,0,99,114,105,109,115,111,110,0,37,37,69,110,100,80,114,111,108,111,103,0,0,0,0,0,109,97,99,114,0,0,0,0,99,111,114,110,115,105,108,107,52,0,0,0,0,0,0,0,115,97,109,101,104,101,97,100,0,0,0,0,0,0,0,0,99,111,
-114,110,115,105,108,107,51,0,0,0,0,0,0,0,99,111,114,110,115,105,108,107,50,0,0,0,0,0,0,0,99,111,114,110,115,105,108,107,49,0,0,0,0,0,0,0,47,98,117,112,117,53,47,50,0,0,0,0,0,0,0,0,117,110,107,110,111,119,110,32,101,110,99,111,100,105,110,103,0,0,0,0,0,0,0,0,99,111,114,110,115,105,108,107,0,0,0,0,0,0,0,0,99,111,114,110,102,108,111,119,101,114,98,108,117,101,0,0,99,111,114,97,108,52,0,0,99,111,114,97,108,51,0,0,99,111,114,97,108,50,0,0,32,99,120,61,34,37,103,34,32,99,121,61,34,37,103,34,0,0,0,0,0,0,
-0,0,99,111,114,97,108,49,0,0,105,115,109,97,112,58,109,97,112,0,0,0,0,0,0,0,108,116,0,0,0,0,0,0,99,111,114,97,108,0,0,0,99,104,111,99,111,108,97,116,101,52,0,0,0,0,0,0,37,37,69,110,100,82,101,115,111,117,114,99,101,0,0,0,99,104,111,99,111,108,97,116,101,51,0,0,0,0,0,0,99,104,111,99,111,108,97,116,101,50,0,0,0,0,0,0,47,98,117,112,117,53,47,49,0,0,0,0,0,0,0,0,112,110,103,58,109,97,112,0,99,104,111,99,111,108,97,116,101,49,0,0,0,0,0,0,99,104,111,99,111,108,97,116,101,0,0,0,0,0,0,0,99,104,97,114,116,
-114,101,117,115,101,52,0,0,0,0,0,99,104,97,114,116,114,101,117,115,101,51,0,0,0,0,0,105,110,118,101,109,112,116,121,0,0,0,0,0,0,0,0,99,104,97,114,116,114,101,117,115,101,50,0,0,0,0,0,60,101,108,108,105,112,115,101,0,0,0,0,0,0,0,0,99,104,97,114,116,114,101,117,115,101,49,0,0,0,0,0,47,99,117,114,108,97,121,101,114,32,48,32,100,101,102,0,108,115,113,117,111,0,0,0,99,104,97,114,116,114,101,117,115,101,0,0,0,0,0,0,99,97,100,101,116,98,108,117,101,52,0,0,0,0,0,0,99,97,100,101,116,98,108,117,101,51,0,0,
-0,0,0,0,103,105,102,58,115,118,103,0,99,97,100,101,116,98,108,117,101,50,0,0,0,0,0,0,47,98,117,112,117,52,47,52,0,0,0,0,0,0,0,0,99,97,100,101,116,98,108,117,101,49,0,0,0,0,0,0,99,97,100,101,116,98,108,117,101,0,0,0,0,0,0,0,98,117,114,108,121,119,111,111,100,52,0,0,0,0,0,0,98,117,114,108,121,119,111,111,100,51,0,0,0,0,0,0,98,117,114,108,121,119,111,111,100,50,0,0,0,0,0,0,37,103,44,37,103,0,0,0,98,117,114,108,121,119,111,111,100,49,0,0,0,0,0,0,9,123,105,110,118,105,115,125,32,105,102,0,0,0,0,0,108,
-115,97,113,117,111,0,0,98,117,114,108,121,119,111,111,100,0,0,0,0,0,0,0,98,114,111,119,110,52,0,0,98,114,111,119,110,51,0,0,98,114,111,119,110,50,0,0,47,98,117,112,117,52,47,51,0,0,0,0,0,0,0,0,98,114,111,119,110,49,0,0,98,114,111,119,110,0,0,0,98,108,117,101,118,105,111,108,101,116,0,0,0,0,0,0,32,37,100,0,0,0,0,0,98,108,117,101,52,0,0,0,98,108,117,101,51,0,0,0,65,118,97,110,116,71,97,114,100,101,45,66,111,111,107,79,98,108,105,113,117,101,0,0,60,112,111,108,121,103,111,110,0,0,0,0,0,0,0,0,98,108,
-117,101,50,0,0,0,9,111,114,0,0,0,0,0,108,114,109,0,0,0,0,0,98,108,117,101,49,0,0,0,98,108,117,101,0,0,0,0,98,108,97,110,99,104,101,100,97,108,109,111,110,100,0,0,98,108,97,99,107,0,0,0,47,98,117,112,117,52,47,50,0,0,0,0,0,0,0,0,98,105,115,113,117,101,52,0,98,105,115,113,117,101,51,0,98,105,115,113,117,101,50,0,98,105,115,113,117,101,49,0,98,105,115,113,117,101,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,59,34,47,62,10,60,47,108,105,110,101,97,114,71,114,97,100,105,101,110,116,62,10,
-60,47,100,101,102,115,62,10,0,98,101,105,103,101,0,0,0,9,99,117,114,108,97,121,101,114,32,109,121,117,112,112,101,114,32,103,116,0,0,0,0,108,111,122,0,0,0,0,0,97,122,117,114,101,52,0,0,97,122,117,114,101,51,0,0,97,122,117,114,101,50,0,0,97,122,117,114,101,49,0,0,47,98,117,112,117,52,47,49,0,0,0,0,0,0,0,0,109,97,114,111,111,110,0,0,97,122,117,114,101,0,0,0,97,113,117,97,109,97,114,105,110,101,52,0,0,0,0,0,97,113,117,97,109,97,114,105,110,101,51,0,0,0,0,0,97,113,117,97,109,97,114,105,110,101,50,0,0,
-0,0,0,32,45,119,105,100,116,104,32,0,0,0,0,0,0,0,0,97,113,117,97,109,97,114,105,110,101,49,0,0,0,0,0,60,115,116,111,112,32,111,102,102,115,101,116,61,34,37,46,48,51,102,34,32,115,116,121,108,101,61,34,115,116,111,112,45,99,111,108,111,114,58,0,97,113,117,97,109,97,114,105,110,101,0,0,0,0,0,0,9,99,117,114,108,97,121,101,114,32,109,121,108,111,119,101,114,32,108,116,0,0,0,0,108,111,119,97,115,116,0,0,97,110,116,105,113,117,101,119,104,105,116,101,52,0,0,0,97,110,116,105,113,117,101,119,104,105,116,
-101,51,0,0,0,97,110,116,105,113,117,101,119,104,105,116,101,50,0,0,0,97,110,116,105,113,117,101,119,104,105,116,101,49,0,0,0,47,97,99,99,101,110,116,54,47,53,0,0,0,0,0,0,47,98,117,112,117,51,47,51,0,0,0,0,0,0,0,0,97,110,116,105,113,117,101,119,104,105,116,101,0,0,0,0,97,108,105,99,101,98,108,117,101,0,0,0,0,0,0,0,47,121,108,111,114,114,100,57,47,57,0,0,0,0,0,0,47,121,108,111,114,114,100,57,47,56,0,0,0,0,0,0,83,32,0,0,0,0,0,0,47,121,108,111,114,114,100,57,47,55,0,0,0,0,0,0,47,121,108,111,114,114,100,
-57,47,54,0,0,0,0,0,0,120,49,61,34,37,103,34,32,121,49,61,34,37,103,34,32,120,50,61,34,37,103,34,32,121,50,61,34,37,103,34,32,62,10,0,0,0,0,0,0,99,108,117,115,116,101,114,0,9,47,109,121,108,111,119,101,114,32,101,120,99,104,32,100,101,102,0,0,0,0,0,0,108,102,108,111,111,114,0,0,65,118,97,110,116,71,97,114,100,101,45,68,101,109,105,0,47,121,108,111,114,114,100,57,47,53,0,0,0,0,0,0,95,76,84,88,95,108,105,98,114,97,114,121,0,0,0,0,47,121,108,111,114,114,100,57,47,52,0,0,0,0,0,0,116,114,105,97,110,103,
-108,101,0,0,0,0,0,0,0,0,75,0,0,0,0,0,0,0,110,111,116,32,99,111,110,115,116,114,97,105,110,101,100,0,66,111,117,110,100,105,110,103,66,111,120,32,110,111,116,32,102,111,117,110,100,32,105,110,32,101,112,115,102,32,102,105,108,101,32,37,115,10,0,0,78,68,95,104,101,97,112,105,110,100,101,120,40,118,41,32,60,32,48,0,0,0,0,0,47,121,108,111,114,114,100,57,47,51,0,0,0,0,0,0,116,97,105,108,95,108,112,0,92,72,0,0,0,0,0,0,39,32,105,110,32,108,105,110,101,32,37,100,32,111,102,32,0,0,0,0,0,0,0,0,47,121,108,111,
-114,114,100,57,47,50,0,0,0,0,0,0,47,98,117,112,117,51,47,50,0,0,0,0,0,0,0,0,117,110,100,101,102,105,110,101,100,0,0,0,0,0,0,0,47,121,108,111,114,114,100,57,47,49,0,0,0,0,0,0,99,111,108,111,114,0,0,0,47,121,108,111,114,114,100,56,47,56,0,0,0,0,0,0,66,82,0,0,0,0,0,0,47,121,108,111,114,114,100,56,47,55,0,0,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,111,118,101,114,108,97,112,32,118,97,108,117,101,32,34,37,115,34,32,45,32,117,115,105,110,103,32,102,97,108,115,101,10,0,0,102,111,110,116,
-110,97,109,101,0,0,0,0,0,0,0,0,47,121,108,111,114,114,100,56,47,54,0,0,0,0,0,0,35,51,48,51,48,51,48,0,47,121,108,111,114,114,100,56,47,53,0,0,0,0,0,0,47,121,108,111,114,114,100,56,47,52,0,0,0,0,0,0,60,100,101,102,115,62,10,60,108,105,110,101,97,114,71,114,97,100,105,101,110,116,32,105,100,61,34,108,95,37,100,34,32,103,114,97,100,105,101,110,116,85,110,105,116,115,61,34,117,115,101,114,83,112,97,99,101,79,110,85,115,101,34,32,0,0,0,0,0,0,0,0,9,47,109,121,117,112,112,101,114,32,101,120,99,104,32,100,
-101,102,0,0,0,0,0,0,108,101,0,0,0,0,0,0,99,104,111,99,111,108,97,116,101,0,0,0,0,0,0,0,47,121,108,111,114,114,100,56,47,51,0,0,0,0,0,0,47,121,108,111,114,114,100,56,47,50,0,0,0,0,0,0,47,121,108,111,114,114,100,56,47,49,0,0,0,0,0,0,47,121,108,111,114,114,100,55,47,55,0,0,0,0,0,0,47,98,117,112,117,51,47,49,0,0,0,0,0,0,0,0,104,101,97,100,112,111,114,116,0,0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,121,108,111,114,114,100,55,47,54,0,0,0,0,0,0,47,121,108,111,114,114,100,55,47,
-53,0,0,0,0,0,0,115,105,110,107,0,0,0,0,47,121,108,111,114,114,100,55,47,52,0,0,0,0,0,0,47,121,108,111,114,114,100,55,47,51,0,0,0,0,0,0,34,0,0,0,0,0,0,0,37,32,0,0,0,0,0,0,47,121,108,111,114,114,100,55,47,50,0,0,0,0,0,0,47,121,108,111,114,114,100,55,47,49,0,0,0,0,0,0,59,34,47,62,10,60,47,114,97,100,105,97,108,71,114,97,100,105,101,110,116,62,10,60,47,100,101,102,115,62,10,0,47,111,110,108,97,121,101,114,115,32,123,0,0,0,0,0,108,100,113,117,111,0,0,0,97,103,100,101,108,101,116,101,32,111,110,32,98,97,
-100,32,111,98,106,101,99,116,0,0,47,121,108,111,114,114,100,54,47,54,0,0,0,0,0,0,47,121,108,111,114,114,100,54,47,53,0,0,0,0,0,0,109,105,110,99,114,111,115,115,32,37,115,58,32,37,100,32,99,114,111,115,115,105,110,103,115,44,32,37,46,50,102,32,115,101,99,115,46,10,0,0,47,121,108,111,114,114,100,54,47,52,0,0,0,0,0,0,32,105,100,61,34,0,0,0,47,121,108,111,114,114,100,54,47,51,0,0,0,0,0,0,47,98,117,103,110,57,47,57,0,0,0,0,0,0,0,0,47,121,108,111,114,114,100,54,47,50,0,0,0,0,0,0,47,121,108,111,114,114,
-100,54,47,49,0,0,0,0,0,0,47,121,108,111,114,114,100,53,47,53,0,0,0,0,0,0,47,121,108,111,114,114,100,53,47,52,0,0,0,0,0,0,47,121,108,111,114,114,100,53,47,51,0,0,0,0,0,0,47,121,108,111,114,114,100,53,47,50,0,0,0,0,0,0,60,115,116,111,112,32,111,102,102,115,101,116,61,34,49,34,32,115,116,121,108,101,61,34,115,116,111,112,45,99,111,108,111,114,58,0,0,0,0,0,47,111,110,108,97,121,101,114,32,123,32,99,117,114,108,97,121,101,114,32,110,101,32,123,105,110,118,105,115,125,32,105,102,32,125,32,100,101,102,0,
-108,99,101,105,108,0,0,0,47,121,108,111,114,114,100,53,47,49,0,0,0,0,0,0,47,121,108,111,114,114,100,52,47,52,0,0,0,0,0,0,47,121,108,111,114,114,100,52,47,51,0,0,0,0,0,0,47,121,108,111,114,114,100,52,47,50,0,0,0,0,0,0,47,98,117,103,110,57,47,56,0,0,0,0,0,0,0,0,88,77,76,32,111,114,32,116,101,120,116,32,100,101,99,108,97,114,97,116,105,111,110,32,110,111,116,32,97,116,32,115,116,97,114,116,32,111,102,32,101,110,116,105,116,121,0,0,47,121,108,111,114,114,100,52,47,49,0,0,0,0,0,0,47,121,108,111,114,114,
-100,51,47,51,0,0,0,0,0,0,47,121,108,111,114,114,100,51,47,50,0,0,0,0,0,0,47,121,108,111,114,114,100,51,47,49,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,57,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,56,0,0,0,0,0,0,59,34,47,62,10,0,0,0,9,47,103,114,97,112,104,99,111,108,111,114,32,123,110,111,112,99,111,108,111,114,125,32,100,101,102,0,0,0,0,0,108,97,114,114,0,0,0,0,47,121,108,111,114,98,114,57,47,55,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,54,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,53,0,0,
-0,0,0,0,47,121,108,111,114,98,114,57,47,52,0,0,0,0,0,0,47,98,117,103,110,57,47,55,0,0,0,0,0,0,0,0,40,108,105,98,41,58,112,115,0,0,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,51,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,50,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,49,0,0,0,0,0,0,47,121,108,111,114,98,114,56,47,56,0,0,0,0,0,0,47,121,108,111,114,98,114,56,47,55,0,0,0,0,0,0,104,97,108,102,0,0,0,0,47,121,108,111,114,98,114,56,47,54,0,0,0,0,0,0,49,46,0,0,0,0,0,0,9,47,101,100,103,101,99,111,108,111,
-114,32,123,110,111,112,99,111,108,111,114,125,32,100,101,102,0,0,0,0,0,0,108,97,113,117,111,0,0,0,47,121,108,111,114,98,114,56,47,53,0,0,0,0,0,0,47,121,108,111,114,98,114,56,47,52,0,0,0,0,0,0,47,121,108,111,114,98,114,56,47,51,0,0,0,0,0,0,47,121,108,111,114,98,114,56,47,50,0,0,0,0,0,0,47,98,117,103,110,57,47,54,0,0,0,0,0,0,0,0,47,121,108,111,114,98,114,56,47,49,0,0,0,0,0,0,47,121,108,111,114,98,114,55,47,55,0,0,0,0,0,0,47,121,108,111,114,98,114,55,47,54,0,0,0,0,0,0,47,121,108,111,114,98,114,55,47,
-53,0,0,0,0,0,0,47,121,108,111,114,98,114,55,47,52,0,0,0,0,0,0,47,121,108,111,114,98,114,55,47,51,0,0,0,0,0,0,37,102,0,0,0,0,0,0,9,47,110,111,100,101,99,111,108,111,114,32,123,110,111,112,99,111,108,111,114,125,32,100,101,102,0,0,0,0,0,0,108,97,110,103,0,0,0,0,47,121,108,111,114,98,114,55,47,50,0,0,0,0,0,0,47,121,108,111,114,98,114,55,47,49,0,0,0,0,0,0,47,121,108,111,114,98,114,54,47,54,0,0,0,0,0,0,47,121,108,111,114,98,114,54,47,53,0,0,0,0,0,0,47,98,117,103,110,57,47,53,0,0,0,0,0,0,0,0,47,121,108,
-111,114,98,114,54,47,52,0,0,0,0,0,0,47,121,108,111,114,98,114,54,47,51,0,0,0,0,0,0,47,121,108,111,114,98,114,54,47,50,0,0,0,0,0,0,47,121,108,111,114,98,114,54,47,49,0,0,0,0,0,0,32,37,115,10,0,0,0,0,47,121,108,111,114,98,114,53,47,53,0,0,0,0,0,0,47,121,108,111,114,98,114,53,47,52,0,0,0,0,0,0,65,118,97,110,116,71,97,114,100,101,45,68,101,109,105,0,59,115,116,111,112,45,111,112,97,99,105,116,121,58,0,0,9,97,108,111,97,100,32,112,111,112,32,115,101,116,104,115,98,99,111,108,111,114,0,0,108,97,109,98,
-100,97,0,0,108,105,110,101,108,101,110,103,116,104,0,0,0,0,0,0,47,121,108,111,114,98,114,53,47,51,0,0,0,0,0,0,47,121,108,111,114,98,114,53,47,50,0,0,0,0,0,0,47,121,108,111,114,98,114,53,47,49,0,0,0,0,0,0,47,121,108,111,114,98,114,52,47,52,0,0,0,0,0,0,47,98,117,103,110,57,47,52,0,0,0,0,0,0,0,0,47,121,108,111,114,98,114,52,47,51,0,0,0,0,0,0,47,121,108,111,114,98,114,52,47,50,0,0,0,0,0,0,47,121,108,111,114,98,114,52,47,49,0,0,0,0,0,0,47,121,108,111,114,98,114,51,47,51,0,0,0,0,0,0,47,121,108,111,114,
-98,114,51,47,50,0,0,0,0,0,0,47,121,108,111,114,98,114,51,47,49,0,0,0,0,0,0,60,115,116,111,112,32,111,102,102,115,101,116,61,34,48,34,32,115,116,121,108,101,61,34,115,116,111,112,45,99,111,108,111,114,58,0,0,0,0,0,9,108,97,121,101,114,99,111,108,111,114,115,101,113,32,99,117,114,108,97,121,101,114,32,49,32,115,117,98,32,108,97,121,101,114,108,101,110,32,109,111,100,32,103,101,116,0,0,108,65,114,114,0,0,0,0,47,121,108,103,110,98,117,57,47,57,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,
-0,0,0,0,47,121,108,103,110,98,117,57,47,56,0,0,0,0,0,0,47,98,117,103,110,57,47,51,0,0,0,0,0,0,0,0,47,121,108,103,110,98,117,57,47,55,0,0,0,0,0,0,47,121,108,103,110,98,117,57,47,54,0,0,0,0,0,0,115,116,114,101,97,109,32,101,110,100,0,0,0,0,0,0,108,105,109,101,0,0,0,0,47,121,108,103,110,98,117,57,47,53,0,0,0,0,0,0,47,121,108,103,110,98,117,57,47,52,0,0,0,0,0,0,47,121,108,103,110,98,117,57,47,51,0,0,0,0,0,0,47,121,108,103,110,98,117,57,47,50,0,0,0,0,0,0,36,99,0,0,0,0,0,0,47,121,108,103,110,98,117,57,
-47,49,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,56,0,0,0,0,0,0,60,100,101,102,115,62,10,60,114,97,100,105,97,108,71,114,97,100,105,101,110,116,32,105,100,61,34,114,95,37,100,34,32,99,120,61,34,53,48,37,37,34,32,99,121,61,34,53,48,37,37,34,32,114,61,34,55,53,37,37,34,32,102,120,61,34,37,100,37,37,34,32,102,121,61,34,37,100,37,37,34,62,10,0,0,0,0,0,47,115,101,116,108,97,121,101,114,32,123,47,109,97,120,108,97,121,101,114,32,101,120,99,104,32,100,101,102,32,47,99,117,114,108,97,121,101,114,32,101,
-120,99,104,32,100,101,102,0,0,0,0,0,0,0,0,107,97,112,112,97,0,0,0,47,121,108,103,110,98,117,56,47,55,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,54,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,53,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,52,0,0,0,0,0,0,47,98,117,103,110,57,47,50,0,0,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,51,0,0,0,0,0,0,110,97,110,0,0,0,0,0,47,97,99,99,101,110,116,54,47,52,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,50,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,49,0,0,0,0,0,
-0,47,121,108,103,110,98,117,55,47,55,0,0,0,0,0,0,37,46,51,102,0,0,0,0,115,104,111,114,116,101,115,116,46,99,0,0,0,0,0,0,47,121,108,103,110,98,117,55,47,54,0,0,0,0,0,0,47,121,108,103,110,98,117,55,47,53,0,0,0,0,0,0,104,101,97,100,112,111,114,116,0,0,0,0,0,0,0,0,37,99,37,103,44,37,103,0,47,108,97,121,101,114,108,101,110,32,108,97,121,101,114,99,111,108,111,114,115,101,113,32,108,101,110,103,116,104,32,100,101,102,0,0,0,0,0,0,105,117,109,108,0,0,0,0,105,116,97,108,105,99,0,0,65,103,114,97,112,104,105,
-110,102,111,95,116,0,0,0,0,47,121,108,103,110,98,117,55,47,52,0,0,0,0,0,0,47,121,108,103,110,98,117,55,47,51,0,0,0,0,0,0,101,103,103,0,0,0,0,0,115,101,112,0,0,0,0,0,99,111,110,115,116,114,97,105,110,101,100,0,0,0,0,0,114,101,97,100,0,0,0,0,37,115,32,37,46,51,102,10,0,0,0,0,0,0,0,0,47,121,108,103,110,98,117,55,47,50,0,0,0,0,0,0,104,101,97,100,95,108,112,0,92,69,0,0,0,0,0,0,47,121,108,103,110,98,117,55,47,49,0,0,0,0,0,0,47,98,117,103,110,57,47,49,0,0,0,0,0,0,0,0,95,65,71,95,115,116,114,100,97,116,97,
-0,0,0,0,0,32,32,109,97,114,103,105,110,32,37,100,10,0,0,0,0,47,121,108,103,110,98,117,54,47,54,0,0,0,0,0,0,112,101,110,99,111,108,111,114,0,0,0,0,0,0,0,0,115,104,97,112,101,0,0,0,47,121,108,103,110,98,117,54,47,53,0,0,0,0,0,0,83,0,0,0,0,0,0,0,47,121,108,103,110,98,117,54,47,52,0,0,0,0,0,0,79,118,101,114,108,97,112,32,118,97,108,117,101,32,34,37,115,34,32,117,110,115,117,112,112,111,114,116,101,100,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,0,0,0,100,101,114,105,118,101,100,0,119,101,105,103,
-104,116,0,0,47,121,108,103,110,98,117,54,47,51,0,0,0,0,0,0,35,102,99,102,99,102,99,0,47,121,108,103,110,98,117,54,47,50,0,0,0,0,0,0,47,121,108,103,110,98,117,54,47,49,0,0,0,0,0,0,32,100,61,34,0,0,0,0,100,101,102,0,0,0,0,0,105,115,105,110,0,0,0,0,78,111,32,108,111,97,100,105,109,97,103,101,32,112,108,117,103,105,110,32,102,111,114,32,34,37,115,34,10,0,0,0,99,104,97,114,116,114,101,117,115,101,0,0,0,0,0,0,47,121,108,103,110,98,117,53,47,53,0,0,0,0,0,0,47,121,108,103,110,98,117,53,47,52,0,0,0,0,0,0,
-47,121,108,103,110,98,117,53,47,51,0,0,0,0,0,0,47,121,108,103,110,98,117,53,47,50,0,0,0,0,0,0,47,98,117,103,110,56,47,56,0,0,0,0,0,0,0,0,116,97,105,108,112,111,114,116,0,0,0,0,0,0,0,0,97,115,32,114,101,113,117,105,114,101,100,32,98,121,32,116,104,101,32,45,110,32,102,108,97,103,10,0,0,0,0,0,47,121,108,103,110,98,117,53,47,49,0,0,0,0,0,0,47,121,108,103,110,98,117,52,47,52,0,0,0,0,0,0,109,97,120,0,0,0,0,0,47,121,108,103,110,98,117,52,47,51,0,0,0,0,0,0,47,121,108,103,110,98,117,52,47,50,0,0,0,0,0,0,
-112,99,0,0,0,0,0,0,47,121,108,103,110,98,117,52,47,49,0,0,0,0,0,0,37,46,53,103,32,37,46,53,103,32,37,46,53,103,32,37,115,99,111,108,111,114,10,0,47,121,108,103,110,98,117,51,47,51,0,0,0,0,0,0,60,112,97,116,104,0,0,0,9,93,0,0,0,0,0,0,115,121,110,116,97,120,32,97,109,98,105,103,117,105,116,121,32,45,32,98,97,100,108,121,32,100,101,108,105,109,105,116,101,100,32,110,117,109,98,101,114,32,39,0,0,0,0,0,105,113,117,101,115,116,0,0,47,121,108,103,110,98,117,51,47,50,0,0,0,0,0,0,101,114,114,111,114,32,105,
-110,32,99,111,108,120,108,97,116,101,40,41,10,0,0,0,0,47,121,108,103,110,98,117,51,47,49,0,0,0,0,0,0,40,114,118,32,61,61,32,48,41,32,124,124,32,40,78,68,95,111,114,100,101,114,40,114,118,41,45,78,68,95,111,114,100,101,114,40,118,41,41,42,100,105,114,32,62,32,48,0,47,121,108,103,110,57,47,57,0,0,0,0,0,0,0,0,60,97,114,101,97,32,115,104,97,112,101,61,34,112,111,108,121,34,0,0,0,0,0,0,47,121,108,103,110,57,47,56,0,0,0,0,0,0,0,0,47,98,117,103,110,56,47,55,0,0,0,0,0,0,0,0,47,121,108,103,110,57,47,55,0,
-0,0,0,0,0,0,0,47,121,108,103,110,57,47,54,0,0,0,0,0,0,0,0,47,121,108,103,110,57,47,53,0,0,0,0,0,0,0,0,47,121,108,103,110,57,47,52,0,0,0,0,0,0,0,0,47,121,108,103,110,57,47,51,0,0,0,0,0,0,0,0,47,121,108,103,110,57,47,50,0,0,0,0,0,0,0,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,115,118,103,46,99,0,0,0,0,0,9,9,91,46,56,32,46,56,32,46,56,93,0,0,0,0,105,111,116,97,0,0,0,0,47,121,108,103,110,57,47,49,0,0,0,0,0,0,0,0,47,121,108,103,110,56,47,56,0,0,0,0,0,0,0,0,47,121,108,103,110,56,47,55,0,0,0,
-0,0,0,0,0,47,121,108,103,110,56,47,54,0,0,0,0,0,0,0,0,47,98,117,103,110,56,47,54,0,0,0,0,0,0,0,0,114,101,102,101,114,101,110,99,101,32,116,111,32,101,120,116,101,114,110,97,108,32,101,110,116,105,116,121,32,105,110,32,97,116,116,114,105,98,117,116,101,0,0,0,0,0,0,0,47,121,108,103,110,56,47,53,0,0,0,0,0,0,0,0,47,121,108,103,110,56,47,52,0,0,0,0,0,0,0,0,47,121,108,103,110,56,47,51,0,0,0,0,0,0,0,0,47,121,108,103,110,56,47,50,0,0,0,0,0,0,0,0,47,121,108,103,110,56,47,49,0,0,0,0,0,0,0,0,47,121,108,103,
-110,55,47,55,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,9,9,91,46,54,32,46,56,32,46,56,93,0,0,0,0,105,110,116],"i8",L,l.J+133156);D([47,121,108,103,110,55,47,54,0,0,0,0,0,0,0,0,47,121,108,103,110,55,47,53,0,0,0,0,0,0,0,0,47,121,108,103,110,55,47,52,0,0,0,0,0,0,0,0,47,121,108,103,110,55,47,51,0,0,0,0,0,0,0,0,47,98,117,103,110,56,47,53,0,0,0,0,0,0,0,0,112,115,58,112,115,0,0,0,47,121,108,103,110,55,47,50,0,0,0,0,0,0,0,0,47,121,108,103,110,55,47,49,0,0,0,0,0,0,0,0,47,121,108,103,110,54,47,54,0,0,0,0,0,0,0,0,47,
-121,108,103,110,54,47,53,0,0,0,0,0,0,0,0,47,121,108,103,110,54,47,52,0,0,0,0,0,0,0,0,47,121,108,103,110,54,47,51,0,0,0,0,0,0,0,0,101,0,0,0,0,0,0,0,35,37,48,50,120,37,48,50,120,37,48,50,120,0,0,0,9,9,91,46,52,32,46,56,32,46,56,93,0,0,0,0,105,110,102,105,110,0,0,0,47,121,108,103,110,54,47,50,0,0,0,0,0,0,0,0,47,121,108,103,110,54,47,49,0,0,0,0,0,0,0,0,47,121,108,103,110,53,47,53,0,0,0,0,0,0,0,0,47,121,108,103,110,53,47,52,0,0,0,0,0,0,0,0,47,98,117,103,110,56,47,52,0,0,0,0,0,0,0,0,47,121,108,103,110,
-53,47,51,0,0,0,0,0,0,0,0,47,121,108,103,110,53,47,50,0,0,0,0,0,0,0,0,47,121,108,103,110,53,47,49,0,0,0,0,0,0,0,0,47,121,108,103,110,52,47,52,0,0,0,0,0,0,0,0,47,121,108,103,110,52,47,51,0,0,0,0,0,0,0,0,47,121,108,103,110,52,47,50,0,0,0,0,0,0,0,0,53,44,50,0,0,0,0,0,9,9,91,46,50,32,46,56,32,46,56,93,0,0,0,0,105,109,97,103,101,0,0,0,47,121,108,103,110,52,47,49,0,0,0,0,0,0,0,0,47,121,108,103,110,51,47,51,0,0,0,0,0,0,0,0,47,98,117,103,110,56,47,51,0,0,0,0,0,0,0,0,47,121,108,103,110,51,47,50,0,0,0,0,0,0,
-0,0,47,121,108,103,110,51,47,49,0,0,0,0,0,0,0,0,47,115,118,103,47,121,101,108,108,111,119,103,114,101,101,110,0,0,0,0,0,0,0,0,47,115,118,103,47,121,101,108,108,111,119,0,0,0,0,0,47,115,118,103,47,119,104,105,116,101,115,109,111,107,101,0,47,115,118,103,47,119,104,105,116,101,0,0,0,0,0,0,47,115,118,103,47,119,104,101,97,116,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,47,115,118,
-103,47,118,105,111,108,101,116,0,0,0,0,0,82,0,0,0,0,0,0,0,49,44,53,0,0,0,0,0,9,9,91,48,32,48,32,48,93,0,0,0,0,0,0,0,105,103,114,97,118,101,0,0,108,97,121,111,117,116,0,0,47,115,118,103,47,116,117,114,113,117,111,105,115,101,0,0,47,115,118,103,47,116,111,109,97,116,111,0,0,0,0,0,47,115,118,103,47,116,104,105,115,116,108,101,0,0,0,0,47,115,118,103,47,116,101,97,108,0,0,0,0,0,0,0,47,98,117,103,110,56,47,50,0,0,0,0,0,0,0,0,47,115,118,103,47,116,97,110,0,0,0,0,0,0,0,0,47,115,118,103,47,115,116,101,101,
-108,98,108,117,101,0,0,47,115,118,103,47,115,112,114,105,110,103,103,114,101,101,110,0,0,0,0,0,0,0,0,47,115,118,103,47,115,110,111,119,0,0,0,0,0,0,0,115,97,109,101,116,97,105,108,0,0,0,0,0,0,0,0,47,115,118,103,47,115,108,97,116,101,103,114,101,121,0,0,47,115,118,103,47,115,108,97,116,101,103,114,97,121,0,0,34,0,0,0,0,0,0,0,9,91,9,37,32,108,97,121,101,114,32,99,111,108,111,114,32,115,101,113,117,101,110,99,101,32,45,32,100,97,114,107,101,115,116,32,116,111,32,108,105,103,104,116,101,115,116,0,105,
-101,120,99,108,0,0,0,47,115,118,103,47,115,108,97,116,101,98,108,117,101,0,0,102,97,115,116,103,114,46,99,0,0,0,0,0,0,0,0,47,115,118,103,47,115,107,121,98,108,117,101,0,0,0,0,47,115,118,103,47,115,105,108,118,101,114,0,0,0,0,0,47,115,118,103,47,115,105,101,110,110,97,0,0,0,0,0,47,98,117,103,110,56,47,49,0,0,0,0,0,0,0,0,103,114,101,101,110,0,0,0,47,115,118,103,47,115,101,97,115,104,101,108,108,0,0,0,47,115,118,103,47,115,101,97,103,114,101,101,110,0,0,0,47,115,118,103,47,115,97,110,100,121,98,114,
-111,119,110,0,47,115,118,103,47,115,97,108,109,111,110,0,0,0,0,0,35,37,48,50,120,37,48,50,120,37,48,50,120,0,0,0,47,115,118,103,47,115,97,100,100,108,101,98,114,111,119,110,0,0,0,0,0,0,0,0,47,115,118,103,47,114,111,121,97,108,98,108,117,101,0,0,34,32,115,116,114,111,107,101,45,111,112,97,99,105,116,121,61,34,37,102,0,0,0,0,47,108,97,121,101,114,99,111,108,111,114,115,101,113,0,0,105,99,105,114,99,0,0,0,47,115,118,103,47,114,111,115,121,98,114,111,119,110,0,0,47,115,118,103,47,114,101,100,0,0,0,0,
-0,0,0,0,47,115,118,103,47,112,117,114,112,108,101,0,0,0,0,0,47,115,118,103,47,112,111,119,100,101,114,98,108,117,101,0,47,98,117,103,110,55,47,55,0,0,0,0,0,0,0,0,47,115,118,103,47,112,108,117,109,0,0,0,0,0,0,0,47,115,118,103,47,112,105,110,107,0,0,0,0,0,0,0,47,97,99,99,101,110,116,54,47,51,0,0,0,0,0,0,47,115,118,103,47,112,101,114,117,0,0,0,0,0,0,0,47,115,118,103,47,112,101,97,99,104,112,117,102,102,0,0,115,101,116,108,105,110,101,119,105,100,116,104,40,0,0,0,47,115,118,103,47,112,97,112,97,121,97,
-119,104,105,112,0,47,115,118,103,47,112,97,108,101,118,105,111,108,101,116,114,101,100,0,0,0,0,0,0,34,32,115,116,114,111,107,101,45,100,97,115,104,97,114,114,97,121,61,34,37,115,0,0,47,115,104,111,119,112,97,103,101,32,123,32,125,32,100,101,102,0,0,0,0,0,0,0,105,97,99,117,116,101,0,0,111,98,108,105,113,117,101,0,114,0,0,0,0,0,0,0,47,115,118,103,47,112,97,108,101,116,117,114,113,117,111,105,115,101,0,0,0,0,0,0,47,115,118,103,47,112,97,108,101,103,114,101,101,110,0,0,112,111,105,110,116,0,0,0,115,116,
-97,114,116,32,112,111,114,116,58,32,40,37,46,53,103,44,32,37,46,53,103,41,44,32,116,97,110,103,101,110,116,32,97,110,103,108,101,58,32,37,46,53,103,44,32,37,115,10,0,0,0,0,0,0,108,101,110,0,0,0,0,0,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,0,0,0,0,47,115,118,103,47,112,97,108,101,103,111,108,100,101,110,114,111,100,0,0,0,0,0,0,108,112,0,0,0,0,0,0,92,78,0,0,0,0,0,0,105,110,112,117,116,0,0,0,47,115,118,103,47,111,114,99,104,105,100,0,0,0,0,0,47,
-98,117,103,110,55,47,54,0,0,0,0,0,0,0,0,112,97,99,107,0,0,0,0,47,115,118,103,47,111,114,97,110,103,101,114,101,100,0,0,78,111,32,111,114,32,105,109,112,114,111,112,101,114,32,105,109,97,103,101,32,102,105,108,101,61,34,37,115,34,10,0,47,115,118,103,47,111,114,97,110,103,101,0,0,0,0,0,83,85,66,0,0,0,0,0,47,115,118,103,47,111,108,105,118,101,100,114,97,98,0,0,118,111,114,111,95,109,97,114,103,105,110,0,0,0,0,0,95,98,108,111,99,107,95,37,100,0,0,0,0,0,0,0,47,115,118,103,47,111,108,105,118,101,0,0,0,
-0,0,0,108,104,101,97,100,0,0,0,35,56,48,56,48,56,48,0,47,115,118,103,47,111,108,100,108,97,99,101,0,0,0,0,47,115,118,103,47,110,97,118,121,0,0,0,0,0,0,0,34,32,115,116,114,111,107,101,45,119,105,100,116,104,61,34,37,103,0,0,0,0,0,0,47,101,110,100,112,97,103,101,32,123,32,115,104,111,119,112,97,103,101,32,125,32,98,105,110,100,32,100,101,102,0,0,104,101,108,108,105,112,0,0,111,118,101,114,108,97,112,0,99,97,100,101,116,98,108,117,101,0,0,0,0,0,0,0,47,115,118,103,47,110,97,118,97,106,111,119,104,105,
-116,101,0,0,0,0,0,0,0,0,112,105,99,58,112,105,99,0,47,115,118,103,47,109,111,99,99,97,115,105,110,0,0,0,47,115,118,103,47,109,105,115,116,121,114,111,115,101,0,0,47,115,118,103,47,109,105,110,116,99,114,101,97,109,0,0,47,98,117,103,110,55,47,53,0,0,0,0,0,0,0,0,115,116,114,105,99,116,32,0,110,111,100,101,32,112,111,115,105,116,105,111,110,115,32,97,114,101,32,105,103,110,111,114,101,100,32,117,110,108,101,115,115,32,115,116,97,114,116,61,114,97,110,100,111,109,10,0,47,115,118,103,47,109,105,100,110,
-105,103,104,116,98,108,117,101,0,0,0,0,0,0,0,47,115,118,103,47,109,101,100,105,117,109,118,105,111,108,101,116,114,101,100,0,0,0,0,115,111,117,114,99,101,0,0,47,115,118,103,47,109,101,100,105,117,109,116,117,114,113,117,111,105,115,101,0,0,0,0,47,115,118,103,47,109,101,100,105,117,109,115,112,114,105,110,103,103,114,101,101,110,0,0,112,120,0,0,0,0,0,0,47,115,118,103,47,109,101,100,105,117,109,115,108,97,116,101,98,108,117,101,0,0,0,0,115,101,116,104,115,98,0,0,47,115,118,103,47,109,101,100,105,117,
-109,115,101,97,103,114,101,101,110,0,0,0,0,0,34,32,115,116,114,111,107,101,61,34,0,0,0,0,0,0,9,115,101,116,109,97,116,114,105,120,0,0,0,0,0,0,104,101,97,114,116,115,0,0,47,115,118,103,47,109,101,100,105,117,109,112,117,114,112,108,101,0,0,0,0,0,0,0,37,115,32,105,115,32,110,111,116,32,97,32,107,110,111,119,110,32,99,111,108,111,114,46,10,0,0,0,0,0,0,0,47,115,118,103,47,109,101,100,105,117,109,111,114,99,104,105,100,0,0,0,0,0,0,0,118,0,0,0,0,0,0,0,47,115,118,103,47,109,101,100,105,117,109,98,108,117,
-101,0,60,97,114,101,97,32,115,104,97,112,101,61,34,114,101,99,116,34,0,0,0,0,0,0,47,115,118,103,47,109,101,100,105,117,109,97,113,117,97,109,97,114,105,110,101,0,0,0,47,98,117,103,110,55,47,52,0,0,0,0,0,0,0,0,47,115,118,103,47,109,97,114,111,111,110,0,0,0,0,0,47,115,118,103,47,109,97,103,101,110,116,97,0,0,0,0,47,115,118,103,47,108,105,110,101,110,0,0,0,0,0,0,47,115,118,103,47,108,105,109,101,103,114,101,101,110,0,0,47,115,118,103,47,108,105,109,101,0,0,0,0,0,0,0,47,115,118,103,47,108,105,103,104,
-116,121,101,108,108,111,119,0,0,0,0,0,0,0,0,110,111,110,101,0,0,0,0,9,48,32,48,32,49,32,48,32,51,54,48,32,97,114,99,0,0,0,0,0,0,0,0,104,97,114,114,0,0,0,0,47,115,118,103,47,108,105,103,104,116,115,116,101,101,108,98,108,117,101,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,115,108,97,116,101,103,114,101,121,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,115,108,97,116,101,103,114,97,121,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,115,107,121,98,108,117,101,0,0,0,0,0,0,0,47,98,117,103,110,55,
-47,51,0,0,0,0,0,0,0,0,114,101,102,101,114,101,110,99,101,32,116,111,32,98,105,110,97,114,121,32,101,110,116,105,116,121,0,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,115,101,97,103,114,101,101,110,0,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,115,97,108,109,111,110,0,0,0,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,112,105,110,107,0,0,47,115,118,103,47,108,105,103,104,116,103,114,101,121,0,0,47,115,118,103,47,108,105,103,104,116,103,114,101,101,110,0,47,98,117,103,110,55,47,50,0,0,0,0,
-0,0,0,0,47,115,118,103,47,108,105,103,104,116,103,114,97,121,0,0,10,0,0,0,0,0,0,0,34,32,102,105,108,108,45,111,112,97,99,105,116,121,61,34,37,102,0,0,0,0,0,0,9,114,120,32,114,121,32,115,99,97,108,101,0,0,0,0,104,65,114,114,0,0,0,0,47,115,118,103,47,108,105,103,104,116,103,111,108,100,101,110,114,111,100,121,101,108,108,111,119,0,0,0,0,0,0,0,112,97,99,107,109,111,100,101,0,0,0,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,99,121,97,110,0,0,47,115,118,103,47,108,105,103,104,116,99,111,114,97,108,
-0,47,115,118,103,47,108,105,103,104,116,98,108,117,101,0,0,108,0,0,0,0,0,0,0,101,112,115,58,112,115,0,0,47,115,118,103,47,108,101,109,111,110,99,104,105,102,102,111,110,0,0,0,0,0,0,0,47,115,118,103,47,108,97,119,110,103,114,101,101,110,0,0,47,115,118,103,47,108,97,118,101,110,100,101,114,98,108,117,115,104,0,0,0,0,0,0,47,115,118,103,47,108,97,118,101,110,100,101,114,0,0,0,47,115,118,103,47,107,104,97,107,105,0,0,0,0,0,0,47,115,118,103,47,105,118,111,114,121,0,0,0,0,0,0,117,114,108,40,35,114,95,37,
-100,41,0,0,0,0,0,0,9,120,32,121,32,116,114,97,110,115,108,97,116,101,0,0,103,116,0,0,0,0,0,0,47,115,118,103,47,105,110,100,105,103,111,0,0,0,0,0,47,115,118,103,47,105,110,100,105,97,110,114,101,100,0,0,47,115,118,103,47,104,111,116,112,105,110,107,0,0,0,0,47,115,118,103,47,104,111,110,101,121,100,101,119,0,0,0,47,98,117,103,110,55,47,49,0,0,0,0,0,0,0,0,47,115,118,103,47,103,114,101,121,0,0,0,0,0,0,0,47,115,118,103,47,103,114,101,101,110,121,101,108,108,111,119,0,0,0,0,0,0,0,0,47,115,118,103,47,103,
-114,101,101,110,0,0,0,0,0,0,47,115,118,103,47,103,114,97,121,0,0,0,0,0,0,0,47,115,118,103,47,103,111,108,100,101,110,114,111,100,0,0,47,115,118,103,47,103,111,108,100,0,0,0,0,0,0,0,9,110,101,119,112,97,116,104,0,0,0,0,0,0,0,0,117,114,108,40,35,108,95,37,100,41,0,0,0,0,0,0,103,101,0,0,0,0,0,0,47,115,118,103,47,103,104,111,115,116,119,104,105,116,101,0,47,115,118,103,47,103,97,105,110,115,98,111,114,111,0,0,47,115,118,103,47,102,117,99,104,115,105,97,0,0,0,0,110,111,114,109,97,108,0,0,47,115,118,103,
-47,102,111,114,101,115,116,103,114,101,101,110,0,0,0,0,0,0,0,0,47,98,117,103,110,54,47,54,0,0,0,0,0,0,0,0,47,115,118,103,47,102,108,111,114,97,108,119,104,105,116,101,0,0,0,0,0,0,0,0,47,115,118,103,47,102,105,114,101,98,114,105,99,107,0,0,47,115,118,103,47,100,111,100,103,101,114,98,108,117,101,0,47,115,118,103,47,100,105,109,103,114,101,121,0,0,0,0,47,115,118,103,47,100,105,109,103,114,97,121,0,0,0,0,47,115,118,103,47,100,101,101,112,115,107,121,98,108,117,101,0,0,0,0,0,0,0,0,37,115,37,115,32,105,
-115,32,110,111,116,32,97,32,116,114,111,102,102,32,102,111,110,116,10,0,0,0,0,0,0,0,9,109,97,116,114,105,120,32,99,117,114,114,101,110,116,109,97,116,114,105,120,0,0,0,32,102,105,108,108,61,34,0,103,97,109,109,97,0,0,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,102,105,103,46,99,0,0,0,0,0,47,115,118,103,47,100,101,101,112,112,105,110,107,0,0,0,47,115,118,103,47,100,97,114,107,118,105,111,108,101,116,0,47,115,118,103,47,100,97,114,107,116,117,114,113,117,111,105,115,101,0,0,0,0,0,0,47,115,
-118,103,47,100,97,114,107,115,108,97,116,101,103,114,101,121,0,0,0,0,0,0,47,98,117,103,110,54,47,53,0,0,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,115,108,97,116,101,103,114,97,121,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,115,108,97,116,101,98,108,117,101,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,115,101,97,103,114,101,101,110,0,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,115,97,108,109,111,110,0,47,115,118,103,47,100,97,114,107,114,101,100,0,0,0,0,115,97,109,101,104,101,97,100,0,0,0,0,
-0,0,0,0,47,115,118,103,47,100,97,114,107,111,114,99,104,105,100,0,9,47,120,32,101,120,99,104,32,100,101,102,0,0,0,0,34,47,62,10,0,0,0,0,102,114,97,115,108,0,0,0,120,108,97,98,101,108,115,46,99,0,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,111,114,97,110,103,101,0,47,115,118,103,47,100,97,114,107,111,108,105,118,101,103,114,101,101,110,0,0,0,0,0,47,115,118,103,47,100,97,114,107,109,97,103,101,110,116,97,0,0,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,107,104,97,107,105,0,0,47,98,117,103,110,54,47,
-52,0,0,0,0,0,0,0,0,103,114,97,121,0,0,0,0,47,115,118,103,47,100,97,114,107,103,114,101,121,0,0,0,47,115,118,103,47,100,97,114,107,103,114,101,101,110,0,0,47,115,118,103,47,100,97,114,107,103,114,97,121,0,0,0,47,115,118,103,47,100,97,114,107,103,111,108,100,101,110,114,111,100,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,99,121,97,110,0,0,0,34,34,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,98,108,117,101,0,0,0,9,47,121,32,101,120,99,104,32,100,101,102,0,0,0,0,37,103,44,37,103,32,0,0,102,114,97,99,
-51,52,0,0,47,115,118,103,47,99,121,97,110,0,0,0,0,0,0,0,110,115,108,105,109,105,116,49,0,0,0,0,0,0,0,0,47,115,118,103,47,99,114,105,109,115,111,110,0,0,0,0,47,115,118,103,47,99,111,114,110,115,105,108,107,0,0,0,47,115,118,103,47,99,111,114,110,102,108,111,119,101,114,98,108,117,101,0,0,0,0,0,47,98,117,103,110,54,47,51,0,0,0,0,0,0,0,0,47,115,118,103,47,99,111,114,97,108,0,0,0,0,0,0,47,115,118,103,47,99,104,111,99,111,108,97,116,101,0,0,47,115,118,103,47,99,104,97,114,116,114,101,117,115,101,0,47,97,
-99,99,101,110,116,54,47,50,0,0,0,0,0,0,47,115,118,103,47,99,97,100,101,116,98,108,117,101,0,0,35,37,48,50,120,37,48,50,120,37,48,50,120,37,48,50,120,0,0,0,0,0,0,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,116,114,105,115,0,0,0,0,0,47,115,118,103,47,98,117,114,108,121,119,111,111,100,0,0,47,115,118,103,47,98,114,111,119,110,0,0,0,0,0,0,116,97,105,108,112,111,114,116,0,0,0,0,0,0,0,0,9,47,114,120,32,101,120,99,104,32,100,101,102,0,0,0,32,112,111,105,110,116,115,61,34,0,0,0,0,0,0,0,102,114,
-97,99,49,52,0,0,65,118,97,110,116,71,97,114,100,101,45,66,111,111,107,79,98,108,105,113,117,101,0,0,110,101,119,46,103,118,0,0,47,115,118,103,47,98,108,117,101,118,105,111,108,101,116,0,47,115,118,103,47,98,108,117,101,0,0,0,0,0,0,0,99,105,114,99,108,101,0,0,100,101,114,105,118,101,100,0,37,100,32,40,37,46,53,103,44,32,37,46,53,103,41,44,32,40,37,46,53,103,44,32,37,46,53,103,41,10,0,0,99,111,117,108,100,110,39,116,32,111,112,101,110,32,101,112,115,102,32,102,105,108,101,32,37,115,10,0,0,0,0,0,37,
-46,51,102,32,0,0,0,47,115,118,103,47,98,108,97,110,99,104,101,100,97,108,109,111,110,100,0,0,0,0,0,120,108,112,0,0,0,0,0,92,71,0,0,0,0,0,0,47,115,118,103,47,98,108,97,99,107,0,0,0,0,0,0,47,98,117,103,110,54,47,50,0,0,0,0,0,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,0,0,0,0,37,100,0,0,0,0,0,0,47,115,118,103,47,98,105,115,113,117,101,0,0,0,0,0,102,105,120,101,100,32,99,101,108,108,32,115,105,122,101,32,119,105,116,104,32,117,110,115,112,101,99,105,102,105,101,100,32,119,105,100,116,104,32,
-111,114,32,104,101,105,103,104,116,10,0,0,0,0,0,0,0,115,112,101,99,105,102,105,101,100,32,114,111,111,116,32,110,111,100,101,32,34,37,115,34,32,119,97,115,32,110,111,116,32,102,111,117,110,100,46,0,47,115,118,103,47,98,101,105,103,101,0,0,0,0,0,0,83,85,80,0,0,0,0,0,47,115,118,103,47,97,122,117,114,101,0,0,0,0,0,0,111,118,101,114,108,97,112,32,91,37,100,93,32,58,32,37,100,10,0,0,0,0,0,0,47,115,118,103,47,97,113,117,97,109,97,114,105,110,101,0,99,108,97,115,115,50,46,99,0,0,0,0,0,0,0,0,99,111,108,111,
-114,115,99,104,101,109,101,0,0,0,0,0,47,115,118,103,47,97,113,117,97,0,0,0,0,0,0,0,47,115,118,103,47,97,110,116,105,113,117,101,119,104,105,116,101,0,0,0,0,0,0,0,9,47,114,121,32,101,120,99,104,32,100,101,102,0,0,0,60,112,111,108,121,108,105,110,101,0,0,0,0,0,0,0,102,114,97,99,49,50,0,0,98,117,114,108,121,119,111,111,100,0,0,0,0,0,0,0,47,115,118,103,47,97,108,105,99,101,98,108,117,101,0,0,98,101,115,116,99,111,115,116,32,60,32,72,85,71,69,95,86,65,76,0,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,
-57,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,56,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,55,0,0,0,0,47,98,117,103,110,54,47,49,0,0,0,0,0,0,0,0,100,105,0,0,0,0,0,0,37,108,100,0,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,54,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,53,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,52,0,0,0,0,109,105,110,0,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,51,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,50,0,0,0,0,105,110,0,0,0,0,0,0,101,100,103,101,
-0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,49,0,0,0,0,47,101,108,108,105,112,115,101,95,112,97,116,104,32,123,0,32,45,45,62,10,0,0,0,102,111,114,97,108,108,0,0,111,117,116,32,111,102,32,100,121,110,97,109,105,99,32,109,101,109,111,114,121,32,105,110,32,97,97,103,95,103,101,116,95,110,101,120,116,95,98,117,102,102,101,114,40,41,0,0,47,115,112,101,99,116,114,97,108,56,47,56,0,0,0,0,99,111,108,111,114,32,37,115,0,0,0,0,0,0,0,0,47,115,112,101,99,116,114,97,108,56,47,55,0,0,0,0,109,99,108,105,109,
-105,116,0,47,115,112,101,99,116,114,97,108,56,47,54,0,0,0,0,60,97,114,101,97,32,115,104,97,112,101,61,34,99,105,114,99,108,101,34,0,0,0,0,47,115,112,101,99,116,114,97,108,56,47,53,0,0,0,0,47,98,117,103,110,53,47,53,0,0,0,0,0,0,0,0,47,115,112,101,99,116,114,97,108,56,47,52,0,0,0,0,47,115,112,101,99,116,114,97,108,56,47,51,0,0,0,0,47,115,112,101,99,116,114,97,108,56,47,50,0,0,0,0,47,115,112,101,99,116,114,97,108,56,47,49,0,0,0,0,47,115,112,101,99,116,114,97,108,55,47,55,0,0,0,0,47,115,112,101,99,116,
-114,97,108,55,47,54,0,0,0,0,9,9,99,108,111,115,101,112,97,116,104,0,0,0,0,0,60,33,45,45,32,0,0,0,102,110,111,102,0,0,0,0,47,115,112,101,99,116,114,97,108,55,47,53,0,0,0,0,47,115,112,101,99,116,114,97,108,55,47,52,0,0,0,0,47,115,112,101,99,116,114,97,108,55,47,51,0,0,0,0,47,115,112,101,99,116,114,97,108,55,47,50,0,0,0,0,47,98,117,103,110,53,47,52,0,0,0,0,0,0,0,0,114,101,102,101,114,101,110,99,101,32,116,111,32,105,110,118,97,108,105,100,32,99,104,97,114,97,99,116,101,114,32,110,117,109,98,101,114,
-0,0,0,47,115,112,101,99,116,114,97,108,55,47,49,0,0,0,0,47,115,112,101,99,116,114,97,108,54,47,54,0,0,0,0,47,115,112,101,99,116,114,97,108,54,47,53,0,0,0,0,47,115,112,101,99,116,114,97,108,54,47,52,0,0,0,0,47,115,112,101,99,116,114,97,108,54,47,51,0,0,0,0,47,115,112,101,99,116,114,97,108,54,47,50,0,0,0,0,9,9,112,111,112,32,110,101,103,32,48,32,114,108,105,110,101,116,111,0,0,0,0,0,121,101,108,108,111,119,103,114,101,101,110,0,0,0,0,0,101,120,105,115,116,0,0,0,47,115,112,101,99,116,114,97,108,54,47,
-49,0,0,0,0,47,115,112,101,99,116,114,97,108,53,47,53,0,0,0,0,47,115,112,101,99,116,114,97,108,53,47,52,0,0,0,0,47,115,112,101,99,116,114,97,108,53,47,51,0,0,0,0,47,98,117,103,110,53,47,51,0,0,0,0,0,0,0,0,106,112,103,58,118,114,109,108,0,0,0,0,0,0,0,0,47,115,112,101,99,116,114,97,108,53,47,50,0,0,0,0,47,115,112,101,99,116,114,97,108,53,47,49,0,0,0,0,47,115,112,101,99,116,114,97,108,52,47,52,0,0,0,0,47,115,112,101,99,116,114,97,108,52,47,51,0,0,0,0,47,115,112,101,99,116,114,97,108,52,47,50,0,0,0,0,
-47,115,112,101,99,116,114,97,108,52,47,49,0,0,0,0,9,9,48,32,101,120,99,104,32,114,108,105,110,101,116,111,0,0,0,0,0,0,0,0,121,101,108,108,111,119,0,0,101,117,114,111,0,0,0,0,47,115,112,101,99,116,114,97,108,51,47,51,0,0,0,0,114,0,0,0,0,0,0,0,47,115,112,101,99,116,114,97,108,51,47,50,0,0,0,0,47,115,112,101,99,116,114,97,108,51,47,49,0,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,57,0,0,0,47,98,117,103,110,53,47,50,0,0,0,0,0,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,56,0,0,0,47,115,112,101,
-99,116,114,97,108,49,49,47,55,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,54,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,53,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,52,0,0,0,38,108,116,59,0,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,51,0,0,0,119,104,105,116,101,115,109,111,107,101,0,0,0,0,0,0,102,105,103,58,102,105,103,0,101,117,109,108,0,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,50,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,49,49,0,0,9,9,101,120,99,104,32,48,32,114,
-108,105,110,101,116,111,0,0,0,0,0,0,0,0,47,98,117,103,110,53,47,49,0,0,0,0,0,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,49,48,0,0,47,115,112,101,99,116,114,97,108,49,49,47,49,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,57,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,56,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,55,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,54,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,53,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,52,0,0,0,9,9,50,32,
-99,111,112,121,0,0,0,0,0,0,0,0,37,48,51,111,0,0,0,0,119,104,105,116,101,0,0,0,101,116,104,0,0,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,51,0,0,0,110,32,62,61,32,52,0,0,47,115,112,101,99,116,114,97,108,49,48,47,50,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,49,48,0,0,47,115,112,101,99,116,114,97,108,49,48,47,49,0,0,0,47,98,117,103,110,52,47,52,0,0,0,0,0,0,0,0,47,115,101,116,51,57,47,57,0,0,0,0,0,0,0,0,47,115,101,116,51,57,47,56,0,0,0,0,0,0,0,0,47,115,101,116,51,57,47,55,0,0,0,0,0,0,0,0,47,
-115,101,116,51,57,47,54,0,0,0,0,0,0,0,0,47,115,101,116,51,57,47,53,0,0,0,0,0,0,0,0,47,115,101,116,51,57,47,52,0,0,0,0,0,0,0,0,9,9,109,111,118,101,116,111,0,0,0,0,0,0,0,0,119,104,101,97,116,0,0,0,101,116,97,0,0,0,0,0,71,0,0,0,0,0,0,0,47,115,101,116,51,57,47,51,0,0,0,0,0,0,0,0,110,111,100,101,108,105,115,116,46,99,0,0,0,0,0,0,47,115,101,116,51,57,47,50,0,0,0,0,0,0,0,0,47,115,101,116,51,57,47,49,0,0,0,0,0,0,0,0,47,115,101,116,51,56,47,56,0,0,0,0,0,0,0,0,47,98,117,103,110,52,47,51,0,0,0,0,0,0,0,0,102,
-117,99,104,115,105,97,0,47,115,101,116,51,56,47,55,0,0,0,0,0,0,0,0,47,115,101,116,51,56,47,54,0,0,0,0,0,0,0,0,47,115,101,116,51,56,47,53,0,0,0,0,0,0,0,0,47,115,101,116,51,56,47,52,0,0,0,0,0,0,0,0,47,115,101,116,51,56,47,51,0,0,0,0,0,0,0,0,32,45,116,97,103,115,32,123,37,100,37,115,37,100,125,0,47,115,101,116,51,56,47,50,0,0,0,0,0,0,0,0,9,9,52,32,50,32,114,111,108,108,0,0,0,0,0,0,118,105,111,108,101,116,0,0,101,113,117,105,118,0,0,0,47,115,101,116,51,56,47,49,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,
-55,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,54,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,53,0,0,0,0,0,0,0,0,47,98,117,103,110,52,47,50,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,52,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,51,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,50,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,49,0,0,0,0,0,0,0,0,47,97,99,99,101,110,116,54,47,49,0,0,0,0,0,0,35,37,48,50,120,37,48,50,120,37,48,50,120,0,0,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,116,114,105,115,0,0,0,0,0,0,47,115,101,
-116,51,54,47,54,0,0,0,0,0,0,0,0,47,115,101,116,51,54,47,53,0,0,0,0,0,0,0,0,98,108,97,99,107,0,0,0,47,98,111,120,112,114,105,109,32,123,9,9,9,9,37,32,120,99,111,114,110,101,114,32,121,99,111,114,110,101,114,32,120,115,105,122,101,32,121,115,105,122,101,0,0,0,0,0,116,117,114,113,117,111,105,115,101,0,0,0,0,0,0,0,101,112,115,105,108,111,110,0,116,107,58,116,107,0,0,0,115,112,108,105,116,46,113,46,99,0,0,0,0,0,0,0,115,97,110,115,45,83,101,114,105,102,0,0,0,0,0,0,47,115,101,116,51,54,47,52,0,0,0,0,0,0,
-0,0,110,111,110,97,109,101,46,103,118,0,0,0,0,0,0,0,47,115,101,116,51,54,47,51,0,0,0,0,0,0,0,0,111,118,97,108,0,0,0,0,100,101,114,105,118,101,32,103,114,97,112,104,32,37,115,32,111,102,32,37,115,10,0,0,37,100,32,98,111,120,101,115,58,10,0,0,0,0,0,0,85,84,70,45,56,32,105,110,112,117,116,32,117,115,101,115,32,110,111,110,45,76,97,116,105,110,49,32,99,104,97,114,97,99,116,101,114,115,32,119,104,105,99,104,32,99,97,110,110,111,116,32,98,101,32,104,97,110,100,108,101,100,32,98,121,32,116,104,105,115,32,
-80,111,115,116,83,99,114,105,112,116,32,100,114,105,118,101,114,10,0,0,0,0,0,0,0,47,115,101,116,51,54,47,50,0,0,0,0,0,0,0,0,104,101,105,103,104,116,0,0,47,115,101,116,51,54,47,49,0,0,0,0,0,0,0,0,47,98,117,103,110,52,47,49,0,0,0,0,0,0,0,0,32,32,102,108,97,103,115,32,32,37,100,10,0,0,0,0,47,115,101,116,51,53,47,53,0,0,0,0,0,0,0,0,99,101,108,108,32,115,105,122,101,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,99,111,110,116,101,110,116,10,0,0,0,0,0,0,0,0,47,115,101,116,51,53,47,52,0,0,0,0,0,
-0,0,0,73,0,0,0,0,0,0,0,47,115,101,116,51,53,47,51,0,0,0,0,0,0,0,0,78,117,109,98,101,114,32,111,102,32,105,110,99,114,101,97,115,101,115,32,61,32,37,100,10,0,0,0,0,0,0,0,116,97,105,108,112,111,114,116,0,0,0,0,0,0,0,0,47,115,101,116,51,53,47,50,0,0,0,0,0,0,0,0,47,115,101,116,51,53,47,49,0,0,0,0,0,0,0,0,98,32,61,61,32,110,0,0,47,115,101,116,51,52,47,52,0,0,0,0,0,0,0,0,9,103,114,101,115,116,111,114,101,0,0,0,0,0,0,0,116,111,109,97,116,111,0,0,101,110,115,112,0,0,0,0,98,114,111,119,110,0,0,0,47,115,101,
-116,51,52,47,51,0,0,0,0,0,0,0,0,47,115,101,116,51,52,47,50,0,0,0,0,0,0,0,0,47,115,101,116,51,52,47,49,0,0,0,0,0,0,0,0,47,115,101,116,51,51,47,51,0,0,0,0,0,0,0,0,47,98,117,103,110,51,47,51,0,0,0,0,0,0,0,0,115,117,98,0,0,0,0,0,47,115,101,116,51,51,47,50,0,0,0,0,0,0,0,0,114,97,110,100,111,109,0,0,47,115,101,116,51,51,47,49,0,0,0,0,0,0,0,0,47,115,101,116,51,49,50,47,57,0,0,0,0,0,0,0,114,97,110,107,0,0,0,0,41,10,45,45,62,10,0,0,47,115,101,116,51,49,50,47,56,0,0,0,0,0,0,0,47,115,101,116,51,49,50,47,55,
-0,0,0,0,0,0,0,37,108,102,32,37,108,102,32,37,108,102,32,37,108,102,0,110,111,100,101,0,0,0,0,47,115,101,116,51,49,50,47,54,0,0,0,0,0,0,0,9,9,125,32,105,102,0,0,116,104,105,115,116,108,101,0,101,109,115,112,0,0,0,0,47,115,101,116,51,49,50,47,53,0,0,0,0,0,0,0,69,68,95,108,97,98,101,108,40,102,101,41,0,0,0,0,98,111,116,104,0,0,0,0,47,115,101,116,51,49,50,47,52,0,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,47,115,101,116,51,49,50,47,51,0,0,0,0,0,0,0,114,101,99,116,97,110,103,108,
-101,32,40,37,100,44,37,100,41,32,40,37,100,44,37,100,41,32,37,115,32,37,115,10,0,0,0,0,0,0,0,0,47,115,101,116,51,49,50,47,50,0,0,0,0,0,0,0,47,98,117,103,110,51,47,50,0,0,0,0,0,0,0,0,47,115,101,116,51,49,50,47,49,50,0,0,0,0,0,0,47,115,101,116,51,49,50,47,49,49,0,0,0,0,0,0,47,115,101,116,51,49,50,47,49,48,0,0,0,0,0,0,32,40,0,0,0,0,0,0,47,115,101,116,51,49,50,47,49,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,57,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,56,0,0,0,0,0,0,0,9,9,9,116,101,120,116,32,115,116,114,
-105,110,103,119,105,100,116,104,32,112,111,112,32,119,105,100,116,104,32,101,120,99,104,32,115,117,98,32,116,101,120,116,32,108,101,110,103,116,104,32,100,105,118,32,48,32,116,101,120,116,32,97,115,104,111,119,0,0,0,0,0,116,101,97,108,0,0,0,0,101,109,112,116,121,0,0,0,76,101,102,116,0,0,0,0,47,115,101,116,51,49,49,47,55,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,54,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,53,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,52,0,0,0,0,0,0,0,47,98,117,103,110,51,47,49,0,0,0,
-0,0,0,0,0,97,115,121,110,99,104,114,111,110,111,117,115,32,101,110,116,105,116,121,0,0,0,0,0,47,115,101,116,51,49,49,47,51,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,50,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,49,49,0,0,0,0,0,0,32,118,101,114,115,105,111,110,32,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,49,48,0,0,0,0,0,0,47,115,101,116,51,49,49,47,49,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,57,0,0,0,0,0,0,0,9,9,9,91,93,32,48,32,115,101,116,100,97,115,104,0,116,97,110,0,0,0,0,0,101,103,114,97,118,101,
-0,0,47,115,101,116,51,49,48,47,56,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,55,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,54,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,53,0,0,0,0,0,0,0,47,98,114,98,103,57,47,57,0,0,0,0,0,0,0,0,106,112,101,58,118,114,109,108,0,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,52,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,51,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,50,0,0,0,0,0,0,0,10,60,33,45,45,32,71,101,110,101,114,97,116,101,100,32,98,121,32,0,0,0,0,0,47,115,101,116,51,49,48,47,
-49,48,0,0,0,0,0,0,102,100,112,0,0,0,0,0,47,115,101,116,51,49,48,47,49,0,0,0,0,0,0,0,100,111,116,0,0,0,0,0,47,115,101,116,50,56,47,56,0,0,0,0,0,0,0,0,9,9,119,105,100,116,104,32,48,32,103,116,32,123,0,0,115,116,101,101,108,98,108,117,101,0,0,0,0,0,0,0,101,99,105,114,99,0,0,0,47,115,101,116,50,56,47,55,0,0,0,0,0,0,0,0,114,97,110,107,40,103,44,32,50,44,32,110,115,105,116,101,114,50,40,103,41,41,32,61,61,32,48,0,0,0,0,0,47,115,101,116,50,56,47,54,0,0,0,0,0,0,0,0,111,0,0,0,0,0,0,0,47,115,101,116,50,56,
-47,53,0,0,0,0,0,0,0,0,47,115,101,116,50,56,47,52,0,0,0,0,0,0,0,0,47,98,114,98,103,57,47,56,0,0,0,0,0,0,0,0,47,115,101,116,50,56,47,51,0,0,0,0,0,0,0,0,47,115,101,116,50,56,47,50,0,0,0,0,0,0,0,0,47,115,101,116,50,56,47,49,0,0,0,0,0,0,0,0,60,72,84,77,76,62,10,0,47,115,101,116,50,55,47,55,0,0,0,0,0,0,0,0,47,115,101,116,50,55,47,54,0,0,0,0,0,0,0,0,47,115,101,116,50,55,47,53,0,0,0,0,0,0,0,0,9,103,115,97,118,101,0,0,115,112,114,105,110,103,103,114,101,101,110,0,0,0,0,0,101,97,99,117,116,101,0,0,47,115,101,
-116,50,55,47,52,0,0,0,0,0,0,0,0,47,115,101,116,50,55,47,51,0,0,0,0,0,0,0,0,47,115,101,116,50,55,47,50,0,0,0,0,0,0,0,0,47,115,101,116,50,55,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,57,47,55,0,0,0,0,0,0,0,0,47,115,101,116,50,54,47,54,0,0,0,0,0,0,0,0,47,115,101,116,50,54,47,53,0,0,0,0,0,0,0,0,47,115,101,116,50,54,47,52,0,0,0,0,0,0,0,0,32,99,111,111,114,100,111,114,105,103,105,110,61,34,48,44,48,34,32,99,111,111,114,100,115,105,122,101,61,34,37,100,44,37,100,34,32,62,0,0,47,115,101,116,50,54,47,51,0,0,
-0,0,0,0,0,0,47,115,101,116,50,54,47,50,0,0,0,0,0,0,0,0,47,115,101,116,50,54,47,49,0,0,0,0,0,0,0,0,9,47,119,105,100,116,104,32,101,120,99,104,32,100,101,102,0,0,0,0,0,0,0,0,34,37,115,34,32,97,116,32,40,37,46,53,102,44,37,46,53,102,41,59,10,0,0,0,115,110,111,119,0,0,0,0,100,105,118,105,100,101,0,0,47,115,101,116,50,53,47,53,0,0,0,0,0,0,0,0,47,115,101,116,50,53,47,52,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,47,115,101,116,50,53,47,51,0,0,0,0,0,0,0,0,47,115,101,116,50,53,47,50,0,0,0,0,0,0,0,0,47,98,114,98,103,
-57,47,54,0,0,0,0,0,0,0,0,47,115,101,116,50,53,47,49,0,0,0,0,0,0,0,0,47,115,101,116,50,52,47,52,0,0,0,0,0,0,0,0,47,115,101,116,50,52,47,51,0,0,0,0,0,0,0,0,32,119,105,100,116,104,58,32,37,100,112,116,59,32,104,101,105,103,104,116,58,32,37,100,112,116,34,0,0,0,0,0,47,115,101,116,50,52,47,50,0,0,0,0,0,0,0,0,47,115,101,116,50,52,47,49,0,0,0,0,0,0,0,0,73,32,0,0,0,0,0,0,47,115,101,116,50,51,47,51,0,0,0,0,0,0,0,0,9,47,116,101,120,116,32,101,120,99,104,32,100,101,102,0,100,105,97,109,115,0,0,0,115,108,97,
-116,101,103,114,101,121,0,0,0,0,0,0,0,104,101,97,100,112,111,114,116,0,0,0,0,0,0,0,0,47,115,101,116,50,51,47,50,0,0,0,0,0,0,0,0,70,0,0,0,0,0,0,0,47,115,101,116,50,51,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,57,47,53,0,0,0,0,0,0,0,0,47,115,101,116,49,57,47,57,0,0,0,0,0,0,0,0,47,115,101,116,49,57,47,56,0,0,0,0,0,0,0,0,99,118,116,46,99,0,0,0,98,108,117,101,0,0,0,0,47,115,101,116,49,57,47,55,0,0,0,0,0,0,0,0,47,115,101,116,49,57,47,54,0,0,0,0,0,0,0,0,47,115,101,116,49,57,47,53,0,0,0,0,0,0,0,0,32,60,118,
-58,103,114,111,117,112,32,115,116,121,108,101,61],"i8",L,l.J+143400);D([34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,32,0,0,0,0,47,115,101,116,49,57,47,52,0,0,0,0,0,0,0,0,47,115,101,116,49,57,47,51,0,0,0,0,0,0,0,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,116,107,46,99,0,0,0,0,0,0,47,115,101,116,49,57,47,50,0,0,0,0,0,0,0,0,47,97,108,105,103,110,101,100,116,101,120,116,32,123,9,9,9,37,32,119,105,100,116,104,32,116,101,120,116,0,0,0,100,101,108,116,97,0,0,0,115,
-108,97,116,101,103,114,97,121,0,0,0,0,0,0,0,117,115,0,0,0,0,0,0,47,115,101,116,49,57,47,49,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,56,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,55,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,54,0,0,0,0,0,0,0,0,47,98,114,98,103,57,47,52,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,53,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,52,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,51,0,0,0,0,0,0,0,0,60,120,109,108,58,110,97,109,101,115,112,97,99,101,32,110,115,61,34,117,114,110,58,115,99,104,
-101,109,97,115,45,109,105,99,114,111,115,111,102,116,45,99,111,109,58,118,109,108,34,32,112,114,101,102,105,120,61,34,118,34,32,47,62,10,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,50,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,49,0,0,0,0,0,0,0,0,99,32,0,0,0,0,0,0,47,97,99,99,101,110,116,53,47,53,0,0,0,0,0,0,114,111,117,116,101,46,99,0,47,115,101,116,49,55,47,55,0,0,0,0,0,0,0,0,84,105,109,101,115,45,82,111,109,97,110,0,0,0,0,0,37,32,100,114,97,119,32,116,101,120,116,32,102,105,116,116,101,100,32,116,111,
-32,105,116,115,32,101,120,112,101,99,116,101,100,32,119,105,100,116,104,0,0,0,0,0,0,0,0,100,101,103,0,0,0,0,0,115,108,97,116,101,98,108,117,101,0,0,0,0,0,0,0,98,111,111,107,0,0,0,0,47,115,101,116,49,55,47,54,0,0,0,0,0,0,0,0,46,37,100,0,0,0,0,0,70,65,76,83,69,0,0,0,47,115,101,116,49,55,47,53,0,0,0,0,0,0,0,0,101,108,108,105,112,115,101,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,101,110,100,32,112,111,114,116,32,110,111,116,32,105,110,32,108,97,115,116,32,98,111,120,10,0,65,103,114,97,112,104,
-105,110,102,111,95,116,0,0,0,0,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,0,47,115,101,116,49,55,47,52,0,0,0,0,0,0,0,0,119,105,100,116,104,0,0,0,77,97,120,46,32,105,116,101,114,97,116,105,111,110,115,32,40,37,100,41,32,114,101,97,99,104,101,100,32,111,110,32,103,114,97,112,104,32,37,115,10,0,0,0,0,0,0,0,116,101,120,116,115,112,97,110,46,99,0,0,0,0,0,0,38,35,51,57,59,0,0,0,102,97,116,97,108,32,101,114,114,111,114,32,45,32,115,99,97,110,110,101,114,32,105,110,112,117,116,32,98,117,102,102,101,
-114,32,111,118,101,114,102,108,111,119,0,0,0,0,0,47,115,101,116,49,55,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,57,47,51,0,0,0,0,0,0,0,0,32,32,115,105,122,101,32,32,32,37,100,10,0,0,0,0,10,102,105,110,97,108,32,101,32,61,32,37,102,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,37,46,50,102,32,115,101,99,10,0,0,0,47,115,101,116,49,55,47,50,0,0,0,0,0,0,0,0,115,112,108,105,110,101,115,46,99,0,0,0,0,0,0,0,102,105,120,101,100,32,116,97,98,108,101,32,115,105,122,101,32,119,105,116,104,32,117,110,115,
-112,101,99,105,102,105,101,100,32,119,105,100,116,104,32,111,114,32,104,101,105,103,104,116,10,0,0,0,0,0,0,47,115,101,116,49,55,47,49,0,0,0,0,0,0,0,0,85,0,0,0,0,0,0,0,47,115,101,116,49,54,47,54,0,0,0,0,0,0,0,0,78,117,109,98,101,114,32,111,102,32,105,116,101,114,97,116,105,111,110,115,32,61,32,37,100,10,0,0,0,0,0,0,60,47,83,84,89,76,69,62,10,0,0,0,0,0,0,0,47,115,101,116,49,54,47,53,0,0,0,0,0,0,0,0,99,108,117,115,116,101,114,32,110,97,109,101,100,32,37,115,32,110,111,116,32,102,111,117,110,100,10,0,
-0,0,0,0,99,111,109,109,101,110,116,0,47,115,101,116,49,54,47,52,0,0,0,0,0,0,0,0,112,111,108,121,108,105,110,101,32,37,115,32,37,115,10,0,47,115,101,116,49,54,47,51,0,0,0,0,0,0,0,0,9,115,99,97,108,101,102,111,110,116,32,115,101,116,102,111,110,116,0,0,0,0,0,0,100,97,114,114,0,0,0,0,115,107,121,98,108,117,101,0,47,115,101,116,49,54,47,50,0,0,0,0,0,0,0,0,85,110,115,117,112,112,111,114,116,101,100,32,99,104,97,114,115,101,116,32,34,37,115,34,32,45,32,97,115,115,117,109,105,110,103,32,117,116,102,45,56,
-10,0,0,0,0,0,0,98,108,117,101,118,105,111,108,101,116,0,0,0,0,0,0,95,100,103,95,37,100,0,0,47,115,101,116,49,54,47,49,0,0,0,0,0,0,0,0,47,115,101,116,49,53,47,53,0,0,0,0,0,0,0,0,105,110,100,101,120,46,99,0,47,115,101,116,49,53,47,52,0,0,0,0,0,0,0,0,47,98,114,98,103,57,47,50,0,0,0,0,0,0,0,0,47,115,101,116,49,53,47,51,0,0,0,0,0,0,0,0,114,101,103,117,108,97,114,0,47,115,101,116,49,53,47,50,0,0,0,0,0,0,0,0,115,105,100,101,115,32,61,61,32,52,0,0,0,0,0,0,47,115,101,116,49,53,47,49,0,0,0,0,0,0,0,0,118,92,
-58,42,32,123,32,98,101,104,97,118,105,111,114,58,32,117,114,108,40,35,100,101,102,97,117,108,116,35,86,77,76,41,59,100,105,115,112,108,97,121,58,105,110,108,105,110,101,45,98,108,111,99,107,125,10,0,0,0,0,0,0,0,47,115,101,116,49,52,47,52,0,0,0,0,0,0,0,0,110,111,100,101,115,32,116,111,117,99,104,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,0,0,0,0,0,0,47,115,101,116,49,52,47,51,0,0,0,0,0,0,0,0,114,111,
-117,116,101,115,112,108,105,110,101,115,58,32,37,100,32,101,100,103,101,115,44,32,37,100,32,98,111,120,101,115,32,37,46,50,102,32,115,101,99,10,0,0,0,0,0,0,118,105,101,119,66,111,120,0,103,114,97,112,104,0,0,0,47,115,101,116,49,52,47,50,0,0,0,0,0,0,0,0,9,102,105,110,100,102,111,110,116,32,101,120,99,104,0,0,100,97,103,103,101,114,0,0,115,105,108,118,101,114,0,0,116,101,120,116,108,97,121,111,117,116,0,0,0,0,0,0,116,114,105,97,110,103,117,108,97,116,105,111,110,32,102,97,105,108,101,100,0,0,0,0,115,
-104,97,112,101,102,105,108,101,32,110,111,116,32,115,101,116,32,111,114,32,110,111,116,32,102,111,117,110,100,32,102,111,114,32,101,112,115,102,32,110,111,100,101,32,37,115,10,0,0,0,0,0,0,0,0,47,115,101,116,49,52,47,49,0,0,0,0,0,0,0,0,117,116,102,56,0,0,0,0,104,101,105,103,104,116,0,0,47,115,101,116,49,51,47,51,0,0,0,0,0,0,0,0,47,112,97,116,104,98,111,120,32,123,10,32,32,32,32,47,89,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,88,32,101,120,99,104,32,37,46,53,103,
-32,115,117,98,32,100,101,102,10,32,32,32,32,47,121,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,120,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,110,101,119,112,97,116,104,32,120,32,121,32,109,111,118,101,116,111,10,32,32,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,32,32,99,108,111,115,101,112,97,116,104,32,115,116,114,
-111,107,101,10,32,125,32,100,101,102,10,47,100,98,103,115,116,97,114,116,32,123,32,103,115,97,118,101,32,37,46,53,103,32,37,46,53,103,32,116,114,97,110,115,108,97,116,101,32,125,32,100,101,102,10,47,97,114,114,111,119,108,101,110,103,116,104,32,49,48,32,100,101,102,10,47,97,114,114,111,119,119,105,100,116,104,32,97,114,114,111,119,108,101,110,103,116,104,32,50,32,100,105,118,32,100,101,102,10,47,97,114,114,111,119,104,101,97,100,32,123,10,32,32,32,32,103,115,97,118,101,10,32,32,32,32,114,111,116,
-97,116,101,10,32,32,32,32,99,117,114,114,101,110,116,112,111,105,110,116,10,32,32,32,32,110,101,119,112,97,116,104,10,32,32,32,32,109,111,118,101,116,111,10,32,32,32,32,97,114,114,111,119,108,101,110,103,116,104,32,97,114,114,111,119,119,105,100,116,104,32,50,32,100,105,118,32,114,108,105,110,101,116,111,10,32,32,32,32,48,32,97,114,114,111,119,119,105,100,116,104,32,110,101,103,32,114,108,105,110,101,116,111,10,32,32,32,32,99,108,111,115,101,112,97,116,104,32,102,105,108,108,10,32,32,32,32,103,114,
-101,115,116,111,114,101,10,125,32,98,105,110,100,32,100,101,102,10,47,109,97,107,101,97,114,114,111,119,32,123,10,32,32,32,32,99,117,114,114,101,110,116,112,111,105,110,116,32,101,120,99,104,32,112,111,112,32,115,117,98,32,101,120,99,104,32,99,117,114,114,101,110,116,112,111,105,110,116,32,112,111,112,32,115,117,98,32,97,116,97,110,10,32,32,32,32,97,114,114,111,119,104,101,97,100,10,125,32,98,105,110,100,32,100,101,102,10,47,112,111,105,110,116,32,123,32,32,32,32,110,101,119,112,97,116,104,32,32,
-32,32,50,32,48,32,51,54,48,32,97,114,99,32,102,105,108,108,125,32,100,101,102,47,109,97,107,101,118,101,99,32,123,10,32,32,32,32,47,89,32,101,120,99,104,32,100,101,102,10,32,32,32,32,47,88,32,101,120,99,104,32,100,101,102,10,32,32,32,32,47,121,32,101,120,99,104,32,100,101,102,10,32,32,32,32,47,120,32,101,120,99,104,32,100,101,102,10,32,32,32,32,110,101,119,112,97,116,104,32,120,32,121,32,109,111,118,101,116,111,10,32,32,32,32,88,32,89,32,108,105,110,101,116,111,32,115,116,114,111,107,101,10,32,32,
-32,32,88,32,89,32,109,111,118,101,116,111,10,32,32,32,32,120,32,121,32,109,97,107,101,97,114,114,111,119,10,125,32,100,101,102,10,0,0,0,0,0,0,47,98,114,98,103,57,47,49,0,0,0,0,0,0,0,0,95,110,101,119,95,114,97,110,107,0,0,0,0,0,0,0,47,115,101,116,49,51,47,50,0,0,0,0,0,0,0,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,109,97,112,46,99,0,0,0,0,0,47,115,101,116,49,51,47,49,0,0,0,0,0,0,0,0,47,114,101,100,115,57,47,57,0,0,0,0,0,0,0,0,47,114,101,100,115,57,47,56,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,
-47,114,101,100,115,57,47,55,0,0,0,0,0,0,0,0,37,115,32,37,100,32,110,111,100,101,115,32,37,100,32,101,100,103,101,115,32,109,97,120,105,116,101,114,61,37,100,32,98,97,108,97,110,99,101,61,37,100,10,0,0,0,0,0,60,83,84,89,76,69,62,10,0,0,0,0,0,0,0,0,47,114,101,100,115,57,47,54,0,0,0,0,0,0,0,0,47,114,101,100,115,57,47,53,0,0,0,0,0,0,0,0,47,114,101,100,115,57,47,52,0,0,0,0,0,0,0,0,47,115,101,116,95,102,111,110,116,32,123,0,0,0,0,0,100,65,114,114,0,0,0,0,115,105,101,110,110,97,0,0,114,101,99,116,97,110,
-103,108,101,46,99,0,0,0,0,0,47,114,101,100,115,57,47,51,0,0,0,0,0,0,0,0,98,105,103,53,0,0,0,0,47,114,101,100,115,57,47,50,0,0,0,0,0,0,0,0,105,110,32,108,97,98,101,108,32,111,102,32,110,111,100,101,32,37,115,10,0,0,0,0,47,114,101,100,115,57,47,49,0,0,0,0,0,0,0,0,47,114,101,100,115,56,47,56,0,0,0,0,0,0,0,0,47,98,114,98,103,56,47,56,0,0,0,0,0,0,0,0,114,101,99,117,114,115,105,118,101,32,101,110,116,105,116,121,32,114,101,102,101,114,101,110,99,101,0,0,0,0,0,0,47,114,101,100,115,56,47,55,0,0,0,0,0,0,0,
-0,69,114,114,111,114,0,0,0,47,114,101,100,115,56,47,54,0,0,0,0,0,0,0,0,47,114,101,100,115,56,47,53,0,0,0,0,0,0,0,0,108,101,110,0,0,0,0,0,32,119,105,100,116,104,58,32,37,100,112,116,59,32,104,101,105,103,104,116,58,32,37,100,112,116,34,62,10,0,0,0,47,114,101,100,115,56,47,52,0,0,0,0,0,0,0,0,47,114,101,100,115,56,47,51,0,0,0,0,0,0,0,0,47,114,101,100,115,56,47,50,0,0,0,0,0,0,0,0,9,125,32,105,102,0,0,0,99,117,114,114,101,110,0,0,115,101,97,115,104,101,108,108,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,
-111,116,32,111,112,101,110,32,34,37,115,34,32,102,111,114,32,119,114,105,116,105,110,103,32,58,32,37,115,10,0,0,0,47,114,101,100,115,56,47,49,0,0,0,0,0,0,0,0,98,105,103,45,53,0,0,0,37,100,0,0,0,0,0,0,47,114,101,100,115,55,47,55,0,0,0,0,0,0,0,0,47,114,101,100,115,55,47,54,0,0,0,0,0,0,0,0,47,114,101,100,115,55,47,53,0,0,0,0,0,0,0,0,47,98,114,98,103,56,47,55,0,0,0,0,0,0,0,0,106,112,101,103,58,118,114,109,108,0,0,0,0,0,0,0,47,114,101,100,115,55,47,52,0,0,0,0,0,0,0,0,47,114,101,100,115,55,47,51,0,0,0,
-0,0,0,0,0,47,114,101,100,115,55,47,50,0,0,0,0,0,0,0,0,60,68,73,86,32,105,100,61,39,95,86,77,76,49,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,32,100,105,115,112,108,97,121,58,105,110,108,105,110,101,59,32,118,105,115,105,98,105,108,105,116,121,58,104,105,100,100,101,110,0,0,0,0,47,114,101,100,115,55,47,49,0,0,0,0,0,0,0,0,47,114,101,100,115,54,47,54,0,0,0,0,0,0,0,0,47,114,101,100,115,54,47,53,0,0,0,0,0,0,0,0,112,115,0,0,0,0,0,0,99,117,112,
-0,0,0,0,0,115,101,97,103,114,101,101,110,0,0,0,0,0,0,0,0,47,114,101,100,115,54,47,52,0,0,0,0,0,0,0,0,73,83,79,45,73,82,45,49,48,48,0,0,0,0,0,0,37,115,32,58,32,37,102,32,37,102,10,0,0,0,0,0,100,111,116,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,32,97,115,112,101,99,116,32,97,116,116,114,105,98,117,116,101,32,102,111,114,32,100,105,115,99,111,110,110,101,99,116,101,100,32,103,114,97,112,104,115,32,111,114,32,103,114,97,112,104,115,32,119,105,116,104,32,99,108,117,
-115,116,101,114,115,10,0,0,0,0,0,0,47,114,101,100,115,54,47,51,0,0,0,0,0,0,0,0,9,9,103,114,101,115,116,111,114,101,0,0,0,0,0,0,67,97,108,99,117,108,97,116,105,110,103,32,115,117,98,115,101,116,32,109,111,100,101,108,0,0,0,0,0,0,0,0,47,114,101,100,115,54,47,50,0,0,0,0,0,0,0,0,105,110,115,101,116,0,0,0,102,97,108,115,101,0,0,0,99,117,114,118,101,0,0,0,83,121,110,116,97,120,32,101,114,114,111,114,58,32,110,111,110,45,115,112,97,99,101,32,115,116,114,105,110,103,32,117,115,101,100,32,97,102,116,101,114,
-32,60,47,84,65,66,76,69,62,0,0,0,0,0,0,47,114,101,100,115,54,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,56,47,54,0,0,0,0,0,0,0,0,116,119,111,112,105,58,32,117,115,101,32,111,102,32,119,101,105,103,104,116,61,48,32,99,114,101,97,116,101,115,32,100,105,115,99,111,110,110,101,99,116,101,100,32,99,111,109,112,111,110,101,110,116,46,10,0,47,114,101,100,115,53,47,53,0,0,0,0,0,0,0,0,47,114,101,100,115,53,47,52,0,0,0,0,0,0,0,0,47,114,101,100,115,53,47,51,0,0,0,0,0,0,0,0,60,66,79,68,89,32,111,110,108,111,97,100,
-61,39,98,114,111,119,115,101,114,99,104,101,99,107,40,41,59,39,62,10,0,0,0,0,0,0,0,0,47,114,101,100,115,53,47,50,0,0,0,0,0,0,0,0,47,114,101,100,115,53,47,49,0,0,0,0,0,0,0,0,47,114,101,100,115,52,47,52,0,0,0,0,0,0,0,0,32,37,100,32,0,0,0,0,99,114,97,114,114,0,0,0,115,97,110,100,121,98,114,111,119,110,0,0,0,0,0,0,47,114,101,100,115,52,47,51,0,0,0,0,0,0,0,0,73,83,79,56,56,53,57,45,49,0,0,0,0,0,0,0,47,114,101,100,115,52,47,50,0,0,0,0,0,0,0,0,9,9,9,40,92,40,41,32,115,104,111,119,32,105,32,115,116,114,32,
-99,118,115,32,115,104,111,119,32,40,44,41,32,115,104,111,119,32,106,32,115,116,114,32,99,118,115,32,115,104,111,119,32,40,92,41,41,32,115,104,111,119,0,0,0,47,114,101,100,115,52,47,49,0,0,0,0,0,0,0,0,60,72,84,77,76,62,0,0,47,114,101,100,115,51,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,56,47,53,0,0,0,0,0,0,0,0,47,114,101,100,115,51,47,50,0,0,0,0,0,0,0,0,47,114,101,100,115,51,47,49,0,0,0,0,0,0,0,0,47,114,100,121,108,103,110,57,47,57,0,0,0,0,0,0,60,47,72,69,65,68,62,0,47,114,100,121,108,103,110,57,47,56,
-0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,114,100,121,108,103,110,57,47,55,0,0,0,0,0,0,47,114,100,121,108,103,110,57,47,54,0,0,0,0,0,0,9,9,9,48,32,48,32,109,111,118,101,116,111,0,0,0,99,111,112,121,0,0,0,0,46,112,115,32,37,100,42,92,110,40,83,70,117,47,37,46,48,102,117,10,0,0,0,0,115,97,108,109,111,110,0,0,75,0,0,0,0,0,0,0,47,114,100,121,108,103,110,57,47,53,0,0,0,0,0,0,73,83,79,95,56,56,53,57,45,49,0,0,0,0,0,0,47,114,100,121,108,103,110,57,47,52,0,0,0,0,0,0,47,114,100,121,
-108,103,110,57,47,51,0,0,0,0,0,0,32,37,100,32,37,100,0,0,47,114,100,121,108,103,110,57,47,50,0,0,0,0,0,0,47,98,114,98,103,56,47,52,0,0,0,0,0,0,0,0,47,114,100,121,108,103,110,57,47,49,0,0,0,0,0,0,47,114,100,121,108,103,110,56,47,56,0,0,0,0,0,0,47,114,100,121,108,103,110,56,47,55,0,0,0,0,0,0,32,32,32,60,47,83,67,82,73,80,84,62,10,0,0,0,47,114,100,121,108,103,110,56,47,54,0,0,0,0,0,0,97,115,112,101,99,116,0,0,47,114,100,121,108,103,110,56,47,53,0,0,0,0,0,0,47,114,100,121,108,103,110,56,47,52,0,0,0,0,
-0,0,9,9,9,99,111,111,114,100,102,111,110,116,32,115,101,116,102,111,110,116,0,0,0,0,99,111,110,103,0,0,0,0,115,97,100,100,108,101,98,114,111,119,110,0,0,0,0,0,112,111,108,121,103,111,110,0,47,114,100,121,108,103,110,56,47,51,0,0,0,0,0,0,108,49,0,0,0,0,0,0,47,114,100,121,108,103,110,56,47,50,0,0,0,0,0,0,75,80,95,83,117,98,116,114,97,99,116,0,0,0,0,0,47,114,100,121,108,103,110,56,47,49,0,0,0,0,0,0,47,114,100,121,108,103,110,55,47,55,0,0,0,0,0,0,47,98,114,98,103,56,47,51,0,0,0,0,0,0,0,0,67,111,117,108,
-100,32,110,111,116,32,112,97,114,115,101,32,34,95,98,97,99,107,103,114,111,117,110,100,34,32,97,116,116,114,105,98,117,116,101,32,105,110,32,103,114,97,112,104,32,37,115,10,0,0,0,0,47,114,100,121,108,103,110,55,47,54,0,0,0,0,0,0,98,108,97,99,107,0,0,0,47,114,100,121,108,103,110,55,47,53,0,0,0,0,0,0,47,114,100,121,108,103,110,55,47,52,0,0,0,0,0,0,32,32,32,125,10,0,0,0,47,114,100,121,108,103,110,55,47,51,0,0,0,0,0,0,47,114,100,121,108,103,110,55,47,50,0,0,0,0,0,0,48,0,0,0,0,0,0,0,47,114,100,121,108,
-103,110,55,47,49,0,0,0,0,0,0,9,9,103,115,97,118,101,0,99,108,117,98,115,0,0,0,114,111,121,97,108,98,108,117,101,0,0,0,0,0,0,0,50,46,50,56,46,48,0,0,47,114,100,121,108,103,110,54,47,54,0,0,0,0,0,0,108,97,116,105,110,49,0,0,47,114,100,121,108,103,110,54,47,53,0,0,0,0,0,0,47,114,100,121,108,103,110,54,47,52,0,0,0,0,0,0,47,114,100,121,108,103,110,54,47,51,0,0,0,0,0,0,47,98,114,98,103,56,47,50,0,0,0,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,47,114,100,121,108,103,110,54,47,50,0,0,
-0,0,0,0,47,114,100,121,108,103,110,54,47,49,0,0,0,0,0,0,47,114,100,121,108,103,110,53,47,53,0,0,0,0,0,0,32,32,32,32,32,125,10,0,47,114,100,121,108,103,110,53,47,52,0,0,0,0,0,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,112,110,108,112,115,0,0,0,0,47,114,100,121,108,103,110,53,47,51,0,0,0,0,0,0,47,98,114,98,103,56,47,49,0,0,0,0,0,0,0,0,47,114,100,121,108,103,110,53,47,50,0,0,0,0,0,0,47,97,99,99,101,110,116,53,47,52,0,0,0,0,0,0,101,108,108,105,112,115,101,0,9,110,112,97,103,101,115,32,49,
-32,103,116,32,123,0,0,99,105,114,99,0,0,0,0,114,111,115,121,98,114,111,119,110,0,0,0,0,0,0,0,85,82,87,32,71,111,116,104,105,99,32,76,0,0,0,0,47,114,100,121,108,103,110,53,47,49,0,0,0,0,0,0,108,97,116,105,110,45,49,0,48,0,0,0,0,0,0,0,100,101,103,108,105,115,116,46,99,0,0,0,0,0,0,0,112,97,103,101,37,100,44,37,100,95,0,0,0,0,0,0,114,101,98,117,105,108,116,100,95,118,108,105,115,116,115,58,32,114,97,110,107,32,108,101,97,100,32,37,115,32,110,111,116,32,105,110,32,111,114,100,101,114,32,37,100,32,111,
-102,32,114,97,110,107,32,37,100,10,0,0,0,0,0,0,0,108,101,118,101,108,32,62,61,32,48,32,38,38,32,108,101,118,101,108,32,60,61,32,110,45,62,108,101,118,101,108,0,47,114,100,121,108,103,110,52,47,52,0,0,0,0,0,0,112,111,108,121,103,111,110,0,99,111,111,114,100,115,0,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,115,116,97,114,116,32,112,111,114,116,32,110,111,116,32,105,110,32,102,105,114,115,116,32,98,111,120,10,0,0,0,0,0,0,37,37,69,110,100,68,111,99,117,109,101,110,116,10,0,0,47,114,100,121,108,
-103,110,52,47,51,0,0,0,0,0,0,114,101,99,116,115,0,0,0,38,113,117,111,116,59,0,0,102,97,116,97,108,32,102,108,101,120,32,115,99,97,110,110,101,114,32,105,110,116,101,114,110,97,108,32,101,114,114,111,114,45,45,101,110,100,32,111,102,32,98,117,102,102,101,114,32,109,105,115,115,101,100,0,47,114,100,121,108,103,110,52,47,50,0,0,0,0,0,0,37,108,102,37,108,102,37,108,102,0,0,0,0,0,0,0,32,32,97,115,112,101,99,116,32,37,102,10,0,0,0,0,47,114,100,121,108,103,110,52,47,49,0,0,0,0,0,0,115,112,108,105,110,101,
-32,37,115,32,37,115,10,0,0,0,116,114,121,105,110,103,32,116,111,32,97,100,100,32,116,111,32,114,101,99,116,32,123,37,102,32,43,47,45,32,37,102,44,32,37,102,32,43,47,45,32,37,102,125,10,0,0,0,116,97,98,108,101,32,115,105,122,101,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,99,111,110,116,101,110,116,10,0,0,0,0,0,0,0,47,114,100,121,108,103,110,51,47,51,0,0,0,0,0,0,66,0,0,0,0,0,0,0,47,114,100,121,108,103,110,51,47,50,0,0,0,0,0,0,37,102,44,37,102,0,0,0,111,110,101,98,108,111,99,107,0,0,0,0,
-0,0,0,0,47,114,100,121,108,103,110,51,47,49,0,0,0,0,0,0,32,32,32,32,32,125,101,108,115,101,123,10,0,0,0,0,40,37,46,53,103,44,37,46,53,103,41,0,0,0,0,0,98,108,97,99,107,0,0,0,47,114,100,121,108,103,110,49,49,47,57,0,0,0,0,0,47,114,100,121,108,103,110,49,49,47,56,0,0,0,0,0,108,105,110,101,32,115,101,103,109,101,110,116,115,0,0,0,9,47,115,116,114,32,49,48,32,115,116,114,105,110,103,32,100,101,102,0,0,0,0,0,99,104,105,0,0,0,0,0,114,101,100,0,0,0,0,0,47,114,100,121,108,103,110,49,49,47,55,0,0,0,0,0,117,
-116,102,45,56,0,0,0,98,108,117,101,0,0,0,0,116,114,121,105,110,103,32,116,111,32,100,101,108,101,116,101,32,97,32,110,111,110,45,108,105,110,101,10,0,0,0,0,73,108,108,101,103,97,108,32,108,101,110,103,116,104,32,118,97,108,117,101,32,105,110,32,34,37,115,34,32,99,111,108,111,114,32,97,116,116,114,105,98,117,116,101,32,0,0,0,47,114,100,121,108,103,110,49,49,47,54,0,0,0,0,0,105,32,61,61,32,100,101,103,0,0,0,0,0,0,0,0,47,98,114,98,103,55,47,55,0,0,0,0,0,0,0,0,47,114,100,121,108,103,110,49,49,47,53,0,
-0,0,0,0,47,114,100,121,108,103,110,49,49,47,52,0,0,0,0,0,47,114,100,121,108,103,110,49,49,47,51,0,0,0,0,0,95,37,108,100,95,83,85,83,80,69,67,84,0,0,0,0,115,101,108,102,0,0,0,0,47,114,100,121,108,103,110,49,49,47,50,0,0,0,0,0,47,114,100,121,108,103,110,49,49,47,49,49,0,0,0,0,114,97,110,107,105,110,103,58,32,102,97,105,108,117,114,101,32,116,111,32,99,114,101,97,116,101,32,115,116,114,111,110,103,32,99,111,110,115,116,114,97,105,110,116,32,101,100,103,101,32,98,101,116,119,101,101,110,32,110,111,100,
-101,115,32,37,115,32,97,110,100,32,37,115,10,0,0,0,0,0,0,47,114,100,121,108,103,110,49,49,47,49,48,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,105,116,101,109,46,115,116,121,108,101,46,118,105,115,105,98,105,108,105,116,121,61,39,104,105,100,100,101,110,39,59,10,0,0,0,0,0,115,118,103,58,115,118,103,0,47,114,100,121,108,103,110,49,49,47,49,0,0,0,0,0,104,101,105,103,104,116,0,0,37,115,10,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,57,0,0,0,0,0,9,47,105,32,101,120,99,104,32,100,101,102,0,0,0,0,99,101,
-110,116,0,0,0,0,112,117,114,112,108,101,0,0,47,114,100,121,108,103,110,49,48,47,56,0,0,0,0,0,99,104,97,114,115,101,116,0,84,111,116,97,108,32,115,105,122,101,32,62,32,49,32,105,110,32,34,37,115,34,32,99,111,108,111,114,32,115,112,101,99,32,0,0,0,0,0,0,119,105,100,116,104,0,0,0,47,114,100,121,108,103,110,49,48,47,55,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,54,0,0,0,0,0,111,114,100,101,114,105,110,103,32,39,37,115,39,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,32,102,111,114,32,110,
-111,100,101,32,39,37,115,39,46,10,0,0,0,0,48,0,0,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,53,0,0,0,0,0,47,98,114,98,103,55,47,54,0,0,0,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,52,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,51,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,50,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,49,48,0,0,0,0,32,32,32,32,32,32,32,32,32,105,116,101,109,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,86,77,76,110,
-111,91,120,93,41,59,10,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,49,0,0,0,0,0,47,114,100,121,108,98,117,57,47,57,0,0,0,0,0,0,9,47,106,32,101,120,99,104,32,100,101,102,0,0,0,0,99,101,100,105,108,0,0,0,112,111,119,100,101,114,98,108,117,101,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,56,0,0,0,0,0,0,102,105,108,108,0,0,0,0,102,111,110,116,99,111,108,111,114,0,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,55,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,54,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,
-53,0,0,0,0,0,0,47,98,114,98,103,55,47,53,0,0,0,0,0,0,0,0,117,110,100,101,102,105,110,101,100,32,101,110,116,105,116,121,0,0,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,52,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,51,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,50,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,49,0,0,0,0,0,0,32,32,32,32,32,32,32,102,111,114,32,40,120,32,105,110,32,86,77,76,110,111,41,123,10,0,0,0,0,0,0,0,47,114,100,121,108,98,117,56,47,56,0,0,0,0,0,0,47,114,100,121,108,98,117,56,47,
-55,0,0,0,0,0,0,9,47,110,112,97,103,101,115,32,101,120,99,104,32,100,101,102,0,0,0,0,0,0,0,99,99,101,100,105,108,0,0,112,108,117,109,0,0,0,0,47,114,100,121,108,98,117,56,47,54,0,0,0,0,0,0,101,120,112,97,110,100,0,0,108,97,121,101,114,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,37,115,32,111,117,116,112,117,116,10,0,0,0,0,0,0,47,114,100,121,108,98,117,56,47,53,0,0,0,0,0,0,115,97,109,101,116,97,105,108,0,0,0,0,0,0,0,0,47,114,100,121,108,98,117,56,47,52,0,0,0,0,0,0,47,114,
-100,121,108,98,117,56,47,51,0,0,0,0,0,0,47,98,114,98,103,55,47,52,0,0,0,0,0,0,0,0,103,105,102,58,118,114,109,108,0,0,0,0,0,0,0,0,47,114,100,121,108,98,117,56,47,50,0,0,0,0,0,0,47,114,100,121,108,98,117,56,47,49,0,0,0,0,0,0,47,114,100,121,108,98,117,55,47,55,0,0,0,0,0,0,47,114,100,121,108,98,117,55,47,54,0,0,0,0,0,0,32,32,32,32,32,32,32,125,10,0,0,0,0,0,0,0,47,114,100,121,108,98,117,55,47,53,0,0,0,0,0,0,47,114,100,121,108,98,117,55,47,52,0,0,0,0,0,0,47,98,101,103,105,110,112,97,103,101,32,123,9,37,
-32,105,32,106,32,110,112,97,103,101,115,0,0,0,0,0,0,0,99,97,112,0,0,0,0,0,112,105,110,107,0,0,0,0,47,114,100,121,108,98,117,55,47,51,0,0,0,0,0,0,99,111,109,112,114,101,115,115,0,0,0,0,0,0,0,0,105,110,102,111,0,0,0,0,73,109,97,103,101,115,32,117,110,115,117,112,112,111,114,116,101,100,32,105,110,32,34,98,97,99,107,103,114,111,117,110,100,34,32,97,116,116,114,105,98,117,116,101,10,0,0,0,47,114,100,121,108,98,117,55,47,50,0,0,0,0,0,0,47,114,100,121,108,98,117,55,47,49,0,0,0,0,0,0,47,114,100,121,108,
-98,117,54,47,54,0,0,0,0,0,0,109,112,116,121,0,0,0,0,47,98,114,98,103,55,47,51,0,0,0,0,0,0,0,0,47,114,100,121,108,98,117,54,47,53,0,0,0,0,0,0,47,114,100,121,108,98,117,54,47,52,0,0,0,0,0,0,125,10,0,0,0,0,0,0,47,114,100,121,108,98,117,54,47,51,0,0,0,0,0,0,37,108,102,44,37,108,102,44,37,108,102,37,99,0,0,0,47,114,100,121,108,98,117,54,47,50,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,125,10,0,0,0,0,0,47,114,100,121,108,98,117,54,47,49,0,0,0,0,0,0,47,114,100,121,108,98,117,53,47,53,0,0,0,0,0,0,47,110,111,
-112,99,111,108,111,114,32,123,112,111,112,32,112,111,112,32,112,111,112,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,0,0,0,98,117,108,108,0,0,0,0,112,101,114,117,0,0,0,0,47,114,100,121,108,98,117,53,47,52,0,0,0,0,0,0,97,117,116,111,0,0,0,0,103,114,97,100,105,101,110,116,32,112,101,110,32,99,111,108,111,114,115,32,110,111,116,32,121,101,116,32,115,117,112,112,111,114,116,101,100,46,10,0,108,116,97,105,108,0,0,0,47,114,100,121,108,98,117,53,47,51,0,0,0,0,0,0,47,98,114,98,103,55,47,50,0,0,0,0,0,0,
-0,0,47,114,100,121,108,98,117,53,47,50,0,0,0,0,0,0,47,114,100,121,108,98,117,53,47,49,0,0,0,0,0,0,47,114,100,121,108,98,117,52,47,52,0,0,0,0,0,0,47,114,100,121,108,98,117,52,47,51,0,0,0,0,0,0,47,114,100,121,108,98,117,52,47,50,0,0,0,0,0,0,47,114,100,121,108,98,117,52,47,49,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,105,116,101,109,46,115,116,121,108,101,46,118,105,115,105,98,105,108,105,116,121,61,39,118,105,115,105,98,108,101,39,59,10,0,0,0,0,47,114,100,121,108,98,117,51,47,51,0,0,0,0,0,0,47,114,
-100,121,108,98,117,51,47,50,0,0,0,0,0,0,47,103,114,97,112,104,99,111,108,111,114,32,123,32,115,101,116,104,115,98,99,111,108,111,114,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,98,114,118,98,97,114,0,0,46,102,116,32,37,115,10,0,112,101,97,99,104,112,117,102,102,0,0,0,0,0,0,0,47,114,100,121,108,98,117,51,47,49,0,0,0,0,0,0,114,97,116,105,111,0,0,0,119,104,105,116,101,0,0,0,47,114,100,121,108,98,117,49,49,47,57,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,56,0,0,0,0,0,47,114,100,121,108,98,117,49,
-49,47,55,0,0,0,0,0,47,98,114,98,103,55,47,49,0,0,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,54,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,53,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,52,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,51,0,0,0,0,0,32,32,32,32,32,32,32,32,32,105,102,32,40,105,116,101,109,41,32,123,10,
-0,0,0,110,101,119,114,97,110,107,0,47,114,100,121,108,98,117,49,49,47,50,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,49,49,0,0,0,0,47,101,100,103,101,99,111,108,111,114,32,123,32,115,101,116,104,115,98,99,111,108,111,114,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,98,101,116,97,0,0,0,0,112,97,112,97,121,97,119,104,105,112,0,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,49,48,0,0,0,0,37,108,102,37,99,0,0,0,108,97,121,101,114,0,0,0,47,114,100,121,108,98,117,49,49,47,49,0,0,0,0,0,97,117,120,103,
-0,0,0,0,47,114,100,121,108,98,117,49,48,47,57,0,0,0,0,0,109,105,110,117,115,0,0,0,47,114,100,121,108,98,117,49,48,47,56,0,0,0,0,0,47,98,114,98,103,54,47,54,0,0,0,0,0,0,0,0,47,114,100,121,108,98,117,49,48,47,55,0,0,0,0,0,97,113,117,97,0,0,0,0,47,114,100,121,108,98,117,49,48,47,54,0,0,0,0,0,47,114,100,121,108,98,117,49,48,47,53,0,0,0,0,0,47,114,100,121,108,98,117,49,48,47,52,0,0,0,0,0,32,32,32,32,32,32,32,32,32,105,116,101,109,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,
-110,116,66,121,73,100,40,86,77,76,121,101,115,91,120,93,41,59,10,0,0,0,0,47,114,100,121,108,98,117,49,48,47,51,0,0,0,0,0,103,114,97,112,104,32,108,97,98,101,108,0,0,0,0,0,47,114,100,121,108,98,117,49,48,47,50,0,0,0,0,0,47,110,111,100,101,99,111,108,111,114,32,123,32,115,101,116,104,115,98,99,111,108,111,114,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,98,100,113,117,111,0,0,0,112,97,108,101,118,105,111,108,101,116,114,101,100,0,0,0,47,114,100,121,108,98,117,49,48,47,49,48,0,0,0,0,37,108,102,
-44,37,108,102,37,99,0,0,0,0,0,0,0,114,111,117,110,100,101,100,0,47,114,100,121,108,98,117,49,48,47,49,0,0,0,0,0,47,114,100,112,117,57,47,57,0,0,0,0,0,0,0,0,47,114,100,112,117,57,47,56,0,0,0,0,0,0,0,0,47,98,114,98,103,54,47,53,0,0,0,0,0,0,0,0,112,111,115,105,116,105,111,110,46,99,0,0,0,0,0,0,47,114,100,112,117,57,47,55,0,0,0,0,0,0,0,0,91,94,91,58,100,105,103,105,116,58,93,93,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,47,114,100,112,117,57,47,54,0,0,0,0,0,0,0,0,47,114,100,112,117,
-57,47,53,0,0,0,0,0,0,0,0,47,114,100,112,117,57,47,52,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,102,111,114,32,40,120,32,105,110,32,86,77,76,121,101,115,41,123,10,0,0,0,0,0,0,120,100,111,116,49,46,52,58,120,100,111,116,0,0,0,0,103,118,117,115,101,114,115,104,97,112,101,46,99,0,0,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,112,110,108,115,0,0,0,0,0,47,114,100,112,117,57,47,51,0,0,0,0,0,0,0,0,47,114,100,112,117,57,47,50,0,0,0,0,0,0,0,0,37,32,104,111,111,107,115,32,102,111,114,32,115,101,116,116,
-105,110,103,32,99,111,108,111,114,32,0,0,0,0,0,0,47,114,100,112,117,57,47,49,0,0,0,0,0,0,0,0,97,117,109,108,0,0,0,0,112,97,108,101,116,117,114,113,117,111,105,115,101,0,0,0,119,105,100,116,104,0,0,0,65,118,97,110,116,71,97,114,100,101,45,66,111,111,107,0,47,97,99,99,101,110,116,53,47,51,0,0,0,0,0,0,108,97,98,101,108,106,117,115,116,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,116,111,116,97,108,32,97,100,100,101,100,32,115,111,32,102,97,114,32,61,32,37,100,10,0,0,0,0,0,0,0,0,95,98,108,111,99,107,95,37,100,0,0,
-0,0,0,0,0,115,116,114,105,112,101,100,0,114,32,38,38,32,110,32,38,38,32,110,101,119,0,0,0,47,114,100,112,117,56,47,56,0,0,0,0,0,0,0,0,98,111,120,0,0,0,0,0,103,114,105,100,40,37,100,44,37,100,41,58,32,37,115,10,0,0,0,0,0,0,0,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,98,111,120,101,115,32,37,100,32,97,110,100,32,37,100,32,100,111,110,39,116,32,116,111,117,99,104,10,0,0,0,0,0,0,37,37,66,101,103,105,110,68,111,99,117,109,101,110,116,58,10,0,0,0,0,0,0,0,112,115,58,112,115,0,0,0,32,91,37,100,
-93,32,37,112,32,115,101,116,32,37,100,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,37,115,10,0,47,114,100,112,117,56,47,55,0,0,0,0,0,0,0,0,112,111,115,0,0,0,0,0,33,0,0,0,0,0,0,0,38,35,49,54,48,59,0,0,111,117,116,32,111,102,32,100,121,110,97,109,105,99,32,109,101,109,111,114,121,32,105,110,32,97,97,103,101,110,115,117,114,101,95,98,117,102,102,101,114,95,115,116,97,99,107,40,41,0,0,0,0,0,0,0,47,114,100,112,117,56,47,54,0,0,0,0,0,0,0,0,47,98,114,98,103,
-54,47,52,0,0,0,0,0,0,0,0,32,32,109,111,100,101,32,32,32,37,115,10,0,0,0,0,37,46,51,102,32,0,0,0,47,114,100,112,117,56,47,53,0,0,0,0,0,0,0,0,100,101,108,121,32,62,61,32,48,0,0,0,0,0,0,0,47,114,100,112,117,56,47,52,0,0,0,0,0,0,0,0,70,79,78,84,0,0,0,0,47,114,100,112,117,56,47,51,0,0,0,0,0,0,0,0,69,100,103,101,32,115,101,112,97,114,97,116,105,111,110,58,32,97,100,100,61,37,100,32,40,37,102,44,37,102,41,10,0,0,0,0,0,0,0,0,47,114,100,112,117,56,47,50,0,0,0,0,0,0,0,0,32,32,32,32,32,32,105,102,32,40,105,
-101,118,101,114,115,62,61,53,41,123,10,0,0,48,0,0,0,0,0,0,0,102,97,116,97,108,32,102,108,101,120,32,115,99,97,110,110,101,114,32,105,110,116,101,114,110,97,108,32,101,114,114,111,114,45,45,110,111,32,97,99,116,105,111,110,32,102,111,117,110,100,0,0,0,0,0,0,37,108,100,0,0,0,0,0,47,114,100,112,117,56,47,49,0,0,0,0,0,0,0,0,47,114,100,112,117,55,47,55,0,0,0,0,0,0,0,0,112,111,108,121,108,105,110,101,115],"i8",L,l.J+153640);D([47,116,97,112,101,114,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,
-0,0,0,97,116,105,108,100,101,0,0,112,97,108,101,103,114,101,101,110,0,0,0,0,0,0,0,10,105,110,116,101,114,115,101,99,116,105,111,110,32,97,116,32,37,46,51,102,32,37,46,51,102,10,0,0,0,0,0,47,114,100,112,117,55,47,54,0,0,0,0,0,0,0,0,108,97,98,101,108,108,111,99,0,0,0,0,0,0,0,0,98,108,97,110,99,104,101,100,97,108,109,111,110,100,0,0,114,97,100,105,97,108,0,0,47,114,100,112,117,55,47,53,0,0,0,0,0,0,0,0,47,114,100,112,117,55,47,52,0,0,0,0,0,0,0,0,108,97,121,111,117,116,46,99,0,0,0,0,0,0,0,0,47,114,100,
-112,117,55,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,54,47,51,0,0,0,0,0,0,0,0,47,114,100,112,117,55,47,50,0,0,0,0,0,0,0,0,58,0,0,0,0,0,0,0,115,116,97,114,116,0,0,0,47,114,100,112,117,55,47,49,0,0,0,0,0,0,0,0,47,114,100,112,117,54,47,54,0,0,0,0,0,0,0,0,95,119,101,97,107,95,37,100,0,0,0,0,0,0,0,0,47,114,100,112,117,54,47,53,0,0,0,0,0,0,0,0,32,32,32,32,32,32,125,10,0,0,0,0,0,0,0,0,47,114,100,112,117,54,47,52,0,0,0,0,0,0,0,0,112,116,0,0,0,0,0,0,105,110,118,105,115,0,0,0,47,114,100,112,117,54,47,51,0,0,0,
-0,0,0,0,0,47,100,105,97,103,111,110,97,108,115,32,123,32,125,32,98,105,110,100,32,100,101,102,0,97,115,121,109,112,0,0,0,112,97,108,101,103,111,108,100,101,110,114,111,100,0,0,0,92,78,0,0,0,0,0,0,47,114,100,112,117,54,47,50,0,0,0,0,0,0,0,0,98,108,97,99,107,0,0,0,115,116,121,108,101,0,0,0,103,118,114,101,110,100,101,114,95,115,101,116,95,115,116,121,108,101,58,32,117,110,115,117,112,112,111,114,116,101,100,32,115,116,121,108,101,32,37,115,32,45,32,105,103,110,111,114,105,110,103,10,0,0,0,0,47,114,
-100,112,117,54,47,49,0,0,0,0,0,0,0,0,47,114,100,112,117,53,47,53,0,0,0,0,0,0,0,0,111,114,100,101,114,105,110,103,32,39,37,115,39,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,46,10,0,0,115,111,108,105,100,0,0,0,10,0,0,0,0,0,0,0,47,114,100,112,117,53,47,52,0,0,0,0,0,0,0,0,47,98,114,98,103,54,47,50,0,0,0,0,0,0,0,0,47,114,100,112,117,53,47,51,0,0,0,0,0,0,0,0,47,114,100,112,117,53,47,50,0,0,0,0,0,0,0,0,47,114,100,112,117,53,47,49,0,0,0,0,0,0,0,0,47,114,100,112,117,52,47,52,0,0,0,0,0,0,0,0,
-32,32,32,32,32,32,32,32,32,105,101,118,101,114,115,61,32,112,97,114,115,101,73,110,116,32,40,117,97,46,115,117,98,115,116,114,105,110,103,32,40,109,115,105,101,43,53,44,32,117,97,46,105,110,100,101,120,79,102,32,40,39,46,39,44,32,109,115,105,101,32,41,41,41,10,0,0,0,0,0,47,114,100,112,117,52,47,51,0,0,0,0,0,0,0,0,47,114,100,112,117,52,47,50,0,0,0,0,0,0,0,0,47,114,111,117,110,100,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,0,0,97,114,105,110,103,0,0,0,111,114,99,104,105,100,0,0,110,111,
-100,101,46,99,0,0,47,114,100,112,117,52,47,49,0,0,0,0,0,0,0,0,84,105,109,101,115,45,82,111,109,97,110,0,0,0,0,0,102,105,108,108,101,100,0,0,47,114,100,112,117,51,47,51,0,0,0,0,0,0,0,0,47,114,100,112,117,51,47,50,0,0,0,0,0,0,0,0,47,114,100,112,117,51,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,54,47,49,0,0,0,0,0,0,0,0,105,108,108,101,103,97,108,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,32,114,101,102,101,114,101,110,99,101,0,0,0,0,0,0,47,114,100,103,121,57,47,57,0,0,0,0,0,0,0,0,47,
-114,100,103,121,57,47,56,0,0,0,0,0,0,0,0,47,114,100,103,121,57,47,55,0,0,0,0,0,0,0,0,47,114,100,103,121,57,47,54,0,0,0,0,0,0,0,0,32,32,32,32,32,32,105,102,32,40,32,109,115,105,101,32,62,32,48,32,41,123,32,32,32,32,32,32,47,47,32,73,102,32,73,110,116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,44,32,114,101,116,117,114,110,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,10,0,0,0,0,0,47,114,100,103,121,57,47,53,0,0,0,0,0,0,0,0,47,114,100,103,121,57,47,52,0,0,0,0,0,0,0,0,47,117,110,
-102,105,108,108,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,0,97,110,103,0,0,0,0,0,111,114,97,110,103,101,114,101,100,0,0,0,0,0,0,0,47,114,100,103,121,57,47,51,0,0,0,0,0,0,0,0,85,110,115,117,112,112,111,114,116,101,100,32,99,104,97,114,115,101,116,32,118,97,108,117,101,32,37,100,10,0,0,0,115,97,109,112,108,101,112,111,105,110,116,115,0,0,0,0,47,114,100,103,121,57,47,50,0,0,0,0,0,0,0,0,47,114,100,103,121,57,47,49,0,0,0,0,0,0,0,0,47,114,100,103,121,56,47,56,0,0,0,0,0,0,0,0,47,98,114,98,
-103,53,47,53,0,0,0,0,0,0,0,0,47,114,100,103,121,56,47,55,0,0,0,0,0,0,0,0,112,110,103,58,118,114,109,108,0,0,0,0,0,0,0,0,47,114,100,103,121,56,47,54,0,0,0,0,0,0,0,0,47,114,100,103,121,56,47,53,0,0,0,0,0,0,0,0,47,114,100,103,121,56,47,52,0,0,0,0,0,0,0,0,32,32,32,32,32,32,118,97,114,32,86,77,76,110,111,61,110,101,119,32,65,114,114,97,121,40,39,95,110,111,116,86,77,76,49,95,39,44,39,95,110,111,116,86,77,76,50,95,39,41,59,10,0,0,0,0,47,114,100,103,121,56,47,51,0,0,0,0,0,0,0,0,47,114,100,103,121,56,47,
-50,0,0,0,0,0,0,0,0,47,102,105,108,108,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,97,110,100,0,0,0,0,0,111,114,97,110,103,101,0,0,47,114,100,103,121,56,47,49,0,0,0,0,0,0,0,0,66,73,71,45,53,0,0,0,104,101,97,100,116,111,111,108,116,105,112,0,0,0,0,0,47,114,100,103,121,55,47,55,0,0,0,0,0,0,0,0,47,114,100,103,121,55,47,54,0,0,0,0,0,0,0,0,47,114,100,103,121,55,47,53,0,0,0,0,0,0,0,0,47,98,114,98,103,53,47,52,0,0,0,0,0,0,0,0,47,114,100,103,121,55,47,52,0,0,0,0,0,0,0,0,112,101,110,0,0,
-0,0,0,47,114,100,103,121,55,47,51,0,0,0,0,0,0,0,0,47,114,100,103,121,55,47,50,0,0,0,0,0,0,0,0,47,114,100,103,121,55,47,49,0,0,0,0,0,0,0,0,32,32,32,32,32,32,118,97,114,32,86,77,76,121,101,115,61,110,101,119,32,65,114,114,97,121,40,39,95,86,77,76,49,95,39,44,39,95,86,77,76,50,95,39,41,59,10,0,47,114,100,103,121,54,47,54,0,0,0,0,0,0,0,0,47,114,100,103,121,54,47,53,0,0,0,0,0,0,0,0,47,98,111,108,100,32,123,32,50,32,115,101,116,108,105,110,101,119,105,100,116,104,32,125,32,98,105,110,100,32,100,101,102,
-0,0,0,0,0,0,0,97,109,112,0,0,0,0,0,111,108,105,118,101,100,114,97,98,0,0,0,0,0,0,0,47,114,100,103,121,54,47,52,0,0,0,0,0,0,0,0,73,83,79,45,56,56,53,57,45,49,0,0,0,0,0,0,116,97,105,108,116,111,111,108,116,105,112,0,0,0,0,0,47,114,100,103,121,54,47,51,0,0,0,0,0,0,0,0,47,114,100,103,121,54,47,50,0,0,0,0,0,0,0,0,47,114,100,103,121,54,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,53,47,51,0,0,0,0,0,0,0,0,47,114,100,103,121,53,47,53,0,0,0,0,0,0,0,0,47,114,100,103,121,53,47,52,0,0,0,0,0,0,0,0,47,114,100,103,121,
-53,47,51,0,0,0,0,0,0,0,0,47,114,100,103,121,53,47,50,0,0,0,0,0,0,0,0,32,32,32,32,32,32,118,97,114,32,105,116,101,109,59,10,0,0,0,0,0,0,0,0,47,114,100,103,121,53,47,49,0,0,0,0,0,0,0,0,47,114,100,103,121,52,47,52,0,0,0,0,0,0,0,0,47,105,110,118,105,115,32,123,47,102,105,108,108,32,123,110,101,119,112,97,116,104,125,32,100,101,102,32,47,115,116,114,111,107,101,32,123,110,101,119,112,97,116,104,125,32,100,101,102,32,47,115,104,111,119,32,123,112,111,112,32,110,101,119,112,97,116,104,125,32,100,101,102,
-125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,97,108,112,104,97,0,0,0,110,111,100,101,32,39,37,115,39,44,32,103,114,97,112,104,32,39,37,115,39,32,115,105,122,101,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,108,97,98,101,108,10,0,111,108,105,118,101,0,0,0,47,114,100,103,121,52,47,51,0,0,0,0,0,0,0,0,85,84,70,45,56,0,0,0,108,97,98,101,108,116,111,111,108,116,105,112,0,0,0,0,47,114,100,103,121,52,47,50,0,0,0,0,0,0,0,0,47,114,100,103,121,52,47,49,0,0,0,0,0,0,0,0,47,114,100,103,121,51,47,51,
-0,0,0,0,0,0,0,0,47,98,114,98,103,53,47,50,0,0,0,0,0,0,0,0,47,114,100,103,121,51,47,50,0,0,0,0,0,0,0,0,35,32,37,115,10,0,0,0,47,114,100,103,121,51,47,49,0,0,0,0,0,0,0,0,47,114,100,103,121,49,49,47,57,0,0,0,0,0,0,0,47,114,100,103,121,49,49,47,56,0,0,0,0,0,0,0,32,32,32,32,32,32,118,97,114,32,105,101,118,101,114,115,59,10,0,0,0,0,0,0,47,114,100,103,121,49,49,47,55,0,0,0,0,0,0,0,47,114,100,103,121,49,49,47,54,0,0,0,0,0,0,0,47,100,111,116,116,101,100,32,123,32,91,49,32,73,110,118,83,99,97,108,101,70,97,
-99,116,111,114,32,109,117,108,32,54,32,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,109,117,108,93,32,48,32,115,101,116,100,97,115,104,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,0,97,108,101,102,115,121,109,0,108,97,98,101,108,108,111,99,0,0,0,0,0,0,0,0,111,108,100,108,97,99,101,0,47,114,100,103,121,49,49,47,53,0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,101,100,103,101,116,111,111,108,116,105,112,0,0,0,0,0,47,114,100,103,121,49,49,47,52,0,0,0,0,0,0,0,110,45,62,
-98,114,97,110,99,104,91,105,93,46,99,104,105,108,100,0,0,0,0,0,0,47,114,100,103,121,49,49,47,51,0,0,0,0,0,0,0,108,97,98,101,108,0,0,0,47,114,100,103,121,49,49,47,50,0,0,0,0,0,0,0,47,98,114,98,103,53,47,49,0,0,0,0,0,0,0,0,75,80,95,65,100,100,0,0,47,114,100,103,121,49,49,47,49,49,0,0,0,0,0,0,118,109,108,122,58,118,109,108,0,0,0,0,0,0,0,0,47,114,100,103,121,49,49,47,49,48,0,0,0,0,0,0,47,114,100,103,121,49,49,47,49,0,0,0,0,0,0,0,47,114,100,103,121,49,48,47,57,0,0,0,0,0,0,0,32,32,32,32,32,32,118,97,114,
-32,109,115,105,101,32,61,32,117,97,46,105,110,100,101,120,79,102,32,40,32,39,77,83,73,69,32,39,32,41,10,0,0,0,0,0,0,0,0,47,114,100,103,121,49,48,47,56,0,0,0,0,0,0,0,103,114,97,112,104,0,0,0,47,114,100,103,121,49,48,47,55,0,0,0,0,0,0,0,47,100,97,115,104,101,100,32,123,32,91,57,32,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,109,117,108,32,100,117,112,32,93,32,48,32,115,101,116,100,97,115,104,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,0,97,103,114,97,118,101,0,0,78,111,32,111,114,32,105,
-109,112,114,111,112,101,114,32,105,109,97,103,101,61,34,37,115,34,32,102,111,114,32,110,111,100,101,32,34,37,115,34,10,0,0,0,0,0,0,0,0,110,97,118,121,0,0,0,0,47,114,100,103,121,49,48,47,54,0,0,0,0,0,0,0,105,100,0,0,0,0,0,0,116,111,111,108,116,105,112,0,47,114,100,103,121,49,48,47,53,0,0,0,0,0,0,0,47,114,100,103,121,49,48,47,52,0,0,0,0,0,0,0,47,114,100,103,121,49,48,47,51,0,0,0,0,0,0,0,47,98,114,98,103,52,47,52,0,0,0,0,0,0,0,0,47,114,100,103,121,49,48,47,50,0,0,0,0,0,0,0,91,91,58,100,105,103,105,116,
-58,93,93,0,0,0,0,0,47,114,100,103,121,49,48,47,49,48,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,114,100,103,121,49,48,47,49,0,0,0,0,0,0,0,100,101,102,108,97,116,105,111,110,32,101,110,100,32,112,114,111,98,108,101,109,32,37,100,10,0,0,0,0,0,0,0,47,114,100,98,117,57,47,57,0,0,0,0,0,0,0,0,32,32,32,32,32,32,118,97,114,32,117,97,32,61,32,119,105,110,100,111,119,46,110,97,118,105,103,97,116,111,114,46,117,115,101,114,65,103,101,110,116,10,0,0,0,0,0,0,120,100,111,116,49,46,50,58,
-120,100,111,116,0,0,0,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,112,110,108,112,115,0,0,0,0,0,47,114,100,98,117,57,47,56,0,0,0,0,0,0,0,0,47,114,100,98,117,57,47,55,0,0,0,0,0,0,0,0,121,101,115,0,0,0,0,0,47,115,111,108,105,100,32,123,32,91,93,32,48,32,115,101,116,100,97,115,104,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,0,0,0,97,101,108,105,103,0,0,0,60,110,105,108,62,0,0,0,110,97,118,97,106,111,119,104,105,116,101,0,0,0,0,0,91,105,110,116,101,114,110,97,108,32,116,105,109,101,115,
-93,0,0,0,0,0,0,0,0,47,114,100,98,117,57,47,54,0,0,0,0,0,0,0,0,104,101,97,100,99,108,105,112,0,0,0,0,0,0,0,0,108,97,98,101,108,0,0,0,104,101,97,100,116,97,114,103,101,116,0,0,0,0,0,0,47,114,100,98,117,57,47,53,0,0,0,0,0,0,0,0,47,97,99,99,101,110,116,53,47,50,0,0,0,0,0,0,117,115,105,110,103,32,37,115,32,102,111,114,32,117,110,107,110,111,119,110,32,115,104,97,112,101,32,37,115,10,0,0,105,100,120,32,61,61,32,115,122,0,0,0,0,0,0,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,98,111,120,32,37,100,
-32,104,97,115,32,76,76,32,99,111,111,114,100,32,62,32,85,82,32,99,111,111,114,100,10,0,0,0,47,117,115,101,114,95,115,104,97,112,101,95,37,100,32,123,10,0,0,0,0,0,0,0,120,108,97,98,101,108,115,10,0,0,0,0,0,0,0,0,47,114,100,98,117,57,47,52,0,0,0,0,0,0,0,0,115,116,111,112,10,0,0,0,9,37,115,32,37,100,10,0,32,37,100,37,115,32,105,116,101,114,97,116,105,111,110,115,32,37,46,50,102,32,115,101,99,10,0,0,0,0,0,0,38,35,52,53,59,0,0,0,47,114,100,98,117,57,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,52,47,51,0,0,
-0,0,0,0,0,0,97,116,116,114,105,98,117,116,101,32,109,97,99,114,111,115,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,0,0,0,0,0,0,0,112,97,99,107,32,105,110,102,111,58,10,0,0,0,0,0,83,111,108,118,105,110,103,32,109,111,100,101,108,58,32,0,47,114,100,98,117,57,47,50,0,0,0,0,0,0,0,0,104,116,109,108,116,97,98,108,101,46,99,0,0,0,0,0,47,114,100,98,117,57,47,49,0,0,0,0,0,0,0,0,72,84,77,76,0,0,0,0,47,114,100,98,117,56,47,56,0,0,0,0,0,0,0,0,78,111,100,101,32,115,101,112,97,114,97,116,105,
-111,110,58,32,97,100,100,61,37,100,32,40,37,102,44,37,102,41,10,0,0,0,0,0,0,0,0,47,114,100,98,117,56,47,55,0,0,0,0,0,0,0,0,32,32,32,123,10,0,0,0,115,101,103,109,101,110,116,32,91,37,115,44,37,115,93,32,100,111,101,115,32,110,111,116,32,105,110,116,101,114,115,101,99,116,32,98,111,120,32,108,108,61,37,115,44,117,114,61,37,115,10,0,0,0,0,0,101,100,103,101,0,0,0,0,47,114,100,98,117,56,47,54,0,0,0,0,0,0,0,0,47,114,100,98,117,56,47,53,0,0,0,0,0,0,0,0,115,112,108,105,110,101,115,0,37,32,115,116,121,108,
-101,115,0,0,0,0,0,0,0,0,97,99,117,116,101,0,0,0,78,111,32,111,114,32,105,109,112,114,111,112,101,114,32,115,104,97,112,101,102,105,108,101,61,34,37,115,34,32,102,111,114,32,110,111,100,101,32,34,37,115,34,10,0,0,0,0,109,111,99,99,97,115,105,110,0,0,0,0,0,0,0,0,47,114,100,98,117,56,47,52,0,0,0,0,0,0,0,0,116,97,105,108,99,108,105,112,0,0,0,0,0,0,0,0,116,97,105,108,116,97,114,103,101,116,0,0,0,0,0,0,98,108,97,99,107,0,0,0,47,114,100,98,117,56,47,51,0,0,0,0,0,0,0,0,47,114,100,98,117,56,47,50,0,0,0,0,
-0,0,0,0,47,114,100,98,117,56,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,52,47,50,0,0,0,0,0,0,0,0,47,114,100,98,117,55,47,55,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,120,108,112,0,0,0,0,0,47,114,100,98,117,55,47,54,0,0,0,0,0,0,0,0,47,114,100,98,117,55,47,53,0,0,0,0,0,0,0,0,99,111,109,112,97,99,116,0,47,114,100,98,117,55,47,52,0,0,0,0,0,0,0,0,32,32,32,102,117,110,99,116,105,111,110,32,98,114,111,119,115,101,114,99,104,101,99,107,40,41,10,0,0,0,0,0,47,114,100,98,117,55,47,51,0,0,0,0,0,0,0,0,37,108,102,0,0,0,0,0,
-37,115,32,0,0,0,0,0,47,114,100,98,117,55,47,50,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,115,99,97,108,101,0,0,0,0,97,99,105,114,99,0,0,0,37,115,10,0,0,0,0,0,114,101,103,117,108,97,114,0,109,105,115,116,121,114,111,115,101,0,0,0,0,0,0,0,109,111,118,101,32,116,111,32,102,114,111,110,116,32,108,111,99,107,32,105,110,99,111,110,115,105,115,116,101,110,99,121,0,0,0,0,0,0,0,0,47,114,100,98,117,55,47,49,0,0,0,0,0,0,0,0,99,111,110,115,116,114,97,105,110,116,0,0,0,0,0,0,108,97,98,101,108,116,97,114,103,101,116,
-0,0,0,0,0,47,114,100,98,117,54,47,54,0,0,0,0,0,0,0,0,116,97,112,101,114,101,100,0,47,114,100,98,117,54,47,53,0,0,0,0,0,0,0,0,105,110,0,0,0,0,0,0,32,37,100,44,37,100,0,0,47,114,100,98,117,54,47,52,0,0,0,0,0,0,0,0,47,98,114,98,103,52,47,49,0,0,0,0,0,0,0,0,47,114,100,98,117,54,47,51,0,0,0,0,0,0,0,0,47,114,100,98,117,54,47,50,0,0,0,0,0,0,0,0,47,114,100,98,117,54,47,49,0,0,0,0,0,0,0,0,47,114,100,98,117,53,47,53,0,0,0,0,0,0,0,0,32,32,32,60,83,67,82,73,80,84,32,76,65,78,71,85,65,71,69,61,39,74,97,118,97,
-115,99,114,105,112,116,39,62,10,0,0,0,0,0,0,47,114,100,98,117,53,47,52,0,0,0,0,0,0,0,0,47,114,100,98,117,53,47,51,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,100,117,112,32,49,32,101,120,99,104,32,100,105,118,32,47,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,101,120,99,104,32,100,101,102,0,0,97,97,99,117,116,101,0,0,37,108,102,44,37,108,102,0,109,105,110,116,99,114,101,97,109,0,0,0,0,0,0,0,47,114,100,98,117,53,47,50,0,0,0,0,0,0,0,0,97,114,114,111,119,115,105,122,101,0,0,0,0,0,0,0,101,100,103,101,
-116,97,114,103,101,116,0,0,0,0,0,0,47,114,100,98,117,53,47,49,0,0,0,0,0,0,0,0,47,114,100,98,117,52,47,52,0,0,0,0,0,0,0,0,47,114,100,98,117,52,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,51,47,51,0,0,0,0,0,0,0,0,106,117,110,107,32,97,102,116,101,114,32,100,111,99,117,109,101,110,116,32,101,108,101,109,101,110,116,0,0,0,0,0,0,1,2,3,4,5,6,7,8,8,9,9,10,10,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,20,
-20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,
-27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
-14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,0,0,16,17,18,18,19,19,20,20,20,20,21,21,21,21,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,
-26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,
-29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,128,236,1,0,208,226,1,0,56,213,1,0,0,249,1,0,8,210,1,0,104,207,1,0,0,0,0,0,0,0,0,0,120,108,105,110,116,101,114,115,101,99,116,105,111,110,115,0,120,108,104,100,120,117,110,108,111,97,100,0,0,0,0,0,118,109,108,95,116,101,120,116,115,112,97,110,0,0,0,0,118,109,108,95,112,114,105,110,116,95,99,111,108,111,114,0,116,114,97,110,115,112,111,115,101,95,115,116,101,112,0,0,116,107,103,101,110,95,112,114,105,110,116,95,116,97,103,115,0,0,
-0,0,0,0,0,0,116,107,103,101,110,95,112,114,105,110,116,95,99,111,108,111,114,0,0,0,0,0,0,0,116,101,120,116,115,112,97,110,95,115,105,122,101,0,0,0,115,118,103,95,116,101,120,116,115,112,97,110,0,0,0,0,115,118,103,95,112,114,105,110,116,95,99,111,108,111,114,0,115,101,116,98,111,117,110,100,115,0,0,0,0,0,0,0,114,111,117,110,100,95,99,111,114,110,101,114,115,0,0,0,114,101,109,111,118,101,95,102,114,111,109,95,114,97,110,107,0,0,0,0,0,0,0,0,114,101,109,111,118,101,68,101,103,108,105,115,116,0,0,0,112,
-111,115,116,111,114,100,101,114,0,0,0,0,0,0,0,112,111,115,95,104,116,109,108,95,116,98,108,0,0,0,0,112,111,112,95,111,98,106,95,115,116,97,116,101,0,0,0,112,111,112,0,0,0,0,0,112,111,108,121,108,105,110,101,77,105,100,112,111,105,110,116,0,0,0,0,0,0,0,0,112,97,114,115,101,80,97,99,107,77,111,100,101,73,110,102,111,0,0,0,0,0,0,0,111,118,101,114,108,97,112,95,98,101,122,105,101,114,0,0,111,98,106,112,108,112,109,107,115,0,0,0,0,0,0,0,110,101,105,103,104,98,111,114,0,0,0,0,0,0,0,0,110,101,97,116,111,
-95,101,110,113,117,101,117,101,0,0,0,109,107,78,67,111,110,115,116,114,97,105,110,116,71,0,0,109,105,110,109,97,120,95,101,100,103,101,115,0,0,0,0,109,101,114,103,101,118,105,114,116,117,97,108,0,0,0,0,109,101,114,103,101,95,111,110,101,119,97,121,0,0,0,0,109,101,114,103,101,95,99,104,97,105,110,0,0,0,0,0,109,97,112,95,112,97,116,104,0,0,0,0,0,0,0,0,109,97,112,95,111,117,116,112,117,116,95,115,104,97,112,101,0,0,0,0,0,0,0,0,109,97,112,78,0,0,0,0,109,97,107,101,95,108,97,98,101,108,0,0,0,0,0,0,109,
-97,107,101,95,99,104,97,105,110,0,0,0,0,0,0,109,97,107,101,95,98,97,114,114,105,101,114,115,0,0,0,109,97,107,101,83,101,108,102,69,100,103,101,0,0,0,0,109,97,107,101,71,114,97,112,104,68,97,116,97,0,0,0,109,97,107,101,67,111,109,112,111,117,110,100,69,100,103,101,0,0,0,0,0,0,0,0,108,98,108,101,110,99,108,111,115,105,110,103,0,0,0,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,0,105,110,115,101,114,116,78,111,100,101,108,105,115,116,0,0,105,110,105,116,95,115,112,108,105,110,101,115,95,
-98,98,0,103,118,117,115,101,114,115,104,97,112,101,95,102,105,108,101,95,97,99,99,101,115,115,0,103,101,116,105,110,116,114,115,120,105,0,0,0,0,0,0,103,101,116,80,97,99,107,73,110,102,111,0,0,0,0,0,103,101,116,69,100,103,101,76,105,115,116,0,0,0,0,0,102,108,97,116,95,115,101,97,114,99,104,0,0,0,0,0,102,108,97,116,95,114,101,111,114,100,101,114,0,0,0,0,102,105,110,100,67,67,111,109,112,0,0,0,0,0,0,0,102,105,103,95,114,101,115,111,108,118,101,95,99,111,108,111,114,0,0,0,0,0,0,0,102,105,103,95,98,101,
-122,105,101,114,0,0,0,0,0,0,102,97,115,116,95,110,111,100,101,97,112,112,0,0,0,0,102,97,115,116,95,110,111,100,101,0,0,0,0,0,0,0,101,120,112,97,110,100,67,108,117,115,116,101,114,0,0,0,101,110,100,112,97,116,104,0,101,109,105,116,95,101,100,103,101,95,108,97,98,101,108,0,100,111,116,95,112,111,115,105,116,105,111,110,0,0,0,0,100,101,108,101,116,101,95,102,108,97,116,95,101,100,103,101,0,0,0,0,0,0,0,0,100,101,108,101,116,101,95,102,97,115,116,95,110,111,100,101,0,0,0,0,0,0,0,0,100,101,108,101,116,
-101,95,102,97,115,116,95,101,100,103,101,0,0,0,0,0,0,0,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,118,114,109,108,0,0,0,0,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,115,118,103,0,0,0,0,0,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,112,115,108,105,98,0,0,0,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,112,115,0,0,0,0,0,0,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,102,105,103,0,0,0,0,0,0,99,111,110,110,101,99,116,71,114,97,112,104,0,
-0,0,0,99,111,109,112,117,116,101,83,99,97,108,101,88,89,0,0,99,108,117,115,116,101,114,95,108,101,97,100,101,114,0,0,98,111,120,73,110,116,101,114,115,101,99,116,102,0,0,0,98,101,122,105,101,114,95,98,98,0,0,0,0,0,0,0,98,101,103,105,110,112,97,116,104,0,0,0,0,0,0,0,98,97,108,97,110,99,101,0,97,98,111,109,105,110,97,116,105,111,110,0,0,0,0,0,95,110,101,97,116,111,95,115,101,116,95,97,115,112,101,99,116,0,0,0,0,0,0,0,95,100,111,116,95,115,112,108,105,110,101,115,0,0,0,0,85,70,95,115,101,116,110,97,
-109,101,0,0,0,0,0,0,83,112,108,105,116,78,111,100,101,0,0,0,0,0,0,0,82,101,99,116,65,114,101,97,0,0,0,0,0,0,0,0,82,84,114,101,101,83,101,97,114,99,104,0,0,0,0,0,82,84,114,101,101,73,110,115,101,114,116,50,0,0,0,0,82,84,114,101,101,73,110,115,101,114,116,0,0,0,0,0,80,111,98,115,112,97,116,104,0,0,0,0,0,0,0,0,80,105,99,107,66,114,97,110,99,104,0,0,0,0,0,0,79,118,101,114,108,97,112,0,78,111,100,101,67,111,118,101,114,0,0,0,0,0,0,0,77,101,116,104,111,100,90,101,114,111,0,0,0,0,0,0,76,111,97,100,78,111,
-100,101,115,0,0,0,0,0,0,0,71,101,116,66,114,97,110,99,104,101,115,0,0,0,0,0,68,105,115,99,111,110,66,114,97,110,99,104,0,0,0,0,67,111,109,98,105,110,101,82,101,99,116,0,0,0,0,0,67,108,97,115,115,105,102,121,0,0,0,0,0,0,0,0,65,100,100,66,114,97,110,99,104,0,0,0,0,0,0,0,46,0,0,0,4,0,0,0,2,0,0,0,64,0,0,0,46,0,0,0,4,0,0,0,46,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,13,2,0,8,205,1,0,192,175,1,0,8,152,1,0,248,129,1,0,240,107,1,0,8,87,1,0,32,68,1,0,8,148,2,
-0,240,131,2,0,64,116,2,0,48,100,2,0,160,82,2,0,72,71,2,0,64,59,2,0,128,47,2,0,112,35,2,0,176,24,2,0,40,13,2,0,144,5,2,0,120,252,1,0,152,240,1,0,48,230,1,0,16,221,1,0,208,217,1,0,80,214,1,0,200,211,1,0,112,208,1,0,224,204,1,0,48,202,1,0,192,197,1,0,128,193,1,0,160,189,1,0,240,186,1,0,216,184,1,0,240,182,1,0,160,180,1,0,64,178,1,0,128,175,1,0,8,173,1,0,0,0,0,0,232,125,2,0,128,56,0,0,152,68,0,0,0,0,0,0,72,110,2,0,128,56,0,0,184,63,0,0,0,0,0,0,120,90,2,0,128,56,0,0,232,66,0,0,0,0,0,0,32,78,2,0,128,56,
-0,0,232,66,0,0,0,0,0,0,192,66,2,0,128,56,0,0,8,68,0,0,0,0,0,0,96,54,2,0,176,56,0,0,8,68,0,0,0,0,0,0,248,42,2,0,128,56,0,0,24,67,0,0,0,0,0,0,176,30,2,0,128,56,0,0,88,60,0,0,0,0,0,0,144,20,2,0,128,56,0,0,232,63,0,0,0,0,0,0,216,9,2,0,128,56,0,0,232,63,0,0,0,0,0,0,152,1,2,0,128,56,0,0,168,67,0,0,0,0,0,0,160,248,1,0,128,56,0,0,136,60,0,0,0,0,0,0,8,236,1,0,128,56,0,0,72,64,0,0,0,0,0,0,160,226,1,0,128,56,0,0,40,66,0,0,0,0,0,0,104,219,1,0,128,56,0,0,24,64,0,0,0,0,0,0,16,216,1,0,128,56,0,0,88,66,0,0,0,0,0,
-0,8,213,1,0,128,56,0,0,216,61,0,0,0,0,0,0,240,209,1,0,128,56,0,0,120,64,0,0,0,0,0,0,80,207,1,0,128,56,0,0,216,64,0,0,0,0,0,0,160,203,1,0,128,56,0,0,24,61,0,0,0,0,0,0,16,200,1,0,128,56,0,0,136,66,0,0,0,0,0,0,88,196,1,0,128,56,0,0,104,68,0,0,0,0,0,0,240,190,1,0,128,56,0,0,216,67,0,0,0,0,0,0,16,188,1,0,128,56,0,0,152,68,0,0,0,0,0,0,8,186,1,0,128,56,0,0,152,68,0,0,0,0,0,0,224,183,1,0,128,56,0,0,120,61,0,0,0,0,0,0,224,181,1,0,128,56,0,0,120,67,0,0,0,0,0,0,152,179,1,0,128,56,0,0,72,67,0,0,0,0,0,0,248,176,
-1,0,128,56,0,0,40,60,0,0,0,0,0,0,32,174,1,0,128,56,0,0,104,65,0,0,0,0,0,0,128,171,1,0,128,56,0,0,152,65,0,0,0,0,0,0,64,168,1,0,128,56,0,0,200,65,0,0,0,0,0,0,48,164,1,0,128,56,0,0,248,59,0,0,0,0,0,0,184,161,1,0,128,56,0,0,40,69,0,0,0,0,0,0,8,160,1,0,128,56,0,0,248,68,0,0,0,0,0,0,88,158,1,0,128,56,0,0,88,69,0,0,0,0,0,0,120,156,1,0,128,56,0,0,88,63,0,0,0,0,0,0,192,154,1,0,128,56,0,0,56,68,0,0,0,0,0,0,32,153,1,0,128,56,0,0,232,60,0,0,0,0,0,0,72,151,1,0,128,56,0,0,200,59,0,0,0,0,0,0,224,148,1,0,128,56,
-0,0,248,65,0,0,0,0,0,0,40,146,1,0,128,56,0,0,104,62,0,0,0,0,0,0,152,142,1,0,128,56,0,0,56,62,0,0,0,0,0,0,168,139,1,0,128,56,0,0,40,63,0,0,0,0,0,0,224,137,1,0,128,56,0,0,248,62,0,0,0,0,0,0,64,136,1,0,128,56,0,0,136,63,0,0,0,0,0,0,24,134,1,0,128,56,0,0,152,62,0,0,0,0,0,0,160,132,1,0,128,56,0,0,184,66,0,0,0,0,0,0,0,131,1,0,128,56,0,0,184,60,0,0,0,0,0,0,64,129,1,0,128,56,0,0,168,64,0,0,0,0,0,0,32,127,1,0,128,56,0,0,200,68,0,0,0,0,0,0,128,124,1,0,128,56,0,0,168,61,0,0,0,0,0,0,24,120,1,0,128,56,0,0,8,62,
-0,0,0,0,0,0,32,118,1,0,128,56,0,0,56,65,0,0,0,0,0,0,0,116,1,0,128,56,0,0,200,62,0,0,0,0,0,0,112,114,1,0,128,56,0,0,8,65,0,0,0,0,0,0,152,112,1,0,192,47,0,0,0,0,0,0,0,0,0,0,24,111,1,0,192,47,0,0,0,0,0,0,0,0,0,0,120,165,1,0,152,103,0,0,0,0,0,0,0,0,0,0,48,109,1,0,0,46,0,0,72,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,114,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,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,240,235,1,0,72,108,2,0,208,245,1,0,0,0,0,0,107,101,121,0,0,0,0,0,121,101,115,0,0,0,0,0,118,101,114,115,105,111,110,0,115,116,97,110,100,97,108,111,110,101,0,0,0,0,0,0,110,111,0,0,0,0,0,0,101,110,99,111,100,105,110,103,0,0,0,0,0,0,0,0,85,84,70,45,56,0,0,0,85,84,70,45,49,54,76,69,0,0,0,0,0,0,0,0,85,84,70,45,49,54,66,69,0,0,0,0,0,0,0,0,85,84,70,45,49,54,0,0,85,
-83,45,65,83,67,73,73,0,0,0,0,0,0,0,0,83,89,83,84,69,77,0,0,82,69,81,85,73,82,69,68,0,0,0,0,0,0,0,0,80,85,66,76,73,67,0,0,80,67,68,65,84,65,0,0,78,79,84,65,84,73,79,78,0,0,0,0,0,0,0,0,78,77,84,79,75,69,78,83,0,0,0,0,0,0,0,0,78,77,84,79,75,69,78,0,78,68,65,84,65,0,0,0,73,83,79,45,56,56,53,57,45,49,0,0,0,0,0,0,73,77,80,76,73,69,68,0,73,68,82,69,70,83,0,0,73,68,82,69,70,0,0,0,73,68,0,0,0,0,0,0,70,73,88,69,68,0,0,0,69,78,84,73,84,89,0,0,69,78,84,73,84,73,69,83,0,0,0,0,0,0,0,0,69,77,80,84,89,0,0,0,69,76,
-69,77,69,78,84,0,68,79,67,84,89,80,69,0,67,68,65,84,65,0,0,0,65,84,84,76,73,83,84,0,65,78,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,255,255,255,255,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,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,255,255,255,255,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,14,0,0,0,118,
-0,0,0,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,157,2,0,0,0,0,0,120,157,2,0,0,0,0,0,128,157,2,0,0,0,0,0,136,157,2,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,65,71,95,100,97,116,97,100,105,99,116,0,0,0,0,0,0,0,0,0,0,0,0,95,65,71,95,112,101,110,100,105,110,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,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,10,0,0,0,0,0,0,0,2,0,0,0,0,
-0,0,0,0,0,0,0,0,0,240,63,14,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,16,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,2,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,51,51,51,51,51,51,243,63,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,154,153,153,153,153,153,233,63,4,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,8,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,25,2,0,49,0,0,0,0,0,0,0,0,0,0,0,48,62,2,0,1,0,0,0,32,215,1,0,2,0,0,0,8,181,1,0,3,
-0,0,0,120,155,1,0,4,0,0,0,232,133,1,0,5,0,0,0,112,112,1,0,6,0,0,0,72,91,1,0,8,0,0,0,168,71,1,0,33,0,0,0,152,53,1,0,34,0,0,0,192,134,2,0,34,0,0,0,200,118,2,0,1,0,0,0,88,103,2,0,7,0,0,0,0,0,0,0,0,0,0,0,152,84,2,0,16,0,0,0,248,72,2,0,128,0,0,0,120,60,2,0,64,0,0,0,232,48,2,0,16,0,0,0,224,36,2,0,64,0,0,0,0,0,0,0,0,0,0,0,72,14,2,0,0,0,0,0,1,0,0,0,72,6,2,0,1,0,0,0,0,0,0,0,160,253,1,0,1,0,0,0,1,0,0,0,72,91,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,11,0,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,20,0,0,0,98,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255],"i8",L,l.J+163880);D([54,0,0,0,0,0,0,0,114,0,0,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,22,
-0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,54,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,118,0,0,0,28,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,108,0,0,0,48,0,0,0,0,0,0,0,150,0,0,0,92,0,0,0,22,0,0,0,122,0,0,0,48,0,0,0,114,0,0,0,84,0,0,0,0,0,0,0,152,168,2,0,192,168,2,0,176,168,2,0,0,0,0,0,112,43,2,0,0,0,0,0,8,0,0,0,255,255,255,255,0,0,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],"i8",L,l.J+174124);var sa=l.qb(D(12,"i8",S),8);J(0==sa%8);e._memcpy=
-Za;e._memmove=bc;e._memset=cc;e._memcmp=rc;e._strlen=Aa;var g={ba:1,Ib:2,Uh:3,Ug:4,Ea:5,wd:6,rg:7,rh:8,H:9,Eg:10,lb:11,di:11,Ne:12,mc:13,Pg:14,Dh:15,mb:16,ud:17,Oe:18,Hb:19,oc:20,Sa:21,B:22,mh:23,Me:24,vd:25,ai:26,Qg:27,zh:28,nb:29,Rh:30,fh:31,Lh:32,Mg:33,qc:34,vh:42,Sg:43,Fg:44,Wg:45,Xg:46,Yg:47,eh:48,bi:49,ph:50,Vg:51,Kg:35,sh:37,wg:52,zg:53,ei:54,nh:55,Ag:56,Bg:57,Lg:35,Cg:59,Bh:60,qh:61,Yh:62,Ah:63,wh:64,xh:65,Qh:66,th:67,ug:68,Vh:69,Gg:70,Mh:71,hh:72,Ng:73,yg:74,Hh:76,xg:77,Ph:78,Zg:79,$g:80,
-dh:81,bh:82,ah:83,Ch:38,pc:39,ih:36,nc:40,Kb:95,Kh:96,Jg:104,oh:105,vg:97,Oh:91,Fh:88,yh:92,Sh:108,Ig:111,sg:98,Hg:103,lh:101,jh:100,Zh:110,Rg:112,Je:113,Ke:115,He:114,Ie:89,gh:90,Nh:93,Th:94,tg:99,kh:102,Le:106,Jb:107,$h:109,ci:87,Og:122,Wh:116,Gh:95,uh:123,Tg:84,Ih:75,Dg:125,Eh:131,Jh:130,Xh:86},Oa={"0":"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",
-9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",
-32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",
-51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",
-73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can   access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",
-89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",
-106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"},Na=0,B={xe:function(a){return/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(a).slice(1)},
-Xc:function(a,b){for(var c=0,f=a.length-1;0<=f;f--){var d=a[f];"."===d?a.splice(f,1):".."===d?(a.splice(f,1),c++):c&&(a.splice(f,1),c--)}if(b)for(;c--;c)a.unshift("..");return a},normalize:function(a){var b="/"===a.charAt(0),c="/"===a.substr(-1),a=B.Xc(a.split("/").filter(function(a){return!!a}),!b).join("/");!a&&!b&&(a=".");a&&c&&(a+="/");return(b?"/":"")+a},dirname:function(a){var b=B.xe(a),a=b[0],b=b[1];if(!a&&!b)return".";b&&(b=b.substr(0,b.length-1));return a+b},wa:function(a){if("/"===a)return"/";
-var b=a.lastIndexOf("/");return-1===b?a:a.substr(b+1)},Fi:function(a){return B.xe(a)[3]},join:function(){var a=Array.prototype.slice.call(arguments,0);return B.normalize(a.join("/"))},V:function(a,b){return B.normalize(a+"/"+b)},eb:function(){for(var a="",b=G,c=arguments.length-1;-1<=c&&!b;c--){var f=0<=c?arguments[c]:d.Bc();"string"!==typeof f&&k(new TypeError("Arguments to path.resolve must be strings"));f&&(a=f+"/"+a,b="/"===f.charAt(0))}a=B.Xc(a.split("/").filter(function(a){return!!a}),!b).join("/");
-return(b?"/":"")+a||"."},te:function(a,b){function c(a){for(var b=0;b<a.length&&""===a[b];b++);for(var c=a.length-1;0<=c&&""===a[c];c--);return b>c?[]:a.slice(b,c-b+1)}for(var a=B.eb(a).substr(1),b=B.eb(b).substr(1),f=c(a.split("/")),d=c(b.split("/")),e=Math.min(f.length,d.length),h=e,j=0;j<e;j++)if(f[j]!==d[j]){h=j;break}e=[];for(j=h;j<f.length;j++)e.push("..");e=e.concat(d.slice(h));return e.join("/")}},Y={Be:[],ka:M(),tj:M(),se:function(a,b){Y.Be[a]={input:[],Oa:[],Bb:b};d.bd(a,Y.o)},o:{open:function(a){var b=
-Y.Be[a.k.Pa];b||k(new d.e(g.Hb));a.aa=b;a.seekable=G},close:function(a){a.aa.Oa.length&&a.aa.Bb.jc(a.aa,10)},P:function(a,b,c,f){(!a.aa||!a.aa.Bb.be)&&k(new d.e(g.wd));for(var e=0,i=0;i<f;i++){var h;try{h=a.aa.Bb.be(a.aa)}catch(j){k(new d.e(g.Ea))}h===p&&0===e&&k(new d.e(g.lb));if(h===r||h===p)break;e++;b[c+i]=h}e&&(a.k.timestamp=Date.now());return e},write:function(a,b,c,f){(!a.aa||!a.aa.Bb.jc)&&k(new d.e(g.wd));for(var e=0;e<f;e++)try{a.aa.Bb.jc(a.aa,b[c+e])}catch(i){k(new d.e(g.Ea))}f&&(a.k.timestamp=
-Date.now());return e}},nf:{be:function(a){if(!a.input.length){var b=r;if(ca){if(b=process.stdin.read(),!b){if(process.stdin._readableState&&process.stdin._readableState.ended)return r;return}}else"undefined"!=typeof window&&"function"==typeof window.prompt?(b=window.prompt("Input: "),b!==r&&(b+="\n")):"function"==typeof readline&&(b=readline(),b!==r&&(b+="\n"));if(!b)return r;a.input=V(b,q)}return a.input.shift()},jc:function(a,b){b===r||10===b?(e.print(a.Oa.join("")),a.Oa=[]):a.Oa.push(Y.De.ic(b))}},
-mf:{jc:function(a,b){b===r||10===b?(e.printErr(a.Oa.join("")),a.Oa=[]):a.Oa.push(Y.De.ic(b))}}},z={la:r,Ge:1,lc:2,rd:3,L:function(){return z.createNode(r,"/",16895,0)},createNode:function(a,b,c,f){(d.Df(c)||d.Ef(c))&&k(new d.e(g.ba));z.la||(z.la={dir:{k:{fa:z.n.fa,N:z.n.N,Wa:z.n.Wa,Y:z.n.Y,Y:z.n.Y,rename:z.n.rename,Ra:z.n.Ra,fb:z.n.fb,bb:z.n.bb,na:z.n.na},ma:{ga:z.o.ga}},file:{k:{fa:z.n.fa,N:z.n.N},ma:{ga:z.o.ga,P:z.o.P,write:z.o.write,rb:z.o.rb,xb:z.o.xb}},link:{k:{fa:z.n.fa,N:z.n.N,Qa:z.n.Qa},ma:{}},
-Hd:{k:{fa:z.n.fa,N:z.n.N},ma:d.Ze}});c=d.createNode(a,b,c,f);d.O(c.mode)?(c.n=z.la.dir.k,c.o=z.la.dir.ma,c.u={}):d.isFile(c.mode)?(c.n=z.la.file.k,c.o=z.la.file.ma,c.u=[],c.Qb=z.lc):d.Va(c.mode)?(c.n=z.la.link.k,c.o=z.la.link.ma):d.vb(c.mode)&&(c.n=z.la.Hd.k,c.o=z.la.Hd.ma);c.timestamp=Date.now();a&&(a.u[b]=c);return c},Ec:function(a){a.Qb!==z.lc&&(a.u=Array.prototype.slice.call(a.u),a.Qb=z.lc)},n:{fa:function(a){var b={};b.Cc=d.vb(a.mode)?a.id:1;b.ac=a.id;b.mode=a.mode;b.Wc=1;b.uid=0;b.Mc=0;b.Pa=
-a.Pa;b.size=d.O(a.mode)?4096:d.isFile(a.mode)?a.u.length:d.Va(a.mode)?a.link.length:0;b.wc=new Date(a.timestamp);b.Uc=new Date(a.timestamp);b.Ac=new Date(a.timestamp);b.Ha=4096;b.sb=Math.ceil(b.size/b.Ha);return b},N:function(a,b){b.mode!==p&&(a.mode=b.mode);b.timestamp!==p&&(a.timestamp=b.timestamp);if(b.size!==p){z.Ec(a);var c=a.u;if(b.size<c.length)c.length=b.size;else for(;b.size>c.length;)c.push(0)}},Wa:function(){k(d.Jc[g.Ib])},Y:function(a,b,c,d){return z.createNode(a,b,c,d)},rename:function(a,
-b,c){if(d.O(a.mode)){var f;try{f=d.ta(b,c)}catch(e){}if(f)for(var i in f.u)k(new d.e(g.pc))}delete a.parent.u[a.name];a.name=c;b.u[c]=a;a.parent=b},Ra:function(a,b){delete a.u[b]},fb:function(a,b){var c=d.ta(a,b),f;for(f in c.u)k(new d.e(g.pc));delete a.u[b]},bb:function(a){var b=[".",".."],c;for(c in a.u)a.u.hasOwnProperty(c)&&b.push(c);return b},na:function(a,b,c){a=z.createNode(a,b,41471,0);a.link=c;return a},Qa:function(a){d.Va(a.mode)||k(new d.e(g.B));return a.link}},o:{P:function(a,b,c,d,e){a=
-a.k.u;if(e>=a.length)return 0;d=Math.min(a.length-e,d);J(0<=d);if(8<d&&a.subarray)b.set(a.subarray(e,e+d),c);else for(var i=0;i<d;i++)b[c+i]=a[e+i];return d},write:function(a,b,c,d,e,i){var h=a.k;h.timestamp=Date.now();a=h.u;if(d&&0===a.length&&0===e&&b.subarray)return i&&0===c?(h.u=b,h.Qb=b.buffer===v.buffer?z.Ge:z.rd):(h.u=new Uint8Array(b.subarray(c,c+d)),h.Qb=z.rd),d;z.Ec(h);for(a=h.u;a.length<e;)a.push(0);for(i=0;i<d;i++)a[e+i]=b[c+i];return d},ga:function(a,b,c){1===c?b+=a.position:2===c&&d.isFile(a.k.mode)&&
-(b+=a.k.u.length);0>b&&k(new d.e(g.B));a.pd=[];return a.position=b},rb:function(a,b,c){z.Ec(a.k);a=a.k.u;for(b+=c;b>a.length;)a.push(0)},xb:function(a,b,c,f,e,i,h){d.isFile(a.k.mode)||k(new d.e(g.Hb));a=a.k.u;if(!(h&2)&&(a.buffer===b||a.buffer===b.buffer))e=G,f=a.byteOffset;else{if(0<e||e+f<a.length)a=a.subarray?a.subarray(e,e+f):Array.prototype.slice.call(a,e,e+f);e=q;(f=ia(f))||k(new d.e(g.Ne));b.set(a,f)}return{ej:f,si:e}}}},I={cc:G,nd:function(){I.cc=!!process.platform.match(/^win/)},L:function(a){J(ca);
-return I.createNode(r,"/",I.La(a.pe.root),0)},createNode:function(a,b,c){!d.O(c)&&(!d.isFile(c)&&!d.Va(c))&&k(new d.e(g.B));a=d.createNode(a,b,c);a.n=I.n;a.o=I.o;return a},La:function(a){var b;try{b=O.Lf(a),I.cc&&(b.mode|=(b.mode&146)>>1)}catch(c){c.code||k(c),k(new d.e(g[c.code]))}return b.mode},Z:function(a){for(var b=[];a.parent!==a;)b.push(a.name),a=a.parent;b.push(a.L.pe.root);b.reverse();return B.join.apply(r,b)},Vd:{"0":"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",
-577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},Hc:function(a){return a in I.Vd?I.Vd[a]:a},n:{fa:function(a){var a=I.Z(a),b;try{b=O.Lf(a)}catch(c){c.code||k(c),k(new d.e(g[c.code]))}I.cc&&!b.Ha&&(b.Ha=4096);I.cc&&!b.sb&&(b.sb=(b.size+b.Ha-1)/b.Ha|0);return{Cc:b.Cc,ac:b.ac,mode:b.mode,Wc:b.Wc,uid:b.uid,Mc:b.Mc,Pa:b.Pa,size:b.size,wc:b.wc,Uc:b.Uc,Ac:b.Ac,Ha:b.Ha,sb:b.sb}},N:function(a,b){var c=I.Z(a);
-try{b.mode!==p&&(O.xi(c,b.mode),a.mode=b.mode);if(b.timestamp!==p){var f=new Date(b.timestamp);O.Dj(c,f,f)}b.size!==p&&O.yj(c,b.size)}catch(e){e.code||k(e),k(new d.e(g[e.code]))}},Wa:function(a,b){var c=B.V(I.Z(a),b),c=I.La(c);return I.createNode(a,b,c)},Y:function(a,b,c,f){a=I.createNode(a,b,c,f);b=I.Z(a);try{d.O(a.mode)?O.Zi(b,a.mode):O.Gj(b,"",{mode:a.mode})}catch(e){e.code||k(e),k(new d.e(g[e.code]))}return a},rename:function(a,b,c){a=I.Z(a);b=B.V(I.Z(b),c);try{O.mj(a,b)}catch(f){f.code||k(f),
-k(new d.e(g[f.code]))}},Ra:function(a,b){var c=B.V(I.Z(a),b);try{O.Aj(c)}catch(f){f.code||k(f),k(new d.e(g[f.code]))}},fb:function(a,b){var c=B.V(I.Z(a),b);try{O.nj(c)}catch(f){f.code||k(f),k(new d.e(g[f.code]))}},bb:function(a){a=I.Z(a);try{return O.ij(a)}catch(b){b.code||k(b),k(new d.e(g[b.code]))}},na:function(a,b,c){a=B.V(I.Z(a),b);try{O.vj(c,a)}catch(f){f.code||k(f),k(new d.e(g[f.code]))}},Qa:function(a){a=I.Z(a);try{return O.jj(a)}catch(b){b.code||k(b),k(new d.e(g[b.code]))}}},o:{open:function(a){var b=
-I.Z(a.k);try{d.isFile(a.k.mode)&&(a.Ab=O.bj(b,I.Hc(a.I)))}catch(c){c.code||k(c),k(new d.e(g[c.code]))}},close:function(a){try{d.isFile(a.k.mode)&&a.Ab&&O.yi(a.Ab)}catch(b){b.code||k(b),k(new d.e(g[b.code]))}},P:function(a,b,c,f,e){var i=new Buffer(f),h;try{h=O.hj(a.Ab,i,0,f,e)}catch(j){k(new d.e(g[j.code]))}if(0<h)for(a=0;a<h;a++)b[c+a]=i[a];return h},write:function(a,b,c,f,e){var b=new Buffer(b.subarray(c,c+f)),i;try{i=O.Hj(a.Ab,b,0,f,e)}catch(h){k(new d.e(g[h.code]))}return i},ga:function(a,b,c){if(1===
-c)b+=a.position;else if(2===c&&d.isFile(a.k.mode))try{var f=O.Ji(a.Ab),b=b+f.size}catch(e){k(new d.e(g[e.code]))}0>b&&k(new d.e(g.B));return a.position=b}}};Ga=D(1,"i32*",S);ma=D(1,"i32*",S);Ha=D(1,"i32*",S);var d={root:r,gc:[],Pd:[r],jb:[r],Vf:1,Ca:r,Ld:"/",$b:G,ee:q,e:r,Jc:{},sa:function(a){a instanceof d.e||k(a+" : "+bb());return H(a.Vb)},F:function(a,b){a=B.eb(d.Bc(),a);b=b||{ad:0};8<b.ad&&k(new d.e(g.nc));for(var c=B.Xc(a.split("/").filter(function(a){return!!a}),G),f=d.root,e="/",i=0;i<c.length;i++){var h=
-i===c.length-1;if(h&&b.parent)break;f=d.ta(f,c[i]);e=B.V(e,c[i]);d.wb(f)&&(f=f.L.root);if(!h||b.T)for(h=0;d.Va(f.mode);)f=d.Qa(e),e=B.eb(B.dirname(e),f),f=d.F(e,{ad:b.ad}).k,40<h++&&k(new d.e(g.nc))}return{path:e,k:f}},Ba:function(a){for(var b;;){if(d.bc(a))return a=a.L.Sf,!b?a:"/"!==a[a.length-1]?a+"/"+b:a+b;b=b?a.name+"/"+b:a.name;a=a.parent}},Nc:function(a,b){for(var c=0,f=0;f<b.length;f++)c=(c<<5)-c+b.charCodeAt(f)|0;return(a+c>>>0)%d.Ca.length},ce:function(a){var b=d.Nc(a.parent.id,a.name);a.$a=
-d.Ca[b];d.Ca[b]=a},de:function(a){var b=d.Nc(a.parent.id,a.name);if(d.Ca[b]===a)d.Ca[b]=a.$a;else for(b=d.Ca[b];b;){if(b.$a===a){b.$a=a.$a;break}b=b.$a}},ta:function(a,b){var c=d.Nf(a);c&&k(new d.e(c));for(c=d.Ca[d.Nc(a.id,b)];c;c=c.$a){var f=c.name;if(c.parent.id===a.id&&f===b)return c}return d.Wa(a,b)},createNode:function(a,b,c,f){d.Lb||(d.Lb=function(a,b,c,f){this.id=d.Vf++;this.name=b;this.mode=c;this.n={};this.o={};this.Pa=f;this.L=this.parent=r;a||(a=this);this.parent=a;this.L=a.L;d.ce(this)},
-d.Lb.prototype={},Object.defineProperties(d.Lb.prototype,{P:{get:function(){return 365===(this.mode&365)},set:function(a){a?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146===(this.mode&146)},set:function(a){a?this.mode|=146:this.mode&=-147}},Pc:{get:function(){return d.O(this.mode)}},Oc:{get:function(){return d.vb(this.mode)}}}));return new d.Lb(a,b,c,f)},Od:function(a){d.de(a)},bc:function(a){return a===a.parent},wb:function(a){return a.Rf},isFile:function(a){return 32768===(a&
-61440)},O:function(a){return 16384===(a&61440)},Va:function(a){return 40960===(a&61440)},vb:function(a){return 8192===(a&61440)},Df:function(a){return 24576===(a&61440)},Ef:function(a){return 4096===(a&61440)},Hf:function(a){return 49152===(a&49152)},qf:{r:0,rs:1052672,"r+":2,w:577,wx:705,xw:705,"w+":578,"wx+":706,"xw+":706,a:1089,ax:1217,xa:1217,"a+":1090,"ax+":1218,"xa+":1218},je:function(a){var b=d.qf[a];"undefined"===typeof b&&k(Error("Unknown file open mode: "+a));return b},Hc:function(a){var b=
-["r","w","rw"][a&2097155];a&512&&(b+="w");return b},Da:function(a,b){return d.ee?0:-1!==b.indexOf("r")&&!(a.mode&292)||-1!==b.indexOf("w")&&!(a.mode&146)||-1!==b.indexOf("x")&&!(a.mode&73)?g.mc:0},Nf:function(a){return d.Da(a,"x")},Tc:function(a,b){try{return d.ta(a,b),g.ud}catch(c){}return d.Da(a,"wx")},ec:function(a,b,c){var f;try{f=d.ta(a,b)}catch(e){return e.Vb}if(a=d.Da(a,"wx"))return a;if(c){if(!d.O(f.mode))return g.oc;if(d.bc(f)||d.Ba(f)===d.Bc())return g.mb}else if(d.O(f.mode))return g.Sa;
-return 0},Of:function(a,b){return!a?g.Ib:d.Va(a.mode)?g.nc:d.O(a.mode)&&(0!==(b&2097155)||b&512)?g.Sa:d.Da(a,d.Hc(b))},Se:4096,Wf:function(a,b){for(var b=b||d.Se,c=a||1;c<=b;c++)if(!d.jb[c])return c;k(new d.e(g.Me))},D:function(a){return d.jb[a]},Jd:function(a,b,c){d.ob||(d.ob=M(),d.ob.prototype={},Object.defineProperties(d.ob.prototype,{object:{get:function(){return this.k},set:function(a){this.k=a}},Ri:{get:function(){return 1!==(this.I&2097155)}},Si:{get:function(){return 0!==(this.I&2097155)}},
-Qi:{get:function(){return this.I&1024}}}));if(a.__proto__)a.__proto__=d.ob.prototype;else{var f=new d.ob,e;for(e in a)f[e]=a[e];a=f}b=d.Wf(b,c);a.da=b;return d.jb[b]=a},$e:function(a){d.jb[a]=r},Ze:{open:function(a){a.o=d.tf(a.k.Pa).o;a.o.open&&a.o.open(a)},ga:function(){k(new d.e(g.nb))}},Sc:function(a){return a>>8},Yi:function(a){return a&255},Na:function(a,b){return a<<8|b},bd:function(a,b){d.Pd[a]={o:b}},tf:function(a){return d.Pd[a]},Ae:function(a,b){function c(a){if(a)return b(a);++f>=e&&b(r)}
-"function"===typeof a&&(b=a,a=G);for(var f=0,e=d.gc.length,i=0;i<d.gc.length;i++){var h=d.gc[i];h.type.Ae?h.type.Ae(h,a,c):c(r)}},L:function(a,b,c){var f;c&&(f=d.F(c,{T:G}),c=f.path);b={type:a,pe:b,Sf:c,root:r};a=a.L(b);a.L=b;b.root=a;f&&(f.k.L=b,f.k.Rf=q,"/"===c&&(d.root=b.root));d.gc.push(b);return a},Wa:function(a,b){return a.n.Wa(a,b)},Y:function(a,b,c){var f=d.F(a,{parent:q}).k,a=B.wa(a),e=d.Tc(f,a);e&&k(new d.e(e));f.n.Y||k(new d.e(g.ba));return f.n.Y(f,a,b,c)},create:function(a,b){b=(b!==p?
-b:438)&4095;b|=32768;return d.Y(a,b,0)},Xa:function(a,b){b=(b!==p?b:511)&1023;b|=16384;return d.Y(a,b,0)},fc:function(a,b,c){"undefined"===typeof c&&(c=b,b=438);return d.Y(a,b|8192,c)},na:function(a,b){var c=d.F(b,{parent:q}).k,f=B.wa(b),e=d.Tc(c,f);e&&k(new d.e(e));c.n.na||k(new d.e(g.ba));return c.n.na(c,f,a)},rename:function(a,b){var c=B.dirname(a),f=B.dirname(b),e=B.wa(a),i=B.wa(b),h,j,l;try{h=d.F(a,{parent:q}),j=h.k,h=d.F(b,{parent:q}),l=h.k}catch(x){k(new d.e(g.mb))}j.L!==l.L&&k(new d.e(g.Oe));
-h=d.ta(j,e);f=B.te(a,f);"."!==f.charAt(0)&&k(new d.e(g.B));f=B.te(b,c);"."!==f.charAt(0)&&k(new d.e(g.pc));var m;try{m=d.ta(l,i)}catch(s){}if(h!==m){c=d.O(h.mode);(e=d.ec(j,e,c))&&k(new d.e(e));(e=m?d.ec(l,i,c):d.Tc(l,i))&&k(new d.e(e));j.n.rename||k(new d.e(g.ba));(d.wb(h)||m&&d.wb(m))&&k(new d.e(g.mb));l!==j&&(e=d.Da(j,"w"))&&k(new d.e(e));d.de(h);try{j.n.rename(h,l,i)}catch(y){k(y)}finally{d.ce(h)}}},fb:function(a){var b=d.F(a,{parent:q}).k,a=B.wa(a),c=d.ta(b,a),f=d.ec(b,a,q);f&&k(new d.e(f));
-b.n.fb||k(new d.e(g.ba));d.wb(c)&&k(new d.e(g.mb));b.n.fb(b,a);d.Od(c)},bb:function(a){a=d.F(a,{T:q}).k;a.n.bb||k(new d.e(g.oc));return a.n.bb(a)},Ra:function(a){var b=d.F(a,{parent:q}).k,a=B.wa(a),c=d.ta(b,a),f=d.ec(b,a,G);f&&(f===g.Sa&&(f=g.ba),k(new d.e(f)));b.n.Ra||k(new d.e(g.ba));d.wb(c)&&k(new d.e(g.mb));b.n.Ra(b,a);d.Od(c)},Qa:function(a){a=d.F(a,{T:G}).k;a.n.Qa||k(new d.e(g.B));return a.n.Qa(a)},ld:function(a,b){var c=d.F(a,{T:!b}).k;c.n.fa||k(new d.e(g.ba));return c.n.fa(c)},Kf:function(a){return d.ld(a,
-q)},Nb:function(a,b,c){a="string"===typeof a?d.F(a,{T:!c}).k:a;a.n.N||k(new d.e(g.ba));a.n.N(a,{mode:b&4095|a.mode&-4096,timestamp:Date.now()})},Ui:function(a,b){d.Nb(a,b,q)},Gi:function(a,b){var c=d.D(a);c||k(new d.e(g.H));d.Nb(c.k,b)},Gd:function(a,b,c,f){a="string"===typeof a?d.F(a,{T:!f}).k:a;a.n.N||k(new d.e(g.ba));a.n.N(a,{timestamp:Date.now()})},Vi:function(a,b,c){d.Gd(a,b,c,q)},Hi:function(a,b,c){(a=d.D(a))||k(new d.e(g.H));d.Gd(a.k,b,c)},truncate:function(a,b){0>b&&k(new d.e(g.B));var c;
-c="string"===typeof a?d.F(a,{T:q}).k:a;c.n.N||k(new d.e(g.ba));d.O(c.mode)&&k(new d.e(g.Sa));d.isFile(c.mode)||k(new d.e(g.B));var f=d.Da(c,"w");f&&k(new d.e(f));c.n.N(c,{size:b,timestamp:Date.now()})},Ki:function(a,b){var c=d.D(a);c||k(new d.e(g.H));0===(c.I&2097155)&&k(new d.e(g.B));d.truncate(c.k,b)},Cj:function(a,b,c){a=d.F(a,{T:q}).k;a.n.N(a,{timestamp:Math.max(b,c)})},open:function(a,b,c,f,W){var b="string"===typeof b?d.je(b):b,c=b&64?("undefined"===typeof c?438:c)&4095|32768:0,i;if("object"===
-typeof a)i=a;else{a=B.normalize(a);try{i=d.F(a,{T:!(b&131072)}).k}catch(h){}}b&64&&(i?b&128&&k(new d.e(g.ud)):i=d.Y(a,c,0));i||k(new d.e(g.Ib));d.vb(i.mode)&&(b&=-513);(c=d.Of(i,b))&&k(new d.e(c));b&512&&d.truncate(i,0);b&=-641;f=d.Jd({k:i,path:d.Ba(i),I:b,seekable:q,position:0,o:i.o,pd:[],error:G},f,W);f.o.open&&f.o.open(f);e.logReadFiles&&!(b&1)&&(d.$c||(d.$c={}),a in d.$c||(d.$c[a]=1,e.printErr("read file: "+a)));return f},close:function(a){try{a.o.close&&a.o.close(a)}catch(b){k(b)}finally{d.$e(a.da)}},
-ga:function(a,b,c){(!a.seekable||!a.o.ga)&&k(new d.e(g.nb));return a.o.ga(a,b,c)},P:function(a,b,c,f,e){(0>f||0>e)&&k(new d.e(g.B));1===(a.I&2097155)&&k(new d.e(g.H));d.O(a.k.mode)&&k(new d.e(g.Sa));a.o.P||k(new d.e(g.B));var i=q;"undefined"===typeof e?(e=a.position,i=G):a.seekable||k(new d.e(g.nb));b=a.o.P(a,b,c,f,e);i||(a.position+=b);return b},write:function(a,b,c,f,e,i){(0>f||0>e)&&k(new d.e(g.B));0===(a.I&2097155)&&k(new d.e(g.H));d.O(a.k.mode)&&k(new d.e(g.Sa));a.o.write||k(new d.e(g.B));var h=
-q;"undefined"===typeof e?(e=a.position,h=G):a.seekable||k(new d.e(g.nb));a.I&1024&&d.ga(a,0,2);b=a.o.write(a,b,c,f,e,i);h||(a.position+=b);return b},rb:function(a,b,c){(0>b||0>=c)&&k(new d.e(g.B));0===(a.I&2097155)&&k(new d.e(g.H));!d.isFile(a.k.mode)&&!d.O(node.mode)&&k(new d.e(g.Hb));a.o.rb||k(new d.e(g.Kb));a.o.rb(a,b,c)},xb:function(a,b,c,f,e,i,h){1===(a.I&2097155)&&k(new d.e(g.mc));a.o.xb||k(new d.e(g.Hb));return a.o.xb(a,b,c,f,e,i,h)},ub:function(a,b,c){a.o.ub||k(new d.e(g.vd));return a.o.ub(a,
-b,c)},gj:function(a,b){b=b||{};b.I=b.I||"r";b.encoding=b.encoding||"binary";var c,f=d.open(a,b.I),e=d.ld(a).size,i=new Uint8Array(e);d.P(f,i,0,e,0);if("utf8"===b.encoding){c="";for(var h=new l.pb,g=0;g<e;g++)c+=h.ic(i[g])}else"binary"===b.encoding?c=i:k(Error('Invalid encoding type "'+b.encoding+'"'));d.close(f);return c},Fj:function(a,b,c){c=c||{};c.I=c.I||"w";c.encoding=c.encoding||"utf8";a=d.open(a,c.I,c.mode);"utf8"===c.encoding?(b=new Uint8Array((new l.pb).re(b)),d.write(a,b,0,b.length,0)):"binary"===
-c.encoding?d.write(a,b,0,b.length,0):k(Error('Invalid encoding type "'+c.encoding+'"'));d.close(a)},Bc:function(){return d.Ld},wi:function(a){a=d.F(a,{T:q});d.O(a.k.mode)||k(new d.e(g.oc));var b=d.Da(a.k,"x");b&&k(new d.e(b));d.Ld=a.path},bf:function(){d.Xa("/tmp")},af:function(){d.Xa("/dev");d.bd(d.Na(1,3),{P:function(){return 0},write:function(){return 0}});d.fc("/dev/null",d.Na(1,3));Y.se(d.Na(5,0),Y.nf);Y.se(d.Na(6,0),Y.mf);d.fc("/dev/tty",d.Na(5,0));d.fc("/dev/tty1",d.Na(6,0));d.Xa("/dev/shm");
-d.Xa("/dev/shm/tmp")},kf:function(){e.stdin?d.Ia("/dev","stdin",e.stdin):d.na("/dev/tty","/dev/stdin");e.stdout?d.Ia("/dev","stdout",r,e.stdout):d.na("/dev/tty","/dev/stdout");e.stderr?d.Ia("/dev","stderr",r,e.stderr):d.na("/dev/tty1","/dev/stderr");var a=d.open("/dev/stdin","r");t[Ga>>2]=a.da;J(1===a.da,"invalid handle for stdin ("+a.da+")");a=d.open("/dev/stdout","w");t[ma>>2]=a.da;J(2===a.da,"invalid handle for stdout ("+a.da+")");a=d.open("/dev/stderr","w");t[Ha>>2]=a.da;J(3===a.da,"invalid handle for stderr ("+
-a.da+")")},Rd:function(){d.e||(d.e=function(a){this.Vb=a;for(var b in g)if(g[b]===a){this.code=b;break}this.message=Oa[a]},d.e.prototype=Error(),[g.Ib].forEach(function(a){d.Jc[a]=new d.e(a);d.Jc[a].stack="<generic error, no stack>"}))},nd:function(){d.Rd();d.Ca=Array(4096);d.root=d.createNode(r,"/",16895,0);d.L(z,{},"/");d.bf();d.af()},ka:function(a,b,c){J(!d.ka.$b,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");
-d.ka.$b=q;d.Rd();e.stdin=a||e.stdin;e.stdout=b||e.stdout;e.stderr=c||e.stderr;d.kf()},bg:function(){d.ka.$b=G;for(var a=0;a<d.jb.length;a++){var b=d.jb[a];b&&d.close(b)}},La:function(a,b){var c=0;a&&(c|=365);b&&(c|=146);return c},Ti:function(a,b){var c=B.join.apply(r,a);b&&"/"==c[0]&&(c=c.substr(1));return c},li:function(a,b){return B.eb(b,a)},uj:function(a){return B.normalize(a)},Ud:function(a,b){var c=d.tc(a,b);if(c.Fc)return c.object;H(c.error);return r},tc:function(a,b){try{var c=d.F(a,{T:!b}),
-a=c.path}catch(f){}var e={bc:G,Fc:G,error:0,name:r,path:r,object:r,Zf:G,ag:r,$f:r};try{c=d.F(a,{parent:q}),e.Zf=q,e.ag=c.path,e.$f=c.k,e.name=B.wa(a),c=d.F(a,{T:!b}),e.Fc=q,e.path=c.path,e.object=c.k,e.name=c.k.name,e.bc="/"===c.path}catch(i){e.error=i.Vb}return e},df:function(a,b,c,f){a=B.V("string"===typeof a?a:d.Ba(a),b);c=d.La(c,f);return d.Xa(a,c)},gf:function(a,b){for(var a="string"===typeof a?a:d.Ba(a),c=b.split("/").reverse();c.length;){var f=c.pop();if(f){var e=B.V(a,f);try{d.Xa(e)}catch(i){}a=
-e}}return e},cf:function(a,b,c,f,e){a=B.V("string"===typeof a?a:d.Ba(a),b);f=d.La(f,e);return d.create(a,f)},zc:function(a,b,c,f,e,i){a=b?B.V("string"===typeof a?a:d.Ba(a),b):a;f=d.La(f,e);e=d.create(a,f);if(c){if("string"===typeof c){for(var a=Array(c.length),b=0,h=c.length;b<h;++b)a[b]=c.charCodeAt(b);c=a}d.Nb(e,f|146);a=d.open(e,"w");d.write(a,c,0,c.length,0,i);d.close(a);d.Nb(e,f)}return e},Ia:function(a,b,c,f){a=B.V("string"===typeof a?a:d.Ba(a),b);b=d.La(!!c,!!f);d.Ia.Sc||(d.Ia.Sc=64);var e=
-d.Na(d.Ia.Sc++,0);d.bd(e,{open:function(a){a.seekable=G},close:function(){f&&(f.buffer&&f.buffer.length)&&f(10)},P:function(a,b,f,e){for(var W=0,m=0;m<e;m++){var s;try{s=c()}catch(y){k(new d.e(g.Ea))}s===p&&0===W&&k(new d.e(g.lb));if(s===r||s===p)break;W++;b[f+m]=s}W&&(a.k.timestamp=Date.now());return W},write:function(a,b,c,e){for(var W=0;W<e;W++)try{f(b[c+W])}catch(m){k(new d.e(g.Ea))}e&&(a.k.timestamp=Date.now());return W}});return d.fc(a,b,e)},ff:function(a,b,c){a=B.V("string"===typeof a?a:d.Ba(a),
-b);return d.na(c,a)},Yd:function(a){if(a.Oc||a.Pc||a.link||a.u)return q;var b=q;"undefined"!==typeof XMLHttpRequest&&k(Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."));if(e.read)try{a.u=V(e.read(a.url),q)}catch(c){b=G}else k(Error("Cannot load without read() or XMLHttpRequest."));b||H(g.Ea);return b},ef:function(a,b,c,f,e){if("undefined"!==typeof XMLHttpRequest){Xa||
-k("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var i=function(){this.Rc=G;this.Pb=[]};i.prototype.get=function(a){if(!(a>this.length-1||0>a)){var b=a%this.Ob;return this.xf(Math.floor(a/this.Ob))[b]}};i.prototype.kg=function(a){this.xf=a};i.prototype.Ed=function(){var a=new XMLHttpRequest;a.open("HEAD",c,G);a.send(r);200<=a.status&&300>a.status||304===a.status||k(Error("Couldn't load "+c+". Status: "+a.status));var b=Number(a.getResponseHeader("Content-length")),
-d,f=1048576;if(!((d=a.getResponseHeader("Accept-Ranges"))&&"bytes"===d))f=b;var e=this;e.kg(function(a){var d=a*f,i=(a+1)*f-1,i=Math.min(i,b-1);if("undefined"===typeof e.Pb[a]){var h=e.Pb;d>i&&k(Error("invalid range ("+d+", "+i+") or no bytes requested!"));i>b-1&&k(Error("only "+b+" bytes available! programmer error!"));var g=new XMLHttpRequest;g.open("GET",c,G);b!==f&&g.setRequestHeader("Range","bytes="+d+"-"+i);"undefined"!=typeof Uint8Array&&(g.responseType="arraybuffer");g.overrideMimeType&&g.overrideMimeType("text/plain; charset=x-user-defined");
-g.send(r);200<=g.status&&300>g.status||304===g.status||k(Error("Couldn't load "+c+". Status: "+g.status));d=g.response!==p?new Uint8Array(g.response||[]):V(g.responseText||"",q);h[a]=d}"undefined"===typeof e.Pb[a]&&k(Error("doXHR failed!"));return e.Pb[a]});this.Ve=b;this.Ue=f;this.Rc=q};i=new i;Object.defineProperty(i,"length",{get:function(){this.Rc||this.Ed();return this.Ve}});Object.defineProperty(i,"chunkSize",{get:function(){this.Rc||this.Ed();return this.Ue}});i={Oc:G,u:i}}else i={Oc:G,url:c};
-var h=d.cf(a,b,i,f,e);i.u?h.u=i.u:i.url&&(h.u=r,h.url=i.url);var j={};Object.keys(h.o).forEach(function(a){var b=h.o[a];j[a]=function(){d.Yd(h)||k(new d.e(g.Ea));return b.apply(r,arguments)}});j.P=function(a,b,c,f,e){d.Yd(h)||k(new d.e(g.Ea));a=a.k.u;if(e>=a.length)return 0;f=Math.min(a.length-e,f);J(0<=f);if(a.slice)for(var A=0;A<f;A++)b[c+A]=a[e+A];else for(A=0;A<f;A++)b[c+A]=a.get(e+A);return f};h.o=j;return h},hf:function(a,b,c,f,g,i,h,j,l){function x(c){function y(c){j||d.zc(a,b,c,f,g,l);i&&
-i();Ma()}var A=G;e.preloadPlugins.forEach(function(a){!A&&a.canHandle(m)&&(a.handle(c,m,y,function(){h&&h();Ma()}),A=q)});A||y(c)}n.ka();var m=b?B.eb(B.V(a,b)):a;db();"string"==typeof c?n.Xe(c,function(a){x(a)},h):x(c)},indexedDB:function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},sd:function(){return"EM_FS_"+window.location.pathname},td:20,kb:"FILE_DATA",sj:function(a,b,c){var b=b||M(),c=c||M(),f=d.indexedDB();try{var e=f.open(d.sd(),d.td)}catch(i){return c(i)}e.Yf=
-function(){console.log("creating db");e.result.createObjectStore(d.kb)};e.onsuccess=function(){var f=e.result.transaction([d.kb],"readwrite"),i=f.objectStore(d.kb),g=0,l=0,m=a.length;a.forEach(function(a){a=i.put(d.tc(a).object.u,a);a.onsuccess=function(){g++;g+l==m&&(0==l?b():c())};a.onerror=function(){l++;g+l==m&&(0==l?b():c())}});f.onerror=c};e.onerror=c},Xi:function(a,b,c){var b=b||M(),c=c||M(),f=d.indexedDB();try{var e=f.open(d.sd(),d.td)}catch(i){return c(i)}e.Yf=c;e.onsuccess=function(){var f=
-e.result;try{var i=f.transaction([d.kb],"readonly")}catch(g){c(g);return}var l=i.objectStore(d.kb),m=0,n=0,y=a.length;a.forEach(function(a){var f=l.get(a);f.onsuccess=function(){d.tc(a).Fc&&d.Ra(a);d.zc(B.dirname(a),B.wa(a),f.result,q,q,q);m++;m+n==y&&(0==n?b():c())};f.onerror=function(){n++;m+n==y&&(0==n?b():c())}});i.onerror=c};e.onerror=c}},K={L:function(){return d.createNode(r,"/",16895,0)},jf:function(a,b,c){c&&J(1==b==(6==c));a={pf:a,type:b,protocol:c,M:r,Cb:{},Yc:[],cb:[],hb:K.S};b=K.hc();
-c=d.createNode(K.root,b,49152,0);c.gb=a;b=d.Jd({path:b,k:c,I:d.je("r+"),seekable:G,o:K.o});a.ma=b;return a},ae:function(a){a=d.D(a);return!a||!d.Hf(a.k.mode)?r:a.k.gb},o:{qe:function(a){a=a.k.gb;return a.hb.qe(a)},ub:function(a,b,c){a=a.k.gb;return a.hb.ub(a,b,c)},P:function(a,b,c,d){a=a.k.gb;d=a.hb.dg(a,d);if(!d)return 0;b.set(d.buffer,c);return d.buffer.length},write:function(a,b,c,d){a=a.k.gb;return a.hb.ig(a,b,c,d)},close:function(a){a=a.k.gb;a.hb.close(a)}},hc:function(){K.hc.Kd||(K.hc.Kd=0);
-return"socket["+K.hc.Kd++ +"]"},S:{Rb:function(a,b,c){var f;"object"===typeof b&&(f=b,c=b=r);if(f)f._socket?(b=f._socket.remoteAddress,c=f._socket.remotePort):((c=/ws[s]?:\/\/([^:]+):(\d+)/.exec(f.url))||k(Error("WebSocket URL must be in the format ws(s)://address:port")),b=c[1],c=parseInt(c[2],10));else try{var e=ca?{headers:{"websocket-protocol":["binary"]}}:["binary"];f=new (ca?require("ws"):window.WebSocket)("ws://"+b+":"+c,e);f.binaryType="arraybuffer"}catch(i){k(new d.e(g.Je))}b={oa:b,port:c,
-q:f,Sb:[]};K.S.Dd(a,b);K.S.Af(a,b);2===a.type&&"undefined"!==typeof a.ib&&b.Sb.push(new Uint8Array([255,255,255,255,112,111,114,116,(a.ib&65280)>>8,a.ib&255]));return b},Xb:function(a,b,c){return a.Cb[b+":"+c]},Dd:function(a,b){a.Cb[b.oa+":"+b.port]=b},ue:function(a,b){delete a.Cb[b.oa+":"+b.port]},Af:function(a,b){function c(){try{for(var a=b.Sb.shift();a;)b.q.send(a),a=b.Sb.shift()}catch(c){b.q.close()}}function d(c){J("string"!==typeof c&&c.byteLength!==p);var c=new Uint8Array(c),f=e;e=G;f&&10===
-c.length&&255===c[0]&&255===c[1]&&255===c[2]&&255===c[3]&&112===c[4]&&111===c[5]&&114===c[6]&&116===c[7]?(c=c[8]<<8|c[9],K.S.ue(a,b),b.port=c,K.S.Dd(a,b)):a.cb.push({oa:b.oa,port:b.port,data:c})}var e=q;ca?(b.q.on("open",c),b.q.on("message",function(a,b){b.binary&&d((new Uint8Array(a)).buffer)}),b.q.on("error",M())):(b.q.onopen=c,b.q.onmessage=function(a){d(a.data)})},qe:function(a){if(1===a.type&&a.M)return a.Yc.length?65:0;var b=0,c=1===a.type?K.S.Xb(a,a.pa,a.qa):r;if(a.cb.length||!c||c&&c.q.readyState===
-c.q.Gb||c&&c.q.readyState===c.q.CLOSED)b|=65;if(!c||c&&c.q.readyState===c.q.OPEN)b|=4;if(c&&c.q.readyState===c.q.Gb||c&&c.q.readyState===c.q.CLOSED)b|=16;return b},ub:function(a,b,c){switch(b){case 21531:return b=0,a.cb.length&&(b=a.cb[0].data.length),t[c>>2]=b,0;default:return g.B}},close:function(a){if(a.M){try{a.M.close()}catch(b){}a.M=r}for(var c=Object.keys(a.Cb),d=0;d<c.length;d++){var e=a.Cb[c[d]];try{e.q.close()}catch(g){}K.S.ue(a,e)}return 0},bind:function(a,b,c){("undefined"!==typeof a.ed||
-"undefined"!==typeof a.ib)&&k(new d.e(g.B));a.ed=b;a.ib=c||p();if(2===a.type){a.M&&(a.M.close(),a.M=r);try{a.hb.Jf(a,0)}catch(f){f instanceof d.e||k(f),f.Vb!==g.Kb&&k(f)}}},zi:function(a,b,c){a.M&&k(new d.e(ERRNO_CODS.Kb));if("undefined"!==typeof a.pa&&"undefined"!==typeof a.qa){var f=K.S.Xb(a,a.pa,a.qa);f&&(f.q.readyState===f.q.CONNECTING&&k(new d.e(g.He)),k(new d.e(g.Le)))}b=K.S.Rb(a,b,c);a.pa=b.oa;a.qa=b.port;k(new d.e(g.Ke))},Jf:function(a){ca||k(new d.e(g.Kb));a.M&&k(new d.e(g.B));var b=require("ws").Server;
-a.M=new b({host:a.ed,port:a.ib});a.M.on("connection",function(b){if(1===a.type){var d=K.jf(a.pf,a.type,a.protocol),b=K.S.Rb(d,b);d.pa=b.oa;d.qa=b.port;a.Yc.push(d)}else K.S.Rb(a,b)});a.M.on("closed",function(){a.M=r});a.M.on("error",M())},accept:function(a){a.M||k(new d.e(g.B));var b=a.Yc.shift();b.ma.I=a.ma.I;return b},Oi:function(a,b){var c,f;b?((a.pa===p||a.qa===p)&&k(new d.e(g.Jb)),c=a.pa,f=a.qa):(c=a.ed||0,f=a.ib||0);return{oa:c,port:f}},ig:function(a,b,c,f,e,i){if(2===a.type){if(e===p||i===
-p)e=a.pa,i=a.qa;(e===p||i===p)&&k(new d.e(g.Ie))}else e=a.pa,i=a.qa;var h=K.S.Xb(a,e,i);1===a.type&&((!h||h.q.readyState===h.q.Gb||h.q.readyState===h.q.CLOSED)&&k(new d.e(g.Jb)),h.q.readyState===h.q.CONNECTING&&k(new d.e(g.lb)));b=b instanceof Array||b instanceof ArrayBuffer?b.slice(c,c+f):b.buffer.slice(b.byteOffset+c,b.byteOffset+c+f);if(2===a.type&&(!h||h.q.readyState!==h.q.OPEN)){if(!h||h.q.readyState===h.q.Gb||h.q.readyState===h.q.CLOSED)h=K.S.Rb(a,e,i);h.Sb.push(b);return f}try{return h.q.send(b),
-f}catch(j){k(new d.e(g.B))}},dg:function(a,b){1===a.type&&a.M&&k(new d.e(g.Jb));var c=a.cb.shift();if(!c){if(1===a.type){var f=K.S.Xb(a,a.pa,a.qa);if(f){if(f.q.readyState===f.q.Gb||f.q.readyState===f.q.CLOSED)return r;k(new d.e(g.lb))}k(new d.e(g.Jb))}k(new d.e(g.lb))}var f=c.data.byteLength||c.data.length,e=c.data.byteOffset||0,i=c.data.buffer||c.data,h=Math.min(b,f),j={buffer:new Uint8Array(i,e,h),oa:c.oa,port:c.port};1===a.type&&h<f&&(c.data=new Uint8Array(i,e+h,f-h),a.cb.unshift(c));return j}}},
-sc=ac;e._tolower=tc;var uc=ic,vc=jc,wc=kc,xc=oc,yc=nc,zc=Ia;e._strcpy=Ac;var dc=0;e._strcat=Bc;var Cc=lc,Dc=ua,Hb=D(1,"i32*",S),U={};e._saveSetjmp=Ec;e._testSetjmp=Fc;e._strncpy=Gc;var Hc=Ja,Ic=mc,Jc=ua,Kc=ac,Lc=pc,n={ua:{hg:r,we:G,paused:G,fj:[],pause:function(){n.ua.we=q},fg:function(){n.ua.paused&&(n.ua.paused=G,n.ua.hg());n.ua.we=G},updateStatus:function(){if(e.setStatus){var a=e.statusMessage||"Please wait...",b=n.ua.kj,c=n.ua.Ei;b?b<c?e.setStatus(a+" ("+(c-b)+"/"+c+")"):e.setStatus(a):e.setStatus("")}}},
-Qc:G,Zc:G,Qf:[],Ej:[],ka:function(){function a(){n.Zc=document.pointerLockElement===c||document.mozPointerLockElement===c||document.webkitPointerLockElement===c}e.preloadPlugins||(e.preloadPlugins=[]);if(!n.Bf&&!Xa){n.Bf=q;try{new Blob,n.Zb=q}catch(b){n.Zb=G,console.log("warning: no blob constructor, cannot create blobs with mimetypes")}n.BlobBuilder="undefined"!=typeof MozBlobBuilder?MozBlobBuilder:"undefined"!=typeof WebKitBlobBuilder?WebKitBlobBuilder:!n.Zb?console.log("warning: no BlobBuilder"):
-r;n.Mb="undefined"!=typeof window?window.URL?window.URL:window.webkitURL:p;!e.oe&&"undefined"===typeof n.Mb&&(console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."),e.oe=q);e.preloadPlugins.push({canHandle:function(a){return!e.oe&&/\.(jpg|jpeg|png|bmp)$/i.test(a)},handle:function(a,b,c,d){var g=r;if(n.Zb)try{g=new Blob([a],{type:n.Kc(b)}),g.size!==a.length&&(g=new Blob([(new Uint8Array(a)).buffer],{type:n.Kc(b)}))}catch(u){l.Fb("Blob constructor present but fails: "+
-u+"; falling back to blob builder")}g||(g=new n.BlobBuilder,g.append((new Uint8Array(a)).buffer),g=g.getBlob());var x=n.Mb.createObjectURL(g),m=new Image;m.onload=function(){J(m.complete,"Image "+b+" could not be decoded");var d=document.createElement("canvas");d.width=m.width;d.height=m.height;d.getContext("2d").drawImage(m,0,0);e.preloadedImages[b]=d;n.Mb.revokeObjectURL(x);c&&c(a)};m.onerror=function(){console.log("Image "+x+" could not be decoded");d&&d()};m.src=x}});e.preloadPlugins.push({canHandle:function(a){return!e.aj&&
-a.substr(-4)in{".ogg":1,".wav":1,".mp3":1}},handle:function(a,b,c,d){function g(d){x||(x=q,e.preloadedAudios[b]=d,c&&c(a))}function l(){x||(x=q,e.preloadedAudios[b]=new Audio,d&&d())}var x=G;if(n.Zb){try{var m=new Blob([a],{type:n.Kc(b)})}catch(s){return l()}var m=n.Mb.createObjectURL(m),y=new Audio;y.addEventListener("canplaythrough",function(){g(y)},G);y.onerror=function(){if(!x){console.log("warning: browser could not fully decode audio "+b+", trying slower base64 approach");for(var c="",d=0,e=
-0,i=0;i<a.length;i++){d=d<<8|a[i];for(e+=8;6<=e;)var h=d>>e-6&63,e=e-6,c=c+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[h]}2==e?(c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(d&3)<<4],c+="=="):4==e&&(c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(d&15)<<2],c+="=");y.src="data:audio/x-"+b.substr(-3)+";base64,"+c;g(y)}};y.src=m;n.gg(function(){g(y)},1E4)}else return l()}});var c=e.canvas;c.dd=c.requestPointerLock||c.mozRequestPointerLock||
-c.webkitRequestPointerLock;c.Td=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||M();c.Td=c.Td.bind(document);document.addEventListener("pointerlockchange",a,G);document.addEventListener("mozpointerlockchange",a,G);document.addEventListener("webkitpointerlockchange",a,G);e.elementPointerLock&&c.addEventListener("click",function(a){!n.Zc&&c.dd&&(c.dd(),a.preventDefault())},G)}},Ai:function(a,b,c,d){var g;try{if(b){var i={antialias:G,alpha:G};if(d)for(var h in d)i[h]=
-d[h];var j="?",d=function(a){j=a.statusMessage||j};a.addEventListener("webglcontextcreationerror",d,G);try{["experimental-webgl","webgl"].some(function(b){return g=a.getContext(b,i)})}finally{a.removeEventListener("webglcontextcreationerror",d,G)}}else g=a.getContext("2d");g||k(":(")}catch(l){return e.print("Could not create canvas: "+[j,l]),r}b&&(a.style.backgroundColor="black",a.addEventListener("webglcontextlost",function(){alert("WebGL context lost. You will need to reload the page.")},G));c&&
-(GLctx=e.Bi=g,e.Bj=b,n.Qf.forEach(function(a){a()}),n.ka());return g},Ci:M(),Zd:G,dc:p,Db:p,cd:function(a,b){function c(){n.Qc=G;(document.webkitFullScreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.mozFullscreenElement||document.fullScreenElement||document.fullscreenElement)===d?(d.Fd=document.cancelFullScreen||document.mozCancelFullScreen||document.webkitCancelFullScreen,d.Fd=d.Fd.bind(document),n.dc&&d.dd(),n.Qc=q,n.Db&&n.lg()):n.Db&&n.mg();if(e.onFullScreen)e.onFullScreen(n.Qc)}
-n.dc=a;n.Db=b;"undefined"===typeof n.dc&&(n.dc=q);"undefined"===typeof n.Db&&(n.Db=G);var d=e.canvas;n.Zd||(n.Zd=q,document.addEventListener("fullscreenchange",c,G),document.addEventListener("mozfullscreenchange",c,G),document.addEventListener("webkitfullscreenchange",c,G));d.cd=d.requestFullScreen||d.mozRequestFullScreen||(d.webkitRequestFullScreen?function(){d.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:r);d.cd()},requestAnimationFrame:function(a){"undefined"===typeof window?setTimeout(a,
-1E3/60):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||window.setTimeout),window.requestAnimationFrame(a))},pj:function(a){return function(){if(!ba)return a.apply(r,arguments)}},qj:function(a){return n.requestAnimationFrame(function(){ba||a()})},gg:function(a,b){return setTimeout(function(){ba||a()},b)},rj:function(a,b){return setInterval(function(){ba||
-a()},b)},Kc:function(a){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[a.substr(a.lastIndexOf(".")+1)]},Yb:function(a){window.Yb||(window.Yb=navigator.getUserMedia||navigator.mozGetUserMedia);window.Yb(a)},vf:function(a){return a.movementX||a.mozMovementX||a.webkitMovementX||0},wf:function(a){return a.movementY||a.mozMovementY||a.webkitMovementY||0},Ya:0,Za:0,yb:0,zb:0,ui:function(a){if(n.Zc)"mousemove"!=a.type&&"mozMovementX"in
-a?n.yb=n.zb=0:(n.yb=n.vf(a),n.zb=n.wf(a)),"undefined"!=typeof SDL?(n.Ya=SDL.Ya+n.yb,n.Za=SDL.Za+n.zb):(n.Ya+=n.yb,n.Za+=n.zb);else{var b=e.canvas.getBoundingClientRect(),c,d;c="undefined"!==typeof window.scrollX?window.scrollX:window.pageXOffset;d="undefined"!==typeof window.scrollY?window.scrollY:window.pageYOffset;if("touchstart"==a.type||"touchend"==a.type||"touchmove"==a.type)if(a=a.touches.item(0))c=a.pageX-(c+b.left),d=a.pageY-(d+b.top);else return;else c=a.pageX-(c+b.left),d=a.pageY-(d+b.top);
-a=e.canvas.height;c*=e.canvas.width/b.width;d*=a/b.height;n.yb=c-n.Ya;n.zb=d-n.Za;n.Ya=c;n.Za=d}},qg:function(a,b,c){var d=new XMLHttpRequest;d.open("GET",a,q);d.responseType="arraybuffer";d.onload=function(){200==d.status||0==d.status&&d.response?b(d.response):c()};d.onerror=c;d.send(r)},Xe:function(a,b,c,d){n.qg(a,function(c){J(c,'Loading data file "'+a+'" failed (no arrayBuffer).');b(new Uint8Array(c));d||Ma()},function(){c?c():k('Loading data file "'+a+'" failed.')});d||db()},eg:[],qd:function(){var a=
-e.canvas;n.eg.forEach(function(b){b(a.width,a.height)})},jg:function(a,b,c){var d=e.canvas;d.width=a;d.height=b;c||n.qd()},Fe:0,Ee:0,lg:function(){var a=e.canvas;this.Fe=a.width;this.Ee=a.height;a.width=screen.width;a.height=screen.height;"undefined"!=typeof SDL&&(a=Ya[SDL.screen+0*l.Fa>>2],t[SDL.screen+0*l.Fa>>2]=a|8388608);n.qd()},mg:function(){var a=e.canvas;a.width=this.Fe;a.height=this.Ee;"undefined"!=typeof SDL&&(a=Ya[SDL.screen+0*l.Fa>>2],t[SDL.screen+0*l.Fa>>2]=a&-8388609);n.qd()}};d.nd();
-ka.unshift({Ka:function(){!e.noFSInit&&!d.ka.$b&&d.ka()}});lb.push({Ka:function(){d.ee=G}});Ua.push({Ka:function(){d.bg()}});e.FS_createFolder=d.df;e.FS_createPath=d.gf;e.FS_createDataFile=d.zc;e.FS_createPreloadedFile=d.hf;e.FS_createLazyFile=d.ef;e.FS_createLink=d.ff;e.FS_createDevice=d.Ia;Na=l.md(4);t[Na>>2]=0;ka.unshift({Ka:function(){Y.ka()}});Ua.push({Ka:M()});Y.De=new l.pb;if(ca){var O=require("fs");I.nd()}ka.push({Ka:function(){K.root=d.L(K,{},r)}});dc=l.md(4);Ca(U);ra.$=D([0],"i8",S);Ea.$=
-D([0],"i8",S);e.requestFullScreen=function(a,b){n.cd(a,b)};e.requestAnimationFrame=function(a){n.requestAnimationFrame(a)};e.setCanvasSize=function(a,b,c){n.jg(a,b,c)};e.pauseMainLoop=function(){n.ua.pause()};e.resumeMainLoop=function(){n.ua.fg()};e.getUserMedia=function(){n.Yb()};Zb=X=l.qb(la);nb=Zb+5242880;$b=Z=l.qb(nb);J($b<ha,"TOTAL_MEMORY not big enough for stack");var Mc=D([8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"i8",3),Nc=D([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,
-1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],"i8",3),va=Math.min;var u=(function(global,env,buffer) {
-// EMSCRIPTEN_START_ASM
-"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env.cttz_i8|0;var n=env.ctlz_i8|0;var o=env._stderr|0;var p=env._stdout|0;var q=env._stdin|0;var r=env.___fsmu8|0;var s=+env.NaN;var t=+env.Infinity;var u=0;var v=0;var w=0;var x=0;var y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0.0;var H=0;var I=0;var J=0;var K=0;var L=0;var M=0;var N=0;var O=0;var P=0;var Q=0;var R=global.Math.floor;var S=global.Math.abs;var T=global.Math.sqrt;var U=global.Math.pow;var V=global.Math.cos;var W=global.Math.sin;var X=global.Math.tan;var Y=global.Math.acos;var Z=global.Math.asin;var _=global.Math.atan;var $=global.Math.atan2;var aa=global.Math.exp;var ba=global.Math.log;var ca=global.Math.ceil;var da=global.Math.imul;var ea=env.abort;var fa=env.assert;var ga=env.asmPrintInt;var ha=env.asmPrintFloat;var ia=env.min;var ja=env.invoke_viiiii;var ka=env.invoke_vi;var la=env.invoke_vii;var ma=env.invoke_ii;var na=env.invoke_iiiff;var oa=env.invoke_iiiiii;var pa=env.invoke_iiii;var qa=env.invoke_viiiiii;var ra=env.invoke_iiiiidddd;var sa=env.invoke_di;var ta=env.invoke_dd;var ua=env.invoke_dddd;var va=env.invoke_viiiiiiiii;var wa=env.invoke_iii;var xa=env.invoke_d;var ya=env.invoke_i;var za=env.invoke_viiiddi;var Aa=env.invoke_iiiii;var Ba=env.invoke_viii;var Ca=env.invoke_v;var Da=env.invoke_viiii;var Ea=env._llvm_lifetime_end;var Fa=env._lseek;var Ga=env.__scanString;var Ha=env._fclose;var Ia=env._fflush;var Ja=env._strtol;var Ka=env._fputc;var La=env._strtok;var Ma=env._fwrite;var Na=env._send;var Oa=env._fputs;var Pa=env._tmpnam;var Qa=env._isspace;var Ra=env._read;var Sa=env._ceil;var Ta=env._fileno;var Ua=env._strstr;var Va=env._fsync;var Wa=env._isblank;var Xa=env._fmod;var Ya=env._strcmp;var Za=env._strncmp;var _a=env._tmpfile;var $a=env._snprintf;var ab=env._fgetc;var bb=env.__getFloat;var cb=env._hypot;var db=env._fgets;var eb=env._close;var fb=env._getgid;var gb=env._strchr;var hb=env._asin;var ib=env._puts;var jb=env.___setErrNo;var kb=env._access;var lb=env._ftell;var mb=env._exit;var nb=env._sprintf;var ob=env._strrchr;var pb=env._copysign;var qb=env._recv;var rb=env._cos;var sb=env._putchar;var tb=env._isalnum;var ub=env._times;var vb=env._bsearch;var wb=env.__exit;var xb=env._isupper;var yb=env._rand;var zb=env._fabsf;var Ab=env._setlocale;var Bb=env._bcopy;var Cb=env._toupper;var Db=env._pread;var Eb=env._fopen;var Fb=env._open;var Gb=env._sqrtf;var Hb=env._sysconf;var Ib=env._putenv;var Jb=env._qsort;var Kb=env._isalpha;var Lb=env._strdup;var Mb=env._log10;var Nb=env._fread;var Ob=env._isatty;var Pb=env.__formatString;var Qb=env._getenv;var Rb=env._atoi;var Sb=env._vfprintf;var Tb=env._llvm_pow_f64;var Ub=env._sbrk;var Vb=env.___errno_location;var Wb=env._strerror;var Xb=env._fstat;var Yb=env._llvm_lifetime_start;var Zb=env.__parseInt;var _b=env._vsprintf;var $b=env._vsnprintf;var ac=env._sscanf;var bc=env._feof;var cc=env.___assert_fail;var dc=env._srand;var ec=env._strtok_r;var fc=env._abort;var gc=env._fprintf;var hc=env._tan;var ic=env.___buildEnvironment;var jc=env._fabs;var kc=env._floor;var lc=env.__reallyNegative;var mc=env._fseek;var nc=env._sqrt;var oc=env._write;var pc=env._sin;var qc=env._stat;var rc=env._longjmp;var sc=env._strpbrk;var tc=env._llvm_va_end;var uc=env._acos;var vc=env._pwrite;var wc=env._strerror_r;var xc=env._atan2;var yc=env._exp;var zc=env._time;var Ac=0.0;
-// EMSCRIPTEN_START_FUNCS
-function gj(){var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;e=i;i=i+1200|0;f=e|0;g=e+400|0;c[44690]=0;c[44694]=-2;h=0;j=0;k=f;l=f;m=200;n=g;o=g;a:while(1){b[l>>1]=h;if((k+(m-1<<1)|0)>>>0>l>>>0){p=k;q=l;r=m;s=n;t=o}else{g=l-k>>1;u=g+1|0;if(m>>>0>9999>>>0){v=109;break}w=m<<1;x=w>>>0>1e4>>>0?1e4:w;w=dF(x*6|0|3)|0;if((w|0)==0){v=109;break}y=w;z=k;tF(w|0,z|0,u<<1)|0;A=w+((x>>>1&1073741823)<<2)|0;tF(A|0,o|0,u<<2)|0;if((k|0)!=(f|0)){eF(z)}if((x-1|0)>(g|0)){p=y;q=y+(g<<1)|0;r=x;s=A+(g<<2)|0;t=A}else{B=y;C=1;break}}if((h|0)==29){B=p;C=0;break}y=b[22400+(h<<1)>>1]|0;A=y<<16>>16;do{if(y<<16>>16==-72){v=22}else{g=c[44694]|0;if((g|0)==-2){x=Ci()|0;c[44694]=x;D=x}else{D=g}do{if((D|0)<1){c[44694]=0;E=0}else{if(D>>>0>=294>>>0){E=2;break}E=d[21648+D|0]|0}}while(0);g=E+A|0;if(g>>>0>227>>>0){v=22;break}if((a[22768+g|0]|0)!=(E|0)){v=22;break}x=a[21944+g|0]|0;g=x<<24>>24;if(x<<24>>24<1){F=-g|0;v=23;break}else{c[44694]=-2;x=s+4|0;c[x>>2]=c[44692];G=g;H=(j|0)==0?0:j-1|0;I=q;J=x;break}}}while(0);do{if((v|0)==22){v=0;A=a[22656+h|0]|0;if(A<<24>>24!=0){F=A&255;v=23;break}A=c[44694]|0;do{if((j|0)==0){c[44690]=(c[44690]|0)+1;vi(127664);K=q;L=s;M=y}else if((j|0)==3){if((A|0)<1){if((A|0)==0){B=p;C=1;break a}else{K=q;L=s;M=y;break}}else{c[44694]=-2;K=q;L=s;M=y;break}}else{K=q;L=s;M=y}}while(0);while(1){if(M<<16>>16!=-72){A=(M<<16>>16)+1|0;if(M<<16>>16>-2&(A|0)<228&(A|0)==12){break}}if((K|0)==(p|0)){B=p;C=1;break a}A=K-2|0;K=A;L=L-4|0;M=b[22400+(b[A>>1]<<1)>>1]|0}A=L+4|0;c[A>>2]=c[44692];G=1;H=3;I=K;J=A}}while(0);b:do{if((v|0)==23){v=0;y=d[22176+F|0]|0;A=1-y|0;x=s+(A<<2)|0;g=c[x>>2]|0;switch(F|0){case 22:{z=c[53690]|0;u=c[z+4>>2]|0;eF(z);c[53690]=u;N=g;break};case 23:{kj(c[s>>2]|0);N=g;break};case 41:{N=c[s-4>>2]|0;break};case 18:{u=c[53690]|0;z=c[u+4>>2]|0;eF(u);c[53690]=z;N=g;break};case 5:{N=ij()|0;break};case 52:{z=c[s-4>>2]|0;u=c[s>>2]|0;w=jk(16)|0;O=c[53698]|0;P=c[O+84>>2]|0;Q=c[(Hc[c[P>>2]&63](P,0,256)|0)+8>>2]|0;c[w+8>>2]=z;Hc[c[Q>>2]&63](Q,w,1)|0;a[z+92|0]=1;if((a[O+112|0]&1)!=0){a[z+100|0]=1}c[z+88>>2]=u;N=g;break};case 38:{N=c[s-4>>2]|0;break};case 32:{N=c[s>>2]|0;break};case 57:{N=c[s-12>>2]|0;break};case 58:{u=c[s>>2]|0;z=ij()|0;O=jk(16)|0;w=c[53698]|0;Q=c[w+84>>2]|0;P=c[(Hc[c[Q>>2]&63](Q,0,256)|0)+8>>2]|0;c[O+8>>2]=u;Hc[c[P>>2]&63](P,O,1)|0;a[u+92|0]=2;if((a[w+112|0]&1)!=0){a[u+100|0]=1}c[u+88>>2]=z;N=g;break};case 46:{a[(c[s-8>>2]|0)+12|0]=1;N=c[s>>2]|0;break};case 47:{z=$g(71032,c[43328]|0)|0;u=c[53698]|0;w=jk(16)|0;c[w+8>>2]=z;if((a[u+112|0]&2)!=0){a[w+12|0]=1}z=c[u+84>>2]|0;Hc[c[z>>2]&63](z,w,1)|0;N=g;break};case 44:{N=c[s>>2]|0;break};case 45:{N=c[s>>2]|0;break};case 39:{N=c[s-4>>2]|0;break};case 21:{kj(c[s>>2]|0);N=g;break};case 17:{kj(c[s>>2]|0);N=g;break};case 9:{jj(c[s>>2]|0);N=g;break};case 24:{w=c[53690]|0;z=c[w+4>>2]|0;eF(w);c[53690]=z;N=g;break};case 25:{kj(c[s>>2]|0);N=g;break};case 40:{N=c[s-4>>2]|0;break};case 37:{N=c[s>>2]|0;break};case 19:{kj(c[s>>2]|0);N=g;break};case 55:{N=c[s-12>>2]|0;break};case 56:{z=c[s-4>>2]|0;w=c[s>>2]|0;u=jk(16)|0;O=c[53698]|0;P=c[O+84>>2]|0;Q=c[(Hc[c[P>>2]&63](P,0,256)|0)+8>>2]|0;c[u+8>>2]=z;Hc[c[Q>>2]&63](Q,u,1)|0;a[z+92|0]=3;if((a[O+112|0]&1)!=0){a[z+100|0]=1}c[z+88>>2]=w;N=g;break};case 53:{N=c[s-12>>2]|0;break};case 49:{N=c[s>>2]|0;break};case 50:{N=c[s>>2]|0;break};case 51:{w=(c[s-8>>2]|0)+100|0;a[w]=a[w]|1;N=c[s>>2]|0;break};case 54:{w=c[s-4>>2]|0;z=c[s>>2]|0;O=jk(16)|0;u=c[53698]|0;Q=c[u+84>>2]|0;P=c[(Hc[c[Q>>2]&63](Q,0,256)|0)+8>>2]|0;c[O+8>>2]=w;Hc[c[P>>2]&63](P,O,1)|0;a[w+92|0]=2;if((a[u+112|0]&1)!=0){a[w+100|0]=1}c[w+88>>2]=z;N=g;break};case 4:{v=26;break a;break};case 8:{z=c[53692]|0;w=jk(64)|0;u=z+4|0;O=c[u>>2]|0;if(O>>>0<(c[z+8>>2]|0)>>>0){R=O}else{Jv(z,1)|0;R=c[u>>2]|0}a[R]=0;O=c[z>>2]|0;c[u>>2]=O;c[w+8>>2]=Lb(O|0)|0;c[w+12>>2]=c[c[53690]>>2];O=c[53696]|0;Hc[c[O>>2]&63](O,w,1)|0;N=g;break};case 3:{w=c[s-4>>2]|0;O=jk(8)|0;a[O+4|0]=1;c[O>>2]=w;c[53700]=O;N=g;break};case 48:{O=c[(c[53698]|0)+84>>2]|0;N=Hc[c[O>>2]&63](O,0,256)|0;break};case 59:{N=c[s-8>>2]|0;break};case 20:{O=c[53690]|0;w=c[O+4>>2]|0;eF(O);c[53690]=w;N=g;break};case 29:{kj(c[s>>2]|0);N=g;break};case 30:{w=c[53690]|0;O=c[w+4>>2]|0;eF(w);c[53690]=O;N=g;break};case 31:{N=c[s-4>>2]|0;break};case 60:{N=c[s-4>>2]|0;break};case 61:{N=c[s>>2]|0;break};case 35:{O=c[53692]|0;w=c[O+4>>2]|0;if(w>>>0<(c[O+8>>2]|0)>>>0){S=O;T=w}else{Jv(O,1)|0;O=c[53692]|0;S=O;T=c[O+4>>2]|0}c[S+4>>2]=T+1;a[T]=0;O=c[53692]|0;w=c[O>>2]|0;c[O+4>>2]=w;O=w;while(1){w=a[O]|0;if(w<<24>>24==0){break}if(w<<24>>24==32){O=O+1|0}else{v=53;break a}}O=s;c[(c[O>>2]|0)+80>>2]=c[53698];w=$g(11880,c[43328]|0)|0;c[(c[O>>2]|0)+84>>2]=w;c[53698]=c[O>>2];c[(c[O>>2]|0)+108>>2]=c[c[53690]>>2];N=c[O>>2]|0;break};case 36:{O=c[53692]|0;w=c[O+4>>2]|0;if(w>>>0<(c[O+8>>2]|0)>>>0){U=O;V=w}else{Jv(O,1)|0;O=c[53692]|0;U=O;V=c[O+4>>2]|0}c[U+4>>2]=V+1;a[V]=0;O=c[53692]|0;w=c[O>>2]|0;c[O+4>>2]=w;O=w;while(1){w=a[O]|0;if(w<<24>>24==0){break}if(w<<24>>24==32){O=O+1|0}else{v=60;break a}}O=c[53698]|0;c[53698]=c[O+80>>2];N=O;break};case 26:{O=c[53690]|0;w=c[O+4>>2]|0;eF(O);c[53690]=w;N=g;break};case 27:{kj(c[s>>2]|0);N=g;break};case 28:{w=c[53690]|0;O=c[w+4>>2]|0;eF(w);c[53690]=O;N=g;break};case 2:{O=c[s-4>>2]|0;w=jk(8)|0;a[w+4|0]=2;c[w>>2]=O;c[53700]=w;N=g;break};default:{N=g}}w=q+(-y<<1)|0;O=s+(A<<2)|0;c[x>>2]=N;u=(d[22248+F|0]|0)-39|0;z=b[w>>1]|0;P=z+(b[22320+(u<<1)>>1]|0)|0;do{if(P>>>0<228>>>0){if((a[22768+P|0]|0)!=(z|0)){break}G=a[21944+P|0]|0;H=j;I=w;J=O;break b}}while(0);G=a[22616+u|0]|0;H=j;I=w;J=O}}while(0);h=G;j=H;k=p;l=I+2|0;m=r;n=J;o=t}if((v|0)==26){hj();B=p;C=1}else if((v|0)==53){vi(119648);hj();B=p;C=1}else if((v|0)==60){vi(157536);hj();B=p;C=1}else if((v|0)==109){vi(102648);B=k;C=2}if((B|0)==(f|0)){i=e;return C|0}eF(B);i=e;return C|0}function hj(){var a=0,b=0,d=0,e=0;a=c[53698]|0;b=c[53700]|0;if((b|0)!=0){wj(b,1);c[53700]=0}c[17762]=78;if((a|0)!=0){b=a;while(1){a=c[b+80>>2]|0;Vg(c[b+84>>2]|0)|0;uj(b|0);eF(b);if((a|0)==0){break}else{b=a}}}c[17762]=90;c[6396]=94;b=c[53696]|0;Hc[c[b>>2]&63](b,0,64)|0;c[6396]=90;c[6406]=30;b=c[53694]|0;Hc[c[b>>2]&63](b,0,64)|0;c[6406]=90;b=c[53690]|0;a=c[b+4>>2]|0;if((a|0)==0){return}else{d=b;e=a}while(1){eF(d);a=c[e+4>>2]|0;if((a|0)==0){break}else{d=e;e=a}}return}function ij(){var a=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a=c[53694]|0;d=jk(40)|0;e=d;if((bh(c[53696]|0)|0)!=0){jj(0)}f=bh(a)|0;b[d+4>>1]=f;if((f|0)==0){g=a|0;h=c[g>>2]|0;i=Hc[h&63](a,0,64)|0;return e|0}j=d;c[j>>2]=jk(f*24|0)|0;f=a|0;d=Hc[c[f>>2]&63](a,0,128)|0;if((d|0)==0){g=f;h=c[g>>2]|0;i=Hc[h&63](a,0,64)|0;return e|0}else{k=d;l=0}while(1){d=k+8|0;m=(c[j>>2]|0)+(l*24|0)|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];c[m+16>>2]=c[d+16>>2];c[m+20>>2]=c[d+20>>2];d=Hc[c[f>>2]&63](a,k,8)|0;if((d|0)==0){g=f;break}else{k=d;l=l+1|0}}h=c[g>>2]|0;i=Hc[h&63](a,0,64)|0;return e|0}function jj(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=jk(32)|0;f=c[53696]|0;g=bh(f)|0;h=e+8|0;a[e+14|0]=d;do{if((g|0)==0){d=h;c[d>>2]=jk(56)|0;b[e+12>>1]=1;i=Lb(213312)|0;c[c[d>>2]>>2]=i;c[(c[d>>2]|0)+4>>2]=c[c[53690]>>2]}else{b[e+12>>1]=g;d=h;c[d>>2]=jk(g*56|0)|0;i=Zg(f)|0;if((i|0)==0){break}else{j=i;k=0}while(1){i=(c[d>>2]|0)+(k*56|0)|0;l=j+8|0;c[i>>2]=c[l>>2];c[i+4>>2]=c[l+4>>2];c[i+8>>2]=c[l+8>>2];c[i+12>>2]=c[l+12>>2];c[i+16>>2]=c[l+16>>2];c[i+20>>2]=c[l+20>>2];c[i+24>>2]=c[l+24>>2];c[i+28>>2]=c[l+28>>2];c[i+32>>2]=c[l+32>>2];c[i+36>>2]=c[l+36>>2];c[i+40>>2]=c[l+40>>2];c[i+44>>2]=c[l+44>>2];c[i+48>>2]=c[l+48>>2];c[i+52>>2]=c[l+52>>2];l=c[j>>2]|0;if((l|0)==0){break}else{j=l;k=k+1|0}}}}while(0);Hc[c[f>>2]&63](f,0,64)|0;f=c[53694]|0;Hc[c[f>>2]&63](f,e,1)|0;return}function kj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0.0;b=i;i=i+32|0;d=b|0;e=jk(8)|0;f=e;g=c[c[53690]>>2]|0;j=d;k=a;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];c[j+16>>2]=c[k+16>>2];c[j+20>>2]=c[k+20>>2];c[j+24>>2]=c[k+24>>2];c[j+28>>2]=c[k+28>>2];do{if((g|0)!=0){k=d+4|0;do{if((c[k>>2]|0)==0){a=c[g+4>>2]|0;if((a|0)==0){break}c[k>>2]=a}}while(0);k=d+16|0;do{if(+h[k>>3]<0.0){l=+h[g+16>>3];if(l<0.0){break}h[k>>3]=l}}while(0);k=d|0;do{if((c[k>>2]|0)==0){a=c[g>>2]|0;if((a|0)==0){break}c[k>>2]=a}}while(0);k=c[g+24>>2]&127;if((k|0)==0){break}a=d+24|0;c[a>>2]=c[a>>2]|k}}while(0);d=c[(c[53688]|0)+144>>2]|0;c[e>>2]=Hc[c[d>>2]&63](d,j,1)|0;c[e+4>>2]=c[53690];c[53690]=f;i=b;return}function lj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+152|0;f=e+128|0;g=e+144|0;c[g>>2]=0;c[g+4>>2]=0;c[53690]=g;c[53698]=0;c[53700]=0;c[53688]=c[(c[(c[d+52>>2]|0)+8>>2]|0)+136>>2];c[53696]=$g(25568,c[43328]|0)|0;c[53694]=$g(25608,c[43328]|0)|0;Iv(f,128,e|0);c[53692]=f;if((xi(a,f,d)|0)==0){gj()|0;c[b>>2]=Bi()|0;h=c[53700]|0}else{c[b>>2]=2;h=0}Vg(c[53696]|0)|0;Vg(c[53694]|0)|0;c[53696]=0;c[53694]=0;c[53690]=0;Mv(f);i=e;return h|0}function mj(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function nj(a,b,d){a=a|0;b=b|0;d=d|0;Vg(c[b+8>>2]|0)|0;eF(b);return}function oj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;e=c[d+8>>2]|0;b=e+88|0;f=a[e+92|0]|0;if((f<<24>>24|0)==2){vj(c[b>>2]|0)}else if((f<<24>>24|0)==1){f=c[b>>2]|0;Vg(c[f+84>>2]|0)|0;uj(f|0);eF(f)}uj(e|0);eF(e);eF(d);return}function pj(a,b,d){a=a|0;b=b|0;d=d|0;d=c[b+8>>2]|0;if((d|0)!=0){eF(d)}eF(b);return}function qj(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;e=d+12|0;a=b[e>>1]|0;if(a<<16>>16==0){f=d;eF(f);return}g=d+8|0;if(a<<16>>16>0){h=c[g>>2]|0;i=0;j=a;while(1){a=c[h>>2]|0;if((a|0)==0){k=j}else{eF(a);k=b[e>>1]|0}a=i+1|0;if((a|0)<(k<<16>>16|0)){h=h+56|0;i=a;j=k}else{break}}}eF(c[g>>2]|0);f=d;eF(f);return}function rj(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;g=i;i=i+72|0;j=g|0;k=Fh(d)|0;l=c[k>>2]|0;m=c[l+4>>2]|0;c[k+4>>2]=m;c[k+12>>2]=c[l+12>>2];if((m|0)==1){c[k+8>>2]=c[l+8>>2]}else if((m|0)==0){c[k+8>>2]=c[l+8>>2]}else if((m|0)==2){c[k+8>>2]=c[l+8>>2]}else if((m|0)==3){c[k+8>>2]=c[l+8>>2]}c[k+208>>2]=c[l+208>>2];c[k+228>>2]=c[l+228>>2];c[k+244>>2]=c[l+244>>2];m=k+260|0;b[m>>1]=b[m>>1]&-2|b[l+260>>1]&1;n=+h[f+56>>3];o=+h[f+64>>3];l=a[f+80|0]|0;if((l|0)==98){p=+h[f+48>>3];m=a[e+4|0]|0;if((m|0)==3){k=c[e>>2]|0;q=+h[k+24>>3]- +h[k+8>>3]}else if((m|0)==1){k=c[e>>2]|0;q=+h[k+72>>3]- +h[k+56>>3]}else if((m|0)==2){m=c[e>>2]|0;q=+h[m+32>>3]- +h[m+16>>3]}else{q=0.0}r=o-(p-q)*.5+-1.0}else if((l|0)==116){q=+h[f+48>>3];l=a[e+4|0]|0;if((l|0)==1){m=c[e>>2]|0;s=+h[m+72>>3]- +h[m+56>>3]}else if((l|0)==3){m=c[e>>2]|0;s=+h[m+24>>3]- +h[m+8>>3]}else if((l|0)==2){l=c[e>>2]|0;s=+h[l+32>>3]- +h[l+16>>3]}else{s=0.0}r=o+(q-s)*.5+-1.0}else{r=o}h[j>>3]=n;h[j+8>>3]=r;c[j+20>>2]=c[f+8>>2];c[j+16>>2]=c[f+4>>2];h[j+32>>3]=+h[f+16>>3];f=d+16|0;l=ew(c[(c[f>>2]|0)+8>>2]|0,119632)|0;m=j+56|0;c[m>>2]=l;k=j+60|0;c[k>>2]=c[(c[f>>2]|0)+212>>2];t=j+64|0;a[t]=0;if((l|0)==0){u=19}else{if((a[l]|0)==0){u=19}}if((u|0)==19){c[m>>2]=157520}if((a[e+4|0]|0)==1){m=c[e>>2]|0;pB(d,c[(c[d>>2]|0)+336>>2]|0);u=c[m+24>>2]|0;if((u|0)==0){lB(d,127648)}else{lB(d,u)}sj(d,m,j)}else{tj(d,c[e>>2]|0,j)}if((a[t]|0)==0){v=c[f>>2]|0;w=v+208|0;c[w>>2]=0;x=v+228|0;c[x>>2]=0;y=v+244|0;c[y>>2]=0;z=v+212|0;c[z>>2]=0;Gh(d);i=g;return}eF(c[k>>2]|0);v=c[f>>2]|0;w=v+208|0;c[w>>2]=0;x=v+228|0;c[x>>2]=0;y=v+244|0;c[y>>2]=0;z=v+212|0;c[z>>2]=0;Gh(d);i=g;return}function sj(f,g,j){f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0.0,Ea=0.0,Fa=0.0,Ga=0.0,Ha=0,Ia=0,Ja=0.0,Ka=0,La=0,Ma=0.0,Na=0,Oa=0,Pa=0.0,Qa=0;k=i;i=i+480|0;l=k|0;m=k+64|0;n=k+96|0;o=k+136|0;p=k+168|0;q=k+232|0;r=k+240|0;s=k+272|0;t=k+304|0;u=k+336|0;v=k+368|0;w=k+408|0;x=k+472|0;y=g|0;z=u;A=g+48|0;c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];c[z+16>>2]=c[A+16>>2];c[z+20>>2]=c[A+20>>2];c[z+24>>2]=c[A+24>>2];c[z+28>>2]=c[A+28>>2];A=j|0;B=+h[A>>3];C=j+8|0;D=+h[C>>3];E=g+84|0;F=c[E>>2]|0;if((c[g>>2]|0)==0){G=(c[g+8>>2]|0)!=0}else{G=1}H=g+108|0;I=c[H>>2]|0;do{if((I|0)!=0){J=j+16|0;K=c[J>>2]|0;do{if((K|0)!=0){L=I|0;if((c[L>>2]|0)==0){c[45156]=0;break}else{c[45156]=K;c[J>>2]=c[L>>2];break}}}while(0);J=j+20|0;K=c[J>>2]|0;do{if((K|0)!=0){L=I+4|0;if((c[L>>2]|0)==0){c[45157]=0;break}else{c[45157]=K;c[J>>2]=c[L>>2];break}}}while(0);J=j+32|0;M=+h[J>>3];if(M<0.0){break}K=I+16|0;if(+h[K>>3]<0.0){h[22580]=-1.0;break}else{h[22580]=M;h[J>>3]=+h[K>>3];break}}}while(0);I=u|0;h[I>>3]=B+ +h[I>>3];I=u+16|0;h[I>>3]=B+ +h[I>>3];I=u+8|0;h[I>>3]=D+ +h[I>>3];I=u+24|0;h[I>>3]=D+ +h[I>>3];do{if(G){if((c[f+152>>2]&4|0)!=0){N=0;break}N=Kj(f,j,y,u,v,1)|0}else{N=0}}while(0);I=g+42|0;K=e[I>>1]|0;do{if((K&32|0)==0){J=c[g+20>>2]|0;if((J|0)!=0){L=x|0;O=Lj(f,J,c[g+28>>2]|0,K,L)|0;if((b[I>>1]&4)==0){sB(f,u,O)}else{J=a[g+33|0]|0;P=t;c[P>>2]=c[z>>2];c[P+4>>2]=c[z+4>>2];c[P+8>>2]=c[z+8>>2];c[P+12>>2]=c[z+12>>2];c[P+16>>2]=c[z+16>>2];c[P+20>>2]=c[z+20>>2];c[P+24>>2]=c[z+24>>2];c[P+28>>2]=c[z+28>>2];P=w;c[P>>2]=c[z>>2];c[P+4>>2]=c[z+4>>2];c[P+8>>2]=c[z+8>>2];c[P+12>>2]=c[z+12>>2];P=w+32|0;Q=P;R=t+16|0;c[Q>>2]=c[R>>2];c[Q+4>>2]=c[R+4>>2];c[Q+8>>2]=c[R+8>>2];c[Q+12>>2]=c[R+12>>2];if((J&255)>>>0>1>>>0){D=+(J&255|0)*.5;J=w|0;B=D+ +h[J>>3];h[J>>3]=B;J=w+8|0;M=D+ +h[J>>3];h[J>>3]=M;J=P|0;S=+h[J>>3]-D;h[J>>3]=S;J=w+40|0;T=+h[J>>3]-D;h[J>>3]=T;U=S;V=M;W=B;X=T}else{U=+h[P>>3];V=+h[w+8>>3];W=+h[w>>3];X=+h[w+40>>3]}h[w+16>>3]=U;h[w+24>>3]=V;h[w+48>>3]=W;h[w+56>>3]=X;ol(f,w|0,4,4,O)}eF(c[L>>2]|0)}L=c[F>>2]|0;if((L|0)!=0){O=m;P=o;J=p;R=o|0;Q=o+16|0;Y=o+8|0;Z=o+24|0;_=f+152|0;$=l|0;aa=l+8|0;ba=l+32|0;ca=l+40|0;da=l+16|0;ea=l|0;fa=l+24|0;ga=l+48|0;ha=l+56|0;ia=j+56|0;ja=q|0;ka=p|0;la=p+32|0;ma=la;na=m+16|0;oa=p|0;pa=p+8|0;qa=la|0;la=p+40|0;ra=p+16|0;sa=p+24|0;ta=p+48|0;ua=p+56|0;va=F;wa=L;do{L=wa|0;xa=wa+48|0;c[P>>2]=c[xa>>2];c[P+4>>2]=c[xa+4>>2];c[P+8>>2]=c[xa+8>>2];c[P+12>>2]=c[xa+12>>2];c[P+16>>2]=c[xa+16>>2];c[P+20>>2]=c[xa+20>>2];c[P+24>>2]=c[xa+24>>2];c[P+28>>2]=c[xa+28>>2];T=+h[A>>3];B=+h[C>>3];if((c[wa>>2]|0)==0){ya=(c[wa+8>>2]|0)!=0}else{ya=1}h[R>>3]=T+ +h[R>>3];h[Q>>3]=T+ +h[Q>>3];h[Y>>3]=B+ +h[Y>>3];h[Z>>3]=B+ +h[Z>>3];do{if(ya){if((c[_>>2]&4|0)!=0){za=0;break}za=Kj(f,j,L,o,n,1)|0}else{za=0}}while(0);xa=wa+42|0;Aa=e[xa>>1]|0;do{if((Aa&32|0)==0){Ba=c[wa+20>>2]|0;if((Ba|0)!=0){Ca=Lj(f,Ba,c[wa+28>>2]|0,Aa,ja)|0;if((b[xa>>1]&4)==0){sB(f,o,Ca)}else{Ba=a[wa+33|0]|0;c[O>>2]=c[P>>2];c[O+4>>2]=c[P+4>>2];c[O+8>>2]=c[P+8>>2];c[O+12>>2]=c[P+12>>2];c[O+16>>2]=c[P+16>>2];c[O+20>>2]=c[P+20>>2];c[O+24>>2]=c[P+24>>2];c[O+28>>2]=c[P+28>>2];c[J>>2]=c[P>>2];c[J+4>>2]=c[P+4>>2];c[J+8>>2]=c[P+8>>2];c[J+12>>2]=c[P+12>>2];c[ma>>2]=c[na>>2];c[ma+4>>2]=c[na+4>>2];c[ma+8>>2]=c[na+8>>2];c[ma+12>>2]=c[na+12>>2];if((Ba&255)>>>0>1>>>0){B=+(Ba&255|0)*.5;T=B+ +h[oa>>3];h[oa>>3]=T;M=B+ +h[pa>>3];h[pa>>3]=M;S=+h[qa>>3]-B;h[qa>>3]=S;D=+h[la>>3]-B;h[la>>3]=D;Da=S;Ea=M;Fa=T;Ga=D}else{Da=+h[qa>>3];Ea=+h[pa>>3];Fa=+h[oa>>3];Ga=+h[la>>3]}h[ra>>3]=Da;h[sa>>3]=Ea;h[ta>>3]=Fa;h[ua>>3]=Ga;ol(f,ka,4,4,Ca)}eF(c[ja>>2]|0)}if((a[wa+33|0]|0)!=0){Mj(f,L,o)}Ca=wa+88|0;Ba=a[wa+92|0]|0;if((Ba<<24>>24|0)==1){sj(f,c[Ca>>2]|0,j);break}else if((Ba<<24>>24|0)==3){Ba=c[Ca>>2]|0;D=+h[A>>3];T=+h[Ba>>3]+D;M=+h[C>>3];S=+h[Ba+8>>3]+M;B=+h[Ba+16>>3]+D;D=+h[Ba+24>>3]+M;h[$>>3]=B;h[aa>>3]=D;h[ba>>3]=T;h[ca>>3]=S;h[da>>3]=T;h[fa>>3]=D;h[ga>>3]=B;h[ha>>3]=S;Ha=c[Ba+36>>2]|0;if((Ha|0)==0){Ia=c[ia>>2]|0}else{Ia=Ha}wB(f,c[Ba+32>>2]|0,ea,4,1,Ia);break}else{tj(f,c[Ca>>2]|0,j);break}}}while(0);if((za|0)!=0){Nj(f,n,1)}do{if(ya){if((c[_>>2]&4|0)==0){break}if((Kj(f,j,L,o,n,0)|0)==0){break}Nj(f,n,0)}}while(0);va=va+4|0;wa=c[va>>2]|0;}while((wa|0)!=0)}wa=c[E>>2]|0;xB(f,1.0);va=c[wa>>2]|0;if((va|0)!=0){_=g+24|0;ea=r|0;ia=r+8|0;ha=r+16|0;ga=r+24|0;fa=s|0;da=s+8|0;ca=s+16|0;ba=s+24|0;aa=wa;wa=va;do{aa=aa+4|0;va=wa+100|0;do{if((a[va]|0)!=0){$=c[_>>2]|0;ja=c[aa>>2]|0;S=+h[A>>3];B=+h[C>>3];ka=($|0)==0?127648:$;nB(f,ka);lB(f,ka);D=S+ +h[wa+48>>3];T=S+ +h[wa+64>>3];M=B+ +h[wa+56>>3];Ja=B+ +h[wa+72>>3];ka=a[va]|0;do{if((ka&1)==0){Ka=ka}else{$=c[wa+96>>2]|0;if(((e[wa+80>>1]|0)+(e[wa+84>>1]|0)|0)>=(c[$+104>>2]|0)){Ka=ka;break}ua=b[wa+86>>1]|0;do{if(ua<<16>>16==0){ta=a[$+32|0]|0;sa=(ta<<24>>24|0)/2|0;La=sa+(d[$+33|0]|0)&255;Ma=M- +(sa|0);Na=ta}else{if(((e[wa+82>>1]|0)+(ua&65535)|0)==(c[$+100>>2]|0)){ta=a[$+32|0]|0;sa=(ta<<24>>24|0)/2|0;ra=sa+(d[$+33|0]|0)|0;La=ra&255;Ma=M- +(sa|0)- +(ra&255|0);Na=ta;break}else{ta=a[$+32|0]|0;La=0;Ma=M- +((ta<<24>>24|0)/2|0|0);Na=ta;break}}}while(0);B=T+ +((Na<<24>>24|0)/2|0|0);h[fa>>3]=B;h[da>>3]=Ma;h[ca>>3]=B+0.0;h[ba>>3]=Ma+(+(Na<<24>>24|0)+(Ja+ +(La&255|0)-M));sB(f,s,1);Ka=a[va]|0}}while(0);if((Ka&2)==0){break}ka=b[wa+86>>1]|0;$=c[wa+96>>2]|0;if(((e[wa+82>>1]|0)+(ka&65535)|0)>=(c[$+100>>2]|0)){break}ua=b[wa+84>>1]|0;do{if(ua<<16>>16==0){ta=a[$+32|0]|0;ra=(ta<<24>>24|0)/2|0;sa=ra+(d[$+33|0]|0)|0;la=sa&255;oa=sa&255;Ja=+(ra|0);B=D- +(oa|0)-Ja;if((e[wa+80>>1]|0)==(c[$+104>>2]|0)){Oa=oa<<1&255;Pa=B;Qa=ta;break}if((ja|0)==0){Oa=la;Pa=B;Qa=ta;break}if((b[ja+86>>1]|0)==ka<<16>>16){Oa=la;Pa=B;Qa=ta;break}Oa=~~(+((la&255)>>>0)+(S+ +h[$+64>>3]-(T+Ja)));Pa=B;Qa=ta}else{if(((e[wa+80>>1]|0)+(ua&65535)|0)==(c[$+104>>2]|0)){ta=a[$+32|0]|0;la=(ta<<24>>24|0)/2|0;Oa=la+(d[$+33|0]|0)&255;Pa=D- +(la|0);Qa=ta;break}ta=a[$+32|0]|0;B=+((ta<<24>>24|0)/2|0|0);Ja=D-B;if((ja|0)==0){Oa=0;Pa=Ja;Qa=ta;break}if((b[ja+86>>1]|0)==ka<<16>>16){Oa=0;Pa=Ja;Qa=ta;break}Oa=~~(S+ +h[$+64>>3]-(T+B)+0.0);Pa=Ja;Qa=ta}}while(0);S=M- +((Qa<<24>>24|0)/2|0|0);h[ea>>3]=Pa;h[ia>>3]=S;h[ha>>3]=Pa+(+(Qa<<24>>24|0)+(T+ +(Oa&255|0)-D));h[ga>>3]=S+0.0;sB(f,r,1);}}while(0);wa=c[aa>>2]|0;}while((wa|0)!=0)}if((a[g+33|0]|0)==0){break}Mj(f,y,u)}}while(0);if((N|0)!=0){Nj(f,v,1)}do{if(G){if((c[f+152>>2]&4|0)==0){break}if((Kj(f,j,y,u,v,0)|0)==0){break}Nj(f,v,0)}}while(0);if((c[H>>2]|0)==0){i=k;return}H=c[45156]|0;if((H|0)!=0){c[j+16>>2]=H}H=c[45157]|0;if((H|0)!=0){c[j+20>>2]=H}Pa=+h[22580];if(Pa<0.0){i=k;return}h[j+32>>3]=Pa;i=k;return}function tj(e,f,g){e=e|0;f=f|0;g=g|0;var j=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,Z=0,_=0,$=0,aa=0,ba=0.0,ca=0,da=0,ea=0,fa=0;j=i;i=i+104|0;l=j|0;m=j+56|0;n=j+88|0;o=b[f+4>>1]|0;if(o<<16>>16<1){i=j;return}p=+h[f+24>>3];q=+h[f+8>>3];r=(p-q)*.5;s=+h[g>>3]+(p+q)*.5;q=+h[f+32>>3];p=+h[f+16>>3];t=+h[g+8>>3]+(q+p)*.5;u=o<<16>>16;o=c[f>>2]|0;v=a[f+6|0]|0;f=g+16|0;w=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=g+20|0;x=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=g+32|0;y=(c[k>>2]=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24,c[k+4>>2]=d[f+4|0]|d[f+5|0]<<8|d[f+6|0]<<16|d[f+7|0]<<24,+h[k>>3]);f=n;c[f>>2]=0;c[f+4>>2]=0;z=s-r;A=r+s;f=n+8|0;h[f>>3]=t+(q-p)*.5;iB(e,1);g=m+16|0;B=m|0;C=m+4|0;D=m+24|0;E=l|0;F=l+4|0;G=l+16|0;H=v<<24>>24==0;v=l+24|0;I=l+8|0;J=l+32|0;K=l+40|0;L=l+48|0;M=n|0;N=m+8|0;O=0;do{P=a[o+(O*24|0)+6|0]|0;if((P|0)==114){Q=A- +h[o+(O*24|0)+8>>3]}else if((P|0)==108){Q=z}else{Q=s- +h[o+(O*24|0)+8>>3]*.5}P=o+(O*24|0)+16|0;h[f>>3]=+h[f>>3]- +h[P>>3];R=c[o+(O*24|0)>>2]|0;S=o+(O*24|0)+4|0;if((b[S>>1]|0)>0){if(H){p=Q;T=0;U=R;while(1){V=U+4|0;W=c[V>>2]|0;if((W|0)==0){X=10}else{q=+h[W+16>>3];if(q>0.0){Y=q}else{X=10}}if((X|0)==10){X=0;Y=y}h[g>>3]=Y;W=c[V>>2]|0;if((W|0)==0){X=13}else{Z=c[W>>2]|0;if((Z|0)==0){X=13}else{_=Z}}if((X|0)==13){X=0;_=w}c[B>>2]=_;Z=c[V>>2]|0;if((Z|0)==0){X=16}else{W=c[Z+4>>2]|0;if((W|0)==0){X=16}else{$=W}}if((X|0)==16){X=0;$=x}c[C>>2]=$;W=c[V>>2]|0;do{if((W|0)==0){X=20}else{Z=c[W+24>>2]<<25>>25;if((Z|0)==0){X=20;break}aa=c[D>>2]&-128|Z&127}}while(0);if((X|0)==20){X=0;aa=c[D>>2]&-128}c[D>>2]=aa;lB(e,$);c[E>>2]=c[U>>2];c[F>>2]=m;h[G>>3]=+h[U+16>>3];h[v>>3]=1.0;c[N>>2]=c[(c[V>>2]|0)+8>>2];c[I>>2]=c[U+8>>2];W=U+32|0;h[J>>3]=+h[W>>3];h[K>>3]=+h[P>>3];a[L]=108;h[M>>3]=p;kB(e,n,l);Z=T+1|0;if((Z|0)<(b[S>>1]|0)){p=p+ +h[W>>3];T=Z;U=U+56|0}else{break}}}else{p=Q;U=0;T=R;while(1){Z=T+4|0;W=c[Z>>2]|0;if((W|0)==0){X=24}else{q=+h[W+16>>3];if(q>0.0){ba=q}else{X=24}}if((X|0)==24){X=0;ba=y}h[g>>3]=ba;W=c[Z>>2]|0;if((W|0)==0){X=27}else{ca=c[W>>2]|0;if((ca|0)==0){X=27}else{da=ca}}if((X|0)==27){X=0;da=w}c[B>>2]=da;ca=c[Z>>2]|0;if((ca|0)==0){X=30}else{W=c[ca+4>>2]|0;if((W|0)==0){X=30}else{ea=W}}if((X|0)==30){X=0;ea=x}c[C>>2]=ea;W=c[Z>>2]|0;do{if((W|0)==0){X=34}else{ca=c[W+24>>2]<<25>>25;if((ca|0)==0){X=34;break}fa=c[D>>2]&-128|ca&127}}while(0);if((X|0)==34){X=0;fa=c[D>>2]&-128}c[D>>2]=fa;lB(e,ea);c[E>>2]=c[T>>2];c[F>>2]=m;h[G>>3]=+h[T+16>>3];h[v>>3]=+h[T+24>>3];c[N>>2]=c[(c[Z>>2]|0)+8>>2];c[I>>2]=c[T+8>>2];W=T+32|0;h[J>>3]=+h[W>>3];h[K>>3]=+h[P>>3];a[L]=108;h[M>>3]=p;kB(e,n,l);V=U+1|0;if((V|0)<(b[S>>1]|0)){p=p+ +h[W>>3];U=V;T=T+56|0}else{break}}}}O=O+1|0;}while((O|0)<(u|0));jB(e);i=j;return}function uj(a){a=a|0;eF(c[a>>2]|0);eF(c[a+4>>2]|0);eF(c[a+8>>2]|0);eF(c[a+16>>2]|0);eF(c[a+12>>2]|0);eF(c[a+20>>2]|0);eF(c[a+24>>2]|0);return}function vj(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((a|0)==0){return}d=a|0;e=a+4|0;f=b[e>>1]|0;if(f<<16>>16>0){g=c[d>>2]|0;h=0;i=f;while(1){f=g+4|0;if((b[f>>1]|0)>0){j=c[g>>2]|0;k=0;while(1){l=c[j>>2]|0;if((l|0)!=0){eF(l)}l=c[j+8>>2]|0;do{if((l|0)!=0){m=c[j+12>>2]|0;if((m|0)==0){break}Cc[m&255](l)}}while(0);l=k+1|0;if((l|0)<(b[f>>1]|0)){j=j+56|0;k=l}else{break}}n=b[e>>1]|0}else{n=i}k=h+1|0;if((k|0)<(n<<16>>16|0)){g=g+24|0;h=k;i=n}else{break}}}n=c[d>>2]|0;if((n|0)!=0){eF(n)}eF(a);return}function wj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=a[b+4|0]|0;if((e<<24>>24|0)==1){f=c[b>>2]|0;g=f+84|0;h=c[g>>2]|0;if((c[f+100>>2]|0)==-1){Vg(h)|0}else{eF(c[f+92>>2]|0);eF(c[f+96>>2]|0);i=c[h>>2]|0;if((i|0)!=0){j=h;h=i;do{wj(h+88|0,0);eF(c[h>>2]|0);eF(c[h+4>>2]|0);eF(c[h+8>>2]|0);eF(c[h+16>>2]|0);eF(c[h+12>>2]|0);eF(c[h+20>>2]|0);eF(c[h+24>>2]|0);eF(h);j=j+4|0;h=c[j>>2]|0;}while((h|0)!=0)}eF(c[g>>2]|0)}eF(c[f>>2]|0);eF(c[f+4>>2]|0);eF(c[f+8>>2]|0);eF(c[f+16>>2]|0);eF(c[f+12>>2]|0);eF(c[f+20>>2]|0);eF(c[f+24>>2]|0);eF(f)}else if((e<<24>>24|0)==3){e=c[b>>2]|0;eF(c[e+32>>2]|0);eF(e)}else{vj(c[b>>2]|0)}if((d|0)==0){return}eF(b);return}function xj(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0;g=c[(c[(c[b+8>>2]|0)+104>>2]|0)+72>>2]|0;if((a[g+4|0]|0)==2){h=0;return h|0}b=yj(c[g>>2]|0,e)|0;if((b|0)==0){h=0;return h|0}c[f>>2]=d[b+35|0]|0;h=b+48|0;return h|0}function yj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[b+4>>2]|0;do{if((e|0)!=0){if((pm(e,d)|0)==0){f=b|0}else{break}return f|0}}while(0);e=c[b+84>>2]|0;b=c[e>>2]|0;if((b|0)==0){f=0;return f|0}else{g=e;h=b}while(1){b=g+4|0;e=c[h+4>>2]|0;if((e|0)==0){i=6}else{if((pm(e,d)|0)==0){j=h|0;i=8}else{i=6}}do{if((i|0)==6){i=0;if((a[h+92|0]|0)!=1){break}j=yj(c[h+88>>2]|0,d)|0;i=8}}while(0);if((i|0)==8){i=0;if((j|0)!=0){f=j;i=10;break}}e=c[b>>2]|0;if((e|0)==0){f=0;i=10;break}else{g=b;h=e}}if((i|0)==10){return f|0}return 0}function zj(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0}function Aj(d){d=d|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0;f=d+92|0;c[f>>2]=jk((c[d+100>>2]<<2)+4|0)|0;g=d+96|0;c[g>>2]=jk((c[d+104>>2]<<2)+4|0)|0;i=c[d+84>>2]|0;j=c[i>>2]|0;if((j|0)==0){return}k=d+32|0;d=i;i=j;do{j=i+82|0;l=b[j>>1]|0;m=l&65535;n=+h[i+72>>3];if(l<<16>>16==1){o=~~n}else{p=~~((n- +(da((a[k]|0)-1|0,m-1|0)|0))/+(m|0));o=(p|0)>1?p:1}p=i+80|0;m=b[p>>1]|0;q=m&65535;n=+h[i+64>>3];if(m<<16>>16==1){r=~~n}else{s=~~((n- +(da((a[k]|0)-1|0,q-1|0)|0))/+(q|0));r=(s|0)>1?s:1}s=i+86|0;if(l<<16>>16==0){t=m}else{m=e[s>>1]|0;do{l=(c[f>>2]|0)+(m<<2)|0;q=c[l>>2]|0;c[l>>2]=(q|0)>(o|0)?q:o;m=m+1|0;}while((m|0)<((e[j>>1]|0)+(e[s>>1]|0)|0));t=b[p>>1]|0}s=i+84|0;if(t<<16>>16!=0){j=e[s>>1]|0;do{m=(c[g>>2]|0)+(j<<2)|0;q=c[m>>2]|0;c[m>>2]=(q|0)>(r|0)?q:r;j=j+1|0;}while((j|0)<((e[p>>1]|0)+(e[s>>1]|0)|0))}d=d+4|0;i=c[d>>2]|0;}while((i|0)!=0);return}function Bj(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;g=i;j=a+104|0;k=a+100|0;if((c[j>>2]|0)>=0){l=f+8|0;m=0;n=0;while(1){if(n>>>0<21>>>0){o=c[17880+(n<<2)>>2]|0}else{nb(177168,115352,(p=i,i=i+8|0,c[p>>2]=n,p)|0)|0;i=p;o=177168}q=Ax(f,o,1)|0;Wx(q|0,108248,304,1)|0;r=q+8|0;c[(c[r>>2]|0)+176>>2]=0;s=jk((c[k>>2]<<2)+4|0)|0;c[(c[r>>2]|0)+172>>2]=s;c[(c[r>>2]|0)+184>>2]=0;s=jk((c[k>>2]<<2)+4|0)|0;c[(c[r>>2]|0)+180>>2]=s;if((m|0)==0){c[(c[l>>2]|0)+180>>2]=q}else{c[(c[m+8>>2]|0)+164>>2]=q}if((n|0)<(c[j>>2]|0)){m=q;n=n+1|0}else{break}}}if((c[k>>2]|0)>=0){n=d+8|0;m=0;l=0;while(1){if(l>>>0<21>>>0){t=c[17880+(l<<2)>>2]|0}else{nb(177168,115352,(p=i,i=i+8|0,c[p>>2]=l,p)|0)|0;i=p;t=177168}o=Ax(d,t,1)|0;Wx(o|0,108248,304,1)|0;q=o+8|0;c[(c[q>>2]|0)+176>>2]=0;s=jk((c[j>>2]<<2)+4|0)|0;c[(c[q>>2]|0)+172>>2]=s;c[(c[q>>2]|0)+184>>2]=0;s=jk((c[j>>2]<<2)+4|0)|0;c[(c[q>>2]|0)+180>>2]=s;if((m|0)==0){c[(c[n>>2]|0)+180>>2]=o}else{c[(c[m+8>>2]|0)+164>>2]=o}if((l|0)<(c[k>>2]|0)){m=o;l=l+1|0}else{break}}}l=c[a+84>>2]|0;a=c[l>>2]|0;if((a|0)==0){Dj(f);Dj(d);i=g;return}else{u=l;v=a}do{a=v+84|0;l=b[a>>1]|0;m=l&65535;if((l&65535)>>>0<21>>>0){w=c[17880+(m<<2)>>2]|0}else{nb(177168,115352,(p=i,i=i+8|0,c[p>>2]=m,p)|0)|0;i=p;w=177168}m=Ax(f,w,0)|0;l=(e[v+80>>1]|0)+(e[a>>1]|0)|0;if(l>>>0<21>>>0){x=c[17880+(l<<2)>>2]|0}else{nb(177168,115352,(p=i,i=i+8|0,c[p>>2]=l,p)|0)|0;i=p;x=177168}l=Ax(f,x,0)|0;Cj(f,m,l,~~+h[v+64>>3]);l=v+86|0;m=b[l>>1]|0;a=m&65535;if((m&65535)>>>0<21>>>0){y=c[17880+(a<<2)>>2]|0}else{nb(177168,115352,(p=i,i=i+8|0,c[p>>2]=a,p)|0)|0;i=p;y=177168}a=Ax(d,y,0)|0;m=(e[v+82>>1]|0)+(e[l>>1]|0)|0;if(m>>>0<21>>>0){z=c[17880+(m<<2)>>2]|0}else{nb(177168,115352,(p=i,i=i+8|0,c[p>>2]=m,p)|0)|0;i=p;z=177168}m=Ax(d,z,0)|0;Cj(d,a,m,~~+h[v+72>>3]);u=u+4|0;v=c[u>>2]|0;}while((v|0)!=0);Dj(f);Dj(d);i=g;return}function Cj(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=uw(a,d,e,0,0)|0;if((g|0)!=0){h=(c[g+8>>2]|0)+170|0;g=b[h>>1]|0;b[h>>1]=(g&65535|0)>(f|0)?g:f&65535;return}g=uw(a,d,e,0,1)|0;Wx(g|0,131624,176,1)|0;b[(c[g+8>>2]|0)+170>>1]=f;f=d+8|0;d=(c[f>>2]|0)+180|0;a=c[d>>2]|0;if((a|0)==0){i=kk((c[d+4>>2]<<2)+8|0)|0}else{i=mk(a,(c[d+4>>2]<<2)+8|0)|0}c[(c[f>>2]|0)+180>>2]=i;i=(c[f>>2]|0)+184|0;d=c[i>>2]|0;c[i>>2]=d+1;c[(c[(c[f>>2]|0)+180>>2]|0)+(d<<2)>>2]=g;d=(c[f>>2]|0)+180|0;c[(c[d>>2]|0)+(c[d+4>>2]<<2)>>2]=0;d=e+8|0;e=(c[d>>2]|0)+172|0;f=c[e>>2]|0;if((f|0)==0){j=kk((c[e+4>>2]<<2)+8|0)|0}else{j=mk(f,(c[e+4>>2]<<2)+8|0)|0}c[(c[d>>2]|0)+172>>2]=j;j=(c[d>>2]|0)+176|0;e=c[j>>2]|0;c[j>>2]=e+1;c[(c[(c[d>>2]|0)+172>>2]|0)+(e<<2)>>2]=g;g=(c[d>>2]|0)+172|0;c[(c[g>>2]|0)+(c[g+4>>2]<<2)>>2]=0;return}function Dj(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=c[(c[a+8>>2]|0)+180>>2]|0;e=c[(c[d+8>>2]|0)+164>>2]|0;if((e|0)==0){return}f=d;d=e;while(1){e=d;if((uw(a,f,e,0,0)|0)==0){g=uw(a,f,e,0,1)|0;Wx(g|0,131624,176,1)|0;b[(c[g+8>>2]|0)+170>>1]=0;h=f+8|0;i=(c[h>>2]|0)+180|0;j=c[i>>2]|0;if((j|0)==0){k=kk((c[i+4>>2]<<2)+8|0)|0}else{k=mk(j,(c[i+4>>2]<<2)+8|0)|0}c[(c[h>>2]|0)+180>>2]=k;i=(c[h>>2]|0)+184|0;j=c[i>>2]|0;c[i>>2]=j+1;c[(c[(c[h>>2]|0)+180>>2]|0)+(j<<2)>>2]=g;j=(c[h>>2]|0)+180|0;c[(c[j>>2]|0)+(c[j+4>>2]<<2)>>2]=0;j=d+8|0;h=(c[j>>2]|0)+172|0;i=c[h>>2]|0;if((i|0)==0){l=kk((c[h+4>>2]<<2)+8|0)|0}else{l=mk(i,(c[h+4>>2]<<2)+8|0)|0}c[(c[j>>2]|0)+172>>2]=l;h=(c[j>>2]|0)+176|0;i=c[h>>2]|0;c[h>>2]=i+1;c[(c[(c[j>>2]|0)+172>>2]|0)+(i<<2)>>2]=g;g=(c[j>>2]|0)+172|0;c[(c[g>>2]|0)+(c[g+4>>2]<<2)>>2]=0;m=j}else{m=d+8|0}j=c[(c[m>>2]|0)+164>>2]|0;if((j|0)==0){break}else{f=e;d=j}}return}function Ej(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=i;i=i+8|0;d=b|0;e=d;c[d>>2]=c[43484];d=c[a+100>>2]|0;do{if((d|0)!=1){f=a+104|0;if((c[f>>2]|0)==1){break}g=a+92|0;c[g>>2]=jk((d<<2)+4|0)|0;h=a+96|0;c[h>>2]=jk((c[f>>2]<<2)+4|0)|0;f=Hw(102640,e,0)|0;j=Hw(97e3,e,0)|0;Wx(f|0,91520,272,1)|0;Wx(j|0,91520,272,1)|0;Bj(a,f,j);ok(f,2,2147483647)|0;ok(j,2,2147483647)|0;k=c[(c[(c[(c[f+8>>2]|0)+180>>2]|0)+8>>2]|0)+164>>2]|0;if((k|0)!=0){l=0;m=0;n=k;while(1){k=n+8|0;c[(c[g>>2]|0)+(l<<2)>>2]=(c[(c[k>>2]|0)+232>>2]|0)-m;o=c[k>>2]|0;k=c[o+164>>2]|0;if((k|0)==0){break}else{l=l+1|0;m=c[o+232>>2]|0;n=k}}}n=j+8|0;m=c[(c[n>>2]|0)+180>>2]|0;l=c[(c[m+8>>2]|0)+164>>2]|0;if((l|0)==0){p=m}else{m=0;g=0;k=l;while(1){l=k+8|0;c[(c[h>>2]|0)+(m<<2)>>2]=(c[(c[l>>2]|0)+232>>2]|0)-g;o=c[l>>2]|0;l=c[o+164>>2]|0;if((l|0)==0){break}else{m=m+1|0;g=c[o+232>>2]|0;k=l}}p=c[(c[n>>2]|0)+180>>2]|0}if((p|0)!=0){k=p;do{g=k+8|0;m=c[g>>2]|0;h=c[m+172>>2]|0;if((h|0)==0){q=m}else{eF(h);q=c[g>>2]|0}h=c[q+180>>2]|0;if((h|0)==0){r=q}else{eF(h);r=c[g>>2]|0}k=c[r+164>>2]|0;}while((k|0)!=0)}Kw(f)|0;Kw(j)|0;i=b;return}}while(0);Aj(a);i=b;return}function Fj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0;e=i;i=i+256|0;f=e|0;g=e+8|0;j=e+40|0;k=e+112|0;l=e+128|0;c[j+48>>2]=b;m=Sx(b)|0;if((m|0)==0){n=c[b+48>>2]|0;c[j+52>>2]=n;o=n}else if((m|0)==2){n=Hx(c[((c[b>>2]&3|0)==2?b:b-32|0)+28>>2]|0)|0;c[j+52>>2]=n;o=n}else if((m|0)==1){m=Hx(b)|0;c[j+52>>2]=m;o=m}else{o=c[j+52>>2]|0}m=j+52|0;n=c[o+48>>2]|0;h[j+32>>3]=+h[d+16>>3];c[j+16>>2]=c[d+4>>2];c[j+20>>2]=c[d+8>>2];o=j+40|0;c[o>>2]=c[o>>2]&-128;o=d|0;p=lj(c[o>>2]|0,f,j)|0;if((p|0)==0){Iv(k,128,l|0);a[d+82|0]=0;l=Sx(b)|0;do{if((l|0)==0){Lv(k,$w(b)|0)|0}else if((l|0)==1){Lv(k,$w(b)|0)|0}else if((l|0)==2){q=b;r=b;Lv(k,$w(c[((c[r>>2]&3|0)==3?q:b+32|0)+28>>2]|0)|0)|0;s=b-32|0;Lv(k,$w(c[((c[r>>2]&3|0)==2?q:s)+28>>2]|0)|0)|0;if((Nw(Hx(c[((c[r>>2]&3|0)==2?q:s)+28>>2]|0)|0)|0)==0){Lv(k,133720)|0;break}else{Lv(k,136608)|0;break}}}while(0);l=k+4|0;s=c[l>>2]|0;if(s>>>0<(c[k+8>>2]|0)>>>0){t=s}else{Jv(k,1)|0;t=c[l>>2]|0}a[t]=0;t=c[k>>2]|0;c[l>>2]=t;l=Lb(t|0)|0;c[o>>2]=l;if((c[d+12>>2]|0)==1){u=kn(l)|0}else{u=hn(l,c[m>>2]|0)|0}eF(c[o>>2]|0);c[o>>2]=u;_j(c[(c[n+8>>2]|0)+136>>2]|0,d);Mv(k);v=c[f>>2]|0;i=e;return v|0}k=p+4|0;if((a[k]|0)==1){u=p|0;do{if((c[(c[u>>2]|0)+24>>2]|0)==0){m=ew(b,142240)|0;if((m|0)==0){w=23}else{if((a[m]|0)==0){w=23}}if((w|0)==23){m=ew(b,139152)|0;if((m|0)==0){break}if((a[m]|0)==0){break}}m=ew(b,142240)|0;if((m|0)==0){w=27}else{if((a[m]|0)==0){w=27}else{x=m}}do{if((w|0)==27){m=ew(b,139152)|0;if((m|0)!=0){if((a[m]|0)!=0){x=m;break}}x=0}}while(0);m=Lb(x|0)|0;c[(c[u>>2]|0)+24>>2]=m}}while(0);x=Gj(n,c[u>>2]|0,0,j)|0;c[f>>2]=c[f>>2]|x;x=c[u>>2]|0;y=(+h[x+64>>3]+1.0)*.5;z=(+h[x+72>>3]+1.0)*.5;u=g|0;h[u>>3]=-0.0-y;b=g+8|0;h[b>>3]=-0.0-z;w=g+16|0;h[w>>3]=y;m=g+24|0;h[m>>3]=z;Hj(x,g,15);h[d+24>>3]=+h[w>>3]- +h[u>>3];h[d+32>>3]=+h[m>>3]- +h[b>>3]}else{b=p;Ij(c[(c[n+8>>2]|0)+136>>2]|0,c[b>>2]|0,j);j=c[b>>2]|0;z=+h[j+24>>3]*.5;y=+h[j+32>>3]*.5;b=g;h[g>>3]=-0.0-z;h[g+8>>3]=-0.0-y;h[g+16>>3]=z;h[g+24>>3]=y;g=j+8|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[g+16>>2]=c[b+16>>2];c[g+20>>2]=c[b+20>>2];c[g+24>>2]=c[b+24>>2];c[g+28>>2]=c[b+28>>2];h[d+24>>3]=z+z;h[d+32>>3]=y+y}c[d+72>>2]=p;if((a[k]|0)!=1){v=c[f>>2]|0;i=e;return v|0}eF(c[o>>2]|0);c[o>>2]=Lb(86272)|0;v=c[f>>2]|0;i=e;return v|0}function Gj(f,g,j,k){f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0;l=i;m=g+108|0;n=c[m>>2]|0;do{if((n|0)!=0){o=k+16|0;p=c[o>>2]|0;do{if((p|0)!=0){q=n|0;if((c[q>>2]|0)==0){c[43752]=0;break}else{c[43752]=p;c[o>>2]=c[q>>2];break}}}while(0);o=k+20|0;p=c[o>>2]|0;do{if((p|0)!=0){q=n+4|0;if((c[q>>2]|0)==0){c[43753]=0;break}else{c[43753]=p;c[o>>2]=c[q>>2];break}}}while(0);o=k+32|0;r=+h[o>>3];if(r<0.0){break}p=n+16|0;if(+h[p>>3]<0.0){h[21878]=-1.0;break}else{h[21878]=r;h[o>>3]=+h[p>>3];break}}}while(0);c[g+80>>2]=j;j=g+84|0;n=c[j>>2]|0;p=Dk()|0;o=Uj()|0;q=Zg(n)|0;if((q|0)==0){s=0}else{t=1;u=0;v=q;while(1){q=Zg(c[v+8>>2]|0)|0;if((q|0)==0){w=u}else{x=u;y=q;while(1){q=x+1|0;z=c[y>>2]|0;if((z|0)==0){w=q;break}else{x=q;y=z}}}if((a[v+12|0]|0)!=0){Vj(o,t)}y=c[v>>2]|0;if((y|0)==0){s=w;break}else{t=t+1|0;u=w;v=y}}}v=jk((s<<2)+4|0)|0;c[j>>2]=v;j=Zg(n)|0;if((j|0)==0){A=0;B=0;C=0}else{s=0;w=v;v=0;u=0;t=0;y=j;while(1){j=Zg(c[y+8>>2]|0)|0;if((j|0)==0){D=w;E=v;F=u;G=t}else{x=s&65535;z=0;q=w;H=v;I=u;J=t;K=j;while(1){j=c[K+8>>2]|0;L=q+4|0;c[q>>2]=j;M=Jj(f,j,g,k)|0|H;N=j+80|0;O=b[N>>1]|0;P=(O&65535)-1|0;do{if(O<<16>>16==0){Q=z;R=25}else{S=z;a:while(1){T=P+S|0;while(1){if((Ik(p,T,s)|0)!=0){break}if((T|0)>(S|0)){T=T-1|0}else{break a}}S=T+1|0}U=b[N>>1]|0;if(U<<16>>16==0){Q=S;R=25;break}V=j+82|0;W=b[V>>1]|0;X=S;Y=W;Z=U;U=W;while(1){if(Y<<16>>16==0){_=0;$=Z;aa=U}else{W=s;do{Gk(p,X,W);W=W+1|0;ba=b[V>>1]|0;}while((W|0)<((ba&65535)+s|0));_=ba;$=b[N>>1]|0;aa=ba}W=X+1|0;if((W|0)<(($&65535)+S|0)){X=W;Y=_;Z=$;U=aa}else{ca=$;ea=aa;fa=S;break}}}}while(0);if((R|0)==25){R=0;ca=0;ea=b[j+82>>1]|0;fa=Q}b[j+86>>1]=x;b[j+84>>1]=fa;N=(ca&65535)+fa|0;P=(N|0)>(J|0)?N:J;O=(ea&65535)+s|0;S=(O|0)>(I|0)?O:I;if((Wj(o,O)|0)!=0){O=j+100|0;a[O]=a[O]|2}O=c[K>>2]|0;if((O|0)==0){D=L;E=M;F=S;G=P;break}else{z=N;q=L;H=M;I=S;J=P;K=O}}}K=c[y>>2]|0;if((K|0)==0){A=E;B=F;C=G;break}else{s=s+1|0;w=D;v=E;u=F;t=G;y=K}}}y=g+100|0;c[y>>2]=B;B=g+104|0;c[B>>2]=C;Vg(n)|0;Vg(o)|0;Ek(p);p=g+36|0;o=b[p>>1]|0;if((o&128)==0){a[g+32|0]=2}n=g+33|0;if((o&32)==0){a[n]=1}Ej(g);o=c[B>>2]|0;B=a[g+32|0]|0;C=da(B,o+1|0)|0;G=d[n]<<1;n=G+C|0;C=c[y>>2]|0;y=(da(C+1|0,B)|0)+G|0;if((o|0)>0){G=c[g+96>>2]|0;B=0;t=n;while(1){F=(c[G+(B<<2)>>2]|0)+t|0;u=B+1|0;if((u|0)<(o|0)){B=u;t=F}else{ga=F;break}}}else{ga=n}if((C|0)>0){n=c[g+92>>2]|0;t=0;B=y;while(1){o=(c[n+(t<<2)>>2]|0)+B|0;G=t+1|0;if((G|0)<(C|0)){t=G;B=o}else{ha=o;break}}}else{ha=y}y=g+38|0;b:do{if((b[p>>1]&1)==0){ia=A;ja=ha;ka=ga}else{B=b[y>>1]|0;t=B&65535;do{if(B<<16>>16!=0){C=b[g+40>>1]|0;if(C<<16>>16==0){break}if(!((t|0)<(ga|0)|(C&65535|0)<(ha|0))){ia=A;ja=0;ka=0;break b}Fv(0,159600,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;ia=1;ja=0;ka=0;break b}}while(0);Fv(0,154576,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;ia=1;ja=ha;ka=ga}}while(0);ga=e[y>>1]|0;h[g+64>>3]=+(((ka|0)>(ga|0)?ka:ga)|0);ga=e[g+40>>1]|0;h[g+72>>3]=+(((ja|0)>(ga|0)?ja:ga)|0);if((c[m>>2]|0)==0){i=l;return ia|0}m=c[43752]|0;if((m|0)!=0){c[k+16>>2]=m}m=c[43753]|0;if((m|0)!=0){c[k+20>>2]=m}r=+h[21878];if(r<0.0){i=l;return ia|0}h[k+32>>3]=r;i=l;return ia|0}function Hj(f,g,j){f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0,u=0.0,v=0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0,ca=0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0;k=i;i=i+32|0;l=g;g=i;i=i+32|0;tF(g,l,32)|0;l=k|0;m=c[f+84>>2]|0;n=c[f+80>>2]|0;do{if((n|0)!=0){o=c[n+24>>2]|0;if((o|0)==0){break}p=f+24|0;if((c[p>>2]|0)!=0){break}c[p>>2]=Lb(o|0)|0}}while(0);n=f+48|0;o=g+16|0;q=+h[o>>3];p=g|0;r=+h[p>>3];s=~~(q-r- +(~~+h[f+64>>3]|0));if((s|0)<=-1){cc(81552,167808,1708,170064)}t=g+24|0;u=+h[t>>3];v=g+8|0;w=+h[v>>3];x=+(~~+h[f+72>>3]|0);y=~~(u-w-x);if((y|0)<=-1){cc(163632,167808,1711,170064)}z=e[f+36>>1]|0;do{if((z&1|0)==0){A=y;B=s;C=r;D=u}else{do{if((s|0)>0){E=z&6;if((E|0)==4){h[o>>3]=r+x;F=0;G=r;break}else if((E|0)==2){H=+(s|0);h[o>>3]=q+H;I=H+r;h[p>>3]=I;F=0;G=I;break}else{I=+((s|0)/2|0|0);H=r+I;h[p>>3]=H;h[o>>3]=q-I;F=0;G=H;break}}else{F=s;G=r}}while(0);if((y|0)<=0){A=y;B=F;C=G;D=u;break}E=z&24;if((E|0)==8){H=+(y|0);I=H+u;h[t>>3]=I;h[v>>3]=H+w;A=0;B=F;C=G;D=I;break}else if((E|0)==16){I=x+w;h[t>>3]=I;A=0;B=F;C=G;D=I;break}else{I=+((y|0)/2|0|0);h[v>>3]=w+I;H=u-I;h[t>>3]=H;A=0;B=F;C=G;D=H;break}}}while(0);F=f+33|0;t=a[F]|0;v=f+32|0;y=a[v]|0;z=f+104|0;s=c[z>>2]|0;o=(B|0)/(s|0)|0;p=B-(da(o,s)|0)|0;G=+(p|0);if((p|0)>-1){J=G+.5}else{J=G+-.5}p=~~J;if((s|0)<0){K=t;L=y}else{s=f+96|0;B=0;E=~~(+(y<<24>>24|0)+(C+ +(t&255|0)));while(1){t=(c[s>>2]|0)+(B<<2)|0;y=c[t>>2]|0;c[t>>2]=E;M=a[v]|0;t=E+o+((B|0)<(p|0))+y+(M<<24>>24)|0;if((B|0)<(c[z>>2]|0)){B=B+1|0;E=t}else{break}}K=a[F]|0;L=M}M=f+100|0;F=c[M>>2]|0;E=(A|0)/(F|0)|0;B=A-(da(E,F)|0)|0;C=+(B|0);if((B|0)>-1){N=C+.5}else{N=C+-.5}B=~~N;if((F|0)>=0){F=f+92|0;A=~~(D- +(K&255|0)- +(L<<24>>24|0));L=0;while(1){K=(c[F>>2]|0)+(L<<2)|0;p=c[K>>2]|0;c[K>>2]=A;if((L|0)<(c[M>>2]|0)){A=A-E+(((L|0)<(B|0))<<31>>31)-p-(a[v]|0)|0;L=L+1|0}else{break}}}L=c[m>>2]|0;if((L|0)==0){O=j&255;P=f+35|0;a[P]=O;Q=n;R=g;c[Q>>2]=c[R>>2];c[Q+4>>2]=c[R+4>>2];c[Q+8>>2]=c[R+8>>2];c[Q+12>>2]=c[R+12>>2];c[Q+16>>2]=c[R+16>>2];c[Q+20>>2]=c[R+20>>2];c[Q+24>>2]=c[R+24>>2];c[Q+28>>2]=c[R+28>>2];i=k;return}B=(j|0)==0;E=f+96|0;A=f+92|0;F=l;p=l|0;K=l+8|0;o=l+16|0;s=l+24|0;t=m;m=L;do{t=t+4|0;L=b[m+84>>1]|0;if(B){S=0;T=b[m+80>>1]|0;U=b[m+86>>1]|0;V=b[m+82>>1]|0}else{y=L<<16>>16==0?8:0;W=b[m+86>>1]|0;X=W<<16>>16==0?y|4:y;y=b[m+80>>1]|0;Y=b[m+82>>1]|0;S=((Y&65535)+(W&65535)|0)==(c[M>>2]|0)|(((y&65535)+(L&65535)|0)==(c[z>>2]|0)?X|2:X);T=y;U=W;V=Y}Y=L&65535;L=c[E>>2]|0;D=+(c[L+(Y<<2)>>2]|0);W=a[v]|0;N=+((c[L+((T&65535)+Y<<2)>>2]|0)-W|0);Y=U&65535;L=c[A>>2]|0;C=+(c[L+(Y<<2)>>2]|0);J=+((c[L+((V&65535)+Y<<2)>>2]|0)+W|0);W=S&j;Y=m+24|0;do{if((c[Y>>2]|0)==0){L=c[(c[m+96>>2]|0)+24>>2]|0;if((L|0)==0){break}c[Y>>2]=Lb(L|0)|0}}while(0);Y=m+36|0;L=e[Y>>1]|0;y=m+64|0;do{if((L&1|0)==0){Z=D;_=J;$=N;aa=C;ba=m+72|0}else{G=+h[y>>3];X=m+72|0;u=+h[X>>3];w=N-D-G;do{if(w>0.0){ca=L&6;if((ca|0)==2){ea=D+w;fa=N+w;break}else if((ca|0)==4){ea=D;fa=D+G;break}else{x=w*.5;ea=D+x;fa=N-x;break}}else{ea=D;fa=N}}while(0);w=C-J-u;if(w<=0.0){Z=ea;_=J;$=fa;aa=C;ba=X;break}ca=L&24;if((ca|0)==16){Z=ea;_=J;$=fa;aa=J+u;ba=X;break}else if((ca|0)==8){Z=ea;_=J+w;$=fa;aa=C+w;ba=X;break}else{G=w*.5;Z=ea;_=J+G;$=fa;aa=C-G;ba=X;break}}}while(0);h[m+48>>3]=Z;h[m+56>>3]=_;h[y>>3]=$;h[ba>>3]=aa;a[m+35|0]=W;C=+(d[m+33|0]|0);J=+(d[m+34|0]|0);N=Z+C+J;h[p>>3]=N;D=_+C+J;h[K>>3]=D;G=$-C-J;h[o>>3]=G;w=aa-C-J;h[s>>3]=w;ca=m+88|0;ga=a[m+92|0]|0;do{if((ga<<24>>24|0)==1){Hj(c[ca>>2]|0,l,W)}else if((ga<<24>>24|0)==3){ha=c[ca>>2]|0;J=+h[ha+24>>3];C=G-N- +h[ha+16>>3];do{if(C>0.0){ia=L&6;if((ia|0)==2){h[p>>3]=N+C;break}else if((ia|0)==4){h[o>>3]=G-C;break}else{break}}}while(0);C=w-D-J;do{if(C>0.0){X=L&24;if((X|0)==16){h[s>>3]=w-C;break}else if((X|0)==8){h[K>>3]=D+C;break}else{break}}}while(0);X=ha;c[X>>2]=c[F>>2];c[X+4>>2]=c[F+4>>2];c[X+8>>2]=c[F+8>>2];c[X+12>>2]=c[F+12>>2];c[X+16>>2]=c[F+16>>2];c[X+20>>2]=c[F+20>>2];c[X+24>>2]=c[F+24>>2];c[X+28>>2]=c[F+28>>2]}else{X=ca;ia=c[X>>2]|0;C=+h[ia+32>>3];J=G-N- +h[ia+24>>3];do{if(J>0.0){ja=L&6;if((ja|0)==2){h[p>>3]=N+J;break}else if((ja|0)==4){h[o>>3]=G-J;break}else if((ja|0)==6){break}else{u=J*.5;h[p>>3]=N+u;h[o>>3]=G-u;break}}}while(0);J=w-D-C;do{if(J>0.0){ha=L&24;if((ha|0)==8){h[K>>3]=D+J;break}else if((ha|0)==16){h[s>>3]=w-J;break}else{u=J*.5;h[K>>3]=D+u;h[s>>3]=w-u;break}}}while(0);ha=ia+8|0;c[ha>>2]=c[F>>2];c[ha+4>>2]=c[F+4>>2];c[ha+8>>2]=c[F+8>>2];c[ha+12>>2]=c[F+12>>2];c[ha+16>>2]=c[F+16>>2];c[ha+20>>2]=c[F+20>>2];c[ha+24>>2]=c[F+24>>2];c[ha+28>>2]=c[F+28>>2];ha=b[Y>>1]&768;if((ha|0)==256){ka=114}else if((ha|0)==512){ka=108}else{ka=110}ha=c[X>>2]|0;ja=ha+4|0;la=b[ja>>1]|0;if(la<<16>>16<=0){break}ma=ha|0;ha=0;na=la;while(1){la=(c[ma>>2]|0)+(ha*24|0)+6|0;if((a[la]|0)==0){a[la]=ka;oa=b[ja>>1]|0}else{oa=na}la=ha+1|0;if((la|0)<(oa<<16>>16|0)){ha=la;na=oa}else{break}}}}while(0);m=c[t>>2]|0;}while((m|0)!=0);O=j&255;P=f+35|0;a[P]=O;Q=n;R=g;c[Q>>2]=c[R>>2];c[Q+4>>2]=c[R+4>>2];c[Q+8>>2]=c[R+8>>2];c[Q+12>>2]=c[R+12>>2];c[Q+16>>2]=c[R+16>>2];c[Q+20>>2]=c[R+20>>2];c[Q+24>>2]=c[R+24>>2];c[Q+28>>2]=c[R+28>>2];i=k;return}function Ij(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0.0,N=0,O=0.0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0.0,ca=0.0,da=0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0,na=0.0;g=i;i=i+104|0;j=g|0;k=g+56|0;l=g+88|0;m=k;c[m>>2]=c[2950];c[m+4>>2]=c[2951];c[m+8>>2]=c[2952];c[m+12>>2]=c[2953];c[m+16>>2]=c[2954];c[m+20>>2]=c[2955];c[m+24>>2]=c[2956];c[m+28>>2]=c[2957];n=e|0;o=e+4|0;p=b[o>>1]|0;q=p<<16>>16>0;if(!q){a[e+6|0]=1;r=0.0;s=0.0;t=0.0;u=p;v=e+24|0;h[v>>3]=s;w=u<<16>>16==1;x=e+32|0;y=w?t:r;h[x>>3]=y;i=g;return}z=f+32|0;A=k+16|0;B=f+16|0;C=k|0;D=c[n>>2]|0;E=0;F=-1.0;G=0;a:while(1){if((b[D+(E*24|0)+4>>1]|0)>1){H=0;break}I=D+(E*24|0)|0;J=c[(c[I>>2]|0)+4>>2]|0;do{if((J|0)==0){K=+h[z>>3];h[A>>3]=K;L=c[B>>2]|0;c[C>>2]=L;M=K;N=L}else{if((c[J+24>>2]&127|0)!=0){H=0;break a}K=+h[J+16>>3];if(K>0.0){O=K}else{O=+h[z>>3]}h[A>>3]=O;L=c[c[(c[I>>2]|0)+4>>2]>>2]|0;if((L|0)==0){P=c[B>>2]|0;c[C>>2]=P;M=O;N=P;break}else{c[C>>2]=L;M=O;N=L;break}}}while(0);if(F==-1.0){Q=M}else{if(M!=F){H=0;break}else{Q=F}}if((G|0)==0){R=N}else{if((Ya(N|0,G|0)|0)==0){R=G}else{H=0;break}}I=E+1|0;if((I|0)<(p<<16>>16|0)){E=I;F=Q;G=R}else{H=1;break}}a[e+6|0]=H;if(!q){r=0.0;s=0.0;t=0.0;u=p;v=e+24|0;h[v>>3]=s;w=u<<16>>16==1;x=e+32|0;y=w?t:r;h[x>>3]=y;i=g;return}p=(H|0)==0;H=f+48|0;q=j|0;R=f+32|0;G=k+16|0;E=f+16|0;N=k|0;C=f+20|0;B=k+4|0;A=f+40|0;f=k+24|0;k=d+144|0;z=j+4|0;D=l|0;I=l+8|0;J=j+16|0;L=j+24|0;P=j+8|0;S=j+12|0;Q=0.0;F=0.0;M=0.0;T=0;U=c[n>>2]|0;while(1){if((b[U+(T*24|0)+4>>1]|0)>0){O=0.0;V=0;K=0.0;W=0.0;X=0.0;Y=U;while(1){c[q>>2]=fk(c[(c[Y+(T*24|0)>>2]|0)+(V*56|0)>>2]|0,c[H>>2]|0)|0;Z=(c[n>>2]|0)+(T*24|0)|0;_=c[(c[Z>>2]|0)+(V*56|0)+4>>2]|0;do{if((_|0)==0){h[G>>3]=+h[R>>3];c[N>>2]=c[E>>2];c[B>>2]=c[C>>2];c[f>>2]=c[f>>2]&-128|c[A>>2]&127}else{$=c[_+24>>2]<<25>>25;do{if(($|0)==0){aa=c[A>>2]|0;if((aa<<25>>25|0)>0<<25>>25&127){c[f>>2]=c[f>>2]&-128|aa&127;break}else{c[f>>2]=c[f>>2]&-128;break}}else{c[f>>2]=c[f>>2]&-128|$&127}}while(0);ba=+h[(c[(c[Z>>2]|0)+(V*56|0)+4>>2]|0)+16>>3];if(ba>0.0){ca=ba}else{ca=+h[R>>3]}h[G>>3]=ca;$=c[c[(c[Z>>2]|0)+(V*56|0)+4>>2]>>2]|0;if(($|0)==0){da=c[E>>2]|0}else{da=$}c[N>>2]=da;$=c[(c[(c[Z>>2]|0)+(V*56|0)+4>>2]|0)+4>>2]|0;if(($|0)==0){c[B>>2]=c[C>>2];break}else{c[B>>2]=$;break}}}while(0);Z=c[k>>2]|0;c[z>>2]=Hc[c[Z>>2]&63](Z,m,1)|0;sm(l,d,j);ba=+h[D>>3];ea=+h[I>>3];eF(c[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)>>2]|0);c[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)>>2]=c[q>>2];h[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)+32>>3]=ba;h[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)+16>>3]=+h[J>>3];h[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)+24>>3]=+h[L>>3];c[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)+4>>2]=c[z>>2];c[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)+8>>2]=c[P>>2];c[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)+12>>2]=c[S>>2];fa=K+ba;ba=+h[G>>3];ga=ba>O?ba:O;ba=ea>X?ea:X;ea=+h[L>>3];ha=ea>W?ea:W;Z=V+1|0;_=c[n>>2]|0;if((Z|0)<(b[_+(T*24|0)+4>>1]|0)){O=ga;V=Z;K=fa;W=ha;X=ba;Y=_}else{ia=ga;ja=fa;ka=ha;la=ba;ma=_;break}}}else{ia=0.0;ja=0.0;ka=0.0;la=0.0;ma=U}h[ma+(T*24|0)+8>>3]=ja;Y=(T|0)==0;do{if(p){if(Y){h[(c[n>>2]|0)+16>>3]=ia-ka;na=ia;break}else{h[(c[n>>2]|0)+(T*24|0)+16>>3]=F+ia-Q-ka;na=ia;break}}else{V=(c[n>>2]|0)+(T*24|0)+16|0;if(Y){h[V>>3]=ia;na=la;break}else{h[V>>3]=la;na=la;break}}}while(0);Y=c[n>>2]|0;X=ja>M?ja:M;W=F+na;V=T+1|0;_=b[o>>1]|0;if((V|0)<(_<<16>>16|0)){Q=Q+ +h[Y+(T*24|0)+16>>3];F=W;M=X;T=V;U=Y}else{r=W;s=X;t=la;u=_;break}}v=e+24|0;h[v>>3]=s;w=u<<16>>16==1;x=e+32|0;y=w?t:r;h[x>>3]=y;i=g;return}function Jj(f,g,j,k){f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0,E=0.0,F=0.0;l=i;i=i+8|0;m=l|0;c[g+96>>2]=j;n=g+36|0;o=b[n>>1]|0;do{if((o&64)==0){if((b[j+36>>1]&64)==0){a[g+34|0]=2;break}else{a[g+34|0]=a[j+34|0]|0;break}}}while(0);do{if((o&32)==0){p=a[j+88|0]|0;if(p<<24>>24>-1){a[g+33|0]=p;break}if((b[j+36>>1]&32)==0){a[g+33|0]=1;break}else{a[g+33|0]=a[j+33|0]|0;break}}}while(0);j=g+88|0;o=g+92|0;p=a[o]|0;if((p<<24>>24|0)==1){q=j|0;r=Gj(f,c[q>>2]|0,g,k)|0;s=c[q>>2]|0;t=r;u=s+64|0;v=s+72|0}else if((p<<24>>24|0)==3){p=j;s=c[p>>2]|0;r=k+52|0;q=s+32|0;FB(m,c[r>>2]|0,c[q>>2]|0);w=c[m>>2]|0;x=c[m+4>>2]|0;if((w|0)==-1&(x|0)==-1){Fv(1,145200,(y=i,i=i+8|0,c[y>>2]=c[q>>2],y)|0)|0;i=y;z=1;A=0.0;B=0.0}else{a[(c[(c[r>>2]|0)+8>>2]|0)+114|0]=1;z=0;A=+(x|0);B=+(w|0)}vF(s|0,0,16)|0;h[s+16>>3]=B;h[s+24>>3]=A;s=c[p>>2]|0;t=z;u=s+16|0;v=s+24|0}else{s=j;Ij(c[(c[f+8>>2]|0)+136>>2]|0,c[s>>2]|0,k);k=c[s>>2]|0;t=0;u=k+24|0;v=k+32|0}A=+((d[g+33|0]|0)+(d[g+34|0]|0)<<1|0);B=+h[u>>3]+A;C=+h[v>>3]+A;v=g+38|0;a:do{if((b[n>>1]&1)==0){D=t;E=B;F=C}else{u=b[v>>1]|0;k=u&65535;do{if(u<<16>>16!=0){s=b[g+40>>1]|0;if(s<<16>>16==0){break}if(+(k|0)>=B){if(+(s&65535|0)>=C){D=t;E=0.0;F=0.0;break a}}if((a[o]|0)==3){D=t;E=0.0;F=0.0;break a}Fv(0,151304,(y=i,i=i+1|0,i=i+7&-8,c[y>>2]=0,y)|0)|0;i=y;D=1;E=0.0;F=0.0;break a}}while(0);Fv(0,148360,(y=i,i=i+1|0,i=i+7&-8,c[y>>2]=0,y)|0)|0;i=y;D=1;E=B;F=C}}while(0);C=+(e[v>>1]|0);h[g+64>>3]=E>C?E:C;C=+(e[g+40>>1]|0);h[g+72>>3]=F>C?F:C;i=l;return D|0}function Kj(d,e,f,g,h,j){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;k=i;i=i+176|0;l=g;g=i;i=i+32|0;tF(g,l,32)|0;l=k|0;m=k+16|0;n=k+48|0;o=c[d+16>>2]|0;p=o+208|0;q=h|0;c[q>>2]=c[p>>2];r=o+228|0;c[h+4>>2]=c[r>>2];s=o+244|0;c[h+8>>2]=c[s>>2];t=o+212|0;c[h+12>>2]=c[t>>2];u=o+260|0;v=h+16|0;a[v]=b[u>>1]<<15<<16>>16>>15;h=c[f+16>>2]|0;if((h|0)==0){w=3}else{if((a[h]|0)==0){w=3}else{x=0;y=h}}if((w|0)==3){Iv(l,128,n|0);n=e+60|0;w=c[n>>2]|0;if((w|0)==0){h=Lb(Ih(d,c[o+8>>2]|0,l)|0)|0;c[n>>2]=h;a[e+64|0]=1;z=h}else{z=w}Lv(l,z)|0;z=m|0;m=c[44688]|0;c[44688]=m+1;nb(z|0,106104,(w=i,i=i+8|0,c[w>>2]=m,w)|0)|0;i=w;Lv(l,z)|0;z=l+4|0;w=c[z>>2]|0;if(w>>>0<(c[l+8>>2]|0)>>>0){A=w}else{Jv(l,1)|0;A=c[z>>2]|0}a[A]=0;A=c[l>>2]|0;c[z>>2]=A;x=1;y=A}A=Hh(d,0,c[f>>2]|0,c[f+12>>2]|0,c[f+8>>2]|0,y,c[o+8>>2]|0)|0;if(x){Mv(l)}if((A|0)==0){i=k;return A|0}do{if((j|0)!=0){if((c[q>>2]|0)==0){if((a[v]|0)==0){break}}hB(d)}}while(0);do{if((c[p>>2]|0)==0){if((b[u>>1]&1)!=0){break}i=k;return A|0}}while(0);Nh(d,g);gB(d,c[p>>2]|0,c[r>>2]|0,c[s>>2]|0,c[t>>2]|0);i=k;return A|0}function Lj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0.0;h=i;i=i+8|0;j=h|0;if((Vh(b,f,j)|0)<<24>>24==0){nB(a,b);k=1;lB(a,106536);i=h;return k|0}nB(a,c[f>>2]|0);b=c[f+4>>2]|0;l=+g[j>>2];if((b|0)==0){oB(a,127648,d,l)}else{oB(a,b,d,l)}k=e>>>1&1|2;lB(a,106536);i=h;return k|0}function Mj(e,f,g){e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0;j=i;i=i+104|0;k=g;g=i;i=i+32|0;tF(g,k,32)|0;k=j|0;l=j+32|0;m=j+96|0;n=c[f+24>>2]|0;lB(e,(n|0)==0?127648:n);n=f+42|0;o=b[n>>1]|0;if((o&384)==0){pB(e,c[(c[e>>2]|0)+336>>2]|0)}else{c[m+4>>2]=0;p=m|0;c[p>>2]=0;m=o&65535;do{if((m&256|0)==0){if((m&128|0)==0){break}c[p>>2]=106976}else{c[p>>2]=107656}}while(0);pB(e,p)}p=f+33|0;xB(e,+((d[p]|0)>>>0));if((b[n>>1]&4)==0){n=a[p]|0;if((n&255)>>>0>1>>>0){q=+((n&255)>>>0)*.5;n=g|0;h[n>>3]=q+ +h[n>>3];n=g+8|0;h[n>>3]=q+ +h[n>>3];n=g+16|0;h[n>>3]=+h[n>>3]-q;n=g+24|0;h[n>>3]=+h[n>>3]-q}sB(e,g,0);i=j;return}n=a[p]|0;p=g;tF(k|0,p|0,32)|0;tF(l|0,p|0,16)|0;p=l+32|0;g=p;f=k+16|0;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];if((n&255)>>>0>1>>>0){q=+(n&255|0)*.5;n=l|0;r=q+ +h[n>>3];h[n>>3]=r;n=l+8|0;s=q+ +h[n>>3];h[n>>3]=s;n=p|0;t=+h[n>>3]-q;h[n>>3]=t;n=l+40|0;u=+h[n>>3]-q;h[n>>3]=u;v=t;w=s;x=r;y=u}else{v=+h[p>>3];w=+h[l+8>>3];x=+h[l>>3];y=+h[l+40>>3]}h[l+16>>3]=v;h[l+24>>3]=w;h[l+48>>3]=x;h[l+56>>3]=y;ol(e,l|0,4,4,0);i=j;return}function Nj(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=c[d+16>>2]|0;h=g+208|0;if((c[h>>2]|0)==0){if((b[g+260>>1]&1)==0){i=0}else{j=3}}else{j=3}if((j|0)==3){hB(d);i=c[h>>2]|0}j=e|0;if((i|0)!=(c[j>>2]|0)){eF(i);c[h>>2]=c[j>>2]}j=g+228|0;i=c[j>>2]|0;k=e+4|0;if((i|0)!=(c[k>>2]|0)){eF(i);c[j>>2]=c[k>>2]}k=g+244|0;i=c[k>>2]|0;l=e+8|0;if((i|0)!=(c[l>>2]|0)){eF(i);c[k>>2]=c[l>>2]}l=g+212|0;i=c[l>>2]|0;m=e+12|0;if((i|0)==(c[m>>2]|0)){n=i}else{eF(i);i=c[m>>2]|0;c[l>>2]=i;n=i}i=g+260|0;g=a[e+16|0]&1;b[i>>1]=b[i>>1]&-2|g;if((f|0)==0){return}f=c[h>>2]|0;if((f|0)==0&g<<16>>16==0){return}gB(d,f,c[j>>2]|0,c[k>>2]|0,n);return}function Oj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+8|0;f=e|0;g=ew(a|0,b)|0;if((g|0)==0){i=e;return}b=ac(g|0,120896,(g=i,i=i+8|0,c[g>>2]=f,g)|0)|0;i=g;if((b|0)<=0){i=e;return}h[d>>3]=+h[f>>3];i=e;return}function Pj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0;e=i;i=i+8|0;f=e|0;g=jk(96)|0;j=b+8|0;c[(c[j>>2]|0)+8>>2]=g;g=b|0;k=ew(g,112632)|0;if((k|0)==0){l=Qb(112136)|0;if((l|0)!=0){m=l;n=3}}else{m=k;n=3}if((n|0)==3){k=c[44740]|0;l=mk(k,(xF(m|0)|0)+12|0)|0;c[44740]=l;tF(l|0,111552,12)|0;AF(l|0,m|0)|0;Ib(c[44740]|0)|0}m=Im(g,Wv(b,0,160360,0)|0,159864)|0;do{if((pm(m,159144)|0)==0){o=1}else{if((pm(m,158816)|0)==0){o=1;break}if((pm(m,158496)|0)==0){o=1;break}if((pm(m,165784)|0)==0){o=1;break}if((pm(m,158216)|0)==0){o=1;break}if((pm(m,157864)|0)==0){o=1;break}if((pm(m,157304)|0)==0){o=1;break}if((pm(m,156984)|0)==0){o=2;break}if((pm(m,156624)|0)==0){o=2;break}if((pm(m,159864)|0)==0){o=0;break}if((pm(m,155472)|0)==0){o=0;break}Fv(0,154880,(p=i,i=i+8|0,c[p>>2]=m,p)|0)|0;i=p;o=0}}while(0);a[(c[j>>2]|0)+115|0]=o;do{if((c[53686]|0)==0){o=ew(g,110872)|0;c[53702]=o;if((o|0)!=0){break}c[53702]=c[53704]}}while(0);q=+Fm(g,Wv(b,0,110144,0)|0,0.0,0.0);h[c[(c[j>>2]|0)+8>>2]>>3]=q;o=ew(g,109472)|0;do{if((o|0)==0){r=0}else{m=a[o]|0;if((m<<24>>24|0)==76){if((Ya(o|0,108656)|0)==0){r=1;break}}else if((m<<24>>24|0)==66){if((Ya(o|0,107640)|0)==0){r=2;break}}else if((m<<24>>24|0)==82){m=(Ya(o|0,106968)|0)==0;r=m?3:0;break}else{r=0;break}r=0}}while(0);o=r<<2;if(d<<24>>24==0){c[(c[j>>2]|0)+116>>2]=o}else{c[(c[j>>2]|0)+116>>2]=o|r}q=+Fm(g,Wv(b,0,106528,0)|0,.25,.02);h[f>>3]=q;s=q*72.0;if(s<0.0){t=s+-.5}else{t=s+.5}c[(c[j>>2]|0)+236>>2]=~~t;r=Hm(g,Wv(b,0,106096,0)|0,0)|0;do{if((r|0)==0){h[f>>3]=.5;u=.5}else{o=ac(r|0,120896,(p=i,i=i+8|0,c[p>>2]=f,p)|0)|0;i=p;do{if((o|0)==0){h[f>>3]=.5;v=.5}else{t=+h[f>>3];if(t>=.02){v=t;break}h[f>>3]=.02;v=.02}}while(0);if((Ua(r|0,105624)|0)==0){u=v;break}a[(c[j>>2]|0)+264|0]=1;u=+h[f>>3]}}while(0);v=u*72.0;if(v<0.0){w=v+-.5}else{w=v+.5}c[(c[j>>2]|0)+240>>2]=~~w;f=(Em(g,Wv(b,0,105184,0)|0,0,0)|0)&255;a[(c[j>>2]|0)+231|0]=f;f=Um(Hm(g,Wv(b,0,104776,0)|0,0)|0,25512,25528)|0;c[(c[j>>2]|0)+232>>2]=f;f=ew(g,162064)|0;do{if((f|0)!=0){r=a[f]|0;if(r<<24>>24==0){break}p=r<<24>>24;if((p|0)==97){if(r<<24>>24!=97){break}if((Ya(f|0,161712)|0)!=0){break}c[(c[(c[j>>2]|0)+8>>2]|0)+84>>2]=4;break}else if((p|0)==99){if(r<<24>>24!=99){break}if((Ya(f|0,161360)|0)!=0){break}c[(c[(c[j>>2]|0)+8>>2]|0)+84>>2]=3;break}else if((p|0)==101){if(r<<24>>24!=101){break}if((Ya(f|0,161040)|0)!=0){break}c[(c[(c[j>>2]|0)+8>>2]|0)+84>>2]=5;break}else if((p|0)==102){if(r<<24>>24!=102){break}if((Ya(f|0,160744)|0)!=0){break}c[(c[(c[j>>2]|0)+8>>2]|0)+84>>2]=2;break}else{w=+rF(f);if(w<=0.0){break}c[(c[(c[j>>2]|0)+8>>2]|0)+84>>2]=1;h[(c[(c[j>>2]|0)+8>>2]|0)+16>>3]=w;break}}}while(0);f=Qj(b,104288,(c[(c[j>>2]|0)+8>>2]|0)+64|0)|0;a[(c[(c[j>>2]|0)+8>>2]|0)+80|0]=f;Qj(b,103680,(c[(c[j>>2]|0)+8>>2]|0)+48|0)|0;f=Km(ew(g,103016)|0)|0;a[(c[(c[j>>2]|0)+8>>2]|0)+82|0]=f;f=ew(g,102072)|0;do{if((f|0)==0){r=ew(g,101320)|0;if((r|0)==0){p=ew(g,100864)|0;if((p|0)==0){break}o=Km(p)|0;a[(c[(c[j>>2]|0)+8>>2]|0)+81|0]=o;break}o=a[r]|0;if(o<<24>>24==108){x=1}else{x=o<<24>>24==76|0}a[(c[(c[j>>2]|0)+8>>2]|0)+81|0]=x}else{o=(Rb(f|0)|0)==90|0;a[(c[(c[j>>2]|0)+8>>2]|0)+81|0]=o}}while(0);c[53850]=Um(ew(g,100448)|0,25480,25496)|0;a[215376]=Km(ew(g,99896)|0)|0;c[53522]=0;c[53746]=0;h[(c[(c[j>>2]|0)+8>>2]|0)+24>>3]=0.0;f=ew(g,99520)|0;if((f|0)==0){n=69}else{if((a[f]|0)==0){n=69}else{y=f;n=71}}do{if((n|0)==69){f=ew(g,99104)|0;if((f|0)==0){break}if((a[f]|0)!=0){y=f;n=71}}}while(0);if((n|0)==71){w=+rF(y);h[(c[(c[j>>2]|0)+8>>2]|0)+24>>3]=w}Rj(b);h[21638]=1.0e+37;c[53718]=Wv(b,0,98688,0)|0;c[53722]=Wv(b,0,98120,0)|0;c[53720]=Wv(b,0,97440,0)|0;c[53618]=Wv(b,1,96336,0)|0;c[53574]=Wv(b,1,95800,0)|0;c[53590]=Wv(b,1,95256,0)|0;c[53644]=Wv(b,1,94864,0)|0;c[53632]=Wv(b,1,94384,0)|0;c[53582]=Wv(b,1,94e3,0)|0;c[53624]=Wv(b,1,93512,0)|0;c[53626]=Wv(b,1,93040,0)|0;c[53628]=Wv(b,1,92576,0)|0;y=Wv(b,1,123672,0)|0;c[53614]=y;if((y|0)==0){c[53614]=Wv(b,1,123672,121792)|0}c[53572]=Wv(b,1,91936,0)|0;c[53588]=Wv(b,1,105184,0)|0;c[53600]=Wv(b,1,91080,0)|0;c[53604]=Wv(b,1,98688,0)|0;c[53610]=Wv(b,1,97440,0)|0;c[53586]=Wv(b,1,90576,0)|0;c[53598]=Wv(b,1,89984,0)|0;c[53584]=Wv(b,1,89432,0)|0;c[53602]=Wv(b,1,101320,0)|0;c[53636]=Wv(b,1,89040,0)|0;c[53630]=Wv(b,1,88576,0)|0;c[53616]=Wv(b,1,88152,0)|0;c[53606]=Wv(b,1,87720,0)|0;c[53612]=Wv(b,1,87208,0)|0;c[53620]=Wv(b,1,86672,0)|0;c[53642]=Wv(b,1,85808,0)|0;c[53580]=Wv(b,1,85352,0)|0;c[53570]=Wv(b,1,84896,0)|0;c[53622]=Wv(b,1,98120,0)|0;c[53750]=Wv(b,2,84536,0)|0;c[53816]=Wv(b,2,94864,0)|0;c[53802]=Wv(b,2,94384,0)|0;c[53796]=Wv(b,2,93512,0)|0;c[53798]=Wv(b,2,93040,0)|0;c[53800]=Wv(b,2,92576,0)|0;c[53790]=Wv(b,2,123672,0)|0;c[53748]=Wv(b,2,91936,0)|0;c[53788]=Wv(b,2,84080,0)|0;c[53804]=Wv(b,2,83688,0)|0;c[53822]=Wv(b,2,83280,0)|0;c[53818]=Wv(b,2,82880,0)|0;c[53792]=Wv(b,2,82488,0)|0;c[53756]=Wv(b,2,81920,0)|0;c[53778]=Wv(b,2,81208,0)|0;c[53780]=Wv(b,2,80656,0)|0;c[53782]=Wv(b,2,80200,0)|0;c[53784]=Wv(b,2,79896,0)|0;c[53786]=Wv(b,2,79456,0)|0;c[53774]=Wv(b,2,79144,0)|0;c[53762]=Wv(b,2,105184,0)|0;c[53760]=Wv(b,2,94e3,0)|0;c[53810]=Wv(b,2,78864,0)|0;c[53820]=Wv(b,2,168872,0)|0;c[53812]=Wv(b,2,168520,0)|0;c[53776]=Wv(b,2,87208,0)|0;c[53814]=Wv(b,2,85808,0)|0;c[53758]=Wv(b,2,168136,0)|0;c[53794]=Wv(b,2,167408,0)|0;c[53772]=Wv(b,2,91080,0)|0;y=Eh(b)|0;c[(c[(c[j>>2]|0)+8>>2]|0)+88>>2]=y;y=ew(g,166960)|0;if((y|0)==0){i=e;return}if((a[y]|0)==0){i=e;return}b=fk(y,g)|0;c[(c[(c[j>>2]|0)+8>>2]|0)+92>>2]=b;i=e;return}function Qj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0;f=i;i=i+24|0;g=f|0;j=f+8|0;k=f+16|0;a[k]=0;l=ew(b|0,d)|0;if((l|0)==0){m=0;i=f;return m|0}d=ac(l|0,162760,(b=i,i=i+24|0,c[b>>2]=g,c[b+8>>2]=j,c[b+16>>2]=k,b)|0)|0;i=b;do{if((d|0)>1){n=+h[g>>3];if(n<=0.0){break}o=+h[j>>3];if(o<=0.0){break}p=n*72.0;if(p<0.0){q=p+-.5}else{q=p+.5}h[e>>3]=+(~~q|0);p=o*72.0;if(p<0.0){r=p+-.5}else{r=p+.5}h[e+8>>3]=+(~~r|0);m=(a[k]|0)==33|0;i=f;return m|0}}while(0);a[k]=0;j=ac(l|0,162408,(b=i,i=i+16|0,c[b>>2]=g,c[b+8>>2]=k,b)|0)|0;i=b;if((j|0)<=0){m=0;i=f;return m|0}r=+h[g>>3];if(r<=0.0){m=0;i=f;return m|0}q=r*72.0;if(q<0.0){s=q+-.5;t=~~s;u=+(t|0);v=e|0;h[v>>3]=u;w=e+8|0;h[w>>3]=u;x=a[k]|0;y=x<<24>>24==33;z=y&1;i=f;return z|0}else{s=q+.5;t=~~s;u=+(t|0);v=e|0;h[v>>3]=u;w=e+8|0;h[w>>3]=u;x=a[k]|0;y=x<<24>>24==33;z=y&1;i=f;return z|0}return 0}function Rj(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0,j=0,k=0,l=0,m=0.0;d=b|0;e=ew(d,123672)|0;if((e|0)==0){return}if((a[e]|0)==0){return}f=(c[(c[b+48>>2]|0)+8>>2]|0)+113|0;a[f]=a[f]|8;f=(gy(e)|0)!=0;g=+Fm(d,Wv(b,0,93512,0)|0,14.0,1.0);i=Im(d,Wv(b,0,93040,0)|0,164760)|0;j=ak(d,e,f?2:0,g,i,Im(d,Wv(b,0,92576,0)|0,164336)|0)|0;i=b+8|0;c[(c[i>>2]|0)+12>>2]=j;j=ew(d,163984)|0;f=(j|0)!=0;do{if((Ix(d)|0)==(b|0)){if(f){if((a[j]|0)==116){k=1;break}}k=0}else{if(f){if((a[j]|0)==98){k=0;break}}k=1}}while(0);j=ew(d,163192)|0;do{if((j|0)==0){l=k}else{f=a[j]|0;if((f<<24>>24|0)==108){l=k|2;break}else if((f<<24>>24|0)==114){l=k|4;break}else{l=k;break}}}while(0);a[(c[i>>2]|0)+263|0]=l;if((Ix(d)|0)==(b|0)){return}b=c[(c[i>>2]|0)+12>>2]|0;g=+h[b+24>>3]+16.0;m=+h[b+32>>3]+8.0;b=(c[(c[(Ix(d)|0)+8>>2]|0)+116>>2]&1|0)==0;d=c[i>>2]|0;l=(a[d+263|0]&1)!=0;if(b){b=l?2:0;k=d+48|0;h[k+(b<<4)>>3]=g;h[k+(b<<4)+8>>3]=m;return}else{b=l?1:3;h[d+48+(b<<4)>>3]=m;h[(c[i>>2]|0)+48+(b<<4)+8>>3]=g;return}}function Sj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+8|0;d=c[(c[b>>2]|0)+8>>2]|0;do{if((d|0)==0){e=0}else{f=c[d+88>>2]|0;if((f|0)==0){g=d}else{Hn(f);f=c[(c[b>>2]|0)+8>>2]|0;if((f|0)==0){e=0;break}else{g=f}}f=c[g+92>>2]|0;if((f|0)==0){e=g;break}eF(f);e=c[(c[b>>2]|0)+8>>2]|0}}while(0);eF(e);c[(c[b>>2]|0)+8>>2]=0;dk(c[(c[b>>2]|0)+12>>2]|0);_x(a,0,166512);return}function Tj(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==1){d=165784}else if((a|0)==2){d=165464}else if((a|0)==0){d=166168}else{Fv(1,165128,(e=i,i=i+8|0,c[e>>2]=a,e)|0)|0;i=e;d=166168}i=b;return d|0}function Uj(){return $g(21424,c[43330]|0)|0}function Vj(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d|0;c[e>>2]=b;Hc[c[a>>2]&63](a,e,1)|0;i=d;return}function Wj(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+8|0;e=d|0;c[e>>2]=b;b=(Hc[c[a>>2]&63](a,e,512)|0)!=0|0;i=d;return b|0}function Xj(a,b,d){a=a|0;b=b|0;d=d|0;d=jk(12)|0;c[d>>2]=c[b>>2];return d|0}function Yj(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function Zj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[b>>2]|0;b=c[d>>2]|0;if((e|0)>(b|0)){f=1;return f|0}f=((e|0)<(b|0))<<31>>31;return f|0}function _j(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;e=c[d>>2]|0;f=d+24|0;vF(f|0,0,16)|0;if((a[e]|0)==0){return}g=kk((xF(e|0)|0)+1|0)|0;a[g]=0;h=a[e]|0;do{if(h<<24>>24!=0){i=d+12|0;j=g;k=g;l=e;m=h;a:while(1){n=k;o=l;p=m;while(1){q=o+1|0;if((p&255)>>>0<161>>>0|(c[i>>2]|0)!=2|p<<24>>24==-1){if((p<<24>>24|0)==92){r=8;break}else if((p<<24>>24|0)==10){r=12;break}a[n]=p;s=n+1|0;t=q}else{a[n]=p;u=a[q]|0;v=n+2|0;a[n+1|0]=u;if(u<<24>>24==0){w=v;x=j;break a}else{s=v;t=o+2|0}}v=a[t]|0;if(v<<24>>24==0){w=s;x=j;break a}else{n=s;o=t;p=v}}if((r|0)==8){r=0;p=a[q]|0;v=p<<24>>24;if((v|0)==110|(v|0)==108|(v|0)==114){v=n+1|0;a[n]=0;$j(b,d,j,a[q]|0);y=v;z=v}else{a[n]=p;y=n+1|0;z=j}A=y;B=z;C=(a[q]|0)==0?q:o+2|0}else if((r|0)==12){r=0;p=n+1|0;a[n]=0;$j(b,d,j,110);A=p;B=p;C=q}p=a[C]|0;if(p<<24>>24==0){w=A;x=B;break}else{j=B;k=A;l=C;m=p}}if((x|0)==(w|0)){break}a[w]=0;$j(b,d,x,110)}}while(0);x=d+40|0;d=f;c[x>>2]=c[d>>2];c[x+4>>2]=c[d+4>>2];c[x+8>>2]=c[d+8>>2];c[x+12>>2]=c[d+12>>2];return}function $j(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0,u=0,v=0.0,w=0,x=0.0,y=0,z=0.0,A=0.0,B=0.0;j=i;i=i+16|0;k=j|0;l=e+76|0;m=b[l>>1]|0;n=e+72|0;o=c[n>>2]|0;if((o|0)==0){p=jk((m*56|0)+112|0)|0}else{p=lk(o,m+2|0,56,m+1|0)|0}m=p;c[n>>2]=m;n=b[l>>1]|0;p=m+(n*56|0)|0;c[p>>2]=f;a[m+(n*56|0)+48|0]=g;do{if((f|0)!=0){if((a[f]|0)==0){break}c[43704]=c[e+4>>2];h[21854]=+h[e+16>>3];g=c[d+144>>2]|0;c[m+(n*56|0)+4>>2]=Hc[c[g>>2]&63](g,174816,1)|0;sm(k,d,p);q=+h[k+8>>3];r=+h[k>>3];s=b[l>>1]|0;t=s+1&65535;b[l>>1]=t;u=e+24|0;v=+h[u>>3];w=v>r;x=w?v:r;h[u>>3]=x;y=e+32|0;z=+h[y>>3];A=q+z;h[y>>3]=A;i=j;return}}while(0);B=+(~~(+h[e+16>>3]*1.2)|0);h[m+(n*56|0)+40>>3]=B;q=B;r=0.0;s=b[l>>1]|0;t=s+1&65535;b[l>>1]=t;u=e+24|0;v=+h[u>>3];w=v>r;x=w?v:r;h[u>>3]=x;y=e+32|0;z=+h[y>>3];A=q+z;h[y>>3]=A;i=j;return}function ak(b,e,f,g,j,k){b=b|0;e=e|0;f=f|0;g=+g;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;l=i;m=jk(88)|0;n=m;o=Sx(b)|0;if((o|0)==0){p=0;q=0;r=b;s=c[b+48>>2]|0}else if((o|0)==1){p=0;q=b;r=0;s=Ix(Hx(b)|0)|0}else if((o|0)==2){o=b;p=o;q=0;r=0;s=Ix(Hx(c[((c[b>>2]&3|0)==2?o:b-32|0)+28>>2]|0)|0)|0}else{p=0;q=0;r=0;s=0}c[m+4>>2]=j;c[m+8>>2]=k;h[m+16>>3]=g;k=s+8|0;j=m+12|0;c[j>>2]=d[(c[k>>2]|0)+115|0]|0;if((f&4|0)!=0){c[m>>2]=Lb(e|0)|0;if((f&2|0)==0){i=l;return n|0}a[m+82|0]=1;i=l;return n|0}if((f|0)==2){c[m>>2]=Lb(e|0)|0;a[m+82|0]=1;if((Fj(b,n)|0)==0){i=l;return n|0}o=Sx(b)|0;if((o|0)==0){t=$w(r|0)|0;Fv(3,117880,(u=i,i=i+8|0,c[u>>2]=t,u)|0)|0;i=u;i=l;return n|0}else if((o|0)==1){t=$w(q|0)|0;Fv(3,156648,(u=i,i=i+8|0,c[u>>2]=t,u)|0)|0;i=u;i=l;return n|0}else if((o|0)==2){o=p;t=$w(c[((c[o>>2]&3|0)==3?p:p+32|0)+28>>2]|0)|0;q=(Nw(s)|0)!=0;r=$w(c[((c[o>>2]&3|0)==2?p:p-32|0)+28>>2]|0)|0;Fv(3,127032,(u=i,i=i+24|0,c[u>>2]=t,c[u+8>>2]=q?115048:108104,c[u+16>>2]=r,u)|0)|0;i=u;i=l;return n|0}else{i=l;return n|0}}else if((f|0)==0){f=bk(e,b,0)|0;b=m;c[b>>2]=f;if((c[j>>2]|0)==1){v=kn(f)|0}else{v=hn(f,s)|0}eF(c[b>>2]|0);c[b>>2]=v;_j(c[(c[k>>2]|0)+136>>2]|0,n);i=l;return n|0}else{cc(102408,96688,166,170344);return 0}return 0}function bk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;f=Sx(d)|0;do{if((f|0)==0){g=$w(d)|0;h=xF(g|0)|0;i=c[(c[d+8>>2]|0)+12>>2]|0;if((i|0)==0){j=0;k=0;l=0;m=2;n=2;o=2;p=2;q=2;r=h;s=133680;t=136504;u=139056;v=142152;w=145128;x=g;y=213432;z=213432;break}A=c[i>>2]|0;if((b|0)==0){j=0;k=0;l=0;m=2;n=2;o=2;p=2;q=2;r=h;s=A;t=136504;u=139056;v=142152;w=145128;x=g;y=213432;z=213432;break}j=0;k=0;l=0;m=xF(A|0)|0;n=2;o=2;p=2;q=2;r=h;s=A;t=136504;u=139056;v=142152;w=145128;x=g;y=213432;z=213432}else if((f|0)==1){g=$w(Hx(d)|0)|0;A=xF(g|0)|0;h=$w(d)|0;i=xF(h|0)|0;B=c[(c[d+8>>2]|0)+104>>2]|0;if((B|0)==0){j=0;k=0;l=0;m=2;n=2;o=2;p=2;q=i;r=A;s=133680;t=136504;u=139056;v=142152;w=h;x=g;y=213432;z=213432;break}C=c[B>>2]|0;if((b|0)==0){j=0;k=0;l=0;m=2;n=2;o=2;p=2;q=i;r=A;s=C;t=136504;u=139056;v=142152;w=h;x=g;y=213432;z=213432;break}j=0;k=0;l=0;m=xF(C|0)|0;n=2;o=2;p=2;q=i;r=A;s=C;t=136504;u=139056;v=142152;w=h;x=g;y=213432;z=213432}else if((f|0)==2){g=d;h=d;C=d+32|0;A=$w(Ix(Hx(c[((c[h>>2]&3|0)==3?g:C)+28>>2]|0)|0)|0)|0;i=xF(A|0)|0;B=$w(c[((c[h>>2]&3|0)==3?g:C)+28>>2]|0)|0;D=xF(B|0)|0;E=d+8|0;F=c[(c[E>>2]|0)+52>>2]|0;G=F;if((F|0)==0){H=0}else{H=xF(G|0)|0}F=$w(c[((c[h>>2]&3|0)==2?g:d-32|0)+28>>2]|0)|0;I=c[E>>2]|0;E=c[I+92>>2]|0;J=E;if((E|0)==0){K=0}else{K=xF(J|0)|0}E=xF(F|0)|0;L=c[I+96>>2]|0;do{if((L|0)==0){M=2;N=133680}else{I=c[L>>2]|0;if((b|0)==0){M=2;N=I;break}M=xF(I|0)|0;N=I}}while(0);L=(Nw(Ix(Hx(c[((c[h>>2]&3|0)==3?g:C)+28>>2]|0)|0)|0)|0)==0;j=1;k=K;l=H;m=M;n=D;o=E;p=D+2+((H|0)==0?0:H+1|0)+E+((K|0)==0?0:K+1|0)|0;q=2;r=i;s=N;t=B;u=F;v=L?108104:115048;w=145128;x=A;y=J;z=G}else{j=0;k=0;l=0;m=2;n=2;o=2;p=2;q=2;r=2;s=133680;t=136504;u=139056;v=142152;w=145128;x=148280;y=213432;z=213432}}while(0);N=(e|0)==0;a:do{if(N){e=0;K=b;b:while(1){H=K+1|0;M=a[K]|0;if((M<<24>>24|0)==0){O=e;break a}else if((M<<24>>24|0)!=92){e=e+1|0;K=H;continue}M=K+2|0;switch(a[H]|0){case 76:{e=e+m|0;K=M;continue b;break};case 78:{e=e+q|0;K=M;continue b;break};case 71:{e=e+r|0;K=M;continue b;break};case 84:{e=e+n|0;K=M;continue b;break};case 72:{e=e+o|0;K=M;continue b;break};case 69:{e=e+p|0;K=M;continue b;break};default:{e=e+2|0;K=M;continue b}}}}else{K=0;e=b;c:while(1){G=e+1|0;J=a[e]|0;if((J<<24>>24|0)==0){O=K;break a}else if((J<<24>>24|0)!=92){K=K+1|0;e=G;continue}J=e+2|0;switch(a[G]|0){case 71:{K=K+r|0;e=J;continue c;break};case 78:{K=K+q|0;e=J;continue c;break};case 69:{K=K+p|0;e=J;continue c;break};case 72:{K=K+o|0;e=J;continue c;break};case 84:{K=K+n|0;e=J;continue c;break};case 76:{K=K+m|0;e=J;continue c;break};case 92:{K=K+1|0;e=J;continue c;break};default:{K=K+2|0;e=J;continue c}}}}}while(0);m=kk(O+1|0)|0;O=(j|0)==0;j=(l|0)==0;l=(k|0)==0;k=m;n=b;d:while(1){b=n+1|0;o=a[n]|0;if((o<<24>>24|0)==0){break}else if((o<<24>>24|0)!=92){a[k]=o;k=k+1|0;n=b;continue}o=n+2|0;p=a[b]|0;e:do{switch(p<<24>>24|0){case 92:{if(N){break e}a[k]=92;k=k+1|0;n=o;continue d;break};case 71:{b=a[x]|0;a[k]=b;if(b<<24>>24==0){k=k;n=o;continue d}else{P=k;Q=x}while(1){b=Q+1|0;q=P+1|0;r=a[b]|0;a[q]=r;if(r<<24>>24==0){k=q;n=o;continue d}else{P=q;Q=b}}break};case 78:{b=a[w]|0;a[k]=b;if(b<<24>>24==0){k=k;n=o;continue d}else{R=k;S=w}while(1){b=S+1|0;q=R+1|0;r=a[b]|0;a[q]=r;if(r<<24>>24==0){k=q;n=o;continue d}else{R=q;S=b}}break};case 84:{b=a[t]|0;a[k]=b;if(b<<24>>24==0){k=k;n=o;continue d}else{T=k;U=t}while(1){b=U+1|0;q=T+1|0;r=a[b]|0;a[q]=r;if(r<<24>>24==0){k=q;n=o;continue d}else{T=q;U=b}}break};case 72:{b=a[u]|0;a[k]=b;if(b<<24>>24==0){k=k;n=o;continue d}else{V=k;W=u}while(1){b=W+1|0;q=V+1|0;r=a[b]|0;a[q]=r;if(r<<24>>24==0){k=q;n=o;continue d}else{V=q;W=b}}break};case 76:{b=a[s]|0;a[k]=b;if(b<<24>>24==0){k=k;n=o;continue d}else{X=k;Y=s}while(1){b=Y+1|0;q=X+1|0;r=a[b]|0;a[q]=r;if(r<<24>>24==0){k=q;n=o;continue d}else{X=q;Y=b}}break};case 69:{if(O){k=k;n=o;continue d}b=a[t]|0;a[k]=b;if(b<<24>>24==0){Z=k}else{b=k;q=t;while(1){r=q+1|0;e=b+1|0;K=a[r]|0;a[e]=K;if(K<<24>>24==0){Z=e;break}else{b=e;q=r}}}if(j){_=Z}else{a[Z]=58;q=z;b=Z;while(1){r=b+1|0;e=a[q]|0;a[r]=e;if(e<<24>>24==0){_=r;break}else{q=q+1|0;b=r}}}b=a[v]|0;a[_]=b;if(b<<24>>24==0){$=_}else{b=_;q=v;while(1){r=q+1|0;e=b+1|0;K=a[r]|0;a[e]=K;if(K<<24>>24==0){$=e;break}else{b=e;q=r}}}q=a[u]|0;a[$]=q;if(q<<24>>24==0){aa=$}else{q=$;b=u;while(1){r=b+1|0;e=q+1|0;K=a[r]|0;a[e]=K;if(K<<24>>24==0){aa=e;break}else{q=e;b=r}}}if(l){k=aa;n=o;continue d}a[aa]=58;b=y;q=aa;while(1){r=q+1|0;e=a[b]|0;a[r]=e;if(e<<24>>24==0){k=r;n=o;continue d}else{b=b+1|0;q=r}}break};default:{}}}while(0);a[k]=92;a[k+1|0]=p;k=k+2|0;n=o}a[k]=0;return m|0}function ck(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if((a|0)==0){return}if((b|0)>0){d=0;e=a;while(1){do{if((d|0)==0){f=c[e>>2]|0;if((f|0)==0){break}eF(f)}}while(0);f=c[e+8>>2]|0;do{if((f|0)!=0){g=c[e+12>>2]|0;if((g|0)==0){break}Cc[g&255](f)}}while(0);f=d+1|0;if((f|0)<(b|0)){d=f;e=e+56|0}else{break}}}eF(a);return}function dk(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if((d|0)==0){return}eF(c[d>>2]|0);e=d+72|0;do{if((a[d+82|0]|0)==0){f=c[e>>2]|0;g=b[d+76>>1]|0;h=g<<16>>16;if((f|0)==0){break}if(g<<16>>16>0){g=0;i=f;while(1){do{if((g|0)==0){j=c[i>>2]|0;if((j|0)==0){break}eF(j)}}while(0);j=c[i+8>>2]|0;do{if((j|0)!=0){k=c[i+12>>2]|0;if((k|0)==0){break}Cc[k&255](j)}}while(0);j=g+1|0;if((j|0)<(h|0)){g=j;i=i+56|0}else{break}}}eF(f)}else{i=c[e>>2]|0;if((i|0)==0){break}wj(i,1)}}while(0);eF(d);return}function ek(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;i=i+16|0;j=g|0;k=(c[d+16>>2]|0)+12|0;l=c[k>>2]|0;c[k>>2]=e;if((a[f+82|0]|0)!=0){rj(d,c[f+72>>2]|0,f);c[k>>2]=l;i=g;return}e=f+76|0;if((b[e>>1]|0)<1){i=g;return}iB(d,0);lB(d,c[f+8>>2]|0);m=a[f+80|0]|0;if((m|0)==116){h[j+8>>3]=+h[f+64>>3]+ +h[f+48>>3]*.5- +h[f+16>>3]}else if((m|0)==98){h[j+8>>3]=+h[f+32>>3]+(+h[f+64>>3]- +h[f+48>>3]*.5)- +h[f+16>>3]}else{h[j+8>>3]=+h[f+64>>3]+ +h[f+32>>3]*.5- +h[f+16>>3]}if((b[e>>1]|0)>0){m=f+72|0;n=f+56|0;o=j|0;p=j+8|0;q=f+40|0;f=0;r=c[m>>2]|0;do{s=a[r+(f*56|0)+48|0]|0;if((s|0)==108){h[o>>3]=+h[n>>3]- +h[q>>3]*.5}else if((s|0)==114){h[o>>3]=+h[n>>3]+ +h[q>>3]*.5}else{h[o>>3]=+h[n>>3]}kB(d,j,r+(f*56|0)|0);r=c[m>>2]|0;h[p>>3]=+h[p>>3]- +h[r+(f*56|0)+40>>3];f=f+1|0;}while((f|0)<(b[e>>1]|0))}jB(d);c[k>>2]=l;i=g;return}function fk(a,b){a=a|0;b=b|0;return bk(a,b,1)|0}function gk(a){a=a|0;return hk(a,0)|0}function hk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=c[43612]|0;if((e|0)==0){c[43610]=64;f=kk(64)|0;c[43612]=f;g=f}else{g=e}if((b|0)==0){h=g;a[h]=0;i=c[43612]|0;return i|0}e=d<<24>>24==0;d=b;b=g;g=0;f=0;while(1){j=a[d]|0;if(j<<24>>24==0){h=b;break}k=c[43610]|0;if((f|0)>(k-8|0)){l=k<<1;c[43610]=l;k=mk(c[43612]|0,l)|0;c[43612]=k;m=k+f|0;n=a[d]|0}else{m=b;n=j}a:do{switch(n<<24>>24){case 60:{o=4;p=86176;break};case 45:{q=23;break};case 32:{q=24;break};case 38:{if(!e){o=5;p=91328;break a}j=a[d+1|0]|0;b:do{if(j<<24>>24==35){k=a[d+2|0]|0;if((k<<24>>24|0)==120|(k<<24>>24|0)==88){l=d+3|0;while(1){r=a[l]|0;if((r-48&255)>>>0<10>>>0|(r-97&255)>>>0<6>>>0|(r-65&255)>>>0<6>>>0){l=l+1|0}else{s=r;break b}}}if((k-48&255)>>>0>=10>>>0){s=k;break}l=d+3|0;while(1){r=a[l]|0;if((r-48&255)>>>0<10>>>0){l=l+1|0}else{s=r;break}}}else{if(!((j-97&255)>>>0<26>>>0|(j-65&255)>>>0<26>>>0)){s=j;break}l=d+2|0;while(1){k=a[l]|0;if((k-97&255)>>>0<26>>>0|(k-65&255)>>>0<26>>>0){l=l+1|0}else{s=k;break}}}}while(0);if(s<<24>>24!=59){o=5;p=91328;break a}if((n<<24>>24|0)==60){o=4;p=86176}else if((n<<24>>24|0)==45){q=23}else if((n<<24>>24|0)==32){q=24}else if((n<<24>>24|0)==62){q=22}else{q=26}break};case 62:{q=22;break};default:{q=26}}}while(0);do{if((q|0)==22){q=0;o=4;p=81432}else if((q|0)==23){q=0;o=5;p=167680}else if((q|0)==24){q=0;if((g|0)==0){q=28;break}if((a[g]|0)==32){o=6;p=163496}else{q=28}}else if((q|0)==26){q=0;if((n<<24>>24|0)==34){o=6;p=159408;break}else if((n<<24>>24|0)!=39){q=28;break}o=5;p=154400}}while(0);if((q|0)==28){q=0;o=1;p=d}j=o+f|0;l=m;k=p;r=o;while(1){t=r-1|0;a[l]=a[k]|0;if((t|0)==0){break}else{l=l+1|0;k=k+1|0;r=t}}g=d;d=d+1|0;b=m+o|0;f=j}a[h]=0;i=c[43612]|0;return i|0}function ik(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=c[43608]|0;if((d|0)==0){c[43606]=64;e=kk(64)|0;c[43608]=e;f=e}else{f=d}if((b|0)==0){g=f;a[g]=0;h=c[43608]|0;return h|0}else{i=b;j=f;k=0}while(1){f=a[i]|0;if(f<<24>>24==0){g=j;break}b=c[43606]|0;if((k|0)>(b-8|0)){d=b<<1;c[43606]=d;b=mk(c[43608]|0,d)|0;c[43608]=b;l=b+k|0;m=a[i]|0}else{l=j;m=f}a:do{switch(m<<24>>24){case 39:{n=22;break};case 60:{o=4;p=86176;break};case 38:{f=a[i+1|0]|0;b:do{if(f<<24>>24==35){b=a[i+2|0]|0;if((b<<24>>24|0)==120|(b<<24>>24|0)==88){d=i+3|0;while(1){e=a[d]|0;if((e-48&255)>>>0<10>>>0|(e-97&255)>>>0<6>>>0|(e-65&255)>>>0<6>>>0){d=d+1|0}else{q=e;break b}}}if((b-48&255)>>>0>=10>>>0){q=b;break}d=i+3|0;while(1){e=a[d]|0;if((e-48&255)>>>0<10>>>0){d=d+1|0}else{q=e;break}}}else{if(!((f-97&255)>>>0<26>>>0|(f-65&255)>>>0<26>>>0)){q=f;break}d=i+2|0;while(1){b=a[d]|0;if((b-97&255)>>>0<26>>>0|(b-65&255)>>>0<26>>>0){d=d+1|0}else{q=b;break}}}}while(0);if(q<<24>>24!=59){o=5;p=91328;break a}if((m<<24>>24|0)==39){n=22}else if((m<<24>>24|0)==60){o=4;p=86176}else if((m<<24>>24|0)==62){n=20}else if((m<<24>>24|0)==34){n=21}else{n=23}break};case 62:{n=20;break};case 34:{n=21;break};default:{n=23}}}while(0);if((n|0)==20){n=0;o=4;p=81432}else if((n|0)==21){n=0;o=6;p=159408}else if((n|0)==22){n=0;o=5;p=154400}else if((n|0)==23){n=0;o=1;p=i}f=o+k|0;d=l;b=p;e=o;while(1){r=e-1|0;a[d]=a[b]|0;if((r|0)==0){break}else{d=d+1|0;b=b+1|0;e=r}}i=i+1|0;j=l+o|0;k=f}a[g]=0;h=c[43608]|0;return h|0}function jk(a){a=a|0;var b=0,d=0,e=0;if((a|0)==0){b=0;return b|0}d=dF(a)|0;if((d|0)==0){Ma(117496,14,1,c[o>>2]|0)|0;e=0}else{e=d}vF(e|0,0,a|0)|0;b=e;return b|0}function kk(a){a=a|0;var b=0,d=0;do{if((a|0)==0){b=0}else{d=dF(a)|0;if((d|0)!=0){b=d;break}Ma(117496,14,1,c[o>>2]|0)|0;b=0}}while(0);return b|0}function lk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=gF(a,da(d,b)|0)|0;if(!((f|0)!=0|(b|0)==0)){Ma(117496,14,1,c[o>>2]|0)|0;return f|0}if(e>>>0>=b>>>0){return f|0}vF(f+(da(e,d)|0)|0,0,da(b-e|0,d)|0)|0;return f|0}function mk(a,b){a=a|0;b=b|0;var d=0;d=gF(a,b)|0;if((d|0)!=0|(b|0)==0){return d|0}Ma(117496,14,1,c[o>>2]|0)|0;return d|0}function nk(b,d,f,g){b=b|0;d=d|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,na=0,oa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,ya=0,za=0,Ba=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,zd=0,Ad=0,Bd=0,Cd=0,Dd=0,Ed=0,Fd=0,Gd=0,Hd=0,Id=0,Jd=0,Kd=0,Ld=0,Md=0,Nd=0,Od=0,Pd=0,Qd=0,Rd=0,Sd=0,Td=0,Ud=0,Vd=0,Wd=0,Xd=0,Yd=0,Zd=0,_d=0,$d=0,ae=0,be=0,ce=0,de=0,ee=0,fe=0,ge=0,he=0,ie=0,je=0,ke=0,le=0,me=0,ne=0,oe=0,pe=0,qe=0,re=0,se=0,te=0,ue=0,ve=0,we=0,xe=0,ye=0,ze=0,Ae=0,Be=0,Ce=0,De=0.0;j=i;k=1;l=0;m=i;i=i+168|0;c[m>>2]=0;while(1)switch(k|0){case 1:n=b+8|0;if((a[213992]|0)==0){k=7;break}else{k=2;break};case 2:p=c[(c[n>>2]|0)+180>>2]|0;if((p|0)==0){q=0;r=0;k=6;break}else{s=0;t=0;w=p;k=3;break};case 3:x=s+1|0;y=c[w+8>>2]|0;z=c[y+180>>2]|0;if((c[z>>2]|0)==0){A=t;k=5;break}else{B=t;C=0;k=4;break};case 4:p=B+1|0;D=C+1|0;if((c[z+(D<<2)>>2]|0)==0){A=p;k=5;break}else{B=p;C=D;k=4;break};case 5:D=c[y+164>>2]|0;if((D|0)==0){q=x;r=A;k=6;break}else{s=x;t=A;w=D;k=3;break};case 6:pa(30,c[o>>2]|0,156448,(E=i,i=i+40|0,c[E>>2]=117448,c[E+8>>2]=q,c[E+16>>2]=r,c[E+24>>2]=f,c[E+32>>2]=d,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;Ca(2);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=7;break;case 7:c[53736]=b;c[53538]=0;c[53634]=0;c[53608]=0;D=c[(c[n>>2]|0)+180>>2]|0;if((D|0)==0){F=0;k=13;break}else{G=D;k=8;break};case 8:H=G+8|0;a[(c[H>>2]|0)+157|0]=0;I=(c[53608]|0)+1|0;c[53608]=I;D=c[H>>2]|0;if((c[c[D+180>>2]>>2]|0)==0){J=D;k=11;break}else{k=9;break};case 9:K=0;L=c[53634]|0;k=10;break;case 10:D=L+1|0;c[53634]=D;p=K+1|0;M=c[H>>2]|0;if((c[(c[M+180>>2]|0)+(p<<2)>>2]|0)==0){J=M;k=11;break}else{K=p;L=D;k=10;break};case 11:D=c[J+164>>2]|0;if((D|0)==0){k=12;break}else{G=D;k=8;break};case 12:F=I<<2;k=13;break;case 13:N=c[53504]|0;if((N|0)==0){k=15;break}else{k=14;break};case 14:D=wa(206,N|0,F|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;O=D;k=16;break;case 15:D=ma(54,F|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;O=D;k=16;break;case 16:c[53504]=O;c[53502]=0;P=c[53508]|0;if((P|0)==0){k=18;break}else{k=17;break};case 17:D=wa(206,P|0,c[53608]<<2|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Q=D;k=19;break;case 18:D=ma(54,c[53608]<<2|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Q=D;k=19;break;case 19:c[53508]=Q;c[53506]=0;D=c[(c[n>>2]|0)+180>>2]|0;if((D|0)==0){k=47;break}else{R=1;S=D;k=20;break};case 20:T=S+8|0;c[(c[T>>2]|0)+288>>2]=0;D=c[T>>2]|0;p=c[c[D+172>>2]>>2]|0;if((p|0)==0){U=4;V=R;k=25;break}else{W=0;X=R;Y=D;Z=p;k=21;break};case 21:p=Y+288|0;c[p>>2]=(c[p>>2]|0)+1;_=Z+8|0;c[(c[_>>2]|0)+160>>2]=0;c[(c[_>>2]|0)+164>>2]=-1;if((X|0)==0){$=0;k=23;break}else{k=22;break};case 22:p=c[Z>>2]&3;$=((c[(c[(c[((p|0)==2?Z:Z-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((p|0)==3?Z:Z+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0)<(e[(c[_>>2]|0)+170>>1]|0)?0:X;k=23;break;case 23:aa=W+1|0;p=c[T>>2]|0;D=c[(c[p+172>>2]|0)+(aa<<2)>>2]|0;if((D|0)==0){k=24;break}else{W=aa;X=$;Y=p;Z=D;k=21;break};case 24:U=(aa<<2)+4|0;V=$;k=25;break;case 25:D=ma(12,U|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;c[(c[T>>2]|0)+260>>2]=D;c[(c[T>>2]|0)+264>>2]=0;ba=c[(c[T>>2]|0)+180>>2]|0;ca=0;k=26;break;case 26:da=ca+1|0;if((c[ba+(ca<<2)>>2]|0)==0){k=27;break}else{ca=da;k=26;break};case 27:D=ma(12,da<<2|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;c[(c[T>>2]|0)+268>>2]=D;c[(c[T>>2]|0)+272>>2]=0;D=c[(c[T>>2]|0)+164>>2]|0;if((D|0)==0){k=28;break}else{R=V;S=D;k=20;break};case 28:if((V|0)==0){k=29;break}else{k=47;break};case 29:ea=ma(10,c[53608]|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;D=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((D|0)==0){k=30;break}else{fa=D;k=31;break};case 30:D=ma(30,ea|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;if((D|0)==0){ga=0;k=41;break}else{ha=0;ia=D;k=35;break};case 31:ja=fa+8|0;D=c[ja>>2]|0;if((c[D+288>>2]|0)==0){k=32;break}else{na=D;k=33;break};case 32:la(18,ea|0,fa|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;na=c[ja>>2]|0;k=33;break;case 33:D=c[na+164>>2]|0;if((D|0)==0){k=30;break}else{fa=D;k=31;break};case 34:D=ma(30,ea|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;if((D|0)==0){ga=oa;k=41;break}else{ha=oa;ia=D;k=35;break};case 35:qa=ia+8|0;c[(c[qa>>2]|0)+232>>2]=0;oa=ha+1|0;D=c[qa>>2]|0;p=c[c[D+172>>2]>>2]|0;if((p|0)==0){ra=D;k=37;break}else{sa=0;ta=D;ua=p;k=36;break};case 36:p=c[ta+232>>2]|0;D=(e[(c[ua+8>>2]|0)+170>>1]|0)+(c[(c[(c[((c[ua>>2]&3|0)==3?ua:ua+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0;c[ta+232>>2]=(p|0)>(D|0)?p:D;D=sa+1|0;p=c[qa>>2]|0;M=c[(c[p+172>>2]|0)+(D<<2)>>2]|0;if((M|0)==0){ra=p;k=37;break}else{sa=D;ta=p;ua=M;k=36;break};case 37:M=c[c[ra+180>>2]>>2]|0;if((M|0)==0){k=34;break}else{va=0;ya=M;k=38;break};case 38:za=ya;Ba=ya-32|0;M=(c[(c[((c[za>>2]&3|0)==2?ya:Ba)+28>>2]|0)+8>>2]|0)+288|0;p=c[M>>2]|0;c[M>>2]=p-1;if((p|0)<2){k=39;break}else{k=40;break};case 39:la(18,ea|0,c[((c[za>>2]&3|0)==2?ya:Ba)+28>>2]|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=40;break;case 40:p=va+1|0;M=c[(c[(c[qa>>2]|0)+180>>2]|0)+(p<<2)>>2]|0;if((M|0)==0){k=34;break}else{va=p;ya=M;k=38;break};case 41:if((ga|0)==(c[53608]|0)){k=46;break}else{k=42;break};case 42:pa(16,1,81392,(E=i,i=i+1|0,i=i+7&-8,c[E>>2]=0,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;M=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((M|0)==0){k=46;break}else{Da=M;k=43;break};case 43:Ea=Da+8|0;M=c[Ea>>2]|0;if((c[M+288>>2]|0)==0){Fa=M;k=45;break}else{k=44;break};case 44:M=ma(56,Da|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;p=c[(c[Ea>>2]|0)+288>>2]|0;pa(16,3,167640,(E=i,i=i+16|0,c[E>>2]=M,c[E+8>>2]=p,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;Fa=c[Ea>>2]|0;k=45;break;case 45:p=c[Fa+164>>2]|0;if((p|0)==0){k=46;break}else{Da=p;k=43;break};case 46:ka(120,ea|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=47;break;case 47:if((f|0)<1){k=48;break}else{k=54;break};case 48:p=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((p|0)==0){Ga=0;k=216;break}else{Ha=p;k=49;break};case 49:Ia=Ha+8|0;p=c[Ia>>2]|0;Ja=c[p+260>>2]|0;if((Ja|0)==0){Ka=p;k=51;break}else{k=50;break};case 50:ka(150,Ja|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Ka=c[Ia>>2]|0;k=51;break;case 51:La=c[Ka+268>>2]|0;if((La|0)==0){Ma=Ka;k=53;break}else{k=52;break};case 52:ka(150,La|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Ma=c[Ia>>2]|0;k=53;break;case 53:a[Ma+157|0]=0;p=c[(c[Ia>>2]|0)+164>>2]|0;if((p|0)==0){Ga=0;k=216;break}else{Ha=p;k=49;break};case 54:c[53534]=(g|0)>-1?g:30;Na=BF(178552,k,m)|0;k=217;break;case 217:if((Na|0)==0){k=55;break}else{Ga=2;k=216;break};case 55:if((c[53608]|0)<2){k=56;break}else{k=57;break};case 56:Oa=c[o>>2]|0;Pa=0;k=92;break;case 57:p=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((p|0)==0){k=58;break}else{Qa=p;k=59;break};case 58:if((c[53506]|0)>0){Ra=0;k=60;break}else{k=61;break};case 59:p=Qa+8|0;a[(c[p>>2]|0)+157|0]=0;c[c[(c[p>>2]|0)+268>>2]>>2]=0;c[c[(c[p>>2]|0)+260>>2]>>2]=0;c[(c[p>>2]|0)+272>>2]=0;c[(c[p>>2]|0)+264>>2]=0;M=c[(c[p>>2]|0)+164>>2]|0;if((M|0)==0){k=58;break}else{Qa=M;k=59;break};case 60:c[(c[(c[(c[53508]|0)+(Ra<<2)>>2]|0)+8>>2]|0)+164>>2]=-1;M=Ra+1|0;if((M|0)<(c[53506]|0)){Ra=M;k=60;break}else{k=61;break};case 61:c[53506]=0;c[53502]=0;M=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((M|0)==0){Sa=0;Ta=0;k=64;break}else{Ua=M;k=62;break};case 62:ma(36,Ua|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;M=c[(c[Ua+8>>2]|0)+164>>2]|0;if((M|0)!=0&(c[53506]|0)==0){Ua=M;k=62;break}else{k=63;break};case 63:Sa=c[53502]|0;Ta=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;k=64;break;case 64:if((Sa|0)<(c[53608]|0)){k=65;break}else{k=85;break};case 65:Va=(Ta|0)==0;if(Va){Ga=1;k=216;break}else{Wa=0;Xa=Ta;k=66;break};case 66:Ya=c[Xa+8>>2]|0;Za=c[Ya+180>>2]|0;M=c[Za>>2]|0;if((M|0)==0){_a=Wa;k=76;break}else{$a=0;ab=Wa;bb=M;k=67;break};case 67:cb=c[bb+8>>2]|0;if((c[cb+164>>2]|0)<0){k=68;break}else{db=ab;k=75;break};case 68:M=c[bb>>2]&3;eb=c[((M|0)==3?bb:bb+32|0)+28>>2]|0;fb=c[eb+8>>2]|0;gb=c[((M|0)==2?bb:bb-32|0)+28>>2]|0;hb=c[gb+8>>2]|0;ib=(a[hb+157|0]|0)==0;if((a[fb+157|0]|0)==0){k=70;break}else{k=69;break};case 69:if(ib){jb=eb;k=71;break}else{db=ab;k=75;break};case 70:if(ib){db=ab;k=75;break}else{jb=gb;k=71;break};case 71:if((jb|0)==0){db=ab;k=75;break}else{k=72;break};case 72:if((ab|0)==0){k=74;break}else{k=73;break};case 73:M=c[ab>>2]&3;if(((c[hb+232>>2]|0)-(c[fb+232>>2]|0)-(e[cb+170>>1]|0)|0)<((c[(c[(c[((M|0)==2?ab:ab-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((M|0)==3?ab:ab+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(e[(c[ab+8>>2]|0)+170>>1]|0)|0)){k=74;break}else{db=ab;k=75;break};case 74:db=bb;k=75;break;case 75:M=$a+1|0;p=c[Za+(M<<2)>>2]|0;if((p|0)==0){_a=db;k=76;break}else{$a=M;ab=db;bb=p;k=67;break};case 76:p=c[Ya+164>>2]|0;if((p|0)==0){k=77;break}else{Wa=_a;Xa=p;k=66;break};case 77:if((_a|0)==0){k=86;break}else{k=78;break};case 78:p=c[_a>>2]&3;kb=c[((p|0)==2?_a:_a-32|0)+28>>2]|0;lb=c[kb+8>>2]|0;mb=c[((p|0)==3?_a:_a+32|0)+28>>2]|0;nb=c[mb+8>>2]|0;p=(c[lb+232>>2]|0)-(c[nb+232>>2]|0)|0;M=e[(c[_a+8>>2]|0)+170>>1]|0;ob=p-M|0;if((p|0)==(M|0)){k=57;break}else{k=79;break};case 79:pb=(a[lb+157|0]|0)==0;if((a[nb+157|0]|0)==0){k=81;break}else{k=80;break};case 80:if(pb){qb=mb;k=83;break}else{k=82;break};case 81:if(pb){k=82;break}else{qb=kb;k=83;break};case 82:qb=0;k=83;break;case 83:rb=(qb|0)==(kb|0)?-ob|0:ob;if((Sa|0)>0){sb=0;k=84;break}else{k=57;break};case 84:M=(c[(c[(c[53504]|0)+(sb<<2)>>2]|0)+8>>2]|0)+232|0;c[M>>2]=(c[M>>2]|0)+rb;M=sb+1|0;if((M|0)<(c[53502]|0)){sb=M;k=84;break}else{k=57;break};case 85:pa(34,Ta|0,0,1)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;la(34,c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0,0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=56;break;case 86:if(Va){Ga=1;k=216;break}else{tb=Ta;k=87;break};case 87:ub=tb+8|0;M=c[ub>>2]|0;vb=c[M+260>>2]|0;if((vb|0)==0){wb=M;k=89;break}else{k=88;break};case 88:ka(150,vb|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;wb=c[ub>>2]|0;k=89;break;case 89:xb=c[wb+268>>2]|0;if((xb|0)==0){yb=wb;k=91;break}else{k=90;break};case 90:ka(150,xb|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;yb=c[ub>>2]|0;k=91;break;case 91:a[yb+157|0]=0;M=c[(c[ub>>2]|0)+164>>2]|0;if((M|0)==0){Ga=1;k=216;break}else{tb=M;k=87;break};case 92:zb=c[53538]|0;Ab=c[53506]|0;if((zb|0)<(Ab|0)){k=93;break}else{Bb=0;Cb=0;k=99;break};case 93:Db=c[53508]|0;Eb=0;Fb=0;Gb=zb;k=94;break;case 94:Hb=c[Db+(Gb<<2)>>2]|0;Ib=c[(c[Hb+8>>2]|0)+160>>2]|0;if((Ib|0)<0){k=95;break}else{Jb=Fb;Kb=Eb;k=98;break};case 95:if((Eb|0)==0){Lb=Hb;k=97;break}else{k=96;break};case 96:Lb=(c[(c[Eb+8>>2]|0)+160>>2]|0)>(Ib|0)?Hb:Eb;k=97;break;case 97:M=Fb+1|0;if((M|0)<(c[53534]|0)){Jb=M;Kb=Lb;k=98;break}else{Mb=Lb;k=106;break};case 98:M=Gb+1|0;c[53538]=M;if((M|0)<(Ab|0)){Eb=Kb;Fb=Jb;Gb=M;k=94;break}else{Bb=Kb;Cb=Jb;k=99;break};case 99:if((zb|0)>0){k=100;break}else{Mb=Bb;k=106;break};case 100:c[53538]=0;Nb=c[53508]|0;Ob=0;Pb=Bb;Qb=Cb;k=101;break;case 101:Rb=c[Nb+(Ob<<2)>>2]|0;Sb=c[(c[Rb+8>>2]|0)+160>>2]|0;if((Sb|0)<0){k=102;break}else{Tb=Qb;Ub=Pb;k=105;break};case 102:if((Pb|0)==0){Vb=Rb;k=104;break}else{k=103;break};case 103:Vb=(c[(c[Pb+8>>2]|0)+160>>2]|0)>(Sb|0)?Rb:Pb;k=104;break;case 104:M=Qb+1|0;if((M|0)<(c[53534]|0)){Tb=M;Ub=Vb;k=105;break}else{Mb=Vb;k=106;break};case 105:M=Ob+1|0;c[53538]=M;if((M|0)<(zb|0)){Ob=M;Pb=Ub;Qb=Tb;k=101;break}else{Mb=Ub;k=106;break};case 106:if((Mb|0)==0){Wb=Pa;k=147;break}else{k=107;break};case 107:Xb=Mb;M=c[Xb>>2]&3;Yb=Mb+32|0;p=c[((M|0)==3?Mb:Yb)+28>>2]|0;Zb=Mb-32|0;D=c[((M|0)==2?Mb:Zb)+28>>2]|0;M=(c[(c[p+8>>2]|0)+284>>2]|0)<(c[(c[D+8>>2]|0)+284>>2]|0);_b=M?p:D;c[53744]=0;c[53528]=2147483647;D=_b+8|0;c[53662]=c[(c[D>>2]|0)+280>>2];c[53664]=c[(c[D>>2]|0)+284>>2];if(M){k=109;break}else{k=108;break};case 108:ka(172,_b|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=110;break;case 109:ka(138,_b|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=110;break;case 110:$b=c[53744]|0;ac=$b;M=c[ac>>2]&3;bc=$b-32|0;cc=$b+32|0;dc=$b+8|0;ec=(c[(c[(c[((M|0)==2?$b:bc)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((M|0)==3?$b:cc)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(e[(c[dc>>2]|0)+170>>1]|0)|0;if((ec|0)>0){k=111;break}else{k=118;break};case 111:fc=c[Xb>>2]&3;gc=c[((fc|0)==3?Mb:Yb)+28>>2]|0;hc=c[gc+8>>2]|0;if(((c[hc+272>>2]|0)+(c[hc+264>>2]|0)|0)==1){k=112;break}else{k=113;break};case 112:la(10,gc|0,ec|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=118;break;case 113:ic=c[((fc|0)==2?Mb:Zb)+28>>2]|0;jc=c[ic+8>>2]|0;if(((c[jc+272>>2]|0)+(c[jc+264>>2]|0)|0)==1){k=114;break}else{k=115;break};case 114:la(10,ic|0,-ec|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=118;break;case 115:if((c[hc+284>>2]|0)<(c[jc+284>>2]|0)){k=116;break}else{k=117;break};case 116:la(10,gc|0,ec|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=118;break;case 117:la(10,ic|0,-ec|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=118;break;case 118:kc=Mb+8|0;lc=c[(c[kc>>2]|0)+160>>2]|0;M=c[ac>>2]&3;mc=(c[((M|0)==2?$b:bc)+28>>2]|0)+8|0;nc=c[((M|0)==3?$b:cc)+28>>2]|0;k=119;break;case 119:oc=nc+8|0;pc=c[oc>>2]|0;qc=c[(c[mc>>2]|0)+284>>2]|0;if((c[pc+280>>2]|0)>(qc|0)){k=121;break}else{k=120;break};case 120:if((qc|0)>(c[pc+284>>2]|0)){k=121;break}else{k=125;break};case 121:rc=c[pc+276>>2]|0;sc=rc;tc=rc;uc=rc+32|0;vc=(c[rc+8>>2]|0)+160|0;wc=c[vc>>2]|0;if((nc|0)==(c[((c[tc>>2]&3|0)==3?sc:uc)+28>>2]|0)){k=122;break}else{k=123;break};case 122:c[vc>>2]=wc+lc;k=124;break;case 123:c[vc>>2]=wc-lc;k=124;break;case 124:M=c[tc>>2]&3;D=c[((M|0)==3?sc:uc)+28>>2]|0;p=c[((M|0)==2?sc:rc-32|0)+28>>2]|0;nc=(c[(c[D+8>>2]|0)+284>>2]|0)>(c[(c[p+8>>2]|0)+284>>2]|0)?D:p;k=119;break;case 125:p=c[ac>>2]&3;xc=(c[((p|0)==3?$b:cc)+28>>2]|0)+8|0;yc=c[((p|0)==2?$b:bc)+28>>2]|0;k=126;break;case 126:zc=c[yc+8>>2]|0;Ac=c[(c[xc>>2]|0)+284>>2]|0;if((c[zc+280>>2]|0)>(Ac|0)){k=128;break}else{k=127;break};case 127:if((Ac|0)>(c[zc+284>>2]|0)){k=128;break}else{k=132;break};case 128:Bc=c[zc+276>>2]|0;Cc=Bc;Dc=Bc;Ec=Bc+32|0;Fc=(c[Bc+8>>2]|0)+160|0;Gc=c[Fc>>2]|0;if((yc|0)==(c[((c[Dc>>2]&3|0)==3?Cc:Ec)+28>>2]|0)){k=130;break}else{k=129;break};case 129:c[Fc>>2]=Gc+lc;k=131;break;case 130:c[Fc>>2]=Gc-lc;k=131;break;case 131:p=c[Dc>>2]&3;D=c[((p|0)==3?Cc:Ec)+28>>2]|0;M=c[((p|0)==2?Cc:Bc-32|0)+28>>2]|0;yc=(c[(c[D+8>>2]|0)+284>>2]|0)>(c[(c[M+8>>2]|0)+284>>2]|0)?D:M;k=126;break;case 132:if((yc|0)==(nc|0)){k=134;break}else{k=133;break};case 133:pa(16,1,102368,(E=i,i=i+1|0,i=i+7&-8,c[E>>2]=0,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;la(40,178552,1);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;return 0;case 134:c[(c[dc>>2]|0)+160>>2]=-lc;c[(c[kc>>2]|0)+160>>2]=0;c[(c[dc>>2]|0)+164>>2]=c[(c[kc>>2]|0)+164>>2];c[(c[53508]|0)+(c[(c[kc>>2]|0)+164>>2]<<2)>>2]=$b;c[(c[kc>>2]|0)+164>>2]=-1;Hc=(c[((c[Xb>>2]&3|0)==3?Mb:Yb)+28>>2]|0)+8|0;M=(c[Hc>>2]|0)+272|0;D=c[M>>2]|0;Ic=D-1|0;c[M>>2]=Ic;Jc=c[(c[Hc>>2]|0)+268>>2]|0;if((D|0)<1){Kc=0;k=137;break}else{Lc=0;k=136;break};case 135:if((Lc|0)<(Ic|0)){Lc=Mc;k=136;break}else{Kc=Mc;k=137;break};case 136:Mc=Lc+1|0;if((c[Jc+(Lc<<2)>>2]|0)==(Mb|0)){Kc=Lc;k=137;break}else{k=135;break};case 137:c[Jc+(Kc<<2)>>2]=c[Jc+(Ic<<2)>>2];c[(c[(c[Hc>>2]|0)+268>>2]|0)+(Ic<<2)>>2]=0;Nc=(c[((c[Xb>>2]&3|0)==2?Mb:Zb)+28>>2]|0)+8|0;D=(c[Nc>>2]|0)+264|0;M=c[D>>2]|0;Oc=M-1|0;c[D>>2]=Oc;Pc=c[(c[Nc>>2]|0)+260>>2]|0;if((M|0)<1){Qc=0;k=140;break}else{Rc=0;k=139;break};case 138:if((Rc|0)<(Oc|0)){Rc=Sc;k=139;break}else{Qc=Sc;k=140;break};case 139:Sc=Rc+1|0;if((c[Pc+(Rc<<2)>>2]|0)==(Mb|0)){Qc=Rc;k=140;break}else{k=138;break};case 140:c[Pc+(Qc<<2)>>2]=c[Pc+(Oc<<2)>>2];c[(c[(c[Nc>>2]|0)+260>>2]|0)+(Oc<<2)>>2]=0;M=(c[((c[ac>>2]&3|0)==3?$b:cc)+28>>2]|0)+8|0;D=(c[M>>2]|0)+272|0;p=c[D>>2]|0;c[D>>2]=p+1;c[(c[(c[M>>2]|0)+268>>2]|0)+(p<<2)>>2]=$b;p=(c[M>>2]|0)+268|0;c[(c[p>>2]|0)+(c[p+4>>2]<<2)>>2]=0;p=(c[((c[ac>>2]&3|0)==2?$b:bc)+28>>2]|0)+8|0;M=(c[p>>2]|0)+264|0;D=c[M>>2]|0;c[M>>2]=D+1;c[(c[(c[p>>2]|0)+260>>2]|0)+(D<<2)>>2]=$b;D=(c[p>>2]|0)+260|0;c[(c[D>>2]|0)+(c[D+4>>2]<<2)>>2]=0;D=c[oc>>2]|0;pa(34,nc|0,c[D+276>>2]|0,c[D+280>>2]|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Tc=Pa+1|0;if((a[213992]|0)==0){k=146;break}else{k=141;break};case 141:if(((Tc|0)%100|0|0)==0){k=142;break}else{k=146;break};case 142:Uc=(Tc|0)%1e3|0;if((Uc|0)==100){k=143;break}else{k=144;break};case 143:Aa(42,117448,17,1,Oa|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;pa(30,Oa|0,126920,(E=i,i=i+8|0,c[E>>2]=Tc,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;k=146;break;case 144:pa(30,Oa|0,126920,(E=i,i=i+8|0,c[E>>2]=Tc,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;if((Uc|0)==0){k=145;break}else{k=146;break};case 145:wa(100,10,Oa|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=146;break;case 146:if((Tc|0)<(f|0)){Pa=Tc;k=92;break}else{Wb=Tc;k=147;break};case 147:if((d|0)==1){k=148;break}else if((d|0)==2){k=180;break}else{k=197;break};case 148:c[53654]=2147483647;c[53658]=-2147483647;Vc=(c[53736]|0)+8|0;D=c[(c[Vc>>2]|0)+180>>2]|0;if((D|0)==0){Wc=2147483647;Xc=-2147483647;k=156;break}else{Yc=D;Zc=2147483647;_c=-2147483647;k=149;break};case 149:$c=Yc+8|0;ad=c[$c>>2]|0;if((a[ad+156|0]|0)==0){k=150;break}else{bd=Zc;cd=_c;dd=ad;k=151;break};case 150:D=c[ad+232>>2]|0;p=(Zc|0)<(D|0)?Zc:D;c[53654]=p;D=c[(c[$c>>2]|0)+232>>2]|0;M=(_c|0)>(D|0)?_c:D;c[53658]=M;bd=p;cd=M;dd=c[$c>>2]|0;k=151;break;case 151:M=c[dd+164>>2]|0;if((M|0)==0){k=152;break}else{Yc=M;Zc=bd;_c=cd;k=149;break};case 152:if((bd|0)==0){ed=cd;k=157;break}else{k=153;break};case 153:M=c[(c[Vc>>2]|0)+180>>2]|0;if((M|0)==0){Wc=bd;Xc=cd;k=156;break}else{fd=M;gd=bd;k=154;break};case 154:M=fd+8|0;p=(c[M>>2]|0)+232|0;c[p>>2]=(c[p>>2]|0)-gd;p=c[(c[M>>2]|0)+164>>2]|0;hd=c[53654]|0;if((p|0)==0){k=155;break}else{fd=p;gd=hd;k=154;break};case 155:Wc=hd;Xc=c[53658]|0;k=156;break;case 156:p=Xc-Wc|0;c[53658]=p;c[53654]=0;ed=p;k=157;break;case 157:id=ma(12,(ed<<2)+4|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;jd=id;if((c[53658]|0)<0){k=159;break}else{kd=0;k=158;break};case 158:c[jd+(kd<<2)>>2]=0;if((kd|0)<(c[53658]|0)){kd=kd+1|0;k=158;break}else{k=159;break};case 159:p=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((p|0)==0){k=179;break}else{ld=p;k=160;break};case 160:md=ld+8|0;nd=c[md>>2]|0;if((a[nd+156|0]|0)==0){k=161;break}else{od=nd;k=162;break};case 161:p=jd+(c[nd+232>>2]<<2)|0;c[p>>2]=(c[p>>2]|0)+1;od=c[md>>2]|0;k=162;break;case 162:p=c[od+164>>2]|0;if((p|0)==0){k=163;break}else{ld=p;k=160;break};case 163:p=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((p|0)==0){k=179;break}else{pd=p;k=164;break};case 164:qd=pd+8|0;rd=c[qd>>2]|0;if((a[rd+156|0]|0)==0){k=165;break}else{sd=rd;k=178;break};case 165:td=c[53658]|0;ud=c[rd+172>>2]|0;p=c[ud>>2]|0;if((p|0)==0){vd=0;wd=0;k=167;break}else{xd=0;yd=0;zd=0;Ad=p;k=166;break};case 166:p=c[Ad+8>>2]|0;M=(c[p+156>>2]|0)+zd|0;D=(e[p+170>>1]|0)+(c[(c[(c[((c[Ad>>2]&3|0)==3?Ad:Ad+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0;p=(yd|0)>(D|0)?yd:D;D=xd+1|0;Bd=c[ud+(D<<2)>>2]|0;if((Bd|0)==0){vd=p;wd=M;k=167;break}else{xd=D;yd=p;zd=M;Ad=Bd;k=166;break};case 167:Cd=c[rd+180>>2]|0;Bd=c[Cd>>2]|0;if((Bd|0)==0){Dd=td;Ed=0;k=169;break}else{Fd=0;Gd=td;Hd=0;Id=Bd;k=168;break};case 168:Bd=c[Id+8>>2]|0;M=(c[Bd+156>>2]|0)+Hd|0;p=(c[(c[(c[((c[Id>>2]&3|0)==2?Id:Id-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(e[Bd+170>>1]|0)|0;Bd=(Gd|0)<(p|0)?Gd:p;p=Fd+1|0;D=c[Cd+(p<<2)>>2]|0;if((D|0)==0){Dd=Bd;Ed=M;k=169;break}else{Fd=p;Gd=Bd;Hd=M;Id=D;k=168;break};case 169:Jd=(vd|0)<0?0:vd;if((wd|0)==(Ed|0)){k=170;break}else{Kd=rd;k=173;break};case 170:if((Jd|0)<(Dd|0)){Ld=Jd;Md=Jd;k=171;break}else{Nd=Jd;k=172;break};case 171:D=Md+1|0;M=(c[jd+(D<<2)>>2]|0)<(c[jd+(Ld<<2)>>2]|0)?D:Ld;if((D|0)<(Dd|0)){Ld=M;Md=D;k=171;break}else{Nd=M;k=172;break};case 172:M=jd+(c[rd+232>>2]<<2)|0;c[M>>2]=(c[M>>2]|0)-1;M=jd+(Nd<<2)|0;c[M>>2]=(c[M>>2]|0)+1;c[(c[qd>>2]|0)+232>>2]=Nd;Kd=c[qd>>2]|0;k=173;break;case 173:Od=c[Kd+260>>2]|0;if((Od|0)==0){Pd=Kd;k=175;break}else{k=174;break};case 174:ka(150,Od|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Pd=c[qd>>2]|0;k=175;break;case 175:Qd=c[Pd+268>>2]|0;if((Qd|0)==0){Rd=Pd;k=177;break}else{k=176;break};case 176:ka(150,Qd|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Rd=c[qd>>2]|0;k=177;break;case 177:a[Rd+157|0]=0;sd=c[qd>>2]|0;k=178;break;case 178:M=c[sd+164>>2]|0;if((M|0)==0){k=179;break}else{pd=M;k=164;break};case 179:ka(150,id|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=212;break;case 180:if((c[53506]|0)>0){Sd=0;k=181;break}else{k=191;break};case 181:Td=c[(c[53508]|0)+(Sd<<2)>>2]|0;if((c[(c[Td+8>>2]|0)+160>>2]|0)==0){k=182;break}else{k=190;break};case 182:Ud=Td;M=c[Ud>>2]&3;Vd=Td+32|0;D=c[((M|0)==3?Td:Vd)+28>>2]|0;Wd=Td-32|0;Bd=c[((M|0)==2?Td:Wd)+28>>2]|0;M=(c[(c[D+8>>2]|0)+284>>2]|0)<(c[(c[Bd+8>>2]|0)+284>>2]|0);Xd=M?D:Bd;c[53744]=0;c[53528]=2147483647;Bd=Xd+8|0;c[53662]=c[(c[Bd>>2]|0)+280>>2];c[53664]=c[(c[Bd>>2]|0)+284>>2];if(M){k=184;break}else{k=183;break};case 183:ka(172,Xd|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=185;break;case 184:ka(138,Xd|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=185;break;case 185:Yd=c[53744]|0;if((Yd|0)==0){k=190;break}else{k=186;break};case 186:M=c[Yd>>2]&3;Zd=(c[(c[(c[((M|0)==2?Yd:Yd-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((M|0)==3?Yd:Yd+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(e[(c[Yd+8>>2]|0)+170>>1]|0)|0;if((Zd|0)<2){k=190;break}else{k=187;break};case 187:M=c[Ud>>2]&3;_d=c[((M|0)==3?Td:Vd)+28>>2]|0;$d=c[((M|0)==2?Td:Wd)+28>>2]|0;if((c[(c[_d+8>>2]|0)+284>>2]|0)<(c[(c[$d+8>>2]|0)+284>>2]|0)){k=188;break}else{k=189;break};case 188:la(10,_d|0,(Zd|0)/2|0|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=190;break;case 189:la(10,$d|0,(Zd|0)/-2|0|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=190;break;case 190:M=Sd+1|0;if((M|0)<(c[53506]|0)){Sd=M;k=181;break}else{k=191;break};case 191:M=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((M|0)==0){k=212;break}else{ae=M;k=192;break};case 192:be=ae+8|0;M=c[be>>2]|0;ce=c[M+260>>2]|0;if((ce|0)==0){de=M;k=194;break}else{k=193;break};case 193:ka(150,ce|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;de=c[be>>2]|0;k=194;break;case 194:ee=c[de+268>>2]|0;if((ee|0)==0){fe=de;k=196;break}else{k=195;break};case 195:ka(150,ee|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;fe=c[be>>2]|0;k=196;break;case 196:a[fe+157|0]=0;M=c[(c[be>>2]|0)+164>>2]|0;if((M|0)==0){k=212;break}else{ae=M;k=192;break};case 197:c[53654]=2147483647;c[53658]=-2147483647;ge=c[53736]|0;he=ge+8|0;M=c[(c[he>>2]|0)+180>>2]|0;if((M|0)==0){ie=2147483647;je=-2147483647;ke=ge;k=205;break}else{le=M;me=2147483647;ne=-2147483647;k=198;break};case 198:oe=le+8|0;pe=c[oe>>2]|0;if((a[pe+156|0]|0)==0){k=199;break}else{qe=me;re=ne;se=pe;k=200;break};case 199:M=c[pe+232>>2]|0;Bd=(me|0)<(M|0)?me:M;c[53654]=Bd;M=c[(c[oe>>2]|0)+232>>2]|0;D=(ne|0)>(M|0)?ne:M;c[53658]=D;qe=Bd;re=D;se=c[oe>>2]|0;k=200;break;case 200:D=c[se+164>>2]|0;if((D|0)==0){k=201;break}else{le=D;me=qe;ne=re;k=198;break};case 201:if((qe|0)==0){te=ge;k=206;break}else{k=202;break};case 202:D=c[(c[he>>2]|0)+180>>2]|0;if((D|0)==0){ie=qe;je=re;ke=ge;k=205;break}else{ue=D;ve=qe;k=203;break};case 203:D=ue+8|0;Bd=(c[D>>2]|0)+232|0;c[Bd>>2]=(c[Bd>>2]|0)-ve;Bd=c[(c[D>>2]|0)+164>>2]|0;we=c[53654]|0;if((Bd|0)==0){k=204;break}else{ue=Bd;ve=we;k=203;break};case 204:ie=we;je=c[53658]|0;ke=c[53736]|0;k=205;break;case 205:c[53658]=je-ie;c[53654]=0;te=ke;k=206;break;case 206:Bd=c[(c[te+8>>2]|0)+180>>2]|0;if((Bd|0)==0){k=212;break}else{xe=Bd;k=207;break};case 207:ye=xe+8|0;Bd=c[ye>>2]|0;ze=c[Bd+260>>2]|0;if((ze|0)==0){Ae=Bd;k=209;break}else{k=208;break};case 208:ka(150,ze|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Ae=c[ye>>2]|0;k=209;break;case 209:Be=c[Ae+268>>2]|0;if((Be|0)==0){Ce=Ae;k=211;break}else{k=210;break};case 210:ka(150,Be|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Ce=c[ye>>2]|0;k=211;break;case 211:a[Ce+157|0]=0;Bd=c[(c[ye>>2]|0)+164>>2]|0;if((Bd|0)==0){k=212;break}else{xe=Bd;k=207;break};case 212:if((a[213992]|0)==0){Ga=0;k=216;break}else{k=213;break};case 213:if((Wb|0)>99){k=214;break}else{k=215;break};case 214:wa(100,10,Oa|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=215;break;case 215:Bd=c[53608]|0;D=c[53634]|0;De=+xa(2);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;pa(30,Oa|0,114976,(E=i,i=i+40|0,c[E>>2]=117448,c[E+8>>2]=Bd,c[E+16>>2]=D,c[E+24>>2]=Wb,h[E+32>>3]=De,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;Ga=0;k=216;break;case 216:i=j;return Ga|0;case-1:if((l|0)==54){Na=v;k=217}u=v=0;break}return 0}function ok(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=ew(a|0,108080)|0;if((d|0)==0){e=30}else{e=Rb(d|0)|0}return nk(a,b,c,e)|0}function pk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=a+8|0;a=(c[d>>2]|0)+232|0;c[a>>2]=(c[a>>2]|0)-b;a=c[d>>2]|0;e=c[c[a+268>>2]>>2]|0;if((e|0)==0){f=a}else{g=0;h=a;a=e;while(1){if((a|0)==(c[h+276>>2]|0)){i=h}else{pk(c[((c[a>>2]&3|0)==2?a:a-32|0)+28>>2]|0,b);i=c[d>>2]|0}e=g+1|0;j=c[(c[i+268>>2]|0)+(e<<2)>>2]|0;if((j|0)==0){f=i;break}else{g=e;h=i;a=j}}}a=c[c[f+260>>2]>>2]|0;if((a|0)==0){return}else{k=0;l=f;m=a}while(1){if((m|0)==(c[l+276>>2]|0)){n=l}else{pk(c[((c[m>>2]&3|0)==3?m:m+32|0)+28>>2]|0,b);n=c[d>>2]|0}a=k+1|0;f=c[(c[n+260>>2]|0)+(a<<2)>>2]|0;if((f|0)==0){break}else{k=a;l=n;m=f}}return}function qk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=a+8|0;c[(c[e>>2]|0)+276>>2]=b;c[(c[e>>2]|0)+280>>2]=d;a=c[e>>2]|0;f=c[c[a+268>>2]>>2]|0;if((f|0)==0){g=d;h=a}else{i=0;j=d;d=f;f=a;while(1){if((d|0)==(b|0)){k=j;l=f}else{a=qk(c[((c[d>>2]&3|0)==2?d:d-32|0)+28>>2]|0,d,j)|0;k=a;l=c[e>>2]|0}a=i+1|0;m=c[(c[l+268>>2]|0)+(a<<2)>>2]|0;if((m|0)==0){g=k;h=l;break}else{i=a;j=k;d=m;f=l}}}l=c[c[h+260>>2]>>2]|0;if((l|0)==0){n=g;o=h;p=o+284|0;q=n;c[p>>2]=q;r=n+1|0;return r|0}else{s=0;t=g;u=l;v=h}while(1){if((u|0)==(b|0)){w=t;x=v}else{h=qk(c[((c[u>>2]&3|0)==3?u:u+32|0)+28>>2]|0,u,t)|0;w=h;x=c[e>>2]|0}h=s+1|0;l=c[(c[x+260>>2]|0)+(h<<2)>>2]|0;if((l|0)==0){n=w;o=x;break}else{s=h;t=w;u=l;v=x}}p=o+284|0;q=n;c[p>>2]=q;r=n+1|0;return r|0}function rk(a){a=a|0;var b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a+8|0;a=c[b>>2]|0;d=c[c[a+180>>2]>>2]|0;if((d|0)==0){f=a}else{g=0;h=a;a=d;while(1){d=c[a+8>>2]|0;do{if((c[d+164>>2]|0)<0){i=c[a>>2]&3;j=c[(c[((i|0)==2?a:a-32|0)+28>>2]|0)+8>>2]|0;k=c[j+284>>2]|0;if(!((c[53662]|0)>(k|0)|(k|0)>(c[53664]|0))){break}k=(c[j+232>>2]|0)-(c[(c[(c[((i|0)==3?a:a+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(e[d+170>>1]|0)|0;if(!((k|0)<(c[53528]|0)|(c[53744]|0)==0)){break}c[53744]=a;c[53528]=k}else{k=c[((c[a>>2]&3|0)==2?a:a-32|0)+28>>2]|0;if((c[(c[k+8>>2]|0)+284>>2]|0)>=(c[h+284>>2]|0)){break}rk(k)}}while(0);d=g+1|0;k=c[b>>2]|0;i=c[(c[k+180>>2]|0)+(d<<2)>>2]|0;if((i|0)==0){f=k;break}else{g=d;h=k;a=i}}}a=c[c[f+260>>2]>>2]|0;h=c[53528]|0;if((a|0)!=0&(h|0)>0){l=0;m=f;n=a;o=h}else{return}while(1){h=c[((c[n>>2]&3|0)==3?n:n+32|0)+28>>2]|0;if((c[(c[h+8>>2]|0)+284>>2]|0)<(c[m+284>>2]|0)){rk(h);p=c[b>>2]|0;q=c[53528]|0}else{p=m;q=o}h=l+1|0;a=c[(c[p+260>>2]|0)+(h<<2)>>2]|0;if((a|0)!=0&(q|0)>0){l=h;m=p;n=a;o=q}else{break}}return}function sk(a){a=a|0;var b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a+8|0;a=c[b>>2]|0;d=c[c[a+172>>2]>>2]|0;if((d|0)==0){f=a}else{g=0;h=a;a=d;while(1){d=c[a+8>>2]|0;do{if((c[d+164>>2]|0)<0){i=c[a>>2]&3;j=c[(c[((i|0)==3?a:a+32|0)+28>>2]|0)+8>>2]|0;k=c[j+284>>2]|0;if(!((c[53662]|0)>(k|0)|(k|0)>(c[53664]|0))){break}k=(c[(c[(c[((i|0)==2?a:a-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[j+232>>2]|0)-(e[d+170>>1]|0)|0;if(!((k|0)<(c[53528]|0)|(c[53744]|0)==0)){break}c[53744]=a;c[53528]=k}else{k=c[((c[a>>2]&3|0)==3?a:a+32|0)+28>>2]|0;if((c[(c[k+8>>2]|0)+284>>2]|0)>=(c[h+284>>2]|0)){break}sk(k)}}while(0);d=g+1|0;k=c[b>>2]|0;j=c[(c[k+172>>2]|0)+(d<<2)>>2]|0;if((j|0)==0){f=k;break}else{g=d;h=k;a=j}}}a=c[c[f+268>>2]>>2]|0;h=c[53528]|0;if((a|0)!=0&(h|0)>0){l=0;m=f;n=a;o=h}else{return}while(1){h=c[((c[n>>2]&3|0)==2?n:n-32|0)+28>>2]|0;if((c[(c[h+8>>2]|0)+284>>2]|0)<(c[m+284>>2]|0)){sk(h);p=c[b>>2]|0;q=c[53528]|0}else{p=m;q=o}h=l+1|0;a=c[(c[p+268>>2]|0)+(h<<2)>>2]|0;if((a|0)!=0&(q|0)>0){l=h;m=p;n=a;o=q}else{break}}return}function tk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;d=a+8|0;a=c[d>>2]|0;e=c[c[a+268>>2]>>2]|0;if((e|0)==0){f=a}else{g=0;h=e;e=a;while(1){if((h|0)==(b|0)){i=e}else{tk(c[((c[h>>2]&3|0)==2?h:h-32|0)+28>>2]|0,h);i=c[d>>2]|0}a=g+1|0;j=c[(c[i+268>>2]|0)+(a<<2)>>2]|0;if((j|0)==0){f=i;break}else{g=a;h=j;e=i}}}i=c[c[f+260>>2]>>2]|0;if((i|0)!=0){e=0;h=i;i=f;while(1){if((h|0)==(b|0)){k=i}else{tk(c[((c[h>>2]&3|0)==3?h:h+32|0)+28>>2]|0,h);k=c[d>>2]|0}f=e+1|0;g=c[(c[k+260>>2]|0)+(f<<2)>>2]|0;if((g|0)==0){break}else{e=f;h=g;i=k}}}if((b|0)==0){return}k=c[b>>2]&3;i=c[((k|0)==3?b:b+32|0)+28>>2]|0;h=c[i+8>>2]|0;if((c[h+276>>2]|0)==(b|0)){l=1;m=i;n=h}else{h=c[((k|0)==2?b:b-32|0)+28>>2]|0;l=-1;m=h;n=c[h+8>>2]|0}h=c[n+180>>2]|0;k=c[h>>2]|0;if((k|0)==0){o=0}else{i=c[n+280>>2]|0;e=n+284|0;if((l|0)>0){d=0;g=0;f=k;while(1){j=c[f>>2]&3;a=c[((j|0)==3?f:f+32|0)+28>>2]|0;if((a|0)==(m|0)){p=c[((j|0)==2?f:f-32|0)+28>>2]|0}else{p=a}a=c[(c[p+8>>2]|0)+284>>2]|0;do{if((i|0)>(a|0)){q=21}else{if((a|0)>(c[e>>2]|0)){q=21;break}r=c[f+8>>2]|0;if((c[r+164>>2]|0)>-1){s=c[r+160>>2]|0}else{s=0}t=1;u=s-(c[r+156>>2]|0)|0}}while(0);if((q|0)==21){q=0;t=0;u=c[(c[f+8>>2]|0)+156>>2]|0}a=(c[((j|0)==2?f:f-32|0)+28>>2]|0)==(m|0)?1:-1;r=(((t?a:-a|0)|0)<0?-u|0:u)+g|0;a=d+1|0;v=c[h+(a<<2)>>2]|0;if((v|0)==0){o=r;break}else{d=a;g=r;f=v}}}else{f=0;g=0;d=k;while(1){k=c[d>>2]&3;u=c[((k|0)==3?d:d+32|0)+28>>2]|0;t=(u|0)==(m|0);if(t){w=c[((k|0)==2?d:d-32|0)+28>>2]|0}else{w=u}u=c[(c[w+8>>2]|0)+284>>2]|0;do{if((i|0)>(u|0)){q=38}else{if((u|0)>(c[e>>2]|0)){q=38;break}k=c[d+8>>2]|0;if((c[k+164>>2]|0)>-1){x=c[k+160>>2]|0}else{x=0}y=1;z=x-(c[k+156>>2]|0)|0}}while(0);if((q|0)==38){q=0;y=0;z=c[(c[d+8>>2]|0)+156>>2]|0}u=t?1:-1;j=(((y?u:-u|0)|0)<0?-z|0:z)+g|0;u=f+1|0;k=c[h+(u<<2)>>2]|0;if((k|0)==0){o=j;break}else{f=u;g=j;d=k}}}}d=c[n+172>>2]|0;g=c[d>>2]|0;if((g|0)==0){A=o}else{f=c[n+280>>2]|0;h=n+284|0;if((l|0)>0){l=0;n=o;z=g;while(1){y=c[z>>2]&3;x=c[((y|0)==3?z:z+32|0)+28>>2]|0;if((x|0)==(m|0)){B=c[((y|0)==2?z:z-32|0)+28>>2]|0}else{B=x}x=c[(c[B+8>>2]|0)+284>>2]|0;do{if((f|0)>(x|0)){q=32}else{if((x|0)>(c[h>>2]|0)){q=32;break}e=c[z+8>>2]|0;if((c[e+164>>2]|0)>-1){C=c[e+160>>2]|0}else{C=0}D=1;E=C-(c[e+156>>2]|0)|0}}while(0);if((q|0)==32){q=0;D=0;E=c[(c[z+8>>2]|0)+156>>2]|0}x=(c[((y|0)==2?z:z-32|0)+28>>2]|0)==(m|0)?1:-1;t=(((D?x:-x|0)|0)<0?-E|0:E)+n|0;x=l+1|0;e=c[d+(x<<2)>>2]|0;if((e|0)==0){A=t;break}else{l=x;n=t;z=e}}}else{z=0;n=o;o=g;while(1){g=c[o>>2]&3;l=c[((g|0)==3?o:o+32|0)+28>>2]|0;E=(l|0)==(m|0);if(E){F=c[((g|0)==2?o:o-32|0)+28>>2]|0}else{F=l}l=c[(c[F+8>>2]|0)+284>>2]|0;do{if((f|0)>(l|0)){q=47}else{if((l|0)>(c[h>>2]|0)){q=47;break}g=c[o+8>>2]|0;if((c[g+164>>2]|0)>-1){G=c[g+160>>2]|0}else{G=0}H=1;I=G-(c[g+156>>2]|0)|0}}while(0);if((q|0)==47){q=0;H=0;I=c[(c[o+8>>2]|0)+156>>2]|0}l=E?1:-1;y=(((H?l:-l|0)|0)<0?-I|0:I)+n|0;l=z+1|0;g=c[d+(l<<2)>>2]|0;if((g|0)==0){A=y;break}else{z=l;n=y;o=g}}}}c[(c[b+8>>2]|0)+160>>2]=A;return}function uk(b){b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=b+8|0;b=c[d>>2]|0;f=c[c[b+180>>2]>>2]|0;a:do{if((f|0)==0){g=b}else{h=0;i=f;j=b;b:while(1){k=i;l=c[k>>2]&3;m=i-32|0;n=c[(c[((l|0)==2?i:m)+28>>2]|0)+8>>2]|0;do{if((a[n+157|0]|0)==0){if(((c[n+232>>2]|0)-(c[(c[(c[((l|0)==3?i:i+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0)!=(e[(c[i+8>>2]|0)+170>>1]|0)){o=j;break}vk(i);if((c[53506]|0)==((c[53608]|0)-1|0)){p=1;q=15;break b}if((uk(c[((c[k>>2]&3|0)==2?i:m)+28>>2]|0)|0)!=0){p=1;q=15;break b}o=c[d>>2]|0}else{o=j}}while(0);m=h+1|0;k=c[(c[o+180>>2]|0)+(m<<2)>>2]|0;if((k|0)==0){g=o;break a}else{h=m;i=k;j=o}}if((q|0)==15){return p|0}}}while(0);o=c[c[g+172>>2]>>2]|0;if((o|0)==0){p=0;return p|0}else{r=0;s=o;t=g}c:while(1){g=s;o=c[g>>2]&3;b=s+32|0;f=c[(c[((o|0)==3?s:b)+28>>2]|0)+8>>2]|0;do{if((a[f+157|0]|0)==0){if(((c[(c[(c[((o|0)==2?s:s-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[f+232>>2]|0)|0)!=(e[(c[s+8>>2]|0)+170>>1]|0)){u=t;break}vk(s);if((c[53506]|0)==((c[53608]|0)-1|0)){p=1;q=15;break c}if((uk(c[((c[g>>2]&3|0)==3?s:b)+28>>2]|0)|0)!=0){p=1;q=15;break c}u=c[d>>2]|0}else{u=t}}while(0);b=r+1|0;g=c[(c[u+172>>2]|0)+(b<<2)>>2]|0;if((g|0)==0){p=0;q=15;break}else{r=b;s=g;t=u}}if((q|0)==15){return p|0}return 0}function vk(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=(c[b+8>>2]|0)+164|0;if((c[e>>2]|0)>-1){Fv(1,96648,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;rc(178552,1)}c[e>>2]=c[53506];e=c[53506]|0;c[53506]=e+1;c[(c[53508]|0)+(e<<2)>>2]=b;e=b;g=c[e>>2]|0;h=b+32|0;j=c[((g&3|0)==3?b:h)+28>>2]|0;if((a[(c[j+8>>2]|0)+157|0]|0)==0){k=c[53502]|0;c[53502]=k+1;c[(c[53504]|0)+(k<<2)>>2]=j;l=c[e>>2]|0}else{l=g}g=b-32|0;j=c[((l&3|0)==2?b:g)+28>>2]|0;if((a[(c[j+8>>2]|0)+157|0]|0)==0){k=c[53502]|0;c[53502]=k+1;c[(c[53504]|0)+(k<<2)>>2]=j;m=c[e>>2]|0}else{m=l}l=(c[((m&3|0)==3?b:h)+28>>2]|0)+8|0;a[(c[l>>2]|0)+157|0]=1;h=(c[l>>2]|0)+272|0;m=c[h>>2]|0;c[h>>2]=m+1;c[(c[(c[l>>2]|0)+268>>2]|0)+(m<<2)>>2]=b;m=(c[l>>2]|0)+268|0;c[(c[m>>2]|0)+(c[m+4>>2]<<2)>>2]=0;m=c[l>>2]|0;if((c[(c[m+180>>2]|0)+((c[m+272>>2]|0)-1<<2)>>2]|0)==0){Fv(1,91288,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;rc(178552,1)}m=(c[((c[e>>2]&3|0)==2?b:g)+28>>2]|0)+8|0;a[(c[m>>2]|0)+157|0]=1;g=(c[m>>2]|0)+264|0;e=c[g>>2]|0;c[g>>2]=e+1;c[(c[(c[m>>2]|0)+260>>2]|0)+(e<<2)>>2]=b;b=(c[m>>2]|0)+260|0;c[(c[b>>2]|0)+(c[b+4>>2]<<2)>>2]=0;b=c[m>>2]|0;if((c[(c[b+172>>2]|0)+((c[b+264>>2]|0)-1<<2)>>2]|0)==0){Fv(1,86104,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;rc(178552,1)}else{i=d;return}}function wk(a){a=+a;var b=0.0;if((c[53492]|0)==0){b=a;return+b}b=+h[21426]-a;return+b}function xk(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0,L=0.0;g=i;i=i+1024|0;j=c[(c[(c[d+52>>2]|0)+8>>2]|0)+4>>2]|0;c[43802]=j;k=d+8|0;if((c[53492]|0)!=0){l=c[k>>2]|0;m=+h[l+40>>3]+ +h[l+24>>3];h[21426]=m;h[21427]=m/72.0}l=c[k>>2]|0;m=+h[l+32>>3];n=+h[l+40>>3];o=+h[b+352>>3];b=g|0;l=e;Oc[j&255](l,117392)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=o,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=m/72.0,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=n/72.0,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;a[212960]=10;Oc[c[43802]&255](l,212960)|0;k=ux(d)|0;if((k|0)!=0){p=k;do{k=p+8|0;if((a[(c[k>>2]|0)+118|0]|0)==0){q=p|0;r=Dy($w(q)|0)|0;Oc[c[43802]&255](l,126896)|0;Oc[c[43802]&255](l,r)|0;r=c[k>>2]|0;n=+h[r+24>>3];m=+h[r+16>>3]/72.0;Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=m,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;if((c[53492]|0)==0){s=n}else{s=+h[21426]-n}Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=s/72.0,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;if((a[(c[(c[k>>2]|0)+104>>2]|0)+82|0]|0)==0){r=Hx(q)|0;t=dy(r,c[c[(c[k>>2]|0)+104>>2]>>2]|0)|0;u=Dy(t)|0;fy(r,t)|0;v=u}else{v=Dy(fw(q,c[53614]|0)|0)|0}n=+h[(c[k>>2]|0)+32>>3];Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=n,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;n=+h[(c[k>>2]|0)+40>>3];Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=n,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,v)|0;u=Im(q,c[53582]|0,114968)|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,u)|0;u=c[c[(c[k>>2]|0)+8>>2]>>2]|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,u)|0;u=Im(q,c[53644]|0,108072)|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,u)|0;u=Im(q,c[53632]|0,213368)|0;if((a[u]|0)==0){w=Im(q,c[53644]|0,96632)|0}else{w=u}Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,w)|0;a[212960]=10;Oc[c[43802]&255](l,212960)|0}p=vx(d,p)|0;}while((p|0)!=0)}p=ux(d)|0;if((p|0)==0){x=c[43802]|0;y=Oc[x&255](l,167632)|0;i=g;return}w=f<<24>>24==0;f=p;do{p=mw(d,f)|0;if((p|0)!=0){v=p;do{if(w){z=213368;A=213368}else{p=v|0;u=ew(p,91272)|0;q=ew(p,86088)|0;z=(q|0)!=0?q:213368;A=(u|0)!=0?u:213368}u=v+8|0;q=c[u>>2]|0;p=c[q+8>>2]|0;do{if((p|0)==0){B=q}else{k=c[p+4>>2]|0;if((k|0)>0){t=c[p>>2]|0;r=0;C=0;while(1){D=(c[t+(C*48|0)+4>>2]|0)+r|0;E=C+1|0;if((E|0)<(k|0)){r=D;C=E}else{F=D;break}}}else{F=0}Oc[c[43802]&255](l,81384)|0;C=v;yk(e,c[((c[C>>2]&3|0)==3?v:v+32|0)+28>>2]|0,A);yk(e,c[((c[C>>2]&3|0)==2?v:v-32|0)+28>>2]|0,z);Oc[c[43802]&255](l,156424)|0;nb(b|0,113688,(j=i,i=i+8|0,c[j>>2]=F,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;C=c[u>>2]|0;r=c[C+8>>2]|0;if((c[r+4>>2]|0)>0){G=0;H=r;I=C}else{B=C;break}while(1){C=c[H>>2]|0;r=c[C+(G*48|0)>>2]|0;k=c[C+(G*48|0)+4>>2]|0;if((k|0)>0){C=0;do{s=+h[r+(C<<4)+8>>3];n=+h[r+(C<<4)>>3]/72.0;Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=n,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;if((c[53492]|0)==0){J=s}else{J=+h[21426]-s}Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=J/72.0,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;C=C+1|0;}while((C|0)<(k|0));K=c[u>>2]|0}else{K=I}k=G+1|0;C=c[K+8>>2]|0;if((k|0)<(c[C+4>>2]|0)){G=k;H=C;I=K}else{B=K;break}}}}while(0);if((c[B+96>>2]|0)!=0){p=Hx(c[((c[v>>2]&3|0)==3?v:v+32|0)+28>>2]|0)|0;q=dy(p,c[c[(c[u>>2]|0)+96>>2]>>2]|0)|0;C=Dy(q)|0;fy(p,q)|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,C)|0;C=c[(c[u>>2]|0)+96>>2]|0;s=+h[C+64>>3];n=+h[C+56>>3]/72.0;Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=n,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;if((c[53492]|0)==0){L=s}else{L=+h[21426]-s}Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=L/72.0,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;}C=v|0;q=Im(C,c[53760]|0,114968)|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,q)|0;q=Im(C,c[53816]|0,108072)|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,q)|0;a[212960]=10;Oc[c[43802]&255](l,212960)|0;v=ow(d,v)|0;}while((v|0)!=0)}f=vx(d,f)|0;}while((f|0)!=0);x=c[43802]|0;y=Oc[x&255](l,167632)|0;i=g;return}function yk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=d|0;if((a[(c[d+8>>2]|0)+118|0]|0)==0){g=Dy($w(f)|0)|0}else{d=Hx(f)|0;h=dy(d,(gb($w(f)|0,58)|0)+1|0)|0;f=Dy(h)|0;fy(d,h)|0;g=f}f=b;Oc[c[43802]&255](f,156424)|0;Oc[c[43802]&255](f,g)|0;if((e|0)==0){return}if((a[e]|0)==0){return}g=Dy(e)|0;Oc[c[43802]&255](f,113176)|0;Oc[c[43802]&255](f,g)|0;return}function zk(d,f,g){d=d|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0,H=0,I=0,J=0.0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0.0,na=0,oa=0,pa=0,qa=0,ra=0.0,sa=0,ta=0,ua=0,va=0.0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0.0,Fa=0,Ga=0.0,Ha=0,Ia=0.0,Ja=0.0;j=i;i=i+2064|0;k=j+2048|0;l=d+8|0;m=(e[(c[l>>2]|0)+170>>1]|0)>>>0>2>>>0;Zh(1);if((c[53492]|0)!=0){n=c[l>>2]|0;o=+h[n+40>>3]+ +h[n+24>>3];h[21426]=o;h[21427]=o/72.0}Iv(k,1024,j+1024|0);en(d,1,163480,213368)|0;en(d,1,159400,213368)|0;c[53574]=en(d,1,154328,213368)|0;c[53618]=en(d,1,151232,213368)|0;en(d,2,163480,213368)|0;n=a[(c[l>>2]|0)+113|0]|0;if((n&16)==0){p=n}else{en(d,1,148272,213368)|0;p=a[(c[l>>2]|0)+113|0]|0}if((p&1)==0){q=p}else{en(d,2,145120,213368)|0;q=a[(c[l>>2]|0)+113|0]|0}if((q&32)==0){r=q}else{en(d,2,148272,213368)|0;r=a[(c[l>>2]|0)+113|0]|0}if((r&2)==0){s=r}else{en(d,2,142144,213368)|0;s=a[(c[l>>2]|0)+113|0]|0}if((s&4)==0){t=s}else{en(d,2,139048,213368)|0;t=a[(c[l>>2]|0)+113|0]|0}if((t&8)==0){u=0;v=0;w=0}else{t=en(d,0,145120,213368)|0;s=en(d,0,136496,213368)|0;u=en(d,0,133672,213368)|0;v=s;w=t}t=en(d,0,131552,213368)|0;s=ux(d)|0;if((s|0)==0){x=0;y=0}else{r=j|0;q=k+4|0;p=k+8|0;n=k|0;z=s;s=0;A=0;while(1){B=z+8|0;C=c[B>>2]|0;o=+h[C+16>>3];D=(c[53492]|0)!=0;if(m){if(D){E=+h[21426]- +h[C+24>>3]}else{E=+h[C+24>>3]}F=+h[(c[C+132>>2]|0)+16>>3]*72.0;nb(r|0,129264,(G=i,i=i+24|0,h[G>>3]=o,h[G+8>>3]=E,h[G+16>>3]=F,G)|0)|0;i=G;Lv(k,r)|0;if((e[(c[l>>2]|0)+170>>1]|0)>>>0>3>>>0){H=3;do{nb(r|0,126056,(G=i,i=i+8|0,h[G>>3]=+h[(c[(c[B>>2]|0)+132>>2]|0)+(H<<3)>>3]*72.0,G)|0)|0;i=G;Lv(k,r)|0;H=H+1|0;}while((H|0)<(e[(c[l>>2]|0)+170>>1]|0))}H=c[q>>2]|0;if(H>>>0<(c[p>>2]|0)>>>0){I=H}else{Jv(k,1)|0;I=c[q>>2]|0}a[I]=0;H=c[n>>2]|0;c[q>>2]=H;gw(z|0,163480,H)|0}else{if(D){J=+h[21426]- +h[C+24>>3]}else{J=+h[C+24>>3]}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=o,h[G+8>>3]=J,G)|0)|0;i=G;gw(z|0,163480,r)|0}nb(r|0,121728,(G=i,i=i+8|0,h[G>>3]=+h[(c[B>>2]|0)+80>>3]/72.0,G)|0)|0;i=G;H=z|0;hw(H,c[53618]|0,r)|0;K=c[B>>2]|0;nb(r|0,121728,(G=i,i=i+8|0,h[G>>3]=(+h[K+88>>3]+ +h[K+96>>3])/72.0,G)|0)|0;i=G;hw(H,c[53574]|0,r)|0;K=c[B>>2]|0;L=c[K+108>>2]|0;do{if((L|0)==0){M=K}else{if((a[L+81|0]|0)==0){M=K;break}F=+h[L+64>>3];if((c[53492]|0)==0){N=F}else{N=+h[21426]-F}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=+h[L+56>>3],h[G+8>>3]=N,G)|0)|0;i=G;gw(H,148272,r)|0;M=c[B>>2]|0}}while(0);do{if((Ya(c[c[M+8>>2]>>2]|0,120856)|0)==0){Ak(z,c[M+12>>2]|0,k);Nv(k)|0;L=c[q>>2]|0;if(L>>>0<(c[p>>2]|0)>>>0){O=L}else{Jv(k,1)|0;O=c[q>>2]|0}a[O]=0;L=c[n>>2]|0;c[q>>2]=L;gw(H,159400,L)|0}else{if((c[53580]|0)==0){break}if((tl(z)|0)<<24>>24==0){break}L=c[(c[B>>2]|0)+12>>2]|0;K=L+8|0;C=c[K>>2]|0;if((C|0)<3){D=ew(H,120104)|0;if((D|0)==0){P=8}else{P=Rb(D|0)|0}D=(P|0)<3?8:P;if((D|0)>0){Q=D;R=45}}else{Q=C;R=45}if((R|0)==45){R=0;C=L+44|0;o=+(Q|0);L=0;do{if((L|0)>0){D=c[q>>2]|0;if(D>>>0<(c[p>>2]|0)>>>0){S=D}else{Jv(k,1)|0;S=c[q>>2]|0}c[q>>2]=S+1;a[S]=32}if((c[K>>2]|0)>2){D=c[C>>2]|0;if((c[53492]|0)==0){T=+h[D+(L<<4)+8>>3]/72.0}else{T=+h[21427]- +h[D+(L<<4)+8>>3]/72.0}nb(r|0,119288,(G=i,i=i+16|0,h[G>>3]=+h[D+(L<<4)>>3]/72.0,h[G+8>>3]=T,G)|0)|0;i=G}else{D=c[B>>2]|0;F=+(L|0)/o*3.141592653589793*2.0;U=+h[D+32>>3]*.5*+V(F);if((c[53492]|0)==0){X=+h[D+40>>3]*.5*+W(F)}else{X=+h[21427]- +h[D+40>>3]*.5*+W(F)}nb(r|0,119288,(G=i,i=i+16|0,h[G>>3]=U,h[G+8>>3]=X,G)|0)|0;i=G}Lv(k,r)|0;L=L+1|0;}while((L|0)<(Q|0))}L=c[53580]|0;C=c[q>>2]|0;if(C>>>0<(c[p>>2]|0)>>>0){Y=C}else{Jv(k,1)|0;Y=c[q>>2]|0}a[Y]=0;C=c[n>>2]|0;c[q>>2]=C;hw(H,L,C)|0}}while(0);do{if((c[53522]|0)>0){H=mw(d,z)|0;if((H|0)==0){Z=A;_=s;break}else{$=H;aa=s;ba=A}while(1){H=$+8|0;B=c[H>>2]|0;do{if((a[B+112|0]|0)==6){ca=ba;da=aa}else{C=c[B+8>>2]|0;if((C|0)==0){ca=ba;da=aa;break}if((c[C+4>>2]|0)>0){C=0;L=aa;K=ba;D=B;while(1){if((C|0)>0){ea=c[q>>2]|0;if(ea>>>0<(c[p>>2]|0)>>>0){fa=ea}else{Jv(k,1)|0;fa=c[q>>2]|0}c[q>>2]=fa+1;a[fa]=59;ga=c[H>>2]|0}else{ga=D}ea=c[ga+8>>2]|0;ha=c[ea>>2]|0;if((c[ha+(C*48|0)+8>>2]|0)==0){ia=L;ja=ga;ka=ea;la=ha}else{if((c[53492]|0)==0){ma=+h[ha+(C*48|0)+24>>3]}else{ma=+h[21426]- +h[ha+(C*48|0)+24>>3]}nb(r|0,118616,(G=i,i=i+16|0,h[G>>3]=+h[ha+(C*48|0)+16>>3],h[G+8>>3]=ma,G)|0)|0;i=G;Lv(k,r)|0;ha=c[H>>2]|0;ea=c[ha+8>>2]|0;ia=1;ja=ha;ka=ea;la=c[ea>>2]|0}if((c[la+(C*48|0)+12>>2]|0)==0){na=K;oa=ja;pa=ka;qa=la}else{if((c[53492]|0)==0){ra=+h[la+(C*48|0)+40>>3]}else{ra=+h[21426]- +h[la+(C*48|0)+40>>3]}nb(r|0,117672,(G=i,i=i+16|0,h[G>>3]=+h[la+(C*48|0)+32>>3],h[G+8>>3]=ra,G)|0)|0;i=G;Lv(k,r)|0;ea=c[H>>2]|0;ha=c[ea+8>>2]|0;na=1;oa=ea;pa=ha;qa=c[ha>>2]|0}if((c[qa+(C*48|0)+4>>2]|0)>0){ha=0;ea=oa;while(1){if((ha|0)>0){sa=c[q>>2]|0;if(sa>>>0<(c[p>>2]|0)>>>0){ta=sa}else{Jv(k,1)|0;ta=c[q>>2]|0}c[q>>2]=ta+1;a[ta]=32;ua=c[H>>2]|0}else{ua=ea}sa=c[(c[c[ua+8>>2]>>2]|0)+(C*48|0)>>2]|0;o=+h[sa+(ha<<4)+8>>3];if((c[53492]|0)==0){va=o}else{va=+h[21426]-o}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=+h[sa+(ha<<4)>>3],h[G+8>>3]=va,G)|0)|0;i=G;Lv(k,r)|0;sa=ha+1|0;wa=c[H>>2]|0;xa=c[wa+8>>2]|0;if((sa|0)<(c[(c[xa>>2]|0)+(C*48|0)+4>>2]|0)){ha=sa;ea=wa}else{ya=wa;za=xa;break}}}else{ya=oa;za=pa}ea=C+1|0;if((ea|0)<(c[za+4>>2]|0)){C=ea;L=ia;K=na;D=ya}else{Aa=ia;Ba=na;break}}}else{Aa=aa;Ba=ba}D=$|0;K=c[q>>2]|0;if(K>>>0<(c[p>>2]|0)>>>0){Ca=K}else{Jv(k,1)|0;Ca=c[q>>2]|0}a[Ca]=0;K=c[n>>2]|0;c[q>>2]=K;gw(D,163480,K)|0;K=c[H>>2]|0;L=c[K+96>>2]|0;if((L|0)==0){Da=K}else{o=+h[L+64>>3];if((c[53492]|0)==0){Ea=o}else{Ea=+h[21426]-o}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=+h[L+56>>3],h[G+8>>3]=Ea,G)|0)|0;i=G;gw(D,145120,r)|0;Da=c[H>>2]|0}L=c[Da+108>>2]|0;do{if((L|0)==0){Fa=Da}else{if((a[L+81|0]|0)==0){Fa=Da;break}o=+h[L+64>>3];if((c[53492]|0)==0){Ga=o}else{Ga=+h[21426]-o}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=+h[L+56>>3],h[G+8>>3]=Ga,G)|0)|0;i=G;gw(D,148272,r)|0;Fa=c[H>>2]|0}}while(0);L=c[Fa+100>>2]|0;if((L|0)==0){Ha=Fa}else{o=+h[L+64>>3];if((c[53492]|0)==0){Ia=o}else{Ia=+h[21426]-o}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=+h[L+56>>3],h[G+8>>3]=Ia,G)|0)|0;i=G;gw(D,142144,r)|0;Ha=c[H>>2]|0}L=c[Ha+104>>2]|0;if((L|0)==0){ca=Ba;da=Aa;break}o=+h[L+64>>3];if((c[53492]|0)==0){Ja=o}else{Ja=+h[21426]-o}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=+h[L+56>>3],h[G+8>>3]=Ja,G)|0)|0;i=G;gw(D,139048,r)|0;ca=Ba;da=Aa}}while(0);H=ow(d,$)|0;if((H|0)==0){Z=ca;_=da;break}else{$=H;aa=da;ba=ca}}}else{Z=A;_=s}}while(0);H=vx(d,z)|0;if((H|0)==0){x=_;y=Z;break}else{z=H;s=_;A=Z}}}Bk(d,t,w,v,u);Mv(k);if((b[(c[l>>2]|0)+128>>1]&1)==0){c[f>>2]=x;c[g>>2]=y;Zh(0);i=j;return}dn(d);c[f>>2]=x;c[g>>2]=y;Zh(0);i=j;return}function Ak(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0;e=i;i=i+1024|0;f=b+48|0;g=c[f>>2]|0;if((g|0)==0){j=e|0;k=c[a+8>>2]|0;l=+h[k+16>>3];if((c[53492]|0)==0){m=+h[k+24>>3];n=+h[b+40>>3]+m;o=+h[b+24>>3]+m}else{m=+h[k+24>>3];n=+h[21426]-(+h[b+40>>3]+m);o=+h[21426]-(+h[b+24>>3]+m)}m=+h[b+32>>3]+l;nb(j|0,114432,(k=i,i=i+32|0,h[k>>3]=+h[b+16>>3]+l,h[k+8>>3]=o,h[k+16>>3]=m,h[k+24>>3]=n,k)|0)|0;i=k;Lv(d,j)|0;p=c[f>>2]|0}else{p=g}if((p|0)<=0){i=e;return}p=b+56|0;b=0;do{Ak(a,c[(c[p>>2]|0)+(b<<2)>>2]|0,d);b=b+1|0;}while((b|0)<(c[f>>2]|0));i=e;return}function Bk(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0;j=i;i=i+1024|0;k=j|0;l=b+8|0;m=c[l>>2]|0;if((c[53492]|0)==0){n=+h[m+40>>3];o=+h[m+24>>3]}else{p=+h[21426];n=p- +h[m+40>>3];o=p- +h[m+24>>3]}p=+h[m+32>>3];nb(k|0,116760,(q=i,i=i+32|0,h[q>>3]=+h[m+16>>3],h[q+8>>3]=o,h[q+16>>3]=p,h[q+24>>3]=n,q)|0)|0;i=q;m=b|0;hw(m,d,k)|0;b=c[l>>2]|0;r=c[b+12>>2]|0;do{if((r|0)==0){s=b}else{if((a[c[r>>2]|0]|0)==0){s=b;break}n=+h[r+64>>3];if((c[53492]|0)==0){t=n}else{t=+h[21426]-n}nb(k|0,123584,(q=i,i=i+16|0,h[q>>3]=+h[r+56>>3],h[q+8>>3]=t,q)|0)|0;i=q;hw(m,e,k)|0;u=c[(c[l>>2]|0)+12>>2]|0;n=+h[u+32>>3];nb(k|0,115808,(q=i,i=i+8|0,h[q>>3]=+h[u+24>>3]/72.0,q)|0)|0;i=q;hw(m,f,k)|0;nb(k|0,115808,(q=i,i=i+8|0,h[q>>3]=n/72.0,q)|0)|0;i=q;hw(m,g,k)|0;s=c[l>>2]|0}}while(0);if((c[s+172>>2]|0)<1){i=j;return}else{v=1;w=s}while(1){Bk(c[(c[w+176>>2]|0)+(v<<2)>>2]|0,d,e,f,g);s=c[l>>2]|0;if((v|0)<(c[s+172>>2]|0)){v=v+1|0;w=s}else{break}}i=j;return}function Ck(a){a=a|0;var b=0;b=i;i=i+16|0;zk(a,b+8|0,b|0);i=b;return}function Dk(){return $g(21464,c[43330]|0)|0}function Ek(a){a=a|0;Vg(a)|0;return}function Fk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=b;b=i;i=i+8|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];e=c[a>>2]|0;f=c[b>>2]|0;g=c[b+4>>2]|0;b=jk(16)|0;h=b+8|0;c[h>>2]=f;c[h+4>>2]=g;Hc[e&63](a,b,1)|0;i=d;return}function Gk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=c[a>>2]|0;f=jk(16)|0;g=f+8|0;c[g>>2]=b;c[g+4>>2]=d;Hc[e&63](a,f,1)|0;return}function Hk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=b;b=i;i=i+8|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];e=d|0;f=b;b=e+8|0;g=c[f+4>>2]|0;c[b>>2]=c[f>>2];c[b+4>>2]=g;g=(Hc[c[a>>2]&63](a,e,4)|0)!=0|0;i=d;return g|0}function Ik(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e|0;c[f+8>>2]=b;c[f+12>>2]=d;d=(Hc[c[a>>2]&63](a,f,4)|0)!=0|0;i=e;return d|0}function Jk(a){a=a|0;return bh(a)|0}function Kk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=jk((bh(a)|0)<<3)|0;d=Zg(a)|0;if((d|0)==0){return b|0}else{e=d;f=b}while(1){d=e+8|0;a=f;g=c[d+4>>2]|0;c[a>>2]=c[d>>2];c[a+4>>2]=g;g=c[e>>2]|0;if((g|0)==0){break}else{e=g;f=f+8|0}}return b|0}function Lk(){var a=0;a=kk(40)|0;tF(a|0,21504,36)|0;c[a+36>>2]=0;return $g(a,c[43330]|0)|0}function Mk(a){a=a|0;Hc[c[a>>2]&63](a,0,64)|0;return}function Nk(a){a=a|0;var b=0,d=0,e=0;b=c[a+4>>2]|0;Vg(a)|0;a=c[b+36>>2]|0;if((a|0)==0){d=b;eF(d);return}else{e=a}while(1){a=c[e>>2]|0;eF(e);if((a|0)==0){break}else{e=a}}d=b;eF(d);return}function Ok(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+24|0;g=f|0;c[g+8>>2]=b;c[g+12>>2]=d;c[g+16>>2]=e;e=c[(Hc[c[a>>2]&63](a,g,1)|0)+16>>2]|0;i=f;return e|0}function Pk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;a=d+36|0;d=c[a>>2]|0;if((d|0)==0){e=kk(20)|0}else{c[a>>2]=c[d>>2];e=d}d=b+8|0;a=e+8|0;f=c[d+4>>2]|0;c[a>>2]=c[d>>2];c[a+4>>2]=f;c[e+16>>2]=c[b+16>>2];return e|0}function Qk(a,b,d){a=a|0;b=b|0;d=d|0;a=d+36|0;c[b>>2]=c[a>>2];c[a>>2]=b;return}function Rk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=c[b>>2]|0;a=c[d>>2]|0;do{if((e|0)>(a|0)){f=1}else{if((e|0)<(a|0)){f=-1;break}g=c[b+4>>2]|0;h=c[d+4>>2]|0;if((g|0)>(h|0)){f=1;break}f=((g|0)<(h|0))<<31>>31}}while(0);return f|0}function Sk(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function Tk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;i=i+240|0;e=d|0;f=d+16|0;g=d+32|0;j=d+48|0;k=d+64|0;l=d+80|0;m=d+96|0;n=d+112|0;o=d+128|0;p=d+144|0;q=d+160|0;r=a+8|0;a=c[r>>2]|0;s=+h[a+16>>3];t=+h[a+24>>3];u=+h[a+32>>3];v=+h[a+40>>3];if((b-1|0)>>>0<2>>>0){a=o;w=p;x=o|0;h[x>>3]=s;y=o+8|0;h[y>>3]=v;si(p,o,(c[53548]|0)*90|0);c[a>>2]=c[w>>2];c[a+4>>2]=c[w+4>>2];c[a+8>>2]=c[w+8>>2];c[a+12>>2]=c[w+12>>2];h[x>>3]=+h[x>>3]- +h[26781];h[y>>3]=+h[y>>3]- +h[26782];y=q;c[y>>2]=c[a>>2];c[y+4>>2]=c[a+4>>2];c[y+8>>2]=c[a+8>>2];c[y+12>>2]=c[a+12>>2];a=k;y=l;x=k|0;h[x>>3]=u;w=k+8|0;h[w>>3]=t;si(l,k,(c[53548]|0)*90|0);c[a>>2]=c[y>>2];c[a+4>>2]=c[y+4>>2];c[a+8>>2]=c[y+8>>2];c[a+12>>2]=c[y+12>>2];h[x>>3]=+h[x>>3]- +h[26781];h[w>>3]=+h[w>>3]- +h[26782];w=d+192|0;c[w>>2]=c[a>>2];c[w+4>>2]=c[a+4>>2];c[w+8>>2]=c[a+8>>2];c[w+12>>2]=c[a+12>>2];a=q+16|0;c[a>>2]=c[w>>2];c[a+4>>2]=c[w+4>>2];c[a+8>>2]=c[w+8>>2];c[a+12>>2]=c[w+12>>2]}else{w=e;a=f;x=e|0;h[x>>3]=s;y=e+8|0;h[y>>3]=t;si(f,e,(c[53548]|0)*90|0);c[w>>2]=c[a>>2];c[w+4>>2]=c[a+4>>2];c[w+8>>2]=c[a+8>>2];c[w+12>>2]=c[a+12>>2];h[x>>3]=+h[x>>3]- +h[26781];h[y>>3]=+h[y>>3]- +h[26782];y=q;c[y>>2]=c[w>>2];c[y+4>>2]=c[w+4>>2];c[y+8>>2]=c[w+8>>2];c[y+12>>2]=c[w+12>>2];w=g;y=j;x=g|0;h[x>>3]=u;a=g+8|0;h[a>>3]=v;si(j,g,(c[53548]|0)*90|0);c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];h[x>>3]=+h[x>>3]- +h[26781];h[a>>3]=+h[a>>3]- +h[26782];a=d+208|0;c[a>>2]=c[w>>2];c[a+4>>2]=c[w+4>>2];c[a+8>>2]=c[w+8>>2];c[a+12>>2]=c[w+12>>2];w=q+16|0;c[w>>2]=c[a>>2];c[w+4>>2]=c[a+4>>2];c[w+8>>2]=c[a+8>>2];c[w+12>>2]=c[a+12>>2]}a=(c[r>>2]|0)+16|0;w=q;c[a>>2]=c[w>>2];c[a+4>>2]=c[w+4>>2];c[a+8>>2]=c[w+8>>2];c[a+12>>2]=c[w+12>>2];c[a+16>>2]=c[w+16>>2];c[a+20>>2]=c[w+20>>2];c[a+24>>2]=c[w+24>>2];c[a+28>>2]=c[w+28>>2];w=c[r>>2]|0;a=c[w+12>>2]|0;if((a|0)==0){z=w}else{w=a+56|0;v=+h[a+64>>3];a=m;q=n;x=m|0;h[x>>3]=+h[w>>3];y=m+8|0;h[y>>3]=v;si(n,m,(c[53548]|0)*90|0);c[a>>2]=c[q>>2];c[a+4>>2]=c[q+4>>2];c[a+8>>2]=c[q+8>>2];c[a+12>>2]=c[q+12>>2];h[x>>3]=+h[x>>3]- +h[26781];h[y>>3]=+h[y>>3]- +h[26782];y=d+224|0;c[y>>2]=c[a>>2];c[y+4>>2]=c[a+4>>2];c[y+8>>2]=c[a+8>>2];c[y+12>>2]=c[a+12>>2];a=w;c[a>>2]=c[y>>2];c[a+4>>2]=c[y+4>>2];c[a+8>>2]=c[y+8>>2];c[a+12>>2]=c[y+12>>2];z=c[r>>2]|0}if((c[z+172>>2]|0)<1){i=d;return}else{A=1;B=z}while(1){Tk(c[(c[B+176>>2]|0)+(A<<2)>>2]|0,b);z=c[r>>2]|0;if((A|0)<(c[z+172>>2]|0)){A=A+1|0;B=z}else{break}}i=d;return}function Uk(e,f){e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0,za=0,Aa=0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0.0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0.0,La=0.0,Na=0.0,Oa=0.0,Pa=0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0,Ua=0,Va=0.0,Wa=0.0,Xa=0.0,Ya=0.0,Za=0.0,_a=0.0,$a=0.0,ab=0,bb=0.0,cb=0.0,db=0.0,eb=0.0,fb=0.0,gb=0.0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0.0,ob=0.0,pb=0.0,qb=0.0,rb=0,sb=0,tb=0.0,ub=0.0,vb=0.0,wb=0.0,xb=0,yb=0.0,zb=0.0,Ab=0,Bb=0,Cb=0.0,Db=0.0,Eb=0.0,Fb=0.0,Gb=0,Hb=0,Ib=0.0,Jb=0.0,Kb=0.0,Mb=0.0,Nb=0.0,Ob=0.0,Pb=0,Qb=0.0,Rb=0.0,Sb=0,Tb=0,Ub=0.0,Vb=0.0,Wb=0.0,Xb=0.0,Yb=0,Zb=0,_b=0.0,$b=0.0,ac=0.0,bc=0.0,cc=0.0,dc=0.0,ec=0,fc=0,hc=0.0,ic=0.0,jc=0,kc=0,lc=0.0,mc=0.0,nc=0.0,oc=0.0,pc=0,qc=0.0,rc=0.0,sc=0.0,tc=0.0,uc=0.0,vc=0.0,wc=0.0,xc=0.0,yc=0.0,zc=0.0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0.0,Kc=0.0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0.0,Sc=0.0;g=i;i=i+1608|0;j=g|0;k=g+16|0;l=g+32|0;m=g+48|0;n=g+64|0;p=g+80|0;q=g+96|0;r=g+112|0;s=g+128|0;t=g+144|0;u=g+160|0;v=g+176|0;w=g+192|0;x=g+208|0;y=g+224|0;z=g+240|0;A=g+256|0;B=g+272|0;C=g+288|0;D=g+304|0;E=g+320|0;F=g+336|0;G=g+352|0;H=g+368|0;I=g+384|0;J=g+400|0;K=g+416|0;L=g+432|0;M=g+472|0;N=g+488|0;O=g+504|0;P=g+544|0;Q=g+584|0;R=e+8|0;c[53548]=c[(c[R>>2]|0)+116>>2]&3;S=c[(c[R>>2]|0)+116>>2]&1;a[214952]=S;if(S<<24>>24==0){Wk(e)}else{Vk(e)}S=O;T=P;U=c[R>>2]|0;V=b[U+128>>1]&14;W=d[U+113|0]|0;if((W&54|0)==0){if(!((W&1|0)==0|(c[53746]|0)!=0)){X=6}}else{X=6}do{if((X|0)==6){W=ux(e)|0;if((W|0)==0){Y=0;Z=0;_=0}else{U=(V|0)!=0|0;$=0;aa=0;ba=0;ca=W;while(1){W=c[(c[ca+8>>2]|0)+108>>2]|0;do{if((W|0)==0){da=ba;ea=$}else{if((a[W+81|0]|0)==0){da=ba;ea=$+1|0;break}else{da=ba+1|0;ea=$;break}}}while(0);W=mw(e,ca)|0;if((W|0)==0){fa=aa;ga=da}else{ha=aa;ia=da;ja=W;while(1){W=c[ja+8>>2]|0;ka=c[W+108>>2]|0;do{if((ka|0)==0){la=ia;ma=ha}else{if((a[ka+81|0]|0)==0){la=ia;ma=ha+U|0;break}else{la=ia+1|0;ma=ha;break}}}while(0);ka=c[W+100>>2]|0;do{if((ka|0)==0){na=la;oa=ma}else{if((a[ka+81|0]|0)==0){na=la;oa=ma+U|0;break}else{na=la+1|0;oa=ma;break}}}while(0);ka=c[W+104>>2]|0;do{if((ka|0)==0){pa=na;qa=oa}else{if((a[ka+81|0]|0)==0){pa=na;qa=oa+U|0;break}else{pa=na+1|0;qa=oa;break}}}while(0);ka=c[W+96>>2]|0;do{if((ka|0)==0){ra=pa;sa=qa}else{if((a[ka+81|0]|0)==0){ra=pa;sa=qa+U|0;break}else{ra=pa+1|0;sa=qa;break}}}while(0);ka=ow(e,ja)|0;if((ka|0)==0){fa=sa;ga=ra;break}else{ha=sa;ia=ra;ja=ka}}}ja=vx(e,ca)|0;if((ja|0)==0){Y=ea;Z=fa;_=ga;break}else{$=ea;aa=fa;ba=ga;ca=ja}}}if((a[(c[R>>2]|0)+113|0]&8)==0){ta=0}else{ta=Yk(e)|0}ca=Y+Z|0;if((ca|0)==0){break}ba=Z+_+ta+(Lw(e)|0)|0;aa=jk(ba*40|0)|0;$=aa;U=jk(ca*40|0)|0;ja=U;ia=ux(e)|0;if((ia|0)==0){ua=-2147483647.0;va=-2147483647.0;wa=2147483647.0;xa=2147483647.0;ya=$}else{ha=(V|0)==0;ka=N|0;W=N+8|0;za=M|0;Aa=M+8|0;Ba=-2147483647.0;Ca=-2147483647.0;Da=2147483647.0;Ea=2147483647.0;Fa=$;Ga=ja;Ha=ia;while(1){ia=(a[214952]|0)==0;Ia=Ha+8|0;Ja=c[Ia>>2]|0;if(ia){Ka=+h[Ja+32>>3]*72.0;h[Fa+16>>3]=Ka;La=+h[(c[Ia>>2]|0)+40>>3]*72.0;h[Fa+24>>3]=La;Na=Ka;Oa=La}else{La=+h[Ja+40>>3]*72.0;h[Fa+16>>3]=La;Ka=+h[(c[Ia>>2]|0)+32>>3]*72.0;h[Fa+24>>3]=Ka;Na=La;Oa=Ka}Ja=Fa;Pa=(c[Ia>>2]|0)+16|0;c[Ja>>2]=c[Pa>>2];c[Ja+4>>2]=c[Pa+4>>2];c[Ja+8>>2]=c[Pa+8>>2];c[Ja+12>>2]=c[Pa+12>>2];Pa=Fa|0;Ka=+h[Pa>>3]-Na*.5;h[Pa>>3]=Ka;Pa=Fa+8|0;La=+h[Pa>>3]-Oa*.5;h[Pa>>3]=La;Qa=Ea<Ka?Ea:Ka;Ra=Da<La?Da:La;Sa=Na+Ka;Ka=Oa+La;La=Ca>Sa?Ca:Sa;Sa=Ba>Ka?Ba:Ka;Pa=c[(c[Ia>>2]|0)+108>>2]|0;do{if((Pa|0)==0){Ta=Ga;Ua=Fa;Va=Qa;Wa=Ra;Xa=La;Ya=Sa}else{if((a[Pa+81|0]|0)==0){if(ia){Ia=Ga;Ja=Pa+24|0;c[Ia>>2]=c[Ja>>2];c[Ia+4>>2]=c[Ja+4>>2];c[Ia+8>>2]=c[Ja+8>>2];c[Ia+12>>2]=c[Ja+12>>2]}else{h[Ga>>3]=+h[Pa+32>>3];h[Ga+8>>3]=+h[Pa+24>>3]}c[Ga+32>>2]=Pa;a[Ga+36|0]=0;c[Fa+32>>2]=Ga;Ta=Ga+40|0;Ua=Fa;Va=Qa;Wa=Ra;Xa=La;Ya=Sa;break}else{Ja=Fa+40|0;Ia=Pa+24|0;if(ia){Ka=+h[Ia>>3];h[Fa+56>>3]=Ka;Za=+h[Pa+32>>3];h[Fa+64>>3]=Za;_a=Ka;$a=Za}else{Za=+h[Pa+32>>3];h[Fa+56>>3]=Za;Ka=+h[Ia>>3];h[Fa+64>>3]=Ka;_a=Za;$a=Ka}Ia=Ja;ab=Pa+56|0;c[Ia>>2]=c[ab>>2];c[Ia+4>>2]=c[ab+4>>2];c[Ia+8>>2]=c[ab+8>>2];c[Ia+12>>2]=c[ab+12>>2];ab=Ja|0;Ka=+h[ab>>3]-_a*.5;h[ab>>3]=Ka;ab=Fa+48|0;Za=+h[ab>>3]-$a*.5;h[ab>>3]=Za;bb=_a+Ka;cb=$a+Za;Ta=Ga;Ua=Ja;Va=Qa<Ka?Qa:Ka;Wa=Ra<Za?Ra:Za;Xa=La>bb?La:bb;Ya=Sa>cb?Sa:cb;break}}}while(0);Pa=Ua+40|0;ia=mw(e,Ha)|0;if((ia|0)==0){db=Ya;eb=Xa;fb=Wa;gb=Va;hb=Pa;ib=Ta}else{Sa=Ya;La=Xa;Ra=Wa;Qa=Va;Ja=Pa;Pa=Ta;ab=ia;while(1){ia=ab+8|0;Ia=c[ia>>2]|0;jb=c[Ia+96>>2]|0;if((jb|0)==0){kb=Pa;lb=Ja;mb=Qa;ob=Ra;pb=La;qb=Sa;rb=Ia}else{do{if((a[jb+81|0]|0)==0){if(ha){sb=Pa;tb=Qa;ub=Ra;vb=La;wb=Sa;break}mm(M,e,ab);cb=+h[za>>3];bb=+h[Aa>>3];vF(Ja+16|0,0,16)|0;h[Ja>>3]=cb;h[Ja+8>>3]=bb;if((a[214952]|0)==0){Ia=Pa;xb=jb+24|0;c[Ia>>2]=c[xb>>2];c[Ia+4>>2]=c[xb+4>>2];c[Ia+8>>2]=c[xb+8>>2];c[Ia+12>>2]=c[xb+12>>2]}else{h[Pa>>3]=+h[jb+32>>3];h[Pa+8>>3]=+h[jb+24>>3]}c[Pa+32>>2]=jb;a[Pa+36|0]=0;c[Ja+32>>2]=Pa;sb=Pa+40|0;tb=Qa;ub=Ra;vb=La;wb=Sa}else{xb=jb+24|0;if((a[214952]|0)==0){bb=+h[xb>>3];h[Ja+16>>3]=bb;cb=+h[jb+32>>3];h[Ja+24>>3]=cb;yb=bb;zb=cb}else{cb=+h[jb+32>>3];h[Ja+16>>3]=cb;bb=+h[xb>>3];h[Ja+24>>3]=bb;yb=cb;zb=bb}xb=Ja;Ia=jb+56|0;c[xb>>2]=c[Ia>>2];c[xb+4>>2]=c[Ia+4>>2];c[xb+8>>2]=c[Ia+8>>2];c[xb+12>>2]=c[Ia+12>>2];Ia=Ja|0;bb=+h[Ia>>3]-yb*.5;h[Ia>>3]=bb;Ia=Ja+8|0;cb=+h[Ia>>3]-zb*.5;h[Ia>>3]=cb;Za=yb+bb;Ka=zb+cb;sb=Pa;tb=Qa<bb?Qa:bb;ub=Ra<cb?Ra:cb;vb=La>Za?La:Za;wb=Sa>Ka?Sa:Ka}}while(0);kb=sb;lb=Ja+40|0;mb=tb;ob=ub;pb=vb;qb=wb;rb=c[ia>>2]|0}jb=c[rb+104>>2]|0;if((jb|0)==0){Ab=kb;Bb=lb;Cb=mb;Db=ob;Eb=pb;Fb=qb;Gb=rb}else{do{if((a[jb+81|0]|0)==0){if(ha){Hb=kb;Ib=mb;Jb=ob;Kb=pb;Mb=qb;break}Ia=om(ab)|0;do{if((Ia|0)==0){Nb=0.0;Ob=0.0}else{xb=c[Ia>>2]|0;if((c[xb+8>>2]|0)==0){Pb=c[xb>>2]|0;Nb=+h[Pb>>3];Ob=+h[Pb+8>>3];break}else{Nb=+h[xb+16>>3];Ob=+h[xb+24>>3];break}}}while(0);vF(lb+16|0,0,16)|0;h[lb>>3]=Nb;h[lb+8>>3]=Ob;if((a[214952]|0)==0){Ia=kb;xb=jb+24|0;c[Ia>>2]=c[xb>>2];c[Ia+4>>2]=c[xb+4>>2];c[Ia+8>>2]=c[xb+8>>2];c[Ia+12>>2]=c[xb+12>>2]}else{h[kb>>3]=+h[jb+32>>3];h[kb+8>>3]=+h[jb+24>>3]}c[kb+32>>2]=jb;a[kb+36|0]=0;c[lb+32>>2]=kb;Hb=kb+40|0;Ib=mb;Jb=ob;Kb=pb;Mb=qb}else{xb=jb+24|0;if((a[214952]|0)==0){Ka=+h[xb>>3];h[lb+16>>3]=Ka;Za=+h[jb+32>>3];h[lb+24>>3]=Za;Qb=Ka;Rb=Za}else{Za=+h[jb+32>>3];h[lb+16>>3]=Za;Ka=+h[xb>>3];h[lb+24>>3]=Ka;Qb=Za;Rb=Ka}xb=lb;Ia=jb+56|0;c[xb>>2]=c[Ia>>2];c[xb+4>>2]=c[Ia+4>>2];c[xb+8>>2]=c[Ia+8>>2];c[xb+12>>2]=c[Ia+12>>2];Ia=lb|0;Ka=+h[Ia>>3]-Qb*.5;h[Ia>>3]=Ka;Ia=lb+8|0;Za=+h[Ia>>3]-Rb*.5;h[Ia>>3]=Za;cb=Qb+Ka;bb=Rb+Za;Hb=kb;Ib=mb<Ka?mb:Ka;Jb=ob<Za?ob:Za;Kb=pb>cb?pb:cb;Mb=qb>bb?qb:bb}}while(0);Ab=Hb;Bb=lb+40|0;Cb=Ib;Db=Jb;Eb=Kb;Fb=Mb;Gb=c[ia>>2]|0}jb=c[Gb+100>>2]|0;if((jb|0)==0){Sb=Ab;Tb=Bb;Ub=Cb;Vb=Db;Wb=Eb;Xb=Fb;Yb=Gb}else{do{if((a[jb+81|0]|0)==0){if(ha){Zb=Ab;_b=Cb;$b=Db;ac=Eb;bc=Fb;break}Ia=om(ab)|0;do{if((Ia|0)==0){cc=0.0;dc=0.0}else{xb=(c[Ia+4>>2]|0)-1|0;Pb=c[Ia>>2]|0;if((c[Pb+(xb*48|0)+12>>2]|0)==0){ec=(c[Pb+(xb*48|0)+4>>2]|0)-1|0;fc=c[Pb+(xb*48|0)>>2]|0;cc=+h[fc+(ec<<4)>>3];dc=+h[fc+(ec<<4)+8>>3];break}else{cc=+h[Pb+(xb*48|0)+32>>3];dc=+h[Pb+(xb*48|0)+40>>3];break}}}while(0);vF(Bb+16|0,0,16)|0;h[Bb>>3]=cc;h[Bb+8>>3]=dc;if((a[214952]|0)==0){Ia=Ab;xb=jb+24|0;c[Ia>>2]=c[xb>>2];c[Ia+4>>2]=c[xb+4>>2];c[Ia+8>>2]=c[xb+8>>2];c[Ia+12>>2]=c[xb+12>>2]}else{h[Ab>>3]=+h[jb+32>>3];h[Ab+8>>3]=+h[jb+24>>3]}c[Ab+32>>2]=jb;a[Ab+36|0]=0;c[Bb+32>>2]=Ab;Zb=Ab+40|0;_b=Cb;$b=Db;ac=Eb;bc=Fb}else{xb=jb+24|0;if((a[214952]|0)==0){bb=+h[xb>>3];h[Bb+16>>3]=bb;cb=+h[jb+32>>3];h[Bb+24>>3]=cb;hc=bb;ic=cb}else{cb=+h[jb+32>>3];h[Bb+16>>3]=cb;bb=+h[xb>>3];h[Bb+24>>3]=bb;hc=cb;ic=bb}xb=Bb;Ia=jb+56|0;c[xb>>2]=c[Ia>>2];c[xb+4>>2]=c[Ia+4>>2];c[xb+8>>2]=c[Ia+8>>2];c[xb+12>>2]=c[Ia+12>>2];Ia=Bb|0;bb=+h[Ia>>3]-hc*.5;h[Ia>>3]=bb;Ia=Bb+8|0;cb=+h[Ia>>3]-ic*.5;h[Ia>>3]=cb;Za=hc+bb;Ka=ic+cb;Zb=Ab;_b=Cb<bb?Cb:bb;$b=Db<cb?Db:cb;ac=Eb>Za?Eb:Za;bc=Fb>Ka?Fb:Ka}}while(0);Sb=Zb;Tb=Bb+40|0;Ub=_b;Vb=$b;Wb=ac;Xb=bc;Yb=c[ia>>2]|0}jb=c[Yb+108>>2]|0;if((jb|0)==0){jc=Sb;kc=Tb;lc=Ub;mc=Vb;nc=Wb;oc=Xb}else{do{if((a[jb+81|0]|0)==0){if(ha){pc=Sb;qc=Ub;rc=Vb;sc=Wb;tc=Xb;break}mm(N,e,ab);Ka=+h[ka>>3];Za=+h[W>>3];vF(Tb+16|0,0,16)|0;h[Tb>>3]=Ka;h[Tb+8>>3]=Za;if((a[214952]|0)==0){Ia=Sb;xb=jb+24|0;c[Ia>>2]=c[xb>>2];c[Ia+4>>2]=c[xb+4>>2];c[Ia+8>>2]=c[xb+8>>2];c[Ia+12>>2]=c[xb+12>>2]}else{h[Sb>>3]=+h[jb+32>>3];h[Sb+8>>3]=+h[jb+24>>3]}c[Sb+32>>2]=jb;a[Sb+36|0]=0;c[Tb+32>>2]=Sb;pc=Sb+40|0;qc=Ub;rc=Vb;sc=Wb;tc=Xb}else{xb=jb+24|0;if((a[214952]|0)==0){Za=+h[xb>>3];h[Tb+16>>3]=Za;Ka=+h[jb+32>>3];h[Tb+24>>3]=Ka;uc=Za;vc=Ka}else{Ka=+h[jb+32>>3];h[Tb+16>>3]=Ka;Za=+h[xb>>3];h[Tb+24>>3]=Za;uc=Ka;vc=Za}xb=Tb;Ia=jb+56|0;c[xb>>2]=c[Ia>>2];c[xb+4>>2]=c[Ia+4>>2];c[xb+8>>2]=c[Ia+8>>2];c[xb+12>>2]=c[Ia+12>>2];Ia=Tb|0;Za=+h[Ia>>3]-uc*.5;h[Ia>>3]=Za;Ia=Tb+8|0;Ka=+h[Ia>>3]-vc*.5;h[Ia>>3]=Ka;cb=uc+Za;bb=vc+Ka;pc=Sb;qc=Ub<Za?Ub:Za;rc=Vb<Ka?Vb:Ka;sc=Wb>cb?Wb:cb;tc=Xb>bb?Xb:bb}}while(0);jc=pc;kc=Tb+40|0;lc=qc;mc=rc;nc=sc;oc=tc}jb=ow(e,ab)|0;if((jb|0)==0){db=oc;eb=nc;fb=mc;gb=lc;hb=kc;ib=jc;break}else{Sa=oc;La=nc;Ra=mc;Qa=lc;Ja=kc;Pa=jc;ab=jb}}}ab=vx(e,Ha)|0;if((ab|0)==0){ua=db;va=eb;wa=fb;xa=gb;ya=hb;break}else{Ba=db;Ca=eb;Da=fb;Ea=gb;Fa=hb;Ga=ib;Ha=ab}}}if((ta|0)==0){wc=xa;xc=wa;yc=va;zc=ua}else{Ha=O|0;h[Ha>>3]=xa;Ga=O+8|0;h[Ga>>3]=wa;Fa=O+16|0;h[Fa>>3]=va;W=O+24|0;h[W>>3]=ua;c[O+32>>2]=ya;Zk(P,e,O);c[S>>2]=c[T>>2];c[S+4>>2]=c[T+4>>2];c[S+8>>2]=c[T+8>>2];c[S+12>>2]=c[T+12>>2];c[S+16>>2]=c[T+16>>2];c[S+20>>2]=c[T+20>>2];c[S+24>>2]=c[T+24>>2];c[S+28>>2]=c[T+28>>2];c[S+32>>2]=c[T+32>>2];c[S+36>>2]=c[T+36>>2];wc=+h[Ha>>3];xc=+h[Ga>>3];yc=+h[Fa>>3];zc=+h[W>>3]}W=L+32|0;a[W]=Jm(e|0,Wv(e,0,114920,0)|0,1)|0;Fa=L|0;h[Fa>>3]=wc;Ga=L+8|0;h[Ga>>3]=xc;Ha=L+16|0;h[Ha>>3]=yc;ka=L+24|0;h[ka>>3]=zc;Mz($,ba,ja,ca,L)|0;do{if((a[213992]|0)==0){X=118}else{ha=c[o>>2]|0;Aa=d[W]|0;Ea=+h[Fa>>3];Da=+h[Ga>>3];Ca=+h[Ha>>3];Ba=+h[ka>>3];gc(ha|0,96552,(Ac=i,i=i+56|0,c[Ac>>2]=ba,c[Ac+8>>2]=ca,c[Ac+16>>2]=Aa,h[Ac+24>>3]=Ea,h[Ac+32>>3]=Da,h[Ac+40>>3]=Ca,h[Ac+48>>3]=Ba,Ac)|0)|0;i=Ac;if((d[213992]|0)>>>0<2>>>0){X=118;break}Ma(91224,8,1,ha|0)|0;if((ba|0)>0){Aa=$;za=0;while(1){ab=c[Aa+32>>2]|0;Ba=+h[Aa>>3];Ca=+h[Aa+8>>3];Da=+h[Aa+16>>3];Ea=+h[Aa+24>>3];if((ab|0)==0){Bc=213304}else{Bc=c[c[ab+32>>2]>>2]|0}gc(ha|0,86024,(Ac=i,i=i+56|0,c[Ac>>2]=za,h[Ac+8>>3]=Ba,h[Ac+16>>3]=Ca,h[Ac+24>>3]=Da,h[Ac+32>>3]=Ea,c[Ac+40>>2]=ab,c[Ac+48>>2]=Bc,Ac)|0)|0;i=Ac;ab=za+1|0;if((ab|0)<(ba|0)){Aa=Aa+40|0;za=ab}else{break}}}Ma(167600,8,1,ha|0)|0;if((ca|0)>0){Cc=ja;Dc=0}else{Ec=0;break}while(1){za=d[Cc+36|0]|0;Ea=+h[Cc+16>>3];Da=+h[Cc+24>>3];Ca=+h[Cc>>3];Ba=+h[Cc+8>>3];Aa=c[c[Cc+32>>2]>>2]|0;gc(ha|0,163416,(Ac=i,i=i+64|0,c[Ac>>2]=Dc,c[Ac+8>>2]=Cc,c[Ac+16>>2]=za,h[Ac+24>>3]=Ea,h[Ac+32>>3]=Da,h[Ac+40>>3]=Ca,h[Ac+48>>3]=Ba,c[Ac+56>>2]=Aa,Ac)|0)|0;i=Ac;Aa=Dc+1|0;if((Aa|0)<(ca|0)){Cc=Cc+40|0;Dc=Aa}else{X=118;break}}}}while(0);do{if((X|0)==118){if((ca|0)>0){Fc=0;Gc=0;Hc=ja}else{Ec=0;break}while(1){if((a[Hc+36|0]|0)==0){Ic=Gc}else{ba=c[Hc+32>>2]|0;a[ba+81|0]=1;Ba=+h[Hc+24>>3]+ +h[Hc+8>>3]*.5;h[ba+56>>3]=+h[Hc+16>>3]+ +h[Hc>>3]*.5;h[ba+64>>3]=Ba;_m(e,ba);Ic=Gc+1|0}ba=Fc+1|0;if((ba|0)<(ca|0)){Fc=ba;Gc=Ic;Hc=Hc+40|0}else{Ec=Ic;break}}}}while(0);do{if((a[213992]|0)==0){if((Ec|0)==(ca|0)){break}Fv(0,102304,(Ac=i,i=i+16|0,c[Ac>>2]=Ec,c[Ac+8>>2]=ca,Ac)|0)|0;i=Ac}else{gc(c[o>>2]|0,108e3,(Ac=i,i=i+16|0,c[Ac>>2]=Ec,c[Ac+8>>2]=ca,Ac)|0)|0;i=Ac}}while(0);eF(aa);eF(U)}}while(0);Ec=c[R>>2]|0;Ic=c[Ec+12>>2]|0;do{if((Ic|0)==0){Jc=0.0;Kc=0.0}else{if((a[Ic+81|0]|0)!=0){Jc=0.0;Kc=0.0;break}zc=+h[Ic+24>>3]+16.0;yc=+h[Ic+32>>3]+8.0;Hc=(a[Ec+263|0]&1)!=0;if((a[214952]|0)!=0){if(Hc){Gc=Ec+32|0;h[Gc>>3]=yc+ +h[Gc>>3]}else{Gc=Ec+16|0;h[Gc>>3]=+h[Gc>>3]-yc}Gc=c[R>>2]|0;Fc=Gc+24|0;xc=+h[Fc>>3];wc=+h[Gc+40>>3]-xc;if(zc<=wc){Jc=zc;Kc=yc;break}ua=(zc-wc)*.5;h[Fc>>3]=xc-ua;Fc=(c[R>>2]|0)+40|0;h[Fc>>3]=ua+ +h[Fc>>3];Jc=zc;Kc=yc;break}Fc=(c[53548]|0)==0;do{if(Hc){if(Fc){Gc=Ec+40|0;h[Gc>>3]=yc+ +h[Gc>>3];break}else{Gc=Ec+24|0;h[Gc>>3]=+h[Gc>>3]-yc;break}}else{if(Fc){Gc=Ec+24|0;h[Gc>>3]=+h[Gc>>3]-yc;break}else{Gc=Ec+40|0;h[Gc>>3]=yc+ +h[Gc>>3];break}}}while(0);Fc=c[R>>2]|0;Hc=Fc+16|0;ua=+h[Hc>>3];xc=+h[Fc+32>>3]-ua;if(zc<=xc){Jc=zc;Kc=yc;break}wc=(zc-xc)*.5;h[Hc>>3]=ua-wc;Hc=(c[R>>2]|0)+32|0;h[Hc>>3]=wc+ +h[Hc>>3];Jc=zc;Kc=yc}}while(0);do{if((f|0)!=0){Ec=c[53548]|0;if((Ec|0)==0){Ic=(c[R>>2]|0)+16|0;c[53562]=c[Ic>>2];c[53563]=c[Ic+4>>2];c[53564]=c[Ic+8>>2];c[53565]=c[Ic+12>>2]}else if((Ec|0)==1){Ic=c[R>>2]|0;wc=+h[Ic+16>>3];h[26781]=-0.0- +h[Ic+40>>3];h[26782]=wc}else if((Ec|0)==2){Ic=c[R>>2]|0;wc=-0.0- +h[Ic+40>>3];h[26781]=+h[Ic+16>>3];h[26782]=wc}else if((Ec|0)==3){Ic=c[R>>2]|0;wc=+h[Ic+16>>3];h[26781]=+h[Ic+24>>3];h[26782]=wc}Ic=J;Hc=K;if(+h[26781]==0.0){if(!(+h[26782]!=0.0|(Ec|0)!=0)){break}}Ec=ux(e)|0;if((Ec|0)!=0){Fc=H;U=I;aa=H|0;Gc=H+8|0;X=y;Dc=z;Cc=A;Bc=B;L=C;T=D;S=E;O=s;P=t;ya=s|0;ta=s+8|0;ib=u;hb=v;jc=u|0;kc=u+8|0;Tb=w;pc=x;Sb=w|0;N=w+8|0;Yb=j;Bb=k;Zb=j|0;Ab=j+8|0;Gb=l;lb=m;Hb=l|0;kb=l+8|0;rb=n;sb=p;M=n|0;Ta=n+8|0;Ua=q;V=r;_=q|0;Z=q+8|0;Y=F;ga=G;fa=F|0;ea=F+8|0;ra=Ec;do{if((c[53548]|0)==0){Lc=0}else{vn(ra,0);Lc=(c[53548]|0)*90|0}Ec=ra+8|0;sa=c[Ec>>2]|0;qa=sa+16|0;wc=+h[sa+24>>3];h[aa>>3]=+h[qa>>3];h[Gc>>3]=wc;si(I,H,Lc);c[Fc>>2]=c[U>>2];c[Fc+4>>2]=c[U+4>>2];c[Fc+8>>2]=c[U+8>>2];c[Fc+12>>2]=c[U+12>>2];h[aa>>3]=+h[aa>>3]- +h[26781];h[Gc>>3]=+h[Gc>>3]- +h[26782];c[Ic>>2]=c[Fc>>2];c[Ic+4>>2]=c[Fc+4>>2];c[Ic+8>>2]=c[Fc+8>>2];c[Ic+12>>2]=c[Fc+12>>2];sa=qa;c[sa>>2]=c[Ic>>2];c[sa+4>>2]=c[Ic+4>>2];c[sa+8>>2]=c[Ic+8>>2];c[sa+12>>2]=c[Ic+12>>2];sa=c[(c[Ec>>2]|0)+108>>2]|0;if((sa|0)!=0){Ec=sa+56|0;wc=+h[sa+64>>3];h[fa>>3]=+h[Ec>>3];h[ea>>3]=wc;si(G,F,(c[53548]|0)*90|0);c[Y>>2]=c[ga>>2];c[Y+4>>2]=c[ga+4>>2];c[Y+8>>2]=c[ga+8>>2];c[Y+12>>2]=c[ga+12>>2];h[fa>>3]=+h[fa>>3]- +h[26781];h[ea>>3]=+h[ea>>3]- +h[26782];c[Hc>>2]=c[Y>>2];c[Hc+4>>2]=c[Y+4>>2];c[Hc+8>>2]=c[Y+8>>2];c[Hc+12>>2]=c[Y+12>>2];sa=Ec;c[sa>>2]=c[Hc>>2];c[sa+4>>2]=c[Hc+4>>2];c[sa+8>>2]=c[Hc+8>>2];c[sa+12>>2]=c[Hc+12>>2]}do{if((c[53522]|0)==1){sa=mw(e,ra)|0;if((sa|0)==0){break}else{Mc=sa}do{sa=Mc+8|0;Ec=c[sa>>2]|0;qa=c[Ec+8>>2]|0;do{if((qa|0)==0){if((a[215376]|0)!=0){break}if((a[Ec+112|0]|0)==6){break}pa=Mc;oa=$w(c[((c[pa>>2]&3|0)==3?Mc:Mc+32|0)+28>>2]|0)|0;na=$w(c[((c[pa>>2]&3|0)==2?Mc:Mc-32|0)+28>>2]|0)|0;Fv(1,126784,(Ac=i,i=i+16|0,c[Ac>>2]=oa,c[Ac+8>>2]=na,Ac)|0)|0;i=Ac}else{if((c[qa+4>>2]|0)>0){na=0;oa=qa;while(1){pa=c[oa>>2]|0;ma=c[pa+(na*48|0)>>2]|0;la=c[pa+(na*48|0)+4>>2]|0;da=c[pa+(na*48|0)+8>>2]|0;ca=c[pa+(na*48|0)+12>>2]|0;if((la|0)>0){pa=0;do{ja=ma+(pa<<4)|0;wc=+h[ma+(pa<<4)+8>>3];h[Sb>>3]=+h[ja>>3];h[N>>3]=wc;si(x,w,(c[53548]|0)*90|0);c[Tb>>2]=c[pc>>2];c[Tb+4>>2]=c[pc+4>>2];c[Tb+8>>2]=c[pc+8>>2];c[Tb+12>>2]=c[pc+12>>2];h[Sb>>3]=+h[Sb>>3]- +h[26781];h[N>>3]=+h[N>>3]- +h[26782];c[X>>2]=c[Tb>>2];c[X+4>>2]=c[Tb+4>>2];c[X+8>>2]=c[Tb+8>>2];c[X+12>>2]=c[Tb+12>>2];ba=ja;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];pa=pa+1|0;}while((pa|0)<(la|0))}if((da|0)!=0){la=c[c[(c[sa>>2]|0)+8>>2]>>2]|0;pa=la+(na*48|0)+16|0;wc=+h[la+(na*48|0)+24>>3];h[jc>>3]=+h[pa>>3];h[kc>>3]=wc;si(v,u,(c[53548]|0)*90|0);c[ib>>2]=c[hb>>2];c[ib+4>>2]=c[hb+4>>2];c[ib+8>>2]=c[hb+8>>2];c[ib+12>>2]=c[hb+12>>2];h[jc>>3]=+h[jc>>3]- +h[26781];h[kc>>3]=+h[kc>>3]- +h[26782];c[Dc>>2]=c[ib>>2];c[Dc+4>>2]=c[ib+4>>2];c[Dc+8>>2]=c[ib+8>>2];c[Dc+12>>2]=c[ib+12>>2];la=pa;c[la>>2]=c[Dc>>2];c[la+4>>2]=c[Dc+4>>2];c[la+8>>2]=c[Dc+8>>2];c[la+12>>2]=c[Dc+12>>2]}if((ca|0)!=0){la=c[c[(c[sa>>2]|0)+8>>2]>>2]|0;pa=la+(na*48|0)+32|0;wc=+h[la+(na*48|0)+40>>3];h[ya>>3]=+h[pa>>3];h[ta>>3]=wc;si(t,s,(c[53548]|0)*90|0);c[O>>2]=c[P>>2];c[O+4>>2]=c[P+4>>2];c[O+8>>2]=c[P+8>>2];c[O+12>>2]=c[P+12>>2];h[ya>>3]=+h[ya>>3]- +h[26781];h[ta>>3]=+h[ta>>3]- +h[26782];c[Cc>>2]=c[O>>2];c[Cc+4>>2]=c[O+4>>2];c[Cc+8>>2]=c[O+8>>2];c[Cc+12>>2]=c[O+12>>2];la=pa;c[la>>2]=c[Cc>>2];c[la+4>>2]=c[Cc+4>>2];c[la+8>>2]=c[Cc+8>>2];c[la+12>>2]=c[Cc+12>>2]}la=na+1|0;pa=c[sa>>2]|0;ma=c[pa+8>>2]|0;if((la|0)<(c[ma+4>>2]|0)){na=la;oa=ma}else{Nc=pa;break}}}else{Nc=Ec}oa=c[Nc+96>>2]|0;if((oa|0)==0){Oc=Nc}else{na=oa+56|0;wc=+h[oa+64>>3];h[_>>3]=+h[na>>3];h[Z>>3]=wc;si(r,q,(c[53548]|0)*90|0);c[Ua>>2]=c[V>>2];c[Ua+4>>2]=c[V+4>>2];c[Ua+8>>2]=c[V+8>>2];c[Ua+12>>2]=c[V+12>>2];h[_>>3]=+h[_>>3]- +h[26781];h[Z>>3]=+h[Z>>3]- +h[26782];c[Bc>>2]=c[Ua>>2];c[Bc+4>>2]=c[Ua+4>>2];c[Bc+8>>2]=c[Ua+8>>2];c[Bc+12>>2]=c[Ua+12>>2];oa=na;c[oa>>2]=c[Bc>>2];c[oa+4>>2]=c[Bc+4>>2];c[oa+8>>2]=c[Bc+8>>2];c[oa+12>>2]=c[Bc+12>>2];Oc=c[sa>>2]|0}oa=c[Oc+108>>2]|0;if((oa|0)==0){Pc=Oc}else{na=oa+56|0;wc=+h[oa+64>>3];h[M>>3]=+h[na>>3];h[Ta>>3]=wc;si(p,n,(c[53548]|0)*90|0);c[rb>>2]=c[sb>>2];c[rb+4>>2]=c[sb+4>>2];c[rb+8>>2]=c[sb+8>>2];c[rb+12>>2]=c[sb+12>>2];h[M>>3]=+h[M>>3]- +h[26781];h[Ta>>3]=+h[Ta>>3]- +h[26782];c[L>>2]=c[rb>>2];c[L+4>>2]=c[rb+4>>2];c[L+8>>2]=c[rb+8>>2];c[L+12>>2]=c[rb+12>>2];oa=na;c[oa>>2]=c[L>>2];c[oa+4>>2]=c[L+4>>2];c[oa+8>>2]=c[L+8>>2];c[oa+12>>2]=c[L+12>>2];Pc=c[sa>>2]|0}oa=c[Pc+100>>2]|0;if((oa|0)==0){Qc=Pc}else{na=oa+56|0;wc=+h[oa+64>>3];h[Hb>>3]=+h[na>>3];h[kb>>3]=wc;si(m,l,(c[53548]|0)*90|0);c[Gb>>2]=c[lb>>2];c[Gb+4>>2]=c[lb+4>>2];c[Gb+8>>2]=c[lb+8>>2];c[Gb+12>>2]=c[lb+12>>2];h[Hb>>3]=+h[Hb>>3]- +h[26781];h[kb>>3]=+h[kb>>3]- +h[26782];c[T>>2]=c[Gb>>2];c[T+4>>2]=c[Gb+4>>2];c[T+8>>2]=c[Gb+8>>2];c[T+12>>2]=c[Gb+12>>2];oa=na;c[oa>>2]=c[T>>2];c[oa+4>>2]=c[T+4>>2];c[oa+8>>2]=c[T+8>>2];c[oa+12>>2]=c[T+12>>2];Qc=c[sa>>2]|0}oa=c[Qc+104>>2]|0;if((oa|0)==0){break}na=oa+56|0;wc=+h[oa+64>>3];h[Zb>>3]=+h[na>>3];h[Ab>>3]=wc;si(k,j,(c[53548]|0)*90|0);c[Yb>>2]=c[Bb>>2];c[Yb+4>>2]=c[Bb+4>>2];c[Yb+8>>2]=c[Bb+8>>2];c[Yb+12>>2]=c[Bb+12>>2];h[Zb>>3]=+h[Zb>>3]- +h[26781];h[Ab>>3]=+h[Ab>>3]- +h[26782];c[S>>2]=c[Yb>>2];c[S+4>>2]=c[Yb+4>>2];c[S+8>>2]=c[Yb+8>>2];c[S+12>>2]=c[Yb+12>>2];oa=na;c[oa>>2]=c[S>>2];c[oa+4>>2]=c[S+4>>2];c[oa+8>>2]=c[S+8>>2];c[oa+12>>2]=c[S+12>>2]}}while(0);Mc=ow(e,Mc)|0;}while((Mc|0)!=0)}}while(0);ra=vx(e,ra)|0;}while((ra|0)!=0)}Tk(e,c[(c[R>>2]|0)+116>>2]&3)}}while(0);e=c[R>>2]|0;Mc=c[e+12>>2]|0;do{if((Mc|0)!=0){if((a[Mc+81|0]|0)!=0){break}j=a[e+263|0]|0;k=j<<24>>24;do{if((k&4|0)==0){yc=+h[e+16>>3];if((k&2|0)==0){Rc=(yc+ +h[e+32>>3])*.5;break}else{Rc=Jc*.5+yc;break}}else{Rc=+h[e+32>>3]-Jc*.5}}while(0);if((j&1)==0){Sc=Kc*.5+ +h[e+24>>3]}else{Sc=+h[e+40>>3]-Kc*.5}h[Mc+56>>3]=Rc;h[Mc+64>>3]=Sc;a[(c[(c[R>>2]|0)+12>>2]|0)+81|0]=1}}while(0);if((c[53530]|0)==0){i=g;return}R=Q|0;if((a[214952]|0)==0){Sc=+h[26782];Rc=+h[26781];nb(R|0,155504,(Ac=i,i=i+48|0,h[Ac>>3]=Sc,h[Ac+8>>3]=Rc,h[Ac+16>>3]=Sc,h[Ac+24>>3]=Rc,h[Ac+32>>3]=-0.0-Rc,h[Ac+40>>3]=-0.0-Sc,Ac)|0)|0;i=Ac}else{Sc=+h[26781];Rc=+h[26782];nb(R|0,116976,(Ac=i,i=i+32|0,h[Ac>>3]=Sc,h[Ac+8>>3]=Rc,h[Ac+16>>3]=Sc,h[Ac+24>>3]=Rc,Ac)|0)|0;i=Ac}Ac=Lb(R|0)|0;c[c[53530]>>2]=Ac;i=g;return}function Vk(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0.0,l=0,m=0.0,n=0,o=0;d=b+8|0;do{if((Ix(b|0)|0)!=(b|0)){e=c[d>>2]|0;f=c[e+12>>2]|0;if((f|0)==0){break}if((a[f+81|0]|0)!=0){break}g=a[e+263|0]|0;if((g&1)==0){i=e+104|0;j=+h[e+16>>3]+ +h[e+96>>3]*.5}else{i=e+72|0;j=+h[e+32>>3]- +h[e+64>>3]*.5}k=+h[i>>3];l=g<<24>>24;do{if((l&4|0)==0){if((l&2|0)==0){m=(+h[e+24>>3]+ +h[e+40>>3])*.5;break}else{m=+h[e+40>>3]-k*.5;break}}else{m=k*.5+ +h[e+24>>3]}}while(0);h[f+56>>3]=j;h[f+64>>3]=m;a[(c[(c[d>>2]|0)+12>>2]|0)+81|0]=1}}while(0);i=c[d>>2]|0;if((c[i+172>>2]|0)<1){return}else{n=1;o=i}while(1){Vk(c[(c[o+176>>2]|0)+(n<<2)>>2]|0);i=c[d>>2]|0;if((n|0)<(c[i+172>>2]|0)){n=n+1|0;o=i}else{break}}return}function Wk(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0;d=b+8|0;do{if((Ix(b|0)|0)!=(b|0)){e=c[d>>2]|0;f=c[e+12>>2]|0;if((f|0)==0){break}if((a[f+81|0]|0)!=0){break}g=a[e+263|0]|0;if((g&1)==0){i=e+48|0;j=+h[e+24>>3]+ +h[e+56>>3]*.5}else{i=e+80|0;j=+h[e+40>>3]- +h[e+88>>3]*.5}k=+h[i>>3];l=g<<24>>24;do{if((l&4|0)==0){m=+h[e+16>>3];if((l&2|0)==0){n=(m+ +h[e+32>>3])*.5;break}else{n=k*.5+m;break}}else{n=+h[e+32>>3]-k*.5}}while(0);h[f+56>>3]=n;h[f+64>>3]=j;a[(c[(c[d>>2]|0)+12>>2]|0)+81|0]=1}}while(0);i=c[d>>2]|0;if((c[i+172>>2]|0)<1){return}else{o=1;p=i}while(1){Wk(c[(c[p+176>>2]|0)+(o<<2)>>2]|0);i=c[d>>2]|0;if((o|0)<(c[i+172>>2]|0)){o=o+1|0;p=i}else{break}}return}function Xk(a){a=a|0;Uk(a,1);return}function Yk(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=(Ix(b|0)|0)==(b|0);e=c[b+8>>2]|0;do{if(d){f=0}else{g=c[e+12>>2]|0;if((g|0)==0){f=0;break}f=(a[g+81|0]|0)!=0|0}}while(0);d=b+8|0;if((c[e+172>>2]|0)<1){h=f;return h|0}else{i=1;j=f;k=e}while(1){e=(Yk(c[(c[k+176>>2]|0)+(i<<2)>>2]|0)|0)+j|0;f=c[d>>2]|0;if((i|0)<(c[f+172>>2]|0)){i=i+1|0;j=e;k=f}else{h=e;break}}return h|0}function Zk(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0;g=i;i=i+40|0;j=f;f=i;i=i+40|0;tF(f,j,40)|0;j=g|0;l=e+8|0;m=c[l>>2]|0;if((c[m+172>>2]|0)>=1){n=f;o=j;p=1;q=m;while(1){Zk(j,c[(c[q+176>>2]|0)+(p<<2)>>2]|0,f);c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];c[n+20>>2]=c[o+20>>2];c[n+24>>2]=c[o+24>>2];c[n+28>>2]=c[o+28>>2];c[n+32>>2]=c[o+32>>2];c[n+36>>2]=c[o+36>>2];m=c[l>>2]|0;if((p|0)<(c[m+172>>2]|0)){p=p+1|0;q=m}else{break}}}do{if((Ix(e|0)|0)!=(e|0)){q=c[(c[l>>2]|0)+12>>2]|0;if((q|0)==0){break}if((a[q+81|0]|0)==0){break}p=f+32|0;o=c[p>>2]|0;n=f|0;r=(c[k>>2]=d[n]|d[n+1|0]<<8|d[n+2|0]<<16|d[n+3|0]<<24,c[k+4>>2]=d[n+4|0]|d[n+5|0]<<8|d[n+6|0]<<16|d[n+7|0]<<24,+h[k>>3]);j=f+8|0;s=(c[k>>2]=d[j]|d[j+1|0]<<8|d[j+2|0]<<16|d[j+3|0]<<24,c[k+4>>2]=d[j+4|0]|d[j+5|0]<<8|d[j+6|0]<<16|d[j+7|0]<<24,+h[k>>3]);m=f+16|0;t=(c[k>>2]=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24,c[k+4>>2]=d[m+4|0]|d[m+5|0]<<8|d[m+6|0]<<16|d[m+7|0]<<24,+h[k>>3]);u=f+24|0;v=(c[k>>2]=d[u]|d[u+1|0]<<8|d[u+2|0]<<16|d[u+3|0]<<24,c[k+4>>2]=d[u+4|0]|d[u+5|0]<<8|d[u+6|0]<<16|d[u+7|0]<<24,+h[k>>3]);w=q+24|0;if((a[214952]|0)==0){x=+h[w>>3];h[o+16>>3]=x;y=+h[q+32>>3];h[o+24>>3]=y;z=x;A=y}else{y=+h[q+32>>3];h[o+16>>3]=y;x=+h[w>>3];h[o+24>>3]=x;z=y;A=x}w=o;B=q+56|0;c[w>>2]=c[B>>2];c[w+4>>2]=c[B+4>>2];c[w+8>>2]=c[B+8>>2];c[w+12>>2]=c[B+12>>2];B=o|0;x=+h[B>>3]-z*.5;h[B>>3]=x;B=o+8|0;y=+h[B>>3]-A*.5;h[B>>3]=y;C=z+x;D=A+y;h[n>>3]=r<x?r:x;h[j>>3]=s<y?s:y;h[m>>3]=t>C?t:C;h[u>>3]=v>D?v:D;c[p>>2]=o+40}}while(0);l=b;b=f;c[l>>2]=c[b>>2];c[l+4>>2]=c[b+4>>2];c[l+8>>2]=c[b+8>>2];c[l+12>>2]=c[b+12>>2];c[l+16>>2]=c[b+16>>2];c[l+20>>2]=c[b+20>>2];c[l+24>>2]=c[b+24>>2];c[l+28>>2]=c[b+28>>2];c[l+32>>2]=c[b+32>>2];c[l+36>>2]=c[b+36>>2];i=g;return}function _k(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;i=i+1136|0;e=d+1024|0;f=d+1104|0;g=d+1112|0;j=d+1120|0;k=d+1128|0;l=b|0;m=Sm(ew(l,116816)|0)|0;if((m|0)==0){n=$w(l)|0;Fv(0,155400,(o=i,i=i+8|0,c[o>>2]=n,o)|0)|0;i=o;i=d;return}n=d|0;l=c[53828]|0;if((l|0)==0){p=$g(173152,c[43330]|0)|0;c[53828]=p;q=p}else{q=l}l=Hc[c[q>>2]&63](q,m,512)|0;do{if((l|0)==0){q=Eb(m|0,107984)|0;if((q|0)==0){Fv(0,148208,(o=i,i=i+8|0,c[o>>2]=m,o)|0)|0;i=o;r=0;break}do{if((db(n|0,1024,q|0)|0)==0){s=16}else{p=0;t=0;while(1){u=ac(n|0,145064,(o=i,i=i+32|0,c[o>>2]=f,c[o+8>>2]=g,c[o+16>>2]=j,c[o+24>>2]=k,o)|0)|0;i=o;v=(u|0)==4?1:p;if((a[n]|0)==37){w=t}else{u=(Ua(n|0,142104)|0)==0;w=u?t:1}if((v|0)==0){x=w;y=0}else{if((w|0)==0){x=0;y=v}else{z=v;A=w&255;break}}if((db(n|0,1024,q|0)|0)==0){z=y;A=x&255;break}else{p=y;t=x}}if((z|0)==0){s=16;break}t=kk(64)|0;c[t+32>>2]=c[f>>2];p=t+36|0;c[p>>2]=c[g>>2];c[t+40>>2]=(c[j>>2]|0)-(c[f>>2]|0);c[p>>2]=(c[k>>2]|0)-(c[g>>2]|0);c[t+8>>2]=m;p=c[53652]|0;c[53652]=p+1;c[t+12>>2]=p;Xb(Ta(q|0)|0,e|0)|0;p=c[e+36>>2]|0;v=kk(p+1|0)|0;c[t+52>>2]=v;mc(q|0,0,0)|0;Nb(v|0,p|0,1,q|0)|0;a[v+p|0]=0;p=c[53828]|0;Hc[c[p>>2]&63](p,t,1)|0;a[t+16|0]=A;B=t}}while(0);if((s|0)==16){Fv(0,138968,(o=i,i=i+8|0,c[o>>2]=m,o)|0)|0;i=o;B=0}Ha(q|0)|0;r=B}else{r=l}}while(0);if((r|0)==0){i=d;return}l=c[r+40>>2]|0;B=c[r+44>>2]|0;o=b+8|0;h[(c[o>>2]|0)+32>>3]=+(l|0)/72.0;h[(c[o>>2]|0)+40>>3]=+(B|0)/72.0;b=jk(12)|0;c[(c[o>>2]|0)+12>>2]=b;c[b>>2]=c[r+12>>2];c[b+4>>2]=((l|0)/-2|0)-(c[r+32>>2]|0);c[b+8>>2]=((B|0)/-2|0)-(c[r+36>>2]|0);i=d;return}function $k(a){a=a|0;var b=0;b=c[(c[a+8>>2]|0)+12>>2]|0;if((b|0)==0){return}eF(b);return}function al(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;g=(d|0)!=0;a:do{if(g){h=0;j=1;while(1){k=c[d+(h<<2)>>2]|0;if((k|0)==0){l=4;break a}m=(a[k]|0)==0?0:j;if(m<<24>>24==0){break}else{h=h+1|0;j=m}}}else{l=4}}while(0);do{if((l|0)==4){j=c[e>>2]|0;if((j|0)==0){break}else{n=e;o=j}do{_z(b,o)|0;_z(b,126712)|0;n=n+4|0;o=c[n>>2]|0;}while((o|0)!=0)}}while(0);if(!g){i=f;return}g=c[d>>2]|0;if((g|0)==0){i=f;return}else{p=0;q=g}do{do{if((a[q]|0)!=0){g=Sm(q)|0;if((g|0)==0){Fv(0,114872,(r=i,i=i+8|0,c[r>>2]=q,r)|0)|0;i=r;break}o=Eb(g|0,107984)|0;if((o|0)==0){Fv(0,102272,(r=i,i=i+8|0,c[r>>2]=g,r)|0)|0;i=r;break}g=Rm(o)|0;if((g|0)!=0){n=g;do{_z(b,n)|0;n=Rm(o)|0;}while((n|0)!=0)}_z(b,126712)|0;Ha(o|0)|0}}while(0);p=p+1|0;q=c[d+(p<<2)>>2]|0;}while((q|0)!=0);i=f;return}function bl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=c[d+52>>2]|0;a:while(1){d=a[e]|0;b:do{if((d<<24>>24|0)==0){break a}else if((d<<24>>24|0)==37){if((a[e+1|0]|0)!=37){f=e;g=37;break}h=e+2|0;do{if((qm(h,96544,3)|0)==0){i=e;j=37}else{if((qm(h,91216,5)|0)==0){i=e;j=37;break}if((qm(h,86016,3)|0)==0){i=e;j=37;break}if((qm(h,81360,7)|0)==0){i=e;j=37}else{f=e;g=d;break b}}}while(0);while(1){if((j<<24>>24|0)==13){k=10;break}else if((j<<24>>24|0)==0|(j<<24>>24|0)==10){k=12;break}h=i+1|0;i=h;j=a[h]|0}do{if((k|0)==10){k=0;h=i+1|0;if((a[h]|0)!=10){l=h;break}e=i+2|0;continue a}else if((k|0)==12){k=0;l=i+1|0}}while(0);e=j<<24>>24==0?i:l;continue a}else{f=e;g=d}}while(0);while(1){if((g<<24>>24|0)==13){k=16;break}else if((g<<24>>24|0)==0|(g<<24>>24|0)==10){k=18;break}$z(b,g<<24>>24)|0;d=f+1|0;f=d;g=a[d]|0}do{if((k|0)==16){k=0;d=f+1|0;if((a[d]|0)!=10){m=d;k=19;break}n=f+2|0}else if((k|0)==18){k=0;m=f+1|0;k=19}}while(0);if((k|0)==19){k=0;n=g<<24>>24==0?f:m}$z(b,10)|0;e=n}return}function cl(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[53828]|0;if((e|0)==0){i=d;return}f=Hc[c[e>>2]&63](e,0,128)|0;if((f|0)==0){i=d;return}else{g=f}do{if((a[g+16|0]|0)==0){dA(b,167576,(f=i,i=i+8|0,c[f>>2]=c[g+12>>2],f)|0);i=f;_z(b,163384)|0;bl(b,g);_z(b,159368)|0;_z(b,154296)|0}f=c[53828]|0;g=Hc[c[f>>2]&63](f,g,8)|0;}while((g|0)!=0);i=d;return}function dl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;do{if((d|0)==0){f=0;g=b;a:while(1){h=g;while(1){j=a[h]|0;if(j<<24>>24==0){k=7;break a}if((j&255)>>>0<127>>>0){h=h+1|0}else{break}}if((j&-4)<<24>>24==-64){f=1;g=h+2|0}else{k=9;break}}if((k|0)==7){if((f|0)!=1){l=b;break}l=ln(b)|0;break}else if((k|0)==9){if(a[13144]|0){l=b;break}Fv(0,151120,(g=i,i=i+1|0,i=i+7&-8,c[g>>2]=0,g)|0)|0;i=g;a[13144]=1;l=b;break}}else{l=ln(b)|0}}while(0);if((c[43808]|0)==0){Iv(175232,0,0)}k=c[43809]|0;if(k>>>0<(c[43810]|0)>>>0){m=k}else{Jv(175232,1)|0;m=c[43809]|0}c[43809]=m+1;a[m]=40;m=l;while(1){k=a[m]|0;if((k<<24>>24|0)==40|(k<<24>>24|0)==41|(k<<24>>24|0)==92){j=c[43809]|0;if(j>>>0<(c[43810]|0)>>>0){n=j}else{Jv(175232,1)|0;n=c[43809]|0}c[43809]=n+1;a[n]=92}else if((k<<24>>24|0)==0){break}k=c[43809]|0;if(k>>>0<(c[43810]|0)>>>0){o=k}else{Jv(175232,1)|0;o=c[43809]|0}k=a[m]|0;c[43809]=o+1;a[o]=k;m=m+1|0}m=c[43809]|0;if(m>>>0<(c[43810]|0)>>>0){p=m}else{Jv(175232,1)|0;p=c[43809]|0}c[43809]=p+1;a[p]=41;if((l|0)!=(b|0)){eF(l)}l=c[43809]|0;if(l>>>0<(c[43810]|0)>>>0){q=l;a[q]=0;r=c[43808]|0;c[43809]=r;i=e;return r|0}Jv(175232,1)|0;q=c[43809]|0;a[q]=0;r=c[43808]|0;c[43809]=r;i=e;return r|0}function el(a,b,d){a=a|0;b=b|0;d=d|0;eF(c[b+52>>2]|0);return}function fl(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;i=i+80|0;j=a;a=i;i=i+16|0;c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];j=b;b=i;i=i+16|0;c[b>>2]=c[j>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];c[b+12>>2]=c[j+12>>2];j=d;d=i;i=i+8|0;c[d>>2]=c[j>>2];c[d+4>>2]=c[j+4>>2];j=g|0;k=g+8|0;l=g+16|0;m=g+48|0;h[l>>3]=+h[a>>3];h[l+8>>3]=+h[a+8>>3];h[l+16>>3]=+h[b>>3];h[l+24>>3]=+h[b+8>>3];if((PB(d,l|0,j)|0)<0){n=0;i=g;return n|0}do{if((f|0)==0){l=d+4|0;b=c[l>>2]|0;if((b|0)>(c[45170]|0)){a=c[45168]|0;if((a|0)==0){o=kk(b<<5)|0}else{o=mk(a,b<<5)|0}c[45168]=o;a=c[l>>2]|0;c[45170]=a;p=a}else{p=b}b=c[45168]|0;if((p|0)>0){a=c[d>>2]|0;l=0;while(1){q=b+(l<<5)|0;r=a+(l<<4)|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];r=l+1|0;q=b+(l<<5)+16|0;s=a+(((r|0)%(p|0)|0)<<4)|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];if((r|0)<(p|0)){l=r}else{break}}}vF(m|0,0,32)|0;if((MB(b,p,j,m|0,k)|0)<0){n=0}else{break}i=g;return n|0}else{ZB(j,k)}}while(0);j=k+4|0;m=c[j>>2]|0;p=c[44370]|0;do{if((p|0)<(m|0)){d=m+300+p-((m|0)%300|0)|0;o=mk(c[43814]|0,d<<4)|0;c[43814]=o;if((o|0)!=0){c[44370]=d;t=c[j>>2]|0;break}Fv(1,126600,(d=i,i=i+1|0,i=i+7&-8,c[d>>2]=0,d)|0)|0;i=d;n=0;i=g;return n|0}else{t=m}}while(0);if((t|0)>0){m=c[43814]|0;j=c[k>>2]|0;k=0;do{p=m+(k<<4)|0;d=j+(k<<4)|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];k=k+1|0;}while((k|0)<(t|0))}c[e>>2]=t;n=c[43814]|0;i=g;return n|0}function gl(){var b=0,d=0,e=0,f=0;b=i;d=c[43780]|0;c[43780]=d+1;do{if((d|0)>0){e=0}else{f=kk(4800)|0;c[43814]=f;if((f|0)==0){Fv(1,116592,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;e=1;break}c[44370]=300;c[44282]=0;c[44290]=0;if((a[213992]|0)==0){e=0;break}ym();e=0}}while(0);i=b;return e|0}function hl(){var b=0,d=0,e=0,f=0,g=0.0;b=i;d=(c[43780]|0)-1|0;c[43780]=d;if((d|0)>0){i=b;return}eF(c[43814]|0);if((a[213992]|0)==0){i=b;return}d=c[o>>2]|0;e=c[44282]|0;f=c[44290]|0;g=+zm();gc(d|0,155248,(d=i,i=i+24|0,c[d>>2]=e,c[d+8>>2]=f,h[d+16>>3]=g,d)|0)|0;i=d;i=b;return}function il(a,b){a=a|0;b=b|0;return jl(a,b,0)|0}function jl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0,B=0.0,C=0,D=0,E=0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0.0,R=0,S=0.0,T=0,U=0.0,X=0,Y=0.0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0.0,Da=0.0,Ea=0.0,Fa=0.0,Ga=0,Ha=0.0,Ia=0.0,Ja=0.0,Ka=0.0,La=0,Na=0.0,Oa=0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0.0,Va=0.0,Wa=0.0,Xa=0,Ya=0,Za=0,_a=0.0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0;f=i;i=i+96|0;g=f|0;j=f+8|0;k=f+16|0;l=f+24|0;m=f+56|0;n=f+88|0;c[44282]=(c[44282]|0)+1;p=b+80|0;c[44290]=(c[44290]|0)+(c[p>>2]|0);q=c[b+88>>2]|0;a:do{if((q|0)!=0){r=q;while(1){s=c[r+8>>2]|0;if((a[s+112|0]|0)==0){break}t=c[s+116>>2]|0;if((t|0)==0){break a}else{r=t}}t=c[b+84>>2]|0;s=c[p>>2]|0;u=(s|0)>0;if(u){v=0;w=0;while(1){x=t+(v<<5)|0;y=+h[t+(v<<5)+8>>3]- +h[t+(v<<5)+24>>3];if(y<0.0){z=-0.0-y}else{z=y}do{if(z<.01){A=w}else{y=+h[x>>3]- +h[t+(v<<5)+16>>3];if(y<0.0){B=-0.0-y}else{B=y}if(B<.01){A=w;break}if((w|0)!=(v|0)){C=t+(w<<5)|0;D=x;c[C>>2]=c[D>>2];c[C+4>>2]=c[D+4>>2];c[C+8>>2]=c[D+8>>2];c[C+12>>2]=c[D+12>>2];c[C+16>>2]=c[D+16>>2];c[C+20>>2]=c[D+20>>2];c[C+24>>2]=c[D+24>>2];c[C+28>>2]=c[D+28>>2]}A=w+1|0}}while(0);x=v+1|0;if((x|0)<(s|0)){v=x;w=A}else{E=A;break}}}else{E=0}w=t|0;y=+h[w>>3];v=t+16|0;F=+h[v>>3];do{if(y<=F){x=t+8|0;G=+h[x>>3];D=t+24|0;H=+h[D>>3];if(G>H){break}C=E-1|0;do{if((C|0)>0){I=c[o>>2]|0;J=0;K=F;L=y;M=H;N=G;while(1){O=J+1|0;P=t+(O<<5)|0;Q=+h[P>>3];R=t+(O<<5)+16|0;S=+h[R>>3];if(Q>S){break}T=t+(O<<5)+8|0;U=+h[T>>3];X=t+(O<<5)+24|0;Y=+h[X>>3];if(U>Y){break}Z=t+(J<<5)+16|0;_=K<Q;$=_&1;aa=t+(J<<5)|0;ba=L>S;ca=ba&1;da=t+(J<<5)+24|0;ea=M<U;fa=ea&1;ga=t+(J<<5)+8|0;ha=N>Y;ia=ha&1;ja=ca+$+fa+ia|0;ka=(ja|0)>0;if(!((a[213992]|0)==0|ka^1)){gc(I|0,163336,(la=i,i=i+16|0,c[la>>2]=J,c[la+8>>2]=O,la)|0)|0;i=la;nl(b)}do{if(ka){do{if(_){ma=~~+h[Z>>3];h[Z>>3]=+h[P>>3];h[P>>3]=+(ma|0);na=ia;oa=fa;pa=ca;qa=0}else{if(ba){ma=~~+h[aa>>3];h[aa>>3]=+h[R>>3];h[R>>3]=+(ma|0);na=ia;oa=fa;pa=0;qa=$;break}if(ea){ma=~~+h[da>>3];h[da>>3]=+h[T>>3];h[T>>3]=+(ma|0);na=ia;oa=0;pa=ca;qa=$;break}if(!ha){na=ia;oa=fa;pa=ca;qa=$;break}ma=~~+h[ga>>3];h[ga>>3]=+h[X>>3];h[X>>3]=+(ma|0);na=0;oa=fa;pa=ca;qa=$}}while(0);ma=ja-1|0;if((ma|0)>0){ra=0;sa=qa;ta=pa;ua=oa;va=na}else{break}while(1){do{if((sa|0)==1){Y=+(~~((+h[Z>>3]+ +h[P>>3])*.5+.5)|0);h[P>>3]=Y;h[Z>>3]=Y;wa=va;xa=ua;ya=ta;za=0}else{if((ta|0)==1){Y=+(~~((+h[aa>>3]+ +h[R>>3])*.5+.5)|0);h[R>>3]=Y;h[aa>>3]=Y;wa=va;xa=ua;ya=0;za=sa;break}if((ua|0)==1){Y=+(~~((+h[da>>3]+ +h[T>>3])*.5+.5)|0);h[T>>3]=Y;h[da>>3]=Y;wa=va;xa=0;ya=ta;za=sa;break}if((va|0)!=1){wa=va;xa=ua;ya=ta;za=sa;break}Y=+(~~((+h[ga>>3]+ +h[X>>3])*.5+.5)|0);h[X>>3]=Y;h[ga>>3]=Y;wa=0;xa=ua;ya=ta;za=sa}}while(0);Aa=ra+1|0;if((Aa|0)<(ma|0)){ra=Aa;sa=za;ta=ya;ua=xa;va=wa}else{break}}}}while(0);Y=+h[aa>>3];ja=~~Y;U=+h[Z>>3];$=~~U;S=+h[P>>3];ca=~~S;Q=+h[R>>3];fa=~~Q;do{if(($|0)>(ca|0)&(ja|0)<(fa|0)){if(!((ca|0)>(ja|0)|(ja|0)>(fa|0))){Ba=fa-ja|0;break}if((ca|0)>($|0)|($|0)>(fa|0)){ia=$-ja|0;ha=fa-ca|0;Ba=(ia|0)<(ha|0)?ia:ha;break}else{Ba=$-ca|0;break}}else{Ba=0}}while(0);Ca=+h[ga>>3];ca=~~Ca;Da=+h[da>>3];$=~~Da;Ea=+h[T>>3];fa=~~Ea;Fa=+h[X>>3];ja=~~Fa;do{if(($|0)>(fa|0)&(ca|0)<(ja|0)){do{if((fa|0)>(ca|0)|(ca|0)>(ja|0)){if((fa|0)>($|0)|($|0)>(ja|0)){ha=$-ca|0;ia=ja-fa|0;Ga=(ha|0)<(ia|0)?ha:ia;break}else{Ga=$-fa|0;break}}else{Ga=ja-ca|0}}while(0);if((Ba|0)==0|(Ga|0)==0){Ha=Q;Ia=S;Ja=Fa;Ka=Ea;break}if((Ba|0)<(Ga|0)){ia=U<Q;if(U-Y>Q-S){if(ia){h[Z>>3]=S;Ha=Q;Ia=S;Ja=Fa;Ka=Ea;break}else{h[aa>>3]=Q;Ha=Q;Ia=S;Ja=Fa;Ka=Ea;break}}else{if(ia){h[P>>3]=U;Ha=Q;Ia=U;Ja=Fa;Ka=Ea;break}else{h[R>>3]=Y;Ha=Y;Ia=S;Ja=Fa;Ka=Ea;break}}}else{ia=Da<Fa;if(Da-Ca>Fa-Ea){if(ia){h[da>>3]=Ea;Ha=Q;Ia=S;Ja=Fa;Ka=Ea;break}else{h[ga>>3]=Fa;Ha=Q;Ia=S;Ja=Fa;Ka=Ea;break}}else{if(ia){h[T>>3]=Da;Ha=Q;Ia=S;Ja=Fa;Ka=Da;break}else{h[X>>3]=Ca;Ha=Q;Ia=S;Ja=Ca;Ka=Ea;break}}}}else{Ha=Q;Ia=S;Ja=Fa;Ka=Ea}}while(0);if((O|0)<(C|0)){J=O;K=Ha;L=Ia;M=Ja;N=Ka}else{La=75;break}}if((La|0)==75){Na=+h[w>>3];break}Fv(1,167528,(la=i,i=i+8|0,c[la>>2]=O,la)|0)|0;i=la;nl(b);Oa=0;i=f;return Oa|0}else{Na=y}}while(0);J=b|0;G=+h[J>>3];do{if(G<Na){La=80}else{if(G>+h[v>>3]){La=80;break}H=+h[b+8>>3];if(H<+h[x>>3]){La=80;break}if(H>+h[D>>3]){La=80}}}while(0);do{if((La|0)==80){if((a[213992]|0)==0){Pa=G;Qa=Na}else{Ma(159320,42,1,c[o>>2]|0)|0;nl(b);Pa=+h[J>>3];Qa=+h[w>>3]}if(Pa<Qa){h[J>>3]=Qa;Ra=Qa}else{Ra=Pa}H=+h[v>>3];if(Ra>H){h[J>>3]=H}I=b+8|0;H=+h[I>>3];N=+h[x>>3];if(H<N){h[I>>3]=N;Sa=N}else{Sa=H}H=+h[D>>3];if(Sa<=H){break}h[I>>3]=H}}while(0);D=b+40|0;G=+h[D>>3];I=t+(C<<5)|0;H=+h[I>>3];do{if(G<H){La=94}else{if(G>+h[t+(C<<5)+16>>3]){La=94;break}N=+h[b+48>>3];if(N<+h[t+(C<<5)+8>>3]){La=94;break}if(N>+h[t+(C<<5)+24>>3]){La=94}}}while(0);do{if((La|0)==94){if((a[213992]|0)==0){Ta=G;Ua=H}else{Ma(154240,39,1,c[o>>2]|0)|0;nl(b);Ta=+h[D>>3];Ua=+h[I>>3]}if(Ta<Ua){h[D>>3]=Ua;Va=Ua}else{Va=Ta}N=+h[t+(C<<5)+16>>3];if(Va>N){h[D>>3]=N}X=b+48|0;N=+h[X>>3];M=+h[t+(C<<5)+8>>3];if(N<M){h[X>>3]=M;Wa=M}else{Wa=N}N=+h[t+(C<<5)+24>>3];if(Wa<=N){break}h[X>>3]=N}}while(0);C=s<<3;if((C|0)>(c[44072]|0)){I=c[44070]|0;if((I|0)==0){Xa=kk(s<<7)|0}else{Xa=mk(I,s<<7)|0}c[44070]=Xa;c[44072]=C}b:do{if((s|0)>1){H=+h[x>>3];C=H<=+h[t+40>>3];if(C|u^1){Ya=C&1^1;break}else{Za=0;_a=H}while(1){C=t+(Za<<5)+24|0;H=+h[C>>3];h[C>>3]=_a*-1.0;h[t+(Za<<5)+8>>3]=-0.0-H;C=Za+1|0;if((C|0)>=(s|0)){Ya=1;break b}Za=C;_a=+h[t+(C<<5)+8>>3]}}else{Ya=0}}while(0);x=r;C=c[x>>2]&3;I=r+32|0;X=c[((C|0)==3?r:I)+28>>2]|0;T=r-32|0;if((X|0)==(c[((C|0)==2?r:T)+28>>2]|0)){C=$w(X|0)|0;Fv(1,102232,(la=i,i=i+8|0,c[la>>2]=C,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}c:do{if(u){C=s-1|0;X=c[44070]|0;ga=0;da=0;d:while(1){if((da|0)>0){$a=+h[t+(da<<5)+8>>3]>+h[t+(da-1<<5)+8>>3]?-1:1}else{$a=0}if((da|0)<(C|0)){ab=+h[t+(da+1<<5)+8>>3]>+h[t+(da<<5)+8>>3]?1:-1}else{ab=0}do{if(($a|0)==(ab|0)){if(($a|0)==(-1|0)){bb=ga;break}else if(($a|0)!=0){La=126;break d}R=t+(da<<5)|0;h[X+(ga<<4)>>3]=+h[R>>3];P=ga+1|0;h[X+(ga<<4)+8>>3]=+h[t+(da<<5)+24>>3];h[X+(P<<4)>>3]=+h[R>>3];h[X+(P<<4)+8>>3]=+h[t+(da<<5)+8>>3];bb=ga+2|0}else{if((ab|0)==-1|($a|0)==1){P=t+(da<<5)|0;h[X+(ga<<4)>>3]=+h[P>>3];R=ga+1|0;h[X+(ga<<4)+8>>3]=+h[t+(da<<5)+24>>3];h[X+(R<<4)>>3]=+h[P>>3];h[X+(R<<4)+8>>3]=+h[t+(da<<5)+8>>3];bb=ga+2|0;break}else{R=t+(da<<5)+16|0;h[X+(ga<<4)>>3]=+h[R>>3];P=ga+1|0;h[X+(ga<<4)+8>>3]=+h[t+(da<<5)+8>>3];h[X+(P<<4)>>3]=+h[R>>3];h[X+(P<<4)+8>>3]=+h[t+(da<<5)+24>>3];bb=ga+2|0;break}}}while(0);P=da+1|0;if((P|0)<(s|0)){ga=bb;da=P}else{break}}if((La|0)==126){Fv(1,107912,(la=i,i=i+24|0,c[la>>2]=$a,c[la+8>>2]=$a,c[la+16>>2]=480,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}if(!u){cb=bb;break}da=c[44070]|0;ga=bb;X=C;e:while(1){if((X|0)<(C|0)){db=+h[t+(X<<5)+8>>3]>+h[t+(X+1<<5)+8>>3]?-1:1}else{db=0}P=(X|0)>0;if(P){eb=+h[t+(X-1<<5)+8>>3]>+h[t+(X<<5)+8>>3]?1:-1}else{eb=0}do{if((db|0)==(eb|0)){if((db|0)==0){R=t+(X<<5)+16|0;h[da+(ga<<4)>>3]=+h[R>>3];aa=ga+1|0;h[da+(ga<<4)+8>>3]=+h[t+(X<<5)+8>>3];h[da+(aa<<4)>>3]=+h[R>>3];h[da+(aa<<4)+8>>3]=+h[t+(X<<5)+24>>3];fb=ga+2|0;break}else if((db|0)==(-1|0)){aa=t+(X<<5)+16|0;h[da+(ga<<4)>>3]=+h[aa>>3];R=t+(X<<5)+8|0;Z=ga+1|0;h[da+(ga<<4)+8>>3]=+h[R>>3];h[da+(Z<<4)>>3]=+h[aa>>3];aa=t+(X<<5)+24|0;ca=ga+2|0;h[da+(Z<<4)+8>>3]=+h[aa>>3];Z=t+(X<<5)|0;h[da+(ca<<4)>>3]=+h[Z>>3];ja=ga+3|0;h[da+(ca<<4)+8>>3]=+h[aa>>3];h[da+(ja<<4)>>3]=+h[Z>>3];h[da+(ja<<4)+8>>3]=+h[R>>3];fb=ga+4|0;break}else{break e}}else{if((eb|0)==-1|(db|0)==1){R=t+(X<<5)|0;h[da+(ga<<4)>>3]=+h[R>>3];ja=ga+1|0;h[da+(ga<<4)+8>>3]=+h[t+(X<<5)+24>>3];h[da+(ja<<4)>>3]=+h[R>>3];h[da+(ja<<4)+8>>3]=+h[t+(X<<5)+8>>3];fb=ga+2|0;break}else{ja=t+(X<<5)+16|0;h[da+(ga<<4)>>3]=+h[ja>>3];R=ga+1|0;h[da+(ga<<4)+8>>3]=+h[t+(X<<5)+8>>3];h[da+(R<<4)>>3]=+h[ja>>3];h[da+(R<<4)+8>>3]=+h[t+(X<<5)+24>>3];fb=ga+2|0;break}}}while(0);if(P){ga=fb;X=X-1|0}else{cb=fb;break c}}Fv(1,107912,(la=i,i=i+24|0,c[la>>2]=db,c[la+8>>2]=db,c[la+16>>2]=513,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}else{cb=0}}while(0);do{if((Ya|0)!=0){if(u){X=0;do{ga=t+(X<<5)+24|0;da=~~+h[ga>>3];C=t+(X<<5)+8|0;h[ga>>3]=+h[C>>3]*-1.0;h[C>>3]=+(-da|0);X=X+1|0;}while((X|0)<(s|0))}if((cb|0)<=0){break}X=c[44070]|0;da=0;do{C=X+(da<<4)+8|0;h[C>>3]=+h[C>>3]*-1.0;da=da+1|0;}while((da|0)<(cb|0))}}while(0);if(u){da=0;do{h[t+(da<<5)>>3]=2147483647.0;h[t+(da<<5)+16>>3]=-2147483648.0;da=da+1|0;}while((da|0)<(s|0))}c[g>>2]=c[44070];da=g+4|0;c[da>>2]=cb;h[l>>3]=+h[J>>3];h[l+8>>3]=+h[b+8>>3];h[l+16>>3]=+h[D>>3];h[l+24>>3]=+h[b+48>>3];if((PB(g,l|0,j)|0)<0){Fv(1,96504,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}do{if((e|0)==0){X=c[da>>2]|0;if((X|0)>(c[45170]|0)){C=c[45168]|0;if((C|0)==0){gb=kk(X<<5)|0}else{gb=mk(C,X<<5)|0}c[45168]=gb;C=c[da>>2]|0;c[45170]=C;hb=C}else{hb=X}if((hb|0)>0){X=c[45168]|0;C=c[44070]|0;ga=0;while(1){R=X+(ga<<5)|0;ja=C+(ga<<4)|0;c[R>>2]=c[ja>>2];c[R+4>>2]=c[ja+4>>2];c[R+8>>2]=c[ja+8>>2];c[R+12>>2]=c[ja+12>>2];ja=ga+1|0;R=X+(ga<<5)+16|0;Z=C+(((ja|0)%(hb|0)|0)<<4)|0;c[R>>2]=c[Z>>2];c[R+4>>2]=c[Z+4>>2];c[R+8>>2]=c[Z+8>>2];c[R+12>>2]=c[Z+12>>2];if((ja|0)<(hb|0)){ga=ja}else{break}}}if((a[b+29|0]|0)==0){vF(m|0,0,16)|0}else{H=+h[b+16>>3];h[m>>3]=+V(H);h[m+8>>3]=+W(H)}if((a[b+69|0]|0)==0){vF(m+16|0,0,16)|0}else{H=+h[b+56>>3];h[m+16>>3]=-0.0- +V(H);h[m+24>>3]=-0.0- +W(H)}if((MB(c[45168]|0,hb,j,m|0,k)|0)>=0){break}Fv(1,91176,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}else{ZB(j,k)}}while(0);da=k+4|0;D=c[da>>2]|0;J=c[44370]|0;do{if((J|0)<(D|0)){ga=D+300+J-((D|0)%300|0)|0;C=mk(c[43814]|0,ga<<4)|0;c[43814]=C;if((C|0)!=0){c[44370]=ga;break}Fv(1,126600,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}}while(0);if(u){D=0;do{h[t+(D<<5)>>3]=2147483647.0;h[t+(D<<5)+16>>3]=-2147483648.0;D=D+1|0;}while((D|0)<(s|0))}D=c[da>>2]|0;if((D|0)>0){J=c[43814]|0;ga=c[k>>2]|0;C=0;do{X=J+(C<<4)|0;ja=ga+(C<<4)|0;c[X>>2]=c[ja>>2];c[X+4>>2]=c[ja+4>>2];c[X+8>>2]=c[ja+8>>2];c[X+12>>2]=c[ja+12>>2];C=C+1|0;}while((C|0)<(D|0))}f:do{if(u){C=0;ga=10;J=1;ja=D;while(1){ml(t,s,c[43814]|0,ja,ga);X=0;while(1){if(+h[t+(X<<5)>>3]==2147483647.0){La=185;break}Z=X+1|0;if(+h[t+(X<<5)+16>>3]==-2147483648.0){La=185;break}if((Z|0)<(s|0)){X=Z}else{ib=ga;jb=C;kb=Z;break}}if((La|0)==185){La=0;P=ga<<1;ib=P;jb=(P|0)>(2147483647/(s|0)|0|0)?15:C;kb=X}P=(kb|0)==(s|0)?0:J;Z=jb+1|0;if(!(P<<24>>24!=0&(Z|0)<15)){lb=P;break f}C=Z;ga=ib;J=P;ja=c[da>>2]|0}}else{ja=(s|0)==0;J=1;ga=1;C=D;while(1){ml(t,s,c[43814]|0,C,10);P=ja?0:ga;if(!(P<<24>>24!=0&(J|0)<15)){lb=P;break f}J=J+1|0;ga=P;C=c[da>>2]|0}}}while(0);if(lb<<24>>24!=0){D=$w(c[((c[x>>2]&3|0)==3?r:I)+28>>2]|0)|0;C=$w(c[((c[x>>2]&3|0)==2?r:T)+28>>2]|0)|0;Fv(0,85904,(la=i,i=i+16|0,c[la>>2]=D,c[la+8>>2]=C,la)|0)|0;i=la;ZB(j,n);C=n|0;ml(t,s,c[C>>2]|0,c[n+4>>2]|0,10);eF(c[C>>2]|0)}c[d>>2]=c[da>>2];Oa=c[43814]|0;i=f;return Oa|0}}while(0);Fv(1,81296,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;nl(b);Oa=0;i=f;return Oa|0}}while(0);Fv(1,114784,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}function kl(a,b){a=a|0;b=b|0;return jl(a,b,1)|0}function ll(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0,F=0,G=0,H=0.0,I=0.0,J=0,K=0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,U=0,V=0.0,W=0.0,X=0,Y=0,Z=0,_=0,$=0,aa=0;j=i;i=i+240|0;k=j|0;l=j+64|0;m=j+128|0;n=j+144|0;o=j+160|0;p=j+224|0;q=j+232|0;r=e;s=c[r>>2]|0;t=s&3;u=e-32|0;v=c[((t|0)==2?e:u)+28>>2]|0;w=c[e+8>>2]|0;x=b[w+168>>1]|0;y=x<<16>>16;z=k+16|0;A=k|0;B=c[(c[((t|0)==3?e:e+32|0)+28>>2]|0)+8>>2]|0;C=+h[B+16>>3]+ +h[w+16>>3];D=+h[B+24>>3]+ +h[w+24>>3];B=k;h[k>>3]=C;h[k+8>>3]=D;t=z;c[t>>2]=c[B>>2];c[t+4>>2]=c[B+4>>2];c[t+8>>2]=c[B+8>>2];c[t+12>>2]=c[B+12>>2];E=m;c[E>>2]=c[B>>2];c[E+4>>2]=c[B+4>>2];c[E+8>>2]=c[B+8>>2];c[E+12>>2]=c[B+12>>2];F=k+32|0;G=c[v+8>>2]|0;H=+h[G+16>>3]+ +h[w+56>>3];I=+h[G+24>>3]+ +h[w+64>>3];w=k+48|0;h[k+48>>3]=H;h[k+56>>3]=I;G=F;c[G>>2]=c[w>>2];c[G+4>>2]=c[w+4>>2];c[G+8>>2]=c[w+8>>2];c[G+12>>2]=c[w+12>>2];J=n;c[J>>2]=c[w>>2];c[J+4>>2]=c[w+4>>2];c[J+8>>2]=c[w+8>>2];c[J+12>>2]=c[w+12>>2];if(!(x<<16>>16!=1&(a[215376]|0)==0)){if((f|0)==4){K=d+8|0;L=c[K>>2]|0;M=(+h[L+16>>3]+ +h[L+32>>3])*.5;h[22376]=M;L=c[K>>2]|0;N=(+h[L+24>>3]+ +h[L+40>>3])*.5;h[22377]=N;O=(C+H)*.5;P=(D+I)*.5;Q=H-C;R=I-D;S=+T(Q*Q+R*R)/5.0;R=M-O;M=N-P;N=+T(R*R+M*M);Q=O-S*(R/N);R=P-S*(M/N);h[k+32>>3]=Q;h[k+16>>3]=Q;h[k+40>>3]=R;h[k+24>>3]=R;U=c[r>>2]|0}else{U=s}cm(e,c[((U&3|0)==2?e:u)+28>>2]|0,A,4,g);nm(d,e,m,n);i=j;return}R=C-H;Q=D-I;N=Q*Q;if(R*R+N<1.0e-6){c[t>>2]=c[B>>2];c[t+4>>2]=c[B+4>>2];c[t+8>>2]=c[B+8>>2];c[t+12>>2]=c[B+12>>2];c[G>>2]=c[w>>2];c[G+4>>2]=c[w+4>>2];c[G+8>>2]=c[w+8>>2];c[G+12>>2]=c[w+12>>2];V=0.0;W=0.0}else{R=H-C;M=+T(R*R+N);A=c[(c[(c[d+48>>2]|0)+8>>2]|0)+236>>2]|0;N=+((da(A,y-1|0)|0)/2|0|0);S=Q*N/M;h[z>>3]=C+S;C=R*N/M;h[k+24>>3]=D+C;h[F>>3]=S+H;h[k+40>>3]=C+I;I=+(-A|0);V=R*I/M;W=Q*I/M}if(x<<16>>16<=0){i=j;return}x=(f|0)==6;f=q+4|0;A=o|0;u=q|0;U=p|0;r=p+4|0;L=z|0;z=k+24|0;K=F|0;F=k+40|0;X=l|0;Y=1;Z=e;e=s;while(1){s=Z;_=Z-32|0;if((c[((e&3|0)==2?Z:_)+28>>2]|0)==(v|0)){c[E>>2]=c[B>>2];c[E+4>>2]=c[B+4>>2];c[E+8>>2]=c[B+8>>2];c[E+12>>2]=c[B+12>>2];c[J>>2]=c[w>>2];c[J+4>>2]=c[w+4>>2];c[J+8>>2]=c[w+8>>2];c[J+12>>2]=c[w+12>>2];$=l;aa=k;c[$>>2]=c[aa>>2];c[$+4>>2]=c[aa+4>>2];c[$+8>>2]=c[aa+8>>2];c[$+12>>2]=c[aa+12>>2];aa=l+16|0;c[aa>>2]=c[t>>2];c[aa+4>>2]=c[t+4>>2];c[aa+8>>2]=c[t+8>>2];c[aa+12>>2]=c[t+12>>2];aa=l+32|0;c[aa>>2]=c[G>>2];c[aa+4>>2]=c[G+4>>2];c[aa+8>>2]=c[G+8>>2];c[aa+12>>2]=c[G+12>>2];aa=l+48|0;c[aa>>2]=c[w>>2];c[aa+4>>2]=c[w+4>>2];c[aa+8>>2]=c[w+8>>2];c[aa+12>>2]=c[w+12>>2]}else{c[E>>2]=c[w>>2];c[E+4>>2]=c[w+4>>2];c[E+8>>2]=c[w+8>>2];c[E+12>>2]=c[w+12>>2];c[J>>2]=c[B>>2];c[J+4>>2]=c[B+4>>2];c[J+8>>2]=c[B+8>>2];c[J+12>>2]=c[B+12>>2];aa=l+48|0;$=k;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];$=l+32|0;c[$>>2]=c[t>>2];c[$+4>>2]=c[t+4>>2];c[$+8>>2]=c[t+8>>2];c[$+12>>2]=c[t+12>>2];$=l+16|0;c[$>>2]=c[G>>2];c[$+4>>2]=c[G+4>>2];c[$+8>>2]=c[G+8>>2];c[$+12>>2]=c[G+12>>2];$=l;c[$>>2]=c[w>>2];c[$+4>>2]=c[w+4>>2];c[$+8>>2]=c[w+8>>2];c[$+12>>2]=c[w+12>>2]}if(x){c[f>>2]=4;c[u>>2]=A;$=o;aa=l;c[$>>2]=c[aa>>2];c[$+4>>2]=c[aa+4>>2];c[$+8>>2]=c[aa+8>>2];c[$+12>>2]=c[aa+12>>2];aa=o+16|0;$=l+16|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];$=o+32|0;aa=l+32|0;c[$>>2]=c[aa>>2];c[$+4>>2]=c[aa+4>>2];c[$+8>>2]=c[aa+8>>2];c[$+12>>2]=c[aa+12>>2];aa=o+48|0;$=l+48|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];ZB(q,p);cm(Z,c[((c[s>>2]&3|0)==2?Z:_)+28>>2]|0,c[U>>2]|0,c[r>>2]|0,g)}else{cm(Z,c[((c[s>>2]&3|0)==2?Z:_)+28>>2]|0,X,4,g)}nm(d,Z,m,n);_=c[(c[Z+8>>2]|0)+172>>2]|0;h[L>>3]=W+ +h[L>>3];h[z>>3]=V+ +h[z>>3];h[K>>3]=W+ +h[K>>3];h[F>>3]=V+ +h[F>>3];if((Y|0)>=(y|0)){break}Y=Y+1|0;Z=_;e=c[_>>2]|0}i=j;return}function ml(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0;f=da(e,b)|0;if((d|0)<=3){return}e=(f|0)<0;g=+(f|0);i=(b|0)>0;j=0;k=3;while(1){a:do{if(!e){l=c+(j<<4)|0;m=c+(j<<4)+8|0;n=j+1|0;o=c+(n<<4)|0;p=c+(n<<4)+8|0;n=j+2|0;q=c+(n<<4)|0;r=c+(n<<4)+8|0;n=c+(k<<4)|0;s=c+(k<<4)+8|0;if(i){t=0}else{break}while(1){u=+(t|0)/g;v=+h[l>>3];w=+h[m>>3];x=+h[o>>3];y=+h[p>>3];z=+h[q>>3];A=+h[r>>3];B=v+u*(x-v);v=w+u*(y-w);w=x+u*(z-x);x=y+u*(A-y);y=B+u*(w-B);B=v+u*(x-v);v=y+u*(w+u*(z+u*(+h[n>>3]-z)-w)-y);y=B+u*(x+u*(A+u*(+h[s>>3]-A)-x)-B);C=0;do{do{if(y<=+h[a+(C<<5)+24>>3]+1.0e-4){if(y<+h[a+(C<<5)+8>>3]+-1.0e-4){break}D=a+(C<<5)|0;if(+h[D>>3]>v){h[D>>3]=v}D=a+(C<<5)+16|0;if(+h[D>>3]>=v){break}h[D>>3]=v}}while(0);C=C+1|0;}while((C|0)<(b|0));if((t|0)>=(f|0)){break a}t=t+1|0}}}while(0);s=k+3|0;if((s|0)<(d|0)){j=k;k=s}else{break}}return}function nl(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,p=0.0,q=0.0;d=i;e=c[o>>2]|0;f=b+80|0;gc(e|0,151104,(g=i,i=i+8|0,c[g>>2]=c[f>>2],g)|0)|0;i=g;if((c[f>>2]|0)>0){j=b+84|0;k=0;do{l=c[j>>2]|0;m=+h[l+(k<<5)>>3];n=+h[l+(k<<5)+8>>3];p=+h[l+(k<<5)+16>>3];q=+h[l+(k<<5)+24>>3];gc(e|0,148176,(g=i,i=i+40|0,c[g>>2]=k,h[g+8>>3]=m,h[g+16>>3]=n,h[g+24>>3]=p,h[g+32>>3]=q,g)|0)|0;i=g;k=k+1|0;}while((k|0)<(c[f>>2]|0))}q=+h[b+8>>3];p=+h[b+16>>3];f=(a[b+29|0]|0)!=0?142088:138952;gc(e|0,145e3,(g=i,i=i+32|0,h[g>>3]=+h[b>>3],h[g+8>>3]=q,h[g+16>>3]=p,c[g+24>>2]=f,g)|0)|0;i=g;p=+h[b+48>>3];q=+h[b+56>>3];f=(a[b+69|0]|0)!=0?142088:138952;gc(e|0,136416,(g=i,i=i+32|0,h[g>>3]=+h[b+40>>3],h[g+8>>3]=p,h[g+16>>3]=q,c[g+24>>2]=f,g)|0)|0;i=g;i=d;return}
-
-
-
-function Wc(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function Xc(){return i|0}function Yc(a){a=a|0;i=a}function Zc(a,b){a=a|0;b=b|0;if((u|0)==0){u=a;v=b}}function _c(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0]}function $c(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0];a[k+4|0]=a[b+4|0];a[k+5|0]=a[b+5|0];a[k+6|0]=a[b+6|0];a[k+7|0]=a[b+7|0]}function ad(a){a=a|0;H=a}function bd(a){a=a|0;I=a}function cd(a){a=a|0;J=a}function dd(a){a=a|0;K=a}function ed(a){a=a|0;L=a}function fd(a){a=a|0;M=a}function gd(a){a=a|0;N=a}function hd(a){a=a|0;O=a}function id(a){a=a|0;P=a}function jd(a){a=a|0;Q=a}function kd(){}function ld(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e|0;if((c[45198]|0)==0){g=Oz()|0;c[45198]=g;Tz(g,23376);Tz(c[45198]|0,23368);Tz(c[45198]|0,23352)}g=mx(a)|0;Pz(c[45198]|0,g,d)|0;c[f>>2]=0;Rz(c[45198]|0,g,b,f,e+8|0)|0;JA(c[45198]|0,g)|0;Kw(g)|0;g=c[44396]|0;if((g|0)==0){h=c[f>>2]|0;c[44396]=h;i=e;return h|0}Sz(g);h=c[f>>2]|0;c[44396]=h;i=e;return h|0}function md(a){a=a|0;return nd(a,0,0)|0}function nd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;do{if((d|0)==0){f=dF(476)|0;g=f;if((f|0)==0){h=g;break}c[f+12>>2]=6;c[f+16>>2]=202;c[f+20>>2]=150;h=g}else{g=d|0;f=Ec[c[g>>2]&63](476)|0;i=f;if((f|0)==0){h=i;break}c[f+12>>2]=c[g>>2];c[f+16>>2]=c[d+4>>2];c[f+20>>2]=c[d+8>>2];h=i}}while(0);if((h|0)==0){j=0;return j|0}c[h+8>>2]=0;c[h+32>>2]=0;c[h+364>>2]=16;d=h+12|0;i=d|0;f=Ec[c[i>>2]&63](256)|0;g=h+376|0;c[g>>2]=f;if((f|0)==0){Cc[c[h+20>>2]&255](h);j=0;return j|0}f=Ec[c[i>>2]&63](1024)|0;k=h+44|0;c[k>>2]=f;if((f|0)==0){l=h+20|0;Cc[c[l>>2]&255](c[g>>2]|0);Cc[c[l>>2]&255](h);j=0;return j|0}c[h+48>>2]=f+1024;f=Ec[c[i>>2]&63](168)|0;i=f;if((f|0)==0){c[h+340>>2]=i;l=h+20|0;Cc[c[l>>2]&255](c[k>>2]|0);Cc[c[l>>2]&255](c[g>>2]|0);Cc[c[l>>2]&255](h);j=0;return j|0}vF(f+80|0,0,20)|0;c[f+100>>2]=d;vF(f+104|0,0,20)|0;c[f+124>>2]=d;a[f+4|0]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f>>2]=0;c[f+16>>2]=d;a[f+24|0]=0;c[f+28>>2]=0;c[f+32>>2]=0;c[f+20>>2]=0;c[f+36>>2]=d;a[f+44|0]=0;c[f+48>>2]=0;c[f+52>>2]=0;c[f+40>>2]=0;c[f+56>>2]=d;a[f+64|0]=0;c[f+68>>2]=0;c[f+72>>2]=0;c[f+60>>2]=0;c[f+76>>2]=d;c[f+132>>2]=0;c[f+136>>2]=0;a[f+140|0]=0;vF(f+144|0,0,24)|0;a[f+128|0]=1;a[f+129|0]=0;a[f+130|0]=0;c[h+340>>2]=i;c[h+360>>2]=0;c[h+352>>2]=0;c[h+288>>2]=0;c[h+452>>2]=0;c[h+448>>2]=0;c[h+124>>2]=0;c[h+244>>2]=0;i=h+456|0;a[i]=33;f=h+232|0;a[f]=0;a[h+233|0]=0;c[h+380>>2]=0;c[h+384>>2]=0;a[h+388|0]=0;vF(h+400|0,0,20)|0;c[h+420>>2]=d;vF(h+424|0,0,20)|0;c[h+444>>2]=d;od(h,b);do{if((b|0)!=0){if((c[h+228>>2]|0)!=0){break}qd(h);j=0;return j|0}}while(0);if((e|0)==0){c[h+224>>2]=Ze()|0;j=h;return j|0}else{a[f]=1;c[h+224>>2]=Ze()|0;a[i]=a[e]|0;j=h;return j|0}return 0}function od(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;c[b+264>>2]=102;Yd(b+252|0);a:do{if((d|0)==0){e=0}else{f=b+400|0;g=b+412|0;h=b+408|0;i=d;while(1){j=c[g>>2]|0;if((j|0)==(c[h>>2]|0)){if((Bd(f)|0)<<24>>24==0){e=0;break a}k=c[g>>2]|0}else{k=j}j=a[i]|0;c[g>>2]=k+1;a[k]=j;if((a[i]|0)==0){break}else{i=i+1|0}}i=b+416|0;f=c[i>>2]|0;c[i>>2]=c[g>>2];e=f}}while(0);c[b+228>>2]=e;c[b+344>>2]=0;_e(b+148|0,b+144|0,0)|0;c[b>>2]=0;c[b+4>>2]=0;vF(b+52|0,0,64)|0;c[b+116>>2]=b;c[b+120>>2]=0;vF(b+128|0,0,16)|0;e=c[b+8>>2]|0;c[b+24>>2]=e;c[b+28>>2]=e;c[b+36>>2]=0;c[b+40>>2]=0;e=b+392|0;c[e>>2]=0;c[e+4>>2]=0;vF(b+268|0,0,20)|0;vF(b+300|0,0,38)|0;a[b+292|0]=1;c[b+296>>2]=0;c[b+348>>2]=0;c[b+356>>2]=0;c[b+368>>2]=0;c[b+236>>2]=0;c[b+248>>2]=0;c[b+240>>2]=0;c[b+460>>2]=0;c[b+464>>2]=0;c[b+472>>2]=0;return}function pd(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;f=c[b+340>>2]|0;if((a[e]|0)==0){g=1;return g|0}h=b+400|0;i=b+412|0;j=b+408|0;k=b+416|0;l=f+132|0;m=b+356|0;n=f+60|0;o=f+80|0;p=f+92|0;q=f+88|0;r=f+96|0;s=f+8|0;t=b+472|0;u=f|0;v=f+4|0;f=e;a:while(1){e=f;while(1){w=a[e]|0;if((w<<24>>24|0)==12|(w<<24>>24|0)==0){x=5;break}y=c[i>>2]|0;if(w<<24>>24==61){x=24;break}if((y|0)==(c[j>>2]|0)){if((Bd(h)|0)<<24>>24==0){g=0;x=54;break a}z=a[e]|0;A=c[i>>2]|0}else{z=w;A=y}c[i>>2]=A+1;a[A]=z;if((a[f]|0)==0){g=1;x=54;break a}e=e+1|0}if((x|0)==5){x=0;w=c[i>>2]|0;if((w|0)==(c[j>>2]|0)){if((Bd(h)|0)<<24>>24==0){g=0;x=54;break}B=c[i>>2]|0}else{B=w}c[i>>2]=B+1;a[B]=0;w=c[k>>2]|0;C=c[s>>2]|0;b:do{if((C|0)==0){D=w}else{E=c[t>>2]|0;F=a[w]|0;if(F<<24>>24==0){G=E}else{H=w;I=E;E=F;while(1){J=H+1|0;K=(I*1000003|0)^E&255;L=a[J]|0;if(L<<24>>24==0){G=K;break}else{H=J;I=K;E=L}}}E=C-1|0;I=G&E;H=c[u>>2]|0;L=c[H+(I<<2)>>2]|0;if((L|0)==0){D=w;break}K=G&-C;J=E>>>2;E=0;M=I;I=L;c:while(1){L=c[I>>2]|0;if(F<<24>>24==(a[L]|0)){N=w;O=L;L=F;do{if(L<<24>>24==0){break c}N=N+1|0;O=O+1|0;L=a[N]|0;}while(L<<24>>24==(a[O]|0))}if(E<<24>>24==0){P=(K>>>(((d[v]|0)-1|0)>>>0)&J|1)&255}else{P=E}O=P&255;L=(M>>>0<O>>>0?C:0)+(M-O)|0;O=c[H+(L<<2)>>2]|0;if((O|0)==0){D=w;break b}else{E=P;M=L;I=O}}if((I|0)==0){D=w;break}a[I+32|0]=1;D=c[k>>2]|0}}while(0);w=(a[e]|0)==0?e:e+1|0;c[i>>2]=D;Q=w}else if((x|0)==24){x=0;if((y|0)==(c[k>>2]|0)){R=l;S=y}else{if((y|0)==(c[j>>2]|0)){if((Bd(h)|0)<<24>>24==0){g=0;x=54;break}T=c[i>>2]|0}else{T=y}c[i>>2]=T+1;a[T]=0;w=Cd(b,n,c[k>>2]|0,8)|0;C=w;if((w|0)==0){g=0;x=54;break}U=w|0;w=c[U>>2]|0;M=c[k>>2]|0;if((w|0)==(M|0)){E=w;while(1){w=c[p>>2]|0;if((w|0)==(c[q>>2]|0)){if((Bd(o)|0)<<24>>24==0){x=32;break a}V=c[p>>2]|0}else{V=w}w=a[E]|0;c[p>>2]=V+1;a[V]=w;if((a[E]|0)==0){break}else{E=E+1|0}}E=c[r>>2]|0;c[r>>2]=c[p>>2];c[U>>2]=E;if((E|0)==0){g=0;x=54;break}W=c[k>>2]|0}else{W=M}c[i>>2]=W;R=C;S=W}E=e;w=S;while(1){X=E+1|0;H=a[X]|0;Y=(w|0)==(c[j>>2]|0);if((H<<24>>24|0)==12|(H<<24>>24|0)==0){break}if(Y){if((Bd(h)|0)<<24>>24==0){g=0;x=54;break a}Z=a[X]|0;_=c[i>>2]|0}else{Z=H;_=w}c[i>>2]=_+1;a[_]=Z;E=X;w=c[i>>2]|0}if(Y){if((Bd(h)|0)<<24>>24==0){g=0;x=54;break}$=c[i>>2]|0}else{$=w}c[i>>2]=$+1;a[$]=0;if((Dd(b,R,0,c[k>>2]|0,m)|0)!=0){g=0;x=54;break}c[i>>2]=c[k>>2];Q=(a[X]|0)==0?X:E+2|0}if((a[Q]|0)==0){g=1;x=54;break}else{f=Q}}if((x|0)==32){c[U>>2]=0;g=0;return g|0}else if((x|0)==54){return g|0}return 0}function qd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;if((a|0)==0){return}b=a+352|0;d=a+20|0;e=c[a+348>>2]|0;while(1){if((e|0)==0){f=c[b>>2]|0;if((f|0)==0){break}c[b>>2]=0;g=f}else{g=e}f=c[g>>2]|0;Cc[c[d>>2]&255](c[g+36>>2]|0);h=c[g+44>>2]|0;if((h|0)!=0){i=h;while(1){h=c[i+4>>2]|0;Cc[c[d>>2]&255](c[i+16>>2]|0);Cc[c[d>>2]&255](i);if((h|0)==0){break}else{i=h}}}Cc[c[d>>2]&255](g);e=f}e=a+288|0;g=c[a+284>>2]|0;while(1){if((g|0)==0){b=c[e>>2]|0;if((b|0)==0){break}c[e>>2]=0;j=b}else{j=g}b=c[j+8>>2]|0;Cc[c[d>>2]&255](j);g=b}g=c[a+360>>2]|0;if((g|0)!=0){j=g;while(1){g=c[j+4>>2]|0;Cc[c[d>>2]&255](c[j+16>>2]|0);Cc[c[d>>2]&255](j);if((g|0)==0){break}else{j=g}}}j=c[a+356>>2]|0;if((j|0)!=0){g=j;while(1){j=c[g+4>>2]|0;Cc[c[d>>2]&255](c[g+16>>2]|0);Cc[c[d>>2]&255](g);if((j|0)==0){break}else{g=j}}}g=c[a+400>>2]|0;if((g|0)!=0){j=a+420|0;e=g;while(1){g=c[e>>2]|0;Cc[c[(c[j>>2]|0)+8>>2]&255](e);if((g|0)==0){break}else{e=g}}}e=c[a+404>>2]|0;if((e|0)!=0){j=a+420|0;g=e;while(1){e=c[g>>2]|0;Cc[c[(c[j>>2]|0)+8>>2]&255](g);if((e|0)==0){break}else{g=e}}}g=c[a+424>>2]|0;if((g|0)!=0){j=a+444|0;e=g;while(1){g=c[e>>2]|0;Cc[c[(c[j>>2]|0)+8>>2]&255](e);if((g|0)==0){break}else{e=g}}}e=c[a+428>>2]|0;if((e|0)!=0){j=a+444|0;g=e;while(1){e=c[g>>2]|0;Cc[c[(c[j>>2]|0)+8>>2]&255](g);if((e|0)==0){break}else{g=e}}}g=c[a+340>>2]|0;if((g|0)!=0){j=(c[a+460>>2]|0)==0;e=g+20|0;b=c[e>>2]|0;i=g+28|0;h=c[i>>2]|0;k=b+(h<<2)|0;if((h|0)!=0){h=b;while(1){b=h+4|0;l=c[h>>2]|0;do{if((l|0)!=0){if((c[l+16>>2]|0)==0){break}Cc[c[d>>2]&255](c[l+20>>2]|0)}}while(0);if((b|0)==(k|0)){break}else{h=b}}}h=g+8|0;k=g+16|0;l=c[(c[k>>2]|0)+8>>2]|0;f=g|0;m=c[f>>2]|0;if((c[h>>2]|0)==0){n=l;o=m}else{p=0;q=l;l=m;while(1){Cc[q&255](c[l+(p<<2)>>2]|0);m=p+1|0;r=c[(c[k>>2]|0)+8>>2]|0;s=c[f>>2]|0;if(m>>>0<(c[h>>2]|0)>>>0){p=m;q=r;l=s}else{n=r;o=s;break}}}Cc[n&255](o);o=g+36|0;n=c[(c[o>>2]|0)+8>>2]|0;l=c[e>>2]|0;if((c[i>>2]|0)==0){t=n;u=l}else{q=0;p=n;n=l;while(1){Cc[p&255](c[n+(q<<2)>>2]|0);l=q+1|0;h=c[(c[o>>2]|0)+8>>2]|0;f=c[e>>2]|0;if(l>>>0<(c[i>>2]|0)>>>0){q=l;p=h;n=f}else{t=h;u=f;break}}}Cc[t&255](u);u=g+48|0;t=g+56|0;n=c[(c[t>>2]|0)+8>>2]|0;p=g+40|0;q=c[p>>2]|0;if((c[u>>2]|0)==0){v=n;w=q}else{i=0;e=n;n=q;while(1){Cc[e&255](c[n+(i<<2)>>2]|0);q=i+1|0;o=c[(c[t>>2]|0)+8>>2]|0;f=c[p>>2]|0;if(q>>>0<(c[u>>2]|0)>>>0){i=q;e=o;n=f}else{v=o;w=f;break}}}Cc[v&255](w);w=g+68|0;v=g+76|0;n=c[(c[v>>2]|0)+8>>2]|0;e=g+60|0;i=c[e>>2]|0;if((c[w>>2]|0)==0){x=n;y=i}else{u=0;p=n;n=i;while(1){Cc[p&255](c[n+(u<<2)>>2]|0);i=u+1|0;t=c[(c[v>>2]|0)+8>>2]|0;f=c[e>>2]|0;if(i>>>0<(c[w>>2]|0)>>>0){u=i;p=t;n=f}else{x=t;y=f;break}}}Cc[x&255](y);y=c[g+80>>2]|0;if((y|0)!=0){x=g+100|0;n=y;while(1){y=c[n>>2]|0;Cc[c[(c[x>>2]|0)+8>>2]&255](n);if((y|0)==0){break}else{n=y}}}n=c[g+84>>2]|0;if((n|0)!=0){x=g+100|0;y=n;while(1){n=c[y>>2]|0;Cc[c[(c[x>>2]|0)+8>>2]&255](y);if((n|0)==0){break}else{y=n}}}y=c[g+104>>2]|0;if((y|0)!=0){x=g+124|0;n=y;while(1){y=c[n>>2]|0;Cc[c[(c[x>>2]|0)+8>>2]&255](n);if((y|0)==0){break}else{n=y}}}n=c[g+108>>2]|0;if((n|0)!=0){x=g+124|0;y=n;while(1){n=c[y>>2]|0;Cc[c[(c[x>>2]|0)+8>>2]&255](y);if((n|0)==0){break}else{y=n}}}if(j){Cc[c[d>>2]&255](c[g+164>>2]|0);Cc[c[d>>2]&255](c[g+144>>2]|0)}Cc[c[d>>2]&255](g)}Cc[c[d>>2]&255](c[a+376>>2]|0);Cc[c[d>>2]&255](c[a+448>>2]|0);Cc[c[d>>2]&255](c[a+8>>2]|0);Cc[c[d>>2]&255](c[a+44>>2]|0);Cc[c[d>>2]&255](c[a+380>>2]|0);Cc[c[d>>2]&255](c[a+236>>2]|0);g=c[a+248>>2]|0;if((g|0)!=0){Cc[g&255](c[a+240>>2]|0)}Cc[c[d>>2]&255](a);return}function rd(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+4|0;e=a|0;a=(c[d>>2]|0)==(c[e>>2]|0);c[e>>2]=b;if(!a){return}c[d>>2]=b;return}function sd(a,b,d){a=a|0;b=b|0;d=d|0;c[a+52>>2]=b;c[a+56>>2]=d;return}function td(a,b){a=a|0;b=b|0;c[a+60>>2]=b;return}function ud(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;g=i;i=i+8|0;h=g|0;j=b+464|0;k=c[j>>2]|0;do{if((k|0)==3){c[b+268>>2]=33;l=0;i=g;return l|0}else if((k|0)==2){c[b+268>>2]=36;l=0;i=g;return l|0}else if((k|0)==0){if((c[b+460>>2]|0)!=0){break}m=b+472|0;if((c[m>>2]|0)==0){dc(((zc(0)|0)>>>0)%4294967295|0|0);c[m>>2]=yb()|0}if((a[b+232|0]|0)==0){break}if((pd(b,21576)|0)<<24>>24!=0){break}c[b+268>>2]=1;l=0;i=g;return l|0}}while(0);c[j>>2]=1;if((e|0)==0){a[b+468|0]=f;if((f|0)==0){l=1;i=g;return l|0}k=b+24|0;m=c[k>>2]|0;n=b+280|0;c[n>>2]=m;o=c[b+28>>2]|0;c[b+40>>2]=o;p=b+264|0;q=Sc[c[p>>2]&127](b,m,o,k)|0;c[b+268>>2]=q;if((q|0)!=0){c[b+276>>2]=c[b+272>>2];c[p>>2]=84;l=0;i=g;return l|0}p=c[j>>2]|0;if((p|0)==3){q=c[b+144>>2]|0;Vc[c[q+48>>2]&63](q,c[n>>2]|0,c[k>>2]|0,b+392|0);c[n>>2]=c[k>>2];l=2;i=g;return l|0}else if((p|0)==0|(p|0)==1){c[j>>2]=2;l=1;i=g;return l|0}else{l=1;i=g;return l|0}}p=b+24|0;k=b+28|0;if((c[p>>2]|0)!=(c[k>>2]|0)){n=wd(b,e)|0;if((n|0)==0){l=0;i=g;return l|0}tF(n|0,d|0,e)|0;l=xd(b,e,f)|0;i=g;return l|0}n=b+36|0;c[n>>2]=(c[n>>2]|0)+e;n=b+280|0;c[n>>2]=d;a[b+468|0]=f;q=b+264|0;o=c[q>>2]|0;m=d+e|0;r=b+40|0;c[r>>2]=m;s=Sc[o&127](b,d,m,h)|0;d=b+268|0;c[d>>2]=s;if((s|0)!=0){c[b+276>>2]=c[b+272>>2];c[q>>2]=84;l=0;i=g;return l|0}s=c[j>>2]|0;do{if((s|0)==0|(s|0)==1){if((f|0)==0){t=23;break}c[j>>2]=2;l=1;i=g;return l|0}else if((s|0)==3){u=2}else{t=23}}while(0);if((t|0)==23){u=1}s=c[b+144>>2]|0;Vc[c[s+48>>2]&63](s,c[n>>2]|0,c[h>>2]|0,b+392|0);s=c[h>>2]|0;j=m-s|0;f=b+8|0;if((m|0)!=(s|0)){m=c[f>>2]|0;do{if((m|0)==0){v=Ec[c[b+12>>2]&63](e<<1)|0;t=29}else{if((j|0)<=((c[b+32>>2]|0)-m|0)){w=m;x=s;break}v=Oc[c[b+16>>2]&255](m,e<<1)|0;t=29}}while(0);do{if((t|0)==29){if((v|0)!=0){c[f>>2]=v;c[b+32>>2]=v+(e<<1);w=v;x=c[h>>2]|0;break}c[d>>2]=1;c[b+276>>2]=0;c[b+272>>2]=0;c[q>>2]=84;l=0;i=g;return l|0}}while(0);tF(w|0,x|0,j)|0}x=c[f>>2]|0;c[p>>2]=x;p=x+j|0;c[k>>2]=p;c[n>>2]=x;c[r>>2]=p;c[b+272>>2]=x;c[b+276>>2]=x;l=u;i=g;return l|0}function vd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return c[a+268>>2]|0}function wd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=c[a+464>>2]|0;if((d|0)==3){c[a+268>>2]=33;e=0;return e|0}else if((d|0)==2){c[a+268>>2]=36;e=0;return e|0}else{d=a+32|0;f=c[d>>2]|0;g=a+28|0;h=c[g>>2]|0;i=f;j=h;if((i-j|0)>=(b|0)){e=h;return e|0}h=a+24|0;k=c[h>>2]|0;l=k;m=j-l|0;j=m+b|0;b=a+8|0;n=c[b>>2]|0;if((j|0)>(i-n|0)){o=(f|0)==(k|0)?1024:i-l|0;do{o=o<<1;}while((o|0)<(j|0));j=Ec[c[a+12>>2]&63](o)|0;if((j|0)==0){c[a+268>>2]=1;e=0;return e|0}c[d>>2]=j+o;o=c[h>>2]|0;if((o|0)==0){p=0}else{tF(j|0,o|0,(c[g>>2]|0)-o|0)|0;Cc[c[a+20>>2]&255](c[b>>2]|0);p=c[h>>2]|0}o=j+((c[g>>2]|0)-p)|0;c[g>>2]=o;c[b>>2]=j;q=j;r=o}else{Bb(k|0,n|0,m|0);m=c[b>>2]|0;b=m+((c[g>>2]|0)-(c[h>>2]|0))|0;c[g>>2]=b;q=m;r=b}c[h>>2]=q;c[a+276>>2]=0;c[a+272>>2]=0;c[a+280>>2]=0;e=r;return e|0}return 0}function xd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=b+464|0;g=c[f>>2]|0;do{if((g|0)==3){c[b+268>>2]=33;h=0;return h|0}else if((g|0)==2){c[b+268>>2]=36;h=0;return h|0}else if((g|0)==0){if((c[b+460>>2]|0)!=0){break}i=b+472|0;if((c[i>>2]|0)==0){dc(((zc(0)|0)>>>0)%4294967295|0|0);c[i>>2]=yb()|0}if((a[b+232|0]|0)==0){break}if((pd(b,21576)|0)<<24>>24!=0){break}c[b+268>>2]=1;h=0;return h|0}}while(0);c[f>>2]=1;g=b+24|0;i=c[g>>2]|0;j=b+280|0;c[j>>2]=i;k=b+28|0;l=(c[k>>2]|0)+d|0;c[k>>2]=l;c[b+40>>2]=l;k=b+36|0;c[k>>2]=(c[k>>2]|0)+d;a[b+468|0]=e;d=b+264|0;k=Sc[c[d>>2]&127](b,i,l,g)|0;c[b+268>>2]=k;if((k|0)!=0){c[b+276>>2]=c[b+272>>2];c[d>>2]=84;h=0;return h|0}d=c[f>>2]|0;do{if((d|0)==3){m=2}else if((d|0)==0|(d|0)==1){if((e|0)==0){m=1;break}c[f>>2]=2;h=1;return h|0}else{m=1}}while(0);f=c[b+144>>2]|0;Vc[c[f+48>>2]&63](f,c[j>>2]|0,c[g>>2]|0,b+392|0);c[j>>2]=c[g>>2];h=m;return h|0}function yd(a){a=a|0;return c[a+268>>2]|0}function zd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+272|0;d=c[b>>2]|0;do{if((d|0)!=0){e=a+280|0;f=c[e>>2]|0;if(d>>>0<f>>>0){break}g=c[a+144>>2]|0;Vc[c[g+48>>2]&63](g,f,d,a+392|0);c[e>>2]=c[b>>2]}}while(0);return(c[a+392>>2]|0)+1|0}function Ad(a){a=a|0;var b=0;if(!((a|0)!=0&a>>>0<41>>>0)){b=0;return b|0}b=c[171440+(a<<2)>>2]|0;return b|0}function Bd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=a+4|0;d=c[b>>2]|0;do{if((d|0)!=0){e=a+16|0;f=c[e>>2]|0;if((f|0)==0){g=a|0;c[g>>2]=d;h=d|0;c[b>>2]=c[h>>2];c[h>>2]=0;h=c[g>>2]|0;g=h+8|0;c[e>>2]=g;c[a+8>>2]=(c[h+4>>2]|0)+(h+8);c[a+12>>2]=g;i=1;return i|0}g=a+8|0;if(((c[g>>2]|0)-f|0)>=(c[d+4>>2]|0)){break}f=d|0;h=c[f>>2]|0;j=a|0;c[f>>2]=c[j>>2];f=c[b>>2]|0;c[j>>2]=f;c[b>>2]=h;h=c[e>>2]|0;tF(f+8|0,h|0,(c[g>>2]|0)-h|0)|0;h=c[j>>2]|0;j=a+12|0;c[j>>2]=(c[j>>2]|0)-(c[e>>2]|0)+(h+8);c[e>>2]=h+8;c[g>>2]=(c[h+4>>2]|0)+(h+8);i=1;return i|0}}while(0);b=a|0;d=c[b>>2]|0;h=a+16|0;g=c[h>>2]|0;e=a+8|0;j=c[e>>2]|0;if((d|0)!=0&(g|0)==(d+8|0)){f=j-g<<1;k=Oc[c[(c[a+20>>2]|0)+4>>2]&255](d,f+8|0)|0;if((k|0)==0){i=0;return i|0}c[b>>2]=k;c[k+4>>2]=f;k=c[b>>2]|0;d=a+12|0;c[d>>2]=(c[d>>2]|0)-(c[h>>2]|0)+(k+8);c[h>>2]=k+8;c[e>>2]=k+8+f;i=1;return i|0}f=a+16|0;k=j-g|0;g=(k|0)<1024?1024:k<<1;k=g+8|0;j=Ec[c[c[a+20>>2]>>2]&63](k)|0;if((j|0)==0){i=0;return i|0}c[j+4>>2]=g;c[j>>2]=c[b>>2];c[b>>2]=j;b=a+12|0;a=c[b>>2]|0;g=c[f>>2]|0;h=j+8|0;if((a|0)==(g|0)){l=a;m=a}else{tF(h|0,g|0,a-g|0)|0;l=c[b>>2]|0;m=c[f>>2]|0}c[b>>2]=j+(l+8-m);c[f>>2]=h;c[e>>2]=j+k;i=1;return i|0}function Cd(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;h=e+8|0;i=c[h>>2]|0;do{if((i|0)==0){if((g|0)==0){j=0;return j|0}a[e+4|0]=6;c[h>>2]=64;k=e+16|0;l=Ec[c[c[k>>2]>>2]&63](256)|0;c[e>>2]=l;if((l|0)==0){c[h>>2]=0;j=0;return j|0}vF(l|0,0,256)|0;l=c[b+472>>2]|0;m=a[f]|0;if(m<<24>>24==0){n=l}else{o=f;p=l;l=m;while(1){m=o+1|0;q=(p*1000003|0)^l&255;r=a[m]|0;if(r<<24>>24==0){n=q;break}else{o=m;p=q;l=r}}}s=(c[h>>2]|0)-1&n;t=k}else{l=b+472|0;p=c[l>>2]|0;o=a[f]|0;if(o<<24>>24==0){u=p}else{r=f;q=p;p=o;while(1){m=r+1|0;v=(q*1000003|0)^p&255;w=a[m]|0;if(w<<24>>24==0){u=v;break}else{r=m;q=v;p=w}}}p=i-1|0;q=p&u;r=e|0;k=c[r>>2]|0;w=c[k+(q<<2)>>2]|0;a:do{if((w|0)==0){x=q}else{v=u&-i;m=e+4|0;y=p>>>2;z=0;A=q;B=w;b:while(1){C=c[B>>2]|0;if(o<<24>>24==(a[C]|0)){D=f;E=C;C=o;do{if(C<<24>>24==0){j=B;break b}D=D+1|0;E=E+1|0;C=a[D]|0;}while(C<<24>>24==(a[E]|0))}if(z<<24>>24==0){F=(v>>>(((d[m]|0)-1|0)>>>0)&y|1)&255}else{F=z}E=F&255;C=A-E+(A>>>0<E>>>0?i:0)|0;E=c[k+(C<<2)>>2]|0;if((E|0)==0){x=C;break a}else{z=F;A=C;B=E}}return j|0}}while(0);if((g|0)==0){j=0;return j|0}k=e+4|0;o=a[k]|0;if(((c[e+12>>2]|0)>>>(((o&255)-1|0)>>>0)|0)==0){s=x;t=e+16|0;break}w=o+1&255;o=w&255;q=1<<o;p=q-1|0;B=q<<2;A=e+16|0;z=Ec[c[c[A>>2]>>2]&63](B)|0;y=z;if((z|0)==0){j=0;return j|0}vF(z|0,0,B|0)|0;B=c[h>>2]|0;if((B|0)!=0){z=-q|0;m=o-1|0;v=p>>>2;E=0;C=B;while(1){B=c[(c[r>>2]|0)+(E<<2)>>2]|0;if((B|0)==0){G=C}else{D=c[B>>2]|0;H=c[l>>2]|0;I=a[D]|0;if(I<<24>>24==0){J=H}else{K=D;D=H;H=I;while(1){I=K+1|0;L=(D*1000003|0)^H&255;M=a[I]|0;if(M<<24>>24==0){J=L;break}else{K=I;D=L;H=M}}}H=J&p;D=y+(H<<2)|0;if((c[D>>2]|0)==0){N=D}else{D=((J&z)>>>(m>>>0)&v|1)&255;K=0;M=H;while(1){H=K<<24>>24==0?D:K;L=H&255;I=M+(M>>>0<L>>>0?q:0)-L|0;L=y+(I<<2)|0;if((c[L>>2]|0)==0){N=L;break}else{K=H;M=I}}}c[N>>2]=B;G=c[h>>2]|0}M=E+1|0;if(M>>>0<G>>>0){E=M;C=G}else{break}}}Cc[c[(c[A>>2]|0)+8>>2]&255](c[r>>2]|0);c[r>>2]=y;a[k]=w;c[h>>2]=q;C=p&u;if((c[y+(C<<2)>>2]|0)==0){s=C;t=A;break}E=((u&-q)>>>((o-1|0)>>>0)&p>>>2|1)&255;v=0;m=C;while(1){C=v<<24>>24==0?E:v;z=C&255;l=m+(m>>>0<z>>>0?q:0)-z|0;if((c[y+(l<<2)>>2]|0)==0){s=l;t=A;break}else{v=C;m=l}}}}while(0);u=Ec[c[c[t>>2]>>2]&63](g)|0;t=e|0;c[(c[t>>2]|0)+(s<<2)>>2]=u;u=c[(c[t>>2]|0)+(s<<2)>>2]|0;if((u|0)==0){j=0;return j|0}vF(u|0,0,g|0)|0;c[c[(c[t>>2]|0)+(s<<2)>>2]>>2]=f;f=e+12|0;c[f>>2]=(c[f>>2]|0)+1;j=c[(c[t>>2]|0)+(s<<2)>>2]|0;return j|0}function Dd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;h=a[f]|0;i=h<<24>>24==0;j=c[d>>2]|0;do{if(i){if((j|0)==0){k=0;l=d|0;m=12;break}else{n=28;return n|0}}else{o=d|0;if((j|0)==0){p=o;m=14;break}if((a[j]|0)!=120){k=0;l=o;m=12;break}if((a[j+1|0]|0)!=109){k=0;l=o;m=12;break}if((a[j+2|0]|0)!=108){k=0;l=o;m=12;break}q=a[j+3|0]|0;do{if(q<<24>>24==110){if((a[j+4|0]|0)!=115){break}if((a[j+5|0]|0)==0){n=39}else{break}return n|0}}while(0);k=q<<24>>24==0|0;l=o;m=12}}while(0);do{if((m|0)==12){if(i){r=k;s=l;t=0;u=1;m=30;break}if(k<<24>>24==0){p=l;m=14;break}else{v=1;w=0;x=h;y=1}while(1){do{if(y){if((w|0)<=36){if(x<<24>>24==(a[74952+w|0]|0)){z=v;break}}z=0}else{z=0}}while(0);j=w+1|0;A=a[f+j|0]|0;B=z<<24>>24!=0;if(A<<24>>24==0){C=1;D=j;E=B;F=l;G=k;m=29;break}else{v=z;w=j;x=A;y=B}}}}while(0);if((m|0)==14){y=1;x=1;w=0;z=h;h=1;while(1){do{if(h){if((w|0)<=36){if(z<<24>>24==(a[74952+w|0]|0)){H=y;break}}H=0}else{H=0}}while(0);do{if(x<<24>>24==0){I=0}else{if((w|0)<=29){if(z<<24>>24==(a[74920+w|0]|0)){I=x;break}}I=0}}while(0);v=w+1|0;k=a[f+v|0]|0;l=H<<24>>24!=0;if(k<<24>>24==0){C=I;D=v;E=l;F=p;G=0;m=29;break}else{y=H;x=I;w=v;z=k;h=l}}}if((m|0)==29){if(E){r=G;s=F;t=D;u=C;m=30}else{J=0;K=G;L=F;M=D;N=C}}if((m|0)==30){J=(t|0)==36|0;K=r;L=s;M=t;N=u}if(N<<24>>24==0){O=0}else{O=(M|0)==29|0}if((K&255|0)!=(J|0)){n=K<<24>>24!=0?38:40;return n|0}if(O<<24>>24!=0){n=40;return n|0}O=b+456|0;K=((a[O]|0)!=0)+M|0;M=b+360|0;J=c[M>>2]|0;do{if((J|0)==0){N=b+12|0;u=Ec[c[N>>2]&63](28)|0;if((u|0)==0){n=1;return n|0}t=K+24|0;s=Ec[c[N>>2]&63](t)|0;c[u+16>>2]=s;if((s|0)!=0){c[u+24>>2]=t;P=u;break}Cc[c[b+20>>2]&255](u);n=1;return n|0}else{u=J+24|0;do{if((K|0)>(c[u>>2]|0)){t=J+16|0;s=K+24|0;N=Oc[c[b+16>>2]&255](c[t>>2]|0,s)|0;if((N|0)==0){n=1;return n|0}else{c[t>>2]=N;c[u>>2]=s;break}}}while(0);c[M>>2]=c[J+4>>2];P=J}}while(0);c[P+20>>2]=K;J=P+16|0;tF(c[J>>2]|0,f|0,K)|0;M=a[O]|0;if(M<<24>>24!=0){a[(c[J>>2]|0)+(K-1)|0]=M}c[P>>2]=d;c[P+12>>2]=e;M=d+4|0;c[P+8>>2]=c[M>>2];if((a[f]|0)==0){if(((c[b+340>>2]|0)+132|0)==(d|0)){Q=0}else{m=49}}else{m=49}if((m|0)==49){Q=P}c[M>>2]=Q;c[P+4>>2]=c[g>>2];c[g>>2]=P;if((e|0)==0){n=0;return n|0}e=c[b+100>>2]|0;if((e|0)==0){n=0;return n|0}Tc[e&127](c[b+4>>2]|0,c[L>>2]|0,(c[M>>2]|0)!=0?f:0);n=0;return n|0}function Ed(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;g=i;i=i+80|0;h=g|0;j=g+8|0;k=g+16|0;l=g+24|0;m=g+32|0;n=g+40|0;o=g+48|0;p=g+56|0;q=g+64|0;r=g+72|0;c[n>>2]=0;c[o>>2]=0;c[p>>2]=0;c[r>>2]=-1;s=b+144|0;t=b+272|0;u=(d|0)!=0;if((cf(d,c[s>>2]|0,e,f,t,p,q,n,o,r)|0)==0){v=u?31:30;i=g;return v|0}do{if(!u){if((c[r>>2]|0)!=1){break}a[(c[b+340>>2]|0)+130|0]=1}}while(0);u=b+140|0;do{if((c[u>>2]|0)==0){d=b+80|0;w=c[d>>2]|0;if((w|0)==0){x=0;y=0;break}z=c[s>>2]|0;c[j>>2]=e;if((a[z+68|0]|0)!=0){Tc[w&127](c[b+4>>2]|0,e,f-e|0);x=0;y=0;break}w=b+276|0;A=b+44|0;B=z+56|0;C=b+48|0;D=b+4|0;while(1){c[k>>2]=c[A>>2];Bc[c[B>>2]&63](z,j,f,k,c[C>>2]|0);c[w>>2]=c[j>>2];E=c[A>>2]|0;Tc[c[d>>2]&127](c[D>>2]|0,E,(c[k>>2]|0)-E|0);c[t>>2]=c[j>>2];if((c[j>>2]|0)==(f|0)){x=0;y=0;break}}}else{D=c[n>>2]|0;do{if((D|0)==0){F=0}else{d=b+424|0;A=c[s>>2]|0;w=D+(Oc[c[A+28>>2]&255](A,D)|0)|0;c[m>>2]=D;C=b+436|0;do{if((c[C>>2]|0)==0){if((Bd(d)|0)<<24>>24==0){v=1}else{break}i=g;return v|0}}while(0);z=A+56|0;B=b+432|0;while(1){Bc[c[z>>2]&63](A,m,w,C,c[B>>2]|0);if((c[m>>2]|0)==(w|0)){break}if((Bd(d)|0)<<24>>24==0){v=1;G=65;break}}if((G|0)==65){i=g;return v|0}w=b+440|0;if((c[w>>2]|0)==0){v=1;i=g;return v|0}A=c[C>>2]|0;do{if((A|0)==(c[B>>2]|0)){if((Bd(d)|0)<<24>>24==0){v=1;i=g;return v|0}else{H=c[C>>2]|0;break}}else{H=A}}while(0);c[C>>2]=H+1;a[H]=0;A=c[w>>2]|0;if((A|0)==0){v=1;i=g;return v|0}else{c[w>>2]=c[C>>2];F=A;break}}}while(0);D=c[p>>2]|0;do{if((D|0)==0){I=0}else{A=b+424|0;d=c[s>>2]|0;B=(c[q>>2]|0)+(-(c[d+64>>2]|0)|0)|0;c[l>>2]=D;z=b+436|0;do{if((c[z>>2]|0)==0){if((Bd(A)|0)<<24>>24==0){v=1}else{break}i=g;return v|0}}while(0);C=d+56|0;w=b+432|0;while(1){Bc[c[C>>2]&63](d,l,B,z,c[w>>2]|0);if((c[l>>2]|0)==(B|0)){break}if((Bd(A)|0)<<24>>24==0){v=1;G=65;break}}if((G|0)==65){i=g;return v|0}B=b+440|0;if((c[B>>2]|0)==0){v=1;i=g;return v|0}d=c[z>>2]|0;do{if((d|0)==(c[w>>2]|0)){if((Bd(A)|0)<<24>>24==0){v=1;i=g;return v|0}else{J=c[z>>2]|0;break}}else{J=d}}while(0);c[z>>2]=J+1;a[J]=0;d=c[B>>2]|0;if((d|0)==0){v=1}else{I=d;break}i=g;return v|0}}while(0);Vc[c[u>>2]&63](c[b+4>>2]|0,I,F,c[r>>2]|0);x=I;y=F}}while(0);do{if((c[b+228>>2]|0)==0){F=c[o>>2]|0;if((F|0)!=0){if((c[F+64>>2]|0)==(c[(c[s>>2]|0)+64>>2]|0)){c[s>>2]=F;break}c[t>>2]=c[n>>2];v=19;i=g;return v|0}F=c[n>>2]|0;if((F|0)==0){break}do{if((y|0)==0){I=b+424|0;r=c[s>>2]|0;u=F+(Oc[c[r+28>>2]&255](r,F)|0)|0;c[h>>2]=F;J=b+436|0;do{if((c[J>>2]|0)==0){if((Bd(I)|0)<<24>>24==0){v=1}else{break}i=g;return v|0}}while(0);B=r+56|0;z=b+432|0;while(1){Bc[c[B>>2]&63](r,h,u,J,c[z>>2]|0);if((c[h>>2]|0)==(u|0)){break}if((Bd(I)|0)<<24>>24==0){v=1;G=65;break}}if((G|0)==65){i=g;return v|0}u=b+440|0;if((c[u>>2]|0)==0){v=1;i=g;return v|0}r=c[J>>2]|0;do{if((r|0)==(c[z>>2]|0)){if((Bd(I)|0)<<24>>24==0){v=1;i=g;return v|0}else{K=c[J>>2]|0;break}}else{K=r}}while(0);c[J>>2]=K+1;a[K]=0;r=c[u>>2]|0;if((r|0)==0){v=1}else{L=r;break}i=g;return v|0}else{L=y}}while(0);F=Td(b,L)|0;r=b+428|0;I=c[r>>2]|0;z=b+424|0;B=c[z>>2]|0;do{if((I|0)==0){c[r>>2]=B}else{if((B|0)==0){break}else{M=B;N=I}while(1){l=M|0;q=c[l>>2]|0;c[l>>2]=N;c[r>>2]=M;if((q|0)==0){break}else{N=M;M=q}}}}while(0);c[z>>2]=0;c[b+440>>2]=0;c[b+436>>2]=0;c[b+432>>2]=0;if((F|0)!=18){v=F;i=g;return v|0}c[t>>2]=c[n>>2];v=18;i=g;return v|0}}while(0);if((y|0)==0&(x|0)==0){v=0;i=g;return v|0}x=b+428|0;y=c[x>>2]|0;n=b+424|0;t=c[n>>2]|0;do{if((y|0)==0){c[x>>2]=t}else{if((t|0)==0){break}else{O=t;P=y}while(1){M=O|0;N=c[M>>2]|0;c[M>>2]=P;c[x>>2]=O;if((N|0)==0){break}else{P=O;O=N}}}}while(0);c[n>>2]=0;c[b+440>>2]=0;c[b+436>>2]=0;c[b+432>>2]=0;v=0;i=g;return v|0}function Fd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=Gd(b,1,c[b+144>>2]|0,d,e,f,(a[b+468|0]|0)==0|0)|0;do{if((g|0)==0){if((Hd(b)|0)<<24>>24==0){h=1}else{break}return h|0}}while(0);h=g;return h|0}function Gd(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Fc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Pc=0,Qc=0,Rc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0;l=i;i=i+360|0;m=l|0;n=l+8|0;o=l+16|0;p=l+24|0;q=l+32|0;r=l+40|0;s=l+48|0;t=l+56|0;u=l+64|0;v=l+72|0;w=l+80|0;x=l+88|0;y=l+96|0;z=l+104|0;A=l+112|0;B=l+120|0;C=l+128|0;D=l+136|0;E=l+144|0;F=l+152|0;G=l+160|0;H=l+168|0;I=l+176|0;J=l+184|0;K=l+192|0;L=l+200|0;M=l+208|0;N=l+216|0;O=l+224|0;P=l+232|0;Q=l+240|0;R=l+248|0;S=l+256|0;T=l+264|0;U=l+272|0;V=l+280|0;W=l+288|0;X=l+296|0;Y=l+304|0;Z=l+336|0;_=l+344|0;$=l+352|0;c[R>>2]=g;aa=b+340|0;ba=c[aa>>2]|0;ca=b+144|0;if((c[ca>>2]|0)==(f|0)){da=b+272|0;ea=b+276|0;fa=da;ga=ea;ha=da;ia=ea;ja=b+284|0}else{ea=b+284|0;da=c[ea>>2]|0;fa=da|0;ga=da+4|0;ha=b+272|0;ia=b+276|0;ja=ea}c[fa>>2]=g;g=f+4|0;ea=b+80|0;da=f+68|0;ka=b+44|0;la=f+56|0;ma=b+48|0;na=b+4|0;oa=b+464|0;pa=f+44|0;qa=f+64|0;ra=ba+80|0;sa=ba+92|0;ta=ba+88|0;ua=ba+96|0;va=ba+8|0;wa=ba+129|0;xa=b+112|0;ya=b+400|0;za=b+412|0;Aa=b+408|0;Ba=b+456|0;Ca=b+416|0;Da=b+116|0;Ea=b+292|0;Fa=b+120|0;Ga=b+288|0;Ha=b+12|0;Ia=b+296|0;Ja=b+224|0;Ka=b+264|0;La=ba+130|0;Ma=b+472|0;Na=ba|0;Oa=ba+4|0;ba=b+60|0;Pa=b+352|0;Qa=b+348|0;Ra=f+28|0;Sa=b+16|0;Ta=b+52|0;Ua=b+404|0;Va=b+400|0;Wa=b+376|0;Xa=Y|0;Ya=b+56|0;Za=ya|0;_a=b+104|0;$a=b+360|0;ab=b+232|0;bb=b+233|0;cb=f+40|0;db=l+328|0;eb=b+72|0;a:while(1){fb=c[R>>2]|0;c[S>>2]=fb;gb=Sc[c[g>>2]&127](f,fb,h,S)|0;c[ga>>2]=c[S>>2];b:do{switch(gb|0){case-2:{hb=28;break a;break};case-4:{hb=20;break a;break};case-1:{hb=26;break a;break};case 9:{fb=c[qa>>2]|0;ib=(Hc[c[pa>>2]&63](f,(c[R>>2]|0)+fb|0,(c[S>>2]|0)+(-fb|0)|0)|0)&255;a[U]=ib;if(ib<<24>>24!=0){ib=c[ba>>2]|0;if((ib|0)!=0){Tc[ib&127](c[na>>2]|0,U,1);break b}ib=c[ea>>2]|0;if((ib|0)==0){break b}fb=c[R>>2]|0;jb=c[S>>2]|0;c[L>>2]=fb;if((a[da]|0)!=0){Tc[ib&127](c[na>>2]|0,fb,jb-fb|0);break b}if((c[ca>>2]|0)==(f|0)){kb=ia;lb=ha}else{fb=c[ja>>2]|0;kb=fb+4|0;lb=fb|0}while(1){c[M>>2]=c[ka>>2];Bc[c[la>>2]&63](f,L,jb,M,c[ma>>2]|0);c[kb>>2]=c[L>>2];fb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,fb,(c[M>>2]|0)-fb|0);c[lb>>2]=c[L>>2];if((c[L>>2]|0)==(jb|0)){break b}}}jb=c[qa>>2]|0;fb=(c[S>>2]|0)+(-jb|0)|0;c[K>>2]=(c[R>>2]|0)+jb;if((c[sa>>2]|0)==0){if((Bd(ra)|0)<<24>>24==0){mb=1;hb=320;break a}}while(1){Bc[c[la>>2]&63](f,K,fb,sa,c[ta>>2]|0);if((c[K>>2]|0)==(fb|0)){break}if((Bd(ra)|0)<<24>>24==0){mb=1;hb=320;break a}}if((c[ua>>2]|0)==0){mb=1;hb=320;break a}fb=c[sa>>2]|0;if((fb|0)==(c[ta>>2]|0)){if((Bd(ra)|0)<<24>>24==0){mb=1;hb=320;break a}nb=c[sa>>2]|0}else{nb=fb}c[sa>>2]=nb+1;a[nb]=0;fb=c[ua>>2]|0;if((fb|0)==0){mb=1;hb=320;break a}jb=c[va>>2]|0;c:do{if((jb|0)==0){ob=0}else{ib=c[Ma>>2]|0;pb=a[fb]|0;if(pb<<24>>24==0){qb=ib}else{rb=fb;sb=ib;ib=pb;while(1){tb=rb+1|0;ub=(sb*1000003|0)^ib&255;vb=a[tb]|0;if(vb<<24>>24==0){qb=ub;break}else{rb=tb;sb=ub;ib=vb}}}ib=jb-1|0;sb=qb&ib;rb=c[Na>>2]|0;vb=c[rb+(sb<<2)>>2]|0;if((vb|0)==0){ob=0;break}ub=qb&-jb;tb=ib>>>2;ib=0;wb=sb;sb=vb;while(1){vb=c[sb>>2]|0;if(pb<<24>>24==(a[vb]|0)){xb=fb;yb=vb;vb=pb;do{if(vb<<24>>24==0){ob=sb;break c}xb=xb+1|0;yb=yb+1|0;vb=a[xb]|0;}while(vb<<24>>24==(a[yb]|0))}if(ib<<24>>24==0){zb=(ub>>>(((d[Oa]|0)-1|0)>>>0)&tb|1)&255}else{zb=ib}yb=zb&255;vb=(wb>>>0<yb>>>0?jb:0)+(wb-yb)|0;yb=c[rb+(vb<<2)>>2]|0;if((yb|0)==0){ob=0;break}else{ib=zb;wb=vb;sb=yb}}}}while(0);jb=ob;c[sa>>2]=fb;do{if((a[wa]|0)==0){hb=62}else{if((a[La]|0)!=0){hb=62;break}if((ob|0)!=0){break}sb=c[Fa>>2]|0;if((sb|0)!=0){Tc[sb&127](c[na>>2]|0,fb,0);break b}sb=c[ea>>2]|0;if((sb|0)==0){break b}wb=c[R>>2]|0;ib=c[S>>2]|0;c[I>>2]=wb;if((a[da]|0)!=0){Tc[sb&127](c[na>>2]|0,wb,ib-wb|0);break b}if((c[ca>>2]|0)==(f|0)){Ab=ia;Bb=ha}else{wb=c[ja>>2]|0;Ab=wb+4|0;Bb=wb|0}while(1){c[J>>2]=c[ka>>2];Bc[c[la>>2]&63](f,I,ib,J,c[ma>>2]|0);c[Ab>>2]=c[I>>2];wb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,wb,(c[J>>2]|0)-wb|0);c[Bb>>2]=c[I>>2];if((c[I>>2]|0)==(ib|0)){break b}}}}while(0);if((hb|0)==62){hb=0;if((ob|0)==0){mb=11;hb=320;break a}if((a[jb+34|0]|0)==0){mb=24;hb=320;break a}}Cb=ob+32|0;if((a[Cb]|0)!=0){mb=12;hb=320;break a}if((c[ob+28>>2]|0)!=0){mb=15;hb=320;break a}fb=ob+4|0;if((c[fb>>2]|0)!=0){if((a[Ea]|0)!=0){ib=c[Ga>>2]|0;if((ib|0)==0){wb=Ec[c[Ha>>2]&63](24)|0;if((wb|0)==0){mb=1;hb=320;break a}else{Db=wb}}else{c[Ga>>2]=c[ib+8>>2];Db=ib}a[Cb]=1;ib=ob+12|0;c[ib>>2]=0;wb=Db+8|0;c[wb>>2]=c[ja>>2];c[ja>>2]=Db;c[Db+12>>2]=jb;c[Db+16>>2]=c[Ia>>2];a[Db+20|0]=0;c[Db>>2]=0;c[Db+4>>2]=0;sb=c[fb>>2]|0;fb=sb+(c[ob+8>>2]|0)|0;rb=Gd(b,c[Ia>>2]|0,c[Ja>>2]|0,sb,fb,m,0)|0;if((rb|0)!=0){mb=rb;hb=320;break a}rb=c[m>>2]|0;do{if((fb|0)!=(rb|0)){if((c[oa>>2]|0)!=3){break}c[ib>>2]=rb-sb;c[Ka>>2]=86;break b}}while(0);a[Cb]=0;c[ja>>2]=c[wb>>2];c[wb>>2]=c[Ga>>2];c[Ga>>2]=Db;break b}sb=c[Fa>>2]|0;if((sb|0)!=0){Tc[sb&127](c[na>>2]|0,c[ob>>2]|0,0);break b}sb=c[ea>>2]|0;if((sb|0)==0){break b}rb=c[R>>2]|0;ib=c[S>>2]|0;c[G>>2]=rb;if((a[da]|0)!=0){Tc[sb&127](c[na>>2]|0,rb,ib-rb|0);break b}if((c[ca>>2]|0)==(f|0)){Eb=ia;Fb=ha}else{rb=c[ja>>2]|0;Eb=rb+4|0;Fb=rb|0}while(1){c[H>>2]=c[ka>>2];Bc[c[la>>2]&63](f,G,ib,H,c[ma>>2]|0);c[Eb>>2]=c[G>>2];rb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,rb,(c[H>>2]|0)-rb|0);c[Fb>>2]=c[G>>2];if((c[G>>2]|0)==(ib|0)){break b}}}if((c[xa>>2]|0)==0){ib=c[ea>>2]|0;if((ib|0)==0){break b}wb=c[R>>2]|0;rb=c[S>>2]|0;c[E>>2]=wb;if((a[da]|0)!=0){Tc[ib&127](c[na>>2]|0,wb,rb-wb|0);break b}if((c[ca>>2]|0)==(f|0)){Gb=ia;Hb=ha}else{wb=c[ja>>2]|0;Gb=wb+4|0;Hb=wb|0}while(1){c[F>>2]=c[ka>>2];Bc[c[la>>2]&63](f,E,rb,F,c[ma>>2]|0);c[Gb>>2]=c[E>>2];wb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,wb,(c[F>>2]|0)-wb|0);c[Hb>>2]=c[E>>2];if((c[E>>2]|0)==(rb|0)){break b}}}a[Cb]=1;rb=c[aa>>2]|0;wb=rb+136|0;do{if((c[wb>>2]|0)==0){Ib=0}else{ib=c[za>>2]|0;if((ib|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}Jb=c[za>>2]|0}else{Jb=ib}c[za>>2]=Jb+1;a[Jb]=61;ib=(((a[Ba]|0)!=0)<<31>>31)+(c[(c[wb>>2]|0)+20>>2]|0)|0;if((ib|0)>0){Kb=0}else{Ib=1;break}while(1){sb=c[za>>2]|0;if((sb|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}Lb=c[za>>2]|0}else{Lb=sb}sb=a[(c[(c[wb>>2]|0)+16>>2]|0)+Kb|0]|0;c[za>>2]=Lb+1;a[Lb]=sb;sb=Kb+1|0;if((sb|0)<(ib|0)){Kb=sb}else{Ib=1;break}}}}while(0);wb=c[rb+60>>2]|0;ib=c[rb+68>>2]|0;sb=wb+(ib<<2)|0;d:do{if((ib|0)==0){Mb=Ib}else{fb=wb;jb=Ib;while(1){tb=fb;while(1){Nb=tb+4|0;Ob=c[tb>>2]|0;if((Ob|0)!=0){Pb=Ob+4|0;if((c[Pb>>2]|0)!=0){break}}if((Nb|0)==(sb|0)){Mb=jb;break d}else{tb=Nb}}if(jb<<24>>24!=0){tb=c[za>>2]|0;if((tb|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}Qb=c[za>>2]|0}else{Qb=tb}c[za>>2]=Qb+1;a[Qb]=12}tb=c[Ob>>2]|0;ub=a[tb]|0;pb=c[za>>2]|0;yb=(pb|0)==(c[Aa>>2]|0);if(ub<<24>>24==0){Rb=yb;Sb=pb}else{vb=tb;tb=yb;yb=ub;ub=pb;while(1){if(tb){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}Tb=a[vb]|0;Ub=c[za>>2]|0}else{Tb=yb;Ub=ub}c[za>>2]=Ub+1;a[Ub]=Tb;pb=vb+1|0;xb=a[pb]|0;Vb=c[za>>2]|0;Wb=(Vb|0)==(c[Aa>>2]|0);if(xb<<24>>24==0){Rb=Wb;Sb=Vb;break}else{vb=pb;tb=Wb;yb=xb;ub=Vb}}}if(Rb){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}Xb=c[za>>2]|0}else{Xb=Sb}c[za>>2]=Xb+1;a[Xb]=61;ub=(((a[Ba]|0)!=0)<<31>>31)+(c[(c[Pb>>2]|0)+20>>2]|0)|0;if((ub|0)>0){yb=0;do{tb=c[za>>2]|0;if((tb|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}Yb=c[za>>2]|0}else{Yb=tb}tb=a[(c[(c[Pb>>2]|0)+16>>2]|0)+yb|0]|0;c[za>>2]=Yb+1;a[Yb]=tb;yb=yb+1|0;}while((yb|0)<(ub|0))}if((Nb|0)==(sb|0)){Mb=1;break}else{fb=Nb;jb=1}}}}while(0);sb=c[rb>>2]|0;wb=c[rb+8>>2]|0;ib=sb+(wb<<2)|0;e:do{if((wb|0)!=0){jb=sb;fb=Mb;while(1){ub=jb;while(1){Zb=ub+4|0;_b=c[ub>>2]|0;if((_b|0)!=0){if((a[_b+32|0]|0)!=0){break}}if((Zb|0)==(ib|0)){break e}else{ub=Zb}}if(fb<<24>>24!=0){ub=c[za>>2]|0;if((ub|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}$b=c[za>>2]|0}else{$b=ub}c[za>>2]=$b+1;a[$b]=12}ub=c[_b>>2]|0;yb=a[ub]|0;if(yb<<24>>24!=0){tb=ub;ub=yb;do{yb=c[za>>2]|0;if((yb|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}ac=a[tb]|0;bc=c[za>>2]|0}else{ac=ub;bc=yb}c[za>>2]=bc+1;a[bc]=ac;tb=tb+1|0;ub=a[tb]|0;}while(ub<<24>>24!=0)}if((Zb|0)==(ib|0)){break}else{jb=Zb;fb=1}}}}while(0);ib=c[za>>2]|0;if((ib|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}cc=c[za>>2]|0}else{cc=ib}c[za>>2]=cc+1;a[cc]=0;ib=c[Ca>>2]|0;a[Cb]=0;if((ib|0)==0){mb=1;hb=320;break a}if((Gc[c[xa>>2]&127](c[Da>>2]|0,ib,c[ob+20>>2]|0,c[ob+16>>2]|0,c[ob+24>>2]|0)|0)==0){mb=21;hb=320;break a}c[za>>2]=c[Ca>>2];break};case 0:{hb=25;break a;break};case-3:{hb=6;break a;break};case 2:case 1:{ib=c[Pa>>2]|0;if((ib|0)==0){dc=Ec[c[Ha>>2]&63](48)|0;if((dc|0)==0){mb=1;hb=320;break a}sb=Ec[c[Ha>>2]&63](32)|0;c[dc+36>>2]=sb;if((sb|0)==0){hb=163;break a}c[dc+40>>2]=sb+32;ec=dc}else{c[Pa>>2]=c[ib>>2];ec=ib}ib=ec+44|0;c[ib>>2]=0;c[ec>>2]=c[Qa>>2];c[Qa>>2]=ec;sb=ec+12|0;c[ec+16>>2]=0;c[ec+20>>2]=0;wb=(c[R>>2]|0)+(c[qa>>2]|0)|0;rb=ec+4|0;c[rb>>2]=wb;fb=ec+8|0;c[fb>>2]=Oc[c[Ra>>2]&255](f,wb)|0;c[Ia>>2]=(c[Ia>>2]|0)+1;wb=c[rb>>2]|0;rb=wb+(c[fb>>2]|0)|0;c[W>>2]=wb;wb=ec+36|0;fb=ec+40|0;jb=c[wb>>2]|0;while(1){c[V>>2]=jb;Bc[c[la>>2]&63](f,W,rb,V,(c[fb>>2]|0)-1|0);fc=c[wb>>2]|0;ub=fc;gc=(c[V>>2]|0)-ub|0;if((c[W>>2]|0)==(rb|0)){break}tb=(c[fb>>2]|0)-ub<<1;ub=Oc[c[Sa>>2]&255](fc,tb)|0;if((ub|0)==0){mb=1;hb=320;break a}c[wb>>2]=ub;c[fb>>2]=ub+tb;jb=ub+gc|0}c[ec+24>>2]=gc;jb=sb|0;c[jb>>2]=fc;a[c[V>>2]|0]=0;fb=Id(b,f,c[R>>2]|0,sb,ib)|0;if((fb|0)!=0){mb=fb;hb=320;break a}fb=c[Ta>>2]|0;do{if((fb|0)==0){wb=c[ea>>2]|0;if((wb|0)==0){break}rb=c[R>>2]|0;ub=c[S>>2]|0;c[C>>2]=rb;if((a[da]|0)!=0){Tc[wb&127](c[na>>2]|0,rb,ub-rb|0);break}if((c[ca>>2]|0)==(f|0)){hc=ia;ic=ha}else{rb=c[ja>>2]|0;hc=rb+4|0;ic=rb|0}do{c[D>>2]=c[ka>>2];Bc[c[la>>2]&63](f,C,ub,D,c[ma>>2]|0);c[hc>>2]=c[C>>2];rb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,rb,(c[D>>2]|0)-rb|0);c[ic>>2]=c[C>>2];}while((c[C>>2]|0)!=(ub|0))}else{Tc[fb&127](c[na>>2]|0,c[jb>>2]|0,c[Wa>>2]|0)}}while(0);jb=c[Ua>>2]|0;fb=c[Va>>2]|0;do{if((jb|0)==0){c[Ua>>2]=fb}else{if((fb|0)==0){break}else{jc=fb;kc=jb}while(1){ib=jc|0;sb=c[ib>>2]|0;c[ib>>2]=kc;c[Ua>>2]=jc;if((sb|0)==0){break}else{kc=jc;jc=sb}}}}while(0);c[Va>>2]=0;c[Ca>>2]=0;c[za>>2]=0;c[Aa>>2]=0;break};case 4:case 3:{jb=c[R>>2]|0;fb=c[qa>>2]|0;sb=jb+fb|0;c[X>>2]=0;ib=jb+((Oc[c[Ra>>2]&255](f,sb)|0)+fb)|0;c[B>>2]=sb;if((c[za>>2]|0)==0){if((Bd(ya)|0)<<24>>24==0){hb=192;break a}}while(1){Bc[c[la>>2]&63](f,B,ib,za,c[Aa>>2]|0);if((c[B>>2]|0)==(ib|0)){break}if((Bd(ya)|0)<<24>>24==0){hb=192;break a}}if((c[Ca>>2]|0)==0){hb=192;break a}ib=c[za>>2]|0;if((ib|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=192;break a}lc=c[za>>2]|0}else{lc=ib}c[za>>2]=lc+1;a[lc]=0;ib=c[Ca>>2]|0;c[Xa>>2]=ib;if((ib|0)==0){mb=1;hb=320;break a}c[Ca>>2]=c[za>>2];ib=Id(b,f,c[R>>2]|0,Y,X)|0;if((ib|0)!=0){mb=ib;hb=320;break a}c[Ca>>2]=c[za>>2];ib=c[Ta>>2]|0;if((ib|0)==0){mc=1}else{Tc[ib&127](c[na>>2]|0,c[Xa>>2]|0,c[Wa>>2]|0);mc=0}ib=c[Ya>>2]|0;do{if((ib|0)==0){if(mc<<24>>24==0){break}sb=c[ea>>2]|0;if((sb|0)==0){break}fb=c[R>>2]|0;jb=c[S>>2]|0;c[z>>2]=fb;if((a[da]|0)!=0){Tc[sb&127](c[na>>2]|0,fb,jb-fb|0);break}if((c[ca>>2]|0)==(f|0)){nc=ia;oc=ha}else{fb=c[ja>>2]|0;nc=fb+4|0;oc=fb|0}do{c[A>>2]=c[ka>>2];Bc[c[la>>2]&63](f,z,jb,A,c[ma>>2]|0);c[nc>>2]=c[z>>2];fb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,fb,(c[A>>2]|0)-fb|0);c[oc>>2]=c[z>>2];}while((c[z>>2]|0)!=(jb|0))}else{if((c[Ta>>2]|0)==0){pc=ib}else{c[fa>>2]=c[ga>>2];pc=c[Ya>>2]|0}Dc[pc&63](c[na>>2]|0,c[Xa>>2]|0)}}while(0);ib=c[Ua>>2]|0;jb=c[Za>>2]|0;do{if((ib|0)==0){c[Ua>>2]=jb}else{if((jb|0)==0){break}else{qc=jb;rc=ib}while(1){fb=qc|0;sb=c[fb>>2]|0;c[fb>>2]=rc;c[Ua>>2]=qc;if((sb|0)==0){break}else{rc=qc;qc=sb}}}}while(0);c[Za>>2]=0;c[Ca>>2]=0;c[za>>2]=0;c[Aa>>2]=0;ib=c[X>>2]|0;if((ib|0)!=0){jb=ib;while(1){ib=c[_a>>2]|0;if((ib|0)==0){sc=jb|0}else{sb=jb|0;Dc[ib&63](c[na>>2]|0,c[c[sb>>2]>>2]|0);sc=sb}sb=c[jb+4>>2]|0;c[jb+4>>2]=c[$a>>2];c[$a>>2]=jb;c[(c[sc>>2]|0)+4>>2]=c[jb+8>>2];if((sb|0)==0){break}else{jb=sb}}c[X>>2]=0}if((c[Ia>>2]|0)==0){hb=220;break a}break};case 5:{if((c[Ia>>2]|0)==(e|0)){mb=13;hb=320;break a}jb=c[Qa>>2]|0;sb=jb|0;c[Qa>>2]=c[sb>>2];c[sb>>2]=c[Pa>>2];c[Pa>>2]=jb;tc=(c[R>>2]|0)+(c[qa>>2]<<1)|0;sb=Oc[c[Ra>>2]&255](f,tc)|0;if((sb|0)!=(c[jb+8>>2]|0)){hb=224;break a}if((wF(c[jb+4>>2]|0,tc|0,sb|0)|0)!=0){hb=224;break a}c[Ia>>2]=(c[Ia>>2]|0)-1;sb=c[Ya>>2]|0;do{if((sb|0)==0){ib=c[ea>>2]|0;if((ib|0)==0){break}fb=c[R>>2]|0;ub=c[S>>2]|0;c[x>>2]=fb;if((a[da]|0)!=0){Tc[ib&127](c[na>>2]|0,fb,ub-fb|0);break}if((c[ca>>2]|0)==(f|0)){uc=ia;vc=ha}else{fb=c[ja>>2]|0;uc=fb+4|0;vc=fb|0}do{c[y>>2]=c[ka>>2];Bc[c[la>>2]&63](f,x,ub,y,c[ma>>2]|0);c[uc>>2]=c[x>>2];fb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,fb,(c[y>>2]|0)-fb|0);c[vc>>2]=c[x>>2];}while((c[x>>2]|0)!=(ub|0))}else{ub=c[jb+16>>2]|0;fb=jb+12|0;if((a[ab]|0)==0|(ub|0)==0){wc=sb}else{ib=(c[fb>>2]|0)+(c[jb+28>>2]|0)|0;rb=a[ub]|0;if(rb<<24>>24==0){xc=ib}else{wb=ub;ub=ib;ib=rb;while(1){rb=wb+1|0;tb=ub+1|0;a[ub]=ib;yb=a[rb]|0;if(yb<<24>>24==0){xc=tb;break}else{wb=rb;ub=tb;ib=yb}}}ib=c[jb+20>>2]|0;do{if((a[bb]|0)==0|(ib|0)==0){yc=xc}else{a[xc]=a[Ba]|0;ub=xc+1|0;wb=a[ib]|0;if(wb<<24>>24==0){yc=ub;break}else{zc=ib;Ac=ub;Fc=wb}while(1){wb=zc+1|0;a[Ac]=Fc;ub=Ac+1|0;yb=a[wb]|0;if(yb<<24>>24==0){yc=ub;break}else{zc=wb;Ac=ub;Fc=yb}}}}while(0);a[yc]=0;wc=c[Ya>>2]|0}Dc[wc&63](c[na>>2]|0,c[fb>>2]|0)}}while(0);sb=jb+44|0;ib=c[sb>>2]|0;if((ib|0)!=0){yb=ib;do{ib=c[_a>>2]|0;if((ib|0)==0){Ic=yb;Jc=yb|0}else{ub=yb|0;Dc[ib&63](c[na>>2]|0,c[c[ub>>2]>>2]|0);Ic=c[sb>>2]|0;Jc=ub}c[sb>>2]=c[Ic+4>>2];c[yb+4>>2]=c[$a>>2];c[$a>>2]=yb;c[(c[Jc>>2]|0)+4>>2]=c[yb+8>>2];yb=c[sb>>2]|0;}while((yb|0)!=0)}if((c[Ia>>2]|0)==0){hb=247;break a}break};case 10:{yb=Oc[c[cb>>2]&255](f,c[R>>2]|0)|0;if((yb|0)<0){mb=14;hb=320;break a}sb=c[ba>>2]|0;if((sb|0)!=0){jb=c[na>>2]|0;ub=Re(yb,db)|0;Tc[sb&127](jb,db,ub);break b}ub=c[ea>>2]|0;if((ub|0)==0){break b}jb=c[R>>2]|0;sb=c[S>>2]|0;c[v>>2]=jb;if((a[da]|0)!=0){Tc[ub&127](c[na>>2]|0,jb,sb-jb|0);break b}if((c[ca>>2]|0)==(f|0)){Kc=ia;Lc=ha}else{jb=c[ja>>2]|0;Kc=jb+4|0;Lc=jb|0}do{c[w>>2]=c[ka>>2];Bc[c[la>>2]&63](f,v,sb,w,c[ma>>2]|0);c[Kc>>2]=c[v>>2];jb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,jb,(c[w>>2]|0)-jb|0);c[Lc>>2]=c[v>>2];}while((c[v>>2]|0)!=(sb|0));break};case 7:{sb=c[ba>>2]|0;if((sb|0)!=0){a[Z]=10;Tc[sb&127](c[na>>2]|0,Z,1);break b}sb=c[ea>>2]|0;if((sb|0)==0){break b}jb=c[R>>2]|0;ub=c[S>>2]|0;c[t>>2]=jb;if((a[da]|0)!=0){Tc[sb&127](c[na>>2]|0,jb,ub-jb|0);break b}if((c[ca>>2]|0)==(f|0)){Mc=ia;Nc=ha}else{jb=c[ja>>2]|0;Mc=jb+4|0;Nc=jb|0}do{c[u>>2]=c[ka>>2];Bc[c[la>>2]&63](f,t,ub,u,c[ma>>2]|0);c[Mc>>2]=c[t>>2];jb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,jb,(c[u>>2]|0)-jb|0);c[Nc>>2]=c[t>>2];}while((c[t>>2]|0)!=(ub|0));break};case 8:{ub=c[eb>>2]|0;do{if((ub|0)==0){jb=c[ea>>2]|0;if((jb|0)==0){break}sb=c[R>>2]|0;yb=c[S>>2]|0;c[r>>2]=sb;if((a[da]|0)!=0){Tc[jb&127](c[na>>2]|0,sb,yb-sb|0);break}if((c[ca>>2]|0)==(f|0)){Pc=ia;Qc=ha}else{sb=c[ja>>2]|0;Pc=sb+4|0;Qc=sb|0}do{c[s>>2]=c[ka>>2];Bc[c[la>>2]&63](f,r,yb,s,c[ma>>2]|0);c[Pc>>2]=c[r>>2];sb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,sb,(c[s>>2]|0)-sb|0);c[Qc>>2]=c[r>>2];}while((c[r>>2]|0)!=(yb|0))}else{Cc[ub&255](c[na>>2]|0)}}while(0);ub=Kd(b,f,S,h,j,k)|0;if((ub|0)!=0){mb=ub;hb=320;break a}if((c[S>>2]|0)==0){hb=278;break a}break};case-5:{hb=279;break a;break};case 6:{ub=c[ba>>2]|0;if((ub|0)!=0){if((a[da]|0)!=0){yb=c[R>>2]|0;Tc[ub&127](c[na>>2]|0,yb,(c[S>>2]|0)-yb|0);break b}while(1){c[$>>2]=c[ka>>2];Bc[c[la>>2]&63](f,R,c[S>>2]|0,$,c[ma>>2]|0);c[ga>>2]=c[R>>2];yb=c[ka>>2]|0;Tc[ub&127](c[na>>2]|0,yb,(c[$>>2]|0)-yb|0);yb=c[R>>2]|0;if((yb|0)==(c[S>>2]|0)){break b}c[fa>>2]=yb}}ub=c[ea>>2]|0;if((ub|0)==0){break b}yb=c[R>>2]|0;fb=c[S>>2]|0;c[n>>2]=yb;if((a[da]|0)!=0){Tc[ub&127](c[na>>2]|0,yb,fb-yb|0);break b}if((c[ca>>2]|0)==(f|0)){Rc=ia;Uc=ha}else{yb=c[ja>>2]|0;Rc=yb+4|0;Uc=yb|0}do{c[o>>2]=c[ka>>2];Bc[c[la>>2]&63](f,n,fb,o,c[ma>>2]|0);c[Rc>>2]=c[n>>2];yb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,yb,(c[o>>2]|0)-yb|0);c[Uc>>2]=c[n>>2];}while((c[n>>2]|0)!=(fb|0));break};case 11:{if((Md(b,f,c[R>>2]|0,c[S>>2]|0)|0)==0){mb=1;hb=320;break a}break};case 13:{if((Nd(b,f,c[R>>2]|0,c[S>>2]|0)|0)==0){mb=1;hb=320;break a}break};case 12:{mb=17;hb=320;break a;break};default:{fb=c[ea>>2]|0;if((fb|0)==0){break b}yb=c[R>>2]|0;ub=c[S>>2]|0;c[P>>2]=yb;if((a[da]|0)!=0){Tc[fb&127](c[na>>2]|0,yb,ub-yb|0);break b}if((c[ca>>2]|0)==(f|0)){Vc=ia;Wc=ha}else{yb=c[ja>>2]|0;Vc=yb+4|0;Wc=yb|0}do{c[Q>>2]=c[ka>>2];Bc[c[la>>2]&63](f,P,ub,Q,c[ma>>2]|0);c[Vc>>2]=c[P>>2];yb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,yb,(c[Q>>2]|0)-yb|0);c[Wc>>2]=c[P>>2];}while((c[P>>2]|0)!=(ub|0))}}}while(0);gb=c[S>>2]|0;c[R>>2]=gb;c[fa>>2]=gb;gb=c[oa>>2]|0;if((gb|0)==3){hb=319;break}else if((gb|0)==2){mb=35;hb=320;break}}if((hb|0)==6){if(k<<24>>24!=0){c[j>>2]=c[R>>2];mb=0;i=l;return mb|0}c[ga>>2]=h;ga=c[ba>>2]|0;do{if((ga|0)==0){oa=c[ea>>2]|0;if((oa|0)==0){break}P=c[R>>2]|0;c[N>>2]=P;if((a[da]|0)!=0){Tc[oa&127](c[na>>2]|0,P,h-P|0);break}if((c[ca>>2]|0)==(f|0)){Xc=ia;Yc=ha}else{P=c[ja>>2]|0;Xc=P+4|0;Yc=P|0}do{c[O>>2]=c[ka>>2];Bc[c[la>>2]&63](f,N,h,O,c[ma>>2]|0);c[Xc>>2]=c[N>>2];P=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,P,(c[O>>2]|0)-P|0);c[Yc>>2]=c[N>>2];}while((c[N>>2]|0)!=(h|0))}else{a[T]=10;Tc[ga&127](c[na>>2]|0,T,1)}}while(0);if((e|0)==0){mb=3;i=l;return mb|0}if((c[Ia>>2]|0)!=(e|0)){mb=13;i=l;return mb|0}c[j>>2]=h;mb=0;i=l;return mb|0}else if((hb|0)==20){if(k<<24>>24!=0){c[j>>2]=c[R>>2];mb=0;i=l;return mb|0}if((e|0)<=0){mb=3;i=l;return mb|0}if((c[Ia>>2]|0)!=(e|0)){mb=13;i=l;return mb|0}c[j>>2]=c[R>>2];mb=0;i=l;return mb|0}else if((hb|0)==25){c[fa>>2]=c[S>>2];mb=4;i=l;return mb|0}else if((hb|0)==26){if(k<<24>>24==0){mb=5;i=l;return mb|0}c[j>>2]=c[R>>2];mb=0;i=l;return mb|0}else if((hb|0)==28){if(k<<24>>24==0){mb=6;i=l;return mb|0}c[j>>2]=c[R>>2];mb=0;i=l;return mb|0}else if((hb|0)==148){a[Cb]=0;mb=1;i=l;return mb|0}else if((hb|0)==163){Cc[c[b+20>>2]&255](dc);mb=1;i=l;return mb|0}else if((hb|0)==192){c[Xa>>2]=0;mb=1;i=l;return mb|0}else if((hb|0)==220){mb=Jd(b,c[S>>2]|0,h,j)|0;i=l;return mb|0}else if((hb|0)==224){c[fa>>2]=tc;mb=7;i=l;return mb|0}else if((hb|0)==247){mb=Jd(b,c[S>>2]|0,h,j)|0;i=l;return mb|0}else if((hb|0)==278){c[Ka>>2]=90;mb=0;i=l;return mb|0}else if((hb|0)==279){if(k<<24>>24!=0){c[j>>2]=c[R>>2];mb=0;i=l;return mb|0}k=c[ba>>2]|0;do{if((k|0)==0){Ka=c[ea>>2]|0;if((Ka|0)==0){break}b=c[R>>2]|0;c[p>>2]=b;if((a[da]|0)!=0){Tc[Ka&127](c[na>>2]|0,b,h-b|0);break}if((c[ca>>2]|0)==(f|0)){Zc=ia;_c=ha}else{b=c[ja>>2]|0;Zc=b+4|0;_c=b|0}do{c[q>>2]=c[ka>>2];Bc[c[la>>2]&63](f,p,h,q,c[ma>>2]|0);c[Zc>>2]=c[p>>2];b=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,b,(c[q>>2]|0)-b|0);c[_c>>2]=c[p>>2];}while((c[p>>2]|0)!=(h|0))}else{if((a[da]|0)==0){c[_>>2]=c[ka>>2];Bc[c[la>>2]&63](f,R,h,_,c[ma>>2]|0);b=c[ka>>2]|0;Tc[c[ba>>2]&127](c[na>>2]|0,b,(c[_>>2]|0)-b|0);break}else{b=c[R>>2]|0;Tc[k&127](c[na>>2]|0,b,h-b|0);break}}}while(0);if((e|0)==0){c[fa>>2]=h;mb=3;i=l;return mb|0}if((c[Ia>>2]|0)==(e|0)){c[j>>2]=h;mb=0;i=l;return mb|0}else{c[fa>>2]=h;mb=13;i=l;return mb|0}}else if((hb|0)==319){c[j>>2]=c[S>>2];mb=0;i=l;return mb|0}else if((hb|0)==320){i=l;return mb|0}return 0}function Hd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;b=a+16|0;d=c[a+348>>2]|0;if((d|0)==0){e=1;return e|0}else{f=d}while(1){d=(c[f+24>>2]|0)+1|0;a=f+36|0;g=c[a>>2]|0;h=g+d|0;i=f+4|0;j=c[i>>2]|0;if((j|0)==(h|0)){e=1;k=11;break}l=f+8|0;m=c[l>>2]|0;n=m+d|0;o=f+40|0;if((n|0)>((c[o>>2]|0)-g|0)){p=Oc[c[b>>2]&255](g,n)|0;if((p|0)==0){e=0;k=11;break}g=f+12|0;q=c[a>>2]|0;if((c[g>>2]|0)==(q|0)){c[g>>2]=p}g=f+16|0;r=c[g>>2]|0;if((r|0)!=0){c[g>>2]=p+(r-q)}c[a>>2]=p;c[o>>2]=p+n;s=p+d|0;t=c[i>>2]|0;u=c[l>>2]|0}else{s=h;t=j;u=m}tF(s|0,t|0,u)|0;c[i>>2]=s;i=c[f>>2]|0;if((i|0)==0){e=1;k=11;break}else{f=i}}if((k|0)==11){return e|0}return 0}function Id(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0;j=i;i=i+8|0;k=j|0;l=c[b+340>>2]|0;m=l+20|0;n=g|0;o=c[n>>2]|0;p=c[l+28>>2]|0;a:do{if((p|0)==0){q=13}else{r=c[b+472>>2]|0;s=a[o]|0;if(s<<24>>24==0){t=r}else{u=o;v=r;r=s;while(1){w=u+1|0;x=(v*1000003|0)^r&255;y=a[w]|0;if(y<<24>>24==0){t=x;break}else{u=w;v=x;r=y}}}r=p-1|0;v=t&r;u=c[m>>2]|0;y=c[u+(v<<2)>>2]|0;if((y|0)==0){q=13;break}x=t&-p;w=l+24|0;z=r>>>2;r=0;A=v;v=y;b:while(1){y=c[v>>2]|0;if(s<<24>>24==(a[y]|0)){B=o;C=y;y=s;do{if(y<<24>>24==0){break b}B=B+1|0;C=C+1|0;y=a[B]|0;}while(y<<24>>24==(a[C]|0))}if(r<<24>>24==0){D=(x>>>(((d[w]|0)-1|0)>>>0)&z|1)&255}else{D=r}C=D&255;y=(A>>>0<C>>>0?p:0)+(A-C)|0;C=c[u+(y<<2)>>2]|0;if((C|0)==0){q=13;break a}else{r=D;A=y;v=C}}if((v|0)==0){q=13}else{E=v}}}while(0);do{if((q|0)==13){D=l+80|0;p=l+92|0;t=l+88|0;A=o;while(1){r=c[p>>2]|0;if((r|0)==(c[t>>2]|0)){if((Bd(D)|0)<<24>>24==0){F=1;q=161;break}G=c[p>>2]|0}else{G=r}r=a[A]|0;c[p>>2]=G+1;a[G]=r;if((a[A]|0)==0){break}else{A=A+1|0}}if((q|0)==161){i=j;return F|0}A=l+96|0;D=c[A>>2]|0;c[A>>2]=c[p>>2];if((D|0)==0){F=1;i=j;return F|0}A=Cd(b,m,D,24)|0;D=A;if((A|0)==0){F=1;i=j;return F|0}if((a[b+232|0]|0)==0){E=D;break}if((Pd(b,D)|0)==0){F=1}else{E=D;break}i=j;return F|0}}while(0);m=c[E+12>>2]|0;G=e+36|0;o=b+364|0;D=b+376|0;A=Sc[c[G>>2]&127](e,f,c[o>>2]|0,c[D>>2]|0)|0;t=A+m|0;v=c[o>>2]|0;do{if((t|0)>(v|0)){r=t+16|0;c[o>>2]=r;u=Oc[c[b+16>>2]&255](c[D>>2]|0,r<<4)|0;r=u;if((u|0)==0){F=1;i=j;return F|0}c[D>>2]=r;if((A|0)<=(v|0)){break}Sc[c[G>>2]&127](e,f,A,r)|0}}while(0);f=c[D>>2]|0;G=f|0;c:do{if((A|0)>0){v=e+28|0;o=b+400|0;t=b+412|0;r=b+416|0;u=b+408|0;z=E+20|0;w=e+56|0;x=0;s=0;C=0;y=f;d:while(1){B=c[y+(s<<4)>>2]|0;H=Qd(b,e,B,B+(Oc[c[v>>2]&255](e,B)|0)|0)|0;if((H|0)==0){F=1;q=161;break}B=H|0;I=(c[B>>2]|0)-1|0;if((a[I]|0)!=0){q=30;break}a[I]=1;J=C+1|0;c[G+(C<<2)>>2]=c[B>>2];I=c[D>>2]|0;if((a[I+(s<<4)+12|0]|0)==0){e:do{if((a[H+8|0]|0)==0|(m|0)<1){K=1}else{L=c[z>>2]|0;M=0;while(1){N=M+1|0;if((H|0)==(c[L+(M*12|0)>>2]|0)){break}if((N|0)<(m|0)){M=N}else{K=1;break e}}K=a[L+(M*12|0)+4|0]|0}}while(0);N=Rd(b,e,K,c[I+(s<<4)+4>>2]|0,c[I+(s<<4)+8>>2]|0,o)|0;if((N|0)!=0){F=N;q=161;break}N=c[t>>2]|0;do{if(K<<24>>24==0){if((N|0)==(c[r>>2]|0)){O=N;break}P=N-1|0;if((a[P]|0)!=32){O=N;break}c[t>>2]=P;O=P}else{O=N}}while(0);if((O|0)==(c[u>>2]|0)){if((Bd(o)|0)<<24>>24==0){F=1;q=161;break}Q=c[t>>2]|0}else{Q=O}c[t>>2]=Q+1;a[Q]=0;c[G+(J<<2)>>2]=c[r>>2]}else{N=c[I+(s<<4)+8>>2]|0;c[k>>2]=c[I+(s<<4)+4>>2];if((c[t>>2]|0)==0){if((Bd(o)|0)<<24>>24==0){q=55;break}}while(1){Bc[c[w>>2]&63](e,k,N,t,c[u>>2]|0);if((c[k>>2]|0)==(N|0)){break}if((Bd(o)|0)<<24>>24==0){q=55;break d}}if((c[r>>2]|0)==0){q=55;break}N=c[t>>2]|0;if((N|0)==(c[u>>2]|0)){if((Bd(o)|0)<<24>>24==0){q=55;break}R=c[t>>2]|0}else{R=N}c[t>>2]=R+1;a[R]=0;N=c[r>>2]|0;c[G+(J<<2)>>2]=N;if((N|0)==0){F=1;q=161;break}}c[r>>2]=c[t>>2];N=c[H+4>>2]|0;do{if((N|0)==0){S=C+2|0;T=x}else{if((a[H+9|0]|0)==0){a[(c[B>>2]|0)-1|0]=2;S=C+2|0;T=x+1|0;break}else{I=Dd(b,N,H,c[G+(J<<2)>>2]|0,h)|0;if((I|0)==0){S=C;T=x;break}else{F=I;q=161;break d}}}}while(0);H=s+1|0;if((H|0)>=(A|0)){U=T;V=S;break c}x=T;s=H;C=S;y=c[D>>2]|0}if((q|0)==30){if((c[b+144>>2]|0)!=(e|0)){F=8;i=j;return F|0}c[b+272>>2]=c[(c[D>>2]|0)+(s<<4)>>2];F=8;i=j;return F|0}else if((q|0)==55){c[G+(J<<2)>>2]=0;F=1;i=j;return F|0}else if((q|0)==161){i=j;return F|0}}else{U=0;V=0}}while(0);c[b+368>>2]=V;J=c[E+8>>2]|0;f:do{if((J|0)==0){q=70}else{D=c[J>>2]|0;if((a[D-1|0]|0)==0){q=70;break}if((V|0)>0){W=0}else{break}while(1){e=W+2|0;if((c[G+(W<<2)>>2]|0)==(D|0)){break}if((e|0)<(V|0)){W=e}else{break f}}c[b+372>>2]=W}}while(0);if((q|0)==70){c[b+372>>2]=-1}g:do{if((m|0)>0){W=E+20|0;J=U;D=0;s=V;h:while(1){e=c[W>>2]|0;S=e+(D*12|0)|0;T=c[S>>2]|0;A=(c[T>>2]|0)-1|0;do{if((a[A]|0)==0){R=e+(D*12|0)+8|0;k=c[R>>2]|0;if((k|0)==0){X=s;Y=J;break}Q=c[T+4>>2]|0;if((Q|0)==0){a[A]=1;c[G+(s<<2)>>2]=c[c[S>>2]>>2];c[G+(s+1<<2)>>2]=c[R>>2];X=s+2|0;Y=J;break}if((a[T+9|0]|0)==0){a[A]=2;c[G+(s<<2)>>2]=c[c[S>>2]>>2];c[G+(s+1<<2)>>2]=c[R>>2];X=s+2|0;Y=J+1|0;break}else{R=Dd(b,Q,T,k,h)|0;if((R|0)==0){X=s;Y=J;break}else{F=R;break h}}}else{X=s;Y=J}}while(0);T=D+1|0;if((T|0)<(m|0)){J=Y;D=T;s=X}else{Z=Y;_=X;break g}}i=j;return F|0}else{Z=U;_=V}}while(0);c[G+(_<<2)>>2]=0;i:do{if((Z|0)==0){$=0}else{V=b+384|0;U=c[V>>2]|0;X=b+388|0;Y=a[X]|0;m=Y&255;do{if((Z<<1>>m|0)==0){s=1<<m;if((U|0)!=0){aa=U;ba=s;break}ca=s;da=b+380|0;q=89}else{s=Y;while(1){ea=s+1&255;if((Z>>(s&255)|0)==0){break}else{s=ea}}s=(ea&255)>>>0<3>>>0?3:ea;a[X]=s;D=s&255;s=b+380|0;J=Oc[c[b+16>>2]&255](c[s>>2]|0,12<<D)|0;if((J|0)==0){F=1;i=j;return F|0}else{c[s>>2]=J;ca=1<<D;da=s;q=89;break}}}while(0);if((q|0)==89){Y=ca;while(1){U=Y-1|0;c[(c[da>>2]|0)+(U*12|0)>>2]=-1;if((U|0)==0){aa=-1;ba=ca;break}else{Y=U}}}Y=aa-1|0;c[V>>2]=Y;if((_|0)<=0){$=0;break}U=b+472|0;m=l+48|0;s=l+40|0;D=l+44|0;J=b+400|0;W=b+412|0;T=b+408|0;S=ba-1|0;A=b+380|0;e=b+233|0;R=b+416|0;k=b+456|0;Q=-ba|0;O=S>>>2;K=Z;f=0;j:while(1){y=G+(f<<2)|0;C=c[y>>2]|0;x=C-1|0;if((a[x]|0)==2){t=c[U>>2]|0;a[x]=0;r=c[m>>2]|0;o=c[U>>2]|0;u=a[C]|0;if(u<<24>>24==0){fa=o}else{w=C;z=o;o=u;while(1){v=w+1|0;p=(z*1000003|0)^o&255;H=a[v]|0;if(H<<24>>24==0){fa=p;break}else{w=v;z=p;o=H}}}o=r-1|0;z=c[s>>2]|0;w=fa&-r;H=o>>>2;p=0;v=fa&o;k:while(1){ga=c[z+(v<<2)>>2]|0;o=c[ga>>2]|0;if(u<<24>>24==(a[o]|0)){N=C;B=o;o=u;do{if(o<<24>>24==0){break k}N=N+1|0;B=B+1|0;o=a[N]|0;}while(o<<24>>24==(a[B]|0))}if(p<<24>>24==0){ha=(w>>>(((d[D]|0)-1|0)>>>0)&H|1)&255}else{ha=p}B=ha&255;p=ha;v=v-B+(v>>>0<B>>>0?r:0)|0}r=c[(c[ga+4>>2]|0)+4>>2]|0;if((r|0)==0){F=27;q=161;break}v=r+20|0;if((c[v>>2]|0)>0){p=r+16|0;H=0;w=t;while(1){u=a[(c[p>>2]|0)+H|0]|0;z=c[W>>2]|0;if((z|0)==(c[T>>2]|0)){if((Bd(J)|0)<<24>>24==0){F=1;q=161;break j}ia=c[W>>2]|0}else{ia=z}c[W>>2]=ia+1;a[ia]=u;z=u&255^(w*1000003|0);u=H+1|0;if((u|0)<(c[v>>2]|0)){H=u;w=z}else{ja=z;break}}}else{ja=t}w=C;while(1){H=w+1|0;if((a[w]|0)==58){ka=ja;la=H;break}else{w=H}}while(1){w=a[la]|0;C=c[W>>2]|0;if((C|0)==(c[T>>2]|0)){if((Bd(J)|0)<<24>>24==0){F=1;q=161;break j}ma=a[la]|0;na=c[W>>2]|0}else{ma=w;na=C}c[W>>2]=na+1;a[na]=ma;oa=w&255^(ka*1000003|0);if((a[la]|0)==0){break}else{ka=oa;la=la+1|0}}w=oa&S;C=c[A>>2]|0;if((c[C+(w*12|0)>>2]|0)==(Y|0)){t=oa&Q;H=w;v=0;while(1){if((oa|0)==(c[C+(H*12|0)+4>>2]|0)){p=c[R>>2]|0;z=c[C+(H*12|0)+8>>2]|0;u=a[p]|0;B=u<<24>>24==0;if(u<<24>>24!=(a[z]|0)|B){pa=B}else{B=p;p=z;while(1){z=B+1|0;u=p+1|0;o=a[z]|0;N=o<<24>>24==0;if(o<<24>>24!=(a[u]|0)|N){pa=N;break}else{B=z;p=u}}}if(pa){F=8;q=161;break j}}if(v<<24>>24==0){qa=(t>>>(((d[X]|0)-1|0)>>>0)&O|1)&255}else{qa=v}p=qa&255;B=H+((H|0)<(p|0)?ba:0)-p|0;if((c[C+(B*12|0)>>2]|0)==(Y|0)){H=B;v=qa}else{ra=B;break}}}else{ra=w}if((a[e]|0)!=0){a[(c[W>>2]|0)-1|0]=a[k]|0;v=c[c[r>>2]>>2]|0;while(1){H=c[W>>2]|0;if((H|0)==(c[T>>2]|0)){if((Bd(J)|0)<<24>>24==0){F=1;q=161;break j}sa=c[W>>2]|0}else{sa=H}H=a[v]|0;c[W>>2]=sa+1;a[sa]=H;if((a[v]|0)==0){break}else{v=v+1|0}}}v=c[R>>2]|0;c[R>>2]=c[W>>2];c[y>>2]=v;c[(c[A>>2]|0)+(ra*12|0)>>2]=Y;c[(c[A>>2]|0)+(ra*12|0)+4>>2]=oa;c[(c[A>>2]|0)+(ra*12|0)+8>>2]=v;v=K-1|0;if((v|0)==0){q=132;break}else{ta=v}}else{a[x]=0;ta=K}v=f+2|0;if((v|0)<(_|0)){K=ta;f=v}else{$=v;break i}}if((q|0)==132){$=f+2|0;break}else if((q|0)==161){i=j;return F|0}}}while(0);if(($|0)<(_|0)){q=$;do{a[(c[G+(q<<2)>>2]|0)-1|0]=0;q=q+2|0;}while((q|0)<(_|0))}_=c[h>>2]|0;if((_|0)!=0){h=_;do{a[(c[c[h+12>>2]>>2]|0)-1|0]=0;h=c[h+4>>2]|0;}while((h|0)!=0)}if((a[b+232|0]|0)==0){F=0;i=j;return F|0}h=c[E+4>>2]|0;do{if((h|0)==0){E=c[l+136>>2]|0;if((E|0)==0){F=0;i=j;return F|0}else{ua=E;va=c[n>>2]|0;break}}else{E=c[h+4>>2]|0;if((E|0)==0){F=27;i=j;return F|0}_=c[n>>2]|0;while(1){q=_+1|0;if((a[_]|0)==58){ua=E;va=q;break}else{_=q}}}}while(0);h=ua|0;do{if((a[b+233|0]|0)==0){wa=0}else{l=c[c[h>>2]>>2]|0;if((l|0)==0){wa=0;break}else{xa=0}while(1){_=xa+1|0;if((a[l+xa|0]|0)==0){wa=_;break}else{xa=_}}}}while(0);c[g+4>>2]=va;xa=ua+20|0;c[g+16>>2]=c[xa>>2];c[g+8>>2]=c[c[h>>2]>>2];c[g+20>>2]=wa;g=0;while(1){ya=g+1|0;if((a[va+g|0]|0)==0){break}else{g=ya}}l=c[xa>>2]|0;_=ya+wa+l|0;E=ua+24|0;if((_|0)>(c[E>>2]|0)){f=_+24|0;_=Ec[c[b+12>>2]&63](f)|0;if((_|0)==0){F=1;i=j;return F|0}c[E>>2]=f;f=ua+16|0;tF(_|0,c[f>>2]|0,c[xa>>2]|0)|0;E=c[b+348>>2]|0;if((E|0)!=0){q=E;do{E=q+12|0;if((c[E>>2]|0)==(c[f>>2]|0)){c[E>>2]=_}q=c[q>>2]|0;}while((q|0)!=0)}Cc[c[b+20>>2]&255](c[f>>2]|0);c[f>>2]=_;za=c[xa>>2]|0;Aa=_}else{za=l;Aa=c[ua+16>>2]|0}tF(Aa+za|0,va|0,ya)|0;if((wa|0)!=0){ya=za+g|0;a[Aa+ya|0]=a[b+456|0]|0;tF(Aa+(ya+1)|0,c[c[h>>2]>>2]|0,wa)|0}c[n>>2]=c[ua+16>>2];F=0;i=j;return F|0}function Jd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;g=i;i=i+40|0;h=g|0;j=g+8|0;k=g+16|0;l=g+24|0;m=g+32|0;c[b+264>>2]=82;n=b+272|0;c[n>>2]=d;o=b+144|0;p=b+276|0;q=b+80|0;r=b+44|0;s=b+48|0;t=b+4|0;u=b+464|0;v=d;a:while(1){c[m>>2]=0;d=c[o>>2]|0;w=Sc[c[d>>2]&127](d,v,e,m)|0;x=c[m>>2]|0;c[p>>2]=x;b:do{switch(w|0){case-15:{y=3;break a;break};case-4:{y=11;break a;break};case 15:{d=c[q>>2]|0;if((d|0)==0){break b}z=c[o>>2]|0;c[h>>2]=v;if((a[z+68|0]|0)!=0){Tc[d&127](c[t>>2]|0,v,x-v|0);break b}d=z+56|0;do{c[j>>2]=c[r>>2];Bc[c[d>>2]&63](z,h,x,j,c[s>>2]|0);c[p>>2]=c[h>>2];A=c[r>>2]|0;Tc[c[q>>2]&127](c[t>>2]|0,A,(c[j>>2]|0)-A|0);c[n>>2]=c[h>>2];}while((c[h>>2]|0)!=(x|0));break};case 11:{if((Md(b,c[o>>2]|0,v,x)|0)==0){B=1;y=26;break a}break};case 13:{if((Nd(b,c[o>>2]|0,v,x)|0)==0){B=1;y=26;break a}break};case 0:{y=19;break a;break};case-1:{y=20;break a;break};case-2:{y=22;break a;break};default:{B=9;y=26;break a}}}while(0);C=c[m>>2]|0;c[n>>2]=C;w=c[u>>2]|0;if((w|0)==3){y=25;break}else if((w|0)==2){B=35;y=26;break}else{v=C}}if((y|0)==3){h=c[q>>2]|0;do{if((h|0)==0){D=x}else{j=c[o>>2]|0;c[k>>2]=v;if((a[j+68|0]|0)==0){e=j+56|0;do{c[l>>2]=c[r>>2];Bc[c[e>>2]&63](j,k,x,l,c[s>>2]|0);c[p>>2]=c[k>>2];w=c[r>>2]|0;Tc[c[q>>2]&127](c[t>>2]|0,w,(c[l>>2]|0)-w|0);c[n>>2]=c[k>>2];}while((c[k>>2]|0)!=(x|0))}else{Tc[h&127](c[t>>2]|0,v,x-v|0)}if((c[u>>2]|0)==2){B=35;i=g;return B|0}else{D=c[m>>2]|0;break}}}while(0);c[f>>2]=D;B=0;i=g;return B|0}else if((y|0)==11){c[f>>2]=v;B=0;i=g;return B|0}else if((y|0)==19){c[n>>2]=x;B=4;i=g;return B|0}else if((y|0)==20){if((a[b+468|0]|0)!=0){B=5;i=g;return B|0}c[f>>2]=v;B=0;i=g;return B|0}else if((y|0)==22){if((a[b+468|0]|0)!=0){B=6;i=g;return B|0}c[f>>2]=v;B=0;i=g;return B|0}else if((y|0)==25){c[f>>2]=C;B=0;i=g;return B|0}else if((y|0)==26){i=g;return B|0}return 0}function Kd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;j=i;i=i+80|0;k=j|0;l=j+8|0;m=j+16|0;n=j+24|0;o=j+32|0;p=j+40|0;q=j+48|0;r=j+56|0;s=j+64|0;t=j+72|0;u=c[e>>2]|0;c[q>>2]=u;v=b+144|0;if((c[v>>2]|0)==(d|0)){w=b+272|0;c[w>>2]=u;x=b+276|0;y=w;z=x;A=w;B=x;C=b+284|0}else{x=b+284|0;w=c[x>>2]|0;y=w|0;z=w+4|0;A=b+272|0;B=b+276|0;C=x}c[y>>2]=u;c[e>>2]=0;u=d+8|0;x=b+60|0;w=b+80|0;D=d+68|0;E=b+44|0;F=d+56|0;G=b+48|0;H=b+4|0;I=b+464|0;a:while(1){J=Sc[c[u>>2]&127](d,c[q>>2]|0,f,r)|0;c[z>>2]=c[r>>2];b:do{switch(J|0){case 40:{K=6;break a;break};case 7:{L=c[x>>2]|0;if((L|0)!=0){a[s]=10;Tc[L&127](c[H>>2]|0,s,1);break b}L=c[w>>2]|0;if((L|0)==0){break b}M=c[q>>2]|0;N=c[r>>2]|0;c[m>>2]=M;if((a[D]|0)!=0){Tc[L&127](c[H>>2]|0,M,N-M|0);break b}if((c[v>>2]|0)==(d|0)){O=B;P=A}else{M=c[C>>2]|0;O=M+4|0;P=M|0}do{c[n>>2]=c[E>>2];Bc[c[F>>2]&63](d,m,N,n,c[G>>2]|0);c[O>>2]=c[m>>2];M=c[E>>2]|0;Tc[c[w>>2]&127](c[H>>2]|0,M,(c[n>>2]|0)-M|0);c[P>>2]=c[m>>2];}while((c[m>>2]|0)!=(N|0));break};case 6:{N=c[x>>2]|0;if((N|0)!=0){if((a[D]|0)!=0){M=c[q>>2]|0;Tc[N&127](c[H>>2]|0,M,(c[r>>2]|0)-M|0);break b}while(1){c[t>>2]=c[E>>2];Bc[c[F>>2]&63](d,q,c[r>>2]|0,t,c[G>>2]|0);c[z>>2]=c[r>>2];M=c[E>>2]|0;Tc[N&127](c[H>>2]|0,M,(c[t>>2]|0)-M|0);M=c[q>>2]|0;if((M|0)==(c[r>>2]|0)){break b}c[y>>2]=M}}N=c[w>>2]|0;if((N|0)==0){break b}M=c[q>>2]|0;L=c[r>>2]|0;c[k>>2]=M;if((a[D]|0)!=0){Tc[N&127](c[H>>2]|0,M,L-M|0);break b}if((c[v>>2]|0)==(d|0)){Q=B;R=A}else{M=c[C>>2]|0;Q=M+4|0;R=M|0}do{c[l>>2]=c[E>>2];Bc[c[F>>2]&63](d,k,L,l,c[G>>2]|0);c[Q>>2]=c[k>>2];M=c[E>>2]|0;Tc[c[w>>2]&127](c[H>>2]|0,M,(c[l>>2]|0)-M|0);c[R>>2]=c[k>>2];}while((c[k>>2]|0)!=(L|0));break};case 0:{K=37;break a;break};case-2:{K=38;break a;break};case-1:case-4:{K=40;break a;break};default:{K=42;break a}}}while(0);J=c[r>>2]|0;c[q>>2]=J;c[y>>2]=J;J=c[I>>2]|0;if((J|0)==3){K=44;break}else if((J|0)==2){S=35;K=45;break}}if((K|0)==6){k=c[b+76>>2]|0;do{if((k|0)==0){b=c[w>>2]|0;if((b|0)==0){break}R=c[q>>2]|0;l=c[r>>2]|0;c[o>>2]=R;if((a[D]|0)!=0){Tc[b&127](c[H>>2]|0,R,l-R|0);break}if((c[v>>2]|0)==(d|0)){T=B;U=A}else{R=c[C>>2]|0;T=R+4|0;U=R|0}do{c[p>>2]=c[E>>2];Bc[c[F>>2]&63](d,o,l,p,c[G>>2]|0);c[T>>2]=c[o>>2];R=c[E>>2]|0;Tc[c[w>>2]&127](c[H>>2]|0,R,(c[p>>2]|0)-R|0);c[U>>2]=c[o>>2];}while((c[o>>2]|0)!=(l|0))}else{Cc[k&255](c[H>>2]|0)}}while(0);H=c[r>>2]|0;c[e>>2]=H;c[g>>2]=H;S=(c[I>>2]|0)==2?35:0;i=j;return S|0}else if((K|0)==37){c[y>>2]=c[r>>2];S=4;i=j;return S|0}else if((K|0)==38){if(h<<24>>24==0){S=6;i=j;return S|0}c[g>>2]=c[q>>2];S=0;i=j;return S|0}else if((K|0)==40){if(h<<24>>24==0){S=20;i=j;return S|0}c[g>>2]=c[q>>2];S=0;i=j;return S|0}else if((K|0)==42){c[y>>2]=c[r>>2];S=23;i=j;return S|0}else if((K|0)==44){c[g>>2]=c[r>>2];S=0;i=j;return S|0}else if((K|0)==45){i=j;return S|0}return 0}function Ld(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;g=i;i=i+8|0;h=g|0;c[h>>2]=d;d=b+144|0;j=b+468|0;k=Kd(b,c[d>>2]|0,h,e,f,(a[j]|0)==0|0)|0;l=c[h>>2]|0;if((k|0)!=0|(l|0)==0){m=k;i=g;return m|0}k=b+264|0;if((c[b+460>>2]|0)==0){c[k>>2]=6;h=Gd(b,0,c[d>>2]|0,l,e,f,(a[j]|0)==0|0)|0;if((h|0)!=0){m=h;i=g;return m|0}h=b+16|0;n=c[b+348>>2]|0;if((n|0)==0){m=0;i=g;return m|0}else{o=n}while(1){n=(c[o+24>>2]|0)+1|0;p=o+36|0;q=c[p>>2]|0;r=q+n|0;s=o+4|0;t=c[s>>2]|0;if((t|0)==(r|0)){m=0;u=25;break}v=o+8|0;w=c[v>>2]|0;x=w+n|0;y=o+40|0;if((x|0)>((c[y>>2]|0)-q|0)){z=Oc[c[h>>2]&255](q,x)|0;if((z|0)==0){m=1;u=25;break}q=o+12|0;A=c[p>>2]|0;if((c[q>>2]|0)==(A|0)){c[q>>2]=z}q=o+16|0;B=c[q>>2]|0;if((B|0)!=0){c[q>>2]=z+(B-A)}c[p>>2]=z;c[y>>2]=z+x;C=z+n|0;D=c[s>>2]|0;E=c[v>>2]|0}else{C=r;D=t;E=w}tF(C|0,D|0,E)|0;c[s>>2]=C;s=c[o>>2]|0;if((s|0)==0){m=0;u=25;break}else{o=s}}if((u|0)==25){i=g;return m|0}}else{c[k>>2]=2;k=Gd(b,1,c[d>>2]|0,l,e,f,(a[j]|0)==0|0)|0;if((k|0)!=0){m=k;i=g;return m|0}k=b+16|0;j=c[b+348>>2]|0;if((j|0)==0){m=0;i=g;return m|0}else{F=j}while(1){j=(c[F+24>>2]|0)+1|0;b=F+36|0;f=c[b>>2]|0;e=f+j|0;l=F+4|0;d=c[l>>2]|0;if((d|0)==(e|0)){m=0;u=25;break}o=F+8|0;C=c[o>>2]|0;E=C+j|0;D=F+40|0;if((E|0)>((c[D>>2]|0)-f|0)){h=Oc[c[k>>2]&255](f,E)|0;if((h|0)==0){m=1;u=25;break}f=F+12|0;s=c[b>>2]|0;if((c[f>>2]|0)==(s|0)){c[f>>2]=h}f=F+16|0;w=c[f>>2]|0;if((w|0)!=0){c[f>>2]=h+(w-s)}c[b>>2]=h;c[D>>2]=h+E;G=h+j|0;H=c[l>>2]|0;I=c[o>>2]|0}else{G=e;H=d;I=C}tF(G|0,H|0,I)|0;c[l>>2]=G;l=c[F>>2]|0;if((l|0)==0){m=0;u=25;break}else{F=l}}if((u|0)==25){i=g;return m|0}}return 0}function Md(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=i;i=i+32|0;h=g|0;j=g+8|0;k=g+16|0;l=g+24|0;m=b+64|0;if((c[m>>2]|0)==0){n=b+80|0;o=c[n>>2]|0;if((o|0)==0){p=1;i=g;return p|0}c[k>>2]=e;if((a[d+68|0]|0)!=0){Tc[o&127](c[b+4>>2]|0,e,f-e|0);p=1;i=g;return p|0}if((c[b+144>>2]|0)==(d|0)){q=b+276|0;r=b+272|0}else{o=c[b+284>>2]|0;q=o+4|0;r=o|0}o=b+44|0;s=d+56|0;t=b+48|0;u=b+4|0;while(1){c[l>>2]=c[o>>2];Bc[c[s>>2]&63](d,k,f,l,c[t>>2]|0);c[q>>2]=c[k>>2];v=c[o>>2]|0;Tc[c[n>>2]&127](c[u>>2]|0,v,(c[l>>2]|0)-v|0);c[r>>2]=c[k>>2];if((c[k>>2]|0)==(f|0)){p=1;break}}i=g;return p|0}k=d+64|0;r=c[k>>2]<<1;l=e+r|0;u=e+((Oc[c[d+28>>2]&255](d,l)|0)+r)|0;r=b+400|0;c[j>>2]=l;l=b+412|0;do{if((c[l>>2]|0)==0){if((Bd(r)|0)<<24>>24==0){p=0}else{break}i=g;return p|0}}while(0);e=d+56|0;n=b+408|0;while(1){Bc[c[e>>2]&63](d,j,u,l,c[n>>2]|0);if((c[j>>2]|0)==(u|0)){break}if((Bd(r)|0)<<24>>24==0){p=0;w=41;break}}if((w|0)==41){i=g;return p|0}j=b+416|0;if((c[j>>2]|0)==0){p=0;i=g;return p|0}o=c[l>>2]|0;do{if((o|0)==(c[n>>2]|0)){if((Bd(r)|0)<<24>>24==0){p=0;i=g;return p|0}else{x=c[l>>2]|0;break}}else{x=o}}while(0);c[l>>2]=x+1;a[x]=0;x=c[j>>2]|0;if((x|0)==0){p=0;i=g;return p|0}c[j>>2]=c[l>>2];o=Oc[c[d+32>>2]&255](d,u)|0;u=f+(-(c[k>>2]<<1)|0)|0;c[h>>2]=o;do{if((c[l>>2]|0)==0){if((Bd(r)|0)<<24>>24==0){p=0}else{break}i=g;return p|0}}while(0);while(1){Bc[c[e>>2]&63](d,h,u,l,c[n>>2]|0);if((c[h>>2]|0)==(u|0)){break}if((Bd(r)|0)<<24>>24==0){p=0;w=41;break}}if((w|0)==41){i=g;return p|0}if((c[j>>2]|0)==0){p=0;i=g;return p|0}u=c[l>>2]|0;do{if((u|0)==(c[n>>2]|0)){if((Bd(r)|0)<<24>>24==0){p=0;i=g;return p|0}else{y=c[l>>2]|0;break}}else{y=u}}while(0);c[l>>2]=y+1;a[y]=0;y=c[j>>2]|0;if((y|0)==0){p=0;i=g;return p|0}else{z=y}while(1){u=a[z]|0;if((u<<24>>24|0)==13){A=z;B=z;C=13;w=31;break}else if((u<<24>>24|0)==0){break}z=z+1|0}if((w|0)==31){while(1){w=0;if(C<<24>>24==13){a[A]=10;z=B+1|0;D=(a[z]|0)==10?B+2|0:z}else{a[A]=C;D=B+1|0}E=A+1|0;z=a[D]|0;if(z<<24>>24==0){break}else{A=E;B=D;C=z;w=31}}a[E]=0}Tc[c[m>>2]&127](c[b+4>>2]|0,x,y);y=b+404|0;b=c[y>>2]|0;x=r|0;r=c[x>>2]|0;do{if((b|0)==0){c[y>>2]=r}else{if((r|0)==0){break}else{F=r;G=b}while(1){m=F|0;E=c[m>>2]|0;c[m>>2]=G;c[y>>2]=F;if((E|0)==0){break}else{G=F;F=E}}}}while(0);c[x>>2]=0;c[j>>2]=0;c[l>>2]=0;c[n>>2]=0;p=1;i=g;return p|0}function Nd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=i;i=i+24|0;h=g|0;j=g+8|0;k=g+16|0;l=b+68|0;if((c[l>>2]|0)==0){m=b+80|0;n=c[m>>2]|0;if((n|0)==0){o=1;i=g;return o|0}c[j>>2]=e;if((a[d+68|0]|0)!=0){Tc[n&127](c[b+4>>2]|0,e,f-e|0);o=1;i=g;return o|0}if((c[b+144>>2]|0)==(d|0)){p=b+276|0;q=b+272|0}else{n=c[b+284>>2]|0;p=n+4|0;q=n|0}n=b+44|0;r=d+56|0;s=b+48|0;t=b+4|0;while(1){c[k>>2]=c[n>>2];Bc[c[r>>2]&63](d,j,f,k,c[s>>2]|0);c[p>>2]=c[j>>2];u=c[n>>2]|0;Tc[c[m>>2]&127](c[t>>2]|0,u,(c[k>>2]|0)-u|0);c[q>>2]=c[j>>2];if((c[j>>2]|0)==(f|0)){o=1;break}}i=g;return o|0}j=b+400|0;q=c[d+64>>2]|0;k=f+(q*-3|0)|0;c[h>>2]=e+(q<<2);q=b+412|0;do{if((c[q>>2]|0)==0){if((Bd(j)|0)<<24>>24==0){o=0}else{break}i=g;return o|0}}while(0);e=d+56|0;f=b+408|0;while(1){Bc[c[e>>2]&63](d,h,k,q,c[f>>2]|0);if((c[h>>2]|0)==(k|0)){break}if((Bd(j)|0)<<24>>24==0){o=0;v=32;break}}if((v|0)==32){i=g;return o|0}k=b+416|0;if((c[k>>2]|0)==0){o=0;i=g;return o|0}h=c[q>>2]|0;do{if((h|0)==(c[f>>2]|0)){if((Bd(j)|0)<<24>>24==0){o=0;i=g;return o|0}else{w=c[q>>2]|0;break}}else{w=h}}while(0);c[q>>2]=w+1;a[w]=0;w=c[k>>2]|0;if((w|0)==0){o=0;i=g;return o|0}else{x=w}while(1){h=a[x]|0;if((h<<24>>24|0)==13){y=x;z=x;A=13;v=22;break}else if((h<<24>>24|0)==0){break}x=x+1|0}if((v|0)==22){while(1){v=0;if(A<<24>>24==13){a[y]=10;x=z+1|0;B=(a[x]|0)==10?z+2|0:x}else{a[y]=A;B=z+1|0}C=y+1|0;x=a[B]|0;if(x<<24>>24==0){break}else{y=C;z=B;A=x;v=22}}a[C]=0}Dc[c[l>>2]&63](c[b+4>>2]|0,w);w=b+404|0;b=c[w>>2]|0;l=j|0;j=c[l>>2]|0;do{if((b|0)==0){c[w>>2]=j}else{if((j|0)==0){break}else{D=j;E=b}while(1){C=D|0;v=c[C>>2]|0;c[C>>2]=E;c[w>>2]=D;if((v|0)==0){break}else{E=D;D=v}}}}while(0);c[l>>2]=0;c[k>>2]=0;c[q>>2]=0;c[f>>2]=0;o=1;i=g;return o|0}function Od(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=Gd(b,0,c[b+144>>2]|0,d,e,f,(a[b+468|0]|0)==0|0)|0;do{if((g|0)==0){if((Hd(b)|0)<<24>>24==0){h=1}else{break}return h|0}}while(0);h=g;return h|0}function Pd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=c[b+340>>2]|0;f=d|0;g=e+80|0;h=e+92|0;i=e+88|0;j=e+60|0;k=e+96|0;e=d+4|0;d=c[f>>2]|0;a:while(1){l=a[d]|0;if((l<<24>>24|0)==0){m=1;n=17;break}else if((l<<24>>24|0)==58){l=c[f>>2]|0;o=c[h>>2]|0;p=(o|0)==(c[i>>2]|0);if((l|0)==(d|0)){q=p;r=o}else{s=l;l=p;p=o;while(1){if(l){if((Bd(g)|0)<<24>>24==0){m=0;n=17;break a}t=c[h>>2]|0}else{t=p}o=a[s]|0;c[h>>2]=t+1;a[t]=o;o=s+1|0;u=c[h>>2]|0;v=(u|0)==(c[i>>2]|0);if((o|0)==(d|0)){q=v;r=u;break}else{s=o;l=v;p=u}}}if(q){if((Bd(g)|0)<<24>>24==0){m=0;n=17;break}w=c[h>>2]|0}else{w=r}c[h>>2]=w+1;a[w]=0;p=Cd(b,j,c[k>>2]|0,8)|0;if((p|0)==0){m=0;n=17;break}l=c[k>>2]|0;if((c[p>>2]|0)==(l|0)){c[k>>2]=c[h>>2]}else{c[h>>2]=l}c[e>>2]=p}d=d+1|0}if((n|0)==17){return m|0}return 0}function Qd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;g=i;i=i+8|0;h=g|0;j=c[b+340>>2]|0;k=j+80|0;l=j+92|0;m=c[l>>2]|0;n=j+88|0;do{if((m|0)==(c[n>>2]|0)){if((Bd(k)|0)<<24>>24==0){o=0;i=g;return o|0}else{p=c[l>>2]|0;break}}else{p=m}}while(0);c[l>>2]=p+1;a[p]=0;c[h>>2]=e;do{if((c[l>>2]|0)==0){if((Bd(k)|0)<<24>>24==0){o=0}else{break}i=g;return o|0}}while(0);e=d+56|0;while(1){Bc[c[e>>2]&63](d,h,f,l,c[n>>2]|0);if((c[h>>2]|0)==(f|0)){break}if((Bd(k)|0)<<24>>24==0){o=0;q=39;break}}if((q|0)==39){i=g;return o|0}f=j+96|0;if((c[f>>2]|0)==0){o=0;i=g;return o|0}h=c[l>>2]|0;do{if((h|0)==(c[n>>2]|0)){if((Bd(k)|0)<<24>>24==0){o=0;i=g;return o|0}else{r=c[l>>2]|0;break}}else{r=h}}while(0);c[l>>2]=r+1;a[r]=0;r=c[f>>2]|0;if((r|0)==0){o=0;i=g;return o|0}h=r+1|0;d=Cd(b,j+40|0,h,12)|0;e=d;if((d|0)==0){o=0;i=g;return o|0}if((c[d>>2]|0)!=(h|0)){c[l>>2]=c[f>>2];o=e;i=g;return o|0}p=c[l>>2]|0;c[f>>2]=p;if((a[b+232|0]|0)==0){o=e;i=g;return o|0}do{if((a[h]|0)==120){if((a[r+2|0]|0)!=109){s=0;break}if((a[r+3|0]|0)!=108){s=0;break}if((a[r+4|0]|0)!=110){s=0;break}if((a[r+5|0]|0)!=115){s=0;break}m=a[r+6|0]|0;if((m<<24>>24|0)==0){c[d+4>>2]=j+132}else if((m<<24>>24|0)==58){c[d+4>>2]=Cd(b,j+60|0,r+7|0,8)|0}else{s=0;break}a[e+9|0]=1;o=e;i=g;return o|0}else{s=0}}while(0);while(1){h=s+1|0;m=a[r+h|0]|0;if((m<<24>>24|0)==58){break}else if((m<<24>>24|0)==0){o=e;q=39;break}else{s=h}}if((q|0)==39){i=g;return o|0}q=(p|0)==(c[n>>2]|0);a:do{if((s|0)>0){h=0;m=q;t=p;while(1){if(m){if((Bd(k)|0)<<24>>24==0){o=0;break}u=c[l>>2]|0}else{u=t}v=h+1|0;w=a[r+v|0]|0;c[l>>2]=u+1;a[u]=w;w=c[l>>2]|0;x=(w|0)==(c[n>>2]|0);if((v|0)<(s|0)){h=v;m=x;t=w}else{y=x;z=w;break a}}i=g;return o|0}else{y=q;z=p}}while(0);do{if(y){if((Bd(k)|0)<<24>>24==0){o=0;i=g;return o|0}else{A=c[l>>2]|0;break}}else{A=z}}while(0);c[l>>2]=A+1;a[A]=0;A=Cd(b,j+60|0,c[f>>2]|0,8)|0;c[d+4>>2]=A;d=c[f>>2]|0;if((c[A>>2]|0)==(d|0)){c[f>>2]=c[l>>2];o=e;i=g;return o|0}else{c[l>>2]=d;o=e;i=g;return o|0}return 0}function Rd(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;k=i;i=i+32|0;l=k|0;m=k+8|0;n=k+16|0;o=k+24|0;p=c[b+340>>2]|0;q=e+12|0;r=e+40|0;s=f<<24>>24==0;t=j+12|0;u=j+16|0;v=o|0;w=j+8|0;x=e+56|0;y=e+64|0;z=e+44|0;A=b+424|0;B=b+436|0;C=b+432|0;D=b+440|0;E=p+8|0;F=(p+80|0)==(j|0);G=p+130|0;H=p+129|0;I=b+284|0;J=b+224|0;K=b+472|0;L=p|0;M=p+4|0;p=g;a:while(1){b:do{switch(Sc[c[q>>2]&127](e,p,h,n)|0){case 10:{g=Oc[c[r>>2]&255](e,p)|0;if((g|0)<0){N=8;break a}if(s&(g|0)==32){O=c[t>>2]|0;if((O|0)==(c[u>>2]|0)){break b}if((a[O-1|0]|0)==32){break b}}O=Re(g,v)|0;if((O|0)==0){N=15;break a}if((O|0)>0){P=0}else{break b}do{g=c[t>>2]|0;if((g|0)==(c[w>>2]|0)){if((Bd(j)|0)<<24>>24==0){Q=1;N=84;break a}R=c[t>>2]|0}else{R=g}g=a[o+P|0]|0;c[t>>2]=R+1;a[R]=g;P=P+1|0;}while((P|0)<(O|0));break};case 6:{O=c[n>>2]|0;c[m>>2]=p;if((c[t>>2]|0)==0){if((Bd(j)|0)<<24>>24==0){Q=1;N=84;break a}}while(1){Bc[c[x>>2]&63](e,m,O,t,c[w>>2]|0);if((c[m>>2]|0)==(O|0)){break}if((Bd(j)|0)<<24>>24==0){Q=1;N=84;break a}}if((c[u>>2]|0)==0){Q=1;N=84;break a}break};case-3:{c[n>>2]=p+(c[y>>2]|0);N=27;break};case 39:case 7:{N=27;break};case 9:{O=c[y>>2]|0;g=(Hc[c[z>>2]&63](e,p+O|0,(c[n>>2]|0)+(-O|0)|0)|0)&255;if(g<<24>>24!=0){O=c[t>>2]|0;if((O|0)==(c[w>>2]|0)){if((Bd(j)|0)<<24>>24==0){Q=1;N=84;break a}S=c[t>>2]|0}else{S=O}c[t>>2]=S+1;a[S]=g;break b}g=c[y>>2]|0;O=(c[n>>2]|0)+(-g|0)|0;c[l>>2]=p+g;if((c[B>>2]|0)==0){if((Bd(A)|0)<<24>>24==0){Q=1;N=84;break a}}while(1){Bc[c[x>>2]&63](e,l,O,B,c[C>>2]|0);if((c[l>>2]|0)==(O|0)){break}if((Bd(A)|0)<<24>>24==0){Q=1;N=84;break a}}if((c[D>>2]|0)==0){Q=1;N=84;break a}O=c[B>>2]|0;if((O|0)==(c[C>>2]|0)){if((Bd(A)|0)<<24>>24==0){Q=1;N=84;break a}T=c[B>>2]|0}else{T=O}c[B>>2]=T+1;a[T]=0;O=c[D>>2]|0;if((O|0)==0){Q=1;N=84;break a}g=c[E>>2]|0;c:do{if((g|0)==0){U=0}else{V=c[K>>2]|0;W=a[O]|0;if(W<<24>>24==0){X=V}else{Y=O;Z=V;V=W;while(1){_=Y+1|0;$=(Z*1000003|0)^V&255;aa=a[_]|0;if(aa<<24>>24==0){X=$;break}else{Y=_;Z=$;V=aa}}}V=g-1|0;Z=X&V;Y=c[L>>2]|0;aa=c[Y+(Z<<2)>>2]|0;if((aa|0)==0){U=0;break}$=X&-g;_=V>>>2;V=0;ba=Z;Z=aa;while(1){aa=c[Z>>2]|0;if(W<<24>>24==(a[aa]|0)){ca=O;da=aa;aa=W;do{if(aa<<24>>24==0){U=Z;break c}ca=ca+1|0;da=da+1|0;aa=a[ca]|0;}while(aa<<24>>24==(a[da]|0))}if(V<<24>>24==0){ea=($>>>(((d[M]|0)-1|0)>>>0)&_|1)&255}else{ea=V}da=ea&255;aa=(ba>>>0<da>>>0?g:0)+(ba-da)|0;da=c[Y+(aa<<2)>>2]|0;if((da|0)==0){U=0;break}else{V=ea;ba=aa;Z=da}}}}while(0);g=U;c[B>>2]=O;do{if(F){if((a[G]|0)==0){fa=(a[H]|0)!=0}else{fa=(c[I>>2]|0)!=0}ga=fa&1^1;N=67}else{if((a[H]|0)==0){if((U|0)==0){Q=11;N=84;break a}else{N=69;break}}else{ga=(a[G]|0)!=0|0;N=67;break}}}while(0);do{if((N|0)==67){N=0;O=(U|0)!=0;if(ga<<24>>24==0){if(O){break}else{break b}}else{if(O){N=69;break}else{Q=11;N=84;break a}}}}while(0);if((N|0)==69){N=0;if((a[g+34|0]|0)==0){Q=24;N=84;break a}}O=U+32|0;if((a[O]|0)!=0){N=72;break a}if((c[U+28>>2]|0)!=0){N=75;break a}Z=c[U+4>>2]|0;if((Z|0)==0){N=78;break a}ba=Z+(c[U+8>>2]|0)|0;a[O]=1;V=Rd(b,c[J>>2]|0,f,Z,ba,j)|0;a[O]=0;if((V|0)!=0){Q=V;N=84;break a}break};case-4:{Q=0;N=84;break a;break};case-1:{N=5;break a;break};case 0:{N=3;break a;break};default:{N=81;break a}}}while(0);do{if((N|0)==27){N=0;V=c[t>>2]|0;if(s){if((V|0)==(c[u>>2]|0)){break}if((a[V-1|0]|0)==32){break}}if((V|0)==(c[w>>2]|0)){if((Bd(j)|0)<<24>>24==0){Q=1;N=84;break a}ha=c[t>>2]|0}else{ha=V}c[t>>2]=ha+1;a[ha]=32}}while(0);p=c[n>>2]|0}if((N|0)==3){if((c[b+144>>2]|0)!=(e|0)){Q=4;i=k;return Q|0}c[b+272>>2]=c[n>>2];Q=4;i=k;return Q|0}else if((N|0)==5){if((c[b+144>>2]|0)!=(e|0)){Q=4;i=k;return Q|0}c[b+272>>2]=p;Q=4;i=k;return Q|0}else if((N|0)==8){if((c[b+144>>2]|0)!=(e|0)){Q=14;i=k;return Q|0}c[b+272>>2]=p;Q=14;i=k;return Q|0}else if((N|0)==15){if((c[b+144>>2]|0)!=(e|0)){Q=14;i=k;return Q|0}c[b+272>>2]=p;Q=14;i=k;return Q|0}else if((N|0)==72){if((c[b+144>>2]|0)!=(e|0)){Q=12;i=k;return Q|0}c[b+272>>2]=p;Q=12;i=k;return Q|0}else if((N|0)==75){if((c[b+144>>2]|0)!=(e|0)){Q=15;i=k;return Q|0}c[b+272>>2]=p;Q=15;i=k;return Q|0}else if((N|0)==78){if((c[b+144>>2]|0)!=(e|0)){Q=16;i=k;return Q|0}c[b+272>>2]=p;Q=16;i=k;return Q|0}else if((N|0)==81){if((c[b+144>>2]|0)!=(e|0)){Q=23;i=k;return Q|0}c[b+272>>2]=p;Q=23;i=k;return Q|0}else if((N|0)==84){i=k;return Q|0}return 0}function Sd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;i=i+8|0;h=g|0;j=b+284|0;k=c[j>>2]|0;if((k|0)==0){l=23;i=g;return l|0}m=c[k+12>>2]|0;n=m+4|0;o=c[n>>2]|0;p=m+12|0;q=o+(c[m+8>>2]|0)|0;r=Gd(b,c[k+16>>2]|0,c[b+224>>2]|0,o+(c[p>>2]|0)|0,q,h,0)|0;if((r|0)!=0){l=r;i=g;return l|0}r=c[h>>2]|0;do{if((q|0)!=(r|0)){if((c[b+464>>2]|0)!=3){break}c[p>>2]=r-(c[n>>2]|0);l=0;i=g;return l|0}}while(0);a[m+32|0]=0;m=k+8|0;c[j>>2]=c[m>>2];j=b+288|0;c[m>>2]=c[j>>2];c[j>>2]=k;c[b+264>>2]=6;l=Gd(b,(c[b+460>>2]|0)!=0|0,c[b+144>>2]|0,d,e,f,(a[b+468|0]|0)==0|0)|0;i=g;return l|0}function Td(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+1040|0;e=d|0;f=c[a+124>>2]|0;if((f|0)==0){g=18;i=d;return g|0}vF(e|0,-1|0,1024)|0;h=e+1028|0;c[h>>2]=0;j=e+1024|0;c[j>>2]=0;k=e+1032|0;c[k>>2]=0;do{if((Hc[f&63](c[a+244>>2]|0,b,e)|0)!=0){l=c[a+12>>2]|0;m=Se()|0;n=Ec[l&63](m)|0;c[a+236>>2]=n;if((n|0)!=0){m=Te(n,e|0,c[h>>2]|0,c[j>>2]|0)|0;if((m|0)==0){break}c[a+240>>2]=c[j>>2];c[a+248>>2]=c[k>>2];c[a+144>>2]=m;g=0;i=d;return g|0}m=c[k>>2]|0;if((m|0)==0){g=1;i=d;return g|0}Cc[m&255](c[j>>2]|0);g=1;i=d;return g|0}}while(0);a=c[k>>2]|0;if((a|0)==0){g=18;i=d;return g|0}Cc[a&255](c[j>>2]|0);g=18;i=d;return g|0}function Ud(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=a+228|0;do{if((_e(a+148|0,a+144|0,c[f>>2]|0)|0)==0){g=Td(a,c[f>>2]|0)|0;if((g|0)==0){break}else{h=g}return h|0}}while(0);c[a+264>>2]=92;h=Vd(a,b,d,e)|0;return h|0}function Vd(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0;h=i;i=i+184|0;j=h|0;k=h+8|0;l=h+16|0;m=h+24|0;n=h+32|0;o=h+40|0;p=h+48|0;q=h+56|0;r=h+64|0;s=h+72|0;t=h+80|0;u=h+88|0;v=h+96|0;w=h+104|0;x=h+112|0;y=h+120|0;z=h+128|0;A=h+136|0;B=h+144|0;C=h+152|0;D=h+160|0;E=h+168|0;F=h+176|0;c[F>>2]=e;G=b+144|0;H=c[G>>2]|0;I=Sc[c[H>>2]&127](H,e,f,F)|0;H=c[G>>2]|0;J=b+468|0;K=a[J]|0;c[E>>2]=c[F>>2];F=b+340|0;L=c[F>>2]|0;M=b+272|0;N=b+276|0;O=b+284|0;P=K<<24>>24!=0;K=b+252|0;Q=K|0;R=b+80|0;S=b+44|0;T=b+48|0;U=b+4|0;V=b+464|0;W=b+84|0;X=b+308|0;Y=b+400|0;Z=b+412|0;_=b+408|0;$=b+416|0;aa=b+304|0;ba=b+312|0;ca=b+404|0;da=b+400|0;ea=L+129|0;fa=L+128|0;ga=b+300|0;ha=L+80|0;ia=L+92|0;ja=L+88|0;ka=L+96|0;la=b+136|0;ma=b+88|0;na=b+328|0;oa=b+132|0;pa=b+332|0;qa=b+336|0;ra=b+316|0;sa=b+337|0;ta=b+12|0;ua=b+16|0;va=z|0;wa=L+120|0;xa=L+116|0;ya=b+344|0;za=L+130|0;Aa=b+108|0;Ba=b+92|0;Ca=L|0;Da=b+460|0;Ea=b+324|0;Fa=b+320|0;Ga=b+96|0;Ha=b+256|0;Ia=b+452|0;Ja=b+448|0;Ka=L+140|0;La=L+160|0;Ma=L+164|0;Na=L+144|0;Oa=b+128|0;Pa=L+156|0;Qa=L+148|0;L=H;H=e;e=I;a:while(1){c[M>>2]=H;c[N>>2]=c[E>>2];b:do{if((e|0)<1){if(!((e|0)==0|P)){Ra=4;break a}switch(e|0){case 0:{Ra=6;break a;break};case-1:{Sa=5;Ra=486;break a;break};case-2:{Ra=487;break a;break};case-15:{Ta=15;break b;break};case-4:{Ua=3;Ra=488;break a;break};default:{}}c[E>>2]=f;Ta=-e|0}else{Ta=e}}while(0);I=Gc[c[Q>>2]&127](K,Ta,H,c[E>>2]|0,L)|0;c:do{switch(I|0){case 28:{c[ra>>2]=28928;Ra=121;break};case 29:{c[ra>>2]=28888;Ra=121;break};case 30:{c[ra>>2]=28872;Ra=121;break};case 5:{a[ea]=1;if((c[W>>2]|0)==0){Va=1}else{Wa=c[L+64>>2]|0;Xa=(c[E>>2]|0)+(-Wa|0)|0;c[w>>2]=H+Wa;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Ra=261;break a}}Wa=L+56|0;while(1){Bc[c[Wa>>2]&63](L,w,Xa,Z,c[_>>2]|0);if((c[w>>2]|0)==(Xa|0)){break}if((Bd(Y)|0)<<24>>24==0){Ra=261;break a}}if((c[$>>2]|0)==0){Ra=261;break a}Xa=c[Z>>2]|0;if((Xa|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Ra=261;break a}Ya=c[Z>>2]|0}else{Ya=Xa}c[Z>>2]=Ya+1;a[Ya]=0;Xa=c[$>>2]|0;c[X>>2]=Xa;if((Xa|0)==0){Sa=1;Ra=486;break a}c[$>>2]=c[Z>>2];Va=0}if((a[za]|0)!=0){Za=Va;Ra=475;break c}Xa=c[Aa>>2]|0;if((Xa|0)==0){Za=Va;Ra=475;break c}if((Ec[Xa&63](c[U>>2]|0)|0)==0){Sa=22;Ra=486;break a}else{Za=Va;Ra=475}break};case 4:{if((c[W>>2]|0)==0){_a=1}else{Xa=c[E>>2]|0;c[D>>2]=H;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Ra=21;break a}}Wa=L+56|0;while(1){Bc[c[Wa>>2]&63](L,D,Xa,Z,c[_>>2]|0);if((c[D>>2]|0)==(Xa|0)){break}if((Bd(Y)|0)<<24>>24==0){Ra=21;break a}}if((c[$>>2]|0)==0){Ra=21;break a}Xa=c[Z>>2]|0;if((Xa|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Ra=21;break a}$a=c[Z>>2]|0}else{$a=Xa}c[Z>>2]=$a+1;a[$a]=0;Xa=c[$>>2]|0;c[aa>>2]=Xa;if((Xa|0)==0){Sa=1;Ra=486;break a}c[$>>2]=c[Z>>2];c[ba>>2]=0;_a=0}c[X>>2]=0;Za=_a;Ra=475;break};case 1:{Xa=Ed(b,0,H,c[E>>2]|0)|0;if((Xa|0)!=0){Sa=Xa;Ra=486;break a}ab=c[G>>2]|0;break};case 34:{Xa=c[E>>2]|0;Wa=c[F>>2]|0;bb=Wa+80|0;c[l>>2]=H;cb=Wa+92|0;if((c[cb>>2]|0)==0){if((Bd(bb)|0)<<24>>24==0){Ra=109;break a}}db=L+56|0;eb=Wa+88|0;while(1){Bc[c[db>>2]&63](L,l,Xa,cb,c[eb>>2]|0);if((c[l>>2]|0)==(Xa|0)){break}if((Bd(bb)|0)<<24>>24==0){Ra=109;break a}}Xa=Wa+96|0;if((c[Xa>>2]|0)==0){Ra=109;break a}db=c[cb>>2]|0;if((db|0)==(c[eb>>2]|0)){if((Bd(bb)|0)<<24>>24==0){Ra=109;break a}fb=c[cb>>2]|0}else{fb=db}c[cb>>2]=fb+1;a[fb]=0;db=c[Xa>>2]|0;if((db|0)==0){Ra=109;break a}gb=Cd(b,Wa+20|0,db,24)|0;hb=gb;if((gb|0)==0){Ra=109;break a}if((c[gb>>2]|0)==(db|0)){c[Xa>>2]=c[cb>>2];if((Pd(b,hb)|0)==0){Ra=109;break a}}else{c[cb>>2]=c[Xa>>2]}c[na>>2]=hb;Ra=121;break};case 21:{if((Sc[c[L+52>>2]&127](L,H,c[E>>2]|0,M)|0)==0){Sa=32;Ra=486;break a}if((c[Fa>>2]|0)==0){Ra=476;break c}hb=c[L+64>>2]|0;Xa=(c[E>>2]|0)+(-hb|0)|0;c[r>>2]=H+hb;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}}hb=L+56|0;while(1){Bc[c[hb>>2]&63](L,r,Xa,Z,c[_>>2]|0);if((c[r>>2]|0)==(Xa|0)){break}if((Bd(Y)|0)<<24>>24==0){Ua=1;Ra=488;break a}}if((c[$>>2]|0)==0){Sa=1;Ra=486;break a}Xa=c[Z>>2]|0;if((Xa|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}ib=c[Z>>2]|0}else{ib=Xa}c[Z>>2]=ib+1;a[ib]=0;Xa=c[$>>2]|0;if((Xa|0)==0){Sa=1;Ra=486;break a}hb=a[Xa]|0;do{if(hb<<24>>24==0){jb=Xa}else{cb=Xa;Wa=Xa;bb=hb;while(1){eb=bb<<24>>24;do{if((eb|0)==32|(eb|0)==13|(eb|0)==10){if((cb|0)==(Xa|0)){kb=Xa;break}if((a[cb-1|0]|0)==32){kb=cb;break}a[cb]=32;kb=cb+1|0}else{a[cb]=bb;kb=cb+1|0}}while(0);eb=Wa+1|0;db=a[eb]|0;if(db<<24>>24==0){break}else{cb=kb;Wa=eb;bb=db}}if((kb|0)==(Xa|0)){jb=Xa;break}bb=kb-1|0;jb=(a[bb]|0)==32?bb:kb}}while(0);a[jb]=0;c[Ea>>2]=Xa;c[$>>2]=c[Z>>2];ab=L;break};case 23:{a[qa]=1;c[ra>>2]=28944;Ra=121;break};case 37:case 38:{if((a[fa]|0)==0){Ra=476;break c}hb=a[qa]|0;bb=c[L+64>>2]|0;Wa=Rd(b,L,hb,H+bb|0,(c[E>>2]|0)+(-bb|0)|0,ha)|0;if((Wa|0)!=0){Sa=Wa;Ra=486;break a}Wa=c[ia>>2]|0;do{if(hb<<24>>24==0){if((Wa|0)==(c[ka>>2]|0)){lb=Wa;break}bb=Wa-1|0;if((a[bb]|0)!=32){lb=Wa;break}c[ia>>2]=bb;lb=bb}else{lb=Wa}}while(0);if((lb|0)==(c[ja>>2]|0)){if((Bd(ha)|0)<<24>>24==0){Sa=1;Ra=486;break a}mb=c[ia>>2]|0}else{mb=lb}c[ia>>2]=mb+1;a[mb]=0;Wa=c[ka>>2]|0;c[ka>>2]=c[ia>>2];hb=c[na>>2]|0;Xa=c[pa>>2]|0;bb=a[qa]|0;cb=hb+12|0;db=c[cb>>2]|0;d:do{if((Wa|0)!=0&(db|0)>0){eb=c[hb+20>>2]|0;gb=0;while(1){nb=gb+1|0;if((c[eb+(gb*12|0)>>2]|0)==(Xa|0)){break d}if((nb|0)<(db|0)){gb=nb}else{Ra=187;break}}}else{Ra=187}}while(0);if((Ra|0)==187){Ra=0;gb=hb+16|0;do{if((db|0)==(c[gb>>2]|0)){if((db|0)==0){c[gb>>2]=8;eb=Ec[c[ta>>2]&63](96)|0;nb=eb;c[hb+20>>2]=nb;if((eb|0)==0){Sa=1;Ra=486;break a}else{ob=nb;break}}nb=hb+20|0;eb=Oc[c[ua>>2]&255](c[nb>>2]|0,db*24|0)|0;if((eb|0)==0){Sa=1;Ra=486;break a}pb=eb;c[gb>>2]=db<<1;c[nb>>2]=pb;ob=pb}else{ob=c[hb+20>>2]|0}}while(0);hb=c[cb>>2]|0;c[ob+(hb*12|0)>>2]=Xa;c[ob+(hb*12|0)+8>>2]=Wa;a[ob+(hb*12|0)+4|0]=bb;if(bb<<24>>24==0){a[Xa+8|0]=1}c[cb>>2]=(c[cb>>2]|0)+1}if((c[oa>>2]|0)==0){Ra=476;break c}hb=c[ra>>2]|0;if((hb|0)==0){Ra=476;break c}db=a[hb]|0;if((db<<24>>24|0)==78){if((a[hb+1|0]|0)==79){Ra=200}}else if((db<<24>>24|0)==40){Ra=200}if((Ra|0)==200){Ra=0;db=c[Z>>2]|0;if((db|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}qb=c[Z>>2]|0}else{qb=db}c[Z>>2]=qb+1;a[qb]=41;db=c[Z>>2]|0;if((db|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}rb=c[Z>>2]|0}else{rb=db}c[Z>>2]=rb+1;a[rb]=0;c[ra>>2]=c[$>>2];c[$>>2]=c[Z>>2]}c[N>>2]=H;Ic[c[oa>>2]&15](c[U>>2]|0,c[c[na>>2]>>2]|0,c[c[pa>>2]>>2]|0,c[ra>>2]|0,Wa,(I|0)==38|0);db=c[ca>>2]|0;hb=c[da>>2]|0;do{if((db|0)==0){c[ca>>2]=hb}else{if((hb|0)==0){break}else{sb=hb;tb=db}while(1){gb=sb|0;pb=c[gb>>2]|0;c[gb>>2]=tb;c[ca>>2]=sb;if((pb|0)==0){break}else{tb=sb;sb=pb}}}}while(0);c[da>>2]=0;c[$>>2]=0;c[Z>>2]=0;c[_>>2]=0;ab=L;break};case 10:{c[ga>>2]=0;Ra=476;break};case 18:{c[Ea>>2]=0;c[Fa>>2]=0;if((c[Ga>>2]|0)==0){Ra=476;break c}db=c[E>>2]|0;c[s>>2]=H;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Ra=333;break a}}hb=L+56|0;while(1){Bc[c[hb>>2]&63](L,s,db,Z,c[_>>2]|0);if((c[s>>2]|0)==(db|0)){break}if((Bd(Y)|0)<<24>>24==0){Ra=333;break a}}if((c[$>>2]|0)==0){Ra=333;break a}db=c[Z>>2]|0;if((db|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Ra=333;break a}ub=c[Z>>2]|0}else{ub=db}c[Z>>2]=ub+1;a[ub]=0;db=c[$>>2]|0;c[Fa>>2]=db;if((db|0)==0){Sa=1;Ra=486;break a}c[$>>2]=c[Z>>2];ab=L;break};case 6:{a[ea]=1;if((c[W>>2]|0)==0){Ra=53;break c}if((Sc[c[L+52>>2]&127](L,H,c[E>>2]|0,M)|0)==0){Sa=32;Ra=486;break a}db=c[L+64>>2]|0;hb=(c[E>>2]|0)+(-db|0)|0;c[C>>2]=H+db;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}}db=L+56|0;while(1){Bc[c[db>>2]&63](L,C,hb,Z,c[_>>2]|0);if((c[C>>2]|0)==(hb|0)){break}if((Bd(Y)|0)<<24>>24==0){Ua=1;Ra=488;break a}}if((c[$>>2]|0)==0){Sa=1;Ra=486;break a}hb=c[Z>>2]|0;if((hb|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}vb=c[Z>>2]|0}else{vb=hb}c[Z>>2]=vb+1;a[vb]=0;hb=c[$>>2]|0;if((hb|0)==0){Sa=1;Ra=486;break a}db=a[hb]|0;do{if(db<<24>>24==0){wb=hb}else{Wa=hb;cb=hb;Xa=db;while(1){bb=Xa<<24>>24;do{if((bb|0)==32|(bb|0)==13|(bb|0)==10){if((Wa|0)==(hb|0)){xb=hb;break}if((a[Wa-1|0]|0)==32){xb=Wa;break}a[Wa]=32;xb=Wa+1|0}else{a[Wa]=Xa;xb=Wa+1|0}}while(0);bb=cb+1|0;pb=a[bb]|0;if(pb<<24>>24==0){break}else{Wa=xb;cb=bb;Xa=pb}}if((xb|0)==(hb|0)){wb=hb;break}Xa=xb-1|0;wb=(a[Xa]|0)==32?Xa:xb}}while(0);a[wb]=0;c[$>>2]=c[Z>>2];c[ba>>2]=hb;yb=0;Ra=54;break};case 19:{do{if((c[Fa>>2]|0)==0){zb=1}else{if((c[Ga>>2]|0)==0){zb=1;break}db=c[L+64>>2]|0;Xa=(c[E>>2]|0)+(-db|0)|0;c[q>>2]=H+db;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}}db=L+56|0;while(1){Bc[c[db>>2]&63](L,q,Xa,Z,c[_>>2]|0);if((c[q>>2]|0)==(Xa|0)){break}if((Bd(Y)|0)<<24>>24==0){Ua=1;Ra=488;break a}}if((c[$>>2]|0)==0){Sa=1;Ra=486;break a}Xa=c[Z>>2]|0;if((Xa|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}Ab=c[Z>>2]|0}else{Ab=Xa}c[Z>>2]=Ab+1;a[Ab]=0;Xa=c[$>>2]|0;if((Xa|0)==0){Sa=1;Ra=486;break a}c[N>>2]=H;Bc[c[Ga>>2]&63](c[U>>2]|0,c[Fa>>2]|0,c[ya>>2]|0,Xa,c[Ea>>2]|0);zb=0}}while(0);hb=c[ca>>2]|0;Xa=c[da>>2]|0;do{if((hb|0)==0){c[ca>>2]=Xa}else{if((Xa|0)==0){break}else{Bb=Xa;Cb=hb}while(1){db=Bb|0;cb=c[db>>2]|0;c[db>>2]=Cb;c[ca>>2]=Bb;if((cb|0)==0){break}else{Cb=Bb;Bb=cb}}}}while(0);c[da>>2]=0;c[$>>2]=0;c[Z>>2]=0;c[_>>2]=0;Za=zb;Ra=475;break};case-1:{Ra=384;break a;break};case 44:{hb=c[Ia>>2]|0;do{if((c[Ha>>2]|0)>>>0>=hb>>>0){if((hb|0)==0){Xa=c[ta>>2]|0;c[Ia>>2]=32;cb=Ec[Xa&63](32)|0;c[Ja>>2]=cb;if((cb|0)==0){Sa=1;Ra=486;break a}else{break}}cb=c[ua>>2]|0;Xa=c[Ja>>2]|0;db=hb<<1;c[Ia>>2]=db;Wa=Oc[cb&255](Xa,db)|0;if((Wa|0)==0){Sa=1;Ra=486;break a}c[Ja>>2]=Wa;Wa=c[Ma>>2]|0;if((Wa|0)==0){break}db=Oc[c[ua>>2]&255](Wa,c[Ia>>2]<<2)|0;if((db|0)==0){Sa=1;Ra=486;break a}c[Ma>>2]=db}}while(0);a[(c[Ja>>2]|0)+(c[Ha>>2]|0)|0]=0;if((a[Ka]|0)==0){Ra=476;break c}hb=Wd(b)|0;if((hb|0)<0){Sa=1;Ra=486;break a}c[(c[Ma>>2]|0)+(c[La>>2]<<2)>>2]=hb;c[La>>2]=(c[La>>2]|0)+1;c[(c[Na>>2]|0)+(hb*28|0)>>2]=6;Za=(c[Oa>>2]|0)==0|0;Ra=475;break};case 8:{hb=c[aa>>2]|0;if((hb|0)==0){Db=1}else{Bc[c[W>>2]&63](c[U>>2]|0,hb,c[X>>2]|0,c[ba>>2]|0,0);hb=c[ca>>2]|0;db=c[da>>2]|0;do{if((hb|0)==0){c[ca>>2]=db}else{if((db|0)==0){break}else{Eb=db;Fb=hb}while(1){Wa=Eb|0;Xa=c[Wa>>2]|0;c[Wa>>2]=Fb;c[ca>>2]=Eb;if((Xa|0)==0){break}else{Fb=Eb;Eb=Xa}}}}while(0);c[da>>2]=0;c[$>>2]=0;c[Z>>2]=0;c[_>>2]=0;Db=0}hb=c[ma>>2]|0;if((hb|0)==0){Za=Db;Ra=475;break c}Cc[hb&255](c[U>>2]|0);ab=L;break};case 9:{if((Hc[c[L+44>>2]&63](L,H,c[E>>2]|0)|0)!=0){c[ga>>2]=0;Ra=476;break c}if((a[fa]|0)==0){c[ia>>2]=c[ka>>2];c[ga>>2]=0;Ra=476;break c}hb=c[E>>2]|0;c[t>>2]=H;if((c[ia>>2]|0)==0){if((Bd(ha)|0)<<24>>24==0){Sa=1;Ra=486;break a}}db=L+56|0;while(1){Bc[c[db>>2]&63](L,t,hb,ia,c[ja>>2]|0);if((c[t>>2]|0)==(hb|0)){break}if((Bd(ha)|0)<<24>>24==0){Ua=1;Ra=488;break a}}if((c[ka>>2]|0)==0){Sa=1;Ra=486;break a}hb=c[ia>>2]|0;if((hb|0)==(c[ja>>2]|0)){if((Bd(ha)|0)<<24>>24==0){Sa=1;Ra=486;break a}Gb=c[ia>>2]|0}else{Gb=hb}c[ia>>2]=Gb+1;a[Gb]=0;hb=c[ka>>2]|0;if((hb|0)==0){Sa=1;Ra=486;break a}db=Cd(b,Ca,hb,36)|0;c[ga>>2]=db;if((db|0)==0){Sa=1;Ra=486;break a}if((c[db>>2]|0)!=(hb|0)){c[ia>>2]=c[ka>>2];c[ga>>2]=0;Ra=476;break c}c[ka>>2]=c[ia>>2];c[(c[ga>>2]|0)+24>>2]=0;a[(c[ga>>2]|0)+33|0]=0;if((c[Da>>2]|0)==0){Hb=(c[O>>2]|0)==0|0}else{Hb=0}a[(c[ga>>2]|0)+34|0]=Hb;Za=(c[la>>2]|0)==0|0;Ra=475;break};case 14:{Ra=53;break};case 50:{hb=(c[Ja>>2]|0)+(c[Ha>>2]|0)|0;if((a[hb]|0)==124){Sa=2;Ra=486;break a}a[hb]=44;if((a[Ka]|0)==0){Ra=476;break c}Za=(c[Oa>>2]|0)==0|0;Ra=475;break};case 49:{hb=c[Ha>>2]|0;db=c[Ja>>2]|0;Xa=a[db+hb|0]|0;if(Xa<<24>>24==44){Sa=2;Ra=486;break a}do{if((a[Ka]|0)!=0&Xa<<24>>24==0){Wa=(c[Na>>2]|0)+((c[(c[Ma>>2]|0)+((c[La>>2]|0)-1<<2)>>2]|0)*28|0)|0;if((c[Wa>>2]|0)==3){Ib=1;Jb=hb;Kb=db;break}c[Wa>>2]=5;Ib=(c[Oa>>2]|0)==0|0;Jb=c[Ha>>2]|0;Kb=c[Ja>>2]|0}else{Ib=1;Jb=hb;Kb=db}}while(0);a[Kb+Jb|0]=124;Za=Ib;Ra=475;break};case 55:{if((Md(b,L,H,c[E>>2]|0)|0)==0){Sa=1;Ra=486;break a}else{ab=L}break};case 56:{if((Nd(b,L,H,c[E>>2]|0)|0)==0){Sa=1;Ra=486;break a}else{ab=L}break};case 0:{Za=(Ta|0)!=14|0;Ra=475;break};case 3:{Za=(c[W>>2]|0)==0|0;Ra=475;break};case 11:{if((a[fa]|0)==0){Ra=476;break c}Za=(c[la>>2]|0)==0|0;Ra=475;break};case 17:{Za=(c[Ga>>2]|0)==0|0;Ra=475;break};case 33:{if((a[fa]|0)==0){Ra=476;break c}Za=(c[oa>>2]|0)==0|0;Ra=475;break};case 39:{Za=(c[Oa>>2]|0)==0|0;Ra=475;break};case 2:{Ra=84;break a;break};case 24:{a[sa]=1;c[ra>>2]=28912;Ra=121;break};case 25:{c[ra>>2]=28904;Ra=121;break};case 26:{c[ra>>2]=28896;Ra=121;break};case 27:{c[ra>>2]=28920;Ra=121;break};case 35:case 36:{if((a[fa]|0)==0){Ra=476;break c}db=c[na>>2]|0;hb=c[pa>>2]|0;Xa=a[qa]|0;Wa=db+12|0;cb=c[Wa>>2]|0;e:do{if((a[sa]|0)==0){Ra=149}else{if((cb|0)>0){pb=c[db+20>>2]|0;bb=0;while(1){gb=bb+1|0;if((c[pb+(bb*12|0)>>2]|0)==(hb|0)){break e}if((gb|0)<(cb|0)){bb=gb}else{break}}}bb=db+8|0;if((c[bb>>2]|0)!=0){Ra=149;break}if((a[hb+9|0]|0)!=0){Ra=149;break}c[bb>>2]=hb;Ra=149}}while(0);if((Ra|0)==149){Ra=0;bb=db+16|0;do{if((cb|0)==(c[bb>>2]|0)){if((cb|0)==0){c[bb>>2]=8;pb=Ec[c[ta>>2]&63](96)|0;gb=pb;c[db+20>>2]=gb;if((pb|0)==0){Sa=1;Ra=486;break a}else{Lb=gb;break}}gb=db+20|0;pb=Oc[c[ua>>2]&255](c[gb>>2]|0,cb*24|0)|0;if((pb|0)==0){Sa=1;Ra=486;break a}nb=pb;c[bb>>2]=cb<<1;c[gb>>2]=nb;Lb=nb}else{Lb=c[db+20>>2]|0}}while(0);db=c[Wa>>2]|0;c[Lb+(db*12|0)>>2]=hb;c[Lb+(db*12|0)+8>>2]=0;a[Lb+(db*12|0)+4|0]=Xa;if(Xa<<24>>24==0){a[hb+8|0]=1}c[Wa>>2]=(c[Wa>>2]|0)+1}if((c[oa>>2]|0)==0){Ra=476;break c}db=c[ra>>2]|0;if((db|0)==0){Ra=476;break c}cb=a[db]|0;if((cb<<24>>24|0)==78){if((a[db+1|0]|0)==79){Ra=162}}else if((cb<<24>>24|0)==40){Ra=162}if((Ra|0)==162){Ra=0;cb=c[Z>>2]|0;if((cb|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}Mb=c[Z>>2]|0}else{Mb=cb}c[Z>>2]=Mb+1;a[Mb]=41;cb=c[Z>>2]|0;if((cb|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}Nb=c[Z>>2]|0}else{Nb=cb}c[Z>>2]=Nb+1;a[Nb]=0;c[ra>>2]=c[$>>2];c[$>>2]=c[Z>>2]}c[N>>2]=H;Ic[c[oa>>2]&15](c[U>>2]|0,c[c[na>>2]>>2]|0,c[c[pa>>2]>>2]|0,c[ra>>2]|0,0,(I|0)==36|0);cb=c[ca>>2]|0;db=c[da>>2]|0;do{if((cb|0)==0){c[ca>>2]=db}else{if((db|0)==0){break}else{Ob=db;Pb=cb}while(1){bb=Ob|0;nb=c[bb>>2]|0;c[bb>>2]=Pb;c[ca>>2]=Ob;if((nb|0)==0){break}else{Pb=Ob;Ob=nb}}}}while(0);c[da>>2]=0;c[$>>2]=0;c[Z>>2]=0;c[_>>2]=0;ab=L;break};case 40:{if((c[Oa>>2]|0)==0){Ra=476;break c}cb=c[E>>2]|0;db=c[F>>2]|0;Wa=db+80|0;c[k>>2]=H;hb=db+92|0;if((c[hb>>2]|0)==0){if((Bd(Wa)|0)<<24>>24==0){Ra=423;break a}}Xa=L+56|0;nb=db+88|0;while(1){Bc[c[Xa>>2]&63](L,k,cb,hb,c[nb>>2]|0);if((c[k>>2]|0)==(cb|0)){break}if((Bd(Wa)|0)<<24>>24==0){Ra=423;break a}}cb=db+96|0;if((c[cb>>2]|0)==0){Ra=423;break a}Xa=c[hb>>2]|0;if((Xa|0)==(c[nb>>2]|0)){if((Bd(Wa)|0)<<24>>24==0){Ra=423;break a}Qb=c[hb>>2]|0}else{Qb=Xa}c[hb>>2]=Qb+1;a[Qb]=0;Xa=c[cb>>2]|0;if((Xa|0)==0){Ra=423;break a}bb=Cd(b,db+20|0,Xa,24)|0;gb=bb;if((bb|0)==0){Ra=423;break a}if((c[bb>>2]|0)==(Xa|0)){c[cb>>2]=c[hb>>2];if((Pd(b,gb)|0)==0){Ra=423;break a}}else{c[hb>>2]=c[cb>>2]}c[na>>2]=gb;c[La>>2]=0;c[Pa>>2]=0;a[Ka]=1;ab=L;break};case 22:{gb=Qd(b,L,H,c[E>>2]|0)|0;c[pa>>2]=gb;if((gb|0)==0){Sa=1;Ra=486;break a}a[qa]=0;c[ra>>2]=0;a[sa]=0;Ra=121;break};case 53:{Rb=1;Ra=435;break};case 52:{Rb=2;Ra=435;break};case 54:{Rb=3;Ra=435;break};case 51:{Rb=0;Ra=435;break};case 47:{Sb=1;Ra=459;break};case 46:{Sb=2;Ra=459;break};case 48:{Sb=3;Ra=459;break};case 45:{Sb=0;Ra=459;break};case 7:{gb=c[W>>2]|0;if((gb|0)==0){Ra=476;break c}Bc[gb&63](c[U>>2]|0,c[aa>>2]|0,c[X>>2]|0,c[ba>>2]|0,1);c[aa>>2]=0;gb=c[ca>>2]|0;cb=c[da>>2]|0;do{if((gb|0)==0){c[ca>>2]=cb}else{if((cb|0)==0){break}else{Tb=cb;Ub=gb}while(1){Xa=Tb|0;bb=c[Xa>>2]|0;c[Xa>>2]=Ub;c[ca>>2]=Tb;if((bb|0)==0){break}else{Ub=Tb;Tb=bb}}}}while(0);c[da>>2]=0;c[$>>2]=0;c[Z>>2]=0;c[_>>2]=0;ab=L;break};case 13:{if((a[fa]|0)==0){Ra=476;break c}if((c[ga>>2]|0)==0){Ra=476;break c}gb=c[L+64>>2]|0;cb=(c[E>>2]|0)+(-gb|0)|0;c[v>>2]=H+gb;if((c[ia>>2]|0)==0){if((Bd(ha)|0)<<24>>24==0){Vb=0}else{Ra=271}}else{Ra=271}f:do{if((Ra|0)==271){Ra=0;gb=L+56|0;while(1){Bc[c[gb>>2]&63](L,v,cb,ia,c[ja>>2]|0);if((c[v>>2]|0)==(cb|0)){break}if((Bd(ha)|0)<<24>>24==0){Vb=0;break f}}if((c[ka>>2]|0)==0){Vb=0;break}gb=c[ia>>2]|0;if((gb|0)==(c[ja>>2]|0)){if((Bd(ha)|0)<<24>>24==0){Vb=0;break}Wb=c[ia>>2]|0}else{Wb=gb}c[ia>>2]=Wb+1;a[Wb]=0;Vb=c[ka>>2]|0}}while(0);c[(c[ga>>2]|0)+16>>2]=Vb;cb=c[ga>>2]|0;if((c[cb+16>>2]|0)==0){Sa=1;Ra=486;break a}c[cb+20>>2]=c[ya>>2];c[ka>>2]=c[ia>>2];Za=(c[la>>2]|0)==0|0;Ra=475;break};case 20:{do{if((c[Ea>>2]|0)==0){Xb=1}else{if((c[Ga>>2]|0)==0){Xb=1;break}c[N>>2]=H;Bc[c[Ga>>2]&63](c[U>>2]|0,c[Fa>>2]|0,c[ya>>2]|0,0,c[Ea>>2]|0);Xb=0}}while(0);cb=c[ca>>2]|0;gb=c[da>>2]|0;do{if((cb|0)==0){c[ca>>2]=gb}else{if((gb|0)==0){break}else{Yb=gb;Zb=cb}while(1){hb=Yb|0;db=c[hb>>2]|0;c[hb>>2]=Zb;c[ca>>2]=Yb;if((db|0)==0){break}else{Zb=Yb;Yb=db}}}}while(0);c[da>>2]=0;c[$>>2]=0;c[Z>>2]=0;c[_>>2]=0;Za=Xb;Ra=475;break};case 57:{if((a[za]|0)!=0){Ra=476;break c}cb=c[Aa>>2]|0;if((cb|0)==0){Ra=476;break c}if((Ec[cb&63](c[U>>2]|0)|0)==0){Sa=22;Ra=486;break a}else{Ra=476}break};case 31:case 32:{if((a[fa]|0)==0){Ra=476;break c}if((c[oa>>2]|0)==0){Ra=476;break c}if((c[ra>>2]|0)==0){_b=(I|0)==32?28840:28856}else{_b=28864}cb=a[_b]|0;if(cb<<24>>24!=0){gb=_b;db=cb;do{cb=c[Z>>2]|0;if((cb|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Ua=1;Ra=488;break a}$b=a[gb]|0;ac=c[Z>>2]|0}else{$b=db;ac=cb}c[Z>>2]=ac+1;a[ac]=$b;gb=gb+1|0;db=a[gb]|0;}while(db<<24>>24!=0)}if((c[$>>2]|0)==0){Sa=1;Ra=486;break a}db=c[E>>2]|0;c[A>>2]=H;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}}gb=L+56|0;while(1){Bc[c[gb>>2]&63](L,A,db,Z,c[_>>2]|0);if((c[A>>2]|0)==(db|0)){break}if((Bd(Y)|0)<<24>>24==0){Ua=1;Ra=488;break a}}db=c[$>>2]|0;if((db|0)==0){Sa=1;Ra=486;break a}c[ra>>2]=db;ab=L;break};case 41:case 42:{if((a[Ka]|0)==0){Ra=476;break c}if((c[Oa>>2]|0)==0){bc=1}else{db=Ec[c[ta>>2]&63](20)|0;if((db|0)==0){Sa=1;Ra=486;break a}vF(db+4|0,0,16)|0;c[db>>2]=(I|0)==41?2:1;c[N>>2]=H;Tc[c[Oa>>2]&127](c[U>>2]|0,c[c[na>>2]>>2]|0,db);bc=0}a[Ka]=0;Za=bc;Ra=475;break};case 43:{if((a[Ka]|0)==0){Ra=476;break c}c[(c[Na>>2]|0)+((c[(c[Ma>>2]|0)+((c[La>>2]|0)-1<<2)>>2]|0)*28|0)>>2]=3;Za=(c[Oa>>2]|0)==0|0;Ra=475;break};case 15:{if((a[fa]|0)==0){Ra=476;break c}if((c[ga>>2]|0)==0){Ra=476;break c}if((c[la>>2]|0)==0){Ra=476;break c}c[N>>2]=H;db=c[ga>>2]|0;Nc[c[la>>2]&1](c[U>>2]|0,c[db>>2]|0,d[db+33|0]|0,0,0,c[db+20>>2]|0,c[db+16>>2]|0,c[db+24>>2]|0,0);ab=L;break};case 16:{if((a[fa]|0)==0){Ra=476;break c}if((c[ga>>2]|0)==0){Ra=476;break c}db=c[E>>2]|0;c[u>>2]=H;if((c[ia>>2]|0)==0){if((Bd(ha)|0)<<24>>24==0){cc=0}else{Ra=289}}else{Ra=289}g:do{if((Ra|0)==289){Ra=0;gb=L+56|0;while(1){Bc[c[gb>>2]&63](L,u,db,ia,c[ja>>2]|0);if((c[u>>2]|0)==(db|0)){break}if((Bd(ha)|0)<<24>>24==0){cc=0;break g}}if((c[ka>>2]|0)==0){cc=0;break}gb=c[ia>>2]|0;if((gb|0)==(c[ja>>2]|0)){if((Bd(ha)|0)<<24>>24==0){cc=0;break}dc=c[ia>>2]|0}else{dc=gb}c[ia>>2]=dc+1;a[dc]=0;cc=c[ka>>2]|0}}while(0);c[(c[ga>>2]|0)+28>>2]=cc;if((c[(c[ga>>2]|0)+28>>2]|0)==0){Sa=1;Ra=486;break a}c[ka>>2]=c[ia>>2];if((c[Ba>>2]|0)!=0){c[N>>2]=H;db=c[ga>>2]|0;Ic[c[Ba>>2]&15](c[U>>2]|0,c[db>>2]|0,c[db+20>>2]|0,c[db+16>>2]|0,c[db+24>>2]|0,c[db+28>>2]|0);ab=L;break c}if((c[la>>2]|0)==0){Ra=476;break c}c[N>>2]=H;db=c[ga>>2]|0;Nc[c[la>>2]&1](c[U>>2]|0,c[db>>2]|0,0,0,0,c[db+20>>2]|0,c[db+16>>2]|0,c[db+24>>2]|0,c[db+28>>2]|0);ab=L;break};case 12:{if((a[fa]|0)==0){Ra=476;break c}db=L+64|0;gb=c[db>>2]|0;cb=H+gb|0;hb=(c[E>>2]|0)+(-gb|0)|0;gb=c[F>>2]|0;Wa=gb+104|0;if((c[Wa>>2]|0)==0){if((Bd(Wa)|0)<<24>>24==0){ec=1}else{Ra=215}}else{Ra=215}h:do{if((Ra|0)==215){Ra=0;nb=L+16|0;bb=gb+116|0;Xa=L+56|0;pb=gb+112|0;eb=gb+120|0;fc=L+40|0;gc=cb;i:while(1){j:do{switch(Sc[c[nb>>2]&127](L,gc,hb,y)|0){case 28:{Ra=217;break i;break};case 9:case 6:{hc=c[y>>2]|0;c[x>>2]=gc;if((c[bb>>2]|0)==0){if((Bd(Wa)|0)<<24>>24==0){ec=1;break h}}while(1){Bc[c[Xa>>2]&63](L,x,hc,bb,c[pb>>2]|0);if((c[x>>2]|0)==(hc|0)){break}if((Bd(Wa)|0)<<24>>24==0){ec=1;break h}}if((c[eb>>2]|0)==0){ec=1;break h}break};case-3:{c[y>>2]=gc+(c[db>>2]|0);Ra=224;break};case 7:{Ra=224;break};case 10:{hc=Oc[c[fc>>2]&255](L,gc)|0;if((hc|0)<0){Ra=229;break i}ic=Re(hc,va)|0;if((ic|0)==0){Ra=233;break i}if((ic|0)>0){jc=0}else{break j}do{hc=c[bb>>2]|0;if((c[pb>>2]|0)==(hc|0)){if((Bd(Wa)|0)<<24>>24==0){ec=1;break h}kc=c[bb>>2]|0}else{kc=hc}hc=a[z+jc|0]|0;c[bb>>2]=kc+1;a[kc]=hc;jc=jc+1|0;}while((jc|0)<(ic|0));break};case-1:{Ra=239;break i;break};case 0:{Ra=241;break i;break};case-4:{ec=0;break h;break};default:{Ra=243;break i}}}while(0);if((Ra|0)==224){Ra=0;ic=c[bb>>2]|0;if((c[pb>>2]|0)==(ic|0)){if((Bd(Wa)|0)<<24>>24==0){ec=1;break h}lc=c[bb>>2]|0}else{lc=ic}c[bb>>2]=lc+1;a[lc]=10}gc=c[y>>2]|0}if((Ra|0)==217){Ra=0;c[M>>2]=gc;ec=10;break}else if((Ra|0)==229){Ra=0;if((c[G>>2]|0)!=(L|0)){ec=14;break}c[M>>2]=gc;ec=14;break}else if((Ra|0)==233){Ra=0;if((c[G>>2]|0)!=(L|0)){ec=14;break}c[M>>2]=gc;ec=14;break}else if((Ra|0)==239){Ra=0;if((c[G>>2]|0)!=(L|0)){ec=4;break}c[M>>2]=gc;ec=4;break}else if((Ra|0)==241){Ra=0;if((c[G>>2]|0)!=(L|0)){ec=4;break}c[M>>2]=c[y>>2];ec=4;break}else if((Ra|0)==243){Ra=0;if((c[G>>2]|0)!=(L|0)){ec=23;break}c[M>>2]=gc;ec=23;break}}}while(0);Wa=c[ga>>2]|0;db=c[wa>>2]|0;do{if((Wa|0)==0){c[xa>>2]=db;mc=1}else{c[Wa+4>>2]=db;c[(c[ga>>2]|0)+8>>2]=(c[xa>>2]|0)-(c[wa>>2]|0);c[wa>>2]=c[xa>>2];if((c[la>>2]|0)==0){mc=1;break}c[N>>2]=H;hb=c[ga>>2]|0;Nc[c[la>>2]&1](c[U>>2]|0,c[hb>>2]|0,d[hb+33|0]|0,c[hb+4>>2]|0,c[hb+8>>2]|0,c[ya>>2]|0,0,0,0);mc=0}}while(0);if((ec|0)==0){Za=mc;Ra=475}else{Sa=ec;Ra=486;break a}break};default:{Ra=476}}}while(0);do{if((Ra|0)==53){Ra=0;if((Sc[c[L+52>>2]&127](L,H,c[E>>2]|0,M)|0)==0){Sa=32;Ra=486;break a}else{yb=1;Ra=54}}else if((Ra|0)==121){Ra=0;if((a[fa]|0)==0){Ra=476;break}Za=(c[oa>>2]|0)==0|0;Ra=475}else if((Ra|0)==435){Ra=0;if((a[Ka]|0)==0){Ra=476;break}I=c[E>>2]|0;if((Rb|0)==0){nc=I}else{nc=I+(-(c[L+64>>2]|0)|0)|0}I=Wd(b)|0;if((I|0)<0){Sa=1;Ra=486;break a}c[(c[Na>>2]|0)+(I*28|0)>>2]=4;c[(c[Na>>2]|0)+(I*28|0)+4>>2]=Rb;db=c[F>>2]|0;Wa=db+80|0;c[j>>2]=H;hb=db+92|0;if((c[hb>>2]|0)==0){if((Bd(Wa)|0)<<24>>24==0){Sa=1;Ra=486;break a}}cb=L+56|0;gb=db+88|0;while(1){Bc[c[cb>>2]&63](L,j,nc,hb,c[gb>>2]|0);if((c[j>>2]|0)==(nc|0)){break}if((Bd(Wa)|0)<<24>>24==0){Ua=1;Ra=488;break a}}cb=db+96|0;if((c[cb>>2]|0)==0){Sa=1;Ra=486;break a}bb=c[hb>>2]|0;if((bb|0)==(c[gb>>2]|0)){if((Bd(Wa)|0)<<24>>24==0){Sa=1;Ra=486;break a}oc=c[hb>>2]|0}else{oc=bb}c[hb>>2]=oc+1;a[oc]=0;bb=c[cb>>2]|0;if((bb|0)==0){Sa=1;Ra=486;break a}pb=Cd(b,db+20|0,bb,24)|0;if((pb|0)==0){Sa=1;Ra=486;break a}fc=pb|0;if((c[fc>>2]|0)==(bb|0)){c[cb>>2]=c[hb>>2];if((Pd(b,pb)|0)==0){Sa=1;Ra=486;break a}}else{c[hb>>2]=c[cb>>2]}cb=c[fc>>2]|0;c[(c[Na>>2]|0)+(I*28|0)+8>>2]=cb;fc=0;while(1){pc=fc+1|0;if((a[cb+fc|0]|0)==0){break}else{fc=pc}}c[Qa>>2]=(c[Qa>>2]|0)+pc;Za=(c[Oa>>2]|0)==0|0;Ra=475}else if((Ra|0)==459){Ra=0;if((a[Ka]|0)==0){Ra=476;break}fc=(c[Oa>>2]|0)==0;cb=fc&1;I=(c[La>>2]|0)-1|0;c[La>>2]=I;c[(c[Na>>2]|0)+((c[(c[Ma>>2]|0)+(I<<2)>>2]|0)*28|0)+4>>2]=Sb;if((c[La>>2]|0)!=0){Za=cb;Ra=475;break}if(!fc){fc=c[F>>2]|0;I=fc+156|0;hb=Ec[c[ta>>2]&63](((c[I>>2]|0)*20|0)+(c[fc+148>>2]|0)|0)|0;fc=hb;if((hb|0)==0){Sa=1;Ra=486;break a}c[p>>2]=fc+((c[I>>2]|0)*20|0);c[o>>2]=hb+20;Xd(b,0,fc,o,p);c[N>>2]=H;Tc[c[Oa>>2]&127](c[U>>2]|0,c[c[na>>2]>>2]|0,fc)}a[Ka]=0;c[Qa>>2]=0;Za=cb;Ra=475}}while(0);do{if((Ra|0)==54){Ra=0;if((a[fa]|0)==0){Za=yb;Ra=475;break}if((c[ga>>2]|0)==0){Za=yb;Ra=475;break}cb=c[L+64>>2]|0;fc=(c[E>>2]|0)+(-cb|0)|0;c[B>>2]=H+cb;if((c[ia>>2]|0)==0){if((Bd(ha)|0)<<24>>24==0){Sa=1;Ra=486;break a}}cb=L+56|0;while(1){Bc[c[cb>>2]&63](L,B,fc,ia,c[ja>>2]|0);if((c[B>>2]|0)==(fc|0)){break}if((Bd(ha)|0)<<24>>24==0){Ua=1;Ra=488;break a}}if((c[ka>>2]|0)==0){Sa=1;Ra=486;break a}fc=c[ia>>2]|0;if((fc|0)==(c[ja>>2]|0)){if((Bd(ha)|0)<<24>>24==0){Sa=1;Ra=486;break a}qc=c[ia>>2]|0}else{qc=fc}c[ia>>2]=qc+1;a[qc]=0;fc=c[ka>>2]|0;if((fc|0)==0){Sa=1;Ra=486;break a}cb=a[fc]|0;do{if(cb<<24>>24==0){rc=fc}else{hb=fc;I=fc;db=cb;while(1){Wa=db<<24>>24;do{if((Wa|0)==32|(Wa|0)==13|(Wa|0)==10){if((hb|0)==(fc|0)){sc=fc;break}if((a[hb-1|0]|0)==32){sc=hb;break}a[hb]=32;sc=hb+1|0}else{a[hb]=db;sc=hb+1|0}}while(0);Wa=I+1|0;gb=a[Wa]|0;if(gb<<24>>24==0){break}else{hb=sc;I=Wa;db=gb}}if((sc|0)==(fc|0)){rc=fc;break}db=sc-1|0;rc=(a[db]|0)==32?db:sc}}while(0);a[rc]=0;c[(c[ga>>2]|0)+24>>2]=fc;c[ka>>2]=c[ia>>2];Za=(c[la>>2]|0)==0?yb:0;Ra=475}}while(0);if((Ra|0)==475){Ra=0;if(Za<<24>>24==0){ab=L}else{Ra=476}}do{if((Ra|0)==476){Ra=0;cb=c[R>>2]|0;if((cb|0)==0){ab=L;break}db=c[E>>2]|0;c[m>>2]=H;if((a[L+68|0]|0)!=0){Tc[cb&127](c[U>>2]|0,H,db-H|0);ab=L;break}if((c[G>>2]|0)==(L|0)){tc=N;uc=M}else{cb=c[O>>2]|0;tc=cb+4|0;uc=cb|0}cb=L+56|0;while(1){c[n>>2]=c[S>>2];Bc[c[cb>>2]&63](L,m,db,n,c[T>>2]|0);c[tc>>2]=c[m>>2];I=c[S>>2]|0;Tc[c[R>>2]&127](c[U>>2]|0,I,(c[n>>2]|0)-I|0);c[uc>>2]=c[m>>2];if((c[m>>2]|0)==(db|0)){ab=L;break}}}}while(0);db=c[V>>2]|0;if((db|0)==3){Ra=484;break}else if((db|0)==2){Sa=35;Ra=486;break}db=c[E>>2]|0;L=ab;H=db;e=Sc[c[ab>>2]&127](ab,db,f,E)|0}if((Ra|0)==4){c[g>>2]=H;Ua=0;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==6){c[M>>2]=c[E>>2];Ua=4;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==21){c[aa>>2]=0;Ua=1;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==84){c[b+264>>2]=6;aa=Gd(b,0,c[G>>2]|0,H,f,g,(a[J]|0)==0|0)|0;if((aa|0)!=0){Ua=aa;vc=4;wc=0;i=h;return Ua|0}aa=c[b+348>>2]|0;if((aa|0)==0){Ua=0;vc=4;wc=0;i=h;return Ua|0}else{xc=aa}while(1){aa=(c[xc+24>>2]|0)+1|0;b=xc+36|0;J=c[b>>2]|0;f=J+aa|0;H=xc+4|0;G=c[H>>2]|0;if((G|0)==(f|0)){Ua=0;Ra=488;break}M=xc+8|0;ab=c[M>>2]|0;e=ab+aa|0;L=xc+40|0;if((e|0)>((c[L>>2]|0)-J|0)){V=Oc[c[ua>>2]&255](J,e)|0;if((V|0)==0){Ua=1;Ra=488;break}J=xc+12|0;m=c[b>>2]|0;if((c[J>>2]|0)==(m|0)){c[J>>2]=V}J=xc+16|0;uc=c[J>>2]|0;if((uc|0)!=0){c[J>>2]=V+(uc-m)}c[b>>2]=V;c[L>>2]=V+e;yc=V+aa|0;zc=c[H>>2]|0;Ac=c[M>>2]|0}else{yc=f;zc=G;Ac=ab}tF(yc|0,zc|0,Ac)|0;c[H>>2]=yc;H=c[xc>>2]|0;if((H|0)==0){Ua=0;Ra=488;break}else{xc=H}}if((Ra|0)==488){vc=4;wc=0;i=h;return Ua|0}}else if((Ra|0)==109){c[na>>2]=0;Ua=1;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==261){c[X>>2]=0;Ua=1;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==333){c[Fa>>2]=0;Ua=1;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==384){if((Ta|0)==12){Ua=17;vc=4;wc=0;i=h;return Ua|0}else if((Ta|0)==28){Ua=10;vc=4;wc=0;i=h;return Ua|0}else{Ua=2;vc=4;wc=0;i=h;return Ua|0}}else if((Ra|0)==423){c[na>>2]=0;Ua=1;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==484){c[g>>2]=c[E>>2];Ua=0;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==486){Ua=Sa;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==487){Ua=6;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==488){vc=4;wc=0;i=h;return Ua|0}return 0}function Wd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;b=c[a+340>>2]|0;d=b+164|0;do{if((c[d>>2]|0)==0){e=Ec[c[a+12>>2]&63](c[a+452>>2]<<2)|0;f=e;c[d>>2]=f;if((e|0)==0){g=-1;return g|0}else{c[f>>2]=0;break}}}while(0);f=b+156|0;e=c[f>>2]|0;h=b+152|0;i=c[h>>2]|0;j=b+144|0;k=c[j>>2]|0;if(e>>>0<i>>>0){l=e;m=k}else{do{if((k|0)==0){e=Ec[c[a+12>>2]&63](896)|0;if((e|0)==0){g=-1}else{n=e;o=32;break}return g|0}else{e=Oc[c[a+16>>2]&255](k,i*56|0)|0;if((e|0)==0){g=-1;return g|0}else{n=e;o=c[h>>2]<<1;break}}}while(0);i=n;c[h>>2]=o;c[j>>2]=i;l=c[f>>2]|0;m=i}c[f>>2]=l+1;f=c[b+160>>2]|0;if((f|0)!=0){b=c[(c[d>>2]|0)+(f-1<<2)>>2]|0;f=m+(b*28|0)+16|0;d=c[f>>2]|0;if((d|0)!=0){c[m+(d*28|0)+24>>2]=l}d=m+(b*28|0)+20|0;i=c[d>>2]|0;if((i|0)==0){c[m+(b*28|0)+12>>2]=l}c[f>>2]=l;c[d>>2]=i+1}vF(m+(l*28|0)+12|0,0,16)|0;g=l;return g|0}function Xd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;h=(c[b+340>>2]|0)+144|0;i=c[(c[h>>2]|0)+(d*28|0)>>2]|0;c[e>>2]=i;c[e+4>>2]=c[(c[h>>2]|0)+(d*28|0)+4>>2];if((i|0)==4){c[e+8>>2]=c[g>>2];i=c[(c[h>>2]|0)+(d*28|0)+8>>2]|0;while(1){j=a[i]|0;k=c[g>>2]|0;c[g>>2]=k+1;a[k]=j;if((a[i]|0)==0){break}else{i=i+1|0}}c[e+12>>2]=0;c[e+16>>2]=0;return}i=c[(c[h>>2]|0)+(d*28|0)+20>>2]|0;j=e+12|0;c[j>>2]=i;k=e+16|0;c[k>>2]=c[f>>2];c[f>>2]=(c[f>>2]|0)+(i*20|0);if((c[j>>2]|0)!=0){i=0;l=(c[h>>2]|0)+(d*28|0)+12|0;while(1){d=c[l>>2]|0;Xd(b,d,(c[k>>2]|0)+(i*20|0)|0,f,g);m=i+1|0;if(m>>>0<(c[j>>2]|0)>>>0){i=m;l=(c[h>>2]|0)+(d*28|0)+24|0}else{break}}}c[e+8>>2]=0;return}function Yd(a){a=a|0;c[a>>2]=60;return}function Zd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do{switch(b|0){case 29:{c[a>>2]=90;g=2;break};case 11:{c[a>>2]=62;g=55;break};case 13:{c[a>>2]=62;g=56;break};case 15:{c[a>>2]=62;g=0;break};case 16:{if((Sc[c[f+24>>2]&127](f,d+(c[f+64>>2]<<1)|0,e,173064)|0)==0){h=9;break a}c[a>>2]=16;g=3;break};case 14:{g=0;break};case 12:{c[a>>2]=62;g=1;break};default:{h=9}}}while(0);if((h|0)==9){c[a>>2]=90;g=-1}return g|0}function _d(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do{switch(b|0){case 29:{c[a>>2]=90;g=2;break};case 13:{g=56;break};case 16:{if((Sc[c[f+24>>2]&127](f,d+(c[f+64>>2]<<1)|0,e,173064)|0)==0){h=7;break a}c[a>>2]=16;g=3;break};case 15:case 14:{g=0;break};case 11:{g=55;break};default:{h=7}}}while(0);if((h|0)==7){c[a>>2]=90;g=-1}return g|0}function $d(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18|(b|0)==41){c[a>>2]=96;g=4}else if((b|0)==15){g=3}else{c[a>>2]=90;g=-1}return g|0}function ae(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0}function be(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;do{if((b|0)==15){g=3;return g|0}else if((b|0)==17){c[a>>2]=2;g=8;return g|0}else if((b|0)==25){c[a>>2]=88;g=7;return g|0}else if((b|0)==18){h=f+24|0;if((Sc[c[h>>2]&127](f,d,e,172880)|0)!=0){c[a>>2]=100;g=3;return g|0}if((Sc[c[h>>2]&127](f,d,e,172904)|0)==0){break}c[a>>2]=98;g=3;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function ce(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;a:do{switch(b|0){case 11:{g=55;return g|0};case 26:{c[a>>2]=94;g=3;return g|0};case 13:{g=56;return g|0};case 15:case-4:{g=0;return g|0};case 28:{g=57;return g|0};case 16:{h=f+24|0;i=f+64|0;if((Sc[c[h>>2]&127](f,d+(c[i>>2]<<1)|0,e,173024)|0)!=0){c[a>>2]=32;g=11;return g|0}if((Sc[c[h>>2]&127](f,d+(c[i>>2]<<1)|0,e,173080)|0)!=0){c[a>>2]=78;g=33;return g|0}if((Sc[c[h>>2]&127](f,d+(c[i>>2]<<1)|0,e,173056)|0)!=0){c[a>>2]=20;g=39;return g|0}if((Sc[c[h>>2]&127](f,d+(c[i>>2]<<1)|0,e,172920)|0)==0){break a}c[a>>2]=8;g=17;return g|0};default:{}}}while(0);c[a>>2]=90;g=-1;return g|0}function de(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==11){g=55}else if((b|0)==15){g=0}else if((b|0)==29){c[a>>2]=90;g=2}else if((b|0)==13){g=56}else{c[a>>2]=90;g=-1}return g|0}function ee(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==27){c[a>>2]=84;g=5}else if((b|0)==15){g=3}else{c[a>>2]=90;g=-1}return g|0}function fe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=3}else if((b|0)==27){c[a>>2]=100;g=6}else{c[a>>2]=90;g=-1}return g|0}function ge(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==17){c[a>>2]=2;g=8}else if((b|0)==15){g=3}else if((b|0)==25){c[a>>2]=88;g=7}else{c[a>>2]=90;g=-1}return g|0}function he(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=11}else if((b|0)==22){c[a>>2]=34;g=11}else if((b|0)==18){c[a>>2]=28;g=9}else{c[a>>2]=90;g=-1}return g|0}function ie(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18|(b|0)==41){c[a>>2]=76;g=34}else if((b|0)==15){g=33}else{c[a>>2]=90;g=-1}return g|0}function je(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=39}else if((b|0)==18|(b|0)==41){c[a>>2]=54;g=40}else{c[a>>2]=90;g=-1}return g|0}function ke(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18){c[a>>2]=6;g=18}else if((b|0)==15){g=17}else{c[a>>2]=90;g=-1}return g|0}function le(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=3}else if((b|0)==17){c[a>>2]=2;g=8}else{c[a>>2]=90;g=-1}return g|0}function me(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;if((b|0)==18){g=2}else if((b|0)==15){h=17;return h|0}do{if((g|0)==2){b=f+24|0;if((Sc[c[b>>2]&127](f,d,e,172880)|0)!=0){c[a>>2]=10;h=17;return h|0}if((Sc[c[b>>2]&127](f,d,e,172904)|0)==0){break}c[a>>2]=12;h=17;return h|0}}while(0);c[a>>2]=90;h=-1;return h|0}function ne(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==27){c[a>>2]=44;c[a+8>>2]=17;g=19}else if((b|0)==15){g=17}else{c[a>>2]=90;g=-1}return g|0}function oe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==27){c[a>>2]=14;g=21}else if((b|0)==15){g=17}else{c[a>>2]=90;g=-1}return g|0}function pe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==27){c[a>>2]=44;c[a+8>>2]=17;g=19}else if((b|0)==17){c[a>>2]=88;g=20}else if((b|0)==15){g=17}else{c[a>>2]=90;g=-1}return g|0}function qe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==17){c[a>>2]=88;g=c[a+8>>2]|0;return g|0}else if((b|0)==15){g=c[a+8>>2]|0;return g|0}else{c[a>>2]=90;g=-1;return g|0}return 0}function re(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;do{if((b|0)==23){c[a>>2]=52;c[a+4>>2]=1;g=44;return g|0}else if((b|0)==15){g=39;return g|0}else if((b|0)==18){h=f+24|0;if((Sc[c[h>>2]&127](f,d,e,173048)|0)!=0){c[a>>2]=44;c[a+8>>2]=39;g=42;return g|0}if((Sc[c[h>>2]&127](f,d,e,173088)|0)==0){break}c[a>>2]=44;c[a+8>>2]=39;g=41;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function se(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do{switch(b|0){case 15:{g=39;break};case 30:{c[a>>2]=46;g=53;break};case 20:{if((Sc[c[f+24>>2]&127](f,d+(c[f+64>>2]|0)|0,e,172912)|0)==0){h=9;break a}c[a>>2]=58;g=43;break};case 23:{c[a+4>>2]=2;c[a>>2]=56;g=44;break};case 31:{c[a>>2]=46;g=52;break};case 18:case 41:{c[a>>2]=46;g=51;break};case 32:{c[a>>2]=46;g=54;break};default:{h=9}}}while(0);if((h|0)==9){c[a>>2]=90;g=-1}return g|0}function te(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==36){c[a>>2]=44;c[a+8>>2]=39;g=46}else if((b|0)==15){g=39}else if((b|0)==24){c[a>>2]=44;c[a+8>>2]=39;g=45}else if((b|0)==21){c[a>>2]=48;g=39}else{c[a>>2]=90;g=-1}return g|0}function ue(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;switch(b|0){case 31:{c[a>>2]=46;g=52;break};case 18:case 41:{c[a>>2]=46;g=51;break};case 32:{c[a>>2]=46;g=54;break};case 23:{b=a+4|0;c[b>>2]=(c[b>>2]|0)+1;g=44;break};case 30:{c[a>>2]=46;g=53;break};case 15:{g=39;break};default:{c[a>>2]=90;g=-1}}return g|0}function ve(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;a:do{switch(b|0){case 36:{f=a+4|0;e=(c[f>>2]|0)-1|0;c[f>>2]=e;if((e|0)!=0){g=46;break a}c[a>>2]=44;c[a+8>>2]=39;g=46;break};case 35:{e=a+4|0;f=(c[e>>2]|0)-1|0;c[e>>2]=f;if((f|0)!=0){g=47;break a}c[a>>2]=44;c[a+8>>2]=39;g=47;break};case 37:{f=a+4|0;e=(c[f>>2]|0)-1|0;c[f>>2]=e;if((e|0)!=0){g=48;break a}c[a>>2]=44;c[a+8>>2]=39;g=48;break};case 21:{c[a>>2]=56;g=49;break};case 15:{g=39;break};case 38:{c[a>>2]=56;g=50;break};case 24:{e=a+4|0;f=(c[e>>2]|0)-1|0;c[e>>2]=f;if((f|0)!=0){g=45;break a}c[a>>2]=44;c[a+8>>2]=39;g=45;break};default:{c[a>>2]=90;g=-1}}}while(0);return g|0}function we(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18|(b|0)==41){c[a>>2]=50;g=51}else if((b|0)==15){g=39}else{c[a>>2]=90;g=-1}return g|0}function xe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=39}else if((b|0)==36){c[a>>2]=44;c[a+8>>2]=39;g=46}else if((b|0)==21){c[a>>2]=48;g=39}else{c[a>>2]=90;g=-1}return g|0}function ye(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18|(b|0)==41){c[a>>2]=82;g=22}else if((b|0)==15){g=33}else if((b|0)==17){c[a>>2]=88;g=33}else{c[a>>2]=90;g=-1}return g|0}function ze(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;do{if((b|0)==15){g=33;return g|0}else if((b|0)==18){h=f+24|0;i=0;j=c[h>>2]|0;while(1){k=i+1|0;if((Sc[j&127](f,d,e,c[71960+(i<<2)>>2]|0)|0)!=0){l=5;break}m=c[h>>2]|0;if((k|0)<8){i=k;j=m}else{break}}if((l|0)==5){c[a>>2]=66;g=i+23|0;return g|0}if((Sc[m&127](f,d,e,172920)|0)==0){break}c[a>>2]=68;g=33;return g|0}else if((b|0)==23){c[a>>2]=80;g=33;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function Ae(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;do{if((b|0)==15){g=33;return g|0}else if((b|0)==20){h=f+24|0;i=f+64|0;if((Sc[c[h>>2]&127](f,d+(c[i>>2]|0)|0,e,172984)|0)!=0){c[a>>2]=76;g=35;return g|0}if((Sc[c[h>>2]&127](f,d+(c[i>>2]|0)|0,e,172888)|0)!=0){c[a>>2]=76;g=36;return g|0}if((Sc[c[h>>2]&127](f,d+(c[i>>2]|0)|0,e,173016)|0)==0){break}c[a>>2]=64;g=33;return g|0}else if((b|0)==27){c[a>>2]=76;g=37;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function Be(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==23){c[a>>2]=74;g=33}else if((b|0)==15){g=33}else{c[a>>2]=90;g=-1}return g|0}function Ce(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=33}else if((b|0)==19|(b|0)==18|(b|0)==41){c[a>>2]=70;g=31}else{c[a>>2]=90;g=-1}return g|0}function De(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==24){c[a>>2]=66;g=33}else if((b|0)==21){c[a>>2]=80;g=33}else if((b|0)==15){g=33}else{c[a>>2]=90;g=-1}return g|0}function Ee(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18){c[a>>2]=72;g=32}else if((b|0)==15){g=33}else{c[a>>2]=90;g=-1}return g|0}function Fe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==24){c[a>>2]=66;g=33}else if((b|0)==15){g=33}else if((b|0)==21){c[a>>2]=74;g=33}else{c[a>>2]=90;g=-1}return g|0}function Ge(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=33}else if((b|0)==27){c[a>>2]=76;g=38}else{c[a>>2]=90;g=-1}return g|0}function He(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=11}else if((b|0)==18){c[a>>2]=18;g=10}else{c[a>>2]=90;g=-1}return g|0}function Ie(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;do{if((b|0)==15){g=11;return g|0}else if((b|0)==18){h=f+24|0;if((Sc[c[h>>2]&127](f,d,e,172880)|0)!=0){c[a>>2]=38;g=11;return g|0}if((Sc[c[h>>2]&127](f,d,e,172904)|0)==0){break}c[a>>2]=30;g=11;return g|0}else if((b|0)==27){c[a>>2]=44;c[a+8>>2]=11;g=12;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function Je(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=11}else if((b|0)==27){c[a>>2]=40;g=13}else{c[a>>2]=90;g=-1}return g|0}function Ke(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==27){c[a>>2]=38;g=14}else if((b|0)==15){g=11}else{c[a>>2]=90;g=-1}return g|0}function Le(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;do{if((b|0)==17){c[a>>2]=88;g=15;return g|0}else if((b|0)==18){if((Sc[c[f+24>>2]&127](f,d,e,172960)|0)==0){break}c[a>>2]=36;g=11;return g|0}else if((b|0)==15){g=11;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function Me(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18){c[a>>2]=44;c[a+8>>2]=11;g=16}else if((b|0)==15){g=11}else{c[a>>2]=90;g=-1}return g|0}function Ne(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;do{if((b|0)==27){c[a>>2]=44;c[a+8>>2]=11;g=12;return g|0}else if((b|0)==15){g=11;return g|0}else if((b|0)==18){h=f+24|0;if((Sc[c[h>>2]&127](f,d,e,172880)|0)!=0){c[a>>2]=26;g=11;return g|0}if((Sc[c[h>>2]&127](f,d,e,172904)|0)==0){break}c[a>>2]=24;g=11;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function Oe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==27){c[a>>2]=42;g=13}else if((b|0)==15){g=11}else{c[a>>2]=90;g=-1}return g|0}function Pe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=11}else if((b|0)==27){c[a>>2]=26;g=14}else{c[a>>2]=90;g=-1}return g|0}function Qe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==17){c[a>>2]=88;g=15}else if((b|0)==15){g=11}else{c[a>>2]=90;g=-1}return g|0}function Re(b,c){b=b|0;c=c|0;var d=0;if((b|0)<0){d=0;return d|0}if((b|0)<128){a[c]=b;d=1;return d|0}if((b|0)<2048){a[c]=b>>>6|192;a[c+1|0]=b&63|128;d=2;return d|0}if((b|0)<65536){a[c]=b>>>12|224;a[c+1|0]=b>>>6&63|128;a[c+2|0]=b&63|128;d=3;return d|0}if((b|0)>=1114112){d=0;return d|0}a[c]=b>>>18|240;a[c+1|0]=b>>>12&63|128;a[c+2|0]=b>>>6&63|128;a[c+3|0]=b&63|128;d=4;return d|0}function Se(){return 1908}function Te(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;i=0;while(1){a[e+i|0]=a[20424+i|0]|0;j=i+1|0;if((j|0)<364){i=j}else{k=0;break}}do{i=a[20496+k|0]|0;if(!((i<<24>>24|0)==28|(i<<24>>24|0)==0)){if((c[f+(k<<2)>>2]|0)!=(k|0)){l=0;m=37;break}}k=k+1|0;}while((k|0)<128);if((m|0)==37){return l|0}k=e+372|0;i=e+884|0;j=0;a:while(1){n=c[f+(j<<2)>>2]|0;do{if((n|0)==-1){a[e+(j+72)|0]=1;b[k+(j<<1)>>1]=-1;a[i+(j<<2)|0]=1;a[i+(j<<2)+1|0]=0}else{if((n|0)<0){if((n|0)<-4){l=0;m=37;break a}a[e+(j+72)|0]=3-n;a[i+(j<<2)|0]=0;b[k+(j<<1)>>1]=0;break}if((n|0)<128){o=a[20496+n|0]|0;if(!((o<<24>>24|0)==28|(o<<24>>24|0)==0)){if((n|0)!=(j|0)){l=0;m=37;break a}}a[e+(j+72)|0]=o;a[i+(j<<2)|0]=1;a[i+(j<<2)+1|0]=n;b[k+(j<<1)>>1]=(n|0)==0?-1:n&65535;break}o=n>>8;switch(o|0){case 0:{if((a[20496+n|0]|0)==0){m=19}break};case 255:{if((n&-2|0)==65534){m=19}break};case 216:case 217:case 218:case 219:case 220:case 221:case 222:case 223:{m=19;break};default:{}}if((m|0)==19){m=0;a[e+(j+72)|0]=0;b[k+(j<<1)>>1]=-1;a[i+(j<<2)|0]=1;a[i+(j<<2)+1|0]=0;break}if((n|0)>65535){l=0;m=37;break a}p=n>>>5&7;q=1<<(n&31);do{if((c[18232+((d[17968+o|0]<<3|p)<<2)>>2]&q|0)==0){r=e+(j+72)|0;if((c[18232+((d[19512+o|0]<<3|p)<<2)>>2]&q|0)==0){a[r]=28;break}else{a[r]=26;break}}else{a[e+(j+72)|0]=22}}while(0);q=i+(j<<2)|0;p=i+(j<<2)+1|0;do{if((n|0)<2048){a[p]=n>>>6|192;a[i+(j<<2)+2|0]=n&63|128;s=2}else{if((n|0)<65536){a[p]=n>>>12|224;a[i+(j<<2)+2|0]=n>>>6&63|128;a[i+(j<<2)+3|0]=n&63|128;s=3;break}if((n|0)>=1114112){s=0;break}a[p]=n>>>18|240;a[i+(j<<2)+2|0]=n>>>12&63|128;a[i+(j<<2)+3|0]=n>>>6&63|128;a[i+(j<<2)+4|0]=n&63|128;s=4}}while(0);a[q]=s;b[k+(j<<1)>>1]=n}}while(0);n=j+1|0;if((n|0)<256){j=n}else{m=34;break}}if((m|0)==34){c[e+368>>2]=h;c[e+364>>2]=g;if((g|0)!=0){c[e+328>>2]=20;c[e+332>>2]=20;c[e+336>>2]=20;c[e+340>>2]=170;c[e+344>>2]=170;c[e+348>>2]=170;c[e+352>>2]=176;c[e+356>>2]=176;c[e+360>>2]=176}c[e+56>>2]=16;c[e+60>>2]=18;l=e;return l|0}else if((m|0)==37){return l|0}return 0}function Ue(a,b){a=a|0;b=b|0;var e=0,f=0;e=Oc[c[a+364>>2]&255](c[a+368>>2]|0,b)|0;if(e>>>0>65535>>>0){f=0;return f|0}f=c[18232+(((d[19512+(e>>8)|0]|0)<<3|e>>>5&7)<<2)>>2]&1<<(e&31);return f|0}function Ve(a,b){a=a|0;b=b|0;var e=0,f=0;e=Oc[c[a+364>>2]&255](c[a+368>>2]|0,b)|0;if(e>>>0>65535>>>0){f=0;return f|0}f=c[18232+(((d[17968+(e>>8)|0]|0)<<3|e>>>5&7)<<2)>>2]&1<<(e&31);return f|0}function We(b,d){b=b|0;d=d|0;var e=0,f=0;e=Oc[c[b+364>>2]&255](c[b+368>>2]|0,d)|0;if(e>>>0>65535>>>0){f=1;return f|0}a:do{switch(e>>8|0){case 255:{if((e&-2|0)==65534){f=1}else{break a}return f|0};case 216:case 217:case 218:case 219:case 220:case 221:case 222:case 223:{f=1;return f|0};case 0:{if((a[20496+e|0]|0)==0){f=1}else{break a}return f|0};default:{}}}while(0);f=e>>>31;return f|0}function Xe(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;j=i;i=i+8|0;k=j|0;l=c[e>>2]|0;if((l|0)==(f|0)){i=j;return}m=b+884|0;n=b+364|0;o=b+368|0;p=k|0;q=h;h=b+72|0;b=k+1|0;r=k+2|0;s=k+3|0;k=l;while(1){l=d[k]|0;t=m+(l<<2)+1|0;u=a[m+(l<<2)|0]|0;l=u<<24>>24;if(u<<24>>24==0){u=Oc[c[n>>2]&255](c[o>>2]|0,k)|0;do{if((u|0)<0){v=0}else{if((u|0)<128){a[p]=u;v=1;break}if((u|0)<2048){a[p]=u>>>6|192;a[b]=u&63|128;v=2;break}if((u|0)<65536){a[p]=u>>>12|224;a[b]=u>>>6&63|128;a[r]=u&63|128;v=3;break}if((u|0)>=1114112){v=0;break}a[p]=u>>>18|240;a[b]=u>>>12&63|128;a[r]=u>>>6&63|128;a[s]=u&63|128;v=4}}while(0);if((v|0)>(q-(c[g>>2]|0)|0)){w=20;break}u=c[e>>2]|0;x=p;y=v;z=u+((d[h+(d[u]|0)|0]|0)-3)|0}else{if((l|0)>(q-(c[g>>2]|0)|0)){w=20;break}x=t;y=l;z=k+1|0}c[e>>2]=z;u=x;A=y;while(1){B=a[u]|0;C=c[g>>2]|0;c[g>>2]=C+1;a[C]=B;B=A-1|0;if((B|0)==0){break}else{u=u+1|0;A=B}}A=c[e>>2]|0;if((A|0)==(f|0)){w=20;break}else{k=A}}if((w|0)==20){i=j;return}}function Ye(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;i=c[e>>2]|0;if((i|0)==(f|0)){return}j=a+372|0;k=a+364|0;l=a+368|0;m=a+72|0;a=i;while(1){if((c[g>>2]|0)==(h|0)){n=8;break}i=b[j+((d[a]|0)<<1)>>1]|0;if(i<<16>>16==0){o=(Oc[c[k>>2]&255](c[l>>2]|0,a)|0)&65535;p=c[e>>2]|0;q=o;r=p+((d[m+(d[p]|0)|0]|0)-3)|0}else{q=i;r=a+1|0}c[e>>2]=r;i=c[g>>2]|0;c[g>>2]=i+2;b[i>>1]=q;i=c[e>>2]|0;if((i|0)==(f|0)){n=8;break}else{a=i}}if((n|0)==8){return}}function Ze(){return 21056}function _e(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;do{if((e|0)==0){f=6}else{g=0;a:while(1){h=c[25544+(g<<2)>>2]|0;i=e;while(1){j=a[i]|0;k=a[h]|0;l=(j-97&255)>>>0<26>>>0?j-32&255:j;if(l<<24>>24!=((k-97&255)>>>0<26>>>0?k-32&255:k)<<24>>24){break}if(l<<24>>24==0){break a}else{h=h+1|0;i=i+1|0}}i=g+1|0;if((i|0)<6){g=i}else{m=0;n=8;break}}if((n|0)==8){return m|0}if((g|0)==-1){m=0}else{f=g&255;break}return m|0}}while(0);a[b+69|0]=f;c[b>>2]=46;c[b+4>>2]=64;c[b+48>>2]=14;c[b+72>>2]=d;c[d>>2]=b;m=1;return m|0}function $e(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return wg(a,0,b,c,d)|0}function af(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return wg(a,1,b,c,d)|0}function bf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;if(e>>>0>=f>>>0){return}b=g+4|0;h=g|0;g=e;while(1){switch(d[672+(d[g]|0)|0]|0){case 7:{i=g+4|0;break};case 10:{c[b>>2]=-1;c[h>>2]=(c[h>>2]|0)+1;i=g+1|0;break};case 6:{i=g+3|0;break};case 9:{c[h>>2]=(c[h>>2]|0)+1;e=g+1|0;if((e|0)==(f|0)){j=f}else{j=(a[672+(d[e]|0)|0]|0)==10?g+2|0:e}c[b>>2]=-1;i=j;break};case 5:{i=g+2|0;break};default:{i=g+1|0}}c[b>>2]=(c[b>>2]|0)+1;if(i>>>0<f>>>0){g=i}else{break}}return}function cf(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;n=i;i=i+216|0;o=n|0;p=n+8|0;q=n+16|0;r=n+24|0;s=n+152|0;t=n+160|0;u=n+168|0;v=n+176|0;w=n+184|0;x=n+192|0;y=n+200|0;z=n+208|0;c[x>>2]=0;c[y>>2]=0;c[z>>2]=0;A=d+64|0;B=c[A>>2]|0;C=e+(B*5|0)|0;c[w>>2]=C;e=f+(-(B<<1)|0)|0;B=(vg(d,C,e,y,z,x,w)|0)!=0;C=c[y>>2]|0;a:do{if(B&(C|0)!=0){f=d+24|0;D=c[z>>2]|0;do{if((Sc[c[f>>2]&127](d,C,D,172768)|0)==0){if((b|0)!=0){E=C;F=D;break}c[g>>2]=C;G=0;break a}else{if((h|0)!=0){c[h>>2]=c[x>>2]}H=c[w>>2]|0;if((j|0)!=0){c[j>>2]=H}if((vg(d,H,e,y,z,x,w)|0)==0){c[g>>2]=c[w>>2];G=0;break a}H=c[y>>2]|0;if((H|0)!=0){E=H;F=c[z>>2]|0;break}if((b|0)==0){G=1;break a}c[g>>2]=c[w>>2];G=0;break a}}while(0);if((Sc[c[f>>2]&127](d,E,F,172800)|0)==0){I=E;J=F}else{D=c[x>>2]|0;H=u|0;c[t>>2]=D;c[v>>2]=H;K=d+56|0;Bc[c[K>>2]&63](d,t,e,v,u+1|0);if((c[v>>2]|0)==(H|0)){L=-1}else{L=a[H]|0}if(!((L-97|0)>>>0<26>>>0|(L-65|0)>>>0<26>>>0)){c[g>>2]=D;G=0;break}if((k|0)!=0){c[k>>2]=D}H=c[w>>2]|0;if((l|0)!=0){M=H+(-(c[A>>2]|0)|0)|0;N=r|0;c[q>>2]=D;c[s>>2]=N;Bc[c[K>>2]&63](d,q,M,s,r+127|0);b:do{if((c[q>>2]|0)==(M|0)){a[c[s>>2]|0]=0;K=172856;D=N;while(1){O=a[D]|0;P=a[K]|0;Q=(O-97&255)>>>0<26>>>0?O-32&255:O;if(Q<<24>>24!=((P-97&255)>>>0<26>>>0?P-32&255:P)<<24>>24){R=0;break}if(Q<<24>>24==0){S=28;break}else{K=K+1|0;D=D+1|0}}if((S|0)==28){if((c[A>>2]|0)==2){T=d;break}else{R=0}}c:while(1){D=c[25544+(R<<2)>>2]|0;K=N;while(1){Q=a[K]|0;P=a[D]|0;O=(Q-97&255)>>>0<26>>>0?Q-32&255:Q;if(O<<24>>24!=((P-97&255)>>>0<26>>>0?P-32&255:P)<<24>>24){break}if(O<<24>>24==0){break c}else{D=D+1|0;K=K+1|0}}K=R+1|0;if((K|0)<6){R=K}else{T=0;break b}}if((R|0)==-1){T=0;break}T=c[28632+(R<<2)>>2]|0}else{T=0}}while(0);c[l>>2]=T}if((vg(d,H,e,y,z,x,w)|0)==0){c[g>>2]=c[w>>2];G=0;break}N=c[y>>2]|0;if((N|0)==0){G=1;break}I=N;J=c[z>>2]|0}if(!((Sc[c[f>>2]&127](d,I,J,172776)|0)!=0&(b|0)==0)){c[g>>2]=I;G=0;break}N=c[x>>2]|0;M=c[w>>2]|0;do{if((Sc[c[f>>2]&127](d,N,M+(-(c[A>>2]|0)|0)|0,172760)|0)==0){if((Sc[c[f>>2]&127](d,N,M+(-(c[A>>2]|0)|0)|0,172792)|0)==0){c[g>>2]=N;G=0;break a}if((m|0)==0){break}c[m>>2]=0}else{if((m|0)==0){break}c[m>>2]=1}}while(0);N=u|0;c[o>>2]=M;c[p>>2]=N;f=d+56|0;H=u+1|0;Bc[c[f>>2]&63](d,o,e,p,H);d:do{if((c[p>>2]|0)==(N|0)){U=M}else{K=M;while(1){D=a[N]|0;if(!((D|0)==32|(D|0)==13|(D|0)==10|(D|0)==9)){U=K;break d}D=K+(c[A>>2]|0)|0;c[w>>2]=D;c[o>>2]=D;c[p>>2]=N;Bc[c[f>>2]&63](d,o,e,p,H);if((c[p>>2]|0)==(N|0)){U=D;break}else{K=D}}}}while(0);if((U|0)==(e|0)){G=1;break}c[g>>2]=U;G=0}else{c[g>>2]=c[w>>2];G=0}}while(0);i=n;return G|0}function df(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;if((e|0)==(f|0)){h=-4;return h|0}i=e;j=f-i|0;do{if((j&1|0)==0){k=f}else{l=j&-2;if((l|0)==0){h=-1;return h|0}else{k=e+l|0;break}}}while(0);j=a[e+1|0]|0;f=a[e]|0;a:do{if(j<<24>>24==0){l=f&255;m=b+72|0;b:do{switch(d[m+l|0]|0){case 20:{c[g>>2]=e+2;h=25;return h|0};case 4:{n=e+2|0;if((n|0)==(k|0)){h=-26;return h|0}do{if((a[e+3|0]|0)==0){if((a[n]|0)!=93){break}o=e+4|0;if((o|0)==(k|0)){h=-1;return h|0}if((a[e+5|0]|0)!=0){break}if((a[o]|0)!=62){break}c[g>>2]=e+6;h=34;return h|0}}while(0);c[g>>2]=n;h=26;return h|0};case 35:{c[g>>2]=e+2;h=38;return h|0};case 2:{o=e+2|0;if((o|0)==(k|0)){h=-1;return h|0}p=a[e+3|0]|0;q=a[o]|0;c:do{if(p<<24>>24==0){switch(d[m+(q&255)|0]|0){case 15:{h=xf(b,e+4|0,k,g)|0;return h|0};case 22:case 24:case 29:case 5:case 6:case 7:{r=73;break c;break};case 16:{break};default:{r=74;break c}}s=e+4|0;if((s|0)==(k|0)){h=-1;return h|0}do{if((a[e+5|0]|0)==0){t=d[m+(d[s]|0)|0]|0;if((t|0)==22|(t|0)==24){u=e+6|0;if((u|0)==(k|0)){h=-1;return h|0}else{v=s;w=u}d:while(1){if((a[v+3|0]|0)!=0){r=71;break}switch(d[m+(d[w]|0)|0]|0){case 21:case 9:case 10:{break d;break};case 30:{r=66;break d;break};case 22:case 24:{break};default:{r=71;break d}}u=w+2|0;if((u|0)==(k|0)){h=-1;r=175;break}else{v=w;w=u}}do{if((r|0)==66){u=v+4|0;if((u|0)==(k|0)){h=-1;return h|0}if((a[v+5|0]|0)!=0){break}x=d[m+(d[u]|0)|0]|0;if(!((x|0)==21|(x|0)==9|(x|0)==10|(x|0)==30)){break}c[g>>2]=w;h=0;return h|0}else if((r|0)==71){c[g>>2]=w;h=0;return h|0}else if((r|0)==175){return h|0}}while(0);c[g>>2]=w;h=16;return h|0}else if((t|0)==27){h=wf(b,e+6|0,k,g)|0;return h|0}else if((t|0)==20){c[g>>2]=e+6;h=33;return h|0}else{break}}}while(0);c[g>>2]=s;h=0;return h|0}else{switch(p&255|0){case 255:{break};case 223:case 222:case 221:case 220:{r=74;break c;break};default:{r=73;break c}}if(((q&255)-254|0)>>>0<2>>>0){r=74}else{r=73}}}while(0);if((r|0)==73){c[g>>2]=e;h=29;return h|0}else if((r|0)==74){c[g>>2]=o;h=0;return h|0}break};case 31:{c[g>>2]=e+2;h=23;return h|0};case 32:{q=e+2|0;if((q|0)==(k|0)){h=-24;return h|0}e:do{if((a[e+3|0]|0)==0){switch(d[m+(d[q]|0)|0]|0){case 15:{c[g>>2]=e+4;h=35;return h|0};case 34:{c[g>>2]=e+4;h=37;return h|0};case 33:{c[g>>2]=e+4;h=36;return h|0};case 9:case 10:case 21:case 11:case 35:case 36:case 32:{c[g>>2]=q;h=24;return h|0};default:{break e}}}}while(0);c[g>>2]=q;h=0;return h|0};case 9:{if((e+2|0)!=(k|0)){break b}c[g>>2]=k;h=-15;return h|0};case 30:{h=vf(b,e+2|0,k,g)|0;return h|0};case 5:{if((k-i|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 25:case 26:case 27:{y=19;break a;break};case 29:{z=0;A=l;r=144;break a;break};case 11:{c[g>>2]=e+2;h=17;return h|0};case 19:{o=e+2|0;if((o|0)==(k|0)){h=-1;return h|0}p=a[e+3|0]|0;n=a[o]|0;f:do{if(p<<24>>24==0){x=n&255;switch(d[m+x|0]|0){case 7:{r=118;break f;break};case 22:case 24:{break f;break};case 29:{B=0;C=x;r=112;break f;break};case 5:{if((k-o|0)<2){h=-2;return h|0}c[g>>2]=o;h=0;return h|0};case 6:{if((k-o|0)<3){h=-2;return h|0}c[g>>2]=o;h=0;return h|0};default:{r=120;break f}}}else{x=p&255;switch(x|0){case 255:{u=n&255;if((u-254|0)>>>0<2>>>0){r=120;break f}else{B=255;C=u;r=112;break f}break};case 216:case 217:case 218:case 219:{r=118;break f;break};case 220:case 221:case 222:case 223:{r=120;break f;break};default:{B=x;C=n&255;r=112;break f}}}}while(0);do{if((r|0)==112){if((c[18232+((d[17968+B|0]<<3|C>>>5)<<2)>>2]&1<<(C&31)|0)!=0){break}c[g>>2]=o;h=0;return h|0}else if((r|0)==118){if((k-o|0)<4){h=-2;return h|0}c[g>>2]=o;h=0;return h|0}else if((r|0)==120){c[g>>2]=o;h=0;return h|0}}while(0);n=e+4|0;if((n|0)==(k|0)){h=-20;return h|0}else{D=o;E=n}g:while(1){n=a[D+3|0]|0;p=a[E]|0;h:do{if(n<<24>>24==0){q=p&255;switch(d[m+q|0]|0){case 29:{F=0;G=q;r=126;break};case 22:case 24:case 25:case 26:case 27:{break};case 6:{r=131;break g;break};case 7:{r=133;break g;break};case 9:case 10:case 21:case 32:case 11:case 30:case 36:{r=135;break g;break};case 5:{r=129;break g;break};default:{r=136;break g}}}else{q=n&255;switch(q|0){case 216:case 217:case 218:case 219:{r=133;break g;break};case 255:{x=p&255;if((x-254|0)>>>0<2>>>0){r=136;break g}else{F=255;G=x;r=126;break h}break};case 220:case 221:case 222:case 223:{r=136;break g;break};default:{F=q;G=p&255;r=126;break h}}}}while(0);if((r|0)==126){r=0;if((c[18232+((d[19512+F|0]<<3|G>>>5)<<2)>>2]&1<<(G&31)|0)==0){r=128;break}}p=E+2|0;if((p|0)==(k|0)){h=-20;r=175;break}else{D=E;E=p}}if((r|0)==128){c[g>>2]=E;h=0;return h|0}else if((r|0)==129){if((k-E|0)<2){h=-2;return h|0}c[g>>2]=E;h=0;return h|0}else if((r|0)==131){if((k-E|0)<3){h=-2;return h|0}c[g>>2]=E;h=0;return h|0}else if((r|0)==133){if((k-E|0)<4){h=-2;return h|0}c[g>>2]=E;h=0;return h|0}else if((r|0)==135){c[g>>2]=E;h=20;return h|0}else if((r|0)==136){c[g>>2]=E;h=0;return h|0}else if((r|0)==175){return h|0}break};case 21:case 10:{break};case 12:{o=e+2|0;if((o|0)==(k|0)){h=-1;return h|0}p=k;n=o;i:while(1){o=a[n+1|0]|0;s=a[n]|0;j:do{if(o<<24>>24==0){q=a[m+(s&255)|0]|0;switch(q&255|0){case 5:{if((p-n|0)<2){h=-2;r=175;break i}H=n+2|0;break j;break};case 0:case 1:case 8:{r=23;break i;break};case 12:case 13:{I=n+2|0;if(q<<24>>24==12){r=25;break i}else{H=I;break j}break};case 7:{r=21;break j;break};case 6:{if((p-n|0)<3){h=-2;r=175;break i}H=n+3|0;break j;break};default:{r=29;break j}}}else{switch(o&255|0){case 255:{break};case 220:case 221:case 222:case 223:{r=23;break i;break};case 216:case 217:case 218:case 219:{r=21;break j;break};default:{r=29;break j}}if(((s&255)-254|0)>>>0<2>>>0){r=23;break i}else{r=29}}}while(0);if((r|0)==21){r=0;if((p-n|0)<4){h=-2;r=175;break}H=n+4|0}else if((r|0)==29){r=0;H=n+2|0}if((H|0)==(k|0)){h=-1;r=175;break}else{n=H}}if((r|0)==23){c[g>>2]=n;h=0;return h|0}else if((r|0)==25){if((I|0)==(k|0)){h=-27;return h|0}c[g>>2]=I;k:do{if((a[n+3|0]|0)==0){switch(d[m+(d[I]|0)|0]|0){case 21:case 9:case 10:case 11:case 30:case 20:{h=27;break};default:{break k}}return h|0}}while(0);h=0;return h|0}else if((r|0)==175){return h|0}break};case 6:{if((k-i|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 7:{r=141;break a;break};case 22:case 24:{y=18;break a;break};case 36:{c[g>>2]=e+2;h=21;return h|0};case 13:{n=e+2|0;if((n|0)==(k|0)){h=-1;return h|0}p=k;s=n;l:while(1){n=a[s+1|0]|0;o=a[s]|0;m:do{if(n<<24>>24==0){q=a[m+(o&255)|0]|0;switch(q&255|0){case 6:{if((p-s|0)<3){h=-2;r=175;break l}J=s+3|0;break m;break};case 5:{if((p-s|0)<2){h=-2;r=175;break l}J=s+2|0;break m;break};case 7:{r=41;break m;break};case 0:case 1:case 8:{r=43;break l;break};case 12:case 13:{K=s+2|0;if(q<<24>>24==13){r=45;break l}else{J=K;break m}break};default:{r=49;break m}}}else{switch(n&255|0){case 255:{break};case 216:case 217:case 218:case 219:{r=41;break m;break};case 220:case 221:case 222:case 223:{r=43;break l;break};default:{r=49;break m}}if(((o&255)-254|0)>>>0<2>>>0){r=43;break l}else{r=49}}}while(0);if((r|0)==41){r=0;if((p-s|0)<4){h=-2;r=175;break}J=s+4|0}else if((r|0)==49){r=0;J=s+2|0}if((J|0)==(k|0)){h=-1;r=175;break}else{s=J}}if((r|0)==43){c[g>>2]=s;h=0;return h|0}else if((r|0)==45){if((K|0)==(k|0)){h=-27;return h|0}c[g>>2]=K;n:do{if((a[s+3|0]|0)==0){switch(d[m+(d[K]|0)|0]|0){case 21:case 9:case 10:case 11:case 30:case 20:{h=27;break};default:{break n}}return h|0}}while(0);h=0;return h|0}else if((r|0)==175){return h|0}break};default:{r=148;break a}}}while(0);l=e+2|0;o:do{if((l|0)!=(k|0)){s=e;p=l;while(1){if((a[s+3|0]|0)!=0){break}o=d[m+(d[p]|0)|0]|0;if((o|0)==9){if((s+4|0)==(k|0)){break}}else if(!((o|0)==21|(o|0)==10)){break}o=p+2|0;if((o|0)==(k|0)){break o}else{s=p;p=o}}c[g>>2]=p;h=15;return h|0}}while(0);c[g>>2]=k;h=15;return h|0}else{m=j&255;switch(m|0){case 220:case 221:case 222:case 223:{r=148;break a;break};case 216:case 217:case 218:case 219:{r=141;break a;break};case 255:{l=f&255;if((l-254|0)>>>0<2>>>0){r=148;break a}else{z=255;A=l;r=144;break a}break};default:{z=m;A=f&255;r=144;break a}}}}while(0);do{if((r|0)==141){if((k-i|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((r|0)==144){f=A>>>5;j=1<<(A&31);if((j&c[18232+((f|d[17968+z|0]<<3)<<2)>>2]|0)!=0){y=18;break}if((c[18232+((d[19512+z|0]<<3|f)<<2)>>2]&j|0)==0){r=148}else{y=19}}}while(0);if((r|0)==148){c[g>>2]=e;h=0;return h|0}z=e+2|0;p:do{if((z|0)!=(k|0)){A=b+72|0;i=e;j=z;q:while(1){f=a[i+3|0]|0;K=a[j]|0;r:do{if(f<<24>>24==0){J=K&255;switch(d[A+J|0]|0){case 29:{L=0;M=J;r=154;break};case 22:case 24:case 25:case 26:case 27:{break};case 34:{r=164;break q;break};case 33:{r=167;break q;break};case 15:{r=170;break q;break};case 6:{r=159;break q;break};case 7:{r=161;break q;break};case 11:case 32:case 35:case 36:case 20:case 30:case 21:case 9:case 10:{r=163;break q;break};case 5:{r=157;break q;break};default:{r=173;break q}}}else{J=f&255;switch(J|0){case 216:case 217:case 218:case 219:{r=161;break q;break};case 255:{I=K&255;if((I-254|0)>>>0<2>>>0){r=173;break q}else{L=255;M=I;r=154;break r}break};case 220:case 221:case 222:case 223:{r=173;break q;break};default:{L=J;M=K&255;r=154;break r}}}}while(0);if((r|0)==154){r=0;if((1<<(M&31)&c[18232+((M>>>5|d[19512+L|0]<<3)<<2)>>2]|0)==0){r=156;break}}K=j+2|0;if((K|0)==(k|0)){break p}else{i=j;j=K}}if((r|0)==156){c[g>>2]=j;h=0;return h|0}else if((r|0)==157){if((k-j|0)<2){h=-2;return h|0}c[g>>2]=j;h=0;return h|0}else if((r|0)==159){if((k-j|0)<3){h=-2;return h|0}c[g>>2]=j;h=0;return h|0}else if((r|0)==161){if((k-j|0)<4){h=-2;return h|0}c[g>>2]=j;h=0;return h|0}else if((r|0)==163){c[g>>2]=j;h=y;return h|0}else if((r|0)==164){if((y|0)==19){c[g>>2]=j;h=0;return h|0}else{c[g>>2]=i+4;h=32;return h|0}}else if((r|0)==167){if((y|0)==19){c[g>>2]=j;h=0;return h|0}else{c[g>>2]=i+4;h=31;return h|0}}else if((r|0)==170){if((y|0)==19){c[g>>2]=j;h=0;return h|0}else{c[g>>2]=i+4;h=30;return h|0}}else if((r|0)==173){c[g>>2]=j;h=0;return h|0}}}while(0);h=-y|0;return h|0}function ef(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0;h=i;i=i+8|0;j=h|0;a:do{if((e|0)==(f|0)){k=-4}else{l=e;m=f-l|0;if((m&1|0)==0){n=f}else{o=m&-2;if((o|0)==0){k=-1;break}n=e+o|0}o=a[e+1|0]|0;m=a[e]|0;b:do{if(o<<24>>24==0){p=b+72|0;switch(d[p+(m&255)|0]|0){case 0:case 1:case 8:{q=208;break b;break};case 2:{r=e+2|0;if((r|0)==(n|0)){k=-1;break a}s=a[e+3|0]|0;t=a[r]|0;c:do{if(s<<24>>24==0){u=t&255;switch(d[p+u|0]|0){case 15:{k=xf(b,e+4|0,n,g)|0;break a;break};case 17:{v=e+4|0;if((v|0)==(n|0)){k=-1;break a}w=a[e+5|0]|0;x=a[v]|0;d:do{if(w<<24>>24==0){y=x&255;switch(d[p+y|0]|0){case 5:{if((n-v|0)<2){k=-2;break a}c[g>>2]=v;k=0;break a;break};case 22:case 24:{break d;break};case 29:{z=0;A=y;q=43;break d;break};case 7:{q=49;break d;break};case 6:{if((n-v|0)<3){k=-2;break a}c[g>>2]=v;k=0;break a;break};default:{q=51;break d}}}else{y=w&255;switch(y|0){case 220:case 221:case 222:case 223:{q=51;break d;break};case 216:case 217:case 218:case 219:{q=49;break d;break};case 255:{B=x&255;if((B-254|0)>>>0<2>>>0){q=51;break d}else{z=255;A=B;q=43;break d}break};default:{z=y;A=x&255;q=43;break d}}}}while(0);do{if((q|0)==43){if((c[18232+((d[17968+z|0]<<3|A>>>5)<<2)>>2]&1<<(A&31)|0)!=0){break}c[g>>2]=v;k=0;break a}else if((q|0)==49){if((n-v|0)<4){k=-2;break a}c[g>>2]=v;k=0;break a}else if((q|0)==51){c[g>>2]=v;k=0;break a}}while(0);x=e+6|0;if((x|0)==(n|0)){k=-1;break a}else{C=v;D=x}e:while(1){x=a[C+3|0]|0;w=a[D]|0;f:do{if(x<<24>>24==0){y=w&255;switch(d[p+y|0]|0){case 29:{E=0;F=y;q=57;break};case 6:{q=62;break e;break};case 11:{q=72;break e;break};case 22:case 24:case 25:case 26:case 27:{break};case 7:{q=64;break e;break};case 21:case 9:case 10:{q=66;break e;break};case 5:{q=60;break e;break};default:{q=73;break e}}}else{y=x&255;switch(y|0){case 255:{B=w&255;if((B-254|0)>>>0<2>>>0){q=73;break e}else{E=255;F=B;q=57;break f}break};case 216:case 217:case 218:case 219:{q=64;break e;break};case 220:case 221:case 222:case 223:{q=73;break e;break};default:{E=y;F=w&255;q=57;break f}}}}while(0);if((q|0)==57){q=0;if((c[18232+((d[19512+E|0]<<3|F>>>5)<<2)>>2]&1<<(F&31)|0)==0){q=59;break}}w=D+2|0;if((w|0)==(n|0)){k=-1;break a}else{C=D;D=w}}if((q|0)==59){c[g>>2]=D;k=0;break a}else if((q|0)==60){if((n-D|0)<2){k=-2;break a}c[g>>2]=D;k=0;break a}else if((q|0)==62){if((n-D|0)<3){k=-2;break a}c[g>>2]=D;k=0;break a}else if((q|0)==64){if((n-D|0)<4){k=-2;break a}c[g>>2]=D;k=0;break a}else if((q|0)==66){v=C+4|0;if((v|0)==(n|0)){k=-1;break a}else{G=v}while(1){if((a[G+1|0]|0)!=0){q=70;break}v=d[p+(d[G]|0)|0]|0;if((v|0)==11){q=69;break}else if(!((v|0)==21|(v|0)==9|(v|0)==10)){q=70;break}v=G+2|0;if((v|0)==(n|0)){k=-1;break a}else{G=v}}if((q|0)==69){c[g>>2]=G+2;k=5;break a}else if((q|0)==70){c[g>>2]=G;k=0;break a}}else if((q|0)==72){c[g>>2]=C+4;k=5;break a}else if((q|0)==73){c[g>>2]=D;k=0;break a}break};case 7:{q=22;break c;break};case 5:{if((n-r|0)<2){k=-2;break a}c[g>>2]=r;k=0;break a;break};case 16:{v=e+4|0;if((v|0)==(n|0)){k=-1;break a}do{if((a[e+5|0]|0)==0){w=d[p+(d[v]|0)|0]|0;if((w|0)==27){k=wf(b,e+6|0,n,g)|0;break a}else if((w|0)!=20){break}w=e+6|0;if((n-w|0)<12){k=-1;break a}else{H=w;I=0}while(1){if((a[H+1|0]|0)!=0){q=31;break}if((a[H]|0)!=(a[17816+I|0]|0)){q=31;break}w=I+1|0;J=H+2|0;if((w|0)<6){H=J;I=w}else{q=33;break}}if((q|0)==31){c[g>>2]=H;k=0;break a}else if((q|0)==33){c[g>>2]=J;k=8;break a}}}while(0);c[g>>2]=v;k=0;break a;break};case 6:{if((n-r|0)<3){k=-2;break a}c[g>>2]=r;k=0;break a;break};case 22:case 24:{break c;break};case 29:{K=0;L=u;q=16;break c;break};default:{q=74;break c}}}else{w=s&255;switch(w|0){case 216:case 217:case 218:case 219:{q=22;break c;break};case 255:{x=t&255;if((x-254|0)>>>0<2>>>0){q=74;break c}else{K=255;L=x;q=16;break c}break};case 220:case 221:case 222:case 223:{q=74;break c;break};default:{K=w;L=t&255;q=16;break c}}}}while(0);do{if((q|0)==16){if((c[18232+((d[17968+K|0]<<3|L>>>5)<<2)>>2]&1<<(L&31)|0)!=0){break}c[g>>2]=r;k=0;break a}else if((q|0)==22){if((n-r|0)<4){k=-2;break a}c[g>>2]=r;k=0;break a}else if((q|0)==74){c[g>>2]=r;k=0;break a}}while(0);t=e+4|0;if((t|0)==(n|0)){k=-1;break a}else{M=r;N=t}g:while(1){t=a[M+3|0]|0;s=a[N]|0;h:do{if(t<<24>>24==0){w=s&255;switch(d[p+w|0]|0){case 5:{q=83;break g;break};case 22:case 24:case 25:case 26:case 27:{break};case 6:{q=85;break g;break};case 17:{O=N;break g;break};case 7:{q=87;break g;break};case 21:case 9:case 10:{q=89;break g;break};case 11:{P=N;q=182;break g;break};case 29:{Q=0;R=w;q=80;break};default:{q=188;break g}}}else{w=t&255;switch(w|0){case 220:case 221:case 222:case 223:{q=188;break g;break};case 216:case 217:case 218:case 219:{q=87;break g;break};case 255:{x=s&255;if((x-254|0)>>>0<2>>>0){q=188;break g}else{Q=255;R=x;q=80;break h}break};default:{Q=w;R=s&255;q=80;break h}}}}while(0);if((q|0)==80){q=0;if((c[18232+((d[19512+Q|0]<<3|R>>>5)<<2)>>2]&1<<(R&31)|0)==0){q=82;break}}s=N+2|0;if((s|0)==(n|0)){k=-1;break a}else{M=N;N=s}}i:do{if((q|0)==82){c[g>>2]=N;k=0;break a}else if((q|0)==83){if((n-N|0)<2){k=-2;break a}c[g>>2]=N;k=0;break a}else if((q|0)==85){if((n-N|0)<3){k=-2;break a}c[g>>2]=N;k=0;break a}else if((q|0)==87){if((n-N|0)<4){k=-2;break a}c[g>>2]=N;k=0;break a}else if((q|0)==89){r=M+4|0;if((r|0)==(n|0)){k=-1;break a}else{S=r}j:while(1){T=a[S+1|0]|0;U=a[S]|0;if(T<<24>>24!=0){q=91;break}r=U&255;switch(d[p+r|0]|0){case 29:{V=0;W=r;q=95;break j;break};case 22:case 24:{break j;break};case 5:{q=174;break j;break};case 7:{q=178;break j;break};case 17:{O=S;break i;break};case 21:case 9:case 10:{break};case 11:{P=S;q=182;break i;break};case 6:{q=176;break j;break};default:{q=181;break j}}r=S+2|0;if((r|0)==(n|0)){k=-1;break a}else{S=r}}k:do{if((q|0)==91){r=T&255;switch(r|0){case 255:{s=U&255;if((s-254|0)>>>0<2>>>0){q=181;break k}else{V=255;W=s;q=95;break k}break};case 216:case 217:case 218:case 219:{q=178;break k;break};case 220:case 221:case 222:case 223:{q=181;break k;break};default:{V=r;W=U&255;q=95;break k}}}else if((q|0)==174){if((n-S|0)<2){k=-2;break a}c[g>>2]=S;k=0;break a}else if((q|0)==176){if((n-S|0)<3){k=-2;break a}c[g>>2]=S;k=0;break a}}while(0);do{if((q|0)==95){if((c[18232+((d[17968+V|0]<<3|W>>>5)<<2)>>2]&1<<(W&31)|0)!=0){break}c[g>>2]=S;k=0;break a}else if((q|0)==178){if((n-S|0)<4){k=-2;break a}c[g>>2]=S;k=0;break a}else if((q|0)==181){c[g>>2]=S;k=0;break a}}while(0);r=S+2|0;c[j>>2]=r;if((r|0)==(n|0)){k=-1;break a}s=n;t=r;l:while(1){r=a[t+1|0]|0;u=a[t]|0;m:do{if(r<<24>>24==0){v=u&255;n:do{switch(d[p+v|0]|0){case 6:{q=109;break l;break};case 29:{X=0;Y=v;q=105;break m;break};case 5:{q=107;break l;break};case 21:case 9:case 10:{w=t+2|0;c[j>>2]=w;if((w|0)==(n|0)){k=-1;break a}else{Z=t;_=w}while(1){if((a[Z+3|0]|0)!=0){q=116;break l}w=d[p+(d[_]|0)|0]|0;if((w|0)==14){$=_;break n}else if(!((w|0)==21|(w|0)==10|(w|0)==9)){q=116;break l}w=_+2|0;c[j>>2]=w;if((w|0)==(n|0)){k=-1;break a}else{Z=_;_=w}}break};case 7:{q=111;break l;break};case 22:case 24:case 25:case 26:case 27:{aa=t;break m;break};case 14:{$=t;break};default:{q=173;break l}}}while(0);v=$+2|0;c[j>>2]=v;if((v|0)==(n|0)){k=-1;break a}else{ba=$;ca=v}while(1){if((a[ba+3|0]|0)!=0){q=122;break l}da=d[p+(d[ca]|0)|0]|0;if((da&254|0)==12){break}if(!((da|0)==21|(da|0)==10|(da|0)==9)){q=122;break l}v=ca+2|0;c[j>>2]=v;if((v|0)==(n|0)){k=-1;break a}else{ba=ca;ca=v}}v=ca+2|0;c[j>>2]=v;if((v|0)==(n|0)){k=-1;break a}else{ea=v}while(1){v=a[ea+1|0]|0;w=a[ea]|0;o:do{if(v<<24>>24==0){fa=d[p+(w&255)|0]|0}else{switch(v&255|0){case 216:case 217:case 218:case 219:{fa=7;break o;break};case 220:case 221:case 222:case 223:{fa=8;break o;break};case 255:{if(((w&255)-254|0)>>>0<2>>>0){fa=0;break o}break};default:{}}fa=29}}while(0);if((fa|0)==(da|0)){break}switch(fa|0){case 5:{if((s-ea|0)<2){k=-2;break a}w=ea+2|0;c[j>>2]=w;ga=w;break};case 6:{if((s-ea|0)<3){k=-2;break a}w=ea+3|0;c[j>>2]=w;ga=w;break};case 2:{q=144;break l;break};case 0:case 1:case 8:{q=138;break l;break};case 3:{ha=uf(b,ea+2|0,n,j)|0;if((ha|0)<1){q=142;break l}ga=c[j>>2]|0;break};case 7:{if((s-ea|0)<4){k=-2;break a}w=ea+4|0;c[j>>2]=w;ga=w;break};default:{w=ea+2|0;c[j>>2]=w;ga=w}}if((ga|0)==(n|0)){k=-1;break a}else{ea=ga}}ia=ea+2|0;c[j>>2]=ia;if((ia|0)==(n|0)){k=-1;break a}if((a[ea+3|0]|0)!=0){q=150;break l}switch(d[p+(d[ia]|0)|0]|0){case 21:case 9:case 10:{break};case 11:{ja=ia;q=166;break l;break};case 17:{ka=ia;q=167;break l;break};default:{q=150;break l}}w=ea+4|0;c[j>>2]=w;if((w|0)==(n|0)){k=-1;break a}else{la=ia;ma=w}p:while(1){na=a[la+3|0]|0;oa=a[ma]|0;if(na<<24>>24!=0){q=152;break}w=oa&255;switch(d[p+w|0]|0){case 11:{ja=ma;q=166;break l;break};case 17:{ka=ma;q=167;break l;break};case 7:{q=164;break l;break};case 29:{pa=w;break p;break};case 22:case 24:{aa=ma;break m;break};case 6:{q=162;break l;break};case 5:{q=160;break l;break};case 21:case 9:case 10:{break};default:{q=172;break l}}w=ma+2|0;c[j>>2]=w;if((w|0)==(n|0)){k=-1;break a}else{la=ma;ma=w}}q:do{if((q|0)==152){q=0;switch(na&255|0){case 220:case 221:case 222:case 223:{q=172;break l;break};case 216:case 217:case 218:case 219:{q=164;break l;break};case 255:{w=oa&255;if((w-254|0)>>>0<2>>>0){q=172;break l}else{pa=w;break q}break};default:{pa=oa&255;break q}}}}while(0);if((c[18232+((d[17968+(d[ma+1|0]|0)|0]<<3|pa>>>5)<<2)>>2]&1<<(pa&31)|0)==0){q=158;break l}else{aa=ma}}else{w=r&255;switch(w|0){case 255:{v=u&255;if((v-254|0)>>>0<2>>>0){q=173;break l}else{X=255;Y=v;q=105;break m}break};case 220:case 221:case 222:case 223:{q=173;break l;break};case 216:case 217:case 218:case 219:{q=111;break l;break};default:{X=w;Y=u&255;q=105;break m}}}}while(0);if((q|0)==105){q=0;if((c[18232+((d[19512+X|0]<<3|Y>>>5)<<2)>>2]&1<<(Y&31)|0)==0){q=106;break}else{aa=t}}u=aa+2|0;c[j>>2]=u;if((u|0)==(n|0)){k=-1;break a}else{t=u}}if((q|0)==106){c[g>>2]=t;k=0;break a}else if((q|0)==107){if((s-t|0)<2){k=-2;break a}c[g>>2]=t;k=0;break a}else if((q|0)==109){if((s-t|0)<3){k=-2;break a}c[g>>2]=t;k=0;break a}else if((q|0)==111){if((s-t|0)<4){k=-2;break a}c[g>>2]=t;k=0;break a}else if((q|0)==116){c[g>>2]=_;k=0;break a}else if((q|0)==122){c[g>>2]=ca;k=0;break a}else if((q|0)==138){c[g>>2]=ea;k=0;break a}else if((q|0)==142){if((ha|0)!=0){k=ha;break a}c[g>>2]=c[j>>2];k=0;break a}else if((q|0)==144){c[g>>2]=ea;k=0;break a}else if((q|0)==150){c[g>>2]=ia;k=0;break a}else if((q|0)==158){c[g>>2]=ma;k=0;break a}else if((q|0)==160){if((s-ma|0)<2){k=-2;break a}c[g>>2]=ma;k=0;break a}else if((q|0)==162){if((s-ma|0)<3){k=-2;break a}c[g>>2]=ma;k=0;break a}else if((q|0)==164){if((s-ma|0)<4){k=-2;break a}c[g>>2]=ma;k=0;break a}else if((q|0)==166){c[g>>2]=ja+2;k=1;break a}else if((q|0)==167){u=ka+2|0;c[j>>2]=u;if((u|0)==(n|0)){k=-1;break a}do{if((a[ka+3|0]|0)==0){if((a[u]|0)!=62){break}c[g>>2]=ka+4;k=3;break a}}while(0);c[g>>2]=u;k=0;break a}else if((q|0)==172){c[g>>2]=ma;k=0;break a}else if((q|0)==173){c[g>>2]=t;k=0;break a}}else if((q|0)==188){c[g>>2]=N;k=0;break a}}while(0);if((q|0)==182){c[g>>2]=P+2;k=2;break a}s=O+2|0;if((s|0)==(n|0)){k=-1;break a}do{if((a[O+3|0]|0)==0){if((a[s]|0)!=62){break}c[g>>2]=O+4;k=4;break a}}while(0);c[g>>2]=s;k=0;break a;break};case 5:{if((n-l|0)<2){k=-2;break a}qa=e+2|0;break b;break};case 6:{if((n-l|0)<3){k=-2;break a}qa=e+3|0;break b;break};case 7:{q=206;break b;break};case 10:{c[g>>2]=e+2;k=7;break a;break};case 4:{r=e+2|0;if((r|0)==(n|0)){k=-5;break a}if((a[e+3|0]|0)!=0){qa=r;break b}if((a[r]|0)!=93){qa=r;break b}w=e+4|0;if((w|0)==(n|0)){k=-5;break a}if((a[e+5|0]|0)!=0){qa=r;break b}if((a[w]|0)!=62){qa=r;break b}c[g>>2]=w;k=0;break a;break};case 3:{k=uf(b,e+2|0,n,g)|0;break a;break};case 9:{w=e+2|0;if((w|0)==(n|0)){k=-3;break a}if((a[e+3|0]|0)==0){ra=(a[p+(d[w]|0)|0]|0)==10}else{ra=0}c[g>>2]=ra?e+4|0:w;k=7;break a;break};default:{q=209;break b}}}else{switch(o&255|0){case 220:case 221:case 222:case 223:{q=208;break b;break};case 216:case 217:case 218:case 219:{q=206;break b;break};case 255:{break};default:{q=209;break b}}if(((m&255)-254|0)>>>0<2>>>0){q=208}else{q=209}}}while(0);if((q|0)==206){if((n-l|0)<4){k=-2;break}qa=e+4|0}else if((q|0)==208){c[g>>2]=e;k=0;break}else if((q|0)==209){qa=e+2|0}r:do{if((qa|0)!=(n|0)){m=b+72|0;o=n;w=qa;s:while(1){r=a[w+1|0]|0;v=a[w]|0;t:do{if(r<<24>>24==0){switch(d[m+(v&255)|0]|0){case 6:{if((o-w|0)<3){q=220;break s}sa=w+3|0;break t;break};case 5:{if((o-w|0)<2){q=217;break s}sa=w+2|0;break t;break};case 7:{q=222;break t;break};case 4:{x=w+2|0;if((x|0)==(n|0)){q=232;break s}if((a[w+3|0]|0)!=0){sa=x;break t}if((a[x]|0)!=93){sa=x;break t}ta=w+4|0;if((ta|0)==(n|0)){q=232;break s}if((a[w+5|0]|0)!=0){sa=x;break t}if((a[ta]|0)==62){q=231;break s}else{sa=x;break t}break};case 3:case 2:case 0:case 1:case 8:case 9:case 10:{q=232;break s;break};default:{q=233;break t}}}else{switch(r&255|0){case 255:{break};case 216:case 217:case 218:case 219:{q=222;break t;break};case 220:case 221:case 222:case 223:{q=232;break s;break};default:{q=233;break t}}if(((v&255)-254|0)>>>0<2>>>0){q=232;break s}else{q=233}}}while(0);if((q|0)==222){q=0;if((o-w|0)<4){q=223;break}sa=w+4|0}else if((q|0)==233){q=0;sa=w+2|0}if((sa|0)==(n|0)){break r}else{w=sa}}if((q|0)==217){c[g>>2]=w;k=6;break a}else if((q|0)==220){c[g>>2]=w;k=6;break a}else if((q|0)==223){c[g>>2]=w;k=6;break a}else if((q|0)==231){c[g>>2]=ta;k=0;break a}else if((q|0)==232){c[g>>2]=w;k=6;break a}}}while(0);c[g>>2]=n;k=6}}while(0);i=h;return k|0}function ff(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((e|0)==(f|0)){h=-4;return h|0}i=e;j=f-i|0;do{if((j&1|0)==0){k=f}else{l=j&-2;if((l|0)==0){h=-1;return h|0}else{k=e+l|0;break}}}while(0);j=a[e+1|0]|0;f=a[e]|0;a:do{if(j<<24>>24==0){l=b+72|0;switch(d[l+(f&255)|0]|0){case 9:{m=e+2|0;if((m|0)==(k|0)){h=-1;return h|0}if((a[e+3|0]|0)==0){n=(a[l+(d[m]|0)|0]|0)==10}else{n=0}c[g>>2]=n?e+4|0:m;h=7;return h|0};case 10:{c[g>>2]=e+2;h=7;return h|0};case 5:{if((k-i|0)<2){h=-2;return h|0}else{o=e+2|0;break a}break};case 6:{if((k-i|0)<3){h=-2;return h|0}else{o=e+3|0;break a}break};case 7:{p=25;break a;break};case 0:case 1:case 8:{p=27;break a;break};case 4:{m=e+2|0;if((m|0)==(k|0)){h=-1;return h|0}if((a[e+3|0]|0)!=0){o=m;break a}if((a[m]|0)!=93){o=m;break a}l=e+4|0;if((l|0)==(k|0)){h=-1;return h|0}if((a[e+5|0]|0)!=0){o=m;break a}if((a[l]|0)!=62){o=m;break a}c[g>>2]=e+6;h=40;return h|0};default:{p=28;break a}}}else{switch(j&255|0){case 255:{break};case 216:case 217:case 218:case 219:{p=25;break a;break};case 220:case 221:case 222:case 223:{p=27;break a;break};default:{p=28;break a}}if(((f&255)-254|0)>>>0<2>>>0){p=27}else{p=28}}}while(0);do{if((p|0)==25){if((k-i|0)<4){h=-2;return h|0}else{o=e+4|0;break}}else if((p|0)==27){c[g>>2]=e;h=0;return h|0}else if((p|0)==28){o=e+2|0}}while(0);b:do{if((o|0)!=(k|0)){e=b+72|0;i=k;f=o;c:while(1){j=a[f+1|0]|0;n=a[f]|0;d:do{if(j<<24>>24==0){switch(d[e+(n&255)|0]|0){case 0:case 1:case 8:case 9:case 10:case 4:{p=44;break c;break};case 5:{if((i-f|0)<2){p=36;break c}q=f+2|0;break d;break};case 7:{p=41;break d;break};case 6:{if((i-f|0)<3){p=39;break c}q=f+3|0;break d;break};default:{p=45;break d}}}else{switch(j&255|0){case 220:case 221:case 222:case 223:{p=44;break c;break};case 255:{break};case 216:case 217:case 218:case 219:{p=41;break d;break};default:{p=45;break d}}if(((n&255)-254|0)>>>0<2>>>0){p=44;break c}else{p=45}}}while(0);if((p|0)==41){p=0;if((i-f|0)<4){p=42;break}q=f+4|0}else if((p|0)==45){p=0;q=f+2|0}if((q|0)==(k|0)){break b}else{f=q}}if((p|0)==36){c[g>>2]=f;h=6;return h|0}else if((p|0)==39){c[g>>2]=f;h=6;return h|0}else if((p|0)==42){c[g>>2]=f;h=6;return h|0}else if((p|0)==44){c[g>>2]=f;h=6;return h|0}}}while(0);c[g>>2]=k;h=6;return h|0}function gf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;j=e;a:while(1){k=a[j+1|0]|0;b:do{if(k<<24>>24==0){switch(d[i+(d[j]|0)|0]|0){case 10:{l=13;break a;break};case 2:{l=12;break a;break};case 9:{l=16;break a;break};case 6:{m=j+3|0;break b;break};case 7:{l=8;break b;break};case 3:{l=9;break a;break};case 21:{l=22;break a;break};case 5:{m=j+2|0;break b;break};default:{l=25;break b}}}else{if(((k&255)-216|0)>>>0<4>>>0){l=8}else{l=25}}}while(0);if((l|0)==8){l=0;m=j+4|0}else if((l|0)==25){l=0;m=j+2|0}if((m|0)==(f|0)){l=27;break}else{j=m}}if((l|0)==9){if((j|0)==(e|0)){h=uf(b,e+2|0,f,g)|0;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==12){c[g>>2]=j;h=0;return h|0}else if((l|0)==13){if((j|0)==(e|0)){c[g>>2]=e+2;h=7;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==16){if((j|0)!=(e|0)){c[g>>2]=j;h=6;return h|0}b=e+2|0;if((b|0)==(f|0)){h=-3;return h|0}if((a[e+3|0]|0)==0){n=(a[i+(d[b]|0)|0]|0)==10}else{n=0}c[g>>2]=n?e+4|0:b;h=7;return h|0}else if((l|0)==22){if((j|0)==(e|0)){c[g>>2]=e+2;h=39;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==27){c[g>>2]=f;h=6;return h|0}return 0}function hf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;j=e;a:while(1){k=a[j+1|0]|0;b:do{if(k<<24>>24==0){switch(d[i+(d[j]|0)|0]|0){case 10:{l=15;break a;break};case 3:{l=9;break a;break};case 7:{l=8;break b;break};case 9:{l=18;break a;break};case 6:{m=j+3|0;break b;break};case 5:{m=j+2|0;break b;break};case 30:{l=12;break a;break};default:{l=24;break b}}}else{if(((k&255)-216|0)>>>0<4>>>0){l=8}else{l=24}}}while(0);if((l|0)==8){l=0;m=j+4|0}else if((l|0)==24){l=0;m=j+2|0}if((m|0)==(f|0)){l=26;break}else{j=m}}if((l|0)==9){if((j|0)==(e|0)){h=uf(b,e+2|0,f,g)|0;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==12){if((j|0)==(e|0)){m=vf(b,e+2|0,f,g)|0;h=(m|0)==22?0:m;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==15){if((j|0)==(e|0)){c[g>>2]=e+2;h=7;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==18){if((j|0)!=(e|0)){c[g>>2]=j;h=6;return h|0}j=e+2|0;if((j|0)==(f|0)){h=-3;return h|0}if((a[e+3|0]|0)==0){n=(a[i+(d[j]|0)|0]|0)==10}else{n=0}c[g>>2]=n?e+4|0:j;h=7;return h|0}else if((l|0)==26){c[g>>2]=f;h=6;return h|0}return 0}function jf(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=b+72|0;b=e;e=c;a:while(1){c=e+1|0;g=a[c]|0;h=a[e]|0;b:do{if(g<<24>>24==0){switch(d[f+(h&255)|0]|0){case 5:{i=b;j=e;k=h;l=10;break};case 29:case 22:case 24:case 25:case 26:case 27:{l=12;break};case 6:{m=b;n=e;o=h;l=8;break};case 7:{l=6;break};default:{l=15;break a}}}else{switch(g&255|0){case 220:case 221:case 222:case 223:{l=15;break a;break};case 255:{break};case 216:case 217:case 218:case 219:{l=6;break b;break};default:{l=12;break b}}if(((h&255)-254|0)>>>0<2>>>0){l=15;break a}else{l=12}}}while(0);if((l|0)==6){l=0;if(h<<24>>24!=(a[b]|0)){p=0;l=20;break}m=b+1|0;n=c;o=g;l=8}else if((l|0)==12){l=0;if((a[b]|0)!=h<<24>>24){p=0;l=20;break}if((a[b+1|0]|0)==g<<24>>24){q=b;r=e}else{p=0;l=20;break}}if((l|0)==8){l=0;s=n+1|0;if(o<<24>>24!=(a[m]|0)){p=0;l=20;break}i=m+1|0;j=s;k=a[s]|0;l=10}if((l|0)==10){l=0;if(k<<24>>24!=(a[i]|0)){p=0;l=20;break}if((a[j+1|0]|0)==(a[i+1|0]|0)){q=i;r=j}else{p=0;l=20;break}}b=q+2|0;e=r+2|0}if((l|0)==15){r=a[b+1|0]|0;e=a[b]|0;c:do{if(r<<24>>24==0){switch(d[f+(e&255)|0]|0){case 5:case 6:case 7:case 29:case 22:case 24:case 25:case 26:case 27:{p=0;break};default:{break c}}return p|0}else{switch(r&255|0){case 223:case 222:case 221:case 220:{break c;break};case 255:{break};default:{p=0;return p|0}}if(((e&255)-254|0)>>>0<2>>>0){break}else{p=0}return p|0}}while(0);p=1;return p|0}else if((l|0)==20){return p|0}return 0}function kf(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a[e]|0;f=(c|0)==(d|0);a:do{if(b<<24>>24==0){g=f}else{h=c;i=e;j=b;k=f;while(1){if(k){l=0;m=7;break}if((a[h+1|0]|0)!=0){l=0;m=7;break}if((a[h]|0)!=j<<24>>24){l=0;m=7;break}n=h+2|0;o=i+1|0;p=a[o]|0;q=(n|0)==(d|0);if(p<<24>>24==0){g=q;break a}else{h=n;i=o;j=p;k=q}}if((m|0)==7){return l|0}}}while(0);l=g&1;return l|0}function lf(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0;e=b+72|0;b=c;a:while(1){f=a[b+1|0]|0;g=a[b]|0;b:do{if(f<<24>>24==0){switch(d[e+(g&255)|0]|0|0){case 7:{h=8;break b;break};case 29:case 22:case 24:case 25:case 26:case 27:{h=9;break b;break};case 6:{b=b+3|0;continue a;break};case 5:{b=b+2|0;continue a;break};default:{break a}}}else{switch(f&255|0){case 255:{break};case 216:case 217:case 218:case 219:{h=8;break b;break};case 220:case 221:case 222:case 223:{break a;break};default:{h=9;break b}}if(((g&255)-254|0)>>>0<2>>>0){break a}else{h=9}}}while(0);if((h|0)==8){h=0;b=b+4|0;continue}else if((h|0)==9){h=0;b=b+2|0;continue}}return b-c|0}function mf(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;if((a[c+1|0]|0)!=0){e=c;return e|0}f=b+72|0;b=c;while(1){c=d[f+(d[b]|0)|0]|0;if(!((c|0)==10|(c|0)==9|(c|0)==21)){e=b;g=3;break}c=b+2|0;if((a[b+3|0]|0)==0){b=c}else{e=c;g=3;break}}if((g|0)==3){return e|0}return 0}function nf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=b+72|0;b=0;i=0;j=1;k=e;a:while(1){e=k+2|0;l=k+3|0;m=a[l]|0;n=a[e]|0;b:do{if(m<<24>>24==0){switch(d[h+(n&255)|0]|0){case 21:{if((j|0)==1){b=b;i=i;j=0;k=e;continue a}if(!((j|0)==2&(i|0)<(f|0))){b=b;i=i;j=j;k=e;continue a}o=g+(i<<4)+12|0;if((a[o]|0)==0){b=b;i=i;j=2;k=e;continue a}do{if((e|0)!=(c[g+(i<<4)+4>>2]|0)&n<<24>>24==32){p=a[k+5|0]|0;q=a[k+4|0]|0;if((p<<24>>24|0)==0){if(q<<24>>24==32){break}r=d[h+(q&255)|0]|0}else if((p<<24>>24|0)==(-1|0)){if(((q&255)-254|0)>>>0<2>>>0){r=0}else{b=b;i=i;j=2;k=e;continue a}}else{b=b;i=i;j=2;k=e;continue a}if((r|0)!=(b|0)){b=b;i=i;j=2;k=e;continue a}}}while(0);a[o]=0;b=b;i=i;j=2;k=e;continue a;break};case 3:{if((i|0)>=(f|0)){b=b;i=i;j=j;k=e;continue a}a[g+(i<<4)+12|0]=0;b=b;i=i;j=j;k=e;continue a;break};case 12:{if((j|0)!=2){if((i|0)>=(f|0)){b=12;i=i;j=2;k=e;continue a}c[g+(i<<4)+4>>2]=k+4;b=12;i=i;j=2;k=e;continue a}if((b|0)!=12){b=b;i=i;j=2;k=e;continue a}if((i|0)<(f|0)){c[g+(i<<4)+8>>2]=e}b=12;i=i+1|0;j=0;k=e;continue a;break};case 5:{if((j|0)!=0){b=b;i=i;j=j;k=e;continue a}if((i|0)>=(f|0)){b=b;i=i;j=1;k=e;continue a}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=e;continue a;break};case 11:case 17:{if((j|0)==2){b=b;i=i;j=2;k=e;continue a}else{break a}break};case 6:{if((j|0)!=0){b=b;i=i;j=j;k=l;continue a}if((i|0)>=(f|0)){b=b;i=i;j=1;k=l;continue a}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=l;continue a;break};case 29:case 22:case 24:{s=16;break b;break};case 9:case 10:{if((j|0)==1){b=b;i=i;j=0;k=e;continue a}if(!((j|0)==2&(i|0)<(f|0))){b=b;i=i;j=j;k=e;continue a}a[g+(i<<4)+12|0]=0;b=b;i=i;j=2;k=e;continue a;break};case 13:{if((j|0)!=2){if((i|0)>=(f|0)){b=13;i=i;j=2;k=e;continue a}c[g+(i<<4)+4>>2]=k+4;b=13;i=i;j=2;k=e;continue a}if((b|0)!=13){b=b;i=i;j=2;k=e;continue a}if((i|0)<(f|0)){c[g+(i<<4)+8>>2]=e}b=13;i=i+1|0;j=0;k=e;continue a;break};case 7:{s=12;break b;break};default:{b=b;i=i;j=j;k=e;continue a}}}else{switch(m&255|0){case 255:{break};case 220:case 221:case 222:case 223:{b=b;i=i;j=j;k=e;continue a;break};case 216:case 217:case 218:case 219:{s=12;break b;break};default:{s=16;break b}}if(!(((n&255)-254|0)>>>0>1>>>0&(j|0)==0)){b=b;i=i;j=j;k=e;continue a}}}while(0);if((s|0)==12){s=0;do{if((j|0)==0){if((i|0)>=(f|0)){t=1;break}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;t=1}else{t=j}}while(0);b=b;i=i;j=t;k=k+4|0;continue}else if((s|0)==16){s=0;if((j|0)!=0){b=b;i=i;j=j;k=e;continue}}if((i|0)>=(f|0)){b=b;i=i;j=1;k=e;continue}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=e}return i|0}function of(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;b=c+4|0;a:do{if((a[c+5|0]|0)==0){if((a[b]|0)!=120){d=b;e=0;f=11;break}g=c+6|0;h=0;while(1){b:do{if((a[g+1|0]|0)==0){i=a[g]|0;if(i<<24>>24==59){j=h;break a}k=i<<24>>24;switch(k|0){case 65:case 66:case 67:case 68:case 69:case 70:{l=(h<<4)-55+k|0;break b;break};case 97:case 98:case 99:case 100:case 101:case 102:{l=(h<<4)-87+k|0;break b;break};case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:{l=k-48|h<<4;break b;break};default:{l=h;break b}}}else{l=h}}while(0);if((l|0)>1114111){m=-1;break}else{g=g+2|0;h=l}}return m|0}else{d=b;e=0;f=11}}while(0);c:do{if((f|0)==11){while(1){f=0;if((a[d+1|0]|0)==0){b=a[d]|0;if(b<<24>>24==59){j=e;break c}n=(b<<24>>24)-48|0}else{n=-49}b=n+(e*10|0)|0;if((b|0)>1114111){m=-1;break}else{d=d+2|0;e=b;f=11}}return m|0}}while(0);d:do{switch(j>>8|0){case 0:{if((a[20496+j|0]|0)==0){m=-1}else{break d}return m|0};case 216:case 217:case 218:case 219:case 220:case 221:case 222:case 223:{m=-1;return m|0};case 255:{if((j&-2|0)==65534){m=-1}else{break d}return m|0};default:{}}}while(0);m=j;return m|0}function pf(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;b=(d-c|0)/2|0;do{if((b|0)==2){if((a[c+3|0]|0)!=0){break}if((a[c+2|0]|0)!=116){break}if((a[c+1|0]|0)!=0){break}d=a[c]|0;if((d|0)==108){e=60;return e|0}else if((d|0)!=103){break}e=62;return e|0}else if((b|0)==3){if((a[c+1|0]|0)!=0){break}if((a[c]|0)!=97){break}if((a[c+3|0]|0)!=0){break}if((a[c+2|0]|0)!=109){break}if((a[c+5|0]|0)!=0){break}if((a[c+4|0]|0)==112){e=38}else{break}return e|0}else if((b|0)==4){if((a[c+1|0]|0)!=0){break}d=a[c]|0;if((d|0)==113){if((a[c+3|0]|0)!=0){break}if((a[c+2|0]|0)!=117){break}if((a[c+5|0]|0)!=0){break}if((a[c+4|0]|0)!=111){break}if((a[c+7|0]|0)!=0){break}if((a[c+6|0]|0)==116){e=34}else{break}return e|0}else if((d|0)==97){if((a[c+3|0]|0)!=0){break}if((a[c+2|0]|0)!=112){break}if((a[c+5|0]|0)!=0){break}if((a[c+4|0]|0)!=111){break}if((a[c+7|0]|0)!=0){break}if((a[c+6|0]|0)==115){e=39}else{break}return e|0}else{break}}}while(0);e=0;return e|0}function qf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(e>>>0>=f>>>0){return}h=b+72|0;b=g+4|0;i=g|0;g=e;while(1){e=a[g+1|0]|0;a:do{if(e<<24>>24==0){switch(d[h+(d[g]|0)|0]|0){case 6:{j=g+3|0;break a;break};case 9:{c[i>>2]=(c[i>>2]|0)+1;k=g+2|0;if((k|0)==(f|0)){l=f}else{if((a[g+3|0]|0)==0){m=(a[h+(d[k]|0)|0]|0)==10}else{m=0}l=m?g+4|0:k}c[b>>2]=-1;j=l;break a;break};case 5:{j=g+2|0;break a;break};case 7:{n=8;break a;break};case 10:{c[b>>2]=-1;c[i>>2]=(c[i>>2]|0)+1;j=g+2|0;break a;break};default:{n=15;break a}}}else{if(((e&255)-216|0)>>>0<4>>>0){n=8}else{n=15}}}while(0);if((n|0)==8){n=0;j=g+4|0}else if((n|0)==15){n=0;j=g+2|0}c[b>>2]=(c[b>>2]|0)+1;if(j>>>0<f>>>0){g=j}else{break}}return}function rf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;h=f-2|0;f=e+2|0;if((f|0)==(h|0)){i=1;return i|0}j=b+72|0;b=e;e=f;a:while(1){f=(a[b+3|0]|0)==0;if(!f){k=11;break}l=a[e]|0;b:do{switch(d[j+(l&255)|0]|0){case 21:{if(l<<24>>24==9){k=7;break a}break};case 26:case 22:{if(l<<24>>24>=0){break b}if(f){k=10}else{k=11;break a}break};case 25:case 24:case 27:case 13:case 31:case 32:case 34:case 35:case 17:case 14:case 15:case 9:case 10:case 18:case 16:case 33:case 30:case 19:{break};default:{k=10}}}while(0);if((k|0)==10){k=0;f=a[e]|0;if(!((f|0)==36|(f|0)==64)){k=11;break}}f=e+2|0;if((f|0)==(h|0)){i=1;k=12;break}else{b=e;e=f}}if((k|0)==7){c[g>>2]=e;i=0;return i|0}else if((k|0)==11){c[g>>2]=e;i=0;return i|0}else if((k|0)==12){return i|0}return 0}function sf(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=c[d>>2]|0;a:do{if((b|0)!=(e|0)){h=g;i=b;b:while(1){j=a[i]|0;k=a[i+1|0]|0;l=k&255;c:do{switch(l|0){case 0:{if(j<<24>>24<=-1){m=8;break c}n=c[f>>2]|0;if((n|0)==(g|0)){m=6;break b}c[f>>2]=n+1;a[n]=j;o=i;break};case 1:case 2:case 3:case 4:case 5:case 6:case 7:{m=8;break};case 216:case 217:case 218:case 219:{n=c[f>>2]|0;if((h-n|0)<4){m=15;break b}p=j&255;q=(l<<2&12|p>>>6)+1|0;c[f>>2]=n+1;a[n]=q>>>2|240;n=c[f>>2]|0;c[f>>2]=n+1;a[n]=p>>>2&15|q<<4&48|128;q=i+2|0;p=a[q]|0;n=j<<4&48|(p&255)>>>6|a[i+3|0]<<2&12|-128;r=c[f>>2]|0;c[f>>2]=r+1;a[r]=n;n=c[f>>2]|0;c[f>>2]=n+1;a[n]=p&63|-128;o=q;break};default:{q=c[f>>2]|0;if((h-q|0)<3){m=12;break b}c[f>>2]=q+1;a[q]=(k&255)>>>4|-32;q=c[f>>2]|0;c[f>>2]=q+1;a[q]=(j&255)>>>6|k<<2&60|-128;q=c[f>>2]|0;c[f>>2]=q+1;a[q]=j&63|-128;o=i}}}while(0);if((m|0)==8){m=0;l=c[f>>2]|0;if((h-l|0)<2){m=9;break}c[f>>2]=l+1;a[l]=(j&255)>>>6|k<<2|-64;l=c[f>>2]|0;c[f>>2]=l+1;a[l]=j&63|-128;o=i}l=o+2|0;if((l|0)==(e|0)){break a}else{i=l}}if((m|0)==6){c[d>>2]=i;return}else if((m|0)==9){c[d>>2]=i;return}else if((m|0)==12){c[d>>2]=i;return}else if((m|0)==15){c[d>>2]=i;return}}}while(0);c[d>>2]=e;return}function tf(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0;e=c[f>>2]|0;j=c[h>>2]|0;if((g-e|0)>(i-j|0)){k=(a[g-1|0]&-8)<<24>>24==-40?g-2|0:g}else{k=g}if((e|0)==(k|0)){return}else{l=e;m=j}while(1){if((m|0)==(i|0)){n=7;break}j=(d[l+1|0]|0)<<8|(d[l]|0);c[h>>2]=m+2;b[m>>1]=j;j=(c[f>>2]|0)+2|0;c[f>>2]=j;if((j|0)==(k|0)){n=7;break}l=j;m=c[h>>2]|0}if((n|0)==7){return}}function uf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((e|0)==(f|0)){h=-1;return h|0}i=a[e+1|0]|0;j=a[e]|0;a:do{if(i<<24>>24==0){k=j&255;l=b+72|0;switch(d[l+k|0]|0){case 6:{if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 29:{m=0;n=k;o=9;break a;break};case 7:{o=15;break a;break};case 19:{k=e+2|0;if((k|0)==(f|0)){h=-1;return h|0}do{if((a[e+3|0]|0)==0){p=a[k]|0;if(p<<24>>24!=120){if((a[l+(p&255)|0]|0)==25){q=k}else{break}while(1){r=q+2|0;if((r|0)==(f|0)){h=-1;o=54;break}if((a[q+3|0]|0)!=0){o=36;break}p=d[l+(d[r]|0)|0]|0;if((p|0)==25){q=r}else if((p|0)==18){o=35;break}else{o=36;break}}if((o|0)==35){c[g>>2]=q+4;h=10;return h|0}else if((o|0)==36){c[g>>2]=r;h=0;return h|0}else if((o|0)==54){return h|0}}p=e+4|0;if((p|0)==(f|0)){h=-1;return h|0}do{if((a[e+5|0]|0)==0){if(((d[l+(d[p]|0)|0]|0)-24|0)>>>0>=2>>>0){break}s=e+6|0;if((s|0)==(f|0)){h=-1;return h|0}else{t=p;u=s}while(1){if((a[t+3|0]|0)!=0){o=29;break}s=d[l+(d[u]|0)|0]|0;if((s|0)==18){o=28;break}else if(!((s|0)==25|(s|0)==24)){o=29;break}s=u+2|0;if((s|0)==(f|0)){h=-1;o=54;break}else{t=u;u=s}}if((o|0)==28){c[g>>2]=t+4;h=10;return h|0}else if((o|0)==29){c[g>>2]=u;h=0;return h|0}else if((o|0)==54){return h|0}}}while(0);c[g>>2]=p;h=0;return h|0}}while(0);c[g>>2]=k;h=0;return h|0};case 5:{if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 22:case 24:{break a;break};default:{o=37;break a}}}else{l=i&255;switch(l|0){case 220:case 221:case 222:case 223:{o=37;break a;break};case 216:case 217:case 218:case 219:{o=15;break a;break};case 255:{s=j&255;if((s-254|0)>>>0<2>>>0){o=37;break a}else{m=255;n=s;o=9;break a}break};default:{m=l;n=j&255;o=9;break a}}}}while(0);do{if((o|0)==9){if((1<<(n&31)&c[18232+((n>>>5|d[17968+m|0]<<3)<<2)>>2]|0)!=0){break}c[g>>2]=e;h=0;return h|0}else if((o|0)==15){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((o|0)==37){c[g>>2]=e;h=0;return h|0}}while(0);m=e+2|0;if((m|0)==(f|0)){h=-1;return h|0}n=b+72|0;b=e;e=m;b:while(1){m=a[b+3|0]|0;j=a[e]|0;c:do{if(m<<24>>24==0){i=j&255;switch(d[n+i|0]|0){case 5:{o=46;break b;break};case 7:{o=50;break b;break};case 18:{o=52;break b;break};case 29:{v=0;w=i;o=43;break};case 22:case 24:case 25:case 26:case 27:{break};case 6:{o=48;break b;break};default:{o=53;break b}}}else{i=m&255;switch(i|0){case 255:{u=j&255;if((u-254|0)>>>0<2>>>0){o=53;break b}else{v=255;w=u;o=43;break c}break};case 216:case 217:case 218:case 219:{o=50;break b;break};case 220:case 221:case 222:case 223:{o=53;break b;break};default:{v=i;w=j&255;o=43;break c}}}}while(0);if((o|0)==43){o=0;if((1<<(w&31)&c[18232+((w>>>5|d[19512+v|0]<<3)<<2)>>2]|0)==0){o=45;break}}j=e+2|0;if((j|0)==(f|0)){h=-1;o=54;break}else{b=e;e=j}}if((o|0)==45){c[g>>2]=e;h=0;return h|0}else if((o|0)==46){if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((o|0)==48){if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((o|0)==50){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((o|0)==52){c[g>>2]=b+4;h=9;return h|0}else if((o|0)==53){c[g>>2]=e;h=0;return h|0}else if((o|0)==54){return h|0}return 0}function vf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((e|0)==(f|0)){h=-1;return h|0}i=a[e+1|0]|0;j=a[e]|0;a:do{if(i<<24>>24==0){k=j&255;switch(d[b+72+k|0]|0|0){case 22:case 24:{break a;break};case 21:case 10:case 9:case 30:{c[g>>2]=e;h=22;return h|0};case 5:{if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 7:{l=15;break a;break};case 29:{m=0;n=k;l=9;break a;break};case 6:{if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};default:{l=18;break a}}}else{k=i&255;switch(k|0){case 220:case 221:case 222:case 223:{l=18;break a;break};case 216:case 217:case 218:case 219:{l=15;break a;break};case 255:{o=j&255;if((o-254|0)>>>0<2>>>0){l=18;break a}else{m=255;n=o;l=9;break a}break};default:{m=k;n=j&255;l=9;break a}}}}while(0);do{if((l|0)==9){if((1<<(n&31)&c[18232+((n>>>5|(d[17968+m|0]|0)<<3)<<2)>>2]|0)!=0){break}c[g>>2]=e;h=0;return h|0}else if((l|0)==15){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((l|0)==18){c[g>>2]=e;h=0;return h|0}}while(0);m=e+2|0;if((m|0)==(f|0)){h=-1;return h|0}n=b+72|0;b=e;e=m;b:while(1){m=a[b+3|0]|0;j=a[e]|0;c:do{if(m<<24>>24==0){i=j&255;switch(d[n+i|0]|0|0){case 7:{l=31;break b;break};case 29:{p=0;q=i;l=24;break};case 22:case 24:case 25:case 26:case 27:{break};case 5:{l=27;break b;break};case 6:{l=29;break b;break};case 18:{l=33;break b;break};default:{l=34;break b}}}else{i=m&255;switch(i|0){case 216:case 217:case 218:case 219:{l=31;break b;break};case 255:{k=j&255;if((k-254|0)>>>0<2>>>0){l=34;break b}else{p=255;q=k;l=24;break c}break};case 220:case 221:case 222:case 223:{l=34;break b;break};default:{p=i;q=j&255;l=24;break c}}}}while(0);if((l|0)==24){l=0;if((1<<(q&31)&c[18232+((q>>>5|(d[19512+p|0]|0)<<3)<<2)>>2]|0)==0){l=26;break}}j=e+2|0;if((j|0)==(f|0)){h=-1;l=35;break}else{b=e;e=j}}if((l|0)==26){c[g>>2]=e;h=0;return h|0}else if((l|0)==27){if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((l|0)==29){if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((l|0)==31){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((l|0)==33){c[g>>2]=b+4;h=28;return h|0}else if((l|0)==34){c[g>>2]=e;h=0;return h|0}else if((l|0)==35){return h|0}return 0}function wf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((e|0)==(f|0)){h=-1;return h|0}do{if((a[e+1|0]|0)==0){if((a[e]|0)!=45){break}i=e+2|0;if((i|0)==(f|0)){h=-1;return h|0}j=b+72|0;k=f;l=i;a:while(1){i=a[l+1|0]|0;m=a[l]|0;b:do{if(i<<24>>24==0){switch(d[j+(m&255)|0]|0){case 7:{n=15;break b;break};case 5:{if((k-l|0)<2){h=-2;n=28;break a}o=l+2|0;break b;break};case 0:case 1:case 8:{n=17;break a;break};case 6:{if((k-l|0)<3){h=-2;n=28;break a}o=l+3|0;break b;break};case 27:{p=l+2|0;if((p|0)==(f|0)){h=-1;n=28;break a}if((a[l+3|0]|0)!=0){o=p;break b}if((a[p]|0)==45){n=22;break a}else{o=p;break b}break};default:{n=27;break b}}}else{switch(i&255|0){case 216:case 217:case 218:case 219:{n=15;break b;break};case 220:case 221:case 222:case 223:{n=17;break a;break};case 255:{break};default:{n=27;break b}}if(((m&255)-254|0)>>>0<2>>>0){n=17;break a}else{n=27}}}while(0);if((n|0)==15){n=0;if((k-l|0)<4){h=-2;n=28;break}o=l+4|0}else if((n|0)==27){n=0;o=l+2|0}if((o|0)==(f|0)){h=-1;n=28;break}else{l=o}}if((n|0)==17){c[g>>2]=l;h=0;return h|0}else if((n|0)==22){k=l+4|0;if((k|0)==(f|0)){h=-1;return h|0}do{if((a[l+5|0]|0)==0){if((a[k]|0)!=62){break}c[g>>2]=l+6;h=13;return h|0}}while(0);c[g>>2]=k;h=0;return h|0}else if((n|0)==28){return h|0}}}while(0);c[g>>2]=e;h=0;return h|0}
-
-
-
-function xf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;if((e|0)==(f|0)){h=-1;return h|0}i=a[e+1|0]|0;j=i<<24>>24==0;k=a[e]|0;a:do{if(j){l=k&255;switch(d[b+72+l|0]|0){case 5:{if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 7:{m=15;break a;break};case 29:{n=0;o=l;m=9;break a;break};case 6:{if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 22:case 24:{break a;break};default:{m=17;break a}}}else{l=i&255;switch(l|0){case 216:case 217:case 218:case 219:{m=15;break a;break};case 220:case 221:case 222:case 223:{m=17;break a;break};case 255:{p=k&255;if((p-254|0)>>>0<2>>>0){m=17;break a}else{n=255;o=p;m=9;break a}break};default:{n=l;o=k&255;m=9;break a}}}}while(0);do{if((m|0)==9){if((1<<(o&31)&c[18232+((o>>>5|d[17968+n|0]<<3)<<2)>>2]|0)!=0){break}c[g>>2]=e;h=0;return h|0}else if((m|0)==15){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((m|0)==17){c[g>>2]=e;h=0;return h|0}}while(0);n=e+2|0;if((n|0)==(f|0)){h=-1;return h|0}o=b+72|0;b=e;i=n;b:while(1){l=a[b+3|0]|0;p=a[i]|0;c:do{if(l<<24>>24==0){q=p&255;switch(d[o+q|0]|0){case 21:case 9:case 10:{m=32;break b;break};case 15:{m=61;break b;break};case 22:case 24:case 25:case 26:case 27:{break};case 5:{m=26;break b;break};case 29:{r=0;s=q;m=23;break};case 7:{m=30;break b;break};case 6:{m=28;break b;break};default:{t=i;break b}}}else{q=l&255;switch(q|0){case 255:{u=p&255;if((u-254|0)>>>0<2>>>0){t=i;break b}else{r=255;s=u;m=23;break c}break};case 220:case 221:case 222:case 223:{t=i;break b;break};case 216:case 217:case 218:case 219:{m=30;break b;break};default:{r=q;s=p&255;m=23;break c}}}}while(0);if((m|0)==23){m=0;if((1<<(s&31)&c[18232+((s>>>5|d[19512+r|0]<<3)<<2)>>2]|0)==0){m=25;break}}p=i+2|0;if((p|0)==(f|0)){h=-1;m=76;break}else{b=i;i=p}}do{if((m|0)==25){c[g>>2]=i;h=0;return h|0}else if((m|0)==26){if((f-i|0)<2){h=-2;return h|0}c[g>>2]=i;h=0;return h|0}else if((m|0)==28){if((f-i|0)<3){h=-2;return h|0}c[g>>2]=i;h=0;return h|0}else if((m|0)==30){if((f-i|0)<4){h=-2;return h|0}c[g>>2]=i;h=0;return h|0}else if((m|0)==32){do{if((i-e|0)!=6|j^1){v=11}else{r=k<<24>>24;if((r|0)==120){w=0}else if((r|0)==88){w=1}else{v=11;break}if((a[e+3|0]|0)!=0){v=11;break}r=a[n]|0;if((r|0)==77){x=1}else if((r|0)==109){x=w}else{v=11;break}if((a[e+5|0]|0)!=0){v=11;break}r=a[e+4|0]|0;if((r|0)==108){if((x|0)==0){v=12;break}}else if((r|0)!=76){v=11;break}c[g>>2]=i;h=0;return h|0}}while(0);r=b+4|0;if((r|0)==(f|0)){h=-1;return h|0}s=f;p=r;d:while(1){r=a[p+1|0]|0;l=a[p]|0;e:do{if(r<<24>>24==0){switch(d[o+(l&255)|0]|0){case 15:{q=p+2|0;if((q|0)==(f|0)){h=-1;m=76;break d}if((a[p+3|0]|0)!=0){y=q;break e}if((a[q]|0)==62){m=59;break d}else{y=q;break e}break};case 5:{if((s-p|0)<2){h=-2;m=76;break d}y=p+2|0;break e;break};case 0:case 1:case 8:{m=54;break d;break};case 6:{if((s-p|0)<3){h=-2;m=76;break d}y=p+3|0;break e;break};case 7:{m=52;break e;break};default:{m=60;break e}}}else{switch(r&255|0){case 255:{break};case 220:case 221:case 222:case 223:{m=54;break d;break};case 216:case 217:case 218:case 219:{m=52;break e;break};default:{m=60;break e}}if(((l&255)-254|0)>>>0<2>>>0){m=54;break d}else{m=60}}}while(0);if((m|0)==52){m=0;if((s-p|0)<4){h=-2;m=76;break}y=p+4|0}else if((m|0)==60){m=0;y=p+2|0}if((y|0)==(f|0)){h=-1;m=76;break}else{p=y}}if((m|0)==54){c[g>>2]=p;h=0;return h|0}else if((m|0)==59){c[g>>2]=p+4;h=v;return h|0}else if((m|0)==76){return h|0}}else if((m|0)==61){do{if((i-e|0)!=6|j^1){z=11}else{s=k<<24>>24;if((s|0)==88){A=1}else if((s|0)==120){A=0}else{z=11;break}if((a[e+3|0]|0)!=0){z=11;break}s=a[n]|0;if((s|0)==77){B=1}else if((s|0)==109){B=A}else{z=11;break}if((a[e+5|0]|0)!=0){z=11;break}s=a[e+4|0]|0;if((s|0)==108){if((B|0)==0){z=12;break}}else if((s|0)!=76){z=11;break}c[g>>2]=i;h=0;return h|0}}while(0);p=b+4|0;if((p|0)==(f|0)){h=-1;return h|0}if((a[b+5|0]|0)!=0){t=p;break}if((a[p]|0)!=62){t=p;break}c[g>>2]=b+6;h=z;return h|0}else if((m|0)==76){return h|0}}while(0);c[g>>2]=t;h=0;return h|0}function yf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;if((e|0)==(f|0)){h=-4;return h|0}i=e;j=f-i|0;do{if((j&1|0)==0){k=f}else{l=j&-2;if((l|0)==0){h=-1;return h|0}else{k=e+l|0;break}}}while(0);j=a[e]|0;f=a[e+1|0]|0;a:do{if(j<<24>>24==0){l=f&255;m=b+72|0;b:do{switch(d[m+l|0]|0){case 5:{if((k-i|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 6:{if((k-i|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 9:{if((e+2|0)!=(k|0)){break b}c[g>>2]=k;h=-15;return h|0};case 13:{n=e+2|0;if((n|0)==(k|0)){h=-1;return h|0}o=k;p=n;c:while(1){n=a[p]|0;q=a[p+1|0]|0;d:do{if(n<<24>>24==0){r=a[m+(q&255)|0]|0;switch(r&255|0){case 0:case 1:case 8:{s=43;break c;break};case 7:{s=41;break d;break};case 12:case 13:{t=p+2|0;if(r<<24>>24==13){s=45;break c}else{u=t;break d}break};case 5:{if((o-p|0)<2){h=-2;s=175;break c}u=p+2|0;break d;break};case 6:{if((o-p|0)<3){h=-2;s=175;break c}u=p+3|0;break d;break};default:{s=49;break d}}}else{switch(n&255|0){case 220:case 221:case 222:case 223:{s=43;break c;break};case 216:case 217:case 218:case 219:{s=41;break d;break};case 255:{break};default:{s=49;break d}}if(((q&255)-254|0)>>>0<2>>>0){s=43;break c}else{s=49}}}while(0);if((s|0)==41){s=0;if((o-p|0)<4){h=-2;s=175;break}u=p+4|0}else if((s|0)==49){s=0;u=p+2|0}if((u|0)==(k|0)){h=-1;s=175;break}else{p=u}}if((s|0)==43){c[g>>2]=p;h=0;return h|0}else if((s|0)==45){if((t|0)==(k|0)){h=-27;return h|0}c[g>>2]=t;e:do{if((a[t]|0)==0){switch(d[m+(d[p+3|0]|0)|0]|0){case 21:case 9:case 10:case 11:case 30:case 20:{h=27;break};default:{break e}}return h|0}}while(0);h=0;return h|0}else if((s|0)==175){return h|0}break};case 30:{h=Pf(b,e+2|0,k,g)|0;return h|0};case 12:{p=e+2|0;if((p|0)==(k|0)){h=-1;return h|0}o=k;q=p;f:while(1){p=a[q]|0;n=a[q+1|0]|0;g:do{if(p<<24>>24==0){r=a[m+(n&255)|0]|0;switch(r&255|0){case 5:{if((o-q|0)<2){h=-2;s=175;break f}v=q+2|0;break g;break};case 6:{if((o-q|0)<3){h=-2;s=175;break f}v=q+3|0;break g;break};case 12:case 13:{w=q+2|0;if(r<<24>>24==12){s=25;break f}else{v=w;break g}break};case 7:{s=21;break g;break};case 0:case 1:case 8:{s=23;break f;break};default:{s=29;break g}}}else{switch(p&255|0){case 255:{break};case 216:case 217:case 218:case 219:{s=21;break g;break};case 220:case 221:case 222:case 223:{s=23;break f;break};default:{s=29;break g}}if(((n&255)-254|0)>>>0<2>>>0){s=23;break f}else{s=29}}}while(0);if((s|0)==21){s=0;if((o-q|0)<4){h=-2;s=175;break}v=q+4|0}else if((s|0)==29){s=0;v=q+2|0}if((v|0)==(k|0)){h=-1;s=175;break}else{q=v}}if((s|0)==23){c[g>>2]=q;h=0;return h|0}else if((s|0)==25){if((w|0)==(k|0)){h=-27;return h|0}c[g>>2]=w;h:do{if((a[w]|0)==0){switch(d[m+(d[q+3|0]|0)|0]|0){case 21:case 9:case 10:case 11:case 30:case 20:{h=27;break};default:{break h}}return h|0}}while(0);h=0;return h|0}else if((s|0)==175){return h|0}break};case 7:{s=141;break a;break};case 25:case 26:case 27:{x=19;break a;break};case 29:{y=0;z=l;s=144;break a;break};case 22:case 24:{x=18;break a;break};case 31:{c[g>>2]=e+2;h=23;return h|0};case 2:{q=e+2|0;if((q|0)==(k|0)){h=-1;return h|0}o=a[q]|0;n=a[e+3|0]|0;i:do{if(o<<24>>24==0){switch(d[m+(n&255)|0]|0){case 22:case 24:case 29:case 5:case 6:case 7:{s=73;break i;break};case 16:{break};case 15:{h=Rf(b,e+4|0,k,g)|0;return h|0};default:{s=74;break i}}p=e+4|0;if((p|0)==(k|0)){h=-1;return h|0}do{if((a[p]|0)==0){r=d[m+(d[e+5|0]|0)|0]|0;if((r|0)==20){c[g>>2]=e+6;h=33;return h|0}else if((r|0)==27){h=Qf(b,e+6|0,k,g)|0;return h|0}else if((r|0)==22|(r|0)==24){r=e+6|0;if((r|0)==(k|0)){h=-1;return h|0}else{A=p;B=r}j:while(1){if((a[B]|0)!=0){s=71;break}switch(d[m+(d[A+3|0]|0)|0]|0){case 30:{s=66;break j;break};case 21:case 9:case 10:{break j;break};case 22:case 24:{break};default:{s=71;break j}}r=B+2|0;if((r|0)==(k|0)){h=-1;s=175;break}else{A=B;B=r}}do{if((s|0)==66){r=A+4|0;if((r|0)==(k|0)){h=-1;return h|0}if((a[r]|0)!=0){break}r=d[m+(d[A+5|0]|0)|0]|0;if(!((r|0)==21|(r|0)==9|(r|0)==10|(r|0)==30)){break}c[g>>2]=B;h=0;return h|0}else if((s|0)==71){c[g>>2]=B;h=0;return h|0}else if((s|0)==175){return h|0}}while(0);c[g>>2]=B;h=16;return h|0}else{break}}}while(0);c[g>>2]=p;h=0;return h|0}else{switch(o&255|0){case 223:case 222:case 221:case 220:{s=74;break i;break};case 255:{break};default:{s=73;break i}}if(((n&255)-254|0)>>>0<2>>>0){s=74}else{s=73}}}while(0);if((s|0)==73){c[g>>2]=e;h=29;return h|0}else if((s|0)==74){c[g>>2]=q;h=0;return h|0}break};case 19:{n=e+2|0;if((n|0)==(k|0)){h=-1;return h|0}o=a[n]|0;r=a[e+3|0]|0;k:do{if(o<<24>>24==0){C=r&255;switch(d[m+C|0]|0){case 22:case 24:{break k;break};case 6:{if((k-n|0)<3){h=-2;return h|0}c[g>>2]=n;h=0;return h|0};case 29:{D=0;E=C;s=112;break k;break};case 5:{if((k-n|0)<2){h=-2;return h|0}c[g>>2]=n;h=0;return h|0};case 7:{s=118;break k;break};default:{s=120;break k}}}else{C=o&255;switch(C|0){case 216:case 217:case 218:case 219:{s=118;break k;break};case 255:{F=r&255;if((F-254|0)>>>0<2>>>0){s=120;break k}else{D=255;E=F;s=112;break k}break};case 220:case 221:case 222:case 223:{s=120;break k;break};default:{D=C;E=r&255;s=112;break k}}}}while(0);do{if((s|0)==112){if((c[18232+((d[17968+D|0]<<3|E>>>5)<<2)>>2]&1<<(E&31)|0)!=0){break}c[g>>2]=n;h=0;return h|0}else if((s|0)==118){if((k-n|0)<4){h=-2;return h|0}c[g>>2]=n;h=0;return h|0}else if((s|0)==120){c[g>>2]=n;h=0;return h|0}}while(0);r=e+4|0;if((r|0)==(k|0)){h=-20;return h|0}else{G=n;H=r}l:while(1){r=a[H]|0;o=a[G+3|0]|0;m:do{if(r<<24>>24==0){q=o&255;switch(d[m+q|0]|0){case 29:{I=0;J=q;s=126;break};case 22:case 24:case 25:case 26:case 27:{break};case 7:{s=133;break l;break};case 5:{s=129;break l;break};case 9:case 10:case 21:case 32:case 11:case 30:case 36:{s=135;break l;break};case 6:{s=131;break l;break};default:{s=136;break l}}}else{q=r&255;switch(q|0){case 216:case 217:case 218:case 219:{s=133;break l;break};case 220:case 221:case 222:case 223:{s=136;break l;break};case 255:{C=o&255;if((C-254|0)>>>0<2>>>0){s=136;break l}else{I=255;J=C;s=126;break m}break};default:{I=q;J=o&255;s=126;break m}}}}while(0);if((s|0)==126){s=0;if((c[18232+((d[19512+I|0]<<3|J>>>5)<<2)>>2]&1<<(J&31)|0)==0){s=128;break}}o=H+2|0;if((o|0)==(k|0)){h=-20;s=175;break}else{G=H;H=o}}if((s|0)==128){c[g>>2]=H;h=0;return h|0}else if((s|0)==129){if((k-H|0)<2){h=-2;return h|0}c[g>>2]=H;h=0;return h|0}else if((s|0)==131){if((k-H|0)<3){h=-2;return h|0}c[g>>2]=H;h=0;return h|0}else if((s|0)==133){if((k-H|0)<4){h=-2;return h|0}c[g>>2]=H;h=0;return h|0}else if((s|0)==135){c[g>>2]=H;h=20;return h|0}else if((s|0)==136){c[g>>2]=H;h=0;return h|0}else if((s|0)==175){return h|0}break};case 35:{c[g>>2]=e+2;h=38;return h|0};case 20:{c[g>>2]=e+2;h=25;return h|0};case 32:{n=e+2|0;if((n|0)==(k|0)){h=-24;return h|0}n:do{if((a[n]|0)==0){switch(d[m+(d[e+3|0]|0)|0]|0){case 34:{c[g>>2]=e+4;h=37;return h|0};case 9:case 10:case 21:case 11:case 35:case 36:case 32:{c[g>>2]=n;h=24;return h|0};case 33:{c[g>>2]=e+4;h=36;return h|0};case 15:{c[g>>2]=e+4;h=35;return h|0};default:{break n}}}}while(0);c[g>>2]=n;h=0;return h|0};case 4:{o=e+2|0;if((o|0)==(k|0)){h=-26;return h|0}do{if((a[o]|0)==0){if((a[e+3|0]|0)!=93){break}r=e+4|0;if((r|0)==(k|0)){h=-1;return h|0}if((a[r]|0)!=0){break}if((a[e+5|0]|0)!=62){break}c[g>>2]=e+6;h=34;return h|0}}while(0);c[g>>2]=o;h=26;return h|0};case 21:case 10:{break};case 36:{c[g>>2]=e+2;h=21;return h|0};case 11:{c[g>>2]=e+2;h=17;return h|0};default:{s=148;break a}}}while(0);l=e+2|0;o:do{if((l|0)!=(k|0)){n=e;r=l;while(1){if((a[r]|0)!=0){break}p=d[m+(d[n+3|0]|0)|0]|0;if((p|0)==9){if((n+4|0)==(k|0)){break}}else if(!((p|0)==21|(p|0)==10)){break}p=r+2|0;if((p|0)==(k|0)){break o}else{n=r;r=p}}c[g>>2]=r;h=15;return h|0}}while(0);c[g>>2]=k;h=15;return h|0}else{m=j&255;switch(m|0){case 220:case 221:case 222:case 223:{s=148;break a;break};case 216:case 217:case 218:case 219:{s=141;break a;break};case 255:{l=f&255;if((l-254|0)>>>0<2>>>0){s=148;break a}else{y=255;z=l;s=144;break a}break};default:{y=m;z=f&255;s=144;break a}}}}while(0);do{if((s|0)==141){if((k-i|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((s|0)==144){f=z>>>5;j=1<<(z&31);if((j&c[18232+((f|d[17968+y|0]<<3)<<2)>>2]|0)!=0){x=18;break}if((c[18232+((d[19512+y|0]<<3|f)<<2)>>2]&j|0)==0){s=148}else{x=19}}}while(0);if((s|0)==148){c[g>>2]=e;h=0;return h|0}y=e+2|0;p:do{if((y|0)!=(k|0)){z=b+72|0;i=e;j=y;q:while(1){f=a[j]|0;H=a[i+3|0]|0;r:do{if(f<<24>>24==0){G=H&255;switch(d[z+G|0]|0){case 5:{s=157;break q;break};case 34:{s=164;break q;break};case 33:{s=167;break q;break};case 6:{s=159;break q;break};case 7:{s=161;break q;break};case 11:case 32:case 35:case 36:case 20:case 30:case 21:case 9:case 10:{s=163;break q;break};case 29:{K=0;L=G;s=154;break};case 22:case 24:case 25:case 26:case 27:{break};case 15:{s=170;break q;break};default:{s=173;break q}}}else{G=f&255;switch(G|0){case 216:case 217:case 218:case 219:{s=161;break q;break};case 255:{J=H&255;if((J-254|0)>>>0<2>>>0){s=173;break q}else{K=255;L=J;s=154;break r}break};case 220:case 221:case 222:case 223:{s=173;break q;break};default:{K=G;L=H&255;s=154;break r}}}}while(0);if((s|0)==154){s=0;if((1<<(L&31)&c[18232+((L>>>5|d[19512+K|0]<<3)<<2)>>2]|0)==0){s=156;break}}H=j+2|0;if((H|0)==(k|0)){break p}else{i=j;j=H}}if((s|0)==156){c[g>>2]=j;h=0;return h|0}else if((s|0)==157){if((k-j|0)<2){h=-2;return h|0}c[g>>2]=j;h=0;return h|0}else if((s|0)==159){if((k-j|0)<3){h=-2;return h|0}c[g>>2]=j;h=0;return h|0}else if((s|0)==161){if((k-j|0)<4){h=-2;return h|0}c[g>>2]=j;h=0;return h|0}else if((s|0)==163){c[g>>2]=j;h=x;return h|0}else if((s|0)==164){if((x|0)==19){c[g>>2]=j;h=0;return h|0}else{c[g>>2]=i+4;h=32;return h|0}}else if((s|0)==167){if((x|0)==19){c[g>>2]=j;h=0;return h|0}else{c[g>>2]=i+4;h=31;return h|0}}else if((s|0)==170){if((x|0)==19){c[g>>2]=j;h=0;return h|0}else{c[g>>2]=i+4;h=30;return h|0}}else if((s|0)==173){c[g>>2]=j;h=0;return h|0}}}while(0);h=-x|0;return h|0}function zf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0;h=i;i=i+8|0;j=h|0;a:do{if((e|0)==(f|0)){k=-4}else{l=e;m=f-l|0;if((m&1|0)==0){n=f}else{o=m&-2;if((o|0)==0){k=-1;break}n=e+o|0}o=a[e]|0;m=a[e+1|0]|0;b:do{if(o<<24>>24==0){p=b+72|0;switch(d[p+(m&255)|0]|0){case 0:case 1:case 8:{q=207;break b;break};case 5:{if((n-l|0)<2){k=-2;break a}r=e+2|0;break b;break};case 10:{c[g>>2]=e+2;k=7;break a;break};case 4:{s=e+2|0;if((s|0)==(n|0)){k=-5;break a}if((a[s]|0)!=0){r=s;break b}if((a[e+3|0]|0)!=93){r=s;break b}t=e+4|0;if((t|0)==(n|0)){k=-5;break a}if((a[t]|0)!=0){r=s;break b}if((a[e+5|0]|0)!=62){r=s;break b}c[g>>2]=t;k=0;break a;break};case 3:{k=Of(b,e+2|0,n,g)|0;break a;break};case 2:{t=e+2|0;if((t|0)==(n|0)){k=-1;break a}s=a[t]|0;u=a[e+3|0]|0;c:do{if(s<<24>>24==0){v=u&255;switch(d[p+v|0]|0){case 16:{w=e+4|0;if((w|0)==(n|0)){k=-1;break a}do{if((a[w]|0)==0){x=d[p+(d[e+5|0]|0)|0]|0;if((x|0)==27){k=Qf(b,e+6|0,n,g)|0;break a}else if((x|0)!=20){break}x=e+6|0;if((n-x|0)<12){k=-1;break a}else{y=x;z=0}while(1){if((a[y]|0)!=0){q=31;break}if((a[y+1|0]|0)!=(a[17816+z|0]|0)){q=31;break}x=z+1|0;A=y+2|0;if((x|0)<6){y=A;z=x}else{q=33;break}}if((q|0)==31){c[g>>2]=y;k=0;break a}else if((q|0)==33){c[g>>2]=A;k=8;break a}}}while(0);c[g>>2]=w;k=0;break a;break};case 7:{q=22;break c;break};case 15:{k=Rf(b,e+4|0,n,g)|0;break a;break};case 17:{x=e+4|0;if((x|0)==(n|0)){k=-1;break a}B=a[x]|0;C=a[e+5|0]|0;d:do{if(B<<24>>24==0){D=C&255;switch(d[p+D|0]|0){case 22:case 24:{break d;break};case 29:{E=0;F=D;q=43;break d;break};case 5:{if((n-x|0)<2){k=-2;break a}c[g>>2]=x;k=0;break a;break};case 6:{if((n-x|0)<3){k=-2;break a}c[g>>2]=x;k=0;break a;break};case 7:{q=49;break d;break};default:{q=51;break d}}}else{D=B&255;switch(D|0){case 255:{G=C&255;if((G-254|0)>>>0<2>>>0){q=51;break d}else{E=255;F=G;q=43;break d}break};case 216:case 217:case 218:case 219:{q=49;break d;break};case 220:case 221:case 222:case 223:{q=51;break d;break};default:{E=D;F=C&255;q=43;break d}}}}while(0);do{if((q|0)==43){if((c[18232+((d[17968+E|0]<<3|F>>>5)<<2)>>2]&1<<(F&31)|0)!=0){break}c[g>>2]=x;k=0;break a}else if((q|0)==49){if((n-x|0)<4){k=-2;break a}c[g>>2]=x;k=0;break a}else if((q|0)==51){c[g>>2]=x;k=0;break a}}while(0);C=e+6|0;if((C|0)==(n|0)){k=-1;break a}else{H=x;I=C}e:while(1){C=a[I]|0;B=a[H+3|0]|0;f:do{if(C<<24>>24==0){w=B&255;switch(d[p+w|0]|0){case 7:{q=64;break e;break};case 11:{q=72;break e;break};case 29:{J=0;K=w;q=57;break};case 22:case 24:case 25:case 26:case 27:{break};case 5:{q=60;break e;break};case 6:{q=62;break e;break};case 21:case 9:case 10:{q=66;break e;break};default:{q=73;break e}}}else{w=C&255;switch(w|0){case 216:case 217:case 218:case 219:{q=64;break e;break};case 220:case 221:case 222:case 223:{q=73;break e;break};case 255:{D=B&255;if((D-254|0)>>>0<2>>>0){q=73;break e}else{J=255;K=D;q=57;break f}break};default:{J=w;K=B&255;q=57;break f}}}}while(0);if((q|0)==57){q=0;if((c[18232+((d[19512+J|0]<<3|K>>>5)<<2)>>2]&1<<(K&31)|0)==0){q=59;break}}B=I+2|0;if((B|0)==(n|0)){k=-1;break a}else{H=I;I=B}}if((q|0)==59){c[g>>2]=I;k=0;break a}else if((q|0)==60){if((n-I|0)<2){k=-2;break a}c[g>>2]=I;k=0;break a}else if((q|0)==62){if((n-I|0)<3){k=-2;break a}c[g>>2]=I;k=0;break a}else if((q|0)==64){if((n-I|0)<4){k=-2;break a}c[g>>2]=I;k=0;break a}else if((q|0)==66){x=H+4|0;if((x|0)==(n|0)){k=-1;break a}else{L=x}while(1){if((a[L]|0)!=0){q=70;break}x=d[p+(d[L+1|0]|0)|0]|0;if((x|0)==11){q=69;break}else if(!((x|0)==21|(x|0)==9|(x|0)==10)){q=70;break}x=L+2|0;if((x|0)==(n|0)){k=-1;break a}else{L=x}}if((q|0)==69){c[g>>2]=L+2;k=5;break a}else if((q|0)==70){c[g>>2]=L;k=0;break a}}else if((q|0)==72){c[g>>2]=H+4;k=5;break a}else if((q|0)==73){c[g>>2]=I;k=0;break a}break};case 22:case 24:{break c;break};case 5:{if((n-t|0)<2){k=-2;break a}c[g>>2]=t;k=0;break a;break};case 29:{M=0;N=v;q=16;break c;break};case 6:{if((n-t|0)<3){k=-2;break a}c[g>>2]=t;k=0;break a;break};default:{q=74;break c}}}else{x=s&255;switch(x|0){case 216:case 217:case 218:case 219:{q=22;break c;break};case 220:case 221:case 222:case 223:{q=74;break c;break};case 255:{B=u&255;if((B-254|0)>>>0<2>>>0){q=74;break c}else{M=255;N=B;q=16;break c}break};default:{M=x;N=u&255;q=16;break c}}}}while(0);do{if((q|0)==16){if((c[18232+((d[17968+M|0]<<3|N>>>5)<<2)>>2]&1<<(N&31)|0)!=0){break}c[g>>2]=t;k=0;break a}else if((q|0)==22){if((n-t|0)<4){k=-2;break a}c[g>>2]=t;k=0;break a}else if((q|0)==74){c[g>>2]=t;k=0;break a}}while(0);u=e+4|0;if((u|0)==(n|0)){k=-1;break a}else{O=t;P=u}g:while(1){u=a[P]|0;s=a[O+3|0]|0;h:do{if(u<<24>>24==0){x=s&255;switch(d[p+x|0]|0){case 17:{Q=P;break g;break};case 22:case 24:case 25:case 26:case 27:{break};case 5:{q=83;break g;break};case 29:{R=0;S=x;q=80;break};case 7:{q=87;break g;break};case 6:{q=85;break g;break};case 11:{T=P;q=181;break g;break};case 21:case 9:case 10:{q=89;break g;break};default:{q=187;break g}}}else{x=u&255;switch(x|0){case 255:{B=s&255;if((B-254|0)>>>0<2>>>0){q=187;break g}else{R=255;S=B;q=80;break h}break};case 220:case 221:case 222:case 223:{q=187;break g;break};case 216:case 217:case 218:case 219:{q=87;break g;break};default:{R=x;S=s&255;q=80;break h}}}}while(0);if((q|0)==80){q=0;if((c[18232+((d[19512+R|0]<<3|S>>>5)<<2)>>2]&1<<(S&31)|0)==0){q=82;break}}s=P+2|0;if((s|0)==(n|0)){k=-1;break a}else{O=P;P=s}}i:do{if((q|0)==82){c[g>>2]=P;k=0;break a}else if((q|0)==83){if((n-P|0)<2){k=-2;break a}c[g>>2]=P;k=0;break a}else if((q|0)==85){if((n-P|0)<3){k=-2;break a}c[g>>2]=P;k=0;break a}else if((q|0)==87){if((n-P|0)<4){k=-2;break a}c[g>>2]=P;k=0;break a}else if((q|0)==89){t=O+4|0;if((t|0)==(n|0)){k=-1;break a}else{U=t}j:while(1){V=a[U]|0;W=a[U+1|0]|0;if(V<<24>>24!=0){q=91;break}t=W&255;switch(d[p+t|0]|0){case 17:{Q=U;break i;break};case 22:case 24:{break j;break};case 6:{q=175;break j;break};case 21:case 9:case 10:{break};case 29:{X=0;Y=t;q=95;break j;break};case 7:{q=177;break j;break};case 11:{T=U;q=181;break i;break};case 5:{q=173;break j;break};default:{q=180;break j}}t=U+2|0;if((t|0)==(n|0)){k=-1;break a}else{U=t}}k:do{if((q|0)==91){t=V&255;switch(t|0){case 220:case 221:case 222:case 223:{q=180;break k;break};case 255:{s=W&255;if((s-254|0)>>>0<2>>>0){q=180;break k}else{X=255;Y=s;q=95;break k}break};case 216:case 217:case 218:case 219:{q=177;break k;break};default:{X=t;Y=W&255;q=95;break k}}}else if((q|0)==173){if((n-U|0)<2){k=-2;break a}c[g>>2]=U;k=0;break a}else if((q|0)==175){if((n-U|0)<3){k=-2;break a}c[g>>2]=U;k=0;break a}}while(0);do{if((q|0)==95){if((c[18232+((d[17968+X|0]<<3|Y>>>5)<<2)>>2]&1<<(Y&31)|0)!=0){break}c[g>>2]=U;k=0;break a}else if((q|0)==177){if((n-U|0)<4){k=-2;break a}c[g>>2]=U;k=0;break a}else if((q|0)==180){c[g>>2]=U;k=0;break a}}while(0);t=U+2|0;c[j>>2]=t;if((t|0)==(n|0)){k=-1;break a}s=n;u=t;l:while(1){t=a[u]|0;v=a[u+1|0]|0;m:do{if(t<<24>>24==0){x=v&255;n:do{switch(d[p+x|0]|0){case 21:case 9:case 10:{B=u+2|0;c[j>>2]=B;if((B|0)==(n|0)){k=-1;break a}else{Z=u;_=B}while(1){if((a[_]|0)!=0){q=116;break l}B=d[p+(d[Z+3|0]|0)|0]|0;if((B|0)==14){$=_;break n}else if(!((B|0)==21|(B|0)==10|(B|0)==9)){q=116;break l}B=_+2|0;c[j>>2]=B;if((B|0)==(n|0)){k=-1;break a}else{Z=_;_=B}}break};case 29:{aa=0;ba=x;q=105;break m;break};case 22:case 24:case 25:case 26:case 27:{ca=u;break m;break};case 14:{$=u;break};case 5:{q=107;break l;break};case 6:{q=109;break l;break};case 7:{q=111;break l;break};default:{q=172;break l}}}while(0);x=$+2|0;c[j>>2]=x;if((x|0)==(n|0)){k=-1;break a}else{da=$;ea=x}while(1){if((a[ea]|0)!=0){q=122;break l}fa=d[p+(d[da+3|0]|0)|0]|0;if((fa&254|0)==12){break}if(!((fa|0)==21|(fa|0)==10|(fa|0)==9)){q=122;break l}x=ea+2|0;c[j>>2]=x;if((x|0)==(n|0)){k=-1;break a}else{da=ea;ea=x}}x=ea+2|0;c[j>>2]=x;if((x|0)==(n|0)){k=-1;break a}else{ga=x}while(1){x=a[ga]|0;B=a[ga+1|0]|0;o:do{if(x<<24>>24==0){ha=d[p+(B&255)|0]|0}else{switch(x&255|0){case 220:case 221:case 222:case 223:{ha=8;break o;break};case 255:{if(((B&255)-254|0)>>>0<2>>>0){ha=0;break o}break};case 216:case 217:case 218:case 219:{ha=7;break o;break};default:{}}ha=29}}while(0);if((ha|0)==(fa|0)){break}switch(ha|0){case 6:{if((s-ga|0)<3){k=-2;break a}B=ga+3|0;c[j>>2]=B;ia=B;break};case 5:{if((s-ga|0)<2){k=-2;break a}B=ga+2|0;c[j>>2]=B;ia=B;break};case 7:{if((s-ga|0)<4){k=-2;break a}B=ga+4|0;c[j>>2]=B;ia=B;break};case 0:case 1:case 8:{q=138;break l;break};case 3:{ja=Of(b,ga+2|0,n,j)|0;if((ja|0)<1){q=142;break l}ia=c[j>>2]|0;break};case 2:{q=144;break l;break};default:{B=ga+2|0;c[j>>2]=B;ia=B}}if((ia|0)==(n|0)){k=-1;break a}else{ga=ia}}ka=ga+2|0;c[j>>2]=ka;if((ka|0)==(n|0)){k=-1;break a}if((a[ka]|0)!=0){q=150;break l}switch(d[p+(d[ga+3|0]|0)|0]|0){case 11:{la=ka;q=165;break l;break};case 17:{ma=ka;q=166;break l;break};case 21:case 9:case 10:{break};default:{q=150;break l}}B=ga+4|0;c[j>>2]=B;if((B|0)==(n|0)){k=-1;break a}else{na=ka;oa=B}p:while(1){pa=a[oa]|0;qa=a[na+3|0]|0;if(pa<<24>>24!=0){q=152;break}switch(d[p+(qa&255)|0]|0){case 21:case 9:case 10:{break};case 11:{la=oa;q=165;break l;break};case 17:{ma=oa;q=166;break l;break};case 7:{q=163;break l;break};case 22:case 24:{ca=oa;break m;break};case 5:{q=159;break l;break};case 29:{ra=0;break p;break};case 6:{q=161;break l;break};default:{q=171;break l}}B=oa+2|0;c[j>>2]=B;if((B|0)==(n|0)){k=-1;break a}else{na=oa;oa=B}}q:do{if((q|0)==152){q=0;B=pa&255;switch(B|0){case 216:case 217:case 218:case 219:{q=163;break l;break};case 255:{break};case 220:case 221:case 222:case 223:{q=171;break l;break};default:{ra=B;break q}}if(((qa&255)-254|0)>>>0<2>>>0){q=171;break l}else{ra=255}}}while(0);B=d[oa+1|0]|0;if((1<<(B&31)&c[18232+((B>>>5|d[17968+ra|0]<<3)<<2)>>2]|0)==0){q=157;break l}else{ca=oa}}else{B=t&255;switch(B|0){case 255:{x=v&255;if((x-254|0)>>>0<2>>>0){q=172;break l}else{aa=255;ba=x;q=105;break m}break};case 216:case 217:case 218:case 219:{q=111;break l;break};case 220:case 221:case 222:case 223:{q=172;break l;break};default:{aa=B;ba=v&255;q=105;break m}}}}while(0);if((q|0)==105){q=0;if((c[18232+((d[19512+aa|0]<<3|ba>>>5)<<2)>>2]&1<<(ba&31)|0)==0){q=106;break}else{ca=u}}v=ca+2|0;c[j>>2]=v;if((v|0)==(n|0)){k=-1;break a}else{u=v}}if((q|0)==106){c[g>>2]=u;k=0;break a}else if((q|0)==107){if((s-u|0)<2){k=-2;break a}c[g>>2]=u;k=0;break a}else if((q|0)==109){if((s-u|0)<3){k=-2;break a}c[g>>2]=u;k=0;break a}else if((q|0)==111){if((s-u|0)<4){k=-2;break a}c[g>>2]=u;k=0;break a}else if((q|0)==116){c[g>>2]=_;k=0;break a}else if((q|0)==122){c[g>>2]=ea;k=0;break a}else if((q|0)==138){c[g>>2]=ga;k=0;break a}else if((q|0)==142){if((ja|0)!=0){k=ja;break a}c[g>>2]=c[j>>2];k=0;break a}else if((q|0)==144){c[g>>2]=ga;k=0;break a}else if((q|0)==150){c[g>>2]=ka;k=0;break a}else if((q|0)==157){c[g>>2]=oa;k=0;break a}else if((q|0)==159){if((s-oa|0)<2){k=-2;break a}c[g>>2]=oa;k=0;break a}else if((q|0)==161){if((s-oa|0)<3){k=-2;break a}c[g>>2]=oa;k=0;break a}else if((q|0)==163){if((s-oa|0)<4){k=-2;break a}c[g>>2]=oa;k=0;break a}else if((q|0)==165){c[g>>2]=la+2;k=1;break a}else if((q|0)==166){v=ma+2|0;c[j>>2]=v;if((v|0)==(n|0)){k=-1;break a}do{if((a[v]|0)==0){if((a[ma+3|0]|0)!=62){break}c[g>>2]=ma+4;k=3;break a}}while(0);c[g>>2]=v;k=0;break a}else if((q|0)==171){c[g>>2]=oa;k=0;break a}else if((q|0)==172){c[g>>2]=u;k=0;break a}}else if((q|0)==187){c[g>>2]=P;k=0;break a}}while(0);if((q|0)==181){c[g>>2]=T+2;k=2;break a}s=Q+2|0;if((s|0)==(n|0)){k=-1;break a}do{if((a[s]|0)==0){if((a[Q+3|0]|0)!=62){break}c[g>>2]=Q+4;k=4;break a}}while(0);c[g>>2]=s;k=0;break a;break};case 9:{t=e+2|0;if((t|0)==(n|0)){k=-3;break a}if((a[t]|0)==0){sa=(a[p+(d[e+3|0]|0)|0]|0)==10}else{sa=0}c[g>>2]=sa?e+4|0:t;k=7;break a;break};case 6:{if((n-l|0)<3){k=-2;break a}r=e+3|0;break b;break};case 7:{q=205;break b;break};default:{q=208;break b}}}else{switch(o&255|0){case 255:{break};case 220:case 221:case 222:case 223:{q=207;break b;break};case 216:case 217:case 218:case 219:{q=205;break b;break};default:{q=208;break b}}if(((m&255)-254|0)>>>0<2>>>0){q=207}else{q=208}}}while(0);if((q|0)==205){if((n-l|0)<4){k=-2;break}r=e+4|0}else if((q|0)==207){c[g>>2]=e;k=0;break}else if((q|0)==208){r=e+2|0}r:do{if((r|0)!=(n|0)){m=b+72|0;o=n;t=r;s:while(1){B=a[t]|0;x=a[t+1|0]|0;t:do{if(B<<24>>24==0){switch(d[m+(x&255)|0]|0){case 5:{if((o-t|0)<2){q=216;break s}ta=t+2|0;break t;break};case 3:case 2:case 0:case 1:case 8:case 9:case 10:{q=231;break s;break};case 6:{if((o-t|0)<3){q=219;break s}ta=t+3|0;break t;break};case 7:{q=221;break t;break};case 4:{C=t+2|0;if((C|0)==(n|0)){q=231;break s}if((a[C]|0)!=0){ta=C;break t}if((a[t+3|0]|0)!=93){ta=C;break t}ua=t+4|0;if((ua|0)==(n|0)){q=231;break s}if((a[ua]|0)!=0){ta=C;break t}if((a[t+5|0]|0)==62){q=230;break s}else{ta=C;break t}break};default:{q=232;break t}}}else{switch(B&255|0){case 255:{break};case 220:case 221:case 222:case 223:{q=231;break s;break};case 216:case 217:case 218:case 219:{q=221;break t;break};default:{q=232;break t}}if(((x&255)-254|0)>>>0<2>>>0){q=231;break s}else{q=232}}}while(0);if((q|0)==221){q=0;if((o-t|0)<4){q=222;break}ta=t+4|0}else if((q|0)==232){q=0;ta=t+2|0}if((ta|0)==(n|0)){break r}else{t=ta}}if((q|0)==216){c[g>>2]=t;k=6;break a}else if((q|0)==219){c[g>>2]=t;k=6;break a}else if((q|0)==222){c[g>>2]=t;k=6;break a}else if((q|0)==230){c[g>>2]=ua;k=0;break a}else if((q|0)==231){c[g>>2]=t;k=6;break a}}}while(0);c[g>>2]=n;k=6}}while(0);i=h;return k|0}function Af(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((e|0)==(f|0)){h=-4;return h|0}i=e;j=f-i|0;do{if((j&1|0)==0){k=f}else{l=j&-2;if((l|0)==0){h=-1;return h|0}else{k=e+l|0;break}}}while(0);j=a[e]|0;f=a[e+1|0]|0;a:do{if(j<<24>>24==0){l=b+72|0;switch(d[l+(f&255)|0]|0){case 6:{if((k-i|0)<3){h=-2;return h|0}else{m=e+3|0;break a}break};case 9:{n=e+2|0;if((n|0)==(k|0)){h=-1;return h|0}if((a[n]|0)==0){o=(a[l+(d[e+3|0]|0)|0]|0)==10}else{o=0}c[g>>2]=o?e+4|0:n;h=7;return h|0};case 5:{if((k-i|0)<2){h=-2;return h|0}else{m=e+2|0;break a}break};case 4:{n=e+2|0;if((n|0)==(k|0)){h=-1;return h|0}if((a[n]|0)!=0){m=n;break a}if((a[e+3|0]|0)!=93){m=n;break a}l=e+4|0;if((l|0)==(k|0)){h=-1;return h|0}if((a[l]|0)!=0){m=n;break a}if((a[e+5|0]|0)!=62){m=n;break a}c[g>>2]=e+6;h=40;return h|0};case 10:{c[g>>2]=e+2;h=7;return h|0};case 7:{p=25;break a;break};case 0:case 1:case 8:{p=27;break a;break};default:{p=28;break a}}}else{switch(j&255|0){case 255:{break};case 216:case 217:case 218:case 219:{p=25;break a;break};case 220:case 221:case 222:case 223:{p=27;break a;break};default:{p=28;break a}}if(((f&255)-254|0)>>>0<2>>>0){p=27}else{p=28}}}while(0);do{if((p|0)==25){if((k-i|0)<4){h=-2;return h|0}else{m=e+4|0;break}}else if((p|0)==27){c[g>>2]=e;h=0;return h|0}else if((p|0)==28){m=e+2|0}}while(0);b:do{if((m|0)!=(k|0)){e=b+72|0;i=k;f=m;c:while(1){j=a[f]|0;o=a[f+1|0]|0;d:do{if(j<<24>>24==0){switch(d[e+(o&255)|0]|0){case 5:{if((i-f|0)<2){p=36;break c}q=f+2|0;break d;break};case 6:{if((i-f|0)<3){p=39;break c}q=f+3|0;break d;break};case 7:{p=41;break d;break};case 0:case 1:case 8:case 9:case 10:case 4:{p=44;break c;break};default:{p=45;break d}}}else{switch(j&255|0){case 255:{break};case 216:case 217:case 218:case 219:{p=41;break d;break};case 220:case 221:case 222:case 223:{p=44;break c;break};default:{p=45;break d}}if(((o&255)-254|0)>>>0<2>>>0){p=44;break c}else{p=45}}}while(0);if((p|0)==41){p=0;if((i-f|0)<4){p=42;break}q=f+4|0}else if((p|0)==45){p=0;q=f+2|0}if((q|0)==(k|0)){break b}else{f=q}}if((p|0)==36){c[g>>2]=f;h=6;return h|0}else if((p|0)==39){c[g>>2]=f;h=6;return h|0}else if((p|0)==42){c[g>>2]=f;h=6;return h|0}else if((p|0)==44){c[g>>2]=f;h=6;return h|0}}}while(0);c[g>>2]=k;h=6;return h|0}function Bf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;j=e;a:while(1){k=a[j]|0;b:do{if(k<<24>>24==0){switch(d[i+(d[j+1|0]|0)|0]|0){case 5:{l=j+2|0;break b;break};case 21:{m=22;break a;break};case 2:{m=12;break a;break};case 7:{m=8;break b;break};case 10:{m=13;break a;break};case 9:{m=16;break a;break};case 3:{m=9;break a;break};case 6:{l=j+3|0;break b;break};default:{m=25;break b}}}else{if(((k&255)-216|0)>>>0<4>>>0){m=8}else{m=25}}}while(0);if((m|0)==8){m=0;l=j+4|0}else if((m|0)==25){m=0;l=j+2|0}if((l|0)==(f|0)){m=27;break}else{j=l}}if((m|0)==9){if((j|0)==(e|0)){h=Of(b,e+2|0,f,g)|0;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((m|0)==12){c[g>>2]=j;h=0;return h|0}else if((m|0)==13){if((j|0)==(e|0)){c[g>>2]=e+2;h=7;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((m|0)==16){if((j|0)!=(e|0)){c[g>>2]=j;h=6;return h|0}b=e+2|0;if((b|0)==(f|0)){h=-3;return h|0}if((a[b]|0)==0){n=(a[i+(d[e+3|0]|0)|0]|0)==10}else{n=0}c[g>>2]=n?e+4|0:b;h=7;return h|0}else if((m|0)==22){if((j|0)==(e|0)){c[g>>2]=e+2;h=39;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((m|0)==27){c[g>>2]=f;h=6;return h|0}return 0}function Cf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;j=e;a:while(1){k=a[j]|0;b:do{if(k<<24>>24==0){switch(d[i+(d[j+1|0]|0)|0]|0){case 10:{l=15;break a;break};case 5:{m=j+2|0;break b;break};case 6:{m=j+3|0;break b;break};case 30:{l=12;break a;break};case 3:{l=9;break a;break};case 7:{l=8;break b;break};case 9:{l=18;break a;break};default:{l=24;break b}}}else{if(((k&255)-216|0)>>>0<4>>>0){l=8}else{l=24}}}while(0);if((l|0)==8){l=0;m=j+4|0}else if((l|0)==24){l=0;m=j+2|0}if((m|0)==(f|0)){l=26;break}else{j=m}}if((l|0)==9){if((j|0)==(e|0)){h=Of(b,e+2|0,f,g)|0;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==12){if((j|0)==(e|0)){m=Pf(b,e+2|0,f,g)|0;h=(m|0)==22?0:m;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==15){if((j|0)==(e|0)){c[g>>2]=e+2;h=7;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==18){if((j|0)!=(e|0)){c[g>>2]=j;h=6;return h|0}j=e+2|0;if((j|0)==(f|0)){h=-3;return h|0}if((a[j]|0)==0){n=(a[i+(d[e+3|0]|0)|0]|0)==10}else{n=0}c[g>>2]=n?e+4|0:j;h=7;return h|0}else if((l|0)==26){c[g>>2]=f;h=6;return h|0}return 0}function Df(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=b+72|0;b=e;e=c;a:while(1){c=a[e]|0;g=e+1|0;h=a[g]|0;b:do{if(c<<24>>24==0){switch(d[f+(h&255)|0]|0){case 29:case 22:case 24:case 25:case 26:case 27:{i=12;break};case 5:{j=b;k=e;l=0;i=10;break};case 7:{i=6;break};case 6:{m=b;n=e;o=0;i=8;break};default:{i=15;break a}}}else{switch(c&255|0){case 220:case 221:case 222:case 223:{i=15;break a;break};case 216:case 217:case 218:case 219:{i=6;break b;break};case 255:{break};default:{i=12;break b}}if(((h&255)-254|0)>>>0<2>>>0){i=15;break a}else{i=12}}}while(0);if((i|0)==6){i=0;if(c<<24>>24!=(a[b]|0)){p=0;i=20;break}m=b+1|0;n=g;o=h;i=8}else if((i|0)==12){i=0;if((a[b]|0)!=c<<24>>24){p=0;i=20;break}if((a[b+1|0]|0)==h<<24>>24){q=b;r=e}else{p=0;i=20;break}}if((i|0)==8){i=0;s=n+1|0;if(o<<24>>24!=(a[m]|0)){p=0;i=20;break}j=m+1|0;k=s;l=a[s]|0;i=10}if((i|0)==10){i=0;if(l<<24>>24!=(a[j]|0)){p=0;i=20;break}if((a[k+1|0]|0)==(a[j+1|0]|0)){q=j;r=k}else{p=0;i=20;break}}b=q+2|0;e=r+2|0}if((i|0)==15){r=a[b]|0;e=a[b+1|0]|0;c:do{if(r<<24>>24==0){switch(d[f+(e&255)|0]|0){case 5:case 6:case 7:case 29:case 22:case 24:case 25:case 26:case 27:{p=0;break};default:{break c}}return p|0}else{switch(r&255|0){case 255:{break};case 223:case 222:case 221:case 220:{break c;break};default:{p=0;return p|0}}if(((e&255)-254|0)>>>0<2>>>0){break}else{p=0}return p|0}}while(0);p=1;return p|0}else if((i|0)==20){return p|0}return 0}function Ef(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a[e]|0;f=(c|0)==(d|0);a:do{if(b<<24>>24==0){g=f}else{h=c;i=e;j=b;k=f;while(1){if(k){l=0;m=7;break}if((a[h]|0)!=0){l=0;m=7;break}if((a[h+1|0]|0)!=j<<24>>24){l=0;m=7;break}n=h+2|0;o=i+1|0;p=a[o]|0;q=(n|0)==(d|0);if(p<<24>>24==0){g=q;break a}else{h=n;i=o;j=p;k=q}}if((m|0)==7){return l|0}}}while(0);l=g&1;return l|0}function Ff(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0;e=b+72|0;b=c;a:while(1){f=a[b]|0;g=a[b+1|0]|0;b:do{if(f<<24>>24==0){switch(d[e+(g&255)|0]|0|0){case 6:{b=b+3|0;continue a;break};case 29:case 22:case 24:case 25:case 26:case 27:{h=9;break b;break};case 5:{b=b+2|0;continue a;break};case 7:{h=8;break b;break};default:{break a}}}else{switch(f&255|0){case 220:case 221:case 222:case 223:{break a;break};case 255:{break};case 216:case 217:case 218:case 219:{h=8;break b;break};default:{h=9;break b}}if(((g&255)-254|0)>>>0<2>>>0){break a}else{h=9}}}while(0);if((h|0)==8){h=0;b=b+4|0;continue}else if((h|0)==9){h=0;b=b+2|0;continue}}return b-c|0}function Gf(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;if((a[c]|0)!=0){e=c;return e|0}f=b+72|0;b=c;while(1){c=d[f+(d[b+1|0]|0)|0]|0;if(!((c|0)==10|(c|0)==9|(c|0)==21)){e=b;g=3;break}c=b+2|0;if((a[c]|0)==0){b=c}else{e=c;g=3;break}}if((g|0)==3){return e|0}return 0}function Hf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=b+72|0;b=0;i=0;j=1;k=e;a:while(1){e=k+2|0;l=a[e]|0;m=k+3|0;n=a[m]|0;b:do{if(l<<24>>24==0){switch(d[h+(n&255)|0]|0){case 6:{if((j|0)!=0){b=b;i=i;j=j;k=m;continue a}if((i|0)>=(f|0)){b=b;i=i;j=1;k=m;continue a}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=m;continue a;break};case 5:{if((j|0)!=0){b=b;i=i;j=j;k=e;continue a}if((i|0)>=(f|0)){b=b;i=i;j=1;k=e;continue a}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=e;continue a;break};case 7:{o=12;break b;break};case 9:case 10:{if((j|0)==1){b=b;i=i;j=0;k=e;continue a}if(!((j|0)==2&(i|0)<(f|0))){b=b;i=i;j=j;k=e;continue a}a[g+(i<<4)+12|0]=0;b=b;i=i;j=2;k=e;continue a;break};case 3:{if((i|0)>=(f|0)){b=b;i=i;j=j;k=e;continue a}a[g+(i<<4)+12|0]=0;b=b;i=i;j=j;k=e;continue a;break};case 13:{if((j|0)!=2){if((i|0)>=(f|0)){b=13;i=i;j=2;k=e;continue a}c[g+(i<<4)+4>>2]=k+4;b=13;i=i;j=2;k=e;continue a}if((b|0)!=13){b=b;i=i;j=2;k=e;continue a}if((i|0)<(f|0)){c[g+(i<<4)+8>>2]=e}b=13;i=i+1|0;j=0;k=e;continue a;break};case 11:case 17:{if((j|0)==2){b=b;i=i;j=2;k=e;continue a}else{break a}break};case 12:{if((j|0)!=2){if((i|0)>=(f|0)){b=12;i=i;j=2;k=e;continue a}c[g+(i<<4)+4>>2]=k+4;b=12;i=i;j=2;k=e;continue a}if((b|0)!=12){b=b;i=i;j=2;k=e;continue a}if((i|0)<(f|0)){c[g+(i<<4)+8>>2]=e}b=12;i=i+1|0;j=0;k=e;continue a;break};case 21:{if((j|0)==1){b=b;i=i;j=0;k=e;continue a}if(!((j|0)==2&(i|0)<(f|0))){b=b;i=i;j=j;k=e;continue a}p=g+(i<<4)+12|0;if((a[p]|0)==0){b=b;i=i;j=2;k=e;continue a}do{if((e|0)!=(c[g+(i<<4)+4>>2]|0)&n<<24>>24==32){q=a[k+4|0]|0;r=a[k+5|0]|0;if((q<<24>>24|0)==(-1|0)){if(((r&255)-254|0)>>>0<2>>>0){s=0}else{b=b;i=i;j=2;k=e;continue a}}else if((q<<24>>24|0)==0){if(r<<24>>24==32){break}s=d[h+(r&255)|0]|0}else{b=b;i=i;j=2;k=e;continue a}if((s|0)!=(b|0)){b=b;i=i;j=2;k=e;continue a}}}while(0);a[p]=0;b=b;i=i;j=2;k=e;continue a;break};case 29:case 22:case 24:{o=16;break b;break};default:{b=b;i=i;j=j;k=e;continue a}}}else{switch(l&255|0){case 216:case 217:case 218:case 219:{o=12;break b;break};case 255:{break};case 220:case 221:case 222:case 223:{b=b;i=i;j=j;k=e;continue a;break};default:{o=16;break b}}if(!(((n&255)-254|0)>>>0>1>>>0&(j|0)==0)){b=b;i=i;j=j;k=e;continue a}}}while(0);if((o|0)==12){o=0;do{if((j|0)==0){if((i|0)>=(f|0)){t=1;break}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;t=1}else{t=j}}while(0);b=b;i=i;j=t;k=k+4|0;continue}else if((o|0)==16){o=0;if((j|0)!=0){b=b;i=i;j=j;k=e;continue}}if((i|0)>=(f|0)){b=b;i=i;j=1;k=e;continue}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=e}return i|0}function If(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=c+4|0;d=a[b]|0;a:do{if(d<<24>>24==0){if((a[c+5|0]|0)!=120){e=b;f=0;g=0;h=11;break}i=c+6|0;j=0;while(1){b:do{if((a[i]|0)==0){k=a[i+1|0]|0;if(k<<24>>24==59){l=j;break a}m=k<<24>>24;switch(m|0){case 65:case 66:case 67:case 68:case 69:case 70:{n=(j<<4)-55+m|0;break b;break};case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:{n=m-48|j<<4;break b;break};case 97:case 98:case 99:case 100:case 101:case 102:{n=(j<<4)-87+m|0;break b;break};default:{n=j;break b}}}else{n=j}}while(0);if((n|0)>1114111){o=-1;break}else{i=i+2|0;j=n}}return o|0}else{e=b;f=0;g=d;h=11}}while(0);c:do{if((h|0)==11){while(1){h=0;if(g<<24>>24==0){d=a[e+1|0]|0;if(d<<24>>24==59){l=f;break c}p=(d<<24>>24)-48|0}else{p=-49}d=p+(f*10|0)|0;b=e+2|0;if((d|0)>1114111){o=-1;break}e=b;f=d;g=a[b]|0;h=11}return o|0}}while(0);d:do{switch(l>>8|0){case 0:{if((a[20496+l|0]|0)==0){o=-1}else{break d}return o|0};case 255:{if((l&-2|0)==65534){o=-1}else{break d}return o|0};case 216:case 217:case 218:case 219:case 220:case 221:case 222:case 223:{o=-1;return o|0};default:{}}}while(0);o=l;return o|0}function Jf(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;b=(d-c|0)/2|0;do{if((b|0)==2){if((a[c+2|0]|0)!=0){break}if((a[c+3|0]|0)!=116){break}if((a[c]|0)!=0){break}d=a[c+1|0]|0;if((d|0)==108){e=60;return e|0}else if((d|0)!=103){break}e=62;return e|0}else if((b|0)==3){if((a[c]|0)!=0){break}if((a[c+1|0]|0)!=97){break}if((a[c+2|0]|0)!=0){break}if((a[c+3|0]|0)!=109){break}if((a[c+4|0]|0)!=0){break}if((a[c+5|0]|0)==112){e=38}else{break}return e|0}else if((b|0)==4){if((a[c]|0)!=0){break}d=a[c+1|0]|0;if((d|0)==97){if((a[c+2|0]|0)!=0){break}if((a[c+3|0]|0)!=112){break}if((a[c+4|0]|0)!=0){break}if((a[c+5|0]|0)!=111){break}if((a[c+6|0]|0)!=0){break}if((a[c+7|0]|0)==115){e=39}else{break}return e|0}else if((d|0)==113){if((a[c+2|0]|0)!=0){break}if((a[c+3|0]|0)!=117){break}if((a[c+4|0]|0)!=0){break}if((a[c+5|0]|0)!=111){break}if((a[c+6|0]|0)!=0){break}if((a[c+7|0]|0)==116){e=34}else{break}return e|0}else{break}}}while(0);e=0;return e|0}function Kf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(e>>>0>=f>>>0){return}h=b+72|0;b=g+4|0;i=g|0;g=e;while(1){e=a[g]|0;a:do{if(e<<24>>24==0){switch(d[h+(d[g+1|0]|0)|0]|0){case 9:{c[i>>2]=(c[i>>2]|0)+1;j=g+2|0;if((j|0)==(f|0)){k=f}else{if((a[j]|0)==0){l=(a[h+(d[g+3|0]|0)|0]|0)==10}else{l=0}k=l?g+4|0:j}c[b>>2]=-1;m=k;break a;break};case 5:{m=g+2|0;break a;break};case 10:{c[b>>2]=-1;c[i>>2]=(c[i>>2]|0)+1;m=g+2|0;break a;break};case 7:{n=8;break a;break};case 6:{m=g+3|0;break a;break};default:{n=15;break a}}}else{if(((e&255)-216|0)>>>0<4>>>0){n=8}else{n=15}}}while(0);if((n|0)==8){n=0;m=g+4|0}else if((n|0)==15){n=0;m=g+2|0}c[b>>2]=(c[b>>2]|0)+1;if(m>>>0<f>>>0){g=m}else{break}}return}function Lf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;h=f-2|0;f=e+2|0;if((f|0)==(h|0)){i=1;return i|0}j=b+72|0;b=e;e=f;a:while(1){f=(a[e]|0)==0;k=b+3|0;if(!f){l=11;break}m=a[k]|0;b:do{switch(d[j+(m&255)|0]|0){case 25:case 24:case 27:case 13:case 31:case 32:case 34:case 35:case 17:case 14:case 15:case 9:case 10:case 18:case 16:case 33:case 30:case 19:{break};case 21:{if(m<<24>>24==9){l=7;break a}break};case 26:case 22:{if(m<<24>>24>=0){break b}if(f){l=10}else{l=11;break a}break};default:{l=10}}}while(0);if((l|0)==10){l=0;f=a[k]|0;if(!((f|0)==36|(f|0)==64)){l=11;break}}f=e+2|0;if((f|0)==(h|0)){i=1;l=12;break}else{b=e;e=f}}if((l|0)==7){c[g>>2]=e;i=0;return i|0}else if((l|0)==11){c[g>>2]=e;i=0;return i|0}else if((l|0)==12){return i|0}return 0}function Mf(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=c[d>>2]|0;a:do{if((b|0)!=(e|0)){h=g;i=b;b:while(1){j=a[i+1|0]|0;k=a[i]|0;l=k&255;c:do{switch(l|0){case 216:case 217:case 218:case 219:{m=c[f>>2]|0;if((h-m|0)<4){n=15;break b}o=j&255;p=(l<<2&12|o>>>6)+1|0;c[f>>2]=m+1;a[m]=p>>>2|240;m=c[f>>2]|0;c[f>>2]=m+1;a[m]=o>>>2&15|p<<4&48|128;p=i+2|0;o=a[i+3|0]|0;m=j<<4&48|(o&255)>>>6|a[p]<<2&12|-128;q=c[f>>2]|0;c[f>>2]=q+1;a[q]=m;m=c[f>>2]|0;c[f>>2]=m+1;a[m]=o&63|-128;r=p;break};case 1:case 2:case 3:case 4:case 5:case 6:case 7:{n=8;break};case 0:{if(j<<24>>24<=-1){n=8;break c}p=c[f>>2]|0;if((p|0)==(g|0)){n=6;break b}c[f>>2]=p+1;a[p]=j;r=i;break};default:{p=c[f>>2]|0;if((h-p|0)<3){n=12;break b}c[f>>2]=p+1;a[p]=(k&255)>>>4|-32;p=c[f>>2]|0;c[f>>2]=p+1;a[p]=(j&255)>>>6|k<<2&60|-128;p=c[f>>2]|0;c[f>>2]=p+1;a[p]=j&63|-128;r=i}}}while(0);if((n|0)==8){n=0;l=c[f>>2]|0;if((h-l|0)<2){n=9;break}c[f>>2]=l+1;a[l]=(j&255)>>>6|k<<2|-64;l=c[f>>2]|0;c[f>>2]=l+1;a[l]=j&63|-128;r=i}l=r+2|0;if((l|0)==(e|0)){break a}else{i=l}}if((n|0)==6){c[d>>2]=i;return}else if((n|0)==9){c[d>>2]=i;return}else if((n|0)==12){c[d>>2]=i;return}else if((n|0)==15){c[d>>2]=i;return}}}while(0);c[d>>2]=e;return}function Nf(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0;e=c[f>>2]|0;j=c[h>>2]|0;if((g-e|0)>(i-j|0)){k=g-2|0;l=(a[k]&-8)<<24>>24==-40?k:g}else{l=g}if((e|0)==(l|0)){return}else{m=e;n=j}while(1){if((n|0)==(i|0)){o=7;break}j=(d[m]|0)<<8|(d[m+1|0]|0);c[h>>2]=n+2;b[n>>1]=j;j=(c[f>>2]|0)+2|0;c[f>>2]=j;if((j|0)==(l|0)){o=7;break}m=j;n=c[h>>2]|0}if((o|0)==7){return}}function Of(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((e|0)==(f|0)){h=-1;return h|0}i=a[e]|0;j=a[e+1|0]|0;a:do{if(i<<24>>24==0){k=j&255;l=b+72|0;switch(d[l+k|0]|0){case 6:{if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 7:{m=15;break a;break};case 29:{n=0;o=k;m=9;break a;break};case 19:{k=e+2|0;if((k|0)==(f|0)){h=-1;return h|0}do{if((a[k]|0)==0){p=a[e+3|0]|0;if(p<<24>>24!=120){if((a[l+(p&255)|0]|0)==25){q=k}else{break}while(1){r=q+2|0;if((r|0)==(f|0)){h=-1;m=54;break}if((a[r]|0)!=0){m=36;break}p=d[l+(d[q+3|0]|0)|0]|0;if((p|0)==18){m=35;break}else if((p|0)==25){q=r}else{m=36;break}}if((m|0)==35){c[g>>2]=q+4;h=10;return h|0}else if((m|0)==36){c[g>>2]=r;h=0;return h|0}else if((m|0)==54){return h|0}}p=e+4|0;if((p|0)==(f|0)){h=-1;return h|0}do{if((a[p]|0)==0){if(((d[l+(d[e+5|0]|0)|0]|0)-24|0)>>>0>=2>>>0){break}s=e+6|0;if((s|0)==(f|0)){h=-1;return h|0}else{t=p;u=s}while(1){if((a[u]|0)!=0){m=29;break}s=d[l+(d[t+3|0]|0)|0]|0;if((s|0)==18){m=28;break}else if(!((s|0)==25|(s|0)==24)){m=29;break}s=u+2|0;if((s|0)==(f|0)){h=-1;m=54;break}else{t=u;u=s}}if((m|0)==28){c[g>>2]=t+4;h=10;return h|0}else if((m|0)==29){c[g>>2]=u;h=0;return h|0}else if((m|0)==54){return h|0}}}while(0);c[g>>2]=p;h=0;return h|0}}while(0);c[g>>2]=k;h=0;return h|0};case 5:{if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 22:case 24:{break a;break};default:{m=37;break a}}}else{l=i&255;switch(l|0){case 255:{s=j&255;if((s-254|0)>>>0<2>>>0){m=37;break a}else{n=255;o=s;m=9;break a}break};case 216:case 217:case 218:case 219:{m=15;break a;break};case 220:case 221:case 222:case 223:{m=37;break a;break};default:{n=l;o=j&255;m=9;break a}}}}while(0);do{if((m|0)==9){if((1<<(o&31)&c[18232+((o>>>5|d[17968+n|0]<<3)<<2)>>2]|0)!=0){break}c[g>>2]=e;h=0;return h|0}else if((m|0)==15){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((m|0)==37){c[g>>2]=e;h=0;return h|0}}while(0);n=e+2|0;if((n|0)==(f|0)){h=-1;return h|0}o=b+72|0;b=e;e=n;b:while(1){n=a[e]|0;j=a[b+3|0]|0;c:do{if(n<<24>>24==0){i=j&255;switch(d[o+i|0]|0){case 22:case 24:case 25:case 26:case 27:{break};case 6:{m=48;break b;break};case 5:{m=46;break b;break};case 7:{m=50;break b;break};case 29:{v=0;w=i;m=43;break};case 18:{m=52;break b;break};default:{m=53;break b}}}else{i=n&255;switch(i|0){case 216:case 217:case 218:case 219:{m=50;break b;break};case 220:case 221:case 222:case 223:{m=53;break b;break};case 255:{u=j&255;if((u-254|0)>>>0<2>>>0){m=53;break b}else{v=255;w=u;m=43;break c}break};default:{v=i;w=j&255;m=43;break c}}}}while(0);if((m|0)==43){m=0;if((1<<(w&31)&c[18232+((w>>>5|d[19512+v|0]<<3)<<2)>>2]|0)==0){m=45;break}}j=e+2|0;if((j|0)==(f|0)){h=-1;m=54;break}else{b=e;e=j}}if((m|0)==45){c[g>>2]=e;h=0;return h|0}else if((m|0)==46){if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((m|0)==48){if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((m|0)==50){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((m|0)==52){c[g>>2]=b+4;h=9;return h|0}else if((m|0)==53){c[g>>2]=e;h=0;return h|0}else if((m|0)==54){return h|0}return 0}function Pf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((e|0)==(f|0)){h=-1;return h|0}i=a[e]|0;j=a[e+1|0]|0;a:do{if(i<<24>>24==0){k=j&255;switch(d[b+72+k|0]|0|0){case 29:{l=0;m=k;n=9;break a;break};case 7:{n=15;break a;break};case 21:case 10:case 9:case 30:{c[g>>2]=e;h=22;return h|0};case 5:{if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 22:case 24:{break a;break};case 6:{if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};default:{n=18;break a}}}else{k=i&255;switch(k|0){case 216:case 217:case 218:case 219:{n=15;break a;break};case 255:{o=j&255;if((o-254|0)>>>0<2>>>0){n=18;break a}else{l=255;m=o;n=9;break a}break};case 220:case 221:case 222:case 223:{n=18;break a;break};default:{l=k;m=j&255;n=9;break a}}}}while(0);do{if((n|0)==9){if((1<<(m&31)&c[18232+((m>>>5|(d[17968+l|0]|0)<<3)<<2)>>2]|0)!=0){break}c[g>>2]=e;h=0;return h|0}else if((n|0)==15){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((n|0)==18){c[g>>2]=e;h=0;return h|0}}while(0);l=e+2|0;if((l|0)==(f|0)){h=-1;return h|0}m=b+72|0;b=e;e=l;b:while(1){l=a[e]|0;j=a[b+3|0]|0;c:do{if(l<<24>>24==0){i=j&255;switch(d[m+i|0]|0|0){case 7:{n=31;break b;break};case 18:{n=33;break b;break};case 6:{n=29;break b;break};case 5:{n=27;break b;break};case 29:{p=0;q=i;n=24;break};case 22:case 24:case 25:case 26:case 27:{break};default:{n=34;break b}}}else{i=l&255;switch(i|0){case 216:case 217:case 218:case 219:{n=31;break b;break};case 220:case 221:case 222:case 223:{n=34;break b;break};case 255:{k=j&255;if((k-254|0)>>>0<2>>>0){n=34;break b}else{p=255;q=k;n=24;break c}break};default:{p=i;q=j&255;n=24;break c}}}}while(0);if((n|0)==24){n=0;if((1<<(q&31)&c[18232+((q>>>5|(d[19512+p|0]|0)<<3)<<2)>>2]|0)==0){n=26;break}}j=e+2|0;if((j|0)==(f|0)){h=-1;n=35;break}else{b=e;e=j}}if((n|0)==26){c[g>>2]=e;h=0;return h|0}else if((n|0)==27){if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((n|0)==29){if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((n|0)==31){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((n|0)==33){c[g>>2]=b+4;h=28;return h|0}else if((n|0)==34){c[g>>2]=e;h=0;return h|0}else if((n|0)==35){return h|0}return 0}function Qf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((e|0)==(f|0)){h=-1;return h|0}do{if((a[e]|0)==0){if((a[e+1|0]|0)!=45){break}i=e+2|0;if((i|0)==(f|0)){h=-1;return h|0}j=b+72|0;k=f;l=i;a:while(1){i=a[l]|0;m=a[l+1|0]|0;b:do{if(i<<24>>24==0){switch(d[j+(m&255)|0]|0){case 7:{n=15;break b;break};case 0:case 1:case 8:{n=17;break a;break};case 27:{o=l+2|0;if((o|0)==(f|0)){h=-1;n=28;break a}if((a[o]|0)!=0){p=o;break b}if((a[l+3|0]|0)==45){n=22;break a}else{p=o;break b}break};case 5:{if((k-l|0)<2){h=-2;n=28;break a}p=l+2|0;break b;break};case 6:{if((k-l|0)<3){h=-2;n=28;break a}p=l+3|0;break b;break};default:{n=27;break b}}}else{switch(i&255|0){case 216:case 217:case 218:case 219:{n=15;break b;break};case 220:case 221:case 222:case 223:{n=17;break a;break};case 255:{break};default:{n=27;break b}}if(((m&255)-254|0)>>>0<2>>>0){n=17;break a}else{n=27}}}while(0);if((n|0)==15){n=0;if((k-l|0)<4){h=-2;n=28;break}p=l+4|0}else if((n|0)==27){n=0;p=l+2|0}if((p|0)==(f|0)){h=-1;n=28;break}else{l=p}}if((n|0)==17){c[g>>2]=l;h=0;return h|0}else if((n|0)==22){k=l+4|0;if((k|0)==(f|0)){h=-1;return h|0}do{if((a[k]|0)==0){if((a[l+5|0]|0)!=62){break}c[g>>2]=l+6;h=13;return h|0}}while(0);c[g>>2]=k;h=0;return h|0}else if((n|0)==28){return h|0}}}while(0);c[g>>2]=e;h=0;return h|0}function Rf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;if((e|0)==(f|0)){h=-1;return h|0}i=a[e]|0;j=i<<24>>24==0;k=a[e+1|0]|0;a:do{if(j){l=k&255;switch(d[b+72+l|0]|0){case 22:case 24:{break a;break};case 7:{m=15;break a;break};case 6:{if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 5:{if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 29:{n=0;o=l;m=9;break a;break};default:{m=17;break a}}}else{l=i&255;switch(l|0){case 216:case 217:case 218:case 219:{m=15;break a;break};case 255:{p=k&255;if((p-254|0)>>>0<2>>>0){m=17;break a}else{n=255;o=p;m=9;break a}break};case 220:case 221:case 222:case 223:{m=17;break a;break};default:{n=l;o=k&255;m=9;break a}}}}while(0);do{if((m|0)==9){if((1<<(o&31)&c[18232+((o>>>5|d[17968+n|0]<<3)<<2)>>2]|0)!=0){break}c[g>>2]=e;h=0;return h|0}else if((m|0)==15){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((m|0)==17){c[g>>2]=e;h=0;return h|0}}while(0);n=e+2|0;if((n|0)==(f|0)){h=-1;return h|0}o=b+72|0;b=e;i=n;b:while(1){l=a[i]|0;p=a[b+3|0]|0;c:do{if(l<<24>>24==0){q=p&255;switch(d[o+q|0]|0){case 22:case 24:case 25:case 26:case 27:{break};case 15:{m=61;break b;break};case 6:{m=28;break b;break};case 7:{m=30;break b;break};case 5:{m=26;break b;break};case 29:{r=0;s=q;m=23;break};case 21:case 9:case 10:{m=32;break b;break};default:{t=i;break b}}}else{q=l&255;switch(q|0){case 220:case 221:case 222:case 223:{t=i;break b;break};case 216:case 217:case 218:case 219:{m=30;break b;break};case 255:{u=p&255;if((u-254|0)>>>0<2>>>0){t=i;break b}else{r=255;s=u;m=23;break c}break};default:{r=q;s=p&255;m=23;break c}}}}while(0);if((m|0)==23){m=0;if((1<<(s&31)&c[18232+((s>>>5|d[19512+r|0]<<3)<<2)>>2]|0)==0){m=25;break}}p=i+2|0;if((p|0)==(f|0)){h=-1;m=76;break}else{b=i;i=p}}do{if((m|0)==25){c[g>>2]=i;h=0;return h|0}else if((m|0)==26){if((f-i|0)<2){h=-2;return h|0}c[g>>2]=i;h=0;return h|0}else if((m|0)==28){if((f-i|0)<3){h=-2;return h|0}c[g>>2]=i;h=0;return h|0}else if((m|0)==30){if((f-i|0)<4){h=-2;return h|0}c[g>>2]=i;h=0;return h|0}else if((m|0)==32){do{if((i-e|0)!=6|j^1){v=11}else{r=k<<24>>24;if((r|0)==88){w=1}else if((r|0)==120){w=0}else{v=11;break}if((a[n]|0)!=0){v=11;break}r=a[e+3|0]|0;if((r|0)==109){x=w}else if((r|0)==77){x=1}else{v=11;break}if((a[e+4|0]|0)!=0){v=11;break}r=a[e+5|0]|0;if((r|0)==108){if((x|0)==0){v=12;break}}else if((r|0)!=76){v=11;break}c[g>>2]=i;h=0;return h|0}}while(0);r=b+4|0;if((r|0)==(f|0)){h=-1;return h|0}s=f;p=r;d:while(1){r=a[p]|0;l=a[p+1|0]|0;e:do{if(r<<24>>24==0){switch(d[o+(l&255)|0]|0){case 6:{if((s-p|0)<3){h=-2;m=76;break d}y=p+3|0;break e;break};case 0:case 1:case 8:{m=54;break d;break};case 15:{q=p+2|0;if((q|0)==(f|0)){h=-1;m=76;break d}if((a[q]|0)!=0){y=q;break e}if((a[p+3|0]|0)==62){m=59;break d}else{y=q;break e}break};case 7:{m=52;break e;break};case 5:{if((s-p|0)<2){h=-2;m=76;break d}y=p+2|0;break e;break};default:{m=60;break e}}}else{switch(r&255|0){case 255:{break};case 220:case 221:case 222:case 223:{m=54;break d;break};case 216:case 217:case 218:case 219:{m=52;break e;break};default:{m=60;break e}}if(((l&255)-254|0)>>>0<2>>>0){m=54;break d}else{m=60}}}while(0);if((m|0)==52){m=0;if((s-p|0)<4){h=-2;m=76;break}y=p+4|0}else if((m|0)==60){m=0;y=p+2|0}if((y|0)==(f|0)){h=-1;m=76;break}else{p=y}}if((m|0)==54){c[g>>2]=p;h=0;return h|0}else if((m|0)==59){c[g>>2]=p+4;h=v;return h|0}else if((m|0)==76){return h|0}}else if((m|0)==61){do{if((i-e|0)!=6|j^1){z=11}else{s=k<<24>>24;if((s|0)==88){A=1}else if((s|0)==120){A=0}else{z=11;break}if((a[n]|0)!=0){z=11;break}s=a[e+3|0]|0;if((s|0)==77){B=1}else if((s|0)==109){B=A}else{z=11;break}if((a[e+4|0]|0)!=0){z=11;break}s=a[e+5|0]|0;if((s|0)==108){if((B|0)==0){z=12;break}}else if((s|0)!=76){z=11;break}c[g>>2]=i;h=0;return h|0}}while(0);p=b+4|0;if((p|0)==(f|0)){h=-1;return h|0}if((a[p]|0)!=0){t=p;break}if((a[b+5|0]|0)!=62){t=p;break}c[g>>2]=b+6;h=z;return h|0}else if((m|0)==76){return h|0}}while(0);c[g>>2]=t;h=0;return h|0}function Sf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;a:do{switch(d[i+(d[e]|0)|0]|0){case 2:{j=e+1|0;if((j|0)==(f|0)){h=-1;return h|0}switch(d[i+(d[j]|0)|0]|0){case 22:case 24:case 29:case 5:case 6:case 7:{c[g>>2]=e;h=29;return h|0};case 15:{h=rg(b,e+2|0,f,g)|0;return h|0};case 16:{k=e+2|0;if((k|0)==(f|0)){h=-1;return h|0}l=d[i+(d[k]|0)|0]|0;if((l|0)==22|(l|0)==24){m=e+3|0;if((m|0)==(f|0)){h=-1;return h|0}else{n=k;o=m}b:while(1){switch(d[i+(d[o]|0)|0]|0){case 21:case 9:case 10:{break b;break};case 30:{p=16;break b;break};case 22:case 24:{break};default:{p=20;break b}}m=o+1|0;if((m|0)==(f|0)){h=-1;p=138;break}else{n=o;o=m}}do{if((p|0)==16){m=n+2|0;if((m|0)==(f|0)){h=-1;return h|0}q=d[i+(d[m]|0)|0]|0;if(!((q|0)==21|(q|0)==9|(q|0)==10|(q|0)==30)){break}c[g>>2]=o;h=0;return h|0}else if((p|0)==20){c[g>>2]=o;h=0;return h|0}else if((p|0)==138){return h|0}}while(0);c[g>>2]=o;h=16;return h|0}else if((l|0)==20){c[g>>2]=e+3;h=33;return h|0}else if((l|0)==27){h=qg(b,e+3|0,f,g)|0;return h|0}else{c[g>>2]=k;h=0;return h|0}break};default:{c[g>>2]=j;h=0;return h|0}}break};case 7:{if((f-e|0)<4){h=-2;return h|0}if((Oc[c[b+348>>2]&255](b,e)|0)!=0){r=18;s=e+4|0;break a}if((Oc[c[b+336>>2]&255](b,e)|0)!=0){r=19;s=e+4|0;break a}c[g>>2]=e;h=0;return h|0};case 6:{if((f-e|0)<3){h=-2;return h|0}if((Oc[c[b+344>>2]&255](b,e)|0)!=0){r=18;s=e+3|0;break a}if((Oc[c[b+332>>2]&255](b,e)|0)!=0){r=19;s=e+3|0;break a}c[g>>2]=e;h=0;return h|0};case 9:{if((e+1|0)!=(f|0)){p=3;break a}c[g>>2]=f;h=-15;return h|0};case 19:{q=e+1|0;if((q|0)==(f|0)){h=-1;return h|0}c:do{switch(d[i+(d[q]|0)|0]|0){case 6:{if((f-q|0)<3){h=-2;return h|0}if((Oc[c[b+344>>2]&255](b,q)|0)!=0){t=e+4|0;break c}c[g>>2]=q;h=0;return h|0};case 5:{if((f-q|0)<2){h=-2;return h|0}if((Oc[c[b+340>>2]&255](b,q)|0)!=0){t=e+3|0;break c}c[g>>2]=q;h=0;return h|0};case 29:{c[g>>2]=q;h=0;return h|0};case 22:case 24:{t=e+2|0;break};case 7:{if((f-q|0)<4){h=-2;return h|0}if((Oc[c[b+348>>2]&255](b,q)|0)!=0){t=e+5|0;break c}c[g>>2]=q;h=0;return h|0};default:{c[g>>2]=q;h=0;return h|0}}}while(0);if((t|0)==(f|0)){h=-20;return h|0}q=f;j=b+328|0;k=b+332|0;l=b+336|0;m=t;d:while(1){switch(d[i+(d[m]|0)|0]|0){case 9:case 10:case 21:case 32:case 11:case 30:case 36:{p=85;break d;break};case 6:{if((q-m|0)<3){h=-2;p=138;break d}if((Oc[c[k>>2]&255](b,m)|0)==0){p=78;break d}u=m+3|0;break};case 29:{p=70;break d;break};case 22:case 24:case 25:case 26:case 27:{u=m+1|0;break};case 5:{if((q-m|0)<2){h=-2;p=138;break d}if((Oc[c[j>>2]&255](b,m)|0)==0){p=74;break d}u=m+2|0;break};case 7:{if((q-m|0)<4){h=-2;p=138;break d}if((Oc[c[l>>2]&255](b,m)|0)==0){p=82;break d}u=m+4|0;break};default:{p=86;break d}}if((u|0)==(f|0)){h=-20;p=138;break}else{m=u}}if((p|0)==70){c[g>>2]=m;h=0;return h|0}else if((p|0)==74){c[g>>2]=m;h=0;return h|0}else if((p|0)==78){c[g>>2]=m;h=0;return h|0}else if((p|0)==82){c[g>>2]=m;h=0;return h|0}else if((p|0)==85){c[g>>2]=m;h=20;return h|0}else if((p|0)==86){c[g>>2]=m;h=0;return h|0}else if((p|0)==138){return h|0}break};case 21:case 10:{p=3;break};case 5:{if((f-e|0)<2){h=-2;return h|0}if((Oc[c[b+340>>2]&255](b,e)|0)!=0){r=18;s=e+2|0;break a}if((Oc[c[b+328>>2]&255](b,e)|0)!=0){r=19;s=e+2|0;break a}c[g>>2]=e;h=0;return h|0};case 13:{h=sg(13,b,e+1|0,f,g)|0;return h|0};case 32:{l=e+1|0;if((l|0)==(f|0)){h=-24;return h|0}switch(d[i+(d[l]|0)|0]|0){case 33:{c[g>>2]=e+2;h=36;return h|0};case 9:case 10:case 21:case 11:case 35:case 36:case 32:{c[g>>2]=l;h=24;return h|0};case 15:{c[g>>2]=e+2;h=35;return h|0};case 34:{c[g>>2]=e+2;h=37;return h|0};default:{c[g>>2]=l;h=0;return h|0}}break};case 12:{h=sg(12,b,e+1|0,f,g)|0;return h|0};case 31:{c[g>>2]=e+1;h=23;return h|0};case 36:{c[g>>2]=e+1;h=21;return h|0};case 22:case 24:{r=18;s=e+1|0;break};case 25:case 26:case 27:{r=19;s=e+1|0;break};case 11:{c[g>>2]=e+1;h=17;return h|0};case 30:{h=pg(b,e+1|0,f,g)|0;return h|0};case 35:{c[g>>2]=e+1;h=38;return h|0};case 20:{c[g>>2]=e+1;h=25;return h|0};case 4:{l=e+1|0;if((l|0)==(f|0)){h=-26;return h|0}do{if((a[l]|0)==93){q=e+2|0;if((q|0)==(f|0)){h=-1;return h|0}if((a[q]|0)!=62){break}c[g>>2]=e+3;h=34;return h|0}}while(0);c[g>>2]=l;h=26;return h|0};default:{c[g>>2]=e;h=0;return h|0}}}while(0);if((p|0)==3){u=e+1|0;e:do{if((u|0)!=(f|0)){t=e;o=u;while(1){n=d[i+(d[o]|0)|0]|0;if((n|0)==9){if((t+2|0)==(f|0)){break}}else if(!((n|0)==21|(n|0)==10)){break}n=o+1|0;if((n|0)==(f|0)){break e}else{t=o;o=n}}c[g>>2]=o;h=15;return h|0}}while(0);c[g>>2]=f;h=15;return h|0}f:do{if((s|0)!=(f|0)){u=f;e=b+328|0;t=b+332|0;l=b+336|0;n=s;g:while(1){switch(d[i+(d[n]|0)|0]|0){case 29:{p=111;break g;break};case 22:case 24:case 25:case 26:case 27:{v=n+1|0;break};case 7:{if((u-n|0)<4){h=-2;p=138;break g}if((Oc[c[l>>2]&255](b,n)|0)==0){p=123;break g}v=n+4|0;break};case 33:{p=130;break g;break};case 6:{if((u-n|0)<3){h=-2;p=138;break g}if((Oc[c[t>>2]&255](b,n)|0)==0){p=119;break g}v=n+3|0;break};case 11:case 32:case 35:case 36:case 20:case 30:case 21:case 9:case 10:{p=126;break g;break};case 34:{p=127;break g;break};case 15:{p=133;break g;break};case 5:{if((u-n|0)<2){h=-2;p=138;break g}if((Oc[c[e>>2]&255](b,n)|0)==0){p=115;break g}v=n+2|0;break};default:{p=136;break g}}if((v|0)==(f|0)){break f}else{n=v}}if((p|0)==111){c[g>>2]=n;h=0;return h|0}else if((p|0)==115){c[g>>2]=n;h=0;return h|0}else if((p|0)==119){c[g>>2]=n;h=0;return h|0}else if((p|0)==123){c[g>>2]=n;h=0;return h|0}else if((p|0)==126){c[g>>2]=n;h=r;return h|0}else if((p|0)==127){if((r|0)==19){c[g>>2]=n;h=0;return h|0}else{c[g>>2]=n+1;h=32;return h|0}}else if((p|0)==130){if((r|0)==19){c[g>>2]=n;h=0;return h|0}else{c[g>>2]=n+1;h=31;return h|0}}else if((p|0)==133){if((r|0)==19){c[g>>2]=n;h=0;return h|0}else{c[g>>2]=n+1;h=30;return h|0}}else if((p|0)==136){c[g>>2]=n;h=0;return h|0}else if((p|0)==138){return h|0}}}while(0);h=-r|0;return h|0}function Tf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0;h=i;i=i+8|0;j=h|0;a:do{if((e|0)==(f|0)){k=-4}else{l=b+72|0;b:do{switch(d[l+(d[e]|0)|0]|0){case 0:case 1:case 8:{c[g>>2]=e;k=0;break a;break};case 5:{if((f-e|0)<2){k=-2;break a}if((Oc[c[b+352>>2]&255](b,e)|0)==0){m=e+2|0;break b}else{c[g>>2]=e;k=0;break a}break};case 6:{if((f-e|0)<3){k=-2;break a}if((Oc[c[b+356>>2]&255](b,e)|0)==0){m=e+3|0;break b}else{c[g>>2]=e;k=0;break a}break};case 7:{if((f-e|0)<4){k=-2;break a}if((Oc[c[b+360>>2]&255](b,e)|0)==0){m=e+4|0;break b}else{c[g>>2]=e;k=0;break a}break};case 2:{n=e+1|0;if((n|0)==(f|0)){k=-1;break a}c:do{switch(d[l+(d[n]|0)|0]|0){case 16:{o=e+2|0;if((o|0)==(f|0)){k=-1;break a}p=d[l+(d[o]|0)|0]|0;if((p|0)==20){q=e+3|0;if((f-q|0)<6){k=-1;break a}else{r=q;s=0}while(1){if((a[r]|0)!=(a[17816+s|0]|0)){t=26;break}q=s+1|0;u=r+1|0;if((q|0)<6){r=u;s=q}else{t=28;break}}if((t|0)==26){c[g>>2]=r;k=0;break a}else if((t|0)==28){c[g>>2]=u;k=8;break a}}else if((p|0)==27){k=qg(b,e+3|0,f,g)|0;break a}else{c[g>>2]=o;k=0;break a}break};case 7:{if((f-n|0)<4){k=-2;break a}if((Oc[c[b+348>>2]&255](b,n)|0)==0){c[g>>2]=n;k=0;break a}else{v=e+5|0;break c}break};case 22:case 24:{v=e+2|0;break};case 5:{if((f-n|0)<2){k=-2;break a}if((Oc[c[b+340>>2]&255](b,n)|0)==0){c[g>>2]=n;k=0;break a}else{v=e+3|0;break c}break};case 15:{k=rg(b,e+2|0,f,g)|0;break a;break};case 17:{q=e+2|0;if((q|0)==(f|0)){k=-1;break a}d:do{switch(d[l+(d[q]|0)|0]|0){case 29:{c[g>>2]=q;k=0;break a;break};case 22:case 24:{w=e+3|0;break};case 5:{if((f-q|0)<2){k=-2;break a}if((Oc[c[b+340>>2]&255](b,q)|0)==0){c[g>>2]=q;k=0;break a}else{w=e+4|0;break d}break};case 6:{if((f-q|0)<3){k=-2;break a}if((Oc[c[b+344>>2]&255](b,q)|0)==0){c[g>>2]=q;k=0;break a}else{w=e+5|0;break d}break};case 7:{if((f-q|0)<4){k=-2;break a}if((Oc[c[b+348>>2]&255](b,q)|0)==0){c[g>>2]=q;k=0;break a}else{w=e+6|0;break d}break};default:{c[g>>2]=q;k=0;break a}}}while(0);if((w|0)==(f|0)){k=-1;break a}q=f;o=b+328|0;p=b+332|0;x=b+336|0;y=w;e:while(1){switch(d[l+(d[y]|0)|0]|0){case 5:{if((q-y|0)<2){k=-2;break a}if((Oc[c[o>>2]&255](b,y)|0)==0){t=56;break e}z=y+2|0;break};case 6:{if((q-y|0)<3){k=-2;break a}if((Oc[c[p>>2]&255](b,y)|0)==0){t=60;break e}z=y+3|0;break};case 7:{if((q-y|0)<4){k=-2;break a}if((Oc[c[x>>2]&255](b,y)|0)==0){t=64;break e}z=y+4|0;break};case 21:case 9:case 10:{t=51;break e;break};case 29:{t=52;break e;break};case 22:case 24:case 25:case 26:case 27:{z=y+1|0;break};case 11:{t=71;break e;break};default:{t=72;break e}}if((z|0)==(f|0)){k=-1;break a}else{y=z}}if((t|0)==51){x=y+1|0;if((x|0)==(f|0)){k=-1;break a}else{A=y;B=x}while(1){x=d[l+(d[B]|0)|0]|0;if((x|0)==11){t=69;break}else if(!((x|0)==21|(x|0)==9|(x|0)==10)){t=70;break}x=B+1|0;if((x|0)==(f|0)){k=-1;break a}else{A=B;B=x}}if((t|0)==69){c[g>>2]=A+2;k=5;break a}else if((t|0)==70){c[g>>2]=B;k=0;break a}}else if((t|0)==52){c[g>>2]=y;k=0;break a}else if((t|0)==56){c[g>>2]=y;k=0;break a}else if((t|0)==60){c[g>>2]=y;k=0;break a}else if((t|0)==64){c[g>>2]=y;k=0;break a}else if((t|0)==71){c[g>>2]=y+1;k=5;break a}else if((t|0)==72){c[g>>2]=y;k=0;break a}break};case 29:{c[g>>2]=n;k=0;break a;break};case 6:{if((f-n|0)<3){k=-2;break a}if((Oc[c[b+344>>2]&255](b,n)|0)==0){c[g>>2]=n;k=0;break a}else{v=e+4|0;break c}break};default:{c[g>>2]=n;k=0;break a}}}while(0);if((v|0)==(f|0)){k=-1;break a}n=f;x=b+328|0;q=b+332|0;p=b+336|0;o=v;f:while(1){switch(d[l+(d[o]|0)|0]|0){case 21:case 9:case 10:{t=75;break f;break};case 22:case 24:case 25:case 26:case 27:{C=o+1|0;break};case 29:{t=76;break f;break};case 11:{D=o;t=186;break f;break};case 17:{E=o;break f;break};case 5:{if((n-o|0)<2){k=-2;break a}if((Oc[c[x>>2]&255](b,o)|0)==0){t=80;break f}C=o+2|0;break};case 7:{if((n-o|0)<4){k=-2;break a}if((Oc[c[p>>2]&255](b,o)|0)==0){t=88;break f}C=o+4|0;break};case 6:{if((n-o|0)<3){k=-2;break a}if((Oc[c[q>>2]&255](b,o)|0)==0){t=84;break f}C=o+3|0;break};default:{t=191;break f}}if((C|0)==(f|0)){k=-1;break a}else{o=C}}g:do{if((t|0)==75){F=o+1|0;if((F|0)==(f|0)){k=-1;break a}else{G=o;H=F}h:while(1){switch(d[l+(d[H]|0)|0]|0){case 22:case 24:{t=94;break h;break};case 5:{t=95;break h;break};case 7:{t=103;break h;break};case 11:{D=H;t=186;break g;break};case 17:{E=H;break g;break};case 6:{t=99;break h;break};case 21:case 9:case 10:{break};case 29:{t=93;break h;break};default:{t=107;break h}}F=H+1|0;if((F|0)==(f|0)){k=-1;break a}else{G=H;H=F}}do{if((t|0)==93){c[g>>2]=H;k=0;break a}else if((t|0)==94){I=G+2|0}else if((t|0)==95){if((n-H|0)<2){k=-2;break a}if((Oc[c[b+340>>2]&255](b,H)|0)==0){c[g>>2]=H;k=0;break a}else{I=G+3|0;break}}else if((t|0)==99){if((n-H|0)<3){k=-2;break a}if((Oc[c[b+344>>2]&255](b,H)|0)==0){c[g>>2]=H;k=0;break a}else{I=G+4|0;break}}else if((t|0)==103){if((n-H|0)<4){k=-2;break a}if((Oc[c[b+348>>2]&255](b,H)|0)==0){c[g>>2]=H;k=0;break a}else{I=G+5|0;break}}else if((t|0)==107){c[g>>2]=H;k=0;break a}}while(0);c[j>>2]=I;if((I|0)==(f|0)){k=-1;break a}y=b+352|0;F=b+356|0;J=b+360|0;K=b+340|0;L=b+344|0;M=b+348|0;N=I;i:while(1){j:do{switch(d[l+(d[N]|0)|0]|0){case 22:case 24:case 25:case 26:case 27:{O=N+1|0;c[j>>2]=O;P=O;break};case 7:{if((n-N|0)<4){k=-2;break a}O=(Oc[c[p>>2]&255](b,N)|0)==0;Q=c[j>>2]|0;if(O){t=124;break i}O=Q+4|0;c[j>>2]=O;P=O;break};case 21:case 9:case 10:{O=N+1|0;c[j>>2]=O;if((O|0)==(f|0)){k=-1;break a}else{R=O}while(1){O=a[l+(d[R]|0)|0]|0;if(O<<24>>24==14){S=R;t=130;break j}T=O&255;if(!((T|0)==21|(T|0)==10|(T|0)==9)){t=129;break i}T=R+1|0;c[j>>2]=T;if((T|0)==(f|0)){k=-1;break a}else{R=T}}break};case 29:{t=112;break i;break};case 14:{S=N;t=130;break};case 5:{if((n-N|0)<2){k=-2;break a}T=(Oc[c[x>>2]&255](b,N)|0)==0;U=c[j>>2]|0;if(T){t=116;break i}T=U+2|0;c[j>>2]=T;P=T;break};case 6:{if((n-N|0)<3){k=-2;break a}T=(Oc[c[q>>2]&255](b,N)|0)==0;V=c[j>>2]|0;if(T){t=120;break i}T=V+3|0;c[j>>2]=T;P=T;break};default:{t=185;break i}}}while(0);do{if((t|0)==130){t=0;T=S+1|0;c[j>>2]=T;if((T|0)==(f|0)){k=-1;break a}else{W=S;X=T}while(1){Y=a[l+(d[X]|0)|0]|0;if((Y&-2)<<24>>24==12){break}T=Y&255;if(!((T|0)==21|(T|0)==10|(T|0)==9)){t=134;break i}T=X+1|0;c[j>>2]=T;if((T|0)==(f|0)){k=-1;break a}else{W=X;X=T}}T=W+2|0;c[j>>2]=T;if((T|0)==(f|0)){k=-1;break a}else{Z=T}while(1){T=a[l+(d[Z]|0)|0]|0;if(T<<24>>24==Y<<24>>24){break}switch(T&255|0){case 3:{_=og(b,Z+1|0,f,j)|0;if((_|0)<1){t=154;break i}$=c[j>>2]|0;break};case 6:{if((n-Z|0)<3){k=-2;break a}T=(Oc[c[F>>2]&255](b,Z)|0)==0;aa=c[j>>2]|0;if(!T){t=144;break i}T=aa+3|0;c[j>>2]=T;$=T;break};case 2:{t=156;break i;break};case 7:{if((n-Z|0)<4){k=-2;break a}T=(Oc[c[J>>2]&255](b,Z)|0)==0;ba=c[j>>2]|0;if(!T){t=148;break i}T=ba+4|0;c[j>>2]=T;$=T;break};case 0:case 1:case 8:{t=150;break i;break};case 5:{if((n-Z|0)<2){k=-2;break a}T=(Oc[c[y>>2]&255](b,Z)|0)==0;ca=c[j>>2]|0;if(!T){t=140;break i}T=ca+2|0;c[j>>2]=T;$=T;break};default:{T=Z+1|0;c[j>>2]=T;$=T}}if(($|0)==(f|0)){k=-1;break a}else{Z=$}}da=Z+1|0;c[j>>2]=da;if((da|0)==(f|0)){k=-1;break a}switch(d[l+(d[da]|0)|0]|0){case 21:case 9:case 10:{break};case 11:{ea=da;t=179;break i;break};case 17:{fa=da;t=180;break i;break};default:{t=161;break i}}T=Z+2|0;c[j>>2]=T;if((T|0)==(f|0)){k=-1;break a}else{ga=T}k:while(1){switch(d[l+(d[ga]|0)|0]|0){case 11:{ea=ga;t=179;break i;break};case 17:{fa=ga;t=180;break i;break};case 7:{t=174;break k;break};case 21:case 9:case 10:{break};case 6:{t=170;break k;break};case 29:{t=164;break i;break};case 22:case 24:{t=165;break k;break};case 5:{t=166;break k;break};default:{t=184;break i}}T=ga+1|0;c[j>>2]=T;if((T|0)==(f|0)){k=-1;break a}else{ga=T}}if((t|0)==165){t=0;T=ga+1|0;c[j>>2]=T;P=T;break}else if((t|0)==166){t=0;if((n-ga|0)<2){k=-2;break a}T=(Oc[c[K>>2]&255](b,ga)|0)==0;ha=c[j>>2]|0;if(T){t=168;break i}T=ha+2|0;c[j>>2]=T;P=T;break}else if((t|0)==170){t=0;if((n-ga|0)<3){k=-2;break a}T=(Oc[c[L>>2]&255](b,ga)|0)==0;ia=c[j>>2]|0;if(T){t=172;break i}T=ia+3|0;c[j>>2]=T;P=T;break}else if((t|0)==174){t=0;if((n-ga|0)<4){k=-2;break a}T=(Oc[c[M>>2]&255](b,ga)|0)==0;ja=c[j>>2]|0;if(T){t=176;break i}T=ja+4|0;c[j>>2]=T;P=T;break}}}while(0);if((P|0)==(f|0)){k=-1;break a}else{N=P}}if((t|0)==112){c[g>>2]=N;k=0;break a}else if((t|0)==116){c[g>>2]=U;k=0;break a}else if((t|0)==120){c[g>>2]=V;k=0;break a}else if((t|0)==124){c[g>>2]=Q;k=0;break a}else if((t|0)==129){c[g>>2]=R;k=0;break a}else if((t|0)==134){c[g>>2]=X;k=0;break a}else if((t|0)==140){c[g>>2]=ca;k=0;break a}else if((t|0)==144){c[g>>2]=aa;k=0;break a}else if((t|0)==148){c[g>>2]=ba;k=0;break a}else if((t|0)==150){c[g>>2]=Z;k=0;break a}else if((t|0)==154){if((_|0)!=0){k=_;break a}c[g>>2]=c[j>>2];k=0;break a}else if((t|0)==156){c[g>>2]=Z;k=0;break a}else if((t|0)==161){c[g>>2]=da;k=0;break a}else if((t|0)==164){c[g>>2]=ga;k=0;break a}else if((t|0)==168){c[g>>2]=ha;k=0;break a}else if((t|0)==172){c[g>>2]=ia;k=0;break a}else if((t|0)==176){c[g>>2]=ja;k=0;break a}else if((t|0)==179){c[g>>2]=ea+1;k=1;break a}else if((t|0)==180){M=fa+1|0;c[j>>2]=M;if((M|0)==(f|0)){k=-1;break a}if((a[M]|0)==62){c[g>>2]=fa+2;k=3;break a}else{c[g>>2]=M;k=0;break a}}else if((t|0)==184){c[g>>2]=ga;k=0;break a}else if((t|0)==185){c[g>>2]=N;k=0;break a}}else if((t|0)==76){c[g>>2]=o;k=0;break a}else if((t|0)==80){c[g>>2]=o;k=0;break a}else if((t|0)==84){c[g>>2]=o;k=0;break a}else if((t|0)==88){c[g>>2]=o;k=0;break a}else if((t|0)==191){c[g>>2]=o;k=0;break a}}while(0);if((t|0)==186){c[g>>2]=D+1;k=2;break a}o=E+1|0;if((o|0)==(f|0)){k=-1;break a}if((a[o]|0)==62){c[g>>2]=E+2;k=4;break a}else{c[g>>2]=o;k=0;break a}break};case 3:{k=og(b,e+1|0,f,g)|0;break a;break};case 9:{o=e+1|0;if((o|0)==(f|0)){k=-3;break a}c[g>>2]=(a[l+(d[o]|0)|0]|0)==10?e+2|0:o;k=7;break a;break};case 10:{c[g>>2]=e+1;k=7;break a;break};case 4:{o=e+1|0;if((o|0)==(f|0)){k=-5;break a}if((a[o]|0)!=93){m=o;break b}n=e+2|0;if((n|0)==(f|0)){k=-5;break a}if((a[n]|0)!=62){m=o;break b}c[g>>2]=n;k=0;break a;break};default:{m=e+1|0}}}while(0);l:do{if((m|0)!=(f|0)){n=f;o=b+352|0;q=b+356|0;x=b+360|0;p=m;m:while(1){n:do{switch(d[l+(d[p]|0)|0]|0){case 5:{if((n-p|0)<2){t=220;break m}if((Oc[c[o>>2]&255](b,p)|0)!=0){t=220;break m}ka=p+2|0;break};case 3:case 2:case 0:case 1:case 8:case 9:case 10:{t=235;break m;break};case 6:{if((n-p|0)<3){t=224;break m}if((Oc[c[q>>2]&255](b,p)|0)!=0){t=224;break m}ka=p+3|0;break};case 7:{if((n-p|0)<4){t=228;break m}if((Oc[c[x>>2]&255](b,p)|0)!=0){t=228;break m}ka=p+4|0;break};case 4:{M=p+1|0;if((M|0)==(f|0)){t=235;break m}if((a[M]|0)!=93){ka=M;break n}la=p+2|0;if((la|0)==(f|0)){t=235;break m}if((a[la]|0)==62){t=234;break m}else{ka=M}break};default:{ka=p+1|0}}}while(0);if((ka|0)==(f|0)){break l}else{p=ka}}if((t|0)==220){c[g>>2]=p;k=6;break a}else if((t|0)==224){c[g>>2]=p;k=6;break a}else if((t|0)==228){c[g>>2]=p;k=6;break a}else if((t|0)==234){c[g>>2]=la;k=0;break a}else if((t|0)==235){c[g>>2]=p;k=6;break a}}}while(0);c[g>>2]=f;k=6}}while(0);i=h;return k|0}function Uf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;a:do{switch(d[i+(d[e]|0)|0]|0){case 9:{j=e+1|0;if((j|0)==(f|0)){h=-1;return h|0}c[g>>2]=(a[i+(d[j]|0)|0]|0)==10?e+2|0:j;h=7;return h|0};case 5:{if((f-e|0)<2){h=-2;return h|0}if((Oc[c[b+352>>2]&255](b,e)|0)==0){k=e+2|0;break a}c[g>>2]=e;h=0;return h|0};case 4:{j=e+1|0;if((j|0)==(f|0)){h=-1;return h|0}if((a[j]|0)!=93){k=j;break a}l=e+2|0;if((l|0)==(f|0)){h=-1;return h|0}if((a[l]|0)!=62){k=j;break a}c[g>>2]=e+3;h=40;return h|0};case 7:{if((f-e|0)<4){h=-2;return h|0}if((Oc[c[b+360>>2]&255](b,e)|0)==0){k=e+4|0;break a}c[g>>2]=e;h=0;return h|0};case 0:case 1:case 8:{c[g>>2]=e;h=0;return h|0};case 6:{if((f-e|0)<3){h=-2;return h|0}if((Oc[c[b+356>>2]&255](b,e)|0)==0){k=e+3|0;break a}c[g>>2]=e;h=0;return h|0};case 10:{c[g>>2]=e+1;h=7;return h|0};default:{k=e+1|0}}}while(0);b:do{if((k|0)!=(f|0)){e=f;j=b+352|0;l=b+356|0;m=b+360|0;n=k;c:while(1){switch(d[i+(d[n]|0)|0]|0){case 5:{if((e-n|0)<2){o=30;break c}if((Oc[c[j>>2]&255](b,n)|0)!=0){o=30;break c}p=n+2|0;break};case 6:{if((e-n|0)<3){o=34;break c}if((Oc[c[l>>2]&255](b,n)|0)!=0){o=34;break c}p=n+3|0;break};case 7:{if((e-n|0)<4){o=38;break c}if((Oc[c[m>>2]&255](b,n)|0)!=0){o=38;break c}p=n+4|0;break};case 0:case 1:case 8:case 9:case 10:case 4:{o=40;break c;break};default:{p=n+1|0}}if((p|0)==(f|0)){break b}else{n=p}}if((o|0)==30){c[g>>2]=n;h=6;return h|0}else if((o|0)==34){c[g>>2]=n;h=6;return h|0}else if((o|0)==38){c[g>>2]=n;h=6;return h|0}else if((o|0)==40){c[g>>2]=n;h=6;return h|0}}}while(0);c[g>>2]=f;h=6;return h|0}function Vf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;do{if((e|0)==(f|0)){h=-4}else{i=b+72|0;j=e;a:while(1){switch(d[i+(d[j]|0)|0]|0){case 3:{k=7;break a;break};case 7:{l=j+4|0;break};case 9:{k=14;break a;break};case 2:{k=10;break a;break};case 10:{k=11;break a;break};case 6:{l=j+3|0;break};case 5:{l=j+2|0;break};case 21:{k=18;break a;break};default:{l=j+1|0}}if((l|0)==(f|0)){k=23;break}else{j=l}}if((k|0)==7){if((j|0)==(e|0)){h=og(b,e+1|0,f,g)|0;break}else{c[g>>2]=j;h=6;break}}else if((k|0)==10){c[g>>2]=j;h=0;break}else if((k|0)==11){if((j|0)==(e|0)){c[g>>2]=e+1;h=7;break}else{c[g>>2]=j;h=6;break}}else if((k|0)==14){if((j|0)!=(e|0)){c[g>>2]=j;h=6;break}m=e+1|0;if((m|0)==(f|0)){h=-3;break}c[g>>2]=(a[i+(d[m]|0)|0]|0)==10?e+2|0:m;h=7;break}else if((k|0)==18){if((j|0)==(e|0)){c[g>>2]=e+1;h=39;break}else{c[g>>2]=j;h=6;break}}else if((k|0)==23){c[g>>2]=f;h=6;break}}}while(0);return h|0}function Wf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;j=e;a:while(1){switch(d[i+(d[j]|0)|0]|0){case 6:{k=j+3|0;break};case 30:{l=10;break a;break};case 7:{k=j+4|0;break};case 3:{l=7;break a;break};case 9:{l=16;break a;break};case 10:{l=13;break a;break};case 5:{k=j+2|0;break};default:{k=j+1|0}}if((k|0)==(f|0)){l=22;break}else{j=k}}if((l|0)==7){if((j|0)==(e|0)){h=og(b,e+1|0,f,g)|0;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==10){if((j|0)==(e|0)){k=pg(b,e+1|0,f,g)|0;h=(k|0)==22?0:k;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==13){if((j|0)==(e|0)){c[g>>2]=e+1;h=7;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==16){if((j|0)!=(e|0)){c[g>>2]=j;h=6;return h|0}j=e+1|0;if((j|0)==(f|0)){h=-3;return h|0}c[g>>2]=(a[i+(d[j]|0)|0]|0)==10?e+2|0:j;h=7;return h|0}else if((l|0)==22){c[g>>2]=f;h=6;return h|0}return 0}function Xf(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;f=b+72|0;b=e;e=c;a:while(1){g=a[e]|0;switch(d[f+(g&255)|0]|0){case 5:{h=b;i=e;j=g;break};case 6:{k=b;l=e;m=g;n=5;break};case 29:case 22:case 24:case 25:case 26:case 27:{if((a[b]|0)==g<<24>>24){b=b+1|0;e=e+1|0;continue a}else{o=0;n=13;break a}break};case 7:{n=3;break};default:{n=10;break a}}if((n|0)==3){n=0;c=e+1|0;if(g<<24>>24!=(a[b]|0)){o=0;n=13;break}k=b+1|0;l=c;m=a[c]|0;n=5}if((n|0)==5){n=0;c=l+1|0;if(m<<24>>24!=(a[k]|0)){o=0;n=13;break}h=k+1|0;i=c;j=a[c]|0}if(j<<24>>24!=(a[h]|0)){o=0;n=13;break}if((a[i+1|0]|0)==(a[h+1|0]|0)){b=h+2|0;e=i+2|0}else{o=0;n=13;break}}if((n|0)==10){i=a[b]|0;if(g<<24>>24==i<<24>>24){o=1;return o|0}switch(d[f+(i&255)|0]|0){case 5:case 6:case 7:case 29:case 22:case 24:case 25:case 26:case 27:{o=0;return o|0};default:{}}o=1;return o|0}else if((n|0)==13){return o|0}return 0}function Yf(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a[e]|0;f=(c|0)==(d|0);a:do{if(b<<24>>24==0){g=f}else{h=c;i=e;j=b;k=f;while(1){if(k){l=0;m=6;break}if((a[h]|0)!=j<<24>>24){l=0;m=6;break}n=h+1|0;o=i+1|0;p=a[o]|0;q=(n|0)==(d|0);if(p<<24>>24==0){g=q;break a}else{h=n;i=o;j=p;k=q}}if((m|0)==6){return l|0}}}while(0);l=g&1;return l|0}function Zf(a,b){a=a|0;b=b|0;var c=0;c=a+72|0;a=b;a:while(1){switch(d[c+(d[a]|0)|0]|0|0){case 29:case 22:case 24:case 25:case 26:case 27:{a=a+1|0;continue a;break};case 6:{a=a+3|0;continue a;break};case 7:{a=a+4|0;continue a;break};case 5:{a=a+2|0;continue a;break};default:{break a}}}return a-b|0}function _f(a,b){a=a|0;b=b|0;var c=0;c=a+72|0;a=b;while(1){b=d[c+(d[a]|0)|0]|0;if(!((b|0)==10|(b|0)==9|(b|0)==21)){break}a=a+1|0}return a|0}function $f(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=b+72|0;b=0;i=0;j=1;k=e;a:while(1){e=k+1|0;l=a[e]|0;switch(d[h+(l&255)|0]|0){case 13:{if((j|0)!=2){if((i|0)>=(f|0)){b=13;i=i;j=2;k=e;continue a}c[g+(i<<4)+4>>2]=k+2;b=13;i=i;j=2;k=e;continue a}if((b|0)!=13){b=b;i=i;j=2;k=e;continue a}if((i|0)<(f|0)){c[g+(i<<4)+8>>2]=e}b=13;i=i+1|0;j=0;k=e;continue a;break};case 9:case 10:{if((j|0)==1){b=b;i=i;j=0;k=e;continue a}if(!((j|0)==2&(i|0)<(f|0))){b=b;i=i;j=j;k=e;continue a}a[g+(i<<4)+12|0]=0;b=b;i=i;j=2;k=e;continue a;break};case 3:{if((i|0)>=(f|0)){b=b;i=i;j=j;k=e;continue a}a[g+(i<<4)+12|0]=0;b=b;i=i;j=j;k=e;continue a;break};case 6:{do{if((j|0)==0){if((i|0)>=(f|0)){m=1;break}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;m=1}else{m=j}}while(0);b=b;i=i;j=m;k=k+3|0;continue a;break};case 12:{if((j|0)!=2){if((i|0)>=(f|0)){b=12;i=i;j=2;k=e;continue a}c[g+(i<<4)+4>>2]=k+2;b=12;i=i;j=2;k=e;continue a}if((b|0)!=12){b=b;i=i;j=2;k=e;continue a}if((i|0)<(f|0)){c[g+(i<<4)+8>>2]=e}b=12;i=i+1|0;j=0;k=e;continue a;break};case 29:case 22:case 24:{if((j|0)!=0){b=b;i=i;j=j;k=e;continue a}if((i|0)>=(f|0)){b=b;i=i;j=1;k=e;continue a}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=e;continue a;break};case 11:case 17:{if((j|0)==2){b=b;i=i;j=2;k=e;continue a}else{break a}break};case 5:{do{if((j|0)==0){if((i|0)>=(f|0)){n=1;break}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;n=1}else{n=j}}while(0);b=b;i=i;j=n;k=k+2|0;continue a;break};case 21:{if((j|0)==1){b=b;i=i;j=0;k=e;continue a}if(!((j|0)==2&(i|0)<(f|0))){b=b;i=i;j=j;k=e;continue a}o=g+(i<<4)+12|0;if((a[o]|0)==0){b=b;i=i;j=2;k=e;continue a}do{if((e|0)!=(c[g+(i<<4)+4>>2]|0)&l<<24>>24==32){p=a[k+2|0]|0;if(p<<24>>24==32){break}if((d[h+(p&255)|0]|0)!=(b|0)){b=b;i=i;j=2;k=e;continue a}}}while(0);a[o]=0;b=b;i=i;j=2;k=e;continue a;break};case 7:{do{if((j|0)==0){if((i|0)>=(f|0)){q=1;break}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;q=1}else{q=j}}while(0);b=b;i=i;j=q;k=k+4|0;continue a;break};default:{b=b;i=i;j=j;k=e;continue a}}}return i|0}function ag(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;b=c+2|0;d=a[b]|0;a:do{if((d<<24>>24|0)==59){e=0;f=12}else if((d<<24>>24|0)==120){g=c+3|0;h=a[g]|0;if(h<<24>>24==59){e=0;f=12;break}else{i=0;j=g;k=h}while(1){h=k<<24>>24;switch(h|0){case 97:case 98:case 99:case 100:case 101:case 102:{l=(i<<4)-87+h|0;break};case 65:case 66:case 67:case 68:case 69:case 70:{l=(i<<4)-55+h|0;break};case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:{l=h-48|i<<4;break};default:{l=i}}h=j+1|0;if((l|0)>1114111){m=-1;break}g=a[h]|0;if(g<<24>>24==59){n=l;f=11;break a}else{i=l;j=h;k=g}}return m|0}else{g=0;h=b;o=d;while(1){p=(g*10|0)-48+(o<<24>>24)|0;q=h+1|0;if((p|0)>1114111){m=-1;break}r=a[q]|0;if(r<<24>>24==59){n=p;f=11;break a}else{g=p;h=q;o=r}}return m|0}}while(0);b:do{if((f|0)==11){switch(n>>8|0){case 0:{e=n;f=12;break b;break};case 216:case 217:case 218:case 219:case 220:case 221:case 222:case 223:{m=-1;return m|0};case 255:{break};default:{s=n;break b}}if((n&-2|0)==65534){m=-1}else{s=n;break}return m|0}}while(0);do{if((f|0)==12){if((a[20496+e|0]|0)==0){m=-1}else{s=e;break}return m|0}}while(0);m=s;return m|0}function bg(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;b=d-c|0;do{if((b|0)==4){d=a[c]|0;if((d|0)==97){if((a[c+1|0]|0)!=112){break}if((a[c+2|0]|0)!=111){break}if((a[c+3|0]|0)==115){e=39}else{break}return e|0}else if((d|0)==113){if((a[c+1|0]|0)!=117){break}if((a[c+2|0]|0)!=111){break}if((a[c+3|0]|0)==116){e=34}else{break}return e|0}else{break}}else if((b|0)==2){if((a[c+1|0]|0)!=116){break}d=a[c]|0;if((d|0)==108){e=60;return e|0}else if((d|0)!=103){break}e=62;return e|0}else if((b|0)==3){if((a[c]|0)!=97){break}if((a[c+1|0]|0)!=109){break}if((a[c+2|0]|0)==112){e=38}else{break}return e|0}}while(0);e=0;return e|0}function cg(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;if(e>>>0>=f>>>0){return}h=b+72|0;b=g+4|0;i=g|0;g=e;while(1){switch(d[h+(d[g]|0)|0]|0){case 6:{j=g+3|0;break};case 9:{c[i>>2]=(c[i>>2]|0)+1;e=g+1|0;if((e|0)==(f|0)){k=f}else{k=(a[h+(d[e]|0)|0]|0)==10?g+2|0:e}c[b>>2]=-1;j=k;break};case 5:{j=g+2|0;break};case 7:{j=g+4|0;break};case 10:{c[b>>2]=-1;c[i>>2]=(c[i>>2]|0)+1;j=g+1|0;break};default:{j=g+1|0}}c[b>>2]=(c[b>>2]|0)+1;if(j>>>0<f>>>0){g=j}else{break}}return}function dg(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;h=f-1|0;f=e+1|0;if((f|0)==(h|0)){i=1;return i|0}e=b+72|0;b=f;a:while(1){f=a[b]|0;switch(d[e+(f&255)|0]|0|0){case 21:{if(f<<24>>24==9){j=6;break a}break};case 25:case 24:case 27:case 13:case 31:case 32:case 34:case 35:case 17:case 14:case 15:case 9:case 10:case 18:case 16:case 33:case 30:case 19:{break};case 26:case 22:{if(f<<24>>24<0){j=8}break};default:{j=8}}if((j|0)==8){j=0;k=f<<24>>24;if(!((k|0)==36|(k|0)==64)){j=9;break}}k=b+1|0;if((k|0)==(h|0)){i=1;j=10;break}else{b=k}}if((j|0)==6){c[g>>2]=b;i=0;return i|0}else if((j|0)==9){c[g>>2]=b;i=0;return i|0}else if((j|0)==10){return i|0}return 0}function eg(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;b=c[d>>2]|0;h=c[f>>2]|0;i=g-h|0;a:do{if((e-b|0)>(i|0)){g=b+i|0;while(1){if(g>>>0<=b>>>0){j=g;break a}k=g-1|0;if((a[k]&-64)<<24>>24==-128){g=k}else{j=g;break}}}else{j=e}}while(0);if((b|0)==(j|0)){l=h;m=b;c[d>>2]=m;c[f>>2]=l;return}else{n=h;o=b}while(1){a[n]=a[o]|0;b=o+1|0;h=n+1|0;if((b|0)==(j|0)){l=h;m=j;break}else{n=h;o=b}}c[d>>2]=m;c[f>>2]=l;return}function fg(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;j=c[h>>2]|0;k=c[f>>2]|0;if((k|0)==(g|0)|(j|0)==(i|0)){l=k;m=j;c[f>>2]=l;c[h>>2]=m;return}n=e+72|0;e=k;k=j;while(1){j=a[e]|0;o=j&255;p=d[n+o|0]|0;if((p|0)==7){q=k+2|0;if((q|0)==(i|0)){l=e;m=k;r=10;break}s=((d[e+1|0]|0)<<12&258048|o<<18&1835008|(d[e+2|0]|0)<<6&4032|a[e+3|0]&63)-65536|0;b[k>>1]=s>>>10|55296;b[q>>1]=s&1023|56320;t=k+4|0;u=e+4|0}else if((p|0)==6){b[k>>1]=(d[e+1|0]|0)<<6&4032|(j&255)<<12|a[e+2|0]&63;t=k+2|0;u=e+3|0}else if((p|0)==5){b[k>>1]=a[e+1|0]&63|(j&255)<<6&1984;t=k+2|0;u=e+2|0}else{b[k>>1]=j<<24>>24;t=k+2|0;u=e+1|0}if((u|0)==(g|0)|(t|0)==(i|0)){l=u;m=t;r=10;break}else{e=u;k=t}}if((r|0)==10){c[f>>2]=l;c[h>>2]=m;return}}function gg(a,b){a=a|0;b=b|0;var e=0;a=d[b]|0;e=d[b+1|0]|0;return 1<<(e&31)&c[18232+(((d[19512+(a>>>2&7)|0]|0)<<3|a<<1&6|e>>>5&1)<<2)>>2]|0}function hg(a,b){a=a|0;b=b|0;var e=0;a=d[b+1|0]|0;e=d[b+2|0]|0;return 1<<(e&31)&c[18232+(((d[19512+(a>>>2&15|(d[b]|0)<<4&240)|0]|0)<<3|a<<1&6|e>>>5&1)<<2)>>2]|0}function ig(a,b){a=a|0;b=b|0;return 0}function jg(a,b){a=a|0;b=b|0;var e=0;a=d[b]|0;e=d[b+1|0]|0;return 1<<(e&31)&c[18232+(((d[17968+(a>>>2&7)|0]|0)<<3|a<<1&6|e>>>5&1)<<2)>>2]|0}function kg(a,b){a=a|0;b=b|0;var e=0;a=d[b+1|0]|0;e=d[b+2|0]|0;return 1<<(e&31)&c[18232+(((d[17968+(a>>>2&15|(d[b]|0)<<4&240)|0]|0)<<3|a<<1&6|e>>>5&1)<<2)>>2]|0}function lg(a,b){a=a|0;b=b|0;var c=0;if((d[b]|0)>>>0<194>>>0){c=1;return c|0}a=d[b+1|0]|0;if((a&128|0)==0){c=1;return c|0}c=(a&192|0)==192|0;return c|0}function mg(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;b=a[c+2|0]|0;a:do{if(b<<24>>24>-1){d=1}else{e=a[c]|0;do{if(e<<24>>24==-17){if((a[c+1|0]|0)!=-65){f=5;break}if((b&255)>>>0>189>>>0){d=1;break a}else{g=191}}else{f=5}}while(0);do{if((f|0)==5){if((b&-64)<<24>>24==-64){d=1;break a}h=a[c+1|0]|0;i=h&255;if(e<<24>>24==-32){if((h&255)>>>0<160>>>0){d=1;break a}d=(i&192|0)==192;break a}if((i&128|0)==0){d=1;break a}if(e<<24>>24!=-19){g=i;break}d=(h&255)>>>0>159>>>0;break a}}while(0);d=(g&192|0)==192}}while(0);return d&1|0}function ng(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0;b=d[c+3|0]|0;do{if((b&128|0)==0|(b&192|0)==192){e=1}else{f=d[c+2|0]|0;if((f&128|0)==0|(f&192|0)==192){e=1;break}f=a[c]|0;g=a[c+1|0]|0;h=g&255;if(f<<24>>24==-16){if((g&255)>>>0<144>>>0){e=1;break}e=(h&192|0)==192;break}if((h&128|0)==0){e=1;break}if(f<<24>>24==-12){e=(g&255)>>>0>143>>>0;break}else{e=(h&192|0)==192;break}}}while(0);return e&1|0}function og(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if((e|0)==(f|0)){h=-1;return h|0}i=b+72|0;a:do{switch(d[i+(d[e]|0)|0]|0){case 22:case 24:{j=e+1|0;break};case 29:{c[g>>2]=e;h=0;return h|0};case 19:{k=e+1|0;if((k|0)==(f|0)){h=-1;return h|0}l=a[k]|0;if(l<<24>>24!=120){if((a[i+(l&255)|0]|0)==25){m=k}else{c[g>>2]=k;h=0;return h|0}while(1){n=m+1|0;if((n|0)==(f|0)){h=-1;o=54;break}k=d[i+(d[n]|0)|0]|0;if((k|0)==18){o=33;break}else if((k|0)==25){m=n}else{o=34;break}}if((o|0)==33){c[g>>2]=m+2;h=10;return h|0}else if((o|0)==34){c[g>>2]=n;h=0;return h|0}else if((o|0)==54){return h|0}}k=e+2|0;if((k|0)==(f|0)){h=-1;return h|0}if(((d[i+(d[k]|0)|0]|0)-24|0)>>>0>=2>>>0){c[g>>2]=k;h=0;return h|0}l=e+3|0;if((l|0)==(f|0)){h=-1;return h|0}else{p=k;q=l}while(1){l=d[i+(d[q]|0)|0]|0;if((l|0)==18){o=27;break}else if(!((l|0)==25|(l|0)==24)){o=28;break}l=q+1|0;if((l|0)==(f|0)){h=-1;o=54;break}else{p=q;q=l}}if((o|0)==27){c[g>>2]=p+2;h=10;return h|0}else if((o|0)==28){c[g>>2]=q;h=0;return h|0}else if((o|0)==54){return h|0}break};case 5:{if((f-e|0)<2){h=-2;return h|0}if((Oc[c[b+340>>2]&255](b,e)|0)!=0){j=e+2|0;break a}c[g>>2]=e;h=0;return h|0};case 7:{if((f-e|0)<4){h=-2;return h|0}if((Oc[c[b+348>>2]&255](b,e)|0)!=0){j=e+4|0;break a}c[g>>2]=e;h=0;return h|0};case 6:{if((f-e|0)<3){h=-2;return h|0}if((Oc[c[b+344>>2]&255](b,e)|0)!=0){j=e+3|0;break a}c[g>>2]=e;h=0;return h|0};default:{c[g>>2]=e;h=0;return h|0}}}while(0);if((j|0)==(f|0)){h=-1;return h|0}e=f;q=b+328|0;p=b+332|0;n=b+336|0;m=j;b:while(1){switch(d[i+(d[m]|0)|0]|0){case 5:{if((e-m|0)<2){h=-2;o=54;break b}if((Oc[c[q>>2]&255](b,m)|0)==0){o=41;break b}r=m+2|0;break};case 22:case 24:case 25:case 26:case 27:{r=m+1|0;break};case 7:{if((e-m|0)<4){h=-2;o=54;break b}if((Oc[c[n>>2]&255](b,m)|0)==0){o=49;break b}r=m+4|0;break};case 6:{if((e-m|0)<3){h=-2;o=54;break b}if((Oc[c[p>>2]&255](b,m)|0)==0){o=45;break b}r=m+3|0;break};case 29:{o=37;break b;break};case 18:{o=52;break b;break};default:{o=53;break b}}if((r|0)==(f|0)){h=-1;o=54;break}else{m=r}}if((o|0)==37){c[g>>2]=m;h=0;return h|0}else if((o|0)==41){c[g>>2]=m;h=0;return h|0}else if((o|0)==45){c[g>>2]=m;h=0;return h|0}else if((o|0)==49){c[g>>2]=m;h=0;return h|0}else if((o|0)==52){c[g>>2]=m+1;h=9;return h|0}else if((o|0)==53){c[g>>2]=m;h=0;return h|0}else if((o|0)==54){return h|0}return 0}function pg(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((b|0)==(e|0)){g=-1;return g|0}h=a+72|0;a:do{switch(d[h+(d[b]|0)|0]|0|0){case 29:{c[f>>2]=b;g=0;return g|0};case 5:{if((e-b|0)<2){g=-2;return g|0}if((Oc[c[a+340>>2]&255](a,b)|0)!=0){i=b+2|0;break a}c[f>>2]=b;g=0;return g|0};case 6:{if((e-b|0)<3){g=-2;return g|0}if((Oc[c[a+344>>2]&255](a,b)|0)!=0){i=b+3|0;break a}c[f>>2]=b;g=0;return g|0};case 22:case 24:{i=b+1|0;break};case 7:{if((e-b|0)<4){g=-2;return g|0}if((Oc[c[a+348>>2]&255](a,b)|0)!=0){i=b+4|0;break a}c[f>>2]=b;g=0;return g|0};case 21:case 10:case 9:case 30:{c[f>>2]=b;g=22;return g|0};default:{c[f>>2]=b;g=0;return g|0}}}while(0);if((i|0)==(e|0)){g=-1;return g|0}b=e;j=a+328|0;k=a+332|0;l=a+336|0;m=i;b:while(1){switch(d[h+(d[m]|0)|0]|0|0){case 22:case 24:case 25:case 26:case 27:{n=m+1|0;break};case 7:{if((b-m|0)<4){g=-2;o=39;break b}if((Oc[c[l>>2]&255](a,m)|0)==0){o=34;break b}n=m+4|0;break};case 6:{if((b-m|0)<3){g=-2;o=39;break b}if((Oc[c[k>>2]&255](a,m)|0)==0){o=30;break b}n=m+3|0;break};case 29:{o=22;break b;break};case 18:{o=37;break b;break};case 5:{if((b-m|0)<2){g=-2;o=39;break b}if((Oc[c[j>>2]&255](a,m)|0)==0){o=26;break b}n=m+2|0;break};default:{o=38;break b}}if((n|0)==(e|0)){g=-1;o=39;break}else{m=n}}if((o|0)==22){c[f>>2]=m;g=0;return g|0}else if((o|0)==26){c[f>>2]=m;g=0;return g|0}else if((o|0)==30){c[f>>2]=m;g=0;return g|0}else if((o|0)==34){c[f>>2]=m;g=0;return g|0}else if((o|0)==37){c[f>>2]=m+1;g=28;return g|0}else if((o|0)==38){c[f>>2]=m;g=0;return g|0}else if((o|0)==39){return g|0}return 0}function qg(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((e|0)==(f|0)){h=-1;return h|0}if((a[e]|0)!=45){c[g>>2]=e;h=0;return h|0}i=e+1|0;if((i|0)==(f|0)){h=-1;return h|0}e=b+72|0;j=f;k=b+352|0;l=b+356|0;m=b+360|0;n=i;a:while(1){switch(d[e+(d[n]|0)|0]|0){case 0:case 1:case 8:{o=19;break a;break};case 27:{i=n+1|0;if((i|0)==(f|0)){h=-1;o=28;break a}if((a[i]|0)==45){o=23;break a}else{p=i}break};case 6:{if((j-n|0)<3){h=-2;o=28;break a}if((Oc[c[l>>2]&255](b,n)|0)!=0){o=13;break a}p=n+3|0;break};case 7:{if((j-n|0)<4){h=-2;o=28;break a}if((Oc[c[m>>2]&255](b,n)|0)!=0){o=17;break a}p=n+4|0;break};case 5:{if((j-n|0)<2){h=-2;o=28;break a}if((Oc[c[k>>2]&255](b,n)|0)!=0){o=9;break a}p=n+2|0;break};default:{p=n+1|0}}if((p|0)==(f|0)){h=-1;o=28;break}else{n=p}}if((o|0)==9){c[g>>2]=n;h=0;return h|0}else if((o|0)==13){c[g>>2]=n;h=0;return h|0}else if((o|0)==17){c[g>>2]=n;h=0;return h|0}else if((o|0)==19){c[g>>2]=n;h=0;return h|0}else if((o|0)==23){p=n+2|0;if((p|0)==(f|0)){h=-1;return h|0}if((a[p]|0)==62){c[g>>2]=n+3;h=13;return h|0}else{c[g>>2]=p;h=0;return h|0}}else if((o|0)==28){return h|0}return 0}function rg(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;if((e|0)==(f|0)){h=-1;return h|0}i=b+72|0;a:do{switch(d[i+(d[e]|0)|0]|0){case 6:{if((f-e|0)<3){h=-2;return h|0}if((Oc[c[b+344>>2]&255](b,e)|0)!=0){j=e+3|0;break a}c[g>>2]=e;h=0;return h|0};case 7:{if((f-e|0)<4){h=-2;return h|0}if((Oc[c[b+348>>2]&255](b,e)|0)!=0){j=e+4|0;break a}c[g>>2]=e;h=0;return h|0};case 29:{c[g>>2]=e;h=0;return h|0};case 22:case 24:{j=e+1|0;break};case 5:{if((f-e|0)<2){h=-2;return h|0}if((Oc[c[b+340>>2]&255](b,e)|0)!=0){j=e+2|0;break a}c[g>>2]=e;h=0;return h|0};default:{c[g>>2]=e;h=0;return h|0}}}while(0);if((j|0)==(f|0)){h=-1;return h|0}k=f;l=b+328|0;m=b+332|0;n=b+336|0;o=j;b:while(1){switch(d[i+(d[o]|0)|0]|0){case 29:{p=21;break b;break};case 15:{p=65;break b;break};case 21:case 9:case 10:{p=36;break b;break};case 7:{if((k-o|0)<4){h=-2;p=77;break b}if((Oc[c[n>>2]&255](b,o)|0)==0){p=33;break b}q=o+4|0;break};case 5:{if((k-o|0)<2){h=-2;p=77;break b}if((Oc[c[l>>2]&255](b,o)|0)==0){p=25;break b}q=o+2|0;break};case 22:case 24:case 25:case 26:case 27:{q=o+1|0;break};case 6:{if((k-o|0)<3){h=-2;p=77;break b}if((Oc[c[m>>2]&255](b,o)|0)==0){p=29;break b}q=o+3|0;break};default:{r=o;break b}}if((q|0)==(f|0)){h=-1;p=77;break}else{o=q}}do{if((p|0)==21){c[g>>2]=o;h=0;return h|0}else if((p|0)==25){c[g>>2]=o;h=0;return h|0}else if((p|0)==29){c[g>>2]=o;h=0;return h|0}else if((p|0)==33){c[g>>2]=o;h=0;return h|0}else if((p|0)==36){do{if((o-e|0)==3){q=a[e]|0;if((q|0)==88){s=1}else if((q|0)==120){s=0}else{t=11;break}q=a[e+1|0]|0;if((q|0)==109){u=s}else if((q|0)==77){u=1}else{t=11;break}q=a[e+2|0]|0;if((q|0)==108){if((u|0)==0){t=12;break}}else if((q|0)!=76){t=11;break}c[g>>2]=o;h=0;return h|0}else{t=11}}while(0);q=o+1|0;if((q|0)==(f|0)){h=-1;return h|0}m=b+352|0;l=b+356|0;n=b+360|0;j=q;c:while(1){switch(d[i+(d[j]|0)|0]|0){case 0:case 1:case 8:{p=59;break c;break};case 7:{if((k-j|0)<4){h=-2;p=77;break c}if((Oc[c[n>>2]&255](b,j)|0)!=0){p=57;break c}v=j+4|0;break};case 5:{if((k-j|0)<2){h=-2;p=77;break c}if((Oc[c[m>>2]&255](b,j)|0)!=0){p=49;break c}v=j+2|0;break};case 15:{q=j+1|0;if((q|0)==(f|0)){h=-1;p=77;break c}if((a[q]|0)==62){p=63;break c}else{v=q}break};case 6:{if((k-j|0)<3){h=-2;p=77;break c}if((Oc[c[l>>2]&255](b,j)|0)!=0){p=53;break c}v=j+3|0;break};default:{v=j+1|0}}if((v|0)==(f|0)){h=-1;p=77;break}else{j=v}}if((p|0)==49){c[g>>2]=j;h=0;return h|0}else if((p|0)==53){c[g>>2]=j;h=0;return h|0}else if((p|0)==57){c[g>>2]=j;h=0;return h|0}else if((p|0)==59){c[g>>2]=j;h=0;return h|0}else if((p|0)==63){c[g>>2]=j+2;h=t;return h|0}else if((p|0)==77){return h|0}}else if((p|0)==65){do{if((o-e|0)==3){l=a[e]|0;if((l|0)==120){w=0}else if((l|0)==88){w=1}else{x=11;break}l=a[e+1|0]|0;if((l|0)==77){y=1}else if((l|0)==109){y=w}else{x=11;break}l=a[e+2|0]|0;if((l|0)==108){if((y|0)==0){x=12;break}}else if((l|0)!=76){x=11;break}c[g>>2]=o;h=0;return h|0}else{x=11}}while(0);j=o+1|0;if((j|0)==(f|0)){h=-1;return h|0}if((a[j]|0)!=62){r=j;break}c[g>>2]=o+2;h=x;return h|0}else if((p|0)==77){return h|0}}while(0);c[g>>2]=r;h=0;return h|0}function sg(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((e|0)==(f|0)){h=-1;return h|0}i=b+72|0;j=f;k=b+352|0;l=b+356|0;m=b+360|0;n=e;a:while(1){e=d[i+(d[n]|0)|0]|0;switch(e|0){case 0:case 1:case 8:{o=16;break a;break};case 6:{if((j-n|0)<3){h=-2;o=23;break a}if((Oc[c[l>>2]&255](b,n)|0)!=0){o=10;break a}p=n+3|0;break};case 12:case 13:{q=n+1|0;if((e|0)==(a|0)){o=18;break a}else{p=q}break};case 7:{if((j-n|0)<4){h=-2;o=23;break a}if((Oc[c[m>>2]&255](b,n)|0)!=0){o=14;break a}p=n+4|0;break};case 5:{if((j-n|0)<2){h=-2;o=23;break a}if((Oc[c[k>>2]&255](b,n)|0)!=0){o=6;break a}p=n+2|0;break};default:{p=n+1|0}}if((p|0)==(f|0)){h=-1;o=23;break}else{n=p}}if((o|0)==6){c[g>>2]=n;h=0;return h|0}else if((o|0)==10){c[g>>2]=n;h=0;return h|0}else if((o|0)==14){c[g>>2]=n;h=0;return h|0}else if((o|0)==16){c[g>>2]=n;h=0;return h|0}else if((o|0)==18){if((q|0)==(f|0)){h=-27;return h|0}c[g>>2]=q;switch(d[i+(d[q]|0)|0]|0|0){case 21:case 9:case 10:case 11:case 30:case 20:{h=27;return h|0};default:{}}h=0;return h|0}else if((o|0)==23){return h|0}return 0}function tg(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;b=c[d>>2]|0;if((b|0)==(e|0)){return}else{h=b}while(1){if((c[f>>2]|0)==(g|0)){i=4;break}c[d>>2]=h+1;b=a[h]|0;j=c[f>>2]|0;c[f>>2]=j+1;a[j]=b;b=c[d>>2]|0;if((b|0)==(e|0)){i=4;break}else{h=b}}if((i|0)==4){return}}function ug(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0;a=c[e>>2]|0;if((a|0)==(f|0)){return}else{i=a}while(1){if((c[g>>2]|0)==(h|0)){j=4;break}c[e>>2]=i+1;a=d[i]|0;k=c[g>>2]|0;c[g>>2]=k+2;b[k>>1]=a;a=c[e>>2]|0;if((a|0)==(f|0)){j=4;break}else{i=a}}if((j|0)==4){return}}function vg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;k=i;i=i+120|0;l=k|0;m=k+8|0;n=k+16|0;o=k+24|0;p=k+32|0;q=k+40|0;r=k+48|0;s=k+56|0;t=k+64|0;u=k+72|0;v=k+80|0;w=k+88|0;x=k+96|0;y=k+104|0;z=k+112|0;if((d|0)==(e|0)){c[f>>2]=0;A=1;i=k;return A|0}B=y|0;c[x>>2]=d;c[z>>2]=B;C=b+56|0;D=y+1|0;Bc[c[C>>2]&63](b,x,e,z,D);do{if((c[z>>2]|0)!=(B|0)){x=a[B]|0;if(!((x|0)==32|(x|0)==13|(x|0)==10|(x|0)==9)){break}x=b+64|0;y=d+(c[x>>2]|0)|0;c[t>>2]=y;c[u>>2]=B;Bc[c[C>>2]&63](b,t,e,u,D);a:do{if((c[u>>2]|0)==(B|0)){E=y}else{F=y;while(1){G=a[B]|0;if(!((G|0)==32|(G|0)==13|(G|0)==10|(G|0)==9)){E=F;break a}G=F+(c[x>>2]|0)|0;c[t>>2]=G;c[u>>2]=B;Bc[c[C>>2]&63](b,t,e,u,D);if((c[u>>2]|0)==(B|0)){E=G;break}else{F=G}}}}while(0);if((E|0)==(e|0)){c[f>>2]=0;A=1;i=k;return A|0}c[f>>2]=E;c[p>>2]=E;c[q>>2]=B;Bc[c[C>>2]&63](b,p,e,q,D);b:do{if((c[q>>2]|0)==(B|0)){H=E}else{y=E;c:while(1){switch(a[B]|0){case-1:{H=y;break b;break};case 32:case 13:case 10:case 9:{I=15;break c;break};case 61:{I=14;break c;break};default:{}}F=y+(c[x>>2]|0)|0;c[p>>2]=F;c[q>>2]=B;Bc[c[C>>2]&63](b,p,e,q,D);if((c[q>>2]|0)==(B|0)){H=F;break b}else{y=F}}d:do{if((I|0)==14){c[g>>2]=y;J=y}else if((I|0)==15){c[g>>2]=y;F=y+(c[x>>2]|0)|0;c[l>>2]=F;c[m>>2]=B;Bc[c[C>>2]&63](b,l,e,m,D);e:do{if((c[m>>2]|0)==(B|0)){K=F}else{G=F;while(1){switch(a[B]|0){case 61:{J=G;break d;break};case 32:case 13:case 10:case 9:{break};default:{K=G;break e}}L=G+(c[x>>2]|0)|0;c[l>>2]=L;c[m>>2]=B;Bc[c[C>>2]&63](b,l,e,m,D);if((c[m>>2]|0)==(B|0)){K=L;break e}else{G=L}}}}while(0);c[j>>2]=K;A=0;i=k;return A|0}}while(0);if((J|0)==(c[f>>2]|0)){c[j>>2]=J;A=0;i=k;return A|0}y=J+(c[x>>2]|0)|0;c[n>>2]=y;c[o>>2]=B;Bc[c[C>>2]&63](b,n,e,o,D);if((c[o>>2]|0)==(B|0)){M=-1}else{M=a[B]|0}F=M;G=y;f:while(1){switch(F|0){case 39:case 34:{break f;break};case 32:case 13:case 10:case 9:{break};default:{I=28;break f}}y=G+(c[x>>2]|0)|0;c[r>>2]=y;c[s>>2]=B;Bc[c[C>>2]&63](b,r,e,s,D);if((c[s>>2]|0)==(B|0)){F=-1;G=y;continue}F=a[B]|0;G=y}if((I|0)==28){c[j>>2]=G;A=0;i=k;return A|0}y=G+(c[x>>2]|0)|0;c[h>>2]=y;L=y;while(1){c[v>>2]=L;c[w>>2]=B;Bc[c[C>>2]&63](b,v,e,w,D);if((c[w>>2]|0)==(B|0)){N=-1}else{N=a[B]|0}if((N|0)==(F|0)){I=37;break}if((N-65|0)>>>0>25>>>0&(N-97|0)>>>0>25>>>0&(N-48|0)>>>0>9>>>0){if(!((N|0)==95|(N|0)==46|(N|0)==45)){I=35;break}}L=L+(c[x>>2]|0)|0}if((I|0)==35){c[j>>2]=L;A=0;i=k;return A|0}else if((I|0)==37){c[j>>2]=L+(c[x>>2]|0);A=1;i=k;return A|0}}}while(0);c[j>>2]=H;A=0;i=k;return A|0}}while(0);c[j>>2]=d;A=0;i=k;return A|0}function wg(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((f|0)==(g|0)){i=-4;return i|0}j=c[b+72>>2]|0;k=f+1|0;a:do{if((k|0)==(g|0)){if((e|0)!=1){i=-1;return i|0}l=a[b+69|0]|0;if(((l<<24>>24)-3|0)>>>0<3>>>0){i=-1;return i|0}switch(d[f]|0){case 254:case 255:case 239:{break};case 0:case 60:{i=-1;return i|0};default:{break a}}if(l<<24>>24==0){break}else{i=-1}return i|0}else{l=a[f]|0;m=a[k]|0;n=(l&255)<<8|m&255;if((n|0)==61371){if((e|0)==1){o=a[b+69|0]|0;if((o&-5)<<24>>24==0|o<<24>>24==5|o<<24>>24==3){break}}o=f+2|0;if((o|0)==(g|0)){i=-1;return i|0}if((a[o]|0)!=-65){break}c[h>>2]=f+3;c[j>>2]=600;i=14;return i|0}else if((n|0)==65534){if((a[b+69|0]|0)==0&(e|0)==1){break}c[h>>2]=f+2;c[j>>2]=20048;i=14;return i|0}else if((n|0)==65279){if((a[b+69|0]|0)==0&(e|0)==1){break}c[h>>2]=f+2;c[j>>2]=71352;i=14;return i|0}else if((n|0)==15360){if(((a[b+69|0]|0)-3&255)>>>0<2>>>0&(e|0)==1){break}c[j>>2]=20048;i=Sc[c[20048+(e<<2)>>2]&127](20048,f,g,h)|0;return i|0}else{if(l<<24>>24!=0){if(m<<24>>24!=0|(e|0)==1){break}c[j>>2]=20048;i=Sc[c[20048+(e<<2)>>2]&127](20048,f,g,h)|0;return i|0}if((e|0)==1){if((a[b+69|0]|0)==5){break}}c[j>>2]=71352;i=Sc[c[71352+(e<<2)>>2]&127](71352,f,g,h)|0;return i|0}}}while(0);k=c[28632+(a[b+69|0]<<2)>>2]|0;c[j>>2]=k;i=Sc[c[k+(e<<2)>>2]&127](k,f,g,h)|0;return i|0}function xg(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;b=g;h=c[d>>2]|0;if((h|0)==(e|0)){return}else{i=h}while(1){h=a[i]|0;j=c[f>>2]|0;if(h<<24>>24>-1){if((j|0)==(g|0)){k=8;break}c[d>>2]=i+1;l=a[i]|0;m=c[f>>2]|0;c[f>>2]=m+1;a[m]=l;n=c[d>>2]|0}else{if((b-j|0)<2){k=8;break}c[f>>2]=j+1;a[j]=(h&255)>>>6|-64;j=c[f>>2]|0;c[f>>2]=j+1;a[j]=h&63|-128;h=(c[d>>2]|0)+1|0;c[d>>2]=h;n=h}if((n|0)==(e|0)){k=8;break}else{i=n}}if((k|0)==8){return}}function yg(a,b,c){a=a|0;b=b|0;c=c|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;e=a>>>16;f=a&65535;if((c|0)==1){a=(d[b]|0)+f|0;g=a>>>0>65520>>>0?a-65521|0:a;a=g+e|0;h=(a>>>0>65520>>>0?a+15|0:a)<<16|g;return h|0}if((b|0)==0){h=1;return h|0}if(c>>>0<16>>>0){if((c|0)==0){i=f;j=e}else{g=f;a=b;k=c;l=e;while(1){m=k-1|0;n=(d[a]|0)+g|0;o=n+l|0;if((m|0)==0){i=n;j=o;break}else{g=n;a=a+1|0;k=m;l=o}}}h=((j>>>0)%65521|0)<<16|(i>>>0>65520>>>0?i-65521|0:i);return h|0}do{if(c>>>0>5551>>>0){i=f;j=b;l=c;k=e;do{l=l-5552|0;a=347;g=k;o=j;m=i;while(1){n=(d[o]|0)+m|0;p=n+(d[o+1|0]|0)|0;q=p+(d[o+2|0]|0)|0;r=q+(d[o+3|0]|0)|0;s=r+(d[o+4|0]|0)|0;t=s+(d[o+5|0]|0)|0;u=t+(d[o+6|0]|0)|0;v=u+(d[o+7|0]|0)|0;w=v+(d[o+8|0]|0)|0;x=w+(d[o+9|0]|0)|0;y=x+(d[o+10|0]|0)|0;z=y+(d[o+11|0]|0)|0;A=z+(d[o+12|0]|0)|0;B=A+(d[o+13|0]|0)|0;C=B+(d[o+14|0]|0)|0;D=C+(d[o+15|0]|0)|0;E=n+g+p+q+r+s+t+u+v+w+x+y+z+A+B+C+D|0;C=a-1|0;if((C|0)==0){break}else{a=C;g=E;o=o+16|0;m=D}}j=j+5552|0;i=(D>>>0)%65521|0;k=(E>>>0)%65521|0;}while(l>>>0>5551>>>0);if((l|0)==0){F=k;G=i;break}if(l>>>0>15>>>0){H=i;I=j;J=l;K=k;L=15}else{M=i;N=j;O=l;P=k;L=16}}else{H=f;I=b;J=c;K=e;L=15}}while(0);if((L|0)==15){while(1){L=0;Q=J-16|0;e=(d[I]|0)+H|0;c=e+(d[I+1|0]|0)|0;b=c+(d[I+2|0]|0)|0;f=b+(d[I+3|0]|0)|0;E=f+(d[I+4|0]|0)|0;D=E+(d[I+5|0]|0)|0;m=D+(d[I+6|0]|0)|0;o=m+(d[I+7|0]|0)|0;g=o+(d[I+8|0]|0)|0;a=g+(d[I+9|0]|0)|0;C=a+(d[I+10|0]|0)|0;B=C+(d[I+11|0]|0)|0;A=B+(d[I+12|0]|0)|0;z=A+(d[I+13|0]|0)|0;y=z+(d[I+14|0]|0)|0;R=y+(d[I+15|0]|0)|0;S=e+K+c+b+f+E+D+m+o+g+a+C+B+A+z+y+R|0;T=I+16|0;if(Q>>>0>15>>>0){H=R;I=T;J=Q;K=S;L=15}else{break}}if((Q|0)==0){U=R;V=S;L=17}else{M=R;N=T;O=Q;P=S;L=16}}if((L|0)==16){while(1){L=0;S=O-1|0;Q=(d[N]|0)+M|0;T=Q+P|0;if((S|0)==0){U=Q;V=T;L=17;break}else{M=Q;N=N+1|0;O=S;P=T;L=16}}}if((L|0)==17){F=(V>>>0)%65521|0;G=(U>>>0)%65521|0}h=F<<16|G;return h|0}function zg(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((b|0)==0){f=0;return f|0}g=~a;a:do{if((e|0)==0){h=g}else{a=b;i=e;j=g;while(1){if((a&3|0)==0){break}k=c[29760+(((d[a]|0)^j&255)<<2)>>2]^j>>>8;l=i-1|0;if((l|0)==0){h=k;break a}else{a=a+1|0;i=l;j=k}}k=a;if(i>>>0>31>>>0){l=i;m=j;n=k;while(1){o=c[n>>2]^m;p=c[31808+((o>>>8&255)<<2)>>2]^c[32832+((o&255)<<2)>>2]^c[30784+((o>>>16&255)<<2)>>2]^c[29760+(o>>>24<<2)>>2]^c[n+4>>2];o=c[31808+((p>>>8&255)<<2)>>2]^c[32832+((p&255)<<2)>>2]^c[30784+((p>>>16&255)<<2)>>2]^c[29760+(p>>>24<<2)>>2]^c[n+8>>2];p=c[31808+((o>>>8&255)<<2)>>2]^c[32832+((o&255)<<2)>>2]^c[30784+((o>>>16&255)<<2)>>2]^c[29760+(o>>>24<<2)>>2]^c[n+12>>2];o=c[31808+((p>>>8&255)<<2)>>2]^c[32832+((p&255)<<2)>>2]^c[30784+((p>>>16&255)<<2)>>2]^c[29760+(p>>>24<<2)>>2]^c[n+16>>2];p=c[31808+((o>>>8&255)<<2)>>2]^c[32832+((o&255)<<2)>>2]^c[30784+((o>>>16&255)<<2)>>2]^c[29760+(o>>>24<<2)>>2]^c[n+20>>2];o=c[31808+((p>>>8&255)<<2)>>2]^c[32832+((p&255)<<2)>>2]^c[30784+((p>>>16&255)<<2)>>2]^c[29760+(p>>>24<<2)>>2]^c[n+24>>2];p=n+32|0;q=c[31808+((o>>>8&255)<<2)>>2]^c[32832+((o&255)<<2)>>2]^c[30784+((o>>>16&255)<<2)>>2]^c[29760+(o>>>24<<2)>>2]^c[n+28>>2];o=c[31808+((q>>>8&255)<<2)>>2]^c[32832+((q&255)<<2)>>2]^c[30784+((q>>>16&255)<<2)>>2]^c[29760+(q>>>24<<2)>>2];q=l-32|0;if(q>>>0>31>>>0){l=q;m=o;n=p}else{r=q;s=o;t=p;break}}}else{r=i;s=j;t=k}if(r>>>0>3>>>0){n=r;m=s;l=t;while(1){a=l+4|0;p=c[l>>2]^m;o=c[31808+((p>>>8&255)<<2)>>2]^c[32832+((p&255)<<2)>>2]^c[30784+((p>>>16&255)<<2)>>2]^c[29760+(p>>>24<<2)>>2];p=n-4|0;if(p>>>0>3>>>0){n=p;m=o;l=a}else{u=p;v=o;w=a;break}}}else{u=r;v=s;w=t}if((u|0)==0){h=v;break}l=v;m=u;n=w;while(1){k=c[29760+(((d[n]|0)^l&255)<<2)>>2]^l>>>8;j=m-1|0;if((j|0)==0){h=k;break}else{l=k;m=j;n=n+1|0}}}}while(0);f=~h;return f|0}function Ag(d,f,g,h,i,j,k,l){d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;if((k|0)==0){m=-6;return m|0}if(!((a[k]|0)==49&(l|0)==56)){m=-6;return m|0}if((d|0)==0){m=-2;return m|0}l=d+24|0;c[l>>2]=0;k=d+32|0;n=c[k>>2]|0;if((n|0)==0){c[k>>2]=36;c[d+40>>2]=0;o=36}else{o=n}n=d+36|0;if((c[n>>2]|0)==0){c[n>>2]=4}n=(f|0)==-1?6:f;if((h|0)<0){p=0;q=-h|0}else{f=(h|0)>15;p=f?2:1;q=f?h-16|0:h}if(!((i-1|0)>>>0<9>>>0&(g|0)==8)){m=-2;return m|0}if((q-8|0)>>>0>7>>>0|n>>>0>9>>>0|j>>>0>4>>>0){m=-2;return m|0}g=(q|0)==8?9:q;q=d+40|0;h=Hc[o&63](c[q>>2]|0,1,5828)|0;if((h|0)==0){m=-4;return m|0}o=d+28|0;c[o>>2]=h;c[h>>2]=d;c[h+24>>2]=p;c[h+28>>2]=0;c[h+48>>2]=g;p=1<<g;g=h+44|0;c[g>>2]=p;c[h+52>>2]=p-1;f=i+7|0;c[h+80>>2]=f;r=1<<f;f=h+76|0;c[f>>2]=r;c[h+84>>2]=r-1;c[h+88>>2]=((i+9|0)>>>0)/3|0;r=h+56|0;c[r>>2]=Hc[c[k>>2]&63](c[q>>2]|0,p,2)|0;p=h+64|0;c[p>>2]=Hc[c[k>>2]&63](c[q>>2]|0,c[g>>2]|0,2)|0;g=h+68|0;c[g>>2]=Hc[c[k>>2]&63](c[q>>2]|0,c[f>>2]|0,2)|0;c[h+5824>>2]=0;f=1<<i+6;i=h+5788|0;c[i>>2]=f;s=Hc[c[k>>2]&63](c[q>>2]|0,f,4)|0;f=s;c[h+8>>2]=s;q=c[i>>2]|0;c[h+12>>2]=q<<2;do{if((c[r>>2]|0)!=0){if((c[p>>2]|0)==0){break}if((c[g>>2]|0)==0|(s|0)==0){break}c[h+5796>>2]=f+(q>>>1<<1);c[h+5784>>2]=s+(q*3|0);c[h+132>>2]=n;c[h+136>>2]=j;a[h+36|0]=8;i=Dg(d)|0;if((i|0)!=0){m=i;return m|0}i=c[o>>2]|0;c[i+60>>2]=c[i+44>>2]<<1;k=i+76|0;t=i+68|0;b[(c[t>>2]|0)+((c[k>>2]|0)-1<<1)>>1]=0;vF(c[t>>2]|0,0,(c[k>>2]<<1)-2|0)|0;k=c[i+132>>2]|0;c[i+128>>2]=e[40330+(k*12|0)>>1]|0;c[i+140>>2]=e[40328+(k*12|0)>>1]|0;c[i+144>>2]=e[40332+(k*12|0)>>1]|0;c[i+124>>2]=e[40334+(k*12|0)>>1]|0;c[i+108>>2]=0;c[i+92>>2]=0;c[i+116>>2]=0;c[i+5812>>2]=0;c[i+120>>2]=2;c[i+96>>2]=2;c[i+104>>2]=0;c[i+72>>2]=0;m=0;return m|0}}while(0);c[h+4>>2]=666;c[l>>2]=c[12];Bg(d)|0;m=-4;return m|0}function Bg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if((a|0)==0){b=-2;return b|0}d=a+28|0;e=c[d>>2]|0;if((e|0)==0){b=-2;return b|0}f=c[e+4>>2]|0;switch(f|0){case 666:case 113:case 103:case 91:case 73:case 69:case 42:{break};default:{b=-2;return b|0}}g=c[e+8>>2]|0;if((g|0)==0){h=e}else{Dc[c[a+36>>2]&63](c[a+40>>2]|0,g);h=c[d>>2]|0}g=c[h+68>>2]|0;if((g|0)==0){i=h}else{Dc[c[a+36>>2]&63](c[a+40>>2]|0,g);i=c[d>>2]|0}g=c[i+64>>2]|0;if((g|0)==0){j=i}else{Dc[c[a+36>>2]&63](c[a+40>>2]|0,g);j=c[d>>2]|0}g=c[j+56>>2]|0;i=a+36|0;if((g|0)==0){k=j;l=a+40|0}else{j=a+40|0;Dc[c[i>>2]&63](c[j>>2]|0,g);k=c[d>>2]|0;l=j}Dc[c[i>>2]&63](c[l>>2]|0,k);c[d>>2]=0;b=(f|0)==113?-3:0;return b|0}function Cg(a){a=a|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;f=a+44|0;g=c[f>>2]|0;h=a+60|0;i=a+116|0;j=a+108|0;k=g-262|0;l=a|0;m=a+56|0;n=a+5812|0;o=a+72|0;p=a+88|0;q=a+84|0;r=a+68|0;s=a+52|0;t=a+64|0;u=a+112|0;v=a+92|0;w=a+76|0;x=c[i>>2]|0;y=g;while(1){z=c[j>>2]|0;A=(c[h>>2]|0)-x-z|0;if(z>>>0<(k+y|0)>>>0){B=A}else{z=c[m>>2]|0;tF(z|0,z+g|0,g)|0;c[u>>2]=(c[u>>2]|0)-g;c[j>>2]=(c[j>>2]|0)-g;c[v>>2]=(c[v>>2]|0)-g;z=c[w>>2]|0;C=z;D=(c[r>>2]|0)+(z<<1)|0;do{D=D-2|0;z=e[D>>1]|0;if(z>>>0<g>>>0){E=0}else{E=z-g&65535}b[D>>1]=E;C=C-1|0;}while((C|0)!=0);C=g;D=(c[t>>2]|0)+(g<<1)|0;do{D=D-2|0;z=e[D>>1]|0;if(z>>>0<g>>>0){F=0}else{F=z-g&65535}b[D>>1]=F;C=C-1|0;}while((C|0)!=0);B=A+g|0}C=c[l>>2]|0;D=C+4|0;z=c[D>>2]|0;if((z|0)==0){break}G=c[i>>2]|0;H=(c[m>>2]|0)+(G+(c[j>>2]|0))|0;I=z>>>0>B>>>0?B:z;if((I|0)==0){J=0;K=G}else{c[D>>2]=z-I;z=C|0;tF(H|0,c[z>>2]|0,I)|0;D=c[(c[C+28>>2]|0)+24>>2]|0;if((D|0)==1){G=C+48|0;c[G>>2]=yg(c[G>>2]|0,H,I)|0}else if((D|0)==2){D=C+48|0;c[D>>2]=zg(c[D>>2]|0,H,I)|0}c[z>>2]=(c[z>>2]|0)+I;z=C+8|0;c[z>>2]=(c[z>>2]|0)+I;J=I;K=c[i>>2]|0}I=K+J|0;c[i>>2]=I;z=c[n>>2]|0;a:do{if((I+z|0)>>>0>2>>>0){C=(c[j>>2]|0)-z|0;H=c[m>>2]|0;D=d[H+C|0]|0;c[o>>2]=D;c[o>>2]=((d[H+(C+1)|0]|0)^D<<c[p>>2])&c[q>>2];D=C;C=z;H=I;while(1){if((C|0)==0){L=H;break a}G=((d[(c[m>>2]|0)+(D+2)|0]|0)^c[o>>2]<<c[p>>2])&c[q>>2];c[o>>2]=G;b[(c[t>>2]|0)+((c[s>>2]&D)<<1)>>1]=b[(c[r>>2]|0)+(G<<1)>>1]|0;b[(c[r>>2]|0)+(c[o>>2]<<1)>>1]=D;G=(c[n>>2]|0)-1|0;c[n>>2]=G;M=c[i>>2]|0;if((M+G|0)>>>0<3>>>0){L=M;break}else{D=D+1|0;C=G;H=M}}}else{L=I}}while(0);if(L>>>0>=262>>>0){break}if((c[(c[l>>2]|0)+4>>2]|0)==0){break}x=L;y=c[f>>2]|0}f=a+5824|0;a=c[f>>2]|0;y=c[h>>2]|0;if(a>>>0>=y>>>0){return}h=(c[i>>2]|0)+(c[j>>2]|0)|0;if(a>>>0<h>>>0){j=y-h|0;i=j>>>0>258>>>0?258:j;vF((c[m>>2]|0)+h|0,0,i|0)|0;c[f>>2]=i+h;return}i=h+258|0;if(a>>>0>=i>>>0){return}h=i-a|0;i=y-a|0;y=h>>>0>i>>>0?i:h;vF((c[m>>2]|0)+a|0,0,y|0)|0;c[f>>2]=(c[f>>2]|0)+y;return}function Dg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;if((a|0)==0){b=-2;return b|0}d=c[a+28>>2]|0;if((d|0)==0){b=-2;return b|0}if((c[a+32>>2]|0)==0){b=-2;return b|0}if((c[a+36>>2]|0)==0){b=-2;return b|0}c[a+20>>2]=0;c[a+8>>2]=0;c[a+24>>2]=0;c[a+44>>2]=2;c[d+20>>2]=0;c[d+16>>2]=c[d+8>>2];e=d+24|0;f=c[e>>2]|0;if((f|0)<0){g=-f|0;c[e>>2]=g;h=g}else{h=f}c[d+4>>2]=(h|0)!=0?42:113;if((h|0)==2){i=zg(0,0,0)|0}else{i=yg(0,0,0)|0}c[a+48>>2]=i;c[d+40>>2]=0;Jg(d);b=0;return b|0}function Eg(e,f){e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0;if((e|0)==0){g=-2;return g|0}h=e+28|0;i=c[h>>2]|0;if((i|0)==0|f>>>0>5>>>0){g=-2;return g|0}j=e+12|0;do{if((c[j>>2]|0)!=0){if((c[e>>2]|0)==0){if((c[e+4>>2]|0)!=0){break}}k=i+4|0;l=c[k>>2]|0;m=(f|0)==4;if(!((l|0)!=666|m)){break}n=e+16|0;if((c[n>>2]|0)==0){c[e+24>>2]=c[13];g=-5;return g|0}o=i|0;c[o>>2]=e;p=i+40|0;q=c[p>>2]|0;c[p>>2]=f;do{if((l|0)==42){if((c[i+24>>2]|0)!=2){r=(c[i+48>>2]<<12)-30720|0;do{if((c[i+136>>2]|0)>1){s=0}else{t=c[i+132>>2]|0;if((t|0)<2){s=0;break}if((t|0)<6){s=64;break}s=(t|0)==6?128:192}}while(0);t=s|r;u=i+108|0;v=(c[u>>2]|0)==0?t:t|32;c[k>>2]=113;t=i+20|0;w=c[t>>2]|0;c[t>>2]=w+1;x=i+8|0;a[(c[x>>2]|0)+w|0]=v>>>8;w=c[t>>2]|0;c[t>>2]=w+1;a[(c[x>>2]|0)+w|0]=(v|((v>>>0)%31|0))^31;v=e+48|0;if((c[u>>2]|0)!=0){u=c[v>>2]|0;w=c[t>>2]|0;c[t>>2]=w+1;a[(c[x>>2]|0)+w|0]=u>>>24;w=c[t>>2]|0;c[t>>2]=w+1;a[(c[x>>2]|0)+w|0]=u>>>16;u=c[v>>2]|0;w=c[t>>2]|0;c[t>>2]=w+1;a[(c[x>>2]|0)+w|0]=u>>>8;w=c[t>>2]|0;c[t>>2]=w+1;a[(c[x>>2]|0)+w|0]=u}c[v>>2]=yg(0,0,0)|0;y=c[k>>2]|0;z=32;break}v=e+48|0;c[v>>2]=zg(0,0,0)|0;u=i+20|0;w=c[u>>2]|0;c[u>>2]=w+1;x=i+8|0;a[(c[x>>2]|0)+w|0]=31;w=c[u>>2]|0;c[u>>2]=w+1;a[(c[x>>2]|0)+w|0]=-117;w=c[u>>2]|0;c[u>>2]=w+1;a[(c[x>>2]|0)+w|0]=8;w=i+28|0;t=c[w>>2]|0;if((t|0)==0){A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=0;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=0;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=0;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=0;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=0;A=c[i+132>>2]|0;do{if((A|0)==9){B=2}else{if((c[i+136>>2]|0)>1){B=4;break}B=(A|0)<2?4:0}}while(0);A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=B;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=3;c[k>>2]=113;break}A=((c[t+44>>2]|0)!=0?2:0)|(c[t>>2]|0)!=0|((c[t+16>>2]|0)==0?0:4)|((c[t+28>>2]|0)==0?0:8)|((c[t+36>>2]|0)==0?0:16);r=c[u>>2]|0;c[u>>2]=r+1;a[(c[x>>2]|0)+r|0]=A;A=c[(c[w>>2]|0)+4>>2]&255;r=c[u>>2]|0;c[u>>2]=r+1;a[(c[x>>2]|0)+r|0]=A;A=(c[(c[w>>2]|0)+4>>2]|0)>>>8&255;r=c[u>>2]|0;c[u>>2]=r+1;a[(c[x>>2]|0)+r|0]=A;A=(c[(c[w>>2]|0)+4>>2]|0)>>>16&255;r=c[u>>2]|0;c[u>>2]=r+1;a[(c[x>>2]|0)+r|0]=A;A=(c[(c[w>>2]|0)+4>>2]|0)>>>24&255;r=c[u>>2]|0;c[u>>2]=r+1;a[(c[x>>2]|0)+r|0]=A;A=c[i+132>>2]|0;do{if((A|0)==9){C=2}else{if((c[i+136>>2]|0)>1){C=4;break}C=(A|0)<2?4:0}}while(0);A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=C;A=c[(c[w>>2]|0)+12>>2]&255;t=c[u>>2]|0;c[u>>2]=t+1;a[(c[x>>2]|0)+t|0]=A;A=c[w>>2]|0;if((c[A+16>>2]|0)==0){D=A}else{t=c[A+20>>2]&255;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=t;t=(c[(c[w>>2]|0)+20>>2]|0)>>>8&255;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=t;D=c[w>>2]|0}if((c[D+44>>2]|0)!=0){c[v>>2]=zg(c[v>>2]|0,c[x>>2]|0,c[u>>2]|0)|0}c[i+32>>2]=0;c[k>>2]=69;E=w;z=34}else{y=l;z=32}}while(0);do{if((z|0)==32){if((y|0)!=69){F=y;z=55;break}E=i+28|0;z=34}}while(0);do{if((z|0)==34){l=c[E>>2]|0;if((c[l+16>>2]|0)==0){c[k>>2]=73;G=l;z=57;break}t=i+20|0;A=c[t>>2]|0;r=i+32|0;H=c[r>>2]|0;a:do{if(H>>>0<(c[l+20>>2]&65535)>>>0){I=i+12|0;J=e+48|0;K=i+8|0;L=e+20|0;M=A;N=l;O=A;P=H;while(1){if((O|0)==(c[I>>2]|0)){if((c[N+44>>2]|0)!=0&O>>>0>M>>>0){c[J>>2]=zg(c[J>>2]|0,(c[K>>2]|0)+M|0,O-M|0)|0}Q=c[h>>2]|0;Mg(Q);R=Q+20|0;S=c[R>>2]|0;T=c[n>>2]|0;U=S>>>0>T>>>0?T:S;do{if((U|0)!=0){S=Q+16|0;tF(c[j>>2]|0,c[S>>2]|0,U)|0;c[j>>2]=(c[j>>2]|0)+U;c[S>>2]=(c[S>>2]|0)+U;c[L>>2]=(c[L>>2]|0)+U;c[n>>2]=(c[n>>2]|0)-U;T=c[R>>2]|0;c[R>>2]=T-U;if((T|0)!=(U|0)){break}c[S>>2]=c[Q+8>>2]}}while(0);V=c[t>>2]|0;if((V|0)==(c[I>>2]|0)){break}W=V;X=V;Y=c[r>>2]|0;Z=c[E>>2]|0}else{W=M;X=O;Y=P;Z=N}Q=a[(c[Z+16>>2]|0)+Y|0]|0;c[t>>2]=X+1;a[(c[K>>2]|0)+X|0]=Q;Q=(c[r>>2]|0)+1|0;c[r>>2]=Q;U=c[E>>2]|0;if(Q>>>0>=(c[U+20>>2]&65535)>>>0){_=W;$=U;break a}M=W;N=U;O=c[t>>2]|0;P=Q}_=V;$=c[E>>2]|0}else{_=A;$=l}}while(0);do{if((c[$+44>>2]|0)==0){aa=$}else{l=c[t>>2]|0;if(l>>>0<=_>>>0){aa=$;break}A=e+48|0;c[A>>2]=zg(c[A>>2]|0,(c[i+8>>2]|0)+_|0,l-_|0)|0;aa=c[E>>2]|0}}while(0);if((c[r>>2]|0)==(c[aa+20>>2]|0)){c[r>>2]=0;c[k>>2]=73;G=aa;z=57;break}else{F=c[k>>2]|0;z=55;break}}}while(0);do{if((z|0)==55){if((F|0)!=73){ba=F;z=75;break}G=c[i+28>>2]|0;z=57}}while(0);do{if((z|0)==57){t=i+28|0;if((c[G+28>>2]|0)==0){c[k>>2]=91;ca=t;z=77;break}l=i+20|0;A=c[l>>2]|0;H=i+12|0;w=e+48|0;u=i+8|0;x=e+20|0;v=i+32|0;P=A;O=A;while(1){if((O|0)==(c[H>>2]|0)){if((c[(c[t>>2]|0)+44>>2]|0)!=0&O>>>0>P>>>0){c[w>>2]=zg(c[w>>2]|0,(c[u>>2]|0)+P|0,O-P|0)|0}A=c[h>>2]|0;Mg(A);N=A+20|0;M=c[N>>2]|0;K=c[n>>2]|0;I=M>>>0>K>>>0?K:M;do{if((I|0)!=0){M=A+16|0;tF(c[j>>2]|0,c[M>>2]|0,I)|0;c[j>>2]=(c[j>>2]|0)+I;c[M>>2]=(c[M>>2]|0)+I;c[x>>2]=(c[x>>2]|0)+I;c[n>>2]=(c[n>>2]|0)-I;K=c[N>>2]|0;c[N>>2]=K-I;if((K|0)!=(I|0)){break}c[M>>2]=c[A+8>>2]}}while(0);A=c[l>>2]|0;if((A|0)==(c[H>>2]|0)){da=1;ea=A;break}else{fa=A;ga=A}}else{fa=P;ga=O}A=c[v>>2]|0;c[v>>2]=A+1;I=a[(c[(c[t>>2]|0)+28>>2]|0)+A|0]|0;c[l>>2]=ga+1;a[(c[u>>2]|0)+ga|0]=I;if(I<<24>>24==0){da=I&255;ea=fa;break}P=fa;O=c[l>>2]|0}do{if((c[(c[t>>2]|0)+44>>2]|0)!=0){O=c[l>>2]|0;if(O>>>0<=ea>>>0){break}c[w>>2]=zg(c[w>>2]|0,(c[u>>2]|0)+ea|0,O-ea|0)|0}}while(0);if((da|0)==0){c[v>>2]=0;c[k>>2]=91;ca=t;z=77;break}else{ba=c[k>>2]|0;z=75;break}}}while(0);do{if((z|0)==75){if((ba|0)!=91){ha=ba;z=95;break}ca=i+28|0;z=77}}while(0);do{if((z|0)==77){if((c[(c[ca>>2]|0)+36>>2]|0)==0){c[k>>2]=103;ia=ca;z=97;break}u=i+20|0;w=c[u>>2]|0;l=i+12|0;O=e+48|0;P=i+8|0;H=e+20|0;x=i+32|0;r=w;I=w;while(1){if((I|0)==(c[l>>2]|0)){if((c[(c[ca>>2]|0)+44>>2]|0)!=0&I>>>0>r>>>0){c[O>>2]=zg(c[O>>2]|0,(c[P>>2]|0)+r|0,I-r|0)|0}w=c[h>>2]|0;Mg(w);A=w+20|0;N=c[A>>2]|0;M=c[n>>2]|0;K=N>>>0>M>>>0?M:N;do{if((K|0)!=0){N=w+16|0;tF(c[j>>2]|0,c[N>>2]|0,K)|0;c[j>>2]=(c[j>>2]|0)+K;c[N>>2]=(c[N>>2]|0)+K;c[H>>2]=(c[H>>2]|0)+K;c[n>>2]=(c[n>>2]|0)-K;M=c[A>>2]|0;c[A>>2]=M-K;if((M|0)!=(K|0)){break}c[N>>2]=c[w+8>>2]}}while(0);w=c[u>>2]|0;if((w|0)==(c[l>>2]|0)){ja=1;ka=w;break}else{la=w;ma=w}}else{la=r;ma=I}w=c[x>>2]|0;c[x>>2]=w+1;K=a[(c[(c[ca>>2]|0)+36>>2]|0)+w|0]|0;c[u>>2]=ma+1;a[(c[P>>2]|0)+ma|0]=K;if(K<<24>>24==0){ja=K&255;ka=la;break}r=la;I=c[u>>2]|0}do{if((c[(c[ca>>2]|0)+44>>2]|0)!=0){I=c[u>>2]|0;if(I>>>0<=ka>>>0){break}c[O>>2]=zg(c[O>>2]|0,(c[P>>2]|0)+ka|0,I-ka|0)|0}}while(0);if((ja|0)==0){c[k>>2]=103;ia=ca;z=97;break}else{ha=c[k>>2]|0;z=95;break}}}while(0);do{if((z|0)==95){if((ha|0)!=103){break}ia=i+28|0;z=97}}while(0);do{if((z|0)==97){if((c[(c[ia>>2]|0)+44>>2]|0)==0){c[k>>2]=113;break}P=i+20|0;O=i+12|0;do{if(((c[P>>2]|0)+2|0)>>>0>(c[O>>2]|0)>>>0){u=c[h>>2]|0;Mg(u);I=u+20|0;r=c[I>>2]|0;x=c[n>>2]|0;l=r>>>0>x>>>0?x:r;if((l|0)==0){break}r=u+16|0;tF(c[j>>2]|0,c[r>>2]|0,l)|0;c[j>>2]=(c[j>>2]|0)+l;c[r>>2]=(c[r>>2]|0)+l;x=e+20|0;c[x>>2]=(c[x>>2]|0)+l;c[n>>2]=(c[n>>2]|0)-l;x=c[I>>2]|0;c[I>>2]=x-l;if((x|0)!=(l|0)){break}c[r>>2]=c[u+8>>2]}}while(0);u=c[P>>2]|0;if((u+2|0)>>>0>(c[O>>2]|0)>>>0){break}r=e+48|0;l=c[r>>2]&255;c[P>>2]=u+1;x=i+8|0;a[(c[x>>2]|0)+u|0]=l;l=(c[r>>2]|0)>>>8&255;u=c[P>>2]|0;c[P>>2]=u+1;a[(c[x>>2]|0)+u|0]=l;c[r>>2]=zg(0,0,0)|0;c[k>>2]=113}}while(0);r=i+20|0;do{if((c[r>>2]|0)==0){if((c[e+4>>2]|0)!=0){break}if(((f<<1)-((f|0)>4?9:0)|0)>((q<<1)-((q|0)>4?9:0)|0)|m){break}c[e+24>>2]=c[13];g=-5;return g|0}else{l=c[h>>2]|0;Mg(l);u=l+20|0;x=c[u>>2]|0;I=c[n>>2]|0;H=x>>>0>I>>>0?I:x;if((H|0)==0){na=I}else{I=l+16|0;tF(c[j>>2]|0,c[I>>2]|0,H)|0;c[j>>2]=(c[j>>2]|0)+H;c[I>>2]=(c[I>>2]|0)+H;x=e+20|0;c[x>>2]=(c[x>>2]|0)+H;c[n>>2]=(c[n>>2]|0)-H;x=c[u>>2]|0;c[u>>2]=x-H;if((x|0)==(H|0)){c[I>>2]=c[l+8>>2]}na=c[n>>2]|0}if((na|0)!=0){break}c[p>>2]=-1;g=0;return g|0}}while(0);q=(c[k>>2]|0)==666;l=(c[e+4>>2]|0)==0;do{if(q){if(l){z=119;break}c[e+24>>2]=c[13];g=-5;return g|0}else{if(l){z=119}else{z=122}}}while(0);do{if((z|0)==119){if((c[i+116>>2]|0)!=0){z=122;break}if((f|0)==0){g=0;return g|0}else{if(q){break}else{z=122;break}}}}while(0);b:do{if((z|0)==122){q=c[i+136>>2]|0;c:do{if((q|0)==2){l=i+116|0;I=i+96|0;H=i+108|0;x=i+56|0;u=i+5792|0;t=i+5796|0;v=i+5784|0;K=i+5788|0;w=i+92|0;while(1){if((c[l>>2]|0)==0){Cg(i);if((c[l>>2]|0)==0){break}}c[I>>2]=0;A=a[(c[x>>2]|0)+(c[H>>2]|0)|0]|0;b[(c[t>>2]|0)+(c[u>>2]<<1)>>1]=0;N=c[u>>2]|0;c[u>>2]=N+1;a[(c[v>>2]|0)+N|0]=A;N=i+148+((A&255)<<2)|0;b[N>>1]=(b[N>>1]|0)+1;N=(c[u>>2]|0)==((c[K>>2]|0)-1|0);c[l>>2]=(c[l>>2]|0)-1;A=(c[H>>2]|0)+1|0;c[H>>2]=A;if(!N){continue}N=c[w>>2]|0;if((N|0)>-1){oa=(c[x>>2]|0)+N|0}else{oa=0}Og(i,oa,A-N|0,0);c[w>>2]=c[H>>2];N=c[o>>2]|0;A=c[N+28>>2]|0;Mg(A);M=A+20|0;L=c[M>>2]|0;J=N+16|0;Q=c[J>>2]|0;U=L>>>0>Q>>>0?Q:L;do{if((U|0)!=0){L=N+12|0;Q=A+16|0;tF(c[L>>2]|0,c[Q>>2]|0,U)|0;c[L>>2]=(c[L>>2]|0)+U;c[Q>>2]=(c[Q>>2]|0)+U;L=N+20|0;c[L>>2]=(c[L>>2]|0)+U;c[J>>2]=(c[J>>2]|0)-U;L=c[M>>2]|0;c[M>>2]=L-U;if((L|0)!=(U|0)){break}c[Q>>2]=c[A+8>>2]}}while(0);if((c[(c[o>>2]|0)+16>>2]|0)==0){z=195;break c}}if((f|0)==0){z=195;break}c[i+5812>>2]=0;if(m){l=c[w>>2]|0;if((l|0)>-1){pa=(c[x>>2]|0)+l|0}else{pa=0}Og(i,pa,(c[H>>2]|0)-l|0,1);c[w>>2]=c[H>>2];l=c[o>>2]|0;K=c[l+28>>2]|0;Mg(K);v=K+20|0;t=c[v>>2]|0;I=l+16|0;A=c[I>>2]|0;U=t>>>0>A>>>0?A:t;do{if((U|0)!=0){t=l+12|0;A=K+16|0;tF(c[t>>2]|0,c[A>>2]|0,U)|0;c[t>>2]=(c[t>>2]|0)+U;c[A>>2]=(c[A>>2]|0)+U;t=l+20|0;c[t>>2]=(c[t>>2]|0)+U;c[I>>2]=(c[I>>2]|0)-U;t=c[v>>2]|0;c[v>>2]=t-U;if((t|0)!=(U|0)){break}c[A>>2]=c[K+8>>2]}}while(0);qa=(c[(c[o>>2]|0)+16>>2]|0)==0?2:3;z=192;break}if((c[u>>2]|0)==0){break}K=c[w>>2]|0;if((K|0)>-1){ra=(c[x>>2]|0)+K|0}else{ra=0}Og(i,ra,(c[H>>2]|0)-K|0,0);c[w>>2]=c[H>>2];K=c[o>>2]|0;U=c[K+28>>2]|0;Mg(U);v=U+20|0;I=c[v>>2]|0;l=K+16|0;A=c[l>>2]|0;t=I>>>0>A>>>0?A:I;do{if((t|0)!=0){I=K+12|0;A=U+16|0;tF(c[I>>2]|0,c[A>>2]|0,t)|0;c[I>>2]=(c[I>>2]|0)+t;c[A>>2]=(c[A>>2]|0)+t;I=K+20|0;c[I>>2]=(c[I>>2]|0)+t;c[l>>2]=(c[l>>2]|0)-t;I=c[v>>2]|0;c[v>>2]=I-t;if((I|0)!=(t|0)){break}c[A>>2]=c[U+8>>2]}}while(0);if((c[(c[o>>2]|0)+16>>2]|0)==0){z=195}}else if((q|0)==3){U=i+116|0;t=(f|0)==0;v=i+96|0;l=i+108|0;K=i+5792|0;H=i+5796|0;w=i+5784|0;x=i+2440+(d[169256]<<2)|0;u=i+5788|0;A=i+56|0;I=i+92|0;d:while(1){M=c[U>>2]|0;do{if(M>>>0<259>>>0){Cg(i);J=c[U>>2]|0;if(J>>>0<259>>>0&t){z=195;break c}if((J|0)==0){break d}c[v>>2]=0;if(J>>>0>2>>>0){sa=J;z=155;break}ta=c[l>>2]|0;z=170}else{c[v>>2]=0;sa=M;z=155}}while(0);do{if((z|0)==155){z=0;M=c[l>>2]|0;if((M|0)==0){ta=0;z=170;break}J=c[A>>2]|0;N=a[J+(M-1)|0]|0;if(N<<24>>24!=(a[J+M|0]|0)){ta=M;z=170;break}if(N<<24>>24!=(a[J+(M+1)|0]|0)){ta=M;z=170;break}Q=J+(M+2)|0;if(N<<24>>24!=(a[Q]|0)){ta=M;z=170;break}L=J+(M+258)|0;J=Q;while(1){Q=J+1|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+2|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+3|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+4|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+5|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+6|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+7|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+8|0;if(N<<24>>24==(a[Q]|0)&Q>>>0<L>>>0){J=Q}else{ua=Q;break}}J=ua-L+258|0;N=J>>>0>sa>>>0?sa:J;c[v>>2]=N;if(N>>>0<=2>>>0){ta=M;z=170;break}J=N+253|0;b[(c[H>>2]|0)+(c[K>>2]<<1)>>1]=1;N=c[K>>2]|0;c[K>>2]=N+1;a[(c[w>>2]|0)+N|0]=J;N=i+148+((d[169e3+(J&255)|0]|256)+1<<2)|0;b[N>>1]=(b[N>>1]|0)+1;b[x>>1]=(b[x>>1]|0)+1;N=(c[K>>2]|0)==((c[u>>2]|0)-1|0);J=c[v>>2]|0;c[U>>2]=(c[U>>2]|0)-J;Q=(c[l>>2]|0)+J|0;c[l>>2]=Q;c[v>>2]=0;if(N){va=Q}else{continue d}}}while(0);if((z|0)==170){z=0;Q=a[(c[A>>2]|0)+ta|0]|0;b[(c[H>>2]|0)+(c[K>>2]<<1)>>1]=0;N=c[K>>2]|0;c[K>>2]=N+1;a[(c[w>>2]|0)+N|0]=Q;N=i+148+((Q&255)<<2)|0;b[N>>1]=(b[N>>1]|0)+1;N=(c[K>>2]|0)==((c[u>>2]|0)-1|0);c[U>>2]=(c[U>>2]|0)-1;Q=(c[l>>2]|0)+1|0;c[l>>2]=Q;if(N){va=Q}else{continue}}Q=c[I>>2]|0;if((Q|0)>-1){wa=(c[A>>2]|0)+Q|0}else{wa=0}Og(i,wa,va-Q|0,0);c[I>>2]=c[l>>2];Q=c[o>>2]|0;N=c[Q+28>>2]|0;Mg(N);J=N+20|0;R=c[J>>2]|0;S=Q+16|0;T=c[S>>2]|0;xa=R>>>0>T>>>0?T:R;do{if((xa|0)!=0){R=Q+12|0;T=N+16|0;tF(c[R>>2]|0,c[T>>2]|0,xa)|0;c[R>>2]=(c[R>>2]|0)+xa;c[T>>2]=(c[T>>2]|0)+xa;R=Q+20|0;c[R>>2]=(c[R>>2]|0)+xa;c[S>>2]=(c[S>>2]|0)-xa;R=c[J>>2]|0;c[J>>2]=R-xa;if((R|0)!=(xa|0)){break}c[T>>2]=c[N+8>>2]}}while(0);if((c[(c[o>>2]|0)+16>>2]|0)==0){z=195;break c}}c[i+5812>>2]=0;if(m){U=c[I>>2]|0;if((U|0)>-1){ya=(c[A>>2]|0)+U|0}else{ya=0}Og(i,ya,(c[l>>2]|0)-U|0,1);c[I>>2]=c[l>>2];U=c[o>>2]|0;u=c[U+28>>2]|0;Mg(u);w=u+20|0;H=c[w>>2]|0;v=U+16|0;x=c[v>>2]|0;t=H>>>0>x>>>0?x:H;do{if((t|0)!=0){H=U+12|0;x=u+16|0;tF(c[H>>2]|0,c[x>>2]|0,t)|0;c[H>>2]=(c[H>>2]|0)+t;c[x>>2]=(c[x>>2]|0)+t;H=U+20|0;c[H>>2]=(c[H>>2]|0)+t;c[v>>2]=(c[v>>2]|0)-t;H=c[w>>2]|0;c[w>>2]=H-t;if((H|0)!=(t|0)){break}c[x>>2]=c[u+8>>2]}}while(0);qa=(c[(c[o>>2]|0)+16>>2]|0)==0?2:3;z=192;break}if((c[K>>2]|0)==0){break}u=c[I>>2]|0;if((u|0)>-1){za=(c[A>>2]|0)+u|0}else{za=0}Og(i,za,(c[l>>2]|0)-u|0,0);c[I>>2]=c[l>>2];u=c[o>>2]|0;t=c[u+28>>2]|0;Mg(t);w=t+20|0;v=c[w>>2]|0;U=u+16|0;x=c[U>>2]|0;H=v>>>0>x>>>0?x:v;do{if((H|0)!=0){v=u+12|0;x=t+16|0;tF(c[v>>2]|0,c[x>>2]|0,H)|0;c[v>>2]=(c[v>>2]|0)+H;c[x>>2]=(c[x>>2]|0)+H;v=u+20|0;c[v>>2]=(c[v>>2]|0)+H;c[U>>2]=(c[U>>2]|0)-H;v=c[w>>2]|0;c[w>>2]=v-H;if((v|0)!=(H|0)){break}c[x>>2]=c[t+8>>2]}}while(0);if((c[(c[o>>2]|0)+16>>2]|0)==0){z=195}}else{qa=Oc[c[40336+((c[i+132>>2]|0)*12|0)>>2]&255](i,f)|0;z=192}}while(0);do{if((z|0)==192){if((qa&-2|0)==2){c[k>>2]=666}if((qa&-3|0)==0){z=195;break}if((qa|0)!=1){break b}}}while(0);if((z|0)==195){if((c[n>>2]|0)!=0){g=0;return g|0}c[p>>2]=-1;g=0;return g|0}do{if((f|0)==1){Ng(i)}else if((f|0)!=5){Lg(i,0,0,0);if((f|0)!=3){break}q=i+76|0;P=i+68|0;b[(c[P>>2]|0)+((c[q>>2]|0)-1<<1)>>1]=0;vF(c[P>>2]|0,0,(c[q>>2]<<1)-2|0)|0;if((c[i+116>>2]|0)!=0){break}c[i+108>>2]=0;c[i+92>>2]=0;c[i+5812>>2]=0}}while(0);q=c[h>>2]|0;Mg(q);P=q+20|0;O=c[P>>2]|0;t=c[n>>2]|0;H=O>>>0>t>>>0?t:O;if((H|0)==0){Aa=t}else{t=q+16|0;tF(c[j>>2]|0,c[t>>2]|0,H)|0;c[j>>2]=(c[j>>2]|0)+H;c[t>>2]=(c[t>>2]|0)+H;O=e+20|0;c[O>>2]=(c[O>>2]|0)+H;c[n>>2]=(c[n>>2]|0)-H;O=c[P>>2]|0;c[P>>2]=O-H;if((O|0)==(H|0)){c[t>>2]=c[q+8>>2]}Aa=c[n>>2]|0}if((Aa|0)!=0){break}c[p>>2]=-1;g=0;return g|0}}while(0);if(!m){g=0;return g|0}p=i+24|0;k=c[p>>2]|0;if((k|0)<1){g=1;return g|0}o=e+48|0;q=c[o>>2]|0;if((k|0)==2){k=c[r>>2]|0;c[r>>2]=k+1;t=i+8|0;a[(c[t>>2]|0)+k|0]=q;k=(c[o>>2]|0)>>>8&255;H=c[r>>2]|0;c[r>>2]=H+1;a[(c[t>>2]|0)+H|0]=k;k=(c[o>>2]|0)>>>16&255;H=c[r>>2]|0;c[r>>2]=H+1;a[(c[t>>2]|0)+H|0]=k;k=(c[o>>2]|0)>>>24&255;H=c[r>>2]|0;c[r>>2]=H+1;a[(c[t>>2]|0)+H|0]=k;k=e+8|0;H=c[k>>2]&255;O=c[r>>2]|0;c[r>>2]=O+1;a[(c[t>>2]|0)+O|0]=H;H=(c[k>>2]|0)>>>8&255;O=c[r>>2]|0;c[r>>2]=O+1;a[(c[t>>2]|0)+O|0]=H;H=(c[k>>2]|0)>>>16&255;O=c[r>>2]|0;c[r>>2]=O+1;a[(c[t>>2]|0)+O|0]=H;H=(c[k>>2]|0)>>>24&255;k=c[r>>2]|0;c[r>>2]=k+1;a[(c[t>>2]|0)+k|0]=H}else{H=c[r>>2]|0;c[r>>2]=H+1;k=i+8|0;a[(c[k>>2]|0)+H|0]=q>>>24;H=c[r>>2]|0;c[r>>2]=H+1;a[(c[k>>2]|0)+H|0]=q>>>16;q=c[o>>2]|0;o=c[r>>2]|0;c[r>>2]=o+1;a[(c[k>>2]|0)+o|0]=q>>>8;o=c[r>>2]|0;c[r>>2]=o+1;a[(c[k>>2]|0)+o|0]=q}q=c[h>>2]|0;Mg(q);o=q+20|0;k=c[o>>2]|0;H=c[n>>2]|0;t=k>>>0>H>>>0?H:k;do{if((t|0)!=0){k=q+16|0;tF(c[j>>2]|0,c[k>>2]|0,t)|0;c[j>>2]=(c[j>>2]|0)+t;c[k>>2]=(c[k>>2]|0)+t;H=e+20|0;c[H>>2]=(c[H>>2]|0)+t;c[n>>2]=(c[n>>2]|0)-t;H=c[o>>2]|0;c[o>>2]=H-t;if((H|0)!=(t|0)){break}c[k>>2]=c[q+8>>2]}}while(0);q=c[p>>2]|0;if((q|0)>0){c[p>>2]=-q}g=(c[r>>2]|0)==0|0;return g|0}}while(0);c[e+24>>2]=c[10];g=-2;return g|0}function Fg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=(c[a+12>>2]|0)-5|0;e=d>>>0<65535>>>0?d:65535;d=a+116|0;f=a+108|0;g=a+92|0;h=a+44|0;i=a+56|0;j=a|0;while(1){k=c[d>>2]|0;if(k>>>0<2>>>0){Cg(a);l=c[d>>2]|0;if((l|b|0)==0){m=0;n=35;break}if((l|0)==0){n=20;break}else{o=l}}else{o=k}k=(c[f>>2]|0)+o|0;c[f>>2]=k;c[d>>2]=0;l=c[g>>2]|0;p=l+e|0;if((k|0)!=0&k>>>0<p>>>0){q=k;r=l}else{c[d>>2]=k-p;c[f>>2]=p;if((l|0)>-1){s=(c[i>>2]|0)+l|0}else{s=0}Og(a,s,e,0);c[g>>2]=c[f>>2];l=c[j>>2]|0;p=c[l+28>>2]|0;Mg(p);k=p+20|0;t=c[k>>2]|0;u=l+16|0;v=c[u>>2]|0;w=t>>>0>v>>>0?v:t;do{if((w|0)!=0){t=l+12|0;v=p+16|0;tF(c[t>>2]|0,c[v>>2]|0,w)|0;c[t>>2]=(c[t>>2]|0)+w;c[v>>2]=(c[v>>2]|0)+w;t=l+20|0;c[t>>2]=(c[t>>2]|0)+w;c[u>>2]=(c[u>>2]|0)-w;t=c[k>>2]|0;c[k>>2]=t-w;if((t|0)!=(w|0)){break}c[v>>2]=c[p+8>>2]}}while(0);if((c[(c[j>>2]|0)+16>>2]|0)==0){m=0;n=35;break}q=c[f>>2]|0;r=c[g>>2]|0}p=q-r|0;if(p>>>0<((c[h>>2]|0)-262|0)>>>0){continue}if((r|0)>-1){x=(c[i>>2]|0)+r|0}else{x=0}Og(a,x,p,0);c[g>>2]=c[f>>2];p=c[j>>2]|0;w=c[p+28>>2]|0;Mg(w);k=w+20|0;u=c[k>>2]|0;l=p+16|0;v=c[l>>2]|0;t=u>>>0>v>>>0?v:u;do{if((t|0)!=0){u=p+12|0;v=w+16|0;tF(c[u>>2]|0,c[v>>2]|0,t)|0;c[u>>2]=(c[u>>2]|0)+t;c[v>>2]=(c[v>>2]|0)+t;u=p+20|0;c[u>>2]=(c[u>>2]|0)+t;c[l>>2]=(c[l>>2]|0)-t;u=c[k>>2]|0;c[k>>2]=u-t;if((u|0)!=(t|0)){break}c[v>>2]=c[w+8>>2]}}while(0);if((c[(c[j>>2]|0)+16>>2]|0)==0){m=0;n=35;break}}if((n|0)==20){c[a+5812>>2]=0;if((b|0)==4){b=c[g>>2]|0;if((b|0)>-1){y=(c[i>>2]|0)+b|0}else{y=0}Og(a,y,(c[f>>2]|0)-b|0,1);c[g>>2]=c[f>>2];b=c[j>>2]|0;y=c[b+28>>2]|0;Mg(y);x=y+20|0;r=c[x>>2]|0;h=b+16|0;q=c[h>>2]|0;e=r>>>0>q>>>0?q:r;do{if((e|0)!=0){r=b+12|0;q=y+16|0;tF(c[r>>2]|0,c[q>>2]|0,e)|0;c[r>>2]=(c[r>>2]|0)+e;c[q>>2]=(c[q>>2]|0)+e;r=b+20|0;c[r>>2]=(c[r>>2]|0)+e;c[h>>2]=(c[h>>2]|0)-e;r=c[x>>2]|0;c[x>>2]=r-e;if((r|0)!=(e|0)){break}c[q>>2]=c[y+8>>2]}}while(0);m=(c[(c[j>>2]|0)+16>>2]|0)==0?2:3;return m|0}y=c[f>>2]|0;e=c[g>>2]|0;do{if((y|0)>(e|0)){if((e|0)>-1){z=(c[i>>2]|0)+e|0}else{z=0}Og(a,z,y-e|0,0);c[g>>2]=c[f>>2];x=c[j>>2]|0;h=c[x+28>>2]|0;Mg(h);b=h+20|0;q=c[b>>2]|0;r=x+16|0;s=c[r>>2]|0;d=q>>>0>s>>>0?s:q;do{if((d|0)!=0){q=x+12|0;s=h+16|0;tF(c[q>>2]|0,c[s>>2]|0,d)|0;c[q>>2]=(c[q>>2]|0)+d;c[s>>2]=(c[s>>2]|0)+d;q=x+20|0;c[q>>2]=(c[q>>2]|0)+d;c[r>>2]=(c[r>>2]|0)-d;q=c[b>>2]|0;c[b>>2]=q-d;if((q|0)!=(d|0)){break}c[s>>2]=c[h+8>>2]}}while(0);if((c[(c[j>>2]|0)+16>>2]|0)==0){m=0}else{break}return m|0}}while(0);m=1;return m|0}else if((n|0)==35){return m|0}return 0}function Gg(e,f){e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;g=e+116|0;h=(f|0)==0;i=e+72|0;j=e+88|0;k=e+108|0;l=e+56|0;m=e+84|0;n=e+68|0;o=e+52|0;p=e+64|0;q=e+44|0;r=e+96|0;s=e+112|0;t=e+5792|0;u=e+5796|0;v=e+5784|0;w=e+5788|0;x=e+128|0;y=e+92|0;z=e|0;while(1){if((c[g>>2]|0)>>>0<262>>>0){Cg(e);A=c[g>>2]|0;if(A>>>0<262>>>0&h){B=0;C=41;break}if((A|0)==0){C=26;break}if(A>>>0>2>>>0){C=6}else{C=9}}else{C=6}do{if((C|0)==6){C=0;A=c[k>>2]|0;D=((d[(c[l>>2]|0)+(A+2)|0]|0)^c[i>>2]<<c[j>>2])&c[m>>2];c[i>>2]=D;E=b[(c[n>>2]|0)+(D<<1)>>1]|0;b[(c[p>>2]|0)+((c[o>>2]&A)<<1)>>1]=E;A=E&65535;b[(c[n>>2]|0)+(c[i>>2]<<1)>>1]=c[k>>2];if(E<<16>>16==0){C=9;break}if(((c[k>>2]|0)-A|0)>>>0>((c[q>>2]|0)-262|0)>>>0){C=9;break}E=Ig(e,A)|0;c[r>>2]=E;F=E}}while(0);if((C|0)==9){C=0;F=c[r>>2]|0}do{if(F>>>0>2>>>0){E=F+253|0;A=(c[k>>2]|0)-(c[s>>2]|0)&65535;b[(c[u>>2]|0)+(c[t>>2]<<1)>>1]=A;D=c[t>>2]|0;c[t>>2]=D+1;a[(c[v>>2]|0)+D|0]=E;D=A-1&65535;A=e+148+((d[169e3+(E&255)|0]|0|256)+1<<2)|0;b[A>>1]=(b[A>>1]|0)+1;A=D&65535;if((D&65535)>>>0<256>>>0){G=A}else{G=(A>>>7)+256|0}A=e+2440+((d[169256+G|0]|0)<<2)|0;b[A>>1]=(b[A>>1]|0)+1;A=(c[t>>2]|0)==((c[w>>2]|0)-1|0)|0;D=c[r>>2]|0;E=(c[g>>2]|0)-D|0;c[g>>2]=E;if(!(D>>>0<=(c[x>>2]|0)>>>0&E>>>0>2>>>0)){E=(c[k>>2]|0)+D|0;c[k>>2]=E;c[r>>2]=0;H=c[l>>2]|0;I=d[H+E|0]|0;c[i>>2]=I;c[i>>2]=((d[H+(E+1)|0]|0)^I<<c[j>>2])&c[m>>2];J=A;K=E;break}c[r>>2]=D-1;do{D=c[k>>2]|0;E=D+1|0;c[k>>2]=E;I=((d[(c[l>>2]|0)+(D+3)|0]|0)^c[i>>2]<<c[j>>2])&c[m>>2];c[i>>2]=I;b[(c[p>>2]|0)+((c[o>>2]&E)<<1)>>1]=b[(c[n>>2]|0)+(I<<1)>>1]|0;b[(c[n>>2]|0)+(c[i>>2]<<1)>>1]=c[k>>2];I=(c[r>>2]|0)-1|0;c[r>>2]=I;}while((I|0)!=0);I=(c[k>>2]|0)+1|0;c[k>>2]=I;J=A;K=I}else{I=a[(c[l>>2]|0)+(c[k>>2]|0)|0]|0;b[(c[u>>2]|0)+(c[t>>2]<<1)>>1]=0;E=c[t>>2]|0;c[t>>2]=E+1;a[(c[v>>2]|0)+E|0]=I;E=e+148+((I&255)<<2)|0;b[E>>1]=(b[E>>1]|0)+1;E=(c[t>>2]|0)==((c[w>>2]|0)-1|0)|0;c[g>>2]=(c[g>>2]|0)-1;I=(c[k>>2]|0)+1|0;c[k>>2]=I;J=E;K=I}}while(0);if((J|0)==0){continue}I=c[y>>2]|0;if((I|0)>-1){L=(c[l>>2]|0)+I|0}else{L=0}Og(e,L,K-I|0,0);c[y>>2]=c[k>>2];I=c[z>>2]|0;E=c[I+28>>2]|0;Mg(E);D=E+20|0;H=c[D>>2]|0;M=I+16|0;N=c[M>>2]|0;O=H>>>0>N>>>0?N:H;do{if((O|0)!=0){H=I+12|0;N=E+16|0;tF(c[H>>2]|0,c[N>>2]|0,O)|0;c[H>>2]=(c[H>>2]|0)+O;c[N>>2]=(c[N>>2]|0)+O;H=I+20|0;c[H>>2]=(c[H>>2]|0)+O;c[M>>2]=(c[M>>2]|0)-O;H=c[D>>2]|0;c[D>>2]=H-O;if((H|0)!=(O|0)){break}c[N>>2]=c[E+8>>2]}}while(0);if((c[(c[z>>2]|0)+16>>2]|0)==0){B=0;C=41;break}}if((C|0)==26){K=c[k>>2]|0;c[e+5812>>2]=K>>>0<2>>>0?K:2;if((f|0)==4){f=c[y>>2]|0;if((f|0)>-1){P=(c[l>>2]|0)+f|0}else{P=0}Og(e,P,K-f|0,1);c[y>>2]=c[k>>2];f=c[z>>2]|0;P=c[f+28>>2]|0;Mg(P);L=P+20|0;J=c[L>>2]|0;g=f+16|0;w=c[g>>2]|0;v=J>>>0>w>>>0?w:J;do{if((v|0)!=0){J=f+12|0;w=P+16|0;tF(c[J>>2]|0,c[w>>2]|0,v)|0;c[J>>2]=(c[J>>2]|0)+v;c[w>>2]=(c[w>>2]|0)+v;J=f+20|0;c[J>>2]=(c[J>>2]|0)+v;c[g>>2]=(c[g>>2]|0)-v;J=c[L>>2]|0;c[L>>2]=J-v;if((J|0)!=(v|0)){break}c[w>>2]=c[P+8>>2]}}while(0);B=(c[(c[z>>2]|0)+16>>2]|0)==0?2:3;return B|0}do{if((c[t>>2]|0)!=0){P=c[y>>2]|0;if((P|0)>-1){Q=(c[l>>2]|0)+P|0}else{Q=0}Og(e,Q,K-P|0,0);c[y>>2]=c[k>>2];P=c[z>>2]|0;v=c[P+28>>2]|0;Mg(v);L=v+20|0;g=c[L>>2]|0;f=P+16|0;w=c[f>>2]|0;J=g>>>0>w>>>0?w:g;do{if((J|0)!=0){g=P+12|0;w=v+16|0;tF(c[g>>2]|0,c[w>>2]|0,J)|0;c[g>>2]=(c[g>>2]|0)+J;c[w>>2]=(c[w>>2]|0)+J;g=P+20|0;c[g>>2]=(c[g>>2]|0)+J;c[f>>2]=(c[f>>2]|0)-J;g=c[L>>2]|0;c[L>>2]=g-J;if((g|0)!=(J|0)){break}c[w>>2]=c[v+8>>2]}}while(0);if((c[(c[z>>2]|0)+16>>2]|0)==0){B=0}else{break}return B|0}}while(0);B=1;return B|0}else if((C|0)==41){return B|0}return 0}function Hg(e,f){e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;g=e+116|0;h=(f|0)==0;i=e+72|0;j=e+88|0;k=e+108|0;l=e+56|0;m=e+84|0;n=e+68|0;o=e+52|0;p=e+64|0;q=e+96|0;r=e+120|0;s=e+112|0;t=e+100|0;u=e+5792|0;v=e+5796|0;w=e+5784|0;x=e+5788|0;y=e+104|0;z=e+92|0;A=e|0;B=e+128|0;C=e+44|0;D=e+136|0;a:while(1){E=c[g>>2]|0;while(1){do{if(E>>>0<262>>>0){Cg(e);F=c[g>>2]|0;if(F>>>0<262>>>0&h){G=0;H=57;break a}if((F|0)==0){H=40;break a}if(F>>>0>2>>>0){H=8;break}c[r>>2]=c[q>>2];c[t>>2]=c[s>>2];c[q>>2]=2;I=2;H=16}else{H=8}}while(0);do{if((H|0)==8){H=0;F=c[k>>2]|0;J=((d[(c[l>>2]|0)+(F+2)|0]|0)^c[i>>2]<<c[j>>2])&c[m>>2];c[i>>2]=J;K=b[(c[n>>2]|0)+(J<<1)>>1]|0;b[(c[p>>2]|0)+((c[o>>2]&F)<<1)>>1]=K;F=K&65535;b[(c[n>>2]|0)+(c[i>>2]<<1)>>1]=c[k>>2];J=c[q>>2]|0;c[r>>2]=J;c[t>>2]=c[s>>2];c[q>>2]=2;if(K<<16>>16==0){I=2;H=16;break}if(J>>>0>=(c[B>>2]|0)>>>0){L=J;M=2;break}if(((c[k>>2]|0)-F|0)>>>0>((c[C>>2]|0)-262|0)>>>0){I=2;H=16;break}J=Ig(e,F)|0;c[q>>2]=J;if(J>>>0>=6>>>0){I=J;H=16;break}if((c[D>>2]|0)!=1){if((J|0)!=3){I=J;H=16;break}if(((c[k>>2]|0)-(c[s>>2]|0)|0)>>>0<=4096>>>0){I=3;H=16;break}}c[q>>2]=2;I=2;H=16}}while(0);if((H|0)==16){H=0;L=c[r>>2]|0;M=I}if(!(L>>>0<3>>>0|M>>>0>L>>>0)){break}if((c[y>>2]|0)==0){c[y>>2]=1;c[k>>2]=(c[k>>2]|0)+1;J=(c[g>>2]|0)-1|0;c[g>>2]=J;E=J;continue}J=a[(c[l>>2]|0)+((c[k>>2]|0)-1)|0]|0;b[(c[v>>2]|0)+(c[u>>2]<<1)>>1]=0;F=c[u>>2]|0;c[u>>2]=F+1;a[(c[w>>2]|0)+F|0]=J;F=e+148+((J&255)<<2)|0;b[F>>1]=(b[F>>1]|0)+1;do{if((c[u>>2]|0)==((c[x>>2]|0)-1|0)){F=c[z>>2]|0;if((F|0)>-1){N=(c[l>>2]|0)+F|0}else{N=0}Og(e,N,(c[k>>2]|0)-F|0,0);c[z>>2]=c[k>>2];F=c[A>>2]|0;J=c[F+28>>2]|0;Mg(J);K=J+20|0;O=c[K>>2]|0;P=F+16|0;Q=c[P>>2]|0;R=O>>>0>Q>>>0?Q:O;if((R|0)==0){break}O=F+12|0;Q=J+16|0;tF(c[O>>2]|0,c[Q>>2]|0,R)|0;c[O>>2]=(c[O>>2]|0)+R;c[Q>>2]=(c[Q>>2]|0)+R;O=F+20|0;c[O>>2]=(c[O>>2]|0)+R;c[P>>2]=(c[P>>2]|0)-R;P=c[K>>2]|0;c[K>>2]=P-R;if((P|0)!=(R|0)){break}c[Q>>2]=c[J+8>>2]}}while(0);c[k>>2]=(c[k>>2]|0)+1;J=(c[g>>2]|0)-1|0;c[g>>2]=J;if((c[(c[A>>2]|0)+16>>2]|0)==0){G=0;H=57;break a}else{E=J}}E=c[k>>2]|0;J=E-3+(c[g>>2]|0)|0;Q=L+253|0;R=E+65535-(c[t>>2]|0)&65535;b[(c[v>>2]|0)+(c[u>>2]<<1)>>1]=R;E=c[u>>2]|0;c[u>>2]=E+1;a[(c[w>>2]|0)+E|0]=Q;E=R-1&65535;R=e+148+((d[169e3+(Q&255)|0]|0|256)+1<<2)|0;b[R>>1]=(b[R>>1]|0)+1;R=E&65535;if((E&65535)>>>0<256>>>0){S=R}else{S=(R>>>7)+256|0}R=e+2440+((d[169256+S|0]|0)<<2)|0;b[R>>1]=(b[R>>1]|0)+1;R=c[u>>2]|0;E=(c[x>>2]|0)-1|0;Q=c[r>>2]|0;c[g>>2]=1-Q+(c[g>>2]|0);P=Q-2|0;c[r>>2]=P;Q=P;do{P=c[k>>2]|0;K=P+1|0;c[k>>2]=K;if(K>>>0>J>>>0){T=Q}else{O=((d[(c[l>>2]|0)+(P+3)|0]|0)^c[i>>2]<<c[j>>2])&c[m>>2];c[i>>2]=O;b[(c[p>>2]|0)+((c[o>>2]&K)<<1)>>1]=b[(c[n>>2]|0)+(O<<1)>>1]|0;b[(c[n>>2]|0)+(c[i>>2]<<1)>>1]=c[k>>2];T=c[r>>2]|0}Q=T-1|0;c[r>>2]=Q;}while((Q|0)!=0);c[y>>2]=0;c[q>>2]=2;Q=(c[k>>2]|0)+1|0;c[k>>2]=Q;if((R|0)!=(E|0)){continue}J=c[z>>2]|0;if((J|0)>-1){U=(c[l>>2]|0)+J|0}else{U=0}Og(e,U,Q-J|0,0);c[z>>2]=c[k>>2];J=c[A>>2]|0;Q=c[J+28>>2]|0;Mg(Q);O=Q+20|0;K=c[O>>2]|0;P=J+16|0;F=c[P>>2]|0;V=K>>>0>F>>>0?F:K;do{if((V|0)!=0){K=J+12|0;F=Q+16|0;tF(c[K>>2]|0,c[F>>2]|0,V)|0;c[K>>2]=(c[K>>2]|0)+V;c[F>>2]=(c[F>>2]|0)+V;K=J+20|0;c[K>>2]=(c[K>>2]|0)+V;c[P>>2]=(c[P>>2]|0)-V;K=c[O>>2]|0;c[O>>2]=K-V;if((K|0)!=(V|0)){break}c[F>>2]=c[Q+8>>2]}}while(0);if((c[(c[A>>2]|0)+16>>2]|0)==0){G=0;H=57;break}}if((H|0)==40){if((c[y>>2]|0)!=0){U=a[(c[l>>2]|0)+((c[k>>2]|0)-1)|0]|0;b[(c[v>>2]|0)+(c[u>>2]<<1)>>1]=0;v=c[u>>2]|0;c[u>>2]=v+1;a[(c[w>>2]|0)+v|0]=U;v=e+148+((U&255)<<2)|0;b[v>>1]=(b[v>>1]|0)+1;c[y>>2]=0}y=c[k>>2]|0;c[e+5812>>2]=y>>>0<2>>>0?y:2;if((f|0)==4){f=c[z>>2]|0;if((f|0)>-1){W=(c[l>>2]|0)+f|0}else{W=0}Og(e,W,y-f|0,1);c[z>>2]=c[k>>2];f=c[A>>2]|0;W=c[f+28>>2]|0;Mg(W);v=W+20|0;U=c[v>>2]|0;w=f+16|0;q=c[w>>2]|0;r=U>>>0>q>>>0?q:U;do{if((r|0)!=0){U=f+12|0;q=W+16|0;tF(c[U>>2]|0,c[q>>2]|0,r)|0;c[U>>2]=(c[U>>2]|0)+r;c[q>>2]=(c[q>>2]|0)+r;U=f+20|0;c[U>>2]=(c[U>>2]|0)+r;c[w>>2]=(c[w>>2]|0)-r;U=c[v>>2]|0;c[v>>2]=U-r;if((U|0)!=(r|0)){break}c[q>>2]=c[W+8>>2]}}while(0);G=(c[(c[A>>2]|0)+16>>2]|0)==0?2:3;return G|0}do{if((c[u>>2]|0)!=0){W=c[z>>2]|0;if((W|0)>-1){X=(c[l>>2]|0)+W|0}else{X=0}Og(e,X,y-W|0,0);c[z>>2]=c[k>>2];W=c[A>>2]|0;r=c[W+28>>2]|0;Mg(r);v=r+20|0;w=c[v>>2]|0;f=W+16|0;q=c[f>>2]|0;U=w>>>0>q>>>0?q:w;do{if((U|0)!=0){w=W+12|0;q=r+16|0;tF(c[w>>2]|0,c[q>>2]|0,U)|0;c[w>>2]=(c[w>>2]|0)+U;c[q>>2]=(c[q>>2]|0)+U;w=W+20|0;c[w>>2]=(c[w>>2]|0)+U;c[f>>2]=(c[f>>2]|0)-U;w=c[v>>2]|0;c[v>>2]=w-U;if((w|0)!=(U|0)){break}c[q>>2]=c[r+8>>2]}}while(0);if((c[(c[A>>2]|0)+16>>2]|0)==0){G=0}else{break}return G|0}}while(0);G=1;return G|0}else if((H|0)==57){return G|0}return 0}function Ig(b,d){b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;f=c[b+124>>2]|0;g=c[b+56>>2]|0;h=c[b+108>>2]|0;i=g+h|0;j=c[b+120>>2]|0;k=c[b+144>>2]|0;l=(c[b+44>>2]|0)-262|0;m=h>>>0>l>>>0?h-l|0:0;l=c[b+64>>2]|0;n=c[b+52>>2]|0;o=g+(h+258)|0;p=c[b+116>>2]|0;q=k>>>0>p>>>0?p:k;k=b+112|0;r=g+(h+1)|0;s=g+(h+2)|0;t=o;u=h+257|0;v=a[g+(j+h)|0]|0;w=a[g+(h-1+j)|0]|0;x=d;d=j>>>0<(c[b+140>>2]|0)>>>0?f:f>>>2;f=j;a:while(1){j=g+x|0;do{if((a[g+(x+f)|0]|0)==v<<24>>24){if((a[g+(f-1+x)|0]|0)!=w<<24>>24){y=v;z=w;A=f;break}if((a[j]|0)!=(a[i]|0)){y=v;z=w;A=f;break}if((a[g+(x+1)|0]|0)!=(a[r]|0)){y=v;z=w;A=f;break}b=s;B=g+(x+2)|0;while(1){C=b+1|0;if((a[C]|0)!=(a[B+1|0]|0)){D=C;break}C=b+2|0;if((a[C]|0)!=(a[B+2|0]|0)){D=C;break}C=b+3|0;if((a[C]|0)!=(a[B+3|0]|0)){D=C;break}C=b+4|0;if((a[C]|0)!=(a[B+4|0]|0)){D=C;break}C=b+5|0;if((a[C]|0)!=(a[B+5|0]|0)){D=C;break}C=b+6|0;if((a[C]|0)!=(a[B+6|0]|0)){D=C;break}C=b+7|0;if((a[C]|0)!=(a[B+7|0]|0)){D=C;break}C=b+8|0;E=B+8|0;if((a[C]|0)==(a[E]|0)&C>>>0<o>>>0){b=C;B=E}else{D=C;break}}B=D-t|0;b=B+258|0;if((b|0)<=(f|0)){y=v;z=w;A=f;break}c[k>>2]=x;if((b|0)>=(q|0)){F=b;G=20;break a}y=a[g+(b+h)|0]|0;z=a[g+(u+B)|0]|0;A=b}else{y=v;z=w;A=f}}while(0);j=e[l+((x&n)<<1)>>1]|0;if(j>>>0<=m>>>0){F=A;G=20;break}b=d-1|0;if((b|0)==0){F=A;G=20;break}else{v=y;w=z;x=j;d=b;f=A}}if((G|0)==20){return(F>>>0>p>>>0?p:F)|0}return 0}function Jg(a){a=a|0;c[a+2840>>2]=a+148;c[a+2848>>2]=11576;c[a+2852>>2]=a+2440;c[a+2860>>2]=11720;c[a+2864>>2]=a+2684;c[a+2872>>2]=11744;b[a+5816>>1]=0;c[a+5820>>2]=0;Kg(a);return}function Kg(a){a=a|0;var d=0;d=0;do{b[a+148+(d<<2)>>1]=0;d=d+1|0;}while((d|0)<286);b[a+2440>>1]=0;b[a+2444>>1]=0;b[a+2448>>1]=0;b[a+2452>>1]=0;b[a+2456>>1]=0;b[a+2460>>1]=0;b[a+2464>>1]=0;b[a+2468>>1]=0;b[a+2472>>1]=0;b[a+2476>>1]=0;b[a+2480>>1]=0;b[a+2484>>1]=0;b[a+2488>>1]=0;b[a+2492>>1]=0;b[a+2496>>1]=0;b[a+2500>>1]=0;b[a+2504>>1]=0;b[a+2508>>1]=0;b[a+2512>>1]=0;b[a+2516>>1]=0;b[a+2520>>1]=0;b[a+2524>>1]=0;b[a+2528>>1]=0;b[a+2532>>1]=0;b[a+2536>>1]=0;b[a+2540>>1]=0;b[a+2544>>1]=0;b[a+2548>>1]=0;b[a+2552>>1]=0;b[a+2556>>1]=0;b[a+2684>>1]=0;b[a+2688>>1]=0;b[a+2692>>1]=0;b[a+2696>>1]=0;b[a+2700>>1]=0;b[a+2704>>1]=0;b[a+2708>>1]=0;b[a+2712>>1]=0;b[a+2716>>1]=0;b[a+2720>>1]=0;b[a+2724>>1]=0;b[a+2728>>1]=0;b[a+2732>>1]=0;b[a+2736>>1]=0;b[a+2740>>1]=0;b[a+2744>>1]=0;b[a+2748>>1]=0;b[a+2752>>1]=0;b[a+2756>>1]=0;b[a+1172>>1]=1;c[a+5804>>2]=0;c[a+5800>>2]=0;c[a+5808>>2]=0;c[a+5792>>2]=0;return}function Lg(d,f,g,h){d=d|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;i=d+5820|0;j=c[i>>2]|0;k=h&65535;h=d+5816|0;l=e[h>>1]|0|k<<j;b[h>>1]=l;if((j|0)>13){m=d+20|0;n=c[m>>2]|0;c[m>>2]=n+1;o=d+8|0;a[(c[o>>2]|0)+n|0]=l;n=(e[h>>1]|0)>>>8&255;p=c[m>>2]|0;c[m>>2]=p+1;a[(c[o>>2]|0)+p|0]=n;n=c[i>>2]|0;p=k>>>((16-n|0)>>>0);b[h>>1]=p;q=n-13|0;r=p&255}else{q=j+3|0;r=l&255}c[i>>2]=q;do{if((q|0)>8){l=d+20|0;j=c[l>>2]|0;c[l>>2]=j+1;p=d+8|0;a[(c[p>>2]|0)+j|0]=r;j=(e[h>>1]|0)>>>8&255;n=c[l>>2]|0;c[l>>2]=n+1;a[(c[p>>2]|0)+n|0]=j;s=l;t=p}else{p=d+20|0;if((q|0)>0){l=c[p>>2]|0;c[p>>2]=l+1;j=d+8|0;a[(c[j>>2]|0)+l|0]=r;s=p;t=j;break}else{s=p;t=d+8|0;break}}}while(0);b[h>>1]=0;c[i>>2]=0;i=c[s>>2]|0;c[s>>2]=i+1;a[(c[t>>2]|0)+i|0]=g;i=c[s>>2]|0;c[s>>2]=i+1;a[(c[t>>2]|0)+i|0]=g>>>8;i=g&65535^65535;h=c[s>>2]|0;c[s>>2]=h+1;a[(c[t>>2]|0)+h|0]=i;h=c[s>>2]|0;c[s>>2]=h+1;a[(c[t>>2]|0)+h|0]=i>>>8;if((g|0)==0){return}else{u=g;v=f}while(1){f=u-1|0;g=a[v]|0;i=c[s>>2]|0;c[s>>2]=i+1;a[(c[t>>2]|0)+i|0]=g;if((f|0)==0){break}else{u=f;v=v+1|0}}return}function Mg(d){d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=d+5820|0;g=c[f>>2]|0;if((g|0)==16){h=d+5816|0;i=b[h>>1]&255;j=d+20|0;k=c[j>>2]|0;c[j>>2]=k+1;l=d+8|0;a[(c[l>>2]|0)+k|0]=i;i=(e[h>>1]|0)>>>8&255;k=c[j>>2]|0;c[j>>2]=k+1;a[(c[l>>2]|0)+k|0]=i;b[h>>1]=0;c[f>>2]=0;return}if((g|0)<=7){return}g=d+5816|0;h=b[g>>1]&255;i=d+20|0;k=c[i>>2]|0;c[i>>2]=k+1;a[(c[d+8>>2]|0)+k|0]=h;b[g>>1]=(e[g>>1]|0)>>>8;c[f>>2]=(c[f>>2]|0)-8;return}function Ng(d){d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=d+5820|0;g=c[f>>2]|0;h=d+5816|0;i=e[h>>1]|0|2<<g;b[h>>1]=i;if((g|0)>13){j=d+20|0;k=c[j>>2]|0;c[j>>2]=k+1;l=d+8|0;a[(c[l>>2]|0)+k|0]=i;k=(e[h>>1]|0)>>>8&255;m=c[j>>2]|0;c[j>>2]=m+1;a[(c[l>>2]|0)+m|0]=k;k=c[f>>2]|0;m=2>>>((16-k|0)>>>0);b[h>>1]=m;n=k-13|0;o=m&255}else{n=g+3|0;o=i&255}c[f>>2]=n;if((n|0)>9){i=d+20|0;g=c[i>>2]|0;c[i>>2]=g+1;m=d+8|0;a[(c[m>>2]|0)+g|0]=o;g=(e[h>>1]|0)>>>8&255;k=c[i>>2]|0;c[i>>2]=k+1;a[(c[m>>2]|0)+k|0]=g;b[h>>1]=0;p=(c[f>>2]|0)-9|0;q=0}else{p=n+7|0;q=o}c[f>>2]=p;if((p|0)==16){o=d+20|0;n=c[o>>2]|0;c[o>>2]=n+1;g=d+8|0;a[(c[g>>2]|0)+n|0]=q;n=(e[h>>1]|0)>>>8&255;k=c[o>>2]|0;c[o>>2]=k+1;a[(c[g>>2]|0)+k|0]=n;b[h>>1]=0;c[f>>2]=0;return}if((p|0)<=7){return}p=d+20|0;n=c[p>>2]|0;c[p>>2]=n+1;a[(c[d+8>>2]|0)+n|0]=q;b[h>>1]=(e[h>>1]|0)>>>8;c[f>>2]=(c[f>>2]|0)-8;return}function Og(f,g,h,i){f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;if((c[f+132>>2]|0)>0){j=(c[f>>2]|0)+44|0;if((c[j>>2]|0)==2){k=-201342849;l=0;while(1){if((k&1|0)!=0){if((b[f+148+(l<<2)>>1]|0)!=0){m=0;break}}n=l+1|0;if((n|0)<32){k=k>>>1;l=n}else{o=6;break}}a:do{if((o|0)==6){if((b[f+184>>1]|0)!=0){m=1;break}if((b[f+188>>1]|0)!=0){m=1;break}if((b[f+200>>1]|0)==0){p=32}else{m=1;break}while(1){l=p+1|0;if((b[f+148+(p<<2)>>1]|0)!=0){m=1;break a}if((l|0)<256){p=l}else{m=0;break}}}}while(0);c[j>>2]=m}Pg(f,f+2840|0);Pg(f,f+2852|0);Sg(f,f+148|0,c[f+2844>>2]|0);Sg(f,f+2440|0,c[f+2856>>2]|0);Pg(f,f+2864|0);m=18;while(1){j=m-1|0;if((b[f+2684+(d[71328+m|0]<<2)+2>>1]|0)!=0){q=m;break}if((j|0)>2){m=j}else{q=j;break}}m=f+5800|0;j=(q*3|0)+17+(c[m>>2]|0)|0;c[m>>2]=j;m=(j+10|0)>>>3;j=((c[f+5804>>2]|0)+10|0)>>>3;r=j>>>0>m>>>0?m:j;s=j;t=q}else{q=h+5|0;r=q;s=q;t=0}do{if((h+4|0)>>>0>r>>>0|(g|0)==0){q=f+5820|0;j=c[q>>2]|0;m=(j|0)>13;if((c[f+136>>2]|0)==4|(s|0)==(r|0)){p=i+2&65535;o=f+5816|0;l=e[o>>1]|p<<j;b[o>>1]=l;if(m){k=f+20|0;n=c[k>>2]|0;c[k>>2]=n+1;u=f+8|0;a[(c[u>>2]|0)+n|0]=l;l=(e[o>>1]|0)>>>8&255;n=c[k>>2]|0;c[k>>2]=n+1;a[(c[u>>2]|0)+n|0]=l;l=c[q>>2]|0;b[o>>1]=p>>>((16-l|0)>>>0);v=l-13|0}else{v=j+3|0}c[q>>2]=v;Qg(f,10424,11600);break}l=i+4&65535;p=f+5816|0;o=e[p>>1]|l<<j;n=o&65535;b[p>>1]=n;if(m){m=f+20|0;u=c[m>>2]|0;c[m>>2]=u+1;k=f+8|0;a[(c[k>>2]|0)+u|0]=o;o=(e[p>>1]|0)>>>8&255;u=c[m>>2]|0;c[m>>2]=u+1;a[(c[k>>2]|0)+u|0]=o;o=c[q>>2]|0;u=l>>>((16-o|0)>>>0)&65535;b[p>>1]=u;w=o-13|0;x=u}else{w=j+3|0;x=n}c[q>>2]=w;n=c[f+2844>>2]|0;j=c[f+2856>>2]|0;u=n+65280&65535;o=x&65535|u<<w;l=o&65535;b[p>>1]=l;if((w|0)>11){k=f+20|0;m=c[k>>2]|0;c[k>>2]=m+1;y=f+8|0;a[(c[y>>2]|0)+m|0]=o;o=(e[p>>1]|0)>>>8&255;m=c[k>>2]|0;c[k>>2]=m+1;a[(c[y>>2]|0)+m|0]=o;o=c[q>>2]|0;m=u>>>((16-o|0)>>>0)&65535;b[p>>1]=m;z=o-11|0;A=m}else{z=w+5|0;A=l}c[q>>2]=z;l=j&65535;m=l<<z|A&65535;o=m&65535;b[p>>1]=o;if((z|0)>11){u=f+20|0;y=c[u>>2]|0;c[u>>2]=y+1;k=f+8|0;a[(c[k>>2]|0)+y|0]=m;m=(e[p>>1]|0)>>>8&255;y=c[u>>2]|0;c[u>>2]=y+1;a[(c[k>>2]|0)+y|0]=m;m=c[q>>2]|0;y=l>>>((16-m|0)>>>0)&65535;b[p>>1]=y;B=m-11|0;C=y}else{B=z+5|0;C=o}c[q>>2]=B;o=t+65533&65535;y=o<<B|C&65535;m=y&65535;b[p>>1]=m;if((B|0)>12){l=f+20|0;k=c[l>>2]|0;c[l>>2]=k+1;u=f+8|0;a[(c[u>>2]|0)+k|0]=y;y=(e[p>>1]|0)>>>8&255;k=c[l>>2]|0;c[l>>2]=k+1;a[(c[u>>2]|0)+k|0]=y;y=c[q>>2]|0;k=o>>>((16-y|0)>>>0)&65535;b[p>>1]=k;D=y-12|0;E=k}else{D=B+4|0;E=m}c[q>>2]=D;if((t|0)>-1){m=f+20|0;k=f+8|0;y=0;o=D;u=E;while(1){l=e[f+2684+(d[71328+y|0]<<2)+2>>1]|0;F=l<<o|u&65535;G=F&65535;b[p>>1]=G;if((o|0)>13){H=c[m>>2]|0;c[m>>2]=H+1;a[(c[k>>2]|0)+H|0]=F;F=(e[p>>1]|0)>>>8&255;H=c[m>>2]|0;c[m>>2]=H+1;a[(c[k>>2]|0)+H|0]=F;F=c[q>>2]|0;H=l>>>((16-F|0)>>>0)&65535;b[p>>1]=H;I=F-13|0;J=H}else{I=o+3|0;J=G}c[q>>2]=I;if((y|0)<(t|0)){y=y+1|0;o=I;u=J}else{break}}}u=f+148|0;Rg(f,u,n);o=f+2440|0;Rg(f,o,j);Qg(f,u,o)}else{Lg(f,g,h,i)}}while(0);Kg(f);if((i|0)==0){return}i=f+5820|0;h=c[i>>2]|0;do{if((h|0)>8){g=f+5816|0;J=b[g>>1]&255;I=f+20|0;t=c[I>>2]|0;c[I>>2]=t+1;E=f+8|0;a[(c[E>>2]|0)+t|0]=J;J=(e[g>>1]|0)>>>8&255;t=c[I>>2]|0;c[I>>2]=t+1;a[(c[E>>2]|0)+t|0]=J;K=g}else{g=f+5816|0;if((h|0)<=0){K=g;break}J=b[g>>1]&255;t=f+20|0;E=c[t>>2]|0;c[t>>2]=E+1;a[(c[f+8>>2]|0)+E|0]=J;K=g}}while(0);b[K>>1]=0;c[i>>2]=0;return}function Pg(f,g){f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;h=i;i=i+32|0;j=h|0;k=g|0;l=c[k>>2]|0;m=g+8|0;n=c[m>>2]|0;o=c[n>>2]|0;p=c[n+12>>2]|0;n=f+5200|0;c[n>>2]=0;q=f+5204|0;c[q>>2]=573;if((p|0)>0){r=0;s=-1;while(1){if((b[l+(r<<2)>>1]|0)==0){b[l+(r<<2)+2>>1]=0;t=s}else{u=(c[n>>2]|0)+1|0;c[n>>2]=u;c[f+2908+(u<<2)>>2]=r;a[f+5208+r|0]=0;t=r}u=r+1|0;if((u|0)<(p|0)){r=u;s=t}else{break}}s=c[n>>2]|0;if((s|0)<2){v=s;w=t;x=3}else{y=t}}else{v=0;w=-1;x=3}if((x|0)==3){x=f+5800|0;t=f+5804|0;if((o|0)==0){s=w;r=v;while(1){u=(s|0)<2;z=s+1|0;A=u?z:s;B=u?z:0;z=r+1|0;c[n>>2]=z;c[f+2908+(z<<2)>>2]=B;b[l+(B<<2)>>1]=1;a[f+5208+B|0]=0;c[x>>2]=(c[x>>2]|0)-1;B=c[n>>2]|0;if((B|0)<2){s=A;r=B}else{y=A;break}}}else{r=w;w=v;while(1){v=(r|0)<2;s=r+1|0;A=v?s:r;B=v?s:0;s=w+1|0;c[n>>2]=s;c[f+2908+(s<<2)>>2]=B;b[l+(B<<2)>>1]=1;a[f+5208+B|0]=0;c[x>>2]=(c[x>>2]|0)-1;c[t>>2]=(c[t>>2]|0)-(e[o+(B<<2)+2>>1]|0);B=c[n>>2]|0;if((B|0)<2){r=A;w=B}else{y=A;break}}}}w=g+4|0;c[w>>2]=y;g=c[n>>2]|0;if((g|0)>1){r=(g|0)/2|0;o=g;while(1){t=c[f+2908+(r<<2)>>2]|0;x=f+5208+t|0;A=r<<1;a:do{if((A|0)>(o|0)){C=r}else{B=l+(t<<2)|0;s=r;v=A;z=o;while(1){do{if((v|0)<(z|0)){u=v|1;D=c[f+2908+(u<<2)>>2]|0;E=b[l+(D<<2)>>1]|0;F=c[f+2908+(v<<2)>>2]|0;G=b[l+(F<<2)>>1]|0;if((E&65535)>>>0>=(G&65535)>>>0){if(E<<16>>16!=G<<16>>16){H=v;break}if((d[f+5208+D|0]|0)>>>0>(d[f+5208+F|0]|0)>>>0){H=v;break}}H=u}else{H=v}}while(0);u=b[B>>1]|0;F=c[f+2908+(H<<2)>>2]|0;D=b[l+(F<<2)>>1]|0;if((u&65535)>>>0<(D&65535)>>>0){C=s;break a}if(u<<16>>16==D<<16>>16){if((d[x]|0)>>>0<=(d[f+5208+F|0]|0)>>>0){C=s;break a}}c[f+2908+(s<<2)>>2]=F;F=H<<1;D=c[n>>2]|0;if((F|0)>(D|0)){C=H;break}else{s=H;v=F;z=D}}}}while(0);c[f+2908+(C<<2)>>2]=t;x=r-1|0;A=c[n>>2]|0;if((x|0)>0){r=x;o=A}else{I=A;break}}}else{I=g}g=f+2912|0;o=p;p=I;while(1){I=c[g>>2]|0;r=p-1|0;c[n>>2]=r;C=c[f+2908+(p<<2)>>2]|0;c[g>>2]=C;H=f+5208+C|0;b:do{if((p|0)<3){J=1}else{A=l+(C<<2)|0;x=1;z=2;v=r;while(1){do{if((z|0)<(v|0)){s=z|1;B=c[f+2908+(s<<2)>>2]|0;D=b[l+(B<<2)>>1]|0;F=c[f+2908+(z<<2)>>2]|0;u=b[l+(F<<2)>>1]|0;if((D&65535)>>>0>=(u&65535)>>>0){if(D<<16>>16!=u<<16>>16){K=z;break}if((d[f+5208+B|0]|0)>>>0>(d[f+5208+F|0]|0)>>>0){K=z;break}}K=s}else{K=z}}while(0);s=b[A>>1]|0;F=c[f+2908+(K<<2)>>2]|0;B=b[l+(F<<2)>>1]|0;if((s&65535)>>>0<(B&65535)>>>0){J=x;break b}if(s<<16>>16==B<<16>>16){if((d[H]|0)>>>0<=(d[f+5208+F|0]|0)>>>0){J=x;break b}}c[f+2908+(x<<2)>>2]=F;F=K<<1;B=c[n>>2]|0;if((F|0)>(B|0)){J=K;break}else{x=K;z=F;v=B}}}}while(0);c[f+2908+(J<<2)>>2]=C;H=c[g>>2]|0;r=(c[q>>2]|0)-1|0;c[q>>2]=r;c[f+2908+(r<<2)>>2]=I;r=(c[q>>2]|0)-1|0;c[q>>2]=r;c[f+2908+(r<<2)>>2]=H;r=l+(o<<2)|0;b[r>>1]=(b[l+(H<<2)>>1]|0)+(b[l+(I<<2)>>1]|0);t=a[f+5208+I|0]|0;v=a[f+5208+H|0]|0;z=f+5208+o|0;a[z]=((t&255)>>>0<(v&255)>>>0?v:t)+1;t=o&65535;b[l+(H<<2)+2>>1]=t;b[l+(I<<2)+2>>1]=t;t=o+1|0;c[g>>2]=o;H=c[n>>2]|0;c:do{if((H|0)<2){L=1}else{v=1;x=2;A=H;while(1){do{if((x|0)<(A|0)){B=x|1;F=c[f+2908+(B<<2)>>2]|0;s=b[l+(F<<2)>>1]|0;u=c[f+2908+(x<<2)>>2]|0;D=b[l+(u<<2)>>1]|0;if((s&65535)>>>0>=(D&65535)>>>0){if(s<<16>>16!=D<<16>>16){M=x;break}if((d[f+5208+F|0]|0)>>>0>(d[f+5208+u|0]|0)>>>0){M=x;break}}M=B}else{M=x}}while(0);B=b[r>>1]|0;u=c[f+2908+(M<<2)>>2]|0;F=b[l+(u<<2)>>1]|0;if((B&65535)>>>0<(F&65535)>>>0){L=v;break c}if(B<<16>>16==F<<16>>16){if((d[z]|0)>>>0<=(d[f+5208+u|0]|0)>>>0){L=v;break c}}c[f+2908+(v<<2)>>2]=u;u=M<<1;F=c[n>>2]|0;if((u|0)>(F|0)){L=M;break}else{v=M;x=u;A=F}}}}while(0);c[f+2908+(L<<2)>>2]=o;z=c[n>>2]|0;if((z|0)>1){o=t;p=z}else{break}}p=c[g>>2]|0;g=(c[q>>2]|0)-1|0;c[q>>2]=g;c[f+2908+(g<<2)>>2]=p;p=c[k>>2]|0;k=c[w>>2]|0;w=c[m>>2]|0;m=c[w>>2]|0;g=c[w+4>>2]|0;o=c[w+8>>2]|0;n=c[w+16>>2]|0;w=f+2876|0;vF(w|0,0,32)|0;b[p+(c[f+2908+(c[q>>2]<<2)>>2]<<2)+2>>1]=0;L=(c[q>>2]|0)+1|0;d:do{if((L|0)<573){q=f+5800|0;M=f+5804|0;if((m|0)==0){J=0;K=L;while(1){z=c[f+2908+(K<<2)>>2]|0;r=p+(z<<2)+2|0;H=e[p+(e[r>>1]<<2)+2>>1]|0;I=(H|0)<(n|0);C=I?H+1|0:n;H=(I&1^1)+J|0;b[r>>1]=C;if((z|0)<=(k|0)){r=f+2876+(C<<1)|0;b[r>>1]=(b[r>>1]|0)+1;if((z|0)<(o|0)){N=0}else{N=c[g+(z-o<<2)>>2]|0}r=da(e[p+(z<<2)>>1]|0,N+C|0)|0;c[q>>2]=r+(c[q>>2]|0)}r=K+1|0;if((r|0)<573){J=H;K=r}else{O=H;break}}}else{K=0;J=L;while(1){t=c[f+2908+(J<<2)>>2]|0;H=p+(t<<2)+2|0;r=e[p+(e[H>>1]<<2)+2>>1]|0;C=(r|0)<(n|0);z=C?r+1|0:n;r=(C&1^1)+K|0;b[H>>1]=z;if((t|0)<=(k|0)){H=f+2876+(z<<1)|0;b[H>>1]=(b[H>>1]|0)+1;if((t|0)<(o|0)){P=0}else{P=c[g+(t-o<<2)>>2]|0}H=e[p+(t<<2)>>1]|0;C=da(H,P+z|0)|0;c[q>>2]=C+(c[q>>2]|0);C=da((e[m+(t<<2)+2>>1]|0)+P|0,H)|0;c[M>>2]=C+(c[M>>2]|0)}C=J+1|0;if((C|0)<573){K=r;J=C}else{O=r;break}}}if((O|0)==0){break}J=f+2876+(n<<1)|0;K=O;do{M=n;while(1){r=M-1|0;Q=f+2876+(r<<1)|0;R=b[Q>>1]|0;if(R<<16>>16==0){M=r}else{break}}b[Q>>1]=R-1;r=f+2876+(M<<1)|0;b[r>>1]=(b[r>>1]|0)+2;S=(b[J>>1]|0)-1&65535;b[J>>1]=S;K=K-2|0;}while((K|0)>0);if((n|0)==0){break}else{T=n;U=573;V=S}while(1){K=T&65535;if(V<<16>>16==0){W=U}else{J=V&65535;r=U;while(1){C=r;do{C=C-1|0;X=c[f+2908+(C<<2)>>2]|0;}while((X|0)>(k|0));H=p+(X<<2)+2|0;t=e[H>>1]|0;if((t|0)!=(T|0)){z=da(e[p+(X<<2)>>1]|0,T-t|0)|0;c[q>>2]=z+(c[q>>2]|0);b[H>>1]=K}H=J-1|0;if((H|0)==0){W=C;break}else{J=H;r=C}}}r=T-1|0;if((r|0)==0){break d}T=r;U=W;V=b[f+2876+(r<<1)>>1]|0}}}while(0);V=b[w>>1]<<1;b[j+2>>1]=V;w=((b[f+2878>>1]|0)+V&65535)<<1;b[j+4>>1]=w;V=(w+(b[f+2880>>1]|0)&65535)<<1;b[j+6>>1]=V;w=(V+(b[f+2882>>1]|0)&65535)<<1;b[j+8>>1]=w;V=(w+(b[f+2884>>1]|0)&65535)<<1;b[j+10>>1]=V;w=(V+(b[f+2886>>1]|0)&65535)<<1;b[j+12>>1]=w;V=(w+(b[f+2888>>1]|0)&65535)<<1;b[j+14>>1]=V;w=(V+(b[f+2890>>1]|0)&65535)<<1;b[j+16>>1]=w;V=(w+(b[f+2892>>1]|0)&65535)<<1;b[j+18>>1]=V;w=(V+(b[f+2894>>1]|0)&65535)<<1;b[j+20>>1]=w;V=(w+(b[f+2896>>1]|0)&65535)<<1;b[j+22>>1]=V;w=(V+(b[f+2898>>1]|0)&65535)<<1;b[j+24>>1]=w;V=(w+(b[f+2900>>1]|0)&65535)<<1;b[j+26>>1]=V;w=(V+(b[f+2902>>1]|0)&65535)<<1;b[j+28>>1]=w;b[j+30>>1]=(w+(b[f+2904>>1]|0)&65535)<<1;if((y|0)<0){Y=32;Z=0;i=h;return}else{_=0}while(1){f=b[l+(_<<2)+2>>1]|0;w=f&65535;if(f<<16>>16!=0){f=j+(w<<1)|0;V=b[f>>1]|0;b[f>>1]=V+1;f=0;W=w;w=V&65535;while(1){$=f|w&1;V=W-1|0;if((V|0)>0){f=$<<1;W=V;w=w>>>1}else{break}}b[l+(_<<2)>>1]=$}if((_|0)<(y|0)){_=_+1|0}else{break}}Y=32;Z=0;i=h;return}function Qg(f,g,h){f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;i=f+5792|0;if((c[i>>2]|0)==0){j=c[f+5820>>2]|0;k=b[f+5816>>1]|0}else{l=f+5796|0;m=f+5784|0;n=f+5820|0;o=f+5816|0;p=f+20|0;q=f+8|0;r=0;while(1){s=b[(c[l>>2]|0)+(r<<1)>>1]|0;t=s&65535;u=r+1|0;v=d[(c[m>>2]|0)+r|0]|0;do{if(s<<16>>16==0){w=e[g+(v<<2)+2>>1]|0;x=c[n>>2]|0;y=e[g+(v<<2)>>1]|0;z=e[o>>1]|0|y<<x;A=z&65535;b[o>>1]=A;if((x|0)>(16-w|0)){B=c[p>>2]|0;c[p>>2]=B+1;a[(c[q>>2]|0)+B|0]=z;z=(e[o>>1]|0)>>>8&255;B=c[p>>2]|0;c[p>>2]=B+1;a[(c[q>>2]|0)+B|0]=z;z=c[n>>2]|0;B=y>>>((16-z|0)>>>0)&65535;b[o>>1]=B;y=w-16+z|0;c[n>>2]=y;C=y;D=B;break}else{B=x+w|0;c[n>>2]=B;C=B;D=A;break}}else{A=d[169e3+v|0]|0;B=(A|256)+1|0;w=e[g+(B<<2)+2>>1]|0;x=c[n>>2]|0;y=e[g+(B<<2)>>1]|0;B=e[o>>1]|0|y<<x;z=B&65535;b[o>>1]=z;if((x|0)>(16-w|0)){E=c[p>>2]|0;c[p>>2]=E+1;a[(c[q>>2]|0)+E|0]=B;B=(e[o>>1]|0)>>>8&255;E=c[p>>2]|0;c[p>>2]=E+1;a[(c[q>>2]|0)+E|0]=B;B=c[n>>2]|0;E=y>>>((16-B|0)>>>0)&65535;b[o>>1]=E;F=w-16+B|0;G=E}else{F=x+w|0;G=z}c[n>>2]=F;z=c[26200+(A<<2)>>2]|0;do{if((A-8|0)>>>0<20>>>0){w=v-(c[71720+(A<<2)>>2]|0)&65535;x=w<<F|G&65535;E=x&65535;b[o>>1]=E;if((F|0)>(16-z|0)){B=c[p>>2]|0;c[p>>2]=B+1;a[(c[q>>2]|0)+B|0]=x;x=(e[o>>1]|0)>>>8&255;B=c[p>>2]|0;c[p>>2]=B+1;a[(c[q>>2]|0)+B|0]=x;x=c[n>>2]|0;B=w>>>((16-x|0)>>>0)&65535;b[o>>1]=B;w=z-16+x|0;c[n>>2]=w;H=w;I=B;break}else{B=F+z|0;c[n>>2]=B;H=B;I=E;break}}else{H=F;I=G}}while(0);z=t-1|0;if(z>>>0<256>>>0){J=z}else{J=(z>>>7)+256|0}A=d[169256+J|0]|0;E=e[h+(A<<2)+2>>1]|0;B=e[h+(A<<2)>>1]|0;w=I&65535|B<<H;x=w&65535;b[o>>1]=x;if((H|0)>(16-E|0)){y=c[p>>2]|0;c[p>>2]=y+1;a[(c[q>>2]|0)+y|0]=w;w=(e[o>>1]|0)>>>8&255;y=c[p>>2]|0;c[p>>2]=y+1;a[(c[q>>2]|0)+y|0]=w;w=c[n>>2]|0;y=B>>>((16-w|0)>>>0)&65535;b[o>>1]=y;K=E-16+w|0;L=y}else{K=H+E|0;L=x}c[n>>2]=K;x=c[26320+(A<<2)>>2]|0;if((A-4|0)>>>0>=26>>>0){C=K;D=L;break}E=z-(c[71840+(A<<2)>>2]|0)&65535;A=E<<K|L&65535;z=A&65535;b[o>>1]=z;if((K|0)>(16-x|0)){y=c[p>>2]|0;c[p>>2]=y+1;a[(c[q>>2]|0)+y|0]=A;A=(e[o>>1]|0)>>>8&255;y=c[p>>2]|0;c[p>>2]=y+1;a[(c[q>>2]|0)+y|0]=A;A=c[n>>2]|0;y=E>>>((16-A|0)>>>0)&65535;b[o>>1]=y;E=x-16+A|0;c[n>>2]=E;C=E;D=y;break}else{y=K+x|0;c[n>>2]=y;C=y;D=z;break}}}while(0);if(u>>>0<(c[i>>2]|0)>>>0){r=u}else{j=C;k=D;break}}}D=e[g+1026>>1]|0;C=f+5820|0;r=e[g+1024>>1]|0;g=f+5816|0;i=k&65535|r<<j;b[g>>1]=i;if((j|0)>(16-D|0)){k=f+20|0;n=c[k>>2]|0;c[k>>2]=n+1;K=f+8|0;a[(c[K>>2]|0)+n|0]=i;i=(e[g>>1]|0)>>>8&255;n=c[k>>2]|0;c[k>>2]=n+1;a[(c[K>>2]|0)+n|0]=i;i=c[C>>2]|0;b[g>>1]=r>>>((16-i|0)>>>0);M=D-16+i|0;c[C>>2]=M;return}else{M=j+D|0;c[C>>2]=M;return}}function Rg(d,f,g){d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;h=b[f+2>>1]|0;i=h<<16>>16==0;j=d+2754|0;k=d+5820|0;l=d+2752|0;m=d+5816|0;n=d+20|0;o=d+8|0;p=d+2758|0;q=d+2756|0;r=d+2750|0;s=d+2748|0;t=0;u=-1;v=h&65535;h=i?138:7;w=i?3:4;a:while(1){i=t;x=0;while(1){if((i|0)>(g|0)){break a}y=i+1|0;z=b[f+(y<<2)+2>>1]|0;A=z&65535;B=x+1|0;C=(v|0)==(A|0);if((B|0)<(h|0)&C){i=y;x=B}else{break}}do{if((B|0)<(w|0)){i=d+2684+(v<<2)+2|0;D=d+2684+(v<<2)|0;E=B;F=c[k>>2]|0;G=b[m>>1]|0;while(1){H=e[i>>1]|0;I=e[D>>1]|0;J=G&65535|I<<F;K=J&65535;b[m>>1]=K;if((F|0)>(16-H|0)){L=c[n>>2]|0;c[n>>2]=L+1;a[(c[o>>2]|0)+L|0]=J;J=(e[m>>1]|0)>>>8&255;L=c[n>>2]|0;c[n>>2]=L+1;a[(c[o>>2]|0)+L|0]=J;J=c[k>>2]|0;L=I>>>((16-J|0)>>>0)&65535;b[m>>1]=L;M=H-16+J|0;N=L}else{M=F+H|0;N=K}c[k>>2]=M;K=E-1|0;if((K|0)==0){break}else{E=K;F=M;G=N}}}else{if((v|0)!=0){if((v|0)==(u|0)){O=B;P=c[k>>2]|0;Q=b[m>>1]|0}else{G=e[d+2684+(v<<2)+2>>1]|0;F=c[k>>2]|0;E=e[d+2684+(v<<2)>>1]|0;D=e[m>>1]|0|E<<F;i=D&65535;b[m>>1]=i;if((F|0)>(16-G|0)){K=c[n>>2]|0;c[n>>2]=K+1;a[(c[o>>2]|0)+K|0]=D;D=(e[m>>1]|0)>>>8&255;K=c[n>>2]|0;c[n>>2]=K+1;a[(c[o>>2]|0)+K|0]=D;D=c[k>>2]|0;K=E>>>((16-D|0)>>>0)&65535;b[m>>1]=K;R=G-16+D|0;S=K}else{R=F+G|0;S=i}c[k>>2]=R;O=x;P=R;Q=S}i=e[r>>1]|0;G=e[s>>1]|0;F=Q&65535|G<<P;K=F&65535;b[m>>1]=K;if((P|0)>(16-i|0)){D=c[n>>2]|0;c[n>>2]=D+1;a[(c[o>>2]|0)+D|0]=F;F=(e[m>>1]|0)>>>8&255;D=c[n>>2]|0;c[n>>2]=D+1;a[(c[o>>2]|0)+D|0]=F;F=c[k>>2]|0;D=G>>>((16-F|0)>>>0)&65535;b[m>>1]=D;T=i-16+F|0;U=D}else{T=P+i|0;U=K}c[k>>2]=T;K=O+65533&65535;i=U&65535|K<<T;b[m>>1]=i;if((T|0)>14){D=c[n>>2]|0;c[n>>2]=D+1;a[(c[o>>2]|0)+D|0]=i;i=(e[m>>1]|0)>>>8&255;D=c[n>>2]|0;c[n>>2]=D+1;a[(c[o>>2]|0)+D|0]=i;i=c[k>>2]|0;b[m>>1]=K>>>((16-i|0)>>>0);c[k>>2]=i-14;break}else{c[k>>2]=T+2;break}}if((B|0)<11){i=e[j>>1]|0;K=c[k>>2]|0;D=e[l>>1]|0;F=e[m>>1]|0|D<<K;G=F&65535;b[m>>1]=G;if((K|0)>(16-i|0)){E=c[n>>2]|0;c[n>>2]=E+1;a[(c[o>>2]|0)+E|0]=F;F=(e[m>>1]|0)>>>8&255;E=c[n>>2]|0;c[n>>2]=E+1;a[(c[o>>2]|0)+E|0]=F;F=c[k>>2]|0;E=D>>>((16-F|0)>>>0)&65535;b[m>>1]=E;V=i-16+F|0;W=E}else{V=K+i|0;W=G}c[k>>2]=V;G=x+65534&65535;i=W&65535|G<<V;b[m>>1]=i;if((V|0)>13){K=c[n>>2]|0;c[n>>2]=K+1;a[(c[o>>2]|0)+K|0]=i;i=(e[m>>1]|0)>>>8&255;K=c[n>>2]|0;c[n>>2]=K+1;a[(c[o>>2]|0)+K|0]=i;i=c[k>>2]|0;b[m>>1]=G>>>((16-i|0)>>>0);c[k>>2]=i-13;break}else{c[k>>2]=V+3;break}}else{i=e[p>>1]|0;G=c[k>>2]|0;K=e[q>>1]|0;E=e[m>>1]|0|K<<G;F=E&65535;b[m>>1]=F;if((G|0)>(16-i|0)){D=c[n>>2]|0;c[n>>2]=D+1;a[(c[o>>2]|0)+D|0]=E;E=(e[m>>1]|0)>>>8&255;D=c[n>>2]|0;c[n>>2]=D+1;a[(c[o>>2]|0)+D|0]=E;E=c[k>>2]|0;D=K>>>((16-E|0)>>>0)&65535;b[m>>1]=D;X=i-16+E|0;Y=D}else{X=G+i|0;Y=F}c[k>>2]=X;F=x+65526&65535;i=Y&65535|F<<X;b[m>>1]=i;if((X|0)>9){G=c[n>>2]|0;c[n>>2]=G+1;a[(c[o>>2]|0)+G|0]=i;i=(e[m>>1]|0)>>>8&255;G=c[n>>2]|0;c[n>>2]=G+1;a[(c[o>>2]|0)+G|0]=i;i=c[k>>2]|0;b[m>>1]=F>>>((16-i|0)>>>0);c[k>>2]=i-9;break}else{c[k>>2]=X+7;break}}}}while(0);if(z<<16>>16==0){t=y;u=v;v=A;h=138;w=3;continue}t=y;u=v;v=A;h=C?6:7;w=C?3:4}return}function Sg(a,c,d){a=a|0;c=c|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=b[c+2>>1]|0;g=f<<16>>16==0;b[c+(d+1<<2)+2>>1]=-1;h=a+2752|0;i=a+2756|0;j=a+2748|0;k=g?3:4;l=g?138:7;g=f&65535;f=0;m=-1;a:while(1){n=0;o=f;do{if((o|0)>(d|0)){break a}o=o+1|0;p=b[c+(o<<2)+2>>1]|0;q=p&65535;n=n+1|0;r=(g|0)==(q|0);}while((n|0)<(l|0)&r);do{if((n|0)<(k|0)){s=a+2684+(g<<2)|0;b[s>>1]=(e[s>>1]|0)+n}else{if((g|0)==0){if((n|0)<11){b[h>>1]=(b[h>>1]|0)+1;break}else{b[i>>1]=(b[i>>1]|0)+1;break}}else{if((g|0)!=(m|0)){s=a+2684+(g<<2)|0;b[s>>1]=(b[s>>1]|0)+1}b[j>>1]=(b[j>>1]|0)+1;break}}}while(0);if(p<<16>>16==0){k=3;l=138;m=g;g=q;f=o;continue}k=r?3:4;l=r?6:7;m=g;g=q;f=o}return}function Tg(a,b,c){a=a|0;b=b|0;c=c|0;return dF(da(c,b)|0)|0}function Ug(a,b){a=a|0;b=b|0;eF(b);return}function Vg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if((a|0)==0){b=-1;return b|0}if((c[a+24>>2]|0)>0){b=-1;return b|0}d=c[a+4>>2]|0;e=d+32|0;f=c[e>>2]|0;do{if((f|0)==0){g=0}else{h=Sc[f&127](a,2,0,d)|0;if((h|0)<0){b=-1}else{g=h;break}return b|0}}while(0);if((c[a+28>>2]|0)!=0){fh(a,0)|0}f=(g|0)==0;if(f){Hc[c[c[a+16>>2]>>2]&63](a,0,64)|0;if((bh(a)|0)>0){b=-1;return b|0}g=a+8|0;h=c[g>>2]|0;i=a+12|0;if((c[h+12>>2]|0)>0){Sc[c[i>>2]&127](a,c[h+8>>2]|0,0,d)|0;j=c[g>>2]|0}else{j=h}Sc[c[i>>2]&127](a,j,0,d)|0}j=c[a+20>>2]|0;do{if((j|0)==0){eF(a)}else{if(!(f&(j|0)==1)){break}Sc[c[a+12>>2]&127](a,a,0,d)|0}}while(0);j=c[e>>2]|0;if((j|0)==0){b=0;return b|0}Sc[j&127](a,6,0,d)|0;b=0;return b|0}function Wg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=a+4|0;f=c[e>>2]|0;if((f|0)==0){c[e>>2]=b;g=c[b+28>>2]|0;c[a+12>>2]=(g|0)==0?40:g;h=b;return h|0}if((b|0)==0){h=f;return h|0}g=c[c[a+16>>2]>>2]|0;i=a+8|0;if((c[c[i>>2]>>2]&4096|0)!=0){ah(a,0)|0}j=c[f+32>>2]|0;do{if((j|0)!=0){if((Sc[j&127](a,3,b,f)|0)<0){h=0}else{break}return h|0}}while(0);c[e>>2]=b;e=c[b+28>>2]|0;c[a+12>>2]=(e|0)==0?40:e;e=c[c[i>>2]>>2]|0;if((e&112|0)!=0){h=f;return h|0}do{if((e&2|0)==0){if((e&3|0)==0){if((d&1|0)==0){break}else{h=f}return h|0}else{if((d&3|0)==3){h=f}else{break}return h|0}}else{if((d&2|0)==0){break}else{h=f}return h|0}}while(0);e=Zg(a)|0;j=c[i>>2]|0;c[j>>2]=c[j>>2]&-4097;c[(c[i>>2]|0)+4>>2]=0;c[(c[i>>2]|0)+16>>2]=0;j=c[i>>2]|0;do{if((c[j>>2]&3|0)!=0){i=c[j+8>>2]|0;k=c[j+12>>2]|0;l=i+(k<<2)|0;if((k|0)>0){m=i}else{break}while(1){i=m+4|0;c[m>>2]=0;if(i>>>0<l>>>0){m=i}else{break}}}}while(0);if((e|0)==0){h=f;return h|0}m=b+8|0;j=b+4|0;l=b|0;i=b+24|0;if((d&2|0)==0){n=e}else{d=e;while(1){e=c[d>>2]|0;Hc[g&63](a,d,32)|0;if((e|0)==0){h=f;break}else{d=e}}return h|0}while(1){d=c[n>>2]|0;e=c[m>>2]|0;if((e|0)<0){o=c[n+8>>2]|0}else{o=n+(-e|0)|0}e=c[j>>2]|0;k=o+(c[l>>2]|0)|0;if((e|0)<0){p=c[k>>2]|0}else{p=k}k=c[i>>2]|0;if((k|0)==0){q=dh(0,p,e)|0}else{q=Hc[k&63](a,p,b)|0}c[n+4>>2]=q;Hc[g&63](a,n,32)|0;if((d|0)==0){h=f;break}else{n=d}}return h|0}function Xg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;d=(c|0)==0;do{if((b|0)==0){if(d){e=0;break}e=dF(c)|0}else{if(d){eF(b);e=0;break}else{e=gF(b,c)|0;break}}}while(0);return e|0}function Yg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=a+8|0;d=c[b>>2]|0;e=c[d>>2]|0;do{if((e&12|0)==0){if((e&3|0)==0){f=d+8|0;g=c[f>>2]|0;c[f>>2]=0;h=g;break}g=Zg(a)|0;f=c[b>>2]|0;i=c[f+8>>2]|0;j=c[f+12>>2]|0;f=i+(j<<2)|0;if((j|0)>0){k=i}else{h=g;break}while(1){c[k>>2]=0;i=k+4|0;if(i>>>0<f>>>0){k=i}else{h=g;break}}}else{h=c[d+4>>2]|0}}while(0);d=c[b>>2]|0;c[d>>2]=c[d>>2]&-4097;c[(c[b>>2]|0)+16>>2]=0;c[(c[b>>2]|0)+4>>2]=0;return h|0}function Zg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;b=a+8|0;a=c[b>>2]|0;d=c[a>>2]|0;if((d&4096|0)!=0){e=c[a+4>>2]|0;return e|0}do{if((d&3|0)==0){if((d&112|0)!=0){f=c[a+8>>2]|0;break}g=c[a+4>>2]|0;if((g|0)==0){f=0;break}h=g+4|0;i=c[h>>2]|0;if((i|0)==0){j=g;k=c[g>>2]|0}else{l=g;g=h;h=i;while(1){i=h|0;c[g>>2]=c[i>>2];c[i>>2]=l;i=h+4|0;m=c[i>>2]|0;if((m|0)==0){j=h;k=l;break}else{l=h;g=i;h=m}}}if((k|0)==0){f=j;break}h=j|0;g=k;while(1){l=c[g+4>>2]|0;if((l|0)==0){n=g}else{m=g;i=l;while(1){l=i|0;c[m+4>>2]=c[l>>2];c[l>>2]=m;l=c[i+4>>2]|0;if((l|0)==0){break}else{m=i;i=l}}c[h>>2]=i;n=i}m=n|0;l=c[m>>2]|0;if((l|0)==0){f=j;break}else{h=m;g=l}}}else{g=c[a+8>>2]|0;h=c[a+12>>2]|0;l=g+(h<<2)|0;if((h|0)>0){o=0;p=0;q=g}else{f=0;break}while(1){g=c[q>>2]|0;if((g|0)==0){r=p;s=o}else{if((p|0)==0){t=g;u=g}else{c[p>>2]=g;t=p;u=o}g=t;while(1){h=c[g>>2]|0;if((h|0)==0){break}else{g=h}}c[q>>2]=g;r=g;s=u}i=q+4|0;if(i>>>0<l>>>0){o=s;p=r;q=i}else{f=s;break}}}}while(0);c[(c[b>>2]|0)+4>>2]=f;s=c[b>>2]|0;c[s>>2]=c[s>>2]|4096;e=f;return e|0}function _g(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;e=a+8|0;if((c[c[e>>2]>>2]&4096|0)!=0){ah(a,0)|0}f=c[a+4>>2]|0;g=c[f>>2]|0;h=c[f+4>>2]|0;i=f+8|0;j=c[i>>2]|0;k=c[f+20>>2]|0;l=a+20|0;c[l>>2]=c[l>>2]&-32769;do{if((b|0)==0){if((d&384|0)!=0){m=c[e>>2]|0;n=c[m+8>>2]|0;if((n|0)==0){o=0;return o|0}do{if((d&256|0)==0){c[m+4>>2]=n;p=n}else{q=c[n+4>>2]|0;c[m+4>>2]=q;if((q|0)==0){o=0}else{p=q;break}return o|0}}while(0);if((j|0)<0){o=c[p+8>>2]|0;return o|0}else{o=p+(-j|0)|0;return o|0}}if((d&4098|0)!=0){m=c[e>>2]|0;if((c[m>>2]&144|0)!=0){o=0;return o|0}n=c[m+8>>2]|0;if((n|0)==0){o=0}else{r=n;break}return o|0}if((d&64|0)==0){o=0;return o|0}n=f+16|0;m=c[n>>2]|0;if((m|0)==0){if((c[i>>2]|0)<0){s=18}}else{s=18}a:do{if((s|0)==18){q=c[(c[e>>2]|0)+8>>2]|0;if((q|0)==0){break}t=a+12|0;u=-j|0;if((j|0)<0){v=q;w=m;while(1){x=c[v>>2]|0;if((w|0)!=0){Tc[w&127](a,c[v+8>>2]|0,f)}if((c[i>>2]|0)<0){Sc[c[t>>2]&127](a,v,0,f)|0}if((x|0)==0){break a}v=x;w=c[n>>2]|0}}else{w=q;v=m;while(1){x=c[w>>2]|0;if((v|0)!=0){Tc[v&127](a,w+u|0,f)}if((c[i>>2]|0)<0){Sc[c[t>>2]&127](a,w,0,f)|0}if((x|0)==0){break a}w=x;v=c[n>>2]|0}}}}while(0);c[(c[e>>2]|0)+4>>2]=0;c[(c[e>>2]|0)+8>>2]=0;c[(c[e>>2]|0)+16>>2]=0;o=0;return o|0}else{if((d&2049|0)!=0){n=f+12|0;m=c[n>>2]|0;do{if((m|0)==0){y=b}else{if((d&1|0)==0){y=b;break}v=Hc[m&63](a,b,f)|0;if((v|0)==0){o=0}else{y=v;break}return o|0}}while(0);do{if((j|0)>-1){z=y+j|0}else{m=Sc[c[a+12>>2]&127](a,0,12,f)|0;if((m|0)!=0){c[m+8>>2]=y;z=m;break}if((c[n>>2]|0)==0){o=0;return o|0}m=c[f+16>>2]|0;if((m|0)==0){o=0;return o|0}if((d&1|0)==0){o=0;return o|0}Tc[m&127](a,y,f);o=0;return o|0}}while(0);n=z;m=c[e>>2]|0;v=c[m>>2]|0;do{if((v&128|0)==0){if((v&16|0)==0){if((v&32|0)==0){s=60;break}else{s=56;break}}w=c[m+4>>2]|0;t=(w|0)!=0;if((d&8192|0)==0){if(!t){s=56;break}if((w|0)==(c[m+8>>2]|0)){s=56;break}u=w+4|0;q=c[u>>2]|0;c[z+4>>2]=q;c[q>>2]=n;c[z>>2]=w;c[u>>2]=z;break}else{if(!t){s=60;break}t=w|0;u=c[t>>2]|0;if((u|0)==0){s=60;break}c[z>>2]=u;c[u+4>>2]=z;c[z+4>>2]=w;c[t>>2]=n;break}}else{if((d&8192|0)==0){s=56}else{s=60}}}while(0);if((s|0)==56){v=c[m+8>>2]|0;t=z;c[t>>2]=v;if((v|0)==0){c[z+4>>2]=n}else{w=v+4|0;c[z+4>>2]=c[w>>2];c[w>>2]=z}c[(c[e>>2]|0)+8>>2]=t}else if((s|0)==60){t=m+8|0;w=c[t>>2]|0;if((w|0)==0){v=z;c[t>>2]=v;c[z+4>>2]=n;A=v}else{v=w+4|0;w=v;c[c[w>>2]>>2]=n;c[z+4>>2]=c[w>>2];c[v>>2]=z;A=z}c[A>>2]=0}v=c[e>>2]|0;w=v+16|0;t=c[w>>2]|0;if((t|0)>-1){c[w>>2]=t+1;B=c[e>>2]|0}else{B=v}c[B+4>>2]=n;if((j|0)<0){o=c[z+8>>2]|0;return o|0}else{o=z+(-j|0)|0;return o|0}}v=c[e>>2]|0;do{if((d&512|0)==0){t=c[v+4>>2]|0;if((t|0)!=0){if((j|0)<0){C=c[t+8>>2]|0}else{C=t+(-j|0)|0}if((C|0)==(b|0)){D=t;break}}t=b+g|0;if((h|0)>=0){E=t;s=77;break}E=c[t>>2]|0;s=77}else{E=b;s=77}}while(0);b:do{if((s|0)==77){n=c[v+8>>2]|0;if((n|0)==0){o=0;return o|0}m=(h|0)<0;t=(k|0)==0;w=(h|0)<1;if((j|0)<0){u=n;while(1){q=(c[u+8>>2]|0)+g|0;if(m){F=c[q>>2]|0}else{F=q}do{if(t){if(w){G=Ya(E|0,F|0)|0;break}else{G=wF(E|0,F|0,h|0)|0;break}}else{G=Sc[k&127](a,E,F,f)|0}}while(0);if((G|0)==0){D=u;break b}q=c[u>>2]|0;if((q|0)==0){o=0;break}else{u=q}}return o|0}else{u=n;while(1){q=u+(g-j)|0;if(m){H=c[q>>2]|0}else{H=q}do{if(t){if(w){I=Ya(E|0,H|0)|0;break}else{I=wF(E|0,H|0,h|0)|0;break}}else{I=Sc[k&127](a,E,H,f)|0}}while(0);if((I|0)==0){D=u;break b}q=c[u>>2]|0;if((q|0)==0){o=0;break}else{u=q}}return o|0}}}while(0);if((D|0)==0){o=0;return o|0}c[l>>2]=c[l>>2]|32768;if((d&4098|0)!=0){r=D;break}do{if((d&8|0)==0){if((d&16|0)==0){J=D;break}v=c[e>>2]|0;if((D|0)!=(c[v+8>>2]|0)){J=c[D+4>>2]|0;break}c[v+4>>2]=0;o=0;return o|0}else{J=c[D>>2]|0}}while(0);c[(c[e>>2]|0)+4>>2]=J;if((J|0)==0){o=0;return o|0}if((j|0)<0){o=c[J+8>>2]|0;return o|0}else{o=J+(-j|0)|0;return o|0}}}while(0);J=r|0;D=c[J>>2]|0;if((D|0)==0){K=0}else{c[D+4>>2]=c[r+4>>2];K=c[J>>2]|0}D=(c[e>>2]|0)+8|0;l=c[D>>2]|0;do{if((r|0)==(l|0)){c[D>>2]=K;I=c[(c[e>>2]|0)+8>>2]|0;if((I|0)==0){break}c[I+4>>2]=c[r+4>>2]}else{I=r+4|0;c[c[I>>2]>>2]=K;H=l+4|0;if((r|0)!=(c[H>>2]|0)){break}c[H>>2]=c[I>>2]}}while(0);l=(c[e>>2]|0)+4|0;if((r|0)==(c[l>>2]|0)){L=c[J>>2]|0}else{L=0}c[l>>2]=L;L=(c[e>>2]|0)+16|0;c[L>>2]=(c[L>>2]|0)-1;if((j|0)<0){M=c[r+8>>2]|0}else{M=r+(-j|0)|0}j=c[f+16>>2]|0;do{if((j|0)!=0){if((d&2|0)==0){break}Tc[j&127](a,M,f)}}while(0);if((c[i>>2]|0)>=0){o=M;return o|0}Sc[c[a+12>>2]&127](a,r,0,f)|0;o=M;return o|0}function $g(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+8|0;e=d|0;if((a|0)==0|(b|0)==0){f=0;i=d;return f|0}g=dF(40)|0;h=g;if((g|0)==0){f=0;i=d;return f|0}c[g>>2]=0;c[g+16>>2]=0;c[g+4>>2]=0;Wg(h,a,0)|0;j=a+32|0;vF(g+20|0,0,20)|0;k=c[j>>2]|0;do{if((k|0)==0){l=h;m=11}else{c[e>>2]=0;n=Sc[k&127](h,1,e,a)|0;if((n|0)<0){o=h;m=12;break}if((n|0)<=0){l=h;m=11;break}n=c[e>>2]|0;if((n|0)!=0){if((c[b+4>>2]&c[n>>2]|0)==0){o=h;m=12;break}else{p=h;q=n;break}}n=a+28|0;if((c[n>>2]|0)==0){o=h;m=12;break}eF(g);r=Sc[c[n>>2]&127](0,0,40,a)|0;n=r;if((r|0)==0){f=0;i=d;return f|0}else{c[r>>2]=0;c[r+16>>2]=0;c[r+4>>2]=0;Wg(n,a,0)|0;c[r+20>>2]=1;c[r+24>>2]=0;c[r+32>>2]=0;c[r+28>>2]=0;l=n;m=11;break}}}while(0);do{if((m|0)==11){g=Sc[c[l+12>>2]&127](l,0,28,a)|0;c[e>>2]=g;if((g|0)==0){o=l;m=12;break}c[g>>2]=c[b+4>>2];c[(c[e>>2]|0)+4>>2]=0;c[(c[e>>2]|0)+8>>2]=0;c[(c[e>>2]|0)+20>>2]=0;c[(c[e>>2]|0)+16>>2]=0;c[(c[e>>2]|0)+12>>2]=0;c[(c[e>>2]|0)+24>>2]=0;p=l;q=c[e>>2]|0}}while(0);if((m|0)==12){eF(o);f=0;i=d;return f|0}c[p+8>>2]=q;c[p>>2]=c[b>>2];c[p+16>>2]=b;b=c[j>>2]|0;if((b|0)==0){f=p;i=d;return f|0}Sc[b&127](p,5,p,a)|0;f=p;i=d;return f|0}function ah(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=c[c[a+16>>2]>>2]|0;e=a+8|0;f=c[e>>2]|0;g=f|0;h=c[g>>2]|0;i=h&4096;do{if((b|0)==0){if((i|0)==0){j=-1;return j|0}else{k=i;l=c[f+4>>2]|0;break}}else{if((c[f+16>>2]|0)==0){k=0;l=b;break}else{j=-1}return j|0}}while(0);c[g>>2]=h&-4097;h=c[e>>2]|0;g=c[h>>2]|0;if((g&3|0)==0){b=h+4|0;if((g&12|0)==0){c[b>>2]=0;c[(c[e>>2]|0)+8>>2]=l}else{c[b>>2]=l}if((k|0)!=0){j=0;return j|0}c[(c[e>>2]|0)+16>>2]=-1;j=0;return j|0}c[h+4>>2]=0;h=c[e>>2]|0;if((k|0)==0){c[h+16>>2]=0;if((l|0)==0){j=0;return j|0}else{m=l}while(1){k=c[m>>2]|0;Hc[d&63](a,m,32)|0;if((k|0)==0){j=0;break}else{m=k}}return j|0}m=c[h+8>>2]|0;a=c[h+12>>2]|0;h=m+(a<<2)|0;if((a|0)>0){n=m;o=l}else{j=0;return j|0}while(1){l=c[n>>2]|0;if((l|0)==0){p=o}else{c[n>>2]=o;m=l|0;l=c[m>>2]|0;c[m>>2]=0;p=l}l=n+4|0;if(l>>>0<h>>>0){n=l;o=p}else{j=0;break}}return j|0}function bh(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=a+8|0;d=c[b>>2]|0;if((c[d>>2]&4096|0)==0){e=d}else{ah(a,0)|0;e=c[b>>2]|0}a=e+16|0;do{if((c[a>>2]|0)<0){d=c[e>>2]|0;if((d&12|0)!=0){c[a>>2]=ch(c[e+4>>2]|0)|0;break}if((d&112|0)==0){break}d=c[e+8>>2]|0;if((d|0)==0){f=0}else{g=0;h=d;while(1){d=g+1|0;i=c[h>>2]|0;if((i|0)==0){f=d;break}else{g=d;h=i}}}c[a>>2]=f}}while(0);return c[(c[b>>2]|0)+16>>2]|0}function ch(a){a=a|0;var b=0;if((a|0)==0){return 0}else{b=ch(c[a+4>>2]|0)|0;return b+1+(ch(c[a>>2]|0)|0)|0}return 0}function dh(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if((e|0)<1){f=a[c]|0;if(f<<24>>24==0){g=c;h=b}else{i=c;j=b;k=f;while(1){f=a[i+1|0]|0;l=da(((k&255)<<8)+j+(f&255)|0,17109811)|0;m=i+(f<<24>>24!=0?2:1)|0;f=a[m]|0;if(f<<24>>24==0){g=m;h=l;break}else{i=m;j=l;k=f}}}n=h;o=g-c|0;p=n+o|0;q=da(p,17109811)|0;return q|0}g=e-1|0;h=c+g|0;if((g|0)>0){g=c;k=b;while(1){j=da(((d[g]|0)<<8)+k+(d[g+1|0]|0)|0,17109811)|0;i=g+2|0;if(i>>>0<h>>>0){g=i;k=j}else{r=i;s=j;break}}}else{r=c;s=b}if(r>>>0>h>>>0){n=s;o=e;p=n+o|0;q=da(p,17109811)|0;return q|0}n=da(((d[r]|0)<<8)+s|0,17109811)|0;o=e;p=n+o|0;q=da(p,17109811)|0;return q|0}
-
-
-
-function Mz(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,S=0,T=0,U=0.0,V=0.0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0.0,ab=0.0,bb=0.0,cb=0,db=0.0,eb=0.0,fb=0,gb=0.0,hb=0.0,ib=0.0,jb=0,kb=0.0,lb=0.0,mb=0.0,nb=0,ob=0.0,pb=0.0,qb=0.0,rb=0,sb=0.0,tb=0.0,ub=0.0,vb=0,wb=0.0,xb=0.0,yb=0.0,zb=0,Ab=0.0,Bb=0.0,Cb=0.0,Db=0,Eb=0.0,Fb=0.0,Gb=0.0,Hb=0,Ib=0.0,Jb=0.0,Kb=0.0,Lb=0,Mb=0.0,Nb=0.0,Ob=0.0,Pb=0.0,Qb=0,Rb=0.0,Sb=0.0,Tb=0,Ub=0.0,Vb=0.0,Wb=0.0,Xb=0.0,Yb=0,Zb=0.0,_b=0.0,$b=0,ac=0.0,bc=0.0,dc=0.0,ec=0,fc=0.0,gc=0.0,hc=0.0,ic=0.0,jc=0,kc=0.0,lc=0.0,mc=0.0,nc=0,oc=0.0,pc=0.0,qc=0.0,rc=0.0,sc=0,tc=0.0,uc=0.0,vc=0,wc=0.0,xc=0.0,yc=0.0,zc=0;j=i;i=i+424|0;k=j|0;l=j+40|0;m=j+72|0;n=j+104|0;p=j+136|0;q=j+168|0;r=j+200|0;s=j+232|0;t=j+264|0;u=j+296|0;v=j+328|0;w=j+360|0;x=j+392|0;y=jk(28)|0;z=y;A=$g(173192,c[43332]|0)|0;B=y+20|0;c[B>>2]=A;do{if((A|0)==0){Ma(84568,14,1,c[o>>2]|0)|0;C=6}else{D=tz()|0;c[y+24>>2]=D;if((D|0)==0){Ma(84568,14,1,c[o>>2]|0)|0;C=6;break}else{c[y>>2]=b;c[y+4>>2]=d;c[y+8>>2]=e;c[y+12>>2]=f;c[y+16>>2]=g;E=z;break}}}while(0);if((C|0)==6){z=c[B>>2]|0;if((z|0)!=0){Vg(z)|0}z=c[y+24>>2]|0;if((z|0)!=0){uz(z)|0}eF(y);E=0}y=c[E+16>>2]|0;F=+h[y+16>>3];G=+h[y+24>>3];y=~~(F>G?F:G);if((y|0)==0){H=0}else{z=y>>>0>65535>>>0;B=z?y>>>16:y;y=z?16:0;if(B>>>0>255>>>0){I=y|8;J=B>>>8}else{I=y;J=B}if(J>>>0>15>>>0){K=I+4|0;L=J>>>4}else{K=I;L=J}if(L>>>0>3>>>0){M=K+2|0;N=L>>>2}else{M=K;N=L}H=M+1+(N>>>0>1>>>0)|0}N=E+4|0;a:do{if((c[N>>2]|0)>0){M=E|0;L=E+20|0;if((H|0)>0){O=0}else{K=0;while(1){J=jk(32)|0;c[J+28>>2]=(c[M>>2]|0)+(K*40|0);I=c[M>>2]|0;B=c[I+(K*40|0)+32>>2]|0;if((B|0)==0){P=0.0;Q=0.0}else{P=+h[B>>3];Q=+h[B+8>>3]}G=+h[I+(K*40|0)>>3];B=~~+R(G-P);F=+h[I+(K*40|0)+8>>3];y=~~+R(F-Q);z=~~+ca(P+(G+ +h[I+(K*40|0)+16>>3]));if((z|0)==2147483647){C=34;break}f=~~+ca(Q+(F+ +h[I+(K*40|0)+24>>3]));if((f|0)==2147483647){C=36;break}c[J+12>>2]=B;c[J+16>>2]=y;c[J+20>>2]=z;c[J+24>>2]=f;c[J+8>>2]=0;f=c[L>>2]|0;z=K+1|0;if((Hc[c[f>>2]&63](f,J,1)|0)==0){S=-1;C=123;break}if((z|0)<(c[N>>2]|0)){K=z}else{T=L;break a}}if((C|0)==34){cc(94960,147512,264,170168);return 0}else if((C|0)==36){cc(89528,147512,266,170168);return 0}else if((C|0)==123){i=j;return S|0}}while(1){K=jk(32)|0;c[K+28>>2]=(c[M>>2]|0)+(O*40|0);z=c[M>>2]|0;J=c[z+(O*40|0)+32>>2]|0;if((J|0)==0){U=0.0;V=0.0}else{U=+h[J>>3];V=+h[J+8>>3]}F=+h[z+(O*40|0)>>3];J=~~+R(F-U);G=+h[z+(O*40|0)+8>>3];f=~~+R(G-V);y=~~+ca(U+(F+ +h[z+(O*40|0)+16>>3]));if((y|0)==2147483647){C=34;break}B=~~+ca(V+(G+ +h[z+(O*40|0)+24>>3]));if((B|0)==2147483647){C=36;break}c[K+12>>2]=J;c[K+16>>2]=f;c[K+20>>2]=y;c[K+24>>2]=B;z=((B-f|0)/2|0)+f|0;f=((y-J|0)/2|0)+J|0;J=0;y=H;while(1){B=y-1|0;I=f>>>(B>>>0)&1;e=z>>>(B>>>0)&1;W=I<<1|J<<2|e^I;A=e-1|0;e=A&(z^f);D=A&-I;if((B|0)>0){z=e^z^D;f=e^f^D;J=W;y=B}else{break}}c[K+8>>2]=W;y=c[L>>2]|0;J=O+1|0;if((Hc[c[y>>2]&63](y,K,1)|0)==0){S=-1;C=123;break}if((J|0)<(c[N>>2]|0)){O=J}else{T=L;break a}}if((C|0)==34){cc(94960,147512,264,170168);return 0}else if((C|0)==36){cc(89528,147512,266,170168);return 0}else if((C|0)==123){i=j;return S|0}}else{T=E+20|0}}while(0);O=c[T>>2]|0;N=Hc[c[O>>2]&63](O,0,128)|0;if((N|0)!=0){O=E+24|0;W=N;do{N=c[O>>2]|0;xz(N,W+12|0,c[W+28>>2]|0,N|0,0)|0;N=c[T>>2]|0;W=Hc[c[N>>2]&63](N,W,8)|0;}while((W|0)!=0)}W=bh(c[T>>2]|0)|0;b:do{if((bh(c[T>>2]|0)|0)==0){X=0}else{O=0;while(1){N=c[T>>2]|0;H=c[(c[N+8>>2]|0)+4>>2]|0;if((H|0)==0){C=47;break}L=c[(c[N+4>>2]|0)+8>>2]|0;if((L|0)<0){Y=c[H+8>>2]|0}else{Y=H+(-L|0)|0}if((Y|0)==0){C=47;break}Hc[c[N>>2]&63](N,Y,4096)|0;eF(Y);N=O+1|0;if((bh(c[T>>2]|0)|0)==0){X=N;break b}else{O=N}}if((C|0)==47){cc(106312,147512,616,169816);return 0}}}while(0);if((W|0)!=(X|0)){cc(100584,147512,623,169816);return 0}X=Vg(c[T>>2]|0)|0;if((X|0)<0){S=X;i=j;return S|0}if((d|0)>0){X=k;T=k|0;W=l|0;Y=l+8|0;O=l+16|0;N=l+24|0;L=g+32|0;g=m|0;H=m+8|0;M=m+16|0;J=m+24|0;y=n|0;f=n+8|0;z=n+16|0;B=n+24|0;D=p|0;e=p+8|0;I=p+16|0;A=p+24|0;Z=q|0;_=q+8|0;$=q+16|0;aa=q+24|0;ba=r|0;da=r+8|0;ea=r+16|0;fa=r+24|0;ga=s|0;ha=s+8|0;ia=s+16|0;ja=s+24|0;ka=t|0;la=t+8|0;ma=t+16|0;na=t+24|0;oa=k+24|0;pa=k+28|0;qa=k+32|0;ra=k+12|0;sa=k+8|0;ta=k+4|0;ua=k+20|0;k=w|0;va=w+8|0;wa=w+16|0;xa=w+24|0;ya=x|0;za=x+8|0;Aa=x+16|0;Ba=x+24|0;Ca=u|0;Da=u+8|0;Ea=u+16|0;Fa=u+24|0;Ga=v|0;Ha=v+8|0;Ia=v+16|0;Ja=v+24|0;Ka=0;La=0;while(1){Na=b+(Ka*40|0)+32|0;Oa=c[Na>>2]|0;do{if((Oa|0)==0){Pa=La}else{Qa=b+(Ka*40|0)|0;Ra=Oa|0;V=+h[Ra>>3];Sa=b+(Ka*40|0)+16|0;U=(V*2.0+ +h[Sa>>3])*.125;Ta=Oa+8|0;Ua=b+(Ka*40|0)+24|0;Q=(+h[Ta>>3]*2.0+ +h[Ua>>3])*.5;vF(X|0,0,36)|0;Va=Qa|0;Wa=Oa+16|0;h[Wa>>3]=+h[Va>>3]-V;Xa=b+(Ka*40|0)+8|0;Ya=Oa+24|0;h[Ya>>3]=+h[Xa>>3]+ +h[Ua>>3];Nz(l,E,Qa,T);Za=c[W>>2]|0;V=+h[Y>>3];P=+h[O>>3];G=+h[N>>3];c:do{if((Za|0)==0){_a=0;$a=V;ab=P;bb=G}else{h[Ya>>3]=+h[Xa>>3];Nz(m,E,Qa,T);cb=c[g>>2]|0;F=+h[H>>3];db=+h[M>>3];eb=+h[J>>3];if((cb|0)==0){_a=0;$a=F;ab=db;bb=eb;break}if(F<V){fb=cb;gb=F;hb=db;ib=eb}else{fb=Za;gb=V;hb=P;ib=G}h[Ya>>3]=+h[Xa>>3]- +h[Ta>>3];Nz(n,E,Qa,T);cb=c[y>>2]|0;eb=+h[f>>3];db=+h[z>>3];F=+h[B>>3];if((cb|0)==0){_a=0;$a=eb;ab=db;bb=F;break}if(eb<gb){jb=cb;kb=eb;lb=db;mb=F}else{jb=fb;kb=gb;lb=hb;mb=ib}h[Wa>>3]=+h[Va>>3];h[Ya>>3]=+h[Xa>>3]+ +h[Ua>>3];Nz(p,E,Qa,T);cb=c[D>>2]|0;F=+h[e>>3];db=+h[I>>3];eb=+h[A>>3];if((cb|0)==0){_a=0;$a=F;ab=db;bb=eb;break}if(F<kb){nb=cb;ob=F;pb=db;qb=eb}else{nb=jb;ob=kb;pb=lb;qb=mb}h[Ya>>3]=+h[Xa>>3]- +h[Ta>>3];Nz(q,E,Qa,T);cb=c[Z>>2]|0;eb=+h[_>>3];db=+h[$>>3];F=+h[aa>>3];if((cb|0)==0){_a=0;$a=eb;ab=db;bb=F;break}if(eb<ob){rb=cb;sb=eb;tb=db;ub=F}else{rb=nb;sb=ob;tb=pb;ub=qb}h[Wa>>3]=+h[Va>>3]+ +h[Sa>>3];h[Ya>>3]=+h[Xa>>3]+ +h[Ua>>3];Nz(r,E,Qa,T);cb=c[ba>>2]|0;F=+h[da>>3];db=+h[ea>>3];eb=+h[fa>>3];if((cb|0)==0){_a=0;$a=F;ab=db;bb=eb;break}if(F<sb){vb=cb;wb=F;xb=db;yb=eb}else{vb=rb;wb=sb;xb=tb;yb=ub}h[Ya>>3]=+h[Xa>>3];Nz(s,E,Qa,T);cb=c[ga>>2]|0;eb=+h[ha>>3];db=+h[ia>>3];F=+h[ja>>3];if((cb|0)==0){_a=0;$a=eb;ab=db;bb=F;break}if(eb<wb){zb=cb;Ab=eb;Bb=db;Cb=F}else{zb=vb;Ab=wb;Bb=xb;Cb=yb}h[Ya>>3]=+h[Xa>>3]- +h[Ta>>3];Nz(t,E,Qa,T);cb=c[ka>>2]|0;F=+h[la>>3];db=+h[ma>>3];eb=+h[na>>3];if((cb|0)==0){_a=0;$a=F;ab=db;bb=eb;break}if(F<Ab){Db=cb;Eb=F;Fb=db;Gb=eb}else{Db=zb;Eb=Ab;Fb=Bb;Gb=Cb}cb=(c[pa>>2]|0)==0;do{if((c[oa>>2]|0)==0){if(!cb){Hb=Db;Ib=Eb;Jb=Fb;Kb=Gb;C=89;break}if((c[qa>>2]|0)!=0){Hb=Db;Ib=Eb;Jb=Fb;Kb=Gb;C=89;break}if((c[ra>>2]|0)!=0){C=84;break}if((c[T>>2]|0)==0){Lb=Db;Mb=Eb;Nb=Fb;Ob=Gb}else{C=84}}else{if(!cb){Hb=Db;Ib=Eb;Jb=Fb;Kb=Gb;C=89;break}if((c[qa>>2]|0)==0){C=84}else{Hb=Db;Ib=Eb;Jb=Fb;Kb=Gb;C=89}}}while(0);do{if((C|0)==84){C=0;eb=+h[Va>>3]- +h[Ra>>3];h[Wa>>3]=eb;h[Ya>>3]=+h[Xa>>3]+ +h[Ua>>3];if(eb>+h[Va>>3]+ +h[Sa>>3]){Hb=Db;Ib=Eb;Jb=Fb;Kb=Gb;C=89;break}else{Pb=Eb;Qb=Db;Rb=Fb;Sb=Gb}while(1){Nz(u,E,Qa,T);cb=c[Ca>>2]|0;eb=+h[Da>>3];db=+h[Ea>>3];F=+h[Fa>>3];if((cb|0)==0){_a=0;$a=eb;ab=db;bb=F;break c}if(eb<Pb){Tb=cb;Ub=eb;Vb=db;Wb=F}else{Tb=Qb;Ub=Pb;Vb=Rb;Wb=Sb}F=U+ +h[Wa>>3];h[Wa>>3]=F;if(F>+h[Va>>3]+ +h[Sa>>3]){Hb=Tb;Ib=Ub;Jb=Vb;Kb=Wb;C=89;break}else{Pb=Ub;Qb=Tb;Rb=Vb;Sb=Wb}}}}while(0);do{if((C|0)==89){C=0;if((c[ra>>2]|0)!=0){Lb=Hb;Mb=Ib;Nb=Jb;Ob=Kb;break}if((c[T>>2]|0)!=0){Lb=Hb;Mb=Ib;Nb=Jb;Ob=Kb;break}h[Wa>>3]=+h[Va>>3]- +h[Ra>>3];F=+h[Xa>>3]+ +h[Ua>>3];h[Ya>>3]=F;if(F<+h[Xa>>3]- +h[Ta>>3]){Lb=Hb;Mb=Ib;Nb=Jb;Ob=Kb;break}else{Xb=Ib;Yb=Hb;Zb=Jb;_b=Kb}while(1){Nz(v,E,Qa,T);cb=c[Ga>>2]|0;F=+h[Ha>>3];db=+h[Ia>>3];eb=+h[Ja>>3];if((cb|0)==0){_a=0;$a=F;ab=db;bb=eb;break c}if(F<Xb){$b=cb;ac=F;bc=db;dc=eb}else{$b=Yb;ac=Xb;bc=Zb;dc=_b}eb=+h[Ya>>3]-Q;h[Ya>>3]=eb;if(eb<+h[Xa>>3]- +h[Ta>>3]){Lb=$b;Mb=ac;Nb=bc;Ob=dc;break}else{Xb=ac;Yb=$b;Zb=bc;_b=dc}}}}while(0);h[Wa>>3]=+h[Va>>3]+ +h[Sa>>3];eb=+h[Ta>>3];h[Ya>>3]=+h[Xa>>3]-eb;cb=(c[ta>>2]|0)==0;do{if((c[sa>>2]|0)==0){if(!cb){ec=Lb;fc=Mb;gc=Nb;hc=Ob;break}if((c[T>>2]|0)!=0){ec=Lb;fc=Mb;gc=Nb;hc=Ob;break}if((c[ua>>2]|0)!=0){C=103;break}if((c[qa>>2]|0)==0){_a=Lb;$a=Mb;ab=Nb;bb=Ob;break c}else{C=103}}else{if(!cb){ec=Lb;fc=Mb;gc=Nb;hc=Ob;break}if((c[T>>2]|0)==0){C=103}else{ec=Lb;fc=Mb;gc=Nb;hc=Ob}}}while(0);do{if((C|0)==103){C=0;db=+h[Va>>3]+ +h[Sa>>3];h[Wa>>3]=db;h[Ya>>3]=+h[Xa>>3]-eb;if(db<+h[Va>>3]- +h[Ra>>3]){ec=Lb;fc=Mb;gc=Nb;hc=Ob;break}else{ic=Mb;jc=Lb;kc=Nb;lc=Ob}while(1){Nz(w,E,Qa,T);cb=c[k>>2]|0;db=+h[va>>3];F=+h[wa>>3];mc=+h[xa>>3];if((cb|0)==0){_a=0;$a=db;ab=F;bb=mc;break c}if(db<ic){nc=cb;oc=db;pc=F;qc=mc}else{nc=jc;oc=ic;pc=kc;qc=lc}mc=+h[Wa>>3]-U;h[Wa>>3]=mc;if(mc<+h[Va>>3]- +h[Ra>>3]){ec=nc;fc=oc;gc=pc;hc=qc;break}else{ic=oc;jc=nc;kc=pc;lc=qc}}}}while(0);if((c[ua>>2]|0)!=0){_a=ec;$a=fc;ab=gc;bb=hc;break}if((c[qa>>2]|0)!=0){_a=ec;$a=fc;ab=gc;bb=hc;break}h[Wa>>3]=+h[Va>>3]+ +h[Sa>>3];eb=+h[Xa>>3]- +h[Ta>>3];h[Ya>>3]=eb;if(eb>+h[Xa>>3]+ +h[Ua>>3]){_a=ec;$a=fc;ab=gc;bb=hc;break}else{rc=fc;sc=ec;tc=gc;uc=hc}while(1){Nz(x,E,Qa,T);cb=c[ya>>2]|0;eb=+h[za>>3];mc=+h[Aa>>3];F=+h[Ba>>3];if((cb|0)==0){_a=0;$a=eb;ab=mc;bb=F;break c}if(eb<rc){vc=cb;wc=eb;xc=mc;yc=F}else{vc=sc;wc=rc;xc=tc;yc=uc}F=Q+ +h[Ya>>3];h[Ya>>3]=F;if(F>+h[Xa>>3]+ +h[Ua>>3]){_a=vc;$a=wc;ab=xc;bb=yc;break}else{rc=wc;sc=vc;tc=xc;uc=yc}}}}while(0);if((_a|0)==0){a[(c[Na>>2]|0)+36|0]=1;Pa=La;break}if($a==0.0){h[(c[Na>>2]|0)+16>>3]=ab;h[(c[Na>>2]|0)+24>>3]=bb;a[(c[Na>>2]|0)+36|0]=1;Pa=La;break}if((a[L]|0)!=1){Pa=1;break}h[(c[Na>>2]|0)+16>>3]=ab;h[(c[Na>>2]|0)+24>>3]=bb;a[(c[Na>>2]|0)+36|0]=1;Pa=La}}while(0);Na=Ka+1|0;if((Na|0)<(d|0)){Ka=Na;La=Pa}else{zc=Pa;break}}}else{zc=0}uz(c[E+24>>2]|0)|0;eF(E);S=zc;i=j;return S|0}function Nz(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0.0,v=0,w=0.0,x=0.0,y=0,z=0,A=0,B=0.0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0.0,S=0.0,T=0,U=0.0,V=0,W=0,X=0,Y=0.0,Z=0.0,_=0.0,$=0,aa=0.0,ba=0,ca=0.0,da=0.0,ea=0.0,fa=0.0;g=i;i=i+32|0;j=g|0;k=e+32|0;l=c[k>>2]|0;if((l|0)==0){cc(101272,147512,382,169800)}m=l+16|0;n=g+16|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];m=c[d+4>>2]|0;a:do{if((m|0)>0){o=c[d>>2]|0;p=0;q=0;b:while(1){do{if((o+(q*40|0)|0)==(e|0)){r=p}else{s=+h[o+(q*40|0)+16>>3];if(s>0.0){if(+h[o+(q*40|0)+24>>3]>0.0){r=p;break}}if(s!=0.0){t=10;break b}if(+h[o+(q*40|0)+24>>3]!=0.0){t=10;break b}s=+h[o+(q*40|0)>>3];u=+h[l+16>>3];do{if(s>u){if(s>=u+ +h[l>>3]){v=0;break}w=+h[o+(q*40|0)+8>>3];x=+h[l+24>>3];if(w<=x){v=0;break}v=w<x+ +h[l+8>>3]|0}else{v=0}}while(0);r=v+p|0}}while(0);y=q+1|0;if((y|0)<(m|0)){p=r;q=y}else{z=r;break a}}if((t|0)==10){cc(112928,147512,219,170448)}}else{z=0}}while(0);r=l+16|0;m=j|0;c[m>>2]=~~+h[r>>3];v=l+24|0;q=j+4|0;c[q>>2]=~~+h[v>>3];p=j+8|0;c[p>>2]=~~(+h[r>>3]+ +h[l>>3]);r=j+12|0;c[r>>2]=~~(+h[v>>3]+ +h[l+8>>3]);l=c[d+24>>2]|0;d=wz(l,c[l>>2]|0,j)|0;if((d|0)==0){c[b>>2]=z;h[b+8>>3]=0.0;j=b+16|0;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];i=g;return}j=e|0;l=e+8|0;v=d;u=0.0;o=z;c:while(1){z=c[(c[v+4>>2]|0)+16>>2]|0;y=z;do{if((y|0)==(e|0)){A=o;B=u}else{C=z;s=+h[C>>3];D=~~s;E=z+8|0;x=+h[E>>3];F=~~x;G=~~(s+ +h[z+16>>3]);H=~~(x+ +h[z+24>>3]);I=c[p>>2]|0;do{if((I|0)<(D|0)){J=o;K=u}else{L=c[m>>2]|0;if((L|0)>(G|0)){J=o;K=u;break}M=c[r>>2]|0;if((M|0)<(F|0)){J=o;K=u;break}N=c[q>>2]|0;if((N|0)>(H|0)){J=o;K=u;break}w=(+(((I|0)<(G|0)?I:G)|0)- +(((L|0)>(D|0)?L:D)|0))*(+(((M|0)<(H|0)?M:H)|0)- +(((N|0)>(F|0)?N:F)|0));if(w<=0.0){J=o;K=u;break}O=c[k>>2]|0;P=c[z+32>>2]|0;if((O|0)==(P|0)){t=27;break c}do{if((a[O+36|0]|0)==0){Q=-1}else{if((a[P+36|0]|0)==0){Q=-1;break}R=+h[j>>3];if(R==0.0){if(+h[l>>3]==0.0){Q=-1;break}}if(s==0.0&x==0.0){Q=-1;break}S=+h[l>>3];if(x<S){if(s<R){Q=0;break}Q=s>R?2:1;break}T=s<R;if(x>S){if(T){Q=6;break}Q=s>R?8:7;break}if(T){Q=3;break}if(s<=R){Q=-1;break}Q=5}}while(0);P=f+(((Q|0)<0?5:Q)<<2)|0;O=c[P>>2]|0;do{if((O|0)==0){c[P>>2]=y;U=w}else{R=+h[O>>3];T=~~R;S=+h[O+8>>3];V=~~S;W=~~(R+ +h[O+16>>3]);X=~~(S+ +h[O+24>>3]);if((I|0)<(T|0)|(L|0)>(W|0)|(M|0)<(V|0)|(N|0)>(X|0)){Y=0.0}else{Y=(+(((I|0)<(W|0)?I:W)|0)- +(((L|0)>(T|0)?L:T)|0))*(+(((M|0)<(X|0)?M:X)|0)- +(((N|0)>(V|0)?N:V)|0))}S=Y>w?Y:0.0;V=c[O+32>>2]|0;do{if((V|0)==0){Z=S}else{R=+h[V+16>>3];X=~~R;_=+h[V+24>>3];T=~~_;W=~~(R+ +h[V>>3]);$=~~(_+ +h[V+8>>3]);if((I|0)<(X|0)|(L|0)>(W|0)|(M|0)<(T|0)|(N|0)>($|0)){aa=0.0}else{aa=(+(((I|0)<(W|0)?I:W)|0)- +(((L|0)>(X|0)?L:X)|0))*(+(((M|0)<($|0)?M:$)|0)- +(((N|0)>(T|0)?N:T)|0))}if(aa<=w){Z=S;break}Z=aa>S?aa:S}}while(0);if(Z>0.0){U=Z;break}c[P>>2]=y;U=w}}while(0);J=o+1|0;K=u+U}}while(0);F=c[z+32>>2]|0;if((F|0)==0){A=J;B=K;break}if((a[F+36|0]|0)==0){A=J;B=K;break}s=+h[F+16>>3];H=~~s;x=+h[F+24>>3];D=~~x;G=~~(s+ +h[F>>3]);P=~~(x+ +h[F+8>>3]);if((I|0)<(H|0)){A=J;B=K;break}N=c[m>>2]|0;if((N|0)>(G|0)){A=J;B=K;break}M=c[r>>2]|0;if((M|0)<(D|0)){A=J;B=K;break}L=c[q>>2]|0;if((L|0)>(P|0)){A=J;B=K;break}x=(+(((I|0)<(G|0)?I:G)|0)- +(((N|0)>(H|0)?N:H)|0))*(+(((M|0)<(P|0)?M:P)|0)- +(((L|0)>(D|0)?L:D)|0));if(x<=0.0){A=J;B=K;break}D=c[k>>2]|0;if((D|0)==(F|0)){t=62;break c}do{if((a[D+36|0]|0)==0){ba=-1}else{s=+h[j>>3];if(s==0.0){if(+h[l>>3]==0.0){ba=-1;break}}w=+h[C>>3];S=+h[E>>3];if(w==0.0&S==0.0){ba=-1;break}_=+h[l>>3];if(S<_){if(w<s){ba=0;break}ba=w>s?2:1;break}F=w<s;if(S>_){if(F){ba=6;break}ba=w>s?8:7;break}if(F){ba=3;break}if(w<=s){ba=-1;break}ba=5}}while(0);E=f+(((ba|0)<0?5:ba)<<2)|0;C=c[E>>2]|0;do{if((C|0)==0){c[E>>2]=y;ca=x}else{s=+h[C>>3];D=~~s;w=+h[C+8>>3];F=~~w;P=~~(s+ +h[C+16>>3]);H=~~(w+ +h[C+24>>3]);if((I|0)<(D|0)|(N|0)>(P|0)|(M|0)<(F|0)|(L|0)>(H|0)){da=0.0}else{da=(+(((I|0)<(P|0)?I:P)|0)- +(((N|0)>(D|0)?N:D)|0))*(+(((M|0)<(H|0)?M:H)|0)- +(((L|0)>(F|0)?L:F)|0))}w=da>x?da:0.0;F=c[C+32>>2]|0;do{if((F|0)==0){ea=w}else{s=+h[F+16>>3];H=~~s;_=+h[F+24>>3];D=~~_;P=~~(s+ +h[F>>3]);G=~~(_+ +h[F+8>>3]);if((I|0)<(H|0)|(N|0)>(P|0)|(M|0)<(D|0)|(L|0)>(G|0)){fa=0.0}else{fa=(+(((I|0)<(P|0)?I:P)|0)- +(((N|0)>(H|0)?N:H)|0))*(+(((M|0)<(G|0)?M:G)|0)- +(((L|0)>(D|0)?L:D)|0))}if(fa<=x){ea=w;break}ea=fa>w?fa:w}}while(0);if(ea>0.0){ca=ea;break}c[E>>2]=y;ca=x}}while(0);A=J+1|0;B=K+ca}}while(0);y=c[v>>2]|0;if((y|0)==0){t=89;break}else{v=y;u=B;o=A}}if((t|0)==27){cc(121496,147512,276,170536)}else if((t|0)==62){cc(121496,147512,276,170536)}else if((t|0)==89){sz(d);c[b>>2]=A;h[b+8>>3]=B;A=b+16|0;c[A>>2]=c[n>>2];c[A+4>>2]=c[n+4>>2];c[A+8>>2]=c[n+8>>2];c[A+12>>2]=c[n+12>>2];i=g;return}}function Oz(){var a=0;Wv(0,1,167424,164312)|0;a=Wz(0,1)|0;Vz(a,0);return a|0}function Pz(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0;f=i;i=i+256|0;if((HA(b,e)|0)==999){g=NA(b,1,e)|0;Fv(1,131864,(j=i,i=i+16|0,c[j>>2]=e,c[j+8>>2]=g,j)|0)|0;i=j;k=-1;i=f;return k|0}if((IA(b,d)|0)==-1){k=-1;i=f;return k|0}b=c[d+8>>2]|0;g=f|0;if((a[(c[b+8>>2]|0)+81|0]|0)==0){l=+h[b+16>>3];if(l<0.0){m=l+-.5}else{m=l+.5}l=+h[b+24>>3];if(l<0.0){n=l+-.5}else{n=l+.5}l=+h[b+32>>3];if(l<0.0){o=l+-.5}else{o=l+.5}l=+h[b+40>>3];if(l<0.0){p=l+-.5}else{p=l+.5}nb(g|0,116720,(j=i,i=i+32|0,c[j>>2]=~~m,c[j+8>>2]=~~n,c[j+16>>2]=~~o,c[j+24>>2]=~~p,j)|0)|0;i=j}else{p=+h[b+24>>3];if(p<0.0){q=p+-.5}else{q=p+.5}p=+h[b+16>>3];if(p<0.0){r=p+-.5}else{r=p+.5}p=+h[b+40>>3];if(p<0.0){s=p+-.5}else{s=p+.5}p=+h[b+32>>3];if(p<0.0){t=p+-.5}else{t=p+.5}nb(g|0,116720,(j=i,i=i+32|0,c[j>>2]=~~q,c[j+8>>2]=~~r,c[j+16>>2]=~~s,c[j+24>>2]=~~t,j)|0)|0;i=j}iw(d|0,109272,g,213384)|0;k=0;i=f;return k|0}function Qz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=c[b+48>>2]|0;CA(a,d)|0;d=c[a+164>>2]|0;c[d+56>>2]=OA(d,c[d+52>>2]|0)|0;do{if((c[(c[f+8>>2]|0)+8>>2]|0)==0){if((c[d+152>>2]&67108864|0)!=0){break}Ma(92216,20,1,c[o>>2]|0)|0;g=-1;return g|0}}while(0);BA(a,e);e=_h(a,f)|0;QA(d);cA(d);GA(a);g=e;return g|0}function Rz(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;h=c[b+48>>2]|0;CA(a,d)|0;d=c[a+164>>2]|0;c[d+56>>2]=OA(d,c[d+52>>2]|0)|0;do{if((c[(c[h+8>>2]|0)+8>>2]|0)==0){if((c[d+152>>2]&67108864|0)!=0){break}Ma(92216,20,1,c[o>>2]|0)|0;j=-1;i=g;return j|0}}while(0);do{if((e|0)!=0){b=dF(4096)|0;c[e>>2]=b;if((b|0)==0){break}k=d+40|0;c[k>>2]=b;c[d+44>>2]=4096;b=d+48|0;c[b>>2]=0;l=_h(a,h)|0;QA(d);if((l|0)==0){c[e>>2]=c[k>>2];c[f>>2]=c[b>>2]}GA(a);j=l;i=g;return j|0}}while(0);Fv(1,86872,(a=i,i=i+1|0,i=i+7&-8,c[a>>2]=0,a)|0)|0;i=a;j=-1;i=g;return j|0}function Sz(a){a=a|0;eF(a);return}function Tz(a,b){a=a|0;b=b|0;Uz(a,0,b);return}function Uz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[d>>2]|0;f=kk(12)|0;g=f;if((b|0)==0){h=0}else{h=Lb(b|0)|0}c[f+4>>2]=h;c[f+8>>2]=Lb(e|0)|0;e=a+100|0;c[f>>2]=c[e>>2];c[e>>2]=g;e=c[d+4>>2]|0;d=c[e+4>>2]|0;if((d|0)==0){return}else{i=e;j=d}while(1){d=c[j+4>>2]|0;if((d|0)!=0){e=i|0;f=0;h=d;do{LA(a,c[e>>2]|0,h,c[j+(f*20|0)+8>>2]|0,g,j+(f*20|0)|0)|0;f=f+1|0;h=c[j+(f*20|0)+4>>2]|0;}while((h|0)!=0)}h=c[i+12>>2]|0;if((h|0)==0){break}else{i=i+8|0;j=h}}return}function Vz(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=c[b+32>>2]|0;if((d|0)==0){e=b+44|0;a[e]=0;f=zB(b)|0;g=tm(b)|0;return}h=c[d>>2]|0;if((h|0)==0){e=b+44|0;a[e]=0;f=zB(b)|0;g=tm(b)|0;return}i=b+100|0;j=d;d=h;do{do{if((a[d]|0)==103){if((Ua(d|0,138896)|0)==0){break}h=c[j+4>>2]|0;k=c[h>>2]|0;l=kk(12)|0;m=l;c[l+4>>2]=0;c[l+8>>2]=Lb(k|0)|0;c[l>>2]=c[i>>2];c[i>>2]=m;l=c[h+4>>2]|0;h=c[l+4>>2]|0;if((h|0)==0){break}else{n=l;o=h}while(1){h=c[o+4>>2]|0;if((h|0)!=0){l=n|0;k=0;p=h;do{LA(b,c[l>>2]|0,p,c[o+(k*20|0)+8>>2]|0,m,o+(k*20|0)|0)|0;k=k+1|0;p=c[o+(k*20|0)+4>>2]|0;}while((p|0)!=0)}p=c[n+12>>2]|0;if((p|0)==0){break}else{n=n+8|0;o=p}}}}while(0);j=j+8|0;d=c[j>>2]|0;}while((d|0)!=0);e=b+44|0;a[e]=0;f=zB(b)|0;g=tm(b)|0;return}function Wz(a,b){a=a|0;b=b|0;var d=0,e=0;d=jk(392)|0;e=d;if((d|0)==0){return e|0}c[d>>2]=172736;c[d+16>>2]=24;c[d+32>>2]=a;c[d+36>>2]=b;return e|0}function Xz(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,u=0;d=i;i=i+104|0;e=d|0;f=c[b+76>>2]|0;g=c[b>>2]|0;do{if((f|0)==0){h=4}else{j=c[f>>2]|0;if((j|0)==0){h=4;break}Cc[j&255](b)}}while(0);do{if((h|0)==4){if((c[b+40>>2]|0)!=0){break}f=b+36|0;if((c[f>>2]|0)!=0){break}if((a[g+13|0]|0)==0){k=c[b+32>>2]|0}else{j=e|0;l=c[b+24>>2]|0;if((l|0)==0){a[j]=0}else{nb(j|0,154200,(m=i,i=i+8|0,c[m>>2]=l+1,m)|0)|0;i=m}l=c[b+20>>2]|0;n=(l|0)!=0?l:151040;l=xF(n|0)|0;o=xF(j|0)|0;q=b+52|0;r=l+1+o+(xF(c[q>>2]|0)|0)|0;if((c[53236]|0)>>>0<(r+1|0)>>>0){o=r+11|0;c[53236]=o;r=gF(c[53238]|0,o)|0;c[53238]=r;s=r}else{s=c[53238]|0}zF(s|0,n|0)|0;AF(c[53238]|0,j|0)|0;j=c[53238]|0;n=j+(xF(j|0)|0)|0;z=46;a[n]=z;z=z>>8;a[n+1|0]=z;n=Lb(c[q>>2]|0)|0;q=ob(n|0,58)|0;j=c[53238]|0;if((q|0)==0){t=j}else{r=q;q=j;while(1){AF(q|0,r+1|0)|0;j=c[53238]|0;o=j+(xF(j|0)|0)|0;z=46;a[o]=z;z=z>>8;a[o+1|0]=z;a[r]=0;o=ob(n|0,58)|0;j=c[53238]|0;if((o|0)==0){t=j;break}else{r=o;q=j}}}AF(t|0,n|0)|0;eF(n);q=c[53238]|0;c[b+32>>2]=q;k=q}if((k|0)==0){c[f>>2]=c[p>>2];break}q=Eb(k|0,119272)|0;c[f>>2]=q;if((q|0)!=0){break}q=c[(c[b+12>>2]|0)+16>>2]|0;r=c[b+32>>2]|0;j=Wb(c[(Vb()|0)>>2]|0)|0;Dc[q&63](156928,(m=i,i=i+16|0,c[m>>2]=r,c[m+8>>2]=j,m)|0);i=m;u=1;i=d;return u|0}}while(0);if((c[b+152>>2]&1024|0)==0){u=0;i=d;return u|0}c[43600]=0;c[43601]=0;c[43602]=0;c[43592]=0;c[43595]=0;c[43593]=0;c[45196]=zg(0,0,0)|0;if((Ag(174368,-1,8,-15,9,0,127008,56)|0)==0){Yz(b,8,10)|0;u=0;i=d;return u|0}else{Dc[c[(c[b+12>>2]|0)+16>>2]&63](114832,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;u=1;i=d;return u|0}return 0}function Yz(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;g=c[(c[b>>2]|0)+104>>2]|0;if((g|0)!=0){h=Hc[g&63](b,d,e)|0;i=f;return h|0}g=b+40|0;j=c[g>>2]|0;if((j|0)==0){h=Ma(d|0,1,e|0,c[b+36>>2]|0)|0;i=f;return h|0}k=b+44|0;l=b+48|0;m=c[l>>2]|0;do{if(((c[k>>2]|0)-1-m|0)>>>0<e>>>0){n=e+4096+m&-4096;c[k>>2]=n;o=gF(j,n)|0;c[g>>2]=o;if((o|0)==0){Dc[c[(c[b+12>>2]|0)+16>>2]&63](107728,(n=i,i=i+1|0,i=i+7&-8,c[n>>2]=0,n)|0);i=n;mb(1);return 0}else{p=o;q=c[l>>2]|0;break}}else{p=j;q=m}}while(0);tF(p+q|0,d|0,e)|0;d=(c[l>>2]|0)+e|0;c[l>>2]=d;a[(c[g>>2]|0)+d|0]=0;h=e;i=f;return h|0}function Zz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;if((d|0)==0|(b|0)==0){f=0;i=e;return f|0}if((c[a+152>>2]&1024|0)==0){if((Yz(a,b,d)|0)==(d|0)){f=d;i=e;return f|0}else{Dc[c[(c[a+12>>2]|0)+16>>2]&63](96176,(g=i,i=i+8|0,c[g>>2]=d,g)|0);i=g;mb(1);return 0}}h=c[45188]|0;j=h+(d<<1)-(c[43596]|0)|0;do{if(h>>>0<j>>>0){k=j+4096&-4096;c[45188]=k;l=gF(c[45190]|0,k)|0;c[45190]=l;if((l|0)!=0){break}Dc[c[(c[a+12>>2]|0)+16>>2]&63](107728,(g=i,i=i+1|0,i=i+7&-8,c[g>>2]=0,g)|0);i=g;mb(1);return 0}}while(0);c[45196]=zg(c[45196]|0,b,d)|0;c[43592]=b;c[43593]=d;while(1){c[43595]=c[45190];c[43596]=c[45188];m=Eg(174368,0)|0;if((m|0)!=0){n=9;break}b=c[43595]|0;j=c[45190]|0;h=b-j|0;if((b|0)!=(j|0)){o=Yz(a,j,h)|0;if((o|0)!=(h|0)){n=12;break}}if((c[43593]|0)==0){f=d;n=15;break}}if((n|0)==9){Dc[c[(c[a+12>>2]|0)+16>>2]&63](102016,(g=i,i=i+8|0,c[g>>2]=m,g)|0);i=g;mb(1);return 0}else if((n|0)==12){Dc[c[(c[a+12>>2]|0)+16>>2]&63](96176,(g=i,i=i+8|0,c[g>>2]=o,g)|0);i=g;mb(1);return 0}else if((n|0)==15){i=e;return f|0}return 0}function _z(a,b){a=a|0;b=b|0;var c=0,d=0;c=xF(b|0)|0;d=(Zz(a,b,c)|0)==(c|0);return(d?1:-1)|0}function $z(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;d=i;i=i+8|0;e=d|0;a[e]=c;f=(Zz(b,e,1)|0)==1;i=d;return(f?c:-1)|0}function aA(b){b=b|0;var d=0,e=0;d=c[b+36>>2]|0;do{if((d|0)==0){e=0}else{if((a[b+144|0]|0)!=0){e=0;break}if((c[(c[b>>2]|0)+104>>2]|0)!=0){e=0;break}e=Ia(d|0)|0}}while(0);return e|0}function bA(b){b=b|0;var d=0,e=0;d=c[b+76>>2]|0;do{if((d|0)!=0){e=c[d+4>>2]|0;if((e|0)==0){break}Cc[e&255](b)}}while(0);d=c[b+36>>2]|0;if((d|0)==0){return}if((a[b+144|0]|0)!=0){return}if((c[(c[b>>2]|0)+104>>2]|0)!=0){return}Ia(d|0)|0;return}function cA(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0;d=i;i=i+8|0;e=d|0;f=e;g=c[b+76>>2]|0;do{if((c[b+152>>2]&1024|0)!=0){c[e>>2]=0;c[e+4>>2]=0;h=e;c[43592]=h;c[43593]=0;j=0;while(1){c[43595]=c[45190];c[43596]=c[45188];k=Eg(174368,4)|0;if((k|0)==1){l=7;break}else if((k|0)!=0){m=j;n=k;l=6;break}k=j+1|0;if((j|0)>=101){m=k;n=0;l=6;break}o=c[45190]|0;Yz(b,o,(c[43595]|0)-o|0)|0;j=k}if((l|0)==6){Dc[c[(c[b+12>>2]|0)+16>>2]&63](80992,(q=i,i=i+16|0,c[q>>2]=n,c[q+8>>2]=m,q)|0);i=q;mb(1)}else if((l|0)==7){j=c[45190]|0;Yz(b,j,(c[43595]|0)-j|0)|0;j=Bg(174368)|0;if((j|0)==0){k=c[45196]|0;a[h]=k;a[f+1|0]=k>>>8;a[f+2|0]=k>>>16;a[f+3|0]=k>>>24;k=c[43594]|0;a[f+4|0]=k;a[f+5|0]=k>>>8;a[f+6|0]=k>>>16;a[f+7|0]=k>>>24;Yz(b,h,8)|0;break}else{Dc[c[(c[b+12>>2]|0)+16>>2]&63](167120,(q=i,i=i+8|0,c[q>>2]=j,q)|0);i=q;mb(1)}}}}while(0);do{if((g|0)!=0){q=c[g+8>>2]|0;if((q|0)==0){break}Cc[q&255](b);i=d;return}}while(0);g=b+36|0;q=c[g>>2]|0;do{if((q|0)!=0){if((a[b+144|0]|0)!=0){break}if((c[(c[b>>2]|0)+104>>2]|0)!=0){break}Ia(q|0)|0}}while(0);q=b+32|0;if((c[q>>2]|0)==0){i=d;return}f=c[g>>2]|0;if((f|0)==(c[p>>2]|0)){i=d;return}if((a[b+144|0]|0)!=0){i=d;return}if((f|0)!=0){Ha(f|0)|0;c[g>>2]=0}c[q>>2]=0;i=d;return}function dA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+1040|0;f=e+1024|0;g=e|0;h=f;c[h>>2]=d;c[h+4>>2]=0;Zz(a,g,_b(g|0,b|0,f|0)|0)|0;i=e;return}function eA(b,c){b=b|0;c=+c;var d=0,e=0,f=0,g=0.0,h=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(c<-1.0e15){d=19856;e=19;f=Zz(b,d,e)|0;return}if(c>1.0e15){d=19857;e=18;f=Zz(b,d,e)|0;return}g=c*100.0;if(g<0.0){h=g+-.5}else{h=g+.5}i=~~h;if((i|0)==0){d=159152;e=1;f=Zz(b,d,e)|0;return}j=(i|0)<0;k=178892;l=j?-i|0:i;i=0;m=2;while(1){n=(l|0)%10|0;o=(l|0)/10|0;if((n|0)==0&i<<24>>24==0){p=0;q=k}else{r=k-1|0;a[r]=n|48;p=1;q=r}do{if((m|0)==1){if(p<<24>>24==0){s=1;t=q;break}r=q-1|0;a[r]=46;s=1;t=r}else{s=p;t=q}}while(0);r=m-1|0;if((l+9|0)>>>0>18>>>0|(r|0)>0){k=t;l=o;i=s;m=r}else{break}}if(j){j=t-1|0;a[j]=45;u=j}else{u=t}d=u;e=178892-u|0;f=Zz(b,d,e)|0;return}function fA(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0,k=0,l=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0;e=i;f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];g=+h[d>>3];do{if(g<-1.0e15){j=19856;k=19}else{if(g>1.0e15){j=19857;k=18;break}l=g*100.0;if(l<0.0){m=l+-.5}else{m=l+.5}f=~~m;if((f|0)==0){j=159152;k=1;break}n=(f|0)<0;o=178892;p=n?-f|0:f;f=0;q=2;while(1){r=(p|0)%10|0;s=(p|0)/10|0;if((r|0)==0&f<<24>>24==0){t=0;u=o}else{v=o-1|0;a[v]=r|48;t=1;u=v}do{if((q|0)==1){if(t<<24>>24==0){w=1;x=u;break}v=u-1|0;a[v]=46;w=1;x=v}else{w=t;x=u}}while(0);v=q-1|0;if((p+9|0)>>>0>18>>>0|(v|0)>0){o=x;p=s;f=w;q=v}else{break}}if(n){q=x-1|0;a[q]=45;y=q}else{y=x}j=y;k=178892-y|0}}while(0);Zz(b,j,k)|0;Zz(b,163208,1)|0;m=+h[d+8>>3];if(m<-1.0e15){z=19856;A=19;B=Zz(b,z,A)|0;i=e;return}if(m>1.0e15){z=19857;A=18;B=Zz(b,z,A)|0;i=e;return}g=m*100.0;if(g<0.0){C=g+-.5}else{C=g+.5}d=~~C;if((d|0)==0){z=159152;A=1;B=Zz(b,z,A)|0;i=e;return}k=(d|0)<0;j=178892;y=k?-d|0:d;d=0;x=2;while(1){w=(y|0)%10|0;u=(y|0)/10|0;if((w|0)==0&d<<24>>24==0){D=0;E=j}else{t=j-1|0;a[t]=w|48;D=1;E=t}do{if((x|0)==1){if(D<<24>>24==0){F=1;G=E;break}t=E-1|0;a[t]=46;F=1;G=t}else{F=D;G=E}}while(0);n=x-1|0;if((y+9|0)>>>0>18>>>0|(n|0)>0){j=G;y=u;d=F;x=n}else{break}}if(k){k=G-1|0;a[k]=45;H=k}else{H=G}z=H;A=178892-H|0;B=Zz(b,z,A)|0;i=e;return}function gA(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;fA(a,b);if((c|0)>1){d=1}else{return}do{Zz(a,163208,1)|0;fA(a,b+(d<<4)|0);d=d+1|0;}while((d|0)<(c|0));return}function hA(a){a=a|0;return 1}function iA(b){b=b|0;var c=0;a[b+536|0]=0;c=b+336|0;h[c>>3]=10.0/+h[b+352>>3]+ +h[c>>3];a[b+537|0]=1;return 0}function jA(b){b=b|0;var c=0;a[b+536|0]=0;c=b+336|0;h[c>>3]=+h[c>>3]-10.0/+h[b+352>>3];a[b+537|0]=1;return 0}function kA(b){b=b|0;var c=0;a[b+536|0]=0;c=b+344|0;h[c>>3]=+h[c>>3]-10.0/+h[b+352>>3];a[b+537|0]=1;return 0}function lA(b){b=b|0;var c=0;a[b+536|0]=0;c=b+344|0;h[c>>3]=10.0/+h[b+352>>3]+ +h[c>>3];a[b+537|0]=1;return 0}function mA(b){b=b|0;var c=0;a[b+536|0]=0;c=b+352|0;h[c>>3]=+h[c>>3]*1.1;a[b+537|0]=1;return 0}function nA(b){b=b|0;var c=0;a[b+536|0]=0;c=b+352|0;h[c>>3]=+h[c>>3]/1.1;a[b+537|0]=1;return 0}function oA(b){b=b|0;var d=0,e=0,f=0.0,g=0.0;d=b+536|0;e=(a[d]|0)==0;a[d]=e&1;if(!e){return 0}e=c[b+448>>2]|0;d=c[b+452>>2]|0;f=+(e>>>0>>>0)/+(e|0);g=+(d>>>0>>>0)/+(d|0);h[b+352>>3]=f<g?f:g;vF(b+336|0,0,16)|0;a[b+537|0]=1;return 0}function pA(b){b=b|0;var d=0,e=0,f=0;d=c[(c[b>>2]|0)+168>>2]|0;e=b+580|0;if((c[e>>2]|0)!=0){Rh(b,d);f=b+540|0;a[f]=1;return}c[e>>2]=d;e=(c[d+8>>2]|0)+112|0;a[e]=a[e]|2;AA(b,d);Rh(b,d);f=b+540|0;a[f]=1;return}function qA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;f=i;g=e;e=i;i=i+16|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];switch(d|0){case 2:{a[b+538|0]=1;a[b+541|0]=2;a[b+537|0]=1;j=b+560|0;k=j;l=e;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];i=f;return};case 3:{yA(b,+h[e>>3],+h[e+8>>3]);a[b+538|0]=1;a[b+541|0]=3;a[b+537|0]=1;j=b+560|0;k=j;l=e;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];i=f;return};case 4:{a[b+536|0]=0;if((c[b+360>>2]|0)==0){m=+h[b+352>>3];d=b+336|0;h[d>>3]=(+h[e>>3]- +((c[b+448>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(m*+h[b+520>>3])+ +h[d>>3];d=b+344|0;h[d>>3]=(+h[e+8>>3]- +((c[b+452>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(m*+h[b+528>>3])+ +h[d>>3];n=m}else{m=+h[b+352>>3];d=b+336|0;h[d>>3]=+h[d>>3]-(+h[e+8>>3]- +((c[b+452>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(m*+h[b+528>>3]);d=b+344|0;h[d>>3]=(+h[e>>3]- +((c[b+448>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(m*+h[b+520>>3])+ +h[d>>3];n=m}h[b+352>>3]=n*1.1;a[b+537|0]=1;j=b+560|0;k=j;l=e;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];i=f;return};case 5:{a[b+536|0]=0;d=b+352|0;n=+h[d>>3]/1.1;h[d>>3]=n;if((c[b+360>>2]|0)==0){d=b+336|0;h[d>>3]=+h[d>>3]-(+h[e>>3]- +((c[b+448>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(n*+h[b+520>>3]);d=b+344|0;h[d>>3]=+h[d>>3]-(+h[e+8>>3]- +((c[b+452>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(n*+h[b+528>>3])}else{d=b+336|0;h[d>>3]=(+h[e+8>>3]- +((c[b+452>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(n*+h[b+528>>3])+ +h[d>>3];d=b+344|0;h[d>>3]=+h[d>>3]-(+h[e>>3]- +((c[b+448>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(n*+h[b+520>>3])}a[b+537|0]=1;j=b+560|0;k=j;l=e;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];i=f;return};case 1:{yA(b,+h[e>>3],+h[e+8>>3]);d=b+580|0;g=c[d>>2]|0;do{if((g|0)!=0){o=Sx(g)|0;if((o|0)==0){p=g+8|0;q=(c[p>>2]|0)+112|0;a[q]=a[q]|4;q=(c[p>>2]|0)+112|0;a[q]=a[q]&-3;break}else if((o|0)==2){q=g+8|0;p=(c[q>>2]|0)+115|0;a[p]=a[p]|4;p=(c[q>>2]|0)+115|0;a[p]=a[p]&-3;break}else if((o|0)==1){o=g+8|0;p=(c[o>>2]|0)+117|0;a[p]=a[p]|4;p=(c[o>>2]|0)+117|0;a[p]=a[p]&-3;break}else{break}}}while(0);g=b+588|0;p=c[g>>2]|0;if((p|0)!=0){eF(p);c[g>>2]=0}p=c[b+576>>2]|0;c[d>>2]=p;do{if((p|0)!=0){d=Sx(p)|0;if((d|0)==1){o=(c[p+8>>2]|0)+117|0;a[o]=a[o]|2;o=b+592|0;FA(o,0,118592);FA(o,1,$w(p)|0);c[b+596>>2]=2;o=b+604|0;q=Ix(Hx(p)|0)|0;r=Xv(q,1,0)|0;if((r|0)==0){s=2}else{t=2;u=r;while(1){FA(o,t,c[u+8>>2]|0);r=t+2|0;FA(o,t|1,fw(p,u)|0);v=Xv(q,1,u)|0;if((v|0)==0){s=r;break}else{t=r;u=v}}}c[b+608>>2]=s;u=Wv(Hx(p)|0,1,123512,0)|0;if((u|0)==0){t=Wv(Hx(p)|0,1,125272,0)|0;if((t|0)==0){break}else{w=t}}else{w=u}c[g>>2]=fk(fw(p,w)|0,p)|0;break}else if((d|0)==2){u=p;t=(c[p+8>>2]|0)+115|0;a[t]=a[t]|2;t=b+592|0;FA(t,0,119112);q=p;o=p+32|0;FA(t,1,$w(c[((c[q>>2]&3|0)==3?u:o)+28>>2]|0)|0);v=(Nw(Hx(c[((c[q>>2]&3|0)==3?u:o)+28>>2]|0)|0)|0)!=0;FA(t,3,v?131448:129144);v=p-32|0;FA(t,4,$w(c[((c[q>>2]&3|0)==2?u:v)+28>>2]|0)|0);c[b+596>>2]=7;o=b+604|0;r=Ix(Hx(c[((c[q>>2]&3|0)==2?u:v)+28>>2]|0)|0)|0;x=Xv(r,2,0)|0;a:do{if((x|0)==0){y=7}else{z=7;A=x;while(1){B=A;while(1){C=B+8|0;D=c[C>>2]|0;if((Ya(D|0,120056)|0)==0){E=20;break}if((Ya(D|0,120832)|0)==0){E=22;break}if((Ya(D|0,121680)|0)!=0){break}FA(t,6,fw(p,B)|0);D=Xv(r,2,B)|0;if((D|0)==0){y=z;break a}else{B=D}}if((E|0)==20){E=0;FA(t,2,fw(p,B)|0)}else if((E|0)==22){E=0;FA(t,5,fw(p,B)|0)}FA(o,z,c[C>>2]|0);D=z+2|0;FA(o,z+1|0,fw(p,B)|0);F=Xv(r,2,B)|0;if((F|0)==0){y=D;break}else{z=D;A=F}}}}while(0);c[b+608>>2]=y;r=Wv(Hx(c[((c[q>>2]&3|0)==2?u:v)+28>>2]|0)|0,2,123512,0)|0;if((r|0)==0){o=Wv(Hx(c[((c[q>>2]&3|0)==2?u:v)+28>>2]|0)|0,2,125272,0)|0;if((o|0)==0){break}else{G=o}}else{G=r}c[g>>2]=fk(fw(p,G)|0,p)|0;break}else if((d|0)==0){r=(c[p+8>>2]|0)+112|0;a[r]=a[r]|2;AA(b,p);break}else{break}}}while(0);a[b+538|0]=1;a[b+541|0]=1;a[b+537|0]=1;j=b+560|0;k=j;l=e;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];i=f;return};default:{j=b+560|0;k=j;l=e;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];i=f;return}}}function rA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;d=i;f=e;e=i;i=i+16|0;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];a[b+538|0]=0;a[b+541|0]=0;i=d;return}function sA(b,e){b=b|0;e=e|0;var f=0,g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0;f=i;g=e;e=i;i=i+16|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];j=+h[e>>3];g=b+560|0;k=(j- +h[g>>3])/+h[b+520>>3];l=+h[e+8>>3];m=(l- +h[b+568>>3])/+h[b+528>>3];n=~~k;do{if((((n|0)>-1?n:-n|0)|0)<1){o=~~m;if((((o|0)>-1?o:-o|0)|0)>=1){break}i=f;return}}while(0);n=d[b+541|0]|0;if((n|0)==0){yA(b,j,l)}else if((n|0)==2){l=+h[b+352>>3];if((c[b+360>>2]|0)==0){n=b+336|0;h[n>>3]=+h[n>>3]-k/l;n=b+344|0;h[n>>3]=+h[n>>3]-m/l}else{n=b+336|0;h[n>>3]=+h[n>>3]-m/l;n=b+344|0;h[n>>3]=k/l+ +h[n>>3]}a[b+537|0]=1}b=g;g=e;c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[b+12>>2]=c[g+12>>2];i=f;return}function tA(a,b,c){a=a|0;b=b|0;c=c|0;return}function uA(a){a=a|0;return}function vA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=c[b>>2]|0;do{if((d|0)==0){g=Hw(150416,173944,0)|0;c[b+32>>2]=148120;h=g}else{g=Eb(d|0,144944)|0;if((g|0)==0){return}else{i=Dw(g,0)|0;Ha(g|0)|0;h=i;break}}}while(0);if((h|0)==0){return}d=f+168|0;i=c[d>>2]|0;if((i|0)!=0){g=c[f+172>>2]|0;do{if((g|0)==0){j=i}else{k=c[g+4>>2]|0;if((k|0)==0){j=i;break}Cc[k&255](i);j=c[d>>2]|0}}while(0);Sj(j);Kw(c[d>>2]|0)|0}Zx(h,0,142024,272,1);Zx(h,1,138264,304,1);Zx(h,2,136288,176,1);c[d>>2]=h;c[(c[h+8>>2]|0)+136>>2]=f;if((Pz(f,h,e)|0)==-1){return}c[b+580>>2]=0;c[b+576>>2]=0;a[b+537|0]=1;return}function wA(a,b){a=a|0;b=b|0;var d=0;d=c[a>>2]|0;Pz(d,c[d+168>>2]|0,b)|0;return}function xA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a>>2]|0;Qz(e,c[e+168>>2]|0,b,d)|0;return}function yA(b,d,e){b=b|0;d=+d;e=+e;var f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+32|0;g=f|0;j=+h[b+352>>3];if((c[b+360>>2]|0)==0){k=d/(j*+h[b+520>>3])- +h[b+504>>3];l=e/(j*+h[b+528>>3])- +h[b+512>>3]}else{k=e/(j*+h[b+528>>3])- +h[b+504>>3];l=(-0.0-d)/(j*+h[b+520>>3])- +h[b+512>>3]}d=1.0/j;m=c[(c[b>>2]|0)+168>>2]|0;h[g>>3]=k-d;h[g+8>>3]=l-d;h[g+16>>3]=k+d;h[g+24>>3]=l+d;n=ux(m)|0;a:do{if((n|0)==0){o=10}else{p=n;b:while(1){q=mw(m,p)|0;if((q|0)!=0){r=q;while(1){if((on(r,g)|0)<<24>>24!=0){break b}q=ow(m,r)|0;if((q|0)==0){break}else{r=q}}}q=vx(m,p)|0;if((q|0)==0){o=10;break a}else{p=q}}s=r|0}}while(0);c:do{if((o|0)==10){r=wx(m)|0;d:do{if((r|0)!=0){n=r;while(1){if((mn(n,g)|0)<<24>>24!=0){break}p=xx(m,n)|0;if((p|0)==0){break d}else{n=p}}s=n|0;break c}}while(0);r=zA(m,g)|0;if((r|0)==0){s=m|0;break}else{s=r|0;break}}}while(0);m=b+576|0;g=c[m>>2]|0;if((s|0)==(g|0)){i=f;return}do{if((g|0)!=0){o=Sx(g)|0;if((o|0)==0){r=(c[g+8>>2]|0)+112|0;a[r]=a[r]&-2;break}else if((o|0)==1){r=(c[g+8>>2]|0)+117|0;a[r]=a[r]&-2;break}else if((o|0)==2){o=(c[g+8>>2]|0)+115|0;a[o]=a[o]&-2;break}else{break}}}while(0);g=b+584|0;c[g>>2]=0;c[m>>2]=s;do{if((s|0)!=0){m=Sx(s)|0;if((m|0)==0){o=(c[s+8>>2]|0)+112|0;a[o]=a[o]|1;o=Wv(s,0,133568,0)|0;if((o|0)==0){break}c[g>>2]=fk(fw(s,o)|0,s)|0;break}else if((m|0)==2){o=(c[s+8>>2]|0)+115|0;a[o]=a[o]|1;o=Wv(Hx(c[((c[s>>2]&3|0)==2?s:s-32|0)+28>>2]|0)|0,2,133568,0)|0;if((o|0)==0){break}c[g>>2]=fk(fw(s,o)|0,s)|0;break}else if((m|0)==1){m=(c[s+8>>2]|0)+117|0;a[m]=a[m]|1;m=Wv(Hx(s)|0,1,133568,0)|0;if((m|0)==0){break}c[g>>2]=fk(fw(s,m)|0,s)|0;break}else{break}}}while(0);a[b+537|0]=1;i=f;return}function zA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0;d=i;e=b;b=i;i=i+32|0;tF(b,e,32)|0;e=c[a+8>>2]|0;f=c[e+172>>2]|0;a:do{if((f|0)>=1){g=c[e+176>>2]|0;j=1;while(1){k=zA(c[g+(j<<2)>>2]|0,b)|0;if((k|0)!=0){l=k;break}if((j|0)<(f|0)){j=j+1|0}else{break a}}i=d;return l|0}}while(0);m=+h[e+24>>3];n=+h[e+40>>3];do{if(+h[b+16>>3]>=+h[e+16>>3]){if(+h[e+32>>3]<+h[b>>3]){break}if(+h[b+24>>3]<m){break}if(n<+h[b+8>>3]){break}else{l=a}i=d;return l|0}}while(0);l=0;i=d;return l|0}function AA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a+592|0;e=b|0;do{if((Ix(e)|0)==(b|0)){if((Nw(b)|0)==0){FA(d,0,116736);break}else{FA(d,0,115792);break}}else{FA(d,0,117648)}}while(0);FA(d,1,$w(e)|0);c[a+596>>2]=2;d=a+604|0;f=Xv(b,0,0)|0;if((f|0)==0){g=2}else{h=2;i=f;while(1){FA(d,h,c[i+8>>2]|0);FA(d,h+1|0,fw(e,i)|0);f=h+3|0;FA(d,h+2|0,0);j=Xv(b,0,i)|0;if((j|0)==0){g=f;break}else{h=f;i=j}}}c[a+608>>2]=g;g=Wv(b,0,123512,0)|0;do{if((g|0)==0){i=Wv(b,0,125272,0)|0;if((i|0)!=0){k=i;break}return}else{k=g}}while(0);c[a+588>>2]=fk(fw(e,k)|0,e)|0;return}function BA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=a+160|0;e=c[d>>2]|0;do{if((e|0)==0){f=jk(632)|0;c[d>>2]=f;c[a+164>>2]=f;c[44216]=f;g=f}else{f=c[44216]|0;if((f|0)==0){c[44216]=e;g=e;break}h=c[f+4>>2]|0;if((h|0)==0){f=jk(632)|0;c[(c[44216]|0)+4>>2]=f;i=c[(c[44216]|0)+4>>2]|0}else{i=h}c[44216]=i;g=i}}while(0);c[g+32>>2]=b;c[c[44216]>>2]=a;return}function CA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=a+160|0;e=c[d>>2]|0;do{if((e|0)==0){f=jk(632)|0;c[d>>2]=f;c[a+164>>2]=f;c[44214]=f;g=f}else{f=c[44214]|0;if((f|0)==0){c[44214]=e;g=e;break}h=c[f+4>>2]|0;if((h|0)==0){f=jk(632)|0;c[(c[44214]|0)+4>>2]=f;i=c[(c[44214]|0)+4>>2]|0}else{i=h}c[44214]=i;g=i}}while(0);c[g+52>>2]=b;c[c[44214]>>2]=a;return(MA(a,3,b)|0)!=0|0}function DA(a){a=a|0;var b=0;b=c[a+160>>2]|0;c[a+164>>2]=b;return b|0}function EA(a){a=a|0;var b=0,d=0,e=0;b=a+164|0;a=c[b>>2]|0;d=c[a+4>>2]|0;do{if((d|0)!=0){e=d+52|0;if((c[e>>2]|0)!=0){break}c[e>>2]=c[a+52>>2]}}while(0);c[b>>2]=d;return d|0}function FA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=a+8|0;if((c[e>>2]|0)>(b|0)){f=c[a>>2]|0;g=f+(b<<2)|0;c[g>>2]=d;return}else{h=b+10|0;c[e>>2]=h;e=a|0;a=mk(c[e>>2]|0,h<<2)|0;c[e>>2]=a;f=a;g=f+(b<<2)|0;c[g>>2]=d;return}}function GA(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+160|0;d=c[b>>2]|0;if((d|0)!=0){e=d;while(1){d=c[e+4>>2]|0;f=e+604|0;g=c[f>>2]|0;if((g|0)!=0){eF(g)}c[f>>2]=0;c[e+612>>2]=0;c[e+608>>2]=0;f=e+592|0;g=c[f>>2]|0;if((g|0)!=0){eF(g)}c[f>>2]=0;c[e+600>>2]=0;c[e+596>>2]=0;f=c[e+584>>2]|0;if((f|0)!=0){eF(f)}f=c[e+588>>2]|0;if((f|0)!=0){eF(f)}eF(e);if((d|0)==0){break}else{e=d}}}c[44214]=0;c[44216]=0;c[a+192>>2]=0;c[a+164>>2]=0;c[b>>2]=0;c[a+28>>2]=0;return}function HA(a,b){a=a|0;b=b|0;var d=0,e=0;d=MA(a,1,b)|0;if((d|0)==0){e=999;return e|0}b=c[d+16>>2]|0;c[a+184>>2]=c[b+4>>2];c[a+172>>2]=c[b+12>>2];c[a+176>>2]=c[b>>2];c[a+180>>2]=c[b+16>>2];e=300;return e|0}function IA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=b|0;Wx(e,95216,272,1)|0;f=b+8|0;g=a;c[(c[f>>2]|0)+136>>2]=g;if((Ix(e)|0)!=(b|0)){c[(c[(Ix(e)|0)+8>>2]|0)+136>>2]=g}g=ew(e,144120)|0;h=a+172|0;do{if((g|0)==0){j=c[h>>2]|0}else{c[h>>2]=0;k=MA(a,1,g)|0;if((k|0)!=0){l=c[k+16>>2]|0;c[a+184>>2]=c[l+4>>2];k=c[l+12>>2]|0;c[h>>2]=k;c[a+176>>2]=c[l>>2];c[a+180>>2]=c[l+16>>2];j=k;break}k=NA(a,1,g)|0;Fv(1,120552,(l=i,i=i+16|0,c[l>>2]=g,c[l+8>>2]=k,l)|0)|0;i=l;m=-1;i=d;return m|0}}while(0);if((j|0)==0){m=-1;i=d;return m|0}Zh(1);Pj(b,c[c[a+180>>2]>>2]&1);a=c[(c[f>>2]|0)+8>>2]|0;c[(c[(Ix(e)|0)+8>>2]|0)+8>>2]=a;a=c[j>>2]|0;do{if((a|0)!=0){Cc[a&255](b);e=c[j+4>>2]|0;if((e|0)==0){break}c[(c[f>>2]|0)+140>>2]=e}}while(0);Zh(0);m=0;i=d;return m|0}function JA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if((Wx(b|0,95216,0,1)|0)==0){return 0}a=b+8|0;d=c[a>>2]|0;e=c[d+140>>2]|0;if((e|0)==0){f=d}else{Cc[e&255](b);c[(c[a>>2]|0)+140>>2]=0;f=c[a>>2]|0}if((c[f+8>>2]|0)==0){return 0}Sj(b);return 0}function KA(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0;h=i;i=i+128|0;j=e;e=i;i=i+32|0;tF(e,j,32)|0;j=h|0;k=j|0;zF(k|0,c[d+28>>2]|0)|0;l=j+(xF(k|0)|0)|0;z=58;a[l]=z;z=z>>8;a[l+1|0]=z;AF(k|0,g|0)|0;g=MA(c[b>>2]|0,4,k)|0;if((g|0)==0){Fv(0,142448,(l=i,i=i+8|0,c[l>>2]=k,l)|0)|0;i=l;m=c[b+92>>2]|0}else{l=c[g+16>>2]|0;g=c[l+12>>2]|0;c[b+92>>2]=g;c[b+96>>2]=c[l>>2];m=g}if((m|0)==0){i=h;return}g=c[m>>2]|0;if((g|0)==0){i=h;return}Vc[g&63](b,d,e,f);i=h;return}function LA(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+128|0;k=j+64|0;l=j|0;DF(l|0,e|0,63)|0;m=gb(l|0,58)|0;if((m|0)!=0){a[m]=0}m=b+60+(d<<2)|0;d=c[m>>2]|0;a:do{if((d|0)==0){n=m}else{b=k|0;o=m;p=d;while(1){DF(b|0,c[p+4>>2]|0,63)|0;q=gb(b|0,58)|0;if((q|0)!=0){a[q]=0}q=(Ya(l|0,b|0)|0)<1;r=c[o>>2]|0;if(q){break}q=r|0;s=c[q>>2]|0;if((s|0)==0){n=q;break a}else{o=q;p=s}}if((r|0)==0){n=o;break}p=k|0;b=o;s=r;while(1){DF(p|0,c[s+4>>2]|0,63)|0;q=gb(p|0,58)|0;if((q|0)!=0){a[q]=0}if((Ya(l|0,p|0)|0)!=0){n=b;break a}q=c[b>>2]|0;t=q|0;if((c[q+8>>2]|0)<=(f|0)){n=b;break a}q=c[t>>2]|0;if((q|0)==0){n=t;break}else{b=t;s=q}}}}while(0);l=kk(20)|0;c[l>>2]=c[n>>2];c[n>>2]=l;c[l+4>>2]=e;c[l+8>>2]=f;c[l+12>>2]=g;c[l+16>>2]=h;i=j;return 1}function MA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;f=i;i=i+128|0;g=f+64|0;h=(d-3|0)>>>0<2>>>0?0:d;j=f|0;DF(j|0,e|0,63)|0;e=gb(j|0,58)|0;do{if((e|0)==0){k=0;l=0}else{m=e+1|0;a[e]=0;n=gb(m|0,58)|0;if((n|0)==0){k=0;l=m;break}a[n]=0;k=n+1|0;l=m}}while(0);e=b+60+(d<<2)|0;m=c[e>>2]|0;if((m|0)==0){p=0;q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}n=g|0;g=(k|0)==0;r=(h|0)==(d|0);a:do{if((l|0)==0){s=e;t=m;while(1){DF(n|0,c[t+4>>2]|0,63)|0;u=gb(n|0,58)|0;if((u|0)==0){v=0}else{a[u]=0;v=u+1|0}do{if((Ya(n|0,j|0)|0)==0){u=(v|0)==0;if(!g){if((Ya(k|0,c[(c[(c[s>>2]|0)+12>>2]|0)+8>>2]|0)|0)!=0){break}}if(u|r){w=s;break a}if((MA(b,h,v)|0)!=0){w=s;break a}}}while(0);u=c[s>>2]|0;x=c[u>>2]|0;if((x|0)==0){p=0;break}else{s=u;t=x}}q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}else{if(g){t=e;s=m;while(1){DF(n|0,c[s+4>>2]|0,63)|0;x=gb(n|0,58)|0;if((x|0)==0){y=0}else{a[x]=0;y=x+1|0}do{if((Ya(n|0,j|0)|0)==0){x=(y|0)==0;if(x){w=t;break a}if((Ya(y|0,l|0)|0)!=0){break}if(x|r){w=t;break a}if((MA(b,h,y)|0)!=0){w=t;break a}}}while(0);x=c[t>>2]|0;u=c[x>>2]|0;if((u|0)==0){p=0;break}else{t=x;s=u}}q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}else{z=e;A=m}while(1){DF(n|0,c[A+4>>2]|0,63)|0;s=gb(n|0,58)|0;if((s|0)==0){B=0}else{a[s]=0;B=s+1|0}do{if((Ya(n|0,j|0)|0)==0){s=(B|0)==0;if(!s){if((Ya(B|0,l|0)|0)!=0){break}}if((Ya(k|0,c[(c[(c[z>>2]|0)+12>>2]|0)+8>>2]|0)|0)!=0){break}if(s|r){w=z;break a}if((MA(b,h,B)|0)!=0){w=z;break a}}}while(0);s=c[z>>2]|0;t=c[s>>2]|0;if((t|0)==0){p=0;break}else{z=s;A=t}}q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}}while(0);A=c[w>>2]|0;if((A|0)==0){p=0;q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}w=A+16|0;z=c[w>>2]|0;if((z|0)==0){Fv(1,91016,(C=i,i=i+1|0,i=i+7&-8,c[C>>2]=0,C)|0)|0;i=C;D=c[w>>2]|0}else{D=z}z=(D|0)==0?0:A;if((z|0)==0){p=0;q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}if((c[b+8>>2]|0)<=0){p=z;q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}A=c[z+4>>2]|0;D=c[(c[z+12>>2]|0)+8>>2]|0;gc(c[o>>2]|0,112008,(C=i,i=i+24|0,c[C>>2]=c[74600+(d<<2)>>2],c[C+8>>2]=A,c[C+16>>2]=D,C)|0)|0;i=C;p=z;q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}function NA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((e|0)==0){f=0;return f|0}if(!(a[23360]|0)){Iv(178896,0,0);a[23360]=1}g=Lb(e|0)|0;e=gb(g|0,58)|0;do{if((e|0)==0){eF(g);h=1;i=b+60+(d<<2)|0;j=19}else{a[e]=0;k=b+60+(d<<2)|0;l=c[k>>2]|0;if((l|0)==0){eF(g);h=1;i=k;j=19;break}else{m=k;n=1;o=l}while(1){l=Lb(c[o+4>>2]|0)|0;p=gb(l|0,58)|0;if((p|0)!=0){a[p]=0}if((a[g]|0)==0){j=12}else{if((pm(g,l)|0)==0){j=12}else{q=n}}if((j|0)==12){j=0;p=c[44725]|0;if(p>>>0<(c[44726]|0)>>>0){r=p}else{Jv(178896,1)|0;r=c[44725]|0}c[44725]=r+1;a[r]=32;Lv(178896,c[(c[m>>2]|0)+4>>2]|0)|0;p=c[44725]|0;if(p>>>0<(c[44726]|0)>>>0){s=p}else{Jv(178896,1)|0;s=c[44725]|0}c[44725]=s+1;a[s]=58;Lv(178896,c[(c[(c[m>>2]|0)+12>>2]|0)+8>>2]|0)|0;q=0}eF(l);l=c[m>>2]|0;p=c[l>>2]|0;if((p|0)==0){break}else{m=l;n=q;o=p}}eF(g);if(q<<24>>24!=0){h=q;i=k;j=19}}}while(0);do{if((j|0)==19){q=c[i>>2]|0;if((q|0)==0){t=h}else{g=i;o=0;n=h;m=q;while(1){q=Lb(c[m+4>>2]|0)|0;s=gb(q|0,58)|0;if((s|0)!=0){a[s]=0}if((o|0)==0){j=24}else{if((pm(o,q)|0)==0){u=n}else{j=24}}if((j|0)==24){j=0;s=c[44725]|0;if(s>>>0<(c[44726]|0)>>>0){v=s}else{Jv(178896,1)|0;v=c[44725]|0}c[44725]=v+1;a[v]=32;Lv(178896,q)|0;u=0}s=c[g>>2]|0;r=c[s>>2]|0;if((r|0)==0){t=u;break}else{g=s;o=q;n=u;m=r}}}if(t<<24>>24==0){break}else{f=213392}return f|0}}while(0);t=c[44725]|0;if(t>>>0<(c[44726]|0)>>>0){w=t}else{Jv(178896,1)|0;w=c[44725]|0}a[w]=0;w=c[44724]|0;c[44725]=w;f=w;return f|0}function OA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[a>>2]|0;MA(d,3,b)|0;b=c[d+92>>2]|0;if((b|0)==0){e=999;return e|0}f=c[b+16>>2]|0;g=c[f+12>>2]|0;c[a+76>>2]=g;h=c[f+16>>2]|0;c[a+84>>2]=h;i=c[f>>2]|0;c[a+80>>2]=i;c[a+88>>2]=c[b+4>>2];b=a+152|0;f=c[b>>2]|c[h>>2];c[b>>2]=f;h=c[d+80>>2]|0;if((h|0)==0){c[a+60>>2]=0;e=999;return e|0}d=c[h+16>>2]|0;c[a+60>>2]=c[d+12>>2];j=c[d+16>>2]|0;c[a+68>>2]=j;c[a+72>>2]=c[h+4>>2];c[b>>2]=f|c[j>>2];if((g|0)==0){c[a+64>>2]=i;e=300;return e|0}else{c[a+64>>2]=c[d>>2];e=300;return e|0}return 0}function PA(a){a=a|0;var b=0,d=0,e=0;b=c[a+60>>2]|0;do{if((Xz(a)|0)==0){if((b|0)==0){d=0;break}e=c[b>>2]|0;if((e|0)==0){d=0;break}Cc[e&255](a);d=0}else{d=1}}while(0);return d|0}function QA(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;do{if((b|0)!=0){d=c[b+4>>2]|0;if((d|0)==0){break}Cc[d&255](a)}}while(0);c[(c[a>>2]|0)+24>>2]=0;cA(a);return}function RA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0;f=+h[a+504>>3];g=+h[a+512>>3];i=+h[a+352>>3];j=i*+h[a+520>>3];k=i*+h[a+528>>3];l=(e|0)>0;if((c[a+360>>2]|0)==0){if(l){m=0}else{return d|0}do{h[d+(m<<4)>>3]=j*(f+ +h[b+(m<<4)>>3]);h[d+(m<<4)+8>>3]=k*(g+ +h[b+(m<<4)+8>>3]);m=m+1|0;}while((m|0)<(e|0));return d|0}else{if(l){n=0}else{return d|0}do{i=-0.0-j*(g+ +h[b+(n<<4)+8>>3]);h[d+(n<<4)+8>>3]=k*(f+ +h[b+(n<<4)>>3]);h[d+(n<<4)>>3]=i;n=n+1|0;}while((n|0)<(e|0));return d|0}return 0}function SA(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+8>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function TA(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;do{if((b|0)!=0){d=c[b+12>>2]|0;if((d|0)==0){break}Cc[d&255](a)}}while(0);bA(a);return}function UA(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+24>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function VA(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+28>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function WA(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+16>>2]|0;if((d|0)==0){return}b=c[a+160>>2]|0;Vc[d&63](a,c[(c[(c[a>>2]|0)+308>>2]|0)+(b<<2)>>2]|0,b,c[a+156>>2]|0);return}function XA(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+20>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function YA(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+32>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function ZA(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+36>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function _A(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+40>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function $A(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+44>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function aB(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+48>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function bB(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+52>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function cB(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+56>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function dB(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+60>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function eB(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+64>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function fB(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+68>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function gB(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=c[a+60>>2]|0;if((g|0)==0){return}h=c[g+72>>2]|0;if((h|0)==0){return}Bc[h&63](a,b,d,e,f);return}function hB(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+76>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function iB(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+60>>2]|0;if((d|0)==0){return}e=c[d+80>>2]|0;if((e|0)==0){return}Dc[e&63](a,b);return}function jB(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+84>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function kB(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0;g=i;i=i+16|0;j=e;e=i;i=i+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];j=g|0;l=c[b+60>>2]|0;m=c[f>>2]|0;if((m|0)==0){i=g;return}if((a[m]|0)==0){i=g;return}m=c[b+16>>2]|0;do{if((m|0)!=0){if((c[m+144>>2]|0)!=0){break}i=g;return}}while(0);if((c[b+152>>2]&8192|0)==0){m=e|0;n=(c[k>>2]=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24,c[k+4>>2]=d[m+4|0]|d[m+5|0]<<8|d[m+6|0]<<16|d[m+7|0]<<24,+h[k>>3]);m=e+8|0;o=(c[k>>2]=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24,c[k+4>>2]=d[m+4|0]|d[m+5|0]<<8|d[m+6|0]<<16|d[m+7|0]<<24,+h[k>>3]);p=+h[b+504>>3];q=+h[b+512>>3];r=+h[b+352>>3];if((c[b+360>>2]|0)==0){s=o+q;t=n+p}else{s=n+p;t=-0.0-(o+q)}q=r*+h[b+528>>3]*s;h[j>>3]=r*+h[b+520>>3]*t;h[j+8>>3]=q}else{m=j;u=e;c[m>>2]=c[u>>2];c[m+4>>2]=c[u+4>>2];c[m+8>>2]=c[u+8>>2];c[m+12>>2]=c[u+12>>2]}if((l|0)==0){i=g;return}u=c[l+88>>2]|0;if((u|0)==0){i=g;return}Tc[u&127](b,j,f);i=g;return}function lB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=c[b+60>>2]|0;f=(c[b+16>>2]|0)+16|0;g=gb(d|0,58)|0;h=(g|0)!=0;if(h){a[g]=0}do{if((e|0)!=0){mB(c[b+68>>2]|0,d,f);i=c[e+92>>2]|0;if((i|0)==0){break}Dc[i&63](b,f)}}while(0);if(!h){return}a[g]=58;return}function mB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+8|0;f=e|0;c[d>>2]=b;c[d+32>>2]=5;c[f>>2]=zh(b)|0;g=c[a+16>>2]|0;do{if((g|0)!=0){if((vb(f|0,g|0,c[a+20>>2]|0,4,22)|0)==0){break}i=e;return}}while(0);g=Ah(b,d,c[a+24>>2]|0)|0;if((g|0)==0){i=e;return}else if((g|0)==1){g=kk((xF(b|0)|0)+16|0)|0;nb(g|0,149e3,(h=i,i=i+8|0,c[h>>2]=b,h)|0)|0;i=h;if((Sh(g)|0)!=0){Fv(0,145840,(h=i,i=i+8|0,c[h>>2]=b,h)|0)|0;i=h}eF(g);i=e;return}else{Fv(1,142848,(h=i,i=i+1|0,i=i+7&-8,c[h>>2]=0,h)|0)|0;i=h;i=e;return}}function nB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=c[b+60>>2]|0;f=(c[b+16>>2]|0)+56|0;g=gb(d|0,58)|0;h=(g|0)!=0;if(h){a[g]=0}do{if((e|0)!=0){mB(c[b+68>>2]|0,d,f);i=c[e+92>>2]|0;if((i|0)==0){break}Dc[i&63](b,f)}}while(0);if(!h){return}a[g]=58;return}function oB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0,i=0,j=0;f=c[a+60>>2]|0;h=a+16|0;i=(c[h>>2]|0)+96|0;do{if((f|0)!=0){mB(c[a+68>>2]|0,b,i);j=c[f+92>>2]|0;if((j|0)==0){break}Dc[j&63](a,i)}}while(0);c[(c[h>>2]|0)+136>>2]=d;g[(c[h>>2]|0)+140>>2]=e;return}function pB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;f=c[b+60>>2]|0;g=c[b+16>>2]|0;c[g+160>>2]=d;if((f|0)==0|(d|0)==0){i=e;return}f=c[d>>2]|0;if((f|0)==0){i=e;return}b=g+144|0;j=g+152|0;k=g+148|0;g=d;d=f;do{g=g+4|0;f=a[d]|0;l=f<<24>>24==115;a:do{if(l){if((Ya(d|0,164472)|0)!=0){m=20;break}c[b>>2]=3}else{do{if((f<<24>>24|0)==100){if((Ya(d|0,132280)|0)==0){c[b>>2]=1;break a}if((Ya(d|0,117240)|0)==0){c[b>>2]=2;break a}else{if((f<<24>>24|0)==105){m=14;break}else if((f<<24>>24|0)==98){break}else{m=20;break a}}}else if((f<<24>>24|0)==105){m=14}else if((f<<24>>24|0)!=98){m=20;break a}}while(0);b:do{if((m|0)==14){m=0;do{if((Ya(d|0,109680)|0)!=0){if((Ya(d|0,103848)|0)==0){break}if(f<<24>>24==98){break b}else{m=20;break a}}}while(0);c[b>>2]=0;break a}}while(0);if((Ya(d|0,98216)|0)!=0){m=20;break}h[j>>3]=2.0}}while(0);c:do{if((m|0)==20){m=0;do{if(l){if((Ya(d|0,92648)|0)==0){n=d;o=0}else{break}while(1){p=n+1|0;if(o){break}n=p;o=(a[p]|0)==0}h[j>>3]=+rF(p);break c}else{if((f<<24>>24|0)==116){if((Ya(d|0,168568)|0)==0){break c}else{break}}else if((f<<24>>24|0)==102){if((Ya(d|0,87288)|0)!=0){break}c[k>>2]=1;break c}else if((f<<24>>24|0)==117){if((Ya(d|0,82552)|0)!=0){break}c[k>>2]=0;break c}else{break}}}while(0);Fv(0,164352,(q=i,i=i+8|0,c[q>>2]=d,q)|0)|0;i=q}}while(0);d=c[g>>2]|0;}while((d|0)!=0);i=e;return}function qB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;d=i;i=i+32|0;f=d|0;g=c[a+60>>2]|0;if((g|0)==0){i=d;return}j=g+96|0;if((c[j>>2]|0)==0){i=d;return}if((c[(c[a+16>>2]|0)+144>>2]|0)==0){i=d;return}g=b+16|0;k=(+h[b>>3]+ +h[g>>3])*.5;l=f|0;m=f|0;h[m>>3]=k;n=(+h[b+8>>3]+ +h[b+24>>3])*.5;b=f+8|0;h[b>>3]=n;o=f+16|0;p=g;c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];do{if((c[a+152>>2]&8192|0)==0){q=+h[a+504>>3];r=+h[a+512>>3];s=+h[a+352>>3];t=s*+h[a+520>>3];u=s*+h[a+528>>3];if((c[a+360>>2]|0)==0){h[m>>3]=t*(q+k);h[b>>3]=u*(r+n);p=f+16|0;h[p>>3]=t*(q+ +h[p>>3]);p=f+24|0;h[p>>3]=u*(r+ +h[p>>3]);break}else{h[b>>3]=u*(q+k);h[m>>3]=-0.0-t*(r+n);p=f+24|0;s=-0.0-t*(r+ +h[p>>3]);o=f+16|0;h[p>>3]=u*(q+ +h[o>>3]);h[o>>3]=s;break}}}while(0);Tc[c[j>>2]&127](a,l,e);i=d;return}function rB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0;f=i;i=i+40|0;g=f|0;j=c[a+60>>2]|0;if((j|0)==0){i=f;return}k=j+100|0;if((c[k>>2]|0)==0){i=f;return}j=a+16|0;l=c[j>>2]|0;if((c[l+144>>2]|0)==0){i=f;return}if((e&4|0)==0){m=e;n=0}else{o=g;p=l+16|0;c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];c[o+16>>2]=c[p+16>>2];c[o+20>>2]=c[p+20>>2];c[o+24>>2]=c[p+24>>2];c[o+28>>2]=c[p+28>>2];c[o+32>>2]=c[p+32>>2];c[o+36>>2]=c[p+36>>2];o=l+56|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[p+16>>2]=c[o+16>>2];c[p+20>>2]=c[o+20>>2];c[p+24>>2]=c[o+24>>2];c[p+28>>2]=c[o+28>>2];c[p+32>>2]=c[o+32>>2];c[p+36>>2]=c[o+36>>2];m=e&-5;n=1}if((c[a+152>>2]&8192|0)==0){if((c[43760]|0)<(d|0)){e=d+10|0;c[43760]=e;o=mk(c[53856]|0,e<<4)|0;c[53856]=o;q=o}else{q=c[53856]|0}r=+h[a+504>>3];s=+h[a+512>>3];t=+h[a+352>>3];u=t*+h[a+520>>3];v=t*+h[a+528>>3];o=(d|0)>0;do{if((c[a+360>>2]|0)==0){if(o){w=0}else{break}do{h[q+(w<<4)>>3]=u*(r+ +h[b+(w<<4)>>3]);h[q+(w<<4)+8>>3]=v*(s+ +h[b+(w<<4)+8>>3]);w=w+1|0;}while((w|0)<(d|0))}else{if(o){x=0}else{break}do{t=-0.0-u*(s+ +h[b+(x<<4)+8>>3]);h[q+(x<<4)+8>>3]=v*(r+ +h[b+(x<<4)>>3]);h[q+(x<<4)>>3]=t;x=x+1|0;}while((x|0)<(d|0))}}while(0);Vc[c[k>>2]&63](a,q,d,m)}else{Vc[c[k>>2]&63](a,b,d,m)}if((n|0)==0){i=f;return}n=(c[j>>2]|0)+16|0;j=g;c[n>>2]=c[j>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];c[n+12>>2]=c[j+12>>2];c[n+16>>2]=c[j+16>>2];c[n+20>>2]=c[j+20>>2];c[n+24>>2]=c[j+24>>2];c[n+28>>2]=c[j+28>>2];c[n+32>>2]=c[j+32>>2];c[n+36>>2]=c[j+36>>2];i=f;return}function sB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0;e=i;i=i+64|0;f=b;b=i;i=i+32|0;tF(b,f,32)|0;f=e|0;g=f;j=b;c[g>>2]=c[j>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];j=f+32|0;g=j;k=b+16|0;c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];h[f+16>>3]=+h[f>>3];h[f+24>>3]=+h[f+40>>3];h[f+48>>3]=+h[j>>3];h[f+56>>3]=+h[f+8>>3];rB(a,f|0,4,d);i=e;return}function tB(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0;i=c[a+60>>2]|0;if((i|0)==0){return}j=i+104|0;i=c[j>>2]|0;if((i|0)==0){return}if((c[(c[a+16>>2]|0)+144>>2]|0)==0){return}if((c[a+152>>2]&8192|0)!=0){Ic[i&15](a,b,d,e,f,g&255);return}if((c[43760]|0)<(d|0)){i=d+10|0;c[43760]=i;k=mk(c[53856]|0,i<<4)|0;c[53856]=k;l=k}else{l=c[53856]|0}m=+h[a+504>>3];n=+h[a+512>>3];o=+h[a+352>>3];p=o*+h[a+520>>3];q=o*+h[a+528>>3];k=(d|0)>0;do{if((c[a+360>>2]|0)==0){if(k){r=0}else{break}do{h[l+(r<<4)>>3]=p*(m+ +h[b+(r<<4)>>3]);h[l+(r<<4)+8>>3]=q*(n+ +h[b+(r<<4)+8>>3]);r=r+1|0;}while((r|0)<(d|0))}else{if(k){s=0}else{break}do{o=-0.0-p*(n+ +h[b+(s<<4)+8>>3]);h[l+(s<<4)+8>>3]=q*(m+ +h[b+(s<<4)>>3]);h[l+(s<<4)>>3]=o;s=s+1|0;}while((s|0)<(d|0))}}while(0);Ic[c[j>>2]&15](a,l,d,e,f,g&255);return}function uB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0;e=c[a+60>>2]|0;if((e|0)==0){return}f=e+108|0;e=c[f>>2]|0;if((e|0)==0){return}if((c[(c[a+16>>2]|0)+144>>2]|0)==0){return}if((c[a+152>>2]&8192|0)!=0){Tc[e&127](a,b,d);return}if((c[43760]|0)<(d|0)){e=d+10|0;c[43760]=e;g=mk(c[53856]|0,e<<4)|0;c[53856]=g;i=g}else{i=c[53856]|0}j=+h[a+504>>3];k=+h[a+512>>3];l=+h[a+352>>3];m=l*+h[a+520>>3];n=l*+h[a+528>>3];g=(d|0)>0;do{if((c[a+360>>2]|0)==0){if(g){o=0}else{break}do{h[i+(o<<4)>>3]=m*(j+ +h[b+(o<<4)>>3]);h[i+(o<<4)+8>>3]=n*(k+ +h[b+(o<<4)+8>>3]);o=o+1|0;}while((o|0)<(d|0))}else{if(g){p=0}else{break}do{l=-0.0-m*(k+ +h[b+(p<<4)+8>>3]);h[i+(p<<4)+8>>3]=n*(j+ +h[b+(p<<4)>>3]);h[i+(p<<4)>>3]=l;p=p+1|0;}while((p|0)<(d|0))}}while(0);Tc[c[f>>2]&127](a,i,d);return}function vB(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[b+60>>2]|0;if((d|0)==0){return}if((a[d]|0)==0|(e|0)==0){return}f=c[e+112>>2]|0;if((f|0)==0){return}Dc[f&63](b,d);return}function wB(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0;k=i;i=i+40|0;l=k|0;m=k+32|0;n=c[b+60>>2]|0;o=BB(d)|0;if((o|0)==0){if((ul(d)|0)==0|(n|0)==0){i=k;return}p=c[n+116>>2]|0;if((p|0)==0){i=k;return}Bc[p&63](b,d,e,f,g&255);i=k;return}EB(m,o,b+432|0);d=c[m>>2]|0;p=c[m+4>>2]|0;if((d|0)<1&(p|0)<1){i=k;return}m=l+16|0;q=m;r=e;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];q=l;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];if((f|0)>1){r=l|0;q=l+8|0;s=m|0;t=l+24|0;u=1;v=+h[r>>3];w=+h[q>>3];x=+h[s>>3];y=+h[t>>3];do{z=+h[e+(u<<4)>>3];v=v<z?v:z;A=+h[e+(u<<4)+8>>3];w=w<A?w:A;x=x>z?x:z;y=y>A?y:A;u=u+1|0;}while((u|0)<(f|0));h[r>>3]=v;h[q>>3]=w;h[s>>3]=x;h[t>>3]=y;B=x;C=v;D=y;E=w}else{B=+h[m>>3];C=+h[l>>3];D=+h[l+24>>3];E=+h[l+8>>3]}t=m|0;m=l|0;w=B-C;s=l+24|0;q=l+8|0;C=D-E;E=+(p|0);D=+(d|0);B=w/D;y=C/E;do{if((a[j]|0)==0){F=D;G=E}else{if((pm(j,160408)|0)==0){F=D*B;G=E;break}if((pm(j,155480)|0)==0){F=D;G=E*y;break}if((pm(j,151816)|0)==0){F=D*B;G=E*y;break}if((Km(j)|0)<<24>>24==0){F=D;G=E;break}if(B<y){F=D*B;G=E*B;break}else{F=D*y;G=E*y;break}}}while(0);if(F<w){y=(w-F)*.5;h[m>>3]=y+ +h[m>>3];h[t>>3]=+h[t>>3]-y}if(G<C){y=(C-G)*.5;h[q>>3]=y+ +h[q>>3];h[s>>3]=+h[s>>3]-y}y=+h[m>>3];if((c[b+152>>2]&8192|0)==0){G=+h[q>>3];C=+h[b+504>>3];F=+h[b+512>>3];w=+h[b+352>>3];E=w*+h[b+520>>3];D=w*+h[b+528>>3];j=(c[b+360>>2]|0)==0;if(j){H=G+F;I=y+C}else{H=y+C;I=-0.0-(G+F)}G=E*I;h[m>>3]=G;h[q>>3]=D*H;d=l+16|0;H=+h[d>>3];I=+h[s>>3];if(j){J=I+F;K=H+C}else{J=H+C;K=-0.0-(I+F)}F=E*K;h[d>>3]=F;h[s>>3]=D*J;L=G;M=F}else{L=y;M=+h[t>>3]}if(L>M){h[m>>3]=M;h[t>>3]=L}L=+h[q>>3];M=+h[s>>3];if(L>M){h[q>>3]=M;h[s>>3]=L}if((n|0)==0){i=k;return}KA(b,o,l,g,c[b+72>>2]|0);i=k;return}function xB(a,b){a=a|0;b=+b;if((c[a+60>>2]|0)==0){return}h[(c[a+16>>2]|0)+152>>3]=b;return}function yB(a,b){a=a|0;b=b|0;return Ya(c[a>>2]|0,c[b>>2]|0)|0}function zB(a){a=a|0;var b=0,d=0;b=MA(a,2,155360)|0;if((b|0)==0){d=999;return d|0}c[a+148>>2]=c[(c[b+16>>2]|0)+12>>2];d=300;return d|0}function AB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=c[a+148>>2]|0;if((e|0)==0){f=0;return f|0}a=c[e>>2]|0;if((a|0)==0){f=0;return f|0}f=Oc[a&255](b,d)|0;return f|0}function BB(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+64|0;d=b|0;e=c[53676]|0;if((e|0)==0){f=0;i=b;return f|0}c[d+8>>2]=a;f=Hc[c[e>>2]&63](e,d,4)|0;i=b;return f|0}function CB(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if((b|0)==0){cc(153800,163008,590,170512);return 0}e=c[b+8>>2]|0;if((e|0)==0){cc(131336,163008,591,170512);return 0}f=b+20|0;g=c[f>>2]|0;if((g|0)!=0){mc(g|0,0,0)|0;h=1;i=d;return h|0}g=Sm(e)|0;if((g|0)==0){h=1;i=d;return h|0}e=Eb(g|0,116680)|0;c[f>>2]=e;if((e|0)==0){e=Wb(c[(Vb()|0)>>2]|0)|0;Fv(0,109336,(f=i,i=i+16|0,c[f>>2]=e,c[f+8>>2]=g,f)|0)|0;i=f;h=0;i=d;return h|0}f=c[44710]|0;if((f|0)>49){a[b+17|0]=1;h=1;i=d;return h|0}else{c[44710]=f+1;h=1;i=d;return h|0}return 0}function DB(b){b=b|0;var d=0;if((a[b+17|0]|0)==0){return}d=b+20|0;b=c[d>>2]|0;if((b|0)==0){return}Ha(b|0)|0;c[d>>2]=0;return}function EB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0.0;e=i;f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];if((b|0)==0){g=-1;j=-1}else{f=c[b+48>>2]|0;if((f|0)==0){k=+h[d>>3];l=+h[d+8>>3]}else{m=+(f|0);h[d+8>>3]=m;h[d>>3]=m;k=m;l=m}g=~~(+((c[b+40>>2]|0)*72|0|0)/k);j=~~(+((c[b+44>>2]|0)*72|0|0)/l)}c[a>>2]=g;c[a+4>>2]=j;i=e;return}function FB(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0.0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ia=0.0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Ra=0,Sa=0.0,Ta=0,Va=0,Wa=0,Xa=0,Za=0,_a=0,$a=0,bb=0,cb=0,eb=0,fb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0.0;g=i;i=i+2488|0;j=g|0;k=g+8|0;l=g+16|0;m=g+24|0;n=g+32|0;o=g+1056|0;p=g+1064|0;q=g+1072|0;r=g+1080|0;s=g+1088|0;t=g+1096|0;u=g+1112|0;v=g+1144|0;w=g+2168|0;x=g+2176|0;y=g+2184|0;z=g+2192|0;A=g+2200|0;B=g+2224|0;C=g+2424|0;do{if((f|0)!=0){if((a[f]|0)==0){break}do{if((c[53686]|0)==0){D=c[53702]|0;if((c[44708]|0)==(D|0)){break}c[44708]=D;D=c[53676]|0;if((D|0)==0){break}Vg(D)|0;c[53676]=0}}while(0);E=+h[(c[(c[e+8>>2]|0)+8>>2]|0)+24>>3];F=E<1.0?96.0:E;D=c[53676]|0;if((D|0)==0){G=$g(173112,c[43326]|0)|0;c[53676]=G;if((G|0)==0){H=12}else{I=G;J=C;H=11}}else{I=D;J=C;H=11}if((H|0)==11){c[C+8>>2]=f;D=Hc[c[I>>2]&63](I,J,4)|0;if((D|0)==0){H=12}else{K=D;H=191}}a:do{if((H|0)==12){D=jk(64)|0;G=D;if((D|0)==0){L=-1;M=-1;break}N=D+8|0;c[N>>2]=f;if((CB(G)|0)<<24>>24==0){L=-1;M=-1;break}O=A|0;P=B|0;Q=D+20|0;R=c[Q>>2]|0;b:do{if((R|0)==0){H=25}else{if((Nb(O|0,1,20,R|0)|0)==20){S=0}else{H=25;break}while(1){T=S+1|0;if((wF(O|0,c[20792+(S<<4)>>2]|0,c[20796+(S<<4)>>2]|0)|0)==0){break}if(T>>>0<10>>>0){S=T}else{H=25;break b}}T=D+28|0;c[T>>2]=c[20804+(S<<4)>>2];U=c[20800+(S<<4)>>2]|0;V=D+24|0;c[V>>2]=U;do{if((S|0)==8){if((wF(A+8|0,121160,4)|0)!=0){W=U;H=26;break}c[T>>2]=120288;c[V>>2]=11;H=90}else if((S|0)==7){while(1){if((db(P|0,200,c[Q>>2]|0)|0)==0){H=24;break}if((wF(P|0,124064,4)|0)==0){H=21;break}}if((H|0)==21){c[T>>2]=121952;c[V>>2]=8;H=105;break}else if((H|0)==24){W=c[V>>2]|0;H=26;break}}else{W=U;H=26}}while(0);c:do{if((H|0)==26){switch(W|0){case 1:{c[D+48>>2]=0;mc(c[Q>>2]|0,16,0)|0;U=c[Q>>2]|0;V=0;T=0;do{X=ab(U|0)|0;if((bc(U|0)|0)!=0){break c}T=X<<(V<<3)|T;V=V+1|0;}while(V>>>0<2>>>0);V=c[Q>>2]|0;U=0;X=0;do{Y=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}X=Y<<(U<<3)|X;U=U+1|0;}while(U>>>0<2>>>0);U=c[Q>>2]|0;V=0;Y=0;do{Z=ab(U|0)|0;if((bc(U|0)|0)!=0){break c}Y=Z<<(V<<3)|Y;V=V+1|0;}while(V>>>0<2>>>0);V=c[Q>>2]|0;U=0;Z=0;do{_=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}Z=_<<(U<<3)|Z;U=U+1|0;}while(U>>>0<2>>>0);c[D+40>>2]=X|T<<16;c[D+44>>2]=Z|Y<<16;break c;break};case 5:{c[D+48>>2]=0;mc(c[Q>>2]|0,0,0)|0;U=c[Q>>2]|0;V=n|0;do{if((db(V|0,1024,U|0)|0)==0){break c}$=Ua(V|0,97936)|0;}while(($|0)==0);Y=v|0;Z=$+9|0;while(1){T=a[Z]|0;if(T<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){aa=Z;break}X=a[V]|0;if(X<<24>>24==0){aa=V;break}else{ba=X;ca=V}}else{ba=T;ca=Z}if((Qa(ba&255|0)|0)==0){aa=ca;break}else{Z=ca+1|0}}Z=a[aa]|0;if(Z<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){break c}da=d[V]|0;ea=V}else{da=Z<<24>>24;ea=aa}if((da|0)==91){fa=ea}else{break c}while(1){Z=fa+1|0;T=a[Z]|0;if(T<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){ga=0;ha=Z;break}X=a[V]|0;if(X<<24>>24==0){ga=0;ha=V;break}else{ia=X;ja=V}}else{ia=T;ja=Z}if((Qa(ia&255|0)|0)==0){ga=0;ha=ja;break}else{fa=ja}}while(1){Z=a[ha]|0;if(Z<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){ka=ga;la=ha;break}T=a[V]|0;if(T<<24>>24==0){ka=ga;la=V;break}else{ma=T;na=V}}else{ma=Z;na=ha}if(!(((ma<<24>>24)-48|0)>>>0<10>>>0|ma<<24>>24==46)){ka=ga;la=na;break}Z=ga+1|0;a[v+ga|0]=ma;T=na+1|0;if((Z|0)==1023){ka=1023;la=T;break}else{ga=Z;ha=T}}a[v+ka|0]=0;E=+sF(Y,m);if((c[m>>2]|0)==(Y|0)){break c}else{oa=la}while(1){T=a[oa]|0;if(T<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){pa=0;qa=oa;break}Z=a[V]|0;if(Z<<24>>24==0){pa=0;qa=V;break}else{ra=Z;sa=V}}else{ra=T;sa=oa}if((Qa(ra&255|0)|0)==0){pa=0;qa=sa;break}else{oa=sa+1|0}}while(1){T=a[qa]|0;if(T<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){ta=pa;ua=qa;break}Z=a[V]|0;if(Z<<24>>24==0){ta=pa;ua=V;break}else{va=Z;wa=V}}else{va=T;wa=qa}if(!(((va<<24>>24)-48|0)>>>0<10>>>0|va<<24>>24==46)){ta=pa;ua=wa;break}T=pa+1|0;a[v+pa|0]=va;Z=wa+1|0;if((T|0)==1023){ta=1023;ua=Z;break}else{pa=T;qa=Z}}a[v+ta|0]=0;xa=+sF(Y,l);if((c[l>>2]|0)==(Y|0)){break c}else{ya=ua}while(1){Z=a[ya]|0;if(Z<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){za=0;Aa=ya;break}T=a[V]|0;if(T<<24>>24==0){za=0;Aa=V;break}else{Ba=T;Ca=V}}else{Ba=Z;Ca=ya}if((Qa(Ba&255|0)|0)==0){za=0;Aa=Ca;break}else{ya=Ca+1|0}}while(1){Z=a[Aa]|0;if(Z<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){Da=za;Ea=Aa;break}T=a[V]|0;if(T<<24>>24==0){Da=za;Ea=V;break}else{Fa=T;Ga=V}}else{Fa=Z;Ga=Aa}if(!(((Fa<<24>>24)-48|0)>>>0<10>>>0|Fa<<24>>24==46)){Da=za;Ea=Ga;break}Z=za+1|0;a[v+za|0]=Fa;T=Ga+1|0;if((Z|0)==1023){Da=1023;Ea=T;break}else{za=Z;Aa=T}}a[v+Da|0]=0;Ia=+sF(Y,k);if((c[k>>2]|0)==(Y|0)){break c}else{Ja=Ea}while(1){T=a[Ja]|0;if(T<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){Ka=0;La=Ja;break}Z=a[V]|0;if(Z<<24>>24==0){Ka=0;La=V;break}else{Ma=Z;Na=V}}else{Ma=T;Na=Ja}if((Qa(Ma&255|0)|0)==0){Ka=0;La=Na;break}else{Ja=Na+1|0}}while(1){T=a[La]|0;if(T<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){Oa=Ka;break}Z=a[V]|0;if(Z<<24>>24==0){Oa=Ka;break}else{Pa=Z;Ra=V}}else{Pa=T;Ra=La}if(!(((Pa<<24>>24)-48|0)>>>0<10>>>0|Pa<<24>>24==46)){Oa=Ka;break}T=Ka+1|0;a[v+Ka|0]=Pa;if((T|0)==1023){Oa=1023;break}Ka=T;La=Ra+1|0}a[v+Oa|0]=0;Sa=+sF(Y,j);if((c[j>>2]|0)==(Y|0)){break c}c[D+32>>2]=~~E;c[D+36>>2]=~~xa;c[D+40>>2]=~~(Ia-E);c[D+44>>2]=~~(Sa-xa);break c;break};case 3:{c[D+48>>2]=0;mc(c[Q>>2]|0,16,0)|0;V=c[Q>>2]|0;U=0;T=0;do{Z=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}T=Z|T<<8;U=U+1|0;}while(U>>>0<4>>>0);U=c[Q>>2]|0;V=0;Y=0;do{Z=ab(U|0)|0;if((bc(U|0)|0)!=0){break c}Y=Z|Y<<8;V=V+1|0;}while(V>>>0<4>>>0);c[D+40>>2]=T;c[D+44>>2]=Y;break c;break};case 11:{H=90;break c;break};case 6:{V=v|0;c[D+48>>2]=0;mc(c[Q>>2]|0,0,0)|0;if((db(V|0,1024,c[Q>>2]|0)|0)==0){break c}while(1){U=Ua(V|0,129848)|0;if((U|0)!=0){Z=ac(U|0,126552,(Ta=i,i=i+32|0,c[Ta>>2]=w,c[Ta+8>>2]=x,c[Ta+16>>2]=y,c[Ta+24>>2]=z,Ta)|0)|0;i=Ta;if((Z|0)==4){break}}if((db(V|0,1024,c[Q>>2]|0)|0)==0){break c}}V=c[w>>2]|0;c[D+32>>2]=V;Y=c[x>>2]|0;c[D+36>>2]=Y;c[D+40>>2]=(c[y>>2]|0)-V;c[D+44>>2]=(c[z>>2]|0)-Y;break c;break};case 4:{c[D+48>>2]=0;Y=c[Q>>2]|0;V=ab(Y|0)|0;if((bc(Y|0)|0)==0){Va=V}else{break c}d:while(1){do{if((Va|0)!=255){if((gb(20952,Va|0)|0)!=0){break}if((Va|0)==192){break d}Wa=c[Q>>2]|0;if((Va|0)==194){Xa=0;H=73;break d}else{Za=0;_a=0}do{V=ab(Wa|0)|0;if((bc(Wa|0)|0)!=0){break c}_a=V|_a<<8;Za=Za+1|0;}while(Za>>>0<2>>>0);mc(c[Q>>2]|0,_a-2|0,1)|0}}while(0);V=c[Q>>2]|0;Va=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}}if((H|0)==73){while(1){H=0;ab(Wa|0)|0;if((bc(Wa|0)|0)!=0){break c}V=Xa+1|0;if(V>>>0<3>>>0){Xa=V;H=73}else{break}}V=c[Q>>2]|0;Y=0;T=0;do{Z=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}T=Z|T<<8;Y=Y+1|0;}while(Y>>>0<2>>>0);Y=c[Q>>2]|0;V=0;Z=0;do{U=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break c}Z=U|Z<<8;V=V+1|0;}while(V>>>0<2>>>0);c[D+44>>2]=T;c[D+40>>2]=Z;break c}V=c[Q>>2]|0;Y=0;do{ab(V|0)|0;if((bc(V|0)|0)!=0){break c}Y=Y+1|0;}while(Y>>>0<3>>>0);Y=c[Q>>2]|0;V=0;Z=0;do{T=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break c}Z=T|Z<<8;V=V+1|0;}while(V>>>0<2>>>0);V=c[Q>>2]|0;Y=0;T=0;do{U=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}T=U|T<<8;Y=Y+1|0;}while(Y>>>0<2>>>0);c[D+44>>2]=Z;c[D+40>>2]=T;break c;break};case 0:{break b;break};case 8:{H=105;break c;break};case 2:{c[D+48>>2]=0;mc(c[Q>>2]|0,6,0)|0;Y=c[Q>>2]|0;V=0;U=0;do{X=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break c}U=X<<(V<<3)|U;V=V+1|0;}while(V>>>0<2>>>0);V=c[Q>>2]|0;Y=0;T=0;do{Z=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}T=Z<<(Y<<3)|T;Y=Y+1|0;}while(Y>>>0<2>>>0);c[D+40>>2]=U;c[D+44>>2]=T;break c;break};case 12:{c[D+48>>2]=0;mc(c[Q>>2]|0,6,0)|0;Y=c[Q>>2]|0;V=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break c}Y=c[Q>>2]|0;Z=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break c}c[D+40>>2]=V;c[D+44>>2]=Z;break c;break};default:{break c}}}}while(0);e:do{if((H|0)==90){c[D+48>>2]=0;mc(c[Q>>2]|0,15,0)|0;Z=(ab(c[Q>>2]|0)|0)==88;V=c[Q>>2]|0;if(Z){mc(V|0,24,0)|0;Z=c[Q>>2]|0;Y=0;X=0;do{_=ab(Z|0)|0;if((bc(Z|0)|0)!=0){break e}X=_<<(Y<<3)|X;Y=Y+1|0;}while(Y>>>0<4>>>0);Y=c[Q>>2]|0;Z=0;T=0;do{U=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break e}T=U<<(Z<<3)|T;Z=Z+1|0;}while(Z>>>0<4>>>0);c[D+40>>2]=X;c[D+44>>2]=T;break}else{mc(V|0,26,0)|0;Z=c[Q>>2]|0;Y=0;U=0;do{_=ab(Z|0)|0;if((bc(Z|0)|0)!=0){break e}U=_<<(Y<<3)|U;Y=Y+1|0;}while(Y>>>0<2>>>0);Y=c[Q>>2]|0;Z=0;V=0;do{T=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break e}V=T<<(Z<<3)|V;Z=Z+1|0;}while(Z>>>0<2>>>0);c[D+40>>2]=U;c[D+44>>2]=V;break}}else if((H|0)==105){Z=t|0;if((c[43816]|0)==0){if((LE(175160,132080,1)|0)!=0){Fv(1,92408,(Ta=i,i=i+8|0,c[Ta>>2]=132080,Ta)|0)|0;i=Ta}c[43816]=175160}mc(c[Q>>2]|0,0,0)|0;f:do{if((db(P|0,200,c[Q>>2]|0)|0)==0){$a=0;bb=0}else{Y=u|0;T=u+12|0;X=u+20|0;_=u+8|0;cb=u+16|0;eb=u+4|0;fb=0;hb=0;ib=0;jb=0;while(1){if(ib<<24>>24==0|jb<<24>>24==0){kb=jb;lb=ib;mb=P;nb=hb;ob=fb}else{$a=fb;bb=hb;break f}g:while(1){pb=kb;qb=lb;rb=mb;sb=nb;h:while(1){if((YE(175160,rb,4,Y,0)|0)==0){tb=rb}else{ub=pb;vb=qb;wb=sb;xb=ob;break g}while(1){a[tb+(c[T>>2]|0)|0]=0;a[tb+(c[X>>2]|0)|0]=0;yb=tb+(c[_>>2]|0)|0;zb=tb+(c[cb>>2]|0)|0;Ab=tb+((c[eb>>2]|0)+1)|0;if((Ya(yb|0,87080)|0)==0){break}if((Ya(yb|0,160280)|0)==0){break h}if((Ya(yb|0,155296)|0)==0){yb=ac(zb|0,151720,(Ta=i,i=i+32|0,c[Ta>>2]=p,c[Ta+8>>2]=q,c[Ta+16>>2]=r,c[Ta+24>>2]=s,Ta)|0)|0;i=Ta;if((yb|0)==4){H=129;break g}}if((YE(175160,Ab,4,Y,0)|0)==0){tb=Ab}else{ub=pb;vb=qb;wb=sb;xb=ob;break g}}yb=ac(zb|0,82328,(Ta=i,i=i+16|0,c[Ta>>2]=o,c[Ta+8>>2]=Z,Ta)|0)|0;i=Ta;do{if((yb|0)==2){Bb=1;Cb=GB(+h[o>>3],Z)|0}else{Db=ac(zb|0,168376,(Ta=i,i=i+8|0,c[Ta>>2]=o,Ta)|0)|0;i=Ta;if((Db|0)!=1){Bb=qb;Cb=sb;break}Bb=1;Cb=GB(+h[o>>3],164232)|0}}while(0);if(pb<<24>>24==0){pb=0;qb=Bb;rb=Ab;sb=Cb}else{ub=pb;vb=Bb;wb=Cb;xb=ob;break g}}rb=ac(zb|0,82328,(Ta=i,i=i+16|0,c[Ta>>2]=o,c[Ta+8>>2]=Z,Ta)|0)|0;i=Ta;do{if((rb|0)==2){Eb=1;Fb=GB(+h[o>>3],Z)|0}else{yb=ac(zb|0,168376,(Ta=i,i=i+8|0,c[Ta>>2]=o,Ta)|0)|0;i=Ta;if((yb|0)!=1){Eb=pb;Fb=ob;break}Eb=1;Fb=GB(+h[o>>3],164232)|0}}while(0);if(qb<<24>>24==0){kb=Eb;lb=0;mb=Ab;nb=sb;ob=Fb}else{ub=Eb;vb=qb;wb=sb;xb=Fb;break}}if((H|0)==129){H=0;ub=1;vb=1;wb=~~(+h[r>>3]- +h[p>>3]+1.0);xb=~~(+h[s>>3]- +h[q>>3]+1.0)}if((db(P|0,200,c[Q>>2]|0)|0)==0){$a=xb;bb=wb;break}else{fb=xb;hb=wb;ib=vb;jb=ub}}}}while(0);c[D+48>>2]=0;c[D+40>>2]=bb;c[D+44>>2]=$a;}}while(0);Z=c[53676]|0;Hc[c[Z>>2]&63](Z,D,1)|0;K=G;H=191;break a}}while(0);if((H|0)==25){c[D+28>>2]=119560;c[D+24>>2]=0;}G=ul(c[N>>2]|0)|0;c[D+52>>2]=G;if((G|0)==0){Fv(0,103432,(Ta=i,i=i+8|0,c[Ta>>2]=c[N>>2],Ta)|0)|0;i=Ta}eF(D);L=-1;M=-1}}while(0);i:do{if((H|0)==191){do{if((a[K+17|0]|0)==0){if((K|0)==0){L=-1;M=-1;break i}}else{G=K+20|0;Q=c[G>>2]|0;if((Q|0)==0){break}Ha(Q|0)|0;c[G>>2]=0}}while(0);D=c[K+48>>2]|0;if((D|0)==0){Gb=F}else{Gb=+(D|0)}L=~~(+((c[K+40>>2]|0)*72|0|0)/Gb);M=~~(+((c[K+44>>2]|0)*72|0|0)/Gb)}}while(0);c[b>>2]=L;c[b+4>>2]=M;i=g;return}}while(0);c[b>>2]=-1;c[b+4>>2]=-1;i=g;return}function GB(a,b){a=+a;b=b|0;var c=0.0,d=0.0,e=0,f=0.0,g=0.0,h=0.0,i=0.0,j=0.0;if((Ya(b|0,148872)|0)==0){c=a*72.0;if(c<0.0){d=c+-.5}else{d=c+.5}e=~~d;return e|0}if((Ya(b|0,145712)|0)==0){d=a*72.0/96.0;if(d<0.0){f=d+-.5}else{f=d+.5}e=~~f;return e|0}if((Ya(b|0,142696)|0)==0){f=a*72.0/6.0;if(f<0.0){g=f+-.5}else{g=f+.5}e=~~g;return e|0}do{if((Ya(b|0,164232)|0)!=0){if((Ya(b|0,139624)|0)==0){break}if((Ya(b|0,136976)|0)==0){g=a*28.346456664;if(g<0.0){h=g+-.5}else{h=g+.5}e=~~h;return e|0}if((Ya(b|0,134064)|0)!=0){e=0;return e|0}g=a*2.8346456663999997;if(g<0.0){i=g+-.5}else{i=g+.5}e=~~i;return e|0}}while(0);if(a<0.0){j=a+-.5}else{j=a+.5}e=~~j;return e|0}function HB(a,b,d){a=a|0;b=b|0;d=d|0;d=c[b+20>>2]|0;if((d|0)!=0){Ha(d|0)|0}if((c[b+52>>2]|0)==0){eF(b);return}d=c[b+60>>2]|0;if((d|0)==0){eF(b);return}Cc[d&255](b);eF(b);return}function IB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=dF(28)|0;e=d;if((d|0)==0){f=0;return f|0}g=(b|0)>0;do{if(g){h=0;i=0;do{h=(c[(c[a+(i<<2)>>2]|0)+4>>2]|0)+h|0;i=i+1|0;}while((i|0)<(b|0));i=h<<4;if((i|0)==0){j=0;k=h;break}j=dF(i)|0;k=h}else{j=0;k=0}}while(0);i=d+8|0;c[i>>2]=j;j=(b<<2)+4|0;if((j|0)==0){l=0}else{l=dF(j)|0}j=d+12|0;c[j>>2]=l;m=k<<2;if((m|0)==0){n=d+16|0;c[n>>2]=0;o=0;p=n}else{n=d+16|0;c[n>>2]=dF(m)|0;o=dF(m)|0;p=n}n=d+20|0;c[n>>2]=o;c[d+4>>2]=k;c[d>>2]=b;c[l>>2]=0;if(g){g=0;l=0;while(1){d=a+(l<<2)|0;k=c[d>>2]|0;o=c[k+4>>2]|0;m=g-1+o|0;if((o|0)>0){o=0;q=g;r=k;while(1){k=(c[i>>2]|0)+(q<<4)|0;s=(c[r>>2]|0)+(o<<4)|0;c[k>>2]=c[s>>2];c[k+4>>2]=c[s+4>>2];c[k+8>>2]=c[s+8>>2];c[k+12>>2]=c[s+12>>2];s=q+1|0;c[(c[p>>2]|0)+(q<<2)>>2]=s;c[(c[n>>2]|0)+(q<<2)>>2]=q-1;k=o+1|0;t=c[d>>2]|0;if((k|0)<(c[t+4>>2]|0)){o=k;q=s;r=t}else{u=s;break}}}else{u=g}c[(c[p>>2]|0)+(m<<2)>>2]=g;c[(c[n>>2]|0)+(g<<2)>>2]=m;r=l+1|0;c[(c[j>>2]|0)+(r<<2)>>2]=u;if((r|0)<(b|0)){g=u;l=r}else{break}}}aC(e);f=e;return f|0}function JB(a){a=a|0;var b=0,d=0,e=0;eF(c[a+8>>2]|0);eF(c[a+12>>2]|0);eF(c[a+16>>2]|0);eF(c[a+20>>2]|0);b=a+24|0;d=c[b>>2]|0;if((d|0)==0){e=a;eF(e);return}eF(c[d>>2]|0);eF(c[b>>2]|0);e=a;eF(e);return}function KB(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;h=i;j=b;b=i;i=i+16|0;c[b>>2]=c[j>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];c[b+12>>2]=c[j+12>>2];j=e;e=i;i=i+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];j=bC(a,d,b)|0;k=bC(a,f,e)|0;l=WB(b,d,j,e,f,k,a)|0;f=c[a+4>>2]|0;d=f+1|0;m=f;n=1;while(1){o=c[l+(m<<2)>>2]|0;p=n+1|0;if((o|0)==(d|0)){break}else{m=o;n=p}}m=dF(p<<4)|0;o=m+(n<<4)|0;q=e;c[o>>2]=c[q>>2];c[o+4>>2]=c[q+4>>2];c[o+8>>2]=c[q+8>>2];c[o+12>>2]=c[q+12>>2];q=c[l+(f<<2)>>2]|0;f=n-1|0;n=m+(f<<4)|0;if((q|0)==(d|0)){r=f;s=n}else{o=c[a+8>>2]|0;a=q;q=f;f=n;while(1){n=f;e=o+(a<<4)|0;c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2];e=c[l+(a<<2)>>2]|0;n=q-1|0;t=m+(n<<4)|0;if((e|0)==(d|0)){r=n;s=t;break}else{a=e;q=n;f=t}}}f=s;s=b;c[f>>2]=c[s>>2];c[f+4>>2]=c[s+4>>2];c[f+8>>2]=c[s+8>>2];c[f+12>>2]=c[s+12>>2];if((r|0)!=0){cc(113416,153568,148,171208);return 0}if((j|0)!=0){eF(j)}if((k|0)==0){u=g+4|0;c[u>>2]=p;v=g|0;c[v>>2]=m;w=l;eF(w);i=h;return 1}eF(k);u=g+4|0;c[u>>2]=p;v=g|0;c[v>>2]=m;w=l;eF(w);i=h;return 1}function LB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=a;a=i;i=i+8|0;c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=c[a>>2]|0;f=c[a+4>>2]|0;a=f-1|0;if((f|0)>0){g=0}else{h=1;i=d;return h|0}while(1){j=g+1|0;if((_B(e+(((a+g|0)%(f|0)|0)<<4)|0,e+(g<<4)|0,b)|0)==1){h=0;k=4;break}if((j|0)<(f|0)){g=j}else{h=1;k=4;break}}if((k|0)==4){i=d;return h|0}return 0}function MB(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0;g=i;j=d;d=i;i=i+8|0;c[d>>2]=c[j>>2];c[d+4>>2]=c[j+4>>2];j=1;k=0;l=i;i=i+168|0;c[l>>2]=0;while(1)switch(j|0){case 1:m=c[d>>2]|0;n=c[d+4>>2]|0;o=BF(177752,j,l)|0;j=9;break;case 9:if((o|0)==0){j=2;break}else{p=-1;j=8;break};case 2:q=e|0;r=+h[q>>3];s=e+8|0;t=+h[s>>3];w=r*r+t*t;if(w>1.0e-6){j=3;break}else{x=r;y=t;j=4;break};case 3:z=+ta(2,w);if((u|0)!=0&(v|0)!=0){k=CF(c[u>>2]|0,l)|0;if((k|0)>0){j=-1;break}else return 0}u=v=0;x=r/z;y=t/z;j=4;break;case 4:h[q>>3]=x;h[s>>3]=y;A=e+16|0;B=+h[A>>3];C=e+24|0;D=+h[C>>3];E=B*B+D*D;if(E>1.0e-6){j=5;break}else{F=B;G=D;j=6;break};case 5:z=+ta(2,E);if((u|0)!=0&(v|0)!=0){k=CF(c[u>>2]|0,l)|0;if((k|0)>0){j=-1;break}else return 0}u=v=0;F=B/z;G=D/z;j=6;break;case 6:h[A>>3]=F;h[C>>3]=G;c[44262]=0;ka(168,4);if((u|0)!=0&(v|0)!=0){k=CF(c[u>>2]|0,l)|0;if((k|0)>0){j=-1;break}else return 0}u=v=0;H=c[44262]|0;c[44262]=H+1;I=(c[44256]|0)+(H<<4)|0;H=m;c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];H=ra(2,a|0,b|0,m|0,n|0,+(+h[q>>3]),+(+h[s>>3]),+(+h[A>>3]),+(+h[C>>3]))|0;if((u|0)!=0&(v|0)!=0){k=CF(c[u>>2]|0,l)|0;if((k|0)>0){j=-1;break}else return 0}u=v=0;if((H|0)==-1){p=-1;j=8;break}else{j=7;break};case 7:c[f+4>>2]=c[44262];c[f>>2]=c[44256];p=0;j=8;break;case 8:i=g;return p|0;case-1:if((k|0)==1){o=v;j=9}u=v=0;break}return 0}function NB(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((c[44260]|0)>=(a|0)){i=b;return}d=c[44256]|0;do{if((d|0)==0){e=dF(a<<4)|0;c[44256]=e;if((e|0)!=0){break}gc(c[o>>2]|0,125472,(f=i,i=i+24|0,c[f>>2]=154064,c[f+8>>2]=531,c[f+16>>2]=123408,f)|0)|0;i=f;rc(177752,1)}else{e=gF(d,a<<4)|0;c[44256]=e;if((e|0)!=0){break}gc(c[o>>2]|0,125472,(f=i,i=i+24|0,c[f>>2]=154064,c[f+8>>2]=537,c[f+16>>2]=114304,f)|0)|0;i=f;rc(177752,1)}}while(0);c[44260]=a;i=b;return}function OB(a,b,d,e,f,g,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=+g;j=+j;k=+k;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0,oa=0.0,pa=0,qa=0.0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0.0;l=i;i=i+112|0;m=l|0;n=l+32|0;o=l+56|0;p=l+80|0;q=c[43786]|0;if((c[43788]|0)<(e|0)){do{if((q|0)==0){r=dF(e*40|0)|0;s=r;c[43786]=s;if((r|0)==0){t=-1}else{u=s;break}i=l;return t|0}else{s=gF(q,e*40|0)|0;r=s;c[43786]=r;if((s|0)==0){t=-1}else{u=r;break}i=l;return t|0}}while(0);c[43788]=e;v=u}else{v=q}h[v>>3]=0.0;q=(e|0)>1;do{if(q){u=1;w=0.0;do{r=u-1|0;x=+h[d+(r<<4)>>3]- +h[d+(u<<4)>>3];y=+h[d+(r<<4)+8>>3]- +h[d+(u<<4)+8>>3];w=w+ +T(x*x+y*y);h[v+(u*40|0)>>3]=w;u=u+1|0;}while((u|0)<(e|0));if(!q){break}u=v+((e-1|0)*40|0)|0;r=1;do{s=v+(r*40|0)|0;h[s>>3]=+h[s>>3]/+h[u>>3];r=r+1|0;}while((r|0)<(e|0))}}while(0);r=(e|0)>0;a:do{if(r){u=0;do{w=+h[v+(u*40|0)>>3];y=1.0-w;x=w*3.0;z=y*x*y;h[v+(u*40|0)+8>>3]=z*f;h[v+(u*40|0)+16>>3]=z*g;z=y*w*x;h[v+(u*40|0)+24>>3]=z*j;h[v+(u*40|0)+32>>3]=z*k;u=u+1|0;}while((u|0)<(e|0));if(!r){A=0.0;B=0.0;C=0.0;D=0.0;E=0.0;break}z=+h[d>>3];x=+h[d+8>>3];u=e-1|0;w=+h[d+(u<<4)>>3];y=+h[d+(u<<4)+8>>3];F=0.0;G=0.0;H=0.0;I=0.0;J=0.0;u=0;K=z;L=x;while(1){M=+h[v+(u*40|0)+8>>3];N=+h[v+(u*40|0)+16>>3];O=H+(M*M+N*N);P=+h[v+(u*40|0)+24>>3];Q=+h[v+(u*40|0)+32>>3];R=I+(M*P+N*Q);S=J+(P*P+Q*Q);U=+h[v+(u*40|0)>>3];V=1.0-U;W=V*V*(V+U*3.0);X=U*U*(U+V*3.0);V=K-(z*W+w*X);U=L-(x*W+y*X);X=G+(M*V+N*U);N=F+(P*V+Q*U);s=u+1|0;if((s|0)>=(e|0)){A=N;B=X;C=O;D=R;E=S;break a}F=N;G=X;H=O;I=R;J=S;u=s;K=+h[d+(s<<4)>>3];L=+h[d+(s<<4)+8>>3]}}else{A=0.0;B=0.0;C=0.0;D=0.0;E=0.0}}while(0);L=E*C-D*D;v=L>=0.0;if(v){Y=L}else{Y=-0.0-L}if(Y<1.0e-6){Z=0.0;_=0.0}else{Z=(C*A-D*B)/L;_=(E*B-D*A)/L}if(v){$=L}else{$=-0.0-L}v=e-1|0;L=+h[d>>3];A=+h[d+8>>3];D=+h[d+(v<<4)>>3];B=+h[d+(v<<4)+8>>3];if($>=1.0e-6&_>0.0&Z>0.0){aa=Z;ba=_}else{_=D-L;Z=B-A;$=+T(_*_+Z*Z)/3.0;aa=$;ba=$}r=d|0;u=d+8|0;$=ba*f;Z=ba*g;ba=aa*j;_=aa*k;s=(e|0)==2;ca=(b|0)>0;da=m|0;ea=m+24|0;fa=m+16|0;ga=m+8|0;m=n|0;ha=o|0;aa=L*3.0;E=A*3.0;ia=1;C=4.0;Y=4.0;b:while(1){ja=L+$*Y/3.0;ka=A+Z*Y/3.0;la=D-ba*C/3.0;ma=B-_*C/3.0;if(ia){K=ja-L;J=ka-A;I=la-ja;H=ma-ka;G=D-la;F=B-ma;y=+T(K*K+J*J)+0.0+ +T(I*I+H*H)+ +T(G*G+F*F);if(q){na=1;F=0.0;G=+h[r>>3];H=+h[u>>3];while(1){I=+h[d+(na<<4)>>3];J=I-G;K=+h[d+(na<<4)+8>>3];x=K-H;oa=F+ +T(J*J+x*x);pa=na+1|0;if((pa|0)<(e|0)){na=pa;F=oa;G=I;H=K}else{break}}qa=oa+-.001}else{qa=-.001}if(y<qa){break}}if(!ca){ra=71;break}H=la*3.0;G=D+ja*3.0-(L+H);F=aa+H-ja*6.0;H=(ja-L)*3.0;K=ma*3.0;I=B+ka*3.0-(A+K);x=E+K-ka*6.0;K=(ka-A)*3.0;na=0;c:while(1){J=+h[a+(na<<5)>>3];w=+h[a+(na<<5)+8>>3];z=+h[a+(na<<5)+16>>3];S=+h[a+(na<<5)+24>>3];R=z-J;O=S-w;d:do{if(R==0.0){h[ea>>3]=G;h[fa>>3]=F;h[ga>>3]=H;h[da>>3]=L-J;pa=XB(da,m)|0;if(O!=0.0){if((pa|0)==4){sa=4;break}if((pa|0)>0){ta=0;ua=0}else{sa=0;break}while(1){X=+h[n+(ua<<3)>>3];do{if(X>=0.0&X<=1.0){h[ea>>3]=I;h[fa>>3]=x;h[ga>>3]=K;h[da>>3]=A;N=(A+X*(K+X*(x+I*X))-w)/O;if(!(N>=0.0&N<=1.0)){va=ta;break}h[p+(ta<<3)>>3]=X;va=ta+1|0}else{va=ta}}while(0);wa=ua+1|0;if((wa|0)<(pa|0)){ta=va;ua=wa}else{sa=va;break d}}}h[ea>>3]=I;h[fa>>3]=x;h[ga>>3]=K;h[da>>3]=A-w;wa=XB(da,ha)|0;xa=(wa|0)==4;if((pa|0)==4){if(xa){sa=4;break}if((wa|0)>0){ya=0;za=0}else{sa=0;break}while(1){X=+h[o+(za<<3)>>3];if(X>=0.0&X<=1.0){h[p+(ya<<3)>>3]=X;Aa=ya+1|0}else{Aa=ya}Ba=za+1|0;if((Ba|0)<(wa|0)){ya=Aa;za=Ba}else{sa=Aa;break d}}}Ba=(pa|0)>0;if(xa){if(Ba){Ca=0;Da=0}else{sa=0;break}while(1){X=+h[n+(Da<<3)>>3];if(X>=0.0&X<=1.0){h[p+(Ca<<3)>>3]=X;Ea=Ca+1|0}else{Ea=Ca}Fa=Da+1|0;if((Fa|0)<(pa|0)){Ca=Ea;Da=Fa}else{sa=Ea;break d}}}if(Ba&(wa|0)>0){Ga=0;Ha=0}else{sa=0;break}while(1){X=+h[n+(Ha<<3)>>3];if(X>=0.0&X<=1.0){xa=Ga;Fa=0;while(1){if(X==+h[o+(Fa<<3)>>3]){h[p+(xa<<3)>>3]=X;Ia=xa+1|0}else{Ia=xa}Ja=Fa+1|0;if((Ja|0)<(wa|0)){xa=Ia;Fa=Ja}else{Ka=Ia;break}}}else{Ka=Ga}Fa=Ha+1|0;if((Fa|0)<(pa|0)){Ga=Ka;Ha=Fa}else{sa=Ka;break}}}else{X=O/R;N=A-L*X;U=ka-ja*X;Q=(ma-la*X)*3.0;h[ea>>3]=B-D*X+U*3.0-(N+Q);h[fa>>3]=N*3.0+Q-U*6.0;h[ga>>3]=(U-N)*3.0;h[da>>3]=J*X-w+N;pa=XB(da,m)|0;if((pa|0)==4){sa=4;break}if((pa|0)>0){La=0;Ma=0}else{sa=0;break}while(1){N=+h[n+(Ma<<3)>>3];do{if(N>=0.0&N<=1.0){h[ea>>3]=G;h[fa>>3]=F;h[ga>>3]=H;h[da>>3]=L;X=(L+N*(H+N*(F+G*N))-J)/R;if(!(X>=0.0&X<=1.0)){Na=La;break}h[p+(La<<3)>>3]=N;Na=La+1|0}else{Na=La}}while(0);wa=Ma+1|0;if((wa|0)<(pa|0)){La=Na;Ma=wa}else{sa=Na;break}}}}while(0);if((sa|0)!=4&(sa|0)>0){pa=0;do{R=+h[p+(pa<<3)>>3];do{if(!(R<1.0e-6|R>.999999)){O=R*R*R;N=R*3.0;X=1.0-R;U=X*R*N;Q=X*N*X;N=X*X*X;X=D*O+(la*U+(L*N+ja*Q));V=B*O+(ma*U+(A*N+ka*Q));Q=X-J;N=V-w;if(Q*Q+N*N<.001){break}N=X-z;X=V-S;if(N*N+X*X>=.001){break c}}}while(0);pa=pa+1|0;}while((pa|0)<(sa|0))}pa=na+1|0;if((pa|0)<(b|0)){na=pa}else{ra=71;break b}}if(Y==0.0&C==0.0){ra=73;break}if(Y<=.01){ia=0;C=0.0;Y=0.0;continue}ia=0;C=C*.5;Y=Y*.5}if((ra|0)==71){NB((c[44262]|0)+4|0);ia=c[44256]|0;sa=c[44262]|0;h[ia+(sa<<4)>>3]=ja;p=sa+1|0;h[ia+(sa<<4)+8>>3]=ka;h[ia+(p<<4)>>3]=la;Na=sa+2|0;h[ia+(p<<4)+8>>3]=ma;h[ia+(Na<<4)>>3]=D;h[ia+(Na<<4)+8>>3]=B;c[44262]=sa+3;t=0;i=l;return t|0}do{if((ra|0)==73){if(!s){break}NB((c[44262]|0)+4|0);sa=c[44256]|0;Na=c[44262]|0;h[sa+(Na<<4)>>3]=ja;ia=Na+1|0;h[sa+(Na<<4)+8>>3]=ka;h[sa+(ia<<4)>>3]=la;p=Na+2|0;h[sa+(ia<<4)+8>>3]=ma;h[sa+(p<<4)>>3]=D;h[sa+(p<<4)+8>>3]=B;c[44262]=Na+3;t=0;i=l;return t|0}}while(0);ma=L+$*.3333333333333333;$=Z*.3333333333333333+A;Z=D-ba*.3333333333333333;ba=B-_*.3333333333333333;if((v|0)>1){s=c[43786]|0;_=-1.0;ra=-1;Na=1;while(1){la=+h[s+(Na*40|0)>>3];ka=1.0-la;ja=ka*ka*ka;Y=la*3.0;C=ka*Y*ka;E=ka*la*Y;Y=la*la*la;la=+h[d+(Na<<4)>>3]-(D*Y+(Z*E+(L*ja+ma*C)));ka=+h[d+(Na<<4)+8>>3]-(B*Y+(ba*E+(A*ja+$*C)));C=+T(la*la+ka*ka);p=C>_;sa=p?Na:ra;ia=Na+1|0;if((ia|0)<(v|0)){_=p?C:_;ra=sa;Na=ia}else{Oa=sa;break}}}else{Oa=-1}Na=d+(Oa<<4)|0;ra=Oa-1|0;_=+h[Na>>3];$=+h[d+(Oa<<4)+8>>3];A=_- +h[d+(ra<<4)>>3];ba=$- +h[d+(ra<<4)+8>>3];B=A*A+ba*ba;if(B>1.0e-6){ma=+T(B);Pa=A/ma;Qa=ba/ma}else{Pa=A;Qa=ba}ra=Oa+1|0;ba=+h[d+(ra<<4)>>3]-_;_=+h[d+(ra<<4)+8>>3]-$;$=ba*ba+_*_;if($>1.0e-6){A=+T($);Ra=ba/A;Sa=_/A}else{Ra=ba;Sa=_}_=Pa+Ra;Ra=Qa+Sa;Sa=Ra*Ra+_*_;if(Sa>1.0e-6){Qa=+T(Sa);Ta=_/Qa;Ua=Ra/Qa}else{Ta=_;Ua=Ra}OB(a,b,d,ra,f,g,Ta,Ua)|0;OB(a,b,Na,e-Oa|0,Ta,Ua,j,k)|0;t=0;i=l;return t|0}function PB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0,G=0,H=0,I=0.0,J=0,K=0,L=0.0,M=0.0,N=0,O=0.0,P=0.0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0.0,ia=0.0,ja=0.0,na=0.0,oa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0,ua=0.0,va=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0.0,Ca=0.0,Da=0.0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0.0,Ja=0.0,Ka=0.0,La=0,Ma=0,Na=0.0,Oa=0.0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0.0,Va=0.0,Wa=0.0,Xa=0.0,Ya=0.0,Za=0.0,_a=0.0,$a=0.0,ab=0.0,bb=0.0,cb=0.0,db=0.0,eb=0.0,fb=0.0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0;e=i;i=i+16|0;f=1;g=0;j=i;i=i+168|0;c[j>>2]=0;while(1)switch(f|0){case 1:k=e|0;l=BF(177592,f,j)|0;f=150;break;case 150:if((l|0)==0){f=2;break}else{m=-2;f=149;break};case 2:n=a+4|0;p=c[n>>2]|0;if((c[44104]|0)<(p|0)){f=3;break}else{f=13;break};case 3:q=c[44100]|0;if((q|0)==0){f=4;break}else{f=8;break};case 4:r=ma(6,p<<3|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[44100]=r;if((r|0)==0){f=5;break}else{f=6;break};case 5:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=523,c[s+16>>2]=81032,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;la(40,177592,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 6:r=ma(6,p<<2|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[44102]=r;if((r|0)==0){f=7;break}else{f=12;break};case 7:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=527,c[s+16>>2]=167232,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;la(40,177592,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 8:r=wa(202,q|0,p<<3|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[44100]=r;if((r|0)==0){f=9;break}else{f=10;break};case 9:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=533,c[s+16>>2]=163024,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;la(40,177592,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 10:r=wa(202,c[44102]|0,p<<2|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[44102]=r;if((r|0)==0){f=11;break}else{f=12;break};case 11:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=539,c[s+16>>2]=158976,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;la(40,177592,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 12:c[44104]=p;f=13;break;case 13:c[44106]=0;c[43660]=0;w=c[n>>2]|0;x=w<<1;r=c[45178]|0;if((r|0)<(x|0)){f=14;break}else{y=r;f=20;break};case 14:z=c[45180]|0;if((z|0)==0){f=15;break}else{f=17;break};case 15:r=ma(6,w<<3|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[45180]=r;if((r|0)==0){f=16;break}else{f=19;break};case 16:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=573,c[s+16>>2]=90928,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;la(40,177592,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 17:r=wa(202,z|0,w<<3|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[45180]=r;if((r|0)==0){f=18;break}else{f=19;break};case 18:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=580,c[s+16>>2]=85648,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;la(40,177592,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 19:c[45178]=x;y=x;f=20;break;case 20:r=(y|0)/2|0;c[45176]=r;c[45174]=r-1;A=c[n>>2]|0;B=(A|0)>0;C=a|0;D=c[C>>2]|0;if(B){E=t;F=-1;G=0;f=21;break}else{H=-1;f=22;break};case 21:I=+h[D+(G<<4)>>3];r=E>I;J=r?G:F;K=G+1|0;if((K|0)<(A|0)){E=r?I:E;F=J;G=K;f=21;break}else{H=J;f=22;break};case 22:L=+h[D+(H<<4)>>3];M=+h[D+(H<<4)+8>>3];N=((H|0)==0?A:H)-1|0;O=+h[D+(N<<4)>>3];J=(H|0)==(A-1|0)?0:H+1|0;P=+h[D+(J<<4)>>3];Q=+h[D+(J<<4)+8>>3];if(O==L&L==P&Q>M){f=25;break}else{f=23;break};case 23:if((P-L)*(+h[D+(N<<4)+8>>3]-M)-(O-L)*(Q-M)>0.0){f=24;break}else{f=25;break};case 24:if(B){R=0;S=A;f=32;break}else{f=37;break};case 25:if(B){T=A;U=A;f=26;break}else{f=37;break};case 26:V=T-1|0;W=c[C>>2]|0;if((T|0)>(U-1|0)){f=31;break}else{f=27;break};case 27:if(+h[W+(V<<4)>>3]==+h[W+(T<<4)>>3]){f=28;break}else{f=31;break};case 28:if(+h[W+(V<<4)+8>>3]==+h[W+(T<<4)+8>>3]){f=29;break}else{f=31;break};case 29:if((V|0)>0){f=30;break}else{f=37;break};case 30:T=V;U=c[n>>2]|0;f=26;break;case 31:c[(c[44100]|0)+(c[44106]<<3)>>2]=W+(V<<4);J=c[44106]|0;K=c[44100]|0;c[K+(J<<3)+4>>2]=K+(((J|0)%(c[n>>2]|0)|0)<<3);J=c[44106]|0;c[(c[44102]|0)+(J<<2)>>2]=(c[44100]|0)+(J<<3);c[44106]=(c[44106]|0)+1;f=29;break;case 32:X=c[C>>2]|0;if((R|0)>0){f=33;break}else{f=35;break};case 33:Y=R-1|0;if(+h[X+(R<<4)>>3]==+h[X+(Y<<4)>>3]){f=34;break}else{f=35;break};case 34:if(+h[X+(R<<4)+8>>3]==+h[X+(Y<<4)+8>>3]){Z=S;f=36;break}else{f=35;break};case 35:c[(c[44100]|0)+(c[44106]<<3)>>2]=X+(R<<4);J=c[44106]|0;K=c[44100]|0;c[K+(J<<3)+4>>2]=K+(((J|0)%(c[n>>2]|0)|0)<<3);J=c[44106]|0;c[(c[44102]|0)+(J<<2)>>2]=(c[44100]|0)+(J<<3);c[44106]=(c[44106]|0)+1;Z=c[n>>2]|0;f=36;break;case 36:J=R+1|0;if((J|0)<(Z|0)){R=J;S=Z;f=32;break}else{f=37;break};case 37:_=c[44102]|0;J=c[44106]|0;if((J|0)>3){$=J;f=39;break}else{f=74;break};case 38:if((aa|0)>3){$=aa;f=39;break}else{f=74;break};case 39:aa=$-1|0;ba=0;f=40;break;case 40:ca=ba+1|0;da=(ca|0)==($|0)?0:ca;ea=(ba+2|0)%($|0)|0;J=c[c[_+(((ba+aa|0)%($|0)|0)<<2)>>2]>>2]|0;fa=c[_+(ba<<2)>>2]|0;K=c[fa>>2]|0;ga=c[_+(da<<2)>>2]|0;r=c[ga>>2]|0;ha=+h[J>>3];ia=+h[J+8>>3];ja=+h[K>>3];na=+h[K+8>>3];oa=+h[r>>3];qa=+h[r+8>>3];ra=oa-ja;sa=qa-na;ta=c[_+(ea<<2)>>2]|0;r=c[ta>>2]|0;ua=+h[r>>3];va=+h[r+8>>3];xa=na-va;if((ia-na)*ra-(ha-ja)*sa>0.0){f=41;break}else{f=43;break};case 41:if((ha-ua)*xa-(ja-ua)*(ia-va)>0.0){f=42;break}else{f=45;break};case 42:I=va-na;ya=ua-ja;if(ra*I-sa*ya>0.0){za=ya;Aa=I;f=46;break}else{f=45;break};case 43:I=(oa-ua)*xa-(ja-ua)*(qa-va);if(I<=0.0&I<0.0){f=44;break}else{f=45;break};case 44:za=ua-ja;Aa=va-na;f=46;break;case 45:if((ca|0)<($|0)){ba=ca;f=40;break}else{f=73;break};case 46:Ca=ja-ua;Da=za*za+Aa*Aa;Ea=0;f=47;break;case 47:Fa=Ea+1|0;Ga=(Fa|0)==($|0)?0:Fa;if((Ea|0)==(ba|0)|(Ga|0)==(ba|0)|(Ea|0)==(ea|0)|(Ga|0)==(ea|0)){f=48;break}else{f=49;break};case 48:if((Fa|0)<($|0)){Ea=Fa;f=47;break}else{f=71;break};case 49:r=c[c[_+(Ea<<2)>>2]>>2]|0;Ha=c[c[_+(Ga<<2)>>2]>>2]|0;Ia=+h[r>>3];Ja=+h[r+8>>3];Ka=xa*(Ia-ua)-Ca*(Ja-va);La=Ka>0.0;Ma=Ka>=0.0;if(Ma&(La^1)){f=53;break}else{f=50;break};case 50:Na=+h[Ha>>3];Oa=+h[Ha+8>>3];Pa=xa*(Na-ua)-Ca*(Oa-va);if(Pa<=0.0&Pa>=0.0){f=53;break}else{f=51;break};case 51:Qa=Ja-Oa;Ra=Ia-Na;Sa=(ja-Na)*Qa-Ra*(na-Oa);if(Sa<=0.0&Sa>=0.0){f=53;break}else{f=52;break};case 52:Ta=(ua-Na)*Qa-Ra*(va-Oa);if(Ta<=0.0&Ta>=0.0){f=53;break}else{f=65;break};case 53:Ua=Ia-ja;Va=Ja-na;if(Ka<=0.0&Ma){f=54;break}else{f=56;break};case 54:if(za*Ua+Aa*Va<0.0){f=56;break}else{f=55;break};case 55:if(Ua*Ua+Va*Va>Da){f=56;break}else{f=45;break};case 56:Wa=+h[Ha>>3];Xa=+h[Ha+8>>3];Ya=Wa-ja;Za=Xa-na;I=xa*(Wa-ua)-Ca*(Xa-va);if(I<=0.0&I>=0.0){f=57;break}else{f=59;break};case 57:if(za*Ya+Aa*Za<0.0){f=59;break}else{f=58;break};case 58:if(Ya*Ya+Za*Za>Da){f=59;break}else{f=45;break};case 59:_a=Wa-Ia;$a=Xa-Ja;ab=ja-Ia;bb=na-Ja;cb=Ja-Xa;db=Ia-Wa;I=(ja-Wa)*cb-db*(na-Xa);if(I<=0.0&I>=0.0){f=60;break}else{f=62;break};case 60:if(ab*_a+bb*$a<0.0){f=62;break}else{f=61;break};case 61:if(ab*ab+bb*bb>_a*_a+$a*$a){f=62;break}else{f=45;break};case 62:eb=ua-Ia;fb=va-Ja;I=(ua-Wa)*cb-db*(va-Xa);if(I<=0.0&I>=0.0){f=63;break}else{f=48;break};case 63:if(eb*_a+fb*$a<0.0){f=48;break}else{f=64;break};case 64:if(eb*eb+fb*fb>_a*_a+$a*$a){f=48;break}else{f=45;break};case 65:gb=Pa>0.0;if(Sa>0.0){hb=1;f=67;break}else{f=66;break};case 66:hb=Sa<0.0?2:3;f=67;break;case 67:if(Ta>0.0){ib=1;f=69;break}else{f=68;break};case 68:ib=Ta<0.0?2:3;f=69;break;case 69:if(La^gb){f=70;break}else{f=48;break};case 70:if((hb|0)==1^(ib|0)==1){f=45;break}else{f=48;break};case 71:Ba(58,fa|0,ga|0,ta|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((da|0)<(aa|0)){jb=da;f=72;break}else{f=38;break};case 72:r=jb+1|0;c[_+(jb<<2)>>2]=c[_+(r<<2)>>2];if((r|0)<(aa|0)){jb=r;f=72;break}else{f=38;break};case 73:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=324,c[s+16>>2]=155376,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;f=75;break;case 74:Ba(58,c[_>>2]|0,c[_+4>>2]|0,c[_+8>>2]|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;f=75;break;case 75:r=c[43660]|0;if((r|0)>0){kb=0;lb=r;f=78;break}else{mb=0;nb=r;ob=0;f=102;break};case 76:if((pb|0)<(qb|0)){kb=pb;lb=qb;f=78;break}else{f=77;break};case 77:rb=(qb|0)>0;if(rb){sb=0;f=101;break}else{mb=0;nb=qb;ob=0;f=102;break};case 78:pb=kb+1|0;if((pb|0)<(lb|0)){tb=pb;f=79;break}else{qb=lb;f=76;break};case 79:ub=0;f=80;break;case 80:vb=c[43656]|0;wb=vb+(kb*52|0)|0;xb=vb+(tb*52|0)|0;yb=c[c[vb+(kb*52|0)+4+(ub<<4)>>2]>>2]|0;zb=c[c[vb+(tb*52|0)+4>>2]>>2]|0;if((yb|0)==(zb|0)){f=82;break}else{f=81;break};case 81:Ab=c[c[vb+(tb*52|0)+8>>2]>>2]|0;f=83;break;case 82:r=c[c[vb+(tb*52|0)+8>>2]>>2]|0;if((c[c[vb+(kb*52|0)+4+(ub<<4)+4>>2]>>2]|0)==(r|0)){f=85;break}else{Ab=r;f=83;break};case 83:if((yb|0)==(Ab|0)){f=84;break}else{Bb=vb;Cb=yb;f=86;break};case 84:if((c[c[vb+(kb*52|0)+4+(ub<<4)+4>>2]>>2]|0)==(zb|0)){f=85;break}else{Bb=vb;Cb=yb;f=86;break};case 85:c[vb+(kb*52|0)+4+(ub<<4)+12>>2]=xb;c[vb+(tb*52|0)+16>>2]=wb;r=c[43656]|0;Bb=r;Cb=c[c[r+(kb*52|0)+4+(ub<<4)>>2]>>2]|0;f=86;break;case 86:Db=Bb+(kb*52|0)|0;Eb=Bb+(tb*52|0)|0;Fb=c[c[Bb+(tb*52|0)+20>>2]>>2]|0;if((Cb|0)==(Fb|0)){f=88;break}else{f=87;break};case 87:Gb=c[c[Bb+(tb*52|0)+24>>2]>>2]|0;f=89;break;case 88:r=c[c[Bb+(tb*52|0)+24>>2]>>2]|0;if((c[c[Bb+(kb*52|0)+4+(ub<<4)+4>>2]>>2]|0)==(r|0)){f=91;break}else{Gb=r;f=89;break};case 89:if((Cb|0)==(Gb|0)){f=90;break}else{Hb=Bb;Ib=Cb;f=92;break};case 90:if((c[c[Bb+(kb*52|0)+4+(ub<<4)+4>>2]>>2]|0)==(Fb|0)){f=91;break}else{Hb=Bb;Ib=Cb;f=92;break};case 91:c[Bb+(kb*52|0)+4+(ub<<4)+12>>2]=Eb;c[Bb+(tb*52|0)+32>>2]=Db;r=c[43656]|0;Hb=r;Ib=c[c[r+(kb*52|0)+4+(ub<<4)>>2]>>2]|0;f=92;break;case 92:Jb=Hb+(kb*52|0)|0;Kb=Hb+(tb*52|0)|0;Lb=c[c[Hb+(tb*52|0)+36>>2]>>2]|0;if((Ib|0)==(Lb|0)){f=94;break}else{f=93;break};case 93:Mb=c[c[Hb+(tb*52|0)+40>>2]>>2]|0;f=95;break;case 94:r=c[c[Hb+(tb*52|0)+40>>2]>>2]|0;if((c[c[Hb+(kb*52|0)+4+(ub<<4)+4>>2]>>2]|0)==(r|0)){f=97;break}else{Mb=r;f=95;break};case 95:if((Ib|0)==(Mb|0)){f=96;break}else{f=98;break};case 96:if((c[c[Hb+(kb*52|0)+4+(ub<<4)+4>>2]>>2]|0)==(Lb|0)){f=97;break}else{f=98;break};case 97:c[Hb+(kb*52|0)+4+(ub<<4)+12>>2]=Kb;c[Hb+(tb*52|0)+48>>2]=Jb;f=98;break;case 98:r=ub+1|0;if((r|0)<3){ub=r;f=80;break}else{f=99;break};case 99:r=tb+1|0;K=c[43660]|0;if((r|0)<(K|0)){tb=r;f=79;break}else{qb=K;f=76;break};case 100:if((Nb|0)<(qb|0)){sb=Nb;f=101;break}else{mb=Nb;nb=qb;ob=rb;f=102;break};case 101:K=wa(168,sb|0,b|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;Nb=sb+1|0;if((K|0)==0){f=100;break}else{mb=sb;nb=qb;ob=rb;f=102;break};case 102:if((mb|0)==(nb|0)){f=104;break}else{f=103;break};case 103:Ob=b+16|0;if(ob){Pb=0;f=106;break}else{Qb=0;f=107;break};case 104:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=192,c[s+16>>2]=119192,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;m=-1;f=149;break;case 105:if((Rb|0)<(nb|0)){Pb=Rb;f=106;break}else{Qb=Rb;f=107;break};case 106:K=wa(168,Pb|0,Ob|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;Rb=Pb+1|0;if((K|0)==0){f=105;break}else{Qb=Pb;f=107;break};case 107:if((Qb|0)==(nb|0)){f=108;break}else{f=109;break};case 108:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=200,c[s+16>>2]=110712,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;m=-1;f=149;break;case 109:K=wa(182,mb|0,Qb|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((K|0)==0){f=110;break}else{f=111;break};case 110:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=207,c[s+16>>2]=107328,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;ka(68,2);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[d+4>>2]=2;K=c[44254]|0;r=K;J=b;c[r>>2]=c[J>>2];c[r+4>>2]=c[J+4>>2];c[r+8>>2]=c[J+8>>2];c[r+12>>2]=c[J+12>>2];J=K+16|0;r=Ob;c[J>>2]=c[r>>2];c[J+4>>2]=c[r+4>>2];c[J+8>>2]=c[r+8>>2];c[J+12>>2]=c[r+12>>2];c[d>>2]=K;m=0;f=149;break;case 111:if((mb|0)==(Qb|0)){f=112;break}else{f=113;break};case 112:ka(68,2);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[d+4>>2]=2;K=c[44254]|0;r=K;J=b;c[r>>2]=c[J>>2];c[r+4>>2]=c[J+4>>2];c[r+8>>2]=c[J+8>>2];c[r+12>>2]=c[J+12>>2];J=K+16|0;r=Ob;c[J>>2]=c[r>>2];c[J+4>>2]=c[r+4>>2];c[J+8>>2]=c[r+8>>2];c[J+12>>2]=c[r+12>>2];c[d>>2]=K;m=0;f=149;break;case 113:Sb=k|0;c[k>>2]=b;Tb=k+4|0;c[Tb>>2]=0;Ub=k+8|0;c[Ub>>2]=Ob;c[k+12>>2]=0;Vb=c[45176]|0;Wb=c[45180]|0;if(((c[45174]|0)-Vb|0)>-1){f=114;break}else{f=115;break};case 114:c[Tb>>2]=c[Wb+(Vb<<2)>>2];f=115;break;case 115:K=Vb-1|0;c[45176]=K;c[Wb+(K<<2)>>2]=Sb;c[45172]=c[45176];if((mb|0)==-1){Xb=0;Yb=Ub;f=145;break}else{f=116;break};case 116:Zb=Ob|0;_b=b+24|0;$b=mb;f=117;break;case 117:ac=c[43656]|0;c[ac+($b*52|0)>>2]=2;bc=0;f=118;break;case 118:cc=c[ac+($b*52|0)+4+(bc<<4)+12>>2]|0;if((cc|0)==0){f=120;break}else{f=119;break};case 119:if((c[cc>>2]|0)==1){dc=bc;f=121;break}else{f=120;break};case 120:K=bc+1|0;if((K|0)<3){bc=K;f=118;break}else{dc=K;f=121;break};case 121:if((dc|0)==3){f=122;break}else{f=123;break};case 122:K=c[45180]|0;r=c[c[K+(c[45176]<<2)>>2]>>2]|0;J=c[K+(c[45174]<<2)>>2]|0;K=c[J>>2]|0;I=+h[r>>3];ya=+h[r+8>>3];r=(+h[_b>>3]-ya)*(+h[K>>3]-I)-(+h[Zb>>3]-I)*(+h[K+8>>3]-ya)>0.0;ec=r?Ub:J;fc=r?J:Ub;f=125;break;case 123:gc=c[ac+($b*52|0)+4+(dc<<4)>>2]|0;J=c[gc>>2]|0;r=c[c[ac+($b*52|0)+4+(((dc+1|0)%3|0)<<4)+4>>2]>>2]|0;hc=c[ac+($b*52|0)+4+(dc<<4)+4>>2]|0;K=c[hc>>2]|0;ya=+h[r>>3];I=+h[r+8>>3];if((+h[J+8>>3]-I)*(+h[K>>3]-ya)-(+h[J>>3]-ya)*(+h[K+8>>3]-I)>0.0){ec=gc;fc=hc;f=125;break}else{f=124;break};case 124:ec=hc;fc=gc;f=125;break;case 125:if(($b|0)==(mb|0)){f=126;break}else{f=131;break};case 126:ic=c[45174]|0;if((ic-(c[45176]|0)|0)>-1){f=127;break}else{jc=ic;f=128;break};case 127:c[fc+4>>2]=c[(c[45180]|0)+(ic<<2)>>2];jc=c[45174]|0;f=128;break;case 128:K=jc+1|0;c[45174]=K;c[(c[45180]|0)+(K<<2)>>2]=fc;kc=c[45176]|0;if(((c[45174]|0)-kc|0)>-1){f=129;break}else{lc=kc;f=130;break};case 129:c[ec+4>>2]=c[(c[45180]|0)+(kc<<2)>>2];lc=c[45176]|0;f=130;break;case 130:K=lc-1|0;c[45176]=K;c[(c[45180]|0)+(K<<2)>>2]=ec;mc=0;f=141;break;case 131:nc=c[45176]|0;oc=c[45180]|0;if((c[oc+(nc<<2)>>2]|0)==(ec|0)){f=137;break}else{f=132;break};case 132:pc=c[45174]|0;if((c[oc+(pc<<2)>>2]|0)==(ec|0)){f=137;break}else{f=133;break};case 133:qc=ma(8,ec|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[45176]=qc;if((pc-qc|0)>-1){f=134;break}else{rc=qc;sc=oc;f=135;break};case 134:c[ec+4>>2]=c[oc+(qc<<2)>>2];rc=c[45176]|0;sc=c[45180]|0;f=135;break;case 135:K=rc-1|0;c[45176]=K;c[sc+(K<<2)>>2]=ec;if((qc|0)>(c[45172]|0)){f=136;break}else{mc=0;f=141;break};case 136:c[45172]=qc;mc=0;f=141;break;case 137:tc=ma(8,fc|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[45174]=tc;if((tc-nc|0)>-1){f=138;break}else{uc=tc;vc=oc;f=139;break};case 138:c[fc+4>>2]=c[oc+(tc<<2)>>2];uc=c[45174]|0;vc=c[45180]|0;f=139;break;case 139:K=uc+1|0;c[45174]=K;c[vc+(K<<2)>>2]=fc;if((tc|0)<(c[45172]|0)){f=140;break}else{mc=0;f=141;break};case 140:c[45172]=tc;mc=0;f=141;break;case 141:wc=c[ac+($b*52|0)+4+(mc<<4)+12>>2]|0;if((wc|0)==0){f=144;break}else{f=142;break};case 142:if((c[wc>>2]|0)==1){f=143;break}else{f=144;break};case 143:K=wc-(c[43656]|0)|0;if((K|0)==-52){Xb=0;Yb=Ub;f=145;break}else{$b=(K|0)/52|0;f=117;break};case 144:K=mc+1|0;if((K|0)<3){mc=K;f=141;break}else{Xb=0;Yb=Ub;f=145;break};case 145:xc=Xb+1|0;K=c[Yb+4>>2]|0;if((K|0)==0){f=146;break}else{Xb=xc;Yb=K;f=145;break};case 146:ka(68,xc|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[d+4>>2]=xc;yc=c[44254]|0;zc=Ub;Ac=Xb;f=147;break;case 147:K=yc+(Ac<<4)|0;J=c[zc>>2]|0;c[K>>2]=c[J>>2];c[K+4>>2]=c[J+4>>2];c[K+8>>2]=c[J+8>>2];c[K+12>>2]=c[J+12>>2];J=c[zc+4>>2]|0;if((J|0)==0){f=148;break}else{zc=J;Ac=Ac-1|0;f=147;break};case 148:c[d>>2]=yc;m=0;f=149;break;case 149:i=e;return m|0;case-1:if((g|0)==1){l=v;f=150}u=v=0;break}return 0}function QB(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0;d=c[43656]|0;e=+h[b>>3];f=+h[b+8>>3];b=c[c[d+(a*52|0)+4>>2]>>2]|0;g=c[c[d+(a*52|0)+8>>2]>>2]|0;i=+h[g>>3];j=+h[g+8>>3];k=(+h[b+8>>3]-j)*(e-i)-(+h[b>>3]-i)*(f-j);if(k>0.0){l=1}else{l=k>=0.0|0}b=c[c[d+(a*52|0)+20>>2]>>2]|0;g=c[c[d+(a*52|0)+24>>2]>>2]|0;k=+h[g>>3];j=+h[g+8>>3];i=(+h[b+8>>3]-j)*(e-k)-(+h[b>>3]-k)*(f-j);if(i>0.0){m=1}else{m=i>=0.0|0}b=c[c[d+(a*52|0)+36>>2]>>2]|0;g=c[c[d+(a*52|0)+40>>2]>>2]|0;i=+h[g>>3];j=+h[g+8>>3];k=(+h[b+8>>3]-j)*(e-i)-(+h[b>>3]-i)*(f-j);if(k>0.0){n=1}else{n=k>=0.0|0}b=n+(m+l)|0;if((b|0)==3){o=1;return o|0}o=(b|0)==0|0;return o|0}function RB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=(c[43656]|0)+(a*52|0)|0;if((c[d>>2]|0)!=0){e=0;return e|0}c[d>>2]=1;if((a|0)==(b|0)){e=1;return e|0}d=0;f=c[43656]|0;while(1){g=c[f+(a*52|0)+4+(d<<4)+12>>2]|0;if((g|0)==0){h=f}else{if((RB((g-f|0)/52|0,b)|0)!=0){e=1;i=9;break}h=c[43656]|0}g=d+1|0;if((g|0)<3){d=g;f=h}else{break}}if((i|0)==9){return e|0}c[h+(a*52|0)>>2]=0;e=0;return e|0}function SB(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((c[44258]|0)>=(a|0)){i=b;return}d=c[44254]|0;do{if((d|0)==0){e=dF(a<<4)|0;c[44254]=e;if((e|0)!=0){break}gc(c[o>>2]|0,96136,(f=i,i=i+24|0,c[f>>2]=141896,c[f+8>>2]=593,c[f+16>>2]=101744,f)|0)|0;i=f;rc(177592,1)}else{e=gF(d,a<<4)|0;c[44254]=e;if((e|0)!=0){break}gc(c[o>>2]|0,96136,(f=i,i=i+24|0,c[f>>2]=141896,c[f+8>>2]=599,c[f+16>>2]=98176,f)|0)|0;i=f;rc(177592,1)}}while(0);c[44258]=a;i=b;return}function TB(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0;b=c[45172]|0;d=c[45180]|0;e=a|0;a=c[45176]|0;while(1){if((a|0)>=(b|0)){break}f=a+1|0;g=c[c[d+(f<<2)>>2]>>2]|0;i=c[c[d+(a<<2)>>2]>>2]|0;j=c[e>>2]|0;k=+h[i>>3];l=+h[i+8>>3];if((+h[g+8>>3]-l)*(+h[j>>3]-k)-(+h[g>>3]-k)*(+h[j+8>>3]-l)>0.0){m=a;n=7;break}else{a=f}}if((n|0)==7){return m|0}a=c[45174]|0;while(1){if((a|0)<=(b|0)){m=b;n=7;break}f=a-1|0;j=c[c[d+(f<<2)>>2]>>2]|0;g=c[c[d+(a<<2)>>2]>>2]|0;i=c[e>>2]|0;l=+h[g>>3];k=+h[g+8>>3];o=(+h[j+8>>3]-k)*(+h[i>>3]-l)-(+h[j>>3]-l)*(+h[i+8>>3]-k);if(o<=0.0&o<0.0){m=a;n=7;break}else{a=f}}if((n|0)==7){return m|0}return 0}function UB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0;e=i;f=c[43660]|0;g=c[43658]|0;if((f|0)<(g|0)){h=f;j=c[43656]|0}else{k=g+20|0;g=c[43656]|0;do{if((g|0)==0){l=dF(k*52|0)|0;m=l;c[43656]=m;if((l|0)!=0){n=m;p=f;break}gc(c[o>>2]|0,96136,(q=i,i=i+24|0,c[q>>2]=141896,c[q+8>>2]=552,c[q+16>>2]=150848,q)|0)|0;i=q;rc(177592,1)}else{m=gF(g,k*52|0)|0;l=m;c[43656]=l;if((m|0)==0){gc(c[o>>2]|0,96136,(q=i,i=i+24|0,c[q>>2]=141896,c[q+8>>2]=558,c[q+16>>2]=147984,q)|0)|0;i=q;rc(177592,1)}else{n=l;p=c[43660]|0;break}}}while(0);c[43658]=k;h=p;j=n}c[43660]=h+1;n=j+(h*52|0)|0;c[n>>2]=0;c[j+(h*52|0)+4>>2]=a;c[j+(h*52|0)+8>>2]=b;c[j+(h*52|0)+16>>2]=0;c[j+(h*52|0)+20>>2]=b;c[j+(h*52|0)+24>>2]=d;c[j+(h*52|0)+32>>2]=0;c[j+(h*52|0)+36>>2]=d;c[j+(h*52|0)+40>>2]=a;c[j+(h*52|0)+48>>2]=0;c[j+(h*52|0)+12>>2]=n;c[j+(h*52|0)+28>>2]=n;c[j+(h*52|0)+44>>2]=n;i=e;return}function VB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0;f=dF(d<<2)|0;g=f;i=dF((d<<3)+8|0)|0;j=i+8|0;k=(d|0)>0;if(k){vF(f|0,-1|0,d<<2|0)|0;f=0;do{h[j+(f<<3)>>3]=-2147483647.0;f=f+1|0;}while((f|0)<(d|0))}h[i>>3]=-2147483648.0;if((a|0)==(b|0)){eF(i);return g|0}if(k){l=a}else{k=a;while(1){a=j+(k<<3)|0;m=+h[a>>3]*-1.0;h[a>>3]=m==2147483647.0?0.0:m;if((b|0)==-1){break}else{k=-1}}eF(i);return g|0}while(1){k=j+(l<<3)|0;m=+h[k>>3]*-1.0;h[k>>3]=m==2147483647.0?0.0:m;a=e+(l<<2)|0;f=0;n=-1;while(1){o=j+(f<<3)|0;m=+h[o>>3];do{if(m<0.0){if((l|0)<(f|0)){p=(c[e+(f<<2)>>2]|0)+(l<<3)|0}else{p=(c[a>>2]|0)+(f<<3)|0}q=+h[p>>3];r=-0.0-(q+ +h[k>>3]);if(q!=0.0&m<r){h[o>>3]=r;c[g+(f<<2)>>2]=l;s=r}else{s=m}if(s<=+h[j+(n<<3)>>3]){t=n;break}t=f}else{t=n}}while(0);o=f+1|0;if((o|0)<(d|0)){f=o;n=t}else{break}}if((t|0)==(b|0)){break}else{l=t}}eF(i);return g|0}function WB(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0;j=i;k=a;a=i;i=i+16|0;c[a>>2]=c[k>>2];c[a+4>>2]=c[k+4>>2];c[a+8>>2]=c[k+8>>2];c[a+12>>2]=c[k+12>>2];k=e;e=i;i=i+16|0;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];c[e+8>>2]=c[k+8>>2];c[e+12>>2]=c[k+12>>2];k=c[h+4>>2]|0;if((cC(a,b,e,f,h)|0)==0){f=c[h+24>>2]|0;c[f+(k<<2)>>2]=g;g=k+1|0;c[f+(g<<2)>>2]=d;l=VB(g,k,k+2|0,f)|0;i=j;return l|0}else{f=dF((k<<2)+8|0)|0;g=k+1|0;c[f+(k<<2)>>2]=g;c[f+(g<<2)>>2]=-1;l=f;i=j;return l|0}return 0}function XB(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0,f=0.0,g=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0;c=+h[a+24>>3];if(c<1.0e-7&c>-1.0e-7){d=+h[a+16>>3];e=a+8|0;if(d<1.0e-7&d>-1.0e-7){f=+h[e>>3];g=+h[a>>3];if(f<1.0e-7&f>-1.0e-7){i=g<1.0e-7&g>-1.0e-7?4:0;return i|0}else{h[b>>3]=(-0.0-g)/f;i=1;return i|0}}f=+h[e>>3]/(d*2.0);g=f*f- +h[a>>3]/d;if(g<0.0){i=0;return i|0}if(g==0.0){h[b>>3]=-0.0-f;i=1;return i|0}else{d=+T(g)-f;h[b>>3]=d;h[b+8>>3]=f*-2.0-d;i=2;return i|0}}d=+h[a+16>>3]/(c*3.0);f=+h[a+8>>3]/c;g=d*d;j=+h[a>>3]/c+(d*2.0*g-d*f);c=f/3.0-g;g=j*j;f=g+c*c*c*4.0;do{if(f<0.0){c=+T(g-f)*.5;k=+$(+(+T(-0.0-f)),+(-0.0-j));if(c<0.0){l=+U(+(-0.0-c),+.3333333333333333)*-1.0}else{l=+U(+c,+.3333333333333333)}c=l*2.0;m=c*+V(k/3.0);h[b>>3]=m;h[b+8>>3]=c*+V((k+6.283185307179586)/3.0);h[b+16>>3]=c*+V((k+ -3.141592653589793+ -3.141592653589793)/3.0);n=3;o=m}else{m=(+T(f)-j)*.5;k=-0.0-j-m;if(m<0.0){p=+U(+(-0.0-m),+.3333333333333333)*-1.0}else{p=+U(+m,+.3333333333333333)}if(k<0.0){q=+U(+(-0.0-k),+.3333333333333333)*-1.0}else{q=+U(+k,+.3333333333333333)}k=p+q;h[b>>3]=k;if(f>0.0){n=1;o=k;break}m=k*-.5;h[b+16>>3]=m;h[b+8>>3]=m;n=3;o=k}}while(0);a=0;f=o;while(1){h[b+(a<<3)>>3]=f-d;e=a+1|0;if((e|0)>=(n|0)){i=n;break}a=e;f=+h[b+(e<<3)>>3]}return i|0}function YB(a){a=a|0;eF(c[a>>2]|0);eF(a);return}function ZB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;e=a;a=i;i=i+8|0;c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];e=c[a+4>>2]|0;f=(e*3|0)-2|0;g=c[44388]|0;if((f|0)>(c[44386]|0)){if((g|0)==0){h=dF(f<<4)|0}else{h=gF(g,f<<4)|0}j=h;c[44388]=j;c[44386]=f;k=j}else{k=g}g=c[a>>2]|0;a=k;j=g;c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];uF(k+16|0,j|0,16)|0;j=e-1|0;if((j|0)>1){e=(j|0)>2?j:2;a=e*3|0;h=2;l=1;while(1){m=k+(h<<4)|0;n=g+(l<<4)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=k+(h+1<<4)|0;uF(m|0,n|0,16)|0;n=k+(h+2<<4)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];m=l+1|0;if((m|0)<(j|0)){h=h+3|0;l=m}else{break}}o=a-1|0;p=e}else{o=2;p=1}e=k+(o<<4)|0;a=g+(p<<4)|0;c[e>>2]=c[a>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[e+12>>2]=c[a+12>>2];uF(k+(o+1<<4)|0,a|0,16)|0;c[b+4>>2]=f;c[b>>2]=c[44388];i=d;return}function _B(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0,k=0.0,l=0;e=i;f=a;a=i;i=i+16|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];g=+h[b+8>>3];j=+h[b>>3];k=(+h[a+8>>3]-g)*(+h[d>>3]-j)-(+h[d+8>>3]-g)*(+h[a>>3]-j);if(k>1.0e-4){l=1;i=e;return l|0}l=(k<-1.0e-4)<<31>>31;i=e;return l|0}function $B(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0.0,v=0.0,w=0,x=0,y=0;f=i;g=a;a=i;i=i+16|0;c[a>>2]=c[g>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[a+12>>2]=c[g+12>>2];g=b;b=i;i=i+16|0;c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[b+12>>2]=c[g+12>>2];g=d;d=i;i=i+16|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];g=e;e=i;i=i+16|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];j=+h[a+8>>3];k=+h[b+8>>3];l=j-k;m=+h[d>>3];n=+h[b>>3];o=+h[d+8>>3];p=+h[a>>3];q=p-n;r=l*(m-n)-(o-k)*q;do{if(r>1.0e-4){s=1}else{a=r<-1.0e-4;d=a<<31>>31;if(a){s=d;break}if(p!=n){if(p<m&m<n){t=1;i=f;return t|0}if(n<m&m<p){t=1}else{s=d;break}i=f;return t|0}else{if(j<o&o<k){t=1;i=f;return t|0}if(k<o&o<j){t=1}else{s=d;break}i=f;return t|0}}}while(0);r=+h[e>>3];u=+h[e+8>>3];v=l*(r-n)-(u-k)*q;do{if(v>1.0e-4){w=1}else{e=v<-1.0e-4;d=e<<31>>31;if(e){w=d;break}if(p!=n){if(p<r&r<n){t=1;i=f;return t|0}if(n<r&r<p){t=1}else{w=d;break}i=f;return t|0}else{if(j<u&u<k){t=1;i=f;return t|0}if(k<u&u<j){t=1}else{w=d;break}i=f;return t|0}}}while(0);v=o-u;o=m-r;m=v*(p-r)-(j-u)*o;if(m>1.0e-4){x=1}else{x=(m<-1.0e-4)<<31>>31}m=v*(n-r)-(k-u)*o;if(m>1.0e-4){y=1}else{y=(m<-1.0e-4)<<31>>31}if((da(w,s)|0)>=0){t=0;i=f;return t|0}t=(da(y,x)|0)>>>31;i=f;return t|0}function aC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0.0,O=0,P=0,Q=0,R=0,S=0,U=0;b=c[a+4>>2]|0;d=b+2|0;e=dF(d<<2)|0;f=e;g=fF(da(b,b)|0,8)|0;i=(b|0)>0;if(i){j=0;k=g;while(1){c[f+(j<<2)>>2]=k;g=j+1|0;if((g|0)<(b|0)){j=g;k=k+(b<<3)|0}else{break}}}k=b+1|0;vF(e+(b<<2)|0,0,((d|0)>(k|0)?d:k)-b<<2|0)|0;c[a+24>>2]=f;k=c[a+8>>2]|0;d=c[a+16>>2]|0;e=c[a+20>>2]|0;if(i){l=0}else{return}do{i=e+(l<<2)|0;a=c[i>>2]|0;j=k+(l<<4)|0;g=k+(l<<4)+8|0;m=+h[j>>3]- +h[k+(a<<4)>>3];n=+h[g>>3]- +h[k+(a<<4)+8>>3];o=+T(m*m+n*n);p=f+(l<<2)|0;h[(c[p>>2]|0)+(a<<3)>>3]=o;h[(c[f+(a<<2)>>2]|0)+(l<<3)>>3]=o;q=l-1|0;r=(a|0)==(q|0)?l-2|0:q;a:do{if((r|0)>-1){q=d+(l<<2)|0;a=r;while(1){s=c[i>>2]|0;t=c[q>>2]|0;o=+h[k+(s<<4)>>3];n=+h[k+(s<<4)+8>>3];m=+h[j>>3];u=+h[g>>3];v=+h[k+(a<<4)>>3];w=+h[k+(a<<4)+8>>3];x=(m-o)*(w-n)-(u-n)*(v-o);if(x>1.0e-4){y=1}else{y=(x<-1.0e-4)<<31>>31}x=+h[k+(t<<4)>>3]-m;z=+h[k+(t<<4)+8>>3]-u;A=x*(w-u)-z*(v-m);if(A>1.0e-4){B=1}else{B=(A<-1.0e-4)<<31>>31>>>31^1}t=(y|0)>-1;if((n-u)*x-(o-m)*z>1.0e-4){C=t?B:0}else{C=t?1:B}b:do{if((C|0)!=0){t=c[e+(a<<2)>>2]|0;s=c[d+(a<<2)>>2]|0;z=+h[k+(t<<4)>>3];o=+h[k+(t<<4)+8>>3];x=(v-z)*(u-o)-(m-z)*(w-o);if(x>1.0e-4){D=1}else{D=(x<-1.0e-4)<<31>>31}x=u-w;n=+h[k+(s<<4)>>3]-v;A=+h[k+(s<<4)+8>>3]-w;E=m-v;F=x*n-E*A;if(F>1.0e-4){G=1}else{G=(F<-1.0e-4)<<31>>31>>>31^1}s=(D|0)>-1;if((o-w)*n-(z-v)*A>1.0e-4){H=s?G:0}else{H=s?1:G}if((H|0)==0){break}if(m!=v){s=0;do{t=c[d+(s<<2)>>2]|0;A=+h[k+(s<<4)>>3];z=+h[k+(s<<4)+8>>3];n=x*(A-v)-E*(z-w);do{if(n>1.0e-4){I=1}else{J=n<-1.0e-4;K=J<<31>>31;if(J){I=K;break}if(m<A&A<v){break b}if(v<A&A<m){break b}else{I=K}}}while(0);n=+h[k+(t<<4)>>3];o=+h[k+(t<<4)+8>>3];F=x*(n-v)-E*(o-w);do{if(F>1.0e-4){L=1}else{K=F<-1.0e-4;J=K<<31>>31;if(K){L=J;break}if(m<n&n<v){break b}if(v<n&n<m){break b}else{L=J}}}while(0);F=z-o;M=A-n;N=(m-n)*F-M*(u-o);if(N>1.0e-4){O=1}else{O=(N<-1.0e-4)<<31>>31}N=(v-n)*F-M*(w-o);if(N>1.0e-4){P=1}else{P=(N<-1.0e-4)<<31>>31}if((da(L,I)|0)<0){if((da(P,O)|0)<=-1){break b}}s=s+1|0;}while((s|0)<(b|0))}else{s=0;do{t=c[d+(s<<2)>>2]|0;N=+h[k+(s<<4)>>3];M=+h[k+(s<<4)+8>>3];F=x*(N-v)-E*(M-w);do{if(F>1.0e-4){Q=1}else{J=F<-1.0e-4;K=J<<31>>31;if(J){Q=K;break}if(u<M&M<w){break b}if(w<M&M<u){break b}else{Q=K}}}while(0);F=+h[k+(t<<4)>>3];o=+h[k+(t<<4)+8>>3];n=x*(F-v)-E*(o-w);do{if(n>1.0e-4){R=1}else{K=n<-1.0e-4;J=K<<31>>31;if(K){R=J;break}if(u<o&o<w){break b}if(w<o&o<u){break b}else{R=J}}}while(0);n=M-o;A=N-F;z=(m-F)*n-A*(u-o);if(z>1.0e-4){S=1}else{S=(z<-1.0e-4)<<31>>31}z=(v-F)*n-A*(w-o);if(z>1.0e-4){U=1}else{U=(z<-1.0e-4)<<31>>31}if((da(R,Q)|0)<0){if((da(U,S)|0)<=-1){break b}}s=s+1|0;}while((s|0)<(b|0))}z=+T(E*E+x*x);h[(c[p>>2]|0)+(a<<3)>>3]=z;h[(c[f+(a<<2)>>2]|0)+(l<<3)>>3]=z}}while(0);if((a|0)<=0){break a}a=a-1|0}}}while(0);l=l+1|0;}while((l|0)<(b|0));return}function bC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0,R=0,S=0.0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;e=i;i=i+24|0;f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];f=e|0;g=e+16|0;j=c[a+4>>2]|0;k=a+8|0;l=c[k>>2]|0;m=c[a+16>>2]|0;n=c[a+20>>2]|0;o=dF((j<<3)+16|0)|0;p=o;a:do{if((b|0)==-2222){q=+h[d+8>>3];h[f>>3]=+h[d>>3];h[f+8>>3]=q;r=a+12|0;s=a|0;t=g|0;u=g+4|0;v=0;while(1){if((v|0)>=(c[s>>2]|0)){w=j;x=j;break a}y=c[r>>2]|0;z=y+(v<<2)|0;c[t>>2]=(c[k>>2]|0)+(c[z>>2]<<4);A=v+1|0;c[u>>2]=(c[y+(A<<2)>>2]|0)-(c[z>>2]|0);if((LB(g,f)|0)==0){v=A}else{B=v;C=5;break}}}else{B=b;C=5}}while(0);do{if((C|0)==5){if((B|0)<=-1){w=j;x=j;break}b=c[a+12>>2]|0;w=c[b+(B+1<<2)>>2]|0;x=c[b+(B<<2)>>2]|0}}while(0);B=(x|0)>0;if(B){q=+h[d>>3];D=+h[d+8>>3];a=(w|0)<(j|0);b=0;do{E=+h[l+(b<<4)>>3];F=+h[l+(b<<4)+8>>3];f=c[n+(b<<2)>>2]|0;g=c[m+(b<<2)>>2]|0;G=+h[l+(f<<4)>>3];H=+h[l+(f<<4)+8>>3];I=(E-G)*(D-H)-(F-H)*(q-G);if(I>1.0e-4){J=1}else{J=(I<-1.0e-4)<<31>>31}I=D-F;K=+h[l+(g<<4)>>3]-E;L=+h[l+(g<<4)+8>>3]-F;M=q-E;N=K*I-L*M;if(N>1.0e-4){O=1}else{O=(N<-1.0e-4)<<31>>31>>>31^1}g=(J|0)>-1;if((H-F)*K-(G-E)*L>1.0e-4){P=g?O:0}else{P=g?1:O}b:do{if((P|0)==0){C=65}else{g=q!=E;f=0;do{k=c[m+(f<<2)>>2]|0;L=+h[l+(f<<4)>>3];G=+h[l+(f<<4)+8>>3];K=I*(L-E)-M*(G-F);do{if(K>1.0e-4){Q=1}else{v=K<-1.0e-4;u=v<<31>>31;if(v){Q=u;break}if(g){if(q<L&L<E){C=65;break b}if(E<L&L<q){C=65;break b}else{Q=u;break}}else{if(D<G&G<F){C=65;break b}if(F<G&G<D){C=65;break b}else{Q=u;break}}}}while(0);K=+h[l+(k<<4)>>3];H=+h[l+(k<<4)+8>>3];N=I*(K-E)-M*(H-F);do{if(N>1.0e-4){R=1}else{u=N<-1.0e-4;v=u<<31>>31;if(u){R=v;break}if(g){if(q<K&K<E){C=65;break b}if(E<K&K<q){C=65;break b}else{R=v;break}}else{if(D<H&H<F){C=65;break b}if(F<H&H<D){C=65;break b}else{R=v;break}}}}while(0);N=G-H;S=L-K;U=(q-K)*N-S*(D-H);if(U>1.0e-4){V=1}else{V=(U<-1.0e-4)<<31>>31}U=(E-K)*N-S*(F-H);if(U>1.0e-4){W=1}else{W=(U<-1.0e-4)<<31>>31}if((da(R,Q)|0)<0){if((da(W,V)|0)<=-1){C=65;break b}}f=f+1|0;}while((f|0)<(x|0));if(a){f=q!=E;g=w;do{k=c[m+(g<<2)>>2]|0;U=+h[l+(g<<4)>>3];S=+h[l+(g<<4)+8>>3];N=I*(U-E)-M*(S-F);do{if(N>1.0e-4){X=1}else{v=N<-1.0e-4;u=v<<31>>31;if(v){X=u;break}if(f){if(q<U&U<E){C=65;break b}if(E<U&U<q){C=65;break b}else{X=u;break}}else{if(D<S&S<F){C=65;break b}if(F<S&S<D){C=65;break b}else{X=u;break}}}}while(0);N=+h[l+(k<<4)>>3];H=+h[l+(k<<4)+8>>3];K=I*(N-E)-M*(H-F);do{if(K>1.0e-4){Y=1}else{u=K<-1.0e-4;v=u<<31>>31;if(u){Y=v;break}if(f){if(q<N&N<E){C=65;break b}if(E<N&N<q){C=65;break b}else{Y=v;break}}else{if(D<H&H<F){C=65;break b}if(F<H&H<D){C=65;break b}else{Y=v;break}}}}while(0);K=S-H;L=U-N;G=(q-N)*K-L*(D-H);if(G>1.0e-4){Z=1}else{Z=(G<-1.0e-4)<<31>>31}G=(E-N)*K-L*(F-H);if(G>1.0e-4){_=1}else{_=(G<-1.0e-4)<<31>>31}if((da(Y,X)|0)<0){if((da(_,Z)|0)<=-1){C=65;break b}}g=g+1|0;}while((g|0)<(j|0))}h[p+(b<<3)>>3]=+T(M*M+I*I)}}while(0);if((C|0)==65){C=0;h[p+(b<<3)>>3]=0.0}b=b+1|0;}while((b|0)<(x|0))}if((x|0)<(w|0)){vF(o+(x<<3)|0,0,w-x<<3|0)|0}if((w|0)>=(j|0)){$=p+(j<<3)|0;h[$>>3]=0.0;aa=j+1|0;ba=p+(aa<<3)|0;h[ba>>3]=0.0;i=e;return p|0}D=+h[d>>3];q=+h[d+8>>3];d=w;do{I=+h[l+(d<<4)>>3];M=+h[l+(d<<4)+8>>3];o=c[n+(d<<2)>>2]|0;b=c[m+(d<<2)>>2]|0;F=+h[l+(o<<4)>>3];E=+h[l+(o<<4)+8>>3];G=(I-F)*(q-E)-(M-E)*(D-F);if(G>1.0e-4){ca=1}else{ca=(G<-1.0e-4)<<31>>31}G=q-M;L=+h[l+(b<<4)>>3]-I;K=+h[l+(b<<4)+8>>3]-M;ea=D-I;fa=L*G-K*ea;if(fa>1.0e-4){ga=1}else{ga=(fa<-1.0e-4)<<31>>31>>>31^1}b=(ca|0)>-1;if((E-M)*L-(F-I)*K>1.0e-4){ha=b?ga:0}else{ha=b?1:ga}c:do{if((ha|0)==0){C=123}else{if(B){b=D!=I;o=0;do{Z=c[m+(o<<2)>>2]|0;K=+h[l+(o<<4)>>3];F=+h[l+(o<<4)+8>>3];L=G*(K-I)-ea*(F-M);do{if(L>1.0e-4){ia=1}else{_=L<-1.0e-4;X=_<<31>>31;if(_){ia=X;break}if(b){if(D<K&K<I){C=123;break c}if(I<K&K<D){C=123;break c}else{ia=X;break}}else{if(q<F&F<M){C=123;break c}if(M<F&F<q){C=123;break c}else{ia=X;break}}}}while(0);L=+h[l+(Z<<4)>>3];H=+h[l+(Z<<4)+8>>3];N=G*(L-I)-ea*(H-M);do{if(N>1.0e-4){ja=1}else{X=N<-1.0e-4;_=X<<31>>31;if(X){ja=_;break}if(b){if(D<L&L<I){C=123;break c}if(I<L&L<D){C=123;break c}else{ja=_;break}}else{if(q<H&H<M){C=123;break c}if(M<H&H<q){C=123;break c}else{ja=_;break}}}}while(0);N=F-H;U=K-L;S=(D-L)*N-U*(q-H);if(S>1.0e-4){ka=1}else{ka=(S<-1.0e-4)<<31>>31}S=(I-L)*N-U*(M-H);if(S>1.0e-4){la=1}else{la=(S<-1.0e-4)<<31>>31}if((da(ja,ia)|0)<0){if((da(la,ka)|0)<=-1){C=123;break c}}o=o+1|0;}while((o|0)<(x|0))}o=D!=I;b=w;do{Z=c[m+(b<<2)>>2]|0;S=+h[l+(b<<4)>>3];U=+h[l+(b<<4)+8>>3];N=G*(S-I)-ea*(U-M);do{if(N>1.0e-4){ma=1}else{_=N<-1.0e-4;X=_<<31>>31;if(_){ma=X;break}if(o){if(D<S&S<I){C=123;break c}if(I<S&S<D){C=123;break c}else{ma=X;break}}else{if(q<U&U<M){C=123;break c}if(M<U&U<q){C=123;break c}else{ma=X;break}}}}while(0);N=+h[l+(Z<<4)>>3];H=+h[l+(Z<<4)+8>>3];L=G*(N-I)-ea*(H-M);do{if(L>1.0e-4){na=1}else{X=L<-1.0e-4;_=X<<31>>31;if(X){na=_;break}if(o){if(D<N&N<I){C=123;break c}if(I<N&N<D){C=123;break c}else{na=_;break}}else{if(q<H&H<M){C=123;break c}if(M<H&H<q){C=123;break c}else{na=_;break}}}}while(0);L=U-H;K=S-N;F=(D-N)*L-K*(q-H);if(F>1.0e-4){oa=1}else{oa=(F<-1.0e-4)<<31>>31}F=(I-N)*L-K*(M-H);if(F>1.0e-4){pa=1}else{pa=(F<-1.0e-4)<<31>>31}if((da(na,ma)|0)<0){if((da(pa,oa)|0)<=-1){C=123;break c}}b=b+1|0;}while((b|0)<(j|0));h[p+(d<<3)>>3]=+T(ea*ea+G*G)}}while(0);if((C|0)==123){C=0;h[p+(d<<3)>>3]=0.0}d=d+1|0;}while((d|0)<(j|0));$=p+(j<<3)|0;h[$>>3]=0.0;aa=j+1|0;ba=p+(aa<<3)|0;h[ba>>3]=0.0;i=e;return p|0}function cC(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;g=i;h=a;a=i;i=i+16|0;c[a>>2]=c[h>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[a+12>>2]=c[h+12>>2];h=d;d=i;i=i+16|0;c[d>>2]=c[h>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];c[d+12>>2]=c[h+12>>2];h=c[f+4>>2]|0;j=c[f+8>>2]|0;k=c[f+16>>2]|0;l=(e|0)<0;a:do{if((b|0)<0){if(l){m=0;break}n=c[f+12>>2]|0;o=0;p=c[n+(e<<2)>>2]|0;q=c[n+(e+1<<2)>>2]|0;r=11}else{if(l){n=c[f+12>>2]|0;o=0;p=c[n+(b<<2)>>2]|0;q=c[n+(b+1<<2)>>2]|0;r=11;break}n=c[f+12>>2]|0;if((b|0)>(e|0)){s=b;t=b;u=e;v=e}else{s=e;t=e;u=b;v=b}w=c[n+(s+1<<2)>>2]|0;x=c[n+(t<<2)>>2]|0;y=c[n+(u+1<<2)>>2]|0;z=c[n+(v<<2)>>2]|0;if((z|0)>0){A=0}else{o=y;p=x;q=w;r=11;break}while(1){n=A+1|0;if(($B(a,d,j+(A<<4)|0,j+(c[k+(A<<2)>>2]<<4)|0)|0)!=0){B=0;break}if((n|0)<(z|0)){A=n}else{o=y;p=x;q=w;r=11;break a}}i=g;return B|0}}while(0);b:do{if((r|0)==11){if((o|0)<(p|0)){C=o}else{m=q;break}while(1){A=C+1|0;if(($B(a,d,j+(C<<4)|0,j+(c[k+(C<<2)>>2]<<4)|0)|0)!=0){B=0;break}if((A|0)<(p|0)){C=A}else{m=q;break b}}i=g;return B|0}}while(0);if((m|0)<(h|0)){D=m}else{B=1;i=g;return B|0}while(1){m=D+1|0;if(($B(a,d,j+(D<<4)|0,j+(c[k+(D<<2)>>2]<<4)|0)|0)!=0){B=0;r=18;break}if((m|0)<(h|0)){D=m}else{B=1;r=18;break}}if((r|0)==18){i=g;return B|0}return 0}function dC(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;f=i;i=i+2048|0;g=e;e=i;i=i+32|0;tF(e,g,32)|0;g=f|0;j=f+1024|0;k=b+16|0;b=c[248+(c[(c[k>>2]|0)+12>>2]<<2)>>2]|0;Lv(b,153400)|0;l=+h[e>>3];m=e+8|0;eC(b,l,+h[m>>3]);n=j|0;nb(n|0,107520,(o=i,i=i+8|0,h[o>>3]=+h[e+16>>3]-l,o)|0)|0;i=o;p=gb(n|0,46)|0;do{if((p|0)==0){q=j+(xF(n|0)|0)|0}else{r=p;while(1){s=r+1|0;if((a[s]|0)==0){t=r;break}else{r=s}}while(1){r=a[t]|0;if((r<<24>>24|0)==46){u=5;break}else if((r<<24>>24|0)!=48){u=6;break}a[t]=0;t=t-1|0}if((u|0)==5){a[t]=0;q=t;break}else if((u|0)==6){q=t+1|0;break}}}while(0);a[q]=32;a[q+1|0]=0;Lv(b,n)|0;nb(n|0,107520,(o=i,i=i+8|0,h[o>>3]=+h[e+24>>3]- +h[m>>3],o)|0)|0;i=o;m=gb(n|0,46)|0;do{if((m|0)==0){v=j+(xF(n|0)|0)|0}else{e=m;while(1){q=e+1|0;if((a[q]|0)==0){w=e;break}else{e=q}}while(1){e=a[w]|0;if((e<<24>>24|0)==46){u=12;break}else if((e<<24>>24|0)!=48){u=13;break}a[w]=0;w=w-1|0}if((u|0)==12){a[w]=0;v=w;break}else if((u|0)==13){v=w+1|0;break}}}while(0);a[v]=32;a[v+1|0]=0;Lv(b,n)|0;n=c[d+8>>2]|0;d=c[248+(c[(c[k>>2]|0)+12>>2]<<2)>>2]|0;k=g|0;g=xF(n|0)|0;nb(k|0,121624,(o=i,i=i+16|0,c[o>>2]=213464,c[o+8>>2]=g,o)|0)|0;i=o;Lv(d,k)|0;Lv(d,n)|0;n=d+4|0;k=c[n>>2]|0;if(k>>>0<(c[d+8>>2]|0)>>>0){x=k;y=x+1|0;c[n>>2]=y;a[x]=32;z=1024;A=0;i=f;return}Jv(d,1)|0;x=c[n>>2]|0;y=x+1|0;c[n>>2]=y;a[x]=32;z=1024;A=0;i=f;return}function eC(b,c,d){b=b|0;c=+c;d=+d;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+1024|0;f=e|0;g=f|0;nb(g|0,107520,(j=i,i=i+8|0,h[j>>3]=c,j)|0)|0;i=j;k=gb(g|0,46)|0;do{if((k|0)==0){l=f+(xF(g|0)|0)|0}else{m=k;while(1){n=m+1|0;if((a[n]|0)==0){o=m;break}else{m=n}}while(1){m=a[o]|0;if((m<<24>>24|0)==46){p=5;break}else if((m<<24>>24|0)!=48){p=6;break}a[o]=0;o=o-1|0}if((p|0)==5){a[o]=0;l=o;break}else if((p|0)==6){l=o+1|0;break}}}while(0);a[l]=32;a[l+1|0]=0;Lv(b,g)|0;c=+wk(d);nb(g|0,107520,(j=i,i=i+8|0,h[j>>3]=c,j)|0)|0;i=j;j=gb(g|0,46)|0;do{if((j|0)==0){q=f+(xF(g|0)|0)|0}else{l=j;while(1){o=l+1|0;if((a[o]|0)==0){r=l;break}else{l=o}}while(1){l=a[r]|0;if((l<<24>>24|0)==46){p=12;break}else if((l<<24>>24|0)!=48){p=13;break}a[r]=0;r=r-1|0}if((p|0)==12){a[r]=0;q=r;break}else if((p|0)==13){q=r+1|0;break}}}while(0);a[q]=32;a[q+1|0]=0;Lv(b,g)|0;i=e;return}function fC(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=i;i=i+1040|0;f=e|0;g=e+1024|0;h=e+1032|0;j=c[(c[d+16>>2]|0)+8>>2]|0;k=d+64|0;switch(c[k>>2]|0){case 1:{if((b[(c[j+8>>2]|0)+128>>1]&1)==0){i=e;return}dn(j);i=e;return};case 6:case 5:case 4:{zk(j,h,g);d=c[h>>2]|0;h=c[g>>2]|0;g=c[k>>2]|0;k=dF(8240)|0;c[43614]=k;a:do{if((g|0)==5){b[k+8232>>1]=12;c[k+8236>>2]=113088}else if((g|0)==6){b[k+8232>>1]=14;c[k+8236>>2]=113640}else{l=ew(j|0,114376)|0;do{if((l|0)!=0){if((a[l]|0)==0){break}m=f|0;n=0;o=l;b:while(1){p=o;while(1){q=p+1|0;r=a[p]|0;if(r<<24>>24==0){break b}if(((r<<24>>24)-48|0)>>>0<10>>>0){break}else{p=q}}if((n|0)>=1023){s=16;break}a[f+n|0]=r;n=n+1|0;o=q}if((s|0)==16){Fv(0,108536,(t=i,i=i+8|0,c[t>>2]=l,t)|0)|0;i=t}a[f+n|0]=0;o=(Rb(m|0)|0)&65535;if((o&65535)>>>0<=10>>>0){break}b[(c[43614]|0)+8232>>1]=o;c[(c[43614]|0)+8236>>2]=l;break a}}while(0);l=f|0;o=0;p=112568;c:while(1){u=p;while(1){v=u+1|0;w=a[u]|0;if(w<<24>>24==0){break c}if(((w<<24>>24)-48|0)>>>0<10>>>0){break}else{u=v}}if((o|0)>=1023){s=25;break}a[f+o|0]=w;o=o+1|0;p=v}if((s|0)==25){Fv(0,108536,(t=i,i=i+8|0,c[t>>2]=112568,t)|0)|0;i=t}a[f+o|0]=0;p=(Rb(l|0)|0)&65535;b[(c[43614]|0)+8232>>1]=p;c[(c[43614]|0)+8236>>2]=112568}}while(0);f=j+8|0;if((c[(c[f>>2]|0)+172>>2]|0)==0){c[c[43614]>>2]=0}else{t=en(j,0,115752,213464)|0;c[c[43614]>>2]=t}if((a[(c[f>>2]|0)+113|0]&8)==0){c[(c[43614]|0)+4>>2]=0}else{t=en(j,0,112048,213464)|0;c[(c[43614]|0)+4>>2]=t}t=en(j,1,115752,213464)|0;c[(c[43614]|0)+8>>2]=t;t=en(j,1,112048,213464)|0;c[(c[43614]|0)+12>>2]=t;t=en(j,2,115752,213464)|0;c[(c[43614]|0)+16>>2]=t;if((h|0)==0){c[(c[43614]|0)+20>>2]=0}else{h=en(j,2,111448,213464)|0;c[(c[43614]|0)+20>>2]=h}if((d|0)==0){c[(c[43614]|0)+24>>2]=0}else{d=en(j,2,110704,213464)|0;c[(c[43614]|0)+24>>2]=d}if((a[(c[f>>2]|0)+113|0]&33)==0){c[(c[43614]|0)+28>>2]=0}else{d=en(j,2,112048,213464)|0;c[(c[43614]|0)+28>>2]=d}if((a[(c[f>>2]|0)+113|0]&2)==0){c[(c[43614]|0)+32>>2]=0}else{d=en(j,2,110056,213464)|0;c[(c[43614]|0)+32>>2]=d}if((a[(c[f>>2]|0)+113|0]&4)==0){c[(c[43614]|0)+36>>2]=0}else{f=en(j,2,109368,213464)|0;c[(c[43614]|0)+36>>2]=f}Iv(174464,1024,(c[43614]|0)+40|0);Iv(174480,1024,(c[43614]|0)+1064|0);Iv(174496,1024,(c[43614]|0)+2088|0);Iv(174512,1024,(c[43614]|0)+3112|0);Iv(174528,1024,(c[43614]|0)+4136|0);Iv(174544,1024,(c[43614]|0)+5160|0);Iv(174560,1024,(c[43614]|0)+6184|0);Iv(174576,1024,(c[43614]|0)+7208|0);i=e;return};case 0:{Ck(j);i=e;return};default:{i=e;return}}}function gC(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=c[(c[b+16>>2]|0)+8>>2]|0;if((c[45182]|0)==0){c[45182]=c[43564];c[45183]=30;c[45184]=34}e=d+52|0;f=(c[e>>2]|0)+8|0;g=c[f>>2]|0;c[f>>2]=180728;switch(c[b+64>>2]|0){case 0:case 1:{if((c[b+152>>2]&134217728|0)!=0){i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return}Fy(d,b)|0;i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return};case 2:{xk(b,d,b,0);i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return};case 3:{xk(b,d,b,1);i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return};case 4:case 5:case 6:{f=c[43617]|0;if((f|0)==(c[43616]|0)){k=d|0}else{l=c[c[43614]>>2]|0;if((l|0)==0){m=en(d,0,115752,213464)|0;c[c[43614]>>2]=m;n=c[c[43614]>>2]|0;o=c[43617]|0}else{n=l;o=f}f=d|0;if(o>>>0<(c[43618]|0)>>>0){p=o}else{Jv(174464,1)|0;p=c[43617]|0}a[p]=0;p=c[43616]|0;c[43617]=p;hw(f,n,p)|0;k=f}if((c[(c[d+8>>2]|0)+12>>2]|0)!=0){f=c[(c[43614]|0)+4>>2]|0;p=c[43633]|0;if(p>>>0<(c[43634]|0)>>>0){q=p}else{Jv(174528,1)|0;q=c[43633]|0}a[q]=0;q=c[43632]|0;c[43633]=q;hw(k,f,q)|0}iw(k,114376,c[(c[43614]|0)+8236>>2]|0,213464)|0;Mv(174464);Mv(174480);Mv(174496);Mv(174512);Mv(174528);Mv(174544);Mv(174560);Mv(174576);eF(c[43614]|0);h[1836]=1.0;h[1840]=1.0;c[43682]=0;c[43686]=0;if((c[b+152>>2]&134217728|0)!=0){i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return}Fy(d,b)|0;i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return};default:{i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return}}}function hC(b){b=b|0;var d=0,e=0,f=0,g=0,i=0;d=c[(c[b+16>>2]|0)+8>>2]|0;b=d|0;e=c[c[43614]>>2]|0;f=c[43621]|0;if(f>>>0<(c[43622]|0)>>>0){g=f}else{Jv(174480,1)|0;g=c[43621]|0}a[g]=0;g=c[43620]|0;c[43621]=g;hw(b,e,g)|0;if((c[(c[d+8>>2]|0)+12>>2]|0)==0){h[1837]=1.0;h[1841]=1.0;c[43683]=0;c[43687]=0;return}d=c[(c[43614]|0)+4>>2]|0;g=c[43637]|0;if(g>>>0<(c[43638]|0)>>>0){i=g}else{Jv(174544,1)|0;i=c[43637]|0}a[i]=0;i=c[43636]|0;c[43637]=i;hw(b,d,i)|0;h[1837]=1.0;h[1841]=1.0;c[43683]=0;c[43687]=0;return}function iC(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[(c[b+16>>2]|0)+8>>2]|0;b=c[43621]|0;if((b|0)!=(c[43620]|0)){e=c[(c[43614]|0)+8>>2]|0;if(b>>>0<(c[43622]|0)>>>0){f=b}else{Jv(174480,1)|0;f=c[43621]|0}a[f]=0;f=c[43620]|0;c[43621]=f;hw(d|0,e,f)|0}f=c[43637]|0;if((f|0)==(c[43636]|0)){h[1844]=1.0;h[1846]=1.0;c[43690]=0;c[43692]=0;return}e=c[(c[43614]|0)+12>>2]|0;if(f>>>0<(c[43638]|0)>>>0){g=f}else{Jv(174544,1)|0;g=c[43637]|0}a[g]=0;g=c[43636]|0;c[43637]=g;hw(d|0,e,g)|0;h[1844]=1.0;h[1846]=1.0;c[43690]=0;c[43692]=0;return}function jC(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0;d=c[(c[b+16>>2]|0)+8>>2]|0;b=c[43621]|0;if((b|0)!=(c[43620]|0)){e=c[(c[43614]|0)+16>>2]|0;if(b>>>0<(c[43622]|0)>>>0){f=b}else{Jv(174480,1)|0;f=c[43621]|0}a[f]=0;f=c[43620]|0;c[43621]=f;hw(d|0,e,f)|0}f=c[43625]|0;if((f|0)!=(c[43624]|0)){e=c[(c[43614]|0)+24>>2]|0;if(f>>>0<(c[43626]|0)>>>0){g=f}else{Jv(174496,1)|0;g=c[43625]|0}a[g]=0;g=c[43624]|0;c[43625]=g;hw(d|0,e,g)|0}g=c[43629]|0;if((g|0)!=(c[43628]|0)){e=c[(c[43614]|0)+20>>2]|0;if(g>>>0<(c[43630]|0)>>>0){i=g}else{Jv(174512,1)|0;i=c[43629]|0}a[i]=0;i=c[43628]|0;c[43629]=i;hw(d|0,e,i)|0}i=c[43637]|0;if((i|0)!=(c[43636]|0)){e=c[(c[43614]|0)+28>>2]|0;if(i>>>0<(c[43638]|0)>>>0){j=i}else{Jv(174544,1)|0;j=c[43637]|0}a[j]=0;j=c[43636]|0;c[43637]=j;hw(d|0,e,j)|0}j=c[43641]|0;if((j|0)!=(c[43640]|0)){e=c[(c[43614]|0)+36>>2]|0;if(j>>>0<(c[43642]|0)>>>0){k=j}else{Jv(174560,1)|0;k=c[43641]|0}a[k]=0;k=c[43640]|0;c[43641]=k;hw(d|0,e,k)|0}k=c[43645]|0;if((k|0)==(c[43644]|0)){h[1845]=1.0;h[1847]=1.0;h[1838]=1.0;h[1839]=1.0;h[1842]=1.0;h[1843]=1.0;c[43691]=0;c[43693]=0;c[43684]=0;c[43685]=0;c[43688]=0;c[43689]=0;return}e=c[(c[43614]|0)+32>>2]|0;if(k>>>0<(c[43646]|0)>>>0){l=k}else{Jv(174576,1)|0;l=c[43645]|0}a[l]=0;l=c[43644]|0;c[43645]=l;hw(d|0,e,l)|0;h[1845]=1.0;h[1847]=1.0;h[1838]=1.0;h[1839]=1.0;h[1842]=1.0;h[1843]=1.0;c[43691]=0;c[43693]=0;c[43684]=0;c[43685]=0;c[43688]=0;c[43689]=0;return}function kC(e,f,g){e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0;j=i;i=i+3072|0;k=f;f=i;i=i+16|0;c[f>>2]=c[k>>2];c[f+4>>2]=c[k+4>>2];c[f+8>>2]=c[k+8>>2];c[f+12>>2]=c[k+12>>2];k=j|0;l=j+1024|0;m=j+2048|0;n=e+16|0;e=c[(c[n>>2]|0)+12>>2]|0;o=c[248+(e<<2)>>2]|0;Lv(o,119184)|0;p=m|0;q=g+4|0;nb(p|0,107520,(r=i,i=i+8|0,h[r>>3]=+h[(c[q>>2]|0)+16>>3],r)|0)|0;i=r;s=gb(p|0,46)|0;do{if((s|0)==0){t=m+(xF(p|0)|0)|0}else{u=s;while(1){v=u+1|0;if((a[v]|0)==0){w=u;break}else{u=v}}while(1){u=a[w]|0;if((u<<24>>24|0)==46){x=5;break}else if((u<<24>>24|0)!=48){x=6;break}a[w]=0;w=w-1|0}if((x|0)==5){a[w]=0;t=w;break}else if((x|0)==6){t=w+1|0;break}}}while(0);a[t]=32;a[t+1|0]=0;Lv(o,p)|0;t=c[c[q>>2]>>2]|0;w=c[248+(c[(c[n>>2]|0)+12>>2]<<2)>>2]|0;s=l|0;l=xF(t|0)|0;nb(s|0,121624,(r=i,i=i+16|0,c[r>>2]=213464,c[r+8>>2]=l,r)|0)|0;i=r;Lv(w,s)|0;Lv(w,t)|0;t=w+4|0;l=c[t>>2]|0;if(l>>>0<(c[w+8>>2]|0)>>>0){y=l}else{Jv(w,1)|0;y=c[t>>2]|0}c[t>>2]=y+1;a[y]=32;y=(c[n>>2]|0)+16|0;t=a[y+3|0]|0;w=d[y]|0;l=d[y+1|0]|0;u=d[y+2|0]|0;if(t<<24>>24==-1){nb(180832,150832,(r=i,i=i+24|0,c[r>>2]=w,c[r+8>>2]=l,c[r+16>>2]=u,r)|0)|0;i=r}else{nb(180832,147960,(r=i,i=i+32|0,c[r>>2]=w,c[r+8>>2]=l,c[r+16>>2]=u,c[r+24>>2]=t&255,r)|0)|0;i=r}t=c[248+(c[(c[n>>2]|0)+12>>2]<<2)>>2]|0;u=k|0;k=xF(180832)|0;nb(u|0,121624,(r=i,i=i+16|0,c[r>>2]=154040,c[r+8>>2]=k,r)|0)|0;i=r;Lv(t,u)|0;Lv(t,180832)|0;u=t+4|0;k=c[u>>2]|0;if(k>>>0<(c[t+8>>2]|0)>>>0){z=k}else{Jv(t,1)|0;z=c[u>>2]|0}c[u>>2]=z+1;a[z]=32;z=a[g+48|0]|0;if((z|0)==114){A=1}else if((z|0)==108){A=-1}else{A=0}z=c[q>>2]|0;if((z|0)==0){B=0}else{B=c[z+24>>2]<<25>>25}z=b[(c[43614]|0)+8232>>1]|0;do{if((z&65535)>>>0>14>>>0){q=((z&65535)>>>0>15>>>0?63:31)&B;u=174728+(e<<2)|0;if((c[u>>2]|0)==(q|0)){break}nb(p|0,118560,(r=i,i=i+8|0,c[r>>2]=q,r)|0)|0;i=r;Lv(o,p)|0;c[u>>2]=q}}while(0);e=f+8|0;C=+h[g+24>>3]+ +h[e>>3];h[e>>3]=C;Lv(o,117608)|0;eC(o,+h[f>>3],C);nb(p|0,116688,(r=i,i=i+8|0,c[r>>2]=A,r)|0)|0;i=r;Lv(o,p)|0;nb(p|0,107520,(r=i,i=i+8|0,h[r>>3]=+h[g+32>>3],r)|0)|0;i=r;A=gb(p|0,46)|0;do{if((A|0)==0){D=m+(xF(p|0)|0)|0}else{f=A;while(1){e=f+1|0;if((a[e]|0)==0){E=f;break}else{f=e}}while(1){f=a[E]|0;if((f<<24>>24|0)==46){x=27;break}else if((f<<24>>24|0)!=48){x=28;break}a[E]=0;E=E-1|0}if((x|0)==27){a[E]=0;D=E;break}else if((x|0)==28){D=E+1|0;break}}}while(0);a[D]=32;a[D+1|0]=0;Lv(o,p)|0;p=c[g>>2]|0;g=c[248+(c[(c[n>>2]|0)+12>>2]<<2)>>2]|0;n=xF(p|0)|0;nb(s|0,121624,(r=i,i=i+16|0,c[r>>2]=213464,c[r+8>>2]=n,r)|0)|0;i=r;Lv(g,s)|0;Lv(g,p)|0;p=g+4|0;s=c[p>>2]|0;if(s>>>0<(c[g+8>>2]|0)>>>0){F=s;G=F+1|0;c[p>>2]=G;a[F]=32;H=1024;I=0;i=j;return}Jv(g,1)|0;F=c[p>>2]|0;G=F+1|0;c[p>>2]=G;a[F]=32;H=1024;I=0;i=j;return}function lC(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;g=i;i=i+3072|0;j=g|0;k=g+2048|0;l=b+16|0;m=c[(c[l>>2]|0)+12>>2]|0;pC(b);n=(c[l>>2]|0)+16|0;o=a[n+3|0]|0;p=d[n]|0;q=d[n+1|0]|0;r=d[n+2|0]|0;if(o<<24>>24==-1){nb(180832,150832,(s=i,i=i+24|0,c[s>>2]=p,c[s+8>>2]=q,c[s+16>>2]=r,s)|0)|0;i=s}else{nb(180832,147960,(s=i,i=i+32|0,c[s>>2]=p,c[s+8>>2]=q,c[s+16>>2]=r,c[s+24>>2]=o&255,s)|0)|0;i=s}o=c[248+(c[(c[l>>2]|0)+12>>2]<<2)>>2]|0;r=g+1024|0;q=xF(180832)|0;nb(r|0,121624,(s=i,i=i+16|0,c[s>>2]=154040,c[s+8>>2]=q,s)|0)|0;i=s;Lv(o,r)|0;Lv(o,180832)|0;r=o+4|0;q=c[r>>2]|0;if(q>>>0<(c[o+8>>2]|0)>>>0){t=q}else{Jv(o,1)|0;t=c[r>>2]|0}c[r>>2]=t+1;a[t]=32;if((f|0)==0){t=c[248+(m<<2)>>2]|0;Lv(t,120024)|0;u=t}else{if((f&-2|0)==2){qC(b,f,e,2)}else{f=(c[l>>2]|0)+56|0;b=a[f+3|0]|0;t=d[f]|0;r=d[f+1|0]|0;o=d[f+2|0]|0;if(b<<24>>24==-1){nb(180832,150832,(s=i,i=i+24|0,c[s>>2]=t,c[s+8>>2]=r,c[s+16>>2]=o,s)|0)|0;i=s}else{nb(180832,147960,(s=i,i=i+32|0,c[s>>2]=t,c[s+8>>2]=r,c[s+16>>2]=o,c[s+24>>2]=b&255,s)|0)|0;i=s}b=c[248+(c[(c[l>>2]|0)+12>>2]<<2)>>2]|0;l=j|0;j=xF(180832)|0;nb(l|0,121624,(s=i,i=i+16|0,c[s>>2]=128936,c[s+8>>2]=j,s)|0)|0;i=s;Lv(b,l)|0;Lv(b,180832)|0;l=b+4|0;j=c[l>>2]|0;if(j>>>0<(c[b+8>>2]|0)>>>0){v=j}else{Jv(b,1)|0;v=c[l>>2]|0}c[l>>2]=v+1;a[v]=32;}v=c[248+(m<<2)>>2]|0;Lv(v,120792)|0;u=v}v=e|0;m=e+8|0;eC(u,+h[v>>3],+h[m>>3]);l=k|0;nb(l|0,107520,(s=i,i=i+8|0,h[s>>3]=+h[e+16>>3]- +h[v>>3],s)|0)|0;i=s;v=gb(l|0,46)|0;do{if((v|0)==0){w=k+(xF(l|0)|0)|0}else{b=v;while(1){j=b+1|0;if((a[j]|0)==0){x=b;break}else{b=j}}while(1){b=a[x]|0;if((b<<24>>24|0)==46){y=21;break}else if((b<<24>>24|0)!=48){y=22;break}a[x]=0;x=x-1|0}if((y|0)==21){a[x]=0;w=x;break}else if((y|0)==22){w=x+1|0;break}}}while(0);a[w]=32;a[w+1|0]=0;Lv(u,l)|0;nb(l|0,107520,(s=i,i=i+8|0,h[s>>3]=+h[e+24>>3]- +h[m>>3],s)|0)|0;i=s;s=gb(l|0,46)|0;if((s|0)==0){z=k+(xF(l|0)|0)|0;A=z+1|0;a[z]=32;a[A]=0;B=Lv(u,l)|0;i=g;return}else{C=s}while(1){s=C+1|0;if((a[s]|0)==0){D=C;break}else{C=s}}while(1){C=a[D]|0;if((C<<24>>24|0)==46){y=28;break}else if((C<<24>>24|0)!=48){y=29;break}a[D]=0;D=D-1|0}if((y|0)==28){a[D]=0;z=D;A=z+1|0;a[z]=32;a[A]=0;B=Lv(u,l)|0;i=g;return}else if((y|0)==29){z=D+1|0;A=z+1|0;a[z]=32;a[A]=0;B=Lv(u,l)|0;i=g;return}}function mC(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;j=i;i=i+3072|0;k=j|0;l=j+2048|0;pC(b);m=b+16|0;n=(c[m>>2]|0)+16|0;o=a[n+3|0]|0;p=d[n]|0;q=d[n+1|0]|0;r=d[n+2|0]|0;if(o<<24>>24==-1){nb(180832,150832,(s=i,i=i+24|0,c[s>>2]=p,c[s+8>>2]=q,c[s+16>>2]=r,s)|0)|0;i=s}else{nb(180832,147960,(s=i,i=i+32|0,c[s>>2]=p,c[s+8>>2]=q,c[s+16>>2]=r,c[s+24>>2]=o&255,s)|0)|0;i=s}o=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;r=j+1024|0;q=xF(180832)|0;nb(r|0,121624,(s=i,i=i+16|0,c[s>>2]=154040,c[s+8>>2]=q,s)|0)|0;i=s;Lv(o,r)|0;Lv(o,180832)|0;r=o+4|0;q=c[r>>2]|0;if(q>>>0<(c[o+8>>2]|0)>>>0){t=q}else{Jv(o,1)|0;t=c[r>>2]|0}c[r>>2]=t+1;a[t]=32;if((g|0)==0){t=l|0;r=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;o=r+4|0;q=c[o>>2]|0;if(q>>>0<(c[r+8>>2]|0)>>>0){u=q}else{Jv(r,1)|0;u=c[o>>2]|0}c[o>>2]=u+1;a[u]=112;nb(t|0,157816,(s=i,i=i+8|0,c[s>>2]=f,s)|0)|0;i=s;Lv(r,t)|0;if((f|0)>0){v=0}else{i=j;return}do{eC(r,+h[e+(v<<4)>>3],+h[e+(v<<4)+8>>3]);v=v+1|0;}while((v|0)<(f|0));i=j;return}if((g&-2|0)==2){qC(b,g,e,f)}else{g=(c[m>>2]|0)+56|0;b=a[g+3|0]|0;v=d[g]|0;r=d[g+1|0]|0;t=d[g+2|0]|0;if(b<<24>>24==-1){nb(180832,150832,(s=i,i=i+24|0,c[s>>2]=v,c[s+8>>2]=r,c[s+16>>2]=t,s)|0)|0;i=s}else{nb(180832,147960,(s=i,i=i+32|0,c[s>>2]=v,c[s+8>>2]=r,c[s+16>>2]=t,c[s+24>>2]=b&255,s)|0)|0;i=s}b=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;t=k|0;k=xF(180832)|0;nb(t|0,121624,(s=i,i=i+16|0,c[s>>2]=128936,c[s+8>>2]=k,s)|0)|0;i=s;Lv(b,t)|0;Lv(b,180832)|0;t=b+4|0;k=c[t>>2]|0;if(k>>>0<(c[b+8>>2]|0)>>>0){w=k}else{Jv(b,1)|0;w=c[t>>2]|0}c[t>>2]=w+1;a[w]=32;}w=l|0;l=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;m=l+4|0;t=c[m>>2]|0;if(t>>>0<(c[l+8>>2]|0)>>>0){x=t}else{Jv(l,1)|0;x=c[m>>2]|0}c[m>>2]=x+1;a[x]=80;nb(w|0,157816,(s=i,i=i+8|0,c[s>>2]=f,s)|0)|0;i=s;Lv(l,w)|0;if((f|0)>0){y=0}else{i=j;return}do{eC(l,+h[e+(y<<4)>>3],+h[e+(y<<4)+8>>3]);y=y+1|0;}while((y|0)<(f|0));i=j;return}function nC(b,e,f,g,j,k){b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;j=i;i=i+3072|0;g=j|0;l=j+2048|0;pC(b);m=b+16|0;n=(c[m>>2]|0)+16|0;o=a[n+3|0]|0;p=d[n]|0;q=d[n+1|0]|0;r=d[n+2|0]|0;if(o<<24>>24==-1){nb(180832,150832,(s=i,i=i+24|0,c[s>>2]=p,c[s+8>>2]=q,c[s+16>>2]=r,s)|0)|0;i=s}else{nb(180832,147960,(s=i,i=i+32|0,c[s>>2]=p,c[s+8>>2]=q,c[s+16>>2]=r,c[s+24>>2]=o&255,s)|0)|0;i=s}o=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;r=j+1024|0;q=xF(180832)|0;nb(r|0,121624,(s=i,i=i+16|0,c[s>>2]=154040,c[s+8>>2]=q,s)|0)|0;i=s;Lv(o,r)|0;Lv(o,180832)|0;r=o+4|0;q=c[r>>2]|0;if(q>>>0<(c[o+8>>2]|0)>>>0){t=q}else{Jv(o,1)|0;t=c[r>>2]|0}c[r>>2]=t+1;a[t]=32;if((k|0)==0){t=l|0;r=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;o=r+4|0;q=c[o>>2]|0;if(q>>>0<(c[r+8>>2]|0)>>>0){u=q}else{Jv(r,1)|0;u=c[o>>2]|0}c[o>>2]=u+1;a[u]=66;nb(t|0,157816,(s=i,i=i+8|0,c[s>>2]=f,s)|0)|0;i=s;Lv(r,t)|0;if((f|0)>0){v=0}else{i=j;return}do{eC(r,+h[e+(v<<4)>>3],+h[e+(v<<4)+8>>3]);v=v+1|0;}while((v|0)<(f|0));i=j;return}if((k&-2|0)==2){qC(b,k,e,f)}else{k=(c[m>>2]|0)+56|0;b=a[k+3|0]|0;v=d[k]|0;r=d[k+1|0]|0;t=d[k+2|0]|0;if(b<<24>>24==-1){nb(180832,150832,(s=i,i=i+24|0,c[s>>2]=v,c[s+8>>2]=r,c[s+16>>2]=t,s)|0)|0;i=s}else{nb(180832,147960,(s=i,i=i+32|0,c[s>>2]=v,c[s+8>>2]=r,c[s+16>>2]=t,c[s+24>>2]=b&255,s)|0)|0;i=s}b=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;t=g|0;g=xF(180832)|0;nb(t|0,121624,(s=i,i=i+16|0,c[s>>2]=128936,c[s+8>>2]=g,s)|0)|0;i=s;Lv(b,t)|0;Lv(b,180832)|0;t=b+4|0;g=c[t>>2]|0;if(g>>>0<(c[b+8>>2]|0)>>>0){w=g}else{Jv(b,1)|0;w=c[t>>2]|0}c[t>>2]=w+1;a[w]=32;}w=l|0;l=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;m=l+4|0;t=c[m>>2]|0;if(t>>>0<(c[l+8>>2]|0)>>>0){x=t}else{Jv(l,1)|0;x=c[m>>2]|0}c[m>>2]=x+1;a[x]=98;nb(w|0,157816,(s=i,i=i+8|0,c[s>>2]=f,s)|0)|0;i=s;Lv(l,w)|0;if((f|0)>0){y=0}else{i=j;return}do{eC(l,+h[e+(y<<4)>>3],+h[e+(y<<4)+8>>3]);y=y+1|0;}while((y|0)<(f|0));i=j;return}function oC(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;i=i+2048|0;pC(b);j=b+16|0;b=(c[j>>2]|0)+16|0;k=a[b+3|0]|0;l=d[b]|0;m=d[b+1|0]|0;n=d[b+2|0]|0;if(k<<24>>24==-1){nb(180832,150832,(o=i,i=i+24|0,c[o>>2]=l,c[o+8>>2]=m,c[o+16>>2]=n,o)|0)|0;i=o}else{nb(180832,147960,(o=i,i=i+32|0,c[o>>2]=l,c[o+8>>2]=m,c[o+16>>2]=n,c[o+24>>2]=k&255,o)|0)|0;i=o}k=c[248+(c[(c[j>>2]|0)+12>>2]<<2)>>2]|0;n=g|0;m=xF(180832)|0;nb(n|0,121624,(o=i,i=i+16|0,c[o>>2]=154040,c[o+8>>2]=m,o)|0)|0;i=o;Lv(k,n)|0;Lv(k,180832)|0;n=k+4|0;m=c[n>>2]|0;if(m>>>0<(c[k+8>>2]|0)>>>0){p=m}else{Jv(k,1)|0;p=c[n>>2]|0}c[n>>2]=p+1;a[p]=32;p=g+1024|0;n=c[248+(c[(c[j>>2]|0)+12>>2]<<2)>>2]|0;j=n+4|0;k=c[j>>2]|0;if(k>>>0<(c[n+8>>2]|0)>>>0){q=k}else{Jv(n,1)|0;q=c[j>>2]|0}c[j>>2]=q+1;a[q]=76;nb(p|0,157816,(o=i,i=i+8|0,c[o>>2]=f,o)|0)|0;i=o;Lv(n,p)|0;if((f|0)>0){r=0}else{s=1024;t=0;i=g;return}do{eC(n,+h[e+(r<<4)>>3],+h[e+(r<<4)+8>>3]);r=r+1|0;}while((r|0)<(f|0));s=1024;t=0;i=g;return}function pC(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;i=i+2192|0;e=d|0;f=d+2176|0;Iv(f,1024,d+1024|0);g=b+16|0;b=c[g>>2]|0;j=+h[b+152>>3];k=14688+(c[b+12>>2]<<3)|0;if(j!=+h[k>>3]){h[k>>3]=j;Lv(f,144824)|0;k=d+2048|0;nb(k|0,141888,(l=i,i=i+8|0,h[l>>3]=+h[(c[g>>2]|0)+152>>3],l)|0)|0;i=l;m=gb(k|0,46)|0;a:do{if((m|0)!=0){n=m;while(1){o=n+1|0;if((a[o]|0)==0){p=n;break}else{n=o}}while(1){n=a[p]|0;if((n<<24>>24|0)==46){break}else if((n<<24>>24|0)!=48){break a}a[p]=0;p=p-1|0}a[p]=0}}while(0);Lv(f,k)|0;k=f+4|0;p=c[k>>2]|0;m=f+8|0;if(p>>>0<(c[m>>2]|0)>>>0){q=p}else{Jv(f,1)|0;q=c[k>>2]|0}c[k>>2]=q+1;a[q]=41;q=c[k>>2]|0;if(q>>>0<(c[m>>2]|0)>>>0){r=q}else{Jv(f,1)|0;r=c[k>>2]|0}a[r]=0;r=c[f>>2]|0;c[k>>2]=r;k=c[248+(c[(c[g>>2]|0)+12>>2]<<2)>>2]|0;q=e|0;m=xF(r|0)|0;nb(q|0,121624,(l=i,i=i+16|0,c[l>>2]=138744,c[l+8>>2]=m,l)|0)|0;i=l;Lv(k,q)|0;Lv(k,r)|0;r=k+4|0;q=c[r>>2]|0;if(q>>>0<(c[k+8>>2]|0)>>>0){s=q}else{Jv(k,1)|0;s=c[r>>2]|0}c[r>>2]=s+1;a[s]=32;t=c[g>>2]|0}else{t=b}b=c[t+160>>2]|0;if((b|0)==0){i=d;return}t=c[b>>2]|0;if((t|0)!=0){s=f+4|0;r=f+8|0;k=f|0;q=e|0;e=b;b=t;do{e=e+4|0;t=a[b]|0;if((t<<24>>24|0)==98){if((Ya(b|0,133480)|0)!=0){u=21}}else if((t<<24>>24|0)==102){if((Ya(b|0,136176)|0)!=0){u=21}}else if((t<<24>>24|0)==115){if((Ya(b|0,131360)|0)!=0){u=21}}else{u=21}if((u|0)==21){u=0;Lv(f,b)|0;t=b;while(1){v=t+1|0;if((a[t]|0)==0){break}else{t=v}}if((a[v]|0)!=0){t=c[s>>2]|0;if(t>>>0<(c[r>>2]|0)>>>0){w=t}else{Jv(f,1)|0;w=c[s>>2]|0}c[s>>2]=w+1;a[w]=40;if((a[v]|0)!=0){t=v;m=0;while(1){if((m|0)!=0){p=c[s>>2]|0;if(p>>>0<(c[r>>2]|0)>>>0){x=p}else{Jv(f,1)|0;x=c[s>>2]|0}c[s>>2]=x+1;a[x]=44}Lv(f,t)|0;p=t;while(1){y=p+1|0;if((a[p]|0)==0){break}else{p=y}}if((a[y]|0)==0){break}else{t=y;m=m+1|0}}}m=c[s>>2]|0;if(m>>>0<(c[r>>2]|0)>>>0){z=m}else{Jv(f,1)|0;z=c[s>>2]|0}c[s>>2]=z+1;a[z]=41}m=c[s>>2]|0;if(m>>>0<(c[r>>2]|0)>>>0){A=m}else{Jv(f,1)|0;A=c[s>>2]|0}a[A]=0;m=c[k>>2]|0;c[s>>2]=m;t=c[248+(c[(c[g>>2]|0)+12>>2]<<2)>>2]|0;p=xF(m|0)|0;nb(q|0,121624,(l=i,i=i+16|0,c[l>>2]=138744,c[l+8>>2]=p,l)|0)|0;i=l;Lv(t,q)|0;Lv(t,m)|0;m=t+4|0;p=c[m>>2]|0;if(p>>>0<(c[t+8>>2]|0)>>>0){B=p}else{Jv(t,1)|0;B=c[m>>2]|0}c[m>>2]=B+1;a[B]=32;}b=c[e>>2]|0;}while((b|0)!=0)}Mv(f);i=d;return}function qC(b,f,j,k){b=b|0;f=f|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;l=i;i=i+3120|0;m=l|0;n=l+1024|0;o=l+2048|0;p=l+3072|0;q=l+3088|0;r=b+16|0;b=c[r>>2]|0;s=+(c[b+136>>2]|0)*3.141592653589793/180.0;if((e[(c[43614]|0)+8232>>1]|0)>>>0<14>>>0){t=b+56|0;u=a[t+3|0]|0;v=d[t]|0;w=d[t+1|0]|0;x=d[t+2|0]|0;if(u<<24>>24==-1){nb(180832,150832,(y=i,i=i+24|0,c[y>>2]=v,c[y+8>>2]=w,c[y+16>>2]=x,y)|0)|0;i=y}else{nb(180832,147960,(y=i,i=i+32|0,c[y>>2]=v,c[y+8>>2]=w,c[y+16>>2]=x,c[y+24>>2]=u&255,y)|0)|0;i=y}u=c[248+(c[(c[r>>2]|0)+12>>2]<<2)>>2]|0;x=m|0;m=xF(180832)|0;nb(x|0,121624,(y=i,i=i+16|0,c[y>>2]=128936,c[y+8>>2]=m,y)|0)|0;i=y;Lv(u,x)|0;Lv(u,180832)|0;x=u+4|0;m=c[x>>2]|0;if(m>>>0<(c[u+8>>2]|0)>>>0){z=m}else{Jv(u,1)|0;z=c[x>>2]|0}c[x>>2]=z+1;a[z]=32;i=l;return}Iv(p,1024,o|0);o=(f|0)==2;f=q|0;if(o){rn(j,f,k,s,2);z=p+4|0;x=c[z>>2]|0;if(x>>>0<(c[p+8>>2]|0)>>>0){A=x}else{Jv(p,1)|0;A=c[z>>2]|0}c[z>>2]=A+1;a[A]=91;eC(p,+h[q>>3],+h[q+8>>3]);eC(p,+h[q+16>>3],+h[q+24>>3])}else{rn(j,f,k,0.0,3);B=+h[q+24>>3];C=+h[q>>3];if(s==0.0){D=+h[q+8>>3];E=C;F=D;G=D;H=B*.25}else{D=B*.25;I=D;J=s;s=C+I*+V(J);K=+h[q+8>>3];E=s;F=K+I*+W(J);G=K;H=D}q=p+4|0;k=c[q>>2]|0;if(k>>>0<(c[p+8>>2]|0)>>>0){L=k}else{Jv(p,1)|0;L=c[q>>2]|0}c[q>>2]=L+1;a[L]=40;eC(p,E,F);L=n|0;nb(L|0,107520,(y=i,i=i+8|0,h[y>>3]=H,y)|0)|0;i=y;q=gb(L|0,46)|0;do{if((q|0)==0){M=n+(xF(L|0)|0)|0}else{k=q;while(1){f=k+1|0;if((a[f]|0)==0){N=k;break}else{k=f}}while(1){k=a[N]|0;if((k<<24>>24|0)==46){O=21;break}else if((k<<24>>24|0)!=48){O=22;break}a[N]=0;N=N-1|0}if((O|0)==21){a[N]=0;M=N;break}else if((O|0)==22){M=N+1|0;break}}}while(0);a[M]=32;a[M+1|0]=0;Lv(p,L)|0;eC(p,C,G);nb(L|0,107520,(y=i,i=i+8|0,h[y>>3]=B,y)|0)|0;i=y;M=gb(L|0,46)|0;do{if((M|0)==0){P=n+(xF(L|0)|0)|0}else{N=M;while(1){q=N+1|0;if((a[q]|0)==0){Q=N;break}else{N=q}}while(1){N=a[Q]|0;if((N<<24>>24|0)==46){O=28;break}else if((N<<24>>24|0)!=48){O=29;break}a[Q]=0;Q=Q-1|0}if((O|0)==28){a[Q]=0;P=Q;break}else if((O|0)==29){P=Q+1|0;break}}}while(0);a[P]=32;a[P+1|0]=0;Lv(p,L)|0;}Lv(p,125744)|0;L=b+140|0;B=+g[L>>2];P=b+56|0;if(B>0.0){rC(p,B,P);rC(p,+g[L>>2],b+96|0)}else{rC(p,0.0,P);rC(p,1.0,b+96|0)}Nv(p)|0;b=p+4|0;P=c[b>>2]|0;L=p+8|0;Q=P>>>0>=(c[L>>2]|0)>>>0;if(o){if(Q){Jv(p,1)|0;R=c[b>>2]|0}else{R=P}c[b>>2]=R+1;a[R]=93}else{if(Q){Jv(p,1)|0;S=c[b>>2]|0}else{S=P}c[b>>2]=S+1;a[S]=41}S=c[b>>2]|0;if(S>>>0<(c[L>>2]|0)>>>0){T=S}else{Jv(p,1)|0;T=c[b>>2]|0}a[T]=0;T=c[p>>2]|0;c[b>>2]=T;b=c[248+(c[(c[r>>2]|0)+12>>2]<<2)>>2]|0;r=n|0;n=xF(T|0)|0;nb(r|0,121624,(y=i,i=i+16|0,c[y>>2]=128936,c[y+8>>2]=n,y)|0)|0;i=y;Lv(b,r)|0;Lv(b,T)|0;T=b+4|0;r=c[T>>2]|0;if(r>>>0<(c[b+8>>2]|0)>>>0){U=r}else{Jv(b,1)|0;U=c[T>>2]|0}c[T>>2]=U+1;a[U]=32;Mv(p);i=l;return}function rC(b,e,f){b=b|0;e=+e;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;i=i+2048|0;j=g|0;k=g+1024|0;l=k|0;nb(l|0,123384,(m=i,i=i+8|0,h[m>>3]=e,m)|0)|0;i=m;n=gb(l|0,46)|0;do{if((n|0)==0){o=k+(xF(l|0)|0)|0}else{p=n;while(1){q=p+1|0;if((a[q]|0)==0){r=p;break}else{p=q}}while(1){p=a[r]|0;if((p<<24>>24|0)==46){s=5;break}else if((p<<24>>24|0)!=48){s=6;break}a[r]=0;r=r-1|0}if((s|0)==5){a[r]=0;o=r;break}else if((s|0)==6){o=r+1|0;break}}}while(0);a[o]=32;a[o+1|0]=0;o=f;f=a[o+3|0]|0;r=d[o]|0;s=d[o+1|0]|0;n=d[o+2|0]|0;if(f<<24>>24==-1){nb(180832,150832,(m=i,i=i+24|0,c[m>>2]=r,c[m+8>>2]=s,c[m+16>>2]=n,m)|0)|0;i=m}else{nb(180832,147960,(m=i,i=i+32|0,c[m>>2]=r,c[m+8>>2]=s,c[m+16>>2]=n,c[m+24>>2]=f&255,m)|0)|0;i=m}f=j|0;j=xF(180832)|0;nb(f|0,121624,(m=i,i=i+16|0,c[m>>2]=l,c[m+8>>2]=j,m)|0)|0;i=m;Lv(b,f)|0;Lv(b,180832)|0;f=b+4|0;m=c[f>>2]|0;if(m>>>0<(c[b+8>>2]|0)>>>0){t=m;u=t+1|0;c[f>>2]=u;a[t]=32;v=1024;w=0;i=g;return}Jv(b,1)|0;t=c[f>>2]|0;u=t+1|0;c[f>>2]=u;a[t]=32;v=1024;w=0;i=g;return}function sC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[a+16>>2]|0;_z(a,121432)|0;e=c[c[a+12>>2]>>2]|0;f=c[e+4>>2]|0;g=c[e+8>>2]|0;dA(a,120504,(h=i,i=i+24|0,c[h>>2]=c[e>>2],c[h+8>>2]=f,c[h+16>>2]=g,h)|0);i=h;g=$w(c[d+8>>2]|0)|0;dA(a,119856,(h=i,i=i+8|0,c[h>>2]=g,h)|0);i=h;g=da(c[a+168>>2]|0,c[a+164>>2]|0)|0;dA(a,119024,(h=i,i=i+8|0,c[h>>2]=g,h)|0);i=h;_z(a,118192)|0;_z(a,117384)|0;_z(a,116304)|0;_z(a,115360)|0;_z(a,114160)|0;_z(a,113456)|0;_z(a,112904)|0;_z(a,112424)|0;_z(a,111856)|0;i=b;return}function tC(a){a=a|0;_z(a,122640)|0;return}function uC(a){a=a|0;c[53842]=2;return}function vC(a){a=a|0;c[53842]=1;return}function wC(a){a=a|0;c[53842]=2;return}function xC(a){a=a|0;c[53842]=0;return}function yC(a){a=a|0;c[53842]=2;return}function zC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=i;g=d;d=i;i=i+16|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];g=c[(c[b+16>>2]|0)+16>>2]|0;j=c[53842]|0;k=c[e+4>>2]|0;l=+h[k+16>>3]*+h[b+352>>3];m=(c[b+360>>2]|0)!=0?1.5707963267948966:0.0;n=c[k+8>>2]|0;if((n|0)==0){o=-1}else{o=c[n+20>>2]|0}n=a[e+48|0]|0;if((n|0)==108){p=0}else if((n|0)==114){p=2}else{p=1}q=+h[d>>3];if(q<0.0){r=q+-.5}else{r=q+.5}n=~~r;r=+h[d+8>>3];if(r<0.0){s=r+-.5}else{s=r+.5}d=~~s;k=c[e>>2]|0;e=c[44766]|0;if((e|0)==0){c[44764]=64;t=dF(64)|0;c[44766]=t;u=t}else{u=e}e=a[k]|0;if(e<<24>>24==0){v=u}else{t=0;w=u;u=k;k=e;while(1){e=u+1|0;x=c[44764]|0;if((t|0)>(x-8|0)){y=x<<1;c[44764]=y;x=gF(c[44766]|0,y)|0;c[44766]=x;z=x+t|0}else{z=w}if(k<<24>>24>-1){if(k<<24>>24==92){a[z]=92;A=z+1|0;B=t+1|0}else{A=z;B=t}a[A]=k;C=A+1|0;D=B+1|0}else{a[z]=92;nb(z+1|0,124960,(E=i,i=i+8|0,c[E>>2]=k&255,E)|0)|0;i=E;C=z+4|0;D=t+4|0}x=a[e]|0;if(x<<24>>24==0){v=C;break}else{t=D;w=C;u=e;k=x}}}a[v]=0;v=c[44766]|0;dA(b,127968,(E=i,i=i+112|0,c[E>>2]=4,c[E+8>>2]=p,c[E+16>>2]=g,c[E+24>>2]=j,c[E+32>>2]=0,c[E+40>>2]=o,h[E+48>>3]=l,h[E+56>>3]=m,c[E+64>>2]=6,h[E+72>>3]=0.0,h[E+80>>3]=0.0,c[E+88>>2]=n,c[E+96>>2]=d,c[E+104>>2]=v,E)|0);i=E;i=f;return}function AC(e,f){e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=i;h=f+32|0;j=c[h>>2]|0;if((j|0)==5){k=c[f>>2]|0;l=a[k]|0;m=0;n=122104;while(1){if((a[n]|0)==l<<24>>24){if((Ya(n|0,k|0)|0)==0){break}}o=m+1|0;if((o|0)==8){p=17;break}else{m=o;n=c[25944+(o<<2)>>2]|0}}if((p|0)==17){c[h>>2]=6;i=g;return}c[f>>2]=m;c[h>>2]=6;i=g;return}else if((j|0)==1){j=f;m=f;n=a[m]|0;k=n&255;l=j+1|0;o=a[l]|0;q=o&255;r=j+2|0;j=a[r]|0;s=j&255;t=c[44768]|0;do{if((t|0)>0){u=-1;v=0;w=195075;while(1){x=(b[179080+(v<<1)>>1]|0)-k|0;y=(b[179592+(v<<1)>>1]|0)-q|0;z=(b[180104+(v<<1)>>1]|0)-s|0;A=(da(y,y)|0)+(da(x,x)|0)+(da(z,z)|0)|0;if((A|0)<(w|0)){if((A|0)==0){B=v;break}else{C=A;D=v}}else{C=w;D=u}E=v+1|0;if((E|0)<(t|0)){u=D;v=E;w=C}else{p=12;break}}if((p|0)==12){c[44768]=t+1;if((t|0)==256){B=D}else{F=E;p=14;break}}G=B+32|0}else{c[44768]=t+1;F=0;p=14}}while(0);if((p|0)==14){b[179080+(F<<1)>>1]=n&255;b[179592+(F<<1)>>1]=o&255;b[180104+(F<<1)>>1]=j&255;j=F+32|0;F=d[m]|0;m=d[l]|0;l=d[r]|0;dA(e,132936,(e=i,i=i+40|0,c[e>>2]=0,c[e+8>>2]=j,c[e+16>>2]=F,c[e+24>>2]=m,c[e+32>>2]=l,e)|0);i=e;G=j}c[f>>2]=G;c[h>>2]=6;i=g;return}else{cc(130760,147224,165,170632)}}function BC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;e=i;f=c[a+16>>2]|0;g=~~+h[f+152>>3];j=c[f+16>>2]|0;k=c[f+56>>2]|0;l=c[53842]|0;m=(d|0)!=0?20:-1;d=c[f+144>>2]|0;if((d|0)==1){n=10.0;o=1}else if((d|0)==2){n=10.0;o=2}else{n=0.0;o=0}p=+h[b>>3];if(p<0.0){q=p+-.5}else{q=p+.5}d=~~q;q=+h[b+8>>3];if(q<0.0){r=q+-.5}else{r=q+.5}f=~~r;r=+h[b+16>>3];s=r-p;if(s<0.0){t=s+-.5}else{t=s+.5}s=+h[b+24>>3];p=s-q;if(p<0.0){u=p+-.5}else{u=p+.5}if(r<0.0){v=r+-.5}else{v=r+.5}if(s<0.0){w=s+-.5}else{w=s+.5}dA(a,135256,(a=i,i=i+160|0,c[a>>2]=1,c[a+8>>2]=1,c[a+16>>2]=o,c[a+24>>2]=g,c[a+32>>2]=j,c[a+40>>2]=k,c[a+48>>2]=l,c[a+56>>2]=0,c[a+64>>2]=m,h[a+72>>3]=n,c[a+80>>2]=0,h[a+88>>3]=0.0,c[a+96>>2]=d,c[a+104>>2]=f,c[a+112>>2]=~~t,c[a+120>>2]=~~u,c[a+128>>2]=d,c[a+136>>2]=f,c[a+144>>2]=~~v,c[a+152>>2]=~~w,a)|0);i=a;i=e;return}function CC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0;f=i;g=c[a+16>>2]|0;j=~~+h[g+152>>3];k=c[g+16>>2]|0;l=c[g+56>>2]|0;m=c[53842]|0;n=(e|0)!=0?20:-1;e=d+1|0;o=c[g+144>>2]|0;if((o|0)==1){p=10.0;q=1}else if((o|0)==2){p=10.0;q=2}else{p=0.0;q=0}dA(a,162144,(o=i,i=i+128|0,c[o>>2]=2,c[o+8>>2]=3,c[o+16>>2]=q,c[o+24>>2]=j,c[o+32>>2]=k,c[o+40>>2]=l,c[o+48>>2]=m,c[o+56>>2]=0,c[o+64>>2]=n,h[o+72>>3]=p,c[o+80>>2]=0,c[o+88>>2]=0,c[o+96>>2]=0,c[o+104>>2]=0,c[o+112>>2]=0,c[o+120>>2]=e,o)|0);i=o;GC(a,b,d,1);i=f;return}function DC(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0,N=0;f=i;i=i+80|0;e=f|0;j=f+64|0;k=c[a+16>>2]|0;l=~~+h[k+152>>3];m=c[k+16>>2]|0;n=c[53842]|0;if((d|0)<=3){cc(150216,147224,356,170656)}o=dF((d*140|0)+140|0)|0;p=c[k+144>>2]|0;if((p|0)==2){q=10.0;r=2}else if((p|0)==1){q=10.0;r=1}else{q=0.0;r=0}if((g|0)==0){s=4;t=0;u=-1}else{s=5;t=c[k+56>>2]|0;u=20}v=+h[b>>3];k=e+48|0;h[k>>3]=v;w=+h[b+8>>3];g=e+56|0;h[g>>3]=w;if(v<0.0){x=v+-.5}else{x=v+.5}if(w<0.0){y=w+-.5}else{y=w+.5}p=nb(o|0,158264,(z=i,i=i+16|0,c[z>>2]=~~x,c[z+8>>2]=~~y,z)|0)|0;i=z;A=e|0;B=e;C=k;k=j|0;D=j+8|0;E=0;F=1;G=o+p|0;p=3;while(1){c[B>>2]=c[C>>2];c[B+4>>2]=c[C+4>>2];c[B+8>>2]=c[C+8>>2];c[B+12>>2]=c[C+12>>2];H=E+1|0;h[e+16>>3]=+h[b+(H<<4)>>3];h[e+24>>3]=+h[b+(H<<4)+8>>3];H=E+2|0;h[e+32>>3]=+h[b+(H<<4)>>3];h[e+40>>3]=+h[b+(H<<4)+8>>3];H=E+3|0;h[e+48>>3]=+h[b+(H<<4)>>3];h[g>>3]=+h[b+(H<<4)+8>>3];H=1;I=G;do{Qm(j,A,3,+(H|0)/6.0,0,0);y=+h[k>>3];x=+h[D>>3];if(y<0.0){J=y+-.5}else{J=y+.5}if(x<0.0){K=x+-.5}else{K=x+.5}L=nb(I|0,158264,(z=i,i=i+16|0,c[z>>2]=~~J,c[z+8>>2]=~~K,z)|0)|0;i=z;I=I+L|0;H=H+1|0;}while((H|0)<7);M=F+6|0;H=p+3|0;if((H|0)<(d|0)){E=p;F=M;G=I;p=H}else{break}}dA(a,144016,(z=i,i=i+112|0,c[z>>2]=3,c[z+8>>2]=s,c[z+16>>2]=r,c[z+24>>2]=l,c[z+32>>2]=m,c[z+40>>2]=t,c[z+48>>2]=n,c[z+56>>2]=0,c[z+64>>2]=u,h[z+72>>3]=q,c[z+80>>2]=0,c[z+88>>2]=0,c[z+96>>2]=0,c[z+104>>2]=M,z)|0);i=z;dA(a,140952,(z=i,i=i+8|0,c[z>>2]=o,z)|0);i=z;eF(o);if((M|0)<=0){N=_z(a,153232)|0;i=f;return}o=F+5|0;F=0;do{dA(a,138080,(z=i,i=i+8|0,c[z>>2]=((F|0)%(o|0)|0|0)!=0,z)|0);i=z;F=F+1|0;}while((F|0)<(M|0));N=_z(a,153232)|0;i=f;return}function EC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0;e=i;f=c[a+16>>2]|0;g=~~+h[f+152>>3];j=c[f+16>>2]|0;k=c[53842]|0;l=c[f+144>>2]|0;if((l|0)==1){m=10.0;n=1}else if((l|0)==2){m=10.0;n=2}else{m=0.0;n=0}dA(a,162144,(l=i,i=i+128|0,c[l>>2]=2,c[l+8>>2]=1,c[l+16>>2]=n,c[l+24>>2]=g,c[l+32>>2]=j,c[l+40>>2]=0,c[l+48>>2]=k,c[l+56>>2]=0,c[l+64>>2]=0,h[l+72>>3]=m,c[l+80>>2]=0,c[l+88>>2]=0,c[l+96>>2]=0,c[l+104>>2]=0,c[l+112>>2]=0,c[l+120>>2]=d,l)|0);i=l;if((d|0)>0){o=0}else{p=_z(a,153232)|0;i=e;return}do{m=+h[b+(o<<4)>>3];if(m<0.0){q=m+-.5}else{q=m+.5}m=+h[b+(o<<4)+8>>3];if(m<0.0){r=m+-.5}else{r=m+.5}dA(a,158264,(l=i,i=i+16|0,c[l>>2]=~~q,c[l+8>>2]=~~r,l)|0);i=l;o=o+1|0;}while((o|0)<(d|0));p=_z(a,153232)|0;i=e;return}function FC(a,b){a=a|0;b=b|0;var d=0;d=i;dA(a,166272,(a=i,i=i+8|0,c[a>>2]=b,a)|0);i=a;i=d;return}function GC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0;f=i;if((d|0)>0){g=0;do{j=+h[b+(g<<4)>>3];if(j<0.0){k=j+-.5}else{k=j+.5}j=+h[b+(g<<4)+8>>3];if(j<0.0){l=j+-.5}else{l=j+.5}dA(a,158264,(m=i,i=i+16|0,c[m>>2]=~~k,c[m+8>>2]=~~l,m)|0);i=m;g=g+1|0;}while((g|0)<(d|0))}if((e|0)==0){n=_z(a,153232)|0;i=f;return}l=+h[b>>3];if(l<0.0){o=l+-.5}else{o=l+.5}l=+h[b+8>>3];if(l<0.0){p=l+-.5}else{p=l+.5}dA(a,158264,(m=i,i=i+16|0,c[m>>2]=~~o,c[m+8>>2]=~~p,m)|0);i=m;n=_z(a,153232)|0;i=f;return}function HC(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b+16>>2]|0;e=c[b+64>>2]|0;if((e|0)==0){_z(b,116088)|0;f=d+208|0;g=c[f>>2]|0;if((g|0)==0){return}if((a[g]|0)==0){return}_z(b,114904)|0;_z(b,gk(c[f>>2]|0)|0)|0;_z(b,164480)|0;return}else if((e|0)==3){f=gk($w(c[d+8>>2]|0)|0)|0;_z(b,113328)|0;_z(b,f)|0;_z(b,112792)|0;_z(b,f)|0;_z(b,117936)|0;return}else if((e|0)==1){e=d+208|0;f=c[e>>2]|0;if((f|0)==0){return}if((a[f]|0)==0){return}_z(b,114904)|0;_z(b,gk(c[e>>2]|0)|0)|0;_z(b,114024)|0;_z(b,gk($w(c[d+8>>2]|0)|0)|0)|0;_z(b,164480)|0;return}else{return}}function IC(a){a=a|0;var b=0,d=0;b=c[a+16>>2]|0;d=c[a+64>>2]|0;if((d|0)==3){KC(a,c[b+264>>2]|0,c[b+272>>2]|0,c[b+268>>2]|0,c[b+208>>2]|0,c[b+228>>2]|0,c[b+244>>2]|0,c[b+212>>2]|0);_z(a,117232)|0;return}else if((d|0)==2){KC(a,c[b+264>>2]|0,c[b+272>>2]|0,c[b+268>>2]|0,c[b+208>>2]|0,c[b+228>>2]|0,c[b+244>>2]|0,c[b+212>>2]|0);return}else{return}}function JC(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=c[a+16>>2]|0;KC(a,c[g+264>>2]|0,c[g+272>>2]|0,c[g+268>>2]|0,b,d,e,f);return}function KC(b,d,e,f,g,j,k,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;m=i;if((e|0)==0|(f|0)==0){i=m;return}if((c[44374]|0)<(f|0)){n=f+10|0;c[44374]=n;c[44376]=gF(c[44376]|0,n<<3)|0}n=(f|0)>0;if(n){o=0;do{p=+h[e+(o<<4)>>3];if(p<0.0){q=p+-.5}else{q=p+.5}c[(c[44376]|0)+(o<<3)>>2]=~~q;p=+h[e+(o<<4)+8>>3];if(p<0.0){r=p+-.5}else{r=p+.5}c[(c[44376]|0)+(o<<3)+4>>2]=~~r;o=o+1|0;}while((o|0)<(f|0))}o=b+64|0;e=c[o>>2]|0;s=(g|0)==0;do{if(!((e|0)!=0|s)){if((a[g]|0)==0){break}if((d|0)==2){dA(b,78672,(t=i,i=i+8|0,c[t>>2]=g,t)|0);i=t;if(n){u=0;do{v=c[44376]|0;w=c[v+(u<<3)+4>>2]|0;dA(b,168600,(t=i,i=i+16|0,c[t>>2]=c[v+(u<<3)>>2],c[t+8>>2]=w,t)|0);i=t;u=u+1|0;}while((u|0)<(f|0))}_z(b,164480)|0;i=m;return}else if((d|0)==1){u=c[44376]|0;w=c[u>>2]|0;v=c[u+4>>2]|0;x=(c[u+8>>2]|0)-w|0;dA(b,83016,(t=i,i=i+32|0,c[t>>2]=g,c[t+8>>2]=w,c[t+16>>2]=v,c[t+24>>2]=x,t)|0);i=t;i=m;return}else if((d|0)==0){x=c[44376]|0;v=c[x>>2]|0;w=c[x+12>>2]|0;u=c[x+8>>2]|0;y=c[x+4>>2]|0;dA(b,87896,(t=i,i=i+40|0,c[t>>2]=g,c[t+8>>2]=v,c[t+16>>2]=w,c[t+24>>2]=u,c[t+32>>2]=y,t)|0);i=t;i=m;return}else{cc(160496,156352,65,170312)}}}while(0);do{if(!((e|0)!=1|s)){if((a[g]|0)==0){break}if((d|0)!=0){cc(160496,156352,77,170312)}n=c[44376]|0;y=c[n+12>>2]|0;u=c[n+8>>2]|0;w=c[n+4>>2]|0;dA(b,151872,(t=i,i=i+48|0,c[t>>2]=c[n>>2],c[t+8>>2]=y,c[t+16>>2]=u,c[t+24>>2]=w,c[t+32>>2]=g,c[t+40>>2]=j,t)|0);i=t;i=m;return}}while(0);if((e-2|0)>>>0>=2>>>0){i=m;return}if((d|0)==2){_z(b,142952)|0}else if((d|0)==1){_z(b,149056)|0}else if((d|0)==0){_z(b,145920)|0}else{cc(160496,156352,93,170312)}do{if((l|0)!=0){if((a[l]|0)==0){break}_z(b,139840)|0;_z(b,ik(l)|0)|0;_z(b,137160)|0}}while(0);do{if(!s){if((a[g]|0)==0){break}_z(b,134264)|0;_z(b,ik(g)|0)|0;_z(b,137160)|0}}while(0);do{if((k|0)!=0){if((a[k]|0)==0){break}_z(b,132288)|0;_z(b,gk(k)|0)|0;_z(b,137160)|0}}while(0);do{if((j|0)!=0){if((a[j]|0)==0){break}_z(b,129944)|0;_z(b,gk(j)|0)|0;_z(b,137160)|0}}while(0);_z(b,126808)|0;_z(b,124240)|0;do{if((d|0)==0){j=c[44376]|0;k=c[j+12>>2]|0;g=c[j+8>>2]|0;s=c[j+4>>2]|0;dA(b,121200,(t=i,i=i+32|0,c[t>>2]=c[j>>2],c[t+8>>2]=k,c[t+16>>2]=g,c[t+24>>2]=s,t)|0);i=t}else if((d|0)==2){s=c[44376]|0;g=c[s+4>>2]|0;dA(b,120328,(t=i,i=i+16|0,c[t>>2]=c[s>>2],c[t+8>>2]=g,t)|0);i=t;if((f|0)>1){z=1}else{break}do{g=c[44376]|0;s=c[g+(z<<3)+4>>2]|0;dA(b,119600,(t=i,i=i+16|0,c[t>>2]=c[g+(z<<3)>>2],c[t+8>>2]=s,t)|0);i=t;z=z+1|0;}while((z|0)<(f|0))}else if((d|0)==1){s=c[44376]|0;g=c[s>>2]|0;k=c[s+4>>2]|0;j=(c[s+8>>2]|0)-g|0;dA(b,122008,(t=i,i=i+24|0,c[t>>2]=g,c[t+8>>2]=k,c[t+16>>2]=j,t)|0);i=t}}while(0);if((c[o>>2]|0)==3){_z(b,118832)|0;i=m;return}else{_z(b,117936)|0;i=m;return}}function LC(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;_z(a,132568)|0;if((c[a+64>>2]|0)==2){_z(a,132408)|0}else{_z(a,136984)|0}d=c[c[a+12>>2]>>2]|0;e=c[d+4>>2]|0;f=c[d+8>>2]|0;dA(a,132168,(a=i,i=i+24|0,c[a>>2]=c[d>>2],c[a+8>>2]=e,c[a+16>>2]=f,a)|0);i=a;i=b;return}function MC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;_z(a,133184)|0;d=a+64|0;e=a+12|0;if((c[d>>2]|0)!=2){dA(a,133040,(f=i,i=i+8|0,c[f>>2]=c[(c[e>>2]|0)+28>>2],f)|0);i=f}if((c[(c[e>>2]|0)+20>>2]|0)!=0){g=_z(a,132856)|0;h=_z(a,132728)|0;i=b;return}if((c[d>>2]|0)==2){g=_z(a,132856)|0;h=_z(a,132728)|0;i=b;return}d=c[a+476>>2]|0;e=c[a+480>>2]|0;j=c[a+484>>2]|0;dA(a,99424,(f=i,i=i+32|0,c[f>>2]=c[a+472>>2],c[f+8>>2]=d,c[f+16>>2]=e,c[f+24>>2]=j,f)|0);i=f;g=_z(a,132856)|0;h=_z(a,132728)|0;i=b;return}function NC(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+8|0;e=d|0;f=c[b+16>>2]|0;a[11864]=0;g=b+12|0;h=f+8|0;do{if((c[(c[g>>2]|0)+28>>2]|0)==0){j=$w(c[h>>2]|0)|0;dA(b,101240,(k=i,i=i+8|0,c[k>>2]=j,k)|0);i=k;j=b+64|0;if((c[j>>2]|0)==2){_z(b,100376)|0}else{_z(b,100784)|0}do{if((c[(c[g>>2]|0)+20>>2]|0)==0){if((c[j>>2]|0)==2){l=c[b+460>>2]|0;m=c[b+464>>2]|0;n=c[b+468>>2]|0;dA(b,99424,(k=i,i=i+32|0,c[k>>2]=c[b+456>>2],c[k+8>>2]=l,c[k+16>>2]=m,c[k+24>>2]=n,k)|0);i=k;break}else{_z(b,99824)|0;break}}}while(0);_z(b,99008)|0;al(b,c[(c[g>>2]|0)+24>>2]|0,12448);cl(b);j=c[(c[g>>2]|0)+20>>2]|0;if((j|0)==0){break}n=e|0;c[n>>2]=c[j>>2];c[e+4>>2]=0;al(b,0,n)}}while(0);c[44678]=(a[(c[(c[h>>2]|0)+8>>2]|0)+115|0]|0)==1;if(!(a[11864]|0)){_z(b,98584)|0;a[11864]=1}h=c[f+208>>2]|0;if((h|0)==0){i=d;return}dA(b,97984,(k=i,i=i+8|0,c[k>>2]=h,k)|0);i=k;i=d;return}function OC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=i;dA(a,101960,(a=i,i=i+16|0,c[a>>2]=d,c[a+8>>2]=e,a)|0);i=a;i=b;return}function PC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0;b=i;d=c[a+456>>2]|0;e=c[a+460>>2]|0;f=c[a+464>>2]|0;g=c[a+468>>2]|0;j=a+12|0;k=(c[(c[j>>2]|0)+28>>2]|0)+1|0;dA(a,108832,(l=i,i=i+16|0,c[l>>2]=k,c[l+8>>2]=k,l)|0);i=l;if((c[(c[j>>2]|0)+20>>2]|0)==0){dA(a,107856,(l=i,i=i+32|0,c[l>>2]=d,c[l+8>>2]=e,c[l+16>>2]=f,c[l+24>>2]=g,l)|0);i=l}k=a+360|0;dA(a,107112,(l=i,i=i+8|0,c[l>>2]=(c[k>>2]|0)!=0?106440:106024,l)|0);i=l;m=a+64|0;if((c[m>>2]|0)==1){dA(a,105504,(l=i,i=i+16|0,c[l>>2]=f,c[l+8>>2]=g,l)|0);i=l}n=c[a+200>>2]|0;o=c[a+204>>2]|0;dA(a,105112,(l=i,i=i+24|0,c[l>>2]=c[a+196>>2],c[l+8>>2]=n,c[l+16>>2]=o,l)|0);i=l;if((c[(c[j>>2]|0)+20>>2]|0)==0){dA(a,104664,(l=i,i=i+32|0,c[l>>2]=d,c[l+8>>2]=e,c[l+16>>2]=f-d,c[l+24>>2]=g-e,l)|0);i=l}p=+h[a+496>>3];o=c[k>>2]|0;q=+h[a+504>>3];r=+h[a+512>>3];dA(a,104176,(l=i,i=i+40|0,h[l>>3]=+h[a+488>>3],h[l+8>>3]=p,c[l+16>>2]=o,h[l+24>>3]=q,h[l+32>>3]=r,l)|0);i=l;if((c[m>>2]|0)!=1){i=b;return}if((f|0)>14399|(g|0)>14399){Dc[c[(c[j>>2]|0)+16>>2]&63](103504,(l=i,i=i+24|0,c[l>>2]=f,c[l+8>>2]=g,c[l+16>>2]=14400,l)|0);i=l}dA(a,102872,(l=i,i=i+32|0,c[l>>2]=d,c[l+8>>2]=e,c[l+16>>2]=f,c[l+24>>2]=g,l)|0);i=l;i=b;return}function QC(a){a=a|0;var b=0,d=0;b=i;d=a+12|0;if((c[(c[d>>2]|0)+20>>2]|0)!=0){_z(a,111704)|0;al(a,0,(c[(c[d>>2]|0)+20>>2]|0)+4|0)}_z(a,111072)|0;_z(a,110400)|0;dA(a,109656,(a=i,i=i+8|0,c[a>>2]=c[(c[d>>2]|0)+28>>2],a)|0);i=a;i=b;return}function RC(a){a=a|0;var b=0,d=0,e=0;b=i;d=$w(c[(c[a+16>>2]|0)+8>>2]|0)|0;dA(a,112328,(e=i,i=i+8|0,c[e>>2]=d,e)|0);i=e;_z(a,112784)|0;i=b;return}function SC(a){a=a|0;_z(a,113304)|0;return}function TC(a){a=a|0;_z(a,112784)|0;return}function UC(a){a=a|0;_z(a,113304)|0;return}function VC(a){a=a|0;_z(a,112784)|0;return}function WC(a){a=a|0;_z(a,113304)|0;return}function XC(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=i;if((b|0)==0){i=f;return}e=(c[a+16>>2]|0)+272|0;if((c[e>>2]|0)==0){i=f;return}_z(a,116072)|0;gA(a,c[e>>2]|0,2);_z(a,114760)|0;e=dl(b,c[44678]|0)|0;dA(a,113928,(a=i,i=i+8|0,c[a>>2]=e,a)|0);i=a;i=f;return}function YC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0,o=0,p=0;f=i;g=d;d=i;i=i+16|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];g=c[b+16>>2]|0;if(+h[g+40>>3]<.5){i=f;return}j=c[g+4>>2]|0;if((j|0)==0|(j|0)==1){k=155304}else if((j|0)==2){k=151736}else if((j|0)==3){k=148880}else{k=145744}l=+h[g+24>>3];m=+h[g+32>>3];dA(b,142720,(j=i,i=i+32|0,h[j>>3]=+h[g+16>>3],h[j+8>>3]=l,h[j+16>>3]=m,c[j+24>>2]=k,j)|0);i=j;k=e+4|0;eA(b,+h[(c[k>>2]|0)+16>>3]);dA(b,118808,(j=i,i=i+8|0,c[j>>2]=c[c[k>>2]>>2],j)|0);i=j;k=dl(c[e>>2]|0,c[44678]|0)|0;g=a[e+48|0]|0;if((g|0)==114){n=e+32|0;o=d|0;h[o>>3]=+h[o>>3]- +h[n>>3];p=n}else if((g|0)==108){p=e+32|0}else{g=e+32|0;n=d|0;h[n>>3]=+h[n>>3]- +h[g>>3]*.5;p=g}g=d+8|0;h[g>>3]=+h[e+24>>3]+ +h[g>>3];fA(b,d);_z(b,117912)|0;eA(b,+h[p>>3]);dA(b,117208,(j=i,i=i+8|0,c[j>>2]=k,j)|0);i=j;i=f;return}function ZC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0;e=i;i=i+32|0;f=e|0;g=f|0;j=f;k=b;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];h[f+16>>3]=+h[b+16>>3]- +h[b>>3];h[f+24>>3]=+h[b+24>>3]- +h[b+8>>3];b=a+16|0;do{if((d|0)!=0){f=c[b>>2]|0;if(+h[f+80>>3]<=.5){break}k=c[f+4>>2]|0;if((k|0)==3){l=148880}else if((k|0)==0|(k|0)==1){l=155304}else if((k|0)==2){l=151736}else{l=145744}m=+h[f+64>>3];n=+h[f+72>>3];dA(a,142720,(o=i,i=i+32|0,h[o>>3]=+h[f+56>>3],h[o+8>>3]=m,h[o+16>>3]=n,c[o+24>>2]=l,o)|0);i=o;gA(a,g,2);_z(a,120296)|0}}while(0);if(+h[(c[b>>2]|0)+40>>3]<=.5){i=e;return}dD(a);l=c[b>>2]|0;b=c[l+4>>2]|0;if((b|0)==0|(b|0)==1){p=155304}else if((b|0)==2){p=151736}else if((b|0)==3){p=148880}else{p=145744}n=+h[l+24>>3];m=+h[l+32>>3];dA(a,142720,(o=i,i=i+32|0,h[o>>3]=+h[l+16>>3],h[o+8>>3]=n,h[o+16>>3]=m,c[o+24>>2]=p,o)|0);i=o;gA(a,g,2);_z(a,119568)|0;i=e;return}function _C(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0;f=i;g=a+16|0;do{if((e|0)!=0){j=c[g>>2]|0;if(+h[j+80>>3]<=.5){break}k=c[j+4>>2]|0;if((k|0)==0|(k|0)==1){l=155304}else if((k|0)==3){l=148880}else if((k|0)==2){l=151736}else{l=145744}m=+h[j+64>>3];n=+h[j+72>>3];dA(a,142720,(o=i,i=i+32|0,h[o>>3]=+h[j+56>>3],h[o+8>>3]=m,h[o+16>>3]=n,c[o+24>>2]=l,o)|0);i=o;_z(a,134072)|0;fA(a,b);_z(a,132112)|0;if((d|0)>1){j=1;do{fA(a,b+(j<<4)|0);_z(a,129864)|0;j=j+1|0;}while((j|0)<(d|0))}_z(a,121960)|0}}while(0);if(+h[(c[g>>2]|0)+40>>3]<=.5){i=f;return}dD(a);l=c[g>>2]|0;g=c[l+4>>2]|0;if((g|0)==3){p=148880}else if((g|0)==0|(g|0)==1){p=155304}else if((g|0)==2){p=151736}else{p=145744}n=+h[l+24>>3];m=+h[l+32>>3];dA(a,142720,(o=i,i=i+32|0,h[o>>3]=+h[l+16>>3],h[o+8>>3]=n,h[o+16>>3]=m,c[o+24>>2]=p,o)|0);i=o;_z(a,134072)|0;fA(a,b);_z(a,132112)|0;if((d|0)>1){o=1;do{fA(a,b+(o<<4)|0);_z(a,129864)|0;o=o+1|0;}while((o|0)<(d|0))}_z(a,121168)|0;i=f;return}function $C(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0;f=i;e=a+16|0;do{if((g|0)!=0){j=c[e>>2]|0;if(+h[j+80>>3]<=.5){break}k=c[j+4>>2]|0;if((k|0)==3){l=148880}else if((k|0)==0|(k|0)==1){l=155304}else if((k|0)==2){l=151736}else{l=145744}m=+h[j+64>>3];n=+h[j+72>>3];dA(a,142720,(o=i,i=i+32|0,h[o>>3]=+h[j+56>>3],h[o+8>>3]=m,h[o+16>>3]=n,c[o+24>>2]=l,o)|0);i=o;_z(a,134072)|0;fA(a,b);_z(a,132112)|0;if((d|0)>1){j=1;do{gA(a,b+(j<<4)|0,3);_z(a,124072)|0;j=j+3|0;}while((j|0)<(d|0))}_z(a,121960)|0}}while(0);if(+h[(c[e>>2]|0)+40>>3]<=.5){i=f;return}dD(a);l=c[e>>2]|0;e=c[l+4>>2]|0;if((e|0)==0|(e|0)==1){p=155304}else if((e|0)==3){p=148880}else if((e|0)==2){p=151736}else{p=145744}n=+h[l+24>>3];m=+h[l+32>>3];dA(a,142720,(o=i,i=i+32|0,h[o>>3]=+h[l+16>>3],h[o+8>>3]=n,h[o+16>>3]=m,c[o+24>>2]=p,o)|0);i=o;_z(a,134072)|0;fA(a,b);_z(a,132112)|0;if((d|0)>1){o=1;do{gA(a,b+(o<<4)|0,3);_z(a,124072)|0;o=o+3|0;}while((o|0)<(d|0))}_z(a,126584)|0;i=f;return}function aD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0.0;e=i;f=a+16|0;if(+h[(c[f>>2]|0)+40>>3]<=.5){i=e;return}dD(a);g=c[f>>2]|0;f=c[g+4>>2]|0;if((f|0)==0|(f|0)==1){j=155304}else if((f|0)==2){j=151736}else if((f|0)==3){j=148880}else{j=145744}k=+h[g+24>>3];l=+h[g+32>>3];dA(a,142720,(f=i,i=i+32|0,h[f>>3]=+h[g+16>>3],h[f+8>>3]=k,h[f+16>>3]=l,c[f+24>>2]=j,f)|0);i=f;_z(a,134072)|0;fA(a,b);_z(a,132112)|0;if((d|0)>1){f=1;do{fA(a,b+(f<<4)|0);_z(a,129864)|0;f=f+1|0;}while((f|0)<(d|0))}_z(a,126584)|0;i=e;return}function bD(a,b){a=a|0;b=b|0;_z(a,139632)|0;_z(a,b)|0;_z(a,136984)|0;return}function cD(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0;g=i;j=a+16|0;do{if((f|0)!=0){k=c[j>>2]|0;if(+h[k+80>>3]<=.5){break}l=c[k+4>>2]|0;if((l|0)==3){m=148880}else if((l|0)==2){m=151736}else if((l|0)==0|(l|0)==1){m=155304}else{m=145744}n=+h[k+64>>3];o=+h[k+72>>3];dA(a,142720,(p=i,i=i+32|0,h[p>>3]=+h[k+56>>3],h[p+8>>3]=n,h[p+16>>3]=o,c[p+24>>2]=m,p)|0);i=p;_z(a,109360)|0;gA(a,d,e);_z(a,103496)|0;fA(a,d);dA(a,97968,(p=i,i=i+16|0,c[p>>2]=e,c[p+8>>2]=b,p)|0);i=p}}while(0);if(+h[(c[j>>2]|0)+40>>3]<=.5){i=g;return}dD(a);m=c[j>>2]|0;j=c[m+4>>2]|0;if((j|0)==3){q=148880}else if((j|0)==0|(j|0)==1){q=155304}else if((j|0)==2){q=151736}else{q=145744}o=+h[m+24>>3];n=+h[m+32>>3];dA(a,142720,(p=i,i=i+32|0,h[p>>3]=+h[m+16>>3],h[p+8>>3]=o,h[p+16>>3]=n,c[p+24>>2]=q,p)|0);i=p;_z(a,109360)|0;gA(a,d,e);_z(a,103496)|0;fA(a,d);dA(a,92464,(p=i,i=i+16|0,c[p>>2]=e,c[p+8>>2]=b,p)|0);i=p;i=g;return}function dD(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;e=b+16|0;f=c[e>>2]|0;g=c[f+160>>2]|0;eA(b,+h[f+152>>3]);_z(b,87088)|0;if((g|0)==0){i=d;return}else{j=g}while(1){g=j+4|0;f=c[j>>2]|0;if((f|0)==0){break}if((Ya(f|0,82336)|0)==0){j=g;continue}else{k=f}while(1){l=k+1|0;if((a[k]|0)==0){break}else{k=l}}if((a[l]|0)!=0){m=l;while(1){dA(b,168384,(n=i,i=i+8|0,c[n>>2]=m,n)|0);i=n;o=m;while(1){p=o+1|0;if((a[o]|0)==0){break}else{o=p}}if((a[p]|0)==0){break}else{m=p}}}if((Ya(f|0,164240)|0)==0){h[(c[e>>2]|0)+152>>3]=0.0}dA(b,160288,(n=i,i=i+8|0,c[n>>2]=f,n)|0);i=n;j=g}i=d;return}
-
-
-
-function fq(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=e+8|0;g=(c[f>>2]|0)+157|0;if((a[g]|0)!=0){return}a[g]=1;a[(c[f>>2]|0)+158|0]=1;g=mw(d,e)|0;if((g|0)!=0){e=g;while(1){g=ow(d,e)|0;h=e;i=c[h>>2]&3;j=e-32|0;k=c[((i|0)==2?e:j)+28>>2]|0;l=c[k+8>>2]|0;do{if((a[l+158|0]|0)==0){if((a[l+157|0]|0)!=0){break}fq(d,k)}else{m=e+32|0;n=uw(d,k,c[((i|0)==3?e:m)+28>>2]|0,0,0)|0;if((n|0)==0){o=c[h>>2]&3;p=uw(d,c[((o|0)==2?e:j)+28>>2]|0,c[((o|0)==3?e:m)+28>>2]|0,0,1)|0}else{p=n}n=c[e+8>>2]|0;m=b[n+170>>1]|0;o=c[n+156>>2]|0;n=p+8|0;q=(c[n>>2]|0)+170|0;r=b[q>>1]|0;b[q>>1]=(r&65535)>>>0>(m&65535)>>>0?r:m;m=(c[n>>2]|0)+156|0;c[m>>2]=(c[m>>2]|0)+o;Gx(d,e|0)|0}}while(0);if((g|0)==0){break}else{e=g}}}a[(c[f>>2]|0)+158|0]=0;return}function gq(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;h=uw(a,d,e,0,0)|0;do{if((h|0)==0){j=uw(a,e,d,0,0)|0;if((j|0)!=0){k=j;break}j=uw(a,d,e,0,1)|0;if((j|0)!=0){k=j;break}j=$w(d|0)|0;l=$w(e|0)|0;Fv(1,160112,(m=i,i=i+16|0,c[m>>2]=j,c[m+8>>2]=l,m)|0)|0;i=m;i=g;return}else{k=h}}while(0);h=c[f+8>>2]|0;f=b[h+170>>1]|0;e=c[h+156>>2]|0;h=k+8|0;k=(c[h>>2]|0)+170|0;d=b[k>>1]|0;b[k>>1]=(d&65535)>>>0>(f&65535)>>>0?d:f;f=(c[h>>2]|0)+156|0;c[f>>2]=(c[f>>2]|0)+e;i=g;return}function hq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=ux(d)|0;if((e|0)!=0){f=b+8|0;b=e;while(1){e=vx(d,b)|0;g=b+8|0;if((a[(c[g>>2]|0)+159|0]|0)==0){h=c[f>>2]|0;i=c[h+172>>2]|0;a:do{if((i|0)>1){j=b|0;k=1;l=h;while(1){m=(Rx(c[(c[l+176>>2]|0)+(k<<2)>>2]|0,j)|0)==0;n=k+1|0;o=c[f>>2]|0;p=c[o+172>>2]|0;if(!m){q=k;r=p;break a}if((n|0)<(p|0)){k=n;l=o}else{q=n;r=p;break}}}else{q=1;r=i}}while(0);if((q|0)<(r|0)){Gx(d,b|0)|0}c[(c[g>>2]|0)+212>>2]=0}else{Gx(d,b|0)|0}if((e|0)==0){break}else{b=e}}}b=ux(d)|0;if((b|0)==0){return}r=d|0;q=b;do{b=mw(Ix(r)|0,q)|0;if((b|0)!=0){f=b;do{if((Rx(d,c[((c[f>>2]&3|0)==2?f:f-32|0)+28>>2]|0)|0)!=0){xw(d,f,1)|0}f=ow(Ix(r)|0,f)|0;}while((f|0)!=0)}q=vx(d,q)|0;}while((q|0)!=0);return}function iq(a,b,d){a=a|0;b=b|0;d=d|0;Wx(b|0,103336,c[d>>2]|0,1)|0;return}function jq(a,b,d){a=a|0;b=b|0;d=d|0;Wx(b|0,132048,c[d+4>>2]|0,1)|0;return}function kq(a,b,d){a=a|0;b=b|0;d=d|0;Wx(b|0,134032,c[d+8>>2]|0,1)|0;return}function lq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=sy(d)|0;if((e|0)==0){return}d=b+8|0;f=e;do{e=f|0;do{if((Za($w(e)|0,116432,7)|0)==0){g=7;h=5}else{i=Um(ew(e,151672)|0,12248,12272)|0;a[(c[f+8>>2]|0)+262|0]=i;if((i|0)!=0){g=i;h=5;break}lq(b,f)}}while(0);a:do{if((h|0)==5){h=0;if((g|0)==7&(c[53850]|0)==100){oq(b,f);break}e=ux(f)|0;if((e|0)==0){break}i=g&255;j=e+8|0;a[(c[j>>2]|0)+159|0]=i;k=vx(f,e)|0;if((k|0)!=0){l=k;do{Mm(e,l)|0;a[(c[l+8>>2]|0)+159|0]=a[(c[j>>2]|0)+159|0]|0;l=vx(f,l)|0;}while((l|0)!=0)}do{if((g|0)==2|(g|0)==3){l=(c[d>>2]|0)+212|0;j=c[l>>2]|0;if((j|0)==0){c[l>>2]=e;break}else{l=Mm(j,e)|0;c[(c[d>>2]|0)+212>>2]=l;break}}else if((g|0)==4|(g|0)==5){l=(c[d>>2]|0)+216|0;j=c[l>>2]|0;if((j|0)==0){c[l>>2]=e;break}else{l=Mm(j,e)|0;c[(c[d>>2]|0)+216>>2]=l;break}}else{break a}}while(0);if((g|0)==3){a[(c[(c[(c[d>>2]|0)+212>>2]|0)+8>>2]|0)+159|0]=i;break}else if((g|0)==5){a[(c[(c[(c[d>>2]|0)+216>>2]|0)+8>>2]|0)+159|0]=i;break}else{break}}}while(0);f=ty(f)|0;}while((f|0)!=0);return}function mq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=d+8|0;d=c[e>>2]|0;f=c[d+216>>2]|0;g=c[d+212>>2]|0;d=(g|0)==0;do{if((f|0)==0){if(!d){h=5;break}c[b>>2]=0;c[b+4>>2]=0;return}else{if(d){i=f;h=6}else{h=5}}}while(0);if((h|0)==5){f=Lm(g)|0;c[(c[e>>2]|0)+212>>2]=f;f=c[e>>2]|0;g=c[f+216>>2]|0;if((g|0)==0){j=0;k=f}else{i=g;h=6}}do{if((h|0)==6){g=Lm(i)|0;c[(c[e>>2]|0)+216>>2]=g;g=c[e>>2]|0;f=c[g+216>>2]|0;if((f|0)==0){j=0;k=g;break}d=f+8|0;f=c[d>>2]|0;l=(a[f+159|0]|0)==5|0;m=c[c[f+180>>2]>>2]|0;if((m|0)==0){j=l;k=g;break}else{n=m}while(1){m=c[((c[n>>2]&3|0)==2?n:n-32|0)+28>>2]|0;if((m|0)!=(Lm(m)|0)){h=9;break}Kn(n);m=c[c[(c[d>>2]|0)+180>>2]>>2]|0;if((m|0)==0){h=11;break}else{n=m}}if((h|0)==9){cc(121920,126496,346,170232)}else if((h|0)==11){j=l;k=c[e>>2]|0;break}}}while(0);e=c[k+212>>2]|0;a:do{if((e|0)==0){o=0}else{k=e+8|0;h=c[k>>2]|0;n=(a[h+159|0]|0)==3|0;i=c[c[h+172>>2]>>2]|0;if((i|0)==0){o=n;break}else{p=i}while(1){i=c[((c[p>>2]&3|0)==3?p:p+32|0)+28>>2]|0;if((i|0)!=(Lm(i)|0)){break}Kn(p);i=c[c[(c[k>>2]|0)+172>>2]>>2]|0;if((i|0)==0){o=n;break a}else{p=i}}cc(121128,126496,353,170232)}}while(0);c[b>>2]=o;c[b+4>>2]=j;return}function nq(a){a=a|0;var d=0,f=0,g=0,h=0;d=a+8|0;a=c[d>>2]|0;f=a+224|0;b[f>>1]=(e[f>>1]|0)+(c[(c[(c[a+252>>2]|0)+8>>2]|0)+232>>2]|0);a=c[d>>2]|0;f=a+226|0;b[f>>1]=(e[f>>1]|0)+(c[(c[(c[a+252>>2]|0)+8>>2]|0)+232>>2]|0);a=c[d>>2]|0;if((c[a+172>>2]|0)<1){return}else{g=1;h=a}while(1){nq(c[(c[h+176>>2]|0)+(g<<2)>>2]|0);a=c[d>>2]|0;if((g|0)<(c[a+172>>2]|0)){g=g+1|0;h=a}else{break}}return}function oq(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=e+8|0;g=(c[f>>2]|0)+188|0;if((c[g>>2]|0)!=0){return}c[g>>2]=d;hq(d,e);if((ux(e)|0)==0){return}g=d+8|0;d=(c[g>>2]|0)+172|0;h=c[d>>2]|0;i=h+1|0;c[d>>2]=i;d=c[g>>2]|0;j=c[d+176>>2]|0;if((j|0)==0){k=jk((h<<2)+8|0)|0}else{k=lk(j,h+2|0,4,c[d+172>>2]|0)|0}c[(c[g>>2]|0)+176>>2]=k;c[(c[(c[g>>2]|0)+176>>2]|0)+(i<<2)>>2]=e;Rj(e);if((c[53850]|0)!=100){b[(c[f>>2]|0)+224>>1]=32767;b[(c[f>>2]|0)+226>>1]=-1;i=ux(e)|0;g=c[f>>2]|0;if((i|0)==0){l=0;m=g}else{k=i;i=0;d=g;while(1){g=d+226|0;h=k+8|0;j=c[(c[h>>2]|0)+232>>2]|0;if((b[g>>1]|0)<(j|0)){b[g>>1]=j;n=c[f>>2]|0;o=c[(c[h>>2]|0)+232>>2]|0}else{n=d;o=j}j=n+224|0;if((b[j>>1]|0)>(o|0)){b[j>>1]=o}if((i|0)==0){p=k}else{p=(c[(c[h>>2]|0)+232>>2]|0)<(c[(c[i+8>>2]|0)+232>>2]|0)?k:i}h=vx(e,k)|0;j=c[f>>2]|0;if((h|0)==0){l=p;m=j;break}else{k=h;i=p;d=j}}}c[m+252>>2]=l;return}_p(e,0);l=c[f>>2]|0;f=c[l+180>>2]|0;if((f|0)==0){cc(129800,126496,238,170984)}else{q=0;r=f}while(1){f=c[r+8>>2]|0;if((c[f+232>>2]|0)==0){s=(a[f+156|0]|0)==0?r:q}else{s=q}m=c[f+164>>2]|0;if((m|0)==0){break}else{q=s;r=m}}if((s|0)==0){cc(129800,126496,238,170984)}c[l+252>>2]=s;l=ux(e)|0;if((l|0)==0){return}else{t=l}while(1){l=t+8|0;if(!((c[(c[l>>2]|0)+216>>2]|0)<2|(t|0)==(s|0))){u=15;break}Mm(t,s)|0;a[(c[l>>2]|0)+159|0]=7;l=vx(e,t)|0;if((l|0)==0){u=26;break}else{t=l}}if((u|0)==15){cc(124e3,126496,242,170984)}else if((u|0)==26){return}}function pq(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;d=i;i=i+240|0;e=d|0;f=d+120|0;c[53770]=Wv(b,2,137312,0)|0;g=Wv(b,2,161104,0)|0;c[53768]=g;if(!((c[53770]|0)!=0|(g|0)!=0)){i=d;return}g=ux(b)|0;if((g|0)==0){i=d;return}h=e|0;j=f|0;k=g;do{g=rw(b,k)|0;do{if((g|0)!=0){l=g;m=0;n=0;while(1){o=l;p=c[o>>2]|0;q=p&3;r=c[((q|0)==2?l:l-32|0)+28>>2]|0;s=l+32|0;a:do{if((r|0)==(c[((q|0)==3?l:s)+28>>2]|0)){t=n;u=m}else{v=c[53770]|0;do{if((r|0)==(k|0)&(v|0)!=0){w=fw(l|0,v)|0;if((a[w]|0)==0){x=c[o>>2]|0;break}else{t=n;u=qq(h,m,k,l,w)|0;break a}}else{x=p}}while(0);v=c[53768]|0;if(!((c[((x&3|0)==3?l:s)+28>>2]|0)==(k|0)&(v|0)!=0)){t=n;u=m;break}w=fw(l|0,v)|0;if((a[w]|0)==0){t=n;u=m;break}t=qq(j,n,k,l,w)|0;u=m}}while(0);s=sw(b,l,k)|0;if((s|0)==0){break}else{l=s;m=u;n=t}}if((u|0)>0){n=0;do{m=e+(n*24|0)+4|0;if((c[e+(n*24|0)+8>>2]|0)>1){rq(k,m)}l=c[m>>2]|0;if((l|0)!=0){eF(l)}n=n+1|0;}while((n|0)<(u|0))}if((t|0)>0){y=0}else{break}do{n=f+(y*24|0)+4|0;if((c[f+(y*24|0)+8>>2]|0)>1){rq(k,n)}l=c[n>>2]|0;if((l|0)!=0){eF(l)}y=y+1|0;}while((y|0)<(t|0))}}while(0);k=vx(b,k)|0;}while((k|0)!=0);i=d;return}function qq(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0;j=i;i=i+16|0;k=j|0;l=j+8|0;do{if((d|0)>0){m=a[g]|0;n=0;while(1){o=c[b+(n*24|0)>>2]|0;if((a[o]|0)==m<<24>>24){if((Ya(o|0,g|0)|0)==0){break}}p=n+1|0;if((p|0)<(d|0)){n=p}else{q=10;break}}if((q|0)==10){if((d|0)<=4){r=p;q=12;break}m=$w(e|0)|0;Fv(1,130352,(o=i,i=i+16|0,c[o>>2]=5,c[o+8>>2]=m,o)|0)|0;i=o;s=d;i=j;return s|0}o=b+(n*24|0)+4|0;m=c[o>>2]|0;if((m|0)==0){t=kk((c[b+(n*24|0)+8>>2]<<2)+8|0)|0}else{t=mk(m,(c[b+(n*24|0)+8>>2]<<2)+8|0)|0}m=t;c[o>>2]=m;u=b+(n*24|0)+8|0;v=c[u>>2]|0;c[u>>2]=v+1;c[m+(v<<2)>>2]=f;c[(c[o>>2]|0)+(c[u>>2]<<2)>>2]=0;w=d;x=n}else{r=0;q=12}}while(0);if((q|0)==12){q=b+(r*24|0)+8|0;c[q>>2]=0;t=jk(8)|0;p=b+(r*24|0)+4|0;c[p>>2]=t;u=c[q>>2]|0;c[q>>2]=u+1;c[t+(u<<2)>>2]=f;c[(c[p>>2]|0)+(c[q>>2]<<2)>>2]=0;c[b+(r*24|0)>>2]=g;c[b+(r*24|0)+12>>2]=0;h[b+(r*24|0)+16>>3]=0.0;w=d+1|0;x=r}ih(f,k,l);r=(c[((c[f>>2]&3|0)==2?f:f-32|0)+28>>2]|0)==(e|0)?c[l>>2]|0:c[k>>2]|0;if((r|0)==0){s=w;i=j;return s|0}k=b+(x*24|0)+12|0;l=c[k>>2]|0;c[k>>2]=l+1;if((l|0)==0){y=+kh(f,r)}else{y=0.0}h[b+(x*24|0)+16>>3]=y;s=w;i=j;return s|0}function rq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0,D=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;e=i;i=i+80|0;f=e|0;g=e+8|0;j=e+16|0;k=d+4|0;if((c[k>>2]|0)>0){l=d|0;m=b+8|0;n=0.0;o=0.0;p=0;while(1){q=c[(c[l>>2]|0)+(p<<2)>>2]|0;r=c[q>>2]&3;s=c[((r|0)==2?q:q-32|0)+28>>2]|0;if((s|0)==(b|0)){t=c[((r|0)==3?q:q+32|0)+28>>2]|0}else{t=s}s=c[t+8>>2]|0;q=c[m>>2]|0;u=+h[s+16>>3]- +h[q+16>>3];v=+h[s+24>>3]- +h[q+24>>3];w=+cb(+u,+v);x=o+u/w;u=n+v/w;q=p+1|0;if((q|0)<(c[k>>2]|0)){n=u;o=x;p=q}else{y=u;z=x;A=m;break}}}else{y=0.0;z=0.0;A=b+8|0}o=+cb(+z,+y);m=c[A>>2]|0;n=+h[m+16>>3];x=+h[m+24>>3];u=+h[m+88>>3]+ +h[m+96>>3];w=+h[m+80>>3];m=b|0;p=u>w+ +(c[(c[(Hx(m)|0)+8>>2]|0)+240>>2]|0);t=c[A>>2]|0;if(p){B=+h[t+88>>3]+ +h[t+96>>3];C=t}else{w=+h[t+80>>3];u=w+ +(c[(c[(Hx(m)|0)+8>>2]|0)+240>>2]|0);B=u;C=c[A>>2]|0}u=z/o*B+ +h[C+16>>3];z=y/o*B+ +h[C+24>>3];C=j|0;h[C>>3]=n;m=j+8|0;h[m>>3]=x;h[j+16>>3]=(n*2.0+u)/3.0;h[j+24>>3]=(x*2.0+z)/3.0;h[j+32>>3]=(n+u*2.0)/3.0;h[j+40>>3]=(x+z*2.0)/3.0;h[j+48>>3]=u;h[j+56>>3]=z;$l(b,j|0);j=c[A>>2]|0;z=+h[C>>3]- +h[j+16>>3];u=+h[m>>3]- +h[j+24>>3];if(z<0.0){D=z+-.5}else{D=z+.5}z=+(~~D|0);if(u<0.0){E=u+-.5}else{E=u+.5}u=+(~~E|0);E=+h[j+88>>3];m=~~((z+E)*256.0/(E+ +h[j+96>>3]));if((c[k>>2]|0)<=0){F=j;G=F;H=G+145|0;a[H]=1;i=e;return}j=d|0;d=0;do{C=c[(c[j>>2]|0)+(d<<2)>>2]|0;ih(C,f,g);if((C|0)!=0){t=C;do{C=(t|0)==0;a:do{if(!C){p=t;do{l=p;q=c[l>>2]|0;s=p-32|0;if((c[((q&3|0)==2?p:s)+28>>2]|0)==(b|0)){r=c[p+8>>2]|0;I=r;h[r+56>>3]=z;h[r+64>>3]=u;h[r+72>>3]=0.0;c[r+80>>2]=0;a[r+84|0]=1;a[I+85|0]=0;a[I+86|0]=0;a[I+87|0]=0;a[r+88|0]=m;a[I+89|0]=0;c[r+92>>2]=0;J=c[l>>2]|0}else{J=q}q=p+8|0;if((c[((J&3|0)==3?p:p+32|0)+28>>2]|0)==(b|0)){r=c[q>>2]|0;I=r;h[r+16>>3]=z;h[r+24>>3]=u;h[r+32>>3]=0.0;c[r+40>>2]=0;a[r+44|0]=1;a[I+45|0]=0;a[I+46|0]=0;a[I+47|0]=0;a[r+48|0]=m;a[I+49|0]=0;c[r+52>>2]=0}if((a[(c[q>>2]|0)+112|0]|0)!=1){break}q=c[(c[((c[l>>2]&3|0)==2?p:s)+28>>2]|0)+8>>2]|0;if((a[q+156|0]|0)!=1){break}s=q+180|0;if((c[s+4>>2]|0)!=1){break}p=c[c[s>>2]>>2]|0;}while((p|0)!=0);if(C){break}else{K=t}do{p=K;s=c[p>>2]|0;if((c[((s&3|0)==2?K:K-32|0)+28>>2]|0)==(b|0)){q=c[K+8>>2]|0;l=q;h[q+56>>3]=z;h[q+64>>3]=u;h[q+72>>3]=0.0;c[q+80>>2]=0;a[q+84|0]=1;a[l+85|0]=0;a[l+86|0]=0;a[l+87|0]=0;a[q+88|0]=m;a[l+89|0]=0;c[q+92>>2]=0;L=c[p>>2]|0}else{L=s}s=K+32|0;q=K+8|0;if((c[((L&3|0)==3?K:s)+28>>2]|0)==(b|0)){l=c[q>>2]|0;r=l;h[l+16>>3]=z;h[l+24>>3]=u;h[l+32>>3]=0.0;c[l+40>>2]=0;a[l+44|0]=1;a[r+45|0]=0;a[r+46|0]=0;a[r+47|0]=0;a[l+48|0]=m;a[r+49|0]=0;c[l+52>>2]=0}if((a[(c[q>>2]|0)+112|0]|0)!=1){break a}q=c[(c[((c[p>>2]&3|0)==3?K:s)+28>>2]|0)+8>>2]|0;if((a[q+156|0]|0)!=1){break a}s=q+172|0;if((c[s+4>>2]|0)!=1){break a}K=c[c[s>>2]>>2]|0;}while((K|0)!=0)}}while(0);t=c[(c[t+8>>2]|0)+172>>2]|0;}while((t|0)!=0)}d=d+1|0;}while((d|0)<(c[k>>2]|0));F=c[A>>2]|0;G=F;H=G+145|0;a[H]=1;i=e;return}function sq(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;return}function tq(a){a=a|0;var b=0;b=jk(64)|0;c[b+36>>2]=0;c[b+40>>2]=0;c[b+8>>2]=a;return b|0}function uq(a){a=a|0;if((a|0)==0){return}br(c[a+32>>2]|0);eF(a);return}function vq(a){a=a|0;return Lw(c[a+8>>2]|0)|0}function wq(a,b){a=a|0;b=b|0;var d=0,e=0;c[b+4>>2]=0;d=a+4|0;e=c[d>>2]|0;if((e|0)==0){c[a>>2]=b;c[d>>2]=b;return}else{c[e+4>>2]=b;c[d>>2]=b;return}}function xq(a,b){a=a|0;b=b|0;var d=0,e=0;d=a|0;e=c[d>>2]|0;if((e|0)==0){c[d>>2]=b;c[a+4>>2]=b;return}else{c[b+4>>2]=e;c[d>>2]=b;return}}function yq(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0,ya=0.0,za=0,Aa=0,Ba=0;e=i;i=i+128|0;f=e|0;g=c[b+8>>2]|0;j=ux(g)|0;if((j|0)!=0){k=j;do{j=mw(a,k)|0;if((j|0)!=0){l=j;do{if((c[(c[(c[(c[((c[l>>2]&3|0)==2?l:l-32|0)+28>>2]|0)+8>>2]|0)+112>>2]|0)+12>>2]|0)==(b|0)){xw(g,l,1)|0}l=ow(a,l)|0;}while((l|0)!=0)}k=vx(g,k)|0;}while((k|0)!=0)}k=f|0;f=c[45214]|0;c[45214]=f+1;nb(k|0,115440,(a=i,i=i+8|0,c[a>>2]=f,a)|0)|0;i=a;f=ry(g,k,1)|0;Wx(f|0,158088,272,1)|0;l=c[45214]|0;c[45214]=l+1;nb(k|0,115440,(a=i,i=i+8|0,c[a>>2]=l,a)|0)|0;i=a;l=Hw(k,g+12|0,0)|0;j=ux(g)|0;if((j|0)!=0){m=j;do{zx(f,m,1)|0;j=Ax(l,$w(m|0)|0,1)|0;Wx(j|0,108392,304,1)|0;c[(c[(c[m+8>>2]|0)+112>>2]|0)+16>>2]=j;m=vx(g,m)|0;}while((m|0)!=0)}m=ux(g)|0;if((m|0)!=0){j=m;do{m=c[(c[(c[j+8>>2]|0)+112>>2]|0)+16>>2]|0;n=mw(g,j)|0;if((n|0)!=0){o=m+8|0;p=n;do{xw(f,p,1)|0;n=c[(c[(c[(c[((c[p>>2]&3|0)==2?p:p-32|0)+28>>2]|0)+8>>2]|0)+112>>2]|0)+16>>2]|0;q=uw(l,m,n,0,1)|0;Wx(q|0,128120,176,1)|0;c[(c[q+8>>2]|0)+116>>2]=p;q=(c[o>>2]|0)+236|0;c[q>>2]=(c[q>>2]|0)+1;q=(c[n+8>>2]|0)+236|0;c[q>>2]=(c[q>>2]|0)+1;p=ow(g,p)|0;}while((p|0)!=0)}j=vx(g,j)|0;}while((j|0)!=0)}j=Lw(l)|0;p=Nq()|0;o=ux(l)|0;if((o|0)!=0){m=o;do{Pq(p,m);m=vx(l,m)|0;}while((m|0)!=0)}m=j-3|0;if((m|0)>0){j=0;do{o=Rq(p)|0;q=rw(l,o)|0;if((q|0)!=0){n=q;do{q=c[n>>2]&3;r=c[((q|0)==2?n:n-32|0)+28>>2]|0;if((o|0)==(r|0)){s=c[((q|0)==3?n:n+32|0)+28>>2]|0}else{s=r}Qq(p,s);n=sw(l,n,o)|0;}while((n|0)!=0)}n=c[(c[o+8>>2]|0)+236>>2]|0;r=n<<2;q=kk(r)|0;t=q;u=kk(r)|0;r=u;v=rw(l,o)|0;if((v|0)==0){w=0;x=0}else{y=0;z=0;A=v;v=0;while(1){B=c[A>>2]&3;C=c[((B|0)==2?A:A-32|0)+28>>2]|0;if((C|0)==(o|0)){D=c[((B|0)==3?A:A+32|0)+28>>2]|0}else{D=C}C=rw(l,o)|0;do{if((C|0)==0){E=v;F=35}else{B=C;G=0;H=v;while(1){do{if((B|0)==(A|0)){I=H;J=G}else{K=c[B>>2]&3;L=c[((K|0)==2?B:B-32|0)+28>>2]|0;if((L|0)==(o|0)){M=c[((K|0)==3?B:B+32|0)+28>>2]|0}else{M=L}L=uw(l,D,M,0,0)|0;if((L|0)==0){I=H;J=G;break}if(D>>>0>=M>>>0){I=H;J=1;break}K=H+1|0;N=L+8|0;L=c[(c[N>>2]|0)+116>>2]|0;if((L|0)==0){I=K;J=1;break}Gx(f,L)|0;c[(c[N>>2]|0)+116>>2]=0;I=K;J=1}}while(0);K=sw(l,B,o)|0;if((K|0)==0){break}else{B=K;G=J;H=I}}if((J|0)==0){E=I;F=35;break}c[t+(y<<2)>>2]=D;O=z;P=y+1|0;Q=I}}while(0);if((F|0)==35){F=0;c[r+(z<<2)>>2]=D;O=z+1|0;P=y;Q=E}C=sw(l,A,o)|0;if((C|0)==0){w=O;x=Q;break}else{y=P;z=O;A=C;v=Q}}}v=n-1-x|0;a:do{if((v|0)>0){if((v|0)>=(w|0)){if((v|0)!=(w|0)){break}A=c[t>>2]|0;if((w|0)<=0){break}z=A+8|0;y=0;while(1){C=c[r+(y<<2)>>2]|0;Wx(uw(l,A,C,0,1)|0,128120,176,1)|0;H=(c[z>>2]|0)+236|0;c[H>>2]=(c[H>>2]|0)+1;H=(c[C+8>>2]|0)+236|0;c[H>>2]=(c[H>>2]|0)+1;y=y+1|0;if((y|0)>=(w|0)){break a}}}b:do{if((w|0)>0){y=v;z=0;while(1){A=z|1;if((A|0)>=(w|0)){R=y;break b}H=c[r+(z<<2)>>2]|0;C=c[r+(A<<2)>>2]|0;Wx(uw(l,H,C,0,1)|0,128120,176,1)|0;A=(c[H+8>>2]|0)+236|0;c[A>>2]=(c[A>>2]|0)+1;A=(c[C+8>>2]|0)+236|0;c[A>>2]=(c[A>>2]|0)+1;A=y-1|0;C=z+2|0;if((C|0)<(w|0)){y=A;z=C}else{R=A;break}}}else{R=v}}while(0);if((R|0)>0){S=R;T=2}else{break}while(1){z=c[r>>2]|0;y=c[r+(T<<2)>>2]|0;Wx(uw(l,z,y,0,1)|0,128120,176,1)|0;A=(c[z+8>>2]|0)+236|0;c[A>>2]=(c[A>>2]|0)+1;A=(c[y+8>>2]|0)+236|0;c[A>>2]=(c[A>>2]|0)+1;A=S-1|0;if((A|0)>0){S=A;T=T+1|0}else{break}}}}while(0);eF(u);eF(q);r=rw(l,o)|0;if((r|0)!=0){v=r;do{r=c[v>>2]&3;t=c[((r|0)==2?v:v-32|0)+28>>2]|0;if((o|0)==(t|0)){U=c[((r|0)==3?v:v+32|0)+28>>2]|0}else{U=t}t=(c[U+8>>2]|0)+236|0;c[t>>2]=(c[t>>2]|0)-1;Pq(p,U);v=sw(l,v,o)|0;}while((v|0)!=0)}Gx(l,o|0)|0;j=j+1|0;}while((j|0)<(m|0))}Kw(l)|0;Oq(p);p=c[43748]|0;c[43748]=p+1;nb(k|0,120712,(a=i,i=i+8|0,c[a>>2]=p,a)|0)|0;i=a;a=ry(f,k,1)|0;Wx(a|0,158088,272,1)|0;k=ux(f)|0;if((k|0)!=0){p=k;do{zx(a,p,1)|0;k=p+8|0;c[(c[(c[k>>2]|0)+112>>2]|0)+28>>2]=0;c[(c[(c[k>>2]|0)+112>>2]|0)+32>>2]=0;l=(c[(c[k>>2]|0)+112>>2]|0)+4|0;c[l>>2]=c[l>>2]&-2;p=vx(f,p)|0;}while((p|0)!=0)}p=ux(f)|0;if((p|0)!=0){l=p;do{p=c[(c[l+8>>2]|0)+112>>2]|0;if((c[p+4>>2]&1|0)==0){c[p+16>>2]=0;Aq(f,l,a)}l=vx(f,l)|0;}while((l|0)!=0)}do{if((Lw(a)|0)==1){l=ar()|0;p=ux(a)|0;cr(l,0,p);k=(c[(c[p+8>>2]|0)+112>>2]|0)+4|0;c[k>>2]=c[k>>2]|16;X=l}else{l=ux(a)|0;if((l|0)!=0){k=l;do{l=rw(a,k)|0;c:do{if((l|0)!=0){p=l;m=0;while(1){j=sw(a,p,k)|0;if((j|0)==0){break}else{p=j;m=m+1|0}}if((m|0)!=0){break}p=c[(c[(c[k+8>>2]|0)+112>>2]|0)+16>>2]|0;if((p|0)==0){break}else{Y=0;Z=0;_=p}while(1){$=Y+1|0;aa=_+8|0;ba=c[(c[aa>>2]|0)+112>>2]|0;p=c[ba+28>>2]|0;if((p|0)==0){c[ba+20>>2]=k;c[(c[(c[aa>>2]|0)+112>>2]|0)+28>>2]=$;ca=Z}else{if((p|0)>(Y|0)){break}p=c[ba+20>>2]|0;if((p|0)==(Z|0)){da=Z;ea=ba}else{j=ba+24|0;if((c[ba+32>>2]|0)==0){F=72}else{if((c[j>>2]|0)==(Z|0)){fa=Z}else{F=72}}if((F|0)==72){F=0;fa=p}c[j>>2]=p;p=c[(c[aa>>2]|0)+112>>2]|0;c[p+32>>2]=c[p+28>>2];da=fa;ea=c[(c[aa>>2]|0)+112>>2]|0}c[ea+20>>2]=k;c[(c[(c[aa>>2]|0)+112>>2]|0)+28>>2]=$;ca=da}p=c[(c[(c[aa>>2]|0)+112>>2]|0)+16>>2]|0;if((p|0)==0){break c}else{Y=$;Z=ca;_=p}}if((c[ba+32>>2]|0)>(Y|0)){break}c[ba+24>>2]=k;c[(c[(c[aa>>2]|0)+112>>2]|0)+32>>2]=$}}while(0);k=vx(a,k)|0;}while((k|0)!=0)}k=ux(a)|0;if((k|0)==0){ga=0}else{o=0;l=k;k=0;while(1){m=c[(c[l+8>>2]|0)+112>>2]|0;p=(c[m+32>>2]|0)+(c[m+28>>2]|0)|0;m=(p|0)>(k|0);j=m?l:o;U=vx(a,l)|0;if((U|0)==0){ga=j;break}else{o=j;l=U;k=m?p:k}}}k=ar()|0;l=ga+8|0;o=c[(c[(c[l>>2]|0)+112>>2]|0)+20>>2]|0;if((o|0)!=(ga|0)){p=o;do{cr(k,0,p);o=p+8|0;m=(c[(c[o>>2]|0)+112>>2]|0)+4|0;c[m>>2]=c[m>>2]|16;p=c[(c[(c[o>>2]|0)+112>>2]|0)+16>>2]|0;}while((p|0)!=(ga|0))}cr(k,0,ga);p=(c[(c[l>>2]|0)+112>>2]|0)+4|0;c[p>>2]=c[p>>2]|16;if((c[(c[(c[l>>2]|0)+112>>2]|0)+32>>2]|0)==0){X=k;break}p=ar()|0;o=c[(c[(c[l>>2]|0)+112>>2]|0)+24>>2]|0;if((o|0)!=(ga|0)){m=o;do{cr(p,0,m);o=m+8|0;U=(c[(c[o>>2]|0)+112>>2]|0)+4|0;c[U>>2]=c[U>>2]|16;m=c[(c[(c[o>>2]|0)+112>>2]|0)+16>>2]|0;}while((m|0)!=(ga|0))}hr(k,p);X=k}}while(0);ga=ux(g)|0;if((ga|0)!=0){a=X|0;$=X+4|0;aa=ga;do{if((c[(c[(c[aa+8>>2]|0)+112>>2]|0)+4>>2]&16|0)==0){ga=ar()|0;ba=mw(g,aa)|0;if((ba|0)!=0){Y=ba;do{ba=Y;_=Y-32|0;cr(ga,0,c[((c[ba>>2]&3|0)==2?Y:_)+28>>2]|0);ca=(c[(c[(c[((c[ba>>2]&3|0)==2?Y:_)+28>>2]|0)+8>>2]|0)+112>>2]|0)+4|0;c[ca>>2]=c[ca>>2]|32;Y=ow(g,Y)|0;}while((Y|0)!=0)}Y=pw(g,aa)|0;if((Y|0)!=0){k=Y;do{Y=k;p=k+32|0;cr(ga,0,c[((c[Y>>2]&3|0)==3?k:p)+28>>2]|0);ca=(c[(c[(c[((c[Y>>2]&3|0)==3?k:p)+28>>2]|0)+8>>2]|0)+112>>2]|0)+4|0;c[ca>>2]=c[ca>>2]|32;k=qw(g,k)|0;}while((k|0)!=0)}d:do{if((gr(ga)|0)>1){k=c[a>>2]|0;if((k|0)==0){F=100;break}else{ha=k}while(1){k=ha+4|0;if((c[(c[(c[(c[ha>>2]|0)+8>>2]|0)+112>>2]|0)+4>>2]&32|0)!=0){if((c[(c[(c[(c[c[((ha|0)==(c[$>>2]|0)?a:k)>>2]>>2]|0)+8>>2]|0)+112>>2]|0)+4>>2]&32|0)!=0){break}}ca=c[k>>2]|0;if((ca|0)==0){F=100;break d}else{ha=ca}}cr(X,ha,aa)}else{F=100}}while(0);e:do{if((F|0)==100){F=0;f:do{if((gr(ga)|0)>0){ca=c[a>>2]|0;if((ca|0)==0){break}else{ia=ca}while(1){if((c[(c[(c[(c[ia>>2]|0)+8>>2]|0)+112>>2]|0)+4>>2]&32|0)!=0){break}ca=c[ia+4>>2]|0;if((ca|0)==0){break f}else{ia=ca}}cr(X,ia,aa);break e}}while(0);cr(X,0,aa)}}while(0);ca=c[ga>>2]|0;if((ca|0)!=0){k=ca;do{ca=(c[(c[(c[k>>2]|0)+8>>2]|0)+112>>2]|0)+4|0;c[ca>>2]=c[ca>>2]&-33;k=c[k+4>>2]|0;}while((k|0)!=0)}br(ga)}aa=vx(g,aa)|0;}while((aa|0)!=0)}aa=zq(X,g)|0;g:do{if((aa|0)==0){ja=X}else{ia=aa;a=X;ha=0;while(1){$=ux(g)|0;if(($|0)==0){ka=a;la=ia}else{k=$;$=a;ca=ia;while(1){p=rw(g,k)|0;if((p|0)==0){ma=$;na=ca}else{Y=p;p=$;_=ca;while(1){ba=c[Y>>2]&3;Z=c[((ba|0)==3?Y:Y+32|0)+28>>2]|0;if((Z|0)==(k|0)){oa=c[((ba|0)==2?Y:Y-32|0)+28>>2]|0}else{oa=Z}Z=p;ba=_;da=0;while(1){ea=er(Z)|0;fr(Z,k,oa,da);fa=zq(Z,g)|0;if((fa|0)<(ba|0)){br(ea);if((fa|0)==0){ja=Z;break g}else{pa=fa;qa=Z}}else{br(Z);pa=ba;qa=ea}ea=da+1|0;if((ea|0)<2){Z=qa;ba=pa;da=ea}else{break}}da=sw(g,Y,k)|0;if((da|0)==0){ma=qa;na=pa;break}else{Y=da;p=qa;_=pa}}}_=vx(g,k)|0;if((_|0)==0){ka=ma;la=na;break}else{k=_;$=ma;ca=na}}}ca=ha+1|0;if((la|0)!=0&(ia|0)!=(la|0)&(ca|0)<10){ia=la;a=ka;ha=ca}else{ja=ka;break}}}}while(0);ka=gr(ja)|0;la=ja|0;na=c[la>>2]|0;ma=(na|0)==0;if(ma){ra=0.0}else{sa=0.0;g=na;while(1){pa=c[(c[c[(c[(c[g>>2]|0)+8>>2]|0)+112>>2]>>2]|0)+8>>2]|0;ta=+h[pa+32>>3];ua=ta>sa?ta:sa;ta=+h[pa+40>>3];va=ta>ua?ta:ua;pa=c[g+4>>2]|0;if((pa|0)==0){ra=va;break}else{sa=va;g=pa}}}g=(ka|0)==1;if(g){wa=0.0}else{wa=+(ka|0)*(ra+d)/6.283185307179586}do{if(!ma){pa=na;while(1){if((c[(c[(c[(c[pa>>2]|0)+8>>2]|0)+112>>2]|0)+4>>2]&8|0)!=0){F=130;break}qa=c[pa+4>>2]|0;if((qa|0)==0){xa=na;break}else{pa=qa}}if((F|0)==130){dr(ja,pa);xa=c[la>>2]|0}if((xa|0)==0){break}d=6.283185307179586/+(ka|0);qa=0;oa=xa;while(1){X=(c[oa>>2]|0)+8|0;c[(c[(c[X>>2]|0)+112>>2]|0)+16>>2]=qa;h[(c[(c[X>>2]|0)+112>>2]|0)+24>>3]=0.0;sa=+(qa|0)*d;va=wa*+V(sa);h[c[(c[X>>2]|0)+132>>2]>>3]=va;va=wa*+W(sa);h[(c[(c[X>>2]|0)+132>>2]|0)+8>>3]=va;X=c[oa+4>>2]|0;if((X|0)==0){break}else{qa=qa+1|0;oa=X}}}}while(0);if(g){d=ra*.5;h[b+16>>3]=d;ya=d;za=b+24|0;h[za>>3]=ya;Aa=b+48|0;h[Aa>>3]=-1.0;Ba=Kw(f)|0;i=e;return ja|0}else{h[b+16>>3]=wa;ya=wa;za=b+24|0;h[za>>3]=ya;Aa=b+48|0;h[Aa>>3]=-1.0;Ba=Kw(f)|0;i=e;return ja|0}return 0}function zq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=Vq()|0;e=ux(b)|0;if((e|0)!=0){f=e;do{e=mw(b,f)|0;if((e|0)!=0){g=e;do{c[c[(c[g+8>>2]|0)+120>>2]>>2]=0;g=ow(b,g)|0;}while((g|0)!=0)}f=vx(b,f)|0;}while((f|0)!=0)}f=c[a>>2]|0;if((f|0)==0){h=0;Wq(d);return h|0}a=d|0;g=0;e=1;i=f;while(1){f=c[i>>2]|0;j=rw(b,f)|0;if((j|0)==0){k=g}else{l=j;j=g;while(1){m=l+8|0;if((c[c[(c[m>>2]|0)+120>>2]>>2]|0)>0){n=Hc[c[a>>2]&63](d,0,128)|0;if((n|0)==0){o=j}else{p=j;q=n;while(1){n=c[q+8>>2]|0;do{if((c[c[(c[n+8>>2]|0)+120>>2]>>2]|0)>(c[c[(c[m>>2]|0)+120>>2]>>2]|0)){r=c[n>>2]&3;if((c[((r|0)==2?n:n-32|0)+28>>2]|0)==(f|0)){s=p;break}s=((c[((r|0)==3?n:n+32|0)+28>>2]|0)!=(f|0))+p|0}else{s=p}}while(0);n=Hc[c[a>>2]&63](d,q,8)|0;if((n|0)==0){o=s;break}else{p=s;q=n}}}Yq(d,l);t=o}else{t=j}q=sw(b,l,f)|0;if((q|0)==0){k=t;break}else{l=q;j=t}}}j=rw(b,f)|0;if((j|0)!=0){l=j;do{j=c[(c[l+8>>2]|0)+120>>2]|0;if((c[j>>2]|0)==0){c[j>>2]=e;Xq(d,l)}l=sw(b,l,f)|0;}while((l|0)!=0)}l=c[i+4>>2]|0;if((l|0)==0){h=k;break}else{g=k;e=e+1|0;i=l}}Wq(d);return h|0}function Aq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=(c[(c[b+8>>2]|0)+112>>2]|0)+4|0;c[e>>2]=c[e>>2]|1;e=rw(a,b)|0;if((e|0)==0){return}else{f=e}do{e=c[f>>2]&3;g=c[((e|0)==2?f:f-32|0)+28>>2]|0;if((g|0)==(b|0)){h=c[((e|0)==3?f:f+32|0)+28>>2]|0}else{h=g}g=h+8|0;if((c[(c[(c[g>>2]|0)+112>>2]|0)+4>>2]&1|0)==0){xw(d,f,1)|0;c[(c[(c[g>>2]|0)+112>>2]|0)+16>>2]=b;Aq(a,h,d)}f=sw(a,f,b)|0;}while((f|0)!=0);return}function Bq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0;e=i;i=i+8|0;f=e|0;g=c[d+24>>2]|0;if((g|0)==0){h=3}else{j=Ax(b,g,0)|0;if((j|0)==0){h=3}else{k=j}}a:do{if((h|0)==3){j=d+20|0;do{if((c[j>>2]|0)!=0){g=ux(b)|0;if((g|0)==0){break}else{l=g}do{if((Jm(c[c[(c[l+8>>2]|0)+112>>2]>>2]|0,c[j>>2]|0,0)|0)<<24>>24!=0){k=l;break a}l=vx(b,l)|0;}while((l|0)!=0)}}while(0);k=ux(b)|0}}while(0);if((a[213992]|0)!=0){l=c[o>>2]|0;h=$w(k|0)|0;gc(l|0,102768,(l=i,i=i+8|0,c[l>>2]=h,l)|0)|0;i=l}c[f+4>>2]=0;c[f>>2]=0;Dq(b,k,d,1,f);f=d|0;k=c[d>>2]|0;d=c[k+4>>2]|0;if((d|0)==0){sq(f);i=e;return k|0}else{m=d}while(1){d=c[m+8>>2]|0;b=ux(d)|0;l=c[(c[b+8>>2]|0)+112>>2]|0;h=c[l+20>>2]|0;j=c[l+8>>2]|0;l=vx(d,b)|0;if((l|0)==0){n=j;p=b}else{g=h;h=l;l=j;j=b;while(1){b=c[(c[h+8>>2]|0)+112>>2]|0;q=c[b+20>>2]|0;if((q|0)<(g|0)){r=h;s=c[b+8>>2]|0;t=q}else{r=j;s=l;t=g}q=vx(d,h)|0;if((q|0)==0){n=s;p=r;break}else{g=t;h=q;l=s;j=r}}}j=n+8|0;l=(c[(c[j>>2]|0)+112>>2]|0)+4|0;c[l>>2]=c[l>>2]|8;c[m>>2]=p;l=c[m+4>>2]|0;wq((c[(c[(c[j>>2]|0)+112>>2]|0)+12>>2]|0)+36|0,m);if((l|0)==0){break}else{m=l}}sq(f);i=e;return k|0}function Cq(a){a=a|0;var b=0,d=0;b=c[a+36>>2]|0;if((b|0)==0){uq(a);return}else{d=b}while(1){b=c[d+4>>2]|0;Cq(d);if((b|0)==0){break}else{d=b}}uq(a);return}function Dq(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;g=i;i=i+128|0;h=g|0;j=d+8|0;k=c[j>>2]|0;c[j>>2]=k+1;j=b+8|0;c[(c[(c[j>>2]|0)+112>>2]|0)+20>>2]=k;c[(c[(c[j>>2]|0)+112>>2]|0)+24>>2]=k;k=rw(a,b)|0;a:do{if((k|0)!=0){l=f|0;m=f+4|0;n=h|0;o=d+12|0;p=(e|0)==0;q=d|0;r=k;b:while(1){s=c[r>>2]&3;t=c[((s|0)==2?r:r-32|0)+28>>2]|0;do{if((t|0)==(b|0)){u=c[((s|0)==3?r:r+32|0)+28>>2]|0;v=c[(c[r+8>>2]|0)+120>>2]|0;if((c[v>>2]|0)!=0){w=u;break}c[v>>2]=-1;w=u}else{u=c[(c[r+8>>2]|0)+120>>2]|0;if((c[u>>2]|0)!=0){w=t;break}c[u>>2]=1;w=t}}while(0);t=w+8|0;s=c[(c[t>>2]|0)+112>>2]|0;u=c[s+20>>2]|0;c:do{if((u|0)==0){c[s+8>>2]=b;c[(c[(c[r+8>>2]|0)+120>>2]|0)+4>>2]=c[l>>2];c[l>>2]=r;c[m>>2]=(c[m>>2]|0)+1;Dq(a,w,d,0,f);v=(c[(c[j>>2]|0)+112>>2]|0)+24|0;x=c[v>>2]|0;y=c[(c[(c[t>>2]|0)+112>>2]|0)+24>>2]|0;c[v>>2]=(x|0)<(y|0)?x:y;if((c[(c[(c[t>>2]|0)+112>>2]|0)+24>>2]|0)<(c[(c[(c[j>>2]|0)+112>>2]|0)+20>>2]|0)){break}else{z=0}while(1){y=c[l>>2]|0;if((y|0)==0){A=13;break b}x=c[m>>2]|0;if((x|0)<=0){A=12;break b}v=y+8|0;c[l>>2]=c[(c[(c[v>>2]|0)+120>>2]|0)+4>>2];c[m>>2]=x-1;x=c[y>>2]&3;if((c[c[(c[v>>2]|0)+120>>2]>>2]|0)==1){B=(x|0)==2?y:y-32|0}else{B=(x|0)==3?y:y+32|0}x=c[B+28>>2]|0;v=x+8|0;if((c[(c[(c[v>>2]|0)+112>>2]|0)+12>>2]|0)==0){if((z|0)==0){C=c[o>>2]|0;c[o>>2]=C+1;nb(n|0,145288,(D=i,i=i+8|0,c[D>>2]=C,D)|0)|0;i=D;C=ry(a,n,1)|0;Wx(C|0,120200,272,1)|0;E=tq(C)|0}else{E=z}zx(c[E+8>>2]|0,x,1)|0;c[(c[(c[v>>2]|0)+112>>2]|0)+12>>2]=E;F=E}else{F=z}if((y|0)==(r|0)){break}else{z=F}}if((F|0)==0){break}do{if((c[(c[(c[j>>2]|0)+112>>2]|0)+12>>2]|0)==0){if((vq(F)|0)<=1){break}zx(c[F+8>>2]|0,b,1)|0;c[(c[(c[j>>2]|0)+112>>2]|0)+12>>2]=F}}while(0);do{if(!p){if((c[(c[(c[j>>2]|0)+112>>2]|0)+12>>2]|0)!=(F|0)){break}xq(q,F);break c}}while(0);wq(q,F)}else{y=c[(c[j>>2]|0)+112>>2]|0;if((c[y+8>>2]|0)==(w|0)){break}v=y+24|0;y=c[v>>2]|0;c[v>>2]=(y|0)<(u|0)?y:u}}while(0);r=sw(a,r,b)|0;if((r|0)==0){break a}}if((A|0)==12){cc(111616,104840,61,170096)}else if((A|0)==13){cc(103904,104840,65,170096)}}}while(0);if((e|0)==0){i=g;return}if((c[(c[(c[j>>2]|0)+112>>2]|0)+12>>2]|0)!=0){i=g;return}e=h|0;h=d+12|0;A=c[h>>2]|0;c[h>>2]=A+1;nb(e|0,145288,(D=i,i=i+8|0,c[D>>2]=A,D)|0)|0;i=D;D=ry(a,e,1)|0;Wx(D|0,120200,272,1)|0;e=tq(D)|0;zx(c[e+8>>2]|0,b,1)|0;c[(c[(c[j>>2]|0)+112>>2]|0)+12>>2]=e;xq(d|0,e);i=g;return}function Eq(a,b,c){a=a|0;b=b|0;c=c|0;Fq(a,b,+h[c+32>>3]);return}function Fq(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0.0,M=0,N=0.0,O=0.0,P=0,Q=0.0,R=0,S=0.0,U=0,X=0.0,Y=0.0,_=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0,ga=0.0,ha=0,ia=0.0,ja=0.0,ka=0,la=0,ma=0,na=0,oa=0.0,pa=0.0,qa=0,ra=0.0,sa=0.0,ta=0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0.0,Ba=0,Ca=0.0,Da=0.0,Ea=0,Fa=0,Ga=0,Ha=0.0,Ia=0.0,Ja=0,Ka=0,La=0,Ma=0.0,Na=0.0,Oa=0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0;e=b+36|0;f=c[e>>2]|0;if((f|0)==0){g=0}else{i=0;j=f;while(1){Fq(a,j,d);f=i+1|0;k=c[j+4>>2]|0;if((k|0)==0){g=f;break}else{i=f;j=k}}}j=yq(a,b,d)|0;c[b+32>>2]=j;a=gr(j)|0;if((g|0)>0){i=jk(g*56|0)|0;k=i;f=c[e>>2]|0;e=b+16|0;l=+h[e>>3];m=c[b>>2]|0;n=6.283185307179586/+(a|0);o=c[j>>2]|0;a:do{if((o|0)==0){p=-1.0;q=-1.0;r=l;s=0.0}else{j=(f|0)==0;t=l+d;if(j){u=t+0.0;v=0;w=0;x=o;while(1){y=c[x>>2]|0;if((c[(c[(c[y+8>>2]|0)+112>>2]|0)+4>>2]&8|0)==0){z=w}else{c[k+(w*56|0)>>2]=y;h[k+(w*56|0)+8>>3]=n*+(v|0);h[k+(w*56|0)+32>>3]=0.0;c[k+(w*56|0)+48>>2]=0;h[k+(w*56|0)+16>>3]=u;h[k+(w*56|0)+24>>3]=0.0;z=w+1|0}y=c[x+4>>2]|0;if((y|0)==0){A=0.0;B=z;break}else{v=v+1|0;w=z;x=y}}}else{x=0;u=0.0;w=0;v=o;while(1){y=c[v>>2]|0;C=x+1|0;if((c[(c[(c[y+8>>2]|0)+112>>2]|0)+4>>2]&8|0)==0){D=w;E=u}else{c[k+(w*56|0)>>2]=y;h[k+(w*56|0)+8>>3]=n*+(x|0);F=0.0;G=0.0;H=0;I=f;while(1){J=c[I>>2]|0;if((J|0)==0){K=0}else{K=c[(c[(c[J+8>>2]|0)+112>>2]|0)+8>>2]|0}if((K|0)==(y|0)){L=+h[I+16>>3];M=H+1|0;N=G+(L*2.0+d);O=F<L?L:F}else{M=H;N=G;O=F}J=c[I+4>>2]|0;if((J|0)==0){break}else{F=O;G=N;H=M;I=J}}h[k+(w*56|0)+32>>3]=N;c[k+(w*56|0)+48>>2]=M;h[k+(w*56|0)+16>>3]=t+O;h[k+(w*56|0)+24>>3]=O;D=w+1|0;E=O}I=c[v+4>>2]|0;if((I|0)==0){A=E;B=D;break}else{x=C;u=E;w=D;v=I}}}do{if((B|0)==1){h[i+40>>3]=1.0;P=1}else if((B|0)==2){u=+h[i+64>>3]- +h[i+8>>3];if(u>3.141592653589793){Q=6.283185307179586-u}else{Q=u}u=+h[i+72>>3];t=+h[i+16>>3];G=(+h[i+32>>3]*u+ +h[i+88>>3]*t)/(u*Q*2.0*t);t=G<1.0?1.0:G;v=i+40|0;if(t>+h[v>>3]){h[v>>3]=t}v=i+96|0;if(t<=+h[v>>3]){R=29;break}h[v>>3]=t;R=29}else{if((B|0)<=0){p=-1.0;q=-1.0;r=l;s=A;break a}v=i+8|0;w=0;x=k;while(1){I=w+1|0;if((I|0)==(B|0)){S=+h[v>>3]- +h[x+8>>3]+6.283185307179586;U=k}else{S=+h[x+64>>3]- +h[x+8>>3];U=x+56|0}t=+h[U+16>>3];G=+h[x+16>>3];u=(+h[x+32>>3]*t+ +h[U+32>>3]*G)/(t*S*2.0*G);G=u<1.0?1.0:u;H=x+40|0;if(G>+h[H>>3]){h[H>>3]=G}H=U+40|0;if(G>+h[H>>3]){h[H>>3]=G}if((I|0)<(B|0)){w=I;x=x+56|0}else{R=29;break}}}}while(0);if((R|0)==29){if((B|0)>0){P=B}else{p=-1.0;q=-1.0;r=l;s=A;break}}x=(a|0)==1;w=(a|0)>1;v=m+8|0;G=-1.0;u=-1.0;t=l;C=0;while(1){I=k+(C*56|0)|0;F=+h[k+(C*56|0)+40>>3]*+h[k+(C*56|0)+16>>3];do{if(x){L=+h[k+(C*56|0)+32>>3];X=L/6.283185307179586;Y=F>X?F:X;X=Y*6.283185307179586-L;if(X<=0.0){_=d;aa=0.0;ba=Y;break}_=X/+(c[k+(C*56|0)+48>>2]|0)+d;aa=0.0;ba=Y}else{_=d;aa=+h[k+(C*56|0)+8>>3]- +h[k+(C*56|0)+32>>3]/(F*2.0);ba=F}}while(0);F=ba+ +h[k+(C*56|0)+24>>3];Y=F>t?F:t;F=_/ba;H=k+(C*56|0)+48|0;y=((c[H>>2]|0)+1|0)/2|0;if(j){ca=0.0;da=u;ea=G}else{J=I|0;X=F*.5;fa=k+(C*56|0)+8|0;L=x?F:X;F=0.0;ga=aa;ha=0;ia=u;ja=G;ka=f;while(1){la=ka|0;ma=c[la>>2]|0;if((ma|0)==0){na=0}else{na=c[(c[(c[ma+8>>2]|0)+112>>2]|0)+8>>2]|0}do{if((na|0)==(c[J>>2]|0)){ma=ka+32|0;if((gr(c[ma>>2]|0)|0)<1){oa=ja;pa=ia;qa=ha;ra=ga;sa=F;break}ta=ka+16|0;ua=+h[ta>>3]/ba;do{if(x){do{if(ga!=0.0){if((c[H>>2]|0)==2){va=3.141592653589793;break}va=ga+ua}else{va=ga}}while(0);wa=va;xa=ia<0.0?va:ia;ya=va}else{if((c[H>>2]|0)==1){wa=ja;xa=ia;ya=+h[fa>>3];break}else{wa=ja;xa=ia;ya=ga+(X+ua);break}}}while(0);za=ba*+V(ya);Aa=ba*+W(ya);Ba=c[ka+8>>2]|0;Ca=+h[ka+48>>3];b:do{if(Ca<0.0){if((gr(c[ma>>2]|0)|0)==2){Da=ya+ -1.5707963267948966;break}Ea=c[la>>2]|0;Fa=Ea+8|0;Ga=c[(c[Fa>>2]|0)+132>>2]|0;Ha=za+ +h[Ga>>3];Ia=Aa+ +h[Ga+8>>3];Ga=ux(Ba)|0;if((Ga|0)==0){Ja=Ea}else{Ka=Ea;La=Ga;Ma=Ha*Ha+Ia*Ia;while(1){do{if((La|0)==(Ea|0)){Na=Ma;Oa=Ka}else{Ga=c[(c[La+8>>2]|0)+132>>2]|0;Ia=za+ +h[Ga>>3];Ha=Aa+ +h[Ga+8>>3];Pa=Ia*Ia+Ha*Ha;if(Pa>=Ma){Na=Ma;Oa=Ka;break}Na=Pa;Oa=La}}while(0);Ga=vx(Ba,La)|0;if((Ga|0)==0){Ja=Oa;break}else{Ka=Oa;La=Ga;Ma=Na}}}if((Ea|0)==(Ja|0)){Da=0.0;break}Ma=+h[ka+24>>3];Pa=+h[ta>>3]-Ma;La=c[Fa>>2]|0;Ka=c[La+132>>2]|0;Ha=+h[Ka>>3];do{if((c[ka+56>>2]&1|0)!=0){if(Ha<=-0.0-Pa){break}Ia=+T(za*za+Aa*Aa);Qa=+$(+(+h[Ka+8>>3]),+(Pa+Ha));Ra=+V(Qa);Da=ya+(1.5707963267948966-Qa- +Z(Ra*((Pa-Ma/Ra)/Ia)));break b}}while(0);Ma=3.141592653589793- +$(+(+h[Ka+8>>3]),+Ha);Pa=ya+(Ma- +h[(c[La+112>>2]|0)+24>>3]);if(Pa<=6.283185307179586){Da=Pa;break}Da=Pa+ -6.283185307179586}else{Pa=ya+(3.141592653589793-Ca);if(Pa>=0.0){Da=Pa;break}Da=Pa+6.283185307179586}}while(0);Gq(ka,za,Aa,Da);Ca=L+ua+ya;ta=ha+1|0;oa=wa;pa=xa;qa=ta;ra=Ca;sa=(ta|0)==(y|0)?Ca:F}else{oa=ja;pa=ia;qa=ha;ra=ga;sa=F}}while(0);la=c[ka+4>>2]|0;if((la|0)==0){ca=sa;da=pa;ea=oa;break}else{F=sa;ga=ra;ha=qa;ia=pa;ja=oa;ka=la}}}do{if(w){if((c[I>>2]|0)!=(m|0)){break}h[(c[(c[v>>2]|0)+112>>2]|0)+24>>3]=ca}}while(0);I=C+1|0;if((I|0)<(P|0)){G=ea;u=da;t=Y;C=I}else{p=ea;q=da;r=Y;s=A;break}}}}while(0);eF(i);if((g|0)==1){A=d*.5+s;Gq(b,-0.0-A,0.0,0.0);h[e>>3]=A+ +h[e>>3];g=b+56|0;c[g>>2]=c[g>>2]|1}else{h[e>>3]=r}Sa=(q+p)*.5+ -3.141592653589793}else{Sa=3.141592653589793}if((a|0)!=1){return}a=c[b>>2]|0;if((a|0)==0){return}if((c[(c[(c[a+8>>2]|0)+112>>2]|0)+8>>2]|0)==0){return}a=b+48|0;h[a>>3]=Sa;if(Sa>=0.0){return}h[a>>3]=Sa+6.283185307179586;return}function Gq(a,b,d,e){a=a|0;b=+b;d=+d;e=+e;var f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;f=c[a+8>>2]|0;g=ux(f)|0;if((g|0)!=0){if(e!=0.0){i=g;do{j=i+8|0;k=c[(c[j>>2]|0)+132>>2]|0;l=k;m=+h[l>>3];n=+h[k+8>>3];o=+V(e);p=+W(e);h[l>>3]=m*o-n*p+b;h[(c[(c[j>>2]|0)+132>>2]|0)+8>>3]=n*o+m*p+d;i=vx(f,i)|0;}while((i|0)!=0)}else{i=g;do{g=i+8|0;j=c[(c[g>>2]|0)+132>>2]|0;l=j;p=+h[j+8>>3];h[l>>3]=+h[l>>3]+b;h[(c[(c[g>>2]|0)+132>>2]|0)+8>>3]=p+d;i=vx(f,i)|0;}while((i|0)!=0)}}i=c[a+36>>2]|0;if((i|0)==0){return}else{q=i}do{Gq(q,b,d,e);q=c[q+4>>2]|0;}while((q|0)!=0);return}function Hq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0;d=i;i=i+128|0;e=(Lw(a)|0)==1;f=(ux(a)|0)+8|0;g=c[f>>2]|0;if(e){h[c[g+132>>2]>>3]=0.0;h[(c[(c[f>>2]|0)+132>>2]|0)+8>>3]=0.0;i=d;return}f=Hx(c[c[g+112>>2]>>2]|0)|0;if((f|0)==(c[44682]|0)){j=0;k=f}else{c[45219]=0;c[44682]=f;g=Wv(f,0,131232,0)|0;c[44686]=Wv(c[44682]|0,1,116448,0)|0;c[44684]=Wv(c[44682]|0,1,109176,0)|0;j=g;k=c[44682]|0}c[44680]=ew(k|0,109176)|0;h[2694]=+Fm(c[44682]|0,j,1.0,0.0);sq(180864);c[45218]=1;h[22612]=+h[2694];c[45220]=c[44686];c[45221]=c[44684];c[45222]=c[44680];do{if((Km(ew(b|0,159688)|0)|0)<<24>>24==0){l=Bq(a,180864)|0}else{j=d|0;k=c[45219]|0;c[45219]=k+1;nb(j|0,163248,(g=i,i=i+8|0,c[g>>2]=k,g)|0)|0;i=g;g=tq(ry(a,j,1)|0)|0;j=ux(a)|0;if((j|0)==0){l=g;break}k=g+8|0;f=j;while(1){zx(c[k>>2]|0,f,1)|0;c[(c[(c[f+8>>2]|0)+112>>2]|0)+12>>2]=g;j=vx(a,f)|0;if((j|0)==0){l=g;break}else{f=j}}}}while(0);Eq(a,l,180864);Cq(l);i=d;return}function Iq(a){a=a|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0.0;qn(a,2);d=a+8|0;b[(c[d>>2]|0)+168>>1]=2;c[53568]=2;e=jk((Lw(a)|0)<<2)|0;f=jk(((Lw(a)|0)<<2)+4|0)|0;c[(c[d>>2]|0)+144>>2]=f;f=ux(a)|0;if((f|0)!=0){g=0;i=f;while(1){qt(i);c[(c[i+8>>2]|0)+112>>2]=e+(g<<2);c[(c[(c[d>>2]|0)+144>>2]|0)+(g<<2)>>2]=i;f=vx(a,i)|0;if((f|0)==0){break}else{g=g+1|0;i=f}}}i=ux(a)|0;if((i|0)==0){return}else{j=i}do{i=mw(a,j)|0;if((i|0)!=0){g=i;do{i=g|0;Wx(i,130336,176,1)|0;Zm(g)|0;k=+Fm(i,c[53750]|0,1.0,0.0);h[(c[g+8>>2]|0)+128>>3]=k;g=ow(a,g)|0;}while((g|0)!=0)}j=vx(a,j)|0;}while((j|0)!=0);return}function Jq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=i;i=i+8|0;e=d|0;f=Hw(142352,173928,0)|0;Wx(f|0,161376,272,1)|0;c[(c[a+8>>2]|0)+132>>2]=f;g=ux(a)|0;if((g|0)!=0){j=g;do{g=j+8|0;if((c[c[(c[g>>2]|0)+112>>2]>>2]|0)==0){k=Ax(f,$w(j|0)|0,1)|0;Wx(k|0,108856,304,1)|0;l=jk(40)|0;m=k+8|0;c[(c[m>>2]|0)+112>>2]=l;l=jk(c[53568]<<3)|0;c[(c[m>>2]|0)+132>>2]=l;l=j+8|0;h[(c[m>>2]|0)+88>>3]=+h[(c[l>>2]|0)+88>>3];h[(c[m>>2]|0)+96>>3]=+h[(c[l>>2]|0)+96>>3];h[(c[m>>2]|0)+80>>3]=+h[(c[l>>2]|0)+80>>3];c[c[(c[m>>2]|0)+112>>2]>>2]=j;c[c[(c[g>>2]|0)+112>>2]>>2]=k}j=vx(a,j)|0;}while((j|0)!=0)}j=ux(a)|0;if((j|0)!=0){k=j;do{j=mw(a,k)|0;if((j|0)!=0){g=j;do{j=c[g>>2]&3;m=c[c[(c[(c[((j|0)==3?g:g+32|0)+28>>2]|0)+8>>2]|0)+112>>2]>>2]|0;l=c[c[(c[(c[((j|0)==2?g:g-32|0)+28>>2]|0)+8>>2]|0)+112>>2]>>2]|0;if((m|0)!=(l|0)){Wx(uw(f,m,l,0,1)|0,130336,176,1)|0}g=ow(a,g)|0;}while((g|0)!=0)}k=vx(a,k)|0;}while((k|0)!=0)}k=iv(f,e,0)|0;if((c[e>>2]|0)>0){g=0;do{l=c[k+(g<<2)>>2]|0;m=ux(l)|0;if((m|0)!=0){j=m;do{m=mw(a,c[c[(c[j+8>>2]|0)+112>>2]>>2]|0)|0;if((m|0)!=0){n=m;do{m=c[c[(c[(c[((c[n>>2]&3|0)==2?n:n-32|0)+28>>2]|0)+8>>2]|0)+112>>2]>>2]|0;if((j|0)!=(m|0)){o=uw(f,j,m,0,1)|0;Wx(o|0,130336,176,1)|0;xw(l,o,1)|0}n=ow(a,n)|0;}while((n|0)!=0)}j=vx(l,j)|0;}while((j|0)!=0)}g=g+1|0;}while((g|0)<(c[e>>2]|0))}g=ux(f)|0;if((g|0)==0){p=c[e>>2]|0;c[b>>2]=p;i=d;return k|0}else{q=g}do{g=mw(f,q)|0;if((g|0)!=0){a=g;do{g=jk(8)|0;c[(c[a+8>>2]|0)+120>>2]=g;a=ow(f,a)|0;}while((a|0)!=0)}q=vx(f,q)|0;}while((q|0)!=0);p=c[e>>2]|0;c[b>>2]=p;i=d;return k|0}function Kq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=i;i=i+40|0;d=b|0;e=b+8|0;if((Lw(a)|0)==0){i=b;return}f=Jq(a,d)|0;g=c[d>>2]|0;d=c[f>>2]|0;do{if((g|0)==1){Hq(d,a);j=c[f>>2]|0;k=ux(j)|0;if((k|0)!=0){l=k;do{k=l+8|0;m=c[k>>2]|0;n=(c[c[m+112>>2]>>2]|0)+8|0;h[c[(c[n>>2]|0)+132>>2]>>3]=+h[c[m+132>>2]>>3];h[(c[(c[n>>2]|0)+132>>2]|0)+8>>3]=+h[(c[(c[k>>2]|0)+132>>2]|0)+8>>3];l=vx(j,l)|0;}while((l|0)!=0)}nr(a)|0}else{l=c[d+48>>2]|0;tv(a,2,8,e)|0;j=(g|0)>0;if(j){o=0}else{sv(g,f,l,e)|0;break}do{k=c[f+(o<<2)>>2]|0;Hq(k,a);nr(k)|0;o=o+1|0;}while((o|0)<(g|0));sv(g,f,l,e)|0;if(j){p=0}else{break}do{k=c[f+(p<<2)>>2]|0;n=ux(k)|0;if((n|0)!=0){m=n;do{n=m+8|0;q=c[n>>2]|0;r=(c[c[q+112>>2]>>2]|0)+8|0;h[c[(c[r>>2]|0)+132>>2]>>3]=+h[c[q+132>>2]>>3];h[(c[(c[r>>2]|0)+132>>2]|0)+8>>3]=+h[(c[(c[n>>2]|0)+132>>2]|0)+8>>3];m=vx(k,m)|0;}while((m|0)!=0)}p=p+1|0;}while((p|0)<(g|0))}}while(0);eF(f);i=b;return}function Lq(a){a=a|0;if((Lw(a)|0)==0){return}Iq(a);Kq(a);eF(c[(c[(ux(a)|0)+8>>2]|0)+112>>2]|0);Pt(a);Xk(a);return}function Mq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=ux(a)|0;if((b|0)==0){return}d=a+8|0;e=c[(c[d>>2]|0)+132>>2]|0;f=ux(e)|0;if((f|0)!=0){g=f;do{f=mw(e,g)|0;if((f|0)!=0){h=f;do{eF(c[(c[h+8>>2]|0)+120>>2]|0);h=ow(e,h)|0;}while((h|0)!=0)}h=g+8|0;eF(c[(c[h>>2]|0)+112>>2]|0);eF(c[(c[h>>2]|0)+132>>2]|0);g=vx(e,g)|0;}while((g|0)!=0)}Kw(e)|0;e=b;do{b=mw(a,e)|0;if((b|0)!=0){g=b;do{tn(g);g=ow(a,g)|0;}while((g|0)!=0)}un(e);e=vx(a,e)|0;}while((e|0)!=0);eF(c[(c[d>>2]|0)+144>>2]|0);if((Ix(a|0)|0)==(a|0)){return}_x(a,0,116128);return}function Nq(){return $g(17840,c[43330]|0)|0}function Oq(a){a=a|0;Vg(a)|0;return}function Pq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d|0;f=b+8|0;c[e+8>>2]=c[(c[f>>2]|0)+236>>2];g=(Hc[c[a>>2]&63](a,e,1)|0)+12|0;c[(c[f>>2]|0)+164>>2]=c[g>>2];c[g>>2]=b;i=d;return}function Qq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+16|0;e=d|0;f=b+8|0;c[e+8>>2]=c[(c[f>>2]|0)+236>>2];g=a|0;h=Hc[c[g>>2]&63](a,e,4)|0;if((h|0)==0){cc(129488,159160,107,170032)}e=h+12|0;j=c[e>>2]|0;if((j|0)==(b|0)){k=c[(c[f>>2]|0)+164>>2]|0;c[e>>2]=k;if((k|0)!=0){i=d;return}Hc[c[g>>2]&63](a,h,2)|0;i=d;return}h=c[(c[j+8>>2]|0)+164>>2]|0;a=h;g=(h|0)!=0;if(g&(a|0)!=(b|0)){k=h;e=a;while(1){a=c[(c[k+8>>2]|0)+164>>2]|0;f=a;l=(a|0)!=0;if(l&(f|0)!=(b|0)){k=a;e=f}else{m=e;n=a;o=l;break}}}else{m=j;n=h;o=g}if(!o){i=d;return}c[(c[m+8>>2]|0)+164>>2]=c[(c[n+8>>2]|0)+164>>2];i=d;return}function Rq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a|0;d=Hc[c[b>>2]&63](a,0,128)|0;if((d|0)==0){e=0;return e|0}f=d+12|0;g=c[f>>2]|0;h=c[(c[g+8>>2]|0)+164>>2]|0;c[f>>2]=h;if((h|0)!=0){e=g;return e|0}Hc[c[b>>2]&63](a,d,2)|0;e=g;return e|0}function Sq(a,b,d){a=a|0;b=b|0;d=d|0;d=kk(16)|0;c[d+12>>2]=0;c[d+8>>2]=c[b+8>>2];return d|0}function Tq(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function Uq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[b>>2]|0;b=c[d>>2]|0;if((e|0)<(b|0)){f=-1;return f|0}f=(e|0)>(b|0)|0;return f|0}function Vq(){return $g(173264,c[43330]|0)|0}function Wq(a){a=a|0;Vg(a)|0;return}function Xq(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d|0;c[e+8>>2]=b;Hc[c[a>>2]&63](a,e,1)|0;i=d;return}function Yq(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d|0;c[e+8>>2]=b;Hc[c[a>>2]&63](a,e,2)|0;i=d;return}function Zq(a,b,d){a=a|0;b=b|0;d=d|0;d=kk(12)|0;c[d+8>>2]=c[b+8>>2];return d|0}function _q(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function $q(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[b>>2]|0;b=c[d>>2]|0;if(e>>>0>b>>>0){f=1;return f|0}f=(e>>>0<b>>>0)<<31>>31;return f|0}function ar(){return jk(12)|0}function br(a){a=a|0;var b=0,d=0;if((a|0)==0){return}b=c[a>>2]|0;if((b|0)!=0){d=b;while(1){b=c[d+4>>2]|0;eF(d);if((b|0)==0){break}else{d=b}}}eF(a);return}function cr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=jk(12)|0;f=e;c[e>>2]=d;d=a+8|0;c[d>>2]=(c[d>>2]|0)+1;d=c[a+4>>2]|0;if(!((b|0)==0|(d|0)==(b|0))){g=b+4|0;h=c[g>>2]|0;c[g>>2]=f;c[e+8>>2]=b;c[h+8>>2]=f;c[e+4>>2]=h;return}if((d|0)==0){c[a>>2]=f}else{c[d+4>>2]=f}c[e+8>>2]=d;c[e+4>>2]=0;c[a+4>>2]=f;return}function dr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=a|0;e=c[d>>2]|0;if((e|0)==(b|0)){return}f=b+8|0;g=c[f>>2]|0;c[d>>2]=b;c[f>>2]=0;f=a+4|0;c[(c[f>>2]|0)+4>>2]=e;c[e+8>>2]=c[f>>2];c[f>>2]=g;c[g+4>>2]=0;return}function er(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;b=jk(12)|0;d=b;e=c[a>>2]|0;if((e|0)==0){return d|0}a=b+8|0;f=b+4|0;g=b;b=0;h=e;while(1){e=c[h>>2]|0;i=jk(12)|0;j=i;c[i>>2]=e;c[a>>2]=(c[a>>2]|0)+1;e=c[f>>2]|0;if((b|0)==0|(e|0)==(b|0)){if((e|0)==0){c[g>>2]=j}else{c[e+4>>2]=j}c[i+8>>2]=e;c[i+4>>2]=0;c[f>>2]=j;k=j}else{e=b+4|0;l=c[e>>2]|0;c[e>>2]=j;c[i+8>>2]=b;c[l+8>>2]=j;c[i+4>>2]=l;k=c[f>>2]|0}l=c[h+4>>2]|0;if((l|0)==0){break}else{b=k;h=l}}return d|0}function fr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=a|0;g=c[f>>2]|0;if((g|0)==0){cc(107032,150440,217,170480)}else{h=g}while(1){if((c[h>>2]|0)==(b|0)){break}g=c[h+4>>2]|0;if((g|0)==0){i=12;break}else{h=g}}if((i|0)==12){cc(107032,150440,217,170480)}b=h+8|0;g=c[b>>2]|0;j=h+4|0;k=c[j>>2]|0;if((g|0)==0){c[f>>2]=k}else{c[g+4>>2]=k}if((k|0)==0){c[a+4>>2]=g}else{c[k+8>>2]=g}if((h|0)==0){cc(107032,150440,217,170480)}g=c[f>>2]|0;if((g|0)==0){return}else{l=0;m=g}while(1){if((c[m>>2]|0)==(d|0)){break}k=c[m+4>>2]|0;if((k|0)==0){i=22;break}else{l=m;m=k}}if((i|0)==22){return}if((e|0)==0){if((m|0)==(g|0)){c[f>>2]=h;c[j>>2]=g;c[b>>2]=0;c[g+8>>2]=h;return}else{c[l+4>>2]=h;c[b>>2]=l;c[j>>2]=m;c[m+8>>2]=h;return}}else{l=a+4|0;if((m|0)==(c[l>>2]|0)){c[l>>2]=h;c[j>>2]=0;c[b>>2]=m;c[m+4>>2]=h;return}else{c[b>>2]=m;b=m+4|0;c[j>>2]=c[b>>2];c[(c[b>>2]|0)+8>>2]=h;c[b>>2]=h;return}}}function gr(a){a=a|0;return c[a+8>>2]|0}function hr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=b|0;e=c[d>>2]|0;if((e|0)==0){f=0}else{g=e;while(1){e=g+4|0;h=c[e>>2]|0;i=g+8|0;c[e>>2]=c[i>>2];c[i>>2]=h;if((h|0)==0){break}else{g=h}}f=c[d>>2]|0}g=b+4|0;h=c[g>>2]|0;c[g>>2]=f;c[d>>2]=h;if((h|0)==0){j=b;eF(j);return}f=a+4|0;c[(c[f>>2]|0)+4>>2]=h;c[(c[d>>2]|0)+8>>2]=c[f>>2];c[f>>2]=c[g>>2];g=a+8|0;c[g>>2]=(c[g>>2]|0)+(c[b+8>>2]|0);j=b;eF(j);return}function ir(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0;d=i;i=i+8|0;e=d|0;f=ew(b|0,105224)|0;if((f|0)==0){g=0;i=d;return g|0}if((a[f]|0)==0){g=0;i=d;return g|0}j=+sF(f,e);do{if((c[e>>2]|0)==(f|0)){if((Km(f)|0)<<24>>24==0){g=0}else{k=0.0;break}i=d;return g|0}else{if(j>180.0){l=j;while(1){m=l+-360.0;if(m>180.0){l=m}else{n=m;break}}}else{n=j}if(n>-180.0){k=n;break}else{o=n}while(1){l=o+360.0;if(l>-180.0){k=l;break}else{o=l}}}}while(0);o=k/180.0*3.141592653589793;f=c[(c[(ux(b)|0)+8>>2]|0)+132>>2]|0;k=+h[f>>3];n=+h[f+8>>3];f=ux(b)|0;if((f|0)!=0){e=f;do{f=e+8|0;p=c[(c[f>>2]|0)+132>>2]|0;h[p>>3]=+h[p>>3]-k;p=(c[(c[f>>2]|0)+132>>2]|0)+8|0;h[p>>3]=+h[p>>3]-n;e=vx(b,e)|0;}while((e|0)!=0)}e=(k!=0.0|n!=0.0)&1;p=ux(b)|0;if((p|0)==0){g=e;i=d;return g|0}else{q=p}while(1){r=mw(b,q)|0;if((r|0)!=0){break}p=vx(b,q)|0;if((p|0)==0){g=e;s=17;break}else{q=p}}if((s|0)==17){i=d;return g|0}s=c[r>>2]&3;q=c[(c[(c[((s|0)==2?r:r-32|0)+28>>2]|0)+8>>2]|0)+132>>2]|0;p=c[(c[(c[((s|0)==3?r:r+32|0)+28>>2]|0)+8>>2]|0)+132>>2]|0;n=+h[p+8>>3];k=+h[p>>3];j=o- +$(+(+h[q+8>>3]-n),+(+h[q>>3]-k));if(j==0.0){g=e;i=d;return g|0}o=+V(j);l=+W(j);e=ux(b)|0;if((e|0)==0){g=1;i=d;return g|0}else{t=e}while(1){e=t+8|0;q=c[(c[e>>2]|0)+132>>2]|0;p=q;j=+h[p>>3]-k;m=+h[q+8>>3]-n;h[p>>3]=k+(o*j-l*m);h[(c[(c[e>>2]|0)+132>>2]|0)+8>>3]=n+(l*j+o*m);e=vx(b,t)|0;if((e|0)==0){g=1;break}else{t=e}}i=d;return g|0}function jr(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=ew(a|0,108352)|0;if((d|0)==0){e=(c|0)!=0?c:213376}else{e=d}return kr(a,e,b)|0}function kr(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+8|0;g=f|0;do{if((d|0)!=0){if((a[d]|0)==0){break}else{j=74640;k=129464}while(1){l=j+16|0;if((qm(d,k,c[j+8>>2]|0)|0)==0){m=6;break}n=c[j+20>>2]|0;if((n|0)==0){o=l;break}else{j=l;k=n}}do{if((m|0)==6){if((c[j+12>>2]|0)==0){Fv(0,142304,(p=i,i=i+8|0,c[p>>2]=k,p)|0)|0;i=p;q=74640}else{q=j}n=q|0;c[e>>2]=c[n>>2];c[e+4>>2]=c[q+12>>2];if((c[n>>2]|0)!=18){o=q;break}n=ac(d+(c[q+8>>2]|0)|0,136656,(p=i,i=i+8|0,c[p>>2]=g,p)|0)|0;i=p;l=c[g>>2]|0;c[e+8>>2]=(n|0)>0&(l|0)>-1?l:1e3;h[e+16>>3]=+Fm(b|0,Wv(b,0,133752,0)|0,-4.0,-1.0e10);o=q}}while(0);if((c[o+4>>2]|0)!=0){i=f;return e|0}l=Vm(d,63)|0;do{if(l<<24>>24==63){Fv(0,139200,(p=i,i=i+8|0,c[p>>2]=d,p)|0)|0;i=p;r=e|0}else{n=e|0;if(l<<24>>24==0){r=n;break}c[n>>2]=0;c[e+4>>2]=131664;i=f;return e|0}}while(0);c[r>>2]=1;c[e+4>>2]=126224;i=f;return e|0}}while(0);c[e>>2]=0;c[e+4>>2]=131664;i=f;return e|0}function lr(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0.0,Q=0.0,R=0.0,T=0.0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0.0,ma=0.0,na=0.0,oa=0,pa=0,qa=0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0,xa=0,ya=0;e=i;i=i+16|0;f=e|0;if((Lw(b)|0)<2){j=0;i=e;return j|0}k=ir(b)|0;l=d|0;m=c[l>>2]|0;if((m|0)==0){j=k;i=e;return j|0}if((a[213992]|0)==0){n=m}else{m=c[o>>2]|0;p=$w(b|0)|0;q=c[d+4>>2]|0;gc(m|0,97152,(r=i,i=i+16|0,c[r>>2]=p,c[r+8>>2]=q,r)|0)|0;i=r;n=c[l>>2]|0}if(n>>>0>2>>>0){switch(n|0){case 4:{s=Jr(b,0)|0;break};case 12:case 11:case 13:case 14:case 8:case 7:case 9:case 10:{Cr(b,n)|0;s=0;break};case 5:case 6:{s=0;break};case 3:{s=Jr(b,1)|0;break};case 15:{s=Jr(b,-1)|0;break};default:{Fv(0,91656,(r=i,i=i+8|0,c[r>>2]=c[d+4>>2],r)|0)|0;i=r;s=0}}j=s+k|0;i=e;return j|0}c[44272]=Lw(b)|0;Zr();c[44274]=kk((c[44272]|0)*96|0)|0;s=ux(b)|0;d=c[44274]|0;or(f,b);t=+g[f>>2];u=+g[f+4>>2];if((a[f+8|0]|0)==0){v=4;w=t;x=u}else{v=2;w=t/72.0;x=u/72.0}f=c[44272]|0;a:do{if((f|0)>0){n=s;q=0;p=d;while(1){m=n+8|0;h[p+8>>3]=+h[c[(c[m>>2]|0)+132>>2]>>3];h[p+16>>3]=+h[(c[(c[m>>2]|0)+132>>2]|0)+8>>3];if((Fc[v&7](p+40|0,n,w,x)|0)!=0){break}c[p+24>>2]=q;c[p+28>>2]=1;c[p>>2]=n;c[p+88>>2]=0;m=vx(b,n)|0;y=q+1|0;z=c[44272]|0;if((y|0)<(z|0)){n=m;q=y;p=p+96|0}else{A=z;break a}}eF(c[44274]|0);c[44274]=0;if((c[44272]|0)>0){p=0;q=0;while(1){Xt(q+40|0);n=p+1|0;if((n|0)<(c[44272]|0)){p=n;q=q+96|0}else{break}}}Wt();xs();eF(c[44274]|0);eF(c[43762]|0);c[43762]=0;j=k;i=e;return j|0}else{A=f}}while(0);f=c[44274]|0;x=+h[f+8>>3];w=+h[f+16>>3];u=x+ +h[f+40>>3];t=w+ +h[f+48>>3];B=x+ +h[f+56>>3];x=w+ +h[f+64>>3];if((A|0)>1){w=x;C=t;D=B;E=u;v=1;d=f;while(1){F=+h[d+104>>3];G=+h[d+112>>3];H=F+ +h[d+136>>3];I=G+ +h[d+144>>3];J=F+ +h[d+152>>3];F=G+ +h[d+160>>3];G=H<E?H:E;H=I<C?I:C;I=J>D?J:D;J=F>w?F:w;f=v+1|0;if((f|0)<(A|0)){w=J;C=H;D=I;E=G;v=f;d=d+96|0}else{K=J;L=H;M=I;N=G;break}}}else{K=x;L=t;M=B;N=u}d=ew(b|0,145272)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}h[2485]=+rF(d)}}while(0);u=+h[2485];B=(K-L)*u;t=(M-N)*u;u=N-t;N=L-B;L=M+t;t=K+B;h[1539]=u;h[1540]=L;h[1537]=N;h[1538]=t;h[21847]=u;h[22132]=u;h[21884]=L;h[22143]=L;h[22144]=t;h[22133]=t;h[21885]=N;h[21848]=N;d=(c[l>>2]|0)==2;l=qr(0)|0;b=(l|0)==0;do{if(d){if(b){O=71;break}rr();v=0;do{if((c[44272]|0)>0){A=c[44274]|0;f=0;while(1){s=A+8|0;h[s>>3]=+h[s>>3]*1.05;s=A+16|0;h[s>>3]=+h[s>>3]*1.05;s=f+1|0;if((s|0)<(c[44272]|0)){A=A+96|0;f=s}else{break}}}v=v+1|0;}while((qr(v)|0)!=0);if((a[213992]|0)==0){O=72;break}gc(c[o>>2]|0,154672,(r=i,i=i+8|0,c[r>>2]=v,r)|0)|0;i=r;O=72}else{if(b){O=71;break}rr();f=c[43762]|0;N=+h[c[f>>2]>>3];h[10]=N;t=+h[c[f>>2]>>3];h[11]=t;A=c[44272]|0;if((A|0)>1){s=1;L=N;u=t;while(1){q=f+(s<<2)|0;B=+h[c[q>>2]>>3];if(B<L){h[10]=B;P=B;Q=+h[c[q>>2]>>3]}else{P=L;Q=B}if(Q>u){h[11]=Q;R=Q}else{R=u}q=s+1|0;if((q|0)<(A|0)){s=q;L=P;u=R}else{T=R;U=P;break}}}else{T=t;U=N}u=+h[(c[f>>2]|0)+8>>3];h[8]=u;L=+h[(c[f+(A-1<<2)>>2]|0)+8>>3];h[9]=L;h[3711]=L-u;h[3712]=T-U;Iu(0,2);s=0;v=1;q=l;p=1;while(1){n=c[44274]|0;z=n+8|0;u=+_r(z,174776);L=+_r(z,177056);B=+_r(z,175072);K=+_r(z,177144);if((c[44272]|0)>1){z=n;y=n;m=n;V=n;M=u;u=L;L=B;B=K;W=1;X=n;while(1){Y=X+96|0;Z=X+104|0;K=+_r(Z,174776);_=K<M;$=_?Y:z;x=+_r(Z,175072);aa=x<L;ba=aa?Y:m;E=+_r(Z,177056);ca=E<u;da=ca?Y:y;D=+_r(Z,177144);Z=D<B;ea=Z?Y:V;fa=W+1|0;if((fa|0)<(c[44272]|0)){z=$;y=da;m=ba;V=ea;M=_?K:M;u=ca?E:u;L=aa?x:L;B=Z?D:B;W=fa;X=Y}else{ga=$;ha=da;ia=ba;ja=ea;break}}}else{ga=n;ha=n;ia=n;ja=n}ys(ga+8|0,+h[21847],+h[21848]);ys(ia+8|0,+h[21884],+h[21885]);ys(ha+8|0,+h[22132],+h[22133]);ys(ja+8|0,+h[22143],+h[22144]);X=c[44272]|0;if((X|0)>0){W=a[28952]|0;V=0;m=n;y=X;while(1){if(W){O=49}else{if((c[m+32>>2]|0)==0){ka=y}else{O=49}}if((O|0)==49){O=0;X=c[m+88>>2]|0;z=c[X>>2]|0;ea=c[z>>2]|0;if((ea|0)==0){la=0.0;ma=0.0;na=0.0}else{B=+h[X+8>>3];L=+h[X+16>>3];u=0.0;M=0.0;D=0.0;X=ea;x=+h[z+8>>3];E=+h[z+16>>3];while(1){K=+h[X+8>>3];C=+h[X+16>>3];w=+S(+((L-E)*K+(B*(E-C)+x*(C-L))))*.5;G=M+w*((B+x+K)/3.0);I=D+w*((L+E+C)/3.0);H=u+w;z=c[X>>2]|0;if((z|0)==0){la=H;ma=G;na=I;break}else{u=H;M=G;D=I;X=z;x=K;E=C}}}h[m+8>>3]=ma/la;h[m+16>>3]=na/la;ka=c[44272]|0}X=V+1|0;if((X|0)<(ka|0)){V=X;m=m+96|0;y=ka}else{break}}}y=qr(p)|0;if((y|0)==0){break}m=(y|0)<(q|0)?0:v;a[28952]=1;if((m|0)==0){oa=s}else{E=+h[1540];x=+h[1538];D=+h[1539];M=+h[1537];u=(x-M)*.05;L=(E-D)*.05;B=E+L;E=x+u;x=D-L;L=M-u;h[1539]=x;h[1540]=B;h[1537]=L;h[1538]=E;h[21847]=x;h[22132]=x;h[21884]=B;h[22143]=B;h[22144]=E;h[22133]=E;h[21885]=L;h[21848]=L;oa=s+1|0}V=c[43762]|0;if((V|0)==0){W=kk(c[44272]<<2)|0;c[43762]=W;c[45154]=W+(c[44272]<<2);pa=W}else{pa=V}V=c[44274]|0;xs();W=c[44272]|0;if((W|0)>0){n=0;X=pa;z=V;while(1){c[X>>2]=z+8;c[z+88>>2]=0;c[z+28>>2]=1;V=n+1|0;ea=c[44272]|0;if((V|0)<(ea|0)){n=V;X=X+4|0;z=z+96|0}else{qa=ea;break}}}else{qa=W}Jb(c[43762]|0,qa|0,4,138);z=c[43762]|0;c[44278]=z;L=+h[c[z>>2]>>3];h[10]=L;E=+h[c[z>>2]>>3];h[11]=E;X=c[44272]|0;if((X|0)>1){n=1;B=L;x=E;while(1){ea=z+(n<<2)|0;u=+h[c[ea>>2]>>3];if(u<B){h[10]=u;ra=u;sa=+h[c[ea>>2]>>3]}else{ra=B;sa=u}if(sa>x){h[11]=sa;ta=sa}else{ta=x}ea=n+1|0;if((ea|0)<(X|0)){n=ea;B=ra;x=ta}else{ua=ta;va=ra;break}}}else{ua=E;va=L}x=+h[(c[z>>2]|0)+8>>3];h[8]=x;B=+h[(c[z+(X-1<<2)>>2]|0)+8>>3];h[9]=B;h[3711]=B-x;h[3712]=ua-va;Iu(0,2);s=oa;v=m+1|0;q=y;p=p+1|0}if((a[213992]|0)!=0){q=c[o>>2]|0;gc(q|0,154672,(r=i,i=i+8|0,c[r>>2]=p,r)|0)|0;i=r;gc(q|0,151384,(r=i,i=i+8|0,c[r>>2]=s,r)|0)|0;i=r}js();ls();au();Tr();O=72}}while(0);do{if((O|0)==71){wa=0;xa=c[44272]|0;O=75}else if((O|0)==72){if((c[44272]|0)<=0){ya=1;break}r=0;oa=c[44274]|0;while(1){qa=oa|0;h[c[(c[(c[qa>>2]|0)+8>>2]|0)+132>>2]>>3]=+h[oa+8>>3];h[(c[(c[(c[qa>>2]|0)+8>>2]|0)+132>>2]|0)+8>>3]=+h[oa+16>>3];qa=r+1|0;pa=c[44272]|0;if((qa|0)<(pa|0)){r=qa;oa=oa+96|0}else{wa=1;xa=pa;O=75;break}}}}while(0);do{if((O|0)==75){if((xa|0)<=0){ya=wa;break}oa=0;r=c[44274]|0;while(1){Xt(r+40|0);s=oa+1|0;if((s|0)<(c[44272]|0)){oa=s;r=r+96|0}else{ya=wa;break}}}}while(0);Wt();xs();eF(c[44274]|0);eF(c[43762]|0);c[43762]=0;j=ya+k|0;i=e;return j|0}function mr(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=i;i=i+24|0;d=c|0;if((Lw(a)|0)<2){e=0}else{kr(a,b,d)|0;e=lr(a,d)|0}i=c;return e|0}function nr(a){a=a|0;var b=0,c=0,d=0,e=0;b=i;i=i+24|0;c=b|0;d=ew(a|0,108352)|0;if((Lw(a)|0)<2){e=0}else{kr(a,d,c)|0;e=lr(a,c)|0}i=b;return e|0}function or(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0.0;e=i;i=i+40|0;f=e|0;j=e+8|0;k=e+16|0;l=e+24|0;m=e+32|0;n=d|0;d=ew(n,86424)|0;do{if((d|0)==0){p=10}else{q=d;while(1){r=q+1|0;if((Qa(a[q]|0)|0)==0){break}else{q=r}}s=(a[q]|0)==43;t=s&1;u=ac((s?r:q)|0,159680,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=l,v)|0)|0;i=v;if((u|0)==1){w=+g[k>>2];g[l>>2]=w;x=w}else if((u|0)==0){p=10;break}else{x=+g[k>>2]}if(s){y=x;z=+g[l>>2];A=t;break}else{y=x+1.0;z=+g[l>>2]+1.0;A=t;break}}}while(0);do{if((p|0)==10){l=ew(n,81608)|0;if((l|0)==0){y=4.0;z=4.0;A=1;break}k=l;while(1){B=k+1|0;if((Qa(a[k]|0)|0)==0){break}else{k=B}}q=(a[k]|0)==43;l=q&1;r=ac((q?B:k)|0,159680,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=j,v)|0)|0;i=v;if((r|0)==1){x=+g[f>>2];g[j>>2]=x;C=x}else if((r|0)==0){y=4.0;z=4.0;A=1;break}else{C=+g[f>>2]}x=C/.800000011920929;if(q){y=x;z=+g[j>>2]/.800000011920929;A=l;break}else{y=x+1.0;z=+g[j>>2]/.800000011920929+1.0;A=l;break}}}while(0);if((a[213992]|0)!=0){gc(c[o>>2]|0,167864,(v=i,i=i+24|0,c[v>>2]=A&255,h[v+8>>3]=y,h[v+16>>3]=z,v)|0)|0;i=v}g[b>>2]=y;g[b+4>>2]=z;a[b+8|0]=A;A=b+9|0;b=m|0;a[A]=a[b]|0;a[A+1|0]=a[b+1|0]|0;a[A+2|0]=a[b+2|0]|0;i=e;return}function pr(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0.0;e=i;i=i+40|0;f=e|0;j=e+8|0;k=e+16|0;l=e+24|0;m=e+32|0;n=d|0;d=ew(n,81608)|0;do{if((d|0)==0){p=10}else{q=d;while(1){r=q+1|0;if((Qa(a[q]|0)|0)==0){break}else{q=r}}s=(a[q]|0)==43;t=s&1;u=ac((s?r:q)|0,159680,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=l,v)|0)|0;i=v;if((u|0)==0){p=10;break}else if((u|0)==1){w=+g[k>>2];g[l>>2]=w;x=w}else{x=+g[k>>2]}if(s){y=x;z=+g[l>>2];A=t;break}else{y=x+1.0;z=+g[l>>2]+1.0;A=t;break}}}while(0);do{if((p|0)==10){l=ew(n,86424)|0;if((l|0)==0){y=3.200000047683716;z=3.200000047683716;A=1;break}k=l;while(1){B=k+1|0;if((Qa(a[k]|0)|0)==0){break}else{k=B}}q=(a[k]|0)==43;l=q&1;r=ac((q?B:k)|0,159680,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=j,v)|0)|0;i=v;if((r|0)==1){x=+g[f>>2];g[j>>2]=x;C=x}else if((r|0)==0){y=3.200000047683716;z=3.200000047683716;A=1;break}else{C=+g[f>>2]}x=C/1.25;if(q){y=x;z=+g[j>>2]/1.25;A=l;break}else{y=x+1.0;z=+g[j>>2]/1.25+1.0;A=l;break}}}while(0);if((a[213992]|0)!=0){gc(c[o>>2]|0,163688,(v=i,i=i+24|0,c[v>>2]=A&255,h[v+8>>3]=y,h[v+16>>3]=z,v)|0)|0;i=v}g[b>>2]=y;g[b+4>>2]=z;a[b+8|0]=A;A=b+9|0;b=m|0;a[A]=a[b]|0;a[A+1|0]=a[b+1|0]|0;a[A+2|0]=a[b+2|0]|0;i=e;return}function qr(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;b=i;e=c[44274]|0;f=c[44272]|0;a:do{if((f|0)>0){g=0;h=e;while(1){c[h+(g*96|0)+32>>2]=0;j=g+1|0;k=c[44272]|0;if((j|0)>=(k|0)){l=k;break a}g=j;h=c[44274]|0}}else{l=f}}while(0);if((l-1|0)>0){f=0;h=0;g=e;e=l;while(1){l=g+96|0;j=h+1|0;if((j|0)<(e|0)){k=g+8|0;m=g+40|0;n=g+32|0;p=f;q=j;r=l;while(1){if((_t(k,m,r+8|0,r+40|0)|0)==0){s=p}else{c[n>>2]=1;c[r+32>>2]=1;s=p+1|0}t=q+1|0;u=c[44272]|0;if((t|0)<(u|0)){p=s;q=t;r=r+96|0}else{v=s;w=u;break}}}else{v=f;w=e}if((j|0)<(w-1|0)){f=v;h=j;g=l;e=w}else{x=v;break}}}else{x=0}if((d[213992]|0)>>>0<=1>>>0){i=b;return x|0}gc(c[o>>2]|0,148496,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=x,v)|0)|0;i=v;i=b;return x|0}function rr(){var a=0,b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0.0;a=c[43762]|0;if((a|0)==0){b=kk(c[44272]<<2)|0;c[43762]=b;c[45154]=b+(c[44272]<<2);d=b}else{d=a}a=c[44274]|0;xs();b=c[44272]|0;if((b|0)>0){e=0;f=d;d=a;while(1){c[f>>2]=d+8;c[d+88>>2]=0;c[d+28>>2]=1;a=e+1|0;g=c[44272]|0;if((a|0)<(g|0)){e=a;f=f+4|0;d=d+96|0}else{i=g;break}}}else{i=b}Jb(c[43762]|0,i|0,4,138);i=c[43762]|0;c[44278]=i;b=c[45154]|0;if(i>>>0<b>>>0){j=i}else{return}while(1){i=j+4|0;a:do{if(i>>>0<b>>>0){d=c[i>>2]|0;k=+h[d>>3];f=c[j>>2]|0;l=+h[f>>3];if(k!=l){m=i;break}n=+h[f+8>>3];if(+h[d+8>>3]!=n){m=i;break}e=j+8|0;b:do{if(e>>>0<b>>>0){g=2;a=e;while(1){o=c[a>>2]|0;if(+h[o>>3]!=l){p=g;q=a;break b}if(+h[o+8>>3]!=n){p=g;q=a;break b}o=g+1|0;r=a+4|0;if(r>>>0<b>>>0){g=o;a=r}else{p=o;q=r;break}}}else{p=2;q=e}}while(0);do{if(q>>>0<b>>>0){e=c[q>>2]|0;if(+h[e+8>>3]!=n){break}s=(+h[e>>3]-l)/+(p|0);if(i>>>0<q>>>0){t=i;u=1;v=d;w=k}else{m=q;break a}while(1){h[v>>3]=s*+(u|0)+w;e=t+4|0;if(e>>>0>=q>>>0){m=q;break a}a=c[e>>2]|0;t=e;u=u+1|0;v=a;w=+h[a>>3]}}}while(0);if(i>>>0<q>>>0){x=j;y=i;z=f;A=d;B=l}else{m=q;break}while(1){a=c[44274]|0;e=c[z+16>>2]|0;g=c[A+16>>2]|0;h[A>>3]=B+(+h[a+(e*96|0)+56>>3]- +h[a+(e*96|0)+40>>3]+(+h[a+(g*96|0)+56>>3]- +h[a+(g*96|0)+40>>3]))*.5;g=x+4|0;a=y+4|0;if(a>>>0>=q>>>0){m=q;break a}e=c[g>>2]|0;x=g;y=a;z=e;A=c[a>>2]|0;B=+h[e>>3]}}else{m=i}}while(0);if(m>>>0<b>>>0){j=m}else{break}}return}function sr(){var a=0,b=0;a=c[44278]|0;if(a>>>0>=(c[45154]|0)>>>0){b=0;return b|0}c[44278]=a+4;b=c[a>>2]|0;return b|0}function tr(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0,i=0.0,j=0.0;d=c[a>>2]|0;a=c[b>>2]|0;e=+h[d+8>>3];f=+h[a+8>>3];do{if(e<f){g=-1}else{if(e>f){g=1;break}i=+h[d>>3];j=+h[a>>3];if(i<j){g=-1;break}g=i>j|0}}while(0);return g|0}function ur(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;h=(d|0)>0;if(h){vF(e|0,-1|0,d<<2|0)|0}c[e+(a<<2)>>2]=0;i=f|0;c[c[i>>2]>>2]=a;a=f+12|0;c[a>>2]=0;j=f+8|0;c[j>>2]=1;k=f+4|0;if((c[b+8>>2]|0)==0){f=0;l=1;while(1){m=f+1|0;c[a>>2]=m;n=c[(c[i>>2]|0)+(f<<2)>>2]|0;o=c[e+(n<<2)>>2]|0;p=b+(n<<4)|0;if((c[p>>2]|0)>1){q=b+(n<<4)+4|0;n=o+1|0;r=1;do{s=c[(c[q>>2]|0)+(r<<2)>>2]|0;t=e+(s<<2)|0;do{if((c[t>>2]|0)<0){c[t>>2]=n;u=c[j>>2]|0;if((u|0)>=(c[k>>2]|0)){break}c[j>>2]=u+1;c[(c[i>>2]|0)+(u<<2)>>2]=s}}while(0);r=r+1|0;}while((r|0)<(c[p>>2]|0));v=c[a>>2]|0;w=c[j>>2]|0}else{v=m;w=l}if((v|0)<(w|0)){f=v;l=w}else{x=o;break}}}else{w=0;l=1;while(1){v=w+1|0;c[a>>2]=v;f=c[(c[i>>2]|0)+(w<<2)>>2]|0;p=c[e+(f<<2)>>2]|0;r=b+(f<<4)|0;if((c[r>>2]|0)>1){n=b+(f<<4)+4|0;q=b+(f<<4)+8|0;f=1;do{s=c[(c[n>>2]|0)+(f<<2)>>2]|0;t=e+(s<<2)|0;do{if((c[t>>2]|0)<0){c[t>>2]=~~+g[(c[q>>2]|0)+(f<<2)>>2]+p;u=c[j>>2]|0;if((u|0)>=(c[k>>2]|0)){break}c[j>>2]=u+1;c[(c[i>>2]|0)+(u<<2)>>2]=s}}while(0);f=f+1|0;}while((f|0)<(c[r>>2]|0));y=c[a>>2]|0;z=c[j>>2]|0}else{y=v;z=l}if((y|0)<(z|0)){w=y;l=z}else{x=p;break}}}if(!h){return}h=x+10|0;x=0;do{z=e+(x<<2)|0;if((c[z>>2]|0)<0){c[z>>2]=h}x=x+1|0;}while((x|0)<(d|0));return}function vr(a,b){a=a|0;b=b|0;c[a>>2]=kk(b<<2)|0;c[a+4>>2]=b;c[a+8>>2]=0;c[a+12>>2]=0;return}function wr(a){a=a|0;eF(c[a>>2]|0);return}function xr(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,l=0,m=0.0,n=0;if((a[213992]|0)!=0){Ma(104808,25,1,c[o>>2]|0)|0}if((b|0)>0){f=0}else{g=b-1|0;i=Ms(d,e,g)|0;return i|0}do{j=d+(f<<2)|0;k=0.0;l=0;while(1){if((f|0)==(l|0)){m=k}else{m=k+ +h[(c[j>>2]|0)+(l<<3)>>3]}n=l+1|0;if((n|0)<(b|0)){k=m;l=n}else{break}}h[(c[j>>2]|0)+(f<<3)>>3]=-0.0-m;f=f+1|0;}while((f|0)<(b|0));g=b-1|0;i=Ms(d,e,g)|0;return i|0}function yr(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,p=0;e=pu(d,d,0.0)|0;f=pu(d,d,0.0)|0;g=ux(b)|0;if((g|0)!=0){i=g;do{g=rw(b,i)|0;if((g|0)!=0){j=g;do{g=c[j>>2]&3;k=(c[c[((g|0)==3?j:j+32|0)+28>>2]>>2]|0)>>>4;l=(c[c[((g|0)==2?j:j-32|0)+28>>2]>>2]|0)>>>4;if((k|0)!=(l|0)){m=-1.0/+h[(c[j+8>>2]|0)+136>>3];h[(c[e+(l<<2)>>2]|0)+(k<<3)>>3]=m;h[(c[e+(k<<2)>>2]|0)+(l<<3)>>3]=m}j=sw(b,j,i)|0;}while((j|0)!=0)}i=vx(b,i)|0;}while((i|0)!=0)}if((a[213992]|0)!=0){Ma(104808,25,1,c[o>>2]|0)|0}i=(d|0)>0;if(i){j=0;do{l=e+(j<<2)|0;m=0.0;k=0;while(1){if((j|0)==(k|0)){n=m}else{n=m+ +h[(c[l>>2]|0)+(k<<3)>>3]}g=k+1|0;if((g|0)<(d|0)){m=n;k=g}else{break}}h[(c[l>>2]|0)+(j<<3)>>3]=-0.0-n;j=j+1|0;}while((j|0)<(d|0))}j=Ms(e,f,d-1|0)|0;if((j|0)==0|i^1){qu(e);qu(f);return j|0}i=b+8|0;b=0;do{k=f+(b<<2)|0;g=0;do{p=c[k>>2]|0;h[(c[(c[(c[i>>2]|0)+152>>2]|0)+(b<<2)>>2]|0)+(g<<3)>>3]=+h[p+(b<<3)>>3]+ +h[(c[f+(g<<2)>>2]|0)+(g<<3)>>3]- +h[p+(g<<3)>>3]*2.0;g=g+1|0;}while((g|0)<(d|0));b=b+1|0;}while((b|0)<(d|0));qu(e);qu(f);return j|0}function zr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0.0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0;f=i;i=i+64|0;j=f|0;k=f+16|0;l=f+32|0;m=f+48|0;n=kk(d<<4)|0;o=b<<2;p=kk(o)|0;q=p;r=kk(o)|0;s=r;t=kk(o)|0;u=t;v=kk(o)|0;w=v;x=(b|0)>0;if(x){y=0;do{c[u+(y<<2)>>2]=y;y=y+1|0;}while((y|0)<(b|0));y=b-1|0;Gs(a,u,0,y);z=0;while(1){c[w+(c[u+(z<<2)>>2]<<2)>>2]=z;A=z+1|0;if((A|0)<(b|0)){z=A}else{B=y;break}}}else{y=b-1|0;Gs(a,u,0,y);B=y}y=kk(B<<4)|0;z=(B|0)>0;if(z){A=0;while(1){C=c[u+(A<<2)>>2]|0;D=A+1|0;E=c[u+(D<<2)>>2]|0;F=+h[a+(E<<3)>>3]- +h[a+(C<<3)>>3];c[y+(A<<4)>>2]=C;c[y+(A<<4)+4>>2]=E;h[y+(A<<4)+8>>3]=F;if((D|0)<(B|0)){A=D}else{break}}}if((B|0)>-2){A=m;m=(B|0)/2|0;while(1){D=m;while(1){E=D<<1;C=E|1;do{if((E|0)<(B|0)){F=+h[y+(E<<4)+8>>3];G=+h[y+(D<<4)+8>>3];if(F<G){H=E;break}if(F!=G){I=15;break}if(((yb()|0)&1|0)==0){I=15}else{H=E}}else{I=15}}while(0);if((I|0)==15){I=0;H=D}do{if((C|0)<(B|0)){G=+h[y+(C<<4)+8>>3];F=+h[y+(H<<4)+8>>3];if(G>=F){if(G!=F){J=H;break}if(((yb()|0)&1|0)==0){J=H;break}}J=C}else{J=H}}while(0);if((J|0)==(D|0)){break}C=y+(J<<4)|0;c[A>>2]=c[C>>2];c[A+4>>2]=c[C+4>>2];c[A+8>>2]=c[C+8>>2];c[A+12>>2]=c[C+12>>2];E=y+(D<<4)|0;c[C>>2]=c[E>>2];c[C+4>>2]=c[E+4>>2];c[C+8>>2]=c[E+8>>2];c[C+12>>2]=c[E+12>>2];c[E>>2]=c[A>>2];c[E+4>>2]=c[A+4>>2];c[E+8>>2]=c[A+8>>2];c[E+12>>2]=c[A+12>>2];D=J}if((m|0)>0){m=m-1|0}else{break}}}if((b|0)>1){m=1;do{c[q+(c[u+(m<<2)>>2]<<2)>>2]=c[u+(m-1<<2)>>2];m=m+1|0;}while((m|0)<(b|0))}if(z){z=0;while(1){m=z+1|0;c[s+(c[u+(z<<2)>>2]<<2)>>2]=c[u+(m<<2)>>2];if((m|0)<(B|0)){z=m}else{break}}}if((d|0)<1|(B|0)==0){K=y;L=n;M=0}else{z=l;l=k;k=j;j=B;m=B;J=y;y=n;n=d;A=0;while(1){H=c[J>>2]|0;D=c[J+4>>2]|0;F=+h[J+8>>3];E=m-1|0;C=J;N=J+(E<<4)|0;c[C>>2]=c[N>>2];c[C+4>>2]=c[N+4>>2];c[C+8>>2]=c[N+8>>2];c[C+12>>2]=c[N+12>>2];N=0;while(1){O=N<<1;P=O|1;do{if((O|0)<(E|0)){G=+h[J+(O<<4)+8>>3];Q=+h[J+(N<<4)+8>>3];if(G<Q){R=O;break}if(G!=Q){I=35;break}if(((yb()|0)&1|0)==0){I=35}else{R=O}}else{I=35}}while(0);if((I|0)==35){I=0;R=N}do{if((P|0)<(E|0)){Q=+h[J+(P<<4)+8>>3];G=+h[J+(R<<4)+8>>3];if(Q>=G){if(Q!=G){S=R;break}if(((yb()|0)&1|0)==0){S=R;break}}S=P}else{S=R}}while(0);if((S|0)==(N|0)){break}P=J+(S<<4)|0;c[z>>2]=c[P>>2];c[z+4>>2]=c[P+4>>2];c[z+8>>2]=c[P+8>>2];c[z+12>>2]=c[P+12>>2];O=J+(N<<4)|0;c[P>>2]=c[O>>2];c[P+4>>2]=c[O+4>>2];c[P+8>>2]=c[O+8>>2];c[P+12>>2]=c[O+12>>2];c[O>>2]=c[z>>2];c[O+4>>2]=c[z+4>>2];c[O+8>>2]=c[z+8>>2];c[O+12>>2]=c[z+12>>2];N=S}if((A|0)<(n|0)){T=y;U=n}else{T=gF(y,n<<5)|0;U=n<<1}N=A+1|0;c[T+(A<<4)>>2]=H;c[T+(A<<4)+4>>2]=D;h[T+(A<<4)+8>>3]=F;O=c[w+(H<<2)>>2]|0;P=c[w+(D<<2)>>2]|0;do{if((O|0)>0){V=c[u+(O-1<<2)>>2]|0;W=s+(V<<2)|0;if((c[w+(c[W>>2]<<2)>>2]|0)>=(P|0)){X=J;Y=E;Z=j;break}G=+h[a+(D<<3)>>3]- +h[a+(V<<3)>>3];if((E|0)==(j|0)){_=gF(C,j<<5)|0;$=j<<1}else{_=J;$=j}c[_+(E<<4)>>2]=V;c[_+(E<<4)+4>>2]=D;h[_+(E<<4)+8>>3]=G;a:do{if((E|0)>0){aa=E;Q=G;while(1){ba=(aa|0)/2|0;ca=_+(ba<<4)+8|0;da=+h[ca>>3];if(Q>=da){if(Q!=da){break a}if(((yb()|0)&1|0)==0){break a}}ea=_+(aa<<4)|0;c[l>>2]=c[ea>>2];c[l+4>>2]=c[ea+4>>2];c[l+8>>2]=c[ea+8>>2];c[l+12>>2]=c[ea+12>>2];fa=_+(ba<<4)|0;c[ea>>2]=c[fa>>2];c[ea+4>>2]=c[fa+4>>2];c[ea+8>>2]=c[fa+8>>2];c[ea+12>>2]=c[fa+12>>2];c[fa>>2]=c[l>>2];c[fa+4>>2]=c[l+4>>2];c[fa+8>>2]=c[l+8>>2];c[fa+12>>2]=c[l+12>>2];if((aa|0)<=1){break a}aa=ba;Q=+h[ca>>3]}}}while(0);c[W>>2]=D;c[q+(D<<2)>>2]=V;X=_;Y=m;Z=$}else{X=J;Y=E;Z=j}}while(0);do{if((P|0)<(B|0)){E=c[u+(P+1<<2)>>2]|0;D=q+(E<<2)|0;if((c[w+(c[D>>2]<<2)>>2]|0)<=(O|0)){ga=X;ha=Y;ia=Z;break}F=+h[a+(E<<3)>>3]- +h[a+(H<<3)>>3];if((Y|0)==(Z|0)){ja=gF(X,Z<<5)|0;ka=Z<<1}else{ja=X;ka=Z}C=Y+1|0;c[ja+(Y<<4)>>2]=H;c[ja+(Y<<4)+4>>2]=E;h[ja+(Y<<4)+8>>3]=F;b:do{if((Y|0)>0){aa=Y;G=F;while(1){ca=(aa|0)/2|0;ba=ja+(ca<<4)+8|0;Q=+h[ba>>3];if(G>=Q){if(G!=Q){break b}if(((yb()|0)&1|0)==0){break b}}fa=ja+(aa<<4)|0;c[k>>2]=c[fa>>2];c[k+4>>2]=c[fa+4>>2];c[k+8>>2]=c[fa+8>>2];c[k+12>>2]=c[fa+12>>2];ea=ja+(ca<<4)|0;c[fa>>2]=c[ea>>2];c[fa+4>>2]=c[ea+4>>2];c[fa+8>>2]=c[ea+8>>2];c[fa+12>>2]=c[ea+12>>2];c[ea>>2]=c[k>>2];c[ea+4>>2]=c[k+4>>2];c[ea+8>>2]=c[k+8>>2];c[ea+12>>2]=c[k+12>>2];if((aa|0)<=1){break b}aa=ca;G=+h[ba>>3]}}}while(0);c[D>>2]=H;c[s+(H<<2)>>2]=E;ga=ja;ha=C;ia=ka}else{ga=X;ha=Y;ia=Z}}while(0);if((N|0)>=(d|0)|(ha|0)==0){K=ga;L=T;M=N;break}else{j=ia;m=ha;J=ga;y=T;n=U;A=N}}}eF(p);eF(r);eF(t);eF(v);eF(K);K=kk(o)|0;o=K;v=(M<<1)+b|0;t=v<<2;r=kk(t)|0;p=kk(t)|0;if(x){t=0;do{c[o+(t<<2)>>2]=1;t=t+1|0;}while((t|0)<(b|0))}if((M|0)>0){t=0;do{A=c[L+(t<<4)+4>>2]|0;U=o+(c[L+(t<<4)>>2]<<2)|0;c[U>>2]=(c[U>>2]|0)+1;U=o+(A<<2)|0;c[U>>2]=(c[U>>2]|0)+1;t=t+1|0;}while((t|0)<(M|0))}if((v|0)>0){t=0;do{g[p+(t<<2)>>2]=1.0;t=t+1|0;}while((t|0)<(v|0))}v=kk(b<<4)|0;t=v;c[e>>2]=t;if(x){x=0;e=r;r=p;while(1){c[t+(x<<4)>>2]=1;c[t+(x<<4)+8>>2]=r;c[t+(x<<4)+4>>2]=e;c[e>>2]=x;g[r>>2]=0.0;p=c[o+(x<<2)>>2]|0;U=x+1|0;if((U|0)<(b|0)){x=U;e=e+(p<<2)|0;r=r+(p<<2)|0}else{break}}}eF(K);if((M|0)==0){la=L;eF(la);i=f;return}K=v+8|0;v=M;do{v=v-1|0;M=c[L+(v<<4)>>2]|0;r=c[L+(v<<4)+4>>2]|0;e=t+(M<<4)|0;x=c[e>>2]|0;b=c[t+(M<<4)+4>>2]|0;c:do{if((x|0)>0){o=0;while(1){p=o+1|0;if((c[b+(o<<2)>>2]|0)==(r|0)){break c}if((p|0)<(x|0)){o=p}else{I=81;break}}}else{I=81}}while(0);do{if((I|0)==81){I=0;c[e>>2]=x+1;c[b+(x<<2)>>2]=r;N=t+(r<<4)|0;o=c[N>>2]|0;c[N>>2]=o+1;c[(c[t+(r<<4)+4>>2]|0)+(o<<2)>>2]=M;if((c[K>>2]|0)==0){break}o=c[t+(M<<4)+8>>2]|0;g[o>>2]=+g[o>>2]+-1.0;o=c[t+(r<<4)+8>>2]|0;g[o>>2]=+g[o>>2]+-1.0}}while(0);}while((v|0)!=0);la=L;eF(la);i=f;return}function Ar(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0;j=i;k=e<<3;l=kk(k)|0;m=l;n=kk(k)|0;o=n;p=kk(k)|0;q=p;r=kk(k)|0;s=r;t=kk(k)|0;u=t;v=kk(k)|0;k=v;Xs(e,d,k);if(h<<24>>24!=0){Ss(e,k);Ss(e,b)}Ts(a,e,b,s);Us(e,k,s,m);Xs(e,m,o);w=+Ys(e,m,m);a:do{if((g|0)>0){s=g-1|0;x=w;k=0;while(1){if(+Zs(e,m)<=f){y=0;break a}Ts(a,e,o,q);z=+Ys(e,o,q);if(z==0.0){y=0;break a}A=x/z;Ws(e,o,A,u);Vs(e,b,u,b);if((k|0)<(s|0)){Ws(e,q,A,q);Us(e,m,q,m);A=+Ys(e,m,m);if(x==0.0){break}Ws(e,o,A/x,o);Vs(e,m,o,o);B=A}else{B=x}h=k+1|0;if((h|0)<(g|0)){x=B;k=h}else{y=0;break a}}Fv(1,104304,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0)|0;i=k;y=1}else{y=0}}while(0);eF(l);eF(n);eF(p);eF(r);eF(t);eF(v);i=j;return y|0}function Br(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0.0,x=0;h=i;j=e<<2;k=jk(j)|0;l=k;m=jk(j)|0;n=m;o=jk(j)|0;p=o;q=jk(j)|0;j=q;$s(e,b);$s(e,d);at(a,e,b,j);$s(e,j);bt(e,d,j,l);ft(e,l,n);r=+gt(e,l,l);a:do{if((g|0)>0){j=g-1|0;s=r;d=0;while(1){if(+it(e,l)<=f){t=0;break a}$s(e,n);$s(e,b);$s(e,l);at(a,e,n,p);$s(e,p);u=+gt(e,n,p);if(u==0.0){t=0;break a}v=s/u;dt(e,b,v,n);if((d|0)<(j|0)){dt(e,l,-0.0-v,p);v=+gt(e,l,l);if(s==0.0){break}et(e,n,v/s,n);ct(e,l,n,n);w=v}else{w=s}x=d+1|0;if((x|0)<(g|0)){s=w;d=x}else{t=0;break a}}Fv(1,104304,(d=i,i=i+1|0,i=i+7&-8,c[d>>2]=0,d)|0)|0;i=d;t=1}else{t=0}}while(0);eF(k);eF(m);eF(o);eF(q);i=h;return t|0}function Cr(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;e=i;i=i+16|0;f=e|0;j=Lw(b)|0;k=kk(j*48|0)|0;l=k;or(f,b);m=+g[f>>2];n=+g[f+4>>2];o=a[f+8|0]|0;f=ux(b)|0;if((f|0)!=0){p=m*5.0;q=n*5.0;if(o<<24>>24==0){o=l;r=f;while(1){s=c[r+8>>2]|0;t=c[s+132>>2]|0;u=+h[t>>3]*10.0*72.0;if(u<0.0){v=u+-.5}else{v=u+.5}w=~~v;u=+h[t+8>>3]*10.0*72.0;if(u<0.0){x=u+-.5}else{x=u+.5}t=~~x;u=p*+h[s+32>>3]*72.0;if(u<0.0){y=u+-.5}else{y=u+.5}z=~~y;u=q*+h[s+40>>3]*72.0;if(u<0.0){A=u+-.5}else{A=u+.5}s=~~A;c[o+12>>2]=w;c[o+16>>2]=t;c[o+20>>2]=r;c[o+32>>2]=w-z;c[o+36>>2]=t-s;c[o+40>>2]=z+w;c[o+44>>2]=s+t;t=vx(b,r)|0;if((t|0)==0){break}else{o=o+48|0;r=t}}}else{r=l;o=f;while(1){f=c[o+8>>2]|0;t=c[f+132>>2]|0;A=+h[t>>3]*10.0*72.0;if(A<0.0){B=A+-.5}else{B=A+.5}s=~~B;A=+h[t+8>>3]*10.0*72.0;if(A<0.0){C=A+-.5}else{C=A+.5}t=~~C;A=+h[f+32>>3]*.5*72.0;if(A<0.0){D=A+-.5}else{D=A+.5}w=~~((m+ +(~~D|0))*10.0);A=+h[f+40>>3]*.5*72.0;if(A<0.0){E=A+-.5}else{E=A+.5}f=~~((n+ +(~~E|0))*10.0);c[r+12>>2]=s;c[r+16>>2]=t;c[r+20>>2]=o;c[r+32>>2]=s-w;c[r+36>>2]=t-f;c[r+40>>2]=w+s;c[r+44>>2]=f+t;t=vx(b,o)|0;if((t|0)==0){break}else{r=r+48|0;o=t}}}}o=j-1|0;if((o|0)>0){F=0;G=l}else{H=0;eF(k);i=e;return H|0}a:while(1){r=G+48|0;t=F+1|0;if((t|0)<(j|0)){f=c[G+32>>2]|0;s=G+40|0;w=G+36|0;z=G+44|0;I=t;J=r;while(1){do{if((f|0)<=(c[J+40>>2]|0)){if((c[J+32>>2]|0)>(c[s>>2]|0)){break}if((c[w>>2]|0)>(c[J+44>>2]|0)){break}if((c[J+36>>2]|0)<=(c[z>>2]|0)){break a}}}while(0);K=I+1|0;if((K|0)<(j|0)){I=K;J=J+48|0}else{break}}}if((t|0)<(o|0)){F=t;G=r}else{H=0;L=49;break}}if((L|0)==49){eF(k);i=e;return H|0}switch(d|0){case 9:{Dr(b,l,j,140,1);Fr(b,l,j,142,1);break};case 10:{Fr(b,l,j,142,1);Dr(b,l,j,140,1);break};case 7:{Dr(b,l,j,204,1);Fr(b,l,j,142,1);L=42;break};case 8:{L=42;break};case 13:{L=43;break};case 14:{Fr(b,l,j,142,0);Dr(b,l,j,140,0);break};case 12:{Fr(b,l,j,162,0);Dr(b,l,j,140,0);break};default:{Dr(b,l,j,204,0);Fr(b,l,j,142,0)}}if((L|0)==42){Fr(b,l,j,162,1);Dr(b,l,j,140,1);L=43}if((L|0)==43){Dr(b,l,j,140,0);Fr(b,l,j,142,0)}if((j|0)>0){M=l;N=0}else{H=1;eF(k);i=e;return H|0}while(1){l=c[M+16>>2]|0;b=(c[M+20>>2]|0)+8|0;h[c[(c[b>>2]|0)+132>>2]>>3]=+(c[M+12>>2]|0)/72.0/10.0;h[(c[(c[b>>2]|0)+132>>2]|0)+8>>3]=+(l|0)/72.0/10.0;l=N+1|0;if((l|0)<(j|0)){M=M+48|0;N=l}else{H=1;break}}eF(k);i=e;return H|0}function Dr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=$g(40288,c[43332]|0)|0;h=(d|0)>0;if(h){i=g|0;j=0;k=b;while(1){c[k+8>>2]=c[k+12>>2];Hc[c[i>>2]&63](g,k,1)|0;l=j+1|0;if((l|0)<(d|0)){j=l;k=k+48|0}else{break}}}if((f|0)==0){m=Or(a,g,e,178)|0}else{m=Nr(g,e,178)|0}ok(m,2,2147483647)|0;if(h){h=0;e=b;while(1){b=e+12|0;a=c[(c[(c[e+24>>2]|0)+8>>2]|0)+232>>2]|0;f=a-(c[b>>2]|0)|0;c[b>>2]=a;a=e+32|0;c[a>>2]=(c[a>>2]|0)+f;a=e+40|0;c[a>>2]=(c[a>>2]|0)+f;f=h+1|0;if((f|0)<(d|0)){h=f;e=e+48|0}else{break}}}e=ux(m)|0;if((e|0)==0){n=Kw(m)|0;o=Vg(g)|0;return}else{p=e}do{e=p+8|0;h=c[e>>2]|0;d=c[h+172>>2]|0;if((d|0)==0){q=h}else{eF(d);q=c[e>>2]|0}e=c[q+180>>2]|0;if((e|0)!=0){eF(e)}p=vx(m,p)|0;}while((p|0)!=0);n=Kw(m)|0;o=Vg(g)|0;return}function Er(a,b){a=a|0;b=b|0;var d=0;if((c[a+36>>2]|0)>(c[b+44>>2]|0)){d=0;return d|0}d=(c[b+36>>2]|0)<=(c[a+44>>2]|0)|0;return d|0}function Fr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=$g(40288,c[43332]|0)|0;h=(d|0)>0;if(h){i=g|0;j=0;k=b;while(1){c[k+8>>2]=c[k+16>>2];Hc[c[i>>2]&63](g,k,1)|0;l=j+1|0;if((l|0)<(d|0)){j=l;k=k+48|0}else{break}}}if((f|0)==0){m=Or(a,g,e,98)|0}else{m=Nr(g,e,98)|0}ok(m,2,2147483647)|0;if(h){h=0;e=b;while(1){b=e+16|0;a=c[(c[(c[e+24>>2]|0)+8>>2]|0)+232>>2]|0;f=a-(c[b>>2]|0)|0;c[b>>2]=a;a=e+36|0;c[a>>2]=(c[a>>2]|0)+f;a=e+44|0;c[a>>2]=(c[a>>2]|0)+f;f=h+1|0;if((f|0)<(d|0)){h=f;e=e+48|0}else{break}}}e=ux(m)|0;if((e|0)==0){n=Kw(m)|0;o=Vg(g)|0;return}else{p=e}do{e=p+8|0;h=c[e>>2]|0;d=c[h+172>>2]|0;if((d|0)==0){q=h}else{eF(d);q=c[e>>2]|0}e=c[q+180>>2]|0;if((e|0)!=0){eF(e)}p=vx(m,p)|0;}while((p|0)!=0);n=Kw(m)|0;o=Vg(g)|0;return}function Gr(a,b){a=a|0;b=b|0;var d=0;if((c[a+32>>2]|0)>(c[b+40>>2]|0)){d=0;return d|0}d=(c[b+32>>2]|0)<=(c[a+40>>2]|0)|0;return d|0}function Hr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=c[a+36>>2]|0;e=c[b+44>>2]|0;if((d|0)>(e|0)){f=0;return f|0}g=c[b+36>>2]|0;h=c[a+44>>2]|0;if((g|0)>(h|0)){f=0;return f|0}i=c[a+40>>2]|0;j=c[b+32>>2]|0;if((i|0)<(j|0)){f=1;return f|0}k=c[b+16>>2]|0;l=c[a+16>>2]|0;f=(((i-j-(c[a+32>>2]|0)+(c[b+40>>2]|0)|0)/2|0)-(c[b+12>>2]|0)+(c[a+12>>2]|0)|0)<=(((h-d+e-g|0)/2|0)+((k|0)<(l|0)?k-l|0:l-k|0)|0)|0;return f|0}function Ir(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=c[a+32>>2]|0;e=c[b+40>>2]|0;if((d|0)>(e|0)){f=0;return f|0}g=c[b+32>>2]|0;h=c[a+40>>2]|0;if((g|0)>(h|0)){f=0;return f|0}i=c[a+44>>2]|0;j=c[b+36>>2]|0;if((i|0)<(j|0)){f=1;return f|0}k=c[b+12>>2]|0;l=c[a+12>>2]|0;f=(((i-(c[a+36>>2]|0)+(c[b+44>>2]|0)-j|0)/2|0)-(c[b+16>>2]|0)+(c[a+16>>2]|0)|0)<=(((h-(g+d)+e|0)/2|0)+((k|0)<(l|0)?k-l|0:l-k|0)|0)|0;return f|0}function Jr(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0.0,n=0.0,p=0,q=0.0,r=0.0,s=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0.0,aa=0.0,ba=0,ca=0,da=0.0,ea=0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0,ka=0;e=i;i=i+16|0;f=e|0;j=Lw(b)|0;k=kk(j*72|0)|0;l=k;or(f,b);m=+g[f>>2];n=+g[f+4>>2];p=(a[f+8|0]|0)!=0;if(p){q=m/72.0;r=n/72.0}else{q=m;r=n}f=ux(b)|0;if((f|0)!=0){n=q;q=r;s=f;f=l;while(1){u=c[s+8>>2]|0;r=+h[u+32>>3];if(p){v=q+ +h[u+40>>3]*.5;w=n+r*.5}else{v=q*+h[u+40>>3]*.5;w=n*r*.5}r=+h[c[u+132>>2]>>3];h[f>>3]=r;m=+h[(c[(c[s+8>>2]|0)+132>>2]|0)+8>>3];h[f+8>>3]=m;h[f+16>>3]=r-w;h[f+24>>3]=m-v;h[f+32>>3]=w+r;h[f+40>>3]=v+m;h[f+48>>3]=w;h[f+56>>3]=v;c[f+64>>2]=s;u=vx(b,s)|0;if((u|0)==0){break}else{s=u;f=f+72|0}}}a:do{if((d|0)<0){b:do{if((j|0)>0){f=l;s=0;v=0.0;c:while(1){b=f+72|0;p=s+1|0;if((p|0)>=(j|0)){break}w=+h[f+16>>3];u=f|0;x=f+8|0;y=f+56|0;z=f+48|0;A=f+32|0;B=f+24|0;C=f+40|0;D=b;E=p;n=v;while(1){do{if(w<=+h[D+32>>3]){if(+h[D+16>>3]>+h[A>>3]){break}if(+h[B>>3]>+h[D+40>>3]){break}if(+h[D+24>>3]<=+h[C>>3]){break b}}}while(0);q=+h[u>>3];m=+h[D>>3];if(q==m){F=t}else{F=(+h[z>>3]+ +h[D+48>>3])/+S(+(q-m))}m=+h[x>>3];q=+h[D+8>>3];if(m==q){G=t}else{G=(+h[y>>3]+ +h[D+56>>3])/+S(+(m-q))}q=G<F?G:F;m=q>n?q:n;H=E+1|0;if((H|0)<(j|0)){D=D+72|0;E=H;n=m}else{f=b;s=p;v=m;continue c}}}if(v==0.0){break}gc(c[o>>2]|0,103696,(s=i,i=i+8|0,h[s>>3]=v,s)|0)|0;i=s;I=v;J=v;break a}}while(0);eF(k);K=0;i=e;return K|0}else{s=kk((j<<4)+16|0)|0;d:do{if((j|0)>0){f=l;p=j;b=s;E=0;D=0;e:while(1){y=f+72|0;x=E+1|0;if((x|0)>=(j|0)){L=b;M=D;break d}z=f+16|0;u=f+32|0;C=f+24|0;B=f+40|0;A=f|0;H=f+8|0;N=f+56|0;O=f+48|0;P=y;Q=p;R=b;T=x;U=D;while(1){do{if(+h[z>>3]>+h[P+32>>3]){V=U;W=R;X=Q}else{if(+h[P+16>>3]>+h[u>>3]){V=U;W=R;X=Q;break}if(+h[C>>3]>+h[P+40>>3]){V=U;W=R;X=Q;break}if(+h[P+24>>3]>+h[B>>3]){V=U;W=R;X=Q;break}if((U|0)==(Q|0)){Y=U+j|0;Z=mk(R,(Y<<4)+16|0)|0;_=Y}else{Z=R;_=Q}n=+h[A>>3];w=+h[P>>3];do{if(n==w){$=t}else{m=(+h[O>>3]+ +h[P+48>>3])/+S(+(n-w));if(m>=1.0){$=m;break}$=1.0}}while(0);w=+h[H>>3];n=+h[P+8>>3];do{if(w==n){aa=t}else{m=(+h[N>>3]+ +h[P+56>>3])/+S(+(w-n));if(m>=1.0){aa=m;break}aa=1.0}}while(0);Y=U+1|0;h[Z+(Y<<4)>>3]=$;h[Z+(Y<<4)+8>>3]=aa;V=Y;W=Z;X=_}}while(0);Y=T+1|0;if((Y|0)>=(j|0)){f=y;p=X;b=W;E=x;D=V;continue e}P=P+72|0;Q=X;R=W;T=Y;U=V}}}else{L=s;M=0}}while(0);s=(M<<4)+16|0;D=mk(L,s)|0;E=D;if((M|0)==0){eF(D);eF(k);K=0;i=e;return K|0}do{if((d|0)==0){h[D>>3]=1.0;h[D+8>>3]=t;Jb(D+16|0,M|0,16,60);b=kk(s)|0;h[b+(M<<4)>>3]=+h[E+(M<<4)>>3];h[b+(M<<4)+8>>3]=1.0;if((M|0)>0){p=M;v=1.0;while(1){f=p-1|0;h[b+(f<<4)>>3]=+h[E+(f<<4)>>3];n=+h[E+(p<<4)+8>>3];w=n>v?n:v;h[b+(f<<4)+8>>3]=w;if((f|0)>0){p=f;v=w}else{break}}}if((M|0)<0){cc(148680,121688,834,170968);return 0}else{ba=0;ca=0;da=t}while(1){v=+h[b+(ca<<4)>>3]*+h[b+(ca<<4)+8>>3];p=v<da;ea=p?ca:ba;fa=p?v:da;if((ca|0)<(M|0)){ba=ea;ca=ca+1|0;da=fa}else{break}}if(fa<t){ga=+h[b+(ea<<4)>>3];ha=+h[b+(ea<<4)+8>>3];break}else{cc(148680,121688,834,170968);return 0}}else{if((M|0)<1){ga=0.0;ha=0.0;break}else{ia=0.0;ja=1;ka=E}while(1){p=ka+16|0;v=+h[p>>3];w=+h[ka+24>>3];n=v<w?v:w;w=n>ia?n:ia;if((ja|0)<(M|0)){ia=w;ja=ja+1|0;ka=p}else{ga=w;ha=w;break}}}}while(0);eF(D);I=ga;J=ha}}while(0);if((j|0)>0){ka=0;ja=l;while(1){l=ja+64|0;h[c[(c[(c[l>>2]|0)+8>>2]|0)+132>>2]>>3]=I*+h[ja>>3];h[(c[(c[(c[l>>2]|0)+8>>2]|0)+132>>2]|0)+8>>3]=J*+h[ja+8>>3];l=ka+1|0;if((l|0)<(j|0)){ka=l;ja=ja+72|0}else{break}}}eF(k);K=1;i=e;return K|0}function Kr(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0,f=0.0,g=0.0;c=+h[a>>3];d=+h[b>>3];do{if(c<d){e=-1}else{if(c>d){e=1;break}f=+h[a+8>>3];g=+h[b+8>>3];if(f<g){e=-1;break}e=f>g|0}}while(0);return e|0}function Lr(a,b){a=a|0;b=b|0;return((c[a+12>>2]|0)-(c[a+4>>2]|0)+(c[b+12>>2]|0)-(c[b+4>>2]|0)|0)/2|0|0}function Mr(a,b){a=a|0;b=b|0;return((c[a+8>>2]|0)-(c[a>>2]|0)+(c[b+8>>2]|0)-(c[b>>2]|0)|0)/2|0|0}function Nr(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;f=Hw(113056,173936,0)|0;Wx(f|0,106384,272,1)|0;g=Zg(a)|0;if((g|0)==0){h=0}else{i=0;j=-2147483647;k=g;while(1){g=c[k+8>>2]|0;l=((j|0)!=(g|0))+i|0;m=c[k>>2]|0;if((m|0)==0){h=l;break}else{i=l;j=g;k=m}}}k=f+8|0;j=(h<<3)-4|0;i=0;m=0;g=0;l=0;n=-2147483647;o=0;p=Zg(a)|0;while(1){q=c[p+8>>2]|0;do{if((n|0)==(q|0)){r=o;s=n;t=l;u=g;v=m;w=i}else{x=Ax(f,$w(c[p+20>>2]|0)|0,1)|0;Wx(x|0,100712,304,1)|0;y=x+8|0;c[(c[y>>2]|0)+112>>2]=p;if((m|0)==0){c[(c[k>>2]|0)+180>>2]=x;z=x}else{c[(c[o+8>>2]|0)+164>>2]=x;z=m}c[(c[y>>2]|0)+176>>2]=0;A=l+1|0;B=jk(A<<2)|0;c[(c[y>>2]|0)+172>>2]=B;if((i|0)==0){r=x;s=q;t=A;u=x;v=z;w=x;break}B=i+8|0;c[(c[B>>2]|0)+184>>2]=0;if((i|0)==(z|0)){C=jk(j)|0;c[(c[B>>2]|0)+180>>2]=C}else{C=jk(h-l<<2)|0;c[(c[B>>2]|0)+180>>2]=C}C=uw(f,i,x,0,1)|0;Wx(C|0,95048,176,1)|0;D=C+8|0;b[(c[D>>2]|0)+170>>1]=10;c[(c[D>>2]|0)+156>>2]=1;D=(c[B>>2]|0)+180|0;E=c[D>>2]|0;if((E|0)==0){F=kk((c[D+4>>2]<<2)+8|0)|0}else{F=mk(E,(c[D+4>>2]<<2)+8|0)|0}c[(c[B>>2]|0)+180>>2]=F;D=(c[B>>2]|0)+184|0;E=c[D>>2]|0;c[D>>2]=E+1;c[(c[(c[B>>2]|0)+180>>2]|0)+(E<<2)>>2]=C;E=(c[B>>2]|0)+180|0;c[(c[E>>2]|0)+(c[E+4>>2]<<2)>>2]=0;E=(c[y>>2]|0)+172|0;B=c[E>>2]|0;if((B|0)==0){G=kk((c[E+4>>2]<<2)+8|0)|0}else{G=mk(B,(c[E+4>>2]<<2)+8|0)|0}c[(c[y>>2]|0)+172>>2]=G;E=(c[y>>2]|0)+176|0;B=c[E>>2]|0;c[E>>2]=B+1;c[(c[(c[y>>2]|0)+172>>2]|0)+(B<<2)>>2]=C;C=(c[y>>2]|0)+172|0;c[(c[C>>2]|0)+(c[C+4>>2]<<2)>>2]=0;r=x;s=q;t=A;u=x;v=z;w=x}}while(0);c[p+24>>2]=u;q=c[p>>2]|0;if((q|0)==0){break}else{i=w;m=v;g=u;l=t;n=s;o=r;p=q}}p=w+8|0;c[(c[p>>2]|0)+184>>2]=0;w=jk(4)|0;c[(c[p>>2]|0)+180>>2]=w;w=Hw(84680,173936,0)|0;p=Zg(a)|0;if((p|0)!=0){r=p;do{p=Ax(w,$w(c[r+20>>2]|0)|0,1)|0;Wx(p|0,100712,304,1)|0;c[r+28>>2]=p;c[(c[p+8>>2]|0)+112>>2]=r;r=c[r>>2]|0;}while((r|0)!=0)}r=Zg(a)|0;a:do{if((r|0)!=0){a=0;p=-2147483647;o=r;while(1){s=o;n=c[o+8>>2]|0;if((p|0)==(n|0)){H=p;I=a}else{t=o;do{t=c[t>>2]|0;if((t|0)==0){break a}}while((c[t+8>>2]|0)==(n|0));H=n;I=t}if((I|0)!=0){l=o+28|0;u=I;do{if((Oc[d&255](s,u)|0)!=0){uw(w,c[l>>2]|0,c[u+28>>2]|0,0,1)|0}u=c[u>>2]|0;}while((u|0)!=0)}u=c[o>>2]|0;if((u|0)==0){break}else{a=I;p=H;o=u}}}}while(0);H=ux(w)|0;if((H|0)==0){J=Kw(w)|0;return f|0}else{K=H}do{H=c[(c[K+8>>2]|0)+112>>2]|0;I=c[H+24>>2]|0;d=mw(w,K)|0;if((d|0)!=0){r=H+32|0;H=I+8|0;o=d;do{d=c[(c[(c[((c[o>>2]&3|0)==2?o:o-32|0)+28>>2]|0)+8>>2]|0)+112>>2]|0;p=Oc[e&255](r,d+32|0)|0;a=c[d+24>>2]|0;d=uw(f,I,a,0,1)|0;Wx(d|0,95048,176,1)|0;u=d+8|0;c[(c[u>>2]|0)+156>>2]=1;l=c[u>>2]|0;s=b[l+170>>1]|0;if((s&65535|0)<(p|0)){if(s<<16>>16==0){s=(c[H>>2]|0)+180|0;t=c[s>>2]|0;if((t|0)==0){L=kk((c[s+4>>2]<<2)+8|0)|0}else{L=mk(t,(c[s+4>>2]<<2)+8|0)|0}c[(c[H>>2]|0)+180>>2]=L;s=(c[H>>2]|0)+184|0;t=c[s>>2]|0;c[s>>2]=t+1;c[(c[(c[H>>2]|0)+180>>2]|0)+(t<<2)>>2]=d;t=(c[H>>2]|0)+180|0;c[(c[t>>2]|0)+(c[t+4>>2]<<2)>>2]=0;t=a+8|0;a=(c[t>>2]|0)+172|0;s=c[a>>2]|0;if((s|0)==0){M=kk((c[a+4>>2]<<2)+8|0)|0}else{M=mk(s,(c[a+4>>2]<<2)+8|0)|0}c[(c[t>>2]|0)+172>>2]=M;a=(c[t>>2]|0)+176|0;s=c[a>>2]|0;c[a>>2]=s+1;c[(c[(c[t>>2]|0)+172>>2]|0)+(s<<2)>>2]=d;d=(c[t>>2]|0)+172|0;c[(c[d>>2]|0)+(c[d+4>>2]<<2)>>2]=0;N=c[u>>2]|0}else{N=l}b[N+170>>1]=p}o=ow(w,o)|0;}while((o|0)!=0)}K=vx(w,K)|0;}while((K|0)!=0);J=Kw(w)|0;return f|0}function Or(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=Hw(113056,173936,0)|0;Wx(g|0,106384,272,1)|0;h=Zg(d)|0;if((h|0)!=0){i=g+8|0;j=0;k=h;while(1){h=Ax(g,$w(c[k+20>>2]|0)|0,1)|0;Wx(h|0,100712,304,1)|0;l=h+8|0;c[(c[l>>2]|0)+112>>2]=k;c[k+24>>2]=h;c[(c[l>>2]|0)+176>>2]=0;m=jk(4)|0;c[(c[l>>2]|0)+172>>2]=m;c[(c[l>>2]|0)+184>>2]=0;m=jk(4)|0;c[(c[l>>2]|0)+180>>2]=m;if((j|0)==0){c[(c[i>>2]|0)+180>>2]=h}else{c[(c[j+8>>2]|0)+164>>2]=h}m=c[k>>2]|0;if((m|0)==0){break}else{j=h;k=m}}}k=Zg(d)|0;a:do{if((k|0)!=0){j=k;b:while(1){i=j;m=j|0;h=c[m>>2]|0;if((h|0)==0){break a}l=j+32|0;n=j+24|0;o=j+20|0;p=h;do{do{if((Oc[e&255](i,p)|0)!=0){h=Oc[f&255](l,p+32|0)|0;q=uw(g,c[n>>2]|0,c[p+24>>2]|0,0,1)|0;Wx(q|0,95048,176,1)|0;if((h|0)>=65536){break b}r=q+8|0;b[(c[r>>2]|0)+170>>1]=~~+(h|0);c[(c[r>>2]|0)+156>>2]=1;if((q|0)==0){break}if((uw(a,c[o>>2]|0,c[p+20>>2]|0,0,0)|0)==0){break}c[(c[r>>2]|0)+156>>2]=100}}while(0);p=c[p>>2]|0;}while((p|0)!=0);j=c[m>>2]|0;if((j|0)==0){break a}}cc(89688,121688,256,170216);return 0}}while(0);a=Zg(d)|0;if((a|0)==0){return g|0}else{s=a}do{a=c[s+24>>2]|0;d=mw(g,a)|0;if((d|0)!=0){f=a+8|0;a=d;do{d=(c[f>>2]|0)+180|0;e=c[d>>2]|0;if((e|0)==0){t=kk((c[d+4>>2]<<2)+8|0)|0}else{t=mk(e,(c[d+4>>2]<<2)+8|0)|0}c[(c[f>>2]|0)+180>>2]=t;d=(c[f>>2]|0)+184|0;e=c[d>>2]|0;c[d>>2]=e+1;c[(c[(c[f>>2]|0)+180>>2]|0)+(e<<2)>>2]=a;e=(c[f>>2]|0)+180|0;c[(c[e>>2]|0)+(c[e+4>>2]<<2)>>2]=0;e=a;d=a-32|0;k=(c[(c[((c[e>>2]&3|0)==2?a:d)+28>>2]|0)+8>>2]|0)+172|0;j=c[k>>2]|0;if((j|0)==0){u=kk((c[k+4>>2]<<2)+8|0)|0}else{u=mk(j,(c[k+4>>2]<<2)+8|0)|0}c[(c[(c[((c[e>>2]&3|0)==2?a:d)+28>>2]|0)+8>>2]|0)+172>>2]=u;k=(c[(c[((c[e>>2]&3|0)==2?a:d)+28>>2]|0)+8>>2]|0)+176|0;j=c[k>>2]|0;c[k>>2]=j+1;c[(c[(c[(c[((c[e>>2]&3|0)==2?a:d)+28>>2]|0)+8>>2]|0)+172>>2]|0)+(j<<2)>>2]=a;j=(c[(c[((c[e>>2]&3|0)==2?a:d)+28>>2]|0)+8>>2]|0)+172|0;c[(c[j>>2]|0)+(c[j+4>>2]<<2)>>2]=0;a=ow(g,a)|0;}while((a|0)!=0)}s=c[s>>2]|0;}while((s|0)!=0);return g|0}function Pr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return(c[b>>2]|0)-(c[d>>2]|0)|0}function Qr(a){a=a|0;var b=0;if((a|0)==0){return}b=c[a+4>>2]|0;if((b|0)!=0){eF(b)}b=c[a+8>>2]|0;if((b|0)!=0){eF(b)}eF(a);return}function Rr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=d<<2;c[45186]=gF(c[45186]|0,f)|0;h=(d|0)>0;if(h){i=0;do{c[e+(i<<2)>>2]=2147483647;i=i+1|0;}while((i|0)<(d|0))}c[e+(a<<2)>>2]=0;i=b+(a<<4)|0;if((c[i>>2]|0)>1){j=b+(a<<4)+8|0;k=b+(a<<4)+4|0;l=1;do{c[e+(c[(c[k>>2]|0)+(l<<2)>>2]<<2)>>2]=~~+g[(c[j>>2]|0)+(l<<2)>>2];l=l+1|0;}while((l|0)<(c[i>>2]|0))}i=c[45186]|0;if((d|0)==1){m=0;n=0;o=8}else{l=kk(f-4|0)|0;f=d-1|0;if(h){m=f;n=l;o=8}else{p=f;q=l}}if((o|0)==8){l=0;f=0;while(1){if((l|0)==(a|0)){r=f}else{c[n+(f<<2)>>2]=l;c[i+(l<<2)>>2]=f;r=f+1|0}j=l+1|0;if((j|0)<(d|0)){l=j;f=r}else{p=m;q=n;break}}}if((p|0)>-2){n=(p|0)/2|0;while(1){m=n;while(1){r=m<<1;f=r|1;if((r|0)<(p|0)){if((c[e+(c[q+(r<<2)>>2]<<2)>>2]|0)<(c[e+(c[q+(m<<2)>>2]<<2)>>2]|0)){s=r}else{o=17}}else{o=17}if((o|0)==17){o=0;s=m}if((f|0)<(p|0)){t=(c[e+(c[q+(f<<2)>>2]<<2)>>2]|0)<(c[e+(c[q+(s<<2)>>2]<<2)>>2]|0)?f:s}else{t=s}if((t|0)==(m|0)){break}f=q+(t<<2)|0;r=c[f>>2]|0;l=q+(m<<2)|0;c[f>>2]=c[l>>2];c[l>>2]=r;c[i+(c[f>>2]<<2)>>2]=t;c[i+(c[l>>2]<<2)>>2]=m;m=t}if((n|0)>0){n=n-1|0}else{break}}if((p|0)==0){u=-2147483639}else{v=p;w=-2147483639;o=25}}else{v=p;w=-2147483639;o=25}a:do{if((o|0)==25){while(1){o=0;p=c[45186]|0;n=c[q>>2]|0;t=v-1|0;i=c[q+(t<<2)>>2]|0;c[q>>2]=i;c[p+(i<<2)>>2]=0;i=0;while(1){s=i<<1;m=s|1;if((s|0)<(t|0)){if((c[e+(c[q+(s<<2)>>2]<<2)>>2]|0)<(c[e+(c[q+(i<<2)>>2]<<2)>>2]|0)){x=s}else{o=28}}else{o=28}if((o|0)==28){o=0;x=i}if((m|0)<(t|0)){y=(c[e+(c[q+(m<<2)>>2]<<2)>>2]|0)<(c[e+(c[q+(x<<2)>>2]<<2)>>2]|0)?m:x}else{y=x}if((y|0)==(i|0)){break}m=q+(y<<2)|0;s=c[m>>2]|0;l=q+(i<<2)|0;c[m>>2]=c[l>>2];c[l>>2]=s;c[p+(c[m>>2]<<2)>>2]=y;c[p+(c[l>>2]<<2)>>2]=i;i=y}i=c[e+(n<<2)>>2]|0;if((i|0)==2147483647){u=w;break a}p=b+(n<<4)|0;l=c[p>>2]|0;if((l|0)>1){m=b+(n<<4)+4|0;s=b+(n<<4)+8|0;f=1;r=l;while(1){l=c[(c[m>>2]|0)+(f<<2)>>2]|0;a=~~+g[(c[s>>2]|0)+(f<<2)>>2]+i|0;j=c[45186]|0;k=e+(l<<2)|0;if((c[k>>2]|0)>(a|0)){z=j+(l<<2)|0;A=c[z>>2]|0;c[k>>2]=a;b:do{if((A|0)>0){k=A;while(1){B=(k|0)/2|0;C=c[q+(B<<2)>>2]|0;if((c[e+(C<<2)>>2]|0)<=(a|0)){D=k;break b}c[q+(k<<2)>>2]=C;c[j+(C<<2)>>2]=k;if((k|0)>1){k=B}else{D=B;break}}}else{D=A}}while(0);c[q+(D<<2)>>2]=l;c[z>>2]=D;E=c[p>>2]|0}else{E=r}A=f+1|0;if((A|0)<(E|0)){f=A;r=E}else{break}}}r=i+10|0;if((t|0)==0){u=r;break}else{v=t;w=r;o=25}}}}while(0);if(h){h=0;do{o=e+(h<<2)|0;if((c[o>>2]|0)==2147483647){c[o>>2]=u}h=h+1|0;}while((h|0)<(d|0))}if((q|0)==0){return}eF(q);return}function Sr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0;f=kk(d<<2)|0;h=f;i=(d|0)>0;if(i){j=0;do{g[e+(j<<2)>>2]=3.4028234663852886e+38;j=j+1|0;}while((j|0)<(d|0))}g[e+(a<<2)>>2]=0.0;j=b+(a<<4)|0;if((c[j>>2]|0)>1){k=b+(a<<4)+8|0;l=b+(a<<4)+4|0;m=1;do{g[e+(c[(c[l>>2]|0)+(m<<2)>>2]<<2)>>2]=+g[(c[k>>2]|0)+(m<<2)>>2];m=m+1|0;}while((m|0)<(c[j>>2]|0))}j=d-1|0;m=kk(j<<2)|0;k=m;if(i){i=0;l=0;while(1){if((i|0)==(a|0)){n=l}else{c[k+(l<<2)>>2]=i;c[h+(i<<2)>>2]=l;n=l+1|0}o=i+1|0;if((o|0)<(d|0)){i=o;l=n}else{break}}}if((j|0)>-2){n=(j|0)/2|0;while(1){l=n;while(1){i=l<<1;d=i|1;if((i|0)<(j|0)){if(+g[e+(c[k+(i<<2)>>2]<<2)>>2]<+g[e+(c[k+(l<<2)>>2]<<2)>>2]){p=i}else{q=15}}else{q=15}if((q|0)==15){q=0;p=l}do{if((d|0)<(j|0)){if(+g[e+(c[k+(d<<2)>>2]<<2)>>2]>=+g[e+(c[k+(p<<2)>>2]<<2)>>2]){r=p;break}r=d}else{r=p}}while(0);if((r|0)==(l|0)){break}d=k+(r<<2)|0;i=c[d>>2]|0;a=k+(l<<2)|0;c[d>>2]=c[a>>2];c[a>>2]=i;c[h+(c[d>>2]<<2)>>2]=r;c[h+(c[a>>2]<<2)>>2]=l;l=r}if((n|0)>0){n=n-1|0}else{break}}if((j|0)!=0){s=j;q=24}}else{s=j;q=24}a:do{if((q|0)==24){while(1){q=0;j=c[k>>2]|0;n=s-1|0;r=c[k+(n<<2)>>2]|0;c[k>>2]=r;c[h+(r<<2)>>2]=0;r=0;while(1){p=r<<1;l=p|1;if((p|0)<(n|0)){if(+g[e+(c[k+(p<<2)>>2]<<2)>>2]<+g[e+(c[k+(r<<2)>>2]<<2)>>2]){t=p}else{q=27}}else{q=27}if((q|0)==27){q=0;t=r}do{if((l|0)<(n|0)){if(+g[e+(c[k+(l<<2)>>2]<<2)>>2]>=+g[e+(c[k+(t<<2)>>2]<<2)>>2]){u=t;break}u=l}else{u=t}}while(0);if((u|0)==(r|0)){break}l=k+(u<<2)|0;p=c[l>>2]|0;a=k+(r<<2)|0;c[l>>2]=c[a>>2];c[a>>2]=p;c[h+(c[l>>2]<<2)>>2]=u;c[h+(c[a>>2]<<2)>>2]=r;r=u}v=+g[e+(j<<2)>>2];if(v==3.4028234663852886e+38){break a}r=b+(j<<4)|0;a=c[r>>2]|0;if((a|0)>1){l=b+(j<<4)+4|0;p=b+(j<<4)+8|0;d=1;i=a;while(1){a=c[(c[l>>2]|0)+(d<<2)>>2]|0;w=v+ +g[(c[p>>2]|0)+(d<<2)>>2];o=e+(a<<2)|0;if(+g[o>>2]>w){x=h+(a<<2)|0;y=c[x>>2]|0;g[o>>2]=w;b:do{if((y|0)>0){o=y;while(1){z=(o|0)/2|0;A=c[k+(z<<2)>>2]|0;if(+g[e+(A<<2)>>2]<=w){B=o;break b}c[k+(o<<2)>>2]=A;c[h+(A<<2)>>2]=o;if((o|0)>1){o=z}else{B=z;break}}}else{B=y}}while(0);c[k+(B<<2)>>2]=a;c[x>>2]=B;C=c[r>>2]|0}else{C=i}y=d+1|0;if((y|0)<(C|0)){d=y;i=C}else{break}}}if((n|0)==0){break}else{s=n;q=24}}}}while(0);if((m|0)==0){eF(f);return}eF(m);eF(f);return}function Tr(){nt(180656,48);c[44280]=0;return}function Ur(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0;d=ot(180656)|0;e=d;c[d+32>>2]=a;c[d+36>>2]=b;fu(a);fu(b);c[d+24>>2]=0;c[d+28>>2]=0;f=+h[a>>3];g=+h[b>>3]-f;i=+h[a+8>>3];j=+h[b+8>>3]-i;if(g>0.0){k=g}else{k=-0.0-g}if(j>0.0){l=j}else{l=-0.0-j}m=(g*g+j*j)*.5+(g*f+j*i);b=d+16|0;h[b>>3]=m;if(k>l){h[d>>3]=1.0;h[d+8>>3]=j/g;n=g;o=m/n;h[b>>3]=o;p=c[44280]|0;q=d+40|0;r=q;c[r>>2]=p;s=c[44280]|0;t=s+1|0;c[44280]=t;return e|0}else{h[d+8>>3]=1.0;h[d>>3]=g/j;n=j;o=m/n;h[b>>3]=o;p=c[44280]|0;q=d+40|0;r=q;c[r>>2]=p;s=c[44280]|0;t=s+1|0;c[44280]=t;return e|0}return 0}function Vr(a){a=a|0;var b=0.0,d=0,e=0,f=0,g=0,i=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0;b=+h[a>>3];do{if(b==1.0){if(+h[a+8>>3]<0.0){d=c[a+28>>2]|0;e=c[a+24>>2]|0;if((e|0)==0){f=d;g=9}else{i=e;j=d;g=5}}else{d=c[a+24>>2]|0;e=c[a+28>>2]|0;if((e|0)==0){f=d;g=9}else{i=e;j=d;g=5}}do{if((g|0)==5){k=+h[i+8>>3];if(k>+h[1538]){return}l=+h[1537];if(k<l){m=l;n=+h[a+16>>3]-l*+h[a+8>>3];o=l;p=j;break}else{m=k;n=+h[i>>3];o=l;p=j;break}}else if((g|0)==9){l=+h[1537];m=l;n=+h[a+16>>3]-l*+h[a+8>>3];o=l;p=f}}while(0);do{if((p|0)==0){l=+h[1538];q=l;r=+h[a+16>>3]-l*+h[a+8>>3]}else{l=+h[p+8>>3];if(l<o){return}k=+h[1538];if(l>k){q=k;r=+h[a+16>>3]-k*+h[a+8>>3];break}else{q=l;r=+h[p>>3];break}}}while(0);l=+h[1540];d=n>l;e=r>l;k=+h[1539];if(d&e|n<k&r<k){return}if(d){s=(+h[a+16>>3]-l)/+h[a+8>>3];t=l}else{s=m;t=n}if(t<k){u=(+h[a+16>>3]-k)/+h[a+8>>3];v=k}else{u=s;v=t}if(e){w=(+h[a+16>>3]-l)/+h[a+8>>3];x=l}else{w=q;x=r}if(x>=k){y=w;z=u;A=x;B=v;break}y=(+h[a+16>>3]-k)/+h[a+8>>3];z=u;A=k;B=v}else{e=c[a+28>>2]|0;d=c[a+24>>2]|0;do{if((d|0)==0){k=+h[1539];C=+h[a+16>>3]-b*k;D=k;E=k}else{k=+h[d>>3];if(k>+h[1540]){return}l=+h[1539];if(k<l){C=+h[a+16>>3]-b*l;D=l;E=l;break}else{C=+h[d+8>>3];D=k;E=l;break}}}while(0);do{if((e|0)==0){l=+h[1540];F=+h[a+16>>3]-l*b;G=l}else{l=+h[e>>3];if(l<E){return}k=+h[1540];if(l>k){F=+h[a+16>>3]-k*b;G=k;break}else{F=+h[e+8>>3];G=l;break}}}while(0);l=+h[1538];e=C>l;d=F>l;k=+h[1537];if(e&d|C<k&F<k){return}if(e){H=l;I=(+h[a+16>>3]-l)/b}else{H=C;I=D}if(H<k){J=k;K=(+h[a+16>>3]-k)/b}else{J=H;K=I}if(d){L=l;M=(+h[a+16>>3]-l)/b}else{L=F;M=G}if(L>=k){y=L;z=J;A=M;B=K;break}y=k;z=J;A=(+h[a+16>>3]-k)/b;B=K}}while(0);p=a+32|0;ys(c[p>>2]|0,B,z);ys(c[p>>2]|0,A,y);p=a+36|0;ys(c[p>>2]|0,B,z);ys(c[p>>2]|0,A,y);return}function Wr(a,b,d){a=a|0;b=b|0;d=d|0;c[a+24+(b<<2)>>2]=d;fu(d);if((c[a+24+(1-b<<2)>>2]|0)==0){return}Vr(a);eu(c[a+32>>2]|0);eu(c[a+36>>2]|0);pt(a,180656);return}function Xr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;g=i;i=i+16|0;h=g|0;j=b<<2;k=kk(da(j,d)|0)|0;l=c[e>>2]|0;m=kk(j)|0;j=m;n=c[a+8>>2]|0;if((l|0)!=0){eF(c[l>>2]|0);eF(l)}l=kk(d<<2)|0;c[e>>2]=l;if((d|0)>0){e=0;do{c[l+(e<<2)>>2]=k+((da(e,b)|0)<<2);e=e+1|0;}while((e|0)<(d|0))}e=(f|0)!=0;if(e){Ds(a,b)}f=(yb()|0)%(b|0)|0;vr(h,b);k=c[l>>2]|0;if(e){Rr(f,a,b,k)}else{ur(f,a,b,k,h)}k=(b|0)>0;if(k){o=f;p=0;q=0;while(1){r=c[(c[l>>2]|0)+(p<<2)>>2]|0;c[j+(p<<2)>>2]=r;s=(r|0)>(q|0);t=s?p:o;u=p+1|0;if((u|0)<(b|0)){o=t;p=u;q=s?r:q}else{v=t;break}}}else{v=f}a:do{if((d|0)>1){if(e){f=v;q=1;while(1){p=l+(q<<2)|0;Rr(f,a,b,c[p>>2]|0);if(k){o=f;t=0;r=0;while(1){s=j+(t<<2)|0;u=c[s>>2]|0;w=c[(c[p>>2]|0)+(t<<2)>>2]|0;x=(u|0)<(w|0)?u:w;c[s>>2]=x;s=(x|0)>(r|0);w=s?t:o;u=t+1|0;if((u|0)<(b|0)){o=w;t=u;r=s?x:r}else{y=w;break}}}else{y=f}r=q+1|0;if((r|0)<(d|0)){f=y;q=r}else{break a}}}if(k){z=v;A=1}else{q=1;while(1){ur(v,a,b,c[l+(q<<2)>>2]|0,h);q=q+1|0;if((q|0)>=(d|0)){break a}}}while(1){q=l+(A<<2)|0;ur(z,a,b,c[q>>2]|0,h);f=z;r=0;t=0;while(1){o=j+(r<<2)|0;p=c[o>>2]|0;w=c[(c[q>>2]|0)+(r<<2)>>2]|0;x=(p|0)<(w|0)?p:w;c[o>>2]=x;o=(x|0)>(t|0);B=o?r:f;w=r+1|0;if((w|0)<(b|0)){f=B;r=w;t=o?x:t}else{break}}t=A+1|0;if((t|0)<(d|0)){z=B;A=t}else{break}}}}while(0);eF(m);if(!e){i=g;return}Es(a,b,n);i=g;return}function Yr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0,h=0,i=0,j=0.0,k=0,l=0;if((d|0)<=0){return}e=(b|0)>0;f=+(b|0);g=0;do{do{if(e){h=c[a+(g<<2)>>2]|0;i=0;j=0.0;do{j=j+ +(c[h+(i<<2)>>2]|0);i=i+1|0;}while((i|0)<(b|0));if(!e){break}i=~~(j/f);h=a+(g<<2)|0;k=0;do{l=(c[h>>2]|0)+(k<<2)|0;c[l>>2]=(c[l>>2]|0)-i;k=k+1|0;}while((k|0)<(b|0))}}while(0);g=g+1|0;}while((g|0)<(d|0));return}function Zr(){c[43746]=~~+T(+((c[44272]|0)+4|0));return}function _r(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a>>3]- +h[b>>3];d=+h[a+8>>3]- +h[b+8>>3];return+(c*c+d*d)}function $r(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];h[a>>3]=+h[b>>3]- +h[d>>3];h[a+8>>3]=+h[b+8>>3]- +h[d+8>>3];i=e;return}function as(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];h[a>>3]=+h[b>>3]+ +h[d>>3];h[a+8>>3]=+h[b+8>>3]+ +h[d+8>>3];i=e;return}function bs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0;e=i;f=a;a=i;i=i+16|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];g=+h[b+8>>3];j=+h[b>>3];i=e;return+((+h[a+8>>3]-g)*(+h[d>>3]-j)-(+h[d+8>>3]-g)*(+h[a>>3]-j))}function cs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0;e=i;f=a;a=i;i=i+16|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];g=+h[b+8>>3];j=+h[b>>3];i=e;return(+h[a+8>>3]-g)*(+h[d>>3]-j)-(+h[d+8>>3]-g)*(+h[a>>3]-j)>0.0|0}function ds(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0;g=i;j=a;a=i;i=i+16|0;c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];j=b;b=i;i=i+16|0;c[b>>2]=c[j>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];c[b+12>>2]=c[j+12>>2];j=d;d=i;i=i+16|0;c[d>>2]=c[j>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];c[d+12>>2]=c[j+12>>2];j=e;e=i;i=i+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];k=+h[a>>3];l=+h[e+8>>3];m=+h[d+8>>3];n=k*(l-m);o=+h[b>>3];p=+h[e>>3];q=+h[b+8>>3];r=+h[a+8>>3];s=q-r;t=+h[d>>3];u=t*(r-q)+(n+o*(m-l)+p*s);if(u==0.0){v=0;i=g;return v|0}w=(p*(m-r)+(n+t*(r-l)))/u;l=(-0.0-(t*s+(k*(m-q)+o*(r-m))))/u;h[f>>3]=k+(o-k)*w;h[f+8>>3]=r+w*s;do{if(w>=0.0&w<=1.0){if(l>=0.0&l<=1.0){v=1}else{break}i=g;return v|0}}while(0);v=0;i=g;return v|0}function es(a,b,d){a=a|0;b=b|0;d=+d;var e=0.0,f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c[a+20>>2]=b;fu(b);e=+h[b+8>>3]+d;h[a+24>>3]=e;f=c[53556]|0;d=+(f|0);g=(e- +h[8])/+h[3711]*d;do{if(g<0.0){i=0}else{if(g<d){i=~~g;break}else{i=f-1|0;break}}}while(0);if((i|0)<(c[53554]|0)){c[53554]=i}f=b|0;b=(c[53558]|0)+(i*40|0)+32|0;i=c[b>>2]|0;a:do{if((i|0)==0){j=b;k=0}else{l=b;m=i;while(1){g=+h[m+24>>3];if(e<=g){if(e!=g){j=l;k=m;break a}if(+h[f>>3]<=+h[c[m+20>>2]>>3]){j=l;k=m;break a}}n=m+32|0;o=c[n>>2]|0;if((o|0)==0){j=n;k=0;break}else{l=n;m=o}}}}while(0);c[a+32>>2]=k;c[j>>2]=a;c[53560]=(c[53560]|0)+1;return}function fs(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0,i=0;b=a+20|0;if((c[b>>2]|0)==0){return}d=c[53556]|0;e=+(d|0);f=(+h[a+24>>3]- +h[8])/+h[3711]*e;do{if(f<0.0){g=0}else{if(f<e){g=~~f;break}else{g=d-1|0;break}}}while(0);if((g|0)<(c[53554]|0)){c[53554]=g}d=(c[53558]|0)+(g*40|0)|0;do{i=d+32|0;d=c[i>>2]|0;}while((d|0)!=(a|0));c[i>>2]=c[a+32>>2];c[53560]=(c[53560]|0)-1;eu(c[b>>2]|0);c[b>>2]=0;return}function gs(){return(c[53560]|0)==0|0}function hs(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0.0;b=c[53554]|0;d=c[53558]|0;e=c[d+(b*40|0)+32>>2]|0;if((e|0)==0){f=b;while(1){b=f+1|0;c[53554]=b;g=c[d+(b*40|0)+32>>2]|0;if((g|0)==0){f=b}else{i=g;break}}}else{i=e}j=+h[i+24>>3];h[a>>3]=+h[c[i+20>>2]>>3];h[a+8>>3]=j;return}function is(){var a=0,b=0;a=(c[53558]|0)+((c[53554]|0)*40|0)+32|0;b=c[a>>2]|0;c[a>>2]=c[b+32>>2];c[53560]=(c[53560]|0)-1;return b|0}function js(){eF(c[53558]|0);c[53558]=0;return}function ks(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;c[53560]=0;c[53554]=0;a=c[43746]|0;b=a<<2;c[53556]=b;d=c[53558]|0;if((d|0)==0){e=kk(a*160|0)|0;c[53558]=e;f=c[53556]|0;g=e}else{f=b;g=d}if((f|0)>0){h=0;i=g}else{return}while(1){c[i+(h*40|0)+32>>2]=0;g=h+1|0;if((g|0)>=(c[53556]|0)){break}h=g;i=c[53558]|0}return}function ls(){nt(178816,40);eF(c[53836]|0);c[53836]=0;return}function ms(){var b=0,d=0,e=0,f=0,g=0,h=0;nt(178816,40);b=c[43746]|0;d=b<<1;c[53834]=d;e=c[53836]|0;if((e|0)==0){f=kk(b<<3)|0;c[53836]=f;g=c[53834]|0;h=f}else{g=d;h=e}a:do{if((g|0)>0){e=0;d=h;while(1){c[d+(e<<2)>>2]=0;f=e+1|0;if((f|0)>=(c[53834]|0)){break a}e=f;d=c[53836]|0}}}while(0);h=ot(178816)|0;c[h+8>>2]=0;a[h+16|0]=0;c[h+32>>2]=0;c[h+20>>2]=0;c[h+12>>2]=0;c[53832]=h;h=ot(178816)|0;c[h+8>>2]=0;a[h+16|0]=0;c[h+32>>2]=0;c[h+20>>2]=0;c[h+12>>2]=0;c[53830]=h;c[c[53832]>>2]=0;c[(c[53832]|0)+4>>2]=c[53830];c[c[53830]>>2]=c[53832];c[(c[53830]|0)+4>>2]=0;c[c[53836]>>2]=c[53832];c[(c[53836]|0)+((c[53834]|0)-1<<2)>>2]=c[53830];return}function ns(b,d){b=b|0;d=d|0;var e=0;e=ot(178816)|0;c[e+8>>2]=b;a[e+16|0]=d;c[e+32>>2]=0;c[e+20>>2]=0;c[e+12>>2]=0;return e|0}function os(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0;e=c[b+8>>2]|0;f=c[d+8>>2]|0;if((e|0)==0|(f|0)==0){g=0;return g|0}i=c[e+36>>2]|0;j=c[f+36>>2]|0;if((i|0)==(j|0)){g=0;return g|0}k=+h[e>>3];l=+h[f+8>>3];m=+h[e+8>>3];n=+h[f>>3];o=k*l-m*n;if(o>-1.0e-10&o<1.0e-10){g=0;return g|0}p=+h[e+16>>3];q=+h[f+16>>3];r=(l*p-m*q)/o;m=(k*q-n*p)/o;o=+h[i+8>>3];p=+h[j+8>>3];do{if(o<p){s=b;t=i}else{if(o==p){if(+h[i>>3]<+h[j>>3]){s=b;t=i;break}}s=d;t=j}}while(0);j=a[s+16|0]|0;do{if(r<+h[t>>3]){if(j<<24>>24==1){g=0}else{break}return g|0}else{if(j<<24>>24==0){g=0}else{break}return g|0}}while(0);j=bu()|0;c[j+20>>2]=0;h[j>>3]=r;h[j+8>>3]=m;g=j;return g|0}function ps(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0,v=0.0;e=c[b+8>>2]|0;f=c[e+36>>2]|0;g=+h[d>>3];i=+h[f>>3];j=g>i;k=a[b+16|0]|0;do{if(j){if(k<<24>>24==0){l=1}else{break}return l|0}else{if(k<<24>>24==1){l=0}else{break}return l|0}}while(0);m=+h[e>>3];a:do{if(m==1.0){n=+h[d+8>>3];o=n- +h[f+8>>3];p=g-i;q=+h[e+8>>3];b=q<0.0;do{if((b&1&(j&1^1)|j&q>=0.0&1|0)==0){r=g+n*q>+h[e+16>>3];if(b){if(r){s=r&1^1;break a}else{break}}else{if(r){break}else{s=r&1;break a}}}else{r=o>=q*p;if(r){s=r&1;break a}}}while(0);n=i- +h[c[e+32>>2]>>3];r=(p*p-o*o)*q<o*n*(q*q+(p*2.0/n+1.0))|0;if(!b){s=r;break}s=r^1}else{n=+h[e+16>>3]-m*g;t=+h[d+8>>3]-n;u=g-i;v=n- +h[f+8>>3];s=t*t>u*u+v*v|0}}while(0);if(k<<24>>24==0){l=s;return l|0}l=(s|0)==0|0;return l|0}function qs(a,b){a=a|0;b=b|0;var d=0;c[b>>2]=a;d=a+4|0;c[b+4>>2]=c[d>>2];c[c[d>>2]>>2]=b;c[d>>2]=b;return}function rs(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=c[53834]|0;d=~~((+h[a>>3]- +h[10])/+h[3712]*+(b|0));e=(d|0)<0?0:d;d=(e|0)<(b|0)?e:b-1|0;do{if((d|0)>-1){e=c[53836]|0;f=e+(d<<2)|0;g=c[f>>2]|0;if((g|0)==0){i=1;j=6;break}if((c[g+8>>2]|0)!=-2){k=g;l=b;m=e;break}c[f>>2]=0;f=g+12|0;e=(c[f>>2]|0)-1|0;c[f>>2]=e;if((e|0)!=0){i=1;j=6;break}pt(g,178816);i=1;j=6}else{i=1;j=6}}while(0);if((j|0)==6){a:while(1){j=0;b=d-i|0;g=c[53834]|0;do{if((b|0)>-1&(g|0)>(b|0)){e=c[53836]|0;f=e+(b<<2)|0;n=c[f>>2]|0;if((n|0)==0){break}if((c[n+8>>2]|0)!=-2){o=n;p=g;q=e;break a}c[f>>2]=0;f=n+12|0;e=(c[f>>2]|0)-1|0;c[f>>2]=e;if((e|0)!=0){break}pt(n,178816)}}while(0);g=i+d|0;b=c[53834]|0;do{if((g|0)>-1&(b|0)>(g|0)){n=c[53836]|0;e=n+(g<<2)|0;f=c[e>>2]|0;if((f|0)==0){break}if((c[f+8>>2]|0)!=-2){o=f;p=b;q=n;break a}c[e>>2]=0;e=f+12|0;n=(c[e>>2]|0)-1|0;c[e>>2]=n;if((n|0)!=0){break}pt(f,178816)}}while(0);i=i+1|0;j=6}c[43680]=(c[43680]|0)+i;k=o;l=p;m=q}c[44270]=(c[44270]|0)+1;q=c[53832]|0;p=c[53830]|0;b:do{if((k|0)==(q|0)){j=21}else{if((k|0)==(p|0)){r=k}else{if((ps(k,a)|0)==0){r=k}else{j=21;break}}while(1){o=c[r>>2]|0;if((o|0)==(q|0)){s=q;break b}if((ps(o,a)|0)==0){r=o}else{s=o;break}}}}while(0);if((j|0)==21){j=k;do{j=c[j+4>>2]|0;if((j|0)==(p|0)){break}}while((ps(j,a)|0)!=0);s=c[j>>2]|0}if((d|0)<=0){return s|0}if((d|0)>=(l-1|0)){return s|0}l=c[m+(d<<2)>>2]|0;if((l|0)==0){t=m}else{m=l+12|0;c[m>>2]=(c[m>>2]|0)-1;t=c[53836]|0}c[t+(d<<2)>>2]=s;t=(c[(c[53836]|0)+(d<<2)>>2]|0)+12|0;c[t>>2]=(c[t>>2]|0)+1;return s|0}function ss(a){a=a|0;var b=0,d=0;b=a+4|0;d=a|0;c[(c[d>>2]|0)+4>>2]=c[b>>2];c[c[b>>2]>>2]=c[d>>2];c[a+8>>2]=-2;return}function ts(a){a=a|0;return c[a+4>>2]|0}function us(a){a=a|0;return c[a>>2]|0}function vs(b){b=b|0;var d=0,e=0;d=c[b+8>>2]|0;if((d|0)==0){e=212936}else{e=(a[b+16|0]|0)==0?d+32|0:d+36|0}return c[e>>2]|0}function ws(b){b=b|0;var d=0,e=0;d=c[b+8>>2]|0;if((d|0)==0){e=212936}else{e=(a[b+16|0]|0)==0?d+36|0:d+32|0}return c[e>>2]|0}function xs(){nt(176456,24);return}function ys(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;e=(c[44274]|0)+((c[a+16>>2]|0)*96|0)+88|0;f=c[e>>2]|0;a:do{if((f|0)!=0){g=+h[f+8>>3];i=+h[f+16>>3];if(g==b&i==d){return}j=+h[a>>3];k=b-j;l=+h[a+8>>3];m=d-l;n=g-j;g=i-l;o=k<0.0;do{if(o){if(n>=0.0){break}i=g/n;p=m/k;if(p<i){break a}if(p>i){break}q=k>n?-1:1;r=21}else{if(n<0.0){break a}s=n>0.0;if(k>0.0){if(!s){q=g>0.0?-1:1;r=21;break}i=g/n;p=m/k;if(p<i){break a}if(p>i){break}q=k<n?-1:1;r=21;break}else{if(s){q=m>0.0?1:-1;r=21;break}if(m<g){q=g>0.0?-1:1;r=21;break}else{q=m>0.0?1:-1;r=21;break}}}}while(0);if((r|0)==21){if((q|0)<0){break}}s=f|0;t=c[s>>2]|0;b:do{if((t|0)==0){u=s;v=0}else{w=s;x=t;while(1){g=+h[x+8>>3];n=+h[x+16>>3];if(g==b&n==d){break}i=g-j;g=n-l;do{if(o){if(i>=0.0){break}n=g/i;p=m/k;if(p<n){u=w;v=x;break b}if(p>n){break}y=k>i?-1:1;r=41}else{if(i<0.0){u=w;v=x;break b}z=i>0.0;if(k>0.0){if(!z){y=g>0.0?-1:1;r=41;break}n=g/i;p=m/k;if(p<n){u=w;v=x;break b}if(p>n){break}y=k<i?-1:1;r=41;break}else{if(z){y=m>0.0?1:-1;r=41;break}if(m<g){y=g>0.0?-1:1;r=41;break}else{y=m>0.0?1:-1;r=41;break}}}}while(0);if((r|0)==41){r=0;if((y|0)<=0){u=w;v=x;break b}}z=x|0;A=c[z>>2]|0;if((A|0)==0){u=z;v=0;break b}else{w=z;x=A}}return}}while(0);o=ot(176456)|0;h[o+8>>3]=b;h[o+16>>3]=d;c[u>>2]=o;c[o>>2]=v;return}}while(0);v=ot(176456)|0;h[v+8>>3]=b;h[v+16>>3]=d;c[v>>2]=f;c[e>>2]=v;return}function zs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;b=c[a+(d<<4)>>2]|0;if((b|0)<=1){f=0;return f|0}g=c[a+(d<<4)+4>>2]|0;d=0;a=1;while(1){h=((c[e+(c[g+(a<<2)>>2]<<2)>>2]|0)>0)+d|0;i=a+1|0;if((i|0)<(b|0)){d=h;a=i}else{f=h;break}}return f|0}function As(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+(b<<4)|0;if((c[e>>2]|0)<=1){return}f=a+(b<<4)+4|0;b=1;do{c[d+(c[(c[f>>2]|0)+(b<<2)>>2]<<2)>>2]=1;b=b+1|0;}while((b|0)<(c[e>>2]|0));return}function Bs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+(b<<4)|0;if((c[e>>2]|0)<=1){return}f=a+(b<<4)+4|0;b=1;do{c[d+(c[(c[f>>2]|0)+(b<<2)>>2]<<2)>>2]=0;b=b+1|0;}while((b|0)<(c[e>>2]|0));return}function Cs(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=a+8|0;e=c[d>>2]|0;Ds(a,b);f=b<<2;g=kk(da(f,b)|0)|0;h=kk(f)|0;f=(b|0)>0;if(f){i=0;while(1){c[h+(i<<2)>>2]=g+((da(i,b)|0)<<2);j=i+1|0;if((j|0)<(b|0)){i=j}else{k=0;break}}do{Rr(k,a,b,c[h+(k<<2)>>2]|0);k=k+1|0;}while((k|0)<(b|0))}eF(c[d>>2]|0);c[d>>2]=0;if((e|0)!=0&f){l=e;m=0}else{return h|0}while(1){c[a+(m<<4)+8>>2]=l;e=m+1|0;if((e|0)<(b|0)){l=l+(c[a+(m<<4)>>2]<<2)|0;m=e}else{break}}return h|0}function Ds(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=kk(b<<2)|0;e=d;f=(b|0)>0;if(f){h=0;i=0}else{kk(0)|0;eF(d);return}do{h=(c[a+(i<<4)>>2]|0)+h|0;i=i+1|0;}while((i|0)<(b|0));i=kk(h<<2)|0;if(!f){eF(d);return}vF(d|0,0,b<<2|0)|0;f=i;i=0;while(1){c[a+(i<<4)+8>>2]=f;h=a+(i<<4)|0;j=c[h>>2]|0;do{if((j|0)>1){k=a+(i<<4)+4|0;l=1;do{c[e+(c[(c[k>>2]|0)+(l<<2)>>2]<<2)>>2]=1;l=l+1|0;m=c[h>>2]|0;}while((l|0)<(m|0));l=m-1|0;if((m|0)<2){n=m;break}k=a+(i<<4)+4|0;o=m-2|0;p=1;while(1){q=c[(c[k>>2]|0)+(p<<2)>>2]|0;r=c[a+(q<<4)>>2]|0;if((r|0)>1){s=c[a+(q<<4)+4>>2]|0;q=0;t=1;do{q=((c[e+(c[s+(t<<2)>>2]<<2)>>2]|0)>0)+q|0;t=t+1|0;}while((t|0)<(r|0));u=q<<1}else{u=0}g[f+(p<<2)>>2]=+(o+r-u|0);if((p|0)<(l|0)){p=p+1|0}else{break}}p=c[h>>2]|0;if((p|0)<=1){n=p;break}p=a+(i<<4)+4|0;l=1;while(1){c[e+(c[(c[p>>2]|0)+(l<<2)>>2]<<2)>>2]=0;o=l+1|0;k=c[h>>2]|0;if((o|0)<(k|0)){l=o}else{n=k;break}}}else{n=j}}while(0);j=i+1|0;if((j|0)<(b|0)){f=f+(n<<2)|0;i=j}else{break}}eF(d);return}function Es(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=a+8|0;eF(c[e>>2]|0);c[e>>2]=0;if((d|0)!=0&(b|0)>0){f=d;g=0}else{return}while(1){c[a+(g<<4)+8>>2]=f;d=g+1|0;if((d|0)<(b|0)){f=f+(c[a+(g<<4)>>2]<<2)|0;g=d}else{break}}return}function Fs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0.0,j=0.0,k=0,l=0.0,m=0.0;if((b|0)>0){f=0.0;g=0}else{i=0.0;j=+T(i);return+j}while(1){k=c[a+(g<<2)>>2]|0;l=+h[k+(d<<3)>>3]- +h[k+(e<<3)>>3];m=f+l*l;k=g+1|0;if((k|0)<(b|0)){f=m;g=k}else{i=m;break}}j=+T(i);return+j}function Gs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0.0,A=0,B=0,C=0;f=e+1|0;g=d;while(1){if((g|0)>=(e|0)){i=21;break}d=yb()|0;j=g+1|0;k=b+(((((yb()|0)<<16|d)>>>0)%((f-g|0)>>>0)|0)+g<<2)|0;d=c[k>>2]|0;l=b+(g<<2)|0;c[k>>2]=c[l>>2];c[l>>2]=d;m=+h[a+(d<<3)>>3];if((j|0)<(e|0)){k=e;n=j;while(1){a:do{if((n|0)<(k|0)){o=n;while(1){p=o+1|0;if(+h[a+(c[b+(o<<2)>>2]<<3)>>3]>m){q=o;break a}if((p|0)<(k|0)){o=p}else{q=p;break}}}else{q=n}}while(0);b:do{if((q|0)<(k|0)){o=k;while(1){r=b+(o<<2)|0;s=c[r>>2]|0;t=o-1|0;if(+h[a+(s<<3)>>3]<=m){break}if((q|0)<(t|0)){o=t}else{u=q;v=t;break b}}o=b+(q<<2)|0;p=c[o>>2]|0;c[o>>2]=s;c[r>>2]=p;u=q+1|0;v=t}else{u=q;v=k}}while(0);if((u|0)<(v|0)){k=v;n=u}else{w=u;break}}}else{w=j}n=((+h[a+(c[b+(w<<2)>>2]<<3)>>3]>m)<<31>>31)+w|0;k=b+(n<<2)|0;c[l>>2]=c[k>>2];c[k>>2]=d;k=n-1|0;Gs(a,b,g,k);p=n+1|0;Gs(a,b,p,e);do{if((k|0)>(g|0)){n=1;o=g;x=+h[a+(c[l>>2]<<3)>>3];while(1){y=o+1|0;z=+h[a+(c[b+(y<<2)>>2]<<3)>>3];A=x>z?0:n;B=(A|0)==0;if((y|0)>=(k|0)|B){break}else{n=A;o=y;x=z}}if(!B){break}Gs(a,b,g,k)}}while(0);if((p|0)>=(e|0)){i=21;break}k=1;l=p;m=+h[a+(c[b+(p<<2)>>2]<<3)>>3];while(1){d=l+1|0;x=+h[a+(c[b+(d<<2)>>2]<<3)>>3];j=m>x?0:k;C=(j|0)==0;if((d|0)>=(e|0)|C){break}else{k=j;l=d;m=x}}if(C){g=p}else{i=21;break}}if((i|0)==21){return}}function Hs(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,na=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,xa=0,ya=0,za=0,Aa=0.0,Ba=0,Ca=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0.0,Pa=0,Qa=0.0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0.0,Xa=0.0,Ya=0.0,Za=0.0,_a=0.0,$a=0.0,ab=0,bb=0,cb=0,db=0,eb=0.0,fb=0.0,gb=0.0,hb=0,ib=0.0,jb=0,kb=0,lb=0,mb=0,nb=0.0,ob=0.0,pb=0.0,qb=0.0,rb=0,sb=0,tb=0.0,ub=0.0,vb=0.0,wb=0,xb=0.0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0.0,Eb=0.0,Fb=0,Gb=0.0,Hb=0.0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0.0,Nb=0.0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0.0,Ub=0.0,Vb=0,Wb=0.0,Xb=0.0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0.0,cc=0.0,dc=0,ec=0,fc=0,gc=0,hc=0.0,ic=0.0,jc=0,kc=0.0,lc=0.0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0.0,tc=0.0,uc=0,vc=0.0,wc=0.0,xc=0,yc=0,zc=0,Ac=0.0,Bc=0.0,Cc=0.0,Dc=0.0,Ec=0,Fc=0,Gc=0.0,Hc=0.0,Ic=0.0,Jc=0.0,Kc=0,Lc=0,Mc=0.0,Nc=0.0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0.0,Uc=0.0,Vc=0,Wc=0,Xc=0,Yc=0.0,Zc=0.0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0.0,zd=0.0,Ad=0,Bd=0.0,Cd=0.0,Dd=0.0,Ed=0.0,Fd=0.0,Gd=0.0,Hd=0.0,Id=0.0;e=i;i=i+32|0;f=1;g=0;j=i;i=i+168|0;c[j>>2]=0;while(1)switch(f|0){case 1:k=e|0;l=e+16|0;m=e+24|0;n=ma(54,b*40|0|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;p=n;q=(b|0)>0;if(q){r=0;s=0;f=3;break}else{f=2;break};case 2:t=ma(54,0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;w=0;x=t;y=t;f=8;break;case 3:z=(c[(c[a+(s<<2)>>2]|0)+4>>2]|0)+r|0;t=s+1|0;if((t|0)<(b|0)){r=z;s=t;f=3;break}else{f=4;break};case 4:A=ma(54,z*24|0|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;B=A;if(q){C=0;D=0;f=5;break}else{w=z;x=A;y=B;f=8;break};case 5:E=p+(D*40|0)|0;c[E>>2]=B+(C*24|0);F=a+(D<<2)|0;t=c[F>>2]|0;if((c[t+4>>2]|0)>0){G=C;H=0;I=-1.7976931348623157e+308;J=-1.7976931348623157e+308;K=1.7976931348623157e+308;L=1.7976931348623157e+308;M=t;f=6;break}else{N=C;O=-1.7976931348623157e+308;P=-1.7976931348623157e+308;Q=1.7976931348623157e+308;R=1.7976931348623157e+308;f=7;break};case 6:t=c[M>>2]|0;S=+h[t+(H<<4)>>3];T=+h[t+(H<<4)+8>>3];U=L<S?L:S;V=K<T?K:T;W=J>S?J:S;X=I>T?I:T;h[B+(G*24|0)>>3]=S;h[B+(G*24|0)+8>>3]=T;c[B+(G*24|0)+16>>2]=E;c[B+(G*24|0)+20>>2]=0;t=G+1|0;Y=H+1|0;Z=c[F>>2]|0;if((Y|0)<(c[Z+4>>2]|0)){G=t;H=Y;I=X;J=W;K=V;L=U;M=Z;f=6;break}else{N=t;O=X;P=W;Q=V;R=U;f=7;break};case 7:c[p+(D*40|0)+4>>2]=B+((N-1|0)*24|0);h[p+(D*40|0)+8>>3]=R;h[p+(D*40|0)+16>>3]=Q;h[p+(D*40|0)+24>>3]=P;h[p+(D*40|0)+32>>3]=O;t=D+1|0;if((t|0)<(b|0)){C=N;D=t;f=5;break}else{w=z;x=A;y=B;f=8;break};case 8:_=BF(178232,f,j)|0;f=209;break;case 209:if((_|0)==0){f=10;break}else{f=9;break};case 9:ka(150,n|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;ka(150,x|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;$=0;f=208;break;case 10:aa=ma(54,w<<2|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;ba=aa;if((w|0)>0){ca=0;f=11;break}else{f=189;break};case 11:c[ba+(ca<<2)>>2]=y+(ca*24|0);t=ca+1|0;if((t|0)<(w|0)){ca=t;f=11;break}else{f=12;break};case 12:Da(40,aa|0,w|0,4,34);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;ea=0;fa=0;ga=0;ha=0;f=13;break;case 13:ia=ba+(ha<<2)|0;ja=c[ia>>2]|0;na=c[ja+16>>2]|0;if((ja|0)==(c[na>>2]|0)){f=14;break}else{f=15;break};case 14:qa=c[na+4>>2]|0;f=16;break;case 15:qa=ja-24|0;f=16;break;case 16:ra=ja|0;sa=ja+8|0;ta=qa;ua=1;va=ea;xa=fa;ya=ga;za=qa;f=17;break;case 17:U=+h[ra>>3]- +h[ta>>3];if(U!=0.0){Aa=U;f=19;break}else{f=18;break};case 18:U=+h[sa>>3]- +h[ta+8>>3];if(U==0.0){Ba=ya;Ca=xa;Ea=va;f=181;break}else{Aa=U;f=19;break};case 19:if(Aa>0.0){f=172;break}else{f=20;break};case 20:if((va|0)>0){f=21;break}else{f=168;break};case 21:Fa=za|0;Ga=za+8|0;Ha=za+16|0;Ia=za+24|0;Ja=za+24|0;Ka=0;La=ya;f=22;break;case 22:Ma=c[La>>2]|0;Na=Ma|0;Oa=+h[Na>>3];Pa=Ma+8|0;Qa=+h[Pa>>3];Ra=Ma+16|0;Sa=c[Ra>>2]|0;Ta=(c[Sa+4>>2]|0)==(Ma|0);if(Ta){f=23;break}else{f=24;break};case 23:t=c[Sa>>2]|0;Ua=t;Va=t|0;f=25;break;case 24:Ua=Ma+24|0;Va=Ma+24|0;f=25;break;case 25:Wa=+h[Va>>3]-Oa;Xa=+h[Ua+8>>3]-Qa;Ya=+h[Fa>>3];Za=Ya-Oa;_a=+h[Ga>>3];$a=_a-Qa;ab=c[Ha>>2]|0;bb=(c[ab+4>>2]|0)==(za|0);if(bb){f=26;break}else{cb=Ia;db=Ja;f=27;break};case 26:t=c[ab>>2]|0;cb=t;db=t|0;f=27;break;case 27:eb=+h[db>>3]-Oa;fb=+h[cb+8>>3]-Qa;gb=Wa*$a-Xa*Za;if(gb==0.0){hb=0;f=29;break}else{f=28;break};case 28:hb=gb>0.0?1:-1;f=29;break;case 29:ib=Wa*fb-Xa*eb;if(ib==0.0){jb=0;f=31;break}else{f=30;break};case 30:jb=ib>0.0?1:-1;f=31;break;case 31:kb=da(jb,hb)|0;if((kb|0)>0){f=167;break}else{f=32;break};case 32:if((kb|0)<0){f=33;break}else{f=63;break};case 33:if(bb){f=34;break}else{lb=Ia;mb=Ja;f=35;break};case 34:t=c[ab>>2]|0;lb=t;mb=t|0;f=35;break;case 35:nb=+h[mb>>3]-Ya;ob=+h[lb+8>>3]-_a;pb=Oa-Ya;qb=Qa-_a;if(Ta){f=36;break}else{f=37;break};case 36:t=c[Sa>>2]|0;rb=t;sb=t|0;f=38;break;case 37:rb=Ma+24|0;sb=Ma+24|0;f=38;break;case 38:tb=+h[sb>>3]-Ya;ub=+h[rb+8>>3]-_a;vb=qb*nb-pb*ob;if(vb==0.0){wb=0;f=40;break}else{f=39;break};case 39:wb=vb>0.0?1:-1;f=40;break;case 40:xb=nb*ub-ob*tb;if(xb==0.0){yb=0;f=42;break}else{f=41;break};case 41:yb=xb>0.0?1:-1;f=42;break;case 42:zb=da(yb,wb)|0;if((zb|0)>0){f=167;break}else{f=43;break};case 43:if((zb|0)<0){Ab=3;f=62;break}else{f=44;break};case 44:Bb=(wb|0)>-1?wb:-wb|0;if(bb){f=45;break}else{Cb=Ia;f=46;break};case 45:Cb=c[ab>>2]|0;f=46;break;case 46:Db=+h[Cb>>3];Eb=+h[Cb+8>>3];if((Bb|0)==0){Fb=Ma;f=50;break}else{f=47;break};case 47:if(Ta){f=48;break}else{f=49;break};case 48:Fb=c[Sa>>2]|0;f=50;break;case 49:Fb=Ma+24|0;f=50;break;case 50:Gb=+h[Fb>>3];Hb=+h[Fb+8>>3];Ib=Ya==Gb;if(Ya==Db){f=51;break}else{f=57;break};case 51:if(Ib){f=52;break}else{Ab=0;f=62;break};case 52:if(_a==Hb|Hb==Eb){Jb=1;f=56;break}else{f=53;break};case 53:if(_a<Hb){f=54;break}else{f=55;break};case 54:Jb=Hb<Eb;f=56;break;case 55:Jb=Eb<Hb;f=56;break;case 56:Ab=Jb&1;f=62;break;case 57:if(Ib|Gb==Db){Ab=0;f=62;break}else{f=58;break};case 58:if(Ya<Gb){f=59;break}else{f=60;break};case 59:Kb=Gb<Db;f=61;break;case 60:Kb=Db<Gb;f=61;break;case 61:Ab=Kb?1:-1;f=62;break;case 62:t=oa(4,Ma|0,za|0,l|0,m|0,Ab|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((t|0)==0){f=167;break}else{f=148;break};case 63:if((hb|0)==(jb|0)){f=64;break}else{f=130;break};case 64:if(Ta){f=65;break}else{f=66;break};case 65:Lb=c[Sa>>2]|0;f=67;break;case 66:Lb=Ma+24|0;f=67;break;case 67:Mb=+h[Lb>>3];Nb=+h[Lb+8>>3];Ob=Oa==Ya;if(Oa==Mb){f=68;break}else{f=74;break};case 68:if(Ob){f=69;break}else{Pb=0;f=79;break};case 69:if(Qa==_a|_a==Nb){Qb=1;f=73;break}else{f=70;break};case 70:if(Qa<_a){f=71;break}else{f=72;break};case 71:Qb=_a<Nb;f=73;break;case 72:Qb=Nb<_a;f=73;break;case 73:Pb=Qb&1;f=79;break;case 74:if(Ob|Ya==Mb){Pb=0;f=79;break}else{f=75;break};case 75:if(Oa<Ya){f=76;break}else{f=77;break};case 76:Rb=Ya<Mb;f=78;break;case 77:Rb=Mb<Ya;f=78;break;case 78:Pb=Rb?1:-1;f=79;break;case 79:if(Ta){f=80;break}else{f=81;break};case 80:Sb=c[Sa>>2]|0;f=82;break;case 81:Sb=Ma+24|0;f=82;break;case 82:Tb=+h[Sb>>3];Ub=+h[Sb+8>>3];if(bb){f=83;break}else{Vb=Ia;f=84;break};case 83:Vb=c[ab>>2]|0;f=84;break;case 84:Wb=+h[Vb>>3];Xb=+h[Vb+8>>3];Yb=Oa==Wb;if(Oa==Tb){f=85;break}else{f=91;break};case 85:if(Yb){f=86;break}else{Zb=0;f=96;break};case 86:if(Qa==Xb|Xb==Ub){_b=1;f=90;break}else{f=87;break};case 87:if(Qa<Xb){f=88;break}else{f=89;break};case 88:_b=Xb<Ub;f=90;break;case 89:_b=Ub<Xb;f=90;break;case 90:Zb=_b&1;f=96;break;case 91:if(Yb|Wb==Tb){Zb=0;f=96;break}else{f=92;break};case 92:if(Oa<Wb){f=93;break}else{f=94;break};case 93:$b=Wb<Tb;f=95;break;case 94:$b=Tb<Wb;f=95;break;case 95:Zb=$b?1:-1;f=96;break;case 96:if((Pb|0)>(Zb|0)){f=97;break}else{f=112;break};case 97:if(Ta){f=98;break}else{f=99;break};case 98:ac=c[Sa>>2]|0;f=100;break;case 99:ac=Ma+24|0;f=100;break;case 100:bc=+h[ac>>3];cc=+h[ac+8>>3];if(Oa==bc){f=101;break}else{f=107;break};case 101:if(Ob){f=102;break}else{dc=0;f=129;break};case 102:if(Qa==_a|_a==cc){ec=1;f=106;break}else{f=103;break};case 103:if(Qa<_a){f=104;break}else{f=105;break};case 104:ec=_a<cc;f=106;break;case 105:ec=cc<_a;f=106;break;case 106:dc=ec&1;f=129;break;case 107:if(Ob|Ya==bc){dc=0;f=129;break}else{f=108;break};case 108:if(Oa<Ya){f=109;break}else{f=110;break};case 109:fc=Ya<bc;f=111;break;case 110:fc=bc<Ya;f=111;break;case 111:dc=fc?1:-1;f=129;break;case 112:if(Ta){f=113;break}else{f=114;break};case 113:gc=c[Sa>>2]|0;f=115;break;case 114:gc=Ma+24|0;f=115;break;case 115:hc=+h[gc>>3];ic=+h[gc+8>>3];if(bb){f=116;break}else{jc=Ia;f=117;break};case 116:jc=c[ab>>2]|0;f=117;break;case 117:kc=+h[jc>>3];lc=+h[jc+8>>3];mc=Oa==kc;if(Oa==hc){f=118;break}else{f=124;break};case 118:if(mc){f=119;break}else{dc=0;f=129;break};case 119:if(Qa==lc|lc==ic){nc=1;f=123;break}else{f=120;break};case 120:if(Qa<lc){f=121;break}else{f=122;break};case 121:nc=lc<ic;f=123;break;case 122:nc=ic<lc;f=123;break;case 123:dc=nc&1;f=129;break;case 124:if(mc|kc==hc){dc=0;f=129;break}else{f=125;break};case 125:if(Oa<kc){f=126;break}else{f=127;break};case 126:oc=kc<hc;f=128;break;case 127:oc=hc<kc;f=128;break;case 128:dc=oc?1:-1;f=129;break;case 129:pc=dc<<1;f=147;break;case 130:qc=(hb|0)>-1?hb:-hb|0;if(Ta){f=131;break}else{f=132;break};case 131:rc=c[Sa>>2]|0;f=133;break;case 132:rc=Ma+24|0;f=133;break;case 133:sc=+h[rc>>3];tc=+h[rc+8>>3];t=(qc|0)==0;if(t|bb^1){uc=t?za:Ia;f=135;break}else{f=134;break};case 134:uc=c[ab>>2]|0;f=135;break;case 135:vc=+h[uc>>3];wc=+h[uc+8>>3];xc=Oa==vc;if(Oa==sc){f=136;break}else{f=142;break};case 136:if(xc){f=137;break}else{pc=0;f=147;break};case 137:if(Qa==wc|wc==tc){yc=1;f=141;break}else{f=138;break};case 138:if(Qa<wc){f=139;break}else{f=140;break};case 139:yc=wc<tc;f=141;break;case 140:yc=tc<wc;f=141;break;case 141:pc=yc&1;f=147;break;case 142:if(xc|vc==sc){pc=0;f=147;break}else{f=143;break};case 143:if(Oa<vc){f=144;break}else{f=145;break};case 144:zc=vc<sc;f=146;break;case 145:zc=sc<vc;f=146;break;case 146:pc=zc?1:-1;f=147;break;case 147:t=oa(4,Ma|0,za|0,l|0,m|0,pc|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((t|0)==0){f=167;break}else{f=148;break};case 148:Ac=+h[l>>3];Bc=+h[m>>3];Cc=+h[Na>>3];Dc=+h[Pa>>3];Ec=c[Ra>>2]|0;if((c[Ec+4>>2]|0)==(Ma|0)){f=149;break}else{f=150;break};case 149:Fc=c[Ec>>2]|0;f=151;break;case 150:Fc=Ma+24|0;f=151;break;case 151:Gc=+h[Fc>>3];Hc=+h[Fc+8>>3];Ic=+h[Fa>>3];Jc=+h[Ga>>3];Kc=c[Ha>>2]|0;if((c[Kc+4>>2]|0)==(za|0)){f=152;break}else{Lc=Ia;f=153;break};case 152:Lc=c[Kc>>2]|0;f=153;break;case 153:Mc=+h[Lc>>3];Nc=+h[Lc+8>>3];if(Cc!=Gc&Ic!=Mc){f=160;break}else{f=154;break};case 154:if(Cc==Gc){f=155;break}else{f=157;break};case 155:if(Cc==Ac&Dc==Bc){f=157;break}else{f=156;break};case 156:if(Gc==Ac&Hc==Bc){f=157;break}else{f=160;break};case 157:if(Ic==Mc){f=158;break}else{f=167;break};case 158:if(Ic==Ac&Jc==Bc){f=167;break}else{f=159;break};case 159:if(Mc==Ac&Nc==Bc){f=167;break}else{f=160;break};case 160:if((d[213992]|0)>>>0>1>>>0){f=161;break}else{Oc=ya;Pc=va;Qc=1;f=187;break};case 161:Rc=c[o>>2]|0;pa(30,Rc|0,163936,(Sc=i,i=i+16|0,h[Sc>>3]=Ac,h[Sc+8>>3]=Bc,Sc)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=Sc;Tc=+h[Na>>3];Uc=+h[Pa>>3];Vc=c[Ra>>2]|0;if((c[Vc+4>>2]|0)==(Ma|0)){f=162;break}else{f=163;break};case 162:t=c[Vc>>2]|0;Wc=t;Xc=t|0;f=164;break;case 163:Wc=Ma+24|0;Xc=Ma+24|0;f=164;break;case 164:U=+h[Xc>>3];V=+h[Wc+8>>3];pa(30,Rc|0,131784,(Sc=i,i=i+40|0,c[Sc>>2]=1,h[Sc+8>>3]=Tc,h[Sc+16>>3]=Uc,h[Sc+24>>3]=U,h[Sc+32>>3]=V,Sc)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=Sc;Yc=+h[Fa>>3];Zc=+h[Ga>>3];_c=c[Ha>>2]|0;if((c[_c+4>>2]|0)==(za|0)){f=165;break}else{$c=Ia;ad=Ja;f=166;break};case 165:t=c[_c>>2]|0;$c=t;ad=t|0;f=166;break;case 166:V=+h[ad>>3];U=+h[$c+8>>3];pa(30,Rc|0,131784,(Sc=i,i=i+40|0,c[Sc>>2]=2,h[Sc+8>>3]=Yc,h[Sc+16>>3]=Zc,h[Sc+24>>3]=V,h[Sc+32>>3]=U,Sc)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=Sc;Oc=ya;Pc=va;Qc=1;f=187;break;case 167:t=Ka+1|0;if((t|0)<(va|0)){Ka=t;La=c[La+4>>2]|0;f=22;break}else{f=168;break};case 168:bd=ma(54,12)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;cd=bd;if((va|0)==0){f=169;break}else{f=170;break};case 169:c[bd+8>>2]=0;dd=cd;f=171;break;case 170:c[xa+4>>2]=cd;c[bd+8>>2]=xa;dd=ya;f=171;break;case 171:c[bd>>2]=za;c[bd+4>>2]=0;c[za+20>>2]=cd;Ba=dd;Ca=cd;Ea=va+1|0;f=181;break;case 172:ed=za+20|0;fd=c[ed>>2]|0;if((fd|0)==0){f=173;break}else{f=174;break};case 173:pa(16,1,159880,(Sc=i,i=i+1|0,i=i+7&-8,c[Sc>>2]=0,Sc)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=Sc;la(40,178232,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 174:if((va|0)==1){gd=0;hd=0;f=180;break}else{f=175;break};case 175:if((fd|0)==(ya|0)){f=176;break}else{f=177;break};case 176:t=c[ya+4>>2]|0;c[t+8>>2]=0;gd=t;hd=xa;f=180;break;case 177:if((fd|0)==(xa|0)){f=178;break}else{f=179;break};case 178:t=c[xa+8>>2]|0;c[t+4>>2]=0;gd=ya;hd=t;f=180;break;case 179:t=fd+4|0;Z=fd+8|0;c[(c[Z>>2]|0)+4>>2]=c[t>>2];c[(c[t>>2]|0)+8>>2]=c[Z>>2];gd=ya;hd=xa;f=180;break;case 180:ka(150,fd|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[ed>>2]=0;Ba=gd;Ca=hd;Ea=va-1|0;f=181;break;case 181:id=c[ia>>2]|0;jd=c[id+16>>2]|0;if((id|0)==(c[jd+4>>2]|0)){f=182;break}else{f=183;break};case 182:kd=c[jd>>2]|0;f=184;break;case 183:kd=id+24|0;f=184;break;case 184:if((ua|0)<2){f=185;break}else{f=186;break};case 185:ta=kd;ua=ua+1|0;va=Ea;xa=Ca;ya=Ba;za=id;f=17;break;case 186:Z=ha+1|0;if((Z|0)<(w|0)){ea=Ea;fa=Ca;ga=Ba;ha=Z;f=13;break}else{Oc=Ba;Pc=Ea;Qc=0;f=187;break};case 187:if((Pc|0)>0){ld=0;md=Oc;f=188;break}else{f=190;break};case 188:Z=c[md+4>>2]|0;ka(150,md|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;t=ld+1|0;if((t|0)<(Pc|0)){ld=t;md=Z;f=188;break}else{f=190;break};case 189:Da(40,aa|0,w|0,4,34);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;ka(150,aa|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;f=191;break;case 190:ka(150,aa|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((Qc|0)==0){f=191;break}else{nd=Qc;f=207;break};case 191:od=k;if(q){pd=0;f=192;break}else{nd=0;f=207;break};case 192:qd=c[a+(pd<<2)>>2]|0;Z=c[qd>>2]|0;c[od>>2]=c[Z>>2];c[od+4>>2]=c[Z+4>>2];c[od+8>>2]=c[Z+8>>2];c[od+12>>2]=c[Z+12>>2];rd=pd+1|0;if((rd|0)<(b|0)){f=193;break}else{nd=0;f=207;break};case 193:sd=p+(pd*40|0)+8|0;td=p+(pd*40|0)+24|0;ud=p+(pd*40|0)+32|0;vd=p+(pd*40|0)+16|0;wd=rd;f=194;break;case 194:xd=c[a+(wd<<2)>>2]|0;yd=+h[sd>>3];zd=+h[p+(wd*40|0)+24>>3];Ad=yd>zd;Bd=+h[p+(wd*40|0)+8>>3];if(Ad|yd<Bd){f=200;break}else{f=195;break};case 195:Cd=+h[vd>>3];Dd=+h[p+(wd*40|0)+32>>3];if(Cd>Dd){f=200;break}else{f=196;break};case 196:Ed=+h[p+(wd*40|0)+16>>3];if(Cd<Ed){f=200;break}else{f=197;break};case 197:U=+h[td>>3];if(U>zd|U<Bd){f=200;break}else{f=198;break};case 198:U=+h[ud>>3];if(U>Dd|U<Ed){f=200;break}else{f=199;break};case 199:Z=wa(200,xd|0,k|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((Z|0)==0){f=206;break}else{nd=1;f=207;break};case 200:Fd=+h[td>>3];if(Bd>Fd|Bd<yd){f=206;break}else{f=201;break};case 201:Gd=+h[p+(wd*40|0)+16>>3];Hd=+h[ud>>3];if(Gd>Hd){f=206;break}else{f=202;break};case 202:Id=+h[vd>>3];if(Gd<Id){f=206;break}else{f=203;break};case 203:if(zd>Fd|Ad){f=206;break}else{f=204;break};case 204:U=+h[p+(wd*40|0)+32>>3];if(U>Hd|U<Id){f=206;break}else{f=205;break};case 205:Z=wa(200,qd|0,c[xd>>2]|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((Z|0)==0){f=206;break}else{nd=1;f=207;break};case 206:Z=wd+1|0;if((Z|0)<(b|0)){wd=Z;f=194;break}else{pd=rd;f=192;break};case 207:ka(150,n|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;ka(150,x|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;$=(nd|0)==0|0;f=208;break;case 208:i=e;return $|0;case-1:if((g|0)==8){_=v;f=209}u=v=0;break}return 0}function Is(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0;d=c[a>>2]|0;a=c[b>>2]|0;e=+h[d>>3]- +h[a>>3];if(e!=0.0){f=e>0.0?1:-1;return f|0}e=+h[d+8>>3]- +h[a+8>>3];if(e==0.0){f=0;return f|0}f=e>0.0?1:-1;return f|0}function Js(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0.0,j=0.0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;if((f|0)<1){g=0;return g|0}i=+h[a>>3];j=+h[a+8>>3];k=c[a+16>>2]|0;l=(c[k+4>>2]|0)==(a|0);if(l){m=c[k>>2]|0}else{m=a+24|0}n=+h[m>>3];o=+h[m+8>>3];p=+h[b>>3];q=+h[b+8>>3];m=c[b+16>>2]|0;r=(c[m+4>>2]|0)==(b|0);if(r){s=c[m>>2]|0}else{s=b+24|0}t=+h[s>>3];u=+h[s+8>>3];if((f|0)==3){if(i==n){h[d>>3]=i;h[e>>3]=u+(i-t)*((q-u)/(p-t));g=1;return g|0}if(p==t){h[d>>3]=p;h[e>>3]=o+(p-n)*((j-o)/(i-n));g=1;return g|0}else{v=(q-u)/(p-t);w=(j-o)/(i-n);x=q-p*v;y=j-i*w;z=v-w;h[d>>3]=(y-x)/z;h[e>>3]=(v*y-w*x)/z;g=1;return g|0}}else if((f|0)==1){if((i-n)*(q-j)==(j-o)*(p-i)){h[d>>3]=p;h[e>>3]=q;g=1;return g|0}else{h[d>>3]=t;h[e>>3]=u;g=1;return g|0}}else if((f|0)==2){if(l){A=c[k>>2]|0}else{A=a+24|0}z=+h[A>>3];A=i==p;do{if(i==z){B=42}else{if(A|p==z){B=42;break}if(i<p){if(p<z){B=42;break}}else{if(z<p){B=42;break}}if(r){C=c[m>>2]|0}else{C=b+24|0}x=+h[C>>3];if(l){D=c[k>>2]|0}else{D=a+24|0}w=+h[D>>3];if(p==x){E=q;F=p;G=u;H=t;break}if(p==w|w==x){E=q;F=p;G=u;H=t;break}if(p<w){if(w<x){E=q;F=p;G=u;H=t;break}}else{if(x<w){E=q;F=p;G=u;H=t;break}}if(r){I=c[m>>2]|0}else{I=b+24|0}w=+h[I>>3];if(p==w|i==w){J=0}else{if(p<i){K=i<w}else{K=w<i}J=K^1}E=q;F=p;G=J?o:j;H=J?n:i}}while(0);a:do{if((B|0)==42){if(l){L=c[k>>2]|0}else{L=a+24|0}z=+h[L>>3];if(r){M=c[m>>2]|0}else{M=b+24|0}w=+h[M>>3];do{if(i!=z){if(i==w|w==z){break}if(i<w){if(w<z){break}}else{if(z<w){break}}if(l){N=c[k>>2]|0}else{N=a+24|0}x=+h[N>>3];if(i==x){E=u;F=t;G=q;H=p;break a}if(A|p==x){E=u;F=t;G=q;H=p;break a}if(i<p){if(p<x){E=u;F=t;G=q;H=p;break a}}else{if(x<p){E=u;F=t;G=q;H=p;break a}}if(r){O=c[m>>2]|0}else{O=b+24|0}x=+h[O>>3];if(p==x|i==x){P=0}else{if(p<i){Q=i<x}else{Q=x<i}P=Q^1}E=u;F=t;G=P?o:j;H=P?n:i;break a}}while(0);if(r){R=c[m>>2]|0}else{R=b+24|0}w=+h[R>>3];if(p==w){g=0;return g|0}if(A|i==w){g=0;return g|0}if(p<i){if(i<w){g=0}else{E=j;F=i;G=o;H=n;break}return g|0}else{if(w<i){g=0}else{E=j;F=i;G=o;H=n;break}return g|0}}}while(0);h[d>>3]=(H+F)*.5;h[e>>3]=(G+E)*.5;g=1;return g|0}else{g=1;return g|0}return 0}function Ks(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0;d=c[44390]|0;if((d|0)!=0){qu(d)}c[44390]=pu(b,b,0.0)|0;d=c[43812]|0;if((d|0)!=0){eF(d)}c[43812]=jk(b<<2)|0;d=c[43772]|0;if((d|0)!=0){eF(d)}c[43772]=jk(b<<3)|0;a:do{if((b|0)>0){d=0;while(1){e=a+(d<<2)|0;f=c[44390]|0;g=0;i=0.0;do{j=+h[(c[e>>2]|0)+(g<<3)>>3];h[(c[f+(d<<2)>>2]|0)+(g<<3)>>3]=j;k=+S(+j);i=i<k?k:i;g=g+1|0;}while((g|0)<(b|0));if(i==0.0){break}h[(c[43772]|0)+(d<<3)>>3]=1.0/i;c[(c[43812]|0)+(d<<2)>>2]=d;g=d+1|0;if((g|0)<(b|0)){d=g}else{break a}}h[(c[43772]|0)+(d<<3)>>3]=0.0;l=0;return l|0}}while(0);a=b-1|0;b:do{if((a|0)>0){g=0;f=0;while(1){if((g|0)>=(b|0)){l=0;m=27;break}e=c[43812]|0;n=c[44390]|0;o=c[43772]|0;p=f;q=g;k=0.0;do{r=c[e+(q<<2)>>2]|0;j=+S(+(+h[(c[n+(r<<2)>>2]|0)+(g<<3)>>3]));s=j*+h[o+(r<<3)>>3];r=k<s;p=r?q:p;k=r?s:k;q=q+1|0;}while((q|0)<(b|0));if(k==0.0){l=0;m=27;break}if((p|0)!=(g|0)){q=c[43812]|0;o=q+(g<<2)|0;n=c[o>>2]|0;c[o>>2]=c[q+(p<<2)>>2];c[(c[43812]|0)+(p<<2)>>2]=n}n=c[43812]|0;q=n+(g<<2)|0;o=c[44390]|0;i=+h[(c[o+(c[q>>2]<<2)>>2]|0)+(g<<3)>>3];e=g+1|0;if((e|0)<(b|0)){r=e;do{t=n+(r<<2)|0;u=(c[o+(c[t>>2]<<2)>>2]|0)+(g<<3)|0;s=+h[u>>3]/i;h[u>>3]=s;if(s!=0.0){u=e;do{v=(c[o+(c[t>>2]<<2)>>2]|0)+(u<<3)|0;h[v>>3]=+h[v>>3]-s*+h[(c[o+(c[q>>2]<<2)>>2]|0)+(u<<3)>>3];u=u+1|0;}while((u|0)<(b|0))}r=r+1|0;}while((r|0)<(b|0))}if((e|0)<(a|0)){g=e;f=p}else{w=n;x=o;break b}}if((m|0)==27){return l|0}}else{w=c[43812]|0;x=c[44390]|0}}while(0);l=+h[(c[x+(c[w+(a<<2)>>2]<<2)>>2]|0)+(a<<3)>>3]!=0.0|0;return l|0}function Ls(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0;e=(d|0)>0;if(!e){return}f=c[43812]|0;g=0;do{i=c[f+(g<<2)>>2]|0;if((g|0)>0){j=c[(c[44390]|0)+(i<<2)>>2]|0;k=0;l=0.0;while(1){m=l+ +h[j+(k<<3)>>3]*+h[a+(k<<3)>>3];n=k+1|0;if((n|0)<(g|0)){k=n;l=m}else{o=m;break}}}else{o=0.0}h[a+(g<<3)>>3]=+h[b+(i<<3)>>3]-o;g=g+1|0;}while((g|0)<(d|0));if(e){p=d}else{return}while(1){e=p-1|0;g=c[(c[44390]|0)+(c[(c[43812]|0)+(e<<2)>>2]<<2)>>2]|0;if((p|0)<(d|0)){b=p;o=0.0;while(1){l=o+ +h[g+(b<<3)>>3]*+h[a+(b<<3)>>3];f=b+1|0;if((f|0)<(d|0)){b=f;o=l}else{q=l;break}}}else{q=0.0}b=a+(e<<3)|0;h[b>>3]=(+h[b>>3]-q)/+h[g+(e<<3)>>3];if((e|0)>0){p=e}else{break}}return}function Ms(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0.0;if((Ks(a,d)|0)==0){e=0;return e|0}a=jk(d<<3)|0;f=a;g=(d|0)>0;if(!g){eF(a);e=1;return e|0}i=d<<3;j=0;do{vF(a|0,0,i|0)|0;h[f+(j<<3)>>3]=1.0;Ls(c[b+(j<<2)>>2]|0,f,d);j=j+1|0;}while((j|0)<(d|0));eF(a);if(g){k=0}else{e=1;return e|0}while(1){if((k|0)>0){g=b+(k<<2)|0;a=0;do{j=(c[g>>2]|0)+(a<<3)|0;l=+h[j>>3];f=b+(a<<2)|0;h[j>>3]=+h[(c[f>>2]|0)+(k<<3)>>3];h[(c[f>>2]|0)+(k<<3)>>3]=l;a=a+1|0;}while((a|0)<(k|0))}a=k+1|0;if((a|0)<(d|0)){k=a}else{e=1;break}}return e|0}function Ns(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0,R=0.0,U=0.0,V=0,W=0,X=0.0,Y=0,Z=0,_=0,$=0.0,aa=0,ba=0.0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0.0,ja=0.0,ka=0,la=0,ma=0;i=b<<3;j=kk(i)|0;k=j;l=kk(i)|0;i=l;m=b*30|0;n=(d|0)<(b|0)?d:b;a:do{if((n|0)>0){d=(g|0)==0;o=(b|0)>0;p=(b|0)==0;q=0;while(1){r=c[e+(q<<2)>>2]|0;s=(q|0)>0;do{if(!(d|o^1)){t=0;do{h[r+(t<<3)>>3]=+((yb()|0)%100|0|0);t=t+1|0;}while((t|0)<(b|0))}if(s){t=0;do{if(!p){u=c[e+(t<<2)>>2]|0;v=u;w=r;x=b;y=0.0;while(1){z=y+ +h[v>>3]*+h[w>>3];A=x-1|0;if((A|0)==0){B=r;C=u;D=b;break}else{v=v+8|0;w=w+8|0;x=A;y=z}}while(1){h[B>>3]=+h[B>>3]-z*+h[C>>3];x=D-1|0;if((x|0)==0){break}else{B=B+8|0;C=C+8|0;D=x}}}t=t+1|0;}while((t|0)<(q|0))}if(p){E=0.0}else{t=r;x=b;y=0.0;while(1){F=+h[t>>3];G=y+F*F;w=x-1|0;if((w|0)==0){E=G;break}else{t=t+8|0;x=w;y=G}}}H=+T(E);}while(H<1.0e-10);y=1.0/H;if(p){I=0}else{x=r;t=b;while(1){h[x>>3]=y*+h[x>>3];w=t-1|0;if((w|0)==0){I=0;break}else{x=x+8|0;t=w}}}while(1){J=I+1|0;if(!p){t=i;x=r;w=b;while(1){h[t>>3]=+h[x>>3];v=w-1|0;if((v|0)==0){break}else{t=t+8|0;x=x+8|0;w=v}}if(o){w=0;while(1){x=c[a+(w<<2)>>2]|0;t=0;y=0.0;do{y=y+ +h[x+(t<<3)>>3]*+h[r+(t<<3)>>3];t=t+1|0;}while((t|0)<(b|0));h[k+(w<<3)>>3]=y;t=w+1|0;if((t|0)<(b|0)){w=t}else{K=r;L=k;M=b;break}}}else{K=r;L=k;M=b}while(1){h[K>>3]=+h[L>>3];w=M-1|0;if((w|0)==0){break}else{K=K+8|0;L=L+8|0;M=w}}}if(s){w=0;do{if(!p){t=c[e+(w<<2)>>2]|0;x=t;v=r;u=b;G=0.0;while(1){N=G+ +h[x>>3]*+h[v>>3];A=u-1|0;if((A|0)==0){O=r;P=t;Q=b;break}else{x=x+8|0;v=v+8|0;u=A;G=N}}while(1){h[O>>3]=+h[O>>3]-N*+h[P>>3];u=Q-1|0;if((u|0)==0){break}else{O=O+8|0;P=P+8|0;Q=u}}}w=w+1|0;}while((w|0)<(q|0))}if(p){R=0.0}else{w=r;u=b;G=0.0;while(1){y=+h[w>>3];F=G+y*y;v=u-1|0;if((v|0)==0){R=F;break}else{w=w+8|0;u=v;G=F}}}U=+T(R);if(!(U>=1.0e-10&(I|0)<(m|0))){V=J;W=q;break a}G=1.0/U;if(p){X=0.0}else{u=r;w=b;while(1){h[u>>3]=G*+h[u>>3];v=w-1|0;if((v|0)==0){Y=r;Z=i;_=b;$=0.0;break}else{u=u+8|0;w=v}}while(1){G=$+ +h[Y>>3]*+h[Z>>3];w=_-1|0;if((w|0)==0){X=G;break}else{Y=Y+8|0;Z=Z+8|0;_=w;$=G}}}if(+S(+X)<.999){I=J}else{break}}h[f+(q<<3)>>3]=U*X;r=q+1|0;if((r|0)<(n|0)){q=r}else{V=J;W=r;break}}}else{V=0;W=0}}while(0);if((W|0)<(n|0)){J=(b|0)>0;I=(b|0)==0;_=W;do{W=c[e+(_<<2)>>2]|0;if(J){Z=0;do{h[W+(Z<<3)>>3]=+((yb()|0)%100|0|0);Z=Z+1|0;}while((Z|0)<(b|0))}do{if((_|0)>0){if(I){break}else{aa=0}while(1){Z=c[e+(aa<<2)>>2]|0;Y=Z;i=W;Q=b;X=0.0;while(1){ba=X+ +h[Y>>3]*+h[i>>3];P=Q-1|0;if((P|0)==0){ca=W;da=Z;ea=b;break}else{Y=Y+8|0;i=i+8|0;Q=P;X=ba}}while(1){h[ca>>3]=+h[ca>>3]-ba*+h[da>>3];Q=ea-1|0;if((Q|0)==0){break}else{ca=ca+8|0;da=da+8|0;ea=Q}}Q=aa+1|0;if((Q|0)<(_|0)){aa=Q}else{fa=55;break}}}else{fa=55}}while(0);do{if((fa|0)==55){fa=0;if(I){break}else{ga=W;ha=b;ia=0.0}while(1){X=+h[ga>>3];ja=ia+X*X;Q=ha-1|0;if((Q|0)==0){break}else{ga=ga+8|0;ha=Q;ia=ja}}X=1.0/+T(ja);Q=W;i=b;while(1){h[Q>>3]=X*+h[Q>>3];Y=i-1|0;if((Y|0)==0){break}else{Q=Q+8|0;i=Y}}}}while(0);h[f+(_<<3)>>3]=0.0;_=_+1|0;}while((_|0)<(n|0))}_=n-1|0;if((_|0)<=0){eF(j);eF(l);ka=(V|0)<=(m|0);la=ka&1;return la|0}if((b|0)==0){ha=0;while(1){ga=f+(ha<<3)|0;ja=+h[ga>>3];I=ha+1|0;do{if((I|0)<(n|0)){fa=I;aa=ha;ia=ja;do{ba=+h[f+(fa<<3)>>3];ea=ia<ba;aa=ea?fa:aa;ia=ea?ba:ia;fa=fa+1|0;}while((fa|0)<(n|0));if((aa|0)==(ha|0)){break}h[f+(aa<<3)>>3]=ja;h[ga>>3]=ia}}while(0);if((I|0)<(_|0)){ha=I}else{break}}eF(j);eF(l);ka=(V|0)<=(m|0);la=ka&1;return la|0}else{ma=0}while(1){ha=f+(ma<<3)|0;ga=ma+1|0;do{if((ga|0)<(n|0)){fa=ga;ea=ma;ja=+h[ha>>3];do{ba=+h[f+(fa<<3)>>3];da=ja<ba;ea=da?fa:ea;ja=da?ba:ja;fa=fa+1|0;}while((fa|0)<(n|0));if((ea|0)==(ma|0)){break}fa=e+(ma<<2)|0;aa=k;da=c[fa>>2]|0;ca=b;while(1){h[aa>>3]=+h[da>>3];J=ca-1|0;if((J|0)==0){break}else{aa=aa+8|0;da=da+8|0;ca=J}}ca=e+(ea<<2)|0;da=c[fa>>2]|0;aa=c[ca>>2]|0;J=b;while(1){h[da>>3]=+h[aa>>3];W=J-1|0;if((W|0)==0){break}else{da=da+8|0;aa=aa+8|0;J=W}}J=c[ca>>2]|0;aa=k;da=b;while(1){h[J>>3]=+h[aa>>3];fa=da-1|0;if((fa|0)==0){break}else{J=J+8|0;aa=aa+8|0;da=fa}}h[f+(ea<<3)>>3]=+h[ha>>3];h[ha>>3]=ja}}while(0);if((ga|0)<(_|0)){ma=ga}else{break}}eF(j);eF(l);ka=(V|0)<=(m|0);la=ka&1;return la|0}function Os(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0.0;if((b|0)<=0){return}if((d|0)>0){g=0}else{vF(f|0,0,b<<3|0)|0;return}do{i=c[a+(g<<2)>>2]|0;j=0;k=0.0;do{k=k+ +h[i+(j<<3)>>3]*+h[e+(j<<3)>>3];j=j+1|0;}while((j|0)<(d|0));h[f+(g<<3)>>3]=k;g=g+1|0;}while((g|0)<(b|0));return}function Ps(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0.0;j=c[i>>2]|0;if((j|0)==0){k=d<<2;l=dF(da(k,f)|0)|0;m=l;n=dF(k)|0}else{k=d<<2;l=gF(c[j>>2]|0,da(k,f)|0)|0;m=l;n=gF(j,k)|0}k=n;c[i>>2]=k;i=(d|0)>0;if(!i){return}n=0;j=m;while(1){c[k+(n<<2)>>2]=j;m=n+1|0;if((m|0)<(d|0)){n=m;j=j+(f<<2)|0}else{break}}if(!i){return}i=(f|0)>0;j=(e|0)>0;n=0;do{if(i){m=k+(n<<2)|0;l=a+(n<<2)|0;o=0;do{if(j){p=c[l>>2]|0;q=0.0;r=0;do{q=q+ +h[p+(r<<3)>>3]*+g[(c[b+(r<<2)>>2]|0)+(o<<2)>>2];r=r+1|0;}while((r|0)<(e|0));s=q}else{s=0.0}g[(c[m>>2]|0)+(o<<2)>>2]=s;o=o+1|0;}while((o|0)<(f|0))}n=n+1|0;}while((n|0)<(d|0));return}function Qs(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0.0;j=c[i>>2]|0;if((j|0)==0){k=dF(da(d<<3,f)|0)|0;l=k;m=dF(d<<2)|0}else{k=gF(c[j>>2]|0,da(d<<3,f)|0)|0;l=k;m=gF(j,d<<2)|0}j=m;c[i>>2]=j;i=(d|0)>0;if(!i){return}m=l;l=0;while(1){c[j+(l<<2)>>2]=m;k=l+1|0;if((k|0)<(d|0)){m=m+(f<<3)|0;l=k}else{break}}if(!i){return}i=(f|0)>0;l=(e|0)>0;m=0;do{if(i){k=j+(m<<2)|0;n=a+(m<<2)|0;o=0;do{if(l){p=c[n>>2]|0;q=0;r=0.0;while(1){s=r+ +h[p+(q<<3)>>3]*+g[(c[b+(q<<2)>>2]|0)+(o<<2)>>2];t=q+1|0;if((t|0)<(e|0)){q=t;r=s}else{u=s;break}}}else{u=0.0}h[(c[k>>2]|0)+(o<<3)>>3]=u;o=o+1|0;}while((o|0)<(f|0))}m=m+1|0;}while((m|0)<(d|0));return}function Rs(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0;i=c[f>>2]|0;if((i|0)==0){j=dF(da(d<<4,e)|0)|0;k=j;l=dF(d<<2)|0}else{j=gF(c[i>>2]|0,da(d<<4,e)|0)|0;k=j;l=gF(i,d<<2)|0}i=l;c[f>>2]=i;f=(d|0)>0;if(!f){return}l=0;j=k;while(1){c[i+(l<<2)>>2]=j;k=l+1|0;if((k|0)<(d|0)){l=k;j=j+(e<<2)|0}else{break}}if(!f){return}f=(e|0)>0;j=0;do{l=c[a+(j<<4)+4>>2]|0;k=c[a+(j<<4)+8>>2]|0;m=c[a+(j<<4)>>2]|0;if(f){n=(m|0)>0;o=i+(j<<2)|0;p=0;do{if(n){q=c[b+(p<<2)>>2]|0;r=0;s=0.0;do{s=s+ +g[k+(r<<2)>>2]*+h[q+(c[l+(r<<2)>>2]<<3)>>3];r=r+1|0;}while((r|0)<(m|0));t=s}else{t=0.0}g[(c[o>>2]|0)+(p<<2)>>2]=t;p=p+1|0;}while((p|0)<(e|0))}j=j+1|0;}while((j|0)<(d|0));return}function Ss(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0.0,g=0.0,i=0,j=0,k=0;c=(a|0)==0;if(c){return}else{d=a;e=b;f=0.0}while(1){g=f+ +h[e>>3];i=d-1|0;if((i|0)==0){break}else{d=i;e=e+8|0;f=g}}f=g/+(a|0);if(c){return}else{j=a;k=b}while(1){h[k>>3]=+h[k>>3]-f;b=j-1|0;if((b|0)==0){break}else{j=b;k=k+8|0}}return}function Ts(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0.0;if((b|0)>0){f=0}else{return}do{i=c[a+(f<<2)>>2]|0;j=0;k=0.0;do{k=k+ +g[i+(j<<2)>>2]*+h[d+(j<<3)>>3];j=j+1|0;}while((j|0)<(b|0));h[e+(f<<3)>>3]=k;f=f+1|0;}while((f|0)<(b|0));return}function Us(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if((a|0)>0){e=0}else{return}do{h[d+(e<<3)>>3]=+h[b+(e<<3)>>3]- +h[c+(e<<3)>>3];e=e+1|0;}while((e|0)<(a|0));return}function Vs(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if((a|0)>0){e=0}else{return}do{h[d+(e<<3)>>3]=+h[b+(e<<3)>>3]+ +h[c+(e<<3)>>3];e=e+1|0;}while((e|0)<(a|0));return}function Ws(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0;if((a|0)>0){e=0}else{return}do{h[d+(e<<3)>>3]=+h[b+(e<<3)>>3]*c;e=e+1|0;}while((e|0)<(a|0));return}function Xs(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((a|0)>0){d=0}else{return}do{h[c+(d<<3)>>3]=+h[b+(d<<3)>>3];d=d+1|0;}while((d|0)<(a|0));return}function Ys(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0,f=0.0,g=0.0,i=0;if((a|0)>0){d=0;e=0.0}else{f=0.0;return+f}while(1){g=e+ +h[b+(d<<3)>>3]*+h[c+(d<<3)>>3];i=d+1|0;if((i|0)<(a|0)){d=i;e=g}else{f=g;break}}return+f}function Zs(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0.0,f=0.0,g=0.0,i=0;if((a|0)>0){c=-1.0e+50;d=0}else{e=-1.0e+50;return+e}while(1){f=+S(+(+h[b+(d<<3)>>3]));g=f>c?f:c;i=d+1|0;if((i|0)<(a|0)){c=g;d=i}else{e=g;break}}return+e}function _s(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0.0,l=0.0,m=0,n=0.0;if((b|0)<=0){return}g=(d|0)>0;i=0;do{if(g){j=0;k=0.0;while(1){l=k+ +h[(c[a+(j<<2)>>2]|0)+(i<<3)>>3]*+h[e+(j<<3)>>3];m=j+1|0;if((m|0)<(d|0)){j=m;k=l}else{n=l;break}}}else{n=0.0}h[f+(i<<3)>>3]=n;i=i+1|0;}while((i|0)<(b|0));return}function $s(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0.0,h=0.0,i=0,j=0,k=0;c=(a|0)==0;if(c){return}else{d=a;e=b;f=0.0}while(1){h=f+ +g[e>>2];i=d-1|0;if((i|0)==0){break}else{d=i;e=e+4|0;f=h}}f=h/+(a|0);if(c){return}else{j=a;k=b}while(1){g[k>>2]=+g[k>>2]-f;b=j-1|0;if((b|0)==0){break}else{j=b;k=k+4|0}}return}function at(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0,r=0;if((b|0)<=0){return}vF(d|0,0,b<<2|0)|0;e=0;f=0;h=b;while(1){i=+g[c+(f<<2)>>2];j=i*+g[a+(e<<2)>>2]+0.0;k=f+1|0;l=(k|0)<(b|0);if(l){m=k;n=j;o=e}else{break}do{o=o+1|0;p=+g[a+(o<<2)>>2];n=n+p*+g[c+(m<<2)>>2];q=d+(m<<2)|0;g[q>>2]=i*p+ +g[q>>2];m=m+1|0;}while((m|0)<(b|0));q=d+(f<<2)|0;g[q>>2]=n+ +g[q>>2];if(l){e=e+h|0;f=k;h=h-1|0}else{r=7;break}}if((r|0)==7){return}r=d+(f<<2)|0;g[r>>2]=j+ +g[r>>2];return}function bt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if((a|0)>0){e=0}else{return}do{g[d+(e<<2)>>2]=+g[b+(e<<2)>>2]- +g[c+(e<<2)>>2];e=e+1|0;}while((e|0)<(a|0));return}function ct(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if((a|0)>0){e=0}else{return}do{g[d+(e<<2)>>2]=+g[b+(e<<2)>>2]+ +g[c+(e<<2)>>2];e=e+1|0;}while((e|0)<(a|0));return}function dt(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0,f=0;if((a|0)>0){e=0}else{return}do{f=b+(e<<2)|0;g[f>>2]=+g[f>>2]+ +g[d+(e<<2)>>2]*c;e=e+1|0;}while((e|0)<(a|0));return}function et(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0;if((a|0)>0){e=0}else{return}do{g[d+(e<<2)>>2]=+g[b+(e<<2)>>2]*c;e=e+1|0;}while((e|0)<(a|0));return}function ft(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((a|0)>0){d=0}else{return}do{g[c+(d<<2)>>2]=+g[b+(d<<2)>>2];d=d+1|0;}while((d|0)<(a|0));return}function gt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0,f=0.0,h=0.0,i=0;if((a|0)>0){d=0;e=0.0}else{f=0.0;return+f}while(1){h=e+ +g[b+(d<<2)>>2]*+g[c+(d<<2)>>2];i=d+1|0;if((i|0)<(a|0)){d=i;e=h}else{f=h;break}}return+f}function ht(a,b,c){a=a|0;b=+b;c=c|0;var d=0;if((a|0)>0){d=0}else{return}do{g[c+(d<<2)>>2]=b;d=d+1|0;}while((d|0)<(a|0));return}function it(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0;if((a|0)>0){c=0;d=-1.0000000150474662e+30}else{e=-1.0000000150474662e+30;return+e}do{f=+S(+(+g[b+(c<<2)>>2]));d=f>d?f:d;c=c+1|0;}while((c|0)<(a|0));e=d;return+e}function jt(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;if((a|0)>0){c=0}else{return}do{d=b+(c<<2)|0;e=+g[d>>2];g[d>>2]=e*e;c=c+1|0;}while((c|0)<(a|0));return}function kt(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;if((a|0)>0){c=0}else{return}do{d=b+(c<<2)|0;e=+g[d>>2];if(e!=0.0){g[d>>2]=1.0/e}c=c+1|0;}while((c|0)<(a|0));return}function lt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0;if((a|0)>0){d=0}else{return}do{e=+g[b+(d<<2)>>2];if(e>=0.0){g[c+(d<<2)>>2]=+T(e)}d=d+1|0;}while((d|0)<(a|0));return}function mt(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;if((a|0)>0){c=0}else{return}do{d=b+(c<<2)|0;e=+g[d>>2];if(e>0.0){g[d>>2]=1.0/+T(e)}c=c+1|0;}while((c|0)<(a|0));return}function nt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;c[a>>2]=0;do{if((b&3|0)==0){d=b}else{if((4%(b>>>0)|0|0)==0){d=4;break}a:do{if((b|0)==4){e=4}else{f=b;g=4;while(1){h=g;while(1){i=h-f|0;if((f|0)>=(h|0)){break}if((i|0)==(f|0)){e=f;break a}else{h=i}}i=f-h|0;if((h|0)==(i|0)){e=h;break}else{f=i;g=h}}}}while(0);d=da(4/(e>>>0)|0,b)|0}}while(0);c[a+8>>2]=d;d=a+4|0;a=c[d>>2]|0;if((a|0)==0){c[d>>2]=0;return}else{j=a}while(1){a=c[j>>2]|0;eF(c[j+4>>2]|0);eF(j);if((a|0)==0){break}else{j=a}}c[d>>2]=0;return}function ot(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;b=a|0;d=c[b>>2]|0;if((d|0)!=0){e=d;f=e|0;g=c[f>>2]|0;c[b>>2]=g;h=e;return h|0}d=c[a+8>>2]|0;i=kk(8)|0;j=i;k=kk(da(c[43746]|0,d)|0)|0;c[i+4>>2]=k;if((c[43746]|0)>0){l=0;m=c[b>>2]|0;while(1){n=k+(da(l,d)|0)|0;o=n;c[n>>2]=m;c[b>>2]=o;n=l+1|0;if((n|0)<(c[43746]|0)){l=n;m=o}else{break}}}m=a+4|0;c[i>>2]=c[m>>2];c[m>>2]=j;e=c[b>>2]|0;f=e|0;g=c[f>>2]|0;c[b>>2]=g;h=e;return h|0}function pt(a,b){a=a|0;b=b|0;var d=0;d=b|0;c[a>>2]=c[d>>2];c[d>>2]=a;return}function qt(a){a=a|0;var b=0,d=0;b=a|0;Wx(b,141360,304,1)|0;Ym(a);d=jk((e[(c[(Hx(b)|0)+8>>2]|0)+168>>1]|0)<<3)|0;c[(c[a+8>>2]|0)+132>>2]=d;vn(a,c[(c[(Hx(b)|0)+8>>2]|0)+116>>2]&1);return}function rt(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0;g=i;i=i+16|0;j=g|0;k=g+8|0;if((b|0)==0){l=0;i=g;return l|0}m=e+8|0;n=c[(c[m>>2]|0)+132>>2]|0;o=e|0;p=fw(o,b)|0;if((a[p]|0)==0){l=0;i=g;return l|0}a[j]=0;b=n+8|0;do{if((c[53568]|0)>2){q=ac(p|0,161560,(r=i,i=i+32|0,c[r>>2]=n,c[r+8>>2]=b,c[r+16>>2]=n+16,c[r+24>>2]=j,r)|0)|0;i=r;if((q|0)<=2){break}a[(c[m>>2]|0)+119|0]=1;s=+h[21580];q=c[53568]|0;a:do{if(s>0.0){if((q|0)>0){t=0;u=s}else{break}while(1){v=n+(t<<3)|0;h[v>>3]=+h[v>>3]/u;v=t+1|0;w=c[53568]|0;if((v|0)>=(w|0)){x=w;y=9;break a}t=v;u=+h[21580]}}else{x=q;y=9}}while(0);do{if((y|0)==9){if((x|0)<=3){break}vu(e,f,3)}}while(0);do{if((a[j]|0)!=33){if((d|0)==0){l=1;i=g;return l|0}if((Km(fw(o,d)|0)|0)<<24>>24==0){l=1}else{break}i=g;return l|0}}while(0);a[(c[m>>2]|0)+119|0]=3;l=1;i=g;return l|0}}while(0);x=ac(p|0,130648,(r=i,i=i+24|0,c[r>>2]=n,c[r+8>>2]=b,c[r+16>>2]=j,r)|0)|0;i=r;if((x|0)<=1){x=$w(o)|0;Fv(1,109024,(r=i,i=i+16|0,c[r>>2]=x,c[r+8>>2]=p,r)|0)|0;i=r;l=0;i=g;return l|0}a[(c[m>>2]|0)+119|0]=1;u=+h[21580];p=c[53568]|0;b:do{if(u>0.0){if((p|0)>0){z=0;A=u}else{break}while(1){x=n+(z<<3)|0;h[x>>3]=+h[x>>3]/A;x=z+1|0;b=c[53568]|0;if((x|0)>=(b|0)){B=b;y=20;break b}z=x;A=+h[21580]}}else{B=p;y=20}}while(0);c:do{if((y|0)==20){if((B|0)<=2){break}p=c[53570]|0;do{if((p|0)!=0){z=fw(o,p)|0;if((z|0)==0){break}x=ac(z|0,116320,(r=i,i=i+8|0,c[r>>2]=k,r)|0)|0;i=r;if((x|0)!=1){break}A=+h[21580];u=+h[k>>3];if(A>0.0){h[n+16>>3]=u/A}else{h[n+16>>3]=u}vu(e,f,3);break c}}while(0);wu(e,f)}}while(0);do{if((a[j]|0)!=33){if((d|0)==0){l=1;i=g;return l|0}if((Km(fw(o,d)|0)|0)<<24>>24==0){l=1}else{break}i=g;return l|0}}while(0);a[(c[m>>2]|0)+119|0]=3;l=1;i=g;return l|0}function st(a){a=a|0;var b=0,d=0,e=0;b=ux(a)|0;if((b|0)!=0){d=b;do{b=mw(a,d)|0;if((b|0)!=0){e=b;do{tn(e);e=ow(a,e)|0;}while((e|0)!=0)}un(d);d=vx(a,d)|0;}while((d|0)!=0)}if((c[53566]|0)!=0|(c[53552]|0)<0){uu(a)}if((Ix(a|0)|0)==(a|0)){return}_x(a,0,139536);return}function tt(b,e){b=b|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0;f=i;i=i+152|0;g=f|0;j=f+8|0;k=f+16|0;l=f+24|0;m=f+32|0;n=f+40|0;o=f+48|0;p=f+56|0;q=f+64|0;r=f+72|0;s=f+80|0;t=f+88|0;u=f+96|0;v=f+104|0;w=f+112|0;x=f+120|0;y=Wv(b,0,103264,0)|0;z=Wv(b,0,97632,0)|0;if((z|0)==0){A=Wv(b,0,97632,213344)|0}else{A=z}tu(b)|0;z=b+8|0;B=c[c[(c[z>>2]|0)+144>>2]>>2]|0;a:do{if((B|0)!=0){C=0;D=B;while(1){E=D+8|0;F=c[E>>2]|0;if((a[F+119|0]|0)==0){G=D|0;if((Za($w(G)|0,86848,7)|0)!=0){break}H=c[E>>2]|0}else{H=F}F=c[H+108>>2]|0;do{if((F|0)!=0){E=ew(D|0,168264)|0;if((E|0)==0){break}I=ac(E|0,98704,(J=i,i=i+16|0,c[J>>2]=v,c[J+8>>2]=w,J)|0)|0;i=J;if((I|0)!=2){break}K=+h[w>>3];h[F+56>>3]=+h[v>>3];h[F+64>>3]=K;a[F+81|0]=1}}while(0);C=C+1|0;D=c[(c[(c[z>>2]|0)+144>>2]|0)+(C<<2)>>2]|0;if((D|0)==0){break a}}D=$w(G)|0;C=$w(b|0)|0;Fv(1,82048,(J=i,i=i+16|0,c[J>>2]=D,c[J+8>>2]=C,J)|0)|0;i=J;L=-1;i=f;return L|0}}while(0);ut(b,y,A);do{if((Mw(b)|0)==0){M=2}else{A=Wv(b,2,104384,0)|0;if((A|0)==0|(c[53566]|0)<2){M=0;break}y=ux(b)|0;if((y|0)==0){M=0;break}G=y;y=0;while(1){v=mw(b,G)|0;if((v|0)==0){N=y}else{w=v;v=y;while(1){H=w|0;B=fw(H,A)|0;do{if((a[B]|0)==0){O=0}else{ih(w,t,u);C=1;K=0.0;P=0.0;Q=0.0;R=0.0;D=0;F=0;I=B;b:while(1){E=ac(I|0,102080,(J=i,i=i+24|0,c[J>>2]=r,c[J+8>>2]=s,c[J+16>>2]=q,J)|0)|0;i=J;if((E|0)==2){S=+h[r>>3];T=+h[s>>3];U=1;V=I+(c[q>>2]|0)|0}else{S=Q;T=R;U=F;V=I}E=ac(V|0,101336,(J=i,i=i+24|0,c[J>>2]=r,c[J+8>>2]=s,c[J+16>>2]=q,J)|0)|0;i=J;if((E|0)==2){W=+h[r>>3];X=+h[s>>3];Y=1;Z=V+(c[q>>2]|0)|0}else{W=K;X=P;Y=D;Z=V}E=0;_=Z;while(1){$=_;while(1){if((Qa(d[$]|0)|0)==0){break}else{$=$+1|0}}aa=a[$]|0;c:do{if(aa<<24>>24==0){ba=0;ca=E;da=$}else{ea=E+1|0;fa=$;ga=aa;while(1){ha=fa+1|0;if((Qa(ga&255|0)|0)!=0|ga<<24>>24==59){ba=ga;ca=ea;da=fa;break c}ia=a[ha]|0;if(ia<<24>>24==0){ba=0;ca=ea;da=ha;break}else{fa=ha;ga=ia}}}}while(0);if((Qa(ba&255|0)|0)==0){break}else{E=ca;_=da}}if(!((ca|0)>3&((ca|0)%3|0|0)==1)){ja=34;break}ka=kk(ca<<4)|0;_=ka;if((ca|0)==0){la=Z}else{E=ca;aa=Z;$=_;while(1){ga=ac(aa|0,100472,(J=i,i=i+24|0,c[J>>2]=r,c[J+8>>2]=s,c[J+16>>2]=q,J)|0)|0;i=J;if((ga|0)<2){ja=38;break b}ga=aa+(c[q>>2]|0)|0;h[$>>3]=+h[r>>3];h[$+8>>3]=+h[s>>3];fa=E-1|0;if((fa|0)==0){la=ga;break}else{E=fa;aa=ga;$=$+16|0}}}while(1){ma=la+1|0;if((Qa(a[la]|0)|0)==0){break}else{la=ma}}$=(a[la]|0)==0;aa=$?la:ma;E=$?0:C;$=bm(w,ca)|0;if((U|0)!=0){c[$+8>>2]=c[t>>2];h[$+16>>3]=S;h[$+24>>3]=T}if((Y|0)!=0){c[$+12>>2]=c[u>>2];h[$+32>>3]=W;h[$+40>>3]=X}if((ca|0)>0){ga=$|0;$=0;do{fa=(c[ga>>2]|0)+($<<4)|0;ea=_+($<<4)|0;c[fa>>2]=c[ea>>2];c[fa+4>>2]=c[ea+4>>2];c[fa+8>>2]=c[ea+8>>2];c[fa+12>>2]=c[ea+12>>2];$=$+1|0;}while(($|0)<(ca|0))}eF(ka);if((E|0)==0){ja=51;break}else{C=E;K=W;P=X;Q=S;R=T;D=Y;F=U;I=aa}}if((ja|0)==34){ja=0;sn(w);if(a[976]|0){O=0;break}a[976]=1;I=w;F=$w(c[((c[I>>2]&3|0)==3?w:w+32|0)+28>>2]|0)|0;D=$w(c[((c[I>>2]&3|0)==2?w:w-32|0)+28>>2]|0)|0;Fv(0,100880,(J=i,i=i+16|0,c[J>>2]=F,c[J+8>>2]=D,J)|0)|0;i=J;O=0;break}else if((ja|0)==38){ja=0;if(!(a[976]|0)){a[976]=1;D=w;F=$w(c[((c[D>>2]&3|0)==3?w:w+32|0)+28>>2]|0)|0;I=$w(c[((c[D>>2]&3|0)==2?w:w-32|0)+28>>2]|0)|0;Fv(0,99912,(J=i,i=i+16|0,c[J>>2]=F,c[J+8>>2]=I,J)|0)|0;i=J}eF(ka);sn(w);O=0;break}else if((ja|0)==51){ja=0;I=w+8|0;F=c[(c[I>>2]|0)+96>>2]|0;do{if((F|0)!=0){D=ew(H,103264)|0;if((D|0)==0){break}C=ac(D|0,98704,(J=i,i=i+16|0,c[J>>2]=o,c[J+8>>2]=p,J)|0)|0;i=J;if((C|0)!=2){break}R=+h[p>>3];h[F+56>>3]=+h[o>>3];h[F+64>>3]=R;a[F+81|0]=1}}while(0);F=c[(c[I>>2]|0)+108>>2]|0;do{if((F|0)!=0){C=ew(H,168264)|0;if((C|0)==0){break}D=ac(C|0,98704,(J=i,i=i+16|0,c[J>>2]=m,c[J+8>>2]=n,J)|0)|0;i=J;if((D|0)!=2){break}R=+h[n>>3];h[F+56>>3]=+h[m>>3];h[F+64>>3]=R;a[F+81|0]=1}}while(0);F=c[(c[I>>2]|0)+100>>2]|0;do{if((F|0)!=0){D=ew(H,99528)|0;if((D|0)==0){break}C=ac(D|0,98704,(J=i,i=i+16|0,c[J>>2]=k,c[J+8>>2]=l,J)|0)|0;i=J;if((C|0)!=2){break}R=+h[l>>3];h[F+56>>3]=+h[k>>3];h[F+64>>3]=R;a[F+81|0]=1}}while(0);F=c[(c[I>>2]|0)+104>>2]|0;if((F|0)==0){O=1;break}C=ew(H,99144)|0;if((C|0)==0){O=1;break}D=ac(C|0,98704,(J=i,i=i+16|0,c[J>>2]=g,c[J+8>>2]=j,J)|0)|0;i=J;if((D|0)!=2){O=1;break}R=+h[j>>3];h[F+56>>3]=+h[g>>3];h[F+64>>3]=R;a[F+81|0]=1;O=1;break}}}while(0);H=O+v|0;B=ow(b,w)|0;if((B|0)==0){N=H;break}else{w=B;v=H}}}v=vx(b,G)|0;if((v|0)==0){break}else{G=v;y=N}}if((N|0)==0){M=0;break}y=(N|0)==(Mw(b)|0);M=y?2:1}}while(0);N=c[(c[z>>2]|0)+8>>2]|0;d:do{if((c[N+88>>2]|0)==0){O=(e|0)!=0;do{if(O&(c[53566]|0)==1){if((nr(b)|0)==0){break}g=c[(c[z>>2]|0)+12>>2]|0;if((g|0)==0){break}a[g+81|0]=0}}while(0);$m(b);if(!O){na=0;ja=115;break}g=c[z>>2]|0;T=+h[g+16>>3];j=~~T;J=(j|0)>-1?j:-j|0;S=+(J|0);if((J|0)>-1){if((~~(S+.5)|0)==0){ja=81}}else{if((~~(S+-.5)|0)==0){ja=81}}do{if((ja|0)==81){J=~~+h[g+24>>3];j=(J|0)>-1?J:-J|0;S=+(j|0);if((j|0)>-1){if((~~(S+.5)|0)==0){oa=0;break d}else{break}}else{if((~~(S+-.5)|0)==0){oa=0;break d}else{break}}}}while(0);S=+h[g+24>>3];X=T/72.0;W=S/72.0;O=ux(b)|0;if((O|0)!=0){j=O;do{O=j+8|0;J=c[(c[O>>2]|0)+132>>2]|0;h[J>>3]=+h[J>>3]-X;J=(c[(c[O>>2]|0)+132>>2]|0)+8|0;h[J>>3]=+h[J>>3]-W;j=vx(b,j)|0;}while((j|0)!=0)}do{if((M|0)!=0){j=ux(b)|0;if((j|0)==0){break}else{pa=j}do{j=mw(b,pa)|0;if((j|0)!=0){g=j;do{j=g+8|0;J=c[j>>2]|0;O=c[J+8>>2]|0;do{if((O|0)!=0){if((c[O+4>>2]|0)>0){k=0;l=c[O>>2]|0;while(1){m=l+4|0;if((c[m>>2]|0)>0){n=0;o=c[l>>2]|0;while(1){p=o|0;h[p>>3]=+h[p>>3]-T;p=o+8|0;h[p>>3]=+h[p>>3]-S;p=n+1|0;if((p|0)<(c[m>>2]|0)){n=p;o=o+16|0}else{break}}}if((c[l+8>>2]|0)!=0){o=l+16|0;h[o>>3]=+h[o>>3]-T;o=l+24|0;h[o>>3]=+h[o>>3]-S}if((c[l+12>>2]|0)!=0){o=l+32|0;h[o>>3]=+h[o>>3]-T;o=l+40|0;h[o>>3]=+h[o>>3]-S}o=k+1|0;n=c[j>>2]|0;if((o|0)<(c[(c[n+8>>2]|0)+4>>2]|0)){k=o;l=l+48|0}else{qa=n;break}}}else{qa=J}l=c[qa+96>>2]|0;do{if((l|0)==0){ra=qa}else{if((a[l+81|0]|0)==0){ra=qa;break}k=l+56|0;h[k>>3]=+h[k>>3]-T;k=(c[(c[j>>2]|0)+96>>2]|0)+64|0;h[k>>3]=+h[k>>3]-S;ra=c[j>>2]|0}}while(0);l=c[ra+108>>2]|0;do{if((l|0)==0){sa=ra}else{if((a[l+81|0]|0)==0){sa=ra;break}k=l+56|0;h[k>>3]=+h[k>>3]-T;k=(c[(c[j>>2]|0)+108>>2]|0)+64|0;h[k>>3]=+h[k>>3]-S;sa=c[j>>2]|0}}while(0);l=c[sa+100>>2]|0;do{if((l|0)==0){ta=sa}else{if((a[l+81|0]|0)==0){ta=sa;break}k=l+56|0;h[k>>3]=+h[k>>3]-T;k=(c[(c[j>>2]|0)+100>>2]|0)+64|0;h[k>>3]=+h[k>>3]-S;ta=c[j>>2]|0}}while(0);l=c[ta+104>>2]|0;if((l|0)==0){break}if((a[l+81|0]|0)==0){break}k=l+56|0;h[k>>3]=+h[k>>3]-T;k=(c[(c[j>>2]|0)+104>>2]|0)+64|0;h[k>>3]=+h[k>>3]-S}}while(0);g=ow(b,g)|0;}while((g|0)!=0)}pa=vx(b,pa)|0;}while((pa|0)!=0)}}while(0);Bt(b,T,S);oa=0}else{c[N+84>>2]=0;$m(b);g=(c[z>>2]|0)+16|0;Ph(x,b);j=g;g=x;c[j>>2]=c[g>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[j+12>>2]=c[g+12>>2];c[j+16>>2]=c[g+16>>2];c[j+20>>2]=c[g+20>>2];c[j+24>>2]=c[g+24>>2];c[j+28>>2]=c[g+28>>2];if((e|0)==0){na=1;ja=115}else{oa=1}}}while(0);if((ja|0)==115){c[53522]=1;ja=ux(b)|0;if((ja|0)==0){L=na;i=f;return L|0}else{ua=ja}while(1){ja=ua+8|0;e=c[ja>>2]|0;h[e+16>>3]=+h[c[e+132>>2]>>3]*72.0;e=c[ja>>2]|0;h[e+24>>3]=+h[(c[e+132>>2]|0)+8>>3]*72.0;e=vx(b,ua)|0;if((e|0)==0){L=na;break}else{ua=e}}i=f;return L|0}if((M|0)==2){c[53522]=1;Ot(b);L=oa;i=f;return L|0}else{Nt(b);L=oa;i=f;return L|0}return 0}function ut(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0;f=i;i=i+16|0;g=f|0;j=f+8|0;k=b+8|0;do{if(!((c[(c[k>>2]|0)+12>>2]|0)==0|(d|0)==0)){l=ac(fw(b|0,d)|0,98704,(m=i,i=i+16|0,c[m>>2]=g,c[m+8>>2]=j,m)|0)|0;i=m;if((l|0)!=2){break}l=c[(c[k>>2]|0)+12>>2]|0;n=+h[j>>3];h[l+56>>3]=+h[g>>3];h[l+64>>3]=n;a[(c[(c[k>>2]|0)+12>>2]|0)+81|0]=1}}while(0);if((e|0)==0){i=f;return}k=sy(b)|0;if((k|0)==0){i=f;return}else{o=k}do{Ct(o,b,d,e);o=ty(o)|0;}while((o|0)!=0);i=f;return}function vt(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;i=i+40|0;h=g|0;j=g+32|0;k=b|0;b=ew(k,164128)|0;if((b|0)==0){l=e;i=g;return l|0}m=a[b]|0;if(m<<24>>24==0){l=e;i=g;return l|0}do{if((Kb(m&255|0)|0)==0){n=b;o=((d[b]|0)-48|0)>>>0<10>>>0}else{if((Za(b|0,160072,4)|0)==0){l=0;i=g;return l|0}if((Za(b|0,155040,7)|0)==0){l=1;i=g;return l|0}else{p=(Za(b|0,151632,6)|0)==0;n=p?b+6|0:b;o=p;break}}}while(0);b=o?2:e;if((b|0)!=2){l=b;i=g;return l|0}if(((d[n]|0)-48|0)>>>0<10>>>0){b=ac(n|0,148776,(q=i,i=i+8|0,c[q>>2]=j,q)|0)|0;i=q;if((b|0)<1){r=11}}else{r=11}if((r|0)==11){r=fb()|0;b=(zc(0)|0)^r;c[j>>2]=b;r=h|0;nb(r|0,148776,(q=i,i=i+8|0,c[q>>2]=b,q)|0)|0;i=q;gw(k,164128,r)|0}c[f>>2]=c[j>>2];l=2;i=g;return l|0}function wt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0;f=i;i=i+8|0;g=f|0;c[g>>2]=1;j=vt(b,e,g)|0;if(!((c[53596]|0)==0|(j|0)==2)){Fv(0,145560,(e=i,i=i+1|0,i=i+7&-8,c[e>>2]=0,e)|0)|0;i=e}if((j|0)!=1){k=c[g>>2]|0;dc(k|0);i=f;return j|0}l=+(d|0);m=6.283185307179586/l;e=ux(b)|0;if((e|0)==0){k=c[g>>2]|0;dc(k|0);i=f;return j|0}else{n=0.0;o=e}while(1){p=l*+V(n);e=o+8|0;h[c[(c[e>>2]|0)+132>>2]>>3]=p;p=l*+W(n);h[(c[(c[e>>2]|0)+132>>2]|0)+8>>3]=p;a[(c[e>>2]|0)+119|0]=1;if((c[53568]|0)>2){wu(o,d)}e=vx(b,o)|0;if((e|0)==0){break}else{n=m+n;o=e}}k=c[g>>2]|0;dc(k|0);i=f;return j|0}function xt(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=i;i=i+1096|0;e=d|0;f=d+1024|0;g=d+1056|0;j=d+1080|0;k=d+1088|0;l=+h[21580];do{if((c[53566]|0)==0){h[21580]=+Gm(b);yt(b);m=b|0;n=ew(m,107080)|0;do{if((n|0)==0){o=1}else{p=a[n]|0;if((p<<24>>24|0)==0){o=1;break}else if((p<<24>>24|0)==75){if((Ya(n|0,106624)|0)==0){o=0;break}}else if((p<<24>>24|0)==109){if((Ya(n|0,106200)|0)==0){o=1;break}}p=$w(m)|0;Fv(0,105680,(q=i,i=i+16|0,c[q>>2]=n,c[q+8>>2]=p,q)|0)|0;i=q;o=1}}while(0);jr(b,g,0)|0;n=ew(m,112752)|0;a:do{if((n|0)==0){r=0}else{p=a[n]|0;do{if((p<<24>>24|0)==99){if((Ya(n|0,112296)|0)==0){r=1;break a}}else if((p<<24>>24|0)==115){if((Ya(n|0,111672)|0)==0){r=2;break a}if((Ya(n|0,111032)|0)==0){r=0;break a}}else if((p<<24>>24|0)==109){if((Ya(n|0,110368)|0)!=0){break}if((Wv(b,2,121896,0)|0)!=0){r=3;break a}s=$w(m)|0;Fv(0,109568,(q=i,i=i+8|0,c[q>>2]=s,q)|0)|0;i=q;Fv(3,108728,(q=i,i=i+1|0,i=i+7&-8,c[q>>2]=0,q)|0)|0;i=q;r=0;break a}else if((p<<24>>24|0)==0){r=0;break a}}while(0);p=$w(m)|0;Fv(0,107760,(q=i,i=i+16|0,c[q>>2]=n,c[q+8>>2]=p,q)|0)|0;i=q;r=0}}while(0);n=vv(b,0,f)|0;m=wv(b,-1,8)|0;c[53552]=m;p=(m|0)<0;do{if((n|0)==0){if(!((o|0)==0|p^1)){c[53552]=8;c[f+16>>2]=2;t=28;break}c[f+16>>2]=2;if((m|0)>-1){t=28;break}zt(b,o,r);lr(b,g)|0;s=e|0;do{if((c[53568]|0)>2&(c[53570]|0)!=0){u=ux(b)|0;if((u|0)==0){break}else{v=u}do{nb(s|0,116320,(q=i,i=i+8|0,h[q>>3]=+h[(c[(c[v+8>>2]|0)+132>>2]|0)+16>>3]*72.0,q)|0)|0;i=q;hw(v|0,c[53570]|0,s)|0;v=vx(b,v)|0;}while((v|0)!=0)}}while(0);Pt(b)}else{if(!p){t=28;break}c[53552]=8;t=28}}while(0);if((t|0)==28){p=fv(b,j,113264,k)|0;do{if((c[j>>2]|0)>1){m=0;do{n=c[p+(m<<2)>>2]|0;jv(n)|0;zt(n,o,r);lr(n,g)|0;qn(n,2);Pt(n);m=m+1|0;w=c[j>>2]|0;}while((m|0)<(w|0));if((a[k]|0)==0){x=0;y=w}else{m=jk(w)|0;a[m]=1;x=m;y=c[j>>2]|0}c[f+8>>2]=c[53552];c[f+20>>2]=x;c[f+12>>2]=1;rv(y,p,b,f)|0;if((x|0)==0){break}eF(x)}else{zt(b,o,r);lr(b,g)|0;Pt(b)}}while(0);$m(b);m=e|0;do{if((c[53568]|0)>2&(c[53570]|0)!=0){n=ux(b)|0;if((n|0)==0){break}else{z=n}do{nb(m|0,116320,(q=i,i=i+8|0,h[q>>3]=+h[(c[(c[z+8>>2]|0)+132>>2]|0)+16>>3]*72.0,q)|0)|0;i=q;hw(z|0,c[53570]|0,m)|0;z=vx(b,z)|0;}while((z|0)!=0)}}while(0);if((c[j>>2]|0)>0){m=0;do{n=c[p+(m<<2)>>2]|0;uu(n);s=n|0;Xx(s,139536)|0;Gx(b,s)|0;m=m+1|0;}while((m|0)<(c[j>>2]|0))}eF(p)}Xk(b)}else{h[21580]=72.0;yt(b);m=e|0;do{if((c[53568]|0)>2&(c[53570]|0)!=0){s=ux(b)|0;if((s|0)==0){break}else{A=s}do{nb(m|0,116320,(q=i,i=i+8|0,h[q>>3]=+h[(c[(c[A+8>>2]|0)+132>>2]|0)+16>>3]*72.0,q)|0)|0;i=q;hw(A|0,c[53570]|0,m)|0;A=vx(b,A)|0;}while((A|0)!=0)}}while(0);m=tt(b,1)|0;if((m|0)>=0){Uk(b,(m|0)==0|0);break}Fv(3,142592,(q=i,i=i+1|0,i=i+7&-8,c[q>>2]=0,q)|0)|0;i=q;i=d;return}}while(0);h[21580]=l;i=d;return}function yt(a){a=a|0;var d=0,f=0,g=0,i=0,j=0,k=0,l=0.0;qn(a,2);d=a|0;f=Em(d,Wv(a,0,105272,0)|0,2,2)|0;g=(Em(d,Wv(a,0,104896,0)|0,f,2)|0)&65535;b[(c[(Ix(d)|0)+8>>2]|0)+168>>1]=g;g=a+48|0;d=(c[(c[g>>2]|0)+8>>2]|0)+168|0;i=b[d>>1]|0;j=(i&65535)>>>0<10>>>0?i:10;b[d>>1]=j;d=j&65535;c[53568]=d;b[(c[(c[g>>2]|0)+8>>2]|0)+170>>1]=(f|0)<(d|0)?f:d;d=Lw(a)|0;c[53596]=Wv(a,1,104384,0)|0;f=Wv(a,1,103824,0)|0;g=ux(a)|0;if((g|0)!=0){j=g;do{g=j|0;Wx(g,141360,304,1)|0;Ym(j);i=jk((e[(c[(Hx(g)|0)+8>>2]|0)+168>>1]|0)<<3)|0;c[(c[j+8>>2]|0)+132>>2]=i;vn(j,c[(c[(Hx(g)|0)+8>>2]|0)+116>>2]&1);rt(c[53596]|0,f,j,d)|0;j=vx(a,j)|0;}while((j|0)!=0)}j=ux(a)|0;if((j|0)==0){return}else{k=j}do{j=mw(a,k)|0;if((j|0)!=0){d=j;do{j=d|0;Wx(j,103024,176,1)|0;Zm(d)|0;l=+Fm(j,c[53750]|0,1.0,1.0);h[(c[d+8>>2]|0)+128>>3]=l;d=ow(a,d)|0;}while((d|0)!=0)}k=vx(a,k)|0;}while((k|0)!=0);return}function zt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0;f=i;i=i+24|0;g=f|0;j=f+8|0;k=f+16|0;l=b|0;m=ew(l,136896)|0;do{if((m|0)==0){if((d|0)==1){c[53660]=200;break}else{c[53660]=(Lw(b)|0)*100|0;break}}else{c[53660]=Rb(m|0)|0}}while(0);m=ru(b,d)|0;if((m|0)<2|(c[53660]|0)<0){i=f;return}if((d|0)!=0){n=c[53568]|0;p=wt(b,m,(d|0)==2?0:2)|0;q=Em(l,Wv(b,0,114704,0)|0,2,0)|0;if((q|0)==0|(q|0)>2){Fv(0,113856,(r=i,i=i+8|0,c[r>>2]=114704,r)|0)|0;i=r;s=2}else{s=q}q=(p|0)==0;p=q?s|4:s;s=kk(n<<2)|0;t=s;u=kk(da(m<<3,n)|0)|0;c[t>>2]=u;a:do{if((c[53568]|0)>1){c[s+4>>2]=u+(m<<3);if((c[53568]|0)>2){v=2;w=u}else{break}while(1){c[t+(v<<2)>>2]=w+((da(v,m)|0)<<3);n=v+1|0;if((n|0)>=(c[53568]|0)){break a}v=n;w=c[t>>2]|0}}}while(0);if((a[213992]|0)!=0){w=c[o>>2]|0;v=c[53660]|0;x=+h[21657];gc(w|0,119480,(r=i,i=i+40|0,c[r>>2]=e,c[r+8>>2]=q&1,c[r+16>>2]=p&3,c[r+24>>2]=v,h[r+32>>3]=x,r)|0)|0;i=r;Ma(118760,15,1,w|0)|0;ym();Ma(117848,13,1,w|0)|0}w=At(b,m,j,d,e,k)|0;if((a[213992]|0)!=0){d=c[o>>2]|0;x=+zm();gc(d|0,116936,(r=i,i=i+16|0,c[r>>2]=m,h[r+8>>3]=x,r)|0)|0;i=r}do{if((nu(w,m,c[j>>2]|0,t,c[k>>2]|0,c[53568]|0,p,e,c[53660]|0)|0)<0){Fv(3,116016,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r}else{d=ux(b)|0;if((d|0)==0){break}else{y=d}do{d=y+8|0;v=c[d>>2]|0;q=c[v+120>>2]|0;do{if((c[53568]|0)>0){h[c[v+132>>2]>>3]=+h[(c[t>>2]|0)+(q<<3)>>3];if((c[53568]|0)>1){z=1}else{break}do{h[(c[(c[d>>2]|0)+132>>2]|0)+(z<<3)>>3]=+h[(c[t+(z<<2)>>2]|0)+(q<<3)>>3];z=z+1|0;}while((z|0)<(c[53568]|0))}}while(0);y=vx(b,y)|0;}while((y|0)!=0)}}while(0);Qr(w);eF(c[t>>2]|0);eF(s);eF(c[k>>2]|0);i=f;return}do{if((e|0)==2){k=At(b,m,g,0,2,0)|0;s=Cs(k,m)|0;if((m|0)>0){t=b+8|0;w=0;do{y=s+(w<<2)|0;z=0;do{h[(c[(c[(c[t>>2]|0)+152>>2]|0)+(w<<2)>>2]|0)+(z<<3)>>3]=+(c[(c[y>>2]|0)+(z<<2)>>2]|0);z=z+1|0;}while((z|0)<(m|0));w=w+1|0;}while((w|0)<(m|0))}eF(c[s>>2]|0);eF(s);Qr(k);}else if((e|0)==1){if((yr(b,m)|0)!=0){break}w=$w(l)|0;Fv(0,133960,(r=i,i=i+8|0,c[r>>2]=w,r)|0)|0;i=r;Fv(3,131976,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;Fv(3,129712,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;Fv(3,126424,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;Gu(b,m)}else{Gu(b,m);if((e|0)!=3){break}w=ux(b)|0;if((w|0)==0){break}t=b+8|0;z=w;do{w=mw(b,z)|0;if((w|0)!=0){y=w;do{w=c[y>>2]&3;p=(c[c[((w|0)==3?y:y+32|0)+28>>2]>>2]|0)>>>4;j=(c[c[((w|0)==2?y:y-32|0)+28>>2]>>2]|0)>>>4;if((p|0)!=(j|0)){x=+h[(c[y+8>>2]|0)+136>>3];h[(c[(c[(c[t>>2]|0)+152>>2]|0)+(j<<2)>>2]|0)+(p<<3)>>3]=x;h[(c[(c[(c[t>>2]|0)+152>>2]|0)+(p<<2)>>2]|0)+(j<<3)>>3]=x}y=ow(b,y)|0;}while((y|0)!=0)}z=vx(b,z)|0;}while((z|0)!=0)}}while(0);xu(b,m);yu(b,m);if((a[213992]|0)!=0){l=c[53660]|0;x=+h[21657];gc(c[o>>2]|0,123944,(r=i,i=i+24|0,c[r>>2]=e,c[r+8>>2]=l,h[r+16>>3]=x,r)|0)|0;i=r;ym()}zu(b,m);i=f;return}function At(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0.0,ia=0.0,ja=0,ka=0,la=0,ma=0,na=0;j=Mw(a)|0;k=Lk()|0;if((f|0)==2){l=0;m=0}else{f=Wv(a,2,121896,0)|0;l=(c[53750]|0)!=0|0;m=(f|0)!=0}f=(e&-2|0)==2;e=kk(b<<4)|0;n=e;o=kk(b<<2)|0;p=o;q=(j<<1)+b<<2;j=kk(q)|0;r=m|f;if(r){s=kk(q)|0}else{s=0}t=(l|0)!=0;if(t){u=kk(q)|0}else{u=0}q=ux(a)|0;a:do{if((q|0)==0){v=u;w=s;x=0}else{l=u;y=0;z=q;A=s;B=j;C=0;while(1){Mk(k);if((c[(c[z+8>>2]|0)+120>>2]|0)!=(y|0)){break}c[p+(y<<2)>>2]=z;D=B+4|0;E=n+(y<<4)+4|0;c[E>>2]=B;if(r){c[n+(y<<4)+8>>2]=A;F=A+4|0}else{c[n+(y<<4)+8>>2]=0;F=A}if(t){c[n+(y<<4)+12>>2]=l;G=l+4|0}else{c[n+(y<<4)+12>>2]=0;G=l}H=rw(a,z)|0;if((H|0)==0){I=G;J=1;K=F;L=D;M=C}else{N=n+(y<<4)+12|0;O=n+(y<<4)+8|0;P=G;Q=H;H=1;R=1;S=F;T=D;D=C;while(1){U=Q;V=c[U>>2]&3;W=Q-32|0;X=c[((V|0)==2?Q:W)+28>>2]|0;Y=Q+32|0;Z=c[((V|0)==3?Q:Y)+28>>2]|0;do{if((X|0)==(Z|0)){_=D;$=T;aa=S;ba=R;ca=H;da=P}else{V=c[(c[Z+8>>2]|0)+120>>2]|0;ea=c[(c[X+8>>2]|0)+120>>2]|0;fa=(V|0)>(ea|0);ga=Ok(k,fa?ea:V,fa?V:ea,R)|0;if((ga|0)!=(R|0)){if(t){ea=(c[N>>2]|0)+(ga<<2)|0;g[ea>>2]=+h[(c[Q+8>>2]|0)+128>>3]+ +g[ea>>2]}if(!m){_=D;$=T;aa=S;ba=R;ca=H;da=P;break}ea=(c[O>>2]|0)+(ga<<2)|0;ha=+h[(c[Q+8>>2]|0)+136>>3];ia=+(~~+g[ea>>2]|0);g[ea>>2]=ha>ia?ha:ia;_=D;$=T;aa=S;ba=R;ca=H;da=P;break}ea=c[U>>2]&3;ga=c[((ea|0)==3?Q:Y)+28>>2]|0;if((ga|0)==(z|0)){ja=c[((ea|0)==2?Q:W)+28>>2]|0}else{ja=ga}ga=D+1|0;ea=R+1|0;V=T+4|0;c[T>>2]=c[(c[ja+8>>2]|0)+120>>2];if(t){g[P>>2]=+h[(c[Q+8>>2]|0)+128>>3];ka=P+4|0}else{ka=P}do{if(m){g[S>>2]=+h[(c[Q+8>>2]|0)+136>>3];la=S+4|0}else{if(!f){la=S;break}g[S>>2]=1.0;la=S+4|0}}while(0);_=ga;$=V;aa=la;ba=ea;ca=H+1|0;da=ka}}while(0);W=sw(a,Q,z)|0;if((W|0)==0){I=da;J=ca;K=aa;L=$;M=_;break}else{P=da;Q=W;H=ca;R=ba;S=aa;T=$;D=_}}}c[n+(y<<4)>>2]=J;c[c[E>>2]>>2]=y;D=vx(a,z)|0;if((D|0)==0){v=I;w=K;x=M;break a}else{l=I;y=y+1|0;z=D;A=K;B=L;C=M}}cc(121096,120256,895,170408);return 0}}while(0);M=(x|0)/2|0;do{if((M|0)!=(Mw(a)|0)){x=(M<<1)+b<<2;L=mk(c[e+4>>2]|0,x)|0;if(m){ma=mk(c[e+8>>2]|0,x)|0}else{ma=w}if(t){na=mk(c[e+12>>2]|0,x)|0}else{na=v}if((b|0)<=0){break}if(m){if(t){x=na;K=0;I=ma;J=L;while(1){_=c[n+(K<<4)>>2]|0;c[n+(K<<4)+4>>2]=J;c[n+(K<<4)+8>>2]=I;c[n+(K<<4)+12>>2]=x;$=K+1|0;if(($|0)<(b|0)){x=x+(_<<2)|0;K=$;I=I+(_<<2)|0;J=J+(_<<2)|0}else{break}}}else{J=0;I=ma;K=L;while(1){x=c[n+(J<<4)>>2]|0;c[n+(J<<4)+4>>2]=K;c[n+(J<<4)+8>>2]=I;_=J+1|0;if((_|0)<(b|0)){J=_;I=I+(x<<2)|0;K=K+(x<<2)|0}else{break}}}}else{if(t){K=na;I=0;J=L;while(1){x=c[n+(I<<4)>>2]|0;c[n+(I<<4)+4>>2]=J;c[n+(I<<4)+12>>2]=K;_=I+1|0;if((_|0)<(b|0)){K=K+(x<<2)|0;I=_;J=J+(x<<2)|0}else{break}}}else{J=0;I=L;while(1){K=c[n+(J<<4)>>2]|0;c[n+(J<<4)+4>>2]=I;x=J+1|0;if((x|0)<(b|0)){J=x;I=I+(K<<2)|0}else{break}}}}}}while(0);c[d>>2]=M;if((i|0)==0){eF(o);Nk(k);return n|0}else{c[i>>2]=p;Nk(k);return n|0}return 0}function Bt(b,d,e){b=b|0;d=+d;e=+e;var f=0,g=0,i=0,j=0,k=0,l=0;f=b+8|0;b=(c[f>>2]|0)+32|0;h[b>>3]=+h[b>>3]-d;b=(c[f>>2]|0)+40|0;h[b>>3]=+h[b>>3]-e;b=(c[f>>2]|0)+16|0;h[b>>3]=+h[b>>3]-d;b=(c[f>>2]|0)+24|0;h[b>>3]=+h[b>>3]-e;b=c[f>>2]|0;g=c[b+12>>2]|0;do{if((g|0)==0){i=b}else{if((a[g+81|0]|0)==0){i=b;break}j=g+56|0;h[j>>3]=+h[j>>3]-d;j=(c[(c[f>>2]|0)+12>>2]|0)+64|0;h[j>>3]=+h[j>>3]-e;i=c[f>>2]|0}}while(0);if((c[i+172>>2]|0)<1){return}else{k=1;l=i}while(1){Bt(c[(c[l+176>>2]|0)+(k<<2)>>2]|0,d,e);i=c[f>>2]|0;if((k|0)<(c[i+172>>2]|0)){k=k+1|0;l=i}else{break}}return}function Ct(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0;f=i;i=i+64|0;g=f|0;j=f+32|0;k=a|0;do{if((Za($w(k)|0,86848,7)|0)==0){l=g;m=g+8|0;n=g+24|0;o=ac(fw(k,e)|0,98144,(p=i,i=i+32|0,c[p>>2]=g,c[p+8>>2]=m,c[p+16>>2]=g+16,c[p+24>>2]=n,p)|0)|0;i=p;if((o|0)!=4){break}q=+h[m>>3];r=+h[n>>3];if(q>r){h[m>>3]=r;h[n>>3]=q}n=j;c[n>>2]=c[l>>2];c[n+4>>2]=c[l+4>>2];c[n+8>>2]=c[l+8>>2];c[n+12>>2]=c[l+12>>2];c[n+16>>2]=c[l+16>>2];c[n+20>>2]=c[l+20>>2];c[n+24>>2]=c[l+24>>2];c[n+28>>2]=c[l+28>>2];Wx(k,139536,272,1)|0;l=(c[a+8>>2]|0)+16|0;c[l>>2]=c[n>>2];c[l+4>>2]=c[n+4>>2];c[l+8>>2]=c[n+8>>2];c[l+12>>2]=c[n+12>>2];c[l+16>>2]=c[n+16>>2];c[l+20>>2]=c[n+20>>2];c[l+24>>2]=c[n+24>>2];c[l+28>>2]=c[n+28>>2];n=b+8|0;l=(c[n>>2]|0)+172|0;m=c[l>>2]|0;o=m+1|0;c[l>>2]=o;l=c[n>>2]|0;p=c[l+176>>2]|0;if((p|0)==0){s=jk((m<<2)+8|0)|0}else{s=lk(p,m+2|0,4,c[l+172>>2]|0)|0}c[(c[n>>2]|0)+176>>2]=s;c[(c[(c[n>>2]|0)+176>>2]|0)+(o<<2)>>2]=a;Rj(a);ut(a,d,e);i=f;return}}while(0);s=sy(a)|0;if((s|0)==0){i=f;return}else{t=s}do{Ct(t,b,d,e);t=ty(t)|0;}while((t|0)!=0);i=f;return}function Dt(a,d,e){a=a|0;d=d|0;e=e|0;var f=0;e=jk(64)|0;a=e+8|0;f=d+8|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];c[a+16>>2]=c[f+16>>2];c[a+20>>2]=c[f+20>>2];c[a+24>>2]=c[f+24>>2];c[a+28>>2]=c[f+28>>2];c[a+32>>2]=c[f+32>>2];c[a+36>>2]=c[f+36>>2];c[a+40>>2]=c[f+40>>2];c[a+44>>2]=c[f+44>>2];f=c[d+56>>2]|0;c[e+56>>2]=f;b[(c[f+8>>2]|0)+168>>1]=1;return e|0}function Et(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function Ft(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[b>>2]|0;a=c[d>>2]|0;if(e>>>0>a>>>0){f=1;return f|0}if(e>>>0<a>>>0){f=-1;return f|0}a=c[b+24>>2]|0;e=c[d+24>>2]|0;if(a>>>0>e>>>0){f=1;return f|0}if(a>>>0<e>>>0){f=-1;return f|0}e=~~(+h[b+8>>3]- +h[d+8>>3]);if((e|0)!=0){f=e;return f|0}e=~~(+h[b+16>>3]- +h[d+16>>3]);if((e|0)!=0){f=e;return f|0}e=~~(+h[b+32>>3]- +h[d+32>>3]);if((e|0)!=0){f=e;return f|0}f=~~(+h[b+40>>3]- +h[d+40>>3]);return f|0}function Gt(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0;g=i;i=i+8|0;h=e+8|0;j=b[(c[h>>2]|0)+168>>1]|0;k=j<<16>>16;if(!(j<<16>>16!=1&(a[215376]|0)==0)){l=g|0;c[l>>2]=e;m=+(f|0);im(d,l,0,1,m,m,11832);if((c[(c[h>>2]|0)+96>>2]|0)!=0){l=Hx(c[((c[e>>2]&3|0)==3?e:e+32|0)+28>>2]|0)|0;_m(l,c[(c[h>>2]|0)+96>>2]|0)}km(e);i=g;return}h=kk(k<<2)|0;l=h;n=j<<16>>16>0;do{if(n){j=0;o=e;while(1){c[l+(j<<2)>>2]=o;p=j+1|0;if((p|0)<(k|0)){j=p;o=c[(c[o+8>>2]|0)+172>>2]|0}else{break}}m=+(f|0);im(d,l,0,k,m,m,11832);if(n){q=0}else{break}do{o=c[l+(q<<2)>>2]|0;j=o+8|0;if((c[(c[j>>2]|0)+96>>2]|0)!=0){p=Hx(c[((c[o>>2]&3|0)==3?o:o+32|0)+28>>2]|0)|0;_m(p,c[(c[j>>2]|0)+96>>2]|0)}km(o);q=q+1|0;}while((q|0)<(k|0))}else{m=+(f|0);im(d,l,0,k,m,m,11832)}}while(0);eF(h);i=g;return}
-
-
-
-function Ht(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,O=0.0,P=0.0;f=i;i=i+64|0;j=f|0;k=pl(b)|0;if((k|0)==4){l=b+8|0;m=jk(8)|0;n=m;c[m+4>>2]=4;o=jk(64)|0;p=m;c[p>>2]=o;m=c[l>>2]|0;q=+h[m+16>>3];r=+h[m+24>>3];s=-0.0- +h[m+88>>3];if((a[d+8|0]|0)==0){t=d|0;u=d+4|0;v=r- +h[m+80>>3]*+g[u>>2];h[o>>3]=q+ +g[t>>2]*s;h[o+8>>3]=v;w=c[p>>2]|0;x=c[l>>2]|0;v=r+ +h[x+80>>3]*+g[u>>2];h[w+16>>3]=q- +h[x+88>>3]*+g[t>>2];h[w+24>>3]=v;w=c[p>>2]|0;x=c[l>>2]|0;v=r+ +h[x+80>>3]*+g[u>>2];h[w+32>>3]=q+ +h[x+96>>3]*+g[t>>2];h[w+40>>3]=v;w=c[p>>2]|0;x=c[l>>2]|0;v=r- +h[x+80>>3]*+g[u>>2];h[w+48>>3]=q+ +h[x+96>>3]*+g[t>>2];h[w+56>>3]=v;y=n;i=f;return y|0}else{w=d|0;t=d+4|0;v=r+(-0.0- +h[m+80>>3]- +g[t>>2]);h[o>>3]=q+(s- +g[w>>2]);h[o+8>>3]=v;o=c[p>>2]|0;m=c[l>>2]|0;v=r+(+h[m+80>>3]+ +g[t>>2]);h[o+16>>3]=q+(-0.0- +h[m+88>>3]- +g[w>>2]);h[o+24>>3]=v;o=c[p>>2]|0;m=c[l>>2]|0;v=r+(+h[m+80>>3]+ +g[t>>2]);h[o+32>>3]=q+(+h[m+96>>3]+ +g[w>>2]);h[o+40>>3]=v;o=c[p>>2]|0;p=c[l>>2]|0;v=r+(-0.0- +h[p+80>>3]- +g[t>>2]);h[o+48>>3]=q+(+h[p+96>>3]+ +g[w>>2]);h[o+56>>3]=v;y=n;i=f;return y|0}}else if((k|0)==2){n=b+8|0;o=c[(c[n>>2]|0)+12>>2]|0;v=+h[o+16>>3];q=+h[o+24>>3];r=+h[o+32>>3];s=+h[o+40>>3];o=jk(8)|0;w=o;c[o+4>>2]=4;p=jk(64)|0;t=o;c[t>>2]=p;o=c[n>>2]|0;z=+h[o+16>>3];A=+h[o+24>>3];o=d|0;B=+g[o>>2];if((a[d+8|0]|0)==0){n=d+4|0;C=A+q*+g[n>>2];h[p>>3]=z+v*B;h[p+8>>3]=C;l=c[t>>2]|0;C=A+s*+g[n>>2];h[l+16>>3]=z+v*+g[o>>2];h[l+24>>3]=C;l=c[t>>2]|0;C=A+s*+g[n>>2];h[l+32>>3]=z+r*+g[o>>2];h[l+40>>3]=C;l=c[t>>2]|0;C=A+q*+g[n>>2];h[l+48>>3]=z+r*+g[o>>2];h[l+56>>3]=C;y=w;i=f;return y|0}else{l=d+4|0;C=A+(q- +g[l>>2]);h[p>>3]=z+(v-B);h[p+8>>3]=C;p=c[t>>2]|0;C=A+(s+ +g[l>>2]);h[p+16>>3]=z+(v- +g[o>>2]);h[p+24>>3]=C;p=c[t>>2]|0;C=A+(s+ +g[l>>2]);h[p+32>>3]=z+(r+ +g[o>>2]);h[p+40>>3]=C;p=c[t>>2]|0;C=A+(q- +g[l>>2]);h[p+48>>3]=z+(r+ +g[o>>2]);h[p+56>>3]=C;y=w;i=f;return y|0}}else if((k|0)==1|(k|0)==3){k=jk(8)|0;w=k;p=b+8|0;b=c[p>>2]|0;o=c[b+12>>2]|0;do{if(e<<24>>24==0){l=c[o+8>>2]|0;if((l|0)>2){D=0.0;E=+g[d>>2];F=+g[d+4>>2];G=l;H=c[o+44>>2]|0;I=1;break}else{D=+wn()*.01;E=0.0;F=0.0;G=8;H=0;I=0;break}}else{C=+h[b+88>>3];r=-0.0-C;z=+h[b+80>>3];q=z*-.5;h[j>>3]=r;h[j+8>>3]=q;h[j+16>>3]=C;h[j+24>>3]=q;q=z*.5;h[j+32>>3]=C;h[j+40>>3]=q;h[j+48>>3]=r;h[j+56>>3]=q;D=0.0;E=0.0;F=0.0;G=4;H=j|0;I=1}}while(0);c[k+4>>2]=G;j=k;c[j>>2]=jk(G<<4)|0;if((G|0)<=0){y=w;i=f;return y|0}q=+(G|0);k=d+8|0;b=d|0;o=d+4|0;d=(G|0)==4;r=-0.0-E;C=-0.0-F;if((I|0)==0){I=0;while(1){z=D+ +(I|0)*6.283185307179586/q;A=+V(z);s=+W(z);if((a[k]|0)==0){e=c[p>>2]|0;J=A*+g[b>>2]*(+h[e+88>>3]+ +h[e+96>>3]);K=+h[e+80>>3]*s*+g[o>>2]}else{e=c[p>>2]|0;J=A*(+h[e+88>>3]+ +h[e+96>>3]+ +g[b>>2]);K=s*(+h[e+80>>3]+ +g[o>>2])}e=G-I-1|0;h[(c[j>>2]|0)+(e<<4)>>3]=J*.5+ +h[(c[p>>2]|0)+16>>3];h[(c[j>>2]|0)+(e<<4)+8>>3]=K*.5+ +h[(c[p>>2]|0)+24>>3];e=I+1|0;if((e|0)<(G|0)){I=e}else{y=w;break}}i=f;return y|0}else{L=0}while(1){do{if((a[k]|0)==0){M=F*+h[H+(L<<4)+8>>3];N=E*+h[H+(L<<4)>>3]}else{if(!d){K=+h[H+(L<<4)>>3];J=+h[H+(L<<4)+8>>3];q=+T(K*K+J*J);M=J*(F/q+1.0);N=K*(E/q+1.0);break}if((L|0)==2){O=C;P=r}else if((L|0)==1){O=F;P=r}else if((L|0)==3){O=C;P=E}else if((L|0)==0){O=F;P=E}else{O=0.0;P=0.0}M=O+ +h[H+(L<<4)+8>>3];N=P+ +h[H+(L<<4)>>3]}}while(0);I=G-L-1|0;h[(c[j>>2]|0)+(I<<4)>>3]=N+ +h[(c[p>>2]|0)+16>>3];h[(c[j>>2]|0)+(I<<4)+8>>3]=M+ +h[(c[p>>2]|0)+24>>3];I=L+1|0;if((I|0)<(G|0)){L=I}else{y=w;break}}i=f;return y|0}else{y=0;i=f;return y|0}return 0}function It(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;g=i;i=i+8|0;f=g|0;j=f;k=i;i=i+16|0;l=i;i=i+16|0;m=c[b>>2]&3;n=(c[((m|0)==3?b:b+32|0)+28>>2]|0)+8|0;o=c[n>>2]|0;p=c[b+8>>2]|0;q=+h[o+24>>3]+ +h[p+24>>3];h[k>>3]=+h[o+16>>3]+ +h[p+16>>3];h[k+8>>3]=q;o=(c[((m|0)==2?b:b-32|0)+28>>2]|0)+8|0;b=c[o>>2]|0;q=+h[b+24>>3]+ +h[p+64>>3];h[l>>3]=+h[b+16>>3]+ +h[p+56>>3];h[l+8>>3]=q;if((e|0)==0){r=-1111;s=-1111;t=KB(d,k,s,l,r,j)|0;u=a;v=f|0;w=c[v>>2]|0;x=f+4|0;y=c[x>>2]|0;z=u|0;c[z>>2]=w;A=u+4|0;c[A>>2]=y;i=g;return}r=c[(c[o>>2]|0)+284>>2]|0;s=c[(c[n>>2]|0)+284>>2]|0;t=KB(d,k,s,l,r,j)|0;u=a;v=f|0;w=c[v>>2]|0;x=f+4|0;y=c[x>>2]|0;z=u|0;c[z>>2]=w;A=u+4|0;c[A>>2]=y;i=g;return}function Jt(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;h=i;i=i+8|0;j=h|0;k=j;l=i;i=i+8|0;m=i;i=i+32|0;n=i;i=i+16|0;p=i;i=i+16|0;q=(c[b+8>>2]|0)+144|0;r=c[q>>2]|0;s=c[q+4>>2]|0;c[j>>2]=r;c[j+4>>2]=s;j=r;r=n;q=j;c[r>>2]=c[q>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[r+12>>2]=c[q+12>>2];q=p;r=j+(s-1<<4)|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];do{if(g<<24>>24==0){t=-1111;u=-1111;v=8}else{if((f|0)>0){w=0;x=-1111;y=-1111}else{v=9;break}while(1){if((x|0)==-1111){r=(LB(c[e+(w<<2)>>2]|0,n)|0)==0;z=r?-1111:w}else{z=x}if((y|0)==-1111){r=(LB(c[e+(w<<2)>>2]|0,p)|0)==0;A=r?-1111:w}else{A=y}r=w+1|0;if((r|0)<(f|0)){w=r;x=z;y=A}else{t=A;u=z;v=8;break}}}}while(0);do{if((v|0)==8){if((f|0)>0){B=0;C=0}else{v=9;break}while(1){if((C|0)==(u|0)|(C|0)==(t|0)){D=B}else{D=(c[(c[e+(C<<2)>>2]|0)+4>>2]|0)+B|0}z=C+1|0;if((z|0)<(f|0)){B=D;C=z}else{break}}z=kk(D<<5)|0;A=0;y=0;while(1){do{if((y|0)==(u|0)|(y|0)==(t|0)){E=A}else{x=e+(y<<2)|0;w=c[x>>2]|0;g=c[w+4>>2]|0;if((g|0)>0){F=0;G=A;H=w;I=g}else{E=A;break}while(1){g=F+1|0;w=z+(G<<5)|0;r=(c[H>>2]|0)+(F<<4)|0;c[w>>2]=c[r>>2];c[w+4>>2]=c[r+4>>2];c[w+8>>2]=c[r+8>>2];c[w+12>>2]=c[r+12>>2];r=z+(G<<5)+16|0;w=(c[c[x>>2]>>2]|0)+(((g|0)<(I|0)?g:0)<<4)|0;c[r>>2]=c[w>>2];c[r+4>>2]=c[w+4>>2];c[r+8>>2]=c[w+8>>2];c[r+12>>2]=c[w+12>>2];w=G+1|0;r=c[x>>2]|0;q=c[r+4>>2]|0;if((g|0)<(q|0)){F=g;G=w;H=r;I=q}else{E=w;break}}}}while(0);x=y+1|0;if((x|0)<(f|0)){A=E;y=x}else{break}}if((E|0)==(D|0)){J=z;K=D;break}cc(151464,108624,79,170376)}}while(0);if((v|0)==9){J=kk(0)|0;K=0}vF(m|0,0,32)|0;if((MB(J,K,k,m|0,l)|0)<0){m=b;k=$w(c[((c[m>>2]&3|0)==3?b:b+32|0)+28>>2]|0)|0;K=$w(c[((c[m>>2]&3|0)==2?b:b-32|0)+28>>2]|0)|0;Fv(1,127880,(L=i,i=i+16|0,c[L>>2]=k,c[L+8>>2]=K,L)|0)|0;i=L;i=h;return}if((d[213992]|0)>>>0>1>>>0){K=c[o>>2]|0;k=b;m=$w(c[((c[k>>2]&3|0)==3?b:b+32|0)+28>>2]|0)|0;v=b-32|0;D=$w(c[((c[k>>2]&3|0)==2?b:v)+28>>2]|0)|0;gc(K|0,159536,(L=i,i=i+16|0,c[L>>2]=m,c[L+8>>2]=D,L)|0)|0;i=L;M=k;N=v}else{M=b;N=b-32|0}cm(b,c[((c[M>>2]&3|0)==2?b:N)+28>>2]|0,c[l>>2]|0,c[l+4>>2]|0,11832);eF(J);nm(a,b,n,p);i=h;return}function Kt(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0;f=i;i=i+96|0;g=f|0;j=f+64|0;k=f+80|0;pr(k,a);l=j;m=k;c[l>>2]=c[m>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];m=ux(a)|0;if((m|0)!=0){l=m;do{m=mw(a,l)|0;if((m|0)!=0){k=m;do{yl(k);k=ow(a,k)|0;}while((k|0)!=0)}l=vx(a,l)|0;}while((l|0)!=0)}l=$g(28664,c[43330]|0)|0;k=ux(a)|0;if((k|0)!=0){m=g;n=g+8|0;o=g+16|0;p=g+24|0;q=g+32|0;r=g+40|0;s=g+48|0;t=g+56|0;g=l|0;u=k;do{k=mw(a,u)|0;if((k|0)!=0){v=k;do{k=c[v>>2]&3;w=c[((k|0)==3?v:v+32|0)+28>>2]|0;x=c[((k|0)==2?v:v-32|0)+28>>2]|0;do{if(w>>>0<x>>>0){k=c[v+8>>2]|0;y=+h[k+24>>3];z=+h[k+16>>3];A=+h[k+64>>3];B=+h[k+56>>3];C=x;D=w}else{k=c[v+8>>2]|0;if(w>>>0>x>>>0){y=+h[k+64>>3];z=+h[k+56>>3];A=+h[k+24>>3];B=+h[k+16>>3];C=w;D=x;break}E=+h[k+56>>3];F=+h[k+64>>3];G=+h[k+16>>3];H=+h[k+24>>3];if(G<E){y=H;z=G;A=F;B=E;C=w;D=w;break}if(G>E){y=F;z=E;A=H;B=G;C=w;D=w;break}if(H<F){y=H;z=G;A=F;B=E;C=w;D=w;break}k=H>F;y=k?F:H;z=k?E:G;A=H;B=G;C=w;D=w}}while(0);c[n>>2]=D;h[o>>3]=z;h[p>>3]=y;c[q>>2]=C;h[r>>3]=B;h[s>>3]=A;c[t>>2]=v;w=c[(Hc[c[g>>2]&63](l,m,1)|0)+56>>2]|0;if((w|0)!=(v|0)){x=w+8|0;w=(c[x>>2]|0)+168|0;b[w>>1]=(b[w>>1]|0)+1;c[(c[v+8>>2]|0)+172>>2]=c[(c[x>>2]|0)+172>>2];c[(c[x>>2]|0)+172>>2]=v}v=ow(a,v)|0;}while((v|0)!=0)}u=vx(a,u)|0;}while((u|0)!=0)}Vg(l)|0;if((Hc[d&63](a,j,e)|0)!=0){I=1;i=f;return I|0}c[53522]=1;I=0;i=f;return I|0}function Lt(a,b){a=a|0;b=b|0;return Kt(a,4,b)|0}function Mt(e,f,j){e=e|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0;k=i;i=i+120|0;l=k|0;m=k+8|0;n=k+16|0;p=k+32|0;q=k+48|0;r=k+56|0;s=k+72|0;t=k+88|0;u=k+104|0;v=(c[53566]|0)>1;do{if((j|0)>5){w=jk((Lw(e)|0)<<2)|0;x=w;y=ux(e)|0;if((y|0)==0){z=0}else{A=(j|0)==8|0;B=0;C=y;while(1){y=Ht(C,f,A)|0;D=(c[C+8>>2]|0)+284|0;if((y|0)==0){c[D>>2]=-1111;E=B}else{c[D>>2]=B;c[x+(B<<2)>>2]=y;E=B+1|0}y=vx(e,C)|0;if((y|0)==0){z=E;break}else{B=E;C=y}}}if((w|0)==0){F=0;G=0;H=z;I=0;J=0;break}C=Hs(x,z)|0;B=(j|0)==8;if((C|0)!=0){if(B){F=C;G=0;H=z;I=x;J=1;break}F=C;G=IB(x,z)|0;H=z;I=x;J=1;break}if(B){Fv(0,97328,(K=i,i=i+1|0,i=i+7&-8,c[K>>2]=0,K)|0)|0;i=K;F=0;G=0;H=z;I=x;J=1;break}else{L=+g[f+4>>2];Fv(0,91824,(K=i,i=i+16|0,h[K>>3]=+g[f>>2],h[K+8>>3]=L,K)|0)|0;i=K;F=0;G=0;H=z;I=x;J=1;break}}else{F=0;G=0;H=0;I=0;J=0}}while(0);if((a[213992]|0)!=0){z=c[o>>2]|0;do{if((F|0)!=0&(j|0)==8){M=81792}else{if((G|0)==0){M=159792;break}M=(j|0)==10?168024:163872}}while(0);gc(z|0,86592,(K=i,i=i+8|0,c[K>>2]=M,K)|0)|0;i=K}M=(G|0)!=0;do{if(M){z=ux(e)|0;if((z|0)==0){break}F=q;f=r|0;E=r+8|0;B=s|0;C=s+8|0;A=z;do{z=mw(e,A)|0;if((z|0)!=0){y=z;do{z=c[y+8>>2]|0;D=c[y>>2]&3;N=(c[((D|0)==3?y:y+32|0)+28>>2]|0)+8|0;O=c[N>>2]|0;L=+h[O+24>>3]+ +h[z+24>>3];h[f>>3]=+h[O+16>>3]+ +h[z+16>>3];h[E>>3]=L;O=(c[((D|0)==2?y:y-32|0)+28>>2]|0)+8|0;D=c[O>>2]|0;L=+h[D+24>>3]+ +h[z+64>>3];h[B>>3]=+h[D+16>>3]+ +h[z+56>>3];h[C>>3]=L;KB(G,r,c[(c[N>>2]|0)+284>>2]|0,s,c[(c[O>>2]|0)+284>>2]|0,F)|0;O=c[q+4>>2]|0;N=z+144|0;c[N>>2]=c[q>>2];c[N+4>>2]=O;y=ow(e,y)|0;}while((y|0)!=0)}A=vx(e,A)|0;}while((A|0)!=0)}}while(0);q=ux(e)|0;if((q|0)==0){P=0}else{s=t|0;r=t+8|0;A=u|0;F=u+8|0;C=e+48|0;B=(j|0)==10;E=n;f=p;x=m;w=c[o>>2]|0;y=l|0;O=l+4|0;N=0;z=q;while(1){q=mw(e,z)|0;if((q|0)==0){Q=N}else{D=z+8|0;R=N;S=q;while(1){q=c[((c[S>>2]&3|0)==2?S:S-32|0)+28>>2]|0;T=S+8|0;U=c[T>>2]|0;do{if(v){if((c[U+8>>2]|0)==0){V=33;break}W=c[D>>2]|0;L=+h[W+24>>3]+ +h[U+24>>3];h[s>>3]=+h[W+16>>3]+ +h[U+16>>3];h[r>>3]=L;W=c[q+8>>2]|0;X=c[T>>2]|0;L=+h[W+24>>3]+ +h[X+64>>3];h[A>>3]=+h[W+16>>3]+ +h[X+56>>3];h[F>>3]=L;nm(e,S,t,u);Y=R}else{V=33}}while(0);do{if((V|0)==33){V=0;T=b[U+168>>1]|0;X=T<<16>>16;if(T<<16>>16==0){Y=R;break}if((z|0)==(q|0)){if((R|0)==0){T=jk(96)|0;c[T+84>>2]=jk(((Lw(e)|0)<<5)+11520|0)|0;Z=T}else{Z=R}Gt(Z,S,c[(c[(c[C>>2]|0)+8>>2]|0)+236>>2]|0);Y=Z;break}if(!M){ll(e,S,j,11832);Y=R;break}T=(a[215376]|0)!=0?1:X;if((T|0)>0){_=0;$=S}else{Y=R;break}while(1){if(B){Jt(e,$,I,H,1);aa=$+8|0}else{X=$+8|0;W=(c[X>>2]|0)+144|0;ba=c[W>>2]|0;ca=c[W+4>>2]|0;c[m>>2]=ba;c[m+4>>2]=ca;W=ba;ba=W;c[E>>2]=c[ba>>2];c[E+4>>2]=c[ba+4>>2];c[E+8>>2]=c[ba+8>>2];c[E+12>>2]=c[ba+12>>2];ba=W+(ca-1<<4)|0;c[f>>2]=c[ba>>2];c[f+4>>2]=c[ba+4>>2];c[f+8>>2]=c[ba+8>>2];c[f+12>>2]=c[ba+12>>2];ZB(x,l);ba=$;if((d[213992]|0)>>>0>1>>>0){ca=$w(c[((c[ba>>2]&3|0)==3?$:$+32|0)+28>>2]|0)|0;W=$-32|0;da=$w(c[((c[ba>>2]&3|0)==2?$:W)+28>>2]|0)|0;gc(w|0,154792,(K=i,i=i+16|0,c[K>>2]=ca,c[K+8>>2]=da,K)|0)|0;i=K;ea=W}else{ea=$-32|0}cm($,c[((c[ba>>2]&3|0)==2?$:ea)+28>>2]|0,c[y>>2]|0,c[O>>2]|0,11832);nm(e,$,n,p);aa=X}X=_+1|0;if((X|0)<(T|0)){_=X;$=c[(c[aa>>2]|0)+172>>2]|0}else{Y=R;break}}}}while(0);q=ow(e,S)|0;if((q|0)==0){Q=Y;break}else{R=Y;S=q}}}S=vx(e,z)|0;if((S|0)==0){P=Q;break}else{N=Q;z=S}}}if(M){JB(G)}if((P|0)!=0){eF(c[P+84>>2]|0);eF(P)}if(!J){i=k;return 0}if((H|0)>0){J=0;do{eF(c[I+(J<<2)>>2]|0);J=J+1|0;}while((J|0)<(H|0))}eF(I);i=k;return 0}function Nt(a){a=a|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=b[(c[a+8>>2]|0)+128>>1]&14;Ot(a);if((e|0)==8){Fv(0,129344,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;f=a+48|0;g=(c[(c[f>>2]|0)+8>>2]|0)+128|0;b[g>>1]=b[g>>1]&-9;g=(c[(c[f>>2]|0)+8>>2]|0)+128|0;b[g>>1]=b[g>>1]|6;h=6}else if((e|0)==0){i=d;return}else{h=e}Kt(a,4,h)|0;i=d;return}function Ot(b){b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;a:do{if((c[b+48>>2]|0)==(b|0)){d=b+8|0;e=c[d>>2]|0;f=c[e+8>>2]|0;g=c[f+84>>2]|0;if((g|0)==0){break}i=+h[e+16>>3];if(i<0.0){j=i+-.5}else{j=i+.5}if((~~j|0)!=0){cc(115816,108624,893,171072)}i=+h[e+24>>3];if(i<0.0){k=i+-.5}else{k=i+.5}if((~~k|0)!=0){cc(102968,108624,894,171072)}if((c[e+116>>2]&1|0)==0){l=e;m=f;n=g}else{g=e+32|0;i=+h[g>>3];h[g>>3]=+h[e+40>>3];h[(c[d>>2]|0)+40>>3]=i;e=c[d>>2]|0;d=c[e+8>>2]|0;l=e;m=d;n=c[d+84>>2]|0}do{if((n|0)==2){i=+h[m+64>>3];if(i<=0.0){break a}o=i/+h[l+32>>3];i=+h[m+72>>3]/+h[l+40>>3];if(!(o<1.0|i<1.0)){p=o;q=i;break}if(o<i){p=1.0;q=i/o;break}else{p=o/i;q=1.0;break}}else if((n|0)==1){i=+h[m+16>>3];o=+h[l+40>>3]/+h[l+32>>3];if(o<i){p=1.0;q=i/o;break}else{p=o/i;q=1.0;break}}else if((n|0)==5){i=+h[m+64>>3];if(i<=0.0){break a}o=i/+h[l+32>>3];i=+h[m+72>>3]/+h[l+40>>3];if(!(o>1.0&i>1.0)){break a}r=o<i?o:i;p=r;q=r}else{break a}}while(0);d=(c[l+116>>2]&1|0)==0;r=d?q:p;i=d?p:q;do{if((c[53566]|0)>1){d=ux(b)|0;if((d|0)==0){break}o=i+-1.0;s=r+-1.0;e=d;do{d=mw(b,e)|0;if((d|0)!=0){g=d;do{d=g+8|0;f=c[d>>2]|0;t=c[f+8>>2]|0;do{if((t|0)!=0){u=c[g>>2]&3;v=c[(c[(c[((u|0)==2?g:g-32|0)+28>>2]|0)+8>>2]|0)+132>>2]|0;w=o*+h[v>>3]*72.0;x=s*+h[v+8>>3]*72.0;v=c[(c[(c[((u|0)==3?g:g+32|0)+28>>2]|0)+8>>2]|0)+132>>2]|0;y=o*+h[v>>3]*72.0;z=s*+h[v+8>>3]*72.0;if((c[t+4>>2]|0)>0){v=c[t>>2]|0;u=0;while(1){A=v+4|0;B=c[A>>2]|0;if((B|0)>0){C=c[v>>2]|0;D=0;E=B;while(1){b:do{if((D|u|0)==0){B=C|0;h[B>>3]=y+ +h[B>>3];B=C+8|0;h[B>>3]=z+ +h[B>>3]}else{do{if((u|0)==((c[(c[(c[d>>2]|0)+8>>2]|0)+4>>2]|0)-1|0)){if((D|0)!=(E-1|0)){break}B=C|0;h[B>>3]=w+ +h[B>>3];B=C+8|0;h[B>>3]=x+ +h[B>>3];break b}}while(0);B=C|0;h[B>>3]=i*+h[B>>3];B=C+8|0;h[B>>3]=r*+h[B>>3]}}while(0);B=D+1|0;F=c[A>>2]|0;if((B|0)<(F|0)){C=C+16|0;D=B;E=F}else{break}}}if((c[v+8>>2]|0)!=0){E=v+16|0;h[E>>3]=y+ +h[E>>3];E=v+24|0;h[E>>3]=z+ +h[E>>3]}if((c[v+12>>2]|0)!=0){E=v+32|0;h[E>>3]=w+ +h[E>>3];E=v+40|0;h[E>>3]=x+ +h[E>>3]}E=u+1|0;D=c[d>>2]|0;if((E|0)<(c[(c[D+8>>2]|0)+4>>2]|0)){v=v+48|0;u=E}else{G=D;break}}}else{G=f}u=c[G+96>>2]|0;do{if((u|0)==0){H=G}else{if((a[u+81|0]|0)==0){H=G;break}v=u+56|0;h[v>>3]=i*+h[v>>3];v=(c[(c[d>>2]|0)+96>>2]|0)+64|0;h[v>>3]=r*+h[v>>3];H=c[d>>2]|0}}while(0);u=c[H+100>>2]|0;do{if((u|0)==0){I=H}else{if((a[u+81|0]|0)==0){I=H;break}v=u+56|0;h[v>>3]=w+ +h[v>>3];v=(c[(c[d>>2]|0)+100>>2]|0)+64|0;h[v>>3]=x+ +h[v>>3];I=c[d>>2]|0}}while(0);u=c[I+104>>2]|0;if((u|0)==0){break}if((a[u+81|0]|0)==0){break}v=u+56|0;h[v>>3]=y+ +h[v>>3];v=(c[(c[d>>2]|0)+104>>2]|0)+64|0;h[v>>3]=z+ +h[v>>3]}}while(0);g=ow(b,g)|0;}while((g|0)!=0)}e=vx(b,e)|0;}while((e|0)!=0)}}while(0);e=ux(b)|0;if((e|0)!=0){g=e;do{e=g+8|0;d=c[(c[e>>2]|0)+132>>2]|0;h[d>>3]=i*+h[d>>3];d=(c[(c[e>>2]|0)+132>>2]|0)+8|0;h[d>>3]=r*+h[d>>3];g=vx(b,g)|0;}while((g|0)!=0)}Rt(b,i,r)}}while(0);I=ux(b)|0;if((I|0)==0){return}else{J=I}do{I=J+8|0;H=c[I>>2]|0;h[H+16>>3]=+h[c[H+132>>2]>>3]*72.0;H=c[I>>2]|0;h[H+24>>3]=+h[(c[H+132>>2]|0)+8>>3]*72.0;J=vx(b,J)|0;}while((J|0)!=0);return}function Pt(a){a=a|0;var d=0,e=0,f=0,g=0.0,j=0.0,k=0,l=0,m=0;d=i;$m(a);e=a+8|0;f=c[e>>2]|0;g=+h[f+16>>3]/72.0;j=+h[f+24>>3]/72.0;f=ux(a)|0;if((f|0)!=0){k=f;do{f=k+8|0;l=c[(c[f>>2]|0)+132>>2]|0;h[l>>3]=+h[l>>3]-g;l=(c[(c[f>>2]|0)+132>>2]|0)+8|0;h[l>>3]=+h[l>>3]-j;k=vx(a,k)|0;}while((k|0)!=0)}k=c[e>>2]|0;Qt(a,+h[k+16>>3],+h[k+24>>3]);k=b[(c[e>>2]|0)+128>>1]&14;Ot(a);if((k|0)==0){i=d;return}else if((k|0)==8){Fv(0,129344,(e=i,i=i+1|0,i=i+7&-8,c[e>>2]=0,e)|0)|0;i=e;e=a+48|0;l=(c[(c[e>>2]|0)+8>>2]|0)+128|0;b[l>>1]=b[l>>1]&-9;l=(c[(c[e>>2]|0)+8>>2]|0)+128|0;b[l>>1]=b[l>>1]|6;m=6}else{m=k}Kt(a,4,m)|0;i=d;return}function Qt(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,g=0,i=0;e=a+8|0;a=c[e>>2]|0;if((c[a+172>>2]|0)<1){f=a}else{g=1;i=a;while(1){Qt(c[(c[i+176>>2]|0)+(g<<2)>>2]|0,b,d);a=c[e>>2]|0;if((g|0)<(c[a+172>>2]|0)){g=g+1|0;i=a}else{f=a;break}}}i=f+32|0;h[i>>3]=+h[i>>3]-b;i=(c[e>>2]|0)+40|0;h[i>>3]=+h[i>>3]-d;i=(c[e>>2]|0)+16|0;h[i>>3]=+h[i>>3]-b;i=(c[e>>2]|0)+24|0;h[i>>3]=+h[i>>3]-d;return}function Rt(b,d,e){b=b|0;d=+d;e=+e;var f=0,g=0,i=0,j=0,k=0,l=0;f=b+8|0;b=(c[f>>2]|0)+32|0;h[b>>3]=+h[b>>3]*d;b=(c[f>>2]|0)+40|0;h[b>>3]=+h[b>>3]*e;b=(c[f>>2]|0)+16|0;h[b>>3]=+h[b>>3]*d;b=(c[f>>2]|0)+24|0;h[b>>3]=+h[b>>3]*e;b=c[f>>2]|0;g=c[b+12>>2]|0;do{if((g|0)==0){i=b}else{if((a[g+81|0]|0)==0){i=b;break}j=g+56|0;h[j>>3]=+h[j>>3]*d;j=(c[(c[f>>2]|0)+12>>2]|0)+64|0;h[j>>3]=+h[j>>3]*e;i=c[f>>2]|0}}while(0);if((c[i+172>>2]|0)<1){return}else{k=1;l=i}while(1){Rt(c[(c[l+176>>2]|0)+(k<<2)>>2]|0,d,e);i=c[f>>2]|0;if((k|0)<(c[i+172>>2]|0)){k=k+1|0;l=i}else{break}}return}function St(a){a=a|0;return 0}function Tt(a){a=a|0;return 0}function Ut(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0.0,A=0,B=0.0,C=0,D=0,E=0;g=kk(f<<2)|0;i=g;j=(f|0)>0;k=b<<3;if(j){l=0;do{c[i+(l<<2)>>2]=kk(k)|0;l=l+1|0;}while((l|0)<(f|0))}l=kk(f<<3)|0;m=l;n=kk(b<<2)|0;o=n;p=kk(da(k,b)|0)|0;k=(b|0)>0;do{if(k){q=0;r=p;while(1){c[o+(q<<2)>>2]=r;s=q+1|0;if((s|0)<(b|0)){q=s;r=r+(b<<3)|0}else{break}}if(!k){break}r=(d|0)>0;q=0;do{s=o+(q<<2)|0;t=a+(q<<2)|0;u=0;while(1){if(r){v=c[t>>2]|0;w=c[a+(u<<2)>>2]|0;x=0.0;y=0;while(1){z=x+ +(da(c[w+(y<<2)>>2]|0,c[v+(y<<2)>>2]|0)|0);A=y+1|0;if((A|0)<(d|0)){x=z;y=A}else{B=z;break}}}else{B=0.0}h[(c[o+(u<<2)>>2]|0)+(q<<3)>>3]=B;h[(c[s>>2]|0)+(u<<3)>>3]=B;if((u|0)<(q|0)){u=u+1|0}else{break}}q=q+1|0;}while((q|0)<(b|0))}}while(0);Ns(o,b,f,i,m,1)|0;if(!j){eF(g);eF(l);C=c[o>>2]|0;D=C;eF(D);eF(n);return}do{if((d|0)>0){m=0;do{p=e+(m<<2)|0;q=i+(m<<2)|0;if(k){r=0;do{u=c[q>>2]|0;B=0.0;s=0;do{B=B+ +(c[(c[a+(s<<2)>>2]|0)+(r<<2)>>2]|0)*+h[u+(s<<3)>>3];s=s+1|0;}while((s|0)<(b|0));h[(c[p>>2]|0)+(r<<3)>>3]=B;r=r+1|0;}while((r|0)<(d|0))}else{r=0;do{h[(c[p>>2]|0)+(r<<3)>>3]=0.0;r=r+1|0;}while((r|0)<(d|0))}m=m+1|0;}while((m|0)<(f|0));if(j){E=0;break}eF(g);eF(l);C=c[o>>2]|0;D=C;eF(D);eF(n);return}else{E=0}}while(0);do{eF(c[i+(E<<2)>>2]|0);E=E+1|0;}while((E|0)<(f|0));eF(g);eF(l);C=c[o>>2]|0;D=C;eF(D);eF(n);return}function Vt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+40|0;g=f|0;h=f+8|0;j=f+16|0;k=f+24|0;c[g>>2]=e;c[j>>2]=0;c[k>>2]=0;zr(c[a>>2]|0,d,d<<2,h);Rs(c[h>>2]|0,a,d,b,j);Qs(a,c[j>>2]|0,b,d,b,k);eF(c[c[j>>2]>>2]|0);eF(c[j>>2]|0);j=(Ns(c[k>>2]|0,b,1,g,f+32|0,1)|0)&255;i=f;return j|0}function Wt(){c[44372]=0;eF(c[43678]|0);eF(c[43676]|0);eF(c[43674]|0);c[43678]=0;c[43676]=0;c[43674]=0;return}function Xt(a){a=a|0;eF(c[a+36>>2]|0);return}function Yt(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;g=i;j=d+8|0;k=c[j>>2]|0;a:do{if((c[k+212>>2]|0)==0){l=pl(d)|0;if((l|0)==1){m=c[j>>2]|0;n=c[m+12>>2]|0;o=c[n+8>>2]|0;p=c[c[m+8>>2]>>2]|0;m=a[p]|0;do{if((m<<24>>24|0)==112){if((Ya(p|0,158472)|0)!=0){q=18;break}r=c[n+44>>2]|0;if((o|0)!=4){q=18;break}s=+h[r+8>>3];t=r+16|0;u=+h[r+24>>3];if(s==u){if(+h[r+40>>3]!=+h[r+56>>3]){q=18;break}if(+h[r>>3]!=+h[r+48>>3]){q=18;break}if(+h[t>>3]!=+h[r+32>>3]){q=18;break}}else{if(+h[r>>3]!=+h[t>>3]){q=21;break}if(+h[r+32>>3]!=+h[r+48>>3]){q=18;break}if(s!=+h[r+56>>3]){q=18;break}if(u!=+h[r+40>>3]){q=18;break}}c[b+40>>2]=1;q=22}else if((m<<24>>24|0)==98){if((Ya(p|0,121888)|0)!=0){q=18;break}c[b+40>>2]=1;q=22}else{q=18}}while(0);do{if((q|0)==18){if((o|0)>=3){q=21;break}if((c[n>>2]|0)==0){q=21;break}c[b+40>>2]=2}}while(0);if((q|0)==21){c[b+40>>2]=0;q=22}do{if((q|0)==22){if((o|0)<=2){break}p=kk(o<<4)|0;m=p;if((c[b+40>>2]|0)==1){r=n+44|0;u=e;h[p>>3]=u+ +h[c[r>>2]>>3]/72.0;s=f;h[p+8>>3]=s+ +h[(c[r>>2]|0)+8>>3]/72.0;h[p+16>>3]=+h[(c[r>>2]|0)+16>>3]/72.0-u;h[p+24>>3]=s+ +h[(c[r>>2]|0)+24>>3]/72.0;h[p+32>>3]=+h[(c[r>>2]|0)+32>>3]/72.0-u;h[p+40>>3]=+h[(c[r>>2]|0)+40>>3]/72.0-s;h[p+48>>3]=u+ +h[(c[r>>2]|0)+48>>3]/72.0;h[p+56>>3]=+h[(c[r>>2]|0)+56>>3]/72.0-s;v=m;w=o;break a}if((o|0)<=0){v=m;w=o;break a}r=n+44|0;s=e;u=f;p=0;while(1){t=c[r>>2]|0;x=+h[t+(p<<4)>>3];y=+h[t+(p<<4)+8>>3];z=+T(x*x+y*y);y=x*(s/z+1.0);t=m+(p<<4)|0;h[t>>3]=y;x=+h[(c[r>>2]|0)+(p<<4)+8>>3]*(u/z+1.0);h[t>>3]=y/72.0;h[m+(p<<4)+8>>3]=x/72.0;t=p+1|0;if((t|0)<(o|0)){p=t}else{v=m;w=o;break a}}}}while(0);o=ew(d|0,108448)|0;if((o|0)==0){A=0}else{A=Rb(o|0)|0}o=(A|0)<3?20:A;n=kk(o<<4)|0;if((o|0)<=0){v=n;w=o;break}u=e;s=+(o|0);x=f;m=0;while(1){y=+(m|0)/s*3.141592653589793*2.0;h[n+(m<<4)>>3]=(u+ +h[(c[j>>2]|0)+32>>3]*.5)*+V(y);h[n+(m<<4)+8>>3]=+W(y)*(x+ +h[(c[j>>2]|0)+40>>3]*.5);p=m+1|0;if((p|0)<(o|0)){m=p}else{v=n;w=o;break}}}else if((l|0)==2){o=kk(64)|0;n=c[(c[j>>2]|0)+12>>2]|0;x=+h[n+32>>3];u=+h[n+40>>3];s=-0.0-e+ +(~~+h[n+16>>3]|0)/72.0;y=-0.0-f+ +(~~+h[n+24>>3]|0)/72.0;h[o>>3]=s;h[o+8>>3]=y;z=e+ +(~~x|0)/72.0;h[o+16>>3]=z;h[o+24>>3]=y;y=f+ +(~~u|0)/72.0;h[o+32>>3]=z;h[o+40>>3]=y;h[o+48>>3]=s;h[o+56>>3]=y;c[b+40>>2]=1;v=o;w=4;break}else if((l|0)==3){c[b+40>>2]=2;o=ew(d|0,108448)|0;if((o|0)==0){B=0}else{B=Rb(o|0)|0}o=(B|0)<3?20:B;n=kk(o<<4)|0;if((o|0)<=0){v=n;w=o;break}y=e;s=+(o|0);z=f;m=0;while(1){u=+(m|0)/s*3.141592653589793*2.0;h[n+(m<<4)>>3]=(y+ +h[(c[j>>2]|0)+32>>3]*.5)*+V(u);h[n+(m<<4)+8>>3]=+W(u)*(z+ +h[(c[j>>2]|0)+40>>3]*.5);p=m+1|0;if((p|0)<(o|0)){m=p}else{v=n;w=o;break}}}else{Fv(1,128392,(o=i,i=i+8|0,c[o>>2]=c[c[(c[j>>2]|0)+8>>2]>>2],o)|0)|0;i=o;C=1;i=g;return C|0}}else{z=e+ +h[k+32>>3]*.5;y=f+ +h[k+40>>3]*.5;c[b+40>>2]=1;o=kk(64)|0;h[o>>3]=z;h[o+8>>3]=y;s=-0.0-z;h[o+16>>3]=s;h[o+24>>3]=y;h[o+32>>3]=s;s=-0.0-y;h[o+40>>3]=s;h[o+48>>3]=z;h[o+56>>3]=s;v=o;w=4}}while(0);c[b+36>>2]=v;c[b+32>>2]=w;f=+h[v>>3];e=+h[v+8>>3];if((w|0)>1){k=v;s=f;z=e;y=f;u=e;v=1;while(1){j=k+16|0;x=+h[j>>3];D=x<s?x:s;E=+h[k+24>>3];F=E<z?E:z;G=x>y?x:y;x=E>u?E:u;B=v+1|0;if((B|0)<(w|0)){k=j;s=D;z=F;y=G;u=x;v=B}else{H=D;I=F;J=G;K=x;break}}}else{H=f;I=e;J=f;K=e}h[b>>3]=H;h[b+8>>3]=I;h[b+16>>3]=J;h[b+24>>3]=K;if((w|0)<=(c[44372]|0)){C=0;i=g;return C|0}c[44372]=w;C=0;i=g;return C|0}function Zt(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0;g=i;j=d+8|0;k=c[j>>2]|0;a:do{if((c[k+212>>2]|0)==0){l=pl(d)|0;if((l|0)==2){m=kk(64)|0;n=c[(c[j>>2]|0)+12>>2]|0;o=+h[n+32>>3];p=+h[n+40>>3];q=+h[n+16>>3]/72.0;r=+h[n+24>>3]/72.0;h[m>>3]=q;h[m+8>>3]=r;s=o/72.0;h[m+16>>3]=s;h[m+24>>3]=r;r=p/72.0;h[m+32>>3]=s;h[m+40>>3]=r;h[m+48>>3]=q;h[m+56>>3]=r;c[b+40>>2]=1;t=m;u=4;v=36;break}else if((l|0)==1){m=c[(c[j>>2]|0)+12>>2]|0;n=m+8|0;w=c[n>>2]|0;do{if((w|0)>2){x=kk(w<<4)|0;y=m+44|0;z=0;while(1){h[x+(z<<4)>>3]=+h[(c[y>>2]|0)+(z<<4)>>3]/72.0;h[x+(z<<4)+8>>3]=+h[(c[y>>2]|0)+(z<<4)+8>>3]/72.0;A=z+1|0;if((A|0)<(w|0)){z=A}else{B=x;C=w;break}}}else{x=ew(d|0,108448)|0;if((x|0)==0){D=0}else{D=Rb(x|0)|0}x=(D|0)<3?20:D;z=kk(x<<4)|0;if((x|0)<=0){B=z;C=x;break}r=+(x|0);y=0;while(1){q=+(y|0)/r*3.141592653589793*2.0;h[z+(y<<4)>>3]=(+h[(c[j>>2]|0)+32>>3]*.5+0.0)*+V(q);h[z+(y<<4)+8>>3]=+W(q)*(+h[(c[j>>2]|0)+40>>3]*.5+0.0);A=y+1|0;if((A|0)<(x|0)){y=A}else{B=z;C=x;break}}}}while(0);w=c[c[(c[j>>2]|0)+8>>2]>>2]|0;x=a[w]|0;do{if((x<<24>>24|0)==98){if((Ya(w|0,121888)|0)!=0){break}c[b+40>>2]=1;t=B;u=C;v=36;break a}else if((x<<24>>24|0)==112){if(!((Ya(w|0,158472)|0)==0&(C|0)==4)){break}r=+h[B+8>>3];z=B+16|0;q=+h[B+24>>3];if(r==q){if(+h[B+40>>3]!=+h[B+56>>3]){break}if(+h[B>>3]!=+h[B+48>>3]){break}if(+h[z>>3]!=+h[B+32>>3]){break}}else{if(+h[B>>3]!=+h[z>>3]){break}if(+h[B+32>>3]!=+h[B+48>>3]){break}if(r!=+h[B+56>>3]){break}if(q!=+h[B+40>>3]){break}}c[b+40>>2]=1;t=B;u=4;v=36;break a}}while(0);do{if((c[n>>2]|0)<3){if((c[m>>2]|0)==0){break}c[b+40>>2]=2;t=B;u=C;v=36;break a}}while(0);c[b+40>>2]=0;t=B;u=C;v=36;break}else if((l|0)==3){c[b+40>>2]=2;m=ew(d|0,108448)|0;if((m|0)==0){E=0}else{E=Rb(m|0)|0}m=(E|0)<3?20:E;n=kk(m<<4)|0;if((m|0)<=0){F=m;G=n;break}q=+(m|0);w=0;while(1){r=+(w|0)/q*3.141592653589793*2.0;h[n+(w<<4)>>3]=(+h[(c[j>>2]|0)+32>>3]*.5+0.0)*+V(r);h[n+(w<<4)+8>>3]=+W(r)*(+h[(c[j>>2]|0)+40>>3]*.5+0.0);x=w+1|0;if((x|0)<(m|0)){w=x}else{t=n;u=m;v=36;break}}}else{Fv(1,115584,(m=i,i=i+8|0,c[m>>2]=c[c[(c[j>>2]|0)+8>>2]>>2],m)|0)|0;i=m;H=1;i=g;return H|0}}else{q=+h[k+32>>3]*.5;r=+h[k+40>>3]*.5;c[b+40>>2]=1;m=kk(64)|0;h[m>>3]=q;h[m+8>>3]=r;s=-0.0-q;h[m+16>>3]=s;h[m+24>>3]=r;h[m+32>>3]=s;s=-0.0-r;h[m+40>>3]=s;h[m+48>>3]=q;h[m+56>>3]=s;t=m;u=4;v=36}}while(0);do{if((v|0)==36){if(!((e!=1.0|f!=1.0)&(u|0)>0)){F=u;G=t;break}s=e;q=f;k=0;j=t;while(1){E=j|0;h[E>>3]=s*+h[E>>3];E=j+8|0;h[E>>3]=q*+h[E>>3];E=k+1|0;if((E|0)<(u|0)){k=E;j=j+16|0}else{F=u;G=t;break}}}}while(0);c[b+36>>2]=G;c[b+32>>2]=F;f=+h[G>>3];e=+h[G+8>>3];if((F|0)>1){t=G;q=f;s=e;r=f;p=e;G=1;while(1){u=t+16|0;o=+h[u>>3];I=o<q?o:q;J=+h[t+24>>3];K=J<s?J:s;L=o>r?o:r;o=J>p?J:p;v=G+1|0;if((v|0)<(F|0)){t=u;q=I;s=K;r=L;p=o;G=v}else{M=I;N=K;O=L;P=o;break}}}else{M=f;N=e;O=f;P=e}h[b>>3]=M;h[b+8>>3]=N;h[b+16>>3]=O;h[b+24>>3]=P;if((F|0)<=(c[44372]|0)){H=0;i=g;return H|0}c[44372]=F;H=0;i=g;return H|0}function _t(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;f=i;i=i+112|0;g=a;a=i;i=i+16|0;c[a>>2]=c[g>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[a+12>>2]=c[g+12>>2];g=d;d=i;i=i+16|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];g=f|0;j=f+16|0;k=f+32|0;l=f+48|0;m=f+64|0;n=f+80|0;o=f+96|0;as(l,a,b|0);p=b+16|0;as(m,a,p);as(n,d,e|0);q=e+16|0;as(o,d,q);r=l|0;s=l+8|0;l=m|0;t=m+8|0;m=n|0;u=n+8|0;n=o|0;v=o+8|0;if(+h[r>>3]>+h[n>>3]|+h[m>>3]>+h[l>>3]|+h[s>>3]>+h[v>>3]){w=0;i=f;return w|0}if(+h[u>>3]>+h[t>>3]){w=0;i=f;return w|0}o=c[b+40>>2]|0;do{if((o&1|0)!=0){if((c[e+40>>2]&1|0)==0){break}else{w=1}i=f;return w|0}}while(0);do{if((o&2|0)!=0){if((c[e+40>>2]&2|0)==0){break}x=+h[p>>3]- +h[b>>3]+ +h[q>>3]- +h[e>>3];y=+h[a>>3]- +h[d>>3];z=+h[a+8>>3]- +h[d+8>>3];w=y*y+z*z<=x*x*.25|0;i=f;return w|0}}while(0);if((c[43678]|0)==0){c[43678]=kk(c[44372]<<4)|0;c[43676]=kk(c[44372]<<4)|0}q=b+32|0;p=c[q>>2]|0;x=+h[a>>3];z=+h[a+8>>3];if((p|0)>0){a=c[b+36>>2]|0;b=c[43678]|0;o=0;while(1){h[b>>3]=x+ +h[a>>3];h[b+8>>3]=z+ +h[a+8>>3];A=o+1|0;if((A|0)<(p|0)){a=a+16|0;b=b+16|0;o=A}else{break}}}o=e+32|0;b=c[o>>2]|0;z=+h[d>>3];x=+h[d+8>>3];if((b|0)>0){d=c[43676]|0;a=c[e+36>>2]|0;e=d;p=0;while(1){h[e>>3]=z+ +h[a>>3];h[e+8>>3]=x+ +h[a+8>>3];A=p+1|0;if((A|0)<(b|0)){a=a+16|0;e=e+16|0;p=A}else{break}}B=c[o>>2]|0;C=d}else{B=b;C=c[43676]|0}b=c[43678]|0;d=c[q>>2]|0;p=d-1|0;e=B-1|0;a=d<<1;A=B<<1;D=0;E=0;F=0;G=0;while(1){H=b+(D<<4)|0;I=b+(((p+D|0)%(d|0)|0)<<4)|0;$r(g,H,I);J=C+(E<<4)|0;K=C+(((e+E|0)%(B|0)|0)<<4)|0;$r(j,J,K);x=+bs(177e3,g,j);L=cs(I,H,J)|0;M=cs(K,J,H)|0;if((ds(I,H,K,J,k)|0)!=0){w=1;N=36;break}J=(L|0)==0;L=(M|0)==0;do{if(x==0.0&J&L){O=(D+1|0)%(d|0)|0;P=E;Q=F+1|0;R=G}else{if(x<0.0){if(L){O=(D+1|0)%(d|0)|0;P=E;Q=F+1|0;R=G;break}else{O=D;P=(E+1|0)%(B|0)|0;Q=F;R=G+1|0;break}}else{if(J){O=D;P=(E+1|0)%(B|0)|0;Q=F;R=G+1|0;break}else{O=(D+1|0)%(d|0)|0;P=E;Q=F+1|0;R=G;break}}}}while(0);if(((Q|0)<(d|0)|(R|0)<(B|0))&(Q|0)<(a|0)&(R|0)<(A|0)){D=O;E=P;F=Q;G=R}else{break}}if((N|0)==36){i=f;return w|0}N=c[43678]|0;x=+h[N>>3];z=+h[N+8>>3];do{if(!(x>+h[n>>3]|x<+h[m>>3]|z>+h[v>>3])){if(z<+h[u>>3]){break}if(($t(c[43676]|0,c[o>>2]|0,x,z)|0)==0){break}else{w=1}i=f;return w|0}}while(0);o=c[43676]|0;z=+h[o>>3];x=+h[o+8>>3];if(z>+h[l>>3]|z<+h[r>>3]|x>+h[t>>3]){w=0;i=f;return w|0}if(x<+h[s>>3]){w=0;i=f;return w|0}w=($t(c[43678]|0,c[q>>2]|0,z,x)|0)!=0|0;i=f;return w|0}function $t(a,b,d,e){a=a|0;b=b|0;d=+d;e=+e;var f=0,g=0,i=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0;f=c[43674]|0;if((f|0)==0){g=kk(c[44372]<<4)|0;c[43674]=g;i=g}else{i=f}f=(b|0)>0;a:do{if(f){g=0;do{h[i+(g<<4)>>3]=+h[a+(g<<4)>>3]-d;h[i+(g<<4)+8>>3]=+h[a+(g<<4)+8>>3]-e;g=g+1|0;}while((g|0)<(b|0));if(!f){j=0.0;break}g=b-1|0;k=0;l=0.0;b:while(1){m=(g+k|0)%(b|0)|0;n=+h[i+(k<<4)+8>>3];o=n==0.0;do{if(o){if(+h[i+(m<<4)+8>>3]!=0.0){p=10;break}if(+h[i+(k<<4)>>3]*+h[i+(m<<4)>>3]<0.0){q=1;p=19;break b}else{r=l}}else{p=10}}while(0);do{if((p|0)==10){p=0;s=+h[i+(m<<4)+8>>3];if(n<0.0|s>0.0){if(s<0.0|n>0.0){r=l;break}}t=(+h[i+(k<<4)>>3]*s- +h[i+(m<<4)>>3]*n)/(s-n);if(t==0.0){q=1;p=19;break b}if(t<=0.0){r=l;break}if(o|s==0.0){r=l+.5;break}else{r=l+1.0;break}}}while(0);o=k+1|0;if((o|0)<(b|0)){k=o;l=r}else{j=r;break a}}if((p|0)==19){return q|0}}else{j=0.0}}while(0);q=((~~j|0)%2|0|0)==1|0;return q|0}function au(){nt(175056,24);c[44268]=0;return}function bu(){return ot(175056)|0}function cu(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a>>3]- +h[b>>3];d=+h[a+8>>3]- +h[b+8>>3];return+(+T(c*c+d*d))}function du(a){a=a|0;c[a+16>>2]=c[44268];c[44268]=(c[44268]|0)+1;return}function eu(a){a=a|0;var b=0,d=0;b=a+20|0;d=(c[b>>2]|0)-1|0;c[b>>2]=d;if((d|0)!=0){return}pt(a,175056);return}function fu(a){a=a|0;var b=0;b=a+20|0;c[b>>2]=(c[b>>2]|0)+1;return}function gu(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0,F=0;e=da(d,d)|0;f=kk(e<<3)|0;g=f;i=kk(d<<3)|0;j=i;k=(d|0)>0;if(k){l=0;do{h[j+(l<<3)>>3]=+h[c+(l<<3)>>3];l=l+1|0;}while((l|0)<(d|0))}l=(e|0)==0;if(!l){m=0;do{h[g+(m<<3)>>3]=+h[a+(m<<3)>>3];m=m+1|0;}while((m|0)<(e|0))}m=d-1|0;n=(m|0)>0;a:do{if(n){o=0;p=0;while(1){q=(p|0)<(d|0);if(q){r=o;s=p;t=0.0}else{break a}do{u=+S(+(+h[a+((da(s,d)|0)+p<<3)>>3]));v=u<t;r=v?r:s;t=v?t:u;s=s+1|0;}while((s|0)<(d|0));if(t<1.0e-10){break a}if(q){v=da(r,d)|0;w=da(p,d)|0;x=p;do{y=a+(x+v<<3)|0;u=+h[y>>3];z=a+(x+w<<3)|0;h[y>>3]=+h[z>>3];h[z>>3]=u;x=x+1|0;}while((x|0)<(d|0))}x=c+(r<<3)|0;u=+h[x>>3];w=c+(p<<3)|0;h[x>>3]=+h[w>>3];h[w>>3]=u;x=p+1|0;b:do{if((x|0)<(d|0)){v=da(p,d)|0;q=a+(v+p<<3)|0;if(k){A=x;B=u}else{z=x;C=u;while(1){D=+h[a+((da(z,d)|0)+p<<3)>>3];y=c+(z<<3)|0;h[y>>3]=+h[y>>3]-D/+h[q>>3]*C;y=z+1|0;if((y|0)>=(d|0)){break b}z=y;C=+h[w>>3]}}while(1){z=da(A,d)|0;C=+h[a+(z+p<<3)>>3]/+h[q>>3];y=c+(A<<3)|0;h[y>>3]=+h[y>>3]-C*B;y=0;do{E=a+(y+z<<3)|0;h[E>>3]=+h[E>>3]-C*+h[a+(y+v<<3)>>3];y=y+1|0;}while((y|0)<(d|0));y=A+1|0;if((y|0)>=(d|0)){break b}A=y;B=+h[w>>3]}}}while(0);if((x|0)<(m|0)){o=r;p=x}else{F=21;break}}}else{F=21}}while(0);do{if((F|0)==21){B=+h[a+(e-1<<3)>>3];if(+S(+B)<1.0e-10){break}h[b+(m<<3)>>3]=+h[c+(m<<3)>>3]/B;if(n){r=0;do{A=d-r|0;s=A-2|0;B=+h[c+(s<<3)>>3];p=b+(s<<3)|0;h[p>>3]=B;o=da(s,d)|0;w=A-1|0;t=B;do{t=t- +h[a+(w+o<<3)>>3]*+h[b+(w<<3)>>3];h[p>>3]=t;w=w+1|0;}while((w|0)<(d|0));h[p>>3]=t/+h[a+(o+s<<3)>>3];r=r+1|0;}while((r|0)<(m|0))}if(k){r=0;do{h[c+(r<<3)>>3]=+h[j+(r<<3)>>3];r=r+1|0;}while((r|0)<(d|0))}if(!l){r=0;do{h[a+(r<<3)>>3]=+h[g+(r<<3)>>3];r=r+1|0;}while((r|0)<(e|0))}eF(f);eF(i);return}}while(0);ib(10408)|0;eF(f);eF(i);return}function hu(b,e,f,g,i){b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0;b=c[g>>2]|0;j=c[g+4>>2]|0;a:do{if((e|0)>0){if((f|0)>2){k=b;l=j;m=0;n=0}else{o=b;p=j;q=0;r=0;while(1){s=(c[i+(q<<2)>>2]|0)+8|0;t=c[s>>2]|0;if((a[t+119|0]|0)==0){h[o>>3]=+wn();h[p>>3]=+wn();u=r}else{v=c[t+132>>2]|0;h[o>>3]=+h[v>>3];h[p>>3]=+h[v+8>>3];u=(d[(c[s>>2]|0)+119|0]|0)>>>0>1>>>0?1:r}s=q+1|0;if((s|0)<(e|0)){o=o+8|0;p=p+8|0;q=s;r=u}else{w=u;break a}}}while(1){r=(c[i+(m<<2)>>2]|0)+8|0;q=c[r>>2]|0;if((a[q+119|0]|0)==0){h[k>>3]=+wn();h[l>>3]=+wn();p=2;while(1){x=+wn();h[(c[g+(p<<2)>>2]|0)+(m<<3)>>3]=x;o=p+1|0;if((o|0)<(f|0)){p=o}else{y=n;break}}}else{p=c[q+132>>2]|0;h[k>>3]=+h[p>>3];h[l>>3]=+h[p+8>>3];o=p+16|0;p=2;while(1){h[(c[g+(p<<2)>>2]|0)+(m<<3)>>3]=+h[o>>3];s=p+1|0;if((s|0)<(f|0)){o=o+8|0;p=s}else{break}}y=(d[(c[r>>2]|0)+119|0]|0)>>>0>1>>>0?1:n}p=m+1|0;if((p|0)<(e|0)){k=k+8|0;l=l+8|0;m=p;n=y}else{w=y;break}}}else{w=0}}while(0);if((f|0)>0){z=0}else{return w|0}do{Ss(e,c[g+(z<<2)>>2]|0);z=z+1|0;}while((z|0)<(f|0));return w|0}function iu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0.0;d=jk(((da(b+1|0,b)|0)/2|0)<<2)|0;e=d;f=pu(b,b,0.0)|0;i=pu(b,b,0.0)|0;j=(b|0)>0;do{if((c[a+8>>2]|0)==0){if(j){k=0}else{break}do{l=a+(k<<4)|0;if((c[l>>2]|0)>1){m=a+(k<<4)+4|0;n=f+(k<<2)|0;o=1;do{p=c[(c[m>>2]|0)+(o<<2)>>2]|0;h[(c[f+(p<<2)>>2]|0)+(k<<3)>>3]=-1.0;h[(c[n>>2]|0)+(p<<3)>>3]=-1.0;o=o+1|0;}while((o|0)<(c[l>>2]|0))}k=k+1|0;}while((k|0)<(b|0))}else{if(j){q=0}else{break}do{l=a+(q<<4)|0;if((c[l>>2]|0)>1){o=a+(q<<4)+4|0;n=a+(q<<4)+8|0;m=f+(q<<2)|0;p=1;do{r=c[(c[o>>2]|0)+(p<<2)>>2]|0;s=-1.0/+g[(c[n>>2]|0)+(p<<2)>>2];h[(c[f+(r<<2)>>2]|0)+(q<<3)>>3]=s;h[(c[m>>2]|0)+(r<<3)>>3]=s;p=p+1|0;}while((p|0)<(c[l>>2]|0))}q=q+1|0;}while((q|0)<(b|0))}}while(0);if((xr(b,f,i)|0)==0){eF(d);t=0;qu(f);qu(i);return t|0}if((b|0)>0){u=0;v=0;w=b}else{t=e;qu(f);qu(i);return t|0}while(1){d=i+(v<<2)|0;q=u;a=v;while(1){if((v|0)==(a|0)){x=0.0}else{j=c[d>>2]|0;x=+h[j+(v<<3)>>3]+ +h[(c[i+(a<<2)>>2]|0)+(a<<3)>>3]- +h[j+(a<<3)>>3]*2.0}g[e+(q<<2)>>2]=x;j=a+1|0;if((j|0)<(b|0)){q=q+1|0;a=j}else{break}}a=v+1|0;if((a|0)<(b|0)){u=u+w|0;v=a;w=w-1|0}else{t=e;break}}qu(f);qu(i);return t|0}function ju(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0.0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0,x=0.0,y=0,z=0,A=0.0,B=0.0,C=0.0;e=i;if((c[b+8>>2]|0)==0){f=0;i=e;return f|0}j=ku(b,d)|0;if((d|0)>0){k=0;l=0;m=0.0;while(1){n=l+k|0;p=b+(k<<4)|0;q=c[p>>2]|0;if((q|0)>1){r=b+(k<<4)+4|0;s=(da(k,d)|0)-n|0;t=b+(k<<4)+8|0;u=1;v=m;w=q;while(1){q=c[(c[r>>2]|0)+(u<<2)>>2]|0;if((q|0)<(k|0)){x=v;y=w}else{z=j+(s+q<<2)|0;A=+g[(c[t>>2]|0)+(u<<2)>>2];q=~~(+g[z>>2]-A);g[z>>2]=A;x=v+ +(((q|0)>-1?q:-q|0)|0);y=c[p>>2]|0}q=u+1|0;if((q|0)<(y|0)){u=q;v=x;w=y}else{B=x;break}}}else{B=m}w=k+1|0;if((w|0)<(d|0)){k=w;l=n;m=B}else{C=B;break}}}else{C=0.0}if((a[213992]|0)==0){f=j;i=e;return f|0}gc(c[o>>2]|0,119712,(l=i,i=i+8|0,h[l>>3]=C,l)|0)|0;i=l;f=j;i=e;return f|0}function ku(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;c=i;i=i+16|0;d=c|0;e=jk(((da(b+1|0,b)|0)/2|0)<<2)|0;f=jk(b<<2)|0;h=f;vr(d,b);if((b|0)>0){j=0;k=0;l=b}else{eF(f);wr(d);i=c;return e|0}while(1){Sr(k,a,b,h);m=j;n=k;while(1){g[e+(m<<2)>>2]=+g[h+(n<<2)>>2];o=n+1|0;if((o|0)<(b|0)){m=m+1|0;n=o}else{break}}n=k+1|0;if((n|0)<(b|0)){j=j+l|0;k=n;l=l-1|0}else{break}}eF(f);wr(d);i=c;return e|0}function lu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+16|0;e=d|0;f=jk(((da(b+1|0,b)|0)/2|0)<<2)|0;h=jk(b<<2)|0;j=h;vr(e,b);if((b|0)>0){k=0;l=0;m=b}else{eF(h);wr(e);i=d;return f|0}while(1){ur(l,a,b,j,e);n=k;o=l;while(1){g[f+(n<<2)>>2]=+(c[j+(o<<2)>>2]|0);p=o+1|0;if((p|0)<(b|0)){n=n+1|0;o=p}else{break}}o=l+1|0;if((o|0)<(b|0)){k=k+m|0;l=o;m=m-1|0}else{break}}eF(h);wr(e);i=d;return f|0}function mu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0;d=a+8|0;e=c[d>>2]|0;f=(b|0)>0;if(f){h=0;i=0;do{i=(c[a+(h<<4)>>2]|0)+i|0;h=h+1|0;}while((h|0)<(b|0));j=i<<2}else{j=0}i=jk(j)|0;j=b<<2;h=jk(j)|0;k=h;if(f){vF(h|0,0,j|0)|0}if((c[d>>2]|0)==0){if(f){j=0;l=i;while(1){c[a+(j<<4)+8>>2]=l;As(a,j,k);m=a+(j<<4)|0;n=c[m>>2]|0;o=n-1|0;if((n|0)>=2){n=a+(j<<4)+4|0;p=+(o|0);q=1;while(1){r=c[(c[n>>2]|0)+(q<<2)>>2]|0;s=p+ +((c[a+(r<<4)>>2]|0)-1|0);g[l+(q<<2)>>2]=s- +((zs(a,j,r,k)|0)<<1|0);if((q|0)<(o|0)){q=q+1|0}else{break}}}Bs(a,j,k);q=j+1|0;if((q|0)<(b|0)){j=q;l=l+(c[m>>2]<<2)|0}else{break}}}t=lu(a,b)|0}else{if(f){l=0;j=i;while(1){As(a,l,k);i=a+(l<<4)|0;q=c[i>>2]|0;o=q-1|0;if((q|0)<2){u=a+(l<<4)+8|0}else{n=a+(l<<4)+4|0;r=q-2|0;q=a+(l<<4)+8|0;v=1;while(1){w=c[(c[n>>2]|0)+(v<<2)>>2]|0;x=r+(c[a+(w<<4)>>2]|0)|0;p=+(x-((zs(a,l,w,k)|0)<<1)|0);s=+g[(c[q>>2]|0)+(v<<2)>>2];if(p>s){y=+(x-((zs(a,l,w,k)|0)<<1)|0)}else{y=s}g[j+(v<<2)>>2]=y;if((v|0)<(o|0)){v=v+1|0}else{u=q;break}}}Bs(a,l,k);c[u>>2]=j;q=l+1|0;if((q|0)<(b|0)){l=q;j=j+(c[i>>2]<<2)|0}else{break}}}t=ku(a,b)|0}eF(h);eF(c[d>>2]|0);c[d>>2]=0;if((e|0)==0|f^1){return t|0}else{z=0;A=e}do{c[a+(z<<4)+8>>2]=A;A=A+(c[a+(z<<4)>>2]<<2)|0;z=z+1|0;}while((z|0)<(b|0));return t|0}function nu(b,e,f,j,k,l,m,n,p){b=b|0;e=e|0;f=f|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0.0,za=0.0,Aa=0.0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0.0,Ia=0.0,Ja=0.0,La=0.0,Na=0,Oa=0,Pa=0.0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0.0,bb=0,cb=0,db=0,eb=0.0,fb=0,gb=0,hb=0.0,ib=0.0,jb=0,kb=0.0,lb=0.0,mb=0.0,nb=0,ob=0.0,pb=0,qb=0.0,rb=0.0,sb=0.0,tb=0,ub=0.0,vb=0,wb=0.0,xb=0.0,zb=0,Ab=0,Bb=0,Cb=0.0,Db=0.0,Eb=0.0,Fb=0.0,Gb=0,Hb=0.0,Ib=0;f=i;i=i+40|0;q=f|0;r=f+8|0;s=f+24|0;t=f+32|0;u=m&4;v=m&3;if((p|0)<0){w=0;i=f;return w|0}if((a[213992]|0)!=0){ym()}m=(n|0)==2;do{if(m){if((a[213992]|0)!=0){Ma(157464,24,1,c[o>>2]|0)|0}x=mu(b,e)|0;y=14}else{if((n|0)==1){z=iu(b,e)|0;if((z|0)!=0){A=z;break}Fv(0,127544,(B=i,i=i+1|0,i=i+7&-8,c[B>>2]=0,B)|0)|0;i=B;Fv(3,115272,(B=i,i=i+1|0,i=i+7&-8,c[B>>2]=0,B)|0)|0;i=B;y=15;break}else if((n|0)!=3){y=15;break}if((a[213992]|0)!=0){Ma(108184,21,1,c[o>>2]|0)|0}x=ju(b,e)|0;y=14}}while(0);if((y|0)==14){if((x|0)==0){y=15}else{A=x}}do{if((y|0)==15){if((a[213992]|0)!=0){Ma(102560,26,1,c[o>>2]|0)|0}if((c[b+8>>2]|0)==0){A=lu(b,e)|0;break}else{A=ku(b,e)|0;break}}}while(0);if((a[213992]|0)!=0){x=c[o>>2]|0;C=+zm();gc(x|0,96864,(B=i,i=i+8|0,h[B>>3]=C,B)|0)|0;i=B;Ma(91480,25,1,x|0)|0;ym()}do{if((u|0)!=0&(e|0)>1){x=m&1;n=(e|0)>50?50:e;z=kk(n<<2)|0;D=z;E=e<<3;F=kk(da(n,E)|0)|0;G=(n|0)>0;if(G){H=0;do{c[D+(H<<2)>>2]=F+((da(H,e)|0)<<3);H=H+1|0;}while((H|0)<(n|0))}H=n<<1;F=(H|0)>50?H:50;H=(F|0)>(e|0)?e:F;c[q>>2]=0;Xr(b,e,H,q,x);Yr(c[q>>2]|0,e,H);Ut(c[q>>2]|0,H,e,D,n);eF(c[c[q>>2]>>2]|0);eF(c[q>>2]|0);H=e<<2;F=kk(H)|0;I=F;J=(e|0)>0;if(J){vF(F|0,-1|0,H|0)|0}vr(r,e);K=c[b+8>>2]|0;if(m){Ds(b,e)}L=kk(H)|0;M=kk(160)|0;N=kk(e*160|0)|0;O=kk(160)|0;P=O;Q=0;do{c[P+(Q<<2)>>2]=N+((da(Q,e)|0)<<2);Q=Q+1|0;}while((Q|0)<40);Q=L;N=M;x=(yb()|0)%(e|0)|0;c[I+(x<<2)>>2]=0;c[N>>2]=x;R=c[P>>2]|0;if(m){Rr(x,b,e,R)}else{ur(x,b,e,R,r)}if(J){R=0;U=x;V=0;while(1){W=c[(c[P>>2]|0)+(V<<2)>>2]|0;c[Q+(V<<2)>>2]=W;X=(W|0)>(R|0);Y=X?V:U;Z=V+1|0;if((Z|0)<(e|0)){R=X?W:R;U=Y;V=Z}else{_=Y;$=1;break}}}else{_=x;$=1}while(1){c[I+(_<<2)>>2]=$;c[N+($<<2)>>2]=_;V=P+($<<2)|0;U=c[V>>2]|0;if(m){Rr(_,b,e,U)}else{ur(_,b,e,U,r)}if(J){U=0;R=_;Y=0;while(1){Z=Q+(Y<<2)|0;W=c[Z>>2]|0;X=c[(c[V>>2]|0)+(Y<<2)>>2]|0;aa=(W|0)<(X|0)?W:X;c[Z>>2]=aa;do{if((aa|0)>(U|0)){ba=Y;ca=aa}else{if((aa|0)!=(U|0)){ba=R;ca=U;break}if(((yb()|0)%(Y+1|0)|0|0)!=0){ba=R;ca=U;break}ba=Y;ca=c[Z>>2]|0}}while(0);Z=Y+1|0;if((Z|0)<(e|0)){U=ca;R=ba;Y=Z}else{ea=ba;break}}}else{ea=_}Y=$+1|0;if((Y|0)<40){_=ea;$=Y}else{break}}if(J){vF(L|0,-1|0,H|0)|0}Q=kk(H)|0;x=e<<4;Y=kk(x)|0;R=Y;if(J){U=e-1|0;V=U<<2;Z=0;aa=0;X=0;W=0;fa=0;while(1){ga=I+(fa<<2)|0;do{if((c[ga>>2]|0)>-1){ha=R+(fa<<4)+4|0;c[ha>>2]=kk(V)|0;ia=R+(fa<<4)+8|0;c[ia>>2]=kk(V)|0;c[R+(fa<<4)>>2]=U;a[R+(fa<<4)+12|0]=1;ja=c[ga>>2]|0;if((fa|0)>0){ka=P+(ja<<2)|0;la=0;do{c[(c[ha>>2]|0)+(la<<2)>>2]=la;c[(c[ia>>2]|0)+(la<<2)>>2]=c[(c[ka>>2]|0)+(la<<2)>>2];la=la+1|0;}while((la|0)<(fa|0))}la=fa+1|0;if((la|0)>=(e|0)){ma=U;na=X;oa=aa;pa=Z;qa=la;break}ka=P+(ja<<2)|0;ra=fa;sa=la;while(1){c[(c[ha>>2]|0)+(ra<<2)>>2]=sa;c[(c[ia>>2]|0)+(ra<<2)>>2]=c[(c[ka>>2]|0)+(sa<<2)>>2];ta=sa+1|0;if((ta|0)<(e|0)){ra=sa;sa=ta}else{ma=U;na=X;oa=aa;pa=Z;qa=la;break}}}else{if((Z|0)<40){la=kk(H)|0;sa=kk(H)|0;a[R+(fa<<4)+12|0]=1;ua=sa;va=la;wa=e}else{a[R+(fa<<4)+12|0]=0;ua=X;va=aa;wa=Z}c[R+(fa<<4)+4>>2]=va;c[R+(fa<<4)+8>>2]=ua;c[R+(fa<<4)>>2]=40;la=0;do{c[va+(la<<2)>>2]=c[N+(la<<2)>>2];c[ua+(la<<2)>>2]=c[(c[P+(la<<2)>>2]|0)+(fa<<2)>>2];la=la+1|0;}while((la|0)<40);ma=40;na=ua+160|0;oa=va+160|0;pa=wa-40|0;qa=fa+1|0}}while(0);ga=ma+W|0;if((qa|0)<(e|0)){Z=pa;aa=oa;X=na;W=ga;fa=qa}else{xa=ga;break}}}else{xa=0}eF(L);eF(Q);if((O|0)!=0){eF(c[P>>2]|0);eF(O)}fa=kk(x)|0;W=fa;X=xa+e<<2;aa=kk(X)|0;Z=kk(X)|0;if(J){X=(v|0)==2;N=aa;aa=Z;Z=0;while(1){c[W+(Z<<4)+4>>2]=N;c[W+(Z<<4)+8>>2]=aa;H=c[R+(Z<<4)>>2]|0;U=W+(Z<<4)|0;c[U>>2]=H+1;V=c[R+(Z<<4)+8>>2]|0;I=(H|0)>0;do{if(X){if(!I){ya=0.0;break}H=R+(Z<<4)+4|0;C=0.0;ga=1;while(1){la=ga-1|0;c[N+(ga<<2)>>2]=c[(c[H>>2]|0)+(la<<2)>>2];za=+(c[V+(la<<2)>>2]|0);Aa=-1.0/(za*za);g[aa+(ga<<2)>>2]=Aa;za=C-Aa;la=ga+1|0;if((la|0)<(c[U>>2]|0)){C=za;ga=la}else{ya=za;break}}}else{if(!I){ya=0.0;break}ga=R+(Z<<4)+4|0;C=0.0;H=1;while(1){la=H-1|0;c[N+(H<<2)>>2]=c[(c[ga>>2]|0)+(la<<2)>>2];za=-1.0/+(c[V+(la<<2)>>2]|0);g[aa+(H<<2)>>2]=za;Aa=C-za;la=H+1|0;if((la|0)<(c[U>>2]|0)){C=Aa;H=la}else{ya=Aa;break}}}}while(0);c[N>>2]=Z;g[aa>>2]=ya;V=c[U>>2]|0;I=Z+1|0;if((I|0)<(e|0)){N=N+(V<<2)|0;aa=aa+(V<<2)|0;Z=I}else{break}}}Z=kk(l<<2)|0;aa=Z;N=n<<3;X=kk(da(N,l)|0)|0;c[aa>>2]=X;a:do{if((l|0)>1){c[Z+4>>2]=X+(n<<3);if((l|0)>2){Ba=2;Ca=X}else{Da=0;y=81;break}while(1){c[aa+(Ba<<2)>>2]=Ca+((da(Ba,n)|0)<<3);x=Ba+1|0;if((x|0)>=(l|0)){y=80;break a}Ba=x;Ca=c[aa>>2]|0}}else{y=80}}while(0);if((y|0)==80){if((l|0)>0){Da=0;y=81}else{Ea=0}}if((y|0)==81){while(1){y=0;if(G){X=aa+(Da<<2)|0;U=0;do{h[(c[X>>2]|0)+(U<<3)>>3]=0.0;U=U+1|0;}while((U|0)<(n|0))}U=Da+1|0;if((U|0)<(l|0)){Da=U;y=81}else{break}}do{if((l|0)==2){h[c[aa>>2]>>3]=1.0;U=Z+4|0;if((Vt(D,n,e,c[U>>2]|0)|0)<<24>>24!=0){Fa=0;break}X=c[U>>2]|0;if(G){x=0;O=X;while(1){h[O+(x<<3)>>3]=0.0;P=x+1|0;Q=c[U>>2]|0;if((P|0)<(n|0)){x=P;O=Q}else{Ga=Q;break}}}else{Ga=X}h[Ga+8>>3]=1.0;Fa=0}else{O=0;while(1){h[(c[aa+(O<<2)>>2]|0)+(O<<3)>>3]=1.0;x=O+1|0;if((x|0)<(l|0)){O=x}else{Fa=0;break}}}}while(0);while(1){_s(D,e,n,c[aa+(Fa<<2)>>2]|0,c[j+(Fa<<2)>>2]|0);G=Fa+1|0;if((G|0)<(l|0)){Fa=G}else{Ea=1;break}}}c[s>>2]=0;c[t>>2]=0;Rs(W,D,e,n,s);Ps(D,c[s>>2]|0,n,e,n,t);eF(c[c[s>>2]>>2]|0);eF(c[s>>2]|0);G=kk(E)|0;O=G;X=kk(N)|0;x=X;C=+ou(j,R,l,e,v);U=0;b:while(1){if(Ea){Q=0;do{if(J){P=j+(Q<<2)|0;L=0;do{I=O+(L<<3)|0;h[I>>3]=0.0;V=c[R+(L<<4)+8>>2]|0;H=c[W+(L<<4)+4>>2]|0;ga=c[W+(L<<4)+8>>2]|0;la=W+(L<<4)|0;if((c[la>>2]|0)>1){Aa=0.0;sa=1;while(1){ra=c[H+(sa<<2)>>2]|0;za=+Fs(j,l,L,ra);if(za>1.0e-30){Ha=(-0.0- +g[ga+(sa<<2)>>2]*+(c[V+(sa-1<<2)>>2]|0))/za;h[I>>3]=+h[I>>3]+Ha*+h[(c[P>>2]|0)+(ra<<3)>>3];Ia=Aa-Ha}else{Ia=Aa}ra=sa+1|0;if((ra|0)<(c[la>>2]|0)){Aa=Ia;sa=ra}else{break}}Ja=Ia;La=+h[I>>3]}else{Ja=0.0;La=0.0}h[I>>3]=La+Ja*+h[(c[P>>2]|0)+(L<<3)>>3];L=L+1|0;}while((L|0)<(e|0))}Os(D,n,e,O,x);L=aa+(Q<<2)|0;if((Ar(c[t>>2]|0,c[L>>2]|0,x,n,.001,n,0)|0)!=0){Na=-1;break b}_s(D,e,n,c[L>>2]|0,c[j+(Q<<2)>>2]|0);Q=Q+1|0;}while((Q|0)<(l|0))}if((U&1|0)==0){Aa=+ou(j,R,l,e,v);Ha=+S(+(Aa-C))/(Aa+1.0e-10);Oa=Ha>=+h[21657];Pa=Aa}else{Oa=1;Pa=C}Q=U+1|0;if((Q|0)<50&Oa){C=Pa;U=Q}else{Na=Q;break}}eF(X);eF(G);if(m){Es(b,e,K)}if(J){U=0;do{if((a[R+(U<<4)+12|0]|0)!=0){eF(c[R+(U<<4)+4>>2]|0);eF(c[R+(U<<4)+8>>2]|0)}U=U+1|0;}while((U|0)<(e|0))}eF(Y);eF(c[fa+4>>2]|0);eF(c[fa+8>>2]|0);eF(fa);eF(F);eF(M);eF(c[aa>>2]|0);eF(Z);U=c[t>>2]|0;if((U|0)!=0){eF(c[U>>2]|0);eF(c[t>>2]|0)}eF(c[D>>2]|0);eF(z);wr(r);if((Na|0)<0){Qa=-1;Ra=0;Sa=0;Ta=0;Ua=0;Va=0;Wa=0;Xa=0;Ya=0;break}if(Ea){Za=0}else{_a=0;y=129;break}while(1){do{if(J){U=c[j+(Za<<2)>>2]|0;R=0;C=1.0;do{Aa=+S(+(+h[U+(R<<3)>>3]));C=Aa>C?Aa:C;R=R+1|0;}while((R|0)<(e|0));if(!J){y=124;break}R=j+(Za<<2)|0;U=0;do{K=(c[R>>2]|0)+(U<<3)|0;h[K>>3]=+h[K>>3]/C;U=U+1|0;}while((U|0)<(e|0));if(!J){y=124;break}U=j+(Za<<2)|0;R=0;while(1){C=(+wn()+-.5)*1.0e-6;K=(c[U>>2]|0)+(R<<3)|0;h[K>>3]=+h[K>>3]+C;K=R+1|0;if((K|0)<(e|0)){R=K}else{$a=U;break}}}else{y=124}}while(0);if((y|0)==124){y=0;$a=j+(Za<<2)|0}Ss(e,c[$a>>2]|0);U=Za+1|0;if((U|0)<(l|0)){Za=U}else{_a=0;y=129;break}}}else{_a=hu(0,e,l,j,k)|0;y=129}}while(0);c:do{if((y|0)==129){if((a[213992]|0)!=0){Za=c[o>>2]|0;Pa=+zm();gc(Za|0,86240,(B=i,i=i+8|0,h[B>>3]=Pa,B)|0)|0;i=B}if((e|0)==1|(p|0)==0){w=0;i=f;return w|0}if((a[213992]|0)!=0){Za=c[o>>2]|0;Pa=+zm();gc(Za|0,96864,(B=i,i=i+8|0,h[B>>3]=Pa,B)|0)|0;i=B;Ma(81504,26,1,Za|0)|0;ym()}Za=l<<2;$a=jk(Za)|0;Ea=e<<2;Na=da(Ea,l)|0;r=jk(Na)|0;t=(l|0)>0;if(t){b=(e|0)>0;m=0;do{Oa=r+((da(m,e)|0)<<2)|0;s=$a+(m<<2)|0;c[s>>2]=Oa;d:do{if(b){Fa=j+(m<<2)|0;Ga=0;Da=Oa;while(1){g[Da+(Ga<<2)>>2]=+h[(c[Fa>>2]|0)+(Ga<<3)>>3];Ca=Ga+1|0;if((Ca|0)>=(e|0)){break d}Ga=Ca;Da=c[s>>2]|0}}}while(0);m=m+1|0;}while((m|0)<(l|0))}do{if((v|0)==0){m=e-1|0;if((m|0)>0){ab=0.0;bb=0;cb=0;db=e}else{eb=0.0;fb=(da(e+1|0,e)|0)/2|0;gb=0;break}while(1){b=bb+1|0;s=e-cb|0;if((s|0)>1){Pa=ab;Oa=1;Da=b;while(1){hb=Pa+ +g[A+(Da<<2)>>2];Ga=Oa+1|0;if((Ga|0)<(s|0)){Pa=hb;Oa=Ga;Da=Da+1|0}else{break}}ib=hb;jb=bb+db|0}else{ib=ab;jb=b}Da=cb+1|0;if((Da|0)<(m|0)){ab=ib;bb=jb;cb=Da;db=db-1|0}else{kb=ib;y=149;break}}}else{kb=+(e|0)*+(e-1|0)*.5;y=149}}while(0);do{if((y|0)==149){m=(da(e+1|0,e)|0)/2|0;if((v|0)!=2){eb=kb;fb=m;gb=0;break}jt(m,A);eb=kb;fb=m;gb=1}}while(0);kt(fb,A);m=e<<3;Da=jk(m)|0;Oa=Da;vF(Da|0,0,m|0)|0;s=e-1|0;Ga=(s|0)>0;if(Ga){Fa=0;Ca=0;Ba=e;while(1){xa=Fa+1|0;qa=e-Ca|0;if((qa|0)>1){Pa=0.0;na=1;oa=xa;while(1){Ja=+g[A+(oa<<2)>>2];lb=Pa+Ja;pa=Oa+(na+Ca<<3)|0;h[pa>>3]=+h[pa>>3]-Ja;pa=na+1|0;if((pa|0)<(qa|0)){Pa=lb;na=pa;oa=oa+1|0}else{break}}mb=lb;nb=Fa+Ba|0}else{mb=0.0;nb=xa}oa=Oa+(Ca<<3)|0;h[oa>>3]=+h[oa>>3]-mb;oa=Ca+1|0;if((oa|0)<(s|0)){Fa=nb;Ca=oa;Ba=Ba-1|0}else{break}}}Ba=(e|0)>0;if(Ba){Ca=0;Fa=e;oa=0;while(1){g[A+(Ca<<2)>>2]=+h[Oa+(oa<<3)>>3];na=oa+1|0;if((na|0)<(e|0)){Ca=Fa+Ca|0;Fa=Fa-1|0;oa=na}else{break}}}oa=jk(Za)|0;Fa=jk(Na)|0;c[oa>>2]=Fa;e:do{if((l|0)>1){Ca=1;na=Fa;while(1){c[oa+(Ca<<2)>>2]=na+((da(Ca,e)|0)<<2);qa=Ca+1|0;if((qa|0)>=(l|0)){break e}Ca=qa;na=c[oa>>2]|0}}}while(0);Fa=jk(Ea)|0;Na=jk(Ea)|0;Za=jk(fb<<2)|0;if((a[213992]|0)!=0){na=c[o>>2]|0;Pa=+zm();gc(na|0,96864,(B=i,i=i+8|0,h[B>>3]=Pa,B)|0)|0;i=B;Ma(167776,15,1,na|0)|0;ym()}if((p|0)>0){Pa=eb;na=c[o>>2]|0;Ca=(_a|0)==0;Ja=1.7976931348623157e+308;xa=0;while(1){vF(Da|0,0,m|0)|0;if(gb){lt(fb,A,Za)}if(Ga){qa=0;pa=0;ma=e;while(1){wa=e-pa-1|0;ht(wa,0.0,Na);if(t){va=pa+1|0;ua=0;do{$=$a+(ua<<2)|0;ht(wa,+g[(c[$>>2]|0)+(pa<<2)>>2],Fa);dt(wa,Fa,-1.0,(c[$>>2]|0)+(va<<2)|0);jt(wa,Fa);ct(wa,Fa,Na,Na);ua=ua+1|0;}while((ua|0)<(l|0))}mt(wa,Na);ua=(wa|0)>0;if(ua){va=0;do{b=Na+(va<<2)|0;La=+g[b>>2];if(La>=3.4028234663852886e+38|La<0.0){g[b>>2]=0.0}va=va+1|0;}while((va|0)<(wa|0))}va=qa+1|0;do{if(gb){if(!ua){ob=0.0;pb=va;break}b=pa+1|0;$=va;La=0.0;ea=0;while(1){_=Za+($<<2)|0;Ia=+g[Na+(ea<<2)>>2]*+g[_>>2];g[_>>2]=Ia;ya=Ia;qb=La+ya;_=Oa+(b+ea<<3)|0;h[_>>3]=+h[_>>3]-ya;_=ea+1|0;if((_|0)<(wa|0)){$=$+1|0;La=qb;ea=_}else{break}}ob=qb;pb=qa+ma|0}else{if(!ua){ob=0.0;pb=va;break}ea=pa+1|0;$=va;La=0.0;b=0;while(1){ya=+g[Na+(b<<2)>>2];g[Za+($<<2)>>2]=ya;Ia=ya;rb=La+Ia;I=Oa+(ea+b<<3)|0;h[I>>3]=+h[I>>3]-Ia;I=b+1|0;if((I|0)<(wa|0)){$=$+1|0;La=rb;b=I}else{break}}ob=rb;pb=qa+ma|0}}while(0);wa=Oa+(pa<<3)|0;h[wa>>3]=+h[wa>>3]-ob;wa=pa+1|0;if((wa|0)<(s|0)){qa=pb;pa=wa;ma=ma-1|0}else{break}}}if(Ba){ma=0;pa=e;qa=0;while(1){g[Za+(ma<<2)>>2]=+h[Oa+(qa<<3)>>3];wa=qa+1|0;if((wa|0)<(e|0)){ma=pa+ma|0;pa=pa-1|0;qa=wa}else{break}}}do{if(t){qa=0;do{at(Za,e,c[$a+(qa<<2)>>2]|0,c[oa+(qa<<2)>>2]|0);qa=qa+1|0;}while((qa|0)<(l|0));if(t){sb=0.0;tb=0}else{y=191;break}do{sb=sb+ +gt(e,c[$a+(tb<<2)>>2]|0,c[oa+(tb<<2)>>2]|0);tb=tb+1|0;}while((tb|0)<(l|0));La=Pa+sb*2.0;if(t){ub=La;vb=0}else{wb=La;break}while(1){qa=$a+(vb<<2)|0;at(A,e,c[qa>>2]|0,Fa);La=ub- +gt(e,c[qa>>2]|0,Fa);qa=vb+1|0;if((qa|0)<(l|0)){ub=La;vb=qa}else{wb=La;break}}}else{y=191}}while(0);if((y|0)==191){y=0;wb=Pa+0.0}La=Ja-wb;if(La<0.0){xb=-0.0-La}else{xb=La}La=+h[21657];if(xb/Ja<La){zb=1}else{zb=wb<La|0}if(t){qa=0;do{pa=$a+(qa<<2)|0;ma=c[pa>>2]|0;do{if(Ca){if((Br(A,ma,c[oa+(qa<<2)>>2]|0,e,.001,e)|0)<0){Qa=-1;Ra=Za;Sa=Na;Ta=Fa;Ua=oa;Va=Oa;Wa=A;Xa=$a;Ya=r;break c}}else{ft(e,ma,Fa);if((Br(A,Fa,c[oa+(qa<<2)>>2]|0,e,.001,e)|0)<0){Qa=-1;Ra=Za;Sa=Na;Ta=Fa;Ua=oa;Va=Oa;Wa=A;Xa=$a;Ya=r;break c}if(Ba){Ab=0}else{break}do{if((d[(c[(c[k+(Ab<<2)>>2]|0)+8>>2]|0)+119|0]|0)>>>0<=1>>>0){g[(c[pa>>2]|0)+(Ab<<2)>>2]=+g[Fa+(Ab<<2)>>2]}Ab=Ab+1|0;}while((Ab|0)<(e|0))}}while(0);qa=qa+1|0;}while((qa|0)<(l|0))}do{if((a[213992]|0)!=0){if(((xa|0)%5|0|0)!=0){break}gc(na|0,163608,(B=i,i=i+8|0,h[B>>3]=wb,B)|0)|0;i=B;if(((xa+5|0)%50|0|0)!=0){break}Ka(10,na|0)|0}}while(0);qa=xa+1|0;if((qa|0)<(p|0)&zb<<24>>24==0){Ja=wb;xa=qa}else{Bb=qa;break}}}else{Bb=0}if((a[213992]|0)!=0){xa=c[o>>2]|0;if(Ga){na=0;Ca=0;Ja=0.0;m=e;while(1){Da=Ca+1|0;Ea=e-na|0;if((Ea|0)>1){qa=1;Pa=Ja;pa=Da;while(1){ma=qa+na|0;if(t){wa=0;La=0.0;while(1){va=c[$a+(wa<<2)>>2]|0;Ia=+g[va+(na<<2)>>2]- +g[va+(ma<<2)>>2];ya=La+Ia*Ia;va=wa+1|0;if((va|0)<(l|0)){wa=va;La=ya}else{Cb=ya;break}}}else{Cb=0.0}La=+T(Cb);ya=+g[A+(pa<<2)>>2];if(gb){Ia=1.0/+T(ya)-La;Db=Ia*Ia}else{Ia=1.0/ya-La;Db=Ia*Ia}Eb=Pa+ya*Db;wa=qa+1|0;if((wa|0)<(Ea|0)){qa=wa;Pa=Eb;pa=pa+1|0}else{break}}Fb=Eb;Gb=Ca+m|0}else{Fb=Ja;Gb=Da}pa=na+1|0;if((pa|0)<(s|0)){na=pa;Ca=Gb;Ja=Fb;m=m-1|0}else{Hb=Fb;break}}}else{Hb=0.0}Ja=+zm();gc(xa|0,154504,(B=i,i=i+24|0,h[B>>3]=Hb,c[B+8>>2]=Bb,h[B+16>>3]=Ja,B)|0)|0;i=B}if(t){Ib=0}else{Qa=Bb;Ra=Za;Sa=Na;Ta=Fa;Ua=oa;Va=Oa;Wa=A;Xa=$a;Ya=r;break}while(1){if(Ba){m=$a+(Ib<<2)|0;Ca=j+(Ib<<2)|0;na=0;do{h[(c[Ca>>2]|0)+(na<<3)>>3]=+g[(c[m>>2]|0)+(na<<2)>>2];na=na+1|0;}while((na|0)<(e|0))}na=Ib+1|0;if((na|0)<(l|0)){Ib=na}else{Qa=Bb;Ra=Za;Sa=Na;Ta=Fa;Ua=oa;Va=Oa;Wa=A;Xa=$a;Ya=r;break}}}}while(0);eF(Ya);eF(Xa);eF(Wa);if((Ua|0)!=0){eF(c[Ua>>2]|0);eF(Ua)}eF(Ta);eF(Sa);eF(Va);eF(Ra);w=Qa;i=f;return w|0}function ou(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0.0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;g=(e|0)>0;if((f|0)==2){if(!g){i=0.0;return+i}f=(d|0)>0;j=0;k=0.0;while(1){l=c[b+(j<<4)>>2]|0;if((l|0)>0){m=c[b+(j<<4)+4>>2]|0;n=b+(j<<4)+8|0;o=0;p=k;while(1){q=c[m+(o<<2)>>2]|0;if((q|0)>(j|0)){if(f){r=0;s=0.0;while(1){t=c[a+(r<<2)>>2]|0;u=+h[t+(j<<3)>>3]- +h[t+(q<<3)>>3];v=s+u*u;t=r+1|0;if((t|0)<(d|0)){r=t;s=v}else{w=v;break}}}else{w=0.0}s=+T(w);v=+(c[(c[n>>2]|0)+(o<<2)>>2]|0);u=v-s;x=p+u*u/(v*v)}else{x=p}r=o+1|0;if((r|0)<(l|0)){o=r;p=x}else{y=x;break}}}else{y=k}o=j+1|0;if((o|0)<(e|0)){j=o;k=y}else{i=y;break}}return+i}else{if(!g){i=0.0;return+i}g=(d|0)>0;j=0;y=0.0;while(1){f=c[b+(j<<4)>>2]|0;if((f|0)>0){o=c[b+(j<<4)+4>>2]|0;l=b+(j<<4)+8|0;n=0;k=y;while(1){m=c[o+(n<<2)>>2]|0;if((m|0)>(j|0)){if(g){r=0;x=0.0;while(1){q=c[a+(r<<2)>>2]|0;w=+h[q+(j<<3)>>3]- +h[q+(m<<3)>>3];p=x+w*w;q=r+1|0;if((q|0)<(d|0)){r=q;x=p}else{z=p;break}}}else{z=0.0}x=+T(z);p=+(c[(c[l>>2]|0)+(n<<2)>>2]|0);w=p-x;A=k+w*w/p}else{A=k}r=n+1|0;if((r|0)<(f|0)){n=r;k=A}else{B=A;break}}}else{B=y}n=j+1|0;if((n|0)<(e|0)){j=n;y=B}else{i=B;break}}return+i}return 0.0}function pu(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0;e=jk(a<<2)|0;f=jk(da(a<<3,b)|0)|0;if((a|0)<=0){return e|0}if((b|0)>0){g=f;i=0}else{j=f;f=0;while(1){c[e+(f<<2)>>2]=j;k=f+1|0;if((k|0)<(a|0)){j=j+(b<<3)|0;f=k}else{break}}return e|0}while(1){f=e+(i<<2)|0;c[f>>2]=g;j=g+(b<<3)|0;k=0;l=g;while(1){h[l+(k<<3)>>3]=d;m=k+1|0;if((m|0)>=(b|0)){break}k=m;l=c[f>>2]|0}f=i+1|0;if((f|0)<(a|0)){g=j;i=f}else{break}}return e|0}function qu(a){a=a|0;if((a|0)==0){return}eF(c[a>>2]|0);eF(a);return}function ru(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0,R=0.0,S=0,U=0.0,V=0,W=0.0,X=0,Y=0.0,Z=0,_=0,$=0;e=i;if((a[213992]|0)!=0){f=c[o>>2]|0;g=$w(b|0)|0;j=Lw(b)|0;gc(f|0,118408,(f=i,i=i+16|0,c[f>>2]=g,c[f+8>>2]=j,f)|0)|0;i=f}do{if((a[214184]|0)!=0){f=ux(b)|0;if((f|0)==0){break}j=b+48|0;g=0;k=f;while(1){f=vx(b,k)|0;l=rw(b,k)|0;a:do{if((l|0)==0){m=g;n=15}else{p=l;q=0;r=0;s=g;while(1){t=c[p>>2]&3;u=c[((t|0)==2?p:p-32|0)+28>>2]|0;v=c[((t|0)==3?p:p+32|0)+28>>2]|0;do{if((u|0)==(v|0)){w=r;x=q;y=s}else{t=(v|0)==(k|0);if((q|0)!=1){z=t?u:v;w=z;x=q+1|0;y=z;break}if(t&(u|0)==(r|0)){w=r;x=1;y=s;break}if((v|0)==(r|0)&(u|0)==(k|0)){w=r;x=1;y=s}else{A=f;B=s;break a}}}while(0);u=sw(b,p,k)|0;if((u|0)==0){break}else{p=u;q=x;r=w;s=y}}if((x|0)==0){m=y;n=15;break}else if((x|0)!=1){A=f;B=y;break}Gx(c[j>>2]|0,k|0)|0;if((y|0)==0){A=f;B=0;break}else{C=0;D=f;E=y}while(1){s=rw(b,E)|0;if((s|0)==0){break}else{F=s;G=0;H=0;I=C}while(1){s=c[F>>2]&3;r=c[((s|0)==2?F:F-32|0)+28>>2]|0;q=c[((s|0)==3?F:F+32|0)+28>>2]|0;do{if((r|0)==(q|0)){J=H;K=G;L=I}else{s=(q|0)==(E|0);if((G|0)!=1){p=s?r:q;J=p;K=G+1|0;L=p;break}if(s&(r|0)==(H|0)){J=H;K=1;L=I;break}if((q|0)==(H|0)&(r|0)==(E|0)){J=H;K=1;L=I}else{A=D;B=y;break a}}}while(0);r=sw(b,F,E)|0;if((r|0)==0){break}else{F=r;G=K;H=J;I=L}}if((K|0)==0){break}else if((K|0)!=1){A=D;B=y;break a}if((D|0)==(E|0)){M=vx(b,E)|0}else{M=D}Gx(c[j>>2]|0,E|0)|0;if((L|0)==0){A=M;B=y;break a}else{C=L;D=M;E=L}}if((D|0)==(E|0)){N=vx(b,E)|0}else{N=D}Gx(c[j>>2]|0,E|0)|0;A=N;B=y}}while(0);if((n|0)==15){n=0;Gx(c[j>>2]|0,k|0)|0;A=f;B=m}if((A|0)==0){break}else{g=B;k=A}}}}while(0);A=Lw(b)|0;B=Mw(b)|0;m=Wv(b,2,156808,0)|0;y=(d|0)==0;do{if(y){h[21657]=+(A|0)*1.0e-4;Oj(b,127200,173256);d=ew(c[b+48>>2]|0,115168)|0;if((d|0)==0){O=.99}else{O=+rF(d)}h[21674]=O;d=jk((A<<2)+4|0)|0;N=b+8|0;c[(c[N>>2]|0)+144>>2]=d;d=ux(b)|0;if((d|0)==0){P=0.0;break}else{Q=d;R=0.0;S=0}while(1){c[(c[(c[N>>2]|0)+144>>2]|0)+(S<<2)>>2]=Q;d=Q+8|0;c[(c[d>>2]|0)+120>>2]=S;c[(c[d>>2]|0)+124>>2]=-1;U=R+ +su(b,Q,m);d=vx(b,Q)|0;if((d|0)==0){P=U;break}else{Q=d;R=U;S=S+1|0}}}else{h[21657]=1.0e-4;Oj(b,127200,173256);N=ux(b)|0;if((N|0)==0){P=0.0;break}else{V=N;W=0.0;X=0}while(1){c[(c[V+8>>2]|0)+120>>2]=X;U=W+ +su(b,V,m);N=vx(b,V)|0;if((N|0)==0){P=U;break}else{V=N;W=U;X=X+1|0}}}}while(0);X=ew(b|0,108128)|0;do{if((X|0)==0){n=42}else{if((a[X]|0)==0){n=42;break}W=+h[21657];R=+rF(X);if(W>R){Y=W;break}Y=R}}while(0);if((n|0)==42){Y=P/((B|0)<1?1.0:+(B|0))*+T(+(A|0))+1.0}h[21638]=Y;if((c[53566]|0)!=0|y^1){i=e;return A|0}y=A<<2;B=jk(y)|0;n=B;X=A<<3;V=da(X,A)|0;m=jk(V)|0;S=(A|0)>0;if(S){Q=(A|0)>1;N=m;m=0;while(1){d=n+(m<<2)|0;c[d>>2]=N;E=N+(A<<3)|0;h[N>>3]=Y;if(Q){D=1;do{h[(c[d>>2]|0)+(D<<3)>>3]=Y;D=D+1|0;}while((D|0)<(A|0))}D=m+1|0;if((D|0)<(A|0)){N=E;m=D}else{break}}}m=b+8|0;c[(c[m>>2]|0)+152>>2]=B;B=jk(y)|0;b=B;N=jk(V)|0;if(S){V=(A|0)>1;Q=N;N=0;while(1){n=b+(N<<2)|0;c[n>>2]=Q;D=Q+(A<<3)|0;h[Q>>3]=1.0;if(V){d=1;do{h[(c[n>>2]|0)+(d<<3)>>3]=1.0;d=d+1|0;}while((d|0)<(A|0))}d=N+1|0;if((d|0)<(A|0)){Q=D;N=d}else{break}}}c[(c[m>>2]|0)+156>>2]=B;B=c[53568]|0;N=jk(y)|0;Q=N;V=jk(da(B,X)|0)|0;b:do{if(S){if((B|0)<=0){X=V;b=0;while(1){c[Q+(b<<2)>>2]=X;d=b+1|0;if((d|0)<(A|0)){X=X+(B<<3)|0;b=d}else{break b}}}if((B|0)>1){Z=V;_=0}else{b=V;X=0;while(1){c[Q+(X<<2)>>2]=b;h[b>>3]=1.0;D=X+1|0;if((D|0)<(A|0)){b=b+(B<<3)|0;X=D}else{break b}}}while(1){X=Q+(_<<2)|0;c[X>>2]=Z;b=Z+(B<<3)|0;h[Z>>3]=1.0;D=1;do{h[(c[X>>2]|0)+(D<<3)>>3]=1.0;D=D+1|0;}while((D|0)<(B|0));D=_+1|0;if((D|0)<(A|0)){Z=b;_=D}else{break}}}}while(0);c[(c[m>>2]|0)+160>>2]=N;N=c[53568]|0;_=y+4|0;y=jk(_)|0;Z=y;if(S){S=N<<3;B=(N|0)>0;Q=0;while(1){V=Z+(Q<<2)|0;c[V>>2]=jk(_)|0;if(B){D=0;do{X=jk(S)|0;c[(c[V>>2]|0)+(D<<2)>>2]=X;X=0;do{h[(c[(c[V>>2]|0)+(D<<2)>>2]|0)+(X<<3)>>3]=0.0;X=X+1|0;}while((X|0)<(N|0));D=D+1|0;}while((D|0)<(A|0))}else{D=0;do{X=jk(S)|0;c[(c[V>>2]|0)+(D<<2)>>2]=X;D=D+1|0;}while((D|0)<(A|0))}c[(c[V>>2]|0)+(A<<2)>>2]=0;D=Q+1|0;if((D|0)<(A|0)){Q=D}else{$=A;break}}}else{$=0}c[Z+($<<2)>>2]=0;c[(c[m>>2]|0)+164>>2]=y;i=e;return A|0}function su(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0.0,q=0,r=0,s=0.0;f=i;i=i+8|0;g=f|0;j=mw(b,d)|0;if((j|0)==0){k=0.0;i=f;return+k}d=b|0;if((e|0)==0){l=0.0;m=j;while(1){h[g>>3]=1.0;h[(c[m+8>>2]|0)+136>>3]=1.0;n=l+ +h[g>>3];o=ow(b,m)|0;if((o|0)==0){k=n;break}else{l=n;m=o}}i=f;return+k}else{p=0.0;q=j}while(1){j=fw(q|0,e)|0;a:do{if((a[j]|0)==0){r=9}else{m=ac(j|0,129224,(o=i,i=i+8|0,c[o>>2]=g,o)|0)|0;i=o;do{if((m|0)>=1){l=+h[g>>3];if(l<0.0){break}if(l!=0.0|(c[53566]|0)!=0){s=l;break a}}}while(0);Fv(0,126024,(o=i,i=i+8|0,c[o>>2]=j,o)|0)|0;i=o;m=$w(d)|0;Fv(3,131512,(o=i,i=i+16|0,c[o>>2]=m,h[o+8>>3]=1.0,o)|0)|0;i=o;r=9}}while(0);if((r|0)==9){r=0;h[g>>3]=1.0;s=1.0}h[(c[q+8>>2]|0)+136>>3]=s;l=p+ +h[g>>3];j=ow(b,q)|0;if((j|0)==0){k=l;break}else{p=l;q=j}}i=f;return+k}function tu(a){a=a|0;return ru(a,0)|0}function uu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;b=a+8|0;eF(c[(c[b>>2]|0)+144>>2]|0);if((c[53566]|0)!=0){return}a=c[b>>2]|0;d=c[a+152>>2]|0;if((d|0)==0){e=a}else{eF(c[d>>2]|0);eF(d);e=c[b>>2]|0}d=c[e+156>>2]|0;if((d|0)==0){f=e}else{eF(c[d>>2]|0);eF(d);f=c[b>>2]|0}d=c[f+160>>2]|0;if((d|0)==0){g=f}else{eF(c[d>>2]|0);eF(d);g=c[b>>2]|0}d=c[g+164>>2]|0;f=d;if((d|0)==0){h=g}else{g=c[f>>2]|0;if((g|0)!=0){e=0;a=f;i=g;do{g=c[i>>2]|0;if((g|0)==0){j=i}else{k=0;l=g;while(1){eF(l);g=k+1|0;m=c[a>>2]|0;n=c[m+(g<<2)>>2]|0;if((n|0)==0){j=m;break}else{k=g;l=n}}}eF(j);e=e+1|0;a=f+(e<<2)|0;i=c[a>>2]|0;}while((i|0)!=0)}eF(d);h=c[b>>2]|0}c[h+164>>2]=0;return}function vu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0;if((c[53568]|0)<=(d|0)){return}e=+(b|0);b=a+8|0;a=d;do{f=e*+wn();h[(c[(c[b>>2]|0)+132>>2]|0)+(a<<3)>>3]=f;a=a+1|0;}while((a|0)<(c[53568]|0));return}function wu(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;if((c[53568]|0)<=2){return}d=+(b|0);b=a+8|0;a=2;do{e=d*+wn();h[(c[(c[b>>2]|0)+132>>2]|0)+(a<<3)>>3]=e;a=a+1|0;}while((a|0)<(c[53568]|0));return}function xu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0;e=i;if((a[213992]|0)!=0){Ma(102424,26,1,c[o>>2]|0)|0}f=wt(b,d,2)|0;if((f|0)==1){i=e;return}if((f|0)==0&(a[21544]^1)){Fv(0,96704,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;a[21544]=1}f=b+8|0;b=c[c[(c[f>>2]|0)+144>>2]>>2]|0;if((b|0)==0){i=e;return}else{g=0;j=b}do{b=j+8|0;do{if((a[(c[b>>2]|0)+119|0]|0)==0){k=+wn();h[c[(c[b>>2]|0)+132>>2]>>3]=k;k=+wn();h[(c[(c[b>>2]|0)+132>>2]|0)+8>>3]=k;if((c[53568]|0)>2){l=2}else{break}do{k=+wn();h[(c[(c[b>>2]|0)+132>>2]|0)+(l<<3)>>3]=k;l=l+1|0;}while((l|0)<(c[53568]|0))}}while(0);g=g+1|0;j=c[(c[(c[f>>2]|0)+144>>2]|0)+(g<<2)>>2]|0;}while((j|0)!=0);i=e;return}function yu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0.0,z=0,A=0,B=0;e=i;i=i+80|0;f=e|0;if((a[213992]|0)!=0){Ma(91336,25,1,c[o>>2]|0)|0;ym()}g=b+8|0;j=c[g>>2]|0;k=c[j+156>>2]|0;l=c[j+152>>2]|0;j=(d|0)>0;do{if(j){m=0;do{if((m|0)>0){n=l+(m<<2)|0;p=k+(m<<2)|0;q=0;do{r=+h[(c[n>>2]|0)+(q<<3)>>3];s=1.0/(r*r);t=c[(c[g>>2]|0)+144>>2]|0;u=uw(b,c[t+(m<<2)>>2]|0,c[t+(q<<2)>>2]|0,0,0)|0;if((u|0)==0){v=s}else{v=s*+h[(c[u+8>>2]|0)+128>>3]}h[(c[k+(q<<2)>>2]|0)+(m<<3)>>3]=v;h[(c[p>>2]|0)+(q<<3)>>3]=v;q=q+1|0;}while((q|0)<(m|0))}m=m+1|0;}while((m|0)<(d|0));if(!j){break}m=0;q=c[53568]|0;while(1){if((q|0)>0){p=0;while(1){h[(c[(c[(c[g>>2]|0)+160>>2]|0)+(m<<2)>>2]|0)+(p<<3)>>3]=0.0;n=p+1|0;u=c[53568]|0;if((n|0)<(u|0)){p=n}else{w=u;break}}}else{w=q}p=m+1|0;if((p|0)<(d|0)){m=p;q=w}else{break}}}}while(0);w=c[g>>2]|0;k=c[c[w+144>>2]>>2]|0;if((k|0)!=0){b=0;l=k;k=w;while(1){if(j){w=l+8|0;q=0;do{a:do{if((b|0)!=(q|0)){m=c[g>>2]|0;p=c[(c[w>>2]|0)+132>>2]|0;u=c[(c[(c[(c[m+144>>2]|0)+(q<<2)>>2]|0)+8>>2]|0)+132>>2]|0;n=c[53568]|0;t=(n|0)>0;if(t){x=0;y=0.0}else{break}do{v=+h[p+(x<<3)>>3]- +h[u+(x<<3)>>3];h[f+(x<<3)>>3]=v;y=y+v*v;x=x+1|0;}while((x|0)<(n|0));v=+T(y);if(t){z=0;A=m}else{break}while(1){s=+h[f+(z<<3)>>3];h[(c[(c[(c[A+164>>2]|0)+(b<<2)>>2]|0)+(q<<2)>>2]|0)+(z<<3)>>3]=+h[(c[(c[A+156>>2]|0)+(b<<2)>>2]|0)+(q<<3)>>3]*(s-s*+h[(c[(c[A+152>>2]|0)+(b<<2)>>2]|0)+(q<<3)>>3]/v);n=c[g>>2]|0;u=(c[(c[n+160>>2]|0)+(b<<2)>>2]|0)+(z<<3)|0;h[u>>3]=+h[(c[(c[(c[n+164>>2]|0)+(b<<2)>>2]|0)+(q<<2)>>2]|0)+(z<<3)>>3]+ +h[u>>3];u=z+1|0;if((u|0)>=(c[53568]|0)){break a}z=u;A=c[g>>2]|0}}}while(0);q=q+1|0;}while((q|0)<(d|0));B=c[g>>2]|0}else{B=k}q=b+1|0;w=c[(c[B+144>>2]|0)+(q<<2)>>2]|0;if((w|0)==0){break}else{b=q;l=w;k=B}}}if((a[213992]|0)==0){i=e;return}B=c[o>>2]|0;y=+zm();gc(B|0,86160,(B=i,i=i+8|0,h[B>>3]=y,B)|0)|0;i=B;i=e;return}function zu(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0.0,C=0,D=0.0,E=0.0,F=0,G=0.0,H=0.0,I=0.0,J=0;e=i;f=+h[21657];h[21656]=f*f;g=Au(b,d)|0;if((g|0)!=0){j=g;do{Bu(b,d,j);j=Au(b,d)|0;}while((j|0)!=0)}if((a[213992]|0)==0){k=b+8|0}else{j=c[o>>2]|0;g=d-1|0;l=b+8|0;if((g|0)>0){m=c[l>>2]|0;n=c[m+144>>2]|0;p=c[53568]|0;q=(p|0)>0;r=m+156|0;s=m+152|0;f=0.0;m=0;while(1){t=m+1|0;if((t|0)<(d|0)){u=c[(c[r>>2]|0)+(m<<2)>>2]|0;v=c[(c[s>>2]|0)+(m<<2)>>2]|0;w=(c[n+(m<<2)>>2]|0)+8|0;x=f;y=t;while(1){if(q){z=c[(c[w>>2]|0)+132>>2]|0;A=c[(c[(c[n+(y<<2)>>2]|0)+8>>2]|0)+132>>2]|0;B=0.0;C=0;while(1){D=+h[z+(C<<3)>>3]- +h[A+(C<<3)>>3];E=B+D*D;F=C+1|0;if((F|0)<(p|0)){B=E;C=F}else{G=E;break}}}else{G=0.0}B=+h[v+(y<<3)>>3];E=x+ +h[u+(y<<3)>>3]*(G+B*B-B*2.0*+T(G));C=y+1|0;if((C|0)<(d|0)){x=E;y=C}else{H=E;break}}}else{H=f}if((t|0)<(g|0)){f=H;m=t}else{I=H;break}}}else{I=0.0}gc(j|0,81416,(J=i,i=i+8|0,h[J>>3]=I,J)|0)|0;i=J;m=c[(c[l>>2]|0)+148>>2]|0;g=(m|0)==(c[53660]|0)?163488:213472;I=+zm();gc(j|0,167648,(J=i,i=i+24|0,c[J>>2]=m,c[J+8>>2]=g,h[J+16>>3]=I,J)|0)|0;i=J;k=l}l=c[(c[k>>2]|0)+148>>2]|0;if((l|0)!=(c[53660]|0)){i=e;return}k=$w(b|0)|0;Fv(0,154336,(J=i,i=i+16|0,c[J>>2]=l,c[J+8>>2]=k,J)|0)|0;i=J;i=e;return}function Au(b,e){b=b|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0.0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0;f=i;g=(c[45226]|0)+1|0;c[45226]=g;j=c[b+8>>2]|0;if((c[j+148>>2]|0)>=(c[53660]|0)){k=0;i=f;return k|0}if((e|0)>0){b=c[j+144>>2]|0;l=c[53568]|0;m=(l|0)>0;n=0;p=0.0;q=0;while(1){r=c[b+(n<<2)>>2]|0;do{if((d[(c[r+8>>2]|0)+119|0]|0)>>>0>1>>>0){s=q;t=p}else{if(m){u=c[(c[j+160>>2]|0)+(n<<2)>>2]|0;v=0;w=0.0;while(1){x=+h[u+(v<<3)>>3];y=w+x*x;z=v+1|0;if((z|0)<(l|0)){v=z;w=y}else{A=y;break}}}else{A=0.0}if(A<=p){s=q;t=p;break}s=r;t=A}}while(0);r=n+1|0;if((r|0)<(e|0)){n=r;p=t;q=s}else{B=t;C=s;break}}}else{B=0.0;C=0}if(B<+h[21656]){k=0;i=f;return k|0}if((a[213992]|0)==0){k=C;i=f;return k|0}if(((g|0)%100|0|0)!=0){k=C;i=f;return k|0}g=c[o>>2]|0;t=+T(B);gc(g|0,148240,(s=i,i=i+8|0,h[s>>3]=t,s)|0)|0;i=s;if(((c[45226]|0)%1e3|0|0)!=0){k=C;i=f;return k|0}Ka(10,g|0)|0;k=C;i=f;return k|0}function Bu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,p=0.0;e=i;f=d+8|0;g=c[(c[f>>2]|0)+120>>2]|0;j=c[44368]|0;if((j|0)==0){k=c[53568]|0;l=kk(da(k<<3,k)|0)|0}else{k=c[53568]|0;l=mk(j,da(k<<3,k)|0)|0}k=l;c[44368]=k;Du(a,b,g,k);k=c[53568]|0;if((k|0)>0){l=a+8|0;j=0;do{h[177312+(j<<3)>>3]=-0.0- +h[(c[(c[(c[l>>2]|0)+160>>2]|0)+(g<<2)>>2]|0)+(j<<3)>>3];j=j+1|0;}while((j|0)<(k|0))}gu(c[44368]|0,177392,177312,k);if((c[53568]|0)>0){k=0;do{m=+h[21674];n=m+ +wn()*(1.0-m)*2.0;j=177392+(k<<3)|0;m=+h[j>>3]*n;h[j>>3]=m;j=(c[(c[f>>2]|0)+132>>2]|0)+(k<<3)|0;h[j>>3]=+h[j>>3]+m;k=k+1|0;}while((k|0)<(c[53568]|0))}k=(c[a+8>>2]|0)+148|0;c[k>>2]=(c[k>>2]|0)+1;Cu(a,b,g);if((Xm()|0)==0){i=e;return}g=c[53568]|0;if((g|0)>0){b=0;m=0.0;while(1){n=m+ +S(+(+h[177392+(b<<3)>>3]));a=b+1|0;if((a|0)<(g|0)){b=a;m=n}else{p=n;break}}}else{p=0.0}m=+T(p);b=c[o>>2]|0;g=$w(d|0)|0;gc(b|0,142112,(b=i,i=i+16|0,c[b>>2]=g,h[b+8>>3]=m,b)|0)|0;i=b;i=e;return}function Cu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0,v=0,w=0.0;e=i;i=i+80|0;f=e|0;g=a+8|0;a=c[g>>2]|0;j=c[(c[a+144>>2]|0)+(d<<2)>>2]|0;k=c[53568]|0;a:do{if((k|0)>0){l=0;m=a;while(1){h[(c[(c[m+160>>2]|0)+(d<<2)>>2]|0)+(l<<3)>>3]=0.0;n=l+1|0;o=c[53568]|0;if((n|0)>=(o|0)){p=o;break a}l=n;m=c[g>>2]|0}}else{p=k}}while(0);if((b|0)<=0){i=e;return}k=j+8|0;j=0;a=p;while(1){b:do{if((j|0)==(d|0)){q=a}else{p=c[g>>2]|0;m=c[(c[k>>2]|0)+132>>2]|0;l=c[(c[(c[(c[p+144>>2]|0)+(j<<2)>>2]|0)+8>>2]|0)+132>>2]|0;n=(a|0)>0;if(n){r=0;s=0.0}else{q=a;break}do{t=+h[m+(r<<3)>>3]- +h[l+(r<<3)>>3];h[f+(r<<3)>>3]=t;s=s+t*t;r=r+1|0;}while((r|0)<(a|0));t=+T(s);if(n){u=0;v=p}else{q=a;break}while(1){w=+h[f+(u<<3)>>3];h[(c[(c[(c[v+164>>2]|0)+(d<<2)>>2]|0)+(j<<2)>>2]|0)+(u<<3)>>3]=+h[(c[(c[v+156>>2]|0)+(d<<2)>>2]|0)+(j<<3)>>3]*(w-w*+h[(c[(c[v+152>>2]|0)+(d<<2)>>2]|0)+(j<<3)>>3]/t);l=c[g>>2]|0;m=(c[(c[l+160>>2]|0)+(d<<2)>>2]|0)+(u<<3)|0;h[m>>3]=+h[(c[(c[(c[l+164>>2]|0)+(d<<2)>>2]|0)+(j<<2)>>2]|0)+(u<<3)>>3]+ +h[m>>3];m=c[(c[g>>2]|0)+164>>2]|0;l=(c[(c[m+(j<<2)>>2]|0)+(d<<2)>>2]|0)+(u<<3)|0;w=+h[l>>3];h[l>>3]=-0.0- +h[(c[(c[m+(d<<2)>>2]|0)+(j<<2)>>2]|0)+(u<<3)>>3];m=c[g>>2]|0;l=(c[(c[m+160>>2]|0)+(j<<2)>>2]|0)+(u<<3)|0;h[l>>3]=+h[(c[(c[(c[m+164>>2]|0)+(j<<2)>>2]|0)+(d<<2)>>2]|0)+(u<<3)>>3]-w+ +h[l>>3];l=u+1|0;m=c[53568]|0;if((l|0)>=(m|0)){q=m;break b}u=l;v=c[g>>2]|0}}}while(0);p=j+1|0;if((p|0)<(b|0)){j=p;a=q}else{break}}i=e;return}function Du(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;f=i;i=i+80|0;g=f|0;j=a+8|0;a=c[j>>2]|0;k=c[a+156>>2]|0;l=c[a+152>>2]|0;m=c[(c[a+144>>2]|0)+(d<<2)>>2]|0;a=c[53568]|0;if((a|0)>0){n=0;o=a;while(1){if((o|0)>0){p=0;q=o;while(1){h[e+((da(q,n)|0)+p<<3)>>3]=0.0;r=p+1|0;s=c[53568]|0;if((r|0)<(s|0)){p=r;q=s}else{t=s;break}}}else{t=o}q=n+1|0;if((q|0)<(t|0)){n=q;o=t}else{u=t;break}}}else{u=a}if((b|0)>0){a=k+(d<<2)|0;k=l+(d<<2)|0;l=m+8|0;m=0;t=u;o=u;while(1){do{if((m|0)==(d|0)){v=t;w=o}else{n=(t|0)>0;if(n){q=c[(c[l>>2]|0)+132>>2]|0;p=c[(c[(c[(c[(c[j>>2]|0)+144>>2]|0)+(m<<2)>>2]|0)+8>>2]|0)+132>>2]|0;s=0;x=0.0;while(1){y=+h[q+(s<<3)>>3]- +h[p+(s<<3)>>3];h[g+(s<<3)>>3]=y;z=x+y*y;r=s+1|0;if((r|0)<(t|0)){s=r;x=z}else{A=z;break}}}else{A=0.0}x=+T(A);z=1.0/(x*x*x);if(n){B=0;C=t;D=o}else{v=t;w=o;break}while(1){x=+h[(c[a>>2]|0)+(m<<3)>>3];y=+h[(c[k>>2]|0)+(m<<3)>>3];E=+h[g+(B<<3)>>3];if((B|0)>0){s=0;F=x;G=y;p=D;while(1){q=e+((da(p,s)|0)+B<<3)|0;h[q>>3]=+h[q>>3]+z*F*G*E*+h[g+(s<<3)>>3];q=s+1|0;H=+h[(c[a>>2]|0)+(m<<3)>>3];I=+h[(c[k>>2]|0)+(m<<3)>>3];r=c[53568]|0;if((q|0)<(B|0)){s=q;F=H;G=I;p=r}else{J=H;K=I;L=r;break}}}else{J=x;K=y;L=C}p=e+((da(L,B)|0)+B<<3)|0;h[p>>3]=+h[p>>3]+J*(1.0-z*K*(A-E*E));p=B+1|0;s=c[53568]|0;if((p|0)<(s|0)){B=p;C=s;D=s}else{v=s;w=s;break}}}}while(0);n=m+1|0;if((n|0)<(b|0)){m=n;t=v;o=w}else{M=v;N=w;break}}}else{M=u;N=u}if((M|0)>1){O=1;P=M;Q=N}else{i=f;return}while(1){if((O|0)>0){N=0;M=Q;while(1){h[e+((da(M,O)|0)+N<<3)>>3]=+h[e+((da(M,N)|0)+O<<3)>>3];u=N+1|0;w=c[53568]|0;if((u|0)<(O|0)){N=u;M=w}else{R=w;S=w;break}}}else{R=P;S=Q}M=O+1|0;if((M|0)<(R|0)){O=M;P=R;Q=S}else{break}}i=f;return}function Eu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=a+8|0;if((c[(c[b>>2]|0)+124>>2]|0)>=0){cc(139008,136472,645,170200)}d=c[53680]|0;c[53680]=d+1;c[(c[b>>2]|0)+124>>2]=d;c[(c[53682]|0)+(d<<2)>>2]=a;if((d|0)<=0){return}d=c[b>>2]|0;e=c[d+124>>2]|0;if((e|0)<=0){return}f=e-1|0;g=(f|0)/2|0;i=(c[53682]|0)+(g<<2)|0;j=c[i>>2]|0;k=j+8|0;if(+h[(c[k>>2]|0)+136>>3]>+h[d+136>>3]){l=e;m=f;n=g;o=i;p=j;q=k}else{return}while(1){c[o>>2]=a;c[(c[b>>2]|0)+124>>2]=n;c[(c[53682]|0)+(l<<2)>>2]=p;c[(c[q>>2]|0)+124>>2]=l;if((m|0)<=1){r=8;break}k=n-1|0;j=(k|0)/2|0;i=(c[53682]|0)+(j<<2)|0;g=c[i>>2]|0;f=g+8|0;if(+h[(c[f>>2]|0)+136>>3]>+h[(c[b>>2]|0)+136>>3]){l=n;m=k;n=j;o=i;p=g;q=f}else{r=8;break}}if((r|0)==8){return}}function Fu(){var a=0,b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,v=0;a=c[53680]|0;if((a|0)==0){b=0;return b|0}d=c[53682]|0;e=c[d>>2]|0;f=a-1|0;c[53680]=f;a=c[d+(f<<2)>>2]|0;c[d>>2]=a;d=a+8|0;c[(c[d>>2]|0)+124>>2]=0;a:do{if((f|0)>1){g=c[(c[d>>2]|0)+124>>2]|0;i=g<<1|1;j=c[53680]|0;if((i|0)<(j|0)){k=g;l=i;m=j}else{break}while(1){j=l+1|0;i=c[53682]|0;if((j|0)<(m|0)){g=c[i+(j<<2)>>2]|0;n=+h[(c[g+8>>2]|0)+136>>3];o=c[i+(l<<2)>>2]|0;p=+h[(c[o+8>>2]|0)+136>>3];if(n<p){q=j;r=g;s=n}else{t=o;u=p;v=7}}else{o=c[i+(l<<2)>>2]|0;t=o;u=+h[(c[o+8>>2]|0)+136>>3];v=7}if((v|0)==7){v=0;q=l;r=t;s=u}if(+h[(c[d>>2]|0)+136>>3]<=s){break a}c[i+(q<<2)>>2]=a;c[(c[d>>2]|0)+124>>2]=q;c[(c[53682]|0)+(k<<2)>>2]=r;c[(c[r+8>>2]|0)+124>>2]=k;i=q<<1|1;o=c[53680]|0;if((i|0)<(o|0)){k=q;l=i;m=o}else{break}}}}while(0);c[(c[e+8>>2]|0)+124>>2]=-1;b=e;return b|0}function Gu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0;e=i;c[53682]=jk((d<<2)+4|0)|0;if((a[213992]|0)!=0){Ma(133632,28,1,c[o>>2]|0)|0;ym()}d=ux(b)|0;if((d|0)!=0){f=d;do{Hu(b,f);f=vx(b,f)|0;}while((f|0)!=0)}if((a[213992]|0)==0){g=c[53682]|0;j=g;eF(j);i=e;return}f=c[o>>2]|0;k=+zm();gc(f|0,86160,(f=i,i=i+8|0,h[f>>3]=k,f)|0)|0;i=f;g=c[53682]|0;j=g;eF(j);i=e;return}function Hu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;d=a+8|0;e=c[c[(c[d>>2]|0)+144>>2]>>2]|0;if((e|0)!=0){f=0;g=e;do{h[(c[g+8>>2]|0)+136>>3]=+h[21638];f=f+1|0;g=c[(c[(c[d>>2]|0)+144>>2]|0)+(f<<2)>>2]|0;}while((g|0)!=0)}c[53524]=b;g=b+8|0;h[(c[g>>2]|0)+136>>3]=0.0;c[(c[g>>2]|0)+128>>2]=0;Eu(c[53524]|0);g=Fu()|0;if((g|0)==0){return}else{i=g}do{g=c[53524]|0;if((i|0)!=(g|0)){b=c[i+8>>2]|0;j=+h[b+136>>3];f=c[(c[g+8>>2]|0)+120>>2]|0;g=c[b+120>>2]|0;h[(c[(c[(c[d>>2]|0)+152>>2]|0)+(g<<2)>>2]|0)+(f<<3)>>3]=j;h[(c[(c[(c[d>>2]|0)+152>>2]|0)+(f<<2)>>2]|0)+(g<<3)>>3]=j}g=rw(a,i)|0;if((g|0)!=0){f=i+8|0;b=g;do{g=c[b>>2]&3;e=c[((g|0)==3?b:b+32|0)+28>>2]|0;if((e|0)==(i|0)){k=c[((g|0)==2?b:b-32|0)+28>>2]|0}else{k=e}j=+h[(c[f>>2]|0)+136>>3]+ +h[(c[b+8>>2]|0)+136>>3];e=k+8|0;g=(c[e>>2]|0)+136|0;a:do{if(+h[g>>3]>j){h[g>>3]=j;l=c[e>>2]|0;m=c[l+124>>2]|0;if((m|0)<=-1){c[l+128>>2]=(c[(c[f>>2]|0)+128>>2]|0)+1;Eu(k);break}if((m|0)<=0){break}n=m-1|0;o=(n|0)/2|0;p=(c[53682]|0)+(o<<2)|0;q=c[p>>2]|0;r=q+8|0;if(+h[(c[r>>2]|0)+136>>3]>+h[l+136>>3]){s=m;t=n;u=o;v=p;w=q;x=r}else{break}while(1){c[v>>2]=k;c[(c[e>>2]|0)+124>>2]=u;c[(c[53682]|0)+(s<<2)>>2]=w;c[(c[x>>2]|0)+124>>2]=s;if((t|0)<=1){break a}r=u-1|0;q=(r|0)/2|0;p=(c[53682]|0)+(q<<2)|0;o=c[p>>2]|0;n=o+8|0;if(+h[(c[n>>2]|0)+136>>3]>+h[(c[e>>2]|0)+136>>3]){s=u;t=r;u=q;v=p;w=o;x=n}else{break}}}}while(0);b=sw(a,b,i)|0;}while((b|0)!=0)}i=Fu()|0;}while((i|0)!=0);return}function Iu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;b=i;i=i+16|0;e=b|0;Tr();au();ks();c[53234]=Qc[d&3]()|0;ms();f=e|0;g=e+8|0;j=Qc[d&3]()|0;k=0.0;l=0.0;a:while(1){m=j+8|0;n=j|0;if((j|0)==0){o=3;break}else{p=k;q=l}while(1){if((gs()|0)==0){hs(e);r=+h[f>>3];s=+h[g>>3]}else{r=p;s=q}if((gs()|0)!=0){break}t=+h[m>>3];if(t<s){break}if(t==s){if(+h[n>>3]<r){break}}if((gs()|0)!=0){break a}u=is()|0;v=us(u)|0;w=ts(u)|0;x=ts(w)|0;y=vs(u)|0;z=ws(w)|0;A=c[u+20>>2]|0;du(A);Wr(c[u+8>>2]|0,a[u+16|0]|0,A);Wr(c[w+8>>2]|0,a[w+16|0]|0,A);ss(u);fs(w);ss(w);w=+h[y+8>>3]>+h[z+8>>3];u=w?z:y;B=Ur(u,w?y:z)|0;z=ns(B,w&1)|0;qs(v,z);Wr(B,w&1^1,A);eu(A);A=os(v,z)|0;if((A|0)!=0){fs(v);es(v,A,+cu(A,u))}A=os(z,x)|0;if((A|0)==0){p=r;q=s;continue}es(z,A,+cu(A,u));p=r;q=s}n=rs(j|0)|0;m=ts(n)|0;u=Ur(ws(n)|0,j)|0;A=ns(u,0)|0;qs(n,A);z=os(n,A)|0;if((z|0)!=0){fs(n);es(n,z,+cu(z,j))}z=ns(u,1)|0;qs(A,z);A=os(z,m)|0;if((A|0)!=0){es(z,A,+cu(A,j))}j=Qc[d&3]()|0;k=r;l=s}b:do{if((o|0)==3){while(1){o=0;if((gs()|0)==0){hs(e)}if((gs()|0)!=0){break b}d=is()|0;j=us(d)|0;g=ts(d)|0;f=ts(g)|0;A=vs(d)|0;z=ws(g)|0;m=c[d+20>>2]|0;du(m);Wr(c[d+8>>2]|0,a[d+16|0]|0,m);Wr(c[g+8>>2]|0,a[g+16|0]|0,m);ss(d);fs(g);ss(g);g=+h[A+8>>3]>+h[z+8>>3];d=g?z:A;u=Ur(d,g?A:z)|0;z=ns(u,g&1)|0;qs(j,z);Wr(u,g&1^1,m);eu(m);m=os(j,z)|0;if((m|0)!=0){fs(j);es(j,m,+cu(m,d))}m=os(z,f)|0;if((m|0)==0){o=3;continue}es(z,m,+cu(m,d));o=3}}}while(0);o=ts(c[53832]|0)|0;if((o|0)==(c[53830]|0)){i=b;return}else{C=o}do{Vr(c[C+8>>2]|0);C=ts(C)|0;}while((C|0)!=(c[53830]|0));i=b;return}function Ju(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,X=0.0,Y=0.0,Z=0,_=0,$=0.0,aa=0.0,ba=0,ca=0.0,ea=0.0,fa=0;e=i;i=i+8|0;f=e|0;if((Lw(b)|0)==1){g=(ux(b)|0)+8|0;h[c[(c[g>>2]|0)+132>>2]>>3]=0.0;h[(c[(c[g>>2]|0)+132>>2]|0)+8>>3]=0.0;j=d;i=e;return j|0}g=Lw(b)|0;k=da(g,g)|0;g=ux(b)|0;if((g|0)!=0){l=g;do{g=l+8|0;c[(c[(c[g>>2]|0)+112>>2]|0)+12>>2]=k;h[(c[(c[g>>2]|0)+112>>2]|0)+32>>3]=10.0;m=rw(b,l)|0;a:do{if((m|0)==0){n=11}else{p=m;q=0;b:while(1){r=c[p>>2]&3;s=c[((r|0)==3?p:p+32|0)+28>>2]|0;if((s|0)==(l|0)){t=c[((r|0)==2?p:p-32|0)+28>>2]|0}else{t=s}do{if((t|0)==(l|0)){u=q}else{if((q|0)==0){u=t;break}if((q|0)==(t|0)){u=q}else{break b}}}while(0);s=sw(b,p,l)|0;if((s|0)==0){n=11;break a}else{p=s;q=u}}c[c[(c[g>>2]|0)+112>>2]>>2]=k}}while(0);if((n|0)==11){n=0;c[c[(c[g>>2]|0)+112>>2]>>2]=0}l=vx(b,l)|0;}while((l|0)!=0)}do{if((d|0)==0){l=(Lw(b)|0)<3;k=ux(b)|0;if(l){v=k;break}if((k|0)!=0){l=k;do{if((c[c[(c[l+8>>2]|0)+112>>2]>>2]|0)==0){Mu(b,l,0)}l=vx(b,l)|0;}while((l|0)!=0)}l=ux(b)|0;if((l|0)==0){v=0;break}else{w=l;x=0;y=0}while(1){l=c[c[(c[w+8>>2]|0)+112>>2]>>2]|0;g=l>>>0>y>>>0;k=g?w:x;u=vx(b,w)|0;if((u|0)==0){v=k;break}else{w=u;x=k;y=g?l:y}}}else{v=d}}while(0);if((a[213992]|0)==0){z=v|0}else{d=c[o>>2]|0;y=v|0;x=$w(y)|0;gc(d|0,119768,(A=i,i=i+8|0,c[A>>2]=x,A)|0)|0;i=A;z=y}y=v+8|0;x=(c[(c[y>>2]|0)+112>>2]|0)+12|0;d=c[x>>2]|0;c[x>>2]=0;c[(c[(c[y>>2]|0)+112>>2]|0)+16>>2]=0;x=Wv(b,2,97008,0)|0;w=jk(8)|0;l=w;c[w>>2]=z;c:do{if((w|0)!=0){z=(x|0)==0;g=l;k=l;while(1){u=c[k>>2]|0;t=c[k+4>>2]|0;eF(k);m=u;if((u|0)==0){break c}q=(t|0)==0?0:g;p=u+8|0;u=(c[(c[(c[p>>2]|0)+112>>2]|0)+12>>2]|0)+1|0;s=rw(b,m)|0;d:do{if((s|0)==0){B=q;C=t}else{if(z){r=q;D=t;E=s;while(1){F=c[E>>2]&3;G=c[((F|0)==3?E:E+32|0)+28>>2]|0;if((G|0)==(m|0)){H=c[((F|0)==2?E:E-32|0)+28>>2]|0}else{H=G}G=H+8|0;F=(c[(c[G>>2]|0)+112>>2]|0)+12|0;do{if(u>>>0<(c[F>>2]|0)>>>0){c[F>>2]=u;c[(c[(c[G>>2]|0)+112>>2]|0)+16>>2]=m;I=(c[(c[p>>2]|0)+112>>2]|0)+8|0;c[I>>2]=(c[I>>2]|0)+1;I=jk(8)|0;J=I;c[I>>2]=H;if((r|0)==0){K=J;L=J;break}c[r+4>>2]=J;K=D;L=J}else{K=D;L=r}}while(0);G=sw(b,E,m)|0;if((G|0)==0){B=L;C=K;break d}else{r=L;D=K;E=G}}}else{M=q;N=t;O=s}while(1){E=O|0;if((a[fw(E,x)|0]|0)==48){if((Ya(fw(E,x)|0,91552)|0)==0){P=N;Q=M}else{n=39}}else{n=39}do{if((n|0)==39){n=0;E=c[O>>2]&3;D=c[((E|0)==3?O:O+32|0)+28>>2]|0;if((D|0)==(m|0)){R=c[((E|0)==2?O:O-32|0)+28>>2]|0}else{R=D}D=R+8|0;E=(c[(c[D>>2]|0)+112>>2]|0)+12|0;if(u>>>0>=(c[E>>2]|0)>>>0){P=N;Q=M;break}c[E>>2]=u;c[(c[(c[D>>2]|0)+112>>2]|0)+16>>2]=m;D=(c[(c[p>>2]|0)+112>>2]|0)+8|0;c[D>>2]=(c[D>>2]|0)+1;D=jk(8)|0;E=D;c[D>>2]=R;if((M|0)==0){P=E;Q=E;break}c[M+4>>2]=E;P=N;Q=E}}while(0);E=sw(b,O,m)|0;if((E|0)==0){B=Q;C=P;break}else{M=Q;N=P;O=E}}}}while(0);if((C|0)==0){break}else{g=B;k=C}}}}while(0);C=ux(b)|0;do{if((C|0)==0){S=0}else{B=C;O=0;while(1){P=c[(c[(c[B+8>>2]|0)+112>>2]|0)+12>>2]|0;if((P|0)==(d|0)){break}T=P>>>0>O>>>0?P:O;P=vx(b,B)|0;if((P|0)==0){n=48;break}else{B=P;O=T}}if((n|0)==48){if((T|0)>=0){S=T;break}}Fv(1,157624,(A=i,i=i+1|0,i=i+7&-8,c[A>>2]=0,A)|0)|0;i=A;j=v;i=e;return j|0}}while(0);T=ux(b)|0;if((T|0)!=0){n=T;do{T=n+8|0;d=c[(c[T>>2]|0)+112>>2]|0;do{if((c[d+8>>2]|0)==0){C=d+4|0;c[C>>2]=(c[C>>2]|0)+1;C=c[(c[(c[T>>2]|0)+112>>2]|0)+16>>2]|0;if((C|0)==0){break}else{U=C}do{C=U+8|0;O=(c[(c[C>>2]|0)+112>>2]|0)+4|0;c[O>>2]=(c[O>>2]|0)+1;U=c[(c[(c[C>>2]|0)+112>>2]|0)+16>>2]|0;}while((U|0)!=0)}}while(0);n=vx(b,n)|0;}while((n|0)!=0)}h[(c[(c[y>>2]|0)+112>>2]|0)+24>>3]=6.283185307179586;Lu(b,v);h[(c[(c[y>>2]|0)+112>>2]|0)+32>>3]=0.0;Ku(b,v);y=jk((S<<3)+8|0)|0;n=y;U=Hm(b|0,Wv(c[b+48>>2]|0,0,102688,0)|0,0)|0;e:do{if((U|0)==0){X=1.0;Y=0.0;Z=1}else{if((S|0)<1){X=0.0;Y=0.0;Z=1;break}else{_=1;$=0.0;aa=0.0;ba=U}while(1){ca=+sF(ba,f);if(ca<=0.0){X=aa;Y=$;Z=_;break e}ea=ca>.02?ca:.02;ca=$+ea;T=_+1|0;h[n+(_<<3)>>3]=ca;d=c[f>>2]|0;C=a[d]|0;f:do{if(C<<24>>24==0){fa=d}else{O=d;B=C;while(1){P=O+1|0;if(!((Qa(B<<24>>24|0)|0)!=0|B<<24>>24==58)){fa=O;break f}N=a[P]|0;if(N<<24>>24==0){fa=P;break}else{O=P;B=N}}}}while(0);if((_|0)<(S|0)){_=T;$=ca;aa=ea;ba=fa}else{X=ea;Y=ca;Z=T;break}}}}while(0);if((Z|0)<=(S|0)){fa=Z;aa=Y;while(1){Y=X+aa;h[n+(fa<<3)>>3]=Y;if((fa|0)<(S|0)){fa=fa+1|0;aa=Y}else{break}}}if((a[213992]|0)!=0){fa=c[o>>2]|0;Ma(127712,18,1,fa|0)|0;Z=0;while(1){gc(fa|0,115384,(A=i,i=i+8|0,h[A>>3]=+h[n+(Z<<3)>>3],A)|0)|0;i=A;if((Z|0)<(S|0)){Z=Z+1|0}else{break}}Ka(10,fa|0)|0}fa=ux(b)|0;if((fa|0)!=0){Z=fa;do{fa=Z+8|0;S=c[fa>>2]|0;A=c[S+112>>2]|0;aa=+h[n+(c[A+12>>2]<<3)>>3];X=aa*+V(+h[A+32>>3]);h[c[S+132>>2]>>3]=X;S=c[fa>>2]|0;X=aa*+W(+h[(c[S+112>>2]|0)+32>>3]);h[(c[S+132>>2]|0)+8>>3]=X;Z=vx(b,Z)|0;}while((Z|0)!=0)}eF(y);j=v;i=e;return j|0}function Ku(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,g=0.0,i=0,j=0,k=0,l=0.0;d=c[(c[b+8>>2]|0)+112>>2]|0;if((c[d+16>>2]|0)==0){e=0.0}else{e=+h[d+32>>3]- +h[d+24>>3]*.5}d=rw(a,b)|0;if((d|0)==0){return}else{f=d;g=e}while(1){d=c[f>>2]&3;i=c[((d|0)==3?f:f+32|0)+28>>2]|0;if((i|0)==(b|0)){j=c[((d|0)==2?f:f-32|0)+28>>2]|0}else{j=i}i=j+8|0;d=c[(c[i>>2]|0)+112>>2]|0;do{if((c[d+16>>2]|0)==(b|0)){k=d+32|0;if(+h[k>>3]!=10.0){l=g;break}h[k>>3]=g+ +h[d+24>>3]*.5;k=c[(c[i>>2]|0)+112>>2]|0;e=g+ +h[k+24>>3];if((c[k+8>>2]|0)==0){l=e;break}Ku(a,j);l=e}else{l=g}}while(0);i=sw(a,f,b)|0;if((i|0)==0){break}else{f=i;g=l}}return}function Lu(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,g=0,i=0,j=0;d=c[(c[b+8>>2]|0)+112>>2]|0;e=+h[d+24>>3]/+((c[d+4>>2]|0)>>>0>>>0);d=rw(a,b)|0;if((d|0)==0){return}else{f=d}do{d=c[f>>2]&3;g=c[((d|0)==3?f:f+32|0)+28>>2]|0;if((g|0)==(b|0)){i=c[((d|0)==2?f:f-32|0)+28>>2]|0}else{i=g}g=i+8|0;d=c[(c[g>>2]|0)+112>>2]|0;do{if((c[d+16>>2]|0)==(b|0)){j=d+24|0;if(+h[j>>3]!=0.0){break}h[j>>3]=e*+((c[d+4>>2]|0)>>>0>>>0);if((c[(c[(c[g>>2]|0)+112>>2]|0)+8>>2]|0)==0){break}Lu(a,i)}}while(0);f=sw(a,f,b)|0;}while((f|0)!=0);return}function Mu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=(c[c[(c[b+8>>2]|0)+112>>2]>>2]|0)+1|0;f=rw(a,b)|0;if((f|0)==0){return}else{g=f}do{f=c[g>>2]&3;h=c[((f|0)==3?g:g+32|0)+28>>2]|0;if((h|0)==(b|0)){i=c[((f|0)==2?g:g-32|0)+28>>2]|0}else{i=h}do{if((i|0)!=(d|0)){h=c[(c[i+8>>2]|0)+112>>2]|0;if(e>>>0>=(c[h>>2]|0)>>>0){break}c[h>>2]=e;Mu(a,i,b)}}while(0);g=sw(a,g,b)|0;}while((g|0)!=0);return}function Nu(a){a=a|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0.0;qn(a,2);d=a+8|0;b[(c[d>>2]|0)+168>>1]=2;c[53568]=2;e=Lw(a)|0;f=jk(e*40|0)|0;g=jk((e<<2)+4|0)|0;c[(c[d>>2]|0)+144>>2]=g;g=ux(a)|0;if((g|0)!=0){e=0;i=g;while(1){qt(i);c[(c[i+8>>2]|0)+112>>2]=f+(e*40|0);c[(c[(c[d>>2]|0)+144>>2]|0)+(e<<2)>>2]=i;g=vx(a,i)|0;if((g|0)==0){break}else{e=e+1|0;i=g}}}i=ux(a)|0;if((i|0)==0){return}else{j=i}do{i=mw(a,j)|0;if((i|0)!=0){e=i;do{i=e|0;Wx(i,92664,176,1)|0;Zm(e)|0;k=+Fm(i,c[53750]|0,1.0,0.0);h[(c[e+8>>2]|0)+128>>3]=k;e=ow(a,e)|0;}while((e|0)!=0)}j=vx(a,j)|0;}while((j|0)!=0);return}function Ou(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=i;i=i+56|0;e=d|0;f=d+16|0;g=d+24|0;if((Lw(b)|0)==0){i=d;return}Nu(b);j=b|0;ew(j,108264)|0;k=ew(j,108264)|0;do{if((k|0)==0){l=0;m=0}else{if((a[k]|0)==0){l=0;m=1;break}n=Ax(b,k,0)|0;if((n|0)!=0){l=n;m=0;break}Fv(0,148416,(p=i,i=i+8|0,c[p>>2]=k,p)|0)|0;i=p;Fv(3,120912,(p=i,i=i+1|0,i=i+7&-8,c[p>>2]=0,p)|0)|0;i=p;l=0;m=1}}while(0);k=ew(j,112160)|0;do{if((k|0)==0){q=0}else{if((a[k]|0)==0){q=0;break}n=e|0;r=e+8|0;s=ac(k|0,105200,(p=i,i=i+16|0,c[p>>2]=n,c[p+8>>2]=r,p)|0)|0;i=p;if((s|0)==0){q=0;break}else if((s|0)==1){h[r>>3]=+h[n>>3]}if((a[213992]|0)==0){q=1;break}t=+h[r>>3];gc(c[o>>2]|0,99120,(p=i,i=i+16|0,h[p>>3]=+h[n>>3],h[p+8>>3]=t,p)|0)|0;i=p;q=1}}while(0);if((Lw(b)|0)==0){u=l}else{p=iv(b,f,0)|0;if((c[f>>2]|0)==1){k=Ju(b,l)|0;n=(m|0)!=0&(l|0)==0?k:l;r=(ux(b)|0)+8|0;eF(c[(c[r>>2]|0)+112>>2]|0);c[(c[r>>2]|0)+112>>2]=0;do{if((q|0)!=0){t=+h[e>>3];v=+h[e+8>>3];r=c[(c[k+8>>2]|0)+132>>2]|0;w=+h[r>>3];x=+h[r+8>>3];r=ux(b)|0;if((r|0)==0){break}else{y=r}do{if((y|0)!=(k|0)){r=y+8|0;s=c[(c[r>>2]|0)+132>>2]|0;h[s>>3]=w+t*(+h[s>>3]-w);s=(c[(c[r>>2]|0)+132>>2]|0)+8|0;h[s>>3]=x+v*(+h[s>>3]-x)}y=vx(b,y)|0;}while((y|0)!=0)}}while(0);nr(b)|0;Pt(b);z=n}else{tv(b,2,8,g)|0;c[g+12>>2]=0;if((c[f>>2]|0)>0){n=(q|0)==0;q=e|0;y=e+8|0;if((m|0)==0){e=0;while(1){k=c[p+(e<<2)>>2]|0;if((l|0)==0){A=24}else{if((Rx(k,l|0)|0)==0){A=24}else{B=l}}if((A|0)==24){A=0;B=0}jv(k)|0;s=Ju(k,B)|0;do{if(!n){x=+h[q>>3];v=+h[y>>3];r=c[(c[s+8>>2]|0)+132>>2]|0;w=+h[r>>3];t=+h[r+8>>3];r=ux(k)|0;if((r|0)==0){break}else{C=r}do{if((C|0)!=(s|0)){r=C+8|0;D=c[(c[r>>2]|0)+132>>2]|0;h[D>>3]=w+x*(+h[D>>3]-w);D=(c[(c[r>>2]|0)+132>>2]|0)+8|0;h[D>>3]=t+v*(+h[D>>3]-t)}C=vx(k,C)|0;}while((C|0)!=0)}}while(0);nr(k)|0;s=e+1|0;if((s|0)<(c[f>>2]|0)){e=s}else{E=l;break}}}else{e=l;C=0;while(1){B=c[p+(C<<2)>>2]|0;s=(e|0)!=0;if(s){if((Rx(B,e|0)|0)==0){A=33}else{F=e}}else{A=33}if((A|0)==33){A=0;F=0}jv(B)|0;D=Ju(B,F)|0;r=s?e:D;do{if(!n){t=+h[q>>3];v=+h[y>>3];s=c[(c[D+8>>2]|0)+132>>2]|0;w=+h[s>>3];x=+h[s+8>>3];s=ux(B)|0;if((s|0)==0){break}else{G=s}do{if((G|0)!=(D|0)){s=G+8|0;H=c[(c[s>>2]|0)+132>>2]|0;h[H>>3]=w+t*(+h[H>>3]-w);H=(c[(c[s>>2]|0)+132>>2]|0)+8|0;h[H>>3]=x+v*(+h[H>>3]-x)}G=vx(B,G)|0;}while((G|0)!=0)}}while(0);nr(B)|0;D=C+1|0;if((D|0)<(c[f>>2]|0)){e=r;C=D}else{E=r;break}}}}else{E=l}l=(ux(b)|0)+8|0;eF(c[(c[l>>2]|0)+112>>2]|0);c[(c[l>>2]|0)+112>>2]=0;sv(c[f>>2]|0,p,b,g)|0;Pt(b);z=E}if((c[f>>2]|0)>0){E=0;do{Gx(b,c[p+(E<<2)>>2]|0)|0;E=E+1|0;}while((E|0)<(c[f>>2]|0))}eF(p);u=z}if((m|0)!=0){gw(j,108264,$w(u|0)|0)|0}Xk(b);i=d;return}function Pu(a){a=a|0;var b=0,d=0,e=0;b=ux(a)|0;if((b|0)==0){return}else{d=b}do{b=mw(a,d)|0;if((b|0)!=0){e=b;do{tn(e);e=ow(a,e)|0;}while((e|0)!=0)}un(d);d=vx(a,d)|0;}while((d|0)!=0);eF(c[(c[a+8>>2]|0)+144>>2]|0);if((Ix(a|0)|0)==(a|0)){return}_x(a,0,98352);return}function Qu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;b=i;i=i+32|0;d=b|0;e=Wv(a,1,119608,0)|0;f=Wv(a,0,119608,0)|0;g=Ru(a,f,e,Wv(a,0,157512,0)|0)|0;j=+T(+h[g>>3]+.1);_u(d,0.0,0.0,j,j);a=g+16|0;e=d;c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];c[a+16>>2]=c[e+16>>2];c[a+20>>2]=c[e+20>>2];c[a+24>>2]=c[e+24>>2];c[a+28>>2]=c[e+28>>2];Su(g);Tu(g);Uu(g);i=b;return}function Ru(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0.0;f=jk(72)|0;g=f;c[f+60>>2]=0;i=f+56|0;c[i>>2]=a;j=a+8|0;k=c[j>>2]|0;if((c[k+172>>2]|0)<1){l=0;m=0;n=0;o=0.0}else{p=0;q=0;r=1;s=0;t=0.0;u=k;while(1){k=Ru(c[(c[u+176>>2]|0)+(r<<2)>>2]|0,b,d,e)|0;v=s+1|0;w=t+ +h[k>>3];x=(p|0)==0?k:p;if((q|0)!=0){c[q+52>>2]=k}y=c[j>>2]|0;if((r|0)<(c[y+172>>2]|0)){p=x;q=k;r=r+1|0;s=v;t=w;u=y}else{l=x;m=k;n=v;o=w;break}}}u=ux(a)|0;if((u|0)==0){z=l;A=n;B=o}else{s=u;u=l;l=m;m=n;t=o;while(1){n=s+8|0;if((c[c[(c[n>>2]|0)+112>>2]>>2]|0)==0){r=jk(72)|0;q=r;o=+Fm(s|0,d,1.0,0.0);w=o==0.0?1.0e3:o*1.0e3;h[r>>3]=w;c[r+60>>2]=1;c[r+56>>2]=s;if((l|0)!=0){c[l+52>>2]=q}c[c[(c[n>>2]|0)+112>>2]>>2]=a;C=t+w;D=m+1|0;E=q;F=(u|0)==0?q:u}else{C=t;D=m;E=l;F=u}q=vx(a,s)|0;if((q|0)==0){z=F;A=D;B=C;break}else{s=q;u=F;l=E;m=D;t=C}}}c[f+64>>2]=A;if((A|0)==0){C=+Fm(a|0,b,1.0,0.0);h[f>>3]=C==0.0?1.0e3:C*1.0e3;G=f+48|0;H=G;c[H>>2]=z;return g|0}b=f+8|0;h[b>>3]=B;B=+Fm(c[i>>2]|0,e,0.0,0.0);if(B==0.0){I=+h[b>>3]}else{C=B*2.0+ +T(+h[b>>3]);I=C*C}h[f>>3]=I;G=f+48|0;H=G;c[H>>2]=z;return g|0}function Su(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0.0,A=0,B=0;d=i;i=i+32|0;e=d|0;f=c[b+64>>2]|0;if((f|0)==0){i=d;return}g=jk(f<<2)|0;j=g;k=b+48|0;l=(f|0)>0;if(l){m=0;n=k;while(1){p=c[n>>2]|0;c[j+(m<<2)>>2]=p;q=m+1|0;if((q|0)<(f|0)){m=q;n=p+52|0}else{break}}}Jb(g|0,f|0,4,80);n=jk(f<<3)|0;m=n;if(l){p=0;do{h[m+(p<<3)>>3]=+h[c[j+(p<<2)>>2]>>3];p=p+1|0;}while((p|0)<(f|0))}r=+h[b+8>>3];if(+h[b>>3]==r){s=Zu(f,m,b+16|0)|0}else{t=+h[b+40>>3];u=+h[b+32>>3];h[e>>3]=+h[b+16>>3];h[e+8>>3]=+h[b+24>>3];v=t-u;w=(t+u- +T(v*v+r*4.0))*.5;h[e+16>>3]=u-w;h[e+24>>3]=t-w;s=Zu(f,m,e)|0}if((a[213992]|0)!=0){w=+h[b+24>>3];t=+h[b+32>>3];u=+h[b+40>>3];gc(c[o>>2]|0,108224,(x=i,i=i+32|0,h[x>>3]=+h[b+16>>3],h[x+8>>3]=w,h[x+16>>3]=t,h[x+24>>3]=u,x)|0)|0;i=x}if(!l){eF(g);eF(n);eF(s);i=d;return}b=c[o>>2]|0;e=0;do{p=s+(e<<5)|0;q=(c[j+(e<<2)>>2]|0)+16|0;y=p;c[q>>2]=c[y>>2];c[q+4>>2]=c[y+4>>2];c[q+8>>2]=c[y+8>>2];c[q+12>>2]=c[y+12>>2];c[q+16>>2]=c[y+16>>2];c[q+20>>2]=c[y+20>>2];c[q+24>>2]=c[y+24>>2];c[q+28>>2]=c[y+28>>2];if((a[213992]|0)!=0){u=+h[p>>3];t=+h[s+(e<<5)+16>>3];w=t*.5;r=+h[s+(e<<5)+8>>3];v=+h[s+(e<<5)+24>>3];z=v*.5;gc(b|0,102600,(x=i,i=i+80|0,h[x>>3]=+h[m+(e<<3)>>3],h[x+8>>3]=u-w,h[x+16>>3]=r-z,h[x+24>>3]=u+w,h[x+32>>3]=r+z,h[x+40>>3]=t*v,h[x+48>>3]=u,h[x+56>>3]=r,h[x+64>>3]=t,h[x+72>>3]=v,x)|0)|0;i=x}e=e+1|0;}while((e|0)<(f|0));eF(g);eF(n);eF(s);if(l){A=0;B=k}else{i=d;return}while(1){k=c[B>>2]|0;if((c[k+60>>2]|0)==0){Su(k)}l=A+1|0;if((l|0)<(f|0)){A=l;B=k+52|0}else{break}}i=d;return}function Tu(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,p=0;d=i;i=i+40|0;e=d|0;if((c[b+60>>2]|0)==0){f=c[b+48>>2]|0;if((f|0)!=0){g=f;do{Tu(g);g=c[g+52>>2]|0;}while((g|0)!=0)}j=+h[b+32>>3];k=+h[b+40>>3];l=+h[b+16>>3]-j*.5;m=+h[b+24>>3]-k*.5;g=c[(c[b+56>>2]|0)+8>>2]|0;h[g+16>>3]=l;h[g+24>>3]=m;h[g+32>>3]=j+l;h[g+40>>3]=k+m;i=d;return}m=+h[b+24>>3];k=+h[b+32>>3];l=+h[b+40>>3];g=c[b+56>>2]|0;f=g+8|0;n=c[f>>2]|0;h[n+16>>3]=+h[b+16>>3];h[n+24>>3]=m;h[(c[f>>2]|0)+32>>3]=k/72.0;h[(c[f>>2]|0)+40>>3]=l/72.0;n=g|0;vn(g,c[(c[(Hx(n)|0)+8>>2]|0)+116>>2]&1);b=e|0;e=c[53624]|0;do{if((e|0)!=0){if((a[fw(n,e)|0]|0)!=0){break}nb(b|0,115344,(p=i,i=i+8|0,h[p>>3]=+h[(c[f>>2]|0)+80>>3]*.7,p)|0)|0;i=p;hw(n,c[53624]|0,b)|0}}while(0);Ym(g);if((a[213992]|0)==0){i=d;return}g=c[o>>2]|0;b=$w(n)|0;n=c[f>>2]|0;l=+h[n+16>>3];k=+h[n+24>>3];m=+h[n+80>>3];j=+h[n+88>>3]+ +h[n+96>>3];gc(g|0,127608,(p=i,i=i+40|0,c[p>>2]=b,h[p+8>>3]=l,h[p+16>>3]=k,h[p+24>>3]=m,h[p+32>>3]=j,p)|0)|0;i=p;i=d;return}function Uu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=c[a+64>>2]|0;if((b|0)<=0){d=a;eF(d);return}e=0;f=a+48|0;while(1){g=c[f>>2]|0;Uu(g);h=e+1|0;if((h|0)<(b|0)){e=h;f=g+52|0}else{break}}d=a;eF(d);return}function Vu(a,b){a=a|0;b=b|0;var d=0.0,e=0;d=+h[c[a>>2]>>3]- +h[c[b>>2]>>3];if(d<0.0){e=1;return e|0}e=(d>0.0)<<31>>31;return e|0}function Wu(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;c[53590]=Wv(a,1,142256,119360)|0;qn(a,2);d=a+8|0;b[(c[d>>2]|0)+168>>1]=2;c[53568]=2;Yu(a,0);e=jk((Lw(a)|0)<<2)|0;f=jk(((Lw(a)|0)<<2)+4|0)|0;c[(c[d>>2]|0)+144>>2]=f;f=ux(a)|0;if((f|0)!=0){g=0;h=f;while(1){f=h|0;Wx(f,110896,304,1)|0;c[(c[h+8>>2]|0)+112>>2]=e+(g<<2);i=g+1|0;c[(c[(c[d>>2]|0)+144>>2]|0)+(g<<2)>>2]=h;gw(f,142256,119360)|0;f=mw(a,h)|0;if((f|0)!=0){j=f;do{Wx(j|0,109720,304,1)|0;j=ow(a,j)|0;}while((j|0)!=0)}j=vx(a,h)|0;if((j|0)==0){break}else{g=i;h=j}}}do{if((Lw(a)|0)==0){if((c[(c[d>>2]|0)+172>>2]|0)!=0){break}return}}while(0);Qu(a);Xk(a);return}function Xu(a){a=a|0;var b=0,d=0,e=0;b=ux(a)|0;if((b|0)==0){return}eF(c[(c[b+8>>2]|0)+112>>2]|0);d=b;do{b=mw(a,d)|0;if((b|0)!=0){e=b;do{tn(e);e=ow(a,e)|0;}while((e|0)!=0)}un(d);d=vx(a,d)|0;}while((d|0)!=0);eF(c[(c[a+8>>2]|0)+144>>2]|0);if((Ix(a|0)|0)==(a|0)){return}_x(a,0,96984);return}function Yu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+16|0;e=d|0;f=(b|0)==0;if(f){c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;g=e}else{g=b}b=sy(a)|0;if((b|0)!=0){h=g+8|0;j=g+4|0;k=g|0;l=b;do{b=l|0;if((Za($w(b)|0,103864,7)|0)==0){Wx(b,96984,272,1)|0;b=(c[h>>2]|0)+1|0;c[h>>2]=b;m=c[j>>2]|0;if((b|0)<(m|0)){n=b;o=c[k>>2]|0}else{b=m+10|0;c[j>>2]=b;m=mk(c[k>>2]|0,b<<2)|0;c[k>>2]=m;n=c[h>>2]|0;o=m}c[o+(n<<2)>>2]=l;Yu(l,0)}else{Yu(l,g)}l=ty(l)|0;}while((l|0)!=0)}if(!f){i=d;return}f=e+8|0;l=a+8|0;c[(c[l>>2]|0)+172>>2]=c[f>>2];a=c[f>>2]|0;if((a|0)==0){i=d;return}f=mk(c[e>>2]|0,(a<<2)+4|0)|0;c[(c[l>>2]|0)+176>>2]=f;i=d;return}function Zu(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,l=0.0,m=0.0,n=0,p=0.0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0;g=i;j=f;f=i;i=i+32|0;tF(f,j,32)|0;if((b|0)>0){l=0.0;j=0;while(1){m=l+ +h[e+(j<<3)>>3];n=j+1|0;if((n|0)<(b|0)){l=m;j=n}else{p=m;break}}}else{p=0.0}l=+h[f+16>>3];m=+h[f+24>>3];if(p>l*m+.001){q=0;i=g;return q|0}j=jk(b<<5)|0;if((b|0)<1){q=j;i=g;return q|0}n=f+8|0;r=f|0;p=(c[k>>2]=d[n]|d[n+1|0]<<8|d[n+2|0]<<16|d[n+3|0]<<24,c[k+4>>2]=d[n+4|0]|d[n+5|0]<<8|d[n+6|0]<<16|d[n+7|0]<<24,+h[k>>3]);n=c[o>>2]|0;f=b;b=e;e=j;s=1.0;t=l;u=m;v=l<m?l:m;w=(c[k>>2]=d[r]|d[r+1|0]<<8|d[r+2|0]<<16|d[r+3|0]<<24,c[k+4>>2]=d[r+4|0]|d[r+5|0]<<8|d[r+6|0]<<16|d[r+7|0]<<24,+h[k>>3]);x=p;p=l;l=m;while(1){m=t<u?t:u;r=0;y=0.0;z=s;A=0.0;B=1.0;C=v;while(1){if((a[213992]|0)!=0){gc(n|0,159552,(D=i,i=i+32|0,h[D>>3]=w,h[D+8>>3]=t,h[D+16>>3]=x,h[D+24>>3]=u,D)|0)|0;i=D;gc(n|0,163216,(D=i,i=i+8|0,c[D>>2]=r,D)|0)|0;i=D}if((r|0)==0){E=+h[b>>3];F=C*C;G=E/F;H=F/E;r=1;y=E;z=E;A=E;B=G>H?G:H;C=m;continue}if((r|0)>=(f|0)){break}H=+h[b+(r<<3)>>3];G=H<y?y:H;E=H>z?z:H;F=A+H;H=F/C;I=H/(E/H);J=G/H/H;H=I>J?I:J;if(H>B){break}r=r+1|0;y=G;z=E;A=F;B=H;C=m}m=A/C;if((a[213992]|0)!=0){gc(n|0,131176,(D=i,i=i+32|0,c[D>>2]=r,h[D+8>>3]=A,h[D+16>>3]=C,h[D+24>>3]=m,D)|0)|0;i=D}K=(r|0)>0;if(C==t){if(K){B=m*.5;z=l*.5+x-B;L=0;y=w-t*.5;while(1){h[e+(L<<5)+24>>3]=m;H=+h[b+(L<<3)>>3]/m;h[e+(L<<5)+16>>3]=H;h[e+(L<<5)+8>>3]=z;h[e+(L<<5)>>3]=y+H*.5;M=L+1|0;if((M|0)<(r|0)){L=M;y=y+H}else{N=l;O=p;P=B;break}}}else{N=u;O=t;P=m*.5}B=N-m;Q=O;R=B;S=w;T=x-P;U=p;V=B}else{if(K){B=m*.5;y=w-p*.5+B;L=0;z=x+u*.5;while(1){h[e+(L<<5)+16>>3]=m;C=+h[b+(L<<3)>>3]/m;h[e+(L<<5)+24>>3]=C;h[e+(L<<5)>>3]=y;h[e+(L<<5)+8>>3]=z-C*.5;M=L+1|0;if((M|0)<(r|0)){L=M;z=z-C}else{W=p;X=l;Y=B;break}}}else{W=t;X=u;Y=m*.5}B=W-m;Q=B;R=X;S=w+Y;T=x;U=B;V=l}L=f-r|0;if((L|0)<1){q=j;break}else{f=L;b=b+(r<<3)|0;e=e+(r<<5)|0;s=0.0;t=Q;u=R;v=Q<R?Q:R;w=S;x=T;p=U;l=V}}i=g;return q|0}function _u(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;h[a>>3]=b;h[a+8>>3]=c;h[a+16>>3]=d;h[a+24>>3]=e;return}function $u(a){a=a|0;var d=0,e=0,f=0,g=0;qn(a,2);d=a+8|0;b[(c[d>>2]|0)+168>>1]=2;c[53568]=2;e=ux(a)|0;if((e|0)!=0){f=e;do{qt(f);f=vx(a,f)|0;}while((f|0)!=0)}f=ux(a)|0;if((f|0)!=0){e=f;do{f=mw(a,e)|0;if((f|0)!=0){g=f;do{Wx(g|0,81536,176,1)|0;Zm(g)|0;g=ow(a,g)|0;}while((g|0)!=0)}e=vx(a,e)|0;}while((e|0)!=0)}av(a,0);bv(a,0);cv(a,0);e=c[d>>2]|0;if((c[(c[e+8>>2]|0)+84>>2]|0)==0){d=b[e+128>>1]&14;if((d|0)==0){Xk(a);return}Lt(a,d)|0;Xk(a);return}else{d=ux(a)|0;if((d|0)!=0){e=d;do{d=e+8|0;g=c[d>>2]|0;h[c[g+132>>2]>>3]=+h[g+16>>3]/72.0;g=c[d>>2]|0;h[(c[g+132>>2]|0)+8>>3]=+h[g+24>>3]/72.0;e=vx(a,e)|0;}while((e|0)!=0)}Nt(a);Xk(a);return}}function av(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+16|0;e=d|0;f=(b|0)==0;if(f){c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;g=e}else{g=b}b=sy(a)|0;if((b|0)!=0){h=g+8|0;j=g+4|0;k=g|0;l=b;do{b=l|0;if((Za($w(b)|0,91512,7)|0)==0){Wx(b,86256,272,1)|0;Rj(l);b=(c[h>>2]|0)+1|0;c[h>>2]=b;m=c[j>>2]|0;if((b|0)<(m|0)){n=b;o=c[k>>2]|0}else{b=m+10|0;c[j>>2]=b;m=mk(c[k>>2]|0,b<<2)|0;c[k>>2]=m;n=c[h>>2]|0;o=m}c[o+(n<<2)>>2]=l;av(l,0)}else{av(l,g)}l=ty(l)|0;}while((l|0)!=0)}if(!f){i=d;return}f=e+8|0;l=a+8|0;c[(c[l>>2]|0)+172>>2]=c[f>>2];a=c[f>>2]|0;if((a|0)==0){i=d;return}f=mk(c[e>>2]|0,(a<<2)+4|0)|0;c[(c[l>>2]|0)+176>>2]=f;i=d;return}function bv(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0;e=i;i=i+32|0;f=e|0;g=c[a+48>>2]|0;if((d[213992]|0)>>>0>1>>>0){j=c[o>>2]|0;if((b|0)>0){k=b;do{Ma(115328,2,1,j|0)|0;k=k-1|0;}while((k|0)>0)}k=$w(a|0)|0;gc(j|0,108208,(l=i,i=i+8|0,c[l>>2]=k,l)|0)|0;i=l}k=a+8|0;j=c[k>>2]|0;if((c[j+172>>2]|0)<1){m=0}else{n=b+1|0;p=0;q=1;r=j;while(1){j=c[(c[r+176>>2]|0)+(q<<2)>>2]|0;bv(j,n);s=(Lw(j)|0)+p|0;j=c[k>>2]|0;if((q|0)<(c[j+172>>2]|0)){p=s;q=q+1|0;r=j}else{m=s;break}}}r=(Lw(a)|0)-m|0;m=c[k>>2]|0;q=(c[m+172>>2]|0)+r|0;p=(q|0)==0;do{if(p){if((c[m+12>>2]|0)!=0){break}h[m+24>>3]=0.0;h[(c[k>>2]|0)+16>>3]=0.0;h[(c[k>>2]|0)+40>>3]=18.0;h[(c[k>>2]|0)+32>>3]=18.0;i=e;return}}while(0);m=f+16|0;do{if((tv(a,4,4,f)|0)>>>0<3>>>0){c[m>>2]=3;t=0;u=0}else{if((c[m>>2]|0)!=4){t=0;u=0;break}if((c[f+28>>2]&2|0)==0){t=0;u=0;break}n=Wv(g,0,102592,0)|0;s=Wv(g,1,102592,0)|0;if((n|0)==0&(s|0)==0){j=$w(a|0)|0;Fv(0,96896,(l=i,i=i+8|0,c[l>>2]=j,l)|0)|0;i=l;t=0;u=0;break}else{c[f+24>>2]=jk(q)|0;t=s;u=n;break}}}while(0);g=jk(q<<5)|0;m=g;n=jk(q<<2)|0;s=n;j=c[k>>2]|0;if((c[j+172>>2]|0)<1){v=0}else{w=f+24|0;x=(u|0)==0;y=0;z=1;A=j;while(1){j=c[(c[A+176>>2]|0)+(z<<2)>>2]|0;B=m+(y<<5)|0;C=(c[j+8>>2]|0)+16|0;c[B>>2]=c[C>>2];c[B+4>>2]=c[C+4>>2];c[B+8>>2]=c[C+8>>2];c[B+12>>2]=c[C+12>>2];c[B+16>>2]=c[C+16>>2];c[B+20>>2]=c[C+20>>2];c[B+24>>2]=c[C+24>>2];c[B+28>>2]=c[C+28>>2];C=j|0;if(!((c[w>>2]|0)==0|x)){j=Em(C,u,0,0)|0;c[(c[w>>2]|0)+(y<<2)>>2]=j}j=y+1|0;c[s+(y<<2)>>2]=C;C=c[k>>2]|0;if((z|0)<(c[C+172>>2]|0)){y=j;z=z+1|0;A=C}else{v=j;break}}}a:do{if((r|0)>0){A=ux(a)|0;if((A|0)==0){break}z=a|0;y=f+24|0;if((t|0)==0){w=A;u=v;while(1){x=w+8|0;j=(c[x>>2]|0)+112|0;if((c[j>>2]|0)==0){c[j>>2]=z;j=c[x>>2]|0;D=+h[j+88>>3]+ +h[j+96>>3];E=+h[j+80>>3];vF(m+(u<<5)|0,0,16)|0;h[m+(u<<5)+16>>3]=D;h[m+(u<<5)+24>>3]=E;c[s+(u<<2)>>2]=w;F=u+1|0}else{F=u}j=vx(a,w)|0;if((j|0)==0){break a}else{w=j;u=F}}}else{G=A;H=v}while(1){u=G+8|0;w=(c[u>>2]|0)+112|0;if((c[w>>2]|0)==0){c[w>>2]=z;w=c[u>>2]|0;E=+h[w+88>>3]+ +h[w+96>>3];D=+h[w+80>>3];vF(m+(H<<5)|0,0,16)|0;h[m+(H<<5)+16>>3]=E;h[m+(H<<5)+24>>3]=D;w=G|0;if((c[y>>2]|0)!=0){u=Em(w,t,0,0)|0;c[(c[y>>2]|0)+(H<<2)>>2]=u}c[s+(H<<2)>>2]=w;I=H+1|0}else{I=H}w=vx(a,G)|0;if((w|0)==0){break}else{G=w;H=I}}}}while(0);I=ov(q,m,f)|0;H=c[f+24>>2]|0;if((H|0)!=0){eF(H)}H=(q|0)>0;if(H){G=(b|0)>0;t=c[o>>2]|0;D=-2147483647.0;E=-2147483647.0;J=2147483647.0;K=2147483647.0;v=0;while(1){L=+(c[I+(v<<3)>>2]|0);M=+(c[I+(v<<3)+4>>2]|0);N=L+ +h[m+(v<<5)>>3];O=L+ +h[m+(v<<5)+16>>3];L=M+ +h[m+(v<<5)+8>>3];P=M+ +h[m+(v<<5)+24>>3];M=K<N?K:N;Q=J<L?J:L;R=E>O?E:O;S=D>P?D:P;F=c[s+(v<<2)>>2]|0;r=F+8|0;y=c[r>>2]|0;z=y+16|0;do{if((v|0)<(c[(c[k>>2]|0)+172>>2]|0)){h[z>>3]=N;h[y+24>>3]=L;h[y+32>>3]=O;h[y+40>>3]=P;if((d[213992]|0)>>>0<=1>>>0){break}if(G){A=b;do{Ma(115328,2,1,t|0)|0;A=A-1|0;}while((A|0)>0)}A=$w(F)|0;gc(t|0,127520,(l=i,i=i+40|0,c[l>>2]=A,h[l+8>>3]=N,h[l+16>>3]=L,h[l+24>>3]=O,h[l+32>>3]=P,l)|0)|0;i=l}else{h[z>>3]=(N+O)*.5;h[y+24>>3]=(L+P)*.5;if((d[213992]|0)>>>0<=1>>>0){break}if(G){A=b;do{Ma(115328,2,1,t|0)|0;A=A-1|0;}while((A|0)>0)}A=$w(F)|0;w=c[r>>2]|0;T=+h[w+16>>3];U=+h[w+24>>3];gc(t|0,157320,(l=i,i=i+24|0,c[l>>2]=A,h[l+8>>3]=T,h[l+16>>3]=U,l)|0)|0;i=l}}while(0);r=v+1|0;if((r|0)<(q|0)){D=S;E=R;J=Q;K=M;v=r}else{V=S;W=R;X=Q;Y=M;break}}}else{V=-2147483647.0;W=-2147483647.0;X=2147483647.0;Y=2147483647.0}v=c[k>>2]|0;t=c[v+12>>2]|0;do{if((t|0)==0){Z=Y;_=X;$=W;aa=V}else{K=+h[t+24>>3];if(p){ba=0.0;ca=0.0;da=K;ea=+h[t+32>>3]}else{ba=Y;ca=X;da=W;ea=V}J=K-(da-ba);if(J<=0.0){Z=ba;_=ca;$=da;aa=ea;break}K=J*.5;Z=ba-K;_=ca;$=da+K;aa=ea}}while(0);t=(b|0)>0;if(t){fa=+((c[f+8>>2]|0)>>>0>>>0)*.5}else{fa=0.0}ea=Z-fa;Z=$+fa;$=_-(fa+ +h[v+56>>3]);_=aa+(fa+ +h[v+88>>3]);if((d[213992]|0)>>>0>1>>>0){if(t){v=c[o>>2]|0;f=b;do{Ma(115328,2,1,v|0)|0;f=f-1|0;}while((f|0)>0)}f=c[o>>2]|0;v=$w(a|0)|0;gc(f|0,127520,(l=i,i=i+40|0,c[l>>2]=v,h[l+8>>3]=ea,h[l+16>>3]=$,h[l+24>>3]=Z,h[l+32>>3]=_,l)|0)|0;i=l}b:do{if(H){v=c[o>>2]|0;if(t){ga=0}else{f=0;while(1){p=c[s+(f<<2)>>2]|0;G=p+8|0;m=c[G>>2]|0;r=m+16|0;fa=+h[r>>3];F=m+24|0;aa=+h[F>>3];do{if((f|0)<(c[(c[k>>2]|0)+172>>2]|0)){y=m+32|0;z=m+40|0;da=fa-ea;ca=aa-$;ba=+h[y>>3]-ea;V=+h[z>>3]-$;h[r>>3]=da;h[F>>3]=ca;h[y>>3]=ba;h[z>>3]=V;if((d[213992]|0)>>>0<=1>>>0){break}z=$w(p)|0;gc(v|0,127520,(l=i,i=i+40|0,c[l>>2]=z,h[l+8>>3]=da,h[l+16>>3]=ca,h[l+24>>3]=ba,h[l+32>>3]=V,l)|0)|0;i=l}else{h[r>>3]=fa-ea;h[F>>3]=aa-$;if((d[213992]|0)>>>0<=1>>>0){break}z=$w(p)|0;y=c[G>>2]|0;V=+h[y+16>>3];ba=+h[y+24>>3];gc(v|0,157320,(l=i,i=i+24|0,c[l>>2]=z,h[l+8>>3]=V,h[l+16>>3]=ba,l)|0)|0;i=l}}while(0);f=f+1|0;if((f|0)>=(q|0)){break b}}}do{f=c[s+(ga<<2)>>2]|0;G=f+8|0;p=c[G>>2]|0;F=p+16|0;M=+h[F>>3];r=p+24|0;Q=+h[r>>3];do{if((ga|0)<(c[(c[k>>2]|0)+172>>2]|0)){m=p+32|0;z=p+40|0;R=M-ea;S=Q-$;aa=+h[m>>3]-ea;fa=+h[z>>3]-$;h[F>>3]=R;h[r>>3]=S;h[m>>3]=aa;h[z>>3]=fa;if((d[213992]|0)>>>0>1>>>0){ha=b}else{break}do{Ma(115328,2,1,v|0)|0;ha=ha-1|0;}while((ha|0)>0);z=$w(f)|0;gc(v|0,127520,(l=i,i=i+40|0,c[l>>2]=z,h[l+8>>3]=R,h[l+16>>3]=S,h[l+24>>3]=aa,h[l+32>>3]=fa,l)|0)|0;i=l}else{h[F>>3]=M-ea;h[r>>3]=Q-$;if((d[213992]|0)>>>0>1>>>0){ia=b}else{break}do{Ma(115328,2,1,v|0)|0;ia=ia-1|0;}while((ia|0)>0);z=$w(f)|0;m=c[G>>2]|0;fa=+h[m+16>>3];aa=+h[m+24>>3];gc(v|0,157320,(l=i,i=i+24|0,c[l>>2]=z,h[l+8>>3]=fa,h[l+16>>3]=aa,l)|0)|0;i=l}}while(0);ga=ga+1|0;}while((ga|0)<(q|0))}}while(0);Q=Z-ea;Z=_-$;_=ea-ea;ea=$-$;q=c[k>>2]|0;h[q+16>>3]=_;h[q+24>>3]=ea;h[q+32>>3]=Q;h[q+40>>3]=Z;if((d[213992]|0)>>>0>1>>>0){if(t){t=c[o>>2]|0;q=b;do{Ma(115328,2,1,t|0)|0;q=q-1|0;}while((q|0)>0)}q=c[o>>2]|0;t=$w(a|0)|0;gc(q|0,127520,(l=i,i=i+40|0,c[l>>2]=t,h[l+8>>3]=_,h[l+16>>3]=ea,h[l+24>>3]=Q,h[l+32>>3]=Z,l)|0)|0;i=l}eF(g);eF(n);eF(I);i=e;return}function cv(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0;e=i;f=a+8|0;g=c[f>>2]|0;j=+h[g+16>>3];k=+h[g+24>>3];if((d[213992]|0)>>>0>1>>>0){g=c[o>>2]|0;if((b|0)>0){l=b;do{Ma(115328,2,1,g|0)|0;l=l-1|0;}while((l|0)>0)}l=$w(a|0)|0;gc(g|0,119416,(m=i,i=i+8|0,c[m>>2]=l,m)|0)|0;i=m}l=(b|0)!=0;do{if(l){g=ux(a)|0;if((g|0)==0){break}n=(b|0)>0;p=c[o>>2]|0;q=g;do{g=q+8|0;r=c[g>>2]|0;do{if((c[r+112>>2]|0)==(a|0)){s=r+16|0;h[s>>3]=j+ +h[s>>3];s=(c[g>>2]|0)+24|0;h[s>>3]=k+ +h[s>>3];if((d[213992]|0)>>>0<=1>>>0){break}if(n){s=b;do{Ma(115328,2,1,p|0)|0;s=s-1|0;}while((s|0)>0)}s=$w(q|0)|0;t=c[g>>2]|0;u=+h[t+16>>3];v=+h[t+24>>3];gc(p|0,157320,(m=i,i=i+24|0,c[m>>2]=s,h[m+8>>3]=u,h[m+16>>3]=v,m)|0)|0;i=m}}while(0);q=vx(a,q)|0;}while((q|0)!=0)}}while(0);a=c[f>>2]|0;if((c[a+172>>2]|0)<1){i=e;return}q=(b|0)>0;p=c[o>>2]|0;n=b+1|0;g=1;r=a;while(1){a=c[(c[r+176>>2]|0)+(g<<2)>>2]|0;if(l){s=a+8|0;t=c[s>>2]|0;v=j+ +h[t+16>>3];u=k+ +h[t+24>>3];w=j+ +h[t+32>>3];x=k+ +h[t+40>>3];if((d[213992]|0)>>>0>1>>>0){if(q){y=b;do{Ma(115328,2,1,p|0)|0;y=y-1|0;}while((y|0)>0)}y=$w(a|0)|0;gc(p|0,127520,(m=i,i=i+40|0,c[m>>2]=y,h[m+8>>3]=v,h[m+16>>3]=u,h[m+24>>3]=w,h[m+32>>3]=x,m)|0)|0;i=m;z=c[s>>2]|0}else{z=t}h[z+16>>3]=v;h[z+24>>3]=u;h[z+32>>3]=w;h[z+40>>3]=x}cv(a,n);y=c[f>>2]|0;if((g|0)<(c[y+172>>2]|0)){g=g+1|0;r=y}else{break}}i=e;return}function dv(a){a=a|0;var b=0,c=0;b=ux(a)|0;if((b|0)==0){ev(a);return}else{c=b}do{un(c);c=vx(a,c)|0;}while((c|0)!=0);ev(a);return}function ev(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+8|0;a=c[b>>2]|0;d=c[a+176>>2]|0;if((c[a+172>>2]|0)<1){e=d;f=e;eF(f);return}else{g=1;h=d}while(1){d=c[h+(g<<2)>>2]|0;dk(c[(c[d+8>>2]|0)+12>>2]|0);ev(d);d=c[b>>2]|0;a=c[d+176>>2]|0;if((g|0)<(c[d+172>>2]|0)){g=g+1|0;h=a}else{e=a;break}}f=e;eF(f);return}function fv(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,la=0,na=0,oa=0,qa=0,ra=0;g=i;i=i+4256|0;h=1;j=0;k=i;i=i+168|0;c[k>>2]=0;while(1)switch(h|0){case 1:l=g|0;m=g+128|0;n=g+144|0;o=g+160|0;p=ma(20,b|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((p|0)==0){h=2;break}else{h=3;break};case 2:c[d>>2]=0;q=0;h=37;break;case 3:if((e|0)==0){r=118752;h=6;break}else{s=e;h=4;break};case 4:t=s+1|0;w=a[s]|0;if((w<<24>>24|0)==95){s=t;h=4;break}else if((w<<24>>24|0)==0){r=e;h=6;break}else{h=5;break};case 5:p=ma(2,w&255|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((p|0)==0){r=118752;h=6;break}else{s=t;h=4;break};case 6:x=ma(24,r|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;y=x+25|0;if((y|0)<129){h=7;break}else{h=8;break};case 7:z=l|0;h=9;break;case 8:p=ma(54,y|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;z=p;h=9;break;case 9:wa(172,z|0,r|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;p=ma(18,b|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((p|0)==0){h=11;break}else{A=p;h=10;break};case 10:a[(c[A+8>>2]|0)+157|0]=0;p=wa(88,b|0,A|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((p|0)==0){h=11;break}else{A=p;h=10;break};case 11:p=ma(54,40)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;B=p;p=o|0;c[n>>2]=p;c[n+4>>2]=o+4096;c[n+12>>2]=0;c[n+8>>2]=0;C=m|0;c[C>>2]=n;c[m+4>>2]=n;c[m+8>>2]=p;D=BF(178072,h,k)|0;h=38;break;case 38:if((D|0)==0){h=12;break}else{E=1;F=0;G=B;H=0;I=n;h=28;break};case 12:J=ma(18,b|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((J|0)==0){K=0;L=0;h=20;break}else{h=13;break};case 13:M=z+x|0;N=0;O=0;P=J;Q=0;h=14;break;case 14:R=c[P+8>>2]|0;if((a[R+157|0]|0)==0){h=15;break}else{S=Q;T=O;U=N;h=19;break};case 15:if((a[R+119|0]|0)==3){h=16;break}else{S=Q;T=O;U=N;h=19;break};case 16:if((O|0)==0){h=17;break}else{V=Q;W=O;X=N;h=18;break};case 17:pa(6,M|0,156992,(Y=i,i=i+8|0,c[Y>>2]=N,Y)|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;i=Y;p=pa(38,b|0,z|0,1)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;Aa(60,p|0,127304,272,1)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;c[B+(N<<2)>>2]=p;V=1;W=p;X=N+1|0;h=18;break;case 18:ja(26,b|0,P|0,26,W|0,m|0);if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;S=V;T=W;U=X;h=19;break;case 19:p=wa(88,b|0,P|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((p|0)==0){K=U;L=S;h=20;break}else{N=U;O=T;P=p;Q=S;h=14;break};case 20:Z=ma(18,b|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((Z|0)==0){_=K;$=B;h=27;break}else{h=21;break};case 21:aa=z+x|0;ba=K;ca=Z;da=B;ea=10;h=22;break;case 22:if((a[(c[ca+8>>2]|0)+157|0]|0)==0){h=23;break}else{fa=ea;ga=da;ha=ba;h=26;break};case 23:pa(6,aa|0,156992,(Y=i,i=i+8|0,c[Y>>2]=ba,Y)|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;i=Y;ia=pa(38,b|0,z|0,1)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;p=ia|0;Aa(60,p|0,127304,272,1)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;ja(26,b|0,ca|0,26,p|0,m|0);if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((ba|0)==(ea|0)){h=24;break}else{la=ea;na=da;h=25;break};case 24:p=ea<<1;oa=wa(206,da|0,ea<<3|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;la=p;na=oa;h=25;break;case 25:c[na+(ba<<2)>>2]=ia;fa=la;ga=na;ha=ba+1|0;h=26;break;case 26:oa=wa(88,b|0,ca|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((oa|0)==0){_=ha;$=ga;h=27;break}else{ba=ha;ca=oa;da=ga;ea=fa;h=22;break};case 27:E=0;F=L;G=$;H=_;I=c[C>>2]|0;h=28;break;case 28:oa=c[I+12>>2]|0;if((oa|0)==0){h=30;break}else{qa=oa;h=29;break};case 29:oa=c[qa+12>>2]|0;ka(150,c[qa>>2]|0);if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;ka(150,qa|0);if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((oa|0)==0){h=30;break}else{qa=oa;h=29;break};case 30:if((z|0)==(l|0)){h=32;break}else{h=31;break};case 31:ka(150,z|0);if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;h=32;break;case 32:if((E|0)==0){h=36;break}else{h=33;break};case 33:c[d>>2]=0;if((H|0)>0){ra=0;h=34;break}else{h=35;break};case 34:ma(38,c[G+(ra<<2)>>2]|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;oa=ra+1|0;if((oa|0)<(H|0)){ra=oa;h=34;break}else{h=35;break};case 35:ka(150,G|0);if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;q=0;h=37;break;case 36:oa=wa(206,G|0,H<<2|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;c[d>>2]=H;a[f]=F;q=oa;h=37;break;case 37:i=g;return q|0;case-1:if((j|0)==11){D=v;h=38}u=v=0;break}return 0}function gv(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;kv(g,d);d=g|0;h=g+8|0;i=g+4|0;a:while(1){j=c[h>>2]|0;k=c[i>>2]|0;if((j|0)==(c[k>>2]|0)){if((k|0)==(c[d>>2]|0)){l=12;break}m=c[k+8>>2]|0;c[i>>2]=m;k=c[m+4>>2]|0;c[h>>2]=k;n=k}else{n=j}j=n-4|0;c[h>>2]=j;k=c[j>>2]|0;if((k|0)==0){l=12;break}a[(c[k+8>>2]|0)+157|0]=1;Dc[e&63](k,f);j=rw(b,k)|0;if((j|0)==0){continue}else{o=j}while(1){j=c[o>>2]&3;m=c[((j|0)==3?o:o+32|0)+28>>2]|0;if((m|0)==(k|0)){p=c[((j|0)==2?o:o-32|0)+28>>2]|0}else{p=m}if((a[(c[p+8>>2]|0)+157|0]|0)==0){kv(g,p)}m=sw(b,o,k)|0;if((m|0)==0){continue a}else{o=m}}}if((l|0)==12){return}}function hv(a,b){a=a|0;b=b|0;zx(b,a,1)|0;return}function iv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;f=i;i=i+4256|0;g=1;h=0;j=i;i=i+168|0;c[j>>2]=0;while(1)switch(g|0){case 1:k=f|0;l=f+128|0;m=f+144|0;n=f+160|0;o=ma(20,b|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((o|0)==0){g=2;break}else{g=3;break};case 2:c[d>>2]=0;p=0;g=30;break;case 3:if((e|0)==0){q=118752;g=6;break}else{r=e;g=4;break};case 4:s=r+1|0;t=a[r]|0;if((t<<24>>24|0)==95){r=s;g=4;break}else if((t<<24>>24|0)==0){q=e;g=6;break}else{g=5;break};case 5:o=ma(2,t&255|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((o|0)==0){q=118752;g=6;break}else{r=s;g=4;break};case 6:w=ma(24,q|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;x=w+25|0;if((x|0)<129){g=7;break}else{g=8;break};case 7:y=k|0;g=9;break;case 8:o=ma(54,x|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((o|0)==0){p=0;g=30;break}else{y=o;g=9;break};case 9:wa(172,y|0,q|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;o=ma(18,b|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((o|0)==0){g=11;break}else{z=o;g=10;break};case 10:a[(c[z+8>>2]|0)+157|0]=0;o=wa(88,b|0,z|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((o|0)==0){g=11;break}else{z=o;g=10;break};case 11:A=ma(54,40)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;o=n|0;c[m>>2]=o;c[m+4>>2]=n+4096;B=m+12|0;c[B>>2]=0;c[m+8>>2]=0;C=l|0;c[C>>2]=m;c[l+4>>2]=m;c[l+8>>2]=o;D=BF(178072,g,j)|0;g=31;break;case 31:if((D|0)==0){g=17;break}else{g=12;break};case 12:o=c[B>>2]|0;if((o|0)==0){g=14;break}else{E=o;g=13;break};case 13:o=c[E+12>>2]|0;ka(150,c[E>>2]|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;ka(150,E|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((o|0)==0){g=14;break}else{E=o;g=13;break};case 14:ka(150,A|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((y|0)==(k|0)){g=16;break}else{g=15;break};case 15:ka(150,y|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;g=16;break;case 16:c[d>>2]=0;p=0;g=30;break;case 17:F=A;G=ma(18,b|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((G|0)==0){H=0;I=F;J=m;g=25;break}else{g=18;break};case 18:K=y+w|0;L=0;M=G;N=F;O=10;g=19;break;case 19:if((a[(c[M+8>>2]|0)+157|0]|0)==0){g=20;break}else{P=O;Q=N;R=L;g=23;break};case 20:pa(6,K|0,156992,(o=i,i=i+8|0,c[o>>2]=L,o)|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;i=o;S=pa(38,b|0,y|0,1)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;o=S|0;Aa(60,o|0,127304,272,1)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;ja(26,b|0,M|0,26,o|0,l|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((L|0)==(O|0)){g=21;break}else{T=O;U=N;g=22;break};case 21:o=O<<1;V=wa(206,N|0,O<<3|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;T=o;U=V;g=22;break;case 22:c[U+(L<<2)>>2]=S;P=T;Q=U;R=L+1|0;g=23;break;case 23:V=wa(88,b|0,M|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((V|0)==0){g=24;break}else{L=R;M=V;N=Q;O=P;g=19;break};case 24:H=R;I=Q;J=c[C>>2]|0;g=25;break;case 25:V=c[J+12>>2]|0;if((V|0)==0){g=27;break}else{W=V;g=26;break};case 26:V=c[W+12>>2]|0;ka(150,c[W>>2]|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;ka(150,W|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((V|0)==0){g=27;break}else{W=V;g=26;break};case 27:V=wa(206,I|0,H<<2|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;X=V;if((y|0)==(k|0)){g=29;break}else{g=28;break};case 28:ka(150,y|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;g=29;break;case 29:c[d>>2]=H;p=X;g=30;break;case 30:i=f;return p|0;case-1:if((h|0)==11){D=v;g=31}u=v=0;break}return 0}function jv(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=c[a+48>>2]|0;d=ux(a)|0;if((d|0)==0){e=0;return e|0}else{f=d;g=0}while(1){d=mw(b,f)|0;if((d|0)==0){h=g}else{i=d;d=g;while(1){if((Rx(a,c[((c[i>>2]&3|0)==2?i:i-32|0)+28>>2]|0)|0)==0){j=d}else{xw(a,i,1)|0;j=d+1|0}k=ow(b,i)|0;if((k|0)==0){h=j;break}else{i=k;d=j}}}d=vx(a,f)|0;if((d|0)==0){e=h;break}else{f=d;g=h}}return e|0}function kv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;f=b+8|0;g=b+4|0;b=c[g>>2]|0;if((c[f>>2]|0)!=(c[b+4>>2]|0)){h=d+8|0;j=c[h>>2]|0;k=j;l=k+157|0;a[l]=1;m=c[f>>2]|0;n=m+4|0;c[f>>2]=n;c[m>>2]=d;i=e;return}o=c[b+12>>2]|0;do{if((o|0)==0){b=kk(16)|0;if((b|0)==0){Fv(1,115176,(p=i,i=i+1|0,i=i+7&-8,c[p>>2]=0,p)|0)|0;i=p;rc(178072,1)}c[b+8>>2]=c[g>>2];c[b+12>>2]=0;q=kk(4e6)|0;c[b>>2]=q;if((q|0)==0){Fv(1,115176,(p=i,i=i+1|0,i=i+7&-8,c[p>>2]=0,p)|0)|0;i=p;rc(178072,1)}else{c[b+4>>2]=q+4e6;c[(c[g>>2]|0)+12>>2]=b;r=c[(c[g>>2]|0)+12>>2]|0;break}}else{r=o}}while(0);c[g>>2]=r;c[f>>2]=c[r>>2];h=d+8|0;j=c[h>>2]|0;k=j;l=k+157|0;a[l]=1;m=c[f>>2]|0;n=m+4|0;c[f>>2]=n;c[m>>2]=d;i=e;return}function lv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=i;f=a;a=i;i=i+16|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];g=+h[a>>3];if(g<0.0){j=g+-.5}else{j=g+.5}f=~~j;j=+h[a+8>>3];if(j<0.0){k=j+-.5}else{k=j+.5}a=~~k;k=+h[b>>3];if(k<0.0){l=k+-.5}else{l=k+.5}m=~~l;l=+h[b+8>>3];if(l<0.0){n=l+-.5}else{n=l+.5}b=~~n;o=m-f|0;p=((o|0)>-1?o:-o|0)<<1;q=o>>31|1;o=b-a|0;r=((o|0)>-1?o:-o|0)<<1;s=o>>31|1;Gk(d,f,a);if((p|0)>(r|0)){if((f|0)==(m|0)){i=e;return}o=a;t=f;u=r-(p>>1)|0;while(1){if((u|0)>-1){v=u-p|0;w=o+s|0}else{v=u;w=o}x=t+q|0;Gk(d,x,w);if((x|0)==(m|0)){break}else{o=w;t=x;u=v+r|0}}i=e;return}else{if((a|0)==(b|0)){i=e;return}v=a;a=f;f=p-(r>>1)|0;while(1){if((f|0)>-1){y=f-r|0;z=a+q|0}else{y=f;z=a}u=v+s|0;Gk(d,z,u);if((u|0)==(b|0)){break}else{v=u;a=z;f=y+p|0}}i=e;return}}function mv(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0,K=0.0,L=0,M=0.0,N=0,O=0.0,P=0,Q=0,R=0,S=0,T=0.0,U=0.0,V=0.0,W=0,X=0,Y=0.0,Z=0,_=0.0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0.0,la=0,ma=0.0,na=0,oa=0.0,pa=0,qa=0.0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0.0,ya=0.0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0.0,Ka=0.0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0;j=i;i=i+40|0;k=j|0;l=j+16|0;m=j+32|0;if((b|0)<1){n=0;i=j;return n|0}p=g+16|0;if((c[p>>2]|0)>>>0>=4>>>0){q=kk(b<<5)|0;r=q;s=(b|0)>0;if(s){t=0;do{u=c[e+(t<<2)>>2]|0;$m(u);v=r+(t<<5)|0;w=(c[u+8>>2]|0)+16|0;c[v>>2]=c[w>>2];c[v+4>>2]=c[w+4>>2];c[v+8>>2]=c[w+8>>2];c[v+12>>2]=c[w+12>>2];c[v+16>>2]=c[w+16>>2];c[v+20>>2]=c[w+20>>2];c[v+24>>2]=c[w+24>>2];c[v+28>>2]=c[w+28>>2];t=t+1|0;}while((t|0)<(b|0))}do{if((c[p>>2]|0)==4){t=g+28|0;do{if((c[t>>2]&2|0)!=0){w=g+24|0;c[w>>2]=jk(b<<2)|0;if(s){x=0}else{break}do{v=ew(c[e+(x<<2)>>2]|0,108152)|0;do{if((v|0)!=0){u=ac(v|0,148336,(y=i,i=i+8|0,c[y>>2]=m,y)|0)|0;i=y;z=c[m>>2]|0;if(!((u|0)>0&(z|0)>-1)){break}c[(c[w>>2]|0)+(x<<2)>>2]=z}}while(0);x=x+1|0;}while((x|0)<(b|0))}}while(0);w=nv(b,r,g)|0;if((c[t>>2]&2|0)==0){A=w;break}eF(c[g+24>>2]|0);A=w}else{A=0}}while(0);eF(q);n=A;i=j;return n|0}A=c[g+20>>2]|0;q=(A|0)==0;r=c[o>>2]|0;x=0;m=0;s=0;w=0;v=0;z=0;while(1){u=c[e+(z<<2)>>2]|0;$m(u);do{if(q){B=v;C=w;D=s;E=m;F=x}else{if((a[A+z|0]|0)==0){B=v;C=w;D=s;E=m;F=x;break}G=c[u+8>>2]|0;H=+h[G+16>>3];if(H<0.0){I=H+-.5}else{I=H+.5}J=~~I;H=+h[G+24>>3];if(H<0.0){K=H+-.5}else{K=H+.5}L=~~K;H=+h[G+32>>3];if(H<0.0){M=H+-.5}else{M=H+.5}N=~~M;H=+h[G+40>>3];if(H<0.0){O=H+-.5}else{O=H+.5}G=~~O;if((v|0)==0){P=J;Q=L;R=N;S=G}else{P=(J|0)<(w|0)?J:w;Q=(L|0)<(s|0)?L:s;R=(N|0)>(m|0)?N:m;S=(G|0)>(x|0)?G:x}B=v+1|0;C=P;D=Q;E=R;F=S}}while(0);if((d[213992]|0)>>>0>2>>>0){t=$w(u|0)|0;G=c[u+8>>2]|0;H=+h[G+16>>3];T=+h[G+24>>3];U=+h[G+32>>3];V=+h[G+40>>3];gc(r|0,114504,(y=i,i=i+40|0,c[y>>2]=t,h[y+8>>3]=H,h[y+16>>3]=T,h[y+24>>3]=U,h[y+32>>3]=V,y)|0)|0;i=y}t=z+1|0;if((t|0)<(b|0)){x=F;m=E;s=D;w=C;v=B;z=t}else{break}}z=kk(b<<5)|0;B=z;v=0;do{w=B+(v<<5)|0;s=(c[(c[e+(v<<2)>>2]|0)+8>>2]|0)+16|0;c[w>>2]=c[s>>2];c[w+4>>2]=c[s+4>>2];c[w+8>>2]=c[s+8>>2];c[w+12>>2]=c[s+12>>2];c[w+16>>2]=c[s+16>>2];c[w+20>>2]=c[s+20>>2];c[w+24>>2]=c[s+24>>2];c[w+28>>2]=c[s+28>>2];v=v+1|0;}while((v|0)<(b|0));v=g+8|0;s=xv(b,B,c[v>>2]|0)|0;if((a[213992]|0)!=0){gc(r|0,136576,(y=i,i=i+8|0,c[y>>2]=s,y)|0)|0;i=y}if((s|0)<1){n=0;i=j;return n|0}w=(A|0)!=0;if(w){W=(C+E|0)/2|0;X=(D+F|0)/2|0}else{W=0;X=0}F=jk(b<<4)|0;D=F;E=g+12|0;g=(f|0)==0;C=k|0;m=k+8|0;O=+(s|0);x=l|0;S=l+8|0;R=0;do{Q=e+(R<<2)|0;P=c[Q>>2]|0;q=D+(R<<4)|0;c[D+(R<<4)+12>>2]=R;if((c[p>>2]|0)==3){t=(c[P+8>>2]|0)+16|0;G=c[v>>2]|0;yv(t,q,s,G,W,X,$w(P|0)|0)}else{P=c[Q>>2]|0;Q=c[v>>2]|0;G=c[E>>2]|0;t=g?P:f;N=Dk()|0;L=P+8|0;J=c[L>>2]|0;M=+h[J+16>>3];if(M<0.0){Y=M+-.5}else{Y=M+.5}Z=W-~~Y|0;M=+h[J+24>>3];if(M<0.0){_=M+-.5}else{_=M+.5}J=X-~~_|0;do{if((c[p>>2]|0)==1){$=kk((Lw(P)|0)<<2)|0;aa=$;ba=ux(P)|0;if((ba|0)!=0){da=ba;ba=0;while(1){ea=da+8|0;c[aa+(ba<<2)>>2]=c[(c[ea>>2]|0)+112>>2];c[(c[ea>>2]|0)+112>>2]=0;ea=vx(P,da)|0;if((ea|0)==0){break}else{da=ea;ba=ba+1|0}}}ba=c[L>>2]|0;if((c[ba+172>>2]|0)>=1){da=Z-Q|0;ea=J-Q|0;fa=Z+Q|0;ga=J+Q|0;ha=1;ia=ba;while(1){ba=c[(c[ia+176>>2]|0)+(ha<<2)>>2]|0;ja=c[ba+8>>2]|0;M=+h[ja+16>>3];if(M<0.0){ka=M+-.5}else{ka=M+.5}la=~~ka;M=+h[ja+24>>3];if(M<0.0){ma=M+-.5}else{ma=M+.5}na=~~ma;M=+h[ja+32>>3];if(M<0.0){oa=M+-.5}else{oa=M+.5}pa=~~oa;M=+h[ja+40>>3];if(M<0.0){qa=M+-.5}else{qa=M+.5}ja=~~qa;if((pa|0)>(la|0)&(ja|0)>(na|0)){ra=la+da|0;la=na+ea|0;na=fa+pa|0;pa=ga+ja|0;if((ra|0)>-1){sa=(ra|0)/(s|0)|0}else{sa=((ra+1|0)/(s|0)|0)-1|0}if((la|0)>-1){ta=(la|0)/(s|0)|0}else{ta=((la+1|0)/(s|0)|0)-1|0}if((na|0)>-1){ua=(na|0)/(s|0)|0}else{ua=((na+1|0)/(s|0)|0)-1|0}if((pa|0)>-1){va=(pa|0)/(s|0)|0}else{va=((pa+1|0)/(s|0)|0)-1|0}if(!((sa|0)>(ua|0)|(ta|0)>(va|0))){pa=sa;while(1){na=ta;while(1){Gk(N,pa,na);if((na|0)<(va|0)){na=na+1|0}else{break}}if((pa|0)<(ua|0)){pa=pa+1|0}else{break}}}pa=ux(ba)|0;if((pa|0)!=0){na=ba;la=pa;do{c[(c[la+8>>2]|0)+212>>2]=na;la=vx(ba,la)|0;}while((la|0)!=0)}wa=c[L>>2]|0}else{wa=ia}if((ha|0)<(c[wa+172>>2]|0)){ha=ha+1|0;ia=wa}else{break}}}ia=ux(P)|0;if((ia|0)!=0){M=+(Q|0);ha=ia;do{Pm(k,ha);K=+h[C>>3];I=+h[m>>3];if(K<0.0){xa=K+-.5}else{xa=K+.5}if(I<0.0){ya=I+-.5}else{ya=I+.5}ia=~~xa+Z|0;ga=~~ya+J|0;fa=ha+8|0;ea=c[fa>>2]|0;do{if((c[ea+212>>2]|0)==0){da=~~(M+(+h[ea+88>>3]+ +h[ea+96>>3])*.5);la=~~(M+ +h[ea+80>>3]*.5);ba=ia-da|0;na=ga-la|0;pa=da+ia|0;da=la+ga|0;if((ba|0)>-1){za=(ba|0)/(s|0)|0}else{za=((ba+1|0)/(s|0)|0)-1|0}if((na|0)>-1){Aa=(na|0)/(s|0)|0}else{Aa=((na+1|0)/(s|0)|0)-1|0}if((pa|0)>-1){Ba=(pa|0)/(s|0)|0}else{Ba=((pa+1|0)/(s|0)|0)-1|0}if((da|0)>-1){Ca=(da|0)/(s|0)|0}else{Ca=((da+1|0)/(s|0)|0)-1|0}if(!((za|0)>(Ba|0)|(Aa|0)>(Ca|0))){da=za;while(1){pa=Aa;while(1){Gk(N,da,pa);if((pa|0)<(Ca|0)){pa=pa+1|0}else{break}}if((da|0)<(Ba|0)){da=da+1|0}else{break}}}if((ia|0)>-1){Da=(ia|0)/(s|0)|0}else{Da=((ia+1|0)/(s|0)|0)-1|0}if((ga|0)>-1){Ea=(ga|0)/(s|0)|0}else{Ea=((ga+1|0)/(s|0)|0)-1|0}da=mw(t,ha)|0;if((da|0)==0){break}else{Fa=da}do{Ev(Fa,Da,Ea,N,Z,J,s,G);Fa=ow(t,Fa)|0;}while((Fa|0)!=0)}else{if((ia|0)>-1){Ga=(ia|0)/(s|0)|0}else{Ga=((ia+1|0)/(s|0)|0)-1|0}if((ga|0)>-1){Ha=(ga|0)/(s|0)|0}else{Ha=((ga+1|0)/(s|0)|0)-1|0}da=mw(t,ha)|0;if((da|0)==0){break}else{Ia=da}do{if((c[(c[fa>>2]|0)+212>>2]|0)!=(c[(c[(c[((c[Ia>>2]&3|0)==2?Ia:Ia-32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0)){Ev(Ia,Ga,Ha,N,Z,J,s,G)}Ia=ow(t,Ia)|0;}while((Ia|0)!=0)}}while(0);ha=vx(P,ha)|0;}while((ha|0)!=0)}ha=ux(P)|0;if((ha|0)!=0){fa=ha;ha=0;while(1){c[(c[fa+8>>2]|0)+112>>2]=c[aa+(ha<<2)>>2];ga=vx(P,fa)|0;if((ga|0)==0){break}else{fa=ga;ha=ha+1|0}}}eF($)}else{ha=ux(P)|0;if((ha|0)==0){break}M=+(Q|0);fa=ha;do{Pm(l,fa);I=+h[x>>3];K=+h[S>>3];if(I<0.0){Ja=I+-.5}else{Ja=I+.5}if(K<0.0){Ka=K+-.5}else{Ka=K+.5}ha=~~Ja+Z|0;aa=~~Ka+J|0;ga=c[fa+8>>2]|0;ia=~~(M+(+h[ga+88>>3]+ +h[ga+96>>3])*.5);ea=~~(M+ +h[ga+80>>3]*.5);ga=ha-ia|0;da=aa-ea|0;pa=ia+ha|0;ia=ea+aa|0;if((ga|0)>-1){La=(ga|0)/(s|0)|0}else{La=((ga+1|0)/(s|0)|0)-1|0}if((da|0)>-1){Ma=(da|0)/(s|0)|0}else{Ma=((da+1|0)/(s|0)|0)-1|0}if((pa|0)>-1){Na=(pa|0)/(s|0)|0}else{Na=((pa+1|0)/(s|0)|0)-1|0}if((ia|0)>-1){Oa=(ia|0)/(s|0)|0}else{Oa=((ia+1|0)/(s|0)|0)-1|0}if(!((La|0)>(Na|0)|(Ma|0)>(Oa|0))){ia=La;while(1){pa=Ma;while(1){Gk(N,ia,pa);if((pa|0)<(Oa|0)){pa=pa+1|0}else{break}}if((ia|0)<(Na|0)){ia=ia+1|0}else{break}}}if((ha|0)>-1){Pa=(ha|0)/(s|0)|0}else{Pa=((ha+1|0)/(s|0)|0)-1|0}if((aa|0)>-1){Qa=(aa|0)/(s|0)|0}else{Qa=((aa+1|0)/(s|0)|0)-1|0}ia=mw(t,fa)|0;if((ia|0)!=0){pa=ia;do{Ev(pa,Pa,Qa,N,Z,J,s,G);pa=ow(t,pa)|0;}while((pa|0)!=0)}fa=vx(P,fa)|0;}while((fa|0)!=0)}}while(0);t=D+(R<<4)+4|0;c[t>>2]=Kk(N)|0;G=D+(R<<4)+8|0;c[G>>2]=Jk(N)|0;J=c[L>>2]|0;M=+(Q<<1|0);Z=~~+ca((M+(+h[J+32>>3]- +h[J+16>>3]))/O);u=~~+ca((M+(+h[J+40>>3]- +h[J+24>>3]))/O);c[q>>2]=u+Z;do{if((d[213992]|0)>>>0>2>>>0){J=$w(P|0)|0;fa=c[G>>2]|0;gc(r|0,126120,(y=i,i=i+32|0,c[y>>2]=J,c[y+8>>2]=fa,c[y+16>>2]=Z,c[y+24>>2]=u,y)|0)|0;i=y;if((c[G>>2]|0)>0){Ra=0}else{break}do{fa=c[t>>2]|0;J=c[fa+(Ra<<3)+4>>2]|0;gc(r|0,123640,(y=i,i=i+16|0,c[y>>2]=c[fa+(Ra<<3)>>2],c[y+8>>2]=J,y)|0)|0;i=y;Ra=Ra+1|0;}while((Ra|0)<(c[G>>2]|0))}}while(0);Ek(N);}R=R+1|0;}while((R|0)<(b|0));R=jk(b<<2)|0;Ra=R;Qa=0;do{c[Ra+(Qa<<2)>>2]=D+(Qa<<4);Qa=Qa+1|0;}while((Qa|0)<(b|0));Jb(R|0,b|0,4,180);Qa=Dk()|0;Pa=jk(b<<3)|0;if(w){w=-W|0;W=-X|0;X=0;while(1){do{if((a[A+X|0]|0)!=0){Na=c[Ra+(X<<2)>>2]|0;Oa=c[Na+12>>2]|0;Ma=c[Na+4>>2]|0;La=c[Na+8>>2]|0;Na=Pa+(Oa<<3)|0;c[Na>>2]=w;S=Pa+(Oa<<3)+4|0;c[S>>2]=W;if((La|0)>0){Oa=Ma;Ma=0;while(1){Fk(Qa,Oa);x=Ma+1|0;if((x|0)<(La|0)){Oa=Oa+8|0;Ma=x}else{break}}}if((d[213992]|0)>>>0<=1>>>0){break}Ma=c[Na>>2]|0;Oa=c[S>>2]|0;gc(r|0,113712,(y=i,i=i+24|0,c[y>>2]=La,c[y+8>>2]=Ma,c[y+16>>2]=Oa,y)|0)|0;i=y}}while(0);N=X+1|0;if((N|0)<(b|0)){X=N}else{Sa=0;break}}do{if((a[A+Sa|0]|0)==0){X=c[Ra+(Sa<<2)>>2]|0;Av(Sa,X,Qa,Pa+(c[X+12>>2]<<3)|0,s,c[v>>2]|0,B)}Sa=Sa+1|0;}while((Sa|0)<(b|0))}else{Sa=0;do{A=c[Ra+(Sa<<2)>>2]|0;Av(Sa,A,Qa,Pa+(c[A+12>>2]<<3)|0,s,c[v>>2]|0,B);Sa=Sa+1|0;}while((Sa|0)<(b|0))}eF(R);R=0;do{eF(c[D+(R<<4)+4>>2]|0);R=R+1|0;}while((R|0)<(b|0));eF(F);Ek(Qa);eF(z);if((d[213992]|0)>>>0>1>>>0){Ta=0}else{n=Pa;i=j;return n|0}while(1){z=c[Pa+(Ta<<3)>>2]|0;Qa=c[Pa+(Ta<<3)+4>>2]|0;gc(r|0,131600,(y=i,i=i+24|0,c[y>>2]=Ta,c[y+8>>2]=z,c[y+16>>2]=Qa,y)|0)|0;i=y;Qa=Ta+1|0;if((Qa|0)<(b|0)){Ta=Qa}else{n=Pa;break}}i=j;return n|0}function nv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0,H=0;f=i;g=jk(b<<3)|0;j=c[e+4>>2]|0;k=e+28|0;l=(j|0)>0;do{if((c[k>>2]&1|0)==0){if(l){m=1;n=(b-1+j|0)/(j|0)|0;p=j;break}else{q=~~+ca(+T(+(b|0)));m=1;n=(b-1+q|0)/(q|0)|0;p=q;break}}else{if(l){m=0;n=j;p=(b-1+j|0)/(j|0)|0;break}else{q=~~+ca(+T(+(b|0)));m=0;n=q;p=(b-1+q|0)/(q|0)|0;break}}}while(0);if((a[213992]|0)!=0){gc(c[o>>2]|0,117712,(j=i,i=i+24|0,c[j>>2]=(m|0)!=0?116800:115864,c[j+8>>2]=n,c[j+16>>2]=p,j)|0)|0;i=j}j=jk((p<<3)+8|0)|0;l=j;q=jk((n<<3)+8|0)|0;r=q;s=jk(b*24|0)|0;t=s;u=(b|0)>0;do{if(u){v=e+8|0;w=t;x=0;while(1){y=+h[d+(x<<5)+8>>3];z=+h[d+(x<<5)+24>>3];h[w>>3]=+h[d+(x<<5)+16>>3]- +h[d+(x<<5)>>3]+ +((c[v>>2]|0)>>>0>>>0);h[w+8>>3]=z-y+ +((c[v>>2]|0)>>>0>>>0);c[w+16>>2]=x;A=x+1|0;if((A|0)<(b|0)){w=w+24|0;x=A}else{break}}x=jk(b<<2)|0;w=x;if(u){B=0}else{C=x;D=w;break}while(1){c[w+(B<<2)>>2]=t+(B*24|0);v=B+1|0;if((v|0)<(b|0)){B=v}else{C=x;D=w;break}}}else{w=jk(b<<2)|0;C=w;D=w}}while(0);B=c[e+24>>2]|0;do{if((B|0)==0){if((c[k>>2]&64|0)!=0){break}Jb(C|0,b|0,4,24)}else{c[43654]=B;Jb(C|0,b|0,4,160)}}while(0);if(u){if((m|0)==0){B=0;e=0;t=0;while(1){w=c[D+(t<<2)>>2]|0;x=l+(B<<3)|0;y=+h[x>>3];z=+h[w>>3];h[x>>3]=y>z?y:z;x=r+(e<<3)|0;z=+h[x>>3];y=+h[w+8>>3];h[x>>3]=z>y?z:y;x=e+1|0;w=(x|0)==(n|0);v=t+1|0;if((v|0)<(b|0)){B=(w&1)+B|0;e=w?0:x;t=v}else{break}}}else{t=0;e=0;B=0;while(1){v=c[D+(B<<2)>>2]|0;x=l+(t<<3)|0;y=+h[x>>3];z=+h[v>>3];h[x>>3]=y>z?y:z;x=r+(e<<3)|0;z=+h[x>>3];y=+h[v+8>>3];h[x>>3]=z>y?z:y;x=t+1|0;v=(x|0)==(p|0);w=B+1|0;if((w|0)<(b|0)){t=v?0:x;e=(v&1)+e|0;B=w}else{break}}}}if((p|0)>=0){y=0.0;B=0;while(1){e=l+(B<<3)|0;z=+h[e>>3];h[e>>3]=y;if((B|0)<(p|0)){y=y+z;B=B+1|0}else{break}}}if((n|0)>0){y=0.0;B=n;while(1){e=B-1|0;z=+h[r+(e<<3)>>3];h[r+(B<<3)>>3]=y;E=y+z;if((e|0)>0){y=E;B=e}else{F=E;break}}}else{F=0.0}h[r>>3]=F;if(!u){eF(s);eF(C);eF(j);eF(q);i=f;return g|0}u=(m|0)==0;m=0;B=0;e=0;while(1){t=c[(c[D+(e<<2)>>2]|0)+16>>2]|0;F=+h[d+(t<<5)>>3];y=+h[d+(t<<5)+8>>3];E=+h[d+(t<<5)+16>>3];z=+h[d+(t<<5)+24>>3];w=c[k>>2]|0;do{if((w&4|0)==0){if((w&8|0)==0){c[g+(t<<3)>>2]=~~((+h[l+(m<<3)>>3]+ +h[l+(m+1<<3)>>3]-E-F)*.5);break}else{c[g+(t<<3)>>2]=~~(+h[l+(m+1<<3)>>3]-(E-F));break}}else{c[g+(t<<3)>>2]=~~+h[l+(m<<3)>>3]}}while(0);w=c[k>>2]|0;do{if((w&16|0)==0){if((w&32|0)==0){c[g+(t<<3)+4>>2]=~~((+h[r+(B<<3)>>3]+ +h[r+(B+1<<3)>>3]-z-y)*.5);break}else{c[g+(t<<3)+4>>2]=~~+h[r+(B+1<<3)>>3];break}}else{c[g+(t<<3)+4>>2]=~~(+h[r+(B<<3)>>3]-(z-y))}}while(0);if(u){t=B+1|0;w=(t|0)==(n|0);G=w?0:t;H=(w&1)+m|0}else{w=m+1|0;t=(w|0)==(p|0);G=(t&1)+B|0;H=t?0:w}w=e+1|0;if((w|0)<(b|0)){m=H;B=G;e=w}else{break}}eF(s);eF(C);eF(j);eF(q);i=f;return g|0}function ov(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;if((b|0)<1){h=0;i=g;return h|0}j=c[f+16>>2]|0;if((j|0)==3){k=f+8|0;l=xv(b,e,c[k>>2]|0)|0;if((a[213992]|0)!=0){gc(c[o>>2]|0,136576,(m=i,i=i+8|0,c[m>>2]=l,m)|0)|0;i=m}if((l|0)<1){h=0;i=g;return h|0}n=jk(b<<4)|0;p=n;q=(b|0)>0;if(q){r=0;do{c[p+(r<<4)+12>>2]=r;yv(e+(r<<5)|0,p+(r<<4)|0,l,c[k>>2]|0,0,0,213416);r=r+1|0;}while((r|0)<(b|0));r=jk(b<<2)|0;s=r;t=0;while(1){c[s+(t<<2)>>2]=p+(t<<4);u=t+1|0;if((u|0)<(b|0)){t=u}else{v=r;w=s;break}}}else{s=jk(b<<2)|0;v=s;w=s}Jb(v|0,b|0,4,180);s=Dk()|0;r=jk(b<<3)|0;if(q){t=0;do{u=c[w+(t<<2)>>2]|0;Av(t,u,s,r+(c[u+12>>2]<<3)|0,l,c[k>>2]|0,e);t=t+1|0;}while((t|0)<(b|0));eF(v);t=0;do{eF(c[p+(t<<4)+4>>2]|0);t=t+1|0;}while((t|0)<(b|0))}else{eF(v)}eF(n);Ek(s);if((d[213992]|0)>>>0<2>>>0|q^1){h=r;i=g;return h|0}q=c[o>>2]|0;s=0;while(1){n=c[r+(s<<3)>>2]|0;v=c[r+(s<<3)+4>>2]|0;gc(q|0,131600,(m=i,i=i+24|0,c[m>>2]=s,c[m+8>>2]=n,c[m+16>>2]=v,m)|0)|0;i=m;v=s+1|0;if((v|0)<(b|0)){s=v}else{h=r;break}}i=g;return h|0}else if((j|0)==4){h=nv(b,e,f)|0;i=g;return h|0}else{h=0;i=g;return h|0}return 0}function pv(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;if((a|0)<1){g=(a|0)>-1?a:-a|0;return g|0}i=(e|0)==0;j=(f|0)==0;f=0;while(1){k=c[b+(f<<2)>>2]|0;l=i?k:e;m=c[d+(f<<3)>>2]|0;n=c[d+(f<<3)+4>>2]|0;o=+(m|0);p=o/72.0;q=+(n|0);r=q/72.0;s=ux(k)|0;if((s|0)!=0){t=s;do{s=t+8|0;u=c[(c[s>>2]|0)+132>>2]|0;h[u>>3]=p+ +h[u>>3];u=(c[(c[s>>2]|0)+132>>2]|0)+8|0;h[u>>3]=r+ +h[u>>3];u=(c[s>>2]|0)+16|0;h[u>>3]=o+ +h[u>>3];u=(c[s>>2]|0)+24|0;h[u>>3]=q+ +h[u>>3];u=c[(c[s>>2]|0)+108>>2]|0;if((u|0)!=0){v=u+56|0;h[v>>3]=o+ +h[v>>3];v=(c[(c[s>>2]|0)+108>>2]|0)+64|0;h[v>>3]=q+ +h[v>>3]}do{if(!j){v=mw(l,t)|0;if((v|0)==0){break}else{w=v}do{v=w+8|0;s=c[v>>2]|0;u=c[s+96>>2]|0;if((u|0)==0){x=s}else{s=u+56|0;h[s>>3]=o+ +h[s>>3];s=(c[(c[v>>2]|0)+96>>2]|0)+64|0;h[s>>3]=q+ +h[s>>3];x=c[v>>2]|0}s=c[x+108>>2]|0;if((s|0)==0){y=x}else{u=s+56|0;h[u>>3]=o+ +h[u>>3];u=(c[(c[v>>2]|0)+108>>2]|0)+64|0;h[u>>3]=q+ +h[u>>3];y=c[v>>2]|0}u=c[y+100>>2]|0;if((u|0)==0){z=y}else{s=u+56|0;h[s>>3]=o+ +h[s>>3];s=(c[(c[v>>2]|0)+100>>2]|0)+64|0;h[s>>3]=q+ +h[s>>3];z=c[v>>2]|0}s=c[z+104>>2]|0;if((s|0)==0){A=z}else{u=s+56|0;h[u>>3]=o+ +h[u>>3];u=(c[(c[v>>2]|0)+104>>2]|0)+64|0;h[u>>3]=q+ +h[u>>3];A=c[v>>2]|0}u=c[A+8>>2]|0;do{if((u|0)!=0){if((c[u+4>>2]|0)>0){B=0;C=u}else{break}do{s=c[C>>2]|0;D=c[s+(B*48|0)>>2]|0;E=c[s+(B*48|0)+4>>2]|0;F=c[s+(B*48|0)+8>>2]|0;G=c[s+(B*48|0)+12>>2]|0;if((E|0)>0){s=0;do{H=D+(s<<4)|0;h[H>>3]=o+ +h[H>>3];H=D+(s<<4)+8|0;h[H>>3]=q+ +h[H>>3];s=s+1|0;}while((s|0)<(E|0))}if((F|0)!=0){E=(c[c[(c[v>>2]|0)+8>>2]>>2]|0)+(B*48|0)+16|0;h[E>>3]=o+ +h[E>>3];E=(c[c[(c[v>>2]|0)+8>>2]>>2]|0)+(B*48|0)+24|0;h[E>>3]=q+ +h[E>>3]}if((G|0)!=0){E=(c[c[(c[v>>2]|0)+8>>2]>>2]|0)+(B*48|0)+32|0;h[E>>3]=o+ +h[E>>3];E=(c[c[(c[v>>2]|0)+8>>2]>>2]|0)+(B*48|0)+40|0;h[E>>3]=q+ +h[E>>3]}B=B+1|0;C=c[(c[v>>2]|0)+8>>2]|0;}while((B|0)<(c[C+4>>2]|0))}}while(0);w=ow(l,w)|0;}while((w|0)!=0)}}while(0);t=vx(k,t)|0;}while((t|0)!=0)}qv(k,m,n);t=f+1|0;if((t|0)<(a|0)){f=t}else{g=0;break}}return g|0}function qv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0;e=a+8|0;a=c[e>>2]|0;f=a+16|0;g=a+24|0;i=a+32|0;j=a+40|0;k=+(b|0);l=k+ +h[i>>3];m=+(d|0);n=m+ +h[g>>3];o=m+ +h[j>>3];h[f>>3]=k+ +h[f>>3];h[g>>3]=n;h[i>>3]=l;h[j>>3]=o;j=c[e>>2]|0;i=c[j+12>>2]|0;if((i|0)==0){p=j}else{j=i+56|0;h[j>>3]=k+ +h[j>>3];j=(c[(c[e>>2]|0)+12>>2]|0)+64|0;h[j>>3]=m+ +h[j>>3];p=c[e>>2]|0}if((c[p+172>>2]|0)<1){return}else{q=1;r=p}while(1){qv(c[(c[r+176>>2]|0)+(q<<2)>>2]|0,b,d);p=c[e>>2]|0;if((q|0)<(c[p+172>>2]|0)){q=q+1|0;r=p}else{break}}return}function rv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=mv(a,b,d,e)|0;if((f|0)==0){g=1;return g|0}h=pv(a,b,f,d,c[e+12>>2]|0)|0;eF(f);g=h;return g|0}function sv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0;f=mv(a,b,d,e)|0;if((f|0)==0){g=1;return g|0}i=pv(a,b,f,d,c[e+12>>2]|0)|0;eF(f);if((i|0)!=0){g=i;return g|0}$m(d);i=c[d+8>>2]|0;d=i+16|0;j=+h[d>>3];f=i+24|0;k=+h[f>>3];e=i+32|0;l=+h[e>>3];m=i+40|0;n=+h[m>>3];if((a|0)>0){o=n;p=l;q=k;r=j;i=0;while(1){s=c[(c[b+(i<<2)>>2]|0)+8>>2]|0;t=c[s+172>>2]|0;if((t|0)<1){u=o;v=p;w=q;x=r}else{y=c[s+176>>2]|0;s=1;z=o;A=p;B=q;C=r;while(1){D=c[(c[y+(s<<2)>>2]|0)+8>>2]|0;E=+h[D+16>>3];F=C<E?C:E;E=+h[D+24>>3];G=B<E?B:E;E=+h[D+32>>3];H=A>E?A:E;E=+h[D+40>>3];I=z>E?z:E;if((s|0)<(t|0)){s=s+1|0;z=I;A=H;B=G;C=F}else{u=I;v=H;w=G;x=F;break}}}s=i+1|0;if((s|0)<(a|0)){o=u;p=v;q=w;r=x;i=s}else{J=u;K=v;L=w;M=x;break}}}else{J=n;K=l;L=k;M=j}h[d>>3]=M;h[f>>3]=L;h[e>>3]=K;h[m>>3]=J;g=0;return g|0}function tv(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g|0;if((f|0)==0){cc(120888,112128,1400,170552);return 0}j=b|0;b=ew(j,145176)|0;if((b|0)==0){k=e}else{l=ac(b|0,148336,(m=i,i=i+8|0,c[m>>2]=h,m)|0)|0;i=m;b=c[h>>2]|0;k=(l|0)==1&(b|0)>-1?b:e}c[f+8>>2]=k;if((a[213992]|0)!=0){gc(c[o>>2]|0,142208,(m=i,i=i+8|0,c[m>>2]=k,m)|0)|0;i=m}c[f+12>>2]=0;c[f+20>>2]=0;uv(ew(j,146488)|0,d,f)|0;i=g;return c[f+16>>2]|0}function uv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;f=i;i=i+16|0;j=f|0;k=f+8|0;if((e|0)==0){cc(120888,112128,1292,170128);return 0}l=e+28|0;c[l>>2]=0;m=e+16|0;c[m>>2]=d;d=e+4|0;c[d>>2]=0;c[e+24>>2]=0;do{if((b|0)!=0){n=a[b]|0;if(n<<24>>24==0){break}p=n<<24>>24;if((p|0)==97){if((Za(b|0,105176,5)|0)!=0){if((Za(b|0,102536,6)|0)!=0){break}c[m>>2]=5;q=ac(b+5|0,96840,(r=i,i=i+8|0,c[r>>2]=j,r)|0)|0;i=r;s=+g[j>>2];t=e|0;if((q|0)>0&s>0.0){g[t>>2]=s;break}else{g[t>>2]=1.0;break}}c[m>>2]=4;t=b+5|0;a:do{if((a[t]|0)==95){q=b+6|0;u=a[q]|0;if(u<<24>>24==0){v=q;break}else{w=q;x=u;y=0}while(1){switch(x<<24>>24|0){case 116:{u=y|16;c[l>>2]=u;z=u;break};case 108:{u=y|4;c[l>>2]=u;z=u;break};case 98:{u=y|32;c[l>>2]=u;z=u;break};case 105:{u=y|64;c[l>>2]=u;z=u;break};case 114:{u=y|8;c[l>>2]=u;z=u;break};case 99:{u=y|1;c[l>>2]=u;z=u;break};case 117:{u=y|2;c[l>>2]=u;z=u;break};default:{v=w;break a}}u=w+1|0;q=a[u]|0;if(q<<24>>24==0){v=u;break a}else{w=u;x=q;y=z}}}else{v=t}}while(0);t=ac(v|0,148336,(r=i,i=i+8|0,c[r>>2]=k,r)|0)|0;i=r;q=c[k>>2]|0;if(!((t|0)>0&(q|0)>0)){break}c[d>>2]=q;break}else if((p|0)==103){if(n<<24>>24!=103){break}if((Ya(b|0,86216)|0)!=0){break}c[m>>2]=3;break}else if((p|0)==110){if(n<<24>>24!=110){break}if((Ya(b|0,81480)|0)!=0){break}c[m>>2]=2;break}else if((p|0)==99){if(n<<24>>24!=99){break}if((Ya(b|0,91456)|0)!=0){break}c[m>>2]=1;break}else{break}}}while(0);if((a[213992]|0)==0){A=c[m>>2]|0;i=f;return A|0}b=c[o>>2]|0;Ma(167760,11,1,b|0)|0;switch(c[m>>2]|0){case 2:{B=81480;break};case 3:{B=86216;break};case 4:{B=105176;break};case 5:{B=102536;break};case 1:{B=91456;break};default:{B=139120}}gc(b|0,163592,(r=i,i=i+8|0,c[r>>2]=B,r)|0)|0;i=r;if((c[m>>2]|0)==5){gc(b|0,159504,(r=i,i=i+8|0,h[r>>3]=+g[e>>2],r)|0)|0;i=r}gc(b|0,154488,(r=i,i=i+8|0,c[r>>2]=c[d>>2],r)|0)|0;i=r;gc(b|0,151272,(r=i,i=i+8|0,c[r>>2]=c[l>>2],r)|0)|0;i=r;A=c[m>>2]|0;i=f;return A|0}function vv(a,b,c){a=a|0;b=b|0;c=c|0;return uv(ew(a|0,146488)|0,b,c)|0}function wv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f|0;h=ew(b|0,145176)|0;do{if((h|0)==0){j=d}else{b=ac(h|0,148336,(k=i,i=i+8|0,c[k>>2]=g,k)|0)|0;i=k;k=c[g>>2]|0;if((b|0)==1&(k|0)>-1){j=k;break}k=a[h]|0;if(!((k<<24>>24|0)==116|(k<<24>>24|0)==84)){j=d;break}j=e}}while(0);i=f;return j|0}function xv(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0,v=0;f=i;g=+((a*100|0)-1|0);if((a|0)>0){j=+(e<<1|0);e=0;k=0.0;l=0.0;while(1){m=j+(+h[b+(e<<5)+16>>3]- +h[b+(e<<5)>>3]);n=j+(+h[b+(e<<5)+24>>3]- +h[b+(e<<5)+8>>3]);p=l-(m+n);q=k-m*n;r=e+1|0;if((r|0)<(a|0)){e=r;k=q;l=p}else{s=q;t=p;break}}}else{s=0.0;t=0.0}l=t*t-g*4.0*s;if(l<0.0){Fv(1,121760,(u=i,i=i+8|0,h[u>>3]=l,u)|0)|0;i=u;v=-1;i=f;return v|0}k=+T(l);j=g*2.0;p=(k-t)/j;q=(-0.0-t-k)/j;e=~~p;a=(e|0)==0?1:e;if((d[213992]|0)>>>0<=2>>>0){v=a;i=f;return v|0}e=c[o>>2]|0;Ma(121216,27,1,e|0)|0;gc(e|0,120144,(u=i,i=i+40|0,h[u>>3]=g,h[u+8>>3]=t,h[u+16>>3]=s,h[u+24>>3]=l,h[u+32>>3]=k,u)|0)|0;i=u;gc(e|0,119328,(u=i,i=i+32|0,c[u>>2]=a,h[u+8>>3]=p,c[u+16>>2]=~~q,h[u+24>>3]=q,u)|0)|0;i=u;gc(e|0,118664,(u=i,i=i+16|0,h[u>>3]=s+(t*p+p*g*p),h[u+8>>3]=s+(t*q+q*g*q),u)|0)|0;i=u;v=a;i=f;return v|0}function yv(a,b,e,f,g,j,k){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;l=i;m=a;a=i;i=i+32|0;tF(a,m,32)|0;n=+h[a>>3];if(n<0.0){p=n+-.5}else{p=n+.5}q=+h[a+8>>3];if(q<0.0){r=q+-.5}else{r=q+.5}s=+h[a+16>>3];if(s<0.0){t=s+-.5}else{t=s+.5}u=+h[a+24>>3];if(u<0.0){v=u+-.5}else{v=u+.5}a=Dk()|0;m=g-f|0;w=j-f|0;x=g+f-~~p+~~t|0;g=j+f-~~r+~~v|0;if((m|0)>-1){y=(m|0)/(e|0)|0}else{y=((m+1|0)/(e|0)|0)-1|0}if((w|0)>-1){z=(w|0)/(e|0)|0}else{z=((w+1|0)/(e|0)|0)-1|0}if((x|0)>-1){A=(x|0)/(e|0)|0}else{A=((x+1|0)/(e|0)|0)-1|0}if((g|0)>-1){B=(g|0)/(e|0)|0}else{B=((g+1|0)/(e|0)|0)-1|0}if(!((y|0)>(A|0)|(z|0)>(B|0))){g=y;while(1){y=z;while(1){Gk(a,g,y);if((y|0)<(B|0)){y=y+1|0}else{break}}if((g|0)<(A|0)){g=g+1|0}else{break}}}g=b+4|0;c[g>>2]=Kk(a)|0;A=Jk(a)|0;B=b+8|0;c[B>>2]=A;v=+(f<<1|0);r=+(e|0);e=~~+ca((v+(s-n))/r);f=~~+ca((v+(u-q))/r);c[b>>2]=f+e;if((d[213992]|0)>>>0<=2>>>0){Ek(a);i=l;return}b=c[o>>2]|0;gc(b|0,126120,(z=i,i=i+32|0,c[z>>2]=k,c[z+8>>2]=A,c[z+16>>2]=e,c[z+24>>2]=f,z)|0)|0;i=z;if((c[B>>2]|0)>0){C=0}else{Ek(a);i=l;return}do{f=c[g>>2]|0;e=c[f+(C<<3)+4>>2]|0;gc(b|0,123640,(z=i,i=i+16|0,c[z>>2]=c[f+(C<<3)>>2],c[z+8>>2]=e,z)|0)|0;i=z;C=C+1|0;}while((C|0)<(c[B>>2]|0));Ek(a);i=l;return}function zv(a,b){a=a|0;b=b|0;return(c[c[b>>2]>>2]|0)-(c[c[a>>2]>>2]|0)|0}function Av(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;j=c[b+12>>2]|0;k=+h[i+(j<<5)>>3];l=+h[i+(j<<5)+8>>3];m=+h[i+(j<<5)+16>>3];n=+h[i+(j<<5)+24>>3];do{if((a|0)==0){o=+(g<<1|0);p=+(f|0);if((Bv((~~+ca((o+(m-k))/p)|0)/-2|0,(~~+ca((o+(n-l))/p)|0)/-2|0,b,d,e,f,i)|0)==0){break}return}}while(0);if((Bv(0,0,b,d,e,f,i)|0)!=0){return}if((~~+ca(m-k)|0)<(~~+ca(n-l)|0)){g=1;a:while(1){a=-g|0;if((g|0)>0){j=0;while(1){q=j-1|0;if((Bv(a,j,b,d,e,f,i)|0)!=0){r=37;break a}if((q|0)>(a|0)){j=q}else{s=q;break}}}else{s=0}if((g|0)>(a|0)){j=a;while(1){q=j+1|0;if((Bv(j,s,b,d,e,f,i)|0)!=0){r=37;break a}if((q|0)<(g|0)){j=q}else{t=q;break}}}else{t=a}if((s|0)<(g|0)){j=s;while(1){q=j+1|0;if((Bv(t,j,b,d,e,f,i)|0)!=0){r=37;break a}if((q|0)<(g|0)){j=q}else{u=q;break}}}else{u=s}if((t|0)>(a|0)){j=t;while(1){q=j-1|0;if((Bv(j,u,b,d,e,f,i)|0)!=0){r=37;break a}if((q|0)>(a|0)){j=q}else{v=q;break}}}else{v=t}if((u|0)>0){j=u;while(1){a=j-1|0;if((Bv(v,j,b,d,e,f,i)|0)!=0){r=37;break a}if((a|0)>0){j=a}else{break}}}g=g+1|0}if((r|0)==37){return}}else{g=1;b:while(1){v=-g|0;if((g|0)>0){u=0;while(1){t=u+1|0;if((Bv(u,v,b,d,e,f,i)|0)!=0){r=37;break b}if((t|0)<(g|0)){u=t}else{w=t;break}}}else{w=0}if((g|0)>(v|0)){u=v;while(1){t=u+1|0;if((Bv(w,u,b,d,e,f,i)|0)!=0){r=37;break b}if((t|0)<(g|0)){u=t}else{x=t;break}}}else{x=v}if((w|0)>(v|0)){u=w;while(1){t=u-1|0;if((Bv(u,x,b,d,e,f,i)|0)!=0){r=37;break b}if((t|0)>(v|0)){u=t}else{y=t;break}}}else{y=w}if((x|0)>(v|0)){u=x;while(1){t=u-1|0;if((Bv(y,u,b,d,e,f,i)|0)!=0){r=37;break b}if((t|0)>(v|0)){u=t}else{z=t;break}}}else{z=x}if((y|0)<0){u=y;while(1){v=u+1|0;if((Bv(u,z,b,d,e,f,i)|0)!=0){r=37;break b}if((v|0)<0){u=v}else{break}}}g=g+1|0}if((r|0)==37){return}}}function Bv(a,b,e,f,g,j,k){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0;l=i;i=i+8|0;m=l|0;n=m;p=e+4|0;q=c[e+8>>2]|0;r=(q|0)>0;a:do{if(r){s=m;t=n+4|0;u=0;v=c[p>>2]|0;while(1){w=v;x=c[w>>2]|0;y=c[w+4>>2]|0;c[m>>2]=x;c[m+4>>2]=y;c[s>>2]=x+a;c[t>>2]=y+b;if((Hk(f,n)|0)!=0){z=0;break}y=u+1|0;if((y|0)<(q|0)){u=y;v=v+8|0}else{break a}}i=l;return z|0}}while(0);v=c[e+12>>2]|0;A=+h[k+(v<<5)>>3];if(A<0.0){B=A+-.5}else{B=A+.5}A=+h[k+(v<<5)+8>>3];if(A<0.0){C=A+-.5}else{C=A+.5}v=g|0;c[v>>2]=(da(j,a)|0)-~~B;k=g+4|0;c[k>>2]=(da(j,b)|0)-~~C;if(r){r=m;j=n+4|0;g=0;e=c[p>>2]|0;while(1){p=e;u=c[p>>2]|0;t=c[p+4>>2]|0;c[m>>2]=u;c[m+4>>2]=t;c[r>>2]=u+a;c[j>>2]=t+b;Fk(f,n);t=g+1|0;if((t|0)<(q|0)){g=t;e=e+8|0}else{break}}}if((d[213992]|0)>>>0<=1>>>0){z=1;i=l;return z|0}e=c[v>>2]|0;v=c[k>>2]|0;gc(c[o>>2]|0,129304,(k=i,i=i+40|0,c[k>>2]=q,c[k+8>>2]=a,c[k+16>>2]=b,c[k+24>>2]=e,c[k+32>>2]=v,k)|0)|0;i=k;z=1;i=l;return z|0}function Cv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[43654]|0;e=c[d+(c[(c[a>>2]|0)+16>>2]<<2)>>2]|0;a=c[d+(c[(c[b>>2]|0)+16>>2]<<2)>>2]|0;if((e|0)>(a|0)){f=1;return f|0}f=((e|0)<(a|0))<<31>>31;return f|0}function Dv(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0;d=c[a>>2]|0;a=c[b>>2]|0;e=+h[d+8>>3]+ +h[d>>3];f=+h[a+8>>3]+ +h[a>>3];if(e<f){g=1;return g|0}g=(e>f)<<31>>31;return g|0}function Ev(a,b,d,e,f,g,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0;l=i;i=i+64|0;m=l|0;n=l+32|0;o=l+48|0;p=n|0;h[p>>3]=+(b|0);b=n+8|0;h[b>>3]=+(d|0);do{if((k|0)!=0){d=a+8|0;q=c[(c[d>>2]|0)+8>>2]|0;if((q|0)==0){break}if((c[q+4>>2]|0)<=0){i=l;return}r=m;s=n;t=o;u=+(f|0);v=+(g|0);w=+(j|0);x=o|0;y=o+8|0;z=m+16|0;A=0;B=q;do{q=c[B>>2]|0;C=c[q+(A*48|0)>>2]|0;D=c[q+(A*48|0)+4>>2]|0;E=c[q+(A*48|0)+8>>2]|0;F=c[q+(A*48|0)+12>>2]|0;G=q+(A*48|0)+16|0;c[r>>2]=c[G>>2];c[r+4>>2]=c[G+4>>2];c[r+8>>2]=c[G+8>>2];c[r+12>>2]=c[G+12>>2];c[r+16>>2]=c[G+16>>2];c[r+20>>2]=c[G+20>>2];c[r+24>>2]=c[G+24>>2];c[r+28>>2]=c[G+28>>2];if((E|0)==0){E=C;c[s>>2]=c[E>>2];c[s+4>>2]=c[E+4>>2];c[s+8>>2]=c[E+8>>2];c[s+12>>2]=c[E+12>>2];E=C+16|0;c[t>>2]=c[E>>2];c[t+4>>2]=c[E+4>>2];c[t+8>>2]=c[E+8>>2];c[t+12>>2]=c[E+12>>2];H=2}else{c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];E=C;c[t>>2]=c[E>>2];c[t+4>>2]=c[E+4>>2];c[t+8>>2]=c[E+8>>2];c[t+12>>2]=c[E+12>>2];H=1}I=u+ +h[p>>3];h[p>>3]=I;J=v+ +h[b>>3];h[b>>3]=J;if(I<0.0){K=(I+1.0)/w+-1.0}else{K=I/w}h[p>>3]=K;if(J<0.0){L=(J+1.0)/w+-1.0}else{L=J/w}h[b>>3]=L;J=u+ +h[x>>3];h[x>>3]=J;I=v+ +h[y>>3];h[y>>3]=I;if(J<0.0){M=(J+1.0)/w+-1.0}else{M=J/w}h[x>>3]=M;if(I<0.0){N=(I+1.0)/w+-1.0}else{N=I/w}h[y>>3]=N;lv(n,o,e);if((H|0)<(D|0)){E=H;do{c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];G=C+(E<<4)|0;c[t>>2]=c[G>>2];c[t+4>>2]=c[G+4>>2];c[t+8>>2]=c[G+8>>2];c[t+12>>2]=c[G+12>>2];I=u+ +h[x>>3];h[x>>3]=I;J=v+ +h[y>>3];h[y>>3]=J;if(I<0.0){O=(I+1.0)/w+-1.0}else{O=I/w}h[x>>3]=O;if(J<0.0){P=(J+1.0)/w+-1.0}else{P=J/w}h[y>>3]=P;lv(n,o,e);E=E+1|0;}while((E|0)<(D|0))}if((F|0)!=0){c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[t>>2]=c[z>>2];c[t+4>>2]=c[z+4>>2];c[t+8>>2]=c[z+8>>2];c[t+12>>2]=c[z+12>>2];J=u+ +h[x>>3];h[x>>3]=J;I=v+ +h[y>>3];h[y>>3]=I;if(J<0.0){Q=(J+1.0)/w+-1.0}else{Q=J/w}h[x>>3]=Q;if(I<0.0){R=(I+1.0)/w+-1.0}else{R=I/w}h[y>>3]=R;lv(n,o,e)}A=A+1|0;B=c[(c[d>>2]|0)+8>>2]|0;}while((A|0)<(c[B+4>>2]|0));i=l;return}}while(0);Pm(o,c[((c[a>>2]&3|0)==2?a:a-32|0)+28>>2]|0);a=o|0;R=+(f|0)+ +h[a>>3];h[a>>3]=R;f=o+8|0;Q=+(g|0)+ +h[f>>3];h[f>>3]=Q;if(R<0.0){S=(R+1.0)/+(j|0)+-1.0}else{S=R/+(j|0)}h[a>>3]=S;if(Q<0.0){T=(Q+1.0)/+(j|0)+-1.0}else{T=Q/+(j|0)}h[f>>3]=T;lv(n,o,e);i=l;return}function Fv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e|0;g=f;c[g>>2]=d;c[g+4>>2]=0;g=Gv(a,b,f|0)|0;i=e;return g|0}function Gv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=(a|0)==3;if(f){g=c[53280]|0}else{g=(a|0)==2?1:a}c[53280]=g;h=c[53250]|0;c[53250]=h>>>0>g>>>0?h:g;if(g>>>0<(c[53282]|0)>>>0){g=c[53278]|0;do{if((g|0)==0){h=_a()|0;c[53278]=h;if((h|0)==0){j=1}else{k=h;break}i=e;return j|0}else{k=g}}while(0);if(f){l=k}else{c[53252]=lb(k|0)|0;l=c[53278]|0}Sb(l|0,b|0,d|0)|0;j=0;i=e;return j|0}l=c[43652]|0;if((l|0)==0){k=c[o>>2]|0;if(!f){gc(k|0,118168,(g=i,i=i+8|0,c[g>>2]=(a|0)==1?156768:127176,g)|0)|0;i=g}Sb(k|0,b|0,d|0)|0;j=0;i=e;return j|0}do{if((c[43650]|0)==0){k=dF(c[242]|0)|0;c[43650]=k;if((k|0)!=0){break}Ma(115128,35,1,c[o>>2]|0)|0;j=0;i=e;return j|0}}while(0);if(!f){Ec[l&63]((a|0)==1?156768:127176)|0;Ec[c[43652]&63](108144)|0}while(1){a=$b(c[43650]|0,c[242]|0,b|0,d|0)|0;l=c[242]|0;if((a|0)>-1&(a|0)<(l|0)){m=12;break}f=l<<1;l=a+1|0;a=(f|0)>(l|0)?f:l;c[242]=a;if((gF(c[43650]|0,a)|0)==0){m=14;break}}if((m|0)==12){Ec[c[43652]&63](c[43650]|0)|0;j=0;i=e;return j|0}else if((m|0)==14){Ma(115128,35,1,c[o>>2]|0)|0;j=0;i=e;return j|0}return 0}function Hv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d|0;f=e;c[f>>2]=b;c[f+4>>2]=0;Gv(1,a,e|0)|0;i=d;return}function Iv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if((e|0)==0){f=(d|0)==0?1024:d;c[b+12>>2]=1;g=dF(f)|0;c[b>>2]=g;h=f;i=g}else{c[b>>2]=e;c[b+12>>2]=0;h=d;i=e}c[b+8>>2]=i+h;c[b+4>>2]=i;a[i]=0;return}function Jv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a+8|0;e=a|0;f=c[e>>2]|0;g=f;h=(c[d>>2]|0)-g|0;i=h<<1;j=h+b|0;b=(j|0)>(i|0)?j:i;i=a+4|0;j=(c[i>>2]|0)-g|0;g=a+12|0;if((c[g>>2]|0)==0){a=dF(b)|0;tF(a|0,f|0,j)|0;c[g>>2]=1;k=a}else{k=gF(f,b)|0}c[e>>2]=k;c[i>>2]=k+j;c[d>>2]=k+b;return 0}function Kv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=a+4|0;f=c[e>>2]|0;g=a+8|0;h=c[g>>2]|0;if((f+d|0)>>>0<=h>>>0){i=f;tF(i|0,b|0,d)|0;j=c[e>>2]|0;k=j+d|0;c[e>>2]=k;return d|0}l=a|0;m=c[l>>2]|0;n=m;o=h-n|0;h=o<<1;p=o+d|0;o=(p|0)>(h|0)?p:h;h=f-n|0;n=a+12|0;if((c[n>>2]|0)==0){a=dF(o)|0;tF(a|0,m|0,h)|0;c[n>>2]=1;q=a}else{q=gF(m,o)|0}c[l>>2]=q;l=q+h|0;c[e>>2]=l;c[g>>2]=q+o;i=l;tF(i|0,b|0,d)|0;j=c[e>>2]|0;k=j+d|0;c[e>>2]=k;return d|0}function Lv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=xF(b|0)|0;e=a+4|0;f=c[e>>2]|0;g=a+8|0;h=c[g>>2]|0;if((f+d|0)>>>0<=h>>>0){i=f;tF(i|0,b|0,d)|0;j=c[e>>2]|0;k=j+d|0;c[e>>2]=k;return d|0}l=a|0;m=c[l>>2]|0;n=m;o=h-n|0;h=o<<1;p=o+d|0;o=(p|0)>(h|0)?p:h;h=f-n|0;n=a+12|0;if((c[n>>2]|0)==0){a=dF(o)|0;tF(a|0,m|0,h)|0;c[n>>2]=1;q=a}else{q=gF(m,o)|0}c[l>>2]=q;l=q+h|0;c[e>>2]=l;c[g>>2]=q+o;i=l;tF(i|0,b|0,d)|0;j=c[e>>2]|0;k=j+d|0;c[e>>2]=k;return d|0}function Mv(a){a=a|0;if((c[a+12>>2]|0)==0){return}eF(c[a>>2]|0);return}function Nv(a){a=a|0;var b=0,e=0,f=0;b=a+4|0;e=c[b>>2]|0;if(e>>>0<=(c[a>>2]|0)>>>0){f=-1;return f|0}c[b>>2]=e-1;f=d[e]|0;return f|0}function Ov(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;h=c[b>>2]&3;if((h|0)==0){j=2}else if((h|0)==2|(h|0)==3){j=8}else if((h|0)==1){j=122}else{Fv(1,102488,(k=i,i=i+8|0,c[k>>2]=h,k)|0)|0;i=k;l=-1;i=g;return l|0}k=Oc[j&255](a,b)|0;if((k|0)==0){l=-1;i=g;return l|0}Sv(a,k,d,e,j,f);l=0;i=g;return l|0}function Pv(a,b){a=a|0;b=b|0;return a|0}function Qv(a,b){a=a|0;b=b|0;var c=0;if((Hx(b|0)|0)==(a|0)){c=b;return c|0}c=zx(a,b,0)|0;return c|0}function Rv(a,b){a=a|0;b=b|0;var c=0;if((Hx(b|0)|0)==(a|0)){c=b;return c|0}c=xw(a,b,0)|0;return c|0}function Sv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=(f|0)!=0;if(g){Tc[c&127](a,b,d)}h=sy(a)|0;if((h|0)!=0){i=h;do{h=Oc[e&255](i,b)|0;if((h|0)!=0){Sv(i,h,c,d,e,f)}i=ty(i)|0;}while((i|0)!=0)}if(g){return}Tc[c&127](a,b,d);return}function Tv(a,b,d){a=a|0;b=b|0;d=d|0;fy(c[53854]|0,c[b+8>>2]|0)|0;fy(c[53854]|0,c[b+12>>2]|0)|0;tx(c[53854]|0,b);return}function Uv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a|0;e=Vx(d,173376,0)|0;if((e|0)!=0|(b|0)==0){f=e;g=f;return g|0}e=Ix(d)|0;Ov(e,e|0,64,0,1)|0;b=ux(e)|0;if((b|0)!=0){h=b;do{b=h|0;i=Vx(b,c[43580]|0,0)|0;if((i|0)==0){j=5}else{if((c[i+8>>2]|0)==0){j=5}}if((j|0)==5){j=0;Zv(a,b)}b=mw(e,h)|0;if((b|0)!=0){i=b;do{b=i|0;k=Vx(b,c[43580]|0,0)|0;if((k|0)==0){j=9}else{if((c[k+8>>2]|0)==0){j=9}}if((j|0)==9){j=0;Zv(a,b)}i=ow(e,i)|0;}while((i|0)!=0)}h=vx(e,h)|0;}while((h|0)!=0)}f=Vx(d,173376,0)|0;g=f;return g|0}function Vv(a){a=a|0;return Vx(a,c[43580]|0,0)|0}function Wv(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=i;i=i+72|0;h=g|0;j=g+24|0;k=g+48|0;do{if((b|0)==0){l=c[53550]|0;if((l|0)!=0){m=l;break}l=Hw(0,172632,0)|0;c[53550]=l;m=l}else{m=b}}while(0);b=m|0;if((f|0)==0){l=Vx(b,173376,0)|0;if((l|0)==0){n=0;i=g;return n|0}if((d|0)==0){o=c[l+16>>2]|0}else if((d|0)==1){o=c[l+8>>2]|0}else if((d|0)==3|(d|0)==2){o=c[l+12>>2]|0}else{Fv(1,96792,(p=i,i=i+8|0,c[p>>2]=d,p)|0)|0;i=p;n=0;i=g;return n|0}if((o|0)==0){n=0;i=g;return n|0}c[h+8>>2]=e;n=Hc[c[o>>2]&63](o,h,4)|0;i=g;return n|0}h=Ix(b)|0;Uv(m,1)|0;o=Vx(b,173376,0)|0;do{if((o|0)==0){q=0}else{if((d|0)==0){q=c[o+16>>2]|0;break}else if((d|0)==3|(d|0)==2){q=c[o+12>>2]|0;break}else if((d|0)==1){q=c[o+8>>2]|0;break}else{Fv(1,96792,(p=i,i=i+8|0,c[p>>2]=d,p)|0)|0;i=p;q=0;break}}}while(0);o=fh(q,0)|0;c[k+8>>2]=e;l=q|0;r=Hc[c[l>>2]&63](q,k,4)|0;fh(q,o)|0;do{if((r|0)==0){c[j+8>>2]=e;o=Hc[c[l>>2]&63](q,j,4)|0;if((o|0)!=0){k=c[o+16>>2]|0;o=sx(m,24)|0;a[o+20|0]=d;c[o+8>>2]=dy(m,e)|0;c[o+12>>2]=dy(m,f)|0;c[o+16>>2]=k;Hc[c[l>>2]&63](q,o,1)|0;s=o;t=37;break}o=Vx(h|0,173376,0)|0;do{if((o|0)==0){u=0}else{if((d|0)==0){u=c[o+16>>2]|0;break}else if((d|0)==1){u=c[o+8>>2]|0;break}else if((d|0)==3|(d|0)==2){u=c[o+12>>2]|0;break}else{Fv(1,96792,(p=i,i=i+8|0,c[p>>2]=d,p)|0)|0;i=p;u=0;break}}}while(0);o=bh(u)|0;k=sx(m,24)|0;v=k;a[k+20|0]=d;c[k+8>>2]=dy(m,e)|0;w=k+12|0;c[w>>2]=dy(m,f)|0;x=k+16|0;c[x>>2]=o;Hc[c[u>>2]&63](u,k,1)|0;if((d|0)==0){Ov(h,h|0,76,k,1)|0;s=v;t=37;break}else if((d|0)==3|(d|0)==2){k=ux(h)|0;if((k|0)==0){s=v;t=37;break}o=m+52|0;y=k;while(1){k=mw(h,y)|0;if((k|0)!=0){z=k;do{k=Vx(z|0,c[43580]|0,0)|0;A=c[x>>2]|0;if((A|0)>3){B=c[o>>2]|0;C=k+12|0;D=A<<2;c[C>>2]=Sc[c[(c[B>>2]|0)+8>>2]&127](c[B+12>>2]|0,c[C>>2]|0,D,D+4|0)|0;E=C}else{E=k+12|0}k=dy(m,c[w>>2]|0)|0;c[(c[E>>2]|0)+(c[x>>2]<<2)>>2]=k;z=ow(h,z)|0;}while((z|0)!=0)}z=vx(h,y)|0;if((z|0)==0){s=v;t=37;break}else{y=z}}}else if((d|0)==1){y=ux(h)|0;if((y|0)==0){F=v;break}o=m+52|0;z=y;while(1){y=Vx(z|0,c[43580]|0,0)|0;k=c[x>>2]|0;if((k|0)>3){C=c[o>>2]|0;D=y+12|0;B=k<<2;c[D>>2]=Sc[c[(c[C>>2]|0)+8>>2]&127](c[C+12>>2]|0,c[D>>2]|0,B,B+4|0)|0;G=D}else{G=y+12|0}y=dy(m,c[w>>2]|0)|0;c[(c[G>>2]|0)+(c[x>>2]<<2)>>2]=y;y=vx(h,z)|0;if((y|0)==0){s=v;t=37;break}else{z=y}}}else{F=v;break}}else{z=r+12|0;fy(m,c[z>>2]|0)|0;c[z>>2]=dy(m,f)|0;s=r;t=37}}while(0);do{if((t|0)==37){if(!((s|0)!=0&(d|0)==0)){F=s;break}hw(b,s,f)|0;F=s}}while(0);Lx(m,b,F);n=F;i=g;return n|0}function Xv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=Vx(a|0,173376,0)|0;if((f|0)==0){g=0;i=e;return g|0}if((b|0)==0){h=c[f+16>>2]|0}else if((b|0)==3|(b|0)==2){h=c[f+12>>2]|0}else if((b|0)==1){h=c[f+8>>2]|0}else{Fv(1,96792,(f=i,i=i+8|0,c[f>>2]=b,f)|0)|0;i=f;g=0;i=e;return g|0}if((h|0)==0){g=0;i=e;return g|0}f=c[h>>2]|0;if((d|0)==0){g=Hc[f&63](h,0,128)|0;i=e;return g|0}else{g=Hc[f&63](h,d,8)|0;i=e;return g|0}return 0}function Yv(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=b+12|0;a[d]=a[d]|64;d=b|0;e=Wx(d,173376,20,0)|0;f=e+8|0;c[f>>2]=yy(b,174328,c[43326]|0)|0;g=e+12|0;c[g>>2]=yy(b,174328,c[43326]|0)|0;h=e+16|0;c[h>>2]=yy(b,174328,c[43326]|0)|0;e=uy(b)|0;if((e|0)!=0){i=Vx(e|0,173376,0)|0;fh(c[f>>2]|0,c[i+8>>2]|0)|0;fh(c[g>>2]|0,c[i+12>>2]|0)|0;fh(c[h>>2]|0,c[i+16>>2]|0)|0;j=uy(b)|0;k=(j|0)==0;l=k?b:j;Zv(l,d);return}i=c[53550]|0;if((i|0)==0|(i|0)==(b|0)){j=uy(b)|0;k=(j|0)==0;l=k?b:j;Zv(l,d);return}e=Vx(i|0,173376,0)|0;i=c[e+8>>2]|0;m=c[f>>2]|0;f=i|0;n=Hc[c[f>>2]&63](i,0,128)|0;if((n|0)!=0){o=m|0;p=n;do{n=c[p+8>>2]|0;q=c[p+12>>2]|0;r=c[p+16>>2]|0;s=sx(b,24)|0;a[s+20|0]=1;c[s+8>>2]=dy(b,n)|0;c[s+12>>2]=dy(b,q)|0;c[s+16>>2]=r;a[s+22|0]=a[p+22|0]|0;a[s+21|0]=a[p+21|0]|0;Hc[c[o>>2]&63](m,s,1)|0;p=Hc[c[f>>2]&63](i,p,8)|0;}while((p|0)!=0)}p=c[e+12>>2]|0;i=p;f=c[g>>2]|0;g=p;p=Hc[c[g>>2]&63](i,0,128)|0;if((p|0)!=0){m=f|0;o=p;do{p=c[o+8>>2]|0;s=c[o+12>>2]|0;r=c[o+16>>2]|0;q=sx(b,24)|0;a[q+20|0]=2;c[q+8>>2]=dy(b,p)|0;c[q+12>>2]=dy(b,s)|0;c[q+16>>2]=r;a[q+22|0]=a[o+22|0]|0;a[q+21|0]=a[o+21|0]|0;Hc[c[m>>2]&63](f,q,1)|0;o=Hc[c[g>>2]&63](i,o,8)|0;}while((o|0)!=0)}o=c[e+16>>2]|0;e=c[h>>2]|0;h=o|0;i=Hc[c[h>>2]&63](o,0,128)|0;if((i|0)==0){j=uy(b)|0;k=(j|0)==0;l=k?b:j;Zv(l,d);return}g=e|0;f=i;do{i=c[f+8>>2]|0;m=c[f+12>>2]|0;q=c[f+16>>2]|0;r=sx(b,24)|0;a[r+20|0]=0;c[r+8>>2]=dy(b,i)|0;c[r+12>>2]=dy(b,m)|0;c[r+16>>2]=q;a[r+22|0]=a[f+22|0]|0;a[r+21|0]=a[f+21|0]|0;Hc[c[g>>2]&63](e,r,1)|0;f=Hc[c[h>>2]&63](o,f,8)|0;}while((f|0)!=0);j=uy(b)|0;k=(j|0)==0;l=k?b:j;Zv(l,d);return}function Zv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;e=Wx(b,c[43580]|0,16,0)|0;f=b;g=c[f>>2]&3;h=a|0;a=Vx(h,173376,0)|0;do{if((a|0)==0){j=0}else{if((g|0)==3|(g|0)==2){j=c[a+12>>2]|0;break}else if((g|0)==0){j=c[a+16>>2]|0;break}else if((g|0)==1){j=c[a+8>>2]|0;break}else{Fv(1,96792,(k=i,i=i+8|0,c[k>>2]=g,k)|0)|0;i=k;j=0;break}}}while(0);g=e+8|0;if((c[g>>2]|0)!=0){i=d;return}a=Ix(h)|0;h=c[f>>2]&3;l=Vx(a|0,173376,0)|0;do{if((l|0)==0){m=0}else{if((h|0)==0){m=c[l+16>>2]|0;break}else if((h|0)==1){m=c[l+8>>2]|0;break}else if((h|0)==3|(h|0)==2){m=c[l+12>>2]|0;break}else{Fv(1,96792,(k=i,i=i+8|0,c[k>>2]=h,k)|0)|0;i=k;m=0;break}}}while(0);c[g>>2]=m;m=Ix(Hx(b)|0)|0;g=c[f>>2]&3;f=Vx(m|0,173376,0)|0;do{if((f|0)==0){n=0}else{if((g|0)==0){o=c[f+16>>2]|0}else if((g|0)==1){o=c[f+8>>2]|0}else if((g|0)==3|(g|0)==2){o=c[f+12>>2]|0}else{Fv(1,96792,(k=i,i=i+8|0,c[k>>2]=g,k)|0)|0;i=k;n=0;break}if((o|0)==0){n=0;break}n=bh(o)|0}}while(0);o=Hx(b)|0;k=e+12|0;c[k>>2]=sx(o,(n|0)<4?16:n<<2)|0;n=j|0;o=Hc[c[n>>2]&63](j,0,128)|0;if((o|0)==0){i=d;return}else{p=o}do{o=Hx(b)|0;e=dy(o,c[p+12>>2]|0)|0;c[(c[k>>2]|0)+(c[p+16>>2]<<2)>>2]=e;p=Hc[c[n>>2]&63](j,p,8)|0;}while((p|0)!=0);i=d;return}function _v(a){a=a|0;var b=0,d=0,e=0;c[53854]=a;b=a|0;d=Vx(b,c[43580]|0,0)|0;if((d|0)!=0){$v(a|0,d);Xx(b,c[d>>2]|0)|0}d=Vx(b,173376,0)|0;if((d|0)==0){e=0;return e|0}if((Ay(a,c[d+8>>2]|0)|0)!=0){e=1;return e|0}if((Ay(a,c[d+12>>2]|0)|0)!=0){e=1;return e|0}if((Ay(a,c[d+16>>2]|0)|0)!=0){e=1;return e|0}Xx(b,c[d>>2]|0)|0;e=0;return e|0}function $v(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;e=a|0;f=Hx(e)|0;g=Ix(Hx(e)|0)|0;e=c[a>>2]&3;a=Vx(g|0,173376,0)|0;do{if((a|0)!=0){if((e|0)==3|(e|0)==2){h=c[a+12>>2]|0}else if((e|0)==1){h=c[a+8>>2]|0}else if((e|0)==0){h=c[a+16>>2]|0}else{Fv(1,96792,(g=i,i=i+8|0,c[g>>2]=e,g)|0)|0;i=g;break}if((h|0)==0){break}g=bh(h)|0;j=b+12|0;k=c[j>>2]|0;if((g|0)>0){l=0;m=k}else{n=k;o=n;tx(f,o);i=d;return}while(1){fy(f,c[m+(l<<2)>>2]|0)|0;k=l+1|0;p=c[j>>2]|0;if((k|0)<(g|0)){l=k;m=p}else{n=p;break}}o=n;tx(f,o);i=d;return}}while(0);n=c[b+12>>2]|0;o=n;tx(f,o);i=d;return}function aw(a,b){a=a|0;b=b|0;var d=0;d=b|0;b=Vx(d,c[43580]|0,0)|0;do{if((b|0)!=0){if((c[b+8>>2]|0)==0){break}return}}while(0);Zv(a,d);return}function bw(a){a=a|0;var b=0,d=0;b=a|0;d=Vx(b,c[43580]|0,0)|0;if((d|0)==0){return}$v(a|0,d);Xx(b,c[43580]|0)|0;return}function cw(a,b){a=a|0;b=b|0;var d=0;d=b|0;b=Vx(d,c[43580]|0,0)|0;do{if((b|0)!=0){if((c[b+8>>2]|0)==0){break}return}}while(0);Zv(a,d);return}function dw(a){a=a|0;var b=0,d=0;b=a|0;d=Vx(b,c[43580]|0,0)|0;if((d|0)==0){return}$v(a|0,d);Xx(b,c[43580]|0)|0;return}function ew(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+24|0;e=d|0;f=Vx(a,c[43580]|0,0)|0;if((f|0)==0){g=0;i=d;return g|0}h=c[f+8>>2]|0;c[e+8>>2]=b;b=Hc[c[h>>2]&63](h,e,4)|0;if((b|0)==0){g=0;i=d;return g|0}e=Vx(a,c[43580]|0,0)|0;g=c[(c[e+12>>2]|0)+(c[b+16>>2]<<2)>>2]|0;i=d;return g|0}function fw(a,b){a=a|0;b=b|0;var d=0;d=Vx(a,c[43580]|0,0)|0;return c[(c[d+12>>2]|0)+(c[b+16>>2]<<2)>>2]|0}function gw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+24|0;f=e|0;g=Vx(a,c[43580]|0,0)|0;if((g|0)==0){h=-1;i=e;return h|0}j=c[g+8>>2]|0;c[f+8>>2]=b;b=Hc[c[j>>2]&63](j,f,4)|0;if((b|0)==0){h=-1;i=e;return h|0}hw(a,b,d)|0;h=0;i=e;return h|0}function hw(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;i=i+24|0;g=f|0;h=Hx(b)|0;j=Vx(b,c[43580]|0,0)|0;k=d+16|0;l=j+12|0;fy(h,c[(c[l>>2]|0)+(c[k>>2]<<2)>>2]|0)|0;j=dy(h,e)|0;c[(c[l>>2]|0)+(c[k>>2]<<2)>>2]=j;j=b;if((c[j>>2]&3|0)!=0){Lx(h,b,d);i=f;return 0}l=c[(Vx(h|0,173376,0)|0)+16>>2]|0;m=d+8|0;n=c[m>>2]|0;o=fh(l,0)|0;c[g+8>>2]=n;n=l|0;p=Hc[c[n>>2]&63](l,g,4)|0;fh(l,o)|0;if((p|0)==0){o=c[m>>2]|0;m=c[k>>2]|0;k=c[j>>2]|0;j=sx(h,24)|0;a[j+20|0]=k&3;c[j+8>>2]=dy(h,o)|0;c[j+12>>2]=dy(h,e)|0;c[j+16>>2]=m;Hc[c[n>>2]&63](l,j,1)|0;Lx(h,b,d);i=f;return 0}else{j=p+12|0;fy(h,c[j>>2]|0)|0;c[j>>2]=dy(h,e)|0;Lx(h,b,d);i=f;return 0}return 0}function iw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;i=i+24|0;g=f|0;h=Hx(a)|0;j=a;k=c[j>>2]&3;do{if((h|0)==0){l=c[53550]|0;if((l|0)!=0){m=l;break}l=Hw(0,172632,0)|0;c[53550]=l;m=l}else{m=h}}while(0);h=Vx(m|0,173376,0)|0;do{if((h|0)!=0){if((k|0)==3|(k|0)==2){n=c[h+12>>2]|0}else if((k|0)==1){n=c[h+8>>2]|0}else if((k|0)==0){n=c[h+16>>2]|0}else{Fv(1,96792,(m=i,i=i+8|0,c[m>>2]=k,m)|0)|0;i=m;break}if((n|0)==0){break}c[g+8>>2]=b;m=Hc[c[n>>2]&63](n,g,4)|0;if((m|0)==0){break}else{o=m}p=hw(a,o,d)|0;i=f;return 0}}while(0);g=Hx(a)|0;o=Wv(g,c[j>>2]&3,b,e)|0;p=hw(a,o,d)|0;i=f;return 0}function jw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=i;i=i+24|0;e=d|0;f=Hx(a)|0;g=a;h=c[g>>2]|0;if(((c[b>>2]^h)&3|0)!=0){j=1;i=d;return j|0}k=f|0;f=Vx(k,173376,0)|0;if((f|0)==0){j=1;i=d;return j|0}l=e;m=e+8|0;e=0;n=1;o=h;h=f;while(1){p=o&3;if((p|0)==0){q=c[h+16>>2]|0}else if((p|0)==3|(p|0)==2){q=c[h+12>>2]|0}else if((p|0)==1){q=c[h+8>>2]|0}else{r=8;break}if((q|0)==0){j=n;r=19;break}f=c[q>>2]|0;if((e|0)==0){s=Hc[f&63](q,0,128)|0}else{s=Hc[f&63](q,e,8)|0}if((s|0)==0){j=n;r=19;break}f=c[s+8>>2]|0;t=Vx(b,c[43580]|0,0)|0;if((t|0)==0){j=1;r=19;break}u=c[t+8>>2]|0;c[m>>2]=f;f=Hc[c[u>>2]&63](u,l,4)|0;if((f|0)==0){j=1;r=19;break}u=Vx(a,c[43580]|0,0)|0;t=c[(c[u+12>>2]|0)+(c[s+16>>2]<<2)>>2]|0;hw(b,f,t)|0;if((gy(t)|0)!=0){t=Vx(b,c[43580]|0,0)|0;hy(c[(c[t+12>>2]|0)+(c[f+16>>2]<<2)>>2]|0)}f=c[g>>2]|0;t=Vx(k,173376,0)|0;if((t|0)==0){j=0;r=19;break}else{e=s;n=0;o=f;h=t}}if((r|0)==8){Fv(1,96792,(h=i,i=i+8|0,c[h>>2]=p,h)|0)|0;i=h;j=n;i=d;return j|0}else if((r|0)==19){i=d;return j|0}return 0}function kw(a,b,c){a=a|0;b=b|0;c=c|0;Yv(a);return}function lw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=Vx(b|0,c[43580]|0,0)|0;b=d+16|0;f=c[b>>2]|0;if((f|0)>3){g=c[a+52>>2]|0;h=e+12|0;i=f<<2;c[h>>2]=Sc[c[(c[g>>2]|0)+8>>2]&127](c[g+12>>2]|0,c[h>>2]|0,i,i+4|0)|0;j=h}else{j=e+12|0}e=dy(a,c[d+12>>2]|0)|0;c[(c[j>>2]|0)+(c[b>>2]<<2)>>2]=e;return}function mw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+40|0;e=d|0;do{if((c[b+12>>2]|0)==(a|0)){f=b+16|0}else{c[e+16>>2]=b;g=c[a+28>>2]|0;h=Hc[c[g>>2]&63](g,e,4)|0;if((h|0)==0){j=0}else{f=h;break}i=d;return j|0}}while(0);e=a+32|0;a=f+32|0;ah(c[e>>2]|0,c[a>>2]|0)|0;f=c[e>>2]|0;b=Hc[c[f>>2]&63](f,0,128)|0;c[a>>2]=Yg(c[e>>2]|0)|0;j=b;i=d;return j|0}function nw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+40|0;e=d|0;if((c[b+12>>2]|0)==(a|0)){f=b+16|0;i=d;return f|0}else{c[e+16>>2]=b;b=c[a+28>>2]|0;f=Hc[c[b>>2]&63](b,e,4)|0;i=d;return f|0}return 0}function ow(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+40|0;e=d|0;f=c[((c[b>>2]&3|0)==3?b:b+32|0)+28>>2]|0;do{if((c[f+12>>2]|0)==(a|0)){g=f+16|0}else{c[e+16>>2]=f;h=c[a+28>>2]|0;j=Hc[c[h>>2]&63](h,e,4)|0;if((j|0)==0){k=0}else{g=j;break}i=d;return k|0}}while(0);e=a+32|0;a=g+32|0;ah(c[e>>2]|0,c[a>>2]|0)|0;g=c[e>>2]|0;f=Hc[c[g>>2]&63](g,b|0,8)|0;c[a>>2]=Yg(c[e>>2]|0)|0;k=f;i=d;return k|0}function pw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+40|0;e=d|0;do{if((c[b+12>>2]|0)==(a|0)){f=b+16|0}else{c[e+16>>2]=b;g=c[a+28>>2]|0;h=Hc[c[g>>2]&63](g,e,4)|0;if((h|0)==0){j=0}else{f=h;break}i=d;return j|0}}while(0);e=a+32|0;a=f+28|0;ah(c[e>>2]|0,c[a>>2]|0)|0;f=c[e>>2]|0;b=Hc[c[f>>2]&63](f,0,128)|0;c[a>>2]=Yg(c[e>>2]|0)|0;j=b;i=d;return j|0}function qw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+40|0;e=d|0;f=c[((c[b>>2]&3|0)==2?b:b-32|0)+28>>2]|0;do{if((c[f+12>>2]|0)==(a|0)){g=f+16|0}else{c[e+16>>2]=f;h=c[a+28>>2]|0;j=Hc[c[h>>2]&63](h,e,4)|0;if((j|0)==0){k=0}else{g=j;break}i=d;return k|0}}while(0);e=a+32|0;a=g+28|0;ah(c[e>>2]|0,c[a>>2]|0)|0;g=c[e>>2]|0;f=Hc[c[g>>2]&63](g,b|0,8)|0;c[a>>2]=Yg(c[e>>2]|0)|0;k=f;i=d;return k|0}function rw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+80|0;e=d|0;f=d+40|0;g=b+12|0;if((c[g>>2]|0)==(a|0)){h=b+16|0;j=4}else{c[f+16>>2]=b;k=c[a+28>>2]|0;l=Hc[c[k>>2]&63](k,f,4)|0;if((l|0)!=0){h=l;j=4}}do{if((j|0)==4){l=a+32|0;f=h+32|0;ah(c[l>>2]|0,c[f>>2]|0)|0;k=c[l>>2]|0;m=Hc[c[k>>2]&63](k,0,128)|0;c[f>>2]=Yg(c[l>>2]|0)|0;if((m|0)==0){break}else{n=m}i=d;return n|0}}while(0);do{if((c[g>>2]|0)==(a|0)){o=b+16|0}else{c[e+16>>2]=b;h=c[a+28>>2]|0;j=Hc[c[h>>2]&63](h,e,4)|0;if((j|0)==0){n=0}else{o=j;break}i=d;return n|0}}while(0);e=a+32|0;a=o+28|0;ah(c[e>>2]|0,c[a>>2]|0)|0;o=c[e>>2]|0;b=Hc[c[o>>2]&63](o,0,128)|0;c[a>>2]=Yg(c[e>>2]|0)|0;n=b;i=d;return n|0}function sw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;e=i;i=i+160|0;f=e|0;g=e+40|0;h=e+80|0;j=e+120|0;k=c[b>>2]|0;if((k&3|0)!=2){l=f+16|0;m=f;f=a+32|0;n=a+28|0;o=b;p=k;while(1){k=c[((p&3|0)==2?o:o-32|0)+28>>2]|0;if((c[k+12>>2]|0)==(a|0)){q=k+16|0}else{c[l>>2]=k;k=c[n>>2]|0;r=Hc[c[k>>2]&63](k,m,4)|0;if((r|0)==0){s=0;t=26;break}else{q=r}}r=q+28|0;ah(c[f>>2]|0,c[r>>2]|0)|0;k=c[f>>2]|0;u=Hc[c[k>>2]&63](k,o|0,8)|0;k=u;c[r>>2]=Yg(c[f>>2]|0)|0;if((u|0)==0){s=0;t=26;break}if((c[u+28>>2]|0)!=(d|0)){s=k;t=26;break}o=k;p=c[u>>2]|0}if((t|0)==26){i=e;return s|0}}p=c[b+60>>2]|0;do{if((c[p+12>>2]|0)==(a|0)){v=p+16|0;t=7}else{c[j+16>>2]=p;o=a+28|0;f=c[o>>2]|0;q=Hc[c[f>>2]&63](f,j,4)|0;if((q|0)!=0){v=q;t=7;break}w=a+32|0;x=o}}while(0);do{if((t|0)==7){j=a+32|0;p=v+32|0;ah(c[j>>2]|0,c[p>>2]|0)|0;o=c[j>>2]|0;q=Hc[c[o>>2]&63](o,b|0,8)|0;c[p>>2]=Yg(c[j>>2]|0)|0;if((q|0)==0){w=j;x=a+28|0;break}else{s=q;i=e;return s|0}}}while(0);b=g+16|0;v=h+16|0;q=h;h=d+12|0;j=d+16|0;p=g;g=0;while(1){if((g|0)==0){if((c[h>>2]|0)==(a|0)){y=j}else{c[v>>2]=d;o=c[x>>2]|0;f=Hc[c[o>>2]&63](o,q,4)|0;if((f|0)==0){s=0;t=26;break}else{y=f}}f=y+28|0;ah(c[w>>2]|0,c[f>>2]|0)|0;o=c[w>>2]|0;m=Hc[c[o>>2]&63](o,0,128)|0;c[f>>2]=Yg(c[w>>2]|0)|0;z=m}else{m=c[((c[g>>2]&3|0)==2?g:g-32|0)+28>>2]|0;if((c[m+12>>2]|0)==(a|0)){A=m+16|0}else{c[b>>2]=m;m=c[x>>2]|0;f=Hc[c[m>>2]&63](m,p,4)|0;if((f|0)==0){s=0;t=26;break}else{A=f}}f=A+28|0;ah(c[w>>2]|0,c[f>>2]|0)|0;m=c[w>>2]|0;o=Hc[c[m>>2]&63](m,g|0,8)|0;c[f>>2]=Yg(c[w>>2]|0)|0;z=o}o=z;if((z|0)==0){s=0;t=26;break}if((c[z+28>>2]|0)==(d|0)){g=o}else{s=o;t=26;break}}if((t|0)==26){i=e;return s|0}return 0}function tw(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;zx(b,d,1)|0;zx(b,e,1)|0;g=sx(b,64)|0;h=g;i=Jw(b,2)|0;j=g+32|0;k=c[j>>2]|0;l=g;m=c[l>>2]|0;c[g+4>>2]=f;c[g+36>>2]=f;f=i<<4;c[l>>2]=m&12|f|2;c[j>>2]=k&12|f|3;c[g+60>>2]=d;c[g+28>>2]=e;yw(b,h);if((a[b+12|0]&64)==0){Jx(b,g);return h|0}Wx(g,c[43580]|0,16,0)|0;cw(b,h);Jx(b,g);return h|0}function uw(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;h=i;i=i+368|0;j=h|0;k=h+40|0;l=h+72|0;m=h+112|0;n=h+144|0;o=h+184|0;p=h+216|0;q=h+256|0;r=h+288|0;s=h+328|0;t=h+360|0;do{if((Yw(b,2,f,t,0)|0)==0){if((f|0)!=0){break}if((g|0)==0){u=0;v=0;w=0;x=0;y=6;break}if((Pw(b)|0)!=0){u=0;v=0;w=0;x=0;y=6}}else{u=0;v=2;w=c[t>>2]|0;x=0;y=6}}while(0);do{if((y|0)==6){z=s|0;A=(d|0)==0|(e|0)==0;do{if(!A){B=s;c[B>>2]=v|x;c[B+4>>2]=u|w;c[s+28>>2]=d;if((c[e+12>>2]|0)==(b|0)){C=e+16|0}else{c[r+16>>2]=e;B=c[b+28>>2]|0;D=Hc[c[B>>2]&63](B,r,4)|0;if((D|0)==0){break}else{C=D}}D=b+36|0;B=C+20|0;ah(c[D>>2]|0,c[B>>2]|0)|0;E=c[D>>2]|0;F=Hc[c[E>>2]&63](E,z,4)|0;c[B>>2]=Yg(c[D>>2]|0)|0;if((F|0)==0){break}else{G=F}i=h;return G|0}}while(0);do{if((Ow(b)|0)!=0){z=q|0;if(A){break}F=q;c[F>>2]=v|x;c[F+4>>2]=u|w;c[q+28>>2]=e;if((c[d+12>>2]|0)==(b|0)){H=d+16|0}else{c[p+16>>2]=d;F=c[b+28>>2]|0;D=Hc[c[F>>2]&63](F,p,4)|0;if((D|0)==0){break}else{H=D}}D=b+36|0;F=H+20|0;ah(c[D>>2]|0,c[F>>2]|0)|0;B=c[D>>2]|0;E=Hc[c[B>>2]&63](B,z,4)|0;c[F>>2]=Yg(c[D>>2]|0)|0;if((E|0)==0){break}else{G=E}i=h;return G|0}}while(0);if((g|0)==0){G=0;i=h;return G|0}E=b|0;D=Ix(E)|0;F=o|0;do{if(A){y=23}else{z=o;c[z>>2]=v|x;c[z+4>>2]=u|w;c[o+28>>2]=d;if((c[e+12>>2]|0)==(D|0)){I=e+16|0}else{c[n+16>>2]=e;z=c[D+28>>2]|0;B=Hc[c[z>>2]&63](z,n,4)|0;if((B|0)==0){y=23;break}else{I=B}}B=D+36|0;z=I+20|0;ah(c[B>>2]|0,c[z>>2]|0)|0;J=c[B>>2]|0;K=Hc[c[J>>2]&63](J,F,4)|0;c[z>>2]=Yg(c[B>>2]|0)|0;if((K|0)==0){y=23}else{L=K}}}while(0);if((y|0)==23){if((Ow(b)|0)==0){break}F=Ix(E)|0;D=m|0;if(A){break}K=m;c[K>>2]=v|x;c[K+4>>2]=u|w;c[m+28>>2]=e;if((c[d+12>>2]|0)==(F|0)){M=d+16|0}else{c[l+16>>2]=d;K=c[F+28>>2]|0;B=Hc[c[K>>2]&63](K,l,4)|0;if((B|0)==0){break}else{M=B}}B=F+36|0;F=M+20|0;ah(c[B>>2]|0,c[F>>2]|0)|0;K=c[B>>2]|0;z=Hc[c[K>>2]&63](K,D,4)|0;c[F>>2]=Yg(c[B>>2]|0)|0;if((z|0)==0){break}else{L=z}}z=L;yw(b,z);G=z;i=h;return G|0}}while(0);if((g|0)==0){G=0;i=h;return G|0}do{if((Pw(b)|0)!=0){if((a[b+12|0]&4)!=0&(d|0)==(e|0)){G=0;i=h;return G|0}g=k|0;if((d|0)==0|(e|0)==0){break}L=k;c[L>>2]=0;c[L+4>>2]=0;c[k+28>>2]=d;if((c[e+12>>2]|0)==(b|0)){N=e+16|0}else{c[j+16>>2]=e;L=c[b+28>>2]|0;M=Hc[c[L>>2]&63](L,j,4)|0;if((M|0)==0){break}else{N=M}}M=b+36|0;L=N+20|0;ah(c[M>>2]|0,c[L>>2]|0)|0;l=c[M>>2]|0;m=Hc[c[l>>2]&63](l,g,4)|0;c[L>>2]=Yg(c[M>>2]|0)|0;if((m|0)==0){break}else{G=0}i=h;return G|0}}while(0);if((Yw(b,2,f,t,1)|0)==0){G=0;i=h;return G|0}f=tw(b,d,e,c[t>>2]|0)|0;ax(b,2,f|0);G=f;i=h;return G|0}function vw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+80|0;e=d|0;f=d+40|0;g=(c[b>>2]&3|0)==3;h=g?b-32|0:b;j=g?b:b+32|0;b=c[j+28>>2]|0;g=c[h+28>>2]|0;if((c[b+12>>2]|0)==(a|0)){k=b+16|0}else{c[f+16>>2]=b;b=c[a+28>>2]|0;k=Hc[c[b>>2]&63](b,f,4)|0}f=a+32|0;b=c[f>>2]|0;l=k+32|0;ah(b,c[l>>2]|0)|0;m=h|0;Hc[c[b>>2]&63](b,m,2)|0;c[l>>2]=Yg(b)|0;b=a+36|0;l=c[b>>2]|0;h=k+24|0;ah(l,c[h>>2]|0)|0;Hc[c[l>>2]&63](l,m,2)|0;c[h>>2]=Yg(l)|0;if((c[g+12>>2]|0)==(a|0)){n=g+16|0}else{c[e+16>>2]=g;g=c[a+28>>2]|0;n=Hc[c[g>>2]&63](g,e,4)|0}e=c[f>>2]|0;f=n+28|0;ah(e,c[f>>2]|0)|0;g=j|0;Hc[c[e>>2]&63](e,g,2)|0;c[f>>2]=Yg(e)|0;e=c[b>>2]|0;b=n+20|0;ah(e,c[b>>2]|0)|0;Hc[c[e>>2]&63](e,g,2)|0;c[b>>2]=Yg(e)|0;i=d;return}
-
-
-
-function eh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Za=0,_a=0,$a=0,ab=0,bb=0;e=i;i=i+128|0;f=e|0;g=e+8|0;h=a+8|0;j=c[h>>2]|0;if((c[j>>2]&4096|0)==0){k=j}else{ah(a,0)|0;k=c[h>>2]|0}j=c[a+4>>2]|0;l=c[j>>2]|0;m=c[j+4>>2]|0;n=j+8|0;o=c[n>>2]|0;p=c[j+20>>2]|0;q=a+20|0;c[q>>2]=c[q>>2]&-32769;r=c[k+4>>2]|0;if((b|0)==0){if((r|0)==0){s=0;i=e;return s|0}if((d&448|0)==0){s=0;i=e;return s|0}if((d&64|0)==0){do{if((d&256|0)==0){t=r+4|0;u=c[t>>2]|0;if((u|0)==0){v=r;break}else{w=r;x=t;y=u}while(1){u=y|0;c[x>>2]=c[u>>2];c[u>>2]=w;u=y+4|0;t=c[u>>2]|0;if((t|0)==0){v=y;break}else{w=y;x=u;y=t}}}else{t=r|0;u=c[t>>2]|0;if((u|0)==0){v=r;break}else{z=r;A=t;B=u}while(1){u=B+4|0;c[A>>2]=c[u>>2];c[u>>2]=z;u=B|0;t=c[u>>2]|0;if((t|0)==0){v=B;break}else{z=B;A=u;B=t}}}}while(0);c[(c[h>>2]|0)+4>>2]=v;if((o|0)<0){s=c[v+8>>2]|0;i=e;return s|0}else{s=v+(-o|0)|0;i=e;return s|0}}v=j+16|0;if((c[v>>2]|0)==0){if((c[n>>2]|0)<0){C=9}else{D=k}}else{C=9}if((C|0)==9){k=a+12|0;B=-o|0;if((o|0)<0){A=r;while(1){z=A+4|0;y=c[z>>2]|0;if((y|0)!=0){x=y|0;c[z>>2]=c[x>>2];c[x>>2]=A;A=y;continue}y=c[A>>2]|0;x=c[v>>2]|0;if((x|0)!=0){Tc[x&127](a,c[A+8>>2]|0,j)}if((c[n>>2]|0)<0){Sc[c[k>>2]&127](a,A,0,j)|0}if((y|0)==0){break}else{A=y}}}else{A=r;while(1){y=A+4|0;x=c[y>>2]|0;if((x|0)!=0){z=x|0;c[y>>2]=c[z>>2];c[z>>2]=A;A=x;continue}x=c[A>>2]|0;z=c[v>>2]|0;if((z|0)!=0){Tc[z&127](a,A+B|0,j)}if((c[n>>2]|0)<0){Sc[c[k>>2]&127](a,A,0,j)|0}if((x|0)==0){break}else{A=x}}}D=c[h>>2]|0}c[D+16>>2]=0;c[(c[h>>2]|0)+4>>2]=0;s=0;i=e;return s|0}D=a+16|0;a:do{if((c[(c[D>>2]|0)+4>>2]|0)==8){if((d&4098|0)==0){C=51;break}A=(m|0)<0;k=b+l|0;if(A){E=c[k>>2]|0}else{E=k}k=a;B=Hc[c[k>>2]&63](a,b,4)|0;if((B|0)==0){C=51;break}v=(p|0)==0;x=(m|0)<1;z=B;while(1){B=z+l|0;if(A){F=c[B>>2]|0}else{F=B}do{if(v){if(x){G=Ya(E|0,F|0)|0;break}else{G=wF(E|0,F|0,m|0)|0;break}}else{G=Sc[p&127](a,E,F,j)|0}}while(0);if((G|0)!=0){C=51;break a}if((z|0)==(b|0)){break}B=Hc[c[k>>2]&63](a,z,8)|0;if((B|0)==0){C=51;break a}else{z=B}}z=c[(c[h>>2]|0)+4>>2]|0;c[f>>2]=c[z+4>>2];c[f+4>>2]=c[z>>2];H=z;I=f;C=202}else{C=51}}while(0);b:do{if((C|0)==51){do{if((d&2565|0)==0){if((d&32|0)!=0){G=b;if((o|0)<0){J=c[b+8>>2]|0}else{J=b+(-o|0)|0}F=J+l|0;if((m|0)<0){K=c[F>>2]|0}else{K=F}if((r|0)==0){L=f;M=f;N=G;O=J;C=222;break}else{P=J;Q=G;R=K;C=70;break}}if((r|0)==0){L=f;M=f;N=0;O=b;C=222;break}if((o|0)<0){S=c[r+8>>2]|0}else{S=r+(-o|0)|0}if((S|0)==(b|0)){T=b;U=r;V=0;W=f;X=f;C=151;break}G=b+l|0;if((m|0)>=0){P=b;Q=0;R=G;C=70;break}P=b;Q=0;R=c[G>>2]|0;C=70}else{do{if((d&512|0)==0){G=b+l|0;if((m|0)>=0){Y=G;break}Y=c[G>>2]|0}else{Y=b}}while(0);if((r|0)==0){L=f;M=f;N=0;O=b;C=222}else{P=b;Q=0;R=Y;C=70}}}while(0);c:do{if((C|0)==70){do{if((c[(c[D>>2]|0)+4>>2]|0)==4){G=c[(c[h>>2]|0)+24>>2]|0;if((G|0)==0){Z=r;_=f;$=f;break}if((d&516|0)==0){Z=r;_=f;$=f;break}F=(G|0)>0;if(!F){Z=r;_=f;$=f;break}E=(o|0)<0;z=(m|0)<0;k=(p|0)==0;x=(m|0)<1;v=-o|0;A=r;B=0;while(1){if(E){aa=c[A+8>>2]|0}else{aa=A+v|0}y=aa+l|0;if(z){ba=c[y>>2]|0}else{ba=y}do{if(k){if(x){ca=Ya(R|0,ba|0)|0;break}else{ca=wF(R|0,ba|0,m|0)|0;break}}else{ca=Sc[p&127](a,R,ba,j)|0}}while(0);if((ca|0)==0){C=89;break}c[g+(B<<2)>>2]=ca;if((ca|0)<0){da=A+4|0}else{da=A|0}y=c[da>>2]|0;w=B+1|0;if((y|0)==0){s=0;C=246;break}if((w|0)<(G|0)){A=y;B=w}else{C=77;break}}if((C|0)==77){if(F){ea=f;fa=f;ga=0;ha=r}else{Z=r;_=f;$=f;break}while(1){do{if((c[g+(ga<<2)>>2]|0)<0){B=ha+4|0;x=c[B>>2]|0;if((c[g+((ga|1)<<2)>>2]|0)<0){k=x|0;c[B>>2]=c[k>>2];c[k>>2]=ha;c[fa+4>>2]=x;ia=x+4|0;ja=x;ka=ea;break}else{c[ea>>2]=x;c[fa+4>>2]=ha;ia=x|0;ja=ha;ka=x;break}}else{x=ha|0;k=c[x>>2]|0;if((c[g+((ga|1)<<2)>>2]|0)>0){B=k+4|0;c[x>>2]=c[B>>2];c[B>>2]=ha;c[ea>>2]=k;ia=k|0;ja=fa;ka=k;break}else{c[fa+4>>2]=k;c[ea>>2]=ha;ia=k+4|0;ja=k;ka=ha;break}}}while(0);k=c[ia>>2]|0;B=ga+2|0;if((B|0)<(G|0)){ea=ka;fa=ja;ga=B;ha=k}else{Z=k;_=ja;$=ka;break}}}else if((C|0)==89){if(E){s=c[A+8>>2]|0;i=e;return s|0}else{s=A+v|0;i=e;return s|0}}else if((C|0)==246){i=e;return s|0}}else{Z=r;_=f;$=f}}while(0);G=(o|0)<0;F=(m|0)<0;k=(p|0)!=0;B=(m|0)<1;x=-o|0;z=Z;w=_;y=$;d:while(1){la=z;ma=w;while(1){if(G){na=c[la+8>>2]|0}else{na=la+x|0}t=na+l|0;if(F){oa=c[t>>2]|0}else{oa=t}do{if(k){pa=Sc[p&127](a,R,oa,j)|0}else{if(B){pa=Ya(R|0,oa|0)|0;break}else{pa=wF(R|0,oa|0,m|0)|0;break}}}while(0);if((pa|0)==0){T=P;U=la;V=Q;W=ma;X=y;C=151;break c}if((pa|0)>=0){break}t=la+4|0;qa=c[t>>2]|0;if((qa|0)==0){C=132;break d}if(G){ra=c[qa+8>>2]|0}else{ra=qa+x|0}u=ra+l|0;if(F){sa=c[u>>2]|0}else{sa=u}do{if(k){ta=Sc[p&127](a,R,sa,j)|0}else{if(B){ta=Ya(R|0,sa|0)|0;break}else{ta=wF(R|0,sa|0,m|0)|0;break}}}while(0);if((ta|0)>=0){C=129;break}u=qa|0;c[t>>2]=c[u>>2];c[u>>2]=la;c[ma+4>>2]=qa;u=c[qa+4>>2]|0;if((u|0)==0){L=y;M=qa;N=Q;O=P;C=222;break c}else{la=u;ma=qa}}if((C|0)==129){C=0;if((ta|0)==0){C=130;break}c[y>>2]=qa;c[ma+4>>2]=la;v=c[qa>>2]|0;if((v|0)==0){L=qa;M=la;N=Q;O=P;C=222;break c}else{z=v;w=la;y=qa;continue}}v=la|0;ua=c[v>>2]|0;if((ua|0)==0){C=150;break}if(G){va=c[ua+8>>2]|0}else{va=ua+x|0}A=va+l|0;if(F){wa=c[A>>2]|0}else{wa=A}do{if(k){xa=Sc[p&127](a,R,wa,j)|0}else{if(B){xa=Ya(R|0,wa|0)|0;break}else{xa=wF(R|0,wa|0,m|0)|0;break}}}while(0);if((xa|0)>0){A=ua+4|0;c[v>>2]=c[A>>2];c[A>>2]=la;c[y>>2]=ua;A=c[ua>>2]|0;if((A|0)==0){L=ua;M=ma;N=Q;O=P;C=222;break c}else{z=A;w=ma;y=ua;continue}}if((xa|0)==0){C=148;break}c[ma+4>>2]=ua;c[y>>2]=la;A=c[ua+4>>2]|0;if((A|0)==0){L=la;M=ua;N=Q;O=P;C=222;break c}else{z=A;w=ua;y=la}}if((C|0)==130){c[ma+4>>2]=la;T=P;U=qa;V=Q;W=la;X=y;C=151;break}else if((C|0)==132){c[ma+4>>2]=la;L=y;M=la;N=Q;O=P;C=222;break}else if((C|0)==148){c[y>>2]=la;T=P;U=ua;V=Q;W=ma;X=la;C=151;break}else if((C|0)==150){c[y>>2]=la;L=la;M=ma;N=Q;O=P;C=222;break}}}while(0);do{if((C|0)==151){if((U|0)==0){L=X;M=W;N=V;O=T;C=222;break}c[q>>2]=c[q>>2]|32768;w=U+4|0;c[X>>2]=c[w>>2];z=U|0;c[W+4>>2]=c[z>>2];if((d&516|0)!=0){ya=U;break}if((d&8|0)!=0){B=f|0;c[w>>2]=c[B>>2];c[z>>2]=0;c[B>>2]=U;za=W;Aa=T;C=189;break}if((d&16|0)!=0){B=f+4|0;c[z>>2]=c[B>>2];c[w>>2]=0;c[B>>2]=U;Ba=W;Ca=T;C=196;break}if((d&4098|0)!=0){H=U;I=W;C=202;break b}if((d&2049|0)!=0){if((c[(c[D>>2]|0)+4>>2]&4|0)!=0){ya=U;break}c[w>>2]=0;w=f+4|0;c[z>>2]=c[w>>2];c[w>>2]=U;Da=W;Ea=U;Fa=T;C=229;break}if((d&32|0)==0){s=0;i=e;return s|0}if((c[(c[D>>2]|0)+4>>2]&4|0)==0){c[V+4>>2]=0;w=f+4|0;c[V>>2]=c[w>>2];c[w>>2]=V;w=(c[h>>2]|0)+16|0;c[w>>2]=(c[w>>2]|0)+1;ya=U;break}w=c[j+16>>2]|0;if((w|0)!=0){Tc[w&127](a,T,j)}if((c[n>>2]|0)>=0){ya=U;break}Sc[c[a+12>>2]&127](a,V,0,j)|0;ya=U}}while(0);do{if((C|0)==222){c[M+4>>2]=0;c[L>>2]=0;if((d&8|0)!=0){za=M;Aa=O;C=189;break}if((d&16|0)!=0){Ba=M;Ca=O;C=196;break}if((d&516|0)!=0){Ga=O;Ha=M;break b}if((d&2049|0)!=0){Da=M;Ea=0;Fa=O;C=229;break}if((d&32|0)==0){Ga=0;Ha=M;break b}w=(c[h>>2]|0)+16|0;c[w>>2]=(c[w>>2]|0)+1;ya=N}}while(0);do{if((C|0)==189){w=f+4|0;z=c[w>>2]|0;if((z|0)==0){Ga=Aa;Ha=za;break b}B=z+4|0;k=c[B>>2]|0;if((k|0)==0){Ia=z;Ja=c[z>>2]|0}else{F=z;z=B;B=k;while(1){k=B|0;c[z>>2]=c[k>>2];c[k>>2]=F;k=B+4|0;x=c[k>>2]|0;if((x|0)==0){Ia=B;Ja=F;break}else{F=B;z=k;B=x}}}c[w>>2]=Ja;ya=Ia}else if((C|0)==196){B=f|0;z=c[B>>2]|0;if((z|0)==0){Ga=Ca;Ha=Ba;break b}F=z|0;y=c[F>>2]|0;if((y|0)==0){Ka=z;La=c[z+4>>2]|0}else{x=z;z=F;F=y;while(1){y=F+4|0;c[z>>2]=c[y>>2];c[y>>2]=x;y=F|0;k=c[y>>2]|0;if((k|0)==0){Ka=F;La=x;break}else{x=F;z=y;F=k}}}c[B>>2]=La;ya=Ka}else if((C|0)==229){F=j+12|0;z=c[F>>2]|0;do{if((z|0)==0){Ma=Fa}else{if((d&1|0)==0){Ma=Fa;break}Ma=Hc[z&63](a,Fa,j)|0}}while(0);do{if((Ma|0)==0){Na=Ea}else{if((o|0)>-1){Na=Ma+o|0;break}z=Sc[c[a+12>>2]&127](a,0,12,j)|0;B=z;if((z|0)!=0){c[z+8>>2]=Ma;Na=B;break}if((c[F>>2]|0)==0){Na=B;break}z=c[j+16>>2]|0;if((z|0)==0){Na=B;break}if((d&1|0)==0){Na=B;break}Tc[z&127](a,Ma,j);Na=B}}while(0);if((Na|0)==0){Ga=Ma;Ha=Da;break b}F=(c[h>>2]|0)+16|0;B=c[F>>2]|0;if((B|0)<=-1){ya=Na;break}c[F>>2]=B+1;ya=Na}}while(0);B=c[f>>2]|0;c[ya+4>>2]=B;c[ya>>2]=c[f+4>>2];e:do{if((c[(c[D>>2]|0)+4>>2]&8|0)==0){Oa=ya}else{if((d&516|0)==0){Oa=ya;break}F=(o|0)<0;if(F){Pa=c[ya+8>>2]|0}else{Pa=ya+(-o|0)|0}z=(m|0)<0;x=Pa+l|0;if(z){Qa=c[x>>2]|0}else{Qa=x}x=ya+4|0;if((B|0)==0){Oa=ya;break}w=(p|0)==0;k=(m|0)<1;if(F){F=ya;y=x;G=B;while(1){A=G|0;E=c[A>>2]|0;if((E|0)==0){Ra=G;Sa=A}else{u=G;Ta=A;A=E;while(1){E=A+4|0;c[Ta>>2]=c[E>>2];c[E>>2]=u;E=A|0;Ua=c[E>>2]|0;if((Ua|0)==0){Ra=A;Sa=E;break}else{u=A;Ta=E;A=Ua}}}A=y|0;c[A>>2]=Ra;Ta=(c[Ra+8>>2]|0)+l|0;if(z){Va=c[Ta>>2]|0}else{Va=Ta}do{if(w){if(k){Wa=Ya(Qa|0,Va|0)|0;break}else{Wa=wF(Qa|0,Va|0,m|0)|0;break}}else{Wa=Sc[p&127](a,Qa,Va,j)|0}}while(0);if((Wa|0)!=0){Oa=F;break e}c[A>>2]=c[Sa>>2];c[Sa>>2]=F;Ta=Ra+4|0;u=c[Ta>>2]|0;if((u|0)==0){Oa=Ra;break}else{F=Ra;y=Ta;G=u}}}else{G=ya;y=x;F=B;while(1){u=F|0;Ta=c[u>>2]|0;if((Ta|0)==0){Xa=F;Za=u}else{v=F;Ua=u;u=Ta;while(1){Ta=u+4|0;c[Ua>>2]=c[Ta>>2];c[Ta>>2]=v;Ta=u|0;E=c[Ta>>2]|0;if((E|0)==0){Xa=u;Za=Ta;break}else{v=u;Ua=Ta;u=E}}}u=y|0;c[u>>2]=Xa;Ua=Xa+(l-o)|0;if(z){_a=c[Ua>>2]|0}else{_a=Ua}do{if(w){if(k){$a=Ya(Qa|0,_a|0)|0;break}else{$a=wF(Qa|0,_a|0,m|0)|0;break}}else{$a=Sc[p&127](a,Qa,_a,j)|0}}while(0);if(($a|0)!=0){Oa=G;break e}c[u>>2]=c[Za>>2];c[Za>>2]=G;Ua=Xa+4|0;v=c[Ua>>2]|0;if((v|0)==0){Oa=Xa;break}else{G=Xa;y=Ua;F=v}}}}}while(0);c[(c[h>>2]|0)+4>>2]=Oa;if((o|0)<0){s=c[Oa+8>>2]|0;i=e;return s|0}else{s=Oa+(-o|0)|0;i=e;return s|0}}}while(0);do{if((C|0)==202){if((o|0)<0){ab=c[H+8>>2]|0}else{ab=H+(-o|0)|0}Oa=c[j+16>>2]|0;do{if((Oa|0)!=0){if((d&2|0)==0){break}Tc[Oa&127](a,ab,j)}}while(0);if((c[n>>2]|0)<0){Sc[c[a+12>>2]&127](a,H,0,j)|0}Oa=(c[h>>2]|0)+16|0;Xa=c[Oa>>2]|0;c[Oa>>2]=Xa-1;if((Xa|0)>=1){Ga=ab;Ha=I;break}c[(c[h>>2]|0)+16>>2]=-1;Ga=ab;Ha=I}}while(0);I=Ha;do{bb=I+4|0;I=c[bb>>2]|0;}while((I|0)!=0);c[bb>>2]=c[f>>2];c[(c[h>>2]|0)+4>>2]=c[f+4>>2];s=(d&2|0)!=0?Ga:0;i=e;return s|0}function fh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if((c[c[a+8>>2]>>2]&4096|0)!=0){ah(a,0)|0}d=(b|0)!=0;a:do{if(d){if((c[c[b+8>>2]>>2]&4096|0)!=0){ah(b,0)|0}if((c[b+16>>2]|0)!=(c[a+16>>2]|0)){e=0;return e|0}if((b|0)==0){break}else{f=b}while(1){if((f|0)==(a|0)){e=0;break}f=c[f+28>>2]|0;if((f|0)==0){break a}}return e|0}}while(0);f=a+28|0;g=c[f>>2]|0;if((g|0)!=0){h=g+24|0;c[h>>2]=(c[h>>2]|0)-1}c[a+32>>2]=0;c[f>>2]=0;if(d){c[f>>2]=b;c[a>>2]=62;f=b+24|0;c[f>>2]=(c[f>>2]|0)+1;e=b;return e|0}else{c[a>>2]=c[c[a+16>>2]>>2];e=g;return e|0}return 0}function gh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;if((d&99|0)!=0){e=Hc[c[c[a+16>>2]>>2]&63](a,b,d)|0;return e|0}do{if((d&516|0)==0){f=c[a+16>>2]|0;g=c[f+4>>2]|0;if((d&384|0)!=0){if((g&12|0)==0){break}}if((g&12|0)==0){if((d&24|0)==0){e=0;return e|0}g=a+32|0;h=c[g>>2]|0;if((h|0)==0){i=47}else{j=c[(c[h+4>>2]|0)+8>>2]|0;k=c[(c[h+8>>2]|0)+4>>2]|0;if((j|0)<0){l=c[k+8>>2]|0}else{l=k+(-j|0)|0}if((l|0)==(b|0)){m=b;n=h}else{i=47}}a:do{if((i|0)==47){b:do{if((a|0)!=0){h=a;j=f;while(1){o=Hc[c[j>>2]&63](h,b,4)|0;if((o|0)!=0){break}k=c[h+28>>2]|0;if((k|0)==0){break b}h=k;j=c[k+16>>2]|0}c[g>>2]=h;m=o;n=h;break a}}while(0);c[g>>2]=0;e=0;return e|0}}while(0);j=(d&8|0)==0;k=Hc[c[c[n+16>>2]>>2]&63](n,m,d)|0;p=n;c:while(1){if((k|0)!=0){q=p+16|0;if((p|0)==(a|0)){e=k;i=64;break}else{r=k}do{s=a;while(1){if((Hc[c[c[s+16>>2]>>2]&63](s,r,4)|0)!=0){break}t=c[s+28>>2]|0;if((t|0)==(p|0)){e=r;i=64;break c}else{s=t}}r=Hc[c[c[q>>2]>>2]&63](p,r,d)|0;}while((r|0)!=0)}q=c[p+28>>2]|0;c[g>>2]=q;if((q|0)==0){e=0;i=64;break}s=c[c[q+16>>2]>>2]|0;if(j){k=Hc[s&63](q,0,256)|0;p=q;continue}else{k=Hc[s&63](q,0,128)|0;p=q;continue}}if((i|0)==64){return e|0}}if((d&408|0)==0){e=0;return e|0}d:do{if((a|0)==0){u=0;v=0}else{p=(d&272|0)!=0;if((d&136|0)==0){k=0;j=0;g=0;q=a;s=f;while(1){h=Hc[c[s>>2]&63](q,b,d)|0;do{if((h|0)==0){w=g;x=j;y=k}else{t=c[q+4>>2]|0;z=c[t+4>>2]|0;A=c[t+20>>2]|0;B=h+(c[t>>2]|0)|0;if((z|0)<0){C=c[B>>2]|0}else{C=B}if((k|0)!=0){do{if((A|0)==0){if((z|0)<1){D=Ya(C|0,j|0)|0;break}else{D=wF(C|0,j|0,z|0)|0;break}}else{D=Sc[A&127](q,C,j,t)|0}}while(0);if(!(p&(D|0)>0)){w=g;x=j;y=k;break}}w=q;x=C;y=h}}while(0);h=c[q+28>>2]|0;if((h|0)==0){u=y;v=w;break d}k=y;j=x;g=w;q=h;s=c[h+16>>2]|0}}else{s=0;q=0;g=0;j=a;k=f;while(1){h=Hc[c[k>>2]&63](j,b,d)|0;do{if((h|0)==0){E=g;F=q;G=s}else{t=c[j+4>>2]|0;A=c[t+4>>2]|0;z=c[t+20>>2]|0;B=h+(c[t>>2]|0)|0;if((A|0)<0){H=c[B>>2]|0}else{H=B}if((s|0)!=0){do{if((z|0)==0){if((A|0)<1){I=Ya(H|0,q|0)|0;break}else{I=wF(H|0,q|0,A|0)|0;break}}else{I=Sc[z&127](j,H,q,t)|0}}while(0);if(!((I|0)<0|p&(I|0)>0)){E=g;F=q;G=s;break}}E=j;F=H;G=h}}while(0);h=c[j+28>>2]|0;if((h|0)==0){u=G;v=E;break d}s=G;q=F;g=E;j=h;k=c[h+16>>2]|0}}}}while(0);c[a+32>>2]=v;e=u;return e|0}}while(0);e:do{if((a|0)==0){J=0;K=0}else{u=a;while(1){v=Hc[c[c[u+16>>2]>>2]&63](u,b,d)|0;if((v|0)!=0){J=v;K=u;break e}v=c[u+28>>2]|0;if((v|0)==0){J=0;K=0;break}else{u=v}}}}while(0);c[a+32>>2]=K;e=J;return e|0}function hh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=a|0;f=a+32|0;g=Hc[c[e>>2]&63](a,0,128)|0;while(1){if((g|0)==0){h=0;i=4;break}j=c[f>>2]|0;k=Hc[c[e>>2]&63](a,g,8)|0;l=Hc[b&63]((j|0)==0?a:j,g,d)|0;if((l|0)<0){h=l;i=4;break}else{g=k}}if((i|0)==4){return h|0}return 0}function ih(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;i=i+16|0;g=f|0;h=f+8|0;c[d>>2]=0;j=b|0;c[e>>2]=(Nw(Hx(j)|0)|0)!=0;k=c[53804]|0;a:do{if((k|0)!=0){l=fw(j,k)|0;m=a[l]|0;if(m<<24>>24==0){break}else{n=173856;o=134728}while(1){if(m<<24>>24==(a[o]|0)){if((Ya(l|0,o|0)|0)==0){break}}p=n+12|0;q=c[p>>2]|0;if((q|0)==0){break a}else{n=p;o=q}}c[d>>2]=c[n+4>>2];c[e>>2]=c[n+8>>2]}}while(0);n=c[53822]|0;do{if((n|0)!=0){if((c[e>>2]|0)!=1){break}o=fw(j,n)|0;if((a[o]|0)==0){break}jh(o,e)}}while(0);n=c[53818]|0;do{if((n|0)!=0){if((c[d>>2]|0)!=1){break}o=fw(j,n)|0;if((a[o]|0)==0){break}jh(o,d)}}while(0);if((a[(c[b+8>>2]|0)+153|0]|0)==0){i=f;return}n=b;j=b-32|0;o=Hx(c[((c[n>>2]&3|0)==2?b:j)+28>>2]|0)|0;k=c[n>>2]&3;ih(uw(o,c[((k|0)==2?b:j)+28>>2]|0,c[((k|0)==3?b:b+32|0)+28>>2]|0,0,0)|0,g,h);c[e>>2]=c[g>>2]|c[e>>2];c[d>>2]=c[h>>2]|c[d>>2];i=f;return}function jh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;e=i;c[d>>2]=0;if((a[b]|0)==0){i=e;return}else{f=b;g=0;h=0}a:while(1){b=c[43422]|0;j=c[43452]|0;k=(j|0)==0;l=c[43426]|0;m=(l|0)==0;do{if((b|0)==0){if(k){n=0;o=f}else{p=f;q=0;while(1){r=173808;s=j;while(1){t=xF(s|0)|0;u=r+8|0;if((Za(p|0,s|0,t|0)|0)==0){v=7;break}w=c[u>>2]|0;if((w|0)==0){x=p;y=q;break}else{r=u;s=w}}if((v|0)==7){v=0;x=p+t|0;y=c[r+4>>2]|q}if((p|0)==(x|0)){n=y;o=p;break}else{p=x;q=y}}}b:do{if(m){z=o;A=n}else{q=173704;p=l;while(1){B=xF(p|0)|0;s=q+8|0;if((Za(o|0,p|0,B|0)|0)==0){break}w=c[s>>2]|0;if((w|0)==0){z=o;A=n;break b}else{q=s;p=w}}z=o+B|0;A=c[q+4>>2]|n}}while(0);p=(A|0)!=0&(A&15|0)==0&1|A;if((p|0)==0){v=30;break a}else if((p|0)!=8){C=p;D=z;v=33;break}if((g|0)==3){E=3;F=z;G=h;break}else if((g|0)!=0){C=8;D=z;v=33;break}if((a[z]|0)==0){v=35;break a}else{C=8;D=z;v=33}}else{p=173688;r=b;while(1){H=xF(r|0)|0;w=p+8|0;if((Za(f|0,r|0,H|0)|0)==0){v=18;break}s=c[w>>2]|0;if((s|0)==0){I=f;J=0;v=19;break}else{p=w;r=s}}if((v|0)==18){v=0;r=c[p+4>>2]|0;s=f+H|0;if((H|0)==0){I=s;J=r;v=19}else{K=s;L=r}}c:do{if((v|0)==19){v=0;if(k){M=J;N=I}else{r=I;s=J;while(1){w=173808;u=j;while(1){O=xF(u|0)|0;P=w+8|0;if((Za(r|0,u|0,O|0)|0)==0){v=23;break}Q=c[P>>2]|0;if((Q|0)==0){R=r;S=s;break}else{w=P;u=Q}}if((v|0)==23){v=0;R=r+O|0;S=c[w+4>>2]|s}if((r|0)==(R|0)){M=S;N=r;break}else{r=R;s=S}}}if(m){K=N;L=M;break}else{T=173704;U=l}while(1){V=xF(U|0)|0;s=T+8|0;if((Za(N|0,U|0,V|0)|0)==0){break}r=c[s>>2]|0;if((r|0)==0){K=N;L=M;break c}else{T=s;U=r}}K=N+V|0;L=c[T+4>>2]|M}}while(0);p=(L|0)!=0&(L&15|0)==0&1|L;if((p|0)==0){v=30;break a}else if((p|0)!=8){C=p;D=K;v=33;break}if((g|0)==3){E=3;F=K;G=h;break}else if((g|0)!=0){C=8;D=K;v=33;break}if((a[K]|0)==0){v=35;break a}else{C=8;D=K;v=33}}}while(0);if((v|0)==33){v=0;l=h|C<<(g<<3);c[d>>2]=l;E=g+1|0;F=D;G=l}if((a[F]|0)!=0&(E|0)<4){f=F;g=E;h=G}else{v=35;break}}if((v|0)==30){Fv(0,105792,(G=i,i=i+8|0,c[G>>2]=f,G)|0)|0;i=G;i=e;return}else if((v|0)==35){i=e;return}}function kh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0;d=b&15;e=173472;while(1){if((d|0)==(c[e>>2]|0)){f=4;break}if((c[e+40>>2]|0)==0){g=0.0;break}else{e=e+24|0}}if((f|0)==4){g=+h[e+8>>3]+0.0}e=b>>>8&15;d=173472;while(1){if((e|0)==(c[d>>2]|0)){f=8;break}if((c[d+40>>2]|0)==0){i=g;break}else{d=d+24|0}}if((f|0)==8){i=g+ +h[d+8>>3]}d=b>>>16&15;e=173472;while(1){if((d|0)==(c[e>>2]|0)){f=12;break}if((c[e+40>>2]|0)==0){j=i;break}else{e=e+24|0}}if((f|0)==12){j=i+ +h[e+8>>3]}e=b>>>24&15;b=173472;while(1){if((e|0)==(c[b>>2]|0)){break}if((c[b+40>>2]|0)==0){k=j;f=17;break}else{b=b+24|0}}if((f|0)==17){l=k*10.0;m=a|0;n=c[53820]|0;o=+Fm(m,n,1.0,0.0);p=l*o;return+p}k=j+ +h[b+8>>3];l=k*10.0;m=a|0;n=c[53820]|0;o=+Fm(m,n,1.0,0.0);p=l*o;return+p}function lh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0,t=0,u=0;j=i;i=i+80|0;k=j|0;l=j+8|0;m=j+72|0;n=+kh(a,g);o=n*n;h[m>>3]=o;c[f+12>>2]=g;g=e+3|0;a=b+(g<<4)|0;p=f+32|0;f=a;c[p>>2]=c[f>>2];c[p+4>>2]=c[f+4>>2];c[p+8>>2]=c[f+8>>2];c[p+12>>2]=c[f+12>>2];do{if((e|0)>(d|0)){n=+h[b+(e<<4)>>3]- +h[a>>3];q=+h[b+(e<<4)+8>>3]- +h[b+(g<<4)+8>>3];if(n*n+q*q>=o){r=e;break}r=e-3|0}else{r=e}}while(0);e=l+48|0;g=b+(r<<4)|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];a=l+32|0;d=b+(r+1<<4)|0;c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];f=l+16|0;s=b+(r+2<<4)|0;c[f>>2]=c[s>>2];c[f+4>>2]=c[s+4>>2];c[f+8>>2]=c[s+8>>2];c[f+12>>2]=c[s+12>>2];t=l|0;u=l;c[u>>2]=c[p>>2];c[u+4>>2]=c[p+4>>2];c[u+8>>2]=c[p+8>>2];c[u+12>>2]=c[p+12>>2];c[k>>2]=t;c[k+4>>2]=m;_l(k,198,t,1);c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];c[d>>2]=c[a>>2];c[d+4>>2]=c[a+4>>2];c[d+8>>2]=c[a+8>>2];c[d+12>>2]=c[a+12>>2];c[s>>2]=c[f>>2];c[s+4>>2]=c[f+4>>2];c[s+8>>2]=c[f+8>>2];c[s+12>>2]=c[f+12>>2];f=b+(r+3<<4)|0;c[f>>2]=c[u>>2];c[f+4>>2]=c[u+4>>2];c[f+8>>2]=c[u+8>>2];c[f+12>>2]=c[u+12>>2];i=j;return r|0}function mh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0;d=i;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=c[a>>2]|0;f=+h[b>>3]- +h[e>>3];g=+h[b+8>>3]- +h[e+8>>3];i=d;return f*f+g*g<=+h[c[a+4>>2]>>3]|0}function nh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0;j=i;i=i+80|0;k=j|0;l=j+8|0;m=j+72|0;n=+kh(a,g);o=n*n;h[m>>3]=o;c[f+8>>2]=g;g=b+(d<<4)|0;a=f+16|0;f=g;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];do{if((e|0)>(d|0)){f=d+3|0;n=+h[g>>3]- +h[b+(f<<4)>>3];p=+h[b+(d<<4)+8>>3]- +h[b+(f<<4)+8>>3];if(n*n+p*p>=o){q=d;break}q=f}else{q=d}}while(0);d=l;g=b+(q+3<<4)|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];e=l+16|0;f=b+(q+2<<4)|0;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];r=l+32|0;s=b+(q+1<<4)|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];t=l+48|0;u=t;c[u>>2]=c[a>>2];c[u+4>>2]=c[a+4>>2];c[u+8>>2]=c[a+8>>2];c[u+12>>2]=c[a+12>>2];c[k>>2]=t;c[k+4>>2]=m;_l(k,198,l|0,0);l=b+(q<<4)|0;c[l>>2]=c[u>>2];c[l+4>>2]=c[u+4>>2];c[l+8>>2]=c[u+8>>2];c[l+12>>2]=c[u+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];i=j;return q|0}function oh(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0.0,H=0.0,I=0.0,J=0.0;j=(g|0)!=0;k=(i|0)==0;if(j&(k^1)&(e|0)==(d|0)){l=b+(e<<4)|0;m=+h[l>>3];n=+h[b+(e<<4)+8>>3];o=e+3|0;p=b+(o<<4)|0;q=p|0;r=+h[q>>3];s=b+(o<<4)+8|0;t=+h[s>>3];u=+kh(a,g);v=+kh(a,i);w=m-r;x=n-t;y=+T(w*w+x*x);if(u+v<y){z=v;A=u}else{u=y/3.0;z=u;A=u}do{if(n==t){if(m<r){B=r-z;C=n;D=m+A;E=n;break}else{B=r+z;C=n;D=m-A;E=n;break}}else{if(n<t){B=m;C=t-z;D=m;E=n+A;break}else{B=m;C=t+z;D=m;E=n-A;break}}}while(0);o=e+1|0;F=b+(o<<4)|0;h[F>>3]=D;h[b+(o<<4)+8>>3]=E;o=l;l=F;c[o>>2]=c[l>>2];c[o+4>>2]=c[l+4>>2];c[o+8>>2]=c[l+8>>2];c[o+12>>2]=c[l+12>>2];h[q>>3]=B;h[s>>3]=C;s=b+(e+2<<4)|0;q=p;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];c[f+12>>2]=i;h[f+32>>3]=m;h[f+40>>3]=n;c[f+8>>2]=g;h[f+16>>3]=r;h[f+24>>3]=t;return}if(!k){t=+kh(a,i);r=+h[b+(e<<4)>>3];n=+h[b+(e<<4)+8>>3];k=e+3|0;q=b+(k<<4)|0;s=q|0;m=+h[s>>3];p=b+(k<<4)+8|0;C=+h[p>>3];B=r-m;E=n-C;D=+T(B*B+E*E)*.9;E=t<D?t:D;do{if(n==C){if(r<m){G=m-E;H=n;break}else{G=m+E;H=n;break}}else{if(n<C){G=r;H=C-E;break}else{G=r;H=C+E;break}}}while(0);k=e+1|0;h[b+(k<<4)>>3]=r;h[b+(k<<4)+8>>3]=n;h[s>>3]=G;h[p>>3]=H;p=b+(e+2<<4)|0;e=q;c[p>>2]=c[e>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];c[p+12>>2]=c[e+12>>2];c[f+12>>2]=i;h[f+32>>3]=m;h[f+40>>3]=C}if(!j){return}C=+kh(a,g);a=b+(d<<4)|0;m=+h[a>>3];H=+h[b+(d<<4)+8>>3];j=d+3|0;G=+h[b+(j<<4)>>3];n=+h[b+(j<<4)+8>>3];r=m-G;E=H-n;D=+T(r*r+E*E)*.9;E=C<D?C:D;do{if(H==n){if(m<G){I=m+E;J=H;break}else{I=m-E;J=H;break}}else{if(H<n){I=m;J=H+E;break}else{I=m;J=H-E;break}}}while(0);j=d+1|0;i=b+(j<<4)|0;h[i>>3]=I;h[b+(j<<4)+8>>3]=J;j=a;a=i;c[j>>2]=c[a>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];a=d+2|0;h[b+(a<<4)>>3]=G;h[b+(a<<4)+8>>3]=n;c[f+8>>2]=g;h[f+16>>3]=m;h[f+24>>3]=H;return}function ph(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;var g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;f=i;g=b;b=i;i=i+16|0;c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[b+12>>2]=c[g+12>>2];g=d;d=i;i=i+16|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];j=+h[b>>3];k=+h[d>>3]-j;l=+h[b+8>>3];m=+h[d+8>>3]-l;n=e*10.0/(+T(k*k+m*m)+1.0e-4);e=n*(k+(k>=0.0?1.0e-4:-1.0e-4));k=n*(m+(m>=0.0?1.0e-4:-1.0e-4));m=e*.5;n=k*.5;o=j-n;p=l-m;q=j+n;n=m+l;l=e+o;m=k+p;j=e+q;e=k+n;k=l>j?l:j;r=q>k?q:k;k=m>e?m:e;s=n>k?n:k;k=l<j?l:j;j=q<k?q:k;k=m<e?m:e;e=n<k?n:k;h[a>>3]=o<j?o:j;h[a+8>>3]=p<e?p:e;h[a+16>>3]=o>r?o:r;h[a+24>>3]=p>s?p:s;i=f;return}function qh(a,b,d,e,f,g,j){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=+g;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;k=i;i=i+48|0;l=d;d=i;i=i+16|0;c[d>>2]=c[l>>2];c[d+4>>2]=c[l+4>>2];c[d+8>>2]=c[l+8>>2];c[d+12>>2]=c[l+12>>2];l=e;e=i;i=i+16|0;c[e>>2]=c[l>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[e+12>>2]=c[l+12>>2];l=k|0;m=k+16|0;n=(c[a+16>>2]|0)+12|0;o=c[n>>2]|0;c[n>>2]=b;pB(a,c[(c[a>>2]|0)+336>>2]|0);xB(a,g);b=d|0;p=e|0;q=+h[p>>3]- +h[b>>3];r=d+8|0;s=e+8|0;t=+h[s>>3]- +h[r>>3];u=10.0/(+T(q*q+t*t)+1.0e-4);v=u*(q+(q>=0.0?1.0e-4:-1.0e-4));h[p>>3]=v;q=u*(t+(t>=0.0?1.0e-4:-1.0e-4));h[s>>3]=q;s=m;p=l|0;e=l+8|0;w=m|0;x=m+8|0;y=k+32|0;z=d;d=0;while(1){A=j>>(d<<3);B=A&255;if((B|0)==0){C=8;break}t=+h[b>>3];u=+h[r>>3];h[p>>3]=v;h[e>>3]=q;h[w>>3]=t;h[x>>3]=u;D=A&15;A=173472;E=1;while(1){F=A+24|0;if((D|0)==(E|0)){C=6;break}G=c[F>>2]|0;if((G|0)==0){break}else{A=F;E=G}}if((C|0)==6){C=0;E=A+8|0;h[p>>3]=v*+h[E>>3]*f;h[e>>3]=q*+h[E>>3]*f;Rc[c[A+16>>2]&31](a,m,l,f,g,B);h[w>>3]=+h[w>>3]+ +h[p>>3];h[x>>3]=+h[x>>3]+ +h[e>>3]}c[y>>2]=c[s>>2];c[y+4>>2]=c[s+4>>2];c[y+8>>2]=c[s+8>>2];c[y+12>>2]=c[s+12>>2];c[z>>2]=c[y>>2];c[z+4>>2]=c[y+4>>2];c[z+8>>2]=c[y+8>>2];c[z+12>>2]=c[y+12>>2];E=d+1|0;if((E|0)<4){d=E}else{C=8;break}}if((C|0)==8){c[n>>2]=o;i=k;return}}function rh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0;j=i;i=i+80|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;if(f>4.0){l=f*.25*.35}else{l=.35}f=+h[d+8>>3];e=l*f;m=+h[d>>3];n=l*m;l=+h[b>>3];o=m+l;m=+h[b+8>>3];p=f+m;d=k+64|0;if((g&32|0)==0){h[k+64>>3]=o;h[k+72>>3]=p;q=k;c[q>>2]=c[d>>2];c[q+4>>2]=c[d+4>>2];c[q+8>>2]=c[d+8>>2];c[q+12>>2]=c[d+12>>2];h[k+16>>3]=e+o;h[k+24>>3]=p-n;q=k+32|0;r=b;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h[k+48>>3]=o-e;h[k+56>>3]=n+p}else{r=b;c[d>>2]=c[r>>2];c[d+4>>2]=c[r+4>>2];c[d+8>>2]=c[r+8>>2];c[d+12>>2]=c[r+12>>2];d=k;c[d>>2]=c[r>>2];c[d+4>>2]=c[r+4>>2];c[d+8>>2]=c[r+8>>2];c[d+12>>2]=c[r+12>>2];h[k+16>>3]=e+l;h[k+24>>3]=m-n;h[k+32>>3]=o;h[k+40>>3]=p;h[k+48>>3]=l-e;h[k+56>>3]=n+m}if((g&64|0)!=0){rB(a,k|0,3,g>>>4&1^1);i=j;return}if((g&128|0)==0){rB(a,k+16|0,3,g>>>4&1^1);i=j;return}else{rB(a,k+32|0,3,g>>>4&1^1);i=j;return}}function sh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0;j=i;i=i+144|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;l=e*4.0;do{if(l<f){if((g&32|0)==0){m=.45;break}m=f/l*.45}else{m=.45}}while(0);n=g&32;do{if(f>1.0){if((n|0)==0){o=0.0;p=0;break}o=(f+-1.0)*.05/e;p=n}else{o=0.0;p=n}}while(0);e=+h[d+8>>3];f=-0.0-e;l=m*f;q=+h[d>>3];r=m*q;m=o*f;f=o*q;o=+h[b>>3];s=q+o;t=+h[b+8>>3];u=e+t;v=o+q*.5;q=e*.5+t;d=k|0;n=k+128|0;if((p|0)==0){h[k+128>>3]=s;h[k+136>>3]=u;p=k;c[p>>2]=c[n>>2];c[p+4>>2]=c[n+4>>2];c[p+8>>2]=c[n+8>>2];c[p+12>>2]=c[n+12>>2];h[k+16>>3]=o-l;h[k+24>>3]=t-r;h[k+32>>3]=v-m;h[k+40>>3]=q-f;h[k+48>>3]=o;h[k+56>>3]=t;p=k+64|0;w=b;c[p>>2]=c[w>>2];c[p+4>>2]=c[w+4>>2];c[p+8>>2]=c[w+8>>2];c[p+12>>2]=c[w+12>>2];h[k+80>>3]=o;h[k+88>>3]=t;h[k+96>>3]=m+v;h[k+104>>3]=f+q;h[k+112>>3]=l+o;h[k+120>>3]=r+t}else{w=b;c[n>>2]=c[w>>2];c[n+4>>2]=c[w+4>>2];c[n+8>>2]=c[w+8>>2];c[n+12>>2]=c[w+12>>2];n=k;c[n>>2]=c[w>>2];c[n+4>>2]=c[w+4>>2];c[n+8>>2]=c[w+8>>2];c[n+12>>2]=c[w+12>>2];h[k+16>>3]=s-l;h[k+24>>3]=u-r;h[k+32>>3]=v-m;h[k+40>>3]=q-f;h[k+48>>3]=s-m;h[k+56>>3]=u-f;h[k+64>>3]=s;h[k+72>>3]=u;h[k+80>>3]=m+s;h[k+88>>3]=f+u;h[k+96>>3]=m+v;h[k+104>>3]=f+q;h[k+112>>3]=l+s;h[k+120>>3]=r+u}if((g&64|0)!=0){rB(a,d,6,1);i=j;return}if((g&128|0)==0){rB(a,d,9,1);i=j;return}else{rB(a,k+48|0,6,1);i=j;return}}function th(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;j=i;i=i+64|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;f=+h[d+8>>3];e=+h[d>>3];l=+h[b>>3];m=e+l;n=+h[b+8>>3];o=f+n;p=l+e*.2;q=f*.2+n;r=l+e*.6;l=f*.6+n;d=k|0;s=k|0;h[s>>3]=p-f;t=k+8|0;h[t>>3]=e+q;u=k+16|0;h[u>>3]=f+p;v=k+24|0;h[v>>3]=q-e;w=k+32|0;h[w>>3]=f+r;x=k+40|0;h[x>>3]=l-e;y=k+48|0;h[y>>3]=r-f;z=k+56|0;h[z>>3]=e+l;do{if((g&64|0)==0){if((g&128|0)==0){break}h[u>>3]=p;h[v>>3]=q;h[w>>3]=r;h[x>>3]=l}else{h[s>>3]=p;h[t>>3]=q;h[y>>3]=r;h[z>>3]=l}}while(0);rB(a,d,4,1);z=k;k=b;c[z>>2]=c[k>>2];c[z+4>>2]=c[k+4>>2];c[z+8>>2]=c[k+8>>2];c[z+12>>2]=c[k+12>>2];h[u>>3]=m;h[v>>3]=o;uB(a,d,2);i=j;return}function uh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;j=i;i=i+64|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;f=+h[d+8>>3];e=f*-.4;l=+h[d>>3];m=l*.4;n=+h[b>>3];o=n+l*.8;p=+h[b+8>>3];q=f*.8+p;r=l+n;l=f+p;d=k|0;s=k|0;h[s>>3]=e+n;t=k+8|0;h[t>>3]=m+p;u=k+16|0;h[u>>3]=n-e;v=k+24|0;h[v>>3]=p-m;w=k+32|0;h[w>>3]=o-e;x=k+40|0;h[x>>3]=q-m;y=k+48|0;h[y>>3]=e+o;z=k+56|0;h[z>>3]=m+q;do{if((g&64|0)==0){if((g&128|0)==0){break}A=u;B=b;c[A>>2]=c[B>>2];c[A+4>>2]=c[B+4>>2];c[A+8>>2]=c[B+8>>2];c[A+12>>2]=c[B+12>>2];h[w>>3]=o;h[x>>3]=q}else{B=k;A=b;c[B>>2]=c[A>>2];c[B+4>>2]=c[A+4>>2];c[B+8>>2]=c[A+8>>2];c[B+12>>2]=c[A+12>>2];h[y>>3]=o;h[z>>3]=q}}while(0);rB(a,d,4,g>>>4&1^1);h[s>>3]=o;h[t>>3]=q;h[k+16>>3]=r;h[v>>3]=l;uB(a,d,2);i=j;return}function vh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0;j=i;i=i+80|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;f=+h[d+8>>3];e=(-0.0-f)/3.0;l=+h[d>>3];m=l/3.0;n=+h[b>>3];o=l*.5+n;p=+h[b+8>>3];q=f*.5+p;d=k|0;h[k+64>>3]=l+n;h[k+72>>3]=f+p;r=k;s=k+64|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];h[k+16>>3]=e+o;h[k+24>>3]=m+q;s=k+32|0;r=s;t=b;c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];h[k+48>>3]=o-e;h[k+56>>3]=q-m;if((g&64|0)!=0){rB(a,s,3,g>>>4&1^1);i=j;return}s=g>>>4&1^1;if((g&128|0)==0){rB(a,d,4,s);i=j;return}else{rB(a,d,3,s);i=j;return}}function wh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0.0,m=0.0;j=i;i=i+32|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;f=+h[d>>3];e=+h[d+8>>3];l=+T(f*f+e*e)*.5;m=f*.5+ +h[b>>3];h[k>>3]=m-l;f=+h[b+8>>3]+e*.5;h[k+8>>3]=f-l;h[k+16>>3]=l+m;h[k+24>>3]=l+f;qB(a,k|0,2,g>>>4&1^1);i=j;return}function xh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0;j=i;i=i+128|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;l=j+64|0;if(f>4.0){m=f*.5*.25}else{m=.5}f=+h[b>>3];e=+h[d>>3];n=+h[b+8>>3];o=+h[d+8>>3];p=m*o;q=m*e;d=l;r=b;c[d>>2]=c[r>>2];c[d+4>>2]=c[r+4>>2];c[d+8>>2]=c[r+8>>2];c[d+12>>2]=c[r+12>>2];h[l+16>>3]=f+e;h[l+24>>3]=n+o;r=k|0;h[k>>3]=q+(f-p);o=p+(q+n);h[k+8>>3]=o;h[k+48>>3]=q+(p+f);e=p+(n-q);h[k+56>>3]=e;n=p*-.95;m=q*4.0/3.0;h[k+16>>3]=q+(n+f)-m;s=p*4.0/3.0;h[k+24>>3]=o-s;h[k+32>>3]=q+(f-n)-m;h[k+40>>3]=e-s;uB(a,l|0,2);if((g&64|0)!=0){Qm(j+96|0,r,3,.5,0,r);tB(a,r,4,0,0,0);i=j;return}if((g&128|0)==0){tB(a,r,4,0,0,0);i=j;return}Qm(j+112|0,r,3,.5,r,0);tB(a,r,4,0,0,0);i=j;return}function yh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0;g=i;i=i+32|0;j=b;b=i;i=i+16|0;c[b>>2]=c[j>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];c[b+12>>2]=c[j+12>>2];j=d;d=i;i=i+16|0;c[d>>2]=c[j>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];c[d+12>>2]=c[j+12>>2];j=g|0;f=+h[b>>3]+ +h[d>>3];e=+h[b+8>>3]+ +h[d+8>>3];d=j;k=b;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];h[j+16>>3]=f;h[j+24>>3]=e;uB(a,j|0,2);i=g;return}function zh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=xF(b|0)|0;do{if((d|0)<(c[45230]|0)){e=c[45228]|0}else{f=d+11|0;c[45230]=f;g=mk(c[45228]|0,f)|0;c[45228]=g;if((g|0)==0){h=0}else{e=g;break}return h|0}}while(0);d=a[b]|0;if(d<<24>>24==0){i=e}else{g=e;e=b;b=d;while(1){d=e+1|0;f=b&255;if((xb(f|0)|0)==0){j=b}else{j=(yF(f|0)|0)&255}f=g+1|0;a[g]=j;k=a[d]|0;if(k<<24>>24==0){i=f;break}else{g=f;e=d;b=k}}}a[i]=0;h=c[45228]|0;return h|0}function Ah(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;g=i;i=i+72|0;j=g|0;k=g+16|0;l=g+24|0;m=g+32|0;n=g+40|0;o=g+48|0;p=g+56|0;q=g+64|0;c[e+32>>2]=f;r=b;while(1){s=r+1|0;if((a[r]|0)==32){r=s}else{break}}c[q>>2]=255;b=a[r]|0;do{if(b<<24>>24==35){t=ac(r|0,127384,(u=i,i=i+32|0,c[u>>2]=n,c[u+8>>2]=o,c[u+16>>2]=p,c[u+24>>2]=q,u)|0)|0;i=u;if((t|0)<=2){v=a[r]|0;break}switch(f|0){case 0:{w=+((c[n>>2]|0)>>>0>>>0)/255.0;x=+((c[o>>2]|0)>>>0>>>0)/255.0;y=+((c[p>>2]|0)>>>0>>>0)/255.0;A=+((c[q>>2]|0)>>>0>>>0)/255.0;B=x<y?x:y;C=x>y?x:y;D=C<w?w:C;do{if(D>0.0){C=D-(B>w?w:B);E=C/D;if(E<=0.0){F=0.0;G=E;break}H=(D-w)/C;I=(D-x)/C;J=(D-y)/C;do{if(D==w){K=J-I}else{if(D==x){K=H+2.0-J;break}if(D!=y){K=0.0;break}K=I+4.0-H}}while(0);H=K*60.0;if(H>=0.0){F=H;G=E;break}F=H+360.0;G=E}else{F=0.0;G=0.0}}while(0);y=F/360.0;h[k>>3]=y;h[m>>3]=D;h[l>>3]=G;h[e>>3]=y;h[e+8>>3]=G;h[e+16>>3]=D;h[e+24>>3]=A;L=0;i=g;return L|0};case 2:{t=e;c[e>>2]=(((c[n>>2]|0)*65535|0)>>>0)/255|0;c[t+4>>2]=(((c[o>>2]|0)*65535|0)>>>0)/255|0;c[e+8>>2]=(((c[p>>2]|0)*65535|0)>>>0)/255|0;c[t+12>>2]=(((c[q>>2]|0)*65535|0)>>>0)/255|0;L=0;i=g;return L|0};case 4:{h[e>>3]=+((c[n>>2]|0)>>>0>>>0)/255.0;h[e+8>>3]=+((c[o>>2]|0)>>>0>>>0)/255.0;h[e+16>>3]=+((c[p>>2]|0)>>>0>>>0)/255.0;h[e+24>>3]=+((c[q>>2]|0)>>>0>>>0)/255.0;L=0;i=g;return L|0};case 3:{y=1.0- +((c[n>>2]|0)>>>0>>>0)/255.0;x=1.0- +((c[o>>2]|0)>>>0>>>0)/255.0;w=1.0- +((c[p>>2]|0)>>>0>>>0)/255.0;B=y<x?y:x;H=w<B?w:B;t=e;a[e]=~~(y-H)*255|0;a[t+1|0]=~~(x-H)*255|0;a[t+2|0]=~~(w-H)*255|0;a[t+3|0]=~~H*255|0;L=0;i=g;return L|0};case 1:{t=e;a[e]=c[n>>2];a[t+1|0]=c[o>>2];a[t+2|0]=c[p>>2];a[t+3|0]=c[q>>2];L=0;i=g;return L|0};default:{L=0;i=g;return L|0}}}else{v=b}}while(0);if(v<<24>>24==46){M=24}else{if(((v&255)-48|0)>>>0<10>>>0){M=24}else{N=v}}do{if((M|0)==24){v=xF(r|0)|0;do{if((v|0)<(c[45204]|0)){O=c[45202]|0;P=r}else{b=v+11|0;c[45204]=b;q=mk(c[45202]|0,b)|0;c[45202]=q;if((q|0)==0){L=-1}else{O=q;P=r;break}i=g;return L|0}}while(0);while(1){v=P+1|0;q=a[P]|0;if((q<<24>>24|0)==0){break}else if((q<<24>>24|0)==44){Q=32}else{Q=q}a[O]=Q;O=O+1|0;P=v}a[O]=0;v=ac(c[45202]|0,159488,(u=i,i=i+24|0,c[u>>2]=k,c[u+8>>2]=l,c[u+16>>2]=m,u)|0)|0;i=u;if((v|0)!=3){N=a[r]|0;break}A=+h[k>>3];D=A<1.0?A:1.0;A=D>0.0?D:0.0;h[k>>3]=A;D=+h[l>>3];G=D<1.0?D:1.0;D=G>0.0?G:0.0;h[l>>3]=D;G=+h[m>>3];F=G<1.0?G:1.0;G=F>0.0?F:0.0;h[m>>3]=G;switch(f|0){case 2:{a:do{if(D>0.0){F=A<1.0?A*6.0:0.0;v=~~F;K=F- +(v|0);F=G*(1.0-D);H=G*(1.0-D*K);w=G*(1.0-D*(1.0-K));switch(v|0){case 3:{R=G;S=H;T=F;break a;break};case 4:{R=G;S=F;T=w;break a;break};case 0:{R=F;S=w;T=G;break a;break};case 1:{R=F;S=G;T=H;break a;break};case 2:{R=w;S=G;T=F;break a;break};case 5:{R=H;S=F;T=G;break a;break};default:{R=0.0;S=0.0;T=0.0;break a}}}else{R=G;S=G;T=G}}while(0);v=e;c[e>>2]=~~(T*65535.0);c[v+4>>2]=~~(S*65535.0);c[e+8>>2]=~~(R*65535.0);c[v+12>>2]=65535;L=0;i=g;return L|0};case 1:{b:do{if(D>0.0){F=A<1.0?A*6.0:0.0;v=~~F;H=F- +(v|0);F=G*(1.0-D);w=G*(1.0-D*H);K=G*(1.0-D*(1.0-H));switch(v|0){case 2:{U=K;V=G;W=F;break b;break};case 1:{U=F;V=G;W=w;break b;break};case 4:{U=G;V=F;W=K;break b;break};case 3:{U=G;V=w;W=F;break b;break};case 0:{U=F;V=K;W=G;break b;break};case 5:{U=w;V=F;W=G;break b;break};default:{U=0.0;V=0.0;W=0.0;break b}}}else{U=G;V=G;W=G}}while(0);v=e;a[e]=~~(W*255.0);a[v+1|0]=~~(V*255.0);a[v+2|0]=~~(U*255.0);a[v+3|0]=-1;L=0;i=g;return L|0};case 3:{c:do{if(D>0.0){F=A<1.0?A*6.0:0.0;v=~~F;w=F- +(v|0);F=G*(1.0-D);K=G*(1.0-D*w);H=G*(1.0-D*(1.0-w));switch(v|0){case 2:{X=H;Y=G;Z=F;break c;break};case 4:{X=G;Y=F;Z=H;break c;break};case 1:{X=F;Y=G;Z=K;break c;break};case 5:{X=K;Y=F;Z=G;break c;break};case 0:{X=F;Y=H;Z=G;break c;break};case 3:{X=G;Y=K;Z=F;break c;break};default:{X=0.0;Y=0.0;Z=0.0;break c}}}else{X=G;Y=G;Z=G}}while(0);F=1.0-Z;K=1.0-Y;H=1.0-X;w=F<K?F:K;x=H<w?H:w;v=e;a[e]=~~(F-x)*255|0;a[v+1|0]=~~(K-x)*255|0;a[v+2|0]=~~(H-x)*255|0;a[v+3|0]=~~x*255|0;L=0;i=g;return L|0};case 4:{d:do{if(D>0.0){x=A<1.0?A*6.0:0.0;v=~~x;H=x- +(v|0);x=G*(1.0-D);K=G*(1.0-D*H);F=G*(1.0-D*(1.0-H));switch(v|0){case 1:{_=x;$=G;aa=K;break d;break};case 4:{_=G;$=x;aa=F;break d;break};case 5:{_=K;$=x;aa=G;break d;break};case 0:{_=x;$=F;aa=G;break d;break};case 2:{_=F;$=G;aa=x;break d;break};case 3:{_=G;$=K;aa=x;break d;break};default:{_=0.0;$=0.0;aa=0.0;break d}}}else{_=G;$=G;aa=G}}while(0);h[e>>3]=aa;h[e+8>>3]=$;h[e+16>>3]=_;h[e+24>>3]=1.0;L=0;i=g;return L|0};case 0:{h[e>>3]=A;h[e+8>>3]=D;h[e+16>>3]=G;h[e+24>>3]=1.0;L=0;i=g;return L|0};default:{L=0;i=g;return L|0}}}}while(0);do{if(N<<24>>24==98){ba=r}else{if((Za(s|0,122280,4)|0)==0|N<<24>>24==119){ba=r;break}if((Za(s|0,122216,4)|0)==0|N<<24>>24==108){ba=r;break}if((Za(s|0,122200,8)|0)==0){ba=r;break}e:do{if(N<<24>>24==47){m=gb(s|0,47)|0;if((m|0)==0){ca=s;break}if((a[s]|0)!=47){l=(qm(122192,s,4)|0)==0;ca=l?m+1|0:r;break}m=c[45206]|0;do{if((m|0)!=0){if((a[m]|0)==0){break}if((qm(122192,m,3)|0)==0){break}l=r+2|0;k=xF(m|0)|0;O=(xF(l|0)|0)+k|0;if((O+3|0)<(c[44758]|0)){da=c[44756]|0}else{k=O+13|0;c[44758]=k;O=mk(c[44756]|0,k)|0;c[44756]=O;da=O}nb(da|0,122184,(u=i,i=i+16|0,c[u>>2]=m,c[u+8>>2]=l,u)|0)|0;i=u;ca=c[44756]|0;break e}}while(0);ca=r+2|0}else{m=c[45206]|0;if((m|0)==0){ca=r;break}if((a[m]|0)==0){ca=r;break}if((qm(122192,m,3)|0)==0){ca=r;break}l=xF(m|0)|0;O=(xF(r|0)|0)+l|0;if((O+3|0)<(c[44758]|0)){ea=c[44756]|0}else{l=O+13|0;c[44758]=l;O=mk(c[44756]|0,l)|0;c[44756]=O;ea=O}nb(ea|0,122184,(u=i,i=i+16|0,c[u>>2]=m,c[u+8>>2]=r,u)|0)|0;i=u;ca=c[44756]|0}}while(0);m=xF(ca|0)|0;do{if((m|0)<(c[45230]|0)){fa=c[45228]|0}else{O=m+11|0;c[45230]=O;l=mk(c[45228]|0,O)|0;c[45228]=l;if((l|0)!=0){fa=l;break}c[j>>2]=0;L=-1;i=g;return L|0}}while(0);m=a[ca]|0;if(m<<24>>24==0){ga=fa}else{l=fa;O=ca;k=m;while(1){m=O+1|0;P=k&255;if((xb(P|0)|0)==0){ha=k}else{ha=(yF(P|0)|0)&255}P=l+1|0;a[l]=ha;Q=a[m]|0;if(Q<<24>>24==0){ga=P;break}else{l=P;O=m;k=Q}}}a[ga]=0;ba=c[45228]|0}}while(0);c[j>>2]=ba;if((ba|0)==0){L=-1;i=g;return L|0}ga=c[45200]|0;do{if((ga|0)==0){M=106}else{ha=c[ga>>2]|0;if((a[ha]|0)!=(a[ba]|0)){M=106;break}if((Ya(ha|0,ba|0)|0)==0){ia=ga}else{M=106}}}while(0);if((M|0)==106){M=vb(j|0,40448,2491,12,44)|0;c[45200]=M;ia=M}if((ia|0)==0){switch(f|0){case 3:{M=e;z=0;a[M]=z;z=z>>8;a[M+1|0]=z;z=z>>8;a[M+2|0]=z;z=z>>8;a[M+3|0]=z;L=1;i=g;return L|0};case 2:{M=e;c[e+8>>2]=0;c[M+4>>2]=0;c[e>>2]=0;c[M+12>>2]=65535;L=1;i=g;return L|0};case 4:{vF(e|0,0,24)|0;h[e+24>>3]=1.0;L=1;i=g;return L|0};case 0:{vF(e|0,0,24)|0;h[e+24>>3]=1.0;L=1;i=g;return L|0};case 1:{M=e;a[M+2|0]=0;a[M+1|0]=0;a[e]=0;a[M+3|0]=-1;L=1;i=g;return L|0};default:{L=1;i=g;return L|0}}}else{switch(f|0){case 0:{h[e>>3]=+((d[ia+4|0]|0)>>>0)/255.0;h[e+8>>3]=+((d[ia+5|0]|0)>>>0)/255.0;h[e+16>>3]=+((d[ia+6|0]|0)>>>0)/255.0;h[e+24>>3]=+((d[ia+10|0]|0)>>>0)/255.0;L=0;i=g;return L|0};case 1:{f=e;a[e]=a[ia+7|0]|0;a[f+1|0]=a[(c[45200]|0)+8|0]|0;a[f+2|0]=a[(c[45200]|0)+9|0]|0;a[f+3|0]=a[(c[45200]|0)+10|0]|0;L=0;i=g;return L|0};case 3:{G=1.0- +(d[ia+7|0]|0)/255.0;D=1.0- +(d[ia+8|0]|0)/255.0;A=1.0- +(d[ia+9|0]|0)/255.0;E=G<D?G:D;_=A<E?A:E;f=e;a[e]=~~(G-_)*255|0;a[f+1|0]=~~(D-_)*255|0;a[f+2|0]=~~(A-_)*255|0;a[f+3|0]=~~_*255|0;L=0;i=g;return L|0};case 2:{f=e;c[e>>2]=(((d[ia+7|0]|0)*65535|0)>>>0)/255|0;c[f+4>>2]=(((d[(c[45200]|0)+8|0]|0)*65535|0)>>>0)/255|0;c[e+8>>2]=(((d[(c[45200]|0)+9|0]|0)*65535|0)>>>0)/255|0;c[f+12>>2]=(((d[(c[45200]|0)+10|0]|0)*65535|0)>>>0)/255|0;L=0;i=g;return L|0};case 4:{h[e>>3]=+(d[ia+7|0]|0)/255.0;h[e+8>>3]=+(d[ia+8|0]|0)/255.0;h[e+16>>3]=+(d[ia+9|0]|0)/255.0;h[e+24>>3]=+(d[ia+10|0]|0)/255.0;L=0;i=g;return L|0};default:{L=0;i=g;return L|0}}}return 0}function Bh(a,b){a=a|0;b=b|0;return pm(c[a>>2]|0,c[b>>2]|0)|0}function Ch(a){a=a|0;c[45206]=a;return}function Dh(a,b,d,e,f){a=a|0;b=+b;d=+d;e=+e;f=+f;var g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,U=0,Y=0,Z=0,_=0,ba=0,ca=0,da=0.0,ea=0,fa=0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0,wa=0,xa=0,ya=0.0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0;g=i;j=a;a=i;i=i+16|0;c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];k=+h[a>>3];l=+h[a+8>>3];m=+$(+(+W(e)/d),+(+V(e)/b));n=+$(+(+W(f)/d),+(+V(f)/b));o=n- +R((n-m)/6.283185307179586)*6.283185307179586;do{if(f-e>3.141592653589793){if(o-m>=3.141592653589793){p=o;break}p=o+6.283185307179586}else{p=o}}while(0);o=+V(m);e=o*b;f=+W(m);n=f*d;q=k+e-n*0.0;r=n+(l+e*0.0);e=d/b;a=jk(8)|0;n=p-m;j=e<.25?70344:70600;s=j+160|0;t=j+192|0;u=j+168|0;v=j+128|0;w=j+32|0;x=j+224|0;y=j+200|0;z=j+136|0;A=j+64|0;B=j+40|0;C=j|0;D=j+232|0;E=j+184|0;F=j+176|0;G=j+96|0;H=j+72|0;I=j+8|0;J=j+216|0;K=j+208|0;L=j+152|0;M=j+144|0;N=j+104|0;O=j+56|0;P=j+48|0;Q=j+248|0;S=j+240|0;U=j+88|0;Y=j+80|0;Z=j+24|0;_=j+16|0;ba=j+120|0;ca=j+112|0;p=(e*(e*.001+4.98)+.207)/(e+.0067)*b;j=1;da=n;while(1){if(da>1.5707963267948966){ea=1}else{if((j|0)<=0){fa=7;break}ga=(e*(e*+h[s>>3]+ +h[u>>3])+ +h[F>>3])/(e+ +h[E>>3]);ha=(e*(e*+h[t>>3]+ +h[y>>3])+ +h[K>>3])/(e+ +h[J>>3]);ia=(e*(e*+h[v>>3]+ +h[z>>3])+ +h[M>>3])/(e+ +h[L>>3]);ja=(e*(e*+h[w>>3]+ +h[B>>3])+ +h[P>>3])/(e+ +h[O>>3]);ka=(e*(e*+h[x>>3]+ +h[D>>3])+ +h[S>>3])/(e+ +h[Q>>3]);la=(e*(e*+h[A>>3]+ +h[H>>3])+ +h[Y>>3])/(e+ +h[U>>3]);ma=(e*(e*+h[C>>3]+ +h[I>>3])+ +h[_>>3])/(e+ +h[Z>>3]);na=(e*(e*+h[G>>3]+ +h[N>>3])+ +h[ca>>3])/(e+ +h[ba>>3]);oa=0;pa=m;while(1){qa=da+pa;ra=(pa+qa)*.5;sa=+V(ra*2.0);ta=+V(ra*4.0);ua=+V(ra*6.0);va=p*+aa(la*ta+(ma+ja*sa)+na*ua+(qa-pa)*(ha*ta+(ia+ga*sa)+ka*ua))<=1.0e-5;wa=oa+1|0;if(va&(wa|0)<(j|0)){oa=wa;pa=qa}else{break}}ea=va^1}oa=j<<1;pa=n/+(oa|0);if(ea&(oa|0)<1024){j=oa;da=pa}else{xa=oa;ya=pa;break}}if((fa|0)==7){fa=j<<1;xa=fa;ya=n/+(fa|0)}fa=a;n=f*b;f=o*d;c[45232]=100;j=jk(1600)|0;ea=a;c[ea>>2]=j;h[j>>3]=k;h[(c[ea>>2]|0)+8>>3]=l;j=a+4|0;c[j>>2]=1;a=c[ea>>2]|0;o=+h[a>>3];da=+h[a+8>>3];va=c[45232]|0;if((va|0)>4){za=1;Aa=a}else{c[45232]=va<<1;a=gF(c[ea>>2]|0,va<<5)|0;c[ea>>2]=a;za=c[j>>2]|0;Aa=a}h[Aa+(za<<4)>>3]=o;za=c[j>>2]|0;c[j>>2]=za+1;h[(c[ea>>2]|0)+(za<<4)+8>>3]=da;h[(c[ea>>2]|0)+(c[j>>2]<<4)>>3]=q;za=c[j>>2]|0;c[j>>2]=za+1;h[(c[ea>>2]|0)+(za<<4)+8>>3]=r;h[(c[ea>>2]|0)+(c[j>>2]<<4)>>3]=q;za=c[j>>2]|0;c[j>>2]=za+1;h[(c[ea>>2]|0)+(za<<4)+8>>3]=r;da=+X(ya*.5);o=+W(ya)*(+T(da*da*3.0+4.0)+-1.0)/3.0;if((xa|0)>0){da=-0.0-n-f*0.0;p=f+n*-0.0;n=r;r=q;za=0;q=m;while(1){m=ya+q;f=+V(m);e=+W(m);pa=f*b;ka=e*d;ga=e*b;e=f*d;f=k+pa-ka*0.0;ia=ka+(l+pa*0.0);pa=-0.0-ga-e*0.0;ka=e+ga*-0.0;Aa=c[j>>2]|0;a=c[45232]|0;if((Aa+3|0)<(a|0)){Ba=Aa;Ca=c[ea>>2]|0}else{c[45232]=a<<1;Aa=gF(c[ea>>2]|0,a<<5)|0;c[ea>>2]=Aa;Ba=c[j>>2]|0;Ca=Aa}h[Ca+(Ba<<4)>>3]=r+o*da;Aa=c[j>>2]|0;c[j>>2]=Aa+1;h[(c[ea>>2]|0)+(Aa<<4)+8>>3]=n+o*p;h[(c[ea>>2]|0)+(c[j>>2]<<4)>>3]=f-o*pa;Aa=c[j>>2]|0;c[j>>2]=Aa+1;h[(c[ea>>2]|0)+(Aa<<4)+8>>3]=ia-o*ka;h[(c[ea>>2]|0)+(c[j>>2]<<4)>>3]=f;Aa=c[j>>2]|0;c[j>>2]=Aa+1;h[(c[ea>>2]|0)+(Aa<<4)+8>>3]=ia;Aa=za+1|0;if((Aa|0)<(xa|0)){da=pa;p=ka;n=ia;r=f;za=Aa;q=m}else{break}}}za=c[ea>>2]|0;q=+h[za>>3];r=+h[za+8>>3];xa=c[j>>2]|0;Ba=xa-1|0;n=+h[za+(Ba<<4)>>3];p=+h[za+(Ba<<4)+8>>3];Ba=c[45232]|0;if((xa+3|0)<(Ba|0)){Da=xa;Ea=za;Fa=Ea+(Da<<4)|0;h[Fa>>3]=n;Ga=c[j>>2]|0;Ha=Ga+1|0;c[j>>2]=Ha;Ia=c[ea>>2]|0;Ja=Ia+(Ga<<4)+8|0;h[Ja>>3]=p;Ka=c[j>>2]|0;La=c[ea>>2]|0;Ma=La+(Ka<<4)|0;h[Ma>>3]=q;Na=c[j>>2]|0;Oa=Na+1|0;c[j>>2]=Oa;Pa=c[ea>>2]|0;Qa=Pa+(Na<<4)+8|0;h[Qa>>3]=r;Ra=c[j>>2]|0;Sa=c[ea>>2]|0;Ta=Sa+(Ra<<4)|0;h[Ta>>3]=q;Ua=c[j>>2]|0;Va=Ua+1|0;c[j>>2]=Va;Wa=c[ea>>2]|0;Xa=Wa+(Ua<<4)+8|0;h[Xa>>3]=r;Ya=c[ea>>2]|0;Za=Ya;_a=c[j>>2]|0;$a=_a<<4;ab=gF(Za,$a)|0;bb=ab;c[ea>>2]=bb;c[45232]=0;i=g;return fa|0}c[45232]=Ba<<1;za=gF(c[ea>>2]|0,Ba<<5)|0;c[ea>>2]=za;Da=c[j>>2]|0;Ea=za;Fa=Ea+(Da<<4)|0;h[Fa>>3]=n;Ga=c[j>>2]|0;Ha=Ga+1|0;c[j>>2]=Ha;Ia=c[ea>>2]|0;Ja=Ia+(Ga<<4)+8|0;h[Ja>>3]=p;Ka=c[j>>2]|0;La=c[ea>>2]|0;Ma=La+(Ka<<4)|0;h[Ma>>3]=q;Na=c[j>>2]|0;Oa=Na+1|0;c[j>>2]=Oa;Pa=c[ea>>2]|0;Qa=Pa+(Na<<4)+8|0;h[Qa>>3]=r;Ra=c[j>>2]|0;Sa=c[ea>>2]|0;Ta=Sa+(Ra<<4)|0;h[Ta>>3]=q;Ua=c[j>>2]|0;Va=Ua+1|0;c[j>>2]=Va;Wa=c[ea>>2]|0;Xa=Wa+(Ua<<4)+8|0;h[Xa>>3]=r;Ya=c[ea>>2]|0;Za=Ya;_a=c[j>>2]|0;$a=_a<<4;ab=gF(Za,$a)|0;bb=ab;c[ea>>2]=bb;c[45232]=0;i=g;return fa|0}function Eh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=b|0;b=ew(e,122168)|0;do{if((b|0)==0){f=0}else{if((a[b]|0)==0){f=0;break}g=Gn(b,0,120)|0;if((g|0)!=0){f=g;break}g=$w(e)|0;Fv(0,158584,(h=i,i=i+8|0,c[h>>2]=g,h)|0)|0;i=h;Fv(3,128528,(h=i,i=i+8|0,c[h>>2]=b,h)|0)|0;i=h;f=0}}while(0);i=d;return f|0}function Fh(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=jk(304)|0;e=d;if((d|0)==0){Fv(1,115680,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f}f=a+16|0;a=c[f>>2]|0;c[d>>2]=a;c[f>>2]=e;if((a|0)==0){c[d+144>>2]=3;c[d+148>>2]=0;h[d+152>>3]=1.0;i=b;return e|0}else{f=d+16|0;g=a+16|0;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];c[f+16>>2]=c[g+16>>2];c[f+20>>2]=c[g+20>>2];c[f+24>>2]=c[g+24>>2];c[f+28>>2]=c[g+28>>2];c[f+32>>2]=c[g+32>>2];c[f+36>>2]=c[g+36>>2];g=d+56|0;f=a+56|0;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];c[g+16>>2]=c[f+16>>2];c[g+20>>2]=c[f+20>>2];c[g+24>>2]=c[f+24>>2];c[g+28>>2]=c[f+28>>2];c[g+32>>2]=c[f+32>>2];c[g+36>>2]=c[f+36>>2];c[d+144>>2]=c[a+144>>2];c[d+148>>2]=c[a+148>>2];h[d+152>>3]=+h[a+152>>3];c[d+136>>2]=c[a+136>>2];f=d+96|0;d=a+96|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];c[f+16>>2]=c[d+16>>2];c[f+20>>2]=c[d+20>>2];c[f+24>>2]=c[d+24>>2];c[f+28>>2]=c[d+28>>2];c[f+32>>2]=c[d+32>>2];c[f+36>>2]=c[d+36>>2];i=b;return e|0}return 0}function Gh(a){a=a|0;var b=0;b=a+16|0;a=c[b>>2]|0;if((a|0)==0){cc(108512,102832,116,170080)}else{eF(c[a+212>>2]|0);eF(c[a+208>>2]|0);eF(c[a+216>>2]|0);eF(c[a+220>>2]|0);eF(c[a+224>>2]|0);eF(c[a+228>>2]|0);eF(c[a+232>>2]|0);eF(c[a+236>>2]|0);eF(c[a+240>>2]|0);eF(c[a+244>>2]|0);eF(c[a+248>>2]|0);eF(c[a+252>>2]|0);eF(c[a+256>>2]|0);eF(c[a+272>>2]|0);eF(c[a+284>>2]|0);eF(c[a+280>>2]|0);c[b>>2]=c[a>>2];eF(a);return}}function Hh(d,e,f,g,h,i,j){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0;k=c[d+16>>2]|0;l=c[d+152>>2]|0;if(!((l&32768|0)==0|(e|0)==0)){c[k+192>>2]=e}do{if((l&65536|0)==0){m=0}else{c[k+212>>2]=fk(i,j)|0;if((f|0)==0){m=0;break}if((a[f]|0)==0){m=0;break}c[k+208>>2]=fk(f,j)|0;m=1}}while(0);a:do{if((l&4194304|0)==0){n=m}else{do{if((g|0)!=0){if((a[g]|0)==0){break}c[k+228>>2]=fk(g,j)|0;f=k+260|0;b[f>>1]=b[f>>1]|1;n=1;break a}}while(0);f=c[k+192>>2]|0;if((f|0)==0){n=m;break}c[k+228>>2]=Lb(f|0)|0;n=1}}while(0);if((l&8388608|0)==0|(h|0)==0){o=n;return o|0}if((a[h]|0)==0){o=n;return o|0}c[k+244>>2]=fk(h,j)|0;o=1;return o|0}function Ih(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+64|0;g=f|0;h=c[(c[b>>2]|0)+168>>2]|0;j=c[(c[(c[h+8>>2]|0)+8>>2]|0)+92>>2]|0;Jh(b,e);b=ew(d,97248)|0;do{if((b|0)!=0){if((a[b]|0)==0){break}Lv(e,b)|0;k=e+4|0;l=c[k>>2]|0;if(l>>>0<(c[e+8>>2]|0)>>>0){m=l}else{Jv(e,1)|0;m=c[k>>2]|0}a[m]=0;l=c[e>>2]|0;c[k>>2]=l;n=l;i=f;return n|0}}while(0);if(!((h|0)==(d|0)|(j|0)==0)){Lv(e,j)|0;j=e+4|0;m=c[j>>2]|0;if(m>>>0<(c[e+8>>2]|0)>>>0){o=m}else{Jv(e,1)|0;o=c[j>>2]|0}c[j>>2]=o+1;a[o]=95}o=Sx(d)|0;if((o|0)==0){p=(h|0)==(d|0)?91736:86520;q=(c[d>>2]|0)>>>4}else if((o|0)==2){p=167984;q=(c[d>>2]|0)>>>4}else if((o|0)==1){p=81736;q=(c[d>>2]|0)>>>4}else{p=0;q=0}Lv(e,p)|0;p=g|0;nb(p|0,163832,(g=i,i=i+8|0,c[g>>2]=q,g)|0)|0;i=g;Lv(e,p)|0;p=e+4|0;g=c[p>>2]|0;if(g>>>0<(c[e+8>>2]|0)>>>0){r=g}else{Jv(e,1)|0;r=c[p>>2]|0}a[r]=0;r=c[e>>2]|0;c[p>>2]=r;n=r;i=f;return n|0}function Jh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+128|0;f=e|0;g=c[b+160>>2]|0;do{if((g|0)>1){if((c[b+152>>2]&64|0)==0){break}Lv(d,c[(c[(c[b>>2]|0)+308>>2]|0)+(g<<2)>>2]|0)|0;h=d+4|0;j=c[h>>2]|0;if(j>>>0<(c[d+8>>2]|0)>>>0){k=j}else{Jv(d,1)|0;k=c[h>>2]|0}c[h>>2]=k+1;a[k]=95}}while(0);k=c[b+196>>2]|0;if((k|0)<=0){i=e;return}g=f|0;f=c[b+200>>2]|0;nb(g|0,159176,(b=i,i=i+16|0,c[b>>2]=k,c[b+8>>2]=f,b)|0)|0;i=b;Lv(d,g)|0;i=e;return}function Kh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0.0,v=0.0,w=0;e=i;i=i+24|0;f=e|0;j=e+8|0;k=+h[(c[a+16>>2]|0)+152>>3];l=Lh(d,0,f)|0;if((l-1|0)>>>0<2>>>0){i=e;return l|0}m=+h[b+16>>3];n=(+h[b>>3]+m)*.5;h[j>>3]=n;o=+h[b+24>>3];p=(+h[b+8>>3]+o)*.5;h[j+8>>3]=p;q=m-n;n=o-p;b=k>.5;if(b){xB(a,.5)}d=c[f>>2]|0;f=d+8|0;r=c[f>>2]|0;s=c[r>>2]|0;if((s|0)!=0){t=r;p=0.0;r=s;while(1){s=t+4|0;if(+g[s>>2]==0.0){u=p}else{nB(a,r);if((c[t+12>>2]|0)==0){v=6.283185307179586}else{v=p+ +g[s>>2]*6.283185307179586}s=Dh(j,q,n,p,v)|0;tB(a,c[s>>2]|0,c[s+4>>2]|0,0,0,1);YB(s);u=v}s=t+12|0;w=c[s>>2]|0;if((w|0)==0){break}else{t=s;p=u;r=w}}}if(b){xB(a,k)}eF(c[d+4>>2]|0);eF(c[f>>2]|0);eF(d);i=e;return l|0}function Lh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0.0,w=0,x=0.0,y=0,z=0.0,A=0.0,B=0,C=0.0,D=0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;f=i;i=i+8|0;h=f|0;j=jk(12)|0;k=j;l=Lb(b|0)|0;a:do{if((d|0)==0){m=1;n=l;while(1){o=a[n]|0;if((o<<24>>24|0)==0){p=m;break a}else if((o<<24>>24|0)==58){q=m+1|0}else{q=m}m=q;n=n+1|0}}else{p=d}}while(0);d=j+4|0;c[d>>2]=l;q=jk((p*12|0)+12|0)|0;p=j+8|0;c[p>>2]=q;n=La(l|0,87264)|0;b:do{if((n|0)==0){r=0;s=1.0;t=0;u=31}else{l=n;m=0;v=1.0;o=0;while(1){w=gb(l|0,59)|0;if((w|0)==0){x=0.0}else{y=w+1|0;a[w]=0;z=+sF(y,h);A=(c[h>>2]|0)==(y|0)|z<0.0?-1.0:z;if(A<0.0){u=18;break}else{x=A}}A=x-v;do{if(A>0.0){if(a[14800]|0){B=o;C=v;break}if(A<1.0e-5&A>-1.0e-5){B=o;C=v;break}Fv(0,160368,(D=i,i=i+8|0,c[D>>2]=b,D)|0)|0;i=D;a[14800]=1;B=3;C=v}else{B=o;C=x}}while(0);E=v-C;if(C>0.0){a[q+(m*12|0)+8|0]=1}if((a[l]|0)!=0){c[q+(m*12|0)>>2]=l}F=m+1|0;g[q+(m*12|0)+4>>2]=C;if(E<1.0e-5&E>-1.0e-5){G=F;H=B;break b}y=La(0,87264)|0;if((y|0)==0){break}else{l=y;m=F;v=E;o=B}}if((u|0)==18){if(a[14800]|0){I=1}else{Fv(1,159912,(D=i,i=i+8|0,c[D>>2]=b,D)|0)|0;i=D;a[14800]=1;I=2}eF(c[d>>2]|0);eF(c[p>>2]|0);eF(j);J=I;i=f;return J|0}if(E<=0.0){G=F;H=B;break}o=(m|0)>-1;if(o){K=0;L=0}else{r=B;s=E;t=F;u=31;break}do{L=(+g[q+(K*12|0)+4>>2]==0.0)+L|0;K=K+1|0;}while((K|0)<(F|0));if((L|0)<=0){r=B;s=E;t=F;u=31;break}if(!o){G=F;H=B;break}v=E/+(L|0);m=0;while(1){l=q+(m*12|0)+4|0;if(+g[l>>2]==0.0){g[l>>2]=v}l=m+1|0;if((l|0)<(F|0)){m=l}else{G=F;H=B;break}}}}while(0);if((u|0)==31){u=q+((t-1|0)*12|0)+4|0;g[u>>2]=s+ +g[u>>2];G=t;H=r}r=G;while(1){G=r-1|0;if((r|0)<=0){break}if(+g[q+(G*12|0)+4>>2]>0.0){break}else{r=G}}c[q+(r*12|0)>>2]=0;c[j>>2]=r;c[e>>2]=k;J=H;i=f;return J|0}function Mh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0.0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0.0;f=i;i=i+72|0;j=f|0;k=f+8|0;l=+h[(c[a+16>>2]|0)+152>>3];m=Lh(d,0,j)|0;if((m-1|0)>>>0<2>>>0){i=f;return m|0}d=k|0;if((e|0)==0){e=k;n=b;c[e>>2]=c[n>>2];c[e+4>>2]=c[n+4>>2];c[e+8>>2]=c[n+8>>2];c[e+12>>2]=c[n+12>>2];n=k+16|0;e=b+16|0;c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2];e=k+32|0;n=b+32|0;c[e>>2]=c[n>>2];c[e+4>>2]=c[n+4>>2];c[e+8>>2]=c[n+8>>2];c[e+12>>2]=c[n+12>>2];n=k+48|0;e=b+48|0;c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2]}else{e=k;n=b+32|0;c[e>>2]=c[n>>2];c[e+4>>2]=c[n+4>>2];c[e+8>>2]=c[n+8>>2];c[e+12>>2]=c[n+12>>2];n=k+16|0;e=b+48|0;c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2];e=k+32|0;n=b;c[e>>2]=c[n>>2];c[e+4>>2]=c[n+4>>2];c[e+8>>2]=c[n+8>>2];c[e+12>>2]=c[n+12>>2];n=k+48|0;e=b+16|0;c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2]}e=k+16|0;o=+h[e>>3];n=k|0;p=+h[n>>3];q=o-p;b=k+32|0;h[b>>3]=p;h[e>>3]=p;r=l>.5;if(r){xB(a,.5)}s=c[j>>2]|0;j=s+8|0;t=c[j>>2]|0;u=c[t>>2]|0;if((u|0)!=0){v=k+48|0;k=t;t=u;do{u=k+4|0;if(+g[u>>2]!=0.0){nB(a,t);if((c[k+12>>2]|0)==0){w=o}else{w=+h[n>>3]+q*+g[u>>2]}h[b>>3]=w;h[e>>3]=w;rB(a,d,4,1);p=+h[e>>3];h[v>>3]=p;h[n>>3]=p}k=k+12|0;t=c[k>>2]|0;}while((t|0)!=0)}if(r){xB(a,l)}eF(c[s+4>>2]|0);eF(c[j>>2]|0);eF(s);i=f;return m|0}function Nh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=b;b=i;i=i+32|0;tF(b,e,32)|0;e=c[a+16>>2]|0;f=c[a+152>>2]|0;if((f&4259840|0)==0){i=d;return}g=(f&131072|0)!=0;h=e+264|0;if(g){c[h>>2]=0;c[e+268>>2]=2}else{c[h>>2]=2;c[e+268>>2]=4}h=e+272|0;eF(c[h>>2]|0);j=jk(c[e+268>>2]<<4)|0;e=j;c[h>>2]=e;h=b;c[j>>2]=c[h>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[j+12>>2]=c[h+12>>2];h=j+16|0;j=b+16|0;c[h>>2]=c[j>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[h+12>>2]=c[j+12>>2];if((f&8192|0)==0){RA(a,e,e,2)|0}if(g){i=d;return}qi(e);i=d;return}function Oh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;c=i;i=i+144|0;d=c|0;e=c+64|0;f=c+128|0;g=b|0;j=+h[g>>3];k=a+16|0;l=+h[k>>3];do{if(j<=l){m=+h[a>>3];if(j<m){break}n=+h[b+8>>3];o=+h[a+24>>3];if(n>o){break}p=+h[a+8>>3];if(n<p){break}n=+h[b+16>>3];if(n>l|n<m){break}n=+h[b+24>>3];if(n>o|n<p){break}n=+h[b+32>>3];if(n>l|n<m){break}n=+h[b+40>>3];if(n>o|n<p){break}n=+h[b+48>>3];if(n>l|n<m){break}m=+h[b+56>>3];if(m>o|m<p){break}i=c;return}}while(0);q=b+48|0;l=+ui(b,q,b+16|0);if(!(l<4.0&+ui(b,q,b+32|0)<4.0)){q=d|0;d=e|0;Qm(f,b,3,.5,q,d);Oh(a,q);Oh(a,d);i=c;return}d=a+24|0;q=a+8|0;f=a|0;l=+h[g>>3];j=+h[k>>3];do{if(l>j){h[k>>3]=l;r=l}else{if(l>=+h[f>>3]){r=j;break}h[f>>3]=l;r=j}}while(0);j=+h[b+8>>3];l=+h[d>>3];do{if(j>l){h[d>>3]=j;s=j}else{if(j>=+h[q>>3]){s=l;break}h[q>>3]=j;s=l}}while(0);l=+h[b+16>>3];do{if(l>r){h[k>>3]=l;t=l}else{if(l>=+h[f>>3]){t=r;break}h[f>>3]=l;t=r}}while(0);r=+h[b+24>>3];do{if(r>s){h[d>>3]=r;u=r}else{if(r>=+h[q>>3]){u=s;break}h[q>>3]=r;u=s}}while(0);s=+h[b+32>>3];do{if(s>t){h[k>>3]=s;v=s}else{if(s>=+h[f>>3]){v=t;break}h[f>>3]=s;v=t}}while(0);t=+h[b+40>>3];do{if(t>u){h[d>>3]=t;w=t}else{if(t>=+h[q>>3]){w=u;break}h[q>>3]=t;w=u}}while(0);u=+h[b+48>>3];do{if(u>v){h[k>>3]=u}else{if(u>=+h[f>>3]){break}h[f>>3]=u}}while(0);u=+h[b+56>>3];if(u>w){h[d>>3]=u;i=c;return}if(u>=+h[q>>3]){i=c;return}h[q>>3]=u;i=c;return}function Ph(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0,S=0.0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0;e=i;i=i+48|0;f=e|0;g=e+32|0;j=c[d+8>>2]|0;d=c[j+136>>2]|0;k=+h[j+16>>3];l=+h[j+24>>3];m=+h[j+32>>3];n=+h[j+40>>3];o=c[(c[j+8>>2]|0)+88>>2]|0;if((o|0)==0){h[b>>3]=k;h[b+8>>3]=l;h[b+16>>3]=m;h[b+24>>3]=n;i=e;return}j=k==m&l==n;p=j?-1.7976931348623157e+308:n;n=j?-1.7976931348623157e+308:m;m=j?1.7976931348623157e+308:l;l=j?1.7976931348623157e+308:k;j=o;a:do{if((c[j>>2]|0)>0){q=f;r=f|0;s=f+16|0;t=d+144|0;u=o+12|0;k=p;v=n;w=m;x=l;y=0;z=0.0;A=0;B=c[o+8>>2]|0;while(1){c[q>>2]=c[54];c[q+4>>2]=c[55];c[q+8>>2]=c[56];c[q+12>>2]=c[57];c[q+16>>2]=c[58];c[q+20>>2]=c[59];c[q+24>>2]=c[60];c[q+28>>2]=c[61];b:do{switch(c[B>>2]|0){case 4:case 5:{C=B+8|0;D=c[C+4>>2]|0;E=c[C>>2]|0;F=+h[D>>3];G=+h[D+8>>3];if((E|0)>1){H=G;I=F;J=G;K=F;C=D;D=1;while(1){L=C+24|0;M=+h[L>>3];do{if(M<K){N=M;O=I}else{if(M<=I){N=K;O=I;break}N=K;O=M}}while(0);M=+h[C+32>>3];do{if(M<J){P=M;Q=H}else{if(M<=H){P=J;Q=H;break}P=J;Q=M}}while(0);R=D+1|0;if((R|0)<(E|0)){H=Q;I=O;J=P;K=N;C=L;D=R}else{S=Q;T=O;U=P;V=N;break}}}else{S=G;T=F;U=G;V=F}K=v<V?V:v;J=x>V?V:x;I=k<U?U:k;H=w>U?U:w;h[B+80>>3]=V;h[B+88>>3]=U;h[B+96>>3]=T;h[B+104>>3]=S;W=A;X=z;Y=J>T?T:J;Z=H>S?S:H;_=K<T?T:K;$=I<S?S:I;break};case 7:{D=B+112|0;c[D>>2]=jk(56)|0;C=Lb(c[B+40>>2]|0)|0;c[c[D>>2]>>2]=C;a[(c[D>>2]|0)+48|0]=a[74912+(c[B+24>>2]|0)|0]|0;c[r>>2]=A;h[s>>3]=z;C=c[t>>2]|0;E=Hc[c[C>>2]&63](C,q,1)|0;c[(c[D>>2]|0)+4>>2]=E;sm(g,d,c[D>>2]|0);I=+h[B+8>>3];K=+h[B+16>>3];E=c[D>>2]|0;H=+h[E+32>>3];J=+h[E+40>>3];D=a[E+48|0]|0;if((D|0)==114){aa=I;ba=I-H}else if((D|0)==110){M=H*.5;aa=I+M;ba=I-M}else if((D|0)==108){aa=I+H;ba=I}else{aa=0.0;ba=0.0}I=K+ +h[E+16>>3];K=I-J;h[B+80>>3]=ba;h[B+88>>3]=K;h[B+96>>3]=aa;h[B+104>>3]=I;J=v<ba?ba:v;H=x>ba?ba:x;M=k<K?K:k;ca=w>K?K:w;K=J<aa?aa:J;J=H>aa?aa:H;H=M<I?I:M;M=ca>I?I:ca;if((c[u>>2]|0)!=0){W=A;X=z;Y=J;Z=M;_=K;$=H;break b}c[u>>2]=130;W=A;X=z;Y=J;Z=M;_=K;$=H;break};case 10:{W=c[B+16>>2]|0;X=+h[B+8>>3];Y=x;Z=w;_=v;$=k;break};case 2:case 3:{E=B+8|0;D=c[E+4>>2]|0;C=c[E>>2]|0;H=+h[D>>3];K=+h[D+8>>3];if((C|0)>1){M=K;J=H;ca=K;I=H;E=D;D=1;while(1){R=E+24|0;da=+h[R>>3];do{if(da<I){ea=da;fa=J}else{if(da<=J){ea=I;fa=J;break}ea=I;fa=da}}while(0);da=+h[E+32>>3];do{if(da<ca){ga=da;ha=M}else{if(da<=M){ga=ca;ha=M;break}ga=ca;ha=da}}while(0);L=D+1|0;if((L|0)<(C|0)){M=ha;J=fa;ca=ga;I=ea;E=R;D=L}else{ia=ha;ja=fa;ka=ga;la=ea;break}}}else{ia=K;ja=H;ka=K;la=H}I=v<la?la:v;ca=x>la?la:x;J=k<ka?ka:k;M=w>ka?ka:w;h[B+80>>3]=la;h[B+88>>3]=ka;h[B+96>>3]=ja;h[B+104>>3]=ia;W=A;X=z;Y=ca>ja?ja:ca;Z=M>ia?ia:M;_=I<ja?ja:I;$=J<ia?ia:J;break};case 0:case 1:{J=+h[B+8>>3];I=+h[B+24>>3];M=J-I;ca=+h[B+16>>3];F=+h[B+32>>3];G=ca-F;da=J+I;I=ca+F;h[B+80>>3]=M;h[B+88>>3]=G;h[B+96>>3]=da;h[B+104>>3]=I;F=v<M?M:v;ca=x>M?M:x;M=k<G?G:k;J=w>G?G:w;G=F<da?da:F;F=ca>da?da:ca;ca=M<I?I:M;if(J<=I){W=A;X=z;Y=F;Z=J;_=G;$=ca;break b}W=A;X=z;Y=F;Z=I;_=G;$=ca;break};case 6:{D=B+8|0;E=c[D+4>>2]|0;C=c[D>>2]|0;ca=+h[E>>3];G=+h[E+8>>3];if((C|0)>1){I=G;F=ca;J=G;M=ca;D=E;E=1;while(1){L=D+24|0;da=+h[L>>3];do{if(da<M){ma=da;na=F}else{if(da<=F){ma=M;na=F;break}ma=M;na=da}}while(0);da=+h[D+32>>3];do{if(da<J){oa=da;pa=I}else{if(da<=I){oa=J;pa=I;break}oa=J;pa=da}}while(0);R=E+1|0;if((R|0)<(C|0)){I=pa;F=na;J=oa;M=ma;D=L;E=R}else{qa=pa;ra=na;sa=oa;ta=ma;break}}}else{qa=G;ra=ca;sa=G;ta=ca}M=v<ta?ta:v;J=x>ta?ta:x;F=k<sa?sa:k;I=w>sa?sa:w;h[B+80>>3]=ta;h[B+88>>3]=sa;h[B+96>>3]=ra;h[B+104>>3]=qa;W=A;X=z;Y=J>ra?ra:J;Z=I>qa?qa:I;_=M<ra?ra:M;$=F<qa?qa:F;break};default:{W=A;X=z;Y=x;Z=w;_=v;$=k}}}while(0);E=y+1|0;if((E|0)<(c[j>>2]|0)){k=$;v=_;w=Z;x=Y;y=E;z=X;A=W;B=B+120|0}else{ua=$;va=_;wa=Z;xa=Y;break a}}}else{ua=p;va=n;wa=m;xa=l}}while(0);h[b>>3]=xa;h[b+8>>3]=wa;h[b+16>>3]=va;h[b+24>>3]=ua;i=e;return}function Qh(a){a=a|0;if((c[a>>2]|0)!=7){return}ck(c[a+112>>2]|0,1);return}function Rh(d,e){d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Za=0,_a=0.0,$a=0.0,ab=0.0,bb=0.0,cb=0.0,db=0.0,eb=0,fb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0;f=i;i=i+200|0;j=f|0;k=f+8|0;l=f+16|0;m=f+24|0;n=f+56|0;o=f+184|0;p=d+152|0;q=c[p>>2]|0;r=d+352|0;s=+h[r>>3];t=+h[d+432>>3];u=s*t/72.0;h[d+488>>3]=u;v=+h[d+440>>3];w=s*v/72.0;h[d+496>>3]=w;h[d+520>>3]=t/72.0;t=v/72.0;x=d+528|0;h[x>>3]=t;if((q&4096|c[53492]|0)!=0){h[x>>3]=t*-1.0}x=d+360|0;t=+((c[d+448>>2]|0)>>>0>>>0);if((c[x>>2]|0)==0){h[d+368>>3]=t/u;h[d+376>>3]=+((c[d+452>>2]|0)>>>0>>>0)/w}else{h[d+376>>3]=t/w;h[d+368>>3]=+((c[d+452>>2]|0)>>>0>>>0)/u}y=e|0;vB(d,Hm(y,Wv(e,0,154768,0)|0,213440)|0);z=d+160|0;c[z>>2]=0;A=jk(304)|0;if((A|0)==0){Fv(1,115680,(B=i,i=i+1|0,i=i+7&-8,c[B>>2]=0,B)|0)|0;i=B}C=d+16|0;D=c[C>>2]|0;c[A>>2]=D;c[C>>2]=A;if((D|0)==0){c[A+144>>2]=3;c[A+148>>2]=0;h[A+152>>3]=1.0}else{E=A+16|0;F=D+16|0;c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];c[E+16>>2]=c[F+16>>2];c[E+20>>2]=c[F+20>>2];c[E+24>>2]=c[F+24>>2];c[E+28>>2]=c[F+28>>2];c[E+32>>2]=c[F+32>>2];c[E+36>>2]=c[F+36>>2];F=A+56|0;E=D+56|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];c[F+16>>2]=c[E+16>>2];c[F+20>>2]=c[E+20>>2];c[F+24>>2]=c[E+24>>2];c[F+28>>2]=c[E+28>>2];c[F+32>>2]=c[E+32>>2];c[F+36>>2]=c[E+36>>2];c[A+144>>2]=c[D+144>>2];c[A+148>>2]=c[D+148>>2];h[A+152>>3]=+h[D+152>>3];c[A+136>>2]=c[D+136>>2];E=A+96|0;F=D+96|0;c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];c[E+16>>2]=c[F+16>>2];c[E+20>>2]=c[F+20>>2];c[E+24>>2]=c[F+24>>2];c[E+28>>2]=c[F+28>>2];c[E+32>>2]=c[F+32>>2];c[E+36>>2]=c[F+36>>2]}c[A+4>>2]=0;c[A+8>>2]=e;c[A+12>>2]=0;A=e+8|0;mi(d,c[(c[A>>2]|0)+12>>2]|0,y);SA(d,e);do{if((q&2|0)!=0){nB(d,119400);F=ew(y,120224)|0;do{if((F|0)!=0){if((a[F]|0)==0){break}nB(d,F)}}while(0);F=ew(y,160752)|0;do{if((F|0)!=0){if((a[F]|0)==0){break}lB(d,F)}}while(0);oi(d,e);F=ux(e)|0;if((F|0)==0){break}else{G=F}do{F=G|0;E=ew(F,123768)|0;do{if((E|0)!=0){if((a[E]|0)==0){break}lB(d,E)}}while(0);E=ew(F,121832)|0;do{if((E|0)!=0){if((a[E]|0)==0){break}nB(d,E)}}while(0);E=ew(F,121048)|0;do{if((E|0)!=0){if((a[E]|0)==0){break}if((gb(E|0,58)|0)==0){lB(d,E);break}D=Lb(E|0)|0;H=La(D|0,87264)|0;if((H|0)!=0){I=H;do{if((a[I]|0)!=0){lB(d,I)}I=La(0,87264)|0;}while((I|0)!=0)}eF(D)}}while(0);E=ew(F,160752)|0;do{if((E|0)!=0){if((a[E]|0)==0){break}lB(d,E)}}while(0);E=mw(e,G)|0;if((E|0)!=0){F=E;do{E=F|0;I=ew(E,123768)|0;do{if((I|0)!=0){if((a[I]|0)==0){break}if((gb(I|0,58)|0)==0){lB(d,I);break}H=Lb(I|0)|0;J=La(H|0,87264)|0;if((J|0)!=0){K=J;do{if((a[K]|0)!=0){lB(d,K)}K=La(0,87264)|0;}while((K|0)!=0)}eF(H)}}while(0);I=ew(E,160752)|0;do{if((I|0)!=0){if((a[I]|0)==0){break}lB(d,I)}}while(0);F=ow(e,F)|0;}while((F|0)!=0)}G=vx(e,G)|0;}while((G|0)!=0)}}while(0);G=ux(e)|0;if((G|0)!=0){q=G;do{a[(c[q+8>>2]|0)+116|0]=0;q=vx(e,q)|0;}while((q|0)!=0)}q=d|0;G=c[q>>2]|0;F=c[G+312>>2]|0;I=d+156|0;c[I>>2]=F;E=c[G+316>>2]|0;do{if((E|0)==0){if((F|0)<=1){L=0;M=1;N=F;O=62;break}if((c[p>>2]&64|0)!=0){L=0;M=1;N=F;O=62;break}Fv(0,161048,(B=i,i=i+8|0,c[B>>2]=c[d+52>>2],B)|0)|0;i=B;c[I>>2]=1;c[z>>2]=1;P=0}else{G=E+4|0;do{if((c[E>>2]|0)>1){if((c[p>>2]&64|0)!=0){Q=F;break}Fv(0,161048,(B=i,i=i+8|0,c[B>>2]=c[d+52>>2],B)|0)|0;i=B;c[E+8>>2]=(c[I>>2]|0)+1;Q=c[I>>2]|0}else{Q=F}}while(0);L=E+8|0;M=c[G>>2]|0;N=Q;O=62}}while(0);do{if((O|0)==62){c[z>>2]=M;if((M|0)<=(N|0)){P=L;break}TA(d);Gh(d);i=f;return}}while(0);L=d+196|0;N=d+172|0;M=L;Q=d+164|0;E=d+200|0;F=d+168|0;D=m;K=n|0;n=o+4|0;J=o+8|0;R=o|0;S=d+164|0;T=d+320|0;U=d+240|0;V=d+288|0;W=d+328|0;X=d+248|0;Z=d+296|0;_=d+304|0;aa=d+312|0;ba=d+12|0;ca=d+472|0;da=ca;ea=d+456|0;fa=d+336|0;ga=d+256|0;ha=d+344|0;ia=d+264|0;ja=d+272|0;ka=d+280|0;la=d+384|0;ma=d+504|0;na=d+392|0;oa=d+512|0;pa=j|0;qa=d+256|0;ra=j+4|0;j=L|0;L=d+188|0;sa=d+192|0;ta=d+184|0;ua=d+176|0;va=d+180|0;wa=d+172|0;xa=qa;ya=m+16|0;m=d+288|0;za=d+304|0;Aa=d+384|0;Ba=d+504|0;Ca=d+368|0;Da=d+376|0;Ea=ca|0;ca=d+456|0;Fa=d+476|0;Ga=d+460|0;Ha=d+480|0;Ia=d+464|0;Ja=d+484|0;Ka=d+468|0;Ma=P;while(1){P=c[(c[q>>2]|0)+316>>2]|0;if((c[((P|0)==0?I:P)>>2]|0)>1){WA(d)}P=c[N>>2]|0;Na=c[N+4>>2]|0;c[M>>2]=P;c[M+4>>2]=Na;Oa=P;a:do{if((Oa|0)>-1){P=Na;Pa=Oa;while(1){if(!((Pa|0)<(c[Q>>2]|0)&(P|0)>-1)){break a}if((P|0)>=(c[F>>2]|0)){break a}Qa=c[C>>2]|0;Ra=c[p>>2]|0;if((c[z>>2]|0)>1|(Pa|0)>0){Iv(o,128,K);Sa=Qa+212|0;Ta=c[Sa>>2]|0;Jh(d,o);Lv(o,Ta)|0;Ua=c[n>>2]|0;if(Ua>>>0<(c[J>>2]|0)>>>0){Va=Ua}else{Jv(o,1)|0;Va=c[n>>2]|0}a[Va]=0;Ua=c[R>>2]|0;c[n>>2]=Ua;c[Sa>>2]=Ua;Wa=Ta}else{Wa=0}Ch(ew(y,148552)|0);Ta=c[M>>2]|0;Ua=c[M+4>>2]|0;Sa=c[S>>2]|0;Xa=c[S+4>>2]|0;Za=(c[x>>2]|0)==0;u=+((Za?Ta:Ua)|0);w=+h[T>>3];t=w*u- +h[U>>3];h[V>>3]=t;v=+((Za?Ua:Ta)|0);s=+h[W>>3];_a=v*s- +h[X>>3];h[Z>>3]=_a;h[_>>3]=w+t;h[aa>>3]=s+_a;if((c[(c[ba>>2]|0)+28>>2]|0)==0){c[da>>2]=c[ea>>2];c[da+4>>2]=c[ea+4>>2];c[da+8>>2]=c[ea+8>>2];c[da+12>>2]=c[ea+12>>2]}else{Ta=c[Ea>>2]|0;Ua=c[ca>>2]|0;c[Ea>>2]=(Ta|0)<(Ua|0)?Ta:Ua;Ua=c[Fa>>2]|0;Ta=c[Ga>>2]|0;c[Fa>>2]=(Ua|0)<(Ta|0)?Ua:Ta;Ta=c[Ha>>2]|0;Ua=c[Ia>>2]|0;c[Ha>>2]=(Ta|0)>(Ua|0)?Ta:Ua;Ua=c[Ja>>2]|0;Ta=c[Ka>>2]|0;c[Ja>>2]=(Ua|0)>(Ta|0)?Ua:Ta}Ta=c[p>>2]|0;_a=+h[fa>>3];if((Ta&128|0)==0){t=w*(u- +((Za?Sa:Xa)|0)*.5)+_a;h[ga>>3]=t;u=s*(v- +((Za?Xa:Sa)|0)*.5)+ +h[ha>>3];h[ia>>3]=u;v=w+t;h[ja>>3]=v;$a=t;ab=u;bb=v;cb=s+u}else{u=+h[Ca>>3]*.5;s=_a-u;h[ga>>3]=s;v=+h[ha>>3];t=+h[Da>>3]*.5;w=v-t;h[ia>>3]=w;db=_a+u;h[ja>>3]=db;$a=s;ab=w;bb=db;cb=v+t}h[ka>>3]=cb;do{if(Za){t=+h[r>>3];h[ma>>3]=+h[la>>3]/t-$a;if((c[53492]|Ta&4096|0)==0){h[oa>>3]=+h[na>>3]/t-ab;break}else{h[oa>>3]=-0.0-cb- +h[na>>3]/t;break}}else{t=+h[r>>3];h[oa>>3]=-0.0-cb- +h[na>>3]/t;if((c[53492]|Ta&4096|0)==0){h[Ba>>3]=+h[Aa>>3]/t-$a;break}else{h[Ba>>3]=-0.0-bb- +h[Aa>>3]/t;break}}}while(0);UA(d);lB(d,159752);nB(d,119400);do{if((Ra&4259840|0)!=0){if((c[Qa+208>>2]|0)==0){if((b[Qa+260>>1]&1)==0){break}}do{if((Ra&655360|0)==0){eb=0;fb=0}else{Ta=Ra&131072;Za=Ta>>>16^2;Sa=Za+2|0;c[Qa+264>>2]=Za;Za=jk(Sa<<4)|0;Xa=Za;c[Za>>2]=c[m>>2];c[Za+4>>2]=c[m+4>>2];c[Za+8>>2]=c[m+8>>2];c[Za+12>>2]=c[m+12>>2];Ua=Za+16|0;c[Ua>>2]=c[za>>2];c[Ua+4>>2]=c[za+4>>2];c[Ua+8>>2]=c[za+8>>2];c[Ua+12>>2]=c[za+12>>2];if((Ta|0)!=0){eb=Xa;fb=Sa;break}qi(Xa);eb=Xa;fb=Sa}}while(0);if((Ra&8192|0)==0){RA(d,eb,eb,fb)|0}c[Qa+272>>2]=eb;c[Qa+268>>2]=fb}}while(0);do{if((Ra&32768|0)!=0){H=c[(c[A>>2]|0)+12>>2]|0;if((H|0)==0){break}c[Qa+192>>2]=c[H>>2]}}while(0);H=(Ra&4|0)!=0;do{if(!H){Sa=Qa+208|0;if((c[Sa>>2]|0)==0){if((b[Qa+260>>1]&1)==0){break}}tF(D|0,xa|0,32)|0;Xa=c[C>>2]|0;Ta=c[p>>2]|0;do{if((Ta&4259840|0)!=0){Ua=(Ta&131072|0)!=0;Za=Xa+264|0;if(Ua){c[Za>>2]=0;c[Xa+268>>2]=2}else{c[Za>>2]=2;c[Xa+268>>2]=4}Za=Xa+272|0;eF(c[Za>>2]|0);hb=jk(c[Xa+268>>2]<<4)|0;ib=hb;c[Za>>2]=ib;c[hb>>2]=c[D>>2];c[hb+4>>2]=c[D+4>>2];c[hb+8>>2]=c[D+8>>2];c[hb+12>>2]=c[D+12>>2];Za=hb+16|0;c[Za>>2]=c[ya>>2];c[Za+4>>2]=c[ya+4>>2];c[Za+8>>2]=c[ya+8>>2];c[Za+12>>2]=c[ya+12>>2];if((Ta&8192|0)==0){RA(d,ib,ib,2)|0}if(Ua){break}qi(ib)}}while(0);gB(d,c[Sa>>2]|0,c[Qa+228>>2]|0,c[Qa+244>>2]|0,c[Qa+212>>2]|0)}}while(0);Ta=ew(y,120224)|0;if((Ta|0)==0){jb=1;kb=162072}else{Xa=(a[Ta]|0)==0;jb=Xa&1;kb=Xa?162072:Ta}Ta=c[p>>2]|0;Xa=(a[kb]|0)==116;do{if((Ta&256|0)==0){if(!Xa){lb=kb;mb=jb;O=118;break}ib=(Ya(kb|0,118712)|0)==0;lb=ib?162072:kb;mb=ib?1:jb;O=118}else{if(!Xa){lb=kb;mb=jb;O=118;break}if((Ya(kb|0,118712)|0)!=0){lb=kb;mb=jb;O=118}}}while(0);do{if((O|0)==118){O=0;if(!((Ta&33554432|0)==0|(mb|0)==0)){break}if((Vh(lb,pa,k)|0)<<24>>24==0){nB(d,lb);lB(d,118712);sB(d,qa,1);break}c[l>>2]=0;Xa=c[pa>>2]|0;nB(d,Xa);lB(d,118712);Uh(e,l)|0;ib=c[ra>>2]|0;Ua=Em(y,c[53722]|0,0,0)|0;t=+g[k>>2];if((ib|0)==0){oB(d,159752,Ua,t)}else{oB(d,ib,Ua,t)}sB(d,qa,(c[l>>2]|0)>>>1&1|2);eF(Xa)}}while(0);Ta=c[A>>2]|0;Xa=c[(c[Ta+8>>2]|0)+88>>2]|0;if((Xa|0)==0){nb=Ta}else{Ta=kk(16e3)|0;Ua=Xa;do{if((c[Ua>>2]|0)>0){ib=1e3;Za=c[Xa+8>>2]|0;hb=0;ob=0;pb=1;qb=Ta;rb=1;while(1){sb=Za|0;b:do{switch(c[sb>>2]|0){case 0:case 1:{if(+h[Za+96>>3]<+h[ga>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ja>>3]<+h[Za+80>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[Za+104>>3]<+h[ia>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ka>>3]<+h[Za+88>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}yb=Za+24|0;h[qb>>3]=+h[Za+8>>3]- +h[yb>>3];zb=Za+32|0;h[qb+8>>3]=+h[Za+16>>3]- +h[zb>>3];h[qb+16>>3]=+h[yb>>3];h[qb+24>>3]=+h[zb>>3];qB(d,qb,2,(c[sb>>2]|0)==0?pb:0);tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break};case 7:{if(+h[Za+96>>3]<+h[ga>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ja>>3]<+h[Za+80>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[Za+104>>3]<+h[ia>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ka>>3]<+h[Za+88>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}h[qb>>3]=+h[Za+8>>3];h[qb+8>>3]=+h[Za+16>>3];kB(d,qb,c[Za+112>>2]|0);tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break};case 14:{Fv(0,161720,(B=i,i=i+1|0,i=i+7&-8,c[B>>2]=0,B)|0)|0;i=B;tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break};case 2:case 3:{if(+h[Za+96>>3]<+h[ga>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ja>>3]<+h[Za+80>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[Za+104>>3]<+h[ia>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ka>>3]<+h[Za+88>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}zb=Za+8|0;yb=c[zb+4>>2]|0;Ab=zb|0;zb=c[Ab>>2]|0;if((ib|0)<(zb|0)){Bb=ib<<1;Cb=(Bb|0)>(zb|0)?Bb:zb;Db=mk(qb,Cb<<4)|0;Eb=Cb}else{Db=qb;Eb=ib}if((zb|0)>0){Cb=0;do{h[Db+(Cb<<4)>>3]=+h[yb+(Cb*24|0)>>3];h[Db+(Cb<<4)+8>>3]=+h[yb+(Cb*24|0)+8>>3];Cb=Cb+1|0;}while((Cb|0)<(zb|0))}rB(d,Db,c[Ab>>2]|0,(c[sb>>2]|0)==2?pb:0);tb=rb;ub=Db;vb=pb;wb=ob;xb=Eb;break};case 8:{nB(d,c[Za+8>>2]|0);tb=rb;ub=qb;vb=1;wb=ob;xb=ib;break};case 9:{lB(d,c[Za+8>>2]|0);tb=rb;ub=qb;vb=1;wb=ob;xb=ib;break};case 4:case 5:{if(+h[Za+96>>3]<+h[ga>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ja>>3]<+h[Za+80>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[Za+104>>3]<+h[ia>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ka>>3]<+h[Za+88>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}zb=Za+8|0;Cb=c[zb+4>>2]|0;yb=zb|0;zb=c[yb>>2]|0;if((ib|0)<(zb|0)){Bb=ib<<1;Fb=(Bb|0)>(zb|0)?Bb:zb;Gb=mk(qb,Fb<<4)|0;Hb=Fb}else{Gb=qb;Hb=ib}if((zb|0)>0){Fb=0;do{h[Gb+(Fb<<4)>>3]=+h[Cb+(Fb*24|0)>>3];h[Gb+(Fb<<4)+8>>3]=+h[Cb+(Fb*24|0)+8>>3];Fb=Fb+1|0;}while((Fb|0)<(zb|0))}tB(d,Gb,c[yb>>2]|0,0,0,(c[sb>>2]|0)==4?pb&255:0);tb=rb;ub=Gb;vb=pb;wb=ob;xb=Hb;break};case 6:{if(+h[Za+96>>3]<+h[ga>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ja>>3]<+h[Za+80>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[Za+104>>3]<+h[ia>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ka>>3]<+h[Za+88>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}zb=Za+8|0;Fb=c[zb+4>>2]|0;Cb=zb|0;zb=c[Cb>>2]|0;if((ib|0)<(zb|0)){Ab=ib<<1;Bb=(Ab|0)>(zb|0)?Ab:zb;Ib=mk(qb,Bb<<4)|0;Jb=Bb}else{Ib=qb;Jb=ib}if((zb|0)>0){Bb=0;do{h[Ib+(Bb<<4)>>3]=+h[Fb+(Bb*24|0)>>3];h[Ib+(Bb<<4)+8>>3]=+h[Fb+(Bb*24|0)+8>>3];Bb=Bb+1|0;}while((Bb|0)<(zb|0))}uB(d,Ib,c[Cb>>2]|0);tb=rb;ub=Ib;vb=pb;wb=ob;xb=Jb;break};case 12:{if((rb|0)==0){tb=0;ub=qb;vb=pb;wb=ob;xb=ib;break b}Fv(0,161384,(B=i,i=i+1|0,i=i+7&-8,c[B>>2]=0,B)|0)|0;i=B;tb=0;ub=qb;vb=pb;wb=ob;xb=ib;break};case 13:{zb=Za+16|0;if((c[Za+8>>2]|0)!=2){Bb=c[zb+36>>2]|0;Fb=c[Bb+12>>2]|0;t=+g[Bb+8>>2];yb=~~(+$(+(+h[Za+40>>3]- +h[Za+24>>3]),+(+h[Za+32>>3]- +h[zb>>3]))*180.0/3.141592653589793);nB(d,c[Bb+4>>2]|0);oB(d,Fb,yb,t);tb=rb;ub=qb;vb=2;wb=ob;xb=ib;break b}yb=c[Za+68>>2]|0;Fb=c[yb+4>>2]|0;Bb=c[yb+12>>2]|0;t=+g[yb+8>>2];v=+h[Za+40>>3];db=+h[zb>>3];if(v==db){if(+h[Za+48>>3]==+h[Za+24>>3]){Kb=0}else{O=171}}else{O=171}if((O|0)==171){O=0;Kb=~~(+Y((db-v)/+h[Za+32>>3])*180.0/3.141592653589793)}nB(d,Fb);oB(d,Bb,Kb,t);tb=rb;ub=qb;vb=3;wb=ob;xb=ib;break};case 11:{Yh(c[Za+8>>2]|0)|0;pB(d,176472);tb=rb;ub=qb;vb=pb;wb=176472;xb=ib;break};default:{tb=rb;ub=qb;vb=pb;wb=ob;xb=ib}}}while(0);sb=hb+1|0;if((sb|0)<(c[Ua>>2]|0)){ib=xb;Za=Za+120|0;hb=sb;ob=wb;pb=vb;qb=ub;rb=tb}else{break}}if((wb|0)==0){Mb=ub;break}pB(d,c[(c[q>>2]|0)+336>>2]|0);Mb=ub}else{Mb=Ta}}while(0);eF(Mb);nb=c[A>>2]|0}Ta=c[nb+12>>2]|0;if((Ta|0)!=0){ek(d,4,Ta)}if(H){Ta=(c[q>>2]|0)+28|0;c[Ta>>2]=(c[Ta>>2]|0)+1}else{if((c[Qa+208>>2]|0)==0){if((b[Qa+260>>1]&1)!=0){O=188}}else{O=188}if((O|0)==188){O=0;hB(d)}Ta=(c[q>>2]|0)+28|0;c[Ta>>2]=(c[Ta>>2]|0)+1;Th(d,e,Ra)}c:do{if((Ra&1|0)==0){if((Ra&16|0)!=0){aB(d);Ta=ux(e)|0;if((Ta|0)!=0){Ua=Ta;do{Ta=mw(e,Ua)|0;if((Ta|0)!=0){Xa=Ta;do{Xh(d,Xa);Xa=ow(e,Xa)|0;}while((Xa|0)!=0)}Ua=vx(e,Ua)|0;}while((Ua|0)!=0)}bB(d);_A(d);Ua=ux(e)|0;if((Ua|0)!=0){Xa=Ua;do{Wh(d,Xa);Xa=vx(e,Xa)|0;}while((Xa|0)!=0)}$A(d);break}if((Ra&8|0)==0){Xa=ux(e)|0;if((Xa|0)==0){break}else{Nb=Xa}while(1){Wh(d,Nb);Xa=mw(e,Nb)|0;if((Xa|0)!=0){Ua=Xa;do{Wh(d,c[((c[Ua>>2]&3|0)==2?Ua:Ua-32|0)+28>>2]|0);Xh(d,Ua);Ua=ow(e,Ua)|0;}while((Ua|0)!=0)}Nb=vx(e,Nb)|0;if((Nb|0)==0){break c}}}_A(d);Ua=ux(e)|0;if((Ua|0)!=0){Xa=Ua;do{Ua=c[A>>2]|0;d:do{if((c[Ua+172>>2]|0)<1){O=212}else{Ta=Xa|0;rb=1;qb=Ua;while(1){if((Rx(c[(c[qb+176>>2]|0)+(rb<<2)>>2]|0,Ta)|0)!=0){break d}pb=c[A>>2]|0;if((rb|0)<(c[pb+172>>2]|0)){rb=rb+1|0;qb=pb}else{O=212;break}}}}while(0);if((O|0)==212){O=0;Wh(d,Xa)}Xa=vx(e,Xa)|0;}while((Xa|0)!=0)}$A(d);aB(d);Xa=ux(e)|0;if((Xa|0)!=0){Ua=Xa;do{Xa=mw(e,Ua)|0;if((Xa|0)!=0){qb=Xa;do{Xa=c[A>>2]|0;e:do{if((c[Xa+172>>2]|0)<1){O=220}else{rb=qb|0;Ta=1;Cb=Xa;while(1){if((Rx(c[(c[Cb+176>>2]|0)+(Ta<<2)>>2]|0,rb)|0)!=0){break e}pb=c[A>>2]|0;if((Ta|0)<(c[pb+172>>2]|0)){Ta=Ta+1|0;Cb=pb}else{O=220;break}}}}while(0);if((O|0)==220){O=0;Xh(d,qb)}qb=ow(e,qb)|0;}while((qb|0)!=0)}Ua=vx(e,Ua)|0;}while((Ua|0)!=0)}bB(d)}else{_A(d);Ua=ux(e)|0;if((Ua|0)!=0){qb=Ua;do{Wh(d,qb);qb=vx(e,qb)|0;}while((qb|0)!=0)}$A(d);aB(d);qb=ux(e)|0;if((qb|0)!=0){Ua=qb;do{qb=mw(e,Ua)|0;if((qb|0)!=0){Xa=qb;do{Xh(d,Xa);Xa=ow(e,Xa)|0;}while((Xa|0)!=0)}Ua=vx(e,Ua)|0;}while((Ua|0)!=0)}bB(d)}}while(0);if(H){Th(d,e,Ra)}VA(d);if((Wa|0)!=0){Mv(o);c[Qa+212>>2]=Wa}Ua=(c[L>>2]|0)+(c[j>>2]|0)|0;Xa=(c[sa>>2]|0)+(c[E>>2]|0)|0;c[M>>2]=Ua;c[M+4>>2]=Xa;do{if((Ua|0)>-1){if(!((Ua|0)<(c[Q>>2]|0)&(Xa|0)>-1)){O=236;break}if((Xa|0)<(c[F>>2]|0)){Ob=Xa;Pb=Ua}else{O=236}}else{O=236}}while(0);if((O|0)==236){O=0;Qa=c[ta>>2]|0;if((Qa|0)==0){Ra=c[ua>>2]|0;c[E>>2]=Ra;Qb=Ua;Rb=Ra}else{Ra=c[wa>>2]|0;c[j>>2]=Ra;Qb=Ra;Rb=Xa}Ra=(c[va>>2]|0)+Qb|0;H=Rb+Qa|0;c[M>>2]=Ra;c[M+4>>2]=H;Ob=H;Pb=Ra}if((Pb|0)>-1){P=Ob;Pa=Pb}else{break}}}}while(0);Oa=c[(c[q>>2]|0)+316>>2]|0;if((c[((Oa|0)==0?I:Oa)>>2]|0)>1){XA(d)}if((Ma|0)==0){Sb=0;Tb=(c[z>>2]|0)+1|0}else{Sb=Ma+4|0;Tb=c[Ma>>2]|0}c[z>>2]=Tb;if((Tb|0)>(c[I>>2]|0)){break}else{Ma=Sb}}TA(d);Gh(d);i=f;return}function Sh(a){a=a|0;var b=0,d=0,e=0,f=0;b=c[43702]|0;if((b|0)==0){d=$g(10328,c[43330]|0)|0;c[43702]=d;e=d}else{e=b}if((Hc[c[e>>2]&63](e,a,4)|0)!=0){f=0;return f|0}e=c[43702]|0;b=c[e>>2]|0;d=Lb(a|0)|0;Hc[b&63](e,d,1)|0;f=1;return f|0}function Th(e,f,j){e=e|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0.0,qa=0;k=i;i=i+152|0;l=k|0;m=k+32|0;n=k+64|0;o=k+72|0;p=k+136|0;q=k+144|0;r=f+8|0;s=c[r>>2]|0;if((c[s+172>>2]|0)<1){i=k;return}t=e+156|0;u=(j&4|0)!=0;v=e+16|0;w=p|0;x=o|0;y=o;z=o+32|0;A=z;B=z|0;z=o+16|0;C=o+8|0;D=o+24|0;E=o|0;F=o+48|0;G=o+40|0;H=o+56|0;o=l;I=e+152|0;J=l+16|0;l=(j&8|0)==0;K=p+4|0;p=m;L=m+16|0;m=e|0;M=e+160|0;N=1;O=s;while(1){s=c[(c[O+176>>2]|0)+(N<<2)>>2]|0;a:do{if((c[t>>2]|0)<2){P=9}else{Q=Hm(s|0,Wv(s,0,162416,0)|0,213440)|0;if(($h(c[m>>2]|0,c[M>>2]|0,c[t>>2]|0,Q)|0)<<24>>24!=0){P=9;break}if((a[Q]|0)!=0){break}Q=ux(s)|0;if((Q|0)==0){break}else{R=Q}do{if((li(e,s,R)|0)<<24>>24!=0){P=9;break a}R=vx(s,R)|0;}while((R|0)!=0)}}while(0);do{if((P|0)==9){P=0;if(u){Th(e,s,j)}Q=jk(304)|0;if((Q|0)==0){Fv(1,115680,(S=i,i=i+1|0,i=i+7&-8,c[S>>2]=0,S)|0)|0;i=S}T=c[v>>2]|0;c[Q>>2]=T;c[v>>2]=Q;if((T|0)==0){c[Q+144>>2]=3;c[Q+148>>2]=0;h[Q+152>>3]=1.0}else{U=Q+16|0;V=T+16|0;c[U>>2]=c[V>>2];c[U+4>>2]=c[V+4>>2];c[U+8>>2]=c[V+8>>2];c[U+12>>2]=c[V+12>>2];c[U+16>>2]=c[V+16>>2];c[U+20>>2]=c[V+20>>2];c[U+24>>2]=c[V+24>>2];c[U+28>>2]=c[V+28>>2];c[U+32>>2]=c[V+32>>2];c[U+36>>2]=c[V+36>>2];V=Q+56|0;U=T+56|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];c[V+16>>2]=c[U+16>>2];c[V+20>>2]=c[U+20>>2];c[V+24>>2]=c[U+24>>2];c[V+28>>2]=c[U+28>>2];c[V+32>>2]=c[U+32>>2];c[V+36>>2]=c[U+36>>2];c[Q+144>>2]=c[T+144>>2];c[Q+148>>2]=c[T+148>>2];h[Q+152>>3]=+h[T+152>>3];c[Q+136>>2]=c[T+136>>2];U=Q+96|0;V=T+96|0;c[U>>2]=c[V>>2];c[U+4>>2]=c[V+4>>2];c[U+8>>2]=c[V+8>>2];c[U+12>>2]=c[V+12>>2];c[U+16>>2]=c[V+16>>2];c[U+20>>2]=c[V+20>>2];c[U+24>>2]=c[V+24>>2];c[U+28>>2]=c[V+28>>2];c[U+32>>2]=c[V+32>>2];c[U+36>>2]=c[V+36>>2]}c[Q+4>>2]=1;c[Q+8>>2]=s;c[Q+12>>2]=1;Q=s+8|0;V=s|0;mi(e,c[(c[Q>>2]|0)+12>>2]|0,V);YA(e,s);U=c[v>>2]|0;T=U+208|0;if((c[T>>2]|0)==0){W=(b[U+260>>1]&1)!=0}else{W=1}Ch(ew(V,148552)|0);if(!(u|W^1)){tF(p|0,(c[Q>>2]|0)+16|0,32)|0;X=c[v>>2]|0;Y=c[I>>2]|0;do{if((Y&4259840|0)!=0){Z=(Y&131072|0)!=0;_=X+264|0;if(Z){c[_>>2]=0;c[X+268>>2]=2}else{c[_>>2]=2;c[X+268>>2]=4}_=X+272|0;eF(c[_>>2]|0);$=jk(c[X+268>>2]<<4)|0;aa=$;c[_>>2]=aa;c[$>>2]=c[p>>2];c[$+4>>2]=c[p+4>>2];c[$+8>>2]=c[p+8>>2];c[$+12>>2]=c[p+12>>2];_=$+16|0;c[_>>2]=c[L>>2];c[_+4>>2]=c[L+4>>2];c[_+8>>2]=c[L+8>>2];c[_+12>>2]=c[L+12>>2];if((Y&8192|0)==0){RA(e,aa,aa,2)|0}if(Z){break}qi(aa)}}while(0);gB(e,c[T>>2]|0,c[U+228>>2]|0,c[U+244>>2]|0,c[U+212>>2]|0)}c[n>>2]=0;Y=Uh(s,n)|0;if((Y|0)==0){ba=0}else{pB(e,Y);ba=c[n>>2]&1}Y=d[(c[Q>>2]|0)+112|0]|0;do{if((Y&1|0)==0){if((Y&2|0)!=0){X=Im(V,c[53728]|0,139280)|0;ca=Im(V,c[53730]|0,136712)|0;da=X;P=47;break}if((Y&8|0)!=0){X=Im(V,c[53724]|0,133792)|0;ca=Im(V,c[53726]|0,131744)|0;da=X;P=47;break}if((Y&4|0)!=0){X=Im(V,c[53710]|0,129560)|0;ca=Im(V,c[53712]|0,126280)|0;da=X;P=47;break}X=ew(V,123768)|0;if((X|0)==0){ea=0}else{ea=(a[X]|0)==0?0:X}X=ew(V,121832)|0;if((X|0)==0){fa=ea}else{fa=(a[X]|0)==0?ea:X}X=ew(V,121048)|0;if((X|0)==0){ga=ea}else{ga=(a[X]|0)==0?ea:X}do{if((ba|0)==0|(ga|0)==0){X=ew(V,120224)|0;if((X|0)==0){ha=ba;ia=ga;break}aa=(a[X]|0)==0;ha=aa?ba:1;ia=aa?ga:X}else{ha=ba;ia=ga}}while(0);X=(fa|0)==0?159752:fa;aa=(ia|0)==0?119400:ia;c[w>>2]=0;if((ha|0)==0){ja=0;ka=X;la=aa}else{ma=ha;na=X;oa=aa;P=49}}else{aa=Im(V,c[53728]|0,145328)|0;ca=Im(V,c[53730]|0,142384)|0;da=aa;P=47}}while(0);if((P|0)==47){P=0;c[w>>2]=0;ma=1;na=(da|0)==0?159752:da;oa=(ca|0)==0?119400:ca;P=49}do{if((P|0)==49){P=0;if((Vh(oa,w,q)|0)<<24>>24==0){nB(e,oa);ja=ma;ka=na;la=oa;break}nB(e,c[w>>2]|0);Y=c[K>>2]|0;aa=Em(V,c[53722]|0,0,0)|0;pa=+g[q>>2];if((Y|0)==0){oB(e,159752,aa,pa)}else{oB(e,Y,aa,pa)}ja=(c[n>>2]|0)>>>1&1|2;ka=na;la=oa}}while(0);aa=c[53716]|0;do{if((aa|0)!=0){Y=fw(V,aa)|0;if((Y|0)==0){break}if((a[Y]|0)==0){break}xB(e,+Fm(V,c[53716]|0,1.0,0.0))}}while(0);aa=c[n>>2]|0;do{if((aa&4|0)==0){if((aa&64|0)==0){if((Em(V,c[53714]|0,1,0)|0)!=0){lB(e,ka);sB(e,(c[Q>>2]|0)+16|0,ja);break}if((ja|0)==0){break}lB(e,118712);sB(e,(c[Q>>2]|0)+16|0,ja);break}Y=(c[Q>>2]|0)+16|0;c[y>>2]=c[Y>>2];c[y+4>>2]=c[Y+4>>2];c[y+8>>2]=c[Y+8>>2];c[y+12>>2]=c[Y+12>>2];Y=(c[Q>>2]|0)+32|0;c[A>>2]=c[Y>>2];c[A+4>>2]=c[Y+4>>2];c[A+8>>2]=c[Y+8>>2];c[A+12>>2]=c[Y+12>>2];h[z>>3]=+h[B>>3];h[D>>3]=+h[C>>3];h[F>>3]=+h[E>>3];h[H>>3]=+h[G>>3];if((Em(V,c[53714]|0,1,0)|0)==0){lB(e,118712)}else{lB(e,ka)}if((Mh(e,x,la,0)|0)>1){Y=$w(V)|0;Fv(3,117808,(S=i,i=i+8|0,c[S>>2]=Y,S)|0)|0;i=S}sB(e,(c[Q>>2]|0)+16|0,0)}else{Y=(Em(V,c[53714]|0,1,0)|0)!=0;if((ja|0)==0&(Y^1)){break}X=(c[Q>>2]|0)+16|0;c[y>>2]=c[X>>2];c[y+4>>2]=c[X+4>>2];c[y+8>>2]=c[X+8>>2];c[y+12>>2]=c[X+12>>2];X=(c[Q>>2]|0)+32|0;c[A>>2]=c[X>>2];c[A+4>>2]=c[X+4>>2];c[A+8>>2]=c[X+8>>2];c[A+12>>2]=c[X+12>>2];h[z>>3]=+h[B>>3];h[D>>3]=+h[C>>3];h[F>>3]=+h[E>>3];h[H>>3]=+h[G>>3];if(Y){lB(e,ka)}else{lB(e,118712)}ol(e,x,4,aa,ja)}}while(0);eF(c[w>>2]|0);aa=c[(c[Q>>2]|0)+12>>2]|0;if((aa|0)!=0){ek(e,5,aa)}if(W){if(u){tF(o|0,(c[Q>>2]|0)+16|0,32)|0;aa=c[v>>2]|0;V=c[I>>2]|0;do{if((V&4259840|0)!=0){Y=(V&131072|0)!=0;X=aa+264|0;if(Y){c[X>>2]=0;c[aa+268>>2]=2}else{c[X>>2]=2;c[aa+268>>2]=4}X=aa+272|0;eF(c[X>>2]|0);Z=jk(c[aa+268>>2]<<4)|0;_=Z;c[X>>2]=_;c[Z>>2]=c[o>>2];c[Z+4>>2]=c[o+4>>2];c[Z+8>>2]=c[o+8>>2];c[Z+12>>2]=c[o+12>>2];X=Z+16|0;c[X>>2]=c[J>>2];c[X+4>>2]=c[J+4>>2];c[X+8>>2]=c[J+8>>2];c[X+12>>2]=c[J+12>>2];if((V&8192|0)==0){RA(e,_,_,2)|0}if(Y){break}qi(_)}}while(0);gB(e,c[T>>2]|0,c[U+228>>2]|0,c[U+244>>2]|0,c[U+212>>2]|0)}hB(e)}do{if(!l){V=ux(s)|0;if((V|0)==0){break}else{qa=V}do{Wh(e,qa);V=mw(s,qa)|0;if((V|0)!=0){aa=V;do{Xh(e,aa);aa=ow(s,aa)|0;}while((aa|0)!=0)}qa=vx(s,qa)|0;}while((qa|0)!=0)}}while(0);ZA(e,f);Gh(e);if(u){break}Th(e,s,j)}}while(0);s=c[r>>2]|0;if((N|0)<(c[s+172>>2]|0)){N=N+1|0;O=s}else{break}}i=k;return}function Uh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=ew(b|0,164344)|0;a:do{if((e|0)==0){f=0;g=0}else{if((a[e]|0)==0){f=0;g=0;break}Yh(e)|0;b=c[44118]|0;if((b|0)==0){f=176472;g=0;break}else{h=0;i=176472;j=b}while(1){b=i;k=j;while(1){if((Ya(k|0,164776)|0)==0){l=10;break}if((Ya(k|0,164016)|0)==0){m=b;l=13;break}if((Ya(k|0,163264)|0)==0){n=b;l=15;break}o=b+4|0;if((Ya(k|0,162776)|0)==0){p=b;l=17;break}q=c[o>>2]|0;if((q|0)==0){f=176472;g=h;break a}else{b=o;k=q}}if((l|0)==10){l=0;r=b+4|0;s=h|1}else if((l|0)==13){while(1){l=0;k=m+4|0;q=c[k>>2]|0;c[m>>2]=q;if((q|0)==0){break}else{m=k;l=13}}r=b;s=h|3}else if((l|0)==15){while(1){l=0;k=n+4|0;q=c[k>>2]|0;c[n>>2]=q;if((q|0)==0){break}else{n=k;l=15}}r=b;s=h|64}else if((l|0)==17){while(1){l=0;k=p+4|0;q=c[k>>2]|0;c[p>>2]=q;if((q|0)==0){break}else{p=k;l=17}}r=b;s=h|4}k=c[r>>2]|0;if((k|0)==0){f=176472;g=s;break}else{h=s;i=r;j=k}}}}while(0);c[d>>2]=g;return f|0}function Vh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+8|0;h=f|0;do{if((Lh(b,0,h)|0)==0){j=c[h>>2]|0;k=c[j>>2]|0;if((k|0)<2){break}l=j+8|0;if((c[c[l>>2]>>2]|0)==0){break}if((k|0)>2){Fv(0,110296,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0)|0;i=k}k=kk((xF(b|0)|0)+1|0)|0;c[d>>2]=k;zF(k|0,c[c[l>>2]>>2]|0)|0;if((c[(c[l>>2]|0)+12>>2]|0)==0){c[d+4>>2]=0}else{k=c[d>>2]|0;m=k+((xF(k|0)|0)+1)|0;c[d+4>>2]=m;zF(m|0,c[(c[l>>2]|0)+12>>2]|0)|0}m=c[l>>2]|0;do{if((a[m+8|0]|0)==0){if((a[m+20|0]|0)==0){g[e>>2]=0.0;break}else{g[e>>2]=1.0- +g[m+16>>2];break}}else{g[e>>2]=+g[m+4>>2]}}while(0);eF(c[j+4>>2]|0);eF(c[l>>2]|0);eF(j);n=1;i=f;return n|0}}while(0);c[d>>2]=0;n=0;i=f;return n|0}function Wh(d,f){d=d|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0.0,O=0,P=0.0,Q=0,R=0,S=0,T=0;g=i;j=c[d>>2]|0;k=f+8|0;if((c[(c[k>>2]|0)+8>>2]|0)==0){i=g;return}l=f|0;if((li(d,Hx(l)|0,f)|0)<<24>>24==0){i=g;return}m=c[k>>2]|0;if(+h[m+64>>3]<+h[d+256>>3]){i=g;return}if(+h[d+272>>3]<+h[m+48>>3]){i=g;return}if(+h[m+72>>3]<+h[d+264>>3]){i=g;return}if(+h[d+280>>3]<+h[m+56>>3]){i=g;return}n=m+116|0;m=c[j+28>>2]|0;if((a[n]|0)==(m|0)){i=g;return}a[n]=m;vB(d,$w(l)|0);m=Hm(l,c[53642]|0,213440)|0;if((a[m]|0)!=0){vB(d,m)}m=Hm(l,c[53582]|0,213440)|0;a:do{if((a[m]|0)!=0){Yh(m)|0;n=c[44118]|0;if((n|0)==0){break}else{o=176476;p=n}while(1){if((a[p]|0)==105){if((Ya(p|0,91128)|0)==0){break}}n=c[o>>2]|0;if((n|0)==0){break a}else{o=o+4|0;p=n}}i=g;return}}while(0);p=c[d+152>>2]|0;o=jk(304)|0;if((o|0)==0){Fv(1,115680,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0)|0;i=m}m=d+16|0;n=c[m>>2]|0;c[o>>2]=n;c[m>>2]=o;if((n|0)==0){c[o+144>>2]=3;c[o+148>>2]=0;h[o+152>>3]=1.0}else{m=o+16|0;j=n+16|0;c[m>>2]=c[j>>2];c[m+4>>2]=c[j+4>>2];c[m+8>>2]=c[j+8>>2];c[m+12>>2]=c[j+12>>2];c[m+16>>2]=c[j+16>>2];c[m+20>>2]=c[j+20>>2];c[m+24>>2]=c[j+24>>2];c[m+28>>2]=c[j+28>>2];c[m+32>>2]=c[j+32>>2];c[m+36>>2]=c[j+36>>2];j=o+56|0;m=n+56|0;c[j>>2]=c[m>>2];c[j+4>>2]=c[m+4>>2];c[j+8>>2]=c[m+8>>2];c[j+12>>2]=c[m+12>>2];c[j+16>>2]=c[m+16>>2];c[j+20>>2]=c[m+20>>2];c[j+24>>2]=c[m+24>>2];c[j+28>>2]=c[m+28>>2];c[j+32>>2]=c[m+32>>2];c[j+36>>2]=c[m+36>>2];c[o+144>>2]=c[n+144>>2];c[o+148>>2]=c[n+148>>2];h[o+152>>3]=+h[n+152>>3];c[o+136>>2]=c[n+136>>2];m=o+96|0;j=n+96|0;c[m>>2]=c[j>>2];c[m+4>>2]=c[j+4>>2];c[m+8>>2]=c[j+8>>2];c[m+12>>2]=c[j+12>>2];c[m+16>>2]=c[j+16>>2];c[m+20>>2]=c[j+20>>2];c[m+24>>2]=c[j+24>>2];c[m+28>>2]=c[j+28>>2];c[m+32>>2]=c[j+32>>2];c[m+36>>2]=c[j+36>>2]}c[o+4>>2]=2;c[o+8>>2]=f;c[o+12>>2]=8;do{if((p&16777216|0)!=0){if((e[(c[(Hx(l)|0)+8>>2]|0)+170>>1]|0)>>>0<=2>>>0){h[o+168>>3]=0.0;break}q=+h[(c[(c[k>>2]|0)+132>>2]|0)+16>>3]*72.0;if(q<0.0){r=q+-.5}else{r=q+.5}h[o+168>>3]=+(~~r|0)}}while(0);mi(d,c[(c[k>>2]|0)+104>>2]|0,l);do{if((p&4259840|0)!=0){if((c[o+208>>2]|0)==0){if((b[o+260>>1]&1)==0){break}}j=pl(f)|0;m=c[k>>2]|0;r=+h[m+16>>3];q=+h[m+24>>3];m=Im(l,c[53582]|0,213440)|0;do{if((a[m]|0)==0){s=0}else{Yh(m)|0;n=c[44118]|0;if((n|0)==0){s=0;break}else{t=176472;u=0;v=n}while(1){n=(Ya(v|0,164776)|0)==0;w=n?1:u;n=t+4|0;x=c[n>>2]|0;if((x|0)==0){s=w;break}else{t=n;u=w;v=x}}}}while(0);b:do{if((j&-3|0)==1){m=c[(c[k>>2]|0)+12>>2]|0;x=m+8|0;w=c[x>>2]|0;do{if((w|0)==4){y=+h[m+16>>3];if(y<0.0){z=y+-.5}else{z=y+.5}if(((~~z|0)%90|0|0)!=0){A=1;break}if(+h[m+24>>3]!=0.0){A=1;break}if(+h[m+32>>3]!=0.0){A=1;break}A=(c[m+4>>2]|s|0)==0}else{A=1}}while(0);if(!((m|0)!=0&A)){B=61;break}if((p&524288|0)==0){B=61;break}n=(w|0)<3?1:w;C=m+4|0;D=c[C>>2]|0;E=(D|0)>1?D:1;D=c[m+44>>2]|0;F=ew(l,165160)|0;if((F|0)==0){G=0}else{G=Rb(F|0)|0}F=(G-4|0)>>>0>56>>>0?20:G;if((c[C>>2]|s|0)==0){c[o+264>>2]=0;C=jk(32)|0;h[C>>3]=r- +h[(c[k>>2]|0)+88>>3];h[C+8>>3]=q- +h[(c[k>>2]|0)+80>>3]*.5;h[C+16>>3]=r+ +h[(c[k>>2]|0)+88>>3];h[C+24>>3]=q+ +h[(c[k>>2]|0)+80>>3]*.5;H=C;I=2;break}C=c[x>>2]|0;do{if((C|0)<3){if(+h[m+32>>3]!=0.0){break}if(+h[m+24>>3]!=0.0){break}J=o+264|0;if((c[m>>2]|0)!=0){c[J>>2]=1;K=jk(32)|0;h[K>>3]=r;h[K+8>>3]=q;L=(E<<1)-1|0;h[K+16>>3]=r+ +h[D+(L<<4)>>3];h[K+24>>3]=q+ +h[D+(L<<4)+8>>3];H=K;I=2;break b}c[J>>2]=2;J=(E<<1)-1|0;y=+h[D+(J<<4)>>3];M=+h[D+(J<<4)+8>>3];N=6.283185307179586/+(F|0);J=jk(F<<4)|0;if((F|0)>0){O=0;P=0.0}else{H=J;I=F;break b}while(1){h[J+(O<<4)>>3]=y*+V(P);h[J+(O<<4)+8>>3]=M*+W(P);K=O+1|0;if((K|0)<(F|0)){O=K;P=N+P}else{Q=0;break}}while(1){K=J+(Q<<4)|0;h[K>>3]=r+ +h[K>>3];K=J+(Q<<4)+8|0;h[K>>3]=q+ +h[K>>3];K=Q+1|0;if((K|0)<(F|0)){Q=K}else{H=J;I=F;break b}}}}while(0);m=da(C,E-1|0)|0;c[o+264>>2]=2;w=c[x>>2]|0;if((w|0)<(F|0)){J=jk(n<<4)|0;if((n|0)>0){R=0}else{H=J;I=n;break}while(1){K=R+m|0;h[J+(R<<4)>>3]=r+ +h[D+(K<<4)>>3];h[J+(R<<4)+8>>3]=q+ +h[D+(K<<4)+8>>3];K=R+1|0;if((K|0)<(n|0)){R=K}else{H=J;I=n;break}}}else{n=(w|0)/(F|0)|0;J=jk(F<<4)|0;if((F|0)>0){S=0;T=0}else{H=J;I=F;break}while(1){x=T+m|0;h[J+(S<<4)>>3]=r+ +h[D+(x<<4)>>3];h[J+(S<<4)+8>>3]=q+ +h[D+(x<<4)+8>>3];x=S+1|0;if((x|0)<(F|0)){S=x;T=T+n|0}else{H=J;I=F;break}}}}else{B=61}}while(0);if((B|0)==61){c[o+264>>2]=0;j=jk(32)|0;h[j>>3]=r- +h[(c[k>>2]|0)+88>>3];h[j+8>>3]=q- +h[(c[k>>2]|0)+80>>3]*.5;h[j+16>>3]=r+ +h[(c[k>>2]|0)+96>>3];h[j+24>>3]=q+ +h[(c[k>>2]|0)+80>>3]*.5;H=j;I=2}if((p&8192|0)==0){RA(d,H,H,I)|0}c[o+272>>2]=H;c[o+268>>2]=I}}while(0);Ch(ew(l,148552)|0);cB(d,f);Dc[c[(c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]|0)+20>>2]&63](d,f);f=c[(c[k>>2]|0)+108>>2]|0;k=f;do{if((f|0)!=0){if((a[k+81|0]|0)==0){break}ek(d,10,k)}}while(0);dB(d);Gh(d);i=g;return}function Xh(f,j){f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0,R=0,S=0,U=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Za=0,_a=0,$a=0,ab=0.0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0.0,mb=0.0,nb=0.0,ob=0.0,pb=0.0,qb=0.0,rb=0.0,sb=0.0,tb=0.0,ub=0.0,vb=0.0,wb=0.0,xb=0.0,yb=0.0,zb=0.0,Ab=0.0,Bb=0.0,Cb=0.0,Db=0.0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0;k=i;i=i+2088|0;l=k|0;m=k+48|0;n=k+96|0;o=k+144|0;p=k+192|0;q=k+200|0;r=k+248|0;s=k+312|0;t=k+1112|0;u=k+1912|0;v=k+1928|0;w=k+2056|0;tF(w|0,f+256|0,32)|0;x=j+8|0;y=c[x>>2]|0;z=c[y+8>>2]|0;do{if((z|0)==0){A=6}else{if(+h[z+24>>3]<+h[w>>3]){A=6;break}if(+h[w+16>>3]<+h[z+8>>3]){A=6;break}if(+h[z+32>>3]<+h[w+8>>3]){A=6;break}if(+h[w+24>>3]<+h[z+16>>3]){A=6}}}while(0);do{if((A|0)==6){z=c[y+96>>2]|0;if((z|0)==0){B=y}else{if((nn(z,w)|0)<<24>>24!=0){break}B=c[x>>2]|0}z=c[B+108>>2]|0;C=z;if((z|0)==0){i=k;return}if((a[C+81|0]|0)==0){i=k;return}if((nn(C,w)|0)<<24>>24!=0){break}i=k;return}}while(0);w=j;B=j-32|0;Hx(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)|0;y=f+156|0;a:do{if((c[y>>2]|0)>=2){C=Hm(j|0,c[53776]|0,213440)|0;z=f|0;D=f+160|0;if(($h(c[z>>2]|0,c[D>>2]|0,c[y>>2]|0,C)|0)<<24>>24!=0){break}if((a[C]|0)!=0){i=k;return}C=j+32|0;E=0;do{F=c[w>>2]&3;if((E|0)<1){G=(F|0)==3?j:C}else{G=(F|0)==2?j:B}F=Hm(c[G+28>>2]|0,c[53612]|0,213440)|0;if((a[F]|0)==0){break a}E=E+1|0;if(($h(c[z>>2]|0,c[D>>2]|0,c[y>>2]|0,F)|0)<<24>>24!=0){break a}}while((E|0)<2);i=k;return}}while(0);y=j+32|0;G=xF($w(c[((c[w>>2]&3|0)==3?j:y)+28>>2]|0)|0)|0;E=dF(G+3+(xF($w(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)|0)|0)|0)|0;zF(E|0,$w(c[((c[w>>2]&3|0)==3?j:y)+28>>2]|0)|0)|0;G=(Nw(Hx(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)|0)|0)==0;D=E+(xF(E|0)|0)|0;if(G){a[D]=a[91968]|0;a[D+1|0]=a[91969]|0;a[D+2|0]=a[91970]|0}else{a[D]=a[92624]|0;a[D+1|0]=a[92625]|0;a[D+2|0]=a[92626]|0}AF(E|0,$w(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)|0)|0;vB(f,E);eF(E);E=j|0;D=Hm(E,c[53814]|0,213440)|0;if((a[D]|0)!=0){vB(f,D)}D=Hm(E,c[53760]|0,213440)|0;b:do{if((a[D]|0)==0){H=0}else{Yh(D)|0;G=c[44118]|0;if((G|0)==0){H=176472;break}else{I=176476;J=G}while(1){if((a[J]|0)==105){if((Ya(J|0,91128)|0)==0){break}}G=c[I>>2]|0;if((G|0)==0){H=176472;break b}else{I=I+4|0;J=G}}i=k;return}}while(0);J=v|0;v=f+152|0;I=c[v>>2]|0;D=jk(304)|0;if((D|0)==0){Fv(1,115680,(K=i,i=i+1|0,i=i+7&-8,c[K>>2]=0,K)|0)|0;i=K}G=f+16|0;z=c[G>>2]|0;c[D>>2]=z;c[G>>2]=D;if((z|0)==0){c[D+144>>2]=3;c[D+148>>2]=0;h[D+152>>3]=1.0}else{C=D+16|0;F=z+16|0;c[C>>2]=c[F>>2];c[C+4>>2]=c[F+4>>2];c[C+8>>2]=c[F+8>>2];c[C+12>>2]=c[F+12>>2];c[C+16>>2]=c[F+16>>2];c[C+20>>2]=c[F+20>>2];c[C+24>>2]=c[F+24>>2];c[C+28>>2]=c[F+28>>2];c[C+32>>2]=c[F+32>>2];c[C+36>>2]=c[F+36>>2];F=D+56|0;C=z+56|0;c[F>>2]=c[C>>2];c[F+4>>2]=c[C+4>>2];c[F+8>>2]=c[C+8>>2];c[F+12>>2]=c[C+12>>2];c[F+16>>2]=c[C+16>>2];c[F+20>>2]=c[C+20>>2];c[F+24>>2]=c[C+24>>2];c[F+28>>2]=c[C+28>>2];c[F+32>>2]=c[C+32>>2];c[F+36>>2]=c[C+36>>2];c[D+144>>2]=c[z+144>>2];c[D+148>>2]=c[z+148>>2];h[D+152>>3]=+h[z+152>>3];c[D+136>>2]=c[z+136>>2];C=D+96|0;F=z+96|0;c[C>>2]=c[F>>2];c[C+4>>2]=c[F+4>>2];c[C+8>>2]=c[F+8>>2];c[C+12>>2]=c[F+12>>2];c[C+16>>2]=c[F+16>>2];c[C+20>>2]=c[F+20>>2];c[C+24>>2]=c[F+24>>2];c[C+28>>2]=c[F+28>>2];c[C+32>>2]=c[F+32>>2];c[C+36>>2]=c[F+36>>2]}c[D+4>>2]=3;c[D+8>>2]=j;c[D+12>>2]=9;F=(H|0)==0;do{if(!F){if((c[(c[x>>2]|0)+8>>2]|0)==0){break}pB(f,H)}}while(0);C=c[53772]|0;do{if((C|0)!=0){z=fw(E,C)|0;if((z|0)==0){break}if((a[z]|0)==0){break}xB(f,+Fm(E,c[53772]|0,1.0,0.0))}}while(0);do{if((I&16777216|0)!=0){if((e[(c[(Hx(c[((c[w>>2]&3|0)==3?j:y)+28>>2]|0)|0)+8>>2]|0)+170>>1]|0)>>>0<=2>>>0){vF(D+176|0,0,16)|0;break}L=+h[(c[(c[(c[((c[w>>2]&3|0)==3?j:y)+28>>2]|0)+8>>2]|0)+132>>2]|0)+16>>3]*72.0;if(L<0.0){M=L+-.5}else{M=L+.5}h[D+176>>3]=+(~~M|0);L=+h[(c[(c[(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)+8>>2]|0)+132>>2]|0)+16>>3]*72.0;if(L<0.0){N=L+-.5}else{N=L+.5}h[D+184>>3]=+(~~N|0)}}while(0);do{if((I&32768|0)!=0){C=c[(c[x>>2]|0)+96>>2]|0;if((C|0)==0){O=c[D+192>>2]|0}else{z=c[C>>2]|0;c[D+192>>2]=z;O=z}z=D+196|0;c[z>>2]=O;C=D+204|0;c[C>>2]=O;P=D+200|0;c[P>>2]=O;Q=c[x>>2]|0;R=c[Q+108>>2]|0;if((R|0)==0){S=Q}else{c[z>>2]=c[R>>2];S=c[x>>2]|0}R=c[S+104>>2]|0;if((R|0)==0){U=S}else{c[P>>2]=c[R>>2];U=c[x>>2]|0}R=c[U+100>>2]|0;if((R|0)==0){break}c[C>>2]=c[R>>2]}}while(0);c:do{if((I&65536|0)==0){X=0}else{Iv(u,128,J);c[D+212>>2]=fk(Ih(f,E,u)|0,E)|0;Mv(u);U=ew(E,83344)|0;if((U|0)==0){A=67}else{if((a[U]|0)==0){A=67}else{Y=U;A=69}}do{if((A|0)==67){U=ew(E,82904)|0;if((U|0)==0){Z=0;break}if((a[U]|0)==0){Z=0}else{Y=U;A=69}}}while(0);if((A|0)==69){Z=fk(Y,E)|0}U=ew(E,82520)|0;if((U|0)==0){A=72}else{if((a[U]|0)==0){A=72}else{_=U;A=74}}do{if((A|0)==72){U=ew(E,81944)|0;if((U|0)!=0){if((a[U]|0)!=0){_=U;A=74;break}}if((Z|0)==0){break}c[D+208>>2]=Lb(Z|0)|0}}while(0);if((A|0)==74){c[D+208>>2]=fk(_,E)|0}U=ew(E,81232)|0;if((U|0)==0){A=79}else{if((a[U]|0)==0){A=79}else{aa=U;A=81}}do{if((A|0)==79){U=ew(E,80736)|0;if((U|0)!=0){if((a[U]|0)!=0){aa=U;A=81;break}}if((Z|0)==0){break}c[D+216>>2]=Lb(Z|0)|0}}while(0);if((A|0)==81){c[D+216>>2]=fk(aa,E)|0}U=ew(E,80256)|0;if((U|0)==0){A=86}else{if((a[U]|0)==0){A=86}else{ba=U;A=88}}do{if((A|0)==86){U=ew(E,79928)|0;if((U|0)!=0){if((a[U]|0)!=0){ba=U;A=88;break}}if((Z|0)==0){break}c[D+220>>2]=Lb(Z|0)|0}}while(0);if((A|0)==88){c[D+220>>2]=fk(ba,E)|0;U=D+260|0;b[U>>1]=b[U>>1]|128}U=ew(E,79504)|0;if((U|0)==0){A=93}else{if((a[U]|0)==0){A=93}else{ca=U}}do{if((A|0)==93){U=ew(E,79152)|0;if((U|0)!=0){if((a[U]|0)!=0){ca=U;break}}if((Z|0)==0){X=0;break c}c[D+224>>2]=Lb(Z|0)|0;X=Z;break c}}while(0);c[D+224>>2]=fk(ca,E)|0;U=D+260|0;b[U>>1]=b[U>>1]|256;X=Z}}while(0);d:do{if((I&8388608|0)==0){da=0}else{Z=ew(E,78880)|0;do{if((Z|0)==0){ea=0}else{if((a[Z]|0)==0){ea=0;break}ea=fk(Z,E)|0}}while(0);Z=ew(E,168888)|0;do{if((Z|0)==0){A=105}else{if((a[Z]|0)==0){A=105;break}ca=D+260|0;b[ca>>1]=b[ca>>1]|64;c[D+244>>2]=fk(Z,E)|0}}while(0);do{if((A|0)==105){if((ea|0)==0){break}c[D+244>>2]=Lb(ea|0)|0}}while(0);Z=ew(E,168536)|0;do{if((Z|0)==0){A=110}else{if((a[Z]|0)==0){A=110;break}c[D+248>>2]=fk(Z,E)|0}}while(0);do{if((A|0)==110){if((ea|0)==0){break}c[D+248>>2]=Lb(ea|0)|0}}while(0);Z=ew(E,168152)|0;do{if((Z|0)==0){A=115}else{if((a[Z]|0)==0){A=115;break}c[D+252>>2]=fk(Z,E)|0;ca=D+260|0;b[ca>>1]=b[ca>>1]|16}}while(0);do{if((A|0)==115){if((ea|0)==0){break}c[D+252>>2]=Lb(ea|0)|0}}while(0);Z=ew(E,167432)|0;do{if((Z|0)!=0){if((a[Z]|0)==0){break}ca=D+260|0;b[ca>>1]=b[ca>>1]|32;c[D+256>>2]=fk(Z,E)|0;da=ea;break d}}while(0);if((ea|0)==0){da=0;break}c[D+256>>2]=Lb(ea|0)|0;da=ea}}while(0);e:do{if((I&4194304|0)!=0){ea=ew(E,166968)|0;if((ea|0)==0){A=125}else{if((a[ea]|0)==0){A=125}else{fa=ea;A=127}}do{if((A|0)==125){ea=ew(E,166528)|0;if((ea|0)!=0){if((a[ea]|0)!=0){fa=ea;A=127;break}}ea=c[D+192>>2]|0;if((ea|0)==0){break}c[D+228>>2]=Lb(ea|0)|0}}while(0);if((A|0)==127){c[D+228>>2]=fk(fa,E)|0;ea=D+260|0;b[ea>>1]=b[ea>>1]|1}ea=ew(E,166176)|0;do{if((ea|0)==0){A=133}else{if((a[ea]|0)==0){A=133;break}c[D+232>>2]=fk(ea,E)|0;Z=D+260|0;b[Z>>1]=b[Z>>1]|8}}while(0);do{if((A|0)==133){ea=c[D+192>>2]|0;if((ea|0)==0){break}c[D+232>>2]=Lb(ea|0)|0}}while(0);ea=ew(E,165800)|0;do{if((ea|0)==0){A=138}else{if((a[ea]|0)==0){A=138;break}c[D+236>>2]=fk(ea,E)|0;Z=D+260|0;b[Z>>1]=b[Z>>1]|2}}while(0);do{if((A|0)==138){ea=c[D+200>>2]|0;if((ea|0)==0){break}c[D+236>>2]=Lb(ea|0)|0}}while(0);ea=ew(E,165472)|0;do{if((ea|0)!=0){if((a[ea]|0)==0){break}c[D+240>>2]=fk(ea,E)|0;Z=D+260|0;b[Z>>1]=b[Z>>1]|4;break e}}while(0);ea=c[D+204>>2]|0;if((ea|0)==0){break}c[D+240>>2]=Lb(ea|0)|0}}while(0);eF(X);eF(da);do{if((I&4259840|0)!=0){da=c[(c[x>>2]|0)+8>>2]|0;if((da|0)==0){break}if((c[D+208>>2]|0)==0){if((c[D+228>>2]|0)==0){break}}if((I&524288|0)==0){break}N=+h[(c[G>>2]|0)+152>>3]*.5;M=N>2.0?N:2.0;X=c[da+4>>2]|0;if((X|0)>0){fa=da|0;da=r;ea=s;Z=t;ca=r|0;ba=r+16|0;aa=r+32|0;_=r+48|0;Y=0;u=0;J=0;U=0;while(1){S=c[fa>>2]|0;O=kk(24)|0;R=O;c[O+16>>2]=1;C=(c[S+(U*48|0)+4>>2]|0)-1|0;P=(C|0)/3|0;if((C|0)>2){C=S+(U*48|0)|0;S=R;z=0;do{Q=z*3|0;ga=c[C>>2]|0;ha=ga+(Q<<4)|0;c[da>>2]=c[ha>>2];c[da+4>>2]=c[ha+4>>2];c[da+8>>2]=c[ha+8>>2];c[da+12>>2]=c[ha+12>>2];ha=ga+(Q+1<<4)|0;c[ba>>2]=c[ha>>2];c[ba+4>>2]=c[ha+4>>2];c[ba+8>>2]=c[ha+8>>2];c[ba+12>>2]=c[ha+12>>2];ha=ga+(Q+2<<4)|0;c[aa>>2]=c[ha>>2];c[aa+4>>2]=c[ha+4>>2];c[aa+8>>2]=c[ha+8>>2];c[aa+12>>2]=c[ha+12>>2];ha=ga+(Q+3<<4)|0;c[_>>2]=c[ha>>2];c[_+4>>2]=c[ha+4>>2];c[_+8>>2]=c[ha+8>>2];c[_+12>>2]=c[ha+12>>2];S=ki(ca,S)|0;z=z+1|0;}while((z|0)<(P|0))}if((O|0)==0){ia=J;ja=u;ka=Y}else{P=0;z=R;S=0;C=J;ha=u;Q=Y;while(1){ga=c[z+16>>2]|0;la=s+(S<<4)|0;ma=t+(S<<4)|0;N=+h[z>>3];L=+h[z+8>>3];do{if((P|0)==0){na=+h[ga>>3];oa=+h[ga+8>>3];pa=na;qa=oa;ra=N*2.0-na;sa=L*2.0-oa}else{oa=+h[P>>3];na=+h[P+8>>3];if((ga|0)==0){pa=N*2.0-oa;qa=L*2.0-na;ra=oa;sa=na;break}else{pa=+h[ga>>3];qa=+h[ga+8>>3];ra=oa;sa=na;break}}}while(0);na=+$(+(sa-L),+(ra-N));oa=+$(+(qa-L),+(pa-N))-na;if(oa>0.0){ta=oa+ -6.283185307179586}else{ta=oa}oa=na+ta*.5;na=M*+V(oa);ua=M*+W(oa);h[la>>3]=N+na;h[s+(S<<4)+8>>3]=L+ua;h[ma>>3]=N-na;h[t+(S<<4)+8>>3]=L-ua;va=S+1|0;wa=(ga|0)==0;if(wa|(va|0)==50){xa=va<<1;ya=xa-1|0;if((C|0)>0){za=0;Aa=0;do{za=(c[ha+(Aa<<2)>>2]|0)+za|0;Aa=Aa+1|0;}while((Aa|0)<(C|0));Ba=za;Ca=(C|0)>1?C:1}else{Ba=0;Ca=0}Aa=C+1|0;Da=mk(ha,Aa<<2)|0;c[Da+(Ca<<2)>>2]=xa;Ea=mk(Q,Ba+xa<<4)|0;do{if((S|0)>-1){Fa=ya+Ba|0;Ga=Ea+(Ba<<4)|0;c[Ga>>2]=c[ea>>2];c[Ga+4>>2]=c[ea+4>>2];c[Ga+8>>2]=c[ea+8>>2];c[Ga+12>>2]=c[ea+12>>2];Ga=Ea+(Fa<<4)|0;c[Ga>>2]=c[Z>>2];c[Ga+4>>2]=c[Z+4>>2];c[Ga+8>>2]=c[Z+8>>2];c[Ga+12>>2]=c[Z+12>>2];if((S|0)>0){Ha=1}else{break}do{Ga=Ea+(Ha+Ba<<4)|0;Ia=s+(Ha<<4)|0;c[Ga>>2]=c[Ia>>2];c[Ga+4>>2]=c[Ia+4>>2];c[Ga+8>>2]=c[Ia+8>>2];c[Ga+12>>2]=c[Ia+12>>2];Ia=Ea+(Fa-Ha<<4)|0;Ga=t+(Ha<<4)|0;c[Ia>>2]=c[Ga>>2];c[Ia+4>>2]=c[Ga+4>>2];c[Ia+8>>2]=c[Ga+8>>2];c[Ia+12>>2]=c[Ga+12>>2];Ha=Ha+1|0;}while((Ha|0)<(va|0))}}while(0);ya=la;c[ea>>2]=c[ya>>2];c[ea+4>>2]=c[ya+4>>2];c[ea+8>>2]=c[ya+8>>2];c[ea+12>>2]=c[ya+12>>2];ya=ma;c[Z>>2]=c[ya>>2];c[Z+4>>2]=c[ya+4>>2];c[Z+8>>2]=c[ya+8>>2];c[Z+12>>2]=c[ya+12>>2];Ja=1;Ka=Aa;Ma=Da;Na=Ea}else{Ja=va;Ka=C;Ma=ha;Na=Q}if(wa){Oa=R;break}else{P=z;z=ga;S=Ja;C=Ka;ha=Ma;Q=Na}}while(1){Q=c[Oa+16>>2]|0;eF(Oa);if((Q|0)==0){ia=Ka;ja=Ma;ka=Na;break}else{Oa=Q}}}Q=U+1|0;if((Q|0)<(X|0)){Y=ka;u=ja;J=ia;U=Q}else{Pa=ka;Qa=ja;Ra=ia;break}}}else{Pa=0;Qa=0;Ra=0}c[D+276>>2]=Ra;c[D+280>>2]=Qa;if((I&8192|0)==0){if((Ra|0)>0){U=0;J=0;while(1){u=(c[Qa+(U<<2)>>2]|0)+J|0;Y=U+1|0;if((Y|0)<(Ra|0)){U=Y;J=u}else{Sa=u;break}}}else{Sa=0}RA(f,Pa,Pa,Sa)|0}c[D+284>>2]=Pa;c[D+264>>2]=2;c[D+272>>2]=Pa;c[D+268>>2]=c[Qa>>2]}}while(0);eB(f,j);Qa=c[D+208>>2]|0;if((Qa|0)==0){if((b[D+260>>1]&1)!=0){A=181}}else{A=181}if((A|0)==181){gB(f,Qa,c[D+228>>2]|0,c[D+244>>2]|0,c[D+212>>2]|0)}D=q;ta=+h[(c[G>>2]|0)+152>>3];Ch(ew(E,148552)|0);f:do{if((c[(c[x>>2]|0)+8>>2]|0)!=0){pa=+Fm(E,c[53820]|0,1.0,0.0);Qa=Hm(E,c[53816]|0,213440)|0;Pa=(H|0)!=0;g:do{if(Pa){Sa=c[H>>2]|0;if((Sa|0)==0){Ta=0;break}else{Ua=H;Va=Sa}while(1){Sa=Ua+4|0;if((a[Va]|0)==116){if((Ya(Va|0,87744)|0)==0){Ta=1;break g}}Ra=c[Sa>>2]|0;if((Ra|0)==0){Ta=0;break}else{Ua=Sa;Va=Ra}}}else{Ta=0}}while(0);Ra=Qa;Sa=0;I=0;while(1){ia=a[Ra]|0;if((ia<<24>>24|0)==58){Wa=Sa+1|0;Xa=I}else if((ia<<24>>24|0)==59){Wa=Sa;Xa=I+1|0}else if((ia<<24>>24|0)==0){break}else{Wa=Sa;Xa=I}Ra=Ra+1|0;Sa=Wa;I=Xa}Ra=(Sa|0)==0;do{if((I|0)==0|Ra){Za=Qa}else{ia=l;ja=m;ka=o;Oa=Lh(Qa,Sa+1|0,p)|0;if((Oa|0)>1){Na=Hx(c[((c[w>>2]&3|0)==3?j:y)+28>>2]|0)|0;Ma=$w(c[((c[w>>2]&3|0)==3?j:y)+28>>2]|0)|0;Ka=(Nw(Na)|0)!=0;Na=$w(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)|0;Fv(3,84552,(K=i,i=i+24|0,c[K>>2]=Ma,c[K+8>>2]=Ka?84144:83704,c[K+16>>2]=Na,K)|0)|0;i=K;if((Oa|0)==2){Za=159752;break}}else{if((Oa|0)==1){Za=159752;break}}Oa=c[(c[x>>2]|0)+8>>2]|0;if((c[Oa+4>>2]|0)>0){Na=l+8|0;Ka=l+12|0;Ma=l+32|0;Ja=l+4|0;Ha=l|0;t=l+16|0;s=m|0;Ba=n|0;Ca=n+4|0;r=o|0;J=o+4|0;U=c[p>>2]|0;u=U+8|0;Y=0;X=0;Z=Oa;while(1){Oa=(c[Z>>2]|0)+(Y*48|0)|0;c[ia>>2]=c[Oa>>2];c[ia+4>>2]=c[Oa+4>>2];c[ia+8>>2]=c[Oa+8>>2];c[ia+12>>2]=c[Oa+12>>2];c[ia+16>>2]=c[Oa+16>>2];c[ia+20>>2]=c[Oa+20>>2];c[ia+24>>2]=c[Oa+24>>2];c[ia+28>>2]=c[Oa+28>>2];c[ia+32>>2]=c[Oa+32>>2];c[ia+36>>2]=c[Oa+36>>2];c[ia+40>>2]=c[Oa+40>>2];c[ia+44>>2]=c[Oa+44>>2];Oa=c[u>>2]|0;ea=c[Oa>>2]|0;h:do{if((ea|0)==0){_a=X}else{ca=X;qa=1.0;_=1;aa=Oa;ba=ea;i:while(1){da=aa+4|0;ra=+g[da>>2];do{if(ra<1.0e-5&ra>-1.0e-5){$a=_;ab=qa;bb=ca}else{lB(f,ba);sa=+g[da>>2];M=qa-sa;cb=c[aa>>2]|0;if((_|0)!=0){ji(l,sa,n,o);fa=c[Ba>>2]|0;tB(f,fa,c[Ca>>2]|0,0,0,0);eF(fa);if(M<1.0e-5&M>-1.0e-5){A=204;break i}else{$a=0;ab=M;bb=cb;break}}if(M<1.0e-5&M>-1.0e-5){A=206;break i}c[ja>>2]=c[ka>>2];c[ja+4>>2]=c[ka+4>>2];c[ja+8>>2]=c[ka+8>>2];c[ja+12>>2]=c[ka+12>>2];c[ja+16>>2]=c[ka+16>>2];c[ja+20>>2]=c[ka+20>>2];c[ja+24>>2]=c[ka+24>>2];c[ja+28>>2]=c[ka+28>>2];c[ja+32>>2]=c[ka+32>>2];c[ja+36>>2]=c[ka+36>>2];c[ja+40>>2]=c[ka+40>>2];c[ja+44>>2]=c[ka+44>>2];sa=+g[da>>2];ji(m,sa/(M+sa),n,o);eF(c[s>>2]|0);fa=c[Ba>>2]|0;tB(f,fa,c[Ca>>2]|0,0,0,0);eF(fa);$a=0;ab=M;bb=cb}}while(0);da=aa+12|0;fa=c[da>>2]|0;if((fa|0)==0){_a=bb;break h}else{ca=bb;qa=ab;_=$a;aa=da;ba=fa}}if((A|0)==204){A=0;eF(c[r>>2]|0);_a=cb;break}else if((A|0)==206){A=0;ba=c[r>>2]|0;tB(f,ba,c[J>>2]|0,0,0,0);eF(ba);_a=cb;break}}}while(0);if((c[Na>>2]|0)!=0){lB(f,c[c[u>>2]>>2]|0);nB(f,c[c[u>>2]>>2]|0);qh(f,2,t,c[Ha>>2]|0,pa,ta,c[Na>>2]|0)}if((c[Ka>>2]|0)!=0){lB(f,_a);nB(f,_a);qh(f,3,Ma,(c[Ha>>2]|0)+((c[Ja>>2]|0)-1<<4)|0,pa,ta,c[Ka>>2]|0)}ea=c[(c[x>>2]|0)+8>>2]|0;Oa=c[ea+4>>2]|0;do{if((Oa|0)>1){if((c[Na>>2]|0)==0){if((c[Ka>>2]|0)==0|F){db=ea;eb=Oa;break}}else{if(F){db=ea;eb=Oa;break}}pB(f,H);ga=c[(c[x>>2]|0)+8>>2]|0;db=ga;eb=c[ga+4>>2]|0}else{db=ea;eb=Oa}}while(0);Oa=Y+1|0;if((Oa|0)<(eb|0)){Y=Oa;X=_a;Z=db}else{fb=U;break}}}else{fb=c[p>>2]|0}eF(fb);break f}}while(0);Qa=d[(c[x>>2]|0)+115|0]|0;do{if((Qa&1|0)==0){if((Qa&2|0)!=0){I=c[53764]|0;U=Im(E,I,ei(Za,139280)|0)|0;gb=U;hb=Im(E,c[53766]|0,136712)|0;A=229;break}if((Qa&8|0)!=0){U=c[53806]|0;I=Im(E,U,ei(Za,133792)|0)|0;gb=I;hb=Im(E,c[53808]|0,131744)|0;A=229;break}if((Qa&4|0)==0){ib=Im(E,c[53802]|0,Za)|0;jb=Za;break}else{I=c[53752]|0;U=Im(E,I,ei(Za,129560)|0)|0;gb=U;hb=Im(E,c[53754]|0,126280)|0;A=229;break}}else{U=c[53824]|0;I=Im(E,U,ei(Za,145328)|0)|0;gb=I;hb=Im(E,c[53826]|0,142384)|0;A=229}}while(0);do{if((A|0)==229){if((gb|0)==(Za|0)){ib=hb;jb=Za;break}lB(f,gb);ib=hb;jb=gb}}while(0);if((ib|0)!=(Za|0)){nB(f,ib)}if(Ta<<24>>24!=0){Qa=(a[jb]|0)==0?159752:jb;I=(a[ib]|0)==0?159752:ib;lB(f,118712);nB(f,Qa);U=c[c[(c[x>>2]|0)+8>>2]>>2]|0;c[D>>2]=c[U>>2];c[D+4>>2]=c[U+4>>2];c[D+8>>2]=c[U+8>>2];c[D+12>>2]=c[U+12>>2];c[D+16>>2]=c[U+16>>2];c[D+20>>2]=c[U+20>>2];c[D+24>>2]=c[U+24>>2];c[D+28>>2]=c[U+28>>2];c[D+32>>2]=c[U+32>>2];c[D+36>>2]=c[U+36>>2];c[D+40>>2]=c[U+40>>2];c[D+44>>2]=c[U+44>>2];U=c[53804]|0;do{if((U|0)==0){A=240}else{Z=fw(E,U)|0;X=a[Z]|0;if((X<<24>>24|0)==102){if((Ya(Z|0,86688)|0)==0){kb=6;break}else{A=240;break}}else if((X<<24>>24|0)==98){if((Ya(Z|0,85856)|0)==0){kb=8;break}if((Ya(Z|0,85384)|0)==0){kb=4;break}else{A=240;break}}else if((X<<24>>24|0)==110){if((Ya(Z|0,84920)|0)==0){kb=2;break}else{A=240;break}}else{A=240;break}}}while(0);if((A|0)==240){U=(Nw(Hx(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)|0)|0)!=0;kb=U?6:2}U=rm(q,kb,ta,0,0)|0;Z=U+8|0;rB(f,c[Z>>2]|0,c[U>>2]|0,1);if((U|0)!=0){eF(c[Z>>2]|0);eF(U)}lB(f,Qa);if((I|0)!=(Qa|0)){nB(f,I)}U=c[q+8>>2]|0;if((U|0)!=0){qh(f,2,q+16|0,c[q>>2]|0,pa,ta,U)}U=c[q+12>>2]|0;if((U|0)==0){break}qh(f,3,q+32|0,(c[q>>2]|0)+((c[q+4>>2]|0)-1<<4)|0,pa,ta,U);break}U=c[x>>2]|0;if(Ra){do{if((a[U+115|0]&3)==0){if((a[jb]|0)!=0){lB(f,jb);nB(f,ib);break}lB(f,159752);if((a[ib]|0)==0){nB(f,159752);break}else{nB(f,ib);break}}}while(0);Ra=c[(c[x>>2]|0)+8>>2]|0;if((c[Ra+4>>2]|0)<=0){break}I=q|0;Qa=q+4|0;Z=q+8|0;X=q+12|0;Y=Pa^1;Ka=q+32|0;Na=q+16|0;if(Pa){Ja=0;Ha=Ra;while(1){Ma=(c[Ha>>2]|0)+(Ja*48|0)|0;c[D>>2]=c[Ma>>2];c[D+4>>2]=c[Ma+4>>2];c[D+8>>2]=c[Ma+8>>2];c[D+12>>2]=c[Ma+12>>2];c[D+16>>2]=c[Ma+16>>2];c[D+20>>2]=c[Ma+20>>2];c[D+24>>2]=c[Ma+24>>2];c[D+28>>2]=c[Ma+28>>2];c[D+32>>2]=c[Ma+32>>2];c[D+36>>2]=c[Ma+36>>2];c[D+40>>2]=c[Ma+40>>2];c[D+44>>2]=c[Ma+44>>2];Ma=c[I>>2]|0;t=c[Qa>>2]|0;do{if((c[v>>2]&16384|0)==0){tB(f,Ma,t,0,0,0);u=c[Z>>2]|0;if((u|0)!=0){qh(f,2,Na,c[I>>2]|0,pa,ta,u)}u=c[X>>2]|0;if((u|0)!=0){qh(f,3,Ka,(c[I>>2]|0)+((c[Qa>>2]|0)-1<<4)|0,pa,ta,u)}if((c[(c[(c[x>>2]|0)+8>>2]|0)+4>>2]|0)<=1){break}if((c[Z>>2]|0)==0){if((c[X>>2]|0)==0|Y){break}}pB(f,H)}else{tB(f,Ma,t,c[Z>>2]|0,c[X>>2]|0,0)}}while(0);Ja=Ja+1|0;Ha=c[(c[x>>2]|0)+8>>2]|0;if((Ja|0)>=(c[Ha+4>>2]|0)){break f}}}else{Ha=0;Ja=Ra;while(1){Pa=(c[Ja>>2]|0)+(Ha*48|0)|0;c[D>>2]=c[Pa>>2];c[D+4>>2]=c[Pa+4>>2];c[D+8>>2]=c[Pa+8>>2];c[D+12>>2]=c[Pa+12>>2];c[D+16>>2]=c[Pa+16>>2];c[D+20>>2]=c[Pa+20>>2];c[D+24>>2]=c[Pa+24>>2];c[D+28>>2]=c[Pa+28>>2];c[D+32>>2]=c[Pa+32>>2];c[D+36>>2]=c[Pa+36>>2];c[D+40>>2]=c[Pa+40>>2];c[D+44>>2]=c[Pa+44>>2];Pa=c[I>>2]|0;t=c[Qa>>2]|0;do{if((c[v>>2]&16384|0)==0){tB(f,Pa,t,0,0,0);Ma=c[Z>>2]|0;if((Ma|0)!=0){qh(f,2,Na,c[I>>2]|0,pa,ta,Ma)}Ma=c[X>>2]|0;if((Ma|0)!=0){qh(f,3,Ka,(c[I>>2]|0)+((c[Qa>>2]|0)-1<<4)|0,pa,ta,Ma)}if((c[(c[(c[x>>2]|0)+8>>2]|0)+4>>2]|0)<=1){break}if((c[Z>>2]|0)!=0){break}if((c[X>>2]|0)==0|Y){break}pB(f,0)}else{tB(f,Pa,t,c[Z>>2]|0,c[X>>2]|0,0)}}while(0);Ha=Ha+1|0;Ja=c[(c[x>>2]|0)+8>>2]|0;if((Ha|0)>=(c[Ja+4>>2]|0)){break f}}}}Ja=U+8|0;Ha=c[Ja>>2]|0;X=c[Ha+4>>2]|0;Z=X*48|0;Y=dF(Z)|0;Qa=Y;I=dF(Z)|0;Z=I;qa=+(Sa+2|0)*.5;Ka=(X|0)>0;j:do{if(Ka){Na=q+4|0;Ra=q|0;ra=0.0;M=0.0;t=0;Pa=Ha;while(1){Ma=(c[Pa>>2]|0)+(t*48|0)|0;c[D>>2]=c[Ma>>2];c[D+4>>2]=c[Ma+4>>2];c[D+8>>2]=c[Ma+8>>2];c[D+12>>2]=c[Ma+12>>2];c[D+16>>2]=c[Ma+16>>2];c[D+20>>2]=c[Ma+20>>2];c[D+24>>2]=c[Ma+24>>2];c[D+28>>2]=c[Ma+28>>2];c[D+32>>2]=c[Ma+32>>2];c[D+36>>2]=c[Ma+36>>2];c[D+40>>2]=c[Ma+40>>2];c[D+44>>2]=c[Ma+44>>2];Ma=c[Na>>2]|0;c[Qa+(t*48|0)+4>>2]=Ma;c[Z+(t*48|0)+4>>2]=Ma;u=Ma<<4;J=dF(u)|0;r=J;c[Qa+(t*48|0)>>2]=r;Ca=dF(u)|0;c[Z+(t*48|0)>>2]=Ca;u=c[Ra>>2]|0;sa=+h[u>>3];L=+h[u+8>>3];Ba=Ma-1|0;if((Ba|0)>0){Ma=J+8|0;N=ra;ua=M;na=L;oa=sa;J=0;while(1){s=J+1|0;lb=+h[u+(s<<4)>>3];mb=+h[u+(s<<4)+8>>3];ka=r+(J<<4)|0;if((J|0)==0){nb=oa-lb;ob=na-mb;pb=2.0/+T(nb*nb+ob*ob+1.0e-4);qb=ob*pb;h[ka>>3]=qb;h[Ma>>3]=-0.0-nb*pb;rb=qb}else{qb=ua-lb;pb=N-mb;nb=2.0/+T(qb*qb+pb*pb+1.0e-4);ob=pb*nb;h[ka>>3]=ob;h[r+(J<<4)+8>>3]=-0.0-qb*nb;rb=ob}ka=J+2|0;ob=+h[u+(ka<<4)>>3];nb=+h[u+(ka<<4)+8>>3];ja=J+3|0;qb=+h[u+(ja<<4)>>3];pb=+h[u+(ja<<4)+8>>3];ia=r+(s<<4)|0;Oa=r+(ka<<4)|0;sb=lb-ob;tb=mb-nb;ub=+T(sb*sb+tb*tb);if(ub<1.0e-4){vb=oa-qb;wb=na-pb;xb=wb;yb=vb;zb=+T(vb*vb+wb*wb+1.0e-4)}else{xb=tb;yb=sb;zb=ub}ub=2.0/zb;sb=xb*ub;tb=-0.0-yb*ub;ea=Oa;h[Oa>>3]=sb;h[r+(ka<<4)+8>>3]=tb;Oa=ia;c[Oa>>2]=c[ea>>2];c[Oa+4>>2]=c[ea+4>>2];c[Oa+8>>2]=c[ea+8>>2];c[Oa+12>>2]=c[ea+12>>2];h[Ca+(J<<4)>>3]=oa-qa*rb;h[Ca+(J<<4)+8>>3]=na-qa*+h[r+(J<<4)+8>>3];h[Ca+(s<<4)>>3]=lb-qa*+h[ia>>3];h[Ca+(s<<4)+8>>3]=mb-qa*+h[r+(s<<4)+8>>3];h[Ca+(ka<<4)>>3]=ob-qa*sb;h[Ca+(ka<<4)+8>>3]=nb-qa*tb;if((ja|0)<(Ba|0)){N=nb;ua=ob;na=pb;oa=qb;J=ja}else{Ab=nb;Bb=ob;Cb=pb;Db=qb;Eb=ja;break}}}else{Ab=ra;Bb=M;Cb=L;Db=sa;Eb=0}oa=Bb-Db;na=Ab-Cb;ua=2.0/+T(oa*oa+na*na+1.0e-4);N=na*ua;na=-0.0-oa*ua;h[r+(Eb<<4)>>3]=N;h[r+(Eb<<4)+8>>3]=na;h[Ca+(Eb<<4)>>3]=Db-qa*N;h[Ca+(Eb<<4)+8>>3]=Cb-qa*na;J=t+1|0;if((J|0)>=(X|0)){break j}ra=Ab;M=Bb;t=J;Pa=c[Ja>>2]|0}}}while(0);Ja=Lb(jb|0)|0;Ha=La(Ja|0,87264)|0;if((Ha|0)==0){Fb=jb;Gb=jb}else{Sa=jb;U=jb;Pa=jb;t=Ha;Ha=0;while(1){Ra=(a[t]|0)==0?159752:t;do{if((Ra|0)==(Pa|0)){Hb=Pa}else{if((a[(c[x>>2]|0)+115|0]&3)!=0){Hb=Ra;break}lB(f,Ra);nB(f,Ra);Hb=Ra}}while(0);Na=(Ha|0)==0;J=Na?Ra:Sa;Ba=(Ha|0)==1?Ra:Na?Ra:U;if(Ka){Na=0;do{u=c[Z+(Na*48|0)>>2]|0;Ma=c[Qa+(Na*48|0)>>2]|0;ja=c[Z+(Na*48|0)+4>>2]|0;if((ja|0)>0){ka=0;do{s=u+(ka<<4)|0;h[s>>3]=+h[Ma+(ka<<4)>>3]+ +h[s>>3];s=u+(ka<<4)+8|0;h[s>>3]=+h[Ma+(ka<<4)+8>>3]+ +h[s>>3];ka=ka+1|0;}while((ka|0)<(ja|0))}tB(f,u,ja,0,0,0);Na=Na+1|0;}while((Na|0)<(X|0))}Na=La(0,87264)|0;if((Na|0)==0){Fb=J;Gb=Ba;break}else{Sa=J;U=Ba;Pa=Hb;t=Na;Ha=Ha+1|0}}}Ha=q+8|0;t=c[Ha>>2]|0;if((t|0)==0){Ib=0}else{do{if((Gb|0)==0){Jb=0;Kb=t}else{if((a[(c[x>>2]|0)+115|0]&3)!=0){Jb=Gb;Kb=t;break}lB(f,Gb);nB(f,Gb);Jb=Gb;Kb=c[Ha>>2]|0}}while(0);qh(f,2,q+16|0,c[q>>2]|0,pa,ta,Kb);Ib=Jb}Ha=q+12|0;t=c[Ha>>2]|0;if((t|0)!=0){do{if((Ib|0)==(Fb|0)){Mb=t}else{if((a[(c[x>>2]|0)+115|0]&3)!=0){Mb=t;break}lB(f,Fb);nB(f,Fb);Mb=c[Ha>>2]|0}}while(0);qh(f,3,q+32|0,(c[q>>2]|0)+((c[q+4>>2]|0)-1<<4)|0,pa,ta,Mb)}eF(Ja);if(Ka){Ha=0;do{eF(c[Qa+(Ha*48|0)>>2]|0);eF(c[Z+(Ha*48|0)>>2]|0);Ha=Ha+1|0;}while((Ha|0)<(X|0))}eF(Y);eF(I)}}while(0);Mb=c[G>>2]|0;G=c[Mb+8>>2]|0;q=Mb+208|0;if((c[q>>2]|0)==0){if((b[Mb+260>>1]&1)!=0){A=316}}else{A=316}do{if((A|0)==316){hB(f);Fb=Mb+276|0;x=c[Fb>>2]|0;if((x|0)==0){break}Ib=Mb+280|0;if((x|0)<=1){break}x=c[Ib>>2]|0;Jb=Mb+268|0;Kb=Mb+284|0;Gb=Mb+272|0;Hb=Mb+228|0;jb=Mb+244|0;Eb=Mb+212|0;D=1;v=c[x>>2]|0;H=x;do{c[Jb>>2]=c[H+(D<<2)>>2];c[Gb>>2]=(c[Kb>>2]|0)+(v<<4);gB(f,c[q>>2]|0,c[Hb>>2]|0,c[jb>>2]|0,c[Eb>>2]|0);hB(f);H=c[Ib>>2]|0;v=(c[H+(D<<2)>>2]|0)+v|0;D=D+1|0;}while((D|0)<(c[Fb>>2]|0))}}while(0);c[Mb+268>>2]=0;c[Mb+272>>2]=0;q=G+8|0;A=c[q>>2]|0;Fb=c[A+8>>2]|0;if((Fb|0)==0){Nb=A;Ob=Mb+260|0}else{A=c[Fb>>2]|0;Fb=c[A>>2]|0;if((c[A+8>>2]|0)==0){Pb=Fb|0;Qb=Fb+8|0}else{Pb=A+16|0;Qb=A+24|0}A=Mb+260|0;Fb=b[A>>1]|0;bi(f,+h[Pb>>3],+h[Qb>>3],Fb<<8<<16>>16>>15&255,c[Mb+220>>2]|0,Fb<<14<<16>>16>>15&255,Fb<<11<<16>>16>>15&255);Fb=c[(c[q>>2]|0)+8>>2]|0;Qb=(c[Fb+4>>2]|0)-1|0;Pb=c[Fb>>2]|0;Fb=Pb+(Qb*48|0)+16|0;if((c[Pb+(Qb*48|0)+12>>2]|0)==0){D=c[Pb+(Qb*48|0)>>2]|0;v=(c[Pb+(Qb*48|0)+4>>2]|0)-1|0;Rb=D+(v<<4)|0;Sb=D+(v<<4)+8|0}else{Rb=Fb+16|0;Sb=Fb+24|0}Fb=b[A>>1]|0;bi(f,+h[Rb>>3],+h[Sb>>3],Fb<<7<<16>>16>>15&255,c[Mb+224>>2]|0,Fb<<13<<16>>16>>15&255,Fb<<10<<16>>16>>15&255);Nb=c[q>>2]|0;Ob=A}A=c[Nb+96>>2]|0;Nb=b[Ob>>1]<<12<<16>>16>>15<<16>>16;Fb=Mb+216|0;Sb=c[Fb>>2]|0;Rb=Mb+232|0;v=c[Rb>>2]|0;D=Mb+248|0;Qb=c[D>>2]|0;Pb=Mb+212|0;H=c[Pb>>2]|0;Ib=G|0;if((Km(Hm(Ib,c[53810]|0,90608)|0)|0)<<24>>24==0){Tb=0}else{Tb=c[(c[q>>2]|0)+8>>2]|0}ci(f,A,11,Nb,Sb,v,Qb,H,Tb);Tb=c[(c[q>>2]|0)+108>>2]|0;H=b[Ob>>1]<<12<<16>>16>>15<<16>>16;Qb=c[Fb>>2]|0;Fb=c[Rb>>2]|0;Rb=c[D>>2]|0;D=c[Pb>>2]|0;if((Km(Hm(Ib,c[53810]|0,90608)|0)|0)<<24>>24==0){Ub=0}else{Ub=c[(c[q>>2]|0)+8>>2]|0}ci(f,Tb,11,H,Qb,Fb,Rb,D,Ub);ci(f,c[(c[q>>2]|0)+100>>2]|0,7,b[Ob>>1]<<13<<16>>16>>15<<16>>16,c[Mb+224>>2]|0,c[Mb+240>>2]|0,c[Mb+256>>2]|0,c[Pb>>2]|0,0);ci(f,c[(c[q>>2]|0)+104>>2]|0,6,b[Ob>>1]<<14<<16>>16>>15<<16>>16,c[Mb+220>>2]|0,c[Mb+236>>2]|0,c[Mb+252>>2]|0,c[Pb>>2]|0,0);fB(f);Gh(f);i=k;return}function Yh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;d=i;i=i+144|0;e=d+128|0;if(!(a[14792]|0)){Iv(175216,128,176872);a[14792]=1}Iv(e,128,d|0);f=e+4|0;g=e+8|0;h=e|0;j=0;k=0;l=b;a:while(1){m=j;n=l;while(1){o=a[n]|0;b:do{if(o<<24>>24==0){p=n;q=0}else{r=n;s=o;while(1){if((Qa(s<<24>>24|0)|0)==0){t=a[r]|0;if(t<<24>>24!=44){p=r;q=t;break b}}t=r+1|0;u=a[t]|0;if(u<<24>>24==0){p=t;q=0;break}else{r=t;s=u}}}}while(0);o=q<<24>>24;if((o|0)==0){v=30;break a}else if(!((o|0)==40|(o|0)==41)){w=p;x=q;v=10;break}s=p+1|0;if((o|0)==40){if(m<<24>>24==0){m=1;n=s;continue}else{v=16;break a}}else if((o|0)==41){if(m<<24>>24==0){v=18;break a}else{m=0;n=s;continue}}else{y=s;break}}c:do{if((v|0)==10){while(1){v=0;n=x<<24>>24;if((n|0)==40|(n|0)==41|(n|0)==44|(n|0)==0){y=w;break c}n=c[f>>2]|0;if(n>>>0<(c[g>>2]|0)>>>0){z=n}else{Jv(e,1)|0;z=c[f>>2]|0}c[f>>2]=z+1;a[z]=x;n=w+1|0;w=n;x=a[n]|0;v=10}}}while(0);if(m<<24>>24==0){if((k|0)==63){v=21;break}n=c[43805]|0;if(n>>>0<(c[43806]|0)>>>0){A=n}else{Jv(175216,1)|0;A=c[43805]|0}c[43805]=A+1;a[A]=0;c[176472+(k<<2)>>2]=c[43805];B=k+1|0}else{B=k}n=c[f>>2]|0;if(n>>>0<(c[g>>2]|0)>>>0){C=n}else{Jv(e,1)|0;C=c[f>>2]|0}a[C]=0;n=c[h>>2]|0;c[f>>2]=n;Lv(175216,n)|0;n=c[43805]|0;if(n>>>0<(c[43806]|0)>>>0){D=n}else{Jv(175216,1)|0;D=c[43805]|0}c[43805]=D+1;a[D]=0;j=m;k=B;l=y}if((v|0)==16){Fv(1,116872,(E=i,i=i+8|0,c[E>>2]=b,E)|0)|0;i=E;c[44118]=0;Mv(e);i=d;return 176472}else if((v|0)==18){Fv(1,115968,(E=i,i=i+8|0,c[E>>2]=b,E)|0)|0;i=E;c[44118]=0;Mv(e);i=d;return 176472}else if((v|0)==21){Fv(0,114648,(E=i,i=i+8|0,c[E>>2]=b,E)|0)|0;i=E;c[44181]=0;Mv(e);i=d;return 176472}else if((v|0)==30){if(m<<24>>24!=0){Fv(1,113800,(E=i,i=i+8|0,c[E>>2]=b,E)|0)|0;i=E;c[44118]=0;Mv(e);i=d;return 176472}c[176472+(k<<2)>>2]=0;Mv(e);e=c[43805]|0;if(e>>>0<(c[43806]|0)>>>0){F=e}else{Jv(175216,1)|0;F=c[43805]|0}a[F]=0;c[43805]=c[43804];i=d;return 176472}return 0}function Zh(a){a=a|0;var b=0;b=c[44736]|0;if((a|0)!=0){c[44736]=b+1;if((b|0)!=0){return}c[44734]=Lb(Ab(1,0)|0)|0;Ab(1,113248)|0;return}if((b|0)<=0){return}a=b-1|0;c[44736]=a;if((a|0)!=0){return}Ab(1,c[44734]|0)|0;eF(c[44734]|0);return}function _h(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0.0,ba=0.0,ca=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0.0,Ba=0.0,Ca=0.0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,Ma=0,Na=0,Oa=0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0,Va=0,Wa=0.0,Xa=0.0,Za=0.0,_a=0.0,$a=0,ab=0,bb=0.0,cb=0.0,db=0.0,eb=0.0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0.0,ob=0.0,pb=0.0,qb=0.0,rb=0.0,sb=0.0,tb=0.0;e=i;i=i+232|0;f=e|0;g=e+8|0;j=e+16|0;k=e+24|0;l=e+32|0;m=e+40|0;n=e+48|0;p=e+56|0;q=e+104|0;r=e+136|0;s=e+168|0;t=e+200|0;if((a[213992]|0)!=0){ym()}u=d+8|0;if((c[(c[u>>2]|0)+8>>2]|0)==0){Fv(1,112688,(v=i,i=i+1|0,i=i+7&-8,c[v>>2]=0,v)|0)|0;i=v;if((a[213992]|0)==0){w=-1;i=e;return w|0}x=c[o>>2]|0;y=$w(d|0)|0;z=+zm();gc(x|0,112248,(v=i,i=i+16|0,c[v>>2]=y,h[v+8>>3]=z,v)|0)|0;i=v;w=-1;i=e;return w|0}y=ux(d)|0;a:do{if((y|0)!=0){x=p;A=q|0;B=q+8|0;C=q+16|0;D=q+24|0;E=r|0;F=r+8|0;G=r+16|0;H=r+24|0;I=p+8|0;J=p+12|0;K=p+32|0;L=p+4|0;M=p|0;N=t|0;O=t+8|0;P=t+16|0;Q=t+24|0;R=p+16|0;S=s|0;T=s+8|0;U=s+16|0;V=s+24|0;W=y;b:while(1){X=W+8|0;Y=c[X>>2]|0;h[Y+48>>3]=+h[Y+16>>3]- +h[Y+88>>3];Y=c[X>>2]|0;h[Y+56>>3]=+h[Y+24>>3]- +h[Y+80>>3]*.5;Y=c[X>>2]|0;h[Y+64>>3]=+h[Y+16>>3]+ +h[Y+96>>3];Y=c[X>>2]|0;h[Y+72>>3]=+h[Y+24>>3]+ +h[Y+80>>3]*.5;Y=mw(d,W)|0;if((Y|0)!=0){X=Y;do{Y=c[(c[X+8>>2]|0)+8>>2]|0;if((Y|0)!=0){Z=Y+4|0;if((c[Z>>2]|0)<=0){break b}_=Y|0;$=c[_>>2]|0;c[x>>2]=c[$>>2];c[x+4>>2]=c[$+4>>2];c[x+8>>2]=c[$+8>>2];c[x+12>>2]=c[$+12>>2];c[x+16>>2]=c[$+16>>2];c[x+20>>2]=c[$+20>>2];c[x+24>>2]=c[$+24>>2];c[x+28>>2]=c[$+28>>2];c[x+32>>2]=c[$+32>>2];c[x+36>>2]=c[$+36>>2];c[x+40>>2]=c[$+40>>2];c[x+44>>2]=c[$+44>>2];ai(q,p);z=+h[A>>3];aa=+h[B>>3];ba=+h[C>>3];ca=+h[D>>3];if((c[Z>>2]|0)>0){$=0;ea=ca;fa=ba;ga=aa;ha=z;while(1){if(($|0)>0){ia=(c[_>>2]|0)+($*48|0)|0;c[x>>2]=c[ia>>2];c[x+4>>2]=c[ia+4>>2];c[x+8>>2]=c[ia+8>>2];c[x+12>>2]=c[ia+12>>2];c[x+16>>2]=c[ia+16>>2];c[x+20>>2]=c[ia+20>>2];c[x+24>>2]=c[ia+24>>2];c[x+28>>2]=c[ia+28>>2];c[x+32>>2]=c[ia+32>>2];c[x+36>>2]=c[ia+36>>2];c[x+40>>2]=c[ia+40>>2];c[x+44>>2]=c[ia+44>>2];ai(r,p);ja=+h[E>>3];ka=+h[F>>3];la=+h[G>>3];ma=+h[H>>3];na=ha<ja?ha:ja;oa=ga<ka?ga:ka;pa=fa>la?fa:la;qa=ea>ma?ea:ma}else{na=ha;oa=ga;pa=fa;qa=ea}ia=c[I>>2]|0;if((ia|0)==0){ra=na;sa=oa;ta=pa;ua=qa}else{ph(s,R,c[M>>2]|0,1.0,ia);ma=+h[S>>3];la=+h[T>>3];ka=+h[U>>3];ja=+h[V>>3];ra=na<ma?na:ma;sa=oa<la?oa:la;ta=pa>ka?pa:ka;ua=qa>ja?qa:ja}ia=c[J>>2]|0;if((ia|0)==0){va=ra;wa=sa;xa=ta;ya=ua}else{ph(t,K,(c[M>>2]|0)+((c[L>>2]|0)-1<<4)|0,1.0,ia);ja=+h[N>>3];ka=+h[O>>3];la=+h[P>>3];ma=+h[Q>>3];va=ra<ja?ra:ja;wa=sa<ka?sa:ka;xa=ta>la?ta:la;ya=ua>ma?ua:ma}ia=$+1|0;if((ia|0)<(c[Z>>2]|0)){$=ia;ea=ya;fa=xa;ga=wa;ha=va}else{za=ya;Aa=xa;Ba=wa;Ca=va;break}}}else{za=ca;Aa=ba;Ba=aa;Ca=z}h[Y+8>>3]=Ca;h[Y+16>>3]=Ba;h[Y+24>>3]=Aa;h[Y+32>>3]=za;}X=ow(d,X)|0;}while((X|0)!=0)}W=vx(d,W)|0;if((W|0)==0){break a}}cc(94032,102832,3891,170496);return 0}}while(0);c[b+168>>2]=d;t=b+293|0;a[t]=0;s=d|0;p=ew(s,99560)|0;do{if((p|0)!=0){r=ac(p|0,99168,(v=i,i=i+16|0,c[v>>2]=m,c[v+8>>2]=n,v)|0)|0;i=v;if((r|0)<=0){break}za=+h[m>>3]*72.0;q=b+208|0;h[q>>3]=za;h[b+200>>3]=za;if((r|0)>1){h[q>>3]=+h[n>>3]*72.0}a[t]=1}}while(0);t=b+292|0;a[t]=0;p=ew(s,98736)|0;do{if((p|0)!=0){q=ac(p|0,99168,(v=i,i=i+16|0,c[v>>2]=m,c[v+8>>2]=n,v)|0)|0;i=v;if((q|0)<=0){break}za=+h[m>>3]*72.0;r=b+224|0;h[r>>3]=za;h[b+216>>3]=za;if((q|0)>1){h[r>>3]=+h[n>>3]*72.0}a[t]=1}}while(0);t=b+294|0;a[t]=0;n=b+232|0;m=(c[(c[u>>2]|0)+8>>2]|0)+48|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];m=c[(c[u>>2]|0)+8>>2]|0;do{if(+h[m+48>>3]>.001){if(+h[m+56>>3]<=.001){Da=m;break}a[t]=1;Da=c[(c[u>>2]|0)+8>>2]|0}else{Da=m}}while(0);c[b+288>>2]=(a[Da+81|0]|0)==0?0:90;Da=b+196|0;c[Da>>2]=98168;m=ew(s,97472)|0;do{if((m|0)!=0){if((a[m]|0)==0){break}c[Da>>2]=m}}while(0);m=b+256|0;Da=(c[u>>2]|0)+16|0;c[m>>2]=c[Da>>2];c[m+4>>2]=c[Da+4>>2];c[m+8>>2]=c[Da+8>>2];c[m+12>>2]=c[Da+12>>2];c[m+16>>2]=c[Da+16>>2];c[m+20>>2]=c[Da+20>>2];c[m+24>>2]=c[Da+24>>2];c[m+28>>2]=c[Da+28>>2];c[53714]=Wv(d,0,96360,0)|0;c[53716]=Wv(d,0,95840,0)|0;c[b+320>>2]=Im(0,c[53626]|0,95312)|0;h[b+328>>3]=+Fm(0,c[53624]|0,14.0,1.0);c[b+336>>2]=29704;c[b+188>>2]=$w(s)|0;Da=b+304|0;m=c[Da>>2]|0;if((m|0)!=0){eF(m);c[Da>>2]=0}m=b+308|0;t=c[m>>2]|0;if((t|0)!=0){eF(t);c[m>>2]=0}t=b+316|0;n=c[t>>2]|0;if((n|0)!=0){eF(n);c[t>>2]=0}n=ew(s,104872)|0;do{if((n|0)==0){c[m>>2]=0;c[b+312>>2]=1}else{p=ew(s,102120)|0;r=b+296|0;c[r>>2]=(p|0)==0?101368:p;p=ew(s,100968)|0;q=b+300|0;y=(p|0)==0?100504:p;c[q>>2]=y;p=sc(c[r>>2]|0,y|0)|0;if((p|0)!=0){Fv(0,99976,(v=i,i=i+8|0,c[v>>2]=a[p]|0,v)|0)|0;i=v;c[q>>2]=213440}q=Lb(n|0)|0;c[Da>>2]=q;p=La(q|0,c[r>>2]|0)|0;do{if((p|0)==0){Ea=0}else{q=0;y=p;W=0;while(1){Fa=q+1|0;if((q|0)<(W|0)){Ga=W;Ha=c[m>>2]|0}else{Q=W+128|0;P=c[m>>2]|0;if((P|0)==0){Ia=kk(Q<<2)|0}else{Ia=mk(P,Q<<2)|0}P=Ia;c[m>>2]=P;Ga=Q;Ha=P}c[Ha+(Fa<<2)>>2]=y;P=La(0,c[r>>2]|0)|0;if((P|0)==0){break}else{q=Fa;y=P;W=Ga}}if((Fa|0)==0){Ea=0;break}W=mk(c[m>>2]|0,(Fa<<2)+8|0)|0;c[m>>2]=W;c[W>>2]=0;c[(c[m>>2]|0)+(q+2<<2)>>2]=0;Ea=Fa}}while(0);r=b+312|0;c[r>>2]=Ea;p=ew(s,104368)|0;if((p|0)==0){break}if((a[p]|0)==0){break}W=kk((c[r>>2]<<2)+8|0)|0;y=W;P=c[r>>2]|0;do{if((P|0)<1){Ja=66}else{Q=1;O=0;N=P;while(1){if(($h(b,Q,N,p)|0)<<24>>24==0){Ka=O}else{L=O+1|0;c[y+(L<<2)>>2]=Q;Ka=L}L=c[r>>2]|0;if((Q|0)<(L|0)){Q=Q+1|0;O=Ka;N=L}else{break}}if((Ka|0)==0){Ja=66;break}c[y>>2]=Ka;c[y+(Ka+1<<2)>>2]=(c[r>>2]|0)+1;Ma=y}}while(0);if((Ja|0)==66){Fv(0,103720,(v=i,i=i+8|0,c[v>>2]=p,v)|0)|0;i=v;eF(W);Ma=0}c[t>>2]=Ma}}while(0);Ma=c[44736]|0;c[44736]=Ma+1;if((Ma|0)==0){c[44734]=Lb(Ab(1,0)|0)|0;Ab(1,113248)|0}Ma=DA(b)|0;c:do{if((Ma|0)!=0){t=b+56|0;Ka=b|0;Ea=b+184|0;Fa=b+192|0;m=d+48|0;Ga=b+28|0;Ha=Ma;while(1){Ia=c[t>>2]|0;if((Ia|0)==0){c[Ha+20>>2]=0;c[Ha+24>>2]=0}else{c[Ha+20>>2]=c[Ia+8>>2];c[Ha+24>>2]=c[(c[t>>2]|0)+12>>2]}c[Ha+12>>2]=Ka;c[Ha+28>>2]=c[Ea>>2];c[Ha+620>>2]=24632;c[Ha+624>>2]=c[6156];if((c[(c[u>>2]|0)+8>>2]|0)==0){Ja=77;break}Na=Ha+52|0;Ia=OA(Ha,c[Na>>2]|0)|0;Da=Ha+56|0;c[Da>>2]=Ia;if((Ia|0)==24){n=Ha+152|0;c[n>>2]=c[n>>2]|520}else if((Ia|0)==21){n=Ha+152|0;c[n>>2]=c[n>>2]|1}else if((Ia|0)==999){Ja=83;break}else{Ia=ew(s,106184)|0;do{if((Ia|0)==0){Ja=94}else{n=a[Ia]|0;if((n<<24>>24|0)==101){if((Ya(Ia+1|0,105256)|0)==0){Oa=16;break}else{Ja=94;break}}else if((n<<24>>24|0)==110){if((Ya(Ia+1|0,105664)|0)==0){Oa=1;break}else{Ja=94;break}}else{Ja=94;break}}}while(0);if((Ja|0)==94){Ja=0;Oa=0}Ia=Ha+152|0;c[Ia>>2]=c[Ia>>2]|Oa}Ia=c[Fa>>2]|0;d:do{if((Ia|0)==0){c[44738]=0;Ja=103}else{do{if((c[Ia+152>>2]&32|0)!=0){if((Ya(c[Na>>2]|0,c[Ia+52>>2]|0)|0)!=0){break}n=c[44738]|0;if((n|0)==0){Ja=103;break d}c[n+8>>2]=Ha;c[Ha+36>>2]=c[(c[44738]|0)+36>>2];Ja=105;break d}}while(0);QA(Ia);c[Fa>>2]=0;c[Ga>>2]=0;c[44738]=0;Ja=103}}while(0);do{if((Ja|0)==103){Ja=0;if((PA(Ha)|0)!=0){break}c[Fa>>2]=Ha;Ja=105}}while(0);if((Ja|0)==105){Ja=0;c[Ha+8>>2]=0;c[Ha+104>>2]=25400;Ia=Ha|0;Y=c[Ia>>2]|0;do{if((a[Y+292|0]|0)==0){if((c[Da>>2]|0)==300){z=+h[(c[Ha+68>>2]|0)+8>>3];h[Ha+248>>3]=z;h[Ha+240>>3]=z;break}else{h[Ha+248>>3]=4.0;h[Ha+240>>3]=4.0;break}}else{n=Ha+240|0;y=Y+216|0;c[n>>2]=c[y>>2];c[n+4>>2]=c[y+4>>2];c[n+8>>2]=c[y+8>>2];c[n+12>>2]=c[y+12>>2]}}while(0);e:do{if((a[Y+293|0]|0)==0){switch(c[Da>>2]|0){case 2:case 3:case 4:case 22:case 21:case 30:{h[Ha+424>>3]=36.0;h[Ha+416>>3]=36.0;break e;break};case 300:{y=Ha+416|0;n=(c[Ha+84>>2]|0)+8|0;c[y>>2]=c[n>>2];c[y+4>>2]=c[n+4>>2];c[y+8>>2]=c[n+8>>2];c[y+12>>2]=c[n+12>>2];break e;break};default:{vF(Ha+416|0,0,16)|0;break e}}}else{n=Ha+416|0;y=Y+200|0;c[n>>2]=c[y>>2];c[n+4>>2]=c[y+4>>2];c[n+8>>2]=c[y+8>>2];c[n+12>>2]=c[y+12>>2]}}while(0);y=c[Y+192>>2]|0;z=+h[(c[(c[u>>2]|0)+8>>2]|0)+24>>3];f:do{if(z!=0.0){h[Ha+440>>3]=z;h[Ha+432>>3]=z}else{do{if((y|0)!=0){if((a[y+128|0]|0)==0){break}n=Ha+432|0;r=y+112|0;c[n>>2]=c[r>>2];c[n+4>>2]=c[r+4>>2];c[n+8>>2]=c[r+8>>2];c[n+12>>2]=c[r+12>>2];break f}}while(0);r=Ha+432|0;if((c[Da>>2]|0)==300){n=r;P=(c[Ha+84>>2]|0)+40|0;c[n>>2]=c[P>>2];c[n+4>>2]=c[P+4>>2];c[n+8>>2]=c[P+8>>2];c[n+12>>2]=c[P+12>>2];break}else{h[Ha+440>>3]=96.0;h[r>>3]=96.0;break}}}while(0);z=+h[Y+272>>3];aa=+h[Y+280>>3];ba=+h[Y+256>>3];ca=+h[Y+264>>3];za=+h[Ha+240>>3];Aa=ba-za;h[Ha+208>>3]=Aa;Ba=+h[Ha+248>>3];Ca=ca-Ba;h[Ha+216>>3]=Ca;va=z+za;h[Ha+224>>3]=va;za=aa+Ba;h[Ha+232>>3]=za;Ba=va-Aa;Aa=za-Ca;h[j>>3]=1.0;Da=c[(c[u>>2]|0)+8>>2]|0;Ca=+h[Da+64>>3];do{if(Ca>.001){za=+h[Da+72>>3];if(za<=.001){Pa=Aa;Qa=Ba;Ra=1.0;break}va=Ba==0.0?Ca:Ba;wa=Aa==0.0?za:Aa;if(!(Ca<va|za<wa)){if(!((a[Da+80|0]|0)!=0&Ca>va&za>wa)){Pa=wa;Qa=va;Ra=1.0;break}}xa=Ca/va;ya=za/wa;za=xa<ya?xa:ya;h[j>>3]=za;Pa=wa;Qa=va;Ra=za}else{Pa=Aa;Qa=Ba;Ra=1.0}}while(0);Ba=(z+ba)*.5;h[k>>3]=Ba;Aa=(aa+ca)*.5;h[l>>3]=Aa;Da=Ha+360|0;c[Da>>2]=c[Y+288>>2];h[f>>3]=Ra*Qa;h[g>>3]=Ra*Pa;y=ew(s,108712)|0;if((y|0)==0){Sa=Ba;Ta=Aa}else{r=dF((xF(y|0)|0)+1|0)|0;P=dF((xF(y|0)|0)+1|0)|0;n=ac(y|0,107704,(v=i,i=i+32|0,c[v>>2]=f,c[v+8>>2]=g,c[v+16>>2]=j,c[v+24>>2]=r,v)|0)|0;i=v;do{if((n|0)==4){N=Ax(c[m>>2]|0,r,0)|0;if((N|0)==0){break}O=N+8|0;h[k>>3]=+h[(c[O>>2]|0)+16>>3];h[l>>3]=+h[(c[O>>2]|0)+24>>3]}else{O=ac(y|0,107056,(v=i,i=i+40|0,c[v>>2]=f,c[v+8>>2]=g,c[v+16>>2]=j,c[v+24>>2]=r,c[v+32>>2]=P,v)|0)|0;i=v;if((O|0)!=4){ac(y|0,106592,(v=i,i=i+40|0,c[v>>2]=f,c[v+8>>2]=g,c[v+16>>2]=j,c[v+24>>2]=k,c[v+32>>2]=l,v)|0)|0;i=v;break}O=Ax(c[m>>2]|0,r,0)|0;if((O|0)==0){break}N=O+8|0;h[k>>3]=+h[(c[N>>2]|0)+16>>3];h[l>>3]=+h[(c[N>>2]|0)+24>>3]}}while(0);eF(r);eF(P);Sa=+h[k>>3];Ta=+h[l>>3]}y=Ha+368|0;h[y>>3]=+h[f>>3];n=Ha+376|0;h[n>>3]=+h[g>>3];Y=Ha+352|0;h[Y>>3]=+h[j>>3];h[Ha+336>>3]=Sa;h[Ha+344>>3]=Ta;N=c[Ia>>2]|0;ca=+h[y>>3];aa=+h[n>>3];n=(c[Da>>2]|0)==0;ba=n?aa:ca;z=n?ca:aa;aa=+h[Ha+416>>3];ca=+h[Ha+424>>3];do{if((a[N+294|0]|0)==0){Ja=149}else{if((c[Ha+152>>2]&32|0)==0){Ja=149;break}Aa=+h[N+232>>3]-aa*2.0;Ba=+h[N+240>>3]-ca*2.0;do{if(Aa<1.0e-4){c[Ha+164>>2]=1;Ua=1}else{n=~~(z/Aa);y=Ha+164|0;c[y>>2]=n;if(z-Aa*+(n|0)<=1.0e-4){Ua=n;break}O=n+1|0;c[y>>2]=O;Ua=O}}while(0);do{if(Ba<1.0e-4){c[Ha+168>>2]=1;Va=1}else{O=~~(ba/Ba);y=Ha+168|0;c[y>>2]=O;if(ba-Ba*+(O|0)<=1.0e-4){Va=O;break}n=O+1|0;c[y>>2]=n;Va=n}}while(0);c[Ha+204>>2]=da(Va,Ua)|0;Wa=z<Aa?z:Aa;Xa=ba<Ba?ba:Ba;Za=Aa;_a=Ba;$a=Va;ab=Ua}}while(0);do{if((Ja|0)==149){Ja=0;do{if((c[Ha+68>>2]|0)==0){bb=0.0;cb=0.0}else{Ia=c[Ha+84>>2]|0;Ca=+h[Ia+24>>3]-aa*2.0;za=Ca<0.0?0.0:Ca;Ca=+h[Ia+32>>3]-ca*2.0;if(Ca>=0.0){bb=za;cb=Ca;break}bb=za;cb=0.0}}while(0);c[Ha+204>>2]=1;c[Ha+168>>2]=1;c[Ha+164>>2]=1;Ba=bb<z?z:bb;if(cb>=ba){Wa=z;Xa=ba;Za=Ba;_a=cb;$a=1;ab=1;break}Wa=z;Xa=ba;Za=Ba;_a=ba;$a=1;ab=1}}while(0);Ia=Ha+432|0;ba=(aa*2.0+Za)*+h[Ia>>3]/72.0;if(ba<0.0){db=ba+-.5}else{db=ba+.5}c[Ha+448>>2]=~~db;P=Ha+440|0;ba=(ca*2.0+_a)*+h[P>>3]/72.0;if(ba<0.0){eb=ba+-.5}else{eb=ba+.5}c[Ha+452>>2]=~~eb;r=Ha+188|0;n=Ha+180|0;y=Ha+176|0;O=Ha+172|0;Q=N+196|0;vF(O|0,0,24)|0;q=a[c[Q>>2]|0]|0;if((q|0)==66){fb=0;gb=0;hb=1;ib=0}else if((q|0)==76){fb=0;gb=1;hb=0;ib=0}else if((q|0)==82){c[O>>2]=ab-1;fb=0;gb=-1;hb=0;ib=0}else if((q|0)==84){c[y>>2]=$a-1;fb=0;gb=0;hb=-1;ib=0}else{fb=0;gb=0;hb=0;ib=0}q=n;c[q>>2]=gb|ib;c[q+4>>2]=fb|hb;n=a[(c[Q>>2]|0)+1|0]|0;L=gb;M=hb;if((n|0)==66){jb=0;kb=0;lb=1;mb=0}else if((n|0)==76){jb=0;kb=1;lb=0;mb=0}else if((n|0)==82){c[O>>2]=ab-1;jb=0;kb=-1;lb=0;mb=0}else if((n|0)==84){c[y>>2]=$a-1;jb=0;kb=0;lb=-1;mb=0}else{jb=0;kb=0;lb=0;mb=0}y=r;c[y>>2]=kb|mb;c[y+4>>2]=jb|lb;r=kb+L|0;if((((r|0)>-1?r:-r|0)|0)==1){r=lb+M|0;if((((r|0)>-1?r:-r|0)|0)!=1){Ja=172}}else{Ja=172}if((Ja|0)==172){Ja=0;c[q>>2]=0;c[q+4>>2]=1;c[y>>2]=1;c[y+4>>2]=0;Fv(0,109544,(v=i,i=i+8|0,c[v>>2]=c[Q>>2],v)|0)|0;i=v}do{if((a[(c[(c[u>>2]|0)+8>>2]|0)+82|0]|0)==0){nb=0.0;ob=0.0}else{if(Za>Wa){pb=(Za-Wa)*.5}else{pb=0.0}if(_a<=Xa){nb=pb;ob=0.0;break}nb=pb;ob=(_a-Xa)*.5}}while(0);N=(c[Da>>2]|0)==0;ba=N?Xa:Wa;z=N?Wa:Xa;Ba=(N?aa:ca)+(N?nb:ob);h[Ha+384>>3]=Ba;Aa=(N?ca:aa)+(N?ob:nb);h[Ha+392>>3]=Aa;za=z+Ba;h[Ha+400>>3]=za;Ca=ba+Aa;h[Ha+408>>3]=Ca;va=+h[Y>>3];h[Ha+320>>3]=z/va;h[Ha+328>>3]=ba/va;va=+h[Ia>>3];ba=Ba*va/72.0;if(ba<0.0){qb=ba+-.5}else{qb=ba+.5}Q=~~qb;y=Ha+456|0;c[y>>2]=Q;ba=+h[P>>3];Ba=Aa*ba/72.0;if(Ba<0.0){rb=Ba+-.5}else{rb=Ba+.5}q=~~rb;c[Ha+460>>2]=q;Ba=za*va/72.0;if(Ba<0.0){sb=Ba+-.5}else{sb=Ba+.5}r=~~sb;M=Ha+464|0;c[M>>2]=r;Ba=Ca*ba/72.0;if(Ba<0.0){tb=Ba+-.5}else{tb=Ba+.5}L=~~tb;c[Ha+468>>2]=L;if(!N){N=y;c[N>>2]=q;c[N+4>>2]=Q;Q=M;c[Q>>2]=L;c[Q+4>>2]=r}if((c[Ha+152>>2]&128|0)==0){Rh(Ha,d)}c[44738]=Ha}Ha=EA(b)|0;if((Ha|0)==0){break c}}if((Ja|0)==77){Fv(1,111648,(v=i,i=i+1|0,i=i+7&-8,c[v>>2]=0,v)|0)|0;i=v;Ha=c[44736]|0;do{if((Ha|0)>0){m=Ha-1|0;c[44736]=m;if((m|0)!=0){break}Ab(1,c[44734]|0)|0;eF(c[44734]|0)}}while(0);if((a[213992]|0)==0){w=-1;i=e;return w|0}Ha=c[o>>2]|0;m=$w(s)|0;Ba=+zm();gc(Ha|0,112248,(v=i,i=i+16|0,c[v>>2]=m,h[v+8>>3]=Ba,v)|0)|0;i=v;w=-1;i=e;return w|0}else if((Ja|0)==83){Fv(1,111e3,(v=i,i=i+8|0,c[v>>2]=c[Na>>2],v)|0)|0;i=v;m=c[44736]|0;do{if((m|0)>0){Ha=m-1|0;c[44736]=Ha;if((Ha|0)!=0){break}Ab(1,c[44734]|0)|0;eF(c[44734]|0)}}while(0);if((a[213992]|0)==0){w=-1;i=e;return w|0}m=c[o>>2]|0;Ha=$w(s)|0;Ba=+zm();gc(m|0,112248,(v=i,i=i+16|0,c[v>>2]=Ha,h[v+8>>3]=Ba,v)|0)|0;i=v;w=-1;i=e;return w|0}}}while(0);Na=c[44736]|0;do{if((Na|0)>0){Ja=Na-1|0;c[44736]=Ja;if((Ja|0)!=0){break}Ab(1,c[44734]|0)|0;eF(c[44734]|0)}}while(0);if((a[213992]|0)==0){w=0;i=e;return w|0}Na=c[o>>2]|0;Ja=$w(s)|0;tb=+zm();gc(Na|0,112248,(v=i,i=i+16|0,c[v>>2]=Ja,h[v+8>>3]=tb,v)|0)|0;i=v;w=0;i=e;return w|0}function $h(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;g=i;i=i+160|0;h=g+128|0;j=g+136|0;k=g+144|0;c[h>>2]=0;c[j>>2]=0;Iv(k,128,g|0);Lv(k,f)|0;f=k+4|0;l=c[f>>2]|0;if(l>>>0<(c[k+8>>2]|0)>>>0){m=l}else{Jv(k,1)|0;m=c[f>>2]|0}a[m]=0;m=c[k>>2]|0;c[f>>2]=m;f=b+300|0;l=b+296|0;n=b+308|0;o=b+312|0;b=m;while(1){m=ec(b|0,c[f>>2]|0,h|0)|0;if((m|0)==0){p=0;q=43;break}r=ec(m|0,c[l>>2]|0,j|0)|0;m=(r|0)!=0;if(m){s=ec(0,c[l>>2]|0,j|0)|0}else{s=0}t=((s|0)!=0)+(m&1)|0;if((t|0)==1){m=a[r]|0;if((m<<24>>24|0)==0){q=12}else if((m<<24>>24|0)==97){if((Ya(r|0,103064)|0)==0){u=d}else{v=97;w=r;q=10}}else{v=m;w=r;q=10}a:do{if((q|0)==10){while(1){q=0;x=w+1|0;if(((v&255)-48|0)>>>0>=10>>>0){break}y=a[x]|0;if(y<<24>>24==0){q=12;break a}else{v=y;w=x;q=10}}x=c[n>>2]|0;if((x|0)==0){u=-1;break}y=c[o>>2]|0;if((y|0)<1){u=-1;break}else{z=1}while(1){A=c[x+(z<<2)>>2]|0;if(m<<24>>24==(a[A]|0)){if((Ya(r|0,A|0)|0)==0){u=z;break a}}if((z|0)<(y|0)){z=z+1|0}else{u=-1;break}}}}while(0);if((q|0)==12){q=0;u=Rb(r|0)|0}B=(u|0)==(d|0)}else if((t|0)==2){m=a[r]|0;if((m<<24>>24|0)==97){if((Ya(r|0,103064)|0)==0){C=0}else{D=97;E=r;q=21}}else if((m<<24>>24|0)==0){q=23}else{D=m;E=r;q=21}b:do{if((q|0)==21){while(1){q=0;y=E+1|0;if(((D&255)-48|0)>>>0>=10>>>0){break}x=a[y]|0;if(x<<24>>24==0){q=23;break b}else{D=x;E=y;q=21}}y=c[n>>2]|0;if((y|0)==0){C=-1;break}x=c[o>>2]|0;if((x|0)<1){C=-1;break}else{F=1}while(1){A=c[y+(F<<2)>>2]|0;if(m<<24>>24==(a[A]|0)){if((Ya(r|0,A|0)|0)==0){C=F;break b}}if((F|0)<(x|0)){F=F+1|0}else{C=-1;break}}}}while(0);if((q|0)==23){q=0;C=Rb(r|0)|0}m=a[s]|0;if((m<<24>>24|0)==97){if((Ya(s|0,103064)|0)==0){G=e}else{H=97;I=s;q=31}}else if((m<<24>>24|0)==0){q=33}else{H=m;I=s;q=31}c:do{if((q|0)==31){while(1){q=0;t=I+1|0;if(((H&255)-48|0)>>>0>=10>>>0){break}x=a[t]|0;if(x<<24>>24==0){q=33;break c}else{H=x;I=t;q=31}}t=c[n>>2]|0;if((t|0)==0){G=-1;break}x=c[o>>2]|0;if((x|0)<1){G=-1;break}else{J=1}while(1){y=c[t+(J<<2)>>2]|0;if(m<<24>>24==(a[y]|0)){if((Ya(s|0,y|0)|0)==0){G=J;break c}}if((J|0)<(x|0)){J=J+1|0}else{G=-1;break}}}}while(0);if((q|0)==33){q=0;G=Rb(s|0)|0}if((G&C|0)<=-1){b=0;continue}m=(C|0)>(G|0);if(((m?G:C)|0)>(d|0)){b=0;continue}B=((m?C:G)|0)>=(d|0)}else{b=0;continue}if(B){p=B&1;q=43;break}else{b=0}}if((q|0)==43){Mv(k);i=g;return p|0}return 0}function ai(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;d=i;e=b;b=i;i=i+48|0;tF(b,e,48)|0;e=c[b+4>>2]|0;if((e|0)<=0){cc(93584,102832,3865,171016)}if(((e|0)%3|0|0)!=1){cc(93080,102832,3866,171016)}f=c[b>>2]|0;g=+h[f>>3];j=+h[f+8>>3];if((e|0)>1){k=1;l=j;m=g;n=j;o=g}else{p=j;q=g;r=j;s=g;t=a|0;h[t>>3]=q;u=a+8|0;h[u>>3]=p;v=a+16|0;h[v>>3]=s;w=a+24|0;h[w>>3]=r;i=d;return}while(1){b=k+1|0;x=k+2|0;g=(+h[f+(k<<4)>>3]+ +h[f+(b<<4)>>3])*.5;j=(+h[f+(k<<4)+8>>3]+ +h[f+(b<<4)+8>>3])*.5;y=m<g?m:g;z=l<j?l:j;A=o>g?o:g;g=n>j?n:j;j=+h[f+(x<<4)>>3];B=+h[f+(x<<4)+8>>3];C=y<j?y:j;y=z<B?z:B;z=A>j?A:j;j=g>B?g:B;x=k+3|0;if((x|0)<(e|0)){k=x;l=y;m=C;n=j;o=z}else{p=y;q=C;r=j;s=z;break}}t=a|0;h[t>>3]=q;u=a+8|0;h[u>>3]=p;v=a+16|0;h[v>>3]=s;w=a+24|0;h[w>>3]=r;i=d;return}function bi(a,d,e,f,g,i,j){a=a|0;d=+d;e=+e;f=f|0;g=g|0;i=i|0;j=j|0;var k=0;j=c[a+16>>2]|0;if(f<<24>>24==0){k=c[j+208>>2]|0}else{k=g}do{if(i<<24>>24==0){if(!((k|0)==0&(b[j+260>>1]&1)==0)){break}return}}while(0);k=c[a+152>>2]|0;if((k&4259840|0)==0){return}i=(k&131072|0)!=0;g=j+264|0;if(i){c[g>>2]=0;c[j+268>>2]=2}else{c[g>>2]=2;c[j+268>>2]=4}g=j+272|0;eF(c[g>>2]|0);f=jk(c[j+268>>2]<<4)|0;j=f;c[g>>2]=j;h[f>>3]=d+-3.0;h[f+8>>3]=e+-3.0;h[f+16>>3]=d+3.0;h[f+24>>3]=e+3.0;if((k&8192|0)==0){RA(a,j,j,2)|0}if(i){return}qi(j);return}function ci(b,d,e,f,g,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0;n=i;i=i+64|0;o=n|0;p=n+48|0;q=c[b+152>>2]|0;if((d|0)==0){i=n;return}if((a[d+81|0]|0)==0){i=n;return}if((l|0)==0){r=0}else{s=jk((xF(l|0)|0)+11|0)|0;if((e|0)==7){t=89496}else if((e|0)==11){t=90024}else if((e|0)==6){t=89080}else{cc(88624,102832,2642,170728)}nb(s|0,88176,(u=i,i=i+16|0,c[u>>2]=l,c[u+8>>2]=t,u)|0)|0;i=u;r=s}s=b+16|0;u=(c[s>>2]|0)+12|0;t=c[u>>2]|0;c[u>>2]=e;u=(g|0)==0&(f|0)==0;do{if(!u){if((q&4|0)!=0){break}di(b,d);gB(b,g,j,k,r)}}while(0);ek(b,e,d);a:do{if((m|0)!=0){e=p;f=c[d>>2]|0;l=a[f]|0;if(l<<24>>24==0){break}else{v=f;w=l}while(1){l=v+1|0;if((Qa(w&255|0)|0)==0){break}f=a[l]|0;if(f<<24>>24==0){break a}else{v=l;w=f}}if((a[v]|0)==0){break}x=+h[d+24>>3];f=d+56|0;y=x*.5+ +h[f>>3];z=+h[d+64>>3]- +h[d+32>>3]*.5;h[o>>3]=y;h[o+8>>3]=z;h[o+16>>3]=y-x;h[o+24>>3]=z;Wm(p,m,f);f=o+32|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];pB(b,c[(c[b>>2]|0)+336>>2]|0);lB(b,c[d+8>>2]|0);uB(b,o|0,3)}}while(0);if(!u){if((q&4|0)!=0){di(b,d);gB(b,g,j,k,r)}hB(b)}if((r|0)!=0){eF(r)}c[(c[s>>2]|0)+12>>2]=t;i=n;return}function di(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0;d=c[a+16>>2]|0;e=c[a+152>>2]|0;if((e&4259840|0)==0){return}f=(e&131072|0)!=0;g=d+264|0;if(f){c[g>>2]=0;c[d+268>>2]=2}else{c[g>>2]=2;c[d+268>>2]=4}g=d+272|0;eF(c[g>>2]|0);i=jk(c[d+268>>2]<<4)|0;d=i;c[g>>2]=d;g=b+56|0;j=b+24|0;h[i>>3]=+h[g>>3]- +h[j>>3]*.5;k=b+64|0;l=b+32|0;h[i+8>>3]=+h[k>>3]- +h[l>>3]*.5;h[i+16>>3]=+h[g>>3]+ +h[j>>3]*.5;h[i+24>>3]=+h[k>>3]+ +h[l>>3]*.5;if((e&8192|0)==0){RA(a,d,d,2)|0}if(f){return}qi(d);return}function ei(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=1;f=b;while(1){b=a[f]|0;if((b<<24>>24|0)==0){break}else if((b<<24>>24|0)==58){g=e+1|0}else{g=e}e=g;f=f+1|0}f=da((xF(d|0)|0)+1|0,e)|0;if((c[45192]|0)<(f|0)){g=f+10|0;c[45192]=g;c[45194]=gF(c[45194]|0,g)|0}zF(c[45194]|0,d|0)|0;g=e-1|0;e=c[45194]|0;if((g|0)==0){h=e;return h|0}else{i=g;j=e}while(1){e=j+(xF(j|0)|0)|0;z=58;a[e]=z;z=z>>8;a[e+1|0]=z;AF(c[45194]|0,d|0)|0;e=i-1|0;g=c[45194]|0;if((e|0)==0){h=g;break}else{i=e;j=g}}return h|0}function fi(a,b,c){a=+a;b=+b;c=+c;return+((1.0-a/b)*c*.5)}function gi(a,b,c){a=+a;b=+b;c=+c;return+(a/b*c*.5)}function hi(a,b,c){a=+a;b=+b;c=+c;var d=0.0,e=0.0;d=a/b;if(d>.5){e=1.0-d}else{e=d}return+(e*c)}function ii(a,b,c){a=+a;b=+b;c=+c;return+(c*.5)}function ji(a,b,d,e){a=a|0;b=+b;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0,A=0.0,B=0,C=0.0,D=0;f=i;i=i+32|0;g=f+16|0;j=c[a+4>>2]|0;k=j-1|0;l=(k|0)/3|0;if((j-4|0)>>>0<3>>>0){c[d+4>>2]=4;j=d|0;c[j>>2]=jk(64)|0;c[e+4>>2]=4;m=jk(64)|0;c[e>>2]=m;Qm(f|0,c[a>>2]|0,3,b,c[j>>2]|0,m);i=f;return}m=jk(l<<3)|0;j=m;n=a|0;a=(k|0)>2;a:do{if(a){o=0.0;k=c[n>>2]|0;p=0;while(1){q=+h[k+16>>3];r=+h[k>>3]-q;s=+h[k+24>>3];t=+h[k+8>>3]-s;u=+T(r*r+t*t);t=+h[k+32>>3];r=q-t;q=+h[k+40>>3];v=s-q;s=u+ +T(r*r+v*v);v=t- +h[k+48>>3];t=q- +h[k+56>>3];q=s+ +T(v*v+t*t);h[j+(p<<3)>>3]=q;w=o+q;x=p+1|0;if((x|0)<(l|0)){o=w;k=k+48|0;p=x}else{break}}o=b*w;if(a){y=0.0;z=0}else{A=0.0;B=0;C=o;break}while(1){q=y+ +h[j+(z<<3)>>3];p=z+1|0;if(q>=o){A=q;B=z;C=o;break a}if((p|0)<(l|0)){y=q;z=p}else{A=q;B=p;C=o;break}}}else{A=0.0;B=0;C=b*0.0}}while(0);z=B*3|0;a=z+4|0;p=d+4|0;c[p>>2]=a;k=d|0;c[k>>2]=jk(a<<4)|0;a=((l-B|0)*3|0)+1|0;l=e+4|0;c[l>>2]=a;d=e|0;c[d>>2]=jk(a<<4)|0;if((c[p>>2]|0)>0){a=0;while(1){e=(c[k>>2]|0)+(a<<4)|0;x=(c[n>>2]|0)+(a<<4)|0;c[e>>2]=c[x>>2];c[e+4>>2]=c[x+4>>2];c[e+8>>2]=c[x+8>>2];c[e+12>>2]=c[x+12>>2];x=a+1|0;if((x|0)<(c[p>>2]|0)){a=x}else{break}}D=a-3|0}else{D=-4}b:do{if((c[l>>2]|0)>0){a=D;p=0;while(1){x=(c[d>>2]|0)+(p<<4)|0;e=(c[n>>2]|0)+(a<<4)|0;c[x>>2]=c[e>>2];c[x+4>>2]=c[e+4>>2];c[x+8>>2]=c[e+8>>2];c[x+12>>2]=c[e+12>>2];e=p+1|0;if((e|0)>=(c[l>>2]|0)){break b}a=a+1|0;p=e}}}while(0);b=+h[j+(B<<3)>>3];Qm(g,(c[n>>2]|0)+(z<<4)|0,3,(C-(A-b))/b,(c[k>>2]|0)+(z<<4)|0,c[d>>2]|0);eF(m);i=f;return}function ki(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,j=0,k=0,l=0.0;d=i;i=i+144|0;e=a+48|0;f=+ui(a,e,a+16|0);if(!(f<4.0&+ui(a,e,a+32|0)<4.0)){g=d|0;j=d+64|0;Qm(d+128|0,a,3,.5,g,j);k=ki(j,ki(g,b)|0)|0;i=d;return k|0}g=b+16|0;if((c[g>>2]|0)==1){c[g>>2]=0;j=b;b=a;c[j>>2]=c[b>>2];c[j+4>>2]=c[b+4>>2];c[j+8>>2]=c[b+8>>2];c[j+12>>2]=c[b+12>>2]}f=+h[e>>3];l=+h[a+56>>3];a=kk(24)|0;e=a;c[a+16>>2]=0;h[a>>3]=f;h[a+8>>3]=l;c[g>>2]=e;k=e;i=d;return k|0}function li(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=b+156|0;if((c[f>>2]|0)<2){g=1;return g|0}h=Hm(e|0,c[53612]|0,213440)|0;i=b|0;j=b+160|0;if(($h(c[i>>2]|0,c[j>>2]|0,c[f>>2]|0,h)|0)<<24>>24!=0){g=1;return g|0}if((a[h]|0)!=0){g=0;return g|0}if((rw(d,e)|0)==0){g=1;return g|0}h=rw(d,e)|0;if((h|0)==0){g=0;return g|0}else{k=h}while(1){h=Hm(k|0,c[53776]|0,213440)|0;if((a[h]|0)==0){g=1;l=9;break}if(($h(c[i>>2]|0,c[j>>2]|0,c[f>>2]|0,h)|0)<<24>>24!=0){g=1;l=9;break}h=sw(d,k,e)|0;if((h|0)==0){g=0;l=9;break}else{k=h}}if((l|0)==9){return g|0}return 0}function mi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+144|0;g=f+128|0;h=ew(e,83344)|0;j=ew(e,166968)|0;k=ew(e,78880)|0;Iv(g,128,f|0);if((d|0)==0){l=0}else{l=c[d>>2]|0}if((h|0)==0){m=5}else{if((a[h]|0)==0){m=5}else{n=h}}if((m|0)==5){n=ew(e,82904)|0}Hh(b,l,n,j,k,Ih(b,e,g)|0,e)|0;Mv(g);i=f;return}function ni(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function oi(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=d+8|0;d=c[e>>2]|0;if((c[d+172>>2]|0)<1){return}else{f=1;g=d}while(1){d=c[(c[g+176>>2]|0)+(f<<2)>>2]|0;oi(b,d);h=d|0;d=ew(h,123768)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}lB(b,d)}}while(0);d=ew(h,121832)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}lB(b,d)}}while(0);d=ew(h,120224)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}lB(b,d)}}while(0);d=ew(h,121048)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}nB(b,d)}}while(0);d=ew(h,160752)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}lB(b,d)}}while(0);d=c[e>>2]|0;if((f|0)<(c[d+172>>2]|0)){f=f+1|0;g=d}else{break}}return}function pi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;e=i;f=a;a=i;i=i+16|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+32|0;tF(d,f,32)|0;g=+h[a>>3];j=+h[d>>3];f=g<j;do{if(f){k=0}else{if(g>+h[d+16>>3]){k=0;break}l=+h[a+8>>3];if(l<+h[d+8>>3]){k=0;break}k=l<=+h[d+24>>3]|0}}while(0);l=+h[b>>3];do{if(l<j){m=0}else{if(l>+h[d+16>>3]){m=0;break}n=+h[b+8>>3];if(n<+h[d+8>>3]){m=0;break}m=n<=+h[d+24>>3]|0}}while(0);if((k|0)!=(m|0)){o=0;i=e;return o|0}if((k|0)!=0){o=1;i=e;return o|0}n=+h[a+8>>3];do{if(g==l){p=+h[d+8>>3];if(f|n>=p^+h[b+8>>3]>=p^1){break}if(g>+h[d+16>>3]){break}else{o=0}i=e;return o|0}else{p=+h[b+8>>3];if(n==p){if(!(g>=j^l>=j)){break}if(n<+h[d+8>>3]){break}if(n>+h[d+24>>3]){break}else{o=0}i=e;return o|0}q=(p-n)/(l-g);a=g<l;r=a?g:l;s=a?l:g;t=n+q*(j-g);u=+h[d+8>>3];do{if(!(j<r|j>s|t<u)){if(t>+h[d+24>>3]){break}else{o=0}i=e;return o|0}}while(0);v=+h[d+16>>3];w=t+q*(v-j);do{if(w>=u){if(w>+h[d+24>>3]|v<r|v>s){break}else{o=0}i=e;return o|0}}while(0);a=n<p;s=a?n:p;r=a?p:n;w=g+(u-n)/q;do{if(w>=j){if(w>v|u<s|u>r){break}else{o=0}i=e;return o|0}}while(0);p=+h[d+24>>3];t=w+(p-u)/q;if(t<j){break}if(t>v|p<s|p>r){break}else{o=0}i=e;return o|0}}while(0);o=-1;i=e;return o|0}function qi(a){a=a|0;var b=0,c=0.0;b=a+16|0;c=+h[b>>3];h[a+32>>3]=c;h[a+48>>3]=c;h[a+40>>3]=+h[a+24>>3];h[a+56>>3]=+h[a+8>>3];h[b>>3]=+h[a>>3];return}function ri(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0,k=0.0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;e=i;f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=b|0;g=+h[f>>3];j=b+8|0;k=+h[j>>3];l=d;while(1){if((l|0)==0){break}else if((l|0)==270){m=5;break}else if((l|0)==90){m=3;break}else if((l|0)==180){m=4;break}if((l|0)<0){m=7;break}if((l|0)<=360){m=10;break}l=(l|0)%360|0}if((m|0)==3){h[f>>3]=k;h[j>>3]=-0.0-g}else if((m|0)==4){h[f>>3]=g;h[j>>3]=-0.0-k}else if((m|0)==5){h[f>>3]=k;h[j>>3]=g}else if((m|0)==7){si(a,b,-l|0);i=e;return}else if((m|0)==10){if((c[43782]|0)==(l|0)){n=+h[1491];o=+h[1490]}else{p=+(l|0)/6.283185307179586;q=+W(p);h[1490]=q;r=+V(p);h[1491]=r;c[43782]=l;n=r;o=q}h[a>>3]=g*n-k*o;h[a+8>>3]=g*o+k*n;i=e;return}l=a;a=b;c[l>>2]=c[a>>2];c[l+4>>2]=c[a+4>>2];c[l+8>>2]=c[a+8>>2];c[l+12>>2]=c[a+12>>2];i=e;return}function si(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0,k=0.0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;e=i;f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=b|0;g=+h[f>>3];j=b+8|0;k=+h[j>>3];l=d;while(1){if((l|0)==90){m=3;break}else if((l|0)==0){break}else if((l|0)==270){m=5;break}else if((l|0)==180){m=4;break}if((l|0)<0){m=7;break}if((l|0)<=360){m=10;break}l=(l|0)%360|0}if((m|0)==3){h[f>>3]=-0.0-k;h[j>>3]=g}else if((m|0)==4){h[f>>3]=g;h[j>>3]=-0.0-k}else if((m|0)==5){h[f>>3]=k;h[j>>3]=g}else if((m|0)==7){ri(a,b,-l|0);i=e;return}else if((m|0)==10){m=360-l|0;if((c[43782]|0)==(m|0)){n=+h[1491];o=+h[1490]}else{p=+(m|0)/6.283185307179586;q=+W(p);h[1490]=q;r=+V(p);h[1491]=r;c[43782]=m;n=r;o=q}h[a>>3]=g*n-k*o;h[a+8>>3]=g*o+k*n;i=e;return}m=a;a=b;c[m>>2]=c[a>>2];c[m+4>>2]=c[a+4>>2];c[m+8>>2]=c[a+8>>2];c[m+12>>2]=c[a+12>>2];i=e;return}function ti(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0;e=i;f=b;b=i;i=i+32|0;tF(b,f,32)|0;f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];g=+h[d>>3];j=+h[d+8>>3];k=+h[b>>3]+j;l=+h[b+24>>3]+g;m=+h[b+16>>3]+j;h[a>>3]=+h[b+8>>3]+g;h[a+8>>3]=k;h[a+16>>3]=l;h[a+24>>3]=m;i=e;return}function ui(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;e=i;f=a;a=i;i=i+16|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];g=+h[a>>3];j=+h[b>>3]-g;k=+h[a+8>>3];l=+h[b+8>>3]-k;m=j*(+h[d+8>>3]-k)-l*(+h[d>>3]-g);g=m*m;if(g<1.0e-10){n=0.0;i=e;return+n}n=g/(j*j+l*l);i=e;return+n}function vi(b){b=b|0;var d=0,e=0,f=0;d=i;if((a[174897]|0)!=0){i=d;return}a[174897]=1;e=zd(c[43716]|0)|0;Fv(1,120352,(f=i,i=i+16|0,c[f>>2]=b,c[f+8>>2]=e,f)|0)|0;i=f;wi();i=d;return}function wi(){var b=0,d=0,e=0,f=0,g=0;b=i;d=c[43719]|0;c[d+4>>2]=c[d>>2];d=c[43728]|0;if((d|0)>0){Kv(c[43719]|0,c[43726]|0,d)|0}Kv(c[43719]|0,c[43725]|0,c[43727]|0)|0;d=c[43719]|0;e=c[d+4>>2]|0;if(e>>>0<(c[d+8>>2]|0)>>>0){f=d;g=e}else{Jv(d,1)|0;d=c[43719]|0;f=d;g=c[d+4>>2]|0}c[f+4>>2]=g+1;a[g]=0;g=c[43719]|0;f=c[g>>2]|0;c[g+4>>2]=f;Fv(3,79472,(g=i,i=i+8|0,c[g>>2]=f,g)|0)|0;i=g;i=b;return}function xi(b,e,f){b=b|0;e=e|0;f=f|0;c[43719]=e;Iv(174880,128,0);c[43717]=b;a[174899]=0;a[174896]=0;a[174897]=0;c[43727]=0;c[43728]=0;a[174898]=1;b=f+52|0;f=md(Tj(d[(c[(c[b>>2]|0)+8>>2]|0)+115|0]|0)|0)|0;c[43716]=f;rd(f,c[(c[(c[b>>2]|0)+8>>2]|0)+136>>2]|0);sd(c[43716]|0,98,8);td(c[43716]|0,70);return 0}function yi(e,f,g){e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;j=i;i=i+264|0;k=j|0;l=j+8|0;m=j+16|0;n=j+24|0;o=j+56|0;p=j+88|0;q=j+120|0;r=j+152|0;s=j+184|0;t=j+216|0;u=j+248|0;v=j+256|0;if((pm(f,97048)|0)==0){w=jk(120)|0;c[w+100>>2]=-1;a[w+88|0]=-1;x=v;y=c[g>>2]|0;if((y|0)!=0){z=v|0;v=g;A=y;while(1){y=v+8|0;B=c[v+4>>2]|0;c[z>>2]=A;C=vb(x|0,3264,21,8,28)|0;if((C|0)==0){Fv(0,120960,(D=i,i=i+16|0,c[D>>2]=A,c[D+8>>2]=82896,D)|0)|0;i=D;E=1}else{F=Oc[c[C+4>>2]&255](w,B)|0;E=(d[174896]|0|F)&255}a[174896]=E;F=c[y>>2]|0;if((F|0)==0){break}else{v=y;A=F}}}c[44692]=w;a[174898]=0;c[43718]=285;i=j;return}do{if((pm(f,91560)|0)!=0){if((pm(f,86296)|0)==0){break}if((pm(f,81584)|0)==0){a[174898]=1;w=jk(104)|0;b[w+80>>1]=1;b[w+82>>1]=1;A=u;v=c[g>>2]|0;if((v|0)!=0){E=u|0;x=g;z=v;while(1){v=x+8|0;F=c[x+4>>2]|0;c[E>>2]=z;y=vb(A|0,70864,21,8,28)|0;if((y|0)==0){Fv(0,120960,(D=i,i=i+16|0,c[D>>2]=z,c[D+8>>2]=109488,D)|0)|0;i=D;G=1}else{B=Oc[c[y+4>>2]&255](w,F)|0;G=(d[174896]|0|B)&255}a[174896]=G;B=c[v>>2]|0;if((B|0)==0){break}else{x=v;z=B}}}c[44692]=w;c[43718]=286;i=j;return}if((pm(f,163664)|0)==0){z=t;c[z>>2]=c[4952];c[z+4>>2]=c[4953];c[z+8>>2]=c[4954];c[z+12>>2]=c[4955];c[z+16>>2]=c[4956];c[z+20>>2]=c[4957];c[z+24>>2]=c[4958];c[z+28>>2]=c[4959];h[t+16>>3]=-1.0;c[t+24>>2]=0;do{if((g|0)!=0){x=k;A=c[g>>2]|0;if((A|0)==0){break}E=k|0;B=g;v=A;while(1){A=B+8|0;F=c[B+4>>2]|0;c[E>>2]=v;y=vb(x|0,25920,3,8,28)|0;if((y|0)==0){Fv(0,120960,(D=i,i=i+16|0,c[D>>2]=v,c[D+8>>2]=114616,D)|0)|0;i=D;H=1}else{C=Oc[c[y+4>>2]&255](z,F)|0;H=(d[174896]|0|C)&255}a[174896]=H;C=c[A>>2]|0;if((C|0)==0){break}else{B=A;v=C}}}}while(0);w=c[e+144>>2]|0;c[44692]=Hc[c[w>>2]&63](w,z,1)|0;c[43718]=287;i=j;return}if((pm(f,159656)|0)==0){w=s;c[w>>2]=c[4952];c[w+4>>2]=c[4953];c[w+8>>2]=c[4954];c[w+12>>2]=c[4955];c[w+16>>2]=c[4956];c[w+20>>2]=c[4957];c[w+24>>2]=c[4958];c[w+28>>2]=c[4959];h[s+16>>3]=-1.0;c[s+24>>2]=1;v=c[e+144>>2]|0;c[44692]=Hc[c[v>>2]&63](v,w,1)|0;c[43718]=289;i=j;return}if((pm(f,142280)|0)==0){w=r;c[w>>2]=c[4952];c[w+4>>2]=c[4953];c[w+8>>2]=c[4954];c[w+12>>2]=c[4955];c[w+16>>2]=c[4956];c[w+20>>2]=c[4957];c[w+24>>2]=c[4958];c[w+28>>2]=c[4959];h[r+16>>3]=-1.0;c[r+24>>2]=32;v=c[e+144>>2]|0;c[44692]=Hc[c[v>>2]&63](v,w,1)|0;c[43718]=293;i=j;return}if((pm(f,154648)|0)==0){w=q;c[w>>2]=c[4952];c[w+4>>2]=c[4953];c[w+8>>2]=c[4954];c[w+12>>2]=c[4955];c[w+16>>2]=c[4956];c[w+20>>2]=c[4957];c[w+24>>2]=c[4958];c[w+28>>2]=c[4959];h[q+16>>3]=-1.0;c[q+24>>2]=4;v=c[e+144>>2]|0;c[44692]=Hc[c[v>>2]&63](v,w,1)|0;c[43718]=290;i=j;return}if((pm(f,151360)|0)==0){w=p;c[w>>2]=c[4952];c[w+4>>2]=c[4953];c[w+8>>2]=c[4954];c[w+12>>2]=c[4955];c[w+16>>2]=c[4956];c[w+20>>2]=c[4957];c[w+24>>2]=c[4958];c[w+28>>2]=c[4959];h[p+16>>3]=-1.0;c[p+24>>2]=2;v=c[e+144>>2]|0;c[44692]=Hc[c[v>>2]&63](v,w,1)|0;c[43718]=288;i=j;return}if((pm(f,148472)|0)==0){w=o;c[w>>2]=c[4952];c[w+4>>2]=c[4953];c[w+8>>2]=c[4954];c[w+12>>2]=c[4955];c[w+16>>2]=c[4956];c[w+20>>2]=c[4957];c[w+24>>2]=c[4958];c[w+28>>2]=c[4959];h[o+16>>3]=-1.0;c[o+24>>2]=8;v=c[e+144>>2]|0;c[44692]=Hc[c[v>>2]&63](v,w,1)|0;c[43718]=291;i=j;return}if((pm(f,145248)|0)==0){w=n;c[w>>2]=c[4952];c[w+4>>2]=c[4953];c[w+8>>2]=c[4954];c[w+12>>2]=c[4955];c[w+16>>2]=c[4956];c[w+20>>2]=c[4957];c[w+24>>2]=c[4958];c[w+28>>2]=c[4959];h[n+16>>3]=-1.0;c[n+24>>2]=16;v=c[e+144>>2]|0;c[44692]=Hc[c[v>>2]&63](v,w,1)|0;c[43718]=292;i=j;return}if((pm(f,139176)|0)==0){c[44692]=0;w=m;v=c[g>>2]|0;if((v|0)!=0){B=m|0;x=g;E=v;while(1){v=x+8|0;C=c[x+4>>2]|0;c[B>>2]=E;A=vb(w|0,71320,1,8,28)|0;if((A|0)==0){Fv(0,120960,(D=i,i=i+16|0,c[D>>2]=E,c[D+8>>2]=120184,D)|0)|0;i=D;I=1}else{F=Oc[c[A+4>>2]&255](178768,C)|0;I=(d[174896]|0|F)&255}a[174896]=I;F=c[v>>2]|0;if((F|0)==0){break}else{x=v;E=F}}}c[43718]=282;i=j;return}if((pm(f,136632)|0)==0){c[43718]=276;i=j;return}if((pm(f,133736)|0)==0){c[43718]=279;i=j;return}if((pm(f,131648)|0)!=0){if((pm(f,167840)|0)==0){c[43718]=262;i=j;return}else{c[43718]=268;a[174897]=1;E=zd(c[43716]|0)|0;Fv(1,129424,(D=i,i=i+16|0,c[D>>2]=f,c[D+8>>2]=E,D)|0)|0;i=D;i=j;return}}E=jk(40)|0;x=l;w=c[g>>2]|0;if((w|0)!=0){B=l|0;z=g;F=w;while(1){w=z+8|0;v=c[z+4>>2]|0;c[B>>2]=F;C=vb(x|0,21624,2,8,28)|0;if((C|0)==0){Fv(0,120960,(D=i,i=i+16|0,c[D>>2]=F,c[D+8>>2]=126216,D)|0)|0;i=D;J=1}else{A=Oc[c[C+4>>2]&255](E,v)|0;J=(d[174896]|0|A)&255}a[174896]=J;A=c[w>>2]|0;if((A|0)==0){break}else{z=w;F=A}}}c[44692]=E;c[43718]=284;i=j;return}}while(0);a[174898]=0;c[43718]=260;i=j;return}function zi(b,d){b=b|0;d=d|0;var e=0,f=0;b=i;if((pm(d,97048)|0)==0){c[43718]=264;a[174898]=1;i=b;return}do{if((pm(d,91560)|0)!=0){if((pm(d,86296)|0)==0){break}if((pm(d,81584)|0)==0){c[43718]=265;a[174898]=0;i=b;return}if((pm(d,167840)|0)==0){c[43718]=263;i=b;return}if((pm(d,163664)|0)==0){c[43718]=266;i=b;return}if((pm(d,159656)|0)==0){c[43718]=270;i=b;return}if((pm(d,154648)|0)==0){c[43718]=271;i=b;return}if((pm(d,151360)|0)==0){c[43718]=269;i=b;return}if((pm(d,148472)|0)==0){c[43718]=272;i=b;return}if((pm(d,145248)|0)==0){c[43718]=273;i=b;return}if((pm(d,142280)|0)==0){c[43718]=274;i=b;return}if((pm(d,139176)|0)==0){if((c[43718]|0)==282){c[43718]=281;i=b;return}else{c[43718]=258;i=b;return}}if((pm(d,136632)|0)==0){if((c[43718]|0)==276){c[43718]=275;i=b;return}else{c[43718]=277;i=b;return}}if((pm(d,133736)|0)==0){if((c[43718]|0)==279){c[43718]=278;i=b;return}else{c[43718]=280;i=b;return}}if((pm(d,131648)|0)!=0){c[43718]=268;a[174897]=1;e=zd(c[43716]|0)|0;Fv(1,129424,(f=i,i=i+16|0,c[f>>2]=d,c[f+8>>2]=e,f)|0)|0;i=f;i=b;return}if((c[43718]|0)==284){c[43718]=283;i=b;return}else{c[43718]=259;i=b;return}}}while(0);c[43718]=261;i=b;return}function Ai(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;if((a[174898]|0)==0|(e|0)==0){return}else{f=e;g=0;h=d}while(1){d=h+1|0;e=a[h]|0;if((e&255)>>>0>31>>>0){b=c[43719]|0;i=c[b+4>>2]|0;if(i>>>0<(c[b+8>>2]|0)>>>0){j=b;k=i}else{Jv(b,1)|0;b=c[43719]|0;j=b;k=c[b+4>>2]|0}c[j+4>>2]=k+1;a[k]=e;l=g+1|0}else{l=g}e=f-1|0;if((e|0)==0){break}else{f=e;g=l;h=d}}if((l|0)==0){return}c[43718]=267;return}function Bi(){var b=0;b=(a[174897]|a[174896])<<24>>24;qd(c[43716]|0);Mv(174880);return b|0}function Ci(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;b=i;c[43718]=0;d=0;a:while(1){e=a[174899]|0;do{if((e<<24>>24|0)==2){f=-1;g=41;break a}else if((e<<24>>24|0)==0){a[174899]=1;h=6;j=0;k=157976}else{l=c[43717]|0;m=a[l]|0;if(m<<24>>24==0){a[174899]=2;h=7;j=d;k=127960;break}n=l+1|0;b:do{if(m<<24>>24==60){o=a[n]|0;c:do{if(o<<24>>24==33){if((Za(l+2|0,115392,2)|0)!=0){p=n;q=33;g=18;break}r=l+4|0;s=r;t=1;while(1){u=s;while(1){v=u+1|0;w=a[u]|0;if((w<<24>>24|0)==0){x=u;break c}else if((w<<24>>24|0)==62){g=14;break}else if((w<<24>>24|0)==60){g=12;break}else{u=v}}if((g|0)==12){g=0;y=t+1|0;z=60}else if((g|0)==14){g=0;y=t-1|0;z=62}if((y|0)==0){break}else{s=v;t=y}}t=u-2|0;if(t>>>0>=r>>>0){if((Za(t|0,115392,2)|0)==0){A=u;B=z;g=20;break}}Fv(0,102712,(C=i,i=i+1|0,i=i+7&-8,c[C>>2]=0,C)|0)|0;i=C;a[174896]=1;A=u;B=a[u]|0;g=20}else{p=n;q=o;g=18}}while(0);d:do{if((g|0)==18){while(1){g=0;if((q<<24>>24|0)==0|(q<<24>>24|0)==62){A=p;B=q;g=20;break d}o=p+1|0;p=o;q=a[o]|0;g=18}}}while(0);do{if((g|0)==20){g=0;if(B<<24>>24!=62){x=A;break}D=A+1|0;break b}}while(0);Fv(0,108288,(C=i,i=i+1|0,i=i+7&-8,c[C>>2]=0,C)|0)|0;i=C;a[174896]=1;D=x}else{r=l;o=m;while(1){do{if((o<<24>>24|0)==38){t=r+1|0;if((a[t]|0)==35){g=26;break}E=fn(t,174880)|0}else if((o<<24>>24|0)==0|(o<<24>>24|0)==60){D=r;break b}else{g=26}}while(0);if((g|0)==26){g=0;t=c[43721]|0;if(t>>>0<(c[43722]|0)>>>0){F=t}else{Jv(174880,1)|0;F=c[43721]|0}c[43721]=F+1;a[F]=o;E=r+1|0}r=E;o=a[E]|0}}}while(0);h=D-l|0;j=D;k=l}}while(0);c[43726]=c[43725];c[43728]=c[43727];c[43725]=k;c[43727]=h;e=c[43721]|0;m=c[43720]|0;n=e-m|0;o=c[43716]|0;if((e|0)==(m|0)){G=ud(o,k,h,(h|0)==0|0)|0}else{if(e>>>0<(c[43722]|0)>>>0){H=e}else{Jv(174880,1)|0;H=c[43721]|0}a[H]=0;e=c[43720]|0;c[43721]=e;G=ud(o,e,n,0)|0}if(!((G|0)!=0|(a[174897]|0)!=0)){n=Ad(yd(c[43716]|0)|0)|0;e=zd(c[43716]|0)|0;Fv(1,120352,(C=i,i=i+16|0,c[C>>2]=n,c[C+8>>2]=e,C)|0)|0;i=C;wi();a[174897]=1;c[43718]=268}if((j|0)!=0){c[43717]=j}e=c[43718]|0;if((e|0)==0){d=j}else{f=e;g=41;break}}if((g|0)==41){i=b;return f|0}return 0}function Di(a,b){a=a|0;b=b|0;c[a+36>>2]=Lb(b|0)|0;return 0}function Ei(a,b){a=a|0;b=b|0;c[a+32>>2]=Lb(b|0)|0;return 0}function Fi(a,b){a=a|0;b=b|0;return pm(c[a>>2]|0,c[b>>2]|0)|0}function Gi(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=(Cb(a[d]|0)|0)<<24>>24;do{if((f|0)==82){g=d+1|0;if((pm(g,118688)|0)!=0){h=g;j=5;break}c[b>>2]=114;k=0;i=e;return k|0}else if((f|0)!=76){h=d+1|0;j=5}}while(0);do{if((j|0)==5){if((pm(h,117768)|0)==0){break}do{if((f|0)!=67){if((pm(h,116848)|0)!=0){break}Fv(0,115896,(g=i,i=i+8|0,c[g>>2]=d,g)|0)|0;i=g;k=1;i=e;return k|0}}while(0);c[b>>2]=110;k=0;i=e;return k|0}}while(0);c[b>>2]=108;k=0;i=e;return k|0}function Hi(a,b){a=a|0;b=b|0;c[a+4>>2]=b;return 0}function Ii(a,b){a=a|0;b=b|0;c[a>>2]=b;return 0}function Ji(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0;d=i;i=i+8|0;e=d|0;f=Ja(b|0,e|0,10)|0;if((c[e>>2]|0)==(b|0)){Fv(0,111576,(g=i,i=i+16|0,c[g>>2]=112168,c[g+8>>2]=b,g)|0)|0;i=g;j=1;i=d;return j|0}if((f|0)>255){Fv(0,110912,(g=i,i=i+24|0,c[g>>2]=112168,c[g+8>>2]=b,c[g+16>>2]=255,g)|0)|0;i=g;j=1;i=d;return j|0}if((f|0)<0){Fv(0,110160,(g=i,i=i+24|0,c[g>>2]=112168,c[g+8>>2]=b,c[g+16>>2]=0,g)|0)|0;i=g;j=1;i=d;return j|0}else{h[a+16>>3]=+(f|0);j=0;i=d;return j|0}return 0}function Ki(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=(Cb(a[e]|0)|0)<<24>>24;do{if((g|0)==67){if((pm(e+1|0,116848)|0)==0){h=0}else{break}i=f;return h|0}else if((g|0)==82){if((pm(e+1|0,118688)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|2;h=0;i=f;return h|0}else if((g|0)==76){if((pm(e+1|0,117768)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|4;h=0;i=f;return h|0}else if((g|0)==84){if((pm(e+1|0,83696)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|6;h=0;i=f;return h|0}}while(0);Fv(0,83296,(d=i,i=i+8|0,c[d>>2]=e,d)|0)|0;i=d;h=1;i=f;return h|0}function Li(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=(Cb(a[e]|0)|0)<<24>>24;do{if((g|0)==76){if((pm(e+1|0,117768)|0)!=0){break}h=d+36|0;b[h>>1]=b[h>>1]|512;j=0;i=f;return j|0}else if((g|0)==67){if((pm(e+1|0,116848)|0)==0){j=0}else{break}i=f;return j|0}else if((g|0)==82){if((pm(e+1|0,118688)|0)!=0){break}h=d+36|0;b[h>>1]=b[h>>1]|256;j=0;i=f;return j|0}}while(0);Fv(0,84096,(d=i,i=i+8|0,c[d>>2]=e,d)|0)|0;i=d;j=1;i=f;return j|0}function Mi(a,b){a=a|0;b=b|0;c[a+20>>2]=Lb(b|0)|0;return 0}function Ni(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f|0;h=Ja(e|0,g|0,10)|0;if((c[g>>2]|0)==(e|0)){Fv(0,111576,(j=i,i=i+16|0,c[j>>2]=84544,c[j+8>>2]=e,j)|0)|0;i=j;k=1;i=f;return k|0}if((h|0)>255){Fv(0,110912,(j=i,i=i+24|0,c[j>>2]=84544,c[j+8>>2]=e,c[j+16>>2]=255,j)|0)|0;i=j;k=1;i=f;return k|0}if((h|0)<0){Fv(0,110160,(j=i,i=i+24|0,c[j>>2]=84544,c[j+8>>2]=e,c[j+16>>2]=0,j)|0)|0;i=j;k=1;i=f;return k|0}else{a[d+33|0]=h;h=d+36|0;b[h>>1]=b[h>>1]|32;k=0;i=f;return k|0}return 0}function Oi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f|0;h=Ja(e|0,g|0,10)|0;if((c[g>>2]|0)==(e|0)){Fv(0,111576,(j=i,i=i+16|0,c[j>>2]=84904,c[j+8>>2]=e,j)|0)|0;i=j;k=1;i=f;return k|0}if((h|0)>255){Fv(0,110912,(j=i,i=i+24|0,c[j>>2]=84904,c[j+8>>2]=e,c[j+16>>2]=255,j)|0)|0;i=j;k=1;i=f;return k|0}if((h|0)<0){Fv(0,110160,(j=i,i=i+24|0,c[j>>2]=84904,c[j+8>>2]=e,c[j+16>>2]=0,j)|0)|0;i=j;k=1;i=f;return k|0}else{a[d+34|0]=h;h=d+36|0;b[h>>1]=b[h>>1]|64;k=0;i=f;return k|0}return 0}function Pi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f|0;h=Ja(e|0,g|0,10)|0;if((c[g>>2]|0)==(e|0)){Fv(0,111576,(j=i,i=i+16|0,c[j>>2]=85368,c[j+8>>2]=e,j)|0)|0;i=j;k=1;i=f;return k|0}if((h|0)>127){Fv(0,110912,(j=i,i=i+24|0,c[j>>2]=85368,c[j+8>>2]=e,c[j+16>>2]=127,j)|0)|0;i=j;k=1;i=f;return k|0}if((h|0)<-128){Fv(0,110160,(j=i,i=i+24|0,c[j>>2]=85368,c[j+8>>2]=e,c[j+16>>2]=-128,j)|0)|0;i=j;k=1;i=f;return k|0}else{a[d+32|0]=h;h=d+36|0;b[h>>1]=b[h>>1]|128;k=0;i=f;return k|0}return 0}function Qi(a,b){a=a|0;b=b|0;c[a+24>>2]=Lb(b|0)|0;return 0}function Ri(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;g=Ja(d|0,f|0,10)|0;if((c[f>>2]|0)==(d|0)){Fv(0,111576,(h=i,i=i+16|0,c[h>>2]=86680,c[h+8>>2]=d,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)>65535){Fv(0,110912,(h=i,i=i+24|0,c[h>>2]=86680,c[h+8>>2]=d,c[h+16>>2]=65535,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)<0){Fv(0,110160,(h=i,i=i+24|0,c[h>>2]=86680,c[h+8>>2]=d,c[h+16>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)==0){Fv(0,85816,(h=i,i=i+1|0,i=i+7&-8,c[h>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}else{b[a+80>>1]=g;j=0;i=e;return j|0}return 0}function Si(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=(Cb(d[e]|0|0)|0)<<24>>24;do{if((g|0)==70){if((pm(e+1|0,87736)|0)==0){h=0}else{break}i=f;return h|0}else if((g|0)==84){if((pm(e+1|0,88168)|0)!=0){break}j=a+36|0;b[j>>1]=b[j>>1]|1;h=0;i=f;return h|0}}while(0);Fv(0,87216,(a=i,i=i+8|0,c[a>>2]=e,a)|0)|0;i=a;h=1;i=f;return h|0}function Ti(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+8|0;e=d|0;f=Ja(b|0,e|0,10)|0;if((c[e>>2]|0)==(b|0)){Fv(0,111576,(g=i,i=i+16|0,c[g>>2]=88608,c[g+8>>2]=b,g)|0)|0;i=g;h=1;i=d;return h|0}if((f|0)>360){Fv(0,110912,(g=i,i=i+24|0,c[g>>2]=88608,c[g+8>>2]=b,c[g+16>>2]=360,g)|0)|0;i=g;h=1;i=d;return h|0}if((f|0)<0){Fv(0,110160,(g=i,i=i+24|0,c[g>>2]=88608,c[g+8>>2]=b,c[g+16>>2]=0,g)|0)|0;i=g;h=1;i=d;return h|0}else{c[a+28>>2]=f&65535;h=0;i=d;return h|0}return 0}function Ui(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;g=Ja(d|0,f|0,10)|0;if((c[f>>2]|0)==(d|0)){Fv(0,111576,(h=i,i=i+16|0,c[h>>2]=89072,c[h+8>>2]=d,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)>65535){Fv(0,110912,(h=i,i=i+24|0,c[h>>2]=89072,c[h+8>>2]=d,c[h+16>>2]=65535,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)<0){Fv(0,110160,(h=i,i=i+24|0,c[h>>2]=89072,c[h+8>>2]=d,c[h+16>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}else{b[a+40>>1]=g;j=0;i=e;return j|0}return 0}function Vi(a,b){a=a|0;b=b|0;c[a>>2]=Lb(b|0)|0;return 0}function Wi(a,b){a=a|0;b=b|0;c[a+16>>2]=Lb(b|0)|0;return 0}function Xi(a,b){a=a|0;b=b|0;c[a+4>>2]=Lb(b|0)|0;return 0}function Yi(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;g=Ja(d|0,f|0,10)|0;if((c[f>>2]|0)==(d|0)){Fv(0,111576,(h=i,i=i+16|0,c[h>>2]=90016,c[h+8>>2]=d,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)>65535){Fv(0,110912,(h=i,i=i+24|0,c[h>>2]=90016,c[h+8>>2]=d,c[h+16>>2]=65535,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)<0){Fv(0,110160,(h=i,i=i+24|0,c[h>>2]=90016,c[h+8>>2]=d,c[h+16>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)==0){Fv(0,89456,(h=i,i=i+1|0,i=i+7&-8,c[h>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}else{b[a+82>>1]=g;j=0;i=e;return j|0}return 0}function Zi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=Lb(e|0)|0;e=La(g|0,94896)|0;if((e|0)==0){h=0;eF(g);i=f;return h|0}j=d+42|0;d=e;e=0;while(1){a:do{if(((Cb(a[d]|0)|0)&255|0)==82){k=d+1|0;if((pm(k,94416)|0)==0){b[j>>1]=b[j>>1]|4;l=e;break}if((pm(k,94024)|0)==0){b[j>>1]=b[j>>1]|2;l=e;break}else{Fv(0,93544,(m=i,i=i+8|0,c[m>>2]=d,m)|0)|0;i=m;l=1;break}}else{if((pm(d,93072)|0)==0){b[j>>1]=b[j>>1]&-385;l=e;break}do{if((pm(d,92608)|0)!=0){if((pm(d,91960)|0)==0){break}if((pm(d,91120)|0)==0){b[j>>1]=b[j>>1]|128;l=e;break a}if((pm(d,90600)|0)==0){b[j>>1]=b[j>>1]|256;l=e;break a}else{Fv(0,93544,(m=i,i=i+8|0,c[m>>2]=d,m)|0)|0;i=m;l=1;break a}}}while(0);b[j>>1]=b[j>>1]|32;l=e}}while(0);k=La(0,94896)|0;if((k|0)==0){h=l;break}else{d=k;e=l}}eF(g);i=f;return h|0}function _i(a,b){a=a|0;b=b|0;c[a+8>>2]=Lb(b|0)|0;return 0}function $i(a,b){a=a|0;b=b|0;c[a+12>>2]=Lb(b|0)|0;return 0}function aj(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=(Cb(a[e]|0)|0)<<24>>24;do{if((g|0)==77){if((pm(e+1|0,95816)|0)==0){h=0}else{break}i=f;return h|0}else if((g|0)==66){if((pm(e+1|0,97464)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|16;h=0;i=f;return h|0}else if((g|0)==84){if((pm(e+1|0,96352)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|8;h=0;i=f;return h|0}}while(0);Fv(0,95272,(d=i,i=i+8|0,c[d>>2]=e,d)|0)|0;i=d;h=1;i=f;return h|0}function bj(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;g=Ja(d|0,f|0,10)|0;if((c[f>>2]|0)==(d|0)){Fv(0,111576,(h=i,i=i+16|0,c[h>>2]=98160,c[h+8>>2]=d,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)>65535){Fv(0,110912,(h=i,i=i+24|0,c[h>>2]=98160,c[h+8>>2]=d,c[h+16>>2]=65535,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)<0){Fv(0,110160,(h=i,i=i+24|0,c[h>>2]=98160,c[h+8>>2]=d,c[h+16>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}else{b[a+38>>1]=g;j=0;i=e;return j|0}return 0}function cj(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=(Cb(a[e]|0)|0)<<24>>24;do{if((g|0)==67){if((pm(e+1|0,116848)|0)==0){h=0}else{break}i=f;return h|0}else if((g|0)==76){if((pm(e+1|0,117768)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|4;h=0;i=f;return h|0}else if((g|0)==82){if((pm(e+1|0,118688)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|2;h=0;i=f;return h|0}}while(0);Fv(0,115896,(d=i,i=i+8|0,c[d>>2]=e,d)|0)|0;i=d;h=1;i=f;return h|0}function dj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;g=Ja(d|0,f|0,10)|0;if((c[f>>2]|0)==(d|0)){Fv(0,111576,(h=i,i=i+16|0,c[h>>2]=79912,c[h+8>>2]=d,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)>127){Fv(0,110912,(h=i,i=i+24|0,c[h>>2]=79912,c[h+8>>2]=d,c[h+16>>2]=127,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)<0){Fv(0,110160,(h=i,i=i+24|0,c[h>>2]=79912,c[h+8>>2]=d,c[h+16>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}else{a[b+88|0]=g;j=0;i=e;return j|0}return 0}function ej(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((a[d]|0)==42){f=b+112|0;a[f]=a[f]|1;g=0;i=e;return g|0}else{Fv(0,80216,(f=i,i=i+8|0,c[f>>2]=d,f)|0)|0;i=f;g=1;i=e;return g|0}return 0}function fj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((a[d]|0)==42){f=b+112|0;a[f]=a[f]|2;g=0;i=e;return g|0}else{Fv(0,80672,(f=i,i=i+8|0,c[f>>2]=d,f)|0)|0;i=f;g=1;i=e;return g|0}return 0}
-
-
-
-function eD(b){b=b|0;var d=0;_z(b,122952)|0;d=ew(c[(c[b>>2]|0)+168>>2]|0,122800)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}_z(b,122592)|0;_z(b,d)|0;_z(b,122416)|0}}while(0);_z(b,122224)|0;_z(b,122040)|0;_z(b,121976)|0;d=b+12|0;_z(b,gk(c[c[c[d>>2]>>2]>>2]|0)|0)|0;_z(b,121864)|0;_z(b,gk(c[(c[c[d>>2]>>2]|0)+4>>2]|0)|0)|0;_z(b,121640)|0;_z(b,gk(c[(c[c[d>>2]>>2]|0)+8>>2]|0)|0)|0;_z(b,121592)|0;_z(b,148920)|0;return}function fD(b){b=b|0;var d=0,e=0,f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0;d=i;e=c[b+16>>2]|0;_z(b,124800)|0;f=e+8|0;if((a[$w(c[f>>2]|0)|0]|0)!=0){_z(b,124616)|0;_z(b,gk($w(c[f>>2]|0)|0)|0)|0}f=da(c[b+168>>2]|0,c[b+164>>2]|0)|0;dA(b,124384,(e=i,i=i+8|0,c[e>>2]=f,e)|0);i=e;f=c[b+452>>2]|0;dA(b,124120,(e=i,i=i+16|0,c[e>>2]=c[b+448>>2],c[e+8>>2]=f,e)|0);i=e;g=+h[b+432>>3]/72.0;j=+h[b+440>>3]/72.0;k=+h[b+392>>3]*j;l=g*+h[b+400>>3];m=j*+h[b+408>>3];dA(b,123832,(e=i,i=i+32|0,h[e>>3]=+h[b+384>>3]*g,h[e+8>>3]=k,h[e+16>>3]=l,h[e+24>>3]=m,e)|0);i=e;_z(b,123456)|0;_z(b,123208)|0;_z(b,128448)|0;i=d;return}function gD(a){a=a|0;_z(a,124920)|0;return}function hD(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;_z(a,128192)|0;_z(a,gk(b)|0)|0;_z(a,125096)|0;return}function iD(a){a=a|0;_z(a,130512)|0;return}function jD(b){b=b|0;var d=0,e=0,f=0.0,g=0,j=0.0,k=0.0,l=0;d=i;e=c[b+16>>2]|0;_z(b,128192)|0;_z(b,gk(c[e+212>>2]|0)|0)|0;_z(b,125592)|0;f=+h[b+496>>3];g=-(c[b+360>>2]|0)|0;j=+h[b+504>>3];k=-0.0- +h[b+512>>3];dA(b,125320,(l=i,i=i+40|0,h[l>>3]=+h[b+488>>3],h[l+8>>3]=f,c[l+16>>2]=g,h[l+24>>3]=j,h[l+32>>3]=k,l)|0);i=l;l=e+8|0;if((a[$w(c[l>>2]|0)|0]|0)==0){i=d;return}_z(b,127488)|0;_z(b,gk($w(c[l>>2]|0)|0)|0)|0;_z(b,126984)|0;i=d;return}function kD(a){a=a|0;_z(a,130512)|0;return}function lD(a){a=a|0;var b=0;b=c[a+16>>2]|0;_z(a,128192)|0;_z(a,gk(c[b+212>>2]|0)|0)|0;_z(a,125880)|0;_z(a,127488)|0;_z(a,gk($w(c[b+8>>2]|0)|0)|0)|0;_z(a,126984)|0;return}function mD(a){a=a|0;_z(a,130512)|0;return}function nD(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+16>>2]|0;_z(a,128192)|0;_z(a,gk(c[d+212>>2]|0)|0)|0;e=c[a+160>>2]|0;if((e|0)>1){f=gk(c[(c[(c[a>>2]|0)+308>>2]|0)+(e<<2)>>2]|0)|0;dA(a,126656,(e=i,i=i+8|0,c[e>>2]=f,e)|0);i=e}_z(a,126312)|0;_z(a,127488)|0;_z(a,gk($w(c[d+8>>2]|0)|0)|0)|0;_z(a,126984)|0;i=b;return}function oD(a){a=a|0;_z(a,130512)|0;return}function pD(a){a=a|0;var b=0,d=0;b=c[a+16>>2]|0;_z(a,128192)|0;_z(a,gk(c[b+212>>2]|0)|0)|0;_z(a,127832)|0;_z(a,127488)|0;d=fk(127272,c[b+8>>2]|0)|0;_z(a,gk(d)|0)|0;eF(d);_z(a,126984)|0;return}function qD(a){a=a|0;_z(a,130512)|0;return}function rD(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0;_z(b,130304)|0;if((f|0)!=0){_z(b,130072)|0;_z(b,gk(f)|0)|0;_z(b,144328)|0}_z(b,130984)|0;_z(b,129896)|0;do{if((c|0)!=0){if((a[c]|0)==0){break}_z(b,129608)|0;_z(b,c)|0;_z(b,144328)|0}}while(0);do{if((d|0)!=0){if((a[d]|0)==0){break}_z(b,129104)|0;_z(b,gk(d)|0)|0;_z(b,144328)|0}}while(0);if((e|0)==0){g=_z(b,128448)|0;return}if((a[e]|0)==0){g=_z(b,128448)|0;return}_z(b,128728)|0;_z(b,gk(e)|0)|0;_z(b,144328)|0;g=_z(b,128448)|0;return}function sD(a){a=a|0;_z(a,130696)|0;_z(a,130512)|0;return}function tD(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;g=i;j=e;e=i;i=i+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];j=c[b+16>>2]|0;_z(b,136736)|0;k=a[f+48|0]|0;if((k|0)==114){_z(b,135944)|0}else if((k|0)==108){_z(b,136200)|0}else{_z(b,135672)|0}k=e+8|0;l=+h[f+24>>3]+ +h[k>>3];h[k>>3]=l;dA(b,135392,(k=i,i=i+16|0,h[k>>3]=+h[e>>3],h[k+8>>3]=-0.0-l,k)|0);i=k;e=f+4|0;m=c[e>>2]|0;n=c[m+8>>2]|0;do{if((n|0)==0){dA(b,133808,(k=i,i=i+8|0,c[k>>2]=c[m>>2],k)|0);i=k;o=0;p=0}else{q=c[(c[(c[(c[b>>2]|0)+168>>2]|0)+8>>2]|0)+232>>2]|0;if((q|0)==2){r=n+24|0;s=n+32|0;t=n+28|0}else if((q|0)==1){r=n|0;s=n+16|0;t=n+8|0}else{r=n+4|0;s=n+16|0;t=n+8|0}q=c[s>>2]|0;u=c[t>>2]|0;v=c[n+12>>2]|0;dA(b,135008,(k=i,i=i+8|0,c[k>>2]=c[r>>2],k)|0);i=k;w=c[n+24>>2]|0;if((w|0)!=0){dA(b,134752,(k=i,i=i+8|0,c[k>>2]=w,k)|0);i=k}_z(b,144328)|0;if((u|0)!=0){dA(b,134552,(k=i,i=i+8|0,c[k>>2]=u,k)|0);i=k}if((v|0)!=0){dA(b,134344,(k=i,i=i+8|0,c[k>>2]=v,k)|0);i=k}if((q|0)==0){o=0;p=u;break}dA(b,134096,(k=i,i=i+8|0,c[k>>2]=q,k)|0);i=k;o=q;p=u}}while(0);n=c[e>>2]|0;do{if((n|0)!=0){r=c[n+24>>2]<<25>>25;if((r|0)==0){break}if((r&1|0)!=0&(p|0)==0){dA(b,133496,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k}if((r&2|0)!=0&(o|0)==0){dA(b,133328,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k}if((r&36|0)!=0){dA(b,133152,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k;if((r&4|0)==0){x=0}else{dA(b,133016,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k;x=1}if((r&32|0)!=0){dA(b,132832,(k=i,i=i+8|0,c[k>>2]=(x|0)!=0?132712:213408,k)|0);i=k}dA(b,144328,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k}if((r&8|0)!=0){dA(b,132376,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k}if((r&16|0)==0){break}dA(b,132136,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k}}while(0);dA(b,131760,(k=i,i=i+8|0,h[k>>3]=+h[(c[e>>2]|0)+16>>3],k)|0);i=k;e=j+16|0;x=c[j+48>>2]|0;if((x|0)==5){j=c[e>>2]|0;if((pm(j,168168)|0)==0){y=_z(b,130984)|0;z=f|0;A=c[z>>2]|0;B=hk(A,1)|0;C=_z(b,B)|0;D=_z(b,130832)|0;i=g;return}dA(b,131400,(k=i,i=i+8|0,c[k>>2]=j,k)|0);i=k;y=_z(b,130984)|0;z=f|0;A=c[z>>2]|0;B=hk(A,1)|0;C=_z(b,B)|0;D=_z(b,130832)|0;i=g;return}else if((x|0)==1){x=e;j=d[x+1|0]|0;o=d[x+2|0]|0;dA(b,131112,(k=i,i=i+24|0,c[k>>2]=d[e]|0,c[k+8>>2]=j,c[k+16>>2]=o,k)|0);i=k;y=_z(b,130984)|0;z=f|0;A=c[z>>2]|0;B=hk(A,1)|0;C=_z(b,B)|0;D=_z(b,130832)|0;i=g;return}else{cc(143376,143104,436,169944)}}function uD(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0.0,g=0;d=i;if((c|0)==3){e=BD(a)|0}else if((c|0)==2){e=AD(a,b,2)|0}else{e=0}_z(a,137720)|0;zD(a,c,e);e=b|0;c=b+8|0;f=-0.0- +h[c>>3];dA(a,137472,(g=i,i=i+16|0,h[g>>3]=+h[e>>3],h[g+8>>3]=f,g)|0);i=g;f=+h[b+24>>3]- +h[c>>3];dA(a,137240,(g=i,i=i+16|0,h[g>>3]=+h[b+16>>3]- +h[e>>3],h[g+8>>3]=f,g)|0);i=g;_z(a,137008)|0;i=d;return}function vD(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0.0,j=0;e=i;if((d|0)==2){f=AD(a,b,c)|0}else if((d|0)==3){f=BD(a)|0}else{f=0}_z(a,138128)|0;zD(a,d,f);_z(a,148072)|0;if((c|0)>0){f=0;do{g=-0.0- +h[b+(f<<4)+8>>3];dA(a,147760,(j=i,i=i+16|0,h[j>>3]=+h[b+(f<<4)>>3],h[j+8>>3]=g,j)|0);i=j;f=f+1|0;}while((f|0)<(c|0))}g=-0.0- +h[b+8>>3];dA(a,137944,(j=i,i=i+16|0,h[j>>3]=+h[b>>3],h[j+8>>3]=g,j)|0);i=j;_z(a,147496)|0;i=e;return}function wD(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0;f=i;if((g|0)==2){j=AD(a,b,d)|0}else if((g|0)==3){j=BD(a)|0}else{j=0}_z(a,142760)|0;zD(a,g,j);_z(a,142424)|0;if((d|0)>0){k=0;l=77}else{m=_z(a,147496)|0;i=f;return}do{n=+h[b+(k<<4)>>3];o=-0.0- +h[b+(k<<4)+8>>3];dA(a,141960,(j=i,i=i+24|0,c[j>>2]=l&255,h[j+8>>3]=n,h[j+16>>3]=o,j)|0);i=j;l=(k|0)==0?67:32;k=k+1|0;}while((k|0)<(d|0));m=_z(a,147496)|0;i=f;return}function xD(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0.0,j=0;d=i;_z(a,148624)|0;zD(a,0,0);_z(a,148072)|0;if((c|0)>0){e=0}else{f=_z(a,147496)|0;i=d;return}do{g=-0.0- +h[b+(e<<4)+8>>3];dA(a,147760,(j=i,i=i+16|0,h[j>>3]=+h[b+(e<<4)>>3],h[j+8>>3]=g,j)|0);i=j;e=e+1|0;}while((e|0)<(c|0));f=_z(a,147496)|0;i=d;return}function yD(a,b){a=a|0;b=b|0;_z(a,149224)|0;_z(a,gk(b)|0)|0;_z(a,148920)|0;return}function zD(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0;g=i;j=c[b+16>>2]|0;_z(b,147208)|0;do{if((e|0)==2){dA(b,146920,(k=i,i=i+8|0,c[k>>2]=f,k)|0);i=k}else if((e|0)==0){_z(b,146088)|0}else if((e|0)==3){dA(b,146680,(k=i,i=i+8|0,c[k>>2]=f,k)|0);i=k}else{l=j+56|0;m=l;n=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24|0;m=j+88|0;o=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24|0;do{if((o|0)==5){_z(b,n)|0}else if((o|0)==1){p=n;if(n>>>0<16777216>>>0){_z(b,146088)|0;break}else{dA(b,143600,(k=i,i=i+24|0,c[k>>2]=p&255,c[k+8>>2]=p>>>8&255,c[k+16>>2]=p>>>16&255,k)|0);i=k;break}}else{cc(143376,143104,83,169960)}}while(0);if((c[m>>2]|0)!=1){break}n=a[l+3|0]|0;if((n<<24>>24|0)==0|(n<<24>>24|0)==(-1|0)){break}dA(b,146408,(k=i,i=i+8|0,h[k>>3]=+((n&255)>>>0)/255.0,k)|0);i=k}}while(0);_z(b,145776)|0;f=j+16|0;e=f;n=d[e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24|0;e=j+48|0;o=d[e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24|0;do{if((o|0)==1){p=n;if(n>>>0<16777216>>>0){_z(b,146088)|0;break}else{dA(b,143600,(k=i,i=i+24|0,c[k>>2]=p&255,c[k+8>>2]=p>>>8&255,c[k+16>>2]=p>>>16&255,k)|0);i=k;break}}else if((o|0)==5){_z(b,n)|0}else{cc(143376,143104,83,169960)}}while(0);q=+h[j+152>>3];if(q!=1.0){dA(b,145368,(k=i,i=i+8|0,h[k>>3]=q,k)|0);i=k}n=c[j+144>>2]|0;if((n|0)==1){dA(b,144880,(k=i,i=i+8|0,c[k>>2]=143816,k)|0);i=k}else if((n|0)==2){dA(b,144880,(k=i,i=i+8|0,c[k>>2]=144088,k)|0);i=k}if((c[e>>2]|0)!=1){r=_z(b,144328)|0;i=g;return}e=a[f+3|0]|0;if((e<<24>>24|0)==0|(e<<24>>24|0)==(-1|0)){r=_z(b,144328)|0;i=g;return}dA(b,144616,(k=i,i=i+8|0,h[k>>3]=+((e&255)>>>0)/255.0,k)|0);i=k;r=_z(b,144328)|0;i=g;return}function AD(b,e,f){b=b|0;e=e|0;f=f|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0;j=i;i=i+32|0;k=j|0;l=c[43700]|0;c[43700]=l+1;m=c[b+16>>2]|0;n=+(c[m+136>>2]|0)*3.141592653589793/180.0;vF(k|0,0,32)|0;rn(e,k|0,f,n,0);dA(b,139320,(f=i,i=i+8|0,c[f>>2]=l,f)|0);i=f;n=+h[k+8>>3];o=+h[k+16>>3];p=+h[k+24>>3];dA(b,138784,(f=i,i=i+32|0,h[f>>3]=+h[k>>3],h[f+8>>3]=n,h[f+16>>3]=o,h[f+24>>3]=p,f)|0);i=f;k=m+140|0;p=+g[k>>2];if(p>0.0){dA(b,138496,(f=i,i=i+8|0,h[f>>3]=p+-.001,f)|0);i=f}else{_z(b,141248)|0}e=m+56|0;q=e;r=d[q]|d[q+1|0]<<8|d[q+2|0]<<16|d[q+3|0]<<24|0;q=m+88|0;s=d[q]|d[q+1|0]<<8|d[q+2|0]<<16|d[q+3|0]<<24|0;do{if((s|0)==1){t=r;if(r>>>0<16777216>>>0){_z(b,146088)|0;break}else{dA(b,143600,(f=i,i=i+24|0,c[f>>2]=t&255,c[f+8>>2]=t>>>8&255,c[f+16>>2]=t>>>16&255,f)|0);i=f;break}}else if((s|0)==5){_z(b,r)|0}else{cc(143376,143104,83,169960);return 0}}while(0);_z(b,141008)|0;do{if((c[q>>2]|0)==1){r=a[e+3|0]|0;if((r<<24>>24|0)==0|(r<<24>>24|0)==(-1|0)){u=13;break}dA(b,140760,(f=i,i=i+8|0,h[f>>3]=+((r&255)>>>0)/255.0,f)|0);i=f}else{u=13}}while(0);if((u|0)==13){_z(b,140536)|0}_z(b,140288)|0;p=+g[k>>2];if(p>0.0){dA(b,138496,(f=i,i=i+8|0,h[f>>3]=p,f)|0);i=f}else{_z(b,139976)|0}k=m+96|0;u=k;e=d[u]|d[u+1|0]<<8|d[u+2|0]<<16|d[u+3|0]<<24|0;u=m+128|0;m=d[u]|d[u+1|0]<<8|d[u+2|0]<<16|d[u+3|0]<<24|0;do{if((m|0)==1){q=e;if(e>>>0<16777216>>>0){_z(b,146088)|0;break}else{dA(b,143600,(f=i,i=i+24|0,c[f>>2]=q&255,c[f+8>>2]=q>>>8&255,c[f+16>>2]=q>>>16&255,f)|0);i=f;break}}else if((m|0)==5){_z(b,e)|0}else{cc(143376,143104,83,169960);return 0}}while(0);_z(b,141008)|0;do{if((c[u>>2]|0)==1){e=a[k+3|0]|0;if((e<<24>>24|0)==0|(e<<24>>24|0)==(-1|0)){break}dA(b,140760,(f=i,i=i+8|0,h[f>>3]=+((e&255)>>>0)/255.0,f)|0);i=f;v=_z(b,138280)|0;i=j;return l|0}}while(0);_z(b,140536)|0;v=_z(b,138280)|0;i=j;return l|0}function BD(b){b=b|0;var e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;f=c[43698]|0;c[43698]=f+1;g=c[b+16>>2]|0;j=+(c[g+136>>2]|0)*3.141592653589793/180.0;k=j;if(j==0.0){l=50;m=50}else{l=~~((+V(k)+1.0)*50.0);m=~~((1.0- +W(k))*50.0)}dA(b,141568,(n=i,i=i+24|0,c[n>>2]=f,c[n+8>>2]=l,c[n+16>>2]=m,n)|0);i=n;_z(b,141248)|0;m=g+56|0;l=m;o=d[l]|d[l+1|0]<<8|d[l+2|0]<<16|d[l+3|0]<<24|0;l=g+88|0;p=d[l]|d[l+1|0]<<8|d[l+2|0]<<16|d[l+3|0]<<24|0;do{if((p|0)==1){q=o;if(o>>>0<16777216>>>0){_z(b,146088)|0;break}else{dA(b,143600,(n=i,i=i+24|0,c[n>>2]=q&255,c[n+8>>2]=q>>>8&255,c[n+16>>2]=q>>>16&255,n)|0);i=n;break}}else if((p|0)==5){_z(b,o)|0}else{cc(143376,143104,83,169960);return 0}}while(0);_z(b,141008)|0;do{if((c[l>>2]|0)==1){o=a[m+3|0]|0;if((o<<24>>24|0)==0|(o<<24>>24|0)==(-1|0)){r=12;break}dA(b,140760,(n=i,i=i+8|0,h[n>>3]=+((o&255)>>>0)/255.0,n)|0);i=n}else{r=12}}while(0);if((r|0)==12){_z(b,140536)|0}_z(b,140288)|0;_z(b,139976)|0;r=g+96|0;m=r;l=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24|0;m=g+128|0;g=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24|0;do{if((g|0)==5){_z(b,l)|0}else if((g|0)==1){o=l;if(l>>>0<16777216>>>0){_z(b,146088)|0;break}else{dA(b,143600,(n=i,i=i+24|0,c[n>>2]=o&255,c[n+8>>2]=o>>>8&255,c[n+16>>2]=o>>>16&255,n)|0);i=n;break}}else{cc(143376,143104,83,169960);return 0}}while(0);_z(b,141008)|0;do{if((c[m>>2]|0)==1){l=a[r+3|0]|0;if((l<<24>>24|0)==0|(l<<24>>24|0)==(-1|0)){break}dA(b,140760,(n=i,i=i+8|0,h[n>>3]=+((l&255)>>>0)/255.0,n)|0);i=n;s=_z(b,139672)|0;i=e;return f|0}}while(0);_z(b,140536)|0;s=_z(b,139672)|0;i=e;return f|0}function CD(a){a=a|0;var b=0;_z(a,113040)|0;b=a+12|0;_z(a,c[c[c[b>>2]>>2]>>2]|0)|0;_z(a,112536)|0;_z(a,c[(c[c[b>>2]>>2]|0)+4>>2]|0)|0;_z(a,111984)|0;_z(a,c[(c[c[b>>2]>>2]|0)+8>>2]|0)|0;_z(a,111408)|0;return}function DD(b){b=b|0;var d=0,e=0,f=0;d=i;e=c[b+16>>2]|0;_z(b,115728)|0;f=e+8|0;if((a[$w(c[f>>2]|0)|0]|0)!=0){_z(b,114328)|0;_z(b,$w(c[f>>2]|0)|0)|0}f=da(c[b+168>>2]|0,c[b+164>>2]|0)|0;dA(b,113600,(b=i,i=i+8|0,c[b>>2]=f,b)|0);i=b;i=d;return}function ED(a){a=a|0;c[44760]=1;return}function FD(a){a=a|0;c[44760]=-1;return}function GD(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;j=e;e=i;i=i+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];j=b+16|0;k=c[j>>2]|0;if((c[k+144>>2]|0)==0){i=g;return}l=f+4|0;m=~~(+h[(c[l>>2]|0)+16>>3]*+h[b+352>>3]);if((m|0)==0){i=g;return}if((a[b+144|0]|0)==0){_z(b,141528)|0}else{_z(b,c[b+148>>2]|0)|0}_z(b,123160)|0;n=e+8|0;h[n>>3]=+h[n>>3]- +(m|0)*.55;fA(b,e);_z(b,121576)|0;_z(b,c[f>>2]|0)|0;_z(b,120744)|0;_z(b,101232)|0;e=k+16|0;n=d[e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24|0;e=k+48|0;k=d[e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24|0;do{if((k|0)==5){_z(b,n)|0}else if((k|0)==1){e=n;if(n>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(o=i,i=i+24|0,c[o>>2]=e&255,c[o+8>>2]=e>>>8&255,c[o+16>>2]=e>>>16&255,o)|0);i=o;break}}else{cc(158736,153704,51,169904)}}while(0);_z(b,119984)|0;n=c[l>>2]|0;l=c[n+8>>2]|0;k=c[((l|0)==0?n|0:l+4|0)>>2]|0;_z(b,119152)|0;_z(b,k)|0;_z(b,119152)|0;dA(b,118496,(o=i,i=i+8|0,c[o>>2]=m,o)|0);i=o;m=a[f+48|0]|0;if((m|0)==114){_z(b,116632)|0}else if((m|0)==108){_z(b,117568)|0}m=c[j>>2]|0;switch(c[m+12>>2]|0){case 1:{p=1;q=166792;r=(c[c[m+8>>2]>>2]|0)>>>4;break};case 11:case 6:case 7:{p=0;q=80504;r=(c[c[m+8>>2]>>2]|0)>>>4;break};case 8:{p=1;q=85248;r=(c[c[m+8>>2]>>2]|0)>>>4;break};case 0:{p=1;q=166792;r=-1;break};case 5:{p=0;q=166792;r=(c[c[m+8>>2]>>2]|0)>>>4;break};case 10:{p=0;q=85248;r=(c[c[m+8>>2]>>2]|0)>>>4;break};case 4:{p=0;q=162648;r=-1;break};case 9:case 2:case 3:{p=1;q=80504;r=(c[c[m+8>>2]>>2]|0)>>>4;break};default:{cc(158736,153704,108,169880)}}dA(b,150608,(o=i,i=i+24|0,c[o>>2]=p,c[o+8>>2]=q,c[o+16>>2]=r,o)|0);i=o;_z(b,113632)|0;i=g;return}function HD(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0;g=i;j=b+16|0;k=c[j>>2]|0;l=k+144|0;if((c[l>>2]|0)==0){i=g;return}m=e|0;n=+h[m>>3];o=e+8|0;p=+h[o>>3];q=+h[e+24>>3]-p;h[m>>3]=n-(+h[e+16>>3]-n);h[o>>3]=p-q;if((a[b+144|0]|0)==0){_z(b,141528)|0}else{_z(b,c[b+148>>2]|0)|0}_z(b,125560)|0;gA(b,e,2);_z(b,101232)|0;do{if((f|0)==0){if((c[44760]|0)==0){_z(b,147720)|0;break}else{_z(b,131088)|0;break}}else{e=k+56|0;o=d[e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24|0;e=k+88|0;m=d[e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24|0;if((m|0)==1){e=o;if(o>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(r=i,i=i+24|0,c[r>>2]=e&255,c[r+8>>2]=e>>>8&255,c[r+16>>2]=e>>>16&255,r)|0);i=r;break}}else if((m|0)==5){_z(b,o)|0;break}else{cc(158736,153704,51,169904)}}}while(0);if((c[44760]|0)==1){c[44760]=0}_z(b,138464)|0;eA(b,+h[k+152>>3]);_z(b,128648)|0;f=k+16|0;o=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=k+48|0;k=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;do{if((k|0)==1){f=o;if(o>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(r=i,i=i+24|0,c[r>>2]=f&255,c[r+8>>2]=f>>>8&255,c[r+16>>2]=f>>>16&255,r)|0);i=r;break}}else if((k|0)==5){_z(b,o)|0}else{cc(158736,153704,51,169904)}}while(0);o=c[l>>2]|0;if((o|0)==1){_z(b,95704)|0;s=c[l>>2]|0}else{s=o}if((s|0)==2){_z(b,90464)|0}s=c[j>>2]|0;switch(c[s+12>>2]|0){case 5:{t=0;u=166792;v=(c[c[s+8>>2]>>2]|0)>>>4;break};case 8:{t=1;u=85248;v=(c[c[s+8>>2]>>2]|0)>>>4;break};case 9:case 2:case 3:{t=1;u=80504;v=(c[c[s+8>>2]>>2]|0)>>>4;break};case 11:case 6:case 7:{t=0;u=80504;v=(c[c[s+8>>2]>>2]|0)>>>4;break};case 0:{t=1;u=166792;v=-1;break};case 4:{t=0;u=162648;v=-1;break};case 1:{t=1;u=166792;v=(c[c[s+8>>2]>>2]|0)>>>4;break};case 10:{t=0;u=85248;v=(c[c[s+8>>2]>>2]|0)>>>4;break};default:{cc(158736,153704,108,169880)}}dA(b,150608,(r=i,i=i+24|0,c[r>>2]=t,c[r+8>>2]=u,c[r+16>>2]=v,r)|0);i=r;_z(b,113632)|0;i=g;return}function ID(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;j=i;k=b+16|0;l=c[k>>2]|0;m=l+144|0;if((c[m>>2]|0)==0){i=j;return}if((a[b+144|0]|0)==0){_z(b,141528)|0}else{_z(b,c[b+148>>2]|0)|0}_z(b,133296)|0;gA(b,e,f);_z(b,101232)|0;do{if((g|0)==0){if((c[44760]|0)==0){_z(b,147720)|0;break}else{_z(b,131088)|0;break}}else{f=l+56|0;e=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=l+88|0;n=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;if((n|0)==1){f=e;if(e>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(o=i,i=i+24|0,c[o>>2]=f&255,c[o+8>>2]=f>>>8&255,c[o+16>>2]=f>>>16&255,o)|0);i=o;break}}else if((n|0)==5){_z(b,e)|0;break}else{cc(158736,153704,51,169904)}}}while(0);if((c[44760]|0)==1){c[44760]=0}_z(b,138464)|0;eA(b,+h[l+152>>3]);_z(b,128648)|0;g=l+16|0;e=d[g]|d[g+1|0]<<8|d[g+2|0]<<16|d[g+3|0]<<24|0;g=l+48|0;l=d[g]|d[g+1|0]<<8|d[g+2|0]<<16|d[g+3|0]<<24|0;do{if((l|0)==1){g=e;if(e>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(o=i,i=i+24|0,c[o>>2]=g&255,c[o+8>>2]=g>>>8&255,c[o+16>>2]=g>>>16&255,o)|0);i=o;break}}else if((l|0)==5){_z(b,e)|0}else{cc(158736,153704,51,169904)}}while(0);e=c[m>>2]|0;if((e|0)==1){_z(b,95704)|0;p=c[m>>2]|0}else{p=e}if((p|0)==2){_z(b,90464)|0}p=c[k>>2]|0;switch(c[p+12>>2]|0){case 4:{q=0;r=162648;s=-1;break};case 0:{q=1;r=166792;s=-1;break};case 10:{q=0;r=85248;s=(c[c[p+8>>2]>>2]|0)>>>4;break};case 9:case 2:case 3:{q=1;r=80504;s=(c[c[p+8>>2]>>2]|0)>>>4;break};case 5:{q=0;r=166792;s=(c[c[p+8>>2]>>2]|0)>>>4;break};case 1:{q=1;r=166792;s=(c[c[p+8>>2]>>2]|0)>>>4;break};case 11:case 6:case 7:{q=0;r=80504;s=(c[c[p+8>>2]>>2]|0)>>>4;break};case 8:{q=1;r=85248;s=(c[c[p+8>>2]>>2]|0)>>>4;break};default:{cc(158736,153704,108,169880)}}dA(b,150608,(o=i,i=i+24|0,c[o>>2]=q,c[o+8>>2]=r,c[o+16>>2]=s,o)|0);i=o;_z(b,113632)|0;i=j;return}function JD(b,e,f,g,j,k){b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;j=b+16|0;g=c[j>>2]|0;l=g+144|0;if((c[l>>2]|0)==0){i=k;return}if((a[b+144|0]|0)==0){_z(b,141528)|0}else{_z(b,c[b+148>>2]|0)|0}_z(b,106864)|0;gA(b,e,f);_z(b,101232)|0;f=g+16|0;e=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=g+48|0;m=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;do{if((m|0)==5){_z(b,e)|0}else if((m|0)==1){f=e;if(e>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(n=i,i=i+24|0,c[n>>2]=f&255,c[n+8>>2]=f>>>8&255,c[n+16>>2]=f>>>16&255,n)|0);i=n;break}}else{cc(158736,153704,51,169904)}}while(0);_z(b,138464)|0;eA(b,+h[g+152>>3]);g=c[l>>2]|0;if((g|0)==1){_z(b,95704)|0;o=c[l>>2]|0}else{o=g}if((o|0)==2){_z(b,90464)|0}_z(b,135904)|0;o=c[j>>2]|0;switch(c[o+12>>2]|0){case 10:{p=0;q=85248;r=(c[c[o+8>>2]>>2]|0)>>>4;break};case 9:case 2:case 3:{p=1;q=80504;r=(c[c[o+8>>2]>>2]|0)>>>4;break};case 5:{p=0;q=166792;r=(c[c[o+8>>2]>>2]|0)>>>4;break};case 1:{p=1;q=166792;r=(c[c[o+8>>2]>>2]|0)>>>4;break};case 0:{p=1;q=166792;r=-1;break};case 11:case 6:case 7:{p=0;q=80504;r=(c[c[o+8>>2]>>2]|0)>>>4;break};case 8:{p=1;q=85248;r=(c[c[o+8>>2]>>2]|0)>>>4;break};case 4:{p=0;q=162648;r=-1;break};default:{cc(158736,153704,108,169880)}}dA(b,150608,(n=i,i=i+24|0,c[n>>2]=p,c[n+8>>2]=q,c[n+16>>2]=r,n)|0);i=n;_z(b,113632)|0;i=k;return}function KD(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;h=b+16|0;j=c[h>>2]|0;k=j+144|0;if((c[k>>2]|0)==0){i=g;return}if((a[b+144|0]|0)==0){_z(b,141528)|0}else{_z(b,c[b+148>>2]|0)|0}_z(b,106864)|0;gA(b,e,f);_z(b,101232)|0;f=j+16|0;e=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=j+48|0;j=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;do{if((j|0)==5){_z(b,e)|0}else if((j|0)==1){f=e;if(e>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(l=i,i=i+24|0,c[l>>2]=f&255,c[l+8>>2]=f>>>8&255,c[l+16>>2]=f>>>16&255,l)|0);i=l;break}}else{cc(158736,153704,51,169904)}}while(0);e=c[k>>2]|0;if((e|0)==1){_z(b,95704)|0;m=c[k>>2]|0}else{m=e}if((m|0)==2){_z(b,90464)|0}m=c[h>>2]|0;switch(c[m+12>>2]|0){case 9:case 2:case 3:{n=1;o=80504;p=(c[c[m+8>>2]>>2]|0)>>>4;break};case 11:case 6:case 7:{n=0;o=80504;p=(c[c[m+8>>2]>>2]|0)>>>4;break};case 4:{n=0;o=162648;p=-1;break};case 8:{n=1;o=85248;p=(c[c[m+8>>2]>>2]|0)>>>4;break};case 0:{n=1;o=166792;p=-1;break};case 10:{n=0;o=85248;p=(c[c[m+8>>2]>>2]|0)>>>4;break};case 5:{n=0;o=166792;p=(c[c[m+8>>2]>>2]|0)>>>4;break};case 1:{n=1;o=166792;p=(c[c[m+8>>2]>>2]|0)>>>4;break};default:{cc(158736,153704,108,169880)}}dA(b,150608,(l=i,i=i+24|0,c[l>>2]=n,c[l+8>>2]=o,c[l+16>>2]=p,l)|0);i=l;_z(b,113632)|0;i=g;return}function LD(a,b){a=a|0;b=b|0;_z(a,123360)|0;_z(a,b)|0;_z(a,113632)|0;return}function MD(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;d=i;i=i+16|0;e=d|0;f=c[44698]|0;if((f|0)==0){c[44696]=64;g=kk(64)|0;c[44698]=g;h=g}else{h=f}if((b|0)==0){j=h;a[j]=0;k=c[44698]|0;i=d;return k|0}f=e+15|0;g=e+14|0;e=h;h=0;l=0;m=b;b=0;n=0;a:while(1){b:do{if((h|0)==0){p=e;q=m;r=b;s=n;while(1){t=a[q]|0;if(t<<24>>24==0){j=p;u=67;break a}v=c[44696]|0;if((l|0)>(v-8|0)){w=v<<1;c[44696]=w;v=mk(c[44698]|0,w)|0;c[44698]=v;x=v+l|0;y=a[q]|0}else{x=p;y=t}if((y<<24>>24|0)==62){z=x;A=q;B=122560;C=4;D=r;E=s;u=62;break b}else if((y<<24>>24|0)==38){t=a[q+1|0]|0;c:do{if(t<<24>>24==35){v=a[q+2|0]|0;if((v<<24>>24|0)==120|(v<<24>>24|0)==88){w=q+3|0;while(1){F=a[w]|0;if((F-48&255)>>>0<10>>>0|(F-97&255)>>>0<6>>>0|(F-65&255)>>>0<6>>>0){w=w+1|0}else{G=F;break c}}}if((v-48&255)>>>0>=10>>>0){G=v;break}w=q+3|0;while(1){F=a[w]|0;if((F-48&255)>>>0<10>>>0){w=w+1|0}else{G=F;break}}}else{if(!((t-97&255)>>>0<26>>>0|(t-65&255)>>>0<26>>>0)){G=t;break}w=q+2|0;while(1){v=a[w]|0;if((v-97&255)>>>0<26>>>0|(v-65&255)>>>0<26>>>0){w=w+1|0}else{G=v;break}}}}while(0);if(G<<24>>24!=59){H=5;I=105552;J=q;K=r;L=s;M=x;u=60;break b}if((y<<24>>24|0)==62){z=x;A=q;B=122560;C=4;D=r;E=s;u=62;break b}else if((y<<24>>24|0)==45){N=q;O=r;P=s;Q=x;u=47;break b}else if((y<<24>>24|0)==60){H=4;I=149904;J=q;K=r;L=s;M=x;u=60;break b}}else if((y<<24>>24|0)==45){N=q;O=r;P=s;Q=x;u=47;break b}else if((y<<24>>24|0)==60){H=4;I=149904;J=q;K=r;L=s;M=x;u=60;break b}if((y<<24>>24|0)==39){z=x;A=q;B=95432;C=5;D=r;E=s;u=62;break b}else if((y<<24>>24|0)==34){H=6;I=101104;J=q;K=r;L=s;M=x;u=60;break b}if(y<<24>>24>=0){H=1;I=q;J=q;K=r;L=s;M=x;u=60;break b}t=0;w=127;v=y&255;while(1){R=t+1|0;S=v&w;F=w>>>1;if(F>>>0<S>>>0){t=R;w=F;v=S}else{break}}if((t|0)>0){T=S;U=R}else{T=S+(s<<6)|0;U=r}v=U-1|0;if((v|0)<=0){V=q;W=x;X=T;Y=v;u=56;break b}p=x;q=q+1|0;r=v;s=T}}else{s=e;r=m;q=b;p=n;d:while(1){v=a[r]|0;if(v<<24>>24==0){j=s;u=67;break a}w=c[44696]|0;if((l|0)>(w-8|0)){F=w<<1;c[44696]=F;w=mk(c[44698]|0,F)|0;c[44698]=w;Z=w+l|0;_=a[r]|0}else{Z=s;_=v}switch(_<<24>>24){case 62:{z=Z;A=r;B=122560;C=4;D=q;E=p;u=62;break b;break};case 45:{N=r;O=q;P=p;Q=Z;u=47;break b;break};case 38:{v=a[r+1|0]|0;e:do{if(v<<24>>24==35){w=a[r+2|0]|0;if((w<<24>>24|0)==120|(w<<24>>24|0)==88){F=r+3|0;while(1){$=a[F]|0;if(($-48&255)>>>0<10>>>0|($-97&255)>>>0<6>>>0|($-65&255)>>>0<6>>>0){F=F+1|0}else{aa=$;break e}}}if((w-48&255)>>>0>=10>>>0){aa=w;break}F=r+3|0;while(1){$=a[F]|0;if(($-48&255)>>>0<10>>>0){F=F+1|0}else{aa=$;break}}}else{if(!((v-97&255)>>>0<26>>>0|(v-65&255)>>>0<26>>>0)){aa=v;break}F=r+2|0;while(1){w=a[F]|0;if((w-97&255)>>>0<26>>>0|(w-65&255)>>>0<26>>>0){F=F+1|0}else{aa=w;break}}}}while(0);if(aa<<24>>24!=59){H=5;I=105552;J=r;K=q;L=p;M=Z;u=60;break b}if((_<<24>>24|0)==62){z=Z;A=r;B=122560;C=4;D=q;E=p;u=62;break b}else if((_<<24>>24|0)==45){N=r;O=q;P=p;Q=Z;u=47;break b}else if((_<<24>>24|0)==60){H=4;I=149904;J=r;K=q;L=p;M=Z;u=60;break b}else if((_<<24>>24|0)==32){break d}break};case 60:{H=4;I=149904;J=r;K=q;L=p;M=Z;u=60;break b;break};case 32:{break d;break};default:{}}if((_<<24>>24|0)==39){z=Z;A=r;B=95432;C=5;D=q;E=p;u=62;break b}else if((_<<24>>24|0)==34){H=6;I=101104;J=r;K=q;L=p;M=Z;u=60;break b}if(_<<24>>24>=0){H=1;I=r;J=r;K=q;L=p;M=Z;u=60;break b}v=0;t=127;F=_&255;while(1){ba=v+1|0;ca=F&t;w=t>>>1;if(w>>>0<ca>>>0){v=ba;t=w;F=ca}else{break}}if((v|0)>0){da=ca;ea=ba}else{da=ca+(p<<6)|0;ea=q}F=ea-1|0;if((F|0)<=0){V=r;W=Z;X=da;Y=F;u=56;break b}s=Z;r=r+1|0;q=F;p=da}s=(a[h]|0)==32;H=s?6:1;I=s?106736:r;J=r;K=q;L=p;M=Z;u=60}}while(0);if((u|0)==47){u=0;z=Q;A=N;B=113480;C=5;D=O;E=P;u=62}else if((u|0)==56){u=0;a[f]=59;s=X;F=3;t=g;while(1){fa=t-1|0;a[t]=(s>>>0)%10|0|48;ga=(s>>>0)/10|0;ha=F+1|0;if((F|0)>11){u=58;break a}if(s>>>0>9>>>0){s=ga;F=ha;t=fa}else{break}}F=t-2|0;a[fa]=35;a[F]=38;if((ha|0)==0){ia=W;ja=l;ka=V;la=Y;ma=ga}else{z=W;A=V;B=F;C=ha;D=Y;E=ga;u=62}}else if((u|0)==60){u=0;z=M;A=J;B=I;C=H;D=K;E=L;u=62}if((u|0)==62){u=0;F=C+l|0;s=z;w=B;$=C;while(1){na=$-1|0;a[s]=a[w]|0;if((na|0)==0){break}s=s+1|0;w=w+1|0;$=na}ia=z+C|0;ja=F;ka=A;la=D;ma=E}e=ia;h=ka;l=ja;m=ka+1|0;b=la;n=ma}if((u|0)==58){Ma(90208,46,1,c[o>>2]|0)|0;mb(1);return 0}else if((u|0)==67){a[j]=0;k=c[44698]|0;i=d;return k|0}return 0}function ND(a){a=a|0;var b=0;_z(a,152832)|0;_z(a,152536)|0;b=a+12|0;_z(a,MD(c[c[c[b>>2]>>2]>>2]|0)|0)|0;_z(a,152296)|0;_z(a,MD(c[(c[c[b>>2]>>2]|0)+4>>2]|0)|0)|0;_z(a,151992)|0;_z(a,MD(c[(c[c[b>>2]>>2]|0)+8>>2]|0)|0)|0;_z(a,151680)|0;return}function OD(b){b=b|0;var d=0,e=0,f=0;d=i;e=c[b+16>>2]|0;c[44746]=~~(+h[b+232>>3]- +h[b+216>>3]);c[44742]=~~(+h[b+224>>3]- +h[b+208>>3]);_z(b,80072)|0;_z(b,79648)|0;f=$w(c[e+8>>2]|0)|0;if((a[f]|0)!=0){_z(b,79296)|0;_z(b,MD(f)|0)|0;_z(b,79024)|0}f=da(c[b+168>>2]|0,c[b+164>>2]|0)|0;dA(b,78744,(e=i,i=i+8|0,c[e>>2]=f,e)|0);i=e;_z(b,168704)|0;_z(b,168328)|0;_z(b,167920)|0;_z(b,167168)|0;_z(b,166728)|0;_z(b,166328)|0;_z(b,165944)|0;_z(b,165624)|0;_z(b,165320)|0;_z(b,164952)|0;_z(b,164584)|0;_z(b,164200)|0;_z(b,163744)|0;_z(b,162960)|0;_z(b,162576)|0;_z(b,162264)|0;_z(b,161896)|0;_z(b,161592)|0;_z(b,161248)|0;_z(b,160920)|0;_z(b,160600)|0;_z(b,162264)|0;_z(b,160208)|0;_z(b,161592)|0;_z(b,161248)|0;_z(b,159720)|0;_z(b,162960)|0;_z(b,162576)|0;_z(b,162264)|0;_z(b,160208)|0;_z(b,161592)|0;_z(b,161248)|0;_z(b,160920)|0;_z(b,160600)|0;_z(b,162264)|0;_z(b,161896)|0;_z(b,161592)|0;_z(b,161248)|0;_z(b,158952)|0;_z(b,158696)|0;_z(b,158352)|0;_z(b,158064)|0;_z(b,157728)|0;_z(b,157128)|0;f=(c[44746]|0)+10|0;dA(b,156816,(e=i,i=i+16|0,c[e>>2]=c[44742],c[e+8>>2]=f,e)|0);i=e;_z(b,156496)|0;_z(b,155096)|0;_z(b,154704)|0;_z(b,153936)|0;_z(b,153632)|0;f=c[44746]|0;dA(b,153336,(e=i,i=i+16|0,c[e>>2]=c[44742],c[e+8>>2]=f,e)|0);i=e;f=c[44746]|0;dA(b,153048,(e=i,i=i+16|0,c[e>>2]=c[44742],c[e+8>>2]=f,e)|0);i=e;i=d;return}function PD(a){a=a|0;_z(a,84768)|0;_z(a,84376)|0;_z(a,83904)|0;_z(a,83544)|0;_z(a,84376)|0;_z(a,83120)|0;_z(a,82704)|0;_z(a,82200)|0;_z(a,84376)|0;_z(a,81632)|0;_z(a,80920)|0;_z(a,84376)|0;_z(a,80464)|0;return}function QD(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;g=i;_z(b,87568)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}h=MD(d)|0;dA(b,87040,(j=i,i=i+8|0,c[j>>2]=h,j)|0);i=j}}while(0);do{if((e|0)!=0){if((a[e]|0)==0){break}d=MD(e)|0;dA(b,86448,(j=i,i=i+8|0,c[j>>2]=d,j)|0);i=j}}while(0);if((f|0)==0){k=_z(b,85224)|0;i=g;return}if((a[f]|0)==0){k=_z(b,85224)|0;i=g;return}e=MD(f)|0;dA(b,85608,(j=i,i=i+8|0,c[j>>2]=e,j)|0);i=j;k=_z(b,85224)|0;i=g;return}function RD(a){a=a|0;_z(a,88048)|0;return}function SD(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;g=i;j=e;e=i;i=i+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];j=c[b+16>>2]|0;k=a[f+48|0]|0;if((k|0)==108){l=+h[e>>3];m=+h[f+32>>3]}else if((k|0)==114){n=+h[f+32>>3];l=+h[e>>3]-n;m=n}else{n=+h[f+32>>3];l=+h[e>>3]-n*.5;m=n}k=f+40|0;n=+h[k>>3];o=f+4|0;p=(c[o>>2]|0)+16|0;q=+h[p>>3];if(n<q){r=q*1.1+1.0;h[k>>3]=r;s=r;t=+h[p>>3]}else{s=n;t=q}q=l+-8.0;n=+((c[44746]|0)>>>0>>>0)- +h[e+8>>3];r=t/5.0;if(t<12.0){u=r+1.4}else{u=r+2.0}r=n-s+u;dA(b,94736,(e=i,i=i+1|0,i=i+7&-8,c[e>>2]=0,e)|0);i=e;dA(b,96112,(e=i,i=i+16|0,h[e>>3]=q,h[e+8>>3]=r,e)|0);i=e;dA(b,95648,(e=i,i=i+16|0,h[e>>3]=l+m+8.0-q,h[e+8>>3]=n+u-r,e)|0);i=e;_z(b,94264)|0;_z(b,93808)|0;p=c[o>>2]|0;k=c[p+8>>2]|0;do{if((k|0)==0){dA(b,93384,(e=i,i=i+8|0,c[e>>2]=c[p>>2],e)|0);i=e}else{dA(b,93384,(e=i,i=i+8|0,c[e>>2]=c[k+4>>2],e)|0);i=e;v=c[k+8>>2]|0;if((v|0)!=0){dA(b,92904,(e=i,i=i+8|0,c[e>>2]=v,e)|0);i=e}v=c[k+12>>2]|0;if((v|0)!=0){dA(b,92288,(e=i,i=i+8|0,c[e>>2]=v,e)|0);i=e}v=c[k+16>>2]|0;if((v|0)==0){break}dA(b,91720,(e=i,i=i+8|0,c[e>>2]=v,e)|0);i=e}}while(0);dA(b,90888,(e=i,i=i+8|0,h[e>>3]=+h[(c[o>>2]|0)+16>>3],e)|0);i=e;o=j+16|0;k=c[j+48>>2]|0;if((k|0)==5){j=c[o>>2]|0;if((pm(j,158656)|0)==0){w=_z(b,89320)|0;x=f|0;y=c[x>>2]|0;z=MD(y)|0;A=_z(b,z)|0;B=_z(b,88912)|0;C=_z(b,88456)|0;i=g;return}dA(b,90432,(e=i,i=i+8|0,c[e>>2]=j,e)|0);i=e;w=_z(b,89320)|0;x=f|0;y=c[x>>2]|0;z=MD(y)|0;A=_z(b,z)|0;B=_z(b,88912)|0;C=_z(b,88456)|0;i=g;return}else if((k|0)==1){k=o;j=d[k+1|0]|0;p=d[k+2|0]|0;dA(b,89832,(e=i,i=i+24|0,c[e>>2]=d[o]|0,c[e+8>>2]=j,c[e+16>>2]=p,e)|0);i=e;w=_z(b,89320)|0;x=f|0;y=c[x>>2]|0;z=MD(y)|0;A=_z(b,z)|0;B=_z(b,88912)|0;C=_z(b,88456)|0;i=g;return}else{cc(106400,105968,439,169832)}}function TD(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0;f=i;_z(a,97208)|0;g=+h[b>>3];j=+h[b+16>>3]-g;k=+h[b+8>>3];l=+h[b+24>>3]-k;m=+((c[44746]|0)>>>0>>>0)-(k+l);dA(a,96112,(b=i,i=i+16|0,h[b>>3]=g-j,h[b+8>>3]=m,b)|0);i=b;dA(a,95648,(b=i,i=i+16|0,h[b>>3]=j*2.0,h[b+8>>3]=l*2.0,b)|0);i=b;if((e|0)==0){_z(a,99360)|0;n=_z(a,105056)|0;YD(a);o=_z(a,95136)|0;i=f;return}e=c[a+16>>2]|0;_z(a,100312)|0;p=e+56|0;q=d[p]|d[p+1|0]<<8|d[p+2|0]<<16|d[p+3|0]<<24|0;p=e+88|0;e=d[p]|d[p+1|0]<<8|d[p+2|0]<<16|d[p+3|0]<<24|0;do{if((e|0)==5){_z(a,q)|0}else if((e|0)==1){p=q;if(q>>>0<16777216>>>0){_z(a,107320)|0;break}else{dA(a,106800,(b=i,i=i+24|0,c[b>>2]=p&255,c[b+8>>2]=p>>>8&255,c[b+16>>2]=p>>>16&255,b)|0);i=b;break}}else{cc(106400,105968,95,169848)}}while(0);_z(a,99776)|0;n=_z(a,105056)|0;YD(a);o=_z(a,95136)|0;i=f;return}function UD(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0;g=i;_z(a,118440)|0;j=c[44746]|0;dA(a,105448,(k=i,i=i+16|0,c[k>>2]=c[44742],c[k+8>>2]=j,k)|0);i=k;if((f|0)==0){_z(a,99360)|0}else{f=c[a+16>>2]|0;_z(a,100312)|0;j=f+56|0;l=d[j]|d[j+1|0]<<8|d[j+2|0]<<16|d[j+3|0]<<24|0;j=f+88|0;f=d[j]|d[j+1|0]<<8|d[j+2|0]<<16|d[j+3|0]<<24|0;do{if((f|0)==1){j=l;if(l>>>0<16777216>>>0){_z(a,107320)|0;break}else{dA(a,106800,(k=i,i=i+24|0,c[k>>2]=j&255,c[k+8>>2]=j>>>8&255,c[k+16>>2]=j>>>16&255,k)|0);i=k;break}}else if((f|0)==5){_z(a,l)|0}else{cc(106400,105968,95,169848)}}while(0);_z(a,99776)|0}_z(a,105056)|0;YD(a);_z(a,104616)|0;if((e|0)<=0){m=_z(a,111952)|0;i=g;return}l=e-1|0;f=0;do{n=+h[b+(f<<4)>>3];o=+((c[44746]|0)>>>0>>>0)- +h[b+(f<<4)+8>>3];if((f|0)==0){_z(a,103368)|0;dA(a,98960,(k=i,i=i+16|0,h[k>>3]=n,h[k+8>>3]=o,k)|0);i=k;_z(a,98544)|0}else{dA(a,98960,(k=i,i=i+16|0,h[k>>3]=n,h[k+8>>3]=o,k)|0);i=k}if((f|0)==(l|0)){_z(a,97832)|0}f=f+1|0;}while((f|0)<(e|0));m=_z(a,111952)|0;i=g;return}function VD(a,b,e,f,g,j){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0;g=i;_z(a,118440)|0;f=c[44746]|0;dA(a,105448,(k=i,i=i+16|0,c[k>>2]=c[44742],c[k+8>>2]=f,k)|0);i=k;if((j|0)==0){_z(a,99360)|0}else{j=c[a+16>>2]|0;_z(a,100312)|0;f=j+56|0;l=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=j+88|0;j=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;do{if((j|0)==1){f=l;if(l>>>0<16777216>>>0){_z(a,107320)|0;break}else{dA(a,106800,(k=i,i=i+24|0,c[k>>2]=f&255,c[k+8>>2]=f>>>8&255,c[k+16>>2]=f>>>16&255,k)|0);i=k;break}}else if((j|0)==5){_z(a,l)|0}else{cc(106400,105968,95,169848)}}while(0);_z(a,99776)|0}_z(a,105056)|0;YD(a);_z(a,104616)|0;if((e|0)>0){m=0;n=103368}else{o=_z(a,100744)|0;p=_z(a,104128)|0;i=g;return}do{q=+h[b+(m<<4)>>3];r=+((c[44746]|0)>>>0>>>0)- +h[b+(m<<4)+8>>3];dA(a,102816,(k=i,i=i+24|0,c[k>>2]=n,h[k+8>>3]=q,h[k+16>>3]=r,k)|0);i=k;n=(m|0)==0?101736:213360;m=m+1|0;}while((m|0)<(e|0));o=_z(a,100744)|0;p=_z(a,104128)|0;i=g;return}function WD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0;e=i;_z(a,118440)|0;f=c[44746]|0;dA(a,117512,(g=i,i=i+16|0,c[g>>2]=c[44742],c[g+8>>2]=f,g)|0);i=g;_z(a,116472)|0;if((d|0)<=0){j=_z(a,112512)|0;YD(a);k=_z(a,111952)|0;i=e;return}f=d-1|0;l=0;do{if((l|0)==0){_z(a,115672)|0;m=+((c[44746]|0)>>>0>>>0)- +h[b+8>>3];dA(a,114272,(g=i,i=i+16|0,h[g>>3]=+h[b>>3],h[g+8>>3]=m,g)|0);i=g;_z(a,113576)|0}else{m=+((c[44746]|0)>>>0>>>0)- +h[b+(l<<4)+8>>3];dA(a,114272,(g=i,i=i+16|0,h[g>>3]=+h[b+(l<<4)>>3],h[g+8>>3]=m,g)|0);i=g}if((l|0)==(f|0)){_z(a,113016)|0}l=l+1|0;}while((l|0)<(d|0));j=_z(a,112512)|0;YD(a);k=_z(a,111952)|0;i=e;return}function XD(a,b){a=a|0;b=b|0;_z(a,119952)|0;_z(a,MD(b)|0)|0;_z(a,119128)|0;return}function YD(a){a=a|0;var b=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0;b=i;e=c[a+16>>2]|0;_z(a,111360)|0;f=e+16|0;g=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=e+48|0;j=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;do{if((j|0)==5){_z(a,g)|0}else if((j|0)==1){f=g;if(g>>>0<16777216>>>0){_z(a,107320)|0;break}else{dA(a,106800,(k=i,i=i+24|0,c[k>>2]=f&255,c[k+8>>2]=f>>>8&255,c[k+16>>2]=f>>>16&255,k)|0);i=k;break}}else{cc(106400,105968,95,169848)}}while(0);l=+h[e+152>>3];if(l!=1.0){dA(a,110648,(k=i,i=i+8|0,h[k>>3]=l,k)|0);i=k}k=c[e+144>>2]|0;if((k|0)==1){_z(a,11e4)|0;m=_z(a,108488)|0;i=b;return}else if((k|0)==2){_z(a,109232)|0;m=_z(a,108488)|0;i=b;return}else{m=_z(a,108488)|0;i=b;return}}function ZD(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[a+16>>2]|0;e=c[c[a+12>>2]>>2]|0;f=c[e>>2]|0;g=c[e+4>>2]|0;h=c[e+8>>2]|0;dA(a,83056,(e=i,i=i+32|0,c[e>>2]=112680,c[e+8>>2]=f,c[e+16>>2]=g,c[e+24>>2]=h,e)|0);i=e;h=$w(c[d+8>>2]|0)|0;dA(a,82656,(e=i,i=i+16|0,c[e>>2]=112680,c[e+8>>2]=h,e)|0);i=e;dA(a,82104,(e=i,i=i+8|0,c[e>>2]=112680,e)|0);i=e;i=b;return}function _D(a){a=a|0;var b=0;b=i;dA(a,83456,(a=i,i=i+8|0,c[a>>2]=112680,a)|0);i=a;i=b;return}function $D(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;d=i;e=c[b+456>>2]|0;f=c[b+460>>2]|0;g=c[b+464>>2]|0;j=c[b+468>>2]|0;k=b+360|0;do{if(!(a[17808]|0)){l=c[k>>2]|0;if((l|0)==0|(l|0)==90){break}Fv(0,83856,(m=i,i=i+16|0,c[m>>2]=14536,c[m+8>>2]=103320,m)|0)|0;i=m;a[17808]=1}}while(0);n=(+(j|0)- +(f|0))/72.0;o=(+(g|0)- +(e|0))/72.0;e=(c[k>>2]|0)==90;p=e?n:o;q=e?o:n;dA(b,102752,(m=i,i=i+16|0,h[m>>3]=p,h[m+8>>3]=q,m)|0);i=m;dA(b,101536,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;if(p>0.0){n=+Mb(+p);r=n+(3.0- +(~~n|0))}else{r=3.0}h[21655]=r;n=+U(+10.0,+r);h[21655]=n;dA(b,101128,(m=i,i=i+16|0,h[m>>3]=n,h[m+8>>3]=n,m)|0);i=m;dA(b,100648,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,100232,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,99704,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,99304,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,98888,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,98464,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,97688,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,97056,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,96024,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,95552,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,95080,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,94592,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;dA(b,94216,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,93752,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,93272,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;dA(b,92824,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,92128,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,91584,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,90776,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;dA(b,90296,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,89736,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,89264,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,88768,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,88376,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,87920,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,87488,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;dA(b,86912,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,86304,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,85512,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,85160,(m=i,i=i+16|0,h[m>>3]=q,h[m+8>>3]=p,m)|0);i=m;dA(b,84720,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;dA(b,84248,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;i=d;return}function aE(a){a=a|0;var b=0;b=i;dA(a,104104,(a=i,i=i+1|0,i=i+7&-8,c[a>>2]=0,a)|0);i=a;i=b;return}function bE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;f=i;g=d;d=i;i=i+16|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];g=a[e+48|0]|0;if((g|0)==108){j=+h[e+32>>3];k=+h[d>>3]}else if((g|0)==114){l=+h[e+32>>3];g=d|0;m=+h[g>>3]-l;h[g>>3]=m;j=l;k=m}else{m=+h[e+32>>3];g=d|0;l=+h[g>>3]-m*.5;h[g>>3]=l;j=m;k=l}g=e+4|0;n=c[g>>2]|0;o=d+8|0;h[o>>3]=+h[n+16>>3]/216.0+ +h[o>>3];p=d|0;h[p>>3]=j/144.0+k;d=c[n>>2]|0;do{if((d|0)!=0){n=c[44108]|0;if((n|0)==0){q=25648}else{if((Ya(n|0,d|0)|0)==0){break}else{q=25648}}while(1){n=c[q+4>>2]|0;if((n|0)==0){Fv(1,147152,(r=i,i=i+16|0,c[r>>2]=14536,c[r+8>>2]=d,r)|0)|0;i=r;s=ob(d|0,45)|0;if((s|0)==0){t=144080;break}a[s]=0;q=25648;continue}else{if((Ya(n|0,d|0)|0)==0){u=11;break}q=q+8|0;continue}}if((u|0)==11){t=q|0}dA(b,162024,(r=i,i=i+8|0,c[r>>2]=t,r)|0);i=r;c[44108]=c[c[g>>2]>>2]}}while(0);if(!(a[14560]|0)){k=+h[21655];dA(b,158160,(r=i,i=i+16|0,c[r>>2]=1,h[r+8>>3]=k,r)|0);i=r;a[14560]=1}g=c[e>>2]|0;e=c[44112]|0;if((e|0)==0){c[44110]=64;t=dF(64)|0;c[44112]=t;v=t}else{v=e}e=a[g]|0;if(e<<24>>24==0){w=v;a[w]=0;x=c[44112]|0;y=+h[p>>3];z=+h[o>>3];dA(b,153160,(r=i,i=i+24|0,c[r>>2]=x,h[r+8>>3]=y,h[r+16>>3]=z,r)|0);i=r;i=f;return}else{A=0;B=v;C=g;D=e}while(1){e=C+1|0;g=c[44110]|0;if((A|0)>(g-8|0)){v=g<<1;c[44110]=v;g=gF(c[44112]|0,v)|0;c[44112]=g;E=g+A|0}else{E=B}if(D<<24>>24>-1){if(D<<24>>24==92){a[E]=92;F=E+1|0;G=A+1|0}else{F=E;G=A}a[F]=D;H=F+1|0;I=G+1|0}else{a[E]=92;nb(E+1|0,150176,(r=i,i=i+8|0,c[r>>2]=D&255,r)|0)|0;i=r;H=E+4|0;I=A+4|0}g=a[e]|0;if(g<<24>>24==0){w=H;break}else{A=I;B=H;C=e;D=g}}a[w]=0;x=c[44112]|0;y=+h[p>>3];z=+h[o>>3];dA(b,153160,(r=i,i=i+24|0,c[r>>2]=x,h[r+8>>3]=y,h[r+16>>3]=z,r)|0);i=r;i=f;return}function cE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0.0,j=0.0,k=0.0;e=i;f=+h[b>>3];g=(+h[b+16>>3]-f)*2.0/72.0;j=+h[b+8>>3];k=(+h[b+24>>3]-j)*2.0/72.0;dA(a,84448,(a=i,i=i+48|0,c[a>>2]=1,c[a+8>>2]=(d|0)!=0?79808:213480,h[a+16>>3]=g,h[a+24>>3]=k,h[a+32>>3]=f/72.0,h[a+40>>3]=j/72.0,a)|0);i=a;i=e;return}function dE(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;hE(a,b,c,1);return}function eE(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0,E=0,F=0;g=i;i=i+80|0;f=g|0;e=g+64|0;j=dF((d*140|0)+140|0)|0;k=+h[b>>3];l=f+48|0;h[l>>3]=k;m=+h[b+8>>3];n=f+56|0;h[n>>3]=m;if(k<0.0){o=k+-.5}else{o=k+.5}if(m<0.0){p=m+-.5}else{p=m+.5}q=nb(j|0,106168,(r=i,i=i+16|0,c[r>>2]=~~o,c[r+8>>2]=~~p,r)|0)|0;i=r;if((d|0)>3){s=f|0;t=f;u=l;l=e|0;v=e+8|0;w=0;x=1;y=j+q|0;q=3;while(1){c[t>>2]=c[u>>2];c[t+4>>2]=c[u+4>>2];c[t+8>>2]=c[u+8>>2];c[t+12>>2]=c[u+12>>2];z=w+1|0;h[f+16>>3]=+h[b+(z<<4)>>3];h[f+24>>3]=+h[b+(z<<4)+8>>3];z=w+2|0;h[f+32>>3]=+h[b+(z<<4)>>3];h[f+40>>3]=+h[b+(z<<4)+8>>3];z=w+3|0;h[f+48>>3]=+h[b+(z<<4)>>3];h[n>>3]=+h[b+(z<<4)+8>>3];z=1;A=y;do{Qm(e,s,3,+(z|0)/6.0,0,0);p=+h[l>>3];o=+h[v>>3];if(p<0.0){B=p+-.5}else{B=p+.5}if(o<0.0){C=o+-.5}else{C=o+.5}D=nb(A|0,106168,(r=i,i=i+16|0,c[r>>2]=~~B,c[r+8>>2]=~~C,r)|0)|0;i=r;A=A+D|0;z=z+1|0;}while((z|0)<7);z=x+6|0;D=q+3|0;if((D|0)<(d|0)){w=q;x=z;y=A;q=D}else{E=z;break}}}else{E=1}dA(a,94872,(r=i,i=i+8|0,c[r>>2]=j,r)|0);i=r;eF(j);if((E|0)<=0){F=_z(a,100464)|0;i=g;return}j=E-1|0;q=0;do{dA(a,89408,(r=i,i=i+8|0,c[r>>2]=((q|0)%(j|0)|0|0)!=0,r)|0);i=r;q=q+1|0;}while((q|0)<(E|0));F=_z(a,100464)|0;i=g;return}function fE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0;e=i;if((d|0)>0){f=0}else{g=_z(a,100464)|0;i=e;return}do{j=+h[b+(f<<4)>>3];if(j<0.0){k=j+-.5}else{k=j+.5}j=+h[b+(f<<4)+8>>3];if(j<0.0){l=j+-.5}else{l=j+.5}dA(a,106168,(m=i,i=i+16|0,c[m>>2]=~~k,c[m+8>>2]=~~l,m)|0);i=m;f=f+1|0;}while((f|0)<(d|0));g=_z(a,100464)|0;i=e;return}function gE(a,b){a=a|0;b=b|0;var d=0;d=i;dA(a,121064,(a=i,i=i+16|0,c[a>>2]=112680,c[a+8>>2]=b,a)|0);i=a;i=d;return}function hE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0;f=i;if((d|0)>0){g=0;do{j=+h[b+(g<<4)>>3];if(j<0.0){k=j+-.5}else{k=j+.5}j=+h[b+(g<<4)+8>>3];if(j<0.0){l=j+-.5}else{l=j+.5}dA(a,106168,(m=i,i=i+16|0,c[m>>2]=~~k,c[m+8>>2]=~~l,m)|0);i=m;g=g+1|0;}while((g|0)<(d|0))}if((e|0)==0){n=_z(a,100464)|0;i=f;return}l=+h[b>>3];if(l<0.0){o=l+-.5}else{o=l+.5}l=+h[b+8>>3];if(l<0.0){p=l+-.5}else{p=l+.5}dA(a,106168,(m=i,i=i+16|0,c[m>>2]=~~o,c[m+8>>2]=~~p,m)|0);i=m;n=_z(a,100464)|0;i=f;return}function iE(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=i;b=c;c=i;i=i+32|0;tF(c,b,32)|0;i=d;return}function jE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0.0,k=0.0;e=i;f=d;d=i;i=i+32|0;tF(d,f,32)|0;f=b+8|0;b=c[f>>2]|0;dA(a,104488,(g=i,i=i+16|0,c[g>>2]=b,c[g+8>>2]=b,g)|0);i=g;j=(+h[d+16>>3]+ +h[d>>3])*.5;k=(+h[d+24>>3]+ +h[d+8>>3])*.5;dA(a,104008,(g=i,i=i+24|0,c[g>>2]=c[f>>2],h[g+8>>3]=j,h[g+16>>3]=k,g)|0);i=g;i=e;return}function kE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0;e=i;f=d;d=i;i=i+32|0;tF(d,f,32)|0;g=+h[d>>3];j=+h[d+16>>3]-g;k=+h[d+24>>3];l=k- +h[d+8>>3];m=+(~~(+h[a+232>>3]- +h[a+216>>3])>>>0>>>0)-k;dA(a,103144,(d=i,i=i+40|0,c[d>>2]=c[b+8>>2],h[d+8>>3]=j,h[d+16>>3]=l,h[d+24>>3]=g,h[d+32>>3]=m,d)|0);i=d;_z(a,102528)|0;i=e;return}function lE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0.0;f=i;i=i+64|0;g=d;d=i;i=i+32|0;tF(d,g,32)|0;g=f|0;if((a|0)==0){cc(101464,101048,216,170880)}if((b|0)==0){cc(100576,101048,217,170880)}j=b+8|0;if((c[j>>2]|0)==0){cc(100144,101048,218,170880)}if((c[b+52>>2]|0)==0){i=f;return}b=g;k=d;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=g+32|0;b=k;l=d+16|0;c[b>>2]=c[l>>2];c[b+4>>2]=c[l+4>>2];c[b+8>>2]=c[l+8>>2];c[b+12>>2]=c[l+12>>2];l=g|0;m=+h[l>>3];b=g+16|0;h[b>>3]=m;n=+h[g+40>>3];d=g+24|0;h[d>>3]=n;o=+h[k>>3];h[g+48>>3]=o;k=g+8|0;p=+h[k>>3];h[g+56>>3]=p;if(e<<24>>24==0){q=g+32|0}else{dA(a,99632,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=m,h[r+8>>3]=p,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=m,h[r+8>>3]=n,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=o,h[r+8>>3]=n,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=o,h[r+8>>3]=p,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=m,h[r+8>>3]=p,r)|0);i=r;e=c[j>>2]|0;dA(a,98824,(r=i,i=i+16|0,c[r>>2]=4,c[r+8>>2]=e,r)|0);i=r;q=g+32|0}dA(a,99632,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0);i=r;m=+h[l>>3];s=+h[k>>3];dA(a,99240,(r=i,i=i+16|0,h[r>>3]=m,h[r+8>>3]=s,r)|0);i=r;t=+h[d>>3];dA(a,99240,(r=i,i=i+16|0,h[r>>3]=+h[b>>3],h[r+8>>3]=t,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=+h[q>>3],h[r+8>>3]=n,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=o,h[r+8>>3]=p,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=m,h[r+8>>3]=s,r)|0);i=r;q=c[j>>2]|0;dA(a,98400,(r=i,i=i+16|0,c[r>>2]=4,c[r+8>>2]=q,r)|0);i=r;i=f;return}function mE(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0;f=i;i=i+80|0;g=e;e=i;i=i+32|0;tF(e,g,32)|0;g=f|0;if((b|0)==0){cc(101464,101048,157,170904)}if((d|0)==0){cc(100576,101048,158,170904)}if((c[d+8>>2]|0)==0){cc(100144,101048,159,170904)}j=d+52|0;do{if((c[j>>2]|0)==0){k=10}else{l=d+60|0;m=c[l>>2]|0;if((m|0)==156){break}Cc[m&255](d);c[j>>2]=0;c[l>>2]=0;c[d+56>>2]=0;k=10}}while(0);do{if((k|0)==10){if((CB(d)|0)<<24>>24==0){i=f;return}l=Ta(c[d+20>>2]|0)|0;if(((c[d+24>>2]|0)-6|0)>>>0<2>>>0){Xb(l|0,g|0)|0;m=c[g+36>>2]|0;c[d+56>>2]=m;n=dF(m)|0;c[j>>2]=n;Ra(l|0,n|0,m|0)|0;a[d+16|0]=1}if((c[j>>2]|0)!=0){c[d+60>>2]=156}DB(d);if((c[j>>2]|0)!=0){break}i=f;return}}while(0);o=+h[e+8>>3]- +(c[d+36>>2]|0);dA(b,97560,(j=i,i=i+16|0,h[j>>3]=+h[e>>3]- +(c[d+32>>2]|0),h[j+8>>3]=o,j)|0);i=j;if((a[d+16|0]|0)==0){dA(b,96824,(j=i,i=i+8|0,c[j>>2]=c[d+12>>2],j)|0);i=j}else{bl(b,d)}dA(b,95920,(j=i,i=i+1|0,i=i+7&-8,c[j>>2]=0,j)|0);i=j;i=f;return}function nE(a){a=a|0;eF(c[a+52>>2]|0);return}function oE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=i;f=d;d=i;i=i+32|0;tF(d,f,32)|0;if((a|0)==0){cc(101464,101048,125,170832)}f=c[a+16>>2]|0;if((f|0)==0){cc(95392,101048,127,170832)}if((b|0)==0){cc(100576,101048,128,170832)}d=b+8|0;if((c[d>>2]|0)==0){cc(100144,101048,129,170832)}if((c[f+8>>2]|0)==0){cc(95008,101048,132,170832)}else{dA(a,94528,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,94136,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,93664,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,93192,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,92744,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,92048,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,91416,(f=i,i=i+8|0,c[f>>2]=c[d>>2],f)|0);i=f;dA(a,90696,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,90096,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;i=e;return}}function pE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0.0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0;e=i;f=d;d=i;i=i+32|0;tF(d,f,32)|0;if((a|0)==0){cc(101464,101048,101,170928)}if((b|0)==0){cc(100576,101048,102,170928)}f=c[b+8>>2]|0;if((f|0)==0){cc(100144,101048,103,170928)}g=+h[d>>3];if(g<0.0){j=g+-.5}else{j=g+.5}b=~~j;j=+h[d+8>>3];if(j<0.0){k=j+-.5}else{k=j+.5}l=~~k;k=+h[d+16>>3];if(k<0.0){m=k+-.5}else{m=k+.5}n=~~m;m=+h[d+24>>3];if(m<0.0){o=m+-.5}else{o=m+.5}d=~~o;dA(a,89608,(p=i,i=i+144|0,c[p>>2]=2,c[p+8>>2]=5,c[p+16>>2]=0,c[p+24>>2]=0,c[p+32>>2]=0,c[p+40>>2]=-1,c[p+48>>2]=1,c[p+56>>2]=-1,c[p+64>>2]=0,h[p+72>>3]=0.0,c[p+80>>2]=0,c[p+88>>2]=0,c[p+96>>2]=0,c[p+104>>2]=0,c[p+112>>2]=0,c[p+120>>2]=5,c[p+128>>2]=0,c[p+136>>2]=f,p)|0);i=p;dA(a,89184,(p=i,i=i+80|0,c[p>>2]=b,c[p+8>>2]=l,c[p+16>>2]=b,c[p+24>>2]=d,c[p+32>>2]=n,c[p+40>>2]=d,c[p+48>>2]=n,c[p+56>>2]=l,c[p+64>>2]=b,c[p+72>>2]=l,p)|0);i=p;i=e;return}function qE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0;e=i;f=d;d=i;i=i+32|0;tF(d,f,32)|0;g=+h[d+16>>3];j=+h[d>>3];k=(g-j)*72.0/96.0;l=+h[d+24>>3];m=+h[d+8>>3];n=(l-m)*72.0/96.0;o=(g+j-k)*.5;if((a|0)==0){cc(101464,101048,57,170856)}if((b|0)==0){cc(100576,101048,58,170856)}d=b+8|0;if((c[d>>2]|0)==0){cc(100144,101048,59,170856)}_z(a,88712)|0;_z(a,c[d>>2]|0)|0;d=a+360|0;j=-0.0-(l+m+n)*.5;if((c[d>>2]|0)==0){dA(a,87376,(p=i,i=i+32|0,h[p>>3]=k,h[p+8>>3]=n,h[p+16>>3]=o,h[p+24>>3]=j,p)|0);i=p;q=_z(a,86816)|0;i=e;return}else{dA(a,88248,(p=i,i=i+32|0,h[p>>3]=n,h[p+8>>3]=k,h[p+16>>3]=o,h[p+24>>3]=j,p)|0);i=p;dA(a,87832,(p=i,i=i+24|0,c[p>>2]=c[d>>2],h[p+8>>3]=o,h[p+16>>3]=j,p)|0);i=p;q=_z(a,86816)|0;i=e;return}}function rE(a){a=a|0;c[53566]=1;xt(a);c[53566]=0;return}function sE(a){a=a|0;c[53566]=2;xt(a);c[53566]=0;return}function tE(a){a=a|0;var b=0;if((zE(a)|0)!=0){b=1;return b|0}b=(uE(a)|0)!=0|0;return b|0}function uE(a){a=a|0;var b=0;if(a>>>0<131072>>>0){b=(d[3432+((d[3432+(a>>>8)|0]|0)<<5|a>>>3&31)|0]|0)>>>((a&7)>>>0)&1;return b|0}else{b=a>>>0<196606>>>0|0;return b|0}return 0}function vE(a){a=a|0;return Wa(a|0)|0}function wE(a){a=a|0;var b=0;if(a>>>0<32>>>0|(a-127|0)>>>0<33>>>0|(a-8232|0)>>>0<2>>>0){b=1;return b|0}b=(a-65529|0)>>>0<3>>>0|0;return b|0}function xE(a,b){a=a|0;b=b|0;var c=0;switch(b|0){case 6:{c=AE(a)|0;break};case 1:{c=tE(a)|0;break};case 8:{c=CE(a)|0;break};case 2:{c=uE(a)|0;break};case 4:{c=wE(a)|0;break};case 11:{c=FE(a)|0;break};case 12:{c=GE(a)|0;break};case 3:{c=vE(a)|0;break};case 10:{c=EE(a)|0;break};case 5:{c=zE(a)|0;break};case 9:{c=DE(a)|0;break};case 7:{c=BE(a)|0;break};default:{c=0}}return c|0}function yE(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=a[b]|0;d=1;e=336;f=97;while(1){if(c<<24>>24==f<<24>>24){if((Ya(b|0,e|0)|0)==0){g=d;h=5;break}}i=e+6|0;j=a[i]|0;if(j<<24>>24==0){g=0;h=5;break}else{d=d+1|0;e=i;f=j}}if((h|0)==5){return g|0}return 0}function zE(a){a=a|0;return(a-48|0)>>>0<10>>>0|0}function AE(a){a=a|0;var b=0;if((EE(a)|0)!=0){b=0;return b|0}b=(CE(a)|0)!=0|0;return b|0}function BE(a){a=a|0;var b=0;if((HE(a)|0)!=(a|0)){b=1;return b|0}b=(a|0)==223|0;return b|0}function CE(a){a=a|0;var b=0;if(a>>>0<255>>>0){b=(a+1&127)>>>0>32>>>0|0;return b|0}if(a>>>0<8232>>>0|(a-8234|0)>>>0<47062>>>0|(a-57344|0)>>>0<8185>>>0){b=1;return b|0}else{return((a-65532|0)>>>0>1048579>>>0|(a&65534|0)==65534)&1^1|0}return 0}function DE(a){a=a|0;var b=0;if(a>>>0>=131072>>>0){b=0;return b|0}b=(d[6408+((d[6408+(a>>>8)|0]|0)<<5|a>>>3&31)|0]|0)>>>((a&7)>>>0)&1;return b|0}function EE(a){a=a|0;return(bF(20968,a)|0)!=0|0}function FE(a){a=a|0;return(JE(a)|0)!=(a|0)|0}function GE(a){a=a|0;var b=0;if((a-48|0)>>>0<10>>>0){b=1;return b|0}b=((a|32)-97|0)>>>0<6>>>0|0;return b|0}function HE(a){a=a|0;return IE(a,0)|0}function IE(c,f){c=c|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=(f<<1)-1|0;h=f-1|0;if((uE(c)|0)==0|(c-1536|0)>>>0<2560>>>0|(c-11776|0)>>>0<30784>>>0|(c-43008|0)>>>0<22272>>>0){i=c;return i|0}do{if((f|0)==0){if((c-11520|0)>>>0>=38>>>0){j=0;break}i=c-7264|0;return i|0}else{if((c-4256|0)>>>0>=46>>>0){j=0;break}do{if((c|0)>4293){if((c|0)==4301|(c|0)==4295){break}else{i=c}return i|0}}while(0);i=c+7264|0;return i|0}}while(0);while(1){k=a[71074+(j<<2)|0]|0;l=k<<24>>24;m=c-(e[71072+(j<<2)>>1]|0)|0;n=j+1|0;if((m-(l&h)|0)>>>0<(d[71075+(j<<2)|0]|0)>>>0){o=12;break}if((n|0)==61){break}else{j=n}}if((o|0)==12){if(k<<24>>24==1){i=f+c-(m&1)|0;return i|0}else{i=(da(l,g)|0)+c|0;return i|0}}g=1-f|0;l=b[14808+(g<<1)>>1]|0;a:do{if(l<<16>>16!=0){m=0;k=l;while(1){o=m+1|0;if((k&65535|0)==(c|0)){break}j=b[14808+(o<<2)+(g<<1)>>1]|0;if(j<<16>>16==0){break a}else{m=o;k=j}}i=e[14808+(m<<2)+(f<<1)>>1]|0;return i|0}}while(0);if((c-66600+(f*40|0)|0)>>>0>=40>>>0){i=c;return i|0}i=c-40+(f*80|0)|0;return i|0}function JE(a){a=a|0;return IE(a,1)|0}function KE(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+8|0;h=g|0;c[h>>2]=b;if((e|0)==0){j=0;i=g;return j|0}do{if((f|0)!=0){if((b|0)==0){k=h;c[h>>2]=k;l=k}else{l=b}k=a[e]|0;m=k&255;if(k<<24>>24>-1){c[l>>2]=m;j=k<<24>>24!=0|0;i=g;return j|0}k=m-194|0;if(k>>>0>50>>>0){break}m=e+1|0;n=c[r+(k<<2)>>2]|0;if(f>>>0<4>>>0){if((n&-2147483648>>>(((f*6|0)-6|0)>>>0)|0)!=0){break}}k=d[m]|0;m=k>>>3;if((m-16|m+(n>>26))>>>0>7>>>0){break}m=k-128|n<<6;if((m|0)>=0){c[l>>2]=m;j=2;i=g;return j|0}n=(d[e+2|0]|0)-128|0;if(n>>>0>63>>>0){break}k=n|m<<6;if((k|0)>=0){c[l>>2]=k;j=3;i=g;return j|0}m=(d[e+3|0]|0)-128|0;if(m>>>0>63>>>0){break}c[l>>2]=m|k<<6;j=4;i=g;return j|0}}while(0);c[(Vb()|0)>>2]=84;j=-1;i=g;return j|0}function LE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0;f=i;i=i+104|0;g=f|0;h=f+8|0;j=f+16|0;k=f+24|0;l=f+32|0;m=f+40|0;n=f+48|0;o=f+56|0;p=dF(20)|0;q=p;if((p|0)==0){r=12;i=f;return r|0}s=dF(2048)|0;c[p+16>>2]=s;if((s|0)==0){eF(p);r=12;i=f;return r|0}c[p>>2]=512;c[p+4>>2]=10240;c[p+8>>2]=128;c[p+12>>2]=0;s=_E(0,0)|0;if((s|0)==0){eF(c[p+16>>2]|0);eF(p);r=12;i=f;return r|0}vF(o|0,0,44)|0;c[o>>2]=s;c[o+4>>2]=q;c[o+12>>2]=d;c[o+36>>2]=e;d=o+28|0;c[d>>2]=-1;t=ME(o)|0;a:do{if((t|0)==0){u=o+20|0;v=c[u>>2]|0;w=v-1|0;c[b>>2]=w;x=c[o+8>>2]|0;y=c[d>>2]|0;if((y|0)>-1){if((c[o+32>>2]|0)!=0){z=2;A=0;B=0;C=0;break}}if((y|0)>(w|0)){z=6;A=0;B=0;C=0;break}w=fF(1,68)|0;D=w;if((w|0)==0){z=12;A=D;B=0;C=0;break}E=y>>>31;c[w+60>>2]=E^1;c[w+64>>2]=c[o+32>>2];c[w+28>>2]=v;if((E|0)==1){if((e&8|0)==0){F=13}else{G=0}}else{F=13}if((F|0)==13){E=NE(0,q,x,D)|0;if((E|0)!=0){z=E;A=D;B=0;C=0;break}E=c[w+40>>2]|0;if((E|0)>0){v=(E<<2)+4|0;y=dF(v)|0;H=y;if((y|0)==0){z=12;A=D;B=0;C=0;break}c[w+32>>2]=H;vF(y|0,-1|0,v|0)|0;I=H}else{I=0}H=fF(E<<1|1,4)|0;c[w+36>>2]=H;if((H|0)==0){z=12;A=D;B=0;C=0;break}H=fF(c[u>>2]|0,12)|0;if((H|0)==0){z=12;A=D;B=0;C=0;break}c[w+16>>2]=H;H=NE(s,q,x,D)|0;if((H|0)==0){G=I}else{z=H;A=D;B=0;C=0;break}}H=o+24|0;u=p+12|0;E=c[u>>2]|0;c[j>>2]=0;c[k>>2]=0;v=TE(q,x)|0;b:do{if((v|0)==0){y=TE(q,0)|0;if((y|0)!=0){J=y;break}y=p+16|0;K=c[u>>2]|0;c:do{if((K|0)>(E|0)){L=0;M=0;N=0;O=K;d:while(1){P=O-1|0;c[u>>2]=P;Q=c[y>>2]|0;R=c[Q+(P<<2)>>2]|0;P=O-2|0;c[u>>2]=P;S=c[Q+(P<<2)>>2]|0;do{if((R|0)==0){P=c[S>>2]|0;if((P|0)==2){T=c[S+4>>2]|0;U=TE(q,L)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,S)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,1)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,c[T>>2]|0)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,0)|0;if((U|0)!=0){V=U;W=M;break c}if((c[T+4>>2]|0)>1){F=45}else{if((c[T+8>>2]|0)>1){F=45}else{X=L}}if((F|0)==45){F=0;c[j>>2]=0;X=0}Y=N+1|0;Z=M;_=X;break}else if((P|0)==0){T=c[S+4>>2]|0;U=c[T>>2]|0;if(!((U|0)>-1|(U|0)==-4)){Y=N;Z=M;_=L;break}U=T+8|0;T=(c[U>>2]|0)+L|0;c[U>>2]=T;if((T|0)<=(c[k>>2]|0)){Y=N;Z=M;_=L;break}c[k>>2]=T;Y=N;Z=M;_=L;break}else if((P|0)==1){T=c[S+4>>2]|0;U=TE(q,c[T+4>>2]|0)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,0)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,c[T>>2]|0)|0;if((U|0)!=0){V=U;W=M;break c}$=TE(q,0)|0}else if((P|0)==3){P=c[S+4>>2]|0;U=TE(q,c[P+4>>2]|0)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,0)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,c[P>>2]|0)|0;if((U|0)!=0){V=U;W=M;break c}$=TE(q,0)|0}else{Y=N;Z=M;_=L;break}if(($|0)==0){Y=N;Z=M;_=L}else{V=$;W=M;break c}}else if((R|0)==1){U=S+4|0;P=c[U>>2]|0;T=O-3|0;c[u>>2]=T;aa=c[Q+(T<<2)>>2]|0;c[j>>2]=aa;T=P+4|0;ba=c[T>>2]|0;do{if((ba|0)>1){c[l>>2]=0;ca=P;F=51}else{if((c[P+8>>2]|0)<=1){da=aa;break}c[l>>2]=0;ea=P;if((ba|0)>0){ca=ea;F=51}else{fa=ba;ga=0;ha=aa;ia=ea;F=60}}}while(0);e:do{if((F|0)==51){F=0;ea=ba;ja=0;ka=1;la=aa;while(1){ma=UE(s,q,c[ca>>2]|0,(ka|0)<(ea|0)?1:2,j,G,m,k)|0;if((ma|0)!=0){J=ma;break b}ma=c[m>>2]|0;if((ja|0)==0){na=ma}else{oa=aF(s,0,0,1,32)|0;if((oa|0)==0){J=12;break b}pa=aF(s,0,0,1,8)|0;qa=oa+4|0;c[qa>>2]=pa;if((pa|0)==0){J=12;break b}c[oa>>2]=1;c[oa+8>>2]=-1;c[oa+12>>2]=-1;c[pa>>2]=ja;c[(c[qa>>2]|0)+4>>2]=ma;c[oa+16>>2]=(c[ma+16>>2]|0)+(c[ja+16>>2]|0);na=oa}if((na|0)==0){J=12;break b}oa=c[T>>2]|0;if((ka|0)>=(oa|0)){fa=oa;ga=na;ha=la;ia=ca;F=60;break e}ea=oa;ja=na;ka=ka+1|0;la=c[j>>2]|0}}}while(0);if((F|0)==60){F=0;T=P+8|0;ba=c[T>>2]|0;do{if((ba|0)==-1){la=c[j>>2]|0;ka=UE(s,q,c[ia>>2]|0,0,j,0,l,k)|0;if((ka|0)!=0){J=ka;break b}ka=c[l>>2]|0;ja=aF(s,0,0,1,32)|0;ea=ja;if((ja|0)==0){F=65;break d}oa=aF(s,0,0,1,16)|0;c[ja+4>>2]=oa;if((oa|0)==0){F=65;break d}c[ja>>2]=2;c[ja+8>>2]=-1;c[ja+12>>2]=-1;c[oa>>2]=ka;c[oa+4>>2]=0;c[oa+8>>2]=-1;ma=oa+12|0;a[ma]=a[ma]&-2;c[ja+16>>2]=c[ka+16>>2];c[l>>2]=ea;ra=la;sa=ea}else{if((fa|0)<(ba|0)){ta=fa;ua=0}else{ra=ha;sa=0;break}while(1){ea=c[j>>2]|0;la=UE(s,q,c[ia>>2]|0,0,j,0,n,k)|0;if((la|0)!=0){J=la;break b}la=c[n>>2]|0;if((ua|0)==0){va=la}else{ka=aF(s,0,0,1,32)|0;if((ka|0)==0){F=73;break d}ja=aF(s,0,0,1,8)|0;ma=ka+4|0;c[ma>>2]=ja;if((ja|0)==0){F=73;break d}c[ka>>2]=1;c[ka+8>>2]=-1;c[ka+12>>2]=-1;c[ja>>2]=la;c[(c[ma>>2]|0)+4>>2]=ua;c[ka+16>>2]=(c[ua+16>>2]|0)+(c[la+16>>2]|0);va=ka}c[l>>2]=va;if((va|0)==0){J=12;break b}ka=aF(s,0,0,1,32)|0;if((ka|0)==0){J=12;break b}la=aF(s,0,0,1,20)|0;c[ka+4>>2]=la;if((la|0)==0){J=12;break b}c[ka>>2]=0;c[ka+8>>2]=-1;c[ka+12>>2]=-1;c[la>>2]=-1;c[la+4>>2]=-1;c[la+8>>2]=-1;la=aF(s,0,0,1,32)|0;ma=la;if((la|0)==0){F=79;break d}ja=aF(s,0,0,1,8)|0;oa=la+4|0;c[oa>>2]=ja;if((ja|0)==0){F=79;break d}c[la>>2]=3;c[la+8>>2]=-1;c[la+12>>2]=-1;c[ja>>2]=ka;c[(c[oa>>2]|0)+4>>2]=va;c[la+16>>2]=(c[va+16>>2]|0)+(c[ka+16>>2]|0);c[l>>2]=ma;ka=ta+1|0;if((ka|0)<(c[T>>2]|0)){ta=ka;ua=ma}else{ra=ea;sa=ma;break}}}}while(0);c[j>>2]=ra;do{if((ga|0)==0){wa=sa;F=85}else{if((sa|0)==0){xa=ga;break}T=aF(s,0,0,1,32)|0;if((T|0)==0){J=12;break b}ba=aF(s,0,0,1,8)|0;P=T+4|0;c[P>>2]=ba;if((ba|0)==0){J=12;break b}c[T>>2]=1;c[T+8>>2]=-1;c[T+12>>2]=-1;c[ba>>2]=ga;c[(c[P>>2]|0)+4>>2]=sa;c[T+16>>2]=(c[sa+16>>2]|0)+(c[ga+16>>2]|0);wa=T;F=85}}while(0);if((F|0)==85){F=0;if((wa|0)==0){J=12;break b}else{xa=wa}}c[U>>2]=c[xa+4>>2];c[S>>2]=c[xa>>2];da=ra}T=N-1|0;P=da-aa+M|0;if((T|0)!=0){Y=T;Z=P;_=da;break}c[j>>2]=P;Y=0;Z=P;_=P}else{Y=N;Z=M;_=L}}while(0);S=c[u>>2]|0;if((S|0)>(E|0)){L=_;M=Z;N=Y;O=S}else{V=0;W=Z;break c}}if((F|0)==65){c[l>>2]=0;J=12;break b}else if((F|0)==73){c[l>>2]=0;J=12;break b}else if((F|0)==79){c[l>>2]=0;J=12;break b}}else{V=0;W=0}}while(0);y=(c[H>>2]|0)+W|0;K=c[k>>2]|0;c[H>>2]=(K|0)>(y|0)?K:y;J=V}else{J=v}}while(0);if((J|0)!=0){z=J;A=D;B=0;C=0;break}v=c[H>>2]|0;c[H>>2]=v+1;E=aF(s,0,0,1,32)|0;if((E|0)==0){z=12;A=D;B=0;C=0;break}y=aF(s,0,0,1,20)|0;c[E+4>>2]=y;if((y|0)==0){z=12;A=D;B=0;C=0;break}c[E>>2]=0;c[E+8>>2]=-1;c[E+12>>2]=-1;c[y>>2]=0;c[y+4>>2]=0;c[y+8>>2]=v;v=aF(s,0,0,1,32)|0;y=v;if((v|0)==0){z=12;A=D;B=0;C=0;break}K=aF(s,0,0,1,8)|0;O=v+4|0;c[O>>2]=K;if((K|0)==0){z=12;A=D;B=0;C=0;break}c[v>>2]=1;c[v+8>>2]=-1;c[v+12>>2]=-1;c[K>>2]=x;c[(c[O>>2]|0)+4>>2]=E;c[v+16>>2]=(c[E+16>>2]|0)+(c[x+16>>2]|0);E=c[u>>2]|0;O=TE(q,v)|0;if((O|0)!=0){z=O;A=D;B=0;C=0;break}O=TE(q,0)|0;if((O|0)!=0){z=O;A=D;B=0;C=0;break}O=c[u>>2]|0;f:do{if((O|0)>(E|0)){K=p+16|0;N=O;g:while(1){M=N-1|0;c[u>>2]=M;L=c[K>>2]|0;S=c[L+(M<<2)>>2]|0;M=N-2|0;c[u>>2]=M;ya=c[L+(M<<2)>>2]|0;do{if((S|0)==3){M=c[ya+4>>2]|0;L=M;do{if((c[M+4>>2]|0)==0){F=141}else{if((c[(c[L>>2]|0)+8>>2]|0)!=0){F=141;break}c[ya+8>>2]=0}}while(0);if((F|0)==141){F=0;c[ya+8>>2]=1}c[ya+24>>2]=c[(c[L>>2]|0)+24>>2];c[ya+28>>2]=c[(c[L>>2]|0)+28>>2]}else if((S|0)==2){M=c[ya+4>>2]|0;Q=M;if((c[(c[Q>>2]|0)+8>>2]|0)==0){za=0}else{za=(c[(c[M+4>>2]|0)+8>>2]|0)!=0|0}c[ya+8>>2]=za;R=c[Q>>2]|0;if((c[R+8>>2]|0)==0){c[ya+24>>2]=c[R+24>>2];Aa=M+4|0}else{P=SE(q,R,0,0,g)|0;if((P|0)!=0){z=P;A=D;B=0;C=0;break a}Ba=dF((c[g>>2]<<2)+4|0)|0;P=Ba;if((Ba|0)==0){z=12;A=D;B=0;C=0;break a}c[P>>2]=-1;c[h>>2]=0;Ca=SE(q,c[Q>>2]|0,P,h,0)|0;if((Ca|0)!=0){F=150;break g}R=M+4|0;M=ya+24|0;c[M>>2]=RE(s,c[(c[R>>2]|0)+24>>2]|0,c[(c[Q>>2]|0)+24>>2]|0,P,c[h>>2]|0)|0;eF(Ba);if((c[M>>2]|0)==0){z=12;A=D;B=0;C=0;break a}else{Aa=R}}R=c[Aa>>2]|0;if((c[R+8>>2]|0)==0){c[ya+28>>2]=c[R+28>>2];break}M=SE(q,R,0,0,g)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}Da=dF((c[g>>2]<<2)+4|0)|0;M=Da;if((Da|0)==0){z=12;A=D;B=0;C=0;break a}c[M>>2]=-1;c[h>>2]=0;Ea=SE(q,c[Aa>>2]|0,M,h,0)|0;if((Ea|0)!=0){F=157;break g}R=ya+28|0;c[R>>2]=RE(s,c[(c[Q>>2]|0)+28>>2]|0,c[(c[Aa>>2]|0)+28>>2]|0,M,c[h>>2]|0)|0;eF(Da);if((c[R>>2]|0)==0){z=12;A=D;B=0;C=0;break a}}else if((S|0)==1){R=c[ya+4>>2]|0;M=R;Q=R+4|0;if((c[(c[M>>2]|0)+8>>2]|0)==0){Fa=(c[(c[Q>>2]|0)+8>>2]|0)!=0|0}else{Fa=1}c[ya+8>>2]=Fa;R=RE(s,c[(c[M>>2]|0)+24>>2]|0,c[(c[Q>>2]|0)+24>>2]|0,0,0)|0;c[ya+24>>2]=R;if((R|0)==0){z=12;A=D;B=0;C=0;break a}R=RE(s,c[(c[M>>2]|0)+28>>2]|0,c[(c[Q>>2]|0)+28>>2]|0,0,0)|0;c[ya+28>>2]=R;if((R|0)==0){z=12;A=D;B=0;C=0;break a}}else if((S|0)==0){R=c[ya>>2]|0;if((R|0)==1){Q=TE(q,ya)|0;if((Q|0)!=0){z=Q;A=D;B=0;C=0;break a}Q=TE(q,2)|0;if((Q|0)!=0){z=Q;A=D;B=0;C=0;break a}Q=ya+4|0;M=TE(q,c[(c[Q>>2]|0)+4>>2]|0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,c[c[Q>>2]>>2]|0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,0)|0;if((M|0)==0){break}else{z=M;A=D;B=0;C=0;break a}}else if((R|0)==2){M=TE(q,ya)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,3)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,c[c[ya+4>>2]>>2]|0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,0)|0;if((M|0)==0){break}else{z=M;A=D;B=0;C=0;break a}}else if((R|0)==0){M=c[ya+4>>2]|0;Q=M;P=c[Q>>2]|0;if((P|0)==-4){c[ya+8>>2]=0;T=M+8|0;ba=c[T>>2]|0;ma=aF(s,0,0,1,64)|0;if((ma|0)==0){F=104;break g}c[ma>>2]=ba;c[ma+4>>2]=0;c[ma+8>>2]=1114111;c[ma+20>>2]=0;c[ma+24>>2]=0;vF(ma+28|0,-1|0,16)|0;c[ya+24>>2]=ma;ma=c[T>>2]|0;T=c[M+4>>2]|0;ba=aF(s,0,0,1,64)|0;if((ba|0)==0){F=106;break g}c[ba>>2]=ma;c[ba+4>>2]=0;c[ba+8>>2]=1114111;c[ba+20>>2]=0;c[ba+24>>2]=0;c[ba+28>>2]=T;c[ba+32>>2]=-1;c[ba+36>>2]=-1;c[ba+40>>2]=-1;c[ya+28>>2]=ba;break}ba=ya+8|0;if((P|0)<0){c[ba>>2]=1;P=aF(s,0,0,1,32)|0;if((P|0)==0){F=110;break g}c[P>>2]=-1;c[P+4>>2]=-1;c[P+8>>2]=-1;c[ya+24>>2]=P;P=aF(s,0,0,1,32)|0;if((P|0)==0){F=112;break g}c[P>>2]=-1;c[P+4>>2]=-1;c[P+8>>2]=-1;c[ya+28>>2]=P;break}else{c[ba>>2]=0;ba=M+8|0;P=c[ba>>2]|0;T=c[Q>>2]|0;ma=M+4|0;ea=c[ma>>2]|0;ka=aF(s,0,0,1,64)|0;if((ka|0)==0){F=115;break g}c[ka>>2]=P;c[ka+4>>2]=T;c[ka+8>>2]=ea;c[ka+20>>2]=0;c[ka+24>>2]=0;vF(ka+28|0,-1|0,16)|0;c[ya+24>>2]=ka;ka=c[ba>>2]|0;ba=c[Q>>2]|0;Q=c[ma>>2]|0;ma=c[M+12>>2]|0;ea=c[M+16>>2]|0;M=aF(s,0,0,1,64)|0;if((M|0)==0){F=117;break g}c[M>>2]=ka;c[M+4>>2]=ba;c[M+8>>2]=Q;c[M+20>>2]=ma;c[M+24>>2]=ea;vF(M+28|0,-1|0,16)|0;c[ya+28>>2]=M;break}}else if((R|0)==3){R=TE(q,ya)|0;if((R|0)!=0){z=R;A=D;B=0;C=0;break a}R=TE(q,1)|0;if((R|0)!=0){z=R;A=D;B=0;C=0;break a}R=ya+4|0;M=TE(q,c[(c[R>>2]|0)+4>>2]|0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,c[c[R>>2]>>2]|0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,0)|0;if((M|0)==0){break}else{z=M;A=D;B=0;C=0;break a}}else{break}}}while(0);N=c[u>>2]|0;if((N|0)<=(E|0)){break f}}if((F|0)==104){c[ya+24>>2]=0;z=12;A=D;B=0;C=0;break a}else if((F|0)==106){c[ya+28>>2]=0;z=12;A=D;B=0;C=0;break a}else if((F|0)==110){c[ya+24>>2]=0;z=12;A=D;B=0;C=0;break a}else if((F|0)==112){c[ya+28>>2]=0;z=12;A=D;B=0;C=0;break a}else if((F|0)==115){c[ya+24>>2]=0;z=12;A=D;B=0;C=0;break a}else if((F|0)==117){c[ya+28>>2]=0;z=12;A=D;B=0;C=0;break a}else if((F|0)==150){eF(Ba);z=Ca;A=D;B=0;C=0;break a}else if((F|0)==157){eF(Da);z=Ea;A=D;B=0;C=0;break a}}}while(0);E=c[H>>2]|0;u=E<<2;O=dF(u)|0;x=O;if((O|0)==0){z=12;A=D;B=x;C=0;break}N=dF(u)|0;u=N;if((N|0)==0){z=12;A=D;B=x;C=u;break}if((E|0)>0){vF(O|0,0,((E|0)>1?E<<2:4)|0)|0}OE(y,0,x,0)|0;E=c[H>>2]|0;if((E|0)>0){K=0;S=0;while(1){c[u+(K<<2)>>2]=S;M=x+(K<<2)|0;R=S+1+(c[M>>2]|0)|0;c[M>>2]=0;M=K+1|0;if((M|0)<(E|0)){K=M;S=R}else{Ga=R;break}}}else{Ga=0}S=fF(Ga+1|0,32)|0;K=S;if((S|0)==0){z=12;A=D;B=x;C=u;break}c[w>>2]=K;S=w+4|0;c[S>>2]=Ga;E=OE(y,K,x,u)|0;if((E|0)!=0){z=E;A=D;B=x;C=u;break}c[w+20>>2]=0;E=v+24|0;R=c[E>>2]|0;if((c[R>>2]|0)>-1){M=1;ea=R;while(1){R=ea+32|0;ma=M+1|0;if((c[R>>2]|0)>-1){M=ma;ea=R}else{Ha=ma;break}}}else{Ha=1}ea=fF(Ha,32)|0;M=ea;if((ea|0)==0){z=12;A=D;B=x;C=u;break}c[w+8>>2]=M;ea=c[E>>2]|0;y=c[ea>>2]|0;if((y|0)>-1){ma=0;R=ea;ea=y;while(1){c[M+(ma<<5)+8>>2]=K+(c[u+(ea<<2)>>2]<<5);c[M+(ma<<5)+12>>2]=c[R>>2];y=M+(ma<<5)+16|0;c[y>>2]=0;Q=R+12|0;ba=c[Q>>2]|0;if((ba|0)!=0){ka=0;while(1){Ia=ka+1|0;if((c[ba+(ka<<2)>>2]|0)>-1){ka=Ia}else{break}}ka=Ia<<2;ba=dF(ka)|0;c[y>>2]=ba;if((ba|0)==0){z=12;A=D;B=x;C=u;break a}tF(ba|0,c[Q>>2]|0,ka)|0}c[M+(ma<<5)+20>>2]=c[R+16>>2];ka=ma+1|0;ba=R+32|0;T=c[ba>>2]|0;if((T|0)>-1){ma=ka;R=ba;ea=T}else{Ja=ka;break}}}else{Ja=0}c[M+(Ja<<5)+8>>2]=0;c[S>>2]=Ga;c[w+12>>2]=K+(c[u+(c[c[v+28>>2]>>2]<<2)>>2]<<5);c[w+52>>2]=c[H>>2];c[w+56>>2]=e;$E(s);eF(c[p+16>>2]|0);eF(p);eF(O);eF(N);c[b+4>>2]=w;r=0;i=f;return r|0}else{z=t;A=0;B=0;C=0}}while(0);$E(s);eF(c[p+16>>2]|0);eF(p);if((B|0)!=0){eF(B)}if((C|0)!=0){eF(C)}c[b+4>>2]=A;PE(b);r=z;i=f;return r|0}function ME(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0;d=i;i=i+424|0;e=d|0;f=d+8|0;g=d+72|0;h=d+328|0;j=d+336|0;k=d+384|0;l=d+392|0;m=c[b+4>>2]|0;n=m+12|0;o=c[n>>2]|0;if((c[b+40>>2]|0)==0){p=b+20|0;TE(m,c[p>>2]|0)|0;TE(m,2)|0;c[p>>2]=(c[p>>2]|0)+1}p=TE(m,0)|0;q=b+12|0;r=b+16|0;c[r>>2]=c[q>>2];s=c[n>>2]|0;t=(p|0)==0;a:do{if((s|0)>(o|0)&t){u=m+16|0;v=b+36|0;w=b|0;x=b+24|0;y=b+20|0;z=f|0;A=b+28|0;B=l|0;C=k|0;D=k+1|0;E=j;F=b;G=j+12|0;H=j+40|0;I=j+24|0;J=j+8|0;K=0;L=0;M=s;b:while(1){N=M-1|0;c[n>>2]=N;O=c[u>>2]|0;c:do{switch(c[O+(N<<2)>>2]|0){case 7:{P=c[q>>2]|0;Q=a[P]|0;if((Q|0)==41){c[q>>2]=P+1;R=0;S=L;T=K;break c}else if((Q|0)!=124){R=0;S=L;T=K;break c}Q=TE(m,7)|0;if((Q|0)!=0){U=Q;V=L;W=6;break b}Q=TE(m,K)|0;if((Q|0)!=0){U=Q;V=L;W=6;break b}Q=TE(m,8)|0;if((Q|0)!=0){U=Q;V=L;W=6;break b}Q=TE(m,3)|0;if((Q|0)!=0){U=Q;V=L;W=6;break b}c[q>>2]=(c[q>>2]|0)+1;R=0;S=L;T=K;break};case 4:{Q=TE(m,9)|0;if((Q|0)!=0){U=Q;V=L;W=6;break b}R=TE(m,1)|0;S=L;T=K;break};case 5:{Q=c[q>>2]|0;P=a[Q]|0;if(P<<24>>24==0){R=0;S=L;T=K;break c}X=c[v>>2]&1;Y=(X|0)!=0;if(Y&P<<24>>24==124){R=0;S=L;T=K;break c}do{if(!(Y&P<<24>>24==41&(L|0)>0)){if((X|0)==0&P<<24>>24==92){if((a[Q+1|0]|0)==41){break}}Z=TE(m,5)|0;if((Z|0)!=0){U=Z;V=L;W=6;break b}Z=TE(m,K)|0;if((Z|0)!=0){U=Z;V=L;W=6;break b}Z=TE(m,6)|0;if((Z|0)!=0){U=Z;V=L;W=6;break b}R=TE(m,4)|0;S=L;T=K;break c}}while(0);P=(X|L|0)==0?8:0;Y=L-1|0;if((X|0)!=0){R=P;S=Y;T=K;break c}c[q>>2]=Q+2;R=P;S=Y;T=K;break};case 1:{Y=c[q>>2]|0;d:do{switch(a[Y]|0){case 91:{P=Y+1|0;c[q>>2]=P;Z=dF(128)|0;if((Z|0)==0){_=12;W=297;break b}if((a[P]|0)==94){$=Y+2|0;c[q>>2]=$;aa=1;ba=$}else{aa=0;ba=P}P=(aa|0)==0;$=ba;ca=32;da=0;ea=0;fa=Z;e:while(1){Z=a[$]|0;if((Z<<24>>24|0)==0){ga=$;ha=7;ia=fa;W=140;break}else if((Z<<24>>24|0)==93){if($>>>0>(c[q>>2]|0)>>>0){W=85;break}}Z=KE(e,$,-1)|0;if((Z|0)<0){c[e>>2]=-1;ja=1}else{ja=Z}Z=$+ja|0;do{if((a[Z]|0)==45){ka=ja+1|0;la=$+ka|0;if((a[la]|0)==93){W=94;break}ma=c[e>>2]|0;na=KE(e,la,-1)|0;if((na|0)<0){c[e>>2]=-1;oa=1;pa=-1}else{oa=na;pa=c[e>>2]|0}qa=$+(oa+ka)|0;ra=pa;sa=ma;ta=ma>>>0>pa>>>0?11:0;ua=0}else{W=94}}while(0);f:do{if((W|0)==94){W=0;ma=a[$]|0;do{if((ma<<24>>24|0)==91){ka=a[$+1|0]|0;if((ka<<24>>24|0)==46|(ka<<24>>24|0)==61){ga=$;ha=3;ia=fa;W=140;break e}else if((ka<<24>>24|0)!=58){va=0;break}ka=$+2|0;na=ka;while(1){la=a[na]|0;wa=la<<24>>24==0;if(la<<24>>24!=58&(wa^1)){na=na+1|0}else{break}}if(wa){ga=$;ha=4;ia=fa;W=140;break e}la=na-$-2|0;xa=(la|0)>63?63:la;DF(z|0,ka|0,xa|0)|0;a[f+xa|0]=0;xa=yE(z)|0;qa=na+2|0;ra=1114111;sa=0;ta=(xa|0)==0?4:0;ua=xa;break f}else if((ma<<24>>24|0)==45){if((a[$+1|0]|0)==93){va=0;break}va=(c[q>>2]|0)==($|0)?0:11}else{va=0}}while(0);ma=c[e>>2]|0;qa=Z;ra=ma;sa=ma;ta=va;ua=0}}while(0);if((ta|0)!=0){ga=qa;ha=ta;ia=fa;W=140;break}Z=(ua|0)!=0;do{if(P|Z^1){ma=c[w>>2]|0;if((da|0)<(ca|0)){ya=ca;za=fa}else{if((ca|0)>1024){ga=qa;ha=12;ia=fa;W=140;break e}xa=gF(fa,ca<<3)|0;if((xa|0)==0){ga=qa;ha=12;ia=fa;W=140;break e}else{ya=ca<<1;za=xa}}xa=aF(ma,0,0,1,32)|0;if((xa|0)==0){W=112;break e}la=aF(ma,0,0,1,20)|0;ma=xa+4|0;c[ma>>2]=la;if((la|0)==0){W=112;break e}c[xa>>2]=0;c[xa+8>>2]=-1;c[xa+12>>2]=-1;c[la>>2]=sa;c[la+4>>2]=ra;c[la+8>>2]=-1;c[za+(da<<2)>>2]=xa;c[(c[ma>>2]|0)+12>>2]=ua;Aa=0;Ba=ya;Ca=da+1|0;Da=ea;Ea=za}else{if((ea|0)>63){Aa=12;Ba=ca;Ca=da;Da=ea;Ea=fa;break}c[g+(ea<<2)>>2]=ua;Aa=0;Ba=ca;Ca=da;Da=ea+1|0;Ea=fa}}while(0);ma=(Aa|0)==0;if(ma&(((c[v>>2]&2|0)==0|Z)^1)){Fa=sa;Ga=Ba;Ha=Ca;Ia=Ea}else{if(ma){$=qa;ca=Ba;da=Ca;ea=Da;fa=Ea;continue}else{ga=qa;ha=Aa;ia=Ea;W=140;break}}while(1){ma=Fa;while(1){if(ma>>>0>ra>>>0){$=qa;ca=Ga;da=Ha;ea=Da;fa=Ia;continue e}if((BE(ma)|0)!=0){W=118;break}Ka=ma+1|0;if((FE(ma)|0)==0){ma=Ka}else{W=129;break}}if((W|0)==118){W=0;xa=HE(ma)|0;la=ma+1|0;g:do{if((BE(la)|0)==0){La=xa;Ma=la}else{Na=xa;Oa=la;while(1){if((HE(Oa)|0)!=(Na+1|0)|Oa>>>0>ra>>>0){La=Na;Ma=Oa;break g}Pa=HE(Oa)|0;Qa=Oa+1|0;if((BE(Qa)|0)==0){La=Pa;Ma=Qa;break}else{Na=Pa;Oa=Qa}}}}while(0);la=c[w>>2]|0;if((Ha|0)<(Ga|0)){Ra=Ga;Sa=Ia}else{if((Ga|0)>1024){ga=qa;ha=12;ia=Ia;W=140;break e}Oa=gF(Ia,Ga<<3)|0;if((Oa|0)==0){ga=qa;ha=12;ia=Ia;W=140;break e}else{Ra=Ga<<1;Sa=Oa}}Oa=aF(la,0,0,1,32)|0;Na=Oa;do{if((Oa|0)==0){Ta=0}else{na=aF(la,0,0,1,20)|0;c[Oa+4>>2]=na;if((na|0)==0){Ta=0;break}c[Oa>>2]=0;c[Oa+8>>2]=-1;c[Oa+12>>2]=-1;c[na>>2]=xa;c[na+4>>2]=La;c[na+8>>2]=-1;Ta=Na}}while(0);c[Sa+(Ha<<2)>>2]=Ta;Ua=Ma;Va=Ra;Wa=Ta;Xa=Sa}else if((W|0)==129){W=0;Na=JE(ma)|0;h:do{if((FE(Ka)|0)==0){Ya=Ka;Za=Na}else{xa=Ka;Oa=Na;while(1){if((JE(xa)|0)!=(Oa+1|0)|xa>>>0>ra>>>0){Ya=xa;Za=Oa;break h}la=xa+1|0;na=JE(xa)|0;if((FE(la)|0)==0){Ya=la;Za=na;break}else{xa=la;Oa=na}}}}while(0);ma=c[w>>2]|0;if((Ha|0)<(Ga|0)){_a=Ga;$a=Ia}else{if((Ga|0)>1024){ga=qa;ha=12;ia=Ia;W=140;break e}Oa=gF(Ia,Ga<<3)|0;if((Oa|0)==0){ga=qa;ha=12;ia=Ia;W=140;break e}else{_a=Ga<<1;$a=Oa}}Oa=aF(ma,0,0,1,32)|0;xa=Oa;do{if((Oa|0)==0){ab=0}else{na=aF(ma,0,0,1,20)|0;c[Oa+4>>2]=na;if((na|0)==0){ab=0;break}c[Oa>>2]=0;c[Oa+8>>2]=-1;c[Oa+12>>2]=-1;c[na>>2]=Na;c[na+4>>2]=Za;c[na+8>>2]=-1;ab=xa}}while(0);c[$a+(Ha<<2)>>2]=ab;Ua=Ya;Va=_a;Wa=ab;Xa=$a}if((Wa|0)==0){W=141;break e}else{Fa=Ua;Ga=Va;Ha=Ha+1|0;Ia=Xa}}}i:do{if((W|0)==85){W=0;c[q>>2]=$+1;ca=(aa|0)!=0;if(ca){Jb(fa|0,da|0,4,148)}j:do{if((da|0)>0){P=(ea|0)>0;Z=(ea<<2)+4|0;if(ca){bb=0;cb=0;db=0;eb=0}else{xa=0;Na=0;while(1){Oa=fa+(xa<<2)|0;ma=c[(c[Oa>>2]|0)+4>>2]|0;do{if((ma|0)==0){fb=Na;gb=0}else{c[ma+8>>2]=c[x>>2];if(P){na=aF(c[w>>2]|0,0,0,0,Z)|0;la=na;ka=ma+16|0;c[ka>>2]=la;if((na|0)==0){hb=Na;ib=12;jb=fa;break i}else{kb=0;lb=la}do{c[lb+(kb<<2)>>2]=c[g+(kb<<2)>>2];kb=kb+1|0;lb=c[ka>>2]|0}while((kb|0)<(ea|0));c[lb+(ea<<2)>>2]=0}else{c[ma+16>>2]=0}if((Na|0)==0){fb=c[Oa>>2]|0;gb=0;break}ka=c[w>>2]|0;la=c[Oa>>2]|0;na=aF(ka,0,0,1,32)|0;Qa=na;do{if((na|0)==0){mb=0}else{Pa=aF(ka,0,0,1,8)|0;nb=na+4|0;c[nb>>2]=Pa;if((Pa|0)==0){mb=0;break}c[na>>2]=3;c[na+8>>2]=-1;c[na+12>>2]=-1;c[Pa>>2]=Na;c[(c[nb>>2]|0)+4>>2]=la;c[na+16>>2]=(c[la+16>>2]|0)+(c[Na+16>>2]|0);mb=Qa}}while(0);fb=mb;gb=(mb|0)==0?12:0}}while(0);Oa=xa+1|0;if((Oa|0)<(da|0)&(gb|0)==0){xa=Oa;Na=fb}else{ob=gb;pb=0;qb=fb;break j}}}while(1){Na=fa+(bb<<2)|0;xa=c[(c[Na>>2]|0)+4>>2]|0;Oa=xa;ma=c[Oa>>2]|0;Qa=xa+4|0;la=c[Qa>>2]|0;do{if((ma|0)<(cb|0)){na=la+1|0;rb=eb;sb=0;tb=(na|0)<(cb|0)?cb:na;ub=db}else{if((ma|0)<=(db|0)){na=la+1|0;rb=eb;sb=0;tb=na;ub=na;break}c[Oa>>2]=db;c[Qa>>2]=ma-1;na=la+1|0;if((xa|0)==0){rb=eb;sb=0;tb=na;ub=na;break}c[xa+8>>2]=c[x>>2];if(P){ka=aF(c[w>>2]|0,0,0,0,Z)|0;nb=ka;Pa=xa+16|0;c[Pa>>2]=nb;if((ka|0)==0){hb=eb;ib=12;jb=fa;break i}else{vb=0;wb=nb}do{c[wb+(vb<<2)>>2]=c[g+(vb<<2)>>2];vb=vb+1|0;wb=c[Pa>>2]|0}while((vb|0)<(ea|0));c[wb+(ea<<2)>>2]=0}else{c[xa+16>>2]=0}if((eb|0)==0){rb=c[Na>>2]|0;sb=0;tb=na;ub=na;break}Pa=c[w>>2]|0;nb=c[Na>>2]|0;ka=aF(Pa,0,0,1,32)|0;xb=ka;do{if((ka|0)==0){yb=0}else{zb=aF(Pa,0,0,1,8)|0;Ab=ka+4|0;c[Ab>>2]=zb;if((zb|0)==0){yb=0;break}c[ka>>2]=3;c[ka+8>>2]=-1;c[ka+12>>2]=-1;c[zb>>2]=eb;c[(c[Ab>>2]|0)+4>>2]=nb;c[ka+16>>2]=(c[nb+16>>2]|0)+(c[eb+16>>2]|0);yb=xb}}while(0);rb=yb;sb=(yb|0)==0?12:0;tb=na;ub=na}}while(0);Na=bb+1|0;if((Na|0)<(da|0)&(sb|0)==0){bb=Na;cb=tb;db=ub;eb=rb}else{ob=sb;pb=ub;qb=rb;break}}}else{ob=0;pb=0;qb=0}}while(0);if((ob|0)!=0|ca^1){hb=qb;ib=ob;jb=fa;break}Z=c[w>>2]|0;P=c[x>>2]|0;Na=aF(Z,0,0,1,32)|0;xa=Na;if((Na|0)==0){hb=qb;ib=12;jb=fa;break}la=aF(Z,0,0,1,20)|0;Z=Na+4|0;c[Z>>2]=la;if((la|0)==0){hb=qb;ib=12;jb=fa;break}c[Na>>2]=0;c[Na+8>>2]=-1;c[Na+12>>2]=-1;c[la>>2]=pb;c[la+4>>2]=1114111;c[la+8>>2]=P;P=c[Z>>2]|0;if((ea|0)>0){Z=aF(c[w>>2]|0,0,0,0,(ea<<2)+4|0)|0;la=Z;ma=P+16|0;c[ma>>2]=la;if((Z|0)==0){hb=qb;ib=12;jb=fa;break}else{Bb=0;Cb=la}do{c[Cb+(Bb<<2)>>2]=c[g+(Bb<<2)>>2];Bb=Bb+1|0;Cb=c[ma>>2]|0}while((Bb|0)<(ea|0));c[Cb+(ea<<2)>>2]=0}else{c[P+16>>2]=0}if((qb|0)==0){hb=xa;ib=0;jb=fa;break}ma=c[w>>2]|0;ca=aF(ma,0,0,1,32)|0;la=ca;do{if((ca|0)==0){Db=0}else{Z=aF(ma,0,0,1,8)|0;Qa=ca+4|0;c[Qa>>2]=Z;if((Z|0)==0){Db=0;break}c[ca>>2]=3;c[ca+8>>2]=-1;c[ca+12>>2]=-1;c[Z>>2]=qb;c[(c[Qa>>2]|0)+4>>2]=xa;c[ca+16>>2]=(c[Na+16>>2]|0)+(c[qb+16>>2]|0);Db=la}}while(0);hb=Db;ib=(Db|0)==0?12:0;jb=fa}else if((W|0)==112){W=0;c[za+(da<<2)>>2]=0;ga=qa;ha=12;ia=za;W=140}else if((W|0)==141){W=0;c[q>>2]=qa;hb=0;ib=12;jb=Xa}}while(0);if((W|0)==140){W=0;c[q>>2]=ga;hb=0;ib=ha;jb=ia}eF(jb);c[x>>2]=(c[x>>2]|0)+1;if((ib|0)==0){R=0;S=L;T=hb;break c}else{_=ib;W=297;break b}break};case 40:{if((c[v>>2]&1|0)!=0){Eb=Y;W=74}break};case 46:{da=(c[v>>2]&4|0)==0;fa=c[w>>2]|0;ea=c[x>>2]|0;$=aF(fa,0,0,1,32)|0;la=$;Na=($|0)==0;if(da){if(Na){_=12;W=297;break b}da=aF(fa,0,0,1,20)|0;c[$+4>>2]=da;if((da|0)==0){_=12;W=297;break b}c[$>>2]=0;c[$+8>>2]=-1;c[$+12>>2]=-1;c[da>>2]=0;c[da+4>>2]=1114111;c[da+8>>2]=ea;Fb=(c[x>>2]|0)+1|0;Gb=la}else{if(Na){_=12;W=297;break b}Na=aF(fa,0,0,1,20)|0;c[$+4>>2]=Na;if((Na|0)==0){_=12;W=297;break b}c[$>>2]=0;c[$+8>>2]=-1;c[$+12>>2]=-1;c[Na>>2]=0;c[Na+4>>2]=9;c[Na+8>>2]=ea;ea=c[w>>2]|0;Na=(c[x>>2]|0)+1|0;fa=aF(ea,0,0,1,32)|0;if((fa|0)==0){_=12;W=297;break b}da=aF(ea,0,0,1,20)|0;c[fa+4>>2]=da;if((da|0)==0){_=12;W=297;break b}c[fa>>2]=0;c[fa+8>>2]=-1;c[fa+12>>2]=-1;c[da>>2]=11;c[da+4>>2]=1114111;c[da+8>>2]=Na;Na=c[w>>2]|0;da=aF(Na,0,0,1,32)|0;if((da|0)==0){_=12;W=297;break b}ea=aF(Na,0,0,1,8)|0;Na=da+4|0;c[Na>>2]=ea;if((ea|0)==0){_=12;W=297;break b}c[da>>2]=3;c[da+8>>2]=-1;c[da+12>>2]=-1;c[ea>>2]=la;c[(c[Na>>2]|0)+4>>2]=fa;c[da+16>>2]=(c[fa+16>>2]|0)+(c[$+16>>2]|0);Fb=(c[x>>2]|0)+2|0;Gb=da}c[x>>2]=Fb;c[q>>2]=(c[q>>2]|0)+1;R=0;S=L;T=Gb;break c;break};case 94:{if((c[v>>2]&1|0)==0){if((Y|0)!=(c[r>>2]|0)){break d}da=TE(m,5)|0;if((da|0)!=0){U=da;V=L;W=6;break b}}da=c[w>>2]|0;$=aF(da,0,0,1,32)|0;if(($|0)==0){_=12;W=297;break b}fa=aF(da,0,0,1,20)|0;c[$+4>>2]=fa;if((fa|0)==0){_=12;W=297;break b}c[$>>2]=0;c[$+8>>2]=-1;c[$+12>>2]=-1;c[fa>>2]=-2;c[fa+4>>2]=1;c[fa+8>>2]=-1;c[q>>2]=(c[q>>2]|0)+1;R=0;S=L;T=$;break c;break};case 36:{if((c[v>>2]&1|0)==0){if((a[Y+1|0]|0)!=0){break d}}$=c[w>>2]|0;fa=aF($,0,0,1,32)|0;if((fa|0)==0){_=12;W=297;break b}da=aF($,0,0,1,20)|0;c[fa+4>>2]=da;if((da|0)==0){_=12;W=297;break b}c[fa>>2]=0;c[fa+8>>2]=-1;c[fa+12>>2]=-1;c[da>>2]=-2;c[da+4>>2]=2;c[da+8>>2]=-1;c[q>>2]=(c[q>>2]|0)+1;R=0;S=L;T=fa;break c;break};case 92:{fa=Y+1|0;da=a[fa]|0;do{if((c[v>>2]&1|0)==0){if(da<<24>>24==40){c[q>>2]=fa;Eb=fa;W=74;break d}else{$=a[Y+1|0]|0;if($<<24>>24==41){W=268;break d}else{Hb=$;break}}}else{Hb=da}}while(0);da=Y+1|0;fa=Hb<<24>>24==0;if(fa){_=5;W=297;break b}else{Ib=0;Kb=996}while(1){$=Ib+1|0;if((a[992+(Ib<<3)|0]|0)==Hb<<24>>24){Lb=Kb;break}Na=996+($<<3)|0;if(($|0)==12){Lb=Na;break}else{Ib=$;Kb=Na}}Na=c[Lb>>2]|0;if((Na|0)!=0){tF(E|0,F|0,40)|0;c[G>>2]=Na;c[H>>2]=1;Na=ME(j)|0;if((Na|0)!=0){_=Na;W=297;break b}c[q>>2]=(c[q>>2]|0)+2;c[x>>2]=c[I>>2];R=0;S=L;T=c[J>>2]|0;break c}if(fa){_=5;W=297;break b}c[q>>2]=da;Na=a[da]|0;k:do{switch(Na|0){case 60:{$=c[w>>2]|0;la=aF($,0,0,1,32)|0;ea=la;do{if((la|0)==0){Mb=0}else{ca=aF($,0,0,1,20)|0;c[la+4>>2]=ca;if((ca|0)==0){Mb=0;break}c[la>>2]=0;c[la+8>>2]=-1;c[la+12>>2]=-1;c[ca>>2]=-2;c[ca+4>>2]=16;c[ca+8>>2]=-1;Mb=ea}}while(0);c[q>>2]=(c[q>>2]|0)+1;Nb=Mb;break};case 62:{ea=c[w>>2]|0;la=aF(ea,0,0,1,32)|0;$=la;do{if((la|0)==0){Ob=0}else{ca=aF(ea,0,0,1,20)|0;c[la+4>>2]=ca;if((ca|0)==0){Ob=0;break}c[la>>2]=0;c[la+8>>2]=-1;c[la+12>>2]=-1;c[ca>>2]=-2;c[ca+4>>2]=32;c[ca+8>>2]=-1;Ob=$}}while(0);c[q>>2]=(c[q>>2]|0)+1;Nb=Ob;break};case 120:{$=Y+2|0;c[q>>2]=$;la=a[$]|0;if(la<<24>>24==123){$=Y+3|0;c[q>>2]=$;ea=0;ca=$;while(1){$=a[ca]|0;if(($<<24>>24|0)==125|($<<24>>24|0)==0){Pb=ca;Qb=ea;break}if((GE($<<24>>24)|0)==0){_=9;W=297;break b}$=c[q>>2]|0;a[l+ea|0]=a[$]|0;xa=ea+1|0;ma=$+1|0;c[q>>2]=ma;if(xa>>>0>31>>>0){Pb=ma;Qb=xa;break}else{ea=xa;ca=ma}}c[q>>2]=Pb+1;a[l+Qb|0]=0;ca=Ja(B|0,0,16)|0;ea=c[w>>2]|0;ma=c[x>>2]|0;xa=aF(ea,0,0,1,32)|0;$=xa;do{if((xa|0)==0){Rb=0}else{P=aF(ea,0,0,1,20)|0;c[xa+4>>2]=P;if((P|0)==0){Rb=0;break}c[xa>>2]=0;c[xa+8>>2]=-1;c[xa+12>>2]=-1;c[P>>2]=ca;c[P+4>>2]=ca;c[P+8>>2]=ma;Rb=$}}while(0);c[x>>2]=(c[x>>2]|0)+1;Nb=Rb;break k}else{vF(C|0,0,3)|0;$=(GE(la<<24>>24)|0)==0;ma=c[q>>2]|0;if($){Sb=ma}else{a[C]=a[ma]|0;$=ma+1|0;c[q>>2]=$;Sb=$}if((GE(a[Sb]|0)|0)!=0){$=c[q>>2]|0;a[D]=a[$]|0;c[q>>2]=$+1}$=Ja(C|0,0,16)|0;ma=c[w>>2]|0;ca=c[x>>2]|0;xa=aF(ma,0,0,1,32)|0;ea=xa;do{if((xa|0)==0){Tb=0}else{P=aF(ma,0,0,1,20)|0;c[xa+4>>2]=P;if((P|0)==0){Tb=0;break}c[xa>>2]=0;c[xa+8>>2]=-1;c[xa+12>>2]=-1;c[P>>2]=$;c[P+4>>2]=$;c[P+8>>2]=ca;Tb=ea}}while(0);c[x>>2]=(c[x>>2]|0)+1;Nb=Tb;break k}break};case 98:{ea=c[w>>2]|0;ca=aF(ea,0,0,1,32)|0;$=ca;do{if((ca|0)==0){Ub=0}else{xa=aF(ea,0,0,1,20)|0;c[ca+4>>2]=xa;if((xa|0)==0){Ub=0;break}c[ca>>2]=0;c[ca+8>>2]=-1;c[ca+12>>2]=-1;c[xa>>2]=-2;c[xa+4>>2]=64;c[xa+8>>2]=-1;Ub=$}}while(0);c[q>>2]=(c[q>>2]|0)+1;Nb=Ub;break};case 66:{$=c[w>>2]|0;ca=aF($,0,0,1,32)|0;ea=ca;do{if((ca|0)==0){Vb=0}else{xa=aF($,0,0,1,20)|0;c[ca+4>>2]=xa;if((xa|0)==0){Vb=0;break}c[ca>>2]=0;c[ca+8>>2]=-1;c[ca+12>>2]=-1;c[xa>>2]=-2;c[xa+4>>2]=128;c[xa+8>>2]=-1;Vb=ea}}while(0);c[q>>2]=(c[q>>2]|0)+1;Nb=Vb;break};default:{if((zE(Na)|0)!=0){ea=(a[c[q>>2]|0]|0)-48|0;ca=c[w>>2]|0;$=c[x>>2]|0;xa=aF(ca,0,0,1,32)|0;if((xa|0)==0){_=12;W=297;break b}ma=aF(ca,0,0,1,20)|0;c[xa+4>>2]=ma;if((ma|0)==0){_=12;W=297;break b}c[xa>>2]=0;c[xa+8>>2]=-1;c[xa+12>>2]=-1;c[ma>>2]=-4;c[ma+4>>2]=ea;c[ma+8>>2]=$;c[x>>2]=(c[x>>2]|0)+1;$=c[A>>2]|0;c[A>>2]=(ea|0)<($|0)?$:ea;c[q>>2]=(c[q>>2]|0)+1;R=0;S=L;T=xa;break c}xa=c[w>>2]|0;ea=a[c[q>>2]|0]|0;$=c[x>>2]|0;ma=aF(xa,0,0,1,32)|0;ca=ma;do{if((ma|0)==0){Wb=0}else{la=aF(xa,0,0,1,20)|0;c[ma+4>>2]=la;if((la|0)==0){Wb=0;break}c[ma>>2]=0;c[ma+8>>2]=-1;c[ma+12>>2]=-1;c[la>>2]=ea;c[la+4>>2]=ea;c[la+8>>2]=$;Wb=ca}}while(0);c[x>>2]=(c[x>>2]|0)+1;c[q>>2]=(c[q>>2]|0)+1;Nb=Wb}}}while(0);if((Nb|0)==0){_=12;W=297;break b}else{R=0;S=L;T=Nb;break c}break};case 41:{if((L|0)!=0){W=267}break};case 42:case 124:case 123:case 43:case 63:{W=267;break};case 0:{W=268;break};default:{}}}while(0);if((W|0)==74){W=0;Q=L+1|0;c[q>>2]=Eb+1;X=TE(m,c[y>>2]|0)|0;if((X|0)!=0){U=X;V=Q;W=6;break b}X=TE(m,2)|0;if((X|0)!=0){U=X;V=Q;W=6;break b}X=TE(m,0)|0;if((X|0)!=0){U=X;V=Q;W=6;break b}c[y>>2]=(c[y>>2]|0)+1;R=0;S=Q;T=K;break c}else if((W|0)==267){W=0;if((c[v>>2]&1|0)!=0){W=268}}if((W|0)==268){W=0;Q=c[w>>2]|0;X=aF(Q,0,0,1,32)|0;if((X|0)==0){_=12;W=297;break b}Na=aF(Q,0,0,1,20)|0;c[X+4>>2]=Na;if((Na|0)==0){_=12;W=297;break b}c[X>>2]=0;c[X+8>>2]=-1;c[X+12>>2]=-1;c[Na>>2]=-1;c[Na+4>>2]=-1;c[Na+8>>2]=-1;R=0;S=L;T=X;break c}X=KE(h,Y,-1)|0;if((X|0)<0){c[h>>2]=-1;Xb=1}else{Xb=X}do{if((c[v>>2]&2|0)==0){W=283}else{if((FE(c[h>>2]|0)|0)==0){if((BE(c[h>>2]|0)|0)==0){W=283;break}}X=c[w>>2]|0;Na=HE(c[h>>2]|0)|0;Q=HE(c[h>>2]|0)|0;da=c[x>>2]|0;fa=aF(X,0,0,1,32)|0;if((fa|0)==0){_=12;W=297;break b}ca=aF(X,0,0,1,20)|0;c[fa+4>>2]=ca;if((ca|0)==0){_=12;W=297;break b}c[fa>>2]=0;c[fa+8>>2]=-1;c[fa+12>>2]=-1;c[ca>>2]=Na;c[ca+4>>2]=Q;c[ca+8>>2]=da;da=c[w>>2]|0;ca=JE(c[h>>2]|0)|0;Q=JE(c[h>>2]|0)|0;Na=c[x>>2]|0;X=aF(da,0,0,1,32)|0;if((X|0)==0){_=12;W=297;break b}$=aF(da,0,0,1,20)|0;c[X+4>>2]=$;if(($|0)==0){_=12;W=297;break b}c[X>>2]=0;c[X+8>>2]=-1;c[X+12>>2]=-1;c[$>>2]=ca;c[$+4>>2]=Q;c[$+8>>2]=Na;Na=c[w>>2]|0;$=aF(Na,0,0,1,32)|0;if(($|0)==0){_=12;W=297;break b}Q=aF(Na,0,0,1,8)|0;Na=$+4|0;c[Na>>2]=Q;if((Q|0)==0){_=12;W=297;break b}c[$>>2]=3;c[$+8>>2]=-1;c[$+12>>2]=-1;c[Q>>2]=fa;c[(c[Na>>2]|0)+4>>2]=X;c[$+16>>2]=(c[X+16>>2]|0)+(c[fa+16>>2]|0);Yb=$}}while(0);if((W|0)==283){W=0;Y=c[w>>2]|0;$=c[h>>2]|0;fa=c[x>>2]|0;X=aF(Y,0,0,1,32)|0;if((X|0)==0){_=12;W=297;break b}Na=aF(Y,0,0,1,20)|0;c[X+4>>2]=Na;if((Na|0)==0){_=12;W=297;break b}c[X>>2]=0;c[X+8>>2]=-1;c[X+12>>2]=-1;c[Na>>2]=$;c[Na+4>>2]=$;c[Na+8>>2]=fa;Yb=X}c[x>>2]=(c[x>>2]|0)+1;c[q>>2]=(c[q>>2]|0)+Xb;R=0;S=L;T=Yb;break};case 3:{X=TE(m,5)|0;if((X|0)!=0){U=X;V=L;W=6;break b}R=TE(m,4)|0;S=L;T=K;break};case 0:{if((c[v>>2]&1|0)!=0){X=TE(m,7)|0;if((X|0)!=0){U=X;V=L;W=6;break b}}R=TE(m,3)|0;S=L;T=K;break};case 8:{X=M-2|0;c[n>>2]=X;fa=c[O+(X<<2)>>2]|0;X=c[w>>2]|0;Na=aF(X,0,0,1,32)|0;if((Na|0)==0){_=12;W=297;break b}$=aF(X,0,0,1,8)|0;X=Na+4|0;c[X>>2]=$;if(($|0)==0){_=12;W=297;break b}c[Na>>2]=3;c[Na+8>>2]=-1;c[Na+12>>2]=-1;c[$>>2]=fa;c[(c[X>>2]|0)+4>>2]=K;c[Na+16>>2]=(c[K+16>>2]|0)+(c[fa+16>>2]|0);R=0;S=L;T=Na;break};case 9:{Na=c[q>>2]|0;fa=a[Na]|0;switch(fa<<24>>24|0){case 43:case 63:{if((c[v>>2]&1|0)==0){R=0;S=L;T=K;break c}else{W=41}break};case 42:{W=41;break};case 92:{X=c[v>>2]|0;if((X&1|0)!=0){R=0;S=L;T=K;break c}$=Na+1|0;if((a[$]|0)!=123){R=0;S=L;T=K;break c}c[q>>2]=$;Zb=$;_b=X;break};case 123:{X=c[v>>2]|0;if((X&1|0)==0){R=0;S=L;T=K;break c}else{Zb=Na;_b=X}break};default:{R=0;S=L;T=K;break c}}if((W|0)==41){W=0;c[q>>2]=Na+1;Na=c[w>>2]|0;X=aF(Na,0,0,1,32)|0;if((X|0)==0){_=12;W=297;break b}$=aF(Na,0,0,1,16)|0;c[X+4>>2]=$;if(($|0)==0){_=12;W=297;break b}c[X>>2]=2;c[X+8>>2]=-1;c[X+12>>2]=-1;c[$>>2]=K;c[$+4>>2]=fa<<24>>24==43;c[$+8>>2]=fa<<24>>24==63?1:-1;fa=$+12|0;a[fa]=a[fa]&-2;c[X+16>>2]=c[K+16>>2];R=TE(m,9)|0;S=L;T=X;break c}X=Zb+1|0;c[q>>2]=X;fa=a[X]|0;if((fa-48&255)>>>0<10>>>0){$=fa<<24>>24;if(($-48|0)>>>0<10>>>0){$b=-1;ac=X;bc=$}else{_=10;W=297;break b}while(1){$=(($b|0)<0?-48:($b*10|0)-48|0)+bc|0;Na=ac+1|0;Y=a[Na]|0;Q=Y<<24>>24;if((Q-48|0)>>>0<10>>>0){$b=$;ac=Na;bc=Q}else{cc=$;dc=Na;ec=Y;break}}}else{cc=-1;dc=X;ec=fa}do{if(ec<<24>>24==44){Y=dc+1|0;Na=a[Y]|0;$=Na<<24>>24;if(($-48|0)>>>0<10>>>0){fc=-1;gc=Y;hc=$}else{ic=Y;jc=-1;kc=Na;break}while(1){Na=((fc|0)<0?-48:(fc*10|0)-48|0)+hc|0;Y=gc+1|0;$=a[Y]|0;Q=$<<24>>24;if((Q-48|0)>>>0<10>>>0){fc=Na;gc=Y;hc=Q}else{lc=Na;mc=Y;nc=$;W=54;break}}}else{lc=cc;mc=dc;nc=ec;W=54}}while(0);do{if((W|0)==54){W=0;if((lc|0)<=-1){ic=mc;jc=lc;kc=nc;break}if((cc|0)>(lc|0)|(lc|0)>255){_=10;W=297;break b}else{ic=mc;jc=lc;kc=nc}}}while(0);if(kc<<24>>24==0){_=9;W=297;break b}if((ic|0)==(X|0)){_=10;W=297;break b}if((_b&1|0)==0){if(kc<<24>>24!=92){_=10;W=297;break b}if((a[ic+1|0]|0)!=125){_=10;W=297;break b}oc=ic+2|0}else{if(kc<<24>>24!=125){_=10;W=297;break b}oc=ic+1|0}if((jc|cc|0)==0){fa=c[w>>2]|0;$=aF(fa,0,0,1,32)|0;if(($|0)==0){_=12;W=297;break b}Y=aF(fa,0,0,1,20)|0;c[$+4>>2]=Y;if((Y|0)==0){_=12;W=297;break b}c[$>>2]=0;c[$+8>>2]=-1;c[$+12>>2]=-1;c[Y>>2]=-1;c[Y+4>>2]=-1;c[Y+8>>2]=-1;pc=$}else{$=(jc&cc|0)<0;Y=c[w>>2]|0;fa=aF(Y,0,0,1,32)|0;if((fa|0)==0){_=12;W=297;break b}Na=aF(Y,0,0,1,16)|0;c[fa+4>>2]=Na;if((Na|0)==0){_=12;W=297;break b}c[fa>>2]=2;c[fa+8>>2]=-1;c[fa+12>>2]=-1;c[Na>>2]=K;c[Na+4>>2]=$?1:cc;c[Na+8>>2]=$?1:jc;$=Na+12|0;a[$]=a[$]&-2;c[fa+16>>2]=c[K+16>>2];pc=fa}c[q>>2]=oc;R=TE(m,9)|0;S=L;T=pc;break};case 6:{fa=M-2|0;c[n>>2]=fa;$=c[O+(fa<<2)>>2]|0;fa=c[w>>2]|0;Na=aF(fa,0,0,1,32)|0;if((Na|0)==0){_=12;W=297;break b}Y=aF(fa,0,0,1,8)|0;fa=Na+4|0;c[fa>>2]=Y;if((Y|0)==0){_=12;W=297;break b}c[Na>>2]=1;c[Na+8>>2]=-1;c[Na+12>>2]=-1;c[Y>>2]=$;c[(c[fa>>2]|0)+4>>2]=K;c[Na+16>>2]=(c[K+16>>2]|0)+(c[$+16>>2]|0);R=0;S=L;T=Na;break};case 2:{Na=M-2|0;c[n>>2]=Na;$=c[O+(Na<<2)>>2]|0;if((c[K+12>>2]|0)>-1){Na=c[w>>2]|0;fa=aF(Na,0,0,1,32)|0;if((fa|0)==0){_=12;W=297;break b}Y=aF(Na,0,0,1,20)|0;c[fa+4>>2]=Y;if((Y|0)==0){_=12;W=297;break b}c[fa>>2]=0;c[fa+8>>2]=-1;c[fa+12>>2]=-1;c[Y>>2]=-1;c[Y+4>>2]=-1;c[Y+8>>2]=-1;Y=c[w>>2]|0;Na=aF(Y,0,0,1,32)|0;if((Na|0)==0){_=12;W=297;break b}Q=aF(Y,0,0,1,8)|0;Y=Na+4|0;c[Y>>2]=Q;if((Q|0)==0){_=12;W=297;break b}c[Na>>2]=1;c[Na+8>>2]=-1;c[Na+12>>2]=-1;c[Q>>2]=fa;c[(c[Y>>2]|0)+4>>2]=K;Y=K+16|0;Q=Na+16|0;c[Q>>2]=(c[Y>>2]|0)+(c[fa+16>>2]|0);c[Q>>2]=c[Y>>2];qc=Na}else{qc=K}c[qc+12>>2]=$;$=qc+16|0;c[$>>2]=(c[$>>2]|0)+1;R=0;S=L;T=qc;break};case 10:{$=M-2|0;c[n>>2]=$;c[v>>2]=c[O+($<<2)>>2];R=0;S=L;T=K;break};default:{R=0;S=L;T=K}}}while(0);O=c[n>>2]|0;N=(R|0)==0;if((O|0)>(o|0)&N){K=T;L=S;M=O}else{rc=T;sc=S;tc=R;uc=N;break a}}if((W|0)==6){rc=K;sc=V;tc=U;uc=(U|0)==0;break}else if((W|0)==297){i=d;return _|0}}else{rc=0;sc=0;tc=p;uc=t}}while(0);t=(sc|0)>0;if(t|uc^1){_=t?8:tc;i=d;return _|0}c[b+8>>2]=rc;_=0;i=d;return _|0}function NE(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0;g=d+12|0;h=c[g>>2]|0;i=(b|0)==0|(f|0)==0;if(!i){c[f+48>>2]=0;c[c[f+36>>2]>>2]=-1}j=c[f+28>>2]|0;k=dF((j<<3)+8|0)|0;l=k;if((k|0)==0){m=12;return m|0}c[l>>2]=-1;n=dF((j<<2)+4|0)|0;o=n;if((n|0)==0){eF(k);m=12;return m|0}c[o>>2]=-1;p=0;while(1){if(p>>>0>j>>>0){break}else{p=p+1|0}}TE(d,e)|0;e=TE(d,0)|0;p=c[g>>2]|0;a:do{if((p|0)>(h|0)&(e|0)==0){j=d+16|0;q=f+32|0;r=f+16|0;s=f+36|0;t=0;u=-1;v=1;w=0;x=0;y=0;z=l;A=p;while(1){B=A-1|0;c[g>>2]=B;C=c[j>>2]|0;b:do{switch(c[C+(B<<2)>>2]|0){case 1:{D=A-2|0;c[g>>2]=D;E=c[C+(D<<2)>>2]|0;if(i){D=c[(c[c[E+4>>2]>>2]|0)+20>>2]|0;F=A-3|0;c[g>>2]=F;c[E+20>>2]=(c[C+(F<<2)>>2]|0)+D;G=0;H=z;I=y;J=x;K=w;L=v;M=-1;N=t;break b}else{D=A-3|0;c[g>>2]=D;F=c[C+(D<<2)>>2]|0;D=A-4|0;c[g>>2]=D;E=(F|0)==0;G=0;H=z;I=y;J=x;K=w;L=v;M=E?u:c[C+(D<<2)>>2]|0;N=E&1;break b}break};case 6:{E=A-2|0;c[g>>2]=E;D=c[C+(E<<2)>>2]|0;E=0;do{O=z+(E<<2)|0;E=E+1|0}while((c[O>>2]|0)>-1);c[O>>2]=D<<1|1;c[z+(E<<2)>>2]=-1;F=0;while(1){if((c[o+(F<<2)>>2]|0)>-1){F=F+1|0}else{break}}c[o+(F-1<<2)>>2]=-1;G=0;H=z;I=y;J=x;K=w;L=v;M=u;N=t;break};case 0:{E=A-2|0;c[g>>2]=E;D=c[C+(E<<2)>>2]|0;E=D;P=D+12|0;Q=c[P>>2]|0;if((Q|0)>-1){R=0;do{S=z+(R<<2)|0;R=R+1|0}while((c[S>>2]|0)>-1);c[S>>2]=Q<<1;c[z+(R<<2)>>2]=-1;do{if(!i){F=0;while(1){if((c[o+(F<<2)>>2]|0)>-1){F=F+1|0}else{break}}c[(c[r>>2]|0)+(Q*12|0)+8>>2]=0;if((F|0)<=0){break}T=dF((F<<2)+4|0)|0;U=T;if((T|0)==0){V=u;W=w;X=x;Y=y;Z=z;_=12;break a}c[(c[r>>2]|0)+(Q*12|0)+8>>2]=U;T=c[o>>2]|0;if((T|0)>-1){$=0;aa=T;T=U;while(1){c[T>>2]=aa;ba=$+1|0;ca=c[o+(ba<<2)>>2]|0;da=U+(ba<<2)|0;if((ca|0)>-1){$=ba;aa=ca;T=da}else{ea=da;break}}}else{ea=U}c[ea>>2]=-1}}while(0);Q=TE(d,c[P>>2]|0)|0;if((Q|0)!=0){V=u;W=w;X=x;Y=y;Z=z;_=Q;break a}Q=TE(d,6)|0;if((Q|0)!=0){V=u;W=w;X=x;Y=y;Z=z;_=Q;break a}}Q=c[D>>2]|0;do{if((Q|0)==3){R=c[D+4>>2]|0;T=c[R>>2]|0;aa=c[R+4>>2]|0;R=(c[z>>2]|0)>-1;$=v+1|0;F=TE(d,R?$:v)|0;if((F|0)!=0){fa=F;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}F=TE(d,R?v:w)|0;if((F|0)!=0){fa=F;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}F=TE(d,z)|0;if((F|0)!=0){fa=F;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}F=TE(d,(c[z>>2]|0)>>>31^1)|0;if((F|0)!=0){fa=F;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}F=TE(d,D)|0;if((F|0)!=0){fa=F;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}F=aa;aa=TE(d,F)|0;if((aa|0)!=0){fa=aa;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}aa=T;T=TE(d,aa)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}T=TE(d,3)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}T=TE(d,F)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}T=TE(d,0)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}T=TE(d,2)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}T=TE(d,aa)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}T=TE(d,0)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}if((c[z>>2]|0)>-1){if(i){ma=0;na=x;oa=u}else{T=VE(b,E,w)|0;c[(c[q>>2]|0)+(w<<2)>>2]=t;if((u|0)>-1){aa=c[s>>2]|0;F=0;while(1){pa=aa+(F<<2)|0;qa=F+1|0;if((c[pa>>2]|0)>-1){F=qa}else{break}}c[pa>>2]=w;c[(c[s>>2]|0)+(qa<<2)>>2]=u;c[(c[s>>2]|0)+(F+2<<2)>>2]=-1;ra=x+1|0;sa=-1}else{ra=x;sa=u}aa=c[z>>2]|0;if((aa|0)>-1){U=0;R=aa;do{aa=(R|0)/2|0;da=c[r>>2]|0;if((R&1|0)==0){c[da+(aa*12|0)>>2]=w}else{c[da+(aa*12|0)+4>>2]=w}U=U+1|0;R=c[z+(U<<2)>>2]|0;}while((R|0)>-1)}c[z>>2]=-1;ma=T;na=ra;oa=sa}c[z>>2]=-1;ta=ma;ua=y+1|0;va=na;wa=v;xa=$;ya=oa}else{ta=0;ua=y;va=x;wa=w;xa=v;ya=u}if((c[D+16>>2]|0)<=0){fa=ta;ga=ua;ha=va;ia=wa;ja=xa;ka=ya;la=t;break}fa=ta;ga=ua;ha=va;ia=xa+1|0;ja=xa+2|0;ka=ya;la=t}else if((Q|0)==2){R=c[D+4>>2]|0;if(i){if((c[z>>2]|0)>-1){za=1}else{za=a[R+12|0]&1}U=TE(d,za)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}}else{U=TE(d,w)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}U=TE(d,a[R+12|0]&1)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}}U=TE(d,D)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}U=TE(d,1)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}U=TE(d,c[R>>2]|0)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}U=TE(d,0)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}if((c[z>>2]|0)<=-1){if((a[R+12|0]&1)==0){fa=0;ga=y;ha=x;ia=w;ja=v;ka=u;la=0;break}}if(i){Aa=0;Ba=x;Ca=u}else{U=VE(b,E,w)|0;c[(c[q>>2]|0)+(w<<2)>>2]=(a[R+12|0]&1)==0?t:1;if((u|0)>-1){R=c[s>>2]|0;F=0;while(1){Da=R+(F<<2)|0;Ea=F+1|0;if((c[Da>>2]|0)>-1){F=Ea}else{break}}c[Da>>2]=w;c[(c[s>>2]|0)+(Ea<<2)>>2]=u;c[(c[s>>2]|0)+(F+2<<2)>>2]=-1;Fa=x+1|0;Ga=-1}else{Fa=x;Ga=u}R=c[z>>2]|0;if((R|0)>-1){$=0;T=R;do{R=(T|0)/2|0;aa=c[r>>2]|0;if((T&1|0)==0){c[aa+(R*12|0)>>2]=w}else{c[aa+(R*12|0)+4>>2]=w}$=$+1|0;T=c[z+($<<2)>>2]|0;}while((T|0)>-1)}c[z>>2]=-1;Aa=U;Ba=Fa;Ca=Ga}c[z>>2]=-1;fa=Aa;ga=y+1|0;ha=Ba;ia=v;ja=v+1|0;ka=Ca;la=0}else if((Q|0)==0){T=c[c[D+4>>2]>>2]|0;if(!((T|0)>-1|(T|0)==-4)){fa=0;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}if((c[z>>2]|0)<=-1){fa=0;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}if(i){c[D+20>>2]=1;Ha=0;Ia=x;Ja=u}else{T=VE(b,E,w)|0;c[(c[q>>2]|0)+(w<<2)>>2]=t;if((u|0)>-1){$=c[s>>2]|0;F=0;while(1){Ka=$+(F<<2)|0;La=F+1|0;if((c[Ka>>2]|0)>-1){F=La}else{break}}c[Ka>>2]=w;c[(c[s>>2]|0)+(La<<2)>>2]=u;c[(c[s>>2]|0)+(F+2<<2)>>2]=-1;Ma=x+1|0;Na=-1}else{Ma=x;Na=u}$=c[z>>2]|0;if(($|0)>-1){U=0;R=$;do{$=(R|0)/2|0;aa=c[r>>2]|0;if((R&1|0)==0){c[aa+($*12|0)>>2]=w}else{c[aa+($*12|0)+4>>2]=w}U=U+1|0;R=c[z+(U<<2)>>2]|0;}while((R|0)>-1)}c[z>>2]=-1;Ha=T;Ia=Ma;Ja=Na}c[z>>2]=-1;fa=Ha;ga=y+1|0;ha=Ia;ia=v;ja=v+1|0;ka=Ja;la=t}else if((Q|0)==1){R=c[D+4>>2]|0;U=c[R>>2]|0;F=c[R+4>>2]|0;R=TE(d,D)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}R=TE(d,5)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}R=TE(d,F)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}R=TE(d,0)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}R=U+20|0;$=TE(d,(c[R>>2]|0)+v|0)|0;if(($|0)!=0){fa=$;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}if((c[R>>2]|0)>0){R=(c[F+20>>2]|0)>0;Oa=(R&1)+v|0;Pa=R?v:-1}else{Oa=v;Pa=-1}R=TE(d,Pa)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=Oa;ka=u;la=t;break}R=TE(d,4)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=Oa;ka=u;la=t;break}R=TE(d,U)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=Oa;ka=u;la=t;break}fa=TE(d,0)|0;ga=y;ha=x;ia=w;ja=Oa;ka=u;la=t}else{fa=0;ga=y;ha=x;ia=w;ja=v;ka=u;la=t}}while(0);D=c[P>>2]|0;if((D|0)>-1){Qa=0}else{G=fa;H=z;I=ga;J=ha;K=ia;L=ja;M=ka;N=la;break b}do{Ra=o+(Qa<<2)|0;Qa=Qa+1|0}while((c[Ra>>2]|0)>-1);c[Ra>>2]=D;c[o+(Qa<<2)>>2]=-1;G=fa;H=z;I=ga;J=ha;K=ia;L=ja;M=ka;N=la;break};case 4:{P=A-2|0;c[g>>2]=P;Q=c[C+(P<<2)>>2]|0;P=A-3|0;c[g>>2]=P;G=0;H=z;I=y;J=x;K=(Q|0)>-1?Q:w;L=c[C+(P<<2)>>2]|0;M=u;N=t;break};case 5:{P=A-2|0;c[g>>2]=P;Q=c[C+(P<<2)>>2]|0;if(!i){G=0;H=z;I=y;J=x;K=w;L=v;M=u;N=t;break b}P=c[Q+4>>2]|0;c[Q+20>>2]=(c[(c[P+4>>2]|0)+20>>2]|0)+(c[(c[P>>2]|0)+20>>2]|0);G=0;H=z;I=y;J=x;K=w;L=v;M=u;N=t;break};case 2:{P=z;while(1){if((c[P>>2]|0)>-1){P=P+4|0}else{G=0;H=P;I=y;J=x;K=w;L=v;M=u;N=t;break}}break};case 3:{P=A-2|0;c[g>>2]=P;D=c[C+(P<<2)>>2]|0;P=A-3|0;c[g>>2]=P;Q=c[C+(P<<2)>>2]|0;P=A-4|0;c[g>>2]=P;E=c[C+(P<<2)>>2]|0;P=A-5|0;c[g>>2]=P;if(i){R=c[E+4>>2]|0;U=E+16|0;c[E+20>>2]=(c[(c[R>>2]|0)+20>>2]|0)+(c[C+(P<<2)>>2]|0)+(c[(c[R+4>>2]|0)+20>>2]|0)+((c[U>>2]|0)>0?2:0);Sa=c[g>>2]|0;Ta=c[j>>2]|0;Ua=U}else{Sa=P;Ta=C;Ua=E+16|0}E=Sa-1|0;c[g>>2]=E;P=c[Ta+(E<<2)>>2]|0;E=Sa-2|0;c[g>>2]=E;U=c[Ta+(E<<2)>>2]|0;E=Sa-3|0;c[g>>2]=E;R=c[Ta+(E<<2)>>2]|0;if((c[Ua>>2]|0)<=0){G=0;H=P;I=y;J=x;K=w;L=v;M=u;N=1;break b}if(i){Va=0}else{WE(b,D,U)|0;c[(c[q>>2]|0)+(U<<2)>>2]=1;U=WE(b,Q,R)|0;c[(c[q>>2]|0)+(R<<2)>>2]=1;Va=U}G=Va;H=P;I=y+2|0;J=x;K=w;L=v;M=u;N=1;break};default:{G=0;H=z;I=y;J=x;K=w;L=v;M=u;N=t}}}while(0);C=c[g>>2]|0;if((C|0)>(h|0)&(G|0)==0){t=N;u=M;v=L;w=K;x=J;y=I;z=H;A=C}else{V=M;W=K;X=J;Y=I;Z=H;_=G;break a}}}else{V=-1;W=0;X=0;Y=0;Z=l;_=e}}while(0);do{if(i){Wa=X}else{e=c[Z>>2]|0;if((e|0)>-1){l=f+16|0;G=0;H=e;do{e=(H|0)/2|0;I=c[l>>2]|0;if((H&1|0)==0){c[I+(e*12|0)>>2]=W}else{c[I+(e*12|0)+4>>2]=W}G=G+1|0;H=c[Z+(G<<2)>>2]|0;}while((H|0)>-1)}c[Z>>2]=-1;if((V|0)<=-1){Wa=X;break}H=f+36|0;G=c[H>>2]|0;l=0;while(1){Xa=G+(l<<2)|0;Ya=l+1|0;if((c[Xa>>2]|0)>-1){l=Ya}else{break}}c[Xa>>2]=W;c[(c[H>>2]|0)+(Ya<<2)>>2]=V;c[(c[H>>2]|0)+(l+2<<2)>>2]=-1;Wa=X+1|0}}while(0);c[f+48>>2]=Y;c[f+40>>2]=Y;c[f+44>>2]=Wa;eF(k);eF(n);m=_;return m|0}function OE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=a;a:while(1){a=c[f>>2]|0;do{if((a|0)==1){g=c[f+4>>2]|0;h=g;i=g+4|0;g=QE(c[(c[h>>2]|0)+28>>2]|0,c[(c[i>>2]|0)+24>>2]|0,b,d,e)|0;if((g|0)!=0){j=g;k=10;break a}g=OE(c[h>>2]|0,b,d,e)|0;if((g|0)==0){l=i}else{j=g;k=10;break a}}else if((a|0)==3){g=c[f+4>>2]|0;i=OE(c[g>>2]|0,b,d,e)|0;if((i|0)!=0){j=i;k=10;break a}l=g+4|0}else if((a|0)==2){g=c[f+4>>2]|0;i=g;if((c[g+8>>2]|0)!=-1){l=i;break}g=c[i>>2]|0;h=QE(c[g+28>>2]|0,c[g+24>>2]|0,b,d,e)|0;if((h|0)==0){l=i}else{j=h;k=10;break a}}else{j=0;k=10;break a}}while(0);f=c[l>>2]|0}if((k|0)==10){return j|0}return 0}function PE(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;b=c[a+4>>2]|0;if((b|0)==0){return}a=b+4|0;d=b;e=c[d>>2]|0;if((c[a>>2]|0)==0){f=e}else{g=0;h=e;while(1){do{if((c[h+(g<<5)+8>>2]|0)==0){i=h}else{e=c[h+(g<<5)+16>>2]|0;if((e|0)==0){j=h}else{eF(e);j=c[d>>2]|0}e=c[j+(g<<5)+28>>2]|0;if((e|0)==0){i=j;break}eF(e);i=c[d>>2]|0}}while(0);e=g+1|0;if(e>>>0<(c[a>>2]|0)>>>0){g=e;h=i}else{f=i;break}}}if((f|0)!=0){eF(f)}f=b+8|0;i=c[f>>2]|0;if((i|0)!=0){if((c[i+8>>2]|0)==0){k=i}else{h=i;while(1){i=c[h+16>>2]|0;if((i|0)!=0){eF(i)}if((c[h+40>>2]|0)==0){break}else{h=h+32|0}}k=c[f>>2]|0}eF(k)}k=b+16|0;f=c[k>>2]|0;if((f|0)!=0){h=b+28|0;i=c[h>>2]|0;if((i|0)==0){l=f}else{g=0;a=f;f=i;while(1){i=c[a+(g*12|0)+8>>2]|0;if((i|0)==0){m=f;n=a}else{eF(i);m=c[h>>2]|0;n=c[k>>2]|0}i=g+1|0;if(i>>>0<m>>>0){g=i;a=n;f=m}else{l=n;break}}}eF(l)}l=c[b+32>>2]|0;if((l|0)!=0){eF(l)}l=c[b+20>>2]|0;if((l|0)!=0){eF(l)}l=c[b+36>>2]|0;if((l|0)!=0){eF(l)}eF(b);return}function QE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;g=a|0;a=c[g>>2]|0;h=(a|0)>-1;if((d|0)==0){if(!h){i=0;return i|0}j=b|0;k=g;l=a;while(1){a:do{if((c[j>>2]|0)>-1){a=b;m=l;while(1){n=e+(m<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=a+32|0;if((c[n>>2]|0)<=-1){break a}a=n;m=c[k>>2]|0}}}while(0);m=k+32|0;a=c[m>>2]|0;if((a|0)>-1){k=m;l=a}else{i=0;break}}return i|0}if(!h){i=0;return i|0}h=b|0;l=g;b:while(1){g=c[h>>2]|0;c:do{if((g|0)>-1){k=l+4|0;e=l+8|0;j=l+16|0;a=l+20|0;m=l+24|0;n=l+28|0;o=l+12|0;p=b;q=-1;r=h;s=g;while(1){t=p;u=r;v=s;while(1){w=t+32|0;if((v|0)!=(q|0)){break}x=w|0;y=c[x>>2]|0;if((y|0)>-1){t=w;u=x;v=y}else{break c}}y=d+(c[f+(c[l>>2]<<2)>>2]<<5)|0;while(1){z=y+8|0;if((c[z>>2]|0)==0){break}else{y=y+32|0}}c[y+40>>2]=0;c[y>>2]=c[k>>2];c[y+4>>2]=c[e>>2];c[z>>2]=d+(c[f+(c[u>>2]<<2)>>2]<<5);c[y+12>>2]=c[u>>2];x=c[t+16>>2]|c[j>>2]|((c[a>>2]|0)!=0?4:0)|((c[m>>2]|0)!=0?8:0);A=y+20|0;c[A>>2]=x;B=c[n>>2]|0;if((B|0)>-1){c[y+24>>2]=B;c[A>>2]=x|256}else{c[y+24>>2]=c[a>>2]}x=c[m>>2]|0;if((x|0)==0){c[y+28>>2]=0}else{A=0;while(1){C=A+1|0;if((c[x+(A<<2)>>2]|0)==0){break}else{A=C}}A=dF(C<<2)|0;x=A;u=y+28|0;c[u>>2]=x;if((A|0)==0){i=12;D=50;break b}A=c[c[m>>2]>>2]|0;if((A|0)==0){E=x}else{B=0;F=A;A=x;while(1){c[A>>2]=F;x=B+1|0;G=c[(c[m>>2]|0)+(x<<2)>>2]|0;H=(c[u>>2]|0)+(x<<2)|0;if((G|0)==0){E=H;break}else{B=x;F=G;A=H}}}c[E>>2]=0}A=c[o>>2]|0;if((A|0)==0){I=0}else{F=0;while(1){if((c[A+(F<<2)>>2]|0)>-1){F=F+1|0}else{I=F;break}}}F=t+12|0;A=c[F>>2]|0;if((A|0)==0){J=0}else{B=0;while(1){if((c[A+(B<<2)>>2]|0)>-1){B=B+1|0}else{J=B;break}}}B=y+16|0;A=c[B>>2]|0;if((A|0)!=0){eF(A)}c[B>>2]=0;A=J+I|0;if((A|0)>0){t=dF((A<<2)+4|0)|0;A=t;c[B>>2]=A;if((t|0)==0){i=12;D=50;break b}t=c[o>>2]|0;d:do{if((t|0)==0){K=0}else{u=c[t>>2]|0;if((u|0)>-1){L=0;M=u;N=A}else{K=0;break}while(1){c[N+(L<<2)>>2]=M;u=L+1|0;H=c[(c[o>>2]|0)+(u<<2)>>2]|0;if((H|0)<=-1){K=u;break d}L=u;M=H;N=c[B>>2]|0}}}while(0);A=c[F>>2]|0;do{if((A|0)==0){O=K}else{t=c[A>>2]|0;if((t|0)<=-1){O=K;break}y=(K|0)>0;H=0;u=K;G=A;x=t;while(1){t=c[B>>2]|0;e:do{if(y){P=0;while(1){Q=P+1|0;if((c[t+(P<<2)>>2]|0)==(x|0)){R=u;S=G;break e}if((Q|0)<(K|0)){P=Q}else{D=41;break}}}else{D=41}}while(0);if((D|0)==41){D=0;c[t+(u<<2)>>2]=x;R=u+1|0;S=c[F>>2]|0}P=H+1|0;Q=c[S+(P<<2)>>2]|0;if((Q|0)>-1){H=P;u=R;G=S;x=Q}else{O=R;break}}}}while(0);c[(c[B>>2]|0)+(O<<2)>>2]=-1}F=w|0;A=c[F>>2]|0;if((A|0)>-1){p=w;q=v;r=F;s=A}else{break}}}}while(0);g=l+32|0;if((c[g>>2]|0)>-1){l=g}else{i=0;D=50;break}}if((D|0)==50){return i|0}return 0}function RE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;g=(e|0)==0;a:do{if(g){h=0}else{i=0;while(1){if((c[e+(i<<2)>>2]|0)<=-1){h=i;break a}i=i+1|0}}}while(0);i=0;while(1){if((c[b+(i<<5)>>2]|0)>-1){i=i+1|0}else{j=0;break}}while(1){if((c[d+(j<<5)>>2]|0)>-1){j=j+1|0}else{break}}k=aF(a,0,0,1,(j+i<<5)+32|0)|0;i=k;if((k|0)==0){l=0;return l|0}k=c[b>>2]|0;b:do{if((k|0)>-1){j=(h|0)>0;m=0;n=k;while(1){c[i+(m<<5)>>2]=n;c[i+(m<<5)+4>>2]=c[b+(m<<5)+4>>2];c[i+(m<<5)+8>>2]=c[b+(m<<5)+8>>2];c[i+(m<<5)+16>>2]=c[b+(m<<5)+16>>2]|f;c[i+(m<<5)+20>>2]=c[b+(m<<5)+20>>2];c[i+(m<<5)+24>>2]=c[b+(m<<5)+24>>2];c[i+(m<<5)+28>>2]=c[b+(m<<5)+28>>2];o=b+(m<<5)+12|0;p=c[o>>2]|0;q=(p|0)==0;if(q&g){c[i+(m<<5)+12>>2]=0}else{c:do{if(q){r=0}else{s=0;while(1){if((c[p+(s<<2)>>2]|0)<=-1){r=s;break c}s=s+1|0}}}while(0);p=aF(a,0,0,0,(r+h<<2)+4|0)|0;q=p;if((p|0)==0){l=0;break}if((r|0)>0){p=0;while(1){c[q+(p<<2)>>2]=c[(c[o>>2]|0)+(p<<2)>>2];s=p+1|0;if((s|0)<(r|0)){p=s}else{t=r;break}}}else{t=0}if(j){p=0;while(1){c[q+(p+t<<2)>>2]=c[e+(p<<2)>>2];o=p+1|0;if((o|0)<(h|0)){p=o}else{u=h;break}}}else{u=0}c[q+(u+t<<2)>>2]=-1;c[i+(m<<5)+12>>2]=q}p=m+1|0;o=c[b+(p<<5)>>2]|0;if((o|0)>-1){m=p;n=o}else{v=p;break b}}return l|0}else{v=0}}while(0);b=c[d>>2]|0;t=i+(v<<5)|0;d:do{if((b|0)>-1){u=0;h=b;e=v;r=t;while(1){c[r>>2]=h;c[i+(e<<5)+4>>2]=c[d+(u<<5)+4>>2];c[i+(e<<5)+8>>2]=c[d+(u<<5)+8>>2];c[i+(e<<5)+16>>2]=c[d+(u<<5)+16>>2];c[i+(e<<5)+20>>2]=c[d+(u<<5)+20>>2];c[i+(e<<5)+24>>2]=c[d+(u<<5)+24>>2];c[i+(e<<5)+28>>2]=c[d+(u<<5)+28>>2];g=d+(u<<5)+12|0;f=c[g>>2]|0;if((f|0)==0){c[i+(e<<5)+12>>2]=0}else{k=0;while(1){if((c[f+(k<<2)>>2]|0)>-1){k=k+1|0}else{break}}f=aF(a,0,0,0,(k<<2)+4|0)|0;q=f;if((f|0)==0){l=0;break}if((k|0)>0){f=0;while(1){c[q+(f<<2)>>2]=c[(c[g>>2]|0)+(f<<2)>>2];n=f+1|0;if((n|0)<(k|0)){f=n}else{w=k;break}}}else{w=0}c[q+(w<<2)>>2]=-1;c[i+(e<<5)+12>>2]=q}k=u+1|0;f=c[d+(k<<5)>>2]|0;g=k+v|0;n=i+(g<<5)|0;if((f|0)>-1){u=k;h=f;e=g;r=n}else{x=n;break d}}return l|0}else{x=t}}while(0);c[x>>2]=-1;l=i;return l|0}function SE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;g=a+12|0;h=c[g>>2]|0;i=(f|0)!=0;if(i){c[f>>2]=0}j=TE(a,b)|0;if((j|0)!=0){k=j;return k|0}j=a+16|0;b=(d|0)==0;l=(e|0)==0;a:while(1){m=c[g>>2]|0;if((m|0)<=(h|0)){k=0;n=28;break}o=m-1|0;c[g>>2]=o;m=c[(c[j>>2]|0)+(o<<2)>>2]|0;o=c[m>>2]|0;do{if((o|0)==1){p=c[m+4>>2]|0;q=TE(a,c[p>>2]|0)|0;if((q|0)!=0){k=q;n=28;break a}r=TE(a,c[p+4>>2]|0)|0}else if((o|0)==3){p=c[m+4>>2]|0;q=c[p>>2]|0;if((c[q+8>>2]|0)!=0){r=TE(a,q)|0;break}q=c[p+4>>2]|0;if((c[q+8>>2]|0)==0){continue a}r=TE(a,q)|0}else if((o|0)==0){q=c[m+4>>2]|0;p=c[q>>2]|0;if((p|0)==(-2|0)){if(l){continue a}c[e>>2]=c[e>>2]|c[q+4>>2];continue a}else if((p|0)!=(-3|0)){continue a}p=c[q+4>>2]|0;if((p|0)<=-1){continue a}b:do{if(!b){q=c[d>>2]|0;c:do{if((q|0)>-1){s=0;t=d;u=q;while(1){v=s+1|0;if((u|0)==(p|0)){break}w=d+(v<<2)|0;x=c[w>>2]|0;if((x|0)>-1){s=v;t=w;u=x}else{y=v;z=w;break c}}if((p|0)<0){y=s;z=t}else{break b}}else{y=0;z=d}}while(0);c[z>>2]=p;c[d+(y+1<<2)>>2]=-1}}while(0);if(!i){continue a}c[f>>2]=(c[f>>2]|0)+1;continue a}else if((o|0)==2){p=c[c[m+4>>2]>>2]|0;if((c[p+8>>2]|0)==0){continue a}r=TE(a,p)|0}else{continue a}}while(0);if((r|0)!=0){k=r;n=28;break}}if((n|0)==28){return k|0}return 0}function TE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=a+12|0;e=c[d>>2]|0;f=a|0;g=c[f>>2]|0;if((e|0)<(g|0)){c[(c[a+16>>2]|0)+(e<<2)>>2]=b;c[d>>2]=(c[d>>2]|0)+1;h=0;return h|0}d=c[a+4>>2]|0;if((g|0)>=(d|0)){h=12;return h|0}e=(c[a+8>>2]|0)+g|0;g=(e|0)>(d|0)?d:e;e=a+16|0;d=gF(c[e>>2]|0,g<<2)|0;if((d|0)==0){h=12;return h|0}else{c[f>>2]=g;c[e>>2]=d;TE(a,b)|0;return 0}return 0}function UE(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;k=d+12|0;l=c[k>>2]|0;TE(d,e)|0;e=TE(d,0)|0;a:do{if((e|0)==0){m=d+16|0;n=(f&1|0)==0;o=(f&2|0)==0;p=i;q=1;r=0;b:while(1){s=c[k>>2]|0;if((s|0)<=(l|0)){t=r;u=0;break a}v=s-1|0;c[k>>2]=v;w=c[m>>2]|0;x=c[w+(v<<2)>>2]|0;if((x|0)==1){v=s-2|0;c[k>>2]=v;p=c[w+(v<<2)>>2]|0;q=q;r=r;continue}else if((x|0)!=0){p=p;q=q;r=r;continue}x=s-2|0;c[k>>2]=x;s=c[w+(x<<2)>>2]|0;x=c[s>>2]|0;do{if((x|0)==0){w=c[s+4>>2]|0;v=c[w+8>>2]|0;y=c[w>>2]|0;z=c[w+4>>2]|0;do{if((y|0)>-1|(y|0)==-4){A=r+1|0;B=q;C=z;D=y;E=(c[g>>2]|0)+v|0}else{if((y|0)!=-3){A=r;B=q;C=z;D=y;E=v;break}if(!n){A=r;B=q;C=-1;D=-1;E=-1;break}if(o|(q|0)==0){A=r;B=q;C=z;D=-3;E=v;break}c[h+(z<<2)>>2]=1;A=r;B=0;C=z;D=-3;E=v}}while(0);v=aF(b,0,0,1,32)|0;z=v;do{if((v|0)==0){F=0}else{y=aF(b,0,0,1,20)|0;c[v+4>>2]=y;if((y|0)==0){F=0;break}c[v>>2]=0;c[v+8>>2]=-1;c[v+12>>2]=-1;c[y>>2]=D;c[y+4>>2]=C;c[y+8>>2]=E;F=z}}while(0);c[p>>2]=F;z=(F|0)==0?12:0;if((E|0)<=(c[j>>2]|0)){G=z;H=A;I=B;J=p;break}c[j>>2]=E;G=z;H=A;I=B;J=p}else if((x|0)==1){z=c[s+4>>2]|0;v=z;y=c[v>>2]|0;w=z+4|0;z=c[w>>2]|0;K=aF(b,0,0,1,32)|0;if((K|0)==0){L=29;break b}M=aF(b,0,0,1,8)|0;N=K+4|0;c[N>>2]=M;if((M|0)==0){L=29;break b}c[K>>2]=1;c[K+8>>2]=-1;c[K+12>>2]=-1;c[M>>2]=y;c[(c[N>>2]|0)+4>>2]=z;c[K+16>>2]=(c[z+16>>2]|0)+(c[y+16>>2]|0);c[p>>2]=K;K=c[N>>2]|0;N=K;c[N>>2]=0;y=K+4|0;c[y>>2]=0;K=TE(d,c[w>>2]|0)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,0)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,y)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,1)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,c[v>>2]|0)|0;if((K|0)!=0){t=r;u=K;break a}G=TE(d,0)|0;H=r;I=q;J=N}else if((x|0)==2){N=c[s+4>>2]|0;K=N;v=TE(d,c[K>>2]|0)|0;if((v|0)!=0){t=r;u=v;break a}v=TE(d,0)|0;if((v|0)!=0){t=r;u=v;break a}v=c[K>>2]|0;K=c[N+4>>2]|0;y=c[N+8>>2]|0;w=a[N+12|0]|0;N=aF(b,0,0,1,32)|0;if((N|0)==0){L=40;break b}z=aF(b,0,0,1,16)|0;M=N+4|0;c[M>>2]=z;if((z|0)==0){L=40;break b}c[N>>2]=2;c[N+8>>2]=-1;c[N+12>>2]=-1;c[z>>2]=v;c[z+4>>2]=K;c[z+8>>2]=y;y=z+12|0;a[y]=a[y]&-2|w&1;c[N+16>>2]=c[v+16>>2];c[p>>2]=N;p=c[M>>2]|0;q=q;r=r;continue b}else if((x|0)==3){M=c[s+4>>2]|0;N=M;v=c[N>>2]|0;w=M+4|0;M=c[w>>2]|0;y=aF(b,0,0,1,32)|0;if((y|0)==0){L=20;break b}z=aF(b,0,0,1,8)|0;K=y+4|0;c[K>>2]=z;if((z|0)==0){L=20;break b}c[y>>2]=3;c[y+8>>2]=-1;c[y+12>>2]=-1;c[z>>2]=v;c[(c[K>>2]|0)+4>>2]=M;c[y+16>>2]=(c[M+16>>2]|0)+(c[v+16>>2]|0);c[p>>2]=y;y=c[K>>2]|0;K=TE(d,c[w>>2]|0)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,0)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,y+4|0)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,1)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,c[N>>2]|0)|0;if((K|0)!=0){t=r;u=K;break a}G=TE(d,0)|0;H=r;I=q;J=y}else{p=p;q=q;r=r;continue b}}while(0);if((G|0)==0){p=J;q=I;r=H}else{t=H;u=G;break a}}if((L|0)==20){c[p>>2]=0;t=r;u=12;break}else if((L|0)==29){c[p>>2]=0;t=r;u=12;break}else if((L|0)==40){c[p>>2]=0;t=r;u=12;break}}else{t=0;u=e}}while(0);c[g>>2]=(c[g>>2]|0)+t;return u|0}function VE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=aF(a,0,0,0,8)|0;if((e|0)==0){f=12;return f|0}g=aF(a,0,0,1,32)|0;h=g;do{if((g|0)!=0){i=aF(a,0,0,1,20)|0;c[g+4>>2]=i;if((i|0)==0){break}c[g>>2]=0;c[g+8>>2]=-1;c[g+12>>2]=-1;c[i>>2]=-3;c[i+4>>2]=d;c[i+8>>2]=-1;c[e>>2]=h;i=aF(a,0,0,0,32)|0;j=e+4|0;c[j>>2]=i;if((i|0)==0){f=12;return f|0}k=b+4|0;c[i+4>>2]=c[k>>2];i=b|0;c[c[j>>2]>>2]=c[i>>2];c[(c[j>>2]|0)+8>>2]=-1;c[(c[j>>2]|0)+12>>2]=-1;c[(c[j>>2]|0)+24>>2]=0;c[(c[j>>2]|0)+28>>2]=0;c[(c[j>>2]|0)+20>>2]=0;c[k>>2]=e;c[i>>2]=1;f=0;return f|0}}while(0);c[e>>2]=0;f=12;return f|0}function WE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=aF(a,0,0,0,8)|0;if((e|0)==0){f=12;return f|0}g=aF(a,0,0,1,32)|0;h=g;do{if((g|0)!=0){i=aF(a,0,0,1,20)|0;c[g+4>>2]=i;if((i|0)==0){break}c[g>>2]=0;c[g+8>>2]=-1;c[g+12>>2]=-1;c[i>>2]=-3;c[i+4>>2]=d;c[i+8>>2]=-1;c[e+4>>2]=h;i=aF(a,0,0,0,32)|0;j=e;c[j>>2]=i;if((i|0)==0){f=12;return f|0}k=b+4|0;c[i+4>>2]=c[k>>2];i=b|0;c[c[j>>2]>>2]=c[i>>2];c[(c[j>>2]|0)+8>>2]=-1;c[(c[j>>2]|0)+12>>2]=-1;c[(c[j>>2]|0)+24>>2]=0;c[(c[j>>2]|0)+28>>2]=0;c[(c[j>>2]|0)+20>>2]=0;c[k>>2]=e;c[i>>2]=1;f=0;return f|0}}while(0);c[e+4>>2]=0;f=12;return f|0}function XE(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[c[(c[a>>2]|0)+4>>2]>>2]|0;a=c[c[(c[b>>2]|0)+4>>2]>>2]|0;if((d|0)<(a|0)){e=-1;return e|0}e=(d|0)>(a|0)|0;return e|0}function YE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0;g=i;i=i+16|0;h=g|0;j=g+8|0;k=c[a+4>>2]|0;a=k;l=k+40|0;m=c[l>>2]|0;do{if((m|0)<1|(d|0)==0){n=0}else{o=dF(m<<2)|0;if((o|0)==0){p=12}else{n=o;break}i=g;return p|0}}while(0);m=n;a:do{if((c[k+60>>2]|0)==0){c[h>>2]=0;o=f&1;q=f&2;r=k+56|0;s=c[r>>2]&4;if((n|0)==0){t=0}else{t=c[l>>2]|0}u=t<<2;v=c[k+52>>2]|0;w=v<<3;x=w+8|0;y=u+12+w+(x+(da(u,v)|0)<<1)|0;z=dF(y)|0;if((z|0)==0){A=12;break}vF(z|0,0,y|0)|0;y=z;B=z+u&3;C=((B|0)==0?0:4-B|0)+u|0;B=z+C|0;D=C+x|0;C=z+D&3;E=((C|0)==0?0:4-C|0)+D|0;D=z+E|0;C=E+x|0;x=z+C&3;E=((x|0)==0?0:4-x|0)+C|0;C=z+E|0;x=E+w|0;w=z+x&3;if((v|0)>0){E=t<<3;F=0;G=z+(((w|0)==0?0:4-w|0)+x)|0;while(1){c[D+(F<<3)+4>>2]=G;c[B+(F<<3)+4>>2]=G+u;x=F+1|0;if((x|0)<(v|0)){F=x;G=G+E|0}else{H=0;break}}do{c[C+(H<<3)>>2]=-1;H=H+1|0;}while((H|0)<(v|0))}v=KE(h,b,4)|0;if((v|0)<1){if((v|0)<0){A=1;break}I=v+1|0}else{I=v}v=k+8|0;E=(s|0)==0;G=(o|0)==0;F=(t|0)>0;u=k+12|0;x=k+44|0;w=k+32|0;J=k+36|0;K=(t|0)==0;L=F^1;M=0;N=b+I|0;O=0;P=I;Q=D;R=y;S=0;T=-1;U=B;V=B;while(1){if((T|0)<0){W=c[v>>2]|0;X=W+8|0;b:do{if((c[X>>2]|0)==0){Y=V;Z=T;_=S}else{$=(O|0)==0;aa=(M|0)==95;ba=(O|0)<1&G;ca=((M|0)!=10|E)^1;ea=V;fa=T;ga=S;ha=W;ia=X;while(1){ja=ha;ka=ia;c:while(1){la=ja+12|0;if((c[C+(c[la>>2]<<3)>>2]|0)>=(O|0)){ma=ga;na=fa;oa=ea;break}pa=ja+20|0;qa=c[pa>>2]|0;if((qa|0)==0){ra=260;break}d:do{if((qa&1|0)==0|ba|ca){if((qa&2|0)!=0){sa=c[h>>2]|0;if((sa|q|0)!=0&((sa|0)!=10|E)){break}}do{if((qa&16|0)!=0){if(aa){break d}if((tE(M)|0)!=0){break d}sa=c[h>>2]|0;if((sa|0)==95){break}if((tE(sa)|0)==0){break d}}}while(0);sa=c[pa>>2]|0;if((sa&32|0)==0){ta=sa}else{if(!aa){if((tE(M)|0)==0){break}}sa=c[h>>2]|0;if((sa|0)==95){break}if((tE(sa)|0)!=0){break}ta=c[pa>>2]|0}do{if((ta&64|0)==0|$){ua=ta}else{sa=c[h>>2]|0;if((sa|0)==0){ua=ta;break}if(aa){va=1;wa=sa}else{sa=(tE(M)|0)!=0|0;va=sa;wa=c[h>>2]|0}if((wa|0)==95){xa=1}else{xa=(tE(wa)|0)!=0|0}if((va|0)==(xa|0)){break d}ua=c[pa>>2]|0}}while(0);if((ua&128|0)==0){ra=260;break c}if($){break}sa=c[h>>2]|0;if((sa|0)==0){break}if(aa){ya=1;za=sa}else{sa=(tE(M)|0)!=0|0;ya=sa;za=c[h>>2]|0}if((za|0)==95){Aa=1}else{Aa=(tE(za)|0)!=0|0}if((ya|0)==(Aa|0)){ra=260;break c}}}while(0);pa=ja+40|0;if((c[pa>>2]|0)==0){Y=ea;Z=fa;_=ga;break b}else{ja=ja+32|0;ka=pa}}if((ra|0)==260){ra=0;pa=ea|0;c[pa>>2]=c[ka>>2];if(F){qa=ea+4|0;sa=0;do{c[(c[qa>>2]|0)+(sa<<2)>>2]=-1;sa=sa+1|0;}while((sa|0)<(t|0))}sa=c[ja+16>>2]|0;do{if((sa|0)!=0){qa=c[sa>>2]|0;if((qa|0)<=-1){break}ka=ea+4|0;Ba=sa;Ca=qa;do{if((Ca|0)<(t|0)){c[(c[ka>>2]|0)+(Ca<<2)>>2]=O}Ba=Ba+4|0;Ca=c[Ba>>2]|0;}while((Ca|0)>-1)}}while(0);sa=(c[pa>>2]|0)!=(c[u>>2]|0);if(sa|L){Da=sa?ga:1;Ea=sa?fa:O;Fa=ea+4|0}else{sa=ea+4|0;Ca=0;while(1){c[n+(Ca<<2)>>2]=c[(c[sa>>2]|0)+(Ca<<2)>>2];Ba=Ca+1|0;if((Ba|0)<(t|0)){Ca=Ba}else{Da=1;Ea=O;Fa=sa;break}}}c[C+(c[la>>2]<<3)>>2]=O;c[C+(c[la>>2]<<3)+4>>2]=Fa;ma=Da;na=Ea;oa=ea+8|0}sa=ja+40|0;if((c[sa>>2]|0)==0){Y=oa;Z=na;_=ma;break}else{ea=oa;fa=na;ga=ma;ha=ja+32|0;ia=sa}}}}while(0);c[Y>>2]=0;Ga=_;Ha=Z}else{if(K|(V|0)==(U|0)){Ia=T;break}else{Ga=S;Ha=T}}X=c[h>>2]|0;if((X|0)==0){Ia=Ha;break}W=O+P|0;ia=KE(h,N,4)|0;if((ia|0)<1){if((ia|0)<0){A=1;break a}Ja=ia+1|0}else{Ja=ia}ia=N+Ja|0;if((c[x>>2]|0)==0|(Ga|0)==0){Ka=U;La=Ga;Ma=Q}else{ha=U|0;ga=c[ha>>2]|0;if((ga|0)==0){Na=Q}else{fa=Q;ea=ha;ha=ga;while(1){ga=c[J>>2]|0;aa=c[ga>>2]|0;$=ea+4|0;e:do{if((aa|0)>-1){ca=0;ba=aa;while(1){sa=c[ga+((ca|1)<<2)>>2]|0;if((ba|0)>=(t|0)){Oa=fa;break e}Ca=c[$>>2]|0;if((c[Ca+(sa<<2)>>2]|0)==(c[n+(sa<<2)>>2]|0)){if((c[Ca+(ba<<2)>>2]|0)<(c[n+(ba<<2)>>2]|0)){Oa=fa;break e}}Ca=ca+2|0;sa=c[ga+(Ca<<2)>>2]|0;if((sa|0)>-1){ca=Ca;ba=sa}else{ra=288;break}}}else{ra=288}}while(0);if((ra|0)==288){ra=0;c[fa>>2]=ha;ga=fa+4|0;aa=c[ga>>2]|0;c[ga>>2]=c[$>>2];c[$>>2]=aa;Oa=fa+8|0}aa=ea+8|0;ga=c[aa>>2]|0;if((ga|0)==0){Na=Oa;break}else{fa=Oa;ea=aa;ha=ga}}}c[Na>>2]=0;Ka=Q;La=0;Ma=U}ha=c[Ka>>2]|0;if((ha|0)==0){Pa=Ma;Qa=Ha;Ra=La;Sa=R}else{ea=(W|0)==0;fa=(X|0)==95;ga=(W|0)<1&G;aa=((X|0)!=10|E)^1;ba=Ka;ca=Ma;ja=Ha;sa=La;Ca=R;pa=ha;while(1){ha=pa+8|0;if((c[ha>>2]|0)==0){Ta=ca;Ua=ja;Va=sa;Wa=Ca}else{Ba=ba+4|0;ka=ca;qa=ja;Xa=sa;Ya=Ca;_a=pa;$a=ha;while(1){f:do{if((c[_a>>2]|0)>>>0>X>>>0){ab=Ya;bb=Xa;cb=qa;db=ka}else{if((c[_a+4>>2]|0)>>>0<X>>>0){ab=Ya;bb=Xa;cb=qa;db=ka;break}ha=_a+20|0;eb=c[ha>>2]|0;g:do{if((eb|0)!=0){if(!((eb&1|0)==0|ga|aa)){ab=Ya;bb=Xa;cb=qa;db=ka;break f}if((eb&2|0)!=0){fb=c[h>>2]|0;if((fb|q|0)!=0&((fb|0)!=10|E)){ab=Ya;bb=Xa;cb=qa;db=ka;break f}}do{if((eb&16|0)!=0){if(fa){ab=Ya;bb=Xa;cb=qa;db=ka;break f}if((tE(X)|0)!=0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}fb=c[h>>2]|0;if((fb|0)==95){break}if((tE(fb)|0)==0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}}}while(0);fb=c[ha>>2]|0;if((fb&32|0)==0){gb=fb}else{if(!fa){if((tE(X)|0)==0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}}fb=c[h>>2]|0;if((fb|0)==95){ab=Ya;bb=Xa;cb=qa;db=ka;break f}if((tE(fb)|0)!=0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}gb=c[ha>>2]|0}do{if((gb&64|0)==0|ea){hb=gb}else{fb=c[h>>2]|0;if((fb|0)==0){hb=gb;break}if(fa){ib=1;jb=fb}else{fb=(tE(X)|0)!=0|0;ib=fb;jb=c[h>>2]|0}if((jb|0)==95){kb=1}else{kb=(tE(jb)|0)!=0|0}if((ib|0)==(kb|0)){ab=Ya;bb=Xa;cb=qa;db=ka;break f}hb=c[ha>>2]|0}}while(0);if((hb&128|0)==0){lb=hb}else{if(ea){ab=Ya;bb=Xa;cb=qa;db=ka;break f}fb=c[h>>2]|0;if((fb|0)==0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}if(fa){mb=1;nb=fb}else{fb=(tE(X)|0)!=0|0;mb=fb;nb=c[h>>2]|0}if((nb|0)==95){ob=1}else{ob=(tE(nb)|0)!=0|0}if((mb|0)!=(ob|0)){ab=Ya;bb=Xa;cb=qa;db=ka;break f}lb=c[ha>>2]|0}do{if((lb&4|0)==0){pb=lb}else{if((c[r>>2]&2|0)!=0){pb=lb;break}if((xE(X,c[_a+24>>2]|0)|0)==0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}pb=c[ha>>2]|0}}while(0);do{if((pb&4|0)!=0){if((c[r>>2]&2|0)==0){break}fb=JE(X)|0;qb=_a+24|0;if((xE(fb,c[qb>>2]|0)|0)!=0){break}fb=HE(X)|0;if((xE(fb,c[qb>>2]|0)|0)==0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}}}while(0);if((c[ha>>2]&8|0)==0){break}qb=c[_a+28>>2]|0;fb=c[qb>>2]|0;if((fb|0)==0){break}if((c[r>>2]&2|0)==0){rb=qb;sb=fb;while(1){if((xE(X,sb)|0)!=0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}rb=rb+4|0;sb=c[rb>>2]|0;if((sb|0)==0){break g}}}else{tb=qb}do{sb=HE(X)|0;if((xE(sb,c[tb>>2]|0)|0)!=0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}sb=JE(X)|0;if((xE(sb,c[tb>>2]|0)|0)!=0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}tb=tb+4|0;}while((c[tb>>2]|0)!=0)}}while(0);if(F){ha=0;do{c[Ya+(ha<<2)>>2]=c[(c[Ba>>2]|0)+(ha<<2)>>2];ha=ha+1|0;}while((ha|0)<(t|0))}ha=c[_a+16>>2]|0;do{if((ha|0)!=0){eb=c[ha>>2]|0;if((eb|0)>-1){ub=ha;vb=eb}else{break}do{if((vb|0)<(t|0)){c[Ya+(vb<<2)>>2]=W}ub=ub+4|0;vb=c[ub>>2]|0;}while((vb|0)>-1)}}while(0);ha=_a+12|0;eb=c[ha>>2]|0;if((c[C+(eb<<3)>>2]|0)<(W|0)){qb=ka|0;c[qb>>2]=c[$a>>2];sb=ka+4|0;rb=c[sb>>2]|0;c[sb>>2]=Ya;c[C+(c[ha>>2]<<3)>>2]=W;c[C+(c[ha>>2]<<3)+4>>2]=sb;do{if((c[qb>>2]|0)==(c[u>>2]|0)){if((qa|0)==-1){if(F){wb=0}else{xb=1;yb=W;break}}else{if(!F){xb=Xa;yb=qa;break}if((c[c[sb>>2]>>2]|0)>(c[n>>2]|0)){xb=Xa;yb=qa;break}else{wb=0}}while(1){c[n+(wb<<2)>>2]=c[(c[sb>>2]|0)+(wb<<2)>>2];ha=wb+1|0;if((ha|0)<(t|0)){wb=ha}else{xb=1;yb=W;break}}}else{xb=Xa;yb=qa}}while(0);ab=rb;bb=xb;cb=yb;db=ka+8|0;break}sb=c[w>>2]|0;qb=c[C+(eb<<3)+4>>2]|0;ha=c[qb>>2]|0;if(F){zb=0}else{ab=Ya;bb=Xa;cb=qa;db=ka;break}while(1){fb=c[Ya+(zb<<2)>>2]|0;Ab=c[ha+(zb<<2)>>2]|0;if((c[sb+(zb<<2)>>2]|0)==0){if((fb|0)<(Ab|0)){break}if((fb|0)>(Ab|0)){ab=Ya;bb=Xa;cb=qa;db=ka;break f}}else{if((fb|0)>(Ab|0)){break}if((fb|0)<(Ab|0)){ab=Ya;bb=Xa;cb=qa;db=ka;break f}}Ab=zb+1|0;if((Ab|0)<(t|0)){zb=Ab}else{ab=Ya;bb=Xa;cb=qa;db=ka;break f}}c[qb>>2]=Ya;if((c[$a>>2]|0)==(c[u>>2]|0)){Bb=0}else{ab=ha;bb=Xa;cb=qa;db=ka;break}while(1){c[n+(Bb<<2)>>2]=c[Ya+(Bb<<2)>>2];sb=Bb+1|0;if((sb|0)<(t|0)){Bb=sb}else{ab=ha;bb=1;cb=W;db=ka;break}}}}while(0);ha=_a+40|0;if((c[ha>>2]|0)==0){Ta=db;Ua=cb;Va=bb;Wa=ab;break}else{ka=db;qa=cb;Xa=bb;Ya=ab;_a=_a+32|0;$a=ha}}}$a=ba+8|0;_a=c[$a>>2]|0;if((_a|0)==0){Pa=Ta;Qa=Ua;Ra=Va;Sa=Wa;break}else{ba=$a;ca=Ta;ja=Ua;sa=Va;Ca=Wa;pa=_a}}}c[Pa>>2]=0;M=X;N=ia;O=W;P=Ja;Q=Ka;R=Sa;S=Ra;T=Qa;U=Ma;V=Pa}eF(z);Cb=Ia>>>31;Db=Ia;ra=373}else{c[j>>2]=0;V=f&1;U=f&2;T=k+56|0;S=c[T>>2]&4;R=_E(0,0)|0;if((R|0)==0){A=12;break}Q=aF(R,0,0,0,32)|0;P=Q;if((Q|0)==0){$E(R);A=12;break}c[Q+24>>2]=0;c[Q+28>>2]=0;Q=c[l>>2]|0;if((Q|0)==0){Eb=0;ra=9}else{O=dF(Q<<2)|0;N=O;if((O|0)==0){Fb=12;Gb=0;Hb=0;Ib=N;Jb=0}else{Eb=N;ra=9}}do{if((ra|0)==9){N=Eb;O=c[k+28>>2]|0;if((O|0)==0){Kb=0}else{M=dF(O<<3)|0;O=M;if((M|0)==0){Fb=12;Gb=O;Hb=0;Ib=Eb;Jb=0;break}else{Kb=O}}O=k+52|0;M=c[O>>2]|0;if((M|0)==0){Lb=0}else{u=dF(M<<2)|0;M=u;if((u|0)==0){Fb=12;Gb=Kb;Hb=M;Ib=Eb;Jb=0;break}else{Lb=M}}M=Lb;u=(n|0)==0;F=k+8|0;C=k+12|0;w=k+32|0;r=(S|0)==0;E=(V|0)==0;q=b;G=1;J=-1;x=-1;K=P;L=Q;h:while(1){do{if((L|0)>0){if(u){vF(N|0,-1|0,L<<2|0)|0;break}else{v=0;do{c[Eb+(v<<2)>>2]=-1;c[n+(v<<2)>>2]=-1;v=v+1|0;}while((v|0)<(c[l>>2]|0))}}}while(0);v=c[O>>2]|0;if((v|0)>0){vF(M|0,0,v<<2|0)|0}v=c[j>>2]|0;B=G+J|0;y=KE(j,q,4)|0;if((y|0)<1){if((y|0)<0){A=1;break a}Mb=y+1|0}else{Mb=y}y=q+Mb|0;D=c[j>>2]|0;o=c[F>>2]|0;s=o+8|0;if((c[s>>2]|0)==0){Nb=Mb;Ob=x;Pb=K;Qb=0;ra=195}else{pa=(B|0)==0;Ca=(v|0)==95;sa=(B|0)<1&E;ja=((v|0)!=10|r)^1;ca=0;ba=0;fa=K;ea=o;o=s;while(1){s=ea+20|0;aa=c[s>>2]|0;i:do{if((aa|0)==0){ra=56}else{if(!((aa&1|0)==0|sa|ja)){Rb=fa;Sb=ba;Tb=ca;break}if((aa&2|0)!=0){ga=c[j>>2]|0;if((ga|U|0)!=0&((ga|0)!=10|r)){Rb=fa;Sb=ba;Tb=ca;break}}do{if((aa&16|0)!=0){if(Ca){Rb=fa;Sb=ba;Tb=ca;break i}if((tE(v)|0)!=0){Rb=fa;Sb=ba;Tb=ca;break i}ga=c[j>>2]|0;if((ga|0)==95){break}if((tE(ga)|0)==0){Rb=fa;Sb=ba;Tb=ca;break i}}}while(0);ga=c[s>>2]|0;if((ga&32|0)==0){Ub=ga}else{if(!Ca){if((tE(v)|0)==0){Rb=fa;Sb=ba;Tb=ca;break}}ga=c[j>>2]|0;if((ga|0)==95){Rb=fa;Sb=ba;Tb=ca;break}if((tE(ga)|0)!=0){Rb=fa;Sb=ba;Tb=ca;break}Ub=c[s>>2]|0}do{if((Ub&64|0)==0|pa){Vb=Ub}else{ga=c[j>>2]|0;if((ga|0)==0){Vb=Ub;break}if(Ca){Wb=1;Xb=ga}else{ga=(tE(v)|0)!=0|0;Wb=ga;Xb=c[j>>2]|0}if((Xb|0)==95){Yb=1}else{Yb=(tE(Xb)|0)!=0|0}if((Wb|0)==(Yb|0)){Rb=fa;Sb=ba;Tb=ca;break i}Vb=c[s>>2]|0}}while(0);if((Vb&128|0)==0){ra=56;break}if(pa){Rb=fa;Sb=ba;Tb=ca;break}ga=c[j>>2]|0;if((ga|0)==0){Rb=fa;Sb=ba;Tb=ca;break}if(Ca){Zb=1;_b=ga}else{ga=(tE(v)|0)!=0|0;Zb=ga;_b=c[j>>2]|0}if((_b|0)==95){$b=1}else{$b=(tE(_b)|0)!=0|0}if((Zb|0)==($b|0)){ra=56}else{Rb=fa;Sb=ba;Tb=ca}}}while(0);do{if((ra|0)==56){ra=0;if((ca|0)==0){Rb=fa;Sb=c[ea+16>>2]|0;Tb=c[o>>2]|0;break}s=fa+28|0;aa=c[s>>2]|0;if((aa|0)==0){ga=aF(R,0,0,0,32)|0;_a=ga;if((ga|0)==0){ra=60;break h}c[ga+24>>2]=fa;c[ga+28>>2]=0;$a=aF(R,0,0,0,c[l>>2]<<2)|0;c[ga+20>>2]=$a;if(($a|0)==0){ra=67;break h}c[s>>2]=_a;ac=_a}else{ac=aa}c[ac>>2]=B;c[ac+4>>2]=y;c[ac+8>>2]=c[o>>2];c[ac+12>>2]=c[ea+12>>2];c[ac+16>>2]=c[j>>2];if((c[l>>2]|0)>0){aa=ac+20|0;_a=0;do{c[(c[aa>>2]|0)+(_a<<2)>>2]=c[Eb+(_a<<2)>>2];_a=_a+1|0;}while((_a|0)<(c[l>>2]|0))}_a=c[ea+16>>2]|0;if((_a|0)==0){Rb=ac;Sb=ba;Tb=ca;break}aa=c[_a>>2]|0;if((aa|0)<=-1){Rb=ac;Sb=ba;Tb=ca;break}s=ac+20|0;$a=_a;_a=aa;while(1){aa=$a+4|0;c[(c[s>>2]|0)+(_a<<2)>>2]=B;ga=c[aa>>2]|0;if((ga|0)>-1){$a=aa;_a=ga}else{Rb=ac;Sb=ba;Tb=ca;break}}}}while(0);_a=ea+40|0;if((c[_a>>2]|0)==0){break}else{ca=Tb;ba=Sb;fa=Rb;ea=ea+32|0;o=_a}}do{if((Sb|0)==0){bc=0}else{o=c[Sb>>2]|0;if((o|0)>-1){cc=Sb;dc=o}else{bc=Sb;break}while(1){c[Eb+(dc<<2)>>2]=B;o=cc+4|0;ea=c[o>>2]|0;if((ea|0)>-1){cc=o;dc=ea}else{bc=o;break}}}}while(0);if((Tb|0)==0){Nb=Mb;Ob=x;Pb=Rb;Qb=bc;ra=195}else{ec=y;fc=B;gc=Mb;hc=x;ic=Rb;jc=bc;kc=Tb}}j:while(1){if((ra|0)==195){ra=0;o=Pb+24|0;if((c[o>>2]|0)==0){break}ea=Pb+8|0;fa=c[ea>>2]|0;if((c[fa+20>>2]&256|0)==0){lc=fa}else{c[Lb+(c[Pb+12>>2]<<2)>>2]=0;lc=c[ea>>2]|0}ea=c[Pb>>2]|0;fa=c[Pb+4>>2]|0;c[j>>2]=c[Pb+16>>2];ba=c[l>>2]|0;if((ba|0)>0){ca=Pb+20|0;v=0;do{c[Eb+(v<<2)>>2]=c[(c[ca>>2]|0)+(v<<2)>>2];v=v+1|0;}while((v|0)<(ba|0))}ec=fa;fc=ea;gc=Nb;hc=Ob;ic=c[o>>2]|0;jc=Qb;kc=lc}if((kc|0)==(c[C>>2]|0)){mc=jc;nc=ic;oc=gc;pc=fc}else{ba=kc;v=jc;ca=ic;Ca=gc;pa=fc;ja=ec;while(1){sa=ba+8|0;do{if((c[sa>>2]|0)==0){ra=109}else{if((c[ba+20>>2]&256|0)==0){ra=109;break}_a=c[ba+24>>2]|0;ZE(_a+1|0,Kb,c[T>>2]&-9,a,Eb,pa);$a=c[Kb+(_a<<3)>>2]|0;s=c[Kb+(_a<<3)+4>>2]|0;_a=s-$a|0;if((Za(b+$a|0,ja-1|0,_a|0)|0)!=0){Nb=Ca;Ob=hc;Pb=ca;Qb=v;ra=195;continue j}ga=(s|0)==($a|0);$a=ga&1;s=Lb+(c[ba+12>>2]<<2)|0;if(ga){if((c[s>>2]|0)!=0){Nb=Ca;Ob=hc;Pb=ca;Qb=v;ra=195;continue j}}c[s>>2]=$a;$a=_a-1|0;_a=$a+pa|0;s=c[j>>2]|0;ga=KE(j,ja+$a|0,4)|0;if((ga|0)<1){if((ga|0)<0){A=1;break a}qc=ga+1|0}else{qc=ga}rc=s;sc=qc+$a|0;tc=_a;uc=qc}}while(0);do{if((ra|0)==109){ra=0;_a=c[j>>2]|0;if((_a|0)==0){Nb=Ca;Ob=hc;Pb=ca;Qb=v;ra=195;continue j}$a=KE(j,ja,4)|0;if(($a|0)>=1){rc=_a;sc=$a;tc=pa;uc=$a;break}if(($a|0)<0){A=1;break a}s=$a+1|0;rc=_a;sc=s;tc=pa;uc=s}}while(0);s=ja+sc|0;_a=tc+Ca|0;if((c[sa>>2]|0)==0){Nb=uc;Ob=hc;Pb=ca;Qb=v;ra=195;continue j}$a=(_a|0)==0;ga=(rc|0)==95;aa=(_a|0)<1&E;Ya=((rc|0)!=10|r)^1;Xa=v;qa=ca;ka=ba;Ba=0;$=sa;while(1){k:do{if((c[ka>>2]|0)>>>0>rc>>>0){vc=Ba;wc=qa;xc=Xa}else{if((c[ka+4>>2]|0)>>>0<rc>>>0){vc=Ba;wc=qa;xc=Xa;break}ha=ka+20|0;qb=c[ha>>2]|0;l:do{if((qb|0)!=0){if(!((qb&1|0)==0|aa|Ya)){vc=Ba;wc=qa;xc=Xa;break k}if((qb&2|0)!=0){sb=c[j>>2]|0;if((sb|U|0)!=0&((sb|0)!=10|r)){vc=Ba;wc=qa;xc=Xa;break k}}do{if((qb&16|0)!=0){if(ga){vc=Ba;wc=qa;xc=Xa;break k}if((tE(rc)|0)!=0){vc=Ba;wc=qa;xc=Xa;break k}sb=c[j>>2]|0;if((sb|0)==95){break}if((tE(sb)|0)==0){vc=Ba;wc=qa;xc=Xa;break k}}}while(0);sb=c[ha>>2]|0;if((sb&32|0)==0){yc=sb}else{if(!ga){if((tE(rc)|0)==0){vc=Ba;wc=qa;xc=Xa;break k}}sb=c[j>>2]|0;if((sb|0)==95){vc=Ba;wc=qa;xc=Xa;break k}if((tE(sb)|0)!=0){vc=Ba;wc=qa;xc=Xa;break k}yc=c[ha>>2]|0}do{if((yc&64|0)==0|$a){zc=yc}else{sb=c[j>>2]|0;if((sb|0)==0){zc=yc;break}if(ga){Ac=1;Bc=sb}else{sb=(tE(rc)|0)!=0|0;Ac=sb;Bc=c[j>>2]|0}if((Bc|0)==95){Cc=1}else{Cc=(tE(Bc)|0)!=0|0}if((Ac|0)==(Cc|0)){vc=Ba;wc=qa;xc=Xa;break k}zc=c[ha>>2]|0}}while(0);if((zc&128|0)==0){Dc=zc}else{if($a){vc=Ba;wc=qa;xc=Xa;break k}sb=c[j>>2]|0;if((sb|0)==0){vc=Ba;wc=qa;xc=Xa;break k}if(ga){Ec=1;Fc=sb}else{sb=(tE(rc)|0)!=0|0;Ec=sb;Fc=c[j>>2]|0}if((Fc|0)==95){Gc=1}else{Gc=(tE(Fc)|0)!=0|0}if((Ec|0)!=(Gc|0)){vc=Ba;wc=qa;xc=Xa;break k}Dc=c[ha>>2]|0}do{if((Dc&4|0)==0){Hc=Dc}else{if((c[T>>2]&2|0)!=0){Hc=Dc;break}if((xE(rc,c[ka+24>>2]|0)|0)==0){vc=Ba;wc=qa;xc=Xa;break k}Hc=c[ha>>2]|0}}while(0);do{if((Hc&4|0)!=0){if((c[T>>2]&2|0)==0){break}sb=JE(rc)|0;eb=ka+24|0;if((xE(sb,c[eb>>2]|0)|0)!=0){break}sb=HE(rc)|0;if((xE(sb,c[eb>>2]|0)|0)==0){vc=Ba;wc=qa;xc=Xa;break k}}}while(0);if((c[ha>>2]&8|0)==0){break}eb=c[ka+28>>2]|0;sb=c[eb>>2]|0;if((sb|0)==0){break}if((c[T>>2]&2|0)==0){rb=eb;Ab=sb;while(1){if((xE(rc,Ab)|0)!=0){vc=Ba;wc=qa;xc=Xa;break k}rb=rb+4|0;Ab=c[rb>>2]|0;if((Ab|0)==0){break l}}}else{Ic=eb}do{Ab=HE(rc)|0;if((xE(Ab,c[Ic>>2]|0)|0)!=0){vc=Ba;wc=qa;xc=Xa;break k}Ab=JE(rc)|0;if((xE(Ab,c[Ic>>2]|0)|0)!=0){vc=Ba;wc=qa;xc=Xa;break k}Ic=Ic+4|0;}while((c[Ic>>2]|0)!=0)}}while(0);if((Ba|0)==0){vc=c[$>>2]|0;wc=qa;xc=c[ka+16>>2]|0;break}ha=qa+28|0;qb=c[ha>>2]|0;if((qb|0)==0){eb=aF(R,0,0,0,32)|0;Ab=eb;if((eb|0)==0){ra=169;break h}c[eb+24>>2]=qa;c[eb+28>>2]=0;rb=aF(R,0,0,0,c[l>>2]<<2)|0;c[eb+20>>2]=rb;if((rb|0)==0){ra=176;break h}c[ha>>2]=Ab;Jc=Ab}else{Jc=qb}c[Jc>>2]=_a;c[Jc+4>>2]=s;c[Jc+8>>2]=c[$>>2];c[Jc+12>>2]=c[ka+12>>2];c[Jc+16>>2]=c[j>>2];if((c[l>>2]|0)>0){qb=Jc+20|0;Ab=0;do{c[(c[qb>>2]|0)+(Ab<<2)>>2]=c[Eb+(Ab<<2)>>2];Ab=Ab+1|0;}while((Ab|0)<(c[l>>2]|0))}Ab=c[ka+16>>2]|0;if((Ab|0)==0){vc=Ba;wc=Jc;xc=Xa;break}qb=Jc+20|0;ha=c[Ab>>2]|0;if((ha|0)>-1){Kc=Ab;Lc=ha}else{vc=Ba;wc=Jc;xc=Xa;break}while(1){c[(c[qb>>2]|0)+(Lc<<2)>>2]=_a;ha=Kc+4|0;Ab=c[ha>>2]|0;if((Ab|0)>-1){Kc=ha;Lc=Ab}else{vc=Ba;wc=Jc;xc=Xa;break}}}}while(0);qb=ka+40|0;if((c[qb>>2]|0)==0){break}else{Xa=xc;qa=wc;ka=ka+32|0;Ba=vc;$=qb}}if((vc|0)==0){Nb=uc;Ob=hc;Pb=wc;Qb=xc;ra=195;continue j}do{if((xc|0)==0){Mc=0}else{$=c[xc>>2]|0;if(($|0)>-1){Nc=xc;Oc=$}else{Mc=xc;break}while(1){$=Nc+4|0;c[Eb+(Oc<<2)>>2]=_a;Ba=c[$>>2]|0;if((Ba|0)>-1){Nc=$;Oc=Ba}else{Mc=$;break}}}}while(0);if((vc|0)==(c[C>>2]|0)){mc=Mc;nc=wc;oc=uc;pc=_a;break}else{ba=vc;v=Mc;ca=wc;Ca=uc;pa=_a;ja=s}}}m:do{if((hc|0)<(pc|0)){ra=96}else{if((hc|0)!=(pc|0)|u){Nb=oc;Ob=hc;Pb=nc;Qb=mc;ra=195;continue j}ja=c[l>>2]|0;pa=c[w>>2]|0;if((ja|0)>0){Pc=0}else{Nb=oc;Ob=hc;Pb=nc;Qb=mc;ra=195;continue j}while(1){Ca=c[Eb+(Pc<<2)>>2]|0;ca=c[n+(Pc<<2)>>2]|0;if((c[pa+(Pc<<2)>>2]|0)==0){if((Ca|0)<(ca|0)){ra=96;break m}if((Ca|0)>(ca|0)){Nb=oc;Ob=hc;Pb=nc;Qb=mc;ra=195;continue j}}else{if((Ca|0)>(ca|0)){Qc=ja;break m}if((Ca|0)<(ca|0)){Nb=oc;Ob=hc;Pb=nc;Qb=mc;ra=195;continue j}}ca=Pc+1|0;if((ca|0)<(ja|0)){Pc=ca}else{Nb=oc;Ob=hc;Pb=nc;Qb=mc;ra=195;continue j}}}}while(0);if((ra|0)==96){ra=0;if(u){Nb=oc;Ob=pc;Pb=nc;Qb=mc;ra=195;continue}Qc=c[l>>2]|0}if((Qc|0)>0){Rc=0}else{Nb=oc;Ob=pc;Pb=nc;Qb=mc;ra=195;continue}while(1){c[n+(Rc<<2)>>2]=c[Eb+(Rc<<2)>>2];ja=Rc+1|0;if((ja|0)<(c[l>>2]|0)){Rc=ja}else{Nb=oc;Ob=pc;Pb=nc;Qb=mc;ra=195;continue j}}}if((Ob|0)>=0){ra=205;break}if((c[j>>2]|0)==0){ra=205;break}c[j>>2]=D;q=y;G=Nb;J=B;x=Ob;K=Pb;L=c[l>>2]|0}if((ra|0)==60){$E(R);if((Eb|0)!=0){eF(N)}if((Kb|0)!=0){eF(Kb)}if((Lb|0)==0){A=12;break a}eF(M);A=12;break a}else if((ra|0)==67){$E(R);if((Eb|0)!=0){eF(N)}if((Kb|0)!=0){eF(Kb)}if((Lb|0)==0){A=12;break a}eF(M);A=12;break a}else if((ra|0)==169){$E(R);if((Eb|0)!=0){eF(N)}if((Kb|0)!=0){eF(Kb)}if((Lb|0)==0){A=12;break a}eF(M);A=12;break a}else if((ra|0)==176){$E(R);if((Eb|0)!=0){eF(N)}if((Kb|0)!=0){eF(Kb)}if((Lb|0)==0){A=12;break a}eF(M);A=12;break a}else if((ra|0)==205){Fb=Ob>>>31;Gb=Kb;Hb=Lb;Ib=Eb;Jb=Ob;break}}}while(0);$E(R);if((Ib|0)!=0){eF(Ib)}if((Gb|0)!=0){eF(Gb)}if((Hb|0)==0){Cb=Fb;Db=Jb;ra=373;break}eF(Hb);Cb=Fb;Db=Jb;ra=373}}while(0);do{if((ra|0)==373){if((Cb|0)!=0){A=Cb;break}ZE(d,e,c[k+56>>2]|0,a,n,Db);A=0}}while(0);if((n|0)==0){p=A;i=g;return p|0}eF(m);p=A;i=g;return p|0}function ZE(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;do{if((g|0)>-1){if((d&8|0)!=0){h=0;break}i=c[e+16>>2]|0;j=e+28|0;k=c[j>>2]|0;l=(a|0)!=0;if((k|0)!=0&l){m=e+48|0;n=0;while(1){o=c[i+(n*12|0)>>2]|0;if((o|0)==(c[m>>2]|0)){c[b+(n<<3)>>2]=g;p=g}else{q=c[f+(o<<2)>>2]|0;c[b+(n<<3)>>2]=q;p=q}q=c[i+(n*12|0)+4>>2]|0;if((q|0)==(c[m>>2]|0)){c[b+(n<<3)+4>>2]=g;r=g}else{o=c[f+(q<<2)>>2]|0;c[b+(n<<3)+4>>2]=o;r=o}if((p|0)==-1|(r|0)==-1){c[b+(n<<3)+4>>2]=-1;c[b+(n<<3)>>2]=-1}o=n+1|0;q=c[j>>2]|0;if(o>>>0<q>>>0&o>>>0<a>>>0){n=o}else{s=q;break}}}else{s=k}if((s|0)!=0&l){t=0;u=s}else{h=0;break}while(1){n=b+(t<<3)+4|0;m=c[i+(t*12|0)+8>>2]|0;do{if((m|0)==0){v=u}else{q=c[m>>2]|0;if((q|0)<=-1){v=u;break}o=b+(t<<3)|0;w=0;x=q;q=c[o>>2]|0;while(1){if((q|0)<(c[b+(x<<3)>>2]|0)){y=21}else{if((c[n>>2]|0)>(c[b+(x<<3)+4>>2]|0)){y=21}else{z=q}}if((y|0)==21){y=0;c[n>>2]=-1;c[o>>2]=-1;z=-1}A=w+1|0;B=c[m+(A<<2)>>2]|0;if((B|0)>-1){w=A;x=B;q=z}else{break}}v=c[j>>2]|0}}while(0);m=t+1|0;if(m>>>0<v>>>0&m>>>0<a>>>0){t=m;u=v}else{h=m;break}}}else{h=0}}while(0);if(h>>>0<a>>>0){C=h}else{return}do{c[b+(C<<3)>>2]=-1;c[b+(C<<3)+4>>2]=-1;C=C+1|0;}while(C>>>0<a>>>0);return}function _E(a,b){a=a|0;b=b|0;var c=0,d=0;if((a|0)==0){c=fF(1,24)|0}else{vF(b|0,0,24)|0;c=b}if((c|0)==0){d=0;return d|0}d=c;return d|0}function $E(a){a=a|0;var b=0,d=0,e=0;b=c[a>>2]|0;if((b|0)==0){d=a;eF(d);return}else{e=b}while(1){eF(c[e>>2]|0);b=c[e+4>>2]|0;eF(e);if((b|0)==0){break}else{e=b}}d=a;eF(d);return}function aF(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=a+16|0;if((c[g>>2]|0)!=0){h=0;return h|0}i=a+12|0;j=c[i>>2]|0;do{if(j>>>0<f>>>0){if((b|0)!=0){if((d|0)!=0){c[a+8>>2]=d;c[i>>2]=1024;k=1024;l=d;break}c[g>>2]=1;h=0;return h|0}m=f<<3;n=m>>>0>1024>>>0?m:1024;m=dF(8)|0;o=m;if((m|0)==0){c[g>>2]=1;h=0;return h|0}p=dF(n)|0;q=m;c[q>>2]=p;if((p|0)==0){eF(m);c[g>>2]=1;h=0;return h|0}c[m+4>>2]=0;m=a+4|0;p=c[m>>2]|0;if((p|0)!=0){c[p+4>>2]=o}p=a|0;if((c[p>>2]|0)==0){c[p>>2]=o}c[m>>2]=o;o=c[q>>2]|0;c[a+8>>2]=o;c[i>>2]=n;k=n;l=o}else{k=j;l=c[a+8>>2]|0}}while(0);j=l+f&3;g=((j|0)==0?0:4-j|0)+f|0;c[a+8>>2]=l+g;c[i>>2]=k-g;if((e|0)==0){h=l;return h|0}vF(l|0,0,g|0)|0;h=l;return h|0}function bF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if((b|0)==0){d=a+((cF(a)|0)<<2)|0;return d|0}else{e=a}while(1){f=c[e>>2]|0;if((f|0)==0|(f|0)==(b|0)){break}else{e=e+4|0}}d=(f|0)!=0?e:0;return d|0}function cF(a){a=a|0;var b=0;b=a;while(1){if((c[b>>2]|0)==0){break}else{b=b+4|0}}return b-a>>2|0}function dF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0;do{if(a>>>0<245>>>0){if(a>>>0<11>>>0){b=16}else{b=a+11&-8}d=b>>>3;e=c[53374]|0;f=e>>>(d>>>0);if((f&3|0)!=0){g=(f&1^1)+d|0;h=g<<1;i=213536+(h<<2)|0;j=213536+(h+2<<2)|0;h=c[j>>2]|0;k=h+8|0;l=c[k>>2]|0;do{if((i|0)==(l|0)){c[53374]=e&~(1<<g)}else{if(l>>>0<(c[53378]|0)>>>0){fc();return 0}m=l+12|0;if((c[m>>2]|0)==(h|0)){c[m>>2]=i;c[j>>2]=l;break}else{fc();return 0}}}while(0);l=g<<3;c[h+4>>2]=l|3;j=h+(l|4)|0;c[j>>2]=c[j>>2]|1;n=k;return n|0}if(b>>>0<=(c[53376]|0)>>>0){o=b;break}if((f|0)!=0){j=2<<d;l=f<<d&(j|-j);j=(l&-l)-1|0;l=j>>>12&16;i=j>>>(l>>>0);j=i>>>5&8;m=i>>>(j>>>0);i=m>>>2&4;p=m>>>(i>>>0);m=p>>>1&2;q=p>>>(m>>>0);p=q>>>1&1;r=(j|l|i|m|p)+(q>>>(p>>>0))|0;p=r<<1;q=213536+(p<<2)|0;m=213536+(p+2<<2)|0;p=c[m>>2]|0;i=p+8|0;l=c[i>>2]|0;do{if((q|0)==(l|0)){c[53374]=e&~(1<<r)}else{if(l>>>0<(c[53378]|0)>>>0){fc();return 0}j=l+12|0;if((c[j>>2]|0)==(p|0)){c[j>>2]=q;c[m>>2]=l;break}else{fc();return 0}}}while(0);l=r<<3;m=l-b|0;c[p+4>>2]=b|3;q=p;e=q+b|0;c[q+(b|4)>>2]=m|1;c[q+l>>2]=m;l=c[53376]|0;if((l|0)!=0){q=c[53379]|0;d=l>>>3;l=d<<1;f=213536+(l<<2)|0;k=c[53374]|0;h=1<<d;do{if((k&h|0)==0){c[53374]=k|h;s=f;t=213536+(l+2<<2)|0}else{d=213536+(l+2<<2)|0;g=c[d>>2]|0;if(g>>>0>=(c[53378]|0)>>>0){s=g;t=d;break}fc();return 0}}while(0);c[t>>2]=q;c[s+12>>2]=q;c[q+8>>2]=s;c[q+12>>2]=f}c[53376]=m;c[53379]=e;n=i;return n|0}l=c[53375]|0;if((l|0)==0){o=b;break}h=(l&-l)-1|0;l=h>>>12&16;k=h>>>(l>>>0);h=k>>>5&8;p=k>>>(h>>>0);k=p>>>2&4;r=p>>>(k>>>0);p=r>>>1&2;d=r>>>(p>>>0);r=d>>>1&1;g=c[213800+((h|l|k|p|r)+(d>>>(r>>>0))<<2)>>2]|0;r=g;d=g;p=(c[g+4>>2]&-8)-b|0;while(1){g=c[r+16>>2]|0;if((g|0)==0){k=c[r+20>>2]|0;if((k|0)==0){break}else{u=k}}else{u=g}g=(c[u+4>>2]&-8)-b|0;k=g>>>0<p>>>0;r=u;d=k?u:d;p=k?g:p}r=d;i=c[53378]|0;if(r>>>0<i>>>0){fc();return 0}e=r+b|0;m=e;if(r>>>0>=e>>>0){fc();return 0}e=c[d+24>>2]|0;f=c[d+12>>2]|0;do{if((f|0)==(d|0)){q=d+20|0;g=c[q>>2]|0;if((g|0)==0){k=d+16|0;l=c[k>>2]|0;if((l|0)==0){v=0;break}else{w=l;x=k}}else{w=g;x=q}while(1){q=w+20|0;g=c[q>>2]|0;if((g|0)!=0){w=g;x=q;continue}q=w+16|0;g=c[q>>2]|0;if((g|0)==0){break}else{w=g;x=q}}if(x>>>0<i>>>0){fc();return 0}else{c[x>>2]=0;v=w;break}}else{q=c[d+8>>2]|0;if(q>>>0<i>>>0){fc();return 0}g=q+12|0;if((c[g>>2]|0)!=(d|0)){fc();return 0}k=f+8|0;if((c[k>>2]|0)==(d|0)){c[g>>2]=f;c[k>>2]=q;v=f;break}else{fc();return 0}}}while(0);a:do{if((e|0)!=0){f=d+28|0;i=213800+(c[f>>2]<<2)|0;do{if((d|0)==(c[i>>2]|0)){c[i>>2]=v;if((v|0)!=0){break}c[53375]=c[53375]&~(1<<c[f>>2]);break a}else{if(e>>>0<(c[53378]|0)>>>0){fc();return 0}q=e+16|0;if((c[q>>2]|0)==(d|0)){c[q>>2]=v}else{c[e+20>>2]=v}if((v|0)==0){break a}}}while(0);if(v>>>0<(c[53378]|0)>>>0){fc();return 0}c[v+24>>2]=e;f=c[d+16>>2]|0;do{if((f|0)!=0){if(f>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[v+16>>2]=f;c[f+24>>2]=v;break}}}while(0);f=c[d+20>>2]|0;if((f|0)==0){break}if(f>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[v+20>>2]=f;c[f+24>>2]=v;break}}}while(0);if(p>>>0<16>>>0){e=p+b|0;c[d+4>>2]=e|3;f=r+(e+4)|0;c[f>>2]=c[f>>2]|1}else{c[d+4>>2]=b|3;c[r+(b|4)>>2]=p|1;c[r+(p+b)>>2]=p;f=c[53376]|0;if((f|0)!=0){e=c[53379]|0;i=f>>>3;f=i<<1;q=213536+(f<<2)|0;k=c[53374]|0;g=1<<i;do{if((k&g|0)==0){c[53374]=k|g;y=q;z=213536+(f+2<<2)|0}else{i=213536+(f+2<<2)|0;l=c[i>>2]|0;if(l>>>0>=(c[53378]|0)>>>0){y=l;z=i;break}fc();return 0}}while(0);c[z>>2]=e;c[y+12>>2]=e;c[e+8>>2]=y;c[e+12>>2]=q}c[53376]=p;c[53379]=m}n=d+8|0;return n|0}else{if(a>>>0>4294967231>>>0){o=-1;break}f=a+11|0;g=f&-8;k=c[53375]|0;if((k|0)==0){o=g;break}r=-g|0;i=f>>>8;do{if((i|0)==0){A=0}else{if(g>>>0>16777215>>>0){A=31;break}f=(i+1048320|0)>>>16&8;l=i<<f;h=(l+520192|0)>>>16&4;j=l<<h;l=(j+245760|0)>>>16&2;B=14-(h|f|l)+(j<<l>>>15)|0;A=g>>>((B+7|0)>>>0)&1|B<<1}}while(0);i=c[213800+(A<<2)>>2]|0;b:do{if((i|0)==0){C=0;D=r;E=0}else{if((A|0)==31){F=0}else{F=25-(A>>>1)|0}d=0;m=r;p=i;q=g<<F;e=0;while(1){B=c[p+4>>2]&-8;l=B-g|0;if(l>>>0<m>>>0){if((B|0)==(g|0)){C=p;D=l;E=p;break b}else{G=p;H=l}}else{G=d;H=m}l=c[p+20>>2]|0;B=c[p+16+(q>>>31<<2)>>2]|0;j=(l|0)==0|(l|0)==(B|0)?e:l;if((B|0)==0){C=G;D=H;E=j;break}else{d=G;m=H;p=B;q=q<<1;e=j}}}}while(0);if((E|0)==0&(C|0)==0){i=2<<A;r=k&(i|-i);if((r|0)==0){o=g;break}i=(r&-r)-1|0;r=i>>>12&16;e=i>>>(r>>>0);i=e>>>5&8;q=e>>>(i>>>0);e=q>>>2&4;p=q>>>(e>>>0);q=p>>>1&2;m=p>>>(q>>>0);p=m>>>1&1;I=c[213800+((i|r|e|q|p)+(m>>>(p>>>0))<<2)>>2]|0}else{I=E}if((I|0)==0){J=D;K=C}else{p=I;m=D;q=C;while(1){e=(c[p+4>>2]&-8)-g|0;r=e>>>0<m>>>0;i=r?e:m;e=r?p:q;r=c[p+16>>2]|0;if((r|0)!=0){p=r;m=i;q=e;continue}r=c[p+20>>2]|0;if((r|0)==0){J=i;K=e;break}else{p=r;m=i;q=e}}}if((K|0)==0){o=g;break}if(J>>>0>=((c[53376]|0)-g|0)>>>0){o=g;break}q=K;m=c[53378]|0;if(q>>>0<m>>>0){fc();return 0}p=q+g|0;k=p;if(q>>>0>=p>>>0){fc();return 0}e=c[K+24>>2]|0;i=c[K+12>>2]|0;do{if((i|0)==(K|0)){r=K+20|0;d=c[r>>2]|0;if((d|0)==0){j=K+16|0;B=c[j>>2]|0;if((B|0)==0){L=0;break}else{M=B;N=j}}else{M=d;N=r}while(1){r=M+20|0;d=c[r>>2]|0;if((d|0)!=0){M=d;N=r;continue}r=M+16|0;d=c[r>>2]|0;if((d|0)==0){break}else{M=d;N=r}}if(N>>>0<m>>>0){fc();return 0}else{c[N>>2]=0;L=M;break}}else{r=c[K+8>>2]|0;if(r>>>0<m>>>0){fc();return 0}d=r+12|0;if((c[d>>2]|0)!=(K|0)){fc();return 0}j=i+8|0;if((c[j>>2]|0)==(K|0)){c[d>>2]=i;c[j>>2]=r;L=i;break}else{fc();return 0}}}while(0);c:do{if((e|0)!=0){i=K+28|0;m=213800+(c[i>>2]<<2)|0;do{if((K|0)==(c[m>>2]|0)){c[m>>2]=L;if((L|0)!=0){break}c[53375]=c[53375]&~(1<<c[i>>2]);break c}else{if(e>>>0<(c[53378]|0)>>>0){fc();return 0}r=e+16|0;if((c[r>>2]|0)==(K|0)){c[r>>2]=L}else{c[e+20>>2]=L}if((L|0)==0){break c}}}while(0);if(L>>>0<(c[53378]|0)>>>0){fc();return 0}c[L+24>>2]=e;i=c[K+16>>2]|0;do{if((i|0)!=0){if(i>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[L+16>>2]=i;c[i+24>>2]=L;break}}}while(0);i=c[K+20>>2]|0;if((i|0)==0){break}if(i>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[L+20>>2]=i;c[i+24>>2]=L;break}}}while(0);d:do{if(J>>>0<16>>>0){e=J+g|0;c[K+4>>2]=e|3;i=q+(e+4)|0;c[i>>2]=c[i>>2]|1}else{c[K+4>>2]=g|3;c[q+(g|4)>>2]=J|1;c[q+(J+g)>>2]=J;i=J>>>3;if(J>>>0<256>>>0){e=i<<1;m=213536+(e<<2)|0;r=c[53374]|0;j=1<<i;do{if((r&j|0)==0){c[53374]=r|j;O=m;P=213536+(e+2<<2)|0}else{i=213536+(e+2<<2)|0;d=c[i>>2]|0;if(d>>>0>=(c[53378]|0)>>>0){O=d;P=i;break}fc();return 0}}while(0);c[P>>2]=k;c[O+12>>2]=k;c[q+(g+8)>>2]=O;c[q+(g+12)>>2]=m;break}e=p;j=J>>>8;do{if((j|0)==0){Q=0}else{if(J>>>0>16777215>>>0){Q=31;break}r=(j+1048320|0)>>>16&8;i=j<<r;d=(i+520192|0)>>>16&4;B=i<<d;i=(B+245760|0)>>>16&2;l=14-(d|r|i)+(B<<i>>>15)|0;Q=J>>>((l+7|0)>>>0)&1|l<<1}}while(0);j=213800+(Q<<2)|0;c[q+(g+28)>>2]=Q;c[q+(g+20)>>2]=0;c[q+(g+16)>>2]=0;m=c[53375]|0;l=1<<Q;if((m&l|0)==0){c[53375]=m|l;c[j>>2]=e;c[q+(g+24)>>2]=j;c[q+(g+12)>>2]=e;c[q+(g+8)>>2]=e;break}l=c[j>>2]|0;if((Q|0)==31){R=0}else{R=25-(Q>>>1)|0}e:do{if((c[l+4>>2]&-8|0)==(J|0)){S=l}else{j=l;m=J<<R;while(1){T=j+16+(m>>>31<<2)|0;i=c[T>>2]|0;if((i|0)==0){break}if((c[i+4>>2]&-8|0)==(J|0)){S=i;break e}else{j=i;m=m<<1}}if(T>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[T>>2]=e;c[q+(g+24)>>2]=j;c[q+(g+12)>>2]=e;c[q+(g+8)>>2]=e;break d}}}while(0);l=S+8|0;m=c[l>>2]|0;i=c[53378]|0;if(S>>>0<i>>>0){fc();return 0}if(m>>>0<i>>>0){fc();return 0}else{c[m+12>>2]=e;c[l>>2]=e;c[q+(g+8)>>2]=m;c[q+(g+12)>>2]=S;c[q+(g+24)>>2]=0;break}}}while(0);n=K+8|0;return n|0}}while(0);K=c[53376]|0;if(o>>>0<=K>>>0){S=K-o|0;T=c[53379]|0;if(S>>>0>15>>>0){J=T;c[53379]=J+o;c[53376]=S;c[J+(o+4)>>2]=S|1;c[J+K>>2]=S;c[T+4>>2]=o|3}else{c[53376]=0;c[53379]=0;c[T+4>>2]=K|3;S=T+(K+4)|0;c[S>>2]=c[S>>2]|1}n=T+8|0;return n|0}T=c[53377]|0;if(o>>>0<T>>>0){S=T-o|0;c[53377]=S;T=c[53380]|0;K=T;c[53380]=K+o;c[K+(o+4)>>2]=S|1;c[T+4>>2]=o|3;n=T+8|0;return n|0}do{if((c[44322]|0)==0){T=Hb(30)|0;if((T-1&T|0)==0){c[44324]=T;c[44323]=T;c[44325]=-1;c[44326]=-1;c[44327]=0;c[53485]=0;c[44322]=(zc(0)|0)&-16^1431655768;break}else{fc();return 0}}}while(0);T=o+48|0;S=c[44324]|0;K=o+47|0;J=S+K|0;R=-S|0;S=J&R;if(S>>>0<=o>>>0){n=0;return n|0}Q=c[53484]|0;do{if((Q|0)!=0){O=c[53482]|0;P=O+S|0;if(P>>>0<=O>>>0|P>>>0>Q>>>0){n=0}else{break}return n|0}}while(0);f:do{if((c[53485]&4|0)==0){Q=c[53380]|0;g:do{if((Q|0)==0){U=182}else{P=Q;O=213944;while(1){V=O|0;L=c[V>>2]|0;if(L>>>0<=P>>>0){W=O+4|0;if((L+(c[W>>2]|0)|0)>>>0>P>>>0){break}}L=c[O+8>>2]|0;if((L|0)==0){U=182;break g}else{O=L}}if((O|0)==0){U=182;break}P=J-(c[53377]|0)&R;if(P>>>0>=2147483647>>>0){X=0;break}e=Ub(P|0)|0;L=(e|0)==((c[V>>2]|0)+(c[W>>2]|0)|0);Y=L?e:-1;Z=L?P:0;_=e;$=P;U=191}}while(0);do{if((U|0)==182){Q=Ub(0)|0;if((Q|0)==-1){X=0;break}P=Q;e=c[44323]|0;L=e-1|0;if((L&P|0)==0){aa=S}else{aa=S-P+(L+P&-e)|0}e=c[53482]|0;P=e+aa|0;if(!(aa>>>0>o>>>0&aa>>>0<2147483647>>>0)){X=0;break}L=c[53484]|0;if((L|0)!=0){if(P>>>0<=e>>>0|P>>>0>L>>>0){X=0;break}}L=Ub(aa|0)|0;P=(L|0)==(Q|0);Y=P?Q:-1;Z=P?aa:0;_=L;$=aa;U=191}}while(0);h:do{if((U|0)==191){L=-$|0;if((Y|0)!=-1){ba=Z;ca=Y;U=202;break f}do{if((_|0)!=-1&$>>>0<2147483647>>>0&$>>>0<T>>>0){P=c[44324]|0;Q=K-$+P&-P;if(Q>>>0>=2147483647>>>0){da=$;break}if((Ub(Q|0)|0)==-1){Ub(L|0)|0;X=Z;break h}else{da=Q+$|0;break}}else{da=$}}while(0);if((_|0)==-1){X=Z}else{ba=da;ca=_;U=202;break f}}}while(0);c[53485]=c[53485]|4;ea=X;U=199}else{ea=0;U=199}}while(0);do{if((U|0)==199){if(S>>>0>=2147483647>>>0){break}X=Ub(S|0)|0;_=Ub(0)|0;if(!((_|0)!=-1&(X|0)!=-1&X>>>0<_>>>0)){break}da=_-X|0;_=da>>>0>(o+40|0)>>>0;if(_){ba=_?da:ea;ca=X;U=202}}}while(0);do{if((U|0)==202){ea=(c[53482]|0)+ba|0;c[53482]=ea;if(ea>>>0>(c[53483]|0)>>>0){c[53483]=ea}ea=c[53380]|0;i:do{if((ea|0)==0){S=c[53378]|0;if((S|0)==0|ca>>>0<S>>>0){c[53378]=ca}c[53486]=ca;c[53487]=ba;c[53489]=0;c[53383]=c[44322];c[53382]=-1;S=0;do{X=S<<1;da=213536+(X<<2)|0;c[213536+(X+3<<2)>>2]=da;c[213536+(X+2<<2)>>2]=da;S=S+1|0;}while(S>>>0<32>>>0);S=ca+8|0;if((S&7|0)==0){fa=0}else{fa=-S&7}S=ba-40-fa|0;c[53380]=ca+fa;c[53377]=S;c[ca+(fa+4)>>2]=S|1;c[ca+(ba-36)>>2]=40;c[53381]=c[44326]}else{S=213944;while(1){ga=c[S>>2]|0;ha=S+4|0;ia=c[ha>>2]|0;if((ca|0)==(ga+ia|0)){U=214;break}da=c[S+8>>2]|0;if((da|0)==0){break}else{S=da}}do{if((U|0)==214){if((c[S+12>>2]&8|0)!=0){break}da=ea;if(!(da>>>0>=ga>>>0&da>>>0<ca>>>0)){break}c[ha>>2]=ia+ba;da=c[53380]|0;X=(c[53377]|0)+ba|0;_=da;Z=da+8|0;if((Z&7|0)==0){ja=0}else{ja=-Z&7}Z=X-ja|0;c[53380]=_+ja;c[53377]=Z;c[_+(ja+4)>>2]=Z|1;c[_+(X+4)>>2]=40;c[53381]=c[44326];break i}}while(0);if(ca>>>0<(c[53378]|0)>>>0){c[53378]=ca}S=ca+ba|0;X=213944;while(1){ka=X|0;if((c[ka>>2]|0)==(S|0)){U=224;break}_=c[X+8>>2]|0;if((_|0)==0){break}else{X=_}}do{if((U|0)==224){if((c[X+12>>2]&8|0)!=0){break}c[ka>>2]=ca;S=X+4|0;c[S>>2]=(c[S>>2]|0)+ba;S=ca+8|0;if((S&7|0)==0){la=0}else{la=-S&7}S=ca+(ba+8)|0;if((S&7|0)==0){ma=0}else{ma=-S&7}S=ca+(ma+ba)|0;_=S;Z=la+o|0;da=ca+Z|0;$=da;K=S-(ca+la)-o|0;c[ca+(la+4)>>2]=o|3;j:do{if((_|0)==(c[53380]|0)){T=(c[53377]|0)+K|0;c[53377]=T;c[53380]=$;c[ca+(Z+4)>>2]=T|1}else{if((_|0)==(c[53379]|0)){T=(c[53376]|0)+K|0;c[53376]=T;c[53379]=$;c[ca+(Z+4)>>2]=T|1;c[ca+(T+Z)>>2]=T;break}T=ba+4|0;Y=c[ca+(T+ma)>>2]|0;if((Y&3|0)==1){aa=Y&-8;W=Y>>>3;k:do{if(Y>>>0<256>>>0){V=c[ca+((ma|8)+ba)>>2]|0;R=c[ca+(ba+12+ma)>>2]|0;J=213536+(W<<1<<2)|0;do{if((V|0)!=(J|0)){if(V>>>0<(c[53378]|0)>>>0){fc();return 0}if((c[V+12>>2]|0)==(_|0)){break}fc();return 0}}while(0);if((R|0)==(V|0)){c[53374]=c[53374]&~(1<<W);break}do{if((R|0)==(J|0)){na=R+8|0}else{if(R>>>0<(c[53378]|0)>>>0){fc();return 0}L=R+8|0;if((c[L>>2]|0)==(_|0)){na=L;break}fc();return 0}}while(0);c[V+12>>2]=R;c[na>>2]=V}else{J=S;L=c[ca+((ma|24)+ba)>>2]|0;O=c[ca+(ba+12+ma)>>2]|0;do{if((O|0)==(J|0)){Q=ma|16;P=ca+(T+Q)|0;e=c[P>>2]|0;if((e|0)==0){M=ca+(Q+ba)|0;Q=c[M>>2]|0;if((Q|0)==0){oa=0;break}else{pa=Q;qa=M}}else{pa=e;qa=P}while(1){P=pa+20|0;e=c[P>>2]|0;if((e|0)!=0){pa=e;qa=P;continue}P=pa+16|0;e=c[P>>2]|0;if((e|0)==0){break}else{pa=e;qa=P}}if(qa>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[qa>>2]=0;oa=pa;break}}else{P=c[ca+((ma|8)+ba)>>2]|0;if(P>>>0<(c[53378]|0)>>>0){fc();return 0}e=P+12|0;if((c[e>>2]|0)!=(J|0)){fc();return 0}M=O+8|0;if((c[M>>2]|0)==(J|0)){c[e>>2]=O;c[M>>2]=P;oa=O;break}else{fc();return 0}}}while(0);if((L|0)==0){break}O=ca+(ba+28+ma)|0;V=213800+(c[O>>2]<<2)|0;do{if((J|0)==(c[V>>2]|0)){c[V>>2]=oa;if((oa|0)!=0){break}c[53375]=c[53375]&~(1<<c[O>>2]);break k}else{if(L>>>0<(c[53378]|0)>>>0){fc();return 0}R=L+16|0;if((c[R>>2]|0)==(J|0)){c[R>>2]=oa}else{c[L+20>>2]=oa}if((oa|0)==0){break k}}}while(0);if(oa>>>0<(c[53378]|0)>>>0){fc();return 0}c[oa+24>>2]=L;J=ma|16;O=c[ca+(J+ba)>>2]|0;do{if((O|0)!=0){if(O>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[oa+16>>2]=O;c[O+24>>2]=oa;break}}}while(0);O=c[ca+(T+J)>>2]|0;if((O|0)==0){break}if(O>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[oa+20>>2]=O;c[O+24>>2]=oa;break}}}while(0);ra=ca+((aa|ma)+ba)|0;sa=aa+K|0}else{ra=_;sa=K}T=ra+4|0;c[T>>2]=c[T>>2]&-2;c[ca+(Z+4)>>2]=sa|1;c[ca+(sa+Z)>>2]=sa;T=sa>>>3;if(sa>>>0<256>>>0){W=T<<1;Y=213536+(W<<2)|0;O=c[53374]|0;L=1<<T;do{if((O&L|0)==0){c[53374]=O|L;ta=Y;ua=213536+(W+2<<2)|0}else{T=213536+(W+2<<2)|0;V=c[T>>2]|0;if(V>>>0>=(c[53378]|0)>>>0){ta=V;ua=T;break}fc();return 0}}while(0);c[ua>>2]=$;c[ta+12>>2]=$;c[ca+(Z+8)>>2]=ta;c[ca+(Z+12)>>2]=Y;break}W=da;L=sa>>>8;do{if((L|0)==0){va=0}else{if(sa>>>0>16777215>>>0){va=31;break}O=(L+1048320|0)>>>16&8;aa=L<<O;T=(aa+520192|0)>>>16&4;V=aa<<T;aa=(V+245760|0)>>>16&2;R=14-(T|O|aa)+(V<<aa>>>15)|0;va=sa>>>((R+7|0)>>>0)&1|R<<1}}while(0);L=213800+(va<<2)|0;c[ca+(Z+28)>>2]=va;c[ca+(Z+20)>>2]=0;c[ca+(Z+16)>>2]=0;Y=c[53375]|0;R=1<<va;if((Y&R|0)==0){c[53375]=Y|R;c[L>>2]=W;c[ca+(Z+24)>>2]=L;c[ca+(Z+12)>>2]=W;c[ca+(Z+8)>>2]=W;break}R=c[L>>2]|0;if((va|0)==31){wa=0}else{wa=25-(va>>>1)|0}l:do{if((c[R+4>>2]&-8|0)==(sa|0)){xa=R}else{L=R;Y=sa<<wa;while(1){ya=L+16+(Y>>>31<<2)|0;aa=c[ya>>2]|0;if((aa|0)==0){break}if((c[aa+4>>2]&-8|0)==(sa|0)){xa=aa;break l}else{L=aa;Y=Y<<1}}if(ya>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[ya>>2]=W;c[ca+(Z+24)>>2]=L;c[ca+(Z+12)>>2]=W;c[ca+(Z+8)>>2]=W;break j}}}while(0);R=xa+8|0;Y=c[R>>2]|0;J=c[53378]|0;if(xa>>>0<J>>>0){fc();return 0}if(Y>>>0<J>>>0){fc();return 0}else{c[Y+12>>2]=W;c[R>>2]=W;c[ca+(Z+8)>>2]=Y;c[ca+(Z+12)>>2]=xa;c[ca+(Z+24)>>2]=0;break}}}while(0);n=ca+(la|8)|0;return n|0}}while(0);X=ea;Z=213944;while(1){za=c[Z>>2]|0;if(za>>>0<=X>>>0){Aa=c[Z+4>>2]|0;Ba=za+Aa|0;if(Ba>>>0>X>>>0){break}}Z=c[Z+8>>2]|0}Z=za+(Aa-39)|0;if((Z&7|0)==0){Ca=0}else{Ca=-Z&7}Z=za+(Aa-47+Ca)|0;da=Z>>>0<(ea+16|0)>>>0?X:Z;Z=da+8|0;$=ca+8|0;if(($&7|0)==0){Da=0}else{Da=-$&7}$=ba-40-Da|0;c[53380]=ca+Da;c[53377]=$;c[ca+(Da+4)>>2]=$|1;c[ca+(ba-36)>>2]=40;c[53381]=c[44326];c[da+4>>2]=27;c[Z>>2]=c[53486];c[Z+4>>2]=c[53487];c[Z+8>>2]=c[53488];c[Z+12>>2]=c[53489];c[53486]=ca;c[53487]=ba;c[53489]=0;c[53488]=Z;Z=da+28|0;c[Z>>2]=7;if((da+32|0)>>>0<Ba>>>0){$=Z;while(1){Z=$+4|0;c[Z>>2]=7;if(($+8|0)>>>0<Ba>>>0){$=Z}else{break}}}if((da|0)==(X|0)){break}$=da-ea|0;Z=X+($+4)|0;c[Z>>2]=c[Z>>2]&-2;c[ea+4>>2]=$|1;c[X+$>>2]=$;Z=$>>>3;if($>>>0<256>>>0){K=Z<<1;_=213536+(K<<2)|0;S=c[53374]|0;j=1<<Z;do{if((S&j|0)==0){c[53374]=S|j;Ea=_;Fa=213536+(K+2<<2)|0}else{Z=213536+(K+2<<2)|0;Y=c[Z>>2]|0;if(Y>>>0>=(c[53378]|0)>>>0){Ea=Y;Fa=Z;break}fc();return 0}}while(0);c[Fa>>2]=ea;c[Ea+12>>2]=ea;c[ea+8>>2]=Ea;c[ea+12>>2]=_;break}K=ea;j=$>>>8;do{if((j|0)==0){Ga=0}else{if($>>>0>16777215>>>0){Ga=31;break}S=(j+1048320|0)>>>16&8;X=j<<S;da=(X+520192|0)>>>16&4;Z=X<<da;X=(Z+245760|0)>>>16&2;Y=14-(da|S|X)+(Z<<X>>>15)|0;Ga=$>>>((Y+7|0)>>>0)&1|Y<<1}}while(0);j=213800+(Ga<<2)|0;c[ea+28>>2]=Ga;c[ea+20>>2]=0;c[ea+16>>2]=0;_=c[53375]|0;Y=1<<Ga;if((_&Y|0)==0){c[53375]=_|Y;c[j>>2]=K;c[ea+24>>2]=j;c[ea+12>>2]=ea;c[ea+8>>2]=ea;break}Y=c[j>>2]|0;if((Ga|0)==31){Ha=0}else{Ha=25-(Ga>>>1)|0}m:do{if((c[Y+4>>2]&-8|0)==($|0)){Ia=Y}else{j=Y;_=$<<Ha;while(1){Ja=j+16+(_>>>31<<2)|0;X=c[Ja>>2]|0;if((X|0)==0){break}if((c[X+4>>2]&-8|0)==($|0)){Ia=X;break m}else{j=X;_=_<<1}}if(Ja>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[Ja>>2]=K;c[ea+24>>2]=j;c[ea+12>>2]=ea;c[ea+8>>2]=ea;break i}}}while(0);$=Ia+8|0;Y=c[$>>2]|0;_=c[53378]|0;if(Ia>>>0<_>>>0){fc();return 0}if(Y>>>0<_>>>0){fc();return 0}else{c[Y+12>>2]=K;c[$>>2]=K;c[ea+8>>2]=Y;c[ea+12>>2]=Ia;c[ea+24>>2]=0;break}}}while(0);ea=c[53377]|0;if(ea>>>0<=o>>>0){break}Y=ea-o|0;c[53377]=Y;ea=c[53380]|0;$=ea;c[53380]=$+o;c[$+(o+4)>>2]=Y|1;c[ea+4>>2]=o|3;n=ea+8|0;return n|0}}while(0);c[(Vb()|0)>>2]=12;n=0;return n|0}function eF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;if((a|0)==0){return}b=a-8|0;d=b;e=c[53378]|0;if(b>>>0<e>>>0){fc()}f=c[a-4>>2]|0;g=f&3;if((g|0)==1){fc()}h=f&-8;i=a+(h-8)|0;j=i;a:do{if((f&1|0)==0){k=c[b>>2]|0;if((g|0)==0){return}l=-8-k|0;m=a+l|0;n=m;o=k+h|0;if(m>>>0<e>>>0){fc()}if((n|0)==(c[53379]|0)){p=a+(h-4)|0;if((c[p>>2]&3|0)!=3){q=n;r=o;break}c[53376]=o;c[p>>2]=c[p>>2]&-2;c[a+(l+4)>>2]=o|1;c[i>>2]=o;return}p=k>>>3;if(k>>>0<256>>>0){k=c[a+(l+8)>>2]|0;s=c[a+(l+12)>>2]|0;t=213536+(p<<1<<2)|0;do{if((k|0)!=(t|0)){if(k>>>0<e>>>0){fc()}if((c[k+12>>2]|0)==(n|0)){break}fc()}}while(0);if((s|0)==(k|0)){c[53374]=c[53374]&~(1<<p);q=n;r=o;break}do{if((s|0)==(t|0)){u=s+8|0}else{if(s>>>0<e>>>0){fc()}v=s+8|0;if((c[v>>2]|0)==(n|0)){u=v;break}fc()}}while(0);c[k+12>>2]=s;c[u>>2]=k;q=n;r=o;break}t=m;p=c[a+(l+24)>>2]|0;v=c[a+(l+12)>>2]|0;do{if((v|0)==(t|0)){w=a+(l+20)|0;x=c[w>>2]|0;if((x|0)==0){y=a+(l+16)|0;z=c[y>>2]|0;if((z|0)==0){A=0;break}else{B=z;C=y}}else{B=x;C=w}while(1){w=B+20|0;x=c[w>>2]|0;if((x|0)!=0){B=x;C=w;continue}w=B+16|0;x=c[w>>2]|0;if((x|0)==0){break}else{B=x;C=w}}if(C>>>0<e>>>0){fc()}else{c[C>>2]=0;A=B;break}}else{w=c[a+(l+8)>>2]|0;if(w>>>0<e>>>0){fc()}x=w+12|0;if((c[x>>2]|0)!=(t|0)){fc()}y=v+8|0;if((c[y>>2]|0)==(t|0)){c[x>>2]=v;c[y>>2]=w;A=v;break}else{fc()}}}while(0);if((p|0)==0){q=n;r=o;break}v=a+(l+28)|0;m=213800+(c[v>>2]<<2)|0;do{if((t|0)==(c[m>>2]|0)){c[m>>2]=A;if((A|0)!=0){break}c[53375]=c[53375]&~(1<<c[v>>2]);q=n;r=o;break a}else{if(p>>>0<(c[53378]|0)>>>0){fc()}k=p+16|0;if((c[k>>2]|0)==(t|0)){c[k>>2]=A}else{c[p+20>>2]=A}if((A|0)==0){q=n;r=o;break a}}}while(0);if(A>>>0<(c[53378]|0)>>>0){fc()}c[A+24>>2]=p;t=c[a+(l+16)>>2]|0;do{if((t|0)!=0){if(t>>>0<(c[53378]|0)>>>0){fc()}else{c[A+16>>2]=t;c[t+24>>2]=A;break}}}while(0);t=c[a+(l+20)>>2]|0;if((t|0)==0){q=n;r=o;break}if(t>>>0<(c[53378]|0)>>>0){fc()}else{c[A+20>>2]=t;c[t+24>>2]=A;q=n;r=o;break}}else{q=d;r=h}}while(0);d=q;if(d>>>0>=i>>>0){fc()}A=a+(h-4)|0;e=c[A>>2]|0;if((e&1|0)==0){fc()}do{if((e&2|0)==0){if((j|0)==(c[53380]|0)){B=(c[53377]|0)+r|0;c[53377]=B;c[53380]=q;c[q+4>>2]=B|1;if((q|0)!=(c[53379]|0)){return}c[53379]=0;c[53376]=0;return}if((j|0)==(c[53379]|0)){B=(c[53376]|0)+r|0;c[53376]=B;c[53379]=q;c[q+4>>2]=B|1;c[d+B>>2]=B;return}B=(e&-8)+r|0;C=e>>>3;b:do{if(e>>>0<256>>>0){u=c[a+h>>2]|0;g=c[a+(h|4)>>2]|0;b=213536+(C<<1<<2)|0;do{if((u|0)!=(b|0)){if(u>>>0<(c[53378]|0)>>>0){fc()}if((c[u+12>>2]|0)==(j|0)){break}fc()}}while(0);if((g|0)==(u|0)){c[53374]=c[53374]&~(1<<C);break}do{if((g|0)==(b|0)){D=g+8|0}else{if(g>>>0<(c[53378]|0)>>>0){fc()}f=g+8|0;if((c[f>>2]|0)==(j|0)){D=f;break}fc()}}while(0);c[u+12>>2]=g;c[D>>2]=u}else{b=i;f=c[a+(h+16)>>2]|0;t=c[a+(h|4)>>2]|0;do{if((t|0)==(b|0)){p=a+(h+12)|0;v=c[p>>2]|0;if((v|0)==0){m=a+(h+8)|0;k=c[m>>2]|0;if((k|0)==0){E=0;break}else{F=k;G=m}}else{F=v;G=p}while(1){p=F+20|0;v=c[p>>2]|0;if((v|0)!=0){F=v;G=p;continue}p=F+16|0;v=c[p>>2]|0;if((v|0)==0){break}else{F=v;G=p}}if(G>>>0<(c[53378]|0)>>>0){fc()}else{c[G>>2]=0;E=F;break}}else{p=c[a+h>>2]|0;if(p>>>0<(c[53378]|0)>>>0){fc()}v=p+12|0;if((c[v>>2]|0)!=(b|0)){fc()}m=t+8|0;if((c[m>>2]|0)==(b|0)){c[v>>2]=t;c[m>>2]=p;E=t;break}else{fc()}}}while(0);if((f|0)==0){break}t=a+(h+20)|0;u=213800+(c[t>>2]<<2)|0;do{if((b|0)==(c[u>>2]|0)){c[u>>2]=E;if((E|0)!=0){break}c[53375]=c[53375]&~(1<<c[t>>2]);break b}else{if(f>>>0<(c[53378]|0)>>>0){fc()}g=f+16|0;if((c[g>>2]|0)==(b|0)){c[g>>2]=E}else{c[f+20>>2]=E}if((E|0)==0){break b}}}while(0);if(E>>>0<(c[53378]|0)>>>0){fc()}c[E+24>>2]=f;b=c[a+(h+8)>>2]|0;do{if((b|0)!=0){if(b>>>0<(c[53378]|0)>>>0){fc()}else{c[E+16>>2]=b;c[b+24>>2]=E;break}}}while(0);b=c[a+(h+12)>>2]|0;if((b|0)==0){break}if(b>>>0<(c[53378]|0)>>>0){fc()}else{c[E+20>>2]=b;c[b+24>>2]=E;break}}}while(0);c[q+4>>2]=B|1;c[d+B>>2]=B;if((q|0)!=(c[53379]|0)){H=B;break}c[53376]=B;return}else{c[A>>2]=e&-2;c[q+4>>2]=r|1;c[d+r>>2]=r;H=r}}while(0);r=H>>>3;if(H>>>0<256>>>0){d=r<<1;e=213536+(d<<2)|0;A=c[53374]|0;E=1<<r;do{if((A&E|0)==0){c[53374]=A|E;I=e;J=213536+(d+2<<2)|0}else{r=213536+(d+2<<2)|0;h=c[r>>2]|0;if(h>>>0>=(c[53378]|0)>>>0){I=h;J=r;break}fc()}}while(0);c[J>>2]=q;c[I+12>>2]=q;c[q+8>>2]=I;c[q+12>>2]=e;return}e=q;I=H>>>8;do{if((I|0)==0){K=0}else{if(H>>>0>16777215>>>0){K=31;break}J=(I+1048320|0)>>>16&8;d=I<<J;E=(d+520192|0)>>>16&4;A=d<<E;d=(A+245760|0)>>>16&2;r=14-(E|J|d)+(A<<d>>>15)|0;K=H>>>((r+7|0)>>>0)&1|r<<1}}while(0);I=213800+(K<<2)|0;c[q+28>>2]=K;c[q+20>>2]=0;c[q+16>>2]=0;r=c[53375]|0;d=1<<K;c:do{if((r&d|0)==0){c[53375]=r|d;c[I>>2]=e;c[q+24>>2]=I;c[q+12>>2]=q;c[q+8>>2]=q}else{A=c[I>>2]|0;if((K|0)==31){L=0}else{L=25-(K>>>1)|0}d:do{if((c[A+4>>2]&-8|0)==(H|0)){M=A}else{J=A;E=H<<L;while(1){N=J+16+(E>>>31<<2)|0;h=c[N>>2]|0;if((h|0)==0){break}if((c[h+4>>2]&-8|0)==(H|0)){M=h;break d}else{J=h;E=E<<1}}if(N>>>0<(c[53378]|0)>>>0){fc()}else{c[N>>2]=e;c[q+24>>2]=J;c[q+12>>2]=q;c[q+8>>2]=q;break c}}}while(0);A=M+8|0;B=c[A>>2]|0;E=c[53378]|0;if(M>>>0<E>>>0){fc()}if(B>>>0<E>>>0){fc()}else{c[B+12>>2]=e;c[A>>2]=e;c[q+8>>2]=B;c[q+12>>2]=M;c[q+24>>2]=0;break}}}while(0);q=(c[53382]|0)-1|0;c[53382]=q;if((q|0)==0){O=213952}else{return}while(1){q=c[O>>2]|0;if((q|0)==0){break}else{O=q+8|0}}c[53382]=-1;return}function fF(a,b){a=a|0;b=b|0;var d=0,e=0;do{if((a|0)==0){d=0}else{e=da(b,a)|0;if((b|a)>>>0<=65535>>>0){d=e;break}d=((e>>>0)/(a>>>0)|0|0)==(b|0)?e:-1}}while(0);b=dF(d)|0;if((b|0)==0){return b|0}if((c[b-4>>2]&3|0)==0){return b|0}vF(b|0,0,d|0)|0;return b|0}function gF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if((a|0)==0){d=dF(b)|0;return d|0}if(b>>>0>4294967231>>>0){c[(Vb()|0)>>2]=12;d=0;return d|0}if(b>>>0<11>>>0){e=16}else{e=b+11&-8}f=hF(a-8|0,e)|0;if((f|0)!=0){d=f+8|0;return d|0}f=dF(b)|0;if((f|0)==0){d=0;return d|0}e=c[a-4>>2]|0;g=(e&-8)-((e&3|0)==0?8:4)|0;tF(f|0,a|0,g>>>0<b>>>0?g:b)|0;eF(a);d=f;return d|0}function hF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=a+4|0;e=c[d>>2]|0;f=e&-8;g=a;h=g+f|0;i=h;j=c[53378]|0;if(g>>>0<j>>>0){fc();return 0}k=e&3;if(!((k|0)!=1&g>>>0<h>>>0)){fc();return 0}l=g+(f|4)|0;m=c[l>>2]|0;if((m&1|0)==0){fc();return 0}if((k|0)==0){if(b>>>0<256>>>0){n=0;return n|0}do{if(f>>>0>=(b+4|0)>>>0){if((f-b|0)>>>0>c[44324]<<1>>>0){break}else{n=a}return n|0}}while(0);n=0;return n|0}if(f>>>0>=b>>>0){k=f-b|0;if(k>>>0<=15>>>0){n=a;return n|0}c[d>>2]=e&1|b|2;c[g+(b+4)>>2]=k|3;c[l>>2]=c[l>>2]|1;iF(g+b|0,k);n=a;return n|0}if((i|0)==(c[53380]|0)){k=(c[53377]|0)+f|0;if(k>>>0<=b>>>0){n=0;return n|0}l=k-b|0;c[d>>2]=e&1|b|2;c[g+(b+4)>>2]=l|1;c[53380]=g+b;c[53377]=l;n=a;return n|0}if((i|0)==(c[53379]|0)){l=(c[53376]|0)+f|0;if(l>>>0<b>>>0){n=0;return n|0}k=l-b|0;if(k>>>0>15>>>0){c[d>>2]=e&1|b|2;c[g+(b+4)>>2]=k|1;c[g+l>>2]=k;o=g+(l+4)|0;c[o>>2]=c[o>>2]&-2;p=g+b|0;q=k}else{c[d>>2]=e&1|l|2;e=g+(l+4)|0;c[e>>2]=c[e>>2]|1;p=0;q=0}c[53376]=q;c[53379]=p;n=a;return n|0}if((m&2|0)!=0){n=0;return n|0}p=(m&-8)+f|0;if(p>>>0<b>>>0){n=0;return n|0}q=p-b|0;e=m>>>3;a:do{if(m>>>0<256>>>0){l=c[g+(f+8)>>2]|0;k=c[g+(f+12)>>2]|0;o=213536+(e<<1<<2)|0;do{if((l|0)!=(o|0)){if(l>>>0<j>>>0){fc();return 0}if((c[l+12>>2]|0)==(i|0)){break}fc();return 0}}while(0);if((k|0)==(l|0)){c[53374]=c[53374]&~(1<<e);break}do{if((k|0)==(o|0)){r=k+8|0}else{if(k>>>0<j>>>0){fc();return 0}s=k+8|0;if((c[s>>2]|0)==(i|0)){r=s;break}fc();return 0}}while(0);c[l+12>>2]=k;c[r>>2]=l}else{o=h;s=c[g+(f+24)>>2]|0;t=c[g+(f+12)>>2]|0;do{if((t|0)==(o|0)){u=g+(f+20)|0;v=c[u>>2]|0;if((v|0)==0){w=g+(f+16)|0;x=c[w>>2]|0;if((x|0)==0){y=0;break}else{z=x;A=w}}else{z=v;A=u}while(1){u=z+20|0;v=c[u>>2]|0;if((v|0)!=0){z=v;A=u;continue}u=z+16|0;v=c[u>>2]|0;if((v|0)==0){break}else{z=v;A=u}}if(A>>>0<j>>>0){fc();return 0}else{c[A>>2]=0;y=z;break}}else{u=c[g+(f+8)>>2]|0;if(u>>>0<j>>>0){fc();return 0}v=u+12|0;if((c[v>>2]|0)!=(o|0)){fc();return 0}w=t+8|0;if((c[w>>2]|0)==(o|0)){c[v>>2]=t;c[w>>2]=u;y=t;break}else{fc();return 0}}}while(0);if((s|0)==0){break}t=g+(f+28)|0;l=213800+(c[t>>2]<<2)|0;do{if((o|0)==(c[l>>2]|0)){c[l>>2]=y;if((y|0)!=0){break}c[53375]=c[53375]&~(1<<c[t>>2]);break a}else{if(s>>>0<(c[53378]|0)>>>0){fc();return 0}k=s+16|0;if((c[k>>2]|0)==(o|0)){c[k>>2]=y}else{c[s+20>>2]=y}if((y|0)==0){break a}}}while(0);if(y>>>0<(c[53378]|0)>>>0){fc();return 0}c[y+24>>2]=s;o=c[g+(f+16)>>2]|0;do{if((o|0)!=0){if(o>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[y+16>>2]=o;c[o+24>>2]=y;break}}}while(0);o=c[g+(f+20)>>2]|0;if((o|0)==0){break}if(o>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[y+20>>2]=o;c[o+24>>2]=y;break}}}while(0);if(q>>>0<16>>>0){c[d>>2]=p|c[d>>2]&1|2;y=g+(p|4)|0;c[y>>2]=c[y>>2]|1;n=a;return n|0}else{c[d>>2]=c[d>>2]&1|b|2;c[g+(b+4)>>2]=q|3;d=g+(p|4)|0;c[d>>2]=c[d>>2]|1;iF(g+b|0,q);n=a;return n|0}return 0}
-
-
-
-function ol(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0;g=i;i=i+80|0;j=g|0;k=e&2130706432;if((e&8|0)==0){l=(k|0)==0?4:k}else{l=8}m=jk((d<<6)+64|0)|0;n=m;o=(d|0)>0;a:do{if(o){p=d-1|0;q=b+8|0;r=0;s=12.0;while(1){t=r+1|0;if((r|0)<(p|0)){u=b+(t<<4)|0;v=b+(t<<4)+8|0}else{u=b;v=q}w=+h[u>>3]- +h[b+(r<<4)>>3];x=+h[v>>3]- +h[b+(r<<4)+8>>3];y=+T(w*w+x*x)/3.0;z=s<y?s:y;if((t|0)<(d|0)){r=t;s=z}else{break}}if(!o){A=0;break}r=d-1|0;q=(l|0)==4;p=(k|0)==16777216;t=b+8|0;if((e&2113929216|0)==67108864){B=0;C=0;while(1){s=+h[b+(C<<4)>>3];y=+h[b+(C<<4)+8>>3];if((C|0)<(r|0)){D=C+1|0;E=b+(D<<4)|0;F=b+(D<<4)+8|0}else{E=b;F=t}x=+h[E>>3]-s;w=+h[F>>3]-y;G=z/+T(x*x+w*w)/3.0;D=B+1|0;H=n+(B<<4)|0;if(q){I=G*.5;h[H>>3]=s+x*I;h[n+(B<<4)+8>>3]=y+w*I}else{h[H>>3]=s;h[n+(B<<4)+8>>3]=y}H=B+2|0;h[n+(D<<4)>>3]=s+x*G;h[n+(D<<4)+8>>3]=y+w*G;D=B+3|0;I=1.0-G;h[n+(H<<4)>>3]=s+x*I;h[n+(H<<4)+8>>3]=y+w*I;if(q){I=1.0-G*.5;h[n+(D<<4)>>3]=s+x*I;h[n+(D<<4)+8>>3]=y+w*I;J=B+4|0}else{J=D}D=C+1|0;if((D|0)<(d|0)){B=J;C=D}else{A=J;break a}}}else{K=0;L=0}while(1){I=+h[b+(L<<4)>>3];w=+h[b+(L<<4)+8>>3];if((L|0)<(r|0)){C=L+1|0;M=b+(C<<4)|0;N=b+(C<<4)+8|0}else{M=b;N=t}y=+h[M>>3]-I;x=+h[N>>3]-w;s=z/+T(y*y+x*x);if(p){O=s*.5}else{O=s}C=K+1|0;B=n+(K<<4)|0;if(q){s=O*.5;h[B>>3]=I+y*s;h[n+(K<<4)+8>>3]=w+x*s}else{h[B>>3]=I;h[n+(K<<4)+8>>3]=w}B=K+2|0;h[n+(C<<4)>>3]=I+y*O;h[n+(C<<4)+8>>3]=w+x*O;C=K+3|0;s=1.0-O;h[n+(B<<4)>>3]=I+y*s;h[n+(B<<4)+8>>3]=w+x*s;if(q){s=1.0-O*.5;h[n+(C<<4)>>3]=I+y*s;h[n+(C<<4)+8>>3]=w+x*s;P=K+4|0}else{P=C}C=L+1|0;if((C|0)<(d|0)){K=P;L=C}else{A=P;break}}}else{A=0}}while(0);P=n+(A<<4)|0;c[P>>2]=c[m>>2];c[P+4>>2]=c[m+4>>2];c[P+8>>2]=c[m+8>>2];c[P+12>>2]=c[m+12>>2];P=m+16|0;L=n+(A+1<<4)|0;c[L>>2]=c[P>>2];c[L+4>>2]=c[P+4>>2];c[L+8>>2]=c[P+8>>2];c[L+12>>2]=c[P+12>>2];L=m+32|0;K=n+(A+2<<4)|0;c[K>>2]=c[L>>2];c[K+4>>2]=c[L+4>>2];c[K+8>>2]=c[L+8>>2];c[K+12>>2]=c[L+12>>2];if((l|0)==4){K=d*96|0;A=kk(K+32|0)|0;N=A;if(o){M=A+K|0;K=d*6|0;J=0;F=0;E=1;e=N;while(1){k=F<<2;v=e;u=n+(k<<4)|0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];u=N+(E<<4)|0;v=n+((k|1)<<4)|0;c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];u=N+(J+2<<4)|0;c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];v=N+(J+3<<4)|0;u=n+((k|2)<<4)|0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];v=N+(J+4<<4)|0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];u=J+6|0;v=N+(J+5<<4)|0;q=n+((k|3)<<4)|0;c[v>>2]=c[q>>2];c[v+4>>2]=c[q+4>>2];c[v+8>>2]=c[q+8>>2];c[v+12>>2]=c[q+12>>2];q=F+1|0;if((q|0)<(d|0)){J=u;F=q;E=u|1;e=N+(u<<4)|0}else{break}}Q=K|1;R=M}else{Q=1;R=N}M=R;c[M>>2]=c[A>>2];c[M+4>>2]=c[A+4>>2];c[M+8>>2]=c[A+8>>2];c[M+12>>2]=c[A+12>>2];M=A+16|0;R=N+(Q<<4)|0;c[R>>2]=c[M>>2];c[R+4>>2]=c[M+4>>2];c[R+8>>2]=c[M+8>>2];c[R+12>>2]=c[M+12>>2];tB(a,M,Q,0,0,f&255);eF(A);eF(m);i=g;return}else if((l|0)==8){rB(a,b,d,f);if(!o){eF(m);i=g;return}o=j|0;A=j;Q=j+16|0;M=0;do{R=M*3|0;N=n+(R+2<<4)|0;c[A>>2]=c[N>>2];c[A+4>>2]=c[N+4>>2];c[A+8>>2]=c[N+8>>2];c[A+12>>2]=c[N+12>>2];N=n+(R+4<<4)|0;c[Q>>2]=c[N>>2];c[Q+4>>2]=c[N+4>>2];c[Q+8>>2]=c[N+8>>2];c[Q+12>>2]=c[N+12>>2];uB(a,o,2);M=M+1|0;}while((M|0)<(d|0));eF(m);i=g;return}else if((l|0)==16777216){M=d+1|0;o=jk(M<<4)|0;Q=o;if((d|0)>1){A=1;do{N=Q+(A<<4)|0;R=b+(A<<4)|0;c[N>>2]=c[R>>2];c[N+4>>2]=c[R+4>>2];c[N+8>>2]=c[R+8>>2];c[N+12>>2]=c[R+12>>2];A=A+1|0;}while((A|0)<(d|0))}A=d*3|0;R=n+(A+1<<4)|0;c[o>>2]=c[R>>2];c[o+4>>2]=c[R+4>>2];c[o+8>>2]=c[R+8>>2];c[o+12>>2]=c[R+12>>2];N=Q+(d<<4)|0;K=n+(A-1<<4)|0;c[N>>2]=c[K>>2];c[N+4>>2]=c[K+4>>2];c[N+8>>2]=c[K+8>>2];c[N+12>>2]=c[K+12>>2];rB(a,Q,M,f);eF(o);o=j;c[o>>2]=c[K>>2];c[o+4>>2]=c[K+4>>2];c[o+8>>2]=c[K+8>>2];c[o+12>>2]=c[K+12>>2];K=j+16|0;o=K;c[o>>2]=c[R>>2];c[o+4>>2]=c[R+4>>2];c[o+8>>2]=c[R+8>>2];c[o+12>>2]=c[R+12>>2];R=j+32|0;h[R>>3]=+h[K>>3]+(+h[j>>3]- +h[n+(A<<4)>>3]);h[j+40>>3]=+h[j+24>>3]+(+h[j+8>>3]- +h[n+(A<<4)+8>>3]);uB(a,K,2);K=R;c[o>>2]=c[K>>2];c[o+4>>2]=c[K+4>>2];c[o+8>>2]=c[K+8>>2];c[o+12>>2]=c[K+12>>2];uB(a,j|0,2);eF(m);i=g;return}else if((l|0)==33554432){K=d+2|0;o=jk(K<<4)|0;R=o;A=b;c[o>>2]=c[A>>2];c[o+4>>2]=c[A+4>>2];c[o+8>>2]=c[A+8>>2];c[o+12>>2]=c[A+12>>2];A=o+16|0;c[A>>2]=c[L>>2];c[A+4>>2]=c[L+4>>2];c[A+8>>2]=c[L+8>>2];c[A+12>>2]=c[L+12>>2];A=m+48|0;n=A;M=m+64|0;h[o+32>>3]=+h[L>>3]+(+h[n>>3]- +h[M>>3])/3.0;Q=m+56|0;N=m+72|0;h[o+40>>3]=+h[m+40>>3]+(+h[Q>>3]- +h[N>>3])/3.0;O=+h[n>>3];h[o+48>>3]=O+(O- +h[M>>3])/3.0;O=+h[Q>>3];h[o+56>>3]=O+(O- +h[N>>3])/3.0;if((K|0)>4){N=4;do{Q=R+(N<<4)|0;M=b+(N-2<<4)|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];N=N+1|0;}while((N|0)<(K|0))}rB(a,R,K,f);eF(o);o=j;c[o>>2]=c[A>>2];c[o+4>>2]=c[A+4>>2];c[o+8>>2]=c[A+8>>2];c[o+12>>2]=c[A+12>>2];A=j+16|0;c[A>>2]=c[L>>2];c[A+4>>2]=c[L+4>>2];c[A+8>>2]=c[L+8>>2];c[A+12>>2]=c[L+12>>2];uB(a,j|0,2);eF(m);i=g;return}else if((l|0)==50331648){A=d+3|0;o=jk(A<<4)|0;K=o;R=b;c[o>>2]=c[R>>2];c[o+4>>2]=c[R+4>>2];c[o+8>>2]=c[R+8>>2];c[o+12>>2]=c[R+12>>2];R=b|0;O=+h[R>>3];N=P;h[o+16>>3]=O-(O- +h[N>>3])*.25;M=m+56|0;O=+h[b+8>>3]+(+h[M>>3]- +h[m+72>>3])/3.0;h[o+24>>3]=O;z=+h[R>>3];h[o+32>>3]=z-(z- +h[N>>3])*2.0;h[o+40>>3]=O;O=+h[R>>3];h[o+48>>3]=O-(O- +h[N>>3])*2.25;h[o+56>>3]=+h[M>>3];h[o+64>>3]=+h[m+48>>3];h[o+72>>3]=+h[M>>3];if((A|0)>4){M=4;do{N=K+(M<<4)|0;R=b+(M-3<<4)|0;c[N>>2]=c[R>>2];c[N+4>>2]=c[R+4>>2];c[N+8>>2]=c[R+8>>2];c[N+12>>2]=c[R+12>>2];M=M+1|0;}while((M|0)<(A|0))}rB(a,K,A,f);eF(o);eF(m);i=g;return}else if((l|0)==67108864){if((d|0)!=4){cc(155064,126504,688,169992)}o=jk(96)|0;A=b;c[o>>2]=c[A>>2];c[o+4>>2]=c[A+4>>2];c[o+8>>2]=c[A+8>>2];c[o+12>>2]=c[A+12>>2];A=o+16|0;c[A>>2]=c[L>>2];c[A+4>>2]=c[L+4>>2];c[A+8>>2]=c[L+8>>2];c[A+12>>2]=c[L+12>>2];A=o+32|0;K=m+64|0;c[A>>2]=c[K>>2];c[A+4>>2]=c[K+4>>2];c[A+8>>2]=c[K+8>>2];c[A+12>>2]=c[K+12>>2];A=o+48|0;M=b+32|0;c[A>>2]=c[M>>2];c[A+4>>2]=c[M+4>>2];c[A+8>>2]=c[M+8>>2];c[A+12>>2]=c[M+12>>2];M=o+64|0;A=m+128|0;c[M>>2]=c[A>>2];c[M+4>>2]=c[A+4>>2];c[M+8>>2]=c[A+8>>2];c[M+12>>2]=c[A+12>>2];M=o+80|0;R=m+160|0;c[M>>2]=c[R>>2];c[M+4>>2]=c[R+4>>2];c[M+8>>2]=c[R+8>>2];c[M+12>>2]=c[R+12>>2];rB(a,o,6,f);eF(o);o=j|0;h[j>>3]=+h[P>>3]+(+h[m+176>>3]- +h[m>>3]);h[j+8>>3]=+h[m+24>>3]+(+h[m+184>>3]- +h[m+8>>3]);R=j+16|0;c[R>>2]=c[K>>2];c[R+4>>2]=c[K+4>>2];c[R+8>>2]=c[K+8>>2];c[R+12>>2]=c[K+12>>2];uB(a,o,2);c[R>>2]=c[A>>2];c[R+4>>2]=c[A+4>>2];c[R+8>>2]=c[A+8>>2];c[R+12>>2]=c[A+12>>2];uB(a,o,2);c[R>>2]=c[m>>2];c[R+4>>2]=c[m+4>>2];c[R+8>>2]=c[m+8>>2];c[R+12>>2]=c[m+12>>2];uB(a,o,2);eF(m);i=g;return}else if((l|0)==83886080){if((d|0)!=4){cc(155064,126504,711,169992)}o=jk(192)|0;R=b;c[o>>2]=c[R>>2];c[o+4>>2]=c[R+4>>2];c[o+8>>2]=c[R+8>>2];c[o+12>>2]=c[R+12>>2];R=o+16|0;A=b+16|0;c[R>>2]=c[A>>2];c[R+4>>2]=c[A+4>>2];c[R+8>>2]=c[A+8>>2];c[R+12>>2]=c[A+12>>2];A=m+48|0;O=+h[A>>3];R=m+64|0;z=O+(+h[R>>3]-O);K=o+32|0;M=K;h[M>>3]=z;N=m+56|0;O=+h[N>>3];Q=m+72|0;s=O+(+h[Q>>3]-O);n=o+40|0;h[n>>3]=s;O=z+(+h[A>>3]- +h[L>>3]);e=o+48|0;h[e>>3]=O;x=s+(+h[N>>3]- +h[m+40>>3]);E=o+56|0;h[E>>3]=x;w=O+(+h[R>>3]- +h[A>>3]);A=o+64|0;h[A>>3]=w;y=x+(+h[Q>>3]- +h[N>>3]);N=o+72|0;h[N>>3]=y;Q=o+80|0;h[Q>>3]=w+(z-O);h[o+88>>3]=y+(s-x);R=m+96|0;x=+h[R>>3];F=m+80|0;s=x+(+h[F>>3]-x);J=o+144|0;h[J>>3]=s;u=m+104|0;x=+h[u>>3];q=m+88|0;y=x+(+h[q>>3]-x);h[o+152>>3]=y;x=s+(+h[R>>3]- +h[m+112>>3]);v=o+128|0;h[v>>3]=x;O=y+(+h[u>>3]- +h[m+120>>3]);k=o+136|0;h[k>>3]=O;z=x+(+h[F>>3]- +h[R>>3]);R=o+112|0;h[R>>3]=z;w=O+(+h[q>>3]- +h[u>>3]);u=o+120|0;h[u>>3]=w;q=o+96|0;F=q;h[F>>3]=z+(s-x);p=o+104|0;h[p>>3]=w+(y-O);t=o+160|0;r=b+32|0;c[t>>2]=c[r>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2];r=o+176|0;t=b+48|0;c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];rB(a,o,12,f);t=j|0;r=j;c[r>>2]=c[K>>2];c[r+4>>2]=c[K+4>>2];c[r+8>>2]=c[K+8>>2];c[r+12>>2]=c[K+12>>2];O=+h[M>>3];y=O-(+h[e>>3]-O);M=j+16|0;h[M>>3]=y;O=+h[n>>3];w=O-(+h[E>>3]-O);n=j+24|0;h[n>>3]=w;K=j+32|0;h[K>>3]=y+(+h[A>>3]- +h[e>>3]);e=j+40|0;h[e>>3]=w+(+h[N>>3]- +h[E>>3]);E=j+48|0;c[E>>2]=c[Q>>2];c[E+4>>2]=c[Q+4>>2];c[E+8>>2]=c[Q+8>>2];c[E+12>>2]=c[Q+12>>2];uB(a,t,4);c[r>>2]=c[q>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[r+12>>2]=c[q+12>>2];w=+h[F>>3];y=w-(+h[R>>3]-w);h[M>>3]=y;w=+h[p>>3];O=w-(+h[u>>3]-w);h[n>>3]=O;h[K>>3]=y+(+h[v>>3]- +h[R>>3]);h[e>>3]=O+(+h[k>>3]- +h[u>>3]);c[E>>2]=c[J>>2];c[E+4>>2]=c[J+4>>2];c[E+8>>2]=c[J+8>>2];c[E+12>>2]=c[J+12>>2];uB(a,t,4);eF(o);eF(m);i=g;return}else if((l|0)==100663296){o=d+5|0;t=jk(o<<4)|0;J=b+16|0;O=+h[J>>3];E=b|0;y=+h[E>>3]-O;w=y*.125+(O+y*.5);u=t;h[u>>3]=w;k=b+40|0;y=+h[k>>3];e=b+24|0;R=m+56|0;v=m+72|0;O=y+(+h[e>>3]-y)*.5+(+h[R>>3]- +h[v>>3])*3.0*.5;h[t+8>>3]=O;y=+h[J>>3];x=+h[E>>3]-y;s=y+x*.5-x*.25;h[t+16>>3]=s;h[t+24>>3]=O;h[t+32>>3]=s;x=+h[k>>3];h[t+40>>3]=x+(+h[e>>3]-x)*.5;K=L;n=m+48|0;x=s+(+h[K>>3]- +h[n>>3])*.5;h[t+48>>3]=x;s=+h[k>>3];h[t+56>>3]=s+(+h[e>>3]-s)*.5;h[t+64>>3]=x;x=+h[k>>3];s=x+(+h[e>>3]-x)*.5+(+h[R>>3]- +h[v>>3]);h[t+72>>3]=s;h[t+80>>3]=w;h[t+88>>3]=s;h[t+96>>3]=w;x=s-(+h[R>>3]- +h[v>>3])*.25;h[t+104>>3]=x;h[t+112>>3]=w+(+h[K>>3]- +h[n>>3]);h[t+120>>3]=x+(+h[R>>3]- +h[v>>3])*.5;h[t+128>>3]=+h[u>>3];h[t+136>>3]=O+(+h[R>>3]- +h[v>>3])*.25;rB(a,t,o,f);h[j>>3]=+h[J>>3];O=+h[k>>3];h[j+8>>3]=O+(+h[e>>3]-O)*.5;h[j+16>>3]=+h[E>>3];h[j+24>>3]=O+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,j|0,2);eF(t);eF(m);i=g;return}else if((l|0)==117440512){t=d+1|0;E=jk(t<<4)|0;e=P;h[E>>3]=+h[e>>3];k=m+56|0;J=m+72|0;h[E+8>>3]=+h[m+24>>3]-(+h[k>>3]- +h[J>>3])*.5;h[E+16>>3]=+h[m+48>>3];O=+h[k>>3];h[E+24>>3]=O-(O- +h[J>>3])*.5;h[E+32>>3]=+h[b+32>>3];o=b+40|0;h[E+40>>3]=+h[o>>3]+(+h[k>>3]- +h[J>>3])*.5;h[E+48>>3]=+h[e>>3];h[E+56>>3]=+h[o>>3]+(+h[k>>3]- +h[J>>3])*.5;O=+h[b+8>>3];h[E+72>>3]=O-(O- +h[b+56>>3])*.5;h[E+64>>3]=+h[b>>3];rB(a,E,t,f);eF(E);eF(m);i=g;return}else if((l|0)==134217728){E=d+4|0;t=jk(E<<4)|0;J=b+16|0;O=+h[J>>3];k=b|0;o=L;e=m+48|0;x=O+(+h[k>>3]-O)*.5+(+h[o>>3]- +h[e>>3])*.25;h[t>>3]=x;v=b+40|0;O=+h[v>>3];R=b+24|0;w=O+(+h[R>>3]-O)*.5;h[t+8>>3]=w;h[t+16>>3]=x;u=m+56|0;n=m+72|0;O=w+(+h[u>>3]- +h[n>>3])*.5;h[t+24>>3]=O;s=x+(+h[o>>3]- +h[e>>3])*.5;h[t+32>>3]=s;h[t+40>>3]=O;h[t+48>>3]=s;s=O+(+h[u>>3]- +h[n>>3])*.5;h[t+56>>3]=s;x=+h[J>>3];y=x+(+h[k>>3]-x)*.5-(+h[o>>3]- +h[e>>3])*3.0*.25;h[t+64>>3]=y;h[t+72>>3]=s;h[t+80>>3]=y;h[t+88>>3]=O;y=+h[J>>3];s=y+(+h[k>>3]-y)*.5-(+h[o>>3]- +h[e>>3])*.25;h[t+96>>3]=s;h[t+104>>3]=O;h[t+112>>3]=s;h[t+120>>3]=w;rB(a,t,E,f);h[j>>3]=+h[J>>3];w=+h[v>>3];h[j+8>>3]=w+(+h[R>>3]-w)*.5;h[j+16>>3]=+h[k>>3];h[j+24>>3]=w+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,j|0,2);eF(t);eF(m);i=g;return}else if((l|0)==150994944){t=d+2|0;k=jk(t<<4)|0;R=b+16|0;w=+h[R>>3];v=b|0;J=L;E=m+48|0;s=w+(+h[v>>3]-w)*.5+(+h[J>>3]- +h[E>>3])*3.0*.25;h[k>>3]=s;e=b+40|0;w=+h[e>>3];o=b+24|0;O=w+(+h[o>>3]-w)*.5;h[k+8>>3]=O;h[k+16>>3]=s;n=m+56|0;u=m+72|0;s=O+(+h[n>>3]- +h[u>>3])*.25;h[k+24>>3]=s;w=+h[R>>3];h[k+32>>3]=w+(+h[v>>3]-w)*.5+(+h[J>>3]- +h[E>>3])*.25;w=s+(+h[n>>3]- +h[u>>3])*.5;h[k+40>>3]=w;y=+h[R>>3];h[k+48>>3]=y+(+h[v>>3]-y)*.5-(+h[J>>3]- +h[E>>3])*.25;h[k+56>>3]=w;w=+h[R>>3];y=w+(+h[v>>3]-w)*.5-(+h[J>>3]- +h[E>>3])*3.0*.25;h[k+64>>3]=y;h[k+72>>3]=s;h[k+80>>3]=y;h[k+88>>3]=O;rB(a,k,t,f);h[j>>3]=+h[R>>3];O=+h[e>>3];h[j+8>>3]=O+(+h[o>>3]-O)*.5;h[j+16>>3]=+h[v>>3];h[j+24>>3]=O+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,j|0,2);eF(k);eF(m);i=g;return}else if((l|0)==167772160){k=d+1|0;v=jk(k<<4)|0;o=b+16|0;O=+h[o>>3];e=b|0;R=L;t=m+48|0;y=O+(+h[e>>3]-O)*.5+(+h[R>>3]- +h[t>>3]);h[v>>3]=y;E=b+40|0;O=+h[E>>3];J=b+24|0;u=m+56|0;n=m+72|0;s=O+(+h[J>>3]-O)*.5+(+h[u>>3]- +h[n>>3])*.25;h[v+8>>3]=s;O=y-(+h[R>>3]- +h[t>>3]);h[v+16>>3]=O;h[v+24>>3]=s+(+h[u>>3]- +h[n>>3]);h[v+32>>3]=O;O=s+(+h[u>>3]- +h[n>>3])*.5;h[v+40>>3]=O;y=+h[o>>3];w=+h[e>>3]-y;x=y+w*.5-w*.25;h[v+48>>3]=x;h[v+56>>3]=O;h[v+64>>3]=x;h[v+72>>3]=s;rB(a,v,k,f);h[j>>3]=+h[o>>3];s=+h[E>>3];h[j+8>>3]=s+(+h[J>>3]-s)*.5;h[j+16>>3]=+h[e>>3];h[j+24>>3]=s+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,j|0,2);eF(v);eF(m);i=g;return}else if((l|0)==184549376){v=d+4|0;e=jk(v<<4)|0;J=b+16|0;s=+h[J>>3];E=b|0;x=+h[E>>3]-s;o=L;k=m+48|0;O=x*.125+(s+x*.5)+(+h[o>>3]- +h[k>>3])*.5;h[e>>3]=O;n=b+40|0;x=+h[n>>3];u=b+24|0;t=m+56|0;R=m+72|0;s=x+(+h[u>>3]-x)*.5+(+h[t>>3]- +h[R>>3])*.25;h[e+8>>3]=s;x=+h[J>>3];w=+h[E>>3]-x;y=x+w*.5-w*.125;h[e+16>>3]=y;h[e+24>>3]=s;h[e+32>>3]=y;w=s+(+h[t>>3]- +h[R>>3])*.5;h[e+40>>3]=w;s=y-(+h[o>>3]- +h[k>>3])*.5;h[e+48>>3]=s;h[e+56>>3]=w;K=e+64|0;h[K>>3]=s;s=+h[n>>3];w=s+(+h[u>>3]-s)*.5-(+h[t>>3]- +h[R>>3])*.25;h[e+72>>3]=w;s=O-(+h[o>>3]- +h[k>>3])*.5;h[e+80>>3]=s;h[e+88>>3]=w;h[e+96>>3]=s;s=w-(+h[t>>3]- +h[R>>3])*.5;h[e+104>>3]=s;R=e+112|0;h[R>>3]=O;h[e+120>>3]=s;rB(a,e,v,f);v=j|0;t=j|0;h[t>>3]=+h[J>>3];s=+h[n>>3];J=j+8|0;h[J>>3]=s+(+h[u>>3]-s)*.5;k=j+16|0;h[k>>3]=+h[K>>3];K=b+8|0;o=b+56|0;p=j+24|0;h[p>>3]=s+(+h[K>>3]- +h[o>>3])*.5;uB(a,v,2);h[t>>3]=+h[R>>3];s=+h[n>>3];h[J>>3]=s+(+h[u>>3]-s)*.5;h[k>>3]=+h[E>>3];h[p>>3]=s+(+h[K>>3]- +h[o>>3])*.5;uB(a,v,2);eF(e);eF(m);i=g;return}else if((l|0)==201326592){e=d<<4;v=jk(e)|0;o=b+16|0;s=+h[o>>3];h[v>>3]=s;K=b+40|0;O=+h[K>>3];p=b+24|0;E=m+56|0;k=m+72|0;w=O+(+h[p>>3]-O)*.5+(+h[E>>3]- +h[k>>3])*.125;h[v+8>>3]=w;u=L;J=m+48|0;O=s+(+h[u>>3]- +h[J>>3])*2.0;h[v+16>>3]=O;h[v+24>>3]=w;h[v+32>>3]=O;O=w+(+h[E>>3]- +h[k>>3])*.5;h[v+40>>3]=O;h[v+48>>3]=s;h[v+56>>3]=O;rB(a,v,d,f);eF(v);v=jk(e)|0;O=+h[o>>3]+(+h[u>>3]- +h[J>>3]);h[v>>3]=O;s=+h[K>>3];w=s+(+h[p>>3]-s)*.5-(+h[E>>3]- +h[k>>3])*5.0*.125;h[v+8>>3]=w;s=O+(+h[u>>3]- +h[J>>3]);J=v+16|0;h[J>>3]=s;h[v+24>>3]=w;h[v+32>>3]=s;s=w+(+h[E>>3]- +h[k>>3])*.5;h[v+40>>3]=s;h[v+48>>3]=O;h[v+56>>3]=s;rB(a,v,d,f);h[j>>3]=+h[J>>3];s=+h[K>>3];h[j+8>>3]=s+(+h[p>>3]-s)*.5;h[j+16>>3]=+h[b>>3];h[j+24>>3]=s+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,j|0,2);eF(v);eF(m);i=g;return}else if((l|0)==218103808){v=d<<4;p=jk(v)|0;K=b|0;s=+h[K>>3];h[p>>3]=s;J=b+40|0;O=+h[J>>3];k=b+24|0;E=m+56|0;u=m+72|0;w=O+(+h[k>>3]-O)*.5+(+h[E>>3]- +h[u>>3])*.125;h[p+8>>3]=w;h[p+16>>3]=s;O=w+(+h[E>>3]- +h[u>>3])*.5;h[p+24>>3]=O;y=s-(+h[E>>3]- +h[u>>3])*2.0;h[p+32>>3]=y;h[p+40>>3]=O;h[p+48>>3]=y;h[p+56>>3]=w;rB(a,p,d,f);eF(p);p=jk(v)|0;w=+h[K>>3]-(+h[L>>3]- +h[m+48>>3]);h[p>>3]=w;y=+h[J>>3];O=y+(+h[k>>3]-y)*.5-(+h[E>>3]- +h[u>>3])*5.0*.125;h[p+8>>3]=O;h[p+16>>3]=w;y=O+(+h[E>>3]- +h[u>>3])*.5;h[p+24>>3]=y;s=w-(+h[E>>3]- +h[u>>3]);h[p+32>>3]=s;h[p+40>>3]=y;u=p+48|0;h[u>>3]=s;h[p+56>>3]=O;rB(a,p,d,f);h[j>>3]=+h[b+16>>3];O=+h[J>>3];h[j+8>>3]=O+(+h[k>>3]-O)*.5;h[j+16>>3]=+h[u>>3];h[j+24>>3]=O+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,j|0,2);eF(p);eF(m);i=g;return}else if((l|0)==234881024){p=d<<4;u=jk(p)|0;k=b+16|0;O=+h[k>>3];J=b|0;E=L;K=m+48|0;s=O+(+h[J>>3]-O)*.5-(+h[E>>3]- +h[K>>3])*9.0*.125;h[u>>3]=s;v=b+40|0;O=+h[v>>3];o=b+24|0;e=m+56|0;n=m+72|0;y=O+(+h[o>>3]-O)*.5+(+h[e>>3]- +h[n>>3])*.125;h[u+8>>3]=y;O=s+(+h[E>>3]- +h[K>>3]);h[u+16>>3]=O;h[u+24>>3]=y;h[u+32>>3]=O;O=y+(+h[e>>3]- +h[n>>3])*.5;h[u+40>>3]=O;h[u+48>>3]=s;h[u+56>>3]=O;rB(a,u,d,f);eF(u);u=jk(p)|0;O=+h[k>>3];s=O+(+h[J>>3]-O)*.5-(+h[E>>3]- +h[K>>3])*9.0*.125;h[u>>3]=s;O=+h[v>>3];y=O+(+h[o>>3]-O)*.5-(+h[e>>3]- +h[n>>3])*5.0*.125;h[u+8>>3]=y;O=s+(+h[E>>3]- +h[K>>3]);h[u+16>>3]=O;h[u+24>>3]=y;h[u+32>>3]=O;O=y+(+h[e>>3]- +h[n>>3])*.5;h[u+40>>3]=O;h[u+48>>3]=s;h[u+56>>3]=O;rB(a,u,d,f);eF(u);u=jk(p)|0;O=+h[k>>3];s=O+(+h[J>>3]-O)*.5+(+h[E>>3]- +h[K>>3])*.125;h[u>>3]=s;O=+h[v>>3];y=O+(+h[o>>3]-O)*.5-(+h[e>>3]- +h[n>>3])*5.0*.125;h[u+8>>3]=y;O=s+(+h[E>>3]- +h[K>>3]);h[u+16>>3]=O;h[u+24>>3]=y;h[u+32>>3]=O;O=y+(+h[e>>3]- +h[n>>3])*.5;h[u+40>>3]=O;h[u+48>>3]=s;h[u+56>>3]=O;rB(a,u,d,f);eF(u);u=jk(p)|0;O=+h[k>>3];s=O+(+h[J>>3]-O)*.5+(+h[E>>3]- +h[K>>3])*.125;h[u>>3]=s;O=+h[v>>3];y=O+(+h[o>>3]-O)*.5+(+h[e>>3]- +h[n>>3])*.125;h[u+8>>3]=y;O=s+(+h[E>>3]- +h[K>>3]);p=u+16|0;h[p>>3]=O;h[u+24>>3]=y;h[u+32>>3]=O;O=y+(+h[e>>3]- +h[n>>3])*.5;h[u+40>>3]=O;h[u+48>>3]=s;h[u+56>>3]=O;rB(a,u,d,f);n=j|0;e=j|0;h[e>>3]=+h[p>>3];O=+h[v>>3];p=j+8|0;h[p>>3]=O+(+h[o>>3]-O)*.5;R=j+16|0;h[R>>3]=+h[J>>3];t=b+8|0;M=b+56|0;F=j+24|0;h[F>>3]=O+(+h[t>>3]- +h[M>>3])*.5;uB(a,n,2);O=+h[k>>3];h[e>>3]=O+(+h[J>>3]-O)*.5-(+h[E>>3]- +h[K>>3])*9.0*.125;s=+h[v>>3];h[p>>3]=s+(+h[o>>3]-s)*.5;h[R>>3]=O;h[F>>3]=s+(+h[t>>3]- +h[M>>3])*.5;uB(a,n,2);eF(u);eF(m);i=g;return}else if((l|0)==251658240){u=d<<4;n=jk(u)|0;M=b+16|0;s=+h[M>>3];t=b|0;F=L;R=m+48|0;O=s+(+h[t>>3]-s)*.5-(+h[F>>3]- +h[R>>3]);h[n>>3]=O;o=b+40|0;s=+h[o>>3];p=b+24|0;v=m+56|0;K=m+72|0;y=s+(+h[p>>3]-s)*.5+(+h[v>>3]- +h[K>>3])*.125;h[n+8>>3]=y;s=O+(+h[F>>3]- +h[R>>3])*2.0;h[n+16>>3]=s;h[n+24>>3]=y;h[n+32>>3]=s;s=y+(+h[v>>3]- +h[K>>3])*.5;h[n+40>>3]=s;h[n+48>>3]=O;h[n+56>>3]=s;rB(a,n,d,f);eF(n);n=jk(u)|0;s=+h[M>>3];O=s+(+h[t>>3]-s)*.5-(+h[F>>3]- +h[R>>3]);u=n;h[u>>3]=O;s=+h[o>>3];y=s+(+h[p>>3]-s)*.5-(+h[v>>3]- +h[K>>3])*5.0*.125;h[n+8>>3]=y;s=O+(+h[F>>3]- +h[R>>3])*2.0;R=n+16|0;h[R>>3]=s;h[n+24>>3]=y;h[n+32>>3]=s;s=y+(+h[v>>3]- +h[K>>3])*.5;h[n+40>>3]=s;h[n+48>>3]=O;h[n+56>>3]=s;rB(a,n,d,f);K=j|0;v=j|0;h[v>>3]=+h[R>>3];s=+h[o>>3];R=j+8|0;h[R>>3]=s+(+h[p>>3]-s)*.5;F=j+16|0;h[F>>3]=+h[t>>3];t=b+8|0;E=b+56|0;J=j+24|0;h[J>>3]=s+(+h[t>>3]- +h[E>>3])*.5;uB(a,K,2);h[v>>3]=+h[M>>3];s=+h[o>>3];h[R>>3]=s+(+h[p>>3]-s)*.5;h[F>>3]=+h[u>>3];h[J>>3]=s+(+h[t>>3]- +h[E>>3])*.5;uB(a,K,2);eF(n);eF(m);i=g;return}else if((l|0)==268435456){n=jk(d<<4)|0;K=b|0;h[n>>3]=+h[K>>3];E=m+56|0;t=m+72|0;h[n+8>>3]=+h[m+24>>3]-(+h[E>>3]- +h[t>>3])*.5;J=m+48|0;h[n+16>>3]=+h[J>>3];s=+h[E>>3];h[n+24>>3]=s-(s- +h[t>>3])*.5;h[n+32>>3]=+h[b+32>>3];u=b+40|0;h[n+40>>3]=+h[u>>3]+(+h[E>>3]- +h[t>>3])*.5;h[n+48>>3]=+h[K>>3];h[n+56>>3]=+h[u>>3]+(+h[E>>3]- +h[t>>3])*.5;rB(a,n,d,f);F=b+16|0;p=L;s=+h[F>>3]+(+h[p>>3]- +h[J>>3])*.25;R=j|0;o=j|0;h[o>>3]=s;O=+h[u>>3];M=b+24|0;y=O+(+h[M>>3]-O)*.5+(+h[E>>3]- +h[t>>3])*.125;v=j+8|0;h[v>>3]=y;e=j+16|0;h[e>>3]=s+(+h[p>>3]- +h[J>>3])*.25;k=j+24|0;h[k>>3]=y-(+h[E>>3]- +h[t>>3])*.25;uB(a,R,2);y=+h[F>>3]+(+h[p>>3]- +h[J>>3])*.25;h[o>>3]=y;s=+h[u>>3];O=s+(+h[M>>3]-s)*.5-(+h[E>>3]- +h[t>>3])*.125;h[v>>3]=O;h[e>>3]=y+(+h[p>>3]- +h[J>>3])*.25;h[k>>3]=O+(+h[E>>3]- +h[t>>3])*.25;uB(a,R,2);h[o>>3]=+h[F>>3]+(+h[p>>3]- +h[J>>3])*.25;O=+h[u>>3]+(+h[E>>3]- +h[t>>3])*3.0*.25;h[v>>3]=O;h[e>>3]=+h[K>>3]-(+h[p>>3]- +h[J>>3])*.25;h[k>>3]=O;uB(a,R,2);eF(n);eF(m);i=g;return}else if((l|0)==285212672){n=jk(d<<4)|0;R=b+16|0;O=+h[R>>3];k=b|0;J=L;p=m+48|0;y=O+(+h[k>>3]-O)*.5+(+h[J>>3]- +h[p>>3])*.5;h[n>>3]=y;K=b+40|0;O=+h[K>>3];e=b+24|0;s=O+(+h[e>>3]-O)*.5+(+h[J>>3]- +h[p>>3])*.5;h[n+8>>3]=s;h[n+16>>3]=y;y=+h[K>>3];O=y+(+h[e>>3]-y)*.5-(+h[J>>3]- +h[p>>3])*.5;h[n+24>>3]=O;y=+h[R>>3];w=y+(+h[k>>3]-y)*.5-(+h[J>>3]- +h[p>>3])*.5;h[n+32>>3]=w;h[n+40>>3]=O;h[n+48>>3]=w;h[n+56>>3]=s;rB(a,n,d,f);eF(n);s=+h[R>>3];w=s+(+h[k>>3]-s)*.5;s=w+(+h[J>>3]- +h[p>>3])*3.0*.25;n=j|0;v=j|0;h[v>>3]=s;O=+h[K>>3];y=O+(+h[e>>3]-O)*.5;O=y+(+h[J>>3]- +h[p>>3])*3.0*.25;t=j+8|0;h[t>>3]=O;E=j+16|0;h[E>>3]=s;s=y-(+h[J>>3]- +h[p>>3])*3.0*.25;u=j+24|0;h[u>>3]=s;y=w-(+h[J>>3]- +h[p>>3])*3.0*.25;h[j+32>>3]=y;h[j+40>>3]=s;h[j+48>>3]=y;h[j+56>>3]=O;F=j+64|0;o=j;c[F>>2]=c[o>>2];c[F+4>>2]=c[o+4>>2];c[F+8>>2]=c[o+8>>2];c[F+12>>2]=c[o+12>>2];uB(a,n,5);O=+h[R>>3];y=+h[k>>3];h[v>>3]=O+(y-O)*.5+(+h[J>>3]- +h[p>>3])*3.0*.25;O=+h[K>>3];h[t>>3]=O+(+h[e>>3]-O)*.5;h[E>>3]=y;o=b+8|0;F=b+56|0;h[u>>3]=O+(+h[o>>3]- +h[F>>3])*.5;uB(a,n,2);O=+h[R>>3];h[v>>3]=O;y=+h[K>>3];h[t>>3]=y+(+h[e>>3]-y)*.5;h[E>>3]=O+(+h[k>>3]-O)*.5-(+h[J>>3]- +h[p>>3])*3.0*.25;h[u>>3]=y+(+h[o>>3]- +h[F>>3])*.5;uB(a,n,2);eF(m);i=g;return}else if((l|0)==301989888){n=d+12|0;F=jk(n<<4)|0;o=b+16|0;y=+h[o>>3];u=b|0;p=L;J=m+48|0;O=y+(+h[u>>3]-y)*.5+(+h[p>>3]- +h[J>>3])*.25;h[F>>3]=O;k=b+40|0;y=+h[k>>3];E=b+24|0;e=m+56|0;t=m+72|0;s=y+(+h[E>>3]-y)*.5+(+h[e>>3]- +h[t>>3])*.5;K=F+8|0;h[K>>3]=s;h[F+16>>3]=O;y=s+(+h[e>>3]- +h[t>>3])*.125;v=F+24|0;h[v>>3]=y;s=O-(+h[p>>3]- +h[J>>3])*.125;R=F+32|0;h[R>>3]=s;w=y+(+h[e>>3]- +h[t>>3])*.125;h[F+40>>3]=w;h[F+48>>3]=O;x=w+(+h[e>>3]- +h[t>>3])*.125;h[F+56>>3]=x;h[F+64>>3]=O;O=x+(+h[e>>3]- +h[t>>3])*.125;h[F+72>>3]=O;h[F+80>>3]=s;h[F+88>>3]=O;s=+h[o>>3];z=s+(+h[u>>3]-s)*.5;h[F+96>>3]=z;h[F+104>>3]=x;s=z-(+h[p>>3]- +h[J>>3])*.125;h[F+112>>3]=s;h[F+120>>3]=O;I=s-(+h[p>>3]- +h[J>>3])*.125;h[F+128>>3]=I;h[F+136>>3]=O;h[F+144>>3]=I;h[F+152>>3]=x;x=I+(+h[p>>3]- +h[J>>3])*.125;h[F+160>>3]=x;h[F+168>>3]=w;h[F+176>>3]=I;h[F+184>>3]=y;h[F+192>>3]=I;I=+h[K>>3];h[F+200>>3]=I;h[F+208>>3]=x;h[F+216>>3]=I;K=F+224|0;h[K>>3]=z;h[F+232>>3]=+h[v>>3];h[F+240>>3]=+h[R>>3];h[F+248>>3]=I;rB(a,F,n,f);I=+h[K>>3];n=j|0;R=j|0;h[R>>3]=I;z=+h[k>>3];x=z+(+h[E>>3]-z)*.5;v=j+8|0;h[v>>3]=x;J=j+16|0;h[J>>3]=I;p=j+24|0;h[p>>3]=x+(+h[e>>3]- +h[t>>3])*.125;uB(a,n,2);x=+h[K>>3];h[R>>3]=x;I=+h[k>>3];z=I+(+h[E>>3]-I)*.5+(+h[e>>3]- +h[t>>3])*.25;h[v>>3]=z;h[J>>3]=x;h[p>>3]=z+(+h[e>>3]- +h[t>>3])*.125;uB(a,n,2);h[R>>3]=+h[o>>3];z=+h[k>>3];h[v>>3]=z+(+h[E>>3]-z)*.5;h[J>>3]=+h[u>>3];h[p>>3]=z+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,n,2);eF(F);eF(m);i=g;return}else if((l|0)==318767104){F=d+4|0;n=jk(F<<4)|0;p=b+16|0;z=+h[p>>3];u=b|0;J=L;E=m+48|0;x=z+(+h[u>>3]-z)*.5+(+h[J>>3]- +h[E>>3])*.125;h[n>>3]=x;v=b+40|0;z=+h[v>>3];k=b+24|0;o=m+56|0;R=m+72|0;I=z+(+h[k>>3]-z)*.5+(+h[o>>3]- +h[R>>3])*.5;h[n+8>>3]=I;z=x+(+h[J>>3]- +h[E>>3])*.125;h[n+16>>3]=z;y=I+(+h[o>>3]- +h[R>>3])*.125;h[n+24>>3]=y;h[n+32>>3]=z;z=y+(+h[o>>3]- +h[R>>3])*.25;h[n+40>>3]=z;h[n+48>>3]=x;w=z+(+h[o>>3]- +h[R>>3])*.125;h[n+56>>3]=w;O=x-(+h[J>>3]- +h[E>>3])*.25;h[n+64>>3]=O;h[n+72>>3]=w;w=O-(+h[J>>3]- +h[E>>3])*.125;h[n+80>>3]=w;h[n+88>>3]=z;h[n+96>>3]=w;h[n+104>>3]=y;h[n+112>>3]=O;h[n+120>>3]=I;rB(a,n,F,f);I=+h[p>>3];O=I+(+h[u>>3]-I)*.5;F=j|0;E=j|0;h[E>>3]=O;I=+h[v>>3];y=I+(+h[k>>3]-I)*.5;J=j+8|0;h[J>>3]=y;t=j+16|0;h[t>>3]=O;e=j+24|0;h[e>>3]=y+(+h[o>>3]- +h[R>>3])*.125;uB(a,F,2);y=+h[p>>3];O=y+(+h[u>>3]-y)*.5;h[E>>3]=O;y=+h[v>>3];I=y+(+h[k>>3]-y)*.5+(+h[o>>3]- +h[R>>3])*.25;h[J>>3]=I;h[t>>3]=O;h[e>>3]=I+(+h[o>>3]- +h[R>>3])*.125;uB(a,F,2);h[E>>3]=+h[p>>3];I=+h[v>>3];h[J>>3]=I+(+h[k>>3]-I)*.5;h[t>>3]=+h[u>>3];h[e>>3]=I+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,F,2);eF(n);eF(m);i=g;return}else if((l|0)==335544320){n=d+12|0;F=jk(n<<4)|0;e=b+16|0;I=+h[e>>3];u=b|0;t=L;k=m+48|0;O=I+(+h[u>>3]-I)*.5+(+h[t>>3]- +h[k>>3])*.25;h[F>>3]=O;J=b+40|0;I=+h[J>>3];v=b+24|0;p=m+56|0;E=m+72|0;y=I+(+h[v>>3]-I)*.5+(+h[p>>3]- +h[E>>3])*.5;R=F+8|0;h[R>>3]=y;h[F+16>>3]=O;I=y+(+h[p>>3]- +h[E>>3])*.125;o=F+24|0;h[o>>3]=I;y=O-(+h[t>>3]- +h[k>>3])*.125;K=F+32|0;h[K>>3]=y;w=I+(+h[p>>3]- +h[E>>3])*.125;h[F+40>>3]=w;h[F+48>>3]=O;z=w+(+h[p>>3]- +h[E>>3])*.125;h[F+56>>3]=z;h[F+64>>3]=O;O=z+(+h[p>>3]- +h[E>>3])*.125;h[F+72>>3]=O;h[F+80>>3]=y;h[F+88>>3]=O;y=+h[e>>3];x=y+(+h[u>>3]-y)*.5;h[F+96>>3]=x;h[F+104>>3]=z;y=x-(+h[t>>3]- +h[k>>3])*.125;h[F+112>>3]=y;h[F+120>>3]=O;s=y-(+h[t>>3]- +h[k>>3])*.125;h[F+128>>3]=s;h[F+136>>3]=O;h[F+144>>3]=s;h[F+152>>3]=z;z=s+(+h[t>>3]- +h[k>>3])*.125;h[F+160>>3]=z;h[F+168>>3]=w;h[F+176>>3]=s;h[F+184>>3]=I;h[F+192>>3]=s;s=+h[R>>3];h[F+200>>3]=s;h[F+208>>3]=z;h[F+216>>3]=s;R=F+224|0;h[R>>3]=x;h[F+232>>3]=+h[o>>3];h[F+240>>3]=+h[K>>3];h[F+248>>3]=s;rB(a,F,n,f);n=j|0;K=j;c[K>>2]=c[R>>2];c[K+4>>2]=c[R+4>>2];c[K+8>>2]=c[R+8>>2];c[K+12>>2]=c[R+12>>2];R=j|0;K=j+16|0;h[K>>3]=+h[R>>3];s=+h[J>>3];o=j+24|0;h[o>>3]=s+(+h[v>>3]-s)*.5;uB(a,n,2);h[R>>3]=+h[e>>3];s=+h[J>>3];h[j+8>>3]=s+(+h[v>>3]-s)*.5;h[K>>3]=+h[u>>3];h[o>>3]=s+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,n,2);eF(F);eF(m);i=g;return}else if((l|0)==352321536){F=d+4|0;n=jk(F<<4)|0;o=b+16|0;s=+h[o>>3];u=b|0;K=L;v=m+48|0;x=s+(+h[u>>3]-s)*.5+(+h[K>>3]- +h[v>>3])*.125;h[n>>3]=x;J=b+40|0;s=+h[J>>3];e=b+24|0;R=m+56|0;k=m+72|0;z=s+(+h[e>>3]-s)*.5+(+h[R>>3]- +h[k>>3])*.5;t=n+8|0;h[t>>3]=z;s=x+(+h[K>>3]- +h[v>>3])*.125;h[n+16>>3]=s;I=z+(+h[R>>3]- +h[k>>3])*.125;h[n+24>>3]=I;h[n+32>>3]=s;s=I+(+h[R>>3]- +h[k>>3])*.25;h[n+40>>3]=s;h[n+48>>3]=x;w=s+(+h[R>>3]- +h[k>>3])*.125;h[n+56>>3]=w;O=x-(+h[K>>3]- +h[v>>3])*.25;h[n+64>>3]=O;h[n+72>>3]=w;w=O-(+h[K>>3]- +h[v>>3])*.125;h[n+80>>3]=w;h[n+88>>3]=s;h[n+96>>3]=w;h[n+104>>3]=I;h[n+112>>3]=O;h[n+120>>3]=z;rB(a,n,F,f);z=+h[o>>3];O=z+(+h[u>>3]-z)*.5;F=j|0;v=j|0;h[v>>3]=O;K=j+8|0;h[K>>3]=+h[t>>3];t=j+16|0;h[t>>3]=O;O=+h[J>>3];k=j+24|0;h[k>>3]=O+(+h[e>>3]-O)*.5;uB(a,F,2);h[v>>3]=+h[o>>3];O=+h[J>>3];h[K>>3]=O+(+h[e>>3]-O)*.5;h[t>>3]=+h[u>>3];h[k>>3]=O+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,F,2);eF(n);eF(m);i=g;return}else if((l|0)==369098752){n=d+5|0;F=jk(n<<4)|0;k=P;u=L;t=m+48|0;h[F>>3]=+h[k>>3]-(+h[u>>3]- +h[t>>3])*.5;e=m+56|0;K=m+72|0;h[F+8>>3]=+h[m+24>>3]-(+h[e>>3]- +h[K>>3])*.5;h[F+16>>3]=+h[t>>3];O=+h[e>>3];h[F+24>>3]=O-(O- +h[K>>3])*.5;h[F+32>>3]=+h[b+32>>3];J=b+40|0;h[F+40>>3]=+h[J>>3];O=+h[u>>3];h[F+48>>3]=O+(O- +h[t>>3])*.5;h[F+56>>3]=+h[J>>3];O=+h[u>>3];h[F+64>>3]=O+(O- +h[t>>3])*.5;h[F+72>>3]=+h[J>>3]+(+h[e>>3]- +h[K>>3])*.5;h[F+80>>3]=+h[k>>3]-(+h[u>>3]- +h[t>>3])*.5;h[F+88>>3]=+h[J>>3]+(+h[e>>3]- +h[K>>3])*.5;h[F+96>>3]=+h[k>>3]-(+h[u>>3]- +h[t>>3])*.5;K=b+56|0;h[F+104>>3]=+h[K>>3];e=b+8|0;O=+h[e>>3];h[F+120>>3]=O-(O- +h[K>>3])*.5;h[F+112>>3]=+h[b>>3];h[F+136>>3]=+h[e>>3];h[F+128>>3]=+h[k>>3]-(+h[u>>3]- +h[t>>3])*.5;rB(a,F,n,f);eF(F);eF(m);i=g;return}else if((l|0)==385875968){F=d+3|0;n=jk(F<<4)|0;t=P;u=L;k=m+48|0;h[n>>3]=+h[t>>3]-(+h[u>>3]- +h[k>>3])*.5;e=m+56|0;K=m+72|0;h[n+8>>3]=+h[m+24>>3]-(+h[e>>3]- +h[K>>3])*.5;h[n+16>>3]=+h[k>>3];O=+h[e>>3];h[n+24>>3]=O-(O- +h[K>>3])*.5;h[n+32>>3]=+h[b+32>>3];J=b+40|0;h[n+40>>3]=+h[J>>3]+(+h[e>>3]- +h[K>>3])*.5;h[n+48>>3]=+h[t>>3]-(+h[u>>3]- +h[k>>3])*.5;h[n+56>>3]=+h[J>>3]+(+h[e>>3]- +h[K>>3])*.5;h[n+64>>3]=+h[t>>3]-(+h[u>>3]- +h[k>>3])*.5;K=b+56|0;h[n+72>>3]=+h[K>>3];e=b+8|0;O=+h[e>>3];h[n+88>>3]=O-(O- +h[K>>3])*.5;h[n+80>>3]=+h[b>>3];h[n+104>>3]=+h[e>>3];h[n+96>>3]=+h[t>>3]-(+h[u>>3]- +h[k>>3])*.5;rB(a,n,F,f);eF(n);eF(m);i=g;return}else if((l|0)==402653184){n=d+3|0;F=jk(n<<4)|0;k=b|0;h[F>>3]=+h[k>>3];u=b+8|0;t=m+56|0;e=m+72|0;h[F+8>>3]=+h[u>>3]-(+h[t>>3]- +h[e>>3])*.5;K=L;O=+h[K>>3];J=m+48|0;h[F+16>>3]=O+(O- +h[J>>3])*.5;h[F+24>>3]=+h[u>>3]-(+h[t>>3]- +h[e>>3])*.5;O=+h[K>>3];h[F+32>>3]=O+(O- +h[J>>3])*.5;h[F+40>>3]=+h[m+40>>3];h[F+48>>3]=+h[b+16>>3];O=+h[b+24>>3];u=b+40|0;h[F+56>>3]=O-(O- +h[u>>3])*.5;O=+h[K>>3];h[F+64>>3]=O+(O- +h[J>>3])*.5;h[F+72>>3]=+h[u>>3];h[F+88>>3]=+h[u>>3]+(+h[t>>3]- +h[e>>3])*.5;O=+h[K>>3];h[F+80>>3]=O+(O- +h[J>>3])*.5;h[F+104>>3]=+h[b+56>>3]+(+h[t>>3]- +h[e>>3])*.5;h[F+96>>3]=+h[k>>3];rB(a,F,n,f);eF(F);eF(m);i=g;return}else if((l|0)==419430400){l=d+5|0;d=jk(l<<4)|0;h[d>>3]=+h[b>>3];F=b+8|0;n=m+56|0;k=m+72|0;h[d+8>>3]=+h[F>>3]-(+h[n>>3]- +h[k>>3])*.5;e=L;O=+h[e>>3];L=m+48|0;h[d+16>>3]=O+(O- +h[L>>3])*.5;h[d+24>>3]=+h[F>>3]-(+h[n>>3]- +h[k>>3])*.5;O=+h[e>>3];h[d+32>>3]=O+(O- +h[L>>3])*.5;h[d+40>>3]=+h[m+40>>3];h[d+48>>3]=+h[b+16>>3];O=+h[b+24>>3];F=b+40|0;h[d+56>>3]=O-(O- +h[F>>3])*.5;O=+h[e>>3];h[d+64>>3]=O+(O- +h[L>>3])*.5;h[d+72>>3]=+h[F>>3];h[d+88>>3]=+h[F>>3]+(+h[n>>3]- +h[k>>3])*.5;O=+h[e>>3];h[d+80>>3]=O+(O- +h[L>>3])*.5;F=b+56|0;h[d+104>>3]=+h[F>>3]+(+h[n>>3]- +h[k>>3])*.5;k=P;h[d+96>>3]=+h[k>>3]-(+h[e>>3]- +h[L>>3])*.5;h[d+112>>3]=+h[k>>3]-(+h[e>>3]- +h[L>>3])*.5;h[d+120>>3]=+h[F>>3];h[d+128>>3]=+h[b+48>>3];h[d+136>>3]=+h[F>>3];rB(a,d,l,f);eF(d);eF(m);i=g;return}else{eF(m);i=g;return}}function pl(a){a=a|0;var b=0,d=0;b=c[(c[a+8>>2]|0)+8>>2]|0;do{if((b|0)==0){d=0}else{a=c[c[b+4>>2]>>2]|0;if((a|0)==80){d=1;break}if((a|0)==56){d=2;break}if((a|0)==4){d=3;break}d=(a|0)==76?4:0}}while(0);return d|0}function ql(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0.0,H=0.0,I=0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,U=0.0,X=0.0,Y=0,Z=0,_=0,aa=0,ba=0.0,ca=0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0,na=0,oa=0.0,pa=0,qa=0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0;d=i;i=i+64|0;e=d|0;f=d+16|0;g=d+24|0;j=d+32|0;k=d+40|0;l=d+48|0;m=jk(48)|0;n=b+8|0;o=c[(c[(c[n>>2]|0)+8>>2]|0)+8>>2]|0;p=c[o>>2]|0;q=c[o+4>>2]|0;r=c[o+8>>2]|0;s=+h[o+16>>3];t=+h[o+32>>3];u=+h[o+24>>3];o=b|0;b=(Km(ew(o,168440)|0)|0)&255|p;p=(b|0)!=0;do{if(p){v=+Fm(o,c[53574]|0,0.0,.01);w=+Fm(o,c[53618]|0,0.0,.02);x=(v>w?v:w)*72.0;if(x<0.0){y=x+-.5}else{y=x+.5}z=~~y;x=+(z|0);if((z|0)>0){A=x;B=x;break}z=c[n>>2]|0;x=+h[z+32>>3];w=+h[z+40>>3];v=(x<w?x:w)*72.0;if(v<0.0){C=v+-.5}else{C=v+.5}v=+(~~C|0);A=v;B=v}else{z=c[n>>2]|0;v=+h[z+32>>3]*72.0;if(v<0.0){D=v+-.5}else{D=v+.5}v=+h[z+40>>3]*72.0;if(v<0.0){E=v+-.5}else{E=v+.5}A=+(~~E|0);B=+(~~D|0)}}while(0);z=Em(o,c[53598]|0,q,0)|0;D=s+ +Fm(o,c[53602]|0,0.0,-360.0);if((r|0)==0){s=+Fm(o,c[53584]|0,0.0,-100.0);q=Em(o,c[53586]|0,4,0)|0;F=q;G=s;H=+Fm(o,c[53636]|0,0.0,-100.0)}else{F=r;G=t;H=u}r=c[(c[n>>2]|0)+104>>2]|0;u=+h[r+24>>3];t=+h[r+32>>3];r=~~u;q=(r|0)>-1?r:-r|0;s=+(q|0);if((q|0)>-1){if((~~(s+.5)|0)==0){I=22}else{I=25}}else{if((~~(s+-.5)|0)==0){I=22}else{I=25}}do{if((I|0)==22){q=~~t;r=(q|0)>-1?q:-q|0;s=+(r|0);if((r|0)>-1){if((~~(s+.5)|0)==0){J=t;K=u;break}else{I=25;break}}else{if((~~(s+-.5)|0)==0){J=t;K=u;break}else{I=25;break}}}}while(0);do{if((I|0)==25){r=ew(o,78824)|0;if((r|0)==0){J=t+8.0;K=u+16.0;break}q=ac(r|0,168832,(L=i,i=i+16|0,c[L>>2]=f,c[L+8>>2]=g,L)|0)|0;i=L;s=+h[f>>3];if(s<0.0){h[f>>3]=0.0;M=0.0}else{M=s}s=+h[g>>3];if(s<0.0){h[g>>3]=0.0;N=0.0}else{N=s}if((q|0)<=0){J=t+8.0;K=u+16.0;break}s=M*72.0;r=s<0.0;if(r){O=s+-.5}else{O=s+.5}E=u+ +(~~O<<1|0);if((q|0)>1){C=N*72.0;if(C<0.0){P=C+-.5}else{P=C+.5}J=t+ +(~~P<<1|0);K=E;break}else{if(r){Q=s+-.5}else{Q=s+.5}J=t+ +(~~Q<<1|0);K=E;break}}}while(0);Q=K- +h[(c[(c[n>>2]|0)+104>>2]|0)+24>>3];t=+h[c[(c[(Hx(o)|0)+8>>2]|0)+8>>2]>>3];if(t>0.0){P=t*72.0;if(P<0.0){R=P+-.5}else{R=P+.5}P=+(~~R|0);g=~~(K/P);f=~~(J/P);U=P*+((P*+(f|0)+1.0e-5<J)+f|0);X=P*+((P*+(g|0)+1.0e-5<K)+g|0)}else{U=J;X=K}g=c[(c[n>>2]|0)+8>>2]|0;do{if((a[g+12|0]|0)==0){f=ew(o,87160)|0;if((f|0)==0){Y=0;Z=0;break}if((a[f]|0)==0){Y=0;Z=0;break}FB(k,Hx(o)|0,f);r=c[k>>2]|0;q=c[k+4>>2]|0;if((r|0)==-1&(q|0)==-1){_=$w(o)|0;Fv(0,166888,(L=i,i=i+16|0,c[L>>2]=f,c[L+8>>2]=_,L)|0)|0;i=L;Y=0;Z=0;break}else{a[(c[(Hx(o)|0)+8>>2]|0)+114|0]=1;Y=q+2|0;Z=r+2|0;break}}else{r=c[g>>2]|0;if((a[r]|0)!=99){Y=0;Z=0;break}if((Ya(r|0,102208)|0)!=0){Y=0;Z=0;break}r=ew(o,114736)|0;FB(j,Hx(o)|0,r);q=c[j>>2]|0;_=c[j+4>>2]|0;if((q|0)==-1&(_|0)==-1){f=$w(o)|0;Fv(0,168056,(L=i,i=i+16|0,c[L>>2]=(r|0)!=0?r:167344,c[L+8>>2]=f,L)|0)|0;i=L;Y=0;Z=0;break}else{a[(c[(Hx(o)|0)+8>>2]|0)+114|0]=1;Y=_+2|0;Z=q+2|0;break}}}while(0);K=+(Z|0);Z=e|0;h[Z>>3]=X>K?X:K;K=+(Y|0);Y=e+8|0;h[Y>>3]=U>K?U:K;if((F|0)<3){aa=H!=0.0|G!=0.0?120:F}else{aa=F}F=ew(o,166472)|0;do{if((F|0)==0){I=66}else{j=a[F]|0;if(!((j<<24>>24|0)==116|(j<<24>>24|0)==98)){I=66;break}a[(c[(c[n>>2]|0)+104>>2]|0)+80|0]=j}}while(0);if((I|0)==66){a[(c[(c[n>>2]|0)+104>>2]|0)+80|0]=99}if((aa|0)==4){if(D<0.0){ba=D+-.5}else{ba=D+.5}if(((~~ba|0)%90|0|0)==0&H==0.0&G==0.0){ca=1}else{I=72}}else{I=72}do{if((I|0)==72){F=c[n>>2]|0;j=c[(c[(c[F+8>>2]|0)+8>>2]|0)+44>>2]|0;if((j|0)!=0){Dc[c[j>>2]&63](l,e);j=e;g=l;c[j>>2]=c[g>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[j+12>>2]=c[g+12>>2];ca=0;break}ba=+h[Y>>3];J=ba*1.4142135623730951;do{if(A>J){if((a[(c[F+104>>2]|0)+80|0]|0)!=99){I=77;break}P=ba/A;R=+T(1.0/(1.0-P*P));P=R*+h[Z>>3];h[Z>>3]=P;ea=P;fa=ba}else{I=77}}while(0);if((I|0)==77){ba=+h[Z>>3]*1.4142135623730951;h[Z>>3]=ba;h[Y>>3]=J;ea=ba;fa=J}if((aa|0)<=2){ca=0;break}ba=+V(3.141592653589793/+(aa|0));h[Z>>3]=ea/ba;h[Y>>3]=fa/ba;ca=0}}while(0);fa=+h[Y>>3];if((Km(Hm(o,c[53630]|0,86632)|0)|0)<<24>>24==0){ea=+h[Z>>3];ba=B>ea?B:ea;h[Z>>3]=ba;ea=+h[Y>>3];ga=ba;ha=A>ea?A:ea}else{l=c[(c[n>>2]|0)+104>>2]|0;if(B<+h[l+24>>3]){I=83}else{if(A<+h[l+32>>3]){I=83}}if((I|0)==83){I=$w(o)|0;l=$w(Hx(o)|0)|0;Fv(0,166096,(L=i,i=i+16|0,c[L>>2]=I,c[L+8>>2]=l,L)|0)|0;i=L}h[Z>>3]=B;ga=B;ha=A}h[Y>>3]=ha;if(p){A=ga>ha?ga:ha;h[Y>>3]=A;h[Z>>3]=A;ia=A;ja=A}else{ia=ha;ja=ga}do{if((Km(Hm(o,c[53606]|0,86632)|0)|0)<<24>>24==0){if(ca){ga=+h[Z>>3];h[(c[(c[n>>2]|0)+104>>2]|0)+40>>3]=(X>ga?X:ga)-Q;break}ga=+h[Y>>3];if(U<ga){ha=+h[Z>>3]*+T(1.0-U*U/(ga*ga));h[(c[(c[n>>2]|0)+104>>2]|0)+40>>3]=(X>ha?X:ha)-Q;break}else{h[(c[(c[n>>2]|0)+104>>2]|0)+40>>3]=X-Q;break}}else{h[(c[(c[n>>2]|0)+104>>2]|0)+40>>3]=X-Q}}while(0);Q=+h[Y>>3]-fa;if(U<K){ka=K-U+Q}else{ka=Q}h[(c[(c[n>>2]|0)+104>>2]|0)+48>>3]=U+ka;o=(z|0)<1?1:z;do{if((aa|0)<3){p=jk(o<<5)|0;L=p;ka=+h[Z>>3]*.5;U=+h[Y>>3]*.5;h[p>>3]=-0.0-ka;h[p+8>>3]=-0.0-U;h[p+16>>3]=ka;h[p+24>>3]=U;if((z|0)>1){la=ka;ma=2;na=1;oa=U}else{pa=2;qa=L;break}while(1){ra=la+4.0;sa=oa+4.0;h[L+(ma<<4)>>3]=-0.0-ra;h[L+(ma<<4)+8>>3]=-0.0-sa;p=ma|1;h[L+(p<<4)>>3]=ra;h[L+(p<<4)+8>>3]=sa;p=na+1|0;if((p|0)<(z|0)){la=ra;ma=ma+2|0;na=p;oa=sa}else{break}}h[Z>>3]=ra*2.0;h[Y>>3]=sa*2.0;pa=2;qa=L}else{p=jk(da(o<<4,aa)|0)|0;l=p;I=c[(c[(c[(c[n>>2]|0)+8>>2]|0)+8>>2]|0)+44>>2]|0;do{if((I|0)==0){J=6.283185307179586/+(aa|0);U=J*.5;ka=+W(U);Q=+cb(+(+S(+H)+ +S(+G)),+1.0);K=H*1.4142135623730951/+V(U);U=G*.5;fa=(J+ -3.141592653589793)*.5;X=+V(fa)*.5;ha=+W(fa)*.5;ga=fa+(3.141592653589793-J)*.5;if((aa|0)<=0){ta=0.0;ua=0.0;break}fa=D/180.0*3.141592653589793;if(ca){A=J+ga;B=ha+ka*+W(A);ea=U*B+(X+ka*+V(A))*(Q+K*B);A=fa+ +$(+B,+ea);ba=+W(A);P=+V(A);A=+cb(+ea,+B);B=P*A*+h[Z>>3];P=ba*A*+h[Y>>3];h[p>>3]=B;h[p+8>>3]=P;A=+S(+P);ba=+S(+B);ea=-0.0-B;h[p+16>>3]=ea;h[p+24>>3]=P;h[p+32>>3]=ea;ea=-0.0-P;h[p+40>>3]=ea;h[p+48>>3]=B;h[p+56>>3]=ea;ta=P!=0.0?A:0.0;ua=B!=0.0?ba:0.0;break}else{ba=X;X=ha;ha=ga;ga=0.0;B=0.0;F=0;while(1){A=J+ha;P=ba+ka*+V(A);ea=X+ka*+W(A);R=U*ea+P*(Q+K*ea);t=fa+ +$(+ea,+R);N=+W(t);O=+V(t);t=+cb(+R,+ea);R=O*t*+h[Z>>3];O=N*t*+h[Y>>3];t=+S(+R);N=t>ga?t:ga;t=+S(+O);u=t>B?t:B;h[l+(F<<4)>>3]=R;h[l+(F<<4)+8>>3]=O;g=F+1|0;if((g|0)<(aa|0)){ba=P;X=ea;ha=A;ga=N;B=u;F=g}else{ta=u;ua=N;break}}}}else{Dc[c[I+4>>2]&63](l,e);ta=+h[Y>>3]*.5;ua=+h[Z>>3]*.5}}while(0);B=ua*2.0;ga=ta*2.0;ha=ja>B?ja:B;h[Z>>3]=ha;X=ia>ga?ia:ga;h[Y>>3]=X;ba=ha/B;B=X/ga;I=(aa|0)>0;if(I){L=0;do{F=l+(L<<4)|0;g=l+(L<<4)+8|0;ga=B*+h[g>>3];h[F>>3]=ba*+h[F>>3];h[g>>3]=ga;L=L+1|0;}while((L|0)<(aa|0))}if((z|0)<=1){pa=aa;qa=l;break}L=aa-1|0;ba=+h[p>>3];B=+h[p+8>>3];ga=+$(+(B- +h[l+(L<<4)+8>>3]),+(ba- +h[l+(L<<4)>>3]));if(I){va=ga;wa=ba;xa=B;ya=0}else{pa=aa;qa=l;break}while(1){L=ya+1|0;g=(L|0)==(aa|0)?0:L;B=+h[l+(g<<4)>>3];ba=+h[l+(g<<4)+8>>3];ga=+$(+(ba-xa),+(B-wa));X=(va+3.141592653589793-ga)*.5;ha=4.0/+W(X);fa=va-X;X=ha*+W(fa);K=ha*+V(fa);fa=wa;ha=xa;g=1;do{fa=K+fa;ha=X+ha;F=(da(g,aa)|0)+ya|0;h[l+(F<<4)>>3]=fa;h[l+(F<<4)+8>>3]=ha;g=g+1|0;}while((g|0)<(z|0));if((L|0)<(aa|0)){va=ga;wa=B;xa=ba;ya=L}else{break}}if(!I){pa=aa;qa=l;break}p=da(aa,z-1|0)|0;g=0;ha=+h[Z>>3];fa=+h[Y>>3];while(1){F=g+p|0;X=+h[l+(F<<4)+8>>3];K=+S(+(+h[l+(F<<4)>>3]))*2.0;Q=K>ha?K:ha;h[Z>>3]=Q;K=+S(+X)*2.0;X=K>fa?K:fa;h[Y>>3]=X;F=g+1|0;if((F|0)<(aa|0)){g=F;ha=Q;fa=X}else{pa=aa;qa=l;break}}}}while(0);c[m>>2]=b;c[m+4>>2]=z;c[m+8>>2]=pa;h[m+16>>3]=D;h[m+32>>3]=G;h[m+24>>3]=H;c[m+44>>2]=qa;h[(c[n>>2]|0)+32>>3]=+h[Z>>3]/72.0;h[(c[n>>2]|0)+40>>3]=+h[Y>>3]/72.0;c[(c[n>>2]|0)+12>>2]=m;i=d;return}function rl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0;b=i;i=i+16|0;d=a|0;e=(c[(c[(Hx(d)|0)+8>>2]|0)+116>>2]|0)>>>2&1^1;f=a+8|0;g=c[c[(c[f>>2]|0)+104>>2]>>2]|0;c[43784]=g;j=xF(g|0)|0;g=jk((j|0)>1?j+1|0:2)|0;j=Wl(a,e,1,g)|0;if((j|0)==0){Fv(1,79400,(k=i,i=i+8|0,c[k>>2]=c[c[(c[f>>2]|0)+104>>2]>>2],k)|0)|0;i=k;c[43784]=79104;l=Wl(a,e,1,g)|0}else{l=j}eF(g);Xl(b|0,a,l);a=c[f>>2]|0;m=+h[a+32>>3]*72.0;if(m<0.0){n=m+-.5}else{n=m+.5}m=+(~~n|0);n=+h[a+40>>3]*72.0;if(n<0.0){o=n+-.5}else{o=n+.5}n=+(~~o|0);a=l|0;if((Km(Hm(d,c[53630]|0,86632)|0)|0)<<24>>24==0){o=+h[a>>3];g=l+8|0;p=+h[g>>3];q=o>m?o:m;r=p>n?p:n;s=g}else{q=m;r=n;s=l+8|0}Yl(l,q,r,(Km(Hm(d,c[53606]|0,86632)|0)|0)&255);Zl(l,q*-.5,r*.5,15);h[(c[f>>2]|0)+32>>3]=+h[a>>3]/72.0;h[(c[f>>2]|0)+40>>3]=(+h[s>>3]+1.0)/72.0;c[(c[f>>2]|0)+12>>2]=l;i=b;return}function sl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0.0,n=0,o=0.0;b=jk(48)|0;d=a+8|0;e=c[(c[(c[(c[d>>2]|0)+8>>2]|0)+8>>2]|0)+4>>2]|0;f=a|0;g=+Fm(f,c[53574]|0,1.7976931348623157e+308,0.0);i=+Fm(f,c[53618]|0,1.7976931348623157e+308,0.0);j=g<i?g:i;if(j==1.7976931348623157e+308&i==1.7976931348623157e+308){h[(c[d>>2]|0)+40>>3]=.05;h[(c[d>>2]|0)+32>>3]=.05}else{if(j>0.0){k=j>3.0e-4?j:3.0e-4}else{k=j}h[(c[d>>2]|0)+40>>3]=k;h[(c[d>>2]|0)+32>>3]=k}k=+h[(c[d>>2]|0)+32>>3]*72.0;a=Em(f,c[53598]|0,e,0)|0;e=jk((a|0)<1?32:a<<5)|0;f=e;j=k*.5;i=-0.0-j;h[e>>3]=i;h[e+8>>3]=i;h[e+16>>3]=j;h[e+24>>3]=j;if((a|0)>1){i=j;g=j;e=2;l=1;while(1){m=g+4.0;j=i+4.0;h[f+(e<<4)>>3]=-0.0-m;h[f+(e<<4)+8>>3]=-0.0-j;n=e|1;h[f+(n<<4)>>3]=m;h[f+(n<<4)+8>>3]=j;n=l+1|0;if((n|0)<(a|0)){i=j;g=m;e=e+2|0;l=n}else{break}}o=m*2.0}else{o=k}c[b>>2]=1;c[b+4>>2]=a;c[b+8>>2]=2;vF(b+16|0,0,24)|0;c[b+44>>2]=f;k=o/72.0;h[(c[d>>2]|0)+32>>3]=k;h[(c[d>>2]|0)+40>>3]=k;c[(c[d>>2]|0)+12>>2]=b;return}function tl(a){a=a|0;var b=0,d=0;b=c[(c[a+8>>2]|0)+8>>2]|0;if((b|0)==0){d=0;return d|0}d=(c[c[b+4>>2]>>2]|0)==80|0;return d|0}function ul(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=c[53500]|0;if((d|0)==0){e=0;return e|0}f=c[53650]|0;if((f|0)<=0){e=0;return e|0}g=a[b]|0;h=0;while(1){i=c[d+(h<<2)>>2]|0;j=c[i>>2]|0;if((a[j]|0)==g<<24>>24){if((Ya(j|0,b|0)|0)==0){e=i;k=7;break}}i=h+1|0;if((i|0)<(f|0)){h=i}else{e=0;k=7;break}}if((k|0)==7){return e|0}return 0}function vl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;do{if((Sm(ew(d|0,114736)|0)|0)==0){f=b}else{if((a[b]|0)==101){if((Ya(b|0,107896)|0)==0){f=b;break}}f=102208}}while(0);b=a[f]|0;if(b<<24>>24==99){if((Ya(f|0,102208)|0)==0){g=99}else{h=7}}else{h=7}a:do{if((h|0)==7){d=c[42902]|0;if((d|0)==0){g=b;break}else{j=171608;k=d}while(1){if((a[k]|0)==b<<24>>24){if((Ya(k|0,f|0)|0)==0){l=j;break}}d=j+16|0;m=c[d>>2]|0;if((m|0)==0){g=b;break a}else{j=d;k=m}}i=e;return l|0}}while(0);k=c[53500]|0;j=c[53650]|0;if((k|0)==0){b=j+1|0;c[53650]=b;n=kk(b<<2)|0}else{b:do{if((j|0)>0){b=0;while(1){o=c[k+(b<<2)>>2]|0;h=c[o>>2]|0;if((a[h]|0)==g<<24>>24){if((Ya(h|0,f|0)|0)==0){break}}b=b+1|0;if((b|0)>=(j|0)){break b}}if((o|0)==0){break}else{l=o}i=e;return l|0}}while(0);o=j+1|0;c[53650]=o;n=mk(k,o<<2)|0}c[53500]=n;n=jk(16)|0;o=n;c[(c[53500]|0)+(j<<2)>>2]=o;c[n>>2]=c[42902];c[n+4>>2]=c[42903];c[n+8>>2]=c[42904];c[n+12>>2]=c[42905];j=Lb(f|0)|0;c[n>>2]=j;do{if((c[53666]|0)==0){if((a[f]|0)==99){if((Ya(f|0,102208)|0)==0){break}}Fv(0,167480,(k=i,i=i+16|0,c[k>>2]=c[42902],c[k+8>>2]=j,k)|0)|0;i=k;a[n+12|0]=0;l=o;i=e;return l|0}}while(0);a[n+12|0]=1;l=o;i=e;return l|0}function wl(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;j=i;i=i+40|0;k=j|0;l=e|0;m=c[(c[(c[(Hx(l)|0)+48>>2]|0)+8>>2]|0)+116>>2]&3;n=e+8|0;o=c[n>>2]|0;p=+h[o+16>>3];q=+h[o+24>>3];if((m|0)==3){r=p;s=q;t=5}else if((m|0)==0){r=q;s=p;t=5}else if((m|0)==1){r=p;s=-0.0-q;t=5}else if((m|0)==2){r=-0.0-q;s=p;t=5}else{u=0.0;v=0.0;t=6}do{if((t|0)==5){if(s>=0.0){u=s;v=r;t=6;break}w=s+-.5;x=r}}while(0);if((t|0)==6){w=u+.5;x=v}o=~~w;if(x<0.0){y=x+-.5}else{y=x+.5}z=~~y;A=c[f+8>>2]|0;y=+h[A+16>>3];x=+h[A+24>>3];if((m|0)==2){B=-0.0-x;C=y;t=15}else if((m|0)==1){B=y;C=-0.0-x;t=15}else if((m|0)==3){B=y;C=x;t=15}else if((m|0)==0){B=x;C=y;t=15}else{D=0.0;E=0.0;t=16}do{if((t|0)==15){if(C>=0.0){D=C;E=B;t=16;break}F=C+-.5;G=B}}while(0);if((t|0)==16){F=D+.5;G=E}t=~~F;if(G<0.0){H=G+-.5}else{H=G+.5}m=~~H;A=g+33|0;f=a[A]|0;I=f&255;do{if((f<<24>>24|0)==15|(f<<24>>24|0)==0){J=0}else{K=c[g+24>>2]|0;if((K|0)==0){L=(c[(c[(Hx(l)|0)+8>>2]|0)+116>>2]&1|0)==0;M=c[n>>2]|0;H=+h[M+80>>3]*.5;G=-0.0-H;F=+h[M+88>>3];E=-0.0-F;N=L?H:F;O=L?F:H;P=L?E:G;Q=L?G:E}else{N=+h[K+24>>3];O=+h[K+16>>3];P=+h[K>>3];Q=+h[K+8>>3]}K=~~((P+O)*.5);L=~~((Q+N)*.5);if((I&1|0)==0){R=0;S=0}else{M=o-t+K|0;T=z-m+~~Q|0;R=(da(M,M)|0)+(da(T,T)|0)|0;S=96440}if((I&2|0)==0){U=R;V=S}else{T=o-t+~~O|0;M=z-m+L|0;W=(da(M,M)|0)+(da(T,T)|0)|0;T=(S|0)==0|(W|0)<(R|0);U=T?W:R;V=T?91152:S}if((I&4|0)==0){X=U;Y=V}else{T=o-t+K|0;K=z-m+~~N|0;W=(da(T,T)|0)+(da(K,K)|0)|0;K=(V|0)==0|(W|0)<(U|0);X=K?W:U;Y=K?85880:V}if((I&8|0)==0){J=Y;break}K=o-t+~~P|0;W=z-m+L|0;L=(Y|0)==0|((da(W,W)|0)+(da(K,K)|0)|0)<(X|0);J=L?81272:Y}}while(0);c[k+36>>2]=c[g+36>>2];xl(e,c[g+24>>2]|0,k,J,d[A]|0,0)|0;A=b;b=k;c[A>>2]=c[b>>2];c[A+4>>2]=c[b+4>>2];c[A+8>>2]=c[b+8>>2];c[A+12>>2]=c[b+12>>2];c[A+16>>2]=c[b+16>>2];c[A+20>>2]=c[b+20>>2];c[A+24>>2]=c[b+24>>2];c[A+28>>2]=c[b+28>>2];c[A+32>>2]=c[b+32>>2];c[A+36>>2]=c[b+36>>2];i=j;return}function xl(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0.0,Y=0.0,Z=0,_=0,aa=0,ba=0,ca=0.0;k=i;i=i+160|0;l=k|0;m=k+16|0;n=k+32|0;o=k+48|0;p=k+64|0;q=k+80|0;r=k+96|0;s=k+112|0;t=k+128|0;u=k+144|0;if((d|0)==0){vF(l|0,0,16)|0;v=(c[(c[(Hx(b|0)|0)+8>>2]|0)+116>>2]&1|0)==0;w=c[b+8>>2]|0;x=+h[w+80>>3]*.5;y=+h[w+88>>3];z=v?y:x;A=v?x:y;B=0;C=A;D=-0.0-z;E=-0.0-A;F=z;G=+h[l>>3];H=+h[l+8>>3]}else{z=+h[d>>3];A=+h[d+8>>3];y=+h[d+16>>3];x=+h[d+24>>3];I=(z+y)*.5;J=(A+x)*.5;h[l>>3]=I;h[l+8>>3]=J;B=1;C=x;D=z;E=A;F=y;G=I;H=J}J=(F>C?F:C)*4.0;v=l|0;w=l+8|0;a:do{if((f|0)==0){K=B;L=1;M=0;N=0;O=0;P=0.0;Q=0}else{R=a[f]|0;if(R<<24>>24==0){K=B;L=1;M=0;N=0;O=0;P=0.0;Q=0;break}S=f+1|0;switch(R<<24>>24|0){case 101:{if((a[S]|0)!=0){K=B;L=1;M=0;N=0;O=0;P=0.0;Q=1;break a}if((j|0)==0){h[v>>3]=F}else{zl(m,j,H,J);R=l;T=m;c[R>>2]=c[T>>2];c[R+4>>2]=c[T+4>>2];c[R+8>>2]=c[T+8>>2];c[R+12>>2]=c[T+12>>2]}K=1;L=0;M=g&2;N=0;O=1;P=0.0;Q=0;break a;break};case 115:{h[w>>3]=E;T=a[S]|0;if((T|0)==0){if((j|0)==0){h[v>>3]=G}else{zl(n,j,-0.0-J,G);R=l;U=n;c[R>>2]=c[U>>2];c[R+4>>2]=c[U+4>>2];c[R+8>>2]=c[U+8>>2];c[R+12>>2]=c[U+12>>2]}K=1;L=0;M=g&1;N=0;O=1;P=-1.5707963267948966;Q=0;break a}else if((T|0)==101){if((j|0)==0){h[v>>3]=F}else{zl(o,j,-0.0-J,J);U=l;R=o;c[U>>2]=c[R>>2];c[U+4>>2]=c[R+4>>2];c[U+8>>2]=c[R+8>>2];c[U+12>>2]=c[R+12>>2]}K=1;L=0;M=g&3;N=0;O=1;P=-.7853981633974483;Q=0;break a}else if((T|0)==119){if((j|0)==0){h[v>>3]=D}else{I=-0.0-J;zl(p,j,I,I);T=l;R=p;c[T>>2]=c[R>>2];c[T+4>>2]=c[R+4>>2];c[T+8>>2]=c[R+8>>2];c[T+12>>2]=c[R+12>>2]}K=1;L=0;M=g&9;N=0;O=1;P=-2.356194490192345;Q=0;break a}else{h[w>>3]=H;K=B;L=1;M=0;N=0;O=0;P=0.0;Q=1;break a}break};case 119:{if((a[S]|0)!=0){K=B;L=1;M=0;N=0;O=0;P=0.0;Q=1;break a}if((j|0)==0){h[v>>3]=D}else{zl(q,j,H,-0.0-J);R=l;T=q;c[R>>2]=c[T>>2];c[R+4>>2]=c[T+4>>2];c[R+8>>2]=c[T+8>>2];c[R+12>>2]=c[T+12>>2]}K=1;L=0;M=g&8;N=0;O=1;P=3.141592653589793;Q=0;break a;break};case 110:{h[w>>3]=C;T=a[S]|0;if((T|0)==0){if((j|0)==0){h[v>>3]=G}else{zl(r,j,J,G);S=l;R=r;c[S>>2]=c[R>>2];c[S+4>>2]=c[R+4>>2];c[S+8>>2]=c[R+8>>2];c[S+12>>2]=c[R+12>>2]}K=1;L=0;M=g&4;N=0;O=1;P=1.5707963267948966;Q=0;break a}else if((T|0)==101){if((j|0)==0){h[v>>3]=F}else{zl(s,j,J,J);R=l;S=s;c[R>>2]=c[S>>2];c[R+4>>2]=c[S+4>>2];c[R+8>>2]=c[S+8>>2];c[R+12>>2]=c[S+12>>2]}K=1;L=0;M=g&6;N=0;O=1;P=.7853981633974483;Q=0;break a}else if((T|0)==119){if((j|0)==0){h[v>>3]=D}else{zl(t,j,J,-0.0-J);T=l;S=t;c[T>>2]=c[S>>2];c[T+4>>2]=c[S+4>>2];c[T+8>>2]=c[S+8>>2];c[T+12>>2]=c[S+12>>2]}K=1;L=0;M=g&12;N=0;O=1;P=2.356194490192345;Q=0;break a}else{h[w>>3]=H;K=B;L=1;M=0;N=0;O=0;P=0.0;Q=1;break a}break};case 95:{K=B;L=1;M=g;N=1;O=0;P=0.0;Q=0;break a;break};case 99:{K=B;L=1;M=0;N=0;O=0;P=0.0;Q=0;break a;break};default:{K=B;L=1;M=0;N=0;O=0;P=0.0;Q=1;break a}}}}while(0);B=b|0;ri(u,l,(c[(c[(Hx(B)|0)+8>>2]|0)+116>>2]&3)*90|0);b=l;l=u;c[b>>2]=c[l>>2];c[b+4>>2]=c[l+4>>2];c[b+8>>2]=c[l+8>>2];c[b+12>>2]=c[l+12>>2];if(N<<24>>24==0){l=c[(c[(Hx(B)|0)+8>>2]|0)+116>>2]&3;b=M&255;do{if((l|0)==2){if((M|0)==4){V=1;break}else if((M|0)==1){V=4;break}else{V=b;break}}else if((l|0)==1){if((M|0)==4){V=2;break}else if((M|0)==1){V=8;break}else if((M|0)==8){V=4;break}else if((M|0)==2){V=1;break}else{V=b;break}}else if((l|0)==3){if((M|0)==4){V=2;break}else if((M|0)==1){V=8;break}else if((M|0)==8){V=1;break}else if((M|0)==2){V=4;break}else{V=b;break}}else{V=b}}while(0);a[e+33|0]=V}else{a[e+33|0]=M}c[e+24>>2]=d;H=+h[v>>3];if(H<0.0){W=H+-.5}else{W=H+.5}h[e>>3]=+(~~W|0);W=+h[w>>3];if(W<0.0){X=W+-.5}else{X=W+.5}h[e+8>>3]=+(~~X|0);d=c[(c[(Hx(B)|0)+8>>2]|0)+116>>2]&3;do{if((d|0)==2){Y=P*-1.0}else if((d|0)==1){Y=P+ -1.5707963267948966}else if((d|0)==3){if(P==3.141592653589793){Y=-1.5707963267948966;break}if(P==2.356194490192345){Y=-.7853981633974483;break}if(P==1.5707963267948966){Y=0.0;break}if(P==0.0){Y=1.5707963267948966;break}if(P==-.7853981633974483){Y=2.356194490192345;break}if(P!=-1.5707963267948966){Y=P;break}Y=3.141592653589793}else{Y=P}}while(0);h[e+16>>3]=Y;Y=+h[v>>3];P=+h[w>>3];if(Y==0.0&P==0.0){a[e+32|0]=-128;Z=e+29|0;a[Z]=O;_=e+28|0;a[_]=K;aa=e+30|0;a[aa]=L;ba=e+31|0;a[ba]=N;i=k;return Q|0}X=+$(+P,+Y)+4.71238898038469;if(X<6.283185307179586){ca=X}else{ca=X+ -6.283185307179586}a[e+32|0]=~~(ca*256.0/6.283185307179586);Z=e+29|0;a[Z]=O;_=e+28|0;a[_]=K;aa=e+30|0;a[aa]=L;ba=e+31|0;a[ba]=N;i=k;return Q|0}function yl(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+80|0;e=d|0;f=d+40|0;g=b+8|0;h=c[g>>2]|0;j=h+16|0;k=j;if((a[k+31|0]|0)==0){l=h}else{h=c[b>>2]&3;wl(e,c[((h|0)==3?b:b+32|0)+28>>2]|0,c[((h|0)==2?b:b-32|0)+28>>2]|0,k);k=j;j=e;c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];c[k+16>>2]=c[j+16>>2];c[k+20>>2]=c[j+20>>2];c[k+24>>2]=c[j+24>>2];c[k+28>>2]=c[j+28>>2];c[k+32>>2]=c[j+32>>2];c[k+36>>2]=c[j+36>>2];l=c[g>>2]|0}g=l+56|0;l=g;if((a[l+31|0]|0)==0){i=d;return}j=c[b>>2]&3;wl(f,c[((j|0)==2?b:b-32|0)+28>>2]|0,c[((j|0)==3?b:b+32|0)+28>>2]|0,l);l=g;g=f;c[l>>2]=c[g>>2];c[l+4>>2]=c[g+4>>2];c[l+8>>2]=c[g+8>>2];c[l+12>>2]=c[g+12>>2];c[l+16>>2]=c[g+16>>2];c[l+20>>2]=c[g+20>>2];c[l+24>>2]=c[g+24>>2];c[l+28>>2]=c[g+28>>2];c[l+32>>2]=c[g+32>>2];c[l+36>>2]=c[g+36>>2];i=d;return}function zl(a,b,d,e){a=a|0;b=b|0;d=+d;e=+e;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+112|0;g=f|0;j=f+64|0;k=f+80|0;l=f+96|0;m=c[b>>2]|0;n=c[(c[(Hx(m|0)|0)+8>>2]|0)+116>>2]&3;h[j>>3]=e;h[j+8>>3]=d;o=(n|0)!=0;if(o){ri(k,j,n*90|0);p=j;q=k;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];r=p}else{r=j}j=g|0;p=g+16|0;q=g;vF(g|0,0,16)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];p=g+32|0;c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];p=g+48|0;c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];_l(b,c[(c[(c[(c[m+8>>2]|0)+8>>2]|0)+4>>2]|0)+12>>2]|0,j,1);if(!o){s=a;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];i=f;return}si(l,j,n*90|0);n=l;c[q>>2]=c[n>>2];c[q+4>>2]=c[n+4>>2];c[q+8>>2]=c[n+8>>2];c[q+12>>2]=c[n+12>>2];s=a;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];i=f;return}function Al(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,j=0.0;d=i;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];f=+h[b>>3]/1.902113032590307;g=+h[b+8>>3]/1.1180339887498947;j=(f>g?f:g)*.9510565162951535*.8090169943749475/.29389262614623657;h[a>>3]=j*2.0*.9510565162951535;h[a+8>>3]=j*1.8090169943749475;i=d;return}function Bl(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0;c=b|0;d=+h[c>>3];e=b+8|0;f=+h[e>>3];g=f/d;do{if(g>.9510565162951536){i=f;j=f/.9510565162951536}else{if(g>=.9510565162951536){i=f;j=d;break}i=d*.9510565162951536;j=d}}while(0);d=j/1.902113032590307;f=d*.9510565162951535;g=f*.30901699437494745/.7694208842938134;k=d*.19098300562505266*.5;h[a>>3]=f;h[a+8>>3]=d*.3090169943749474-k;h[a+16>>3]=g*.5877852522924732;h[a+24>>3]=g*.8090169943749473-k;h[a+32>>3]=d*6.123233995736766e-17;h[a+40>>3]=d-k;h[a+48>>3]=g*-.587785252292473;h[a+56>>3]=g*.8090169943749475-k;h[a+64>>3]=d*-.9510565162951535;h[a+72>>3]=d*.3090169943749475-k;h[a+80>>3]=g*-.9510565162951536;h[a+88>>3]=g*-.3090169943749473-k;h[a+96>>3]=d*-.5877852522924732;h[a+104>>3]=d*-.8090169943749473-k;h[a+112>>3]=g*-1.8369701987210297e-16;h[a+120>>3]=g*-1.0-k;h[a+128>>3]=d*.5877852522924729;h[a+136>>3]=d*-.8090169943749476-k;h[a+144>>3]=g*.9510565162951535;h[a+152>>3]=g*-.3090169943749476-k;h[c>>3]=j;h[e>>3]=i;return}function Cl(a){a=a|0;var b=0;b=c[(c[a+8>>2]|0)+12>>2]|0;if((b|0)==0){return}eF(c[b+44>>2]|0);eF(b);return}function Dl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;i=i+56|0;h=g|0;j=g+40|0;k=g+48|0;if((a[e]|0)==0){l=b;c[l>>2]=c[43356];c[l+4>>2]=c[43357];c[l+8>>2]=c[43358];c[l+12>>2]=c[43359];c[l+16>>2]=c[43360];c[l+20>>2]=c[43361];c[l+24>>2]=c[43362];c[l+28>>2]=c[43363];c[l+32>>2]=c[43364];c[l+36>>2]=c[43365];i=g;return}l=(f|0)==0?82448:f;c[j>>2]=15;f=d+8|0;m=c[f>>2]|0;do{if((a[(c[m+104>>2]|0)+82|0]|0)==0){n=m;o=8}else{p=xj(d,e,j)|0;if((p|0)==0){n=c[f>>2]|0;o=8;break}if((xl(d,p,h,l,c[j>>2]|0,0)|0)==0){break}p=$w(d|0)|0;Fv(0,81824,(q=i,i=i+24|0,c[q>>2]=p,c[q+8>>2]=e,c[q+16>>2]=l,q)|0)|0;i=q}}while(0);do{if((o|0)==8){if((c[(c[n+8>>2]|0)+8>>2]|0)==17560){r=0}else{c[k>>2]=d;c[k+4>>2]=0;r=k}if((xl(d,0,h,e,c[j>>2]|0,r)|0)==0){break}l=$w(d|0)|0;Fv(0,81120,(q=i,i=i+16|0,c[q>>2]=l,c[q+8>>2]=e,q)|0)|0;i=q}}while(0);q=b;b=h;c[q>>2]=c[b>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[q+16>>2]=c[b+16>>2];c[q+20>>2]=c[b+20>>2];c[q+24>>2]=c[b+24>>2];c[q+28>>2]=c[b+28>>2];c[q+32>>2]=c[b+32>>2];c[q+36>>2]=c[b+36>>2];i=g;return}function El(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0;d=i;i=i+16|0;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=d|0;f=c[a+4>>2]|0;g=c[a>>2]|0;si(e,b,(c[(c[(Hx(g|0)|0)+8>>2]|0)+116>>2]&3)*90|0);j=+h[e>>3];k=+h[e+8>>3];if((f|0)!=0){if(+h[f>>3]>j){l=0;i=d;return l|0}if(j>+h[f+16>>3]|+h[f+8>>3]>k){l=0;i=d;return l|0}l=k<=+h[f+24>>3]|0;i=d;return l|0}if((g|0)==(c[43740]|0)){m=c[43734]|0}else{f=c[(c[g+8>>2]|0)+12>>2]|0;c[43736]=f;c[43732]=c[f+44>>2];e=c[f+8>>2]|0;c[43734]=e;b=da((c[f+4>>2]|0)-1|0,e)|0;c[43738]=(b|0)<0?0:b;c[43740]=g;m=e}if((m|0)<=0){l=1;i=d;return l|0}e=c[43738]|0;g=c[43732]|0;n=+h[21871];o=+h[21872];b=0;f=0;while(1){a=e+f|0;p=+h[g+(a<<4)>>3];q=+h[g+(a<<4)+8>>3];a=((f+4|0)%(m|0)|0)+e|0;r=-0.0-(+h[g+(a<<4)+8>>3]-q);s=+h[g+(a<<4)>>3]-p;t=q*s+p*r;a=((k*s+j*r-t>=0.0^s*o+n*r-t>=0.0)&1)+b|0;u=f+2|0;if((a|0)==2){l=0;v=12;break}if((u|0)<(m|0)){b=a;f=u}else{l=1;v=12;break}}if((v|0)==12){i=d;return l|0}return 0}function Fl(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;e=c[b+8>>2]|0;if((a[(c[e+104>>2]|0)+82|0]|0)==0){h=0;return h|0}if((a[e+145|0]|0)==0){h=0;return h|0}h=zj(b,d,0,f,g)|0;return h|0}function Gl(e,f){e=e|0;f=f|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0,ca=0;j=i;i=i+48|0;k=j|0;l=j+32|0;m=j+40|0;n=c[e+16>>2]|0;o=n+208|0;p=c[o>>2]|0;if((p|0)==0){if((b[n+260>>1]&1)==0){q=0}else{r=3}}else{r=3}do{if((r|0)==3){if((c[e+152>>2]&4|0)!=0){q=1;break}gB(e,p,c[n+228>>2]|0,c[n+244>>2]|0,c[n+212>>2]|0);q=1}}while(0);p=f+8|0;s=c[p>>2]|0;t=c[s+12>>2]|0;u=c[t+44>>2]|0;v=c[t+8>>2]|0;w=c[t+4>>2]|0;if((c[44090]|0)<(v|0)){t=v+5|0;c[44090]=t;x=c[44092]|0;if((x|0)==0){y=kk(t<<4)|0}else{y=mk(x,t<<4)|0}c[44092]=y;z=c[p>>2]|0}else{z=s}s=(c[z+104>>2]|0)+56|0;y=z+16|0;c[s>>2]=c[y>>2];c[s+4>>2]=c[y+4>>2];c[s+8>>2]=c[y+8>>2];c[s+12>>2]=c[y+12>>2];y=c[p>>2]|0;A=+h[y+32>>3]*72.0;if(A<0.0){B=A+-.5}else{B=A+.5}A=(+h[y+88>>3]+ +h[y+96>>3])/+(~~B|0);B=+h[y+40>>3]*72.0;if(B<0.0){C=B+-.5}else{C=B+.5}B=+h[y+80>>3]/+(~~C|0);y=Hl(e,f)|0;s=l|0;c[s>>2]=0;z=d[(c[p>>2]|0)+117|0]|0;do{if((z&1|0)==0){if((z&2|0)!=0){t=f|0;x=Im(t,c[53592]|0,91912)|0;lB(e,x);nB(e,Im(t,c[53594]|0,91048)|0);D=x;E=0;F=1;break}if((z&8|0)!=0){x=f|0;t=Im(x,c[53638]|0,90552)|0;lB(e,t);nB(e,Im(x,c[53640]|0,89960)|0);D=t;E=0;F=1;break}if((z&4|0)!=0){t=f|0;x=Im(t,c[53576]|0,89400)|0;lB(e,x);nB(e,Im(t,c[53578]|0,89016)|0);D=x;E=0;F=1;break}do{if((y&1|0)==0){x=f|0;if((y&576|0)==0){G=0;H=0;I=x;break}t=Im(x,c[53632]|0,213320)|0;if((a[t]|0)!=0){G=t;H=1;I=x;break}t=Im(x,c[53644]|0,213320)|0;G=(a[t]|0)==0?116344:t;H=1;I=x}else{x=f|0;t=Im(x,c[53632]|0,213320)|0;if((a[t]|0)==0){J=Im(x,c[53644]|0,213320)|0;K=(a[J]|0)==0?116344:J}else{K=t}if((Vh(K,s,m)|0)<<24>>24==0){nB(e,K);G=K;H=1;I=x;break}nB(e,c[s>>2]|0);t=c[l+4>>2]|0;J=Em(x,c[53622]|0,0,0)|0;C=+g[m>>2];if((t|0)==0){oB(e,88552,J,C)}else{oB(e,t,J,C)}G=K;H=(y&2|0)==0?2:3;I=x}}while(0);x=Im(I,c[53644]|0,213320)|0;J=(a[x]|0)!=0?x:88552;lB(e,J);D=J;E=G;F=H}else{J=f|0;x=Im(J,c[53646]|0,93016)|0;lB(e,x);nB(e,Im(J,c[53648]|0,92528)|0);D=x;E=0;F=1}}while(0);H=c[(c[p>>2]|0)+8>>2]|0;do{if((a[H+12|0]|0)==0){L=0;r=40}else{G=c[H>>2]|0;if((a[G]|0)!=99){M=1;r=42;break}L=(Ya(G|0,102208)|0)!=0;r=40}}while(0);do{if((r|0)==40){if((w|0)!=0|F<<24>>24==0|L){M=L;r=42;break}lB(e,88104);N=0;O=1;r=43}}while(0);if((r|0)==42){if((w|0)>0){N=M;O=w;r=43}else{P=F;Q=0;R=M}}if((r|0)==43){M=(v|0)>0;w=(v|0)<3;L=(y&512|0)!=0;H=f|0;G=(y&8|0)==0;I=k|0;K=k|0;m=k+8|0;l=k+24|0;z=k+16|0;x=(y&64|0)==0;J=(y&1024|0)==0;t=(y&2130706444|0)==0;S=F;F=0;while(1){if(M){T=da(F,v)|0;U=c[44092]|0;V=0;do{W=V+T|0;C=+h[u+(W<<4)+8>>3];h[U+(V<<4)>>3]=A*+h[u+(W<<4)>>3]+ +h[(c[p>>2]|0)+16>>3];h[U+(V<<4)+8>>3]=B*C+ +h[(c[p>>2]|0)+24>>3];V=V+1|0;}while((V|0)<(v|0))}do{if(w){do{if(L&(F|0)==0){if((gb(E|0,58)|0)==0){X=S;break}if((Kh(e,c[44092]|0,E)|0)<=1){X=0;break}V=$w(H)|0;Fv(3,87648,(Y=i,i=i+8|0,c[Y>>2]=V,Y)|0)|0;i=Y;X=0}else{X=S}}while(0);qB(e,c[44092]|0,v,X&255);if(G){break}V=c[p>>2]|0;C=+h[V+80>>3]*.75*.5;Z=+h[V+96>>3]*.6614;_=Z+ +h[V+16>>3];$=C+ +h[V+24>>3];h[K>>3]=_;h[m>>3]=$;h[l>>3]=$;h[z>>3]=_-Z*2.0;uB(e,I,2);Z=+h[m>>3]-C*2.0;h[m>>3]=Z;h[l>>3]=Z;uB(e,I,2);}else{if(!x){do{if((F|0)==0){if((Mh(e,c[44092]|0,E,1)|0)<=1){break}V=$w(H)|0;Fv(3,87648,(Y=i,i=i+8|0,c[Y>>2]=V,Y)|0)|0;i=Y}}while(0);rB(e,c[44092]|0,v,0);break}if(!J){lB(e,88104);rB(e,c[44092]|0,v,S&255);lB(e,D);uB(e,(c[44092]|0)+32|0,2);break}V=c[44092]|0;U=S&255;if(t){rB(e,V,v,U);break}else{ol(e,V,v,y,U);break}}}while(0);U=F+1|0;if((U|0)<(O|0)){S=0;F=U}else{P=0;Q=O;R=N;break}}}N=c[(c[p>>2]|0)+8>>2]|0;do{if((a[N+12|0]|0)==0){O=ew(f|0,87160)|0;if((O|0)!=0){aa=O;r=70}}else{O=c[N>>2]|0;if((a[O]|0)!=99){aa=O;r=70;break}if((Ya(O|0,102208)|0)!=0){aa=O;r=70;break}aa=ew(f|0,114736)|0;r=70}}while(0);if((r|0)==70){if((v|0)>0){r=c[44092]|0;N=0;do{Z=+h[u+(N<<4)+8>>3];h[r+(N<<4)>>3]=A*+h[u+(N<<4)>>3]+ +h[(c[p>>2]|0)+16>>3];h[r+(N<<4)+8>>3]=B*Z+ +h[(c[p>>2]|0)+24>>3];N=N+1|0;}while((N|0)<(v|0))}N=P&255;do{if(P<<24>>24==0|R){ba=P}else{if((v|0)<3){do{if((y&512|0)!=0&(Q|0)==0){if((gb(E|0,58)|0)==0){ca=P;break}if((Kh(e,c[44092]|0,E)|0)<=1){ca=0;break}r=$w(f|0)|0;Fv(3,87648,(Y=i,i=i+8|0,c[Y>>2]=r,Y)|0)|0;i=Y;ca=0}else{ca=P}}while(0);qB(e,c[44092]|0,v,ca&255);if((y&8|0)==0){ba=ca;break}r=c[p>>2]|0;B=+h[r+80>>3]*.75*.5;A=+h[r+96>>3]*.6614;u=k|0;Z=A+ +h[r+16>>3];C=B+ +h[r+24>>3];h[k>>3]=Z;r=k+8|0;h[r>>3]=C;O=k+24|0;h[O>>3]=C;h[k+16>>3]=Z-A*2.0;uB(e,u,2);A=+h[r>>3]-B*2.0;h[r>>3]=A;h[O>>3]=A;uB(e,u,2);ba=ca;break}if((y&64|0)==0){u=c[44092]|0;if((y&12|0)==0){rB(e,u,v,N);ba=P;break}else{ol(e,u,v,y,N);ba=P;break}}else{if((Mh(e,c[44092]|0,E,1)|0)>1){u=$w(f|0)|0;Fv(3,87648,(Y=i,i=i+8|0,c[Y>>2]=u,Y)|0)|0;i=Y}rB(e,c[44092]|0,v,0);ba=P;break}}}while(0);P=c[44092]|0;wB(e,aa,P,v,ba,Hm(f|0,c[53616]|0,86632)|0)}eF(c[s>>2]|0);ek(e,10,c[(c[p>>2]|0)+104>>2]|0);if(!q){i=j;return}if((c[e+152>>2]&4|0)!=0){gB(e,c[o>>2]|0,c[n+228>>2]|0,c[n+244>>2]|0,c[n+212>>2]|0)}hB(e);i=j;return}function Hl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;g=Il(d,f)|0;if((g|0)!=0){pB(b,g)}g=c[53600]|0;do{if((g|0)!=0){h=d|0;j=fw(h,g)|0;if((j|0)==0){break}if((a[j]|0)==0){break}xB(b,+Fm(h,c[53600]|0,1.0,0.0))}}while(0);i=e;return c[f>>2]|0}function Il(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0,z=0,A=0;e=Im(b|0,c[53582]|0,213320)|0;a:do{if((a[e]|0)==0){f=0;g=0}else{i=Yh(e)|0;j=c[i>>2]|0;if((j|0)==0){f=i;g=0;break}k=b+8|0;l=0;m=i;n=j;while(1){j=a[n]|0;b:do{switch(j<<24>>24){case 114:{if((Ya(n|0,84864)|0)==0){o=m;while(1){p=o+4|0;q=c[p>>2]|0;c[o>>2]=q;if((q|0)==0){break}else{o=p}}r=m;s=l|4;break b}if((Ya(n|0,83656)|0)==0){t=m}else{u=21;break b}while(1){o=t+4|0;p=c[o>>2]|0;c[t>>2]=p;if((p|0)==0){break}else{t=o}}r=m;s=l|3;break};case 100:{if((Ya(n|0,84432)|0)==0){v=m}else{u=37;break b}while(1){o=v+4|0;p=c[o>>2]|0;c[v>>2]=p;if((p|0)==0){break}else{v=o}}r=m;s=l|8;break};case 105:{if((Ya(n|0,84048)|0)!=0){u=21;break b}r=m+4|0;s=l|32;break};case 115:{u=22;break};case 119:{u=33;break};case 102:{if((Ya(n|0,85312)|0)!=0){u=21;break b}r=m+4|0;s=l|1;break};default:{u=37}}}while(0);if((u|0)==21){u=0;if((j<<24>>24|0)==115){u=22}else if((j<<24>>24|0)==119){u=33}else{u=37}}c:do{if((u|0)==22){u=0;if((Ya(n|0,83248)|0)!=0){u=37;break}o=c[(c[(c[k>>2]|0)+8>>2]|0)+8>>2]|0;do{if((o|0)!=0){if((c[o+8>>2]|0)!=4){break}w=+h[o+16>>3];if(w<0.0){x=w+-.5}else{x=w+.5}if(((~~x|0)%90|0|0)!=0){break}if(+h[o+24>>3]!=0.0){break}if(+h[o+32>>3]==0.0){y=m}else{break}while(1){p=y+4|0;q=c[p>>2]|0;c[y>>2]=q;if((q|0)==0){break}else{y=p}}r=m;s=l|64;break c}}while(0);if(j<<24>>24==119){u=33}else{u=37}}}while(0);do{if((u|0)==33){u=0;if((Ya(n|0,82832)|0)!=0){u=37;break}j=c[(c[(c[k>>2]|0)+8>>2]|0)+8>>2]|0;if((j|0)==0){u=37;break}if((c[j+8>>2]|0)<3){z=m}else{u=37;break}while(1){j=z+4|0;o=c[j>>2]|0;c[z>>2]=o;if((o|0)==0){break}else{z=j}}r=m;s=l|512}}while(0);if((u|0)==37){u=0;r=m+4|0;s=l}j=c[r>>2]|0;if((j|0)==0){f=i;g=s;break a}else{l=s;m=r;n=j}}}}while(0);r=c[(c[(c[b+8>>2]|0)+8>>2]|0)+8>>2]|0;if((r|0)==0){A=g;c[d>>2]=A;return f|0}A=c[r+40>>2]|g;c[d>>2]=A;return f|0}function Jl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,j=0.0,k=0.0,l=0;d=i;i=i+16|0;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=d|0;f=c[a>>2]|0;si(e,b,(c[(c[(Hx(f|0)|0)+8>>2]|0)+116>>2]&3)*90|0);g=+h[e>>3];j=+h[e+8>>3];e=c[f+8>>2]|0;k=+h[e+80>>3]*.5;if(j<-0.0-k|j>k){l=0;i=d;return l|0}if(g<-0.0- +h[e+88>>3]){l=0;i=d;return l|0}l=g<=+h[e+96>>3]|0;i=d;return l|0}function Kl(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0;e=i;f=c[a+16>>2]|0;g=f+208|0;j=c[g>>2]|0;if((j|0)==0){k=(b[f+260>>1]&1)!=0}else{k=1}l=d+8|0;d=c[l>>2]|0;m=c[d+12>>2]|0;if((m|0)==0){i=e;return}if(k){if((c[a+152>>2]&4|0)==0){gB(a,j,c[f+228>>2]|0,c[f+244>>2]|0,c[f+212>>2]|0)}n=c[l>>2]|0}else{n=d}d=m+4|0;o=+h[n+24>>3]+ +(c[d+4>>2]|0);j=c[m>>2]|0;gc(c[a+36>>2]|0,80576,(m=i,i=i+24|0,h[m>>3]=+h[n+16>>3]+ +(c[d>>2]|0),h[m+8>>3]=o,c[m+16>>2]=j,m)|0)|0;i=m;m=c[l>>2]|0;j=(c[m+104>>2]|0)+56|0;d=m+16|0;c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];ek(a,10,c[(c[l>>2]|0)+104>>2]|0);if(!k){i=e;return}if((c[a+152>>2]&4|0)!=0){gB(a,c[g>>2]|0,c[f+228>>2]|0,c[f+244>>2]|0,c[f+212>>2]|0)}hB(a);i=e;return}function Ll(a){a=a|0;Sl(c[(c[a+8>>2]|0)+12>>2]|0);return}function Ml(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;i=i+40|0;j=h|0;if((a[f]|0)==0){k=b;c[k>>2]=c[43356];c[k+4>>2]=c[43357];c[k+8>>2]=c[43358];c[k+12>>2]=c[43359];c[k+16>>2]=c[43360];c[k+20>>2]=c[43361];c[k+24>>2]=c[43362];c[k+28>>2]=c[43363];c[k+32>>2]=c[43364];c[k+36>>2]=c[43365];i=h;return}k=(g|0)==0?82448:g;g=c[(c[e+8>>2]|0)+12>>2]|0;l=Rl(g,f)|0;do{if((l|0)==0){if((xl(e,g+16|0,j,f,15,0)|0)==0){break}m=$w(e|0)|0;Fv(0,81120,(n=i,i=i+16|0,c[n>>2]=m,c[n+8>>2]=f,n)|0)|0;i=n}else{if((xl(e,l+16|0,j,k,d[l+65|0]|0,0)|0)==0){break}m=$w(e|0)|0;Fv(0,81824,(n=i,i=i+24|0,c[n>>2]=m,c[n+8>>2]=f,c[n+16>>2]=k,n)|0)|0;i=n}}while(0);n=b;b=j;c[n>>2]=c[b>>2];c[n+4>>2]=c[b+4>>2];c[n+8>>2]=c[b+8>>2];c[n+12>>2]=c[b+12>>2];c[n+16>>2]=c[b+16>>2];c[n+20>>2]=c[b+20>>2];c[n+24>>2]=c[b+24>>2];c[n+28>>2]=c[b+28>>2];c[n+32>>2]=c[b+32>>2];c[n+36>>2]=c[b+36>>2];i=h;return}function Nl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0;d=i;i=i+16|0;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=d|0;f=c[a+4>>2]|0;g=c[a>>2]|0;si(e,b,(c[(c[(Hx(g|0)|0)+8>>2]|0)+116>>2]&3)*90|0);a=b;j=e;c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];if((f|0)==0){j=c[(c[g+8>>2]|0)+12>>2]|0;k=j+16|0;l=j+24|0;m=j+32|0;n=j+40|0}else{k=f;l=f+8|0;m=f+16|0;n=f+24|0}o=+h[b>>3];if(+h[k>>3]>o){p=0;i=d;return p|0}if(o>+h[m>>3]){p=0;i=d;return p|0}o=+h[b+8>>3];if(+h[l>>3]>o){p=0;i=d;return p|0}p=o<=+h[n>>3]|0;i=d;return p|0}function Ol(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0;j=i;i=i+32|0;k=j|0;if((a[d+28|0]|0)==0){l=0;i=j;return l|0}m=+h[d>>3];d=b+8|0;n=c[(c[d>>2]|0)+12>>2]|0;o=n+48|0;if((c[o>>2]|0)<=0){l=e;i=j;return l|0}p=b|0;b=n+56|0;n=0;while(1){q=(c[(c[(Hx(p)|0)+8>>2]|0)+116>>2]&1|0)==0;r=c[(c[b>>2]|0)+(n<<2)>>2]|0;if(q){s=r+16|0;t=r+32|0}else{s=r+24|0;t=r+40|0}u=+(~~+h[s>>3]|0);if(u<=m){v=+(~~+h[t>>3]|0);if(m<=v){break}}r=n+1|0;if((r|0)<(c[o>>2]|0)){n=r}else{l=e;w=14;break}}if((w|0)==14){i=j;return l|0}if((c[(c[(Hx(p)|0)+8>>2]|0)+116>>2]&1|0)==0){h[f>>3]=u+ +h[(c[d>>2]|0)+16>>3];p=c[d>>2]|0;h[f+8>>3]=+h[p+24>>3]- +h[p+80>>3]*.5;h[f+16>>3]=v+ +h[(c[d>>2]|0)+16>>3]}else{ti(k,(c[(c[b>>2]|0)+(n<<2)>>2]|0)+16|0,(c[d>>2]|0)+16|0);n=f;b=k;c[n>>2]=c[b>>2];c[n+4>>2]=c[b+4>>2];c[n+8>>2]=c[b+8>>2];c[n+12>>2]=c[b+12>>2];c[n+16>>2]=c[b+16>>2];c[n+20>>2]=c[b+20>>2];c[n+24>>2]=c[b+24>>2];c[n+28>>2]=c[b+28>>2]}b=c[d>>2]|0;h[f+24>>3]=+h[b+24>>3]+ +h[b+80>>3]*.5;c[g>>2]=1;l=e;i=j;return l|0}function Pl(d,e){d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0;f=i;i=i+112|0;j=f|0;k=f+32|0;l=f+96|0;m=f+104|0;n=c[d+16>>2]|0;o=n+208|0;if((c[o>>2]|0)==0){p=(b[n+260>>1]&1)!=0}else{p=1}q=e+8|0;r=c[q>>2]|0;s=c[r+12>>2]|0;t=s;u=j;v=s+16|0;c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];c[u+16>>2]=c[v+16>>2];c[u+20>>2]=c[v+20>>2];c[u+24>>2]=c[v+24>>2];c[u+28>>2]=c[v+28>>2];v=r+16|0;s=j|0;h[s>>3]=+h[v>>3]+ +h[s>>3];s=r+24|0;r=j+8|0;h[r>>3]=+h[s>>3]+ +h[r>>3];r=j+16|0;w=r|0;h[w>>3]=+h[v>>3]+ +h[w>>3];w=j+24|0;h[w>>3]=+h[s>>3]+ +h[w>>3];do{if(p){if((c[d+152>>2]&4|0)!=0){break}gB(d,c[o>>2]|0,c[n+228>>2]|0,c[n+244>>2]|0,c[n+212>>2]|0)}}while(0);w=Hl(d,e)|0;s=e|0;v=Im(s,c[53644]|0,213320)|0;lB(d,(a[v]|0)!=0?v:88552);do{if((w&1|0)==0){x=0}else{v=Im(s,c[53632]|0,213320)|0;if((a[v]|0)==0){y=Im(s,c[53644]|0,213320)|0;z=(a[y]|0)==0?116344:y}else{z=v}v=l|0;if((Vh(z,v,m)|0)<<24>>24==0){nB(d,z);x=1;break}nB(d,c[v>>2]|0);y=c[l+4>>2]|0;A=Em(s,c[53622]|0,0,0)|0;B=+g[m>>2];if((y|0)==0){oB(d,88552,A,B)}else{oB(d,y,A,B)}eF(c[v>>2]|0);x=w>>>1&1|2}}while(0);m=c[c[(c[q>>2]|0)+8>>2]>>2]|0;if((a[m]|0)==77){q=(Ya(m|0,93976)|0)==0;C=q?w|4:w}else{C=w}if((C&2130706444|0)==0){sB(d,j,x)}else{j=k;c[j>>2]=c[u>>2];c[j+4>>2]=c[u+4>>2];c[j+8>>2]=c[u+8>>2];c[j+12>>2]=c[u+12>>2];u=k+32|0;j=u;w=r;c[j>>2]=c[w>>2];c[j+4>>2]=c[w+4>>2];c[j+8>>2]=c[w+8>>2];c[j+12>>2]=c[w+12>>2];h[k+16>>3]=+h[u>>3];h[k+24>>3]=+h[k+8>>3];h[k+48>>3]=+h[k>>3];h[k+56>>3]=+h[k+40>>3];ol(d,k|0,4,C,x)}Ql(d,e,t);if(!p){i=f;return}if((c[d+152>>2]&4|0)!=0){gB(d,c[o>>2]|0,c[n+228>>2]|0,c[n+244>>2]|0,c[n+212>>2]|0)}hB(d);i=f;return}function Ql(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;f=i;i=i+32|0;g=f|0;j=e+52|0;k=c[j>>2]|0;if((k|0)==0){l=d+8|0}else{m=d+8|0;n=c[m>>2]|0;o=(+h[e+24>>3]+ +h[e+40>>3])*.5+ +h[n+24>>3];h[k+56>>3]=(+h[e+16>>3]+ +h[e+32>>3])*.5+ +h[n+16>>3];h[k+64>>3]=o;ek(b,10,c[j>>2]|0);j=Im(d|0,c[53644]|0,213320)|0;lB(b,(a[j]|0)!=0?j:88552);l=m}m=c[l>>2]|0;o=+h[m+16>>3];p=+h[m+24>>3];m=e+48|0;if((c[m>>2]|0)<=0){i=f;return}l=e+64|0;j=e+56|0;e=g+16|0;k=g|0;n=g+24|0;q=g+8|0;r=g|0;s=g+16|0;t=g;g=0;do{if((g|0)>0){u=(c[j>>2]|0)+(g<<2)|0;v=c[u>>2]|0;if((a[l]|0)==0){w=v+32|0;c[e>>2]=c[w>>2];c[e+4>>2]=c[w+4>>2];c[e+8>>2]=c[w+8>>2];c[e+12>>2]=c[w+12>>2];x=+h[(c[u>>2]|0)+16>>3];h[k>>3]=x;y=+h[n>>3];h[q>>3]=y;z=x;A=y;B=+h[s>>3];C=y}else{w=v+16|0;c[t>>2]=c[w>>2];c[t+4>>2]=c[w+4>>2];c[t+8>>2]=c[w+8>>2];c[t+12>>2]=c[w+12>>2];y=+h[k>>3];h[s>>3]=y;x=+h[(c[u>>2]|0)+40>>3];h[n>>3]=x;z=y;A=+h[q>>3];B=y;C=x}h[k>>3]=o+z;h[q>>3]=p+A;h[s>>3]=o+B;h[n>>3]=p+C;uB(b,r,2)}Ql(b,d,c[(c[j>>2]|0)+(g<<2)>>2]|0);g=g+1|0;}while((g|0)<(c[m>>2]|0));i=f;return}function Rl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[b+60>>2]|0;do{if((e|0)!=0){if((a[e]|0)!=(a[d]|0)){break}if((Ya(e|0,d|0)|0)==0){f=b}else{break}return f|0}}while(0);e=c[b+48>>2]|0;if((e|0)<=0){f=0;return f|0}g=c[b+56>>2]|0;b=0;while(1){h=Rl(c[g+(b<<2)>>2]|0,d)|0;i=b+1|0;if((h|0)!=0){f=h;j=8;break}if((i|0)<(e|0)){b=i}else{f=0;j=8;break}}if((j|0)==8){return f|0}return 0}function Sl(a){a=a|0;var b=0,d=0,e=0;b=a+48|0;d=a+56|0;if((c[b>>2]|0)>0){e=0;do{Sl(c[(c[d>>2]|0)+(e<<2)>>2]|0);e=e+1|0;}while((e|0)<(c[b>>2]|0))}eF(c[a+60>>2]|0);dk(c[a+52>>2]|0);eF(c[d>>2]|0);eF(a);return}function Tl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0;d=i;i=i+16|0;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=d|0;f=c[a>>2]|0;si(e,b,(c[(c[(Hx(f|0)|0)+8>>2]|0)+116>>2]&3)*90|0);g=+h[e>>3];j=+h[e+8>>3];if((f|0)==(c[44094]|0)){k=+h[1813]}else{e=c[(c[f+8>>2]|0)+12>>2]|0;b=(c[e+4>>2]<<1)-2|0;l=+h[(c[e+44>>2]|0)+(((b|0)<0?1:b|1)<<4)>>3];h[1813]=l;c[44094]=f;k=l}if(+S(+g)>k){m=0;i=d;return m|0}if(+S(+j)>k){m=0;i=d;return m|0}k=+cb(+g,+j);m=k<=+h[1813]|0;i=d;return m|0}function Ul(e,f){e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0;g=i;i=i+8|0;j=g|0;k=c[e+16>>2]|0;l=k+208|0;m=c[l>>2]|0;if((m|0)==0){if((b[k+260>>1]&1)==0){n=0}else{o=3}}else{o=3}do{if((o|0)==3){if((c[e+152>>2]&4|0)!=0){n=1;break}gB(e,m,c[k+228>>2]|0,c[k+244>>2]|0,c[k+212>>2]|0);n=1}}while(0);m=f+8|0;p=c[(c[m>>2]|0)+12>>2]|0;q=c[p+44>>2]|0;r=c[p+8>>2]|0;s=c[p+4>>2]|0;if((c[44096]|0)<(r|0)){p=r+2|0;c[44096]=p;t=c[44098]|0;if((t|0)==0){u=kk(p<<4)|0}else{u=mk(t,p<<4)|0}c[44098]=u}Il(f,j)|0;if((c[j>>2]&32|0)==0){pB(e,14492)}else{pB(e,14488)}j=d[(c[m>>2]|0)+117|0]|0;do{if((j&1|0)==0){if((j&2|0)!=0){u=f|0;lB(e,Im(u,c[53592]|0,91912)|0);p=Im(u,c[53594]|0,91048)|0;nB(e,p);v=p;break}if((j&8|0)!=0){p=f|0;lB(e,Im(p,c[53638]|0,90552)|0);u=Im(p,c[53640]|0,89960)|0;nB(e,u);v=u;break}u=f|0;if((j&4|0)!=0){lB(e,Im(u,c[53576]|0,89400)|0);p=Im(u,c[53578]|0,89016)|0;nB(e,p);v=p;break}p=Im(u,c[53632]|0,213320)|0;if((a[p]|0)==0){t=Im(u,c[53644]|0,213320)|0;w=(a[t]|0)==0?88552:t}else{w=p}nB(e,w);p=Im(u,c[53644]|0,213320)|0;lB(e,(a[p]|0)!=0?p:88552);v=w}else{p=f|0;lB(e,Im(p,c[53646]|0,93016)|0);u=Im(p,c[53648]|0,92528)|0;nB(e,u);v=u}}while(0);do{if((s|0)==0){if((a[v]|0)==0){x=1;o=28;break}lB(e,v);x=1;o=28}else{if((s|0)>0){x=s;o=28}}}while(0);if((o|0)==28){o=(r|0)>0;s=0;v=1;while(1){if(o){f=da(s,r)|0;w=c[44098]|0;j=0;while(1){u=j+f|0;y=+h[q+(u<<4)+8>>3];h[w+(j<<4)>>3]=+h[q+(u<<4)>>3]+ +h[(c[m>>2]|0)+16>>3];h[w+(j<<4)+8>>3]=y+ +h[(c[m>>2]|0)+24>>3];u=j+1|0;if((u|0)<(r|0)){j=u}else{z=w;break}}}else{z=c[44098]|0}qB(e,z,r,v);w=s+1|0;if((w|0)<(x|0)){s=w;v=0}else{break}}}if(!n){i=g;return}if((c[e+152>>2]&4|0)!=0){gB(e,c[l>>2]|0,c[k+228>>2]|0,c[k+244>>2]|0,c[k+212>>2]|0)}hB(e);i=g;return}function Vl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=i;i=i+16|0;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=d|0;f=c[a+4>>2]|0;g=c[a>>2]|0;a=g|0;si(e,b,(c[(c[(Hx(a)|0)+8>>2]|0)+116>>2]&3)*90|0);j=+h[e>>3];k=+h[e+8>>3];if((f|0)!=0){if(+h[f>>3]>j){l=0;i=d;return l|0}if(j>+h[f+16>>3]|+h[f+8>>3]>k){l=0;i=d;return l|0}l=k<=+h[f+24>>3]|0;i=d;return l|0}if((g|0)==(c[44082]|0)){m=+h[1805];n=+h[1804];o=+h[1807]}else{f=g+8|0;e=c[(c[f>>2]|0)+12>>2]|0;c[44078]=e;c[44074]=c[e+44>>2];c[44076]=c[e+8>>2];e=(c[(c[(Hx(a)|0)+8>>2]|0)+116>>2]&1|0)==0;a=c[f>>2]|0;p=+h[a+88>>3]+ +h[a+96>>3];if(e){h[1803]=p;q=+h[(c[f>>2]|0)+80>>3];h[1802]=q;r=p;s=q}else{h[1802]=p;q=+h[(c[f>>2]|0)+80>>3];h[1803]=q;r=q;s=p}if(r==0.0){h[1803]=1.0;t=1.0}else{t=r}if(s==0.0){h[1802]=1.0;u=1.0}else{u=s}s=+h[(c[f>>2]|0)+32>>3]*72.0;if(s<0.0){v=s+-.5}else{v=s+.5}s=+(~~v|0)/t;h[1805]=s;t=+h[(c[f>>2]|0)+40>>3]*72.0;if(t<0.0){w=t+-.5}else{w=t+.5}t=+(~~w|0)/u;h[1804]=t;u=+h[(c[f>>2]|0)+32>>3]*72.0;if(u<0.0){x=u+-.5}else{x=u+.5}u=+(~~x|0)*.5;h[1807]=u;x=+h[(c[f>>2]|0)+40>>3]*72.0;if(x<0.0){y=x+-.5}else{y=x+.5}h[1806]=+(~~y|0)*.5;f=da((c[(c[44078]|0)+4>>2]|0)-1|0,c[44076]|0)|0;c[44080]=(f|0)<0?0:f;c[44082]=g;m=s;n=t;o=u}u=j*m;m=k*n;if(+S(+u)>o){l=0;i=d;return l|0}n=+S(+m);k=+h[1806];if(n>k){l=0;i=d;return l|0}g=c[44076]|0;if((g|0)<3){l=+cb(+(u/o),+(m/k))<1.0|0;i=d;return l|0}f=(c[44084]|0)%(g|0)|0;e=(f+1|0)%(g|0)|0;a=c[44080]|0;b=a+f|0;z=c[44074]|0;k=+h[z+(b<<4)>>3];o=+h[z+(b<<4)+8>>3];b=a+e|0;n=+h[z+(b<<4)>>3];j=+h[z+(b<<4)+8>>3];t=+h[22043];s=+h[22044];y=-0.0-(j-o);x=n-k;w=o*x+k*y;if(m*x+u*y-w>=0.0^x*s+t*y-w>=0.0){l=0;i=d;return l|0}w=-0.0-(s-j);y=t-n;x=j*y+n*w;b=m*y+u*w-x>=0.0^o*y+k*w-x>=0.0;do{if(!b){x=-0.0-(o-s);w=k-t;y=w*s+t*x;if(m*w+u*x-y>=0.0^j*w+n*x-y>=0.0){break}else{l=1}i=d;return l|0}}while(0);a:do{if((g|0)>1){A=1;B=e;C=f;while(1){if(b){D=(C-1+g|0)%(g|0)|0;E=C}else{D=B;E=(B+1|0)%(g|0)|0}F=a+D|0;G=a+E|0;n=+h[z+(F<<4)>>3];j=+h[z+(F<<4)+8>>3];k=-0.0-(+h[z+(G<<4)+8>>3]-j);o=+h[z+(G<<4)>>3]-n;y=j*o+n*k;G=A+1|0;if(m*o+u*k-y>=0.0^s*o+t*k-y>=0.0){break}if((G|0)<(g|0)){A=G;B=E;C=D}else{H=D;break a}}c[44084]=D;l=0;i=d;return l|0}else{H=f}}while(0);c[44084]=H;l=1;i=d;return l|0}function Wl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0;g=jk(72)|0;i=g;j=c[(c[b+8>>2]|0)+104>>2]|0;k=0;l=1;m=c[43784]|0;while(1){n=a[m]|0;if((n<<24>>24|0)==92){o=m+1|0;p=a[o]|0;if((p<<24>>24|0)==92|(p<<24>>24|0)==123|(p<<24>>24|0)==125|(p<<24>>24|0)==124){q=k;r=l;s=o}else{t=o;u=p;v=4}}else if((n<<24>>24|0)==0){w=l;break}else{t=m;u=n;v=4}if((v|0)==4){v=0;if((u<<24>>24|0)==123){x=k+1|0;y=l}else if((u<<24>>24|0)==124){x=k;y=((k|0)==0)+l|0}else if((u<<24>>24|0)==125){x=k-1|0;y=l}else{x=k;y=l}if((x|0)<0){w=y;break}else{q=x;r=y;s=t}}k=q;l=r;m=s+1|0}s=g+56|0;c[s>>2]=jk(w<<2)|0;a[g+64|0]=d;w=(d|0)==0|0;d=j+82|0;m=f+1|0;r=(e|0)==0;e=b|0;l=j+16|0;q=j+4|0;k=j+8|0;j=0;t=0;y=0;x=0;u=0;n=f;p=0;o=f;z=0;a:while(1){A=j;B=t;C=x;D=u;E=n;F=p;G=o;H=z;while(1){I=A;J=B;K=C;L=0;M=D;N=E;O=F;P=G;b:while(1){Q=I;R=K;S=L;T=M;U=O;c:while(1){V=Q;W=R;X=S;Y=U;d:while(1){Z=V;_=W;e:while(1){if(y){v=81;break a}$=c[43784]|0;aa=a[$]|0;switch(aa<<24>>24|0){case 92:{v=56;break c;break};case 60:{break d;break};case 125:case 124:case 0:{break b;break};case 123:{break};case 62:{break e;break};default:{ba=J;ca=_;da=P;ea=$;break c}}fa=$+1|0;c[43784]=fa;if((_|0)!=0){v=33;break a}if((a[fa]|0)==0){v=33;break a}fa=Wl(b,w,0,f)|0;c[(c[s>>2]|0)+(Z<<2)>>2]=fa;if((fa|0)==0){v=36;break a}else{Z=Z+1|0;_=4}}if((a[d]|0)!=0){ba=J;ca=_;da=P;ea=$;break c}if((_&16|0)==0){v=25;break a}do{if(Y>>>0>m>>>0){fa=Y-1|0;if((fa|0)==(T|0)){ga=Y;break}ga=(a[fa]|0)==32?fa:Y}else{ga=Y}}while(0);a[ga]=0;fa=Lb(f|0)|0;c[43784]=(c[43784]|0)+1;V=Z;W=_&-17;X=fa;Y=ga}if((_&6|0)!=0){v=19;break a}if((a[d]|0)!=0){ba=J;ca=_;da=P;ea=$;break}c[43784]=$+1;Q=Z;R=_|18;S=X;T=f;U=f}f:do{if((v|0)==56){v=0;U=$+1|0;switch(a[U]|0){case 123:case 125:case 124:case 60:case 62:{c[43784]=U;ba=J;ca=_;da=P;ea=U;break f;break};case 32:{v=58;break};case 0:{ba=J;ca=_;da=P;ea=$;break f;break};default:{}}do{if((v|0)==58){v=0;if((a[d]|0)!=0){break}c[43784]=U;ba=1;ca=_;da=P;ea=U;break f}}while(0);a[P]=92;U=(c[43784]|0)+1|0;c[43784]=U;ba=J;ca=_|9;da=P+1|0;ea=U}}while(0);if((ca&4|0)!=0){if((a[ea]|0)!=32){v=63;break a}}if((ca&24|0)==0){ha=(a[ea]|0)==32?ca:ca|9}else{ha=ca}do{if((ha&8|0)==0){if((ha&16|0)==0){ia=T;ja=N;ka=Y;la=da;break}U=a[ea]|0;S=(ba|0)==0;do{if(U<<24>>24==32&S){if((Y|0)==(f|0)){ma=f;break}if((a[Y-1|0]|0)==32){ma=Y}else{v=77}}else{v=77}}while(0);if((v|0)==77){v=0;a[Y]=U;ma=Y+1|0}ia=S?T:ma-1|0;ja=N;ka=ma;la=da}else{R=a[ea]|0;Q=(ba|0)==0;do{if(R<<24>>24==32&Q){if((a[da-1|0]|0)!=32){v=71;break}if((a[d]|0)==0){na=da}else{v=71}}else{v=71}}while(0);if((v|0)==71){v=0;a[da]=R;na=da+1|0}ia=T;ja=Q?N:na-1|0;ka=Y;la=na}}while(0);S=(c[43784]|0)+1|0;c[43784]=S;if((a[S]|0)<0){oa=la;pa=S}else{I=Z;J=ba;K=ha;L=X;M=ia;N=ja;O=ka;P=la;continue}while(1){c[43784]=pa+1;S=oa+1|0;a[oa]=a[pa]|0;U=c[43784]|0;if((a[U]|0)<0){oa=S;pa=U}else{I=Z;J=ba;K=ha;L=X;M=ia;N=ja;O=ka;P=S;continue b}}}if(aa<<24>>24==0&r){v=40;break a}if((_&16|0)!=0){v=40;break a}if((_&4|0)==0){O=jk(72)|0;c[(c[s>>2]|0)+(Z<<2)>>2]=O;qa=Z+1|0;ra=O}else{qa=Z;ra=H}if((X|0)!=0){c[ra+60>>2]=X}if((_&5|0)==0){a[P]=32;sa=_|1;ta=P+1|0}else{sa=_;ta=P}if((sa&1|0)==0){ua=N;va=ta}else{do{if(ta>>>0>m>>>0){O=ta-1|0;if((O|0)==(N|0)){wa=ta;break}wa=(a[O]|0)==32?O:ta}else{wa=ta}}while(0);a[wa]=0;N=Lb(f|0)|0;c[ra+52>>2]=ak(e,N,(a[d]|0)!=0?2:0,+h[l>>3],c[q>>2]|0,c[k>>2]|0)|0;a[ra+64|0]=1;ua=f;va=f}xa=c[43784]|0;N=a[xa]|0;if((N<<24>>24|0)==0){j=qa;t=J;y=1;x=sa;u=T;n=ua;p=Y;o=va;z=ra;continue a}else if((N<<24>>24|0)==125){v=54;break a}c[43784]=xa+1;A=qa;B=J;C=0;D=T;E=ua;F=Y;G=va;H=ra}}if((v|0)==19){Sl(i);if((X|0)==0){ya=0;return ya|0}eF(X);ya=0;return ya|0}else if((v|0)==25){Sl(i);if((X|0)==0){ya=0;return ya|0}eF(X);ya=0;return ya|0}else if((v|0)==33){Sl(i);if((X|0)==0){ya=0;return ya|0}eF(X);ya=0;return ya|0}else if((v|0)==36){Sl(i);if((X|0)==0){ya=0;return ya|0}eF(X);ya=0;return ya|0}else if((v|0)==40){Sl(i);if((X|0)==0){ya=0;return ya|0}eF(X);ya=0;return ya|0}else if((v|0)==54){c[43784]=xa+1;c[g+48>>2]=qa;ya=i;return ya|0}else if((v|0)==63){Sl(i);if((X|0)==0){ya=0;return ya|0}eF(X);ya=0;return ya|0}else if((v|0)==81){c[g+48>>2]=Z;ya=i;return ya|0}return 0}function Xl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0.0,D=0.0;f=i;i=i+32|0;g=f|0;j=f+8|0;k=f+16|0;l=c[e+52>>2]|0;do{if((l|0)==0){m=e+48|0;if((c[m>>2]|0)<=0){n=0.0;o=0.0;break}p=e+56|0;q=k|0;r=k+8|0;s=e+64|0;t=0.0;u=0.0;v=0;while(1){Xl(k,d,c[(c[p>>2]|0)+(v<<2)>>2]|0);w=+h[q>>3];x=+h[r>>3];if((a[s]|0)==0){y=u+x;z=t>w?t:w}else{y=u>x?u:x;z=t+w}A=v+1|0;if((A|0)<(c[m>>2]|0)){t=z;u=y;v=A}else{n=y;o=z;break}}}else{u=+h[l+24>>3];t=+h[l+32>>3];if(!(u>0.0|t>0.0)){n=t;o=u;break}v=ew(d|0,78824)|0;if((v|0)==0){n=t+8.0;o=u+16.0;break}m=ac(v|0,168832,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=j,v)|0)|0;i=v;if((m|0)<=0){n=t+8.0;o=u+16.0;break}w=+h[g>>3]*72.0;if(w<0.0){B=w+-.5}else{B=w+.5}w=u+ +(~~B<<1|0);u=+h[j>>3]*72.0;v=u>=0.0;if((m|0)>1){if(v){C=u+.5}else{C=u+-.5}n=t+ +(~~C<<1|0);o=w;break}else{if(v){D=u+.5}else{D=u+-.5}n=t+ +(~~D<<1|0);o=w;break}}}while(0);h[e>>3]=o;h[e+8>>3]=n;h[b>>3]=o;h[b+8>>3]=n;i=f;return}function Yl(b,d,e,f){b=b|0;d=+d;e=+e;f=f|0;var g=0,i=0.0,j=0,k=0.0,l=0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0;g=b|0;i=d- +h[g>>3];j=b+8|0;k=e- +h[j>>3];h[g>>3]=d;h[j>>3]=e;j=b+52|0;g=c[j>>2]|0;if((g|0)!=0&(f|0)==0){l=g+40|0;h[l>>3]=i+ +h[l>>3];l=(c[j>>2]|0)+48|0;h[l>>3]=k+ +h[l>>3]}l=b+48|0;j=c[l>>2]|0;if((j|0)==0){return}g=b+64|0;m=a[g]|0;n=(m<<24>>24==0?k:i)/+(j|0);if((j|0)<=0){return}j=b+56|0;b=0;o=m;while(1){m=c[(c[j>>2]|0)+(b<<2)>>2]|0;p=b+1|0;q=~~(n*+(p|0))-~~(n*+(b|0))|0;if(o<<24>>24==0){r=d;s=+(q|0)+ +h[m+8>>3]}else{r=+(q|0)+ +h[m>>3];s=e}Yl(m,r,s,f);if((p|0)>=(c[l>>2]|0)){break}b=p;o=a[g]|0}return}function Zl(b,d,e,f){b=b|0;d=+d;e=+e;f=f|0;var g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0;a[b+65|0]=f;g=e- +h[b+8>>3];h[b+16>>3]=d;h[b+24>>3]=g;h[b+32>>3]=+h[b>>3]+d;h[b+40>>3]=e;i=c[b+48>>2]|0;j=i-1|0;if((i|0)<1){return}i=(f|0)==0;k=b+56|0;l=b+64|0;g=e;e=d;b=0;while(1){do{if(i){m=0}else{n=(b|0)==0;o=(b|0)==(j|0);if((a[l]|0)==0){if(n){m=o?15:14;break}else{m=o?11:10;break}}else{if(n){m=o?15:13;break}else{m=o?7:5;break}}}}while(0);Zl(c[(c[k>>2]|0)+(b<<2)>>2]|0,e,g,m&f);o=c[(c[k>>2]|0)+(b<<2)>>2]|0;if((a[l]|0)==0){p=e;q=g- +h[o+8>>3]}else{p=e+ +h[o>>3];q=g}if((b|0)<(j|0)){g=q;e=p;b=b+1|0}else{break}}return}function _l(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;f=i;i=i+176|0;g=f|0;j=f+64|0;k=f+128|0;l=f+144|0;m=f+152|0;n=f+160|0;o=g|0;if(e<<24>>24==0){e=k;p=d+48|0;c[e>>2]=c[p>>2];c[e+4>>2]=c[p+4>>2];c[e+8>>2]=c[p+8>>2];c[e+12>>2]=c[p+12>>2];q=l;r=m;s=o;t=0}else{p=k;e=d;c[p>>2]=c[e>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];c[p+12>>2]=c[e+12>>2];q=m;r=l;s=0;t=o}h[l>>3]=0.0;h[m>>3]=1.0;o=k|0;e=k+8|0;p=k;u=n;v=0;w=+h[o>>3];x=1.0;y=0.0;while(1){z=+h[e>>3];A=(x+y)*.5;Qm(n,d,3,A,s,t);c[p>>2]=c[u>>2];c[p+4>>2]=c[u+4>>2];c[p+8>>2]=c[u+8>>2];c[p+12>>2]=c[u+12>>2];if((Oc[b&255](a,k)|0)<<24>>24==0){B=j;C=g;c[B>>2]=c[C>>2];c[B+4>>2]=c[C+4>>2];c[B+8>>2]=c[C+8>>2];c[B+12>>2]=c[C+12>>2];C=j+16|0;B=g+16|0;c[C>>2]=c[B>>2];c[C+4>>2]=c[B+4>>2];c[C+8>>2]=c[B+8>>2];c[C+12>>2]=c[B+12>>2];B=j+32|0;C=g+32|0;c[B>>2]=c[C>>2];c[B+4>>2]=c[C+4>>2];c[B+8>>2]=c[C+8>>2];c[B+12>>2]=c[C+12>>2];C=j+48|0;B=g+48|0;c[C>>2]=c[B>>2];c[C+4>>2]=c[B+4>>2];c[C+8>>2]=c[B+8>>2];c[C+12>>2]=c[B+12>>2];h[q>>3]=A;D=1}else{h[r>>3]=A;D=v}A=+h[o>>3];E=w-A;if(E<0.0){F=-0.0-E}else{F=E}if(F<=.5){E=z- +h[e>>3];if(E<0.0){G=-0.0-E}else{G=E}if(G<=.5){break}}v=D;w=A;x=+h[m>>3];y=+h[l>>3]}l=d;if(D<<24>>24==0){D=g;c[l>>2]=c[D>>2];c[l+4>>2]=c[D+4>>2];c[l+8>>2]=c[D+8>>2];c[l+12>>2]=c[D+12>>2];D=d+16|0;m=g+16|0;c[D>>2]=c[m>>2];c[D+4>>2]=c[m+4>>2];c[D+8>>2]=c[m+8>>2];c[D+12>>2]=c[m+12>>2];m=d+32|0;D=g+32|0;c[m>>2]=c[D>>2];c[m+4>>2]=c[D+4>>2];c[m+8>>2]=c[D+8>>2];c[m+12>>2]=c[D+12>>2];D=d+48|0;m=g+48|0;c[D>>2]=c[m>>2];c[D+4>>2]=c[m+4>>2];c[D+8>>2]=c[m+8>>2];c[D+12>>2]=c[m+12>>2];i=f;return}else{m=j;c[l>>2]=c[m>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];m=d+16|0;l=j+16|0;c[m>>2]=c[l>>2];c[m+4>>2]=c[l+4>>2];c[m+8>>2]=c[l+8>>2];c[m+12>>2]=c[l+12>>2];l=d+32|0;m=j+32|0;c[l>>2]=c[m>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];m=d+48|0;d=j+48|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];i=f;return}}function $l(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0;d=i;i=i+24|0;e=d|0;f=d+16|0;g=a+8|0;j=c[g>>2]|0;k=j+8|0;l=c[k>>2]|0;if((l|0)==0){i=d;return}if((c[(c[l+4>>2]|0)+12>>2]|0)==0){i=d;return}c[f>>2]=a;c[f+4>>2]=0;m=+h[j+96>>3];h[e>>3]=+h[b>>3]- +h[j+16>>3];h[e+8>>3]=+h[b+8>>3]- +h[j+24>>3];j=Oc[c[(c[(c[k>>2]|0)+4>>2]|0)+12>>2]&255](f,e)|0;h[(c[g>>2]|0)+96>>3]=m;am(f,a,b,j);i=d;return}function am(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;f=i;i=i+64|0;g=f|0;j=b+8|0;b=c[j>>2]|0;k=+h[b+96>>3];l=d|0;m=b+16|0;n=g|0;h[n>>3]=+h[l>>3]- +h[m>>3];o=d+8|0;p=b+24|0;q=g+8|0;h[q>>3]=+h[o>>3]- +h[p>>3];r=d+16|0;s=g+16|0;h[s>>3]=+h[r>>3]- +h[m>>3];t=d+24|0;u=g+24|0;h[u>>3]=+h[t>>3]- +h[p>>3];v=d+32|0;w=g+32|0;h[w>>3]=+h[v>>3]- +h[m>>3];x=d+40|0;y=g+40|0;h[y>>3]=+h[x>>3]- +h[p>>3];z=d+48|0;A=g+48|0;h[A>>3]=+h[z>>3]- +h[m>>3];m=d+56|0;d=g+56|0;h[d>>3]=+h[m>>3]- +h[p>>3];_l(a,c[(c[(c[b+8>>2]|0)+4>>2]|0)+12>>2]|0,g|0,e);h[l>>3]=+h[n>>3]+ +h[(c[j>>2]|0)+16>>3];h[o>>3]=+h[q>>3]+ +h[(c[j>>2]|0)+24>>3];h[r>>3]=+h[s>>3]+ +h[(c[j>>2]|0)+16>>3];h[t>>3]=+h[u>>3]+ +h[(c[j>>2]|0)+24>>3];h[v>>3]=+h[w>>3]+ +h[(c[j>>2]|0)+16>>3];h[x>>3]=+h[y>>3]+ +h[(c[j>>2]|0)+24>>3];h[z>>3]=+h[A>>3]+ +h[(c[j>>2]|0)+16>>3];h[m>>3]=+h[d>>3]+ +h[(c[j>>2]|0)+24>>3];h[(c[j>>2]|0)+96>>3]=k;i=f;return}function bm(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=b+8|0;b=c[e>>2]|0;if((a[b+112|0]|0)==0){f=e;g=b}else{e=b;while(1){b=(c[e+116>>2]|0)+8|0;h=c[b>>2]|0;if((a[h+112|0]|0)==0){f=b;g=h;break}else{e=h}}}if((c[g+8>>2]|0)==0){e=jk(40)|0;c[(c[f>>2]|0)+8>>2]=e;i=c[f>>2]|0}else{i=g}g=c[i+8>>2]|0;i=c[g>>2]|0;if((i|0)==0){j=kk(((c[g+4>>2]|0)*48|0)+48|0)|0}else{j=mk(i,((c[g+4>>2]|0)*48|0)+48|0)|0}c[c[(c[f>>2]|0)+8>>2]>>2]=j;j=(c[(c[f>>2]|0)+8>>2]|0)+4|0;g=c[j>>2]|0;c[j>>2]=g+1;j=c[c[(c[f>>2]|0)+8>>2]>>2]|0;f=j+(g*48|0)|0;c[f>>2]=jk(d<<4)|0;c[j+(g*48|0)+4>>2]=d;vF(j+(g*48|0)+8|0,0,40)|0;return f|0}function cm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;j=i;i=i+104|0;k=j|0;l=j+8|0;m=j+16|0;n=j+32|0;o=j+40|0;p=b;q=b+32|0;r=c[((c[p>>2]&3|0)==3?b:q)+28>>2]|0;s=Hx(r|0)|0;t=bm(b,f)|0;u=b+8|0;v=c[u>>2]|0;if((a[v+112|0]|0)==0){w=b;x=v}else{y=v;do{z=c[y+116>>2]|0;y=c[z+8>>2]|0;}while((a[y+112|0]|0)!=0);w=z;x=y}y=g+8|0;do{if((a[y]|0)==0){z=c[r+8>>2]|0;v=c[d+8>>2]|0;if((c[z+232>>2]|0)!=(c[v+232>>2]|0)){A=d;B=r;break}C=(c[z+236>>2]|0)>(c[v+236>>2]|0);A=C?r:d;B=C?d:r}else{A=d;B=r}}while(0);if((B|0)==(c[((c[w>>2]&3|0)==3?w:w+32|0)+28>>2]|0)){D=x+80|0;E=x+40|0;F=x+56|0;G=x+16|0}else{D=x+40|0;E=x+80|0;F=x+16|0;G=x+56|0}x=a[F+30|0]|0;F=c[D>>2]|0;D=c[E>>2]|0;do{if((a[G+30|0]|0)==0){H=0}else{E=B+8|0;w=c[(c[E>>2]|0)+8>>2]|0;if((w|0)==0){H=0;break}if((c[(c[w+4>>2]|0)+12>>2]|0)==0){H=0;break}c[n>>2]=B;c[n+4>>2]=D;w=f-4|0;r=m|0;d=m+8|0;C=0;while(1){if((C|0)>=(w|0)){break}v=C+3|0;h[r>>3]=+h[e+(v<<4)>>3]- +h[(c[E>>2]|0)+16>>3];h[d>>3]=+h[e+(v<<4)+8>>3]- +h[(c[E>>2]|0)+24>>3];if((Oc[c[(c[(c[(c[E>>2]|0)+8>>2]|0)+4>>2]|0)+12>>2]&255](n,m)|0)<<24>>24==0){break}else{C=v}}am(n,B,e+(C<<4)|0,1);H=C}}while(0);do{if(x<<24>>24==0){I=25}else{B=A+8|0;D=c[(c[B>>2]|0)+8>>2]|0;if((D|0)==0){I=25;break}if((c[(c[D+4>>2]|0)+12>>2]|0)==0){I=25;break}c[n>>2]=A;c[n+4>>2]=F;D=f-4|0;a:do{if((D|0)>0){G=m|0;E=m+8|0;d=D;while(1){h[G>>3]=+h[e+(d<<4)>>3]- +h[(c[B>>2]|0)+16>>3];h[E>>3]=+h[e+(d<<4)+8>>3]- +h[(c[B>>2]|0)+24>>3];r=d-3|0;if((Oc[c[(c[(c[(c[B>>2]|0)+8>>2]|0)+4>>2]|0)+12>>2]&255](n,m)|0)<<24>>24==0){J=d;break a}if((r|0)>0){d=r}else{J=r;break}}}else{J=D}}while(0);am(n,A,e+(J<<4)|0,0);K=J}}while(0);if((I|0)==25){K=f-4|0}J=f-4|0;f=H;while(1){if((f|0)>=(J|0)){break}H=f+3|0;L=+h[e+(f<<4)>>3]- +h[e+(H<<4)>>3];M=+h[e+(f<<4)+8>>3]- +h[e+(H<<4)+8>>3];if(L*L+M*M<1.0e-6){f=H}else{break}}b:do{if((K|0)>0){J=K;while(1){H=J+3|0;M=+h[e+(J<<4)>>3]- +h[e+(H<<4)>>3];L=+h[e+(J<<4)+8>>3]- +h[e+(H<<4)+8>>3];H=J-3|0;if(M*M+L*L>=1.0e-6){N=J;break b}if((H|0)>0){J=H}else{N=H;break}}}else{N=K}}while(0);K=c[(c[u>>2]|0)+116>>2]|0;if((K|0)==0){O=b}else{u=K;while(1){K=c[(c[u+8>>2]|0)+116>>2]|0;if((K|0)==0){break}else{u=K}}O=u}if((a[y]|0)==0){P=(Ec[c[g>>2]&63](O)|0)&255}else{P=0}ih(O,k,l);y=g+4|0;if((Ec[c[y>>2]&63](A)|0)<<24>>24!=0){c[l>>2]=0}if((Ec[c[y>>2]&63](c[((c[p>>2]&3|0)==3?b:q)+28>>2]|0)|0)<<24>>24!=0){c[k>>2]=0}if((P|0)!=0){P=c[k>>2]|0;c[k>>2]=c[l>>2];c[l>>2]=P}do{if((a[g+9|0]|0)==0){P=c[k>>2]|0;if((P|0)==0){Q=f}else{Q=nh(O,e,f,N,t,P)|0}P=c[l>>2]|0;if((P|0)==0){R=N;S=Q;break}R=lh(O,e,Q,N,t,P)|0;S=Q}else{P=c[l>>2]|0;q=c[k>>2]|0;if((q|P|0)==0){R=N;S=f;break}oh(O,e,f,N,t,q,P);R=N;S=f}}while(0);f=R+4|0;if((S|0)>=(f|0)){T=4-S|0;U=T+R|0;V=t+4|0;c[V>>2]=U;i=j;return}N=t|0;O=o;k=R+3|0;l=o|0;Q=o+16|0;g=o+32|0;P=o+48|0;o=s+8|0;s=S;while(1){q=(c[N>>2]|0)+(s-S<<4)|0;b=e+(s<<4)|0;c[q>>2]=c[b>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[O>>2]=c[b>>2];c[O+4>>2]=c[b+4>>2];c[O+8>>2]=c[b+8>>2];c[O+12>>2]=c[b+12>>2];b=s+1|0;if((s|0)>=(k|0)){I=54;break}q=(c[N>>2]|0)+(b-S<<4)|0;p=e+(b<<4)|0;c[q>>2]=c[p>>2];c[q+4>>2]=c[p+4>>2];c[q+8>>2]=c[p+8>>2];c[q+12>>2]=c[p+12>>2];c[Q>>2]=c[p>>2];c[Q+4>>2]=c[p+4>>2];c[Q+8>>2]=c[p+8>>2];c[Q+12>>2]=c[p+12>>2];p=s+2|0;q=(c[N>>2]|0)+(p-S<<4)|0;b=e+(p<<4)|0;c[q>>2]=c[b>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];b=s+3|0;q=e+(b<<4)|0;c[P>>2]=c[q>>2];c[P+4>>2]=c[q+4>>2];c[P+8>>2]=c[q+8>>2];c[P+12>>2]=c[q+12>>2];Oh((c[o>>2]|0)+16|0,l);if((b|0)<(f|0)){s=b}else{I=54;break}}if((I|0)==54){T=4-S|0;U=T+R|0;V=t+4|0;c[V>>2]=U;i=j;return}}function dm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=b;b=i;i=i+32|0;tF(b,e,32)|0;if(+h[b>>3]>=+h[b+16>>3]){i=d;return}if(+h[b+8>>3]>=+h[b+24>>3]){i=d;return}e=a+80|0;f=c[e>>2]|0;c[e>>2]=f+1;e=(c[a+84>>2]|0)+(f<<5)|0;f=b;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];c[e+16>>2]=c[f+16>>2];c[e+20>>2]=c[f+20>>2];c[e+24>>2]=c[f+24>>2];c[e+28>>2]=c[f+28>>2];i=d;return}function em(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0;j=i;i=i+40|0;k=j|0;l=d;m=c[l>>2]&3;n=d+32|0;o=c[((m|0)==3?d:n)+28>>2]|0;p=d+8|0;q=(c[p>>2]|0)+16|0;r=q;if((a[r+31|0]|0)!=0){wl(k,o,c[((m|0)==2?d:d-32|0)+28>>2]|0,r);r=q;q=k;c[r>>2]=c[q>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[r+12>>2]=c[q+12>>2];c[r+16>>2]=c[q+16>>2];c[r+20>>2]=c[q+20>>2];c[r+24>>2]=c[q+24>>2];c[r+28>>2]=c[q+28>>2];c[r+32>>2]=c[q+32>>2];c[r+36>>2]=c[q+36>>2]}q=o+8|0;r=c[q>>2]|0;k=c[r+8>>2]|0;if((k|0)==0){s=0}else{s=c[(c[k+4>>2]|0)+16>>2]|0}k=c[p>>2]|0;t=+h[r+24>>3]+ +h[k+24>>3];m=b;u=b|0;h[u>>3]=+h[r+16>>3]+ +h[k+16>>3];k=b+8|0;h[k>>3]=t;do{if(g<<24>>24==0){r=c[p>>2]|0;if((a[r+45|0]|0)==0){a[b+29|0]=0;break}else{h[b+16>>3]=+h[r+32>>3];a[b+29|0]=1;break}}else{h[b+16>>3]=+fm(c[((c[l>>2]&3|0)==3?d:n)+28>>2]|0);a[b+29|0]=1}}while(0);c[b+80>>2]=0;c[b+88>>2]=d;b=f+32|0;c[b>>2]=c[m>>2];c[b+4>>2]=c[m+4>>2];c[b+8>>2]=c[m+8>>2];c[b+12>>2]=c[m+12>>2];m=(e|0)==1;do{if(m){if((a[(c[q>>2]|0)+156|0]|0)!=0){v=1;break}b=a[(c[p>>2]|0)+49|0]|0;n=b&255;if(b<<24>>24==0){w=47;break}t=+h[f>>3];x=+h[f+8>>3];y=+h[f+16>>3];z=+h[f+24>>3];do{if((n&4|0)==0){if((n&1|0)!=0){c[f+48>>2]=1;A=+h[k>>3];h[f+56>>3]=t;h[f+64>>3]=x;h[f+72>>3]=y;h[f+80>>3]=z>A?z:A;c[f+52>>2]=1;h[k>>3]=+h[k>>3]+-1.0;break}b=f+48|0;if((n&8|0)==0){c[b>>2]=2;l=c[q>>2]|0;A=+h[l+80>>3];if(A<0.0){B=A+-.5}else{B=A+.5}A=+h[l+24>>3]- +((~~B+1|0)/2|0|0);C=+h[k>>3];h[f+56>>3]=+h[u>>3];h[f+64>>3]=A;h[f+72>>3]=y;h[f+80>>3]=C;c[f+52>>2]=1;h[u>>3]=+h[u>>3]+1.0;break}else{c[b>>2]=8;C=+h[u>>3];b=c[q>>2]|0;A=+h[b+80>>3];if(A<0.0){D=A+-.5}else{D=A+.5}A=+h[b+24>>3]- +((~~D+1|0)/2|0|0);E=+h[k>>3];h[f+56>>3]=t;h[f+64>>3]=A;h[f+72>>3]=C;h[f+80>>3]=E;c[f+52>>2]=1;h[u>>3]=+h[u>>3]+-1.0;break}}else{c[f+48>>2]=4;b=c[q>>2]|0;if(+h[u>>3]<+h[b+16>>3]){E=t+-1.0;C=+h[k>>3];A=+h[b+80>>3];if(A<0.0){F=A+-.5}else{F=A+.5}A=+h[b+24>>3]+ +((~~F+1|0)/2|0|0);G=A+ +((c[(c[(Hx(o|0)|0)+8>>2]|0)+240>>2]|0)/2|0|0);l=c[q>>2]|0;A=+h[l+16>>3]- +h[l+88>>3];H=+h[l+80>>3];if(H<0.0){I=H+-.5}else{I=H+.5}H=+h[l+24>>3]- +((~~I+1|0)/2|0|0);h[f+56>>3]=E;h[f+64>>3]=C;h[f+72>>3]=y;h[f+80>>3]=G;h[f+88>>3]=E;h[f+96>>3]=H;h[f+104>>3]=A;h[f+112>>3]=C}else{C=+h[k>>3];A=y+1.0;H=+h[b+80>>3];if(H<0.0){J=H+-.5}else{J=H+.5}H=+h[b+24>>3]+ +((~~J+1|0)/2|0|0);E=H+ +((c[(c[(Hx(o|0)|0)+8>>2]|0)+240>>2]|0)/2|0|0);b=c[q>>2]|0;H=+h[b+16>>3]+ +h[b+96>>3]+0.0;G=+h[b+80>>3];if(G<0.0){K=G+-.5}else{K=G+.5}G=+h[b+24>>3]- +((~~K+1|0)/2|0|0);h[f+56>>3]=t;h[f+64>>3]=C;h[f+72>>3]=A;h[f+80>>3]=E;h[f+88>>3]=H;h[f+96>>3]=G;h[f+104>>3]=A;h[f+112>>3]=C}h[k>>3]=+h[k>>3]+1.0;c[f+52>>2]=2}}while(0);n=c[p>>2]|0;if((a[n+112|0]|0)==0){L=d;M=n}else{b=n;do{N=c[b+116>>2]|0;b=c[N+8>>2]|0;}while((a[b+112|0]|0)!=0);L=N;M=b}if((o|0)==(c[((c[L>>2]&3|0)==3?L:L+32|0)+28>>2]|0)){a[M+46|0]=0;i=j;return}else{a[M+86|0]=0;i=j;return}}else{w=47}}while(0);do{if((w|0)==47){do{if((e|0)==2){M=a[(c[p>>2]|0)+49|0]|0;L=M&255;if(M<<24>>24==0){break}K=+h[f>>3];J=+h[f+8>>3];I=+h[f+16>>3];F=+h[f+24>>3];do{if((L&4|0)==0){if((L&1|0)!=0){if((c[f+48>>2]|0)==4){M=c[q>>2]|0;D=+h[M+80>>3];if(D<0.0){O=D+-.5}else{O=D+.5}D=+h[M+24>>3]- +((~~O+1|0)/2|0|0);B=I+1.0;t=+h[u>>3];y=D- +((c[(c[(Hx(o|0)|0)+8>>2]|0)+240>>2]|0)/2|0|0);M=c[q>>2]|0;z=+h[M+16>>3]+ +h[M+96>>3]+0.0;x=+h[M+80>>3];if(x<0.0){P=x+-.5}else{P=x+.5}x=+h[M+24>>3]+ +((~~P+1|0)/2|0|0);h[f+56>>3]=t;h[f+64>>3]=y;h[f+72>>3]=B;h[f+80>>3]=D;h[f+88>>3]=z;h[f+96>>3]=D;h[f+104>>3]=B;h[f+112>>3]=x;c[f+52>>2]=2}else{x=+h[k>>3];h[f+56>>3]=K;h[f+64>>3]=J;h[f+72>>3]=I;h[f+80>>3]=F>x?F:x;c[f+52>>2]=1}h[k>>3]=+h[k>>3]+-1.0;break}x=+h[u>>3];if((L&8|0)==0){M=c[q>>2]|0;B=+h[M+24>>3];D=+h[M+80>>3];M=D>=0.0;if((c[f+48>>2]|0)==4){if(M){Q=D+.5}else{Q=D+-.5}R=+h[k>>3];S=B+ +((~~Q+1|0)/2|0|0)}else{if(M){T=D+.5}else{T=D+-.5}R=B- +((~~T+1|0)/2|0|0);S=+h[k>>3]+1.0}h[f+56>>3]=x;h[f+64>>3]=R;h[f+72>>3]=I;h[f+80>>3]=S;c[f+52>>2]=1;h[u>>3]=+h[u>>3]+1.0;break}else{B=x+1.0;M=c[q>>2]|0;x=+h[M+24>>3];D=+h[M+80>>3];M=D>=0.0;if((c[f+48>>2]|0)==4){if(M){U=D+.5}else{U=D+-.5}V=+h[k>>3]+-1.0;W=x+ +((~~U+1|0)/2|0|0)}else{if(M){X=D+.5}else{X=D+-.5}V=x- +((~~X+1|0)/2|0|0);W=+h[k>>3]+1.0}h[f+56>>3]=K;h[f+64>>3]=V;h[f+72>>3]=B;h[f+80>>3]=W;c[f+52>>2]=1;h[u>>3]=+h[u>>3]+-1.0;break}}else{B=+h[k>>3];h[f+56>>3]=K;h[f+64>>3]=J<B?J:B;h[f+72>>3]=I;h[f+80>>3]=F;c[f+52>>2]=1;h[k>>3]=+h[k>>3]+1.0}}while(0);M=c[p>>2]|0;if((a[M+112|0]|0)==0){Y=d;Z=M}else{N=M;do{_=c[N+116>>2]|0;N=c[_+8>>2]|0;}while((a[N+112|0]|0)!=0);Y=_;Z=N}if((o|0)==(c[((c[Y>>2]&3|0)==3?Y:Y+32|0)+28>>2]|0)){a[Z+46|0]=0}else{a[Z+86|0]=0}c[f+48>>2]=L;i=j;return}}while(0);if(m){v=1;break}v=c[f+48>>2]|0}}while(0);do{if((s|0)==0){$=f+56|0;aa=f+52|0}else{m=f+56|0;Z=f+52|0;Y=Gc[s&127](o,(c[p>>2]|0)+16|0,v,m,Z)|0;if((Y|0)==0){$=m;aa=Z;break}c[f+48>>2]=Y;i=j;return}}while(0);v=$;$=f;c[v>>2]=c[$>>2];c[v+4>>2]=c[$+4>>2];c[v+8>>2]=c[$+8>>2];c[v+12>>2]=c[$+12>>2];c[v+16>>2]=c[$+16>>2];c[v+20>>2]=c[$+20>>2];c[v+24>>2]=c[$+24>>2];c[v+28>>2]=c[$+28>>2];c[aa>>2]=1;if((e|0)==8){cc(115336,154560,571,171032)}else if((e|0)==2){W=+h[k>>3];if((c[f+48>>2]|0)==4){h[f+64>>3]=W;i=j;return}else{h[f+80>>3]=W;i=j;return}}else if((e|0)==1){h[f+80>>3]=+h[k>>3];c[f+48>>2]=1;h[k>>3]=+h[k>>3]+-1.0;i=j;return}else{i=j;return}}function fm(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0,i=0.0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0;b=c[a+8>>2]|0;a=c[b+172>>2]|0;d=c[a>>2]|0;if((d|0)==0){e=0.0;f=0.0}else{g=0;i=0.0;j=d;do{i=i+ +h[(c[(c[((c[j>>2]&3|0)==3?j:j+32|0)+28>>2]|0)+8>>2]|0)+16>>3];g=g+1|0;j=c[a+(g<<2)>>2]|0;}while((j|0)!=0);e=+(g|0);f=i}g=c[b+180>>2]|0;j=c[g>>2]|0;if((j|0)==0){k=0.0;l=0.0;m=0}else{a=0;i=0.0;n=j;do{i=i+ +h[(c[(c[((c[n>>2]&3|0)==2?n:n-32|0)+28>>2]|0)+8>>2]|0)+16>>3];a=a+1|0;n=c[g+(a<<2)>>2]|0;}while((n|0)!=0);k=+(a|0);l=i;m=j}i=+h[b+16>>3];o=+h[b+24>>3];p=+$(+(o- +h[(c[(c[((c[d>>2]&3|0)==3?d:d+32|0)+28>>2]|0)+8>>2]|0)+24>>3]),+(i-f/e));return+((p+ +$(+(+h[(c[(c[((c[m>>2]&3|0)==2?m:m-32|0)+28>>2]|0)+8>>2]|0)+24>>3]-o),+(l/k-i)))*.5)}function gm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0,Y=0,Z=0,_=0,$=0;j=i;i=i+40|0;k=j|0;l=d;m=c[l>>2]&3;n=d-32|0;o=c[((m|0)==2?d:n)+28>>2]|0;p=d+8|0;q=(c[p>>2]|0)+56|0;r=q;if((a[r+31|0]|0)!=0){wl(k,o,c[((m|0)==3?d:d+32|0)+28>>2]|0,r);r=q;q=k;c[r>>2]=c[q>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[r+12>>2]=c[q+12>>2];c[r+16>>2]=c[q+16>>2];c[r+20>>2]=c[q+20>>2];c[r+24>>2]=c[q+24>>2];c[r+28>>2]=c[q+28>>2];c[r+32>>2]=c[q+32>>2];c[r+36>>2]=c[q+36>>2]}q=o+8|0;r=c[q>>2]|0;k=c[r+8>>2]|0;if((k|0)==0){s=0}else{s=c[(c[k+4>>2]|0)+16>>2]|0}k=b+40|0;m=c[p>>2]|0;t=+h[r+24>>3]+ +h[m+64>>3];u=k;h[b+40>>3]=+h[r+16>>3]+ +h[m+56>>3];m=b+48|0;h[m>>3]=t;do{if(g<<24>>24==0){r=c[p>>2]|0;if((a[r+85|0]|0)==0){a[b+69|0]=0;break}else{h[b+56>>3]=+h[r+72>>3];a[b+69|0]=1;break}}else{t=+fm(c[((c[l>>2]&3|0)==2?d:n)+28>>2]|0)+3.141592653589793;h[b+56>>3]=t;if(t<6.283185307179586){a[b+69|0]=1;break}else{cc(126168,154560,608,170720)}}}while(0);n=f+32|0;c[n>>2]=c[u>>2];c[n+4>>2]=c[u+4>>2];c[n+8>>2]=c[u+8>>2];c[n+12>>2]=c[u+12>>2];u=(e|0)==1;do{if(u){if((a[(c[q>>2]|0)+156|0]|0)!=0){v=4;break}n=a[(c[p>>2]|0)+89|0]|0;l=n&255;if(n<<24>>24==0){w=50;break}t=+h[f>>3];x=+h[f+8>>3];y=+h[f+16>>3];do{if((l&4|0)==0){if((l&1|0)==0){n=f+48|0;if((l&8|0)==0){c[n>>2]=2;g=k|0;r=c[q>>2]|0;z=+h[r+80>>3];if(z<0.0){A=z+-.5}else{A=z+.5}z=+h[r+24>>3]+ +((~~A+1|0)/2|0|0);B=+h[m>>3];h[f+56>>3]=+h[g>>3];h[f+64>>3]=B;h[f+72>>3]=y;h[f+80>>3]=z;c[f+52>>2]=1;h[g>>3]=+h[g>>3]+1.0;break}else{c[n>>2]=8;n=k|0;z=+h[n>>3];g=c[q>>2]|0;B=+h[g+80>>3];if(B<0.0){C=B+-.5}else{C=B+.5}B=+h[g+24>>3]+ +((~~C+1|0)/2|0|0);D=+h[m>>3];h[f+56>>3]=t;h[f+64>>3]=D;h[f+72>>3]=z;h[f+80>>3]=B;c[f+52>>2]=1;h[n>>3]=+h[n>>3]+-1.0;break}}c[f+48>>2]=1;n=c[q>>2]|0;if(+h[k>>3]<+h[n+16>>3]){B=t+-1.0;z=+h[m>>3];D=+h[n+80>>3];if(D<0.0){E=D+-.5}else{E=D+.5}D=+h[n+24>>3]- +((~~E+1|0)/2|0|0);F=D- +((c[(c[(Hx(o|0)|0)+8>>2]|0)+240>>2]|0)/2|0|0);g=c[q>>2]|0;D=+h[g+16>>3]- +h[g+88>>3];G=+h[g+80>>3];if(G<0.0){H=G+-.5}else{H=G+.5}G=+h[g+24>>3]+ +((~~H+1|0)/2|0|0);h[f+56>>3]=B;h[f+64>>3]=F;h[f+72>>3]=y;h[f+80>>3]=z;h[f+88>>3]=B;h[f+96>>3]=z;h[f+104>>3]=D;h[f+112>>3]=G}else{G=+h[m>>3];D=y+1.0;z=+h[n+80>>3];if(z<0.0){I=z+-.5}else{I=z+.5}z=+h[n+24>>3]- +((~~I+1|0)/2|0|0);B=z- +((c[(c[(Hx(o|0)|0)+8>>2]|0)+240>>2]|0)/2|0|0);n=c[q>>2]|0;z=+h[n+16>>3]+ +h[n+96>>3]+0.0;F=+h[n+80>>3];if(F<0.0){J=F+-.5}else{J=F+.5}F=+h[n+24>>3]+ +((~~J+1|0)/2|0|0);h[f+56>>3]=t;h[f+64>>3]=B;h[f+72>>3]=D;h[f+80>>3]=G;h[f+88>>3]=z;h[f+96>>3]=G;h[f+104>>3]=D;h[f+112>>3]=F}c[f+52>>2]=2;h[m>>3]=+h[m>>3]+-1.0}else{F=+h[f+24>>3];c[f+48>>2]=4;D=+h[m>>3];h[f+56>>3]=t;h[f+64>>3]=x<D?x:D;h[f+72>>3]=y;h[f+80>>3]=F;c[f+52>>2]=1;h[m>>3]=+h[m>>3]+1.0}}while(0);n=c[p>>2]|0;if((a[n+112|0]|0)==0){K=d;L=n}else{g=n;do{M=c[g+116>>2]|0;g=c[M+8>>2]|0;}while((a[g+112|0]|0)!=0);K=M;L=g}if((o|0)==(c[((c[K>>2]&3|0)==2?K:K-32|0)+28>>2]|0)){a[L+86|0]=0}else{a[L+46|0]=0}c[f+48>>2]=l;i=j;return}else{w=50}}while(0);do{if((w|0)==50){do{if((e|0)==2){L=a[(c[p>>2]|0)+89|0]|0;K=L&255;if(L<<24>>24==0){break}J=+h[f>>3];I=+h[f+8>>3];H=+h[f+16>>3];E=+h[f+24>>3];do{if((K&4|0)==0){if((K&1|0)!=0){if((c[f+48>>2]|0)==4){C=J+-1.0;L=c[q>>2]|0;A=+h[L+80>>3];if(A<0.0){N=A+-.5}else{N=A+.5}A=+h[L+24>>3]- +((~~N+1|0)/2|0|0);y=+h[k>>3];x=A- +((c[(c[(Hx(o|0)|0)+8>>2]|0)+240>>2]|0)/2|0|0);L=c[q>>2]|0;t=+h[L+16>>3]- +h[L+88>>3]+-2.0;F=+h[L+80>>3];if(F<0.0){O=F+-.5}else{O=F+.5}F=+h[L+24>>3]+ +((~~O+1|0)/2|0|0);h[f+56>>3]=C;h[f+64>>3]=x;h[f+72>>3]=y;h[f+80>>3]=A;h[f+88>>3]=C;h[f+96>>3]=A;h[f+104>>3]=t;h[f+112>>3]=F;c[f+52>>2]=2}else{F=+h[b+8>>3];h[f+56>>3]=J;h[f+64>>3]=I;h[f+72>>3]=H;h[f+80>>3]=E>F?E:F;c[f+52>>2]=1}h[m>>3]=+h[m>>3]+-1.0;break}L=k|0;F=+h[L>>3];if((K&8|0)==0){t=F+-1.0;M=c[q>>2]|0;A=+h[M+24>>3];C=+h[M+80>>3];M=C>=0.0;if((c[f+48>>2]|0)==4){if(M){P=C+.5}else{P=C+-.5}Q=+h[m>>3]+-1.0;R=A+ +((~~P+1|0)/2|0|0)}else{if(M){S=C+.5}else{S=C+-.5}Q=A- +((~~S+1|0)/2|0|0);R=+h[m>>3]}h[f+56>>3]=t;h[f+64>>3]=Q;h[f+72>>3]=H;h[f+80>>3]=R;c[f+52>>2]=1;h[L>>3]=+h[L>>3]+1.0;break}else{t=F+1.0;M=c[q>>2]|0;F=+h[M+24>>3];A=+h[M+80>>3];M=A>=0.0;if((c[f+48>>2]|0)==4){if(M){T=A+.5}else{T=A+-.5}U=+h[m>>3]+-1.0;V=F+ +((~~T+1|0)/2|0|0)}else{if(M){W=A+.5}else{W=A+-.5}U=F- +((~~W+1|0)/2|0|0);V=+h[m>>3]+1.0}h[f+56>>3]=J;h[f+64>>3]=U;h[f+72>>3]=t;h[f+80>>3]=V;c[f+52>>2]=1;h[L>>3]=+h[L>>3]+-1.0;break}}else{t=+h[m>>3];h[f+56>>3]=J;h[f+64>>3]=I<t?I:t;h[f+72>>3]=H;h[f+80>>3]=E;c[f+52>>2]=1;h[m>>3]=+h[m>>3]+1.0}}while(0);L=c[p>>2]|0;if((a[L+112|0]|0)==0){X=d;Y=L}else{M=L;do{Z=c[M+116>>2]|0;M=c[Z+8>>2]|0;}while((a[M+112|0]|0)!=0);X=Z;Y=M}if((o|0)==(c[((c[X>>2]&3|0)==2?X:X-32|0)+28>>2]|0)){a[Y+86|0]=0}else{a[Y+46|0]=0}c[f+48>>2]=K;i=j;return}}while(0);if(u){v=4;break}v=c[f+48>>2]|0}}while(0);do{if((s|0)==0){_=f+56|0;$=f+52|0}else{u=f+56|0;Y=f+52|0;X=Gc[s&127](o,(c[p>>2]|0)+56|0,v,u,Y)|0;if((X|0)==0){_=u;$=Y;break}c[f+48>>2]=X;i=j;return}}while(0);v=_;_=f;c[v>>2]=c[_>>2];c[v+4>>2]=c[_+4>>2];c[v+8>>2]=c[_+8>>2];c[v+12>>2]=c[_+12>>2];c[v+16>>2]=c[_+16>>2];c[v+20>>2]=c[_+20>>2];c[v+24>>2]=c[_+24>>2];c[v+28>>2]=c[_+28>>2];c[$>>2]=1;if((e|0)==8){cc(115336,154560,767,170720)}else if((e|0)==2){V=+h[m>>3];if((c[f+48>>2]|0)==4){h[f+64>>3]=V;i=j;return}else{h[f+80>>3]=V;i=j;return}}else if((e|0)==1){h[f+64>>3]=+h[m>>3];c[f+48>>2]=4;h[m>>3]=+h[m>>3]+1.0;i=j;return}else{i=j;return}}function hm(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0;d=c[b+8>>2]|0;e=c[d+96>>2]|0;if((a[d+44|0]|0)==0){if((a[d+84|0]|0)!=0){f=3}}else{f=3}do{if((f|0)==3){g=a[d+49|0]|0;i=g&255;if((i&8|0)!=0){j=0;return j|0}k=a[d+89|0]|0;if((k&8)!=0){j=0;return j|0}if(g<<24>>24!=k<<24>>24){break}if((i&5|0)==0){break}else{j=0}return j|0}}while(0);if((e|0)==0){j=18;return j|0}d=(c[(c[(Hx(c[((c[b>>2]&3|0)==2?b:b-32|0)+28>>2]|0)|0)+8>>2]|0)+116>>2]&1|0)==0;j=~~(+h[(d?e+24|0:e+32|0)>>3]+18.0);return j|0}function im(b,d,e,f,g,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=+g;j=+j;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0.0,K=0.0,L=0.0,M=0,N=0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0.0,aa=0.0,ba=0,ca=0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0,ka=0,la=0.0,ma=0,na=0,oa=0,pa=0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0,va=0,wa=0.0;b=i;i=i+16e3|0;l=b|0;m=c[d+(e<<2)>>2]|0;n=c[m+8>>2]|0;do{if((a[n+44|0]|0)==0){if((a[n+84|0]|0)!=0){o=4;break}p=a[n+49|0]|0;q=a[n+89|0]|0}else{o=4}}while(0);a:do{if((o|0)==4){r=n+16|0;s=a[r+33|0]|0;t=s&255;u=(t&8|0)==0;do{if(u){v=a[n+89|0]|0;if((v&8)==0){if(s<<24>>24!=v<<24>>24){p=s;q=v;break a}if((t&5|0)==0){p=s;q=s;break a}if(!u){break}}v=n+56|0;w=a[v+33|0]|0;if((w&8)!=0){break}if((t&4|0)!=0){jm(d,e,f,g,j,k);i=b;return}if((t&1|0)==0){cc(115336,154560,1233,170392)}x=g*.5/+(f|0);y=x>2.0?x:2.0;z=(c[((c[m>>2]&3|0)==3?m:m+32|0)+28>>2]|0)+8|0;A=c[z>>2]|0;x=+h[A+16>>3];B=+h[A+24>>3];C=x+ +h[r>>3];D=B+ +h[n+24>>3];E=x+ +h[v>>3];x=B+ +h[n+64>>3];v=C<E?-1:1;F=+h[A+80>>3]*.5;A=w&255;w=0;while(1){G=w+1|0;if((c[4e4+(w<<2)>>2]|0)==(A|0)){H=w;break}if((G|0)<8){w=G}else{H=-1;break}}w=0;while(1){A=w+1|0;if((c[4e4+(w<<2)>>2]|0)==(t|0)){o=56;break}if((A|0)<8){w=A}else{I=0;break}}do{if((o|0)==56){if((w|H|0)<0){I=0;break}I=(c[40032+(w<<5)+(H<<2)>>2]|0)==67}}while(0);J=(D+F-B)*3.0;K=(x+F-B)*3.0;if((f|0)<=0){i=b;return}L=y*+((I?-v|0:v)|0);w=l|0;A=l|0;G=l+8|0;M=l+16|0;N=l+24|0;O=l+32|0;P=l+40|0;Q=(C+E)*.5;R=l+48|0;S=l+56|0;T=l+64|0;U=l+72|0;V=l+80|0;W=l+88|0;X=l+96|0;Y=l+104|0;Z=1;_=e;$=F<K?F:K;K=F<J?F:J;J=0.0;aa=F;ba=m;while(1){ca=_+1|0;da=aa+j;ea=K+j;fa=$+j;ga=L+J;h[A>>3]=C;h[G>>3]=D;ha=C+ga;h[M>>3]=ha;h[N>>3]=D-ea/3.0;ia=B-da;h[O>>3]=ha;h[P>>3]=ia;h[R>>3]=Q;h[S>>3]=ia;ha=E-ga;h[T>>3]=ha;h[U>>3]=ia;h[V>>3]=ha;h[W>>3]=x-fa/3.0;h[X>>3]=E;h[Y>>3]=x;ja=ba+8|0;ka=ba;do{if((c[(c[ja>>2]|0)+96>>2]|0)==0){la=da}else{ma=(c[(c[(Hx(c[((c[ka>>2]&3|0)==3?ba:ba+32|0)+28>>2]|0)|0)+8>>2]|0)+116>>2]&1|0)==0;na=c[(c[ja>>2]|0)+96>>2]|0;ha=+h[(ma?na+32|0:na+24|0)>>3];h[na+64>>3]=+h[(c[z>>2]|0)+24>>3]-da-ha*.5;h[(c[(c[ja>>2]|0)+96>>2]|0)+56>>3]=+h[(c[z>>2]|0)+16>>3];a[(c[(c[ja>>2]|0)+96>>2]|0)+81|0]=1;if(ha<=j){la=da;break}la=da+(ha-j)}}while(0);cm(ba,c[((c[ka>>2]&3|0)==2?ba:ba-32|0)+28>>2]|0,w,7,k);if((Z|0)>=(f|0)){break}Z=Z+1|0;_=ca;$=fa;K=ea;J=ga;aa=la;ba=c[d+(ca<<2)>>2]|0}i=b;return}}while(0);do{if((s&2)==0){u=n+56|0;ba=a[u+33|0]|0;if((ba&2)!=0){break}aa=j*.5/+(f|0);J=aa>2.0?aa:2.0;_=(c[((c[m>>2]&3|0)==3?m:m+32|0)+28>>2]|0)+8|0;Z=c[_>>2]|0;aa=+h[Z+16>>3];K=+h[Z+24>>3];$=aa+ +h[r>>3];x=K+ +h[n+24>>3];E=aa+ +h[u>>3];Q=K+ +h[n+64>>3];u=x<Q?-1:1;K=+h[Z+88>>3];Z=ba&255;ba=0;while(1){w=ba+1|0;if((c[4e4+(ba<<2)>>2]|0)==(Z|0)){oa=ba;break}if((w|0)<8){ba=w}else{oa=-1;break}}ba=0;while(1){Z=ba+1|0;if((c[4e4+(ba<<2)>>2]|0)==(t|0)){o=36;break}if((Z|0)<8){ba=Z}else{pa=u;break}}do{if((o|0)==36){if((ba|oa|0)<0){pa=u;break}Z=c[40032+(ba<<5)+(oa<<2)>>2]|0;if(!((Z|0)==12|(Z|0)==67)){pa=u;break}if(x!=Q){pa=u;break}pa=-u|0}}while(0);B=($+K-aa)*3.0;D=(E+K-aa)*3.0;if((f|0)<=0){i=b;return}C=J*+(pa|0);u=l|0;ba=l|0;Z=l+8|0;w=l+16|0;z=l+24|0;Y=l+32|0;X=l+40|0;L=(x+Q)*.5;W=l+48|0;V=l+56|0;U=l+64|0;T=l+72|0;S=l+80|0;R=l+88|0;P=l+96|0;O=l+104|0;F=K<D?K:D;D=K<B?K:B;B=K;y=0.0;N=1;M=e;G=m;while(1){A=M+1|0;da=B+g;ha=D+g;ia=F+g;qa=C+y;h[ba>>3]=$;h[Z>>3]=x;ra=x+qa;h[w>>3]=$-ha/3.0;h[z>>3]=ra;sa=aa-da;h[Y>>3]=sa;h[X>>3]=ra;h[W>>3]=sa;h[V>>3]=L;ra=Q-qa;h[U>>3]=sa;h[T>>3]=ra;h[S>>3]=E-ia/3.0;h[R>>3]=ra;h[P>>3]=E;h[O>>3]=Q;v=G+8|0;ja=G;do{if((c[(c[v>>2]|0)+96>>2]|0)==0){ta=da}else{na=(c[(c[(Hx(c[((c[ja>>2]&3|0)==3?G:G+32|0)+28>>2]|0)|0)+8>>2]|0)+116>>2]&1|0)==0;ma=c[(c[v>>2]|0)+96>>2]|0;ra=+h[(na?ma+24|0:ma+32|0)>>3];h[ma+56>>3]=+h[(c[_>>2]|0)+16>>3]-da-ra*.5;h[(c[(c[v>>2]|0)+96>>2]|0)+64>>3]=+h[(c[_>>2]|0)+24>>3];a[(c[(c[v>>2]|0)+96>>2]|0)+81|0]=1;if(ra<=g){ta=da;break}ta=da+(ra-g)}}while(0);cm(G,c[((c[ja>>2]&3|0)==2?G:G-32|0)+28>>2]|0,u,7,k);if((N|0)>=(f|0)){break}F=ia;D=ha;B=ta;y=qa;N=N+1|0;M=A;G=c[d+(A<<2)>>2]|0}i=b;return}}while(0);jm(d,e,f,g,j,k);i=b;return}}while(0);ta=j*.5/+(f|0);j=ta>2.0?ta:2.0;pa=(c[((c[m>>2]&3|0)==3?m:m+32|0)+28>>2]|0)+8|0;oa=c[pa>>2]|0;ta=+h[oa+16>>3];la=+h[oa+24>>3];y=ta+ +h[n+16>>3];B=la+ +h[n+24>>3];D=ta+ +h[n+56>>3];F=la+ +h[n+64>>3];n=B<F?-1:1;la=+h[oa+96>>3];oa=p&255;p=q&255;q=0;while(1){I=q+1|0;if((c[4e4+(q<<2)>>2]|0)==(p|0)){ua=q;break}if((I|0)<8){q=I}else{ua=-1;break}}q=0;while(1){p=q+1|0;if((c[4e4+(q<<2)>>2]|0)==(oa|0)){o=14;break}if((p|0)<8){q=p}else{va=n;break}}do{if((o|0)==14){if((q|ua|0)<0){va=n;break}oa=c[40032+(q<<5)+(ua<<2)>>2]|0;if(!((oa|0)==32|(oa|0)==65)){va=n;break}if(B!=F){va=n;break}va=-n|0}}while(0);Q=ta+la;E=(Q-y)*3.0;L=(Q-D)*3.0;if((f|0)<=0){i=b;return}Q=j*+(va|0);va=l|0;n=l|0;ua=l+8|0;q=l+16|0;o=l+24|0;oa=l+32|0;p=l+40|0;j=(B+F)*.5;I=l+48|0;H=l+56|0;t=l+64|0;r=l+72|0;s=l+80|0;G=l+88|0;M=l+96|0;N=l+104|0;aa=la<L?la:L;L=la<E?la:E;E=la;la=0.0;l=1;u=e;e=m;while(1){m=u+1|0;$=E+g;x=L+g;C=aa+g;K=Q+la;h[n>>3]=y;h[ua>>3]=B;J=B+K;h[q>>3]=y+x/3.0;h[o>>3]=J;da=ta+$;h[oa>>3]=da;h[p>>3]=J;h[I>>3]=da;h[H>>3]=j;J=F-K;h[t>>3]=da;h[r>>3]=J;h[s>>3]=D+C/3.0;h[G>>3]=J;h[M>>3]=D;h[N>>3]=F;_=e+8|0;O=e;do{if((c[(c[_>>2]|0)+96>>2]|0)==0){wa=$}else{P=(c[(c[(Hx(c[((c[O>>2]&3|0)==3?e:e+32|0)+28>>2]|0)|0)+8>>2]|0)+116>>2]&1|0)==0;R=c[(c[_>>2]|0)+96>>2]|0;J=+h[(P?R+24|0:R+32|0)>>3];h[R+56>>3]=J*.5+($+ +h[(c[pa>>2]|0)+16>>3]);h[(c[(c[_>>2]|0)+96>>2]|0)+64>>3]=+h[(c[pa>>2]|0)+24>>3];a[(c[(c[_>>2]|0)+96>>2]|0)+81|0]=1;if(J<=g){wa=$;break}wa=$+(J-g)}}while(0);cm(e,c[((c[O>>2]&3|0)==2?e:e-32|0)+28>>2]|0,va,7,k);if((l|0)>=(f|0)){break}aa=C;L=x;E=wa;la=K;l=l+1|0;u=m;e=c[d+(m<<2)>>2]|0}i=b;return}function jm(b,e,f,g,j,k){b=b|0;e=e|0;f=f|0;g=+g;j=+j;k=k|0;var l=0,m=0,n=0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0,W=0,X=0.0,Y=0,Z=0;l=i;i=i+16e3|0;m=l|0;n=c[b+(e<<2)>>2]|0;o=g*.5/+(f|0);g=o>2.0?o:2.0;p=(c[((c[n>>2]&3|0)==3?n:n+32|0)+28>>2]|0)+8|0;q=c[p>>2]|0;o=+h[q+16>>3];r=+h[q+24>>3];s=c[n+8>>2]|0;t=s+16|0;u=o+ +h[t>>3];v=r+ +h[s+24>>3];w=s+56|0;x=o+ +h[w>>3];y=r+ +h[s+64>>3];z=u<x?-1.0:1.0;A=+h[q+80>>3]*.5;s=d[t+33|0]|0;t=d[w+33|0]|0;w=0;while(1){B=w+1|0;if((c[4e4+(w<<2)>>2]|0)==(t|0)){C=w;break}if((B|0)<8){w=B}else{C=-1;break}}w=0;while(1){t=w+1|0;if((c[4e4+(w<<2)>>2]|0)==(s|0)){D=7;break}if((t|0)<8){w=t}else{E=0.0;break}}a:do{if((D|0)==7){if((w|C|0)<0){E=0.0;break}switch(c[40032+(w<<5)+(C<<2)>>2]|0){case 74:case 75:case 85:{E=z*(g*2.0+(+h[q+88>>3]-(o-u)+(+h[q+96>>3]-(x-o)))*.5);break a;break};case 41:{E=z*(g+(+h[q+96>>3]-(u-o)));break a;break};case 83:{E=z*(+h[q+88>>3]-(o-u));break a;break};case 15:{E=z*(g+(+h[q+96>>3]-(x-o)));break a;break};case 48:{E=z*(g+(+h[q+96>>3]-(u-o)));break a;break};case 14:case 37:case 47:case 51:case 57:case 58:{E=z*((+h[q+88>>3]-(o-u)+(+h[q+96>>3]-(x-o)))/3.0);break a;break};case 84:{E=z*(g+(+h[q+88>>3]-(o-u)+(+h[q+96>>3]-(x-o)))*.5);break a;break};case 38:{E=z*(g+(+h[q+88>>3]-(o-x)));break a;break};case 73:{E=z*(g+(+h[q+88>>3]-(o-u)));break a;break};default:{E=0.0;break a}}}}while(0);o=r+A;F=(o-v)*3.0;G=(o-y)*3.0;if((f|0)<=0){i=l;return}o=g*z;q=m|0;C=m|0;w=m+8|0;D=m+16|0;s=m+24|0;t=m+32|0;B=m+40|0;z=(u+x)*.5;H=m+48|0;I=m+56|0;J=m+64|0;K=m+72|0;L=m+80|0;M=m+88|0;N=m+96|0;O=m+104|0;g=A<G?A:G;G=A<F?A:F;F=E;E=A;m=1;P=e;e=n;while(1){n=P+1|0;A=E+j;Q=G+j;R=g+j;S=o+F;h[C>>3]=u;h[w>>3]=v;T=u+S;h[D>>3]=T;h[s>>3]=v+Q/3.0;U=r+A;h[t>>3]=T;h[B>>3]=U;h[H>>3]=z;h[I>>3]=U;T=x-S;h[J>>3]=T;h[K>>3]=U;h[L>>3]=T;h[M>>3]=y+R/3.0;h[N>>3]=x;h[O>>3]=y;V=e+8|0;W=e;do{if((c[(c[V>>2]|0)+96>>2]|0)==0){X=A}else{Y=(c[(c[(Hx(c[((c[W>>2]&3|0)==3?e:e+32|0)+28>>2]|0)|0)+8>>2]|0)+116>>2]&1|0)==0;Z=c[(c[V>>2]|0)+96>>2]|0;T=+h[(Y?Z+32|0:Z+24|0)>>3];h[Z+64>>3]=T*.5+(A+ +h[(c[p>>2]|0)+24>>3]);h[(c[(c[V>>2]|0)+96>>2]|0)+56>>3]=+h[(c[p>>2]|0)+16>>3];a[(c[(c[V>>2]|0)+96>>2]|0)+81|0]=1;if(T<=j){X=A;break}X=A+(T-j)}}while(0);cm(e,c[((c[W>>2]&3|0)==2?e:e-32|0)+28>>2]|0,q,7,k);if((m|0)>=(f|0)){break}g=R;G=Q;F=S;E=X;m=m+1|0;P=n;e=c[b+(n<<2)>>2]|0}i=l;return}function km(b){b=b|0;var d=0,e=0,f=0;if(!((c[53786]|0)!=0|(c[53784]|0)!=0)){return}d=b+8|0;e=c[(c[d>>2]|0)+100>>2]|0;do{if((e|0)!=0){if((a[e+81|0]|0)!=0){break}if((lm(b,1)|0)==0){break}f=Hx(c[((c[b>>2]&3|0)==3?b:b+32|0)+28>>2]|0)|0;_m(f,c[(c[d>>2]|0)+100>>2]|0)}}while(0);e=c[(c[d>>2]|0)+104>>2]|0;if((e|0)==0){return}if((a[e+81|0]|0)!=0){return}if((lm(b,0)|0)==0){return}e=Hx(c[((c[b>>2]&3|0)==3?b:b+32|0)+28>>2]|0)|0;_m(e,c[(c[d>>2]|0)+104>>2]|0);return}function lm(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0;e=i;i=i+96|0;f=e|0;g=e+64|0;j=e+80|0;k=b+8|0;if((a[(c[k>>2]|0)+112|0]|0)==6){l=0;i=e;return l|0}m=c[53786]|0;if((m|0)==0){n=4}else{if((a[fw(b|0,m)|0]|0)==0){n=4}}do{if((n|0)==4){m=c[53784]|0;if((m|0)==0){l=0;i=e;return l|0}if((a[fw(b|0,m)|0]|0)==0){l=0}else{break}i=e;return l|0}}while(0);n=d<<24>>24==0;d=c[k>>2]|0;if(n){o=d+104|0}else{o=d+100|0}k=c[o>>2]|0;o=c[d+8>>2]|0;a:do{if((o|0)==0){m=d;while(1){if((a[m+112|0]|0)==0){break}p=c[(c[m+116>>2]|0)+8>>2]|0;q=c[p+8>>2]|0;if((q|0)==0){m=p}else{r=q;break a}}m=b;q=$w(c[((c[m>>2]&3|0)==3?b:b+32|0)+28>>2]|0)|0;p=$w(c[((c[m>>2]&3|0)==2?b:b-32|0)+28>>2]|0)|0;Fv(1,114544,(m=i,i=i+16|0,c[m>>2]=q,c[m+8>>2]=p,m)|0)|0;i=m;l=0;i=e;return l|0}else{r=o}}while(0);do{if(n){o=c[r>>2]|0;if((c[o+8>>2]|0)==0){d=o|0;m=c[d>>2]|0;s=+h[m>>3];t=+h[m+8>>3];p=f;q=m;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];q=f+16|0;p=(c[d>>2]|0)+16|0;c[q>>2]=c[p>>2];c[q+4>>2]=c[p+4>>2];c[q+8>>2]=c[p+8>>2];c[q+12>>2]=c[p+12>>2];p=f+32|0;q=(c[d>>2]|0)+32|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];q=f+48|0;p=(c[d>>2]|0)+48|0;c[q>>2]=c[p>>2];c[q+4>>2]=c[p+4>>2];c[q+8>>2]=c[p+8>>2];c[q+12>>2]=c[p+12>>2];Qm(g,f|0,3,.1,0,0);u=+h[g>>3];v=+h[g+8>>3];w=s;x=t;break}else{p=c[o>>2]|0;u=+h[p>>3];v=+h[p+8>>3];w=+h[o+16>>3];x=+h[o+24>>3];break}}else{o=(c[r+4>>2]|0)-1|0;p=c[r>>2]|0;q=p+(o*48|0)|0;if((c[p+(o*48|0)+12>>2]|0)==0){d=p+(o*48|0)+4|0;m=c[d>>2]|0;y=m-1|0;z=q|0;A=c[z>>2]|0;t=+h[A+(y<<4)>>3];s=+h[A+(y<<4)+8>>3];y=f;B=A+(m-4<<4)|0;c[y>>2]=c[B>>2];c[y+4>>2]=c[B+4>>2];c[y+8>>2]=c[B+8>>2];c[y+12>>2]=c[B+12>>2];B=f+16|0;y=(c[z>>2]|0)+((c[d>>2]|0)-3<<4)|0;c[B>>2]=c[y>>2];c[B+4>>2]=c[y+4>>2];c[B+8>>2]=c[y+8>>2];c[B+12>>2]=c[y+12>>2];y=f+32|0;B=(c[z>>2]|0)+((c[d>>2]|0)-2<<4)|0;c[y>>2]=c[B>>2];c[y+4>>2]=c[B+4>>2];c[y+8>>2]=c[B+8>>2];c[y+12>>2]=c[B+12>>2];B=f+48|0;y=(c[z>>2]|0)+((c[d>>2]|0)-1<<4)|0;c[B>>2]=c[y>>2];c[B+4>>2]=c[y+4>>2];c[B+8>>2]=c[y+8>>2];c[B+12>>2]=c[y+12>>2];Qm(j,f|0,3,.9,0,0);u=+h[j>>3];v=+h[j+8>>3];w=t;x=s;break}else{y=(c[p+(o*48|0)+4>>2]|0)-1|0;B=c[q>>2]|0;u=+h[B+(y<<4)>>3];v=+h[B+(y<<4)+8>>3];w=+h[p+(o*48|0)+32>>3];x=+h[p+(o*48|0)+40>>3];break}}}while(0);s=+$(+(v-x),+(u-w));j=b|0;u=s+ +Fm(j,c[53786]|0,-25.0,-180.0)/180.0*3.141592653589793;s=+Fm(j,c[53784]|0,1.0,0.0)*10.0;h[k+56>>3]=w+s*+V(u);h[k+64>>3]=x+s*+W(u);a[k+81|0]=1;l=1;i=e;return l|0}function mm(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0;f=i;i=i+32|0;g=f|0;j=f+16|0;k=b[(c[d+8>>2]|0)+128>>1]&14;d=(c[e+8>>2]|0)+8|0;e=c[d>>2]|0;l=c[e>>2]|0;m=c[l>>2]|0;if((c[l+8>>2]|0)==0){n=m|0;o=m+8|0}else{n=l+16|0;o=l+24|0}p=+h[n>>3];q=+h[o>>3];o=c[e+4>>2]|0;e=o-1|0;n=l+(e*48|0)+16|0;if((c[l+(e*48|0)+12>>2]|0)==0){r=c[l+(e*48|0)>>2]|0;s=(c[l+(e*48|0)+4>>2]|0)-1|0;t=r+(s<<4)|0;u=r+(s<<4)+8|0}else{t=n+16|0;u=n+24|0}v=+h[t>>3];w=+h[u>>3];x=p-v;y=q-w;if(x*x+y*y<1.0e-6){z=p;A=q;B=a|0;h[B>>3]=z;C=a+8|0;h[C>>3]=A;i=f;return}if((k|0)==10|(k|0)==4){h[g>>3]=(p+v)*.5;h[g+8>>3]=(q+w)*.5;Wm(j,c[d>>2]|0,g);z=+h[j>>3];A=+h[j+8>>3];B=a|0;h[B>>3]=z;C=a+8|0;h[C>>3]=A;i=f;return}if((o|0)>0){D=0;E=0.0;F=m}else{cc(107648,154560,1318,170104)}while(1){j=c[l+(D*48|0)+4>>2]|0;if((j|0)>3){g=0;d=3;w=E;while(1){q=+h[F+(g<<4)>>3]- +h[F+(d<<4)>>3];v=+h[F+(g<<4)+8>>3]- +h[F+(d<<4)+8>>3];p=w+ +T(q*q+v*v);k=d+3|0;if((k|0)<(j|0)){g=g+3|0;d=k;w=p}else{G=p;break}}}else{G=E}d=D+1|0;if((d|0)>=(o|0)){break}D=d;E=G;F=c[l+(d*48|0)>>2]|0}F=0;E=G*.5;D=m;a:while(1){m=c[l+(F*48|0)+4>>2]|0;if((m|0)>3){d=0;g=3;H=E;while(1){I=+h[D+(d<<4)>>3];J=+h[D+(d<<4)+8>>3];K=+h[D+(g<<4)>>3];L=+h[D+(g<<4)+8>>3];G=I-K;w=J-L;M=+T(G*G+w*w);if(M>=H){break a}w=H-M;j=g+3|0;if((j|0)<(m|0)){d=d+3|0;g=j;H=w}else{N=w;break}}}else{N=E}g=F+1|0;if((g|0)>=(o|0)){O=19;break}F=g;E=N;D=c[l+(g*48|0)>>2]|0}if((O|0)==19){cc(107648,154560,1318,170104)}N=M-H;z=(H*K+I*N)/M;A=(H*L+J*N)/M;B=a|0;h[B>>3]=z;C=a+8|0;h[C>>3]=A;i=f;return}function nm(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;a=i;f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];f=e;e=i;i=i+16|0;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];km(b);i=a;return}function om(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=c[b+8>>2]|0;f=c[e+8>>2]|0;if((f|0)==0){g=e}else{h=f;i=d;return h|0}while(1){if((a[g+112|0]|0)==0){break}f=c[(c[g+116>>2]|0)+8>>2]|0;e=c[f+8>>2]|0;if((e|0)==0){g=f}else{h=e;j=5;break}}if((j|0)==5){i=d;return h|0}j=b;g=$w(c[((c[j>>2]&3|0)==3?b:b+32|0)+28>>2]|0)|0;e=$w(c[((c[j>>2]&3|0)==2?b:b-32|0)+28>>2]|0)|0;Fv(1,114544,(b=i,i=i+16|0,c[b>>2]=g,c[b+8>>2]=e,b)|0)|0;i=b;h=0;i=d;return h|0}function pm(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=a[b]|0;a:do{if(e<<24>>24==0){f=c;g=0}else{h=b;i=c;j=e;while(1){k=yF(j&255|0)|0;if((k|0)!=(yF(d[i]|0|0)|0)){break}k=h+1|0;l=i+1|0;m=a[k]|0;if(m<<24>>24==0){f=l;g=0;break a}else{h=k;i=l;j=m}}f=i;g=d[h]|0}}while(0);e=yF(g|0)|0;return e-(yF(d[f]|0|0)|0)|0}function qm(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if((e|0)==0){f=0;return f|0}else{g=b;h=c;i=e}while(1){e=i-1|0;c=yF(d[g]|0)|0;if((c|0)!=(yF(d[h]|0)|0)){j=7;break}if((e|0)==0){f=0;j=8;break}if((a[g]|0)==0){f=0;j=8;break}if((a[h]|0)==0){f=0;j=8;break}g=g+1|0;h=h+1|0;i=e}if((j|0)==7){i=yF(d[g]|0)|0;f=i-(yF(d[h]|0)|0)|0;return f|0}else if((j|0)==8){return f|0}return 0}function rm(b,d,e,f,g){b=b|0;d=d|0;e=+e;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,S=0.0,U=0.0,X=0,Y=0.0,Z=0.0,_=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0.0,ra=0,sa=0,ta=0.0,ua=0,va=0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0.0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0.0,Ha=0.0,Ia=0.0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0.0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0.0,Xa=0.0,Ya=0,Za=0,_a=0.0,$a=0.0,ab=0.0,bb=0.0,cb=0,db=0,eb=0,fb=0,gb=0.0,hb=0.0,ib=0,jb=0;j=i;i=i+80|0;k=j|0;l=j+64|0;m=k;n=jk(12)|0;o=n+4|0;c[o>>2]=0;p=n+8|0;c[p>>2]=2e3;q=jk(128e3)|0;r=q;s=n;c[s>>2]=r;t=c[b+4>>2]|0;u=c[b>>2]|0;v=+h[u>>3];w=+h[u+8>>3];b=c[o>>2]|0;x=c[p>>2]|0;if((b|0)<(x|0)){y=b;z=r}else{c[p>>2]=x<<1;r=mk(q,x<<7)|0;c[s>>2]=r;y=c[o>>2]|0;z=r}h[z+(y<<6)>>3]=v;h[(c[s>>2]|0)+(c[o>>2]<<6)+8>>3]=w;y=c[o>>2]|0;c[o>>2]=y+1;h[(c[s>>2]|0)+(y<<6)+16>>3]=0.0;y=k+48|0;z=u;c[y>>2]=c[z>>2];c[y+4>>2]=c[z+4>>2];c[y+8>>2]=c[z+8>>2];c[y+12>>2]=c[z+12>>2];if((t|0)>3){z=k|0;r=k|0;x=k+8|0;q=l|0;b=l+8|0;A=k+16|0;B=k+32|0;w=0.0;k=0;C=3;while(1){c[m>>2]=c[y>>2];c[m+4>>2]=c[y+4>>2];c[m+8>>2]=c[y+8>>2];c[m+12>>2]=c[y+12>>2];D=u+(k+1<<4)|0;c[A>>2]=c[D>>2];c[A+4>>2]=c[D+4>>2];c[A+8>>2]=c[D+8>>2];c[A+12>>2]=c[D+12>>2];D=u+(k+2<<4)|0;c[B>>2]=c[D>>2];c[B+4>>2]=c[D+4>>2];c[B+8>>2]=c[D+8>>2];c[B+12>>2]=c[D+12>>2];D=u+(k+3<<4)|0;c[y>>2]=c[D>>2];c[y+4>>2]=c[D+4>>2];c[y+8>>2]=c[D+8>>2];c[y+12>>2]=c[D+12>>2];v=+h[x>>3];E=+h[r>>3];F=w;D=1;while(1){Qm(l,z,3,+(D|0)/20.0,0,0);G=+h[q>>3];H=+h[b>>3];I=E-G;J=v-H;K=F+ +T(I*I+J*J);L=c[o>>2]|0;M=c[p>>2]|0;if((L|0)<(M|0)){N=L;O=c[s>>2]|0}else{c[p>>2]=M<<1;L=mk(c[s>>2]|0,M<<7)|0;c[s>>2]=L;N=c[o>>2]|0;O=L}h[O+(N<<6)>>3]=G;h[(c[s>>2]|0)+(c[o>>2]<<6)+8>>3]=H;L=c[o>>2]|0;c[o>>2]=L+1;h[(c[s>>2]|0)+(L<<6)+16>>3]=K;L=D+1|0;if((L|0)<21){v=H;E=G;F=K;D=L}else{break}}D=C+3|0;if((D|0)<(t|0)){w=K;k=C;C=D}else{break}}}C=c[o>>2]|0;if((c[p>>2]|0)>(C|0)){c[s>>2]=mk(c[s>>2]|0,C<<6)|0}C=c[o>>2]|0;o=c[s>>2]|0;p=C-1|0;K=+h[o+(p<<6)+16>>3];k=(C|0)>0;do{if(k){w=+(C|0);t=(g|0)==2;N=(f|0)==0;O=0;while(1){F=+(O-1|0);if((O|0)>0&F<w){P=F}else{P=F-w*+R(F/w)}b=~~P;q=O+1|0;F=+(q|0);if(F<w){Q=F}else{Q=F-w*+R(F/w)}z=~~Q;l=o+(O<<6)|0;F=+h[l>>3];r=o+(O<<6)+8|0;E=+h[r>>3];x=o+(O<<6)+16|0;v=+h[x>>3];y=o+(O<<6)+24|0;u=o+(O<<6)+32|0;B=o+(O<<6)+40|0;A=o+(O<<6)+48|0;m=o+(O<<6)+56|0;G=+h[o+(z<<6)+8>>3]-E;H=+h[o+(z<<6)>>3]-F;do{if(H==0.0&G==0.0){S=0.0}else{J=+$(+G,+H);if(J>=0.0){S=J;break}S=J+6.283185307179586}}while(0);H=+h[o+(b<<6)+8>>3]-E;G=+h[o+(b<<6)>>3]-F;do{if(G==0.0&H==0.0){U=0.0}else{J=+$(+H,+G);if(J>=0.0){U=J;break}U=J+6.283185307179586}}while(0);G=+Mc[d&15](v,K,e);do{if((O|0)==0){H=S+1.5707963267948966;if(!t){X=0;Y=G;Z=H;_=H;aa=E;ba=F;break}X=0;Y=G;Z=H;_=H;aa=E-G*+W(S);ba=F-G*+V(S)}else{if((O|0)==(p|0)){H=U+ -1.5707963267948966;if(!t){X=0;Y=G;Z=H;_=H;aa=E;ba=F;break}X=0;Y=G;Z=H;_=H;aa=E-G*+W(U);ba=F-G*+V(U);break}H=S-U;if(H<0.0){ca=H+6.283185307179586}else{ca=H}H=1.5707963267948966-ca*.5;J=+V(H);if(J==0.0){da=0.0}else{da=G/J}J=S+1.5707963267948966;I=J+H;if(N){if(da<=G*10.0){X=0;Y=da;Z=I;_=I;aa=E;ba=F;break}}I=U+ -1.5707963267948966;if(I>=0.0&I<6.283185307179586){ea=I}else{ea=I- +R(I/6.283185307179586)*6.283185307179586}if(J>=0.0&J<6.283185307179586){X=1;Y=G;Z=ea;_=J;aa=E;ba=F;break}X=1;Y=G;Z=ea;_=J- +R(J/6.283185307179586)*6.283185307179586;aa=E;ba=F}}while(0);h[l>>3]=ba;h[r>>3]=aa;h[x>>3]=v;a[y]=108;h[u>>3]=Z;h[B>>3]=Y;c[A>>2]=X;h[m>>3]=_;if((q|0)<(C|0)){O=q}else{break}}O=jk(12)|0;N=O;if(!k){fa=ba;ga=aa;ha=Z;ia=Y;ja=O;ka=N;break}t=O;b=O+4|0;z=O+8|0;D=(f|0)==1;L=0;while(1){w=+h[o+(L<<6)>>3];F=+h[o+(L<<6)+8>>3];E=+h[o+(L<<6)+32>>3];G=+h[o+(L<<6)+40>>3];M=c[o+(L<<6)+48>>2]|0;J=+h[o+(L<<6)+56>>3];I=w+G*+V(E);H=F+G*+W(E);la=c[t>>2]|0;if((la|0)<(c[b>>2]|0)){ma=la;na=c[z>>2]|0}else{c[b>>2]=2e3;la=mk(c[z>>2]|0,32e3)|0;c[z>>2]=la;ma=c[t>>2]|0;na=la}c[t>>2]=ma+1;h[na+(ma<<4)>>3]=I;h[na+(ma<<4)+8>>3]=H;do{if((M|0)!=0){if(!D){H=w+G*+V(J);I=w+G*+W(J);la=c[t>>2]|0;if((la|0)<(c[b>>2]|0)){oa=la;pa=c[z>>2]|0}else{c[b>>2]=2e3;la=mk(c[z>>2]|0,32e3)|0;c[z>>2]=la;oa=c[t>>2]|0;pa=la}c[t>>2]=oa+1;h[pa+(oa<<4)>>3]=H;h[pa+(oa<<4)+8>>3]=I;break}I=E-J;if(I>.0017453292519943296){qa=I}else{qa=I+6.283185307179586}if(qa>=3.141592653589793){I=w+G*+V(J);H=w+G*+W(J);la=c[t>>2]|0;if((la|0)<(c[b>>2]|0)){ra=la;sa=c[z>>2]|0}else{c[b>>2]=2e3;la=mk(c[z>>2]|0,32e3)|0;c[z>>2]=la;ra=c[t>>2]|0;sa=la}c[t>>2]=ra+1;h[sa+(ra<<4)>>3]=I;h[sa+(ra<<4)+8>>3]=H;break}H=J+qa;I=w+G*+V(H);ta=F+G*+W(H);la=c[t>>2]|0;if((la|0)<(c[b>>2]|0)){ua=la;va=c[z>>2]|0}else{c[b>>2]=2e3;la=mk(c[z>>2]|0,32e3)|0;c[z>>2]=la;ua=c[t>>2]|0;va=la}c[t>>2]=ua+1;h[va+(ua<<4)>>3]=I;h[va+(ua<<4)+8>>3]=ta;if(G==0.0){break}if(J>H){ta=J;while(1){I=ta+ -6.283185307179586;if(I>H){ta=I}else{wa=I;break}}}else{wa=J}ta=H-wa;if(ta>6.283185307179586){I=ta;while(1){xa=I+ -6.283185307179586;if(xa>6.283185307179586){I=xa}else{ya=xa;break}}}else{ya=ta}I=ya/19.0;la=1;do{xa=H-I*+(la|0);za=w+G*+V(xa);Aa=F+G*+W(xa);Ba=c[t>>2]|0;if((Ba|0)<(c[b>>2]|0)){Ca=Ba;Da=c[z>>2]|0}else{c[b>>2]=2e3;Ba=mk(c[z>>2]|0,32e3)|0;c[z>>2]=Ba;Ca=c[t>>2]|0;Da=Ba}c[t>>2]=Ca+1;h[Da+(Ca<<4)>>3]=za;h[Da+(Ca<<4)+8>>3]=Aa;la=la+1|0;}while((la|0)<20)}}while(0);M=L+1|0;if((M|0)<(C|0)){L=M}else{fa=w;ga=F;ha=E;ia=G;ja=O;ka=N;break}}}else{N=jk(12)|0;fa=0.0;ga=0.0;ha=0.0;ia=0.0;ja=N;ka=N}}while(0);Ca=(g|0)==1;ya=ha+3.141592653589793;do{if(Ca){wa=fa+ia*+V(ha);qa=ga+ia*+W(ha);g=ja;Da=c[g>>2]|0;ua=ja+4|0;if((Da|0)<(c[ua>>2]|0)){Ea=Da;Fa=c[ja+8>>2]|0}else{c[ua>>2]=2e3;Da=ja+8|0;va=mk(c[Da>>2]|0,32e3)|0;c[Da>>2]=va;Ea=c[g>>2]|0;Fa=va}c[g>>2]=Ea+1;h[Fa+(Ea<<4)>>3]=wa;h[Fa+(Ea<<4)+8>>3]=qa;if(ia==0.0){Ga=ha;break}if(ya>ha){qa=ya;while(1){wa=qa+ -6.283185307179586;if(wa>ha){qa=wa}else{Ha=wa;break}}}else{Ha=ya}qa=ha-Ha;if(qa>6.283185307179586){wa=qa;while(1){Y=wa+ -6.283185307179586;if(Y>6.283185307179586){wa=Y}else{Ia=Y;break}}}else{Ia=qa}wa=Ia/19.0;va=ja+8|0;Da=1;while(1){Y=ha-wa*+(Da|0);Z=fa+ia*+V(Y);aa=ga+ia*+W(Y);ra=c[g>>2]|0;if((ra|0)<(c[ua>>2]|0)){Ja=ra;Ka=c[va>>2]|0}else{c[ua>>2]=2e3;ra=mk(c[va>>2]|0,32e3)|0;c[va>>2]=ra;Ja=c[g>>2]|0;Ka=ra}c[g>>2]=Ja+1;h[Ka+(Ja<<4)>>3]=Z;h[Ka+(Ja<<4)+8>>3]=aa;ra=Da+1|0;if((ra|0)<20){Da=ra}else{Ga=ha;break}}}else{wa=fa+ia*+V(ya);qa=ga+ia*+W(ya);Da=ja;g=c[Da>>2]|0;va=ja+4|0;if((g|0)<(c[va>>2]|0)){La=g;Ma=c[ja+8>>2]|0}else{c[va>>2]=2e3;va=ja+8|0;g=mk(c[va>>2]|0,32e3)|0;c[va>>2]=g;La=c[Da>>2]|0;Ma=g}c[Da>>2]=La+1;h[Ma+(La<<4)>>3]=wa;h[Ma+(La<<4)+8>>3]=qa;Ga=ya}}while(0);La=C-2|0;if((La|0)>-1){C=ja;Ma=ja+4|0;Ja=ja+8|0;Ka=(f|0)==1;f=La;while(1){ya=+h[o+(f<<6)>>3];ha=+h[o+(f<<6)+8>>3];Ia=+h[o+(f<<6)+40>>3];La=c[o+(f<<6)+48>>2]|0;Ha=+h[o+(f<<6)+32>>3]+3.141592653589793;qa=+h[o+(f<<6)+56>>3]+3.141592653589793;wa=ya+Ia*+V(qa);aa=ha+Ia*+W(qa);Ea=c[C>>2]|0;if((Ea|0)<(c[Ma>>2]|0)){Na=Ea;Oa=c[Ja>>2]|0}else{c[Ma>>2]=2e3;Ea=mk(c[Ja>>2]|0,32e3)|0;c[Ja>>2]=Ea;Na=c[C>>2]|0;Oa=Ea}c[C>>2]=Na+1;h[Oa+(Na<<4)>>3]=wa;h[Oa+(Na<<4)+8>>3]=aa;do{if((La|0)!=0){if(!Ka){aa=ya+Ia*+V(Ha);wa=ya+Ia*+W(Ha);Ea=c[C>>2]|0;if((Ea|0)<(c[Ma>>2]|0)){Pa=Ea;Qa=c[Ja>>2]|0}else{c[Ma>>2]=2e3;Ea=mk(c[Ja>>2]|0,32e3)|0;c[Ja>>2]=Ea;Pa=c[C>>2]|0;Qa=Ea}c[C>>2]=Pa+1;h[Qa+(Pa<<4)>>3]=aa;h[Qa+(Pa<<4)+8>>3]=wa;break}wa=qa-Ha;if(wa>.0017453292519943296){Ra=wa}else{Ra=wa+6.283185307179586}if(Ra>=3.141592653589793){wa=ya+Ia*+V(Ha);aa=ya+Ia*+W(Ha);Ea=c[C>>2]|0;if((Ea|0)<(c[Ma>>2]|0)){Sa=Ea;Ta=c[Ja>>2]|0}else{c[Ma>>2]=2e3;Ea=mk(c[Ja>>2]|0,32e3)|0;c[Ja>>2]=Ea;Sa=c[C>>2]|0;Ta=Ea}c[C>>2]=Sa+1;h[Ta+(Sa<<4)>>3]=wa;h[Ta+(Sa<<4)+8>>3]=aa;break}aa=Ha+Ra;wa=ya+Ia*+V(aa);Z=ha+Ia*+W(aa);Ea=c[C>>2]|0;if((Ea|0)<(c[Ma>>2]|0)){Ua=Ea;Va=c[Ja>>2]|0}else{c[Ma>>2]=2e3;Ea=mk(c[Ja>>2]|0,32e3)|0;c[Ja>>2]=Ea;Ua=c[C>>2]|0;Va=Ea}c[C>>2]=Ua+1;h[Va+(Ua<<4)>>3]=wa;h[Va+(Ua<<4)+8>>3]=Z;if(Ia==0.0){break}if(Ha>aa){Z=Ha;while(1){wa=Z+ -6.283185307179586;if(wa>aa){Z=wa}else{Wa=wa;break}}}else{Wa=Ha}Z=aa-Wa;if(Z>6.283185307179586){G=Z;while(1){E=G+ -6.283185307179586;if(E>6.283185307179586){G=E}else{Xa=E;break}}}else{Xa=Z}G=Xa/19.0;Ea=1;do{E=aa-G*+(Ea|0);F=ya+Ia*+V(E);w=ha+Ia*+W(E);Fa=c[C>>2]|0;if((Fa|0)<(c[Ma>>2]|0)){Ya=Fa;Za=c[Ja>>2]|0}else{c[Ma>>2]=2e3;Fa=mk(c[Ja>>2]|0,32e3)|0;c[Ja>>2]=Fa;Ya=c[C>>2]|0;Za=Fa}c[C>>2]=Ya+1;h[Za+(Ya<<4)>>3]=F;h[Za+(Ya<<4)+8>>3]=w;Ea=Ea+1|0;}while((Ea|0)<20)}}while(0);if((f|0)>0){f=f-1|0}else{_a=ya;$a=ha;ab=Ha;bb=Ia;break}}}else{_a=fa;$a=ga;ab=Ga;bb=ia}if(!Ca){cb=c[s>>2]|0;db=cb;eF(db);eF(n);i=j;return ka|0}ia=ab+3.141592653589793;Ga=_a+bb*+V(ab);ga=$a+bb*+W(ab);Ca=ja;f=c[Ca>>2]|0;Ya=ja+4|0;if((f|0)<(c[Ya>>2]|0)){eb=f;fb=c[ja+8>>2]|0}else{c[Ya>>2]=2e3;f=ja+8|0;Za=mk(c[f>>2]|0,32e3)|0;c[f>>2]=Za;eb=c[Ca>>2]|0;fb=Za}c[Ca>>2]=eb+1;h[fb+(eb<<4)>>3]=Ga;h[fb+(eb<<4)+8>>3]=ga;if(bb==0.0){cb=c[s>>2]|0;db=cb;eF(db);eF(n);i=j;return ka|0}if(ia>ab){ga=ia;while(1){Ga=ga+ -6.283185307179586;if(Ga>ab){ga=Ga}else{gb=Ga;break}}}else{gb=ia}ia=ab-gb;if(ia>6.283185307179586){gb=ia;while(1){ga=gb+ -6.283185307179586;if(ga>6.283185307179586){gb=ga}else{hb=ga;break}}}else{hb=ia}ia=hb/19.0;eb=ja+8|0;ja=1;do{hb=ab-ia*+(ja|0);gb=_a+bb*+V(hb);ga=$a+bb*+W(hb);fb=c[Ca>>2]|0;if((fb|0)<(c[Ya>>2]|0)){ib=fb;jb=c[eb>>2]|0}else{c[Ya>>2]=2e3;fb=mk(c[eb>>2]|0,32e3)|0;c[eb>>2]=fb;ib=c[Ca>>2]|0;jb=fb}c[Ca>>2]=ib+1;h[jb+(ib<<4)>>3]=gb;h[jb+(ib<<4)+8>>3]=ga;ja=ja+1|0;}while((ja|0)<20);cb=c[s>>2]|0;db=cb;eF(db);eF(n);i=j;return ka|0}function sm(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0;f=i;i=i+8|0;g=f|0;c[g>>2]=0;j=e+4|0;k=c[j>>2]|0;if((k|0)==0){cc(115016,154384,202,169928)}l=k|0;m=c[l>>2]|0;if((m|0)==0){cc(126064,154384,205,169928)}n=k+8|0;if((c[n>>2]|0)==0){k=c[43664]|0;do{if((k|0)==0){p=9}else{if((pm(k,m)|0)!=0){p=9;break}q=c[43662]|0}}while(0);if((p|0)==9){c[43664]=m;m=vb(174656,13152,35,36,48)|0;c[43662]=m;q=m}c[n>>2]=q}if((a[213992]|0)==0){r=0}else{q=(Sh(c[l>>2]|0)|0)==0;r=q?0:g}do{if((AB(d,e,r)|0)<<24>>24==0){q=c[j>>2]|0;n=c[q>>2]|0;s=+h[q+16>>3];q=e+32|0;h[q>>3]=0.0;h[e+40>>3]=s*1.2;h[e+16>>3]=0.0;h[e+24>>3]=s*.1;c[e+8>>2]=0;c[e+12>>2]=0;do{if((qm(n,102048,4)|0)==0){t=37952;u=96296}else{if((qm(n,91056,5)|0)==0){t=72360;u=81152;break}if((qm(n,85760,9)|0)==0){t=72360;u=81152;break}t=1216;u=167368}}while(0);if((r|0)!=0){c[r>>2]=u}n=c[e>>2]|0;if((n|0)==0){break}m=a[n]|0;if(m<<24>>24==0){v=0.0}else{p=n;n=m;w=0.0;while(1){m=p+1|0;x=w+ +h[t+((n&255)<<3)>>3];h[q>>3]=x;k=a[m]|0;if(k<<24>>24==0){v=x;break}else{p=m;n=k;w=x}}}h[q>>3]=s*v}}while(0);if((r|0)==0){y=e+32|0;z=b;A=y;c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];i=f;return}r=c[g>>2]|0;g=c[o>>2]|0;t=c[l>>2]|0;if((r|0)==0){gc(g|0,107584,(B=i,i=i+8|0,c[B>>2]=t,B)|0)|0;i=B;y=e+32|0;z=b;A=y;c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];i=f;return}else{gc(g|0,114456,(B=i,i=i+16|0,c[B>>2]=t,c[B+8>>2]=r,B)|0)|0;i=B;y=e+32|0;z=b;A=y;c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];i=f;return}}function tm(a){a=a|0;var b=0,d=0;b=a+108|0;c[b>>2]=0;c[a+112>>2]=32;c[a+116>>2]=-1;c[a+120>>2]=44;c[a+124>>2]=6;c[a+128>>2]=72;c[a+132>>2]=0;c[a+136>>2]=0;c[a+140>>2]=0;d=$g(b,c[43330]|0)|0;c[a+144>>2]=d;return d|0}function um(a,b,d){a=a|0;b=b|0;d=d|0;d=fF(1,32)|0;a=c[b>>2]|0;if((a|0)!=0){c[d>>2]=Lb(a|0)|0}a=c[b+4>>2]|0;if((a|0)!=0){c[d+4>>2]=Lb(a|0)|0}a=d+24|0;c[a>>2]=c[a>>2]&-128|c[b+24>>2]&127;h[d+16>>3]=+h[b+16>>3];c[d+8>>2]=c[b+8>>2];return d|0}function vm(a,b,d){a=a|0;b=b|0;d=d|0;d=c[b>>2]|0;if((d|0)!=0){eF(d)}d=c[b+4>>2]|0;if((d|0)==0){eF(b);return}eF(d);eF(b);return}function wm(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,l=0.0;e=c[b>>2]|0;a=c[d>>2]|0;f=(a|0)==0;do{if((e|0)==0){if(f){g=5}else{i=-1}}else{if(f){i=1;break}j=Ya(e|0,a|0)|0;if((j|0)==0){g=5}else{i=j}}}while(0);do{if((g|0)==5){a=c[b+4>>2]|0;e=c[d+4>>2]|0;f=(e|0)==0;if((a|0)==0){if(!f){i=-1;break}}else{if(f){i=1;break}f=Ya(a|0,e|0)|0;if((f|0)!=0){i=f;break}}f=c[b+24>>2]<<25>>25;e=c[d+24>>2]<<25>>25;if((f|0)!=(e|0)){i=f-e|0;break}k=+h[b+16>>3];l=+h[d+16>>3];if(k<l){i=-1;break}i=k>l|0}}while(0);return i|0}function xm(a,b){a=a|0;b=b|0;return pm(c[a>>2]|0,c[b>>2]|0)|0}function ym(){ub(214072)|0;return}function zm(){var a=0,b=0;a=i;i=i+16|0;b=a|0;ub(b|0)|0;i=a;return+(+((c[b+4>>2]|0)+(c[b>>2]|0)-(c[53518]|0)-(c[53519]|0)|0)/60.0)}function Am(a){a=a|0;var b=0,d=0;b=jk(16)|0;d=(a|0)<2?2:a;a=jk(d<<2)|0;c[b>>2]=a;c[b+12>>2]=a;c[b+8>>2]=a;c[b+4>>2]=a+(d<<2);return b|0}function Bm(a){a=a|0;eF(c[a>>2]|0);eF(a);return}function Cm(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+12|0;e=c[d>>2]|0;c[d>>2]=e+4;c[e>>2]=b;if((c[d>>2]|0)>>>0<(c[a+4>>2]|0)>>>0){return}c[d>>2]=c[a>>2];return}function Dm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+8|0;d=c[b>>2]|0;if((d|0)==(c[a+12>>2]|0)){e=0;return e|0}f=d+4|0;c[b>>2]=f;g=c[d>>2]|0;if(f>>>0<(c[a+4>>2]|0)>>>0){e=g;return e|0}c[b>>2]=c[a>>2];e=g;return e|0}function Em(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;i=i+8|0;h=g|0;do{if((d|0)==0){j=e}else{k=fw(b,d)|0;if((k|0)==0){j=e;break}if((a[k]|0)==0){j=e;break}l=Ja(k|0,h|0,10)|0;if((k|0)==(c[h>>2]|0)){j=e;break}j=(l|0)<(f|0)?f:l}}while(0);i=g;return j|0}function Fm(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var g=0,h=0,j=0.0,k=0,l=0.0;g=i;i=i+8|0;h=g|0;do{if((d|0)==0|(b|0)==0){j=e}else{k=fw(b,d)|0;if((k|0)==0){j=e;break}if((a[k]|0)==0){j=e;break}l=+sF(k,h);if((k|0)==(c[h>>2]|0)){j=e;break}j=l<f?f:l}}while(0);i=g;return+j}function Gm(b){b=b|0;var d=0,e=0,f=0.0,g=0.0,j=0,k=0.0,l=0;d=i;i=i+8|0;e=d|0;f=+h[21580];if(f>0.0){g=f;i=d;return+g}j=Wv(b,0,114184,0)|0;do{if((j|0)==0|(b|0)==0){k=-1.0}else{l=fw(b|0,j)|0;if((l|0)==0){k=-1.0;break}if((a[l]|0)==0){k=-1.0;break}f=+sF(l,e);if((l|0)==(c[e>>2]|0)){k=-1.0;break}k=f<0.0?0.0:f}}while(0);g=k==0.0?72.0:k;i=d;return+g}function Hm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((b|0)==0|(a|0)==0){d=c;return d|0}d=fw(a,b)|0;return d|0}function Im(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;if((c|0)==0|(b|0)==0){e=d}else{e=fw(b,c)|0}do{if((e|0)!=0){if((a[e]|0)==0){break}else{f=e}return f|0}}while(0);f=d;return f|0}function Jm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((b|0)==0){d=c&255;return d|0}else{d=Vm(fw(a,b)|0,0)|0;return d|0}return 0}function Km(a){a=a|0;return Vm(a,0)|0}function Lm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=a+8|0;d=c[b>>2]|0;e=d+220|0;f=c[e>>2]|0;if((f|0)!=0&(f|0)!=(a|0)){g=b;h=e;i=f;j=d}else{k=a;return k|0}do{a=c[(c[i+8>>2]|0)+220>>2]|0;if((a|0)==0){l=j}else{c[h>>2]=a;l=c[g>>2]|0}m=c[l+220>>2]|0;g=m+8|0;j=c[g>>2]|0;h=j+220|0;i=c[h>>2]|0;}while((i|0)!=0&(i|0)!=(m|0));k=m;return k|0}function Mm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((a|0)==(b|0)){d=a;return d|0}e=a+8|0;f=c[e>>2]|0;g=f+220|0;h=c[g>>2]|0;do{if((h|0)==0){c[g>>2]=a;c[(c[e>>2]|0)+216>>2]=1;i=a}else{if((h|0)==(a|0)){i=a;break}else{j=e;k=g;l=h;m=f}do{n=c[(c[l+8>>2]|0)+220>>2]|0;if((n|0)==0){o=m}else{c[k>>2]=n;o=c[j>>2]|0}p=c[o+220>>2]|0;j=p+8|0;m=c[j>>2]|0;k=m+220|0;l=c[k>>2]|0;}while((l|0)!=0&(l|0)!=(p|0));i=p}}while(0);p=b+8|0;l=c[p>>2]|0;k=l+220|0;m=c[k>>2]|0;do{if((m|0)==0){c[k>>2]=b;c[(c[p>>2]|0)+216>>2]=1;q=b}else{if((m|0)==(b|0)){q=b;break}else{r=p;s=k;t=m;u=l}do{j=c[(c[t+8>>2]|0)+220>>2]|0;if((j|0)==0){v=u}else{c[s>>2]=j;v=c[r>>2]|0}w=c[v+220>>2]|0;r=w+8|0;u=c[r>>2]|0;s=u+220|0;t=c[s>>2]|0;}while((t|0)!=0&(t|0)!=(w|0));q=w}}while(0);w=i+8|0;t=c[w>>2]|0;s=q+8|0;u=c[s>>2]|0;if((c[t+120>>2]|0)>(c[u+120>>2]|0)){c[t+220>>2]=q;t=(c[s>>2]|0)+216|0;c[t>>2]=(c[t>>2]|0)+(c[(c[w>>2]|0)+216>>2]|0);d=q;return d|0}else{c[u+220>>2]=i;u=(c[w>>2]|0)+216|0;c[u>>2]=(c[u>>2]|0)+(c[(c[s>>2]|0)+216>>2]|0);d=i;return d|0}return 0}function Nm(b){b=b|0;var d=0;d=b+8|0;c[(c[d>>2]|0)+216>>2]=1;c[(c[d>>2]|0)+220>>2]=0;a[(c[d>>2]|0)+159|0]=0;return}function Om(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+8|0;e=c[d>>2]|0;f=e+220|0;g=c[f>>2]|0;do{if((g|0)!=0&(g|0)!=(a|0)){h=d;i=f;j=g;k=e;do{l=c[(c[j+8>>2]|0)+220>>2]|0;if((l|0)==0){m=k}else{c[i>>2]=l;m=c[h>>2]|0}n=c[m+220>>2]|0;h=n+8|0;k=c[h>>2]|0;i=k+220|0;j=c[i>>2]|0;}while((j|0)!=0&(j|0)!=(n|0));if((n|0)==(a|0)){o=c[d>>2]|0;break}else{cc(114360,125704,195,171112)}}else{o=e}}while(0);c[o+220>>2]=b;o=(c[b+8>>2]|0)+216|0;c[o>>2]=(c[o>>2]|0)+(c[(c[d>>2]|0)+216>>2]|0);return}function Pm(a,b){a=a|0;b=b|0;var d=0,e=0.0;d=c[(c[b+8>>2]|0)+132>>2]|0;e=+h[d+8>>3]*72.0;h[a>>3]=+h[d>>3]*72.0;h[a+8>>3]=e;return}function Qm(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0,x=0,y=0,z=0;j=i;i=i+576|0;k=j|0;l=(d|0)<0;do{if(!l){m=0;while(1){n=k+(m<<4)|0;o=b+(m<<4)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];if((m|0)<(d|0)){m=m+1|0}else{break}}if((d|0)<1){break}p=1.0-e;m=1;while(1){o=d-m|0;if((o|0)>=0){n=m-1|0;q=0;r=+h[k+(n*96|0)>>3];s=+h[k+(n*96|0)+8>>3];while(1){t=q+1|0;u=+h[k+(n*96|0)+(t<<4)>>3];h[k+(m*96|0)+(q<<4)>>3]=p*r+u*e;v=+h[k+(n*96|0)+(t<<4)+8>>3];h[k+(m*96|0)+(q<<4)+8>>3]=p*s+v*e;if((q|0)<(o|0)){q=t;r=u;s=v}else{break}}}if((m|0)<(d|0)){m=m+1|0}else{break}}}}while(0);if(!((f|0)==0|l)){b=0;while(1){m=f+(b<<4)|0;q=k+(b*96|0)|0;c[m>>2]=c[q>>2];c[m+4>>2]=c[q+4>>2];c[m+8>>2]=c[q+8>>2];c[m+12>>2]=c[q+12>>2];if((b|0)<(d|0)){b=b+1|0}else{break}}}if((g|0)==0|l){w=k+(d*96|0)|0;x=a;y=w;c[x>>2]=c[y>>2];c[x+4>>2]=c[y+4>>2];c[x+8>>2]=c[y+8>>2];c[x+12>>2]=c[y+12>>2];i=j;return}else{z=0}while(1){l=g+(z<<4)|0;b=k+((d-z|0)*96|0)+(z<<4)|0;c[l>>2]=c[b>>2];c[l+4>>2]=c[b+4>>2];c[l+8>>2]=c[b+8>>2];c[l+12>>2]=c[b+12>>2];if((z|0)<(d|0)){z=z+1|0}else{break}}w=k+(d*96|0)|0;x=a;y=w;c[x>>2]=c[y>>2];c[x+4>>2]=c[y+4>>2];c[x+8>>2]=c[y+8>>2];c[x+12>>2]=c[y+12>>2];i=j;return}function Rm(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=0;while(1){e=c[53742]|0;if((e-d|0)<1024){f=e+1024|0;c[53742]=f;g=mk(c[53740]|0,f)|0;c[53740]=g;h=c[53742]|0;i=g}else{h=e;i=c[53740]|0}e=db(i+d|0,h-d|0,b|0)|0;if((e|0)==0){break}g=(xF(e|0)|0)+d|0;e=c[53740]|0;if((a[e+(g-1)|0]|0)==10){j=g;k=e;l=8;break}else{d=g}}if((l|0)==8){m=(j|0)>0;n=m?k:0;return n|0}j=d;k=c[53740]|0;m=(j|0)>0;n=m?k:0;return n|0}function Sm(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;if((b|0)==0){e=0;i=d;return e|0}if((a[b]|0)==0){e=0;i=d;return e|0}f=c[53686]|0;if((f|0)==0){g=c[53702]|0;h=c[43778]|0;do{if((c[43774]|0)==(g|0)){j=h}else{if((h|0)==0){k=g}else{eF(c[h>>2]|0);eF(c[43778]|0);c[43778]=0;k=c[53702]|0}c[43774]=k;if((k|0)==0){e=b;i=d;return e|0}if((a[k]|0)==0){e=b;i=d;return e|0}else{l=Tm(k)|0;c[43778]=l;j=l;break}}}while(0);if(!((a[b]|0)!=47&(j|0)!=0)){e=b;i=d;return e|0}k=c[43776]|0;h=c[44762]|0;g=gF(h,k+2+(xF(b|0)|0)|0)|0;c[44762]=g;k=c[j>>2]|0;if((k|0)==0){e=0;i=d;return e|0}nb(g|0,117488,(m=i,i=i+24|0,c[m>>2]=k,c[m+8>>2]=96224,c[m+16>>2]=b,m)|0)|0;i=m;a:do{if((kb(c[44762]|0,4)|0)!=0){k=j;while(1){k=k+4|0;g=c[k>>2]|0;if((g|0)==0){e=0;break}nb(c[44762]|0,117488,(m=i,i=i+24|0,c[m>>2]=g,c[m+8>>2]=96224,c[m+16>>2]=b,m)|0)|0;i=m;if((kb(c[44762]|0,4)|0)==0){break a}}i=d;return e|0}}while(0);e=c[44762]|0;i=d;return e|0}else{j=c[53704]|0;do{if((j|0)!=0){if((a[j]|0)==0){break}if((c[43774]|0)==0){c[43778]=Tm(j)|0;k=c[53704]|0;c[43774]=k;n=k}else{n=j}k=ob(b|0,47)|0;g=(k|0)==0?b:k+1|0;k=ob(g|0,92)|0;h=(k|0)==0?g:k+1|0;k=ob(h|0,58)|0;g=(k|0)==0?h:k+1|0;if(!(a[11872]|(g|0)==(b|0))){Fv(0,101800,(m=i,i=i+16|0,c[m>>2]=b,c[m+8>>2]=n,m)|0)|0;i=m;a[11872]=1}k=c[43778]|0;h=c[43776]|0;l=c[44762]|0;o=gF(l,h+2+(xF(g|0)|0)|0)|0;c[44762]=o;h=c[k>>2]|0;if((h|0)==0){e=0;i=d;return e|0}nb(o|0,117488,(m=i,i=i+24|0,c[m>>2]=h,c[m+8>>2]=96224,c[m+16>>2]=g,m)|0)|0;i=m;b:do{if((kb(c[44762]|0,4)|0)!=0){h=k;while(1){h=h+4|0;o=c[h>>2]|0;if((o|0)==0){e=0;break}nb(c[44762]|0,117488,(m=i,i=i+24|0,c[m>>2]=o,c[m+8>>2]=96224,c[m+16>>2]=g,m)|0)|0;i=m;if((kb(c[44762]|0,4)|0)==0){break b}}i=d;return e|0}}while(0);e=c[44762]|0;i=d;return e|0}}while(0);if(a[11872]|0){e=0;i=d;return e|0}Fv(0,107392,(m=i,i=i+8|0,c[m>>2]=f,m)|0)|0;i=m;a[11872]=1;e=0;i=d;return e|0}return 0}function Tm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=0;d=La(Lb(a|0)|0,117440)|0;a=0;e=0;while(1){if((a|0)==0){f=kk((b<<2)+8|0)|0}else{f=mk(a,(b<<2)+8|0)|0}g=f;h=b+1|0;c[g+(b<<2)>>2]=d;i=xF(d|0)|0;j=e>>>0>i>>>0?e:i;i=La(0,117440)|0;if((i|0)==0){break}else{b=h;d=i;a=g;e=j}}c[g+(h<<2)>>2]=0;c[43776]=j;return g|0}function Um(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=c[d>>2]|0;a:do{if((f|0)==0){g=0}else{if((b|0)==0){h=0;while(1){i=h+1|0;if((c[d+(i<<2)>>2]|0)==0){g=i;break a}else{h=i}}}else{j=0;k=f}while(1){if((a[b]|0)==(a[k]|0)){if((Ya(b|0,k|0)|0)==0){g=j;break a}}h=j+1|0;i=c[d+(h<<2)>>2]|0;if((i|0)==0){g=h;break}else{j=h;k=i}}}}while(0);return c[e+(g<<2)>>2]|0}function Vm(b,c){b=b|0;c=c|0;var d=0,e=0;do{if((b|0)==0){d=c}else{e=a[b]|0;if(e<<24>>24==0){d=c;break}if((pm(b,90984)|0)==0){d=0;break}if((pm(b,85704)|0)==0){d=0;break}if((pm(b,81088)|0)==0){d=1;break}if((pm(b,167288)|0)==0){d=1;break}if(((e<<24>>24)-48|0)>>>0>=10>>>0){d=c;break}d=(Rb(b|0)|0)&255}}while(0);return d|0}function Wm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0.0,C=0,D=0,E=0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0;e=i;i=i+640|0;f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];f=e|0;g=e+576|0;j=c[b+4>>2]|0;k=c[b>>2]|0;l=+h[d>>3];m=+h[d+8>>3];if((j|0)>0){n=1.0e+38;d=-1;b=-1;o=0;while(1){p=c[k+(o*48|0)>>2]|0;q=c[k+(o*48|0)+4>>2]|0;if((q|0)>0){r=n;s=d;t=b;u=0;while(1){v=+h[p+(u<<4)>>3]-l;w=+h[p+(u<<4)+8>>3]-m;x=v*v+w*w;y=(s|0)==-1|x<r;w=y?x:r;z=y?u:s;A=y?o:t;y=u+1|0;if((y|0)<(q|0)){r=w;s=z;t=A;u=y}else{B=w;C=z;D=A;break}}}else{B=n;C=d;D=b}u=o+1|0;if((u|0)<(j|0)){n=B;d=C;b=D;o=u}else{E=C;F=D;break}}}else{E=-1;F=-1}D=c[k+(F*48|0)>>2]|0;C=(((E|0)==((c[k+(F*48|0)+4>>2]|0)-1|0))<<31>>31)+E|0;E=C-((C|0)%3|0)|0;B=+h[D+(E<<4)>>3];h[g>>3]=B;n=+h[D+(E<<4)+8>>3];h[g+8>>3]=n;C=E+1|0;h[g+16>>3]=+h[D+(C<<4)>>3];h[g+24>>3]=+h[D+(C<<4)+8>>3];C=E+2|0;h[g+32>>3]=+h[D+(C<<4)>>3];h[g+40>>3]=+h[D+(C<<4)+8>>3];C=E+3|0;r=+h[D+(C<<4)>>3];h[g+48>>3]=r;w=+h[D+(C<<4)+8>>3];h[g+56>>3]=w;x=B-l;B=n-m;n=r-l;r=w-m;C=f+288|0;w=1.0;v=0.0;G=n*n+r*r;r=x*x+B*B;while(1){D=f;E=g;c[D>>2]=c[E>>2];c[D+4>>2]=c[E+4>>2];c[D+8>>2]=c[E+8>>2];c[D+12>>2]=c[E+12>>2];E=f+16|0;D=g+16|0;c[E>>2]=c[D>>2];c[E+4>>2]=c[D+4>>2];c[E+8>>2]=c[D+8>>2];c[E+12>>2]=c[D+12>>2];D=f+32|0;E=g+32|0;c[D>>2]=c[E>>2];c[D+4>>2]=c[E+4>>2];c[D+8>>2]=c[E+8>>2];c[D+12>>2]=c[E+12>>2];E=f+48|0;D=g+48|0;c[E>>2]=c[D>>2];c[E+4>>2]=c[D+4>>2];c[E+8>>2]=c[D+8>>2];c[E+12>>2]=c[D+12>>2];B=(v+w)*.5;x=1.0-B;D=0;n=+h[f>>3];H=+h[f+8>>3];while(1){E=D+1|0;I=+h[f+(E<<4)>>3];h[f+96+(D<<4)>>3]=x*n+B*I;J=+h[f+(E<<4)+8>>3];h[f+96+(D<<4)+8>>3]=x*H+B*J;if((D|0)<2){D=E;n=I;H=J}else{break}}D=0;H=+h[f+96>>3];n=+h[f+104>>3];while(1){E=D+1|0;J=+h[f+96+(E<<4)>>3];h[f+192+(D<<4)>>3]=x*H+B*J;I=+h[f+96+(E<<4)+8>>3];h[f+192+(D<<4)+8>>3]=x*n+B*I;if((D|0)<1){D=E;H=J;n=I}else{break}}n=+h[f+200>>3];h[f+288>>3]=x*+h[f+192>>3]+B*+h[f+208>>3];K=x*n+B*+h[f+216>>3];h[f+296>>3]=K;L=+h[C>>3];if(+S(+(r-G))<1.0){M=10;break}if(+S(+(w-v))<1.0e-5){M=10;break}D=r<G;n=L-l;H=K-m;I=n*n+H*H;w=D?B:w;v=D?v:B;G=D?I:G;r=D?r:I}if((M|0)==10){h[a>>3]=L;h[a+8>>3]=K;i=e;return}}function Xm(){return c[53510]|0}function Ym(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0;d=i;i=i+32|0;e=d|0;f=d+8|0;g=d+16|0;j=d+24|0;k=b|0;l=c[53574]|0;m=(b|0)==0;do{if((l|0)==0|m){n=.75}else{o=fw(k,l)|0;if((o|0)==0){n=.75;break}if((a[o]|0)==0){n=.75;break}p=+sF(o,j);if((o|0)==(c[j>>2]|0)){n=.75;break}n=p<.01?.01:p}}while(0);j=b+8|0;h[(c[j>>2]|0)+32>>3]=n;l=c[53618]|0;do{if((l|0)==0|m){q=.5}else{o=fw(k,l)|0;if((o|0)==0){q=.5;break}if((a[o]|0)==0){q=.5;break}n=+sF(o,g);if((o|0)==(c[g>>2]|0)){q=.5;break}q=n<.02?.02:n}}while(0);h[(c[j>>2]|0)+40>>3]=q;g=c[53590]|0;if((g|0)==0|m){r=159064;s=13}else{l=fw(k,g)|0;if((l|0)==0){s=14}else{r=l;s=13}}if((s|0)==13){if((a[r]|0)==0){s=14}else{t=r}}if((s|0)==14){t=159064}r=vl(t,b)|0;c[(c[j>>2]|0)+8>>2]=r;r=fw(k,c[53614]|0)|0;t=c[53624]|0;do{if((t|0)==0|m){u=14.0}else{l=fw(k,t)|0;if((l|0)==0){u=14.0;break}if((a[l]|0)==0){u=14.0;break}q=+sF(l,f);if((l|0)==(c[f>>2]|0)){u=14.0;break}u=q<1.0?1.0:q}}while(0);f=c[53626]|0;if((f|0)==0|m){v=154088;s=22}else{t=fw(k,f)|0;if((t|0)==0){s=23}else{v=t;s=22}}if((s|0)==22){if((a[v]|0)==0){s=23}else{w=v}}if((s|0)==23){w=154088}v=c[53628]|0;if((v|0)==0|m){x=150904;s=26}else{m=fw(k,v)|0;if((m|0)==0){s=27}else{x=m;s=26}}if((s|0)==26){if((a[x]|0)==0){s=27}else{y=x}}if((s|0)==27){y=150904}s=(gy(r)|0)!=0;x=(pl(b)|0)==2;m=ak(k,r,(x?4:0)|(s?2:0),u,w,y)|0;c[(c[j>>2]|0)+104>>2]=m;m=c[53572]|0;do{if((m|0)!=0){s=fw(k,m)|0;if((s|0)==0){break}if((a[s]|0)==0){break}x=(gy(s)|0)!=0;r=ak(k,s,x?2:0,u,w,y)|0;c[(c[j>>2]|0)+108>>2]=r;r=(c[(Hx(k)|0)+8>>2]|0)+113|0;a[r]=a[r]|16}}while(0);y=c[53588]|0;do{if((y|0)==0){z=0}else{w=fw(k,y)|0;if((w|0)==0){z=0;break}if((a[w]|0)==0){z=0;break}m=Ja(w|0,e|0,10)|0;if((w|0)==(c[e>>2]|0)){z=0;break}z=(m|0)<0?0:m&255}}while(0);a[(c[j>>2]|0)+144|0]=z;Cc[c[c[(c[(c[j>>2]|0)+8>>2]|0)+4>>2]>>2]&255](b);i=d;return}function Zm(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0.0,V=0,W=0,X=0.0,Y=0,Z=0,_=0.0,$=0,aa=0,ba=0.0,ca=0,da=0,ea=0,fa=0.0,ga=0,ha=0,ia=0.0,ja=0,ka=0,la=0,ma=0,na=0.0,oa=0,pa=0,qa=0,ra=0.0,sa=0,ta=0,ua=0.0,va=0,wa=0,xa=0,ya=0.0,za=0,Aa=0,Ba=0;d=i;i=i+328|0;e=d|0;f=d+8|0;g=d+16|0;h=d+24|0;j=d+32|0;k=d+72|0;l=d+112|0;m=d+152|0;n=d+192|0;o=d+232|0;p=d+240|0;q=d+248|0;r=d+288|0;s=b;t=b+32|0;u=Hx(c[((c[s>>2]&3|0)==3?b:t)+28>>2]|0)|0;v=c[53790]|0;do{if((v|0)==0){w=0;x=0.0;y=0;z=0}else{A=b|0;B=fw(A,v)|0;if((B|0)==0){w=0;x=0.0;y=0;z=0;break}if((a[B]|0)==0){w=0;x=0.0;y=0;z=0;break}C=c[53796]|0;D=(b|0)==0;do{if((C|0)==0|D){E=14.0}else{F=fw(A,C)|0;if((F|0)==0){E=14.0;break}if((a[F]|0)==0){E=14.0;break}G=+sF(F,p);if((F|0)==(c[p>>2]|0)){E=14.0;break}E=G<1.0?1.0:G}}while(0);C=c[53798]|0;if((C|0)==0|D){H=154088;I=11}else{F=fw(A,C)|0;if((F|0)==0){I=12}else{H=F;I=11}}if((I|0)==11){if((a[H]|0)==0){I=12}else{J=H}}if((I|0)==12){J=154088}F=c[53800]|0;if((F|0)==0|D){K=150904;I=15}else{C=fw(A,F)|0;if((C|0)==0){I=16}else{K=C;I=15}}if((I|0)==15){if((a[K]|0)==0){I=16}else{L=K}}if((I|0)==16){L=150904}C=(gy(B)|0)!=0;F=ak(A,B,C?2:0,E,J,L)|0;C=b+8|0;c[(c[C>>2]|0)+96>>2]=F;F=(c[u+8>>2]|0)+113|0;a[F]=a[F]|1;F=c[53788]|0;if((F|0)==0|D){M=90984}else{M=fw(A,F)|0}F=Vm(M,0)|0;a[(c[C>>2]|0)+114|0]=F;w=1;x=E;y=J;z=L}}while(0);L=c[53748]|0;do{if((L|0)==0){N=x;O=y;P=z}else{J=b|0;M=fw(J,L)|0;if((M|0)==0){N=x;O=y;P=z;break}if((a[M]|0)==0){N=x;O=y;P=z;break}do{if((y|0)==0){K=c[53796]|0;H=(b|0)==0;do{if((K|0)==0|H){Q=14.0}else{p=fw(J,K)|0;if((p|0)==0){Q=14.0;break}if((a[p]|0)==0){Q=14.0;break}E=+sF(p,o);if((p|0)==(c[o>>2]|0)){Q=14.0;break}Q=E<1.0?1.0:E}}while(0);K=c[53798]|0;if((K|0)==0|H){R=154088;I=31}else{p=fw(J,K)|0;if((p|0)==0){I=32}else{R=p;I=31}}if((I|0)==31){if((a[R]|0)==0){I=32}else{S=R}}if((I|0)==32){S=154088}p=c[53800]|0;if((p|0)==0|H){T=150904;I=35}else{K=fw(J,p)|0;if((K|0)!=0){T=K;I=35}}if((I|0)==35){if((a[T]|0)!=0){U=Q;V=S;W=T;break}}U=Q;V=S;W=150904}else{U=x;V=y;W=z}}while(0);A=(gy(M)|0)!=0;D=ak(J,M,A?2:0,U,V,W)|0;c[(c[b+8>>2]|0)+108>>2]=D;D=(c[u+8>>2]|0)+113|0;a[D]=a[D]|32;N=U;O=V;P=W}}while(0);W=c[53792]|0;do{if((W|0)==0){X=0.0;Y=0;Z=0;_=N;$=O;aa=P}else{V=b|0;z=fw(V,W)|0;if((z|0)==0){X=0.0;Y=0;Z=0;_=N;$=O;aa=P;break}if((a[z]|0)==0){X=0.0;Y=0;Z=0;_=N;$=O;aa=P;break}do{if((O|0)==0){y=c[53796]|0;S=(b|0)==0;do{if((y|0)==0|S){ba=14.0}else{T=fw(V,y)|0;if((T|0)==0){ba=14.0;break}if((a[T]|0)==0){ba=14.0;break}U=+sF(T,h);if((T|0)==(c[h>>2]|0)){ba=14.0;break}ba=U<1.0?1.0:U}}while(0);y=c[53798]|0;if((y|0)==0|S){ca=154088;I=49}else{H=fw(V,y)|0;if((H|0)==0){I=50}else{ca=H;I=49}}if((I|0)==49){if((a[ca]|0)==0){I=50}else{da=ca}}if((I|0)==50){da=154088}H=c[53800]|0;if((H|0)==0|S){ea=150904;I=53}else{y=fw(V,H)|0;if((y|0)!=0){ea=y;I=53}}if((I|0)==53){if((a[ea]|0)!=0){fa=ba;ga=da;ha=ea;break}}fa=ba;ga=da;ha=150904}else{fa=N;ga=O;ha=P}}while(0);M=c[53778]|0;J=(b|0)==0;do{if((M|0)==0|J){ia=fa}else{y=fw(V,M)|0;if((y|0)==0){ia=fa;break}if((a[y]|0)==0){ia=fa;break}U=+sF(y,g);if((y|0)==(c[g>>2]|0)){ia=fa;break}ia=U<1.0?1.0:U}}while(0);M=c[53780]|0;if((M|0)==0|J){ja=ga}else{ja=fw(V,M)|0}if((ja|0)==0){I=64}else{if((a[ja]|0)==0){I=64}else{ka=ja}}if((I|0)==64){ka=ga}M=c[53782]|0;if((M|0)==0|J){la=ha}else{la=fw(V,M)|0}if((la|0)==0){I=69}else{if((a[la]|0)==0){I=69}else{ma=la}}if((I|0)==69){ma=ha}M=(gy(z)|0)!=0;y=ak(V,z,M?2:0,ia,ka,ma)|0;c[(c[b+8>>2]|0)+100>>2]=y;y=(c[u+8>>2]|0)+113|0;a[y]=a[y]|2;X=ia;Y=ka;Z=ma;_=fa;$=ga;aa=ha}}while(0);ha=c[53756]|0;ga=b|0;do{if((ha|0)!=0){ma=fw(ga,ha)|0;if((ma|0)==0){break}if((a[ma]|0)==0){break}do{if((Y|0)==0){do{if(($|0)==0){ka=c[53796]|0;la=(b|0)==0;do{if((ka|0)==0|la){na=14.0}else{ja=fw(ga,ka)|0;if((ja|0)==0){na=14.0;break}if((a[ja]|0)==0){na=14.0;break}fa=+sF(ja,f);if((ja|0)==(c[f>>2]|0)){na=14.0;break}na=fa<1.0?1.0:fa}}while(0);ka=c[53798]|0;if((ka|0)==0|la){oa=154088;I=83}else{ja=fw(ga,ka)|0;if((ja|0)==0){I=84}else{oa=ja;I=83}}if((I|0)==83){if((a[oa]|0)==0){I=84}else{pa=oa}}if((I|0)==84){pa=154088}ja=c[53800]|0;if((ja|0)==0|la){qa=150904;I=87}else{ka=fw(ga,ja)|0;if((ka|0)!=0){qa=ka;I=87}}if((I|0)==87){if((a[qa]|0)!=0){ra=na;sa=pa;ta=qa;break}}ra=na;sa=pa;ta=150904}else{ra=_;sa=$;ta=aa}}while(0);S=c[53778]|0;ka=(b|0)==0;do{if((S|0)==0|ka){ua=ra}else{ja=fw(ga,S)|0;if((ja|0)==0){ua=ra;break}if((a[ja]|0)==0){ua=ra;break}fa=+sF(ja,e);if((ja|0)==(c[e>>2]|0)){ua=ra;break}ua=fa<1.0?1.0:fa}}while(0);S=c[53780]|0;if((S|0)==0|ka){va=sa}else{va=fw(ga,S)|0}if((va|0)==0){I=98}else{if((a[va]|0)==0){I=98}else{wa=va}}if((I|0)==98){wa=sa}S=c[53782]|0;if((S|0)==0|ka){xa=ta}else{xa=fw(ga,S)|0}if((xa|0)!=0){if((a[xa]|0)!=0){ya=ua;za=wa;Aa=xa;break}}ya=ua;za=wa;Aa=ta}else{ya=X;za=Y;Aa=Z}}while(0);z=(gy(ma)|0)!=0;V=ak(ga,ma,z?2:0,ya,za,Aa)|0;c[(c[b+8>>2]|0)+104>>2]=V;V=(c[u+8>>2]|0)+113|0;a[V]=a[V]|4}}while(0);u=ew(ga,148040)|0;Aa=(u|0)!=0?u:213424;if((a[Aa]|0)!=0){a[(c[(c[((c[s>>2]&3|0)==3?b:t)+28>>2]|0)+8>>2]|0)+145|0]=1}u=b+8|0;za=c[u>>2]|0;Z=za+16|0;Y=c[((c[s>>2]&3|0)==3?b:t)+28>>2]|0;t=c[(c[(c[(c[Y+8>>2]|0)+8>>2]|0)+4>>2]|0)+8>>2]|0;ta=l|0;l=m;wa=n;do{if((Aa|0)==0){I=110}else{xa=gb(Aa|0,58)|0;if((xa|0)==0){I=110;break}a[xa]=0;Vc[t&63](m,Y,Aa,xa+1|0);c[ta>>2]=c[l>>2];c[ta+4>>2]=c[l+4>>2];c[ta+8>>2]=c[l+8>>2];c[ta+12>>2]=c[l+12>>2];c[ta+16>>2]=c[l+16>>2];c[ta+20>>2]=c[l+20>>2];c[ta+24>>2]=c[l+24>>2];c[ta+28>>2]=c[l+28>>2];c[ta+32>>2]=c[l+32>>2];a[xa]=58}}while(0);if((I|0)==110){Vc[t&63](n,Y,Aa,0);c[ta>>2]=c[wa>>2];c[ta+4>>2]=c[wa+4>>2];c[ta+8>>2]=c[wa+8>>2];c[ta+12>>2]=c[wa+12>>2];c[ta+16>>2]=c[wa+16>>2];c[ta+20>>2]=c[wa+20>>2];c[ta+24>>2]=c[wa+24>>2];c[ta+28>>2]=c[wa+28>>2];c[ta+32>>2]=c[wa+32>>2]}wa=q|0;c[wa>>2]=c[ta>>2];c[wa+4>>2]=c[ta+4>>2];c[wa+8>>2]=c[ta+8>>2];c[wa+12>>2]=c[ta+12>>2];c[wa+16>>2]=c[ta+16>>2];c[wa+20>>2]=c[ta+20>>2];c[wa+24>>2]=c[ta+24>>2];c[wa+28>>2]=c[ta+28>>2];c[wa+32>>2]=c[ta+32>>2];q=Z;c[q>>2]=c[wa>>2];c[q+4>>2]=c[wa+4>>2];c[q+8>>2]=c[wa+8>>2];c[q+12>>2]=c[wa+12>>2];c[q+16>>2]=c[wa+16>>2];c[q+20>>2]=c[wa+20>>2];c[q+24>>2]=c[wa+24>>2];c[q+28>>2]=c[wa+28>>2];c[q+32>>2]=c[wa+32>>2];c[za+52>>2]=Aa;Aa=c[53758]|0;do{if((Aa|0)!=0){za=fw(ga,Aa)|0;if((za|0)==0){break}if((a[za]|0)==0){break}if((Vm(za,0)|0)<<24>>24!=0){break}a[(c[u>>2]|0)+46|0]=0}}while(0);Aa=ew(ga,141944)|0;za=(Aa|0)!=0?Aa:213424;if((a[za]|0)==0){Ba=b-32|0}else{Aa=b-32|0;a[(c[(c[((c[s>>2]&3|0)==2?b:Aa)+28>>2]|0)+8>>2]|0)+145|0]=1;Ba=Aa}Aa=c[u>>2]|0;wa=Aa+56|0;q=c[((c[s>>2]&3|0)==2?b:Ba)+28>>2]|0;Ba=c[(c[(c[(c[q+8>>2]|0)+8>>2]|0)+4>>2]|0)+8>>2]|0;b=j;s=k;do{if((za|0)==0){I=122}else{Z=gb(za|0,58)|0;if((Z|0)==0){I=122;break}a[Z]=0;Vc[Ba&63](j,q,za,Z+1|0);c[ta>>2]=c[b>>2];c[ta+4>>2]=c[b+4>>2];c[ta+8>>2]=c[b+8>>2];c[ta+12>>2]=c[b+12>>2];c[ta+16>>2]=c[b+16>>2];c[ta+20>>2]=c[b+20>>2];c[ta+24>>2]=c[b+24>>2];c[ta+28>>2]=c[b+28>>2];c[ta+32>>2]=c[b+32>>2];a[Z]=58}}while(0);if((I|0)==122){Vc[Ba&63](k,q,za,0);c[ta>>2]=c[s>>2];c[ta+4>>2]=c[s+4>>2];c[ta+8>>2]=c[s+8>>2];c[ta+12>>2]=c[s+12>>2];c[ta+16>>2]=c[s+16>>2];c[ta+20>>2]=c[s+20>>2];c[ta+24>>2]=c[s+24>>2];c[ta+28>>2]=c[s+28>>2];c[ta+32>>2]=c[s+32>>2]}s=r|0;c[s>>2]=c[ta>>2];c[s+4>>2]=c[ta+4>>2];c[s+8>>2]=c[ta+8>>2];c[s+12>>2]=c[ta+12>>2];c[s+16>>2]=c[ta+16>>2];c[s+20>>2]=c[ta+20>>2];c[s+24>>2]=c[ta+24>>2];c[s+28>>2]=c[ta+28>>2];c[s+32>>2]=c[ta+32>>2];ta=wa;c[ta>>2]=c[s>>2];c[ta+4>>2]=c[s+4>>2];c[ta+8>>2]=c[s+8>>2];c[ta+12>>2]=c[s+12>>2];c[ta+16>>2]=c[s+16>>2];c[ta+20>>2]=c[s+20>>2];c[ta+24>>2]=c[s+24>>2];c[ta+28>>2]=c[s+28>>2];c[ta+32>>2]=c[s+32>>2];c[Aa+92>>2]=za;za=c[53794]|0;if((za|0)==0){i=d;return w|0}Aa=fw(ga,za)|0;if((Aa|0)==0){i=d;return w|0}if((a[Aa]|0)==0){i=d;return w|0}if((Vm(Aa,0)|0)<<24>>24!=0){i=d;return w|0}a[(c[u>>2]|0)+86|0]=0;i=d;return w|0}function _m(a,b){a=a|0;b=b|0;var e=0,f=0,g=0.0,i=0,j=0.0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;e=c[a+8>>2]|0;a=c[e+116>>2]|0;f=e+16|0;g=(c[k>>2]=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24,c[k+4>>2]=d[f+4|0]|d[f+5|0]<<8|d[f+6|0]<<16|d[f+7|0]<<24,+h[k>>3]);i=e+24|0;j=(c[k>>2]=d[i]|d[i+1|0]<<8|d[i+2|0]<<16|d[i+3|0]<<24,c[k+4>>2]=d[i+4|0]|d[i+5|0]<<8|d[i+6|0]<<16|d[i+7|0]<<24,+h[k>>3]);l=e+32|0;m=(c[k>>2]=d[l]|d[l+1|0]<<8|d[l+2|0]<<16|d[l+3|0]<<24,c[k+4>>2]=d[l+4|0]|d[l+5|0]<<8|d[l+6|0]<<16|d[l+7|0]<<24,+h[k>>3]);n=e+40|0;o=(c[k>>2]=d[n]|d[n+1|0]<<8|d[n+2|0]<<16|d[n+3|0]<<24,c[k+4>>2]=d[n+4|0]|d[n+5|0]<<8|d[n+6|0]<<16|d[n+7|0]<<24,+h[k>>3]);p=+h[b+56>>3];q=+h[b+64>>3];e=(a&1|0)==0;r=+h[b+24>>3];s=+h[b+32>>3];t=(e?r:s)*.5;u=p-t;v=p+t;t=(e?s:r)*.5;r=q-t;s=q+t;h[f>>3]=u<g?u:g;h[i>>3]=r<j?r:j;h[l>>3]=v>m?v:m;h[n>>3]=s>o?s:o;return}function $m(b){b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0.0;do{if((Lw(b)|0)==0){if((c[(c[b+8>>2]|0)+172>>2]|0)!=0){break}return}}while(0);d=ux(b)|0;e=b+8|0;if((d|0)==0){f=-2147483647.0;g=-2147483647.0;i=2147483647.0;j=2147483647.0}else{k=-2147483647.0;l=-2147483647.0;m=2147483647.0;n=2147483647.0;o=d;while(1){d=c[o+8>>2]|0;p=c[d+132>>2]|0;q=+h[p>>3]*72.0;r=+h[p+8>>3]*72.0;s=(+h[d+88>>3]+ +h[d+96>>3])*.5;t=+h[d+80>>3]*.5;u=q-s;v=r-t;w=q+s;s=r+t;t=n<u?n:u;u=m<v?m:v;v=l>w?l:w;w=k>s?k:s;p=c[d+108>>2]|0;do{if((p|0)==0){x=t;y=u;z=v;A=w}else{if((a[p+81|0]|0)==0){x=t;y=u;z=v;A=w;break}s=+h[p+56>>3];r=+h[p+64>>3];d=(c[(c[e>>2]|0)+116>>2]&1|0)==0;q=+h[p+24>>3];B=+h[p+32>>3];C=(d?q:B)*.5;D=s-C;E=s+C;C=D<t?D:t;D=E>v?E:v;E=(d?B:q)*.5;q=r-E;B=r+E;E=q<u?q:u;if(B<=w){x=C;y=E;z=D;A=w;break}x=C;y=E;z=D;A=B}}while(0);p=mw(b,o)|0;if((p|0)==0){F=A;G=z;H=y;I=x}else{w=A;u=z;v=y;t=x;d=p;while(1){p=c[d+8>>2]|0;J=c[p+8>>2]|0;do{if((J|0)==0){K=t;L=v;M=u;N=w}else{O=c[J+4>>2]|0;if((O|0)>0){P=c[J>>2]|0;B=w;D=u;E=v;C=t;Q=0;while(1){R=c[P+(Q*48|0)+4>>2]|0;if((R|0)>0){S=c[P+(Q*48|0)>>2]|0;q=B;r=D;s=E;T=C;U=0;while(1){V=+h[S+(U<<4)>>3];W=+h[S+(U<<4)+8>>3];X=T<V?T:V;Y=s<W?s:W;Z=r>V?r:V;V=q>W?q:W;_=U+1|0;if((_|0)<(R|0)){q=V;r=Z;s=Y;T=X;U=_}else{$=V;aa=Z;ba=Y;ca=X;break}}}else{$=B;aa=D;ba=E;ca=C}U=Q+1|0;if((U|0)<(O|0)){B=$;D=aa;E=ba;C=ca;Q=U}else{da=$;ea=aa;fa=ba;ga=ca;break}}}else{da=w;ea=u;fa=v;ga=t}Q=c[p+96>>2]|0;do{if((Q|0)==0){ha=ga;ia=fa;ja=ea;ka=da}else{if((a[Q+81|0]|0)==0){ha=ga;ia=fa;ja=ea;ka=da;break}C=+h[Q+56>>3];E=+h[Q+64>>3];O=(c[(c[e>>2]|0)+116>>2]&1|0)==0;D=+h[Q+24>>3];B=+h[Q+32>>3];T=(O?D:B)*.5;s=C-T;r=C+T;T=s<ga?s:ga;s=r>ea?r:ea;r=(O?B:D)*.5;D=E-r;B=E+r;r=D<fa?D:fa;if(B<=da){ha=T;ia=r;ja=s;ka=da;break}ha=T;ia=r;ja=s;ka=B}}while(0);Q=c[p+100>>2]|0;do{if((Q|0)==0){la=ha;ma=ia;na=ja;oa=ka}else{if((a[Q+81|0]|0)==0){la=ha;ma=ia;na=ja;oa=ka;break}B=+h[Q+56>>3];s=+h[Q+64>>3];O=(c[(c[e>>2]|0)+116>>2]&1|0)==0;r=+h[Q+24>>3];T=+h[Q+32>>3];D=(O?r:T)*.5;E=B-D;C=B+D;D=E<ha?E:ha;E=C>ja?C:ja;C=(O?T:r)*.5;r=s-C;T=s+C;C=r<ia?r:ia;if(T<=ka){la=D;ma=C;na=E;oa=ka;break}la=D;ma=C;na=E;oa=T}}while(0);Q=c[p+104>>2]|0;do{if((Q|0)==0){pa=la;qa=ma;ra=na;sa=oa}else{if((a[Q+81|0]|0)==0){pa=la;qa=ma;ra=na;sa=oa;break}T=+h[Q+56>>3];E=+h[Q+64>>3];O=(c[(c[e>>2]|0)+116>>2]&1|0)==0;C=+h[Q+24>>3];D=+h[Q+32>>3];r=(O?C:D)*.5;s=T-r;B=T+r;r=s<la?s:la;s=B>na?B:na;B=(O?D:C)*.5;C=E-B;D=E+B;B=C<ma?C:ma;if(D<=oa){pa=r;qa=B;ra=s;sa=oa;break}pa=r;qa=B;ra=s;sa=D}}while(0);Q=c[p+108>>2]|0;if((Q|0)==0){K=pa;L=qa;M=ra;N=sa;break}if((a[Q+81|0]|0)==0){K=pa;L=qa;M=ra;N=sa;break}D=+h[Q+56>>3];s=+h[Q+64>>3];O=(c[(c[e>>2]|0)+116>>2]&1|0)==0;B=+h[Q+24>>3];r=+h[Q+32>>3];C=(O?B:r)*.5;E=D-C;T=D+C;C=E<pa?E:pa;E=T>ra?T:ra;T=(O?r:B)*.5;B=s-T;r=s+T;T=B<qa?B:qa;if(r<=sa){K=C;L=T;M=E;N=sa;break}K=C;L=T;M=E;N=r}}while(0);p=ow(b,d)|0;if((p|0)==0){F=N;G=M;H=L;I=K;break}else{w=N;u=M;v=L;t=K;d=p}}}d=vx(b,o)|0;if((d|0)==0){f=F;g=G;i=H;j=I;break}else{k=F;l=G;m=H;n=I;o=d}}}o=c[e>>2]|0;e=c[o+172>>2]|0;if((e|0)<1){ta=f;ua=g;va=i;wa=j}else{b=c[o+176>>2]|0;I=f;f=g;g=i;i=j;d=1;while(1){p=c[(c[b+(d<<2)>>2]|0)+8>>2]|0;j=+h[p+16>>3];n=+h[p+24>>3];H=+h[p+32>>3];m=+h[p+40>>3];G=i<j?i:j;j=g<n?g:n;n=f>H?f:H;H=I>m?I:m;if((d|0)<(e|0)){I=H;f=n;g=j;i=G;d=d+1|0}else{ta=H;ua=n;va=j;wa=G;break}}}d=c[o+12>>2]|0;do{if((d|0)==0){xa=wa;ya=va;za=ua;Aa=ta}else{if((a[d+81|0]|0)==0){xa=wa;ya=va;za=ua;Aa=ta;break}i=+h[d+56>>3];g=+h[d+64>>3];e=(c[o+116>>2]&1|0)==0;f=+h[d+24>>3];I=+h[d+32>>3];G=(e?f:I)*.5;j=i-G;n=i+G;G=j<wa?j:wa;j=n>ua?n:ua;n=(e?I:f)*.5;f=g-n;I=g+n;n=f<va?f:va;if(I<=ta){xa=G;ya=n;za=j;Aa=ta;break}xa=G;ya=n;za=j;Aa=I}}while(0);h[o+16>>3]=xa;h[o+24>>3]=ya;h[o+32>>3]=za;h[o+40>>3]=Aa;return}function an(a){a=a|0;var b=0;if((c[a+48>>2]|0)==(a|0)){b=1;return b|0}b=(qm($w(a|0)|0,138824,7)|0)==0|0;return b|0}
-
-
-
-function bn(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;e=i;i=i+224|0;f=e|0;g=e+24|0;h=e+48|0;j=e+72|0;k=e+80|0;l=$g(10368,c[43330]|0)|0;xn(d,l);m=$g(20008,c[43330]|0)|0;n=ry(d,136240,1)|0;Wx(n|0,133528,272,1)|0;Iv(k,128,e+96|0);o=ux(d)|0;if((o|0)!=0){p=l|0;q=j;r=j|0;s=j+4|0;j=m|0;t=f;u=f+8|0;v=f+12|0;w=f+16|0;x=f+20|0;f=h;y=h+8|0;z=h+12|0;A=h+16|0;B=h+20|0;h=g;C=g+8|0;D=g+12|0;E=g+16|0;F=g+20|0;g=o;do{do{if((a[(c[g+8>>2]|0)+118|0]|0)==0){o=mw(d,g)|0;if((o|0)==0){break}else{G=o}do{o=G;H=c[o>>2]&3;I=G+32|0;J=c[((H|0)==3?G:I)+28>>2]|0;K=G-32|0;L=c[((H|0)==2?G:K)+28>>2]|0;do{if((a[(c[L+8>>2]|0)+118|0]|0)==0){H=J|0;do{if((Za($w(H)|0,138824,7)|0)==0){M=$w(H)|0;N=Hc[c[p>>2]&63](l,M,512)|0;if((N|0)==0){O=0;break}O=c[N+12>>2]|0}else{O=0}}while(0);N=L|0;do{if((Za($w(N)|0,138824,7)|0)==0){M=$w(N)|0;P=Hc[c[p>>2]&63](l,M,512)|0;if((P|0)==0){Q=0;break}Q=c[P+12>>2]|0}else{Q=0}}while(0);P=(O|0)!=0;M=(Q|0)==0;if(M&(P^1)){break}if((O|0)==(Q|0)){R=$w(H)|0;S=$w(H)|0;Fv(0,118504,(T=i,i=i+16|0,c[T>>2]=R,c[T+8>>2]=S,T)|0)|0;i=T;break}S=c[o>>2]&3;c[r>>2]=c[((S|0)==3?G:I)+28>>2];c[s>>2]=c[((S|0)==2?G:K)+28>>2];S=Hc[c[j>>2]&63](m,q,512)|0;if((S|0)!=0){R=c[S+16>>2]|0;U=c[S+20>>2]|0;S=uw(Hx(R|0)|0,R,U,0,1)|0;Wx(S,112056,176,1)|0;jw(G|0,S)|0;break}if(M){if((Rx(O,N)|0)==0){M=Bn(J,O,k,n)|0;S=uw(Hx(M|0)|0,M,L,0,1)|0;M=S|0;Wx(M,112056,176,1)|0;jw(G|0,M)|0;c[u>>2]=H;c[v>>2]=N;M=S;U=c[M>>2]&3;R=S+32|0;c[w>>2]=c[((U|0)==3?S:R)+28>>2];V=S-32|0;c[x>>2]=c[((U|0)==2?S:V)+28>>2];Hc[c[j>>2]&63](m,t,1)|0;c[u>>2]=N;c[v>>2]=H;U=c[M>>2]&3;c[w>>2]=c[((U|0)==2?S:V)+28>>2];c[x>>2]=c[((U|0)==3?S:R)+28>>2];Hc[c[j>>2]&63](m,t,1)|0;break}else{R=$w(N)|0;S=$w(O|0)|0;Fv(0,118128,(T=i,i=i+16|0,c[T>>2]=R,c[T+8>>2]=S,T)|0)|0;i=T;break}}if(!P){if((Rx(Q,H)|0)==0){P=Bn(L,Q,k,n)|0;S=uw(Hx(H)|0,J,P,0,1)|0;P=S|0;Wx(P,112056,176,1)|0;jw(G|0,P)|0;c[C>>2]=H;c[D>>2]=N;P=S;R=c[P>>2]&3;U=S+32|0;c[E>>2]=c[((R|0)==3?S:U)+28>>2];V=S-32|0;c[F>>2]=c[((R|0)==2?S:V)+28>>2];Hc[c[j>>2]&63](m,h,1)|0;c[C>>2]=N;c[D>>2]=H;R=c[P>>2]&3;c[E>>2]=c[((R|0)==2?S:V)+28>>2];c[F>>2]=c[((R|0)==3?S:U)+28>>2];Hc[c[j>>2]&63](m,h,1)|0;break}else{U=$w(H)|0;S=$w(Q|0)|0;Fv(0,118208,(T=i,i=i+16|0,c[T>>2]=U,c[T+8>>2]=S,T)|0)|0;i=T;break}}S=O|0;if((Rx(Q,S)|0)!=0){U=$w(S)|0;R=$w(Q|0)|0;Fv(0,118368,(T=i,i=i+16|0,c[T>>2]=U,c[T+8>>2]=R,T)|0)|0;i=T;break}R=Q|0;if((Rx(O,R)|0)==0){U=Bn(J,O,k,n)|0;V=Bn(L,Q,k,n)|0;P=uw(Hx(U|0)|0,U,V,0,1)|0;V=P|0;Wx(V,112056,176,1)|0;jw(G|0,V)|0;c[y>>2]=H;c[z>>2]=N;V=P;U=c[V>>2]&3;M=P+32|0;c[A>>2]=c[((U|0)==3?P:M)+28>>2];W=P-32|0;c[B>>2]=c[((U|0)==2?P:W)+28>>2];Hc[c[j>>2]&63](m,f,1)|0;c[y>>2]=N;c[z>>2]=H;U=c[V>>2]&3;c[A>>2]=c[((U|0)==2?P:W)+28>>2];c[B>>2]=c[((U|0)==3?P:M)+28>>2];Hc[c[j>>2]&63](m,f,1)|0;break}else{M=$w(R)|0;R=$w(S)|0;Fv(0,118288,(T=i,i=i+16|0,c[T>>2]=M,c[T+8>>2]=R,T)|0)|0;i=T;break}}}while(0);G=ow(d,G)|0;}while((G|0)!=0)}}while(0);g=vx(d,g)|0;}while((g|0)!=0)}Mv(k);Vg(m)|0;m=Lw(n)|0;k=ux(n)|0;if((k|0)!=0){g=k;while(1){k=vx(n,g)|0;Gx(d,g|0)|0;if((k|0)==0){break}else{g=k}}}Kw(n)|0;if((m|0)==0){X=Vg(l)|0;i=e;return m|0}n=(c[d+8>>2]|0)+128|0;b[n>>1]=b[n>>1]|1;X=Vg(l)|0;i=e;return m|0}function cn(a){a=a|0;var b=0;b=$g(10368,c[43330]|0)|0;xn(a,b);return b|0}function dn(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=ry(b,136240,1)|0;Wx(d|0,133528,272,1)|0;e=ux(b)|0;if((e|0)!=0){f=e;do{e=mw(b,f)|0;if((e|0)!=0){g=e;do{e=c[g>>2]&3;h=c[((e|0)==3?g:g+32|0)+28>>2]|0;i=c[((e|0)==2?g:g-32|0)+28>>2]|0;if((a[(c[h+8>>2]|0)+118|0]|0)==0){if((a[(c[i+8>>2]|0)+118|0]|0)!=0){j=5}}else{j=5}if((j|0)==5){j=0;e=An(h,d)|0;h=An(i,d)|0;i=uw(Hx(e|0)|0,e,h,0,1)|0;Wx(i,112056,176,1)|0;jw(g|0,i)|0}g=ow(b,g)|0;}while((g|0)!=0)}f=vx(b,f)|0;}while((f|0)!=0)}f=ux(d)|0;if((f|0)==0){k=Kw(d)|0;return}else{l=f}do{Gx(b,l|0)|0;l=vx(d,l)|0;}while((l|0)!=0);k=Kw(d)|0;return}function en(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=Wv(a,b,c,0)|0;if((e|0)!=0){f=e;return f|0}f=Wv(a,b,c,d)|0;return f|0}function fn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+24|0;f=e|0;g=e+8|0;h=gb(b|0,59)|0;j=d+4|0;k=c[j>>2]|0;l=d+8|0;if(k>>>0<(c[l>>2]|0)>>>0){m=k}else{Jv(d,1)|0;m=c[j>>2]|0}c[j>>2]=m+1;a[m]=38;if((h|0)==0){n=b;i=e;return n|0}m=h-b|0;if((m-2|0)>>>0>6>>>0){n=b;i=e;return n|0}k=g|0;DF(k|0,b|0,m|0)|0;a[g+m|0]=0;c[f>>2]=k;m=vb(f|0,26544,252,8,120)|0;if((m|0)==0){n=b;i=e;return n|0}nb(k|0,131392,(b=i,i=i+8|0,c[b>>2]=c[m+4>>2],b)|0)|0;i=b;b=c[j>>2]|0;if(b>>>0<(c[l>>2]|0)>>>0){o=b}else{Jv(d,1)|0;o=c[j>>2]|0}c[j>>2]=o+1;a[o]=35;Lv(d,k)|0;k=c[j>>2]|0;if(k>>>0<(c[l>>2]|0)>>>0){p=k}else{Jv(d,1)|0;p=c[j>>2]|0}c[j>>2]=p+1;a[p]=59;n=h+1|0;i=e;return n|0}function gn(a,b){a=a|0;b=b|0;return Ya(c[a>>2]|0,c[b>>2]|0)|0}function hn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;e=i;i=i+1056|0;f=e|0;g=e+8|0;h=e+16|0;c[g>>2]=b;if((c[44702]|0)!=(d|0)){c[44702]=d;a[23e3]=0}Iv(h,1024,e+32|0);j=b+1|0;c[g>>2]=j;k=a[b]|0;b=h+4|0;l=h+8|0;if(k<<24>>24!=0){m=f|0;n=f+1|0;f=d|0;d=k;k=j;do{a:do{if((d&255)>>>0<192>>>0){if(d<<24>>24!=38){o=d;break}j=jn(g)|0;if((j|0)==0){o=38;break}if(j>>>0<127>>>0){o=j&255;break}p=c[b>>2]|0;q=p>>>0>=(c[l>>2]|0)>>>0;if(j>>>0<2047>>>0){if(q){Jv(h,1)|0;r=c[b>>2]|0}else{r=p}c[b>>2]=r+1;a[r]=j>>>6|192;o=(j&63|128)&255;break}if(q){Jv(h,1)|0;s=c[b>>2]|0}else{s=p}c[b>>2]=s+1;a[s]=j>>>12|224;p=c[b>>2]|0;if(p>>>0<(c[l>>2]|0)>>>0){t=p}else{Jv(h,1)|0;t=c[b>>2]|0}c[b>>2]=t+1;a[t]=j>>>6&63|128;o=(j&63|128)&255}else{do{if((d&255)>>>0<224>>>0){u=1}else{if((d&255)>>>0<240>>>0){u=2;break}if((d&255)>>>0<248>>>0){u=3;break}if(!(a[23e3]|0)){j=$w(f)|0;Fv(0,128976,(v=i,i=i+8|0,c[v>>2]=j,v)|0)|0;i=v;a[23e3]=1}a[m]=d;a[n]=0;j=kn(m)|0;p=xF(j|0)|0;if((p|0)>1){q=j;w=p;while(1){x=w-1|0;y=c[b>>2]|0;if(y>>>0<(c[l>>2]|0)>>>0){z=y}else{Jv(h,1)|0;z=c[b>>2]|0}y=a[q]|0;c[b>>2]=z+1;a[z]=y;if((x|0)>1){q=q+1|0;w=x}else{break}}A=j+(p-1)|0}else{A=j}w=a[A]|0;eF(j);o=w;break a}}while(0);w=d;q=0;x=k;while(1){if((a[x]&-64)<<24>>24!=-128){break}y=c[b>>2]|0;if(y>>>0<(c[l>>2]|0)>>>0){B=y}else{Jv(h,1)|0;B=c[b>>2]|0}c[b>>2]=B+1;a[B]=w;y=x+1|0;c[g>>2]=y;C=a[x]|0;D=q+1|0;if((D|0)<(u|0)){w=C;q=D;x=y}else{o=C;break a}}if(!(a[23e3]|0)){x=$w(f)|0;Fv(0,125768,(v=i,i=i+16|0,c[v>>2]=u+1,c[v+8>>2]=x,v)|0)|0;i=v;a[23e3]=1}a[m]=w;a[n]=0;x=kn(m)|0;q=xF(x|0)|0;if((q|0)>1){C=x;y=q;while(1){D=y-1|0;E=c[b>>2]|0;if(E>>>0<(c[l>>2]|0)>>>0){F=E}else{Jv(h,1)|0;F=c[b>>2]|0}E=a[C]|0;c[b>>2]=F+1;a[F]=E;if((D|0)>1){C=C+1|0;y=D}else{break}}G=x+(q-1)|0}else{G=x}y=a[G]|0;eF(x);o=y}}while(0);y=c[b>>2]|0;if(y>>>0<(c[l>>2]|0)>>>0){H=y}else{Jv(h,1)|0;H=c[b>>2]|0}c[b>>2]=H+1;a[H]=o;y=c[g>>2]|0;k=y+1|0;c[g>>2]=k;d=a[y]|0;}while(d<<24>>24!=0)}d=c[b>>2]|0;if(d>>>0<(c[l>>2]|0)>>>0){I=d;a[I]=0;J=h|0;K=c[J>>2]|0;c[b>>2]=K;L=Lb(K|0)|0;Mv(h);i=e;return L|0}Jv(h,1)|0;I=c[b>>2]|0;a[I]=0;J=h|0;K=c[J>>2]|0;c[b>>2]=K;L=Lb(K|0)|0;Mv(h);i=e;return L|0}function jn(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=i;i=i+24|0;e=d|0;f=c[b>>2]|0;if((a[f]|0)!=35){g=d+8|0;c[e>>2]=g;h=g;g=0;while(1){j=a[f+g|0]|0;if((j<<24>>24|0)==59){k=17;break}else if((j<<24>>24|0)==0){l=0;m=f;k=20;break}a[h]=j;j=g+1|0;if((j|0)<8){h=h+1|0;g=j}else{l=0;m=f;k=20;break}}if((k|0)==17){a[h]=0;h=vb(e|0,26544,252,8,120)|0;if((h|0)==0){l=0;m=f;c[b>>2]=m;i=d;return l|0}l=c[h+4>>2]|0;m=f+(g+1)|0;c[b>>2]=m;i=d;return l|0}else if((k|0)==20){c[b>>2]=m;i=d;return l|0}}k=a[f+1|0]|0;a:do{if((k&-33)<<24>>24==88){g=2;h=0;while(1){e=a[f+g|0]|0;j=e&255;do{if((e-65&255)>>>0<6>>>0){n=j-55|0}else{if((e-97&255)>>>0<6>>>0){n=j-87|0;break}if((e-48&255)>>>0>=10>>>0){o=h;p=g;q=j;break a}n=j-48|0}}while(0);j=n+(h<<4)|0;e=g+1|0;if((e|0)<8){g=e;h=j}else{o=j;p=e;q=n;break}}}else{h=1;g=0;e=k;while(1){j=e&255;if((e-48&255)>>>0>=10>>>0){o=g;p=h;q=j;break a}r=(g*10|0)-48+j|0;s=h+1|0;if((s|0)>=8){o=r;p=s;q=j;break a}h=s;g=r;e=a[f+s|0]|0}}}while(0);if((q|0)!=59){l=0;m=f;c[b>>2]=m;i=d;return l|0}l=o;m=f+(p+1)|0;c[b>>2]=m;i=d;return l|0}function kn(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=i;i=i+1048|0;e=d|0;f=d+8|0;Iv(f,1024,d+24|0);c[e>>2]=b+1;g=a[b]|0;b=f+4|0;h=f+8|0;if(g<<24>>24!=0){j=g;do{if(j<<24>>24==38){g=jn(e)|0;k=(g|0)!=0?g:38}else{k=j&255}do{if(k>>>0<127>>>0){g=c[b>>2]|0;if(g>>>0<(c[h>>2]|0)>>>0){l=g}else{Jv(f,1)|0;l=c[b>>2]|0}c[b>>2]=l+1;a[l]=k}else{g=c[b>>2]|0;m=g>>>0>=(c[h>>2]|0)>>>0;if(k>>>0<2047>>>0){if(m){Jv(f,1)|0;n=c[b>>2]|0}else{n=g}c[b>>2]=n+1;a[n]=k>>>6|192;o=c[b>>2]|0;if(o>>>0<(c[h>>2]|0)>>>0){p=o}else{Jv(f,1)|0;p=c[b>>2]|0}c[b>>2]=p+1;a[p]=k&63|128;break}if(m){Jv(f,1)|0;q=c[b>>2]|0}else{q=g}c[b>>2]=q+1;a[q]=k>>>12|224;g=c[b>>2]|0;if(g>>>0<(c[h>>2]|0)>>>0){r=g}else{Jv(f,1)|0;r=c[b>>2]|0}c[b>>2]=r+1;a[r]=k>>>6&63|128;g=c[b>>2]|0;if(g>>>0<(c[h>>2]|0)>>>0){s=g}else{Jv(f,1)|0;s=c[b>>2]|0}c[b>>2]=s+1;a[s]=k&63|128}}while(0);g=c[e>>2]|0;c[e>>2]=g+1;j=a[g]|0;}while(j<<24>>24!=0)}j=c[b>>2]|0;if(j>>>0<(c[h>>2]|0)>>>0){t=j;a[t]=0;u=f|0;v=c[u>>2]|0;c[b>>2]=v;w=Lb(v|0)|0;Mv(f);i=d;return w|0}Jv(f,1)|0;t=c[b>>2]|0;a[t]=0;u=f|0;v=c[u>>2]|0;c[b>>2]=v;w=Lb(v|0)|0;Mv(f);i=d;return w|0}function ln(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+1040|0;e=d|0;Iv(e,1024,d+16|0);f=a[b]|0;g=e+4|0;h=e+8|0;if(f<<24>>24!=0){j=b;b=f;while(1){f=j+1|0;if((b&255)>>>0<127>>>0){k=c[g>>2]|0;if(k>>>0<(c[h>>2]|0)>>>0){l=k}else{Jv(e,1)|0;l=c[g>>2]|0}c[g>>2]=l+1;a[l]=b;m=f}else{k=a[f]&63|b<<6;f=c[g>>2]|0;if(f>>>0<(c[h>>2]|0)>>>0){n=f}else{Jv(e,1)|0;n=c[g>>2]|0}c[g>>2]=n+1;a[n]=k;m=j+2|0}k=a[m]|0;if(k<<24>>24==0){break}else{j=m;b=k}}}b=c[g>>2]|0;if(b>>>0<(c[h>>2]|0)>>>0){o=b;a[o]=0;p=e|0;q=c[p>>2]|0;c[g>>2]=q;r=Lb(q|0)|0;Mv(e);i=d;return r|0}Jv(e,1)|0;o=c[g>>2]|0;a[o]=0;p=e|0;q=c[p>>2]|0;c[g>>2]=q;r=Lb(q|0)|0;Mv(e);i=d;return r|0}function mn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0;d=i;i=i+24|0;e=b;b=i;i=i+32|0;tF(b,e,32)|0;e=d|0;f=d+8|0;g=+h[b+16>>3];j=c[a+8>>2]|0;if(g<+h[j+48>>3]){k=0;i=d;return k|0}l=+h[b>>3];if(+h[j+64>>3]<l){k=0;i=d;return k|0}m=+h[b+24>>3];if(m<+h[j+56>>3]){k=0;i=d;return k|0}n=+h[b+8>>3];if(+h[j+72>>3]<n){k=0;i=d;return k|0}o=+h[j+24>>3]-(m+n)*.5;h[f>>3]=+h[j+16>>3]-(g+l)*.5;h[f+8>>3]=o;c[e>>2]=a;c[e+4>>2]=0;k=Oc[c[(c[(c[j+8>>2]|0)+4>>2]|0)+12>>2]&255](e,f)|0;i=d;return k|0}function nn(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0,f=0.0,g=0.0,j=0.0,k=0;c=i;d=b;b=i;i=i+32|0;tF(b,d,32)|0;e=+h[a+24>>3]*.5;f=+h[a+32>>3]*.5;g=+h[a+56>>3];j=+h[a+64>>3];if(+h[b+16>>3]<g-e){k=0;i=c;return k|0}if(e+g<+h[b>>3]){k=0;i=c;return k|0}if(+h[b+24>>3]<j-f){k=0;i=c;return k|0}k=f+j>=+h[b+8>>3]|0;i=c;return k|0}function on(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0,ka=0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0;e=i;i=i+384|0;f=b;b=i;i=i+32|0;tF(b,f,32)|0;f=e|0;g=e+16|0;j=e+32|0;l=e+64|0;m=e+96|0;n=e+128|0;o=e+160|0;p=e+176|0;q=e+192|0;r=e+224|0;s=e+256|0;t=e+288|0;u=e+320|0;v=e+336|0;w=e+352|0;x=a+8|0;a=c[x>>2]|0;y=c[a+8>>2]|0;do{if((y|0)==0){z=a}else{if(+h[y+24>>3]<+h[b>>3]){z=a;break}if(+h[b+16>>3]<+h[y+8>>3]){z=a;break}if(+h[y+32>>3]<+h[b+8>>3]){z=a;break}if(+h[b+24>>3]<+h[y+16>>3]){z=a;break}A=y+4|0;if((c[A>>2]|0)<=0){z=a;break}B=y|0;C=w;D=b;E=u;F=v;G=w|0;H=w+8|0;I=w+16|0;J=w+24|0;K=f|0;L=f+8|0;M=g|0;N=g+8|0;O=j|0;P=l+16|0;Q=m+8|0;R=n+24|0;S=o|0;T=o+8|0;U=p|0;V=p+8|0;W=q|0;X=r+16|0;Y=s+8|0;Z=t+24|0;_=0;a:while(1){$=c[B>>2]|0;aa=$+(_*48|0)|0;ba=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24|0;aa=$+(_*48|0)+4|0;ca=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24|0;aa=$+(_*48|0)+8|0;da=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24|0;aa=$+(_*48|0)+12|0;ea=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24|0;aa=$+(_*48|0)+16|0;fa=(c[k>>2]=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24,c[k+4>>2]=d[aa+4|0]|d[aa+5|0]<<8|d[aa+6|0]<<16|d[aa+7|0]<<24,+h[k>>3]);aa=$+(_*48|0)+24|0;ga=(c[k>>2]=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24,c[k+4>>2]=d[aa+4|0]|d[aa+5|0]<<8|d[aa+6|0]<<16|d[aa+7|0]<<24,+h[k>>3]);aa=$+(_*48|0)+32|0;ha=(c[k>>2]=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24,c[k+4>>2]=d[aa+4|0]|d[aa+5|0]<<8|d[aa+6|0]<<16|d[aa+7|0]<<24,+h[k>>3]);aa=$+(_*48|0)+40|0;ia=(c[k>>2]=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24,c[k+4>>2]=d[aa+4|0]|d[aa+5|0]<<8|d[aa+6|0]<<16|d[aa+7|0]<<24,+h[k>>3]);tF(C|0,D|0,32)|0;if((ca|0)==0){ja=9;break}aa=ba;c[F>>2]=c[aa>>2];c[F+4>>2]=c[aa+4>>2];c[F+8>>2]=c[aa+8>>2];c[F+12>>2]=c[aa+12>>2];if((ca|0)>1){aa=1;do{$=ba+(aa<<4)|0;c[E>>2]=c[$>>2];c[E+4>>2]=c[$+4>>2];c[E+8>>2]=c[$+8>>2];c[E+12>>2]=c[$+12>>2];if((pi(u,v,w)|0)!=-1){ka=1;ja=31;break a}c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];aa=aa+1|0;}while((aa|0)<(ca|0))}do{if((da|0)!=0){la=+h[ba+8>>3];ma=+h[G>>3];na=+h[H>>3];oa=+h[I>>3];pa=+h[J>>3];h[S>>3]=+h[ba>>3];h[T>>3]=la;h[U>>3]=fa;h[V>>3]=ga;ph(q,p,o,1.0,da);if(oa<+h[W>>3]){break}ph(r,p,o,1.0,da);if(+h[X>>3]<ma){break}ph(s,p,o,1.0,da);if(pa<+h[Y>>3]){break}ph(t,p,o,1.0,da);if(+h[Z>>3]>=na){ka=1;ja=31;break a}}}while(0);do{if((ea|0)!=0){da=ca-1|0;ga=+h[ba+(da<<4)+8>>3];fa=+h[G>>3];na=+h[H>>3];pa=+h[I>>3];ma=+h[J>>3];h[K>>3]=+h[ba+(da<<4)>>3];h[L>>3]=ga;h[M>>3]=ha;h[N>>3]=ia;ph(j,g,f,1.0,ea);if(pa<+h[O>>3]){break}ph(l,g,f,1.0,ea);if(+h[P>>3]<fa){break}ph(m,g,f,1.0,ea);if(ma<+h[Q>>3]){break}ph(n,g,f,1.0,ea);if(+h[R>>3]>=na){ka=1;ja=31;break a}}}while(0);ea=_+1|0;if((ea|0)<(c[A>>2]|0)){_=ea}else{ja=24;break}}if((ja|0)==9){cc(110072,125704,1607,170152);return 0}else if((ja|0)==24){z=c[x>>2]|0;break}else if((ja|0)==31){i=e;return ka|0}}}while(0);ja=c[z+96>>2]|0;do{if((ja|0)!=0){ia=+h[ja+24>>3]*.5;ha=+h[ja+32>>3]*.5;na=+h[ja+56>>3];ma=+h[ja+64>>3];if(+h[b+16>>3]<na-ia){break}if(ia+na<+h[b>>3]){break}if(+h[b+24>>3]<ma-ha){break}if(ha+ma<+h[b+8>>3]){break}else{ka=1}i=e;return ka|0}}while(0);ka=0;i=e;return ka|0}function pn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;a:do{if((b|0)==0){f=d}else{g=a[b]|0;if(g<<24>>24==0){f=d;break}switch(g<<24>>24|0){case 121:case 89:{g=(pm(b+1|0,113648)|0)==0;h=g?10:0;j=16;break};case 116:case 84:{g=(pm(b+1|0,114392)|0)==0;h=g?10:0;j=16;break};case 111:case 79:{g=(pm(b+1|0,117616)|0)==0;h=g?8:0;j=16;break};case 108:case 76:{g=(pm(b+1|0,120032)|0)==0;h=g?2:0;j=16;break};case 102:case 70:{g=(pm(b+1|0,120800)|0)==0;h=g?2:0;j=16;break};case 110:case 78:{g=b+1|0;if((pm(g,119232)|0)==0){f=0;break a}if((pm(g,118568)|0)==0){f=2;break a}break};case 99:case 67:{g=b+1|0;if((pm(g,123448)|0)==0){f=4;break a}k=(pm(g,121632)|0)==0;h=k?12:0;j=16;break};case 112:case 80:{k=(pm(b+1|0,116696)|0)==0;h=k?6:0;j=16;break};case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:{f=10;break a;break};case 48:{f=2;break a;break};case 115:case 83:{k=(pm(b+1|0,115760)|0)==0;h=k?10:0;j=16;break};default:{}}if((j|0)==16){if((h|0)!=0){f=h;break}}Fv(0,113096,(k=i,i=i+8|0,c[k>>2]=b,k)|0)|0;i=k;f=d}}while(0);i=e;return f|0}function qn(d,f){d=d|0;f=f|0;var g=0,h=0;g=ew(d|0,112576)|0;do{if((g|0)==0){h=f}else{if((a[g]|0)==0){h=0;break}h=pn(g,f)|0}}while(0);f=(c[d+8>>2]|0)+128|0;b[f>>1]=e[f>>1]|h;return}function rn(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0.0,y=0.0;f=e&1;g=e&2;a:do{if((c|0)==2){i=+h[a>>3];j=+h[a+16>>3]-i;k=+h[a+8>>3];l=+h[a+24>>3]-k;m=k-l;n=i-j;o=k+l;p=i+j}else{j=+h[a>>3];i=+h[a+8>>3];if((c|0)>0){q=j;r=i;s=j;t=i;u=1;v=j;w=i}else{m=i;n=j;o=i;p=j;break}while(1){j=v<s?v:s;i=w<t?w:t;l=v>q?v:q;k=w>r?w:r;if((u|0)>=(c|0)){m=i;n=j;o=k;p=l;break a}x=+h[a+(u<<4)>>3];y=+h[a+(u<<4)+8>>3];q=l;r=k;s=j;t=i;u=u+1|0;v=x;w=y}}}while(0);w=n+(p-n)*.5;v=m+(o-m)*.5;if((f|0)==0){t=o-v;o=d;d=+W(o);s=+V(o);if((g|0)==0){h[b+8>>3]=t*d-v;h[b+24>>3]=-0.0-v-(v-m)*d}else{o=t*d;h[b+8>>3]=v-o;h[b+24>>3]=v+o}o=(p-w)*s;h[b>>3]=w-o;h[b+16>>3]=w+o;return}else{o=w-n;n=v-m;m=+T(o*o+n*n);if((g|0)==0){h[b+8>>3]=-0.0-v}else{h[b+8>>3]=v}h[b>>3]=w;h[b+16>>3]=m*.25;h[b+24>>3]=m;return}}function sn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=a+8|0;a=c[b>>2]|0;d=c[a+8>>2]|0;if((d|0)==0){e=a;f=e+8|0;c[f>>2]=0;return}a=c[d>>2]|0;if((c[d+4>>2]|0)>0){d=0;g=a;while(1){eF(c[g+(d*48|0)>>2]|0);h=d+1|0;i=c[(c[b>>2]|0)+8>>2]|0;j=c[i>>2]|0;if((h|0)<(c[i+4>>2]|0)){d=h;g=j}else{k=j;break}}}else{k=a}eF(k);eF(c[(c[b>>2]|0)+8>>2]|0);e=c[b>>2]|0;f=e+8|0;c[f>>2]=0;return}function tn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=a+8|0;eF(c[(c[b>>2]|0)+144>>2]|0);d=c[b>>2]|0;e=c[d+8>>2]|0;if((e|0)==0){f=d}else{d=c[e>>2]|0;if((c[e+4>>2]|0)>0){e=0;g=d;while(1){eF(c[g+(e*48|0)>>2]|0);h=e+1|0;i=c[(c[b>>2]|0)+8>>2]|0;j=c[i>>2]|0;if((h|0)<(c[i+4>>2]|0)){e=h;g=j}else{k=j;break}}}else{k=d}eF(k);eF(c[(c[b>>2]|0)+8>>2]|0);f=c[b>>2]|0}c[f+8>>2]=0;dk(c[(c[b>>2]|0)+96>>2]|0);dk(c[(c[b>>2]|0)+108>>2]|0);dk(c[(c[b>>2]|0)+100>>2]|0);dk(c[(c[b>>2]|0)+104>>2]|0);Xx(a|0,112056)|0;return}function un(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+8|0;d=c[b>>2]|0;e=c[d+132>>2]|0;if((e|0)==0){f=d}else{eF(e);f=c[b>>2]|0}e=c[f+8>>2]|0;if((e|0)==0){g=f}else{Cc[c[(c[e+4>>2]|0)+4>>2]&255](a);g=c[b>>2]|0}dk(c[g+104>>2]|0);dk(c[(c[b>>2]|0)+108>>2]|0);Xx(a|0,111456)|0;return}function vn(a,b){a=a|0;b=b|0;var d=0,e=0.0;d=a+8|0;a=c[d>>2]|0;if(b<<24>>24==0){e=+h[a+32>>3]*72.0*.5;h[a+96>>3]=e;h[(c[d>>2]|0)+88>>3]=e;b=c[d>>2]|0;h[b+80>>3]=+h[b+40>>3]*72.0;return}else{e=+h[a+40>>3]*72.0*.5;h[a+96>>3]=e;h[(c[d>>2]|0)+88>>3]=e;a=c[d>>2]|0;h[a+80>>3]=+h[a+32>>3]*72.0;return}}function wn(){return+(+(yb()|0)/2147483647.0)}function xn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+8|0;e=d|0;f=a+8|0;a=c[f>>2]|0;if((c[a+172>>2]|0)<1){i=d;return}g=b|0;h=e;j=1;k=a;while(1){a=c[(c[k+176>>2]|0)+(j<<2)>>2]|0;c[e>>2]=$w(a|0)|0;if((Hc[c[g>>2]&63](b,h,512)|0)==0){l=jk(16)|0;c[l+8>>2]=c[e>>2];c[l+12>>2]=a;Hc[c[g>>2]&63](b,l,1)|0}else{Fv(0,110752,(l=i,i=i+8|0,c[l>>2]=c[e>>2],l)|0)|0;i=l}xn(a,b);a=c[f>>2]|0;if((j|0)<(c[a+172>>2]|0)){j=j+1|0;k=a}else{break}}i=d;return}function yn(a,b){a=a|0;b=b|0;var d=0,e=0;d=Hc[c[a>>2]&63](a,b,512)|0;if((d|0)==0){e=0;return e|0}e=c[d+12>>2]|0;return e|0}function zn(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function An(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=b|0;f=Hx(e)|0;if((a[(c[b+8>>2]|0)+118|0]|0)==0){g=b;return g|0}zx(d,b,1)|0;b=gb($w(e)|0,58)|0;if((b|0)==0){cc(118576,125704,1203,170336);return 0}e=b+1|0;b=Ax(f,e,0)|0;if((b|0)!=0){g=b;return g|0}b=Ax(f,e,1)|0;e=b|0;Wx(e,111456,304,1)|0;d=Xv(f,1,0)|0;if((d|0)==0){g=b;return g|0}else{h=d}while(1){d=fw(e,h)|0;i=c[h+12>>2]|0;if((d|0)!=(i|0)){hw(e,h,i)|0}i=Xv(f,1,h)|0;if((i|0)==0){g=b;break}else{h=i}}return g|0}function Bn(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+104|0;Lv(e,118056)|0;h=g|0;j=c[45212]|0;c[45212]=j+1;nb(h|0,131392,(k=i,i=i+8|0,c[k>>2]=j,k)|0)|0;i=k;Lv(e,h)|0;h=e+4|0;k=c[h>>2]|0;j=e+8|0;if(k>>>0<(c[j>>2]|0)>>>0){l=k}else{Jv(e,1)|0;l=c[h>>2]|0}c[h>>2]=l+1;a[l]=58;l=d|0;Lv(e,$w(l)|0)|0;k=Ix(l)|0;l=c[h>>2]|0;if(l>>>0<(c[j>>2]|0)>>>0){m=l}else{Jv(e,1)|0;m=c[h>>2]|0}a[m]=0;m=c[e>>2]|0;c[h>>2]=m;h=Ax(k,m,1)|0;m=h|0;Wx(m,111456,304,1)|0;a[(c[h+8>>2]|0)+118|0]=1;zx(d,h,1)|0;zx(f,b,1)|0;b=Hx(m)|0;f=c[53614]|0;do{if((f|0)==0){d=Sx(m)|0;if((d|0)==2){n=Wv(b,2,117960,213424)|0;break}else if((d|0)==1){n=Wv(b,1,117960,213424)|0;break}else if((d|0)==0){n=Wv(b,0,117960,213424)|0;break}else{n=0;break}}else{n=f}}while(0);hw(m,n,213424)|0;c[53614]=n;n=Hx(m)|0;f=c[53582]|0;do{if((f|0)==0){b=Sx(m)|0;if((b|0)==2){o=Wv(n,2,117928,213424)|0;break}else if((b|0)==1){o=Wv(n,1,117928,213424)|0;break}else if((b|0)==0){o=Wv(n,0,117928,213424)|0;break}else{o=0;break}}else{o=f}}while(0);hw(m,o,117840)|0;c[53582]=o;o=Hx(m)|0;f=c[53590]|0;do{if((f|0)==0){n=Sx(m)|0;if((n|0)==1){p=Wv(o,1,117624,213424)|0;break}else if((n|0)==2){p=Wv(o,2,117624,213424)|0;break}else if((n|0)==0){p=Wv(o,0,117624,213424)|0;break}else{p=0;break}}else{p=f}}while(0);hw(m,p,117584)|0;c[53590]=p;i=g;return h|0}function Cn(a,b,d){a=a|0;b=b|0;d=d|0;d=jk(24)|0;c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];c[d+16>>2]=c[b+16>>2];c[d+20>>2]=c[b+20>>2];return d|0}function Dn(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function En(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=c[b>>2]|0;a=c[d>>2]|0;do{if(e>>>0<a>>>0){f=-1}else{if(e>>>0>a>>>0){f=1;break}g=c[b+4>>2]|0;h=c[d+4>>2]|0;if(g>>>0<h>>>0){f=-1;break}f=g>>>0>h>>>0|0}}while(0);return f|0}function Fn(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ka=0,La=0.0,Ma=0,Na=0,Oa=0,Pa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0;g=i;i=i+264|0;j=g|0;k=g+8|0;l=g+16|0;m=g+24|0;n=g+32|0;o=g+40|0;p=g+48|0;q=g+56|0;r=g+64|0;s=g+72|0;t=g+80|0;u=g+88|0;v=g+96|0;w=g+104|0;x=g+112|0;y=g+120|0;z=g+184|0;if((b|0)==0){A=f;i=g;return A|0}if((f|0)==0){B=fF(1,20)|0;c[B+4>>2]=e>>>0>80>>>0?e:80;C=B}else{C=f}f=C|0;B=c[f>>2]|0;e=c[C+4>>2]|0;if((B|0)==0){D=100;E=fF(100,e)|0}else{F=B+100|0;G=gF(c[C+8>>2]|0,da(F,e)|0)|0;vF(G+(da(e,B)|0)|0,0,e*100|0|0)|0;D=F;E=G}G=y;F=z|0;B=z+8|0;H=B;I=z+16|0;J=z+24|0;K=z+32|0;L=(d|0)==0;M=z+72|0;N=z;O=B;B=d+4|0;P=d+8|0;Q=y|0;R=y+8|0;S=z+8|0;T=d+24|0;U=z+8|0;V=d+40|0;W=d+20|0;X=d+12|0;Y=J;Z=z+40|0;_=d+16|0;$=z+16|0;z=d+28|0;aa=d+32|0;ba=d+36|0;ca=d+44|0;ea=D;D=b;b=E;a:while(1){E=D;while(1){fa=E+1|0;if((Qa(a[E]|0)|0)==0){break}else{E=fa}}b:do{switch(a[E]|0){case 76:{c[F>>2]=6;ga=Jn(fa,O)|0;if((ga|0)==0){ha=125;break a}if(L){ia=ga;break b}c[M>>2]=c[X>>2];ja=ga;ha=121;break};case 112:{c[F>>2]=3;ga=Jn(fa,O)|0;if((ga|0)==0){ha=125;break a}if(L){ia=ga;break b}c[M>>2]=c[B>>2];ja=ga;ha=121;break};case 99:{ga=Ja(fa|0,v|0,10)|0;ka=c[v>>2]|0;la=(ka|0)==(fa|0)?0:ka;if((la|0)==0|(ga|0)<1){ha=125;break a}else{ma=la}do{la=a[ma]|0;na=la<<24>>24==0;ma=ma+1|0}while(la<<24>>24!=45&(na^1));if(na){ha=125;break a}oa=fF(ga+1|0,1)|0;if((ga|0)>0){la=ga;ka=oa;pa=ma;while(1){qa=a[pa]|0;if(qa<<24>>24==0){ha=41;break a}ra=ka+1|0;a[ka]=qa;qa=la-1|0;sa=pa+1|0;if((qa|0)>0){la=qa;ka=ra;pa=sa}else{ta=ra;ua=sa;break}}}else{ta=oa;ua=ma}a[ta]=0;if((In(oa,y)|0)==0){ha=125;break a}if((c[Q>>2]|0)==0){c[F>>2]=9;c[S>>2]=c[R>>2];if(L){ia=ua;break b}c[M>>2]=c[T>>2];ia=ua;break b}else{c[F>>2]=14;tF(U|0,G|0,64)|0;if(L){ia=ua;break b}c[M>>2]=c[V>>2];ia=ua;break b}break};case 83:{c[F>>2]=11;pa=Ja(fa|0,m|0,10)|0;ka=c[m>>2]|0;la=(ka|0)==(fa|0)?0:ka;if((la|0)==0|(pa|0)<1){ha=125;break a}else{va=la}do{la=a[va]|0;wa=la<<24>>24==0;va=va+1|0}while(la<<24>>24!=45&(wa^1));if(wa){ha=125;break a}xa=fF(pa+1|0,1)|0;if((pa|0)>0){la=pa;ka=xa;ga=va;while(1){sa=a[ga]|0;if(sa<<24>>24==0){ha=102;break a}ra=ka+1|0;a[ka]=sa;sa=la-1|0;qa=ga+1|0;if((sa|0)>0){la=sa;ka=ra;ga=qa}else{ya=ra;za=qa;break}}}else{ya=xa;za=va}a[ya]=0;c[S>>2]=xa;if(L){ia=za;break b}c[M>>2]=c[aa>>2];ia=za;break};case 73:{c[F>>2]=12;h[H>>3]=+sF(fa,l);ga=c[l>>2]|0;if((ga|0)==(fa|0)){ha=125;break a}h[I>>3]=+sF(ga,l);ka=c[l>>2]|0;if((ga|0)==(ka|0)){ha=125;break a}h[J>>3]=+sF(ka,l);ga=c[l>>2]|0;if((ka|0)==(ga|0)){ha=125;break a}h[K>>3]=+sF(ga,l);ka=c[l>>2]|0;la=(ga|0)==(ka|0)?0:ka;if((la|0)==0){ha=125;break a}ka=Ja(la|0,k|0,10)|0;ga=c[k>>2]|0;pa=(ga|0)==(la|0)?0:ga;if((pa|0)==0|(ka|0)<1){ha=125;break a}else{Aa=pa}do{pa=a[Aa]|0;Ba=pa<<24>>24==0;Aa=Aa+1|0}while(pa<<24>>24!=45&(Ba^1));if(Ba){ha=125;break a}Ca=fF(ka+1|0,1)|0;if((ka|0)>0){pa=ka;ga=Ca;la=Aa;while(1){qa=a[la]|0;if(qa<<24>>24==0){ha=115;break a}ra=ga+1|0;a[ga]=qa;qa=pa-1|0;sa=la+1|0;if((qa|0)>0){pa=qa;ga=ra;la=sa}else{Da=ra;Ea=sa;break}}}else{Da=Ca;Ea=Aa}a[Da]=0;c[Z>>2]=Ca;if(L){ia=Ea;break b}c[M>>2]=c[ba>>2];ia=Ea;break};case 101:{c[F>>2]=1;h[H>>3]=+sF(fa,w);la=c[w>>2]|0;if((la|0)==(fa|0)){ha=125;break a}h[I>>3]=+sF(la,w);ga=c[w>>2]|0;if((la|0)==(ga|0)){ha=125;break a}h[J>>3]=+sF(ga,w);la=c[w>>2]|0;if((ga|0)==(la|0)){ha=125;break a}h[K>>3]=+sF(la,w);ga=c[w>>2]|0;pa=(la|0)==(ga|0)?0:ga;if((pa|0)==0){ha=125;break a}if(L){ia=pa;break b}c[M>>2]=c[d>>2];ja=pa;ha=121;break};case 67:{pa=Ja(fa|0,u|0,10)|0;ga=c[u>>2]|0;la=(ga|0)==(fa|0)?0:ga;if((la|0)==0|(pa|0)<1){ha=125;break a}else{Fa=la}do{la=a[Fa]|0;Ga=la<<24>>24==0;Fa=Fa+1|0}while(la<<24>>24!=45&(Ga^1));if(Ga){ha=125;break a}Ha=fF(pa+1|0,1)|0;if((pa|0)>0){la=pa;ga=Ha;ka=Fa;while(1){sa=a[ka]|0;if(sa<<24>>24==0){ha=54;break a}ra=ga+1|0;a[ga]=sa;sa=la-1|0;qa=ka+1|0;if((sa|0)>0){la=sa;ga=ra;ka=qa}else{Ia=ra;Ka=qa;break}}}else{Ia=Ha;Ka=Fa}a[Ia]=0;if((In(Ha,y)|0)==0){ha=125;break a}if((c[Q>>2]|0)==0){c[F>>2]=8;c[S>>2]=c[R>>2];if(L){ia=Ka;break b}c[M>>2]=c[W>>2];ia=Ka;break b}else{c[F>>2]=13;tF(U|0,G|0,64)|0;if(L){ia=Ka;break b}c[M>>2]=c[V>>2];ia=Ka;break b}break};case 70:{c[F>>2]=10;La=+sF(fa,o);ka=c[o>>2]|0;if((ka|0)==(fa|0)){ha=125;break a}h[H>>3]=La;if((ka|0)==0){ha=125;break a}ga=Ja(ka|0,n|0,10)|0;la=c[n>>2]|0;pa=(la|0)==(ka|0)?0:la;if((pa|0)==0|(ga|0)<1){ha=125;break a}else{Ma=pa}do{pa=a[Ma]|0;Na=pa<<24>>24==0;Ma=Ma+1|0}while(pa<<24>>24!=45&(Na^1));if(Na){ha=125;break a}Oa=fF(ga+1|0,1)|0;if((ga|0)>0){pa=ga;la=Oa;ka=Ma;while(1){qa=a[ka]|0;if(qa<<24>>24==0){ha=93;break a}ra=la+1|0;a[la]=qa;qa=pa-1|0;sa=ka+1|0;if((qa|0)>0){pa=qa;la=ra;ka=sa}else{Pa=ra;Ra=sa;break}}}else{Pa=Oa;Ra=Ma}a[Pa]=0;c[$>>2]=Oa;if(L){ia=Ra;break b}c[M>>2]=c[z>>2];ia=Ra;break};case 116:{c[F>>2]=15;c[S>>2]=Ja(fa|0,j|0,10)|0;ka=c[j>>2]|0;la=(ka|0)==(fa|0)?0:ka;if((la|0)==0){ha=125;break a}if(L){ia=la;break b}c[M>>2]=c[ca>>2];ja=la;ha=121;break};case 66:{c[F>>2]=5;la=Jn(fa,O)|0;if((la|0)==0){ha=125;break a}if(L){ia=la;break b}c[M>>2]=c[P>>2];ja=la;ha=121;break};case 80:{c[F>>2]=2;la=Jn(fa,O)|0;if((la|0)==0){ha=125;break a}if(L){ia=la;break b}c[M>>2]=c[B>>2];ja=la;ha=121;break};case 0:{break a;break};case 98:{c[F>>2]=4;la=Jn(fa,O)|0;if((la|0)==0){ha=125;break a}if(L){ia=la;break b}c[M>>2]=c[P>>2];ja=la;ha=121;break};case 84:{c[F>>2]=7;La=+sF(fa,t);la=c[t>>2]|0;if((la|0)==(fa|0)){ha=125;break a}h[H>>3]=La;if((la|0)==0){ha=125;break a}La=+sF(la,s);ka=c[s>>2]|0;if((ka|0)==(la|0)){ha=125;break a}h[I>>3]=La;if((ka|0)==0){ha=125;break a}la=Ja(ka|0,r|0,10)|0;pa=c[r>>2]|0;ga=(pa|0)==(ka|0)?0:pa;do{if((la|0)<0){c[Y>>2]=0}else{if((la|0)>0){c[Y>>2]=2;break}else{c[Y>>2]=1;break}}}while(0);if((ga|0)==0){ha=125;break a}La=+sF(ga,q);la=c[q>>2]|0;if((la|0)==(ga|0)){ha=125;break a}h[K>>3]=La;if((la|0)==0){ha=125;break a}pa=Ja(la|0,p|0,10)|0;ka=c[p>>2]|0;sa=(ka|0)==(la|0)?0:ka;if((sa|0)==0|(pa|0)<1){ha=125;break a}else{Sa=sa}do{sa=a[Sa]|0;Ta=sa<<24>>24==0;Sa=Sa+1|0}while(sa<<24>>24!=45&(Ta^1));if(Ta){ha=125;break a}Ua=fF(pa+1|0,1)|0;if((pa|0)>0){ga=pa;sa=Ua;ka=Sa;while(1){la=a[ka]|0;if(la<<24>>24==0){ha=82;break a}ra=sa+1|0;a[sa]=la;la=ga-1|0;qa=ka+1|0;if((la|0)>0){ga=la;sa=ra;ka=qa}else{Va=ra;Wa=qa;break}}}else{Va=Ua;Wa=Sa}a[Va]=0;c[Z>>2]=Ua;if(L){ia=Wa;break b}c[M>>2]=c[_>>2];ia=Wa;break};case 69:{c[F>>2]=0;h[H>>3]=+sF(fa,x);ka=c[x>>2]|0;if((ka|0)==(fa|0)){ha=125;break a}h[I>>3]=+sF(ka,x);sa=c[x>>2]|0;if((ka|0)==(sa|0)){ha=125;break a}h[J>>3]=+sF(sa,x);ka=c[x>>2]|0;if((sa|0)==(ka|0)){ha=125;break a}h[K>>3]=+sF(ka,x);sa=c[x>>2]|0;ga=(ka|0)==(sa|0)?0:sa;if((ga|0)==0){ha=125;break a}if(L){ia=ga;break b}c[M>>2]=c[d>>2];ja=ga;ha=121;break};default:{ha=125;break a}}}while(0);if((ha|0)==121){ha=0;if((ja|0)==0){break}else{ia=ja}}E=c[f>>2]|0;if((E|0)==(ea|0)){ga=ea<<1;sa=gF(b,da(ga,e)|0)|0;ka=da(ea,e)|0;vF(sa+ka|0,0,ka|0)|0;Xa=ga;Ya=sa;Za=c[f>>2]|0}else{Xa=ea;Ya=b;Za=E}tF(Ya+(da(Za,e)|0)|0,N|0,80)|0;c[f>>2]=(c[f>>2]|0)+1;ea=Xa;D=ia;b=Ya}if((ha|0)==41){eF(oa);ha=125}else if((ha|0)==54){eF(Ha);ha=125}else if((ha|0)==82){eF(Ua);ha=125}else if((ha|0)==93){eF(Oa);ha=125}else if((ha|0)==102){eF(xa);ha=125}else if((ha|0)==115){eF(Ca);ha=125}if((ha|0)==125){ha=C+16|0;c[ha>>2]=c[ha>>2]|1}ha=c[f>>2]|0;if((ha|0)==0){eF(b);eF(C);A=0;i=g;return A|0}else{c[C+8>>2]=gF(b,da(ha,e)|0)|0;A=C;i=g;return A|0}return 0}function Gn(a,b,c){a=a|0;b=b|0;c=c|0;return Fn(a,b,c,0)|0}function Hn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;b=c[a+12>>2]|0;if((a|0)==0){return}d=c[a+8>>2]|0;e=a|0;a:do{if((c[e>>2]|0)>0){f=a+4|0;g=(b|0)==0;h=0;while(1){i=da(c[f>>2]|0,h)|0;j=d+i|0;if(!g){Cc[b&255](j)}b:do{switch(c[j>>2]|0){case 13:case 14:{k=c[d+(i+8)>>2]|0;if((k|0)==1){l=d+(i+48)|0;m=d+(i+52)|0;n=c[m>>2]|0;if((c[l>>2]|0)>0){o=0;p=n;while(1){eF(c[p+(o<<3)+4>>2]|0);q=o+1|0;r=c[m>>2]|0;if((q|0)<(c[l>>2]|0)){o=q;p=r}else{s=r;break}}}else{s=n}eF(s);break b}else if((k|0)==2){p=d+(i+64)|0;o=d+(i+68)|0;l=c[o>>2]|0;if((c[p>>2]|0)>0){m=0;r=l;while(1){eF(c[r+(m<<3)+4>>2]|0);q=m+1|0;t=c[o>>2]|0;if((q|0)<(c[p>>2]|0)){m=q;r=t}else{u=t;break}}}else{u=l}eF(u);break b}else{break b}break};case 8:case 9:{eF(c[d+(i+8)>>2]|0);break};case 4:case 5:{eF(c[d+(i+12)>>2]|0);break};case 6:{eF(c[d+(i+12)>>2]|0);break};case 2:case 3:{eF(c[d+(i+12)>>2]|0);break};case 7:{eF(c[d+(i+40)>>2]|0);break};case 10:{eF(c[d+(i+16)>>2]|0);break};case 11:{eF(c[d+(i+8)>>2]|0);break};case 12:{eF(c[d+(i+40)>>2]|0);break};default:{}}}while(0);h=h+1|0;if((h|0)>=(c[e>>2]|0)){break a}}}}while(0);eF(d);eF(a);return}function In(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;e=i;i=i+128|0;f=e|0;j=e+8|0;k=e+16|0;l=e+24|0;m=e+32|0;n=e+40|0;o=e+48|0;p=e+56|0;q=e+64|0;r=e+72|0;s=e+80|0;t=e+88|0;u=e+96|0;v=e+104|0;w=e+112|0;x=e+120|0;y=a[b]|0;if((y|0)==91){z=b+1|0;c[d>>2]=1;A=d+8|0;B=A;C=+sF(z,x);D=c[x>>2]|0;if((D|0)==(z|0)){E=0;i=e;return E|0}h[A>>3]=C;if((D|0)==0){E=0;i=e;return E|0}C=+sF(D,w);A=c[w>>2]|0;if((A|0)==(D|0)){E=0;i=e;return E|0}h[d+16>>3]=C;if((A|0)==0){E=0;i=e;return E|0}C=+sF(A,v);D=c[v>>2]|0;if((D|0)==(A|0)){E=0;i=e;return E|0}h[d+24>>3]=C;if((D|0)==0){E=0;i=e;return E|0}C=+sF(D,u);A=c[u>>2]|0;if((A|0)==(D|0)){E=0;i=e;return E|0}h[d+32>>3]=C;if((A|0)==0){E=0;i=e;return E|0}D=d+40|0;u=Ja(A|0,t|0,10)|0;c[D>>2]=u;v=c[t>>2]|0;t=(v|0)==(A|0)?0:v;if((t|0)==0){E=0;i=e;return E|0}v=fF(u,8)|0;A=v;a:do{if((u|0)>0){w=t;x=0;b:while(1){C=+sF(w,s);F=c[s>>2]|0;if((F|0)==(w|0)|(F|0)==0){G=14;break}g[A+(x<<3)>>2]=C;H=A+(x<<3)+4|0;I=Ja(F|0,r|0,10)|0;J=c[r>>2]|0;K=(J|0)==(F|0)?0:J;if((K|0)==0|(I|0)<1){break}else{L=K}do{K=a[L]|0;M=K<<24>>24==0;L=L+1|0}while(K<<24>>24!=45&(M^1));if(M){break}N=fF(I+1|0,1)|0;if((I|0)>0){K=I;J=N;F=L;while(1){O=a[F]|0;if(O<<24>>24==0){G=21;break b}P=J+1|0;a[J]=O;O=K-1|0;Q=F+1|0;if((O|0)>0){K=O;J=P;F=Q}else{R=P;S=Q;break}}}else{R=N;S=L}a[R]=0;c[H>>2]=N;F=x+1|0;if((F|0)<(c[D>>2]|0)){w=S;x=F}else{break a}}if((G|0)==14){eF(v);E=0;i=e;return E|0}else if((G|0)==21){eF(N)}eF(v);E=0;i=e;return E|0}}while(0);c[B+36>>2]=A;E=z;i=e;return E|0}else if((y|0)==40){z=b+1|0;c[d>>2]=2;C=+sF(z,q);A=c[q>>2]|0;if((A|0)==(z|0)){E=0;i=e;return E|0}h[d+8>>3]=C;if((A|0)==0){E=0;i=e;return E|0}C=+sF(A,p);q=c[p>>2]|0;if((q|0)==(A|0)){E=0;i=e;return E|0}h[d+16>>3]=C;if((q|0)==0){E=0;i=e;return E|0}C=+sF(q,o);A=c[o>>2]|0;if((A|0)==(q|0)){E=0;i=e;return E|0}h[d+24>>3]=C;if((A|0)==0){E=0;i=e;return E|0}C=+sF(A,n);q=c[n>>2]|0;if((q|0)==(A|0)){E=0;i=e;return E|0}h[d+32>>3]=C;if((q|0)==0){E=0;i=e;return E|0}C=+sF(q,m);A=c[m>>2]|0;if((A|0)==(q|0)){E=0;i=e;return E|0}h[d+40>>3]=C;if((A|0)==0){E=0;i=e;return E|0}C=+sF(A,l);q=c[l>>2]|0;if((q|0)==(A|0)){E=0;i=e;return E|0}h[d+48>>3]=C;if((q|0)==0){E=0;i=e;return E|0}A=d+56|0;l=Ja(q|0,k|0,10)|0;c[A>>2]=l;m=c[k>>2]|0;k=(m|0)==(q|0)?0:m;if((k|0)==0){E=0;i=e;return E|0}m=fF(l,8)|0;q=m;c:do{if((l|0)>0){n=k;o=0;d:while(1){C=+sF(n,j);p=c[j>>2]|0;if((p|0)==(n|0)|(p|0)==0){G=41;break}g[q+(o<<3)>>2]=C;B=q+(o<<3)+4|0;v=Ja(p|0,f|0,10)|0;N=c[f>>2]|0;S=(N|0)==(p|0)?0:N;if((S|0)==0|(v|0)<1){break}else{T=S}do{S=a[T]|0;U=S<<24>>24==0;T=T+1|0}while(S<<24>>24!=45&(U^1));if(U){break}V=fF(v+1|0,1)|0;if((v|0)>0){H=v;S=V;N=T;while(1){p=a[N]|0;if(p<<24>>24==0){G=48;break d}D=S+1|0;a[S]=p;p=H-1|0;R=N+1|0;if((p|0)>0){H=p;S=D;N=R}else{W=D;X=R;break}}}else{W=V;X=T}a[W]=0;c[B>>2]=V;N=o+1|0;if((N|0)<(c[A>>2]|0)){n=X;o=N}else{break c}}if((G|0)==41){eF(m);E=0;i=e;return E|0}else if((G|0)==48){eF(V)}eF(m);E=0;i=e;return E|0}}while(0);c[d+60>>2]=q;E=z;i=e;return E|0}else if((y|0)==35|(y|0)==47){c[d>>2]=0;c[d+8>>2]=b;E=b;i=e;return E|0}else{if((tb(y|0)|0)==0){E=0;i=e;return E|0}c[d>>2]=0;c[d+8>>2]=b;E=b;i=e;return E|0}return 0}function Jn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=i;i=i+16|0;e=d|0;f=d+8|0;g=Ja(a|0,e|0,10)|0;j=c[e>>2]|0;e=(j|0)==(a|0)?0:j;if((e|0)==0){k=0;i=d;return k|0}j=fF(g,24)|0;a=j;l=b|0;c[l>>2]=g;a:do{if((g|0)>0){m=0;n=e;o=a;while(1){h[o>>3]=+sF(n,f);p=c[f>>2]|0;if((n|0)==(p|0)){q=4;break}h[o+8>>3]=+sF(p,f);r=c[f>>2]|0;if((p|0)==(r|0)){q=6;break}h[o+16>>3]=0.0;p=m+1|0;if((p|0)<(c[l>>2]|0)){m=p;n=r;o=o+24|0}else{s=r;break a}}if((q|0)==4){eF(j);k=0;i=d;return k|0}else if((q|0)==6){eF(j);k=0;i=d;return k|0}}else{s=e}}while(0);c[b+4>>2]=a;k=s;i=d;return k|0}function Kn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;Vo(a);b=a;d=c[b>>2]&3;e=a-32|0;f=a+32|0;g=So(c[((d|0)==2?a:e)+28>>2]|0,c[((d|0)==3?a:f)+28>>2]|0)|0;if((g|0)==0){d=c[b>>2]&3;Zo(c[((d|0)==2?a:e)+28>>2]|0,c[((d|0)==3?a:f)+28>>2]|0,a)|0;return}else{ep(a,g);return}}function Ln(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=b+8|0;b=c[d>>2]|0;e=b+204|0;if((c[e+4>>2]|0)>0){f=0;g=b;h=e}else{return}while(1){c[g+180>>2]=c[(c[h>>2]|0)+(f<<2)>>2];e=c[d>>2]|0;b=c[e+180>>2]|0;do{if((b|0)==0){i=e}else{j=b;do{k=j+8|0;a[(c[k>>2]|0)+157|0]=0;j=c[(c[k>>2]|0)+164>>2]|0;}while((j|0)!=0);j=c[d>>2]|0;k=c[j+180>>2]|0;if((k|0)==0){i=j;break}else{l=k}do{Mn(l);l=c[(c[l+8>>2]|0)+164>>2]|0;}while((l|0)!=0);i=c[d>>2]|0}}while(0);b=f+1|0;e=i+204|0;if((b|0)<(c[e+4>>2]|0)){f=b;g=i;h=e}else{break}}return}function Mn(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=b+8|0;b=(c[d>>2]|0)+157|0;if((a[b]|0)!=0){return}a[b]=1;a[(c[d>>2]|0)+158|0]=1;b=c[d>>2]|0;e=c[c[b+180>>2]>>2]|0;if((e|0)==0){f=b}else{b=0;g=e;while(1){e=g;h=g-32|0;i=c[((c[e>>2]&3|0)==2?g:h)+28>>2]|0;j=c[i+8>>2]|0;do{if((a[j+158|0]|0)==0){if((a[j+157|0]|0)!=0){k=b;break}Mn(i);k=b}else{Vo(g);l=c[e>>2]&3;m=g+32|0;n=So(c[((l|0)==2?g:h)+28>>2]|0,c[((l|0)==3?g:m)+28>>2]|0)|0;if((n|0)==0){l=c[e>>2]&3;Zo(c[((l|0)==2?g:h)+28>>2]|0,c[((l|0)==3?g:m)+28>>2]|0,g)|0}else{ep(g,n)}k=b-1|0}}while(0);h=k+1|0;e=c[d>>2]|0;i=c[(c[e+180>>2]|0)+(h<<2)>>2]|0;if((i|0)==0){f=e;break}else{b=h;g=i}}}a[f+158|0]=0;return}function Nn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;b=ux(a)|0;if((b|0)==0){d=0;return d|0}else{e=0;f=b}while(1){b=mw(a,f)|0;if((b|0)==0){g=e}else{h=e;i=b;while(1){b=c[i>>2]&3;j=c[(c[(c[((b|0)==2?i:i-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;k=c[(c[(c[((b|0)==3?i:i+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;if((j|0)==(k|0)){l=h}else{b=j-k|0;l=h-1+((b|0)>-1?b:-b|0)|0}b=ow(a,i)|0;if((b|0)==0){g=l;break}else{h=l;i=b}}}i=vx(a,f)|0;if((i|0)==0){d=g;break}else{e=g;f=i}}return d|0}function On(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=ux(b)|0;if((d|0)==0){return}else{e=d}do{d=e+8|0;f=(c[d>>2]|0)+172|0;if((c[f+4>>2]|0)>0){g=0;h=f;do{a[(c[(c[(c[h>>2]|0)+(g<<2)>>2]|0)+8>>2]|0)+112|0]=0;g=g+1|0;h=(c[d>>2]|0)+172|0;}while((g|0)<(c[h+4>>2]|0))}e=vx(b,e)|0;}while((e|0)!=0);return}function Pn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0.0,D=0.0,E=0,F=0.0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0.0,qa=0.0,ra=0.0,sa=0;e=i;f=c[d+24>>2]|0;c[44276]=kk((Lw(b)|0)*24|0)|0;c[44318]=0;g=ux(b)|0;if((g|0)!=0){j=g;do{c[(c[j+8>>2]|0)+120>>2]=-1;j=vx(b,j)|0;}while((j|0)!=0)}j=ux(b)|0;if((j|0)!=0){g=j;do{j=g+8|0;do{if((c[(c[j>>2]|0)+216>>2]|0)==0){k=jk(4)|0;c[(c[44276]|0)+((c[44318]|0)*24|0)>>2]=k;c[c[(c[44276]|0)+((c[44318]|0)*24|0)>>2]>>2]=g;c[(c[44276]|0)+((c[44318]|0)*24|0)+4>>2]=1;k=c[44318]|0;l=c[44276]|0;h[l+(k*24|0)+8>>3]=+h[(c[j>>2]|0)+32>>3];h[l+(k*24|0)+16>>3]=+h[(c[j>>2]|0)+40>>3];c[(c[j>>2]|0)+120>>2]=k;c[44318]=(c[44318]|0)+1}else{k=Lm(g)|0;l=k+8|0;m=c[l>>2]|0;n=c[m+120>>2]|0;if((n|0)>-1){p=(c[44276]|0)+(n*24|0)+4|0;q=c[p>>2]|0;c[p>>2]=q+1;c[(c[(c[44276]|0)+(n*24|0)>>2]|0)+(q<<2)>>2]=g;q=c[44276]|0;p=q+(n*24|0)+8|0;h[p>>3]=+h[(c[j>>2]|0)+32>>3]+ +h[p>>3];p=q+(n*24|0)+16|0;r=+h[p>>3];s=+h[(c[j>>2]|0)+40>>3];h[p>>3]=r<s?s:r;c[(c[j>>2]|0)+120>>2]=n;break}n=jk(c[m+216>>2]<<2)|0;c[(c[44276]|0)+((c[44318]|0)*24|0)>>2]=n;c[c[(c[44276]|0)+((c[44318]|0)*24|0)>>2]>>2]=k;n=c[44318]|0;m=c[44276]|0;if((k|0)==(g|0)){c[m+(n*24|0)+4>>2]=1;k=c[44318]|0;p=c[44276]|0;h[p+(k*24|0)+8>>3]=+h[(c[l>>2]|0)+32>>3];h[p+(k*24|0)+16>>3]=+h[(c[l>>2]|0)+40>>3];t=k}else{c[(c[m+(n*24|0)>>2]|0)+4>>2]=g;c[(c[44276]|0)+((c[44318]|0)*24|0)+4>>2]=2;n=c[44318]|0;m=c[44276]|0;h[m+(n*24|0)+8>>3]=+h[(c[l>>2]|0)+32>>3]+ +h[(c[j>>2]|0)+32>>3];r=+h[(c[l>>2]|0)+40>>3];s=+h[(c[j>>2]|0)+40>>3];h[m+(n*24|0)+16>>3]=r<s?s:r;t=n}c[(c[l>>2]|0)+120>>2]=t;c[(c[j>>2]|0)+120>>2]=c[44318];c[44318]=(c[44318]|0)+1}}while(0);g=vx(b,g)|0;}while((g|0)!=0)}g=(f|0)==-1;a:do{if((f|0)>0|g){t=b+8|0;j=d+8|0;l=d|0;n=g^1;m=c[o>>2]|0;k=0;r=1.7976931348623157e+308;while(1){p=ux(b)|0;if((p|0)!=0){q=p;do{c[(c[q+8>>2]|0)+232>>2]=0;q=vx(b,q)|0;}while((q|0)!=0)}Yp(b);Qn(b);q=c[44320]|0;p=c[t>>2]|0;s=+(da(c[p+240>>2]|0,q-1|0)|0);if((q|0)>0){u=c[44394]|0;v=c[p+236>>2]|0;w=0.0;x=s;p=0;while(1){y=+h[u+(p*40|0)+24>>3]+ +(da(c[u+(p*40|0)+16>>2]|0,v)|0);z=w<y?y:w;y=x+ +h[u+(p*40|0)+32>>3];A=p+1|0;if((A|0)<(q|0)){w=z;x=y;p=A}else{B=z;C=y;break}}}else{B=0.0;C=s}x=B/C;h[j>>3]=x;if((a[213992]|0)==0){D=x}else{gc(m|0,121560,(p=i,i=i+8|0,h[p>>3]=x,p)|0)|0;i=p;D=+h[j>>3]}if(D<=+h[l>>3]){break}if(!(r>D|n)){break}c[43750]=jk((Lw(b)|0)<<2)|0;if((Lw(b)|0)>0){p=0;do{c[(c[43750]|0)+(p<<2)>>2]=p;p=p+1|0;}while((p|0)<(Lw(b)|0))}Qn(b);p=c[43750]|0;Jb(p|0,Lw(b)|0,4,166);p=c[44320]|0;q=c[43750]|0;u=c[44394]|0;v=0;while(1){if((v|0)>=(p|0)){E=0;F=0.0;break}G=c[q+(v<<2)>>2]|0;H=v+1|0;if((c[u+(G*40|0)+12>>2]|0)<2){v=H}else{I=30;break}}do{if((I|0)==30){I=0;if((p|0)<=(H|0)){E=G;F=0.0;break}E=G;F=+h[u+((c[q+(H<<2)>>2]|0)*40|0)+24>>3]}}while(0);do{if((v|0)!=(p|0)){Jb(c[u+(E*40|0)+4>>2]|0,c[u+(E*40|0)+12>>2]|0,4,104);q=c[44394]|0;s=+h[q+(E*40|0)+24>>3];if(F>s*.25){if(F<s*3.0*.25){J=F}else{I=35}}else{I=35}if((I|0)==35){I=0;J=s*.5}A=c[q+(E*40|0)+12>>2]|0;if((A|0)>0){K=0.0;L=0;M=0;N=0;O=0;P=q}else{break}while(1){q=c[P+(E*40|0)+8>>2]|0;do{if((c[q+(O<<2)>>2]|0)==0){Q=c[(c[P+(E*40|0)+4>>2]|0)+(O<<2)>>2]|0;R=Q+8|0;s=+h[R>>3]*72.0;x=K>0.0?+(c[(c[t>>2]|0)+236>>2]|0):0.0;S=(L|0)==0;if(K+s+x<=J|S){T=N;U=S?Q:M;V=S?1:L;W=K+(s+x);X=P;break}S=M+4|0;Y=c[S>>2]|0;if((Y|0)>0){Z=Q+4|0;_=M|0;$=Q|0;Q=0;aa=c[Z>>2]|0;ba=Y;while(1){if((aa|0)>0){Y=0;do{a[(c[(Zo(c[(c[_>>2]|0)+(Q<<2)>>2]|0,c[(c[$>>2]|0)+(Y<<2)>>2]|0,0)|0)+8>>2]|0)+112|0]=1;Y=Y+1|0;ca=c[Z>>2]|0;}while((Y|0)<(ca|0));ea=ca;fa=c[S>>2]|0}else{ea=aa;fa=ba}Y=Q+1|0;if((Y|0)<(fa|0)){Q=Y;aa=ea;ba=fa}else{break}}ga=c[(c[44394]|0)+(E*40|0)+8>>2]|0}else{ga=q}c[ga+(O<<2)>>2]=1;ba=(c[44394]|0)+(E*40|0)+12|0;c[ba>>2]=(c[ba>>2]|0)-1;ba=(c[44394]|0)+(E*40|0)+16|0;c[ba>>2]=(c[ba>>2]|0)+1;ba=c[44394]|0;aa=ba+(E*40|0)+24|0;h[aa>>3]=+h[aa>>3]-(+h[R>>3]*72.0+ +(c[(c[t>>2]|0)+236>>2]|0));T=N;U=M;V=L;W=K;X=ba}else{T=N+1|0;U=M;V=L;W=K;X=P}}while(0);q=O+1|0;if((q|0)<(T+A|0)){K=W;L=V;M=U;N=T;O=q;P=X}else{break}}}}while(0);u=k+1|0;if((u|0)<(f|0)|g){k=u;r=D}else{break a}}t=d+20|0;c[d+16>>2]=c[t>>2];c[t>>2]=k}}while(0);Yp(b);Qn(b);g=c[44320]|0;if((g|0)>0){f=0;X=0;P=0;O=c[44394]|0;T=g;while(1){g=O+(P*40|0)|0;N=c[O+(P*40|0)+12>>2]|0;U=(X|0)==0;do{if((N|0)==0){if(U){ha=c[g>>2]|0}else{ha=f}ia=X+1|0;ja=ha;ka=O;la=T}else{if(U){ia=0;ja=f;ka=O;la=T;break}if((c[g>>2]|0)>(f|0)&(N|0)>0){ma=0;na=O}else{ia=X;ja=f;ka=O;la=T;break}while(1){M=c[(c[na+(P*40|0)+4>>2]|0)+(ma<<2)>>2]|0;V=M+4|0;if((c[V>>2]|0)>0){L=M|0;M=0;do{E=(c[(c[(c[L>>2]|0)+(M<<2)>>2]|0)+8>>2]|0)+232|0;c[E>>2]=(c[E>>2]|0)-X;M=M+1|0;}while((M|0)<(c[V>>2]|0));oa=c[44394]|0}else{oa=na}V=ma+1|0;if((V|0)<(c[oa+(P*40|0)+12>>2]|0)){ma=V;na=oa}else{break}}ia=X;ja=f;ka=oa;la=c[44320]|0}}while(0);N=P+1|0;if((N|0)<(la|0)){f=ja;X=ia;P=N;O=ka;T=la}else{break}}}Qn(b);la=c[44320]|0;T=c[b+8>>2]|0;D=+(da(c[T+240>>2]|0,la-1|0)|0);if((la|0)<=0){pa=0.0;qa=D;ra=pa/qa;sa=d+8|0;h[sa>>3]=ra;i=e;return}b=c[44394]|0;ka=c[T+236>>2]|0;W=0.0;K=D;T=0;while(1){D=+h[b+(T*40|0)+24>>3]+ +(da(c[b+(T*40|0)+16>>2]|0,ka)|0);J=W<D?D:W;D=K+ +h[b+(T*40|0)+32>>3];O=T+1|0;if((O|0)<(la|0)){W=J;K=D;T=O}else{pa=J;qa=D;break}}ra=pa/qa;sa=d+8|0;h[sa>>3]=ra;i=e;return}function Qn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0;c[44320]=0;b=c[44394]|0;if((b|0)!=0){if((c[44318]|0)>0){d=0;e=b;while(1){f=c[e+(d*40|0)+4>>2]|0;if((f|0)==0){g=e}else{eF(f);g=c[44394]|0}f=c[g+(d*40|0)+8>>2]|0;if((f|0)==0){i=g}else{eF(f);i=c[44394]|0}f=d+1|0;if((f|0)<(c[44318]|0)){d=f;e=i}else{j=i;break}}}else{j=b}eF(j)}c[44394]=jk((c[44318]|0)*40|0)|0;j=c[44318]|0;if((j|0)>0){b=0;i=j;while(1){j=jk(i<<2)|0;c[(c[44394]|0)+(b*40|0)+4>>2]=j;j=jk(c[44318]<<2)|0;c[(c[44394]|0)+(b*40|0)+8>>2]=j;c[(c[44394]|0)+(b*40|0)>>2]=b;c[(c[44394]|0)+(b*40|0)+12>>2]=0;c[(c[44394]|0)+(b*40|0)+16>>2]=0;j=b+1|0;vF((c[44394]|0)+(b*40|0)+24|0,0,16)|0;e=c[44318]|0;if((j|0)<(e|0)){b=j;i=e}else{break}}}i=ux(a)|0;if((i|0)!=0){b=i;do{i=mw(a,b)|0;if((i|0)!=0){e=i;do{i=e;j=c[i>>2]&3;d=(c[(c[(c[((j|0)==3?e:e+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)+1|0;g=e-32|0;if((d|0)<(c[(c[(c[((j|0)==2?e:g)+28>>2]|0)+8>>2]|0)+232>>2]|0)){j=d;do{d=(c[44394]|0)+(j*40|0)+16|0;c[d>>2]=(c[d>>2]|0)+1;j=j+1|0;}while((j|0)<(c[(c[(c[((c[i>>2]&3|0)==2?e:g)+28>>2]|0)+8>>2]|0)+232>>2]|0))}e=ow(a,e)|0;}while((e|0)!=0)}b=vx(a,b)|0;}while((b|0)!=0)}if((c[44318]|0)<=0){return}b=a+8|0;a=0;do{e=c[44276]|0;g=(c[c[e+(a*24|0)>>2]>>2]|0)+8|0;i=c[(c[g>>2]|0)+232>>2]|0;if((i|0)<(c[44320]|0)){k=i}else{c[44320]=i+1;k=c[(c[g>>2]|0)+232>>2]|0}i=c[44394]|0;j=i+(k*40|0)+24|0;l=+h[j>>3];h[j>>3]=l+(+h[e+(a*24|0)+8>>3]*72.0+(l>0.0?+(c[(c[b>>2]|0)+236>>2]|0):0.0));j=c[(c[g>>2]|0)+232>>2]|0;d=i+(j*40|0)+32|0;l=+h[e+(a*24|0)+16>>3]*72.0;if(+h[d>>3]<l){h[d>>3]=l;m=c[(c[g>>2]|0)+232>>2]|0}else{m=j}c[(c[i+(m*40|0)+4>>2]|0)+(c[i+(m*40|0)+12>>2]<<2)>>2]=e+(a*24|0);e=(c[44394]|0)+((c[(c[g>>2]|0)+232>>2]|0)*40|0)+12|0;c[e>>2]=(c[e>>2]|0)+1;a=a+1|0;}while((a|0)<(c[44318]|0));return}function Rn(a){a=a|0;var b=0,d=0;b=ux(a)|0;if((b|0)==0){return}else{d=b}do{c[(c[d+8>>2]|0)+216>>2]=0;d=vx(a,d)|0;}while((d|0)!=0);return}function Sn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d+8|0;c[e>>2]=5;f=ew(a|0,158384)|0;do{if((f|0)!=0){a=ac(f|0,128368,(g=i,i=i+16|0,c[g>>2]=d,c[g+8>>2]=e,g)|0)|0;i=g;if((a|0)<1){break}Fv(0,115472,(g=i,i=i+1|0,i=i+7&-8,c[g>>2]=0,g)|0)|0;i=g;c[b+24>>2]=0;c[b+32>>2]=0;i=d;return 0}}while(0);c[b+24>>2]=0;c[b+32>>2]=0;i=d;return 0}function Tn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=b;b=c[a>>2]|0;a=b+4|0;if((c[a>>2]|0)>0){e=b|0;b=0;f=0;while(1){g=c[(c[e>>2]|0)+(f<<2)>>2]|0;h=Hx(g|0)|0;i=mw(h,g)|0;if((i|0)==0){j=b}else{g=b;k=i;while(1){i=g+1|0;l=ow(h,k)|0;if((l|0)==0){j=i;break}else{g=i;k=l}}}k=f+1|0;if((k|0)<(c[a>>2]|0)){b=j;f=k}else{m=j;break}}}else{m=0}j=c[d>>2]|0;d=j+4|0;if((c[d>>2]|0)<=0){n=0;o=(n|0)<(m|0);p=o&1;q=(n|0)>(m|0);r=q&1;s=p-r|0;return s|0}f=j|0;j=0;b=0;while(1){a=c[(c[f>>2]|0)+(b<<2)>>2]|0;e=Hx(a|0)|0;k=mw(e,a)|0;if((k|0)==0){t=j}else{a=j;g=k;while(1){k=a+1|0;h=ow(e,g)|0;if((h|0)==0){t=k;break}else{a=k;g=h}}}g=b+1|0;if((g|0)<(c[d>>2]|0)){j=t;b=g}else{n=t;break}}o=(n|0)<(m|0);p=o&1;q=(n|0)>(m|0);r=q&1;s=p-r|0;return s|0}function Un(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0;d=c[44394]|0;e=+h[d+((c[b>>2]|0)*40|0)+24>>3];f=+h[d+((c[a>>2]|0)*40|0)+24>>3];return(e>f)-(e<f)|0}function Vn(b){b=b|0;var d=0,e=0,f=0;d=c[53812]|0;do{if((d|0)!=0){e=fw(b|0,d)|0;if((e|0)==0){break}if((a[e]|0)==0){break}if((Km(e)|0)<<24>>24==0){f=1}else{break}return f|0}}while(0);f=0;return f|0}function Wn(b){b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0;co(b);d=ux(b)|0;if((d|0)==0){return}else{f=d}do{d=mw(b,f)|0;if((d|0)!=0){g=d;do{d=g+8|0;a:do{if((c[(c[d>>2]|0)+172>>2]|0)==0){h=c[53812]|0;do{if((h|0)!=0){i=fw(g|0,h)|0;if((i|0)==0){break}if((a[i]|0)==0){break}if((Km(i)|0)<<24>>24==0){break a}}}while(0);h=g;i=g+32|0;j=Lm(c[((c[h>>2]&3|0)==3?g:i)+28>>2]|0)|0;k=g-32|0;l=Lm(c[((c[h>>2]&3|0)==2?g:k)+28>>2]|0)|0;if((j|0)==(l|0)){break}do{if((c[(c[j+8>>2]|0)+212>>2]|0)==0){if((c[(c[l+8>>2]|0)+212>>2]|0)!=0){break}m=So(j,l)|0;if((m|0)==0){Zo(j,l,g)|0;break a}else{ep(g,m);break a}}}while(0);l=c[h>>2]&3;j=c[((l|0)==3?g:i)+28>>2]|0;m=c[((l|0)==2?g:k)+28>>2]|0;l=c[j+8>>2]|0;n=c[l+212>>2]|0;if((n|0)==0){o=0}else{o=(c[l+232>>2]|0)-(c[(c[(c[(c[n+8>>2]|0)+252>>2]|0)+8>>2]|0)+232>>2]|0)|0}n=c[m+8>>2]|0;l=c[n+212>>2]|0;if((l|0)==0){p=0}else{p=(c[n+232>>2]|0)-(c[(c[(c[(c[l+8>>2]|0)+252>>2]|0)+8>>2]|0)+232>>2]|0)|0}l=(e[(c[d>>2]|0)+170>>1]|0)+(o-p)|0;if((l|0)>0){q=0.0;r=+(l|0)}else{q=+(-l|0);r=0.0}l=bp(b)|0;a[(c[l+8>>2]|0)+156|0]=2;n=Lm(j)|0;j=Lm(m)|0;m=Jp(l,n,q,(c[(c[d>>2]|0)+156>>2]|0)*10|0)|0;n=g;c[(c[(Jp(l,j,r,c[(c[d>>2]|0)+156>>2]|0)|0)+8>>2]|0)+116>>2]=n;c[(c[m+8>>2]|0)+116>>2]=n}}while(0);g=ow(b,g)|0;}while((g|0)!=0)}f=vx(b,f)|0;}while((f|0)!=0);return}function Xn(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0;g=c[d>>2]&3;i=c[(c[(c[((g|0)==3?d:d+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;j=c[(c[(c[((g|0)==2?d:d-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;g=(i|0)>(j|0)?i:j;j=d+8|0;d=(c[j>>2]|0)+172|0;if((c[d>>2]|0)!=0){cc(108464,148536,149,170280)}c[d>>2]=e;d=a+8|0;if((f|0)==0){f=e;while(1){a=f+8|0;i=(c[a>>2]|0)+154|0;b[i>>1]=(b[i>>1]|0)+(b[(c[j>>2]|0)+154>>1]|0);i=(c[a>>2]|0)+156|0;c[i>>2]=(c[i>>2]|0)+(c[(c[j>>2]|0)+156>>2]|0);i=f;a=f-32|0;k=(c[((c[i>>2]&3|0)==2?f:a)+28>>2]|0)+8|0;l=c[k>>2]|0;if((c[l+232>>2]|0)==(g|0)){m=8;break}n=+((c[(c[d>>2]|0)+236>>2]|0)/2|0|0);o=l+88|0;h[o>>3]=n+ +h[o>>3];o=(c[k>>2]|0)+96|0;h[o>>3]=n+ +h[o>>3];o=c[c[(c[(c[((c[i>>2]&3|0)==2?f:a)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;if((o|0)==0){m=8;break}else{f=o}}if((m|0)==8){return}}else{f=e;while(1){e=f+8|0;o=(c[e>>2]|0)+168|0;b[o>>1]=(b[o>>1]|0)+(b[(c[j>>2]|0)+168>>1]|0);o=(c[e>>2]|0)+154|0;b[o>>1]=(b[o>>1]|0)+(b[(c[j>>2]|0)+154>>1]|0);o=(c[e>>2]|0)+156|0;c[o>>2]=(c[o>>2]|0)+(c[(c[j>>2]|0)+156>>2]|0);o=f;e=f-32|0;a=(c[((c[o>>2]&3|0)==2?f:e)+28>>2]|0)+8|0;i=c[a>>2]|0;if((c[i+232>>2]|0)==(g|0)){m=8;break}n=+((c[(c[d>>2]|0)+236>>2]|0)/2|0|0);k=i+88|0;h[k>>3]=n+ +h[k>>3];k=(c[a>>2]|0)+96|0;h[k>>3]=n+ +h[k>>3];k=c[c[(c[(c[((c[o>>2]&3|0)==2?f:e)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;if((k|0)==0){m=8;break}else{f=k}}if((m|0)==8){return}}}function Yn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;do{if(!((a|0)==0|(b|0)==0)){d=c[a>>2]&3;e=c[b>>2]&3;if((c[((d|0)==3?a:a+32|0)+28>>2]|0)!=(c[((e|0)==3?b:b+32|0)+28>>2]|0)){break}if((c[((d|0)==2?a:a-32|0)+28>>2]|0)!=(c[((e|0)==2?b:b-32|0)+28>>2]|0)){break}if((c[(c[a+8>>2]|0)+96>>2]|0)!=(c[(c[b+8>>2]|0)+96>>2]|0)){break}if((Kp(a,b)|0)==0){break}else{f=1}return f|0}}while(0);f=0;return f|0}function Zn(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=b+8|0;c[(c[d>>2]|0)+180>>2]=0;c[(c[d>>2]|0)+220>>2]=0;co(b);e=c[d>>2]|0;if((c[e+172>>2]|0)>=1){f=1;g=e;while(1){eo(b,c[(c[g+176>>2]|0)+(f<<2)>>2]|0);e=c[d>>2]|0;if((f|0)<(c[e+172>>2]|0)){f=f+1|0;g=e}else{break}}}g=ux(b)|0;if((g|0)!=0){f=g;do{g=mw(b,f)|0;if((g|0)!=0){e=g;do{g=e;h=c[g>>2]|0;i=(c[(c[((h&3|0)==2?e:e-32|0)+28>>2]|0)+8>>2]|0)+160|0;j=a[i]|0;if(j<<24>>24<3){a[i]=j+1;k=c[g>>2]|0}else{k=h}h=(c[(c[((k&3|0)==3?e:e+32|0)+28>>2]|0)+8>>2]|0)+160|0;g=a[h]|0;if(g<<24>>24<3){a[h]=g+1}e=ow(b,e)|0;}while((e|0)!=0)}f=vx(b,f)|0;}while((f|0)!=0)}f=ux(b)|0;if((f|0)!=0){k=f;do{do{if((c[(c[k+8>>2]|0)+212>>2]|0)==0){if((k|0)!=(Lm(k)|0)){break}_o(b,k);f=(c[d>>2]|0)+220|0;c[f>>2]=(c[f>>2]|0)+1}}while(0);f=mw(b,k)|0;if((f|0)!=0){e=f;f=0;while(1){g=e+8|0;h=c[g>>2]|0;a:do{if((c[h+172>>2]|0)==0){j=e;i=c[j>>2]|0;l=i&3;m=e+32|0;n=c[((l|0)==3?e:m)+28>>2]|0;o=c[n+8>>2]|0;do{if((a[o+159|0]|0)!=7){p=e-32|0;q=c[((l|0)==2?e:p)+28>>2]|0;r=c[q+8>>2]|0;if((a[r+159|0]|0)==7){break}do{if((f|0)==0){s=i}else{t=c[f>>2]&3;if((n|0)!=(c[((t|0)==3?f:f+32|0)+28>>2]|0)){s=i;break}if((q|0)!=(c[((t|0)==2?f:f-32|0)+28>>2]|0)){s=i;break}if((c[o+232>>2]|0)==(c[r+232>>2]|0)){ep(e,f);Wo(e);u=f;break a}if((c[h+96>>2]|0)!=0){s=i;break}t=f+8|0;if((c[(c[t>>2]|0)+96>>2]|0)!=0){s=i;break}if((Kp(e,f)|0)==0){s=c[j>>2]|0;break}if((a[215376]|0)==0){Xn(b,e,c[(c[t>>2]|0)+172>>2]|0,1);Wo(e);u=f;break a}else{a[(c[g>>2]|0)+112|0]=6;u=f;break a}}}while(0);r=s&3;q=c[((r|0)==3?e:m)+28>>2]|0;if((q|0)==(c[((r|0)==2?e:p)+28>>2]|0)){Wo(e);u=e;break a}r=Lm(q)|0;q=Lm(c[((c[j>>2]&3|0)==2?e:p)+28>>2]|0)|0;t=c[j>>2]&3;if((c[((t|0)==3?e:m)+28>>2]|0)!=(r|0)){u=f;break a}if((c[((t|0)==2?e:p)+28>>2]|0)!=(q|0)){u=f;break a}t=c[(c[r+8>>2]|0)+232>>2]|0;v=c[(c[q+8>>2]|0)+232>>2]|0;if((t|0)==(v|0)){cp(b,e);u=e;break a}if((v|0)>(t|0)){_n(b,r,q,e);u=e;break a}t=uw(b,q,r,0,0)|0;do{if((t|0)!=0){r=c[t>>2]&3;q=c[((r|0)==2?t:t-32|0)+28>>2]|0;if((q|0)==(c[((c[j>>2]&3|0)==2?e:p)+28>>2]|0)){break}v=t+8|0;if((c[(c[v>>2]|0)+172>>2]|0)==0){_n(b,c[((r|0)==3?t:t+32|0)+28>>2]|0,q,t)}if((c[(c[g>>2]|0)+96>>2]|0)!=0){break}if((c[(c[v>>2]|0)+96>>2]|0)!=0){break}if((Kp(e,t)|0)==0){break}if((a[215376]|0)==0){Wo(e);Xn(b,e,c[(c[v>>2]|0)+172>>2]|0,1);u=f;break a}else{a[(c[g>>2]|0)+112|0]=6;a[(c[v>>2]|0)+153|0]=1;u=f;break a}}}while(0);t=c[j>>2]&3;_n(b,c[((t|0)==2?e:p)+28>>2]|0,c[((t|0)==3?e:m)+28>>2]|0,e);u=e;break a}}while(0);do{if((f|0)==0){w=i}else{o=c[f>>2]&3;if((c[((o|0)==3?f:f+32|0)+28>>2]|0)!=(n|0)){w=i;break}t=e-32|0;if((c[((o|0)==2?f:f-32|0)+28>>2]|0)!=(c[((l|0)==2?e:t)+28>>2]|0)){w=i;break}o=f+8|0;if((c[(c[o>>2]|0)+96>>2]|0)!=(c[h+96>>2]|0)){w=i;break}if((Kp(f,e)|0)==0){w=c[j>>2]|0;break}v=c[(c[o>>2]|0)+172>>2]|0;if((v|0)!=0){Xn(b,e,v,0);Wo(e);u=f;break a}v=c[j>>2]&3;if((c[(c[(c[((v|0)==3?e:m)+28>>2]|0)+8>>2]|0)+232>>2]|0)!=(c[(c[(c[((v|0)==2?e:t)+28>>2]|0)+8>>2]|0)+232>>2]|0)){u=f;break a}ep(e,f);Wo(e);u=f;break a}}while(0);i=c[((w&3|0)==3?e:m)+28>>2]|0;l=c[i+8>>2]|0;if((a[l+159|0]|0)==7){x=c[(c[(c[(c[l+212>>2]|0)+8>>2]|0)+256>>2]|0)+(c[l+232>>2]<<2)>>2]|0;y=w}else{l=Lm(i)|0;x=l;y=c[j>>2]|0}l=c[((y&3|0)==2?e:e-32|0)+28>>2]|0;i=c[l+8>>2]|0;if((a[i+159|0]|0)==7){z=c[(c[(c[(c[i+212>>2]|0)+8>>2]|0)+256>>2]|0)+(c[i+232>>2]<<2)>>2]|0}else{z=Lm(l)|0}l=(c[(c[x+8>>2]|0)+232>>2]|0)>(c[(c[z+8>>2]|0)+232>>2]|0);i=l?x:z;n=l?z:x;l=n+8|0;t=i+8|0;if((c[(c[l>>2]|0)+212>>2]|0)==(c[(c[t>>2]|0)+212>>2]|0)){u=e;break}v=So(n,i)|0;if((v|0)!=0){Xn(b,e,v,1);u=e;break}if((c[(c[l>>2]|0)+232>>2]|0)==(c[(c[t>>2]|0)+232>>2]|0)){u=e;break}_n(b,n,i,e);i=c[(c[g>>2]|0)+172>>2]|0;if((i|0)==0){u=e;break}n=i;while(1){i=n;l=n-32|0;if((c[(c[(c[((c[i>>2]&3|0)==2?n:l)+28>>2]|0)+8>>2]|0)+232>>2]|0)>(c[(c[t>>2]|0)+232>>2]|0)){u=e;break a}a[(c[n+8>>2]|0)+112|0]=5;v=c[c[(c[(c[((c[i>>2]&3|0)==2?n:l)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;if((v|0)==0){u=e;break}else{n=v}}}else{u=e}}while(0);g=ow(b,e)|0;if((g|0)==0){break}else{e=g;f=u}}}k=vx(b,k)|0;}while((k|0)!=0)}if((Ix(b|0)|0)==(b|0)){return}b=c[(c[d>>2]|0)+204>>2]|0;if((b|0)==0){A=kk(4)|0}else{A=mk(b,4)|0}c[(c[d>>2]|0)+204>>2]=A;A=c[d>>2]|0;c[c[A+204>>2]>>2]=c[A+180>>2];return}function _n(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0.0,u=0,v=0,w=0,x=0;g=f+8|0;i=c[g>>2]|0;if((c[i+96>>2]|0)==0){j=-1}else{j=((c[(c[e+8>>2]|0)+232>>2]|0)+(c[(c[d+8>>2]|0)+232>>2]|0)|0)/2|0}if((c[i+172>>2]|0)!=0){cc(121016,148536,90,170360)}i=c[(c[d+8>>2]|0)+232>>2]|0;k=e+8|0;l=c[(c[k>>2]|0)+232>>2]|0;if((i|0)>=(l|0)){cc(112216,148536,104,170360)}m=b|0;n=b+8|0;o=d;d=i;i=l;while(1){l=d+1|0;if((l|0)<(i|0)){do{if((l|0)==(j|0)){p=c[(c[g>>2]|0)+96>>2]|0;q=+h[p+24>>3];r=+h[p+32>>3];p=bp(b)|0;s=p+8|0;c[(c[s>>2]|0)+104>>2]=c[(c[g>>2]|0)+96>>2];t=+(c[(c[(Ix(Hx(p|0)|0)|0)+8>>2]|0)+236>>2]|0);h[(c[s>>2]|0)+88>>3]=t;if((a[(c[g>>2]|0)+114|0]|0)!=0){u=p;break}v=(c[(c[(Ix(m)|0)+8>>2]|0)+116>>2]&1|0)==0;w=(c[s>>2]|0)+80|0;if(v){h[w>>3]=r;h[(c[s>>2]|0)+96>>3]=q;u=p;break}else{h[w>>3]=q;h[(c[s>>2]|0)+96>>3]=r;u=p;break}}else{p=bp(b)|0;r=+((c[(c[n>>2]|0)+236>>2]|0)/2|0|0);s=p+8|0;w=(c[s>>2]|0)+88|0;h[w>>3]=r+ +h[w>>3];w=(c[s>>2]|0)+96|0;h[w>>3]=r+ +h[w>>3];u=p}}while(0);c[(c[u+8>>2]|0)+232>>2]=l;x=u}else{x=e}wp(Zo(o,x,f)|0);p=c[(c[k>>2]|0)+232>>2]|0;if((l|0)<(p|0)){o=x;d=l;i=p}else{break}}if((c[(c[g>>2]|0)+172>>2]|0)==0){cc(112216,148536,104,170360)}else{return}}function $n(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a|0;d=Ix(b)|0;e=ux(a)|0;if((e|0)==0){return}else{f=e}do{e=rw(Ix(b)|0,f)|0;if((e|0)!=0){g=0;h=e;while(1){e=sw(Ix(b)|0,h,f)|0;do{if((Rx(a,h|0)|0)==0){i=(c[h>>2]&3|0)==2?h:h-32|0;j=(Yn(g,i)|0)==0;k=c[i>>2]&3;l=c[((k|0)==3?i:i+32|0)+28>>2]|0;m=c[(c[l+8>>2]|0)+232>>2]|0;n=c[((k|0)==2?i:i-32|0)+28>>2]|0;k=c[(c[n+8>>2]|0)+232>>2]|0;o=(m|0)==(k|0);if(!j){if(o){p=g}else{p=0}c[(c[i+8>>2]|0)+172>>2]=p;j=c[(c[g+8>>2]|0)+172>>2]|0;if((j|0)==0){q=g;break}Xn(a,i,j,0);Xo(i);q=g;break}if(!o){if((k|0)>(m|0)){ao(l,n,i);q=i;break}else{ao(n,l,i);q=i;break}}m=To(l,n)|0;if((m|0)==0){cp(d,i);q=i;break}if((i|0)==(m|0)){q=g;break}Xo(i);if((c[(c[i+8>>2]|0)+172>>2]|0)!=0){q=g;break}ep(i,m);q=g}else{q=g}}while(0);if((e|0)==0){break}else{g=q;h=e}}}f=vx(a,f)|0;}while((f|0)!=0);return}function ao(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;g=c[d+8>>2]|0;i=c[g+212>>2]|0;do{if((i|0)==0){j=d}else{k=c[i+8>>2]|0;if((a[k+260|0]|0)!=0){j=d;break}j=c[(c[k+256>>2]|0)+(c[g+232>>2]<<2)>>2]|0}}while(0);g=c[e+8>>2]|0;i=c[g+212>>2]|0;do{if((i|0)==0){l=e;m=g}else{k=c[i+8>>2]|0;if((a[k+260|0]|0)!=0){l=e;m=g;break}n=c[(c[k+256>>2]|0)+(c[g+232>>2]<<2)>>2]|0;l=n;m=c[n+8>>2]|0}}while(0);g=(j|0)==(d|0)&(l|0)==(e|0)?1:5;e=f+8|0;d=(c[e>>2]|0)+172|0;i=c[d>>2]|0;n=i;k=j+8|0;o=c[(c[k>>2]|0)+232>>2]|0;p=l+8|0;q=c[m+232>>2]|0;if((o|0)>=(q|0)){cc(136680,132440,81,170296)}m=c[i>>2]&3;do{if((c[((m|0)==3?n:i+32|0)+28>>2]|0)==(j|0)){if((c[((m|0)==2?n:i-32|0)+28>>2]|0)!=(l|0)){break}return}}while(0);if((b[(c[i+8>>2]|0)+168>>1]|0)<=1){a:do{if((q-o|0)==1){i=So(j,l)|0;do{if((i|0)!=0){if((Kp(f,i)|0)==0){break}c[(c[e>>2]|0)+172>>2]=i;m=i+8|0;a[(c[m>>2]|0)+112|0]=g;r=(c[m>>2]|0)+168|0;b[r>>1]=(b[r>>1]|0)+1;if((a[(c[k>>2]|0)+156|0]|0)!=0){s=i;break a}if((a[(c[p>>2]|0)+156|0]|0)!=0){s=i;break a}Wo(f);s=i;break a}}while(0);c[(c[e>>2]|0)+172>>2]=0;i=Zo(j,l,f)|0;a[(c[i+8>>2]|0)+112|0]=g;s=i}else{s=n}}while(0);o=c[(c[p>>2]|0)+232>>2]|0;if((o-(c[(c[k>>2]|0)+232>>2]|0)|0)<=1){return}q=s;i=c[q>>2]|0;if((c[((i&3|0)==3?s:s+32|0)+28>>2]|0)==(j|0)){t=s;u=i;v=o}else{c[(c[e>>2]|0)+172>>2]=0;o=Zo(j,c[((c[q>>2]&3|0)==2?s:s-32|0)+28>>2]|0,f)|0;c[(c[e>>2]|0)+172>>2]=o;Vo(s);t=o;u=c[o>>2]|0;v=c[(c[p>>2]|0)+232>>2]|0}o=u&3;u=c[((o|0)==2?t:t-32|0)+28>>2]|0;s=c[u+8>>2]|0;if((c[s+232>>2]|0)==(v|0)){w=t;x=o;y=u}else{u=s;while(1){s=c[c[u+180>>2]>>2]|0;o=c[s>>2]&3;t=c[((o|0)==2?s:s-32|0)+28>>2]|0;e=c[t+8>>2]|0;if((c[e+232>>2]|0)==(v|0)){w=s;x=o;y=t;break}else{u=e}}}if((y|0)==(l|0)){return}a[(c[(Zo(c[((x|0)==3?w:w+32|0)+28>>2]|0,l,f)|0)+8>>2]|0)+112|0]=g;Vo(w);return}c[d>>2]=0;do{if(((c[(c[p>>2]|0)+232>>2]|0)-(c[(c[k>>2]|0)+232>>2]|0)|0)==1){d=So(j,l)|0;if((d|0)==0){break}if((Kp(f,d)|0)==0){break}ep(f,d);if((a[(c[k>>2]|0)+156|0]|0)!=0){return}if((a[(c[p>>2]|0)+156|0]|0)!=0){return}Wo(f);return}}while(0);d=c[(c[k>>2]|0)+232>>2]|0;k=c[(c[p>>2]|0)+232>>2]|0;if((d|0)>=(k|0)){return}w=j|0;x=g&255;g=n;n=d;d=j;j=k;while(1){if((n|0)<(j-1|0)){k=Hx(w)|0;y=g;u=g-32|0;v=(c[((c[y>>2]&3|0)==2?g:u)+28>>2]|0)+8|0;e=c[v>>2]|0;t=c[e+232>>2]|0;o=c[e+236>>2]|0;e=k+8|0;s=c[(c[e>>2]|0)+184>>2]|0;q=c[s+(t*44|0)+4>>2]|0;i=(c[s+(t*44|0)>>2]|0)-1|0;if((i|0)>(o|0)){s=i;do{i=c[q+(s<<2)>>2]|0;r=i+8|0;c[(c[r>>2]|0)+236>>2]=s+1;c[q+(c[(c[r>>2]|0)+236>>2]<<2)>>2]=i;s=s-1|0;}while((s|0)>(o|0))}s=o+1|0;if((s|0)<(o+2|0)){c[q+(s<<2)>>2]=0}s=(c[(c[e>>2]|0)+184>>2]|0)+(t*44|0)|0;c[s>>2]=(c[s>>2]|0)+1;s=bp(k)|0;i=s+8|0;h[(c[i>>2]|0)+88>>3]=+h[(c[v>>2]|0)+88>>3];h[(c[i>>2]|0)+96>>3]=+h[(c[v>>2]|0)+96>>3];c[(c[i>>2]|0)+232>>2]=c[(c[v>>2]|0)+232>>2];c[(c[i>>2]|0)+236>>2]=(c[(c[v>>2]|0)+236>>2]|0)+1;c[(c[(c[(c[e>>2]|0)+184>>2]|0)+(t*44|0)+4>>2]|0)+(c[(c[i>>2]|0)+236>>2]<<2)>>2]=s;z=s;A=y;B=u}else{z=l;A=g;B=g-32|0}a[(c[(Zo(d,z,f)|0)+8>>2]|0)+112|0]=x;s=(c[g+8>>2]|0)+168|0;b[s>>1]=(b[s>>1]|0)-1;s=n+1|0;i=c[(c[p>>2]|0)+232>>2]|0;if((s|0)<(i|0)){g=c[c[(c[(c[((c[A>>2]&3|0)==2?g:B)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;n=s;d=z;j=i}else{break}}return}function bo(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;Zn(d);e=d+8|0;c[(c[e>>2]|0)+208>>2]=1;f=c[e>>2]|0;c[c[f+204>>2]>>2]=c[f+180>>2];qp(d);sp(d,0);f=d|0;g=Ix(f)|0;h=c[e>>2]|0;i=b[h+224>>1]|0;if(i<<16>>16>0){j=g+8|0;a[(c[(c[j>>2]|0)+184>>2]|0)+(((i<<16>>16)-1|0)*44|0)+33|0]=0;k=c[e>>2]|0;l=k;m=b[k+224>>1]|0;n=j}else{l=h;m=i;n=g+8|0}i=m<<16>>16;if(m<<16>>16>(b[l+226>>1]|0)){o=i;p=l}else{m=i;i=l;while(1){l=c[(c[i+184>>2]|0)+(m*44|0)>>2]|0;h=c[(c[(c[(c[i+256>>2]|0)+(m<<2)>>2]|0)+8>>2]|0)+236>>2]|0;j=c[n>>2]|0;k=c[j+184>>2]|0;q=c[k+(m*44|0)+4>>2]|0;do{if((l|0)<1){r=h-l|0;s=r+1|0;t=c[k+(m*44|0)>>2]|0;if((s|0)<(t|0)){u=r;r=s;while(1){s=c[q+(r<<2)>>2]|0;v=s+8|0;c[(c[v>>2]|0)+236>>2]=u+l;c[q+(c[(c[v>>2]|0)+236>>2]<<2)>>2]=s;s=r+1|0;v=c[n>>2]|0;w=c[(c[v+184>>2]|0)+(m*44|0)>>2]|0;if((s|0)<(w|0)){u=r;r=s}else{x=v;y=w;break}}}else{x=j;y=t}r=l-1|0;u=y+r|0;if((u|0)<(y|0)){z=u}else{A=x;B=r;break}while(1){c[q+(z<<2)>>2]=0;u=z+1|0;w=c[n>>2]|0;if((u|0)<(c[(c[w+184>>2]|0)+(m*44|0)>>2]|0)){z=u}else{A=w;B=r;break}}}else{r=(c[k+(m*44|0)>>2]|0)-1|0;if((r|0)>(h|0)){t=l-1|0;w=r;do{r=c[q+(w<<2)>>2]|0;u=r+8|0;c[(c[u>>2]|0)+236>>2]=t+w;c[q+(c[(c[u>>2]|0)+236>>2]<<2)>>2]=r;w=w-1|0;}while((w|0)>(h|0))}w=h+1|0;if((w|0)<(h+l|0)){vF(q+(w<<2)|0,0,(l<<2)-4|0)|0}A=c[n>>2]|0;B=l-1|0}}while(0);l=(c[A+184>>2]|0)+(m*44|0)|0;c[l>>2]=(c[l>>2]|0)+B;l=c[(c[e>>2]|0)+184>>2]|0;if((c[l+(m*44|0)>>2]|0)>0){q=h;k=0;j=l;while(1){w=c[(c[j+(m*44|0)+4>>2]|0)+(k<<2)>>2]|0;c[(c[(c[(c[n>>2]|0)+184>>2]|0)+(m*44|0)+4>>2]|0)+(q<<2)>>2]=w;t=w+8|0;c[(c[t>>2]|0)+236>>2]=q;if((a[(c[t>>2]|0)+156|0]|0)==1){c[w+12>>2]=g}ap(d,w);_o(Ix(f)|0,w);w=(c[(Ix(f)|0)+8>>2]|0)+220|0;c[w>>2]=(c[w>>2]|0)+1;w=k+1|0;t=c[(c[e>>2]|0)+184>>2]|0;if((w|0)<(c[t+(m*44|0)>>2]|0)){q=q+1|0;k=w;j=t}else{C=t;break}}}else{C=l}c[C+(m*44|0)+4>>2]=(c[(c[(c[n>>2]|0)+184>>2]|0)+(m*44|0)+4>>2]|0)+(h<<2);a[(c[(c[n>>2]|0)+184>>2]|0)+(m*44|0)+33|0]=0;j=m+1|0;k=c[e>>2]|0;if((m|0)<(b[k+226>>1]|0)){m=j;i=k}else{o=j;p=k;break}}}i=c[n>>2]|0;if((o|0)<(b[i+226>>1]|0)){a[(c[i+184>>2]|0)+(o*44|0)+33|0]=0;D=c[e>>2]|0}else{D=p}a[D+260|0]=1;$n(d);d=c[e>>2]|0;D=b[d+224>>1]|0;if(D<<16>>16>(b[d+226>>1]|0)){return}p=D<<16>>16;D=d;while(1){d=c[(c[D+256>>2]|0)+(p<<2)>>2]|0;o=d+8|0;i=c[o>>2]|0;n=c[c[i+180>>2]>>2]|0;if((n|0)==0){E=i}else{i=n;while(1){Vo(i);n=c[o>>2]|0;m=c[c[n+180>>2]>>2]|0;if((m|0)==0){E=n;break}else{i=m}}}i=c[c[E+172>>2]>>2]|0;if((i|0)!=0){h=i;do{Vo(h);h=c[c[(c[o>>2]|0)+172>>2]>>2]|0;}while((h|0)!=0)}ap(Ix(f)|0,d);c[(c[(c[e>>2]|0)+256>>2]|0)+(p<<2)>>2]=0;h=c[e>>2]|0;if((p|0)<(b[h+226>>1]|0)){p=p+1|0;D=h}else{break}}return}function co(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;e=ux(b)|0;if((e|0)!=0){f=e;do{e=f+8|0;g=c[e>>2]|0;if((a[g+159|0]|0)==7){Nm(f);h=c[e>>2]|0}else{h=g}c[h+212>>2]=0;f=vx(b,f)|0;}while((f|0)!=0)}f=b+8|0;h=c[f>>2]|0;if((c[h+172>>2]|0)<1){i=d;return}g=b|0;b=1;e=h;while(1){h=c[(c[e+176>>2]|0)+(b<<2)>>2]|0;j=ux(h)|0;if((j|0)!=0){k=h+8|0;l=h;m=j;while(1){j=vx(h,m)|0;n=m+8|0;do{if((a[(c[n>>2]|0)+159|0]|0)==0){Om(m,c[(c[k>>2]|0)+252>>2]|0);c[(c[n>>2]|0)+212>>2]=l;a[(c[n>>2]|0)+159|0]=7;o=mw(h,m)|0;if((o|0)==0){break}else{p=o}do{o=c[(c[p+8>>2]|0)+172>>2]|0;a:do{if((o|0)!=0){q=o;do{r=q;s=q-32|0;t=c[(c[((c[r>>2]&3|0)==2?q:s)+28>>2]|0)+8>>2]|0;if((a[t+156|0]|0)!=1){break a}c[t+212>>2]=l;q=c[c[(c[(c[((c[r>>2]&3|0)==2?q:s)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;}while((q|0)!=0)}}while(0);p=ow(h,p)|0;}while((p|0)!=0)}else{o=m|0;q=$w(o)|0;s=$w(g)|0;Fv(0,86464,(r=i,i=i+16|0,c[r>>2]=q,c[r+8>>2]=s,r)|0)|0;i=r;Gx(h,o)|0}}while(0);if((j|0)==0){break}else{m=j}}}m=c[f>>2]|0;if((b|0)<(c[m+172>>2]|0)){b=b+1|0;e=m}else{break}}i=d;return}function eo(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=e+8|0;g=jk((b[(c[f>>2]|0)+226>>1]<<2)+8|0)|0;c[(c[f>>2]|0)+256>>2]=g;g=c[f>>2]|0;h=b[g+224>>1]|0;if(h<<16>>16<=(b[g+226>>1]|0)){g=e;i=h<<16>>16;h=0;while(1){j=bp(d)|0;c[(c[(c[f>>2]|0)+256>>2]|0)+(i<<2)>>2]=j;k=j+8|0;c[(c[k>>2]|0)+232>>2]=i;a[(c[k>>2]|0)+159|0]=7;c[(c[k>>2]|0)+212>>2]=g;if((h|0)!=0){k=(c[(Zo(h,j,0)|0)+8>>2]|0)+154|0;b[k>>1]=(b[k>>1]|0)*1e3}if((i|0)<(b[(c[f>>2]|0)+226>>1]|0)){i=i+1|0;h=j}else{break}}}h=ux(e)|0;if((h|0)!=0){i=h;do{h=(c[(c[(c[f>>2]|0)+256>>2]|0)+(c[(c[i+8>>2]|0)+232>>2]<<2)>>2]|0)+8|0;g=(c[h>>2]|0)+216|0;c[g>>2]=(c[g>>2]|0)+1;g=mw(e,i)|0;if((g|0)!=0){d=g;do{g=d;j=c[g>>2]&3;k=c[(c[(c[((j|0)==3?d:d+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;l=d-32|0;if((k|0)<(c[(c[(c[((j|0)==2?d:l)+28>>2]|0)+8>>2]|0)+232>>2]|0)){j=k;do{k=(c[(c[c[(c[h>>2]|0)+180>>2]>>2]|0)+8>>2]|0)+168|0;b[k>>1]=(b[k>>1]|0)+1;j=j+1|0;}while((j|0)<(c[(c[(c[((c[g>>2]&3|0)==2?d:l)+28>>2]|0)+8>>2]|0)+232>>2]|0))}d=ow(e,d)|0;}while((d|0)!=0)}i=vx(e,i)|0;}while((i|0)!=0)}i=c[f>>2]|0;e=b[i+224>>1]|0;if(e<<16>>16>(b[i+226>>1]|0)){return}d=e<<16>>16;e=i;while(1){i=(c[(c[(c[e+256>>2]|0)+(d<<2)>>2]|0)+8>>2]|0)+216|0;h=c[i>>2]|0;if((h|0)>1){c[i>>2]=h-1;m=c[f>>2]|0}else{m=e}if((d|0)<(b[m+226>>1]|0)){d=d+1|0;e=m}else{break}}return}function fo(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=(c[(c[e+8>>2]|0)+212>>2]|0)+8|0;e=c[h>>2]|0;i=e;j=f+1|0;if((a[i+261|0]|0)==(j|0)){return}k=b[e+224>>1]|0;l=b[i+226>>1]|0;if(k<<16>>16>l<<16>>16){m=k;n=e;o=l}else{l=k<<16>>16;k=e;while(1){rp(d,c[(c[k+256>>2]|0)+(l<<2)>>2]|0);p=c[h>>2]|0;q=b[p+226>>1]|0;if((l|0)<(q<<16>>16|0)){l=l+1|0;k=p}else{break}}m=b[p+224>>1]|0;n=p;o=q}if(m<<16>>16>o<<16>>16){r=n}else{o=m<<16>>16;m=n;while(1){tp(g,c[(c[m+256>>2]|0)+(o<<2)>>2]|0,f);n=c[h>>2]|0;q=n;if((o|0)<(b[q+226>>1]|0)){o=o+1|0;m=n}else{r=q;break}}}a[r+261|0]=j;return}function go(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=ux(b)|0;if((d|0)==0){ho(b);return}else{e=d}do{c[(c[e+8>>2]|0)+212>>2]=0;d=mw(b,e)|0;if((d|0)!=0){f=d;do{d=c[(c[f+8>>2]|0)+172>>2]|0;a:do{if((d|0)!=0){g=d;do{h=g;i=g-32|0;j=c[(c[((c[h>>2]&3|0)==2?g:i)+28>>2]|0)+8>>2]|0;if((a[j+156|0]|0)!=1){break a}c[j+212>>2]=0;g=c[c[(c[(c[((c[h>>2]&3|0)==2?g:i)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;}while((g|0)!=0)}}while(0);f=ow(b,f)|0;}while((f|0)!=0)}e=vx(b,e)|0;}while((e|0)!=0);ho(b);return}function ho(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=b+8|0;e=c[d>>2]|0;if((c[e+172>>2]|0)>=1){f=1;g=e;while(1){ho(c[(c[g+176>>2]|0)+(f<<2)>>2]|0);e=c[d>>2]|0;if((f|0)<(c[e+172>>2]|0)){f=f+1|0;g=e}else{break}}}g=ux(b)|0;if((g|0)==0){return}f=b;d=g;do{g=(c[d+8>>2]|0)+212|0;if((c[g>>2]|0)==0){c[g>>2]=f}g=mw(b,d)|0;if((g|0)!=0){e=g;do{g=c[(c[e+8>>2]|0)+172>>2]|0;a:do{if((g|0)!=0){h=g;do{i=h;j=c[i>>2]|0;k=h-32|0;l=c[(c[((j&3|0)==2?h:k)+28>>2]|0)+8>>2]|0;if((a[l+156|0]|0)!=1){break a}m=l+212|0;if((c[m>>2]|0)==0){c[m>>2]=f;n=c[i>>2]|0}else{n=j}h=c[c[(c[(c[((n&3|0)==2?h:k)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;}while((h|0)!=0)}}while(0);e=ow(b,e)|0;}while((e|0)!=0)}d=vx(b,d)|0;}while((d|0)!=0);return}function io(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0,da=0.0,ea=0.0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0;d=i;i=i+128|0;e=d|0;f=d+64|0;g=d+80|0;j=d+96|0;k=d+112|0;l=cn(b)|0;m=ux(b)|0;if((m|0)==0){n=Vg(l)|0;i=d;return}o=e;p=g;q=k;r=e|0;s=e+16|0;t=e+32|0;u=e+48|0;e=j|0;v=j+8|0;w=f|0;x=f+8|0;y=m;a:while(1){m=mw(b,y)|0;if((m|0)!=0){z=m;do{m=z|0;A=ew(m,145320)|0;do{if((A|0)==0){B=0}else{if((a[A]|0)==0){B=0;break}C=yn(l,A)|0;if((C|0)!=0){B=C;break}Fv(0,154736,(D=i,i=i+8|0,c[D>>2]=A,D)|0)|0;i=D;B=0}}while(0);A=ew(m,161760)|0;do{if((A|0)==0){E=13}else{if((a[A]|0)==0){E=13;break}C=yn(l,A)|0;if((C|0)==0){Fv(0,154736,(D=i,i=i+8|0,c[D>>2]=A,D)|0)|0;i=D;E=13;break}else{F=C;G=1;H=(B|0)==0;E=14;break}}}while(0);if((E|0)==13){E=0;if((B|0)!=0){F=0;G=0;H=0;E=14}}do{if((E|0)==14){E=0;A=z+8|0;C=c[(c[A>>2]|0)+8>>2]|0;if((C|0)==0){break}if((c[C+4>>2]|0)>1){I=z;J=$w(c[((c[I>>2]&3|0)==3?z:z+32|0)+28>>2]|0)|0;K=$w(c[((c[I>>2]&3|0)==2?z:z-32|0)+28>>2]|0)|0;Fv(0,130536,(D=i,i=i+16|0,c[D>>2]=J,c[D+8>>2]=K,D)|0)|0;i=D;break}K=c[C>>2]|0;C=c[K+4>>2]|0;J=z;I=c[J>>2]&3;L=z-32|0;M=c[((I|0)==2?z:L)+28>>2]|0;N=z+32|0;O=c[((I|0)==3?z:N)+28>>2]|0;I=kk(48)|0;P=I;Q=K+12|0;c[I+12>>2]=c[Q>>2];R=K+8|0;c[I+8>>2]=c[R>>2];b:do{if(H){E=41}else{S=c[B+8>>2]|0;T=S+16|0;U=T;V=c[M+8>>2]|0;W=+h[V+16>>3];X=+h[V+24>>3];Y=+h[T>>3];do{if(Y<=W){Z=+h[S+32>>3];if(Z<W){break}_=+h[S+24>>3];if(_>X){break}$=+h[S+40>>3];if($<X){break}T=K|0;V=c[T>>2]|0;aa=+h[V>>3];ba=+h[V+8>>3];if(!(Y>aa|Z<aa|_>ba|$<ba)){ca=c[O+8>>2]|0;da=+h[ca+16>>3];ea=+h[ca+24>>3];if(!(Y>da|Z<da|_>ea|$<ea)){ca=$w(c[((c[J>>2]&3|0)==3?z:N)+28>>2]|0)|0;fa=$w(c[((c[J>>2]&3|0)==2?z:L)+28>>2]|0)|0;ga=ew(m,145320)|0;Fv(0,108904,(D=i,i=i+24|0,c[D>>2]=ca,c[D+8>>2]=fa,c[D+16>>2]=ga,D)|0)|0;i=D;E=41;break b}if((c[R>>2]|0)==0){E=29;break a}ga=K+16|0;fa=K+24|0;jo(f,aa,ba,+h[ga>>3],+h[fa>>3],U);ba=+h[w>>3];aa=+h[x>>3];ca=c[T>>2]|0;h[ca+48>>3]=ba;h[ca+56>>3]=aa;ca=c[T>>2]|0;ea=(aa+ +h[fa>>3])*.5;h[ca+16>>3]=(ba+ +h[ga>>3])*.5;h[ca+24>>3]=ea;ca=c[T>>2]|0;ea=(+h[ca+24>>3]+ +h[fa>>3])*.5;h[ca>>3]=(+h[ca+16>>3]+ +h[ga>>3])*.5;h[ca+8>>3]=ea;ca=c[T>>2]|0;ea=(aa+ +h[ca+24>>3])*.5;h[ca+32>>3]=(ba+ +h[ca+16>>3])*.5;h[ca+40>>3]=ea;ca=c[Q>>2]|0;if((ca|0)==0){ha=3;break b}ha=(lh(z,c[T>>2]|0,0,0,P,ca)|0)+3|0;break b}ca=C-1|0;c:do{if((ca|0)>0){if((ko(V,U)|0)==0){ia=3}else{ja=0;break}while(1){if((ia|0)>=(ca|0)){ja=ia;break c}if((ko((c[T>>2]|0)+(ia<<4)|0,U)|0)==0){ia=ia+3|0}else{ja=ia;break}}}else{ja=0}}while(0);V=c[Q>>2]|0;ga=(V|0)!=0;if((ja|0)==(ca|0)){if(!ga){E=36;break a}fa=I+32|0;ka=c[T>>2]|0;jo(g,+h[K+32>>3],+h[K+40>>3],+h[ka+(ca<<4)>>3],+h[ka+(ca<<4)+8>>3],U);c[fa>>2]=c[p>>2];c[fa+4>>2]=c[p+4>>2];c[fa+8>>2]=c[p+8>>2];c[fa+12>>2]=c[p+12>>2];ha=ca;break b}if(ga){la=lh(z,c[T>>2]|0,0,ja,P,V)|0}else{la=ja}ha=la+3|0;break b}}while(0);U=$w(c[((c[J>>2]&3|0)==3?z:N)+28>>2]|0)|0;S=$w(c[((c[J>>2]&3|0)==2?z:L)+28>>2]|0)|0;V=ew(m,145320)|0;Fv(0,116216,(D=i,i=i+24|0,c[D>>2]=U,c[D+8>>2]=S,c[D+16>>2]=V,D)|0)|0;i=D;E=41}}while(0);do{if((E|0)==41){E=0;V=C-1|0;if((c[Q>>2]|0)==0){ha=V;break}S=I+32|0;U=K+32|0;c[S>>2]=c[U>>2];c[S+4>>2]=c[U+4>>2];c[S+8>>2]=c[U+8>>2];c[S+12>>2]=c[U+12>>2];ha=V}}while(0);d:do{if(G){C=c[F+8>>2]|0;V=C+16|0;U=V;S=c[O+8>>2]|0;Y=+h[S+16>>3];X=+h[S+24>>3];W=+h[V>>3];do{if(W<=Y){ea=+h[C+32>>3];if(ea<Y){break}ba=+h[C+24>>3];if(ba>X){break}aa=+h[C+40>>3];if(aa<X){break}V=K|0;S=c[V>>2]|0;$=+h[S+(ha<<4)>>3];_=+h[S+(ha<<4)+8>>3];if(!(W>$|ea<$|ba>_|aa<_)){ga=c[M+8>>2]|0;da=+h[ga+16>>3];Z=+h[ga+24>>3];if(!(W>da|ea<da|ba>Z|aa<Z)){ga=$w(c[((c[J>>2]&3|0)==3?z:N)+28>>2]|0)|0;fa=$w(c[((c[J>>2]&3|0)==2?z:L)+28>>2]|0)|0;ka=ew(m,161760)|0;Fv(0,81688,(D=i,i=i+24|0,c[D>>2]=ga,c[D+8>>2]=fa,c[D+16>>2]=ka,D)|0)|0;i=D;E=67;break d}if((c[Q>>2]|0)==0){E=54;break a}ka=I+32|0;fa=I+40|0;jo(j,$,_,+h[ka>>3],+h[fa>>3],U);_=+h[e>>3];$=+h[v>>3];ga=ha-3|0;ma=c[V>>2]|0;h[ma+(ga<<4)>>3]=_;h[ma+(ga<<4)+8>>3]=$;ma=ha-1|0;na=c[V>>2]|0;Z=($+ +h[fa>>3])*.5;h[na+(ma<<4)>>3]=(_+ +h[ka>>3])*.5;h[na+(ma<<4)+8>>3]=Z;na=c[V>>2]|0;Z=(+h[na+(ma<<4)+8>>3]+ +h[fa>>3])*.5;h[na+(ha<<4)>>3]=(+h[na+(ma<<4)>>3]+ +h[ka>>3])*.5;h[na+(ha<<4)+8>>3]=Z;na=ha-2|0;ka=c[V>>2]|0;Z=($+ +h[ka+(ma<<4)+8>>3])*.5;h[ka+(na<<4)>>3]=(_+ +h[ka+(ma<<4)>>3])*.5;h[ka+(na<<4)+8>>3]=Z;na=c[R>>2]|0;if((na|0)==0){oa=ga;break d}oa=nh(z,c[V>>2]|0,ga,ga,P,na)|0;break d}e:do{if((ha|0)>0){na=ha;ga=S;while(1){ka=ga+(na<<4)|0;c[o>>2]=c[ka>>2];c[o+4>>2]=c[ka+4>>2];c[o+8>>2]=c[ka+8>>2];c[o+12>>2]=c[ka+12>>2];pa=na-1|0;ka=(c[V>>2]|0)+(pa<<4)|0;c[s>>2]=c[ka>>2];c[s+4>>2]=c[ka+4>>2];c[s+8>>2]=c[ka+8>>2];c[s+12>>2]=c[ka+12>>2];qa=na-2|0;ka=(c[V>>2]|0)+(qa<<4)|0;c[t>>2]=c[ka>>2];c[t+4>>2]=c[ka+4>>2];c[t+8>>2]=c[ka+8>>2];c[t+12>>2]=c[ka+12>>2];ra=na-3|0;ka=(c[V>>2]|0)+(ra<<4)|0;c[u>>2]=c[ka>>2];c[u+4>>2]=c[ka+4>>2];c[u+8>>2]=c[ka+8>>2];c[u+12>>2]=c[ka+12>>2];if((ko(r,U)|0)!=0){break}if((ra|0)<=0){sa=ra;break e}na=ra;ga=c[V>>2]|0}ga=(c[V>>2]|0)+(na<<4)|0;c[ga>>2]=c[o>>2];c[ga+4>>2]=c[o+4>>2];c[ga+8>>2]=c[o+8>>2];c[ga+12>>2]=c[o+12>>2];ga=(c[V>>2]|0)+(pa<<4)|0;c[ga>>2]=c[s>>2];c[ga+4>>2]=c[s+4>>2];c[ga+8>>2]=c[s+8>>2];c[ga+12>>2]=c[s+12>>2];ga=(c[V>>2]|0)+(qa<<4)|0;c[ga>>2]=c[t>>2];c[ga+4>>2]=c[t+4>>2];c[ga+8>>2]=c[t+8>>2];c[ga+12>>2]=c[t+12>>2];ga=(c[V>>2]|0)+(ra<<4)|0;c[ga>>2]=c[u>>2];c[ga+4>>2]=c[u+4>>2];c[ga+8>>2]=c[u+8>>2];c[ga+12>>2]=c[u+12>>2];sa=na}else{sa=ha}}while(0);if((sa|0)==0){if((c[R>>2]|0)==0){E=63;break a}S=I+16|0;T=c[V>>2]|0;jo(k,+h[K+16>>3],+h[K+24>>3],+h[T>>3],+h[T+8>>3],U);c[S>>2]=c[q>>2];c[S+4>>2]=c[q+4>>2];c[S+8>>2]=c[q+8>>2];c[S+12>>2]=c[q+12>>2];oa=0;break d}else{S=sa-3|0;T=c[R>>2]|0;if((T|0)==0){oa=S;break d}oa=nh(z,c[V>>2]|0,S,ha-3|0,P,T)|0;break d}}}while(0);U=$w(c[((c[J>>2]&3|0)==3?z:N)+28>>2]|0)|0;C=$w(c[((c[J>>2]&3|0)==2?z:L)+28>>2]|0)|0;T=ew(m,161760)|0;Fv(0,86720,(D=i,i=i+24|0,c[D>>2]=U,c[D+8>>2]=C,c[D+16>>2]=T,D)|0)|0;i=D;E=67}else{E=67}}while(0);do{if((E|0)==67){E=0;if((c[R>>2]|0)==0){oa=0;break}L=I+16|0;J=K+16|0;c[L>>2]=c[J>>2];c[L+4>>2]=c[J+4>>2];c[L+8>>2]=c[J+8>>2];c[L+12>>2]=c[J+12>>2];oa=0}}while(0);R=ha-oa+1|0;J=I+4|0;c[J>>2]=R;L=kk(R<<4)|0;R=I;c[R>>2]=L;N=K|0;do{if((c[J>>2]|0)>0){Q=(c[N>>2]|0)+(oa<<4)|0;c[L>>2]=c[Q>>2];c[L+4>>2]=c[Q+4>>2];c[L+8>>2]=c[Q+8>>2];c[L+12>>2]=c[Q+12>>2];if((c[J>>2]|0)>1){ta=oa;ua=1}else{break}do{ta=ta+1|0;Q=(c[R>>2]|0)+(ua<<4)|0;M=(c[N>>2]|0)+(ta<<4)|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];ua=ua+1|0;}while((ua|0)<(c[J>>2]|0))}}while(0);eF(c[N>>2]|0);eF(K);c[c[(c[A>>2]|0)+8>>2]>>2]=P}}while(0);z=ow(b,z)|0;}while((z|0)!=0)}z=vx(b,y)|0;if((z|0)==0){E=75;break}else{y=z}}if((E|0)==29){cc(102800,97192,361,170424)}else if((E|0)==36){cc(91704,97192,379,170424)}else if((E|0)==54){cc(91704,97192,421,170424)}else if((E|0)==63){cc(102800,97192,444,170424)}else if((E|0)==75){n=Vg(l)|0;i=d;return}}function jo(a,b,d,e,f,g){a=a|0;b=+b;d=+d;e=+e;f=+f;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;j=i;i=i+416|0;k=j|0;l=j+104|0;m=j+208|0;n=j+312|0;o=+h[g>>3];p=+h[g+8>>3];q=+h[g+16>>3];r=+h[g+24>>3];do{if(o>e){s=+(~~((d-f)*(o-b)/(b-e))|0)+d;if(s<p|s>r){break}h[a>>3]=o;h[a+8>>3]=s;i=j;return}}while(0);do{if(q<e){s=+(~~((d-f)*(q-b)/(b-e))|0)+d;if(s<p|s>r){break}h[a>>3]=q;h[a+8>>3]=s;i=j;return}}while(0);do{if(p>f){s=+(~~((b-e)*(p-d)/(d-f))|0)+b;if(s<o|s>q){break}h[a>>3]=s;h[a+8>>3]=p;i=j;return}}while(0);do{if(r<f){s=+(~~((b-e)*(r-d)/(d-f))|0)+b;if(s<o|s>q){break}h[a>>3]=s;h[a+8>>3]=r;i=j;return}}while(0);j=k|0;nb(j|0,159736,(k=i,i=i+16|0,h[k>>3]=b,h[k+8>>3]=d,k)|0)|0;i=k;a=l|0;nb(a|0,159736,(k=i,i=i+16|0,h[k>>3]=e,h[k+8>>3]=f,k)|0)|0;i=k;l=m|0;nb(l|0,159736,(k=i,i=i+16|0,h[k>>3]=o,h[k+8>>3]=p,k)|0)|0;i=k;m=n|0;nb(m|0,159736,(k=i,i=i+16|0,h[k>>3]=q,h[k+8>>3]=r,k)|0)|0;i=k;Fv(1,167928,(k=i,i=i+32|0,c[k>>2]=j,c[k+8>>2]=a,c[k+16>>2]=l,c[k+24>>2]=m,k)|0)|0;i=k;cc(163768,97192,78,171e3)}function ko(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0;d=i;i=i+128|0;e=d|0;f=e|0;g=e;j=a;c[g>>2]=c[j>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];j=e+16|0;g=a+16|0;c[j>>2]=c[g>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[j+12>>2]=c[g+12>>2];g=e+32|0;j=a+32|0;c[g>>2]=c[j>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];j=e+48|0;e=a+48|0;c[j>>2]=c[e>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];c[j+12>>2]=c[e+12>>2];e=b|0;j=b+8|0;g=b+24|0;k=+lo(a,0.0,1.0,+h[e>>3],+h[j>>3],+h[g>>3]);if(k>=0.0&k<2.0){Qm(d+64|0,f,3,k,a,0);l=k}else{l=2.0}m=b+16|0;k=+lo(a,0.0,l>1.0?1.0:l,+h[m>>3],+h[j>>3],+h[g>>3]);if(k>=0.0&k<l){Qm(d+80|0,f,3,k,a,0);n=k}else{n=l}l=+mo(a,0.0,n>1.0?1.0:n,+h[j>>3],+h[e>>3],+h[m>>3]);if(l>=0.0&l<n){Qm(d+96|0,f,3,l,a,0);o=l}else{o=n}n=+mo(a,0.0,o>1.0?1.0:o,+h[g>>3],+h[e>>3],+h[m>>3]);if(!(n>=0.0&n<o)){p=o;q=p<2.0;r=q&1;i=d;return r|0}Qm(d+112|0,f,3,n,a,0);p=n;q=p<2.0;r=q&1;i=d;return r|0}function lo(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;var g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0.0,v=0.0,w=0.0;g=i;i=i+144|0;j=g|0;k=g+64|0;l=g+128|0;m=+h[a>>3];if(m<d){n=-1}else{n=m>d|0}m=+h[a+16>>3];if(m<d){o=-1}else{o=m>d|0}m=+h[a+32>>3];if(m<d){p=-1}else{p=m>d|0}m=+h[a+48>>3];if(m<d){q=-1}else{q=m>d|0}r=((o|0)!=(n|0)&(n|0)!=0&1)+((n|0)==0)+((p|0)!=(o|0)&(o|0)!=0&1)+((q|0)!=(p|0)&(p|0)!=0&1)|0;if((r|0)==0){s=-1.0;i=g;return+s}else if((r|0)==1){t=10}do{if((t|0)==10){if(m<0.0){u=m+-.5}else{u=m+.5}if(d<0.0){v=d+-.5}else{v=d+.5}if((~~u|0)!=(~~v|0)){break}w=+h[a+56>>3];i=g;return+(w<e|w>f?-1.0:c)}}while(0);t=j|0;j=k|0;Qm(l,a,3,.5,t,j);v=(b+c)*.5;u=+lo(t,b,v,d,e,f);if(u>=0.0){s=u;i=g;return+s}s=+lo(j,v,c,d,e,f);i=g;return+s}function mo(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;var g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;g=i;i=i+144|0;j=g|0;k=g+64|0;l=g+128|0;m=+h[a+8>>3];if(m<d){n=-1}else{n=m>d|0}m=+h[a+24>>3];if(m<d){o=-1}else{o=m>d|0}m=+h[a+40>>3];if(m<d){p=-1}else{p=m>d|0}m=+h[a+56>>3];if(m<d){q=-1}else{q=m>d|0}r=((o|0)!=(n|0)&(n|0)!=0&1)+((n|0)==0)+((p|0)!=(o|0)&(o|0)!=0&1)+((q|0)!=(p|0)&(p|0)!=0&1)|0;if((r|0)==1){s=10}else if((r|0)==0){t=-1.0;i=g;return+t}do{if((s|0)==10){if(m<0.0){u=m+-.5}else{u=m+.5}if(d<0.0){v=d+-.5}else{v=d+.5}if((~~u|0)!=(~~v|0)){break}w=+h[a+48>>3];i=g;return+(w<e|w>f?-1.0:c)}}while(0);s=j|0;j=k|0;Qm(l,a,3,.5,s,j);v=(b+c)*.5;u=+mo(s,b,v,d,e,f);if(u>=0.0){t=u;i=g;return+t}t=+mo(j,v,c,d,e,f);i=g;return+t}function no(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,la=0,ma=0,na=0,oa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0;e=i;f=1;g=0;h=i;i=i+168|0;c[h>>2]=0;while(1)switch(f|0){case 1:j=d+8|0;k=c[j>>2]|0;if(((b[k+226>>1]|0)-(b[k+224>>1]|0)|0)<2){f=60;break}else{f=2;break};case 2:l=c[k+184>>2]|0;if((c[l+88>>2]|0)==0){m=1;n=k;f=30;break}else{o=1;p=2;q=k;r=l;f=4;break};case 3:l=p+1|0;if((c[s+(l*44|0)>>2]|0)==0){f=5;break}else{o=p;p=l;q=t;r=s;f=4;break};case 4:if((c[r+(o*44|0)>>2]|0)>0){w=0;x=r;y=q;f=6;break}else{t=q;s=r;f=3;break};case 5:if((p|0)>0){m=p;n=t;f=30;break}else{f=56;break};case 6:z=(c[(c[x+(o*44|0)+4>>2]|0)+(w<<2)>>2]|0)+8|0;A=c[z>>2]|0;if((a[A+156|0]|0)==1){f=7;break}else{f=29;break};case 7:if((c[A+176>>2]|0)==1){f=8;break}else{f=29;break};case 8:if((c[A+184>>2]|0)==1){f=9;break}else{f=29;break};case 9:if((c[A+104>>2]|0)==0){B=w;C=y;f=10;break}else{f=29;break};case 10:D=B+1|0;E=c[C+184>>2]|0;if((D|0)<(c[E+(o*44|0)>>2]|0)){f=11;break}else{f=27;break};case 11:F=c[(c[(c[E+(o*44|0)+4>>2]|0)+(D<<2)>>2]|0)+8>>2]|0;G=c[c[(c[z>>2]|0)+172>>2]>>2]|0;H=F+172|0;I=c[c[H>>2]>>2]|0;if((a[F+156|0]|0)==1){f=12;break}else{f=27;break};case 12:if((c[H+4>>2]|0)==1){f=13;break}else{f=27;break};case 13:if((c[F+184>>2]|0)==1){f=14;break}else{f=27;break};case 14:if((c[F+104>>2]|0)==0){f=15;break}else{f=27;break};case 15:if((c[((c[G>>2]&3|0)==3?G:G+32|0)+28>>2]|0)==(c[((c[I>>2]&3|0)==3?I:I+32|0)+28>>2]|0)){f=16;break}else{f=27;break};case 16:J=c[G+8>>2]|0;if((a[J+112|0]|0)==0){K=G;L=J;f=18;break}else{M=J;f=19;break};case 17:K=N;L=O;f=18;break;case 18:P=c[I+8>>2]|0;if((a[P+112|0]|0)==0){Q=I;R=P;f=22;break}else{S=P;f=20;break};case 19:N=c[M+116>>2]|0;O=c[N+8>>2]|0;if((a[O+112|0]|0)==0){f=17;break}else{M=O;f=19;break};case 20:T=c[S+116>>2]|0;U=c[T+8>>2]|0;if((a[U+112|0]|0)==0){f=21;break}else{S=U;f=20;break};case 21:Q=T;R=U;f=22;break;case 22:if((a[L+153|0]|0)==0){f=23;break}else{f=27;break};case 23:if((a[R+153|0]|0)==0){f=24;break}else{f=27;break};case 24:l=c[Q>>2]&3;V=c[K>>2]&3;if((da((c[(c[(c[((V|0)==3?K:K+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((V|0)==2?K:K-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0,(c[(c[(c[((l|0)==3?Q:Q+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((l|0)==2?Q:Q-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0)|0)>0){f=25;break}else{f=27;break};case 25:l=wa(26,J+16|0,P+16|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,h)|0;if((g|0)>0){f=-1;break}else return}u=v=0;if((l|0)==0){f=26;break}else{f=27;break};case 26:B=D;C=c[j>>2]|0;f=10;break;case 27:if((D-w|0)>1){f=28;break}else{f=29;break};case 28:ja(8,d|0,o|0,w|0,B|0,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,h)|0;if((g|0)>0){f=-1;break}else return}u=v=0;f=29;break;case 29:l=w+1|0;V=c[j>>2]|0;W=c[V+184>>2]|0;if((l|0)<(c[W+(o*44|0)>>2]|0)){w=l;x=W;y=V;f=6;break}else{t=V;s=W;f=3;break};case 30:W=c[n+184>>2]|0;if((c[W+(m*44|0)>>2]|0)>0){X=0;Y=W;Z=n;f=31;break}else{_=n;f=55;break};case 31:$=(c[(c[Y+(m*44|0)+4>>2]|0)+(X<<2)>>2]|0)+8|0;aa=c[$>>2]|0;if((a[aa+156|0]|0)==1){f=32;break}else{f=54;break};case 32:if((c[aa+184>>2]|0)==1){f=33;break}else{f=54;break};case 33:if((c[aa+176>>2]|0)==1){f=34;break}else{f=54;break};case 34:if((c[aa+104>>2]|0)==0){ba=X;ca=Z;f=35;break}else{f=54;break};case 35:ea=ba+1|0;fa=c[ca+184>>2]|0;if((ea|0)<(c[fa+(m*44|0)>>2]|0)){f=36;break}else{f=52;break};case 36:ga=c[(c[(c[fa+(m*44|0)+4>>2]|0)+(ea<<2)>>2]|0)+8>>2]|0;ha=c[c[(c[$>>2]|0)+180>>2]>>2]|0;ia=ga+180|0;la=c[c[ia>>2]>>2]|0;if((a[ga+156|0]|0)==1){f=37;break}else{f=52;break};case 37:if((c[ia+4>>2]|0)==1){f=38;break}else{f=52;break};case 38:if((c[ga+176>>2]|0)==1){f=39;break}else{f=52;break};case 39:if((c[ga+104>>2]|0)==0){f=40;break}else{f=52;break};case 40:if((c[((c[ha>>2]&3|0)==2?ha:ha-32|0)+28>>2]|0)==(c[((c[la>>2]&3|0)==2?la:la-32|0)+28>>2]|0)){f=41;break}else{f=52;break};case 41:ma=c[ha+8>>2]|0;if((a[ma+112|0]|0)==0){na=ha;oa=ma;f=43;break}else{qa=ma;f=44;break};case 42:na=ra;oa=sa;f=43;break;case 43:ta=c[la+8>>2]|0;if((a[ta+112|0]|0)==0){ua=la;va=ta;f=47;break}else{xa=ta;f=45;break};case 44:ra=c[qa+116>>2]|0;sa=c[ra+8>>2]|0;if((a[sa+112|0]|0)==0){f=42;break}else{qa=sa;f=44;break};case 45:ya=c[xa+116>>2]|0;za=c[ya+8>>2]|0;if((a[za+112|0]|0)==0){f=46;break}else{xa=za;f=45;break};case 46:ua=ya;va=za;f=47;break;case 47:if((a[oa+153|0]|0)==0){f=48;break}else{f=52;break};case 48:if((a[va+153|0]|0)==0){f=49;break}else{f=52;break};case 49:W=c[ua>>2]&3;V=c[na>>2]&3;if((da((c[(c[(c[((V|0)==3?na:na+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((V|0)==2?na:na-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0,(c[(c[(c[((W|0)==3?ua:ua+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((W|0)==2?ua:ua-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0)|0)>0){f=50;break}else{f=52;break};case 50:W=wa(26,ma+56|0,ta+56|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,h)|0;if((g|0)>0){f=-1;break}else return}u=v=0;if((W|0)==0){f=51;break}else{f=52;break};case 51:ba=ea;ca=c[j>>2]|0;f=35;break;case 52:if((ea-X|0)>1){f=53;break}else{f=54;break};case 53:ja(8,d|0,m|0,X|0,ba|0,0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,h)|0;if((g|0)>0){f=-1;break}else return}u=v=0;f=54;break;case 54:W=X+1|0;V=c[j>>2]|0;l=c[V+184>>2]|0;if((W|0)<(c[l+(m*44|0)>>2]|0)){X=W;Y=l;Z=V;f=31;break}else{_=V;f=55;break};case 55:V=m-1|0;if((V|0)>0){m=V;n=_;f=30;break}else{f=56;break};case 56:Aa=BF(178392,f,h)|0;f=61;break;case 61:if((Aa|0)==0){f=57;break}else{f=58;break};case 57:V=c[j>>2]|0;if((c[V+172>>2]|0)<1){f=60;break}else{Ba=1;Ca=V;f=59;break};case 58:pa(16,3,129512,(V=i,i=i+1|0,i=i+7&-8,c[V>>2]=0,V)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,h)|0;if((g|0)>0){f=-1;break}else return}u=v=0;i=V;f=60;break;case 59:ka(106,c[(c[Ca+176>>2]|0)+(Ba<<2)>>2]|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,h)|0;if((g|0)>0){f=-1;break}else return}u=v=0;V=c[j>>2]|0;if((Ba|0)<(c[V+172>>2]|0)){Ba=Ba+1|0;Ca=V;f=59;break}else{f=60;break};case 60:i=e;return;case-1:if((g|0)==56){Aa=v;f=61}u=v=0;break}}function oo(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;g=a+8|0;h=c[(c[g>>2]|0)+184>>2]|0;i=c[h+(b*44|0)+4>>2]|0;j=c[i+(d<<2)>>2]|0;k=d+1|0;do{if((d|0)<(e|0)){l=(f|0)==1;m=j+8|0;n=k;o=i;while(1){p=c[o+(n<<2)>>2]|0;q=p+8|0;r=c[q>>2]|0;do{if(l){s=c[c[r+180>>2]>>2]|0;if((s|0)==0){t=r;break}else{u=s;v=r}while(1){s=c[(c[m>>2]|0)+180>>2]|0;w=c[s>>2]|0;x=c[u>>2]|0;a:do{if((w|0)==0){y=u-32|0;z=14}else{A=u-32|0;B=c[((x&3|0)==2?u:A)+28>>2]|0;C=0;D=w;while(1){E=C+1|0;if((c[((c[D>>2]&3|0)==2?D:D-32|0)+28>>2]|0)==(B|0)){break}F=c[s+(E<<2)>>2]|0;if((F|0)==0){y=A;z=14;break a}else{C=E;D=F}}if((D|0)==0){y=A;z=14}else{G=D;H=v}}}while(0);if((z|0)==14){z=0;s=Zo(j,c[((x&3|0)==2?u:y)+28>>2]|0,u)|0;G=s;H=c[q>>2]|0}s=c[c[H+172>>2]>>2]|0;if((s|0)!=0){w=s;do{ep(w,G);Vo(w);w=c[c[(c[q>>2]|0)+172>>2]>>2]|0;}while((w|0)!=0)}Vo(u);w=c[q>>2]|0;x=c[c[w+180>>2]>>2]|0;if((x|0)==0){t=w;break}else{u=x;v=w}}}else{w=c[c[r+172>>2]>>2]|0;if((w|0)==0){t=r;break}else{I=w;J=r}while(1){w=c[(c[m>>2]|0)+172>>2]|0;x=c[w>>2]|0;s=c[I>>2]|0;b:do{if((x|0)==0){K=I+32|0;z=24}else{C=I+32|0;B=c[((s&3|0)==3?I:C)+28>>2]|0;F=0;E=x;while(1){L=F+1|0;if((c[((c[E>>2]&3|0)==3?E:E+32|0)+28>>2]|0)==(B|0)){break}M=c[w+(L<<2)>>2]|0;if((M|0)==0){K=C;z=24;break b}else{F=L;E=M}}if((E|0)==0){K=C;z=24}else{N=E;O=J}}}while(0);if((z|0)==24){z=0;w=Zo(c[((s&3|0)==3?I:K)+28>>2]|0,j,I)|0;N=w;O=c[q>>2]|0}w=c[c[O+180>>2]>>2]|0;if((w|0)!=0){x=w;do{ep(x,N);Vo(x);x=c[c[(c[q>>2]|0)+180>>2]>>2]|0;}while((x|0)!=0)}Vo(I);x=c[q>>2]|0;s=c[c[x+172>>2]>>2]|0;if((s|0)==0){t=x;break}else{I=s;J=x}}}}while(0);if((c[t+176>>2]|0)!=(-(c[t+184>>2]|0)|0)){z=29;break}ap(a,p);if((n|0)>=(e|0)){z=3;break}n=n+1|0;o=c[(c[(c[g>>2]|0)+184>>2]|0)+(b*44|0)+4>>2]|0}if((z|0)==3){P=c[(c[g>>2]|0)+184>>2]|0;break}else if((z|0)==29){cc(115624,108424,115,170248)}}else{P=h}}while(0);h=e+1|0;e=P+(b*44|0)|0;if((h|0)<(c[e>>2]|0)){Q=k;R=h;S=P}else{T=k;U=e;c[U>>2]=T;V=c[g>>2]|0;W=V+184|0;X=W;Y=c[X>>2]|0;Z=Y+(b*44|0)+4|0;_=c[Z>>2]|0;$=_+(T<<2)|0;c[$>>2]=0;return}while(1){e=c[S+(b*44|0)+4>>2]|0;k=c[e+(R<<2)>>2]|0;c[e+(Q<<2)>>2]=k;c[(c[k+8>>2]|0)+236>>2]=Q;k=Q+1|0;e=R+1|0;P=c[(c[g>>2]|0)+184>>2]|0;h=P+(b*44|0)|0;if((e|0)<(c[h>>2]|0)){Q=k;R=e;S=P}else{T=k;U=h;break}}c[U>>2]=T;V=c[g>>2]|0;W=V+184|0;X=W;Y=c[X>>2]|0;Z=Y+(b*44|0)+4|0;_=c[Z>>2]|0;$=_+(T<<2)|0;c[$>>2]=0;return}function po(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;e=i;f=d+8|0;g=c[f>>2]|0;h=b[g+224>>1]|0;if(h<<16>>16<=(b[g+226>>1]|0)){j=h<<16>>16;h=g;while(1){c[(c[h+256>>2]|0)+(j<<2)>>2]=0;g=c[f>>2]|0;if((j|0)<(b[g+226>>1]|0)){j=j+1|0;h=g}else{break}}}Xp(d);h=ux(d)|0;if((h|0)!=0){j=h;do{h=c[j+8>>2]|0;g=(c[(c[f>>2]|0)+256>>2]|0)+(c[h+232>>2]<<2)|0;k=c[g>>2]|0;if((k|0)==0){l=7}else{if((c[(c[k+8>>2]|0)+236>>2]|0)>(c[h+236>>2]|0)){l=7}}if((l|0)==7){l=0;c[g>>2]=j}g=mw(d,j)|0;if((g|0)!=0){h=g;do{g=c[(c[h+8>>2]|0)+172>>2]|0;if((g|0)==0){m=h}else{k=g;while(1){g=c[(c[k+8>>2]|0)+172>>2]|0;if((g|0)==0){break}else{k=g}}m=k}g=m;n=c[g>>2]|0;o=m-32|0;p=c[((n&3|0)==2?m:o)+28>>2]|0;q=c[p+8>>2]|0;r=c[q+232>>2]|0;s=h;t=c[s>>2]|0;u=h-32|0;if((r|0)<(c[(c[(c[((t&3|0)==2?h:u)+28>>2]|0)+8>>2]|0)+232>>2]|0)){v=m;w=g;g=o;o=p;p=q;q=r;r=n;n=t;while(1){t=(c[(c[f>>2]|0)+256>>2]|0)+(q<<2)|0;x=c[t>>2]|0;if((x|0)==0){l=15}else{if((c[(c[x+8>>2]|0)+236>>2]|0)>(c[p+236>>2]|0)){l=15}else{y=r;z=n}}if((l|0)==15){l=0;c[t>>2]=o;y=c[w>>2]|0;z=c[s>>2]|0}t=c[c[(c[(c[((y&3|0)==2?v:g)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;x=t;A=c[x>>2]|0;B=t-32|0;C=c[((A&3|0)==2?t:B)+28>>2]|0;D=c[C+8>>2]|0;E=c[D+232>>2]|0;if((E|0)<(c[(c[(c[((z&3|0)==2?h:u)+28>>2]|0)+8>>2]|0)+232>>2]|0)){v=t;w=x;g=B;o=C;p=D;q=E;r=A;n=z}else{break}}}h=ow(d,h)|0;}while((h|0)!=0)}j=vx(d,j)|0;}while((j|0)!=0)}j=c[f>>2]|0;z=b[j+224>>1]|0;a:do{if(z<<16>>16>(b[j+226>>1]|0)){F=j}else{y=d|0;m=z<<16>>16;h=j;while(1){G=c[(c[h+256>>2]|0)+(m<<2)>>2]|0;H=G+8|0;n=c[(c[H>>2]|0)+236>>2]|0;if((c[(c[(c[(c[(Ix(y)|0)+8>>2]|0)+184>>2]|0)+(m*44|0)+4>>2]|0)+(n<<2)>>2]|0)!=(G|0)){break}n=c[(c[(c[(Ix(y)|0)+8>>2]|0)+184>>2]|0)+(m*44|0)+4>>2]|0;r=c[f>>2]|0;c[(c[r+184>>2]|0)+(m*44|0)+4>>2]=n+(c[(c[(c[(c[r+256>>2]|0)+(m<<2)>>2]|0)+8>>2]|0)+236>>2]<<2);r=c[(c[f>>2]|0)+184>>2]|0;if((c[r+(m*44|0)>>2]|0)>0){n=0;q=-1;p=r;b:while(1){r=c[(c[p+(m*44|0)+4>>2]|0)+(n<<2)>>2]|0;if((r|0)==0){I=q;break}o=c[r+8>>2]|0;do{if((a[o+156|0]|0)==0){if((Rx(d,r|0)|0)==0){I=q;break b}else{J=n}}else{g=c[c[o+172>>2]>>2]|0;if((g|0)==0){J=q;break}else{K=g}while(1){g=c[(c[K+8>>2]|0)+116>>2]|0;if((g|0)==0){break}K=g}g=K;if((Rx(d,c[((c[g>>2]&3|0)==3?K:K+32|0)+28>>2]|0)|0)==0){J=q;break}w=(Rx(d,c[((c[g>>2]&3|0)==2?K:K-32|0)+28>>2]|0)|0)==0;J=w?q:n}}while(0);o=n+1|0;r=c[(c[f>>2]|0)+184>>2]|0;if((o|0)<(c[r+(m*44|0)>>2]|0)){n=o;q=J;p=r}else{I=J;break}}if((I|0)==-1){l=35}else{L=I}}else{l=35}if((l|0)==35){l=0;p=$w(y)|0;Fv(0,128768,(M=i,i=i+16|0,c[M>>2]=p,c[M+8>>2]=m,M)|0)|0;i=M;L=-1}c[(c[(c[f>>2]|0)+184>>2]|0)+(m*44|0)>>2]=L+1;p=c[f>>2]|0;if((m|0)<(b[p+226>>1]|0)){m=m+1|0;h=p}else{F=p;break a}}h=$w(G|0)|0;y=c[(c[H>>2]|0)+236>>2]|0;Fv(1,159192,(M=i,i=i+24|0,c[M>>2]=h,c[M+8>>2]=y,c[M+16>>2]=m,M)|0)|0;i=M;rc(178392,1)}}while(0);if((c[F+172>>2]|0)<1){i=e;return}else{N=1;O=F}while(1){po(c[(c[O+176>>2]|0)+(N<<2)>>2]|0);F=c[f>>2]|0;if((N|0)<(c[F+172>>2]|0)){N=N+1|0;O=F}else{break}}i=e;return}function qo(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c[53734]=b;e=(a[215384]|0)+1&255;a[215384]=e<<24>>24==0?1:e;e=b+8|0;c[(c[e>>2]|0)+208>>2]=0;c[(c[e>>2]|0)+220>>2]=0;e=ux(b)|0;if((e|0)==0){return}if((d|0)>0){f=e}else{d=e;do{do{if((d|0)==(Lm(d)|0)){if((a[(c[d+8>>2]|0)+157|0]|0)==(a[215384]|0)){break}c[(c[(c[53734]|0)+8>>2]|0)+180>>2]=0;c[53672]=0;ro(d);e=(c[(c[53734]|0)+8>>2]|0)+208|0;g=c[e>>2]|0;c[e>>2]=g+1;e=(c[(c[53734]|0)+8>>2]|0)+204|0;h=c[e>>2]|0;if((h|0)==0){i=kk(c[e+4>>2]<<2)|0}else{i=mk(h,c[e+4>>2]<<2)|0}c[(c[(c[53734]|0)+8>>2]|0)+204>>2]=i;e=c[(c[53734]|0)+8>>2]|0;c[(c[e+204>>2]|0)+(g<<2)>>2]=c[e+180>>2]}}while(0);d=vx(b,d)|0;}while((d|0)!=0);return}do{d=c[f+8>>2]|0;i=c[d+212>>2]|0;if((i|0)==0){if((f|0)==(Lm(f)|0)){j=f;k=6}}else{j=c[(c[(c[i+8>>2]|0)+256>>2]|0)+(c[d+232>>2]<<2)>>2]|0;k=6}do{if((k|0)==6){k=0;if((a[(c[j+8>>2]|0)+157|0]|0)==(a[215384]|0)){break}c[(c[(c[53734]|0)+8>>2]|0)+180>>2]=0;c[53672]=0;ro(j);d=(c[(c[53734]|0)+8>>2]|0)+208|0;i=c[d>>2]|0;c[d>>2]=i+1;d=(c[(c[53734]|0)+8>>2]|0)+204|0;e=c[d>>2]|0;if((e|0)==0){l=kk(c[d+4>>2]<<2)|0}else{l=mk(e,c[d+4>>2]<<2)|0}c[(c[(c[53734]|0)+8>>2]|0)+204>>2]=l;d=c[(c[53734]|0)+8>>2]|0;c[(c[d+204>>2]|0)+(i<<2)>>2]=c[d+180>>2]}}while(0);f=vx(b,f)|0;}while((f|0)!=0);return}function ro(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+32|0;e=d|0;f=(c[(c[53734]|0)+8>>2]|0)+220|0;c[f>>2]=(c[f>>2]|0)+1;f=b+8|0;a[(c[f>>2]|0)+157|0]=a[215384]|0;g=c[53672]|0;h=(c[f>>2]|0)+168|0;if((g|0)==0){c[h>>2]=0;c[(c[(c[53734]|0)+8>>2]|0)+180>>2]=b}else{c[h>>2]=g;c[(c[(c[53672]|0)+8>>2]|0)+164>>2]=b}c[53672]=b;c[(c[f>>2]|0)+164>>2]=0;g=c[f>>2]|0;f=g+180|0;h=e;j=c[f+4>>2]|0;c[h>>2]=c[f>>2];c[h+4>>2]=j;j=g+172|0;h=e+8|0;f=c[j+4>>2]|0;c[h>>2]=c[j>>2];c[h+4>>2]=f;f=g+188|0;h=e+16|0;j=c[f+4>>2]|0;c[h>>2]=c[f>>2];c[h+4>>2]=j;j=g+196|0;g=e+24|0;h=c[j+4>>2]|0;c[g>>2]=c[j>>2];c[g+4>>2]=h;h=0;do{g=c[e+(h<<3)>>2]|0;do{if((g|0)!=0){j=c[g>>2]|0;if((j|0)==0){break}else{k=0;l=j}do{j=c[l>>2]&3;f=c[((j|0)==2?l:l-32|0)+28>>2]|0;if((f|0)==(b|0)){m=c[((j|0)==3?l:l+32|0)+28>>2]|0}else{m=f}do{if((a[(c[m+8>>2]|0)+157|0]|0)!=(a[215384]|0)){if((m|0)!=(Lm(m)|0)){break}ro(m)}}while(0);k=k+1|0;l=c[g+(k<<2)>>2]|0;}while((l|0)!=0)}}while(0);h=h+1|0;}while((h|0)<4);i=d;return}function so(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=ux(d)|0;if((e|0)!=0){f=e;do{e=f|0;Wx(e,162896,304,1)|0;Ym(f);vn(f,c[(c[(Hx(e)|0)+8>>2]|0)+116>>2]&1);e=f+8|0;c[(c[e>>2]|0)+176>>2]=0;g=jk(20)|0;c[(c[e>>2]|0)+172>>2]=g;c[(c[e>>2]|0)+184>>2]=0;g=jk(20)|0;c[(c[e>>2]|0)+180>>2]=g;c[(c[e>>2]|0)+200>>2]=0;g=jk(12)|0;c[(c[e>>2]|0)+196>>2]=g;c[(c[e>>2]|0)+192>>2]=0;g=jk(12)|0;c[(c[e>>2]|0)+188>>2]=g;c[(c[e>>2]|0)+208>>2]=0;g=jk(12)|0;c[(c[e>>2]|0)+204>>2]=g;c[(c[e>>2]|0)+216>>2]=1;f=vx(d,f)|0;}while((f|0)!=0)}f=ux(d)|0;if((f|0)==0){return}else{h=f}do{f=mw(d,h)|0;if((f|0)!=0){e=f;do{f=e|0;Wx(f,158888,176,1)|0;Zm(e)|0;g=Em(f,c[53750]|0,1,0)|0;i=e+8|0;c[(c[i>>2]|0)+156>>2]=g;g=e;j=Hm(c[((c[g>>2]&3|0)==3?e:e+32|0)+28>>2]|0,c[53620]|0,213336)|0;k=Hm(c[((c[g>>2]&3|0)==2?e:e-32|0)+28>>2]|0,c[53620]|0,213336)|0;b[(c[i>>2]|0)+154>>1]=1;b[(c[i>>2]|0)+168>>1]=1;if((a[j]|0)!=0&(j|0)==(k|0)){b[(c[i>>2]|0)+154>>1]=1e3;k=(c[i>>2]|0)+156|0;c[k>>2]=(c[k>>2]|0)*100|0}if((Vn(e)|0)!=0){b[(c[i>>2]|0)+154>>1]=0;c[(c[i>>2]|0)+156>>2]=0}k=(Em(f,c[53762]|0,0,0)|0)&255;a[(c[i>>2]|0)+152|0]=k;k=(Em(f,c[53774]|0,1,0)|0)&65535;b[(c[i>>2]|0)+170>>1]=k;e=ow(d,e)|0;}while((e|0)!=0)}h=vx(d,h)|0;}while((h|0)!=0);return}function to(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=c[(c[b+8>>2]|0)+180>>2]|0;if((d|0)!=0){e=d;while(1){d=e+8|0;f=c[d>>2]|0;g=c[f+164>>2]|0;h=c[f+176>>2]|0;if((h|0)>0){i=h;h=f;while(1){j=i-1|0;k=c[(c[h+172>>2]|0)+(j<<2)>>2]|0;Vo(k);eF(c[k+8>>2]|0);eF(k|0);k=c[d>>2]|0;if((j|0)>0){i=j;h=k}else{l=k;break}}}else{l=f}h=l+180|0;i=c[h+4>>2]|0;if((i|0)>0){k=i-1|0;i=c[(c[h>>2]|0)+(k<<2)>>2]|0;Vo(i);eF(c[i+8>>2]|0);eF(i|0);if((k|0)>0){i=k;do{i=i-1|0;k=c[(c[(c[d>>2]|0)+180>>2]|0)+(i<<2)>>2]|0;Vo(k);eF(c[k+8>>2]|0);eF(k|0);}while((i|0)>0)}m=c[d>>2]|0}else{m=l}if((a[m+156|0]|0)==1){i=c[m+180>>2]|0;if((i|0)==0){n=m}else{eF(i);n=c[d>>2]|0}i=c[n+172>>2]|0;if((i|0)==0){o=n}else{eF(i);o=c[d>>2]|0}eF(o);eF(e)}if((g|0)==0){break}else{e=g}}}e=ux(b)|0;if((e|0)==0){vo(b);return}else{p=e}do{e=mw(b,p)|0;if((e|0)!=0){o=e;do{tn(o);o=ow(b,o)|0;}while((o|0)!=0)}uo(p);p=vx(b,p)|0;}while((p|0)!=0);vo(b);return}function uo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;b=a+8|0;d=c[b>>2]|0;e=c[d+172>>2]|0;if((e|0)==0){f=d}else{eF(e);f=c[b>>2]|0}e=c[f+180>>2]|0;if((e|0)==0){g=f}else{eF(e);g=c[b>>2]|0}e=c[g+188>>2]|0;if((e|0)==0){h=g}else{eF(e);h=c[b>>2]|0}e=c[h+196>>2]|0;if((e|0)==0){i=h}else{eF(e);i=c[b>>2]|0}e=c[i+204>>2]|0;if((e|0)==0){j=i}else{eF(e);j=c[b>>2]|0}dk(c[j+104>>2]|0);j=c[(c[b>>2]|0)+8>>2]|0;if((j|0)==0){k=a|0;l=Xx(k,162896)|0;return}Cc[c[(c[j+4>>2]|0)+4>>2]&255](a);k=a|0;l=Xx(k,162896)|0;return}function vo(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=sy(a)|0;if((d|0)!=0){e=d;do{vo(e);e=ty(e)|0;}while((e|0)!=0)}e=a+8|0;d=c[e>>2]|0;f=c[d+176>>2]|0;if((f|0)==0){g=d}else{eF(f);g=c[e>>2]|0}f=c[g+256>>2]|0;if((f|0)==0){h=g}else{eF(f);h=c[e>>2]|0}f=c[h+204>>2]|0;if((f|0)==0){i=h}else{eF(f);i=c[e>>2]|0}f=c[i+184>>2]|0;do{if((f|0)!=0){h=b[i+224>>1]|0;if(h<<16>>16>(b[i+226>>1]|0)){j=h;k=f}else{g=h<<16>>16;h=f;while(1){eF(c[h+(g*44|0)+12>>2]|0);l=c[e>>2]|0;if((g|0)>=(b[l+226>>1]|0)){break}g=g+1|0;h=c[l+184>>2]|0}j=b[l+224>>1]|0;k=c[l+184>>2]|0}if(j<<16>>16==-1){eF(k-44|0);break}else{eF(k);break}}}while(0);k=a|0;if((Ix(k)|0)==(a|0)){return}Xx(k,167088)|0;return}function wo(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;i=i+40|0;e=d|0;f=a|0;g=Em(f,Wv(a,0,120216,0)|0,-1,1)|0;qn(a,10);h=Sn(a,e)|0;xo(a);so(a);j=e+32|0;k=(g|0)==2;l=(g|0)==3;m=e+28|0;n=e+24|0;if((g|0)==1){Zp(a,h);yo(a,1);i=d;return}else{o=h}while(1){Zp(a,o);if((c[j>>2]|0)==0){p=o}else{Fv(0,157336,(h=i,i=i+1|0,i=i+7&-8,c[h>>2]=0,h)|0)|0;i=h;c[n>>2]=0;p=0}jp(a,(p|0)!=0|0);if(k){q=6;break}Hp(a,p);if(l){q=8;break}h=(c[m>>2]|0)-1|0;c[m>>2]=h;if((c[n>>2]|0)==0|(h|0)==0){q=10;break}else{o=p}}if((q|0)==6){yo(a,2);i=d;return}else if((q|0)==8){yo(a,2);i=d;return}else if((q|0)==10){p=a+8|0;do{if((b[(c[p>>2]|0)+128>>1]&16)!=0){o=ry(a,115032,0)|0;if((o|0)==0){break}n=ux(o)|0;a:do{if((n|0)!=0){m=n;while(1){l=vx(o,m)|0;ap(a,m);k=c[(c[m+8>>2]|0)+232>>2]|0;j=c[(c[p>>2]|0)+184>>2]|0;h=j+(k*44|0)|0;g=c[h>>2]|0;e=j+(k*44|0)+4|0;j=0;r=0;while(1){if((r|0)>=(g|0)){q=20;break}s=c[e>>2]|0;t=s+(r<<2)|0;u=c[t>>2]|0;v=r+1|0;if((u|0)==(m|0)){q=16;break}else{j=u;r=v}}if((q|0)==16){q=0;do{if((v|0)<(g|0)){c[t>>2]=c[s+(v<<2)>>2];e=r+2|0;u=c[(c[p>>2]|0)+184>>2]|0;w=u+(k*44|0)|0;x=c[w>>2]|0;if((e|0)<(x|0)){y=e;z=u}else{A=w;B=x;break}while(1){x=c[z+(k*44|0)+4>>2]|0;c[x+(y-1<<2)>>2]=c[x+(y<<2)>>2];x=y+1|0;w=c[(c[p>>2]|0)+184>>2]|0;u=w+(k*44|0)|0;e=c[u>>2]|0;if((x|0)<(e|0)){y=x;z=w}else{A=u;B=e;break}}}else{A=h;B=g}}while(0);c[A>>2]=B-1}else if((q|0)==20){q=0;if((j|0)!=(m|0)){break}}uo(m);Cx(a,m)|0;if((l|0)==0){break a}else{m=l}}cc(107992,102136,238,170008)}}while(0);vy(a,o)|0}}while(0);pq(a);Ao(a);if((Km(ew(f,127320)|0)|0)<<24>>24!=0){io(a)}Xk(a);i=d;return}}function xo(a){a=a|0;var b=0,c=0;b=a|0;if((Ix(b)|0)!=(a|0)){Wx(b,167088,272,1)|0}b=sy(a)|0;if((b|0)==0){return}else{c=b}do{xo(c);c=ty(c)|0;}while((c|0)!=0);return}function yo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+1024|0;e=Wv(a,1,96272,213336)|0;f=Wv(a,1,85640,213336)|0;g=ux(a)|0;if((g|0)==0){i=d;return}h=d|0;if((b|0)<=0){j=g;do{j=vx(a,j)|0;}while((j|0)!=0);i=d;return}if((b|0)>1){b=g;do{j=b+8|0;nb(h|0,80896,(k=i,i=i+8|0,c[k>>2]=c[(c[j>>2]|0)+232>>2],k)|0)|0;i=k;l=b|0;hw(l,e,h)|0;nb(h|0,80896,(k=i,i=i+8|0,c[k>>2]=c[(c[j>>2]|0)+236>>2],k)|0)|0;i=k;hw(l,f,h)|0;b=vx(a,b)|0;}while((b|0)!=0);i=d;return}else{b=g;do{nb(h|0,80896,(k=i,i=i+8|0,c[k>>2]=c[(c[b+8>>2]|0)+232>>2],k)|0)|0;i=k;hw(b|0,e,h)|0;b=vx(a,b)|0;}while((b|0)!=0);i=d;return}}function zo(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=i;e=b;b=i;i=i+40|0;tF(b,e,40)|0;e=c;c=i;i=i+40|0;tF(c,e,40)|0;e=a[b+28|0]|0;do{if((a[c+28|0]|0)==0){f=e<<24>>24!=0|0}else{if(e<<24>>24==0){f=-1;break}g=~~(+h[b>>3]- +h[c>>3]);if((g|0)!=0){f=g;break}f=~~(+h[b+8>>3]- +h[c+8>>3])}}while(0);i=d;return f|0}function Ao(a){a=a|0;Bo(a,1);return}function Bo(d,e){d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0.0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0.0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0.0,hd=0.0,id=0.0,jd=0,kd=0,ld=0.0,md=0,nd=0.0,od=0,pd=0.0,qd=0.0,rd=0,sd=0.0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,zd=0,Ad=0,Bd=0,Cd=0,Dd=0,Ed=0,Fd=0.0,Gd=0.0,Hd=0.0,Id=0.0,Jd=0,Kd=0,Ld=0,Md=0,Nd=0.0,Od=0.0,Pd=0,Qd=0,Rd=0,Sd=0,Td=0,Ud=0,Vd=0,Wd=0,Xd=0,Yd=0,Zd=0,_d=0,$d=0,ae=0,be=0,ce=0,de=0,ee=0,fe=0,ge=0,he=0,ie=0,je=0,ke=0,le=0,me=0,ne=0.0,oe=0.0,pe=0.0,qe=0.0,re=0.0,se=0.0,te=0.0,ue=0,ve=0,we=0,xe=0,ye=0,ze=0,Ae=0,Be=0,Ce=0,De=0,Ee=0,Fe=0,Ge=0,He=0,Ie=0,Je=0,Ke=0.0,Le=0.0,Me=0.0,Ne=0.0,Oe=0,Pe=0,Qe=0,Re=0,Se=0,Te=0,Ue=0,Ve=0,We=0,Xe=0,Ye=0,Ze=0,_e=0,$e=0,af=0,bf=0,cf=0,df=0;f=i;i=i+7336|0;g=f|0;j=f+8|0;k=f+704|0;l=f+1400|0;m=f+2096|0;n=f+2792|0;o=f+2800|0;p=f+2912|0;q=f+3088|0;r=f+3152|0;s=f+3160|0;t=f+3856|0;u=f+4552|0;v=f+4728|0;w=f+4904|0;x=f+5080|0;y=f+5144|0;z=f+5208|0;A=f+5272|0;B=f+5968|0;C=f+6664|0;D=f+6672|0;E=f+6704|0;F=f+6736|0;G=f+6768|0;H=f+6800|0;I=f+7184|0;J=f+7248|0;K=f+7312|0;L=d+8|0;M=b[(c[L>>2]|0)+128>>1]&14;N=I|0;O=I+8|0;c[O>>2]=f+6832;P=J|0;Q=J+8|0;c[Q>>2]=f+7008;do{if((M|0)==4){R=ux(d)|0;if((R|0)!=0){S=R;do{R=S+8|0;T=c[R>>2]|0;if((c[T+204>>2]|0)!=0){U=T+96|0;V=+h[U>>3];h[U>>3]=+(c[T+240>>2]|0);c[(c[R>>2]|0)+240>>2]=~~V}S=vx(d,S)|0;}while((S|0)!=0)}if((a[(c[L>>2]|0)+113|0]&1)!=0){Fv(0,110208,(S=i,i=i+1|0,i=i+7&-8,c[S>>2]=0,S)|0)|0;i=S}S=ux(d)|0;if((S|0)==0){W=0;X=0;break}else{Y=S}while(1){S=mw(d,Y)|0;if((S|0)!=0){R=S;do{ll(d,R,4,11848);R=ow(d,R)|0;}while((R|0)!=0)}R=vx(d,Y)|0;if((R|0)==0){W=0;X=0;break}else{Y=R}}}else if((M|0)==0){i=f;return}else{go(d);if((gl()|0)!=0){i=f;return}R=jk(96)|0;S=R;T=c[(c[L>>2]|0)+236>>2]|0;c[K+8>>2]=(T|0)/4|0;U=K+12|0;c[U>>2]=T;T=jk(512)|0;Z=K+4|0;c[Z>>2]=0;_=K|0;c[_>>2]=0;$=c[L>>2]|0;aa=b[$+224>>1]|0;ba=aa<<16>>16;do{if(aa<<16>>16>(b[$+226>>1]|0)){ca=T;ea=0;fa=11520;ga=ba}else{ha=T;ia=0;ja=0;ka=ba;la=$;a:while(1){ma=c[la+184>>2]|0;na=c[ma+(ka*44|0)>>2]|0;oa=na+ja|0;pa=c[ma+(ka*44|0)+4>>2]|0;ma=c[pa>>2]|0;if((ma|0)!=0){V=+(c[_>>2]|0);qa=c[ma+8>>2]|0;ra=+h[qa+16>>3]- +h[qa+88>>3];c[_>>2]=~~(V<ra?V:ra)}do{if((na|0)!=0){qa=c[pa+(na-1<<2)>>2]|0;if((qa|0)==0){break}ra=+(c[Z>>2]|0);sa=c[qa+8>>2]|0;V=+h[sa+16>>3]+ +h[sa+96>>3];c[Z>>2]=~~(ra>V?ra:V)}}while(0);c[_>>2]=(c[_>>2]|0)-16;c[Z>>2]=(c[Z>>2]|0)+16;b:do{if((na|0)>0){pa=ha;sa=ia;qa=1;ta=ma;while(1){ua=ta+8|0;va=c[ua>>2]|0;wa=c[va+112>>2]|0;if((wa|0)==0){xa=va}else{ya=wa+8|0;wa=c[(c[ya>>2]|0)+96>>2]|0;if((wa|0)==0){za=22;break a}Aa=wa+56|0;wa=va+16|0;c[Aa>>2]=c[wa>>2];c[Aa+4>>2]=c[wa+4>>2];c[Aa+8>>2]=c[wa+8>>2];c[Aa+12>>2]=c[wa+12>>2];a[(c[(c[ya>>2]|0)+96>>2]|0)+81|0]=1;xa=c[ua>>2]|0}do{if((a[xa+156|0]|0)==0){Ba=xa;za=27}else{if((Ec[c[2963]&63](ta)|0)<<24>>24==0){Ca=sa;Da=pa;break}Ba=c[ua>>2]|0;za=27}}while(0);do{if((za|0)==27){za=0;ya=c[c[Ba+180>>2]>>2]|0;if((ya|0)==0){Ea=pa;Fa=sa;Ga=Ba}else{wa=pa;Aa=sa;va=0;Ha=ya;while(1){ya=c[Ha+8>>2]|0;Ia=a[ya+112|0]|0;do{if((Ia<<24>>24|0)==4|(Ia<<24>>24|0)==6){Ja=Aa;Ka=wa}else{c[ya+164>>2]=81;La=Aa+1|0;c[wa+(Aa<<2)>>2]=Ha;if((La&127|0)!=0){Ja=La;Ka=wa;break}if((wa|0)==0){Ma=kk((Aa<<2)+516|0)|0}else{Ma=mk(wa,(Aa<<2)+516|0)|0}Ja=La;Ka=Ma}}while(0);ya=va+1|0;Ia=c[ua>>2]|0;La=c[(c[Ia+180>>2]|0)+(ya<<2)>>2]|0;if((La|0)==0){Ea=Ka;Fa=Ja;Ga=Ia;break}else{wa=Ka;Aa=Ja;va=ya;Ha=La}}}do{if((c[Ga+188>>2]|0)==0){Na=Fa;Oa=Ea;Pa=Ga}else{Ha=c[c[Ga+188>>2]>>2]|0;if((Ha|0)==0){Na=Fa;Oa=Ea;Pa=Ga;break}else{Qa=Ea;Ra=Fa;Sa=0;Ta=Ha}while(1){Ha=c[Ta>>2]&3;c[(c[Ta+8>>2]|0)+164>>2]=(c[(c[(c[((Ha|0)==3?Ta:Ta+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)<(c[(c[(c[((Ha|0)==2?Ta:Ta-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)?146:162;Ha=Ra+1|0;c[Qa+(Ra<<2)>>2]=Ta;if((Ha&127|0)==0){if((Qa|0)==0){Ua=kk((Ra<<2)+516|0)|0}else{Ua=mk(Qa,(Ra<<2)+516|0)|0}Va=Ua}else{Va=Qa}va=Sa+1|0;Aa=c[ua>>2]|0;wa=c[(c[Aa+188>>2]|0)+(va<<2)>>2]|0;if((wa|0)==0){Na=Ha;Oa=Va;Pa=Aa;break}else{Qa=Va;Ra=Ha;Sa=va;Ta=wa}}}}while(0);wa=c[Pa+204>>2]|0;if((wa|0)==0){Ca=Na;Da=Oa;break}if((a[Pa+156|0]|0)==0){va=Pa+96|0;V=+h[va>>3];h[va>>3]=+(c[Pa+240>>2]|0);c[(c[ua>>2]|0)+240>>2]=~~V;Wa=c[(c[ua>>2]|0)+204>>2]|0}else{Wa=wa}wa=c[Wa>>2]|0;if((wa|0)==0){Ca=Na;Da=Oa;break}else{Xa=Oa;Ya=Na;Za=0;_a=wa}while(1){wa=c[_a>>2]&3;va=c[((wa|0)==3?_a:_a+32|0)+28>>2]|0;Ha=c[((wa|0)==2?_a:_a-32|0)+28>>2]|0;do{if((va|0)==(Ha|0)){wa=c[_a+8>>2]|0;if((a[wa+44|0]|0)!=0){$a=16;ab=4;break}bb=(a[wa+84|0]|0)==0?8:4;za=51}else{bb=(c[(c[va+8>>2]|0)+232>>2]|0)==(c[(c[Ha+8>>2]|0)+232>>2]|0)?2:1;za=51}}while(0);do{if((za|0)==51){za=0;if((bb|0)==1){$a=(c[(c[va+8>>2]|0)+232>>2]|0)<(c[(c[Ha+8>>2]|0)+232>>2]|0)?16:32;ab=1;break}else if((bb|0)==2){$a=(c[(c[va+8>>2]|0)+236>>2]|0)<(c[(c[Ha+8>>2]|0)+236>>2]|0)?16:32;ab=2;break}else{$a=16;ab=bb;break}}}while(0);c[(c[_a+8>>2]|0)+164>>2]=ab|$a|128;Ha=Ya+1|0;c[Xa+(Ya<<2)>>2]=_a;if((Ha&127|0)==0){if((Xa|0)==0){cb=kk((Ya<<2)+516|0)|0}else{cb=mk(Xa,(Ya<<2)+516|0)|0}db=cb}else{db=Xa}va=Za+1|0;wa=c[(c[(c[ua>>2]|0)+204>>2]|0)+(va<<2)>>2]|0;if((wa|0)==0){Ca=Ha;Da=db;break}else{Xa=db;Ya=Ha;Za=va;_a=wa}}}}while(0);ua=c[L>>2]|0;wa=c[ua+184>>2]|0;if((qa|0)>=(c[wa+(ka*44|0)>>2]|0)){eb=Da;fb=Ca;gb=ua;break b}ua=c[(c[wa+(ka*44|0)+4>>2]|0)+(qa<<2)>>2]|0;pa=Da;sa=Ca;qa=qa+1|0;ta=ua}}else{eb=ha;fb=ia;gb=la}}while(0);hb=ka+1|0;if((ka|0)<(b[gb+226>>1]|0)){ha=eb;ia=fb;ja=oa;ka=hb;la=gb}else{za=63;break}}if((za|0)==22){cc(151800,123888,319,171096)}else if((za|0)==63){ca=eb;ea=fb;fa=(oa<<5)+11520|0;ga=hb;break}}}while(0);Jb(ca|0,ea|0,4,194);c[R+84>>2]=jk(fa)|0;$=K+16|0;c[$>>2]=jk(ga<<5)|0;ba=(M|0)==2;do{if(ba){T=c[(c[L>>2]|0)+180>>2]|0;if((T|0)==0){break}else{ib=T}do{T=ib+8|0;aa=c[T>>2]|0;do{if((a[aa+156|0]|0)==1){if((c[aa+104>>2]|0)==0){jb=aa;break}if((c[aa+176>>2]|0)==0){jb=aa;break}la=(c[c[aa+180>>2]>>2]|0)+8|0;ka=c[la>>2]|0;if((a[ka+112|0]|0)==0){kb=la;lb=ka}else{la=ka;while(1){ka=(c[la+116>>2]|0)+8|0;ja=c[ka>>2]|0;if((a[ja+112|0]|0)==0){kb=ka;lb=ja;break}else{la=ja}}}la=c[lb+96>>2]|0;V=+h[la+24>>3];ra=+h[la+32>>3];la=(c[(c[(Hx(ib)|0)+8>>2]|0)+116>>2]&1|0)==0;h[(c[(c[kb>>2]|0)+96>>2]|0)+56>>3]=+h[(c[T>>2]|0)+16>>3]+(la?V:ra)*.5;h[(c[(c[kb>>2]|0)+96>>2]|0)+64>>3]=+h[(c[T>>2]|0)+24>>3];a[(c[(c[kb>>2]|0)+96>>2]|0)+81|0]=1;jb=c[T>>2]|0}else{jb=aa}}while(0);ib=c[jb+164>>2]|0;}while((ib|0)!=0)}}while(0);if((ea|0)>0){aa=p;T=q|0;la=p|0;ja=q|0;ka=q+8|0;ia=s+52|0;ha=t+52|0;ma=(M|0)==10;na=R+80|0;ta=j+52|0;qa=k+52|0;sa=o;pa=o|0;ua=o|0;wa=o+8|0;va=o+16|0;Ha=o+64|0;Aa=o+72|0;La=o+48|0;ya=o+64|0;Ia=o+32|0;mb=o+96|0;nb=o+96|0;ob=o+104|0;pb=o+80|0;qb=l+52|0;rb=m+52|0;sb=q;tb=ja+32|0;ub=ja-32|0;vb=u;wb=v;xb=x|0;yb=y|0;zb=z|0;Ab=A;Bb=B;Cb=D;Db=E;Eb=F;Fb=G;Gb=H;Hb=u|0;Ib=x|0;Kb=x+8|0;Lb=v|0;Mb=y|0;Nb=y+8|0;Ob=w|0;Pb=z|0;Qb=z+8|0;Rb=x;Sb=Ib+32|0;Tb=Ib-32|0;Ub=y;Vb=Mb+32|0;Wb=Mb-32|0;Xb=z;Yb=Pb+32|0;Zb=Pb-32|0;_b=A|0;$b=A+16|0;ac=A+52|0;bc=B+52|0;dc=R+56|0;ec=R+69|0;fc=R+16|0;gc=R+29|0;hc=B|0;ic=B+16|0;jc=J|0;kc=J;lc=P+32|0;mc=P-32|0;nc=I|0;oc=I;pc=N+32|0;qc=N-32|0;rc=0;while(1){sc=ca+(rc<<2)|0;tc=c[sc>>2]|0;uc=tc+8|0;vc=c[uc>>2]|0;wc=c[vc+172>>2]|0;if((wc|0)==0){xc=tc;yc=vc}else{zc=wc;while(1){Ac=c[zc+8>>2]|0;wc=c[Ac+172>>2]|0;if((wc|0)==0){break}else{zc=wc}}xc=zc;yc=Ac}wc=c[yc+116>>2]|0;if((wc|0)==0){Bc=xc}else{Cc=wc;while(1){wc=c[(c[Cc+8>>2]|0)+116>>2]|0;if((wc|0)==0){break}else{Cc=wc}}Bc=Cc}if((a[vc+44|0]|0)==0){zc=(a[vc+84|0]|0)==0?Bc:tc;Dc=zc;Fc=c[zc+8>>2]|0}else{Dc=tc;Fc=vc}zc=Dc+8|0;if((c[Fc+164>>2]&32|0)==0){Gc=Dc}else{wc=c[O>>2]|0;tF(wc|0,Fc|0,176)|0;tF(nc|0,Dc|0,32)|0;c[O>>2]=wc;wc=Dc;c[((c[oc>>2]&3|0)==3?N:pc)+28>>2]=c[((c[wc>>2]&3|0)==2?Dc:Dc-32|0)+28>>2];c[((c[oc>>2]&3|0)==2?N:qc)+28>>2]=c[((c[wc>>2]&3|0)==3?Dc:Dc+32|0)+28>>2];wc=c[O>>2]|0;Hc=wc+16|0;Ic=(c[zc>>2]|0)+56|0;c[Hc>>2]=c[Ic>>2];c[Hc+4>>2]=c[Ic+4>>2];c[Hc+8>>2]=c[Ic+8>>2];c[Hc+12>>2]=c[Ic+12>>2];c[Hc+16>>2]=c[Ic+16>>2];c[Hc+20>>2]=c[Ic+20>>2];c[Hc+24>>2]=c[Ic+24>>2];c[Hc+28>>2]=c[Ic+28>>2];c[Hc+32>>2]=c[Ic+32>>2];c[Hc+36>>2]=c[Ic+36>>2];Ic=wc+56|0;Hc=(c[zc>>2]|0)+16|0;c[Ic>>2]=c[Hc>>2];c[Ic+4>>2]=c[Hc+4>>2];c[Ic+8>>2]=c[Hc+8>>2];c[Ic+12>>2]=c[Hc+12>>2];c[Ic+16>>2]=c[Hc+16>>2];c[Ic+20>>2]=c[Hc+20>>2];c[Ic+24>>2]=c[Hc+24>>2];c[Ic+28>>2]=c[Hc+28>>2];c[Ic+32>>2]=c[Hc+32>>2];c[Ic+36>>2]=c[Hc+36>>2];a[wc+112|0]=1;c[wc+116>>2]=Dc;Gc=N}wc=rc+1|0;c:do{if((wc|0)<(ea|0)){Hc=Gc+8|0;Ic=1;zc=wc;while(1){Jc=ca+(zc<<2)|0;Kc=c[Jc>>2]|0;Lc=Kc+8|0;Mc=c[Lc>>2]|0;Nc=c[Mc+172>>2]|0;if((Nc|0)==0){Oc=Kc;Pc=Mc}else{Qc=Nc;while(1){Rc=c[Qc+8>>2]|0;Nc=c[Rc+172>>2]|0;if((Nc|0)==0){break}else{Qc=Nc}}Oc=Qc;Pc=Rc}Nc=c[Pc+116>>2]|0;if((Nc|0)==0){Sc=Oc}else{Tc=Nc;while(1){Nc=c[(c[Tc+8>>2]|0)+116>>2]|0;if((Nc|0)==0){break}else{Tc=Nc}}Sc=Tc}if((Bc|0)!=(Sc|0)){Uc=Ic;Vc=zc;break c}if((a[(c[uc>>2]|0)+113|0]|0)==0){if((a[Mc+44|0]|0)==0){Qc=(a[Mc+84|0]|0)==0?Bc:Kc;Wc=Qc;Xc=c[Qc+8>>2]|0}else{Wc=Kc;Xc=Mc}Qc=Wc+8|0;if((c[Xc+164>>2]&32|0)==0){Yc=Xc}else{Nc=c[Q>>2]|0;tF(Nc|0,Xc|0,176)|0;tF(jc|0,Wc|0,32)|0;c[Q>>2]=Nc;Nc=Wc;c[((c[kc>>2]&3|0)==3?P:lc)+28>>2]=c[((c[Nc>>2]&3|0)==2?Wc:Wc-32|0)+28>>2];c[((c[kc>>2]&3|0)==2?P:mc)+28>>2]=c[((c[Nc>>2]&3|0)==3?Wc:Wc+32|0)+28>>2];Nc=c[Q>>2]|0;Zc=Nc+16|0;_c=(c[Qc>>2]|0)+56|0;c[Zc>>2]=c[_c>>2];c[Zc+4>>2]=c[_c+4>>2];c[Zc+8>>2]=c[_c+8>>2];c[Zc+12>>2]=c[_c+12>>2];c[Zc+16>>2]=c[_c+16>>2];c[Zc+20>>2]=c[_c+20>>2];c[Zc+24>>2]=c[_c+24>>2];c[Zc+28>>2]=c[_c+28>>2];c[Zc+32>>2]=c[_c+32>>2];c[Zc+36>>2]=c[_c+36>>2];_c=Nc+56|0;Zc=(c[Qc>>2]|0)+16|0;c[_c>>2]=c[Zc>>2];c[_c+4>>2]=c[Zc+4>>2];c[_c+8>>2]=c[Zc+8>>2];c[_c+12>>2]=c[Zc+12>>2];c[_c+16>>2]=c[Zc+16>>2];c[_c+20>>2]=c[Zc+20>>2];c[_c+24>>2]=c[Zc+24>>2];c[_c+28>>2]=c[Zc+28>>2];c[_c+32>>2]=c[Zc+32>>2];c[_c+36>>2]=c[Zc+36>>2];a[Nc+112|0]=1;c[Nc+116>>2]=Wc;Yc=Nc}Nc=c[Hc>>2]|0;Zc=Nc+16|0;_c=Yc+16|0;Qc=a[Nc+44|0]|0;if((a[Yc+44|0]|0)==0){$c=Qc<<24>>24!=0|0}else{if(Qc<<24>>24==0){Uc=Ic;Vc=zc;break c}if((~~(+h[Zc>>3]- +h[_c>>3])|0)!=0){Uc=Ic;Vc=zc;break c}$c=~~(+h[Nc+24>>3]- +h[Yc+24>>3])}if(($c|0)!=0){Uc=Ic;Vc=zc;break c}_c=Nc+56|0;Zc=Yc+56|0;Qc=a[Nc+84|0]|0;if((a[Yc+84|0]|0)==0){ad=Qc<<24>>24!=0|0}else{if(Qc<<24>>24==0){Uc=Ic;Vc=zc;break c}if((~~(+h[_c>>3]- +h[Zc>>3])|0)!=0){Uc=Ic;Vc=zc;break c}ad=~~(+h[Nc+64>>3]- +h[Yc+64>>3])}if((ad|0)!=0){Uc=Ic;Vc=zc;break c}Nc=c[uc>>2]|0;if((c[Nc+164>>2]&15|0)==2){if((c[Nc+96>>2]|0)!=(c[(c[Lc>>2]|0)+96>>2]|0)){Uc=Ic;Vc=zc;break c}}if((c[(c[(c[Jc>>2]|0)+8>>2]|0)+164>>2]&64|0)!=0){Uc=Ic;Vc=zc;break c}}Nc=Ic+1|0;Zc=zc+1|0;if((Zc|0)<(ea|0)){Ic=Nc;zc=Zc}else{Uc=Nc;Vc=Zc;break}}}else{Uc=1;Vc=wc}}while(0);wc=c[tc>>2]&3;uc=c[((wc|0)==3?tc:tc+32|0)+28>>2]|0;vc=c[((wc|0)==2?tc:tc-32|0)+28>>2]|0;wc=c[uc+8>>2]|0;Cc=c[wc+232>>2]|0;d:do{if((uc|0)==(vc|0)){zc=c[L>>2]|0;do{if((Cc|0)==(b[zc+226>>1]|0)){if((Cc|0)>0){bd=~~(+h[(c[(c[c[(c[zc+184>>2]|0)+((Cc-1|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]- +h[wc+24>>3]);break}else{bd=~~+h[wc+80>>3];break}}else{if((Cc|0)==(b[zc+224>>1]|0)){bd=~~(+h[wc+24>>3]- +h[(c[(c[c[(c[zc+184>>2]|0)+((Cc+1|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]);break}else{Ic=c[zc+184>>2]|0;ra=+h[wc+24>>3];Hc=~~(+h[(c[(c[c[Ic+((Cc-1|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]-ra);Zc=~~(ra- +h[(c[(c[c[Ic+((Cc+1|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]);bd=(Hc|0)<(Zc|0)?Hc:Zc;break}}}while(0);im(S,ca,rc,Uc,+(c[U>>2]|0),+((bd|0)/2|0|0),11848);if((Uc|0)>0){cd=0}else{break}do{zc=c[(c[(c[ca+(cd+rc<<2)>>2]|0)+8>>2]|0)+96>>2]|0;if((zc|0)!=0){_m(d,zc)}cd=cd+1|0;}while((cd|0)<(Uc|0))}else{if((Cc|0)==(c[(c[vc+8>>2]|0)+232>>2]|0)){c[ka>>2]=la;zc=c[sc>>2]|0;Zc=zc+8|0;Hc=c[Zc>>2]|0;Ic=a[Hc+113|0]|0;if((c[Hc+164>>2]&32|0)==0){dd=zc}else{tF(aa|0,Hc|0,176)|0;tF(T|0,zc|0,32)|0;c[ka>>2]=la;Hc=zc;c[((c[sb>>2]&3|0)==3?ja:tb)+28>>2]=c[((c[Hc>>2]&3|0)==2?zc:zc-32|0)+28>>2];c[((c[sb>>2]&3|0)==2?ja:ub)+28>>2]=c[((c[Hc>>2]&3|0)==3?zc:zc+32|0)+28>>2];Hc=(c[ka>>2]|0)+16|0;Nc=(c[Zc>>2]|0)+56|0;c[Hc>>2]=c[Nc>>2];c[Hc+4>>2]=c[Nc+4>>2];c[Hc+8>>2]=c[Nc+8>>2];c[Hc+12>>2]=c[Nc+12>>2];c[Hc+16>>2]=c[Nc+16>>2];c[Hc+20>>2]=c[Nc+20>>2];c[Hc+24>>2]=c[Nc+24>>2];c[Hc+28>>2]=c[Nc+28>>2];c[Hc+32>>2]=c[Nc+32>>2];c[Hc+36>>2]=c[Nc+36>>2];Nc=(c[ka>>2]|0)+56|0;Hc=(c[Zc>>2]|0)+16|0;c[Nc>>2]=c[Hc>>2];c[Nc+4>>2]=c[Hc+4>>2];c[Nc+8>>2]=c[Hc+8>>2];c[Nc+12>>2]=c[Hc+12>>2];c[Nc+16>>2]=c[Hc+16>>2];c[Nc+20>>2]=c[Hc+20>>2];c[Nc+24>>2]=c[Hc+24>>2];c[Nc+28>>2]=c[Hc+28>>2];c[Nc+32>>2]=c[Hc+32>>2];c[Nc+36>>2]=c[Hc+36>>2];a[(c[ka>>2]|0)+112|0]=1;c[(c[ka>>2]|0)+116>>2]=zc;dd=ja}e:do{if((Uc|0)>1){zc=1;while(1){Hc=zc+1|0;if((a[(c[(c[ca+(zc+rc<<2)>>2]|0)+8>>2]|0)+113|0]|0)!=0){break e}if((Hc|0)<(Uc|0)){zc=Hc}else{za=133;break}}}else{za=133}}while(0);do{if((za|0)==133){za=0;if(Ic<<24>>24!=0){break}zc=dd+8|0;Jc=c[zc>>2]|0;if((c[Jc+96>>2]|0)!=0){Lc=dd;Mc=c[Lc>>2]&3;Kc=c[((Mc|0)==3?dd:dd+32|0)+28>>2]|0;Tc=dd-32|0;Hc=c[((Mc|0)==2?dd:Tc)+28>>2]|0;Mc=Hx(Kc|0)|0;Nc=c[zc>>2]|0;Zc=c[Nc+172>>2]|0;while(1){_c=c[(c[Zc+8>>2]|0)+172>>2]|0;if((_c|0)==0){break}else{Zc=_c}}_c=(c[((c[Zc>>2]&3|0)==3?Zc:Zc+32|0)+28>>2]|0)+8|0;Qc=(c[Nc+96>>2]|0)+56|0;ed=(c[_c>>2]|0)+16|0;c[Qc>>2]=c[ed>>2];c[Qc+4>>2]=c[ed+4>>2];c[Qc+8>>2]=c[ed+8>>2];c[Qc+12>>2]=c[ed+12>>2];a[(c[(c[zc>>2]|0)+96>>2]|0)+81|0]=1;if(ba){ed=c[Kc+8>>2]|0;Qc=c[zc>>2]|0;ra=+h[ed+24>>3]+ +h[Qc+24>>3];fd=c[Hc+8>>2]|0;V=+h[fd+16>>3]+ +h[Qc+56>>3];gd=+h[fd+24>>3]+ +h[Qc+64>>3];fd=c[Qc+96>>2]|0;hd=+h[fd+56>>3];id=+h[fd+64>>3]- +h[fd+32>>3]*.5;h[ua>>3]=+h[ed+16>>3]+ +h[Qc+16>>3];h[wa>>3]=ra;c[va>>2]=c[sa>>2];c[va+4>>2]=c[sa+4>>2];c[va+8>>2]=c[sa+8>>2];c[va+12>>2]=c[sa+12>>2];h[Ha>>3]=hd;h[Aa>>3]=id;c[La>>2]=c[ya>>2];c[La+4>>2]=c[ya+4>>2];c[La+8>>2]=c[ya+8>>2];c[La+12>>2]=c[ya+12>>2];c[Ia>>2]=c[ya>>2];c[Ia+4>>2]=c[ya+4>>2];c[Ia+8>>2]=c[ya+8>>2];c[Ia+12>>2]=c[ya+12>>2];h[nb>>3]=V;h[ob>>3]=gd;c[pb>>2]=c[mb>>2];c[pb+4>>2]=c[mb+4>>2];c[pb+8>>2]=c[mb+8>>2];c[pb+12>>2]=c[mb+12>>2];c[n>>2]=7;jd=pa;kd=7}else{Qc=c[_c>>2]|0;gd=+h[Qc+16>>3];V=gd- +h[Qc+88>>3];id=gd+ +h[Qc+96>>3];gd=+h[Qc+24>>3];hd=gd+ +h[Qc+80>>3]*.5;Qc=c[Kc+8>>2]|0;_c=c[Qc+232>>2]|0;ed=c[(c[Mc+8>>2]|0)+184>>2]|0;fd=~~(+(~~(gd- +(c[ed+(_c*44|0)+16>>2]|0)- +h[Qc+24>>3]+ +(c[ed+(_c*44|0)+20>>2]|0))|0)/6.0);if((fd|0)<5){ld=5.0}else{ld=+(fd|0)}gd=hd-ld;No(K,S,Kc,dd,l,1);No(K,S,Hc,dd,m,0);fd=c[qb>>2]|0;_c=fd-1|0;ra=+h[l+56+(_c<<5)>>3];h[22617]=ra;h[22618]=+h[l+56+(_c<<5)+24>>3];h[22619]=V;h[22620]=gd;h[22621]=ra;h[22622]=gd;_c=(c[rb>>2]|0)-1|0;ra=+h[m+56+(_c<<5)+16>>3];h[22623]=ra;h[22624]=hd;h[22625]=id;h[22628]=gd;h[22626]=+h[m+56+(_c<<5)+24>>3];h[22627]=ra;if((fd|0)>0){fd=0;do{dm(S,l+56+(fd<<5)|0);fd=fd+1|0;}while((fd|0)<(c[qb>>2]|0))}dm(S,180936);dm(S,180968);dm(S,181e3);fd=c[rb>>2]|0;if((fd|0)>0){Hc=fd;do{Hc=Hc-1|0;dm(S,m+56+(Hc<<5)|0);}while((Hc|0)>0)}if(ma){md=il(S,n)|0}else{md=kl(S,n)|0}Hc=c[n>>2]|0;if((Hc|0)==0){break d}else{jd=md;kd=Hc}}cm(dd,c[((c[Lc>>2]&3|0)==2?dd:Tc)+28>>2]|0,jd,kd,11848);break d}if(ba){Hc=c[dd>>2]&3;Mo(c[(c[((Hc|0)==3?dd:dd+32|0)+28>>2]|0)+8>>2]|0,c[(c[((Hc|0)==2?dd:dd-32|0)+28>>2]|0)+8>>2]|0,ca,rc,Uc,2);break d}Hc=a[Jc+49|0]|0;fd=a[Jc+89|0]|0;do{if(Hc<<24>>24!=1|fd<<24>>24==4){if(!(fd<<24>>24!=1|Hc<<24>>24==4)){break}Kc=c[dd>>2]&3;Mc=c[((Kc|0)==3?dd:dd+32|0)+28>>2]|0;zc=c[((Kc|0)==2?dd:dd-32|0)+28>>2]|0;Kc=Hx(Mc|0)|0;Nc=c[Mc+8>>2]|0;Zc=c[Nc+232>>2]|0;_c=c[Kc+8>>2]|0;if((Zc|0)>0){Kc=c[_c+184>>2]|0;ed=((a[_c+113|0]&1)==0?-1:-2)+Zc|0;nd=+h[(c[(c[c[Kc+(ed*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]- +(c[Kc+(ed*44|0)+16>>2]|0)- +h[Nc+24>>3]- +(c[Kc+(Zc*44|0)+20>>2]|0)}else{nd=+(c[_c+240>>2]|0)}ra=+(Uc+1|0);gd=+(c[U>>2]|0)/ra;id=nd/ra;No(K,S,Mc,dd,s,1);No(K,S,zc,dd,t,0);if((Uc|0)>0){od=0}else{break d}while(1){zc=c[ca+(od+rc<<2)>>2]|0;Mc=c[ia>>2]|0;_c=Mc-1|0;ra=+h[s+56+(_c<<5)>>3];hd=+h[s+56+(_c<<5)+16>>3];V=+h[s+56+(_c<<5)+24>>3];h[22617]=ra;h[22618]=V;od=od+1|0;pd=+(od|0);qd=gd*pd;h[22619]=qd+hd;hd=id*pd+V;h[22620]=hd;h[22621]=ra;h[22622]=hd;_c=(c[ha>>2]|0)-1|0;ra=+h[t+56+(_c<<5)+16>>3];h[22623]=ra;h[22624]=id+hd;V=+h[t+56+(_c<<5)>>3];pd=+h[t+56+(_c<<5)+24>>3];h[22627]=ra;h[22626]=pd;h[22625]=V-qd;h[22628]=hd;if((Mc|0)>0){Mc=0;do{dm(S,s+56+(Mc<<5)|0);Mc=Mc+1|0;}while((Mc|0)<(c[ia>>2]|0))}dm(S,180936);dm(S,180968);dm(S,181e3);Mc=c[ha>>2]|0;if((Mc|0)>0){_c=Mc;do{_c=_c-1|0;dm(S,t+56+(_c<<5)|0);}while((_c|0)>0)}if(ma){rd=il(S,r)|0}else{rd=kl(S,r)|0}_c=c[r>>2]|0;if((_c|0)==0){break d}cm(zc,c[((c[zc>>2]&3|0)==2?zc:zc-32|0)+28>>2]|0,rd,_c,11848);c[na>>2]=0;if((od|0)>=(Uc|0)){break d}}}}while(0);Hc=c[dd>>2]&3;fd=c[((Hc|0)==3?dd:dd+32|0)+28>>2]|0;Jc=c[((Hc|0)==2?dd:dd-32|0)+28>>2]|0;Hc=Hx(fd|0)|0;Tc=c[fd+8>>2]|0;Lc=c[Tc+232>>2]|0;_c=c[Hc+8>>2]|0;if((Lc|0)<(b[_c+226>>1]|0)){Hc=c[_c+184>>2]|0;Mc=Lc+1|0;sd=+h[Tc+24>>3]- +(c[Hc+(Lc*44|0)+24>>2]|0)-(+h[(c[(c[c[Hc+(Mc*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]+ +(c[Hc+(Mc*44|0)+28>>2]|0))}else{sd=+(c[_c+240>>2]|0)}id=+(Uc+1|0);gd=+(c[U>>2]|0)/id;hd=sd/id;Oo(K,S,fd,dd,j,1);Oo(K,S,Jc,dd,k,0);if((Uc|0)<=0){break d}if(ma){Jc=0;while(1){fd=c[ca+(Jc+rc<<2)>>2]|0;_c=c[ta>>2]|0;Mc=_c-1|0;id=+h[j+56+(Mc<<5)>>3];qd=+h[j+56+(Mc<<5)+8>>3];V=+h[j+56+(Mc<<5)+16>>3];h[22617]=id;h[22620]=qd;Jc=Jc+1|0;pd=+(Jc|0);ra=gd*pd;h[22619]=ra+V;V=qd-hd*pd;h[22618]=V;h[22621]=id;h[22624]=V;Mc=(c[qa>>2]|0)-1|0;id=+h[k+56+(Mc<<5)+16>>3];h[22623]=id;h[22622]=V-hd;pd=+h[k+56+(Mc<<5)>>3];qd=+h[k+56+(Mc<<5)+8>>3];h[22627]=id;h[22628]=qd;h[22625]=pd-ra;h[22626]=V;if((_c|0)>0){_c=0;do{dm(S,j+56+(_c<<5)|0);_c=_c+1|0;}while((_c|0)<(c[ta>>2]|0))}dm(S,180936);dm(S,180968);dm(S,181e3);_c=c[qa>>2]|0;if((_c|0)>0){Mc=_c;do{Mc=Mc-1|0;dm(S,k+56+(Mc<<5)|0);}while((Mc|0)>0)}Mc=il(S,g)|0;_c=c[g>>2]|0;if((_c|0)==0){break d}cm(fd,c[((c[fd>>2]&3|0)==2?fd:fd-32|0)+28>>2]|0,Mc,_c,11848);c[na>>2]=0;if((Jc|0)>=(Uc|0)){break d}}}else{Jc=0;while(1){_c=c[ca+(Jc+rc<<2)>>2]|0;Mc=c[ta>>2]|0;Hc=Mc-1|0;V=+h[j+56+(Hc<<5)>>3];ra=+h[j+56+(Hc<<5)+8>>3];pd=+h[j+56+(Hc<<5)+16>>3];h[22617]=V;h[22620]=ra;Jc=Jc+1|0;qd=+(Jc|0);id=gd*qd;h[22619]=id+pd;pd=ra-hd*qd;h[22618]=pd;h[22621]=V;h[22624]=pd;Hc=(c[qa>>2]|0)-1|0;V=+h[k+56+(Hc<<5)+16>>3];h[22623]=V;h[22622]=pd-hd;qd=+h[k+56+(Hc<<5)>>3];ra=+h[k+56+(Hc<<5)+8>>3];h[22627]=V;h[22628]=ra;h[22625]=qd-id;h[22626]=pd;if((Mc|0)>0){Mc=0;do{dm(S,j+56+(Mc<<5)|0);Mc=Mc+1|0;}while((Mc|0)<(c[ta>>2]|0))}dm(S,180936);dm(S,180968);dm(S,181e3);Mc=c[qa>>2]|0;if((Mc|0)>0){fd=Mc;do{fd=fd-1|0;dm(S,k+56+(fd<<5)|0);}while((fd|0)>0)}fd=kl(S,g)|0;Mc=c[g>>2]|0;if((Mc|0)==0){break d}cm(_c,c[((c[_c>>2]&3|0)==2?_c:_c-32|0)+28>>2]|0,fd,Mc,11848);c[na>>2]=0;if((Jc|0)>=(Uc|0)){break d}}}}}while(0);Lo(ca,rc,Uc,dd,M);break}c[Kb>>2]=Hb;c[Nb>>2]=Lb;c[Qb>>2]=Ob;if((c[44380]|0)==0){c[44380]=kk(32e3)|0;c[44378]=kk(32e3)|0;c[44384]=2e3;c[44382]=2e3}Ic=c[sc>>2]|0;Jc=Ic;Mc=Ic+32|0;fd=Hx(c[((c[Jc>>2]&3|0)==3?Ic:Mc)+28>>2]|0)|0;Hc=c[Jc>>2]&3;Lc=Ic-32|0;Tc=(c[(c[(c[((Hc|0)==3?Ic:Mc)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((Hc|0)==2?Ic:Lc)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0;Hc=Ic+8|0;Zc=c[Hc>>2]|0;do{if((((Tc|0)>-1?Tc:-Tc|0)|0)>1){tF(vb|0,Zc|0,176)|0;Kc=Ic|0;tF(xb|0,Kc|0,32)|0;c[Kb>>2]=Hb;Nc=c[Hc>>2]|0;if((c[Nc+164>>2]&32|0)==0){tF(wb|0,Nc|0,176)|0;tF(yb|0,Kc|0,32)|0;c[Nb>>2]=Lb;c[((c[Rb>>2]&3|0)==3?Ib:Sb)+28>>2]=c[((c[Jc>>2]&3|0)==3?Ic:Mc)+28>>2]}else{ed=c[Nb>>2]|0;tF(ed|0,Nc|0,176)|0;tF(yb|0,Kc|0,32)|0;c[Nb>>2]=ed;c[((c[Ub>>2]&3|0)==3?Mb:Vb)+28>>2]=c[((c[Jc>>2]&3|0)==2?Ic:Lc)+28>>2];c[((c[Ub>>2]&3|0)==2?Mb:Wb)+28>>2]=c[((c[Jc>>2]&3|0)==3?Ic:Mc)+28>>2];ed=(c[Nb>>2]|0)+16|0;Kc=(c[Hc>>2]|0)+56|0;c[ed>>2]=c[Kc>>2];c[ed+4>>2]=c[Kc+4>>2];c[ed+8>>2]=c[Kc+8>>2];c[ed+12>>2]=c[Kc+12>>2];c[ed+16>>2]=c[Kc+16>>2];c[ed+20>>2]=c[Kc+20>>2];c[ed+24>>2]=c[Kc+24>>2];c[ed+28>>2]=c[Kc+28>>2];c[ed+32>>2]=c[Kc+32>>2];c[ed+36>>2]=c[Kc+36>>2];Kc=(c[Nb>>2]|0)+56|0;ed=(c[Hc>>2]|0)+16|0;c[Kc>>2]=c[ed>>2];c[Kc+4>>2]=c[ed+4>>2];c[Kc+8>>2]=c[ed+8>>2];c[Kc+12>>2]=c[ed+12>>2];c[Kc+16>>2]=c[ed+16>>2];c[Kc+20>>2]=c[ed+20>>2];c[Kc+24>>2]=c[ed+24>>2];c[Kc+28>>2]=c[ed+28>>2];c[Kc+32>>2]=c[ed+32>>2];c[Kc+36>>2]=c[ed+36>>2];a[(c[Nb>>2]|0)+112|0]=1;c[(c[Nb>>2]|0)+116>>2]=Ic;c[((c[Rb>>2]&3|0)==3?Ib:Sb)+28>>2]=c[((c[Jc>>2]&3|0)==2?Ic:Lc)+28>>2];ed=(c[Kb>>2]|0)+16|0;Kc=(c[Hc>>2]|0)+56|0;c[ed>>2]=c[Kc>>2];c[ed+4>>2]=c[Kc+4>>2];c[ed+8>>2]=c[Kc+8>>2];c[ed+12>>2]=c[Kc+12>>2];c[ed+16>>2]=c[Kc+16>>2];c[ed+20>>2]=c[Kc+20>>2];c[ed+24>>2]=c[Kc+24>>2];c[ed+28>>2]=c[Kc+28>>2];c[ed+32>>2]=c[Kc+32>>2];c[ed+36>>2]=c[Kc+36>>2]}Kc=c[Hc>>2]|0;ed=c[Kc+172>>2]|0;if((ed|0)==0){td=Ic;ud=Kc}else{Kc=ed;while(1){vd=c[Kc+8>>2]|0;ed=c[vd+172>>2]|0;if((ed|0)==0){break}else{Kc=ed}}td=Kc;ud=vd}ed=c[ud+116>>2]|0;if((ed|0)==0){wd=td}else{Nc=ed;while(1){ed=c[(c[Nc+8>>2]|0)+116>>2]|0;if((ed|0)==0){break}else{Nc=ed}}wd=Nc}Kc=c[(c[wd+8>>2]|0)+172>>2]|0;if((Kc|0)==0){xd=wd}else{ed=Kc;while(1){Kc=c[(c[ed+8>>2]|0)+172>>2]|0;if((Kc|0)==0){break}else{ed=Kc}}xd=ed}c[((c[Rb>>2]&3|0)==2?Ib:Tb)+28>>2]=c[((c[xd>>2]&3|0)==2?xd:xd-32|0)+28>>2];a[(c[Kb>>2]|0)+84|0]=0;a[(c[Kb>>2]|0)+112|0]=1;h[(c[Kb>>2]|0)+64>>3]=0.0;h[(c[Kb>>2]|0)+56>>3]=0.0;c[(c[Kb>>2]|0)+116>>2]=Ic;yd=Ib;zd=1}else{if((c[Zc+164>>2]&32|0)==0){yd=Ic;zd=0;break}Nc=c[Kb>>2]|0;tF(Nc|0,Zc|0,176)|0;tF(xb|0,Ic|0,32)|0;c[Kb>>2]=Nc;c[((c[Rb>>2]&3|0)==3?Ib:Sb)+28>>2]=c[((c[Jc>>2]&3|0)==2?Ic:Lc)+28>>2];c[((c[Rb>>2]&3|0)==2?Ib:Tb)+28>>2]=c[((c[Jc>>2]&3|0)==3?Ic:Mc)+28>>2];Nc=(c[Kb>>2]|0)+16|0;Kc=(c[Hc>>2]|0)+56|0;c[Nc>>2]=c[Kc>>2];c[Nc+4>>2]=c[Kc+4>>2];c[Nc+8>>2]=c[Kc+8>>2];c[Nc+12>>2]=c[Kc+12>>2];c[Nc+16>>2]=c[Kc+16>>2];c[Nc+20>>2]=c[Kc+20>>2];c[Nc+24>>2]=c[Kc+24>>2];c[Nc+28>>2]=c[Kc+28>>2];c[Nc+32>>2]=c[Kc+32>>2];c[Nc+36>>2]=c[Kc+36>>2];Kc=(c[Kb>>2]|0)+56|0;Nc=(c[Hc>>2]|0)+16|0;c[Kc>>2]=c[Nc>>2];c[Kc+4>>2]=c[Nc+4>>2];c[Kc+8>>2]=c[Nc+8>>2];c[Kc+12>>2]=c[Nc+12>>2];c[Kc+16>>2]=c[Nc+16>>2];c[Kc+20>>2]=c[Nc+20>>2];c[Kc+24>>2]=c[Nc+24>>2];c[Kc+28>>2]=c[Nc+28>>2];c[Kc+32>>2]=c[Nc+32>>2];c[Kc+36>>2]=c[Nc+36>>2];a[(c[Kb>>2]|0)+112|0]=1;c[(c[Kb>>2]|0)+116>>2]=Ic;yd=Ib;zd=0}}while(0);do{if(ba){Ic=c[44380]|0;Hc=yd+8|0;Mc=c[Hc>>2]|0;if((a[Mc+112|0]|0)==0){Ad=yd;Bd=Hc}else{Hc=Mc;do{Cd=c[Hc+116>>2]|0;Dd=Cd+8|0;Hc=c[Dd>>2]|0;}while((a[Hc+112|0]|0)!=0);Ad=Cd;Bd=Dd}Hc=Ad;ed=c[Hc>>2]|0;Mc=ed&3;Jc=c[((Mc|0)==2?Ad:Ad-32|0)+28>>2]|0;Lc=Ad+32|0;Zc=c[((Mc|0)==3?Ad:Lc)+28>>2]|0;Mc=Jc+8|0;Tc=Zc+8|0;Nc=(c[(c[Mc>>2]|0)+232>>2]|0)-(c[(c[Tc>>2]|0)+232>>2]|0)|0;Kc=(Nc|0)>-1?Nc:-Nc|0;if((Kc|0)==2){if((a[(c[(Hx(Jc|0)|0)+8>>2]|0)+113|0]&1)!=0){za=220;break}Ed=c[Hc>>2]|0}else if((Kc|0)==1){za=220;break}else{Ed=ed}if((c[((c[yd>>2]&3|0)==3?yd:yd+32|0)+28>>2]|0)==(c[((Ed&3|0)==3?Ad:Lc)+28>>2]|0)){Lc=c[Tc>>2]|0;ed=c[Bd>>2]|0;Kc=c[Mc>>2]|0;Fd=+h[Kc+16>>3]+ +h[ed+56>>3];Gd=+h[Kc+24>>3]+ +h[ed+64>>3];Hd=+h[Lc+16>>3]+ +h[ed+16>>3];Id=+h[Lc+24>>3]+ +h[ed+24>>3];Jd=ed;Kd=Jc}else{ed=c[Mc>>2]|0;Mc=c[Bd>>2]|0;Lc=c[Tc>>2]|0;Fd=+h[Lc+16>>3]+ +h[Mc+16>>3];Gd=+h[Lc+24>>3]+ +h[Mc+24>>3];Hd=+h[ed+16>>3]+ +h[Mc+56>>3];Id=+h[ed+24>>3]+ +h[Mc+64>>3];Jd=Mc;Kd=Zc}Zc=c[Jd+96>>2]|0;if((Zc|0)==0){Mc=Ic;h[Ic>>3]=Hd;h[Ic+8>>3]=Id;ed=Ic+16|0;c[ed>>2]=c[Mc>>2];c[ed+4>>2]=c[Mc+4>>2];c[ed+8>>2]=c[Mc+8>>2];c[ed+12>>2]=c[Mc+12>>2];Mc=Ic+32|0;h[Ic+32>>3]=Fd;h[Ic+40>>3]=Gd;ed=Ic+48|0;c[ed>>2]=c[Mc>>2];c[ed+4>>2]=c[Mc+4>>2];c[ed+8>>2]=c[Mc+8>>2];c[ed+12>>2]=c[Mc+12>>2];Ld=4;Md=Kd;break}hd=+h[Zc+24>>3];gd=+h[Zc+32>>3];Zc=(c[(c[(Hx(Jc|0)|0)+8>>2]|0)+116>>2]&1|0)==0;pd=Zc?gd:hd;Jc=c[(c[Bd>>2]|0)+96>>2]|0;id=+h[Jc+56>>3];qd=+h[Jc+64>>3];ra=(Zc?hd:gd)*.5;if((~~((Gd-Id)*(id-Hd)-(Fd-Hd)*(qd-Id))|0)>0){Nd=id+ra;Od=qd-pd*.5}else{Nd=id-ra;Od=qd+pd*.5}Zc=Ic;h[Ic>>3]=Hd;h[Ic+8>>3]=Id;Jc=Ic+16|0;c[Jc>>2]=c[Zc>>2];c[Jc+4>>2]=c[Zc+4>>2];c[Jc+8>>2]=c[Zc+8>>2];c[Jc+12>>2]=c[Zc+12>>2];Zc=Ic+64|0;h[Ic+64>>3]=Nd;h[Ic+72>>3]=Od;Jc=Ic+48|0;c[Jc>>2]=c[Zc>>2];c[Jc+4>>2]=c[Zc+4>>2];c[Jc+8>>2]=c[Zc+8>>2];c[Jc+12>>2]=c[Zc+12>>2];Jc=Ic+32|0;c[Jc>>2]=c[Zc>>2];c[Jc+4>>2]=c[Zc+4>>2];c[Jc+8>>2]=c[Zc+8>>2];c[Jc+12>>2]=c[Zc+12>>2];Zc=Ic+96|0;h[Ic+96>>3]=Fd;h[Ic+104>>3]=Gd;Jc=Ic+80|0;c[Jc>>2]=c[Zc>>2];c[Jc+4>>2]=c[Zc+4>>2];c[Jc+8>>2]=c[Zc+8>>2];c[Jc+12>>2]=c[Zc+12>>2];Ld=7;Md=Kd}else{za=220}}while(0);if((za|0)==220){za=0;Zc=c[yd>>2]&3;Jc=c[((Zc|0)==3?yd:yd+32|0)+28>>2]|0;Mc=c[((Zc|0)==2?yd:yd-32|0)+28>>2]|0;Do(D,K,Jc,0,yd);c[Ab>>2]=c[Cb>>2];c[Ab+4>>2]=c[Cb+4>>2];c[Ab+8>>2]=c[Cb+8>>2];c[Ab+12>>2]=c[Cb+12>>2];c[Ab+16>>2]=c[Cb+16>>2];c[Ab+20>>2]=c[Cb+20>>2];c[Ab+24>>2]=c[Cb+24>>2];c[Ab+28>>2]=c[Cb+28>>2];pd=+h[_b>>3];qd=+h[$b>>3];Zc=Jc+8|0;ed=c[Zc>>2]|0;do{if((a[ed+156|0]|0)==1){if((c[ed+176>>2]|0)>1){Pd=1;break}Pd=(c[ed+184>>2]|0)>1|0}else{Pd=0}}while(0);em(S,yd,1,A,Pd);ra=+h[A+56+((c[ac>>2]|0)-1<<5)+8>>3];ed=c[Zc>>2]|0;id=+h[ed+24>>3];Lc=c[ed+232>>2]|0;gd=+(~~(id- +(c[(c[(c[(Hx(Jc|0)|0)+8>>2]|0)+184>>2]|0)+(Lc*44|0)+16>>2]|0))|0);if(pd<qd&gd<ra){Lc=c[ac>>2]|0;c[ac>>2]=Lc+1;h[A+56+(Lc<<5)>>3]=pd;h[A+56+(Lc<<5)+8>>3]=gd;h[A+56+(Lc<<5)+16>>3]=qd;h[A+56+(Lc<<5)+24>>3]=ra}Lc=Mc+8|0;f:do{if((a[(c[Lc>>2]|0)+156|0]|0)==1){ed=fd+8|0;Tc=Mc;Kc=0;Hc=-1;Nc=0;Qc=yd;Qd=Jc;Rd=Lc;while(1){Sd=Tc;Td=0;Ud=Hc;Vd=Nc;Wd=0;Xd=Qc;Yd=Qd;Zd=Rd;while(1){if((Ec[c[2963]&63](Sd)|0)<<24>>24!=0){_d=Sd;$d=Wd;ae=Xd;be=Yd;ce=Zd;de=Kc;ee=Qc;break f}fe=Wd|1;ge=c[(c[Yd+8>>2]|0)+232>>2]|0;he=c[$>>2]|0;ie=he+(ge<<5)|0;ra=+h[ie>>3];je=he+(ge<<5)+8|0;gd=+h[je>>3];ke=he+(ge<<5)+16|0;id=+h[ke>>3];le=he+(ge<<5)+24|0;hd=+h[le>>3];if(ra==id){he=c[(c[ed>>2]|0)+184>>2]|0;me=ge+1|0;V=+(c[_>>2]|0);ne=+h[(c[(c[c[he+(me*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]+ +(c[he+(me*44|0)+20>>2]|0);oe=+(c[Z>>2]|0);pe=+h[(c[(c[c[he+(ge*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]- +(c[he+(ge*44|0)+16>>2]|0);h[ie>>3]=V;h[je>>3]=ne;h[ke>>3]=oe;h[le>>3]=pe;qe=pe;re=oe;se=V;te=ne}else{qe=hd;re=id;se=ra;te=gd}h[180936+(Wd<<5)>>3]=se;h[180944+(Wd<<5)>>3]=te;h[180952+(Wd<<5)>>3]=re;h[180960+(Wd<<5)>>3]=qe;if((Td|0)==0){le=c[Zd>>2]|0;ke=c[c[le+180>>2]>>2]|0;je=c[(c[((c[ke>>2]&3|0)==2?ke:ke-32|0)+28>>2]|0)+8>>2]|0;g:do{if((a[je+156|0]|0)==1){ke=le+16|0;ie=0;ge=je;while(1){he=ge+180|0;if((c[he+4>>2]|0)!=1){ue=ie;break g}if((c[ge+176>>2]|0)!=1){ue=ie;break g}me=ie+1|0;if(+h[ge+16>>3]!=+h[ke>>3]){ue=ie;break g}ve=c[c[he>>2]>>2]|0;he=c[(c[((c[ve>>2]&3|0)==2?ve:ve-32|0)+28>>2]|0)+8>>2]|0;if((a[he+156|0]|0)==1){ie=me;ge=he}else{ue=me;break}}}else{ue=0}}while(0);je=(ue|0)<(((a[(c[ed>>2]|0)+113|0]&1)!=0?5:3)|0);we=je?ue:ue-2|0;xe=je?Ud:1;ye=je&1^1}else{we=Vd;xe=Ud;ye=Td}if(!((ye|0)==0|(xe|0)>0)){break}je=Wd+2|0;Do(E,K,Sd,Xd,c[c[(c[Zd>>2]|0)+180>>2]>>2]|0);le=180936+(fe<<5)|0;c[le>>2]=c[Db>>2];c[le+4>>2]=c[Db+4>>2];c[le+8>>2]=c[Db+8>>2];c[le+12>>2]=c[Db+12>>2];c[le+16>>2]=c[Db+16>>2];c[le+20>>2]=c[Db+20>>2];c[le+24>>2]=c[Db+24>>2];c[le+28>>2]=c[Db+28>>2];le=c[c[(c[Zd>>2]|0)+180>>2]>>2]|0;zc=c[le>>2]&3;ge=c[((zc|0)==3?le:le+32|0)+28>>2]|0;ie=c[((zc|0)==2?le:le-32|0)+28>>2]|0;zc=ie+8|0;if((a[(c[zc>>2]|0)+156|0]|0)==1){Sd=ie;Td=ye;Ud=xe-1|0;Vd=we;Wd=je;Xd=le;Yd=ge;Zd=zc}else{_d=ie;$d=je;ae=le;be=ge;ce=zc;de=Kc;ee=Qc;break f}}Do(F,K,Sd,Xd,c[c[(c[Zd>>2]|0)+180>>2]>>2]|0);c[Bb>>2]=c[Eb>>2];c[Bb+4>>2]=c[Eb+4>>2];c[Bb+8>>2]=c[Eb+8>>2];c[Bb+12>>2]=c[Eb+12>>2];c[Bb+16>>2]=c[Eb+16>>2];c[Bb+20>>2]=c[Eb+20>>2];c[Bb+24>>2]=c[Eb+24>>2];c[Bb+28>>2]=c[Eb+28>>2];Yd=c[(c[((c[Xd>>2]&3|0)==2?Xd:Xd-32|0)+28>>2]|0)+8>>2]|0;do{if((a[Yd+156|0]|0)==1){if((c[Yd+176>>2]|0)>1){ze=1;break}ze=(c[Yd+184>>2]|0)>1|0}else{ze=0}}while(0);gm(S,Xd,1,B,ze);Yd=(c[bc>>2]|0)-1|0;Wd=c[Zd>>2]|0;gd=+h[Wd+24>>3];Vd=c[Wd+232>>2]|0;Wd=~~(gd+ +(c[(c[(c[(Hx(Sd|0)|0)+8>>2]|0)+184>>2]|0)+(Vd*44|0)+20>>2]|0));gd=+h[B+56+(Yd<<5)>>3];ra=+h[B+56+(Yd<<5)+16>>3];id=+h[B+56+(Yd<<5)+24>>3];hd=+(Wd|0);if(gd<ra&id<hd){Wd=c[bc>>2]|0;c[bc>>2]=Wd+1;h[B+56+(Wd<<5)>>3]=gd;h[B+56+(Wd<<5)+8>>3]=id;h[B+56+(Wd<<5)+16>>3]=ra;h[B+56+(Wd<<5)+24>>3]=hd}h[dc>>3]=1.5707963267948966;a[ec]=1;Fo(S,Qc,Xd,A,B,fe);do{if(ma){Ae=il(S,C)|0;za=251}else{Wd=kl(S,C)|0;if(!ba){Ae=Wd;za=251;break}Yd=c[C>>2]|0;if((Yd|0)<=4){Be=Wd;Ce=Yd;za=252;break}Vd=Wd+16|0;Ud=Wd;c[Vd>>2]=c[Ud>>2];c[Vd+4>>2]=c[Ud+4>>2];c[Vd+8>>2]=c[Ud+8>>2];c[Vd+12>>2]=c[Ud+12>>2];Ud=Wd+32|0;Vd=Wd+(Yd-1<<4)|0;c[Ud>>2]=c[Vd>>2];c[Ud+4>>2]=c[Vd+4>>2];c[Ud+8>>2]=c[Vd+8>>2];c[Ud+12>>2]=c[Vd+12>>2];uF(Wd+48|0,Vd|0,16)|0;c[C>>2]=4;De=4;Ee=Wd}}while(0);if((za|0)==251){za=0;Be=Ae;Ce=c[C>>2]|0;za=252}if((za|0)==252){za=0;if((Ce|0)==0){break d}else{De=Ce;Ee=Be}}Xd=De+Kc|0;if((Xd|0)>(c[44384]|0)){c[44384]=Xd<<1;Sd=mk(c[44380]|0,Xd<<5)|0;c[44380]=Sd;Fe=c[C>>2]|0;Ge=Sd}else{Fe=De;Ge=c[44380]|0}if((Fe|0)>0){Sd=(Fe|0)>1;Xd=Kc;Wd=0;while(1){Vd=Ge+(Xd<<4)|0;Ud=Ee+(Wd<<4)|0;c[Vd>>2]=c[Ud>>2];c[Vd+4>>2]=c[Ud+4>>2];c[Vd+8>>2]=c[Ud+8>>2];c[Vd+12>>2]=c[Ud+12>>2];Ud=Wd+1|0;if((Ud|0)<(Fe|0)){Xd=Xd+1|0;Wd=Ud}else{break}}He=(Sd?Fe:1)+Kc|0}else{He=Kc}Wd=c[c[(c[Zd>>2]|0)+180>>2]>>2]|0;if((we|0)==0){Ie=Wd}else{Xd=we;Ud=Wd;while(1){Wd=Xd-1|0;Vd=c[c[(c[(c[((c[Ud>>2]&3|0)==2?Ud:Ud-32|0)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;if((Wd|0)==0){Ie=Vd;break}else{Xd=Wd;Ud=Vd}}}Ud=Ge+(He<<4)|0;Xd=Ge+(He-1<<4)|0;c[Ud>>2]=c[Xd>>2];c[Ud+4>>2]=c[Xd+4>>2];c[Ud+8>>2]=c[Xd+8>>2];c[Ud+12>>2]=c[Xd+12>>2];Ud=He+2|0;Zd=Ge+(He+1<<4)|0;c[Zd>>2]=c[Xd>>2];c[Zd+4>>2]=c[Xd+4>>2];c[Zd+8>>2]=c[Xd+8>>2];c[Zd+12>>2]=c[Xd+12>>2];Xd=Ie;Zd=Ie+32|0;Sd=Ge+(Ud<<4)|0;Vd=(c[(c[((c[Xd>>2]&3|0)==3?Ie:Zd)+28>>2]|0)+8>>2]|0)+16|0;c[Sd>>2]=c[Vd>>2];c[Sd+4>>2]=c[Vd+4>>2];c[Sd+8>>2]=c[Vd+8>>2];c[Sd+12>>2]=c[Vd+12>>2];Go(Qc,S);Vd=c[Xd>>2]&3;Xd=c[((Vd|0)==3?Ie:Zd)+28>>2]|0;Zd=c[((Vd|0)==2?Ie:Ie-32|0)+28>>2]|0;Vd=Xd+8|0;Do(G,K,Xd,c[c[(c[Vd>>2]|0)+172>>2]>>2]|0,Ie);c[Ab>>2]=c[Fb>>2];c[Ab+4>>2]=c[Fb+4>>2];c[Ab+8>>2]=c[Fb+8>>2];c[Ab+12>>2]=c[Fb+12>>2];c[Ab+16>>2]=c[Fb+16>>2];c[Ab+20>>2]=c[Fb+20>>2];c[Ab+24>>2]=c[Fb+24>>2];c[Ab+28>>2]=c[Fb+28>>2];Sd=c[Vd>>2]|0;do{if((a[Sd+156|0]|0)==1){if((c[Sd+176>>2]|0)>1){Je=1;break}Je=(c[Sd+184>>2]|0)>1|0}else{Je=0}}while(0);em(S,Ie,1,A,Je);Sd=(c[ac>>2]|0)-1|0;Wd=c[Vd>>2]|0;hd=+h[Wd+24>>3];Yd=c[Wd+232>>2]|0;Wd=~~(hd- +(c[(c[(c[(Hx(Xd|0)|0)+8>>2]|0)+184>>2]|0)+(Yd*44|0)+16>>2]|0));hd=+h[A+56+(Sd<<5)>>3];ra=+h[A+56+(Sd<<5)+8>>3];id=+h[A+56+(Sd<<5)+16>>3];gd=+(Wd|0);if(hd<id&gd<ra){Wd=c[ac>>2]|0;c[ac>>2]=Wd+1;h[A+56+(Wd<<5)>>3]=hd;h[A+56+(Wd<<5)+8>>3]=gd;h[A+56+(Wd<<5)+16>>3]=id;h[A+56+(Wd<<5)+24>>3]=ra}h[fc>>3]=-1.5707963267948966;a[gc]=1;Wd=Zd+8|0;if((a[(c[Wd>>2]|0)+156|0]|0)==1){Tc=Zd;Kc=Ud;Hc=xe;Nc=we;Qc=Ie;Qd=Xd;Rd=Wd}else{_d=Zd;$d=0;ae=Ie;be=Xd;ce=Wd;de=Ud;ee=Ie;break}}}else{_d=Mc;$d=0;ae=yd;be=Jc;ce=Lc;de=0;ee=yd}}while(0);Lc=$d+1|0;Jc=c[(c[be+8>>2]|0)+232>>2]|0;Mc=c[$>>2]|0;Zc=Mc+(Jc<<5)|0;qd=+h[Zc>>3];Rd=Mc+(Jc<<5)+8|0;pd=+h[Rd>>3];Qd=Mc+(Jc<<5)+16|0;ra=+h[Qd>>3];Qc=Mc+(Jc<<5)+24|0;id=+h[Qc>>3];if(qd==ra){Mc=c[(c[fd+8>>2]|0)+184>>2]|0;Nc=Jc+1|0;gd=+(c[_>>2]|0);hd=+h[(c[(c[c[Mc+(Nc*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]+ +(c[Mc+(Nc*44|0)+20>>2]|0);ne=+(c[Z>>2]|0);V=+h[(c[(c[c[Mc+(Jc*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]- +(c[Mc+(Jc*44|0)+16>>2]|0);h[Zc>>3]=gd;h[Rd>>3]=hd;h[Qd>>3]=ne;h[Qc>>3]=V;Ke=V;Le=ne;Me=gd;Ne=hd}else{Ke=id;Le=ra;Me=qd;Ne=pd}h[180936+($d<<5)>>3]=Me;h[180944+($d<<5)>>3]=Ne;h[180952+($d<<5)>>3]=Le;h[180960+($d<<5)>>3]=Ke;Do(H,K,_d,ae,0);c[Bb>>2]=c[Gb>>2];c[Bb+4>>2]=c[Gb+4>>2];c[Bb+8>>2]=c[Gb+8>>2];c[Bb+12>>2]=c[Gb+12>>2];c[Bb+16>>2]=c[Gb+16>>2];c[Bb+20>>2]=c[Gb+20>>2];c[Bb+24>>2]=c[Gb+24>>2];c[Bb+28>>2]=c[Gb+28>>2];pd=+h[hc>>3];qd=+h[ic>>3];Qc=(zd|0)!=0;Qd=Qc?Mb:ae;Rd=ae;Zc=ae-32|0;Jc=c[(c[((c[Rd>>2]&3|0)==2?ae:Zc)+28>>2]|0)+8>>2]|0;do{if((a[Jc+156|0]|0)==1){if((c[Jc+176>>2]|0)>1){Oe=1;break}Oe=(c[Jc+184>>2]|0)>1|0}else{Oe=0}}while(0);gm(S,Qd,1,B,Oe);ra=+h[B+56+((c[bc>>2]|0)-1<<5)+24>>3];Jc=c[ce>>2]|0;id=+h[Jc+24>>3];fd=c[Jc+232>>2]|0;hd=+(~~(id+ +(c[(c[(c[(Hx(_d|0)|0)+8>>2]|0)+184>>2]|0)+(fd*44|0)+20>>2]|0))|0);if(pd<qd&ra<hd){fd=c[bc>>2]|0;c[bc>>2]=fd+1;h[B+56+(fd<<5)>>3]=pd;h[B+56+(fd<<5)+8>>3]=ra;h[B+56+(fd<<5)+16>>3]=qd;h[B+56+(fd<<5)+24>>3]=hd}Fo(S,ee,ae,A,B,Lc);if(ma){Pe=il(S,C)|0}else{Pe=kl(S,C)|0}fd=c[C>>2]|0;if(ba&(fd|0)>4){Jc=Pe+16|0;Mc=Pe;c[Jc>>2]=c[Mc>>2];c[Jc+4>>2]=c[Mc+4>>2];c[Jc+8>>2]=c[Mc+8>>2];c[Jc+12>>2]=c[Mc+12>>2];Mc=Pe+32|0;Jc=Pe+(fd-1<<4)|0;c[Mc>>2]=c[Jc>>2];c[Mc+4>>2]=c[Jc+4>>2];c[Mc+8>>2]=c[Jc+8>>2];c[Mc+12>>2]=c[Jc+12>>2];uF(Pe+48|0,Jc|0,16)|0;c[C>>2]=4;Qe=4}else{if((fd|0)==0){break}else{Qe=fd}}fd=Qe+de|0;if((fd|0)>(c[44384]|0)){c[44384]=fd<<1;c[44380]=mk(c[44380]|0,fd<<5)|0;Re=c[C>>2]|0}else{Re=Qe}if((Re|0)>0){fd=c[44380]|0;Jc=(Re|0)>1;Mc=de;Nc=0;while(1){Hc=fd+(Mc<<4)|0;Kc=Pe+(Nc<<4)|0;c[Hc>>2]=c[Kc>>2];c[Hc+4>>2]=c[Kc+4>>2];c[Hc+8>>2]=c[Kc+8>>2];c[Hc+12>>2]=c[Kc+12>>2];Kc=Nc+1|0;if((Kc|0)<(Re|0)){Mc=Mc+1|0;Nc=Kc}else{break}}Se=(Jc?Re:1)+de|0}else{Se=de}Go(ee,S);if(Qc){Te=(c[Ub>>2]&3|0)==2?Mb:Wb}else{Te=(c[Rd>>2]&3|0)==2?ae:Zc}Ld=Se;Md=c[Te+28>>2]|0}if((Uc|0)==1){cm(yd,Md,c[44380]|0,Ld,11848);break}Nc=Ld-1|0;Mc=(Nc|0)>1;if(Mc){qd=+((da(c[U>>2]|0,Uc-1|0)|0)/2|0|0);fd=c[44380]|0;Lc=1;do{Qd=fd+(Lc<<4)|0;h[Qd>>3]=+h[Qd>>3]-qd;Lc=Lc+1|0;}while((Lc|0)<(Nc|0))}Lc=c[44384]|0;if((Lc|0)>(c[44382]|0)){c[44382]=Lc;fd=mk(c[44378]|0,Lc<<4)|0;c[44378]=fd;Ue=fd}else{Ue=c[44378]|0}fd=(Ld|0)>0;if(fd){Lc=c[44380]|0;Zc=0;do{Rd=Ue+(Zc<<4)|0;Qc=Lc+(Zc<<4)|0;c[Rd>>2]=c[Qc>>2];c[Rd+4>>2]=c[Qc+4>>2];c[Rd+8>>2]=c[Qc+8>>2];c[Rd+12>>2]=c[Qc+12>>2];Zc=Zc+1|0;}while((Zc|0)<(Ld|0))}cm(yd,Md,Ue,Ld,11848);if((Uc|0)>1){Ve=1}else{break}do{Zc=c[ca+(Ve+rc<<2)>>2]|0;Lc=Zc+8|0;Qc=c[Lc>>2]|0;if((c[Qc+164>>2]&32|0)==0){We=Zc}else{Rd=c[Qb>>2]|0;tF(Rd|0,Qc|0,176)|0;tF(zb|0,Zc|0,32)|0;c[Qb>>2]=Rd;Rd=Zc;c[((c[Xb>>2]&3|0)==3?Pb:Yb)+28>>2]=c[((c[Rd>>2]&3|0)==2?Zc:Zc-32|0)+28>>2];c[((c[Xb>>2]&3|0)==2?Pb:Zb)+28>>2]=c[((c[Rd>>2]&3|0)==3?Zc:Zc+32|0)+28>>2];Rd=(c[Qb>>2]|0)+16|0;Qc=(c[Lc>>2]|0)+56|0;c[Rd>>2]=c[Qc>>2];c[Rd+4>>2]=c[Qc+4>>2];c[Rd+8>>2]=c[Qc+8>>2];c[Rd+12>>2]=c[Qc+12>>2];c[Rd+16>>2]=c[Qc+16>>2];c[Rd+20>>2]=c[Qc+20>>2];c[Rd+24>>2]=c[Qc+24>>2];c[Rd+28>>2]=c[Qc+28>>2];c[Rd+32>>2]=c[Qc+32>>2];c[Rd+36>>2]=c[Qc+36>>2];Qc=(c[Qb>>2]|0)+56|0;Rd=(c[Lc>>2]|0)+16|0;c[Qc>>2]=c[Rd>>2];c[Qc+4>>2]=c[Rd+4>>2];c[Qc+8>>2]=c[Rd+8>>2];c[Qc+12>>2]=c[Rd+12>>2];c[Qc+16>>2]=c[Rd+16>>2];c[Qc+20>>2]=c[Rd+20>>2];c[Qc+24>>2]=c[Rd+24>>2];c[Qc+28>>2]=c[Rd+28>>2];c[Qc+32>>2]=c[Rd+32>>2];c[Qc+36>>2]=c[Rd+36>>2];a[(c[Qb>>2]|0)+112|0]=1;c[(c[Qb>>2]|0)+116>>2]=Zc;We=Pb}if(Mc){Zc=c[44380]|0;qd=+(c[U>>2]|0);Rd=1;do{Qc=Zc+(Rd<<4)|0;h[Qc>>3]=qd+ +h[Qc>>3];Rd=Rd+1|0;}while((Rd|0)<(Nc|0))}Rd=c[44378]|0;if(fd){Zc=c[44380]|0;Qc=0;do{Lc=Rd+(Qc<<4)|0;Jc=Zc+(Qc<<4)|0;c[Lc>>2]=c[Jc>>2];c[Lc+4>>2]=c[Jc+4>>2];c[Lc+8>>2]=c[Jc+8>>2];c[Lc+12>>2]=c[Jc+12>>2];Qc=Qc+1|0;}while((Qc|0)<(Ld|0))}cm(We,c[((c[We>>2]&3|0)==2?We:We-32|0)+28>>2]|0,Rd,Ld,11848);Ve=Ve+1|0;}while((Ve|0)<(Uc|0))}}while(0);if((Vc|0)<(ea|0)){rc=Vc}else{break}}}rc=c[(c[L>>2]|0)+180>>2]|0;if((rc|0)!=0){U=rc;do{rc=U+8|0;Pb=c[rc>>2]|0;do{if((a[Pb+156|0]|0)==1){Qb=c[Pb+104>>2]|0;if((Qb|0)==0){Xe=Pb;break}if((c[Pb+176>>2]|0)==0){Ye=Qb}else{Qb=(c[c[Pb+180>>2]>>2]|0)+8|0;Zb=c[Qb>>2]|0;if((a[Zb+112|0]|0)==0){Ze=Qb;_e=Zb}else{Qb=Zb;while(1){Zb=(c[Qb+116>>2]|0)+8|0;Xb=c[Zb>>2]|0;if((a[Xb+112|0]|0)==0){Ze=Zb;_e=Xb;break}else{Qb=Xb}}}Qb=c[_e+96>>2]|0;qd=+h[Qb+24>>3];pd=+h[Qb+32>>3];Qb=(c[(c[(Hx(U)|0)+8>>2]|0)+116>>2]&1|0)==0;h[(c[(c[Ze>>2]|0)+96>>2]|0)+56>>3]=+h[(c[rc>>2]|0)+16>>3]+(Qb?qd:pd)*.5;h[(c[(c[Ze>>2]|0)+96>>2]|0)+64>>3]=+h[(c[rc>>2]|0)+24>>3];a[(c[(c[Ze>>2]|0)+96>>2]|0)+81|0]=1;Ye=c[(c[rc>>2]|0)+104>>2]|0}_m(d,Ye);Xe=c[rc>>2]|0}else{Xe=Pb}}while(0);U=c[Xe+164>>2]|0;}while((U|0)!=0)}if((e|0)==0){W=S;X=ca;break}U=ux(d)|0;if((U|0)==0){W=S;X=ca;break}else{$e=U}while(1){U=mw(d,$e)|0;if((U|0)!=0){Pb=U;do{do{if((Ec[c[2962]&63](Pb)|0)<<24>>24!=0){U=c[(c[Pb+8>>2]|0)+8>>2]|0;if((U|0)==0){break}rc=c[U+4>>2]|0;Qb=kk(rc*48|0)|0;Xb=U|0;if((rc|0)>0){U=(c[Xb>>2]|0)+((rc-1|0)*48|0)|0;Zb=0;Yb=Qb;while(1){zb=U-48|0;Wb=Yb+48|0;Mb=c[U+4>>2]|0;Ub=kk(Mb<<4)|0;if((Mb|0)>0){ba=(c[U>>2]|0)+(Mb-1<<4)|0;ma=0;bc=Ub;while(1){ic=bc;hc=ba;c[ic>>2]=c[hc>>2];c[ic+4>>2]=c[hc+4>>2];c[ic+8>>2]=c[hc+8>>2];c[ic+12>>2]=c[hc+12>>2];hc=ma+1|0;if((hc|0)<(Mb|0)){ba=ba-16|0;ma=hc;bc=bc+16|0}else{break}}}c[Yb>>2]=Ub;c[Yb+4>>2]=Mb;c[Yb+8>>2]=c[U+12>>2];c[Yb+12>>2]=c[U+8>>2];bc=Yb+16|0;ma=U+32|0;c[bc>>2]=c[ma>>2];c[bc+4>>2]=c[ma+4>>2];c[bc+8>>2]=c[ma+8>>2];c[bc+12>>2]=c[ma+12>>2];ma=Yb+32|0;bc=U+16|0;c[ma>>2]=c[bc>>2];c[ma+4>>2]=c[bc+4>>2];c[ma+8>>2]=c[bc+8>>2];c[ma+12>>2]=c[bc+12>>2];bc=Zb+1|0;if((bc|0)<(rc|0)){U=zb;Zb=bc;Yb=Wb}else{break}}Yb=0;Zb=c[Xb>>2]|0;while(1){eF(c[Zb+(Yb*48|0)>>2]|0);U=Yb+1|0;Rd=c[Xb>>2]|0;if((U|0)<(rc|0)){Yb=U;Zb=Rd}else{af=Rd;break}}}else{af=c[Xb>>2]|0}eF(af);c[Xb>>2]=Qb}}while(0);Pb=ow(d,Pb)|0;}while((Pb|0)!=0)}Pb=vx(d,$e)|0;if((Pb|0)==0){W=S;X=ca;break}else{$e=Pb}}}}while(0);do{if((c[53792]|0)!=0|(c[53756]|0)!=0){if(!((c[53786]|0)!=0|(c[53784]|0)!=0)){break}$e=ux(d)|0;if(($e|0)==0){break}else{bf=$e}do{do{if((c[53792]|0)!=0){$e=pw(d,bf)|0;if(($e|0)==0){break}else{cf=$e}do{$e=cf;ca=cf-32|0;af=(c[$e>>2]&3|0)==2?cf:ca;if((c[(c[af+8>>2]|0)+100>>2]|0)!=0){lm(af,1)|0;_m(d,c[(c[((c[$e>>2]&3|0)==2?cf:ca)+8>>2]|0)+100>>2]|0)}cf=qw(d,cf)|0;}while((cf|0)!=0)}}while(0);do{if((c[53756]|0)!=0){ca=mw(d,bf)|0;if((ca|0)==0){break}else{df=ca}do{ca=df+8|0;do{if((c[(c[ca>>2]|0)+104>>2]|0)!=0){if((lm(df,0)|0)==0){break}_m(d,c[(c[ca>>2]|0)+104>>2]|0)}}while(0);df=ow(d,df)|0;}while((df|0)!=0)}}while(0);bf=vx(d,bf)|0;}while((bf|0)!=0)}}while(0);if((M|0)!=4){eF(X);eF(c[W+84>>2]|0);eF(W);eF(c[K+16>>2]|0);hl()}c[53522]=1;c[53746]=1;i=f;return}function Co(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=i;i=i+480|0;f=e|0;g=e+176|0;j=e+352|0;k=e+416|0;l=f|0;m=j|0;n=j+8|0;c[n>>2]=l;o=g|0;p=k|0;q=k+8|0;c[q>>2]=o;r=c[b>>2]|0;b=c[d>>2]|0;d=r+8|0;s=c[d>>2]|0;t=c[s+164>>2]|0;u=t&15;v=b+8|0;w=c[v>>2]|0;x=c[w+164>>2]&15;if((u|0)!=(x|0)){y=x-u|0;i=e;return y|0}u=c[s+172>>2]|0;if((u|0)==0){z=r;A=s}else{x=u;while(1){B=c[x+8>>2]|0;u=c[B+172>>2]|0;if((u|0)==0){break}else{x=u}}z=x;A=B}B=c[A+116>>2]|0;if((B|0)==0){C=z}else{z=B;while(1){B=c[(c[z+8>>2]|0)+116>>2]|0;if((B|0)==0){break}else{z=B}}C=z}z=c[w+172>>2]|0;if((z|0)==0){D=b;E=w}else{B=z;while(1){F=c[B+8>>2]|0;z=c[F+172>>2]|0;if((z|0)==0){break}else{B=z}}D=B;E=F}F=c[E+116>>2]|0;if((F|0)==0){G=D}else{D=F;while(1){F=c[(c[D+8>>2]|0)+116>>2]|0;if((F|0)==0){break}else{D=F}}G=D}D=c[C>>2]|0;F=D&3;E=c[(c[((F|0)==3?C:C+32|0)+28>>2]|0)+8>>2]|0;B=c[(c[((F|0)==2?C:C-32|0)+28>>2]|0)+8>>2]|0;F=(c[E+232>>2]|0)-(c[B+232>>2]|0)|0;z=c[G>>2]|0;A=z&3;x=c[(c[((A|0)==3?G:G+32|0)+28>>2]|0)+8>>2]|0;u=c[(c[((A|0)==2?G:G-32|0)+28>>2]|0)+8>>2]|0;A=(c[x+232>>2]|0)-(c[u+232>>2]|0)|0;H=(F|0)>-1?F:-F|0;F=(A|0)>-1?A:-A|0;if((H|0)!=(F|0)){y=H-F|0;i=e;return y|0}F=~~(+h[E+16>>3]- +h[B+16>>3]);B=(F|0)>-1?F:-F|0;F=~~(+h[x+16>>3]- +h[u+16>>3]);u=(F|0)>-1?F:-F|0;if((B|0)!=(u|0)){y=B-u|0;i=e;return y|0}u=D>>>4;D=z>>>4;if((u|0)!=(D|0)){y=u-D|0;i=e;return y|0}if((a[s+44|0]|0)==0){D=(a[s+84|0]|0)==0?C:r;C=c[D+8>>2]|0;I=D;J=C;K=c[C+164>>2]|0}else{I=r;J=s;K=t}t=I+8|0;if((K&32|0)==0){L=I;M=w}else{tF(f|0,J|0,176)|0;tF(j|0,I|0,32)|0;c[n>>2]=l;l=I;J=j;c[((c[J>>2]&3|0)==3?m:m+32|0)+28>>2]=c[((c[l>>2]&3|0)==2?I:I-32|0)+28>>2];c[((c[J>>2]&3|0)==2?m:m-32|0)+28>>2]=c[((c[l>>2]&3|0)==3?I:I+32|0)+28>>2];l=c[n>>2]|0;n=l+16|0;J=(c[t>>2]|0)+56|0;c[n>>2]=c[J>>2];c[n+4>>2]=c[J+4>>2];c[n+8>>2]=c[J+8>>2];c[n+12>>2]=c[J+12>>2];c[n+16>>2]=c[J+16>>2];c[n+20>>2]=c[J+20>>2];c[n+24>>2]=c[J+24>>2];c[n+28>>2]=c[J+28>>2];c[n+32>>2]=c[J+32>>2];c[n+36>>2]=c[J+36>>2];J=l+56|0;n=(c[t>>2]|0)+16|0;c[J>>2]=c[n>>2];c[J+4>>2]=c[n+4>>2];c[J+8>>2]=c[n+8>>2];c[J+12>>2]=c[n+12>>2];c[J+16>>2]=c[n+16>>2];c[J+20>>2]=c[n+20>>2];c[J+24>>2]=c[n+24>>2];c[J+28>>2]=c[n+28>>2];c[J+32>>2]=c[n+32>>2];c[J+36>>2]=c[n+36>>2];a[l+112|0]=1;c[l+116>>2]=I;L=m;M=c[v>>2]|0}if((a[M+44|0]|0)==0){m=(a[M+84|0]|0)==0?G:b;N=m;O=c[m+8>>2]|0}else{N=b;O=M}M=N+8|0;if((c[O+164>>2]&32|0)==0){P=O}else{tF(g|0,O|0,176)|0;tF(k|0,N|0,32)|0;c[q>>2]=o;o=N;O=k;c[((c[O>>2]&3|0)==3?p:p+32|0)+28>>2]=c[((c[o>>2]&3|0)==2?N:N-32|0)+28>>2];c[((c[O>>2]&3|0)==2?p:p-32|0)+28>>2]=c[((c[o>>2]&3|0)==3?N:N+32|0)+28>>2];o=c[q>>2]|0;q=o+16|0;p=(c[M>>2]|0)+56|0;c[q>>2]=c[p>>2];c[q+4>>2]=c[p+4>>2];c[q+8>>2]=c[p+8>>2];c[q+12>>2]=c[p+12>>2];c[q+16>>2]=c[p+16>>2];c[q+20>>2]=c[p+20>>2];c[q+24>>2]=c[p+24>>2];c[q+28>>2]=c[p+28>>2];c[q+32>>2]=c[p+32>>2];c[q+36>>2]=c[p+36>>2];p=o+56|0;q=(c[M>>2]|0)+16|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];c[p+16>>2]=c[q+16>>2];c[p+20>>2]=c[q+20>>2];c[p+24>>2]=c[q+24>>2];c[p+28>>2]=c[q+28>>2];c[p+32>>2]=c[q+32>>2];c[p+36>>2]=c[q+36>>2];a[o+112|0]=1;c[o+116>>2]=N;P=o}o=c[L+8>>2]|0;L=o+16|0;N=P+16|0;q=a[o+44|0]|0;do{if((a[P+44|0]|0)==0){Q=q<<24>>24!=0|0}else{if(q<<24>>24==0){y=-1;i=e;return y|0}p=~~(+h[L>>3]- +h[N>>3]);if((p|0)==0){Q=~~(+h[o+24>>3]- +h[P+24>>3]);break}else{y=p;i=e;return y|0}}}while(0);if((Q|0)!=0){y=Q;i=e;return y|0}Q=o+56|0;N=P+56|0;L=a[o+84|0]|0;do{if((a[P+84|0]|0)==0){R=L<<24>>24!=0|0}else{if(L<<24>>24==0){y=-1;i=e;return y|0}q=~~(+h[Q>>3]- +h[N>>3]);if((q|0)==0){R=~~(+h[o+64>>3]- +h[P+64>>3]);break}else{y=q;i=e;return y|0}}}while(0);if((R|0)!=0){y=R;i=e;return y|0}R=c[(c[d>>2]|0)+164>>2]&192;d=c[(c[v>>2]|0)+164>>2]&192;if((R|0)==(d|0)){y=((c[r>>2]|0)>>>4)-((c[b>>2]|0)>>>4)|0;i=e;return y|0}else{y=R-d|0;i=e;return y|0}return 0}function Do(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0;i=Hx(e|0)|0;j=e+8|0;k=c[j>>2]|0;l=+h[k+16>>3]- +h[k+88>>3]+-4.0;k=Jo(e,f,g,-1)|0;do{if((k|0)==0){m=l>=0.0;if(m){n=l+.5}else{n=l+-.5}o=c[d>>2]|0;if((~~n|0)>=(o|0)){p=o;break}if(m){q=l+.5}else{q=l+-.5}p=~~q}else{m=Ko(c[j>>2]|0,k)|0;do{if((m|0)==0){o=c[k+8>>2]|0;r=+h[o+16>>3]+ +(c[o+240>>2]|0);if((a[o+156|0]|0)==0){s=r+ +(c[(c[i+8>>2]|0)+236>>2]|0)*.5;break}else{s=r+ +(c[d+8>>2]|0);break}}else{s=+h[(c[m+8>>2]|0)+32>>3]+ +(c[d+8>>2]|0)}}while(0);r=s<l?s:l;if(r<0.0){t=r+-.5}else{t=r+.5}p=~~t}}while(0);t=+(p|0);p=c[j>>2]|0;do{if((a[p+156|0]|0)==1){if((c[p+104>>2]|0)==0){u=22;break}v=+h[p+16>>3]+10.0}else{u=22}}while(0);if((u|0)==22){v=+h[p+16>>3]+ +h[p+96>>3]+4.0}p=Jo(e,f,g,1)|0;do{if((p|0)==0){g=v>=0.0;if(g){w=v+.5}else{w=v+-.5}f=c[d+4>>2]|0;if((~~w|0)<=(f|0)){x=f;break}if(g){y=v+.5}else{y=v+-.5}x=~~y}else{g=Ko(c[j>>2]|0,p)|0;do{if((g|0)==0){f=c[p+8>>2]|0;l=+h[f+16>>3]- +h[f+88>>3];if((a[f+156|0]|0)==0){z=l- +(c[(c[i+8>>2]|0)+236>>2]|0)*.5;break}else{z=l- +(c[d+8>>2]|0);break}}else{z=+h[(c[g+8>>2]|0)+16>>3]- +(c[d+8>>2]|0)}}while(0);l=z>v?z:v;if(l<0.0){A=l+-.5}else{A=l+.5}x=~~A}}while(0);A=+(x|0);x=c[j>>2]|0;do{if((a[x+156|0]|0)==1){if((c[x+104>>2]|0)==0){B=A;break}v=A- +h[x+96>>3];if(v>=t){B=v;break}B=+h[x+16>>3]}else{B=A}}while(0);A=+h[x+24>>3];j=c[x+232>>2]|0;x=c[(c[i+8>>2]|0)+184>>2]|0;v=A- +(c[x+(j*44|0)+16>>2]|0);z=A+ +(c[x+(j*44|0)+20>>2]|0);h[b>>3]=t;h[b+8>>3]=v;h[b+16>>3]=B;h[b+24>>3]=z;return}function Eo(b){b=b|0;var d=0,e=0;d=c[b+8>>2]|0;if((a[d+156|0]|0)!=1){e=0;return e|0}if((c[d+176>>2]|0)>1){e=1;return e|0}e=(c[d+184>>2]|0)>1|0;return e|0}function Fo(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0,p=0;i=Ho(b,-1)|0;j=Ho(b,1)|0;do{if((i|0)!=0){if((om(i)|0)!=0){break}return}}while(0);do{if((j|0)!=0){if((om(j)|0)!=0){break}return}}while(0);j=Io(d,-1)|0;i=Io(d,1)|0;do{if((j|0)!=0){if((om(j)|0)!=0){break}return}}while(0);do{if((i|0)!=0){if((om(i)|0)!=0){break}return}}while(0);i=e+52|0;if((c[i>>2]|0)>0){j=0;do{dm(a,e+56+(j<<5)|0);j=j+1|0;}while((j|0)<(c[i>>2]|0))}i=a+80|0;j=c[i>>2]|0;e=j+1|0;d=e+g|0;b=d-3|0;if((g|0)>0){k=0;do{dm(a,180936+(k<<5)|0);k=k+1|0;}while((k|0)<(g|0))}g=c[f+52>>2]|0;if((g|0)>0){k=g;do{k=k-1|0;dm(a,f+56+(k<<5)|0);}while((k|0)>0)}k=d-2|0;if((k|0)>=(e|0)){d=a+84|0;f=j;do{j=c[d>>2]|0;g=j+(f<<5)|0;l=+h[g>>3];do{if((f-e&1|0)==0){m=j+(f<<5)+16|0;n=+h[m>>3];if(l<n){break}o=~~((l+n)*.5);h[g>>3]=+(o-8|0);h[m>>3]=+(o+8|0)}else{o=j+(f<<5)+16|0;n=+h[o>>3];if(l+16.0<=n){break}m=~~((l+n)*.5);h[g>>3]=+(m-8|0);h[o>>3]=+(m+8|0)}}while(0);f=f+1|0;}while((f|0)<(k|0))}if(((c[i>>2]|0)-1|0)<=0){return}k=a+84|0;a=0;while(1){f=c[k>>2]|0;d=f+(a<<5)|0;g=a+1|0;j=f+(g<<5)|0;do{if((a|0)<(e|0)|(a|0)>(b|0)){p=31}else{if((a-e&1|0)!=0){p=31;break}l=+h[d>>3]+16.0;m=f+(g<<5)+16|0;if(l>+h[m>>3]){h[m>>3]=l}l=+h[f+(a<<5)+16>>3]+-16.0;m=j|0;if(l>=+h[m>>3]){break}h[m>>3]=l}}while(0);do{if((p|0)==31){p=0;if(!((g|0)>=(e|0)&(a|0)<(b|0))){break}if((g-e&1|0)!=0){break}m=d|0;l=+h[f+(g<<5)+16>>3];if(+h[m>>3]+16.0>l){h[m>>3]=l+-16.0}m=f+(a<<5)+16|0;l=+h[j>>3];if(+h[m>>3]+-16.0>=l){break}h[m>>3]=l+16.0}}while(0);if((g|0)<((c[i>>2]|0)-1|0)){a=g}else{break}}return}function Go(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0.0,q=0,r=0;e=c[((c[b>>2]&3|0)==2?b:b-32|0)+28>>2]|0;b=e+8|0;if((a[(c[b>>2]|0)+156|0]|0)!=1){return}f=d+84|0;g=d+80|0;d=0;i=e;e=b;while(1){if((Ec[c[2963]&63](i)|0)<<24>>24!=0){j=14;break}b=c[g>>2]|0;a:do{if((d|0)<(b|0)){k=c[f>>2]|0;l=+h[(c[e>>2]|0)+24>>3];m=d;while(1){n=m+1|0;if(+h[k+(m<<5)+8>>3]<=l){o=m;break a}if((n|0)<(b|0)){m=n}else{o=n;break}}}else{o=d}}while(0);if((o|0)>=(b|0)){j=14;break}m=c[f>>2]|0;k=c[e>>2]|0;do{if(+h[m+(o<<5)+24>>3]>=+h[k+24>>3]){l=+h[m+(o<<5)>>3];n=~~l;p=+h[m+(o<<5)+16>>3];if((c[k+104>>2]|0)==0){q=~~((l+p)*.5);h[k+16>>3]=+(q|0);h[(c[e>>2]|0)+88>>3]=+(q-n|0);h[(c[e>>2]|0)+96>>3]=+(~~p-q|0);break}else{q=~~p;r=~~(p+ +h[k+96>>3]);h[k+16>>3]=+(q|0);h[(c[e>>2]|0)+88>>3]=+(q-n|0);h[(c[e>>2]|0)+96>>3]=+(r-q|0);break}}}while(0);k=c[c[(c[e>>2]|0)+180>>2]>>2]|0;m=c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0;k=m+8|0;if((a[(c[k>>2]|0)+156|0]|0)==1){d=o;i=m;e=k}else{j=14;break}}if((j|0)==14){return}}function Ho(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=c[a>>2]&3;e=c[(c[(c[((d|0)==3?a:a+32|0)+28>>2]|0)+8>>2]|0)+180>>2]|0;f=c[e>>2]|0;if((f|0)==0){g=0;return g|0}h=a-32|0;i=0;j=0;k=f;while(1){f=c[(c[(c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((da(f-(c[(c[(c[((d|0)==2?a:h)+28>>2]|0)+8>>2]|0)+236>>2]|0)|0,b)|0)<1){l=i}else{m=c[k+8>>2]|0;if((c[m+8>>2]|0)==0){n=c[m+116>>2]|0;if((n|0)==0){l=i;break}if((c[(c[n+8>>2]|0)+8>>2]|0)==0){l=i;break}}if((i|0)!=0){if((da((c[(c[(c[((c[i>>2]&3|0)==2?i:i-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)-f|0,b)|0)<=0){l=i;break}}l=k}}while(0);f=j+1|0;n=c[e+(f<<2)>>2]|0;if((n|0)==0){g=l;break}else{i=l;j=f;k=n}}return g|0}function Io(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=c[a>>2]&3;e=c[(c[(c[((d|0)==2?a:a-32|0)+28>>2]|0)+8>>2]|0)+172>>2]|0;f=c[e>>2]|0;if((f|0)==0){g=0;return g|0}h=a+32|0;i=0;j=0;k=f;while(1){f=c[(c[(c[((c[k>>2]&3|0)==3?k:k+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((da(f-(c[(c[(c[((d|0)==3?a:h)+28>>2]|0)+8>>2]|0)+236>>2]|0)|0,b)|0)<1){l=i}else{m=c[k+8>>2]|0;if((c[m+8>>2]|0)==0){n=c[m+116>>2]|0;if((n|0)==0){l=i;break}if((c[(c[n+8>>2]|0)+8>>2]|0)==0){l=i;break}}if((i|0)!=0){if((da((c[(c[(c[((c[i>>2]&3|0)==3?i:i+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)-f|0,b)|0)<=0){l=i;break}}l=k}}while(0);f=j+1|0;n=c[e+(f<<2)>>2]|0;if((n|0)==0){g=l;break}else{i=l;j=f;k=n}}return g|0}function Jo(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=b+8|0;h=c[(c[g>>2]|0)+232>>2]|0;i=c[(c[(Hx(b|0)|0)+8>>2]|0)+184>>2]|0;b=c[(c[g>>2]|0)+236>>2]|0;g=b+f|0;if((g|0)<=-1){j=0;return j|0}k=c[i+(h*44|0)>>2]|0;l=i+(h*44|0)+4|0;h=(e|0)==0;i=(d|0)==0;m=g;a:while(1){if((m|0)>=(k|0)){j=0;n=26;break}g=c[(c[l>>2]|0)+(m<<2)>>2]|0;o=c[g+8>>2]|0;p=a[o+156|0]|0;if((p<<24>>24|0)==0){j=g;n=26;break}else if((p<<24>>24|0)==1){if((c[o+104>>2]|0)!=0){j=g;n=26;break}}p=(c[o+236>>2]|0)>(b|0);q=o+180|0;if((c[q+4>>2]|0)!=1){j=g;n=26;break}b:do{if(h){n=17}else{r=c[c[q>>2]>>2]|0;s=e;t=0;while(1){u=c[((c[r>>2]&3|0)==2?r:r-32|0)+28>>2]|0;v=c[((c[s>>2]&3|0)==2?s:s-32|0)+28>>2]|0;if((u|0)==(v|0)){n=17;break b}w=c[u+8>>2]|0;u=c[v+8>>2]|0;if(p^(c[w+236>>2]|0)>(c[u+236>>2]|0)){break b}v=w+180|0;if((c[v+4>>2]|0)!=1){n=17;break b}if((a[w+156|0]|0)==0){n=17;break b}w=u+180|0;if((c[w+4>>2]|0)!=1){n=17;break b}if((a[u+156|0]|0)==0){n=17;break b}u=t+1|0;if((u|0)<2){r=c[c[v>>2]>>2]|0;s=c[c[w>>2]>>2]|0;t=u}else{n=17;break}}}}while(0);c:do{if((n|0)==17){n=0;q=o+172|0;if((c[q+4>>2]|0)!=1|i){j=g;n=26;break a}t=c[c[q>>2]>>2]|0;q=d;s=0;while(1){r=c[((c[t>>2]&3|0)==3?t:t+32|0)+28>>2]|0;u=c[((c[q>>2]&3|0)==3?q:q+32|0)+28>>2]|0;if((r|0)==(u|0)){j=g;n=26;break a}w=c[r+8>>2]|0;r=c[u+8>>2]|0;if(p^(c[w+236>>2]|0)>(c[r+236>>2]|0)){break c}u=w+172|0;if((c[u+4>>2]|0)!=1){j=g;n=26;break a}if((a[w+156|0]|0)==0){j=g;n=26;break a}w=r+172|0;if((c[w+4>>2]|0)!=1){j=g;n=26;break a}if((a[r+156|0]|0)==0){j=g;n=26;break a}r=s+1|0;if((r|0)<2){t=c[c[u>>2]>>2]|0;q=c[c[w>>2]>>2]|0;s=r}else{j=g;n=26;break a}}}}while(0);g=m+f|0;if((g|0)>-1){m=g}else{j=0;n=26;break}}if((n|0)==26){return j|0}return 0}function Ko(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0;if((a[b+156|0]|0)==0){e=c[b+212>>2]|0;f=e;g=e}else{e=c[(c[(c[c[b+180>>2]>>2]|0)+8>>2]|0)+116>>2]|0;b=e;i=c[e>>2]&3;f=c[(c[(c[((i|0)==2?b:e-32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0;g=c[(c[(c[((i|0)==3?b:e+32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0}e=d+8|0;b=c[e>>2]|0;if((a[b+156|0]|0)==0){i=c[b+212>>2]|0;if((i|0)==(Hx(d|0)|0)){j=0;k=(j|0)==0;l=(j|0)==(g|0);m=k|l;n=(j|0)==(f|0);o=m|n;p=o?0:j;return p|0}j=c[(c[e>>2]|0)+212>>2]|0;k=(j|0)==0;l=(j|0)==(g|0);m=k|l;n=(j|0)==(f|0);o=m|n;p=o?0:j;return p|0}p=c[(c[(c[c[b+180>>2]>>2]|0)+8>>2]|0)+116>>2]|0;b=p;j=p;o=p+32|0;n=c[((c[j>>2]&3|0)==3?b:o)+28>>2]|0;m=c[(c[n+8>>2]|0)+212>>2]|0;l=(m|0)==(Hx(n|0)|0);n=c[j>>2]|0;do{if(!l){m=c[(c[(c[((n&3|0)==3?b:o)+28>>2]|0)+8>>2]|0)+212>>2]|0;k=m;if((m|0)==0|(k|0)==(g|0)|(k|0)==(f|0)){break}d=c[m+8>>2]|0;m=c[e>>2]|0;q=+h[m+16>>3];if(+h[d+16>>3]>q){break}if(q>+h[d+32>>3]){break}q=+h[m+24>>3];if(+h[d+24>>3]>q){break}if(q>+h[d+40>>3]){break}else{r=k}return r|0}}while(0);o=p-32|0;p=c[((n&3|0)==2?b:o)+28>>2]|0;n=c[(c[p+8>>2]|0)+212>>2]|0;if((n|0)==(Hx(p|0)|0)){r=0;return r|0}p=c[(c[(c[((c[j>>2]&3|0)==2?b:o)+28>>2]|0)+8>>2]|0)+212>>2]|0;o=p;if((p|0)==0|(o|0)==(g|0)|(o|0)==(f|0)){r=0;return r|0}f=c[p+8>>2]|0;p=c[e>>2]|0;q=+h[p+16>>3];if(+h[f+16>>3]>q){r=0;return r|0}if(q>+h[f+32>>3]){r=0;return r|0}q=+h[p+24>>3];if(+h[f+24>>3]>q){r=0;return r|0}r=q>+h[f+40>>3]?0:o;return r|0}
-
-
-
-function ww(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+72|0;g=f|0;h=f+40|0;j=(c[e>>2]&3|0)==2?e:e-32|0;e=j|0;k=c[j>>2]&3;l=c[((k|0)==3?j:j+32|0)+28>>2]|0;m=c[((k|0)==2?j:j-32|0)+28>>2]|0;k=j;n=k|0;o=k+4|0;k=d[o]|d[o+1|0]<<8|d[o+2|0]<<16|d[o+3|0]<<24|0;o=h|0;if((l|0)==0|(m|0)==0){p=-1;i=f;return p|0}q=h;c[q>>2]=d[n]|d[n+1|0]<<8|d[n+2|0]<<16|d[n+3|0]<<24;c[q+4>>2]=k;c[h+28>>2]=l;do{if((c[m+12>>2]|0)==(b|0)){r=m+16|0}else{c[g+16>>2]=m;l=c[b+28>>2]|0;h=Hc[c[l>>2]&63](l,g,4)|0;if((h|0)==0){p=-1}else{r=h;break}i=f;return p|0}}while(0);g=b+36|0;m=r+20|0;ah(c[g>>2]|0,c[m>>2]|0)|0;r=c[g>>2]|0;h=Hc[c[r>>2]&63](r,o,4)|0;c[m>>2]=Yg(c[g>>2]|0)|0;if((h|0)==0){p=-1;i=f;return p|0}h=b|0;if((Ix(h)|0)==(b|0)){if((a[b+12|0]&64)!=0){dw(j)}Nx(b,j|0);ay(e);_w(b,2,c[j+4>>2]|0)}if((Ov(b,e,36,0,0)|0)!=0){p=-1;i=f;return p|0}if((Ix(h)|0)!=(b|0)){p=0;i=f;return p|0}tx(b,j|0);p=0;i=f;return p|0}function xw(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=i;i=i+72|0;g=f|0;h=f+40|0;j=b;k=zx(a,c[((c[j>>2]&3|0)==3?b:b+32|0)+28>>2]|0,e)|0;l=zx(a,c[((c[j>>2]&3|0)==2?b:b-32|0)+28>>2]|0,e)|0;if((k|0)==0|(l|0)==0){m=0;i=f;return m|0}n=b;o=n|0;p=n+4|0;n=d[p]|d[p+1|0]<<8|d[p+2|0]<<16|d[p+3|0]<<24|0;p=h|0;q=h;c[q>>2]=d[o]|d[o+1|0]<<8|d[o+2|0]<<16|d[o+3|0]<<24;c[q+4>>2]=n;c[h+28>>2]=k;if((c[l+12>>2]|0)==(a|0)){r=l+16|0;s=5}else{c[g+16>>2]=l;l=c[a+28>>2]|0;k=Hc[c[l>>2]&63](l,g,4)|0;if((k|0)==0){t=0}else{r=k;s=5}}if((s|0)==5){s=a+36|0;k=r+20|0;ah(c[s>>2]|0,c[k>>2]|0)|0;r=c[s>>2]|0;g=Hc[c[r>>2]&63](r,p,4)|0;c[k>>2]=Yg(c[s>>2]|0)|0;t=g}if((e|0)!=0&(t|0)==0){yw(a,b);u=b}else{u=t}if((u|0)==0){m=0;i=f;return m|0}t=c[u>>2]&3;if((t|0)==(c[j>>2]&3|0)){m=u;i=f;return m|0}m=(t|0)==3?u-32|0:u+32|0;i=f;return m|0}function yw(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;e=i;i=i+152|0;f=e|0;g=e+40|0;h=e+80|0;j=e+120|0;k=c[b>>2]&3;l=(k|0)==2?b:b-32|0;m=(k|0)==3?b:b+32|0;k=c[m+28>>2]|0;n=c[l+28>>2]|0;if((a|0)==0){i=e;return}o=b;b=j|0;p=g;q=k+12|0;r=k+16|0;s=l|0;l=f;t=n+12|0;u=n+16|0;v=m|0;m=f+16|0;f=g+16|0;g=j;w=j+28|0;j=h;x=h+16|0;if((k|0)==0|(n|0)==0){h=a;do{if((c[q>>2]|0)==(h|0)){y=r}else{c[f>>2]=k;z=c[h+28>>2]|0;y=Hc[c[z>>2]&63](z,p,4)|0}z=h+32|0;A=c[z>>2]|0;B=y+32|0;ah(A,c[B>>2]|0)|0;Hc[c[A>>2]&63](A,s,1)|0;c[B>>2]=Yg(A)|0;A=h+36|0;B=c[A>>2]|0;C=y+24|0;ah(B,c[C>>2]|0)|0;Hc[c[B>>2]&63](B,s,1)|0;c[C>>2]=Yg(B)|0;if((c[t>>2]|0)==(h|0)){D=u}else{c[m>>2]=n;B=c[h+28>>2]|0;D=Hc[c[B>>2]&63](B,l,4)|0}B=c[z>>2]|0;z=D+28|0;ah(B,c[z>>2]|0)|0;Hc[c[B>>2]&63](B,v,1)|0;c[z>>2]=Yg(B)|0;B=c[A>>2]|0;A=D+20|0;ah(B,c[A>>2]|0)|0;Hc[c[B>>2]&63](B,v,1)|0;c[A>>2]=Yg(B)|0;h=uy(h)|0;}while((h|0)!=0);i=e;return}else{E=a}while(1){a=o|0;h=o+4|0;D=d[h]|d[h+1|0]<<8|d[h+2|0]<<16|d[h+3|0]<<24|0;c[g>>2]=d[a]|d[a+1|0]<<8|d[a+2|0]<<16|d[a+3|0]<<24;c[g+4>>2]=D;c[w>>2]=k;if((c[t>>2]|0)==(E|0)){F=u;G=10}else{c[x>>2]=n;D=c[E+28>>2]|0;a=Hc[c[D>>2]&63](D,j,4)|0;if((a|0)!=0){F=a;G=10}}if((G|0)==10){G=0;a=E+36|0;D=F+20|0;ah(c[a>>2]|0,c[D>>2]|0)|0;h=c[a>>2]|0;y=Hc[c[h>>2]&63](h,b,4)|0;c[D>>2]=Yg(c[a>>2]|0)|0;if((y|0)!=0){G=16;break}}if((c[q>>2]|0)==(E|0)){H=r}else{c[f>>2]=k;y=c[E+28>>2]|0;H=Hc[c[y>>2]&63](y,p,4)|0}y=E+32|0;a=c[y>>2]|0;D=H+32|0;ah(a,c[D>>2]|0)|0;Hc[c[a>>2]&63](a,s,1)|0;c[D>>2]=Yg(a)|0;a=E+36|0;D=c[a>>2]|0;h=H+24|0;ah(D,c[h>>2]|0)|0;Hc[c[D>>2]&63](D,s,1)|0;c[h>>2]=Yg(D)|0;if((c[t>>2]|0)==(E|0)){I=u}else{c[m>>2]=n;D=c[E+28>>2]|0;I=Hc[c[D>>2]&63](D,l,4)|0}D=c[y>>2]|0;y=I+28|0;ah(D,c[y>>2]|0)|0;Hc[c[D>>2]&63](D,v,1)|0;c[y>>2]=Yg(D)|0;D=c[a>>2]|0;a=I+20|0;ah(D,c[a>>2]|0)|0;Hc[c[D>>2]&63](D,v,1)|0;c[a>>2]=Yg(D)|0;D=uy(E)|0;if((D|0)==0){G=16;break}else{E=D}}if((G|0)==16){i=e;return}}function zw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=c[(c[b+28>>2]|0)+4>>2]|0;a=c[(c[d+28>>2]|0)+4>>2]|0;f=e-a|0;do{if((e|0)==(a|0)){if((c[b>>2]&3|0)==0){g=0;return g|0}if((c[d>>2]&3|0)==0){g=0;return g|0}else{h=(c[b+4>>2]|0)-(c[d+4>>2]|0)|0;break}}else{h=f}}while(0);if((h|0)==0){g=0;return g|0}g=h>>31|1;return g|0}function Aw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;e=c[b+28>>2]|0;a=c[d+28>>2]|0;if((e|0)==(a|0)){f=((c[b>>2]|0)>>>4)-((c[d>>2]|0)>>>4)|0}else{f=((c[e>>2]|0)>>>4)-((c[a>>2]|0)>>>4)|0}if((f|0)==0){g=0;return g|0}g=f>>31|1;return g|0}function Bw(){var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;e=i;i=i+2224|0;f=e+1024|0;g=e+1424|0;c[53298]=0;c[53306]=-2;h=e|0;j=0;k=0;l=f;m=f;n=200;o=g;p=g;a:while(1){b[m>>1]=j;if((l+(n-1<<1)|0)>>>0>m>>>0){q=l;r=m;s=n;t=o;u=p}else{g=m-l>>1;v=g+1|0;if(n>>>0>9999>>>0){w=152;break}x=n<<1;y=x>>>0>1e4>>>0?1e4:x;x=dF(y*6|0|3)|0;if((x|0)==0){w=152;break}z=x;A=l;tF(x|0,A|0,v<<1)|0;B=x+((y>>>1&1073741823)<<2)|0;tF(B|0,p|0,v<<2)|0;if((l|0)!=(f|0)){eF(A)}if((y-1|0)>(g|0)){q=z;r=z+(g<<1)|0;s=y;t=B+(g<<2)|0;u=B}else{C=z;D=1;break}}if((j|0)==6){C=q;D=0;break}z=a[75496+j|0]|0;B=z<<24>>24;do{if(z<<24>>24==-18){w=22}else{g=c[53306]|0;if((g|0)==-2){y=jy()|0;c[53306]=y;E=y}else{E=g}do{if((E|0)<1){c[53306]=0;F=0}else{if(E>>>0>=269>>>0){F=2;break}F=d[74992+E|0]|0}}while(0);g=F+B|0;if(g>>>0>59>>>0){w=22;break}if((d[75696+g|0]|0)!=(F|0)){w=22;break}y=a[75264+g|0]|0;g=y<<24>>24;if(y<<24>>24<1){G=-g|0;w=23;break}else{c[53306]=-2;y=t+4|0;c[y>>2]=c[53300];H=g;I=(k|0)==0?0:k-1|0;J=r;K=y;break}}}while(0);do{if((w|0)==22){w=0;B=a[75616+j|0]|0;if(B<<24>>24!=0){G=B&255;w=23;break}B=c[53306]|0;do{if((k|0)==0){c[53298]=(c[53298]|0)+1;oy(148320);L=r;M=t;N=z}else if((k|0)==3){if((B|0)<1){if((B|0)==0){C=q;D=1;break a}else{L=r;M=t;N=z;break}}else{c[53306]=-2;L=r;M=t;N=z;break}}else{L=r;M=t;N=z}}while(0);while(1){if(N<<24>>24!=-18){B=(N<<24>>24)+1|0;if(N<<24>>24>-2&(B|0)<60&(B|0)==19){break}}if((L|0)==(q|0)){C=q;D=1;break a}B=L-2|0;L=B;M=M-4|0;N=a[75496+(b[B>>1]|0)|0]|0}B=M+4|0;c[B>>2]=c[53300];H=1;I=3;J=L;K=B}}while(0);b:do{if((w|0)==23){w=0;z=d[75328+G|0]|0;B=1-z|0;y=t+(B<<2)|0;g=c[y>>2]|0;c:do{switch(G|0){case 32:{A=c[t-16>>2]|0;v=c[t-8>>2]|0;x=c[t>>2]|0;do{if((x|0)==0){O=v}else{P=xF(v|0)|0;Q=P+2+(xF(x|0)|0)|0;if((Q|0)<1025){R=h}else{R=dF(Q)|0}nb(R|0,81472,(Q=i,i=i+16|0,c[Q>>2]=v,c[Q+8>>2]=x,Q)|0)|0;i=Q;Q=dy(c[53732]|0,R)|0;fy(c[53732]|0,v)|0;fy(c[53732]|0,x)|0;if((R|0)==(h|0)){O=Q;break}eF(R);O=Q}}while(0);x=Ax(c[c[53540]>>2]|0,A,1)|0;v=sx(c[53732]|0,16)|0;Q=v;c[v>>2]=259;c[v+4>>2]=x;c[v+8>>2]=O;v=c[53540]|0;x=v+12|0;P=c[x>>2]|0;if((P|0)!=0){c[P+12>>2]=Q}c[x>>2]=Q;x=v+8|0;if((c[x>>2]|0)==0){c[x>>2]=Q}fy(c[53732]|0,A)|0;S=g;break};case 12:{S=1;break};case 21:{if((c[t-4>>2]|0)==0){Q=c[53540]|0;x=c[Q+24>>2]|0;if((x|0)==0){T=Q}else{v=x;x=Q;while(1){Q=v+4|0;P=c[Q>>2]|0;U=Wv(c[x>>2]|0,1,P,0)|0;V=Q|0;c[V>>2]=U;if((U|0)==0){c[V>>2]=Wv(c[c[53540]>>2]|0,1,P,213328)|0}c[v>>2]=266;fy(c[53732]|0,P)|0;P=c[v+12>>2]|0;V=c[53540]|0;if((P|0)==0){T=V;break}else{v=P;x=V}}}x=c[T+8>>2]|0;if((x|0)==0){W=T;X=0}else{v=x;x=T;while(1){A=c[v+4>>2]|0;V=c[x+24>>2]|0;if((V|0)==0){Y=x}else{P=V;do{do{if((c[P>>2]|0)==266){V=c[P+4>>2]|0;if((V|0)==0){break}hw(A,V,c[P+8>>2]|0)|0}}while(0);P=c[P+12>>2]|0;}while((P|0)!=0);Y=c[53540]|0}P=c[v+12>>2]|0;if((P|0)==0){break}else{v=P;x=Y}}W=Y;X=c[Y+8>>2]|0}Gw(X);c[W+12>>2]=0;c[W+8>>2]=0;x=c[53540]|0;v=x+24|0;Gw(c[v>>2]|0);c[x+28>>2]=0;c[v>>2]=0;v=c[53540]|0;x=v+16|0;Gw(c[x>>2]|0);c[v+20>>2]=0;c[x>>2]=0;c[(c[53540]|0)+4>>2]=0;S=g;break c}Ew(2);x=c[53540]|0;v=c[x+24>>2]|0;if((v|0)==0){Z=0}else{P=a[172752]|0;A=0;V=v;while(1){do{if((c[V>>2]|0)==267){v=c[V+4>>2]|0;if((a[v]|0)!=P<<24>>24){_=A;break}if((Ya(v|0,172752)|0)!=0){_=A;break}_=c[V+8>>2]|0}else{_=A}}while(0);v=c[V+12>>2]|0;if((v|0)==0){Z=_;break}else{A=_;V=v}}}V=c[x+16>>2]|0;A=V+12|0;P=c[A>>2]|0;if((P|0)==0){$=x}else{v=V;V=A;A=P;do{P=v+4|0;do{if((c[v>>2]|0)==262){U=c[P>>2]|0;Q=ux(U)|0;if((Q|0)==0){break}else{aa=Q}do{Q=zx(c[c[53540]>>2]|0,aa,0)|0;Fw(Q,0,c[V>>2]|0,Z);aa=vx(U,aa)|0;}while((aa|0)!=0)}else{U=c[P>>2]|0;if((U|0)==0){break}Fw(c[U+4>>2]|0,c[U+8>>2]|0,A,Z);Q=c[U+12>>2]|0;if((Q|0)==0){break}else{ba=Q}do{Fw(c[ba+4>>2]|0,c[ba+8>>2]|0,c[V>>2]|0,Z);ba=c[ba+12>>2]|0;}while((ba|0)!=0)}}while(0);v=c[V>>2]|0;V=v+12|0;A=c[V>>2]|0;}while((A|0)!=0);$=c[53540]|0}A=$+8|0;Gw(c[A>>2]|0);c[$+12>>2]=0;c[A>>2]=0;A=c[53540]|0;V=A+16|0;Gw(c[V>>2]|0);c[A+20>>2]=0;c[V>>2]=0;V=c[53540]|0;A=V+24|0;Gw(c[A>>2]|0);c[V+28>>2]=0;c[A>>2]=0;c[(c[53540]|0)+4>>2]=0;S=g;break};case 34:{Cw(258,0);S=g;break};case 35:{S=258;break};case 36:{S=259;break};case 37:{S=260;break};case 38:{S=c[t-4>>2]|0;break};case 39:{S=0;break};case 48:{A=c[t-8>>2]|0;V=c[t>>2]|0;v=sx(c[53732]|0,16)|0;x=v;c[v>>2]=267;c[v+4>>2]=A;c[v+8>>2]=V;V=c[53540]|0;v=V+28|0;A=c[v>>2]|0;if((A|0)!=0){c[A+12>>2]=x}c[v>>2]=x;v=V+24|0;if((c[v>>2]|0)!=0){S=g;break c}c[v>>2]=x;S=g;break};case 2:{py();fx(c[53732]|0);S=g;break};case 25:{x=c[53540]|0;v=c[x+8>>2]|0;if((v|0)==0){V=c[x+4>>2]|0;if((V|0)==0){ca=0;da=x}else{x=sx(c[53732]|0,16)|0;c[x>>2]=262;c[x+4>>2]=V;c[x+8>>2]=0;ca=x;da=c[53540]|0}c[da+4>>2]=0;ea=ca}else{x=sx(c[53732]|0,16)|0;c[x>>2]=265;c[x+4>>2]=v;c[x+8>>2]=0;c[(c[53540]|0)+12>>2]=0;c[(c[53540]|0)+8>>2]=0;ea=x}if((ea|0)==0){S=g;break c}x=c[53540]|0;v=x+20|0;V=c[v>>2]|0;if((V|0)!=0){c[V+12>>2]=ea}c[v>>2]=ea;v=x+16|0;if((c[v>>2]|0)!=0){S=g;break c}c[v>>2]=ea;S=g;break};case 3:{v=c[53732]|0;if((v|0)==0){S=g;break c}Kw(v)|0;c[53854]=0;c[53732]=0;S=g;break};case 6:{v=c[t>>2]|0;x=c[53732]|0;if((x|0)==0){a[174920]=(c[t-8>>2]&255)<<1&2|c[t-4>>2]&1|a[174920]&-12|8;V=Hw(v,174920,c[53840]|0)|0;c[53732]=V;fa=V}else{fa=x}c[53854]=fa;x=c[53540]|0;V=sx(fa,36)|0;c[V+32>>2]=x;c[V>>2]=fa;c[53540]=V;fy(0,v)|0;S=g;break};case 55:{S=0;break};case 59:{S=c[t>>2]|0;break};case 60:{S=c[t>>2]|0;break};case 61:{S=c[t>>2]|0;break};case 62:{v=c[t-8>>2]|0;V=c[t>>2]|0;x=xF(v|0)|0;A=x+1+(xF(V|0)|0)|0;if((A|0)<1025){ga=h}else{ga=dF(A)|0}zF(ga|0,v|0)|0;AF(ga|0,V|0)|0;A=dy(c[53732]|0,ga)|0;fy(c[53732]|0,v)|0;fy(c[53732]|0,V)|0;if((ga|0)!=(h|0)){eF(ga)}S=A;break};case 8:{S=0;break};case 9:{S=1;break};case 7:{S=c[t>>2]|0;break};case 49:{A=c[t>>2]|0;V=sx(c[53732]|0,16)|0;v=V;c[V>>2]=267;c[V+4>>2]=A;c[V+8>>2]=0;V=c[53540]|0;A=V+28|0;x=c[A>>2]|0;if((x|0)!=0){c[x+12>>2]=v}c[A>>2]=v;A=V+24|0;if((c[A>>2]|0)!=0){S=g;break c}c[A>>2]=v;S=g;break};case 51:{v=c[t>>2]|0;A=c[53540]|0;V=ry(c[A>>2]|0,v,1)|0;x=sx(c[53732]|0,36)|0;c[x+32>>2]=A;c[x>>2]=V;c[53540]=x;fy(c[53732]|0,v)|0;S=g;break};case 52:{v=c[53540]|0;x=c[v>>2]|0;V=c[v+32>>2]|0;tx(c[53732]|0,v);c[53540]=V;c[V+4>>2]=x;S=g;break};case 53:{S=c[t>>2]|0;break};case 54:{S=0;break};case 26:{S=1;break};case 27:{S=0;break};case 30:{x=c[t>>2]|0;V=Ax(c[c[53540]>>2]|0,x,1)|0;v=sx(c[53732]|0,16)|0;A=v;c[v>>2]=259;c[v+4>>2]=V;c[v+8>>2]=0;v=c[53540]|0;V=v+12|0;P=c[V>>2]|0;if((P|0)!=0){c[P+12>>2]=A}c[V>>2]=A;V=v+8|0;if((c[V>>2]|0)==0){c[V>>2]=A}fy(c[53732]|0,x)|0;S=g;break};case 10:{S=0;break};case 11:{S=0;break};case 24:{x=c[53540]|0;A=c[x+8>>2]|0;if((A|0)==0){V=c[x+4>>2]|0;if((V|0)==0){ha=0;ia=x}else{x=sx(c[53732]|0,16)|0;c[x>>2]=262;c[x+4>>2]=V;c[x+8>>2]=0;ha=x;ia=c[53540]|0}c[ia+4>>2]=0;ja=ha}else{x=sx(c[53732]|0,16)|0;c[x>>2]=265;c[x+4>>2]=A;c[x+8>>2]=0;c[(c[53540]|0)+12>>2]=0;c[(c[53540]|0)+8>>2]=0;ja=x}if((ja|0)==0){S=g;break c}x=c[53540]|0;A=x+20|0;V=c[A>>2]|0;if((V|0)!=0){c[V+12>>2]=ja}c[A>>2]=ja;A=x+16|0;if((c[A>>2]|0)!=0){S=g;break c}c[A>>2]=ja;S=g;break};case 31:{A=c[t-8>>2]|0;x=c[t>>2]|0;V=Ax(c[c[53540]>>2]|0,A,1)|0;v=sx(c[53732]|0,16)|0;P=v;c[v>>2]=259;c[v+4>>2]=V;c[v+8>>2]=x;x=c[53540]|0;v=x+12|0;V=c[v>>2]|0;if((V|0)!=0){c[V+12>>2]=P}c[v>>2]=P;v=x+8|0;if((c[v>>2]|0)==0){c[v>>2]=P}fy(c[53732]|0,A)|0;S=g;break};case 33:{Cw(c[t-8>>2]|0,c[t-4>>2]|0);S=g;break};default:{S=g}}}while(0);g=r+(-z<<1)|0;A=t+(B<<2)|0;c[y>>2]=S;P=(d[75392+G|0]|0)-24|0;v=b[g>>1]|0;x=v+(a[75456+P|0]|0)|0;do{if(x>>>0<60>>>0){if((d[75696+x|0]|0)!=(v|0)){break}H=a[75264+x|0]|0;I=k;J=g;K=A;break b}}while(0);H=a[75576+P|0]|0;I=k;J=g;K=A}}while(0);j=H;k=I;l=q;m=J+2|0;n=s;o=K;p=u}if((w|0)==152){oy(116392);C=l;D=2}if((C|0)==(f|0)){i=e;return D|0}eF(C);i=e;return D|0}function Cw(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;if((d|0)!=0){Fv(0,167720,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f}d=c[(c[53540]|0)+24>>2]|0;if((d|0)!=0){g=d;do{if((c[g+8>>2]|0)==0){Fv(0,167720,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f}g=c[g+12>>2]|0;}while((g|0)!=0)}if((b|0)==260){h=2}else if((b|0)==258){h=0}else if((b|0)==259){h=1}else{h=0}Ew(h);b=c[53540]|0;g=c[b+24>>2]|0;if((g|0)==0){j=b;k=0;l=j+24|0;Gw(k);m=j+28|0;c[m>>2]=0;c[l>>2]=0;i=e;return}else{n=g}do{g=c[n+4>>2]|0;b=c[c[53540]>>2]|0;if((a[g+21|0]|0)!=0&(b|0)==(c[53732]|0)){o=g;p=14}else{f=Wv(b,h,c[g+8>>2]|0,c[n+8>>2]|0)|0;if((c[c[53540]>>2]|0)==(c[53732]|0)){o=f;p=14}}if((p|0)==14){p=0;a[o+22|0]=1}n=c[n+12>>2]|0;}while((n|0)!=0);n=c[53540]|0;j=n;k=c[n+24>>2]|0;l=j+24|0;Gw(k);m=j+28|0;c[m>>2]=0;c[l>>2]=0;i=e;return}function Dw(a,b){a=a|0;b=b|0;var d=0,e=0;c[53304]=a;c[53732]=0;c[53854]=0;d=(b|0)!=0?b:174304;c[53840]=d;iy(d,a);Bw()|0;a=c[53854]|0;if((a|0)!=0){e=a;return e|0}qy();e=c[53854]|0;return e|0}function Ew(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[(c[53540]|0)+24>>2]|0;if((d|0)==0){return}if((b|0)==2){e=d}else{f=d;do{d=f+4|0;g=c[d>>2]|0;h=Wv(c[c[53540]>>2]|0,b,g,0)|0;i=d|0;c[i>>2]=h;if((h|0)==0){c[i>>2]=Wv(c[c[53540]>>2]|0,b,g,213328)|0}c[f>>2]=266;fy(c[53732]|0,g)|0;f=c[f+12>>2]|0;}while((f|0)!=0);return}do{f=e+4|0;b=c[f>>2]|0;if((a[b]|0)==(a[172752]|0)){if((Ya(b|0,172752)|0)!=0){j=5}}else{j=5}if((j|0)==5){j=0;g=Wv(c[c[53540]>>2]|0,2,b,0)|0;i=f|0;c[i>>2]=g;if((g|0)==0){c[i>>2]=Wv(c[c[53540]>>2]|0,2,b,213328)|0}c[e>>2]=266;fy(c[53732]|0,b)|0}e=c[e+12>>2]|0;}while((e|0)!=0);return}function Fw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=d+4|0;if((c[d>>2]|0)==262){d=c[f>>2]|0;g=ux(d)|0;if((g|0)==0){return}else{h=g}do{g=zx(c[c[53540]>>2]|0,h,0)|0;i=uw(c[c[53540]>>2]|0,a,g,e,1)|0;do{if((i|0)!=0){g=c[i>>2]&3;j=c[((g|0)==2?i:i-32|0)+28>>2]|0;k=(c[((g|0)==3?i:i+32|0)+28>>2]|0)!=(j|0)&(j|0)==(a|0);j=k?b:0;g=k?0:b;if((g|0)!=0){k=Wv(c[c[53540]>>2]|0,2,97656,0)|0;if((k|0)==0){l=Wv(c[c[53540]>>2]|0,2,97656,213328)|0}else{l=k}hw(i|0,l,g)|0}if((j|0)==0){m=i|0}else{g=Wv(c[c[53540]>>2]|0,2,91384,0)|0;if((g|0)==0){n=Wv(c[c[53540]>>2]|0,2,91384,213328)|0}else{n=g}g=i|0;hw(g,n,j)|0;m=g}g=c[(c[53540]|0)+24>>2]|0;if((g|0)==0){break}else{o=g}do{do{if((c[o>>2]|0)==266){g=c[o+4>>2]|0;if((g|0)==0){break}hw(m,g,c[o+8>>2]|0)|0}}while(0);o=c[o+12>>2]|0;}while((o|0)!=0)}}while(0);h=vx(d,h)|0;}while((h|0)!=0);return}else{h=c[f>>2]|0;if((h|0)==0){return}else{p=h}do{h=zx(c[c[53540]>>2]|0,c[p+4>>2]|0,0)|0;f=c[p+8>>2]|0;d=uw(c[c[53540]>>2]|0,a,h,e,1)|0;do{if((d|0)!=0){h=c[d>>2]&3;o=c[((h|0)==2?d:d-32|0)+28>>2]|0;m=(c[((h|0)==3?d:d+32|0)+28>>2]|0)!=(o|0)&(o|0)==(a|0);o=m?b:f;h=m?f:b;if((h|0)!=0){m=Wv(c[c[53540]>>2]|0,2,97656,0)|0;if((m|0)==0){q=Wv(c[c[53540]>>2]|0,2,97656,213328)|0}else{q=m}hw(d|0,q,h)|0}if((o|0)==0){r=d|0}else{h=Wv(c[c[53540]>>2]|0,2,91384,0)|0;if((h|0)==0){s=Wv(c[c[53540]>>2]|0,2,91384,213328)|0}else{s=h}h=d|0;hw(h,s,o)|0;r=h}h=c[(c[53540]|0)+24>>2]|0;if((h|0)==0){break}else{t=h}do{do{if((c[t>>2]|0)==266){h=c[t+4>>2]|0;if((h|0)==0){break}hw(r,h,c[t+8>>2]|0)|0}}while(0);t=c[t+12>>2]|0;}while((t|0)!=0)}}while(0);p=c[p+12>>2]|0;}while((p|0)!=0);return}}function Gw(a){a=a|0;var b=0,d=0;if((a|0)==0){return}else{b=a}while(1){a=c[b+12>>2]|0;d=c[b>>2]|0;if((d|0)==267|(d|0)==266){fy(c[53732]|0,c[b+8>>2]|0)|0}else if((d|0)==265){Gw(c[b+4>>2]|0)}tx(c[53732]|0,b);if((a|0)==0){break}else{b=a}}return}function Hw(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;i=i+8|0;g=d;d=i;i=i+4|0;i=i+7&-8;c[d>>2]=c[g>>2];g=f|0;h=(e|0)!=0;if(h){j=c[e>>2]|0;k=(j|0)==0?174232:j}else{k=174232}j=Ec[c[k>>2]&63](e)|0;l=k+4|0;m=Oc[c[l>>2]&255](j,68)|0;c[m>>2]=k;c[m+12>>2]=j;if(h){h=c[e+4>>2]|0;c[m+4>>2]=(h|0)==0?174272:h;h=c[e+8>>2]|0;n=(h|0)==0?174256:h}else{c[m+4>>2]=174272;n=174256}c[m+8>>2]=n;a[m+40|0]=1;n=Oc[c[l>>2]&255](j,56)|0;j=n;l=n;c[l>>2]=c[l>>2]&-4;l=n+52|0;c[l>>2]=m;h=n+12|0;k=c[d>>2]|0;c[h>>2]=k;a[h]=k&255|8;c[n+48>>2]=j;k=Oc[c[c[m+4>>2]>>2]&255](j,e)|0;c[(c[l>>2]|0)+16>>2]=k;if((Yw(j,0,b,g,1)|0)==0){o=Iw(j)|0;p=o|0;ax(o,0,p);i=f;return o|0}c[n+4>>2]=c[g>>2];o=Iw(j)|0;p=o|0;ax(o,0,p);i=f;return o|0}function Iw(b){b=b|0;var d=0,e=0,f=0,g=0;c[b+24>>2]=yy(b,173952,c[43326]|0)|0;c[b+28>>2]=yy(b,173992,c[43326]|0)|0;d=b|0;e=(Ix(d)|0)==(b|0);c[b+32>>2]=yy(b,e?174152:174072,c[43326]|0)|0;e=(Ix(d)|0)==(b|0);c[b+36>>2]=yy(b,e?174192:174112,c[43326]|0)|0;c[b+40>>2]=yy(b,174032,c[43326]|0)|0;e=uy(b)|0;do{if((e|0)!=0){f=(c[e+52>>2]|0)+24|0;g=(c[f>>2]|0)+1|0;c[f>>2]=g;f=b;c[f>>2]=c[f>>2]&15|g<<4;g=c[e+40>>2]|0;Hc[c[g>>2]&63](g,d,1)|0;if((a[e+12|0]&64)!=0){break}Jx(b,d);return b|0}}while(0);Yv(b);Jx(b,d);return b|0}function Jw(a,b){a=a|0;b=b|0;var d=0;d=(c[a+52>>2]|0)+24+(b<<2)|0;b=(c[d>>2]|0)+1|0;c[d>>2]=b;return b|0}function Kw(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=uy(b)|0;e=(d|0)==0;do{if(e){f=b+52|0;if((c[(c[c[f>>2]>>2]|0)+16>>2]|0)==0){break}Nx(b,b|0);_w(b,0,c[b+4>>2]|0);g=c[f>>2]|0;Cc[c[(c[g>>2]|0)+16>>2]&255](c[g+12>>2]|0);h=0;return h|0}}while(0);g=sy(b)|0;if((g|0)!=0){f=g;while(1){g=ty(f)|0;Kw(f)|0;if((g|0)==0){break}else{f=g}}}f=ux(b)|0;if((f|0)!=0){g=f;while(1){f=vx(b,g)|0;Cx(b,g)|0;if((f|0)==0){break}else{g=f}}}gx(b);g=b|0;Nx(b,g);if((Ay(b,c[b+28>>2]|0)|0)!=0){h=-1;return h|0}if((Ay(b,c[b+24>>2]|0)|0)!=0){h=-1;return h|0}if((Ay(b,c[b+36>>2]|0)|0)!=0){h=-1;return h|0}if((Ay(b,c[b+32>>2]|0)|0)!=0){h=-1;return h|0}if((Ay(b,c[b+40>>2]|0)|0)!=0){h=-1;return h|0}do{if((a[b+12|0]&64)!=0){if((_v(b)|0)==0){break}else{h=-1}return h|0}}while(0);ay(b|0);_w(b,0,c[b+4>>2]|0);if(!e){vy(d,b)|0;tx(d,g);h=0;return h|0}d=b+52|0;e=c[d>>2]|0;f=c[e+36>>2]|0;if((f|0)==0){i=e}else{e=f;while(1){Qx(b,c[e>>2]|0)|0;f=c[d>>2]|0;j=c[f+36>>2]|0;if((j|0)==0){i=f;break}else{e=j}}}Cc[c[(c[i+4>>2]|0)+20>>2]&255](c[i+16>>2]|0);if((by(b)|0)!=0){h=-1;return h|0}b=c[d>>2]|0;d=c[b+12>>2]|0;i=(c[b>>2]|0)+12|0;Dc[c[i>>2]&63](d,g);Dc[c[i>>2]&63](d,b);h=0;return h|0}function Lw(a){a=a|0;return bh(c[a+28>>2]|0)|0}function Mw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=ux(a)|0;if((b|0)==0){d=0;return d|0}e=a+32|0;f=b;b=0;while(1){g=nw(a,f)|0;if((g|0)==0){h=0}else{i=c[e>>2]|0;j=g+32|0;ah(i,c[j>>2]|0)|0;g=bh(i)|0;c[j>>2]=Yg(i)|0;h=g}g=h+b|0;i=vx(a,f)|0;if((i|0)==0){d=g;break}else{f=i;b=g}}return d|0}function Nw(b){b=b|0;return a[b+12|0]&1|0}function Ow(b){b=b|0;return(a[b+12|0]&1^1)&255|0}function Pw(a){a=a|0;return(d[a+12|0]|0)>>>1&1|0}function Qw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[b+4>>2]|0;b=c[d+4>>2]|0;if((e|0)==(b|0)){f=0;return f|0}f=e-b>>31|1;return f|0}function Rw(a,b){a=a|0;b=b|0;return a|0}function Sw(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((d|0)==0){c[e>>2]=c[5410];c[5410]=(c[5410]|0)+2;return 1}b=a;if((f|0)==0){g=cy(b,d)|0}else{g=dy(b,d)|0}c[e>>2]=g;return 1}function Tw(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Uw(a,b,c){a=a|0;b=b|0;c=c|0;if((c&1|0)!=0){return}fy(a,c)|0;return}function Vw(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((c&1|0)==0){d=c}else{d=0}return d|0}function Ww(a){a=a|0;return}function Xw(a,b,c){a=a|0;b=b|0;c=c|0;return}function Yw(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;h=(e|0)!=0;do{if(h){do{if((a[e]|0)!=37){i=c[b+52>>2]|0;j=Gc[c[(c[i+4>>2]|0)+4>>2]&127](c[i+16>>2]|0,d,e,f,g)|0;if((j|0)==0){break}else{k=j}return k|0}}while(0);j=bx(b,d,e,f)|0;if((j|0)==0){break}else{k=j}return k|0}}while(0);if((g|0)==0){k=0;return k|0}j=c[b+52>>2]|0;i=Gc[c[(c[j+4>>2]|0)+4>>2]&127](c[j+16>>2]|0,d,0,f,g)|0;if((i|0)==0|h^1){k=i;return k|0}cx(b,d,e,c[f>>2]|0);k=i;return k|0}function Zw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+52>>2]|0;return Hc[c[(c[e+4>>2]|0)+8>>2]&63](c[e+16>>2]|0,b,d)|0}function _w(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;ex(a,b,d)|0;e=c[a+52>>2]|0;Tc[c[(c[e+4>>2]|0)+12>>2]&127](c[e+16>>2]|0,b,d);return}function $w(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=Hx(a)|0;e=a;f=a+4|0;a=dx(d,c[e>>2]&3,c[f>>2]|0)|0;if((a|0)!=0){g=a;i=b;return g|0}a=c[d+52>>2]|0;d=c[(c[a+4>>2]|0)+16>>2]|0;do{if((d|0)!=0){h=Hc[d&63](c[a+16>>2]|0,c[e>>2]&3,c[f>>2]|0)|0;if((h|0)==0){break}else{g=h}i=b;return g|0}}while(0);if((c[e>>2]&3|0)==2){g=0;i=b;return g|0}e=c[f>>2]|0;nb(212968,113184,(f=i,i=i+16|0,c[f>>2]=37,c[f+8>>2]=e,f)|0)|0;i=f;g=212968;i=b;return g|0}function ax(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+52>>2]|0;Tc[c[(c[e+4>>2]|0)+24>>2]&127](c[e+16>>2]|0,b,d);return}function bx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+24|0;g=f|0;h=c[(c[a+52>>2]|0)+44+(((b|0)==3?2:b)<<2)>>2]|0;if((h|0)==0){j=0;i=f;return j|0}b=cy(a,d)|0;if((b|0)==0){j=0;i=f;return j|0}c[g+20>>2]=b;b=Hc[c[h>>2]&63](h,g,4)|0;if((b|0)==0){j=0;i=f;return j|0}c[e>>2]=c[b+16>>2];j=1;i=f;return j|0}function cx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=sx(a,24)|0;c[f+16>>2]=e;c[f+20>>2]=dy(a,d)|0;d=(b|0)==3?2:b;b=a+52|0;e=c[b>>2]|0;g=c[e+44+(d<<2)>>2]|0;if((g|0)==0){h=yy(a,172656,c[43326]|0)|0;c[(c[b>>2]|0)+44+(d<<2)>>2]=h;i=h;j=c[b>>2]|0}else{i=g;j=e}e=c[j+56+(d<<2)>>2]|0;if((e|0)==0){j=yy(a,172696,c[43326]|0)|0;c[(c[b>>2]|0)+56+(d<<2)>>2]=j;k=j}else{k=e}Hc[c[i>>2]&63](i,f,1)|0;Hc[c[k>>2]&63](k,f,1)|0;return}function dx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+24|0;f=e|0;g=c[(c[a+52>>2]|0)+56+(((b|0)==3?2:b)<<2)>>2]|0;if((g|0)==0){h=0;i=e;return h|0}c[f+16>>2]=d;d=Hc[c[g>>2]&63](g,f,4)|0;if((d|0)==0){h=0;i=e;return h|0}h=c[d+20>>2]|0;i=e;return h|0}function ex(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+24|0;f=e|0;g=(b|0)==3?2:b;b=a+52|0;h=c[(c[b>>2]|0)+56+(g<<2)>>2]|0;if((h|0)==0){j=0;i=e;return j|0}c[f+16>>2]=d;d=Hc[c[h>>2]&63](h,f,4)|0;if((d|0)==0){j=0;i=e;return j|0}f=c[(c[b>>2]|0)+44+(g<<2)>>2]|0;Hc[c[f>>2]&63](f,d,2)|0;f=c[(c[b>>2]|0)+56+(g<<2)>>2]|0;Hc[c[f>>2]&63](f,d,2)|0;fy(a,c[d+20>>2]|0)|0;tx(a,d);j=1;i=e;return j|0}function fx(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+24|0;e=d|0;c[53854]=b;f=b+52|0;g=c[f>>2]|0;h=e;j=e+16|0;e=0;do{k=g+44+(e<<2)|0;l=c[k>>2]|0;do{if((l|0)!=0){m=Hc[c[l>>2]&63](l,0,128)|0;if((m|0)==0){break}else{n=m}while(1){m=c[k>>2]|0;o=Hc[c[m>>2]&63](m,n,8)|0;do{if((a[c[n+20>>2]|0]|0)==37){m=c[(c[f>>2]|0)+56+(e<<2)>>2]|0;if((m|0)==0){break}c[j>>2]=c[n+16>>2];p=Hc[c[m>>2]&63](m,h,4)|0;if((p|0)==0){break}m=c[(c[f>>2]|0)+44+(e<<2)>>2]|0;Hc[c[m>>2]&63](m,p,2)|0;m=c[(c[f>>2]|0)+56+(e<<2)>>2]|0;Hc[c[m>>2]&63](m,p,2)|0;fy(b,c[p+20>>2]|0)|0;tx(b,p)}}while(0);if((o|0)==0){break}else{n=o}}}}while(0);e=e+1|0;}while((e|0)<3);i=d;return}function gx(a){a=a|0;var b=0,d=0,e=0;c[53854]=a;b=a+52|0;a=c[b>>2]|0;d=a+44|0;e=c[d>>2]|0;if((e|0)!=0){Vg(e)|0;c[d>>2]=0}d=a+48|0;e=c[d>>2]|0;if((e|0)!=0){Vg(e)|0;c[d>>2]=0}d=a+52|0;a=c[d>>2]|0;if((a|0)!=0){Vg(a)|0;c[d>>2]=0}d=c[b>>2]|0;b=d+56|0;a=c[b>>2]|0;if((a|0)!=0){Vg(a)|0;c[b>>2]=0}b=d+60|0;a=c[b>>2]|0;if((a|0)!=0){Vg(a)|0;c[b>>2]=0}b=d+64|0;d=c[b>>2]|0;if((d|0)==0){return}Vg(d)|0;c[b>>2]=0;return}function hx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return(c[b+16>>2]|0)-(c[d+16>>2]|0)|0}function ix(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return(c[b+20>>2]|0)-(c[d+20>>2]|0)|0}function jx(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((db(b|0,c|0,a|0)|0)==0){d=0;return d|0}d=xF(b|0)|0;return d|0}function kx(a,b){a=a|0;b=b|0;return Oa(b|0,a|0)|0}function lx(a){a=a|0;return Ia(a|0)|0}function mx(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+32|0;d=b|0;e=b+16|0;c[4961]=c[43565];c[4962]=c[43566];c[d>>2]=a;c[d+4>>2]=xF(a|0)|0;c[d+8>>2]=0;c[e>>2]=174232;c[e+4>>2]=174272;c[e+8>>2]=19840;a=Dw(d,e)|0;i=b;return a|0}function nx(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;if((e|0)==0){f=0;return f|0}g=b+8|0;h=c[g>>2]|0;if((h|0)>=(c[b+4>>2]|0)){f=0;return f|0}i=c[b>>2]|0;b=0;j=a[i+h|0]|0;k=d;d=i+(h+1)|0;while(1){a[k]=j;l=b+1|0;if(!(j<<24>>24!=10&(l|0)<(e|0))){break}h=a[d]|0;if(h<<24>>24==0){break}else{b=l;j=h;k=k+1|0;d=d+1|0}}c[g>>2]=(c[g>>2]|0)+l;f=l;return f|0}function ox(a){a=a|0;return 0}function px(a,b){a=a|0;b=b|0;a=dF(b)|0;vF(a|0,0,b|0)|0;return a|0}function qx(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a=gF(b,d)|0;if(d>>>0<=c>>>0){return a|0}vF(a+c|0,0,d-c|0)|0;return a|0}function rx(a,b){a=a|0;b=b|0;eF(b);return}function sx(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+52>>2]|0;a=Oc[c[(c[e>>2]|0)+4>>2]&255](c[e+12>>2]|0,b)|0;if((a|0)!=0){i=d;return a|0}Fv(1,98640,(b=i,i=i+1|0,i=i+7&-8,c[b>>2]=0,b)|0)|0;i=b;i=d;return a|0}function tx(a,b){a=a|0;b=b|0;var d=0;if((b|0)==0){return}d=c[a+52>>2]|0;Dc[c[(c[d>>2]|0)+12>>2]&63](c[d+12>>2]|0,b);return}function ux(a){a=a|0;var b=0,d=0;b=c[a+24>>2]|0;a=Hc[c[b>>2]&63](b,0,128)|0;if((a|0)==0){d=0;return d|0}d=c[a+16>>2]|0;return d|0}function vx(a,b){a=a|0;b=b|0;var d=0,e=0;d=nw(a,b)|0;if((d|0)==0){e=0;return e|0}b=c[a+24>>2]|0;a=Hc[c[b>>2]&63](b,d,8)|0;if((a|0)==0){e=0;return e|0}e=c[a+16>>2]|0;return e|0}function wx(a){a=a|0;var b=0,d=0;b=c[a+24>>2]|0;a=Hc[c[b>>2]&63](b,0,256)|0;if((a|0)==0){d=0;return d|0}d=c[a+16>>2]|0;return d|0}function xx(a,b){a=a|0;b=b|0;var d=0,e=0;d=nw(a,b)|0;if((d|0)==0){e=0;return e|0}b=c[a+24>>2]|0;a=Hc[c[b>>2]&63](b,d,16)|0;if((a|0)==0){e=0;return e|0}e=c[a+16>>2]|0;return e|0}function yx(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;c[53265]=d;c[53258]=213056;f=c[b+28>>2]|0;g=Hc[c[f>>2]&63](f,213016,4)|0;if((g|0)==0){h=0}else{h=c[g+16>>2]|0}if((h|0)!=0|(e|0)==0){i=h;return i|0}h=b|0;e=Ix(h)|0;do{if((e|0)!=(b|0)){c[53265]=d;c[53258]=213056;g=c[e+28>>2]|0;f=Hc[c[g>>2]&63](g,213016,4)|0;if((f|0)==0){break}g=c[f+16>>2]|0;if((g|0)==0){break}zx(b,g,1)|0;i=g;return i|0}}while(0);if((Zw(b,1,d)|0)==0){i=0;return i|0}e=Jw(b,1)|0;g=sx(b,52)|0;f=g;j=g;k=c[j>>2]|0;c[g+4>>2]=d;c[j>>2]=e<<4|k&12|1;c[g+12>>2]=Ix(h)|0;if((a[(Ix(h)|0)+12|0]&64)!=0){Wx(g,c[43580]|0,16,0)|0}k=g+16|0;e=b;do{j=e+28|0;bh(c[j>>2]|0)|0;if((Ix(e|0)|0)==(e|0)){l=k}else{l=sx(e,36)|0}c[l+16>>2]=f;d=c[j>>2]|0;Hc[c[d>>2]&63](d,l,1)|0;d=c[e+24>>2]|0;Hc[c[d>>2]&63](d,l,1)|0;e=uy(e)|0;}while((e|0)!=0);if((a[(Ix(h)|0)+12|0]&64)!=0){aw(b,f)}Jx(b,g);i=f;return i|0}function zx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=a|0;f=Ix(e)|0;if((f|0)!=(c[b+12>>2]|0)){g=0;return g|0}c[53265]=c[b+4>>2];c[53258]=213056;f=a+28|0;h=c[f>>2]|0;i=Hc[c[h>>2]&63](h,213016,4)|0;if((i|0)==0){j=0}else{j=c[i+16>>2]|0}if((j|0)!=0|(d|0)==0){g=j;return g|0}j=uy(a)|0;if((j|0)==0){g=0;return g|0}i=zx(j,b,d)|0;bh(c[f>>2]|0)|0;if((Ix(e)|0)==(a|0)){k=i+16|0}else{k=sx(a,36)|0}c[k+16>>2]=i;e=c[f>>2]|0;f=k;Hc[c[e>>2]&63](e,f,1)|0;e=c[a+24>>2]|0;Hc[c[e>>2]&63](e,f,1)|0;g=i;return g|0}function Ax(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+8|0;g=f|0;h=b|0;j=Ix(h)|0;do{if((Yw(b,1,d,g,0)|0)!=0){c[53265]=c[g>>2];c[53258]=213056;k=c[b+28>>2]|0;l=Hc[c[k>>2]&63](k,213016,4)|0;do{if((l|0)!=0){k=c[l+16>>2]|0;if((k|0)==0){break}else{m=k}i=f;return m|0}}while(0);if((e|0)==0|(j|0)==(b|0)){break}c[53265]=c[g>>2];c[53258]=213056;l=c[j+28>>2]|0;k=Hc[c[l>>2]&63](l,213016,4)|0;if((k|0)==0){break}l=c[k+16>>2]|0;if((l|0)==0){break}m=zx(b,l,1)|0;i=f;return m|0}}while(0);if((e|0)==0){m=0;i=f;return m|0}if((Yw(b,1,d,g,1)|0)==0){m=0;i=f;return m|0}d=c[g>>2]|0;g=Jw(b,1)|0;e=sx(b,52)|0;j=e;l=e;k=c[l>>2]|0;c[e+4>>2]=d;c[l>>2]=g<<4|k&12|1;c[e+12>>2]=Ix(h)|0;if((a[(Ix(h)|0)+12|0]&64)!=0){Wx(e,c[43580]|0,16,0)|0}k=e+16|0;g=b;do{l=g+28|0;bh(c[l>>2]|0)|0;if((Ix(g|0)|0)==(g|0)){n=k}else{n=sx(g,36)|0}c[n+16>>2]=j;d=c[l>>2]|0;Hc[c[d>>2]&63](d,n,1)|0;d=c[g+24>>2]|0;Hc[c[d>>2]&63](d,n,1)|0;g=uy(g)|0;}while((g|0)!=0);if((a[(Ix(h)|0)+12|0]&64)!=0){aw(b,j)}Jx(b,e);ax(b,1,e);m=j;i=f;return m|0}function Bx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;c[53288]=b;d=rw(a,b)|0;if((d|0)!=0){e=d;while(1){d=sw(a,e,b)|0;vw(a,e,0);if((d|0)==0){break}else{e=d}}}e=c[a+28>>2]|0;Hc[c[e>>2]&63](e,213136,2)|0;e=c[a+24>>2]|0;Hc[c[e>>2]&63](e,213136,2)|0;return}function Cx(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=d|0;f=d+4|0;c[53265]=c[f>>2];c[53258]=213056;g=c[b+28>>2]|0;h=Hc[c[g>>2]&63](g,213016,4)|0;if((h|0)==0){i=-1;return i|0}if((c[h+16>>2]|0)==0){i=-1;return i|0}h=b|0;if((Ix(h)|0)==(b|0)){g=rw(b,d)|0;if((g|0)!=0){j=g;while(1){g=sw(b,j,d)|0;ww(b,j)|0;if((g|0)==0){break}else{j=g}}}if((a[b+12|0]&64)!=0){bw(d)}Nx(b,d|0);ay(e);_w(b,1,c[f>>2]|0)}if((Ov(b,e,10,0,0)|0)!=0){i=-1;return i|0}if((Ix(h)|0)!=(b|0)){i=0;return i|0}tx(b,d|0);i=0;return i|0}function Dx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[(c[b+16>>2]|0)+4>>2]|0;b=c[(c[d+16>>2]|0)+4>>2]|0;if((e|0)==(b|0)){f=0;return f|0}f=e-b>>31|1;return f|0}function Ex(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=(c[c[b+16>>2]>>2]|0)>>>4;b=(c[c[d+16>>2]>>2]|0)>>>4;if((e|0)==(b|0)){f=0;return f|0}f=e-b>>31|1;return f|0}function Fx(a,b,d){a=a|0;b=b|0;d=d|0;d=c[b+16>>2]|0;if((d+16|0)==(b|0)){return}tx(c[d+12>>2]|0,b);return}function Gx(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=b;f=c[e>>2]|0;do{if((f&3|0)==0){if((uy(b)|0)==(a|0)){g=c[e>>2]|0;h=5;break}else{Fv(1,87664,(j=i,i=i+1|0,i=i+7&-8,c[j>>2]=0,j)|0)|0;i=j;k=-1;break}}else{g=f;h=5}}while(0);do{if((h|0)==5){f=g&3;if((f|0)==3|(f|0)==2){k=ww(a,b)|0;break}else if((f|0)==1){k=Cx(a,b)|0;break}else if((f|0)==0){k=Kw(b)|0;break}else{Fv(1,139728,(j=i,i=i+1|0,i=i+7&-8,c[j>>2]=0,j)|0)|0;i=j;k=0;break}}}while(0);i=d;return k|0}function Hx(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]&3;if((d|0)==1){e=c[a+12>>2]|0}else if((d|0)==3|(d|0)==2){e=c[(c[a+28>>2]|0)+12>>2]|0}else if((d|0)==0){e=a}else{Fv(1,111488,(a=i,i=i+1|0,i=i+7&-8,c[a>>2]=0,a)|0)|0;i=a;e=0}i=b;return e|0}function Ix(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]&3;if((d|0)==1){e=c[a+12>>2]|0}else if((d|0)==3|(d|0)==2){e=c[(c[a+28>>2]|0)+12>>2]|0}else if((d|0)==0){e=c[a+48>>2]|0}else{Fv(1,119456,(a=i,i=i+1|0,i=i+7&-8,c[a>>2]=0,a)|0)|0;i=a;e=0}i=b;return e|0}function Jx(b,d){b=b|0;d=d|0;var e=0;e=c[b+52>>2]|0;if((a[e+40|0]|0)==0){Tx(b,d,100,0);return}else{Kx(b,d,c[e+36>>2]|0);return}}function Kx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((d|0)==0){return}Kx(a,b,c[d+8>>2]|0);e=b;f=c[b>>2]&3;if((f|0)==0){g=c[d>>2]|0}else if((f|0)==1){g=(c[d>>2]|0)+12|0}else if((f|0)==2){g=(c[d>>2]|0)+24|0}else{return}f=c[g>>2]|0;if((f|0)==0){return}Tc[f&127](a,e,c[d+4>>2]|0);return}function Lx(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=c[b+52>>2]|0;if((a[f+40|0]|0)==0){Tx(b,d,101,e);return}else{Mx(b,d,e,c[f+36>>2]|0);return}}function Mx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)==0){return}Mx(a,b,d,c[e+8>>2]|0);f=b;g=c[b>>2]&3;if((g|0)==2){h=(c[e>>2]|0)+28|0}else if((g|0)==0){h=(c[e>>2]|0)+4|0}else if((g|0)==1){h=(c[e>>2]|0)+16|0}else{return}g=c[h>>2]|0;if((g|0)==0){return}Vc[g&63](a,f,c[e+4>>2]|0,d);return}function Nx(b,d){b=b|0;d=d|0;var e=0;e=c[b+52>>2]|0;if((a[e+40|0]|0)==0){Tx(b,d,102,0);return}else{Ox(b,d,c[e+36>>2]|0);return}}function Ox(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((d|0)==0){return}Ox(a,b,c[d+8>>2]|0);e=b;f=c[b>>2]&3;if((f|0)==2){g=(c[d>>2]|0)+32|0}else if((f|0)==0){g=(c[d>>2]|0)+8|0}else if((f|0)==1){g=(c[d>>2]|0)+20|0}else{return}f=c[g>>2]|0;if((f|0)==0){return}Tc[f&127](a,e,c[d+4>>2]|0);return}function Px(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=sx(a,12)|0;c[e>>2]=b;c[e+4>>2]=d;d=a+52|0;c[e+8>>2]=c[(c[d>>2]|0)+36>>2];c[(c[d>>2]|0)+36>>2]=e;return}function Qx(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=(c[a+52>>2]|0)+36|0;e=c[d>>2]|0;if((e|0)==0){f=-1;return f|0}do{if((c[e>>2]|0)==(b|0)){c[d>>2]=c[e+8>>2];g=e;h=8}else{i=e;while(1){if((i|0)==0){f=-1;h=10;break}j=i+8|0;k=c[j>>2]|0;if((c[k>>2]|0)==(b|0)){break}else{i=k}}if((h|0)==10){return f|0}if((k|0)==0){l=i;break}c[j>>2]=c[k+8>>2];g=i;h=8}}while(0);do{if((h|0)==8){if((g|0)==0){f=-1}else{l=g;break}return f|0}}while(0);tx(a,l);f=0;return f|0}function Rx(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=c[a>>2]&3;if((e|0)==3|(e|0)==2){f=c[(c[a+28>>2]|0)+12>>2]|0}else if((e|0)==1){f=c[a+12>>2]|0}else if((e|0)==0){f=c[a+48>>2]|0}else{Fv(1,119456,(g=i,i=i+1|0,i=i+7&-8,c[g>>2]=0,g)|0)|0;i=g;f=0}e=b;h=c[e>>2]&3;if((h|0)==0){j=c[b+48>>2]|0}else if((h|0)==3|(h|0)==2){j=c[(c[b+28>>2]|0)+12>>2]|0}else if((h|0)==1){j=c[b+12>>2]|0}else{Fv(1,119456,(g=i,i=i+1|0,i=i+7&-8,c[g>>2]=0,g)|0)|0;i=g;j=0}if((f|0)!=(j|0)){k=0;i=d;return k|0}j=c[e>>2]&3;if((j|0)==1){k=(yx(a,c[b+4>>2]|0,0)|0)!=0|0;i=d;return k|0}else if((j|0)==0){j=b;while(1){if((j|0)==(a|0)){k=1;l=18;break}e=uy(j)|0;if((e|0)==0){k=0;l=18;break}else{j=e}}if((l|0)==18){i=d;return k|0}}else{k=(xw(a,b,0)|0)!=0|0;i=d;return k|0}return 0}function Sx(a){a=a|0;return c[a>>2]&3|0}function Tx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;f=i;i=i+168|0;g=f|0;h=f+24|0;j=f+48|0;k=f+72|0;l=f+96|0;m=f+120|0;n=f+144|0;o=Wx(a|0,173400,44,0)|0;if((d|0)==100){p=c[b>>2]&3;if((p|0)==1){q=o+12|0}else if((p|0)==2){q=o+16|0}else if((p|0)==0){q=o+8|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;q=0}p=c[q>>2]|0;if((p|0)==0){s=Hx(b|0)|0;t=yy(s,173336,c[43326]|0)|0;c[q>>2]=t;u=t}else{u=p}p=b+4|0;c[n+8>>2]=c[p>>2];t=u|0;if((Hc[c[t>>2]&63](u,n,4)|0)!=0){i=f;return}n=sx(Hx(b|0)|0,24)|0;c[n+16>>2]=b;c[n+8>>2]=c[p>>2];c[n+12>>2]=a;if((e|0)!=0){p=sx(a,8)|0;c[n+20>>2]=p;c[p>>2]=e}Hc[c[t>>2]&63](u,n,1)|0;i=f;return}else if((d|0)==101){n=b;u=c[n>>2]&3;if((u|0)==0){v=o+8|0}else if((u|0)==1){v=o+12|0}else if((u|0)==2){v=o+16|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;v=0}u=c[v>>2]|0;if((u|0)==0){t=Hx(b|0)|0;p=yy(t,173336,c[43326]|0)|0;c[v>>2]=p;w=p}else{w=u}u=b+4|0;c[m+8>>2]=c[u>>2];if((Hc[c[w>>2]&63](w,m,4)|0)!=0){i=f;return}m=c[n>>2]&3;if((m|0)==2){x=o+40|0}else if((m|0)==0){x=o+32|0}else if((m|0)==1){x=o+36|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;x=0}m=c[x>>2]|0;if((m|0)==0){w=Hx(b|0)|0;p=yy(w,173336,c[43326]|0)|0;c[x>>2]=p;y=p}else{y=m}c[l+8>>2]=c[u>>2];if((Hc[c[y>>2]&63](y,l,4)|0)!=0){i=f;return}l=c[n>>2]&3;if((l|0)==0){z=o+20|0}else if((l|0)==1){z=o+24|0}else if((l|0)==2){z=o+28|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;z=0}l=c[z>>2]|0;if((l|0)==0){n=Hx(b|0)|0;y=yy(n,173336,c[43326]|0)|0;c[z>>2]=y;A=y}else{A=l}c[k+8>>2]=c[u>>2];l=A|0;y=Hc[c[l>>2]&63](A,k,4)|0;if((y|0)==0){k=sx(Hx(b|0)|0,24)|0;c[k+16>>2]=b;c[k+8>>2]=c[u>>2];c[k+12>>2]=a;if((e|0)!=0){u=sx(a,8)|0;c[k+20>>2]=u;c[u>>2]=e}Hc[c[l>>2]&63](A,k,1)|0;B=k}else{B=y}y=c[B+20>>2]|0;if((y|0)==0){i=f;return}else{C=y}while(1){if((c[C>>2]|0)==(e|0)){D=73;break}y=c[C+4>>2]|0;if((y|0)==0){D=73;break}else{C=y}}if((D|0)==73){i=f;return}}else if((d|0)==102){d=b;D=c[d>>2]&3;if((D|0)==0){E=o+8|0}else if((D|0)==1){E=o+12|0}else if((D|0)==2){E=o+16|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;E=0}D=c[E>>2]|0;if((D|0)==0){C=Hx(b|0)|0;y=yy(C,173336,c[43326]|0)|0;c[E>>2]=y;F=y}else{F=D}D=b+4|0;c[j+8>>2]=c[D>>2];y=F|0;E=Hc[c[y>>2]&63](F,j,4)|0;if((E|0)!=0){Hc[c[y>>2]&63](F,E,2)|0}E=c[d>>2]&3;if((E|0)==0){G=o+20|0}else if((E|0)==1){G=o+24|0}else if((E|0)==2){G=o+28|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;G=0}E=c[G>>2]|0;if((E|0)==0){F=Hx(b|0)|0;y=yy(F,173336,c[43326]|0)|0;c[G>>2]=y;H=y}else{H=E}c[h+8>>2]=c[D>>2];E=H|0;y=Hc[c[E>>2]&63](H,h,4)|0;if((y|0)!=0){Hc[c[E>>2]&63](H,y,2)|0}y=c[d>>2]&3;if((y|0)==0){I=o+32|0}else if((y|0)==1){I=o+36|0}else if((y|0)==2){I=o+40|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;I=0}o=c[I>>2]|0;if((o|0)==0){y=Hx(b|0)|0;d=yy(y,173336,c[43326]|0)|0;c[I>>2]=d;J=d}else{J=o}c[g+8>>2]=c[D>>2];o=J|0;if((Hc[c[o>>2]&63](J,g,4)|0)!=0){i=f;return}g=sx(Hx(b|0)|0,24)|0;c[g+16>>2]=b;c[g+8>>2]=c[D>>2];c[g+12>>2]=a;if((e|0)!=0){D=sx(a,8)|0;c[g+20>>2]=D;c[D>>2]=e}Hc[c[o>>2]&63](J,g,1)|0;i=f;return}else{Fv(1,79840,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;i=f;return}}function Ux(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;d=c[b+20>>2]|0;a=b+12|0;if((d|0)==0){e=c[a>>2]|0;tx(e,b);return}else{f=d}while(1){d=c[f+4>>2]|0;tx(c[a>>2]|0,f);if((d|0)==0){break}else{f=d}}e=c[a>>2]|0;tx(e,b);return}function Vx(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=b+8|0;h=c[g>>2]|0;j=h;while(1){if((j|0)==0){k=0;l=14;break}m=c[j>>2]|0;if((m|0)==(d|0)){l=7;break}if((a[d]|0)==(a[m]|0)){if((Ya(d|0,m|0)|0)==0){l=7;break}}m=c[j+4>>2]|0;if((m|0)==(h|0)){k=0;l=14;break}else{j=m}}if((l|0)==7){d=b;m=c[d>>2]|0;if((m&4|0)==0){if((j|0)==(h|0)&(e|0)==0){k=h;i=f;return k|0}c[g>>2]=j;g=e<<2&4;c[d>>2]=m&-5|g;d=m&3;if((d-2|0)>>>0>=2>>>0){k=j;i=f;return k|0}m=(d|0)==3?b-32|0:b+32|0;c[m+8>>2]=j;b=m;c[b>>2]=c[b>>2]&-5|g;k=j;i=f;return k|0}else{if((e|0)==0){k=j;i=f;return k|0}if((h|0)==(j|0)){k=h;i=f;return k|0}Fv(1,168464,(h=i,i=i+1|0,i=i+7&-8,c[h>>2]=0,h)|0)|0;i=h;k=j;i=f;return k|0}}else if((l|0)==14){i=f;return k|0}return 0}function Wx(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=Hx(b)|0;h=b+8|0;i=c[h>>2]|0;j=i;while(1){if((j|0)==0){k=0;break}l=c[j>>2]|0;if((l|0)==(d|0)){m=7;break}if((a[d]|0)==(a[l]|0)){if((Ya(d|0,l|0)|0)==0){m=7;break}}l=c[j+4>>2]|0;if((l|0)==(i|0)){k=0;break}else{j=l}}do{if((m|0)==7){l=b;n=c[l>>2]|0;if((n&4|0)!=0){k=j;break}if((j|0)==(i|0)){k=i;break}c[h>>2]=j;c[l>>2]=n&-5;l=n&3;if((l-2|0)>>>0>=2>>>0){k=j;break}n=(l|0)==3?b-32|0:b+32|0;c[n+8>>2]=j;l=n;c[l>>2]=c[l>>2]&-5;k=j}}while(0);do{if((k|0)!=0|(e|0)==0){o=k}else{j=sx(g,e)|0;i=j;c[j>>2]=dy(g,d)|0;m=b;l=c[m>>2]&3;if((l|0)==1){n=c[h>>2]|0;do{if((n|0)==0){c[j+4>>2]=i}else{p=n+4|0;q=c[p>>2]|0;if((q|0)==(n|0)){c[p>>2]=i;c[j+4>>2]=n;break}else{c[j+4>>2]=q;c[p>>2]=i;break}}}while(0);n=c[m>>2]|0;if((n&4|0)!=0){o=i;break}c[h>>2]=i;c[m>>2]=n&-5;p=n&3;if((p-2|0)>>>0>=2>>>0){o=i;break}n=(p|0)==3?b-32|0:b+32|0;c[n+8>>2]=i;p=n;c[p>>2]=c[p>>2]&-5;o=i;break}else if((l|0)==3|(l|0)==2){p=c[h>>2]|0;do{if((p|0)==0){c[j+4>>2]=i}else{n=p+4|0;q=c[n>>2]|0;if((q|0)==(p|0)){c[n>>2]=i;c[j+4>>2]=p;break}else{c[j+4>>2]=q;c[n>>2]=i;break}}}while(0);p=c[m>>2]|0;if((p&4|0)!=0){o=i;break}c[h>>2]=i;c[m>>2]=p&-5;n=p&3;if((n-2|0)>>>0>=2>>>0){o=i;break}p=(n|0)==3?b-32|0:b+32|0;c[p+8>>2]=i;n=p;c[n>>2]=c[n>>2]&-5;o=i;break}else if((l|0)==0){n=c[h>>2]|0;do{if((n|0)==0){c[j+4>>2]=i}else{p=n+4|0;q=c[p>>2]|0;if((q|0)==(n|0)){c[p>>2]=i;c[j+4>>2]=n;break}else{c[j+4>>2]=q;c[p>>2]=i;break}}}while(0);j=c[m>>2]|0;if((j&4|0)!=0){o=i;break}c[h>>2]=i;c[m>>2]=j&-5;n=j&3;if((n-2|0)>>>0>=2>>>0){o=i;break}j=(n|0)==3?b-32|0:b+32|0;c[j+8>>2]=i;n=j;c[n>>2]=c[n>>2]&-5;o=i;break}else{o=i;break}}}while(0);if((f|0)==0){r=o;return r|0}Vx(b,d,1)|0;r=o;return r|0}function Xx(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=b;f=Hx(b)|0;g=b+8|0;h=c[g>>2]|0;i=h;while(1){if((i|0)==0){j=-1;k=18;break}l=c[i>>2]|0;if((l|0)==(d|0)){k=7;break}if((a[d]|0)==(a[l]|0)){if((Ya(d|0,l|0)|0)==0){k=7;break}}l=c[i+4>>2]|0;if((l|0)==(h|0)){j=-1;k=18;break}else{i=l}}if((k|0)==7){d=b;l=c[d>>2]|0;do{if((l&4|0)==0){if((i|0)==(h|0)){m=h;n=h;break}c[g>>2]=i;c[d>>2]=l&-5;o=l&3;if((o-2|0)>>>0>=2>>>0){m=i;n=i;break}p=(o|0)==3?b-32|0:b+32|0;c[p+8>>2]=i;o=p;c[o>>2]=c[o>>2]&-5;m=i;n=i}else{m=i;n=h}}while(0);if((m|0)==0){j=-1;return j|0}else{q=n}do{r=q+4|0;q=c[r>>2]|0;}while((q|0)!=(m|0));q=m+4|0;c[r>>2]=c[q>>2];r=c[d>>2]|0;n=r&3;do{if((n|0)==1|(n|0)==3|(n|0)==2){Ov(Ix(f|0)|0,e,26,m,0)|0}else if((n|0)==0){if((c[g>>2]|0)!=(m|0)){break}h=c[q>>2]|0;c[g>>2]=(h|0)==(m|0)?0:h;c[d>>2]=r&-5}}while(0);fy(f,c[m>>2]|0)|0;tx(f,m);j=0;return j|0}else if((k|0)==18){return j|0}return 0}function Yx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;a=d;e=b+8|0;if((c[e>>2]|0)!=(a|0)){return}f=c[d+4>>2]|0;d=(f|0)==(a|0)?0:f;c[e>>2]=d;e=b;f=c[e>>2]|0;c[e>>2]=f&-5;e=f&3;if((e-2|0)>>>0>=2>>>0){return}f=(e|0)==3?b-36+4|0:b+32|0;c[f+8>>2]=d;d=f;c[d>>2]=c[d>>2]&-5;return}function Zx(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=(d|0)<0?-d|0:d;if((b|0)==0){Wx(a|0,c,f,e)|0;if((d|0)>-1){return}g=sy(a)|0;if((g|0)==0){return}else{h=g}do{Zx(h,0,c,d,e);h=ty(h)|0;}while((h|0)!=0);return}else if((b|0)==1|(b|0)==2|(b|0)==3){h=ux(a)|0;if((h|0)==0){return}if((b|0)==1){b=h;do{Wx(b|0,c,f,e)|0;b=vx(a,b)|0;}while((b|0)!=0);return}else{i=h}do{h=mw(a,i)|0;if((h|0)!=0){b=h;do{Wx(b|0,c,f,e)|0;b=ow(a,b)|0;}while((b|0)!=0)}i=vx(a,i)|0;}while((i|0)!=0);return}else{return}}function _x(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if((b|0)==0){Ov(a,a|0,92,c,1)|0;return}else if((b|0)==1|(b|0)==2|(b|0)==3){d=ux(a)|0;if((d|0)==0){return}if((b|0)==1){b=d;do{Xx(b|0,c)|0;b=vx(a,b)|0;}while((b|0)!=0);return}else{e=d}do{d=mw(a,e)|0;if((d|0)!=0){b=d;do{Xx(b|0,c)|0;b=ow(a,b)|0;}while((b|0)!=0)}e=vx(a,e)|0;}while((e|0)!=0);return}else{return}}function $x(a,b,c){a=a|0;b=b|0;c=c|0;Xx(b|0,c)|0;return}function ay(a){a=a|0;var b=0,d=0,e=0;b=Hx(a|0)|0;d=a+8|0;a=c[d>>2]|0;if((a|0)==0){c[d>>2]=0;return}else{e=a}while(1){a=c[e+4>>2]|0;fy(b,c[e>>2]|0)|0;tx(b,e);if((a|0)==(c[d>>2]|0)){break}else{e=a}}c[d>>2]=0;return}function by(b){b=b|0;var d=0,e=0,f=0,g=0;if((b|0)==0){d=214176}else{d=(c[b+52>>2]|0)+20|0}e=c[d>>2]|0;if((e|0)!=0){f=e;g=Ay(b,f)|0;return g|0}e=yy(b,172584,c[43326]|0)|0;c[d>>2]=e;a[173232]=1;a[173464]=1;f=e;g=Ay(b,f)|0;return g|0}function cy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+24|0;f=e|0;if((b|0)==0){g=214176}else{g=(c[b+52>>2]|0)+20|0}h=c[g>>2]|0;if((h|0)==0){j=yy(b,172584,c[43326]|0)|0;c[g>>2]=j;a[173232]=1;a[173464]=1;k=j}else{k=h}c[f+12>>2]=d;d=Hc[c[k>>2]&63](k,f,4)|0;if((d|0)==0){l=0;i=e;return l|0}l=c[d+12>>2]|0;i=e;return l|0}function dy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+24|0;f=e|0;if((d|0)==0){g=0;i=e;return g|0}h=(b|0)==0;if(h){j=214176}else{j=(c[b+52>>2]|0)+20|0}k=c[j>>2]|0;if((k|0)==0){l=yy(b,172584,c[43326]|0)|0;c[j>>2]=l;a[173232]=1;a[173464]=1;m=l}else{m=k}c[f+12>>2]=d;k=m|0;l=Hc[c[k>>2]&63](m,f,4)|0;if((l|0)==0){f=(xF(d|0)|0)+20|0;if(h){n=dF(f)|0}else{n=sx(b,f)|0}c[n+8>>2]=1;f=n+16|0;zF(f|0,d|0)|0;c[n+12>>2]=f;Hc[c[k>>2]&63](m,n,1)|0;o=n}else{n=l+8|0;c[n>>2]=(c[n>>2]|0)+1;o=l}g=c[o+12>>2]|0;i=e;return g|0}function ey(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+24|0;f=e|0;if((d|0)==0){g=0;i=e;return g|0}h=(b|0)==0;if(h){j=214176}else{j=(c[b+52>>2]|0)+20|0}k=c[j>>2]|0;if((k|0)==0){l=yy(b,172584,c[43326]|0)|0;c[j>>2]=l;a[173232]=1;a[173464]=1;m=l}else{m=k}c[f+12>>2]=d;k=m|0;l=Hc[c[k>>2]&63](m,f,4)|0;if((l|0)==0){f=(xF(d|0)|0)+20|0;if(h){n=dF(f)|0}else{n=sx(b,f)|0}c[n+8>>2]=a[173232]|0?-2147483647:1;f=n+16|0;zF(f|0,d|0)|0;c[n+12>>2]=f;Hc[c[k>>2]&63](m,n,1)|0;o=n}else{n=l+8|0;c[n>>2]=(c[n>>2]|0)+1;o=l}g=c[o+12>>2]|0;i=e;return g|0}function fy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+24|0;f=e|0;if((d|0)==0){g=-1;i=e;return g|0}if((b|0)==0){h=214176}else{h=(c[b+52>>2]|0)+20|0}j=c[h>>2]|0;if((j|0)==0){k=yy(b,172584,c[43326]|0)|0;c[h>>2]=k;a[173232]=1;a[173464]=1;l=k}else{l=j}c[f+12>>2]=d;j=Hc[c[l>>2]&63](l,f,4)|0;if((j|0)==0){g=-1;i=e;return g|0}if((c[j+12>>2]|0)!=(d|0)){g=0;i=e;return g|0}d=j+8|0;f=(c[d>>2]|0)-1|0;c[d>>2]=f;if(!((f|0)==0|a[173464]^1)){g=0;i=e;return g|0}zy(b,l,j)|0;g=0;i=e;return g|0}function gy(b){b=b|0;var d=0;if((b|0)==0){d=0;return d|0}d=(a[173232]|0?-2147483648:0)&c[b-8>>2];return d|0}function hy(b){b=b|0;var d=0;if((b|0)==0){return}d=b-8|0;c[d>>2]=c[d>>2]|(a[173232]|0?-2147483648:0);return}function iy(a,b){a=a|0;b=b|0;c[53838]=a;c[53678]=b;c[44744]=0;return}function jy(){var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,_a=0,$a=0,ab=0,bb=0;e=i;i=i+2088|0;f=e|0;g=e+1024|0;h=e+2048|0;j=e+2064|0;k=e+2072|0;l=e+2080|0;if(!(a[76488]|0)){a[76488]=1;if((c[53308]|0)==0){c[53308]=1}if((c[53304]|0)==0){c[53304]=c[q>>2]}if((c[53296]|0)==0){c[53296]=c[p>>2]}m=c[53324]|0;if((m|0)==0){n=10}else{o=c[53320]|0;r=c[m+(o<<2)>>2]|0;if((r|0)==0){n=10}else{s=o;t=m;u=r}}if((n|0)==10){ky();r=ly(c[53304]|0,16384)|0;c[(c[53324]|0)+(c[53320]<<2)>>2]=r;r=c[53320]|0;m=c[53324]|0;s=r;t=m;u=c[m+(r<<2)>>2]|0}r=t+(s<<2)|0;c[53310]=c[u+16>>2];u=c[(c[r>>2]|0)+8>>2]|0;c[53318]=u;c[53294]=u;c[53304]=c[c[r>>2]>>2];a[213264]=a[u]|0}u=l|0;a:while(1){l=c[53318]|0;a[l]=a[213264]|0;r=(c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]|0)+(c[53308]|0)|0;s=l;t=l;b:while(1){l=r;m=s;while(1){o=c[76496+(d[m]<<2)>>2]&255;if((b[78488+(l<<1)>>1]|0)==0){v=l;w=o}else{c[53312]=l;c[53314]=m;v=l;w=o}c:while(1){o=w&255;x=v;do{y=(b[78280+(x<<1)>>1]|0)+o|0;if((b[77736+(y<<1)>>1]|0)==(x|0)){break c}z=b[77528+(x<<1)>>1]|0;x=z<<16>>16;}while(z<<16>>16<=88);v=x;w=c[76304+(o<<2)>>2]&255}z=b[75760+(y<<1)>>1]|0;A=m+1|0;if((b[78280+(z<<1)>>1]|0)==224){B=z;C=A;D=t;break}else{l=z;m=A}}d:while(1){m=D;l=B;A=C;e:while(1){z=b[78488+(l<<1)>>1]|0;if(z<<16>>16==0){E=c[53314]|0;F=b[78488+(c[53312]<<1)>>1]|0}else{E=A;F=z}c[53294]=D;z=E;c[53302]=z-m;a[213264]=a[E]|0;a[E]=0;c[53318]=E;G=F<<16>>16;f:while(1){switch(G|0){case 4:{n=36;break b;break};case 18:{n=83;break a;break};case 19:{n=86;break a;break};case 5:{n=38;break b;break};case 21:{n=96;break b;break};case 3:{n=33;break b;break};case 15:{n=76;break a;break};case 16:{n=78;break a;break};case 17:{n=80;break a;break};case 2:{n=30;break b;break};case 0:{break f;break};case 14:{n=72;break a;break};case 11:{n=64;break a;break};case 12:{n=66;break a;break};case 24:{n=111;break b;break};case 25:{n=114;break b;break};case 1:{n=28;break a;break};case 9:{n=60;break b;break};case 30:{n=154;break b;break};case 31:{n=162;break a;break};case 32:{n=165;break b;break};case 29:{n=145;break b;break};case 33:{break};case 10:{n=62;break b;break};case 20:{n=89;break a;break};case 6:{n=40;break b;break};case 7:{n=43;break b;break};case 8:{n=45;break b;break};case 28:{n=137;break b;break};case 26:{n=122;break b;break};case 27:{n=127;break b;break};case 13:{n=68;break a;break};case 22:{n=101;break a;break};case 23:{n=104;break b;break};case 34:case 35:case 36:case 37:{H=0;n=238;break a;break};default:{n=237;break a}}I=z-(c[53294]|0)|0;J=I-1|0;a[E]=a[213264]|0;K=c[53320]|0;L=c[53324]|0;M=L+(K<<2)|0;N=c[M>>2]|0;if((c[N+44>>2]|0)==0){c[53310]=c[N+16>>2];c[c[M>>2]>>2]=c[53304];c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+44>>2]=1;M=c[53320]|0;O=c[53324]|0;P=M;Q=O;R=c[O+(M<<2)>>2]|0}else{P=K;Q=L;R=N}N=c[53318]|0;L=c[53310]|0;K=c[R+4>>2]|0;S=c[53294]|0;if(N>>>0<=(K+L|0)>>>0){break e}if(N>>>0>(K+(L+1)|0)>>>0){n=188;break a}L=N-S|0;if((c[R+40>>2]|0)==0){T=(L|0)==1?1:2;U=S;V=P;W=Q}else{N=L-1|0;if((N|0)>0){L=0;M=S;O=K;while(1){a[O]=a[M]|0;K=L+1|0;if((K|0)<(N|0)){L=K;M=M+1|0;O=O+1|0}else{break}}O=c[53320]|0;M=c[53324]|0;X=O;Y=M;Z=c[M+(O<<2)>>2]|0}else{X=P;Y=Q;Z=R}if((c[Z+44>>2]|0)==2){c[53310]=0;c[(c[Y+(X<<2)>>2]|0)+16>>2]=0}else{O=c[Z+12>>2]|0;M=O-N-1|0;if((M|0)==0){L=Z;K=c[53318]|0;_=O;while(1){$=L+4|0;O=c[$>>2]|0;if((c[L+20>>2]|0)==0){n=199;break a}aa=_<<1;if((aa|0)==0){ba=(_>>>3)+_|0}else{ba=aa}c[L+12>>2]=ba;aa=gF(O,ba+2|0)|0;c[$>>2]=aa;if((aa|0)==0){n=203;break a}ca=aa+(K-O)|0;c[53318]=ca;O=c[(c[53324]|0)+(c[53320]<<2)>>2]|0;aa=c[O+12>>2]|0;da=aa-N-1|0;if((da|0)==0){L=O;K=ca;_=aa}else{ea=da;fa=O;break}}}else{ea=M;fa=Z}_=Hc[c[c[(c[53838]|0)+8>>2]>>2]&63](c[53678]|0,(c[fa+4>>2]|0)+N|0,ea>>>0>8192>>>0?8192:ea)|0;c[53310]=_;c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+16>>2]=_}do{if((c[53310]|0)==0){if((N|0)==0){my(c[53304]|0);ga=1;break}else{c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+44>>2]=2;ga=2;break}}else{ga=0}}while(0);M=c[53310]|0;_=M+N|0;K=c[53320]|0;L=c[53324]|0;O=c[L+(K<<2)>>2]|0;if(_>>>0>(c[O+12>>2]|0)>>>0){da=gF(c[O+4>>2]|0,_+(M>>>1)|0)|0;c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+4>>2]=da;da=c[53320]|0;_=c[53324]|0;if((c[(c[_+(da<<2)>>2]|0)+4>>2]|0)==0){n=213;break a}ha=da;ia=_;ja=c[53310]|0}else{ha=K;ia=L;ja=M}M=ja+N|0;c[53310]=M;a[(c[(c[ia+(ha<<2)>>2]|0)+4>>2]|0)+M|0]=0;a[(c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+4>>2]|0)+((c[53310]|0)+1)|0]=0;M=c[53320]|0;L=c[53324]|0;K=c[(c[L+(M<<2)>>2]|0)+4>>2]|0;c[53294]=K;T=ga;U=K;V=M;W=L}if((T|0)==0){break d}else if((T|0)==2){n=227;break e}else if((T|0)!=1){continue a}a[77520]=0;c[53318]=U;G=(((c[53308]|0)-1|0)/2|0)+34|0}a[E]=a[213264]|0;l=c[53312]|0;A=c[53314]|0}if((n|0)==227){n=0;A=W+(V<<2)|0;l=(c[(c[A>>2]|0)+4>>2]|0)+(c[53310]|0)|0;c[53318]=l;m=(c[(c[A>>2]|0)+28>>2]|0)+(c[53308]|0)|0;if(U>>>0<l>>>0){ka=m;la=U}else{B=m;C=l;D=U;continue}while(1){m=a[la]|0;if(m<<24>>24==0){ma=1}else{ma=c[76496+((m&255)<<2)>>2]&255}if((b[78488+(ka<<1)>>1]|0)==0){na=ma;oa=ka}else{c[53312]=ka;c[53314]=la;na=ma;oa=ka}g:while(1){m=na&255;A=oa;do{pa=(b[78280+(A<<1)>>1]|0)+m|0;if((b[77736+(pa<<1)>>1]|0)==(A|0)){break g}G=b[77528+(A<<1)>>1]|0;A=G<<16>>16;}while(G<<16>>16<=88);na=c[76304+(m<<2)>>2]&255;oa=A}N=b[75760+(pa<<1)>>1]|0;G=la+1|0;if(G>>>0<l>>>0){ka=N;la=G}else{B=N;C=l;D=U;continue d}}}l=S+J|0;c[53318]=l;N=(c[(c[Q+(P<<2)>>2]|0)+28>>2]|0)+(c[53308]|0)|0;if((J|0)>0){G=N;z=S;while(1){o=a[z]|0;if(o<<24>>24==0){qa=1}else{qa=c[76496+((o&255)<<2)>>2]&255}if((b[78488+(G<<1)>>1]|0)==0){ra=qa;sa=G}else{c[53312]=G;c[53314]=z;ra=qa;sa=G}h:while(1){o=ra&255;x=sa;do{ta=(b[78280+(x<<1)>>1]|0)+o|0;if((b[77736+(ta<<1)>>1]|0)==(x|0)){break h}L=b[77528+(x<<1)>>1]|0;x=L<<16>>16;}while(L<<16>>16<=88);ra=c[76304+(o<<2)>>2]&255;sa=x}A=b[75760+(ta<<1)>>1]|0;m=z+1|0;if(m>>>0<l>>>0){G=A;z=m}else{ua=A;break}}}else{ua=N}if((b[78488+(ua<<1)>>1]|0)!=0){c[53312]=ua;c[53314]=l}z=b[78280+(ua<<1)>>1]|0;if((b[77736+(z+1<<1)>>1]|0)==(ua|0)){va=z}else{z=ua;while(1){G=b[77528+(z<<1)>>1]|0;A=G<<16>>16;m=b[78280+(A<<1)>>1]|0;if((b[77736+(m+1<<1)>>1]|0)==G<<16>>16){va=m;break}else{z=A}}}z=b[75760+(va+1<<1)>>1]|0;wa=z<<16>>16==88?0:z<<16>>16;if((wa|0)==0){B=ua;C=l;D=S}else{n=186;break}}if((n|0)==186){n=0;z=S+I|0;c[53318]=z;r=wa;s=z;t=S;continue}z=U+J|0;c[53318]=z;N=(c[(c[W+(V<<2)>>2]|0)+28>>2]|0)+(c[53308]|0)|0;if((J|0)>0){xa=N;ya=U}else{r=N;s=z;t=U;continue}while(1){N=a[ya]|0;if(N<<24>>24==0){za=1}else{za=c[76496+((N&255)<<2)>>2]&255}if((b[78488+(xa<<1)>>1]|0)==0){Aa=za;Ba=xa}else{c[53312]=xa;c[53314]=ya;Aa=za;Ba=xa}i:while(1){N=Aa&255;A=Ba;do{Ca=(b[78280+(A<<1)>>1]|0)+N|0;if((b[77736+(Ca<<1)>>1]|0)==(A|0)){break i}m=b[77528+(A<<1)>>1]|0;A=m<<16>>16;}while(m<<16>>16<=88);Aa=c[76304+(N<<2)>>2]&255;Ba=A}l=b[75760+(Ca<<1)>>1]|0;m=ya+1|0;if(m>>>0<z>>>0){xa=l;ya=m}else{r=l;s=z;t=U;continue b}}}if((n|0)==30){n=0;t=c[53302]|0;if((t|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10}c[5104]=(c[5104]|0)+1;continue}else if((n|0)==33){n=0;t=c[53302]|0;if((t|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10}c[53308]=3;continue}else if((n|0)==36){n=0;t=c[53302]|0;if((t|0)==0){continue}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10;continue}else if((n|0)==38){n=0;t=c[53302]|0;if((t|0)==0){continue}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10;continue}else if((n|0)==40){n=0;t=c[53302]|0;if((t|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10}c[53308]=1;continue}else if((n|0)==43){n=0;t=c[53302]|0;if((t|0)==0){continue}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10;continue}else if((n|0)==45){n=0;t=c[53302]|0;if((t|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10}t=c[53294]|0;s=t+1|0;r=(Za(s|0,134168,4)|0)==0;z=r?t+5|0:s;s=ac(z|0,131560,(Da=i,i=i+24|0,c[Da>>2]=k,c[Da+8>>2]=u,c[Da+16>>2]=j,Da)|0)|0;i=Da;if((s|0)<=0){continue}c[5104]=(c[k>>2]|0)-1;if((s|0)<=1){continue}s=z+(c[j>>2]|0)|0;z=s;while(1){t=a[z]|0;if((t<<24>>24|0)==34|(t<<24>>24|0)==0){break}z=z+1|0}if((z|0)==(s|0)){continue}a[z]=0;t=z-s|0;r=c[43712]|0;if((r|0)<(t|0)){if((r|0)==0){Ea=dF(t+1|0)|0}else{Ea=gF(c[43714]|0,t+1|0)|0}c[43714]=Ea;c[43712]=t;Fa=Ea}else{Fa=c[43714]|0}zF(Fa|0,s|0)|0;c[53674]=c[43714];continue}else if((n|0)==60){n=0;t=c[53302]|0;if((t|0)==0){continue}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10;continue}else if((n|0)==62){n=0;t=c[53302]|0;if((t|0)==0){continue}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10;continue}else if((n|0)==96){n=0;t=c[53302]|0;if((t|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10}c[53308]=5;t=c[53536]|0;if((t|0)==0){r=dF(1024)|0;c[53536]=r;c[53532]=r+1024;Ga=r}else{Ga=t}c[53526]=Ga;a[Ga]=0;continue}else if((n|0)==104){n=0;t=c[53302]|0;if((t|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10}t=c[53526]|0;if(t>>>0>(c[53536]|0)>>>0){r=t-1|0;c[53526]=r;Ha=r}else{Ha=t}c[53526]=Ha+1;a[Ha]=34;t=c[53526]|0;r=c[53532]|0;if(t>>>0<r>>>0){Ia=t}else{l=c[53536]|0;m=l;G=r-m<<1;r=gF(l,G)|0;c[53536]=r;c[53532]=r+G;G=r+(t-m)|0;c[53526]=G;Ia=G}c[53526]=Ia+1;a[Ia]=0;continue}else if((n|0)==111){n=0;G=c[53302]|0;if((G|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(G-1)|0]|0)==10}c[5104]=(c[5104]|0)+1;continue}else if((n|0)==114){n=0;G=c[53302]|0;if((G|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(G-1)|0]|0)==10}G=c[53294]|0;m=c[53526]|0;if(m>>>0>(c[53536]|0)>>>0){t=m-1|0;c[53526]=t;Ja=t}else{Ja=m}m=a[G]|0;c[53526]=Ja+1;a[Ja]=m;if(m<<24>>24==0){continue}else{Ka=G}while(1){G=Ka+1|0;m=c[53526]|0;t=c[53532]|0;if(m>>>0<t>>>0){La=m}else{r=c[53536]|0;l=r;L=t-l<<1;t=gF(r,L)|0;c[53536]=t;c[53532]=t+L;L=t+(m-l)|0;c[53526]=L;La=L}L=a[G]|0;c[53526]=La+1;a[La]=L;if(L<<24>>24==0){continue a}else{Ka=G}}}else if((n|0)==122){n=0;s=c[53302]|0;if((s|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(s-1)|0]|0)==10}c[53308]=7;c[44700]=1;s=c[53536]|0;if((s|0)==0){z=dF(1024)|0;c[53536]=z;c[53532]=z+1024;Na=z}else{Na=s}c[53526]=Na;a[Na]=0;continue}else if((n|0)==127){n=0;s=c[53302]|0;if((s|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(s-1)|0]|0)==10}s=(c[44700]|0)-1|0;c[44700]=s;if((s|0)==0){n=136;break}s=c[53294]|0;z=c[53526]|0;if(z>>>0>(c[53536]|0)>>>0){G=z-1|0;c[53526]=G;Oa=G}else{Oa=z}z=a[s]|0;c[53526]=Oa+1;a[Oa]=z;if(z<<24>>24==0){continue}else{Pa=s}while(1){s=Pa+1|0;z=c[53526]|0;G=c[53532]|0;if(z>>>0<G>>>0){Qa=z}else{L=c[53536]|0;l=L;m=G-l<<1;G=gF(L,m)|0;c[53536]=G;c[53532]=G+m;m=G+(z-l)|0;c[53526]=m;Qa=m}m=a[s]|0;c[53526]=Qa+1;a[Qa]=m;if(m<<24>>24==0){continue a}else{Pa=s}}}else if((n|0)==137){n=0;s=c[53302]|0;if((s|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(s-1)|0]|0)==10}c[44700]=(c[44700]|0)+1;s=c[53294]|0;m=c[53526]|0;if(m>>>0>(c[53536]|0)>>>0){l=m-1|0;c[53526]=l;Ra=l}else{Ra=m}m=a[s]|0;c[53526]=Ra+1;a[Ra]=m;if(m<<24>>24==0){continue}else{Sa=s}while(1){s=Sa+1|0;m=c[53526]|0;l=c[53532]|0;if(m>>>0<l>>>0){Ta=m}else{z=c[53536]|0;G=z;L=l-G<<1;l=gF(z,L)|0;c[53536]=l;c[53532]=l+L;L=l+(m-G)|0;c[53526]=L;Ta=L}L=a[s]|0;c[53526]=Ta+1;a[Ta]=L;if(L<<24>>24==0){continue a}else{Sa=s}}}else if((n|0)==145){n=0;s=c[53302]|0;if((s|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(s-1)|0]|0)==10}s=c[53294]|0;L=c[53526]|0;if(L>>>0>(c[53536]|0)>>>0){G=L-1|0;c[53526]=G;Ua=G}else{Ua=L}L=a[s]|0;c[53526]=Ua+1;a[Ua]=L;if(L<<24>>24!=0){L=s;do{L=L+1|0;s=c[53526]|0;G=c[53532]|0;if(s>>>0<G>>>0){Va=s}else{m=c[53536]|0;l=m;z=G-l<<1;G=gF(m,z)|0;c[53536]=G;c[53532]=G+z;z=G+(s-l)|0;c[53526]=z;Va=z}z=a[L]|0;c[53526]=Va+1;a[Va]=z;}while(z<<24>>24!=0)}c[5104]=(c[5104]|0)+1;continue}else if((n|0)==154){n=0;L=c[53302]|0;if((L|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(L-1)|0]|0)==10}L=c[53294]|0;z=c[53526]|0;if(z>>>0>(c[53536]|0)>>>0){l=z-1|0;c[53526]=l;Wa=l}else{Wa=z}z=a[L]|0;c[53526]=Wa+1;a[Wa]=z;if(z<<24>>24==0){continue}else{Xa=L}while(1){L=Xa+1|0;z=c[53526]|0;l=c[53532]|0;if(z>>>0<l>>>0){Ya=z}else{s=c[53536]|0;G=s;m=l-G<<1;l=gF(s,m)|0;c[53536]=l;c[53532]=l+m;m=l+(z-G)|0;c[53526]=m;Ya=m}m=a[L]|0;c[53526]=Ya+1;a[Ya]=m;if(m<<24>>24==0){continue a}else{Xa=L}}}else if((n|0)==165){n=0;L=c[53302]|0;if((L|0)==0){_a=0}else{c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(L-1)|0]|0)==10;_a=c[53302]|0}Ma(c[53294]|0,_a|0,1,c[53296]|0)|0;continue}}if((n|0)==28){_a=c[53302]|0;if((_a|0)==0){H=-1;i=e;return H|0}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10;H=-1;i=e;return H|0}else if((n|0)==64){_a=c[53302]|0;if((_a|0)==0){H=259;i=e;return H|0}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10;H=259;i=e;return H|0}else if((n|0)==66){_a=c[53302]|0;if((_a|0)==0){H=260;i=e;return H|0}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10;H=260;i=e;return H|0}else if((n|0)==68){_a=c[53302]|0;if((_a|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10}if((c[44744]|0)!=0){H=258;i=e;return H|0}c[44744]=258;H=258;i=e;return H|0}else if((n|0)==72){_a=c[53302]|0;if((_a|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10}if((c[44744]|0)!=0){H=261;i=e;return H|0}c[44744]=261;H=261;i=e;return H|0}else if((n|0)==76){_a=c[53302]|0;if((_a|0)==0){H=263;i=e;return H|0}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10;H=263;i=e;return H|0}else if((n|0)==78){_a=c[53302]|0;if((_a|0)==0){H=262;i=e;return H|0}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10;H=262;i=e;return H|0}else if((n|0)==80){_a=c[53302]|0;if((_a|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10}H=(c[44744]|0)==261?264:45;i=e;return H|0}else if((n|0)==83){_a=c[53302]|0;if((_a|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10}H=(c[44744]|0)==258?264:45;i=e;return H|0}else if((n|0)==86){_a=c[53302]|0;if((_a|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10}c[53300]=dy(c[53854]|0,c[53294]|0)|0;H=267;i=e;return H|0}else if((n|0)==89){_a=c[53302]|0;if((_a|0)==0){$a=-1}else{c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10;$a=(c[53302]|0)-1|0}_a=g|0;g=c[53294]|0;Xa=a[g+$a|0]|0;if(((Xa&255)-48|0)>>>0<10>>>0|Xa<<24>>24==46){ab=g}else{g=c[53674]|0;Iv(h,1024,f|0);Lv(h,142776)|0;Lv(h,c[53294]|0)|0;nb(_a|0,139064,(Da=i,i=i+8|0,c[Da>>2]=c[5104],Da)|0)|0;i=Da;Lv(h,_a)|0;Lv(h,(g|0)==0?145136:g)|0;Lv(h,136512)|0;g=h+4|0;_a=c[g>>2]|0;if(_a>>>0<(c[h+8>>2]|0)>>>0){bb=_a}else{Jv(h,1)|0;bb=c[g>>2]|0}a[bb]=0;bb=c[h>>2]|0;c[g>>2]=bb;Fv(0,bb,(Da=i,i=i+1|0,i=i+7&-8,c[Da>>2]=0,Da)|0)|0;i=Da;Mv(h);h=(c[53302]|0)-1|0;a[E]=a[213264]|0;E=D+h|0;c[53318]=E;c[53294]=D;c[53302]=h;a[213264]=a[E]|0;a[E]=0;c[53318]=E;ab=c[53294]|0}c[53300]=dy(c[53854]|0,ab)|0;H=267;i=e;return H|0}else if((n|0)==101){ab=c[53302]|0;if((ab|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(ab-1)|0]|0)==10}c[53308]=1;c[53300]=dy(c[53854]|0,c[53536]|0)|0;H=268;i=e;return H|0}else if((n|0)==136){c[53308]=1;c[53300]=ey(c[53854]|0,c[53536]|0)|0;H=268;i=e;return H|0}else if((n|0)==162){ab=c[53302]|0;if((ab|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(ab-1)|0]|0)==10}H=a[c[53294]|0]|0;i=e;return H|0}else if((n|0)==188){ny(159416);return 0}else if((n|0)==199){c[$>>2]=0;ny(154408);return 0}else if((n|0)==203){ny(154408);return 0}else if((n|0)==213){ny(148936);return 0}else if((n|0)==237){ny(163776);return 0}else if((n|0)==238){i=e;return H|0}return 0}function ky(){var a=0,b=0,d=0;a=c[53324]|0;if((a|0)==0){b=dF(4)|0;d=b;c[53324]=d;if((b|0)==0){ny(163504)}c[d>>2]=0;c[53322]=1;c[53320]=0;return}d=c[53322]|0;if((c[53320]|0)>>>0<(d-1|0)>>>0){return}b=d+8|0;d=gF(a,b<<2)|0;a=d;c[53324]=a;if((d|0)==0){ny(163504)}vF(a+(c[53322]<<2)|0,0,32)|0;c[53322]=b;return}function ly(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=dF(48)|0;f=e;if((e|0)==0){ny(131672);return 0}c[e+12>>2]=d;g=dF(d+2|0)|0;c[e+4>>2]=g;if((g|0)==0){ny(131672);return 0}c[e+20>>2]=1;d=Vb()|0;h=c[d>>2]|0;c[e+16>>2]=0;a[g]=0;a[g+1|0]=0;c[e+8>>2]=g;c[e+28>>2]=1;c[e+44>>2]=0;g=c[53324]|0;if((g|0)==0){i=0}else{i=c[g+(c[53320]<<2)>>2]|0}if((i|0)==(f|0)){i=g+(c[53320]<<2)|0;c[53310]=c[(c[i>>2]|0)+16>>2];j=c[(c[i>>2]|0)+8>>2]|0;c[53318]=j;c[53294]=j;c[53304]=c[c[i>>2]>>2];a[213264]=a[j]|0;c[e>>2]=b;c[e+40>>2]=1;k=10}else{c[e>>2]=b;c[e+40>>2]=1;if((g|0)==0){l=0}else{k=10}}if((k|0)==10){l=c[g+(c[53320]<<2)>>2]|0}if((l|0)!=(f|0)){c[e+32>>2]=1;c[e+36>>2]=0}if((b|0)==0){m=0;n=e+24|0;o=n;c[o>>2]=m;c[d>>2]=h;return f|0}m=(Ob(Ta(b|0)|0)|0)>0|0;n=e+24|0;o=n;c[o>>2]=m;c[d>>2]=h;return f|0}function my(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=c[53324]|0;if((d|0)==0){e=3}else{if((c[d+(c[53320]<<2)>>2]|0)==0){e=3}else{f=d;e=5}}do{if((e|0)==3){ky();d=ly(c[53304]|0,16384)|0;c[(c[53324]|0)+(c[53320]<<2)>>2]=d;d=c[53324]|0;if((d|0)!=0){f=d;e=5;break}d=Vb()|0;g=0;h=d;i=c[d>>2]|0}}while(0);do{if((e|0)==5){d=c[f+(c[53320]<<2)>>2]|0;j=Vb()|0;k=c[j>>2]|0;if((d|0)==0){g=0;h=j;i=k;break}c[d+16>>2]=0;l=d+4|0;a[c[l>>2]|0]=0;a[(c[l>>2]|0)+1|0]=0;c[d+8>>2]=c[l>>2];c[d+28>>2]=1;c[d+44>>2]=0;l=c[53324]|0;if((l|0)==0){m=0}else{m=c[l+(c[53320]<<2)>>2]|0}if((m|0)!=(d|0)){g=d;h=j;i=k;break}n=l+(c[53320]<<2)|0;c[53310]=c[(c[n>>2]|0)+16>>2];l=c[(c[n>>2]|0)+8>>2]|0;c[53318]=l;c[53294]=l;c[53304]=c[c[n>>2]>>2];a[213264]=a[l]|0;g=d;h=j;i=k}}while(0);c[g>>2]=b;c[g+40>>2]=1;m=c[53324]|0;if((m|0)==0){o=0}else{o=c[m+(c[53320]<<2)>>2]|0}if((o|0)!=(g|0)){c[g+32>>2]=1;c[g+36>>2]=0}if((b|0)==0){p=0}else{p=(Ob(Ta(b|0)|0)|0)>0|0}c[g+24>>2]=p;c[h>>2]=i;i=(c[53324]|0)+(c[53320]<<2)|0;c[53310]=c[(c[i>>2]|0)+16>>2];h=c[(c[i>>2]|0)+8>>2]|0;c[53318]=h;c[53294]=h;c[53304]=c[c[i>>2]>>2];a[213264]=a[h]|0;return}function ny(a){a=a|0;var b=0;gc(c[o>>2]|0,168432,(b=i,i=i+8|0,c[b>>2]=a,b)|0)|0;i=b;mb(2)}function oy(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+2064|0;e=d+2048|0;Iv(e,1024,d|0);f=c[53674]|0;if((f|0)!=0){Lv(e,f)|0;Lv(e,98096)|0}Lv(e,b)|0;b=d+1024|0;nb(b|0,92536,(f=i,i=i+8|0,c[f>>2]=c[5104],f)|0)|0;i=f;Lv(e,b)|0;Lv(e,c[53294]|0)|0;Lv(e,87168)|0;b=e+4|0;g=c[b>>2]|0;if(g>>>0<(c[e+8>>2]|0)>>>0){h=g}else{Jv(e,1)|0;h=c[b>>2]|0}a[h]=0;h=c[e>>2]|0;c[b>>2]=h;Fv(0,h,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;Mv(e);i=d;return}function py(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;b=c[53294]|0;d=c[53318]|0;a[d]=a[213264]|0;e=c[53320]|0;f=c[53324]|0;g=c[f+(e<<2)>>2]|0;h=c[g+4>>2]|0;if(d>>>0>=(h+2|0)>>>0){i=b;j=d;k=j-1|0;a[k]=64;c[53294]=i;l=a[k]|0;a[213264]=l;c[53318]=k;return}m=(c[53310]|0)+2|0;n=c[g+12>>2]|0;g=h+(n+2)|0;o=h+m|0;if((m|0)>0){m=g;h=o;do{h=h-1|0;m=m-1|0;a[m]=a[h]|0;p=c[53320]|0;q=c[53324]|0;r=c[q+(p<<2)>>2]|0;}while(h>>>0>(c[r+4>>2]|0)>>>0);s=m;t=h;u=c[r+12>>2]|0;v=p;w=q}else{s=g;t=o;u=n;v=e;w=f}f=s-t|0;t=d+f|0;c[53310]=u;c[(c[w+(v<<2)>>2]|0)+16>>2]=u;if(t>>>0<((c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+4>>2]|0)+2|0)>>>0){ny(82416)}else{i=b+f|0;j=t;k=j-1|0;a[k]=64;c[53294]=i;l=a[k]|0;a[213264]=l;c[53318]=k;return}}function qy(){var b=0,d=0,e=0;b=c[53324]|0;if((b|0)==0){return}d=c[b+(c[53320]<<2)>>2]|0;if((d|0)==0){return}c[d+16>>2]=0;b=d+4|0;a[c[b>>2]|0]=0;a[(c[b>>2]|0)+1|0]=0;c[d+8>>2]=c[b>>2];c[d+28>>2]=1;c[d+44>>2]=0;b=c[53324]|0;if((b|0)==0){e=0}else{e=c[b+(c[53320]<<2)>>2]|0}if((e|0)!=(d|0)){return}d=b+(c[53320]<<2)|0;c[53310]=c[(c[d>>2]|0)+16>>2];b=c[(c[d>>2]|0)+8>>2]|0;c[53318]=b;c[53294]=b;c[53304]=c[c[d>>2]>>2];a[213264]=a[b]|0;return}function ry(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+120|0;g=f|0;h=f+56|0;j=f+112|0;do{if((d|0)!=0){if((Yw(b,0,d,j,0)|0)==0){break}k=c[j>>2]|0;l=b+40|0;By(b,c[l>>2]|0,174032);c[h+4>>2]=k;k=c[l>>2]|0;l=Hc[c[k>>2]&63](k,h|0,4)|0;if((l|0)==0){break}else{m=l}i=f;return m|0}}while(0);if((e|0)==0){m=0;i=f;return m|0}if((Yw(b,0,d,j,1)|0)==0){m=0;i=f;return m|0}d=c[j>>2]|0;j=b+40|0;By(b,c[j>>2]|0,174032);c[g+4>>2]=d;e=c[j>>2]|0;j=Hc[c[e>>2]&63](e,g|0,4)|0;if((j|0)==0){g=sx(b,56)|0;c[g+52>>2]=c[b+52>>2];e=g+12|0;h=c[b+12>>2]|0;c[e>>2]=h;a[e]=h&255&-9;c[g+44>>2]=b;c[g+48>>2]=c[b+48>>2];c[g+4>>2]=d;n=Iw(g)|0}else{n=j}ax(b,0,n|0);m=n;i=f;return m|0}function sy(a){a=a|0;var b=0;b=c[a+40>>2]|0;return Hc[c[b>>2]&63](b,0,128)|0}function ty(a){a=a|0;var b=0,d=0,e=0;b=c[a+44>>2]|0;if((b|0)==0){d=0;return d|0}e=c[b+40>>2]|0;d=Hc[c[e>>2]&63](e,a|0,8)|0;return d|0}function uy(a){a=a|0;return c[a+44>>2]|0}function vy(a,b){a=a|0;b=b|0;var d=0;d=c[a+40>>2]|0;return Hc[c[d>>2]&63](d,b|0,2)|0}function wy(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[53852]|0;a=(b|0)!=0;do{if((e|0)==0){if(a){eF(b);f=0;break}else{f=dF(d)|0;break}}else{if(a){tx(e,b);f=0;break}else{f=sx(e,d)|0;break}}}while(0);return f|0}function xy(a,b,d){a=a|0;b=b|0;d=d|0;d=c[53852]|0;if((d|0)==0){eF(b);return}else{tx(d,b);return}}function yy(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=b+28|0;f=c[e>>2]|0;c[e>>2]=114;c[53852]=a;a=$g(b,d)|0;c[e>>2]=f;c[53852]=0;return a|0}function zy(a,b,d){a=a|0;b=b|0;d=d|0;c[53852]=a;return Hc[c[b>>2]&63](b,d,2)|0}function Ay(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(Wg(b,0,0)|0)+28|0;e=c[d>>2]|0;c[d>>2]=114;c[53852]=a;if((Vg(b)|0)!=0){f=1;return f|0}c[d>>2]=e;c[53852]=0;f=0;return f|0}function By(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)==0){return}if((Wg(b,0,0)|0)==(c|0)){return}Wg(b,c,0)|0;return}function Cy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;if((b|0)==0){e=117688;return e|0}if((a[b]|0)==0){e=117688;return e|0}f=d+1|0;a[d]=34;g=a[b]|0;if(((g&255)-48|0)>>>0<10>>>0|g<<24>>24==46){h=1}else{h=g<<24>>24==45|0}do{if(g<<24>>24==0){a[f]=34;a[d+2|0]=0;i=169768;j=126080}else{k=b+1|0;l=f;m=g;n=0;o=0;p=0;q=h;r=0;a:while(1){b:do{if((r|0)==0){s=k;t=l;u=m;v=n;w=o;x=p;y=q;while(1){z=u&255;do{if(u<<24>>24==34){a[t]=92;A=y;B=1;C=w;D=t+1|0}else{if((y|0)==0){E=u<<24>>24!=95&(tb(z|0)|0)==0&u<<24>>24>-1;A=0;B=E?1:x;C=w;D=t;break}if((u<<24>>24|0)==46){E=(w|0)==0;A=E?y:0;B=E?x:1;C=w+1|0;D=t;break}else if((u<<24>>24|0)==45){E=(v|0)==0;A=E?y:0;B=E?x:1;C=w;D=t;break}else{E=(z-48|0)>>>0<10>>>0;A=E?y:0;B=E?x:1;C=w;D=t;break}}}while(0);z=D+1|0;a[D]=u;E=s+1|0;F=a[s]|0;G=v+1|0;H=c[43162]|0;do{if((H|0)==0){I=B;J=G;K=z}else{if(F<<24>>24==0|(G|0)<(H|0)){I=B;J=G;K=z;break}if((tb(u<<24>>24|0)|0)!=0){L=1;M=A;N=B;O=C;P=G;Q=F;R=z;S=E;break b}T=a[D]|0;if(T<<24>>24<0|(T-45&255)>>>0<2>>>0|T<<24>>24==92){L=1;M=A;N=B;O=C;P=G;Q=F;R=z;S=E;break b}if(F<<24>>24>-1&(((tb(F&255|0)|0)!=0|F<<24>>24==46|F<<24>>24==45)^1)){L=1;M=A;N=B;O=C;P=G;Q=F;R=z;S=E;break b}a[z]=92;a[D+2|0]=10;I=1;J=0;K=D+3|0}}while(0);if(F<<24>>24==0){U=K;V=J;W=I;break a}else{s=E;t=K;u=F;v=J;w=C;x=I;y=A}}}else{y=k;x=l;w=m;v=n;u=o;t=p;s=q;c:while(1){z=w&255;do{if(w<<24>>24==34){a[x]=92;X=s;Y=1;Z=u;_=x+1|0}else{if((s|0)==0){G=w<<24>>24!=95&(tb(z|0)|0)==0&w<<24>>24>-1;X=0;Y=G?1:t;Z=u;_=x;break}if((w<<24>>24|0)==45){G=(v|0)==0;X=G?s:0;Y=G?t:1;Z=u;_=x;break}else if((w<<24>>24|0)==46){G=(u|0)==0;X=G?s:0;Y=G?t:1;Z=u+1|0;_=x;break}else{G=(z-48|0)>>>0<10>>>0;X=G?s:0;Y=G?t:1;Z=u;_=x;break}}}while(0);$=_+1|0;a[_]=w;aa=y+1|0;ba=a[y]|0;z=v+1|0;do{if((c[43162]|0)==0){ca=Y;da=z;ea=$}else{F=ba&255;E=ba<<24>>24==0;if(E){U=$;V=z;W=Y;break a}do{if((tb(w<<24>>24|0)|0)==0){G=a[_]|0;if(G<<24>>24<0|(G-45&255)>>>0<2>>>0|G<<24>>24==92){break}if(!(ba<<24>>24>-1&(((tb(F|0)|0)!=0|ba<<24>>24==46|ba<<24>>24==45)^1))){break c}}}while(0);if(E|(z|0)<(c[43162]|0)){ca=Y;da=z;ea=$;break}if((tb(a[_]|0)|0)!=0){L=1;M=X;N=Y;O=Z;P=z;Q=ba;R=$;S=aa;break b}G=a[_]|0;if(G<<24>>24<0|(G-45&255)>>>0<2>>>0|G<<24>>24==92){L=1;M=X;N=Y;O=Z;P=z;Q=ba;R=$;S=aa;break b}if(ba<<24>>24>-1&(((tb(F|0)|0)!=0|ba<<24>>24==46|ba<<24>>24==45)^1)){L=1;M=X;N=Y;O=Z;P=z;Q=ba;R=$;S=aa;break b}a[$]=92;a[_+2|0]=10;ca=1;da=0;ea=_+3|0}}while(0);if(ba<<24>>24==0){U=ea;V=da;W=ca;break a}else{y=aa;x=ea;w=ba;v=da;u=Z;t=ca;s=X}}a[$]=92;a[_+2|0]=10;L=0;M=X;N=1;O=Z;P=0;Q=ba;R=_+3|0;S=aa}}while(0);if(Q<<24>>24==0){U=R;V=P;W=N;break}else{k=S;l=R;m=Q;n=P;o=O;p=N;q=M;r=L}}a[U]=34;a[U+1|0]=0;if((W|0)!=0){e=d;return e|0}if((V|0)!=1){i=169768;j=126080;break}if(((a[b]|0)-45&255)>>>0<2>>>0){e=d}else{i=169768;j=126080;break}return e|0}}while(0);while(1){V=i+4|0;if((pm(j,b)|0)==0){e=d;fa=49;break}W=c[V>>2]|0;if((W|0)==0){e=b;fa=49;break}else{i=V;j=W}}if((fa|0)==49){return e|0}return 0}function Dy(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=((xF(b|0)|0)<<1)+2|0;e=d>>>0>1024>>>0?d:1024;d=c[44748]|0;if((e|0)>(c[44750]|0)){if((d|0)==0){f=dF(e)|0}else{f=gF(d,e)|0}c[44748]=f;c[44750]=e;g=f}else{g=d}if((gy(b)|0)==0){h=Cy(b,g)|0;return h|0}a[g]=60;d=g+1|0;f=a[b]|0;if(f<<24>>24==0){i=g;j=d}else{e=b;b=d;d=f;while(1){f=e+1|0;a[b]=d;k=b+1|0;l=a[f]|0;if(l<<24>>24==0){i=b;j=k;break}else{e=f;b=k;d=l}}}a[j]=62;a[i+2|0]=0;h=g;return h|0}function Ey(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=b|0;e=$w(d)|0;do{if((e|0)!=0){if((a[e]|0)==37){break}else{f=0}return f|0}}while(0);e=Vv(d)|0;a:do{if((e|0)!=0){g=Vv(uy(b)|0)|0;if((g|0)==0){break}h=bh(c[(Vv(Ix(d)|0)|0)+8>>2]|0)|0;if((h|0)<=0){break}i=c[e+12>>2]|0;j=g+12|0;g=0;b:while(1){k=c[i+(g<<2)>>2]|0;do{if((k|0)!=0){l=c[(c[j>>2]|0)+(g<<2)>>2]|0;if((l|0)==0){break}if((Ya(k|0,l|0)|0)!=0){f=0;break b}}}while(0);g=g+1|0;if((g|0)>=(h|0)){break a}}return f|0}}while(0);e=Uv(b,0)|0;if((e|0)==0){f=1;return f|0}if((bh(c[e+8>>2]|0)|0)>0){f=0;return f|0}else{return(bh(c[e+12>>2]|0)|0)<1|0}return 0}function Fy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;c[53668]=0;e=ew(b|0,141056)|0;do{if((e|0)!=0){if(((a[e]|0)-48|0)>>>0>=10>>>0){break}f=Ja(e|0,0,10)|0;if(!((f|0)==0|(f|0)>59)){break}c[43162]=f}}while(0);Gy(b,1);if((Hy(b,d,1)|0)==-1){g=-1;return g|0}if((Iy(b,d)|0)==-1){g=-1;return g|0}e=(c[53668]|0)-1|0;c[53668]=e;f=b+52|0;a:do{if((e|0)>0){b=e;while(1){b=b-1|0;if((Oc[c[(c[(c[f>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){g=-1;break}if((b|0)<=0){break a}}return g|0}}while(0);if((Oc[c[(c[(c[f>>2]|0)+8>>2]|0)+4>>2]&255](d,161536)|0)==-1){g=-1;return g|0}c[43162]=128;g=Ec[c[(c[(c[f>>2]|0)+8>>2]|0)+8>>2]&63](d)|0;return g|0}function Gy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=a;c[d>>2]=c[d>>2]&-9;d=sy(a)|0;if((d|0)!=0){e=d;do{Gy(e,0);e=ty(e)|0;}while((e|0)!=0)}if((b|0)==0){return}b=ux(a)|0;if((b|0)==0){return}else{f=b}do{b=f;c[b>>2]=c[b>>2]&-9;b=mw(a,f)|0;if((b|0)!=0){e=b;do{b=e;c[b>>2]=c[b>>2]&-9;e=ow(a,e)|0;}while((e|0)!=0)}f=vx(a,f)|0;}while((f|0)!=0);return}function Hy(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;f=b;if((e|0)==0){if((uy(b)|0)==0){g=3}else{h=0;i=213448;j=151608}}else{g=3}if((g|0)==3){k=(a[b+12|0]&1)==0?213448:148768;l=(Pw(b)|0)==0;c[53512]=Wv(b,2,142576,0)|0;c[53684]=Wv(b,2,139520,0)|0;h=1;i=l?213448:145552;j=k}k=$w(b|0)|0;if((k|0)==0){g=6}else{if((a[k]|0)==37){g=6}else{m=136888;n=k}}if((g|0)==6){m=213448;n=213448}g=c[53668]|0;k=b+52|0;a:do{if((g|0)>0){l=g;while(1){l=l-1|0;if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){o=-1;break}if((l|0)<=0){break a}}return o|0}}while(0);if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,i)|0)==-1){o=-1;return o|0}do{if(!((a[n]|0)==0&(h|0)==0)){if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,j)|0)==-1){o=-1;return o|0}if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,133952)|0)==-1){o=-1;return o|0}if((a[n]|0)==0){break}i=Dy(n)|0;if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,i)|0)==-1){o=-1}else{break}return o|0}}while(0);if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,m)|0)==-1){o=-1;return o|0}if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,131968)|0)==-1){o=-1;return o|0}c[53668]=(c[53668]|0)+1;k=Uv(b,0)|0;do{if((k|0)!=0){if((Oy(b,d,129280,c[k+16>>2]|0,e)|0)==-1){o=-1;return o|0}if((Oy(b,d,126080,c[k+8>>2]|0,e)|0)==-1){o=-1;return o|0}if((Oy(b,d,123600,c[k+12>>2]|0,e)|0)==-1){o=-1}else{break}return o|0}}while(0);c[f>>2]=c[f>>2]|8;o=0;return o|0}function Iy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;e=i;i=i+24|0;if((Jy(b,d)|0)==-1){f=-1;i=e;return f|0}g=Uv(Ix(b|0)|0,0)|0;h=ux(b)|0;if((h|0)==0){f=0;i=e;return f|0}j=(g|0)==0;k=e|0;l=g+12|0;m=g+8|0;g=h;a:while(1){h=g;if((Ky(b,g,(c[h>>2]|0)>>>4)|0)!=0){if(j){n=0}else{n=c[m>>2]|0}if((Ly(g,d,n)|0)==-1){f=-1;o=43;break}}p=mw(b,g)|0;if((p|0)!=0){q=g;r=p;while(1){p=r;s=r-32|0;t=c[((c[p>>2]&3|0)==2?r:s)+28>>2]|0;do{if((q|0)==(t|0)){u=q}else{if((Ky(b,t,(c[h>>2]|0)>>>4)|0)==0){u=q;break}if(j){v=0}else{v=c[m>>2]|0}if((Ly(c[((c[p>>2]&3|0)==2?r:s)+28>>2]|0,d,v)|0)==-1){f=-1;o=43;break a}u=c[((c[p>>2]&3|0)==2?r:s)+28>>2]|0}}while(0);t=sy(b)|0;b:do{if((t|0)==0){o=19}else{w=t;while(1){if((Ey(w)|0)==0){if((xw(w,r,0)|0)!=0){break b}}x=ty(w)|0;if((x|0)==0){o=19;break}else{w=x}}}}while(0);if((o|0)==19){o=0;if(j){y=0}else{y=c[l>>2]|0}t=c[p>>2]&3;w=c[((t|0)==3?r:r+32|0)+28>>2]|0;x=c[((t|0)==2?r:s)+28>>2]|0;t=w|0;z=Hx(t)|0;A=c[53668]|0;B=z+52|0;if((A|0)>0){z=A;do{z=z-1|0;if((Oc[c[(c[(c[B>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){f=-1;o=43;break a}}while((z|0)>0)}z=$w(t)|0;s=Hx(t)|0;if((z|0)==0){nb(k|0,160056,(C=i,i=i+8|0,c[C>>2]=c[w+4>>2],C)|0)|0;i=C;if((Oc[c[(c[(c[s+52>>2]|0)+8>>2]|0)+4>>2]&255](d,k)|0)==-1){f=-1;o=43;break a}}else{A=Dy(z)|0;if((Oc[c[(c[(c[s+52>>2]|0)+8>>2]|0)+4>>2]&255](d,A)|0)==-1){f=-1;o=43;break a}}if((My(r,d,c[53512]|0)|0)==-1){f=-1;o=43;break a}A=(Nw(Hx(t)|0)|0)!=0;if((Oc[c[(c[(c[B>>2]|0)+8>>2]|0)+4>>2]&255](d,A?116312:109e3)|0)==-1){f=-1;o=43;break a}A=x|0;s=$w(A)|0;z=Hx(A)|0;if((s|0)==0){nb(k|0,160056,(C=i,i=i+8|0,c[C>>2]=c[x+4>>2],C)|0)|0;i=C;if((Oc[c[(c[(c[z+52>>2]|0)+8>>2]|0)+4>>2]&255](d,k)|0)==-1){f=-1;o=43;break a}}else{A=Dy(s)|0;if((Oc[c[(c[(c[z+52>>2]|0)+8>>2]|0)+4>>2]&255](d,A)|0)==-1){f=-1;o=43;break a}}if((My(r,d,c[53684]|0)|0)==-1){f=-1;o=43;break a}A=r|0;do{if((c[p>>2]&8|0)==0){if((Ny(A,d,y)|0)==-1){f=-1;o=43;break a}}else{z=$w(A)|0;s=Hx(A)|0;if((z|0)==0){break}if((a[z]|0)==0){break}D=s+52|0;if((Oc[c[(c[(c[D>>2]|0)+8>>2]|0)+4>>2]&255](d,97624)|0)==-1){f=-1;o=43;break a}s=Dy(z)|0;if((Oc[c[(c[(c[D>>2]|0)+8>>2]|0)+4>>2]&255](d,s)|0)==-1){f=-1;o=43;break a}if((Oc[c[(c[(c[D>>2]|0)+8>>2]|0)+4>>2]&255](d,92088)|0)==-1){f=-1;o=43;break a}}}while(0);if((Oc[c[(c[(c[B>>2]|0)+8>>2]|0)+4>>2]&255](d,103256)|0)==-1){f=-1;o=43;break a}}A=ow(b,r)|0;if((A|0)==0){break}else{q=u;r=A}}}r=vx(b,g)|0;if((r|0)==0){f=0;o=43;break}else{g=r}}if((o|0)==43){i=e;return f|0}return 0}function Jy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=sy(a)|0;if((d|0)==0){e=0;return e|0}else{f=d}a:while(1){if((Ey(f)|0)==0){if((Hy(f,b,0)|0)==-1){e=-1;g=11;break}if((Iy(f,b)|0)==-1){e=-1;g=11;break}d=(c[53668]|0)-1|0;c[53668]=d;a=f+52|0;if((d|0)>0){h=d;do{h=h-1|0;if((Oc[c[(c[(c[a>>2]|0)+8>>2]|0)+4>>2]&255](b,130632)|0)==-1){e=-1;g=11;break a}}while((h|0)>0)}if((Oc[c[(c[(c[a>>2]|0)+8>>2]|0)+4>>2]&255](b,161536)|0)==-1){e=-1;g=11;break}}else{Jy(f,b)|0}h=ty(f)|0;if((h|0)==0){e=0;g=11;break}else{f=h}}if((g|0)==11){return e|0}return 0}function Ky(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=sy(a)|0;a:do{if((e|0)!=0){f=e;while(1){if((Ey(f)|0)==0){if((zx(f,b,0)|0)!=0){g=0;break}}f=ty(f)|0;if((f|0)==0){break a}}return g|0}}while(0);if((c[b>>2]|0)>>>4>>>0<d>>>0){g=0;return g|0}e=pw(a,b)|0;b:do{if((e|0)!=0){f=e;while(1){if((c[c[f+28>>2]>>2]|0)>>>4>>>0<d>>>0){g=0;break}f=qw(a,f)|0;if((f|0)==0){break b}}return g|0}}while(0);do{if((pw(a,b)|0)==0){if((mw(a,b)|0)==0){g=1}else{break}return g|0}}while(0);a=Vv(b|0)|0;if((a|0)==0){g=0;return g|0}b=a+8|0;d=c[b>>2]|0;e=Hc[c[d>>2]&63](d,0,128)|0;if((e|0)==0){g=0;return g|0}d=a+12|0;a=e;while(1){if((c[(c[d>>2]|0)+(c[a+16>>2]<<2)>>2]|0)!=(c[a+12>>2]|0)){g=1;h=16;break}e=c[b>>2]|0;f=Hc[c[e>>2]&63](e,a,8)|0;if((f|0)==0){g=0;h=16;break}else{a=f}}if((h|0)==16){return g|0}return 0}function Ly(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+24|0;f=e|0;g=a|0;h=Hx(g)|0;j=c[53668]|0;k=h+52|0;a:do{if((j|0)>0){h=j;while(1){h=h-1|0;if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](b,130632)|0)==-1){l=-1;break}if((h|0)<=0){break a}}i=e;return l|0}}while(0);j=f|0;f=$w(g)|0;h=Hx(g)|0;do{if((f|0)==0){nb(j|0,160056,(m=i,i=i+8|0,c[m>>2]=c[a+4>>2],m)|0)|0;i=m;if((Oc[c[(c[(c[h+52>>2]|0)+8>>2]|0)+4>>2]&255](b,j)|0)==-1){l=-1}else{break}i=e;return l|0}else{m=Dy(f)|0;if((Oc[c[(c[(c[h+52>>2]|0)+8>>2]|0)+4>>2]&255](b,m)|0)==-1){l=-1}else{break}i=e;return l|0}}while(0);do{if((c[a>>2]&8|0)==0){if((Ny(g,b,d)|0)==-1){l=-1}else{break}i=e;return l|0}}while(0);l=Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](b,103256)|0;i=e;return l|0}function My(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((e|0)==0){f=0;return f|0}g=b|0;b=Hx(g)|0;h=fw(g,e)|0;if((a[h]|0)==0){f=0;return f|0}e=b+52|0;if((Oc[c[(c[(c[e>>2]|0)+8>>2]|0)+4>>2]&255](d,164120)|0)==-1){f=-1;return f|0}do{if((gy(h)|0)==0){b=gb(h|0,58)|0;if((b|0)==0){g=((xF(h|0)|0)<<1)+2|0;i=g>>>0>1024>>>0?g:1024;g=c[44748]|0;if((i|0)>(c[44750]|0)){if((g|0)==0){j=dF(i)|0}else{j=gF(g,i)|0}c[44748]=j;c[44750]=i;k=j}else{k=g}g=Cy(h,k)|0;if((Oc[c[(c[(c[e>>2]|0)+8>>2]|0)+4>>2]&255](d,g)|0)==-1){f=-1}else{break}return f|0}a[b]=0;g=((xF(h|0)|0)<<1)+2|0;i=g>>>0>1024>>>0?g:1024;g=c[44748]|0;if((i|0)>(c[44750]|0)){if((g|0)==0){l=dF(i)|0}else{l=gF(g,i)|0}c[44748]=l;c[44750]=i;m=l}else{m=g}g=Cy(h,m)|0;if((Oc[c[(c[(c[e>>2]|0)+8>>2]|0)+4>>2]&255](d,g)|0)==-1){f=-1;return f|0}if((Oc[c[(c[(c[e>>2]|0)+8>>2]|0)+4>>2]&255](d,164120)|0)==-1){f=-1;return f|0}g=b+1|0;i=((xF(g|0)|0)<<1)+2|0;n=i>>>0>1024>>>0?i:1024;i=c[44748]|0;if((n|0)>(c[44750]|0)){if((i|0)==0){o=dF(n)|0}else{o=gF(i,n)|0}c[44748]=o;c[44750]=n;p=o}else{p=i}i=Cy(g,p)|0;if((Oc[c[(c[(c[e>>2]|0)+8>>2]|0)+4>>2]&255](d,i)|0)==-1){f=-1;return f|0}else{a[b]=58;break}}else{b=Dy(h)|0;if((Oc[c[(c[(c[e>>2]|0)+8>>2]|0)+4>>2]&255](d,b)|0)==-1){f=-1}else{break}return f|0}}while(0);f=0;return f|0}function Ny(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;f=b;do{if(((c[f>>2]&3)-2|0)>>>0<2>>>0){g=$w(b)|0;h=Hx(b)|0;if((g|0)==0){i=0;break}if((a[g]|0)==0){i=0;break}j=h+52|0;if((Oc[c[(c[(c[j>>2]|0)+8>>2]|0)+4>>2]&255](d,97624)|0)==-1){k=-1;return k|0}h=Dy(g)|0;if((Oc[c[(c[(c[j>>2]|0)+8>>2]|0)+4>>2]&255](d,h)|0)==-1){k=-1}else{i=1;break}return k|0}else{i=0}}while(0);h=Vv(b)|0;j=Hx(b)|0;a:do{if((h|0)==0){l=i}else{b=e|0;g=Hc[c[b>>2]&63](e,0,128)|0;if((g|0)==0){l=i;break}m=h+12|0;n=j+52|0;o=g;g=i;b:while(1){do{if(((c[f>>2]&3)-2|0)>>>0<2>>>0){p=c[53512]|0;if((p|0)!=0){if((c[o+16>>2]|0)==(c[p+16>>2]|0)){q=g;break}}p=c[53684]|0;if((p|0)==0){r=14;break}if((c[o+16>>2]|0)==(c[p+16>>2]|0)){q=g}else{r=14}}else{r=14}}while(0);do{if((r|0)==14){r=0;p=o+16|0;if((c[(c[m>>2]|0)+(c[p>>2]<<2)>>2]|0)==(c[o+12>>2]|0)){q=g;break}s=g+1|0;do{if((g|0)==0){t=c[53668]|0;if((t|0)>0){u=t;do{u=u-1|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){k=-1;r=33;break b}}while((u|0)>0)}if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,86840)|0)==-1){k=-1;r=33;break b}c[53668]=(c[53668]|0)+1}else{if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,82040)|0)==-1){k=-1;r=33;break b}u=c[53668]|0;if((u|0)>0){v=u}else{break}do{v=v-1|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){k=-1;r=33;break b}}while((v|0)>0)}}while(0);u=Dy(c[o+8>>2]|0)|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,u)|0)==-1){k=-1;r=33;break b}if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,168256)|0)==-1){k=-1;r=33;break b}u=Dy(c[(c[m>>2]|0)+(c[p>>2]<<2)>>2]|0)|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,u)|0)==-1){k=-1;r=33;break b}else{q=s}}}while(0);u=Hc[c[b>>2]&63](e,o,8)|0;if((u|0)==0){l=q;break a}else{o=u;g=q}}if((r|0)==33){return k|0}}}while(0);do{if((l|0)>0){if((Oc[c[(c[(c[j+52>>2]|0)+8>>2]|0)+4>>2]&255](d,92088)|0)==-1){k=-1;return k|0}else{c[53668]=(c[53668]|0)-1;break}}}while(0);c[f>>2]=c[f>>2]|8;k=0;return k|0}function Oy(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;h=(g|0)!=0;if(h){i=0}else{i=fh(f,0)|0}g=f|0;j=Hc[c[g>>2]&63](f,0,128)|0;do{if((j|0)==0){k=34}else{l=(i|0)==0;m=i|0;n=b+52|0;o=0;p=j;a:while(1){q=p+12|0;r=c[q>>2]|0;if((r|0)==0){k=7}else{if((a[r]|0)==0){k=7}else{k=12}}do{if((k|0)==7){k=0;if((a[p+22|0]|0)!=0){k=12;break}if(l){s=o;break}r=Hc[c[m>>2]&63](i,p,4)|0;t=c[r+12>>2]|0;if((t|0)!=0){if((a[t]|0)!=0){k=12;break}}if((a[r+22|0]|0)==0){k=12}else{s=o}}}while(0);if((k|0)==12){k=0;r=o+1|0;do{if((o|0)==0){t=c[53668]|0;if((t|0)>0){u=t;do{u=u-1|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){v=-1;k=36;break a}}while((u|0)>0)}if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,e)|0)==-1){v=-1;k=36;break a}if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,86840)|0)==-1){v=-1;k=36;break a}c[53668]=(c[53668]|0)+1}else{if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,82040)|0)==-1){v=-1;k=36;break a}u=c[53668]|0;if((u|0)>0){w=u}else{break}do{w=w-1|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){v=-1;k=36;break a}}while((w|0)>0)}}while(0);u=Dy(c[p+8>>2]|0)|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,u)|0)==-1){v=-1;k=36;break}if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,168256)|0)==-1){v=-1;k=36;break}u=Dy(c[q>>2]|0)|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,u)|0)==-1){v=-1;k=36;break}else{s=r}}u=Hc[c[g>>2]&63](f,p,8)|0;if((u|0)==0){k=27;break}else{o=s;p=u}}if((k|0)==27){if((s|0)<=0){k=34;break}c[53668]=(c[53668]|0)-1;p=b+52|0;b:do{if((s|0)>1){if((Oc[c[(c[(c[p>>2]|0)+8>>2]|0)+4>>2]&255](d,121736)|0)==-1){v=-1;return v|0}o=c[53668]|0;if((o|0)>0){x=o}else{break}while(1){x=x-1|0;if((Oc[c[(c[(c[p>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){v=-1;break}if((x|0)<=0){break b}}return v|0}}while(0);r=(Oc[c[(c[(c[p>>2]|0)+8>>2]|0)+4>>2]&255](d,120864)|0)==-1;if(r|h){v=r<<31>>31}else{break}return v|0}else if((k|0)==36){return v|0}}}while(0);do{if((k|0)==34){if(h){v=0}else{break}return v|0}}while(0);fh(f,i)|0;v=0;return v|0}function Py(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;f=i;i=i+8|0;g=f|0;h=g;j=ux(d)|0;if((j|0)==0){k=0;i=f;return k|0}l=d+8|0;m=c[o>>2]|0;n=0;p=0;q=j;j=0;while(1){r=mw(d,q)|0;if((r|0)==0){s=n;t=p;u=j}else{v=r;r=n;w=p;x=j;while(1){y=c[v>>2]&3;z=c[((y|0)==2?v:v-32|0)+28>>2]|0;A=(b[(c[v+8>>2]|0)+168>>1]|0)==0;do{if((q|0)==(z|0)){if(A){B=x;C=w;D=r;break}if((w|0)==0){E=jk(96)|0;c[E+84>>2]=jk(((Lw(d)|0)<<5)+11520|0)|0;F=E}else{F=w}Gt(F,v,c[(c[l>>2]|0)+236>>2]|0);B=x;C=F;D=r}else{if(A){B=x;C=w;D=r;break}E=c[((y|0)==3?v:v+32|0)+28>>2]|0;G=z+8|0;H=c[(c[G>>2]|0)+212>>2]|0;I=E+8|0;J=c[(c[I>>2]|0)+212>>2]|0;K=jk(12)|0;L=K;if((a[(c[G>>2]|0)+118|0]|0)==0){M=z|0;N=H}else{M=H;N=c[(c[(c[H+8>>2]|0)+132>>2]|0)+48>>2]|0}if((a[(c[I>>2]|0)+118|0]|0)==0){O=E|0;P=J}else{O=J;P=c[(c[(c[J+8>>2]|0)+132>>2]|0)+48>>2]|0}J=c[(c[(c[N+8>>2]|0)+132>>2]|0)+44>>2]|0;E=c[(c[(c[P+8>>2]|0)+132>>2]|0)+44>>2]|0;do{if((J|0)>(E|0)){I=M;H=J;G=N;while(1){Qy(L,G,I,0,e);Q=G|0;R=H-1|0;S=c[(c[(c[G+8>>2]|0)+132>>2]|0)+48>>2]|0;if((R|0)>(E|0)){I=Q;H=R;G=S}else{T=Q;U=O;V=S;W=P;break}}}else{if((E|0)>(J|0)){X=O;Y=E;Z=P}else{T=M;U=O;V=N;W=P;break}while(1){Qy(L,Z,X,0,e);G=Z|0;H=Y-1|0;I=c[(c[(c[Z+8>>2]|0)+132>>2]|0)+48>>2]|0;if((H|0)>(J|0)){X=G;Y=H;Z=I}else{T=M;U=G;V=N;W=I;break}}}}while(0);if((V|0)==(W|0)){_=U;$=T;aa=W}else{J=U;E=T;I=W;G=V;while(1){Qy(L,G,0,E,e);Qy(L,I,J,0,e);H=G|0;S=c[(c[(c[G+8>>2]|0)+132>>2]|0)+48>>2]|0;Q=I|0;R=c[(c[(c[I+8>>2]|0)+132>>2]|0)+48>>2]|0;if((S|0)==(R|0)){_=Q;$=H;aa=S;break}else{J=Q;E=H;I=R;G=S}}}Qy(L,aa,_,$,e);G=K+8|0;I=K;if((Hs(c[G>>2]|0,c[I>>2]|0)|0)==0){if((a[213992]|0)==0){B=1;C=w;D=L;break}Ma(155176,50,1,m|0)|0;B=1;C=w;D=L;break}E=IB(c[G>>2]|0,c[I>>2]|0)|0;if((E|0)==0){Fv(0,116504,(J=i,i=i+1|0,i=i+7&-8,c[J>>2]=0,J)|0)|0;i=J;B=1;C=w;D=L;break}if((v|0)!=0){J=v;do{S=J+8|0;R=(c[S>>2]|0)+144|0;It(h,J,E,0,c[G>>2]|0,c[I>>2]|0);H=R;R=c[g+4>>2]|0;c[H>>2]=c[g>>2];c[H+4>>2]=R;Jt(d,J,c[G>>2]|0,c[I>>2]|0,0);J=c[(c[S>>2]|0)+172>>2]|0;}while((J|0)!=0)}c[I>>2]=0;B=x;C=w;D=L}}while(0);z=ow(d,v)|0;if((z|0)==0){s=D;t=C;u=B;break}else{v=z;r=D;w=C;x=B}}}x=vx(d,q)|0;if((x|0)==0){break}else{n=s;p=t;q=x;j=u}}if((s|0)!=0){eF(c[s+8>>2]|0);eF(s)}if((t|0)==0){k=u;i=f;return k|0}eF(c[t+84>>2]|0);eF(t);k=u;i=f;return k|0}function Qy(b,d,e,f,i){b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0;j=ux(d)|0;if((j|0)!=0){k=e;l=f;m=b+4|0;n=b|0;o=b+8|0;p=j;do{j=c[p+8>>2]|0;do{if(!((c[j+212>>2]|0)!=(d|0)|(p|0)==(k|0)|(p|0)==(l|0))){if((a[j+118|0]|0)!=0){break}q=Ht(p,i,0)|0;r=c[m>>2]|0;s=c[o>>2]|0;do{if((r|0)==(c[n>>2]|0)){if((s|0)==0){t=kk(400)|0;c[o>>2]=t;c[m>>2]=100;u=t;break}else{c[m>>2]=r<<1;t=mk(s,r<<3)|0;c[o>>2]=t;u=t;break}}else{u=s}}while(0);s=c[n>>2]|0;c[n>>2]=s+1;c[u+(s<<2)>>2]=q}}while(0);p=vx(d,p)|0;}while((p|0)!=0)}p=d+8|0;d=c[p>>2]|0;if((c[d+172>>2]|0)<1){return}u=e;e=f;f=i+8|0;n=i|0;o=i+4|0;i=b+4|0;m=b|0;l=b+8|0;b=1;k=d;while(1){d=c[(c[k+176>>2]|0)+(b<<2)>>2]|0;if((d|0)==(u|0)|(d|0)==(e|0)){v=k}else{j=jk(8)|0;s=j;r=c[d+8>>2]|0;w=+h[r+16>>3];x=+h[r+24>>3];y=+h[r+32>>3];z=+h[r+40>>3];c[j+4>>2]=4;r=jk(64)|0;d=j;c[d>>2]=r;if((a[f]|0)==0){A=+g[n>>2];B=+g[o>>2];C=(w+y)*.5*(A+-1.0);D=(x+z)*.5*(B+-1.0);E=z*B-D;F=y*A-C;G=x*B-D;H=w*A-C}else{C=+g[n>>2];A=+g[o>>2];E=z+A;F=y+C;G=x-A;H=w-C}h[r>>3]=H;h[(c[d>>2]|0)+8>>3]=G;h[(c[d>>2]|0)+16>>3]=H;h[(c[d>>2]|0)+24>>3]=E;h[(c[d>>2]|0)+32>>3]=F;h[(c[d>>2]|0)+40>>3]=E;h[(c[d>>2]|0)+48>>3]=F;h[(c[d>>2]|0)+56>>3]=G;d=c[i>>2]|0;r=c[l>>2]|0;do{if((d|0)==(c[m>>2]|0)){if((r|0)==0){j=kk(400)|0;c[l>>2]=j;c[i>>2]=100;I=j;break}else{c[i>>2]=d<<1;j=mk(r,d<<3)|0;c[l>>2]=j;I=j;break}}else{I=r}}while(0);r=c[m>>2]|0;c[m>>2]=r+1;c[I+(r<<2)>>2]=s;v=c[p>>2]|0}if((b|0)<(c[v+172>>2]|0)){b=b+1|0;k=v}else{break}}return}function Ry(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=i;i=i+128|0;g=f|0;h=jk(Lw(b)|0)|0;j=b+8|0;k=c[c[(c[j>>2]|0)+132>>2]>>2]|0;do{if((k|0)==0){l=0;m=0}else{n=g|0;o=$w(b|0)|0;p=c[53848]|0;nb(n|0,126592,(q=i,i=i+16|0,c[q>>2]=o,c[q+8>>2]=p,q)|0)|0;i=q;p=ry(b,n,1)|0;Wx(p|0,154280,272,1)|0;n=jk(56)|0;o=p+8|0;c[(c[o>>2]|0)+132>>2]=n;c[c[(c[o>>2]|0)+132>>2]>>2]=k;c[(c[(c[o>>2]|0)+132>>2]|0)+4>>2]=c[(c[(c[j>>2]|0)+132>>2]|0)+4>>2];o=c[k+4>>2]|0;if((o|0)==0){l=p;m=1;break}else{r=k;s=o}while(1){if((a[h+(c[(c[s+8>>2]|0)+120>>2]|0)|0]|0)==0){Sy(b,s,p,h)}o=c[r+20>>2]|0;if((o|0)==0){l=p;m=1;break}else{r=r+16|0;s=o}}}}while(0);s=ux(b)|0;if((s|0)==0){t=m;u=l;v=0}else{r=g|0;k=b|0;j=m;m=l;l=s;s=0;while(1){p=c[l+8>>2]|0;do{if((a[h+(c[p+120>>2]|0)|0]|0)==0){if((a[p+119|0]|0)!=3){w=s;x=m;y=j;break}if((m|0)==0){o=$w(k)|0;n=(c[53848]|0)+j|0;nb(r|0,126592,(q=i,i=i+16|0,c[q>>2]=o,c[q+8>>2]=n,q)|0)|0;i=q;n=ry(b,r,1)|0;Wx(n|0,154280,272,1)|0;o=jk(56)|0;c[(c[n+8>>2]|0)+132>>2]=o;z=n;A=j+1|0}else{z=m;A=j}Sy(b,l,z,h);w=1;x=z;y=A}else{w=s;x=m;y=j}}while(0);p=vx(b,l)|0;if((p|0)==0){t=y;u=x;v=w;break}else{j=y;m=x;l=p;s=w}}}if((u|0)!=0){jv(u)|0}u=ux(b)|0;if((u|0)==0){B=t}else{w=g|0;g=b|0;s=t;t=u;while(1){if((a[h+(c[(c[t+8>>2]|0)+120>>2]|0)|0]|0)==0){u=$w(g)|0;l=(c[53848]|0)+s|0;nb(w|0,123560,(q=i,i=i+16|0,c[q>>2]=u,c[q+8>>2]=l,q)|0)|0;i=q;l=ry(b,w,1)|0;Wx(l|0,154280,272,1)|0;u=jk(56)|0;c[(c[l+8>>2]|0)+132>>2]=u;Sy(b,t,l,h);jv(l)|0;C=s+1|0}else{C=s}l=vx(b,t)|0;if((l|0)==0){B=C;break}else{s=C;t=l}}}eF(h);c[53848]=(c[53848]|0)+B;if((d|0)!=0){c[d>>2]=B}if((e|0)!=0){c[e>>2]=v}v=jk((B<<2)+4|0)|0;e=sy(b)|0;if((e|0)==0){D=B;E=v}else{b=B;B=e;e=v;while(1){d=e+4|0;c[e>>2]=B;h=b-1|0;t=ty(B)|0;if((t|0)==0){D=h;E=d;break}else{b=h;B=t;e=d}}}if((D|0)==0){c[E>>2]=0;i=f;return v|0}else{cc(114768,107904,134,170616);return 0}return 0}function Sy(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;a[f+(c[(c[d+8>>2]|0)+120>>2]|0)|0]=1;zx(e,d,1)|0;g=rw(b,d)|0;if((g|0)==0){return}else{h=g}do{g=c[h>>2]&3;i=c[((g|0)==3?h:h+32|0)+28>>2]|0;if((i|0)==(d|0)){j=c[((g|0)==2?h:h-32|0)+28>>2]|0}else{j=i}if((a[f+(c[(c[j+8>>2]|0)+120>>2]|0)|0]|0)==0){Sy(b,j,e,f)}h=sw(b,h,d)|0;}while((h|0)!=0);return}function Ty(b){b=b|0;var d=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=i;i=i+8|0;f=d|0;Zx(b,1,102216,304,1);bn(b)|0;g=jk(((Lw(b)|0)<<2)+4|0)|0;j=b+8|0;c[(c[j>>2]|0)+144>>2]=g;g=ux(b)|0;if((g|0)!=0){k=g;g=0;while(1){Ym(k);l=k|0;m=jk(e[(c[(Hx(l)|0)+8>>2]|0)+168>>1]<<3)|0;n=k+8|0;c[(c[n>>2]|0)+132>>2]=m;vn(k,c[(c[(Hx(l)|0)+8>>2]|0)+116>>2]&1);c[(c[(c[j>>2]|0)+144>>2]|0)+(g<<2)>>2]=k;c[(c[n>>2]|0)+120>>2]=g;n=vx(b,k)|0;if((n|0)==0){break}else{k=n;g=g+1|0}}}g=Wv(b,2,145056,0)|0;k=ux(b)|0;if((k|0)!=0){n=k;do{k=mw(b,n)|0;if((k|0)!=0){l=k;do{k=l|0;Wx(k,91160,176,1)|0;p=+Fm(k,c[53750]|0,1.0,0.0);m=l+8|0;h[(c[m>>2]|0)+128>>3]=p;p=+Fm(k,g,+h[(c[6536]|0)+32>>3],0.0);h[(c[m>>2]|0)+136>>3]=p;Zm(l)|0;l=ow(b,l)|0;}while((l|0)!=0)}n=vx(b,n)|0;}while((n|0)!=0)}n=Wv(b,1,111528,0)|0;if((n|0)==0){q=1;r=0;i=d;return}g=Wv(b,1,104752,0)|0;b=c[c[(c[j>>2]|0)+144>>2]>>2]|0;if((b|0)==0){q=1;r=0;i=d;return}l=c[o>>2]|0;if((g|0)==0){m=0;k=b;do{s=k|0;t=fw(s,n)|0;do{if((a[t]|0)!=0){u=k+8|0;v=c[(c[u>>2]|0)+132>>2]|0;a[f]=0;w=v+8|0;x=ac(t|0,103888,(y=i,i=i+24|0,c[y>>2]=v,c[y+8>>2]=w,c[y+16>>2]=f,y)|0)|0;i=y;if((x|0)<=1){x=$w(s)|0;gc(l|0,96448,(y=i,i=i+16|0,c[y>>2]=x,c[y+8>>2]=t,y)|0)|0;i=y;break}p=+h[21580];if(p>0.0){x=v;h[x>>3]=+h[x>>3]/p;x=w;h[x>>3]=+h[x>>3]/+h[21580]}a[(c[u>>2]|0)+119|0]=1;if((a[f]|0)!=33){break}a[(c[u>>2]|0)+119|0]=3}}while(0);m=m+1|0;k=c[(c[(c[j>>2]|0)+144>>2]|0)+(m<<2)>>2]|0;}while((k|0)!=0);q=1;r=0;i=d;return}else{z=0;A=b}do{b=A|0;k=fw(b,n)|0;do{if((a[k]|0)!=0){m=A+8|0;t=c[(c[m>>2]|0)+132>>2]|0;a[f]=0;s=t+8|0;u=ac(k|0,103888,(y=i,i=i+24|0,c[y>>2]=t,c[y+8>>2]=s,c[y+16>>2]=f,y)|0)|0;i=y;if((u|0)<=1){u=$w(b)|0;gc(l|0,96448,(y=i,i=i+16|0,c[y>>2]=u,c[y+8>>2]=k,y)|0)|0;i=y;break}p=+h[21580];if(p>0.0){u=t;h[u>>3]=+h[u>>3]/p;u=s;h[u>>3]=+h[u>>3]/+h[21580]}a[(c[m>>2]|0)+119|0]=1;if((a[f]|0)!=33){if((Km(fw(b,g)|0)|0)<<24>>24==0){break}}a[(c[m>>2]|0)+119|0]=3}}while(0);z=z+1|0;A=c[(c[(c[j>>2]|0)+144>>2]|0)+(z<<2)>>2]|0;}while((A|0)!=0);q=1;r=0;i=d;return}function Uy(a){a=a|0;var b=0,d=0,e=0;b=ux(a)|0;if((b|0)!=0){d=b;do{b=mw(a,d)|0;if((b|0)!=0){e=b;do{tn(e);e=ow(a,e)|0;}while((e|0)!=0)}un(d);d=vx(a,d)|0;}while((d|0)!=0)}Vy(a);d=a+8|0;eF(c[(c[d>>2]|0)+144>>2]|0);eF(c[(c[d>>2]|0)+132>>2]|0);return}function Vy(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=a+8|0;d=c[b>>2]|0;e=c[d+176>>2]|0;if((c[d+172>>2]|0)<1){f=e}else{d=1;g=e;while(1){e=c[g+(d<<2)>>2]|0;h=e+8|0;dk(c[(c[h>>2]|0)+12>>2]|0);i=c[(c[h>>2]|0)+132>>2]|0;if((i|0)!=0){eF(c[i>>2]|0);eF(c[(c[h>>2]|0)+132>>2]|0)}Vy(e);e=c[b>>2]|0;h=c[e+176>>2]|0;if((d|0)<(c[e+172>>2]|0)){d=d+1|0;g=h}else{f=h;break}}}eF(f);f=a|0;if((Ix(f)|0)==(a|0)){return}Xx(f,120088)|0;return}function Wy(a){a=a|0;var b=0,d=0,e=0,f=0;b=kk(24)|0;d=b;c[53372]=d;c[b>>2]=$g(25440,c[43330]|0)|0;c[b+16>>2]=0;c[b+12>>2]=0;e=kk(16)|0;c[e+12>>2]=0;f=kk(a*20|0)|0;c[e>>2]=f;c[e+8>>2]=f+(a*20|0);c[e+4>>2]=f;c[b+4>>2]=e;return d|0}function Xy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=a+12|0;e=c[d>>2]|0;if((e|0)>=(b|0)){return}f=e<<1;e=(f|0)<(b|0)?b:f;f=a+16|0;a=c[f>>2]|0;if((a|0)!=0){eF(a)}c[f>>2]=kk(e<<3)|0;c[d>>2]=e;return}function Yy(a){a=a|0;var b=0;b=c[a>>2]|0;Hc[c[b>>2]&63](b,0,64)|0;c[a+20>>2]=c[a+16>>2];b=c[a+4>>2]|0;c[a+8>>2]=b;c[b+4>>2]=c[b>>2];return}function Zy(a){a=a|0;var b=0,d=0;Vg(c[a>>2]|0)|0;b=c[a+4>>2]|0;if((b|0)!=0){d=b;while(1){b=c[d+12>>2]|0;eF(c[d>>2]|0);eF(d);if((b|0)==0){break}else{d=b}}}eF(c[a+16>>2]|0);eF(a);return}function _y(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+24|0;h=g|0;c[h>>2]=b;c[h+4>>2]=e;j=c[a>>2]|0;k=(Hc[c[j>>2]&63](j,h,1)|0)+8|0;h=c[k>>2]|0;j=a+20|0;a=c[j>>2]|0;c[j>>2]=a+8;c[a>>2]=f;c[a+4>>2]=h;c[k>>2]=a;if((d[213992]|0)>>>0<=2>>>0){i=g;return}a=c[o>>2]|0;k=$w(f|0)|0;gc(a|0,163312,(a=i,i=i+24|0,c[a>>2]=b,c[a+8>>2]=e,c[a+16>>2]=k,a)|0)|0;i=a;i=g;return}function $y(a,b){a=a|0;b=b|0;hh(c[a>>2]|0,b,a)|0;return}function az(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+24|0;f=e|0;c[f>>2]=b;c[f+4>>2]=d;d=c[a>>2]|0;a=Hc[c[d>>2]&63](d,f,4)|0;i=e;return a|0}function bz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=(c[53372]|0)+8|0;a=c[d>>2]|0;e=c[a+4>>2]|0;if((e|0)==(c[a+8>>2]|0)){f=a+12|0;g=c[f>>2]|0;if((g|0)==0){h=(e-(c[a>>2]|0)|0)/20|0;i=kk(16)|0;j=i;c[i+12>>2]=0;k=kk(h*40|0)|0;c[i>>2]=k;c[i+8>>2]=k+((h<<1)*20|0);c[i+4>>2]=k;c[f>>2]=j;l=j}else{l=g}c[d>>2]=l;d=c[l>>2]|0;c[l+4>>2]=d;m=l;n=d}else{m=a;n=e}c[m+4>>2]=n+20;c[n>>2]=c[b>>2];c[n+4>>2]=c[b+4>>2];c[n+8>>2]=0;return n|0}function cz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[b>>2]|0;a=c[d>>2]|0;if((e|0)==(a|0)){f=(c[b+4>>2]|0)-(c[d+4>>2]|0)|0;return f|0}else{f=e-a|0;return f|0}return 0}function dz(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+16|0;g=f|0;h=(d|0)==0;if(h){c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;j=g}else{j=d}d=sy(a)|0;if((d|0)!=0){k=e+8|0;l=e|0;m=j+8|0;n=j+4|0;o=j|0;p=d;do{d=p|0;if((Za($w(d)|0,123792,7)|0)==0){Wx(d,92056,272,1)|0;d=jk(56)|0;q=p+8|0;c[(c[q>>2]|0)+132>>2]=d;b[(c[q>>2]|0)+168>>1]=b[(c[k>>2]|0)+168>>1]|0;c[(c[(c[q>>2]|0)+132>>2]|0)+44>>2]=(c[(c[(c[k>>2]|0)+132>>2]|0)+44>>2]|0)+1;c[(c[(c[q>>2]|0)+132>>2]|0)+48>>2]=l;q=(c[m>>2]|0)+1|0;c[m>>2]=q;d=c[n>>2]|0;if((q|0)<(d|0)){r=q;s=c[o>>2]|0}else{q=d+10|0;c[n>>2]=q;d=mk(c[o>>2]|0,q<<2)|0;c[o>>2]=d;r=c[m>>2]|0;s=d}c[s+(r<<2)>>2]=p;dz(p,0,p)}else{dz(p,j,e)}p=ty(p)|0;}while((p|0)!=0)}if(!h){i=f;return}h=g+8|0;p=a+8|0;c[(c[p>>2]|0)+172>>2]=c[h>>2];a=c[h>>2]|0;if((a|0)==0){i=f;return}h=mk(c[g>>2]|0,(a<<2)+4|0)|0;c[(c[p>>2]|0)+176>>2]=h;i=f;return}function ez(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;d=i;i=i+56|0;e=d|0;c[e+4>>2]=Wv(b,0,159312,0)|0;c[e+8>>2]=Wv(b,0,163152,0)|0;c[e+12>>2]=Wv(b,0,131152,0)|0;c[e>>2]=b;c[e+16>>2]=0;c[e+36>>2]=tv(b,2,4,e+20|0)|0;fz(b,e);e=ux(b)|0;if((e|0)==0){gz(b,b);hz(b);i=d;return}else{f=e}do{e=f+8|0;g=c[e>>2]|0;if((a[g+118|0]|0)!=0){j=c[(c[(c[g+212>>2]|0)+8>>2]|0)+132>>2]|0;k=+h[j+24>>3]- +h[j+8>>3];l=+h[j+32>>3]- +h[j+16>>3];m=k*.5;n=l*.5;o=m*72.0;p=n*72.0;h[c[g+132>>2]>>3]=m;h[(c[(c[e>>2]|0)+132>>2]|0)+8>>3]=n;h[(c[e>>2]|0)+32>>3]=k;h[(c[e>>2]|0)+40>>3]=l;h[(c[e>>2]|0)+96>>3]=o;h[(c[e>>2]|0)+88>>3]=o;h[(c[e>>2]|0)+80>>3]=l*72.0;g=c[e>>2]|0;j=c[(c[g+12>>2]|0)+44>>2]|0;h[j>>3]=+h[g+96>>3];h[j+8>>3]=p;h[j+16>>3]=-0.0- +h[(c[e>>2]|0)+88>>3];h[j+24>>3]=p;h[j+32>>3]=-0.0- +h[(c[e>>2]|0)+88>>3];l=-0.0-p;h[j+40>>3]=l;h[j+48>>3]=+h[(c[e>>2]|0)+96>>3];h[j+56>>3]=l}f=vx(b,f)|0;}while((f|0)!=0);gz(b,b);hz(b);i=d;return}function fz(f,g){f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0.0,ma=0.0,na=0,oa=0,pa=0.0,qa=0,ra=0,sa=0,ta=0.0,ua=0.0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0.0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0,Va=0,Wa=0,Xa=0.0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0;j=i;i=i+200|0;k=j|0;l=j+32|0;m=j+40|0;n=j+144|0;p=j+152|0;q=j+160|0;if((a[213992]|0)!=0){r=c[o>>2]|0;s=$w(f|0)|0;gc(r|0,103288,(t=i,i=i+8|0,c[t>>2]=s,t)|0)|0;i=t}s=ux(f)|0;if((s|0)!=0){r=s;do{c[(c[r+8>>2]|0)+164>>2]=0;r=vx(f,r)|0;}while((r|0)!=0)}r=m|0;m=g+16|0;s=c[m>>2]|0;c[m>>2]=s+1;nb(r|0,154944,(t=i,i=i+8|0,c[t>>2]=s,t)|0)|0;i=t;if((d[213992]|0)>>>0>1>>>0){s=c[o>>2]|0;m=$w(f|0)|0;gc(s|0,151080,(t=i,i=i+16|0,c[t>>2]=r,c[t+8>>2]=m,t)|0)|0;i=t}m=Hw(148168,173936,0)|0;r=m|0;Wx(r,92056,272,1)|0;s=jk(56)|0;u=m+8|0;c[(c[u>>2]|0)+132>>2]=s;s=f+8|0;b[(c[u>>2]|0)+168>>1]=b[(c[s>>2]|0)+168>>1]|0;v=Wv(f,0,145432,0)|0;do{if((v|0)!=0){w=fw(f|0,v)|0;x=Wv(m,0,145432,0)|0;if((x|0)==0){Wv(m,0,145432,w)|0;break}else{hw(r,x,w)|0;break}}}while(0);v=Wv(f,0,142080,0)|0;do{if((v|0)!=0){w=fw(f|0,v)|0;x=Wv(m,0,142080,0)|0;if((x|0)==0){Wv(m,0,142080,w)|0;break}else{hw(r,x,w)|0;break}}}while(0);v=Wv(f,0,138944,0)|0;do{if((v|0)!=0){w=fw(f|0,v)|0;x=Wv(m,0,138944,0)|0;if((x|0)==0){Wv(m,0,138944,w)|0;break}else{hw(r,x,w)|0;break}}}while(0);v=c[s>>2]|0;if((c[v+172>>2]|0)<1){y=0}else{w=g+4|0;x=g|0;z=k|0;A=k+8|0;B=k+16|0;C=k+24|0;k=1;D=0;E=v;while(1){v=c[(c[E+176>>2]|0)+(k<<2)>>2]|0;Rj(v);F=v|0;G=Ax(m,$w(F)|0,1)|0;Wx(G|0,81280,304,1)|0;H=jk(32)|0;I=G+8|0;c[(c[I>>2]|0)+112>>2]=H;H=kk(e[(c[u>>2]|0)+168>>1]<<3)|0;c[(c[I>>2]|0)+132>>2]=H;c[(c[I>>2]|0)+212>>2]=v;H=D+1|0;c[(c[I>>2]|0)+120>>2]=D;J=c[w>>2]|0;do{if((J|0)==0){K=1.7976931348623157e+308;L=1.7976931348623157e+308;M=-1.7976931348623157e+308;N=-1.7976931348623157e+308}else{O=fw(F,J)|0;if((a[O]|0)==0){K=1.7976931348623157e+308;L=1.7976931348623157e+308;M=-1.7976931348623157e+308;N=-1.7976931348623157e+308;break}if((c[x>>2]|0)!=(v|0)){P=fw(uy(v)|0,J)|0;if((P|0)==(O|0)){K=1.7976931348623157e+308;L=1.7976931348623157e+308;M=-1.7976931348623157e+308;N=-1.7976931348623157e+308;break}if((Ya(O|0,P|0)|0)==0){K=1.7976931348623157e+308;L=1.7976931348623157e+308;M=-1.7976931348623157e+308;N=-1.7976931348623157e+308;break}}a[l]=0;P=ac(O|0,129200,(t=i,i=i+40|0,c[t>>2]=z,c[t+8>>2]=A,c[t+16>>2]=B,c[t+24>>2]=C,c[t+32>>2]=l,t)|0)|0;i=t;if((P|0)<=3){P=$w(F)|0;Fv(0,125976,(t=i,i=i+16|0,c[t>>2]=P,c[t+8>>2]=O,t)|0)|0;i=t;K=1.7976931348623157e+308;L=1.7976931348623157e+308;M=-1.7976931348623157e+308;N=-1.7976931348623157e+308;break}Q=+h[21580];if(Q>0.0){h[z>>3]=+h[z>>3]/Q;h[A>>3]=+h[A>>3]/Q;h[B>>3]=+h[B>>3]/Q;h[C>>3]=+h[C>>3]/Q}O=a[l]|0;do{if(O<<24>>24==33){a[(c[I>>2]|0)+119|0]=3}else{P=(c[I>>2]|0)+119|0;if(O<<24>>24==63){a[P]=2;break}else{a[P]=1;break}}}while(0);K=+h[z>>3];L=+h[A>>3];M=+h[B>>3];N=+h[C>>3]}}while(0);F=ux(v)|0;if((F|0)!=0){J=G;O=F;do{c[(c[O+8>>2]|0)+164>>2]=J;O=vx(v,O)|0;}while((O|0)!=0)}O=c[I>>2]|0;if((a[O+119|0]|0)!=0){h[c[O+132>>2]>>3]=(M+K)*.5;h[(c[(c[I>>2]|0)+132>>2]|0)+8>>3]=(N+L)*.5}O=c[s>>2]|0;if((k|0)<(c[O+172>>2]|0)){k=k+1|0;D=H;E=O}else{y=H;break}}}E=ux(f)|0;a:do{if((E|0)==0){R=y}else{D=f;k=y;C=E;b:while(1){S=C+8|0;B=c[S>>2]|0;do{if((c[B+164>>2]|0)==0){A=B+212|0;z=c[A>>2]|0;if((z|0)!=0){if((z|0)!=(c[(c[(c[s>>2]|0)+132>>2]|0)+48>>2]|0)){break b}}c[A>>2]=D;if((a[(c[S>>2]|0)+118|0]|0)!=0){T=k;break}A=Ax(m,$w(C|0)|0,1)|0;Wx(A|0,81280,304,1)|0;z=jk(32)|0;l=A+8|0;c[(c[l>>2]|0)+112>>2]=z;z=kk(e[(c[u>>2]|0)+168>>1]<<3)|0;c[(c[l>>2]|0)+132>>2]=z;c[(c[S>>2]|0)+164>>2]=A;c[(c[l>>2]|0)+120>>2]=k;h[(c[l>>2]|0)+32>>3]=+h[(c[S>>2]|0)+32>>3];h[(c[l>>2]|0)+40>>3]=+h[(c[S>>2]|0)+40>>3];h[(c[l>>2]|0)+88>>3]=+h[(c[S>>2]|0)+88>>3];h[(c[l>>2]|0)+96>>3]=+h[(c[S>>2]|0)+96>>3];h[(c[l>>2]|0)+80>>3]=+h[(c[S>>2]|0)+80>>3];c[(c[l>>2]|0)+8>>2]=c[(c[S>>2]|0)+8>>2];c[(c[l>>2]|0)+12>>2]=c[(c[S>>2]|0)+12>>2];A=c[S>>2]|0;if((a[A+119|0]|0)!=0){h[c[(c[l>>2]|0)+132>>2]>>3]=+h[c[A+132>>2]>>3];h[(c[(c[l>>2]|0)+132>>2]|0)+8>>3]=+h[(c[(c[S>>2]|0)+132>>2]|0)+8>>3];a[(c[l>>2]|0)+119|0]=a[(c[S>>2]|0)+119|0]|0}c[(c[(c[l>>2]|0)+112>>2]|0)+8>>2]=C;T=k+1|0}else{T=k}}while(0);B=vx(f,C)|0;if((B|0)==0){R=T;break a}else{k=T;C=B}}k=$w(C|0)|0;D=$w(f|0)|0;H=$w(c[(c[S>>2]|0)+212>>2]|0)|0;Fv(1,136344,(t=i,i=i+24|0,c[t>>2]=k,c[t+8>>2]=D,c[t+16>>2]=H,t)|0)|0;i=t;rc(177912,1)}}while(0);S=ux(f)|0;if((S|0)!=0){T=S;do{S=c[(c[T+8>>2]|0)+164>>2]|0;E=S;y=mw(f,T)|0;if((y|0)!=0){H=S+8|0;D=y;do{y=c[(c[(c[((c[D>>2]&3|0)==2?D:D-32|0)+28>>2]|0)+8>>2]|0)+164>>2]|0;k=y;if((y|0)!=(S|0)){if(y>>>0>S>>>0){U=uw(m,E,k,0,1)|0}else{U=uw(m,k,E,0,1)|0}Wx(U|0,85888,176,1)|0;k=D+8|0;I=U+8|0;h[(c[I>>2]|0)+136>>3]=+h[(c[k>>2]|0)+136>>3];h[(c[I>>2]|0)+128>>3]=+h[(c[k>>2]|0)+128>>3];k=y+8|0;y=(c[(c[k>>2]|0)+112>>2]|0)+4|0;c[y>>2]=(c[y>>2]|0)+1;y=(c[(c[H>>2]|0)+112>>2]|0)+4|0;c[y>>2]=(c[y>>2]|0)+1;y=c[I>>2]|0;B=c[y+172>>2]|0;do{if((B|0)==0){l=c[(c[k>>2]|0)+112>>2]|0;c[l>>2]=(c[l>>2]|0)+1;l=c[(c[H>>2]|0)+112>>2]|0;c[l>>2]=(c[l>>2]|0)+1;l=c[I>>2]|0;A=c[l+172>>2]|0;z=b[l+168>>1]|0;if((A|0)!=0){V=A;W=z;X=63;break}Y=kk((z<<16>>16<<2)+4|0)|0;Z=z}else{V=B;W=b[y+168>>1]|0;X=63}}while(0);if((X|0)==63){X=0;Y=mk(V,(W<<16>>16<<2)+4|0)|0;Z=W}c[Y+(Z<<16>>16<<2)>>2]=D;c[(c[I>>2]|0)+172>>2]=Y;y=(c[I>>2]|0)+168|0;b[y>>1]=(b[y>>1]|0)+1}D=ow(f,D)|0;}while((D|0)!=0)}T=vx(f,T)|0;}while((T|0)!=0)}T=c[(c[s>>2]|0)+132>>2]|0;Y=c[T>>2]|0;if((Y|0)!=0){Z=jk((c[T+4>>2]<<4)+16|0)|0;c[c[(c[u>>2]|0)+132>>2]>>2]=Z;T=Y|0;Y=c[T>>2]|0;if((Y|0)==0){_=0}else{W=f|0;V=R;R=Z;Z=0;U=T;T=Y;while(1){Y=c[(c[(c[U+4>>2]|0)+8>>2]|0)+164>>2]|0;D=Y;if((Y|0)==0){aa=Z;ba=R;ca=V}else{H=T;E=c[H>>2]&3;S=c[((E|0)==2?T:T-32|0)+28>>2]|0;C=c[((E|0)==3?T:T+32|0)+28>>2]|0;E=xF($w(W)|0)|0;y=S|0;B=xF($w(y)|0)|0;k=C|0;z=(E+8+B+(xF($w(k)|0)|0)|0)>999;B=$w(W)|0;if(z){z=$w(k)|0;k=$w(y)|0;y=(c[H>>2]|0)>>>4;nb(175272,133608,(t=i,i=i+32|0,c[t>>2]=B,c[t+8>>2]=z,c[t+16>>2]=k,c[t+24>>2]=y,t)|0)|0;i=t}else{y=c[(c[C+8>>2]|0)+120>>2]|0;C=c[(c[S+8>>2]|0)+120>>2]|0;S=(c[H>>2]|0)>>>4;nb(175272,131488,(t=i,i=i+32|0,c[t>>2]=B,c[t+8>>2]=y,c[t+16>>2]=C,c[t+24>>2]=S,t)|0)|0;i=t}S=Ax(m,175272,1)|0;Wx(S|0,81280,304,1)|0;C=jk(32)|0;y=S+8|0;c[(c[y>>2]|0)+112>>2]=C;C=kk(e[(c[u>>2]|0)+168>>1]<<3)|0;c[(c[y>>2]|0)+132>>2]=C;c[(c[y>>2]|0)+120>>2]=V;if(S>>>0>D>>>0){da=uw(m,D,S,0,1)|0}else{da=uw(m,S,D,0,1)|0}Wx(da|0,85888,176,1)|0;D=da+8|0;h[(c[D>>2]|0)+136>>3]=+h[(c[(c[U>>2]|0)+8>>2]|0)+136>>3];h[(c[D>>2]|0)+128>>3]=+h[(c[(c[U>>2]|0)+8>>2]|0)+128>>3];C=c[U>>2]|0;B=c[D>>2]|0;H=b[B+168>>1]|0;k=c[B+172>>2]|0;if((k|0)==0){ea=kk((H<<16>>16<<2)+4|0)|0}else{ea=mk(k,(H<<16>>16<<2)+4|0)|0}c[ea+(H<<16>>16<<2)>>2]=C;c[(c[D>>2]|0)+172>>2]=ea;C=(c[D>>2]|0)+168|0;b[C>>1]=(b[C>>1]|0)+1;C=(c[(c[y>>2]|0)+112>>2]|0)+4|0;c[C>>2]=(c[C>>2]|0)+1;C=Y+8|0;Y=(c[(c[C>>2]|0)+112>>2]|0)+4|0;c[Y>>2]=(c[Y>>2]|0)+1;Y=c[(c[y>>2]|0)+112>>2]|0;c[Y>>2]=(c[Y>>2]|0)+1;Y=c[(c[C>>2]|0)+112>>2]|0;c[Y>>2]=(c[Y>>2]|0)+1;c[R+4>>2]=S;h[R+8>>3]=+h[U+8>>3];c[R>>2]=da;aa=Z+1|0;ba=R+16|0;ca=V+1|0}S=U+16|0;Y=c[S>>2]|0;if((Y|0)==0){_=aa;break}else{V=ca;R=ba;Z=aa;U=S;T=Y}}}c[(c[(c[u>>2]|0)+132>>2]|0)+4>>2]=_}_=Ry(m,n,p)|0;T=c[_>>2]|0;c:do{if((T|0)!=0){U=g|0;aa=_;Z=T;d:while(1){aa=aa+4|0;lz(Z,q);ba=ux(Z)|0;if((ba|0)!=0){R=ba;do{ba=R+8|0;ca=c[ba>>2]|0;V=c[ca+212>>2]|0;do{if((V|0)==0){if((c[(c[ca+112>>2]|0)+8>>2]|0)!=0){break}Gx(Z,R|0)|0}else{da=V;ea=c[(c[ca+112>>2]|0)+4>>2]|0;if((ea|0)==0){fa=V+8|0}else{W=jk((ea<<4)+16|0)|0;Y=W;S=c[c[(c[ba>>2]|0)+112>>2]>>2]|0;C=jk((S*24|0)+24|0)|0;y=C;D=rw(Z,R)|0;if((D|0)==0){ga=0}else{H=D;D=0;while(1){k=c[H>>2]&3;B=c[((k|0)==2?H:H-32|0)+28>>2]|0;if((B|0)==(R|0)){ha=c[((k|0)==3?H:H+32|0)+28>>2]|0}else{ha=B}B=c[(c[ha+8>>2]|0)+132>>2]|0;k=c[(c[ba>>2]|0)+132>>2]|0;L=+h[B>>3]- +h[k>>3];N=+h[B+8>>3]- +h[k+8>>3];c[y+(D*24|0)>>2]=H;h[y+(D*24|0)+8>>3]=+$(+N,+L);h[y+(D*24|0)+16>>3]=L*L+N*N;k=D+1|0;B=sw(Z,H,R)|0;if((B|0)==0){ga=k;break}else{H=B;D=k}}}if((ga|0)!=(S|0)){X=95;break d}Jb(C|0,S|0,24,16);do{if((S|0)>1){D=S-1|0;if((D|0)>0){ia=0}else{break}while(1){H=y+(ia*24|0)+8|0;N=+h[H>>3];k=ia+1|0;do{if((k|0)<(S|0)){B=k;while(1){z=B+1|0;if(+h[y+(B*24|0)+8>>3]!=N){ja=B;break}if((z|0)<(S|0)){B=z}else{ja=z;break}}if((ja|0)==(k|0)){ka=k;break}if((ja|0)==(S|0)){la=3.141592653589793}else{la=+h[y+(ja*24|0)+8>>3]}L=(la-N)/+(ja-ia|0);K=L>.03490658503988659?.03490658503988659:L;if((ia|0)>=(ja|0)){ka=ia;break}h[H>>3]=N+0.0;if((k|0)<(ja|0)){ma=0.0;na=k}else{ka=ja;break}while(1){L=K+ma;B=y+(na*24|0)+8|0;h[B>>3]=+h[B>>3]+L;B=na+1|0;if((B|0)<(ja|0)){ma=L;na=B}else{ka=ja;break}}}else{ka=k}}while(0);if((ka|0)<(D|0)){ia=ka}else{break}}}}while(0);y=C;S=c[y>>2]|0;if((S|0)==0){oa=0}else{D=C+8|0;k=0;H=y;y=S;while(1){S=H+24|0;B=c[S>>2]|0;if((B|0)==0){pa=+h[D>>3]+6.283185307179586}else{pa=+h[H+32>>3]}z=y+8|0;E=c[z>>2]|0;A=b[E+168>>1]|0;l=A<<16>>16;x=c[y>>2]&3;w=c[((x|0)==2?y:y-32|0)+28>>2]|0;if((w|0)==(R|0)){qa=c[((x|0)==3?y:y+32|0)+28>>2]|0}else{qa=w}N=+h[H+8>>3];K=(pa-N)/+(A<<16>>16|0);L=K>.03490658503988659?.03490658503988659:K;if(qa>>>0>R>>>0){ra=1;sa=k;ta=L;ua=N}else{ra=-1;sa=k-1+l|0;ta=-0.0-L;ua=N+ +(l-1|0)*L}if(A<<16>>16>0){A=c[E+172>>2]|0;L=ua;E=sa;w=0;while(1){x=c[A>>2]|0;c[Y+(E<<4)>>2]=x;O=c[x>>2]&3;v=c[((O|0)==3?x:x+32|0)+28>>2]|0;if((c[(c[v+8>>2]|0)+164>>2]|0)==(R|0)){va=v}else{va=c[((O|0)==2?x:x-32|0)+28>>2]|0}c[Y+(E<<4)+4>>2]=va;h[Y+(E<<4)+8>>3]=L;x=w+1|0;if((x|0)<(b[(c[z>>2]|0)+168>>1]|0)){A=A+4|0;L=ta+L;E=E+ra|0;w=x}else{break}}wa=c[S>>2]|0}else{wa=B}w=l+k|0;if((wa|0)==0){oa=w;break}else{k=w;H=S;y=wa}}}if((oa|0)!=(ea|0)){X=125;break d}y=V+8|0;c[c[(c[y>>2]|0)+132>>2]>>2]=W;c[(c[(c[y>>2]|0)+132>>2]|0)+4>>2]=ea;eF(C);fa=y}fz(da,g);h[(c[ba>>2]|0)+32>>3]=+h[(c[(c[fa>>2]|0)+132>>2]|0)+24>>3];h[(c[ba>>2]|0)+40>>3]=+h[(c[(c[fa>>2]|0)+132>>2]|0)+32>>3];y=c[(c[fa>>2]|0)+132>>2]|0;L=+h[y+32>>3]*72.0;N=+h[y+24>>3]*72.0*.5;h[(c[ba>>2]|0)+88>>3]=N;h[(c[ba>>2]|0)+96>>3]=N;h[(c[ba>>2]|0)+80>>3]=L}}while(0);R=vx(Z,R)|0;}while((R|0)!=0)}if((Lw(Z)|0)>1){if((c[U>>2]|0)==(f|0)){ir(Z)|0}qz(Z,q)}Z=c[aa>>2]|0;if((Z|0)==0){break c}}if((X|0)==95){cc(159976,164056,643,170568)}else if((X|0)==125){cc(167512,164056,767,170704)}}}while(0);X=c[n>>2]|0;do{if((X|0)>1){if((c[p>>2]|0)==0){xa=0;ya=X}else{q=jk(X)|0;a[q]=1;xa=q;ya=c[n>>2]|0}c[g+40>>2]=xa;q=mv(ya,_,0,g+20|0)|0;if((xa|0)==0){za=q;break}eF(xa);za=q}else{if((X|0)!=1){za=0;break}$m(c[_>>2]|0);za=0}}while(0);X=c[n>>2]|0;n=(c[g>>2]|0)!=(f|0);xa=(X|0)!=0;do{if(xa){ya=c[(c[_>>2]|0)+8>>2]|0;ta=+h[ya+16>>3];if(ta<0.0){Aa=ta+-.5}else{Aa=ta+.5}p=~~Aa;ta=+h[ya+24>>3];if(ta<0.0){Ba=ta+-.5}else{Ba=ta+.5}q=~~Ba;ta=+h[ya+32>>3];if(ta<0.0){Ca=ta+-.5}else{Ca=ta+.5}fa=~~Ca;ta=+h[ya+40>>3];if(ta<0.0){Da=ta+-.5}else{Da=ta+.5}ya=~~Da;if((X|0)<=1){Ea=0;Fa=ya;Ga=fa;Ha=q;Ia=p;break}oa=c[za>>2]|0;wa=c[za+4>>2]|0;ra=oa+p|0;p=wa+q|0;q=oa+fa|0;fa=wa+ya|0;ya=_+4|0;wa=c[ya>>2]|0;if((wa|0)==0){Ea=0;Fa=fa;Ga=q;Ha=p;Ia=ra;break}else{Ja=ra;Ka=p;La=q;Ma=fa;Na=za;Oa=ya;Pa=wa}while(1){wa=Na+8|0;ya=c[Pa+8>>2]|0;ta=+h[ya+16>>3];if(ta<0.0){Qa=ta+-.5}else{Qa=ta+.5}ta=+h[ya+24>>3];if(ta<0.0){Ra=ta+-.5}else{Ra=ta+.5}ta=+h[ya+32>>3];if(ta<0.0){Sa=ta+-.5}else{Sa=ta+.5}ta=+h[ya+40>>3];if(ta<0.0){Ta=ta+-.5}else{Ta=ta+.5}ya=c[wa>>2]|0;fa=c[Na+12>>2]|0;q=ya+~~Qa|0;p=fa+~~Ra|0;ra=ya+~~Sa|0;ya=fa+~~Ta|0;fa=(Ja|0)<(q|0)?Ja:q;q=(Ka|0)<(p|0)?Ka:p;p=(La|0)>(ra|0)?La:ra;ra=(Ma|0)>(ya|0)?Ma:ya;ya=Oa+4|0;oa=c[ya>>2]|0;if((oa|0)==0){Ea=0;Fa=ra;Ga=p;Ha=q;Ia=fa;break}else{Ja=fa;Ka=q;La=p;Ma=ra;Na=wa;Oa=ya;Pa=oa}}}else{oa=c[g+12>>2]|0;ya=f|0;wa=Em(ya,c[g+8>>2]|0,54,3)|0;Ea=1;Fa=Em(ya,oa,36,3)|0;Ga=wa;Ha=0;Ia=0}}while(0);g=c[s>>2]|0;Pa=c[g+12>>2]|0;do{if((Pa|0)==0){Ua=Ea;Va=Ga;Wa=Ia}else{Ta=+h[Pa+24>>3];if(Ta<0.0){Xa=Ta+-.5}else{Xa=Ta+.5}Oa=~~Xa+(Ia-Ga)|0;if((Oa|0)<=0){Ua=0;Va=Ga;Wa=Ia;break}Na=(Oa|0)/2|0;Ua=0;Va=Na+Ga|0;Wa=Ia-Na|0}}while(0);if(n&(Ua|0)==0){Ua=Em(r,c[53720]|0,8,0)|0;Za=Ua;_a=c[s>>2]|0}else{Za=0;_a=g}g=Za-Wa|0;Wa=~~(+h[_a+56>>3]+ +(Za-Ha|0));Ha=Za+Va+g|0;Va=~~(+(Fa|0)+(+h[_a+88>>3]+ +(Wa+Za|0)));do{if(xa){Za=c[_>>2]|0;if((Za|0)==0){break}else{$a=za;ab=_;bb=Za}while(1){Za=ab+4|0;if(($a|0)==0){cb=g;db=Wa;eb=0}else{cb=(c[$a>>2]|0)+g|0;db=(c[$a+4>>2]|0)+Wa|0;eb=$a+8|0}Xa=+(cb|0)/72.0;Ta=+(db|0)/72.0;_a=ux(bb)|0;if((_a|0)!=0){Fa=_a;do{_a=Fa+8|0;Ua=c[(c[_a>>2]|0)+132>>2]|0;h[Ua>>3]=Xa+ +h[Ua>>3];Ua=(c[(c[_a>>2]|0)+132>>2]|0)+8|0;h[Ua>>3]=Ta+ +h[Ua>>3];Fa=vx(bb,Fa)|0;}while((Fa|0)!=0)}Fa=c[Za>>2]|0;if((Fa|0)==0){break}else{$a=eb;ab=Za;bb=Fa}}}}while(0);bb=c[(c[u>>2]|0)+132>>2]|0;vF(bb+8|0,0,16)|0;h[bb+24>>3]=+(Ha|0)/72.0;h[bb+32>>3]=+(Va|0)/72.0;eF(za);za=ux(m)|0;if((za|0)!=0){Va=za;do{za=Va+8|0;bb=c[za>>2]|0;Ha=c[bb+212>>2]|0;do{if((Ha|0)==0){ab=c[(c[bb+112>>2]|0)+8>>2]|0;if((ab|0)==0){break}eb=ab+8|0;h[c[(c[eb>>2]|0)+132>>2]>>3]=+h[c[bb+132>>2]>>3];h[(c[(c[eb>>2]|0)+132>>2]|0)+8>>3]=+h[(c[(c[za>>2]|0)+132>>2]|0)+8>>3]}else{eb=Ha+8|0;h[(c[(c[eb>>2]|0)+132>>2]|0)+8>>3]=+h[c[bb+132>>2]>>3]- +h[bb+32>>3]*.5;ab=c[za>>2]|0;h[(c[(c[eb>>2]|0)+132>>2]|0)+16>>3]=+h[(c[ab+132>>2]|0)+8>>3]- +h[ab+40>>3]*.5;ab=c[(c[eb>>2]|0)+132>>2]|0;h[ab+24>>3]=+h[ab+8>>3]+ +h[(c[za>>2]|0)+32>>3];ab=c[(c[eb>>2]|0)+132>>2]|0;h[ab+32>>3]=+h[ab+16>>3]+ +h[(c[za>>2]|0)+40>>3]}}while(0);Va=vx(m,Va)|0;}while((Va|0)!=0)}Va=(c[(c[s>>2]|0)+132>>2]|0)+8|0;s=(c[(c[u>>2]|0)+132>>2]|0)+8|0;c[Va>>2]=c[s>>2];c[Va+4>>2]=c[s+4>>2];c[Va+8>>2]=c[s+8>>2];c[Va+12>>2]=c[s+12>>2];c[Va+16>>2]=c[s+16>>2];c[Va+20>>2]=c[s+20>>2];c[Va+24>>2]=c[s+24>>2];c[Va+28>>2]=c[s+28>>2];s=c[_>>2]|0;if((s|0)!=0){Va=_;za=s;do{Va=Va+4|0;eF(c[(c[za+8>>2]|0)+132>>2]|0);Xx(za|0,92056)|0;za=c[Va>>2]|0;}while((za|0)!=0)}za=c[(c[u>>2]|0)+132>>2]|0;Va=c[za>>2]|0;if((Va|0)==0){fb=za}else{eF(Va);fb=c[(c[u>>2]|0)+132>>2]|0}eF(fb);Xx(r,92056)|0;r=ux(m)|0;if((r|0)!=0){fb=r;while(1){r=vx(m,fb)|0;u=mw(m,fb)|0;if((u|0)!=0){Va=u;do{eF(c[(c[Va+8>>2]|0)+172>>2]|0);Xx(Va|0,85888)|0;Va=ow(m,Va)|0;}while((Va|0)!=0)}Va=fb+8|0;eF(c[(c[Va>>2]|0)+112>>2]|0);eF(c[(c[Va>>2]|0)+132>>2]|0);Xx(fb|0,81280)|0;if((r|0)==0){break}else{fb=r}}}Kw(m)|0;eF(_);if((a[213992]|0)==0){i=j;return}_=c[o>>2]|0;m=$w(f|0)|0;gc(_|0,97616,(t=i,i=i+8|0,c[t>>2]=m,t)|0)|0;i=t;i=j;return}function gz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0;d=a+8|0;e=c[d>>2]|0;f=c[e+132>>2]|0;g=+h[f+8>>3];i=+h[f+16>>3];f=(a|0)!=(b|0);if(f){j=ux(a)|0;if((j|0)!=0){k=j;do{j=k+8|0;l=c[j>>2]|0;if((c[l+212>>2]|0)==(a|0)){m=c[l+132>>2]|0;h[m>>3]=g+ +h[m>>3];m=(c[(c[j>>2]|0)+132>>2]|0)+8|0;h[m>>3]=i+ +h[m>>3]}k=vx(a,k)|0;}while((k|0)!=0)}n=c[d>>2]|0}else{n=e}if((c[n+172>>2]|0)<1){return}if(f){f=1;e=n;while(1){k=c[(c[e+176>>2]|0)+(f<<2)>>2]|0;m=c[(c[k+8>>2]|0)+132>>2]|0;j=m+8|0;l=m+16|0;o=m+24|0;p=m+32|0;q=i+ +h[l>>3];r=g+ +h[o>>3];s=i+ +h[p>>3];h[j>>3]=g+ +h[j>>3];h[l>>3]=q;h[o>>3]=r;h[p>>3]=s;gz(k,b);k=c[d>>2]|0;if((f|0)<(c[k+172>>2]|0)){f=f+1|0;e=k}else{break}}return}else{e=1;f=n;while(1){gz(c[(c[f+176>>2]|0)+(e<<2)>>2]|0,a);n=c[d>>2]|0;if((e|0)<(c[n+172>>2]|0)){e=e+1|0;f=n}else{break}}return}}function hz(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0.0,i=0,j=0;b=a+8|0;a=c[b>>2]|0;d=c[a+132>>2]|0;e=+h[d+16>>3]*72.0;f=+h[d+24>>3]*72.0;g=+h[d+32>>3]*72.0;h[a+16>>3]=+h[d+8>>3]*72.0;h[a+24>>3]=e;h[a+32>>3]=f;h[a+40>>3]=g;a=c[b>>2]|0;if((c[a+172>>2]|0)<1){return}else{i=1;j=a}while(1){hz(c[(c[j+176>>2]|0)+(i<<2)>>2]|0);a=c[b>>2]|0;if((i|0)<(c[a+172>>2]|0)){i=i+1|0;j=a}else{break}}return}function iz(a){a=a|0;var d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=i;e=1;f=0;g=i;i=i+168|0;c[g>>2]=0;while(1)switch(e|0){case 1:j=+h[21580];k=+sa(2,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;h[21580]=k;la(16,a|0,2);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;l=ma(12,56)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;m=a+8|0;c[(c[m>>2]|0)+132>>2]=l;l=a|0;n=Aa(56,a|0,0,116440,0)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;o=Aa(52,l|0,n|0,2,2)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;b[(c[m>>2]|0)+168>>1]=o;o=(c[m>>2]|0)+168|0;n=b[o>>1]|0;l=(n&65535)>>>0<10>>>0?n:10;b[o>>1]=l;c[53568]=l&65535;Ba(100,a|0,0,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;ka(90,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;ka(92,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;p=BF(177912,e,g)|0;e=14;break;case 14:if((p|0)==0){e=2;break}else{e=13;break};case 2:ka(132,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;ka(86,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;q=b[(c[m>>2]|0)+128>>1]|0;if((q&14)==0){e=12;break}else{e=3;break};case 3:r=q&14;if((r|0)==2){e=10;break}else if((r|0)==12){e=4;break}else{s=q;e=6;break};case 4:l=pa(58,a|0,12,10)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;if((l|0)==0){e=9;break}else{e=5;break};case 5:c[53566]=2;s=b[(c[m>>2]|0)+128>>1]|0;e=6;break;case 6:if((s&1)==0){e=8;break}else{e=7;break};case 7:pa(16,0,109112,(l=i,i=i+1|0,i=i+7&-8,c[l>>2]=0,l)|0)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;i=l;e=9;break;case 8:wa(50,a|0,r|0)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;e=9;break;case 9:c[53566]=0;e=10;break;case 10:if((c[53522]|0)<1){e=11;break}else{e=12;break};case 11:wa(50,a|0,2)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;e=12;break;case 12:ka(44,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;h[21580]=j;e=13;break;case 13:i=d;return;case-1:if((f|0)==1){p=v;e=14}u=v=0;break}}function jz(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0,f=0.0,g=0.0;c=+h[a+8>>3];d=+h[b+8>>3];do{if(c>d){e=1}else{if(c<d){e=-1;break}f=+h[a+16>>3];g=+h[b+16>>3];if(f>g){e=1;break}e=(f<g)<<31>>31}}while(0);return e|0}function kz(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0.0;b=i;d=c[6536]|0;c[44182]=c[d>>2];c[44183]=c[d+4>>2];c[44185]=c[d+8>>2];c[44187]=c[d+12>>2];h[22099]=0.0;h[22094]=+h[d+16>>3];h[22095]=+h[d+24>>3];d=a|0;c[44186]=Em(d,Wv(a,0,121720,0)|0,600,0)|0;e=+Fm(d,Wv(a,0,158192,0)|0,.3,0.0);h[22096]=e;h[(c[6536]|0)+32>>3]=e;e=+h[(c[6536]|0)+40>>3];if(e==-1.0){f=+Fm(d,Wv(a,0,127856,0)|0,-1.0,0.0)}else{f=e}h[22097]=f;c[44184]=1;d=vt(a,2,176736)|0;c[44196]=d;if((d|0)==0){Fv(0,115224,(d=i,i=i+1|0,i=i+7&-8,c[d>>2]=0,d)|0)|0;i=d;c[44184]=2}c[44212]=(da(c[44186]|0,c[44187]|0)|0)/100|0;f=+h[22096];h[22101]=f*f;if((c[44182]|0)==0){i=b;return}e=+h[22099];if(e>0.0){g=e}else{e=f*3.0;h[22099]=e;g=e}h[22100]=g*g;i=b;return}function lz(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0.0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,S=0.0,U=0.0,X=0.0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0.0,da=0.0,ea=0,fa=0,ga=0,ha=0,ia=0;e=b+8|0;f=c[c[(c[e>>2]|0)+132>>2]>>2]|0;g=+h[22097];if(g==-1.0){i=Lw(b)|0;j=+h[22095]*+h[22096]*+T(+(i|0))/5.0;h[22097]=j;k=1;l=j}else{k=0;l=g}i=c[44186]|0;h[d+8>>3]=l*+(i-(c[44212]|0)|0)/+(i|0);h[d+16>>3]=+h[22096];h[d+24>>3]=+h[22094];i=d|0;c[i>>2]=(c[44186]|0)-(c[44212]|0);m=c[44185]|0;n=c[44212]|0;do{if((m|0)>-1){if((m|0)<=(n|0)){c[44213]=m;c[d+32>>2]=0;break}if((m|0)>(c[44186]|0)){break}c[44213]=n;c[d+32>>2]=m-n}else{c[44213]=n;c[d+32>>2]=c[i>>2]}}while(0);i=Lw(b)|0;d=i-(c[(c[(c[e>>2]|0)+132>>2]|0)+4>>2]|0)|0;e=ux(b)|0;if((e|0)==0){o=0;p=0;q=0;r=0;s=0}else{i=0;n=0;m=0;t=0;u=0;v=e;while(1){e=c[v+8>>2]|0;if((a[e+119|0]|0)==0){w=u;x=t;y=m;z=n;A=i}else{B=c[e+132>>2]|0;l=+h[B>>3];if((u|0)==0){e=~~l;C=~~+h[B+8>>3];D=C;E=e;F=C;G=e}else{g=+(i|0);j=+h[B+8>>3];H=+(n|0);I=+(m|0);J=+(t|0);D=~~(j>J?j:J);E=~~(l>I?l:I);F=~~(j<H?j:H);G=~~(l<g?l:g)}w=u+1|0;x=D;y=E;z=F;A=G}B=vx(b,v)|0;if((B|0)==0){o=A;p=z;q=y;r=x;s=w;break}else{i=A;n=z;m=y;t=x;u=w;v=B}}}g=+h[22096]*(+T(+(d|0))+1.0)*.5*1.2;h[22103]=g;h[22102]=g;do{if((s|0)==1){K=+(o|0);L=+(p|0);M=g;N=g}else{if((s|0)<=1){K=0.0;L=0.0;M=g;N=g;break}l=+(o+q|0)*.5;H=+(p+r|0)*.5;j=+(q-o|0)*1.2;I=+(r-p|0)*1.2;J=g*g*4.0;O=I*j/J;do{if(O<1.0){if(O>0.0){P=+T(O)*2.0;Q=j/P;h[22102]=Q;S=I/P;h[22103]=S;U=S;X=Q;break}if(j>0.0){Q=j*.5;h[22102]=Q;S=J/j*.5;h[22103]=S;U=S;X=Q;break}if(I<=0.0){U=g;X=g;break}Q=J/I*.5;h[22102]=Q;S=I*.5;h[22103]=S;U=S;X=Q}else{Q=j*.5;h[22102]=Q;S=I*.5;h[22103]=S;U=S;X=Q}}while(0);I=+$(+U,+X);j=X/+V(I);h[22102]=j;J=U/+W(I);h[22103]=J;K=l;L=H;M=j;N=J}}while(0);h[22104]=M*M;h[22105]=N*N;if((c[44196]|0)==2){Y=c[44184]|0}else{p=fb()|0;Y=(zc(0)|0)^p}dc(Y|0);a:do{if((f|0)==0){Y=ux(b)|0;p=(Y|0)==0;if((s|0)==0){if(p){break}else{Z=Y}while(1){N=+h[22102];M=N*(+wn()*2.0+-1.0);r=Z+8|0;h[c[(c[r>>2]|0)+132>>2]>>3]=M;M=+h[22103];N=M*(+wn()*2.0+-1.0);h[(c[(c[r>>2]|0)+132>>2]|0)+8>>3]=N;Z=vx(b,Z)|0;if((Z|0)==0){break a}}}if(p){break}else{_=Y}do{r=_+8|0;o=c[r>>2]|0;if((a[o+119|0]|0)==0){H=+h[22102];l=H*(+wn()*2.0+-1.0);h[c[(c[r>>2]|0)+132>>2]>>3]=l;l=+h[22103];H=l*(+wn()*2.0+-1.0);h[(c[(c[r>>2]|0)+132>>2]|0)+8>>3]=H}else{q=c[o+132>>2]|0;h[q>>3]=+h[q>>3]-K;q=(c[(c[r>>2]|0)+132>>2]|0)+8|0;h[q>>3]=+h[q>>3]-L}_=vx(b,_)|0;}while((_|0)!=0)}else{if((c[f>>2]|0)!=0){Y=f;do{p=Y+8|0;H=K+ +h[22102]*+V(+h[p>>3]);q=(c[Y+4>>2]|0)+8|0;h[c[(c[q>>2]|0)+132>>2]>>3]=H;H=L+ +h[22103]*+W(+h[p>>3]);h[(c[(c[q>>2]|0)+132>>2]|0)+8>>3]=H;a[(c[q>>2]|0)+119|0]=1;Y=Y+16|0;}while((c[Y>>2]|0)!=0)}Y=ux(b)|0;if((Y|0)==0){break}H=K*.1;l=L*.1;q=Y;do{Y=q+8|0;p=c[Y>>2]|0;if((c[(c[p+112>>2]|0)+8>>2]|0)==0){if((c[p+212>>2]|0)!=0){aa=38}}else{aa=38}do{if((aa|0)==38){aa=0;if((a[p+119|0]|0)!=0){r=c[p+132>>2]|0;h[r>>3]=+h[r>>3]-K;r=(c[(c[Y>>2]|0)+132>>2]|0)+8|0;h[r>>3]=+h[r>>3]-L;break}r=rw(b,q)|0;do{if((r|0)==0){aa=51}else{N=0.0;M=0.0;o=0;d=r;while(1){v=c[d>>2]&3;w=c[((v|0)==2?d:d-32|0)+28>>2]|0;u=c[((v|0)==3?d:d+32|0)+28>>2]|0;do{if((w|0)==(u|0)){ba=o;ca=M;da=N}else{v=c[((w|0)==(q|0)?u:w)+8>>2]|0;if((a[v+119|0]|0)==0){ba=o;ca=M;da=N;break}if((o|0)==0){x=c[v+132>>2]|0;ba=1;ca=+h[x>>3];da=+h[x+8>>3];break}else{U=+(o|0);x=c[v+132>>2]|0;v=o+1|0;X=+(v|0);ba=v;ca=(M*U+ +h[x>>3])/X;da=(U*N+ +h[x+8>>3])/X;break}}}while(0);w=sw(b,d,q)|0;if((w|0)==0){break}else{N=da;M=ca;o=ba;d=w}}if((ba|0)>1){h[c[(c[Y>>2]|0)+132>>2]>>3]=ca;h[(c[(c[Y>>2]|0)+132>>2]|0)+8>>3]=da;break}if((ba|0)!=1){aa=51;break}h[c[(c[Y>>2]|0)+132>>2]>>3]=H+ca*.98;h[(c[(c[Y>>2]|0)+132>>2]|0)+8>>3]=l+da*.9}}while(0);if((aa|0)==51){aa=0;M=+wn()*6.283185307179586;N=+wn()*.9;X=N*+h[22102]*+V(M);h[c[(c[Y>>2]|0)+132>>2]>>3]=X;X=N*+h[22103]*+W(M);h[(c[(c[Y>>2]|0)+132>>2]|0)+8>>3]=X}a[(c[Y>>2]|0)+119|0]=1}}while(0);q=vx(b,q)|0;}while((q|0)!=0)}}while(0);do{if((c[44182]|0)==0){aa=c[44213]|0;if((aa|0)>0){ea=0;fa=aa}else{break}while(1){aa=c[44186]|0;da=+h[22097]*+(aa-ea|0)/+(aa|0);if(da>0.0){aa=ux(b)|0;if((aa|0)!=0){ba=aa;do{aa=ba+8|0;h[(c[(c[aa>>2]|0)+112>>2]|0)+24>>3]=0.0;h[(c[(c[aa>>2]|0)+112>>2]|0)+16>>3]=0.0;ba=vx(b,ba)|0;}while((ba|0)!=0)}ba=ux(b)|0;if((ba|0)!=0){aa=ba;do{ba=vx(b,aa)|0;if((ba|0)!=0){_=aa+8|0;Z=ba;do{ba=c[(c[Z+8>>2]|0)+132>>2]|0;s=c[(c[_>>2]|0)+132>>2]|0;ca=+h[ba>>3]- +h[s>>3];l=+h[ba+8>>3]- +h[s+8>>3];oz(aa,Z,ca,l,ca*ca+l*l);Z=vx(b,Z)|0;}while((Z|0)!=0)}Z=mw(b,aa)|0;if((Z|0)!=0){_=Z;do{Z=c[((c[_>>2]&3|0)==2?_:_-32|0)+28>>2]|0;if((aa|0)!=(Z|0)){mz(aa,Z,_)}_=ow(b,_)|0;}while((_|0)!=0)}aa=vx(b,aa)|0;}while((aa|0)!=0)}nz(b,da,f);ga=c[44213]|0}else{ga=fa}aa=ea+1|0;if((aa|0)<(ga|0)){ea=aa;fa=ga}else{break}}}else{aa=Wy(Lw(b)|0)|0;Xy(aa,Lw(b)|0);_=c[44213]|0;if((_|0)>0){Z=0;s=_;while(1){_=c[44186]|0;l=+h[22097]*+(_-Z|0)/+(_|0);if(l>0.0){Yy(aa);_=ux(b)|0;if((_|0)!=0){ba=_;do{_=ba+8|0;h[(c[(c[_>>2]|0)+112>>2]|0)+24>>3]=0.0;h[(c[(c[_>>2]|0)+112>>2]|0)+16>>3]=0.0;q=c[(c[_>>2]|0)+132>>2]|0;ca=+h[22099];_=~~+R(+h[q>>3]/ca);_y(aa,_,~~+R(+h[q+8>>3]/ca),ba);ba=vx(b,ba)|0;}while((ba|0)!=0)}ba=ux(b)|0;if((ba|0)!=0){q=ba;do{ba=mw(b,q)|0;if((ba|0)!=0){_=ba;do{ba=c[((c[_>>2]&3|0)==2?_:_-32|0)+28>>2]|0;if((q|0)!=(ba|0)){mz(q,ba,_)}_=ow(b,_)|0;}while((_|0)!=0)}q=vx(b,q)|0;}while((q|0)!=0)}$y(aa,8);nz(b,l,f);ha=c[44213]|0}else{ha=s}q=Z+1|0;if((q|0)<(ha|0)){Z=q;s=ha}else{break}}}Zy(aa)}}while(0);do{if(K!=0.0|L!=0.0){ha=ux(b)|0;if((ha|0)==0){break}else{ia=ha}do{ha=ia+8|0;f=c[(c[ha>>2]|0)+132>>2]|0;h[f>>3]=K+ +h[f>>3];f=(c[(c[ha>>2]|0)+132>>2]|0)+8|0;h[f>>3]=L+ +h[f>>3];ia=vx(b,ia)|0;}while((ia|0)!=0)}}while(0);if((k|0)==0){return}h[22097]=-1.0;return}function mz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;e=b+8|0;b=c[(c[e>>2]|0)+132>>2]|0;f=a+8|0;a=c[(c[f>>2]|0)+132>>2]|0;g=+h[b>>3]- +h[a>>3];i=+h[b+8>>3]- +h[a+8>>3];j=g*g+i*i;if(j==0.0){while(1){k=+(5-((yb()|0)%10|0)|0);l=+(5-((yb()|0)%10|0)|0);m=k*k+l*l;if(m!=0.0){n=l;o=k;p=m;break}}}else{n=i;o=g;p=j}j=+T(p);a=c[d+8>>2]|0;p=+h[a+128>>3];if((c[44183]|0)==0){q=j*p/+h[a+136>>3]}else{q=p*(j- +h[a+136>>3])/j}j=o*q;a=(c[(c[e>>2]|0)+112>>2]|0)+16|0;h[a>>3]=+h[a>>3]-j;o=n*q;a=(c[(c[e>>2]|0)+112>>2]|0)+24|0;h[a>>3]=+h[a>>3]-o;a=(c[(c[f>>2]|0)+112>>2]|0)+16|0;h[a>>3]=j+ +h[a>>3];a=(c[(c[f>>2]|0)+112>>2]|0)+24|0;h[a>>3]=o+ +h[a>>3];return}function nz(b,d,e){b=b|0;d=+d;e=e|0;var f=0.0,g=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0;f=d*d;g=ux(b)|0;if((g|0)==0){return}if((e|0)==0){e=g;do{i=e+8|0;j=c[i>>2]|0;if((a[j+119|0]&2)==0){k=c[j+112>>2]|0;l=+h[k+16>>3];m=+h[k+24>>3];n=l*l+m*m;if(n<f){k=c[j+132>>2]|0;o=l+ +h[k>>3];p=m+ +h[k+8>>3];q=k}else{r=d/+T(n);k=c[j+132>>2]|0;o=l*r+ +h[k>>3];p=m*r+ +h[k+8>>3];q=k}h[q>>3]=o;h[(c[(c[i>>2]|0)+132>>2]|0)+8>>3]=p}e=vx(b,e)|0;}while((e|0)!=0);return}else{s=g}do{g=s+8|0;e=c[g>>2]|0;a:do{if((a[e+119|0]&2)==0){q=c[e+112>>2]|0;p=+h[q+16>>3];o=+h[q+24>>3];r=p*p+o*o;if(r<f){i=c[e+132>>2]|0;t=p+ +h[i>>3];u=o+ +h[i+8>>3];v=i}else{m=d/+T(r);i=c[e+132>>2]|0;t=p*m+ +h[i>>3];u=o*m+ +h[i+8>>3];v=i}m=+T(t*t/+h[22104]+u*u/+h[22105]);do{if((c[q+8>>2]|0)==0){if((c[e+212>>2]|0)!=0){break}h[v>>3]=t/m;h[(c[(c[g>>2]|0)+132>>2]|0)+8>>3]=u/m;break a}}while(0);if(m<1.0){h[v>>3]=t;h[(c[(c[g>>2]|0)+132>>2]|0)+8>>3]=u;break}else{h[v>>3]=t*.95/m;h[(c[(c[g>>2]|0)+132>>2]|0)+8>>3]=u*.95/m;break}}}while(0);s=vx(b,s)|0;}while((s|0)!=0);return}function oz(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=+e;f=+f;var g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0;if(f==0.0){while(1){g=+(5-((yb()|0)%10|0)|0);i=+(5-((yb()|0)%10|0)|0);j=g*g+i*i;if(j!=0.0){k=i;l=j;m=g;break}}}else{k=e;l=f;m=d}if((c[44183]|0)==0){n=+h[22101]/l}else{d=+T(l);n=+h[22101]/(l*d)}o=a+8|0;a=c[o>>2]|0;do{if((c[(c[a+112>>2]|0)+8>>2]|0)==0){if((c[a+212>>2]|0)!=0){p=n;break}q=c[b+8>>2]|0;if((c[(c[q+112>>2]|0)+8>>2]|0)!=0){p=n;break}if((c[q+212>>2]|0)!=0){p=n;break}p=n*10.0}else{p=n}}while(0);n=m*p;a=b+8|0;b=(c[(c[a>>2]|0)+112>>2]|0)+16|0;h[b>>3]=n+ +h[b>>3];m=k*p;b=(c[(c[a>>2]|0)+112>>2]|0)+24|0;h[b>>3]=m+ +h[b>>3];b=(c[(c[o>>2]|0)+112>>2]|0)+16|0;h[b>>3]=+h[b>>3]-n;b=(c[(c[o>>2]|0)+112>>2]|0)+24|0;h[b>>3]=+h[b>>3]-m;return}function pz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0;a=c[b+8>>2]|0;e=c[b>>2]|0;f=c[b+4>>2]|0;b=(a|0)==0;if(!b){g=a;do{i=g|0;j=a;do{if((g|0)!=(j|0)){k=c[i>>2]|0;l=c[j>>2]|0;m=c[(c[l+8>>2]|0)+132>>2]|0;n=c[(c[k+8>>2]|0)+132>>2]|0;o=+h[m>>3]- +h[n>>3];p=+h[m+8>>3]- +h[n+8>>3];oz(k,l,o,p,o*o+p*p)}j=c[j+4>>2]|0;}while((j|0)!=0);g=c[g+4>>2]|0;}while((g|0)!=0)}g=e-1|0;j=f-1|0;i=az(d,g,j)|0;if(!((i|0)==0|b)){l=i+8|0;i=a;do{k=c[i>>2]|0;n=c[l>>2]|0;if((n|0)!=0){m=k+8|0;q=n;do{n=c[q>>2]|0;r=c[(c[n+8>>2]|0)+132>>2]|0;s=c[(c[m>>2]|0)+132>>2]|0;p=+h[r>>3]- +h[s>>3];o=+h[r+8>>3]- +h[s+8>>3];t=p*p+o*o;if(t<+h[22100]){oz(k,n,p,o,t)}q=c[q+4>>2]|0;}while((q|0)!=0)}i=c[i+4>>2]|0;}while((i|0)!=0)}i=az(d,g,f)|0;if(!((i|0)==0|b)){l=i+8|0;i=a;do{q=c[i>>2]|0;k=c[l>>2]|0;if((k|0)!=0){m=q+8|0;n=k;do{k=c[n>>2]|0;s=c[(c[k+8>>2]|0)+132>>2]|0;r=c[(c[m>>2]|0)+132>>2]|0;t=+h[s>>3]- +h[r>>3];o=+h[s+8>>3]- +h[r+8>>3];p=t*t+o*o;if(p<+h[22100]){oz(q,k,t,o,p)}n=c[n+4>>2]|0;}while((n|0)!=0)}i=c[i+4>>2]|0;}while((i|0)!=0)}i=f+1|0;l=az(d,g,i)|0;if(!((l|0)==0|b)){g=l+8|0;l=a;do{n=c[l>>2]|0;q=c[g>>2]|0;if((q|0)!=0){m=n+8|0;k=q;do{q=c[k>>2]|0;r=c[(c[q+8>>2]|0)+132>>2]|0;s=c[(c[m>>2]|0)+132>>2]|0;p=+h[r>>3]- +h[s>>3];o=+h[r+8>>3]- +h[s+8>>3];t=p*p+o*o;if(t<+h[22100]){oz(n,q,p,o,t)}k=c[k+4>>2]|0;}while((k|0)!=0)}l=c[l+4>>2]|0;}while((l|0)!=0)}l=az(d,e,j)|0;if(!((l|0)==0|b)){g=l+8|0;l=a;do{k=c[l>>2]|0;n=c[g>>2]|0;if((n|0)!=0){m=k+8|0;q=n;do{n=c[q>>2]|0;s=c[(c[n+8>>2]|0)+132>>2]|0;r=c[(c[m>>2]|0)+132>>2]|0;t=+h[s>>3]- +h[r>>3];o=+h[s+8>>3]- +h[r+8>>3];p=t*t+o*o;if(p<+h[22100]){oz(k,n,t,o,p)}q=c[q+4>>2]|0;}while((q|0)!=0)}l=c[l+4>>2]|0;}while((l|0)!=0)}l=az(d,e,i)|0;if(!((l|0)==0|b)){g=l+8|0;l=a;do{q=c[l>>2]|0;k=c[g>>2]|0;if((k|0)!=0){m=q+8|0;n=k;do{k=c[n>>2]|0;r=c[(c[k+8>>2]|0)+132>>2]|0;s=c[(c[m>>2]|0)+132>>2]|0;p=+h[r>>3]- +h[s>>3];o=+h[r+8>>3]- +h[s+8>>3];t=p*p+o*o;if(t<+h[22100]){oz(q,k,p,o,t)}n=c[n+4>>2]|0;}while((n|0)!=0)}l=c[l+4>>2]|0;}while((l|0)!=0)}l=e+1|0;e=az(d,l,j)|0;if(!((e|0)==0|b)){j=e+8|0;e=a;do{g=c[e>>2]|0;n=c[j>>2]|0;if((n|0)!=0){q=g+8|0;m=n;do{n=c[m>>2]|0;k=c[(c[n+8>>2]|0)+132>>2]|0;s=c[(c[q>>2]|0)+132>>2]|0;t=+h[k>>3]- +h[s>>3];o=+h[k+8>>3]- +h[s+8>>3];p=t*t+o*o;if(p<+h[22100]){oz(g,n,t,o,p)}m=c[m+4>>2]|0;}while((m|0)!=0)}e=c[e+4>>2]|0;}while((e|0)!=0)}e=az(d,l,f)|0;if(!((e|0)==0|b)){f=e+8|0;e=a;do{j=c[e>>2]|0;m=c[f>>2]|0;if((m|0)!=0){g=j+8|0;q=m;do{m=c[q>>2]|0;n=c[(c[m+8>>2]|0)+132>>2]|0;s=c[(c[g>>2]|0)+132>>2]|0;p=+h[n>>3]- +h[s>>3];o=+h[n+8>>3]- +h[s+8>>3];t=p*p+o*o;if(t<+h[22100]){oz(j,m,p,o,t)}q=c[q+4>>2]|0;}while((q|0)!=0)}e=c[e+4>>2]|0;}while((e|0)!=0)}e=az(d,l,i)|0;if((e|0)==0|b){return 0}b=e+8|0;e=a;do{a=c[e>>2]|0;i=c[b>>2]|0;if((i|0)!=0){l=a+8|0;d=i;do{i=c[d>>2]|0;f=c[(c[i+8>>2]|0)+132>>2]|0;q=c[(c[l>>2]|0)+132>>2]|0;t=+h[f>>3]- +h[q>>3];o=+h[f+8>>3]- +h[q+8>>3];p=t*t+o*o;if(p<+h[22100]){oz(a,i,t,o,p)}d=c[d+4>>2]|0;}while((d|0)!=0)}e=c[e+4>>2]|0;}while((e|0)!=0);return 0}function qz(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0,L=0.0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,ea=0.0,fa=0,ga=0,ha=0.0,ia=0.0,ja=0.0,ka=0,la=0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0;e=i;i=i+16|0;f=e|0;j=ew(b|0,124936)|0;if((a[213992]|0)!=0){Ma(114144,8,1,c[o>>2]|0)|0}if((j|0)==0){k=5}else{if((a[j]|0)==0){k=5}else{l=j}}if((k|0)==5){l=107192}j=gb(l|0,58)|0;do{if((j|0)==0){m=l;n=0}else{if((j|0)!=(l|0)){if(((a[l]|0)-48|0)>>>0>=10>>>0){m=l;n=0;break}}p=Rb(l|0)|0;m=j+1|0;n=(p|0)<0?0:p}}while(0);if((a[213992]|0)!=0){gc(c[o>>2]|0,101408,(j=i,i=i+16|0,c[j>>2]=n,c[j+8>>2]=m,j)|0)|0;i=j}do{if((n|0)!=0){j=f;l=Lw(b)|0;p=Mw(b)|0;or(f,b);c[53494]=c[j>>2];c[53495]=c[j+4>>2];c[53496]=c[j+8>>2];if((a[213984]|0)!=0){g[53494]=+g[53494]/72.0;g[53495]=+g[53495]/72.0}j=ux(b)|0;if((j|0)==0){i=e;return}else{q=j;r=0}while(1){j=vx(b,q)|0;if((j|0)==0){s=r}else{t=q+8|0;u=j;j=r;while(1){v=(rz(c[t>>2]|0,c[u+8>>2]|0)|0)+j|0;w=vx(b,u)|0;if((w|0)==0){s=v;break}else{u=w;j=v}}}j=vx(b,q)|0;if((j|0)==0){break}else{q=j;r=s}}if((s|0)==0){i=e;return}j=c[d>>2]|0;x=+h[d+8>>3];y=+h[d+16>>3];z=+h[d+24>>3];u=c[d+32>>2]|0;a:do{if((n|0)>0){t=z>0.0;v=x==0.0;A=+(l|0);B=+(p|0);C=+(da(l-1|0,l)|0);w=(u|0)>0;D=+(j|0);E=y;F=s;G=0;b:while(1){h[39]=E;c[74]=j;h[38]=x;c[82]=u;if(t){h[40]=z}H=E*E;h[21637]=H;if(v){I=E*+T(A)/5.0;h[38]=I;J=I}else{J=x}I=H*+h[40];h[21428]=I;h[21429]=B*I*2.0/C;c:do{if(w){I=J*D/D;if(I>0.0){K=0;L=I}else{M=F;break}while(1){N=ux(b)|0;if((N|0)!=0){O=N;do{N=O+8|0;h[(c[(c[N>>2]|0)+112>>2]|0)+24>>3]=0.0;h[(c[(c[N>>2]|0)+112>>2]|0)+16>>3]=0.0;O=vx(b,O)|0;}while((O|0)!=0)}O=ux(b)|0;if((O|0)==0){k=62;break b}else{P=O;Q=0}while(1){O=vx(b,P)|0;if((O|0)==0){R=Q}else{N=P+8|0;S=O;O=Q;while(1){U=S+8|0;V=c[U>>2]|0;W=c[V+132>>2]|0;X=c[N>>2]|0;Y=c[X+132>>2]|0;I=+h[W>>3]- +h[Y>>3];H=+h[W+8>>3]- +h[Y+8>>3];Z=I*I+H*H;if(Z==0.0){do{_=+(5-((yb()|0)%10|0)|0);$=+(5-((yb()|0)%10|0)|0);aa=_*_+$*$;}while(aa==0.0);ba=$;ca=aa;ea=_;fa=c[N>>2]|0;ga=c[U>>2]|0}else{ba=H;ca=Z;ea=I;fa=X;ga=V}Y=rz(fa,ga)|0;ha=((Y|0)==0?+h[21429]:+h[21428])/ca;ia=ea*ha;W=(c[ga+112>>2]|0)+16|0;h[W>>3]=ia+ +h[W>>3];ja=ba*ha;W=(c[(c[U>>2]|0)+112>>2]|0)+24|0;h[W>>3]=ja+ +h[W>>3];W=(c[(c[N>>2]|0)+112>>2]|0)+16|0;h[W>>3]=+h[W>>3]-ia;W=(c[(c[N>>2]|0)+112>>2]|0)+24|0;h[W>>3]=+h[W>>3]-ja;W=Y+O|0;Y=vx(b,S)|0;if((Y|0)==0){R=W;break}else{S=Y;O=W}}}O=mw(b,P)|0;if((O|0)!=0){S=P+8|0;N=O;do{O=c[S>>2]|0;W=(c[((c[N>>2]&3|0)==2?N:N-32|0)+28>>2]|0)+8|0;Y=c[W>>2]|0;if((rz(O,Y)|0)==0){ka=c[Y+132>>2]|0;la=c[O+132>>2]|0;ja=+h[ka>>3]- +h[la>>3];ia=+h[ka+8>>3]- +h[la+8>>3];ha=+T(ja*ja+ia*ia);la=(a[213984]|0)==0;ma=+h[O+32>>3];if(la){na=+g[53494];oa=+g[53495];pa=+h[O+40>>3]*oa*.5;qa=ma*na*.5;ra=na;sa=oa}else{oa=+g[53494];na=+g[53495];pa=+h[O+40>>3]*.5+na;qa=ma*.5+oa;ra=oa;sa=na}na=+T(qa*qa+pa*pa);oa=+h[Y+32>>3];if(la){ta=sa*+h[Y+40>>3]*.5;ua=ra*oa*.5}else{ta=sa+ +h[Y+40>>3]*.5;ua=ra+oa*.5}oa=na+ +T(ua*ua+ta*ta);na=ha-oa;ma=na*na/(ha*(+h[39]+oa));oa=ja*ma;la=(c[Y+112>>2]|0)+16|0;h[la>>3]=+h[la>>3]-oa;ja=ia*ma;la=(c[(c[W>>2]|0)+112>>2]|0)+24|0;h[la>>3]=+h[la>>3]-ja;la=(c[(c[S>>2]|0)+112>>2]|0)+16|0;h[la>>3]=oa+ +h[la>>3];la=(c[(c[S>>2]|0)+112>>2]|0)+24|0;h[la>>3]=ja+ +h[la>>3]}N=ow(b,N)|0;}while((N|0)!=0)}N=vx(b,P)|0;if((N|0)==0){break}else{P=N;Q=R}}if((R|0)==0){k=62;break b}ja=L*L;N=ux(b)|0;if((N|0)!=0){S=N;do{N=S+8|0;la=c[N>>2]|0;do{if((a[la+119|0]|0)!=3){W=c[la+112>>2]|0;oa=+h[W+16>>3];ma=+h[W+24>>3];ia=oa*oa+ma*ma;if(ia<ja){W=c[la+132>>2]|0;h[W>>3]=oa+ +h[W>>3];W=(c[(c[N>>2]|0)+132>>2]|0)+8|0;h[W>>3]=ma+ +h[W>>3];break}else{ha=+T(ia);W=c[la+132>>2]|0;h[W>>3]=L*oa/ha+ +h[W>>3];W=(c[(c[N>>2]|0)+132>>2]|0)+8|0;h[W>>3]=L*ma/ha+ +h[W>>3];break}}}while(0);S=vx(b,S)|0;}while((S|0)!=0)}S=K+1|0;if((S|0)>=(c[82]|0)){M=R;break c}N=c[74]|0;ja=+h[38]*+(N-S|0)/+(N|0);if(ja>0.0){K=S;L=ja}else{M=R;break}}}else{M=F}}while(0);S=G+1|0;if((M|0)!=0&(S|0)<(n|0)){E=y+E;F=M;G=S}else{va=M;break a}}if((k|0)==62){i=e;return}}else{va=s}}while(0);if((va|0)!=0){break}i=e;return}}while(0);mr(b,m)|0;i=e;return}function rz(b,d){b=b|0;d=d|0;var e=0,f=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0;e=c[d+132>>2]|0;f=c[b+132>>2]|0;i=+h[e>>3]- +h[f>>3];if(i<0.0){j=-0.0-i}else{j=i}i=+h[e+8>>3]- +h[f+8>>3];if(i<0.0){k=-0.0-i}else{k=i}f=(a[213984]|0)==0;i=+h[b+32>>3];if(f){l=+g[53494];m=+h[d+32>>3]*l*.5;n=i*l*.5}else{l=+g[53494];m=+h[d+32>>3]*.5+l;n=i*.5+l}if(j>n+m){o=0;return o|0}m=+h[b+40>>3];if(f){n=+g[53495];p=+h[d+40>>3]*n*.5;q=m*n*.5}else{n=+g[53495];p=+h[d+40>>3]*.5+n;q=m*.5+n}o=k<=q+p|0;return o|0}function sz(a){a=a|0;var b=0;b=a;while(1){a=c[b>>2]|0;eF(b);if((a|0)==0){break}else{b=a}}return}function tz(){var a=0,b=0,d=0,e=0;a=jk(1992)|0;b=a;if((a|0)==0){return b|0}d=zz(b)|0;c[d+4>>2]=0;e=a+1972|0;c[e>>2]=(c[e>>2]|0)+1;c[a>>2]=d;return b|0}function uz(a){a=a|0;var b=0;b=a|0;vz(a,c[b>>2]|0);eF(c[b>>2]|0);eF(a);return 0}function vz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=a+1980|0;e=a+1912|0;f=a+1936|0;if((c[b+4>>2]|0)>0){g=0;do{h=b+8+(g*20|0)+16|0;i=c[h>>2]|0;do{if((i|0)!=0){vz(a,i);eF(c[h>>2]|0);Ez(b,g);c[d>>2]=(c[d>>2]|0)-1;if((c[e>>2]|0)==0){break}c[f>>2]=(c[f>>2]|0)+1}}while(0);g=g+1|0;}while((g|0)<64);return}else{g=0;do{do{if((c[b+8+(g*20|0)+16>>2]|0)!=0){Ez(b,g);c[d>>2]=(c[d>>2]|0)-1;if((c[e>>2]|0)==0){break}c[f>>2]=(c[f>>2]|0)+1}}while(0);g=g+1|0;}while((g|0)<64);return}}function wz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((b|0)==0){cc(116120,154984,194,171160);return 0}e=b+4|0;if((c[e>>2]|0)<=-1){cc(126392,154984,195,171160);return 0}if((d|0)==0){cc(114696,154984,196,171160);return 0}f=a+1952|0;c[f>>2]=(c[f>>2]|0)+1;if((c[e>>2]|0)>0){g=0;h=0}else{e=0;f=0;while(1){i=b+8+(f*20|0)|0;do{if((c[b+8+(f*20|0)+16>>2]|0)==0){j=e}else{if((Jz(d,i|0)|0)==0){j=e;break}k=jk(8)|0;c[k+4>>2]=i;c[k>>2]=e;j=k}}while(0);i=f+1|0;if((i|0)<64){e=j;f=i}else{l=j;break}}return l|0}while(1){j=b+8+(h*20|0)+16|0;do{if((c[j>>2]|0)==0){m=g}else{if((Jz(d,b+8+(h*20|0)|0)|0)==0){m=g;break}f=wz(a,c[j>>2]|0,d)|0;if((g|0)==0){m=f;break}else{n=g}do{o=n|0;n=c[o>>2]|0;}while((n|0)!=0);c[o>>2]=f;m=g}}while(0);j=h+1|0;if((j|0)<64){g=m;h=j}else{l=m;break}}return l|0}function xz(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;i=i+48|0;h=g|0;j=g+8|0;k=g+32|0;c[h>>2]=0;if((b|0)==0|(e|0)==0){cc(107824,154984,247,171192);return 0}if((f|0)<=-1){cc(102152,154984,248,171192);return 0}if((c[(c[e>>2]|0)+4>>2]|0)<(f|0)){cc(102152,154984,248,171192);return 0}else{l=0}while(1){m=l+1|0;if((c[b+(l<<2)>>2]|0)>(c[b+(l+2<<2)>>2]|0)){n=8;break}if((m|0)<2){l=m}else{break}}if((n|0)==8){cc(96376,154984,250,171192);return 0}l=a+1912|0;m=c[a+1908>>2]|0;do{if((c[l>>2]|0)==0){o=a+1908|0;if((m|0)==0){p=o;n=14}else{q=o}}else{if((m|0)==0){o=a+1916|0;c[o>>2]=(c[o>>2]|0)+1;p=a+1908|0;n=14;break}else{o=a+1924|0;c[o>>2]=(c[o>>2]|0)+1;q=a+1908|0;break}}}while(0);if((n|0)==14){n=a+1964|0;c[n>>2]=(c[n>>2]|0)+1;q=p}if((yz(a,b,d,c[e>>2]|0,h,f)|0)==0){r=0;i=g;return r|0}do{if((c[l>>2]|0)!=0){if((c[q>>2]|0)==0){f=a+1944|0;c[f>>2]=(c[f>>2]|0)+1;break}else{f=a+1948|0;c[f>>2]=(c[f>>2]|0)+1;break}}}while(0);q=zz(a)|0;l=a+1976|0;c[l>>2]=(c[l>>2]|0)+1;c[q+4>>2]=(c[(c[e>>2]|0)+4>>2]|0)+1;Bz(j|0,c[e>>2]|0);l=j;f=j+16|0;c[f>>2]=c[e>>2];Dz(a,j,q,0)|0;Bz(k,c[h>>2]|0);d=k;c[l>>2]=c[d>>2];c[l+4>>2]=c[d+4>>2];c[l+8>>2]=c[d+8>>2];c[l+12>>2]=c[d+12>>2];c[f>>2]=c[h>>2];Dz(a,j,q,0)|0;c[e>>2]=q;q=a+1980|0;c[q>>2]=(c[q>>2]|0)+2;r=1;i=g;return r|0}function yz(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=i;i=i+80|0;j=h|0;k=h+24|0;l=h+32|0;m=h+48|0;n=h+64|0;c[k>>2]=0;if((b|0)==0|(e|0)==0|(f|0)==0){cc(163272,154984,311,171176);return 0}if((g|0)<=-1){cc(159256,154984,312,171176);return 0}o=e+4|0;if((c[o>>2]|0)<(g|0)){cc(159256,154984,312,171176);return 0}do{if((c[a+1912>>2]|0)!=0){if((c[a+1908>>2]|0)==0){p=a+1944|0;c[p>>2]=(c[p>>2]|0)+1;break}else{p=a+1948|0;c[p>>2]=(c[p>>2]|0)+1;break}}}while(0);p=c[o>>2]|0;if((p|0)<=(g|0)){if((p|0)!=(g|0)){cc(154208,154984,341,171176);return 0}p=j;o=b;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[j+16>>2]=d;o=a+1980|0;c[o>>2]=(c[o>>2]|0)+1;q=Dz(a,j,e,f)|0;i=h;return q|0}o=Cz(b,e)|0;p=e+8+(o*20|0)+16|0;r=e+8+(o*20|0)|0;if((yz(a,b,d,c[p>>2]|0,k,g)|0)==0){Iz(l,b,r);b=r;g=l;c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[b+12>>2]=c[g+12>>2];q=0;i=h;return q|0}else{Bz(m,c[p>>2]|0);p=r;r=m;c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];r=c[k>>2]|0;c[j+16>>2]=r;Bz(n,r);r=j;k=n;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];c[r+8>>2]=c[k+8>>2];c[r+12>>2]=c[k+12>>2];k=a+1980|0;c[k>>2]=(c[k>>2]|0)+1;q=Dz(a,j,e,f)|0;i=h;return q|0}return 0}function zz(a){a=a|0;var b=0;b=a+1968|0;c[b>>2]=(c[b>>2]|0)+1;b=dF(1288)|0;a=b;c[b>>2]=0;c[b+4>>2]=-1;b=0;do{Fz(a+8+(b*20|0)|0);c[a+8+(b*20|0)+16>>2]=0;b=b+1|0;}while((b|0)<64);return a|0}function Az(a){a=a|0;var b=0;c[a>>2]=0;c[a+4>>2]=-1;b=0;do{Fz(a+8+(b*20|0)|0);c[a+8+(b*20|0)+16>>2]=0;b=b+1|0;}while((b|0)<64);return}function Bz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+32|0;e=d|0;f=d+16|0;if((b|0)==0){cc(81248,164736,99,171248)}Fz(e);g=e;h=f;j=0;k=1;while(1){do{if((c[b+8+(j*20|0)+16>>2]|0)==0){l=k}else{m=b+8+(j*20|0)|0;if((k|0)==0){Iz(f,e,m);c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];l=0;break}else{n=m;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];c[g+12>>2]=c[n+12>>2];l=0;break}}}while(0);n=j+1|0;if((n|0)<64){j=n;k=l}else{break}}l=a;c[l>>2]=c[g>>2];c[l+4>>2]=c[g+4>>2];c[l+8>>2]=c[g+8>>2];c[l+12>>2]=c[g+12>>2];i=d;return}function Cz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=i;i=i+32|0;e=d|0;f=d+16|0;if((a|0)==0|(b|0)==0){cc(132216,164736,125,171224);return 0}g=e;h=f;j=0;k=1;l=0;m=0;n=0;while(1){do{if((c[b+8+(j*20|0)+16>>2]|0)==0){o=n;p=m;q=l;r=k}else{s=b+8+(j*20|0)|0;t=Hz(s)|0;Iz(f,a,s);c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];s=(Hz(e)|0)-t|0;if(!((s|0)>=(l|0)&(k|0)==0)){o=j;p=t;q=s;r=0;break}u=(s|0)==(l|0)&(t|0)<(m|0);o=u?j:n;p=u?t:m;q=u?s:l;r=0}}while(0);s=j+1|0;if((s|0)<64){j=s;k=r;l=q;m=p;n=o}else{break}}i=d;return o|0}function Dz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if((b|0)==0){cc(116928,164736,167,171360);return 0}if((d|0)==0){cc(81248,164736,168,171360);return 0}f=d|0;if((c[f>>2]|0)<64){g=0;while(1){h=g+1|0;if((c[d+8+(g*20|0)+16>>2]|0)==0){break}if((h|0)<64){g=h}else{i=9;break}}if((i|0)==9){cc(109424,164736,178,171360);return 0}i=d+8+(g*20|0)|0;g=b;c[i>>2]=c[g>>2];c[i+4>>2]=c[g+4>>2];c[i+8>>2]=c[g+8>>2];c[i+12>>2]=c[g+12>>2];c[i+16>>2]=c[g+16>>2];c[f>>2]=(c[f>>2]|0)+1;j=0;return j|0}do{if((c[a+1912>>2]|0)!=0){if((c[a+1908>>2]|0)==0){f=a+1944|0;c[f>>2]=(c[f>>2]|0)+1;break}else{f=a+1948|0;c[f>>2]=(c[f>>2]|0)+1;break}}}while(0);if((e|0)==0){cc(103392,164736,187,171360);return 0}Kz(a,d,b,e);if((c[d+4>>2]|0)==0){d=a+1972|0;c[d>>2]=(c[d>>2]|0)+1;j=1;return j|0}else{d=a+1976|0;c[d>>2]=(c[d>>2]|0)+1;j=1;return j|0}return 0}function Ez(a,b){a=a|0;b=b|0;var d=0;if(!((a|0)!=0&b>>>0<64>>>0)){cc(97840,164736,201,171312)}d=a+8+(b*20|0)+16|0;if((c[d>>2]|0)==0){cc(92240,164736,202,171312)}else{Fz(a+8+(b*20|0)|0);c[d>>2]=0;d=a|0;c[d>>2]=(c[d>>2]|0)-1;return}}function Fz(a){a=a|0;vF(a|0,0,16)|0;return}function Gz(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b|0;c[d>>2]=1;c[d+8>>2]=-1;c[d+12>>2]=0;c[d+4>>2]=0;e=a;a=d;c[e>>2]=c[a>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[e+12>>2]=c[a+12>>2];i=b;return}function Hz(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;if((a|0)==0){cc(118600,156592,154,171144);return 0}d=c[a>>2]|0;if((d|0)>(c[a+8>>2]|0)){e=0;i=b;return e|0}else{f=0;g=1;h=d}while(1){d=(c[a+(f+2<<2)>>2]|0)-h|0;j=da(d,g)|0;k=f+1|0;if(((j>>>0)/(d>>>0)|0|0)!=(g|0)){break}if((k|0)>=2){e=j;l=8;break}f=k;g=j;h=c[a+(k<<2)>>2]|0}if((l|0)==8){i=b;return e|0}Fv(1,126672,(l=i,i=i+1|0,i=i+7&-8,c[l>>2]=0,l)|0)|0;i=l;e=-1;i=b;return e|0}function Iz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+16|0;f=e|0;if((b|0)==0|(d|0)==0){cc(114688,156592,197,171328)}g=c[b>>2]|0;h=c[b+8>>2]|0;if((g|0)>(h|0)){j=a;k=d;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];i=e;return}k=c[d>>2]|0;j=c[d+8>>2]|0;if((k|0)>(j|0)){l=a;m=b;c[l>>2]=c[m>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];i=e;return}else{c[f>>2]=(g|0)<(k|0)?g:k;c[f+8>>2]=(h|0)>(j|0)?h:j;j=c[b+4>>2]|0;h=c[d+4>>2]|0;c[f+4>>2]=(j|0)<(h|0)?j:h;h=c[b+12>>2]|0;b=c[d+12>>2]|0;c[f+12>>2]=(h|0)>(b|0)?h:b;b=a;a=f;c[b>>2]=c[a>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[b+12>>2]=c[a+12>>2];i=e;return}}function Jz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if((a|0)==0|(b|0)==0){cc(107560,156592,218,171240);return 0}else{d=0}while(1){e=d+2|0;if((c[a+(d<<2)>>2]|0)>(c[b+(e<<2)>>2]|0)){f=0;g=6;break}h=d+1|0;if((c[b+(d<<2)>>2]|0)>(c[a+(e<<2)>>2]|0)){f=0;g=6;break}if((h|0)<2){d=h}else{f=1;g=6;break}}if((g|0)==6){return f|0}return 0}function Kz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;f=i;i=i+440|0;h=f|0;j=f+16|0;k=f+32|0;l=f+48|0;m=f+64|0;n=f+328|0;o=f+344|0;p=f+360|0;q=f+376|0;r=f+392|0;s=f+408|0;t=f+424|0;if((b|0)==0){cc(108600,150992,40,171128)}if((d|0)==0){cc(123264,150992,41,171128)}u=a+1912|0;do{if((c[u>>2]|0)!=0){if((c[a+1908>>2]|0)==0){v=a+1928|0;c[v>>2]=(c[v>>2]|0)+1;break}else{v=a+1932|0;c[v>>2]=(c[v>>2]|0)+1;break}}}while(0);v=b+4|0;w=c[v>>2]|0;x=t;y=0;do{if((c[b+8+(y*20|0)+16>>2]|0)==0){z=11;break}A=a+4+(y*20|0)|0;B=b+8+(y*20|0)|0;c[A>>2]=c[B>>2];c[A+4>>2]=c[B+4>>2];c[A+8>>2]=c[B+8>>2];c[A+12>>2]=c[B+12>>2];c[A+16>>2]=c[B+16>>2];y=y+1|0;}while((y|0)<64);if((z|0)==11){cc(166560,150992,111,171296)}y=a+1284|0;B=d;c[y>>2]=c[B>>2];c[y+4>>2]=c[B+4>>2];c[y+8>>2]=c[B+8>>2];c[y+12>>2]=c[B+12>>2];c[y+16>>2]=c[B+16>>2];B=a+1304|0;y=B;d=a+4|0;c[y>>2]=c[d>>2];c[y+4>>2]=c[d+4>>2];c[y+8>>2]=c[d+8>>2];c[y+12>>2]=c[d+12>>2];d=1;do{Iz(t,B,a+4+(d*20|0)|0);c[y>>2]=c[x>>2];c[y+4>>2]=c[x+4>>2];c[y+8>>2]=c[x+8>>2];c[y+12>>2]=c[x+12>>2];d=d+1|0;}while((d|0)<65);d=a+1320|0;c[d>>2]=Hz(B)|0;Az(b);B=q;x=r;y=s;t=p;A=a+1848|0;c[A>>2]=0;C=a+1844|0;c[C>>2]=0;D=a+1868|0;Gz(p);p=D;c[p>>2]=c[t>>2];c[p+4>>2]=c[t+4>>2];c[p+8>>2]=c[t+8>>2];c[p+12>>2]=c[t+12>>2];E=a+1852|0;c[E>>2]=c[t>>2];c[E+4>>2]=c[t+4>>2];c[E+8>>2]=c[t+8>>2];c[E+12>>2]=c[t+12>>2];t=a+1888|0;c[t>>2]=0;E=a+1884|0;c[E>>2]=0;F=0;do{c[a+1584+(F<<2)>>2]=0;c[a+1324+(F<<2)>>2]=-1;F=F+1|0;}while((F|0)<65);F=n;G=o;H=0;while(1){c[m+(H<<2)>>2]=Hz(a+4+(H*20|0)|0)|0;I=H+1|0;if((I|0)<65){H=I}else{J=0;K=0;L=0;M=0;break}}while(1){H=J+1|0;I=a+4+(J*20|0)|0;N=c[m+(J<<2)>>2]|0;O=H;P=K;Q=L;R=M;do{Iz(o,I,a+4+(O*20|0)|0);c[F>>2]=c[G>>2];c[F+4>>2]=c[G+4>>2];c[F+8>>2]=c[G+8>>2];c[F+12>>2]=c[G+12>>2];S=(Hz(n)|0)-N|0;T=S-(c[m+(O<<2)>>2]|0)|0;S=T>>>0>P>>>0;P=S?T:P;Q=S?J:Q;R=S?O:R;O=O+1|0;}while((O|0)<65);if((H|0)<64){J=H;K=P;L=Q;M=R}else{break}}M=l;L=a+1584+(Q<<2)|0;if((c[L>>2]|0)!=0){cc(80304,150992,257,171344)}c[a+1324+(Q<<2)>>2]=0;c[L>>2]=1;L=a+1852|0;K=a+4+(Q*20|0)|0;if((c[C>>2]|0)==0){Q=L;J=K;c[Q>>2]=c[J>>2];c[Q+4>>2]=c[J+4>>2];c[Q+8>>2]=c[J+8>>2];c[Q+12>>2]=c[J+12>>2]}else{Iz(l,K,L);K=L;c[K>>2]=c[M>>2];c[K+4>>2]=c[M+4>>2];c[K+8>>2]=c[M+8>>2];c[K+12>>2]=c[M+12>>2]}c[E>>2]=Hz(L)|0;c[C>>2]=(c[C>>2]|0)+1;M=k;K=a+1584+(R<<2)|0;if((c[K>>2]|0)!=0){cc(80304,150992,257,171344)}c[a+1324+(R<<2)>>2]=1;c[K>>2]=1;K=a+4+(R*20|0)|0;if((c[A>>2]|0)==0){R=K;c[p>>2]=c[R>>2];c[p+4>>2]=c[R+4>>2];c[p+8>>2]=c[R+8>>2];c[p+12>>2]=c[R+12>>2]}else{Iz(k,K,D);c[p>>2]=c[M>>2];c[p+4>>2]=c[M+4>>2];c[p+8>>2]=c[M+8>>2];c[p+12>>2]=c[M+12>>2]}c[t>>2]=Hz(D)|0;M=(c[A>>2]|0)+1|0;c[A>>2]=M;p=c[C>>2]|0;a:do{if((p+M|0)<65){K=a+1892|0;k=j;R=0;l=0;J=p;Q=M;while(1){m=65-(c[K>>2]|0)|0;if((J|0)<(m|0)&(Q|0)<(m|0)){U=0;V=-1;W=R;X=l}else{Y=J;Z=Q;break a}while(1){do{if((c[a+1584+(U<<2)>>2]|0)==0){m=a+4+(U*20|0)|0;Iz(r,m,L);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];c[B+8>>2]=c[x+8>>2];c[B+12>>2]=c[x+12>>2];n=Hz(q)|0;G=c[E>>2]|0;Iz(s,m,D);c[B>>2]=c[y>>2];c[B+4>>2]=c[y+4>>2];c[B+8>>2]=c[y+8>>2];c[B+12>>2]=c[y+12>>2];m=Hz(q)|0;F=m-(c[t>>2]|0)+(G-n)|0;n=(F|0)>-1?F:-F|0;G=F>>>31;if((n|0)>(V|0)){_=G;$=U;aa=n;break}if((n|0)!=(V|0)){_=X;$=W;aa=V;break}n=(c[a+1844+(G<<2)>>2]|0)<(c[a+1844+(X<<2)>>2]|0);_=n?G:X;$=n?U:W;aa=V}else{_=X;$=W;aa=V}}while(0);n=U+1|0;if((n|0)<65){U=n;V=aa;W=$;X=_}else{break}}n=a+1584+($<<2)|0;if((c[n>>2]|0)!=0){break}c[a+1324+($<<2)>>2]=_;c[n>>2]=1;n=a+1844+(_<<2)|0;G=a+1852+(_<<4)|0;F=a+4+($*20|0)|0;if((c[n>>2]|0)==0){m=G;o=F;c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2]}else{Iz(j,F,G);F=G;c[F>>2]=c[k>>2];c[F+4>>2]=c[k+4>>2];c[F+8>>2]=c[k+8>>2];c[F+12>>2]=c[k+12>>2]}c[a+1884+(_<<2)>>2]=Hz(G)|0;c[n>>2]=(c[n>>2]|0)+1;n=c[C>>2]|0;G=c[A>>2]|0;if((G+n|0)<65){R=$;l=_;J=n;Q=G}else{Y=n;Z=G;break a}}cc(80304,150992,257,171344)}else{Y=p;Z=M}}while(0);if((Y+Z|0)<65){M=(Y|0)>=(65-(c[a+1892>>2]|0)|0)|0;p=h;_=a+1844+(M<<2)|0;$=a+1852+(M<<4)|0;j=$;X=a+1884+(M<<2)|0;W=0;do{aa=a+1584+(W<<2)|0;if((c[aa>>2]|0)==0){c[a+1324+(W<<2)>>2]=M;c[aa>>2]=1;aa=a+4+(W*20|0)|0;if((c[_>>2]|0)==0){V=aa;c[j>>2]=c[V>>2];c[j+4>>2]=c[V+4>>2];c[j+8>>2]=c[V+8>>2];c[j+12>>2]=c[V+12>>2]}else{Iz(h,aa,$);c[j>>2]=c[p>>2];c[j+4>>2]=c[p+4>>2];c[j+8>>2]=c[p+8>>2];c[j+12>>2]=c[p+12>>2]}c[X>>2]=Hz($)|0;c[_>>2]=(c[_>>2]|0)+1;}W=W+1|0;}while((W|0)<65);ba=c[C>>2]|0;ca=c[A>>2]|0}else{ba=Y;ca=Z}if((ba+ca|0)!=65){cc(90120,150992,210,171264)}Z=c[a+1892>>2]|0;if((ba|0)<(Z|0)|(ca|0)<(Z|0)){cc(84992,150992,212,171264)}Z=Hz(L)|0;L=(Hz(D)|0)+Z|0;do{if((c[u>>2]|0)!=0){if((c[a+1908>>2]|0)!=0|(L|0)==0){break}Z=a+1960|0;g[Z>>2]=+((c[d>>2]|0)>>>0>>>0)/+(L|0)+ +g[Z>>2]}}while(0);c[e>>2]=zz(a)|0;c[v>>2]=w;c[(c[e>>2]|0)+4>>2]=w;w=c[e>>2]|0;if((w|0)==0){cc(106776,150992,298,171280)}else{da=0}do{v=c[a+1324+(da<<2)>>2]|0;if(v>>>0>=2>>>0){z=65;break}if((v|0)==0){Dz(a,a+4+(da*20|0)|0,b,0)|0}else if((v|0)==1){Dz(a,a+4+(da*20|0)|0,w,0)|0}da=da+1|0;}while((da|0)<65);if((z|0)==65){cc(95440,150992,303,171280)}if(((c[c[e>>2]>>2]|0)+(c[b>>2]|0)|0)==65){i=f;return}else{cc(113536,150992,86,171128)}}function Lz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return(c[b>>2]|0)-(c[d>>2]|0)|0}
-
-
-
-function Lo(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,I=0,J=0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0.0,ja=0,ka=0.0,la=0.0,ma=0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0,va=0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0.0,Fa=0.0,Ga=0.0,Ha=0.0,Ia=0.0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0.0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0.0,sb=0.0,tb=0.0,ub=0.0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0.0,Cb=0.0,Db=0,Eb=0.0,Fb=0.0,Gb=0.0,Hb=0.0,Ib=0.0,Kb=0.0,Lb=0.0,Mb=0.0;j=i;i=i+272|0;k=j|0;l=j+8|0;m=j+16|0;n=j+176|0;o=j+192|0;p=j+208|0;q=f;r=f+32|0;s=Hx(c[((c[q>>2]&3|0)==3?f:r)+28>>2]|0)|0;t=c[q>>2]&3;q=c[((t|0)==3?f:r)+28>>2]|0;r=c[((t|0)==2?f:f-32|0)+28>>2]|0;f=(e|0)>0;do{if(f){t=0;u=0;v=0;while(1){w=c[(c[b+(t+d<<2)>>2]|0)+8>>2]|0;x=((c[w+96>>2]|0)!=0)+v|0;if((a[w+44|0]|0)==0){if((a[w+84|0]|0)==0){y=u}else{z=4}}else{z=4}if((z|0)==4){z=0;y=1}w=t+1|0;if((w|0)<(e|0)){t=w;u=y;v=x}else{break}}if((y|0)==0){if((x|0)==0){break}v=m;u=n;t=o;w=c[b+(d<<2)>>2]|0;A=jk(e<<2)|0;B=A;if(f){C=0;do{c[B+(C<<2)>>2]=c[b+(C+d<<2)>>2];C=C+1|0;}while((C|0)<(e|0))}Jb(A|0,e|0,4,152);C=c[q+8>>2]|0;D=w+8|0;E=c[D>>2]|0;F=+h[C+16>>3]+ +h[E+16>>3];G=+h[C+24>>3]+ +h[E+24>>3];E=n|0;h[E>>3]=F;H=n+8|0;h[H>>3]=G;I=c[r+8>>2]|0;J=c[D>>2]|0;G=+h[I+16>>3]+ +h[J+56>>3];K=+h[I+24>>3]+ +h[J+64>>3];J=o|0;h[J>>3]=G;D=o+8|0;h[D>>3]=K;K=F+ +h[C+96>>3];F=G- +h[I+88>>3];G=(K+F)*.5;I=c[B>>2]|0;C=m|0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];L=m+16|0;M=L;c[M>>2]=c[u>>2];c[M+4>>2]=c[u+4>>2];c[M+8>>2]=c[u+8>>2];c[M+12>>2]=c[u+12>>2];M=m+32|0;N=M;c[N>>2]=c[t>>2];c[N+4>>2]=c[t+4>>2];c[N+8>>2]=c[t+8>>2];c[N+12>>2]=c[t+12>>2];N=m+48|0;O=N;c[O>>2]=c[t>>2];c[O+4>>2]=c[t+4>>2];c[O+8>>2]=c[t+8>>2];c[O+12>>2]=c[t+12>>2];cm(I,c[((c[I>>2]&3|0)==2?I:I-32|0)+28>>2]|0,C,4,11848);P=I+8|0;h[(c[(c[P>>2]|0)+96>>2]|0)+56>>3]=G;I=c[(c[P>>2]|0)+96>>2]|0;h[I+64>>3]=+h[H>>3]+(+h[I+32>>3]+6.0)*.5;a[(c[(c[P>>2]|0)+96>>2]|0)+81|0]=1;Q=+h[H>>3]+3.0;I=c[(c[P>>2]|0)+96>>2]|0;R=Q+ +h[I+32>>3];S=+h[I+24>>3]*.5;T=G-S;U=G+S;a:do{if((x|0)>1){I=L|0;P=m+24|0;V=M|0;W=m+40|0;X=N|0;Y=m+56|0;Z=m+64|0;_=m+72|0;$=m+80|0;aa=m+88|0;ba=m+96|0;ca=m+104|0;da=m+112|0;ea=m+120|0;fa=k+4|0;ga=k|0;ha=(g|0)==6|0;S=Q;ia=R;ja=1;ka=0.0;la=0.0;while(1){ma=c[B+(ja<<2)>>2]|0;if((ja&1|0)==0){c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];h[I>>3]=T;h[P>>3]=+h[H>>3];h[V>>3]=T;h[W>>3]=ia;h[X>>3]=U;h[Y>>3]=ia;h[Z>>3]=U;na=+h[D>>3];h[_>>3]=na;oa=+h[J>>3];h[$>>3]=oa;h[aa>>3]=na;h[ba>>3]=oa;oa=ia+6.0;h[ca>>3]=oa;h[da>>3]=+h[E>>3];h[ea>>3]=oa;oa=+h[(c[(c[ma+8>>2]|0)+96>>2]|0)+32>>3];pa=la;qa=ka;ra=ia+(oa+6.0);sa=S;ta=ia+oa*.5+6.0}else{ua=ma+8|0;va=c[(c[ua>>2]|0)+96>>2]|0;if((ja|0)==1){oa=+h[va+24>>3]*.5;wa=G+oa;xa=G-oa}else{wa=la;xa=ka}oa=S-(+h[va+32>>3]+6.0);c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];h[I>>3]=+h[E>>3];na=oa+-6.0;h[P>>3]=na;h[V>>3]=+h[J>>3];h[W>>3]=na;c[O>>2]=c[t>>2];c[O+4>>2]=c[t+4>>2];c[O+8>>2]=c[t+8>>2];c[O+12>>2]=c[t+12>>2];h[Z>>3]=wa;h[_>>3]=+h[D>>3];h[$>>3]=wa;h[aa>>3]=oa;h[ba>>3]=xa;h[ca>>3]=oa;h[da>>3]=xa;h[ea>>3]=+h[H>>3];pa=wa;qa=xa;ra=ia;sa=oa;ta=oa+ +h[(c[(c[ua>>2]|0)+96>>2]|0)+32>>3]*.5}c[fa>>2]=8;c[ga>>2]=C;ua=fl(n,o,k,l,ha)|0;if((c[l>>2]|0)==0){break}va=ma+8|0;h[(c[(c[va>>2]|0)+96>>2]|0)+56>>3]=G;h[(c[(c[va>>2]|0)+96>>2]|0)+64>>3]=ta;a[(c[(c[va>>2]|0)+96>>2]|0)+81|0]=1;cm(ma,c[((c[ma>>2]&3|0)==2?ma:ma-32|0)+28>>2]|0,ua,c[l>>2]|0,11848);ua=ja+1|0;if((ua|0)<(x|0)){S=sa;ia=ra;ja=ua;ka=qa;la=pa}else{ya=sa;za=ra;Aa=ua;Ba=qa;Ca=pa;break a}}i=j;return}else{ya=Q;za=R;Aa=1;Ba=0.0;Ca=0.0}}while(0);b:do{if((Aa|0)<(e|0)){w=L|0;ja=m+24|0;ha=M|0;ga=m+40|0;fa=N|0;ea=m+56|0;da=m+64|0;ca=m+72|0;ba=m+80|0;aa=m+88|0;$=m+96|0;_=m+104|0;Z=m+112|0;W=m+120|0;V=k+4|0;P=k|0;I=(g|0)==6|0;R=(K*2.0+F)/3.0;Q=(K+F*2.0)/3.0;G=ya;la=za;Y=Aa;ka=Ba;ia=Ca;while(1){X=c[B+(Y<<2)>>2]|0;if((Y&1|0)==0){c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];h[w>>3]=T;h[ja>>3]=+h[H>>3];h[ha>>3]=T;h[ga>>3]=la;h[fa>>3]=U;h[ea>>3]=la;h[da>>3]=U;S=+h[D>>3];h[ca>>3]=S;oa=+h[J>>3];h[ba>>3]=oa;h[aa>>3]=S;h[$>>3]=oa;oa=la+6.0;h[_>>3]=oa;h[Z>>3]=+h[E>>3];Da=ia;Ea=ka;Fa=oa;Ga=G;Ha=oa}else{ua=(Y|0)==1;oa=ua?R:ka;S=ua?Q:ia;na=G+-6.0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];h[w>>3]=+h[E>>3];Ia=na+-6.0;h[ja>>3]=Ia;h[ha>>3]=+h[J>>3];h[ga>>3]=Ia;c[O>>2]=c[t>>2];c[O+4>>2]=c[t+4>>2];c[O+8>>2]=c[t+8>>2];c[O+12>>2]=c[t+12>>2];h[da>>3]=S;h[ca>>3]=+h[D>>3];h[ba>>3]=S;h[aa>>3]=na;h[$>>3]=oa;h[_>>3]=na;h[Z>>3]=oa;Da=S;Ea=oa;Fa=la;Ga=na;Ha=+h[H>>3]}h[W>>3]=Ha;c[V>>2]=8;c[P>>2]=C;ua=fl(n,o,k,l,I)|0;ma=c[l>>2]|0;if((ma|0)==0){break}cm(X,c[((c[X>>2]&3|0)==2?X:X-32|0)+28>>2]|0,ua,ma,11848);ma=Y+1|0;if((ma|0)<(e|0)){G=Ga;la=Fa;Y=ma;ka=Ea;ia=Da}else{break b}}i=j;return}}while(0);eF(A);i=j;return}C=jk(156)|0;if((Nw(s)|0)==0){Ja=Hw(162440,173920,0)|0}else{Ja=Hw(162440,173944,0)|0}Wx(Ja|0,106832,272,1)|0;Wv(Ja,0,101184,213456)|0;H=jk(96)|0;D=Ja+8|0;c[(c[D>>2]|0)+8>>2]=H;H=s+8|0;h[c[(c[D>>2]|0)+8>>2]>>3]=+h[c[(c[H>>2]|0)+8>>2]>>3];h[(c[(c[D>>2]|0)+8>>2]|0)+24>>3]=+h[(c[(c[H>>2]|0)+8>>2]|0)+24>>3];a[(c[D>>2]|0)+115|0]=a[(c[H>>2]|0)+115|0]|0;c[(c[D>>2]|0)+116>>2]=(c[(c[H>>2]|0)+116>>2]&1|0)==0?1:0;c[(c[D>>2]|0)+236>>2]=c[(c[H>>2]|0)+236>>2];c[(c[D>>2]|0)+240>>2]=c[(c[H>>2]|0)+240>>2];t=s|0;O=Xv(Ix(t)|0,1,0)|0;J=Xv(Ix(t)|0,1,O)|0;if((J|0)!=0){O=J;do{Wv(Ja,1,c[O+8>>2]|0,c[O+12>>2]|0)|0;O=Xv(Ix(t)|0,1,O)|0;}while((O|0)!=0)}O=Xv(Ix(t)|0,2,0)|0;A=Xv(Ix(t)|0,2,O)|0;if((A|0)!=0){O=A;do{Wv(Ja,2,c[O+8>>2]|0,c[O+12>>2]|0)|0;O=Xv(Ix(t)|0,2,O)|0;}while((O|0)!=0)}if((Wv(Ja,2,153464,0)|0)==0){Wv(Ja,2,153464,213456)|0}if((Wv(Ja,2,151416,0)|0)==0){Wv(Ja,2,151416,213456)|0}O=C;c[O>>2]=c[53812];t=C+4|0;c[t>>2]=c[53770];A=C+8|0;c[A>>2]=c[53768];J=C+12|0;c[J>>2]=c[53750];E=C+16|0;c[E>>2]=c[53774];u=C+20|0;c[u>>2]=c[53800];v=C+24|0;c[v>>2]=c[53798];B=C+28|0;c[B>>2]=c[53796];N=C+32|0;c[N>>2]=c[53794];M=C+36|0;c[M>>2]=c[53792];L=C+40|0;c[L>>2]=c[53790];Y=C+44|0;c[Y>>2]=c[53788];I=C+48|0;c[I>>2]=c[53782];P=C+52|0;c[P>>2]=c[53780];V=C+56|0;c[V>>2]=c[53778];W=C+60|0;c[W>>2]=c[53758];Z=C+64|0;c[Z>>2]=c[53756];_=C+68|0;c[_>>2]=c[53748];$=C+72|0;c[$>>2]=c[53618];aa=C+76|0;c[aa>>2]=c[53574];ba=C+80|0;c[ba>>2]=c[53590];ca=C+84|0;c[ca>>2]=c[53582];da=C+88|0;c[da>>2]=c[53624];ga=C+92|0;c[ga>>2]=c[53626];ha=C+96|0;c[ha>>2]=c[53628];ja=C+100|0;c[ja>>2]=c[53614];w=C+104|0;c[w>>2]=c[53572];ea=C+108|0;c[ea>>2]=c[53588];fa=C+112|0;c[fa>>2]=c[53604];ma=C+116|0;c[ma>>2]=c[53586];ua=C+120|0;c[ua>>2]=c[53598];X=C+124|0;c[X>>2]=c[53584];va=C+128|0;c[va>>2]=c[53602];Ka=C+132|0;c[Ka>>2]=c[53636];La=C+136|0;c[La>>2]=c[53630];Ma=C+140|0;c[Ma>>2]=c[53606];Na=C+144|0;c[Na>>2]=c[53620];Oa=C+152|0;c[Oa>>2]=c[53522];Pa=C+148|0;c[Pa>>2]=c[53718];c[53812]=0;c[53770]=Wv(Ja,2,147448,0)|0;c[53768]=Wv(Ja,2,144280,0)|0;Qa=Wv(Ja,2,142360,0)|0;c[53750]=Qa;if((Qa|0)==0){c[53750]=Wv(Ja,2,142360,213456)|0}c[53774]=0;c[53800]=0;c[53798]=Wv(Ja,2,139248,0)|0;c[53796]=Wv(Ja,2,135624,0)|0;c[53794]=Wv(Ja,2,133768,0)|0;c[53792]=0;c[53790]=Wv(Ja,2,166600,0)|0;c[53788]=Wv(Ja,2,131720,0)|0;c[53782]=0;c[53780]=Wv(Ja,2,128320,0)|0;c[53778]=Wv(Ja,2,126248,0)|0;c[53758]=Wv(Ja,2,123736,0)|0;c[53756]=0;c[53748]=0;c[53618]=Wv(Ja,1,121824,0)|0;c[53574]=Wv(Ja,1,120688,0)|0;c[53590]=Wv(Ja,1,119936,0)|0;c[53582]=0;c[53624]=Wv(Ja,1,135624,0)|0;c[53626]=Wv(Ja,1,139248,0)|0;c[53628]=0;c[53614]=Wv(Ja,1,166600,0)|0;c[53572]=0;c[53588]=0;c[53604]=Wv(Ja,1,119384,0)|0;c[53586]=Wv(Ja,1,118704,0)|0;c[53598]=Wv(Ja,1,117792,0)|0;c[53584]=Wv(Ja,1,116864,0)|0;c[53602]=Wv(Ja,1,115952,0)|0;c[53636]=Wv(Ja,1,114632,0)|0;c[53630]=Wv(Ja,1,113792,0)|0;c[53606]=0;c[53620]=0;c[53718]=Wv(Ja,0,119384,0)|0;Qa=ry(Ja,113672,1)|0;Ra=Qa|0;Wx(Ra,106832,272,1)|0;gw(Ra,101184,95624)|0;Ra=~~+h[(c[r+8>>2]|0)+16>>3];Sa=~~+h[(c[q+8>>2]|0)+16>>3];Ta=(c[(c[H>>2]|0)+116>>2]&1|0)==0;Ua=Ta?r:q;Va=Ta?q:r;Ta=Po(Qa,Va)|0;Qa=Po(Ja,Ua)|0;if(f){Wa=0;Xa=0;while(1){Ya=c[b+(Wa+d<<2)>>2]|0;Za=Ya+8|0;_a=c[Za>>2]|0;if((a[_a+112|0]|0)==0){$a=Ya;ab=Za}else{Za=_a;do{bb=c[Za+116>>2]|0;cb=bb+8|0;Za=c[cb>>2]|0;}while((a[Za+112|0]|0)!=0);$a=bb;ab=cb}if((c[((c[$a>>2]&3|0)==3?$a:$a+32|0)+28>>2]|0)==(Va|0)){Za=uw(Ja,Ta,Qa,0,1)|0;jw($a|0,Za|0)|0;db=Za}else{Za=uw(Ja,Qa,Ta,0,1)|0;jw($a|0,Za|0)|0;db=Za}c[(c[ab>>2]|0)+120>>2]=db;do{if((Xa|0)==0){Za=c[ab>>2]|0;if((a[Za+44|0]|0)!=0){eb=0;break}if((a[Za+84|0]|0)!=0){eb=0;break}c[(c[db+8>>2]|0)+120>>2]=$a;eb=db}else{eb=Xa}}while(0);Za=Wa+1|0;if((Za|0)<(e|0)){Wa=Za;Xa=eb}else{break}}if((eb|0)==0){z=54}else{fb=eb}}else{z=54}if((z|0)==54){fb=uw(Ja,Ta,Qa,0,1)|0}hw(fb|0,c[53750]|0,90272)|0;c[(c[D>>2]|0)+136>>2]=c[(c[H>>2]|0)+136>>2];qn(Ja,g);so(Ja);Zp(Ja,0);jp(Ja,0);Hp(Ja,0);Xa=Va+8|0;Wa=c[Xa>>2]|0;Za=c[Ua+8>>2]|0;_a=Ta+8|0;Ya=c[(c[D>>2]|0)+180>>2]|0;if((Ya|0)!=0){U=+(Ra|0);T=+(~~((+h[(c[_a>>2]|0)+16>>3]+ +h[(c[Qa+8>>2]|0)+16>>3])*.5)|0);F=+(Sa|0);K=+(~~((+h[Wa+16>>3]- +h[Wa+96>>3]+ +h[Za+16>>3]+ +h[Za+88>>3])*.5)|0);Za=Ya;do{Ya=Za;do{if((Ya|0)==(Ta|0)){Wa=Za+8|0;h[(c[Wa>>2]|0)+24>>3]=U;h[(c[Wa>>2]|0)+16>>3]=T}else{Wa=Za+8|0;gb=(c[Wa>>2]|0)+24|0;if((Ya|0)==(Qa|0)){h[gb>>3]=F;h[(c[Wa>>2]|0)+16>>3]=T;break}else{h[gb>>3]=K;break}}}while(0);Za=c[(c[Za+8>>2]|0)+164>>2]|0;}while((Za|0)!=0)}pq(Ja);Bo(Ja,0);Xk(Ja);Za=c[Xa>>2]|0;Qa=c[_a>>2]|0;if((c[(c[H>>2]|0)+116>>2]&1|0)==0){hb=Qa+16|0;ib=+h[Za+24>>3]- +h[Qa+24>>3]}else{hb=Qa+24|0;ib=+h[Za+24>>3]+ +h[Qa+16>>3]}K=+h[Za+16>>3]- +h[hb>>3];if(f){Za=p;Qa=p|0;Ta=p+16|0;Sa=p+32|0;Ra=p+48|0;D=p+56|0;Ua=0;do{Va=c[b+(Ua+d<<2)>>2]|0;Ya=Va+8|0;gb=c[Ya>>2]|0;if((a[gb+112|0]|0)==0){jb=Va;kb=Ya;lb=gb}else{Ya=gb;do{mb=c[Ya+116>>2]|0;nb=mb+8|0;Ya=c[nb>>2]|0;}while((a[Ya+112|0]|0)!=0);jb=mb;kb=nb;lb=Ya}gb=c[lb+120>>2]|0;Va=gb+8|0;Wa=c[Va>>2]|0;do{if(!((gb|0)==(fb|0)&(c[Wa+120>>2]|0)==0)){ob=c[c[Wa+8>>2]>>2]|0;pb=ob+4|0;qb=bm(jb,c[pb>>2]|0)|0;c[qb+8>>2]=c[ob+8>>2];T=+h[ob+16>>3];F=+h[ob+24>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){rb=T;sb=F}else{rb=F;sb=-0.0-T}h[qb+16>>3]=K+rb;h[qb+24>>3]=ib+sb;c[qb+12>>2]=c[ob+12>>2];T=+h[ob+32>>3];F=+h[ob+40>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){tb=T;ub=F}else{tb=F;ub=-0.0-T}h[qb+32>>3]=K+tb;h[qb+40>>3]=ib+ub;c:do{if((c[pb>>2]|0)>0){vb=qb|0;wb=ob|0;xb=0;do{yb=c[vb>>2]|0;zb=yb+(xb<<4)|0;Ab=c[wb>>2]|0;T=+h[Ab+(xb<<4)>>3];F=+h[Ab+(xb<<4)+8>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){Bb=T;Cb=F}else{Bb=F;Cb=-0.0-T}Ab=zb;h[zb>>3]=K+Bb;h[yb+(xb<<4)+8>>3]=ib+Cb;c[Za>>2]=c[Ab>>2];c[Za+4>>2]=c[Ab+4>>2];c[Za+8>>2]=c[Ab+8>>2];c[Za+12>>2]=c[Ab+12>>2];Ab=xb+1|0;if((Ab|0)>=(c[pb>>2]|0)){break c}yb=c[vb>>2]|0;zb=yb+(Ab<<4)|0;Db=c[wb>>2]|0;T=+h[Db+(Ab<<4)>>3];F=+h[Db+(Ab<<4)+8>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){Eb=T;Fb=F}else{Eb=F;Fb=-0.0-T}Db=zb;h[zb>>3]=K+Eb;h[yb+(Ab<<4)+8>>3]=ib+Fb;c[Ta>>2]=c[Db>>2];c[Ta+4>>2]=c[Db+4>>2];c[Ta+8>>2]=c[Db+8>>2];c[Ta+12>>2]=c[Db+12>>2];Db=xb+2|0;Ab=c[vb>>2]|0;yb=Ab+(Db<<4)|0;zb=c[wb>>2]|0;T=+h[zb+(Db<<4)>>3];F=+h[zb+(Db<<4)+8>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){Gb=T;Hb=F}else{Gb=F;Hb=-0.0-T}zb=yb;h[yb>>3]=K+Gb;h[Ab+(Db<<4)+8>>3]=ib+Hb;c[Sa>>2]=c[zb>>2];c[Sa+4>>2]=c[zb+4>>2];c[Sa+8>>2]=c[zb+8>>2];c[Sa+12>>2]=c[zb+12>>2];xb=xb+3|0;zb=c[wb>>2]|0;T=+h[zb+(xb<<4)>>3];F=+h[zb+(xb<<4)+8>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){Ib=T;Kb=F}else{Ib=F;Kb=-0.0-T}h[Ra>>3]=K+Ib;h[D>>3]=ib+Kb;Oh((c[H>>2]|0)+16|0,Qa);}while((xb|0)<(c[pb>>2]|0))}}while(0);pb=c[(c[kb>>2]|0)+96>>2]|0;if((pb|0)==0){break}ob=c[(c[Va>>2]|0)+96>>2]|0;T=+h[ob+56>>3];F=+h[ob+64>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){Lb=T;Mb=F}else{Lb=F;Mb=-0.0-T}h[pb+56>>3]=K+Lb;h[pb+64>>3]=ib+Mb;a[(c[(c[kb>>2]|0)+96>>2]|0)+81|0]=1;_m(s,c[(c[kb>>2]|0)+96>>2]|0)}}while(0);Ua=Ua+1|0;}while((Ua|0)<(e|0))}c[53812]=c[O>>2];c[53770]=c[t>>2];c[53768]=c[A>>2];c[53750]=c[J>>2];c[53774]=c[E>>2];c[53800]=c[u>>2];c[53798]=c[v>>2];c[53796]=c[B>>2];c[53794]=c[N>>2];c[53792]=c[M>>2];c[53790]=c[L>>2];c[53788]=c[Y>>2];c[53782]=c[I>>2];c[53780]=c[P>>2];c[53778]=c[V>>2];c[53758]=c[W>>2];c[53756]=c[Z>>2];c[53748]=c[_>>2];c[53618]=c[$>>2];c[53574]=c[aa>>2];c[53590]=c[ba>>2];c[53582]=c[ca>>2];c[53624]=c[da>>2];c[53626]=c[ga>>2];c[53628]=c[ha>>2];c[53614]=c[ja>>2];c[53572]=c[w>>2];c[53588]=c[ea>>2];c[53604]=c[fa>>2];c[53586]=c[ma>>2];c[53598]=c[ua>>2];c[53584]=c[X>>2];c[53602]=c[va>>2];c[53636]=c[Ka>>2];c[53630]=c[La>>2];c[53606]=c[Ma>>2];c[53620]=c[Na>>2];c[53718]=c[Pa>>2];c[53522]=c[Oa>>2];eF(C);to(Ja);Kw(Ja)|0;i=j;return}}while(0);Mo(c[q+8>>2]|0,c[r+8>>2]|0,b,d,e,g);i=j;return}function Mo(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0;j=i;i=i+160|0;k=j|0;l=c[(c[d+(e<<2)>>2]|0)+8>>2]|0;m=+h[a+16>>3]+ +h[l+16>>3];n=+h[a+24>>3]+ +h[l+24>>3];o=+h[b+16>>3]+ +h[l+56>>3];p=+h[b+24>>3]+ +h[l+64>>3];do{if((f|0)>1){q=+h[a+80>>3];r=q/+(f-1|0);s=n-q*.5}else{if((f|0)>0){r=0.0;s=n;break}i=j;return}}while(0);a=k|0;l=k|0;b=k+8|0;q=(m*2.0+o)/3.0;t=k+16|0;u=k+24|0;v=(m+o*2.0)/3.0;w=k+32|0;x=k+40|0;y=k+48|0;z=k+56|0;A=k+64|0;B=k+72|0;C=k+80|0;D=k+88|0;E=k+96|0;F=k+104|0;G=k+112|0;H=k+120|0;I=k+128|0;J=k+136|0;K=k+144|0;L=k+152|0;if((g&-9|0)==2){g=0;M=s;while(1){k=c[d+(g+e<<2)>>2]|0;h[l>>3]=m;h[b>>3]=n;h[t>>3]=q;h[u>>3]=M;h[w>>3]=v;h[x>>3]=M;h[y>>3]=o;h[z>>3]=p;cm(k,c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0,a,4,11848);k=g+1|0;if((k|0)<(f|0)){g=k;M=r+M}else{break}}i=j;return}else{g=0;M=s;while(1){k=c[d+(g+e<<2)>>2]|0;h[l>>3]=m;h[b>>3]=n;h[t>>3]=m;h[u>>3]=n;h[w>>3]=q;h[x>>3]=M;h[y>>3]=q;h[z>>3]=M;h[A>>3]=q;h[B>>3]=M;h[C>>3]=v;h[D>>3]=M;h[E>>3]=v;h[F>>3]=M;h[G>>3]=v;h[H>>3]=M;h[I>>3]=o;h[J>>3]=p;h[K>>3]=o;h[L>>3]=p;cm(k,c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0,a,10,11848);k=g+1|0;if((k|0)<(f|0)){g=k;M=r+M}else{break}}i=j;return}}function No(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;j=i;i=i+32|0;k=j|0;l=Hx(d|0)|0;Do(k,a,d,0,e);a=f;m=k;c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2];c[a+16>>2]=c[m+16>>2];c[a+20>>2]=c[m+20>>2];c[a+24>>2]=c[m+24>>2];c[a+28>>2]=c[m+28>>2];n=+h[f>>3];o=+h[f+16>>3];c[f+48>>2]=4;if(g<<24>>24==0){gm(b,e,2,f,0)}else{em(b,e,2,f,0)}e=f+52|0;b=c[e>>2]|0;p=+h[f+56+(b-1<<5)+24>>3];g=c[d+8>>2]|0;q=+(~~(+h[g+24>>3]+ +(c[(c[(c[l+8>>2]|0)+184>>2]|0)+((c[g+232>>2]|0)*44|0)+20>>2]|0))|0);if(!(n<o&p<q)){i=j;return}c[e>>2]=b+1;h[f+56+(b<<5)>>3]=n;h[f+56+(b<<5)+8>>3]=p;h[f+56+(b<<5)+16>>3]=o;h[f+56+(b<<5)+24>>3]=q;i=j;return}function Oo(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;j=i;i=i+32|0;k=j|0;l=Hx(d|0)|0;Do(k,a,d,0,e);a=f;m=k;c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2];c[a+16>>2]=c[m+16>>2];c[a+20>>2]=c[m+20>>2];c[a+24>>2]=c[m+24>>2];c[a+28>>2]=c[m+28>>2];n=+h[f>>3];o=+h[f+16>>3];c[f+48>>2]=1;if(g<<24>>24==0){gm(b,e,2,f,0)}else{em(b,e,2,f,0)}e=f+52|0;b=c[e>>2]|0;p=+h[f+56+(b-1<<5)+8>>3];g=c[d+8>>2]|0;q=+(~~(+h[g+24>>3]- +(c[(c[(c[l+8>>2]|0)+184>>2]|0)+((c[g+232>>2]|0)*44|0)+20>>2]|0))|0);if(!(n<o&q<p)){i=j;return}c[e>>2]=b+1;h[f+56+(b<<5)>>3]=n;h[f+56+(b<<5)+8>>3]=q;h[f+56+(b<<5)+16>>3]=o;h[f+56+(b<<5)+24>>3]=p;i=j;return}function Po(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b|0;f=Ax(a,$w(e)|0,1)|0;a=f|0;Wx(a,85112,304,1)|0;jw(e,a)|0;if((pl(b)|0)!=2){i=d;return f|0}e=b+8|0;b=kk((xF(c[c[(c[e>>2]|0)+104>>2]>>2]|0)|0)+3|0)|0;nb(b|0,80376,(g=i,i=i+8|0,c[g>>2]=c[c[(c[e>>2]|0)+104>>2]>>2],g)|0)|0;i=g;gw(a,166600,b)|0;i=d;return f|0}function Qo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0.0,j=0.0;d=c[(c[(c[a>>2]|0)+8>>2]|0)+96>>2]|0;a=c[(c[(c[b>>2]|0)+8>>2]|0)+96>>2]|0;b=(a|0)!=0;if((d|0)==0){e=b&1;return e|0}if(!b){e=-1;return e|0}f=+h[d+24>>3];g=+h[d+32>>3];i=+h[a+24>>3];j=+h[a+32>>3];if(f>i){e=-1;return e|0}if(f<i){e=1;return e|0}if(g>j){e=-1;return e|0}e=g<j|0;return e|0}function Ro(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=c[(c[a+8>>2]|0)+116>>2]|0;if((b|0)==0){d=a}else{a=b;while(1){b=c[(c[a+8>>2]|0)+116>>2]|0;if((b|0)==0){break}else{a=b}}d=a}a=c[d>>2]&3;b=c[(c[((a|0)==2?d:d-32|0)+28>>2]|0)+8>>2]|0;e=c[b+232>>2]|0;f=c[(c[((a|0)==3?d:d+32|0)+28>>2]|0)+8>>2]|0;d=c[f+232>>2]|0;if((e|0)>(d|0)){g=0;return g|0}if((e|0)<(d|0)){g=1;return g|0}g=(c[b+236>>2]|0)<(c[f+236>>2]|0)|0;return g|0}function So(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=(c[a+8>>2]|0)+180|0;e=(c[b+8>>2]|0)+172|0;f=c[d>>2]|0;g=c[d+4>>2]|0;d=c[e>>2]|0;h=c[e+4>>2]|0;if(!((g|0)>0&(h|0)>0)){i=0;return i|0}if((g|0)<(h|0)){h=c[f>>2]|0;if((h|0)==0){i=0;return i|0}else{j=0;k=h}while(1){h=j+1|0;if((c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0)==(b|0)){i=k;l=9;break}g=c[f+(h<<2)>>2]|0;if((g|0)==0){i=0;l=9;break}else{j=h;k=g}}if((l|0)==9){return i|0}}else{k=c[d>>2]|0;if((k|0)==0){i=0;return i|0}else{m=0;n=k}while(1){k=m+1|0;if((c[((c[n>>2]&3|0)==3?n:n+32|0)+28>>2]|0)==(a|0)){i=n;l=9;break}j=c[d+(k<<2)>>2]|0;if((j|0)==0){i=0;l=9;break}else{m=k;n=j}}if((l|0)==9){return i|0}}return 0}function To(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=(c[a+8>>2]|0)+188|0;e=(c[b+8>>2]|0)+196|0;f=c[d>>2]|0;g=c[d+4>>2]|0;d=c[e>>2]|0;h=c[e+4>>2]|0;if(!((g|0)>0&(h|0)>0)){i=0;return i|0}if((g|0)<(h|0)){h=c[f>>2]|0;if((h|0)==0){i=0;return i|0}else{j=0;k=h}while(1){h=j+1|0;if((c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0)==(b|0)){i=k;l=9;break}g=c[f+(h<<2)>>2]|0;if((g|0)==0){i=0;l=9;break}else{j=h;k=g}}if((l|0)==9){return i|0}}else{k=c[d>>2]|0;if((k|0)==0){i=0;return i|0}else{m=0;n=k}while(1){k=m+1|0;if((c[((c[n>>2]&3|0)==3?n:n+32|0)+28>>2]|0)==(a|0)){i=n;l=9;break}j=c[d+(k<<2)>>2]|0;if((j|0)==0){i=0;l=9;break}else{m=k;n=j}}if((l|0)==9){return i|0}}return 0}function Uo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a;d=a+32|0;e=(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+180|0;f=c[e>>2]|0;if((f|0)==0){g=kk((c[e+4>>2]<<2)+8|0)|0}else{g=mk(f,(c[e+4>>2]<<2)+8|0)|0}c[(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+180>>2]=g;g=(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+184|0;e=c[g>>2]|0;c[g>>2]=e+1;c[(c[(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+180>>2]|0)+(e<<2)>>2]=a;e=(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+180|0;c[(c[e>>2]|0)+(c[e+4>>2]<<2)>>2]=0;e=a-32|0;d=(c[(c[((c[b>>2]&3|0)==2?a:e)+28>>2]|0)+8>>2]|0)+172|0;g=c[d>>2]|0;if((g|0)==0){h=kk((c[d+4>>2]<<2)+8|0)|0}else{h=mk(g,(c[d+4>>2]<<2)+8|0)|0}c[(c[(c[((c[b>>2]&3|0)==2?a:e)+28>>2]|0)+8>>2]|0)+172>>2]=h;h=(c[(c[((c[b>>2]&3|0)==2?a:e)+28>>2]|0)+8>>2]|0)+176|0;d=c[h>>2]|0;c[h>>2]=d+1;c[(c[(c[(c[((c[b>>2]&3|0)==2?a:e)+28>>2]|0)+8>>2]|0)+172>>2]|0)+(d<<2)>>2]=a;d=(c[(c[((c[b>>2]&3|0)==2?a:e)+28>>2]|0)+8>>2]|0)+172|0;c[(c[d>>2]|0)+(c[d+4>>2]<<2)>>2]=0;return a|0}function Vo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((a|0)==0){cc(95824,144408,117,170808)}b=a;d=c[b>>2]|0;e=(c[(c[((d&3|0)==3?a:a+32|0)+28>>2]|0)+8>>2]|0)+180|0;f=e+4|0;g=f;h=c[g>>2]|0;a:do{if((h|0)>0){i=c[e>>2]|0;j=0;while(1){k=i+(j<<2)|0;l=j+1|0;if((c[k>>2]|0)==(a|0)){break}if((l|0)<(h|0)){j=l}else{m=d;break a}}j=h-1|0;c[f>>2]=j;c[k>>2]=c[i+(j<<2)>>2];c[(c[e>>2]|0)+(c[g>>2]<<2)>>2]=0;m=c[b>>2]|0}else{m=d}}while(0);d=(c[(c[((m&3|0)==2?a:a-32|0)+28>>2]|0)+8>>2]|0)+172|0;m=d+4|0;b=m;g=c[b>>2]|0;if((g|0)<=0){return}e=c[d>>2]|0;k=0;while(1){n=e+(k<<2)|0;f=k+1|0;if((c[n>>2]|0)==(a|0)){break}if((f|0)<(g|0)){k=f}else{o=13;break}}if((o|0)==13){return}o=g-1|0;c[m>>2]=o;c[n>>2]=c[e+(o<<2)>>2];c[(c[d>>2]|0)+(c[b>>2]<<2)>>2]=0;return}function Wo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a;d=a+32|0;e=(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+204|0;f=c[e>>2]|0;if((f|0)==0){g=kk((c[e+4>>2]<<2)+8|0)|0}else{g=mk(f,(c[e+4>>2]<<2)+8|0)|0}c[(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+204>>2]=g;g=(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+208|0;e=c[g>>2]|0;c[g>>2]=e+1;c[(c[(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+204>>2]|0)+(e<<2)>>2]=a;e=(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+204|0;c[(c[e>>2]|0)+(c[e+4>>2]<<2)>>2]=0;return}function Xo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=(c[(c[((c[a>>2]&3|0)==3?a:a+32|0)+28>>2]|0)+8>>2]|0)+204|0;d=b+4|0;e=d;f=c[e>>2]|0;g=c[b>>2]|0;h=g;a:do{if((f|0)>0){i=0;while(1){j=i+1|0;if((c[h+(i<<2)>>2]|0)==(a|0)){break}if((j|0)<(f|0)){i=j}else{break a}}return}}while(0);if((g|0)==0){k=kk((f<<2)+8|0)|0}else{k=mk(g,(f<<2)+8|0)|0}c[b>>2]=k;f=c[e>>2]|0;c[d>>2]=f+1;c[k+(f<<2)>>2]=a;c[(c[b>>2]|0)+(c[e>>2]<<2)>>2]=0;return}function Yo(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=jk(64)|0;h=g+32|0;i=h;c[i>>2]=c[i>>2]|3;j=g;k=g;c[k>>2]=c[k>>2]&-4|2;l=g+8|0;c[l>>2]=jk(176)|0;m=h;c[((c[k>>2]&3|0)==3?j:m)+28>>2]=d;d=g-32|0;c[((c[k>>2]&3|0)==2?j:d)+28>>2]=e;a[(c[l>>2]|0)+112|0]=1;if((f|0)==0){c[(c[l>>2]|0)+156>>2]=1;b[(c[l>>2]|0)+154>>1]=1;b[(c[l>>2]|0)+168>>1]=1;b[(c[l>>2]|0)+170>>1]=1;return j|0}e=f;c[k>>2]=c[k>>2]&15|c[e>>2]&-16;c[i>>2]=c[i>>2]&15|c[e>>2]&-16;i=f+8|0;b[(c[l>>2]|0)+168>>1]=b[(c[i>>2]|0)+168>>1]|0;b[(c[l>>2]|0)+154>>1]=b[(c[i>>2]|0)+154>>1]|0;c[(c[l>>2]|0)+156>>2]=c[(c[i>>2]|0)+156>>2];b[(c[l>>2]|0)+170>>1]=b[(c[i>>2]|0)+170>>1]|0;h=c[((c[k>>2]&3|0)==3?j:m)+28>>2]|0;m=c[e>>2]&3;n=f+32|0;do{if((h|0)==(c[((m|0)==3?f:n)+28>>2]|0)){o=(c[l>>2]|0)+16|0;p=(c[i>>2]|0)+16|0;c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];c[o+16>>2]=c[p+16>>2];c[o+20>>2]=c[p+20>>2];c[o+24>>2]=c[p+24>>2];c[o+28>>2]=c[p+28>>2];c[o+32>>2]=c[p+32>>2];c[o+36>>2]=c[p+36>>2];q=f-32|0}else{p=f-32|0;if((h|0)!=(c[((m|0)==2?f:p)+28>>2]|0)){q=p;break}o=(c[l>>2]|0)+16|0;r=(c[i>>2]|0)+56|0;c[o>>2]=c[r>>2];c[o+4>>2]=c[r+4>>2];c[o+8>>2]=c[r+8>>2];c[o+12>>2]=c[r+12>>2];c[o+16>>2]=c[r+16>>2];c[o+20>>2]=c[r+20>>2];c[o+24>>2]=c[r+24>>2];c[o+28>>2]=c[r+28>>2];c[o+32>>2]=c[r+32>>2];c[o+36>>2]=c[r+36>>2];q=p}}while(0);m=c[((c[k>>2]&3|0)==2?j:d)+28>>2]|0;d=c[e>>2]&3;do{if((m|0)==(c[((d|0)==2?f:q)+28>>2]|0)){e=(c[l>>2]|0)+56|0;k=(c[i>>2]|0)+56|0;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];c[e+8>>2]=c[k+8>>2];c[e+12>>2]=c[k+12>>2];c[e+16>>2]=c[k+16>>2];c[e+20>>2]=c[k+20>>2];c[e+24>>2]=c[k+24>>2];c[e+28>>2]=c[k+28>>2];c[e+32>>2]=c[k+32>>2];c[e+36>>2]=c[k+36>>2]}else{if((m|0)!=(c[((d|0)==3?f:n)+28>>2]|0)){break}k=(c[l>>2]|0)+56|0;e=(c[i>>2]|0)+16|0;c[k>>2]=c[e>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];c[k+16>>2]=c[e+16>>2];c[k+20>>2]=c[e+20>>2];c[k+24>>2]=c[e+24>>2];c[k+28>>2]=c[e+28>>2];c[k+32>>2]=c[e+32>>2];c[k+36>>2]=c[e+36>>2]}}while(0);n=(c[i>>2]|0)+172|0;if((c[n>>2]|0)==0){c[n>>2]=g}c[(c[l>>2]|0)+116>>2]=f;return j|0}function Zo(a,b,c){a=a|0;b=b|0;c=c|0;return Uo(Yo(a,b,c)|0)|0}function _o(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+8|0;a=b+8|0;c[(c[a>>2]|0)+164>>2]=c[(c[d>>2]|0)+180>>2];e=c[(c[a>>2]|0)+164>>2]|0;if((e|0)!=0){c[(c[e+8>>2]|0)+168>>2]=b}c[(c[d>>2]|0)+180>>2]=b;c[(c[a>>2]|0)+168>>2]=0;if((c[(c[a>>2]|0)+164>>2]|0)==(b|0)){cc(120656,144408,215,170688)}else{return}}function $o(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if((a|0)==(b|0)){cc(112448,144408,220,170672)}d=b+8|0;e=(c[d>>2]|0)+164|0;if((c[e>>2]|0)!=0){cc(105872,144408,221,170672)}f=a+8|0;c[e>>2]=c[(c[f>>2]|0)+164>>2];e=c[(c[f>>2]|0)+164>>2]|0;if((e|0)!=0){c[(c[e+8>>2]|0)+168>>2]=b}c[(c[d>>2]|0)+168>>2]=a;c[(c[f>>2]|0)+164>>2]=b;return}function ap(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=a+8|0;a=c[(c[d>>2]|0)+180>>2]|0;e=a;if((a|0)==0|(e|0)==(b|0)){f=e}else{e=a;while(1){a=c[(c[e+8>>2]|0)+164>>2]|0;g=a;if((a|0)==0|(g|0)==(b|0)){f=g;break}else{e=a}}}if((f|0)==0){cc(100160,144408,231,170784)}f=b+8|0;b=c[f>>2]|0;e=c[b+164>>2]|0;if((e|0)==0){h=b;i=0}else{c[(c[e+8>>2]|0)+168>>2]=c[b+168>>2];b=c[f>>2]|0;h=b;i=c[b+164>>2]|0}b=c[h+168>>2]|0;if((b|0)==0){c[(c[d>>2]|0)+180>>2]=i;return}else{c[(c[b+8>>2]|0)+164>>2]=i;return}}function bp(b){b=b|0;var d=0,e=0,f=0;d=jk(52)|0;e=d;c[e>>2]=c[e>>2]&-4|1;e=jk(304)|0;f=d+8|0;c[f>>2]=e;c[d+12>>2]=b;a[e+156|0]=1;h[(c[f>>2]|0)+96>>3]=1.0;h[(c[f>>2]|0)+88>>3]=1.0;h[(c[f>>2]|0)+80>>3]=1.0;c[(c[f>>2]|0)+216>>2]=1;c[(c[f>>2]|0)+176>>2]=0;e=jk(20)|0;c[(c[f>>2]|0)+172>>2]=e;c[(c[f>>2]|0)+184>>2]=0;e=jk(20)|0;c[(c[f>>2]|0)+180>>2]=e;e=b+8|0;c[(c[f>>2]|0)+164>>2]=c[(c[e>>2]|0)+180>>2];b=c[(c[f>>2]|0)+164>>2]|0;if((b|0)!=0){c[(c[b+8>>2]|0)+168>>2]=d}b=d;c[(c[e>>2]|0)+180>>2]=b;c[(c[f>>2]|0)+168>>2]=0;if((c[(c[f>>2]|0)+164>>2]|0)==(b|0)){cc(120656,144408,215,170688);return 0}else{b=(c[e>>2]|0)+220|0;c[b>>2]=(c[b>>2]|0)+1;return d|0}return 0}function cp(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=d;f=d+32|0;g=(c[(c[((c[e>>2]&3|0)==3?d:f)+28>>2]|0)+8>>2]|0)+188|0;h=c[g>>2]|0;if((h|0)==0){i=kk((c[g+4>>2]<<2)+8|0)|0}else{i=mk(h,(c[g+4>>2]<<2)+8|0)|0}c[(c[(c[((c[e>>2]&3|0)==3?d:f)+28>>2]|0)+8>>2]|0)+188>>2]=i;i=(c[(c[((c[e>>2]&3|0)==3?d:f)+28>>2]|0)+8>>2]|0)+192|0;g=c[i>>2]|0;c[i>>2]=g+1;c[(c[(c[(c[((c[e>>2]&3|0)==3?d:f)+28>>2]|0)+8>>2]|0)+188>>2]|0)+(g<<2)>>2]=d;g=(c[(c[((c[e>>2]&3|0)==3?d:f)+28>>2]|0)+8>>2]|0)+188|0;c[(c[g>>2]|0)+(c[g+4>>2]<<2)>>2]=0;g=d-32|0;f=(c[(c[((c[e>>2]&3|0)==2?d:g)+28>>2]|0)+8>>2]|0)+196|0;i=c[f>>2]|0;if((i|0)==0){j=kk((c[f+4>>2]<<2)+8|0)|0}else{j=mk(i,(c[f+4>>2]<<2)+8|0)|0}c[(c[(c[((c[e>>2]&3|0)==2?d:g)+28>>2]|0)+8>>2]|0)+196>>2]=j;j=(c[(c[((c[e>>2]&3|0)==2?d:g)+28>>2]|0)+8>>2]|0)+200|0;f=c[j>>2]|0;c[j>>2]=f+1;c[(c[(c[(c[((c[e>>2]&3|0)==2?d:g)+28>>2]|0)+8>>2]|0)+196>>2]|0)+(f<<2)>>2]=d;f=(c[(c[((c[e>>2]&3|0)==2?d:g)+28>>2]|0)+8>>2]|0)+196|0;c[(c[f>>2]|0)+(c[f+4>>2]<<2)>>2]=0;a[(c[b+8>>2]|0)+228|0]=1;a[(c[(Ix(b|0)|0)+8>>2]|0)+228|0]=1;return}function dp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((a|0)==0){cc(95824,144408,269,170760)}b=c[(c[a+8>>2]|0)+116>>2]|0;do{if((b|0)!=0){d=(c[b+8>>2]|0)+172|0;if((c[d>>2]|0)!=(a|0)){break}c[d>>2]=0}}while(0);b=a;d=c[b>>2]|0;e=(c[(c[((d&3|0)==3?a:a+32|0)+28>>2]|0)+8>>2]|0)+188|0;f=e+4|0;g=f;h=c[g>>2]|0;a:do{if((h|0)>0){i=c[e>>2]|0;j=0;while(1){k=i+(j<<2)|0;l=j+1|0;if((c[k>>2]|0)==(a|0)){break}if((l|0)<(h|0)){j=l}else{m=d;break a}}j=h-1|0;c[f>>2]=j;c[k>>2]=c[i+(j<<2)>>2];c[(c[e>>2]|0)+(c[g>>2]<<2)>>2]=0;m=c[b>>2]|0}else{m=d}}while(0);d=(c[(c[((m&3|0)==2?a:a-32|0)+28>>2]|0)+8>>2]|0)+196|0;m=d+4|0;b=m;g=c[b>>2]|0;if((g|0)<=0){return}e=c[d>>2]|0;k=0;while(1){n=e+(k<<2)|0;f=k+1|0;if((c[n>>2]|0)==(a|0)){break}if((f|0)<(g|0)){k=f}else{o=16;break}}if((o|0)==16){return}o=g-1|0;c[m>>2]=o;c[n>>2]=c[e+(o<<2)>>2];c[(c[d>>2]|0)+(c[b>>2]<<2)>>2]=0;return}function ep(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=a+8|0;a=(c[g>>2]|0)+172|0;h=c[a>>2]|0;if((h|0)==(d|0)){Fv(0,94472,(j=i,i=i+1|0,i=i+7&-8,c[j>>2]=0,j)|0)|0;i=j;i=f;return}if((h|0)!=0){cc(89112,144408,340,170264)}c[a>>2]=d;a=(c[d+8>>2]|0)+170|0;h=b[(c[g>>2]|0)+170>>1]|0;if((e[a>>1]|0)>>>0<(h&65535)>>>0){b[a>>1]=h;k=d}else{k=d}while(1){d=k+8|0;h=(c[d>>2]|0)+168|0;b[h>>1]=(b[h>>1]|0)+(b[(c[g>>2]|0)+168>>1]|0);h=(c[d>>2]|0)+154|0;b[h>>1]=(b[h>>1]|0)+(b[(c[g>>2]|0)+154>>1]|0);h=(c[d>>2]|0)+156|0;c[h>>2]=(c[h>>2]|0)+(c[(c[g>>2]|0)+156>>2]|0);h=c[(c[d>>2]|0)+172>>2]|0;if((h|0)==0){break}k=h}i=f;return}function fp(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;e=d+8|0;d=c[e>>2]|0;f=c[d+172>>2]|0;if((f|0)==0){g=d;h=g+172|0;c[h>>2]=0;return}else{i=f;j=d}while(1){d=i;f=i+8|0;k=(c[f>>2]|0)+168|0;b[k>>1]=(b[k>>1]|0)-(b[j+168>>1]|0);k=(c[f>>2]|0)+154|0;b[k>>1]=(b[k>>1]|0)-(b[(c[e>>2]|0)+154>>1]|0);k=(c[f>>2]|0)+156|0;c[k>>2]=(c[k>>2]|0)-(c[(c[e>>2]|0)+156>>2]|0);k=c[f>>2]|0;f=c[k+172>>2]|0;do{if((b[k+168>>1]|0)==0){l=i;m=c[l>>2]|0;n=i+32|0;o=(c[(c[((m&3|0)==3?d:n)+28>>2]|0)+8>>2]|0)+180|0;p=c[o>>2]|0;q=c[p>>2]|0;if((q|0)==0){r=m}else{s=0;t=o;o=q;q=p;p=m;while(1){a:do{if((o|0)==(d|0)){m=t+4|0;u=m;v=c[u>>2]|0;if((v|0)<=0){w=p;break}x=q;y=0;while(1){z=x+(y<<2)|0;A=y+1|0;if((c[z>>2]|0)==(d|0)){break}if((A|0)<(v|0)){y=A}else{w=p;break a}}y=v-1|0;c[m>>2]=y;c[z>>2]=c[x+(y<<2)>>2];c[(c[t>>2]|0)+(c[u>>2]<<2)>>2]=0;w=c[l>>2]|0}else{w=p}}while(0);y=s+1|0;A=(c[(c[((w&3|0)==3?d:n)+28>>2]|0)+8>>2]|0)+180|0;B=c[A>>2]|0;C=c[B+(y<<2)>>2]|0;if((C|0)==0){r=w;break}else{s=y;t=A;o=C;q=B;p=w}}}p=i-32|0;q=(c[(c[((r&3|0)==2?d:p)+28>>2]|0)+8>>2]|0)+172|0;o=c[q>>2]|0;t=c[o>>2]|0;if((t|0)==0){break}else{D=0;E=q;F=t;G=o;H=r}while(1){b:do{if((F|0)==(d|0)){o=E+4|0;t=o;q=c[t>>2]|0;if((q|0)<=0){I=H;break}s=G;n=0;while(1){J=s+(n<<2)|0;B=n+1|0;if((c[J>>2]|0)==(d|0)){break}if((B|0)<(q|0)){n=B}else{I=H;break b}}n=q-1|0;c[o>>2]=n;c[J>>2]=c[s+(n<<2)>>2];c[(c[E>>2]|0)+(c[t>>2]<<2)>>2]=0;I=c[l>>2]|0}else{I=H}}while(0);n=D+1|0;u=(c[(c[((I&3|0)==2?d:p)+28>>2]|0)+8>>2]|0)+172|0;x=c[u>>2]|0;m=c[x+(n<<2)>>2]|0;if((m|0)==0){break}else{D=n;E=u;F=m;G=x;H=I}}}}while(0);c:do{if((a[(c[i+8>>2]|0)+112|0]|0)==1){k=d;do{p=c[(c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0)+8>>2]|0;if((a[p+156|0]|0)!=1){break c}l=p+180|0;if((c[l+4>>2]|0)!=1){break c}k=c[c[l>>2]>>2]|0;l=k+8|0;p=(c[l>>2]|0)+168|0;b[p>>1]=(b[p>>1]|0)-(b[(c[e>>2]|0)+168>>1]|0);p=(c[l>>2]|0)+154|0;b[p>>1]=(b[p>>1]|0)-(b[(c[e>>2]|0)+154>>1]|0);p=(c[l>>2]|0)+156|0;c[p>>2]=(c[p>>2]|0)-(c[(c[e>>2]|0)+156>>2]|0);}while((a[(c[l>>2]|0)+112|0]|0)==1)}}while(0);d=c[e>>2]|0;if((f|0)==0){g=d;break}else{i=f;j=d}}h=g+172|0;c[h>>2]=0;return}function gp(d){d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,Z=0.0;e=d+8|0;f=c[e>>2]|0;g=c[f+180>>2]|0;if((g|0)==0){i=f}else{f=g;do{g=f+8|0;j=c[g>>2]|0;k=c[j+188>>2]|0;do{if((k|0)==0){l=j}else{m=c[k>>2]|0;if((m|0)==0){l=j;break}else{n=0;o=m}while(1){m=c[o>>2]&3;p=c[((m|0)==3?o:o+32|0)+28>>2]|0;q=c[p+8>>2]|0;r=c[q+236>>2]|0;s=c[(c[(c[((m|0)==2?o:o-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;m=(r|0)<(s|0);t=m?s:r;u=c[q+232>>2]|0;q=Hx(p|0)|0;p=(m?r:s)+1|0;a:do{if((p|0)<(t|0)){s=c[(c[(c[q+8>>2]|0)+184>>2]|0)+(u*44|0)+4>>2]|0;r=p;while(1){m=c[(c[s+(r<<2)>>2]|0)+8>>2]|0;v=a[m+156|0]|0;if((v<<24>>24|0)==1){if((c[m+104>>2]|0)!=0){w=r;break a}}else if((v<<24>>24|0)==0){w=r;break a}v=r+1|0;if((v|0)<(t|0)){r=v}else{w=v;break}}}else{w=p}}while(0);if((w|0)==(t|0)){p=o;do{u=p+8|0;a[(c[u>>2]|0)+113|0]=1;p=c[(c[u>>2]|0)+172>>2]|0;}while((p|0)!=0)}p=n+1|0;t=c[g>>2]|0;u=c[(c[t+188>>2]|0)+(p<<2)>>2]|0;if((u|0)==0){l=t;break}else{n=p;o=u}}}}while(0);j=l+204|0;if((c[j+4>>2]|0)>0){k=0;u=j;while(1){j=c[(c[u>>2]|0)+(k<<2)>>2]|0;p=c[j>>2]&3;t=c[(c[((p|0)==2?j:j-32|0)+28>>2]|0)+8>>2]|0;q=c[t+232>>2]|0;r=c[((p|0)==3?j:j+32|0)+28>>2]|0;p=c[r+8>>2]|0;do{if((q|0)==(c[p+232>>2]|0)){s=c[p+236>>2]|0;v=c[t+236>>2]|0;m=(s|0)<(v|0);x=m?v:s;y=Hx(r|0)|0;z=(m?s:v)+1|0;b:do{if((z|0)<(x|0)){v=c[(c[(c[y+8>>2]|0)+184>>2]|0)+(q*44|0)+4>>2]|0;s=z;while(1){m=c[(c[v+(s<<2)>>2]|0)+8>>2]|0;A=a[m+156|0]|0;if((A<<24>>24|0)==1){if((c[m+104>>2]|0)!=0){B=s;break b}}else if((A<<24>>24|0)==0){B=s;break b}A=s+1|0;if((A|0)<(x|0)){s=A}else{B=A;break}}}else{B=z}}while(0);if((B|0)==(x|0)){C=j}else{break}do{z=C+8|0;a[(c[z>>2]|0)+113|0]=1;C=c[(c[z>>2]|0)+172>>2]|0;}while((C|0)!=0)}}while(0);j=k+1|0;q=c[g>>2]|0;r=q+204|0;if((j|0)<(c[r+4>>2]|0)){k=j;u=r}else{D=q;break}}}else{D=l}f=c[D+164>>2]|0;}while((f|0)!=0);i=c[e>>2]|0}f=c[i+184>>2]|0;if((c[f+40>>2]|0)==0){if((c[i+172>>2]|0)>0){E=26}}else{E=26}c:do{if((E|0)==26){D=c[f+4>>2]|0;l=c[D>>2]|0;if((l|0)==0){break}else{F=0;G=l}d:while(1){l=c[(c[G+8>>2]|0)+196>>2]|0;C=c[l>>2]|0;if((C|0)!=0){B=0;o=C;do{C=c[o+8>>2]|0;if((c[C+96>>2]|0)!=0){if((a[C+113|0]|0)==0){break d}}B=B+1|0;o=c[l+(B<<2)>>2]|0;}while((o|0)!=0)}F=F+1|0;G=c[D+(F<<2)>>2]|0;if((G|0)==0){break c}}if((b[i+224>>1]|0)!=0){cc(118328,135760,190,171056);return 0}D=(b[i+226>>1]|0)+3|0;if((f|0)==0){H=kk(D*44|0)|0}else{H=mk(f,D*44|0)|0}c[(c[e>>2]|0)+184>>2]=H+44;D=c[e>>2]|0;o=b[D+226>>1]|0;B=o<<16>>16;l=c[D+184>>2]|0;if(o<<16>>16>-1){o=B;D=l;while(1){C=o-1|0;tF(D+(o*44|0)|0,D+(C*44|0)|0,44)|0;n=c[(c[e>>2]|0)+184>>2]|0;if((o|0)>0){o=C;D=n}else{I=-1;J=n;break}}}else{I=B;J=l}c[J+(I*44|0)+8>>2]=0;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)>>2]=0;D=jk(8)|0;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+12>>2]=D;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+4>>2]=D;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+40>>2]=0;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+20>>2]=1;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+16>>2]=1;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+28>>2]=1;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+24>>2]=1;D=(c[e>>2]|0)+224|0;b[D>>1]=(b[D>>1]|0)-1}}while(0);mp(d);I=c[(c[e>>2]|0)+180>>2]|0;if((I|0)==0){K=0;return K|0}else{L=0;M=I}while(1){I=M+8|0;J=c[I>>2]|0;H=c[J+188>>2]|0;do{if((H|0)==0){N=L;O=J}else{f=c[H>>2]|0;if((f|0)==0){P=L;Q=J}else{i=0;G=L;F=f;while(1){f=c[F+8>>2]|0;E=c[f+96>>2]|0;do{if((E|0)==0){R=G}else{if((a[f+113|0]|0)==0){hp(F);R=1;break}if((c[(c[e>>2]|0)+116>>2]&1|0)==0){h[f+136>>3]=+h[E+24>>3];R=G;break}else{h[f+136>>3]=+h[E+32>>3];R=G;break}}}while(0);E=i+1|0;f=c[I>>2]|0;D=c[(c[f+188>>2]|0)+(E<<2)>>2]|0;if((D|0)==0){P=R;Q=f;break}else{i=E;G=R;F=D}}}F=Q+204|0;if((c[F+4>>2]|0)>0){S=0;T=P;U=F}else{N=P;O=Q;break}while(1){F=c[(c[U>>2]|0)+(S<<2)>>2]|0;G=c[F>>2]&3;i=c[((G|0)==3?F:F+32|0)+28>>2]|0;D=c[((G|0)==2?F:F-32|0)+28>>2]|0;do{if((c[(c[i+8>>2]|0)+232>>2]|0)!=(c[(c[D+8>>2]|0)+232>>2]|0)|(i|0)==(D|0)){V=T}else{G=F+8|0;E=c[G>>2]|0;f=c[E+172>>2]|0;if((f|0)==0){W=G;X=E}else{o=f;while(1){f=o+8|0;n=c[f>>2]|0;C=c[n+172>>2]|0;if((C|0)==0){W=f;X=n;break}else{o=C}}}a[E+113|0]=a[X+113|0]|0;o=c[G>>2]|0;C=c[o+96>>2]|0;if((C|0)==0){V=T;break}if((a[o+113|0]|0)==0){hp(F);V=1;break}else{Y=+h[((c[(c[e>>2]|0)+116>>2]&1|0)==0?C+24|0:C+32|0)>>3];C=(c[W>>2]|0)+136|0;Z=+h[C>>3];h[C>>3]=Y>Z?Y:Z;V=T;break}}}while(0);F=S+1|0;D=c[I>>2]|0;i=D+204|0;if((F|0)<(c[i+4>>2]|0)){S=F;T=V;U=i}else{N=V;O=D;break}}}}while(0);I=c[O+164>>2]|0;if((I|0)==0){break}else{L=N;M=I}}if((N|0)==0){K=0;return K|0}np(d);K=N;return K|0}function hp(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0,H=0.0,I=0.0,J=0;d=i;i=i+16|0;e=d|0;f=b+8|0;if((c[(c[f>>2]|0)+96>>2]|0)==0){i=d;return}g=b;j=b+32|0;k=Hx(c[((c[g>>2]&3|0)==3?b:j)+28>>2]|0)|0;l=c[g>>2]&3;m=c[(c[((l|0)==3?b:j)+28>>2]|0)+8>>2]|0;n=c[m+232>>2]|0;o=k+8|0;p=n-1|0;q=c[(c[o>>2]|0)+184>>2]|0;r=c[q+(p*44|0)+4>>2]|0;s=c[q+(p*44|0)>>2]|0;q=e+8|0;c[q>>2]=-1;t=e|0;c[t>>2]=-1;u=e+12|0;c[u>>2]=s;v=e+4|0;c[v>>2]=s;e=b-32|0;w=c[m+236>>2]|0;m=c[(c[(c[((l|0)==2?b:e)+28>>2]|0)+8>>2]|0)+236>>2]|0;l=(w|0)>(m|0);x=l?w:m;y=l?m:w;w=0;m=s;l=-1;z=s;while(1){s=m-1|0;if((w|0)>(s|0)){A=l;B=z;break}ip(c[(c[r+(w<<2)>>2]|0)+8>>2]|0,t,y,x);if((w|0)!=(s|0)){ip(c[(c[r+(s<<2)>>2]|0)+8>>2]|0,t,y,x)}C=c[v>>2]|0;D=c[t>>2]|0;if((C-D|0)<2){A=D;B=C;break}else{w=w+1|0;m=s;l=D;z=C}}if((A|0)>(B|0)){E=(c[u>>2]|0)+(c[q>>2]|0)|0}else{E=A+B|0}B=(E+1|0)/2|0;E=c[o>>2]|0;A=c[E+184>>2]|0;q=c[A+(p*44|0)+4>>2]|0;u=c[q>>2]|0;if((u|0)==0){F=+h[(c[(c[c[A+(n*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]+ +(c[A+(n*44|0)+20>>2]|0)+ +(c[E+240>>2]|0)}else{F=+h[(c[u+8>>2]|0)+24>>3]- +(c[A+(p*44|0)+16>>2]|0)}u=~~F;E=A+(p*44|0)|0;if((q|0)==0){G=kk((c[E>>2]<<2)+8|0)|0}else{G=mk(q,(c[E>>2]<<2)+8|0)|0}E=G;c[(c[(c[o>>2]|0)+184>>2]|0)+(p*44|0)+4>>2]=E;G=c[(c[(c[o>>2]|0)+184>>2]|0)+(p*44|0)>>2]|0;if((G|0)>(B|0)){q=G;while(1){G=q-1|0;A=c[E+(G<<2)>>2]|0;c[E+(q<<2)>>2]=A;n=(c[A+8>>2]|0)+236|0;c[n>>2]=(c[n>>2]|0)+1;if((G|0)>(B|0)){q=G}else{break}}}q=bp(k)|0;k=E+(B<<2)|0;c[k>>2]=q;G=q+8|0;c[(c[G>>2]|0)+236>>2]=B;c[(c[G>>2]|0)+232>>2]=p;G=(c[(c[o>>2]|0)+184>>2]|0)+(p*44|0)|0;B=(c[G>>2]|0)+1|0;c[G>>2]=B;c[E+(B<<2)>>2]=0;B=c[k>>2]|0;k=c[(c[f>>2]|0)+96>>2]|0;F=+h[k+24>>3];H=+h[k+32>>3];k=(c[(c[o>>2]|0)+116>>2]&1|0)==0;E=B+8|0;h[(c[E>>2]|0)+80>>3]=k?H:F;G=c[E>>2]|0;q=~~(+h[G+80>>3]*.5);I=(k?F:H)*.5;h[G+96>>3]=I;h[(c[E>>2]|0)+88>>3]=I;c[(c[E>>2]|0)+104>>2]=c[(c[f>>2]|0)+96>>2];h[(c[E>>2]|0)+24>>3]=+(q+u|0);u=Zo(B,c[((c[g>>2]&3|0)==3?b:j)+28>>2]|0,b)|0;f=u+8|0;h[(c[f>>2]|0)+16>>3]=-0.0- +h[(c[E>>2]|0)+88>>3];h[(c[f>>2]|0)+56>>3]=+h[(c[(c[((c[g>>2]&3|0)==3?b:j)+28>>2]|0)+8>>2]|0)+96>>3];a[(c[f>>2]|0)+112|0]=4;f=Zo(B,c[((c[g>>2]&3|0)==2?b:e)+28>>2]|0,b)|0;B=f+8|0;h[(c[B>>2]|0)+16>>3]=+h[(c[E>>2]|0)+96>>3];h[(c[B>>2]|0)+56>>3]=+h[(c[(c[((c[g>>2]&3|0)==2?b:e)+28>>2]|0)+8>>2]|0)+88>>3];a[(c[B>>2]|0)+112|0]=4;B=c[(c[o>>2]|0)+184>>2]|0;e=B+(p*44|0)+16|0;if((c[e>>2]|0)<(q|0)){c[e>>2]=q;J=c[(c[o>>2]|0)+184>>2]|0}else{J=B}B=J+(p*44|0)+20|0;if((c[B>>2]|0)<(q|0)){c[B>>2]=q}c[(c[E>>2]|0)+112>>2]=b;i=d;return}function ip(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((a[b+156|0]|0)!=1){return}g=c[b+236>>2]|0;h=b+180|0;if((c[b+176>>2]|0)!=0){b=c[h>>2]|0;i=c[b>>2]|0;if((i|0)==0){return}else{j=0;k=0;l=0;m=i}while(1){i=c[(c[(c[((c[m>>2]&3|0)==2?m:m-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if((i|0)>(e|0)){n=(i|0)<(f|0)?l:1;o=k}else{n=l;o=1}i=j+1|0;p=c[b+(i<<2)>>2]|0;if((p|0)==0){break}else{j=i;k=o;l=n;m=p}}if(o<<24>>24!=0&n<<24>>24==0){c[d>>2]=g+1}if(!(n<<24>>24!=0&o<<24>>24==0)){return}c[d+4>>2]=g-1;return}if((c[h+4>>2]|0)!=2){cc(80712,135760,63,169976)}o=c[h>>2]|0;h=c[o>>2]|0;n=c[o+4>>2]|0;o=c[(c[(c[((c[h>>2]&3|0)==2?h:h-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;h=c[(c[(c[((c[n>>2]&3|0)==2?n:n-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;n=(o|0)>(h|0);m=n?o:h;l=n?h:o;if((m|0)<=(e|0)){c[d>>2]=g;c[d+8>>2]=g;return}if((l|0)>=(f|0)){c[d+4>>2]=g;c[d+12>>2]=g;return}o=(l|0)<(e|0);h=(m|0)>(f|0);if(o&h){return}if(o){q=13}else{if((l|0)==(e|0)&(m|0)<(f|0)){q=13}}if((q|0)==13){c[d+8>>2]=g}do{if(!h){if((m|0)==(f|0)&(l|0)>(e|0)){break}return}}while(0);c[d+12>>2]=g;return}function jp(d,e){d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;f=i;if((a[213992]|0)!=0){ym()}a[172624]=0;c[53542]=d;g=d|0;j=((Mw(Ix(g)|0)|0)<<2)+4|0;c[53516]=jk(j)|0;c[53514]=jk(j)|0;c[53656]=8;c[53660]=24;h[21677]=.995;j=ew(g,149032)|0;do{if((j|0)!=0){k=+rF(j);if(k<=0.0){break}l=k*+(c[53656]|0);if(l<1.0){m=1}else{m=~~l}c[53656]=m;l=k*+(c[53660]|0);if(l<1.0){n=1}else{n=~~l}c[53660]=n}}while(0);n=d+8|0;m=c[n>>2]|0;if((b[m+128>>1]&16)!=0){j=(b[m+226>>1]|0)+2|0;m=jk(j<<2)|0;Ap(d,m,j,0)|0;eF(m)}Zn(d);qo(d,1);qp(d);xp(d);c[53706]=b[(c[n>>2]|0)+224>>1]|0;c[53708]=b[(c[n>>2]|0)+226>>1]|0;m=c[n>>2]|0;j=m+204|0;do{if((c[j+4>>2]|0)>0){p=0;q=0;r=m;s=j;do{c[r+180>>2]=c[(c[s>>2]|0)+(q<<2)>>2];do{if((q|0)>0){t=c[n>>2]|0;u=b[t+224>>1]|0;if(u<<16>>16>(b[t+226>>1]|0)){break}v=u<<16>>16;u=t;while(1){t=c[u+184>>2]|0;w=t+(v*44|0)+4|0;c[w>>2]=(c[w>>2]|0)+(c[t+(v*44|0)>>2]<<2);c[(c[(c[n>>2]|0)+184>>2]|0)+(v*44|0)>>2]=0;t=c[n>>2]|0;if((v|0)<(b[t+226>>1]|0)){v=v+1|0;u=t}else{break}}}}while(0);p=(kp(d,0,e)|0)+p|0;q=q+1|0;r=c[n>>2]|0;s=r+204|0;x=c[s+4>>2]|0;}while((q|0)<(x|0));if((x|0)<2){y=r;z=p;break}else{A=0;B=0;C=s}while(1){q=c[(c[C>>2]|0)+(A<<2)>>2]|0;if((B|0)!=0){c[(c[B+8>>2]|0)+164>>2]=q}u=q+8|0;c[(c[u>>2]|0)+168>>2]=B;v=c[(c[u>>2]|0)+164>>2]|0;if((v|0)==0){D=q}else{q=v;while(1){v=c[(c[q+8>>2]|0)+164>>2]|0;if((v|0)==0){break}else{q=v}}D=q}v=A+1|0;u=(c[n>>2]|0)+204|0;E=u+4|0;if((v|0)<(c[E>>2]|0)){A=v;B=D;C=u}else{break}}c[E>>2]=1;s=c[n>>2]|0;c[s+180>>2]=c[c[s+204>>2]>>2];b[(c[n>>2]|0)+224>>1]=c[53706];b[(c[n>>2]|0)+226>>1]=c[53708];y=c[n>>2]|0;z=p}else{y=m;z=0}}while(0);m=b[y+224>>1]|0;if(m<<16>>16>(b[y+226>>1]|0)){F=y}else{E=c[o>>2]|0;C=m<<16>>16;m=y;while(1){y=c[m+184>>2]|0;c[y+(C*44|0)>>2]=c[y+(C*44|0)+8>>2];y=c[(c[n>>2]|0)+184>>2]|0;c[y+(C*44|0)+4>>2]=c[y+(C*44|0)+12>>2];y=c[n>>2]|0;D=c[y+184>>2]|0;a:do{if((c[D+(C*44|0)>>2]|0)>0){B=0;A=D;x=y;while(1){j=c[(c[A+(C*44|0)+4>>2]|0)+(B<<2)>>2]|0;if((j|0)==0){break}c[(c[j+8>>2]|0)+236>>2]=B;j=B+1|0;s=c[n>>2]|0;r=c[s+184>>2]|0;if((j|0)<(c[r+(C*44|0)>>2]|0)){B=j;A=r;x=s}else{G=s;break a}}if((a[213992]|0)==0){H=x}else{A=$w(g)|0;q=c[(c[(c[n>>2]|0)+184>>2]|0)+(C*44|0)>>2]|0;gc(E|0,137088,(I=i,i=i+32|0,c[I>>2]=A,c[I+8>>2]=C,c[I+16>>2]=B,c[I+24>>2]=q,I)|0)|0;i=I;H=c[n>>2]|0}c[(c[H+184>>2]|0)+(C*44|0)>>2]=B;G=c[n>>2]|0}else{G=y}}while(0);if((C|0)<(b[G+226>>1]|0)){C=C+1|0;m=G}else{F=G;break}}}do{if((c[F+172>>2]|0)<1){J=z}else{G=z;m=1;C=F;while(1){K=(lp(c[(c[C+176>>2]|0)+(m<<2)>>2]|0,e)|0)+G|0;H=c[n>>2]|0;L=c[H+172>>2]|0;if((m|0)<(L|0)){G=K;m=m+1|0;C=H}else{break}}if((L|0)<=0){J=K;break}C=ew(g,79488)|0;if((C|0)!=0){if((Km(C)|0)<<24>>24==0){J=K;break}}go(d);a[172624]=1;J=kp(d,2,e)|0}}while(0);e=c[53514]|0;if((e|0)!=0){eF(e);c[53514]=0}e=c[53516]|0;if((e|0)!=0){eF(e);c[53516]=0}e=c[n>>2]|0;if((c[e+172>>2]|0)<1){M=e}else{d=1;K=e;while(1){np(c[(c[K+176>>2]|0)+(d<<2)>>2]|0);e=c[n>>2]|0;if((d|0)<(c[e+172>>2]|0)){d=d+1|0;K=e}else{M=e;break}}}K=b[M+224>>1]|0;if(K<<16>>16<=(b[M+226>>1]|0)){d=K<<16>>16;K=M;while(1){M=c[K+184>>2]|0;if((c[M+(d*44|0)>>2]|0)>0){e=0;L=M;while(1){F=(c[(c[L+(d*44|0)+4>>2]|0)+(e<<2)>>2]|0)+8|0;c[(c[F>>2]|0)+236>>2]=e;z=c[F>>2]|0;C=c[z+188>>2]|0;do{if((C|0)!=0){m=c[C>>2]|0;if((m|0)==0){break}else{N=0;O=m;P=z}while(1){m=O+8|0;if((a[(c[m>>2]|0)+112|0]|0)==4){dp(O);eF(c[m>>2]|0);eF(O|0);Q=N-1|0;R=c[F>>2]|0}else{Q=N;R=P}m=Q+1|0;G=c[(c[R+188>>2]|0)+(m<<2)>>2]|0;if((G|0)==0){break}else{N=m;O=G;P=R}}}}while(0);F=e+1|0;z=c[n>>2]|0;C=c[z+184>>2]|0;if((F|0)<(c[C+(d*44|0)>>2]|0)){e=F;L=C}else{S=C;T=z;break}}}else{S=M;T=K}L=c[S+(d*44|0)+40>>2]|0;if((L|0)==0){U=T}else{eF(c[L+8>>2]|0);eF(L);U=c[n>>2]|0}if((d|0)<(b[U+226>>1]|0)){d=d+1|0;K=U}else{break}}}if((a[213992]|0)==0){i=f;return}U=c[o>>2]|0;K=$w(g)|0;l=+zm();gc(U|0,139784,(I=i,i=i+24|0,c[I>>2]=K,c[I+8>>2]=J,h[I+16>>3]=l,I)|0)|0;i=I;i=f;return}function kp(e,f,g){e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0;j=i;if((f|0)>1){k=up(0)|0;l=c[(c[e+8>>2]|0)+180>>2]|0;if((l|0)!=0){m=l;do{l=m+8|0;n=c[l>>2]|0;h[n+16>>3]=+(c[n+236>>2]|0);m=c[(c[l>>2]|0)+164>>2]|0;}while((m|0)!=0)}if((f|0)<3){p=k;q=5}else{r=k;s=k;t=0}}else{p=2147483647;q=5}a:do{if((q|0)==5){k=e|0;m=e+8|0;l=c[o>>2]|0;n=f;u=p;v=p;while(1){w=c[53660]|0;do{if((n|0)<2){x=(w|0)>4?4:w;if((Ix(k)|0)==(e|0)){sp(e,n)}if((n|0)==0){Bp(e)}Cp(e);y=up(0)|0;if((y|0)>(v|0)){z=v;A=y;B=x;break}C=c[(c[m>>2]|0)+180>>2]|0;if((C|0)==0){z=y;A=y;B=x;break}else{D=C}while(1){C=D+8|0;E=c[C>>2]|0;h[E+16>>3]=+(c[E+236>>2]|0);E=c[(c[C>>2]|0)+164>>2]|0;if((E|0)==0){z=y;A=y;B=x;break}else{D=E}}}else{if((u|0)<=(v|0)){z=v;A=v;B=w;break}x=c[m>>2]|0;y=c[x+180>>2]|0;if((y|0)==0){F=x}else{x=y;do{y=x+8|0;E=c[y>>2]|0;c[E+236>>2]=~~+h[E+16>>3];x=c[(c[y>>2]|0)+164>>2]|0;}while((x|0)!=0);F=c[m>>2]|0}x=b[F+224>>1]|0;if(x<<16>>16>(b[F+226>>1]|0)){z=v;A=v;B=w;break}y=x<<16>>16;while(1){a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(y*44|0)+33|0]=0;x=c[(c[m>>2]|0)+184>>2]|0;Jb(c[x+(y*44|0)+4>>2]|0,c[x+(y*44|0)>>2]|0,4,56);if((y|0)<(b[(c[m>>2]|0)+226>>1]|0)){y=y+1|0}else{z=v;A=v;B=w;break}}}}while(0);b:do{if((B|0)>0){w=0;y=0;x=A;E=z;while(1){if((a[213992]|0)!=0){gc(l|0,134200,(C=i,i=i+40|0,c[C>>2]=n,c[C+8>>2]=w,c[C+16>>2]=y,c[C+24>>2]=x,c[C+32>>2]=E,C)|0)|0;i=C}C=y+1|0;if((y|0)>=(c[53656]|0)|(x|0)==0){G=x;H=E;break b}I=((w|0)%4|0|0)<2;J=I&1;K=c[m>>2]|0;if((w&1|0)==0){L=b[K+224>>1]|0;M=1;N=K+226|0;O=(L<<16>>16<=(b[(c[(c[53542]|0)+8>>2]|0)+224>>1]|0))+(L<<16>>16)|0}else{L=b[K+226>>1]|0;M=-1;N=K+224|0;O=((L<<16>>16>=(b[(c[(c[53542]|0)+8>>2]|0)+226>>1]|0))<<31>>31)+(L<<16>>16)|0}L=(b[N>>1]|0)+M|0;c:do{if((O|0)!=(L|0)){P=(M|0)<0;Q=I^1;R=O;S=K;while(1){T=c[53514]|0;U=c[S+184>>2]|0;V=c[U+(R*44|0)+4>>2]|0;do{if((c[U+(R*44|0)>>2]|0)>0){W=T;X=T+4|0;Y=0;do{Z=(c[V+(Y<<2)>>2]|0)+8|0;_=c[Z>>2]|0;do{if(P){$=c[c[_+180>>2]>>2]|0;if(($|0)==0){aa=_;q=44;break}else{ba=0;ca=0;ea=$;fa=_}while(1){$=c[ea+8>>2]|0;if((b[$+154>>1]|0)>0){c[T+(ca<<2)>>2]=d[$+88|0]|c[(c[(c[((c[ea>>2]&3|0)==2?ea:ea-32|0)+28>>2]|0)+8>>2]|0)+236>>2]<<8;ga=ca+1|0;ha=c[Z>>2]|0}else{ga=ca;ha=fa}$=ba+1|0;ia=c[(c[ha+180>>2]|0)+($<<2)>>2]|0;if((ia|0)==0){ja=ga;ka=ha;q=43;break}else{ba=$;ca=ga;ea=ia;fa=ha}}}else{ia=c[c[_+172>>2]>>2]|0;if((ia|0)==0){aa=_;q=44;break}else{la=0;ma=0;na=ia;oa=_}while(1){ia=c[na+8>>2]|0;if((b[ia+154>>1]|0)>0){c[T+(ma<<2)>>2]=d[ia+48|0]|c[(c[(c[((c[na>>2]&3|0)==3?na:na+32|0)+28>>2]|0)+8>>2]|0)+236>>2]<<8;pa=ma+1|0;qa=c[Z>>2]|0}else{pa=ma;qa=oa}ia=la+1|0;$=c[(c[qa+172>>2]|0)+(ia<<2)>>2]|0;if(($|0)==0){ja=pa;ka=qa;q=43;break}else{la=ia;ma=pa;na=$;oa=qa}}}}while(0);do{if((q|0)==43){q=0;if((ja|0)==2){c[ka+240>>2]=((c[X>>2]|0)+(c[T>>2]|0)|0)/2|0;break}else if((ja|0)==0){aa=ka;q=44;break}else if((ja|0)==1){c[ka+240>>2]=c[T>>2];break}else{Jb(W|0,ja|0,4,4);_=(ja|0)/2|0;if((ja&1|0)!=0){c[(c[Z>>2]|0)+240>>2]=c[T+(_<<2)>>2];break}$=c[T+(_<<2)>>2]|0;ia=(c[T+(ja-1<<2)>>2]|0)-$|0;ra=c[T+(_-1<<2)>>2]|0;_=ra-(c[T>>2]|0)|0;if((_|0)==(ia|0)){c[(c[Z>>2]|0)+240>>2]=(ra+$|0)/2|0;break}else{sa=((da(_,$)|0)+(da(ra,ia)|0)|0)/(_+ia|0)|0;c[(c[Z>>2]|0)+240>>2]=sa;break}}}}while(0);if((q|0)==44){q=0;c[aa+240>>2]=-1}Y=Y+1|0;ta=c[m>>2]|0;ua=c[(c[ta+184>>2]|0)+(R*44|0)>>2]|0;}while((Y|0)<(ua|0));if((ua|0)>0){va=0;wa=0;xa=ta}else{break}while(1){Y=c[(c[V+(wa<<2)>>2]|0)+8>>2]|0;do{if((c[Y+184>>2]|0)==0){if((c[Y+176>>2]|0)!=0){ya=va;za=xa;break}W=Y+196|0;do{if((c[W+4>>2]|0)>0){X=c[W>>2]|0;Z=X;sa=c[Z>>2]|0;ia=c[((c[sa>>2]&3|0)==3?sa:sa+32|0)+28>>2]|0;sa=c[X+4>>2]|0;if((sa|0)==0){Aa=ia}else{X=1;_=ia;ia=sa;while(1){sa=c[((c[ia>>2]&3|0)==3?ia:ia+32|0)+28>>2]|0;ra=(c[(c[sa+8>>2]|0)+236>>2]|0)>(c[(c[_+8>>2]|0)+236>>2]|0)?sa:_;sa=X+1|0;$=c[Z+(sa<<2)>>2]|0;if(($|0)==0){Aa=ra;break}else{X=sa;_=ra;ia=$}}}ia=c[(c[Aa+8>>2]|0)+240>>2]|0;if((ia|0)<=-1){Ba=1;break}c[Y+240>>2]=ia+1;Ba=0}else{ia=Y+188|0;if((c[ia+4>>2]|0)<=0){Ba=1;break}_=c[ia>>2]|0;ia=_;X=c[ia>>2]|0;Z=c[((c[X>>2]&3|0)==2?X:X-32|0)+28>>2]|0;X=c[_+4>>2]|0;if((X|0)==0){Ca=Z}else{_=1;$=Z;Z=X;while(1){X=c[((c[Z>>2]&3|0)==2?Z:Z-32|0)+28>>2]|0;ra=(c[(c[X+8>>2]|0)+236>>2]|0)<(c[(c[$+8>>2]|0)+236>>2]|0)?X:$;X=_+1|0;sa=c[ia+(X<<2)>>2]|0;if((sa|0)==0){Ca=ra;break}else{_=X;$=ra;Z=sa}}}Z=c[(c[Ca+8>>2]|0)+240>>2]|0;if((Z|0)<=0){Ba=1;break}c[Y+240>>2]=Z-1;Ba=0}}while(0);ya=Ba|va;za=c[m>>2]|0}else{ya=va;za=xa}}while(0);Y=wa+1|0;Da=c[za+184>>2]|0;Ea=c[Da+(R*44|0)>>2]|0;if((Y|0)<(Ea|0)){va=ya;wa=Y;xa=za}else{break}}Y=c[Da+(R*44|0)+4>>2]|0;if((Ea|0)<=0){break}W=(ya&255|J|0)==0;Z=Y+(Ea<<2)|0;$=0;_=Ea;while(1){ia=_-1|0;d:do{if(Y>>>0<Z>>>0){sa=a[172624]|0;ra=Y;X=$;while(1){Fa=ra;while(1){if(Fa>>>0<Z>>>0){Ga=Fa}else{Ha=X;break d}while(1){Ia=c[Ga>>2]|0;Ja=c[Ia+8>>2]|0;Ka=c[Ja+240>>2]|0;La=Ga+4|0;if((Ka|0)>=0){break}if(La>>>0<Z>>>0){Ga=La}else{Ha=X;break d}}La=Ja+212|0;Ma=Ja+232|0;Na=Ja+159|0;Oa=Ja+156|0;Pa=Ga;Qa=0;e:while(1){if(Qa<<24>>24==0){Ra=Pa+4|0;if(Ra>>>0>=Z>>>0){Ha=X;break d}Sa=c[Ra>>2]|0;Ta=c[Sa+8>>2]|0;Ua=Ra;Va=Sa;Wa=Ta;Xa=c[Ta+212>>2]|0}else{Ta=Pa;while(1){Sa=Ta+4|0;if(Sa>>>0>=Z>>>0){Ha=X;break d}Ra=c[Sa>>2]|0;Ya=c[Ra+8>>2]|0;if((c[Ya+212>>2]|0)==0){Ua=Sa;Va=Ra;Wa=Ya;Xa=0;break}else{Ta=Sa}}}Ta=c[La>>2]|0;Za=Va+8|0;Sa=(Ta|0)!=(Xa|0);do{if(sa){if(Sa){break e}else{q=90}}else{if((Ta|0)==0|Sa^1|(Xa|0)==0){q=90;break}if((a[Na]|0)==7){if((a[Oa]|0)==1){break}}if((a[Wa+159|0]|0)!=7){break e}if((a[Wa+156|0]|0)!=1){break e}}}while(0);do{if((q|0)==90){q=0;Sa=c[m>>2]|0;Ta=c[(c[Sa+184>>2]|0)+((c[Ma>>2]|0)*44|0)+40>>2]|0;if((Ta|0)==0){break}Ya=(c[Sa+116>>2]&1|0)==0;Sa=da(c[Ta+4>>2]|0,c[(c[(Ya?Ia:Va)+8>>2]|0)+280>>2]|0)|0;if((a[(c[Ta+8>>2]|0)+((c[(c[(Ya?Va:Ia)+8>>2]|0)+280>>2]|0)+Sa)|0]|0)!=0){break e}}}while(0);_a=c[Wa+240>>2]|0;if((_a|0)>-1){q=94;break}Pa=Ua;Qa=(Xa|0)==0?Qa:1}if((q|0)==94){q=0;if(!((Ka|0)<=(_a|0)&((Ka|0)!=(_a|0)|Q))){break}}if(Ua>>>0<Z>>>0){Fa=Ua}else{Ha=X;break d}}Fa=c[Ma>>2]|0;Qa=Ja+236|0;Pa=c[Qa>>2]|0;Oa=c[Wa+236>>2]|0;c[Qa>>2]=Oa;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(Fa*44|0)+4>>2]|0)+(Oa<<2)>>2]=Ia;c[(c[Za>>2]|0)+236>>2]=Pa;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(Fa*44|0)+4>>2]|0)+(Pa<<2)>>2]=Va;Pa=X+1|0;if(Ua>>>0<Z>>>0){ra=Ua;X=Pa}else{Ha=Pa;break}}}else{Ha=$}}while(0);if((ia|0)>0){Z=W?Z-4|0:Z;$=Ha;_=ia}else{break}}if((Ha|0)==0){break}a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(R*44|0)+33|0]=0;if((R|0)<=0){break}a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+((R-1|0)*44|0)+33|0]=0}}while(0);V=R+M|0;if((V|0)==(L|0)){break c}R=V;S=c[m>>2]|0}}}while(0);vp(e,J^1);L=up(0)|0;if((L|0)>(E|0)){$a=E;ab=C}else{K=c[(c[m>>2]|0)+180>>2]|0;if((K|0)!=0){I=K;do{K=I+8|0;S=c[K>>2]|0;h[S+16>>3]=+(c[S+236>>2]|0);I=c[(c[K>>2]|0)+164>>2]|0;}while((I|0)!=0)}$a=L;ab=+(L|0)<+(E|0)*+h[21677]?0:C}I=w+1|0;if((I|0)<(B|0)){w=I;y=ab;x=L;E=$a}else{G=L;H=$a;break}}}else{G=A;H=z}}while(0);E=n+1|0;if((G|0)==0){r=H;s=0;t=B;break a}if((E|0)<3){n=E;u=G;v=H}else{r=H;s=G;t=B;break}}}}while(0);do{if((s|0)>(r|0)){B=e+8|0;G=c[B>>2]|0;H=c[G+180>>2]|0;if((H|0)==0){bb=G}else{G=H;do{H=G+8|0;z=c[H>>2]|0;c[z+236>>2]=~~+h[z+16>>3];G=c[(c[H>>2]|0)+164>>2]|0;}while((G|0)!=0);bb=c[B>>2]|0}G=b[bb+224>>1]|0;if(G<<16>>16>(b[bb+226>>1]|0)){break}H=G<<16>>16;while(1){a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(H*44|0)+33|0]=0;G=c[(c[B>>2]|0)+184>>2]|0;Jb(c[G+(H*44|0)+4>>2]|0,c[G+(H*44|0)>>2]|0,4,56);if((H|0)<(b[(c[B>>2]|0)+226>>1]|0)){H=H+1|0}else{break}}}}while(0);if((r|0)>0){vp(e,0);cb=up(0)|0}else{cb=r}if(!((g|0)!=0&(t|0)>0)){i=j;return cb|0}g=e+8|0;e=0;r=c[g>>2]|0;f:while(1){bb=b[r+226>>1]|0;if(bb<<16>>16<(b[r+224>>1]|0)){db=r}else{s=bb<<16>>16;bb=r;while(1){a[(c[bb+184>>2]|0)+(s*44|0)+32|0]=0;H=c[g>>2]|0;B=c[H+184>>2]|0;G=c[B+(s*44|0)>>2]|0;if((G-1|0)>0){z=(s|0)>0;A=s+1|0;$a=0;ab=B;B=H;M=G;while(1){G=c[ab+(s*44|0)+4>>2]|0;Ha=c[G+($a<<2)>>2]|0;Ua=$a+1|0;Va=c[G+(Ua<<2)>>2]|0;Za=Ha+8|0;Ia=c[Za>>2]|0;Wa=Ia+236|0;Ja=c[Wa>>2]|0;Ma=Va+8|0;_a=c[Ma>>2]|0;Ka=c[_a+236>>2]|0;if((Ja|0)>=(Ka|0)){q=125;break f}Xa=Ia;Ga=c[Ia+212>>2]|0;Ea=c[_a+212>>2]|0;ya=(Ga|0)!=(Ea|0);do{if(a[172624]|0){if(ya){eb=B;fb=ab;gb=M}else{q=133}}else{if((Ga|0)==0|ya^1|(Ea|0)==0){q=133;break}if((a[Xa+159|0]|0)==7){if((a[Ia+156|0]|0)==1){q=135;break}}if((a[_a+159|0]|0)!=7){eb=B;fb=ab;gb=M;break}if((a[_a+156|0]|0)==1){q=135}else{eb=B;fb=ab;gb=M}}}while(0);do{if((q|0)==133){q=0;Xa=c[ab+((c[Ia+232>>2]|0)*44|0)+40>>2]|0;if((Xa|0)==0){q=135;break}Ea=(c[B+116>>2]&1|0)==0;ya=da(c[Xa+4>>2]|0,c[(c[(Ea?Ha:Va)+8>>2]|0)+280>>2]|0)|0;if((a[(c[Xa+8>>2]|0)+((c[(c[(Ea?Va:Ha)+8>>2]|0)+280>>2]|0)+ya)|0]|0)==0){q=135}else{eb=B;fb=ab;gb=M}}}while(0);do{if((q|0)==135){q=0;g:do{if(z){ya=c[_a+172>>2]|0;Ea=c[ya>>2]|0;Xa=(Ea|0)==0;Ga=c[Ia+172>>2]|0;Da=Ga;za=c[Da>>2]|0;if(Xa){hb=0}else{if((za|0)==0){xa=ya;while(1){wa=xa+4|0;if((c[wa>>2]|0)==0){ib=0;jb=0;break g}else{xa=wa}}}else{kb=0;lb=ya;mb=Ea}while(1){xa=c[mb+8>>2]|0;wa=b[xa+154>>1]|0;va=c[(c[(c[((c[mb>>2]&3|0)==3?mb:mb+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;Ba=xa+16|0;xa=kb;Ca=Da;Aa=za;while(1){ta=c[(c[(c[((c[Aa>>2]&3|0)==3?Aa:Aa+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((ta-va|0)>0){q=143}else{if((ta|0)!=(va|0)){nb=xa;break}if(+h[(c[Aa+8>>2]|0)+16>>3]>+h[Ba>>3]){q=143}else{nb=xa}}}while(0);if((q|0)==143){q=0;nb=(da(b[(c[(c[Ca>>2]|0)+8>>2]|0)+154>>1]|0,wa)|0)+xa|0}ta=Ca+4|0;ua=c[ta>>2]|0;if((ua|0)==0){break}else{xa=nb;Ca=ta;Aa=ua}}Aa=lb+4|0;Ca=c[Aa>>2]|0;if((Ca|0)==0){hb=nb;break}else{kb=nb;lb=Aa;mb=Ca}}}Da=Ga;if((za|0)==0){ib=hb;jb=0;break}if(Xa){Ca=Da;while(1){Aa=Ca+4|0;if((c[Aa>>2]|0)==0){ib=hb;jb=0;break g}else{Ca=Aa}}}else{ob=0;pb=Da;qb=za}while(1){Ca=c[qb+8>>2]|0;Xa=b[Ca+154>>1]|0;Ga=c[(c[(c[((c[qb>>2]&3|0)==3?qb:qb+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;Aa=Ca+16|0;Ca=ob;xa=ya;wa=Ea;while(1){Ba=c[(c[(c[((c[wa>>2]&3|0)==3?wa:wa+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((Ba-Ga|0)>0){q=153}else{if((Ba|0)!=(Ga|0)){rb=Ca;break}if(+h[(c[wa+8>>2]|0)+16>>3]>+h[Aa>>3]){q=153}else{rb=Ca}}}while(0);if((q|0)==153){q=0;rb=(da(b[(c[(c[xa>>2]|0)+8>>2]|0)+154>>1]|0,Xa)|0)+Ca|0}Ba=xa+4|0;va=c[Ba>>2]|0;if((va|0)==0){break}else{Ca=rb;xa=Ba;wa=va}}wa=pb+4|0;xa=c[wa>>2]|0;if((xa|0)==0){ib=hb;jb=rb;break}else{ob=rb;pb=wa;qb=xa}}}else{ib=0;jb=0}}while(0);if((c[ab+(A*44|0)>>2]|0)>0){L=c[_a+180>>2]|0;C=c[L>>2]|0;Ea=(C|0)==0;ya=c[Ia+180>>2]|0;za=ya;Da=c[za>>2]|0;if(Ea){sb=0}else{xa=(Da|0)==0;wa=0;Ca=L;Xa=C;while(1){Aa=c[Xa+8>>2]|0;Ga=b[Aa+154>>1]|0;va=c[(c[(c[((c[Xa>>2]&3|0)==2?Xa:Xa-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if(xa){tb=wa}else{Ba=Aa+56|0;Aa=wa;ua=za;ta=Da;while(1){aa=c[(c[(c[((c[ta>>2]&3|0)==2?ta:ta-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((aa-va|0)>0){q=164}else{if((aa|0)!=(va|0)){ub=Aa;break}if(+h[(c[ta+8>>2]|0)+56>>3]>+h[Ba>>3]){q=164}else{ub=Aa}}}while(0);if((q|0)==164){q=0;ub=(da(b[(c[(c[ua>>2]|0)+8>>2]|0)+154>>1]|0,Ga)|0)+Aa|0}aa=ua+4|0;ja=c[aa>>2]|0;if((ja|0)==0){tb=ub;break}else{Aa=ub;ua=aa;ta=ja}}}ta=Ca+4|0;ua=c[ta>>2]|0;if((ua|0)==0){sb=tb;break}else{wa=tb;Ca=ta;Xa=ua}}}Xa=sb+ib|0;if((Da|0)==0){vb=0}else{Ca=0;wa=ya;za=Da;while(1){xa=c[za+8>>2]|0;ua=b[xa+154>>1]|0;ta=c[(c[(c[((c[za>>2]&3|0)==2?za:za-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if(Ea){wb=Ca}else{Aa=xa+56|0;xa=Ca;Ga=L;Ba=C;while(1){va=c[(c[(c[((c[Ba>>2]&3|0)==2?Ba:Ba-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((va-ta|0)>0){q=174}else{if((va|0)!=(ta|0)){xb=xa;break}if(+h[(c[Ba+8>>2]|0)+56>>3]>+h[Aa>>3]){q=174}else{xb=xa}}}while(0);if((q|0)==174){q=0;xb=(da(b[(c[(c[Ga>>2]|0)+8>>2]|0)+154>>1]|0,ua)|0)+xa|0}va=Ga+4|0;ja=c[va>>2]|0;if((ja|0)==0){wb=xb;break}else{xa=xb;Ga=va;Ba=ja}}}Ba=wa+4|0;Ga=c[Ba>>2]|0;if((Ga|0)==0){vb=wb;break}else{Ca=wb;wa=Ba;za=Ga}}}yb=Xa;zb=vb+jb|0}else{yb=ib;zb=jb}if((zb|0)>(yb|0)){eb=B;fb=ab;gb=M;break}za=a[Ia+156|0]|0;if(za<<24>>24==(a[_a+156|0]|0)){eb=B;fb=ab;gb=M;break}wa=(M|0)>0;do{if(wa){Ca=0;C=0;L=0;do{Ea=(a[(c[(c[G+(L<<2)>>2]|0)+8>>2]|0)+156|0]|0)==0|0;Ca=(Ea^1)+Ca|0;C=Ea+C|0;L=L+1|0;}while((L|0)<(M|0));L=za<<24>>24==0;if((C|0)>=(Ca|0)){Ab=L;q=186;break}Bb=L?Ha:Va}else{Ab=za<<24>>24==0;q=186}}while(0);if((q|0)==186){q=0;Bb=Ab?Va:Ha}if(wa){za=0;Xa=0;while(1){L=(c[G+(Xa<<2)>>2]|0)==(Bb|0)?Xa:za;Ea=Xa+1|0;if((Ea|0)<(M|0)){za=L;Xa=Ea}else{Cb=L;break}}}else{Cb=0}Xa=(a[(c[Bb+8>>2]|0)+156|0]|0)==0|0;h:do{if((Cb|0)>0){za=0;wa=Cb;while(1){L=wa-1|0;Ea=za+1|0;if((a[(c[(c[G+(L<<2)>>2]|0)+8>>2]|0)+156|0]|0)!=(Xa|0)){Db=za;break h}if((L|0)>0){za=Ea;wa=L}else{Db=Ea;break}}}else{Db=0}}while(0);wa=Cb+1|0;i:do{if((wa|0)<(M|0)){za=0;Ca=wa;while(1){C=za+1|0;if((a[(c[(c[G+(Ca<<2)>>2]|0)+8>>2]|0)+156|0]|0)!=(Xa|0)){Eb=za;break i}Ea=Ca+1|0;if((Ea|0)<(M|0)){za=C;Ca=Ea}else{Eb=C;break}}}else{Eb=0}}while(0);wa=c[Ia+232>>2]|0;c[Wa>>2]=Ka;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(wa*44|0)+4>>2]|0)+(Ka<<2)>>2]=Ha;c[(c[Ma>>2]|0)+236>>2]=Ja;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(wa*44|0)+4>>2]|0)+(Ja<<2)>>2]=Va;wa=c[g>>2]|0;Ca=c[wa+184>>2]|0;za=c[Ca+(s*44|0)>>2]|0;if((za|0)>0){C=c[Ca+(s*44|0)+4>>2]|0;Ea=Cb;L=0;while(1){Da=(c[C+(L<<2)>>2]|0)==(Bb|0)?L:Ea;ya=L+1|0;if((ya|0)<(za|0)){Ea=Da;L=ya}else{Fb=Da;break}}}else{Fb=Cb}j:do{if((Fb|0)>0){L=c[Ca+(s*44|0)+4>>2]|0;Ea=0;C=Fb;while(1){Da=C-1|0;ya=Ea+1|0;if((a[(c[(c[L+(Da<<2)>>2]|0)+8>>2]|0)+156|0]|0)!=(Xa|0)){Gb=Ea;break j}if((Da|0)>0){Ea=ya;C=Da}else{Gb=ya;break}}}else{Gb=0}}while(0);C=Fb+1|0;k:do{if((C|0)<(za|0)){Ea=c[Ca+(s*44|0)+4>>2]|0;L=0;ya=C;while(1){Da=L+1|0;if((a[(c[(c[Ea+(ya<<2)>>2]|0)+8>>2]|0)+156|0]|0)!=(Xa|0)){Hb=L;break k}Ga=ya+1|0;if((Ga|0)<(za|0)){L=Da;ya=Ga}else{Hb=Da;break}}}else{Hb=0}}while(0);Xa=Gb-Hb|0;C=Db-Eb|0;if((((Xa|0)>-1?Xa:-Xa|0)|0)<=(((C|0)>-1?C:-C|0)|0)){eb=wa;fb=Ca;gb=za;break}C=c[Za>>2]|0;Xa=c[C+232>>2]|0;ya=C+236|0;C=c[ya>>2]|0;L=c[(c[Ma>>2]|0)+236>>2]|0;c[ya>>2]=L;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(Xa*44|0)+4>>2]|0)+(L<<2)>>2]=Ha;c[(c[Ma>>2]|0)+236>>2]=C;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(Xa*44|0)+4>>2]|0)+(C<<2)>>2]=Va;C=c[g>>2]|0;Xa=c[C+184>>2]|0;eb=C;fb=Xa;gb=c[Xa+(s*44|0)>>2]|0}}while(0);if((Ua|0)<(gb-1|0)){$a=Ua;ab=fb;B=eb;M=gb}else{Ib=eb;break}}}else{Ib=H}if((s|0)>(b[Ib+224>>1]|0)){s=s-1|0;bb=Ib}else{db=Ib;break}}}bb=e+1|0;if((bb|0)<(t|0)){e=bb;r=db}else{q=210;break}}if((q|0)==125){cc(87312,117264,465,171048);return 0}else if((q|0)==210){i=j;return cb|0}return 0}function lp(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;bo(a);xp(a);Bp(a);Cp(a);e=kp(a,2,d)|0;f=a+8|0;a=c[f>>2]|0;if((c[a+172>>2]|0)<1){g=e;h=a}else{i=1;j=e;e=a;while(1){a=(lp(c[(c[e+176>>2]|0)+(i<<2)>>2]|0,d)|0)+j|0;k=c[f>>2]|0;if((i|0)<(c[k+172>>2]|0)){i=i+1|0;j=a;e=k}else{g=a;h=k;break}}}e=c[h+256>>2]|0;if((e|0)==0){return g|0}j=b[h+224>>1]|0;if(j<<16>>16>(b[h+226>>1]|0)){return g|0}i=j<<16>>16;c[e+(i<<2)>>2]=c[c[(c[h+184>>2]|0)+(i*44|0)+4>>2]>>2];h=c[f>>2]|0;if(j<<16>>16<(b[h+226>>1]|0)){l=i;m=h}else{return g|0}do{l=l+1|0;c[(c[m+256>>2]|0)+(l<<2)>>2]=c[c[(c[m+184>>2]|0)+(l*44|0)+4>>2]>>2];m=c[f>>2]|0;}while((l|0)<(b[m+226>>1]|0));return g|0}function mp(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=a+8|0;a=c[d>>2]|0;e=c[a+256>>2]|0;do{if((e|0)==0){f=a}else{g=b[a+224>>1]|0;if(g<<16>>16>(b[a+226>>1]|0)){f=a;break}h=g<<16>>16;c[e+(h<<2)>>2]=c[c[(c[a+184>>2]|0)+(h*44|0)+4>>2]>>2];i=c[d>>2]|0;if(g<<16>>16<(b[i+226>>1]|0)){j=h;k=i}else{f=i;break}while(1){i=j+1|0;c[(c[k+256>>2]|0)+(i<<2)>>2]=c[c[(c[k+184>>2]|0)+(i*44|0)+4>>2]>>2];h=c[d>>2]|0;if((i|0)<(b[h+226>>1]|0)){j=i;k=h}else{f=h;break}}}}while(0);if((c[f+172>>2]|0)<1){return}else{l=1;m=f}while(1){mp(c[(c[m+176>>2]|0)+(l<<2)>>2]|0);f=c[d>>2]|0;if((l|0)<(c[f+172>>2]|0)){l=l+1|0;m=f}else{break}}return}function np(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a+8|0;e=c[d>>2]|0;if((c[e+172>>2]|0)<1){f=e}else{g=1;h=e;while(1){np(c[(c[h+176>>2]|0)+(g<<2)>>2]|0);e=c[d>>2]|0;if((g|0)<(c[e+172>>2]|0)){g=g+1|0;h=e}else{f=e;break}}}if((c[f+256>>2]|0)==0){return}h=b[f+224>>1]|0;if(h<<16>>16>(b[f+226>>1]|0)){return}g=a|0;e=h<<16>>16;h=f;while(1){f=c[(c[h+256>>2]|0)+(e<<2)>>2]|0;i=op(a,f,-1)|0;j=op(a,f,1)|0;c[(c[(c[d>>2]|0)+256>>2]|0)+(e<<2)>>2]=i;f=c[(c[(c[(Ix(g)|0)+8>>2]|0)+184>>2]|0)+(e*44|0)+4>>2]|0;k=i+8|0;c[(c[(c[d>>2]|0)+184>>2]|0)+(e*44|0)+4>>2]=f+(c[(c[k>>2]|0)+236>>2]<<2);c[(c[(c[d>>2]|0)+184>>2]|0)+(e*44|0)>>2]=(c[(c[j+8>>2]|0)+236>>2]|0)+1-(c[(c[k>>2]|0)+236>>2]|0);k=c[d>>2]|0;if((e|0)<(b[k+226>>1]|0)){e=e+1|0;h=k}else{break}}return}function op(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if((d|0)==0){cc(145896,117264,754,170184);return 0}f=(e|0)<0;g=d;a:while(1){d=g;while(1){h=c[d+8>>2]|0;i=c[h+236>>2]|0;if(f){if((i|0)<=0){j=22;break a}k=(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+((c[h+232>>2]|0)*44|0)+4>>2]|0)+(i-1<<2)|0}else{k=(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+((c[h+232>>2]|0)*44|0)+4>>2]|0)+(i+1<<2)|0}h=c[k>>2]|0;if((h|0)==0){j=22;break a}l=h+8|0;m=c[l>>2]|0;if((da((c[m+236>>2]|0)-i|0,e)|0)<=0){j=11;break a}i=a[m+156|0]|0;if(i<<24>>24==0){if((Rx(b,h|0)|0)!=0){g=h;continue a}n=c[l>>2]|0;o=n;p=a[n+156|0]|0}else{o=m;p=i}if(p<<24>>24!=1){d=h;continue}if((c[o+176>>2]|0)!=1){d=h;continue}i=o+180|0;if((c[i+4>>2]|0)!=1){d=h;continue}m=c[c[i>>2]>>2]|0;i=c[m+8>>2]|0;if((a[i+112|0]|0)==0){q=m}else{m=i;do{r=c[m+116>>2]|0;m=c[r+8>>2]|0;}while((a[m+112|0]|0)!=0);q=r}if((Rx(b,q|0)|0)==0){d=h}else{g=h;continue a}}}if((j|0)==11){cc(142888,117264,760,170184);return 0}else if((j|0)==22){return g|0}return 0}function pp(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=d;f=c[e>>2]&3;g=c[((f|0)==2?d:d-32|0)+28>>2]|0;h=c[(c[g+8>>2]|0)+188>>2]|0;a:do{if((h|0)!=0){i=h;j=c[i>>2]|0;if((j|0)==0){break}k=d+32|0;l=0;m=j;while(1){j=l+1|0;if((c[((c[m>>2]&3|0)==2?m:m-32|0)+28>>2]|0)==(c[((f|0)==3?d:k)+28>>2]|0)){break}n=c[i+(j<<2)>>2]|0;if((n|0)==0){break a}else{l=j;m=n}}ep(d,m);l=(c[d+8>>2]|0)+172|0;if((c[l>>2]|0)==0){c[l>>2]=m}l=c[m+8>>2]|0;do{if((a[l+112|0]|0)==4){i=l+116|0;if((c[i>>2]|0)!=0){break}c[i>>2]=d}}while(0);l=(c[(c[((c[e>>2]&3|0)==3?d:k)+28>>2]|0)+8>>2]|0)+204|0;m=c[l>>2]|0;if((m|0)==0){o=kk((c[l+4>>2]<<2)+8|0)|0}else{o=mk(m,(c[l+4>>2]<<2)+8|0)|0}c[(c[(c[((c[e>>2]&3|0)==3?d:k)+28>>2]|0)+8>>2]|0)+204>>2]=o;l=(c[(c[((c[e>>2]&3|0)==3?d:k)+28>>2]|0)+8>>2]|0)+208|0;m=c[l>>2]|0;c[l>>2]=m+1;c[(c[(c[(c[((c[e>>2]&3|0)==3?d:k)+28>>2]|0)+8>>2]|0)+204>>2]|0)+(m<<2)>>2]=d;m=(c[(c[((c[e>>2]&3|0)==3?d:k)+28>>2]|0)+8>>2]|0)+204|0;c[(c[m>>2]|0)+(c[m+4>>2]<<2)>>2]=0;return}}while(0);e=Yo(g,c[((f|0)==3?d:d+32|0)+28>>2]|0,d)|0;f=d+8|0;d=e+8|0;a[(c[d>>2]|0)+112|0]=(a[(c[f>>2]|0)+112|0]|0)==4?4:3;c[(c[d>>2]|0)+96>>2]=c[(c[f>>2]|0)+96>>2];cp(b,e);return}function qp(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=a+8|0;e=jk((b[(c[d>>2]|0)+226>>1]<<2)+8|0)|0;f=e;g=ux(a)|0;if((g|0)!=0){h=g;do{g=f+(c[(c[h+8>>2]|0)+232>>2]<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=mw(a,h)|0;if((g|0)!=0){i=g;do{g=c[i>>2]&3;j=c[(c[(c[((g|0)==3?i:i+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;k=c[(c[(c[((g|0)==2?i:i-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;g=(j|0)>(k|0);l=g?j:k;m=(g?k:j)+1|0;if((m|0)<(l|0)){j=m;do{m=f+(j<<2)|0;c[m>>2]=(c[m>>2]|0)+1;j=j+1|0;}while((j|0)<(l|0))}i=ow(a,i)|0;}while((i|0)!=0)}h=vx(a,h)|0;}while((h|0)!=0)}h=jk(((b[(c[d>>2]|0)+226>>1]|0)*44|0)+88|0)|0;c[(c[d>>2]|0)+184>>2]=h;h=c[d>>2]|0;a=b[h+224>>1]|0;if(a<<16>>16>(b[h+226>>1]|0)){eF(e);return}i=a<<16>>16;a=h;while(1){h=f+(i<<2)|0;l=c[h>>2]|0;c[(c[a+184>>2]|0)+(i*44|0)>>2]=l;c[(c[(c[d>>2]|0)+184>>2]|0)+(i*44|0)+8>>2]=l;l=jk((c[h>>2]<<2)+4|0)|0;c[(c[(c[d>>2]|0)+184>>2]|0)+(i*44|0)+4>>2]=l;c[(c[(c[d>>2]|0)+184>>2]|0)+(i*44|0)+12>>2]=l;l=c[d>>2]|0;if((i|0)<(b[l+226>>1]|0)){i=i+1|0;a=l}else{break}}eF(e);return}function rp(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;f=d+8|0;g=c[(c[f>>2]|0)+232>>2]|0;h=a+8|0;j=c[(c[h>>2]|0)+184>>2]|0;k=c[j+(g*44|0)>>2]|0;if((c[j+(g*44|0)+8>>2]|0)<1){l=$w(a|0)|0;a=$w(d|0)|0;Fv(1,134832,(m=i,i=i+40|0,c[m>>2]=1070,c[m+8>>2]=l,c[m+16>>2]=a,c[m+24>>2]=g,c[m+32>>2]=k,m)|0)|0;i=m;i=e;return}c[(c[j+(g*44|0)+4>>2]|0)+(k<<2)>>2]=d;c[(c[f>>2]|0)+236>>2]=k;k=(c[(c[h>>2]|0)+184>>2]|0)+(g*44|0)|0;c[k>>2]=(c[k>>2]|0)+1;k=c[h>>2]|0;j=c[k+184>>2]|0;if((c[j+(g*44|0)>>2]|0)>(c[j+(g*44|0)+8>>2]|0)){cc(118064,117264,1077,170464)}a=c[(c[f>>2]|0)+236>>2]|0;l=c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(g*44|0)+8>>2]|0;if((a|0)>(l|0)){n=$w(d|0)|0;o=c[(c[f>>2]|0)+236>>2]|0;p=c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(g*44|0)+8>>2]|0;Fv(1,109736,(m=i,i=i+40|0,c[m>>2]=1090,c[m+8>>2]=n,c[m+16>>2]=o,c[m+24>>2]=g,c[m+32>>2]=p,m)|0)|0;i=m;i=e;return}p=b[k+224>>1]|0;o=b[k+226>>1]|0;do{if((g|0)>=(p|0)){if((g|0)>(o<<16>>16|0)){break}if(((c[j+(g*44|0)+4>>2]|0)+(a<<2)|0)>>>0<=((c[j+(g*44|0)+12>>2]|0)+(l<<2)|0)>>>0){i=e;return}k=$w(d|0)|0;n=c[(c[h>>2]|0)+184>>2]|0;q=(c[n+(g*44|0)+4>>2]|0)+(c[(c[f>>2]|0)+236>>2]<<2)|0;r=(c[n+(g*44|0)+12>>2]|0)+(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(g*44|0)+8>>2]<<2)|0;Fv(1,98240,(m=i,i=i+56|0,c[m>>2]=1101,c[m+8>>2]=g,c[m+16>>2]=k,c[m+24>>2]=q,c[m+32>>2]=g,c[m+40>>2]=g,c[m+48>>2]=r,m)|0)|0;i=m;i=e;return}}while(0);Fv(1,103912,(m=i,i=i+32|0,c[m>>2]=1095,c[m+8>>2]=g,c[m+16>>2]=p,c[m+24>>2]=o<<16>>16,m)|0)|0;i=m;i=e;return}function sp(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;f=i;g=d+8|0;h=Am(c[(c[g>>2]|0)+220>>2]|0)|0;j=c[g>>2]|0;k=c[j+180>>2]|0;if((k|0)==0){l=j}else{j=k;do{k=j+8|0;a[(c[k>>2]|0)+157|0]=0;j=c[(c[k>>2]|0)+164>>2]|0;}while((j|0)!=0);l=c[g>>2]|0}j=b[l+224>>1]|0;if(j<<16>>16>(b[l+226>>1]|0)){m=l}else{k=j<<16>>16;j=l;while(1){c[(c[j+184>>2]|0)+(k*44|0)>>2]=0;l=c[g>>2]|0;if((k|0)<(b[l+226>>1]|0)){k=k+1|0;j=l}else{m=l;break}}}j=c[m+180>>2]|0;if((j|0)!=0){m=(e|0)==0;k=j;do{j=k;l=k+8|0;n=c[l>>2]|0;do{if((c[c[(m?n+172|0:n+180|0)>>2]>>2]|0)==0){o=n+157|0;if((a[o]|0)!=0){p=n;break}a[o]=1;Cm(h,j);o=Dm(h)|0;if((o|0)!=0){q=o;do{if((a[(c[q+8>>2]|0)+159|0]|0)==7){fo(d,q,e,h)}else{rp(d,q);tp(h,q,e)}q=Dm(h)|0;}while((q|0)!=0)}p=c[l>>2]|0}else{p=n}}while(0);k=c[p+164>>2]|0;}while((k|0)!=0)}if((Dm(h)|0)!=0){Fv(1,92696,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0)|0;i=k}k=c[g>>2]|0;p=b[k+224>>1]|0;if(p<<16>>16<=(b[k+226>>1]|0)){k=p<<16>>16;while(1){a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(k*44|0)+33|0]=0;p=c[g>>2]|0;do{if((c[p+116>>2]&1|0)==0){r=p}else{e=c[p+184>>2]|0;m=c[e+(k*44|0)>>2]|0;if((m|0)<=0){r=p;break}n=c[e+(k*44|0)+4>>2]|0;e=m-1|0;m=(e|0)/2|0;l=0;while(1){j=c[n+(l<<2)>>2]|0;q=c[n+(e-l<<2)>>2]|0;o=c[j+8>>2]|0;s=c[o+232>>2]|0;t=o+236|0;o=c[t>>2]|0;u=q+8|0;v=c[(c[u>>2]|0)+236>>2]|0;c[t>>2]=v;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(s*44|0)+4>>2]|0)+(v<<2)>>2]=j;c[(c[u>>2]|0)+236>>2]=o;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(s*44|0)+4>>2]|0)+(o<<2)>>2]=q;if((l|0)<(m|0)){l=l+1|0}else{break}}r=c[g>>2]|0}}while(0);if((k|0)<(b[r+226>>1]|0)){k=k+1|0}else{break}}}if((Ix(d|0)|0)!=(d|0)){Bm(h);i=f;return}if((up(0)|0)<=0){Bm(h);i=f;return}vp(d,0);Bm(h);i=f;return}function tp(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=d+8|0;d=c[f>>2]|0;if((e|0)==0){e=d+180|0;if((c[e+4>>2]|0)>0){g=0;h=e;i=d}else{return}while(1){e=c[(c[h>>2]|0)+(g<<2)>>2]|0;j=e;k=e-32|0;l=(c[(c[((c[j>>2]&3|0)==2?e:k)+28>>2]|0)+8>>2]|0)+157|0;if((a[l]|0)==0){a[l]=1;Cm(b,c[((c[j>>2]&3|0)==2?e:k)+28>>2]|0);m=c[f>>2]|0}else{m=i}k=g+1|0;e=m+180|0;if((k|0)<(c[e+4>>2]|0)){g=k;h=e;i=m}else{break}}return}else{m=d+172|0;if((c[m+4>>2]|0)>0){n=0;o=m;p=d}else{return}while(1){d=c[(c[o>>2]|0)+(n<<2)>>2]|0;m=d;i=d+32|0;h=(c[(c[((c[m>>2]&3|0)==3?d:i)+28>>2]|0)+8>>2]|0)+157|0;if((a[h]|0)==0){a[h]=1;Cm(b,c[((c[m>>2]&3|0)==3?d:i)+28>>2]|0);q=c[f>>2]|0}else{q=p}i=n+1|0;d=q+172|0;if((i|0)<(c[d+4>>2]|0)){n=i;o=d;p=q}else{break}}return}}function up(d){d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0.0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0;d=(c[53542]|0)+8|0;e=c[d>>2]|0;f=b[e+224>>1]|0;if(f<<16>>16>=(b[e+226>>1]|0)){g=0;return g|0}i=f<<16>>16;f=0;j=e;while(1){e=c[j+184>>2]|0;if((a[e+(i*44|0)+33|0]|0)==0){k=c[e+(i*44|0)+4>>2]|0;l=i+1|0;m=c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(l*44|0)>>2]|0;if((c[43800]|0)>(m|0)){n=j;o=e}else{p=m+1|0;c[43800]=p;m=c[43798]|0;if((m|0)==0){q=kk(p<<2)|0}else{q=mk(m,p<<2)|0}c[43798]=q;p=c[d>>2]|0;n=p;o=c[p+184>>2]|0}if((c[o+(l*44|0)>>2]|0)>0){p=0;while(1){c[(c[43798]|0)+(p<<2)>>2]=0;m=p+1|0;r=c[d>>2]|0;s=c[r+184>>2]|0;if((m|0)<(c[s+(l*44|0)>>2]|0)){p=m}else{t=s;u=r;break}}}else{t=o;u=n}do{if((c[t+(i*44|0)>>2]|0)>0){p=0;r=0;s=0;m=u;v=u;while(1){w=k+(s<<2)|0;x=c[(c[(c[w>>2]|0)+8>>2]|0)+180>>2]|0;y=c[x>>2]|0;do{if((r|0)>0){if((y|0)==0){z=r;A=m;B=p;C=v;break}D=c[43798]|0;E=p;F=0;G=y;while(1){H=c[(c[(c[((c[G>>2]&3|0)==2?G:G-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if((H|0)<(r|0)){I=b[(c[G+8>>2]|0)+154>>1]|0;J=E;K=H;while(1){H=K+1|0;L=(da(c[D+(H<<2)>>2]|0,I)|0)+J|0;if((H|0)<(r|0)){J=L;K=H}else{M=L;break}}}else{M=E}K=F+1|0;J=c[x+(K<<2)>>2]|0;if((J|0)==0){N=M;O=22;break}else{E=M;F=K;G=J}}}else{N=p;O=22}}while(0);do{if((O|0)==22){O=0;if((y|0)==0){z=r;A=m;B=N;C=v;break}else{P=r;Q=1;R=y}while(1){x=c[(c[(c[((c[R>>2]&3|0)==2?R:R-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;S=(x|0)>(P|0)?x:P;G=(c[43798]|0)+(x<<2)|0;c[G>>2]=(c[G>>2]|0)+(b[(c[R+8>>2]|0)+154>>1]|0);G=c[(c[(c[(c[w>>2]|0)+8>>2]|0)+180>>2]|0)+(Q<<2)>>2]|0;if((G|0)==0){break}P=S;Q=Q+1|0;R=G}G=c[d>>2]|0;z=S;A=G;B=N;C=G}}while(0);w=s+1|0;T=c[A+184>>2]|0;U=c[T+(i*44|0)>>2]|0;if((w|0)<(U|0)){p=B;r=z;s=w;m=A;v=C}else{break}}if((U|0)<=0){V=B;W=T;X=C;break}v=c[T+(i*44|0)+4>>2]|0;m=B;s=0;while(1){r=c[(c[v+(s<<2)>>2]|0)+8>>2]|0;if((a[r+145|0]|0)==0){Y=m}else{p=c[r+180>>2]|0;r=p;w=c[r>>2]|0;do{if((w|0)==0){Z=0}else{y=c[p+4>>2]|0;if((y|0)==0){Z=0;break}G=w;x=0;F=1;E=y;while(1){y=c[(c[(c[((c[G>>2]&3|0)==2?G:G-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;D=c[G+8>>2]|0;_=+h[D+16>>3];J=D+154|0;D=F;K=x;I=E;while(1){L=c[I+8>>2]|0;if(+((c[(c[(c[((c[I>>2]&3|0)==2?I:I-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)-y|0)*(+h[L+16>>3]-_)<0.0){$=(da(b[L+154>>1]|0,b[J>>1]|0)|0)+K|0}else{$=K}L=D+1|0;H=c[r+(L<<2)>>2]|0;if((H|0)==0){break}else{D=L;K=$;I=H}}I=F+1|0;K=c[r+(I<<2)>>2]|0;if((K|0)==0){Z=$;break}else{G=E;x=$;F=I;E=K}}}}while(0);Y=Z+m|0}r=s+1|0;if((r|0)<(U|0)){m=Y;s=r}else{V=Y;W=T;X=C;break}}}else{V=0;W=t;X=u}}while(0);k=c[W+(l*44|0)>>2]|0;if((k|0)>0){s=c[W+(l*44|0)+4>>2]|0;m=V;v=0;while(1){r=c[(c[s+(v<<2)>>2]|0)+8>>2]|0;if((a[r+145|0]|0)==0){aa=m}else{w=c[r+172>>2]|0;r=w;p=c[r>>2]|0;do{if((p|0)==0){ba=0}else{E=c[w+4>>2]|0;if((E|0)==0){ba=0;break}F=p;x=0;G=1;K=E;while(1){E=c[(c[(c[((c[F>>2]&3|0)==3?F:F+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;I=c[F+8>>2]|0;_=+h[I+56>>3];D=I+154|0;I=G;J=x;y=K;while(1){H=c[y+8>>2]|0;if(+((c[(c[(c[((c[y>>2]&3|0)==3?y:y+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)-E|0)*(+h[H+56>>3]-_)<0.0){ca=(da(b[H+154>>1]|0,b[D>>1]|0)|0)+J|0}else{ca=J}H=I+1|0;L=c[r+(H<<2)>>2]|0;if((L|0)==0){break}else{I=H;J=ca;y=L}}y=G+1|0;J=c[r+(y<<2)>>2]|0;if((J|0)==0){ba=ca;break}else{F=K;x=ca;G=y;K=J}}}}while(0);aa=ba+m|0}r=v+1|0;if((r|0)<(k|0)){m=aa;v=r}else{ea=aa;break}}}else{ea=V}c[(c[X+184>>2]|0)+(i*44|0)+36>>2]=ea;a[(c[(c[d>>2]|0)+184>>2]|0)+(i*44|0)+33|0]=1;fa=ea;ga=c[d>>2]|0;ha=l}else{fa=c[e+(i*44|0)+36>>2]|0;ga=j;ha=i+1|0}v=fa+f|0;if((ha|0)<(b[ga+226>>1]|0)){i=ha;f=v;j=ga}else{g=v;break}}return g|0}function vp(d,e){d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0;f=d+8|0;d=c[f>>2]|0;g=b[d+224>>1]|0;if(g<<16>>16>(b[d+226>>1]|0)){i=d}else{j=g<<16>>16;g=d;while(1){a[(c[g+184>>2]|0)+(j*44|0)+32|0]=1;d=c[f>>2]|0;if((j|0)<(b[d+226>>1]|0)){j=j+1|0;g=d}else{i=d;break}}}g=(e|0)!=0;e=i;a:while(1){i=b[e+224>>1]|0;if(i<<16>>16>(b[e+226>>1]|0)){k=76;break}j=i<<16>>16;i=0;d=e;while(1){l=(c[d+184>>2]|0)+(j*44|0)+32|0;if((a[l]|0)==0){m=i;n=d}else{a[l]=0;l=c[f>>2]|0;o=c[l+184>>2]|0;p=c[o+(j*44|0)>>2]|0;b:do{if((p-1|0)>0){q=(j|0)>0;r=j+1|0;s=j-1|0;t=0;u=0;v=o;w=l;x=p;while(1){y=a[172624]|0;z=c[v+(j*44|0)+4>>2]|0;A=c[z+(u<<2)>>2]|0;B=c[A+8>>2]|0;C=x-1|0;D=w+116|0;E=v+(r*44|0)|0;F=u;G=A;A=B;H=c[B+236>>2]|0;while(1){I=F+1|0;J=c[z+(I<<2)>>2]|0;K=A+236|0;L=J+8|0;B=c[L>>2]|0;M=c[B+236>>2]|0;if((H|0)>=(M|0)){k=12;break a}N=A;O=c[A+212>>2]|0;P=c[B+212>>2]|0;Q=(O|0)!=(P|0);do{if(y){if(!Q){k=20}}else{if((O|0)==0|Q^1|(P|0)==0){k=20;break}if((a[N+159|0]|0)==7){if((a[A+156|0]|0)==1){k=22;break}}if((a[B+159|0]|0)!=7){break}if((a[B+156|0]|0)==1){k=22}}}while(0);do{if((k|0)==20){k=0;N=c[v+((c[A+232>>2]|0)*44|0)+40>>2]|0;if((N|0)==0){k=22;break}P=(c[D>>2]&1|0)==0;Q=da(c[N+4>>2]|0,c[(c[(P?G:J)+8>>2]|0)+280>>2]|0)|0;if((a[(c[N+8>>2]|0)+((c[(c[(P?J:G)+8>>2]|0)+280>>2]|0)+Q)|0]|0)==0){k=22}}}while(0);if((k|0)==22){k=0;c:do{if(q){Q=c[B+172>>2]|0;P=c[Q>>2]|0;N=(P|0)==0;O=c[A+172>>2]|0;R=O;S=c[R>>2]|0;if(N){T=0}else{if((S|0)==0){U=Q;while(1){V=U+4|0;if((c[V>>2]|0)==0){W=0;X=0;break c}else{U=V}}}else{Y=0;Z=Q;_=P}while(1){U=c[_+8>>2]|0;V=b[U+154>>1]|0;$=c[(c[(c[((c[_>>2]&3|0)==3?_:_+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;aa=U+16|0;U=Y;ba=R;ca=S;while(1){ea=c[(c[(c[((c[ca>>2]&3|0)==3?ca:ca+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((ea-$|0)>0){k=30}else{if((ea|0)!=($|0)){fa=U;break}if(+h[(c[ca+8>>2]|0)+16>>3]>+h[aa>>3]){k=30}else{fa=U}}}while(0);if((k|0)==30){k=0;fa=(da(b[(c[(c[ba>>2]|0)+8>>2]|0)+154>>1]|0,V)|0)+U|0}ea=ba+4|0;ga=c[ea>>2]|0;if((ga|0)==0){break}else{U=fa;ba=ea;ca=ga}}ca=Z+4|0;ba=c[ca>>2]|0;if((ba|0)==0){T=fa;break}else{Y=fa;Z=ca;_=ba}}}R=O;if((S|0)==0){W=T;X=0;break}if(N){ba=R;while(1){ca=ba+4|0;if((c[ca>>2]|0)==0){W=T;X=0;break c}else{ba=ca}}}else{ha=0;ia=R;ja=S}while(1){ba=c[ja+8>>2]|0;N=b[ba+154>>1]|0;O=c[(c[(c[((c[ja>>2]&3|0)==3?ja:ja+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;ca=ba+16|0;ba=ha;U=Q;V=P;while(1){aa=c[(c[(c[((c[V>>2]&3|0)==3?V:V+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((aa-O|0)>0){k=40}else{if((aa|0)!=(O|0)){ka=ba;break}if(+h[(c[V+8>>2]|0)+16>>3]>+h[ca>>3]){k=40}else{ka=ba}}}while(0);if((k|0)==40){k=0;ka=(da(b[(c[(c[U>>2]|0)+8>>2]|0)+154>>1]|0,N)|0)+ba|0}aa=U+4|0;$=c[aa>>2]|0;if(($|0)==0){break}else{ba=ka;U=aa;V=$}}V=ia+4|0;U=c[V>>2]|0;if((U|0)==0){W=T;X=ka;break}else{ha=ka;ia=V;ja=U}}}else{W=0;X=0}}while(0);if((c[E>>2]|0)>0){P=c[B+180>>2]|0;Q=c[P>>2]|0;S=(Q|0)==0;R=c[A+180>>2]|0;U=R;V=c[U>>2]|0;if(S){la=0}else{ba=(V|0)==0;N=0;ca=P;O=Q;while(1){$=c[O+8>>2]|0;aa=b[$+154>>1]|0;ga=c[(c[(c[((c[O>>2]&3|0)==2?O:O-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if(ba){ma=N}else{ea=$+56|0;$=N;na=U;oa=V;while(1){pa=c[(c[(c[((c[oa>>2]&3|0)==2?oa:oa-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((pa-ga|0)>0){k=51}else{if((pa|0)!=(ga|0)){qa=$;break}if(+h[(c[oa+8>>2]|0)+56>>3]>+h[ea>>3]){k=51}else{qa=$}}}while(0);if((k|0)==51){k=0;qa=(da(b[(c[(c[na>>2]|0)+8>>2]|0)+154>>1]|0,aa)|0)+$|0}pa=na+4|0;ra=c[pa>>2]|0;if((ra|0)==0){ma=qa;break}else{$=qa;na=pa;oa=ra}}}oa=ca+4|0;na=c[oa>>2]|0;if((na|0)==0){la=ma;break}else{N=ma;ca=oa;O=na}}}O=la+W|0;if((V|0)==0){sa=0}else{ca=0;N=R;U=V;while(1){ba=c[U+8>>2]|0;na=b[ba+154>>1]|0;oa=c[(c[(c[((c[U>>2]&3|0)==2?U:U-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if(S){ta=ca}else{$=ba+56|0;ba=ca;aa=P;ea=Q;while(1){ga=c[(c[(c[((c[ea>>2]&3|0)==2?ea:ea-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((ga-oa|0)>0){k=61}else{if((ga|0)!=(oa|0)){ua=ba;break}if(+h[(c[ea+8>>2]|0)+56>>3]>+h[$>>3]){k=61}else{ua=ba}}}while(0);if((k|0)==61){k=0;ua=(da(b[(c[(c[aa>>2]|0)+8>>2]|0)+154>>1]|0,na)|0)+ba|0}ga=aa+4|0;ra=c[ga>>2]|0;if((ra|0)==0){ta=ua;break}else{ba=ua;aa=ga;ea=ra}}}ea=N+4|0;aa=c[ea>>2]|0;if((aa|0)==0){sa=ta;break}else{ca=ta;N=ea;U=aa}}}va=O;wa=sa+X|0}else{va=W;wa=X}if((wa|0)<(va|0)){break}if(g&(va|0)>0&(wa|0)==(va|0)){break}}if((I|0)<(C|0)){F=I;G=J;A=B;H=M}else{xa=t;ya=w;break b}}F=c[A+232>>2]|0;c[K>>2]=M;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(F*44|0)+4>>2]|0)+(M<<2)>>2]=G;c[(c[L>>2]|0)+236>>2]=H;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(F*44|0)+4>>2]|0)+(H<<2)>>2]=J;F=va-wa+t|0;a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(j*44|0)+33|0]=0;a[(c[(c[f>>2]|0)+184>>2]|0)+(j*44|0)+32|0]=1;C=c[f>>2]|0;if((b[C+224>>1]|0)<(j|0)){a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(s*44|0)+33|0]=0;a[(c[(c[f>>2]|0)+184>>2]|0)+(s*44|0)+32|0]=1;za=c[f>>2]|0}else{za=C}if((b[za+226>>1]|0)>(j|0)){a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(r*44|0)+33|0]=0;a[(c[(c[f>>2]|0)+184>>2]|0)+(r*44|0)+32|0]=1;Aa=c[f>>2]|0}else{Aa=za}C=c[Aa+184>>2]|0;E=c[C+(j*44|0)>>2]|0;if((I|0)<(E-1|0)){t=F;u=I;v=C;w=Aa;x=E}else{xa=F;ya=Aa;break}}}else{xa=0;ya=l}}while(0);m=xa+i|0;n=ya}if((j|0)<(b[n+226>>1]|0)){j=j+1|0;i=m;d=n}else{break}}if((m|0)>0){e=n}else{k=76;break}}if((k|0)==12){cc(87312,117264,514,169864)}else if((k|0)==76){return}}function wp(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b>>2]&3;e=c[(c[((d|0)==2?b:b-32|0)+28>>2]|0)+8>>2]|0;if((a[e+156|0]|0)==1){f=2}else{f=(a[e+160|0]|0)<2|0}e=c[(c[((d|0)==3?b:b+32|0)+28>>2]|0)+8>>2]|0;if((a[e+156|0]|0)==1){g=2}else{g=(a[e+160|0]|0)<2|0}e=(c[b+8>>2]|0)+156|0;c[e>>2]=da(c[e>>2]|0,c[9576+(g*12|0)+(f<<2)>>2]|0)|0;return}function xp(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=c[53718]|0;if(!((e|0)!=0|(c[53604]|0)!=0)){i=d;return}f=Hm(b|0,e,0)|0;if((f|0)!=0){e=a[f]|0;do{if((e<<24>>24|0)==105){if((Ya(f|0,168592)|0)!=0){break}g=ux(b)|0;if((g|0)==0){i=d;return}else{h=g}do{yp(b,h,0);h=vx(b,h)|0;}while((h|0)!=0);i=d;return}else if((e<<24>>24|0)==111){if((Ya(f|0,82584)|0)!=0){break}g=ux(b)|0;if((g|0)==0){i=d;return}else{j=g}do{yp(b,j,1);j=vx(b,j)|0;}while((j|0)!=0);i=d;return}else if((e<<24>>24|0)==0){i=d;return}}while(0);Fv(1,164440,(k=i,i=i+8|0,c[k>>2]=f,k)|0)|0;i=k;i=d;return}f=sy(b)|0;if((f|0)!=0){e=f;do{if(($p(e)|0)==0){xp(e)}e=ty(e)|0;}while((e|0)!=0)}if((c[53604]|0)==0){i=d;return}e=ux(b)|0;if((e|0)==0){i=d;return}else{l=e}do{e=l|0;f=Hm(e,c[53604]|0,0)|0;a:do{if((f|0)!=0){j=a[f]|0;do{if((j<<24>>24|0)==111){if((Ya(f|0,82584)|0)!=0){break}yp(b,l,1);break a}else if((j<<24>>24|0)==105){if((Ya(f|0,168592)|0)!=0){break}yp(b,l,0);break a}else if((j<<24>>24|0)==0){break a}}while(0);j=$w(e)|0;Fv(1,160448,(k=i,i=i+16|0,c[k>>2]=f,c[k+8>>2]=j,k)|0)|0;i=k}}while(0);l=vx(b,l)|0;}while((l|0)!=0);i=d;return}function yp(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;f=c[53516]|0;g=d+8|0;d=c[g>>2]|0;if((c[d+212>>2]|0)!=0){return}h=(e|0)!=0;if(h){e=c[c[d+180>>2]>>2]|0;if((e|0)==0){return}else{i=0;j=0;k=e;l=d}while(1){e=c[(c[k+8>>2]|0)+116>>2]|0;if((e|0)==0){m=k}else{n=e;while(1){e=c[(c[n+8>>2]|0)+116>>2]|0;if((e|0)==0){break}else{n=e}}m=n}e=c[m>>2]&3;if((c[(c[(c[((e|0)==3?m:m+32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0)==(c[(c[(c[((e|0)==2?m:m-32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0)){c[f+(i<<2)>>2]=k;o=i+1|0;p=c[g>>2]|0}else{o=i;p=l}e=j+1|0;q=c[(c[p+180>>2]|0)+(e<<2)>>2]|0;if((q|0)==0){r=o;break}else{i=o;j=e;k=q;l=p}}}else{p=c[c[d+172>>2]>>2]|0;if((p|0)==0){return}else{s=0;t=0;u=p;v=d}while(1){d=c[(c[u+8>>2]|0)+116>>2]|0;if((d|0)==0){w=u}else{p=d;while(1){d=c[(c[p+8>>2]|0)+116>>2]|0;if((d|0)==0){break}else{p=d}}w=p}n=c[w>>2]&3;if((c[(c[(c[((n|0)==3?w:w+32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0)==(c[(c[(c[((n|0)==2?w:w-32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0)){c[f+(s<<2)>>2]=u;x=s+1|0;y=c[g>>2]|0}else{x=s;y=v}n=t+1|0;d=c[(c[y+172>>2]|0)+(n<<2)>>2]|0;if((d|0)==0){r=x;break}else{s=x;t=n;u=d;v=y}}}if((r|0)<2){return}c[f+(r<<2)>>2]=0;Jb(f|0,r|0,4,124);r=c[f+4>>2]|0;if((r|0)==0){return}if(h){h=1;y=r;while(1){v=c[f+(h-1<<2)>>2]|0;u=c[((c[v>>2]&3|0)==2?v:v-32|0)+28>>2]|0;v=c[((c[y>>2]&3|0)==2?y:y-32|0)+28>>2]|0;if((To(u,v)|0)!=0){z=24;break}t=Yo(u,v,0)|0;a[(c[t+8>>2]|0)+112|0]=4;cp(b,t);t=h+1|0;v=c[f+(t<<2)>>2]|0;if((v|0)==0){z=24;break}else{h=t;y=v}}if((z|0)==24){return}}else{y=1;h=r;while(1){r=c[f+(y-1<<2)>>2]|0;v=c[((c[r>>2]&3|0)==3?r:r+32|0)+28>>2]|0;r=c[((c[h>>2]&3|0)==3?h:h+32|0)+28>>2]|0;if((To(v,r)|0)!=0){z=24;break}t=Yo(v,r,0)|0;a[(c[t+8>>2]|0)+112|0]=4;cp(b,t);t=y+1|0;r=c[f+(t<<2)>>2]|0;if((r|0)==0){z=24;break}else{y=t;h=r}}if((z|0)==24){return}}}function zp(a,b){a=a|0;b=b|0;return((c[c[a>>2]>>2]|0)>>>4)-((c[c[b>>2]>>2]|0)>>>4)|0}function Ap(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=a+8|0;i=c[g>>2]|0;if((c[i+172>>2]|0)<1){j=f}else{k=f;f=1;l=i;while(1){i=Ap(c[(c[l+176>>2]|0)+(f<<2)>>2]|0,d,e,k)|0;m=c[g>>2]|0;if((f|0)<(c[m+172>>2]|0)){k=i;f=f+1|0;l=m}else{j=i;break}}}l=a|0;if((Ix(l)|0)==(a|0)){n=j;return n|0}vF(d|0,0,e<<2|0)|0;e=ux(a)|0;if((e|0)!=0){f=e;do{e=f+8|0;c[d+(c[(c[e>>2]|0)+232>>2]<<2)>>2]=1;k=mw(a,f)|0;if((k|0)!=0){i=k;do{k=c[(c[e>>2]|0)+232>>2]|0;m=i;o=i-32|0;if((k|0)<(c[(c[(c[((c[m>>2]&3|0)==2?i:o)+28>>2]|0)+8>>2]|0)+232>>2]|0)){p=k;do{p=p+1|0;c[d+(p<<2)>>2]=1;}while((p|0)<(c[(c[(c[((c[m>>2]&3|0)==2?i:o)+28>>2]|0)+8>>2]|0)+232>>2]|0))}i=ow(a,i)|0;}while((i|0)!=0)}f=vx(a,f)|0;}while((f|0)!=0)}f=c[g>>2]|0;i=b[f+224>>1]|0;if(i<<16>>16>(b[f+226>>1]|0)){n=j;return n|0}e=j;j=i<<16>>16;i=f;while(1){if((c[d+(j<<2)>>2]|0)==0){if((e|0)==0){q=ry(Ix(l)|0,156320,1)|0}else{q=e}f=Ax(q,0,1)|0;Wx(f|0,151840,304,1)|0;o=f+8|0;c[(c[o>>2]|0)+232>>2]=j;h[(c[o>>2]|0)+96>>3]=.5;h[(c[o>>2]|0)+88>>3]=.5;h[(c[o>>2]|0)+80>>3]=1.0;c[(c[o>>2]|0)+216>>2]=1;c[(c[o>>2]|0)+176>>2]=0;m=jk(20)|0;c[(c[o>>2]|0)+172>>2]=m;c[(c[o>>2]|0)+184>>2]=0;m=jk(20)|0;c[(c[o>>2]|0)+180>>2]=m;zx(a,f,1)|0;r=q;s=c[g>>2]|0}else{r=e;s=i}if((j|0)<(b[s+226>>1]|0)){e=r;j=j+1|0;i=s}else{n=r;break}}return n|0}function Bp(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=d+8|0;f=c[e>>2]|0;g=b[f+224>>1]|0;if(g<<16>>16>(b[f+226>>1]|0)){return}h=g<<16>>16;g=f;while(1){f=c[g+184>>2]|0;do{if((c[f+(h*44|0)>>2]|0)>0){i=0;j=0;k=f;while(1){l=(c[(c[k+(h*44|0)+4>>2]|0)+(i<<2)>>2]|0)+8|0;a[(c[l>>2]|0)+158|0]=0;a[(c[l>>2]|0)+157|0]=0;c[(c[l>>2]|0)+280>>2]=i;if((c[(c[l>>2]|0)+192>>2]|0)>0&(j|0)==0){l=c[(c[(c[e>>2]|0)+184>>2]|0)+(h*44|0)>>2]|0;m=jk(12)|0;c[m>>2]=l;c[m+4>>2]=l;c[m+8>>2]=jk(da(l,l)|0)|0;c[(c[(c[e>>2]|0)+184>>2]|0)+(h*44|0)+40>>2]=m;n=1}else{n=j}m=i+1|0;o=c[e>>2]|0;p=c[o+184>>2]|0;q=c[p+(h*44|0)>>2]|0;if((m|0)<(q|0)){i=m;j=n;k=p}else{break}}if((n|0)!=0&(q|0)>0){r=0;s=p;t=o}else{u=o;break}while(1){k=c[(c[s+(h*44|0)+4>>2]|0)+(r<<2)>>2]|0;if((a[(c[k+8>>2]|0)+157|0]|0)==0){Gp(d,k);v=c[e>>2]|0}else{v=t}k=r+1|0;j=c[v+184>>2]|0;if((k|0)<(c[j+(h*44|0)>>2]|0)){r=k;s=j;t=v}else{u=v;break}}}else{u=g}}while(0);if((h|0)<(b[u+226>>1]|0)){h=h+1|0;g=u}else{break}}return}function Cp(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0;e=d+8|0;f=c[e>>2]|0;if((a[f+228|0]|0)==0){return}g=b[f+224>>1]|0;if(g<<16>>16>(b[f+226>>1]|0)){return}h=g<<16>>16;g=0;i=f;a:while(1){f=c[i+184>>2]|0;j=c[f+(h*44|0)>>2]|0;if((j|0)==0){k=g;l=i}else{m=c[(c[c[f+(h*44|0)+4>>2]>>2]|0)+8>>2]|0;f=c[m+236>>2]|0;if((j|0)>0){j=1;n=m;while(1){a[n+157|0]=0;m=c[(c[e>>2]|0)+184>>2]|0;if((j|0)>=(c[m+(h*44|0)>>2]|0)){break}o=c[(c[(c[m+(h*44|0)+4>>2]|0)+(j<<2)>>2]|0)+8>>2]|0;j=j+1|0;n=o}p=(j<<2)+4|0}else{p=4}if((g|0)==0){q=kk(p)|0}else{q=mk(g,p)|0}n=q;o=c[e>>2]|0;m=c[o+184>>2]|0;r=c[m+(h*44|0)>>2]|0;do{if((r|0)>0){s=0;t=0;u=o;v=m;w=r;while(1){if((c[u+116>>2]&1|0)==0){x=(c[v+(h*44|0)+4>>2]|0)+(w+~t<<2)|0}else{x=(c[v+(h*44|0)+4>>2]|0)+(t<<2)|0}y=c[x>>2]|0;z=y+8|0;A=c[z>>2]|0;B=A+196|0;if((c[B+4>>2]|0)>0){C=0;D=0;E=B;while(1){B=c[(c[E>>2]|0)+(D<<2)>>2]|0;do{if((c[(c[B+8>>2]|0)+156>>2]|0)==0){F=0}else{G=B;H=c[((c[G>>2]&3|0)==3?B:B+32|0)+28>>2]|0;I=H+8|0;J=c[I>>2]|0;K=a[J+156|0]|0;if(K<<24>>24==0){L=(Rx(d,H|0)|0)!=0|0;H=c[I>>2]|0;M=L;N=H;O=a[H+156|0]|0}else{M=0;N=J;O=K}do{if(O<<24>>24==1){if((c[N+176>>2]|0)!=1){P=27;break}K=N+180|0;if((c[K+4>>2]|0)!=1){P=27;break}J=c[c[K>>2]>>2]|0;K=c[J+8>>2]|0;if((a[K+112|0]|0)==0){Q=J}else{J=K;do{R=c[J+116>>2]|0;J=c[R+8>>2]|0;}while((a[J+112|0]|0)!=0);Q=R}if((Rx(d,Q|0)|0)==0){P=27}else{S=1}}else{P=27}}while(0);if((P|0)==27){P=0;S=0}if((S|M|0)==0){F=0;break}J=c[((c[G>>2]&3|0)==2?B:B-32|0)+28>>2]|0;K=J+8|0;H=c[K>>2]|0;L=a[H+156|0]|0;if(L<<24>>24==0){I=(Rx(d,J|0)|0)!=0|0;J=c[K>>2]|0;T=I;U=J;V=a[J+156|0]|0}else{T=0;U=H;V=L}do{if(V<<24>>24==1){if((c[U+176>>2]|0)!=1){P=38;break}L=U+180|0;if((c[L+4>>2]|0)!=1){P=38;break}H=c[c[L>>2]>>2]|0;L=c[H+8>>2]|0;if((a[L+112|0]|0)==0){W=H}else{H=L;do{X=c[H+116>>2]|0;H=c[X+8>>2]|0;}while((a[H+112|0]|0)!=0);W=X}if((Rx(d,W|0)|0)==0){P=38}else{Y=1}}else{P=38}}while(0);if((P|0)==38){P=0;Y=0}F=Y|T}}while(0);B=F+C|0;G=D+1|0;H=c[z>>2]|0;L=H+196|0;if((G|0)<(c[L+4>>2]|0)){C=B;D=G;E=L}else{Z=B;_=H;break}}}else{Z=0;_=A}E=_+188|0;if((c[E+4>>2]|0)>0){D=0;C=0;H=E;while(1){E=c[(c[H>>2]|0)+(C<<2)>>2]|0;do{if((c[(c[E+8>>2]|0)+156>>2]|0)==0){$=0}else{B=E;L=c[((c[B>>2]&3|0)==3?E:E+32|0)+28>>2]|0;G=L+8|0;J=c[G>>2]|0;I=a[J+156|0]|0;if(I<<24>>24==0){K=(Rx(d,L|0)|0)!=0|0;L=c[G>>2]|0;aa=K;ba=L;ca=a[L+156|0]|0}else{aa=0;ba=J;ca=I}do{if(ca<<24>>24==1){if((c[ba+176>>2]|0)!=1){P=52;break}I=ba+180|0;if((c[I+4>>2]|0)!=1){P=52;break}J=c[c[I>>2]>>2]|0;I=c[J+8>>2]|0;if((a[I+112|0]|0)==0){da=J}else{J=I;do{ea=c[J+116>>2]|0;J=c[ea+8>>2]|0;}while((a[J+112|0]|0)!=0);da=ea}if((Rx(d,da|0)|0)==0){P=52}else{fa=1}}else{P=52}}while(0);if((P|0)==52){P=0;fa=0}if((fa|aa|0)==0){$=0;break}J=c[((c[B>>2]&3|0)==2?E:E-32|0)+28>>2]|0;I=J+8|0;L=c[I>>2]|0;K=a[L+156|0]|0;if(K<<24>>24==0){G=(Rx(d,J|0)|0)!=0|0;J=c[I>>2]|0;ga=G;ha=J;ia=a[J+156|0]|0}else{ga=0;ha=L;ia=K}do{if(ia<<24>>24==1){if((c[ha+176>>2]|0)!=1){P=63;break}K=ha+180|0;if((c[K+4>>2]|0)!=1){P=63;break}L=c[c[K>>2]>>2]|0;K=c[L+8>>2]|0;if((a[K+112|0]|0)==0){ja=L}else{L=K;do{ka=c[L+116>>2]|0;L=c[ka+8>>2]|0;}while((a[L+112|0]|0)!=0);ja=ka}if((Rx(d,ja|0)|0)==0){P=63}else{la=1}}else{P=63}}while(0);if((P|0)==63){P=0;la=0}$=la|ga}}while(0);E=$+D|0;B=C+1|0;L=c[z>>2]|0;K=L+188|0;if((B|0)<(c[K+4>>2]|0)){D=E;C=B;H=K}else{ma=E;na=L;break}}}else{ma=0;na=_}do{if((ma|Z|0)==0){c[n+(s<<2)>>2]=y;oa=s+1|0}else{if((a[na+157|0]|0)!=0|(Z|0)!=0){oa=s;break}oa=(Fp(d,y,n+(s<<2)|0,h)|0)+s|0}}while(0);y=t+1|0;pa=c[e>>2]|0;H=c[pa+184>>2]|0;C=c[H+(h*44|0)>>2]|0;if((y|0)<(C|0)){s=oa;t=y;u=pa;v=H;w=C}else{break}}if((oa|0)==0){break}do{if((c[pa+116>>2]&1|0)==0){w=n+(oa-1<<2)|0;if(n>>>0<w>>>0){qa=n;ra=w}else{sa=pa;break}do{w=c[qa>>2]|0;c[qa>>2]=c[ra>>2];c[ra>>2]=w;qa=qa+4|0;ra=ra-4|0;}while(qa>>>0<ra>>>0);sa=c[e>>2]|0}else{sa=pa}}while(0);w=c[sa+184>>2]|0;if((c[w+(h*44|0)>>2]|0)>0){ta=0;ua=w}else{break}do{w=c[n+(ta<<2)>>2]|0;c[(c[ua+(h*44|0)+4>>2]|0)+(ta<<2)>>2]=w;c[(c[w+8>>2]|0)+236>>2]=ta+f;ta=ta+1|0;va=c[e>>2]|0;ua=c[va+184>>2]|0;wa=c[ua+(h*44|0)>>2]|0;}while((ta|0)<(wa|0));if((wa|0)>0){xa=0;ya=ua;za=va}else{break}while(1){w=(c[(c[ya+(h*44|0)+4>>2]|0)+(xa<<2)>>2]|0)+8|0;v=c[w>>2]|0;u=c[v+188>>2]|0;do{if((u|0)==0){Aa=za}else{t=c[u>>2]|0;if((t|0)==0){Aa=za;break}else{Ba=0;Ca=t;Da=v;Ea=za}while(1){t=c[Ca>>2]|0;s=t&3;C=c[(c[(c[((s|0)==2?Ca:Ca-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;H=c[(c[(c[((s|0)==3?Ca:Ca+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if((c[Ea+116>>2]&1|0)==0){if((C|0)<(H|0)){P=84}else{Fa=Ba;Ga=Da}}else{if((C|0)>(H|0)){P=84}else{Fa=Ba;Ga=Da}}if((P|0)==84){P=0;do{if((c[(c[Ca+8>>2]|0)+156>>2]|0)!=0){H=Ca;C=c[((t&3|0)==3?Ca:Ca+32|0)+28>>2]|0;s=C+8|0;y=c[s>>2]|0;D=a[y+156|0]|0;if(D<<24>>24==0){z=(Rx(d,C|0)|0)!=0|0;C=c[s>>2]|0;Ha=z;Ia=C;Ja=a[C+156|0]|0}else{Ha=0;Ia=y;Ja=D}do{if(Ja<<24>>24==1){if((c[Ia+176>>2]|0)!=1){P=94;break}D=Ia+180|0;if((c[D+4>>2]|0)!=1){P=94;break}y=c[c[D>>2]>>2]|0;D=c[y+8>>2]|0;if((a[D+112|0]|0)==0){Ka=y}else{y=D;do{La=c[y+116>>2]|0;y=c[La+8>>2]|0;}while((a[y+112|0]|0)!=0);Ka=La}if((Rx(d,Ka|0)|0)==0){P=94}else{Ma=1}}else{P=94}}while(0);if((P|0)==94){P=0;Ma=0}if((Ma|Ha|0)==0){break}y=c[((c[H>>2]&3|0)==2?Ca:Ca-32|0)+28>>2]|0;D=y+8|0;C=c[D>>2]|0;z=a[C+156|0]|0;if(z<<24>>24==0){s=(Rx(d,y|0)|0)!=0|0;y=c[D>>2]|0;Na=s;Oa=y;Pa=a[y+156|0]|0}else{Na=0;Oa=C;Pa=z}do{if(Pa<<24>>24==1){if((c[Oa+176>>2]|0)!=1){P=105;break}z=Oa+180|0;if((c[z+4>>2]|0)!=1){P=105;break}C=c[c[z>>2]>>2]|0;z=c[C+8>>2]|0;if((a[z+112|0]|0)==0){Qa=C}else{C=z;do{Ra=c[C+116>>2]|0;C=c[Ra+8>>2]|0;}while((a[C+112|0]|0)!=0);Qa=Ra}if((Rx(d,Qa|0)|0)==0){P=105}else{Sa=1}}else{P=105}}while(0);if((P|0)==105){P=0;Sa=0}if((Sa|Na|0)!=0){P=107;break a}}}while(0);dp(Ca);pp(d,Ca);Fa=Ba-1|0;Ga=c[w>>2]|0}t=Fa+1|0;H=c[(c[Ga+188>>2]|0)+(t<<2)>>2]|0;C=c[e>>2]|0;if((H|0)==0){Aa=C;break}else{Ba=t;Ca=H;Da=Ga;Ea=C}}}}while(0);w=xa+1|0;v=c[Aa+184>>2]|0;if((w|0)<(c[v+(h*44|0)>>2]|0)){xa=w;ya=v;za=Aa}else{break}}}}while(0);a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(h*44|0)+33|0]=0;k=n;l=c[e>>2]|0}if((h|0)<(b[l+226>>1]|0)){h=h+1|0;g=k;i=l}else{break}}if((P|0)==107){cc(132240,117264,1292,170600)}if((k|0)==0){return}eF(k);return}function Dp(a,b){a=a|0;b=b|0;return(c[a>>2]|0)-(c[b>>2]|0)|0}function Ep(a,b){a=a|0;b=b|0;return(c[(c[(c[a>>2]|0)+8>>2]|0)+236>>2]|0)-(c[(c[(c[b>>2]|0)+8>>2]|0)+236>>2]|0)|0}function Fp(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;g=d+8|0;a[(c[g>>2]|0)+157|0]=1;h=c[g>>2]|0;i=h+188|0;do{if((c[i+4>>2]|0)>0){j=c[c[i>>2]>>2]|0;if((j|0)==0){k=0;l=h;break}else{m=0;n=0;o=j}while(1){do{if((c[(c[o+8>>2]|0)+156>>2]|0)==0){p=n}else{j=o;q=c[((c[j>>2]&3|0)==3?o:o+32|0)+28>>2]|0;r=q+8|0;s=c[r>>2]|0;t=a[s+156|0]|0;if(t<<24>>24==0){u=(Rx(b,q|0)|0)!=0|0;q=c[r>>2]|0;v=u;w=q;x=a[q+156|0]|0}else{v=0;w=s;x=t}do{if(x<<24>>24==1){if((c[w+176>>2]|0)!=1){y=13;break}t=w+180|0;if((c[t+4>>2]|0)!=1){y=13;break}s=c[c[t>>2]>>2]|0;t=c[s+8>>2]|0;if((a[t+112|0]|0)==0){z=s}else{s=t;do{A=c[s+116>>2]|0;s=c[A+8>>2]|0;}while((a[s+112|0]|0)!=0);z=A}if((Rx(b,z|0)|0)==0){y=13}else{B=1}}else{y=13}}while(0);if((y|0)==13){y=0;B=0}if((B|v|0)==0){p=n;break}s=o-32|0;t=c[((c[j>>2]&3|0)==2?o:s)+28>>2]|0;q=t+8|0;u=c[q>>2]|0;r=a[u+156|0]|0;if(r<<24>>24==0){C=(Rx(b,t|0)|0)!=0|0;t=c[q>>2]|0;D=C;E=t;F=a[t+156|0]|0}else{D=0;E=u;F=r}do{if(F<<24>>24==1){if((c[E+176>>2]|0)!=1){y=24;break}r=E+180|0;if((c[r+4>>2]|0)!=1){y=24;break}u=c[c[r>>2]>>2]|0;r=c[u+8>>2]|0;if((a[r+112|0]|0)==0){G=u}else{u=r;do{H=c[u+116>>2]|0;u=c[H+8>>2]|0;}while((a[u+112|0]|0)!=0);G=H}if((Rx(b,G|0)|0)==0){y=24}else{I=1}}else{y=24}}while(0);if((y|0)==24){y=0;I=0}if((I|D|0)==0){p=n;break}u=c[((c[j>>2]&3|0)==2?o:s)+28>>2]|0;if((a[(c[u+8>>2]|0)+157|0]|0)!=0){p=n;break}p=(Fp(b,u,e+(n<<2)|0,f)|0)+n|0}}while(0);u=m+1|0;r=c[g>>2]|0;t=c[(c[r+188>>2]|0)+(u<<2)>>2]|0;if((t|0)==0){k=p;l=r;break}else{m=u;n=p;o=t}}}else{k=0;l=h}}while(0);if((c[l+232>>2]|0)==(f|0)){c[e+(k<<2)>>2]=d;return k+1|0}else{cc(129928,117264,1221,170048);return 0}return 0}function Gp(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=d+8|0;d=c[e>>2]|0;f=c[(c[(c[b+8>>2]|0)+184>>2]|0)+((c[d+232>>2]|0)*44|0)+40>>2]|0;a[d+157|0]=1;a[(c[e>>2]|0)+158|0]=1;d=(c[(c[(Ix(b|0)|0)+8>>2]|0)+172>>2]|0)>0;g=c[e>>2]|0;h=c[g+188>>2]|0;if((h|0)==0){i=g;j=i;k=j+158|0;a[k]=0;return}l=c[h>>2]|0;if((l|0)==0){i=g;j=i;k=j+158|0;a[k]=0;return}g=f|0;h=f+4|0;m=f+8|0;f=0;n=l;a:while(1){do{if(d){l=n;if((Rx(b,c[((c[l>>2]&3|0)==3?n:n+32|0)+28>>2]|0)|0)==0){o=f;break}if((Rx(b,c[((c[l>>2]&3|0)==2?n:n-32|0)+28>>2]|0)|0)==0){o=f}else{p=7}}else{p=7}}while(0);do{if((p|0)==7){p=0;l=n+8|0;if((c[(c[l>>2]|0)+156>>2]|0)==0){o=f;break}q=n;r=c[q>>2]&3;s=n-32|0;t=c[(c[((r|0)==2?n:s)+28>>2]|0)+8>>2]|0;u=c[t+280>>2]|0;v=(u|0)<(c[g>>2]|0);if((a[t+158|0]|0)==1){if(!v){p=10;break a}t=c[(c[(c[((r|0)==3?n:n+32|0)+28>>2]|0)+8>>2]|0)+280>>2]|0;w=c[h>>2]|0;if((t|0)>=(w|0)){p=12;break a}x=(da(w,u)|0)+t|0;a[(c[m>>2]|0)+x|0]=1;dp(n);x=f-1|0;if((a[(c[l>>2]|0)+112|0]|0)==4){o=x;break}pp(b,n);o=x;break}else{if(!v){p=16;break a}v=c[(c[(c[((r|0)==3?n:n+32|0)+28>>2]|0)+8>>2]|0)+280>>2]|0;r=c[h>>2]|0;if((v|0)>=(r|0)){p=18;break a}x=(da(r,v)|0)+u|0;a[(c[m>>2]|0)+x|0]=1;x=c[((c[q>>2]&3|0)==2?n:s)+28>>2]|0;if((a[(c[x+8>>2]|0)+157|0]|0)!=0){o=f;break}Gp(b,x);o=f;break}}}while(0);x=o+1|0;s=c[e>>2]|0;q=c[(c[s+188>>2]|0)+(x<<2)>>2]|0;if((q|0)==0){i=s;p=22;break}else{f=x;n=q}}if((p|0)==10){cc(126736,117264,982,170584)}else if((p|0)==12){cc(124192,117264,983,170584)}else if((p|0)==16){cc(126736,117264,991,170584)}else if((p|0)==18){cc(124192,117264,992,170584)}else if((p|0)==22){j=i;k=j+158|0;a[k]=0;return}}function Hp(d,f){d=d|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0.0,xa=0.0,ya=0,za=0.0,Aa=0.0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;g=i;i=i+8|0;j=g|0;k=d+8|0;if((c[(c[k>>2]|0)+180>>2]|0)==0){i=g;return}go(d);Ip(d);if((a[215376]|0)!=0){no(d)}l=c[k>>2]|0;m=b[l+224>>1]|0;if(m<<16>>16>(b[l+226>>1]|0)){n=l}else{p=m<<16>>16;m=l;q=l;while(1){l=c[m+184>>2]|0;r=c[l+(p*44|0)>>2]|0;if((r|0)>0){s=0;t=0;u=l;while(1){v=(c[(c[u+(p*44|0)+4>>2]|0)+(s<<2)>>2]|0)+8|0;c[(c[v>>2]|0)+236>>2]=t;w=c[v>>2]|0;if((a[w+159|0]|0)==6){x=c[w+216>>2]|0}else{x=1}w=x+t|0;v=s+1|0;y=c[k>>2]|0;z=c[y+184>>2]|0;A=c[z+(p*44|0)>>2]|0;if((v|0)<(A|0)){s=v;t=w;u=z}else{B=w;C=z;D=A;E=y;F=y;break}}}else{B=0;C=l;D=r;E=m;F=q}if((B|0)>(D|0)){u=c[C+(p*44|0)+4>>2]|0;if((u|0)==0){G=kk((B<<2)+4|0)|0}else{G=mk(u,(B<<2)+4|0)|0}c[(c[(c[k>>2]|0)+184>>2]|0)+(p*44|0)+4>>2]=G;u=c[(c[k>>2]|0)+184>>2]|0;t=c[u+(p*44|0)>>2]|0;if((t|0)>0){s=t;t=u;while(1){y=s-1|0;A=c[t+(p*44|0)+4>>2]|0;z=c[A+(y<<2)>>2]|0;c[A+(c[(c[z+8>>2]|0)+236>>2]<<2)>>2]=z;z=c[(c[k>>2]|0)+184>>2]|0;if((y|0)>0){s=y;t=z}else{H=z;break}}}else{H=u}c[H+(p*44|0)>>2]=B;c[(c[(c[(c[k>>2]|0)+184>>2]|0)+(p*44|0)+4>>2]|0)+(B<<2)>>2]=0;t=c[k>>2]|0;I=t;J=t}else{I=E;J=F}if((p|0)<(b[I+226>>1]|0)){p=p+1|0;m=I;q=J}else{n=J;break}}}J=c[n+180>>2]|0;if((J|0)!=0){n=J;do{J=n+8|0;q=c[J>>2]|0;I=c[q+224>>2]|0;if((I|0)==0){K=q}else{Lp(d,I);K=c[J>>2]|0}I=c[K+228>>2]|0;if((I|0)==0){L=K}else{Lp(d,I);L=c[J>>2]|0}J=c[L+204>>2]|0;if((J|0)!=0){I=J;J=0;while(1){if((c[I+(J<<2)>>2]|0)==0){break}else{J=J+1|0}}}n=c[L+164>>2]|0;}while((n|0)!=0)}if((gp(d)|0)!=0){Ip(d)}n=c[k>>2]|0;L=c[n+180>>2]|0;if((L|0)==0){M=n}else{n=L;do{L=n+8|0;K=c[L>>2]|0;J=K+172|0;I=K+244|0;K=c[J+4>>2]|0;c[I>>2]=c[J>>2];c[I+4>>2]=K;K=c[L>>2]|0;I=K+180|0;J=K+252|0;K=c[I+4>>2]|0;c[J>>2]=c[I>>2];c[J+4>>2]=K;K=c[L>>2]|0;J=c[K+180>>2]|0;I=0;while(1){if((c[J+(I<<2)>>2]|0)==0){break}else{I=I+1|0}}J=K+172|0;u=c[J>>2]|0;q=0;while(1){if((c[u+(q<<2)>>2]|0)==0){break}else{q=q+1|0}}c[J+4>>2]=0;u=jk((q+I<<2)+16|0)|0;c[(c[L>>2]|0)+172>>2]=u;c[(c[L>>2]|0)+184>>2]=0;u=jk(16)|0;c[(c[L>>2]|0)+180>>2]=u;n=c[(c[L>>2]|0)+164>>2]|0;}while((n|0)!=0);M=c[k>>2]|0}n=M;u=c[M+184>>2]|0;K=(a[n+113|0]&1)==0;m=c[M+236>>2]|0;c[j>>2]=m;c[j+4>>2]=K?m:5;m=b[M+224>>1]|0;if(m<<16>>16>(b[n+226>>1]|0)){N=M}else{M=m<<16>>16;while(1){m=u+(M*44|0)+4|0;c[(c[(c[c[m>>2]>>2]|0)+8>>2]|0)+232>>2]=0;n=u+(M*44|0)|0;if((c[n>>2]|0)>0){O=+(c[j+((M&1)<<2)>>2]|0);K=0;P=0.0;while(1){p=c[(c[m>>2]|0)+(K<<2)>>2]|0;F=p+8|0;E=c[F>>2]|0;c[E+240>>2]=~~+h[E+96>>3];E=c[F>>2]|0;B=E+204|0;if((c[B+4>>2]|0)>0){H=c[c[B>>2]>>2]|0;if((H|0)==0){Q=0;R=E}else{B=0;G=0;C=H;H=E;while(1){E=c[C>>2]&3;if((c[((E|0)==3?C:C+32|0)+28>>2]|0)==(c[((E|0)==2?C:C-32|0)+28>>2]|0)){E=(hm(C)|0)+B|0;S=E;T=c[F>>2]|0}else{S=B;T=H}E=G+1|0;D=c[(c[T+204>>2]|0)+(E<<2)>>2]|0;if((D|0)==0){Q=S;R=T;break}else{B=S;G=E;C=D;H=T}}}H=R+96|0;h[H>>3]=+(Q|0)+ +h[H>>3]}H=K+1|0;C=c[(c[m>>2]|0)+(H<<2)>>2]|0;if((C|0)==0){U=P}else{G=C+8|0;V=O+(+h[(c[F>>2]|0)+96>>3]+ +h[(c[G>>2]|0)+88>>3]);Jp(p,C,V,0)|0;C=~~(P+V);c[(c[G>>2]|0)+232>>2]=C;U=+(C|0)}C=c[F>>2]|0;G=c[C+112>>2]|0;do{if((G|0)!=0){B=c[C+252>>2]|0;D=c[B>>2]|0;E=c[B+4>>2]|0;B=E;x=(c[(c[(c[((c[D>>2]&3|0)==2?D:D-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)>(c[(c[(c[((c[E>>2]&3|0)==2?B:E-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0);E=x?B:D;t=x?D:B;B=G+8|0;D=c[B>>2]|0;V=+((da(c[(c[k>>2]|0)+236>>2]|0,e[D+170>>1]|0)|0)/2|0|0);x=c[E>>2]&3;s=c[((x|0)==2?E:E-32|0)+28>>2]|0;r=c[((x|0)==3?E:E+32|0)+28>>2]|0;if((Wp(r,s)|0)==0){Jp(s,r,+(~~(+h[(c[r+8>>2]|0)+88>>3]+(V+ +h[(c[s+8>>2]|0)+96>>3]))|0),c[D+156>>2]|0)|0}D=c[t>>2]&3;s=c[((D|0)==3?t:t+32|0)+28>>2]|0;r=c[((D|0)==2?t:t-32|0)+28>>2]|0;if((Wp(r,s)|0)!=0){break}Jp(s,r,+(~~(+h[(c[r+8>>2]|0)+88>>3]+(V+ +h[(c[s+8>>2]|0)+96>>3]))|0),c[(c[B>>2]|0)+156>>2]|0)|0}}while(0);G=(c[F>>2]|0)+188|0;if((c[G+4>>2]|0)>0){C=0;p=G;do{G=c[(c[p>>2]|0)+(C<<2)>>2]|0;B=c[G>>2]&3;s=c[((B|0)==3?G:G+32|0)+28>>2]|0;r=c[((B|0)==2?G:G-32|0)+28>>2]|0;B=(c[(c[s+8>>2]|0)+236>>2]|0)<(c[(c[r+8>>2]|0)+236>>2]|0);t=B?s:r;D=B?r:s;V=+h[(c[t+8>>2]|0)+96>>3]+ +h[(c[D+8>>2]|0)+88>>3];s=G+8|0;G=~~(V+ +(da(c[(c[k>>2]|0)+236>>2]|0,e[(c[s>>2]|0)+170>>1]|0)|0));r=So(t,D)|0;do{if((r|0)==0){B=c[s>>2]|0;if((c[B+96>>2]|0)!=0){break}Jp(t,D,+(G|0),c[B+156>>2]|0)|0}else{W=+(G|0);X=V+ +(c[(c[k>>2]|0)+236>>2]|0);Y=+h[(c[s>>2]|0)+136>>3];B=Y<0.0;if(B){Z=Y+-.5}else{Z=Y+.5}if(W>X+ +(~~Z|0)){_=W}else{if(B){$=Y+-.5}else{$=Y+.5}_=X+ +(~~$|0)}B=~~_;if((B|0)>65535){Fv(1,92328,(aa=i,i=i+16|0,h[aa>>3]=+(B|0),c[aa+8>>2]=65535,aa)|0)|0;i=aa;ba=65535}else{ba=B}B=(c[r+8>>2]|0)+170|0;E=b[B>>1]|0;b[B>>1]=(E&65535|0)>(ba|0)?E:ba&65535}}while(0);C=C+1|0;p=(c[F>>2]|0)+188|0;}while((C|0)<(c[p+4>>2]|0))}if((H|0)<(c[n>>2]|0)){K=H;P=U}else{break}}}K=c[k>>2]|0;if((M|0)<(b[K+226>>1]|0)){M=M+1|0}else{N=K;break}}}M=c[N+180>>2]|0;if((M|0)==0){ea=N}else{N=M;do{M=N+8|0;ba=c[M>>2]|0;Q=c[ba+252>>2]|0;do{if((Q|0)==0){fa=ba}else{R=c[Q>>2]|0;if((R|0)==0){fa=ba;break}else{ga=0;ha=R}while(1){R=bp(d)|0;T=R+8|0;a[(c[T>>2]|0)+156|0]=2;S=ha+8|0;j=c[S>>2]|0;u=~~(+h[j+56>>3]- +h[j+16>>3]);K=(u|0)>0;n=K?0:-u|0;m=K?u:0;u=ha;K=ha+32|0;Jp(R,c[((c[u>>2]&3|0)==3?ha:K)+28>>2]|0,+(m+1|0),c[j+156>>2]|0)|0;j=ha-32|0;Jp(R,c[((c[u>>2]&3|0)==2?ha:j)+28>>2]|0,+(n+1|0),c[(c[S>>2]|0)+156>>2]|0)|0;S=c[u>>2]&3;u=(c[(c[(c[((S|0)==3?ha:K)+28>>2]|0)+8>>2]|0)+232>>2]|0)-m|0;m=(c[(c[(c[((S|0)==2?ha:j)+28>>2]|0)+8>>2]|0)+232>>2]|0)-n|0;c[(c[T>>2]|0)+232>>2]=((u|0)<(m|0)?u:m)-1;m=ga+1|0;u=c[M>>2]|0;T=c[(c[u+252>>2]|0)+(m<<2)>>2]|0;if((T|0)==0){fa=u;break}else{ga=m;ha=T}}}}while(0);N=c[fa+164>>2]|0;}while((N|0)!=0);ea=c[k>>2]|0}if((c[ea+172>>2]|0)>0){Sp(d);Tp(d);Up(d);Vp(d);ia=c[k>>2]|0}else{ia=ea}ea=c[ia+8>>2]|0;do{if((c[ea+84>>2]|0)==3){U=+h[ea+64>>3];_=+h[ea+72>>3];if(U*_<=1.0){break}Qp(d);ia=c[k>>2]|0;$=(c[ia+116>>2]&1|0)==0?U:_;Jp(c[ia+244>>2]|0,c[ia+248>>2]|0,$<65535.0?$:65535.0,1e3)|0}}while(0);ea=d|0;ia=ew(ea,87072)|0;if((ia|0)==0){ja=2147483647}else{$=+rF(ia);ja=~~($*+(Lw(d)|0))}do{if((ok(d,2,ja)|0)!=0){ia=c[k>>2]|0;N=b[ia+224>>1]|0;fa=b[ia+226>>1]|0;a:do{if(N<<16>>16<=fa<<16>>16){ha=N<<16>>16;ga=ia;M=fa;b:while(1){ba=c[ga+184>>2]|0;Q=c[ba+(ha*44|0)>>2]|0;c:do{if((Q|0)>0){H=c[ba+(ha*44|0)+4>>2]|0;T=0;do{ka=c[H+(T<<2)>>2]|0;m=c[ka+8>>2]|0;u=c[m+252>>2]|0;do{if((u|0)!=0){n=u;j=c[n>>2]|0;if((j|0)==0){break}else{la=0;ma=j}do{j=c[ma>>2]&3;if((c[(c[(c[((j|0)==2?ma:ma-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)>(ha|0)){na=ga;oa=M;break c}la=la+1|0;if((c[(c[(c[((j|0)==3?ma:ma+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)>(ha|0)){na=ga;oa=M;break c}ma=c[n+(la<<2)>>2]|0;}while((ma|0)!=0)}}while(0);u=c[m+244>>2]|0;do{if((u|0)!=0){n=u;j=c[n>>2]|0;if((j|0)==0){break}else{pa=0;qa=j}do{j=c[qa>>2]&3;if((c[(c[(c[((j|0)==3?qa:qa+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)>(ha|0)){na=ga;oa=M;break c}pa=pa+1|0;if((c[(c[(c[((j|0)==2?qa:qa-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)>(ha|0)){na=ga;oa=M;break c}qa=c[n+(pa<<2)>>2]|0;}while((qa|0)!=0)}}while(0);T=T+1|0;}while((T|0)<(Q|0));if((ka|0)==0){na=ga;oa=M;break}T=c[H>>2]|0;u=c[c[ba+((((ha|0)<(M<<16>>16|0)?1:-1)+ha|0)*44|0)+4>>2]>>2]|0;if((u|0)==0){break b}m=bp(d)|0;n=m+8|0;a[(c[n>>2]|0)+156|0]=2;Jp(m,T,0.0,0)|0;Jp(m,u,0.0,0)|0;m=c[(c[T+8>>2]|0)+232>>2]|0;T=c[(c[u+8>>2]|0)+232>>2]|0;c[(c[n>>2]|0)+232>>2]=(m|0)<(T|0)?m:T;T=c[k>>2]|0;na=T;oa=b[T+226>>1]|0}else{na=ga;oa=M}}while(0);if((ha|0)<(oa<<16>>16|0)){ha=ha+1|0;ga=na;M=oa}else{break a}}cc(82320,162848,111,170952)}}while(0);fa=ew(ea,87072)|0;if((fa|0)==0){ra=2147483647}else{$=+rF(fa);ra=~~($*+(Lw(d)|0))}if((ok(d,2,ra)|0)==0){break}cc(152680,162848,134,170744)}}while(0);ra=c[k>>2]|0;ea=c[ra+184>>2]|0;oa=b[ra+224>>1]|0;if(oa<<16>>16<=(b[ra+226>>1]|0)){na=oa<<16>>16;oa=ra;while(1){ra=ea+(na*44|0)|0;if((c[ra>>2]|0)>0){ka=ea+(na*44|0)+4|0;qa=na;pa=0;do{ma=(c[(c[ka>>2]|0)+(pa<<2)>>2]|0)+8|0;la=c[ma>>2]|0;h[la+16>>3]=+(c[la+232>>2]|0);c[(c[ma>>2]|0)+232>>2]=qa;pa=pa+1|0;}while((pa|0)<(c[ra>>2]|0));sa=c[k>>2]|0}else{sa=oa}if((na|0)<(b[sa+226>>1]|0)){na=na+1|0;oa=sa}else{break}}}Mp(d,d);sa=c[k>>2]|0;d:do{if((b[sa+226>>1]|0)>0){oa=c[sa+8>>2]|0;na=c[oa+84>>2]|0;if((na|0)==0){break}$=+h[sa+32>>3];ea=~~($- +h[sa+16>>3]);_=+h[sa+40>>3];ra=~~(_- +h[sa+24>>3]);pa=(c[sa+116>>2]&1|0)==0;qa=pa?ra:ea;ka=pa?ea:ra;do{if((na|0)==4){U=+h[oa+48>>3];Z=+h[oa+56>>3];if(U<.001|Z<.001){break d}P=+h[oa+32>>3];O=+h[oa+40>>3];V=U-P-P;P=Z-O-O;O=V/$;Z=P/_;if(!(O<1.0|Z<1.0)){break d}U=O<Z?O:Z;Z=U>.5?U:.5;U=P*+ca(_*Z/P)/_;h[oa+64>>3]=$*(V*+ca($*Z/V)/$);h[(c[(c[k>>2]|0)+8>>2]|0)+72>>3]=_*U;ra=c[k>>2]|0;ta=c[ra+8>>2]|0;ua=ra;va=122}else if((na|0)==2){ta=oa;ua=sa;va=122}else if((na|0)==5){U=+h[oa+64>>3];if(U<=0.0){break d}V=U/$;U=+h[oa+72>>3]/_;if(!(V>1.0&U>1.0)){break d}Z=V<U?V:U;wa=Z;xa=Z;ya=sa}else if((na|0)==1){Z=+h[oa+16>>3];U=+(qa|0)/+(ka|0);if(U<Z){wa=1.0;xa=Z/U;ya=sa;break}else{wa=U/Z;xa=1.0;ya=sa;break}}else{break d}}while(0);do{if((va|0)==122){_=+h[ta+64>>3];if(_<=0.0){break d}$=_/+(ka|0);_=+h[ta+72>>3]/+(qa|0);if(!($<1.0|_<1.0)){wa=$;xa=_;ya=ua;break}if($<_){wa=1.0;xa=_/$;ya=ua;break}else{wa=$/_;xa=1.0;ya=ua;break}}}while(0);qa=(c[ya+116>>2]&1|0)==0;_=qa?xa:wa;$=qa?wa:xa;qa=c[ya+180>>2]|0;if((qa|0)!=0){ka=qa;do{qa=ka+8|0;oa=(c[qa>>2]|0)+16|0;Z=$*+h[oa>>3];if(Z<0.0){za=Z+-.5}else{za=Z+.5}h[oa>>3]=+(~~za|0);oa=(c[qa>>2]|0)+24|0;Z=_*+h[oa>>3];if(Z<0.0){Aa=Z+-.5}else{Aa=Z+.5}h[oa>>3]=+(~~Aa|0);ka=c[(c[qa>>2]|0)+164>>2]|0;}while((ka|0)!=0)}Np(d,$,_)}}while(0);e:do{if((f|0)!=0){ya=c[k>>2]|0;Aa=+h[ya+32>>3]- +h[ya+16>>3];za=+h[ya+40>>3]- +h[ya+24>>3];xa=Aa/za;if((a[213992]|0)!=0){ya=c[o>>2]|0;gc(ya|0,131256,(aa=i,i=i+16|0,h[aa>>3]=xa,h[aa+8>>3]=Aa*za/1.0e4,aa)|0)|0;i=aa;ua=Nn(d)|0;gc(ya|0,116648,(aa=i,i=i+8|0,c[aa>>2]=ua,aa)|0)|0;i=aa}za=+h[f>>3];do{if(xa>za*1.1){c[f+24>>2]=~~(za*+((c[f+20>>2]|0)-(c[f+16>>2]|0)|0)/xa)}else{ua=f+24|0;if(xa>za*.8){c[ua>>2]=0;break}c[ua>>2]=-1;if((a[213992]|0)==0){break e}Ma(109280,34,1,c[o>>2]|0)|0}}while(0);if((a[213992]|0)==0){break}gc(c[o>>2]|0,103400,(aa=i,i=i+8|0,c[aa>>2]=c[f+24>>2],aa)|0)|0;i=aa}}while(0);aa=c[(c[k>>2]|0)+180>>2]|0;f:do{if((aa|0)!=0){f=aa;do{d=f+8|0;ua=c[d>>2]|0;ya=c[ua+180>>2]|0;ta=c[ya>>2]|0;if((ta|0)==0){Ba=ya;Ca=ua}else{ua=0;ya=ta;while(1){eF(c[ya+8>>2]|0);eF(ya|0);ta=ua+1|0;va=c[d>>2]|0;sa=c[va+180>>2]|0;ka=c[sa+(ta<<2)>>2]|0;if((ka|0)==0){Ba=sa;Ca=va;break}else{ua=ta;ya=ka}}}if((Ba|0)==0){Da=Ca}else{eF(Ba);Da=c[d>>2]|0}ya=c[Da+172>>2]|0;if((ya|0)==0){Ea=Da}else{eF(ya);Ea=c[d>>2]|0}ya=Ea+252|0;ua=Ea+180|0;ka=c[ya+4>>2]|0;c[ua>>2]=c[ya>>2];c[ua+4>>2]=ka;ka=c[d>>2]|0;ua=ka+244|0;ya=ka+172|0;ka=c[ua+4>>2]|0;c[ya>>2]=c[ua>>2];c[ya+4>>2]=ka;f=c[(c[d>>2]|0)+164>>2]|0;}while((f|0)!=0);f=c[(c[k>>2]|0)+180>>2]|0;if((f|0)==0){break}else{Fa=f;Ga=0}while(1){f=Ga+8|0;g:do{if((Ga|0)==0){ka=Fa;while(1){ya=ka+8|0;ua=c[ya>>2]|0;ta=c[ua+164>>2]|0;if((a[ua+156|0]|0)!=2){Ha=ka;Ia=ta;break g}c[(c[k>>2]|0)+180>>2]=ta;eF(c[ya>>2]|0);eF(ka);if((ta|0)==0){break f}else{ka=ta}}}else{ka=Fa;while(1){ta=ka+8|0;ya=c[ta>>2]|0;ua=c[ya+164>>2]|0;if((a[ya+156|0]|0)!=2){Ha=ka;Ia=ua;break g}c[(c[f>>2]|0)+164>>2]=ua;eF(c[ta>>2]|0);eF(ka);if((ua|0)==0){break f}else{ka=ua}}}}while(0);if((Ia|0)==0){break}else{Fa=Ia;Ga=Ha}}}}while(0);c[(c[(c[(c[k>>2]|0)+180>>2]|0)+8>>2]|0)+168>>2]=0;i=g;return}function Ip(d){d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;e=d+8|0;f=c[e>>2]|0;g=c[f+184>>2]|0;i=b[f+224>>1]|0;if(i<<16>>16<=(b[f+226>>1]|0)){j=i<<16>>16;i=f;while(1){f=g+(j*44|0)|0;if((c[f>>2]|0)>0){k=g+(j*44|0)+4|0;l=g+(j*44|0)+28|0;m=g+(j*44|0)+20|0;n=g+(j*44|0)+24|0;o=g+(j*44|0)+16|0;p=0;do{q=(c[(c[k>>2]|0)+(p<<2)>>2]|0)+8|0;r=c[q>>2]|0;s=+h[r+80>>3];if(s<0.0){t=s+-.5}else{t=s+.5}u=(~~t+1|0)/2|0;v=c[r+204>>2]|0;do{if((v|0)==0){w=u}else{r=v;x=c[r>>2]|0;if((x|0)==0){w=u;break}else{y=u;z=0;A=x}while(1){x=c[A>>2]&3;do{if((c[((x|0)==3?A:A+32|0)+28>>2]|0)==(c[((x|0)==2?A:A-32|0)+28>>2]|0)){B=c[(c[A+8>>2]|0)+96>>2]|0;if((B|0)==0){C=y;break}s=+(y|0);D=+h[B+32>>3]*.5;C=~~(s>D?s:D)}else{C=y}}while(0);x=z+1|0;B=c[r+(x<<2)>>2]|0;if((B|0)==0){w=C;break}else{y=C;z=x;A=B}}}}while(0);if((c[l>>2]|0)<(w|0)){c[m>>2]=w;c[l>>2]=w}if((c[n>>2]|0)<(w|0)){c[o>>2]=w;c[n>>2]=w}u=c[q>>2]|0;v=c[u+212>>2]|0;do{if((v|0)!=0){if((v|0)==(d|0)){E=0;F=u}else{r=Em(v,c[53720]|0,8,0)|0;E=r;F=c[q>>2]|0}r=c[F+232>>2]|0;B=v+8|0;x=c[B>>2]|0;if((r|0)==(b[x+224>>1]|0)){G=x+124|0;H=c[G>>2]|0;I=E+w|0;c[G>>2]=(H|0)>(I|0)?H:I;J=c[(c[q>>2]|0)+232>>2]|0;K=c[B>>2]|0}else{J=r;K=x}if((J|0)!=(b[K+226>>1]|0)){break}x=c[K+120>>2]|0;r=E+w|0;c[K+120>>2]=(x|0)>(r|0)?x:r}}while(0);p=p+1|0;}while((p|0)<(c[f>>2]|0));L=c[e>>2]|0}else{L=i}if((j|0)<(b[L+226>>1]|0)){j=j+1|0;i=L}else{break}}}L=Op(d)|0;i=b[(c[e>>2]|0)+226>>1]|0;j=i<<16>>16;h[(c[(c[c[g+(j*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]=+(c[g+(j*44|0)+16>>2]|0);K=c[e>>2]|0;if(i<<16>>16>(b[K+224>>1]|0)){i=0;w=j;j=K;while(1){E=w-1|0;J=(c[g+(E*44|0)+24>>2]|0)+(c[g+(w*44|0)+28>>2]|0)+(c[j+240>>2]|0)|0;F=(c[g+(w*44|0)+20>>2]|0)+8+(c[g+(E*44|0)+16>>2]|0)|0;A=(J|0)>(F|0)?J:F;if((c[g+(E*44|0)>>2]|0)>0){h[(c[(c[c[g+(E*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]=+(A|0)+ +h[(c[(c[c[g+(w*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3];M=c[e>>2]|0}else{M=j}F=(i|0)>(A|0)?i:A;if((E|0)>(b[M+224>>1]|0)){i=F;w=E;j=M}else{N=F;O=M;break}}}else{N=0;O=K}do{if((L|0)==0){P=N;Q=O}else{if((c[O+116>>2]&1|0)==0){P=N;Q=O;break}Pp(d,0);K=c[e>>2]|0;if((a[K+264|0]|0)==0){P=N;Q=K;break}M=b[K+226>>1]|0;j=M<<16>>16;w=b[K+224>>1]|0;if(M<<16>>16<=w<<16>>16){P=0;Q=K;break}M=w<<16>>16;w=~~+h[(c[(c[c[g+(j*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3];i=0;F=j;while(1){j=F-1|0;E=~~+h[(c[(c[c[g+(j*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3];A=E-w|0;J=(i|0)>(A|0)?i:A;if((j|0)>(M|0)){w=E;i=J;F=j}else{P=J;Q=K;break}}}}while(0);do{if((a[Q+264|0]|0)==0){R=Q}else{N=b[Q+226>>1]|0;if(N<<16>>16<=(b[Q+224>>1]|0)){R=Q;break}t=+(P|0);d=N<<16>>16;N=Q;while(1){O=d-1|0;if((c[g+(O*44|0)>>2]|0)>0){h[(c[(c[c[g+(O*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]=t+ +h[(c[(c[c[g+(d*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3];S=c[e>>2]|0}else{S=N}if((O|0)>(b[S+224>>1]|0)){d=O;N=S}else{R=S;break}}}}while(0);S=c[R+180>>2]|0;if((S|0)==0){return}else{T=S}do{S=T+8|0;R=c[S>>2]|0;h[R+24>>3]=+h[(c[(c[c[g+((c[R+232>>2]|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3];T=c[(c[S>>2]|0)+164>>2]|0;}while((T|0)!=0);return}function Jp(a,d,e,f){a=a|0;d=d|0;e=+e;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0.0;g=i;j=jk(64)|0;k=j+32|0;l=k;c[l>>2]=c[l>>2]|3;l=j;m=j;c[m>>2]=c[m>>2]&-4|2;n=j+8|0;c[n>>2]=jk(176)|0;c[((c[m>>2]&3|0)==3?l:k)+28>>2]=a;c[((c[m>>2]&3|0)==2?l:j-32|0)+28>>2]=d;do{if(e>65535.0){Fv(1,92328,(d=i,i=i+16|0,h[d>>3]=e,c[d+8>>2]=65535,d)|0)|0;i=d;o=65535.0;p=4}else{if(e>=0.0){o=e;p=4;break}q=e+-.5}}while(0);if((p|0)==4){q=o+.5}b[(c[n>>2]|0)+170>>1]=~~q;c[(c[n>>2]|0)+156>>2]=f;Uo(l)|0;i=g;return l|0}function Kp(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=c[b+8>>2]|0;b=a[e+84|0]|0;f=c[d+8>>2]|0;if(b<<24>>24!=(a[f+84|0]|0)){g=0;return g|0}do{if(+h[e+56>>3]==+h[f+56>>3]){if(+h[e+64>>3]==+h[f+64>>3]|b<<24>>24==0){break}else{g=0}return g|0}else{if(b<<24>>24==0){break}else{g=0}return g|0}}while(0);do{if(+h[e+16>>3]==+h[f+16>>3]){if(+h[e+24>>3]==+h[f+24>>3]){g=1}else{break}return g|0}}while(0);g=(a[e+44|0]|0)==0|0;return g|0}function Lp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=b+8|0;e=c[d>>2]|0;if((c[e+216>>2]|0)<2){return}f=~~(+h[e+16>>3]- +h[e+88>>3]);g=~~+h[e+24>>3];e=b|0;vn(b,c[(c[(Hx(e)|0)+8>>2]|0)+116>>2]&1);i=+(g|0);h[(c[d>>2]|0)+24>>3]=i;j=+(f|0);f=c[d>>2]|0;h[f+16>>3]=j+ +h[f+88>>3];f=c[d>>2]|0;k=j+ +h[f+88>>3]+ +h[f+96>>3];f=~~(k+ +(c[(c[(Hx(e)|0)+8>>2]|0)+236>>2]|0));e=c[d>>2]|0;d=e+180|0;if((c[d+4>>2]|0)>0){g=c[c[d>>2]>>2]|0;d=c[e+236>>2]|0;l=pw(a,c[((c[g>>2]&3|0)==2?g:g-32|0)+28>>2]|0)|0;if((l|0)==0){return}g=f;m=l;l=d+1|0;while(1){d=(c[m>>2]&3|0)==2?m:m-32|0;n=d;o=d+32|0;p=c[((c[n>>2]&3|0)==3?d:o)+28>>2]|0;do{if((p|0)==(b|0)){q=l;r=g}else{if((Lm(p)|0)!=(b|0)){q=l;r=g;break}s=c[((c[n>>2]&3|0)==3?d:o)+28>>2]|0;t=s|0;u=Hx(t)|0;v=Lm(s)|0;if((v|0)!=(s|0)){$o(v,s)}w=s+8|0;c[(c[w>>2]|0)+236>>2]=l;c[(c[w>>2]|0)+232>>2]=c[(c[v+8>>2]|0)+232>>2];v=c[w>>2]|0;c[(c[(c[(c[u+8>>2]|0)+184>>2]|0)+((c[v+232>>2]|0)*44|0)+4>>2]|0)+(c[v+236>>2]<<2)>>2]=s;vn(s,c[(c[(Hx(t)|0)+8>>2]|0)+116>>2]&1);h[(c[w>>2]|0)+24>>3]=i;k=+(g|0);s=c[w>>2]|0;h[s+16>>3]=k+ +h[s+88>>3];s=c[w>>2]|0;j=k+ +h[s+88>>3]+ +h[s+96>>3];s=~~(j+ +(c[(c[(Hx(t)|0)+8>>2]|0)+236>>2]|0));fp(d);t=d-32|0;w=(c[(c[((c[n>>2]&3|0)==2?d:t)+28>>2]|0)+8>>2]|0)+172|0;v=c[w>>2]|0;if((v|0)==0){x=kk((c[w+4>>2]<<2)+8|0)|0}else{x=mk(v,(c[w+4>>2]<<2)+8|0)|0}c[(c[(c[((c[n>>2]&3|0)==2?d:t)+28>>2]|0)+8>>2]|0)+172>>2]=x;w=(c[(c[((c[n>>2]&3|0)==2?d:t)+28>>2]|0)+8>>2]|0)+176|0;v=c[w>>2]|0;c[w>>2]=v+1;c[(c[(c[(c[((c[n>>2]&3|0)==2?d:t)+28>>2]|0)+8>>2]|0)+172>>2]|0)+(v<<2)>>2]=d;v=(c[(c[((c[n>>2]&3|0)==2?d:t)+28>>2]|0)+8>>2]|0)+172|0;c[(c[v>>2]|0)+(c[v+4>>2]<<2)>>2]=0;q=l+1|0;r=s}}while(0);d=qw(a,m)|0;if((d|0)==0){break}else{g=r;m=d;l=q}}return}else{q=c[c[e+172>>2]>>2]|0;l=c[e+236>>2]|0;e=mw(a,c[((c[q>>2]&3|0)==3?q:q+32|0)+28>>2]|0)|0;if((e|0)==0){return}q=f;f=e;e=l+1|0;while(1){l=f;m=f-32|0;r=c[((c[l>>2]&3|0)==2?f:m)+28>>2]|0;do{if((r|0)==(b|0)){y=e;z=q}else{if((Lm(r)|0)!=(b|0)){y=e;z=q;break}g=c[((c[l>>2]&3|0)==2?f:m)+28>>2]|0;x=g|0;d=Hx(x)|0;n=Lm(g)|0;if((n|0)!=(g|0)){$o(n,g)}o=g+8|0;c[(c[o>>2]|0)+236>>2]=e;c[(c[o>>2]|0)+232>>2]=c[(c[n+8>>2]|0)+232>>2];n=c[o>>2]|0;c[(c[(c[(c[d+8>>2]|0)+184>>2]|0)+((c[n+232>>2]|0)*44|0)+4>>2]|0)+(c[n+236>>2]<<2)>>2]=g;vn(g,c[(c[(Hx(x)|0)+8>>2]|0)+116>>2]&1);h[(c[o>>2]|0)+24>>3]=i;j=+(q|0);g=c[o>>2]|0;h[g+16>>3]=j+ +h[g+88>>3];g=c[o>>2]|0;k=j+ +h[g+88>>3]+ +h[g+96>>3];g=~~(k+ +(c[(c[(Hx(x)|0)+8>>2]|0)+236>>2]|0));fp(f);x=f+32|0;o=(c[(c[((c[l>>2]&3|0)==3?f:x)+28>>2]|0)+8>>2]|0)+180|0;n=c[o>>2]|0;if((n|0)==0){A=kk((c[o+4>>2]<<2)+8|0)|0}else{A=mk(n,(c[o+4>>2]<<2)+8|0)|0}c[(c[(c[((c[l>>2]&3|0)==3?f:x)+28>>2]|0)+8>>2]|0)+180>>2]=A;o=(c[(c[((c[l>>2]&3|0)==3?f:x)+28>>2]|0)+8>>2]|0)+184|0;n=c[o>>2]|0;c[o>>2]=n+1;c[(c[(c[(c[((c[l>>2]&3|0)==3?f:x)+28>>2]|0)+8>>2]|0)+180>>2]|0)+(n<<2)>>2]=f;n=(c[(c[((c[l>>2]&3|0)==3?f:x)+28>>2]|0)+8>>2]|0)+180|0;c[(c[n>>2]|0)+(c[n+4>>2]<<2)>>2]=0;y=e+1|0;z=g}}while(0);l=ow(a,f)|0;if((l|0)==0){break}else{q=z;f=l;e=y}}return}}function Mp(d,e){d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0,G=0.0,H=0.0,I=0,J=0,K=0.0,L=0.0;f=d+8|0;g=c[f>>2]|0;if((c[g+172>>2]|0)>=1){i=1;j=g;while(1){Mp(c[(c[j+176>>2]|0)+(i<<2)>>2]|0,e);g=c[f>>2]|0;if((i|0)<(c[g+172>>2]|0)){i=i+1|0;j=g}else{break}}}j=(Ix(d|0)|0)==(d|0);d=c[f>>2]|0;do{if(j){i=b[d+224>>1]|0;g=b[d+226>>1]|0;if(i<<16>>16>g<<16>>16){k=2147483647.0;l=-2147483647.0}else{m=g<<16>>16;n=c[d+184>>2]|0;o=2147483647.0;p=-2147483647.0;q=i<<16>>16;while(1){r=c[n+(q*44|0)>>2]|0;do{if((r|0)==0){s=p;t=o}else{u=c[n+(q*44|0)+4>>2]|0;v=c[u>>2]|0;if((v|0)==0){s=p;t=o;break}w=c[v+8>>2]|0;v=a[w+156|0]|0;if(v<<24>>24!=0&(r|0)>1){x=1;while(1){y=x+1|0;z=c[(c[u+(x<<2)>>2]|0)+8>>2]|0;A=a[z+156|0]|0;if(A<<24>>24!=0&(y|0)<(r|0)){x=y}else{B=z;C=A;break}}}else{B=w;C=v}if(C<<24>>24!=0){s=p;t=o;break}D=+(~~(+h[B+16>>3]- +h[B+88>>3])|0);E=o<D?o:D;x=c[(c[u+(r-1<<2)>>2]|0)+8>>2]|0;if((a[x+156|0]|0)==0){F=x}else{x=r-2|0;while(1){A=c[(c[u+(x<<2)>>2]|0)+8>>2]|0;if((a[A+156|0]|0)==0){F=A;break}else{x=x-1|0}}}D=+(~~(+h[F+16>>3]+ +h[F+96>>3])|0);s=p>D?p:D;t=E}}while(0);if((q|0)<(m|0)){o=t;p=s;q=q+1|0}else{k=t;l=s;break}}}q=c[d+172>>2]|0;if((q|0)<1){G=l;H=k;I=g;J=i;break}m=c[d+176>>2]|0;p=k;n=1;o=l;while(1){r=c[(c[m+(n<<2)>>2]|0)+8>>2]|0;D=+(~~(+h[r+16>>3]+-8.0)|0);K=p<D?p:D;D=+(~~(+h[r+32>>3]+8.0)|0);L=o>D?o:D;if((n|0)<(q|0)){p=K;n=n+1|0;o=L}else{G=L;H=K;I=g;J=i;break}}}else{G=+(c[(c[(c[d+248>>2]|0)+8>>2]|0)+232>>2]|0);H=+(c[(c[(c[d+244>>2]|0)+8>>2]|0)+232>>2]|0);I=b[d+226>>1]|0;J=b[d+224>>1]|0}}while(0);F=c[(c[e+8>>2]|0)+184>>2]|0;l=+h[(c[(c[c[F+((I<<16>>16)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]- +(c[d+120>>2]|0);k=+h[(c[(c[c[F+((J<<16>>16)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]+ +(c[d+124>>2]|0);h[d+16>>3]=H;h[d+24>>3]=l;d=c[f>>2]|0;h[d+32>>3]=G;h[d+40>>3]=k;return}function Np(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,g=0,i=0;e=a+8|0;a=c[e>>2]|0;if((c[a+172>>2]|0)<1){f=a}else{g=1;i=a;while(1){Np(c[(c[i+176>>2]|0)+(g<<2)>>2]|0,b,d);a=c[e>>2]|0;if((g|0)<(c[a+172>>2]|0)){g=g+1|0;i=a}else{f=a;break}}}i=f+16|0;h[i>>3]=+h[i>>3]*b;i=(c[e>>2]|0)+24|0;h[i>>3]=+h[i>>3]*d;i=(c[e>>2]|0)+32|0;h[i>>3]=+h[i>>3]*b;i=(c[e>>2]|0)+40|0;h[i>>3]=+h[i>>3]*d;return}function Op(a){a=a|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;d=a|0;e=c[(c[(Ix(d)|0)+8>>2]|0)+184>>2]|0;if((Ix(d)|0)==(a|0)){f=8}else{f=Em(d,c[53720]|0,8,0)|0}g=a+8|0;i=c[g>>2]|0;j=c[i+120>>2]|0;k=c[i+124>>2]|0;if((c[i+172>>2]|0)<1){l=k;m=j;n=0}else{o=k;k=j;j=1;p=0;q=i;while(1){i=c[(c[q+176>>2]|0)+(j<<2)>>2]|0;r=Op(i)|0|p;s=c[i+8>>2]|0;i=c[g>>2]|0;if((b[s+226>>1]|0)==(b[i+226>>1]|0)){t=(c[s+120>>2]|0)+f|0;u=(k|0)>(t|0)?k:t}else{u=k}if((b[s+224>>1]|0)==(b[i+224>>1]|0)){t=(c[s+124>>2]|0)+f|0;v=(o|0)>(t|0)?o:t}else{v=o}if((j|0)<(c[i+172>>2]|0)){o=v;k=u;j=j+1|0;p=r;q=i}else{l=v;m=u;n=r;break}}}do{if((Ix(d)|0)==(a|0)){w=n;x=m;y=l}else{if((c[(c[g>>2]|0)+12>>2]|0)==0){w=n;x=m;y=l;break}if((c[(c[(Ix(d)|0)+8>>2]|0)+116>>2]&1|0)!=0){w=1;x=m;y=l;break}u=c[g>>2]|0;w=1;x=~~(+(m|0)+ +h[u+56>>3]);y=~~(+(l|0)+ +h[u+88>>3])}}while(0);c[(c[g>>2]|0)+120>>2]=x;c[(c[g>>2]|0)+124>>2]=y;if((Ix(d)|0)==(a|0)){return w|0}a=e+((b[(c[g>>2]|0)+224>>1]|0)*44|0)+20|0;d=c[a>>2]|0;c[a>>2]=(d|0)>(y|0)?d:y;y=e+((b[(c[g>>2]|0)+226>>1]|0)*44|0)+16|0;g=c[y>>2]|0;c[y>>2]=(g|0)>(x|0)?g:x;return w|0}function Pp(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0;e=a|0;f=c[(c[(Ix(e)|0)+8>>2]|0)+184>>2]|0;if((Ix(e)|0)==(a|0)){g=0}else{g=Em(e,c[53720]|0,8,0)|0}i=a+8|0;j=c[i>>2]|0;k=c[j+120>>2]|0;l=c[j+124>>2]|0;if((c[j+172>>2]|0)<1){m=k;n=l;o=j}else{p=g+d|0;q=k;k=l;l=1;r=j;while(1){j=c[(c[r+176>>2]|0)+(l<<2)>>2]|0;Pp(j,p);s=c[j+8>>2]|0;j=c[i>>2]|0;if((b[s+226>>1]|0)==(b[j+226>>1]|0)){t=(c[s+120>>2]|0)+g|0;u=(q|0)>(t|0)?q:t}else{u=q}if((b[s+224>>1]|0)==(b[j+224>>1]|0)){t=(c[s+124>>2]|0)+g|0;v=(k|0)>(t|0)?k:t}else{v=k}if((l|0)<(c[j+172>>2]|0)){q=u;k=v;l=l+1|0;r=j}else{m=u;n=v;o=j;break}}}c[o+120>>2]=m;c[(c[i>>2]|0)+124>>2]=n;do{if((Ix(e)|0)!=(a|0)){o=c[i>>2]|0;if((c[o+12>>2]|0)==0){break}w=+h[o+104>>3];x=+h[o+72>>3];v=~~(w>x?w:x)-(n+m)-~~(+h[(c[(c[c[f+((b[o+224>>1]|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]- +h[(c[(c[c[f+((b[o+226>>1]|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3])|0;if((v|0)<=0){break}o=(Ix(e)|0)+8|0;u=c[(c[o>>2]|0)+184>>2]|0;r=c[i>>2]|0;l=b[r+226>>1]|0;k=l<<16>>16;q=b[r+224>>1]|0;g=q<<16>>16;p=(v+1|0)/2|0;j=(c[r+120>>2]|0)+p+(d-(c[u+(k*44|0)+16>>2]|0))|0;if((j|0)>0){if(l<<16>>16<q<<16>>16){y=r}else{x=+(j|0);l=k;while(1){if((c[u+(l*44|0)>>2]|0)>0){k=(c[(c[c[u+(l*44|0)+4>>2]>>2]|0)+8>>2]|0)+24|0;h[k>>3]=x+ +h[k>>3]}if((l|0)>(g|0)){l=l-1|0}else{break}}y=c[i>>2]|0}z=v+d-p+j+(c[y+124>>2]|0)-(c[u+(g*44|0)+20>>2]|0)|0;A=y}else{z=v+d-p+(c[r+124>>2]|0)-(c[u+(g*44|0)+20>>2]|0)|0;A=r}do{if((z|0)>0){l=c[o>>2]|0;if(q<<16>>16<=(b[l+224>>1]|0)){B=A;break}x=+(z|0);k=g;t=l;while(1){l=k-1|0;if((c[u+(l*44|0)>>2]|0)>0){s=(c[(c[c[u+(l*44|0)+4>>2]>>2]|0)+8>>2]|0)+24|0;h[s>>3]=x+ +h[s>>3];C=c[o>>2]|0}else{C=t}if((l|0)>(b[C+224>>1]|0)){k=l;t=C}else{break}}B=c[i>>2]|0}else{B=A}}while(0);o=B+124|0;c[o>>2]=v-p+(c[o>>2]|0);o=(c[i>>2]|0)+120|0;c[o>>2]=(c[o>>2]|0)+p}}while(0);if((Ix(e)|0)==(a|0)){return}a=c[i>>2]|0;e=f+((b[a+224>>1]|0)*44|0)+20|0;B=c[e>>2]|0;A=c[a+124>>2]|0;c[e>>2]=(B|0)>(A|0)?B:A;A=c[i>>2]|0;i=f+((b[A+226>>1]|0)*44|0)+16|0;f=c[i>>2]|0;B=c[A+120>>2]|0;c[i>>2]=(f|0)>(B|0)?f:B;return}function Qp(a){a=a|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0;d=i;e=a|0;f=Em(e,c[53720]|0,8,0)|0;Rp(a);g=a+8|0;a=c[g>>2]|0;j=c[a+244>>2]|0;k=c[a+248>>2]|0;l=b[a+224>>1]|0;if(l<<16>>16>(b[a+226>>1]|0)){i=d;return}m=+(f|0);f=l<<16>>16;l=a;while(1){a=c[l+184>>2]|0;do{if((c[a+(f*44|0)>>2]|0)!=0){n=c[c[a+(f*44|0)+4>>2]>>2]|0;if((n|0)==0){o=$w(e)|0;Fv(1,97888,(p=i,i=i+16|0,c[p>>2]=o,c[p+8>>2]=f,p)|0)|0;i=p;break}else{Jp(j,n,m+ +h[(c[n+8>>2]|0)+88>>3]+ +h[l+96>>3],0)|0;n=c[g>>2]|0;p=c[n+184>>2]|0;o=c[(c[p+(f*44|0)+4>>2]|0)+((c[p+(f*44|0)>>2]|0)-1<<2)>>2]|0;Jp(o,k,m+ +h[(c[o+8>>2]|0)+96>>3]+ +h[n+64>>3],0)|0;break}}}while(0);a=c[g>>2]|0;if((f|0)<(b[a+226>>1]|0)){f=f+1|0;l=a}else{break}}i=d;return}function Rp(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0.0;d=b+8|0;if((c[(c[d>>2]|0)+244>>2]|0)!=0){return}e=b|0;f=bp(Ix(e)|0)|0;a[(c[f+8>>2]|0)+156|0]=2;g=bp(Ix(e)|0)|0;a[(c[g+8>>2]|0)+156|0]=2;do{if((c[(c[d>>2]|0)+12>>2]|0)!=0){if((Ix(e)|0)==(b|0)){break}if((c[(c[(Ix(e)|0)+8>>2]|0)+116>>2]&1|0)!=0){break}i=c[d>>2]|0;j=+h[i+48>>3];k=+h[i+80>>3];Jp(f,g,+(~~(j>k?j:k)|0),0)|0}}while(0);c[(c[d>>2]|0)+244>>2]=f;c[(c[d>>2]|0)+248>>2]=g;return}function Sp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;do{if((Ix(a|0)|0)==(a|0)){b=a+8|0}else{Qp(a);d=a+8|0;e=c[d>>2]|0;f=So(c[e+244>>2]|0,c[e+248>>2]|0)|0;if((f|0)==0){e=c[d>>2]|0;Jp(c[e+244>>2]|0,c[e+248>>2]|0,1.0,128)|0;b=d;break}else{e=(c[f+8>>2]|0)+156|0;c[e>>2]=(c[e>>2]|0)+128;b=d;break}}}while(0);a=c[b>>2]|0;if((c[a+172>>2]|0)<1){return}else{g=1;h=a}while(1){Sp(c[(c[h+176>>2]|0)+(g<<2)>>2]|0);a=c[b>>2]|0;if((g|0)<(c[a+172>>2]|0)){g=g+1|0;h=a}else{break}}return}function Tp(d){d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;e=d|0;f=Em(e,c[53720]|0,8,0)|0;g=d+8|0;i=c[g>>2]|0;j=b[i+224>>1]|0;if(j<<16>>16>(b[i+226>>1]|0)){k=i}else{l=+(f|0);f=j<<16>>16;j=i;while(1){i=c[j+184>>2]|0;a:do{if((c[i+(f*44|0)>>2]|0)!=0){m=c[c[i+(f*44|0)+4>>2]>>2]|0;if((m|0)==0){break}n=m+8|0;m=c[(c[n>>2]|0)+236>>2]|0;b:do{if((m|0)>0){o=m;c:while(1){o=o-1|0;p=c[(c[(c[(c[(Ix(e)|0)+8>>2]|0)+184>>2]|0)+(f*44|0)+4>>2]|0)+(o<<2)>>2]|0;q=p+8|0;r=c[q>>2]|0;s=a[r+156|0]|0;do{if((s<<24>>24|0)==1){t=c[c[r+252>>2]>>2]|0;u=c[(c[t+8>>2]|0)+116>>2]|0;if((u|0)==0){v=t}else{t=u;while(1){u=c[(c[t+8>>2]|0)+116>>2]|0;if((u|0)==0){break}else{t=u}}v=t}u=v;if((Rx(d,c[((c[u>>2]&3|0)==3?v:v+32|0)+28>>2]|0)|0)!=0){break}if((Rx(d,c[((c[u>>2]&3|0)==2?v:v-32|0)+28>>2]|0)|0)==0){w=14;break c}}else if((s<<24>>24|0)==0){x=r;break c}}while(0);if((o|0)<=0){break b}}if((w|0)==14){w=0;x=c[q>>2]|0}Jp(p,c[(c[g>>2]|0)+244>>2]|0,l+ +h[x+96>>3],0)|0}}while(0);m=(c[(c[(c[g>>2]|0)+184>>2]|0)+(f*44|0)>>2]|0)+(c[(c[n>>2]|0)+236>>2]|0)|0;if((m|0)<(c[(c[(c[(Ix(e)|0)+8>>2]|0)+184>>2]|0)+(f*44|0)>>2]|0)){y=m}else{break}d:while(1){z=c[(c[(c[(c[(Ix(e)|0)+8>>2]|0)+184>>2]|0)+(f*44|0)+4>>2]|0)+(y<<2)>>2]|0;A=z+8|0;m=c[A>>2]|0;o=a[m+156|0]|0;do{if((o<<24>>24|0)==1){r=c[c[m+252>>2]>>2]|0;s=c[(c[r+8>>2]|0)+116>>2]|0;if((s|0)==0){B=r}else{r=s;while(1){s=c[(c[r+8>>2]|0)+116>>2]|0;if((s|0)==0){break}else{r=s}}B=r}s=B;if((Rx(d,c[((c[s>>2]&3|0)==3?B:B+32|0)+28>>2]|0)|0)!=0){break}if((Rx(d,c[((c[s>>2]&3|0)==2?B:B-32|0)+28>>2]|0)|0)==0){w=23;break d}}else if((o<<24>>24|0)==0){C=m;break d}}while(0);y=y+1|0;if((y|0)>=(c[(c[(c[(Ix(e)|0)+8>>2]|0)+184>>2]|0)+(f*44|0)>>2]|0)){break a}}if((w|0)==23){w=0;C=c[A>>2]|0}Jp(c[(c[g>>2]|0)+248>>2]|0,z,l+ +h[C+88>>3],0)|0}}while(0);i=c[g>>2]|0;if((f|0)<(b[i+226>>1]|0)){f=f+1|0;j=i}else{k=i;break}}}if((c[k+172>>2]|0)<1){return}else{D=1;E=k}while(1){Tp(c[(c[E+176>>2]|0)+(D<<2)>>2]|0);k=c[g>>2]|0;if((D|0)<(c[k+172>>2]|0)){D=D+1|0;E=k}else{break}}return}function Up(a){a=a|0;var b=0,d=0,e=0.0,f=0,g=0,i=0;b=Em(a|0,c[53720]|0,8,0)|0;Rp(a);d=a+8|0;a=c[d>>2]|0;if((c[a+172>>2]|0)<1){return}e=+(b|0);b=1;f=a;while(1){a=c[(c[f+176>>2]|0)+(b<<2)>>2]|0;Rp(a);g=c[d>>2]|0;i=a+8|0;Jp(c[g+244>>2]|0,c[(c[i>>2]|0)+244>>2]|0,e+ +h[g+96>>3],0)|0;g=c[d>>2]|0;Jp(c[(c[i>>2]|0)+248>>2]|0,c[g+248>>2]|0,e+ +h[g+64>>3],0)|0;Up(a);a=c[d>>2]|0;if((b|0)<(c[a+172>>2]|0)){b=b+1|0;f=a}else{break}}return}function Vp(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=Em(a|0,c[53720]|0,8,0)|0;e=a+8|0;a=c[e>>2]|0;if((c[a+172>>2]|0)<1){return}else{f=1;g=a}while(1){Rp(c[(c[g+176>>2]|0)+(f<<2)>>2]|0);h=c[e>>2]|0;i=c[h+172>>2]|0;if((f|0)<(i|0)){f=f+1|0;g=h}else{break}}if((i|0)<1){return}j=+(d|0);d=1;g=h;h=i;while(1){i=d+1|0;f=c[g+176>>2]|0;a=c[f+(d<<2)>>2]|0;if((d|0)<(h|0)){k=i;l=f;f=a;m=g;while(1){n=c[l+(k<<2)>>2]|0;o=(b[(c[f+8>>2]|0)+224>>1]|0)>(b[(c[n+8>>2]|0)+224>>1]|0);p=o?n:f;q=o?f:n;n=c[p+8>>2]|0;o=c[q+8>>2]|0;r=b[o+224>>1]|0;s=r<<16>>16;if((b[n+226>>1]|0)<r<<16>>16){t=m}else{r=(c[(c[(c[c[(c[n+184>>2]|0)+(s*44|0)+4>>2]>>2]|0)+8>>2]|0)+236>>2]|0)<(c[(c[(c[c[(c[o+184>>2]|0)+(s*44|0)+4>>2]>>2]|0)+8>>2]|0)+236>>2]|0);Jp(c[(c[(r?p:q)+8>>2]|0)+248>>2]|0,c[(c[(r?q:p)+8>>2]|0)+244>>2]|0,j,0)|0;t=c[e>>2]|0}p=c[t+176>>2]|0;q=c[p+(d<<2)>>2]|0;if((k|0)<(c[t+172>>2]|0)){k=k+1|0;l=p;f=q;m=t}else{u=q;break}}}else{u=a}Vp(u);m=c[e>>2]|0;f=c[m+172>>2]|0;if((d|0)<(f|0)){d=i;g=m;h=f}else{break}}return}function Wp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;if((a|0)==(b|0)){d=1;return d|0}e=c[(c[a+8>>2]|0)+180>>2]|0;a=c[e>>2]|0;if((a|0)==0){d=0;return d|0}else{f=0;g=a}while(1){a=f+1|0;if((Wp(c[((c[g>>2]&3|0)==2?g:g-32|0)+28>>2]|0,b)|0)!=0){d=1;h=5;break}i=c[e+(a<<2)>>2]|0;if((i|0)==0){d=0;h=5;break}else{f=a;g=i}}if((h|0)==5){return d|0}return 0}function Xp(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=a+8|0;b[(c[d>>2]|0)+224>>1]=32767;b[(c[d>>2]|0)+226>>1]=-1;e=ux(a)|0;f=c[d>>2]|0;if((e|0)==0){g=0;h=f;i=h+252|0;j=g;c[i>>2]=j;return}else{k=e;l=0;m=f}while(1){f=m+226|0;e=k+8|0;n=c[(c[e>>2]|0)+232>>2]|0;if((b[f>>1]|0)<(n|0)){b[f>>1]=n;o=c[d>>2]|0;p=c[(c[e>>2]|0)+232>>2]|0}else{o=m;p=n}n=o+224|0;if((b[n>>1]|0)>(p|0)){b[n>>1]=p}if((l|0)==0){q=k}else{q=(c[(c[e>>2]|0)+232>>2]|0)<(c[(c[l+8>>2]|0)+232>>2]|0)?k:l}e=vx(a,k)|0;n=c[d>>2]|0;if((e|0)==0){g=q;h=n;break}else{k=e;l=q;m=n}}i=h+252|0;j=g;c[i>>2]=j;return}function Yp(a){a=a|0;var b=0,d=0,e=0.0,f=0,g=0,h=0,i=0,j=0;b=ew(a|0,147792)|0;if((b|0)==0){d=2147483647}else{e=+rF(b);d=~~(e*+(Lw(a)|0))}b=a+8|0;f=c[b>>2]|0;g=f+204|0;if((c[g+4>>2]|0)>0){h=0;i=f;j=g}else{return}do{c[i+180>>2]=c[(c[j>>2]|0)+(h<<2)>>2];ok(a,(c[(c[b>>2]|0)+172>>2]|0)==0|0,d)|0;h=h+1|0;i=c[b>>2]|0;j=i+204|0;}while((h|0)<(c[j+4>>2]|0));return}function Zp(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;f=i;i=i+104|0;g=f|0;h=d|0;if((ew(h,162288)|0)==0){_p(d,e)}else{j=d+8|0;k=(c[j>>2]|0)+128|0;b[k>>1]=b[k>>1]|16;c[53670]=0;k=Hw(109200,173936,0)|0;Wx(k|0,103336,272,1)|0;Px(k,19768,21560);if((a[(c[j>>2]|0)+113|0]&1)!=0){l=ux(d)|0;if((l|0)!=0){m=l;do{l=mw(d,m)|0;if((l|0)!=0){n=l;do{l=(c[n+8>>2]|0)+170|0;b[l>>1]=b[l>>1]<<1;n=ow(d,n)|0;}while((n|0)!=0)}m=vx(d,m)|0;}while((m|0)!=0)}m=(c[j>>2]|0)+240|0;c[m>>2]=((c[m>>2]|0)+1|0)/2|0}m=ew(h,147792)|0;if((m|0)==0){p=2147483647}else{q=+rF(m);p=~~(q*+(Lw(d)|0))}aq(d,0);c[53670]=0;m=ux(d)|0;if((m|0)!=0){n=k+8|0;l=m;do{if((cq(l)|0)==(l|0)){m=Ax(k,$w(l|0)|0,1)|0;r=m+8|0;c[(c[r>>2]|0)+176>>2]=0;s=jk(20)|0;c[(c[r>>2]|0)+172>>2]=s;c[(c[r>>2]|0)+184>>2]=0;s=jk(20)|0;c[(c[r>>2]|0)+180>>2]=s;s=c[53670]|0;t=(c[r>>2]|0)+168|0;if((s|0)==0){c[t>>2]=0;c[(c[n>>2]|0)+180>>2]=m}else{c[t>>2]=s;c[(c[(c[53670]|0)+8>>2]|0)+164>>2]=m}c[53670]=m;c[(c[r>>2]|0)+164>>2]=0;c[(c[l+8>>2]|0)+148>>2]=m}l=vx(d,l)|0;}while((l|0)!=0)}l=ux(d)|0;if((l|0)!=0){n=l;do{l=n+8|0;if((c[(c[l>>2]|0)+148>>2]|0)==0){m=c[(c[(cq(n)|0)+8>>2]|0)+148>>2]|0;c[(c[l>>2]|0)+148>>2]=m}n=vx(d,n)|0;}while((n|0)!=0)}n=ux(d)|0;if((n|0)!=0){m=g|0;g=k+8|0;l=n;do{n=c[(c[l+8>>2]|0)+148>>2]|0;r=mw(d,l)|0;if((r|0)!=0){s=n;n=r;while(1){r=c[53812]|0;do{if((r|0)==0){u=30}else{t=fw(n|0,r)|0;if((t|0)==0){u=30;break}if((a[t]|0)==0){u=30;break}if((Km(t)|0)<<24>>24==0){v=s}else{u=30}}}while(0);a:do{if((u|0)==30){u=0;r=n;t=n-32|0;w=c[(c[(cq(c[((c[r>>2]&3|0)==2?n:t)+28>>2]|0)|0)+8>>2]|0)+148>>2]|0;if((s|0)==(w|0)){v=s;break}x=c[r>>2]&3;y=n+32|0;z=c[((x|0)==3?n:y)+28>>2]|0;A=c[(c[z+8>>2]|0)+212>>2]|0;B=c[(c[(c[((x|0)==2?n:t)+28>>2]|0)+8>>2]|0)+212>>2]|0;x=B;C=A;do{if((A|0)!=(B|0)){D=C;E=x;b:while(1){F=c[D+8>>2]|0;G=c[F+192>>2]|0;H=E;while(1){I=c[H+8>>2]|0;if((G|0)>=(c[I+192>>2]|0)){break}J=c[I+188>>2]|0;if((D|0)==(J|0)){K=D;break b}else{H=J}}G=c[F+188>>2]|0;if((G|0)==(H|0)){K=H;break}else{D=G;E=H}}if((K|0)==(C|0)|(K|0)==(x|0)){break}do{if((Vm(ew(A,168304)|0,0)|0)<<24>>24==0){if((Vm(ew(B,168304)|0,0)|0)<<24>>24!=0){break}gq(k,s,w,n);v=s;break a}}while(0);E=pw(k,s)|0;if((E|0)!=0){D=E;do{E=mw(k,c[((c[D>>2]&3|0)==3?D:D+32|0)+28>>2]|0)|0;if((E|0)!=0){if((c[((c[E>>2]&3|0)==2?E:E-32|0)+28>>2]|0)==(w|0)){v=s;break a}}D=qw(k,D)|0;}while((D|0)!=0)}D=c[43648]|0;c[43648]=D+1;nb(m|0,164168,(L=i,i=i+8|0,c[L>>2]=D,L)|0)|0;i=L;D=Ax(k,m,1)|0;E=D+8|0;c[(c[E>>2]|0)+176>>2]=0;G=jk(20)|0;c[(c[E>>2]|0)+172>>2]=G;c[(c[E>>2]|0)+184>>2]=0;G=jk(20)|0;c[(c[E>>2]|0)+180>>2]=G;G=c[53670]|0;J=(c[E>>2]|0)+168|0;if((G|0)==0){c[J>>2]=0;c[(c[g>>2]|0)+180>>2]=D}else{c[J>>2]=G;c[(c[(c[53670]|0)+8>>2]|0)+164>>2]=D}c[53670]=D;c[(c[E>>2]|0)+164>>2]=0;E=uw(k,D,s,0,1)|0;G=uw(k,D,w,0,1)|0;D=n+8|0;J=(c[E+8>>2]|0)+156|0;c[J>>2]=(c[J>>2]|0)+((c[(c[D>>2]|0)+156>>2]|0)*1e3|0);J=G+8|0;G=(c[J>>2]|0)+170|0;E=b[G>>1]|0;I=b[(c[D>>2]|0)+170>>1]|0;b[G>>1]=(E&65535)>>>0>(I&65535)>>>0?E:I;I=(c[J>>2]|0)+156|0;c[I>>2]=(c[I>>2]|0)+(c[(c[D>>2]|0)+156>>2]|0);v=s;break a}}while(0);B=cq(z)|0;A=c[r>>2]&3;if((B|0)==(c[(c[(c[(c[(c[((A|0)==3?n:y)+28>>2]|0)+8>>2]|0)+212>>2]|0)+8>>2]|0)+200>>2]|0)){u=39}else{B=cq(c[((A|0)==2?n:t)+28>>2]|0)|0;if((B|0)==(c[(c[(c[(c[(c[((c[r>>2]&3|0)==2?n:t)+28>>2]|0)+8>>2]|0)+212>>2]|0)+8>>2]|0)+196>>2]|0)){u=39}else{M=s;N=w}}if((u|0)==39){u=0;M=w;N=s}gq(k,M,N,n);v=M}}while(0);B=ow(d,n)|0;if((B|0)==0){break}else{s=v;n=B}}}l=vx(d,l)|0;}while((l|0)!=0)}bq(d,k,0,0);l=ux(k)|0;if((l|0)!=0){v=l;do{l=v+8|0;a[(c[l>>2]|0)+158|0]=0;a[(c[l>>2]|0)+157|0]=0;v=vx(k,v)|0;}while((v|0)!=0)}v=ux(k)|0;if((v|0)!=0){l=v;do{fq(k,l);l=vx(k,l)|0;}while((l|0)!=0)}l=ux(k)|0;if((l|0)!=0){v=l;do{c[(c[v+8>>2]|0)+128>>2]=0;v=vx(k,v)|0;}while((v|0)!=0)}v=ux(k)|0;do{if((v|0)==0){O=0}else{l=v;M=0;while(1){if((c[(c[l+8>>2]|0)+128>>2]|0)==0){N=M+1|0;eq(k,l,N);P=N}else{P=M}N=vx(k,l)|0;if((N|0)==0){break}else{l=N;M=P}}if((P|0)<=1){O=P;break}M=Ax(k,92264,1)|0;l=M+8|0;c[(c[l>>2]|0)+176>>2]=0;N=jk(20)|0;c[(c[l>>2]|0)+172>>2]=N;c[(c[l>>2]|0)+184>>2]=0;N=jk(20)|0;c[(c[l>>2]|0)+180>>2]=N;N=c[53670]|0;u=(c[l>>2]|0)+168|0;if((N|0)==0){c[u>>2]=0;c[(c[k+8>>2]|0)+180>>2]=M}else{c[u>>2]=N;c[(c[(c[53670]|0)+8>>2]|0)+164>>2]=M}c[53670]=M;c[(c[l>>2]|0)+164>>2]=0;l=ux(k)|0;if((l|0)==0){O=P;break}else{Q=l;R=1}while(1){if((c[(c[Q+8>>2]|0)+128>>2]|0)==(R|0)){uw(k,M,Q,0,1)|0;S=R+1|0}else{S=R}l=vx(k,Q)|0;if((l|0)==0){O=P;break}else{Q=l;R=S}}}}while(0);S=ux(k)|0;if((S|0)!=0){R=S;do{S=mw(k,R)|0;if((S|0)!=0){Q=R+8|0;P=S;do{S=(c[Q>>2]|0)+180|0;v=c[S>>2]|0;if((v|0)==0){T=kk((c[S+4>>2]<<2)+8|0)|0}else{T=mk(v,(c[S+4>>2]<<2)+8|0)|0}c[(c[Q>>2]|0)+180>>2]=T;S=(c[Q>>2]|0)+184|0;v=c[S>>2]|0;c[S>>2]=v+1;c[(c[(c[Q>>2]|0)+180>>2]|0)+(v<<2)>>2]=P;v=(c[Q>>2]|0)+180|0;c[(c[v>>2]|0)+(c[v+4>>2]<<2)>>2]=0;v=P;S=P-32|0;M=(c[(c[((c[v>>2]&3|0)==2?P:S)+28>>2]|0)+8>>2]|0)+172|0;l=c[M>>2]|0;if((l|0)==0){U=kk((c[M+4>>2]<<2)+8|0)|0}else{U=mk(l,(c[M+4>>2]<<2)+8|0)|0}c[(c[(c[((c[v>>2]&3|0)==2?P:S)+28>>2]|0)+8>>2]|0)+172>>2]=U;M=(c[(c[((c[v>>2]&3|0)==2?P:S)+28>>2]|0)+8>>2]|0)+176|0;l=c[M>>2]|0;c[M>>2]=l+1;c[(c[(c[(c[((c[v>>2]&3|0)==2?P:S)+28>>2]|0)+8>>2]|0)+172>>2]|0)+(l<<2)>>2]=P;l=(c[(c[((c[v>>2]&3|0)==2?P:S)+28>>2]|0)+8>>2]|0)+172|0;c[(c[l>>2]|0)+(c[l+4>>2]<<2)>>2]=0;P=ow(k,P)|0;}while((P|0)!=0)}R=vx(k,R)|0;}while((R|0)!=0)}if((e|0)!=0){Rn(k);On(k)}e=ew(h,97800)|0;if((e|0)==0){V=-1}else{V=Rb(e|0)|0}nk(k,1,p,V)|0;b[(c[j>>2]|0)+224>>1]=32767;b[(c[j>>2]|0)+226>>1]=-1;if((O|0)>1){V=jk((O<<2)+4|0)|0;p=1;while(1){c[V+(p<<2)>>2]=32767;if((p|0)<(O|0)){p=p+1|0}else{W=V;break}}}else{W=0}V=ux(d)|0;if((V|0)!=0){if((W|0)==0){p=V;do{O=c[(c[(c[(c[(cq(p)|0)+8>>2]|0)+148>>2]|0)+8>>2]|0)+232>>2]|0;e=p+8|0;c[(c[e>>2]|0)+232>>2]=O;O=c[j>>2]|0;h=O+226|0;R=c[(c[e>>2]|0)+232>>2]|0;if((b[h>>1]|0)<(R|0)){b[h>>1]=R;X=c[j>>2]|0;Y=c[(c[e>>2]|0)+232>>2]|0}else{X=O;Y=R}R=X+224|0;if((b[R>>1]|0)>(Y|0)){b[R>>1]=Y}p=vx(d,p)|0;}while((p|0)!=0)}else{p=V;do{V=(c[(c[(cq(p)|0)+8>>2]|0)+148>>2]|0)+8|0;Y=p+8|0;c[(c[Y>>2]|0)+232>>2]=c[(c[V>>2]|0)+232>>2];X=c[j>>2]|0;R=X+226|0;O=c[Y>>2]|0;e=c[O+232>>2]|0;if((b[R>>1]|0)<(e|0)){b[R>>1]=e;R=c[Y>>2]|0;Z=c[j>>2]|0;_=c[R+232>>2]|0;$=R}else{Z=X;_=e;$=O}O=Z+224|0;if((b[O>>1]|0)>(_|0)){b[O>>1]=_;aa=c[Y>>2]|0}else{aa=$}c[aa+128>>2]=c[(c[V>>2]|0)+128>>2];V=c[Y>>2]|0;Y=W+(c[V+128>>2]<<2)|0;O=c[Y>>2]|0;e=c[V+232>>2]|0;c[Y>>2]=(O|0)<(e|0)?O:e;p=vx(d,p)|0;}while((p|0)!=0)}}p=(W|0)!=0;do{if(p){aa=ux(d)|0;if((aa|0)==0){ba=1;break}else{ca=aa}while(1){aa=c[ca+8>>2]|0;$=aa+232|0;c[$>>2]=(c[$>>2]|0)-(c[W+(c[aa+128>>2]<<2)>>2]|0);aa=vx(d,ca)|0;if((aa|0)==0){ba=1;break}else{ca=aa}}}else{aa=b[(c[j>>2]|0)+224>>1]|0;$=aa<<16>>16;if(aa<<16>>16<=0){ba=0;break}_=ux(d)|0;if((_|0)!=0){Z=_;do{_=(c[Z+8>>2]|0)+232|0;c[_>>2]=(c[_>>2]|0)-$;Z=vx(d,Z)|0;}while((Z|0)!=0)}Z=(c[j>>2]|0)+224|0;b[Z>>1]=(b[Z>>1]|0)-aa;Z=(c[j>>2]|0)+226|0;b[Z>>1]=(b[Z>>1]|0)-aa;ba=0}}while(0);dq(d,ba);ba=ux(k)|0;if((ba|0)!=0){j=ba;do{ba=j+8|0;ca=c[ba>>2]|0;Z=c[ca+172>>2]|0;if((Z|0)==0){da=ca}else{eF(Z);da=c[ba>>2]|0}ba=c[da+180>>2]|0;if((ba|0)!=0){eF(ba)}j=vx(k,j)|0;}while((j|0)!=0)}eF(c[(c[(ux(d)|0)+8>>2]|0)+112>>2]|0);j=ux(d)|0;if((j|0)!=0){da=j;do{c[(c[da+8>>2]|0)+112>>2]=0;da=vx(d,da)|0;}while((da|0)!=0)}if(p){eF(W)}Kw(k)|0}if((a[213992]|0)==0){i=f;return}k=c[d+8>>2]|0;d=b[k+224>>1]|0;gc(c[o>>2]|0,130928,(L=i,i=i+16|0,c[L>>2]=b[k+226>>1]|0,c[L+8>>2]=d,L)|0)|0;i=L;i=f;return}function _p(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;f=i;i=i+8|0;g=f|0;h=g;j=d+8|0;if((a[(c[j>>2]|0)+113|0]&1)!=0){k=ux(d)|0;if((k|0)!=0){l=k;do{k=mw(d,l)|0;if((k|0)!=0){m=k;do{k=(c[m+8>>2]|0)+170|0;b[k>>1]=b[k>>1]<<1;m=ow(d,m)|0;}while((m|0)!=0)}l=vx(d,l)|0;}while((l|0)!=0)}l=(c[j>>2]|0)+240|0;c[l>>2]=((c[l>>2]|0)+1|0)/2|0}do{if((e|0)==0){lq(d,d);Wn(d);mq(h,d);l=c[g>>2]|0;m=c[g+4>>2]|0;qo(d,0);n=0;o=l&65535;p=m&65535}else{Rn(d);On(d);lq(d,d);Wn(d);mq(h,d);m=c[g>>2]|0;l=c[g+4>>2]|0;qo(d,0);k=c[j>>2]|0;if((c[k+208>>2]|0)>1){q=l&65535;r=m&65535}else{s=l&65535;l=m&65535;if((c[k+172>>2]|0)>0){q=s;r=l}else{n=e;o=l;p=s;break}}c[e+32>>2]=1;n=0;o=r;p=q}}while(0);Ln(d);q=c[j>>2]|0;if((c[q+216>>2]|0)==0){if((c[q+212>>2]|0)!=0){t=15}}else{t=15}do{if((t|0)==15){q=ux(d)|0;if((q|0)==0){break}else{u=q;v=0}while(1){do{if((u|0)==(Lm(u)|0)){q=u+8|0;r=c[q>>2]|0;do{if((c[r+184>>2]|0)==0){e=c[(c[j>>2]|0)+216>>2]|0;if((e|0)==0|(u|0)==(e|0)){w=v;x=r;break}g=Zo(u,e,0)|0;e=g+8|0;b[(c[e>>2]|0)+170>>1]=p;c[(c[e>>2]|0)+156>>2]=0;w=g;x=c[q>>2]|0}else{w=v;x=r}}while(0);if((c[x+176>>2]|0)!=0){y=w;break}r=c[(c[j>>2]|0)+212>>2]|0;q=r;if((r|0)==0|(u|0)==(q|0)){y=w;break}r=Zo(q,u,0)|0;q=r+8|0;b[(c[q>>2]|0)+170>>1]=o;c[(c[q>>2]|0)+156>>2]=0;y=r}else{y=v}}while(0);r=vx(d,u)|0;if((r|0)==0){break}else{u=r;v=y}}if((y|0)==0){break}qo(d,0)}}while(0);y=(n|0)==0;do{if(y){v=ew(d|0,147792)|0;if((v|0)==0){z=2147483647}else{A=+rF(v);z=~~(A*+(Lw(d)|0))}v=c[j>>2]|0;u=v+204|0;if((c[u+4>>2]|0)>0){B=0;C=v;D=u}else{break}do{c[C+180>>2]=c[(c[D>>2]|0)+(B<<2)>>2];ok(d,(c[(c[j>>2]|0)+172>>2]|0)==0|0,z)|0;B=B+1|0;C=c[j>>2]|0;D=C+204|0;}while((B|0)<(c[D+4>>2]|0))}else{Pn(d,n)}}while(0);n=ux(d)|0;D=c[j>>2]|0;a:do{if((n|0)==0){b[D+226>>1]=0;b[(c[j>>2]|0)+224>>1]=0}else{b[D+224>>1]=32767;b[(c[j>>2]|0)+226>>1]=-1;B=n;do{C=Lm(B)|0;z=B+8|0;do{if((C|0)==(B|0)){E=z}else{u=c[z>>2]|0;v=c[u+232>>2]|0;if(y){F=v}else{if((v|0)==0){F=0}else{E=z;break}}c[u+232>>2]=F+(c[(c[C+8>>2]|0)+232>>2]|0);E=B+8|0}}while(0);C=c[j>>2]|0;z=C+226|0;u=c[E>>2]|0;v=c[u+232>>2]|0;if((b[z>>1]|0)<(v|0)){b[z>>1]=v;z=c[E>>2]|0;G=c[j>>2]|0;H=z;I=c[z+232>>2]|0}else{G=C;H=u;I=v}v=G+224|0;if((b[v>>1]|0)>(I|0)){b[v>>1]=I;J=c[E>>2]|0}else{J=H}v=a[J+159|0]|0;if(!((v<<24>>24|0)==0|(v<<24>>24|0)==6)){Nm(B)}B=vx(d,B)|0;}while((B|0)!=0);B=d|0;if((Ix(B)|0)!=(d|0)){break}if((c[53850]|0)==100){v=c[j>>2]|0;if((c[v+172>>2]|0)<1){break}else{K=1;L=v}while(1){nq(c[(c[L+176>>2]|0)+(K<<2)>>2]|0);v=c[j>>2]|0;if((K|0)<(c[v+172>>2]|0)){K=K+1|0;L=v}else{break a}}}v=sy(Ix(B)|0)|0;if((v|0)==0){break}else{M=v}do{if((a[(c[M+8>>2]|0)+262|0]|0)==7){oq(d,M)}M=ty(M)|0;}while((M|0)!=0)}}while(0);M=c[j>>2]|0;L=M+204|0;if((c[L+4>>2]|0)>0){K=0;J=M;M=L;while(1){c[J+180>>2]=c[(c[M>>2]|0)+(K<<2)>>2];L=c[j>>2]|0;H=c[L+180>>2]|0;if((H|0)==0){N=L}else{L=H;do{H=L+8|0;E=(c[H>>2]|0)+172|0;I=E+4|0;G=c[I>>2]|0;if((G|0)>-1){F=G;while(1){c[(c[E>>2]|0)+(F<<2)>>2]=0;if((F|0)>0){F=F-1|0}else{break}}}c[I>>2]=0;F=(c[H>>2]|0)+180|0;E=F+4|0;G=c[E>>2]|0;if((G|0)>-1){y=G;while(1){c[(c[F>>2]|0)+(y<<2)>>2]=0;if((y|0)>0){y=y-1|0}else{break}}}c[E>>2]=0;a[(c[H>>2]|0)+157|0]=0;L=c[(c[H>>2]|0)+164>>2]|0;}while((L|0)!=0);N=c[j>>2]|0}L=K+1|0;y=N+204|0;if((L|0)<(c[y+4>>2]|0)){K=L;J=N;M=y}else{break}}}M=ux(d)|0;if((M|0)==0){O=c[j>>2]|0;P=O+204|0;Q=c[P>>2]|0;R=Q;eF(R);S=c[j>>2]|0;T=S+204|0;c[T>>2]=0;U=c[j>>2]|0;V=U+204|0;W=V+4|0;c[W>>2]=0;i=f;return}else{X=M}do{M=mw(d,X)|0;if((M|0)!=0){N=M;do{M=N+8|0;J=c[M>>2]|0;K=c[J+172>>2]|0;do{if((K|0)==0){Y=J}else{y=K+8|0;if((N|0)!=(c[(c[y>>2]|0)+116>>2]|0)){Y=J;break}L=ux(d)|0;if((L|0)!=0){F=L;do{L=mw(d,F)|0;if((L|0)!=0){I=L;do{do{if((N|0)!=(I|0)){L=(c[I+8>>2]|0)+172|0;G=c[L>>2]|0;if(!((G|0)!=0&(K|0)==(G|0))){break}c[L>>2]=0}}while(0);I=ow(d,I)|0;}while((I|0)!=0)}F=vx(d,F)|0;}while((F|0)!=0)}eF(c[y>>2]|0);eF(K);Y=c[M>>2]|0}}while(0);c[Y+172>>2]=0;N=ow(d,N)|0;}while((N|0)!=0)}X=vx(d,X)|0;}while((X|0)!=0);O=c[j>>2]|0;P=O+204|0;Q=c[P>>2]|0;R=Q;eF(R);S=c[j>>2]|0;T=S+204|0;c[T>>2]=0;U=c[j>>2]|0;V=U+204|0;W=V+4|0;c[W>>2]=0;i=f;return}function $p(a){a=a|0;return(Za($w(a|0)|0,116432,7)|0)==0|0}function aq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if((ux(b)|0)==0){return}do{if((an(b)|0)==0){e=d}else{if((d|0)==0){c[(c[b+8>>2]|0)+192>>2]=0;e=b;break}f=d+8|0;g=b+8|0;c[(c[g>>2]|0)+192>>2]=(c[(c[f>>2]|0)+192>>2]|0)+1;c[(c[g>>2]|0)+188>>2]=d;g=(c[f>>2]|0)+172|0;h=c[g>>2]|0;i=h+1|0;c[g>>2]=i;g=c[f>>2]|0;j=c[g+176>>2]|0;if((j|0)==0){k=jk((h<<2)+8|0)|0}else{k=lk(j,h+2|0,4,c[g+172>>2]|0)|0}c[(c[f>>2]|0)+176>>2]=k;c[(c[(c[f>>2]|0)+176>>2]|0)+(i<<2)>>2]=b;Rj(b);hq(d,b);e=b}}while(0);d=sy(b)|0;if((d|0)!=0){k=d;do{aq(k,e);k=ty(k)|0;}while((k|0)!=0)}do{if((an(b)|0)!=0){k=ux(b)|0;if((k|0)==0){break}d=b;i=k;do{k=(c[i+8>>2]|0)+212|0;if((c[k>>2]|0)==0){c[k>>2]=d}i=vx(b,i)|0;}while((i|0)!=0)}}while(0);i=ew(b|0,151672)|0;a:do{if((i|0)!=0){if((a[i]|0)==0){break}do{if((Ya(i|0,148832)|0)!=0){if((Ya(i|0,145656)|0)==0){a[(c[e+8>>2]|0)+229|0]=1;break}do{if((Ya(i|0,142656)|0)!=0){if((Ya(i|0,139584)|0)==0){a[(c[e+8>>2]|0)+230|0]=1;break}if((Ya(i|0,136936)|0)!=0){break a}d=ux(b)|0;if((d|0)==0){break a}k=cq(d)|0;f=vx(b,d)|0;if((f|0)==0){break a}else{l=f}while(1){f=cq(k)|0;c[(c[(cq(l)|0)+8>>2]|0)+152>>2]=f;l=vx(b,l)|0;if((l|0)==0){break a}}}}while(0);k=ux(b)|0;do{if((k|0)==0){m=0}else{f=cq(k)|0;d=vx(b,k)|0;if((d|0)==0){m=f;break}else{n=d}while(1){d=cq(f)|0;c[(c[(cq(n)|0)+8>>2]|0)+152>>2]=d;d=vx(b,n)|0;if((d|0)==0){m=f;break}else{n=d}}}}while(0);k=e+8|0;f=c[k>>2]|0;d=c[f+200>>2]|0;if((d|0)==0){o=m;p=f}else{f=cq(m)|0;c[(c[(cq(d)|0)+8>>2]|0)+152>>2]=f;o=f;p=c[k>>2]|0}c[p+200>>2]=o;break a}}while(0);k=ux(b)|0;do{if((k|0)==0){q=0}else{f=cq(k)|0;d=vx(b,k)|0;if((d|0)==0){q=f;break}else{r=d}while(1){d=cq(f)|0;c[(c[(cq(r)|0)+8>>2]|0)+152>>2]=d;d=vx(b,r)|0;if((d|0)==0){q=f;break}else{r=d}}}}while(0);k=e+8|0;f=c[k>>2]|0;d=c[f+196>>2]|0;if((d|0)==0){s=q;t=f}else{f=cq(q)|0;c[(c[(cq(d)|0)+8>>2]|0)+152>>2]=f;s=f;t=c[k>>2]|0}c[t+196>>2]=s}}while(0);if((an(b)|0)==0){return}s=b+8|0;t=c[s>>2]|0;q=c[t+196>>2]|0;if((q|0)==0){return}if((q|0)!=(c[t+200>>2]|0)){return}t=ux(b)|0;do{if((t|0)==0){u=0}else{q=cq(t)|0;e=vx(b,t)|0;if((e|0)==0){u=q;break}else{v=e}while(1){e=cq(q)|0;c[(c[(cq(v)|0)+8>>2]|0)+152>>2]=e;e=vx(b,v)|0;if((e|0)==0){u=q;break}else{v=e}}}}while(0);c[(c[s>>2]|0)+196>>2]=u;c[(c[s>>2]|0)+200>>2]=u;return}function bq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;do{if((an(a)|0)==0){f=d;g=e}else{if((Vm(ew(a|0,168304)|0,0)|0)<<24>>24==0){f=d;g=e;break}h=ux(a)|0;if((h|0)==0){i=e;j=d}else{k=b+8|0;l=e;m=h;h=d;while(1){if((pw(a,m)|0)==0){n=c[(c[(cq(m)|0)+8>>2]|0)+148>>2]|0;if((h|0)==0){o=Ax(b,87016,1)|0;p=o+8|0;c[(c[p>>2]|0)+176>>2]=0;q=jk(20)|0;c[(c[p>>2]|0)+172>>2]=q;c[(c[p>>2]|0)+184>>2]=0;q=jk(20)|0;c[(c[p>>2]|0)+180>>2]=q;q=c[53670]|0;r=(c[p>>2]|0)+168|0;if((q|0)==0){c[r>>2]=0;c[(c[k>>2]|0)+180>>2]=o}else{c[r>>2]=q;c[(c[(c[53670]|0)+8>>2]|0)+164>>2]=o}c[53670]=o;c[(c[p>>2]|0)+164>>2]=0;s=o}else{s=h}uw(b,s,n,0,1)|0;t=s}else{t=h}if((mw(a,m)|0)==0){n=c[(c[(cq(m)|0)+8>>2]|0)+148>>2]|0;if((l|0)==0){o=Ax(b,82176,1)|0;p=o+8|0;c[(c[p>>2]|0)+176>>2]=0;q=jk(20)|0;c[(c[p>>2]|0)+172>>2]=q;c[(c[p>>2]|0)+184>>2]=0;q=jk(20)|0;c[(c[p>>2]|0)+180>>2]=q;q=c[53670]|0;r=(c[p>>2]|0)+168|0;if((q|0)==0){c[r>>2]=0;c[(c[k>>2]|0)+180>>2]=o}else{c[r>>2]=q;c[(c[(c[53670]|0)+8>>2]|0)+164>>2]=o}c[53670]=o;c[(c[p>>2]|0)+164>>2]=0;u=o}else{u=l}uw(b,n,u,0,1)|0;v=u}else{v=l}n=vx(a,m)|0;if((n|0)==0){i=v;j=t;break}else{l=v;m=n;h=t}}}if((j|0)==0|(i|0)==0){f=j;g=i;break}h=(c[(uw(b,j,i,0,1)|0)+8>>2]|0)+156|0;c[h>>2]=(c[h>>2]|0)+1e3;f=j;g=i}}while(0);i=sy(a)|0;if((i|0)==0){return}else{w=i}do{bq(w,b,f,g);w=ty(w)|0;}while((w|0)!=0);return}function cq(a){a=a|0;var b=0,d=0,e=0;b=a+8|0;d=(c[b>>2]|0)+152|0;e=c[d>>2]|0;if((e|0)==0){c[d>>2]=a;return a|0}if((e|0)==(a|0)){return a|0}else{a=cq(e)|0;c[(c[b>>2]|0)+152>>2]=a;return a|0}return 0}function dq(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=a+8|0;f=c[e>>2]|0;if((c[f+172>>2]|0)<1){g=f}else{h=1;i=f;while(1){dq(c[(c[i+176>>2]|0)+(h<<2)>>2]|0,0);f=c[e>>2]|0;if((h|0)<(c[f+172>>2]|0)){h=h+1|0;i=f}else{g=f;break}}}if((c[g+188>>2]|0)==0&(d|0)==0){return}b[g+224>>1]=32767;b[(c[e>>2]|0)+226>>1]=-1;g=ux(a)|0;if((g|0)==0){j=0}else{d=g;g=0;while(1){i=c[(c[d+8>>2]|0)+232>>2]|0;h=c[e>>2]|0;f=h+226|0;if((b[f>>1]|0)<(i|0)){b[f>>1]=i;k=c[e>>2]|0}else{k=h}h=k+224|0;if((b[h>>1]|0)>(i|0)){b[h>>1]=i;l=d}else{l=g}i=vx(a,d)|0;if((i|0)==0){j=l;break}else{d=i;g=l}}}c[(c[e>>2]|0)+252>>2]=j;return}function eq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=(c[b+8>>2]|0)+128|0;if((c[e>>2]|0)!=0){return}c[e>>2]=d;e=mw(a,b)|0;if((e|0)!=0){f=e;do{eq(a,c[((c[f>>2]&3|0)==2?f:f-32|0)+28>>2]|0,d);f=ow(a,f)|0;}while((f|0)!=0)}f=pw(a,b)|0;if((f|0)==0){return}else{g=f}do{eq(a,c[((c[g>>2]&3|0)==3?g:g+32|0)+28>>2]|0,d);g=qw(a,g)|0;}while((g|0)!=0);return}
-
-
-
-function iF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;d=a;e=d+b|0;f=e;g=c[a+4>>2]|0;a:do{if((g&1|0)==0){h=c[a>>2]|0;if((g&3|0)==0){return}i=d+(-h|0)|0;j=i;k=h+b|0;l=c[53378]|0;if(i>>>0<l>>>0){fc()}if((j|0)==(c[53379]|0)){m=d+(b+4)|0;if((c[m>>2]&3|0)!=3){n=j;o=k;break}c[53376]=k;c[m>>2]=c[m>>2]&-2;c[d+(4-h)>>2]=k|1;c[e>>2]=k;return}m=h>>>3;if(h>>>0<256>>>0){p=c[d+(8-h)>>2]|0;q=c[d+(12-h)>>2]|0;r=213536+(m<<1<<2)|0;do{if((p|0)!=(r|0)){if(p>>>0<l>>>0){fc()}if((c[p+12>>2]|0)==(j|0)){break}fc()}}while(0);if((q|0)==(p|0)){c[53374]=c[53374]&~(1<<m);n=j;o=k;break}do{if((q|0)==(r|0)){s=q+8|0}else{if(q>>>0<l>>>0){fc()}t=q+8|0;if((c[t>>2]|0)==(j|0)){s=t;break}fc()}}while(0);c[p+12>>2]=q;c[s>>2]=p;n=j;o=k;break}r=i;m=c[d+(24-h)>>2]|0;t=c[d+(12-h)>>2]|0;do{if((t|0)==(r|0)){u=16-h|0;v=d+(u+4)|0;w=c[v>>2]|0;if((w|0)==0){x=d+u|0;u=c[x>>2]|0;if((u|0)==0){y=0;break}else{z=u;A=x}}else{z=w;A=v}while(1){v=z+20|0;w=c[v>>2]|0;if((w|0)!=0){z=w;A=v;continue}v=z+16|0;w=c[v>>2]|0;if((w|0)==0){break}else{z=w;A=v}}if(A>>>0<l>>>0){fc()}else{c[A>>2]=0;y=z;break}}else{v=c[d+(8-h)>>2]|0;if(v>>>0<l>>>0){fc()}w=v+12|0;if((c[w>>2]|0)!=(r|0)){fc()}x=t+8|0;if((c[x>>2]|0)==(r|0)){c[w>>2]=t;c[x>>2]=v;y=t;break}else{fc()}}}while(0);if((m|0)==0){n=j;o=k;break}t=d+(28-h)|0;l=213800+(c[t>>2]<<2)|0;do{if((r|0)==(c[l>>2]|0)){c[l>>2]=y;if((y|0)!=0){break}c[53375]=c[53375]&~(1<<c[t>>2]);n=j;o=k;break a}else{if(m>>>0<(c[53378]|0)>>>0){fc()}i=m+16|0;if((c[i>>2]|0)==(r|0)){c[i>>2]=y}else{c[m+20>>2]=y}if((y|0)==0){n=j;o=k;break a}}}while(0);if(y>>>0<(c[53378]|0)>>>0){fc()}c[y+24>>2]=m;r=16-h|0;t=c[d+r>>2]|0;do{if((t|0)!=0){if(t>>>0<(c[53378]|0)>>>0){fc()}else{c[y+16>>2]=t;c[t+24>>2]=y;break}}}while(0);t=c[d+(r+4)>>2]|0;if((t|0)==0){n=j;o=k;break}if(t>>>0<(c[53378]|0)>>>0){fc()}else{c[y+20>>2]=t;c[t+24>>2]=y;n=j;o=k;break}}else{n=a;o=b}}while(0);a=c[53378]|0;if(e>>>0<a>>>0){fc()}y=d+(b+4)|0;z=c[y>>2]|0;do{if((z&2|0)==0){if((f|0)==(c[53380]|0)){A=(c[53377]|0)+o|0;c[53377]=A;c[53380]=n;c[n+4>>2]=A|1;if((n|0)!=(c[53379]|0)){return}c[53379]=0;c[53376]=0;return}if((f|0)==(c[53379]|0)){A=(c[53376]|0)+o|0;c[53376]=A;c[53379]=n;c[n+4>>2]=A|1;c[n+A>>2]=A;return}A=(z&-8)+o|0;s=z>>>3;b:do{if(z>>>0<256>>>0){g=c[d+(b+8)>>2]|0;t=c[d+(b+12)>>2]|0;h=213536+(s<<1<<2)|0;do{if((g|0)!=(h|0)){if(g>>>0<a>>>0){fc()}if((c[g+12>>2]|0)==(f|0)){break}fc()}}while(0);if((t|0)==(g|0)){c[53374]=c[53374]&~(1<<s);break}do{if((t|0)==(h|0)){B=t+8|0}else{if(t>>>0<a>>>0){fc()}m=t+8|0;if((c[m>>2]|0)==(f|0)){B=m;break}fc()}}while(0);c[g+12>>2]=t;c[B>>2]=g}else{h=e;m=c[d+(b+24)>>2]|0;l=c[d+(b+12)>>2]|0;do{if((l|0)==(h|0)){i=d+(b+20)|0;p=c[i>>2]|0;if((p|0)==0){q=d+(b+16)|0;v=c[q>>2]|0;if((v|0)==0){C=0;break}else{D=v;E=q}}else{D=p;E=i}while(1){i=D+20|0;p=c[i>>2]|0;if((p|0)!=0){D=p;E=i;continue}i=D+16|0;p=c[i>>2]|0;if((p|0)==0){break}else{D=p;E=i}}if(E>>>0<a>>>0){fc()}else{c[E>>2]=0;C=D;break}}else{i=c[d+(b+8)>>2]|0;if(i>>>0<a>>>0){fc()}p=i+12|0;if((c[p>>2]|0)!=(h|0)){fc()}q=l+8|0;if((c[q>>2]|0)==(h|0)){c[p>>2]=l;c[q>>2]=i;C=l;break}else{fc()}}}while(0);if((m|0)==0){break}l=d+(b+28)|0;g=213800+(c[l>>2]<<2)|0;do{if((h|0)==(c[g>>2]|0)){c[g>>2]=C;if((C|0)!=0){break}c[53375]=c[53375]&~(1<<c[l>>2]);break b}else{if(m>>>0<(c[53378]|0)>>>0){fc()}t=m+16|0;if((c[t>>2]|0)==(h|0)){c[t>>2]=C}else{c[m+20>>2]=C}if((C|0)==0){break b}}}while(0);if(C>>>0<(c[53378]|0)>>>0){fc()}c[C+24>>2]=m;h=c[d+(b+16)>>2]|0;do{if((h|0)!=0){if(h>>>0<(c[53378]|0)>>>0){fc()}else{c[C+16>>2]=h;c[h+24>>2]=C;break}}}while(0);h=c[d+(b+20)>>2]|0;if((h|0)==0){break}if(h>>>0<(c[53378]|0)>>>0){fc()}else{c[C+20>>2]=h;c[h+24>>2]=C;break}}}while(0);c[n+4>>2]=A|1;c[n+A>>2]=A;if((n|0)!=(c[53379]|0)){F=A;break}c[53376]=A;return}else{c[y>>2]=z&-2;c[n+4>>2]=o|1;c[n+o>>2]=o;F=o}}while(0);o=F>>>3;if(F>>>0<256>>>0){z=o<<1;y=213536+(z<<2)|0;C=c[53374]|0;b=1<<o;do{if((C&b|0)==0){c[53374]=C|b;G=y;H=213536+(z+2<<2)|0}else{o=213536+(z+2<<2)|0;d=c[o>>2]|0;if(d>>>0>=(c[53378]|0)>>>0){G=d;H=o;break}fc()}}while(0);c[H>>2]=n;c[G+12>>2]=n;c[n+8>>2]=G;c[n+12>>2]=y;return}y=n;G=F>>>8;do{if((G|0)==0){I=0}else{if(F>>>0>16777215>>>0){I=31;break}H=(G+1048320|0)>>>16&8;z=G<<H;b=(z+520192|0)>>>16&4;C=z<<b;z=(C+245760|0)>>>16&2;o=14-(b|H|z)+(C<<z>>>15)|0;I=F>>>((o+7|0)>>>0)&1|o<<1}}while(0);G=213800+(I<<2)|0;c[n+28>>2]=I;c[n+20>>2]=0;c[n+16>>2]=0;o=c[53375]|0;z=1<<I;if((o&z|0)==0){c[53375]=o|z;c[G>>2]=y;c[n+24>>2]=G;c[n+12>>2]=n;c[n+8>>2]=n;return}z=c[G>>2]|0;if((I|0)==31){J=0}else{J=25-(I>>>1)|0}c:do{if((c[z+4>>2]&-8|0)==(F|0)){K=z}else{I=z;G=F<<J;while(1){L=I+16+(G>>>31<<2)|0;o=c[L>>2]|0;if((o|0)==0){break}if((c[o+4>>2]&-8|0)==(F|0)){K=o;break c}else{I=o;G=G<<1}}if(L>>>0<(c[53378]|0)>>>0){fc()}c[L>>2]=y;c[n+24>>2]=I;c[n+12>>2]=n;c[n+8>>2]=n;return}}while(0);L=K+8|0;F=c[L>>2]|0;J=c[53378]|0;if(K>>>0<J>>>0){fc()}if(F>>>0<J>>>0){fc()}c[F+12>>2]=y;c[L>>2]=y;c[n+8>>2]=F;c[n+12>>2]=K;c[n+24>>2]=0;return}function jF(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0.0,ja=0.0,ka=0,la=0.0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0.0,va=0,wa=0.0,xa=0,ya=0.0,za=0,Aa=0,Ba=0,Ca=0.0,Da=0,Ea=0.0,Fa=0.0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0.0,xc=0,yc=0,zc=0.0,Ac=0.0,Bc=0.0,Cc=0.0,Dc=0.0,Ec=0.0,Fc=0.0,Gc=0,Hc=0,Ic=0.0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0;g=i;i=i+512|0;h=g|0;if((e|0)==1){j=-1074;k=53}else if((e|0)==0){j=-149;k=24}else if((e|0)==2){j=-1074;k=53}else{l=0.0;i=g;return+l}e=b+4|0;m=b+100|0;do{n=c[e>>2]|0;if(n>>>0<(c[m>>2]|0)>>>0){c[e>>2]=n+1;o=d[n]|0}else{o=mF(b)|0}}while((Qa(o|0)|0)!=0);do{if((o|0)==45|(o|0)==43){n=1-(((o|0)==45)<<1)|0;p=c[e>>2]|0;if(p>>>0<(c[m>>2]|0)>>>0){c[e>>2]=p+1;q=d[p]|0;r=n;break}else{q=mF(b)|0;r=n;break}}else{q=o;r=1}}while(0);o=0;n=q;while(1){if((n|32|0)!=(a[95936+o|0]|0)){u=o;v=n;break}do{if(o>>>0<7>>>0){q=c[e>>2]|0;if(q>>>0<(c[m>>2]|0)>>>0){c[e>>2]=q+1;w=d[q]|0;break}else{w=mF(b)|0;break}}else{w=n}}while(0);q=o+1|0;if(q>>>0<8>>>0){o=q;n=w}else{u=q;v=w;break}}do{if((u|0)==3){x=23}else if((u|0)!=8){w=(f|0)==0;if(!(u>>>0<4>>>0|w)){if((u|0)==8){break}else{x=23;break}}a:do{if((u|0)==0){n=0;o=v;while(1){if((o|32|0)!=(a[141816+n|0]|0)){y=o;z=n;break a}do{if(n>>>0<2>>>0){q=c[e>>2]|0;if(q>>>0<(c[m>>2]|0)>>>0){c[e>>2]=q+1;A=d[q]|0;break}else{A=mF(b)|0;break}}else{A=o}}while(0);q=n+1|0;if(q>>>0<3>>>0){n=q;o=A}else{y=A;z=q;break}}}else{y=v;z=u}}while(0);if((z|0)==0){do{if((y|0)==48){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;B=d[o]|0}else{B=mF(b)|0}if((B|32|0)!=120){if((c[m>>2]|0)==0){C=48;break}c[e>>2]=(c[e>>2]|0)-1;C=48;break}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;D=d[o]|0;E=0}else{D=mF(b)|0;E=0}while(1){if((D|0)==46){x=70;break}else if((D|0)!=48){F=D;G=0;I=0;J=0;K=0;L=E;M=0;N=0;O=1.0;P=0.0;Q=0;break}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;D=d[o]|0;E=1;continue}else{D=mF(b)|0;E=1;continue}}b:do{if((x|0)==70){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;R=d[o]|0}else{R=mF(b)|0}if((R|0)==48){T=-1;U=-1}else{F=R;G=0;I=0;J=0;K=0;L=E;M=1;N=0;O=1.0;P=0.0;Q=0;break}while(1){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;V=d[o]|0}else{V=mF(b)|0}if((V|0)!=48){F=V;G=0;I=0;J=T;K=U;L=1;M=1;N=0;O=1.0;P=0.0;Q=0;break b}o=EF(U,T,-1,-1)|0;T=H;U=o}}}while(0);c:while(1){o=F-48|0;do{if(o>>>0<10>>>0){W=o;x=84}else{n=F|32;q=(F|0)==46;if(!((n-97|0)>>>0<6>>>0|q)){X=F;break c}if(q){if((M|0)==0){Y=G;Z=I;_=G;$=I;aa=L;ba=1;ca=N;ea=O;fa=P;ga=Q;break}else{X=46;break c}}else{W=(F|0)>57?n-87|0:o;x=84;break}}}while(0);if((x|0)==84){x=0;o=0;do{if((G|0)<(o|0)|(G|0)==(o|0)&I>>>0<8>>>0){ha=N;ia=O;ja=P;ka=W+(Q<<4)|0}else{n=0;if((G|0)<(n|0)|(G|0)==(n|0)&I>>>0<14>>>0){la=O*.0625;ha=N;ia=la;ja=P+la*+(W|0);ka=Q;break}if(!((W|0)!=0&(N|0)==0)){ha=N;ia=O;ja=P;ka=Q;break}ha=1;ia=O;ja=P+O*.5;ka=Q}}while(0);o=EF(I,G,1,0)|0;Y=H;Z=o;_=J;$=K;aa=1;ba=M;ca=ha;ea=ia;fa=ja;ga=ka}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;F=d[o]|0;G=Y;I=Z;J=_;K=$;L=aa;M=ba;N=ca;O=ea;P=fa;Q=ga;continue}else{F=mF(b)|0;G=Y;I=Z;J=_;K=$;L=aa;M=ba;N=ca;O=ea;P=fa;Q=ga;continue}}if((L|0)==0){o=(c[m>>2]|0)==0;if(!o){c[e>>2]=(c[e>>2]|0)-1}do{if(w){lF(b,0)}else{if(o){break}n=c[e>>2]|0;c[e>>2]=n-1;if((M|0)==0){break}c[e>>2]=n-2}}while(0);l=+(r|0)*0.0;i=g;return+l}o=(M|0)==0;n=o?I:K;q=o?G:J;o=0;if((G|0)<(o|0)|(G|0)==(o|0)&I>>>0<8>>>0){o=Q;p=G;ma=I;while(1){na=o<<4;oa=EF(ma,p,1,0)|0;pa=H;qa=0;if((pa|0)<(qa|0)|(pa|0)==(qa|0)&oa>>>0<8>>>0){o=na;p=pa;ma=oa}else{ra=na;break}}}else{ra=Q}do{if((X|32|0)==112){ma=kF(b,f)|0;p=H;if(!((ma|0)==0&(p|0)==(-2147483648|0))){sa=p;ta=ma;break}if(w){lF(b,0);l=0.0;i=g;return+l}else{if((c[m>>2]|0)==0){sa=0;ta=0;break}c[e>>2]=(c[e>>2]|0)-1;sa=0;ta=0;break}}else{if((c[m>>2]|0)==0){sa=0;ta=0;break}c[e>>2]=(c[e>>2]|0)-1;sa=0;ta=0}}while(0);ma=EF(n<<2|0>>>30,q<<2|n>>>30,-32,-1)|0;p=EF(ma,H,ta,sa)|0;ma=H;if((ra|0)==0){l=+(r|0)*0.0;i=g;return+l}o=0;if((ma|0)>(o|0)|(ma|0)==(o|0)&p>>>0>(-j|0)>>>0){c[(Vb()|0)>>2]=34;l=+(r|0)*1.7976931348623157e+308*1.7976931348623157e+308;i=g;return+l}o=j-106|0;na=(o|0)<0|0?-1:0;if((ma|0)<(na|0)|(ma|0)==(na|0)&p>>>0<o>>>0){c[(Vb()|0)>>2]=34;l=+(r|0)*2.2250738585072014e-308*2.2250738585072014e-308;i=g;return+l}if((ra|0)>-1){o=ra;la=P;na=ma;oa=p;while(1){pa=o<<1;if(la<.5){ua=la;va=pa}else{ua=la+-1.0;va=pa|1}wa=la+ua;pa=EF(oa,na,-1,-1)|0;qa=H;if((va|0)>-1){o=va;la=wa;na=qa;oa=pa}else{xa=va;ya=wa;za=qa;Aa=pa;break}}}else{xa=ra;ya=P;za=ma;Aa=p}oa=0;na=FF(32,0,j,(j|0)<0|0?-1:0)|0;o=EF(Aa,za,na,H)|0;na=H;if((oa|0)>(na|0)|(oa|0)==(na|0)&k>>>0>o>>>0){na=o;Ba=(na|0)<0?0:na}else{Ba=k}do{if((Ba|0)<53){la=+(r|0);wa=+pb(+(+nF(1.0,84-Ba|0)),+la);if(!((Ba|0)<32&ya!=0.0)){Ca=ya;Da=xa;Ea=wa;Fa=la;break}na=xa&1;Ca=(na|0)==0?0.0:ya;Da=(na^1)+xa|0;Ea=wa;Fa=la}else{Ca=ya;Da=xa;Ea=0.0;Fa=+(r|0)}}while(0);la=Fa*Ca+(Ea+Fa*+(Da>>>0>>>0))-Ea;if(la==0.0){c[(Vb()|0)>>2]=34}l=+oF(la,Aa);i=g;return+l}else{C=y}}while(0);p=j+k|0;ma=-p|0;na=C;o=0;while(1){if((na|0)==46){x=139;break}else if((na|0)!=48){Ga=na;Ha=0;Ia=o;Ja=0;Ka=0;break}oa=c[e>>2]|0;if(oa>>>0<(c[m>>2]|0)>>>0){c[e>>2]=oa+1;na=d[oa]|0;o=1;continue}else{na=mF(b)|0;o=1;continue}}d:do{if((x|0)==139){na=c[e>>2]|0;if(na>>>0<(c[m>>2]|0)>>>0){c[e>>2]=na+1;La=d[na]|0}else{La=mF(b)|0}if((La|0)==48){Ma=-1;Na=-1}else{Ga=La;Ha=1;Ia=o;Ja=0;Ka=0;break}while(1){na=c[e>>2]|0;if(na>>>0<(c[m>>2]|0)>>>0){c[e>>2]=na+1;Oa=d[na]|0}else{Oa=mF(b)|0}if((Oa|0)!=48){Ga=Oa;Ha=1;Ia=1;Ja=Ma;Ka=Na;break d}na=EF(Na,Ma,-1,-1)|0;Ma=H;Na=na}}}while(0);o=h|0;c[o>>2]=0;na=Ga-48|0;oa=(Ga|0)==46;e:do{if(na>>>0<10>>>0|oa){n=h+496|0;q=Ja;pa=Ka;qa=0;Pa=0;Ra=0;Sa=Ia;Ta=Ha;Ua=0;Va=0;Wa=Ga;Ya=na;Za=oa;while(1){do{if(Za){if((Ta|0)==0){_a=Va;$a=Ua;ab=1;bb=Sa;cb=Ra;db=qa;eb=Pa;fb=qa;gb=Pa}else{hb=q;ib=pa;jb=qa;kb=Pa;lb=Ra;mb=Sa;nb=Ua;ob=Va;qb=Wa;break e}}else{rb=EF(Pa,qa,1,0)|0;sb=H;tb=(Wa|0)!=48;if((Ua|0)>=125){if(!tb){_a=Va;$a=Ua;ab=Ta;bb=Sa;cb=Ra;db=sb;eb=rb;fb=q;gb=pa;break}c[n>>2]=c[n>>2]|1;_a=Va;$a=Ua;ab=Ta;bb=Sa;cb=Ra;db=sb;eb=rb;fb=q;gb=pa;break}ub=h+(Ua<<2)|0;if((Va|0)==0){vb=Ya}else{vb=Wa-48+((c[ub>>2]|0)*10|0)|0}c[ub>>2]=vb;ub=Va+1|0;wb=(ub|0)==9;_a=wb?0:ub;$a=(wb&1)+Ua|0;ab=Ta;bb=1;cb=tb?rb:Ra;db=sb;eb=rb;fb=q;gb=pa}}while(0);rb=c[e>>2]|0;if(rb>>>0<(c[m>>2]|0)>>>0){c[e>>2]=rb+1;xb=d[rb]|0}else{xb=mF(b)|0}rb=xb-48|0;sb=(xb|0)==46;if(rb>>>0<10>>>0|sb){q=fb;pa=gb;qa=db;Pa=eb;Ra=cb;Sa=bb;Ta=ab;Ua=$a;Va=_a;Wa=xb;Ya=rb;Za=sb}else{yb=fb;zb=gb;Ab=db;Bb=eb;Cb=cb;Db=bb;Eb=ab;Fb=$a;Gb=_a;Hb=xb;x=162;break}}}else{yb=Ja;zb=Ka;Ab=0;Bb=0;Cb=0;Db=Ia;Eb=Ha;Fb=0;Gb=0;Hb=Ga;x=162}}while(0);if((x|0)==162){oa=(Eb|0)==0;hb=oa?Ab:yb;ib=oa?Bb:zb;jb=Ab;kb=Bb;lb=Cb;mb=Db;nb=Fb;ob=Gb;qb=Hb}oa=(mb|0)!=0;do{if(oa){if((qb|32|0)!=101){x=171;break}na=kF(b,f)|0;Za=H;do{if((na|0)==0&(Za|0)==(-2147483648|0)){if(w){lF(b,0);l=0.0;i=g;return+l}else{if((c[m>>2]|0)==0){Ib=0;Jb=0;break}c[e>>2]=(c[e>>2]|0)-1;Ib=0;Jb=0;break}}else{Ib=Za;Jb=na}}while(0);na=EF(Jb,Ib,ib,hb)|0;Kb=H;Lb=na}else{x=171}}while(0);do{if((x|0)==171){if((qb|0)<=-1){Kb=hb;Lb=ib;break}if((c[m>>2]|0)==0){Kb=hb;Lb=ib;break}c[e>>2]=(c[e>>2]|0)-1;Kb=hb;Lb=ib}}while(0);if(!oa){c[(Vb()|0)>>2]=22;lF(b,0);l=0.0;i=g;return+l}na=c[o>>2]|0;if((na|0)==0){l=+(r|0)*0.0;i=g;return+l}Za=0;do{if((Lb|0)==(kb|0)&(Kb|0)==(jb|0)&((jb|0)<(Za|0)|(jb|0)==(Za|0)&kb>>>0<10>>>0)){if(k>>>0<=30>>>0){if((na>>>(k>>>0)|0)!=0){break}}l=+(r|0)*+(na>>>0>>>0);i=g;return+l}}while(0);na=(j|0)/-2|0;Za=(na|0)<0|0?-1:0;if((Kb|0)>(Za|0)|(Kb|0)==(Za|0)&Lb>>>0>na>>>0){c[(Vb()|0)>>2]=34;l=+(r|0)*1.7976931348623157e+308*1.7976931348623157e+308;i=g;return+l}na=j-106|0;Za=(na|0)<0|0?-1:0;if((Kb|0)<(Za|0)|(Kb|0)==(Za|0)&Lb>>>0<na>>>0){c[(Vb()|0)>>2]=34;l=+(r|0)*2.2250738585072014e-308*2.2250738585072014e-308;i=g;return+l}if((ob|0)==0){Mb=nb}else{if((ob|0)<9){na=h+(nb<<2)|0;Za=ob;oa=c[na>>2]|0;do{oa=oa*10|0;Za=Za+1|0;}while((Za|0)<9);c[na>>2]=oa}Mb=nb+1|0}Za=Lb;do{if((lb|0)<9){if(!((lb|0)<=(Za|0)&(Za|0)<18)){break}if((Za|0)==9){l=+(r|0)*+((c[o>>2]|0)>>>0>>>0);i=g;return+l}if((Za|0)<9){l=+(r|0)*+((c[o>>2]|0)>>>0>>>0)/+(c[29728+(8-Za<<2)>>2]|0);i=g;return+l}Ya=k+27+(Za*-3|0)|0;Wa=c[o>>2]|0;if((Ya|0)<=30){if((Wa>>>(Ya>>>0)|0)!=0){break}}l=+(r|0)*+(Wa>>>0>>>0)*+(c[29728+(Za-10<<2)>>2]|0);i=g;return+l}}while(0);o=(Za|0)%9|0;if((o|0)==0){Nb=0;Ob=Mb;Pb=0;Qb=Za}else{oa=(Za|0)>-1?o:o+9|0;o=c[29728+(8-oa<<2)>>2]|0;do{if((Mb|0)==0){Rb=0;Sb=0;Tb=Za}else{na=1e9/(o|0)|0;Wa=Za;Ya=0;Va=0;Ua=0;while(1){Ta=h+(Va<<2)|0;Sa=c[Ta>>2]|0;Ra=((Sa>>>0)/(o>>>0)|0)+Ua|0;c[Ta>>2]=Ra;Ub=da((Sa>>>0)%(o>>>0)|0,na)|0;Sa=Va+1|0;if((Va|0)==(Ya|0)&(Ra|0)==0){Wb=Sa&127;Xb=Wa-9|0}else{Wb=Ya;Xb=Wa}if((Sa|0)==(Mb|0)){break}else{Wa=Xb;Ya=Wb;Va=Sa;Ua=Ub}}if((Ub|0)==0){Rb=Mb;Sb=Wb;Tb=Xb;break}c[h+(Mb<<2)>>2]=Ub;Rb=Mb+1|0;Sb=Wb;Tb=Xb}}while(0);Nb=Sb;Ob=Rb;Pb=0;Qb=9-oa+Tb|0}f:while(1){o=h+(Nb<<2)|0;if((Qb|0)<18){Za=Ob;Ua=Pb;while(1){Va=0;Ya=Za+127|0;Wa=Za;while(1){na=Ya&127;Sa=h+(na<<2)|0;Ra=c[Sa>>2]|0;Ta=EF(Ra<<29|0>>>3,0<<29|Ra>>>3,Va,0)|0;Ra=H;Pa=0;if(Ra>>>0>Pa>>>0|Ra>>>0==Pa>>>0&Ta>>>0>1e9>>>0){Pa=PF(Ta,Ra,1e9,0)|0;qa=QF(Ta,Ra,1e9,0)|0;Yb=Pa;Zb=qa}else{Yb=0;Zb=Ta}c[Sa>>2]=Zb;Sa=(na|0)==(Nb|0);if((na|0)!=(Wa+127&127|0)|Sa){_b=Wa}else{_b=(Zb|0)==0?na:Wa}if(Sa){break}else{Va=Yb;Ya=na-1|0;Wa=_b}}Wa=Ua-29|0;if((Yb|0)==0){Za=_b;Ua=Wa}else{$b=Wa;ac=_b;bc=Yb;break}}}else{if((Qb|0)==18){cc=Ob;dc=Pb}else{ec=Nb;fc=Ob;gc=Pb;hc=Qb;break}while(1){if((c[o>>2]|0)>>>0>=9007199>>>0){ec=Nb;fc=cc;gc=dc;hc=18;break f}Ua=0;Za=cc+127|0;Wa=cc;while(1){Ya=Za&127;Va=h+(Ya<<2)|0;na=c[Va>>2]|0;Sa=EF(na<<29|0>>>3,0<<29|na>>>3,Ua,0)|0;na=H;Ta=0;if(na>>>0>Ta>>>0|na>>>0==Ta>>>0&Sa>>>0>1e9>>>0){Ta=PF(Sa,na,1e9,0)|0;qa=QF(Sa,na,1e9,0)|0;ic=Ta;jc=qa}else{ic=0;jc=Sa}c[Va>>2]=jc;Va=(Ya|0)==(Nb|0);if((Ya|0)!=(Wa+127&127|0)|Va){kc=Wa}else{kc=(jc|0)==0?Ya:Wa}if(Va){break}else{Ua=ic;Za=Ya-1|0;Wa=kc}}Wa=dc-29|0;if((ic|0)==0){cc=kc;dc=Wa}else{$b=Wa;ac=kc;bc=ic;break}}}o=Nb+127&127;if((o|0)==(ac|0)){Wa=ac+127&127;Za=h+((ac+126&127)<<2)|0;c[Za>>2]=c[Za>>2]|c[h+(Wa<<2)>>2];lc=Wa}else{lc=ac}c[h+(o<<2)>>2]=bc;Nb=o;Ob=lc;Pb=$b;Qb=Qb+9|0}g:while(1){mc=fc+1&127;oa=h+((fc+127&127)<<2)|0;o=ec;Wa=gc;Za=hc;while(1){Ua=(Za|0)==18;Ya=(Za|0)>27?9:1;nc=o;oc=Wa;while(1){Va=0;while(1){Sa=Va+nc&127;if((Sa|0)==(fc|0)){pc=2;break}qa=c[h+(Sa<<2)>>2]|0;Sa=c[29720+(Va<<2)>>2]|0;if(qa>>>0<Sa>>>0){pc=2;break}Ta=Va+1|0;if(qa>>>0>Sa>>>0){pc=Va;break}if((Ta|0)<2){Va=Ta}else{pc=Ta;break}}if((pc|0)==2&Ua){break g}qc=Ya+oc|0;if((nc|0)==(fc|0)){nc=fc;oc=qc}else{break}}Ua=(1<<Ya)-1|0;Va=1e9>>>(Ya>>>0);rc=Za;sc=nc;Ta=nc;tc=0;do{Sa=h+(Ta<<2)|0;qa=c[Sa>>2]|0;na=(qa>>>(Ya>>>0))+tc|0;c[Sa>>2]=na;tc=da(qa&Ua,Va)|0;qa=(Ta|0)==(sc|0)&(na|0)==0;Ta=Ta+1&127;rc=qa?rc-9|0:rc;sc=qa?Ta:sc;}while((Ta|0)!=(fc|0));if((tc|0)==0){o=sc;Wa=qc;Za=rc;continue}if((mc|0)!=(sc|0)){break}c[oa>>2]=c[oa>>2]|1;o=sc;Wa=qc;Za=rc}c[h+(fc<<2)>>2]=tc;ec=sc;fc=mc;gc=qc;hc=rc}Za=nc&127;if((Za|0)==(fc|0)){c[h+(mc-1<<2)>>2]=0;uc=mc}else{uc=fc}la=+((c[h+(Za<<2)>>2]|0)>>>0>>>0);Za=nc+1&127;if((Za|0)==(uc|0)){Wa=uc+1&127;c[h+(Wa-1<<2)>>2]=0;vc=Wa}else{vc=uc}wa=+(r|0);wc=wa*(la*1.0e9+ +((c[h+(Za<<2)>>2]|0)>>>0>>>0));Za=oc+53|0;Wa=Za-j|0;if((Wa|0)<(k|0)){xc=(Wa|0)<0?0:Wa;yc=1}else{xc=k;yc=0}if((xc|0)<53){la=+pb(+(+nF(1.0,105-xc|0)),+wc);zc=+Xa(+wc,+(+nF(1.0,53-xc|0)));Ac=la;Bc=zc;Cc=la+(wc-zc)}else{Ac=0.0;Bc=0.0;Cc=wc}o=nc+2&127;do{if((o|0)==(vc|0)){Dc=Bc}else{oa=c[h+(o<<2)>>2]|0;do{if(oa>>>0<5e8>>>0){if((oa|0)==0){if((nc+3&127|0)==(vc|0)){Ec=Bc;break}}Ec=wa*.25+Bc}else{if(oa>>>0>5e8>>>0){Ec=wa*.75+Bc;break}if((nc+3&127|0)==(vc|0)){Ec=wa*.5+Bc;break}else{Ec=wa*.75+Bc;break}}}while(0);if((53-xc|0)<=1){Dc=Ec;break}if(+Xa(+Ec,+1.0)!=0.0){Dc=Ec;break}Dc=Ec+1.0}}while(0);wa=Cc+Dc-Ac;do{if((Za&2147483647|0)>(-2-p|0)){if(+S(+wa)<9007199254740992.0){Fc=wa;Gc=yc;Hc=oc}else{Fc=wa*.5;Gc=(yc|0)!=0&(xc|0)==(Wa|0)?0:yc;Hc=oc+1|0}if((Hc+50|0)<=(ma|0)){if(!((Gc|0)!=0&Dc!=0.0)){Ic=Fc;Jc=Hc;break}}c[(Vb()|0)>>2]=34;Ic=Fc;Jc=Hc}else{Ic=wa;Jc=oc}}while(0);l=+oF(Ic,Jc);i=g;return+l}else if((z|0)==3){ma=c[e>>2]|0;if(ma>>>0<(c[m>>2]|0)>>>0){c[e>>2]=ma+1;Kc=d[ma]|0}else{Kc=mF(b)|0}if((Kc|0)==40){Lc=1}else{if((c[m>>2]|0)==0){l=+s;i=g;return+l}c[e>>2]=(c[e>>2]|0)-1;l=+s;i=g;return+l}while(1){ma=c[e>>2]|0;if(ma>>>0<(c[m>>2]|0)>>>0){c[e>>2]=ma+1;Mc=d[ma]|0}else{Mc=mF(b)|0}if(!((Mc-48|0)>>>0<10>>>0|(Mc-65|0)>>>0<26>>>0)){if(!((Mc-97|0)>>>0<26>>>0|(Mc|0)==95)){break}}Lc=Lc+1|0}if((Mc|0)==41){l=+s;i=g;return+l}ma=(c[m>>2]|0)==0;if(!ma){c[e>>2]=(c[e>>2]|0)-1}if(w){c[(Vb()|0)>>2]=22;lF(b,0);l=0.0;i=g;return+l}if((Lc|0)==0|ma){l=+s;i=g;return+l}else{Nc=Lc}while(1){ma=Nc-1|0;c[e>>2]=(c[e>>2]|0)-1;if((ma|0)==0){l=+s;break}else{Nc=ma}}i=g;return+l}else{if((c[m>>2]|0)!=0){c[e>>2]=(c[e>>2]|0)-1}c[(Vb()|0)>>2]=22;lF(b,0);l=0.0;i=g;return+l}}}while(0);do{if((x|0)==23){b=(c[m>>2]|0)==0;if(!b){c[e>>2]=(c[e>>2]|0)-1}if(u>>>0<4>>>0|(f|0)==0|b){break}else{Oc=u}do{c[e>>2]=(c[e>>2]|0)-1;Oc=Oc-1|0;}while(Oc>>>0>3>>>0)}}while(0);l=+(r|0)*t;i=g;return+l}function kF(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=a+4|0;f=c[e>>2]|0;g=a+100|0;if(f>>>0<(c[g>>2]|0)>>>0){c[e>>2]=f+1;h=d[f]|0}else{h=mF(a)|0}do{if((h|0)==45|(h|0)==43){f=(h|0)==45|0;i=c[e>>2]|0;if(i>>>0<(c[g>>2]|0)>>>0){c[e>>2]=i+1;j=d[i]|0}else{j=mF(a)|0}if((j-48|0)>>>0<10>>>0|(b|0)==0){k=f;l=j;break}if((c[g>>2]|0)==0){k=f;l=j;break}c[e>>2]=(c[e>>2]|0)-1;k=f;l=j}else{k=0;l=h}}while(0);if((l-48|0)>>>0>9>>>0){if((c[g>>2]|0)==0){m=-2147483648;n=0;return(H=m,n)|0}c[e>>2]=(c[e>>2]|0)-1;m=-2147483648;n=0;return(H=m,n)|0}else{o=l;p=0}while(1){q=o-48+p|0;l=c[e>>2]|0;if(l>>>0<(c[g>>2]|0)>>>0){c[e>>2]=l+1;r=d[l]|0}else{r=mF(a)|0}if(!((r-48|0)>>>0<10>>>0&(q|0)<214748364)){break}o=r;p=q*10|0}p=q;o=(q|0)<0|0?-1:0;if((r-48|0)>>>0<10>>>0){q=r;l=o;h=p;while(1){j=OF(h,l,10,0)|0;b=H;f=EF(q,(q|0)<0|0?-1:0,-48,-1)|0;i=EF(f,H,j,b)|0;b=H;j=c[e>>2]|0;if(j>>>0<(c[g>>2]|0)>>>0){c[e>>2]=j+1;s=d[j]|0}else{s=mF(a)|0}j=21474836;if((s-48|0)>>>0<10>>>0&((b|0)<(j|0)|(b|0)==(j|0)&i>>>0<2061584302>>>0)){q=s;l=b;h=i}else{t=s;u=b;v=i;break}}}else{t=r;u=o;v=p}if((t-48|0)>>>0<10>>>0){do{t=c[e>>2]|0;if(t>>>0<(c[g>>2]|0)>>>0){c[e>>2]=t+1;w=d[t]|0}else{w=mF(a)|0}}while((w-48|0)>>>0<10>>>0)}if((c[g>>2]|0)!=0){c[e>>2]=(c[e>>2]|0)-1}e=(k|0)!=0;k=FF(0,0,v,u)|0;m=e?H:u;n=e?k:v;return(H=m,n)|0}function lF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[a+104>>2]=b;d=c[a+8>>2]|0;e=c[a+4>>2]|0;f=d-e|0;c[a+108>>2]=f;if((b|0)!=0&(f|0)>(b|0)){c[a+100>>2]=e+b;return}else{c[a+100>>2]=d;return}}function mF(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=b+104|0;f=c[e>>2]|0;if((f|0)==0){g=3}else{if((c[b+108>>2]|0)<(f|0)){g=3}}do{if((g|0)==3){f=qF(b)|0;if((f|0)<0){break}h=c[e>>2]|0;i=c[b+8>>2]|0;do{if((h|0)==0){g=8}else{j=c[b+4>>2]|0;k=h-(c[b+108>>2]|0)-1|0;if((i-j|0)<=(k|0)){g=8;break}c[b+100>>2]=j+k}}while(0);if((g|0)==8){c[b+100>>2]=i}h=c[b+4>>2]|0;if((i|0)!=0){k=b+108|0;c[k>>2]=i+1-h+(c[k>>2]|0)}k=h-1|0;if((d[k]|0|0)==(f|0)){l=f;return l|0}a[k]=f;l=f;return l|0}}while(0);c[b+100>>2]=0;l=-1;return l|0}function nF(a,b){a=+a;b=b|0;var d=0.0,e=0,f=0.0,g=0;do{if((b|0)>1023){d=a*8.98846567431158e+307;e=b-1023|0;if((e|0)<=1023){f=d;g=e;break}e=b-2046|0;f=d*8.98846567431158e+307;g=(e|0)>1023?1023:e}else{if((b|0)>=-1022){f=a;g=b;break}d=a*2.2250738585072014e-308;e=b+1022|0;if((e|0)>=-1022){f=d;g=e;break}e=b+2044|0;f=d*2.2250738585072014e-308;g=(e|0)<-1022?-1022:e}}while(0);return+(f*(c[k>>2]=0<<20|0>>>12,c[k+4>>2]=g+1023<<20|0>>>12,+h[k>>3]))}function oF(a,b){a=+a;b=b|0;return+(+nF(a,b))}function pF(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=b+74|0;e=a[d]|0;a[d]=e-1&255|e;e=b+20|0;d=b+44|0;if((c[e>>2]|0)>>>0>(c[d>>2]|0)>>>0){Hc[c[b+36>>2]&63](b,0,0)|0}c[b+16>>2]=0;c[b+28>>2]=0;c[e>>2]=0;e=b|0;f=c[e>>2]|0;if((f&20|0)==0){g=c[d>>2]|0;c[b+8>>2]=g;c[b+4>>2]=g;h=0;return h|0}if((f&4|0)==0){h=-1;return h|0}c[e>>2]=f|32;h=-1;return h|0}function qF(a){a=a|0;var b=0,e=0,f=0,g=0;b=i;i=i+8|0;e=b|0;if((c[a+8>>2]|0)==0){if((pF(a)|0)==0){f=3}else{g=-1}}else{f=3}do{if((f|0)==3){if((Hc[c[a+32>>2]&63](a,e,1)|0)!=1){g=-1;break}g=d[e]|0}}while(0);i=b;return g|0}function rF(a){a=a|0;return+(+sF(a,0))}function sF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0.0,j=0,k=0,l=0,m=0;d=i;i=i+112|0;e=d|0;vF(e|0,0,112)|0;f=e+4|0;c[f>>2]=a;g=e+8|0;c[g>>2]=-1;c[e+44>>2]=a;c[e+76>>2]=-1;lF(e,0);h=+jF(e,1,1);j=(c[f>>2]|0)-(c[g>>2]|0)+(c[e+108>>2]|0)|0;if((b|0)==0){k=112;l=0;i=d;return+h}if((j|0)==0){m=a}else{m=a+j|0}c[b>>2]=m;k=112;l=0;i=d;return+h}function tF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function uF(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b]=a[c]|0}b=e}else{tF(b,c,d)|0}return b|0}function vF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;g=b&3;h=d|d<<8|d<<16|d<<24;i=f&~3;if(g){g=b+4-g|0;while((b|0)<(g|0)){a[b]=d;b=b+1|0}}while((b|0)<(i|0)){c[b>>2]=h;b=b+4|0}}while((b|0)<(f|0)){a[b]=d;b=b+1|0}return b-e|0}function wF(a,b,c){a=a|0;b=b|0;c=c|0;var e=0,f=0,g=0;while((e|0)<(c|0)){f=d[a+e|0]|0;g=d[b+e|0]|0;if((f|0)!=(g|0))return((f|0)>(g|0)?1:-1)|0;e=e+1|0}return 0}function xF(b){b=b|0;var c=0;c=b;while(a[c]|0){c=c+1|0}return c-b|0}function yF(a){a=a|0;if((a|0)<65)return a|0;if((a|0)>90)return a|0;return a-65+97|0}function zF(b,c){b=b|0;c=c|0;var d=0;do{a[b+d|0]=a[c+d|0];d=d+1|0}while(a[c+(d-1)|0]|0);return b|0}function AF(b,c){b=b|0;c=c|0;var d=0,e=0;d=b+(xF(b)|0)|0;do{a[d+e|0]=a[c+e|0];e=e+1|0}while(a[c+(e-1)|0]|0);return b|0}function BF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;w=w+1|0;c[a>>2]=w;while((e|0)<40){if((c[d+(e<<2)>>2]|0)==0){c[d+(e<<2)>>2]=w;c[d+((e<<2)+4)>>2]=b;c[d+((e<<2)+8)>>2]=0;return 0}e=e+2|0}sb(116);sb(111);sb(111);sb(32);sb(109);sb(97);sb(110);sb(121);sb(32);sb(115);sb(101);sb(116);sb(106);sb(109);sb(112);sb(115);sb(32);sb(105);sb(110);sb(32);sb(97);sb(32);sb(102);sb(117);sb(110);sb(99);sb(116);sb(105);sb(111);sb(110);sb(32);sb(99);sb(97);sb(108);sb(108);sb(44);sb(32);sb(98);sb(117);sb(105);sb(108);sb(100);sb(32);sb(119);sb(105);sb(116);sb(104);sb(32);sb(97);sb(32);sb(104);sb(105);sb(103);sb(104);sb(101);sb(114);sb(32);sb(118);sb(97);sb(108);sb(117);sb(101);sb(32);sb(102);sb(111);sb(114);sb(32);sb(77);sb(65);sb(88);sb(95);sb(83);sb(69);sb(84);sb(74);sb(77);sb(80);sb(83);sb(10);ea(0);return 0}function CF(a,b){a=a|0;b=b|0;var d=0,e=0;while((d|0)<20){e=c[b+(d<<2)>>2]|0;if((e|0)==0)break;if((e|0)==(a|0)){return c[b+((d<<2)+4)>>2]|0}d=d+2|0}return 0}function DF(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;while((e|0)<(d|0)){a[b+e|0]=f?0:a[c+e|0]|0;f=f?1:(a[c+e|0]|0)==0;e=e+1|0}return b|0}function EF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return(H=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function FF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return(H=e,a-c>>>0|0)|0}function GF(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){H=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}H=a<<c-32;return 0}function HF(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){H=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}H=0;return b>>>c-32|0}function IF(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){H=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}H=(b|0)<0?-1:0;return b>>c-32|0}function JF(b){b=b|0;var c=0;c=a[n+(b>>>24)|0]|0;if((c|0)<8)return c|0;c=a[n+(b>>16&255)|0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>8&255)|0]|0;if((c|0)<8)return c+16|0;return(a[n+(b&255)|0]|0)+24|0}function KF(b){b=b|0;var c=0;c=a[m+(b&255)|0]|0;if((c|0)<8)return c|0;c=a[m+(b>>8&255)|0]|0;if((c|0)<8)return c+8|0;c=a[m+(b>>16&255)|0]|0;if((c|0)<8)return c+16|0;return(a[m+(b>>>24)|0]|0)+24|0}function LF(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=da(d,c)|0;f=a>>>16;a=(e>>>16)+(da(d,f)|0)|0;d=b>>>16;b=da(d,c)|0;return(H=(a>>>16)+(da(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function MF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;g=d>>31|((d|0)<0?-1:0)<<1;h=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;i=FF(e^a,f^b,e,f)|0;b=H;a=g^e;e=h^f;f=FF((RF(i,b,FF(g^c,h^d,g,h)|0,H,0)|0)^a,H^e,a,e)|0;return(H=H,f)|0}function NF(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+8|0;g=f|0;h=b>>31|((b|0)<0?-1:0)<<1;j=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;k=e>>31|((e|0)<0?-1:0)<<1;l=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;m=FF(h^a,j^b,h,j)|0;b=H;RF(m,b,FF(k^d,l^e,k,l)|0,H,g)|0;l=FF(c[g>>2]^h,c[g+4>>2]^j,h,j)|0;j=H;i=f;return(H=j,l)|0}function OF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=LF(e,a)|0;f=H;return(H=(da(b,a)|0)+(da(d,e)|0)+f|f&0,c|0|0)|0}function PF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=RF(a,b,c,d,0)|0;return(H=H,e)|0}function QF(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+8|0;g=f|0;RF(a,b,d,e,g)|0;i=f;return(H=c[g+4>>2]|0,c[g>>2]|0)|0}function RF(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0;g=a;h=b;i=h;j=d;k=e;l=k;if((i|0)==0){m=(f|0)!=0;if((l|0)==0){if(m){c[f>>2]=(g>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return(H=n,o)|0}else{if(!m){n=0;o=0;return(H=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;o=0;return(H=n,o)|0}}m=(l|0)==0;do{if((j|0)==0){if(m){if((f|0)!=0){c[f>>2]=(i>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return(H=n,o)|0}if((g|0)==0){if((f|0)!=0){c[f>>2]=0;c[f+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return(H=n,o)|0}p=l-1|0;if((p&l|0)==0){if((f|0)!=0){c[f>>2]=a|0;c[f+4>>2]=p&i|b&0}n=0;o=i>>>((KF(l|0)|0)>>>0);return(H=n,o)|0}p=(JF(l|0)|0)-(JF(i|0)|0)|0;if(p>>>0<=30){q=p+1|0;r=31-p|0;s=q;t=i<<r|g>>>(q>>>0);u=i>>>(q>>>0);v=0;w=g<<r;break}if((f|0)==0){n=0;o=0;return(H=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return(H=n,o)|0}else{if(!m){r=(JF(l|0)|0)-(JF(i|0)|0)|0;if(r>>>0<=31){q=r+1|0;p=31-r|0;x=r-31>>31;s=q;t=g>>>(q>>>0)&x|i<<p;u=i>>>(q>>>0)&x;v=0;w=g<<p;break}if((f|0)==0){n=0;o=0;return(H=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return(H=n,o)|0}p=j-1|0;if((p&j|0)!=0){x=(JF(j|0)|0)+33-(JF(i|0)|0)|0;q=64-x|0;r=32-x|0;y=r>>31;z=x-32|0;A=z>>31;s=x;t=r-1>>31&i>>>(z>>>0)|(i<<r|g>>>(x>>>0))&A;u=A&i>>>(x>>>0);v=g<<q&y;w=(i<<q|g>>>(z>>>0))&y|g<<r&x-33>>31;break}if((f|0)!=0){c[f>>2]=p&g;c[f+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return(H=n,o)|0}else{p=KF(j|0)|0;n=i>>>(p>>>0)|0;o=i<<32-p|g>>>(p>>>0)|0;return(H=n,o)|0}}}while(0);if((s|0)==0){B=w;C=v;D=u;E=t;F=0;G=0}else{g=d|0|0;d=k|e&0;e=EF(g,d,-1,-1)|0;k=H;i=w;w=v;v=u;u=t;t=s;s=0;while(1){I=w>>>31|i<<1;J=s|w<<1;j=u<<1|i>>>31|0;a=u>>>31|v<<1|0;FF(e,k,j,a)|0;b=H;h=b>>31|((b|0)<0?-1:0)<<1;K=h&1;L=FF(j,a,h&g,(((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1)&d)|0;M=H;b=t-1|0;if((b|0)==0){break}else{i=I;w=J;v=M;u=L;t=b;s=K}}B=I;C=J;D=M;E=L;F=0;G=K}K=C;C=0;if((f|0)!=0){c[f>>2]=E;c[f+4>>2]=D}n=(K|0)>>>31|(B|C)<<1|(C<<1|K>>>31)&0|F;o=(K<<1|0>>>31)&-2|G;return(H=n,o)|0}function SF(a){a=+a;return+T(+a)}function TF(a,b){a=a|0;b=b|0;rc(a|0,b|0)}function UF(a){a=a|0;return tb(a|0)|0}function VF(a,b,c){a=a|0;b=b|0;c=c|0;return nb(a|0,b|0,c|0)|0}function WF(a,b,c){a=a|0;b=b|0;c=c|0;return gc(a|0,b|0,c|0)|0}function XF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ma(a|0,b|0,c|0,d|0)|0}function YF(a,b){a=a|0;b=b|0;return Ka(a|0,b|0)|0}function ZF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Jb(a|0,b|0,c|0,d|0)}function _F(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Bc[a&63](b|0,c|0,d|0,e|0,f|0)}function $F(a,b){a=a|0;b=b|0;Cc[a&255](b|0)}function aG(a,b,c){a=a|0;b=b|0;c=c|0;Dc[a&63](b|0,c|0)}function bG(a,b){a=a|0;b=b|0;return Ec[a&63](b|0)|0}function cG(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=+e;return Fc[a&7](b|0,c|0,+d,+e)|0}function dG(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Gc[a&127](b|0,c|0,d|0,e|0,f|0)|0}function eG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Hc[a&63](b|0,c|0,d|0)|0}function fG(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Ic[a&15](b|0,c|0,d|0,e|0,f|0,g|0)}function gG(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;return Jc[a&3](b|0,c|0,d|0,e|0,+f,+g,+h,+i)|0}function hG(a,b){a=a|0;b=b|0;return+Kc[a&3](b|0)}function iG(a,b){a=a|0;b=+b;return+Lc[a&3](+b)}function jG(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;return+Mc[a&15](+b,+c,+d)}function kG(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;Nc[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function lG(a,b,c){a=a|0;b=b|0;c=c|0;return Oc[a&255](b|0,c|0)|0}function mG(a){a=a|0;return+Pc[a&3]()}function nG(a){a=a|0;return Qc[a&3]()|0}function oG(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=g|0;Rc[a&31](b|0,c|0,d|0,+e,+f,g|0)}function pG(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Sc[a&127](b|0,c|0,d|0,e|0)|0}function qG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Tc[a&127](b|0,c|0,d|0)}function rG(a){a=a|0;Uc[a&3]()}function sG(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Vc[a&63](b|0,c|0,d|0,e|0)}function tG(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ea(0)}function uG(a){a=a|0;ea(1)}function vG(a,b){a=a|0;b=b|0;ea(2)}function wG(a){a=a|0;ea(3);return 0}function xG(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;ea(4);return 0}function yG(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ea(5);return 0}function zG(a,b,c){a=a|0;b=b|0;c=c|0;ea(6);return 0}function AG(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ea(7)}function BG(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=+g;h=+h;ea(8);return 0}function CG(a){a=a|0;ea(9);return 0.0}function DG(a){a=+a;ea(10);return 0.0}function EG(a,b,c){a=+a;b=+b;c=+c;ea(11);return 0.0}function FG(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;ea(12)}function GG(a,b){a=a|0;b=b|0;ea(13);return 0}function HG(){ea(14);return 0.0}function IG(){ea(15);return 0}function JG(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=+e;f=f|0;ea(16)}function KG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ea(17);return 0}function LG(a,b,c){a=a|0;b=b|0;c=c|0;ea(18)}function MG(){ea(19)}function NG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ea(20)}
-
-
-
-
-// EMSCRIPTEN_END_FUNCS
-var Bc=[tG,tG,Mf,tG,sf,tG,JC,tG,oo,tG,xg,tG,tg,tG,cD,tG,Xe,tG,Ye,tG,eg,tG,tf,tG,ug,tG,gv,tG,XC,tG,QD,tG,fg,tG,rD,tG,Nf,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG];var Cc=[uG,uG,NC,uG,sl,uG,hC,uG,eD,uG,iC,uG,kD,uG,WC,uG,TC,uG,Cl,uG,gC,uG,xC,uG,to,uG,HC,uG,dv,uG,tC,uG,Ll,uG,lD,uG,mD,uG,fC,uG,$D,uG,Xu,uG,Xk,uG,Lq,uG,ND,uG,aE,uG,Pu,uG,ZD,uG,rl,uG,iD,uG,FD,uG,PD,uG,nD,uG,pD,uG,SB,uG,jD,uG,wC,uG,uC,uG,_k,uG,xt,uG,ql,uG,SC,uG,sC,uG,Ot,uG,jC,uG,kz,uG,Ty,uG,vC,uG,sE,uG,IC,uG,Ou,uG,UC,uG,CD,uG,po,uG,QC,uG,VC,uG,MC,uG,Ww,uG,OD,uG,PC,uG,Bm,uG,RD,uG,LC,uG,DD,uG,rE,uG,Qh,uG,ez,uG,_D,uG,ED,uG,sk,uG,qD,uG,Uy,uG,st,uG,wo,uG,pA,uG,eF,uG,$k,uG,Mq,uG,nE,uG,$u,uG,fD,uG,uA,uG,yC,uG,RC,uG,NB,uG,gD,uG,rk,uG,oD,uG,iz,uG,sD,uG,Wu,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG];var Dc=[vG,vG,Kl,vG,Ug,vG,Bl,vG,zi,vG,pk,vG,rx,vG,wA,vG,qn,vG,Cm,vG,gE,vG,sA,vG,Hv,vG,hv,vG,bD,vG,AC,vG,Pl,vG,tk,vG,LD,vG,Ul,vG,TF,vG,XD,vG,FC,vG,Al,vG,Gl,vG,yD,vG,vG,vG,vG,vG,vG,vG,vG,vG,vG,vG,vG,vG];var Ec=[wG,wG,UF,wG,mA,wG,dF,wG,TB,wG,Am,wG,jk,wG,ox,wG,lA,wG,ux,wG,Lw,wG,jA,wG,xF,wG,nA,wG,St,wG,Dm,wG,oA,wG,aA,wG,uk,wG,Kw,wG,kA,wG,Tt,wG,iA,wG,Eo,wG,lx,wG,hA,wG,Ro,wG,kk,wG,$w,wG,wG,wG,wG,wG,wG,wG];var Fc=[xG,xG,Yt,xG,Zt,xG,xG,xG];var Gc=[yG,yG,de,yG,Js,yG,me,yG,ke,yG,ne,yG,oe,yG,pe,yG,$d,yG,Ne,yG,je,yG,Fl,yG,Pe,yG,Oe,yG,Ie,yG,Ke,yG,he,yG,He,yG,Me,yG,Je,yG,Le,yG,Qe,yG,qe,yG,ve,yG,we,yG,xe,yG,se,yG,re,yG,ue,yG,te,yG,Zd,yG,_d,yG,Ge,yG,Ae,yG,Be,yG,De,yG,Fe,yG,Ee,yG,ye,yG,ie,yG,Ce,yG,ze,yG,ge,yG,Ol,yG,ce,yG,ae,yG,Sw,yG,le,yG,be,yG,fe,yG,ee,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG];var Hc=[zG,zG,_g,zG,Mt,zG,VF,zG,pz,zG,jx,zG,Py,zG,Zq,zG,Fv,zG,nx,zG,jf,zG,Tw,zG,pf,zG,Xf,zG,Cn,zG,WF,zG,bz,zG,qk,zG,Tg,zG,ry,zG,Pk,zG,Xj,zG,um,zG,eh,zG,Vw,zG,Jf,zG,Df,zG,bg,zG,Sq,zG,Kt,zG,Dt,zG,gh,zG];var Ic=[AG,AG,$C,AG,DC,AG,nC,AG,JD,AG,eE,AG,wD,AG,VD,AG];var Jc=[BG,BG,OB,BG];var Kc=[CG,CG,Gm,CG];var Lc=[DG,DG,SF,DG];var Mc=[EG,EG,ii,EG,hi,EG,fi,EG,gi,EG,EG,EG,EG,EG,EG,EG];var Nc=[FG,FG];var Oc=[GG,GG,Pv,GG,Dp,GG,Ii,GG,Rv,GG,Pi,GG,jg,GG,kg,GG,jz,GG,Di,GG,Ue,GG,yB,GG,Dv,GG,zo,GG,Fi,GG,_z,GG,Zi,GG,Is,GG,Vi,GG,_i,GG,Li,GG,_f,GG,Bh,GG,Hi,GG,xm,GG,Lt,GG,Tl,GG,Xi,GG,Ep,GG,$i,GG,Kr,GG,Ff,GG,cj,GG,Ei,GG,Gi,GG,lg,GG,mg,GG,ng,GG,Ni,GG,Ui,GG,Vu,GG,El,GG,ig,GG,Fg,GG,vx,GG,Nl,GG,ej,GG,Gf,GG,of,GG,Lr,GG,YF,GG,Qi,GG,Tn,GG,Gg,GG,kx,GG,Ki,GG,ag,GG,Jl,GG,Wi,GG,px,GG,gn,GG,Qv,GG,zp,GG,lf,GG,aj,GG,Si,GG,Hg,GG,Ri,GG,bj,GG,tr,GG,Er,GG,Gr,GG,Mi,GG,mf,GG,XE,GG,Rw,GG,Qo,GG,If,GG,Zf,GG,fj,GG,Cv,GG,Ir,GG,Yi,GG,Un,GG,QB,GG,Ve,GG,zF,GG,dj,GG,We,GG,Mr,GG,zv,GG,RB,GG,Vl,GG,hg,GG,gg,GG,Ti,GG,Ji,GG,Co,GG,Oi,GG,mh,GG,LB,GG,gF,GG,Hr,GG,mk,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG];var Pc=[HG,HG,zm,HG];var Qc=[IG,IG,sr,IG];var Rc=[JG,JG,uh,JG,wh,JG,vh,JG,xh,JG,rh,JG,yh,JG,sh,JG,th,JG,JG,JG,JG,JG,JG,JG,JG,JG,JG,JG,JG,JG,JG,JG];var Sc=[KG,KG,Fd,KG,Yf,KG,Od,KG,Uq,KG,Hf,KG,Rk,KG,En,KG,rf,KG,zf,KG,Lf,KG,Aw,KG,kf,KG,Dx,KG,qx,KG,ef,KG,nf,KG,Af,KG,Uf,KG,Sf,KG,Xg,KG,XF,KG,ix,KG,$e,KG,Lz,KG,Ft,KG,Em,KG,zw,KG,Wv,KG,df,KG,Wx,KG,hx,KG,af,KG,Bf,KG,hf,KG,Wf,KG,wm,KG,dg,KG,ff,KG,cz,KG,Qw,KG,Jd,KG,vd,KG,Sd,KG,gf,KG,Ld,KG,Vd,KG,Ef,KG,Tf,KG,Ex,KG,Vf,KG,Ud,KG,Cf,KG,$f,KG,Pr,KG,$q,KG,Zj,KG,wy,KG,yf,KG,KG,KG,KG,KG,KG,KG,KG,KG,KG,KG];var Tc=[LG,LG,xy,LG,Yj,LG,vm,LG,TD,LG,Bx,LG,qA,LG,ZC,LG,KD,LG,Ux,LG,Fx,LG,nj,LG,el,LG,Yx,LG,EC,LG,qj,LG,Et,LG,bE,LG,vw,LG,kC,LG,zC,LG,SD,LG,jq,LG,Tv,LG,WD,LG,aD,LG,Tq,LG,lC,LG,YC,LG,UB,LG,HD,LG,uD,LG,kw,LG,xD,LG,fE,LG,Ai,LG,oC,LG,Sk,LG,lw,LG,oj,LG,kq,LG,zn,LG,Xw,LG,tA,LG,vA,LG,mj,LG,$x,LG,pj,LG,cE,LG,yi,LG,dz,LG,iq,LG,ni,LG,tD,LG,Qk,LG,xA,LG,HB,LG,Dn,LG,rA,LG,_q,LG,BC,LG,Uw,LG,GD,LG,LG,LG];var Uc=[MG,MG,ym,MG];var Vc=[NG,NG,_C,NG,pE,NG,mE,NG,Ml,NG,oE,NG,kE,NG,bf,NG,iE,NG,jE,NG,qE,NG,CC,NG,dE,NG,qf,NG,cg,NG,lE,NG,hD,NG,Dl,NG,mC,NG,ID,NG,ZF,NG,dC,NG,vD,NG,UD,NG,Kf,NG,OC,NG,NG,NG,NG,NG,NG,NG,NG,NG,NG,NG,NG,NG];return{_vizRenderFromString:ld,_strlen:xF,_strcat:AF,_free:eF,_memcmp:wF,_strncpy:DF,_memmove:uF,_tolower:yF,_saveSetjmp:BF,_memset:vF,_malloc:dF,_memcpy:tF,_realloc:gF,_strcpy:zF,_calloc:fF,_testSetjmp:CF,runPostSets:kd,stackAlloc:Wc,stackSave:Xc,stackRestore:Yc,setThrew:Zc,setTempRet0:ad,setTempRet1:bd,setTempRet2:cd,setTempRet3:dd,setTempRet4:ed,setTempRet5:fd,setTempRet6:gd,setTempRet7:hd,setTempRet8:id,setTempRet9:jd,dynCall_viiiii:_F,dynCall_vi:$F,dynCall_vii:aG,dynCall_ii:bG,dynCall_iiiff:cG,dynCall_iiiiii:dG,dynCall_iiii:eG,dynCall_viiiiii:fG,dynCall_iiiiidddd:gG,dynCall_di:hG,dynCall_dd:iG,dynCall_dddd:jG,dynCall_viiiiiiiii:kG,dynCall_iii:lG,dynCall_d:mG,dynCall_i:nG,dynCall_viiiddi:oG,dynCall_iiiii:pG,dynCall_viii:qG,dynCall_v:rG,dynCall_viiii:sG}
-// EMSCRIPTEN_END_ASM
-
-})({Math:Math,
-Int8Array:Int8Array,Int16Array:Int16Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Uint16Array:Uint16Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array},{abort:aa,assert:J,asmPrintInt:function(a,b){e.print("int "+a+","+b)},asmPrintFloat:function(a,b){e.print("float "+a+","+b)},min:va,invoke_viiiii:function(a,b,c,d,g,i){try{e.dynCall_viiiii(a,b,c,d,g,i)}catch(h){"number"!==typeof h&&"longjmp"!==h&&k(h),u.setThrew(1,0)}},invoke_vi:function(a,b){try{e.dynCall_vi(a,b)}catch(c){"number"!==
-typeof c&&"longjmp"!==c&&k(c),u.setThrew(1,0)}},invoke_vii:function(a,b,c){try{e.dynCall_vii(a,b,c)}catch(d){"number"!==typeof d&&"longjmp"!==d&&k(d),u.setThrew(1,0)}},invoke_ii:function(a,b){try{return e.dynCall_ii(a,b)}catch(c){"number"!==typeof c&&"longjmp"!==c&&k(c),u.setThrew(1,0)}},invoke_iiiff:function(a,b,c,d,g){try{return e.dynCall_iiiff(a,b,c,d,g)}catch(i){"number"!==typeof i&&"longjmp"!==i&&k(i),u.setThrew(1,0)}},invoke_iiiiii:function(a,b,c,d,g,i){try{return e.dynCall_iiiiii(a,b,c,d,g,
-i)}catch(h){"number"!==typeof h&&"longjmp"!==h&&k(h),u.setThrew(1,0)}},invoke_iiii:function(a,b,c,d){try{return e.dynCall_iiii(a,b,c,d)}catch(g){"number"!==typeof g&&"longjmp"!==g&&k(g),u.setThrew(1,0)}},invoke_viiiiii:function(a,b,c,d,g,i,h){try{e.dynCall_viiiiii(a,b,c,d,g,i,h)}catch(j){"number"!==typeof j&&"longjmp"!==j&&k(j),u.setThrew(1,0)}},invoke_iiiiidddd:function(a,b,c,d,g,i,h,j,l){try{return e.dynCall_iiiiidddd(a,b,c,d,g,i,h,j,l)}catch(n){"number"!==typeof n&&"longjmp"!==n&&k(n),u.setThrew(1,
-0)}},invoke_di:function(a,b){try{return e.dynCall_di(a,b)}catch(c){"number"!==typeof c&&"longjmp"!==c&&k(c),u.setThrew(1,0)}},invoke_dd:function(a,b){try{return e.dynCall_dd(a,b)}catch(c){"number"!==typeof c&&"longjmp"!==c&&k(c),u.setThrew(1,0)}},invoke_dddd:function(a,b,c,d){try{return e.dynCall_dddd(a,b,c,d)}catch(g){"number"!==typeof g&&"longjmp"!==g&&k(g),u.setThrew(1,0)}},invoke_viiiiiiiii:function(a,b,c,d,g,i,h,j,l,n){try{e.dynCall_viiiiiiiii(a,b,c,d,g,i,h,j,l,n)}catch(m){"number"!==typeof m&&
-"longjmp"!==m&&k(m),u.setThrew(1,0)}},invoke_iii:function(a,b,c){try{return e.dynCall_iii(a,b,c)}catch(d){"number"!==typeof d&&"longjmp"!==d&&k(d),u.setThrew(1,0)}},invoke_d:function(a){try{return e.dynCall_d(a)}catch(b){"number"!==typeof b&&"longjmp"!==b&&k(b),u.setThrew(1,0)}},invoke_i:function(a){try{return e.dynCall_i(a)}catch(b){"number"!==typeof b&&"longjmp"!==b&&k(b),u.setThrew(1,0)}},invoke_viiiddi:function(a,b,c,d,g,i,h){try{e.dynCall_viiiddi(a,b,c,d,g,i,h)}catch(j){"number"!==typeof j&&
-"longjmp"!==j&&k(j),u.setThrew(1,0)}},invoke_iiiii:function(a,b,c,d,g){try{return e.dynCall_iiiii(a,b,c,d,g)}catch(i){"number"!==typeof i&&"longjmp"!==i&&k(i),u.setThrew(1,0)}},invoke_viii:function(a,b,c,d){try{e.dynCall_viii(a,b,c,d)}catch(g){"number"!==typeof g&&"longjmp"!==g&&k(g),u.setThrew(1,0)}},invoke_v:function(a){try{e.dynCall_v(a)}catch(b){"number"!==typeof b&&"longjmp"!==b&&k(b),u.setThrew(1,0)}},invoke_viiii:function(a,b,c,d,g){try{e.dynCall_viiii(a,b,c,d,g)}catch(i){"number"!==typeof i&&
-"longjmp"!==i&&k(i),u.setThrew(1,0)}},_llvm_lifetime_end:M(),_lseek:Pb,__scanString:Q,_fclose:function(a){Mb(a);return Lb(a)},_fflush:M(),_strtol:Ab,_fputc:ra,_strtok:function(a,b){return Fb(a,b,dc)},_fwrite:Db,_send:function(a,b,c){return!K.ae(a)?(H(g.H),-1):Ba(a,b,c)},_fputs:Qb,_tmpnam:Fa,_isspace:yb,_read:fb,_ceil:Hc,_fileno:function(a){return a},_strstr:function(a,b){var c=0,d;do{c||(d=a,c=b);var e=v[a++|0],g=v[c++|0];if(0==g)return d;g!=e&&(a=d+1,c=0)}while(e);return 0},_fsync:Mb,_isblank:function(a){return 32==
-a||9==a},_fmod:function(a,b){return a%b},_strcmp:function(a,b){return xb(a,b,ha)},_strncmp:xb,_tmpfile:Ra,_snprintf:hb,_fgetc:Ea,__getFloat:Bb,_hypot:function(a,b){return Math.sqrt(a*a+b*b)},_fgets:function(a,b,c){var e=d.D(c);if(!e||e.error||e.Ua)return 0;for(var g,i=0;i<b-1&&10!=g;i++){g=Ea(c);if(-1==g){if(e.error||e.Ua&&0==i)return 0;if(e.Ua)break}v[a+i|0]=g}v[a+i|0]=0;return a},_close:Lb,_getgid:function(){return 0},_strchr:function(a,b){a--;do{a++;var c=v[a];if(c==b)return a}while(c);return 0},
-_asin:Ic,_puts:function(a){var b=t[ma>>2],a=Qb(a,b);return 0>a?a:0>ra(10,b)?-1:a+1},___setErrNo:H,_access:function(a,b){a=R(a);if(b&-8)return H(g.B),-1;var c;try{c=d.F(a,{T:q}).k}catch(e){return d.sa(e),-1}var l="";b&4&&(l+="r");b&2&&(l+="w");b&1&&(l+="x");return l&&d.Da(c,l)?(H(g.mc),-1):0},_ftell:function(a){a=d.D(a);return!a?(H(g.H),-1):d.vb(a.k.mode)?(H(g.nb),-1):a.position},_exit:function(a){Gb(a)},_sprintf:Cb,_strrchr:function(a,b){var c=a+Aa(a);do{if(v[c]==b)return c;c--}while(c>=a);return 0},
-_copysign:function(a,b){return Pa(a)===Pa(b)?a:-a},_recv:function(a,b,c){return!K.ae(a)?(H(g.H),-1):fb(a,b,c)},_cos:uc,_putchar:function(a){return ra(a,t[ma>>2])},_isalnum:function(a){return 48<=a&&57>=a||97<=a&&122>=a||65<=a&&90>=a},_times:function(a){0!==a&&cc(a,0,16);return 0},_bsearch:function(a,b,c,d,g){for(var i=0,h,j,l;i<c;)if(h=i+c>>>1,l=b+h*d,j=e.dynCall_iii(g,a,l),0>j)c=h;else if(0<j)i=h+1;else return l;return 0},__exit:Gb,_isupper:function(a){return 65<=a&&90>=a},_rand:function(){return Math.floor(2147483648*
-Math.random())},_fabsf:Jc,_setlocale:Qa,_bcopy:function(a,b,c){bc(b,a,c)},_toupper:function(a){return 97<=a&&122>=a?a-97+65:a},_pread:function(a,b,c,e){a=d.D(a);if(!a)return H(g.H),-1;try{return d.P(a,v,b,c,e)}catch(l){return d.sa(l),-1}},_fopen:Kb,_open:Jb,_sqrtf:Kc,_sysconf:function(a){switch(a){case 30:return 4096;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 79:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;
-case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;
-case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1E3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return 1}H(g.B);return-1},_putenv:function(a){if(0===a)return H(g.B),-1;var a=R(a),
-b=a.indexOf("=");if(""===a||-1===a.indexOf("="))return H(g.B),-1;var c=a.slice(0,b),a=a.slice(b+1);if(!(c in U)||U[c]!==a)U[c]=a,Ca(U);return 0},_qsort:function(a,b,c,d){if(!(0==b||0==c)){for(var g=[],i=0;i<b;i++)g.push(i);g.sort(function(b,g){return e.dynCall_iii(d,a+b*c,a+g*c)});var h=ia(b*c);Za(h,a,b*c);for(i=0;i<b;i++)g[i]!=i&&Za(a+i*c,h+g[i]*c,c);Ib(h)}},_isalpha:function(a){return 97<=a&&122>=a||65<=a&&90>=a},_strdup:function(a){var b=Aa(a),c=ia(b+1);Za(c,a,b)|0;v[c+b|0]=0;return c},_log10:function(a){return Math.log(a)/
-Math.LN10},_fread:Nb,_isatty:function(a){a=d.D(a);return!a?(H(g.H),0):!a.aa?(H(g.vd),0):1},__formatString:gb,_getenv:Da,_atoi:function(a){return Ab(a,r,10)},_vfprintf:function(a,b,c){return Eb(a,b,t[c>>2])},_llvm_pow_f64:Lc,_sbrk:Rb,___errno_location:function(){return Na},_strerror:ya,_fstat:function(a,b){var c=d.D(a);return!c?(H(g.H),-1):Ob(c.path,b)},_llvm_lifetime_start:M(),__parseInt:zb,_vsprintf:function(a,b,c){return Cb(a,b,t[c>>2])},_vsnprintf:function(a,b,c,d){return hb(a,b,c,t[d>>2])},_sscanf:function(a,
-b,c){var d=0;return Q(b,function(){return v[a+d++|0]},function(){d--},c)},_feof:function(a){a=d.D(a);return Number(a&&a.Ua)},___assert_fail:function(a,b,c,d){ba=q;k("Assertion failed: "+R(a)+", at: "+[b?R(b):"unknown filename",c,d?R(d):"unknown function"]+" at "+bb())},_srand:M(),_strtok_r:Fb,_abort:function(){e.abort()},_fprintf:Eb,_tan:wc,___buildEnvironment:Ca,_fabs:Dc,_floor:zc,__reallyNegative:Pa,_fseek:function(a,b,c){if(-1==Pb(a,b,c))return-1;a=d.D(a);a.Ua=G;return 0},_sqrt:sc,_write:Ba,_sin:vc,
-_stat:Ob,_longjmp:function(a,b){u.setThrew(a,b||1);k("longjmp")},_strpbrk:function(a,b){for(var c,d={};;){c=v[b++|0];if(!c)break;d[c]=1}for(;;){c=v[a];if(!c)break;if(c in d)return a;a++}return 0},_llvm_va_end:M(),_acos:Cc,_pwrite:function(a,b,c,e){a=d.D(a);if(!a)return H(g.H),-1;try{return d.write(a,v,b,c,e)}catch(l){return d.sa(l),-1}},_strerror_r:wb,_atan2:yc,_exp:xc,_time:function(a){var b=Math.floor(Date.now()/1E3);a&&(t[a>>2]=b);return b},STACKTOP:X,STACK_MAX:nb,tempDoublePtr:sa,ABORT:ba,cttz_i8:Nc,
-ctlz_i8:Mc,NaN:NaN,Infinity:Infinity,_stderr:Ha,_stdout:ma,_stdin:Ga,___fsmu8:p},$);e._vizRenderFromString=u._vizRenderFromString;var Aa=e._strlen=u._strlen,Bc=e._strcat=u._strcat,Ib=e._free=u._free,rc=e._memcmp=u._memcmp,Gc=e._strncpy=u._strncpy,bc=e._memmove=u._memmove,tc=e._tolower=u._tolower,Ec=e._saveSetjmp=u._saveSetjmp,cc=e._memset=u._memset,ia=e._malloc=u._malloc,Za=e._memcpy=u._memcpy;e._realloc=u._realloc;var Ac=e._strcpy=u._strcpy;e._calloc=u._calloc;var Fc=e._testSetjmp=u._testSetjmp,
-qc=e.runPostSets=u.runPostSets;e.dynCall_viiiii=u.dynCall_viiiii;e.dynCall_vi=u.dynCall_vi;e.dynCall_vii=u.dynCall_vii;e.dynCall_ii=u.dynCall_ii;e.dynCall_iiiff=u.dynCall_iiiff;e.dynCall_iiiiii=u.dynCall_iiiiii;e.dynCall_iiii=u.dynCall_iiii;e.dynCall_viiiiii=u.dynCall_viiiiii;e.dynCall_iiiiidddd=u.dynCall_iiiiidddd;e.dynCall_di=u.dynCall_di;e.dynCall_dd=u.dynCall_dd;e.dynCall_dddd=u.dynCall_dddd;e.dynCall_viiiiiiiii=u.dynCall_viiiiiiiii;e.dynCall_iii=u.dynCall_iii;e.dynCall_d=u.dynCall_d;e.dynCall_i=
-u.dynCall_i;e.dynCall_viiiddi=u.dynCall_viiiddi;e.dynCall_iiiii=u.dynCall_iiiii;e.dynCall_viii=u.dynCall_viii;e.dynCall_v=u.dynCall_v;e.dynCall_viiii=u.dynCall_viiii;l.hd=function(a){return u.stackAlloc(a)};l.kd=function(){return u.stackSave()};l.jd=function(a){u.stackRestore(a)};var za=function(){function a(a,b){this.C=a|0;this.K=b|0}function b(a,b){a!=r&&("number"==typeof a?this.ea(a):b==r&&"string"!=typeof a?this.Q(a,256):this.Q(a,b))}function c(){return new b(r)}function d(a,b){var c=l[a.charCodeAt(b)];
-return c==r?-1:c}function e(a){var b=c();b.za(a);return b}function g(a){var b=1,c;if(0!=(c=a>>>16))a=c,b+=16;if(0!=(c=a>>8))a=c,b+=8;if(0!=(c=a>>4))a=c,b+=4;if(0!=(c=a>>2))a=c,b+=2;0!=a>>1&&(b+=1);return b}function h(a){this.R=a}function j(a){this.R=a;this.ke=a.Cf();this.le=this.ke&32767;this.Tf=this.ke>>15;this.pg=(1<<a.A-15)-1;this.Uf=2*a.g}a.zd={};a.za=function(b){if(-128<=b&&128>b){var c=a.zd[b];if(c)return c}c=new a(b|0,0>b?-1:0);-128<=b&&128>b&&(a.zd[b]=c);return c};a.ea=function(b){return isNaN(b)||
-!isFinite(b)?a.ZERO:b<=-a.Cd?a.MIN_VALUE:b+1>=a.Cd?a.MAX_VALUE:0>b?a.ea(-b).G():new a(b%a.va|0,b/a.va|0)};a.ra=function(b,c){return new a(b,c)};a.Q=function(b,c){0==b.length&&k(Error("number format error: empty string"));var d=c||10;(2>d||36<d)&&k(Error("radix out of range: "+d));if("-"==b.charAt(0))return a.Q(b.substring(1),d).G();0<=b.indexOf("-")&&k(Error('number format error: interior "-" character: '+b));for(var e=a.ea(Math.pow(d,8)),f=a.ZERO,g=0;g<b.length;g+=8){var i=Math.min(8,b.length-g),
-h=parseInt(b.substring(g,g+i),d);8>i?(i=a.ea(Math.pow(d,i)),f=f.multiply(i).add(a.ea(h))):(f=f.multiply(e),f=f.add(a.ea(h)))}return f};a.rc=65536;a.gi=16777216;a.va=a.rc*a.rc;a.hi=a.va/2;a.ii=a.va*a.rc;a.Te=a.va*a.va;a.Cd=a.Te/2;a.ZERO=a.za(0);a.ONE=a.za(1);a.Ad=a.za(-1);a.MAX_VALUE=a.ra(-1,2147483647);a.MIN_VALUE=a.ra(0,-2147483648);a.Bd=a.za(16777216);a.prototype.kc=function(){return this.K*a.va+this.uf()};a.prototype.toString=function(b){b=b||10;(2>b||36<b)&&k(Error("radix out of range: "+b));
-if(this.Ma())return"0";if(this.U()){if(this.ca(a.MIN_VALUE)){var c=a.ea(b),d=this.Ja(c),c=d.multiply(c).Eb(this);return d.toString(b)+c.C.toString(b)}return"-"+this.G().toString(b)}for(var d=a.ea(Math.pow(b,6)),c=this,e="";;){var f=c.Ja(d),g=c.Eb(f.multiply(d)).C.toString(b),c=f;if(c.Ma())return g+e;for(;6>g.length;)g="0"+g;e=""+g+e}};a.prototype.uf=function(){return 0<=this.C?this.C:a.va+this.C};a.prototype.Ma=function(){return 0==this.K&&0==this.C};a.prototype.U=function(){return 0>this.K};a.prototype.ge=
-function(){return 1==(this.C&1)};a.prototype.ca=function(a){return this.K==a.K&&this.C==a.C};a.prototype.ie=function(a){return 0>this.yc(a)};a.prototype.yf=function(a){return 0<this.yc(a)};a.prototype.zf=function(a){return 0<=this.yc(a)};a.prototype.yc=function(a){if(this.ca(a))return 0;var b=this.U(),c=a.U();return b&&!c?-1:!b&&c?1:this.Eb(a).U()?-1:1};a.prototype.G=function(){return this.ca(a.MIN_VALUE)?a.MIN_VALUE:this.Xf().add(a.ONE)};a.prototype.add=function(b){var c=this.K>>>16,d=this.K&65535,
-e=this.C>>>16,f=b.K>>>16,g=b.K&65535,i=b.C>>>16,h;h=0+((this.C&65535)+(b.C&65535));b=0+(h>>>16);b+=e+i;e=0+(b>>>16);e+=d+g;d=0+(e>>>16);d=d+(c+f)&65535;return a.ra((b&65535)<<16|h&65535,d<<16|e&65535)};a.prototype.Eb=function(a){return this.add(a.G())};a.prototype.multiply=function(b){if(this.Ma()||b.Ma())return a.ZERO;if(this.ca(a.MIN_VALUE))return b.ge()?a.MIN_VALUE:a.ZERO;if(b.ca(a.MIN_VALUE))return this.ge()?a.MIN_VALUE:a.ZERO;if(this.U())return b.U()?this.G().multiply(b.G()):this.G().multiply(b).G();
-if(b.U())return this.multiply(b.G()).G();if(this.ie(a.Bd)&&b.ie(a.Bd))return a.ea(this.kc()*b.kc());var c=this.K>>>16,d=this.K&65535,e=this.C>>>16,f=this.C&65535,g=b.K>>>16,i=b.K&65535,h=b.C>>>16,b=b.C&65535,j,l,m,n;n=0+f*b;m=0+(n>>>16);m+=e*b;l=0+(m>>>16);m=(m&65535)+f*h;l+=m>>>16;m&=65535;l+=d*b;j=0+(l>>>16);l=(l&65535)+e*h;j+=l>>>16;l&=65535;l+=f*i;j+=l>>>16;l&=65535;j=j+(c*b+d*h+e*i+f*g)&65535;return a.ra(m<<16|n&65535,j<<16|l)};a.prototype.Ja=function(b){b.Ma()&&k(Error("division by zero"));
-if(this.Ma())return a.ZERO;if(this.ca(a.MIN_VALUE)){if(b.ca(a.ONE)||b.ca(a.Ad))return a.MIN_VALUE;if(b.ca(a.MIN_VALUE))return a.ONE;var c=this.ng().Ja(b).shiftLeft(1);if(c.ca(a.ZERO))return b.U()?a.ONE:a.Ad;var d=this.Eb(b.multiply(c));return c.add(d.Ja(b))}if(b.ca(a.MIN_VALUE))return a.ZERO;if(this.U())return b.U()?this.G().Ja(b.G()):this.G().Ja(b).G();if(b.U())return this.Ja(b.G()).G();for(var e=a.ZERO,d=this;d.zf(b);){for(var c=Math.max(1,Math.floor(d.kc()/b.kc())),f=Math.ceil(Math.log(c)/Math.LN2),
-f=48>=f?1:Math.pow(2,f-48),g=a.ea(c),i=g.multiply(b);i.U()||i.yf(d);)c-=f,g=a.ea(c),i=g.multiply(b);g.Ma()&&(g=a.ONE);e=e.add(g);d=d.Eb(i)}return e};a.prototype.Xf=function(){return a.ra(~this.C,~this.K)};a.prototype.shiftLeft=function(b){b&=63;if(0==b)return this;var c=this.C;return 32>b?a.ra(c<<b,this.K<<b|c>>>32-b):a.ra(0,c<<b-32)};a.prototype.ng=function(){var b;b=1;if(0==b)return this;var c=this.K;return 32>b?a.ra(this.C>>>b|c<<32-b,c>>b):a.ra(c>>b-32,0<=c?0:-1)};b.prototype.Ga=function(a,b,
-c,d,e,f){for(;0<=--f;){var g=b*this[a++]+c[d]+e,e=Math.floor(g/67108864);c[d++]=g&67108863}return e};b.prototype.A=26;b.prototype.ha=67108863;b.prototype.X=67108864;b.prototype.Qe=Math.pow(2,52);b.prototype.xd=26;b.prototype.yd=0;var l=[],n,m;n=48;for(m=0;9>=m;++m)l[n++]=m;n=97;for(m=10;36>m;++m)l[n++]=m;n=65;for(m=10;36>m;++m)l[n++]=m;h.prototype.Id=function(a){return 0>a.p||0<=a.ya(this.R)?a.Pf(this.R):a};h.prototype.ve=function(a){return a};h.prototype.reduce=function(a){a.tb(this.R,r,a)};h.prototype.me=
-function(a,b,c){a.Vc(b,c);this.reduce(c)};h.prototype.ye=function(a,b){a.ze(b);this.reduce(b)};j.prototype.Id=function(a){var d=c();a.abs().Tb(this.R.g,d);d.tb(this.R,r,d);0>a.p&&0<d.ya(b.ZERO)&&this.R.W(d,d);return d};j.prototype.ve=function(a){var b=c();a.copyTo(b);this.reduce(b);return b};j.prototype.reduce=function(a){for(;a.g<=this.Uf;)a[a.g++]=0;for(var b=0;b<this.R.g;++b){var c=a[b]&32767,d=c*this.le+((c*this.Tf+(a[b]>>15)*this.le&this.pg)<<15)&a.ha,c=b+this.R.g;for(a[c]+=this.R.Ga(0,d,a,b,
-0,this.R.g);a[c]>=a.X;)a[c]-=a.X,a[++c]++}a.ia();a.Qd(this.R.g,a);0<=a.ya(this.R)&&a.W(this.R,a)};j.prototype.me=function(a,b,c){a.Vc(b,c);this.reduce(c)};j.prototype.ye=function(a,b){a.ze(b);this.reduce(b)};b.prototype.copyTo=function(a){for(var b=this.g-1;0<=b;--b)a[b]=this[b];a.g=this.g;a.p=this.p};b.prototype.za=function(a){this.g=1;this.p=0>a?-1:0;0<a?this[0]=a:-1>a?this[0]=a+DV:this.g=0};b.prototype.Q=function(a,c){var e;if(16==c)e=4;else if(8==c)e=3;else if(256==c)e=8;else if(2==c)e=1;else if(32==
-c)e=5;else if(4==c)e=2;else{this.rf(a,c);return}this.p=this.g=0;for(var g=a.length,i=G,h=0;0<=--g;){var j=8==e?a[g]&255:d(a,g);0>j?"-"==a.charAt(g)&&(i=q):(i=G,0==h?this[this.g++]=j:h+e>this.A?(this[this.g-1]|=(j&(1<<this.A-h)-1)<<h,this[this.g++]=j>>this.A-h):this[this.g-1]|=j<<h,h+=e,h>=this.A&&(h-=this.A))}8==e&&0!=(a[0]&128)&&(this.p=-1,0<h&&(this[this.g-1]|=(1<<this.A-h)-1<<h));this.ia();i&&b.ZERO.W(this,this)};b.prototype.ia=function(){for(var a=this.p&this.ha;0<this.g&&this[this.g-1]==a;)--this.g};
-b.prototype.Tb=function(a,b){var c;for(c=this.g-1;0<=c;--c)b[c+a]=this[c];for(c=a-1;0<=c;--c)b[c]=0;b.g=this.g+a;b.p=this.p};b.prototype.Qd=function(a,b){for(var c=a;c<this.g;++c)b[c-a]=this[c];b.g=Math.max(this.g-a,0);b.p=this.p};b.prototype.he=function(a,b){var c=a%this.A,d=this.A-c,e=(1<<d)-1,f=Math.floor(a/this.A),g=this.p<<c&this.ha,i;for(i=this.g-1;0<=i;--i)b[i+f+1]=this[i]>>d|g,g=(this[i]&e)<<c;for(i=f-1;0<=i;--i)b[i]=0;b[f]=g;b.g=this.g+f+1;b.p=this.p;b.ia()};b.prototype.cg=function(a,b){b.p=
-this.p;var c=Math.floor(a/this.A);if(c>=this.g)b.g=0;else{var d=a%this.A,e=this.A-d,f=(1<<d)-1;b[0]=this[c]>>d;for(var g=c+1;g<this.g;++g)b[g-c-1]|=(this[g]&f)<<e,b[g-c]=this[g]>>d;0<d&&(b[this.g-c-1]|=(this.p&f)<<e);b.g=this.g-c;b.ia()}};b.prototype.W=function(a,b){for(var c=0,d=0,e=Math.min(a.g,this.g);c<e;)d+=this[c]-a[c],b[c++]=d&this.ha,d>>=this.A;if(a.g<this.g){for(d-=a.p;c<this.g;)d+=this[c],b[c++]=d&this.ha,d>>=this.A;d+=this.p}else{for(d+=this.p;c<a.g;)d-=a[c],b[c++]=d&this.ha,d>>=this.A;
-d-=a.p}b.p=0>d?-1:0;-1>d?b[c++]=this.X+d:0<d&&(b[c++]=d);b.g=c;b.ia()};b.prototype.Vc=function(a,c){var d=this.abs(),e=a.abs(),f=d.g;for(c.g=f+e.g;0<=--f;)c[f]=0;for(f=0;f<e.g;++f)c[f+d.g]=d.Ga(0,e[f],c,f,0,d.g);c.p=0;c.ia();this.p!=a.p&&b.ZERO.W(c,c)};b.prototype.ze=function(a){for(var b=this.abs(),c=a.g=2*b.g;0<=--c;)a[c]=0;for(c=0;c<b.g-1;++c){var d=b.Ga(c,b[c],a,2*c,0,1);if((a[c+b.g]+=b.Ga(c+1,2*b[c],a,2*c+1,d,b.g-c-1))>=b.X)a[c+b.g]-=b.X,a[c+b.g+1]=1}0<a.g&&(a[a.g-1]+=b.Ga(c,b[c],a,2*c,0,1));
-a.p=0;a.ia()};b.prototype.tb=function(a,d,e){var f=a.abs();if(!(0>=f.g)){var h=this.abs();if(h.g<f.g)d!=r&&d.za(0),e!=r&&this.copyTo(e);else{e==r&&(e=c());var j=c(),l=this.p,a=a.p,m=this.A-g(f[f.g-1]);0<m?(f.he(m,j),h.he(m,e)):(f.copyTo(j),h.copyTo(e));f=j.g;h=j[f-1];if(0!=h){var n=h*(1<<this.xd)+(1<f?j[f-2]>>this.yd:0),s=this.Qe/n,n=(1<<this.xd)/n,u=1<<this.yd,t=e.g,x=t-f,v=d==r?c():d;j.Tb(x,v);0<=e.ya(v)&&(e[e.g++]=1,e.W(v,e));b.ONE.Tb(f,v);for(v.W(j,j);j.g<f;)j[j.g++]=0;for(;0<=--x;){var z=e[--t]==
-h?this.ha:Math.floor(e[t]*s+(e[t-1]+u)*n);if((e[t]+=j.Ga(0,z,e,x,0,f))<z){j.Tb(x,v);for(e.W(v,e);e[t]<--z;)e.W(v,e)}}d!=r&&(e.Qd(f,d),l!=a&&b.ZERO.W(d,d));e.g=f;e.ia();0<m&&e.cg(m,e);0>l&&b.ZERO.W(e,e)}}}};b.prototype.Cf=function(){if(1>this.g)return 0;var a=this[0];if(0==(a&1))return 0;var b=a&3,b=b*(2-(a&15)*b)&15,b=b*(2-(a&255)*b)&255,b=b*(2-((a&65535)*b&65535))&65535,b=b*(2-a*b%this.X)%this.X;return 0<b?this.X-b:-b};b.prototype.exp=function(a,d){if(4294967295<a||1>a)return b.ONE;var e=c(),f=c(),
-h=d.Id(this),j=g(a)-1;for(h.copyTo(e);0<=--j;)if(d.ye(e,f),0<(a&1<<j))d.me(f,h,e);else var l=e,e=f,f=l;return d.ve(e)};b.prototype.toString=function(a){if(0>this.p)return"-"+this.G().toString(a);if(16==a)a=4;else if(8==a)a=3;else if(2==a)a=1;else if(32==a)a=5;else if(4==a)a=2;else return this.og(a);var b=(1<<a)-1,c,d=G,e="",f=this.g,g=this.A-f*this.A%a;if(0<f--){if(g<this.A&&0<(c=this[f]>>g))d=q,e="0123456789abcdefghijklmnopqrstuvwxyz".charAt(c);for(;0<=f;)g<a?(c=(this[f]&(1<<g)-1)<<a-g,c|=this[--f]>>
-(g+=this.A-a)):(c=this[f]>>(g-=a)&b,0>=g&&(g+=this.A,--f)),0<c&&(d=q),d&&(e+="0123456789abcdefghijklmnopqrstuvwxyz".charAt(c))}return d?e:"0"};b.prototype.G=function(){var a=c();b.ZERO.W(this,a);return a};b.prototype.abs=function(){return 0>this.p?this.G():this};b.prototype.ya=function(a){var b=this.p-a.p;if(0!=b)return b;var c=this.g,b=c-a.g;if(0!=b)return 0>this.p?-b:b;for(;0<=--c;)if(0!=(b=this[c]-a[c]))return b;return 0};b.prototype.Pf=function(a){var d=c();this.abs().tb(a,r,d);0>this.p&&0<d.ya(b.ZERO)&&
-a.W(d,d);return d};b.ZERO=e(0);b.ONE=e(1);b.prototype.rf=function(a,c){this.za(0);c==r&&(c=10);for(var e=this.Ob(c),g=Math.pow(c,e),i=G,h=0,j=0,l=0;l<a.length;++l){var m=d(a,l);0>m?"-"==a.charAt(l)&&0==this.gd()&&(i=q):(j=c*j+m,++h>=e&&(this.Nd(g),this.Md(j),j=h=0))}0<h&&(this.Nd(Math.pow(c,h)),this.Md(j));i&&b.ZERO.W(this,this)};b.prototype.Ob=function(a){return Math.floor(Math.LN2*this.A/Math.log(a))};b.prototype.gd=function(){return 0>this.p?-1:0>=this.g||1==this.g&&0>=this[0]?0:1};b.prototype.Nd=
-function(a){this[this.g]=this.Ga(0,a-1,this,0,0,this.g);++this.g;this.ia()};b.prototype.Md=function(a){var b=0;if(0!=a){for(;this.g<=b;)this[this.g++]=0;for(this[b]+=a;this[b]>=this.X;)this[b]-=this.X,++b>=this.g&&(this[this.g++]=0),++this[b]}};b.prototype.og=function(a){a==r&&(a=10);if(0==this.gd()||2>a||36<a)return"0";var b=this.Ob(a),b=Math.pow(a,b),d=e(b),f=c(),g=c(),h="";for(this.tb(d,f,g);0<f.gd();)h=(b+g.fe()).toString(a).substr(1)+h,f.tb(d,f,g);return g.fe().toString(a)+h};b.prototype.fe=
-function(){if(0>this.p){if(1==this.g)return this[0]-this.X;if(0==this.g)return-1}else{if(1==this.g)return this[0];if(0==this.g)return 0}return(this[1]&(1<<32-this.A)-1)<<this.A|this[0]};b.prototype.sc=function(a,b){for(var c=0,d=0,e=Math.min(a.g,this.g);c<e;)d+=this[c]+a[c],b[c++]=d&this.ha,d>>=this.A;if(a.g<this.g){for(d+=a.p;c<this.g;)d+=this[c],b[c++]=d&this.ha,d>>=this.A;d+=this.p}else{for(d+=this.p;c<a.g;)d+=a[c],b[c++]=d&this.ha,d>>=this.A;d+=a.p}b.p=0>d?-1:0;0<d?b[c++]=d:-1>d&&(b[c++]=this.X+
-d);b.g=c;b.ia()};var s={abs:function(b,c){var d=new a(b,c),d=d.U()?d.G():d;t[sa>>2]=d.C;t[sa+4>>2]=d.K},Sd:function(){s.of||(s.of=q,s.Ce=new b,s.Ce.Q("4294967296",10),s.od=new b,s.od.Q("18446744073709551616",10),s.wj=new b,s.xj=new b)},Wi:function(a,c){var d=new b;d.Q(c.toString(),10);var e=new b;d.Vc(s.Ce,e);d=new b;d.Q(a.toString(),10);var f=new b;d.sc(e,f);return f},stringify:function(c,d,e){c=(new a(c,d)).toString();e&&"-"==c[0]&&(s.Sd(),e=new b,e.Q(c,10),c=new b,s.od.sc(e,c),c=c.toString(10));
-return c},Q:function(c,d,e,f,g){s.Sd();var h=new b;h.Q(c,d);c=new b;c.Q(e,10);e=new b;e.Q(f,10);g&&0>h.ya(b.ZERO)&&(f=new b,h.sc(s.od,f),h=f);f=G;0>h.ya(c)?(h=c,f=q):0<h.ya(e)&&(h=e,f=q);h=a.Q(h.toString());t[sa>>2]=h.C;t[sa+4>>2]=h.K;f&&k("range error")}};return s}();jb.prototype=Error();var Tb,Ta=r,xa=function b(){!e.calledRun&&mb&&kb();e.calledRun||(xa=b)};e.callMain=e.vi=function(b){function c(){for(var b=0;3>b;b++)g.push(0)}J(0==fa,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");
-J(0==cb.length,"cannot call main when preRun functions remain to be called");b=b||[];Wa&&Ta!==r&&e.ab("preload time: "+(Date.now()-Ta)+" ms");Sa||(Sa=q,qa(ka));var d=b.length+1,g=[D(V("/bin/this.program"),"i8",ja)];c();for(var i=0;i<d-1;i+=1)g.push(D(V(b[i]),"i8",ja)),c();g.push(0);g=D(g,"i32",ja);Tb=X;try{var h=e._main(d,g,0);e.noExitRuntime||Sb(h)}catch(j){j instanceof jb||("SimulateInfiniteLoop"==j?e.noExitRuntime=q:(j&&("object"===typeof j&&j.stack)&&e.ab("exception thrown: "+[j,j.stack]),k(j)))}finally{}};
-e.run=e.oj=kb;e.exit=e.Di=Sb;e.abort=e.abort=aa;if(e.preInit)for("function"==typeof e.preInit&&(e.preInit=[e.preInit]);0<e.preInit.length;)e.preInit.pop()();var mb=q;e.noInitialRun&&(mb=G);kb();return e.ccall("vizRenderFromString","string",["string","string","string"],[$a,ec,ab])};
-
diff --git a/pkg/analyzer/doc/support/web_app.dart.js b/pkg/analyzer/doc/support/web_app.dart.js
deleted file mode 100644
index 720a137..0000000
--- a/pkg/analyzer/doc/support/web_app.dart.js
+++ /dev/null
@@ -1,4107 +0,0 @@
-(function(){var supportsDirectProtoAccess=function(){var z=function(){}
-z.prototype={p:{}}
-var y=new z()
-return y.__proto__&&y.__proto__.p===z.prototype.p}()
-function map(a){a=Object.create(null)
-a.x=0
-delete a.x
-return a}var A=map()
-var B=map()
-var C=map()
-var D=map()
-var E=map()
-var F=map()
-var G=map()
-var H=map()
-var J=map()
-var K=map()
-var L=map()
-var M=map()
-var N=map()
-var O=map()
-var P=map()
-var Q=map()
-var R=map()
-var S=map()
-var T=map()
-var U=map()
-var V=map()
-var W=map()
-var X=map()
-var Y=map()
-var Z=map()
-function I(){}init()
-function setupProgram(a,b){"use strict"
-function generateAccessor(a9,b0,b1){var g=a9.split("-")
-var f=g[0]
-var e=f.length
-var d=f.charCodeAt(e-1)
-var c
-if(g.length>1)c=true
-else c=false
-d=d>=60&&d<=64?d-59:d>=123&&d<=126?d-117:d>=37&&d<=43?d-27:0
-if(d){var a0=d&3
-var a1=d>>2
-var a2=f=f.substring(0,e-1)
-var a3=f.indexOf(":")
-if(a3>0){a2=f.substring(0,a3)
-f=f.substring(a3+1)}if(a0){var a4=a0&2?"r":""
-var a5=a0&1?"this":"r"
-var a6="return "+a5+"."+f
-var a7=b1+".prototype.g"+a2+"="
-var a8="function("+a4+"){"+a6+"}"
-if(c)b0.push(a7+"$reflectable("+a8+");\n")
-else b0.push(a7+a8+";\n")}if(a1){var a4=a1&2?"r,v":"v"
-var a5=a1&1?"this":"r"
-var a6=a5+"."+f+"=v"
-var a7=b1+".prototype.s"+a2+"="
-var a8="function("+a4+"){"+a6+"}"
-if(c)b0.push(a7+"$reflectable("+a8+");\n")
-else b0.push(a7+a8+";\n")}}return f}function defineClass(a2,a3){var g=[]
-var f="function "+a2+"("
-var e=""
-var d=""
-for(var c=0;c<a3.length;c++){if(c!=0)f+=", "
-var a0=generateAccessor(a3[c],g,a2)
-d+="'"+a0+"',"
-var a1="p_"+a0
-f+=a1
-e+="this."+a0+" = "+a1+";\n"}if(supportsDirectProtoAccess)e+="this."+"$deferredAction"+"();"
-f+=") {\n"+e+"}\n"
-f+=a2+".builtin$cls=\""+a2+"\";\n"
-f+="$desc=$collectedClasses."+a2+"[1];\n"
-f+=a2+".prototype = $desc;\n"
-if(typeof defineClass.name!="string")f+=a2+".name=\""+a2+"\";\n"
-f+=a2+"."+"$__fields__"+"=["+d+"];\n"
-f+=g.join("")
-return f}init.createNewIsolate=function(){return new I()}
-init.classIdExtractor=function(c){return c.constructor.name}
-init.classFieldsExtractor=function(c){var g=c.constructor.$__fields__
-if(!g)return[]
-var f=[]
-f.length=g.length
-for(var e=0;e<g.length;e++)f[e]=c[g[e]]
-return f}
-init.instanceFromClassId=function(c){return new init.allClasses[c]()}
-init.initializeEmptyInstance=function(c,d,e){init.allClasses[c].apply(d,e)
-return d}
-var z=supportsDirectProtoAccess?function(c,d){var g=c.prototype
-g.__proto__=d.prototype
-g.constructor=c
-g["$is"+c.name]=c
-return convertToFastObject(g)}:function(){function tmp(){}return function(a0,a1){tmp.prototype=a1.prototype
-var g=new tmp()
-convertToSlowObject(g)
-var f=a0.prototype
-var e=Object.keys(f)
-for(var d=0;d<e.length;d++){var c=e[d]
-g[c]=f[c]}g["$is"+a0.name]=a0
-g.constructor=a0
-a0.prototype=g
-return g}}()
-function finishClasses(a4){var g=init.allClasses
-a4.combinedConstructorFunction+="return [\n"+a4.constructorsList.join(",\n  ")+"\n]"
-var f=new Function("$collectedClasses",a4.combinedConstructorFunction)(a4.collected)
-a4.combinedConstructorFunction=null
-for(var e=0;e<f.length;e++){var d=f[e]
-var c=d.name
-var a0=a4.collected[c]
-var a1=a0[0]
-a0=a0[1]
-g[c]=d
-a1[c]=d}f=null
-var a2=init.finishedClasses
-function finishClass(c1){if(a2[c1])return
-a2[c1]=true
-var a5=a4.pending[c1]
-if(a5&&a5.indexOf("+")>0){var a6=a5.split("+")
-a5=a6[0]
-var a7=a6[1]
-finishClass(a7)
-var a8=g[a7]
-var a9=a8.prototype
-var b0=g[c1].prototype
-var b1=Object.keys(a9)
-for(var b2=0;b2<b1.length;b2++){var b3=b1[b2]
-if(!u.call(b0,b3))b0[b3]=a9[b3]}}if(!a5||typeof a5!="string"){var b4=g[c1]
-var b5=b4.prototype
-b5.constructor=b4
-b5.$isMh=b4
-b5.$deferredAction=function(){}
-return}finishClass(a5)
-var b6=g[a5]
-if(!b6)b6=existingIsolateProperties[a5]
-var b4=g[c1]
-var b5=z(b4,b6)
-if(a9)b5.$deferredAction=mixinDeferredActionHelper(a9,b5)
-if(Object.prototype.hasOwnProperty.call(b5,"%")){var b7=b5["%"].split(";")
-if(b7[0]){var b8=b7[0].split("|")
-for(var b2=0;b2<b8.length;b2++){init.interceptorsByTag[b8[b2]]=b4
-init.leafTags[b8[b2]]=true}}if(b7[1]){b8=b7[1].split("|")
-if(b7[2]){var b9=b7[2].split("|")
-for(var b2=0;b2<b9.length;b2++){var c0=g[b9[b2]]
-c0.$nativeSuperclassTag=b8[0]}}for(b2=0;b2<b8.length;b2++){init.interceptorsByTag[b8[b2]]=b4
-init.leafTags[b8[b2]]=false}}b5.$deferredAction()}if(b5.$isvB)b5.$deferredAction()}var a3=Object.keys(a4.pending)
-for(var e=0;e<a3.length;e++)finishClass(a3[e])}function finishAddStubsHelper(){var g=this
-while(!g.hasOwnProperty("$deferredAction"))g=g.__proto__
-delete g.$deferredAction
-var f=Object.keys(g)
-for(var e=0;e<f.length;e++){var d=f[e]
-var c=d.charCodeAt(0)
-var a0
-if(d!=="^"&&d!=="$reflectable"&&c!==43&&c!==42&&(a0=g[d])!=null&&a0.constructor===Array&&d!=="<>")addStubs(g,a0,d,false,[])}convertToFastObject(g)
-g=g.__proto__
-g.$deferredAction()}function mixinDeferredActionHelper(c,d){var g
-if(d.hasOwnProperty("$deferredAction"))g=d.$deferredAction
-return function foo(){var f=this
-while(!f.hasOwnProperty("$deferredAction"))f=f.__proto__
-if(g)f.$deferredAction=g
-else{delete f.$deferredAction
-convertToFastObject(f)}c.$deferredAction()
-f.$deferredAction()}}function processClassData(b1,b2,b3){b2=convertToSlowObject(b2)
-var g
-var f=Object.keys(b2)
-var e=false
-var d=supportsDirectProtoAccess&&b1!="Mh"
-for(var c=0;c<f.length;c++){var a0=f[c]
-var a1=a0.charCodeAt(0)
-if(a0==="static"){processStatics(init.statics[b1]=b2.static,b3)
-delete b2.static}else if(a1===43){w[g]=a0.substring(1)
-var a2=b2[a0]
-if(a2>0)b2[g].$reflectable=a2}else if(a1===42){b2[g].$defaultValues=b2[a0]
-var a3=b2.$methodsWithOptionalArguments
-if(!a3)b2.$methodsWithOptionalArguments=a3={}
-a3[a0]=g}else{var a4=b2[a0]
-if(a0!=="^"&&a4!=null&&a4.constructor===Array&&a0!=="<>")if(d)e=true
-else addStubs(b2,a4,a0,false,[])
-else g=a0}}if(e)b2.$deferredAction=finishAddStubsHelper
-var a5=b2["^"],a6,a7,a8=a5
-var a9=a8.split(";")
-a8=a9[1]?a9[1].split(","):[]
-a7=a9[0]
-a6=a7.split(":")
-if(a6.length==2){a7=a6[0]
-var b0=a6[1]
-if(b0)b2.$signature=function(b4){return function(){return init.types[b4]}}(b0)}if(a7)b3.pending[b1]=a7
-b3.combinedConstructorFunction+=defineClass(b1,a8)
-b3.constructorsList.push(b1)
-b3.collected[b1]=[m,b2]
-i.push(b1)}function processStatics(a3,a4){var g=Object.keys(a3)
-for(var f=0;f<g.length;f++){var e=g[f]
-if(e==="^")continue
-var d=a3[e]
-var c=e.charCodeAt(0)
-var a0
-if(c===43){v[a0]=e.substring(1)
-var a1=a3[e]
-if(a1>0)a3[a0].$reflectable=a1
-if(d&&d.length)init.typeInformation[a0]=d}else if(c===42){m[a0].$defaultValues=d
-var a2=a3.$methodsWithOptionalArguments
-if(!a2)a3.$methodsWithOptionalArguments=a2={}
-a2[e]=a0}else if(typeof d==="function"){m[a0=e]=d
-h.push(e)
-init.globalFunctions[e]=d}else if(d.constructor===Array)addStubs(m,d,e,true,h)
-else{a0=e
-processClassData(e,d,a4)}}}function addStubs(b2,b3,b4,b5,b6){var g=0,f=b3[g],e
-if(typeof f=="string")e=b3[++g]
-else{e=f
-f=b4}var d=[b2[b4]=b2[f]=e]
-e.$stubName=b4
-b6.push(b4)
-for(g++;g<b3.length;g++){e=b3[g]
-if(typeof e!="function")break
-if(!b5)e.$stubName=b3[++g]
-d.push(e)
-if(e.$stubName){b2[e.$stubName]=e
-b6.push(e.$stubName)}}for(var c=0;c<d.length;g++,c++)d[c].$callName=b3[g]
-var a0=b3[g]
-b3=b3.slice(++g)
-var a1=b3[0]
-var a2=a1>>1
-var a3=(a1&1)===1
-var a4=a1===3
-var a5=a1===1
-var a6=b3[1]
-var a7=a6>>1
-var a8=(a6&1)===1
-var a9=a2+a7!=d[0].length
-var b0=b3[2]
-if(typeof b0=="number")b3[2]=b0+b
-var b1=2*a7+a2+3
-if(a0){e=tearOff(d,b3,b5,b4,a9)
-b2[b4].$getter=e
-e.$getterStub=true
-if(b5){init.globalFunctions[b4]=e
-b6.push(a0)}b2[a0]=e
-d.push(e)
-e.$stubName=a0
-e.$callName=null}}Function.prototype.$0=function(){return this()}
-Function.prototype.$1=function(c){return this(c)}
-Function.prototype.$2=function(c,d){return this(c,d)}
-Function.prototype.$4=function(c,d,e,f){return this(c,d,e,f)}
-Function.prototype.$3=function(c,d,e){return this(c,d,e)}
-function tearOffGetter(c,d,e,f){return f?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+e+y+++"(x) {"+"if (c === null) c = "+"H.qm"+"("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(c,d,e,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+e+y+++"() {"+"if (c === null) c = "+"H.qm"+"("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(c,d,e,H,null)}function tearOff(c,d,e,f,a0){var g
-return e?function(){if(g===void 0)g=H.qm(this,c,d,true,[],f).prototype
-return g}:tearOffGetter(c,d,f,a0)}var y=0
-if(!init.libraries)init.libraries=[]
-if(!init.mangledNames)init.mangledNames=map()
-if(!init.mangledGlobalNames)init.mangledGlobalNames=map()
-if(!init.statics)init.statics=map()
-if(!init.typeInformation)init.typeInformation=map()
-if(!init.globalFunctions)init.globalFunctions=map()
-var x=init.libraries
-var w=init.mangledNames
-var v=init.mangledGlobalNames
-var u=Object.prototype.hasOwnProperty
-var t=a.length
-var s=map()
-s.collected=map()
-s.pending=map()
-s.constructorsList=[]
-s.combinedConstructorFunction="function $reflectable(fn){fn.$reflectable=1;return fn};\n"+"var $desc;\n"
-for(var r=0;r<t;r++){var q=a[r]
-var p=q[0]
-var o=q[1]
-var n=q[2]
-var m=q[3]
-var l=q[4]
-var k=!!q[5]
-var j=l&&l["^"]
-if(j instanceof Array)j=j[0]
-var i=[]
-var h=[]
-processStatics(l,s)
-x.push([p,o,i,h,n,j,k,m])}finishClasses(s)}I.HU=function(){}
-var dart=[["","",,H,{"^":"",FK:{"^":"Mh;a"}}],["","",,J,{"^":"",
-v:function(a){return void 0},
-Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-m:function(a){var z,y,x,w
-z=a[init.dispatchPropertyName]
-if(z==null)if($.M==null){H.u()
-z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
-if(!1===y)return z.i
-if(!0===y)return a
-x=Object.getPrototypeOf(a)
-if(y===x)return z.i
-if(z.e===x)throw H.b(new P.D("Return interceptor for "+H.d(y(a,z))))}w=H.w(a)
-if(w==null){if(typeof a=="function")return C.DG
-y=Object.getPrototypeOf(a)
-if(y==null||y===Object.prototype)return C.ZQ
-else return C.vB}return w},
-vB:{"^":"Mh;",
-D:function(a,b){return a===b},
-gM:function(a){return H.wP(a)},
-w:["UG",function(a){return H.H(a)}],
-"%":"ANGLEInstancedArrays|Animation|AnimationEffect|AnimationNode|AnimationTimeline|AudioListener|AudioParam|AudioTrack|BarProp|Body|CSS|Cache|CacheStorage|Canvas2DContextAttributes|CanvasGradient|CanvasPattern|CanvasRenderingContext2D|CircularGeofencingRegion|ConsoleBase|Coordinates|Counter|Credential|CredentialsContainer|Crypto|CryptoKey|DOMError|DOMFileSystem|DOMFileSystemSync|DOMImplementation|DOMMatrix|DOMMatrixReadOnly|DOMParser|DOMPoint|DOMPointReadOnly|DataTransfer|Database|DeprecatedStorageInfo|DeprecatedStorageQuota|DeviceAcceleration|DeviceRotationRate|DirectoryEntrySync|DirectoryReader|DirectoryReaderSync|EXTBlendMinMax|EXTFragDepth|EXTShaderTextureLOD|EXTTextureFilterAnisotropic|EntrySync|FederatedCredential|FileEntrySync|FileError|FileReaderSync|FileWriterSync|FormData|GamepadButton|Geofencing|GeofencingRegion|Geolocation|Geoposition|HTMLAllCollection|IDBCursor|IDBCursorWithValue|IDBFactory|IDBKeyRange|IDBObjectStore|ImageBitmap|ImageData|InjectedScriptHost|LocalCredential|MIDIInputMap|MIDIOutputMap|MediaDeviceInfo|MediaError|MediaKeyError|MediaKeys|MemoryInfo|MessageChannel|Metadata|MutationObserver|MutationRecord|NavigatorUserMediaError|NodeFilter|NodeIterator|OESElementIndexUint|OESStandardDerivatives|OESTextureFloat|OESTextureFloatLinear|OESTextureHalfFloat|OESTextureHalfFloatLinear|OESVertexArrayObject|PagePopupController|PerformanceEntry|PerformanceMark|PerformanceMeasure|PerformanceNavigation|PerformanceResourceTiming|PerformanceTiming|PeriodicWave|PositionError|PushManager|PushRegistration|RGBColor|RTCIceCandidate|RTCSessionDescription|RTCStatsResponse|Range|ReadableStream|Rect|Request|Response|SQLError|SQLResultSet|SQLTransaction|SVGAngle|SVGAnimatedAngle|SVGAnimatedBoolean|SVGAnimatedEnumeration|SVGAnimatedInteger|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedPreserveAspectRatio|SVGAnimatedRect|SVGAnimatedString|SVGAnimatedTransformList|SVGMatrix|SVGPoint|SVGPreserveAspectRatio|SVGRect|SVGRenderingIntent|SVGUnitTypes|Screen|Selection|ServiceWorkerClient|ServiceWorkerClients|ServiceWorkerContainer|SourceInfo|SpeechRecognitionAlternative|SpeechSynthesisVoice|StorageInfo|StorageQuota|Stream|StyleMedia|SubtleCrypto|TextMetrics|Timing|TreeWalker|VTTRegion|ValidityState|VideoPlaybackQuality|VideoTrack|WebGLActiveInfo|WebGLBuffer|WebGLCompressedTextureATC|WebGLCompressedTextureETC1|WebGLCompressedTexturePVRTC|WebGLCompressedTextureS3TC|WebGLContextAttributes|WebGLDebugRendererInfo|WebGLDebugShaders|WebGLDepthTexture|WebGLDrawBuffers|WebGLExtensionLoseContext|WebGLFramebuffer|WebGLLoseContext|WebGLProgram|WebGLRenderbuffer|WebGLRenderingContext|WebGLShader|WebGLShaderPrecisionFormat|WebGLTexture|WebGLUniformLocation|WebGLVertexArrayObjectOES|WebKitCSSMatrix|WebKitMutationObserver|WorkerConsole|WorkerPerformance|XMLSerializer|XPathEvaluator|XPathExpression|XPathNSResolver|XPathResult|XSLTProcessor|mozRTCIceCandidate|mozRTCSessionDescription"},
-yE:{"^":"vB;",
-w:function(a){return String(a)},
-gM:function(a){return a?519018:218159},
-$isa2:1},
-PE:{"^":"vB;",
-D:function(a,b){return null==b},
-w:function(a){return"null"},
-gM:function(a){return 0}},
-Ue:{"^":"vB;",
-gM:function(a){return 0},
-w:["tk",function(a){return String(a)}],
-$isvm:1},
-iC:{"^":"Ue;"},
-k:{"^":"Ue;"},
-c5:{"^":"Ue;",
-w:function(a){var z=a[$.$get$fa()]
-return z==null?this.tk(a):J.A(z)}},
-jd:{"^":"vB;",
-uy:function(a,b){if(!!a.immutable$list)throw H.b(new P.ub(b))},
-PP:function(a,b){if(!!a.fixed$length)throw H.b(new P.ub(b))},
-FV:function(a,b){var z
-this.PP(a,"addAll")
-for(z=0;z<2;++z)a.push(b[z])},
-U:function(a,b){var z,y
-z=a.length
-for(y=0;y<z;++y){b.$1(a[y])
-if(a.length!==z)throw H.b(new P.UV(a))}},
-ez:function(a,b){return H.VM(new H.A8(a,b),[null,null])},
-W:function(a,b){return a[b]},
-gtH:function(a){if(a.length>0)return a[0]
-throw H.b(H.Wp())},
-YW:function(a,b,c,d,e){var z,y
-this.uy(a,"set range")
-P.jB(b,c,a.length,null,null,null)
-z=c-b
-if(z===0)return
-if(e<0)H.vh(P.TE(e,0,null,"skipCount",null))
-if(e+z>d.length)throw H.b(H.ar())
-if(e<b)for(y=z-1;y>=0;--y)a[b+y]=d[e+y]
-else for(y=0;y<z;++y)a[b+y]=d[e+y]},
-Vr:function(a,b){var z,y
-z=a.length
-for(y=0;y<z;++y){if(b.$1(a[y]))return!0
-if(a.length!==z)throw H.b(new P.UV(a))}return!1},
-tg:function(a,b){var z
-for(z=0;z<a.length;++z)if(J.RM(a[z],b))return!0
-return!1},
-w:function(a){return P.WE(a,"[","]")},
-gk:function(a){return new J.m1(a,a.length,0,null)},
-gM:function(a){return H.wP(a)},
-gA:function(a){return a.length},
-sA:function(a,b){this.PP(a,"set length")
-if(b<0)throw H.b(P.TE(b,0,null,"newLength",null))
-a.length=b},
-q:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(H.HY(a,b))
-if(b>=a.length||b<0)throw H.b(H.HY(a,b))
-return a[b]},
-t:function(a,b,c){this.uy(a,"indexed set")
-if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(H.HY(a,b))
-if(b>=a.length||b<0)throw H.b(H.HY(a,b))
-a[b]=c},
-$isDD:1,
-$iszM:1,
-$aszM:null,
-$isqC:1},
-Po:{"^":"jd;"},
-m1:{"^":"Mh;a,b,c,d",
-gl:function(){return this.d},
-F:function(){var z,y,x
-z=this.a
-y=z.length
-if(this.b!==y)throw H.b(H.lk(z))
-x=this.c
-if(x>=y){this.d=null
-return!1}this.d=z[x]
-this.c=x+1
-return!0}},
-jX:{"^":"vB;",
-JV:function(a,b){return a%b},
-yu:function(a){var z
-if(a>=-2147483648&&a<=2147483647)return a|0
-if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
-return z+0}throw H.b(new P.ub(""+a))},
-w:function(a){if(a===0&&1/a<0)return"-0.0"
-else return""+a},
-gM:function(a){return a&0x1FFFFFFF},
-BU:function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},
-wG:function(a,b){var z
-if(a>0)z=b>31?0:a>>>b
-else{z=b>31?31:b
-z=a>>z>>>0}return z},
-B:function(a,b){if(typeof b!=="number")throw H.b(H.G(b))
-return a<b},
-$islf:1},
-im:{"^":"jX;",$islf:1,$isKN:1},
-VA:{"^":"jX;",$islf:1},
-Dr:{"^":"vB;",
-J:function(a,b){if(b<0)throw H.b(H.HY(a,b))
-if(b>=a.length)throw H.b(H.HY(a,b))
-return a.charCodeAt(b)},
-Qi:function(a,b,c){var z
-H.fI(c)
-if(c>a.length)throw H.b(P.TE(c,0,a.length,null,null))
-z=c+b.length
-if(z>a.length)return!1
-return b===a.substring(c,z)},
-nC:function(a,b){return this.Qi(a,b,0)},
-C:function(a,b,c){if(c==null)c=a.length
-if(typeof c!=="number"||Math.floor(c)!==c)H.vh(H.G(c))
-if(b<0)throw H.b(P.F(b,null,null))
-if(b>c)throw H.b(P.F(b,null,null))
-if(c>a.length)throw H.b(P.F(c,null,null))
-return a.substring(b,c)},
-G:function(a,b){return this.C(a,b,null)},
-hc:function(a){return a.toLowerCase()},
-bS:function(a){var z,y,x,w,v
-z=a.trim()
-y=z.length
-if(y===0)return z
-if(this.J(z,0)===133){x=J.mm(z,1)
-if(x===y)return""}else x=0
-w=y-1
-v=this.J(z,w)===133?J.r9(z,w):y
-if(x===0&&v===y)return z
-return z.substring(x,v)},
-w:function(a){return a},
-gM:function(a){var z,y,x
-for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
-y=536870911&y+((524287&y)<<10>>>0)
-y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
-y^=y>>11
-return 536870911&y+((16383&y)<<15>>>0)},
-gA:function(a){return a.length},
-q:function(a,b){if(b>=a.length||!1)throw H.b(H.HY(a,b))
-return a[b]},
-$isDD:1,
-$isqU:1,
-static:{
-Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
-default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},
-mm:function(a,b){var z,y
-for(z=a.length;b<z;){y=C.xB.J(a,b)
-if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},
-r9:function(a,b){var z,y
-for(;b>0;b=z){z=b-1
-y=C.xB.J(a,z)
-if(y!==32&&y!==13&&!J.Ga(y))break}return b}}}}],["","",,H,{"^":"",
-zd:function(a,b){var z=a.v(b)
-if(!init.globalState.d.cy)init.globalState.f.bL()
-return z},
-Rq:function(a,b){var z,y,x,w,v,u
-z={}
-z.a=b
-if(b==null){b=[]
-z.a=b
-y=b}else y=b
-if(!J.v(y).$iszM)throw H.b(P.q("Arguments to main must be a List: "+H.d(y)))
-init.globalState=new H.O2(0,0,1,null,null,null,null,null,null,null,null,null,a)
-y=init.globalState
-x=self.window==null
-w=self.Worker
-v=x&&!!self.postMessage
-y.x=v
-v=!v
-if(v)w=w!=null&&$.$get$Kb()!=null
-else w=!0
-y.y=w
-y.r=x&&v
-y.f=new H.cC(P.NZ(null,H.IY),0)
-y.z=H.VM(new H.N5(0,null,null,null,null,null,0),[P.KN,H.aX])
-y.ch=H.VM(new H.N5(0,null,null,null,null,null,0),[P.KN,null])
-if(y.x){x=new H.JH()
-y.Q=x
-self.onmessage=function(c,d){return function(e){c(d,e)}}(H.Mg,x)
-self.dartPrint=self.dartPrint||function(c){return function(d){if(self.console&&self.console.log)self.console.log(d)
-else self.postMessage(c(d))}}(H.wI)}if(init.globalState.x)return
-y=init.globalState.a++
-x=H.VM(new H.N5(0,null,null,null,null,null,0),[P.KN,H.yo])
-w=P.Ls(null,null,null,P.KN)
-v=new H.yo(0,null,!1)
-u=new H.aX(y,x,w,init.createNewIsolate(),v,new H.ku(H.Uh()),new H.ku(H.Uh()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-w.AN(0,0)
-u.co(0,v)
-init.globalState.e=u
-init.globalState.d=u
-y=H.N7()
-x=H.KT(y,[y]).Zg(a)
-if(x)u.v(new H.PK(z,a))
-else{y=H.KT(y,[y,y]).Zg(a)
-if(y)u.v(new H.JO(z,a))
-else u.v(a)}init.globalState.f.bL()},
-yl:function(){var z=init.currentScript
-if(z!=null)return String(z.src)
-if(init.globalState.x)return H.mf()
-return},
-mf:function(){var z,y
-z=new Error().stack
-if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
-if(z==null)throw H.b(new P.ub("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
-if(y!=null)return y[1]
-y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
-if(y!=null)return y[1]
-throw H.b(new P.ub('Cannot extract URI from "'+H.d(z)+'"'))},
-Mg:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=new H.fP(!0,[]).QS(b.data)
-y=J.U6(z)
-switch(y.q(z,"command")){case"start":init.globalState.b=y.q(z,"id")
-x=y.q(z,"functionName")
-w=x==null?init.globalState.cx:init.globalFunctions[x]()
-v=y.q(z,"args")
-u=new H.fP(!0,[]).QS(y.q(z,"msg"))
-t=y.q(z,"isSpawnUri")
-s=y.q(z,"startPaused")
-r=new H.fP(!0,[]).QS(y.q(z,"replyTo"))
-y=init.globalState.a++
-q=H.VM(new H.N5(0,null,null,null,null,null,0),[P.KN,H.yo])
-p=P.Ls(null,null,null,P.KN)
-o=new H.yo(0,null,!1)
-n=new H.aX(y,q,p,init.createNewIsolate(),o,new H.ku(H.Uh()),new H.ku(H.Uh()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-p.AN(0,0)
-n.co(0,o)
-init.globalState.f.a.B7(0,new H.IY(n,new H.jl(w,v,u,t,s,r),"worker-start"))
-init.globalState.d=n
-init.globalState.f.bL()
-break
-case"spawn-worker":break
-case"message":if(y.q(z,"port")!=null)J.TT(y.q(z,"port"),y.q(z,"msg"))
-init.globalState.f.bL()
-break
-case"close":init.globalState.ch.Rz(0,$.$get$jp().q(0,a))
-a.terminate()
-init.globalState.f.bL()
-break
-case"log":H.VL(y.q(z,"msg"))
-break
-case"print":if(init.globalState.x){y=init.globalState.Q
-q=P.Td(["command","print","msg",z])
-q=new H.jP(!0,P.E8(null,P.KN)).a3(q)
-y.toString
-self.postMessage(q)}else P.JS(y.q(z,"msg"))
-break
-case"error":throw H.b(y.q(z,"msg"))}},
-VL:function(a){var z,y,x,w
-if(init.globalState.x){y=init.globalState.Q
-x=P.Td(["command","log","msg",a])
-x=new H.jP(!0,P.E8(null,P.KN)).a3(x)
-y.toString
-self.postMessage(x)}else try{self.console.log(a)}catch(w){H.p(w)
-z=H.ts(w)
-throw H.b(P.FM(z))}},
-Z7:function(a,b,c,d,e,f){var z,y,x,w
-z=init.globalState.d
-y=z.a
-$.te=$.te+("_"+y)
-$.eb=$.eb+("_"+y)
-y=z.e
-x=init.globalState.d.a
-w=z.f
-f.wR(0,["spawned",new H.JM(y,x),w,z.r])
-x=new H.Vg(a,b,c,d,z)
-if(e){z.v8(w,w)
-init.globalState.f.a.B7(0,new H.IY(z,x,"start isolate"))}else x.$0()},
-Gx:function(a){return new H.fP(!0,[]).QS(new H.jP(!1,P.E8(null,P.KN)).a3(a))},
-PK:{"^":"L:0;a,b",
-$0:function(){this.b.$1(this.a.a)}},
-JO:{"^":"L:0;a,b",
-$0:function(){this.b.$2(this.a.a,null)}},
-O2:{"^":"Mh;a,b,c,d,e,f,r,x,y,z,Q,ch,cx",static:{
-wI:function(a){var z=P.Td(["command","print","msg",a])
-return new H.jP(!0,P.E8(null,P.KN)).a3(z)}}},
-aX:{"^":"Mh;a,b,c,En:d<,EE:e<,f,r,x,y,z,Q,ch,cx,cy,db,dx",
-v8:function(a,b){if(!this.f.D(0,a))return
-if(this.Q.AN(0,b)&&!this.y)this.y=!0
-this.Wp()},
-cK:function(a){var z,y,x,w,v
-if(!this.y)return
-z=this.Q
-z.Rz(0,a)
-if(z.a===0){for(z=this.z;z.length!==0;){y=z.pop()
-x=init.globalState.f.a
-w=x.b
-v=x.a
-w=(w-1&v.length-1)>>>0
-x.b=w
-v[w]=y
-if(w===x.c)x.wL();++x.d}this.y=!1}this.Wp()},
-h4:function(a,b){var z,y,x
-if(this.ch==null)this.ch=[]
-for(z=J.v(a),y=0;x=this.ch,y<x.length;y+=2)if(z.D(a,x[y])){this.ch[y+1]=b
-return}x.push(a)
-this.ch.push(b)},
-Hh:function(a){var z,y,x
-if(this.ch==null)return
-for(z=J.v(a),y=0;x=this.ch,y<x.length;y+=2)if(z.D(a,x[y])){z=this.ch
-x=y+2
-z.toString
-if(typeof z!=="object"||z===null||!!z.fixed$length)H.vh(new P.ub("removeRange"))
-P.jB(y,x,z.length,null,null,null)
-z.splice(y,x-y)
-return}},
-MZ:function(a,b){if(!this.r.D(0,a))return
-this.db=b},
-l7:function(a,b,c){var z
-if(b!==0)z=b===1&&!this.cy
-else z=!0
-if(z){a.wR(0,c)
-return}z=this.cx
-if(z==null){z=P.NZ(null,null)
-this.cx=z}z.B7(0,new H.NY(a,c))},
-bc:function(a,b){var z
-if(!this.r.D(0,a))return
-if(b!==0)z=b===1&&!this.cy
-else z=!0
-if(z){this.Dm()
-return}z=this.cx
-if(z==null){z=P.NZ(null,null)
-this.cx=z}z.B7(0,this.gIm())},
-hk:function(a,b){var z,y,x
-z=this.dx
-if(z.a===0){if(this.db&&this===init.globalState.e)return
-if(self.console&&self.console.error)self.console.error(a,b)
-else{P.JS(a)
-if(b!=null)P.JS(b)}return}y=new Array(2)
-y.fixed$length=Array
-y[0]=J.A(a)
-y[1]=b==null?null:b.w(0)
-for(x=new P.lm(z,z.r,null,null),x.c=z.e;x.F();)x.d.wR(0,y)},
-v:function(a){var z,y,x,w,v,u,t
-z=init.globalState.d
-init.globalState.d=this
-$=this.d
-y=null
-x=this.cy
-this.cy=!0
-try{y=a.$0()}catch(u){t=H.p(u)
-w=t
-v=H.ts(u)
-this.hk(w,v)
-if(this.db){this.Dm()
-if(this===init.globalState.e)throw u}}finally{this.cy=x
-init.globalState.d=z
-if(z!=null)$=z.gEn()
-if(this.cx!=null)for(;t=this.cx,!t.gl0(t);)this.cx.Ux().$0()}return y},
-Zt:function(a){return this.b.q(0,a)},
-co:function(a,b){var z=this.b
-if(z.x4(0,a))throw H.b(P.FM("Registry: ports must be registered only once."))
-z.t(0,a,b)},
-Wp:function(){var z=this.b
-if(z.gA(z)-this.c.a>0||this.y||!this.x)init.globalState.z.t(0,this.a,this)
-else this.Dm()},
-Dm:[function(){var z,y,x
-z=this.cx
-if(z!=null)z.V1(0)
-for(z=this.b,y=z.gUQ(z),y=y.gk(y);y.F();)y.gl().EC()
-z.V1(0)
-this.c.V1(0)
-init.globalState.z.Rz(0,this.a)
-this.dx.V1(0)
-if(this.ch!=null){for(x=0;z=this.ch,x<z.length;x+=2)z[x].wR(0,z[x+1])
-this.ch=null}},"$0","gIm",0,0,2]},
-NY:{"^":"L:2;a,b",
-$0:function(){this.a.wR(0,this.b)}},
-cC:{"^":"Mh;a,b",
-Jc:function(){var z=this.a
-if(z.b===z.c)return
-return z.Ux()},
-xB:function(){var z,y,x
-z=this.Jc()
-if(z==null){if(init.globalState.e!=null)if(init.globalState.z.x4(0,init.globalState.e.a))if(init.globalState.r){y=init.globalState.e.b
-y=y.gl0(y)}else y=!1
-else y=!1
-else y=!1
-if(y)H.vh(P.FM("Program exited with open ReceivePorts."))
-y=init.globalState
-if(y.x){x=y.z
-x=x.gl0(x)&&y.f.b===0}else x=!1
-if(x){y=y.Q
-x=P.Td(["command","close"])
-x=new H.jP(!0,H.VM(new P.ey(0,null,null,null,null,null,0),[null,P.KN])).a3(x)
-y.toString
-self.postMessage(x)}return!1}z.VU()
-return!0},
-Ex:function(){if(self.window!=null)new H.RA(this).$0()
-else for(;this.xB(););},
-bL:function(){var z,y,x,w,v
-if(!init.globalState.x)this.Ex()
-else try{this.Ex()}catch(x){w=H.p(x)
-z=w
-y=H.ts(x)
-w=init.globalState.Q
-v=P.Td(["command","error","msg",H.d(z)+"\n"+H.d(y)])
-v=new H.jP(!0,P.E8(null,P.KN)).a3(v)
-w.toString
-self.postMessage(v)}}},
-RA:{"^":"L:2;a",
-$0:function(){if(!this.a.xB())return
-P.ww(C.RT,this)}},
-IY:{"^":"Mh;a,b,c",
-VU:function(){var z=this.a
-if(z.y){z.z.push(this)
-return}z.v(this.b)}},
-JH:{"^":"Mh;"},
-jl:{"^":"L:0;a,b,c,d,e,f",
-$0:function(){H.Z7(this.a,this.b,this.c,this.d,this.e,this.f)}},
-Vg:{"^":"L:2;a,b,c,d,e",
-$0:function(){var z,y,x,w
-z=this.e
-z.x=!0
-if(!this.d)this.a.$1(this.c)
-else{y=this.a
-x=H.N7()
-w=H.KT(x,[x,x]).Zg(y)
-if(w)y.$2(this.b,this.c)
-else{x=H.KT(x,[x]).Zg(y)
-if(x)y.$1(this.b)
-else y.$0()}}z.Wp()}},
-Iy:{"^":"Mh;"},
-JM:{"^":"Iy;b,a",
-wR:function(a,b){var z,y,x,w
-z=init.globalState.z.q(0,this.a)
-if(z==null)return
-y=this.b
-if(y.c)return
-x=H.Gx(b)
-if(z.gEE()===y){y=J.U6(x)
-switch(y.q(x,0)){case"pause":z.v8(y.q(x,1),y.q(x,2))
-break
-case"resume":z.cK(y.q(x,1))
-break
-case"add-ondone":z.h4(y.q(x,1),y.q(x,2))
-break
-case"remove-ondone":z.Hh(y.q(x,1))
-break
-case"set-errors-fatal":z.MZ(y.q(x,1),y.q(x,2))
-break
-case"ping":z.l7(y.q(x,1),y.q(x,2),y.q(x,3))
-break
-case"kill":z.bc(y.q(x,1),y.q(x,2))
-break
-case"getErrors":y=y.q(x,1)
-z.dx.AN(0,y)
-break
-case"stopErrors":y=y.q(x,1)
-z.dx.Rz(0,y)
-break}return}y=init.globalState.f
-w="receive "+H.d(b)
-y.a.B7(0,new H.IY(z,new H.Ua(this,x),w))},
-D:function(a,b){var z,y
-if(b==null)return!1
-if(b instanceof H.JM){z=this.b
-y=b.b
-y=z==null?y==null:z===y
-z=y}else z=!1
-return z},
-gM:function(a){return this.b.a}},
-Ua:{"^":"L:0;a,b",
-$0:function(){var z=this.a.b
-if(!z.c)z.z6(0,this.b)}},
-ns:{"^":"Iy;b,c,a",
-wR:function(a,b){var z,y,x
-z=P.Td(["command","message","port",this,"msg",b])
-y=new H.jP(!0,P.E8(null,P.KN)).a3(z)
-if(init.globalState.x){init.globalState.Q.toString
-self.postMessage(y)}else{x=init.globalState.ch.q(0,this.b)
-if(x!=null)x.postMessage(y)}},
-D:function(a,b){var z,y
-if(b==null)return!1
-if(b instanceof H.ns){z=this.b
-y=b.b
-if(z==null?y==null:z===y){z=this.a
-y=b.a
-if(z==null?y==null:z===y){z=this.c
-y=b.c
-y=z==null?y==null:z===y
-z=y}else z=!1}else z=!1}else z=!1
-return z},
-gM:function(a){return(this.b<<16^this.a<<8^this.c)>>>0}},
-yo:{"^":"Mh;a,b,c",
-EC:function(){this.c=!0
-this.b=null},
-z6:function(a,b){if(this.c)return
-this.mY(b)},
-mY:function(a){return this.b.$1(a)},
-$isaL:1},
-yH:{"^":"Mh;a,b,c",
-Qa:function(a,b){var z,y
-if(a===0)z=self.setTimeout==null||init.globalState.x
-else z=!1
-if(z){this.c=1
-z=init.globalState.f
-y=init.globalState.d
-z.a.B7(0,new H.IY(y,new H.FA(this,b),"timer"))
-this.b=!0}else if(self.setTimeout!=null){++init.globalState.f.b
-this.c=self.setTimeout(H.tR(new H.Av(this,b),0),a)}else throw H.b(new P.ub("Timer greater than 0."))},
-static:{
-cy:function(a,b){var z=new H.yH(!0,!1,null)
-z.Qa(a,b)
-return z}}},
-FA:{"^":"L:2;a,b",
-$0:function(){this.a.c=null
-this.b.$0()}},
-Av:{"^":"L:2;a,b",
-$0:function(){this.a.c=null;--init.globalState.f.b
-this.b.$0()}},
-ku:{"^":"Mh;a",
-gM:function(a){var z=this.a
-z=C.jn.wG(z,0)^C.jn.BU(z,4294967296)
-z=(~z>>>0)+(z<<15>>>0)&4294967295
-z=((z^z>>>12)>>>0)*5&4294967295
-z=((z^z>>>4)>>>0)*2057&4294967295
-return(z^z>>>16)>>>0},
-D:function(a,b){var z,y
-if(b==null)return!1
-if(b===this)return!0
-if(b instanceof H.ku){z=this.a
-y=b.a
-return z==null?y==null:z===y}return!1}},
-jP:{"^":"Mh;a,b",
-a3:[function(a){var z,y,x,w,v
-if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
-z=this.b
-y=z.q(0,a)
-if(y!=null)return["ref",y]
-z.t(0,a,z.gA(z))
-z=J.v(a)
-if(!!z.$isWZ)return["buffer",a]
-if(!!z.$isET)return["typed",a]
-if(!!z.$isDD)return this.BE(a)
-if(!!z.$isym){x=this.gpC()
-w=z.gvc(a)
-w=H.K1(w,x,H.W8(w,"cX",0),null)
-w=P.PW(w,!0,H.W8(w,"cX",0))
-z=z.gUQ(a)
-z=H.K1(z,x,H.W8(z,"cX",0),null)
-return["map",w,P.PW(z,!0,H.W8(z,"cX",0))]}if(!!z.$isvm)return this.xw(a)
-if(!!z.$isvB)this.jf(a)
-if(!!z.$isaL)this.kz(a,"RawReceivePorts can't be transmitted:")
-if(!!z.$isJM)return this.PE(a)
-if(!!z.$isns)return this.ff(a)
-if(!!z.$isL){v=a.$static_name
-if(v==null)this.kz(a,"Closures can't be transmitted:")
-return["function",v]}if(!!z.$isku)return["capability",a.a]
-if(!(a instanceof P.Mh))this.jf(a)
-return["dart",init.classIdExtractor(a),this.jG(init.classFieldsExtractor(a))]},"$1","gpC",2,0,1],
-kz:function(a,b){throw H.b(new P.ub(H.d(b==null?"Can't transmit:":b)+" "+H.d(a)))},
-jf:function(a){return this.kz(a,null)},
-BE:function(a){var z=this.dY(a)
-if(!!a.fixed$length)return["fixed",z]
-if(!a.fixed$length)return["extendable",z]
-if(!a.immutable$list)return["mutable",z]
-if(a.constructor===Array)return["const",z]
-this.kz(a,"Can't serialize indexable: ")},
-dY:function(a){var z,y
-z=[]
-C.Nm.sA(z,a.length)
-for(y=0;y<a.length;++y)z[y]=this.a3(a[y])
-return z},
-jG:function(a){var z
-for(z=0;z<a.length;++z)C.Nm.t(a,z,this.a3(a[z]))
-return a},
-xw:function(a){var z,y,x
-if(!!a.constructor&&a.constructor!==Object)this.kz(a,"Only plain JS Objects are supported:")
-z=Object.keys(a)
-y=[]
-C.Nm.sA(y,z.length)
-for(x=0;x<z.length;++x)y[x]=this.a3(a[z[x]])
-return["js-object",z,y]},
-ff:function(a){if(this.a)return["sendport",a.b,a.a,a.c]
-return["raw sendport",a]},
-PE:function(a){if(this.a)return["sendport",init.globalState.b,a.a,a.b.a]
-return["raw sendport",a]}},
-fP:{"^":"Mh;a,b",
-QS:[function(a){var z,y,x,w,v
-if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
-if(typeof a!=="object"||a===null||a.constructor!==Array)throw H.b(P.q("Bad serialized message: "+H.d(a)))
-switch(C.Nm.gtH(a)){case"ref":return this.b[a[1]]
-case"buffer":z=a[1]
-this.b.push(z)
-return z
-case"typed":z=a[1]
-this.b.push(z)
-return z
-case"fixed":z=a[1]
-this.b.push(z)
-y=H.VM(this.NB(z),[null])
-y.fixed$length=Array
-return y
-case"extendable":z=a[1]
-this.b.push(z)
-return H.VM(this.NB(z),[null])
-case"mutable":z=a[1]
-this.b.push(z)
-return this.NB(z)
-case"const":z=a[1]
-this.b.push(z)
-y=H.VM(this.NB(z),[null])
-y.fixed$length=Array
-return y
-case"map":return this.di(a)
-case"sendport":return this.Vf(a)
-case"raw sendport":z=a[1]
-this.b.push(z)
-return z
-case"js-object":return this.ZQ(a)
-case"function":z=init.globalFunctions[a[1]]()
-this.b.push(z)
-return z
-case"capability":return new H.ku(a[1])
-case"dart":x=a[1]
-w=a[2]
-v=init.instanceFromClassId(x)
-this.b.push(v)
-this.NB(w)
-return init.initializeEmptyInstance(x,v,w)
-default:throw H.b("couldn't deserialize: "+H.d(a))}},"$1","gia",2,0,1],
-NB:function(a){var z
-for(z=0;z<a.length;++z)C.Nm.t(a,z,this.QS(a[z]))
-return a},
-di:function(a){var z,y,x,w,v
-z=a[1]
-y=a[2]
-x=P.u5()
-this.b.push(x)
-z=J.iu(z,this.gia()).br(0)
-for(w=J.U6(y),v=0;v<z.length;++v)x.t(0,z[v],this.QS(w.q(y,v)))
-return x},
-Vf:function(a){var z,y,x,w,v,u,t
-z=a[1]
-y=a[2]
-x=a[3]
-w=init.globalState.b
-if(z==null?w==null:z===w){v=init.globalState.z.q(0,y)
-if(v==null)return
-u=v.Zt(x)
-if(u==null)return
-t=new H.JM(u,y)}else t=new H.ns(z,x,y)
-this.b.push(t)
-return t},
-ZQ:function(a){var z,y,x,w,v,u
-z=a[1]
-y=a[2]
-x={}
-this.b.push(x)
-for(w=J.U6(z),v=J.U6(y),u=0;u<w.gA(z);++u)x[w.q(z,u)]=this.QS(v.q(y,u))
-return x}}}],["","",,H,{"^":"",
-e:function(a){return init.types[a]},
-wV:function(a,b){var z
-if(b!=null){z=b.x
-if(z!=null)return z}return!!J.v(a).$isXj},
-d:function(a){var z
-if(typeof a==="string")return a
-if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
-else if(!1===a)return"false"
-else if(a==null)return"null"
-z=J.A(a)
-if(typeof z!=="string")throw H.b(H.G(a))
-return z},
-wP:function(a){var z=a.$identityHash
-if(z==null){z=Math.random()*0x3fffffff|0
-a.$identityHash=z}return z},
-l:function(a){var z,y,x,w,v,u,t,s
-z=J.v(a)
-y=z.constructor
-if(typeof y=="function"){x=y.name
-w=typeof x==="string"?x:null}else w=null
-if(w==null||z===C.Ok||!!J.v(a).$isk){v=C.w2(a)
-if(v==="Object"){u=a.constructor
-if(typeof u=="function"){t=String(u).match(/^\s*function\s*([\w$]*)\s*\(/)
-s=t==null?null:t[1]
-if(typeof s==="string"&&/^\w+$/.test(s))w=s}if(w==null)w=v}else w=v}w=w
-if(w.length>1&&C.xB.J(w,0)===36)w=C.xB.G(w,1)
-return function(b,c){return b.replace(/[^<,> ]+/g,function(d){return c[d]||d})}(w+H.i(H.j(a),0,null),init.mangledGlobalNames)},
-H:function(a){return"Instance of '"+H.l(a)+"'"},
-VK:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(H.G(a))
-return a[b]},
-aw:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(H.G(a))
-a[b]=c},
-HY:function(a,b){var z
-if(typeof b!=="number"||Math.floor(b)!==b)return new P.AT(!0,b,"index",null)
-z=J.Hm(a)
-if(b<0||b>=z)return P.Cf(b,a,"index",null,z)
-return P.F(b,"index",null)},
-G:function(a){return new P.AT(!0,a,null,null)},
-fI:function(a){return a},
-Yx:function(a){return a},
-b:function(a){var z
-if(a==null)a=new P.B()
-z=new Error()
-z.dartException=a
-if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.J})
-z.name=""}else z.toString=H.J
-return z},
-J:function(){return J.A(this.dartException)},
-vh:function(a){throw H.b(a)},
-lk:function(a){throw H.b(new P.UV(a))},
-p:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
-z=new H.Hk(a)
-if(a==null)return
-if(typeof a!=="object")return a
-if("dartException" in a)return z.$1(a.dartException)
-else if(!("message" in a))return a
-y=a.message
-if("number" in a&&typeof a.number=="number"){x=a.number
-w=x&65535
-if((C.jn.wG(x,16)&8191)===10)switch(w){case 438:return z.$1(H.T3(H.d(y)+" (Error "+w+")",null))
-case 445:case 5007:v=H.d(y)+" (Error "+w+")"
-return z.$1(new H.ZQ(v,null))}}if(a instanceof TypeError){u=$.$get$U2()
-t=$.$get$k1()
-s=$.$get$Re()
-r=$.$get$fN()
-q=$.$get$qi()
-p=$.$get$rZ()
-o=$.$get$BX()
-$.$get$tt()
-n=$.$get$dt()
-m=$.$get$A7()
-l=u.qS(y)
-if(l!=null)return z.$1(H.T3(y,l))
-else{l=t.qS(y)
-if(l!=null){l.method="call"
-return z.$1(H.T3(y,l))}else{l=s.qS(y)
-if(l==null){l=r.qS(y)
-if(l==null){l=q.qS(y)
-if(l==null){l=p.qS(y)
-if(l==null){l=o.qS(y)
-if(l==null){l=r.qS(y)
-if(l==null){l=n.qS(y)
-if(l==null){l=m.qS(y)
-v=l!=null}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0
-if(v)return z.$1(new H.ZQ(y,l==null?null:l.method))}}return z.$1(new H.vV(typeof y==="string"?y:""))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.VS()
-y=function(b){try{return String(b)}catch(k){}return null}(a)
-return z.$1(new P.AT(!1,null,null,typeof y==="string"?y.replace(/^RangeError:\s*/,""):y))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.VS()
-return a},
-ts:function(a){var z
-if(a==null)return new H.XO(a,null)
-z=a.$cachedTrace
-if(z!=null)return z
-return a.$cachedTrace=new H.XO(a,null)},
-CU:function(a){if(a==null||typeof a!='object')return J.hf(a)
-else return H.wP(a)},
-B7:function(a,b){var z,y,x,w
-z=a.length
-for(y=0;y<z;y=w){x=y+1
-w=x+1
-b.t(0,a[y],a[x])}return b},
-ft:function(a,b,c,d,e,f,g){switch(c){case 0:return H.zd(b,new H.dr(a))
-case 1:return H.zd(b,new H.TL(a,d))
-case 2:return H.zd(b,new H.KX(a,d,e))
-case 3:return H.zd(b,new H.uZ(a,d,e,f))
-case 4:return H.zd(b,new H.OQ(a,d,e,f,g))}throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},
-tR:function(a,b){var z
-if(a==null)return
-z=a.$identity
-if(!!z)return z
-z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.d,H.ft)
-a.$identity=z
-return z},
-iA:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=b[0]
-y=z.$callName
-if(!!J.v(c).$iszM){z.$reflectionInfo=c
-x=H.I(z).r}else x=c
-w=d?Object.create(new H.zx().constructor.prototype):Object.create(new H.rT(null,null,null,null).constructor.prototype)
-w.$initialize=w.constructor
-if(d)v=function(){this.$initialize()}
-else{u=$.yj
-$.yj=u+1
-u=new Function("a,b,c,d","this.$initialize(a,b,c,d);"+u)
-v=u}w.constructor=v
-v.prototype=w
-u=!d
-if(u){t=e.length==1&&!0
-s=H.bx(a,z,t)
-s.$reflectionInfo=c}else{w.$static_name=f
-s=z
-t=!1}if(typeof x=="number")r=function(g,h){return function(){return g(h)}}(H.e,x)
-else if(u&&typeof x=="function"){q=t?H.yS:H.DV
-r=function(g,h){return function(){return g.apply({$receiver:h(this)},arguments)}}(x,q)}else throw H.b("Error in reflectionInfo.")
-w.$signature=r
-w[y]=s
-for(u=b.length,p=1;p<u;++p){o=b[p]
-n=o.$callName
-if(n!=null){m=d?o:H.bx(a,o,t)
-w[n]=m}}w["call*"]=s
-w.$requiredArgCount=z.$requiredArgCount
-w.$defaultValues=z.$defaultValues
-return v},
-vq:function(a,b,c,d){var z=H.DV
-switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
-case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
-case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
-case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
-case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
-case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
-default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
-bx:function(a,b,c){var z,y,x,w,v,u
-if(c)return H.Hf(a,b)
-z=b.$stubName
-y=b.length
-x=a[z]
-w=b==null?x==null:b===x
-v=!w||y>=27
-if(v)return H.vq(y,!w,z,b)
-if(y===0){w=$.mJ
-if(w==null){w=H.E2("self")
-$.mJ=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
-v=$.yj
-$.yj=v+1
-return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
-w="return function("+u+"){return this."
-v=$.mJ
-if(v==null){v=H.E2("self")
-$.mJ=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
-w=$.yj
-$.yj=w+1
-return new Function(v+H.d(w)+"}")()},
-Z4:function(a,b,c,d){var z,y
-z=H.DV
-y=H.yS
-switch(b?-1:a){case 0:throw H.b(new H.Eq("Intercepted function with no arguments."))
-case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
-case 2:return function(e,f,g){return function(h){return f(this)[e](g(this),h)}}(c,z,y)
-case 3:return function(e,f,g){return function(h,i){return f(this)[e](g(this),h,i)}}(c,z,y)
-case 4:return function(e,f,g){return function(h,i,j){return f(this)[e](g(this),h,i,j)}}(c,z,y)
-case 5:return function(e,f,g){return function(h,i,j,k){return f(this)[e](g(this),h,i,j,k)}}(c,z,y)
-case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
-default:return function(e,f,g,h){return function(){h=[g(this)]
-Array.prototype.push.apply(h,arguments)
-return e.apply(f(this),h)}}(d,z,y)}},
-Hf:function(a,b){var z,y,x,w,v,u,t,s
-z=H.oN()
-y=$.P4
-if(y==null){y=H.E2("receiver")
-$.P4=y}x=b.$stubName
-w=b.length
-v=a[x]
-u=b==null?v==null:b===v
-t=!u||w>=28
-if(t)return H.Z4(w,!u,x,b)
-if(w===1){y="return function(){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+");"
-u=$.yj
-$.yj=u+1
-return new Function(y+H.d(u)+"}")()}s="abcdefghijklmnopqrstuvwxyz".split("").splice(0,w-1).join(",")
-y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
-u=$.yj
-$.yj=u+1
-return new Function(y+H.d(u)+"}")()},
-qm:function(a,b,c,d,e,f){var z
-b.fixed$length=Array
-if(!!J.v(c).$iszM){c.fixed$length=Array
-z=c}else z=c
-return H.iA(a,b,z,!!d,e,f)},
-SE:function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.l(a),z.C(b,3,z.gA(b))))},
-Go:function(a,b){var z
-if(a!=null)z=(typeof a==="object"||typeof a==="function")&&J.v(a)[b]
-else z=!0
-if(z)return a
-H.SE(a,b)},
-eQ:function(a){throw H.b(new P.t7("Cyclic initialization for static "+H.d(a)))},
-KT:function(a,b,c){return new H.tD(a,b,c,null)},
-N7:function(){return C.KZ},
-Uh:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
-VM:function(a,b){a.$builtinTypeInfo=b
-return a},
-j:function(a){if(a==null)return
-return a.$builtinTypeInfo},
-IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.j(a))},
-W8:function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},
-Kp:function(a,b){var z=H.j(a)
-return z==null?null:z[b]},
-Ko:function(a,b){if(a==null)return"dynamic"
-else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.i(a,1,b)
-else if(typeof a=="function")return a.builtin$cls
-else if(typeof a==="number"&&Math.floor(a)===a)return C.jn.w(a)
-else return},
-i:function(a,b,c){var z,y,x,w,v,u
-if(a==null)return""
-z=new P.Rn("")
-for(y=b,x=!0,w=!0,v="";y<a.length;++y){if(x)x=!1
-else z.a=v+", "
-u=a[y]
-if(u!=null)w=!1
-v=z.a+=H.d(H.Ko(u,c))}return w?"":"<"+H.d(z)+">"},
-Y9:function(a,b){if(typeof a=="function"){a=a.apply(null,b)
-if(a==null)return a
-if(typeof a==="object"&&a!==null&&a.constructor===Array)return a
-if(typeof a=="function")return a.apply(null,b)}return b},
-hv:function(a,b){var z,y
-if(a==null||b==null)return!0
-z=a.length
-for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},
-IG:function(a,b,c){return a.apply(b,H.IM(b,c))},
-t1:function(a,b){var z,y,x,w,v
-if(a===b)return!0
-if(a==null||b==null)return!0
-if('func' in b)return H.Ly(a,b)
-if('func' in a)return b.builtin$cls==="EH"
-z=typeof a==="object"&&a!==null&&a.constructor===Array
-y=z?a[0]:a
-x=typeof b==="object"&&b!==null&&b.constructor===Array
-w=x?b[0]:b
-if(w!==y){if(!('$is'+H.Ko(w,null) in y.prototype))return!1
-v=y.prototype["$as"+H.d(H.Ko(w,null))]}else v=null
-if(!z&&v==null||!x)return!0
-z=z?a.slice(1):null
-x=x?b.slice(1):null
-return H.hv(H.Y9(v,z),x)},
-Hc:function(a,b,c){var z,y,x,w,v
-z=b==null
-if(z&&a==null)return!0
-if(z)return c
-if(a==null)return!1
-y=a.length
-x=b.length
-if(c){if(y<x)return!1}else if(y!==x)return!1
-for(w=0;w<x;++w){z=a[w]
-v=b[w]
-if(!(H.t1(z,v)||H.t1(v,z)))return!1}return!0},
-Vt:function(a,b){var z,y,x,w,v,u
-if(b==null)return!0
-if(a==null)return!1
-z=Object.getOwnPropertyNames(b)
-z.fixed$length=Array
-y=z
-for(z=y.length,x=0;x<z;++x){w=y[x]
-if(!Object.hasOwnProperty.call(a,w))return!1
-v=b[w]
-u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
-Ly:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
-if(!('func' in a))return!1
-if("v" in a){if(!("v" in b)&&"ret" in b)return!1}else if(!("v" in b)){z=a.ret
-y=b.ret
-if(!(H.t1(z,y)||H.t1(y,z)))return!1}x=a.args
-w=b.args
-v=a.opt
-u=b.opt
-t=x!=null?x.length:0
-s=w!=null?w.length:0
-r=v!=null?v.length:0
-q=u!=null?u.length:0
-if(t>s)return!1
-if(t+r<s+q)return!1
-if(t===s){if(!H.Hc(x,w,!1))return!1
-if(!H.Hc(v,u,!0))return!1}else{for(p=0;p<t;++p){o=x[p]
-n=w[p]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=p,l=0;m<s;++l,++m){o=v[l]
-n=w[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
-n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
-F3:function(a){var z=$.n
-return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
-kE:function(a){return H.wP(a)},
-iw:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
-w:function(a){var z,y,x,w,v,u
-z=$.n.$1(a)
-y=$.z[z]
-if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}x=$.a[z]
-if(x!=null)return x
-w=init.interceptorsByTag[z]
-if(w==null){z=$.c.$2(a,z)
-if(z!=null){y=$.z[z]
-if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}x=$.a[z]
-if(x!=null)return x
-w=init.interceptorsByTag[z]}}if(w==null)return
-x=w.prototype
-v=z[0]
-if(v==="!"){y=H.C(x)
-$.z[z]=y
-Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}if(v==="~"){$.a[z]=x
-return x}if(v==="-"){u=H.C(x)
-Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}if(v==="+")return H.Lc(a,x)
-if(v==="*")throw H.b(new P.D(z))
-if(init.leafTags[z]===true){u=H.C(x)
-Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}else return H.Lc(a,x)},
-Lc:function(a,b){var z=Object.getPrototypeOf(a)
-Object.defineProperty(z,init.dispatchPropertyName,{value:J.Qu(b,z,null,null),enumerable:false,writable:true,configurable:true})
-return b},
-C:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
-VF:function(a,b,c){var z=b.prototype
-if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},
-u:function(){if(!0===$.M)return
-$.M=!0
-H.Z1()},
-Z1:function(){var z,y,x,w,v,u,t,s
-$.z=Object.create(null)
-$.a=Object.create(null)
-H.f()
-z=init.interceptorsByTag
-y=Object.getOwnPropertyNames(z)
-if(typeof window!="undefined"){window
-x=function(){}
-for(w=0;w<y.length;++w){v=y[w]
-u=$.x7.$1(v)
-if(u!=null){t=H.VF(v,z[v],u)
-if(t!=null){Object.defineProperty(u,init.dispatchPropertyName,{value:t,enumerable:false,writable:true,configurable:true})
-x.prototype=u}}}}for(w=0;w<y.length;++w){v=y[w]
-if(/^[A-Za-z_]/.test(v)){s=z[v]
-z["!"+v]=s
-z["~"+v]=s
-z["-"+v]=s
-z["+"+v]=s
-z["*"+v]=s}}},
-f:function(){var z,y,x,w,v,u,t
-z=C.M1()
-z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.Jh,H.ud(C.lR,H.ud(C.ur(C.w2),z)))))))
-if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
-if(typeof y=="function")y=[y]
-if(y.constructor==Array)for(x=0;x<y.length;++x){w=y[x]
-if(typeof w=="function")z=w(z)||z}}v=z.getTag
-u=z.getUnknownTag
-t=z.prototypeForTag
-$.n=new H.y(v)
-$.c=new H.dC(u)
-$.x7=new H.wN(t)},
-ud:function(a,b){return a(b)||b},
-FD:{"^":"Mh;a,b,c,d,e,f,r,x",static:{
-I:function(a){var z,y,x
-z=a.$reflectionInfo
-if(z==null)return
-z.fixed$length=Array
-z=z
-y=z[0]
-x=z[1]
-return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
-Zr:{"^":"Mh;a,b,c,d,e,f",
-qS:function(a){var z,y,x
-z=new RegExp(this.a).exec(a)
-if(z==null)return
-y=Object.create(null)
-x=this.b
-if(x!==-1)y.arguments=z[x+1]
-x=this.c
-if(x!==-1)y.argumentsExpr=z[x+1]
-x=this.d
-if(x!==-1)y.expr=z[x+1]
-x=this.e
-if(x!==-1)y.method=z[x+1]
-x=this.f
-if(x!==-1)y.receiver=z[x+1]
-return y},
-static:{
-cM:function(a){var z,y,x,w,v,u
-a=a.replace(String({}),'$receiver$').replace(/[[\]{}()*+?.\\^$|]/g,"\\$&")
-z=a.match(/\\\$[a-zA-Z]+\\\$/g)
-if(z==null)z=[]
-y=z.indexOf("\\$arguments\\$")
-x=z.indexOf("\\$argumentsExpr\\$")
-w=z.indexOf("\\$expr\\$")
-v=z.indexOf("\\$method\\$")
-u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},
-S7:function(a){return function($expr$){var $argumentsExpr$='$arguments$'
-try{$expr$.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},
-Mj:function(a){return function($expr$){try{$expr$.$method$}catch(z){return z.message}}(a)}}},
-ZQ:{"^":"Ge;a,b",
-w:function(a){var z=this.b
-if(z==null)return"NullError: "+H.d(this.a)
-return"NullError: method not found: '"+H.d(z)+"' on null"}},
-az:{"^":"Ge;a,b,c",
-w:function(a){var z,y
-z=this.b
-if(z==null)return"NoSuchMethodError: "+H.d(this.a)
-y=this.c
-if(y==null)return"NoSuchMethodError: method not found: '"+H.d(z)+"' ("+H.d(this.a)+")"
-return"NoSuchMethodError: method not found: '"+H.d(z)+"' on '"+H.d(y)+"' ("+H.d(this.a)+")"},
-static:{
-T3:function(a,b){var z,y
-z=b==null
-y=z?null:b.method
-return new H.az(a,y,z?null:b.receiver)}}},
-vV:{"^":"Ge;a",
-w:function(a){var z=this.a
-return z.length===0?"Error":"Error: "+z}},
-Hk:{"^":"L:1;a",
-$1:function(a){if(!!J.v(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a}},
-XO:{"^":"Mh;a,b",
-w:function(a){var z,y
-z=this.b
-if(z!=null)return z
-z=this.a
-y=z!==null&&typeof z==="object"?z.stack:null
-z=y==null?"":y
-this.b=z
-return z}},
-dr:{"^":"L:0;a",
-$0:function(){return this.a.$0()}},
-TL:{"^":"L:0;a,b",
-$0:function(){return this.a.$1(this.b)}},
-KX:{"^":"L:0;a,b,c",
-$0:function(){return this.a.$2(this.b,this.c)}},
-uZ:{"^":"L:0;a,b,c,d",
-$0:function(){return this.a.$3(this.b,this.c,this.d)}},
-OQ:{"^":"L:0;a,b,c,d,e",
-$0:function(){return this.a.$4(this.b,this.c,this.d,this.e)}},
-L:{"^":"Mh;",
-w:function(a){return"Closure '"+H.l(this)+"'"},
-gQl:function(){return this},
-gQl:function(){return this}},
-Bp:{"^":"L;"},
-zx:{"^":"Bp;",
-w:function(a){var z=this.$static_name
-if(z==null)return"Closure of unknown static method"
-return"Closure '"+z+"'"}},
-rT:{"^":"Bp;a,b,c,d",
-D:function(a,b){if(b==null)return!1
-if(this===b)return!0
-if(!(b instanceof H.rT))return!1
-return this.a===b.a&&this.b===b.b&&this.c===b.c},
-gM:function(a){var z,y
-z=this.c
-if(z==null)y=H.wP(this.a)
-else y=typeof z!=="object"?J.hf(z):H.wP(z)
-return(y^H.wP(this.b))>>>0},
-w:function(a){var z=this.c
-if(z==null)z=this.a
-return"Closure '"+H.d(this.d)+"' of "+H.H(z)},
-static:{
-DV:function(a){return a.a},
-yS:function(a){return a.c},
-oN:function(){var z=$.mJ
-if(z==null){z=H.E2("self")
-$.mJ=z}return z},
-E2:function(a){var z,y,x,w,v
-z=new H.rT("self","target","receiver","name")
-y=Object.getOwnPropertyNames(z)
-y.fixed$length=Array
-x=y
-for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}}}},
-Pe:{"^":"Ge;a",
-w:function(a){return this.a},
-static:{
-aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
-Eq:{"^":"Ge;a",
-w:function(a){return"RuntimeError: "+H.d(this.a)}},
-lb:{"^":"Mh;"},
-tD:{"^":"lb;a,b,c,d",
-Zg:function(a){var z=this.LC(a)
-return z==null?!1:H.Ly(z,this.za())},
-LC:function(a){var z=J.v(a)
-return"$signature" in z?z.$signature():null},
-za:function(){var z,y,x,w,v,u,t
-z={func:"dynafunc"}
-y=this.a
-x=J.v(y)
-if(!!x.$isnr)z.v=true
-else if(!x.$ishJ)z.ret=y.za()
-y=this.b
-if(y!=null&&y.length!==0)z.args=H.Dz(y)
-y=this.c
-if(y!=null&&y.length!==0)z.opt=H.Dz(y)
-y=this.d
-if(y!=null){w=Object.create(null)
-v=H.kU(y)
-for(x=v.length,u=0;u<x;++u){t=v[u]
-w[t]=y[t].za()}z.named=w}return z},
-w:function(a){var z,y,x,w,v,u,t,s
-z=this.b
-if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
-if(w)x+=", "
-x+=J.A(u)}else{x="("
-w=!1}z=this.c
-if(z!=null&&z.length!==0){x=(w?x+", ":x)+"["
-for(y=z.length,w=!1,v=0;v<y;++v,w=!0){u=z[v]
-if(w)x+=", "
-x+=J.A(u)}x+="]"}else{z=this.d
-if(z!=null){x=(w?x+", ":x)+"{"
-t=H.kU(z)
-for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
-if(w)x+=", "
-x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+J.A(this.a))},
-static:{
-Dz:function(a){var z,y,x
-a=a
-z=[]
-for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z}}},
-hJ:{"^":"lb;",
-w:function(a){return"dynamic"},
-za:function(){return}},
-N5:{"^":"Mh;a,b,c,d,e,f,r",
-gA:function(a){return this.a},
-gl0:function(a){return this.a===0},
-gvc:function(a){return H.VM(new H.i5(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(this.gvc(this),new H.Mw(this),H.Kp(this,0),H.Kp(this,1))},
-x4:function(a,b){var z,y
-if(typeof b==="string"){z=this.b
-if(z==null)return!1
-return this.Xu(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.c
-if(y==null)return!1
-return this.Xu(y,b)}else return this.CX(b)},
-CX:function(a){var z=this.d
-if(z==null)return!1
-return this.X(this.i(z,this.xi(a)),a)>=0},
-q:function(a,b){var z,y,x
-if(typeof b==="string"){z=this.b
-if(z==null)return
-y=this.i(z,b)
-return y==null?null:y.b}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.c
-if(x==null)return
-y=this.i(x,b)
-return y==null?null:y.b}else return this.aa(b)},
-aa:function(a){var z,y,x
-z=this.d
-if(z==null)return
-y=this.i(z,this.xi(a))
-x=this.X(y,a)
-if(x<0)return
-return y[x].b},
-t:function(a,b,c){var z,y,x,w,v,u
-if(typeof b==="string"){z=this.b
-if(z==null){z=this.j()
-this.b=z}this.m(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.c
-if(y==null){y=this.j()
-this.c=y}this.m(y,b,c)}else{x=this.d
-if(x==null){x=this.j()
-this.d=x}w=this.xi(b)
-v=this.i(x,w)
-if(v==null)this.n(x,w,[this.Y(b,c)])
-else{u=this.X(v,b)
-if(u>=0)v[u].b=c
-else v.push(this.Y(b,c))}}},
-Rz:function(a,b){if(typeof b==="string")return this.Vz(this.b,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Vz(this.c,b)
-else return this.WM(b)},
-WM:function(a){var z,y,x,w
-z=this.d
-if(z==null)return
-y=this.i(z,this.xi(a))
-x=this.X(y,a)
-if(x<0)return
-w=y.splice(x,1)[0]
-this.Yp(w)
-return w.b},
-V1:function(a){if(this.a>0){this.f=null
-this.e=null
-this.d=null
-this.c=null
-this.b=null
-this.a=0
-this.r=this.r+1&67108863}},
-U:function(a,b){var z,y
-z=this.e
-y=this.r
-for(;z!=null;){b.$2(z.a,z.b)
-if(y!==this.r)throw H.b(new P.UV(this))
-z=z.c}},
-m:function(a,b,c){var z=this.i(a,b)
-if(z==null)this.n(a,b,this.Y(b,c))
-else z.b=c},
-Vz:function(a,b){var z
-if(a==null)return
-z=this.i(a,b)
-if(z==null)return
-this.Yp(z)
-this.R(a,b)
-return z.b},
-Y:function(a,b){var z,y
-z=new H.db(a,b,null,null)
-if(this.e==null){this.f=z
-this.e=z}else{y=this.f
-z.d=y
-y.c=z
-this.f=z}++this.a
-this.r=this.r+1&67108863
-return z},
-Yp:function(a){var z,y
-z=a.d
-y=a.c
-if(z==null)this.e=y
-else z.c=y
-if(y==null)this.f=z
-else y.d=z;--this.a
-this.r=this.r+1&67108863},
-xi:function(a){return J.hf(a)&0x3ffffff},
-X:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;++y)if(J.RM(a[y].a,b))return y
-return-1},
-w:function(a){return P.vW(this)},
-i:function(a,b){return a[b]},
-n:function(a,b,c){a[b]=c},
-R:function(a,b){delete a[b]},
-Xu:function(a,b){return this.i(a,b)!=null},
-j:function(){var z=Object.create(null)
-this.n(z,"<non-identifier-key>",z)
-this.R(z,"<non-identifier-key>")
-return z},
-$isym:1},
-Mw:{"^":"L:1;a",
-$1:function(a){return this.a.q(0,a)}},
-db:{"^":"Mh;a,b,c,d"},
-i5:{"^":"cX;a",
-gA:function(a){return this.a.a},
-gk:function(a){var z,y
-z=this.a
-y=new H.N6(z,z.r,null,null)
-y.c=z.e
-return y},
-U:function(a,b){var z,y,x
-z=this.a
-y=z.e
-x=z.r
-for(;y!=null;){b.$1(y.a)
-if(x!==z.r)throw H.b(new P.UV(z))
-y=y.c}},
-$isqC:1},
-N6:{"^":"Mh;a,b,c,d",
-gl:function(){return this.d},
-F:function(){var z=this.a
-if(this.b!==z.r)throw H.b(new P.UV(z))
-else{z=this.c
-if(z==null){this.d=null
-return!1}else{this.d=z.a
-this.c=z.c
-return!0}}}},
-y:{"^":"L:1;a",
-$1:function(a){return this.a(a)}},
-dC:{"^":"L:8;a",
-$2:function(a,b){return this.a(a,b)}},
-wN:{"^":"L:9;a",
-$1:function(a){return this.a(a)}},
-VR:{"^":"Mh;a,b,c,d",
-w:function(a){return"RegExp/"+this.a+"/"},
-static:{
-v4:function(a,b,c,d){var z,y,x,w
-H.Yx(a)
-z=b?"m":""
-y=c?"":"i"
-x=d?"g":""
-w=function(e,f){try{return new RegExp(e,f)}catch(v){return v}}(a,z+y+x)
-if(w instanceof RegExp)return w
-throw H.b(new P.aE("Illegal RegExp pattern ("+String(w)+")",a,null))}}}}],["","",,H,{"^":"",
-Wp:function(){return new P.lj("No element")},
-Am:function(){return new P.lj("Too many elements")},
-ar:function(){return new P.lj("Too few elements")},
-ho:{"^":"cX;",
-gk:function(a){return new H.a7(this,this.gA(this),0,null)},
-U:function(a,b){var z,y
-z=this.gA(this)
-for(y=0;y<z;++y){b.$1(this.W(0,y))
-if(z!==this.gA(this))throw H.b(new P.UV(this))}},
-S:function(a,b){return this.p(this,b)},
-tt:function(a,b){var z,y
-z=H.VM([],[H.W8(this,"ho",0)])
-C.Nm.sA(z,this.gA(this))
-for(y=0;y<this.gA(this);++y)z[y]=this.W(0,y)
-return z},
-br:function(a){return this.tt(a,!0)},
-$isqC:1},
-a7:{"^":"Mh;a,b,c,d",
-gl:function(){return this.d},
-F:function(){var z,y,x,w
-z=this.a
-y=J.U6(z)
-x=y.gA(z)
-if(this.b!==x)throw H.b(new P.UV(z))
-w=this.c
-if(w>=x){this.d=null
-return!1}this.d=y.W(z,w);++this.c
-return!0}},
-i1:{"^":"cX;a,b",
-gk:function(a){var z=new H.MH(null,J.IT(this.a),this.b)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-gA:function(a){return J.Hm(this.a)},
-$ascX:function(a,b){return[b]},
-static:{
-K1:function(a,b,c,d){if(!!J.v(a).$isqC)return H.VM(new H.xy(a,b),[c,d])
-return H.VM(new H.i1(a,b),[c,d])}}},
-xy:{"^":"i1;a,b",$isqC:1},
-MH:{"^":"An;a,b,c",
-F:function(){var z=this.b
-if(z.F()){this.a=this.Mi(z.gl())
-return!0}this.a=null
-return!1},
-gl:function(){return this.a},
-Mi:function(a){return this.c.$1(a)}},
-A8:{"^":"ho;a,b",
-gA:function(a){return J.Hm(this.a)},
-W:function(a,b){return this.Mi(J.GA(this.a,b))},
-Mi:function(a){return this.b.$1(a)},
-$asho:function(a,b){return[b]},
-$ascX:function(a,b){return[b]},
-$isqC:1},
-U5:{"^":"cX;a,b",
-gk:function(a){var z=new H.SO(J.IT(this.a),this.b)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z}},
-SO:{"^":"An;a,b",
-F:function(){for(var z=this.a;z.F();)if(this.Mi(z.gl()))return!0
-return!1},
-gl:function(){return this.a.gl()},
-Mi:function(a){return this.b.$1(a)}},
-SU:{"^":"Mh;"}}],["","",,H,{"^":"",
-kU:function(a){var z=H.VM(a?Object.keys(a):[],[null])
-z.fixed$length=Array
-return z}}],["","",,P,{"^":"",
-Oj:function(){var z,y,x
-z={}
-if(self.scheduleImmediate!=null)return P.EX()
-if(self.MutationObserver!=null&&self.document!=null){y=self.document.createElement("div")
-x=self.document.createElement("span")
-z.a=null
-new self.MutationObserver(H.tR(new P.th(z),1)).observe(y,{childList:true})
-return new P.ha(z,y,x)}else if(self.setImmediate!=null)return P.yt()
-return P.qW()},
-ZV:[function(a){++init.globalState.f.b
-self.scheduleImmediate(H.tR(new P.C6(a),0))},"$1","EX",2,0,3],
-oA:[function(a){++init.globalState.f.b
-self.setImmediate(H.tR(new P.Ft(a),0))},"$1","yt",2,0,3],
-Bz:[function(a){P.YF(C.RT,a)},"$1","qW",2,0,3],
-VH:function(a,b){var z=H.N7()
-z=H.KT(z,[z,z]).Zg(a)
-if(z){b.toString
-return a}else{b.toString
-return a}},
-pu:function(){var z,y
-for(;z=$.S6,z!=null;){$.mg=null
-y=z.b
-$.S6=y
-if(y==null)$.k8=null
-z.a.$0()}},
-eN:[function(){$.UD=!0
-try{P.pu()}finally{$.mg=null
-$.UD=!1
-if($.S6!=null)$.$get$Wc().$1(P.UI())}},"$0","UI",0,0,2],
-eW:function(a){var z=new P.OM(a,null)
-if($.S6==null){$.k8=z
-$.S6=z
-if(!$.UD)$.$get$Wc().$1(P.UI())}else{$.k8.b=z
-$.k8=z}},
-rR:function(a){var z,y,x
-z=$.S6
-if(z==null){P.eW(a)
-$.mg=$.k8
-return}y=new P.OM(a,null)
-x=$.mg
-if(x==null){y.b=z
-$.mg=y
-$.S6=y}else{y.b=x.b
-x.b=y
-$.mg=y
-if(y.b==null)$.k8=y}},
-rb:function(a){var z=$.X3
-if(C.NU===z){P.Tk(null,null,C.NU,a)
-return}z.toString
-P.Tk(null,null,z,z.kb(a,!0))},
-FE:function(a,b,c){var z,y,x,w,v,u,t
-try{b.$1(a.$0())}catch(u){t=H.p(u)
-z=t
-y=H.ts(u)
-$.X3.toString
-x=null
-if(x==null)c.$2(z,y)
-else{t=J.YA(x)
-w=t
-v=x.gII()
-c.$2(w,v)}}},
-NX:function(a,b,c,d){var z=a.Gv(0)
-if(!!J.v(z).$isb8)z.wM(new P.v1(b,c,d))
-else b.ZL(c,d)},
-TB:function(a,b){return new P.uR(a,b)},
-ww:function(a,b){var z=$.X3
-if(z===C.NU){z.toString
-return P.YF(a,b)}return P.YF(a,z.kb(b,!0))},
-YF:function(a,b){var z=C.jn.BU(a.a,1000)
-return H.cy(z<0?0:z,b)},
-L2:function(a,b,c,d,e){var z={}
-z.a=d
-P.rR(new P.pK(z,e))},
-T8:function(a,b,c,d){var z,y
-y=$.X3
-if(y===c)return d.$0()
-$.X3=c
-z=y
-try{y=d.$0()
-return y}finally{$.X3=z}},
-yv:function(a,b,c,d,e){var z,y
-y=$.X3
-if(y===c)return d.$1(e)
-$.X3=c
-z=y
-try{y=d.$1(e)
-return y}finally{$.X3=z}},
-Qx:function(a,b,c,d,e,f){var z,y
-y=$.X3
-if(y===c)return d.$2(e,f)
-$.X3=c
-z=y
-try{y=d.$2(e,f)
-return y}finally{$.X3=z}},
-Tk:function(a,b,c,d){var z=C.NU!==c
-if(z)d=c.kb(d,!(!z||!1))
-P.eW(d)},
-th:{"^":"L:1;a",
-$1:function(a){var z,y;--init.globalState.f.b
-z=this.a
-y=z.a
-z.a=null
-y.$0()}},
-ha:{"^":"L:10;a,b,c",
-$1:function(a){var z,y;++init.globalState.f.b
-this.a.a=a
-z=this.b
-y=this.c
-z.firstChild?z.removeChild(y):z.appendChild(y)}},
-C6:{"^":"L:0;a",
-$0:function(){--init.globalState.f.b
-this.a.$0()}},
-Ft:{"^":"L:0;a",
-$0:function(){--init.globalState.f.b
-this.a.$0()}},
-b8:{"^":"Mh;"},
-Fe:{"^":"Mh;a,b,c,d,e"},
-vs:{"^":"Mh;YM:a@,b,O1:c<",
-Rx:function(a,b){var z,y
-z=$.X3
-if(z!==C.NU){z.toString
-if(b!=null)b=P.VH(b,z)}y=H.VM(new P.vs(0,z,null),[null])
-this.xf(new P.Fe(null,y,b==null?1:3,a,b))
-return y},
-ml:function(a){return this.Rx(a,null)},
-wM:function(a){var z,y
-z=$.X3
-y=new P.vs(0,z,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-if(z!==C.NU)z.toString
-this.xf(new P.Fe(null,y,8,a,null))
-return y},
-xf:function(a){var z,y
-z=this.a
-if(z<=1){a.a=this.c
-this.c=a}else{if(z===2){z=this.c
-y=z.a
-if(y<4){z.xf(a)
-return}this.a=y
-this.c=z.c}z=this.b
-z.toString
-P.Tk(null,null,z,new P.da(this,a))}},
-jQ:function(a){var z,y,x,w,v,u
-z={}
-z.a=a
-if(a==null)return
-y=this.a
-if(y<=1){x=this.c
-this.c=a
-if(x!=null){for(w=a;v=w.a,v!=null;w=v);w.a=x}}else{if(y===2){y=this.c
-u=y.a
-if(u<4){y.jQ(a)
-return}this.a=u
-this.c=y.c}z.a=this.N8(a)
-y=this.b
-y.toString
-P.Tk(null,null,y,new P.oQ(z,this))}},
-ah:function(){var z=this.c
-this.c=null
-return this.N8(z)},
-N8:function(a){var z,y,x
-for(z=a,y=null;z!=null;y=z,z=x){x=z.a
-z.a=y}return y},
-HH:function(a){var z
-if(!!J.v(a).$isb8)P.A9(a,this)
-else{z=this.ah()
-this.a=4
-this.c=a
-P.HZ(this,z)}},
-X2:function(a){var z=this.ah()
-this.a=4
-this.c=a
-P.HZ(this,z)},
-ZL:[function(a,b){var z=this.ah()
-this.a=8
-this.c=new P.OH(a,b)
-P.HZ(this,z)},function(a){return this.ZL(a,null)},"yk","$2","$1","gFa",2,2,11,0],
-$isb8:1,
-static:{
-k3:function(a,b){var z,y,x,w
-b.sYM(1)
-try{a.Rx(new P.pV(b),new P.U7(b))}catch(x){w=H.p(x)
-z=w
-y=H.ts(x)
-P.rb(new P.vr(b,z,y))}},
-A9:function(a,b){var z,y,x
-for(;z=a.a,z===2;)a=a.c
-y=b.c
-if(z>=4){b.c=null
-x=b.N8(y)
-b.a=a.a
-b.c=a.c
-P.HZ(b,x)}else{b.a=2
-b.c=a
-a.jQ(y)}},
-HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z={}
-z.a=a
-for(y=a;!0;){x={}
-w=y.a===8
-if(b==null){if(w){z=y.c
-y=y.b
-x=z.a
-z=z.b
-y.toString
-P.L2(null,null,y,x,z)}return}for(;v=b.a,v!=null;b=v){b.a=null
-P.HZ(z.a,b)}y=z.a
-u=y.c
-x.a=w
-x.b=u
-t=!w
-if(t){s=b.c
-s=(s&1)!==0||s===8}else s=!0
-if(s){s=b.b
-r=s.b
-if(w){q=y.b
-q.toString
-q=q==null?r==null:q===r
-if(!q)r.toString
-else q=!0
-q=!q}else q=!1
-if(q){z=y.b
-y=u.a
-x=u.b
-z.toString
-P.L2(null,null,z,y,x)
-return}p=$.X3
-if(p==null?r!=null:p!==r)$.X3=r
-else p=null
-y=b.c
-if(y===8)new P.RT(z,x,w,b,r).$0()
-else if(t){if((y&1)!==0)new P.rq(x,w,b,u,r).$0()}else if((y&2)!==0)new P.RW(z,x,b,r).$0()
-if(p!=null)$.X3=p
-y=x.b
-t=J.v(y)
-if(!!t.$isb8){if(!!t.$isvs)if(y.a>=4){o=s.c
-s.c=null
-b=s.N8(o)
-s.a=y.a
-s.c=y.c
-z.a=y
-continue}else P.A9(y,s)
-else P.k3(y,s)
-return}}n=b.b
-o=n.c
-n.c=null
-b=n.N8(o)
-y=x.a
-x=x.b
-if(!y){n.a=4
-n.c=x}else{n.a=8
-n.c=x}z.a=n
-y=n}}}},
-da:{"^":"L:0;a,b",
-$0:function(){P.HZ(this.a,this.b)}},
-oQ:{"^":"L:0;a,b",
-$0:function(){P.HZ(this.b,this.a.a)}},
-pV:{"^":"L:1;a",
-$1:function(a){this.a.X2(a)}},
-U7:{"^":"L:12;a",
-$2:function(a,b){this.a.ZL(a,b)},
-$1:function(a){return this.$2(a,null)}},
-vr:{"^":"L:0;a,b,c",
-$0:function(){this.a.ZL(this.b,this.c)}},
-rq:{"^":"L:2;a,b,c,d,e",
-$0:function(){var z,y,x,w
-try{x=this.a
-x.b=this.e.FI(this.c.d,this.d)
-x.a=!1}catch(w){x=H.p(w)
-z=x
-y=H.ts(w)
-x=this.a
-x.b=new P.OH(z,y)
-x.a=!0}}},
-RW:{"^":"L:2;a,b,c,d",
-$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=this.a.a.c
-y=!0
-r=this.c
-if(r.c===6){x=r.d
-try{y=this.d.FI(x,J.YA(z))}catch(q){r=H.p(q)
-w=r
-v=H.ts(q)
-r=J.YA(z)
-p=w
-o=(r==null?p==null:r===p)?z:new P.OH(w,v)
-r=this.b
-r.b=o
-r.a=!0
-return}}u=r.e
-if(y&&u!=null)try{r=u
-p=H.N7()
-p=H.KT(p,[p,p]).Zg(r)
-n=this.d
-m=this.b
-if(p)m.b=n.mg(u,J.YA(z),z.gII())
-else m.b=n.FI(u,J.YA(z))
-m.a=!1}catch(q){r=H.p(q)
-t=r
-s=H.ts(q)
-r=J.YA(z)
-p=t
-o=(r==null?p==null:r===p)?z:new P.OH(t,s)
-r=this.b
-r.b=o
-r.a=!0}}},
-RT:{"^":"L:2;a,b,c,d,e",
-$0:function(){var z,y,x,w,v,u
-z=null
-try{z=this.e.Gr(this.d.d)}catch(w){v=H.p(w)
-y=v
-x=H.ts(w)
-if(this.c){v=this.a.a.c.a
-u=y
-u=v==null?u==null:v===u
-v=u}else v=!1
-u=this.b
-if(v)u.b=this.a.a.c
-else u.b=new P.OH(y,x)
-u.a=!0
-return}if(!!J.v(z).$isb8){if(z instanceof P.vs&&z.gYM()>=4){if(z.gYM()===8){v=this.b
-v.b=z.gO1()
-v.a=!0}return}v=this.b
-v.b=z.ml(new P.jZ(this.a.a))
-v.a=!1}}},
-jZ:{"^":"L:1;a",
-$1:function(a){return this.a}},
-OM:{"^":"Mh;a,b"},
-qh:{"^":"Mh;",
-U:function(a,b){var z,y
-z={}
-y=H.VM(new P.vs(0,$.X3,null),[null])
-z.a=null
-z.a=this.X5(new P.lz(z,this,b,y),!0,new P.M4(y),y.gFa())
-return y},
-gA:function(a){var z,y
-z={}
-y=H.VM(new P.vs(0,$.X3,null),[P.KN])
-z.a=0
-this.X5(new P.B5(z),!0,new P.PI(z,y),y.gFa())
-return y}},
-lz:{"^":"L;a,b,c,d",
-$1:function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},
-$signature:function(){return H.IG(function(a){return{func:1,args:[a]}},this.b,"qh")}},
-Rl:{"^":"L:0;a,b",
-$0:function(){return this.a.$1(this.b)}},
-Jb:{"^":"L:1;",
-$1:function(a){}},
-M4:{"^":"L:0;a",
-$0:function(){this.a.HH(null)}},
-B5:{"^":"L:1;a",
-$1:function(a){++this.a.a}},
-PI:{"^":"L:0;a,b",
-$0:function(){this.b.HH(this.a.a)}},
-MO:{"^":"Mh;"},
-NO:{"^":"Mh;"},
-aA:{"^":"Mh;"},
-v1:{"^":"L:0;a,b,c",
-$0:function(){return this.a.ZL(this.b,this.c)}},
-uR:{"^":"L:13;a,b",
-$2:function(a,b){return P.NX(this.a,this.b,a,b)}},
-OH:{"^":"Mh;kc:a>,II:b<",
-w:function(a){return H.d(this.a)},
-$isGe:1},
-m0:{"^":"Mh;"},
-pK:{"^":"L:0;a,b",
-$0:function(){var z,y,x
-z=this.a
-y=z.a
-if(y==null){x=new P.B()
-z.a=x
-z=x}else z=y
-y=this.b
-if(y==null)throw H.b(z)
-x=H.b(z)
-x.stack=J.A(y)
-throw x}},
-R8:{"^":"m0;",
-bH:function(a){var z,y,x,w
-try{if(C.NU===$.X3){x=a.$0()
-return x}x=P.T8(null,null,this,a)
-return x}catch(w){x=H.p(w)
-z=x
-y=H.ts(w)
-return P.L2(null,null,this,z,y)}},
-m1:function(a,b){var z,y,x,w
-try{if(C.NU===$.X3){x=a.$1(b)
-return x}x=P.yv(null,null,this,a,b)
-return x}catch(w){x=H.p(w)
-z=x
-y=H.ts(w)
-return P.L2(null,null,this,z,y)}},
-kb:function(a,b){if(b)return new P.hj(this,a)
-else return new P.MK(this,a)},
-oj:function(a,b){return new P.pQ(this,a)},
-q:function(a,b){return},
-Gr:function(a){if($.X3===C.NU)return a.$0()
-return P.T8(null,null,this,a)},
-FI:function(a,b){if($.X3===C.NU)return a.$1(b)
-return P.yv(null,null,this,a,b)},
-mg:function(a,b,c){if($.X3===C.NU)return a.$2(b,c)
-return P.Qx(null,null,this,a,b,c)}},
-hj:{"^":"L:0;a,b",
-$0:function(){return this.a.bH(this.b)}},
-MK:{"^":"L:0;a,b",
-$0:function(){return this.a.Gr(this.b)}},
-pQ:{"^":"L:1;a,b",
-$1:function(a){return this.a.m1(this.b,a)}}}],["","",,P,{"^":"",
-u5:function(){return H.VM(new H.N5(0,null,null,null,null,null,0),[null,null])},
-Td:function(a){return H.B7(a,H.VM(new H.N5(0,null,null,null,null,null,0),[null,null]))},
-EP:function(a,b,c){var z,y
-if(P.hB(a)){if(b==="("&&c===")")return"(...)"
-return b+"..."+c}z=[]
-y=$.$get$xg()
-y.push(a)
-try{P.Vr(a,z)}finally{y.pop()}y=P.vg(b,z,", ")+c
-return y.charCodeAt(0)==0?y:y},
-WE:function(a,b,c){var z,y,x
-if(P.hB(a))return b+"..."+c
-z=new P.Rn(b)
-y=$.$get$xg()
-y.push(a)
-try{x=z
-x.a=P.vg(x.gI(),a,", ")}finally{y.pop()}y=z
-y.a=y.gI()+c
-y=z.gI()
-return y.charCodeAt(0)==0?y:y},
-hB:function(a){var z,y
-for(z=0;y=$.$get$xg(),z<y.length;++z)if(a===y[z])return!0
-return!1},
-Vr:function(a,b){var z,y,x,w,v,u,t,s,r,q
-z=a.gk(a)
-y=0
-x=0
-while(!0){if(!(y<80||x<3))break
-if(!z.F())return
-w=H.d(z.gl())
-b.push(w)
-y+=w.length+2;++x}if(!z.F()){if(x<=5)return
-v=b.pop()
-u=b.pop()}else{t=z.gl();++x
-if(!z.F()){if(x<=4){b.push(H.d(t))
-return}v=H.d(t)
-u=b.pop()
-y+=v.length+2}else{s=z.gl();++x
-for(;z.F();t=s,s=r){r=z.gl();++x
-if(x>100){while(!0){if(!(y>75&&x>3))break
-y-=b.pop().length+2;--x}b.push("...")
-return}}u=H.d(t)
-v=H.d(s)
-y+=v.length+u.length+4}}if(x>b.length+2){y+=5
-q="..."}else q=null
-while(!0){if(!(y>80&&b.length>3))break
-y-=b.pop().length+2
-if(q==null){y+=5
-q="..."}}if(q!=null)b.push(q)
-b.push(u)
-b.push(v)},
-Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
-tM:function(a,b){var z,y,x
-z=P.Ls(null,null,null,b)
-for(y=a.length,x=0;x<a.length;a.length===y||(0,H.lk)(a),++x)z.AN(0,a[x])
-return z},
-vW:function(a){var z,y,x
-z={}
-if(P.hB(a))return"{...}"
-y=new P.Rn("")
-try{$.$get$xg().push(a)
-x=y
-x.a=x.gI()+"{"
-z.a=!0
-J.hE(a,new P.W0(z,y))
-z=y
-z.a=z.gI()+"}"}finally{$.$get$xg().pop()}z=y.gI()
-return z.charCodeAt(0)==0?z:z},
-ey:{"^":"N5;a,b,c,d,e,f,r",
-xi:function(a){return H.CU(a)&0x3ffffff},
-X:function(a,b){var z,y,x
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;++y){x=a[y].a
-if(x==null?b==null:x===b)return y}return-1},
-static:{
-E8:function(a,b){return H.VM(new P.ey(0,null,null,null,null,null,0),[a,b])}}},
-b6:{"^":"u3;a,b,c,d,e,f,r",
-gk:function(a){var z=new P.lm(this,this.r,null,null)
-z.c=this.e
-return z},
-gA:function(a){return this.a},
-tg:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.b
-if(z==null)return!1
-return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.c
-if(y==null)return!1
-return y[b]!=null}else return this.PR(b)},
-PR:function(a){var z=this.d
-if(z==null)return!1
-return this.DF(z[this.rk(a)],a)>=0},
-Zt:function(a){var z=typeof a==="number"&&(a&0x3ffffff)===a
-if(z)return this.tg(0,a)?a:null
-else return this.vR(a)},
-vR:function(a){var z,y,x
-z=this.d
-if(z==null)return
-y=z[this.rk(a)]
-x=this.DF(y,a)
-if(x<0)return
-return J.w2(y,x).gSk()},
-U:function(a,b){var z,y
-z=this.e
-y=this.r
-for(;z!=null;){b.$1(z.a)
-if(y!==this.r)throw H.b(new P.UV(this))
-z=z.b}},
-AN:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.b
-if(z==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.b=y
-z=y}return this.cW(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.c
-if(x==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.c=y
-x=y}return this.cW(x,b)}else return this.B7(0,b)},
-B7:function(a,b){var z,y,x
-z=this.d
-if(z==null){z=P.T2()
-this.d=z}y=this.rk(b)
-x=z[y]
-if(x==null)z[y]=[this.dg(b)]
-else{if(this.DF(x,b)>=0)return!1
-x.push(this.dg(b))}return!0},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.b,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.c,b)
-else return this.qg(0,b)},
-qg:function(a,b){var z,y,x
-z=this.d
-if(z==null)return!1
-y=z[this.rk(b)]
-x=this.DF(y,b)
-if(x<0)return!1
-this.GS(y.splice(x,1)[0])
-return!0},
-V1:function(a){if(this.a>0){this.f=null
-this.e=null
-this.d=null
-this.c=null
-this.b=null
-this.a=0
-this.r=this.r+1&67108863}},
-cW:function(a,b){if(a[b]!=null)return!1
-a[b]=this.dg(b)
-return!0},
-H4:function(a,b){var z
-if(a==null)return!1
-z=a[b]
-if(z==null)return!1
-this.GS(z)
-delete a[b]
-return!0},
-dg:function(a){var z,y
-z=new P.bn(a,null,null)
-if(this.e==null){this.f=z
-this.e=z}else{y=this.f
-z.c=y
-y.b=z
-this.f=z}++this.a
-this.r=this.r+1&67108863
-return z},
-GS:function(a){var z,y
-z=a.c
-y=a.b
-if(z==null)this.e=y
-else z.b=y
-if(y==null)this.f=z
-else y.c=z;--this.a
-this.r=this.r+1&67108863},
-rk:function(a){return J.hf(a)&0x3ffffff},
-DF:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;++y)if(J.RM(a[y].a,b))return y
-return-1},
-$isqC:1,
-static:{
-T2:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},
-bn:{"^":"Mh;Sk:a<,b,c"},
-lm:{"^":"Mh;a,b,c,d",
-gl:function(){return this.d},
-F:function(){var z=this.a
-if(this.b!==z.r)throw H.b(new P.UV(z))
-else{z=this.c
-if(z==null){this.d=null
-return!1}else{this.d=z.a
-this.c=z.b
-return!0}}}},
-u3:{"^":"Vj;"},
-LU:{"^":"E9;"},
-E9:{"^":"Mh+lD;",$iszM:1,$aszM:null,$isqC:1},
-lD:{"^":"Mh;",
-gk:function(a){return new H.a7(a,this.gA(a),0,null)},
-W:function(a,b){return this.q(a,b)},
-U:function(a,b){var z,y
-z=this.gA(a)
-for(y=0;y<z;++y){b.$1(this.q(a,y))
-if(z!==this.gA(a))throw H.b(new P.UV(a))}},
-S:function(a,b){return H.VM(new H.U5(a,b),[H.W8(a,"lD",0)])},
-ez:function(a,b){return H.VM(new H.A8(a,b),[null,null])},
-w:function(a){return P.WE(a,"[","]")},
-$iszM:1,
-$aszM:null,
-$isqC:1},
-W0:{"^":"L:14;a,b",
-$2:function(a,b){var z,y
-z=this.a
-if(!z.a)this.b.a+=", "
-z.a=!1
-z=this.b
-y=z.a+=H.d(a)
-z.a=y+": "
-z.a+=H.d(b)}},
-Sw:{"^":"cX;a,b,c,d",
-gk:function(a){return new P.o0(this,this.c,this.d,this.b,null)},
-U:function(a,b){var z,y
-z=this.d
-for(y=this.b;y!==this.c;y=(y+1&this.a.length-1)>>>0){b.$1(this.a[y])
-if(z!==this.d)H.vh(new P.UV(this))}},
-gl0:function(a){return this.b===this.c},
-gA:function(a){return(this.c-this.b&this.a.length-1)>>>0},
-V1:function(a){var z,y,x,w
-z=this.b
-y=this.c
-if(z!==y){for(x=this.a,w=x.length-1;z!==y;z=(z+1&w)>>>0)x[z]=null
-this.c=0
-this.b=0;++this.d}},
-w:function(a){return P.WE(this,"{","}")},
-Ux:function(){var z,y,x
-z=this.b
-if(z===this.c)throw H.b(H.Wp());++this.d
-y=this.a
-x=y[z]
-y[z]=null
-this.b=(z+1&y.length-1)>>>0
-return x},
-B7:function(a,b){var z,y
-z=this.a
-y=this.c
-z[y]=b
-z=(y+1&z.length-1)>>>0
-this.c=z
-if(this.b===z)this.wL();++this.d},
-wL:function(){var z,y,x,w
-z=new Array(this.a.length*2)
-z.fixed$length=Array
-y=H.VM(z,[H.Kp(this,0)])
-z=this.a
-x=this.b
-w=z.length-x
-C.Nm.YW(y,0,w,z,x)
-C.Nm.YW(y,w,w+this.b,this.a,0)
-this.b=0
-this.c=this.a.length
-this.a=y},
-Eo:function(a,b){var z=new Array(8)
-z.fixed$length=Array
-this.a=H.VM(z,[b])},
-$isqC:1,
-static:{
-NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
-z.Eo(a,b)
-return z}}},
-o0:{"^":"Mh;a,b,c,d,e",
-gl:function(){return this.e},
-F:function(){var z,y
-z=this.a
-if(this.c!==z.d)H.vh(new P.UV(z))
-y=this.d
-if(y===this.b){this.e=null
-return!1}z=z.a
-this.e=z[y]
-this.d=(y+1&z.length-1)>>>0
-return!0}},
-Ma:{"^":"Mh;",
-FV:function(a,b){var z
-for(z=J.IT(b);z.F();)this.AN(0,z.gl())},
-w:function(a){return P.WE(this,"{","}")},
-U:function(a,b){var z
-for(z=new P.lm(this,this.r,null,null),z.c=this.e;z.F();)b.$1(z.d)},
-zV:function(a,b){var z,y,x
-z=new P.lm(this,this.r,null,null)
-z.c=this.e
-if(!z.F())return""
-y=new P.Rn("")
-if(b===""){do y.a+=H.d(z.d)
-while(z.F())}else{y.a=H.d(z.d)
-for(;z.F();){y.a+=b
-y.a+=H.d(z.d)}}x=y.a
-return x.charCodeAt(0)==0?x:x},
-$isqC:1},
-Vj:{"^":"Ma;"}}],["","",,P,{"^":"",zF:{"^":"Mh;"},fU:{"^":"Mh;a,b,c,d,e",
-w:function(a){return this.a}},Rc:{"^":"zF;a",
-h:function(a,b,c){var z,y,x,w
-for(z=b,y=null;z<c;++z){switch(a[z]){case"&":x="&amp;"
-break
-case'"':x="&quot;"
-break
-case"'":x="&#39;"
-break
-case"<":x="&lt;"
-break
-case">":x="&gt;"
-break
-case"/":x="&#47;"
-break
-default:x=null}if(x!=null){if(y==null)y=new P.Rn("")
-if(z>b){w=C.xB.C(a,b,z)
-y.a=y.a+w}y.a=y.a+x
-b=z+1}}if(y==null)return
-if(c>b)y.a+=J.ld(a,b,c)
-w=y.a
-return w.charCodeAt(0)==0?w:w}}}],["","",,P,{"^":"",
-h:function(a){if(typeof a==="number"||typeof a==="boolean"||null==a)return J.A(a)
-if(typeof a==="string")return JSON.stringify(a)
-return P.o(a)},
-o:function(a){var z=J.v(a)
-if(!!z.$isL)return z.w(a)
-return H.H(a)},
-FM:function(a){return new P.CD(a)},
-PW:function(a,b,c){var z,y
-z=H.VM([],[c])
-for(y=J.IT(a);y.F();)z.push(y.gl())
-if(b)return z
-z.fixed$length=Array
-return z},
-JS:function(a){var z=H.d(a)
-H.qw(z)},
-a2:{"^":"Mh;"},
-"+bool":0,
-iP:{"^":"Mh;"},
-CP:{"^":"lf;"},
-"+double":0,
-a6:{"^":"Mh;a",
-B:function(a,b){return C.jn.B(this.a,b.gm5())},
-D:function(a,b){if(b==null)return!1
-if(!(b instanceof P.a6))return!1
-return this.a===b.a},
-gM:function(a){return this.a&0x1FFFFFFF},
-w:function(a){var z,y,x,w,v
-z=new P.DW()
-y=this.a
-if(y<0)return"-"+new P.a6(-y).w(0)
-x=z.$1(C.jn.JV(C.jn.BU(y,6e7),60))
-w=z.$1(C.jn.JV(C.jn.BU(y,1e6),60))
-v=new P.P7().$1(C.jn.JV(y,1e6))
-return""+C.jn.BU(y,36e8)+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)}},
-P7:{"^":"L:4;",
-$1:function(a){if(a>=1e5)return""+a
-if(a>=1e4)return"0"+a
-if(a>=1000)return"00"+a
-if(a>=100)return"000"+a
-if(a>=10)return"0000"+a
-return"00000"+a}},
-DW:{"^":"L:4;",
-$1:function(a){if(a>=10)return""+a
-return"0"+a}},
-Ge:{"^":"Mh;",
-gII:function(){return H.ts(this.$thrownJsError)}},
-B:{"^":"Ge;",
-w:function(a){return"Throw of null."}},
-AT:{"^":"Ge;a,b,c,d",
-gZ:function(){return"Invalid argument"+(!this.a?"(s)":"")},
-gu:function(){return""},
-w:function(a){var z,y,x,w,v,u
-z=this.c
-y=z!=null?" ("+H.d(z)+")":""
-z=this.d
-x=z==null?"":": "+H.d(z)
-w=this.gZ()+y+x
-if(!this.a)return w
-v=this.gu()
-u=P.h(this.b)
-return w+v+": "+H.d(u)},
-static:{
-q:function(a){return new P.AT(!1,null,null,a)},
-L3:function(a,b,c){return new P.AT(!0,a,b,c)},
-hG:function(a){return new P.AT(!1,null,a,"Must not be null")}}},
-bJ:{"^":"AT;e,f,a,b,c,d",
-gZ:function(){return"RangeError"},
-gu:function(){var z,y,x
-z=this.e
-if(z==null){z=this.f
-y=z!=null?": Not less than or equal to "+H.d(z):""}else{x=this.f
-if(x==null)y=": Not greater than or equal to "+H.d(z)
-else if(x>z)y=": Not in range "+H.d(z)+".."+H.d(x)+", inclusive"
-else y=x<z?": Valid value range is empty":": Only valid value is "+H.d(z)}return y},
-static:{
-F:function(a,b,c){return new P.bJ(null,null,!0,a,b,"Value not in range")},
-TE:function(a,b,c,d,e){return new P.bJ(b,c,!0,a,d,"Invalid value")},
-jB:function(a,b,c,d,e,f){if(0>a||a>c)throw H.b(P.TE(a,0,c,"start",f))
-if(a>b||b>c)throw H.b(P.TE(b,a,c,"end",f))
-return b}}},
-eY:{"^":"AT;e,A:f>,a,b,c,d",
-gZ:function(){return"RangeError"},
-gu:function(){if(J.aa(this.b,0))return": index must not be negative"
-var z=this.f
-if(z===0)return": no indices are valid"
-return": index should be less than "+H.d(z)},
-static:{
-Cf:function(a,b,c,d,e){var z=e!=null?e:J.Hm(b)
-return new P.eY(b,z,!0,a,c,"Index out of range")}}},
-ub:{"^":"Ge;a",
-w:function(a){return"Unsupported operation: "+this.a}},
-D:{"^":"Ge;a",
-w:function(a){var z=this.a
-return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"}},
-lj:{"^":"Ge;a",
-w:function(a){return"Bad state: "+this.a}},
-UV:{"^":"Ge;a",
-w:function(a){var z=this.a
-if(z==null)return"Concurrent modification during iteration."
-return"Concurrent modification during iteration: "+H.d(P.h(z))+"."}},
-VS:{"^":"Mh;",
-w:function(a){return"Stack Overflow"},
-gII:function(){return},
-$isGe:1},
-t7:{"^":"Ge;a",
-w:function(a){return"Reading static variable '"+this.a+"' during its initialization"}},
-CD:{"^":"Mh;a",
-w:function(a){var z=this.a
-if(z==null)return"Exception"
-return"Exception: "+H.d(z)}},
-aE:{"^":"Mh;a,b,c",
-w:function(a){var z,y
-z=""!==this.a?"FormatException: "+this.a:"FormatException"
-y=this.b
-if(y.length>78)y=C.xB.C(y,0,75)+"..."
-return z+"\n"+y}},
-kM:{"^":"Mh;a",
-w:function(a){return"Expando:"+H.d(this.a)},
-q:function(a,b){var z=H.VK(b,"expando$values")
-return z==null?null:H.VK(z,this.KV(0))},
-KV:function(a){var z,y
-z=H.VK(this,"expando$key")
-if(z==null){y=$.Ss
-$.Ss=y+1
-z="expando$key$"+y
-H.aw(this,"expando$key",z)}return z}},
-EH:{"^":"Mh;"},
-KN:{"^":"lf;"},
-"+int":0,
-cX:{"^":"Mh;",
-S:["p",function(a,b){return H.VM(new H.U5(this,b),[H.W8(this,"cX",0)])}],
-U:function(a,b){var z
-for(z=this.gk(this);z.F();)b.$1(z.gl())},
-gA:function(a){var z,y
-z=this.gk(this)
-for(y=0;z.F();)++y
-return y},
-gV:function(a){var z,y
-z=this.gk(this)
-if(!z.F())throw H.b(H.Wp())
-y=z.gl()
-if(z.F())throw H.b(H.Am())
-return y},
-W:function(a,b){var z,y,x
-if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.hG("index"))
-if(b<0)H.vh(P.TE(b,0,null,"index",null))
-for(z=this.gk(this),y=0;z.F();){x=z.gl()
-if(b===y)return x;++y}throw H.b(P.Cf(b,this,"index",null,y))},
-w:function(a){return P.EP(this,"(",")")}},
-An:{"^":"Mh;"},
-zM:{"^":"Mh;",$aszM:null,$isqC:1},
-"+List":0,
-L8:{"^":"Mh;"},
-c8:{"^":"Mh;",
-w:function(a){return"null"}},
-"+Null":0,
-lf:{"^":"Mh;"},
-"+num":0,
-Mh:{"^":";",
-D:function(a,b){return this===b},
-gM:function(a){return H.wP(this)},
-w:function(a){return H.H(this)},
-toString:function(){return this.w(this)}},
-Gz:{"^":"Mh;"},
-qU:{"^":"Mh;"},
-"+String":0,
-Rn:{"^":"Mh;I:a<",
-gA:function(a){return this.a.length},
-w:function(a){var z=this.a
-return z.charCodeAt(0)==0?z:z},
-static:{
-vg:function(a,b,c){var z=J.IT(b)
-if(!z.F())return a
-if(c.length===0){do a+=H.d(z.gl())
-while(z.F())}else{a+=H.d(z.gl())
-for(;z.F();)a=a+c+H.d(z.gl())}return a}}}}],["","",,W,{"^":"",
-U9:function(a,b,c){var z,y
-z=document.body
-y=(z&&C.RY).O(z,a,b,c)
-y.toString
-z=new W.e7(y)
-z=z.S(z,new W.wJ())
-return z.gV(z)},
-rS:function(a){var z,y,x
-z="element tag unavailable"
-try{y=J.Ob(a)
-if(typeof y==="string")z=J.Ob(a)}catch(x){H.p(x)}return z},
-C0:function(a,b){a=536870911&a+b
-a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},
-Up:function(a){a=536870911&a+((67108863&a)<<3>>>0)
-a^=a>>>11
-return 536870911&a+((16383&a)<<15>>>0)},
-qc:function(a){var z
-if(a==null)return
-if("postMessage" in a){z=W.P1(a)
-if(!!J.v(z).$isD0)return z
-return}else return a},
-aF:function(a){var z=$.X3
-if(z===C.NU)return a
-return z.oj(a,!0)},
-Z0:function(a){return document.querySelector(a)},
-qE:{"^":"cv;",$isqE:1,$iscv:1,$isK:1,$isMh:1,"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLImageElement|HTMLLIElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLMenuElement|HTMLMenuItemElement|HTMLMeterElement|HTMLModElement|HTMLOListElement|HTMLOptGroupElement|HTMLOptionElement|HTMLParagraphElement|HTMLPictureElement|HTMLPreElement|HTMLProgressElement|HTMLQuoteElement|HTMLShadowElement|HTMLSourceElement|HTMLSpanElement|HTMLStyleElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLTrackElement|HTMLUListElement|HTMLUnknownElement|PluginPlaceholderElement;HTMLElement"},
-Yy:{"^":"vB;",$iszM:1,
-$aszM:function(){return[W.M5]},
-$isqC:1,
-"%":"EntryArray"},
-Gh:{"^":"qE;LU:href}",
-w:function(a){return String(a)},
-$isvB:1,
-"%":"HTMLAnchorElement"},
-fY:{"^":"qE;LU:href}",
-w:function(a){return String(a)},
-$isvB:1,
-"%":"HTMLAreaElement"},
-fo:{"^":"D0;A:length=","%":"AudioTrackList"},
-nB:{"^":"qE;LU:href}","%":"HTMLBaseElement"},
-Az:{"^":"vB;","%":";Blob"},
-QP:{"^":"qE;",$isQP:1,$isD0:1,$isvB:1,"%":"HTMLBodyElement"},
-IF:{"^":"qE;oc:name=",$isIF:1,"%":"HTMLButtonElement"},
-nx:{"^":"K;A:length=",$isvB:1,"%":"CDATASection|CharacterData|Comment|ProcessingInstruction|Text"},
-lw:{"^":"vB;",$isMh:1,"%":"CSSCharsetRule|CSSFontFaceRule|CSSImportRule|CSSKeyframeRule|CSSKeyframesRule|CSSMediaRule|CSSPageRule|CSSRule|CSSStyleRule|CSSSupportsRule|CSSUnknownRule|CSSViewportRule|MozCSSKeyframeRule|MozCSSKeyframesRule|WebKitCSSFilterRule|WebKitCSSKeyframeRule|WebKitCSSKeyframesRule"},
-oJ:{"^":"BV;A:length=","%":"CSS2Properties|CSSStyleDeclaration|MSStyleCSSProperties"},
-BV:{"^":"vB+id;"},
-id:{"^":"Mh;"},
-Wv:{"^":"vB;",$isWv:1,$isMh:1,"%":"DataTransferItem"},
-Sb:{"^":"vB;A:length=",
-q:function(a,b){return a[b]},
-"%":"DataTransferItemList"},
-QF:{"^":"K;",
-Wk:function(a,b){return a.querySelector(b)},
-"%":"Document|HTMLDocument|XMLDocument"},
-hs:{"^":"K;",
-Wk:function(a,b){return a.querySelector(b)},
-$isvB:1,
-"%":"DocumentFragment|ShadowRoot"},
-Nh:{"^":"vB;",
-w:function(a){return String(a)},
-"%":"DOMException"},
-tk:{"^":"vB;",$istk:1,$isMh:1,"%":"Iterator"},
-IB:{"^":"vB;L:height=,H:left=,T:top=,P:width=",
-w:function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(this.gP(a))+" x "+H.d(this.gL(a))},
-D:function(a,b){var z,y,x
-if(b==null)return!1
-z=J.v(b)
-if(!z.$istn)return!1
-y=a.left
-x=z.gH(b)
-if(y==null?x==null:y===x){y=a.top
-x=z.gT(b)
-if(y==null?x==null:y===x){y=this.gP(a)
-x=z.gP(b)
-if(y==null?x==null:y===x){y=this.gL(a)
-z=z.gL(b)
-z=y==null?z==null:y===z}else z=!1}else z=!1}else z=!1
-return z},
-gM:function(a){var z,y,x,w
-z=J.hf(a.left)
-y=J.hf(a.top)
-x=J.hf(this.gP(a))
-w=J.hf(this.gL(a))
-return W.Up(W.C0(W.C0(W.C0(W.C0(0,z),y),x),w))},
-$istn:1,
-$astn:I.HU,
-"%":";DOMRectReadOnly"},
-Yl:{"^":"ec;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[P.qU]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"DOMStringList"},
-nN:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[P.qU]},
-$isqC:1},
-ec:{"^":"nN+Gm;",$iszM:1,
-$aszM:function(){return[P.qU]},
-$isqC:1},
-NQ:{"^":"vB;A:length=","%":"DOMSettableTokenList|DOMTokenList"},
-wz:{"^":"LU;a",
-gA:function(a){return this.a.length},
-q:function(a,b){return this.a[b]},
-$asLU:I.HU,
-$aszM:I.HU,
-$iszM:1,
-$isqC:1},
-cv:{"^":"K;jO:id},ns:tagName=",
-gQg:function(a){return new W.i7(a)},
-gDD:function(a){return new W.I4(a)},
-w:function(a){return a.localName},
-N:function(a,b,c,d,e){var z
-if(d instanceof W.x)a.insertAdjacentHTML(b,c)
-else{z=this.O(a,c,d,e)
-switch(b.toLowerCase()){case"beforebegin":a.parentNode.insertBefore(z,a)
-break
-case"afterbegin":a.insertBefore(z,a.childNodes.length>0?a.childNodes[0]:null)
-break
-case"beforeend":a.appendChild(z)
-break
-case"afterend":a.parentNode.insertBefore(z,a.nextSibling)
-break
-default:H.vh(P.q("Invalid position "+b))}}},
-O:["DW",function(a,b,c,d){var z,y,x,w,v
-if(c==null){z=$.lt
-if(z==null){z=H.VM([],[W.kF])
-y=new W.vD(z)
-z.push(W.Tw(null))
-z.push(W.Bl())
-$.lt=y
-d=y}else d=z
-z=$.EU
-if(z==null){z=new W.MM(d)
-$.EU=z
-c=z}else{z.a=d
-c=z}}if($.xo==null){z=document.implementation.createHTMLDocument("")
-$.xo=z
-$.BO=z.createRange()
-z=$.xo
-z.toString
-x=z.createElement("base")
-J.Gq(x,document.baseURI)
-$.xo.head.appendChild(x)}z=$.xo
-if(!!this.$isQP)w=z.body
-else{y=a.tagName
-z.toString
-w=z.createElement(y)
-$.xo.body.appendChild(w)}if("createContextualFragment" in window.Range.prototype&&!C.Nm.tg(C.Sq,a.tagName)){$.BO.selectNodeContents(w)
-v=$.BO.createContextualFragment(b)}else{w.innerHTML=b
-v=$.xo.createDocumentFragment()
-for(;z=w.firstChild,z!=null;)v.appendChild(z)}z=$.xo.body
-if(w==null?z!=null:w!==z)J.Ns(w)
-c.Pn(v)
-document.adoptNode(v)
-return v},function(a,b,c){return this.O(a,b,c,null)},"E",null,null,"gkf",2,5,null,0,0],
-a7:function(a,b,c){return a.setAttribute(b,c)},
-Wk:function(a,b){return a.querySelector(b)},
-$iscv:1,
-$isK:1,
-$isMh:1,
-$isvB:1,
-$isD0:1,
-"%":";Element"},
-wJ:{"^":"L:1;",
-$1:function(a){return!!J.v(a).$iscv}},
-Fs:{"^":"qE;oc:name=","%":"HTMLEmbedElement"},
-M5:{"^":"vB;",$isMh:1,"%":"DirectoryEntry|Entry|FileEntry"},
-hY:{"^":"ea;kc:error=","%":"ErrorEvent"},
-ea:{"^":"vB;","%":"AnimationPlayerEvent|ApplicationCacheErrorEvent|AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CloseEvent|CustomEvent|DeviceLightEvent|DeviceMotionEvent|DeviceOrientationEvent|ExtendableEvent|FetchEvent|FontFaceSetLoadEvent|GamepadEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|MIDIConnectionEvent|MIDIMessageEvent|MediaKeyEvent|MediaKeyMessageEvent|MediaKeyNeededEvent|MediaQueryListEvent|MediaStreamEvent|MediaStreamTrackEvent|MessageEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|ProgressEvent|PushEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|RTCPeerConnectionIceEvent|RelatedEvent|ResourceProgressEvent|SecurityPolicyViolationEvent|SpeechRecognitionEvent|SpeechSynthesisEvent|StorageEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent|XMLHttpRequestProgressEvent;ClipboardEvent|Event|InputEvent"},
-D0:{"^":"vB;",
-On:function(a,b,c,d){if(c!=null)this.v0(a,b,c,!1)},
-Y9:function(a,b,c,d){if(c!=null)this.Ci(a,b,c,!1)},
-v0:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),!1)},
-Ci:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),!1)},
-$isD0:1,
-"%":"AnalyserNode|AnimationPlayer|ApplicationCache|AudioBufferSourceNode|AudioChannelMerger|AudioChannelSplitter|AudioContext|AudioDestinationNode|AudioGainNode|AudioNode|AudioPannerNode|AudioSourceNode|BatteryManager|BiquadFilterNode|ChannelMergerNode|ChannelSplitterNode|ConvolverNode|DOMApplicationCache|DelayNode|DynamicsCompressorNode|EventSource|GainNode|IDBDatabase|InputMethodContext|JavaScriptAudioNode|MIDIAccess|MediaController|MediaElementAudioSourceNode|MediaQueryList|MediaSource|MediaStream|MediaStreamAudioDestinationNode|MediaStreamAudioSourceNode|MediaStreamTrack|MessagePort|NetworkInformation|Notification|OfflineAudioContext|OfflineResourceList|Oscillator|OscillatorNode|PannerNode|Performance|Presentation|RTCDTMFSender|RTCPeerConnection|RealtimeAnalyserNode|ScreenOrientation|ScriptProcessorNode|ServiceWorkerRegistration|SpeechRecognition|SpeechSynthesis|SpeechSynthesisUtterance|WaveShaperNode|mozRTCPeerConnection|webkitAudioContext|webkitAudioPannerNode;EventTarget;Vc|mr|KS|bD"},
-as:{"^":"qE;oc:name=","%":"HTMLFieldSetElement"},
-dU:{"^":"Az;",$isMh:1,"%":"File"},
-XV:{"^":"x5;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.dU]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"FileList"},
-zL:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[W.dU]},
-$isqC:1},
-x5:{"^":"zL+Gm;",$iszM:1,
-$aszM:function(){return[W.dU]},
-$isqC:1},
-H0:{"^":"D0;kc:error=","%":"FileReader"},
-Bf:{"^":"D0;kc:error=,A:length=","%":"FileWriter"},
-n5:{"^":"vB;",$isn5:1,$isMh:1,"%":"FontFace"},
-CV:{"^":"D0;",
-K:function(a,b,c){return a.forEach(H.tR(b,3),c)},
-U:function(a,b){b=H.tR(b,3)
-return a.forEach(b)},
-"%":"FontFaceSet"},
-Yu:{"^":"qE;A:length=,oc:name=","%":"HTMLFormElement"},
-GO:{"^":"vB;",$isMh:1,"%":"Gamepad"},
-F1:{"^":"vB;",
-K:function(a,b,c){return a.forEach(H.tR(b,3),c)},
-U:function(a,b){b=H.tR(b,3)
-return a.forEach(b)},
-"%":"Headers"},
-br:{"^":"vB;A:length=","%":"History"},
-xn:{"^":"HR;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.K]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
-dx:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[W.K]},
-$isqC:1},
-HR:{"^":"dx+Gm;",$iszM:1,
-$aszM:function(){return[W.K]},
-$isqC:1},
-zU:{"^":"wa;",
-wR:function(a,b){return a.send(b)},
-"%":"XMLHttpRequest"},
-wa:{"^":"D0;","%":"XMLHttpRequestUpload;XMLHttpRequestEventTarget"},
-tX:{"^":"qE;oc:name=","%":"HTMLIFrameElement"},
-Mi:{"^":"qE;oc:name=",$iscv:1,$isvB:1,$isD0:1,"%":"HTMLInputElement"},
-MX:{"^":"qE;oc:name=","%":"HTMLKeygenElement"},
-Og:{"^":"qE;LU:href}","%":"HTMLLinkElement"},
-u8:{"^":"vB;",
-w:function(a){return String(a)},
-"%":"Location"},
-M6:{"^":"qE;oc:name=","%":"HTMLMapElement"},
-eL:{"^":"qE;kc:error=","%":"HTMLAudioElement|HTMLMediaElement|HTMLVideoElement"},
-G9:{"^":"D0;kc:error=","%":"MediaKeySession"},
-tL:{"^":"vB;A:length=","%":"MediaList"},
-Ee:{"^":"qE;oc:name=","%":"HTMLMetaElement"},
-Lk:{"^":"Im;",
-LV:function(a,b,c){return a.send(b,c)},
-wR:function(a,b){return a.send(b)},
-"%":"MIDIOutput"},
-Im:{"^":"D0;","%":"MIDIInput;MIDIPort"},
-AW:{"^":"vB;",$isMh:1,"%":"MimeType"},
-bw:{"^":"rr;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.AW]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"MimeTypeArray"},
-hm:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[W.AW]},
-$isqC:1},
-rr:{"^":"hm+Gm;",$iszM:1,
-$aszM:function(){return[W.AW]},
-$isqC:1},
-Aj:{"^":"w6;",$isAj:1,$isMh:1,"%":"DragEvent|MSPointerEvent|MouseEvent|PointerEvent|WheelEvent"},
-oU:{"^":"vB;",$isvB:1,"%":"Navigator"},
-e7:{"^":"LU;a",
-gV:function(a){var z,y
-z=this.a
-y=z.childNodes.length
-if(y===0)throw H.b(new P.lj("No elements"))
-if(y>1)throw H.b(new P.lj("More than one element"))
-return z.firstChild},
-FV:function(a,b){var z,y,x,w
-z=b.a
-y=this.a
-if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
-return},
-gk:function(a){return C.t5.gk(this.a.childNodes)},
-gA:function(a){return this.a.childNodes.length},
-q:function(a,b){return this.a.childNodes[b]},
-$asLU:function(){return[W.K]},
-$aszM:function(){return[W.K]}},
-K:{"^":"D0;",
-wg:function(a){var z=a.parentNode
-if(z!=null)z.removeChild(a)},
-w:function(a){var z=a.nodeValue
-return z==null?this.UG(a):z},
-$isK:1,
-$isMh:1,
-"%":";Node"},
-BH:{"^":"Gb;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.K]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"NodeList|RadioNodeList"},
-xt:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[W.K]},
-$isqC:1},
-Gb:{"^":"xt+Gm;",$iszM:1,
-$aszM:function(){return[W.K]},
-$isqC:1},
-G7:{"^":"qE;oc:name=","%":"HTMLObjectElement"},
-wL:{"^":"qE;oc:name=","%":"HTMLOutputElement"},
-HD:{"^":"qE;oc:name=","%":"HTMLParamElement"},
-O4:{"^":"vB;",$isvB:1,"%":"Path2D"},
-qp:{"^":"vB;A:length=",$isMh:1,"%":"Plugin"},
-Ev:{"^":"ma;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.qp]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"PluginArray"},
-nj:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[W.qp]},
-$isqC:1},
-ma:{"^":"nj+Gm;",$iszM:1,
-$aszM:function(){return[W.qp]},
-$isqC:1},
-dK:{"^":"D0;",
-wR:function(a,b){return a.send(b)},
-"%":"DataChannel|RTCDataChannel"},
-p8:{"^":"vB;",$isp8:1,$isMh:1,"%":"RTCStatsReport"},
-qI:{"^":"qE;",$isqI:1,"%":"HTMLScriptElement"},
-lp:{"^":"qE;A:length=,oc:name=","%":"HTMLSelectElement"},
-Ji:{"^":"D0;",$isD0:1,$isvB:1,"%":"SharedWorker"},
-x8:{"^":"D0;",$isMh:1,"%":"SourceBuffer"},
-Mk:{"^":"mr;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.x8]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"SourceBufferList"},
-Vc:{"^":"D0+lD;",$iszM:1,
-$aszM:function(){return[W.x8]},
-$isqC:1},
-mr:{"^":"Vc+Gm;",$iszM:1,
-$aszM:function(){return[W.x8]},
-$isqC:1},
-Y4:{"^":"vB;",$isMh:1,"%":"SpeechGrammar"},
-Nn:{"^":"ecX;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.Y4]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"SpeechGrammarList"},
-qb:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[W.Y4]},
-$isqC:1},
-ecX:{"^":"qb+Gm;",$iszM:1,
-$aszM:function(){return[W.Y4]},
-$isqC:1},
-zD:{"^":"ea;kc:error=","%":"SpeechRecognitionError"},
-vK:{"^":"vB;A:length=",$isMh:1,"%":"SpeechRecognitionResult"},
-As:{"^":"vB;",
-q:function(a,b){return a.getItem(b)},
-U:function(a,b){var z,y
-for(z=0;!0;++z){y=a.key(z)
-if(y==null)return
-b.$2(y,a.getItem(y))}},
-gA:function(a){return a.length},
-"%":"Storage"},
-WW:{"^":"vB;",$isMh:1,"%":"CSSStyleSheet|StyleSheet"},
-Tb:{"^":"qE;",
-O:function(a,b,c,d){var z,y
-if("createContextualFragment" in window.Range.prototype)return this.DW(a,b,c,d)
-z=W.U9("<table>"+H.d(b)+"</table>",c,d)
-y=document.createDocumentFragment()
-y.toString
-z.toString
-new W.e7(y).FV(0,new W.e7(z))
-return y},
-"%":"HTMLTableElement"},
-Iv:{"^":"qE;",
-O:function(a,b,c,d){var z,y,x,w
-if("createContextualFragment" in window.Range.prototype)return this.DW(a,b,c,d)
-z=document.createDocumentFragment()
-y=document
-y=C.Ie.O(y.createElement("table"),b,c,d)
-y.toString
-y=new W.e7(y)
-x=y.gV(y)
-x.toString
-y=new W.e7(x)
-w=y.gV(y)
-z.toString
-w.toString
-new W.e7(z).FV(0,new W.e7(w))
-return z},
-"%":"HTMLTableRowElement"},
-BT:{"^":"qE;",
-O:function(a,b,c,d){var z,y,x
-if("createContextualFragment" in window.Range.prototype)return this.DW(a,b,c,d)
-z=document.createDocumentFragment()
-y=document
-y=C.Ie.O(y.createElement("table"),b,c,d)
-y.toString
-y=new W.e7(y)
-x=y.gV(y)
-z.toString
-x.toString
-new W.e7(z).FV(0,new W.e7(x))
-return z},
-"%":"HTMLTableSectionElement"},
-yY:{"^":"qE;",$isyY:1,"%":"HTMLTemplateElement"},
-FB:{"^":"qE;oc:name=","%":"HTMLTextAreaElement"},
-A1:{"^":"D0;",$isMh:1,"%":"TextTrack"},
-MN:{"^":"D0;",$isMh:1,"%":"TextTrackCue|VTTCue"},
-K8:{"^":"w1p;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$isXj:1,
-$isDD:1,
-$iszM:1,
-$aszM:function(){return[W.MN]},
-$isqC:1,
-"%":"TextTrackCueList"},
-RAp:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[W.MN]},
-$isqC:1},
-w1p:{"^":"RAp+Gm;",$iszM:1,
-$aszM:function(){return[W.MN]},
-$isqC:1},
-nJ:{"^":"bD;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.A1]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"TextTrackList"},
-KS:{"^":"D0+lD;",$iszM:1,
-$aszM:function(){return[W.A1]},
-$isqC:1},
-bD:{"^":"KS+Gm;",$iszM:1,
-$aszM:function(){return[W.A1]},
-$isqC:1},
-M0:{"^":"vB;A:length=","%":"TimeRanges"},
-a3:{"^":"vB;",$isMh:1,"%":"Touch"},
-o4:{"^":"kEI;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.a3]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"TouchList"},
-nNL:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[W.a3]},
-$isqC:1},
-kEI:{"^":"nNL+Gm;",$iszM:1,
-$aszM:function(){return[W.a3]},
-$isqC:1},
-w6:{"^":"ea;","%":"CompositionEvent|FocusEvent|KeyboardEvent|SVGZoomEvent|TextEvent|TouchEvent;UIEvent"},
-Fj:{"^":"vB;",
-w:function(a){return String(a)},
-$isvB:1,
-"%":"URL"},
-vX:{"^":"D0;A:length=","%":"VideoTrackList"},
-wf:{"^":"vB;A:length=","%":"VTTRegionList"},
-EK:{"^":"D0;",
-wR:function(a,b){return a.send(b)},
-"%":"WebSocket"},
-K5:{"^":"D0;",$isvB:1,$isD0:1,"%":"DOMWindow|Window"},
-ny:{"^":"D0;",$isD0:1,$isvB:1,"%":"Worker"},
-Cm:{"^":"D0;",$isvB:1,"%":"DedicatedWorkerGlobalScope|ServiceWorkerGlobalScope|SharedWorkerGlobalScope|WorkerGlobalScope"},
-RX:{"^":"K;oc:name=","%":"Attr"},
-ia:{"^":"vB;",$isMh:1,"%":"CSSPrimitiveValue;CSSValue;hw|lS"},
-YC:{"^":"vB;L:height=,H:left=,T:top=,P:width=",
-w:function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},
-D:function(a,b){var z,y,x
-if(b==null)return!1
-z=J.v(b)
-if(!z.$istn)return!1
-y=a.left
-x=z.gH(b)
-if(y==null?x==null:y===x){y=a.top
-x=z.gT(b)
-if(y==null?x==null:y===x){y=a.width
-x=z.gP(b)
-if(y==null?x==null:y===x){y=a.height
-z=z.gL(b)
-z=y==null?z==null:y===z}else z=!1}else z=!1}else z=!1
-return z},
-gM:function(a){var z,y,x,w
-z=J.hf(a.left)
-y=J.hf(a.top)
-x=J.hf(a.width)
-w=J.hf(a.height)
-return W.Up(W.C0(W.C0(W.C0(W.C0(0,z),y),x),w))},
-$istn:1,
-$astn:I.HU,
-"%":"ClientRect"},
-S3:{"^":"x5e;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$isXj:1,
-$isDD:1,
-$iszM:1,
-$aszM:function(){return[P.tn]},
-$isqC:1,
-"%":"ClientRectList|DOMRectList"},
-yoo:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[P.tn]},
-$isqC:1},
-x5e:{"^":"yoo+Gm;",$iszM:1,
-$aszM:function(){return[P.tn]},
-$isqC:1},
-PR:{"^":"HRa;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.lw]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"CSSRuleList"},
-zLC:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[W.lw]},
-$isqC:1},
-HRa:{"^":"zLC+Gm;",$iszM:1,
-$aszM:function(){return[W.lw]},
-$isqC:1},
-VE:{"^":"lS;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.ia]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"CSSValueList|WebKitCSSFilterValue|WebKitCSSTransformValue"},
-hw:{"^":"ia+lD;",$iszM:1,
-$aszM:function(){return[W.ia]},
-$isqC:1},
-lS:{"^":"hw+Gm;",$iszM:1,
-$aszM:function(){return[W.ia]},
-$isqC:1},
-hq:{"^":"K;",$isvB:1,"%":"DocumentType"},
-w4:{"^":"IB;",
-gL:function(a){return a.height},
-gP:function(a){return a.width},
-"%":"DOMRect"},
-Ij:{"^":"t7i;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.GO]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"GamepadList"},
-dxW:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[W.GO]},
-$isqC:1},
-t7i:{"^":"dxW+Gm;",$iszM:1,
-$aszM:function(){return[W.GO]},
-$isqC:1},
-Nf:{"^":"qE;",$isD0:1,$isvB:1,"%":"HTMLFrameSetElement"},
-rh:{"^":"rrb;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.K]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"MozNamedAttrMap|NamedNodeMap"},
-hmZ:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[W.K]},
-$isqC:1},
-rrb:{"^":"hmZ+Gm;",$iszM:1,
-$aszM:function(){return[W.K]},
-$isqC:1},
-XT:{"^":"D0;",$isD0:1,$isvB:1,"%":"ServiceWorker"},
-LO:{"^":"rla;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.vK]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"SpeechRecognitionResultList"},
-xth:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[W.vK]},
-$isqC:1},
-rla:{"^":"xth+Gm;",$iszM:1,
-$aszM:function(){return[W.vK]},
-$isqC:1},
-i9:{"^":"Gba;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a[b]},
-W:function(a,b){return a[b]},
-$iszM:1,
-$aszM:function(){return[W.WW]},
-$isqC:1,
-$isXj:1,
-$isDD:1,
-"%":"StyleSheetList"},
-Ocb:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[W.WW]},
-$isqC:1},
-Gba:{"^":"Ocb+Gm;",$iszM:1,
-$aszM:function(){return[W.WW]},
-$isqC:1},
-jx:{"^":"vB;",$isvB:1,"%":"WorkerLocation"},
-Iz:{"^":"vB;",$isvB:1,"%":"WorkerNavigator"},
-D9:{"^":"Mh;dA:a<",
-U:function(a,b){var z,y,x,w,v
-for(z=this.gvc(this),y=z.length,x=this.a,w=0;w<z.length;z.length===y||(0,H.lk)(z),++w){v=z[w]
-b.$2(v,x.getAttribute(v))}},
-gvc:function(a){var z,y,x,w,v
-z=this.a.attributes
-y=H.VM([],[P.qU])
-for(x=z.length,w=0;w<x;++w){v=z[w]
-if(v.namespaceURI==null)y.push(J.Ay(v))}return y}},
-i7:{"^":"D9;a",
-q:function(a,b){return this.a.getAttribute(b)},
-gA:function(a){return this.gvc(this).length}},
-I4:{"^":"hx;dA:a<",
-DG:function(){var z,y,x,w,v
-z=P.Ls(null,null,null,P.qU)
-for(y=this.a.className.split(" "),x=y.length,w=0;w<y.length;y.length===x||(0,H.lk)(y),++w){v=J.T0(y[w])
-if(v.length!==0)z.AN(0,v)}return z},
-p5:function(a){this.a.className=a.zV(0," ")},
-gA:function(a){return this.a.classList.length},
-tg:function(a,b){return typeof b==="string"&&this.a.classList.contains(b)},
-AN:function(a,b){var z,y
-z=this.a.classList
-y=z.contains(b)
-z.add(b)
-return!y},
-Rz:function(a,b){var z,y,x
-z=this.a.classList
-y=z.contains(b)
-z.remove(b)
-x=y
-return x}},
-RO:{"^":"qh;",
-X5:function(a,b,c,d){var z=new W.xC(0,this.a,this.b,W.aF(a),!1)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-z.DN()
-return z}},
-Cq:{"^":"RO;a,b,c"},
-xC:{"^":"MO;a,b,c,d,e",
-Gv:function(a){if(this.b==null)return
-this.EO()
-this.b=null
-this.d=null
-return},
-DN:function(){var z=this.d
-if(z!=null&&this.a<=0)J.dZ(this.b,this.c,z,!1)},
-EO:function(){var z=this.d
-if(z!=null)J.EJ(this.b,this.c,z,!1)}},
-JQ:{"^":"Mh;a",
-i0:function(a){return $.$get$zX().tg(0,W.rS(a))},
-Eb:function(a,b,c){var z,y,x
-z=W.rS(a)
-y=$.$get$or()
-x=y.q(0,H.d(z)+"::"+b)
-if(x==null)x=y.q(0,"*::"+b)
-if(x==null)return!1
-return x.$4(a,b,c,this)},
-CY:function(a){var z,y
-z=$.$get$or()
-if(z.gl0(z)){for(y=0;y<262;++y)z.t(0,C.cm[y],W.pS())
-for(y=0;y<12;++y)z.t(0,C.BI[y],W.V4())}},
-$iskF:1,
-static:{
-Tw:function(a){var z,y
-z=document
-y=z.createElement("a")
-z=new W.mk(y,window.location)
-z=new W.JQ(z)
-z.CY(a)
-return z},
-qD:[function(a,b,c,d){return!0},"$4","pS",8,0,7],
-QW:[function(a,b,c,d){var z,y,x,w,v
-z=d.a
-y=z.a
-y.href=c
-x=y.hostname
-z=z.b
-w=z.hostname
-if(x==null?w==null:x===w){w=y.port
-v=z.port
-if(w==null?v==null:w===v){w=y.protocol
-z=z.protocol
-z=w==null?z==null:w===z}else z=!1}else z=!1
-if(!z)if(x==="")if(y.port===""){z=y.protocol
-z=z===":"||z===""}else z=!1
-else z=!1
-else z=!0
-return z},"$4","V4",8,0,7]}},
-Gm:{"^":"Mh;",
-gk:function(a){return new W.W9(a,this.gA(a),-1,null)},
-$iszM:1,
-$aszM:null,
-$isqC:1},
-vD:{"^":"Mh;a",
-i0:function(a){return C.Nm.Vr(this.a,new W.mD(a))},
-Eb:function(a,b,c){return C.Nm.Vr(this.a,new W.Eg(a,b,c))}},
-mD:{"^":"L:1;a",
-$1:function(a){return a.i0(this.a)}},
-Eg:{"^":"L:1;a,b,c",
-$1:function(a){return a.Eb(this.a,this.b,this.c)}},
-m6:{"^":"Mh;",
-i0:function(a){return this.a.tg(0,W.rS(a))},
-Eb:["jF",function(a,b,c){var z,y
-z=W.rS(a)
-y=this.c
-if(y.tg(0,H.d(z)+"::"+b))return this.d.Dt(c)
-else if(y.tg(0,"*::"+b))return this.d.Dt(c)
-else{y=this.b
-if(y.tg(0,H.d(z)+"::"+b))return!0
-else if(y.tg(0,"*::"+b))return!0
-else if(y.tg(0,H.d(z)+"::*"))return!0
-else if(y.tg(0,"*::*"))return!0}return!1}],
-CY:function(a,b,c,d){var z,y,x
-this.a.FV(0,c)
-z=b.S(0,new W.Eo())
-y=b.S(0,new W.Wk())
-this.b.FV(0,z)
-x=this.c
-x.FV(0,C.xD)
-x.FV(0,y)}},
-Eo:{"^":"L:1;",
-$1:function(a){return!C.Nm.tg(C.BI,a)}},
-Wk:{"^":"L:1;",
-$1:function(a){return C.Nm.tg(C.BI,a)}},
-ct:{"^":"m6;e,a,b,c,d",
-Eb:function(a,b,c){if(this.jF(a,b,c))return!0
-if(b==="template"&&c==="")return!0
-if(a.getAttribute("template")==="")return this.e.tg(0,b)
-return!1},
-static:{
-Bl:function(){var z,y,x,w
-z=H.VM(new H.A8(C.Qx,new W.IA()),[null,null])
-y=P.Ls(null,null,null,P.qU)
-x=P.Ls(null,null,null,P.qU)
-w=P.Ls(null,null,null,P.qU)
-w=new W.ct(P.tM(C.Qx,P.qU),y,x,w,null)
-w.CY(null,z,["TEMPLATE"],null)
-return w}}},
-IA:{"^":"L:1;",
-$1:function(a){return"TEMPLATE::"+H.d(a)}},
-Ow:{"^":"Mh;",
-i0:function(a){var z=J.v(a)
-if(!!z.$isj2)return!1
-z=!!z.$isd5
-if(z&&W.rS(a)==="foreignObject")return!1
-if(z)return!0
-return!1},
-Eb:function(a,b,c){if(b==="is"||C.xB.nC(b,"on"))return!1
-return this.i0(a)}},
-W9:{"^":"Mh;a,b,c,d",
-F:function(){var z,y
-z=this.c+1
-y=this.b
-if(z<y){this.d=J.w2(this.a,z)
-this.c=z
-return!0}this.d=null
-this.c=y
-return!1},
-gl:function(){return this.d}},
-dW:{"^":"Mh;a",
-On:function(a,b,c,d){return H.vh(new P.ub("You can only attach EventListeners to your own window."))},
-Y9:function(a,b,c,d){return H.vh(new P.ub("You can only attach EventListeners to your own window."))},
-$isD0:1,
-$isvB:1,
-static:{
-P1:function(a){if(a===window)return a
-else return new W.dW(a)}}},
-kF:{"^":"Mh;"},
-x:{"^":"Mh;",
-Pn:function(a){}},
-mk:{"^":"Mh;a,b"},
-MM:{"^":"Mh;a",
-Pn:function(a){new W.fm(this).$2(a,null)},
-EP:function(a,b){if(b==null)J.Ns(a)
-else b.removeChild(a)},
-I4:function(a,b){var z,y,x,w,v,u,t,s
-z=!0
-y=null
-x=null
-try{y=J.Q1(a)
-x=y.gdA().getAttribute("is")
-w=function(c){if(!(c.attributes instanceof NamedNodeMap))return true
-var r=c.childNodes
-if(c.lastChild&&c.lastChild!==r[r.length-1])return true
-if(c.children)if(!(c.children instanceof HTMLCollection||c.children instanceof NodeList))return true
-var q=0
-if(c.children)q=c.children.length
-for(var p=0;p<q;p++){var o=c.children[p]
-if(o.id=='attributes'||o.name=='attributes'||o.id=='lastChild'||o.name=='lastChild'||o.id=='children'||o.name=='children')return true}return false}(a)
-z=w?!0:!(a.attributes instanceof NamedNodeMap)}catch(t){H.p(t)}v="element unprintable"
-try{v=J.A(a)}catch(t){H.p(t)}try{u=W.rS(a)
-this.kR(a,b,z,v,u,y,x)}catch(t){if(H.p(t) instanceof P.AT)throw t
-else{this.EP(a,b)
-window
-s="Removing corrupted element "+H.d(v)
-if(typeof console!="undefined")console.warn(s)}}},
-kR:function(a,b,c,d,e,f,g){var z,y,x,w,v
-if(c){this.EP(a,b)
-window
-z="Removing element due to corrupted attributes on <"+d+">"
-if(typeof console!="undefined")console.warn(z)
-return}if(!this.a.i0(a)){this.EP(a,b)
-window
-z="Removing disallowed element <"+H.d(e)+"> from "+J.A(b)
-if(typeof console!="undefined")console.warn(z)
-return}if(g!=null)if(!this.a.Eb(a,"is",g)){this.EP(a,b)
-window
-z="Removing disallowed type extension <"+H.d(e)+' is="'+g+'">'
-if(typeof console!="undefined")console.warn(z)
-return}z=f.gvc(f)
-y=H.VM(z.slice(),[H.Kp(z,0)])
-for(x=f.gvc(f).length-1,z=f.a;x>=0;--x){w=y[x]
-if(!this.a.Eb(a,J.cH(w),z.getAttribute(w))){window
-v="Removing disallowed attribute <"+H.d(e)+" "+w+'="'+H.d(z.getAttribute(w))+'">'
-if(typeof console!="undefined")console.warn(v)
-z.getAttribute(w)
-z.removeAttribute(w)}}if(!!J.v(a).$isyY)this.Pn(a.content)}},
-fm:{"^":"L:15;a",
-$2:function(a,b){var z,y,x
-z=this.a
-switch(a.nodeType){case 1:z.I4(a,b)
-break
-case 8:case 11:case 3:case 4:break
-default:z.EP(a,b)}y=a.lastChild
-for(;y!=null;y=x){x=y.previousSibling
-this.$2(y,a)}}}}],["","",,P,{"^":"",tK:{"^":"vB;",$istK:1,$isMh:1,"%":"IDBIndex"},m9:{"^":"D0;kc:error=","%":"IDBOpenDBRequest|IDBRequest|IDBVersionChangeRequest"},nq:{"^":"D0;kc:error=","%":"IDBTransaction"}}],["","",,P,{"^":"",Y0:{"^":"tp;",$isvB:1,"%":"SVGAElement"},ZJ:{"^":"Pt;",$isvB:1,"%":"SVGAltGlyphElement"},ui:{"^":"d5;",$isvB:1,"%":"SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGSetElement"},jw:{"^":"d5;",$isvB:1,"%":"SVGFEBlendElement"},lv:{"^":"d5;",$isvB:1,"%":"SVGFEColorMatrixElement"},pf:{"^":"d5;",$isvB:1,"%":"SVGFEComponentTransferElement"},py:{"^":"d5;",$isvB:1,"%":"SVGFECompositeElement"},Ef:{"^":"d5;",$isvB:1,"%":"SVGFEConvolveMatrixElement"},zo:{"^":"d5;",$isvB:1,"%":"SVGFEDiffuseLightingElement"},q6:{"^":"d5;",$isvB:1,"%":"SVGFEDisplacementMapElement"},ih:{"^":"d5;",$isvB:1,"%":"SVGFEFloodElement"},v6:{"^":"d5;",$isvB:1,"%":"SVGFEGaussianBlurElement"},me:{"^":"d5;",$isvB:1,"%":"SVGFEImageElement"},oB:{"^":"d5;",$isvB:1,"%":"SVGFEMergeElement"},yu:{"^":"d5;",$isvB:1,"%":"SVGFEMorphologyElement"},MI:{"^":"d5;",$isvB:1,"%":"SVGFEOffsetElement"},bM:{"^":"d5;",$isvB:1,"%":"SVGFESpecularLightingElement"},Qy:{"^":"d5;",$isvB:1,"%":"SVGFETileElement"},ju:{"^":"d5;",$isvB:1,"%":"SVGFETurbulenceElement"},OE:{"^":"d5;",$isvB:1,"%":"SVGFilterElement"},BA:{"^":"tp;",$isBA:1,"%":"SVGGElement"},tp:{"^":"d5;",$isvB:1,"%":"SVGCircleElement|SVGClipPathElement|SVGDefsElement|SVGEllipseElement|SVGForeignObjectElement|SVGGeometryElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement|SVGRectElement|SVGSwitchElement;SVGGraphicsElement"},rE:{"^":"tp;",$isvB:1,"%":"SVGImageElement"},Xk:{"^":"vB;",$isMh:1,"%":"SVGLength"},jK:{"^":"maa;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a.getItem(b)},
-W:function(a,b){return this.q(a,b)},
-$iszM:1,
-$aszM:function(){return[P.Xk]},
-$isqC:1,
-"%":"SVGLengthList"},nja:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[P.Xk]},
-$isqC:1},maa:{"^":"nja+Gm;",$iszM:1,
-$aszM:function(){return[P.Xk]},
-$isqC:1},uz:{"^":"d5;",$isvB:1,"%":"SVGMarkerElement"},Yd:{"^":"d5;",$isvB:1,"%":"SVGMaskElement"},uP:{"^":"vB;",$isMh:1,"%":"SVGNumber"},ZZ:{"^":"e0;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a.getItem(b)},
-W:function(a,b){return this.q(a,b)},
-$iszM:1,
-$aszM:function(){return[P.uP]},
-$isqC:1,
-"%":"SVGNumberList"},qba:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[P.uP]},
-$isqC:1},e0:{"^":"qba+Gm;",$iszM:1,
-$aszM:function(){return[P.uP]},
-$isqC:1},XW:{"^":"vB;",$isMh:1,"%":"SVGPathSeg|SVGPathSegArcAbs|SVGPathSegArcRel|SVGPathSegClosePath|SVGPathSegCurvetoCubicAbs|SVGPathSegCurvetoCubicRel|SVGPathSegCurvetoCubicSmoothAbs|SVGPathSegCurvetoCubicSmoothRel|SVGPathSegCurvetoQuadraticAbs|SVGPathSegCurvetoQuadraticRel|SVGPathSegCurvetoQuadraticSmoothAbs|SVGPathSegCurvetoQuadraticSmoothRel|SVGPathSegLinetoAbs|SVGPathSegLinetoHorizontalAbs|SVGPathSegLinetoHorizontalRel|SVGPathSegLinetoRel|SVGPathSegLinetoVerticalAbs|SVGPathSegLinetoVerticalRel|SVGPathSegMovetoAbs|SVGPathSegMovetoRel"},Sv:{"^":"f0;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a.getItem(b)},
-W:function(a,b){return this.q(a,b)},
-$iszM:1,
-$aszM:function(){return[P.XW]},
-$isqC:1,
-"%":"SVGPathSegList"},R1:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[P.XW]},
-$isqC:1},f0:{"^":"R1+Gm;",$iszM:1,
-$aszM:function(){return[P.XW]},
-$isqC:1},Gr:{"^":"d5;",$isvB:1,"%":"SVGPatternElement"},ED:{"^":"vB;A:length=","%":"SVGPointList"},j2:{"^":"d5;",$isj2:1,$isvB:1,"%":"SVGScriptElement"},Kq:{"^":"g0;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a.getItem(b)},
-W:function(a,b){return this.q(a,b)},
-$iszM:1,
-$aszM:function(){return[P.qU]},
-$isqC:1,
-"%":"SVGStringList"},S1:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[P.qU]},
-$isqC:1},g0:{"^":"S1+Gm;",$iszM:1,
-$aszM:function(){return[P.qU]},
-$isqC:1},O7:{"^":"hx;a",
-DG:function(){var z,y,x,w,v,u
-z=this.a.getAttribute("class")
-y=P.Ls(null,null,null,P.qU)
-if(z==null)return y
-for(x=z.split(" "),w=x.length,v=0;v<x.length;x.length===w||(0,H.lk)(x),++v){u=J.T0(x[v])
-if(u.length!==0)y.AN(0,u)}return y},
-p5:function(a){this.a.setAttribute("class",a.zV(0," "))}},d5:{"^":"cv;",
-gDD:function(a){return new P.O7(a)},
-O:function(a,b,c,d){var z,y,x,w,v
-if(c==null){z=H.VM([],[W.kF])
-d=new W.vD(z)
-z.push(W.Tw(null))
-z.push(W.Bl())
-z.push(new W.Ow())
-c=new W.MM(d)}y='<svg version="1.1">'+H.d(b)+"</svg>"
-z=document.body
-x=(z&&C.RY).E(z,y,c)
-w=document.createDocumentFragment()
-x.toString
-z=new W.e7(x)
-v=z.gV(z)
-for(;z=v.firstChild,z!=null;)w.appendChild(z)
-return w},
-$isd5:1,
-$isD0:1,
-$isvB:1,
-"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGComponentTransferFunctionElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFEPointLightElement|SVGFESpotLightElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGHKernElement|SVGMetadataElement|SVGMissingGlyphElement|SVGStopElement|SVGStyleElement|SVGTitleElement|SVGVKernElement;SVGElement"},hy:{"^":"tp;",$isvB:1,"%":"SVGSVGElement"},aS:{"^":"d5;",$isvB:1,"%":"SVGSymbolElement"},mH:{"^":"tp;","%":";SVGTextContentElement"},Rk:{"^":"mH;",$isvB:1,"%":"SVGTextPathElement"},Pt:{"^":"mH;","%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},zY:{"^":"vB;",$isMh:1,"%":"SVGTransform"},DT:{"^":"h0;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return a.getItem(b)},
-W:function(a,b){return this.q(a,b)},
-$iszM:1,
-$aszM:function(){return[P.zY]},
-$isqC:1,
-"%":"SVGTransformList"},T1:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[P.zY]},
-$isqC:1},h0:{"^":"T1+Gm;",$iszM:1,
-$aszM:function(){return[P.zY]},
-$isqC:1},ox:{"^":"tp;",$isvB:1,"%":"SVGUseElement"},ZD:{"^":"d5;",$isvB:1,"%":"SVGViewElement"},bW:{"^":"vB;",$isvB:1,"%":"SVGViewSpec"},cu:{"^":"d5;",$isvB:1,"%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},We:{"^":"d5;",$isvB:1,"%":"SVGCursorElement"},cB:{"^":"d5;",$isvB:1,"%":"SVGFEDropShadowElement"},Pi:{"^":"d5;",$isvB:1,"%":"SVGGlyphRefElement"},zu:{"^":"d5;",$isvB:1,"%":"SVGMPathElement"}}],["","",,P,{"^":"",r2:{"^":"vB;A:length=","%":"AudioBuffer"}}],["","",,P,{"^":""}],["","",,P,{"^":"",Fn:{"^":"i0;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
-return P.mR(a.item(b))},
-W:function(a,b){return this.q(a,b)},
-$iszM:1,
-$aszM:function(){return[P.L8]},
-$isqC:1,
-"%":"SQLResultSetRowList"},U3:{"^":"vB+lD;",$iszM:1,
-$aszM:function(){return[P.L8]},
-$isqC:1},i0:{"^":"U3+Gm;",$iszM:1,
-$aszM:function(){return[P.L8]},
-$isqC:1}}],["","",,P,{"^":"",IU:{"^":"Mh;"}}],["","",,P,{"^":"",Ex:{"^":"Mh;"},tn:{"^":"Ex;",$astn:null}}],["","",,H,{"^":"",WZ:{"^":"vB;",$isWZ:1,"%":"ArrayBuffer"},ET:{"^":"vB;",$isET:1,"%":"DataView;ArrayBufferView;b0|fj|GV|Dg|pb|Ip|Pg"},b0:{"^":"ET;",
-gA:function(a){return a.length},
-$isXj:1,
-$isDD:1},Dg:{"^":"GV;",
-q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
-return a[b]}},fj:{"^":"b0+lD;",$iszM:1,
-$aszM:function(){return[P.CP]},
-$isqC:1},GV:{"^":"fj+SU;"},Pg:{"^":"Ip;",$iszM:1,
-$aszM:function(){return[P.KN]},
-$isqC:1},pb:{"^":"b0+lD;",$iszM:1,
-$aszM:function(){return[P.KN]},
-$isqC:1},Ip:{"^":"pb+SU;"},Hg:{"^":"Dg;",$iszM:1,
-$aszM:function(){return[P.CP]},
-$isqC:1,
-"%":"Float32Array"},fS:{"^":"Dg;",$iszM:1,
-$aszM:function(){return[P.CP]},
-$isqC:1,
-"%":"Float64Array"},xj:{"^":"Pg;",
-q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
-return a[b]},
-$iszM:1,
-$aszM:function(){return[P.KN]},
-$isqC:1,
-"%":"Int16Array"},dE:{"^":"Pg;",
-q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
-return a[b]},
-$iszM:1,
-$aszM:function(){return[P.KN]},
-$isqC:1,
-"%":"Int32Array"},ZA:{"^":"Pg;",
-q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
-return a[b]},
-$iszM:1,
-$aszM:function(){return[P.KN]},
-$isqC:1,
-"%":"Int8Array"},dT:{"^":"Pg;",
-q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
-return a[b]},
-$iszM:1,
-$aszM:function(){return[P.KN]},
-$isqC:1,
-"%":"Uint16Array"},nl:{"^":"Pg;",
-q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
-return a[b]},
-$iszM:1,
-$aszM:function(){return[P.KN]},
-$isqC:1,
-"%":"Uint32Array"},eE:{"^":"Pg;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
-return a[b]},
-$iszM:1,
-$aszM:function(){return[P.KN]},
-$isqC:1,
-"%":"CanvasPixelArray|Uint8ClampedArray"},V6:{"^":"Pg;",
-gA:function(a){return a.length},
-q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
-return a[b]},
-$iszM:1,
-$aszM:function(){return[P.KN]},
-$isqC:1,
-"%":";Uint8Array"}}],["","",,H,{"^":"",
-qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
-return}if(typeof console=="object"&&typeof console.log!="undefined"){console.log(a)
-return}if(typeof window=="object")return
-if(typeof print=="function"){print(a)
-return}throw"Unable to print message: "+String(a)}}],["","",,P,{"^":"",
-mR:function(a){var z,y,x,w,v
-if(a==null)return
-z=P.u5()
-y=Object.getOwnPropertyNames(a)
-for(x=y.length,w=0;w<y.length;y.length===x||(0,H.lk)(y),++w){v=y[w]
-z.t(0,v,a[v])}return z},
-hx:{"^":"Mh;",
-VL:function(a){if($.$get$X4().b.test(H.Yx(a)))return a
-throw H.b(P.L3(a,"value","Not a valid class token"))},
-w:function(a){return this.DG().zV(0," ")},
-O4:function(a,b,c){var z,y
-this.VL(b)
-z=this.DG()
-if(!z.tg(0,b)){z.AN(0,b)
-y=!0}else{z.Rz(0,b)
-y=!1}this.p5(z)
-return y},
-lo:function(a,b){return this.O4(a,b,null)},
-gk:function(a){var z,y
-z=this.DG()
-y=new P.lm(z,z.r,null,null)
-y.c=z.e
-return y},
-U:function(a,b){this.DG().U(0,b)},
-gA:function(a){return this.DG().a},
-tg:function(a,b){if(typeof b!=="string")return!1
-this.VL(b)
-return this.DG().tg(0,b)},
-Zt:function(a){return this.tg(0,a)?a:null},
-AN:function(a,b){this.VL(b)
-return this.OS(0,new P.GE(b))},
-Rz:function(a,b){var z,y
-this.VL(b)
-z=this.DG()
-y=z.Rz(0,b)
-this.p5(z)
-return y},
-OS:function(a,b){var z,y
-z=this.DG()
-y=b.$1(z)
-this.p5(z)
-return y},
-$isqC:1},
-GE:{"^":"L:1;a",
-$1:function(a){return a.AN(0,this.a)}}}],["","",,Z,{"^":"",
-E:[function(){var z,y,x,w,v,u,t
-z=$.$get$t().innerHTML
-try{y=self.Viz(z,"svg")
-Z.r(y)}catch(v){u=H.p(v)
-x=u
-u=J.A(x)
-t=C.oW.h(u,0,u.length)
-w="<pre>"+H.d(t==null?u:t)+"</pre>"
-u=document.body;(u&&C.RY).N(u,"beforeend",w,null,null)}},"$0","cK",0,0,2],
-r:function(a){var z,y,x,w,v
-z=document.body;(z&&C.RY).N(z,"beforeend",a,C.Hv,null)
-z=$.$get$hh()
-y=z.style
-y.display="block"
-$.v7=H.Go(document.querySelector("svg"),"$isd5")
-z.toString
-z=H.VM(new W.Cq(z,"click",!1),[null])
-H.VM(new W.xC(0,z.a,z.b,W.aF(new Z.AR()),!1),[H.Kp(z,0)]).DN()
-for(z=new W.wz($.v7.querySelectorAll("g.node")),z=z.gk(z);z.F();){x=z.d
-y=J.RE(x)
-y.sjO(x,y.Wk(x,"title").textContent)}for(z=new W.wz($.v7.querySelectorAll("g.edge")),z=z.gk(z);z.F();){w=z.d
-y=J.RE(w)
-v=y.Wk(w,"title").textContent.split("->")
-y.a7(w,"x-from",v[0])
-w.setAttribute("x-to",v[1])}z=$.v7
-z.toString
-z=H.VM(new W.Cq(z,"mouseover",!1),[null])
-H.VM(new W.xC(0,z.a,z.b,W.aF(new Z.lg()),!1),[H.Kp(z,0)]).DN()
-z=$.v7
-z.toString
-z=H.VM(new W.Cq(z,"mouseleave",!1),[null])
-H.VM(new W.xC(0,z.a,z.b,W.aF(new Z.qK()),!1),[H.Kp(z,0)]).DN()},
-ws:function(a){var z,y
-z=[]
-if(a!=null)if(new P.O7(a).tg(0,"edge"))C.Nm.FV(z,[a.getAttribute("x-to"),a.getAttribute("x-from")])
-else z.push(a.id)
-y=new W.wz($.v7.querySelectorAll("g.node"))
-y.U(y,new Z.tb(z))
-y=new W.wz($.v7.querySelectorAll("g.edge"))
-y.U(y,new Z.GJ(z))},
-AR:{"^":"L:1;",
-$1:function(a){var z=$.v7
-z.toString
-new P.O7(z).lo(0,"zoom")}},
-lg:{"^":"L:5;",
-$1:function(a){var z,y
-z=H.Go(W.qc(a.relatedTarget),"$iscv")
-while(!0){y=z!=null
-if(!(y&&!J.v(z).$isBA))break
-z=z.parentElement}if(y){y=J.RE(z)
-y=y.gDD(z).tg(0,"edge")||y.gDD(z).tg(0,"node")}else y=!1
-if(y)Z.ws(z)
-else Z.ws(null)}},
-qK:{"^":"L:5;",
-$1:function(a){Z.ws(null)}},
-tb:{"^":"L:6;a",
-$1:function(a){var z=J.RE(a)
-if(C.Nm.tg(this.a,a.id))z.gDD(a).AN(0,"active")
-else z.gDD(a).Rz(0,"active")}},
-GJ:{"^":"L:6;a",
-$1:function(a){var z,y
-z=this.a
-if(z.length===2){z=C.Nm.tg(z,a.getAttribute("x-to"))&&C.Nm.tg(z,a.getAttribute("x-from"))
-y=J.RE(a)
-if(z)y.gDD(a).AN(0,"active")
-else y.gDD(a).Rz(0,"active")}else{z=C.Nm.tg(z,a.getAttribute("x-to"))||C.Nm.tg(z,a.getAttribute("x-from"))
-y=J.RE(a)
-if(z)y.gDD(a).AN(0,"active")
-else y.gDD(a).Rz(0,"active")}}}},1]]
-setupProgram(dart,0)
-J.RE=function(a){if(a==null)return a
-if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype
-return a}if(a instanceof P.Mh)return a
-return J.m(a)}
-J.U6=function(a){if(typeof a=="string")return J.Dr.prototype
-if(a==null)return a
-if(a.constructor==Array)return J.jd.prototype
-if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype
-return a}if(a instanceof P.Mh)return a
-return J.m(a)}
-J.Wx=function(a){if(typeof a=="number")return J.jX.prototype
-if(a==null)return a
-if(!(a instanceof P.Mh))return J.k.prototype
-return a}
-J.rY=function(a){if(typeof a=="string")return J.Dr.prototype
-if(a==null)return a
-if(!(a instanceof P.Mh))return J.k.prototype
-return a}
-J.v=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.im.prototype
-return J.VA.prototype}if(typeof a=="string")return J.Dr.prototype
-if(a==null)return J.PE.prototype
-if(typeof a=="boolean")return J.yE.prototype
-if(a.constructor==Array)return J.jd.prototype
-if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype
-return a}if(a instanceof P.Mh)return a
-return J.m(a)}
-J.w1=function(a){if(a==null)return a
-if(a.constructor==Array)return J.jd.prototype
-if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype
-return a}if(a instanceof P.Mh)return a
-return J.m(a)}
-J.A=function(a){return J.v(a).w(a)}
-J.Ay=function(a){return J.RE(a).goc(a)}
-J.EJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
-J.GA=function(a,b){return J.w1(a).W(a,b)}
-J.Gq=function(a,b){return J.RE(a).sLU(a,b)}
-J.Hm=function(a){return J.U6(a).gA(a)}
-J.IT=function(a){return J.w1(a).gk(a)}
-J.Ns=function(a){return J.w1(a).wg(a)}
-J.Ob=function(a){return J.RE(a).gns(a)}
-J.Q1=function(a){return J.RE(a).gQg(a)}
-J.RM=function(a,b){if(a==null)return b==null
-if(typeof a!="object")return b!=null&&a===b
-return J.v(a).D(a,b)}
-J.T0=function(a){return J.rY(a).bS(a)}
-J.TT=function(a,b){return J.RE(a).wR(a,b)}
-J.YA=function(a){return J.RE(a).gkc(a)}
-J.aa=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
-return J.Wx(a).B(a,b)}
-J.cH=function(a){return J.rY(a).hc(a)}
-J.dZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
-J.hE=function(a,b){return J.w1(a).U(a,b)}
-J.hf=function(a){return J.v(a).gM(a)}
-J.iu=function(a,b){return J.w1(a).ez(a,b)}
-J.ld=function(a,b,c){return J.rY(a).C(a,b,c)}
-J.w2=function(a,b){if(typeof b==="number")if(a.constructor==Array||typeof a=="string"||H.wV(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
-return J.U6(a).q(a,b)}
-I.uL=function(a){a.immutable$list=Array
-a.fixed$length=Array
-return a}
-var $=I.p
-C.RY=W.QP.prototype
-C.Ok=J.vB.prototype
-C.Nm=J.jd.prototype
-C.jn=J.im.prototype
-C.xB=J.Dr.prototype
-C.DG=J.c5.prototype
-C.t5=W.BH.prototype
-C.ZQ=J.iC.prototype
-C.Ie=W.Tb.prototype
-C.vB=J.k.prototype
-C.KZ=new H.hJ()
-C.NU=new P.R8()
-C.Hv=new W.x()
-C.RT=new P.a6(0)
-C.Hw=new P.fU("unknown",!0,!0,!0,!0)
-C.oW=new P.Rc(C.Hw)
-C.Mc=function(hooks) {
-  if (typeof dartExperimentalFixupGetTag != "function") return hooks;
-  hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
-}
-C.lR=function(hooks) {
-  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
-  if (userAgent.indexOf("Firefox") == -1) return hooks;
-  var getTag = hooks.getTag;
-  var quickMap = {
-    "BeforeUnloadEvent": "Event",
-    "DataTransfer": "Clipboard",
-    "GeoGeolocation": "Geolocation",
-    "Location": "!Location",
-    "WorkerMessageEvent": "MessageEvent",
-    "XMLDocument": "!Document"};
-  function getTagFirefox(o) {
-    var tag = getTag(o);
-    return quickMap[tag] || tag;
-  }
-  hooks.getTag = getTagFirefox;
-}
-C.w2=function getTagFallback(o) {
-  var constructor = o.constructor;
-  if (typeof constructor == "function") {
-    var name = constructor.name;
-    if (typeof name == "string" &&
-        name.length > 2 &&
-        name !== "Object" &&
-        name !== "Function.prototype") {
-      return name;
-    }
-  }
-  var s = Object.prototype.toString.call(o);
-  return s.substring(8, s.length - 1);
-}
-C.XQ=function(hooks) { return hooks; }
-
-C.ur=function(getTagFallback) {
-  return function(hooks) {
-    if (typeof navigator != "object") return hooks;
-    var ua = navigator.userAgent;
-    if (ua.indexOf("DumpRenderTree") >= 0) return hooks;
-    if (ua.indexOf("Chrome") >= 0) {
-      function confirm(p) {
-        return typeof window == "object" && window[p] && window[p].name == p;
-      }
-      if (confirm("Window") && confirm("HTMLElement")) return hooks;
-    }
-    hooks.getTag = getTagFallback;
-  };
-}
-C.Jh=function(hooks) {
-  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
-  if (userAgent.indexOf("Trident/") == -1) return hooks;
-  var getTag = hooks.getTag;
-  var quickMap = {
-    "BeforeUnloadEvent": "Event",
-    "DataTransfer": "Clipboard",
-    "HTMLDDElement": "HTMLElement",
-    "HTMLDTElement": "HTMLElement",
-    "HTMLPhraseElement": "HTMLElement",
-    "Position": "Geoposition"
-  };
-  function getTagIE(o) {
-    var tag = getTag(o);
-    var newTag = quickMap[tag];
-    if (newTag) return newTag;
-    if (tag == "Object") {
-      if (window.DataView && (o instanceof window.DataView)) return "DataView";
-    }
-    return tag;
-  }
-  function prototypeForTagIE(tag) {
-    var constructor = window[tag];
-    if (constructor == null) return null;
-    return constructor.prototype;
-  }
-  hooks.getTag = getTagIE;
-  hooks.prototypeForTag = prototypeForTagIE;
-}
-C.M1=function() {
-  function typeNameInChrome(o) {
-    var constructor = o.constructor;
-    if (constructor) {
-      var name = constructor.name;
-      if (name) return name;
-    }
-    var s = Object.prototype.toString.call(o);
-    return s.substring(8, s.length - 1);
-  }
-  function getUnknownTag(object, tag) {
-    if (/^HTML[A-Z].*Element$/.test(tag)) {
-      var name = Object.prototype.toString.call(object);
-      if (name == "[object Object]") return null;
-      return "HTMLElement";
-    }
-  }
-  function getUnknownTagGenericBrowser(object, tag) {
-    if (self.HTMLElement && object instanceof HTMLElement) return "HTMLElement";
-    return getUnknownTag(object, tag);
-  }
-  function prototypeForTag(tag) {
-    if (typeof window == "undefined") return null;
-    if (typeof window[tag] == "undefined") return null;
-    var constructor = window[tag];
-    if (typeof constructor != "function") return null;
-    return constructor.prototype;
-  }
-  function discriminator(tag) { return null; }
-  var isBrowser = typeof navigator == "object";
-  return {
-    getTag: typeNameInChrome,
-    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
-    prototypeForTag: prototypeForTag,
-    discriminator: discriminator };
-}
-C.hQ=function(hooks) {
-  var getTag = hooks.getTag;
-  var prototypeForTag = hooks.prototypeForTag;
-  function getTagFixed(o) {
-    var tag = getTag(o);
-    if (tag == "Document") {
-      if (!!o.xmlVersion) return "!Document";
-      return "!HTMLDocument";
-    }
-    return tag;
-  }
-  function prototypeForTagFixed(tag) {
-    if (tag == "Document") return null;
-    return prototypeForTag(tag);
-  }
-  hooks.getTag = getTagFixed;
-  hooks.prototypeForTag = prototypeForTagFixed;
-}
-C.cm=H.VM(I.uL(["*::class","*::dir","*::draggable","*::hidden","*::id","*::inert","*::itemprop","*::itemref","*::itemscope","*::lang","*::spellcheck","*::title","*::translate","A::accesskey","A::coords","A::hreflang","A::name","A::shape","A::tabindex","A::target","A::type","AREA::accesskey","AREA::alt","AREA::coords","AREA::nohref","AREA::shape","AREA::tabindex","AREA::target","AUDIO::controls","AUDIO::loop","AUDIO::mediagroup","AUDIO::muted","AUDIO::preload","BDO::dir","BODY::alink","BODY::bgcolor","BODY::link","BODY::text","BODY::vlink","BR::clear","BUTTON::accesskey","BUTTON::disabled","BUTTON::name","BUTTON::tabindex","BUTTON::type","BUTTON::value","CANVAS::height","CANVAS::width","CAPTION::align","COL::align","COL::char","COL::charoff","COL::span","COL::valign","COL::width","COLGROUP::align","COLGROUP::char","COLGROUP::charoff","COLGROUP::span","COLGROUP::valign","COLGROUP::width","COMMAND::checked","COMMAND::command","COMMAND::disabled","COMMAND::label","COMMAND::radiogroup","COMMAND::type","DATA::value","DEL::datetime","DETAILS::open","DIR::compact","DIV::align","DL::compact","FIELDSET::disabled","FONT::color","FONT::face","FONT::size","FORM::accept","FORM::autocomplete","FORM::enctype","FORM::method","FORM::name","FORM::novalidate","FORM::target","FRAME::name","H1::align","H2::align","H3::align","H4::align","H5::align","H6::align","HR::align","HR::noshade","HR::size","HR::width","HTML::version","IFRAME::align","IFRAME::frameborder","IFRAME::height","IFRAME::marginheight","IFRAME::marginwidth","IFRAME::width","IMG::align","IMG::alt","IMG::border","IMG::height","IMG::hspace","IMG::ismap","IMG::name","IMG::usemap","IMG::vspace","IMG::width","INPUT::accept","INPUT::accesskey","INPUT::align","INPUT::alt","INPUT::autocomplete","INPUT::autofocus","INPUT::checked","INPUT::disabled","INPUT::inputmode","INPUT::ismap","INPUT::list","INPUT::max","INPUT::maxlength","INPUT::min","INPUT::multiple","INPUT::name","INPUT::placeholder","INPUT::readonly","INPUT::required","INPUT::size","INPUT::step","INPUT::tabindex","INPUT::type","INPUT::usemap","INPUT::value","INS::datetime","KEYGEN::disabled","KEYGEN::keytype","KEYGEN::name","LABEL::accesskey","LABEL::for","LEGEND::accesskey","LEGEND::align","LI::type","LI::value","LINK::sizes","MAP::name","MENU::compact","MENU::label","MENU::type","METER::high","METER::low","METER::max","METER::min","METER::value","OBJECT::typemustmatch","OL::compact","OL::reversed","OL::start","OL::type","OPTGROUP::disabled","OPTGROUP::label","OPTION::disabled","OPTION::label","OPTION::selected","OPTION::value","OUTPUT::for","OUTPUT::name","P::align","PRE::width","PROGRESS::max","PROGRESS::min","PROGRESS::value","SELECT::autocomplete","SELECT::disabled","SELECT::multiple","SELECT::name","SELECT::required","SELECT::size","SELECT::tabindex","SOURCE::type","TABLE::align","TABLE::bgcolor","TABLE::border","TABLE::cellpadding","TABLE::cellspacing","TABLE::frame","TABLE::rules","TABLE::summary","TABLE::width","TBODY::align","TBODY::char","TBODY::charoff","TBODY::valign","TD::abbr","TD::align","TD::axis","TD::bgcolor","TD::char","TD::charoff","TD::colspan","TD::headers","TD::height","TD::nowrap","TD::rowspan","TD::scope","TD::valign","TD::width","TEXTAREA::accesskey","TEXTAREA::autocomplete","TEXTAREA::cols","TEXTAREA::disabled","TEXTAREA::inputmode","TEXTAREA::name","TEXTAREA::placeholder","TEXTAREA::readonly","TEXTAREA::required","TEXTAREA::rows","TEXTAREA::tabindex","TEXTAREA::wrap","TFOOT::align","TFOOT::char","TFOOT::charoff","TFOOT::valign","TH::abbr","TH::align","TH::axis","TH::bgcolor","TH::char","TH::charoff","TH::colspan","TH::headers","TH::height","TH::nowrap","TH::rowspan","TH::scope","TH::valign","TH::width","THEAD::align","THEAD::char","THEAD::charoff","THEAD::valign","TR::align","TR::bgcolor","TR::char","TR::charoff","TR::valign","TRACK::default","TRACK::kind","TRACK::label","TRACK::srclang","UL::compact","UL::type","VIDEO::controls","VIDEO::height","VIDEO::loop","VIDEO::mediagroup","VIDEO::muted","VIDEO::preload","VIDEO::width"]),[P.qU])
-C.Sq=I.uL(["HEAD","AREA","BASE","BASEFONT","BR","COL","COLGROUP","EMBED","FRAME","FRAMESET","HR","IMAGE","IMG","INPUT","ISINDEX","LINK","META","PARAM","SOURCE","STYLE","TITLE","WBR"])
-C.xD=I.uL([])
-C.Qx=H.VM(I.uL(["bind","if","ref","repeat","syntax"]),[P.qU])
-C.BI=H.VM(I.uL(["A::href","AREA::href","BLOCKQUOTE::cite","BODY::background","COMMAND::icon","DEL::cite","FORM::action","IMG::src","INPUT::src","INS::cite","Q::cite","VIDEO::poster"]),[P.qU])
-$.te="$cachedFunction"
-$.eb="$cachedInvocation"
-$.yj=0
-$.mJ=null
-$.P4=null
-$.n=null
-$.c=null
-$.x7=null
-$.z=null
-$.a=null
-$.M=null
-$.S6=null
-$.k8=null
-$.mg=null
-$.UD=!1
-$.X3=C.NU
-$.Ss=0
-$.xo=null
-$.BO=null
-$.lt=null
-$.EU=null
-$.v7=null
-$=null
-init.isHunkLoaded=function(a){return!!$dart_deferred_initializers$[a]}
-init.deferredInitialized=new Object(null)
-init.isHunkInitialized=function(a){return init.deferredInitialized[a]}
-init.initializeLoadedHunk=function(a){$dart_deferred_initializers$[a]($globals$,$)
-init.deferredInitialized[a]=true}
-init.deferredLibraryUris={}
-init.deferredLibraryHashes={};(function(a){for(var z=0;z<a.length;){var y=a[z++]
-var x=a[z++]
-var w=a[z++]
-I.$lazy(y,x,w)}})(["fa","$get$fa",function(){return init.getIsolateTag("_$dart_dartClosure")},"Kb","$get$Kb",function(){return H.yl()},"jp","$get$jp",function(){return new P.kM(null)},"U2","$get$U2",function(){return H.cM(H.S7({
-toString:function(){return"$receiver$"}}))},"k1","$get$k1",function(){return H.cM(H.S7({$method$:null,
-toString:function(){return"$receiver$"}}))},"Re","$get$Re",function(){return H.cM(H.S7(null))},"fN","$get$fN",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
-try{null.$method$($argumentsExpr$)}catch(z){return z.message}}())},"qi","$get$qi",function(){return H.cM(H.S7(void 0))},"rZ","$get$rZ",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
-try{(void 0).$method$($argumentsExpr$)}catch(z){return z.message}}())},"BX","$get$BX",function(){return H.cM(H.Mj(null))},"tt","$get$tt",function(){return H.cM(function(){try{null.$method$}catch(z){return z.message}}())},"dt","$get$dt",function(){return H.cM(H.Mj(void 0))},"A7","$get$A7",function(){return H.cM(function(){try{(void 0).$method$}catch(z){return z.message}}())},"Wc","$get$Wc",function(){return P.Oj()},"xg","$get$xg",function(){return[]},"zX","$get$zX",function(){return P.tM(["A","ABBR","ACRONYM","ADDRESS","AREA","ARTICLE","ASIDE","AUDIO","B","BDI","BDO","BIG","BLOCKQUOTE","BR","BUTTON","CANVAS","CAPTION","CENTER","CITE","CODE","COL","COLGROUP","COMMAND","DATA","DATALIST","DD","DEL","DETAILS","DFN","DIR","DIV","DL","DT","EM","FIELDSET","FIGCAPTION","FIGURE","FONT","FOOTER","FORM","H1","H2","H3","H4","H5","H6","HEADER","HGROUP","HR","I","IFRAME","IMG","INPUT","INS","KBD","LABEL","LEGEND","LI","MAP","MARK","MENU","METER","NAV","NOBR","OL","OPTGROUP","OPTION","OUTPUT","P","PRE","PROGRESS","Q","S","SAMP","SECTION","SELECT","SMALL","SOURCE","SPAN","STRIKE","STRONG","SUB","SUMMARY","SUP","TABLE","TBODY","TD","TEXTAREA","TFOOT","TH","THEAD","TIME","TR","TRACK","TT","U","UL","VAR","VIDEO","WBR"],null)},"or","$get$or",function(){return P.u5()},"X4","$get$X4",function(){return new H.VR("^\\S+$",H.v4("^\\S+$",!1,!0,!1),null,null)},"hh","$get$hh",function(){return H.Go(W.Z0("#zoomBtn"),"$isIF")},"t","$get$t",function(){return H.Go(W.Z0("#dot"),"$isqI")}])
-I=I.$finishIsolateConstructor(I)
-$=new I()
-init.metadata=[null]
-init.types=[{func:1},{func:1,args:[,]},{func:1,v:true},{func:1,v:true,args:[{func:1,v:true}]},{func:1,ret:P.qU,args:[P.KN]},{func:1,args:[W.Aj]},{func:1,args:[W.cv]},{func:1,ret:P.a2,args:[W.cv,P.qU,P.qU,W.JQ]},{func:1,args:[,P.qU]},{func:1,args:[P.qU]},{func:1,args:[{func:1,v:true}]},{func:1,v:true,args:[,],opt:[P.Gz]},{func:1,args:[,],opt:[,]},{func:1,args:[,P.Gz]},{func:1,args:[,,]},{func:1,v:true,args:[W.K,W.K]}]
-function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
-new MyClass()
-return a}function convertToSlowObject(a){a.__MAGIC_SLOW_PROPERTY=1
-delete a.__MAGIC_SLOW_PROPERTY
-return a}A=convertToFastObject(A)
-B=convertToFastObject(B)
-C=convertToFastObject(C)
-D=convertToFastObject(D)
-E=convertToFastObject(E)
-F=convertToFastObject(F)
-G=convertToFastObject(G)
-H=convertToFastObject(H)
-J=convertToFastObject(J)
-K=convertToFastObject(K)
-L=convertToFastObject(L)
-M=convertToFastObject(M)
-N=convertToFastObject(N)
-O=convertToFastObject(O)
-P=convertToFastObject(P)
-Q=convertToFastObject(Q)
-R=convertToFastObject(R)
-S=convertToFastObject(S)
-T=convertToFastObject(T)
-U=convertToFastObject(U)
-V=convertToFastObject(V)
-W=convertToFastObject(W)
-X=convertToFastObject(X)
-Y=convertToFastObject(Y)
-Z=convertToFastObject(Z)
-function init(){I.p=Object.create(null)
-init.allClasses=map()
-init.getTypeFromName=function(a){return init.allClasses[a]}
-init.interceptorsByTag=map()
-init.leafTags=map()
-init.finishedClasses=map()
-I.$lazy=function(a,b,c,d,e){if(!init.lazies)init.lazies=Object.create(null)
-init.lazies[a]=b
-e=e||I.p
-var z={}
-var y={}
-e[a]=z
-e[b]=function(){var x=this[a]
-try{if(x===z){this[a]=y
-try{x=this[a]=c()}finally{if(x===z)this[a]=null}}else if(x===y)H.eQ(d||a)
-return x}finally{this[b]=function(){return this[a]}}}}
-I.$finishIsolateConstructor=function(a){var z=a.p
-function Isolate(){var y=Object.keys(z)
-for(var x=0;x<y.length;x++){var w=y[x]
-this[w]=z[w]}var v=init.lazies
-var u=v?Object.keys(v):[]
-for(var x=0;x<u.length;x++)this[v[u[x]]]=null
-function ForceEfficientMap(){}ForceEfficientMap.prototype=this
-new ForceEfficientMap()
-for(var x=0;x<u.length;x++){var t=v[u[x]]
-this[t]=z[t]}}Isolate.prototype=a.prototype
-Isolate.prototype.constructor=Isolate
-Isolate.p=z
-Isolate.uL=a.uL
-Isolate.HU=a.HU
-return Isolate}}!function(){var z=function(a){var t={}
-t[a]=1
-return Object.keys(convertToFastObject(t))[0]}
-init.getIsolateTag=function(a){return z("___dart_"+a+init.isolateTag)}
-var y="___dart_isolate_tags_"
-var x=Object[y]||(Object[y]=Object.create(null))
-var w="_ZxYxX"
-for(var v=0;;v++){var u=z(w+"_"+v+"_")
-if(!(u in x)){x[u]=1
-init.isolateTag=u
-break}}init.dispatchPropertyName=init.getIsolateTag("dispatch_record")}();(function(a){if(typeof document==="undefined"){a(null)
-return}if(typeof document.currentScript!='undefined'){a(document.currentScript)
-return}var z=document.scripts
-function onLoad(b){for(var x=0;x<z.length;++x)z[x].removeEventListener("load",onLoad,false)
-a(b.target)}for(var y=0;y<z.length;++y)z[y].addEventListener("load",onLoad,false)})(function(a){init.currentScript=a
-if(typeof dartMainRunner==="function")dartMainRunner(function(b){H.Rq(Z.cK(),b)},[])
-else (function(b){H.Rq(Z.cK(),b)})([])})})()
\ No newline at end of file
diff --git a/pkg/analyzer/doc/tasks.html b/pkg/analyzer/doc/tasks.html
deleted file mode 100644
index e2de682..0000000
--- a/pkg/analyzer/doc/tasks.html
+++ /dev/null
@@ -1,371 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Analysis Task Dependency Graph</title>
-    <link rel="stylesheet" href="support/style.css">
-    <script src="support/viz.js"></script>
-    <script type="application/dart" src="support/web_app.dart.js"></script>
-    <script src="support/dart.js"></script>
-</head>
-<body>
-<button id="zoomBtn">Zoom</button>
-<script type="text/vnd.graphviz" id="dot">
-digraph G {
-  tooltip="Analysis Task Dependency Graph";
-  node [fontname=Helvetica];
-  edge [fontname=Helvetica, fontcolor=gray];
-  BUILD_DIRECTIVES_ERRORS -> LibraryUnitErrorsTask
-  BUILD_DIRECTIVES_ERRORS [shape=box]
-  BUILD_LIBRARY_ERRORS -> LibraryUnitErrorsTask
-  BUILD_LIBRARY_ERRORS [shape=box]
-  BuildCompilationUnitElementTask -> COMPILATION_UNIT_CONSTANTS
-  BuildCompilationUnitElementTask -> COMPILATION_UNIT_ELEMENT
-  BuildCompilationUnitElementTask -> CREATED_RESOLVED_UNIT1
-  BuildCompilationUnitElementTask -> RESOLVED_UNIT1
-  BuildDirectiveElementsTask -> BUILD_DIRECTIVES_ERRORS
-  BuildDirectiveElementsTask -> LIBRARY_ELEMENT2
-  BuildEnumMemberElementsTask -> CREATED_RESOLVED_UNIT3
-  BuildEnumMemberElementsTask -> RESOLVED_UNIT3
-  BuildExportNamespaceTask -> LIBRARY_ELEMENT4
-  BuildLibraryElementTask -> BUILD_LIBRARY_ERRORS
-  BuildLibraryElementTask -> IS_LAUNCHABLE
-  BuildLibraryElementTask -> LIBRARY_ELEMENT1
-  BuildPublicNamespaceTask -> LIBRARY_ELEMENT3
-  BuildSourceExportClosureTask -> EXPORT_SOURCE_CLOSURE
-  BuildTypeProviderTask -> TYPE_PROVIDER
-  COMPILATION_UNIT_CONSTANTS -> EvaluateUnitConstantsTask
-  COMPILATION_UNIT_CONSTANTS [shape=box]
-  COMPILATION_UNIT_ELEMENT [shape=box]
-  CONSTANT_DEPENDENCIES -> ComputeConstantValueTask
-  CONSTANT_DEPENDENCIES [shape=box]
-  CONSTANT_EXPRESSIONS_DEPENDENCIES -> EvaluateUnitConstantsTask
-  CONSTANT_EXPRESSIONS_DEPENDENCIES [shape=box]
-  CONSTANT_EXPRESSION_RESOLVED -> ComputeConstantDependenciesTask
-  CONSTANT_EXPRESSION_RESOLVED [shape=box]
-  CONSTANT_VALUE -> ComputeConstantValueTask
-  CONSTANT_VALUE -> EvaluateUnitConstantsTask
-  CONSTANT_VALUE -> VerifyUnitTask
-  CONSTANT_VALUE [shape=box]
-  CONTAINING_LIBRARIES -> DartErrorsTask
-  CONTAINING_LIBRARIES [shape=box]
-  CONTENT -> ScanDartTask
-  CONTENT [shape=box]
-  CREATED_RESOLVED_UNIT [shape=box]
-  CREATED_RESOLVED_UNIT1 [shape=box]
-  CREATED_RESOLVED_UNIT10 -> InferInstanceMembersInUnitTask
-  CREATED_RESOLVED_UNIT10 -> InferStaticVariableTypeTask
-  CREATED_RESOLVED_UNIT10 -> PartiallyResolveUnitReferencesTask
-  CREATED_RESOLVED_UNIT10 -> ResolveInstanceFieldsInUnitTask
-  CREATED_RESOLVED_UNIT10 -> ResolveUnitTask
-  CREATED_RESOLVED_UNIT10 [shape=box]
-  CREATED_RESOLVED_UNIT11 -> ResolveConstantExpressionTask
-  CREATED_RESOLVED_UNIT11 [shape=box]
-  CREATED_RESOLVED_UNIT12 [shape=box]
-  CREATED_RESOLVED_UNIT2 [shape=box]
-  CREATED_RESOLVED_UNIT3 [shape=box]
-  CREATED_RESOLVED_UNIT4 [shape=box]
-  CREATED_RESOLVED_UNIT5 [shape=box]
-  CREATED_RESOLVED_UNIT6 [shape=box]
-  CREATED_RESOLVED_UNIT7 [shape=box]
-  CREATED_RESOLVED_UNIT8 -> ResolveInstanceFieldsInUnitTask
-  CREATED_RESOLVED_UNIT8 [shape=box]
-  CREATED_RESOLVED_UNIT9 -> InferInstanceMembersInUnitTask
-  CREATED_RESOLVED_UNIT9 [shape=box]
-  ComputeConstantDependenciesTask -> CONSTANT_DEPENDENCIES
-  ComputeConstantValueTask -> CONSTANT_VALUE
-  ComputeInferableStaticVariableDependenciesTask -> INFERABLE_STATIC_VARIABLE_DEPENDENCIES
-  ComputeLibraryCycleTask -> LIBRARY_CYCLE
-  ComputeLibraryCycleTask -> LIBRARY_CYCLE_DEPENDENCIES
-  ComputeLibraryCycleTask -> LIBRARY_CYCLE_UNITS
-  ComputeRequiredConstantsTask -> PENDING_ERRORS
-  ComputeRequiredConstantsTask -> REQUIRED_CONSTANTS
-  ContainingLibrariesTask -> CONTAINING_LIBRARIES
-  DART_ERRORS -> LibraryErrorsReadyTask
-  DART_ERRORS [shape=box]
-  DART_SCRIPTS -> ScanDartTask
-  DART_SCRIPTS [shape=box]
-  DartErrorsTask -> DART_ERRORS
-  EXPLICITLY_IMPORTED_LIBRARIES [shape=box]
-  EXPORTED_LIBRARIES -> BuildDirectiveElementsTask
-  EXPORTED_LIBRARIES -> ReadyLibraryElement2Task
-  EXPORTED_LIBRARIES -> ReadyLibraryElement5Task
-  EXPORTED_LIBRARIES -> ReadyLibraryElement7Task
-  EXPORTED_LIBRARIES -> ResolveDirectiveElementsTask
-  EXPORTED_LIBRARIES -> ResolveTopLevelLibraryTypeBoundsTask
-  EXPORTED_LIBRARIES [shape=box]
-  EXPORT_SOURCE_CLOSURE -> BuildExportNamespaceTask
-  EXPORT_SOURCE_CLOSURE -> ResolveTopLevelUnitTypeBoundsTask
-  EXPORT_SOURCE_CLOSURE [shape=box]
-  EvaluateUnitConstantsTask -> CREATED_RESOLVED_UNIT12
-  EvaluateUnitConstantsTask -> RESOLVED_UNIT12
-  GatherUsedImportedElementsTask -> USED_IMPORTED_ELEMENTS
-  GatherUsedLocalElementsTask -> USED_LOCAL_ELEMENTS
-  GenerateHintsTask -> HINTS
-  GenerateLintsTask -> LINTS
-  HINTS -> LibraryUnitErrorsTask
-  HINTS [shape=box]
-  IGNORE_INFO -> DartErrorsTask
-  IGNORE_INFO [shape=box]
-  IMPORTED_LIBRARIES -> BuildDirectiveElementsTask
-  IMPORTED_LIBRARIES -> ReadyLibraryElement2Task
-  IMPORTED_LIBRARIES -> ReadyLibraryElement5Task
-  IMPORTED_LIBRARIES -> ReadyLibraryElement7Task
-  IMPORTED_LIBRARIES -> ResolveDirectiveElementsTask
-  IMPORTED_LIBRARIES -> ResolveTopLevelLibraryTypeBoundsTask
-  IMPORTED_LIBRARIES -> ResolveTopLevelUnitTypeBoundsTask
-  IMPORTED_LIBRARIES [shape=box]
-  INCLUDED_PARTS -> BuildLibraryElementTask
-  INCLUDED_PARTS [shape=box]
-  INFERABLE_STATIC_VARIABLES_IN_UNIT -> InferStaticVariableTypesInUnitTask
-  INFERABLE_STATIC_VARIABLES_IN_UNIT [shape=box]
-  INFERABLE_STATIC_VARIABLE_DEPENDENCIES -> InferStaticVariableTypeTask
-  INFERABLE_STATIC_VARIABLE_DEPENDENCIES [shape=box]
-  INFERRED_STATIC_VARIABLE -> InferStaticVariableTypeTask
-  INFERRED_STATIC_VARIABLE -> InferStaticVariableTypesInUnitTask
-  INFERRED_STATIC_VARIABLE [shape=box]
-  IS_LAUNCHABLE [shape=box]
-  InferInstanceMembersInUnitTask -> CREATED_RESOLVED_UNIT10
-  InferInstanceMembersInUnitTask -> RESOLVED_UNIT10
-  InferStaticVariableTypeTask -> INFERRED_STATIC_VARIABLE
-  InferStaticVariableTypeTask -> STATIC_VARIABLE_RESOLUTION_ERRORS
-  InferStaticVariableTypesInUnitTask -> CREATED_RESOLVED_UNIT8
-  InferStaticVariableTypesInUnitTask -> RESOLVED_UNIT8
-  InferStaticVariableTypesInUnitTask -> STATIC_VARIABLE_RESOLUTION_ERRORS_IN_UNIT
-  LIBRARY_CYCLE [shape=box]
-  LIBRARY_CYCLE_DEPENDENCIES -> InferInstanceMembersInUnitTask
-  LIBRARY_CYCLE_DEPENDENCIES -> InferStaticVariableTypeTask
-  LIBRARY_CYCLE_DEPENDENCIES -> PartiallyResolveUnitReferencesTask
-  LIBRARY_CYCLE_DEPENDENCIES -> ResolveInstanceFieldsInUnitTask
-  LIBRARY_CYCLE_DEPENDENCIES [shape=box]
-  LIBRARY_CYCLE_UNITS -> InferInstanceMembersInUnitTask
-  LIBRARY_CYCLE_UNITS -> ResolveInstanceFieldsInUnitTask
-  LIBRARY_CYCLE_UNITS -> ResolveUnitTask
-  LIBRARY_CYCLE_UNITS [shape=box]
-  LIBRARY_ELEMENT -> LibraryErrorsReadyTask
-  LIBRARY_ELEMENT [shape=box]
-  LIBRARY_ELEMENT1 -> BuildDirectiveElementsTask
-  LIBRARY_ELEMENT1 -> ResolveVariableReferencesTask
-  LIBRARY_ELEMENT1 [shape=box]
-  LIBRARY_ELEMENT2 -> BuildPublicNamespaceTask
-  LIBRARY_ELEMENT2 -> BuildSourceExportClosureTask
-  LIBRARY_ELEMENT2 -> ComputeLibraryCycleTask
-  LIBRARY_ELEMENT2 -> ReadyLibraryElement2Task
-  LIBRARY_ELEMENT2 -> ResolveDirectiveElementsTask
-  LIBRARY_ELEMENT2 [shape=box]
-  LIBRARY_ELEMENT3 -> BuildExportNamespaceTask
-  LIBRARY_ELEMENT3 -> BuildTypeProviderTask
-  LIBRARY_ELEMENT3 [shape=box]
-  LIBRARY_ELEMENT4 -> ResolveTopLevelLibraryTypeBoundsTask
-  LIBRARY_ELEMENT4 -> ResolveTopLevelUnitTypeBoundsTask
-  LIBRARY_ELEMENT4 [shape=box]
-  LIBRARY_ELEMENT5 -> ResolveLibraryTypeNamesTask
-  LIBRARY_ELEMENT5 -> ResolveTopLevelLibraryTypeBoundsTask
-  LIBRARY_ELEMENT5 -> ResolveUnitTypeNamesTask
-  LIBRARY_ELEMENT5 [shape=box]
-  LIBRARY_ELEMENT6 -> PartiallyResolveUnitReferencesTask
-  LIBRARY_ELEMENT6 -> ReadyLibraryElement5Task
-  LIBRARY_ELEMENT6 -> ResolveInstanceFieldsInUnitTask
-  LIBRARY_ELEMENT6 -> ResolvedUnit7InLibraryTask
-  LIBRARY_ELEMENT6 [shape=box]
-  LIBRARY_ELEMENT7 -> ReadyLibraryElement7Task
-  LIBRARY_ELEMENT7 -> ResolvedUnit7InLibraryClosureTask
-  LIBRARY_ELEMENT7 [shape=box]
-  LIBRARY_ELEMENT8 -> ResolveLibraryReferencesTask
-  LIBRARY_ELEMENT8 -> ResolveUnitTask
-  LIBRARY_ELEMENT8 [shape=box]
-  LIBRARY_ELEMENT9 -> EvaluateUnitConstantsTask
-  LIBRARY_ELEMENT9 -> ResolveLibraryTask
-  LIBRARY_ELEMENT9 [shape=box]
-  LIBRARY_ERRORS_READY [shape=box]
-  LIBRARY_SPECIFIC_UNITS -> GenerateHintsTask
-  LIBRARY_SPECIFIC_UNITS -> ReadyResolvedUnitTask
-  LIBRARY_SPECIFIC_UNITS -> ResolveLibraryReferencesTask
-  LIBRARY_SPECIFIC_UNITS -> ResolveLibraryTypeNamesTask
-  LIBRARY_SPECIFIC_UNITS -> ResolveTopLevelLibraryTypeBoundsTask
-  LIBRARY_SPECIFIC_UNITS -> ResolvedUnit7InLibraryTask
-  LIBRARY_SPECIFIC_UNITS [shape=box]
-  LIBRARY_UNIT_ERRORS -> dartErrorsForUnit
-  LIBRARY_UNIT_ERRORS [shape=box]
-  LINE_INFO -> BuildCompilationUnitElementTask
-  LINE_INFO -> DartErrorsTask
-  LINE_INFO -> ParseDartTask
-  LINE_INFO [shape=box]
-  LINTS -> LibraryUnitErrorsTask
-  LINTS [shape=box]
-  LibraryErrorsReadyTask -> LIBRARY_ERRORS_READY
-  LibraryUnitErrorsTask -> LIBRARY_UNIT_ERRORS
-  MODIFICATION_TIME -> BuildDirectiveElementsTask
-  MODIFICATION_TIME -> BuildLibraryElementTask
-  MODIFICATION_TIME -> ParseDartTask
-  MODIFICATION_TIME -> ResolveDirectiveElementsTask
-  MODIFICATION_TIME -> ScanDartTask
-  MODIFICATION_TIME -> VerifyUnitTask
-  MODIFICATION_TIME [shape=box]
-  PARSED_UNIT -> BuildCompilationUnitElementTask
-  PARSED_UNIT [shape=box]
-  PARSE_ERRORS -> dartErrorsForSource
-  PARSE_ERRORS [shape=box]
-  PENDING_ERRORS -> VerifyUnitTask
-  PENDING_ERRORS [shape=box]
-  ParseDartTask -> EXPLICITLY_IMPORTED_LIBRARIES
-  ParseDartTask -> EXPORTED_LIBRARIES
-  ParseDartTask -> IMPORTED_LIBRARIES
-  ParseDartTask -> INCLUDED_PARTS
-  ParseDartTask -> LIBRARY_SPECIFIC_UNITS
-  ParseDartTask -> PARSED_UNIT
-  ParseDartTask -> PARSE_ERRORS
-  ParseDartTask -> REFERENCED_SOURCES
-  ParseDartTask -> SOURCE_KIND
-  ParseDartTask -> UNITS
-  PartiallyResolveUnitReferencesTask -> CREATED_RESOLVED_UNIT7
-  PartiallyResolveUnitReferencesTask -> INFERABLE_STATIC_VARIABLES_IN_UNIT
-  PartiallyResolveUnitReferencesTask -> RESOLVED_UNIT7
-  READY_LIBRARY_ELEMENT2 -> ComputeLibraryCycleTask
-  READY_LIBRARY_ELEMENT2 -> ReadyLibraryElement2Task
-  READY_LIBRARY_ELEMENT2 [shape=box]
-  READY_LIBRARY_ELEMENT6 -> PartiallyResolveUnitReferencesTask
-  READY_LIBRARY_ELEMENT6 -> ReadyLibraryElement5Task
-  READY_LIBRARY_ELEMENT6 [shape=box]
-  READY_LIBRARY_ELEMENT7 -> ReadyLibraryElement7Task
-  READY_LIBRARY_ELEMENT7 -> ResolvedUnit7InLibraryClosureTask
-  READY_LIBRARY_ELEMENT7 [shape=box]
-  READY_RESOLVED_UNIT -> ResolveLibraryTask
-  READY_RESOLVED_UNIT -> VerifyUnitTask
-  READY_RESOLVED_UNIT [shape=box]
-  REFERENCED_SOURCES -> BuildDirectiveElementsTask
-  REFERENCED_SOURCES -> ResolveDirectiveElementsTask
-  REFERENCED_SOURCES -> VerifyUnitTask
-  REFERENCED_SOURCES [shape=box]
-  REQUIRED_CONSTANTS -> VerifyUnitTask
-  REQUIRED_CONSTANTS [shape=box]
-  RESOLVED_UNIT -> ComputeRequiredConstantsTask
-  RESOLVED_UNIT -> GenerateHintsTask
-  RESOLVED_UNIT -> GenerateLintsTask
-  RESOLVED_UNIT -> ReadyResolvedUnitTask
-  RESOLVED_UNIT -> VerifyUnitTask
-  RESOLVED_UNIT [shape=box]
-  RESOLVED_UNIT1 -> BuildDirectiveElementsTask
-  RESOLVED_UNIT1 -> BuildLibraryElementTask
-  RESOLVED_UNIT1 -> ResolveDirectiveElementsTask
-  RESOLVED_UNIT1 [shape=box]
-  RESOLVED_UNIT10 -> ResolveUnitTask
-  RESOLVED_UNIT10 [shape=box]
-  RESOLVED_UNIT11 -> EvaluateUnitConstantsTask
-  RESOLVED_UNIT11 -> GatherUsedImportedElementsTask
-  RESOLVED_UNIT11 -> GatherUsedLocalElementsTask
-  RESOLVED_UNIT11 -> ResolveLibraryReferencesTask
-  RESOLVED_UNIT11 [shape=box]
-  RESOLVED_UNIT12 -> StrongModeVerifyUnitTask
-  RESOLVED_UNIT12 [shape=box]
-  RESOLVED_UNIT2 -> BuildEnumMemberElementsTask
-  RESOLVED_UNIT2 [shape=box]
-  RESOLVED_UNIT3 -> ResolveTopLevelUnitTypeBoundsTask
-  RESOLVED_UNIT3 [shape=box]
-  RESOLVED_UNIT4 -> ResolveTopLevelLibraryTypeBoundsTask
-  RESOLVED_UNIT4 -> ResolveUnitTypeNamesTask
-  RESOLVED_UNIT4 [shape=box]
-  RESOLVED_UNIT5 -> ResolveLibraryTypeNamesTask
-  RESOLVED_UNIT5 -> ResolveVariableReferencesTask
-  RESOLVED_UNIT5 [shape=box]
-  RESOLVED_UNIT6 -> PartiallyResolveUnitReferencesTask
-  RESOLVED_UNIT6 [shape=box]
-  RESOLVED_UNIT7 -> ComputeInferableStaticVariableDependenciesTask
-  RESOLVED_UNIT7 -> InferStaticVariableTypeTask
-  RESOLVED_UNIT7 -> InferStaticVariableTypesInUnitTask
-  RESOLVED_UNIT7 -> ResolvedUnit7InLibraryTask
-  RESOLVED_UNIT7 [shape=box]
-  RESOLVED_UNIT8 -> ResolveInstanceFieldsInUnitTask
-  RESOLVED_UNIT8 [shape=box]
-  RESOLVED_UNIT9 -> InferInstanceMembersInUnitTask
-  RESOLVED_UNIT9 [shape=box]
-  RESOLVE_DIRECTIVES_ERRORS -> LibraryUnitErrorsTask
-  RESOLVE_DIRECTIVES_ERRORS [shape=box]
-  RESOLVE_TYPE_BOUNDS_ERRORS -> LibraryUnitErrorsTask
-  RESOLVE_TYPE_BOUNDS_ERRORS [shape=box]
-  RESOLVE_TYPE_NAMES_ERRORS -> LibraryUnitErrorsTask
-  RESOLVE_TYPE_NAMES_ERRORS [shape=box]
-  RESOLVE_UNIT_ERRORS -> LibraryUnitErrorsTask
-  RESOLVE_UNIT_ERRORS [shape=box]
-  ReadyLibraryElement2Task -> READY_LIBRARY_ELEMENT2
-  ReadyLibraryElement5Task -> READY_LIBRARY_ELEMENT6
-  ReadyLibraryElement7Task -> READY_LIBRARY_ELEMENT7
-  ReadyResolvedUnitTask -> READY_RESOLVED_UNIT
-  ResolveConstantExpressionTask -> CONSTANT_EXPRESSION_RESOLVED
-  ResolveDirectiveElementsTask -> CREATED_RESOLVED_UNIT2
-  ResolveDirectiveElementsTask -> RESOLVED_UNIT2
-  ResolveDirectiveElementsTask -> RESOLVE_DIRECTIVES_ERRORS
-  ResolveInstanceFieldsInUnitTask -> CREATED_RESOLVED_UNIT9
-  ResolveInstanceFieldsInUnitTask -> RESOLVED_UNIT9
-  ResolveLibraryReferencesTask -> LIBRARY_ELEMENT9
-  ResolveLibraryTask -> LIBRARY_ELEMENT
-  ResolveLibraryTypeNamesTask -> LIBRARY_ELEMENT6
-  ResolveTopLevelLibraryTypeBoundsTask -> LIBRARY_ELEMENT5
-  ResolveTopLevelUnitTypeBoundsTask -> CREATED_RESOLVED_UNIT4
-  ResolveTopLevelUnitTypeBoundsTask -> RESOLVED_UNIT4
-  ResolveTopLevelUnitTypeBoundsTask -> RESOLVE_TYPE_BOUNDS_ERRORS
-  ResolveUnitTask -> CONSTANT_EXPRESSIONS_DEPENDENCIES
-  ResolveUnitTask -> CREATED_RESOLVED_UNIT11
-  ResolveUnitTask -> RESOLVED_UNIT11
-  ResolveUnitTask -> RESOLVE_UNIT_ERRORS
-  ResolveUnitTypeNamesTask -> CREATED_RESOLVED_UNIT5
-  ResolveUnitTypeNamesTask -> RESOLVED_UNIT5
-  ResolveUnitTypeNamesTask -> RESOLVE_TYPE_NAMES_ERRORS
-  ResolveVariableReferencesTask -> CREATED_RESOLVED_UNIT6
-  ResolveVariableReferencesTask -> RESOLVED_UNIT6
-  ResolveVariableReferencesTask -> VARIABLE_REFERENCE_ERRORS
-  ResolvedUnit7InLibraryClosureTask -> LIBRARY_ELEMENT8
-  ResolvedUnit7InLibraryTask -> LIBRARY_ELEMENT7
-  SCAN_ERRORS -> dartErrorsForSource
-  SCAN_ERRORS [shape=box]
-  SOURCE_KIND -> BuildDirectiveElementsTask
-  SOURCE_KIND -> ResolveDirectiveElementsTask
-  SOURCE_KIND [shape=box]
-  STATIC_VARIABLE_RESOLUTION_ERRORS -> InferStaticVariableTypesInUnitTask
-  STATIC_VARIABLE_RESOLUTION_ERRORS [shape=box]
-  STATIC_VARIABLE_RESOLUTION_ERRORS_IN_UNIT -> LibraryUnitErrorsTask
-  STATIC_VARIABLE_RESOLUTION_ERRORS_IN_UNIT [shape=box]
-  STRONG_MODE_ERRORS -> LibraryUnitErrorsTask
-  STRONG_MODE_ERRORS [shape=box]
-  ScanDartTask -> IGNORE_INFO
-  ScanDartTask -> LINE_INFO
-  ScanDartTask -> SCAN_ERRORS
-  ScanDartTask -> TOKEN_STREAM
-  StrongModeVerifyUnitTask -> CREATED_RESOLVED_UNIT
-  StrongModeVerifyUnitTask -> RESOLVED_UNIT
-  StrongModeVerifyUnitTask -> STRONG_MODE_ERRORS
-  TOKEN_STREAM -> ParseDartTask
-  TOKEN_STREAM [shape=box]
-  TYPE_PROVIDER -> BuildEnumMemberElementsTask
-  TYPE_PROVIDER -> ComputeConstantDependenciesTask
-  TYPE_PROVIDER -> ComputeConstantValueTask
-  TYPE_PROVIDER -> GenerateHintsTask
-  TYPE_PROVIDER -> InferInstanceMembersInUnitTask
-  TYPE_PROVIDER -> InferStaticVariableTypeTask
-  TYPE_PROVIDER -> PartiallyResolveUnitReferencesTask
-  TYPE_PROVIDER -> ResolveInstanceFieldsInUnitTask
-  TYPE_PROVIDER -> ResolveLibraryTypeNamesTask
-  TYPE_PROVIDER -> ResolveUnitTask
-  TYPE_PROVIDER -> ResolveUnitTypeNamesTask
-  TYPE_PROVIDER -> ResolveVariableReferencesTask
-  TYPE_PROVIDER -> StrongModeVerifyUnitTask
-  TYPE_PROVIDER -> VerifyUnitTask
-  TYPE_PROVIDER [shape=box]
-  UNITS -> LibraryErrorsReadyTask
-  UNITS [shape=box]
-  USED_IMPORTED_ELEMENTS -> GenerateHintsTask
-  USED_IMPORTED_ELEMENTS [shape=box]
-  USED_LOCAL_ELEMENTS -> GenerateHintsTask
-  USED_LOCAL_ELEMENTS [shape=box]
-  VARIABLE_REFERENCE_ERRORS -> LibraryUnitErrorsTask
-  VARIABLE_REFERENCE_ERRORS [shape=box]
-  VERIFY_ERRORS -> LibraryUnitErrorsTask
-  VERIFY_ERRORS [shape=box]
-  VerifyUnitTask -> VERIFY_ERRORS
-  dartErrorsForSource -> DartErrorsTask
-  dartErrorsForSource [shape=hexagon]
-  dartErrorsForUnit -> DartErrorsTask
-  dartErrorsForUnit [shape=hexagon]
-}
-</script>
-</body>
-</html>
diff --git a/pkg/analyzer/doc/tutorial/ast.md b/pkg/analyzer/doc/tutorial/ast.md
index 843728b..fd41d31 100644
--- a/pkg/analyzer/doc/tutorial/ast.md
+++ b/pkg/analyzer/doc/tutorial/ast.md
@@ -131,7 +131,7 @@
 ask an AST node to accept a visitor, it will invoke the corresponding method on
 the visitor interface.
 
-If you want to define a visitor, you'll probably want to subclass one of the
+If you want to define a visitor, you would create a subclass of one of the
 concrete implementations of `AstVisitor`. The concrete subclasses are defined in
 `package:analyzer/dart/ast/visitor.dart`. A couple of the most useful include
 - `SimpleAstVisitor` which implements every visit method by doing nothing,
@@ -140,18 +140,12 @@
 - `GeneralizingAstVisitor` which makes it easy to visit general kinds of nodes,
   such as visiting any statement, or any expression.
 
-The one time you might want to implement `AstVisitor` rather than to extend one
-of the concrete subclasses is if it's critical that you implement _every_ visit
-method. The downside of doing this is that every time the AST structure is
-updated because of an enhancement to the language, your code will need to be
-updated to implement the newly added visit methods.
-
 As an example, let's assume you want to write some code to count the number of
 `if` statements in a given structure. You need to visit every node, because you
 can't know ahead of time where the `if` statements will be located, but there is
 one specific class of node that you need to visit, so you don't need to handle
-the general "groups" of nodes, so you'd want to create a subclass of
-`RecursiveAstVisitor`.
+the general "groups" of nodes. The best approach for this example is to create a
+subclass of `RecursiveAstVisitor`.
 
 ```dart
 class IfCounter extends RecursiveAstVisitor<void> {
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 3bf434e..271b921 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/ast/precedence.dart';
+
 /// Defines the AST model. The AST (Abstract Syntax Tree) model describes the
 /// syntactic (as opposed to semantic) structure of Dart code. The semantic
 /// structure of the code is modeled by the
@@ -505,6 +507,7 @@
 
   R visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node);
 
+  @Deprecated('Replaced by visitForStatement2')
   R visitForEachStatement(ForEachStatement node);
 
   R visitForElement(ForElement node);
@@ -515,6 +518,7 @@
 
   R visitForPartsWithExpression(ForPartsWithExpression node);
 
+  @Deprecated('Replaced by visitForStatement2')
   R visitForStatement(ForStatement node);
 
   R visitForStatement2(ForStatement2 node);
@@ -567,10 +571,13 @@
 
   R visitListLiteral(ListLiteral node);
 
+  @Deprecated('Replaced by visitListLiteral')
   R visitListLiteral2(ListLiteral2 node);
 
+  @Deprecated('Replaced by visitSetOrMapLiteral')
   R visitMapLiteral(MapLiteral node);
 
+  @Deprecated('Replaced by visitSetOrMapLiteral')
   R visitMapLiteral2(MapLiteral2 node);
 
   R visitMapLiteralEntry(MapLiteralEntry node);
@@ -614,10 +621,14 @@
 
   R visitScriptTag(ScriptTag node);
 
+  @Deprecated('Replaced by visitSetOrMapLiteral')
   R visitSetLiteral(SetLiteral node);
 
+  @Deprecated('Replaced by visitSetOrMapLiteral')
   R visitSetLiteral2(SetLiteral2 node);
 
+  R visitSetOrMapLiteral(SetOrMapLiteral node);
+
   R visitShowCombinator(ShowCombinator node);
 
   R visitSimpleFormalParameter(SimpleFormalParameter node);
@@ -1972,12 +1983,16 @@
   /// integer value that defines how the source code is parsed into an AST. For
   /// example `a * b + c` is parsed as `(a * b) + c` because the precedence of
   /// `*` is greater than the precedence of `+`.
-  ///
-  /// Clients should not assume that returned values will stay the same, they
-  /// might change as result of specification change. Only relative order should
-  /// be used.
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   int get precedence;
 
+  /// Return the precedence of this expression. The precedence is a positive
+  /// integer value that defines how the source code is parsed into an AST. For
+  /// example `a * b + c` is parsed as `(a * b) + c` because the precedence of
+  /// `*` is greater than the precedence of `+`.
+  Precedence get precedence2;
+
   /// If this expression is an argument to an invocation, and the AST structure
   /// has been resolved, and the function being invoked is known based on
   /// propagated type information, and this expression corresponds to one of the
@@ -2236,23 +2251,14 @@
 /// used.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class ForEachStatement implements Statement {
-  /// Return the token representing the 'await' keyword, or `null` if there is
-  /// no 'await' keyword.
-  Token get awaitKeyword;
-
+@Deprecated('Replaced by ForStatement2')
+abstract class ForEachStatement implements ForStatement2 {
   /// Set the token representing the 'await' keyword to the given [token].
   void set awaitKeyword(Token token);
 
-  /// Return the body of the loop.
-  Statement get body;
-
   /// Set the body of the loop to the given [statement].
   void set body(Statement statement);
 
-  /// Return the token representing the 'for' keyword.
-  Token get forKeyword;
-
   /// Set the token representing the 'for' keyword to the given [token].
   void set forKeyword(Token token);
 
@@ -2276,9 +2282,6 @@
   /// [expression].
   void set iterable(Expression expression);
 
-  /// Return the left parenthesis.
-  Token get leftParenthesis;
-
   /// Set the left parenthesis to the given [token].
   void set leftParenthesis(Token token);
 
@@ -2289,9 +2292,6 @@
   /// Set the declaration of the loop variable to the given [variable].
   void set loopVariable(DeclaredIdentifier variable);
 
-  /// Return the right parenthesis.
-  Token get rightParenthesis;
-
   /// Set the right parenthesis to the given [token].
   void set rightParenthesis(Token token);
 }
@@ -2529,10 +2529,8 @@
 /// used.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class ForStatement implements Statement {
-  /// Return the body of the loop.
-  Statement get body;
-
+@Deprecated('Replaced by ForStatement2')
+abstract class ForStatement implements ForStatement2 {
   /// Set the body of the loop to the given [statement].
   void set body(Statement statement);
 
@@ -2544,9 +2542,6 @@
   /// given [expression].
   void set condition(Expression expression);
 
-  /// Return the token representing the 'for' keyword.
-  Token get forKeyword;
-
   /// Set the token representing the 'for' keyword to the given [token].
   void set forKeyword(Token token);
 
@@ -2557,9 +2552,6 @@
   /// Set the initialization expression to the given [expression].
   void set initialization(Expression initialization);
 
-  /// Return the left parenthesis.
-  Token get leftParenthesis;
-
   /// Set the left parenthesis to the given [token].
   void set leftParenthesis(Token token);
 
@@ -2570,9 +2562,6 @@
   /// given [token].
   void set leftSeparator(Token token);
 
-  /// Return the right parenthesis.
-  Token get rightParenthesis;
-
   /// Set the right parenthesis to the given [token].
   void set rightParenthesis(Token token);
 
@@ -2607,8 +2596,8 @@
 ///
 /// This is the class that is used to represent a for loop when either the
 /// 'control-flow-collections' or 'spread-collections' experiments are enabled.
-/// If neither of those experiments are enabled, then either [ForStatement] or
-/// [ForEachStatement] will be used.
+/// If neither of those experiments are enabled, then either `ForStatement` or
+/// `ForEachStatement` will be used.
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class ForStatement2 implements Statement {
@@ -3699,18 +3688,20 @@
 /// A list literal.
 ///
 ///    listLiteral ::=
-///        'const'? ('<' [TypeAnnotation] '>')? '[' ([Expression] ','?)? ']'
+///        'const'? [TypeAnnotationList]? '[' elements? ']'
 ///
-/// This is the class that is used to represent a list literal when neither the
-/// 'control-flow-collections' nor 'spread-collections' experiments are enabled.
-/// If either of those experiments are enabled, then [ListLiteral2] will be
-/// used.
+///    elements ::=
+///        [CollectionElement] (',' [CollectionElement])* ','?
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class ListLiteral implements TypedLiteral {
   /// Return the expressions used to compute the elements of the list.
+  @Deprecated('Use elements2')
   NodeList<Expression> get elements;
 
+  /// Return the syntactic elements used to compute the elements of the list.
+  NodeList<CollectionElement> get elements2;
+
   /// Return the left square bracket.
   Token get leftBracket;
 
@@ -3727,14 +3718,18 @@
 /// A list literal.
 ///
 ///    listLiteral ::=
-///        'const'? ('<' [TypeAnnotation] '>')?
-///        '[' ([CollectionElement] ','?)? ']'
+///        'const'? [TypeAnnotationList]? '[' elements? ']'
+///
+///    elements ::=
+///        [CollectionElement] (',' [CollectionElement])* ','?
 ///
 /// This is the class that is used to represent a list literal when either the
 /// 'control-flow-collections' or 'spread-collections' experiments are enabled.
-/// If neither of those experiments are enabled, then [ListLiteral] will be used.
+/// If neither of those experiments are enabled, then [ListLiteral] will be
+/// used.
 ///
 /// Clients may not extend, implement or mix-in this class.
+@Deprecated('Replaced by ListLiteral')
 abstract class ListLiteral2 implements TypedLiteral {
   /// Return the expressions used to compute the elements of the list.
   NodeList<CollectionElement> get elements;
@@ -3759,8 +3754,8 @@
 ///      | [DoubleLiteral]
 ///      | [IntegerLiteral]
 ///      | [ListLiteral]
-///      | [MapLiteral]
 ///      | [NullLiteral]
+///      | [SetOrMapLiteral]
 ///      | [StringLiteral]
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -3774,10 +3769,12 @@
 ///
 /// This is the class that is used to represent a map literal when neither the
 /// 'control-flow-collections' nor 'spread-collections' experiments are enabled.
-/// If either of those experiments are enabled, then [MapLiteral2] will be used.
+/// If either of those experiments are enabled, then [SetOrMapLiteral] will be
+/// used.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class MapLiteral implements TypedLiteral {
+@Deprecated('Replaced by SetOrMapLiteral')
+abstract class MapLiteral implements SetOrMapLiteral {
   /// Return the entries in the map.
   NodeList<MapLiteralEntry> get entries;
 
@@ -3805,6 +3802,7 @@
 /// If neither of those experiments are enabled, then [MapLiteral] will be used.
 ///
 /// Clients may not extend, implement or mix-in this class.
+@Deprecated('Replaced by SetOrMapLiteral')
 abstract class MapLiteral2 implements TypedLiteral {
   /// Return the entries in the map.
   NodeList<CollectionElement> get entries;
@@ -4656,10 +4654,12 @@
 ///
 /// This is the class that is used to represent a set literal when neither the
 /// 'control-flow-collections' nor 'spread-collections' experiments are enabled.
-/// If either of those experiments are enabled, then [SetLiteral2] will be used.
+/// If either of those experiments are enabled, then [SetOrMapLiteral] will be
+/// used.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class SetLiteral implements TypedLiteral {
+@Deprecated('Replaced by SetOrMapLiteral')
+abstract class SetLiteral implements SetOrMapLiteral {
   /// Return the expressions used to compute the elements of the set.
   NodeList<Expression> get elements;
 
@@ -4688,6 +4688,7 @@
 /// If neither of those experiments are enabled, then [SetLiteral] will be used.
 ///
 /// Clients may not extend, implement or mix-in this class.
+@Deprecated('Replaced by SetOrMapLiteral')
 abstract class SetLiteral2 implements TypedLiteral {
   /// Return the expressions used to compute the elements of the set.
   NodeList<CollectionElement> get elements;
@@ -4705,6 +4706,51 @@
   void set rightBracket(Token token);
 }
 
+/// A set or map literal.
+///
+///    setOrMapLiteral ::=
+///        'const'? [TypeArgumentList]? '{' elements? '}'
+///
+///    elements ::=
+///        [CollectionElement] ( ',' [CollectionElement] )* ','?
+///
+/// This is the class that is used to represent either a map or set literal when
+/// either the 'control-flow-collections' or 'spread-collections' experiments
+/// are enabled. If neither of those experiments are enabled, then `MapLiteral`
+/// will be used to represent a map literal and `SetLiteral` will be used for
+/// set literals.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class SetOrMapLiteral implements TypedLiteral {
+  /// Return the syntactic elements used to compute the elements of the set or
+  /// map.
+  NodeList<CollectionElement> get elements2;
+
+  /// Return `true` if this literal represents a map literal.
+  ///
+  /// This getter will always return `false` if [isSet] returns `true`.
+  ///
+  /// However, this getter is _not_ the inverse of [isSet]. It is possible for
+  /// both getters to return `false` if the literal was either invalid or
+  /// ambiguous.
+  bool get isMap;
+
+  /// Return `true` if this literal represents a set literal.
+  ///
+  /// This getter will always return `false` if [isMap] returns `true`.
+  ///
+  /// However, this getter is _not_ the inverse of [isMap]. It is possible for
+  /// both getters to return `false` if the literal was either invalid or
+  /// ambiguous.
+  bool get isSet;
+
+  /// Return the left curly bracket.
+  Token get leftBracket;
+
+  /// Return the right curly bracket.
+  Token get rightBracket;
+}
+
 /// A combinator that restricts the names being imported to those in a given list.
 ///
 ///    showCombinator ::=
@@ -5271,7 +5317,7 @@
 ///
 ///    typedLiteral ::=
 ///        [ListLiteral]
-///      | [MapLiteral]
+///      | [SetOrMapLiteral]
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class TypedLiteral implements Literal {
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index c888aac..b057147 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -488,36 +488,6 @@
       {SimpleIdentifier identifier, Token inKeyword, Expression iterable});
 
   /**
-   * Returns a newly created for-each statement whose loop control variable
-   * is declared internally (in the for-loop part). The [awaitKeyword] can be
-   * `null` if this is not an asynchronous for loop.
-   */
-  ForEachStatement forEachStatementWithDeclaration(
-      Token awaitKeyword,
-      Token forKeyword,
-      Token leftParenthesis,
-      DeclaredIdentifier loopVariable,
-      Token inKeyword,
-      Expression iterator,
-      Token rightParenthesis,
-      Statement body);
-
-  /**
-   * Returns a newly created for-each statement whose loop control variable
-   * is declared outside the for loop. The [awaitKeyword] can be `null` if this
-   * is not an asynchronous for loop.
-   */
-  ForEachStatement forEachStatementWithReference(
-      Token awaitKeyword,
-      Token forKeyword,
-      Token leftParenthesis,
-      SimpleIdentifier identifier,
-      Token inKeyword,
-      Expression iterator,
-      Token rightParenthesis,
-      Statement body);
-
-  /**
    * Returns a newly created for element that can be part of a list, map or set
    * literal.
    */
@@ -562,24 +532,6 @@
       List<Expression> updaters});
 
   /**
-   * Returns a newly created for statement. Either the [variableList] or the
-   * [initialization] must be `null`. Either the [condition] and the list of
-   * [updaters] can be `null` if the loop does not have the corresponding
-   * attribute.
-   */
-  ForStatement forStatement(
-      Token forKeyword,
-      Token leftParenthesis,
-      VariableDeclarationList variableList,
-      Expression initialization,
-      Token leftSeparator,
-      Expression condition,
-      Token rightSeparator,
-      List<Expression> updaters,
-      Token rightParenthesis,
-      Statement body);
-
-  /**
    * Returns a newly created for statement.
    */
   ForStatement2 forStatement2(
@@ -831,11 +783,12 @@
    * list is empty.
    */
   ListLiteral listLiteral(Token constKeyword, TypeArgumentList typeArguments,
-      Token leftBracket, List<Expression> elements, Token rightBracket);
+      Token leftBracket, List<CollectionElement> elements, Token rightBracket);
 
   /**
    * Returns a newly created list literal.
    */
+  @Deprecated('Use listLiteral')
   ListLiteral2 listLiteral2(
       {Token constKeyword,
       TypeArgumentList typeArguments,
@@ -848,12 +801,14 @@
    * the literal is not a constant. The [typeArguments] can be `null` if no type
    * arguments were declared. The [entries] can be `null` if the map is empty.
    */
+  @Deprecated('Use setOrMapLiteral')
   MapLiteral mapLiteral(Token constKeyword, TypeArgumentList typeArguments,
       Token leftBracket, List<MapLiteralEntry> entries, Token rightBracket);
 
   /**
    * Returns a newly created map literal.
    */
+  @Deprecated('Use setOrMapLiteral')
   MapLiteral2 mapLiteral2(
       {Token constKeyword,
       TypeArgumentList typeArguments,
@@ -1035,12 +990,14 @@
    * type arguments were declared. The list of [elements] can be `null` if the
    * set is empty.
    */
+  @Deprecated('Use setOrMapLiteral')
   SetLiteral setLiteral(Token constKeyword, TypeArgumentList typeArguments,
       Token leftBracket, List<Expression> elements, Token rightBracket);
 
   /**
    * Returns a newly created set literal.
    */
+  @Deprecated('Use setOrMapLiteral')
   SetLiteral2 setLiteral2(
       {Token constKeyword,
       TypeArgumentList typeArguments,
@@ -1049,6 +1006,19 @@
       Token rightBracket});
 
   /**
+   * Returns a newly created set or map literal. The [constKeyword] can be
+   * `null` if the literal is not a constant. The [typeArguments] can be `null`
+   * if no type arguments were declared. The list of [elements] can be `null` if
+   * the set or map is empty.
+   */
+  SetOrMapLiteral setOrMapLiteral(
+      {Token constKeyword,
+      TypeArgumentList typeArguments,
+      Token leftBracket,
+      List<CollectionElement> elements,
+      Token rightBracket});
+
+  /**
    * Returns a newly created import show combinator.
    */
   ShowCombinator showCombinator(
diff --git a/pkg/analyzer/lib/dart/ast/precedence.dart b/pkg/analyzer/lib/dart/ast/precedence.dart
new file mode 100644
index 0000000..a5480d5
--- /dev/null
+++ b/pkg/analyzer/lib/dart/ast/precedence.dart
@@ -0,0 +1,95 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:front_end/src/scanner/token.dart';
+
+/// Opaque representation of Dart expression precedence.
+///
+/// [Expression] classes return an instance of this class to represent a
+/// particular row in the Dart expression precedence table.  This allows clients
+/// to determine when parentheses are needed (by comparing precedence values),
+/// but ensures that the client does not become dependent on the particular
+/// integers used by the analyzer to represent table rows, since we may need to
+/// change these integers from time to time to accommodate new language
+/// features.
+class Precedence {
+  static const Precedence none = Precedence._(NO_PRECEDENCE);
+
+  static const Precedence assignment = Precedence._(ASSIGNMENT_PRECEDENCE);
+
+  static const Precedence cascade = Precedence._(CASCADE_PRECEDENCE);
+
+  static const Precedence conditional = Precedence._(CONDITIONAL_PRECEDENCE);
+
+  static const Precedence ifNull = Precedence._(IF_NULL_PRECEDENCE);
+
+  static const Precedence logicalOr = Precedence._(LOGICAL_OR_PRECEDENCE);
+
+  static const Precedence logicalAnd = Precedence._(LOGICAL_AND_PRECEDENCE);
+
+  static const Precedence equality = Precedence._(EQUALITY_PRECEDENCE);
+
+  static const Precedence relational = Precedence._(RELATIONAL_PRECEDENCE);
+
+  static const Precedence bitwiseOr = Precedence._(BITWISE_OR_PRECEDENCE);
+
+  static const Precedence bitwiseXor = Precedence._(BITWISE_XOR_PRECEDENCE);
+
+  static const Precedence bitwiseAnd = Precedence._(BITWISE_AND_PRECEDENCE);
+
+  static const Precedence shift = Precedence._(SHIFT_PRECEDENCE);
+
+  static const Precedence additive = Precedence._(ADDITIVE_PRECEDENCE);
+
+  static const Precedence multiplicative =
+      Precedence._(MULTIPLICATIVE_PRECEDENCE);
+
+  static const Precedence prefix = Precedence._(PREFIX_PRECEDENCE);
+
+  static const Precedence postfix = Precedence._(POSTFIX_PRECEDENCE);
+
+  static const Precedence primary = Precedence._(SELECTOR_PRECEDENCE);
+
+  final int _index;
+
+  /// Constructs the precedence for a unary or binary expression constructed
+  /// from an operator of the given [type].
+  Precedence.forTokenType(TokenType type) : this._(type.precedence);
+
+  const Precedence._(this._index);
+
+  int get hashCode => _index.hashCode;
+
+  /// Returns `true` if this precedence represents a looser binding than
+  /// [other]; that is, parsing ambiguities will be resolved in favor of
+  /// nesting the expression having precedence [other] within the expression
+  /// having precedence `this`.
+  bool operator <(Precedence other) => _index < other._index;
+
+  /// Returns `true` if this precedence represents a looser, or equal, binding
+  /// than [other]; that is, parsing ambiguities will be resolved in favor of
+  /// nesting the expression having precedence [other] within the expression
+  /// having precedence `this`, or, if the precedences are equal, parsing
+  /// ambiguities will be resolved according to the associativity of the
+  /// expression precedence.
+  bool operator <=(Precedence other) => _index <= other._index;
+
+  @override
+  bool operator ==(Object other) =>
+      other is Precedence && _index == other._index;
+
+  /// Returns `true` if this precedence represents a tighter binding than
+  /// [other]; that is, parsing ambiguities will be resolved in favor of
+  /// nesting the expression having precedence `this` within the expression
+  /// having precedence [other].
+  bool operator >(Precedence other) => _index > other._index;
+
+  /// Returns `true` if this precedence represents a tighter, or equal, binding
+  /// than [other]; that is, parsing ambiguities will be resolved in favor of
+  /// nesting the expression having precedence `this` within the expression
+  /// having precedence [other], or, if the precedences are equal, parsing
+  /// ambiguities will be resolved according to the associativity of the
+  /// expression precedence.
+  bool operator >=(Precedence other) => _index >= other._index;
+}
diff --git a/pkg/analyzer/lib/dart/ast/token.dart b/pkg/analyzer/lib/dart/ast/token.dart
index 73e0562..55874de 100644
--- a/pkg/analyzer/lib/dart/ast/token.dart
+++ b/pkg/analyzer/lib/dart/ast/token.dart
@@ -7,4 +7,25 @@
  * referenced from the [AST structure](ast.dart).
  */
 export 'package:front_end/src/scanner/token.dart'
-    show Keyword, Token, TokenType;
+    show
+        Keyword,
+        Token,
+        TokenType,
+        NO_PRECEDENCE,
+        ASSIGNMENT_PRECEDENCE,
+        CASCADE_PRECEDENCE,
+        CONDITIONAL_PRECEDENCE,
+        IF_NULL_PRECEDENCE,
+        LOGICAL_OR_PRECEDENCE,
+        LOGICAL_AND_PRECEDENCE,
+        EQUALITY_PRECEDENCE,
+        RELATIONAL_PRECEDENCE,
+        BITWISE_OR_PRECEDENCE,
+        BITWISE_XOR_PRECEDENCE,
+        BITWISE_AND_PRECEDENCE,
+        SHIFT_PRECEDENCE,
+        ADDITIVE_PRECEDENCE,
+        MULTIPLICATIVE_PRECEDENCE,
+        PREFIX_PRECEDENCE,
+        POSTFIX_PRECEDENCE,
+        SELECTOR_PRECEDENCE;
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index 4c599e8..ac55621 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -24,6 +24,7 @@
 import 'dart:collection';
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart' show UIAsCodeVisitorMixin;
 
 /**
  * An AST visitor that will recursively visit all of the nodes in an AST
@@ -147,7 +148,9 @@
  *
  * Clients may extend this class.
  */
-class GeneralizingAstVisitor<R> implements AstVisitor<R> {
+class GeneralizingAstVisitor<R>
+    with UIAsCodeVisitorMixin<R>
+    implements AstVisitor<R> {
   @override
   R visitAdjacentStrings(AdjacentStrings node) => visitStringLiteral(node);
 
@@ -311,9 +314,6 @@
       visitForEachParts(node);
 
   @override
-  R visitForEachStatement(ForEachStatement node) => visitStatement(node);
-
-  @override
   R visitForElement(ForElement node) => visitCollectionElement(node);
 
   R visitFormalParameter(FormalParameter node) => visitNode(node);
@@ -332,9 +332,6 @@
       visitForParts(node);
 
   @override
-  R visitForStatement(ForStatement node) => visitStatement(node);
-
-  @override
   R visitForStatement2(ForStatement2 node) => visitStatement(node);
 
   R visitFunctionBody(FunctionBody node) => visitNode(node);
@@ -426,14 +423,13 @@
   @override
   R visitListLiteral(ListLiteral node) => visitTypedLiteral(node);
 
+  @deprecated
   @override
   R visitListLiteral2(ListLiteral2 node) => visitTypedLiteral(node);
 
   R visitLiteral(Literal node) => visitExpression(node);
 
-  @override
-  R visitMapLiteral(MapLiteral node) => visitTypedLiteral(node);
-
+  @deprecated
   @override
   R visitMapLiteral2(MapLiteral2 node) => visitTypedLiteral(node);
 
@@ -516,13 +512,14 @@
   @override
   R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
 
-  @override
-  R visitSetLiteral(SetLiteral node) => visitTypedLiteral(node);
-
+  @deprecated
   @override
   R visitSetLiteral2(SetLiteral2 node) => visitTypedLiteral(node);
 
   @override
+  R visitSetOrMapLiteral(SetOrMapLiteral node) => visitTypedLiteral(node);
+
+  @override
   R visitShowCombinator(ShowCombinator node) => visitCombinator(node);
 
   @override
@@ -638,7 +635,9 @@
  *
  * Clients may extend this class.
  */
-class RecursiveAstVisitor<R> implements AstVisitor<R> {
+class RecursiveAstVisitor<R>
+    with UIAsCodeVisitorMixin<R>
+    implements AstVisitor<R> {
   @override
   R visitAdjacentStrings(AdjacentStrings node) {
     node.visitChildren(this);
@@ -898,12 +897,6 @@
   }
 
   @override
-  R visitForEachStatement(ForEachStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
   R visitForElement(ForElement node) {
     node.visitChildren(this);
     return null;
@@ -928,12 +921,6 @@
   }
 
   @override
-  R visitForStatement(ForStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
   R visitForStatement2(ForStatement2 node) {
     node.visitChildren(this);
     return null;
@@ -1083,18 +1070,14 @@
     return null;
   }
 
+  @deprecated
   @override
   R visitListLiteral2(ListLiteral2 node) {
     node.visitChildren(this);
     return null;
   }
 
-  @override
-  R visitMapLiteral(MapLiteral node) {
-    node.visitChildren(this);
-    return null;
-  }
-
+  @deprecated
   @override
   R visitMapLiteral2(MapLiteral2 node) {
     node.visitChildren(this);
@@ -1222,14 +1205,15 @@
     return null;
   }
 
+  @deprecated
   @override
-  R visitSetLiteral(SetLiteral node) {
+  R visitSetLiteral2(SetLiteral2 node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
-  R visitSetLiteral2(SetLiteral2 node) {
+  R visitSetOrMapLiteral(SetOrMapLiteral node) {
     node.visitChildren(this);
     return null;
   }
@@ -1399,7 +1383,9 @@
  *
  * Clients may extend this class.
  */
-class SimpleAstVisitor<R> implements AstVisitor<R> {
+class SimpleAstVisitor<R>
+    with UIAsCodeVisitorMixin<R>
+    implements AstVisitor<R> {
   @override
   R visitAdjacentStrings(AdjacentStrings node) => null;
 
@@ -1530,9 +1516,6 @@
   R visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) => null;
 
   @override
-  R visitForEachStatement(ForEachStatement node) => null;
-
-  @override
   R visitForElement(ForElement node) => null;
 
   @override
@@ -1545,9 +1528,6 @@
   R visitForPartsWithExpression(ForPartsWithExpression node) => null;
 
   @override
-  R visitForStatement(ForStatement node) => null;
-
-  @override
   R visitForStatement2(ForStatement2 node) => null;
 
   @override
@@ -1625,12 +1605,11 @@
   @override
   R visitListLiteral(ListLiteral node) => null;
 
+  @deprecated
   @override
   R visitListLiteral2(ListLiteral2 node) => null;
 
-  @override
-  R visitMapLiteral(MapLiteral node) => null;
-
+  @deprecated
   @override
   R visitMapLiteral2(MapLiteral2 node) => null;
 
@@ -1696,13 +1675,14 @@
   @override
   R visitScriptTag(ScriptTag node) => null;
 
-  @override
-  R visitSetLiteral(SetLiteral node) => null;
-
+  @deprecated
   @override
   R visitSetLiteral2(SetLiteral2 node) => null;
 
   @override
+  R visitSetOrMapLiteral(SetOrMapLiteral node) => null;
+
+  @override
   R visitShowCombinator(ShowCombinator node) => null;
 
   @override
@@ -1791,7 +1771,9 @@
  *
  * Clients may extend this class.
  */
-class ThrowingAstVisitor<R> implements AstVisitor<R> {
+class ThrowingAstVisitor<R>
+    with UIAsCodeVisitorMixin<R>
+    implements AstVisitor<R> {
   @override
   R visitAdjacentStrings(AdjacentStrings node) => _throw(node);
 
@@ -1925,9 +1907,6 @@
       _throw(node);
 
   @override
-  R visitForEachStatement(ForEachStatement node) => _throw(node);
-
-  @override
   R visitForElement(ForElement node) => _throw(node);
 
   @override
@@ -1941,9 +1920,6 @@
   R visitForPartsWithExpression(ForPartsWithExpression node) => _throw(node);
 
   @override
-  R visitForStatement(ForStatement node) => _throw(node);
-
-  @override
   R visitForStatement2(ForStatement2 node) => _throw(node);
 
   @override
@@ -2022,12 +1998,11 @@
   @override
   R visitListLiteral(ListLiteral node) => _throw(node);
 
+  @deprecated
   @override
   R visitListLiteral2(ListLiteral2 node) => _throw(node);
 
-  @override
-  R visitMapLiteral(MapLiteral node) => _throw(node);
-
+  @deprecated
   @override
   R visitMapLiteral2(MapLiteral2 node) => _throw(node);
 
@@ -2093,13 +2068,14 @@
   @override
   R visitScriptTag(ScriptTag node) => _throw(node);
 
-  @override
-  R visitSetLiteral(SetLiteral node) => _throw(node);
-
+  @deprecated
   @override
   R visitSetLiteral2(SetLiteral2 node) => _throw(node);
 
   @override
+  R visitSetOrMapLiteral(SetOrMapLiteral node) => _throw(node);
+
+  @override
   R visitShowCombinator(ShowCombinator node) => _throw(node);
 
   @override
@@ -2176,6 +2152,7 @@
 
   @override
   R visitWithClause(WithClause node) => _throw(node);
+
   @override
   R visitYieldStatement(YieldStatement node) => _throw(node);
 
@@ -2189,7 +2166,7 @@
  *
  * Clients may not extend, implement or mix-in this class.
  */
-class TimedAstVisitor<T> implements AstVisitor<T> {
+class TimedAstVisitor<T> with UIAsCodeVisitorMixin<T> implements AstVisitor<T> {
   /**
    * The base visitor whose visit methods will be timed.
    */
@@ -2552,14 +2529,6 @@
   }
 
   @override
-  T visitForEachStatement(ForEachStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitForEachStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
   T visitForElement(ForElement node) {
     stopwatch.start();
     T result = _baseVisitor.visitForElement(node);
@@ -2592,14 +2561,6 @@
   }
 
   @override
-  T visitForStatement(ForStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitForStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
   T visitForStatement2(ForStatement2 node) {
     stopwatch.start();
     T result = _baseVisitor.visitForStatement2(node);
@@ -2799,6 +2760,7 @@
     return result;
   }
 
+  @deprecated
   @override
   T visitListLiteral2(ListLiteral2 node) {
     stopwatch.start();
@@ -2807,14 +2769,7 @@
     return result;
   }
 
-  @override
-  T visitMapLiteral(MapLiteral node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitMapLiteral(node);
-    stopwatch.stop();
-    return result;
-  }
-
+  @deprecated
   @override
   T visitMapLiteral2(MapLiteral2 node) {
     stopwatch.start();
@@ -2984,18 +2939,19 @@
     return result;
   }
 
+  @deprecated
   @override
-  T visitSetLiteral(SetLiteral node) {
+  T visitSetLiteral2(SetLiteral2 node) {
     stopwatch.start();
-    T result = _baseVisitor.visitSetLiteral(node);
+    T result = _baseVisitor.visitSetLiteral2(node);
     stopwatch.stop();
     return result;
   }
 
   @override
-  T visitSetLiteral2(SetLiteral2 node) {
+  T visitSetOrMapLiteral(SetOrMapLiteral node) {
     stopwatch.start();
-    T result = _baseVisitor.visitSetLiteral2(node);
+    T result = _baseVisitor.visitSetOrMapLiteral(node);
     stopwatch.stop();
     return result;
   }
@@ -3221,7 +3177,9 @@
  *
  * Clients may extend this class.
  */
-class UnifyingAstVisitor<R> implements AstVisitor<R> {
+class UnifyingAstVisitor<R>
+    with UIAsCodeVisitorMixin<R>
+    implements AstVisitor<R> {
   @override
   R visitAdjacentStrings(AdjacentStrings node) => visitNode(node);
 
@@ -3356,9 +3314,6 @@
       visitNode(node);
 
   @override
-  R visitForEachStatement(ForEachStatement node) => visitNode(node);
-
-  @override
   R visitForElement(ForElement node) => visitNode(node);
 
   @override
@@ -3372,9 +3327,6 @@
   R visitForPartsWithExpression(ForPartsWithExpression node) => visitNode(node);
 
   @override
-  R visitForStatement(ForStatement node) => visitNode(node);
-
-  @override
   R visitForStatement2(ForStatement2 node) => visitNode(node);
 
   @override
@@ -3454,12 +3406,11 @@
   @override
   R visitListLiteral(ListLiteral node) => visitNode(node);
 
+  @deprecated
   @override
   R visitListLiteral2(ListLiteral2 node) => visitNode(node);
 
-  @override
-  R visitMapLiteral(MapLiteral node) => visitNode(node);
-
+  @deprecated
   @override
   R visitMapLiteral2(MapLiteral2 node) => visitNode(node);
 
@@ -3531,13 +3482,14 @@
   @override
   R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
 
-  @override
-  R visitSetLiteral(SetLiteral node) => visitNode(node);
-
+  @deprecated
   @override
   R visitSetLiteral2(SetLiteral2 node) => visitNode(node);
 
   @override
+  R visitSetOrMapLiteral(SetOrMapLiteral node) => visitNode(node);
+
+  @override
   R visitShowCombinator(ShowCombinator node) => visitNode(node);
 
   @override
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index 19c217d..c4beb80 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -69,6 +69,12 @@
   bool get isDartCoreBool;
 
   /**
+   * Return `true` if this type represents the type 'double' defined in the
+   * dart:core library.
+   */
+  bool get isDartCoreDouble;
+
+  /**
    * Return `true` if this type represents the type 'Function' defined in the
    * dart:core library.
    */
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 22efc18..92894f9 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -216,6 +216,7 @@
   CompileTimeErrorCode.NON_CONSTANT_MAP_KEY,
   CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE,
+  CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT,
   CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT,
   CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY,
@@ -289,6 +290,7 @@
   HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE,
   HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE,
   HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
+  HintCode.INFERENCE_FAILURE_ON_UNINITIALIZED_VARIABLE,
   HintCode.INVALID_FACTORY_ANNOTATION,
   HintCode.INVALID_FACTORY_METHOD_DECL,
   HintCode.INVALID_FACTORY_METHOD_IMPL,
@@ -323,6 +325,7 @@
   HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER,
   HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT,
   HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE,
+  HintCode.STRICT_RAW_TYPE,
   HintCode.SUBTYPE_OF_SEALED_CLASS,
   HintCode.TYPE_CHECK_IS_NOT_NULL,
   HintCode.TYPE_CHECK_IS_NULL,
@@ -330,6 +333,7 @@
   HintCode.UNDEFINED_SHOWN_NAME,
   HintCode.UNNECESSARY_CAST,
   HintCode.UNNECESSARY_NO_SUCH_METHOD,
+  HintCode.UNNECESSARY_NULL_AWARE_CALL,
   HintCode.UNNECESSARY_TYPE_CHECK_FALSE,
   HintCode.UNNECESSARY_TYPE_CHECK_TRUE,
   HintCode.UNUSED_CATCH_CLAUSE,
@@ -392,6 +396,7 @@
   ParserErrorCode.EXPECTED_STRING_LITERAL,
   ParserErrorCode.EXPECTED_TOKEN,
   ParserErrorCode.EXPECTED_TYPE_NAME,
+  ParserErrorCode.EXPERIMENT_NOT_ENABLED,
   ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE,
   ParserErrorCode.EXTERNAL_AFTER_CONST,
   ParserErrorCode.EXTERNAL_AFTER_FACTORY,
@@ -564,6 +569,7 @@
   StaticTypeWarningCode.UNDEFINED_GETTER,
   StaticTypeWarningCode.UNDEFINED_METHOD,
   StaticTypeWarningCode.UNDEFINED_OPERATOR,
+  StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME,
   StaticTypeWarningCode.UNDEFINED_SETTER,
   StaticTypeWarningCode.UNDEFINED_SUPER_GETTER,
   StaticTypeWarningCode.UNDEFINED_SUPER_METHOD,
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index eebc966..b6fd429 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -23,13 +23,11 @@
 import 'package:analyzer/src/plugin/task.dart';
 import 'package:analyzer/src/task/api/dart.dart';
 import 'package:analyzer/src/task/api/general.dart';
-import 'package:analyzer/src/task/api/html.dart';
 import 'package:analyzer/src/task/api/model.dart';
 import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/src/task/dart_work_manager.dart';
 import 'package:analyzer/src/task/driver.dart';
 import 'package:analyzer/src/task/manager.dart';
-import 'package:html/dom.dart' show Document;
 
 /**
  * Type of callback functions used by PendingFuture. Functions of this type
@@ -590,10 +588,6 @@
 
   @override
   List<AnalysisError> computeErrors(Source source) {
-    String name = source.shortName;
-    if (AnalysisEngine.isHtmlFileName(name)) {
-      return computeResult(source, HTML_ERRORS);
-    }
     return computeResult(source, DART_ERRORS);
   }
 
@@ -610,8 +604,6 @@
     String name = source.shortName;
     if (AnalysisEngine.isDartFileName(name)) {
       return computeResult(source, SOURCE_KIND);
-    } else if (AnalysisEngine.isHtmlFileName(name)) {
-      return SourceKind.HTML;
     }
     return SourceKind.UNKNOWN;
   }
@@ -833,24 +825,7 @@
 
   @override
   List<Source> getHtmlFilesReferencing(Source source) {
-    if (!AnalysisEngine.isDartFileName(source.shortName)) {
-      return const <Source>[];
-    }
-    List<Source> htmlSources = <Source>[];
-    List<Source> librarySources = getLibrariesContaining(source);
-    for (Source source in _cache.sources) {
-      if (AnalysisEngine.isHtmlFileName(source.shortName)) {
-        List<Source> referencedLibraries =
-            getResult(source, REFERENCED_LIBRARIES);
-        if (_containsAny(referencedLibraries, librarySources)) {
-          htmlSources.add(source);
-        }
-      }
-    }
-    if (htmlSources.isEmpty) {
-      return const <Source>[];
-    }
-    return htmlSources;
+    return const <Source>[];
   }
 
   @override
@@ -858,8 +833,6 @@
     String name = source.shortName;
     if (AnalysisEngine.isDartFileName(name)) {
       return getResult(source, SOURCE_KIND);
-    } else if (AnalysisEngine.isHtmlFileName(name)) {
-      return SourceKind.HTML;
     }
     return SourceKind.UNKNOWN;
   }
@@ -895,10 +868,6 @@
 
   @override
   List<Source> getLibrariesReferencedFromHtml(Source htmlSource) {
-    CacheEntry entry = _cache.get(htmlSource);
-    if (entry != null) {
-      return entry.getValue(REFERENCED_LIBRARIES);
-    }
     return const <Source>[];
   }
 
@@ -1101,14 +1070,6 @@
   }
 
   @override
-  Document parseHtmlDocument(Source source) {
-    if (!AnalysisEngine.isHtmlFileName(source.shortName)) {
-      return null;
-    }
-    return computeResult(source, HTML_DOCUMENT);
-  }
-
-  @override
   AnalysisResult performAnalysisTask() {
     return PerformanceStatistics.analysis.makeCurrentWhile(() {
       _evaluatePendingFutures();
@@ -1327,19 +1288,6 @@
   }
 
   /**
-   * Return `true` if the given list of [sources] contains any of the given
-   * [targetSources].
-   */
-  bool _containsAny(List<Source> sources, List<Source> targetSources) {
-    for (Source targetSource in targetSources) {
-      if (_contains(sources, targetSource)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
    * Set the contents of the given [source] to the given [contents] and mark the
    * source as having changed. The additional [offset], [oldLength] and
    * [newLength] information is used by the context to determine what reanalysis
@@ -1458,12 +1406,6 @@
           sources.add(source);
         }
       }
-    } else if (kind == SourceKind.HTML) {
-      for (Source source in _cache.sources) {
-        if (AnalysisEngine.isHtmlFileName(source.shortName)) {
-          sources.add(source);
-        }
-      }
     }
     if (sources.isEmpty) {
       return const <Source>[];
diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
index f844029..bacc26c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/analysis/context_locator.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/context_builder.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:meta/meta.dart';
@@ -22,6 +23,7 @@
   /// Initialize a newly created analysis context manager.
   AnalysisContextCollectionImpl(
       {bool enableIndex: false,
+      @deprecated ByteStore byteStore,
       @deprecated FileContentOverlay fileContentOverlay,
       @required List<String> includedPaths,
       ResourceProvider resourceProvider,
@@ -42,6 +44,7 @@
         resourceProvider: this.resourceProvider,
       );
       var context = contextBuilder.createContext(
+        byteStore: byteStore,
         contextRoot: root,
         enableIndex: enableIndex,
         fileContentOverlay: fileContentOverlay,
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
index 09b4dae..482dc4b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
@@ -236,6 +236,28 @@
     }
   }
 
+  void _visitCollectionElement(CollectionElement node) {
+    if (node == null) {
+      return;
+    } else if (node is Expression) {
+      _visitExpression(node);
+    } else if (node is ForElement) {
+      _visitForLoopParts(node.forLoopParts);
+      _visitCollectionElement(node.body);
+    } else if (node is IfElement) {
+      _visitExpression(node.condition);
+      _visitCollectionElement(node.thenElement);
+      _visitCollectionElement(node.elseElement);
+    } else if (node is MapLiteralEntry) {
+      _visitExpression(node.key);
+      _visitExpression(node.value);
+    } else if (node is SpreadElement) {
+      _visitExpression(node.expression);
+    } else {
+      throw UnimplementedError('(${node.runtimeType}) $node');
+    }
+  }
+
   /// Record reference to the constructor of the [type] with the given [name].
   void _visitConstructor(TypeName type, SimpleIdentifier name) {
     _visitTypeAnnotation(type);
@@ -320,8 +342,6 @@
       _visitTypeAnnotation(node.type);
     } else if (node is ListLiteral) {
       _visitListLiteral(node);
-    } else if (node is MapLiteral) {
-      _visitMapLiteral(node);
     } else if (node is MethodInvocation) {
       _visitMethodInvocation(node);
     } else if (node is NamedExpression) {
@@ -340,8 +360,8 @@
       _visitPropertyAccess(node, get: get, set: set);
     } else if (node is RethrowExpression) {
       // no dependencies
-    } else if (node is SetLiteral) {
-      _visitSetLiteral(node);
+    } else if (node is SetOrMapLiteral) {
+      _visitSetOrMapLiteral(node);
     } else if (node is SimpleIdentifier) {
       _visitSimpleIdentifier(node, get: get, set: set);
     } else if (node is SimpleStringLiteral) {
@@ -365,27 +385,34 @@
     }
   }
 
-  void _visitForEachStatement(ForEachStatement node) {
-    var loopVariable = node.loopVariable;
-    if (loopVariable != null) {
-      _visitTypeAnnotation(loopVariable.type);
+  void _visitExpressionList(NodeList<Expression> nodes) {
+    for (Expression node in nodes) {
+      _visitExpression(node);
     }
+  }
 
-    var loopIdentifier = node.identifier;
-    if (loopIdentifier != null) {
-      _visitExpression(loopIdentifier);
+  void _visitForLoopParts(ForLoopParts node) {
+    if (node == null) {
+      return;
+    } else if (node is ForPartsWithDeclarations) {
+      _visitVariableList(node.variables);
+      _visitExpression(node.condition);
+      _visitExpressionList(node.updaters);
+    } else if (node is ForPartsWithExpression) {
+      _visitExpression(node.initialization);
+      _visitExpression(node.condition);
+      _visitExpressionList(node.updaters);
+    } else if (node is ForEachPartsWithDeclaration) {
+      var variable = node.loopVariable;
+      _visitTypeAnnotation(variable.type);
+      _visitExpression(node.iterable);
+      _localScopes.add(variable.identifier.name);
+    } else if (node is ForEachPartsWithIdentifier) {
+      _visitExpression(node.identifier);
+      _visitExpression(node.iterable);
+    } else {
+      throw UnimplementedError('(${node.runtimeType}) $node');
     }
-
-    _visitExpression(node.iterable);
-
-    _localScopes.enter();
-    if (loopVariable != null) {
-      _localScopes.add(loopVariable.identifier.name);
-    }
-
-    _visitStatement(node.body);
-
-    _localScopes.exit();
   }
 
   void _visitFormalParameterList(FormalParameterList node) {
@@ -437,18 +464,10 @@
     }
   }
 
-  void _visitForStatement(ForStatement node) {
+  void _visitForStatement2(ForStatement2 node) {
     _localScopes.enter();
 
-    _visitVariableList(node.variables);
-    _visitExpression(node.initialization);
-    _visitExpression(node.condition);
-
-    var updaters = node.updaters;
-    for (var i = 0; i < updaters.length; i++) {
-      _visitExpression(updaters[i]);
-    }
-
+    _visitForLoopParts(node.forLoopParts);
     _visitStatement(node.body);
 
     _localScopes.exit();
@@ -516,20 +535,10 @@
 
   void _visitListLiteral(ListLiteral node) {
     _visitTypeArguments(node.typeArguments);
-    var elements = node.elements;
+    var elements = node.elements2;
     for (var i = 0; i < elements.length; i++) {
       var element = elements[i];
-      _visitExpression(element);
-    }
-  }
-
-  void _visitMapLiteral(MapLiteral node) {
-    _visitTypeArguments(node.typeArguments);
-    var entries = node.entries;
-    for (var i = 0; i < entries.length; i++) {
-      var entry = entries[i];
-      _visitExpression(entry.key);
-      _visitExpression(entry.value);
+      _visitCollectionElement(element);
     }
   }
 
@@ -608,12 +617,12 @@
     }
   }
 
-  void _visitSetLiteral(SetLiteral node) {
+  void _visitSetOrMapLiteral(SetOrMapLiteral node) {
     _visitTypeArguments(node.typeArguments);
-    var elements = node.elements;
+    var elements = node.elements2;
     for (var i = 0; i < elements.length; i++) {
       var element = elements[i];
-      _visitExpression(element);
+      _visitCollectionElement(element);
     }
   }
 
@@ -653,10 +662,8 @@
       // nothing
     } else if (node is ExpressionStatement) {
       _visitExpression(node.expression);
-    } else if (node is ForEachStatement) {
-      _visitForEachStatement(node);
-    } else if (node is ForStatement) {
-      _visitForStatement(node);
+    } else if (node is ForStatement2) {
+      _visitForStatement2(node);
     } else if (node is FunctionDeclarationStatement) {
       _visitFunctionDeclarationStatement(node);
     } else if (node is IfStatement) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 8655536..3e1a68a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -331,6 +331,9 @@
       for (UnlinkedEnum type in unlinked.enums) {
         addDeclaration(TopLevelDeclarationKind.type, type.name);
       }
+      for (UnlinkedClass type in unlinked.mixins) {
+        addDeclaration(TopLevelDeclarationKind.type, type.name);
+      }
       for (UnlinkedTypedef type in unlinked.typedefs) {
         addDeclaration(TopLevelDeclarationKind.type, type.name);
       }
@@ -702,7 +705,6 @@
     bool useFasta = analysisOptions.useFastaParser;
     Parser parser = new Parser(source, errorListener, useFasta: useFasta);
     parser.enableOptionalNewAndConst = true;
-    parser.enableSetLiterals = experimentStatus.set_literals;
     parser.enableNonNullable = experimentStatus.non_nullable;
     parser.enableSpreadCollections = experimentStatus.spread_collections;
     parser.enableControlFlowCollections =
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index cb200cb..418b2ff 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -55,7 +55,7 @@
   final TypeProvider _typeProvider;
 
   final TypeSystem _typeSystem;
-  bool isNonNullableMigrated = false;
+  bool isNonNullableLibrary = false;
   LibraryElement _libraryElement;
 
   LibraryScope _libraryScope;
@@ -68,6 +68,13 @@
   final List<UsedLocalElements> _usedLocalElementsList = [];
   final Map<FileState, List<PendingError>> _fileToPendingErrors = {};
 
+  /**
+   * Constants in the current library.
+   *
+   * TODO(scheglov) Remove after https://github.com/dart-lang/sdk/issues/31925
+   */
+  final Set<ConstantEvaluationTarget> _libraryConstants = new Set();
+
   final Set<ConstantEvaluationTarget> _constants = new Set();
 
   LibraryAnalyzer(
@@ -102,8 +109,9 @@
     for (FileState file in _library.libraryFiles) {
       units[file] = _parse(file);
     }
-    isNonNullableMigrated = (units.values.first as CompilationUnitImpl)
-        .hasPragmaAnalyzerNonNullable;
+    // TODO(danrubel): Verify that all units are either nullable or non-nullable
+    isNonNullableLibrary =
+        (units.values.first as CompilationUnitImpl).isNonNullable;
 
     // Resolve URIs in directives to corresponding sources.
     units.forEach((file, unit) {
@@ -122,6 +130,7 @@
     });
 
     units.values.forEach(_findConstants);
+    _clearConstantEvaluationResults();
     _computeConstants();
 
     PerformanceStatistics.errors.makeCurrentWhile(() {
@@ -172,6 +181,24 @@
     return results;
   }
 
+  /**
+   * Clear evaluation results for all constants before computing them again.
+   * The reason is described in https://github.com/dart-lang/sdk/issues/35940
+   *
+   * Otherwise, we reuse results, including errors are recorded only when
+   * we evaluate constants resynthesized from summaries.
+   *
+   * TODO(scheglov) Remove after https://github.com/dart-lang/sdk/issues/31925
+   */
+  void _clearConstantEvaluationResults() {
+    for (var constant in _libraryConstants) {
+      if (constant is ConstFieldElementImpl_ofEnum) continue;
+      if (constant is ConstVariableElement) {
+        constant.evaluationResult = null;
+      }
+    }
+  }
+
   void _computeConstantErrors(
       ErrorReporter errorReporter, CompilationUnit unit) {
     ConstantVerifier constantVerifier = new ConstantVerifier(
@@ -203,8 +230,8 @@
       errorListener.onError(pendingError.toAnalysisError());
     }
 
-    unit.accept(
-        new DeadCodeVerifier(errorReporter, typeSystem: _context.typeSystem));
+    unit.accept(new DeadCodeVerifier(errorReporter, isNonNullableLibrary,
+        typeSystem: _context.typeSystem));
 
     // Dart2js analysis.
     if (_analysisOptions.dart2jsHint) {
@@ -379,6 +406,7 @@
   void _findConstants(CompilationUnit unit) {
     ConstantFinder constantFinder = new ConstantFinder();
     unit.accept(constantFinder);
+    _libraryConstants.addAll(constantFinder.constantsToCompute);
     _constants.addAll(constantFinder.constantsToCompute);
 
     var dependenciesFinder = new ConstantExpressionsDependenciesFinder();
@@ -603,12 +631,12 @@
 
     new TypeParameterBoundsResolver(
             _context.typeSystem, _libraryElement, source, errorListener,
-            isNonNullableMigrated: isNonNullableMigrated)
+            isNonNullableUnit: isNonNullableLibrary)
         .resolveTypeBounds(unit);
 
     unit.accept(new TypeResolverVisitor(
         _libraryElement, source, _typeProvider, errorListener,
-        isNonNullableMigrated: isNonNullableMigrated));
+        isNonNullableUnit: isNonNullableLibrary));
 
     unit.accept(new VariableResolverVisitor(
         _libraryElement, source, _typeProvider, errorListener,
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index fd50c1c..b38336b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -5,10 +5,10 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/line_info.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 
 abstract class AnalysisResultImpl implements AnalysisResult {
@@ -137,9 +137,11 @@
       return null;
     }
 
-    var locator = NodeLocator2(element.nameOffset);
-    var node = locator.searchWithin(unitResult.unit)?.parent;
-    return ElementDeclarationResultImpl(element, node, unitResult, null);
+    var locator = _DeclarationByElementLocator(element);
+    unitResult.unit.accept(locator);
+    var declaration = locator.result;
+
+    return ElementDeclarationResultImpl(element, declaration, unitResult, null);
   }
 }
 
@@ -206,9 +208,11 @@
       return null;
     }
 
-    var locator = NodeLocator2(element.nameOffset);
-    var node = locator.searchWithin(unitResult.unit)?.parent;
-    return ElementDeclarationResultImpl(element, node, null, unitResult);
+    var locator = _DeclarationByElementLocator(element);
+    unitResult.unit.accept(locator);
+    var declaration = locator.result;
+
+    return ElementDeclarationResultImpl(element, declaration, null, unitResult);
   }
 
   @Deprecated('This method exists temporary until AnalysisSession migration.')
@@ -294,3 +298,89 @@
   @override
   ResultState get state => ResultState.VALID;
 }
+
+class _DeclarationByElementLocator extends GeneralizingAstVisitor<void> {
+  final Element element;
+  AstNode result;
+
+  _DeclarationByElementLocator(this.element);
+
+  @override
+  void visitNode(AstNode node) {
+    if (result != null) return;
+
+    if (element is ClassElement) {
+      if (node is ClassOrMixinDeclaration) {
+        if (_hasOffset(node.name)) {
+          result = node;
+        }
+      } else if (node is ClassTypeAlias) {
+        if (_hasOffset(node.name)) {
+          result = node;
+        }
+      } else if (node is EnumDeclaration) {
+        if (_hasOffset(node.name)) {
+          result = node;
+        }
+      }
+    } else if (element is ConstructorElement) {
+      if (node is ConstructorDeclaration) {
+        if (node.name != null) {
+          if (_hasOffset(node.name)) {
+            result = node;
+          }
+        } else {
+          if (_hasOffset(node.returnType)) {
+            result = node;
+          }
+        }
+      }
+    } else if (element is FieldElement) {
+      if (node is EnumConstantDeclaration) {
+        if (_hasOffset(node.name)) {
+          result = node;
+        }
+      } else if (node is VariableDeclaration) {
+        if (_hasOffset(node.name)) {
+          result = node;
+        }
+      }
+    } else if (element is FunctionElement) {
+      if (node is FunctionDeclaration && _hasOffset(node.name)) {
+        result = node;
+      }
+    } else if (element is LocalVariableElement) {
+      if (node is VariableDeclaration && _hasOffset(node.name)) {
+        result = node;
+      }
+    } else if (element is MethodElement) {
+      if (node is MethodDeclaration && _hasOffset(node.name)) {
+        result = node;
+      }
+    } else if (element is ParameterElement) {
+      if (node is FormalParameter && _hasOffset(node.identifier)) {
+        result = node;
+      }
+    } else if (element is PropertyAccessorElement) {
+      if (node is FunctionDeclaration) {
+        if (_hasOffset(node.name)) {
+          result = node;
+        }
+      } else if (node is MethodDeclaration) {
+        if (_hasOffset(node.name)) {
+          result = node;
+        }
+      }
+    } else if (element is TopLevelVariableElement) {
+      if (node is VariableDeclaration && _hasOffset(node.name)) {
+        result = node;
+      }
+    }
+
+    super.visitNode(node);
+  }
+
+  bool _hasOffset(AstNode node) {
+    return node?.offset == element.nameOffset;
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 93bfdfd..5144eeb 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -6,6 +6,7 @@
 import 'dart:math' as math;
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/precedence.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -27,27 +28,21 @@
 import 'package:analyzer/src/generated/source.dart' show LineInfo, Source;
 import 'package:analyzer/src/generated/utilities_dart.dart';
 
-/**
- * Two or more string literals that are implicitly concatenated because of being
- * adjacent (separated only by whitespace).
- *
- * While the grammar only allows adjacent strings when all of the strings are of
- * the same kind (single line or multi-line), this class doesn't enforce that
- * restriction.
- *
- *    adjacentStrings ::=
- *        [StringLiteral] [StringLiteral]+
- */
+/// Two or more string literals that are implicitly concatenated because of
+/// being adjacent (separated only by whitespace).
+///
+/// While the grammar only allows adjacent strings when all of the strings are
+/// of the same kind (single line or multi-line), this class doesn't enforce
+/// that restriction.
+///
+///    adjacentStrings ::=
+///        [StringLiteral] [StringLiteral]+
 class AdjacentStringsImpl extends StringLiteralImpl implements AdjacentStrings {
-  /**
-   * The strings that are implicitly concatenated.
-   */
+  /// The strings that are implicitly concatenated.
   NodeList<StringLiteral> _strings;
 
-  /**
-   * Initialize a newly created list of adjacent strings. To be syntactically
-   * valid, the list of [strings] must contain at least two elements.
-   */
+  /// Initialize a newly created list of adjacent strings. To be syntactically
+  /// valid, the list of [strings] must contain at least two elements.
   AdjacentStringsImpl(List<StringLiteral> strings) {
     _strings = new NodeListImpl<StringLiteral>(this, strings);
   }
@@ -83,27 +78,19 @@
   }
 }
 
-/**
- * An AST node that can be annotated with both a documentation comment and a
- * list of annotations.
- */
+/// An AST node that can be annotated with both a documentation comment and a
+/// list of annotations.
 abstract class AnnotatedNodeImpl extends AstNodeImpl implements AnnotatedNode {
-  /**
-   * The documentation comment associated with this node, or `null` if this node
-   * does not have a documentation comment associated with it.
-   */
+  /// The documentation comment associated with this node, or `null` if this
+  /// node does not have a documentation comment associated with it.
   CommentImpl _comment;
 
-  /**
-   * The annotations associated with this node.
-   */
+  /// The annotations associated with this node.
   NodeList<Annotation> _metadata;
 
-  /**
-   * Initialize a newly created annotated node. Either or both of the [comment]
-   * and [metadata] can be `null` if the node does not have the corresponding
-   * attribute.
-   */
+  /// Initialize a newly created annotated node. Either or both of the [comment]
+  /// and [metadata] can be `null` if the node does not have the corresponding
+  /// attribute.
   AnnotatedNodeImpl(CommentImpl comment, List<Annotation> metadata) {
     _comment = _becomeParentOf(comment);
     _metadata = new NodeListImpl<Annotation>(this, metadata);
@@ -146,9 +133,7 @@
       ..sort(AstNode.LEXICAL_ORDER);
   }
 
-  /**
-   * Return a holder of child entities that subclasses can add to.
-   */
+  /// Return a holder of child entities that subclasses can add to.
   ChildEntities get _childEntities {
     ChildEntities result = new ChildEntities();
     if (_commentIsBeforeAnnotations()) {
@@ -175,11 +160,9 @@
     }
   }
 
-  /**
-   * Return `true` if there are no annotations before the comment. Note that a
-   * result of `true` does not imply that there is a comment, nor that there are
-   * annotations associated with this node.
-   */
+  /// Return `true` if there are no annotations before the comment. Note that a
+  /// result of `true` does not imply that there is a comment, nor that there
+  /// are annotations associated with this node.
   bool _commentIsBeforeAnnotations() {
     if (_comment == null || _metadata.isEmpty) {
       return true;
@@ -189,65 +172,48 @@
   }
 }
 
-/**
- * An annotation that can be associated with an AST node.
- *
- *    metadata ::=
- *        annotation*
- *
- *    annotation ::=
- *        '@' [Identifier] ('.' [SimpleIdentifier])? [ArgumentList]?
- */
+/// An annotation that can be associated with an AST node.
+///
+///    metadata ::=
+///        annotation*
+///
+///    annotation ::=
+///        '@' [Identifier] ('.' [SimpleIdentifier])? [ArgumentList]?
 class AnnotationImpl extends AstNodeImpl implements Annotation {
-  /**
-   * The at sign that introduced the annotation.
-   */
+  /// The at sign that introduced the annotation.
   @override
   Token atSign;
 
-  /**
-   * The name of the class defining the constructor that is being invoked or the
-   * name of the field that is being referenced.
-   */
+  /// The name of the class defining the constructor that is being invoked or
+  /// the name of the field that is being referenced.
   IdentifierImpl _name;
 
-  /**
-   * The period before the constructor name, or `null` if this annotation is not
-   * the invocation of a named constructor.
-   */
+  /// The period before the constructor name, or `null` if this annotation is
+  /// not the invocation of a named constructor.
   @override
   Token period;
 
-  /**
-   * The name of the constructor being invoked, or `null` if this annotation is
-   * not the invocation of a named constructor.
-   */
+  /// The name of the constructor being invoked, or `null` if this annotation is
+  /// not the invocation of a named constructor.
   SimpleIdentifierImpl _constructorName;
 
-  /**
-   * The arguments to the constructor being invoked, or `null` if this
-   * annotation is not the invocation of a constructor.
-   */
+  /// The arguments to the constructor being invoked, or `null` if this
+  /// annotation is not the invocation of a constructor.
   ArgumentListImpl _arguments;
 
-  /**
-   * The element associated with this annotation, or `null` if the AST structure
-   * has not been resolved or if this annotation could not be resolved.
-   */
+  /// The element associated with this annotation, or `null` if the AST
+  /// structure has not been resolved or if this annotation could not be
+  /// resolved.
   Element _element;
 
-  /**
-   * The element annotation representing this annotation in the element model.
-   */
+  /// The element annotation representing this annotation in the element model.
   @override
   ElementAnnotation elementAnnotation;
 
-  /**
-   * Initialize a newly created annotation. Both the [period] and the
-   * [constructorName] can be `null` if the annotation is not referencing a
-   * named constructor. The [arguments] can be `null` if the annotation is not
-   * referencing a constructor.
-   */
+  /// Initialize a newly created annotation. Both the [period] and the
+  /// [constructorName] can be `null` if the annotation is not referencing a
+  /// named constructor. The [arguments] can be `null` if the annotation is not
+  /// referencing a constructor.
   AnnotationImpl(this.atSign, IdentifierImpl name, this.period,
       SimpleIdentifierImpl constructorName, ArgumentListImpl arguments) {
     _name = _becomeParentOf(name);
@@ -326,49 +292,37 @@
   }
 }
 
-/**
- * A list of arguments in the invocation of an executable element (that is, a
- * function, method, or constructor).
- *
- *    argumentList ::=
- *        '(' arguments? ')'
- *
- *    arguments ::=
- *        [NamedExpression] (',' [NamedExpression])*
- *      | [Expression] (',' [Expression])* (',' [NamedExpression])*
- */
+/// A list of arguments in the invocation of an executable element (that is, a
+/// function, method, or constructor).
+///
+///    argumentList ::=
+///        '(' arguments? ')'
+///
+///    arguments ::=
+///        [NamedExpression] (',' [NamedExpression])*
+///      | [Expression] (',' [Expression])* (',' [NamedExpression])*
 class ArgumentListImpl extends AstNodeImpl implements ArgumentList {
-  /**
-   * The left parenthesis.
-   */
+  /// The left parenthesis.
   @override
   Token leftParenthesis;
 
-  /**
-   * The expressions producing the values of the arguments.
-   */
+  /// The expressions producing the values of the arguments.
   NodeList<Expression> _arguments;
 
-  /**
-   * The right parenthesis.
-   */
+  /// The right parenthesis.
   @override
   Token rightParenthesis;
 
-  /**
-   * A list containing the elements representing the parameters corresponding to
-   * each of the arguments in this list, or `null` if the AST has not been
-   * resolved or if the function or method being invoked could not be determined
-   * based on static type information. The list must be the same length as the
-   * number of arguments, but can contain `null` entries if a given argument
-   * does not correspond to a formal parameter.
-   */
+  /// A list containing the elements representing the parameters corresponding
+  /// to each of the arguments in this list, or `null` if the AST has not been
+  /// resolved or if the function or method being invoked could not be
+  /// determined based on static type information. The list must be the same
+  /// length as the number of arguments, but can contain `null` entries if a
+  /// given argument does not correspond to a formal parameter.
   List<ParameterElement> _correspondingStaticParameters;
 
-  /**
-   * Initialize a newly created list of arguments. The list of [arguments] can
-   * be `null` if there are no arguments.
-   */
+  /// Initialize a newly created list of arguments. The list of [arguments] can
+  /// be `null` if there are no arguments.
   ArgumentListImpl(
       this.leftParenthesis, List<Expression> arguments, this.rightParenthesis) {
     _arguments = new NodeListImpl<Expression>(this, arguments);
@@ -423,16 +377,15 @@
     _arguments.accept(visitor);
   }
 
-  /**
-   * If
-   * * the given [expression] is a child of this list,
-   * * the AST structure has been resolved,
-   * * the function being invoked is known based on static type information, and
-   * * the expression corresponds to one of the parameters of the function being
-   *   invoked,
-   * then return the parameter element representing the parameter to which the
-   * value of the given expression will be bound. Otherwise, return `null`.
-   */
+  /// If
+  /// * the given [expression] is a child of this list,
+  /// * the AST structure has been resolved,
+  /// * the function being invoked is known based on static type information,
+  ///   and
+  /// * the expression corresponds to one of the parameters of the function
+  ///   being invoked,
+  /// then return the parameter element representing the parameter to which the
+  /// value of the given expression will be bound. Otherwise, return `null`.
   ParameterElement _getStaticParameterElementFor(Expression expression) {
     if (_correspondingStaticParameters == null ||
         _correspondingStaticParameters.length != _arguments.length) {
@@ -450,32 +403,22 @@
   }
 }
 
-/**
- * An as expression.
- *
- *    asExpression ::=
- *        [Expression] 'as' [TypeName]
- */
+/// An as expression.
+///
+///    asExpression ::=
+///        [Expression] 'as' [TypeName]
 class AsExpressionImpl extends ExpressionImpl implements AsExpression {
-  /**
-   * The expression used to compute the value being cast.
-   */
+  /// The expression used to compute the value being cast.
   ExpressionImpl _expression;
 
-  /**
-   * The 'as' operator.
-   */
+  /// The 'as' operator.
   @override
   Token asOperator;
 
-  /**
-   * The type being cast to.
-   */
+  /// The type being cast to.
   TypeAnnotationImpl _type;
 
-  /**
-   * Initialize a newly created as expression.
-   */
+  /// Initialize a newly created as expression.
   AsExpressionImpl(
       ExpressionImpl expression, this.asOperator, TypeAnnotationImpl type) {
     _expression = _becomeParentOf(expression);
@@ -500,8 +443,13 @@
     _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 7;
+  int get precedence => RELATIONAL_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.relational;
 
   @override
   TypeAnnotation get type => _type;
@@ -521,12 +469,10 @@
   }
 }
 
-/**
- * An assert in the initializer list of a constructor.
- *
- *    assertInitializer ::=
- *        'assert' '(' [Expression] (',' [Expression])? ')'
- */
+/// An assert in the initializer list of a constructor.
+///
+///    assertInitializer ::=
+///        'assert' '(' [Expression] (',' [Expression])? ')'
 class AssertInitializerImpl extends ConstructorInitializerImpl
     implements AssertInitializer {
   @override
@@ -535,26 +481,20 @@
   @override
   Token leftParenthesis;
 
-  /**
-   * The condition that is being asserted to be `true`.
-   */
+  /// The condition that is being asserted to be `true`.
   ExpressionImpl _condition;
 
   @override
   Token comma;
 
-  /**
-   * The message to report if the assertion fails, or `null` if no message was
-   * supplied.
-   */
+  /// The message to report if the assertion fails, or `null` if no message was
+  /// supplied.
   ExpressionImpl _message;
 
   @override
   Token rightParenthesis;
 
-  /**
-   * Initialize a newly created assert initializer.
-   */
+  /// Initialize a newly created assert initializer.
   AssertInitializerImpl(
       this.assertKeyword,
       this.leftParenthesis,
@@ -607,12 +547,10 @@
   }
 }
 
-/**
- * An assert statement.
- *
- *    assertStatement ::=
- *        'assert' '(' [Expression] ')' ';'
- */
+/// An assert statement.
+///
+///    assertStatement ::=
+///        'assert' '(' [Expression] ')' ';'
 class AssertStatementImpl extends StatementImpl implements AssertStatement {
   @override
   Token assertKeyword;
@@ -620,18 +558,14 @@
   @override
   Token leftParenthesis;
 
-  /**
-   * The condition that is being asserted to be `true`.
-   */
+  /// The condition that is being asserted to be `true`.
   ExpressionImpl _condition;
 
   @override
   Token comma;
 
-  /**
-   * The message to report if the assertion fails, or `null` if no message was
-   * supplied.
-   */
+  /// The message to report if the assertion fails, or `null` if no message was
+  /// supplied.
   ExpressionImpl _message;
 
   @override
@@ -640,9 +574,7 @@
   @override
   Token semicolon;
 
-  /**
-   * Initialize a newly created assert statement.
-   */
+  /// Initialize a newly created assert statement.
   AssertStatementImpl(
       this.assertKeyword,
       this.leftParenthesis,
@@ -697,42 +629,30 @@
   }
 }
 
-/**
- * An assignment expression.
- *
- *    assignmentExpression ::=
- *        [Expression] operator [Expression]
- */
+/// An assignment expression.
+///
+///    assignmentExpression ::=
+///        [Expression] operator [Expression]
 class AssignmentExpressionImpl extends ExpressionImpl
     implements AssignmentExpression {
-  /**
-   * The expression used to compute the left hand side.
-   */
+  /// The expression used to compute the left hand side.
   ExpressionImpl _leftHandSide;
 
-  /**
-   * The assignment operator being applied.
-   */
+  /// The assignment operator being applied.
   @override
   Token operator;
 
-  /**
-   * The expression used to compute the right hand side.
-   */
+  /// The expression used to compute the right hand side.
   ExpressionImpl _rightHandSide;
 
-  /**
-   * The element associated with the operator based on the static type of the
-   * left-hand-side, or `null` if the AST structure has not been resolved, if
-   * the operator is not a compound operator, or if the operator could not be
-   * resolved.
-   */
+  /// The element associated with the operator based on the static type of the
+  /// left-hand-side, or `null` if the AST structure has not been resolved, if
+  /// the operator is not a compound operator, or if the operator could not be
+  /// resolved.
   @override
   MethodElement staticElement;
 
-  /**
-   * Initialize a newly created assignment expression.
-   */
+  /// Initialize a newly created assignment expression.
   AssignmentExpressionImpl(ExpressionImpl leftHandSide, this.operator,
       ExpressionImpl rightHandSide) {
     if (leftHandSide == null || rightHandSide == null) {
@@ -777,8 +697,13 @@
     _leftHandSide = _becomeParentOf(expression as ExpressionImpl);
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 1;
+  int get precedence => ASSIGNMENT_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.assignment;
 
   @deprecated
   @override
@@ -796,12 +721,10 @@
     _rightHandSide = _becomeParentOf(expression as ExpressionImpl);
   }
 
-  /**
-   * If the AST structure has been resolved, and the function being invoked is
-   * known based on static type information, then return the parameter element
-   * representing the parameter to which the value of the right operand will be
-   * bound. Otherwise, return `null`.
-   */
+  /// If the AST structure has been resolved, and the function being invoked is
+  /// known based on static type information, then return the parameter element
+  /// representing the parameter to which the value of the right operand will be
+  /// bound. Otherwise, return `null`.
   ParameterElement get _staticParameterElementForRightHandSide {
     ExecutableElement executableElement = null;
     if (staticElement != null) {
@@ -840,20 +763,14 @@
   }
 }
 
-/**
- * A node in the AST structure for a Dart program.
- */
+/// A node in the AST structure for a Dart program.
 abstract class AstNodeImpl implements AstNode {
-  /**
-   * The parent of the node, or `null` if the node is the root of an AST
-   * structure.
-   */
+  /// The parent of the node, or `null` if the node is the root of an AST
+  /// structure.
   AstNode _parent;
 
-  /**
-   * A table mapping the names of properties to their values, or `null` if this
-   * node does not have any properties associated with it.
-   */
+  /// A table mapping the names of properties to their values, or `null` if this
+  /// node does not have any properties associated with it.
   Map<String, Object> _propertyMap;
 
   @override
@@ -957,9 +874,8 @@
   @override
   String toString() => toSource();
 
-  /**
-   * Make this node the parent of the given [child] node. Return the child node.
-   */
+  /// Make this node the parent of the given [child] node. Return the child
+  /// node.
   T _becomeParentOf<T extends AstNodeImpl>(T child) {
     if (child != null) {
       child._parent = this;
@@ -968,27 +884,19 @@
   }
 }
 
-/**
- * An await expression.
- *
- *    awaitExpression ::=
- *        'await' [Expression]
- */
+/// An await expression.
+///
+///    awaitExpression ::=
+///        'await' [Expression]
 class AwaitExpressionImpl extends ExpressionImpl implements AwaitExpression {
-  /**
-   * The 'await' keyword.
-   */
+  /// The 'await' keyword.
   @override
   Token awaitKeyword;
 
-  /**
-   * The expression whose value is being waited on.
-   */
+  /// The expression whose value is being waited on.
   ExpressionImpl _expression;
 
-  /**
-   * Initialize a newly created await expression.
-   */
+  /// Initialize a newly created await expression.
   AwaitExpressionImpl(this.awaitKeyword, ExpressionImpl expression) {
     _expression = _becomeParentOf(expression);
   }
@@ -1016,8 +924,13 @@
     _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 14;
+  int get precedence => PREFIX_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.prefix;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitAwaitExpression(this);
@@ -1028,43 +941,31 @@
   }
 }
 
-/**
- * A binary (infix) expression.
- *
- *    binaryExpression ::=
- *        [Expression] [Token] [Expression]
- */
+/// A binary (infix) expression.
+///
+///    binaryExpression ::=
+///        [Expression] [Token] [Expression]
 class BinaryExpressionImpl extends ExpressionImpl implements BinaryExpression {
-  /**
-   * The expression used to compute the left operand.
-   */
+  /// The expression used to compute the left operand.
   ExpressionImpl _leftOperand;
 
-  /**
-   * The binary operator being applied.
-   */
+  /// The binary operator being applied.
   @override
   Token operator;
 
-  /**
-   * The expression used to compute the right operand.
-   */
+  /// The expression used to compute the right operand.
   ExpressionImpl _rightOperand;
 
-  /**
-   * The element associated with the operator based on the static type of the
-   * left operand, or `null` if the AST structure has not been resolved, if the
-   * operator is not user definable, or if the operator could not be resolved.
-   */
+  /// The element associated with the operator based on the static type of the
+  /// left operand, or `null` if the AST structure has not been resolved, if the
+  /// operator is not user definable, or if the operator could not be resolved.
   @override
   MethodElement staticElement;
 
   @override
   FunctionType staticInvokeType;
 
-  /**
-   * Initialize a newly created binary expression.
-   */
+  /// Initialize a newly created binary expression.
   BinaryExpressionImpl(
       ExpressionImpl leftOperand, this.operator, ExpressionImpl rightOperand) {
     _leftOperand = _becomeParentOf(leftOperand);
@@ -1093,9 +994,14 @@
     _leftOperand = _becomeParentOf(expression as ExpressionImpl);
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
   int get precedence => operator.type.precedence;
 
+  @override
+  Precedence get precedence2 => Precedence.forTokenType(operator.type);
+
   @deprecated
   @override
   MethodElement get propagatedElement => null;
@@ -1122,39 +1028,29 @@
   }
 }
 
-/**
- * A function body that consists of a block of statements.
- *
- *    blockFunctionBody ::=
- *        ('async' | 'async' '*' | 'sync' '*')? [Block]
- */
+/// A function body that consists of a block of statements.
+///
+///    blockFunctionBody ::=
+///        ('async' | 'async' '*' | 'sync' '*')? [Block]
 class BlockFunctionBodyImpl extends FunctionBodyImpl
     implements BlockFunctionBody {
-  /**
-   * The token representing the 'async' or 'sync' keyword, or `null` if there is
-   * no such keyword.
-   */
+  /// The token representing the 'async' or 'sync' keyword, or `null` if there
+  /// is no such keyword.
   @override
   Token keyword;
 
-  /**
-   * The star optionally following the 'async' or 'sync' keyword, or `null` if
-   * there is wither no such keyword or no star.
-   */
+  /// The star optionally following the 'async' or 'sync' keyword, or `null` if
+  /// there is wither no such keyword or no star.
   @override
   Token star;
 
-  /**
-   * The block representing the body of the function.
-   */
+  /// The block representing the body of the function.
   BlockImpl _block;
 
-  /**
-   * Initialize a newly created function body consisting of a block of
-   * statements. The [keyword] can be `null` if there is no keyword specified
-   * for the block. The [star] can be `null` if there is no star following the
-   * keyword (and must be `null` if there is no keyword).
-   */
+  /// Initialize a newly created function body consisting of a block of
+  /// statements. The [keyword] can be `null` if there is no keyword specified
+  /// for the block. The [star] can be `null` if there is no star following the
+  /// keyword (and must be `null` if there is no keyword).
   BlockFunctionBodyImpl(this.keyword, this.star, BlockImpl block) {
     _block = _becomeParentOf(block);
   }
@@ -1200,33 +1096,23 @@
   }
 }
 
-/**
- * A sequence of statements.
- *
- *    block ::=
- *        '{' statement* '}'
- */
+/// A sequence of statements.
+///
+///    block ::=
+///        '{' statement* '}'
 class BlockImpl extends StatementImpl implements Block {
-  /**
-   * The left curly bracket.
-   */
+  /// The left curly bracket.
   @override
   Token leftBracket;
 
-  /**
-   * The statements contained in the block.
-   */
+  /// The statements contained in the block.
   NodeList<Statement> _statements;
 
-  /**
-   * The right curly bracket.
-   */
+  /// The right curly bracket.
   @override
   Token rightBracket;
 
-  /**
-   * Initialize a newly created block of code.
-   */
+  /// Initialize a newly created block of code.
   BlockImpl(this.leftBracket, List<Statement> statements, this.rightBracket) {
     _statements = new NodeListImpl<Statement>(this, statements);
   }
@@ -1255,28 +1141,20 @@
   }
 }
 
-/**
- * A boolean literal expression.
- *
- *    booleanLiteral ::=
- *        'false' | 'true'
- */
+/// A boolean literal expression.
+///
+///    booleanLiteral ::=
+///        'false' | 'true'
 class BooleanLiteralImpl extends LiteralImpl implements BooleanLiteral {
-  /**
-   * The token representing the literal.
-   */
+  /// The token representing the literal.
   @override
   Token literal;
 
-  /**
-   * The value of the literal.
-   */
+  /// The value of the literal.
   @override
   bool value = false;
 
-  /**
-   * Initialize a newly created boolean literal.
-   */
+  /// Initialize a newly created boolean literal.
   BooleanLiteralImpl(this.literal, this.value);
 
   @override
@@ -1301,46 +1179,34 @@
   }
 }
 
-/**
- * A break statement.
- *
- *    breakStatement ::=
- *        'break' [SimpleIdentifier]? ';'
- */
+/// A break statement.
+///
+///    breakStatement ::=
+///        'break' [SimpleIdentifier]? ';'
 class BreakStatementImpl extends StatementImpl implements BreakStatement {
-  /**
-   * The token representing the 'break' keyword.
-   */
+  /// The token representing the 'break' keyword.
   @override
   Token breakKeyword;
 
-  /**
-   * The label associated with the statement, or `null` if there is no label.
-   */
+  /// The label associated with the statement, or `null` if there is no label.
   SimpleIdentifierImpl _label;
 
-  /**
-   * The semicolon terminating the statement.
-   */
+  /// The semicolon terminating the statement.
   @override
   Token semicolon;
 
-  /**
-   * The AstNode which this break statement is breaking from.  This will be
-   * either a [Statement] (in the case of breaking out of a loop), a
-   * [SwitchMember] (in the case of a labeled break statement whose label
-   * matches a label on a switch case in an enclosing switch statement), or
-   * `null` if the AST has not yet been resolved or if the target could not be
-   * resolved. Note that if the source code has errors, the target might be
-   * invalid (e.g. trying to break to a switch case).
-   */
+  /// The AstNode which this break statement is breaking from.  This will be
+  /// either a [Statement] (in the case of breaking out of a loop), a
+  /// [SwitchMember] (in the case of a labeled break statement whose label
+  /// matches a label on a switch case in an enclosing switch statement), or
+  /// `null` if the AST has not yet been resolved or if the target could not be
+  /// resolved. Note that if the source code has errors, the target might be
+  /// invalid (e.g. trying to break to a switch case).
   @override
   AstNode target;
 
-  /**
-   * Initialize a newly created break statement. The [label] can be `null` if
-   * there is no label associated with the statement.
-   */
+  /// Initialize a newly created break statement. The [label] can be `null` if
+  /// there is no label associated with the statement.
   BreakStatementImpl(
       this.breakKeyword, SimpleIdentifierImpl label, this.semicolon) {
     _label = _becomeParentOf(label);
@@ -1373,38 +1239,30 @@
   }
 }
 
-/**
- * A sequence of cascaded expressions: expressions that share a common target.
- * There are three kinds of expressions that can be used in a cascade
- * expression: [IndexExpression], [MethodInvocation] and [PropertyAccess].
- *
- *    cascadeExpression ::=
- *        [Expression] cascadeSection*
- *
- *    cascadeSection ::=
- *        '..'  (cascadeSelector arguments*) (assignableSelector arguments*)*
- *        (assignmentOperator expressionWithoutCascade)?
- *
- *    cascadeSelector ::=
- *        '[ ' expression '] '
- *      | identifier
- */
+/// A sequence of cascaded expressions: expressions that share a common target.
+/// There are three kinds of expressions that can be used in a cascade
+/// expression: [IndexExpression], [MethodInvocation] and [PropertyAccess].
+///
+///    cascadeExpression ::=
+///        [Expression] cascadeSection*
+///
+///    cascadeSection ::=
+///        '..'  (cascadeSelector arguments*) (assignableSelector arguments*)*
+///        (assignmentOperator expressionWithoutCascade)?
+///
+///    cascadeSelector ::=
+///        '[ ' expression '] '
+///      | identifier
 class CascadeExpressionImpl extends ExpressionImpl
     implements CascadeExpression {
-  /**
-   * The target of the cascade sections.
-   */
+  /// The target of the cascade sections.
   ExpressionImpl _target;
 
-  /**
-   * The cascade sections sharing the common target.
-   */
+  /// The cascade sections sharing the common target.
   NodeList<Expression> _cascadeSections;
 
-  /**
-   * Initialize a newly created cascade expression. The list of
-   * [cascadeSections] must contain at least one element.
-   */
+  /// Initialize a newly created cascade expression. The list of
+  /// [cascadeSections] must contain at least one element.
   CascadeExpressionImpl(
       ExpressionImpl target, List<Expression> cascadeSections) {
     _target = _becomeParentOf(target);
@@ -1425,8 +1283,13 @@
   @override
   Token get endToken => _cascadeSections.endToken;
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 2;
+  int get precedence => CASCADE_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.cascade;
 
   @override
   Expression get target => _target;
@@ -1446,79 +1309,57 @@
   }
 }
 
-/**
- * A catch clause within a try statement.
- *
- *    onPart ::=
- *        catchPart [Block]
- *      | 'on' type catchPart? [Block]
- *
- *    catchPart ::=
- *        'catch' '(' [SimpleIdentifier] (',' [SimpleIdentifier])? ')'
- */
+/// A catch clause within a try statement.
+///
+///    onPart ::=
+///        catchPart [Block]
+///      | 'on' type catchPart? [Block]
+///
+///    catchPart ::=
+///        'catch' '(' [SimpleIdentifier] (',' [SimpleIdentifier])? ')'
 class CatchClauseImpl extends AstNodeImpl implements CatchClause {
-  /**
-   * The token representing the 'on' keyword, or `null` if there is no 'on'
-   * keyword.
-   */
+  /// The token representing the 'on' keyword, or `null` if there is no 'on'
+  /// keyword.
   @override
   Token onKeyword;
 
-  /**
-   * The type of exceptions caught by this catch clause, or `null` if this catch
-   * clause catches every type of exception.
-   */
+  /// The type of exceptions caught by this catch clause, or `null` if this
+  /// catch clause catches every type of exception.
   TypeAnnotationImpl _exceptionType;
 
-  /**
-   * The token representing the 'catch' keyword, or `null` if there is no
-   * 'catch' keyword.
-   */
+  /// The token representing the 'catch' keyword, or `null` if there is no
+  /// 'catch' keyword.
   @override
   Token catchKeyword;
 
-  /**
-   * The left parenthesis, or `null` if there is no 'catch' keyword.
-   */
+  /// The left parenthesis, or `null` if there is no 'catch' keyword.
   @override
   Token leftParenthesis;
 
-  /**
-   * The parameter whose value will be the exception that was thrown, or `null`
-   * if there is no 'catch' keyword.
-   */
+  /// The parameter whose value will be the exception that was thrown, or `null`
+  /// if there is no 'catch' keyword.
   SimpleIdentifierImpl _exceptionParameter;
 
-  /**
-   * The comma separating the exception parameter from the stack trace
-   * parameter, or `null` if there is no stack trace parameter.
-   */
+  /// The comma separating the exception parameter from the stack trace
+  /// parameter, or `null` if there is no stack trace parameter.
   @override
   Token comma;
 
-  /**
-   * The parameter whose value will be the stack trace associated with the
-   * exception, or `null` if there is no stack trace parameter.
-   */
+  /// The parameter whose value will be the stack trace associated with the
+  /// exception, or `null` if there is no stack trace parameter.
   SimpleIdentifierImpl _stackTraceParameter;
 
-  /**
-   * The right parenthesis, or `null` if there is no 'catch' keyword.
-   */
+  /// The right parenthesis, or `null` if there is no 'catch' keyword.
   @override
   Token rightParenthesis;
 
-  /**
-   * The body of the catch block.
-   */
+  /// The body of the catch block.
   BlockImpl _body;
 
-  /**
-   * Initialize a newly created catch clause. The [onKeyword] and
-   * [exceptionType] can be `null` if the clause will catch all exceptions. The
-   * [comma] and [stackTraceParameter] can be `null` if the stack trace
-   * parameter is not defined.
-   */
+  /// Initialize a newly created catch clause. The [onKeyword] and
+  /// [exceptionType] can be `null` if the clause will catch all exceptions. The
+  /// [comma] and [stackTraceParameter] can be `null` if the stack trace
+  /// parameter is not defined.
   CatchClauseImpl(
       this.onKeyword,
       TypeAnnotationImpl exceptionType,
@@ -1602,32 +1443,24 @@
   }
 }
 
-/**
- * Helper class to allow iteration of child entities of an AST node.
- */
+/// Helper class to allow iteration of child entities of an AST node.
 class ChildEntities
     with IterableMixin<SyntacticEntity>
     implements Iterable<SyntacticEntity> {
-  /**
-   * The list of child entities to be iterated over.
-   */
+  /// The list of child entities to be iterated over.
   List<SyntacticEntity> _entities = [];
 
   @override
   Iterator<SyntacticEntity> get iterator => _entities.iterator;
 
-  /**
-   * Add an AST node or token as the next child entity, if it is not null.
-   */
+  /// Add an AST node or token as the next child entity, if it is not null.
   void add(SyntacticEntity entity) {
     if (entity != null) {
       _entities.add(entity);
     }
   }
 
-  /**
-   * Add the given items as the next child entities, if [items] is not null.
-   */
+  /// Add the given items as the next child entities, if [items] is not null.
   void addAll(Iterable<SyntacticEntity> items) {
     if (items != null) {
       _entities.addAll(items);
@@ -1635,57 +1468,43 @@
   }
 }
 
-/**
- * The declaration of a class.
- *
- *    classDeclaration ::=
- *        'abstract'? 'class' [SimpleIdentifier] [TypeParameterList]?
- *        ([ExtendsClause] [WithClause]?)?
- *        [ImplementsClause]?
- *        '{' [ClassMember]* '}'
- */
+/// The declaration of a class.
+///
+///    classDeclaration ::=
+///        'abstract'? 'class' [SimpleIdentifier] [TypeParameterList]?
+///        ([ExtendsClause] [WithClause]?)?
+///        [ImplementsClause]?
+///        '{' [ClassMember]* '}'
 class ClassDeclarationImpl extends ClassOrMixinDeclarationImpl
     implements ClassDeclaration {
-  /**
-   * The 'abstract' keyword, or `null` if the keyword was absent.
-   */
+  /// The 'abstract' keyword, or `null` if the keyword was absent.
   @override
   Token abstractKeyword;
 
-  /**
-   * The token representing the 'class' keyword.
-   */
+  /// The token representing the 'class' keyword.
   @override
   Token classKeyword;
 
-  /**
-   * The extends clause for the class, or `null` if the class does not extend
-   * any other class.
-   */
+  /// The extends clause for the class, or `null` if the class does not extend
+  /// any other class.
   ExtendsClauseImpl _extendsClause;
 
-  /**
-   * The with clause for the class, or `null` if the class does not have a with
-   * clause.
-   */
+  /// The with clause for the class, or `null` if the class does not have a with
+  /// clause.
   WithClauseImpl _withClause;
 
-  /**
-   * The native clause for the class, or `null` if the class does not have a
-   * native clause.
-   */
+  /// The native clause for the class, or `null` if the class does not have a
+  /// native clause.
   NativeClauseImpl _nativeClause;
 
-  /**
-   * Initialize a newly created class declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the class does not have the
-   * corresponding attribute. The [abstractKeyword] can be `null` if the class
-   * is not abstract. The [typeParameters] can be `null` if the class does not
-   * have any type parameters. Any or all of the [extendsClause], [withClause],
-   * and [implementsClause] can be `null` if the class does not have the
-   * corresponding clause. The list of [members] can be `null` if the class does
-   * not have any members.
-   */
+  /// Initialize a newly created class declaration. Either or both of the
+  /// [comment] and [metadata] can be `null` if the class does not have the
+  /// corresponding attribute. The [abstractKeyword] can be `null` if the class
+  /// is not abstract. The [typeParameters] can be `null` if the class does not
+  /// have any type parameters. Any or all of the [extendsClause], [withClause],
+  /// and [implementsClause] can be `null` if the class does not have the
+  /// corresponding clause. The list of [members] can be `null` if the class
+  /// does not have any members.
   ClassDeclarationImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -1796,46 +1615,32 @@
   }
 }
 
-/**
- * A node that declares a name within the scope of a class.
- */
+/// A node that declares a name within the scope of a class.
 abstract class ClassMemberImpl extends DeclarationImpl implements ClassMember {
-  /**
-   * Initialize a newly created member of a class. Either or both of the
-   * [comment] and [metadata] can be `null` if the member does not have the
-   * corresponding attribute.
-   */
+  /// Initialize a newly created member of a class. Either or both of the
+  /// [comment] and [metadata] can be `null` if the member does not have the
+  /// corresponding attribute.
   ClassMemberImpl(CommentImpl comment, List<Annotation> metadata)
       : super(comment, metadata);
 }
 
 abstract class ClassOrMixinDeclarationImpl
     extends NamedCompilationUnitMemberImpl implements ClassOrMixinDeclaration {
-  /**
-   * The type parameters for the class or mixin,
-   * or `null` if the declaration does not have any type parameters.
-   */
+  /// The type parameters for the class or mixin,
+  /// or `null` if the declaration does not have any type parameters.
   TypeParameterListImpl _typeParameters;
 
-  /**
-   * The implements clause for the class or mixin,
-   * or `null` if the declaration does not implement any interfaces.
-   */
+  /// The implements clause for the class or mixin,
+  /// or `null` if the declaration does not implement any interfaces.
   ImplementsClauseImpl _implementsClause;
 
-  /**
-   * The left curly bracket.
-   */
+  /// The left curly bracket.
   Token leftBracket;
 
-  /**
-   * The members defined by the class or mixin.
-   */
+  /// The members defined by the class or mixin.
   NodeList<ClassMember> _members;
 
-  /**
-   * The right curly bracket.
-   */
+  /// The right curly bracket.
   Token rightBracket;
 
   ClassOrMixinDeclarationImpl(
@@ -1907,59 +1712,44 @@
   }
 }
 
-/**
- * A class type alias.
- *
- *    classTypeAlias ::=
- *        [SimpleIdentifier] [TypeParameterList]? '=' 'abstract'? mixinApplication
- *
- *    mixinApplication ::=
- *        [TypeName] [WithClause] [ImplementsClause]? ';'
- */
+/// A class type alias.
+///
+///    classTypeAlias ::=
+///        [SimpleIdentifier] [TypeParameterList]? '=' 'abstract'?
+///        mixinApplication
+///
+///    mixinApplication ::=
+///        [TypeName] [WithClause] [ImplementsClause]? ';'
 class ClassTypeAliasImpl extends TypeAliasImpl implements ClassTypeAlias {
-  /**
-   * The type parameters for the class, or `null` if the class does not have any
-   * type parameters.
-   */
+  /// The type parameters for the class, or `null` if the class does not have
+  /// any type parameters.
   TypeParameterListImpl _typeParameters;
 
-  /**
-   * The token for the '=' separating the name from the definition.
-   */
+  /// The token for the '=' separating the name from the definition.
   @override
   Token equals;
 
-  /**
-   * The token for the 'abstract' keyword, or `null` if this is not defining an
-   * abstract class.
-   */
+  /// The token for the 'abstract' keyword, or `null` if this is not defining an
+  /// abstract class.
   @override
   Token abstractKeyword;
 
-  /**
-   * The name of the superclass of the class being declared.
-   */
+  /// The name of the superclass of the class being declared.
   TypeNameImpl _superclass;
 
-  /**
-   * The with clause for this class.
-   */
+  /// The with clause for this class.
   WithClauseImpl _withClause;
 
-  /**
-   * The implements clause for this class, or `null` if there is no implements
-   * clause.
-   */
+  /// The implements clause for this class, or `null` if there is no implements
+  /// clause.
   ImplementsClauseImpl _implementsClause;
 
-  /**
-   * Initialize a newly created class type alias. Either or both of the
-   * [comment] and [metadata] can be `null` if the class type alias does not
-   * have the corresponding attribute. The [typeParameters] can be `null` if the
-   * class does not have any type parameters. The [abstractKeyword] can be
-   * `null` if the class is not abstract. The [implementsClause] can be `null`
-   * if the class does not implement any interfaces.
-   */
+  /// Initialize a newly created class type alias. Either or both of the
+  /// [comment] and [metadata] can be `null` if the class type alias does not
+  /// have the corresponding attribute. The [typeParameters] can be `null` if
+  /// the class does not have any type parameters. The [abstractKeyword] can be
+  /// `null` if the class is not abstract. The [implementsClause] can be `null`
+  /// if the class does not implement any interfaces.
   ClassTypeAliasImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -2059,73 +1849,57 @@
 abstract class CollectionElementImpl extends AstNodeImpl
     implements CollectionElement {}
 
-/**
- * A combinator associated with an import or export directive.
- *
- *    combinator ::=
- *        [HideCombinator]
- *      | [ShowCombinator]
- */
+/// A combinator associated with an import or export directive.
+///
+///    combinator ::=
+///        [HideCombinator]
+///      | [ShowCombinator]
 abstract class CombinatorImpl extends AstNodeImpl implements Combinator {
-  /**
-   * The 'hide' or 'show' keyword specifying what kind of processing is to be
-   * done on the names.
-   */
+  /// The 'hide' or 'show' keyword specifying what kind of processing is to be
+  /// done on the names.
   @override
   Token keyword;
 
-  /**
-   * Initialize a newly created combinator.
-   */
+  /// Initialize a newly created combinator.
   CombinatorImpl(this.keyword);
 
   @override
   Token get beginToken => keyword;
 }
 
-/**
- * A comment within the source code.
- *
- *    comment ::=
- *        endOfLineComment
- *      | blockComment
- *      | documentationComment
- *
- *    endOfLineComment ::=
- *        '//' (CHARACTER - EOL)* EOL
- *
- *    blockComment ::=
- *        '/ *' CHARACTER* '&#42;/'
- *
- *    documentationComment ::=
- *        '/ **' (CHARACTER | [CommentReference])* '&#42;/'
- *      | ('///' (CHARACTER - EOL)* EOL)+
- */
+/// A comment within the source code.
+///
+///    comment ::=
+///        endOfLineComment
+///      | blockComment
+///      | documentationComment
+///
+///    endOfLineComment ::=
+///        '//' (CHARACTER - EOL)* EOL
+///
+///    blockComment ::=
+///        '/ *' CHARACTER* '&#42;/'
+///
+///    documentationComment ::=
+///        '/ **' (CHARACTER | [CommentReference])* '&#42;/'
+///      | ('///' (CHARACTER - EOL)* EOL)+
 class CommentImpl extends AstNodeImpl implements Comment {
-  /**
-   * The tokens representing the comment.
-   */
+  /// The tokens representing the comment.
   @override
   final List<Token> tokens;
 
-  /**
-   * The type of the comment.
-   */
+  /// The type of the comment.
   final CommentType _type;
 
-  /**
-   * The references embedded within the documentation comment. This list will be
-   * empty unless this is a documentation comment that has references embedded
-   * within it.
-   */
+  /// The references embedded within the documentation comment. This list will
+  /// be empty unless this is a documentation comment that has references embedded
+  /// within it.
   NodeList<CommentReference> _references;
 
-  /**
-   * Initialize a newly created comment. The list of [tokens] must contain at
-   * least one token. The [_type] is the type of the comment. The list of
-   * [references] can be empty if the comment does not contain any embedded
-   * references.
-   */
+  /// Initialize a newly created comment. The list of [tokens] must contain at
+  /// least one token. The [_type] is the type of the comment. The list of
+  /// [references] can be empty if the comment does not contain any embedded
+  /// references.
   CommentImpl(this.tokens, this._type, List<CommentReference> references) {
     _references = new NodeListImpl<CommentReference>(this, references);
   }
@@ -2160,57 +1934,41 @@
     _references.accept(visitor);
   }
 
-  /**
-   * Create a block comment consisting of the given [tokens].
-   */
+  /// Create a block comment consisting of the given [tokens].
   static Comment createBlockComment(List<Token> tokens) =>
       new CommentImpl(tokens, CommentType.BLOCK, null);
 
-  /**
-   * Create a documentation comment consisting of the given [tokens].
-   */
+  /// Create a documentation comment consisting of the given [tokens].
   static Comment createDocumentationComment(List<Token> tokens) =>
       new CommentImpl(
           tokens, CommentType.DOCUMENTATION, new List<CommentReference>());
 
-  /**
-   * Create a documentation comment consisting of the given [tokens] and having
-   * the given [references] embedded within it.
-   */
+  /// Create a documentation comment consisting of the given [tokens] and having
+  /// the given [references] embedded within it.
   static Comment createDocumentationCommentWithReferences(
           List<Token> tokens, List<CommentReference> references) =>
       new CommentImpl(tokens, CommentType.DOCUMENTATION, references);
 
-  /**
-   * Create an end-of-line comment consisting of the given [tokens].
-   */
+  /// Create an end-of-line comment consisting of the given [tokens].
   static Comment createEndOfLineComment(List<Token> tokens) =>
       new CommentImpl(tokens, CommentType.END_OF_LINE, null);
 }
 
-/**
- * A reference to a Dart element that is found within a documentation comment.
- *
- *    commentReference ::=
- *        '[' 'new'? [Identifier] ']'
- */
+/// A reference to a Dart element that is found within a documentation comment.
+///
+///    commentReference ::=
+///        '[' 'new'? [Identifier] ']'
 class CommentReferenceImpl extends AstNodeImpl implements CommentReference {
-  /**
-   * The token representing the 'new' keyword, or `null` if there was no 'new'
-   * keyword.
-   */
+  /// The token representing the 'new' keyword, or `null` if there was no 'new'
+  /// keyword.
   @override
   Token newKeyword;
 
-  /**
-   * The identifier being referenced.
-   */
+  /// The identifier being referenced.
   IdentifierImpl _identifier;
 
-  /**
-   * Initialize a newly created reference to a Dart element. The [newKeyword]
-   * can be `null` if the reference is not to a constructor.
-   */
+  /// Initialize a newly created reference to a Dart element. The [newKeyword]
+  /// can be `null` if the reference is not to a constructor.
   CommentReferenceImpl(this.newKeyword, IdentifierImpl identifier) {
     _identifier = _becomeParentOf(identifier);
   }
@@ -2242,121 +2000,95 @@
   }
 }
 
-/**
- * The possible types of comments that are recognized by the parser.
- */
+/// The possible types of comments that are recognized by the parser.
 class CommentType {
-  /**
-   * A block comment.
-   */
+  /// A block comment.
   static const CommentType BLOCK = const CommentType('BLOCK');
 
-  /**
-   * A documentation comment.
-   */
+  /// A documentation comment.
   static const CommentType DOCUMENTATION = const CommentType('DOCUMENTATION');
 
-  /**
-   * An end-of-line comment.
-   */
+  /// An end-of-line comment.
   static const CommentType END_OF_LINE = const CommentType('END_OF_LINE');
 
-  /**
-   * The name of the comment type.
-   */
+  /// The name of the comment type.
   final String name;
 
-  /**
-   * Initialize a newly created comment type to have the given [name].
-   */
+  /// Initialize a newly created comment type to have the given [name].
   const CommentType(this.name);
 
   @override
   String toString() => name;
 }
 
-/**
- * A compilation unit.
- *
- * While the grammar restricts the order of the directives and declarations
- * within a compilation unit, this class does not enforce those restrictions.
- * In particular, the children of a compilation unit will be visited in lexical
- * order even if lexical order does not conform to the restrictions of the
- * grammar.
- *
- *    compilationUnit ::=
- *        directives declarations
- *
- *    directives ::=
- *        [ScriptTag]? [LibraryDirective]? namespaceDirective* [PartDirective]*
- *      | [PartOfDirective]
- *
- *    namespaceDirective ::=
- *        [ImportDirective]
- *      | [ExportDirective]
- *
- *    declarations ::=
- *        [CompilationUnitMember]*
- */
+/// A compilation unit.
+///
+/// While the grammar restricts the order of the directives and declarations
+/// within a compilation unit, this class does not enforce those restrictions.
+/// In particular, the children of a compilation unit will be visited in lexical
+/// order even if lexical order does not conform to the restrictions of the
+/// grammar.
+///
+///    compilationUnit ::=
+///        directives declarations
+///
+///    directives ::=
+///        [ScriptTag]? [LibraryDirective]? namespaceDirective* [PartDirective]*
+///      | [PartOfDirective]
+///
+///    namespaceDirective ::=
+///        [ImportDirective]
+///      | [ExportDirective]
+///
+///    declarations ::=
+///        [CompilationUnitMember]*
 class CompilationUnitImpl extends AstNodeImpl implements CompilationUnit {
-  /**
-   * The first token in the token stream that was parsed to form this
-   * compilation unit.
-   */
+  /// The first token in the token stream that was parsed to form this
+  /// compilation unit.
   @override
   Token beginToken;
 
-  /**
-   * The script tag at the beginning of the compilation unit, or `null` if there
-   * is no script tag in this compilation unit.
-   */
+  /// The script tag at the beginning of the compilation unit, or `null` if
+  /// there is no script tag in this compilation unit.
   ScriptTagImpl _scriptTag;
 
-  /**
-   * The directives contained in this compilation unit.
-   */
+  /// The directives contained in this compilation unit.
   NodeList<Directive> _directives;
 
-  /**
-   * The declarations contained in this compilation unit.
-   */
+  /// The declarations contained in this compilation unit.
   NodeList<CompilationUnitMember> _declarations;
 
-  /**
-   * The last token in the token stream that was parsed to form this compilation
-   * unit. This token should always have a type of [TokenType.EOF].
-   */
+  /// The last token in the token stream that was parsed to form this
+  /// compilation unit. This token should always have a type of [TokenType.EOF].
   @override
   Token endToken;
 
-  /**
-   * The element associated with this compilation unit, or `null` if the AST
-   * structure has not been resolved.
-   */
+  /// The element associated with this compilation unit, or `null` if the AST
+  /// structure has not been resolved.
   @override
   CompilationUnitElement declaredElement;
 
-  /**
-   * The line information for this compilation unit.
-   */
+  /// The line information for this compilation unit.
   @override
   LineInfo lineInfo;
 
+  /// ?
+  // TODO(brianwilkerson) Remove this field. It is never read, only written.
   Map<int, AstNode> localDeclarations;
 
-  /**
-   * Is `true` if the non-nullable feature is enabled, and this library
-   * unit is annotated with `@pragma('analyzer:non-nullable')`.
-   */
-  bool hasPragmaAnalyzerNonNullable = false;
+  /// Additional information about local variables that are declared within this
+  /// compilation unit but outside any function body, or `null` if resolution
+  /// has not yet been performed.
+  LocalVariableInfo localVariableInfo = new LocalVariableInfo();
 
-  /**
-   * Initialize a newly created compilation unit to have the given directives
-   * and declarations. The [scriptTag] can be `null` if there is no script tag
-   * in the compilation unit. The list of [directives] can be `null` if there
-   * are no directives in the compilation unit. The list of [declarations] can
-   * be `null` if there are no declarations in the compilation unit.
-   */
+  /// Is `true` if this unit has been parsed as non-nullable.
+  bool isNonNullable = false;
+
+  /// Initialize a newly created compilation unit to have the given directives
+  /// and declarations. The [scriptTag] can be `null` if there is no script tag
+  /// in the compilation unit. The list of [directives] can be `null` if there
+  /// are no directives in the compilation unit. The list of [declarations] can
+  /// be `null` if there are no declarations in the compilation unit.
   CompilationUnitImpl(
       this.beginToken,
       ScriptTagImpl scriptTag,
@@ -2422,10 +2154,8 @@
       ..sort(AstNode.LEXICAL_ORDER);
   }
 
-  /**
-   * Return `true` if all of the directives are lexically before any
-   * declarations.
-   */
+  /// Return `true` if all of the directives are lexically before any
+  /// declarations.
   bool get _directivesAreBeforeDeclarations {
     if (_directives.isEmpty || _declarations.isEmpty) {
       return true;
@@ -2438,6 +2168,20 @@
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitCompilationUnit(this);
 
+  bool isPotentiallyMutatedInClosure(VariableElement variable) {
+    if (localVariableInfo == null) {
+      throw new StateError('Resolution has not yet been performed');
+    }
+    return localVariableInfo.potentiallyMutatedInClosure.contains(variable);
+  }
+
+  bool isPotentiallyMutatedInScope(VariableElement variable) {
+    if (localVariableInfo == null) {
+      throw new StateError('Resolution has not yet been performed');
+    }
+    return localVariableInfo.potentiallyMutatedInScope.contains(variable);
+  }
+
   @override
   void visitChildren(AstVisitor visitor) {
     _scriptTag?.accept(visitor);
@@ -2455,67 +2199,49 @@
   }
 }
 
-/**
- * A node that declares one or more names within the scope of a compilation
- * unit.
- *
- *    compilationUnitMember ::=
- *        [ClassDeclaration]
- *      | [TypeAlias]
- *      | [FunctionDeclaration]
- *      | [MethodDeclaration]
- *      | [VariableDeclaration]
- *      | [VariableDeclaration]
- */
+/// A node that declares one or more names within the scope of a compilation
+/// unit.
+///
+///    compilationUnitMember ::=
+///        [ClassDeclaration]
+///      | [TypeAlias]
+///      | [FunctionDeclaration]
+///      | [MethodDeclaration]
+///      | [VariableDeclaration]
+///      | [VariableDeclaration]
 abstract class CompilationUnitMemberImpl extends DeclarationImpl
     implements CompilationUnitMember {
-  /**
-   * Initialize a newly created generic compilation unit member. Either or both
-   * of the [comment] and [metadata] can be `null` if the member does not have
-   * the corresponding attribute.
-   */
+  /// Initialize a newly created generic compilation unit member. Either or both
+  /// of the [comment] and [metadata] can be `null` if the member does not have
+  /// the corresponding attribute.
   CompilationUnitMemberImpl(CommentImpl comment, List<Annotation> metadata)
       : super(comment, metadata);
 }
 
-/**
- * A conditional expression.
- *
- *    conditionalExpression ::=
- *        [Expression] '?' [Expression] ':' [Expression]
- */
+/// A conditional expression.
+///
+///    conditionalExpression ::=
+///        [Expression] '?' [Expression] ':' [Expression]
 class ConditionalExpressionImpl extends ExpressionImpl
     implements ConditionalExpression {
-  /**
-   * The condition used to determine which of the expressions is executed next.
-   */
+  /// The condition used to determine which of the expressions is executed next.
   ExpressionImpl _condition;
 
-  /**
-   * The token used to separate the condition from the then expression.
-   */
+  /// The token used to separate the condition from the then expression.
   @override
   Token question;
 
-  /**
-   * The expression that is executed if the condition evaluates to `true`.
-   */
+  /// The expression that is executed if the condition evaluates to `true`.
   ExpressionImpl _thenExpression;
 
-  /**
-   * The token used to separate the then expression from the else expression.
-   */
+  /// The token used to separate the then expression from the else expression.
   @override
   Token colon;
 
-  /**
-   * The expression that is executed if the condition evaluates to `false`.
-   */
+  /// The expression that is executed if the condition evaluates to `false`.
   ExpressionImpl _elseExpression;
 
-  /**
-   * Initialize a newly created conditional expression.
-   */
+  /// Initialize a newly created conditional expression.
   ConditionalExpressionImpl(
       ExpressionImpl condition,
       this.question,
@@ -2557,8 +2283,13 @@
   @override
   Token get endToken => _elseExpression.endToken;
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 3;
+  int get precedence => CONDITIONAL_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.conditional;
 
   @override
   Expression get thenExpression => _thenExpression;
@@ -2580,18 +2311,16 @@
   }
 }
 
-/**
- * A configuration in either an import or export directive.
- *
- *     configuration ::=
- *         'if' '(' test ')' uri
- *
- *     test ::=
- *         dottedName ('==' stringLiteral)?
- *
- *     dottedName ::=
- *         identifier ('.' identifier)*
- */
+/// A configuration in either an import or export directive.
+///
+///     configuration ::=
+///         'if' '(' test ')' uri
+///
+///     test ::=
+///         dottedName ('==' stringLiteral)?
+///
+///     dottedName ::=
+///         identifier ('.' identifier)*
 class ConfigurationImpl extends AstNodeImpl implements Configuration {
   @override
   Token ifKeyword;
@@ -2688,15 +2417,11 @@
   }
 }
 
-/**
- * An error listener that only records whether any constant related errors have
- * been reported.
- */
+/// An error listener that only records whether any constant related errors have
+/// been reported.
 class ConstantAnalysisErrorListener extends AnalysisErrorListener {
-  /**
-   * A flag indicating whether any constant related errors have been reported to
-   * this listener.
-   */
+  /// A flag indicating whether any constant related errors have been reported
+  /// to this listener.
   bool hasConstError = false;
 
   @override
@@ -2726,122 +2451,97 @@
   }
 }
 
-/**
- * A constructor declaration.
- *
- *    constructorDeclaration ::=
- *        constructorSignature [FunctionBody]?
- *      | constructorName formalParameterList ':' 'this' ('.' [SimpleIdentifier])? arguments
- *
- *    constructorSignature ::=
- *        'external'? constructorName formalParameterList initializerList?
- *      | 'external'? 'factory' factoryName formalParameterList initializerList?
- *      | 'external'? 'const'  constructorName formalParameterList initializerList?
- *
- *    constructorName ::=
- *        [SimpleIdentifier] ('.' [SimpleIdentifier])?
- *
- *    factoryName ::=
- *        [Identifier] ('.' [SimpleIdentifier])?
- *
- *    initializerList ::=
- *        ':' [ConstructorInitializer] (',' [ConstructorInitializer])*
- */
+/// A constructor declaration.
+///
+///    constructorDeclaration ::=
+///        constructorSignature [FunctionBody]?
+///      | constructorName formalParameterList ':' 'this'
+///        ('.' [SimpleIdentifier])? arguments
+///
+///    constructorSignature ::=
+///        'external'? constructorName formalParameterList initializerList?
+///      | 'external'? 'factory' factoryName formalParameterList
+///        initializerList?
+///      | 'external'? 'const'  constructorName formalParameterList
+///        initializerList?
+///
+///    constructorName ::=
+///        [SimpleIdentifier] ('.' [SimpleIdentifier])?
+///
+///    factoryName ::=
+///        [Identifier] ('.' [SimpleIdentifier])?
+///
+///    initializerList ::=
+///        ':' [ConstructorInitializer] (',' [ConstructorInitializer])*
 class ConstructorDeclarationImpl extends ClassMemberImpl
     implements ConstructorDeclaration {
-  /**
-   * The token for the 'external' keyword, or `null` if the constructor is not
-   * external.
-   */
+  /// The token for the 'external' keyword, or `null` if the constructor is not
+  /// external.
   @override
   Token externalKeyword;
 
-  /**
-   * The token for the 'const' keyword, or `null` if the constructor is not a
-   * const constructor.
-   */
+  /// The token for the 'const' keyword, or `null` if the constructor is not a
+  /// const constructor.
   @override
   Token constKeyword;
 
-  /**
-   * The token for the 'factory' keyword, or `null` if the constructor is not a
-   * factory constructor.
-   */
+  /// The token for the 'factory' keyword, or `null` if the constructor is not a
+  /// factory constructor.
   @override
   Token factoryKeyword;
 
-  /**
-   * The type of object being created. This can be different than the type in
-   * which the constructor is being declared if the constructor is the
-   * implementation of a factory constructor.
-   */
+  /// The type of object being created. This can be different than the type in
+  /// which the constructor is being declared if the constructor is the
+  /// implementation of a factory constructor.
   IdentifierImpl _returnType;
 
-  /**
-   * The token for the period before the constructor name, or `null` if the
-   * constructor being declared is unnamed.
-   */
+  /// The token for the period before the constructor name, or `null` if the
+  /// constructor being declared is unnamed.
   @override
   Token period;
 
-  /**
-   * The name of the constructor, or `null` if the constructor being declared is
-   * unnamed.
-   */
+  /// The name of the constructor, or `null` if the constructor being declared
+  /// is unnamed.
   SimpleIdentifierImpl _name;
 
-  /**
-   * The parameters associated with the constructor.
-   */
+  /// The parameters associated with the constructor.
   FormalParameterListImpl _parameters;
 
-  /**
-   * The token for the separator (colon or equals) before the initializer list
-   * or redirection, or `null` if there are no initializers.
-   */
+  /// The token for the separator (colon or equals) before the initializer list
+  /// or redirection, or `null` if there are no initializers.
   @override
   Token separator;
 
-  /**
-   * The initializers associated with the constructor.
-   */
+  /// The initializers associated with the constructor.
   NodeList<ConstructorInitializer> _initializers;
 
-  /**
-   * The name of the constructor to which this constructor will be redirected,
-   * or `null` if this is not a redirecting factory constructor.
-   */
+  /// The name of the constructor to which this constructor will be redirected,
+  /// or `null` if this is not a redirecting factory constructor.
   ConstructorNameImpl _redirectedConstructor;
 
-  /**
-   * The body of the constructor, or `null` if the constructor does not have a
-   * body.
-   */
+  /// The body of the constructor, or `null` if the constructor does not have a
+  /// body.
   FunctionBodyImpl _body;
 
-  /**
-   * The element associated with this constructor, or `null` if the AST
-   * structure has not been resolved or if this constructor could not be
-   * resolved.
-   */
+  /// The element associated with this constructor, or `null` if the AST
+  /// structure has not been resolved or if this constructor could not be
+  /// resolved.
   @override
   ConstructorElement declaredElement;
 
-  /**
-   * Initialize a newly created constructor declaration. The [externalKeyword]
-   * can be `null` if the constructor is not external. Either or both of the
-   * [comment] and [metadata] can be `null` if the constructor does not have the
-   * corresponding attribute. The [constKeyword] can be `null` if the
-   * constructor cannot be used to create a constant. The [factoryKeyword] can
-   * be `null` if the constructor is not a factory. The [period] and [name] can
-   * both be `null` if the constructor is not a named constructor. The
-   * [separator] can be `null` if the constructor does not have any initializers
-   * and does not redirect to a different constructor. The list of
-   * [initializers] can be `null` if the constructor does not have any
-   * initializers. The [redirectedConstructor] can be `null` if the constructor
-   * does not redirect to a different constructor. The [body] can be `null` if
-   * the constructor does not have a body.
-   */
+  /// Initialize a newly created constructor declaration. The [externalKeyword]
+  /// can be `null` if the constructor is not external. Either or both of the
+  /// [comment] and [metadata] can be `null` if the constructor does not have
+  /// the corresponding attribute. The [constKeyword] can be `null` if the
+  /// constructor cannot be used to create a constant. The [factoryKeyword] can
+  /// be `null` if the constructor is not a factory. The [period] and [name] can
+  /// both be `null` if the constructor is not a named constructor. The
+  /// [separator] can be `null` if the constructor does not have any
+  /// initializers and does not redirect to a different constructor. The list of
+  /// [initializers] can be `null` if the constructor does not have any
+  /// initializers. The [redirectedConstructor] can be `null` if the constructor
+  /// does not redirect to a different constructor. The [body] can be `null` if
+  /// the constructor does not have a body.
   ConstructorDeclarationImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -2970,48 +2670,34 @@
   }
 }
 
-/**
- * The initialization of a field within a constructor's initialization list.
- *
- *    fieldInitializer ::=
- *        ('this' '.')? [SimpleIdentifier] '=' [Expression]
- */
+/// The initialization of a field within a constructor's initialization list.
+///
+///    fieldInitializer ::=
+///        ('this' '.')? [SimpleIdentifier] '=' [Expression]
 class ConstructorFieldInitializerImpl extends ConstructorInitializerImpl
     implements ConstructorFieldInitializer {
-  /**
-   * The token for the 'this' keyword, or `null` if there is no 'this' keyword.
-   */
+  /// The token for the 'this' keyword, or `null` if there is no 'this' keyword.
   @override
   Token thisKeyword;
 
-  /**
-   * The token for the period after the 'this' keyword, or `null` if there is no
-   * 'this' keyword.
-   */
+  /// The token for the period after the 'this' keyword, or `null` if there is
+  /// no'this' keyword.
   @override
   Token period;
 
-  /**
-   * The name of the field being initialized.
-   */
+  /// The name of the field being initialized.
   SimpleIdentifierImpl _fieldName;
 
-  /**
-   * The token for the equal sign between the field name and the expression.
-   */
+  /// The token for the equal sign between the field name and the expression.
   @override
   Token equals;
 
-  /**
-   * The expression computing the value to which the field will be initialized.
-   */
+  /// The expression computing the value to which the field will be initialized.
   ExpressionImpl _expression;
 
-  /**
-   * Initialize a newly created field initializer to initialize the field with
-   * the given name to the value of the given expression. The [thisKeyword] and
-   * [period] can be `null` if the 'this' keyword was not specified.
-   */
+  /// Initialize a newly created field initializer to initialize the field with
+  /// the given name to the value of the given expression. The [thisKeyword] and
+  /// [period] can be `null` if the 'this' keyword was not specified.
   ConstructorFieldInitializerImpl(this.thisKeyword, this.period,
       SimpleIdentifierImpl fieldName, this.equals, ExpressionImpl expression) {
     _fieldName = _becomeParentOf(fieldName);
@@ -3064,54 +2750,40 @@
   }
 }
 
-/**
- * A node that can occur in the initializer list of a constructor declaration.
- *
- *    constructorInitializer ::=
- *        [SuperConstructorInvocation]
- *      | [ConstructorFieldInitializer]
- *      | [RedirectingConstructorInvocation]
- */
+/// A node that can occur in the initializer list of a constructor declaration.
+///
+///    constructorInitializer ::=
+///        [SuperConstructorInvocation]
+///      | [ConstructorFieldInitializer]
+///      | [RedirectingConstructorInvocation]
 abstract class ConstructorInitializerImpl extends AstNodeImpl
     implements ConstructorInitializer {}
 
-/**
- * The name of the constructor.
- *
- *    constructorName ::=
- *        type ('.' identifier)?
- */
+/// The name of the constructor.
+///
+///    constructorName ::=
+///        type ('.' identifier)?
 class ConstructorNameImpl extends AstNodeImpl implements ConstructorName {
-  /**
-   * The name of the type defining the constructor.
-   */
+  /// The name of the type defining the constructor.
   TypeNameImpl _type;
 
-  /**
-   * The token for the period before the constructor name, or `null` if the
-   * specified constructor is the unnamed constructor.
-   */
+  /// The token for the period before the constructor name, or `null` if the
+  /// specified constructor is the unnamed constructor.
   @override
   Token period;
 
-  /**
-   * The name of the constructor, or `null` if the specified constructor is the
-   * unnamed constructor.
-   */
+  /// The name of the constructor, or `null` if the specified constructor is the
+  /// unnamed constructor.
   SimpleIdentifierImpl _name;
 
-  /**
-   * The element associated with this constructor name based on static type
-   * information, or `null` if the AST structure has not been resolved or if
-   * this constructor name could not be resolved.
-   */
+  /// The element associated with this constructor name based on static type
+  /// information, or `null` if the AST structure has not been resolved or if
+  /// this constructor name could not be resolved.
   @override
   ConstructorElement staticElement;
 
-  /**
-   * Initialize a newly created constructor name. The [period] and [name] can be
-   * `null` if the constructor being named is the unnamed constructor.
-   */
+  /// Initialize a newly created constructor name. The [period] and [name] can
+  /// be`null` if the constructor being named is the unnamed constructor.
   ConstructorNameImpl(
       TypeNameImpl type, this.period, SimpleIdentifierImpl name) {
     _type = _becomeParentOf(type);
@@ -3159,44 +2831,32 @@
   }
 }
 
-/**
- * A continue statement.
- *
- *    continueStatement ::=
- *        'continue' [SimpleIdentifier]? ';'
- */
+/// A continue statement.
+///
+///    continueStatement ::=
+///        'continue' [SimpleIdentifier]? ';'
 class ContinueStatementImpl extends StatementImpl implements ContinueStatement {
-  /**
-   * The token representing the 'continue' keyword.
-   */
+  /// The token representing the 'continue' keyword.
   @override
   Token continueKeyword;
 
-  /**
-   * The label associated with the statement, or `null` if there is no label.
-   */
+  /// The label associated with the statement, or `null` if there is no label.
   SimpleIdentifierImpl _label;
 
-  /**
-   * The semicolon terminating the statement.
-   */
+  /// The semicolon terminating the statement.
   @override
   Token semicolon;
 
-  /**
-   * The AstNode which this continue statement is continuing to.  This will be
-   * either a Statement (in the case of continuing a loop) or a SwitchMember
-   * (in the case of continuing from one switch case to another).  Null if the
-   * AST has not yet been resolved or if the target could not be resolved.
-   * Note that if the source code has errors, the target may be invalid (e.g.
-   * the target may be in an enclosing function).
-   */
+  /// The AstNode which this continue statement is continuing to.  This will be
+  /// either a Statement (in the case of continuing a loop) or a SwitchMember
+  /// (in the case of continuing from one switch case to another).  Null if the
+  /// AST has not yet been resolved or if the target could not be resolved.
+  /// Note that if the source code has errors, the target may be invalid (e.g.
+  /// the target may be in an enclosing function).
   AstNode target;
 
-  /**
-   * Initialize a newly created continue statement. The [label] can be `null` if
-   * there is no label associated with the statement.
-   */
+  /// Initialize a newly created continue statement. The [label] can be `null`
+  /// if there is no label associated with the statement.
   ContinueStatementImpl(
       this.continueKeyword, SimpleIdentifierImpl label, this.semicolon) {
     _label = _becomeParentOf(label);
@@ -3229,53 +2889,39 @@
   }
 }
 
-/**
- * A node that represents the declaration of one or more names. Each declared
- * name is visible within a name scope.
- */
+/// A node that represents the declaration of one or more names. Each declared
+/// name is visible within a name scope.
 abstract class DeclarationImpl extends AnnotatedNodeImpl
     implements Declaration {
-  /**
-   * Initialize a newly created declaration. Either or both of the [comment] and
-   * [metadata] can be `null` if the declaration does not have the corresponding
-   * attribute.
-   */
+  /// Initialize a newly created declaration. Either or both of the [comment]
+  /// and [metadata] can be `null` if the declaration does not have the
+  /// corresponding attribute.
   DeclarationImpl(CommentImpl comment, List<Annotation> metadata)
       : super(comment, metadata);
 }
 
-/**
- * The declaration of a single identifier.
- *
- *    declaredIdentifier ::=
- *        [Annotation] finalConstVarOrType [SimpleIdentifier]
- */
+/// The declaration of a single identifier.
+///
+///    declaredIdentifier ::=
+///        [Annotation] finalConstVarOrType [SimpleIdentifier]
 class DeclaredIdentifierImpl extends DeclarationImpl
     implements DeclaredIdentifier {
-  /**
-   * The token representing either the 'final', 'const' or 'var' keyword, or
-   * `null` if no keyword was used.
-   */
+  /// The token representing either the 'final', 'const' or 'var' keyword, or
+  /// `null` if no keyword was used.
   @override
   Token keyword;
 
-  /**
-   * The name of the declared type of the parameter, or `null` if the parameter
-   * does not have a declared type.
-   */
+  /// The name of the declared type of the parameter, or `null` if the parameter
+  /// does not have a declared type.
   TypeAnnotationImpl _type;
 
-  /**
-   * The name of the variable being declared.
-   */
+  /// The name of the variable being declared.
   SimpleIdentifierImpl _identifier;
 
-  /**
-   * Initialize a newly created formal parameter. Either or both of the
-   * [comment] and [metadata] can be `null` if the declaration does not have the
-   * corresponding attribute. The [keyword] can be `null` if a type name is
-   * given. The [type] must be `null` if the keyword is 'var'.
-   */
+  /// Initialize a newly created formal parameter. Either or both of the
+  /// [comment] and [metadata] can be `null` if the declaration does not have
+  /// the corresponding attribute. The [keyword] can be `null` if a type name is
+  /// given. The [type] must be `null` if the keyword is 'var'.
   DeclaredIdentifierImpl(CommentImpl comment, List<Annotation> metadata,
       this.keyword, TypeAnnotationImpl type, SimpleIdentifierImpl identifier)
       : super(comment, metadata) {
@@ -3344,9 +2990,7 @@
   }
 }
 
-/**
- * A simple identifier that declares a name.
- */
+/// A simple identifier that declares a name.
 // TODO(rnystrom): Consider making this distinct from [SimpleIdentifier] and
 // get rid of all of the:
 //
@@ -3362,47 +3006,35 @@
   bool inDeclarationContext() => true;
 }
 
-/**
- * A formal parameter with a default value. There are two kinds of parameters
- * that are both represented by this class: named formal parameters and
- * positional formal parameters.
- *
- *    defaultFormalParameter ::=
- *        [NormalFormalParameter] ('=' [Expression])?
- *
- *    defaultNamedParameter ::=
- *        [NormalFormalParameter] (':' [Expression])?
- */
+/// A formal parameter with a default value. There are two kinds of parameters
+/// that are both represented by this class: named formal parameters and
+/// positional formal parameters.
+///
+///    defaultFormalParameter ::=
+///        [NormalFormalParameter] ('=' [Expression])?
+///
+///    defaultNamedParameter ::=
+///        [NormalFormalParameter] (':' [Expression])?
 class DefaultFormalParameterImpl extends FormalParameterImpl
     implements DefaultFormalParameter {
-  /**
-   * The formal parameter with which the default value is associated.
-   */
+  /// The formal parameter with which the default value is associated.
   NormalFormalParameterImpl _parameter;
 
-  /**
-   * The kind of this parameter.
-   */
+  /// The kind of this parameter.
   @override
   ParameterKind kind;
 
-  /**
-   * The token separating the parameter from the default value, or `null` if
-   * there is no default value.
-   */
+  /// The token separating the parameter from the default value, or `null` if
+  /// there is no default value.
   @override
   Token separator;
 
-  /**
-   * The expression computing the default value for the parameter, or `null` if
-   * there is no default value.
-   */
+  /// The expression computing the default value for the parameter, or `null` if
+  /// there is no default value.
   ExpressionImpl _defaultValue;
 
-  /**
-   * Initialize a newly created default formal parameter. The [separator] and
-   * [defaultValue] can be `null` if there is no default value.
-   */
+  /// Initialize a newly created default formal parameter. The [separator] and
+  /// [defaultValue] can be `null` if there is no default value.
   DefaultFormalParameterImpl(NormalFormalParameterImpl parameter, this.kind,
       this.separator, ExpressionImpl defaultValue) {
     _parameter = _becomeParentOf(parameter);
@@ -3466,91 +3098,65 @@
   }
 }
 
-/**
- * A node that represents a directive.
- *
- *    directive ::=
- *        [ExportDirective]
- *      | [ImportDirective]
- *      | [LibraryDirective]
- *      | [PartDirective]
- *      | [PartOfDirective]
- */
+/// A node that represents a directive.
+///
+///    directive ::=
+///        [ExportDirective]
+///      | [ImportDirective]
+///      | [LibraryDirective]
+///      | [PartDirective]
+///      | [PartOfDirective]
 abstract class DirectiveImpl extends AnnotatedNodeImpl implements Directive {
-  /**
-   * The element associated with this directive, or `null` if the AST structure
-   * has not been resolved or if this directive could not be resolved.
-   */
+  /// The element associated with this directive, or `null` if the AST structure
+  /// has not been resolved or if this directive could not be resolved.
   Element _element;
 
-  /**
-   * Initialize a newly create directive. Either or both of the [comment] and
-   * [metadata] can be `null` if the directive does not have the corresponding
-   * attribute.
-   */
+  /// Initialize a newly create directive. Either or both of the [comment] and
+  /// [metadata] can be `null` if the directive does not have the corresponding
+  /// attribute.
   DirectiveImpl(CommentImpl comment, List<Annotation> metadata)
       : super(comment, metadata);
 
   @override
   Element get element => _element;
 
-  /**
-   * Set the element associated with this directive to be the given [element].
-   */
+  /// Set the element associated with this directive to be the given [element].
   void set element(Element element) {
     _element = element;
   }
 }
 
-/**
- * A do statement.
- *
- *    doStatement ::=
- *        'do' [Statement] 'while' '(' [Expression] ')' ';'
- */
+/// A do statement.
+///
+///    doStatement ::=
+///        'do' [Statement] 'while' '(' [Expression] ')' ';'
 class DoStatementImpl extends StatementImpl implements DoStatement {
-  /**
-   * The token representing the 'do' keyword.
-   */
+  /// The token representing the 'do' keyword.
   @override
   Token doKeyword;
 
-  /**
-   * The body of the loop.
-   */
+  /// The body of the loop.
   StatementImpl _body;
 
-  /**
-   * The token representing the 'while' keyword.
-   */
+  /// The token representing the 'while' keyword.
   @override
   Token whileKeyword;
 
-  /**
-   * The left parenthesis.
-   */
+  /// The left parenthesis.
   Token leftParenthesis;
 
-  /**
-   * The condition that determines when the loop will terminate.
-   */
+  /// The condition that determines when the loop will terminate.
   ExpressionImpl _condition;
 
-  /**
-   * The right parenthesis.
-   */
+  /// The right parenthesis.
   @override
   Token rightParenthesis;
 
-  /**
-   * The semicolon terminating the statement.
-   */
+  /// The semicolon terminating the statement.
   @override
   Token semicolon;
 
-  /**
-   * Initialize a newly created do loop.
-   */
+  /// Initialize a newly created do loop.
   DoStatementImpl(
       this.doKeyword,
       StatementImpl body,
@@ -3605,21 +3211,15 @@
   }
 }
 
-/**
- * A dotted name, used in a configuration within an import or export directive.
- *
- *    dottedName ::=
- *        [SimpleIdentifier] ('.' [SimpleIdentifier])*
- */
+/// A dotted name, used in a configuration within an import or export directive.
+///
+///    dottedName ::=
+///        [SimpleIdentifier] ('.' [SimpleIdentifier])*
 class DottedNameImpl extends AstNodeImpl implements DottedName {
-  /**
-   * The components of the identifier.
-   */
+  /// The components of the identifier.
   NodeList<SimpleIdentifier> _components;
 
-  /**
-   * Initialize a newly created dotted name.
-   */
+  /// Initialize a newly created dotted name.
   DottedNameImpl(List<SimpleIdentifier> components) {
     _components = new NodeListImpl<SimpleIdentifier>(this, components);
   }
@@ -3647,32 +3247,24 @@
   }
 }
 
-/**
- * A floating point literal expression.
- *
- *    doubleLiteral ::=
- *        decimalDigit+ ('.' decimalDigit*)? exponent?
- *      | '.' decimalDigit+ exponent?
- *
- *    exponent ::=
- *        ('e' | 'E') ('+' | '-')? decimalDigit+
- */
+/// A floating point literal expression.
+///
+///    doubleLiteral ::=
+///        decimalDigit+ ('.' decimalDigit*)? exponent?
+///      | '.' decimalDigit+ exponent?
+///
+///    exponent ::=
+///        ('e' | 'E') ('+' | '-')? decimalDigit+
 class DoubleLiteralImpl extends LiteralImpl implements DoubleLiteral {
-  /**
-   * The token representing the literal.
-   */
+  /// The token representing the literal.
   @override
   Token literal;
 
-  /**
-   * The value of the literal.
-   */
+  /// The value of the literal.
   @override
   double value;
 
-  /**
-   * Initialize a newly created floating point literal.
-   */
+  /// Initialize a newly created floating point literal.
   DoubleLiteralImpl(this.literal, this.value);
 
   @override
@@ -3694,25 +3286,19 @@
   }
 }
 
-/**
- * An empty function body, which can only appear in constructors or abstract
- * methods.
- *
- *    emptyFunctionBody ::=
- *        ';'
- */
+/// An empty function body, which can only appear in constructors or abstract
+/// methods.
+///
+///    emptyFunctionBody ::=
+///        ';'
 class EmptyFunctionBodyImpl extends FunctionBodyImpl
     implements EmptyFunctionBody {
-  /**
-   * The token representing the semicolon that marks the end of the function
-   * body.
-   */
+  /// The token representing the semicolon that marks the end of the function
+  /// body.
   @override
   Token semicolon;
 
-  /**
-   * Initialize a newly created function body.
-   */
+  /// Initialize a newly created function body.
   EmptyFunctionBodyImpl(this.semicolon);
 
   @override
@@ -3734,21 +3320,15 @@
   }
 }
 
-/**
- * An empty statement.
- *
- *    emptyStatement ::=
- *        ';'
- */
+/// An empty statement.
+///
+///    emptyStatement ::=
+///        ';'
 class EmptyStatementImpl extends StatementImpl implements EmptyStatement {
-  /**
-   * The semicolon terminating the statement.
-   */
+  /// The semicolon terminating the statement.
   Token semicolon;
 
-  /**
-   * Initialize a newly created empty statement.
-   */
+  /// Initialize a newly created empty statement.
   EmptyStatementImpl(this.semicolon);
 
   @override
@@ -3773,22 +3353,16 @@
   }
 }
 
-/**
- * The declaration of an enum constant.
- */
+/// The declaration of an enum constant.
 class EnumConstantDeclarationImpl extends DeclarationImpl
     implements EnumConstantDeclaration {
-  /**
-   * The name of the constant.
-   */
+  /// The name of the constant.
   SimpleIdentifierImpl _name;
 
-  /**
-   * Initialize a newly created enum constant declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the constant does not have the
-   * corresponding attribute. (Technically, enum constants cannot have metadata,
-   * but we allow it for consistency.)
-   */
+  /// Initialize a newly created enum constant declaration. Either or both of
+  /// the [comment] and [metadata] can be `null` if the constant does not have
+  /// the corresponding attribute. (Technically, enum constants cannot have
+  /// metadata, but we allow it for consistency.)
   EnumConstantDeclarationImpl(
       CommentImpl comment, List<Annotation> metadata, SimpleIdentifierImpl name)
       : super(comment, metadata) {
@@ -3831,43 +3405,32 @@
   }
 }
 
-/**
- * The declaration of an enumeration.
- *
- *    enumType ::=
- *        metadata 'enum' [SimpleIdentifier] '{' [SimpleIdentifier] (',' [SimpleIdentifier])* (',')? '}'
- */
+/// The declaration of an enumeration.
+///
+///    enumType ::=
+///        metadata 'enum' [SimpleIdentifier] '{' [SimpleIdentifier]
+///        (',' [SimpleIdentifier])* (',')? '}'
 class EnumDeclarationImpl extends NamedCompilationUnitMemberImpl
     implements EnumDeclaration {
-  /**
-   * The 'enum' keyword.
-   */
+  /// The 'enum' keyword.
   @override
   Token enumKeyword;
 
-  /**
-   * The left curly bracket.
-   */
+  /// The left curly bracket.
   @override
   Token leftBracket;
 
-  /**
-   * The enumeration constants being declared.
-   */
+  /// The enumeration constants being declared.
   NodeList<EnumConstantDeclaration> _constants;
 
-  /**
-   * The right curly bracket.
-   */
+  /// The right curly bracket.
   @override
   Token rightBracket;
 
-  /**
-   * Initialize a newly created enumeration declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the declaration does not have the
-   * corresponding attribute. The list of [constants] must contain at least one
-   * value.
-   */
+  /// Initialize a newly created enumeration declaration. Either or both of the
+  /// [comment] and [metadata] can be `null` if the declaration does not have
+  /// the corresponding attribute. The list of [constants] must contain at least
+  /// one value.
   EnumDeclarationImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -3916,10 +3479,8 @@
   }
 }
 
-/**
- * Ephemeral identifiers are created as needed to mimic the presence of an empty
- * identifier.
- */
+/// Ephemeral identifiers are created as needed to mimic the presence of an
+/// empty identifier.
 class EphemeralIdentifier extends SimpleIdentifierImpl {
   EphemeralIdentifier(AstNode parent, int location)
       : super(new StringToken(TokenType.IDENTIFIER, "", location)) {
@@ -3927,20 +3488,16 @@
   }
 }
 
-/**
- * An export directive.
- *
- *    exportDirective ::=
- *        [Annotation] 'export' [StringLiteral] [Combinator]* ';'
- */
+/// An export directive.
+///
+///    exportDirective ::=
+///        [Annotation] 'export' [StringLiteral] [Combinator]* ';'
 class ExportDirectiveImpl extends NamespaceDirectiveImpl
     implements ExportDirective {
-  /**
-   * Initialize a newly created export directive. Either or both of the
-   * [comment] and [metadata] can be `null` if the directive does not have the
-   * corresponding attribute. The list of [combinators] can be `null` if there
-   * are no combinators.
-   */
+  /// Initialize a newly created export directive. Either or both of the
+  /// [comment] and [metadata] can be `null` if the directive does not have the
+  /// corresponding attribute. The list of [combinators] can be `null` if there
+  /// are no combinators.
   ExportDirectiveImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -3979,44 +3536,32 @@
   }
 }
 
-/**
- * A function body consisting of a single expression.
- *
- *    expressionFunctionBody ::=
- *        'async'? '=>' [Expression] ';'
- */
+/// A function body consisting of a single expression.
+///
+///    expressionFunctionBody ::=
+///        'async'? '=>' [Expression] ';'
 class ExpressionFunctionBodyImpl extends FunctionBodyImpl
     implements ExpressionFunctionBody {
-  /**
-   * The token representing the 'async' keyword, or `null` if there is no such
-   * keyword.
-   */
+  /// The token representing the 'async' keyword, or `null` if there is no such
+  /// keyword.
   @override
   Token keyword;
 
-  /**
-   * The token introducing the expression that represents the body of the
-   * function.
-   */
+  /// The token introducing the expression that represents the body of the
+  /// function.
   @override
   Token functionDefinition;
 
-  /**
-   * The expression representing the body of the function.
-   */
+  /// The expression representing the body of the function.
   ExpressionImpl _expression;
 
-  /**
-   * The semicolon terminating the statement.
-   */
+  /// The semicolon terminating the statement.
   @override
   Token semicolon;
 
-  /**
-   * Initialize a newly created function body consisting of a block of
-   * statements. The [keyword] can be `null` if the function body is not an
-   * async function body.
-   */
+  /// Initialize a newly created function body consisting of a block of
+  /// statements. The [keyword] can be `null` if the function body is not an
+  /// async function body.
   ExpressionFunctionBodyImpl(this.keyword, this.functionDefinition,
       ExpressionImpl expression, this.semicolon) {
     _expression = _becomeParentOf(expression);
@@ -4069,29 +3614,23 @@
   }
 }
 
-/**
- * A node that represents an expression.
- *
- *    expression ::=
- *        [AssignmentExpression]
- *      | [ConditionalExpression] cascadeSection*
- *      | [ThrowExpression]
- */
+/// A node that represents an expression.
+///
+///    expression ::=
+///        [AssignmentExpression]
+///      | [ConditionalExpression] cascadeSection*
+///      | [ThrowExpression]
 abstract class ExpressionImpl extends AstNodeImpl
     implements CollectionElementImpl, Expression {
-  /**
-   * The static type of this expression, or `null` if the AST structure has not
-   * been resolved.
-   */
+  /// The static type of this expression, or `null` if the AST structure has not
+  /// been resolved.
   @override
   DartType staticType;
 
-  /**
-   * Return the best parameter element information available for this
-   * expression. If type propagation was able to find a better parameter element
-   * than static analysis, that type will be returned. Otherwise, the result of
-   * static analysis will be returned.
-   */
+  /// Return the best parameter element information available for this
+  /// expression. If type propagation was able to find a better parameter
+  /// element than static analysis, that type will be returned. Otherwise, the
+  /// result of static analysis will be returned.
   @override
   @deprecated
   ParameterElement get bestParameterElement => staticParameterElement;
@@ -4100,27 +3639,27 @@
   @deprecated
   DartType get bestType => staticType ?? DynamicTypeImpl.instance;
 
-  /**
-   * An expression _e_ is said to _occur in a constant context_,
-   * * if _e_ is an element of a constant list literal, or a key or value of an
-   *   entry of a constant map literal.
-   * * if _e_ is an actual argument of a constant object expression or of a
-   *   metadata annotation.
-   * * if _e_ is the initializing expression of a constant variable declaration.
-   * * if _e_ is a switch case expression.
-   * * if _e_ is an immediate subexpression of an expression _e1_ which occurs
-   *   in a constant context, unless _e1_ is a `throw` expression or a function
-   *   literal.
-   *
-   * This roughly means that everything which is inside a syntactically constant
-   * expression is in a constant context. A `throw` expression is currently not
-   * allowed in a constant expression, but extensions affecting that status may
-   * be considered. A similar situation arises for function literals.
-   *
-   * Note that the default value of an optional formal parameter is _not_ a
-   * constant context. This choice reserves some freedom to modify the semantics
-   * of default values.
-   */
+  /// An expression _e_ is said to _occur in a constant context_,
+  /// * if _e_ is an element of a constant list literal, or a key or value of an
+  ///   entry of a constant map literal.
+  /// * if _e_ is an actual argument of a constant object expression or of a
+  ///   metadata annotation.
+  /// * if _e_ is the initializing expression of a constant variable
+  ///   declaration.
+  /// * if _e_ is a switch case expression.
+  /// * if _e_ is an immediate subexpression of an expression _e1_ which occurs
+  ///   in a constant context, unless _e1_ is a `throw` expression or a function
+  ///   literal.
+  ///
+  /// This roughly means that everything which is inside a syntactically
+  /// constant expression is in a constant context. A `throw` expression is
+  /// currently not allowed in a constant expression, but extensions affecting
+  /// that status may be considered. A similar situation arises for function
+  /// literals.
+  ///
+  /// Note that the default value of an optional formal parameter is _not_ a
+  /// constant context. This choice reserves some freedom to modify the
+  /// semantics of default values.
   bool get inConstantContext {
     AstNode child = this;
     while (child is Expression ||
@@ -4202,29 +3741,21 @@
   Expression get unParenthesized => this;
 }
 
-/**
- * An expression used as a statement.
- *
- *    expressionStatement ::=
- *        [Expression]? ';'
- */
+/// An expression used as a statement.
+///
+///    expressionStatement ::=
+///        [Expression]? ';'
 class ExpressionStatementImpl extends StatementImpl
     implements ExpressionStatement {
-  /**
-   * The expression that comprises the statement.
-   */
+  /// The expression that comprises the statement.
   ExpressionImpl _expression;
 
-  /**
-   * The semicolon terminating the statement, or `null` if the expression is a
-   * function expression and therefore isn't followed by a semicolon.
-   */
+  /// The semicolon terminating the statement, or `null` if the expression is a
+  /// function expression and therefore isn't followed by a semicolon.
   @override
   Token semicolon;
 
-  /**
-   * Initialize a newly created expression statement.
-   */
+  /// Initialize a newly created expression statement.
   ExpressionStatementImpl(ExpressionImpl expression, this.semicolon) {
     _expression = _becomeParentOf(expression);
   }
@@ -4264,27 +3795,19 @@
   }
 }
 
-/**
- * The "extends" clause in a class declaration.
- *
- *    extendsClause ::=
- *        'extends' [TypeName]
- */
+/// The "extends" clause in a class declaration.
+///
+///    extendsClause ::=
+///        'extends' [TypeName]
 class ExtendsClauseImpl extends AstNodeImpl implements ExtendsClause {
-  /**
-   * The token representing the 'extends' keyword.
-   */
+  /// The token representing the 'extends' keyword.
   @override
   Token extendsKeyword;
 
-  /**
-   * The name of the class that is being extended.
-   */
+  /// The name of the class that is being extended.
   TypeNameImpl _superclass;
 
-  /**
-   * Initialize a newly created extends clause.
-   */
+  /// Initialize a newly created extends clause.
   ExtendsClauseImpl(this.extendsKeyword, TypeNameImpl superclass) {
     _superclass = _becomeParentOf(superclass);
   }
@@ -4316,43 +3839,31 @@
   }
 }
 
-/**
- * The declaration of one or more fields of the same type.
- *
- *    fieldDeclaration ::=
- *        'static'? [VariableDeclarationList] ';'
- */
+/// The declaration of one or more fields of the same type.
+///
+///    fieldDeclaration ::=
+///        'static'? [VariableDeclarationList] ';'
 class FieldDeclarationImpl extends ClassMemberImpl implements FieldDeclaration {
-  /**
-   * The 'covariant' keyword, or `null` if the keyword was not used.
-   */
+  /// The 'covariant' keyword, or `null` if the keyword was not used.
   @override
   Token covariantKeyword;
 
-  /**
-   * The token representing the 'static' keyword, or `null` if the fields are
-   * not static.
-   */
+  /// The token representing the 'static' keyword, or `null` if the fields are
+  /// not static.
   @override
   Token staticKeyword;
 
-  /**
-   * The fields being declared.
-   */
+  /// The fields being declared.
   VariableDeclarationListImpl _fieldList;
 
-  /**
-   * The semicolon terminating the declaration.
-   */
+  /// The semicolon terminating the declaration.
   @override
   Token semicolon;
 
-  /**
-   * Initialize a newly created field declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the declaration does not have the
-   * corresponding attribute. The [staticKeyword] can be `null` if the field is
-   * not a static field.
-   */
+  /// Initialize a newly created field declaration. Either or both of the
+  /// [comment] and [metadata] can be `null` if the declaration does not have
+  /// the corresponding attribute. The [staticKeyword] can be `null` if the
+  /// field is not a static field.
   FieldDeclarationImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -4409,61 +3920,46 @@
   }
 }
 
-/**
- * A field formal parameter.
- *
- *    fieldFormalParameter ::=
- *        ('final' [TypeName] | 'const' [TypeName] | 'var' | [TypeName])?
- *        'this' '.' [SimpleIdentifier] ([TypeParameterList]? [FormalParameterList])?
- */
+/// A field formal parameter.
+///
+///    fieldFormalParameter ::=
+///        ('final' [TypeName] | 'const' [TypeName] | 'var' | [TypeName])?
+///        'this' '.' [SimpleIdentifier]
+///        ([TypeParameterList]? [FormalParameterList])?
 class FieldFormalParameterImpl extends NormalFormalParameterImpl
     implements FieldFormalParameter {
-  /**
-   * The token representing either the 'final', 'const' or 'var' keyword, or
-   * `null` if no keyword was used.
-   */
+  /// The token representing either the 'final', 'const' or 'var' keyword, or
+  /// `null` if no keyword was used.
   @override
   Token keyword;
 
-  /**
-   * The name of the declared type of the parameter, or `null` if the parameter
-   * does not have a declared type.
-   */
+  /// The name of the declared type of the parameter, or `null` if the parameter
+  /// does not have a declared type.
   TypeAnnotationImpl _type;
 
-  /**
-   * The token representing the 'this' keyword.
-   */
+  /// The token representing the 'this' keyword.
   @override
   Token thisKeyword;
 
-  /**
-   * The token representing the period.
-   */
+  /// The token representing the period.
   @override
   Token period;
 
-  /**
-   * The type parameters associated with the method, or `null` if the method is
-   * not a generic method.
-   */
+  /// The type parameters associated with the method, or `null` if the method is
+  /// not a generic method.
   TypeParameterListImpl _typeParameters;
 
-  /**
-   * The parameters of the function-typed parameter, or `null` if this is not a
-   * function-typed field formal parameter.
-   */
+  /// The parameters of the function-typed parameter, or `null` if this is not a
+  /// function-typed field formal parameter.
   FormalParameterListImpl _parameters;
 
-  /**
-   * Initialize a newly created formal parameter. Either or both of the
-   * [comment] and [metadata] can be `null` if the parameter does not have the
-   * corresponding attribute. The [keyword] can be `null` if there is a type.
-   * The [type] must be `null` if the keyword is 'var'. The [thisKeyword] and
-   * [period] can be `null` if the keyword 'this' was not provided.  The
-   * [parameters] can be `null` if this is not a function-typed field formal
-   * parameter.
-   */
+  /// Initialize a newly created formal parameter. Either or both of the
+  /// [comment] and [metadata] can be `null` if the parameter does not have the
+  /// corresponding attribute. The [keyword] can be `null` if there is a type.
+  /// The [type] must be `null` if the keyword is 'var'. The [thisKeyword] and
+  /// [period] can be `null` if the keyword 'this' was not provided.  The
+  /// [parameters] can be `null` if this is not a function-typed field formal
+  /// parameter.
   FieldFormalParameterImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -4561,16 +4057,12 @@
   @override
   Token inKeyword;
 
-  /**
-   * The expression evaluated to produce the iterator.
-   */
+  /// The expression evaluated to produce the iterator.
   ExpressionImpl _iterable;
 
-  /**
-   * Initialize a newly created for-each statement whose loop control variable
-   * is declared internally (in the for-loop part). The [awaitKeyword] can be
-   * `null` if this is not an asynchronous for loop.
-   */
+  /// Initialize a newly created for-each statement whose loop control variable
+  /// is declared internally (in the for-loop part). The [awaitKeyword] can be
+  /// `null` if this is not an asynchronous for loop.
   ForEachPartsImpl(this.inKeyword, ExpressionImpl iterator) {
     _iterable = _becomeParentOf(iterator);
   }
@@ -4600,15 +4092,11 @@
 
 class ForEachPartsWithDeclarationImpl extends ForEachPartsImpl
     implements ForEachPartsWithDeclaration {
-  /**
-   * The declaration of the loop variable.
-   */
+  /// The declaration of the loop variable.
   DeclaredIdentifierImpl _loopVariable;
 
-  /**
-   * Initialize a newly created for-each statement whose loop control variable
-   * is declared internally (inside the for-loop part).
-   */
+  /// Initialize a newly created for-each statement whose loop control variable
+  /// is declared internally (inside the for-loop part).
   ForEachPartsWithDeclarationImpl(DeclaredIdentifierImpl loopVariable,
       Token inKeyword, ExpressionImpl iterator)
       : super(inKeyword, iterator) {
@@ -4643,15 +4131,11 @@
 
 class ForEachPartsWithIdentifierImpl extends ForEachPartsImpl
     implements ForEachPartsWithIdentifier {
-  /**
-   * The loop variable.
-   */
+  /// The loop variable.
   SimpleIdentifierImpl _identifier;
 
-  /**
-   * Initialize a newly created for-each statement whose loop control variable
-   * is declared externally (outside the for-loop part).
-   */
+  /// Initialize a newly created for-each statement whose loop control variable
+  /// is declared externally (outside the for-loop part).
   ForEachPartsWithIdentifierImpl(
       SimpleIdentifierImpl identifier, Token inKeyword, ExpressionImpl iterator)
       : super(inKeyword, iterator) {
@@ -4684,177 +4168,114 @@
   }
 }
 
-/**
- * A for-each statement.
- *
- *    forEachStatement ::=
- *        'await'? 'for' '(' [DeclaredIdentifier] 'in' [Expression] ')' [Block]
- *      | 'await'? 'for' '(' [SimpleIdentifier] 'in' [Expression] ')' [Block]
- */
-class ForEachStatementImpl extends StatementImpl implements ForEachStatement {
-  /**
-   * The token representing the 'await' keyword, or `null` if there is no
-   * 'await' keyword.
-   */
-  @override
-  Token awaitKeyword;
-
-  /**
-   * The token representing the 'for' keyword.
-   */
-  @override
-  Token forKeyword;
-
-  /**
-   * The left parenthesis.
-   */
-  @override
-  Token leftParenthesis;
-
-  /**
-   * The declaration of the loop variable, or `null` if the loop variable is a
-   * simple identifier.
-   */
-  DeclaredIdentifierImpl _loopVariable;
-
-  /**
-   * The loop variable, or `null` if the loop variable is declared in the 'for'.
-   */
-  SimpleIdentifierImpl _identifier;
-
-  /**
-   * The token representing the 'in' keyword.
-   */
-  @override
-  Token inKeyword;
-
-  /**
-   * The expression evaluated to produce the iterator.
-   */
-  ExpressionImpl _iterable;
-
-  /**
-   * The right parenthesis.
-   */
-  @override
-  Token rightParenthesis;
-
-  /**
-   * The body of the loop.
-   */
-  StatementImpl _body;
-
-  /**
-   * Initialize a newly created for-each statement whose loop control variable
-   * is declared internally (in the for-loop part). The [awaitKeyword] can be
-   * `null` if this is not an asynchronous for loop.
-   */
+/// A for-each statement.
+///
+///    forEachStatement ::=
+///        'await'? 'for' '(' [DeclaredIdentifier] 'in' [Expression] ')' [Block]
+///      | 'await'? 'for' '(' [SimpleIdentifier] 'in' [Expression] ')' [Block]
+@Deprecated('Use ForStatement2Impl')
+class ForEachStatementImpl extends ForStatement2Impl
+    implements ForEachStatement {
+  /// Initialize a newly created for-each statement whose loop control variable
+  /// is declared internally (in the for-loop part). The [awaitKeyword] can be
+  /// `null` if this is not an asynchronous for loop.
   ForEachStatementImpl.withDeclaration(
-      this.awaitKeyword,
-      this.forKeyword,
-      this.leftParenthesis,
+      Token awaitKeyword,
+      Token forKeyword,
+      Token leftParenthesis,
       DeclaredIdentifierImpl loopVariable,
-      this.inKeyword,
+      Token inKeyword,
       ExpressionImpl iterator,
-      this.rightParenthesis,
-      StatementImpl body) {
-    _loopVariable = _becomeParentOf(loopVariable);
-    _iterable = _becomeParentOf(iterator);
-    _body = _becomeParentOf(body);
-  }
+      Token rightParenthesis,
+      StatementImpl body)
+      : super(
+            awaitKeyword,
+            forKeyword,
+            leftParenthesis,
+            new ForEachPartsWithDeclarationImpl(
+                loopVariable, inKeyword, iterator),
+            rightParenthesis,
+            body);
 
-  /**
-   * Initialize a newly created for-each statement whose loop control variable
-   * is declared outside the for loop. The [awaitKeyword] can be `null` if this
-   * is not an asynchronous for loop.
-   */
+  /// Creates a for-each statement using a caller-provided "parts" data
+  /// structure.
+  ForEachStatementImpl.withParts(
+      Token awaitKeyword,
+      Token forKeyword,
+      Token leftParenthesis,
+      ForEachPartsImpl forLoopParts,
+      Token rightParenthesis,
+      Statement body)
+      : super(awaitKeyword, forKeyword, leftParenthesis, forLoopParts,
+            rightParenthesis, body);
+
+  /// Initialize a newly created for-each statement whose loop control variable
+  /// is declared outside the for loop. The [awaitKeyword] can be `null` if this
+  /// is not an asynchronous for loop.
   ForEachStatementImpl.withReference(
-      this.awaitKeyword,
-      this.forKeyword,
-      this.leftParenthesis,
+      Token awaitKeyword,
+      Token forKeyword,
+      Token leftParenthesis,
       SimpleIdentifierImpl identifier,
-      this.inKeyword,
+      Token inKeyword,
       ExpressionImpl iterator,
-      this.rightParenthesis,
-      StatementImpl body) {
-    _identifier = _becomeParentOf(identifier);
-    _iterable = _becomeParentOf(iterator);
-    _body = _becomeParentOf(body);
-  }
+      Token rightParenthesis,
+      StatementImpl body)
+      : super(
+            awaitKeyword,
+            forKeyword,
+            leftParenthesis,
+            new ForEachPartsWithIdentifierImpl(identifier, inKeyword, iterator),
+            rightParenthesis,
+            body);
 
   @override
-  Token get beginToken => awaitKeyword ?? forKeyword;
-
-  @override
-  Statement get body => _body;
-
-  @override
-  void set body(Statement statement) {
-    _body = _becomeParentOf(statement as StatementImpl);
-  }
-
-  @override
-  Iterable<SyntacticEntity> get childEntities => new ChildEntities()
-    ..add(awaitKeyword)
-    ..add(forKeyword)
-    ..add(leftParenthesis)
-    ..add(_loopVariable)
-    ..add(_identifier)
-    ..add(inKeyword)
-    ..add(_iterable)
-    ..add(rightParenthesis)
-    ..add(_body);
-
-  @override
-  Token get endToken => _body.endToken;
-
-  @override
-  SimpleIdentifier get identifier => _identifier;
+  SimpleIdentifier get identifier => forLoopParts is ForEachPartsWithIdentifier
+      ? (forLoopParts as ForEachPartsWithIdentifier).identifier
+      : null;
 
   @override
   void set identifier(SimpleIdentifier identifier) {
-    _identifier = _becomeParentOf(identifier as SimpleIdentifierImpl);
+    (forLoopParts as ForEachPartsWithIdentifierImpl).identifier = identifier;
   }
 
   @override
-  Expression get iterable => _iterable;
+  Token get inKeyword => (forLoopParts as ForEachParts).inKeyword;
+
+  @override
+  set inKeyword(Token keyword) =>
+      (forLoopParts as ForEachPartsImpl).inKeyword = keyword;
+
+  @override
+  Expression get iterable => (forLoopParts as ForEachParts).iterable;
 
   @override
   void set iterable(Expression expression) {
-    _iterable = _becomeParentOf(expression as ExpressionImpl);
+    (forLoopParts as ForEachPartsImpl).iterable = expression;
   }
 
   @override
-  DeclaredIdentifier get loopVariable => _loopVariable;
+  DeclaredIdentifier get loopVariable =>
+      forLoopParts is ForEachPartsWithDeclaration
+          ? (forLoopParts as ForEachPartsWithDeclaration).loopVariable
+          : null;
 
   @override
   void set loopVariable(DeclaredIdentifier variable) {
-    _loopVariable = _becomeParentOf(variable as DeclaredIdentifierImpl);
+    (forLoopParts as ForEachPartsWithDeclarationImpl).loopVariable = variable;
   }
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitForEachStatement(this);
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    _loopVariable?.accept(visitor);
-    _identifier?.accept(visitor);
-    _iterable?.accept(visitor);
-    _body?.accept(visitor);
-  }
 }
 
 class ForElementImpl extends CollectionElementImpl
     with ForMixin
     implements ForElement {
-  /**
-   * The body of the loop.
-   */
+  /// The body of the loop.
   CollectionElementImpl _body;
 
-  /**
-   * Initialize a newly created for element.
-   */
+  /// Initialize a newly created for element.
   ForElementImpl(
       Token awaitKeyword,
       Token forKeyword,
@@ -4897,13 +4318,11 @@
 
 abstract class ForLoopPartsImpl extends AstNodeImpl implements ForLoopParts {}
 
-/**
- * A node representing a parameter to a function.
- *
- *    formalParameter ::=
- *        [NormalFormalParameter]
- *      | [DefaultFormalParameter]
- */
+/// A node representing a parameter to a function.
+///
+///    formalParameter ::=
+///        [NormalFormalParameter]
+///      | [DefaultFormalParameter]
 abstract class FormalParameterImpl extends AstNodeImpl
     implements FormalParameter {
   @override
@@ -4941,72 +4360,58 @@
   ParameterKind get kind;
 }
 
-/**
- * The formal parameter list of a method declaration, function declaration, or
- * function type alias.
- *
- * While the grammar requires all optional formal parameters to follow all of
- * the normal formal parameters and at most one grouping of optional formal
- * parameters, this class does not enforce those constraints. All parameters are
- * flattened into a single list, which can have any or all kinds of parameters
- * (normal, named, and positional) in any order.
- *
- *    formalParameterList ::=
- *        '(' ')'
- *      | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
- *      | '(' optionalFormalParameters ')'
- *
- *    normalFormalParameters ::=
- *        [NormalFormalParameter] (',' [NormalFormalParameter])*
- *
- *    optionalFormalParameters ::=
- *        optionalPositionalFormalParameters
- *      | namedFormalParameters
- *
- *    optionalPositionalFormalParameters ::=
- *        '[' [DefaultFormalParameter] (',' [DefaultFormalParameter])* ']'
- *
- *    namedFormalParameters ::=
- *        '{' [DefaultFormalParameter] (',' [DefaultFormalParameter])* '}'
- */
+/// The formal parameter list of a method declaration, function declaration, or
+/// function type alias.
+///
+/// While the grammar requires all optional formal parameters to follow all of
+/// the normal formal parameters and at most one grouping of optional formal
+/// parameters, this class does not enforce those constraints. All parameters
+/// are flattened into a single list, which can have any or all kinds of
+/// parameters (normal, named, and positional) in any order.
+///
+///    formalParameterList ::=
+///        '(' ')'
+///      | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
+///      | '(' optionalFormalParameters ')'
+///
+///    normalFormalParameters ::=
+///        [NormalFormalParameter] (',' [NormalFormalParameter])*
+///
+///    optionalFormalParameters ::=
+///        optionalPositionalFormalParameters
+///      | namedFormalParameters
+///
+///    optionalPositionalFormalParameters ::=
+///        '[' [DefaultFormalParameter] (',' [DefaultFormalParameter])* ']'
+///
+///    namedFormalParameters ::=
+///        '{' [DefaultFormalParameter] (',' [DefaultFormalParameter])* '}'
 class FormalParameterListImpl extends AstNodeImpl
     implements FormalParameterList {
-  /**
-   * The left parenthesis.
-   */
+  /// The left parenthesis.
   @override
   Token leftParenthesis;
 
-  /**
-   * The parameters associated with the method.
-   */
+  /// The parameters associated with the method.
   NodeList<FormalParameter> _parameters;
 
-  /**
-   * The left square bracket ('[') or left curly brace ('{') introducing the
-   * optional parameters, or `null` if there are no optional parameters.
-   */
+  /// The left square bracket ('[') or left curly brace ('{') introducing the
+  /// optional parameters, or `null` if there are no optional parameters.
   @override
   Token leftDelimiter;
 
-  /**
-   * The right square bracket (']') or right curly brace ('}') terminating the
-   * optional parameters, or `null` if there are no optional parameters.
-   */
+  /// The right square bracket (']') or right curly brace ('}') terminating the
+  /// optional parameters, or `null` if there are no optional parameters.
   @override
   Token rightDelimiter;
 
-  /**
-   * The right parenthesis.
-   */
+  /// The right parenthesis.
   @override
   Token rightParenthesis;
 
-  /**
-   * Initialize a newly created parameter list. The list of [parameters] can be
-   * `null` if there are no parameters. The [leftDelimiter] and [rightDelimiter]
-   * can be `null` if there are no optional parameters.
-   */
+  /// Initialize a newly created parameter list. The list of [parameters] can be
+  /// `null` if there are no parameters. The [leftDelimiter] and
+  /// [rightDelimiter] can be `null` if there are no optional parameters.
   FormalParameterListImpl(
       this.leftParenthesis,
       List<FormalParameter> parameters,
@@ -5094,26 +4499,20 @@
   @override
   Token leftSeparator;
 
-  /**
-   * The condition used to determine when to terminate the loop, or `null` if
-   * there is no condition.
-   */
+  /// The condition used to determine when to terminate the loop, or `null` if
+  /// there is no condition.
   ExpressionImpl _condition;
 
   @override
   Token rightSeparator;
 
-  /**
-   * The list of expressions run after each execution of the loop body.
-   */
+  /// The list of expressions run after each execution of the loop body.
   NodeList<Expression> _updaters;
 
-  /**
-   * Initialize a newly created for statement. Either the [variableList] or the
-   * [initialization] must be `null`. Either the [condition] and the list of
-   * [updaters] can be `null` if the loop does not have the corresponding
-   * attribute.
-   */
+  /// Initialize a newly created for statement. Either the [variableList] or the
+  /// [initialization] must be `null`. Either the [condition] and the list of
+  /// [updaters] can be `null` if the loop does not have the corresponding
+  /// attribute.
   ForPartsImpl(this.leftSeparator, ExpressionImpl condition,
       this.rightSeparator, List<Expression> updaters) {
     _condition = _becomeParentOf(condition);
@@ -5152,18 +4551,14 @@
 
 class ForPartsWithDeclarationsImpl extends ForPartsImpl
     implements ForPartsWithDeclarations {
-  /**
-   * The declaration of the loop variables, or `null` if there are no variables.
-   * Note that a for statement cannot have both a variable list and an
-   * initialization expression, but can validly have neither.
-   */
+  /// The declaration of the loop variables, or `null` if there are no
+  /// variables.  Note that a for statement cannot have both a variable list and
+  /// an initialization expression, but can validly have neither.
   VariableDeclarationListImpl _variableList;
 
-  /**
-   * Initialize a newly created for statement. Both the [condition] and the list
-   * of [updaters] can be `null` if the loop does not have the corresponding
-   * attribute.
-   */
+  /// Initialize a newly created for statement. Both the [condition] and the
+  /// list of [updaters] can be `null` if the loop does not have the
+  /// corresponding attribute.
   ForPartsWithDeclarationsImpl(
       VariableDeclarationListImpl variableList,
       Token leftSeparator,
@@ -5203,18 +4598,14 @@
 
 class ForPartsWithExpressionImpl extends ForPartsImpl
     implements ForPartsWithExpression {
-  /**
-   * The initialization expression, or `null` if there is no initialization
-   * expression. Note that a for statement cannot have both a variable list and
-   * an initialization expression, but can validly have neither.
-   */
+  /// The initialization expression, or `null` if there is no initialization
+  /// expression. Note that a for statement cannot have both a variable list and
+  /// an initialization expression, but can validly have neither.
   ExpressionImpl _initialization;
 
-  /**
-   * Initialize a newly created for statement. Both the [condition] and the list
-   * of [updaters] can be `null` if the loop does not have the corresponding
-   * attribute.
-   */
+  /// Initialize a newly created for statement. Both the [condition] and the
+  /// list of [updaters] can be `null` if the loop does not have the
+  /// corresponding attribute.
   ForPartsWithExpressionImpl(ExpressionImpl initialization, Token leftSeparator,
       ExpressionImpl condition, Token rightSeparator, List<Expression> updaters)
       : super(leftSeparator, condition, rightSeparator, updaters) {
@@ -5247,17 +4638,13 @@
   }
 }
 
-class ForStatement2Impl extends StatementImpl
+abstract class ForStatement2Impl extends StatementImpl
     with ForMixin
     implements ForStatement2 {
-  /**
-   * The body of the loop.
-   */
+  /// The body of the loop.
   StatementImpl _body;
 
-  /**
-   * Initialize a newly created for statement.
-   */
+  /// Initialize a newly created for statement.
   ForStatement2Impl(
       Token awaitKeyword,
       Token forKeyword,
@@ -5273,7 +4660,6 @@
     _body = _becomeParentOf(body);
   }
 
-  @override
   Statement get body => _body;
 
   void set body(Statement statement) {
@@ -5298,217 +4684,142 @@
   }
 }
 
-/**
- * A for statement.
- *
- *    forStatement ::=
- *        'for' '(' forLoopParts ')' [Statement]
- *
- *    forLoopParts ::=
- *        forInitializerStatement ';' [Expression]? ';' [Expression]?
- *
- *    forInitializerStatement ::=
- *        [DefaultFormalParameter]
- *      | [Expression]?
- */
-class ForStatementImpl extends StatementImpl implements ForStatement {
-  /**
-   * The token representing the 'for' keyword.
-   */
-  @override
-  Token forKeyword;
-
-  /**
-   * The left parenthesis.
-   */
-  @override
-  Token leftParenthesis;
-
-  /**
-   * The declaration of the loop variables, or `null` if there are no variables.
-   * Note that a for statement cannot have both a variable list and an
-   * initialization expression, but can validly have neither.
-   */
-  VariableDeclarationListImpl _variableList;
-
-  /**
-   * The initialization expression, or `null` if there is no initialization
-   * expression. Note that a for statement cannot have both a variable list and
-   * an initialization expression, but can validly have neither.
-   */
-  ExpressionImpl _initialization;
-
-  /**
-   * The semicolon separating the initializer and the condition.
-   */
-  @override
-  Token leftSeparator;
-
-  /**
-   * The condition used to determine when to terminate the loop, or `null` if
-   * there is no condition.
-   */
-  ExpressionImpl _condition;
-
-  /**
-   * The semicolon separating the condition and the updater.
-   */
-  @override
-  Token rightSeparator;
-
-  /**
-   * The list of expressions run after each execution of the loop body.
-   */
-  NodeList<Expression> _updaters;
-
-  /**
-   * The right parenthesis.
-   */
-  @override
-  Token rightParenthesis;
-
-  /**
-   * The body of the loop.
-   */
-  StatementImpl _body;
-
-  /**
-   * Initialize a newly created for statement. Either the [variableList] or the
-   * [initialization] must be `null`. Either the [condition] and the list of
-   * [updaters] can be `null` if the loop does not have the corresponding
-   * attribute.
-   */
+/// A for statement.
+///
+///    forStatement ::=
+///        'for' '(' forLoopParts ')' [Statement]
+///
+///    forLoopParts ::=
+///        forInitializerStatement ';' [Expression]? ';' [Expression]?
+///
+///    forInitializerStatement ::=
+///        [DefaultFormalParameter]
+///      | [Expression]?
+@Deprecated('Use ForStatement2Impl')
+class ForStatementImpl extends ForStatement2Impl implements ForStatement {
+  /// Initialize a newly created for statement. Either the [variableList] or the
+  /// [initialization] must be `null`. Either the [condition] and the list of
+  /// [updaters] can be `null` if the loop does not have the corresponding
+  /// attribute.
   ForStatementImpl(
-      this.forKeyword,
-      this.leftParenthesis,
+      Token forKeyword,
+      Token leftParenthesis,
       VariableDeclarationListImpl variableList,
       ExpressionImpl initialization,
-      this.leftSeparator,
+      Token leftSeparator,
       ExpressionImpl condition,
-      this.rightSeparator,
+      Token rightSeparator,
       List<Expression> updaters,
-      this.rightParenthesis,
-      StatementImpl body) {
-    _variableList = _becomeParentOf(variableList);
-    _initialization = _becomeParentOf(initialization);
-    _condition = _becomeParentOf(condition);
-    _updaters = new NodeListImpl<Expression>(this, updaters);
-    _body = _becomeParentOf(body);
-  }
+      Token rightParenthesis,
+      StatementImpl body)
+      : super(
+            null,
+            forKeyword,
+            leftParenthesis,
+            variableList == null
+                ? new ForPartsWithExpressionImpl(initialization, leftSeparator,
+                    condition, rightSeparator, updaters)
+                : new ForPartsWithDeclarationsImpl(variableList, leftSeparator,
+                    condition, rightSeparator, updaters),
+            rightParenthesis,
+            body);
+
+  /// Creates a for-each statement using a caller-provided "parts" data
+  /// structure.
+  ForStatementImpl.withParts(
+      Token awaitKeyword,
+      Token forKeyword,
+      Token leftParenthesis,
+      ForPartsImpl forLoopParts,
+      Token rightParenthesis,
+      Statement body)
+      : super(awaitKeyword, forKeyword, leftParenthesis, forLoopParts,
+            rightParenthesis, body);
 
   @override
-  Token get beginToken => forKeyword;
-
-  @override
-  Statement get body => _body;
-
-  @override
-  void set body(Statement statement) {
-    _body = _becomeParentOf(statement as StatementImpl);
-  }
-
-  @override
-  Iterable<SyntacticEntity> get childEntities => new ChildEntities()
-    ..add(forKeyword)
-    ..add(leftParenthesis)
-    ..add(_variableList)
-    ..add(_initialization)
-    ..add(leftSeparator)
-    ..add(_condition)
-    ..add(rightSeparator)
-    ..addAll(_updaters)
-    ..add(rightParenthesis)
-    ..add(_body);
-
-  @override
-  Expression get condition => _condition;
+  Expression get condition => (forLoopParts as ForParts).condition;
 
   @override
   void set condition(Expression expression) {
-    _condition = _becomeParentOf(expression as ExpressionImpl);
+    (forLoopParts as ForPartsImpl).condition = expression;
   }
 
   @override
-  Token get endToken => _body.endToken;
-
-  @override
-  Expression get initialization => _initialization;
+  Expression get initialization => forLoopParts is ForPartsWithExpression
+      ? (forLoopParts as ForPartsWithExpression).initialization
+      : null;
 
   @override
   void set initialization(Expression initialization) {
-    _initialization = _becomeParentOf(initialization as ExpressionImpl);
+    if (forLoopParts is ForPartsWithExpressionImpl) {
+      (forLoopParts as ForPartsWithExpressionImpl).initialization =
+          initialization;
+    }
   }
 
   @override
-  NodeList<Expression> get updaters => _updaters;
+  Token get leftSeparator => (forLoopParts as ForParts).leftSeparator;
 
   @override
-  VariableDeclarationList get variables => _variableList;
+  set leftSeparator(Token separator) =>
+      (forLoopParts as ForPartsImpl).leftSeparator = separator;
+
+  @override
+  Token get rightSeparator => (forLoopParts as ForParts).rightSeparator;
+
+  @override
+  set rightSeparator(Token separator) =>
+      (forLoopParts as ForPartsImpl).rightSeparator = separator;
+
+  @override
+  NodeList<Expression> get updaters => (forLoopParts as ForParts).updaters;
+
+  @override
+  VariableDeclarationList get variables =>
+      forLoopParts is ForPartsWithDeclarations
+          ? (forLoopParts as ForPartsWithDeclarations).variables
+          : null;
 
   @override
   void set variables(VariableDeclarationList variableList) {
-    _variableList =
-        _becomeParentOf(variableList as VariableDeclarationListImpl);
+    (forLoopParts as ForPartsWithDeclarationsImpl).variables = variableList;
   }
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitForStatement(this);
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    _variableList?.accept(visitor);
-    _initialization?.accept(visitor);
-    _condition?.accept(visitor);
-    _updaters.accept(visitor);
-    _body?.accept(visitor);
-  }
 }
 
-/**
- * A node representing the body of a function or method.
- *
- *    functionBody ::=
- *        [BlockFunctionBody]
- *      | [EmptyFunctionBody]
- *      | [ExpressionFunctionBody]
- */
+/// A node representing the body of a function or method.
+///
+///    functionBody ::=
+///        [BlockFunctionBody]
+///      | [EmptyFunctionBody]
+///      | [ExpressionFunctionBody]
 abstract class FunctionBodyImpl extends AstNodeImpl implements FunctionBody {
-  /**
-   * Additional information about local variables and parameters that are
-   * declared within this function body or any enclosing function body.  `null`
-   * if resolution has not yet been performed.
-   */
+  /// Additional information about local variables and parameters that are
+  /// declared within this function body or any enclosing function body.  `null`
+  /// if resolution has not yet been performed.
   LocalVariableInfo localVariableInfo;
 
-  /**
-   * Return `true` if this function body is asynchronous.
-   */
+  /// Return `true` if this function body is asynchronous.
   @override
   bool get isAsynchronous => false;
 
-  /**
-   * Return `true` if this function body is a generator.
-   */
+  /// Return `true` if this function body is a generator.
   @override
   bool get isGenerator => false;
 
-  /**
-   * Return `true` if this function body is synchronous.
-   */
+  /// Return `true` if this function body is synchronous.
   @override
   bool get isSynchronous => true;
 
-  /**
-   * Return the token representing the 'async' or 'sync' keyword, or `null` if
-   * there is no such keyword.
-   */
+  /// Return the token representing the 'async' or 'sync' keyword, or `null` if
+  /// there is no such keyword.
   @override
   Token get keyword => null;
 
-  /**
-   * Return the star following the 'async' or 'sync' keyword, or `null` if there
-   * is no star.
-   */
+  /// Return the star following the 'async' or 'sync' keyword, or `null` if
+  /// there is no star.
   @override
   Token get star => null;
 
@@ -5529,50 +4840,38 @@
   }
 }
 
-/**
- * A top-level declaration.
- *
- *    functionDeclaration ::=
- *        'external' functionSignature
- *      | functionSignature [FunctionBody]
- *
- *    functionSignature ::=
- *        [Type]? ('get' | 'set')? [SimpleIdentifier] [FormalParameterList]
- */
+/// A top-level declaration.
+///
+///    functionDeclaration ::=
+///        'external' functionSignature
+///      | functionSignature [FunctionBody]
+///
+///    functionSignature ::=
+///        [Type]? ('get' | 'set')? [SimpleIdentifier] [FormalParameterList]
 class FunctionDeclarationImpl extends NamedCompilationUnitMemberImpl
     implements FunctionDeclaration {
-  /**
-   * The token representing the 'external' keyword, or `null` if this is not an
-   * external function.
-   */
+  /// The token representing the 'external' keyword, or `null` if this is not an
+  /// external function.
   @override
   Token externalKeyword;
 
-  /**
-   * The return type of the function, or `null` if no return type was declared.
-   */
+  /// The return type of the function, or `null` if no return type was declared.
   TypeAnnotationImpl _returnType;
 
-  /**
-   * The token representing the 'get' or 'set' keyword, or `null` if this is a
-   * function declaration rather than a property declaration.
-   */
+  /// The token representing the 'get' or 'set' keyword, or `null` if this is a
+  /// function declaration rather than a property declaration.
   @override
   Token propertyKeyword;
 
-  /**
-   * The function expression being wrapped.
-   */
+  /// The function expression being wrapped.
   FunctionExpressionImpl _functionExpression;
 
-  /**
-   * Initialize a newly created function declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the function does not have the
-   * corresponding attribute. The [externalKeyword] can be `null` if the
-   * function is not an external function. The [returnType] can be `null` if no
-   * return type was specified. The [propertyKeyword] can be `null` if the
-   * function is neither a getter or a setter.
-   */
+  /// Initialize a newly created function declaration. Either or both of the
+  /// [comment] and [metadata] can be `null` if the function does not have the
+  /// corresponding attribute. The [externalKeyword] can be `null` if the
+  /// function is not an external function. The [returnType] can be `null` if no
+  /// return type was specified. The [propertyKeyword] can be `null` if the
+  /// function is neither a getter or a setter.
   FunctionDeclarationImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -5654,19 +4953,13 @@
   }
 }
 
-/**
- * A [FunctionDeclaration] used as a statement.
- */
+/// A [FunctionDeclaration] used as a statement.
 class FunctionDeclarationStatementImpl extends StatementImpl
     implements FunctionDeclarationStatement {
-  /**
-   * The function declaration being wrapped.
-   */
+  /// The function declaration being wrapped.
   FunctionDeclarationImpl _functionDeclaration;
 
-  /**
-   * Initialize a newly created function declaration statement.
-   */
+  /// Initialize a newly created function declaration statement.
   FunctionDeclarationStatementImpl(
       FunctionDeclarationImpl functionDeclaration) {
     _functionDeclaration = _becomeParentOf(functionDeclaration);
@@ -5701,36 +4994,26 @@
   }
 }
 
-/**
- * A function expression.
- *
- *    functionExpression ::=
- *        [TypeParameterList]? [FormalParameterList] [FunctionBody]
- */
+/// A function expression.
+///
+///    functionExpression ::=
+///        [TypeParameterList]? [FormalParameterList] [FunctionBody]
 class FunctionExpressionImpl extends ExpressionImpl
     implements FunctionExpression {
-  /**
-   * The type parameters associated with the method, or `null` if the method is
-   * not a generic method.
-   */
+  /// The type parameters associated with the method, or `null` if the method is
+  /// not a generic method.
   TypeParameterListImpl _typeParameters;
 
-  /**
-   * The parameters associated with the function.
-   */
+  /// The parameters associated with the function.
   FormalParameterListImpl _parameters;
 
-  /**
-   * The body of the function, or `null` if this is an external function.
-   */
+  /// The body of the function, or `null` if this is an external function.
   FunctionBodyImpl _body;
 
   @override
   ExecutableElement declaredElement;
 
-  /**
-   * Initialize a newly created function declaration.
-   */
+  /// Initialize a newly created function declaration.
   FunctionExpressionImpl(TypeParameterListImpl typeParameters,
       FormalParameterListImpl parameters, FunctionBodyImpl body) {
     _typeParameters = _becomeParentOf(typeParameters);
@@ -5794,8 +5077,13 @@
     _parameters = _becomeParentOf(parameters as FormalParameterListImpl);
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.primary;
 
   @override
   TypeParameterList get typeParameters => _typeParameters;
@@ -5816,33 +5104,25 @@
   }
 }
 
-/**
- * The invocation of a function resulting from evaluating an expression.
- * Invocations of methods and other forms of functions are represented by
- * [MethodInvocation] nodes. Invocations of getters and setters are represented
- * by either [PrefixedIdentifier] or [PropertyAccess] nodes.
- *
- *    functionExpressionInvocation ::=
- *        [Expression] [TypeArgumentList]? [ArgumentList]
- */
+/// The invocation of a function resulting from evaluating an expression.
+/// Invocations of methods and other forms of functions are represented by
+/// [MethodInvocation] nodes. Invocations of getters and setters are represented
+/// by either [PrefixedIdentifier] or [PropertyAccess] nodes.
+///
+///    functionExpressionInvocation ::=
+///        [Expression] [TypeArgumentList]? [ArgumentList]
 class FunctionExpressionInvocationImpl extends InvocationExpressionImpl
     implements FunctionExpressionInvocation {
-  /**
-   * The expression producing the function being invoked.
-   */
+  /// The expression producing the function being invoked.
   ExpressionImpl _function;
 
-  /**
-   * The element associated with the function being invoked based on static type
-   * information, or `null` if the AST structure has not been resolved or the
-   * function could not be resolved.
-   */
+  /// The element associated with the function being invoked based on static
+  /// type information, or `null` if the AST structure has not been resolved or
+  /// the function could not be resolved.
   @override
   ExecutableElement staticElement;
 
-  /**
-   * Initialize a newly created function expression invocation.
-   */
+  /// Initialize a newly created function expression invocation.
   FunctionExpressionInvocationImpl(ExpressionImpl function,
       TypeArgumentListImpl typeArguments, ArgumentListImpl argumentList)
       : super(typeArguments, argumentList) {
@@ -5871,8 +5151,13 @@
     _function = _becomeParentOf(expression as ExpressionImpl);
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.postfix;
 
   @deprecated
   @override
@@ -5894,40 +5179,30 @@
   }
 }
 
-/**
- * A function type alias.
- *
- *    functionTypeAlias ::=
- *        functionPrefix [TypeParameterList]? [FormalParameterList] ';'
- *
- *    functionPrefix ::=
- *        [TypeName]? [SimpleIdentifier]
- */
+/// A function type alias.
+///
+///    functionTypeAlias ::=
+///        functionPrefix [TypeParameterList]? [FormalParameterList] ';'
+///
+///    functionPrefix ::=
+///        [TypeName]? [SimpleIdentifier]
 class FunctionTypeAliasImpl extends TypeAliasImpl implements FunctionTypeAlias {
-  /**
-   * The name of the return type of the function type being defined, or `null`
-   * if no return type was given.
-   */
+  /// The name of the return type of the function type being defined, or `null`
+  /// if no return type was given.
   TypeAnnotationImpl _returnType;
 
-  /**
-   * The type parameters for the function type, or `null` if the function type
-   * does not have any type parameters.
-   */
+  /// The type parameters for the function type, or `null` if the function type
+  /// does not have any type parameters.
   TypeParameterListImpl _typeParameters;
 
-  /**
-   * The parameters associated with the function type.
-   */
+  /// The parameters associated with the function type.
   FormalParameterListImpl _parameters;
 
-  /**
-   * Initialize a newly created function type alias. Either or both of the
-   * [comment] and [metadata] can be `null` if the function does not have the
-   * corresponding attribute. The [returnType] can be `null` if no return type
-   * was specified. The [typeParameters] can be `null` if the function has no
-   * type parameters.
-   */
+  /// Initialize a newly created function type alias. Either or both of the
+  /// [comment] and [metadata] can be `null` if the function does not have the
+  /// corresponding attribute. The [returnType] can be `null` if no return type
+  /// was specified. The [typeParameters] can be `null` if the function has no
+  /// type parameters.
   FunctionTypeAliasImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -5997,37 +5272,28 @@
   }
 }
 
-/**
- * A function-typed formal parameter.
- *
- *    functionSignature ::=
- *        [TypeName]? [SimpleIdentifier] [TypeParameterList]? [FormalParameterList]
- */
+/// A function-typed formal parameter.
+///
+///    functionSignature ::=
+///        [TypeName]? [SimpleIdentifier] [TypeParameterList]?
+///        [FormalParameterList]
 class FunctionTypedFormalParameterImpl extends NormalFormalParameterImpl
     implements FunctionTypedFormalParameter {
-  /**
-   * The return type of the function, or `null` if the function does not have a
-   * return type.
-   */
+  /// The return type of the function, or `null` if the function does not have a
+  /// return type.
   TypeAnnotationImpl _returnType;
 
-  /**
-   * The type parameters associated with the function, or `null` if the function
-   * is not a generic function.
-   */
+  /// The type parameters associated with the function, or `null` if the
+  /// function is not a generic function.
   TypeParameterListImpl _typeParameters;
 
-  /**
-   * The parameters of the function-typed parameter.
-   */
+  /// The parameters of the function-typed parameter.
   FormalParameterListImpl _parameters;
 
-  /**
-   * Initialize a newly created formal parameter. Either or both of the
-   * [comment] and [metadata] can be `null` if the parameter does not have the
-   * corresponding attribute. The [returnType] can be `null` if no return type
-   * was specified.
-   */
+  /// Initialize a newly created formal parameter. Either or both of the
+  /// [comment] and [metadata] can be `null` if the parameter does not have the
+  /// corresponding attribute. The [returnType] can be `null` if no return type
+  /// was specified.
   FunctionTypedFormalParameterImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -6100,55 +5366,48 @@
   }
 }
 
-/**
- * An anonymous function type.
- *
- *    functionType ::=
- *        [TypeAnnotation]? 'Function' [TypeParameterList]? [FormalParameterList]
- *
- * where the FormalParameterList is being used to represent the following
- * grammar, despite the fact that FormalParameterList can represent a much
- * larger grammar than the one below. This is done in order to simplify the
- * implementation.
- *
- *    parameterTypeList ::=
- *        () |
- *        ( normalParameterTypes ,? ) |
- *        ( normalParameterTypes , optionalParameterTypes ) |
- *        ( optionalParameterTypes )
- *    namedParameterTypes ::=
- *        { namedParameterType (, namedParameterType)* ,? }
- *    namedParameterType ::=
- *        [TypeAnnotation]? [SimpleIdentifier]
- *    normalParameterTypes ::=
- *        normalParameterType (, normalParameterType)*
- *    normalParameterType ::=
- *        [TypeAnnotation] [SimpleIdentifier]?
- *    optionalParameterTypes ::=
- *        optionalPositionalParameterTypes | namedParameterTypes
- *    optionalPositionalParameterTypes ::=
- *        [ normalParameterTypes ,? ]
- */
+/// An anonymous function type.
+///
+///    functionType ::=
+///        [TypeAnnotation]? 'Function' [TypeParameterList]?
+///        [FormalParameterList]
+///
+/// where the FormalParameterList is being used to represent the following
+/// grammar, despite the fact that FormalParameterList can represent a much
+/// larger grammar than the one below. This is done in order to simplify the
+/// implementation.
+///
+///    parameterTypeList ::=
+///        () |
+///        ( normalParameterTypes ,? ) |
+///        ( normalParameterTypes , optionalParameterTypes ) |
+///        ( optionalParameterTypes )
+///    namedParameterTypes ::=
+///        { namedParameterType (, namedParameterType)* ,? }
+///    namedParameterType ::=
+///        [TypeAnnotation]? [SimpleIdentifier]
+///    normalParameterTypes ::=
+///        normalParameterType (, normalParameterType)*
+///    normalParameterType ::=
+///        [TypeAnnotation] [SimpleIdentifier]?
+///    optionalParameterTypes ::=
+///        optionalPositionalParameterTypes | namedParameterTypes
+///    optionalPositionalParameterTypes ::=
+///        [ normalParameterTypes ,? ]
 class GenericFunctionTypeImpl extends TypeAnnotationImpl
     implements GenericFunctionType {
-  /**
-   * The name of the return type of the function type being defined, or
-   * `null` if no return type was given.
-   */
+  /// The name of the return type of the function type being defined, or
+  /// `null` if no return type was given.
   TypeAnnotationImpl _returnType;
 
   @override
   Token functionKeyword;
 
-  /**
-   * The type parameters for the function type, or `null` if the function type
-   * does not have any type parameters.
-   */
+  /// The type parameters for the function type, or `null` if the function type
+  /// does not have any type parameters.
   TypeParameterListImpl _typeParameters;
 
-  /**
-   * The parameters associated with the function type.
-   */
+  /// The parameters associated with the function type.
   FormalParameterListImpl _parameters;
 
   @override
@@ -6157,9 +5416,7 @@
   @override
   DartType type;
 
-  /**
-   * Initialize a newly created generic function type.
-   */
+  /// Initialize a newly created generic function type.
   GenericFunctionTypeImpl(TypeAnnotationImpl returnType, this.functionKeyword,
       TypeParameterListImpl typeParameters, FormalParameterListImpl parameters,
       {this.question}) {
@@ -6198,16 +5455,12 @@
     _returnType = _becomeParentOf(type as TypeAnnotationImpl);
   }
 
-  /**
-   * Return the type parameters for the function type, or `null` if the function
-   * type does not have any type parameters.
-   */
+  /// Return the type parameters for the function type, or `null` if the
+  /// function type does not have any type parameters.
   TypeParameterList get typeParameters => _typeParameters;
 
-  /**
-   * Set the type parameters for the function type to the given list of
-   * [typeParameters].
-   */
+  /// Set the type parameters for the function type to the given list of
+  /// [typeParameters].
   void set typeParameters(TypeParameterList typeParameters) {
     _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl);
   }
@@ -6226,33 +5479,26 @@
   }
 }
 
-/**
- * A generic type alias.
- *
- *    functionTypeAlias ::=
- *        metadata 'typedef' [SimpleIdentifier] [TypeParameterList]? = [FunctionType] ';'
- */
+/// A generic type alias.
+///
+///    functionTypeAlias ::=
+///        metadata 'typedef' [SimpleIdentifier] [TypeParameterList]? =
+///        [FunctionType] ';'
 class GenericTypeAliasImpl extends TypeAliasImpl implements GenericTypeAlias {
-  /**
-   * The type parameters for the function type, or `null` if the function
-   * type does not have any type parameters.
-   */
+  /// The type parameters for the function type, or `null` if the function
+  /// type does not have any type parameters.
   TypeParameterListImpl _typeParameters;
 
   @override
   Token equals;
 
-  /**
-   * The type of function being defined by the alias.
-   */
+  /// The type of function being defined by the alias.
   GenericFunctionTypeImpl _functionType;
 
-  /**
-   * Returns a newly created generic type alias. Either or both of the
-   * [comment] and [metadata] can be `null` if the variable list does not have
-   * the corresponding attribute. The [typeParameters] can be `null` if there
-   * are no type parameters.
-   */
+  /// Returns a newly created generic type alias. Either or both of the
+  /// [comment] and [metadata] can be `null` if the variable list does not have
+  /// the corresponding attribute. The [typeParameters] can be `null` if there
+  /// are no type parameters.
   GenericTypeAliasImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -6313,22 +5559,16 @@
   }
 }
 
-/**
- * A combinator that restricts the names being imported to those that are not in
- * a given list.
- *
- *    hideCombinator ::=
- *        'hide' [SimpleIdentifier] (',' [SimpleIdentifier])*
- */
+/// A combinator that restricts the names being imported to those that are not
+/// in a given list.
+///
+///    hideCombinator ::=
+///        'hide' [SimpleIdentifier] (',' [SimpleIdentifier])*
 class HideCombinatorImpl extends CombinatorImpl implements HideCombinator {
-  /**
-   * The list of names from the library that are hidden by this combinator.
-   */
+  /// The list of names from the library that are hidden by this combinator.
   NodeList<SimpleIdentifier> _hiddenNames;
 
-  /**
-   * Initialize a newly created import show combinator.
-   */
+  /// Initialize a newly created import show combinator.
   HideCombinatorImpl(Token keyword, List<SimpleIdentifier> hiddenNames)
       : super(keyword) {
     _hiddenNames = new NodeListImpl<SimpleIdentifier>(this, hiddenNames);
@@ -6354,21 +5594,17 @@
   }
 }
 
-/**
- * A node that represents an identifier.
- *
- *    identifier ::=
- *        [SimpleIdentifier]
- *      | [PrefixedIdentifier]
- */
+/// A node that represents an identifier.
+///
+///    identifier ::=
+///        [SimpleIdentifier]
+///      | [PrefixedIdentifier]
 abstract class IdentifierImpl extends ExpressionImpl implements Identifier {
-  /**
-   * Return the best element available for this operator. If resolution was able
-   * to find a better element based on type propagation, that element will be
-   * returned. Otherwise, the element found using the result of static analysis
-   * will be returned. If resolution has not been performed, then `null` will be
-   * returned.
-   */
+  /// Return the best element available for this operator. If resolution was
+  /// able to find a better element based on type propagation, that element will
+  /// be returned. Otherwise, the element found using the result of static
+  /// analysis will be returned. If resolution has not been performed, then `null` will
+  /// be returned.
   @override
   @deprecated
   Element get bestElement;
@@ -6380,20 +5616,14 @@
 class IfElementImpl extends CollectionElementImpl
     with IfMixin
     implements IfElement {
-  /**
-   * The element to be executed if the condition is `true`.
-   */
+  /// The element to be executed if the condition is `true`.
   CollectionElementImpl _thenElement;
 
-  /**
-   * The element to be executed if the condition is `false`, or `null` if there
-   * is no such element.
-   */
+  /// The element to be executed if the condition is `false`, or `null` if there
+  /// is no such element.
   CollectionElementImpl _elseElement;
 
-  /**
-   * Initialize a newly created for element.
-   */
+  /// Initialize a newly created for element.
   IfElementImpl(
       Token ifKeyword,
       Token leftParenthesis,
@@ -6415,6 +5645,7 @@
   Iterable<SyntacticEntity> get childEntities => new ChildEntities()
     ..addAll(super.childEntities)
     ..add(_thenElement)
+    ..add(elseKeyword)
     ..add(_elseElement);
 
   @override
@@ -6450,9 +5681,7 @@
 
   Token leftParenthesis;
 
-  /**
-   * The condition used to determine which of the branches is executed next.
-   */
+  /// The condition used to determine which of the branches is executed next.
   ExpressionImpl _condition;
 
   Token rightParenthesis;
@@ -6467,8 +5696,7 @@
     ..add(ifKeyword)
     ..add(leftParenthesis)
     ..add(_condition)
-    ..add(rightParenthesis)
-    ..add(elseKeyword);
+    ..add(rightParenthesis);
 
   Expression get condition => _condition;
 
@@ -6482,68 +5710,36 @@
   }
 }
 
-/**
- * An if statement.
- *
- *    ifStatement ::=
- *        'if' '(' [Expression] ')' [Statement] ('else' [Statement])?
- */
-class IfStatementImpl extends StatementImpl implements IfStatement {
-  /**
-   * The token representing the 'if' keyword.
-   */
-  @override
-  Token ifKeyword;
-
-  /**
-   * The left parenthesis.
-   */
-  @override
-  Token leftParenthesis;
-
-  /**
-   * The condition used to determine which of the statements is executed next.
-   */
-  ExpressionImpl _condition;
-
-  /**
-   * The right parenthesis.
-   */
-  @override
-  Token rightParenthesis;
-
-  /**
-   * The statement that is executed if the condition evaluates to `true`.
-   */
+/// An if statement.
+///
+///    ifStatement ::=
+///        'if' '(' [Expression] ')' [Statement] ('else' [Statement])?
+class IfStatementImpl extends StatementImpl
+    with IfMixin
+    implements IfStatement {
+  /// The statement that is executed if the condition evaluates to `true`.
   StatementImpl _thenStatement;
 
-  /**
-   * The token representing the 'else' keyword, or `null` if there is no else
-   * statement.
-   */
-  @override
-  Token elseKeyword;
-
-  /**
-   * The statement that is executed if the condition evaluates to `false`, or
-   * `null` if there is no else statement.
-   */
+  /// The statement that is executed if the condition evaluates to `false`, or
+  /// `null` if there is no else statement.
   StatementImpl _elseStatement;
 
-  /**
-   * Initialize a newly created if statement. The [elseKeyword] and
-   * [elseStatement] can be `null` if there is no else clause.
-   */
+  /// Initialize a newly created if statement. The [elseKeyword] and
+  /// [elseStatement] can be `null` if there is no else clause.
   IfStatementImpl(
-      this.ifKeyword,
-      this.leftParenthesis,
+      Token ifKeyword,
+      Token leftParenthesis,
       ExpressionImpl condition,
-      this.rightParenthesis,
+      Token rightParenthesis,
       StatementImpl thenStatement,
-      this.elseKeyword,
+      Token elseKeyword,
       StatementImpl elseStatement) {
+    this.ifKeyword = ifKeyword;
+    this.leftParenthesis = leftParenthesis;
     _condition = _becomeParentOf(condition);
+    this.rightParenthesis = rightParenthesis;
     _thenStatement = _becomeParentOf(thenStatement);
+    this.elseKeyword = elseKeyword;
     _elseStatement = _becomeParentOf(elseStatement);
   }
 
@@ -6552,23 +5748,12 @@
 
   @override
   Iterable<SyntacticEntity> get childEntities => new ChildEntities()
-    ..add(ifKeyword)
-    ..add(leftParenthesis)
-    ..add(_condition)
-    ..add(rightParenthesis)
+    ..addAll(super.childEntities)
     ..add(_thenStatement)
     ..add(elseKeyword)
     ..add(_elseStatement);
 
   @override
-  Expression get condition => _condition;
-
-  @override
-  void set condition(Expression expression) {
-    _condition = _becomeParentOf(expression as ExpressionImpl);
-  }
-
-  @override
   Statement get elseStatement => _elseStatement;
 
   @override
@@ -6603,27 +5788,19 @@
   }
 }
 
-/**
- * The "implements" clause in an class declaration.
- *
- *    implementsClause ::=
- *        'implements' [TypeName] (',' [TypeName])*
- */
+/// The "implements" clause in an class declaration.
+///
+///    implementsClause ::=
+///        'implements' [TypeName] (',' [TypeName])*
 class ImplementsClauseImpl extends AstNodeImpl implements ImplementsClause {
-  /**
-   * The token representing the 'implements' keyword.
-   */
+  /// The token representing the 'implements' keyword.
   @override
   Token implementsKeyword;
 
-  /**
-   * The interfaces that are being implemented.
-   */
+  /// The interfaces that are being implemented.
   NodeList<TypeName> _interfaces;
 
-  /**
-   * Initialize a newly created implements clause.
-   */
+  /// Initialize a newly created implements clause.
   ImplementsClauseImpl(this.implementsKeyword, List<TypeName> interfaces) {
     _interfaces = new NodeListImpl<TypeName>(this, interfaces);
   }
@@ -6652,42 +5829,34 @@
   }
 }
 
-/**
- * An import directive.
- *
- *    importDirective ::=
- *        [Annotation] 'import' [StringLiteral] ('as' identifier)? [Combinator]* ';'
- *      | [Annotation] 'import' [StringLiteral] 'deferred' 'as' identifier [Combinator]* ';'
- */
+/// An import directive.
+///
+///    importDirective ::=
+///        [Annotation] 'import' [StringLiteral] ('as' identifier)?
+//         [Combinator]* ';'
+///      | [Annotation] 'import' [StringLiteral] 'deferred' 'as' identifier
+//         [Combinator]* ';'
 class ImportDirectiveImpl extends NamespaceDirectiveImpl
     implements ImportDirective {
-  /**
-   * The token representing the 'deferred' keyword, or `null` if the imported is
-   * not deferred.
-   */
+  /// The token representing the 'deferred' keyword, or `null` if the imported
+  /// is not deferred.
   Token deferredKeyword;
 
-  /**
-   * The token representing the 'as' keyword, or `null` if the imported names are
-   * not prefixed.
-   */
+  /// The token representing the 'as' keyword, or `null` if the imported names
+  /// are not prefixed.
   @override
   Token asKeyword;
 
-  /**
-   * The prefix to be used with the imported names, or `null` if the imported
-   * names are not prefixed.
-   */
+  /// The prefix to be used with the imported names, or `null` if the imported
+  /// names are not prefixed.
   SimpleIdentifierImpl _prefix;
 
-  /**
-   * Initialize a newly created import directive. Either or both of the
-   * [comment] and [metadata] can be `null` if the function does not have the
-   * corresponding attribute. The [deferredKeyword] can be `null` if the import
-   * is not deferred. The [asKeyword] and [prefix] can be `null` if the import
-   * does not specify a prefix. The list of [combinators] can be `null` if there
-   * are no combinators.
-   */
+  /// Initialize a newly created import directive. Either or both of the
+  /// [comment] and [metadata] can be `null` if the function does not have the
+  /// corresponding attribute. The [deferredKeyword] can be `null` if the import
+  /// is not deferred. The [asKeyword] and [prefix] can be `null` if the import
+  /// does not specify a prefix. The list of [combinators] can be `null` if
+  /// there are no combinators.
   ImportDirectiveImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -6744,69 +5913,49 @@
   }
 }
 
-/**
- * An index expression.
- *
- *    indexExpression ::=
- *        [Expression] '[' [Expression] ']'
- */
+/// An index expression.
+///
+///    indexExpression ::=
+///        [Expression] '[' [Expression] ']'
 class IndexExpressionImpl extends ExpressionImpl implements IndexExpression {
-  /**
-   * The expression used to compute the object being indexed, or `null` if this
-   * index expression is part of a cascade expression.
-   */
+  /// The expression used to compute the object being indexed, or `null` if this
+  /// index expression is part of a cascade expression.
   ExpressionImpl _target;
 
-  /**
-   * The period ("..") before a cascaded index expression, or `null` if this
-   * index expression is not part of a cascade expression.
-   */
+  /// The period ("..") before a cascaded index expression, or `null` if this
+  /// index expression is not part of a cascade expression.
   @override
   Token period;
 
-  /**
-   * The left square bracket.
-   */
+  /// The left square bracket.
   @override
   Token leftBracket;
 
-  /**
-   * The expression used to compute the index.
-   */
+  /// The expression used to compute the index.
   ExpressionImpl _index;
 
-  /**
-   * The right square bracket.
-   */
+  /// The right square bracket.
   @override
   Token rightBracket;
 
-  /**
-   * The element associated with the operator based on the static type of the
-   * target, or `null` if the AST structure has not been resolved or if the
-   * operator could not be resolved.
-   */
+  /// The element associated with the operator based on the static type of the
+  /// target, or `null` if the AST structure has not been resolved or if the
+  /// operator could not be resolved.
   @override
   MethodElement staticElement;
 
-  /**
-   * If this expression is both in a getter and setter context, the
-   * [AuxiliaryElements] will be set to hold onto the static element from the
-   * getter context.
-   */
+  /// If this expression is both in a getter and setter context, the
+  /// [AuxiliaryElements] will be set to hold onto the static element from the
+  /// getter context.
   AuxiliaryElements auxiliaryElements = null;
 
-  /**
-   * Initialize a newly created index expression.
-   */
+  /// Initialize a newly created index expression.
   IndexExpressionImpl.forCascade(
       this.period, this.leftBracket, ExpressionImpl index, this.rightBracket) {
     _index = _becomeParentOf(index);
   }
 
-  /**
-   * Initialize a newly created index expression.
-   */
+  /// Initialize a newly created index expression.
   IndexExpressionImpl.forTarget(ExpressionImpl target, this.leftBracket,
       ExpressionImpl index, this.rightBracket) {
     _target = _becomeParentOf(target);
@@ -6850,8 +5999,13 @@
   @override
   bool get isCascaded => period != null;
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.postfix;
 
   @deprecated
   @override
@@ -6884,12 +6038,10 @@
     _target = _becomeParentOf(expression as ExpressionImpl);
   }
 
-  /**
-   * If the AST structure has been resolved, and the function being invoked is
-   * known based on static type information, then return the parameter element
-   * representing the parameter to which the value of the index expression will
-   * be bound. Otherwise, return `null`.
-   */
+  /// If the AST structure has been resolved, and the function being invoked is
+  /// known based on static type information, then return the parameter element
+  /// representing the parameter to which the value of the index expression will
+  /// be bound. Otherwise, return `null`.
   ParameterElement get _staticParameterElementForIndex {
     if (staticElement == null) {
       return null;
@@ -6939,54 +6091,41 @@
   }
 }
 
-/**
- * An instance creation expression.
- *
- *    newExpression ::=
- *        ('new' | 'const')? [TypeName] ('.' [SimpleIdentifier])? [ArgumentList]
- */
+/// An instance creation expression.
+///
+///    newExpression ::=
+///        ('new' | 'const')? [TypeName] ('.' [SimpleIdentifier])?
+///        [ArgumentList]
 class InstanceCreationExpressionImpl extends ExpressionImpl
     implements InstanceCreationExpression {
   // TODO(brianwilkerson) Consider making InstanceCreationExpressionImpl extend
   // InvocationExpressionImpl. This would probably be a breaking change, but is
   // also probably worth it.
 
-  /**
-   * The 'new' or 'const' keyword used to indicate how an object should be
-   * created, or `null` if the keyword is implicit.
-   */
+  /// The 'new' or 'const' keyword used to indicate how an object should be
+  /// created, or `null` if the keyword is implicit.
   @override
   Token keyword;
 
-  /**
-   * The name of the constructor to be invoked.
-   */
+  /// The name of the constructor to be invoked.
   ConstructorNameImpl _constructorName;
 
-  /**
-   * The type arguments associated with the constructor, rather than with the
-   * class in which the constructor is defined. It is always an error if there
-   * are type arguments because Dart doesn't currently support generic
-   * constructors, but we capture them in the AST in order to recover better.
-   */
+  /// The type arguments associated with the constructor, rather than with the
+  /// class in which the constructor is defined. It is always an error if there
+  /// are type arguments because Dart doesn't currently support generic
+  /// constructors, but we capture them in the AST in order to recover better.
   TypeArgumentListImpl _typeArguments;
 
-  /**
-   * The list of arguments to the constructor.
-   */
+  /// The list of arguments to the constructor.
   ArgumentListImpl _argumentList;
 
-  /**
-   * The element associated with the constructor based on static type
-   * information, or `null` if the AST structure has not been resolved or if the
-   * constructor could not be resolved.
-   */
+  /// The element associated with the constructor based on static type
+  /// information, or `null` if the AST structure has not been resolved or if
+  /// the constructor could not be resolved.
   @override
   ConstructorElement staticElement;
 
-  /**
-   * Initialize a newly created instance creation expression.
-   */
+  /// Initialize a newly created instance creation expression.
   InstanceCreationExpressionImpl(this.keyword,
       ConstructorNameImpl constructorName, ArgumentListImpl argumentList,
       {TypeArgumentListImpl typeArguments}) {
@@ -7033,28 +6172,27 @@
     }
   }
 
-  /**
-   * Return `true` if this is an implicit constructor invocations.
-   */
+  /// Return `true` if this is an implicit constructor invocations.
   bool get isImplicit => keyword == null;
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
 
-  /**
-   * Return the type arguments associated with the constructor, rather than with
-   * the class in which the constructor is defined. It is always an error if
-   * there are type arguments because Dart doesn't currently support generic
-   * constructors, but we capture them in the AST in order to recover better.
-   */
+  @override
+  Precedence get precedence2 => Precedence.primary;
+
+  /// Return the type arguments associated with the constructor, rather than
+  /// with the class in which the constructor is defined. It is always an error
+  /// if there are type arguments because Dart doesn't currently support generic
+  /// constructors, but we capture them in the AST in order to recover better.
   TypeArgumentList get typeArguments => _typeArguments;
 
-  /**
-   * Return the type arguments associated with the constructor, rather than with
-   * the class in which the constructor is defined. It is always an error if
-   * there are type arguments because Dart doesn't currently support generic
-   * constructors, but we capture them in the AST in order to recover better.
-   */
+  /// Return the type arguments associated with the constructor, rather than
+  /// with the class in which the constructor is defined. It is always an error
+  /// if there are type arguments because Dart doesn't currently support generic
+  /// constructors, but we capture them in the AST in order to recover better.
   void set typeArguments(TypeArgumentList typeArguments) {
     _typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl);
   }
@@ -7063,23 +6201,21 @@
   E accept<E>(AstVisitor<E> visitor) =>
       visitor.visitInstanceCreationExpression(this);
 
-  /**
-   * Return `true` if it would be valid for this instance creation expression to
-   * have a keyword of `const`. It is valid if
-   *
-   * * the invoked constructor is a `const` constructor,
-   * * all of the arguments are, or could be, constant expressions, and
-   * * the evaluation of the constructor would not produce an exception.
-   *
-   * Note that this method will return `false` if the AST has not been resolved
-   * because without resolution it cannot be determined whether the constructor
-   * is a `const` constructor.
-   *
-   * Also note that this method can cause constant evaluation to occur, which
-   * can be computationally expensive.
-   * 
-   * Deprecated: Use `LinterContext.canBeConst` instead.
-   */
+  /// Return `true` if it would be valid for this instance creation expression
+  /// to have a keyword of `const`. It is valid if
+  ///
+  /// * the invoked constructor is a `const` constructor,
+  /// * all of the arguments are, or could be, constant expressions, and
+  /// * the evaluation of the constructor would not produce an exception.
+  ///
+  /// Note that this method will return `false` if the AST has not been resolved
+  /// because without resolution it cannot be determined whether the constructor
+  /// is a `const` constructor.
+  ///
+  /// Also note that this method can cause constant evaluation to occur, which
+  /// can be computationally expensive.
+  ///
+  /// Deprecated: Use `LinterContext.canBeConst` instead.
   @deprecated
   bool canBeConst() {
     //
@@ -7154,36 +6290,28 @@
   }
 }
 
-/**
- * An integer literal expression.
- *
- *    integerLiteral ::=
- *        decimalIntegerLiteral
- *      | hexadecimalIntegerLiteral
- *
- *    decimalIntegerLiteral ::=
- *        decimalDigit+
- *
- *    hexadecimalIntegerLiteral ::=
- *        '0x' hexadecimalDigit+
- *      | '0X' hexadecimalDigit+
- */
+/// An integer literal expression.
+///
+///    integerLiteral ::=
+///        decimalIntegerLiteral
+///      | hexadecimalIntegerLiteral
+///
+///    decimalIntegerLiteral ::=
+///        decimalDigit+
+///
+///    hexadecimalIntegerLiteral ::=
+///        '0x' hexadecimalDigit+
+///      | '0X' hexadecimalDigit+
 class IntegerLiteralImpl extends LiteralImpl implements IntegerLiteral {
-  /**
-   * The token representing the literal.
-   */
+  /// The token representing the literal.
   @override
   Token literal;
 
-  /**
-   * The value of the literal.
-   */
+  /// The value of the literal.
   @override
   int value = 0;
 
-  /**
-   * Initialize a newly created integer literal.
-   */
+  /// Initialize a newly created integer literal.
   IntegerLiteralImpl(this.literal, this.value);
 
   @override
@@ -7196,14 +6324,12 @@
   @override
   Token get endToken => literal;
 
-  /**
-   * Returns whether this literal's [parent] is a [PrefixExpression] of unary
-   * negation.
-   *
-   * Note: this does *not* indicate that the value itself is negated, just that
-   * the literal is the child of a negation operation. The literal value itself
-   * will always be positive.
-   */
+  /// Returns whether this literal's [parent] is a [PrefixExpression] of unary
+  /// negation.
+  ///
+  /// Note: this does *not* indicate that the value itself is negated, just that
+  /// the literal is the child of a negation operation. The literal value itself
+  /// will always be positive.
   bool get immediatelyNegated {
     AstNode parent = this.parent; // Capture for type propagation.
     return parent is PrefixExpression &&
@@ -7249,11 +6375,9 @@
     return fullPrecision & bottomMask == BigInt.zero;
   }
 
-  /**
-   * Return `true` if the given [lexeme] is a valid lexeme for an integer
-   * literal. The flag [isNegative] should be `true` if the lexeme is preceded
-   * by a unary negation operator.
-   */
+  /// Return `true` if the given [lexeme] is a valid lexeme for an integer
+  /// literal. The flag [isNegative] should be `true` if the lexeme is preceded
+  /// by a unary negation operator.
   static bool isValidAsInteger(String lexeme, bool isNegative) {
     // TODO(jmesserly): this depends on the platform int implementation, and
     // may not be accurate if run on dart4web.
@@ -7266,57 +6390,44 @@
     return int.tryParse(lexeme) != null;
   }
 
-  /**
-   * Suggest the nearest valid double to a user. If the integer they wrote
-   * requires more than a 53 bit mantissa, or more than 10 exponent bits, do
-   * them the favor of suggesting the nearest integer that would work for them.
-   */
+  /// Suggest the nearest valid double to a user. If the integer they wrote
+  /// requires more than a 53 bit mantissa, or more than 10 exponent bits, do
+  /// them the favor of suggesting the nearest integer that would work for them.
   static double nearestValidDouble(String lexeme) =>
       math.min(double.maxFinite, BigInt.parse(lexeme).toDouble());
 }
 
-/**
- * A node within a [StringInterpolation].
- *
- *    interpolationElement ::=
- *        [InterpolationExpression]
- *      | [InterpolationString]
- */
+/// A node within a [StringInterpolation].
+///
+///    interpolationElement ::=
+///        [InterpolationExpression]
+///      | [InterpolationString]
 abstract class InterpolationElementImpl extends AstNodeImpl
     implements InterpolationElement {}
 
-/**
- * An expression embedded in a string interpolation.
- *
- *    interpolationExpression ::=
- *        '$' [SimpleIdentifier]
- *      | '$' '{' [Expression] '}'
- */
+/// An expression embedded in a string interpolation.
+///
+///    interpolationExpression ::=
+///        '$' [SimpleIdentifier]
+///      | '$' '{' [Expression] '}'
 class InterpolationExpressionImpl extends InterpolationElementImpl
     implements InterpolationExpression {
-  /**
-   * The token used to introduce the interpolation expression; either '$' if the
-   * expression is a simple identifier or '${' if the expression is a full
-   * expression.
-   */
+  /// The token used to introduce the interpolation expression; either '$' if
+  /// the expression is a simple identifier or '${' if the expression is a full
+  /// expression.
   @override
   Token leftBracket;
 
-  /**
-   * The expression to be evaluated for the value to be converted into a string.
-   */
+  /// The expression to be evaluated for the value to be converted into a
+  /// string.
   ExpressionImpl _expression;
 
-  /**
-   * The right curly bracket, or `null` if the expression is an identifier
-   * without brackets.
-   */
+  /// The right curly bracket, or `null` if the expression is an identifier
+  /// without brackets.
   @override
   Token rightBracket;
 
-  /**
-   * Initialize a newly created interpolation expression.
-   */
+  /// Initialize a newly created interpolation expression.
   InterpolationExpressionImpl(
       this.leftBracket, ExpressionImpl expression, this.rightBracket) {
     _expression = _becomeParentOf(expression);
@@ -7357,30 +6468,22 @@
   }
 }
 
-/**
- * A non-empty substring of an interpolated string.
- *
- *    interpolationString ::=
- *        characters
- */
+/// A non-empty substring of an interpolated string.
+///
+///    interpolationString ::=
+///        characters
 class InterpolationStringImpl extends InterpolationElementImpl
     implements InterpolationString {
-  /**
-   * The characters that will be added to the string.
-   */
+  /// The characters that will be added to the string.
   @override
   Token contents;
 
-  /**
-   * The value of the literal.
-   */
+  /// The value of the literal.
   @override
   String value;
 
-  /**
-   * Initialize a newly created string of characters that are part of a string
-   * interpolation.
-   */
+  /// Initialize a newly created string of characters that are part of a string
+  /// interpolation.
   InterpolationStringImpl(this.contents, this.value);
 
   @override
@@ -7413,29 +6516,21 @@
   void visitChildren(AstVisitor visitor) {}
 }
 
-/**
- * Common base class for [FunctionExpressionInvocationImpl] and
- * [MethodInvocationImpl].
- */
+/// Common base class for [FunctionExpressionInvocationImpl] and
+/// [MethodInvocationImpl].
 abstract class InvocationExpressionImpl extends ExpressionImpl
     implements InvocationExpression {
-  /**
-   * The list of arguments to the function.
-   */
+  /// The list of arguments to the function.
   ArgumentListImpl _argumentList;
 
-  /**
-   * The type arguments to be applied to the method being invoked, or `null` if
-   * no type arguments were provided.
-   */
+  /// The type arguments to be applied to the method being invoked, or `null` if
+  /// no type arguments were provided.
   TypeArgumentListImpl _typeArguments;
 
   @override
   DartType staticInvokeType;
 
-  /**
-   * Initialize a newly created invocation.
-   */
+  /// Initialize a newly created invocation.
   InvocationExpressionImpl(
       TypeArgumentListImpl typeArguments, ArgumentListImpl argumentList) {
     _typeArguments = _becomeParentOf(typeArguments);
@@ -7465,39 +6560,27 @@
   }
 }
 
-/**
- * An is expression.
- *
- *    isExpression ::=
- *        [Expression] 'is' '!'? [TypeName]
- */
+/// An is expression.
+///
+///    isExpression ::=
+///        [Expression] 'is' '!'? [TypeName]
 class IsExpressionImpl extends ExpressionImpl implements IsExpression {
-  /**
-   * The expression used to compute the value whose type is being tested.
-   */
+  /// The expression used to compute the value whose type is being tested.
   ExpressionImpl _expression;
 
-  /**
-   * The is operator.
-   */
+  /// The is operator.
   @override
   Token isOperator;
 
-  /**
-   * The not operator, or `null` if the sense of the test is not negated.
-   */
+  /// The not operator, or `null` if the sense of the test is not negated.
   @override
   Token notOperator;
 
-  /**
-   * The name of the type being tested for.
-   */
+  /// The name of the type being tested for.
   TypeAnnotationImpl _type;
 
-  /**
-   * Initialize a newly created is expression. The [notOperator] can be `null`
-   * if the sense of the test is not negated.
-   */
+  /// Initialize a newly created is expression. The [notOperator] can be `null`
+  /// if the sense of the test is not negated.
   IsExpressionImpl(ExpressionImpl expression, this.isOperator, this.notOperator,
       TypeAnnotationImpl type) {
     _expression = _becomeParentOf(expression);
@@ -7525,8 +6608,13 @@
     _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 7;
+  int get precedence => RELATIONAL_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.relational;
 
   @override
   TypeAnnotation get type => _type;
@@ -7546,26 +6634,18 @@
   }
 }
 
-/**
- * A statement that has a label associated with them.
- *
- *    labeledStatement ::=
- *       [Label]+ [Statement]
- */
+/// A statement that has a label associated with them.
+///
+///    labeledStatement ::=
+///       [Label]+ [Statement]
 class LabeledStatementImpl extends StatementImpl implements LabeledStatement {
-  /**
-   * The labels being associated with the statement.
-   */
+  /// The labels being associated with the statement.
   NodeList<Label> _labels;
 
-  /**
-   * The statement with which the labels are being associated.
-   */
+  /// The statement with which the labels are being associated.
   StatementImpl _statement;
 
-  /**
-   * Initialize a newly created labeled statement.
-   */
+  /// Initialize a newly created labeled statement.
   LabeledStatementImpl(List<Label> labels, StatementImpl statement) {
     _labels = new NodeListImpl<Label>(this, labels);
     _statement = _becomeParentOf(statement);
@@ -7611,27 +6691,19 @@
   }
 }
 
-/**
- * A label on either a [LabeledStatement] or a [NamedExpression].
- *
- *    label ::=
- *        [SimpleIdentifier] ':'
- */
+/// A label on either a [LabeledStatement] or a [NamedExpression].
+///
+///    label ::=
+///        [SimpleIdentifier] ':'
 class LabelImpl extends AstNodeImpl implements Label {
-  /**
-   * The label being associated with the statement.
-   */
+  /// The label being associated with the statement.
   SimpleIdentifierImpl _label;
 
-  /**
-   * The colon that separates the label from the statement.
-   */
+  /// The colon that separates the label from the statement.
   @override
   Token colon;
 
-  /**
-   * Initialize a newly created label.
-   */
+  /// Initialize a newly created label.
   LabelImpl(SimpleIdentifierImpl label, this.colon) {
     _label = _becomeParentOf(label);
   }
@@ -7663,35 +6735,25 @@
   }
 }
 
-/**
- * A library directive.
- *
- *    libraryDirective ::=
- *        [Annotation] 'library' [Identifier] ';'
- */
+/// A library directive.
+///
+///    libraryDirective ::=
+///        [Annotation] 'library' [Identifier] ';'
 class LibraryDirectiveImpl extends DirectiveImpl implements LibraryDirective {
-  /**
-   * The token representing the 'library' keyword.
-   */
+  /// The token representing the 'library' keyword.
   @override
   Token libraryKeyword;
 
-  /**
-   * The name of the library being defined.
-   */
+  /// The name of the library being defined.
   LibraryIdentifierImpl _name;
 
-  /**
-   * The semicolon terminating the directive.
-   */
+  /// The semicolon terminating the directive.
   @override
   Token semicolon;
 
-  /**
-   * Initialize a newly created library directive. Either or both of the
-   * [comment] and [metadata] can be `null` if the directive does not have the
-   * corresponding attribute.
-   */
+  /// Initialize a newly created library directive. Either or both of the
+  /// [comment] and [metadata] can be `null` if the directive does not have the
+  /// corresponding attribute.
   LibraryDirectiveImpl(CommentImpl comment, List<Annotation> metadata,
       this.libraryKeyword, LibraryIdentifierImpl name, this.semicolon)
       : super(comment, metadata) {
@@ -7729,22 +6791,16 @@
   }
 }
 
-/**
- * The identifier for a library.
- *
- *    libraryIdentifier ::=
- *        [SimpleIdentifier] ('.' [SimpleIdentifier])*
- */
+/// The identifier for a library.
+///
+///    libraryIdentifier ::=
+///        [SimpleIdentifier] ('.' [SimpleIdentifier])*
 class LibraryIdentifierImpl extends IdentifierImpl
     implements LibraryIdentifier {
-  /**
-   * The components of the identifier.
-   */
+  /// The components of the identifier.
   NodeList<SimpleIdentifier> _components;
 
-  /**
-   * Initialize a newly created prefixed identifier.
-   */
+  /// Initialize a newly created prefixed identifier.
   LibraryIdentifierImpl(List<SimpleIdentifier> components) {
     _components = new NodeListImpl<SimpleIdentifier>(this, components);
   }
@@ -7784,8 +6840,13 @@
     return buffer.toString();
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.postfix;
 
   @deprecated
   @override
@@ -7803,35 +6864,31 @@
   }
 }
 
-/**
- * A list literal.
- *
- *    listLiteral ::=
- *        'const'? ('<' [TypeAnnotation] '>')?
- *        '[' ([CollectionLiteralElement] ','?)? ']'
- *
- * This is the class that is used to represent a list literal when either the
- * 'control-flow-collections' or 'spread-collections' experiments are enabled.
- * If neither of those experiments are enabled, then [ListLiteral] will be used.
- */
+/// A list literal.
+///
+///    listLiteral ::=
+///        'const'? ('<' [TypeAnnotation] '>')?
+///        '[' ([CollectionLiteralElement] ','?)? ']'
+///
+/// This is the class that is used to represent a list literal when either the
+/// 'control-flow-collections' or 'spread-collections' experiments are enabled.
+/// If neither of those experiments are enabled, then [ListLiteral] will be
+/// used.
+@Deprecated('Replaced by ListLiteralImpl')
 class ListLiteral2Impl extends TypedLiteralImpl implements ListLiteral2 {
   @override
   Token leftBracket;
 
-  /**
-   * The elements used to compute the elements of the list.
-   */
+  /// The elements used to compute the elements of the list.
   NodeList<CollectionElement> _elements;
 
   @override
   Token rightBracket;
 
-  /**
-   * Initialize a newly created list literal. The [constKeyword] can be `null`
-   * if the literal is not a constant. The [typeArguments] can be `null` if no
-   * type arguments were declared. The list of [elements] can be `null` if the
-   * list is empty.
-   */
+  /// Initialize a newly created list literal. The [constKeyword] can be `null`
+  /// if the literal is not a constant. The [typeArguments] can be `null` if no
+  /// type arguments were declared. The list of [elements] can be `null` if the
+  /// list is empty.
   ListLiteral2Impl(Token constKeyword, TypeArgumentListImpl typeArguments,
       this.leftBracket, List<CollectionElement> elements, this.rightBracket)
       : super(constKeyword, typeArguments) {
@@ -7873,46 +6930,43 @@
   }
 }
 
-/**
- * A list literal.
- *
- *    listLiteral ::=
- *        'const'? ('<' [TypeName] '>')? '[' ([Expression] ','?)? ']'
- *
- * This is the class that is used to represent a list literal when neither the
- * 'control-flow-collections' nor 'spread-collections' experiments are enabled.
- * If either of those experiments are enabled, then [ListLiteral2] will be used.
- */
 class ListLiteralImpl extends TypedLiteralImpl implements ListLiteral {
-  /**
-   * The left square bracket.
-   */
+  /// The left square bracket.
   @override
   Token leftBracket;
 
-  /**
-   * The expressions used to compute the elements of the list.
-   */
-  NodeList<Expression> _elements;
+  /// The expressions used to compute the elements of the list.
+  NodeList<CollectionElement> _elements;
 
-  /**
-   * The right square bracket.
-   */
+  /// The right square bracket.
   @override
   Token rightBracket;
 
-  /**
-   * Initialize a newly created list literal. The [constKeyword] can be `null`
-   * if the literal is not a constant. The [typeArguments] can be `null` if no
-   * type arguments were declared. The list of [elements] can be `null` if the
-   * list is empty.
-   */
+  /// Initialize a newly created list literal. The [constKeyword] can be `null`
+  /// if the literal is not a constant. The [typeArguments] can be `null` if no
+  /// type arguments were declared. The list of [elements] can be `null` if the
+  /// list is empty.
   ListLiteralImpl(Token constKeyword, TypeArgumentListImpl typeArguments,
       this.leftBracket, List<Expression> elements, this.rightBracket)
       : super(constKeyword, typeArguments) {
     _elements = new NodeListImpl<Expression>(this, elements);
   }
 
+  /// Initialize a newly created list literal.
+  ///
+  /// The [constKeyword] can be `null` if the literal is not a constant. The
+  /// [typeArguments] can be `null` if no type arguments were declared. The list
+  /// of [elements] can be `null` if the list is empty.
+  ListLiteralImpl.experimental(
+      Token constKeyword,
+      TypeArgumentListImpl typeArguments,
+      this.leftBracket,
+      List<CollectionElement> elements,
+      this.rightBracket)
+      : super(constKeyword, typeArguments) {
+    _elements = new NodeListImpl<CollectionElement>(this, elements);
+  }
+
   @override
   Token get beginToken {
     if (constKeyword != null) {
@@ -7936,6 +6990,9 @@
   NodeList<Expression> get elements => _elements;
 
   @override
+  NodeList<CollectionElement> get elements2 => _elements;
+
+  @override
   Token get endToken => rightBracket;
 
   @override
@@ -7948,139 +7005,84 @@
   }
 }
 
-/**
- * A node that represents a literal expression.
- *
- *    literal ::=
- *        [BooleanLiteral]
- *      | [DoubleLiteral]
- *      | [IntegerLiteral]
- *      | [ListLiteral]
- *      | [MapLiteral]
- *      | [NullLiteral]
- *      | [StringLiteral]
- */
+/// A node that represents a literal expression.
+///
+///    literal ::=
+///        [BooleanLiteral]
+///      | [DoubleLiteral]
+///      | [IntegerLiteral]
+///      | [ListLiteral]
+///      | [MapLiteral]
+///      | [NullLiteral]
+///      | [StringLiteral]
 abstract class LiteralImpl extends ExpressionImpl implements Literal {
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.primary;
 }
 
-/**
- * Additional information about local variables within a function or method
- * produced at resolution time.
- */
+/// Additional information about local variables within a function or method
+/// produced at resolution time.
 class LocalVariableInfo {
-  /**
-   * The set of local variables and parameters that are potentially mutated
-   * within a local function other than the function in which they are declared.
-   */
+  /// The set of local variables and parameters that are potentially mutated
+  /// within a local function other than the function in which they are
+  /// declared.
   final Set<VariableElement> potentiallyMutatedInClosure =
       new Set<VariableElement>();
 
-  /**
-   * The set of local variables and parameters that are potentially mutated
-   * within the scope of their declarations.
-   */
+  /// The set of local variables and parameters that are potentially mutated
+  /// within the scope of their declarations.
   final Set<VariableElement> potentiallyMutatedInScope =
       new Set<VariableElement>();
 }
 
-/**
- * A literal map.
- *
- *    mapLiteral ::=
- *        'const'? ('<' [TypeAnnotation] (',' [TypeAnnotation])* '>')?
- *        '{' ([MapElement] (',' [MapElement])* ','?)? '}'
- *
- * This is the class that is used to represent a map literal when either the
- * 'control-flow-collections' or 'spread-collections' experiments are enabled.
- * If neither of those experiments are enabled, then [MapLiteral] will be used.
- */
-class MapLiteral2Impl extends TypedLiteralImpl implements MapLiteral2 {
-  @override
-  Token leftBracket;
-
-  /**
-   * The entries in the map.
-   */
-  NodeList<CollectionElement> _entries;
-
-  @override
-  Token rightBracket;
-
-  /**
-   * Initialize a newly created map literal. The [constKeyword] can be `null` if
-   * the literal is not a constant. The [typeArguments] can be `null` if no type
-   * arguments were declared. The [entries] can be `null` if the map is empty.
-   */
+/// A literal map.
+///
+///    mapLiteral ::=
+///        'const'? ('<' [TypeAnnotation] (',' [TypeAnnotation])* '>')?
+///        '{' ([MapElement] (',' [MapElement])* ','?)? '}'
+///
+/// This is the class that is used to represent a map literal when either the
+/// 'control-flow-collections' or 'spread-collections' experiments are enabled.
+/// If neither of those experiments are enabled, then [MapLiteral] will be used.
+@Deprecated('Replaced by SetOrMapLiteralImpl')
+class MapLiteral2Impl extends SetOrMapLiteralImpl implements MapLiteral2 {
+  /// Initialize a newly created map literal. The [constKeyword] can be `null`
+  /// if the literal is not a constant. The [typeArguments] can be `null` if no
+  /// type arguments were declared. The [entries] can be `null` if the map is
+  /// empty.
   MapLiteral2Impl(Token constKeyword, TypeArgumentListImpl typeArguments,
-      this.leftBracket, List<CollectionElement> entries, this.rightBracket)
-      : super(constKeyword, typeArguments) {
-    _entries = new NodeListImpl<CollectionElement>(this, entries);
-  }
+      Token leftBracket, List<CollectionElement> entries, Token rightBracket)
+      : super(constKeyword, typeArguments, leftBracket, entries, rightBracket);
 
   @override
-  Token get beginToken {
-    if (constKeyword != null) {
-      return constKeyword;
-    }
-    TypeArgumentList typeArguments = this.typeArguments;
-    if (typeArguments != null) {
-      return typeArguments.beginToken;
-    }
-    return leftBracket;
-  }
-
-  @override
-  // TODO(paulberry): add commas.
-  Iterable<SyntacticEntity> get childEntities => super._childEntities
-    ..add(leftBracket)
-    ..addAll(entries)
-    ..add(rightBracket);
-
-  @override
-  Token get endToken => rightBracket;
-
-  @override
-  NodeList<CollectionElement> get entries => _entries;
+  NodeList<CollectionElement> get entries => _elements;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitMapLiteral2(this);
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    super.visitChildren(visitor);
-    _entries.accept(visitor);
-  }
 }
 
-/**
- * A single key/value pair in a map literal.
- *
- *    mapLiteralEntry ::=
- *        [Expression] ':' [Expression]
- */
+/// A single key/value pair in a map literal.
+///
+///    mapLiteralEntry ::=
+///        [Expression] ':' [Expression]
 class MapLiteralEntryImpl extends CollectionElementImpl
     implements MapLiteralEntry {
-  /**
-   * The expression computing the key with which the value will be associated.
-   */
+  /// The expression computing the key with which the value will be associated.
   ExpressionImpl _key;
 
-  /**
-   * The colon that separates the key from the value.
-   */
+  /// The colon that separates the key from the value.
   @override
   Token separator;
 
-  /**
-   * The expression computing the value that will be associated with the key.
-   */
+  /// The expression computing the value that will be associated with the key.
   ExpressionImpl _value;
 
-  /**
-   * Initialize a newly created map literal entry.
-   */
+  /// Initialize a newly created map literal entry.
   MapLiteralEntryImpl(
       ExpressionImpl key, this.separator, ExpressionImpl value) {
     _key = _becomeParentOf(key);
@@ -8123,159 +7125,84 @@
   }
 }
 
-/**
- * A literal map.
- *
- *    mapLiteral ::=
- *        'const'? ('<' [TypeName] (',' [TypeName])* '>')?
- *        '{' ([MapLiteralEntry] (',' [MapLiteralEntry])* ','?)? '}'
- */
-class MapLiteralImpl extends TypedLiteralImpl implements MapLiteral {
-  /**
-   * The left curly bracket.
-   */
-  @override
-  Token leftBracket;
-
-  /**
-   * The entries in the map.
-   */
-  NodeList<MapLiteralEntry> _entries;
-
-  /**
-   * The right curly bracket.
-   */
-  @override
-  Token rightBracket;
-
-  /**
-   * Initialize a newly created map literal. The [constKeyword] can be `null` if
-   * the literal is not a constant. The [typeArguments] can be `null` if no type
-   * arguments were declared. The [entries] can be `null` if the map is empty.
-   */
+@Deprecated('Use SetOrMapLiteral')
+class MapLiteralImpl extends SetOrMapLiteralImpl implements MapLiteral {
+  /// Initialize a newly created map literal. The [constKeyword] can be `null`
+  /// if the literal is not a constant. The [typeArguments] can be `null` if no
+  /// type arguments were declared. The [entries] can be `null` if the map is
+  /// empty.
   MapLiteralImpl(Token constKeyword, TypeArgumentListImpl typeArguments,
-      this.leftBracket, List<MapLiteralEntry> entries, this.rightBracket)
-      : super(constKeyword, typeArguments) {
-    _entries = new NodeListImpl<MapLiteralEntry>(this, entries);
-  }
+      Token leftBracket, List<MapLiteralEntry> entries, Token rightBracket)
+      : super._map(
+            constKeyword, typeArguments, leftBracket, entries, rightBracket);
 
   @override
-  Token get beginToken {
-    if (constKeyword != null) {
-      return constKeyword;
-    }
-    TypeArgumentList typeArguments = this.typeArguments;
-    if (typeArguments != null) {
-      return typeArguments.beginToken;
-    }
-    return leftBracket;
-  }
-
-  @override
-  // TODO(paulberry): add commas.
-  Iterable<SyntacticEntity> get childEntities => super._childEntities
-    ..add(leftBracket)
-    ..addAll(entries)
-    ..add(rightBracket);
-
-  @override
-  Token get endToken => rightBracket;
-
-  @override
-  NodeList<MapLiteralEntry> get entries => _entries;
+  NodeList<MapLiteralEntry> get entries => _elements;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitMapLiteral(this);
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    super.visitChildren(visitor);
-    _entries.accept(visitor);
-  }
 }
 
-/**
- * A method declaration.
- *
- *    methodDeclaration ::=
- *        methodSignature [FunctionBody]
- *
- *    methodSignature ::=
- *        'external'? ('abstract' | 'static')? [Type]? ('get' | 'set')?
- *        methodName [TypeParameterList] [FormalParameterList]
- *
- *    methodName ::=
- *        [SimpleIdentifier]
- *      | 'operator' [SimpleIdentifier]
- */
+/// A method declaration.
+///
+///    methodDeclaration ::=
+///        methodSignature [FunctionBody]
+///
+///    methodSignature ::=
+///        'external'? ('abstract' | 'static')? [Type]? ('get' | 'set')?
+///        methodName [TypeParameterList] [FormalParameterList]
+///
+///    methodName ::=
+///        [SimpleIdentifier]
+///      | 'operator' [SimpleIdentifier]
 class MethodDeclarationImpl extends ClassMemberImpl
     implements MethodDeclaration {
-  /**
-   * The token for the 'external' keyword, or `null` if the constructor is not
-   * external.
-   */
+  /// The token for the 'external' keyword, or `null` if the constructor is not
+  /// external.
   @override
   Token externalKeyword;
 
-  /**
-   * The token representing the 'abstract' or 'static' keyword, or `null` if
-   * neither modifier was specified.
-   */
+  /// The token representing the 'abstract' or 'static' keyword, or `null` if
+  /// neither modifier was specified.
   @override
   Token modifierKeyword;
 
-  /**
-   * The return type of the method, or `null` if no return type was declared.
-   */
+  /// The return type of the method, or `null` if no return type was declared.
   TypeAnnotationImpl _returnType;
 
-  /**
-   * The token representing the 'get' or 'set' keyword, or `null` if this is a
-   * method declaration rather than a property declaration.
-   */
+  /// The token representing the 'get' or 'set' keyword, or `null` if this is a
+  /// method declaration rather than a property declaration.
   @override
   Token propertyKeyword;
 
-  /**
-   * The token representing the 'operator' keyword, or `null` if this method
-   * does not declare an operator.
-   */
+  /// The token representing the 'operator' keyword, or `null` if this method
+  /// does not declare an operator.
   @override
   Token operatorKeyword;
 
-  /**
-   * The name of the method.
-   */
+  /// The name of the method.
   SimpleIdentifierImpl _name;
 
-  /**
-   * The type parameters associated with the method, or `null` if the method is
-   * not a generic method.
-   */
+  /// The type parameters associated with the method, or `null` if the method is
+  /// not a generic method.
   TypeParameterListImpl _typeParameters;
 
-  /**
-   * The parameters associated with the method, or `null` if this method
-   * declares a getter.
-   */
+  /// The parameters associated with the method, or `null` if this method
+  /// declares a getter.
   FormalParameterListImpl _parameters;
 
-  /**
-   * The body of the method.
-   */
+  /// The body of the method.
   FunctionBodyImpl _body;
 
-  /**
-   * Initialize a newly created method declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the declaration does not have the
-   * corresponding attribute. The [externalKeyword] can be `null` if the method
-   * is not external. The [modifierKeyword] can be `null` if the method is
-   * neither abstract nor static. The [returnType] can be `null` if no return
-   * type was specified. The [propertyKeyword] can be `null` if the method is
-   * neither a getter or a setter. The [operatorKeyword] can be `null` if the
-   * method does not implement an operator. The [parameters] must be `null` if
-   * this method declares a getter.
-   */
+  /// Initialize a newly created method declaration. Either or both of the
+  /// [comment] and [metadata] can be `null` if the declaration does not have
+  /// the corresponding attribute. The [externalKeyword] can be `null` if the
+  /// method is not external. The [modifierKeyword] can be `null` if the method
+  /// is neither abstract nor static. The [returnType] can be `null` if no
+  /// return type was specified. The [propertyKeyword] can be `null` if the
+  /// method is neither a getter or a setter. The [operatorKeyword] can be
+  /// `null` if the method does not implement an operator. The [parameters] must
+  /// be `null` if this method declares a getter.
   MethodDeclarationImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -8315,13 +7242,11 @@
     ..add(_parameters)
     ..add(_body);
 
-  /**
-   * Return the element associated with this method, or `null` if the AST
-   * structure has not been resolved. The element can either be a
-   * [MethodElement], if this represents the declaration of a normal method, or
-   * a [PropertyAccessorElement] if this represents the declaration of either a
-   * getter or a setter.
-   */
+  /// Return the element associated with this method, or `null` if the AST
+  /// structure has not been resolved. The element can either be a
+  /// [MethodElement], if this represents the declaration of a normal method, or
+  /// a [PropertyAccessorElement] if this represents the declaration of either a
+  /// getter or a setter.
   @override
   ExecutableElement get declaredElement =>
       _name?.staticElement as ExecutableElement;
@@ -8414,47 +7339,36 @@
   }
 }
 
-/**
- * The invocation of either a function or a method. Invocations of functions
- * resulting from evaluating an expression are represented by
- * [FunctionExpressionInvocation] nodes. Invocations of getters and setters are
- * represented by either [PrefixedIdentifier] or [PropertyAccess] nodes.
- *
- *    methodInvocation ::=
- *        ([Expression] '.')? [SimpleIdentifier] [TypeArgumentList]? [ArgumentList]
- */
+/// The invocation of either a function or a method. Invocations of functions
+/// resulting from evaluating an expression are represented by
+/// [FunctionExpressionInvocation] nodes. Invocations of getters and setters are
+/// represented by either [PrefixedIdentifier] or [PropertyAccess] nodes.
+///
+///    methodInvocation ::=
+///        ([Expression] '.')? [SimpleIdentifier] [TypeArgumentList]?
+///        [ArgumentList]
 class MethodInvocationImpl extends InvocationExpressionImpl
     implements MethodInvocation {
-  /**
-   * The expression producing the object on which the method is defined, or
-   * `null` if there is no target (that is, the target is implicitly `this`).
-   */
+  /// The expression producing the object on which the method is defined, or
+  /// `null` if there is no target (that is, the target is implicitly `this`).
   ExpressionImpl _target;
 
-  /**
-   * The operator that separates the target from the method name, or `null`
-   * if there is no target. In an ordinary method invocation this will be a
-   * period ('.'). In a cascade section this will be the cascade operator
-   * ('..').
-   */
+  /// The operator that separates the target from the method name, or `null`
+  /// if there is no target. In an ordinary method invocation this will be a
+  /// period ('.'). In a cascade section this will be the cascade operator
+  /// ('..').
   @override
   Token operator;
 
-  /**
-   * The name of the method being invoked.
-   */
+  /// The name of the method being invoked.
   SimpleIdentifierImpl _methodName;
 
-  /**
-   * The invoke type of the [methodName] if the target element is a getter,
-   * or `null` otherwise.
-   */
+  /// The invoke type of the [methodName] if the target element is a getter,
+  /// or `null` otherwise.
   DartType _methodNameType;
 
-  /**
-   * Initialize a newly created method invocation. The [target] and [operator]
-   * can be `null` if there is no target.
-   */
+  /// Initialize a newly created method invocation. The [target] and [operator]
+  /// can be `null` if there is no target.
   MethodInvocationImpl(
       ExpressionImpl target,
       this.operator,
@@ -8501,28 +7415,29 @@
     _methodName = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
-  /**
-   * The invoke type of the [methodName].
-   *
-   * If the target element is a [MethodElement], this is the same as the
-   * [staticInvokeType]. If the target element is a getter, presumably
-   * returning an [ExecutableElement] so that it can be invoked in this
-   * [MethodInvocation], then this type is the type of the getter, and the
-   * [staticInvokeType] is the invoked type of the returned element.
-   */
+  /// The invoke type of the [methodName].
+  ///
+  /// If the target element is a [MethodElement], this is the same as the
+  /// [staticInvokeType]. If the target element is a getter, presumably
+  /// returning an [ExecutableElement] so that it can be invoked in this
+  /// [MethodInvocation], then this type is the type of the getter, and the
+  /// [staticInvokeType] is the invoked type of the returned element.
   DartType get methodNameType => _methodNameType ?? staticInvokeType;
 
-  /**
-   * Set the [methodName] invoke type, only if the target element is a getter.
-   * Otherwise, the target element itself is invoked, [_methodNameType] is
-   * `null`, and the getter will return [staticInvokeType].
-   */
+  /// Set the [methodName] invoke type, only if the target element is a getter.
+  /// Otherwise, the target element itself is invoked, [_methodNameType] is
+  /// `null`, and the getter will return [staticInvokeType].
   set methodNameType(DartType methodNameType) {
     _methodNameType = methodNameType;
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.postfix;
 
   @override
   Expression get realTarget {
@@ -8559,33 +7474,27 @@
   }
 }
 
-/**
- * The declaration of a mixin.
- *
- *    mixinDeclaration ::=
- *        metadata? 'mixin' [SimpleIdentifier] [TypeParameterList]?
- *        [RequiresClause]? [ImplementsClause]? '{' [ClassMember]* '}'
- */
+/// The declaration of a mixin.
+///
+///    mixinDeclaration ::=
+///        metadata? 'mixin' [SimpleIdentifier] [TypeParameterList]?
+///        [RequiresClause]? [ImplementsClause]? '{' [ClassMember]* '}'
 class MixinDeclarationImpl extends ClassOrMixinDeclarationImpl
     implements MixinDeclaration {
   @override
   Token mixinKeyword;
 
-  /**
-   * The on clause for the mixin, or `null` if the mixin does not have any
-   * super-class constraints.
-   */
+  /// The on clause for the mixin, or `null` if the mixin does not have any
+  /// super-class constraints.
   OnClauseImpl _onClause;
 
-  /**
-   * Initialize a newly created mixin declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the mixin does not have the
-   * corresponding attribute. The [typeParameters] can be `null` if the mixin does not
-   * have any type parameters. Either or both of the [onClause],
-   * and [implementsClause] can be `null` if the mixin does not have the
-   * corresponding clause. The list of [members] can be `null` if the mixin does
-   * not have any members.
-   */
+  /// Initialize a newly created mixin declaration. Either or both of the
+  /// [comment] and [metadata] can be `null` if the mixin does not have the
+  /// corresponding attribute. The [typeParameters] can be `null` if the mixin
+  /// does not have any type parameters. Either or both of the [onClause],
+  /// and [implementsClause] can be `null` if the mixin does not have the
+  /// corresponding clause. The list of [members] can be `null` if the mixin
+  /// does not have any members.
   MixinDeclarationImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -8664,21 +7573,15 @@
   }
 }
 
-/**
- * A node that declares a single name within the scope of a compilation unit.
- */
+/// A node that declares a single name within the scope of a compilation unit.
 abstract class NamedCompilationUnitMemberImpl extends CompilationUnitMemberImpl
     implements NamedCompilationUnitMember {
-  /**
-   * The name of the member being declared.
-   */
+  /// The name of the member being declared.
   SimpleIdentifierImpl _name;
 
-  /**
-   * Initialize a newly created compilation unit member with the given [name].
-   * Either or both of the [comment] and [metadata] can be `null` if the member
-   * does not have the corresponding attribute.
-   */
+  /// Initialize a newly created compilation unit member with the given [name].
+  /// Either or both of the [comment] and [metadata] can be `null` if the member
+  /// does not have the corresponding attribute.
   NamedCompilationUnitMemberImpl(
       CommentImpl comment, List<Annotation> metadata, SimpleIdentifierImpl name)
       : super(comment, metadata) {
@@ -8694,27 +7597,19 @@
   }
 }
 
-/**
- * An expression that has a name associated with it. They are used in method
- * invocations when there are named parameters.
- *
- *    namedExpression ::=
- *        [Label] [Expression]
- */
+/// An expression that has a name associated with it. They are used in method
+/// invocations when there are named parameters.
+///
+///    namedExpression ::=
+///        [Label] [Expression]
 class NamedExpressionImpl extends ExpressionImpl implements NamedExpression {
-  /**
-   * The name associated with the expression.
-   */
+  /// The name associated with the expression.
   LabelImpl _name;
 
-  /**
-   * The expression with which the name is associated.
-   */
+  /// The expression with which the name is associated.
   ExpressionImpl _expression;
 
-  /**
-   * Initialize a newly created named expression..
-   */
+  /// Initialize a newly created named expression..
   NamedExpressionImpl(LabelImpl name, ExpressionImpl expression) {
     _name = _becomeParentOf(name);
     _expression = _becomeParentOf(expression);
@@ -8755,8 +7650,13 @@
     _name = _becomeParentOf(identifier as LabelImpl);
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 0;
+  int get precedence => NO_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.none;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitNamedExpression(this);
@@ -8768,35 +7668,25 @@
   }
 }
 
-/**
- * A node that represents a directive that impacts the namespace of a library.
- *
- *    directive ::=
- *        [ExportDirective]
- *      | [ImportDirective]
- */
+/// A node that represents a directive that impacts the namespace of a library.
+///
+///    directive ::=
+///        [ExportDirective]
+///      | [ImportDirective]
 abstract class NamespaceDirectiveImpl extends UriBasedDirectiveImpl
     implements NamespaceDirective {
-  /**
-   * The token representing the 'import' or 'export' keyword.
-   */
+  /// The token representing the 'import' or 'export' keyword.
   @override
   Token keyword;
 
-  /**
-   * The configurations used to control which library will actually be loaded at
-   * run-time.
-   */
+  /// The configurations used to control which library will actually be loaded
+  /// at run-time.
   NodeList<Configuration> _configurations;
 
-  /**
-   * The combinators used to control which names are imported or exported.
-   */
+  /// The combinators used to control which names are imported or exported.
   NodeList<Combinator> _combinators;
 
-  /**
-   * The semicolon terminating the directive.
-   */
+  /// The semicolon terminating the directive.
   @override
   Token semicolon;
 
@@ -8806,12 +7696,10 @@
   @override
   Source selectedSource;
 
-  /**
-   * Initialize a newly created namespace directive. Either or both of the
-   * [comment] and [metadata] can be `null` if the directive does not have the
-   * corresponding attribute. The list of [combinators] can be `null` if there
-   * are no combinators.
-   */
+  /// Initialize a newly created namespace directive. Either or both of the
+  /// [comment] and [metadata] can be `null` if the directive does not have the
+  /// corresponding attribute. The list of [combinators] can be `null` if there
+  /// are no combinators.
   NamespaceDirectiveImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -8851,27 +7739,19 @@
   LibraryElement get uriElement;
 }
 
-/**
- * The "native" clause in an class declaration.
- *
- *    nativeClause ::=
- *        'native' [StringLiteral]
- */
+/// The "native" clause in an class declaration.
+///
+///    nativeClause ::=
+///        'native' [StringLiteral]
 class NativeClauseImpl extends AstNodeImpl implements NativeClause {
-  /**
-   * The token representing the 'native' keyword.
-   */
+  /// The token representing the 'native' keyword.
   @override
   Token nativeKeyword;
 
-  /**
-   * The name of the native object that implements the class.
-   */
+  /// The name of the native object that implements the class.
   StringLiteralImpl _name;
 
-  /**
-   * Initialize a newly created native clause.
-   */
+  /// Initialize a newly created native clause.
   NativeClauseImpl(this.nativeKeyword, StringLiteralImpl name) {
     _name = _becomeParentOf(name);
   }
@@ -8903,37 +7783,27 @@
   }
 }
 
-/**
- * A function body that consists of a native keyword followed by a string
- * literal.
- *
- *    nativeFunctionBody ::=
- *        'native' [SimpleStringLiteral] ';'
- */
+/// A function body that consists of a native keyword followed by a string
+/// literal.
+///
+///    nativeFunctionBody ::=
+///        'native' [SimpleStringLiteral] ';'
 class NativeFunctionBodyImpl extends FunctionBodyImpl
     implements NativeFunctionBody {
-  /**
-   * The token representing 'native' that marks the start of the function body.
-   */
+  /// The token representing 'native' that marks the start of the function body.
   @override
   Token nativeKeyword;
 
-  /**
-   * The string literal, after the 'native' token.
-   */
+  /// The string literal, after the 'native' token.
   StringLiteralImpl _stringLiteral;
 
-  /**
-   * The token representing the semicolon that marks the end of the function
-   * body.
-   */
+  /// The token representing the semicolon that marks the end of the function
+  /// body.
   @override
   Token semicolon;
 
-  /**
-   * Initialize a newly created function body consisting of the 'native' token,
-   * a string literal, and a semicolon.
-   */
+  /// Initialize a newly created function body consisting of the 'native' token,
+  /// a string literal, and a semicolon.
   NativeFunctionBodyImpl(
       this.nativeKeyword, StringLiteralImpl stringLiteral, this.semicolon) {
     _stringLiteral = _becomeParentOf(stringLiteral);
@@ -8968,25 +7838,17 @@
   }
 }
 
-/**
- * A list of AST nodes that have a common parent.
- */
+/// A list of AST nodes that have a common parent.
 class NodeListImpl<E extends AstNode> with ListMixin<E> implements NodeList<E> {
-  /**
-   * The node that is the parent of each of the elements in the list.
-   */
+  /// The node that is the parent of each of the elements in the list.
   AstNodeImpl _owner;
 
-  /**
-   * The elements contained in the list.
-   */
+  /// The elements contained in the list.
   List<E> _elements = <E>[];
 
-  /**
-   * Initialize a newly created list of nodes such that all of the nodes that
-   * are added to the list will have their parent set to the given [owner]. The
-   * list will initially be populated with the given [elements].
-   */
+  /// Initialize a newly created list of nodes such that all of the nodes that
+  /// are added to the list will have their parent set to the given [owner]. The
+  /// list will initially be populated with the given [elements].
   NodeListImpl(this._owner, [List<E> elements]) {
     addAll(elements);
   }
@@ -9116,42 +7978,30 @@
   }
 }
 
-/**
- * A formal parameter that is required (is not optional).
- *
- *    normalFormalParameter ::=
- *        [FunctionTypedFormalParameter]
- *      | [FieldFormalParameter]
- *      | [SimpleFormalParameter]
- */
+/// A formal parameter that is required (is not optional).
+///
+///    normalFormalParameter ::=
+///        [FunctionTypedFormalParameter]
+///      | [FieldFormalParameter]
+///      | [SimpleFormalParameter]
 abstract class NormalFormalParameterImpl extends FormalParameterImpl
     implements NormalFormalParameter {
-  /**
-   * The documentation comment associated with this parameter, or `null` if this
-   * parameter does not have a documentation comment associated with it.
-   */
+  /// The documentation comment associated with this parameter, or `null` if
+  /// this parameter does not have a documentation comment associated with it.
   CommentImpl _comment;
 
-  /**
-   * The annotations associated with this parameter.
-   */
+  /// The annotations associated with this parameter.
   NodeList<Annotation> _metadata;
 
-  /**
-   * The 'covariant' keyword, or `null` if the keyword was not used.
-   */
+  /// The 'covariant' keyword, or `null` if the keyword was not used.
   Token covariantKeyword;
 
-  /**
-   * The name of the parameter being declared.
-   */
+  /// The name of the parameter being declared.
   SimpleIdentifierImpl _identifier;
 
-  /**
-   * Initialize a newly created formal parameter. Either or both of the
-   * [comment] and [metadata] can be `null` if the parameter does not have the
-   * corresponding attribute.
-   */
+  /// Initialize a newly created formal parameter. Either or both of the
+  /// [comment] and [metadata] can be `null` if the parameter does not have the
+  /// corresponding attribute.
   NormalFormalParameterImpl(CommentImpl comment, List<Annotation> metadata,
       this.covariantKeyword, SimpleIdentifierImpl identifier) {
     _comment = _becomeParentOf(comment);
@@ -9235,9 +8085,7 @@
     }
   }
 
-  /**
-   * Return `true` if the comment is lexically before any annotations.
-   */
+  /// Return `true` if the comment is lexically before any annotations.
   bool _commentIsBeforeAnnotations() {
     if (_comment == null || _metadata.isEmpty) {
       return true;
@@ -9247,21 +8095,15 @@
   }
 }
 
-/**
- * A null literal expression.
- *
- *    nullLiteral ::=
- *        'null'
- */
+/// A null literal expression.
+///
+///    nullLiteral ::=
+///        'null'
 class NullLiteralImpl extends LiteralImpl implements NullLiteral {
-  /**
-   * The token representing the literal.
-   */
+  /// The token representing the literal.
   Token literal;
 
-  /**
-   * Initialize a newly created null literal.
-   */
+  /// Initialize a newly created null literal.
   NullLiteralImpl(this.literal);
 
   @override
@@ -9283,24 +8125,18 @@
   }
 }
 
-/**
- * The "on" clause in a mixin declaration.
- *
- *    onClause ::=
- *        'on' [TypeName] (',' [TypeName])*
- */
+/// The "on" clause in a mixin declaration.
+///
+///    onClause ::=
+///        'on' [TypeName] (',' [TypeName])*
 class OnClauseImpl extends AstNodeImpl implements OnClause {
   @override
   Token onKeyword;
 
-  /**
-   * The classes are super-class constraints for the mixin.
-   */
+  /// The classes are super-class constraints for the mixin.
   NodeList<TypeName> _superclassConstraints;
 
-  /**
-   * Initialize a newly created on clause.
-   */
+  /// Initialize a newly created on clause.
   OnClauseImpl(this.onKeyword, List<TypeName> superclassConstraints) {
     _superclassConstraints =
         new NodeListImpl<TypeName>(this, superclassConstraints);
@@ -9330,32 +8166,22 @@
   }
 }
 
-/**
- * A parenthesized expression.
- *
- *    parenthesizedExpression ::=
- *        '(' [Expression] ')'
- */
+/// A parenthesized expression.
+///
+///    parenthesizedExpression ::=
+///        '(' [Expression] ')'
 class ParenthesizedExpressionImpl extends ExpressionImpl
     implements ParenthesizedExpression {
-  /**
-   * The left parenthesis.
-   */
+  /// The left parenthesis.
   Token leftParenthesis;
 
-  /**
-   * The expression within the parentheses.
-   */
+  /// The expression within the parentheses.
   ExpressionImpl _expression;
 
-  /**
-   * The right parenthesis.
-   */
+  /// The right parenthesis.
   Token rightParenthesis;
 
-  /**
-   * Initialize a newly created parenthesized expression.
-   */
+  /// Initialize a newly created parenthesized expression.
   ParenthesizedExpressionImpl(
       this.leftParenthesis, ExpressionImpl expression, this.rightParenthesis) {
     _expression = _becomeParentOf(expression);
@@ -9381,8 +8207,13 @@
     _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 15;
+  int get precedence => SELECTOR_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.primary;
 
   @override
   Expression get unParenthesized {
@@ -9405,30 +8236,22 @@
   }
 }
 
-/**
- * A part directive.
- *
- *    partDirective ::=
- *        [Annotation] 'part' [StringLiteral] ';'
- */
+/// A part directive.
+///
+///    partDirective ::=
+///        [Annotation] 'part' [StringLiteral] ';'
 class PartDirectiveImpl extends UriBasedDirectiveImpl implements PartDirective {
-  /**
-   * The token representing the 'part' keyword.
-   */
+  /// The token representing the 'part' keyword.
   @override
   Token partKeyword;
 
-  /**
-   * The semicolon terminating the directive.
-   */
+  /// The semicolon terminating the directive.
   @override
   Token semicolon;
 
-  /**
-   * Initialize a newly created part directive. Either or both of the [comment]
-   * and [metadata] can be `null` if the directive does not have the
-   * corresponding attribute.
-   */
+  /// Initialize a newly created part directive. Either or both of the [comment]
+  /// and [metadata] can be `null` if the directive does not have the
+  /// corresponding attribute.
   PartDirectiveImpl(CommentImpl comment, List<Annotation> metadata,
       this.partKeyword, StringLiteralImpl partUri, this.semicolon)
       : super(comment, metadata, partUri);
@@ -9453,47 +8276,34 @@
   E accept<E>(AstVisitor<E> visitor) => visitor.visitPartDirective(this);
 }
 
-/**
- * A part-of directive.
- *
- *    partOfDirective ::=
- *        [Annotation] 'part' 'of' [Identifier] ';'
- */
+/// A part-of directive.
+///
+///    partOfDirective ::=
+///        [Annotation] 'part' 'of' [Identifier] ';'
 class PartOfDirectiveImpl extends DirectiveImpl implements PartOfDirective {
-  /**
-   * The token representing the 'part' keyword.
-   */
+  /// The token representing the 'part' keyword.
   @override
   Token partKeyword;
 
-  /**
-   * The token representing the 'of' keyword.
-   */
+  /// The token representing the 'of' keyword.
   @override
   Token ofKeyword;
 
-  /**
-   * The URI of the library that the containing compilation unit is part of.
-   */
+  /// The URI of the library that the containing compilation unit is part of.
   StringLiteralImpl _uri;
 
-  /**
-   * The name of the library that the containing compilation unit is part of, or
-   * `null` if no name was given (typically because a library URI was provided).
-   */
+  /// The name of the library that the containing compilation unit is part of,
+  /// or `null` if no name was given (typically because a library URI was
+  /// provided).
   LibraryIdentifierImpl _libraryName;
 
-  /**
-   * The semicolon terminating the directive.
-   */
+  /// The semicolon terminating the directive.
   @override
   Token semicolon;
 
-  /**
-   * Initialize a newly created part-of directive. Either or both of the
-   * [comment] and [metadata] can be `null` if the directive does not have the
-   * corresponding attribute.
-   */
+  /// Initialize a newly created part-of directive. Either or both of the
+  /// [comment] and [metadata] can be `null` if the directive does not have the
+  /// corresponding attribute.
   PartOfDirectiveImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -9551,36 +8361,26 @@
   }
 }
 
-/**
- * A postfix unary expression.
- *
- *    postfixExpression ::=
- *        [Expression] [Token]
- */
+/// A postfix unary expression.
+///
+///    postfixExpression ::=
+///        [Expression] [Token]
 class PostfixExpressionImpl extends ExpressionImpl
     implements PostfixExpression {
-  /**
-   * The expression computing the operand for the operator.
-   */
+  /// The expression computing the operand for the operator.
   ExpressionImpl _operand;
 
-  /**
-   * The postfix operator being applied to the operand.
-   */
+  /// The postfix operator being applied to the operand.
   @override
   Token operator;
 
-  /**
-   * The element associated with the operator based on the static type of the
-   * operand, or `null` if the AST structure has not been resolved, if the
-   * operator is not user definable, or if the operator could not be resolved.
-   */
+  /// The element associated with the operator based on the static type of the
+  /// operand, or `null` if the AST structure has not been resolved, if the
+  /// operator is not user definable, or if the operator could not be resolved.
   @override
   MethodElement staticElement;
 
-  /**
-   * Initialize a newly created postfix expression.
-   */
+  /// Initialize a newly created postfix expression.
   PostfixExpressionImpl(ExpressionImpl operand, this.operator) {
     _operand = _becomeParentOf(operand);
   }
@@ -9607,8 +8407,13 @@
     _operand = _becomeParentOf(expression as ExpressionImpl);
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.postfix;
 
   @deprecated
   @override
@@ -9618,12 +8423,10 @@
   @override
   set propagatedElement(MethodElement element) {}
 
-  /**
-   * If the AST structure has been resolved, and the function being invoked is
-   * known based on static type information, then return the parameter element
-   * representing the parameter to which the value of the operand will be bound.
-   * Otherwise, return `null`.
-   */
+  /// If the AST structure has been resolved, and the function being invoked is
+  /// known based on static type information, then return the parameter element
+  /// representing the parameter to which the value of the operand will be
+  /// bound.  Otherwise, return `null`.
   ParameterElement get _staticParameterElementForOperand {
     if (staticElement == null) {
       return null;
@@ -9644,44 +8447,32 @@
   }
 }
 
-/**
- * An identifier that is prefixed or an access to an object property where the
- * target of the property access is a simple identifier.
- *
- *    prefixedIdentifier ::=
- *        [SimpleIdentifier] '.' [SimpleIdentifier]
- */
+/// An identifier that is prefixed or an access to an object property where the
+/// target of the property access is a simple identifier.
+///
+///    prefixedIdentifier ::=
+///        [SimpleIdentifier] '.' [SimpleIdentifier]
 class PrefixedIdentifierImpl extends IdentifierImpl
     implements PrefixedIdentifier {
-  /**
-   * The prefix associated with the library in which the identifier is defined.
-   */
+  /// The prefix associated with the library in which the identifier is defined.
   SimpleIdentifierImpl _prefix;
 
-  /**
-   * The period used to separate the prefix from the identifier.
-   */
+  /// The period used to separate the prefix from the identifier.
   Token period;
 
-  /**
-   * The identifier being prefixed.
-   */
+  /// The identifier being prefixed.
   SimpleIdentifierImpl _identifier;
 
-  /**
-   * Initialize a newly created prefixed identifier.
-   */
+  /// Initialize a newly created prefixed identifier.
   PrefixedIdentifierImpl(SimpleIdentifierImpl prefix, this.period,
       SimpleIdentifierImpl identifier) {
     _prefix = _becomeParentOf(prefix);
     _identifier = _becomeParentOf(identifier);
   }
 
-  /**
-   * Initialize a newly created prefixed identifier that does not take ownership
-   * of the components. The resulting node is only for temporary use, such as by
-   * resolution.
-   */
+  /// Initialize a newly created prefixed identifier that does not take
+  /// ownership of the components. The resulting node is only for temporary use,
+  /// such as by resolution.
   PrefixedIdentifierImpl.temp(this._prefix, this._identifier) : period = null;
 
   @override
@@ -9728,8 +8519,13 @@
   @override
   String get name => "${_prefix.name}.${_identifier.name}";
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.postfix;
 
   @override
   SimpleIdentifier get prefix => _prefix;
@@ -9761,33 +8557,23 @@
   }
 }
 
-/**
- * A prefix unary expression.
- *
- *    prefixExpression ::=
- *        [Token] [Expression]
- */
+/// A prefix unary expression.
+///
+///    prefixExpression ::=
+///        [Token] [Expression]
 class PrefixExpressionImpl extends ExpressionImpl implements PrefixExpression {
-  /**
-   * The prefix operator being applied to the operand.
-   */
+  /// The prefix operator being applied to the operand.
   Token operator;
 
-  /**
-   * The expression computing the operand for the operator.
-   */
+  /// The expression computing the operand for the operator.
   ExpressionImpl _operand;
 
-  /**
-   * The element associated with the operator based on the static type of the
-   * operand, or `null` if the AST structure has not been resolved, if the
-   * operator is not user definable, or if the operator could not be resolved.
-   */
+  /// The element associated with the operator based on the static type of the
+  /// operand, or `null` if the AST structure has not been resolved, if the
+  /// operator is not user definable, or if the operator could not be resolved.
   MethodElement staticElement;
 
-  /**
-   * Initialize a newly created prefix expression.
-   */
+  /// Initialize a newly created prefix expression.
   PrefixExpressionImpl(this.operator, ExpressionImpl operand) {
     _operand = _becomeParentOf(operand);
   }
@@ -9814,8 +8600,13 @@
     _operand = _becomeParentOf(expression as ExpressionImpl);
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 14;
+  int get precedence => PREFIX_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.prefix;
 
   @deprecated
   @override
@@ -9825,12 +8616,10 @@
   @override
   set propagatedElement(MethodElement element) {}
 
-  /**
-   * If the AST structure has been resolved, and the function being invoked is
-   * known based on static type information, then return the parameter element
-   * representing the parameter to which the value of the operand will be bound.
-   * Otherwise, return `null`.
-   */
+  /// If the AST structure has been resolved, and the function being invoked is
+  /// known based on static type information, then return the parameter element
+  /// representing the parameter to which the value of the operand will be
+  /// bound.  Otherwise, return `null`.
   ParameterElement get _staticParameterElementForOperand {
     if (staticElement == null) {
       return null;
@@ -9851,35 +8640,25 @@
   }
 }
 
-/**
- * The access of a property of an object.
- *
- * Note, however, that accesses to properties of objects can also be represented
- * as [PrefixedIdentifier] nodes in cases where the target is also a simple
- * identifier.
- *
- *    propertyAccess ::=
- *        [Expression] '.' [SimpleIdentifier]
- */
+/// The access of a property of an object.
+///
+/// Note, however, that accesses to properties of objects can also be
+/// represented as [PrefixedIdentifier] nodes in cases where the target is also
+/// a simple identifier.
+///
+///    propertyAccess ::=
+///        [Expression] '.' [SimpleIdentifier]
 class PropertyAccessImpl extends ExpressionImpl implements PropertyAccess {
-  /**
-   * The expression computing the object defining the property being accessed.
-   */
+  /// The expression computing the object defining the property being accessed.
   ExpressionImpl _target;
 
-  /**
-   * The property access operator.
-   */
+  /// The property access operator.
   Token operator;
 
-  /**
-   * The name of the property being accessed.
-   */
+  /// The name of the property being accessed.
   SimpleIdentifierImpl _propertyName;
 
-  /**
-   * Initialize a newly created property access expression.
-   */
+  /// Initialize a newly created property access expression.
   PropertyAccessImpl(
       ExpressionImpl target, this.operator, SimpleIdentifierImpl propertyName) {
     _target = _becomeParentOf(target);
@@ -9908,8 +8687,13 @@
   bool get isCascaded =>
       operator != null && operator.type == TokenType.PERIOD_PERIOD;
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.postfix;
 
   @override
   SimpleIdentifier get propertyName => _propertyName;
@@ -9952,49 +8736,36 @@
   }
 }
 
-/**
- * The invocation of a constructor in the same class from within a constructor's
- * initialization list.
- *
- *    redirectingConstructorInvocation ::=
- *        'this' ('.' identifier)? arguments
- */
+/// The invocation of a constructor in the same class from within a
+/// constructor's initialization list.
+///
+///    redirectingConstructorInvocation ::=
+///        'this' ('.' identifier)? arguments
 class RedirectingConstructorInvocationImpl extends ConstructorInitializerImpl
     implements RedirectingConstructorInvocation {
-  /**
-   * The token for the 'this' keyword.
-   */
+  /// The token for the 'this' keyword.
   Token thisKeyword;
 
-  /**
-   * The token for the period before the name of the constructor that is being
-   * invoked, or `null` if the unnamed constructor is being invoked.
-   */
+  /// The token for the period before the name of the constructor that is being
+  /// invoked, or `null` if the unnamed constructor is being invoked.
   Token period;
 
-  /**
-   * The name of the constructor that is being invoked, or `null` if the unnamed
-   * constructor is being invoked.
-   */
+  /// The name of the constructor that is being invoked, or `null` if the
+  /// unnamed constructor is being invoked.
   SimpleIdentifierImpl _constructorName;
 
-  /**
-   * The list of arguments to the constructor.
-   */
+  /// The list of arguments to the constructor.
   ArgumentListImpl _argumentList;
 
-  /**
-   * The element associated with the constructor based on static type
-   * information, or `null` if the AST structure has not been resolved or if the
-   * constructor could not be resolved.
-   */
+  /// The element associated with the constructor based on static type
+  /// information, or `null` if the AST structure has not been resolved or if
+  /// the constructor could not be resolved.
   ConstructorElement staticElement;
 
-  /**
-   * Initialize a newly created redirecting invocation to invoke the constructor
-   * with the given name with the given arguments. The [constructorName] can be
-   * `null` if the constructor being invoked is the unnamed constructor.
-   */
+  /// Initialize a newly created redirecting invocation to invoke the
+  /// constructor with the given name with the given arguments. The
+  /// [constructorName] can be `null` if the constructor being invoked is the
+  /// unnamed constructor.
   RedirectingConstructorInvocationImpl(this.thisKeyword, this.period,
       SimpleIdentifierImpl constructorName, ArgumentListImpl argumentList) {
     _constructorName = _becomeParentOf(constructorName);
@@ -10041,22 +8812,16 @@
   }
 }
 
-/**
- * A rethrow expression.
- *
- *    rethrowExpression ::=
- *        'rethrow'
- */
+/// A rethrow expression.
+///
+///    rethrowExpression ::=
+///        'rethrow'
 class RethrowExpressionImpl extends ExpressionImpl
     implements RethrowExpression {
-  /**
-   * The token representing the 'rethrow' keyword.
-   */
+  /// The token representing the 'rethrow' keyword.
   Token rethrowKeyword;
 
-  /**
-   * Initialize a newly created rethrow expression.
-   */
+  /// Initialize a newly created rethrow expression.
   RethrowExpressionImpl(this.rethrowKeyword);
 
   @override
@@ -10069,8 +8834,13 @@
   @override
   Token get endToken => rethrowKeyword;
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 0;
+  int get precedence => ASSIGNMENT_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.assignment;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitRethrowExpression(this);
@@ -10081,33 +8851,23 @@
   }
 }
 
-/**
- * A return statement.
- *
- *    returnStatement ::=
- *        'return' [Expression]? ';'
- */
+/// A return statement.
+///
+///    returnStatement ::=
+///        'return' [Expression]? ';'
 class ReturnStatementImpl extends StatementImpl implements ReturnStatement {
-  /**
-   * The token representing the 'return' keyword.
-   */
+  /// The token representing the 'return' keyword.
   Token returnKeyword;
 
-  /**
-   * The expression computing the value to be returned, or `null` if no explicit
-   * value was provided.
-   */
+  /// The expression computing the value to be returned, or `null` if no
+  /// explicit value was provided.
   ExpressionImpl _expression;
 
-  /**
-   * The semicolon terminating the statement.
-   */
+  /// The semicolon terminating the statement.
   Token semicolon;
 
-  /**
-   * Initialize a newly created return statement. The [expression] can be `null`
-   * if no explicit value was provided.
-   */
+  /// Initialize a newly created return statement. The [expression] can be
+  /// `null` if no explicit value was provided.
   ReturnStatementImpl(
       this.returnKeyword, ExpressionImpl expression, this.semicolon) {
     _expression = _becomeParentOf(expression);
@@ -10140,21 +8900,16 @@
   }
 }
 
-/**
- * A script tag that can optionally occur at the beginning of a compilation unit.
- *
- *    scriptTag ::=
- *        '#!' (~NEWLINE)* NEWLINE
- */
+/// A script tag that can optionally occur at the beginning of a compilation
+/// unit.
+///
+///    scriptTag ::=
+///        '#!' (~NEWLINE)* NEWLINE
 class ScriptTagImpl extends AstNodeImpl implements ScriptTag {
-  /**
-   * The token representing this script tag.
-   */
+  /// The token representing this script tag.
   Token scriptTag;
 
-  /**
-   * Initialize a newly created script tag.
-   */
+  /// Initialize a newly created script tag.
   ScriptTagImpl(this.scriptTag);
 
   @override
@@ -10176,115 +8931,98 @@
   }
 }
 
-/**
- * A literal set.
- *
- *    setLiteral ::=
- *        'const'? ('<' [TypeAnnotation] '>')?
- *        '{' [CollectionElement] (',' [Expression])* ','? '}'
- *      | 'const'? ('<' [TypeAnnotation] '>')? '{' '}'
- *
- * This is the class that is used to represent a set literal when either the
- * 'control-flow-collections' or 'spread-collections' experiments are enabled.
- * If neither of those experiments are enabled, then [SetLiteral] will be used.
- */
-class SetLiteral2Impl extends TypedLiteralImpl implements SetLiteral2 {
-  @override
-  Token leftBracket;
-
-  /**
-   * The elements in the set.
-   */
-  NodeList<CollectionElement> _elements;
-
-  @override
-  Token rightBracket;
-
-  /**
-   * Initialize a newly created set literal. The [constKeyword] can be `null` if
-   * the literal is not a constant. The [typeArguments] can be `null` if no type
-   * arguments were declared. The [elements] can be `null` if the set is empty.
-   */
+/// A literal set.
+///
+///    setLiteral ::=
+///        'const'? ('<' [TypeAnnotation] '>')?
+///        '{' [CollectionElement] (',' [Expression])* ','? '}'
+///      | 'const'? ('<' [TypeAnnotation] '>')? '{' '}'
+///
+/// This is the class that is used to represent a set literal when either the
+/// 'control-flow-collections' or 'spread-collections' experiments are enabled.
+/// If neither of those experiments are enabled, then [SetLiteral] will be used.
+@Deprecated('Replaced by SetOrMapLiteralImpl')
+class SetLiteral2Impl extends SetOrMapLiteralImpl implements SetLiteral2 {
+  /// Initialize a newly created set literal. The [constKeyword] can be `null`
+  /// if the literal is not a constant. The [typeArguments] can be `null` if no
+  /// type arguments were declared. The [elements] can be `null` if the set is
+  /// empty.
   SetLiteral2Impl(Token constKeyword, TypeArgumentListImpl typeArguments,
-      this.leftBracket, List<CollectionElement> elements, this.rightBracket)
-      : super(constKeyword, typeArguments) {
-    _elements = new NodeListImpl<CollectionElement>(this, elements);
-  }
-
-  @override
-  Token get beginToken {
-    if (constKeyword != null) {
-      return constKeyword;
-    }
-    TypeArgumentList typeArguments = this.typeArguments;
-    if (typeArguments != null) {
-      return typeArguments.beginToken;
-    }
-    return leftBracket;
-  }
-
-  @override
-  // TODO(paulberry): add commas.
-  Iterable<SyntacticEntity> get childEntities => super._childEntities
-    ..add(leftBracket)
-    ..addAll(elements)
-    ..add(rightBracket);
+      Token leftBracket, List<CollectionElement> elements, Token rightBracket)
+      : super(constKeyword, typeArguments, leftBracket, elements, rightBracket);
 
   @override
   NodeList<CollectionElement> get elements => _elements;
 
   @override
-  Token get endToken => rightBracket;
-
-  @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitSetLiteral2(this);
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    super.visitChildren(visitor);
-    _elements.accept(visitor);
-  }
 }
 
-/**
- * A literal set.
- *
- *    setLiteral ::=
- *        'const'? ('<' [TypeAnnotation] '>')?
- *        '{' [Expression] (',' [Expression])* ','? '}'
- *      | 'const'? ('<' [TypeAnnotation] '>')? '{' '}'
- *
- * This is the class that is used to represent a set literal when neither the
- * 'control-flow-collections' nor 'spread-collections' experiments are enabled.
- * If either of those experiments are enabled, then [SetLiteral2] will be used.
- */
-class SetLiteralImpl extends TypedLiteralImpl implements SetLiteral {
-  /**
-   * The left curly bracket.
-   */
+@Deprecated('Use SetOrMapLiteralImpl')
+class SetLiteralImpl extends SetOrMapLiteralImpl implements SetLiteral {
+  /// Initialize a newly created set literal. The [constKeyword] can be `null`
+  /// if the literal is not a constant. The [typeArguments] can be `null` if no
+  /// type arguments were declared. The [elements] can be `null` if the set is
+  /// empty.
+  SetLiteralImpl(Token constKeyword, TypeArgumentListImpl typeArguments,
+      Token leftBracket, List<Expression> elements, Token rightBracket)
+      : super._set(
+            constKeyword, typeArguments, leftBracket, elements, rightBracket);
+
+  @override
+  NodeList<Expression> get elements => _elements;
+
+  @override
+  E accept<E>(AstVisitor<E> visitor) => visitor.visitSetLiteral(this);
+}
+
+class SetOrMapLiteralImpl extends TypedLiteralImpl implements SetOrMapLiteral {
   @override
   Token leftBracket;
 
-  /**
-   * The elements in the set.
-   */
-  NodeList<Expression> _elements;
+  /// The syntactic elements in the set.
+  NodeList<CollectionElement> _elements;
 
-  /**
-   * The right curly bracket.
-   */
   @override
   Token rightBracket;
 
-  /**
-   * Initialize a newly created set literal. The [constKeyword] can be `null` if
-   * the literal is not a constant. The [typeArguments] can be `null` if no type
-   * arguments were declared. The [elements] can be `null` if the set is empty.
-   */
-  SetLiteralImpl(Token constKeyword, TypeArgumentListImpl typeArguments,
-      this.leftBracket, List<Expression> elements, this.rightBracket)
+  /// A representation of whether this literal represents a map or a set, or
+  /// whether the kind has not or cannot be determined.
+  _SetOrMapKind _resolvedKind;
+
+  /// Initialize a newly created set or map literal. The [constKeyword] can be
+  /// `null` if the literal is not a constant. The [typeArguments] can be `null`
+  /// if no type arguments were declared. The [elements] can be `null` if the
+  /// set is empty.
+  SetOrMapLiteralImpl(Token constKeyword, TypeArgumentListImpl typeArguments,
+      this.leftBracket, List<CollectionElement> elements, this.rightBracket)
+      : super(constKeyword, typeArguments) {
+    _elements = new NodeListImpl<CollectionElement>(this, elements);
+    _resolvedKind = _SetOrMapKind.unresolved;
+  }
+
+  /// Temporary constructor to support MapLiteral2Impl.
+  SetOrMapLiteralImpl._map(
+      Token constKeyword,
+      TypeArgumentListImpl typeArguments,
+      this.leftBracket,
+      List<MapLiteralEntry> elements,
+      this.rightBracket)
+      : super(constKeyword, typeArguments) {
+    _elements = new NodeListImpl<MapLiteralEntry>(this, elements);
+    _resolvedKind = _SetOrMapKind.map;
+  }
+
+  /// Temporary constructor to support SetLiteral2Impl.
+  SetOrMapLiteralImpl._set(
+      Token constKeyword,
+      TypeArgumentListImpl typeArguments,
+      this.leftBracket,
+      List<Expression> elements,
+      this.rightBracket)
       : super(constKeyword, typeArguments) {
     _elements = new NodeListImpl<Expression>(this, elements);
+    _resolvedKind = _SetOrMapKind.set;
   }
 
   @override
@@ -10303,17 +9041,35 @@
   // TODO(paulberry): add commas.
   Iterable<SyntacticEntity> get childEntities => super._childEntities
     ..add(leftBracket)
-    ..addAll(elements)
+    ..addAll(elements2)
     ..add(rightBracket);
 
   @override
-  NodeList<Expression> get elements => _elements;
+  NodeList<CollectionElement> get elements2 => _elements;
 
   @override
   Token get endToken => rightBracket;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitSetLiteral(this);
+  bool get isMap => _resolvedKind == _SetOrMapKind.map;
+
+  @override
+  bool get isSet => _resolvedKind == _SetOrMapKind.set;
+
+  @override
+  E accept<E>(AstVisitor<E> visitor) => visitor.visitSetOrMapLiteral(this);
+
+  void becomeMap() {
+    assert(_resolvedKind == _SetOrMapKind.unresolved ||
+        _resolvedKind == _SetOrMapKind.map);
+    _resolvedKind = _SetOrMapKind.map;
+  }
+
+  void becomeSet() {
+    assert(_resolvedKind == _SetOrMapKind.unresolved ||
+        _resolvedKind == _SetOrMapKind.set);
+    _resolvedKind = _SetOrMapKind.set;
+  }
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -10322,21 +9078,17 @@
   }
 }
 
-/**
- * A combinator that restricts the names being imported to those in a given list.
- *
- *    showCombinator ::=
- *        'show' [SimpleIdentifier] (',' [SimpleIdentifier])*
- */
+/// A combinator that restricts the names being imported to those in a given
+/// list.
+///
+///    showCombinator ::=
+///        'show' [SimpleIdentifier] (',' [SimpleIdentifier])*
 class ShowCombinatorImpl extends CombinatorImpl implements ShowCombinator {
-  /**
-   * The list of names from the library that are made visible by this combinator.
-   */
+  /// The list of names from the library that are made visible by this
+  /// combinator.
   NodeList<SimpleIdentifier> _shownNames;
 
-  /**
-   * Initialize a newly created import show combinator.
-   */
+  /// Initialize a newly created import show combinator.
   ShowCombinatorImpl(Token keyword, List<SimpleIdentifier> shownNames)
       : super(keyword) {
     _shownNames = new NodeListImpl<SimpleIdentifier>(this, shownNames);
@@ -10363,24 +9115,18 @@
   }
 }
 
-/**
- * A simple formal parameter.
- *
- *    simpleFormalParameter ::=
- *        ('final' [TypeName] | 'var' | [TypeName])? [SimpleIdentifier]
- */
+/// A simple formal parameter.
+///
+///    simpleFormalParameter ::=
+///        ('final' [TypeName] | 'var' | [TypeName])? [SimpleIdentifier]
 class SimpleFormalParameterImpl extends NormalFormalParameterImpl
     implements SimpleFormalParameter {
-  /**
-   * The token representing either the 'final', 'const' or 'var' keyword, or
-   * `null` if no keyword was used.
-   */
+  /// The token representing either the 'final', 'const' or 'var' keyword, or
+  /// `null` if no keyword was used.
   Token keyword;
 
-  /**
-   * The name of the declared type of the parameter, or `null` if the parameter
-   * does not have a declared type.
-   */
+  /// The name of the declared type of the parameter, or `null` if the parameter
+  /// does not have a declared type.
   TypeAnnotationImpl _type;
 
   @override
@@ -10389,12 +9135,10 @@
   // corresponding inherited setter. This seems inconsistent and error prone.
   ParameterElement declaredElement;
 
-  /**
-   * Initialize a newly created formal parameter. Either or both of the
-   * [comment] and [metadata] can be `null` if the parameter does not have the
-   * corresponding attribute. The [keyword] can be `null` if a type was
-   * specified. The [type] must be `null` if the keyword is 'var'.
-   */
+  /// Initialize a newly created formal parameter. Either or both of the
+  /// [comment] and [metadata] can be `null` if the parameter does not have the
+  /// corresponding attribute. The [keyword] can be `null` if a type was
+  /// specified. The [type] must be `null` if the keyword is 'var'.
   SimpleFormalParameterImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -10454,39 +9198,29 @@
   }
 }
 
-/**
- * A simple identifier.
- *
- *    simpleIdentifier ::=
- *        initialCharacter internalCharacter*
- *
- *    initialCharacter ::= '_' | '$' | letter
- *
- *    internalCharacter ::= '_' | '$' | letter | digit
- */
+/// A simple identifier.
+///
+///    simpleIdentifier ::=
+///        initialCharacter internalCharacter*
+///
+///    initialCharacter ::= '_' | '$' | letter
+///
+///    internalCharacter ::= '_' | '$' | letter | digit
 class SimpleIdentifierImpl extends IdentifierImpl implements SimpleIdentifier {
-  /**
-   * The token representing the identifier.
-   */
+  /// The token representing the identifier.
   Token token;
 
-  /**
-   * The element associated with this identifier based on static type
-   * information, or `null` if the AST structure has not been resolved or if
-   * this identifier could not be resolved.
-   */
+  /// The element associated with this identifier based on static type
+  /// information, or `null` if the AST structure has not been resolved or if
+  /// this identifier could not be resolved.
   Element _staticElement;
 
-  /**
-   * If this expression is both in a getter and setter context, the
-   * [AuxiliaryElements] will be set to hold onto the static element from the
-   * getter context.
-   */
+  /// If this expression is both in a getter and setter context, the
+  /// [AuxiliaryElements] will be set to hold onto the static element from the
+  /// getter context.
   AuxiliaryElements auxiliaryElements = null;
 
-  /**
-   * Initialize a newly created identifier.
-   */
+  /// Initialize a newly created identifier.
   SimpleIdentifierImpl(this.token);
 
   @override
@@ -10524,8 +9258,13 @@
   @override
   String get name => token.lexeme;
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.primary;
 
   @deprecated
   @override
@@ -10584,6 +9323,12 @@
         identical(parent.fieldName, target)) {
       return false;
     }
+    if (parent is ForEachPartsWithIdentifier) {
+      if (identical(parent.identifier, target)) {
+        return false;
+      }
+    }
+    // ignore: deprecated_member_use_from_same_package
     if (parent is ForEachStatement) {
       if (identical(parent.identifier, target)) {
         return false;
@@ -10630,6 +9375,9 @@
       return true;
     } else if (parent is AssignmentExpression) {
       return identical(parent.leftHandSide, target);
+    } else if (parent is ForEachPartsWithIdentifier) {
+      return identical(parent.identifier, target);
+      // ignore: deprecated_member_use_from_same_package
     } else if (parent is ForEachStatement) {
       return identical(parent.identifier, target);
     }
@@ -10642,43 +9390,35 @@
   }
 }
 
-/**
- * A string literal expression that does not contain any interpolations.
- *
- *    simpleStringLiteral ::=
- *        rawStringLiteral
- *      | basicStringLiteral
- *
- *    rawStringLiteral ::=
- *        'r' basicStringLiteral
- *
- *    simpleStringLiteral ::=
- *        multiLineStringLiteral
- *      | singleLineStringLiteral
- *
- *    multiLineStringLiteral ::=
- *        "'''" characters "'''"
- *      | '"""' characters '"""'
- *
- *    singleLineStringLiteral ::=
- *        "'" characters "'"
- *      | '"' characters '"'
- */
+/// A string literal expression that does not contain any interpolations.
+///
+///    simpleStringLiteral ::=
+///        rawStringLiteral
+///      | basicStringLiteral
+///
+///    rawStringLiteral ::=
+///        'r' basicStringLiteral
+///
+///    simpleStringLiteral ::=
+///        multiLineStringLiteral
+///      | singleLineStringLiteral
+///
+///    multiLineStringLiteral ::=
+///        "'''" characters "'''"
+///      | '"""' characters '"""'
+///
+///    singleLineStringLiteral ::=
+///        "'" characters "'"
+///      | '"' characters '"'
 class SimpleStringLiteralImpl extends SingleStringLiteralImpl
     implements SimpleStringLiteral {
-  /**
-   * The token representing the literal.
-   */
+  /// The token representing the literal.
   Token literal;
 
-  /**
-   * The value of the literal.
-   */
+  /// The value of the literal.
   String _value;
 
-  /**
-   * Initialize a newly created simple string literal.
-   */
+  /// Initialize a newly created simple string literal.
   SimpleStringLiteralImpl(this.literal, String value) {
     _value = StringUtilities.intern(value);
   }
@@ -10737,13 +9477,11 @@
   }
 }
 
-/**
- * A single string literal expression.
- *
- *    singleStringLiteral ::=
- *        [SimpleStringLiteral]
- *      | [StringInterpolation]
- */
+/// A single string literal expression.
+///
+///    singleStringLiteral ::=
+///        [SimpleStringLiteral]
+///      | [StringInterpolation]
 abstract class SingleStringLiteralImpl extends StringLiteralImpl
     implements SingleStringLiteral {}
 
@@ -10785,47 +9523,39 @@
   }
 }
 
-/**
- * A node that represents a statement.
- *
- *    statement ::=
- *        [Block]
- *      | [VariableDeclarationStatement]
- *      | [ForStatement]
- *      | [ForEachStatement]
- *      | [WhileStatement]
- *      | [DoStatement]
- *      | [SwitchStatement]
- *      | [IfStatement]
- *      | [TryStatement]
- *      | [BreakStatement]
- *      | [ContinueStatement]
- *      | [ReturnStatement]
- *      | [ExpressionStatement]
- *      | [FunctionDeclarationStatement]
- */
+/// A node that represents a statement.
+///
+///    statement ::=
+///        [Block]
+///      | [VariableDeclarationStatement]
+///      | [ForStatement]
+///      | [ForEachStatement]
+///      | [WhileStatement]
+///      | [DoStatement]
+///      | [SwitchStatement]
+///      | [IfStatement]
+///      | [TryStatement]
+///      | [BreakStatement]
+///      | [ContinueStatement]
+///      | [ReturnStatement]
+///      | [ExpressionStatement]
+///      | [FunctionDeclarationStatement]
 abstract class StatementImpl extends AstNodeImpl implements Statement {
   @override
   Statement get unlabeled => this;
 }
 
-/**
- * A string interpolation literal.
- *
- *    stringInterpolation ::=
- *        ''' [InterpolationElement]* '''
- *      | '"' [InterpolationElement]* '"'
- */
+/// A string interpolation literal.
+///
+///    stringInterpolation ::=
+///        ''' [InterpolationElement]* '''
+///      | '"' [InterpolationElement]* '"'
 class StringInterpolationImpl extends SingleStringLiteralImpl
     implements StringInterpolation {
-  /**
-   * The elements that will be composed to produce the resulting string.
-   */
+  /// The elements that will be composed to produce the resulting string.
   NodeList<InterpolationElement> _elements;
 
-  /**
-   * Initialize a newly created string interpolation expression.
-   */
+  /// Initialize a newly created string interpolation expression.
   StringInterpolationImpl(List<InterpolationElement> elements) {
     _elements = new NodeListImpl<InterpolationElement>(this, elements);
   }
@@ -10849,9 +9579,7 @@
     return element.contentsOffset;
   }
 
-  /**
-   * Return the elements that will be composed to produce the resulting string.
-   */
+  /// Return the elements that will be composed to produce the resulting string.
   NodeList<InterpolationElement> get elements => _elements;
 
   @override
@@ -10886,9 +9614,7 @@
   }
 }
 
-/**
- * A helper for analyzing string lexemes.
- */
+/// A helper for analyzing string lexemes.
 class StringLexemeHelper {
   final String lexeme;
   final bool isFirst;
@@ -10940,15 +9666,13 @@
     }
   }
 
-  /**
-   * Given the [lexeme] for a multi-line string whose content begins at the
-   * given [start] index, return the index of the first character that is
-   * included in the value of the string. According to the specification:
-   *
-   * If the first line of a multiline string consists solely of the whitespace
-   * characters defined by the production WHITESPACE 20.1), possibly prefixed
-   * by \, then that line is ignored, including the new line at its end.
-   */
+  /// Given the [lexeme] for a multi-line string whose content begins at the
+  /// given [start] index, return the index of the first character that is
+  /// included in the value of the string. According to the specification:
+  ///
+  /// If the first line of a multiline string consists solely of the whitespace
+  /// characters defined by the production WHITESPACE 20.1), possibly prefixed
+  /// by \, then that line is ignored, including the new line at its end.
   int _trimInitialWhitespace(int start) {
     int length = lexeme.length;
     int index = start;
@@ -10981,14 +9705,12 @@
   }
 }
 
-/**
- * A string literal expression.
- *
- *    stringLiteral ::=
- *        [SimpleStringLiteral]
- *      | [AdjacentStrings]
- *      | [StringInterpolation]
- */
+/// A string literal expression.
+///
+///    stringLiteral ::=
+///        [SimpleStringLiteral]
+///      | [AdjacentStrings]
+///      | [StringInterpolation]
 abstract class StringLiteralImpl extends LiteralImpl implements StringLiteral {
   @override
   String get stringValue {
@@ -11001,58 +9723,42 @@
     return buffer.toString();
   }
 
-  /**
-   * Append the value of this string literal to the given [buffer]. Throw an
-   * [ArgumentError] if the string is not a constant string without any
-   * string interpolation.
-   */
+  /// Append the value of this string literal to the given [buffer]. Throw an
+  /// [ArgumentError] if the string is not a constant string without any
+  /// string interpolation.
   void _appendStringValue(StringBuffer buffer);
 }
 
-/**
- * The invocation of a superclass' constructor from within a constructor's
- * initialization list.
- *
- *    superInvocation ::=
- *        'super' ('.' [SimpleIdentifier])? [ArgumentList]
- */
+/// The invocation of a superclass' constructor from within a constructor's
+/// initialization list.
+///
+///    superInvocation ::=
+///        'super' ('.' [SimpleIdentifier])? [ArgumentList]
 class SuperConstructorInvocationImpl extends ConstructorInitializerImpl
     implements SuperConstructorInvocation {
-  /**
-   * The token for the 'super' keyword.
-   */
+  /// The token for the 'super' keyword.
   Token superKeyword;
 
-  /**
-   * The token for the period before the name of the constructor that is being
-   * invoked, or `null` if the unnamed constructor is being invoked.
-   */
+  /// The token for the period before the name of the constructor that is being
+  /// invoked, or `null` if the unnamed constructor is being invoked.
   Token period;
 
-  /**
-   * The name of the constructor that is being invoked, or `null` if the unnamed
-   * constructor is being invoked.
-   */
+  /// The name of the constructor that is being invoked, or `null` if the
+  /// unnamed constructor is being invoked.
   SimpleIdentifierImpl _constructorName;
 
-  /**
-   * The list of arguments to the constructor.
-   */
+  /// The list of arguments to the constructor.
   ArgumentListImpl _argumentList;
 
-  /**
-   * The element associated with the constructor based on static type
-   * information, or `null` if the AST structure has not been resolved or if the
-   * constructor could not be resolved.
-   */
+  /// The element associated with the constructor based on static type
+  /// information, or `null` if the AST structure has not been resolved or if
+  /// the constructor could not be resolved.
   ConstructorElement staticElement;
 
-  /**
-   * Initialize a newly created super invocation to invoke the inherited
-   * constructor with the given name with the given arguments. The [period] and
-   * [constructorName] can be `null` if the constructor being invoked is the
-   * unnamed constructor.
-   */
+  /// Initialize a newly created super invocation to invoke the inherited
+  /// constructor with the given name with the given arguments. The [period] and
+  /// [constructorName] can be `null` if the constructor being invoked is the
+  /// unnamed constructor.
   SuperConstructorInvocationImpl(this.superKeyword, this.period,
       SimpleIdentifierImpl constructorName, ArgumentListImpl argumentList) {
     _constructorName = _becomeParentOf(constructorName);
@@ -11099,21 +9805,15 @@
   }
 }
 
-/**
- * A super expression.
- *
- *    superExpression ::=
- *        'super'
- */
+/// A super expression.
+///
+///    superExpression ::=
+///        'super'
 class SuperExpressionImpl extends ExpressionImpl implements SuperExpression {
-  /**
-   * The token representing the 'super' keyword.
-   */
+  /// The token representing the 'super' keyword.
   Token superKeyword;
 
-  /**
-   * Initialize a newly created super expression.
-   */
+  /// Initialize a newly created super expression.
   SuperExpressionImpl(this.superKeyword);
 
   @override
@@ -11126,8 +9826,13 @@
   @override
   Token get endToken => superKeyword;
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.primary;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitSuperExpression(this);
@@ -11138,22 +9843,16 @@
   }
 }
 
-/**
- * A case in a switch statement.
- *
- *    switchCase ::=
- *        [SimpleIdentifier]* 'case' [Expression] ':' [Statement]*
- */
+/// A case in a switch statement.
+///
+///    switchCase ::=
+///        [SimpleIdentifier]* 'case' [Expression] ':' [Statement]*
 class SwitchCaseImpl extends SwitchMemberImpl implements SwitchCase {
-  /**
-   * The expression controlling whether the statements will be executed.
-   */
+  /// The expression controlling whether the statements will be executed.
   ExpressionImpl _expression;
 
-  /**
-   * Initialize a newly created switch case. The list of [labels] can be `null`
-   * if there are no labels.
-   */
+  /// Initialize a newly created switch case. The list of [labels] can be `null`
+  /// if there are no labels.
   SwitchCaseImpl(List<Label> labels, Token keyword, ExpressionImpl expression,
       Token colon, List<Statement> statements)
       : super(labels, keyword, colon, statements) {
@@ -11187,17 +9886,13 @@
   }
 }
 
-/**
- * The default case in a switch statement.
- *
- *    switchDefault ::=
- *        [SimpleIdentifier]* 'default' ':' [Statement]*
- */
+/// The default case in a switch statement.
+///
+///    switchDefault ::=
+///        [SimpleIdentifier]* 'default' ':' [Statement]*
 class SwitchDefaultImpl extends SwitchMemberImpl implements SwitchDefault {
-  /**
-   * Initialize a newly created switch default. The list of [labels] can be
-   * `null` if there are no labels.
-   */
+  /// Initialize a newly created switch default. The list of [labels] can be
+  /// `null` if there are no labels.
   SwitchDefaultImpl(List<Label> labels, Token keyword, Token colon,
       List<Statement> statements)
       : super(labels, keyword, colon, statements);
@@ -11219,38 +9914,26 @@
   }
 }
 
-/**
- * An element within a switch statement.
- *
- *    switchMember ::=
- *        switchCase
- *      | switchDefault
- */
+/// An element within a switch statement.
+///
+///    switchMember ::=
+///        switchCase
+///      | switchDefault
 abstract class SwitchMemberImpl extends AstNodeImpl implements SwitchMember {
-  /**
-   * The labels associated with the switch member.
-   */
+  /// The labels associated with the switch member.
   NodeList<Label> _labels;
 
-  /**
-   * The token representing the 'case' or 'default' keyword.
-   */
+  /// The token representing the 'case' or 'default' keyword.
   Token keyword;
 
-  /**
-   * The colon separating the keyword or the expression from the statements.
-   */
+  /// The colon separating the keyword or the expression from the statements.
   Token colon;
 
-  /**
-   * The statements that will be executed if this switch member is selected.
-   */
+  /// The statements that will be executed if this switch member is selected.
   NodeList<Statement> _statements;
 
-  /**
-   * Initialize a newly created switch member. The list of [labels] can be
-   * `null` if there are no labels.
-   */
+  /// Initialize a newly created switch member. The list of [labels] can be
+  /// `null` if there are no labels.
   SwitchMemberImpl(List<Label> labels, this.keyword, this.colon,
       List<Statement> statements) {
     _labels = new NodeListImpl<Label>(this, labels);
@@ -11280,53 +9963,35 @@
   NodeList<Statement> get statements => _statements;
 }
 
-/**
- * A switch statement.
- *
- *    switchStatement ::=
- *        'switch' '(' [Expression] ')' '{' [SwitchCase]* [SwitchDefault]? '}'
- */
+/// A switch statement.
+///
+///    switchStatement ::=
+///        'switch' '(' [Expression] ')' '{' [SwitchCase]* [SwitchDefault]? '}'
 class SwitchStatementImpl extends StatementImpl implements SwitchStatement {
-  /**
-   * The token representing the 'switch' keyword.
-   */
+  /// The token representing the 'switch' keyword.
   Token switchKeyword;
 
-  /**
-   * The left parenthesis.
-   */
+  /// The left parenthesis.
   Token leftParenthesis;
 
-  /**
-   * The expression used to determine which of the switch members will be
-   * selected.
-   */
+  /// The expression used to determine which of the switch members will be
+  /// selected.
   ExpressionImpl _expression;
 
-  /**
-   * The right parenthesis.
-   */
+  /// The right parenthesis.
   Token rightParenthesis;
 
-  /**
-   * The left curly bracket.
-   */
+  /// The left curly bracket.
   Token leftBracket;
 
-  /**
-   * The switch members that can be selected by the expression.
-   */
+  /// The switch members that can be selected by the expression.
   NodeList<SwitchMember> _members;
 
-  /**
-   * The right curly bracket.
-   */
+  /// The right curly bracket.
   Token rightBracket;
 
-  /**
-   * Initialize a newly created switch statement. The list of [members] can be
-   * `null` if there are no switch members.
-   */
+  /// Initialize a newly created switch statement. The list of [members] can be
+  /// `null` if there are no switch members.
   SwitchStatementImpl(
       this.switchKeyword,
       this.leftParenthesis,
@@ -11376,26 +10041,18 @@
   }
 }
 
-/**
- * A symbol literal expression.
- *
- *    symbolLiteral ::=
- *        '#' (operator | (identifier ('.' identifier)*))
- */
+/// A symbol literal expression.
+///
+///    symbolLiteral ::=
+///        '#' (operator | (identifier ('.' identifier)*))
 class SymbolLiteralImpl extends LiteralImpl implements SymbolLiteral {
-  /**
-   * The token introducing the literal.
-   */
+  /// The token introducing the literal.
   Token poundSign;
 
-  /**
-   * The components of the literal.
-   */
+  /// The components of the literal.
   final List<Token> components;
 
-  /**
-   * Initialize a newly created symbol literal.
-   */
+  /// Initialize a newly created symbol literal.
   SymbolLiteralImpl(this.poundSign, this.components);
 
   @override
@@ -11419,21 +10076,15 @@
   }
 }
 
-/**
- * A this expression.
- *
- *    thisExpression ::=
- *        'this'
- */
+/// A this expression.
+///
+///    thisExpression ::=
+///        'this'
 class ThisExpressionImpl extends ExpressionImpl implements ThisExpression {
-  /**
-   * The token representing the 'this' keyword.
-   */
+  /// The token representing the 'this' keyword.
   Token thisKeyword;
 
-  /**
-   * Initialize a newly created this expression.
-   */
+  /// Initialize a newly created this expression.
   ThisExpressionImpl(this.thisKeyword);
 
   @override
@@ -11446,8 +10097,13 @@
   @override
   Token get endToken => thisKeyword;
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.primary;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitThisExpression(this);
@@ -11458,26 +10114,18 @@
   }
 }
 
-/**
- * A throw expression.
- *
- *    throwExpression ::=
- *        'throw' [Expression]
- */
+/// A throw expression.
+///
+///    throwExpression ::=
+///        'throw' [Expression]
 class ThrowExpressionImpl extends ExpressionImpl implements ThrowExpression {
-  /**
-   * The token representing the 'throw' keyword.
-   */
+  /// The token representing the 'throw' keyword.
   Token throwKeyword;
 
-  /**
-   * The expression computing the exception to be thrown.
-   */
+  /// The expression computing the exception to be thrown.
   ExpressionImpl _expression;
 
-  /**
-   * Initialize a newly created throw expression.
-   */
+  /// Initialize a newly created throw expression.
   ThrowExpressionImpl(this.throwKeyword, ExpressionImpl expression) {
     _expression = _becomeParentOf(expression);
   }
@@ -11505,8 +10153,13 @@
     _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 0;
+  int get precedence => ASSIGNMENT_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.assignment;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitThrowExpression(this);
@@ -11517,30 +10170,22 @@
   }
 }
 
-/**
- * The declaration of one or more top-level variables of the same type.
- *
- *    topLevelVariableDeclaration ::=
- *        ('final' | 'const') type? staticFinalDeclarationList ';'
- *      | variableDeclaration ';'
- */
+/// The declaration of one or more top-level variables of the same type.
+///
+///    topLevelVariableDeclaration ::=
+///        ('final' | 'const') type? staticFinalDeclarationList ';'
+///      | variableDeclaration ';'
 class TopLevelVariableDeclarationImpl extends CompilationUnitMemberImpl
     implements TopLevelVariableDeclaration {
-  /**
-   * The top-level variables being declared.
-   */
+  /// The top-level variables being declared.
   VariableDeclarationListImpl _variableList;
 
-  /**
-   * The semicolon terminating the declaration.
-   */
+  /// The semicolon terminating the declaration.
   Token semicolon;
 
-  /**
-   * Initialize a newly created top-level variable declaration. Either or both
-   * of the [comment] and [metadata] can be `null` if the variable does not have
-   * the corresponding attribute.
-   */
+  /// Initialize a newly created top-level variable declaration. Either or both
+  /// of the [comment] and [metadata] can be `null` if the variable does not
+  /// have the corresponding attribute.
   TopLevelVariableDeclarationImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -11586,48 +10231,34 @@
   }
 }
 
-/**
- * A try statement.
- *
- *    tryStatement ::=
- *        'try' [Block] ([CatchClause]+ finallyClause? | finallyClause)
- *
- *    finallyClause ::=
- *        'finally' [Block]
- */
+/// A try statement.
+///
+///    tryStatement ::=
+///        'try' [Block] ([CatchClause]+ finallyClause? | finallyClause)
+///
+///    finallyClause ::=
+///        'finally' [Block]
 class TryStatementImpl extends StatementImpl implements TryStatement {
-  /**
-   * The token representing the 'try' keyword.
-   */
+  /// The token representing the 'try' keyword.
   Token tryKeyword;
 
-  /**
-   * The body of the statement.
-   */
+  /// The body of the statement.
   BlockImpl _body;
 
-  /**
-   * The catch clauses contained in the try statement.
-   */
+  /// The catch clauses contained in the try statement.
   NodeList<CatchClause> _catchClauses;
 
-  /**
-   * The token representing the 'finally' keyword, or `null` if the statement
-   * does not contain a finally clause.
-   */
+  /// The token representing the 'finally' keyword, or `null` if the statement
+  /// does not contain a finally clause.
   Token finallyKeyword;
 
-  /**
-   * The finally block contained in the try statement, or `null` if the
-   * statement does not contain a finally clause.
-   */
+  /// The finally block contained in the try statement, or `null` if the
+  /// statement does not contain a finally clause.
   BlockImpl _finallyBlock;
 
-  /**
-   * Initialize a newly created try statement. The list of [catchClauses] can be
-   * `null` if there are no catch clauses. The [finallyKeyword] and
-   * [finallyBlock] can be `null` if there is no finally clause.
-   */
+  /// Initialize a newly created try statement. The list of [catchClauses] can
+  /// be`null` if there are no catch clauses. The [finallyKeyword] and
+  /// [finallyBlock] can be `null` if there is no finally clause.
   TryStatementImpl(
       this.tryKeyword,
       BlockImpl body,
@@ -11692,33 +10323,25 @@
   }
 }
 
-/**
- * The declaration of a type alias.
- *
- *    typeAlias ::=
- *        'typedef' typeAliasBody
- *
- *    typeAliasBody ::=
- *        classTypeAlias
- *      | functionTypeAlias
- */
+/// The declaration of a type alias.
+///
+///    typeAlias ::=
+///        'typedef' typeAliasBody
+///
+///    typeAliasBody ::=
+///        classTypeAlias
+///      | functionTypeAlias
 abstract class TypeAliasImpl extends NamedCompilationUnitMemberImpl
     implements TypeAlias {
-  /**
-   * The token representing the 'typedef' keyword.
-   */
+  /// The token representing the 'typedef' keyword.
   Token typedefKeyword;
 
-  /**
-   * The semicolon terminating the declaration.
-   */
+  /// The semicolon terminating the declaration.
   Token semicolon;
 
-  /**
-   * Initialize a newly created type alias. Either or both of the [comment] and
-   * [metadata] can be `null` if the declaration does not have the corresponding
-   * attribute.
-   */
+  /// Initialize a newly created type alias. Either or both of the [comment] and
+  /// [metadata] can be `null` if the declaration does not have the
+  /// corresponding attribute.
   TypeAliasImpl(CommentImpl comment, List<Annotation> metadata,
       this.typedefKeyword, SimpleIdentifierImpl name, this.semicolon)
       : super(comment, metadata, name);
@@ -11730,41 +10353,29 @@
   Token get firstTokenAfterCommentAndMetadata => typedefKeyword;
 }
 
-/**
- * A type annotation.
- *
- *    type ::=
- *        [NamedType]
- *      | [GenericFunctionType]
- */
+/// A type annotation.
+///
+///    type ::=
+///        [NamedType]
+///      | [GenericFunctionType]
 abstract class TypeAnnotationImpl extends AstNodeImpl
     implements TypeAnnotation {}
 
-/**
- * A list of type arguments.
- *
- *    typeArguments ::=
- *        '<' typeName (',' typeName)* '>'
- */
+/// A list of type arguments.
+///
+///    typeArguments ::=
+///        '<' typeName (',' typeName)* '>'
 class TypeArgumentListImpl extends AstNodeImpl implements TypeArgumentList {
-  /**
-   * The left bracket.
-   */
+  /// The left bracket.
   Token leftBracket;
 
-  /**
-   * The type arguments associated with the type.
-   */
+  /// The type arguments associated with the type.
   NodeList<TypeAnnotation> _arguments;
 
-  /**
-   * The right bracket.
-   */
+  /// The right bracket.
   Token rightBracket;
 
-  /**
-   * Initialize a newly created list of type arguments.
-   */
+  /// Initialize a newly created list of type arguments.
   TypeArgumentListImpl(
       this.leftBracket, List<TypeAnnotation> arguments, this.rightBracket) {
     _arguments = new NodeListImpl<TypeAnnotation>(this, arguments);
@@ -11795,31 +10406,23 @@
   }
 }
 
-/**
- * A literal that has a type associated with it.
- *
- *    typedLiteral ::=
- *        [ListLiteral]
- *      | [MapLiteral]
- */
+/// A literal that has a type associated with it.
+///
+///    typedLiteral ::=
+///        [ListLiteral]
+///      | [MapLiteral]
 abstract class TypedLiteralImpl extends LiteralImpl implements TypedLiteral {
-  /**
-   * The token representing the 'const' keyword, or `null` if the literal is not
-   * a constant.
-   */
+  /// The token representing the 'const' keyword, or `null` if the literal is
+  /// not a constant.
   Token constKeyword;
 
-  /**
-   * The type argument associated with this literal, or `null` if no type
-   * arguments were declared.
-   */
+  /// The type argument associated with this literal, or `null` if no type
+  /// arguments were declared.
   TypeArgumentListImpl _typeArguments;
 
-  /**
-   * Initialize a newly created typed literal. The [constKeyword] can be `null`\
-   * if the literal is not a constant. The [typeArguments] can be `null` if no
-   * type arguments were declared.
-   */
+  /// Initialize a newly created typed literal. The [constKeyword] can be
+  /// `null` if the literal is not a constant. The [typeArguments] can be `null`
+  /// if no type arguments were declared.
   TypedLiteralImpl(this.constKeyword, TypeArgumentListImpl typeArguments) {
     _typeArguments = _becomeParentOf(typeArguments);
   }
@@ -11846,36 +10449,27 @@
   }
 }
 
-/**
- * The name of a type, which can optionally include type arguments.
- *
- *    typeName ::=
- *        [Identifier] typeArguments? '?'?
- */
+/// The name of a type, which can optionally include type arguments.
+///
+///    typeName ::=
+///        [Identifier] typeArguments? '?'?
 class TypeNameImpl extends TypeAnnotationImpl implements TypeName {
-  /**
-   * The name of the type.
-   */
+  /// The name of the type.
   IdentifierImpl _name;
 
-  /**
-   * The type arguments associated with the type, or `null` if there are no type
-   * arguments.
-   */
+  /// The type arguments associated with the type, or `null` if there are no
+  /// type arguments.
   TypeArgumentListImpl _typeArguments;
 
   @override
   Token question;
 
-  /**
-   * The type being named, or `null` if the AST structure has not been resolved.
-   */
+  /// The type being named, or `null` if the AST structure has not been
+  /// resolved.
   DartType type;
 
-  /**
-   * Initialize a newly created type name. The [typeArguments] can be `null` if
-   * there are no type arguments.
-   */
+  /// Initialize a newly created type name. The [typeArguments] can be `null` if
+  /// there are no type arguments.
   TypeNameImpl(IdentifierImpl name, TypeArgumentListImpl typeArguments,
       {this.question}) {
     _name = _becomeParentOf(name);
@@ -11930,36 +10524,26 @@
   }
 }
 
-/**
- * A type parameter.
- *
- *    typeParameter ::=
- *        [SimpleIdentifier] ('extends' [TypeName])?
- */
+/// A type parameter.
+///
+///    typeParameter ::=
+///        [SimpleIdentifier] ('extends' [TypeName])?
 class TypeParameterImpl extends DeclarationImpl implements TypeParameter {
-  /**
-   * The name of the type parameter.
-   */
+  /// The name of the type parameter.
   SimpleIdentifierImpl _name;
 
-  /**
-   * The token representing the 'extends' keyword, or `null` if there is no
-   * explicit upper bound.
-   */
+  /// The token representing the 'extends' keyword, or `null` if there is no
+  /// explicit upper bound.
   Token extendsKeyword;
 
-  /**
-   * The name of the upper bound for legal arguments, or `null` if there is no
-   * explicit upper bound.
-   */
+  /// The name of the upper bound for legal arguments, or `null` if there is no
+  /// explicit upper bound.
   TypeAnnotationImpl _bound;
 
-  /**
-   * Initialize a newly created type parameter. Either or both of the [comment]
-   * and [metadata] can be `null` if the parameter does not have the
-   * corresponding attribute. The [extendsKeyword] and [bound] can be `null` if
-   * the parameter does not have an upper bound.
-   */
+  /// Initialize a newly created type parameter. Either or both of the [comment]
+  /// and [metadata] can be `null` if the parameter does not have the
+  /// corresponding attribute. The [extendsKeyword] and [bound] can be `null` if
+  /// the parameter does not have an upper bound.
   TypeParameterImpl(CommentImpl comment, List<Annotation> metadata,
       SimpleIdentifierImpl name, this.extendsKeyword, TypeAnnotationImpl bound)
       : super(comment, metadata) {
@@ -12017,31 +10601,21 @@
   }
 }
 
-/**
- * Type parameters within a declaration.
- *
- *    typeParameterList ::=
- *        '<' [TypeParameter] (',' [TypeParameter])* '>'
- */
+/// Type parameters within a declaration.
+///
+///    typeParameterList ::=
+///        '<' [TypeParameter] (',' [TypeParameter])* '>'
 class TypeParameterListImpl extends AstNodeImpl implements TypeParameterList {
-  /**
-   * The left angle bracket.
-   */
+  /// The left angle bracket.
   final Token leftBracket;
 
-  /**
-   * The type parameters in the list.
-   */
+  /// The type parameters in the list.
   NodeList<TypeParameter> _typeParameters;
 
-  /**
-   * The right angle bracket.
-   */
+  /// The right angle bracket.
   final Token rightBracket;
 
-  /**
-   * Initialize a newly created list of type parameters.
-   */
+  /// Initialize a newly created list of type parameters.
   TypeParameterListImpl(
       this.leftBracket, List<TypeParameter> typeParameters, this.rightBracket) {
     _typeParameters = new NodeListImpl<TypeParameter>(this, typeParameters);
@@ -12071,25 +10645,19 @@
   }
 }
 
-/**
- * A directive that references a URI.
- *
- *    uriBasedDirective ::=
- *        [ExportDirective]
- *      | [ImportDirective]
- *      | [PartDirective]
- */
+/// A directive that references a URI.
+///
+///    uriBasedDirective ::=
+///        [ExportDirective]
+///      | [ImportDirective]
+///      | [PartDirective]
 abstract class UriBasedDirectiveImpl extends DirectiveImpl
     implements UriBasedDirective {
-  /**
-   * The prefix of a URI using the `dart-ext` scheme to reference a native code
-   * library.
-   */
+  /// The prefix of a URI using the `dart-ext` scheme to reference a native code
+  /// library.
   static String _DART_EXT_SCHEME = "dart-ext:";
 
-  /**
-   * The URI referenced by this directive.
-   */
+  /// The URI referenced by this directive.
   StringLiteralImpl _uri;
 
   @override
@@ -12098,11 +10666,9 @@
   @override
   Source uriSource;
 
-  /**
-   * Initialize a newly create URI-based directive. Either or both of the
-   * [comment] and [metadata] can be `null` if the directive does not have the
-   * corresponding attribute.
-   */
+  /// Initialize a newly create URI-based directive. Either or both of the
+  /// [comment] and [metadata] can be `null` if the directive does not have the
+  /// corresponding attribute.
   UriBasedDirectiveImpl(
       CommentImpl comment, List<Annotation> metadata, StringLiteralImpl uri)
       : super(comment, metadata) {
@@ -12137,10 +10703,8 @@
     _uri?.accept(visitor);
   }
 
-  /**
-   * Validate this directive, but do not check for existence. Return a code
-   * indicating the problem if there is one, or `null` no problem.
-   */
+  /// Validate this directive, but do not check for existence. Return a code
+  /// indicating the problem if there is one, or `null` no problem.
   static UriValidationCode validateUri(
       bool isImport, StringLiteral uriLiteral, String uriContent) {
     if (uriLiteral is StringInterpolation) {
@@ -12165,9 +10729,7 @@
   }
 }
 
-/**
- * Validation codes returned by [UriBasedDirective.validate].
- */
+/// Validation codes returned by [UriBasedDirective.validate].
 class UriValidationCode {
   static const UriValidationCode INVALID_URI =
       const UriValidationCode('INVALID_URI');
@@ -12178,55 +10740,41 @@
   static const UriValidationCode URI_WITH_DART_EXT_SCHEME =
       const UriValidationCode('URI_WITH_DART_EXT_SCHEME');
 
-  /**
-   * The name of the validation code.
-   */
+  /// The name of the validation code.
   final String name;
 
-  /**
-   * Initialize a newly created validation code to have the given [name].
-   */
+  /// Initialize a newly created validation code to have the given [name].
   const UriValidationCode(this.name);
 
   @override
   String toString() => name;
 }
 
-/**
- * An identifier that has an initial value associated with it. Instances of this
- * class are always children of the class [VariableDeclarationList].
- *
- *    variableDeclaration ::=
- *        [SimpleIdentifier] ('=' [Expression])?
- *
- * TODO(paulberry): the grammar does not allow metadata to be associated with
- * a VariableDeclaration, and currently we don't record comments for it either.
- * Consider changing the class hierarchy so that [VariableDeclaration] does not
- * extend [Declaration].
- */
+/// An identifier that has an initial value associated with it. Instances of
+/// this class are always children of the class [VariableDeclarationList].
+///
+///    variableDeclaration ::=
+///        [SimpleIdentifier] ('=' [Expression])?
+///
+/// TODO(paulberry): the grammar does not allow metadata to be associated with
+/// a VariableDeclaration, and currently we don't record comments for it either.
+/// Consider changing the class hierarchy so that [VariableDeclaration] does not
+/// extend [Declaration].
 class VariableDeclarationImpl extends DeclarationImpl
     implements VariableDeclaration {
-  /**
-   * The name of the variable being declared.
-   */
+  /// The name of the variable being declared.
   SimpleIdentifierImpl _name;
 
-  /**
-   * The equal sign separating the variable name from the initial value, or
-   * `null` if the initial value was not specified.
-   */
+  /// The equal sign separating the variable name from the initial value, or
+  /// `null` if the initial value was not specified.
   Token equals;
 
-  /**
-   * The expression used to compute the initial value for the variable, or
-   * `null` if the initial value was not specified.
-   */
+  /// The expression used to compute the initial value for the variable, or
+  /// `null` if the initial value was not specified.
   ExpressionImpl _initializer;
 
-  /**
-   * Initialize a newly created variable declaration. The [equals] and
-   * [initializer] can be `null` if there is no initializer.
-   */
+  /// Initialize a newly created variable declaration. The [equals] and
+  /// [initializer] can be `null` if there is no initializer.
   VariableDeclarationImpl(
       SimpleIdentifierImpl name, this.equals, ExpressionImpl initializer)
       : super(null, null) {
@@ -12242,11 +10790,9 @@
   VariableElement get declaredElement =>
       _name?.staticElement as VariableElement;
 
-  /**
-   * This overridden implementation of [documentationComment] looks in the
-   * grandparent node for Dartdoc comments if no documentation is specifically
-   * available on the node.
-   */
+  /// This overridden implementation of [documentationComment] looks in the
+  /// grandparent node for Dartdoc comments if no documentation is specifically
+  /// available on the node.
   @override
   Comment get documentationComment {
     Comment comment = super.documentationComment;
@@ -12313,42 +10859,34 @@
   }
 }
 
-/**
- * The declaration of one or more variables of the same type.
- *
- *    variableDeclarationList ::=
- *        finalConstVarOrType [VariableDeclaration] (',' [VariableDeclaration])*
- *
- *    finalConstVarOrType ::=
- *      | 'final' [TypeName]?
- *      | 'const' [TypeName]?
- *      | 'var'
- *      | [TypeName]
- */
+/// The declaration of one or more variables of the same type.
+///
+///    variableDeclarationList ::=
+///        finalConstVarOrType [VariableDeclaration]
+///        (',' [VariableDeclaration])*
+///
+///    finalConstVarOrType ::=
+///      | 'final' [TypeName]?
+///      | 'const' [TypeName]?
+///      | 'var'
+///      | [TypeName]
 class VariableDeclarationListImpl extends AnnotatedNodeImpl
     implements VariableDeclarationList {
-  /**
-   * The token representing the 'final', 'const' or 'var' keyword, or `null` if
-   * no keyword was included.
-   */
+  /// The token representing the 'final', 'const' or 'var' keyword, or `null` if
+  /// no keyword was included.
   Token keyword;
 
-  /**
-   * The type of the variables being declared, or `null` if no type was provided.
-   */
+  /// The type of the variables being declared, or `null` if no type was
+  /// provided.
   TypeAnnotationImpl _type;
 
-  /**
-   * A list containing the individual variables being declared.
-   */
+  /// A list containing the individual variables being declared.
   NodeList<VariableDeclaration> _variables;
 
-  /**
-   * Initialize a newly created variable declaration list. Either or both of the
-   * [comment] and [metadata] can be `null` if the variable list does not have
-   * the corresponding attribute. The [keyword] can be `null` if a type was
-   * specified. The [type] must be `null` if the keyword is 'var'.
-   */
+  /// Initialize a newly created variable declaration list. Either or both of
+  /// the [comment] and [metadata] can be `null` if the variable list does not
+  /// have the corresponding attribute. The [keyword] can be `null` if a type
+  /// was specified. The [type] must be `null` if the keyword is 'var'.
   VariableDeclarationListImpl(
       CommentImpl comment,
       List<Annotation> metadata,
@@ -12409,28 +10947,20 @@
   }
 }
 
-/**
- * A list of variables that are being declared in a context where a statement is
- * required.
- *
- *    variableDeclarationStatement ::=
- *        [VariableDeclarationList] ';'
- */
+/// A list of variables that are being declared in a context where a statement
+/// is required.
+///
+///    variableDeclarationStatement ::=
+///        [VariableDeclarationList] ';'
 class VariableDeclarationStatementImpl extends StatementImpl
     implements VariableDeclarationStatement {
-  /**
-   * The variables being declared.
-   */
+  /// The variables being declared.
   VariableDeclarationListImpl _variableList;
 
-  /**
-   * The semicolon terminating the statement.
-   */
+  /// The semicolon terminating the statement.
   Token semicolon;
 
-  /**
-   * Initialize a newly created variable declaration statement.
-   */
+  /// Initialize a newly created variable declaration statement.
   VariableDeclarationStatementImpl(
       VariableDeclarationListImpl variableList, this.semicolon) {
     _variableList = _becomeParentOf(variableList);
@@ -12464,41 +10994,27 @@
   }
 }
 
-/**
- * A while statement.
- *
- *    whileStatement ::=
- *        'while' '(' [Expression] ')' [Statement]
- */
+/// A while statement.
+///
+///    whileStatement ::=
+///        'while' '(' [Expression] ')' [Statement]
 class WhileStatementImpl extends StatementImpl implements WhileStatement {
-  /**
-   * The token representing the 'while' keyword.
-   */
+  /// The token representing the 'while' keyword.
   Token whileKeyword;
 
-  /**
-   * The left parenthesis.
-   */
+  /// The left parenthesis.
   Token leftParenthesis;
 
-  /**
-   * The expression used to determine whether to execute the body of the loop.
-   */
+  /// The expression used to determine whether to execute the body of the loop.
   ExpressionImpl _condition;
 
-  /**
-   * The right parenthesis.
-   */
+  /// The right parenthesis.
   Token rightParenthesis;
 
-  /**
-   * The body of the loop.
-   */
+  /// The body of the loop.
   StatementImpl _body;
 
-  /**
-   * Initialize a newly created while statement.
-   */
+  /// Initialize a newly created while statement.
   WhileStatementImpl(this.whileKeyword, this.leftParenthesis,
       ExpressionImpl condition, this.rightParenthesis, StatementImpl body) {
     _condition = _becomeParentOf(condition);
@@ -12545,26 +11061,18 @@
   }
 }
 
-/**
- * The with clause in a class declaration.
- *
- *    withClause ::=
- *        'with' [TypeName] (',' [TypeName])*
- */
+/// The with clause in a class declaration.
+///
+///    withClause ::=
+///        'with' [TypeName] (',' [TypeName])*
 class WithClauseImpl extends AstNodeImpl implements WithClause {
-  /**
-   * The token representing the 'with' keyword.
-   */
+  /// The token representing the 'with' keyword.
   Token withKeyword;
 
-  /**
-   * The names of the mixins that were specified.
-   */
+  /// The names of the mixins that were specified.
   NodeList<TypeName> _mixinTypes;
 
-  /**
-   * Initialize a newly created with clause.
-   */
+  /// Initialize a newly created with clause.
   WithClauseImpl(this.withKeyword, List<TypeName> mixinTypes) {
     _mixinTypes = new NodeListImpl<TypeName>(this, mixinTypes);
   }
@@ -12593,37 +11101,25 @@
   }
 }
 
-/**
- * A yield statement.
- *
- *    yieldStatement ::=
- *        'yield' '*'? [Expression] ‘;’
- */
+/// A yield statement.
+///
+///    yieldStatement ::=
+///        'yield' '*'? [Expression] ‘;’
 class YieldStatementImpl extends StatementImpl implements YieldStatement {
-  /**
-   * The 'yield' keyword.
-   */
+  /// The 'yield' keyword.
   Token yieldKeyword;
 
-  /**
-   * The star optionally following the 'yield' keyword.
-   */
+  /// The star optionally following the 'yield' keyword.
   Token star;
 
-  /**
-   * The expression whose value will be yielded.
-   */
+  /// The expression whose value will be yielded.
   ExpressionImpl _expression;
 
-  /**
-   * The semicolon following the expression.
-   */
+  /// The semicolon following the expression.
   Token semicolon;
 
-  /**
-   * Initialize a newly created yield expression. The [star] can be `null` if no
-   * star was provided.
-   */
+  /// Initialize a newly created yield expression. The [star] can be `null` if
+  /// no star was provided.
   YieldStatementImpl(
       this.yieldKeyword, this.star, ExpressionImpl expression, this.semicolon) {
     _expression = _becomeParentOf(expression);
@@ -12668,3 +11164,19 @@
     _expression?.accept(visitor);
   }
 }
+
+/// An indication of the resolved kind of a [SetOrMapLiteral].
+enum _SetOrMapKind {
+  /// Indicates that the literal represents a map.
+  map,
+
+  /// Indicates that the literal represents a set.
+  set,
+
+  /// Indicates that either
+  /// - the literal is syntactically ambiguous and resolution has not yet been
+  ///   performed, or
+  /// - the literal is invalid because resolution was not able to resolve the
+  ///   ambiguity.
+  unresolved
+}
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index 4e04999..3c4ba3e 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -69,6 +69,7 @@
   BinaryExpression binaryExpression(
           Expression leftOperand, Token operator, Expression rightOperand) =>
       new BinaryExpressionImpl(leftOperand, operator, rightOperand);
+
   @override
   Block block(
           Token leftBracket, List<Statement> statements, Token rightBracket) =>
@@ -419,46 +420,6 @@
       new ForEachPartsWithIdentifierImpl(identifier, inKeyword, iterable);
 
   @override
-  ForEachStatement forEachStatementWithDeclaration(
-          Token awaitKeyword,
-          Token forKeyword,
-          Token leftParenthesis,
-          DeclaredIdentifier loopVariable,
-          Token inKeyword,
-          Expression iterator,
-          Token rightParenthesis,
-          Statement body) =>
-      new ForEachStatementImpl.withDeclaration(
-          awaitKeyword,
-          forKeyword,
-          leftParenthesis,
-          loopVariable,
-          inKeyword,
-          iterator,
-          rightParenthesis,
-          body);
-
-  @override
-  ForEachStatement forEachStatementWithReference(
-          Token awaitKeyword,
-          Token forKeyword,
-          Token leftParenthesis,
-          SimpleIdentifier identifier,
-          Token inKeyword,
-          Expression iterator,
-          Token rightParenthesis,
-          Statement body) =>
-      new ForEachStatementImpl.withReference(
-          awaitKeyword,
-          forKeyword,
-          leftParenthesis,
-          identifier,
-          inKeyword,
-          iterator,
-          rightParenthesis,
-          body);
-
-  @override
   ForElement forElement(
           {Token awaitKeyword,
           Token forKeyword,
@@ -500,39 +461,25 @@
           initialization, leftSeparator, condition, rightSeparator, updaters);
 
   @override
-  ForStatement forStatement(
-          Token forKeyword,
-          Token leftParenthesis,
-          VariableDeclarationList variableList,
-          Expression initialization,
-          Token leftSeparator,
-          Expression condition,
-          Token rightSeparator,
-          List<Expression> updaters,
-          Token rightParenthesis,
-          Statement body) =>
-      new ForStatementImpl(
-          forKeyword,
-          leftParenthesis,
-          variableList,
-          initialization,
-          leftSeparator,
-          condition,
-          rightSeparator,
-          updaters,
-          rightParenthesis,
-          body);
-
-  @override
   ForStatement2 forStatement2(
-          {Token awaitKeyword,
-          Token forKeyword,
-          Token leftParenthesis,
-          ForLoopParts forLoopParts,
-          Token rightParenthesis,
-          Statement body}) =>
-      new ForStatement2Impl(awaitKeyword, forKeyword, leftParenthesis,
-          forLoopParts, rightParenthesis, body);
+      {Token awaitKeyword,
+      Token forKeyword,
+      Token leftParenthesis,
+      ForLoopParts forLoopParts,
+      Token rightParenthesis,
+      Statement body}) {
+    if (forLoopParts is ForEachParts) {
+      // ignore: deprecated_member_use_from_same_package
+      return ForEachStatementImpl.withParts(awaitKeyword, forKeyword,
+          leftParenthesis, forLoopParts, rightParenthesis, body);
+    } else if (forLoopParts is ForParts) {
+      // ignore: deprecated_member_use_from_same_package
+      return ForStatementImpl.withParts(awaitKeyword, forKeyword,
+          leftParenthesis, forLoopParts, rightParenthesis, body);
+    } else {
+      throw new StateError('Unrecognized for loop parts');
+    }
+  }
 
   @override
   FunctionDeclaration functionDeclaration(
@@ -737,10 +684,16 @@
 
   @override
   ListLiteral listLiteral(Token constKeyword, TypeArgumentList typeArguments,
-          Token leftBracket, List<Expression> elements, Token rightBracket) =>
-      new ListLiteralImpl(
+      Token leftBracket, List<CollectionElement> elements, Token rightBracket) {
+    if (elements == null || elements is List<Expression>) {
+      return new ListLiteralImpl(
           constKeyword, typeArguments, leftBracket, elements, rightBracket);
+    }
+    return new ListLiteralImpl.experimental(
+        constKeyword, typeArguments, leftBracket, elements, rightBracket);
+  }
 
+  @Deprecated('Use listLiteral')
   @override
   ListLiteral2 listLiteral2(
           {Token constKeyword,
@@ -752,6 +705,7 @@
           constKeyword, typeArguments, leftBracket, elements, rightBracket);
 
   @override
+  @Deprecated('Use setOrMapLiteral')
   MapLiteral mapLiteral(
           Token constKeyword,
           TypeArgumentList typeArguments,
@@ -761,15 +715,16 @@
       new MapLiteralImpl(
           constKeyword, typeArguments, leftBracket, entries, rightBracket);
 
+  @deprecated
   @override
   MapLiteral2 mapLiteral2(
-          {Token constKeyword,
-          TypeArgumentList typeArguments,
-          Token leftBracket,
-          List<CollectionElement> entries,
-          Token rightBracket}) =>
-      new MapLiteral2Impl(
-          constKeyword, typeArguments, leftBracket, entries, rightBracket);
+      {Token constKeyword,
+      TypeArgumentList typeArguments,
+      Token leftBracket,
+      List<CollectionElement> entries,
+      Token rightBracket}) {
+    throw new UnsupportedError('Not supported');
+  }
 
   @override
   MapLiteralEntry mapLiteralEntry(
@@ -923,19 +878,31 @@
   ScriptTag scriptTag(Token scriptTag) => new ScriptTagImpl(scriptTag);
 
   @override
+  @Deprecated('Use setOrMapLiteral')
   SetLiteral setLiteral(Token constKeyword, TypeArgumentList typeArguments,
           Token leftBracket, List<Expression> elements, Token rightBracket) =>
       new SetLiteralImpl(
           constKeyword, typeArguments, leftBracket, elements, rightBracket);
 
+  @deprecated
   @override
   SetLiteral2 setLiteral2(
+      {Token constKeyword,
+      TypeArgumentList typeArguments,
+      Token leftBracket,
+      List<CollectionElement> elements,
+      Token rightBracket}) {
+    throw new UnsupportedError('Not supported');
+  }
+
+  @override
+  SetOrMapLiteral setOrMapLiteral(
           {Token constKeyword,
           TypeArgumentList typeArguments,
           Token leftBracket,
           List<CollectionElement> elements,
           Token rightBracket}) =>
-      new SetLiteral2Impl(
+      new SetOrMapLiteralImpl(
           constKeyword, typeArguments, leftBracket, elements, rightBracket);
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/ast/constant_evaluator.dart b/pkg/analyzer/lib/src/dart/ast/constant_evaluator.dart
index 052c2fe..b6b9169 100644
--- a/pkg/analyzer/lib/src/dart/ast/constant_evaluator.dart
+++ b/pkg/analyzer/lib/src/dart/ast/constant_evaluator.dart
@@ -261,17 +261,24 @@
   @override
   Object visitListLiteral(ListLiteral node) {
     List<Object> list = new List<Object>();
-    for (Expression element in node.elements) {
-      Object value = element.accept(this);
-      if (identical(value, NOT_A_CONSTANT)) {
-        return value;
+    for (CollectionElement element in node.elements2) {
+      if (element is Expression) {
+        Object value = element.accept(this);
+        if (identical(value, NOT_A_CONSTANT)) {
+          return value;
+        }
+        list.add(value);
+      } else {
+        // There are a lot of constants that this class does not support, so we
+        // didn't add support for the extended collection support.
+        return NOT_A_CONSTANT;
       }
-      list.add(value);
     }
     return list;
   }
 
   @override
+  @deprecated
   Object visitMapLiteral(MapLiteral node) {
     Map<String, Object> map = new HashMap<String, Object>();
     for (MapLiteralEntry entry in node.entries) {
@@ -336,6 +343,33 @@
   Object visitPropertyAccess(PropertyAccess node) => _getConstantValue(null);
 
   @override
+  Object visitSetOrMapLiteral(SetOrMapLiteral node) {
+    if (node.isMap) {
+      Map<String, Object> map = new HashMap<String, Object>();
+      for (CollectionElement element in node.elements2) {
+        if (element is MapLiteralEntry) {
+          Object key = element.key.accept(this);
+          Object value = element.value.accept(this);
+          if (key is String && !identical(value, NOT_A_CONSTANT)) {
+            map[key] = value;
+          } else {
+            return NOT_A_CONSTANT;
+          }
+        } else {
+          // There are a lot of constants that this class does not support, so
+          // we didn't add support for the extended collection support.
+          return NOT_A_CONSTANT;
+        }
+      }
+      return map;
+    } else if (node.isSet) {
+      // There are a lot of constants that this class does not support, so
+      // we didn't add support for set literals.
+    }
+    return NOT_A_CONSTANT;
+  }
+
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) =>
       _getConstantValue(null);
 
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 59cec6b..9588569 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -30,7 +30,9 @@
  * will only clone the structure, it will not preserve any resolution results or
  * properties associated with the nodes.
  */
-class AstCloner implements AstVisitor<AstNode> {
+class AstCloner
+    with UIAsCodeVisitorMixin<AstNode>
+    implements AstVisitor<AstNode> {
   /**
    * A flag indicating whether tokens should be cloned while cloning an AST
    * structure.
@@ -487,31 +489,6 @@
           iterable: cloneNode(node.iterable));
 
   @override
-  ForEachStatement visitForEachStatement(ForEachStatement node) {
-    DeclaredIdentifier loopVariable = node.loopVariable;
-    if (loopVariable == null) {
-      return astFactory.forEachStatementWithReference(
-          cloneToken(node.awaitKeyword),
-          cloneToken(node.forKeyword),
-          cloneToken(node.leftParenthesis),
-          cloneNode(node.identifier),
-          cloneToken(node.inKeyword),
-          cloneNode(node.iterable),
-          cloneToken(node.rightParenthesis),
-          cloneNode(node.body));
-    }
-    return astFactory.forEachStatementWithDeclaration(
-        cloneToken(node.awaitKeyword),
-        cloneToken(node.forKeyword),
-        cloneToken(node.leftParenthesis),
-        cloneNode(loopVariable),
-        cloneToken(node.inKeyword),
-        cloneNode(node.iterable),
-        cloneToken(node.rightParenthesis),
-        cloneNode(node.body));
-  }
-
-  @override
   ForElement visitForElement(ForElement node) => astFactory.forElement(
       forKeyword: cloneToken(node.forKeyword),
       leftParenthesis: cloneToken(node.leftParenthesis),
@@ -549,21 +526,9 @@
           updaters: cloneNodeList(node.updaters));
 
   @override
-  ForStatement visitForStatement(ForStatement node) => astFactory.forStatement(
-      cloneToken(node.forKeyword),
-      cloneToken(node.leftParenthesis),
-      cloneNode(node.variables),
-      cloneNode(node.initialization),
-      cloneToken(node.leftSeparator),
-      cloneNode(node.condition),
-      cloneToken(node.rightSeparator),
-      cloneNodeList(node.updaters),
-      cloneToken(node.rightParenthesis),
-      cloneNode(node.body));
-
-  @override
   ForStatement2 visitForStatement2(ForStatement2 node) =>
       astFactory.forStatement2(
+          awaitKeyword: cloneToken(node.awaitKeyword),
           forKeyword: cloneToken(node.forKeyword),
           leftParenthesis: cloneToken(node.leftParenthesis),
           forLoopParts: cloneNode(node.forLoopParts),
@@ -764,18 +729,17 @@
       cloneToken(node.constKeyword),
       cloneNode(node.typeArguments),
       cloneToken(node.leftBracket),
-      cloneNodeList(node.elements),
+      cloneNodeList(node.elements2),
       cloneToken(node.rightBracket));
 
+  @deprecated
   @override
-  ListLiteral2 visitListLiteral2(ListLiteral2 node) => astFactory.listLiteral2(
-      constKeyword: cloneToken(node.constKeyword),
-      typeArguments: cloneNode(node.typeArguments),
-      leftBracket: cloneToken(node.leftBracket),
-      elements: cloneNodeList(node.elements),
-      rightBracket: cloneToken(node.rightBracket));
+  ListLiteral2 visitListLiteral2(ListLiteral2 node) {
+    throw new UnsupportedError('Not supported');
+  }
 
   @override
+  @deprecated
   MapLiteral visitMapLiteral(MapLiteral node) => astFactory.mapLiteral(
       cloneToken(node.constKeyword),
       cloneNode(node.typeArguments),
@@ -783,13 +747,11 @@
       cloneNodeList(node.entries),
       cloneToken(node.rightBracket));
 
+  @deprecated
   @override
-  MapLiteral2 visitMapLiteral2(MapLiteral2 node) => astFactory.mapLiteral2(
-      constKeyword: cloneToken(node.constKeyword),
-      typeArguments: cloneNode(node.typeArguments),
-      leftBracket: cloneToken(node.leftBracket),
-      entries: cloneNodeList(node.entries),
-      rightBracket: cloneToken(node.rightBracket));
+  MapLiteral2 visitMapLiteral2(MapLiteral2 node) {
+    throw new UnsupportedError('Not supported');
+  }
 
   @override
   MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) =>
@@ -926,6 +888,7 @@
       astFactory.scriptTag(cloneToken(node.scriptTag));
 
   @override
+  @deprecated
   SetLiteral visitSetLiteral(SetLiteral node) => astFactory.setLiteral(
       cloneToken(node.constKeyword),
       cloneNode(node.typeArguments),
@@ -933,13 +896,20 @@
       cloneNodeList(node.elements),
       cloneToken(node.rightBracket));
 
+  @deprecated
   @override
-  SetLiteral2 visitSetLiteral2(SetLiteral2 node) => astFactory.setLiteral2(
-      constKeyword: cloneToken(node.constKeyword),
-      typeArguments: cloneNode(node.typeArguments),
-      leftBracket: cloneToken(node.leftBracket),
-      elements: cloneNodeList(node.elements),
-      rightBracket: cloneToken(node.rightBracket));
+  SetLiteral2 visitSetLiteral2(SetLiteral2 node) {
+    throw new UnsupportedError('Not supported');
+  }
+
+  @override
+  SetOrMapLiteral visitSetOrMapLiteral(SetOrMapLiteral node) =>
+      astFactory.setOrMapLiteral(
+          constKeyword: cloneToken(node.constKeyword),
+          typeArguments: cloneNode(node.typeArguments),
+          leftBracket: cloneToken(node.leftBracket),
+          elements: cloneNodeList(node.elements2),
+          rightBracket: cloneToken(node.rightBracket));
 
   @override
   ShowCombinator visitShowCombinator(ShowCombinator node) => astFactory
@@ -1171,7 +1141,9 @@
  * An AstVisitor that compares the structure of two AstNodes to see whether they
  * are equal.
  */
-class AstComparator implements AstVisitor<bool> {
+class AstComparator
+    with UIAsCodeVisitorMixin<bool>
+    implements AstVisitor<bool> {
   /**
    * The AST node with which the node being visited is to be compared. This is
    * only valid at the beginning of each visit method (until [isEqualNodes] is
@@ -1673,18 +1645,6 @@
   }
 
   @override
-  bool visitForEachStatement(ForEachStatement node) {
-    ForEachStatement other = _other as ForEachStatement;
-    return isEqualTokens(node.forKeyword, other.forKeyword) &&
-        isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
-        isEqualNodes(node.loopVariable, other.loopVariable) &&
-        isEqualTokens(node.inKeyword, other.inKeyword) &&
-        isEqualNodes(node.iterable, other.iterable) &&
-        isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
-        isEqualNodes(node.body, other.body);
-  }
-
-  @override
   bool visitForElement(ForElement node) {
     ForElement other = _other as ForElement;
     return isEqualTokens(node.forKeyword, other.forKeyword) &&
@@ -1725,21 +1685,6 @@
   }
 
   @override
-  bool visitForStatement(ForStatement node) {
-    ForStatement other = _other as ForStatement;
-    return isEqualTokens(node.forKeyword, other.forKeyword) &&
-        isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
-        isEqualNodes(node.variables, other.variables) &&
-        isEqualNodes(node.initialization, other.initialization) &&
-        isEqualTokens(node.leftSeparator, other.leftSeparator) &&
-        isEqualNodes(node.condition, other.condition) &&
-        isEqualTokens(node.rightSeparator, other.rightSeparator) &&
-        _isEqualNodeLists(node.updaters, other.updaters) &&
-        isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
-        isEqualNodes(node.body, other.body);
-  }
-
-  @override
   bool visitForStatement2(ForStatement2 node) {
     ForStatement2 other = _other as ForStatement2;
     return isEqualTokens(node.forKeyword, other.forKeyword) &&
@@ -1969,38 +1914,20 @@
     return isEqualTokens(node.constKeyword, other.constKeyword) &&
         isEqualNodes(node.typeArguments, other.typeArguments) &&
         isEqualTokens(node.leftBracket, other.leftBracket) &&
-        _isEqualNodeLists(node.elements, other.elements) &&
+        _isEqualNodeLists(node.elements2, other.elements2) &&
         isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
+  @deprecated
   @override
   bool visitListLiteral2(ListLiteral2 node) {
-    ListLiteral2 other = _other as ListLiteral2;
-    return isEqualTokens(node.constKeyword, other.constKeyword) &&
-        isEqualNodes(node.typeArguments, other.typeArguments) &&
-        isEqualTokens(node.leftBracket, other.leftBracket) &&
-        _isEqualNodeLists(node.elements, other.elements) &&
-        isEqualTokens(node.rightBracket, other.rightBracket);
+    throw new UnsupportedError('Not supported');
   }
 
-  @override
-  bool visitMapLiteral(MapLiteral node) {
-    MapLiteral other = _other as MapLiteral;
-    return isEqualTokens(node.constKeyword, other.constKeyword) &&
-        isEqualNodes(node.typeArguments, other.typeArguments) &&
-        isEqualTokens(node.leftBracket, other.leftBracket) &&
-        _isEqualNodeLists(node.entries, other.entries) &&
-        isEqualTokens(node.rightBracket, other.rightBracket);
-  }
-
+  @deprecated
   @override
   bool visitMapLiteral2(MapLiteral2 node) {
-    MapLiteral2 other = _other as MapLiteral2;
-    return isEqualTokens(node.constKeyword, other.constKeyword) &&
-        isEqualNodes(node.typeArguments, other.typeArguments) &&
-        isEqualTokens(node.leftBracket, other.leftBracket) &&
-        _isEqualNodeLists(node.entries, other.entries) &&
-        isEqualTokens(node.rightBracket, other.rightBracket);
+    throw new UnsupportedError('Not supported');
   }
 
   @override
@@ -2180,23 +2107,19 @@
     return isEqualTokens(node.scriptTag, other.scriptTag);
   }
 
+  @deprecated
   @override
-  bool visitSetLiteral(SetLiteral node) {
-    SetLiteral other = _other as SetLiteral;
-    return isEqualTokens(node.constKeyword, other.constKeyword) &&
-        isEqualNodes(node.typeArguments, other.typeArguments) &&
-        isEqualTokens(node.leftBracket, other.leftBracket) &&
-        _isEqualNodeLists(node.elements, other.elements) &&
-        isEqualTokens(node.rightBracket, other.rightBracket);
+  bool visitSetLiteral2(SetLiteral2 node) {
+    throw new UnsupportedError('Not supported');
   }
 
   @override
-  bool visitSetLiteral2(SetLiteral2 node) {
-    SetLiteral2 other = _other as SetLiteral2;
+  bool visitSetOrMapLiteral(SetOrMapLiteral node) {
+    SetOrMapLiteral other = _other as SetOrMapLiteral;
     return isEqualTokens(node.constKeyword, other.constKeyword) &&
         isEqualNodes(node.typeArguments, other.typeArguments) &&
         isEqualTokens(node.leftBracket, other.leftBracket) &&
-        _isEqualNodeLists(node.elements, other.elements) &&
+        _isEqualNodeLists(node.elements2, other.elements2) &&
         isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
@@ -2567,7 +2490,9 @@
  * results.
  */
 @deprecated
-class IncrementalAstCloner implements AstVisitor<AstNode> {
+class IncrementalAstCloner
+    with UIAsCodeVisitorMixin<AstNode>
+    implements AstVisitor<AstNode> {
   /**
    * The node to be replaced during the cloning process.
    */
@@ -2975,31 +2900,6 @@
           iterable: _cloneNode(node.iterable));
 
   @override
-  ForEachStatement visitForEachStatement(ForEachStatement node) {
-    DeclaredIdentifier loopVariable = node.loopVariable;
-    if (loopVariable == null) {
-      return astFactory.forEachStatementWithReference(
-          _mapToken(node.awaitKeyword),
-          _mapToken(node.forKeyword),
-          _mapToken(node.leftParenthesis),
-          _cloneNode(node.identifier),
-          _mapToken(node.inKeyword),
-          _cloneNode(node.iterable),
-          _mapToken(node.rightParenthesis),
-          _cloneNode(node.body));
-    }
-    return astFactory.forEachStatementWithDeclaration(
-        _mapToken(node.awaitKeyword),
-        _mapToken(node.forKeyword),
-        _mapToken(node.leftParenthesis),
-        _cloneNode(loopVariable),
-        _mapToken(node.inKeyword),
-        _cloneNode(node.iterable),
-        _mapToken(node.rightParenthesis),
-        _cloneNode(node.body));
-  }
-
-  @override
   ForElement visitForElement(ForElement node) => astFactory.forElement(
       forKeyword: _mapToken(node.forKeyword),
       leftParenthesis: _mapToken(node.leftParenthesis),
@@ -3037,19 +2937,6 @@
           updaters: _cloneNodeList(node.updaters));
 
   @override
-  ForStatement visitForStatement(ForStatement node) => astFactory.forStatement(
-      _mapToken(node.forKeyword),
-      _mapToken(node.leftParenthesis),
-      _cloneNode(node.variables),
-      _cloneNode(node.initialization),
-      _mapToken(node.leftSeparator),
-      _cloneNode(node.condition),
-      _mapToken(node.rightSeparator),
-      _cloneNodeList(node.updaters),
-      _mapToken(node.rightParenthesis),
-      _cloneNode(node.body));
-
-  @override
   ForStatement2 visitForStatement2(ForStatement2 node) =>
       astFactory.forStatement2(
           forKeyword: _mapToken(node.forKeyword),
@@ -3289,7 +3176,7 @@
         _mapToken(node.constKeyword),
         _cloneNode(node.typeArguments),
         _mapToken(node.leftBracket),
-        _cloneNodeList(node.elements),
+        _cloneNodeList(node.elements2),
         _mapToken(node.rightBracket));
     copy.staticType = node.staticType;
     return copy;
@@ -3315,13 +3202,11 @@
     return copy;
   }
 
+  @deprecated
   @override
-  MapLiteral2 visitMapLiteral2(MapLiteral2 node) => astFactory.mapLiteral2(
-      constKeyword: _mapToken(node.constKeyword),
-      typeArguments: _cloneNode(node.typeArguments),
-      leftBracket: _mapToken(node.leftBracket),
-      entries: _cloneNodeList(node.entries),
-      rightBracket: _mapToken(node.rightBracket));
+  MapLiteral2 visitMapLiteral2(MapLiteral2 node) {
+    throw new UnsupportedError('Not supported');
+  }
 
   @override
   MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) =>
@@ -3512,13 +3397,23 @@
     return copy;
   }
 
+  @deprecated
   @override
-  SetLiteral2 visitSetLiteral2(SetLiteral2 node) => astFactory.setLiteral2(
-      constKeyword: _mapToken(node.constKeyword),
-      typeArguments: _cloneNode(node.typeArguments),
-      leftBracket: _mapToken(node.leftBracket),
-      elements: _cloneNodeList(node.elements),
-      rightBracket: _mapToken(node.rightBracket));
+  SetLiteral2 visitSetLiteral2(SetLiteral2 node) {
+    throw new UnsupportedError('Not supported');
+  }
+
+  @override
+  SetOrMapLiteral visitSetOrMapLiteral(SetOrMapLiteral node) {
+    SetOrMapLiteral copy = astFactory.setOrMapLiteral(
+        constKeyword: _mapToken(node.constKeyword),
+        typeArguments: _cloneNode(node.typeArguments),
+        leftBracket: _mapToken(node.leftBracket),
+        elements: _cloneNodeList(node.elements2),
+        rightBracket: _mapToken(node.rightBracket));
+    copy.staticType = node.staticType;
+    return copy;
+  }
 
   @override
   ShowCombinator visitShowCombinator(ShowCombinator node) => astFactory
@@ -3970,7 +3865,7 @@
 /**
  * An object that will replace one child node in an AST node with another node.
  */
-class NodeReplacer implements AstVisitor<bool> {
+class NodeReplacer with UIAsCodeVisitorMixin<bool> implements AstVisitor<bool> {
   /**
    * The node being replaced.
    */
@@ -4471,24 +4366,6 @@
   }
 
   @override
-  bool visitForEachStatement(ForEachStatement node) {
-    if (identical(node.loopVariable, _oldNode)) {
-      node.loopVariable = _newNode as DeclaredIdentifier;
-      return true;
-    } else if (identical(node.identifier, _oldNode)) {
-      node.identifier = _newNode as SimpleIdentifier;
-      return true;
-    } else if (identical(node.iterable, _oldNode)) {
-      node.iterable = _newNode as Expression;
-      return true;
-    } else if (identical(node.body, _oldNode)) {
-      node.body = _newNode as Statement;
-      return true;
-    }
-    return visitNode(node);
-  }
-
-  @override
   bool visitForElement(ForElement node) {
     if (identical(node.forLoopParts, _oldNode)) {
       (node as ForElementImpl).forLoopParts = _newNode as ForLoopParts;
@@ -4539,26 +4416,6 @@
   }
 
   @override
-  bool visitForStatement(ForStatement node) {
-    if (identical(node.variables, _oldNode)) {
-      node.variables = _newNode as VariableDeclarationList;
-      return true;
-    } else if (identical(node.initialization, _oldNode)) {
-      node.initialization = _newNode as Expression;
-      return true;
-    } else if (identical(node.condition, _oldNode)) {
-      node.condition = _newNode as Expression;
-      return true;
-    } else if (identical(node.body, _oldNode)) {
-      node.body = _newNode as Statement;
-      return true;
-    } else if (_replaceInList(node.updaters)) {
-      return true;
-    }
-    return visitNode(node);
-  }
-
-  @override
   bool visitForStatement2(ForStatement2 node) {
     if (identical(node.forLoopParts, _oldNode)) {
       (node as ForStatement2Impl).forLoopParts = _newNode as ForLoopParts;
@@ -4825,40 +4682,22 @@
 
   @override
   bool visitListLiteral(ListLiteral node) {
-    if (_replaceInList(node.elements)) {
+    if (_replaceInList(node.elements2)) {
       return true;
     }
     return visitTypedLiteral(node);
   }
 
+  @deprecated
   @override
   bool visitListLiteral2(ListLiteral2 node) {
-    if (identical(node.typeArguments, _oldNode)) {
-      (node as ListLiteral2Impl).typeArguments = _newNode as TypeArgumentList;
-      return true;
-    } else if (_replaceInList(node.elements)) {
-      return true;
-    }
-    return visitNode(node);
+    throw new UnsupportedError('Not supported');
   }
 
-  @override
-  bool visitMapLiteral(MapLiteral node) {
-    if (_replaceInList(node.entries)) {
-      return true;
-    }
-    return visitTypedLiteral(node);
-  }
-
+  @deprecated
   @override
   bool visitMapLiteral2(MapLiteral2 node) {
-    if (identical(node.typeArguments, _oldNode)) {
-      (node as MapLiteral2Impl).typeArguments = _newNode as TypeArgumentList;
-      return true;
-    } else if (_replaceInList(node.entries)) {
-      return true;
-    }
-    return visitNode(node);
+    throw new UnsupportedError('Not supported');
   }
 
   @override
@@ -5089,23 +4928,18 @@
   @override
   bool visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
 
+  @deprecated
   @override
-  bool visitSetLiteral(SetLiteral node) {
-    if (_replaceInList(node.elements)) {
-      return true;
-    }
-    return visitTypedLiteral(node);
+  bool visitSetLiteral2(SetLiteral2 node) {
+    throw new UnsupportedError('Not supported');
   }
 
   @override
-  bool visitSetLiteral2(SetLiteral2 node) {
-    if (identical(node.typeArguments, _oldNode)) {
-      (node as SetLiteral2Impl).typeArguments = _newNode as TypeArgumentList;
-      return true;
-    } else if (_replaceInList(node.elements)) {
+  bool visitSetOrMapLiteral(SetOrMapLiteral node) {
+    if (_replaceInList(node.elements2)) {
       return true;
     }
-    return visitNode(node);
+    return visitTypedLiteral(node);
   }
 
   @override
@@ -5388,7 +5222,9 @@
  * another as long as the structures of the corresponding children of a pair of
  * nodes are the same.
  */
-class ResolutionCopier implements AstVisitor<bool> {
+class ResolutionCopier
+    with UIAsCodeVisitorMixin<bool>
+    implements AstVisitor<bool> {
   /**
    * The AST node with which the node being visited is to be compared. This is
    * only valid at the beginning of each visit method (until [isEqualNodes] is
@@ -5897,6 +5733,7 @@
   }
 
   @override
+  @deprecated
   bool visitForEachStatement(ForEachStatement node) {
     ForEachStatement toNode = this._toNode as ForEachStatement;
     return _and(
@@ -5955,6 +5792,7 @@
   }
 
   @override
+  @deprecated
   bool visitForStatement(ForStatement node) {
     ForStatement toNode = this._toNode as ForStatement;
     return _and(
@@ -6264,7 +6102,7 @@
         _isEqualTokens(node.constKeyword, toNode.constKeyword),
         _isEqualNodes(node.typeArguments, toNode.typeArguments),
         _isEqualTokens(node.leftBracket, toNode.leftBracket),
-        _isEqualNodeLists(node.elements, toNode.elements),
+        _isEqualNodeLists(node.elements2, toNode.elements2),
         _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
       toNode.staticType = node.staticType;
       return true;
@@ -6272,22 +6110,14 @@
     return false;
   }
 
+  @deprecated
   @override
   bool visitListLiteral2(ListLiteral2 node) {
-    ListLiteral2 toNode = this._toNode as ListLiteral2;
-    if (_and(
-        _isEqualTokens(node.constKeyword, toNode.constKeyword),
-        _isEqualNodes(node.typeArguments, toNode.typeArguments),
-        _isEqualTokens(node.leftBracket, toNode.leftBracket),
-        _isEqualNodeLists(node.elements, toNode.elements),
-        _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
-      toNode.staticType = node.staticType;
-      return true;
-    }
-    return false;
+    throw new UnsupportedError('Not supported');
   }
 
   @override
+  @deprecated
   bool visitMapLiteral(MapLiteral node) {
     MapLiteral toNode = this._toNode as MapLiteral;
     if (_and(
@@ -6302,19 +6132,10 @@
     return false;
   }
 
+  @deprecated
   @override
   bool visitMapLiteral2(MapLiteral2 node) {
-    MapLiteral2 toNode = this._toNode as MapLiteral2;
-    if (_and(
-        _isEqualTokens(node.constKeyword, toNode.constKeyword),
-        _isEqualNodes(node.typeArguments, toNode.typeArguments),
-        _isEqualTokens(node.leftBracket, toNode.leftBracket),
-        _isEqualNodeLists(node.entries, toNode.entries),
-        _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
-      toNode.staticType = node.staticType;
-      return true;
-    }
-    return false;
+    throw new UnsupportedError('Not supported');
   }
 
   @override
@@ -6556,6 +6377,7 @@
   }
 
   @override
+  @deprecated
   bool visitSetLiteral(SetLiteral node) {
     SetLiteral toNode = this._toNode as SetLiteral;
     if (_and(
@@ -6570,14 +6392,20 @@
     return false;
   }
 
+  @deprecated
   @override
   bool visitSetLiteral2(SetLiteral2 node) {
-    SetLiteral2 toNode = this._toNode as SetLiteral2;
+    throw new UnsupportedError('Not supported');
+  }
+
+  @override
+  bool visitSetOrMapLiteral(SetOrMapLiteral node) {
+    SetOrMapLiteral toNode = this._toNode as SetOrMapLiteral;
     if (_and(
         _isEqualTokens(node.constKeyword, toNode.constKeyword),
         _isEqualNodes(node.typeArguments, toNode.typeArguments),
         _isEqualTokens(node.leftBracket, toNode.leftBracket),
-        _isEqualNodeLists(node.elements, toNode.elements),
+        _isEqualNodeLists(node.elements2, toNode.elements2),
         _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
       toNode.staticType = node.staticType;
       return true;
@@ -7045,6 +6873,7 @@
   }
 
   @override
+  @deprecated
   void visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (loopVariable != null) {
@@ -7060,6 +6889,7 @@
   }
 
   @override
+  @deprecated
   void visitForStatement(ForStatement node) {
     if (!identical(_immediateChild, node.variables) && node.variables != null) {
       _addVariables(node.variables.variables);
@@ -7181,7 +7011,9 @@
  * This class has been deprecated. Use the class ToSourceVisitor2 instead.
  */
 @deprecated
-class ToSourceVisitor implements AstVisitor<void> {
+class ToSourceVisitor
+    with UIAsCodeVisitorMixin<void>
+    implements AstVisitor<void> {
   /**
    * The writer to which the source is to be written.
    */
@@ -7503,7 +7335,7 @@
       _writer.print(keyword.lexeme);
       _writer.print(' ');
     }
-    _writer.print("=> ");
+    _writer.print('${node.functionDefinition?.lexeme} ');
     _visitNode(node.expression);
     if (node.semicolon != null) {
       _writer.print(';');
@@ -7557,25 +7389,8 @@
   }
 
   @override
-  void visitForEachStatement(ForEachStatement node) {
-    DeclaredIdentifier loopVariable = node.loopVariable;
-    if (node.awaitKeyword != null) {
-      _writer.print("await ");
-    }
-    _writer.print("for (");
-    if (loopVariable == null) {
-      _visitNode(node.identifier);
-    } else {
-      _visitNode(loopVariable);
-    }
-    _writer.print(" in ");
-    _visitNode(node.iterable);
-    _writer.print(") ");
-    _visitNode(node.body);
-  }
-
-  @override
   void visitForElement(ForElement node) {
+    _visitTokenWithSuffix(node.awaitKeyword, ' ');
     _writer.print('for (');
     _visitNode(node.forLoopParts);
     _writer.print(') ');
@@ -7629,24 +7444,10 @@
   }
 
   @override
-  void visitForStatement(ForStatement node) {
-    Expression initialization = node.initialization;
-    _writer.print("for (");
-    if (initialization != null) {
-      _visitNode(initialization);
-    } else {
-      _visitNode(node.variables);
-    }
-    _writer.print(";");
-    _visitNodeWithPrefix(" ", node.condition);
-    _writer.print(";");
-    _visitNodeListWithSeparatorAndPrefix(" ", node.updaters, ", ");
-    _writer.print(") ");
-    _visitNode(node.body);
-  }
-
-  @override
   void visitForStatement2(ForStatement2 node) {
+    if (node.awaitKeyword != null) {
+      _writer.print('await ');
+    }
     _writer.print('for (');
     _visitNode(node.forLoopParts);
     _writer.print(') ');
@@ -7849,44 +7650,23 @@
 
   @override
   void visitListLiteral(ListLiteral node) {
-    if (node.constKeyword != null) {
-      _writer.print(node.constKeyword.lexeme);
-      _writer.print(' ');
-    }
-    _visitNodeWithSuffix(node.typeArguments, " ");
-    _writer.print("[");
-    _visitNodeListWithSeparator(node.elements, ", ");
-    _writer.print("]");
-  }
-
-  @override
-  void visitListLiteral2(ListLiteral2 node) {
     _visitTokenWithSuffix(node.constKeyword, ' ');
     _visitNode(node.typeArguments);
     _writer.print('[');
-    _visitNodeListWithSeparator(node.elements, ', ');
+    _visitNodeListWithSeparator(node.elements2, ', ');
     _writer.print(']');
   }
 
+  @deprecated
   @override
-  void visitMapLiteral(MapLiteral node) {
-    if (node.constKeyword != null) {
-      _writer.print(node.constKeyword.lexeme);
-      _writer.print(' ');
-    }
-    _visitNodeWithSuffix(node.typeArguments, " ");
-    _writer.print("{");
-    _visitNodeListWithSeparator(node.entries, ", ");
-    _writer.print("}");
+  void visitListLiteral2(ListLiteral2 node) {
+    throw new UnsupportedError('Not supported');
   }
 
+  @deprecated
   @override
   void visitMapLiteral2(MapLiteral2 node) {
-    _visitTokenWithSuffix(node.constKeyword, ' ');
-    _visitNode(node.typeArguments);
-    _writer.print('{');
-    _visitNodeListWithSeparator(node.entries, ', ');
-    _writer.print('}');
+    throw new UnsupportedError('Not supported');
   }
 
   @override
@@ -8053,24 +7833,21 @@
     _writer.print(node.scriptTag.lexeme);
   }
 
+  @deprecated
   @override
-  void visitSetLiteral(SetLiteral node) {
+  void visitSetLiteral2(SetLiteral2 node) {
+    throw new UnsupportedError('Not supported');
+  }
+
+  @override
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
     if (node.constKeyword != null) {
       _writer.print(node.constKeyword.lexeme);
       _writer.print(' ');
     }
-    _visitNodeWithSuffix(node.typeArguments, " ");
-    _writer.print("{");
-    _visitNodeListWithSeparator(node.elements, ", ");
-    _writer.print("}");
-  }
-
-  @override
-  void visitSetLiteral2(SetLiteral2 node) {
-    _visitTokenWithSuffix(node.constKeyword, ' ');
     _visitNode(node.typeArguments);
     _writer.print('{');
-    _visitNodeListWithSeparator(node.elements, ', ');
+    _visitNodeListWithSeparator(node.elements2, ', ');
     _writer.print('}');
   }
 
@@ -8382,7 +8159,9 @@
  * A visitor used to write a source representation of a visited AST node (and
  * all of it's children) to a sink.
  */
-class ToSourceVisitor2 implements AstVisitor<void> {
+class ToSourceVisitor2
+    with UIAsCodeVisitorMixin<void>
+    implements AstVisitor<void> {
   /**
    * The sink to which the source is to be written.
    */
@@ -8830,7 +8609,7 @@
       sink.write(keyword.lexeme);
       sink.write(' ');
     }
-    sink.write("=> ");
+    sink.write('${node.functionDefinition?.lexeme} ');
     safelyVisitNode(node.expression);
     if (node.semicolon != null) {
       sink.write(';');
@@ -8884,25 +8663,8 @@
   }
 
   @override
-  void visitForEachStatement(ForEachStatement node) {
-    DeclaredIdentifier loopVariable = node.loopVariable;
-    if (node.awaitKeyword != null) {
-      sink.write("await ");
-    }
-    sink.write("for (");
-    if (loopVariable == null) {
-      safelyVisitNode(node.identifier);
-    } else {
-      safelyVisitNode(loopVariable);
-    }
-    sink.write(" in ");
-    safelyVisitNode(node.iterable);
-    sink.write(") ");
-    safelyVisitNode(node.body);
-  }
-
-  @override
   void visitForElement(ForElement node) {
+    safelyVisitTokenWithSuffix(node.awaitKeyword, ' ');
     sink.write('for (');
     safelyVisitNode(node.forLoopParts);
     sink.write(') ');
@@ -8956,24 +8718,10 @@
   }
 
   @override
-  void visitForStatement(ForStatement node) {
-    Expression initialization = node.initialization;
-    sink.write("for (");
-    if (initialization != null) {
-      safelyVisitNode(initialization);
-    } else {
-      safelyVisitNode(node.variables);
-    }
-    sink.write(";");
-    safelyVisitNodeWithPrefix(" ", node.condition);
-    sink.write(";");
-    safelyVisitNodeListWithSeparatorAndPrefix(" ", node.updaters, ", ");
-    sink.write(") ");
-    safelyVisitNode(node.body);
-  }
-
-  @override
   void visitForStatement2(ForStatement2 node) {
+    if (node.awaitKeyword != null) {
+      sink.write('await ');
+    }
     sink.write('for (');
     safelyVisitNode(node.forLoopParts);
     sink.write(') ');
@@ -9177,37 +8925,22 @@
   @override
   void visitListLiteral(ListLiteral node) {
     safelyVisitTokenWithSuffix(node.constKeyword, ' ');
-    safelyVisitNodeWithSuffix(node.typeArguments, " ");
-    sink.write("[");
-    safelyVisitNodeListWithSeparator(node.elements, ", ");
-    sink.write("]");
-  }
-
-  @override
-  void visitListLiteral2(ListLiteral2 node) {
-    safelyVisitTokenWithSuffix(node.constKeyword, ' ');
     safelyVisitNode(node.typeArguments);
     sink.write('[');
-    safelyVisitNodeListWithSeparator(node.elements, ', ');
+    safelyVisitNodeListWithSeparator(node.elements2, ', ');
     sink.write(']');
   }
 
+  @deprecated
   @override
-  void visitMapLiteral(MapLiteral node) {
-    safelyVisitTokenWithSuffix(node.constKeyword, ' ');
-    safelyVisitNodeWithSuffix(node.typeArguments, " ");
-    sink.write("{");
-    safelyVisitNodeListWithSeparator(node.entries, ", ");
-    sink.write("}");
+  void visitListLiteral2(ListLiteral2 node) {
+    throw new UnsupportedError('Not supported');
   }
 
+  @deprecated
   @override
   void visitMapLiteral2(MapLiteral2 node) {
-    safelyVisitTokenWithSuffix(node.constKeyword, ' ');
-    safelyVisitNode(node.typeArguments);
-    sink.write('{');
-    safelyVisitNodeListWithSeparator(node.entries, ', ');
-    sink.write('}');
+    throw new UnsupportedError('Not supported');
   }
 
   @override
@@ -9374,21 +9107,18 @@
     sink.write(node.scriptTag.lexeme);
   }
 
+  @deprecated
   @override
-  void visitSetLiteral(SetLiteral node) {
-    safelyVisitTokenWithSuffix(node.constKeyword, ' ');
-    safelyVisitNodeWithSuffix(node.typeArguments, " ");
-    sink.write("{");
-    safelyVisitNodeListWithSeparator(node.elements, ", ");
-    sink.write("}");
+  void visitSetLiteral2(SetLiteral2 node) {
+    throw new UnsupportedError('Not supported');
   }
 
   @override
-  void visitSetLiteral2(SetLiteral2 node) {
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
     safelyVisitTokenWithSuffix(node.constKeyword, ' ');
     safelyVisitNode(node.typeArguments);
     sink.write('{');
-    safelyVisitNodeListWithSeparator(node.elements, ', ');
+    safelyVisitNodeListWithSeparator(node.elements2, ', ');
     sink.write('}');
   }
 
@@ -9582,7 +9312,7 @@
 
   void _writeOperand(Expression node, Expression operand) {
     if (operand != null) {
-      bool needsParenthesis = operand.precedence < node.precedence;
+      bool needsParenthesis = operand.precedence2 < node.precedence2;
       if (needsParenthesis) {
         sink.write('(');
       }
@@ -9593,3 +9323,45 @@
     }
   }
 }
+
+/// Mixin allowing visitor classes to forward visit methods for AST structures
+/// that will be deleted as part of the implementation of the "UI as code"
+/// feature.
+///
+/// We will be removing the classes `ForEachStatement`, `ForStatement`,
+/// `MapLiteral`, and `SetLiteral` as part of implementing the "UI as code"
+/// feature.  In order to allow this change to be rolled out to clients in a
+/// staged fashion, we first update each visitor so that it forwards the old
+/// visit methods to their new counterparts; this will allow clients to begin
+/// rewriting their visitors in terms of the new data structures now.
+///
+/// This mixin exists so that we don't have to duplicate the forwarding logic in
+/// every concrete visitor class.
+///
+/// This class will be removed when the above classes (and their corresponding
+/// visit methods) are removed.
+mixin UIAsCodeVisitorMixin<R> implements AstVisitor<R> {
+  @override
+  @deprecated
+  R visitForEachStatement(ForEachStatement node) {
+    return visitForStatement2(node);
+  }
+
+  @override
+  @deprecated
+  R visitForStatement(ForStatement node) {
+    return visitForStatement2(node);
+  }
+
+  @override
+  @deprecated
+  R visitMapLiteral(MapLiteral node) {
+    return visitSetOrMapLiteral(node);
+  }
+
+  @override
+  @deprecated
+  R visitSetLiteral(SetLiteral node) {
+    return visitSetOrMapLiteral(node);
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index 024eca2..3373f64 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -143,11 +143,15 @@
   void visitListLiteral(ListLiteral node) {
     super.visitListLiteral(node);
     if (node.isConst) {
-      DartObjectImpl result;
-      for (Expression element in node.elements) {
-        result =
-            _validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT);
-        if (result != null) {
+      // Dummy sets of keys to accommodate the fact that
+      // `_validateCollectionElement` handles map literals.
+      HashSet<DartObject> keys = new HashSet<DartObject>();
+      List<Expression> invalidKeys = new List<Expression>();
+      for (CollectionElement element in node.elements2) {
+        bool isValid = _validateCollectionElement(element, true, keys,
+            invalidKeys, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT);
+        if (isValid && element is Expression) {
+          // TODO(brianwilkerson) Handle the other kinds of elements.
           _reportErrorIfFromDeferredLibrary(
               element,
               CompileTimeErrorCode
@@ -158,101 +162,79 @@
   }
 
   @override
-  void visitMapLiteral(MapLiteral node) {
-    super.visitMapLiteral(node);
-    bool isConst = node.isConst;
-    bool reportEqualKeys = true;
-    HashSet<DartObject> keys = new HashSet<DartObject>();
-    List<Expression> invalidKeys = new List<Expression>();
-    for (MapLiteralEntry entry in node.entries) {
-      Expression key = entry.key;
-      if (isConst) {
-        DartObjectImpl keyResult =
-            _validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
-        Expression valueExpression = entry.value;
-        DartObjectImpl valueResult = _validate(
-            valueExpression, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
-        if (valueResult != null) {
-          _reportErrorIfFromDeferredLibrary(
-              valueExpression,
-              CompileTimeErrorCode
-                  .NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY);
-        }
-        if (keyResult != null) {
-          _reportErrorIfFromDeferredLibrary(key,
-              CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY);
-          if (!keys.add(keyResult)) {
-            invalidKeys.add(key);
-          }
-          DartType type = keyResult.type;
-          if (_implementsEqualsWhenNotAllowed(type)) {
-            _errorReporter.reportErrorForNode(
-                CompileTimeErrorCode
-                    .CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
-                key,
-                [type.displayName]);
-          }
-        }
-      } else {
-        // Note: we throw the errors away because this isn't actually a const.
-        AnalysisErrorListener errorListener =
-            AnalysisErrorListener.NULL_LISTENER;
-        ErrorReporter subErrorReporter =
-            new ErrorReporter(errorListener, _errorReporter.source);
-        DartObjectImpl result = key
-            .accept(new ConstantVisitor(_evaluationEngine, subErrorReporter));
-        if (result != null) {
-          if (!keys.add(result)) {
-            invalidKeys.add(key);
-          }
-        } else {
-          reportEqualKeys = false;
-        }
-      }
-    }
-    if (reportEqualKeys) {
-      for (int i = 0; i < invalidKeys.length; i++) {
-        _errorReporter.reportErrorForNode(
-            StaticWarningCode.EQUAL_KEYS_IN_MAP, invalidKeys[i]);
-      }
-    }
-  }
-
-  @override
   void visitMethodDeclaration(MethodDeclaration node) {
     super.visitMethodDeclaration(node);
     _validateDefaultValues(node.parameters);
   }
 
   @override
-  void visitSetLiteral(SetLiteral node) {
-    super.visitSetLiteral(node);
-    HashSet<DartObject> elements = new HashSet<DartObject>();
-    List<Expression> invalidElements = new List<Expression>();
-    if (node.isConst) {
-      for (Expression element in node.elements) {
-        DartObjectImpl result =
-            _validate(element, CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT);
-        if (result != null) {
-          _reportErrorIfFromDeferredLibrary(
-              element,
-              CompileTimeErrorCode
-                  .NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY);
-          if (!elements.add(result)) {
-            invalidElements.add(element);
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
+    super.visitSetOrMapLiteral(node);
+    bool isConst = node.isConst;
+    HashSet<DartObject> keys = new HashSet<DartObject>();
+    List<Expression> invalidKeys = new List<Expression>();
+    if (node.isSet) {
+      HashSet<DartObject> elements = new HashSet<DartObject>();
+      List<Expression> invalidElements = new List<Expression>();
+      if (isConst) {
+        for (CollectionElement element in node.elements2) {
+          if (element is Expression) {
+            // TODO(mfairhurst): unify this with _validateCollectionElemet
+            DartObject result = _validate(
+                element, CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT);
+            if (result != null) {
+              _reportErrorIfFromDeferredLibrary(
+                  element,
+                  CompileTimeErrorCode
+                      .NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY);
+              if (!elements.add(result)) {
+                invalidElements.add(element);
+              }
+              DartType type = result.type;
+              if (_implementsEqualsWhenNotAllowed(type)) {
+                _errorReporter.reportErrorForNode(
+                    CompileTimeErrorCode
+                        .CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS,
+                    element,
+                    [type.displayName]);
+              }
+            }
+          } else {
+            bool isValid = _validateCollectionElement(element, isConst, keys,
+                invalidKeys, CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT);
+            if (isValid) {
+              // TODO(mfairhurst) report deferred library error
+            }
           }
-          DartType type = result.type;
-          if (_implementsEqualsWhenNotAllowed(type)) {
-            _errorReporter.reportErrorForNode(
-                CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS,
-                element,
-                [type.displayName]);
+        }
+        for (var invalidElement in invalidElements) {
+          _errorReporter.reportErrorForNode(
+              StaticWarningCode.EQUAL_VALUES_IN_CONST_SET, invalidElement);
+        }
+      }
+    } else if (node.isMap) {
+      bool reportEqualKeys = true;
+      for (CollectionElement entry in node.elements2) {
+        if (entry is MapLiteralEntry) {
+          // TODO(mfairhurst): Change non-const error to a hint, and report
+          // duplicates in constant evaluator instead.
+          // TODO(mfairhurst): unify this with _validateCollectionElemet
+          if (!_validateMapLiteralEntry(entry, isConst, keys, invalidKeys)) {
+            reportEqualKeys = false;
+          }
+        } else {
+          bool isValid = _validateCollectionElement(entry, isConst, keys,
+              invalidKeys, CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT);
+          if (isValid) {
+            // TODO(mfarihurst): handle deferred library checks
           }
         }
       }
-      for (var invalidElement in invalidElements) {
-        _errorReporter.reportErrorForNode(
-            StaticWarningCode.EQUAL_VALUES_IN_CONST_SET, invalidElement);
+      if (reportEqualKeys) {
+        for (int i = 0; i < invalidKeys.length; i++) {
+          _errorReporter.reportErrorForNode(
+              StaticWarningCode.EQUAL_KEYS_IN_MAP, invalidKeys[i]);
+        }
       }
     }
   }
@@ -470,6 +452,38 @@
     return result;
   }
 
+  bool _validateCollectionElement(
+      CollectionElement element,
+      bool isConst,
+      HashSet<DartObject> keys,
+      List<Expression> invalidKeys,
+      ErrorCode errorCode) {
+    if (element is Expression) {
+      return !isConst || _validate(element, errorCode) != null;
+    } else if (element is ForElement) {
+      if (isConst) {
+        _errorReporter.reportErrorForNode(errorCode, element);
+        return false;
+      }
+      return true;
+    } else if (element is IfElement) {
+      bool validCondition =
+          !isConst || _validate(element.condition, errorCode) != null;
+      return validCondition &&
+          _validateCollectionElement(
+                  element.thenElement, isConst, keys, invalidKeys, errorCode) !=
+              null &&
+          _validateCollectionElement(
+                  element.elseElement, isConst, keys, invalidKeys, errorCode) !=
+              null;
+    } else if (element is MapLiteralEntry) {
+      return _validateMapLiteralEntry(element, isConst, keys, invalidKeys);
+    } else if (element is SpreadElement) {
+      return !isConst || _validate(element.expression, errorCode) != null;
+    }
+    return null;
+  }
+
   /// Validate that if the passed arguments are constant expressions.
   ///
   /// @param argumentList the argument list to evaluate
@@ -618,6 +632,52 @@
       _validateInitializerExpression(parameterElements, argument);
     }
   }
+
+  bool _validateMapLiteralEntry(MapLiteralEntry entry, bool isConst,
+      HashSet<DartObject> keys, List<Expression> invalidKeys) {
+    Expression key = entry.key;
+    if (isConst) {
+      DartObjectImpl keyResult =
+          _validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
+      Expression valueExpression = entry.value;
+      DartObjectImpl valueResult = _validate(
+          valueExpression, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
+      if (valueResult != null) {
+        _reportErrorIfFromDeferredLibrary(valueExpression,
+            CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY);
+      }
+      if (keyResult != null) {
+        _reportErrorIfFromDeferredLibrary(key,
+            CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY);
+        if (!keys.add(keyResult)) {
+          invalidKeys.add(key);
+        }
+        DartType type = keyResult.type;
+        if (_implementsEqualsWhenNotAllowed(type)) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode
+                  .CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
+              key,
+              [type.displayName]);
+        }
+      }
+    } else {
+      // Note: we throw the errors away because this isn't actually a const.
+      AnalysisErrorListener errorListener = AnalysisErrorListener.NULL_LISTENER;
+      ErrorReporter subErrorReporter =
+          new ErrorReporter(errorListener, _errorReporter.source);
+      DartObjectImpl result =
+          key.accept(new ConstantVisitor(_evaluationEngine, subErrorReporter));
+      if (result != null) {
+        if (!keys.add(result)) {
+          invalidKeys.add(key);
+        }
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
 }
 
 class _ConstantVerifier_validateInitializerExpression extends ConstantVisitor {
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index ee9cc60..390eea8 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -904,7 +904,21 @@
     if (type.isUndefined) {
       return false;
     }
-    return obj.type.isSubtypeOf(type);
+    var objType = obj.type;
+    if (objType.isDartCoreInt && type.isDartCoreDouble) {
+      // Work around dartbug.com/35993 by allowing `int` to be used in a place
+      // where `double` is expected.
+      //
+      // Note that this is not technically correct, because it allows code like
+      // this:
+      //   const Object x = 1;
+      //   const double y = x;
+      //
+      // TODO(paulberry): remove this workaround once dartbug.com/33441 is
+      // fixed.
+      return true;
+    }
+    return objType.isSubtypeOf(type);
   }
 
   /**
@@ -1338,37 +1352,8 @@
       return null;
     }
     bool errorOccurred = false;
-    List<DartObjectImpl> elements = new List<DartObjectImpl>();
-    for (Expression element in node.elements) {
-      DartObjectImpl elementResult = element.accept(this);
-      if (elementResult == null) {
-        errorOccurred = true;
-      } else {
-        elements.add(elementResult);
-      }
-    }
-    if (errorOccurred) {
-      return null;
-    }
-    var nodeType = node.staticType;
-    DartType elementType =
-        nodeType is InterfaceType && nodeType.typeArguments.isNotEmpty
-            ? nodeType.typeArguments[0]
-            : _typeProvider.dynamicType;
-    InterfaceType listType = _typeProvider.listType.instantiate([elementType]);
-    return new DartObjectImpl(listType, new ListState(elements));
-  }
-
-  @override
-  DartObjectImpl visitListLiteral2(ListLiteral2 node) {
-    if (!node.isConst) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL, node);
-      return null;
-    }
-    bool errorOccurred = false;
     List<DartObjectImpl> list = [];
-    for (CollectionElement element in node.elements) {
+    for (CollectionElement element in node.elements2) {
       errorOccurred = errorOccurred | _addElementsToList(list, element);
     }
     if (errorOccurred) {
@@ -1384,73 +1369,6 @@
   }
 
   @override
-  DartObjectImpl visitMapLiteral(MapLiteral node) {
-    if (!node.isConst) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL, node);
-      return null;
-    }
-    bool errorOccurred = false;
-    Map<DartObjectImpl, DartObjectImpl> map =
-        <DartObjectImpl, DartObjectImpl>{};
-    for (MapLiteralEntry entry in node.entries) {
-      DartObjectImpl keyResult = entry.key.accept(this);
-      DartObjectImpl valueResult = entry.value.accept(this);
-      if (keyResult == null || valueResult == null) {
-        errorOccurred = true;
-      } else {
-        map[keyResult] = valueResult;
-      }
-    }
-    if (errorOccurred) {
-      return null;
-    }
-    DartType keyType = _typeProvider.dynamicType;
-    DartType valueType = _typeProvider.dynamicType;
-    var nodeType = node.staticType;
-    if (nodeType is InterfaceType) {
-      var typeArguments = nodeType.typeArguments;
-      if (typeArguments.length >= 2) {
-        keyType = typeArguments[0];
-        valueType = typeArguments[1];
-      }
-    }
-    InterfaceType mapType =
-        _typeProvider.mapType.instantiate([keyType, valueType]);
-    return new DartObjectImpl(mapType, new MapState(map));
-  }
-
-  @override
-  DartObjectImpl visitMapLiteral2(MapLiteral2 node) {
-    if (!node.isConst) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL, node);
-      return null;
-    }
-    Map<DartObjectImpl, DartObjectImpl> map = {};
-    bool errorOccurred = false;
-    for (CollectionElement element in node.entries) {
-      errorOccurred = errorOccurred | _addElementsToMap(map, element);
-    }
-    if (errorOccurred) {
-      return null;
-    }
-    DartType keyType = _typeProvider.dynamicType;
-    DartType valueType = _typeProvider.dynamicType;
-    DartType nodeType = node.staticType;
-    if (nodeType is InterfaceType) {
-      var typeArguments = nodeType.typeArguments;
-      if (typeArguments.length >= 2) {
-        keyType = typeArguments[0];
-        valueType = typeArguments[1];
-      }
-    }
-    InterfaceType mapType =
-        _typeProvider.mapType.instantiate([keyType, valueType]);
-    return new DartObjectImpl(mapType, new MapState(map));
-  }
-
-  @override
   DartObjectImpl visitMethodInvocation(MethodInvocation node) {
     Element element = node.methodName.staticElement;
     if (element is FunctionElement) {
@@ -1548,56 +1466,57 @@
   }
 
   @override
-  DartObjectImpl visitSetLiteral(SetLiteral node) {
-    if (!node.isConst) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.MISSING_CONST_IN_SET_LITERAL, node);
-      return null;
-    }
-    bool errorOccurred = false;
-    Set<DartObjectImpl> elements = new Set<DartObjectImpl>();
-    for (Expression element in node.elements) {
-      DartObjectImpl elementResult = element.accept(this);
-      if (elementResult == null) {
-        errorOccurred = true;
-      } else {
-        elements.add(elementResult);
+  DartObjectImpl visitSetOrMapLiteral(SetOrMapLiteral node) {
+    if (node.isMap) {
+      if (!node.isConst) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL, node);
+        return null;
       }
+      bool errorOccurred = false;
+      Map<DartObjectImpl, DartObjectImpl> map = {};
+      for (CollectionElement element in node.elements2) {
+        errorOccurred = errorOccurred | _addElementsToMap(map, element);
+      }
+      if (errorOccurred) {
+        return null;
+      }
+      DartType keyType = _typeProvider.dynamicType;
+      DartType valueType = _typeProvider.dynamicType;
+      DartType nodeType = node.staticType;
+      if (nodeType is InterfaceType) {
+        var typeArguments = nodeType.typeArguments;
+        if (typeArguments.length >= 2) {
+          keyType = typeArguments[0];
+          valueType = typeArguments[1];
+        }
+      }
+      InterfaceType mapType =
+          _typeProvider.mapType.instantiate([keyType, valueType]);
+      return new DartObjectImpl(mapType, new MapState(map));
+    } else if (node.isSet) {
+      if (!node.isConst) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.MISSING_CONST_IN_SET_LITERAL, node);
+        return null;
+      }
+      bool errorOccurred = false;
+      Set<DartObjectImpl> set = new Set<DartObjectImpl>();
+      for (CollectionElement element in node.elements2) {
+        errorOccurred = errorOccurred | _addElementsToSet(set, element);
+      }
+      if (errorOccurred) {
+        return null;
+      }
+      DartType nodeType = node.staticType;
+      DartType elementType =
+          nodeType is InterfaceType && nodeType.typeArguments.isNotEmpty
+              ? nodeType.typeArguments[0]
+              : _typeProvider.dynamicType;
+      InterfaceType setType = _typeProvider.setType.instantiate([elementType]);
+      return new DartObjectImpl(setType, new SetState(set));
     }
-    if (errorOccurred) {
-      return null;
-    }
-    DartType nodeType = node.staticType;
-    DartType elementType =
-        nodeType is InterfaceType && nodeType.typeArguments.isNotEmpty
-            ? nodeType.typeArguments[0]
-            : _typeProvider.dynamicType;
-    InterfaceType setType = _typeProvider.setType.instantiate([elementType]);
-    return new DartObjectImpl(setType, new SetState(elements));
-  }
-
-  @override
-  DartObjectImpl visitSetLiteral2(SetLiteral2 node) {
-    if (!node.isConst) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.MISSING_CONST_IN_SET_LITERAL, node);
-      return null;
-    }
-    bool errorOccurred = false;
-    Set<DartObjectImpl> set = new Set<DartObjectImpl>();
-    for (CollectionElement element in node.elements) {
-      errorOccurred = errorOccurred | _addElementsToSet(set, element);
-    }
-    if (errorOccurred) {
-      return null;
-    }
-    DartType nodeType = node.staticType;
-    DartType elementType =
-        nodeType is InterfaceType && nodeType.typeArguments.isNotEmpty
-            ? nodeType.typeArguments[0]
-            : _typeProvider.dynamicType;
-    InterfaceType setType = _typeProvider.setType.instantiate([elementType]);
-    return new DartObjectImpl(setType, new SetState(set));
+    return null;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index 95223de..3a9b8a7 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -95,16 +95,7 @@
   }
 
   @override
-  ListLiteral2 visitListLiteral2(ListLiteral2 node) {
-    ListLiteral2 literal = super.visitListLiteral2(node);
-    literal.staticType = node.staticType;
-    if (node.constKeyword == null && node.isConst) {
-      literal.constKeyword = new KeywordToken(Keyword.CONST, node.offset);
-    }
-    return literal;
-  }
-
-  @override
+  @deprecated
   MapLiteral visitMapLiteral(MapLiteral node) {
     MapLiteral literal = super.visitMapLiteral(node);
     literal.staticType = node.staticType;
@@ -115,16 +106,6 @@
   }
 
   @override
-  MapLiteral2 visitMapLiteral2(MapLiteral2 node) {
-    MapLiteral2 literal = super.visitMapLiteral2(node);
-    literal.staticType = node.staticType;
-    if (node.constKeyword == null && node.isConst) {
-      literal.constKeyword = new KeywordToken(Keyword.CONST, node.offset);
-    }
-    return literal;
-  }
-
-  @override
   RedirectingConstructorInvocation visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     RedirectingConstructorInvocation invocation =
@@ -134,6 +115,7 @@
   }
 
   @override
+  @deprecated
   SetLiteral visitSetLiteral(SetLiteral node) {
     SetLiteral literal = super.visitSetLiteral(node);
     literal.staticType = node.staticType;
@@ -144,8 +126,8 @@
   }
 
   @override
-  SetLiteral2 visitSetLiteral2(SetLiteral2 node) {
-    SetLiteral2 literal = super.visitSetLiteral2(node);
+  SetOrMapLiteral visitSetOrMapLiteral(SetOrMapLiteral node) {
+    SetOrMapLiteral literal = super.visitSetOrMapLiteral(node);
     literal.staticType = node.staticType;
     if (node.constKeyword == null && node.isConst) {
       literal.constKeyword = new KeywordToken(Keyword.CONST, node.offset);
@@ -208,24 +190,23 @@
   }
 
   @override
-  void visitMapLiteral(MapLiteral node) {
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
     if (node.isConst) {
       _find(node);
     } else {
-      // Values of keys are computed to check that they are unique.
-      for (var entry in node.entries) {
-        _find(entry.key);
+      if (node.isMap) {
+        // Values of keys are computed to check that they are unique.
+        for (var entry in node.elements2) {
+          // TODO(mfairhurst): How do if/for loops/spreads affect this?
+          _find(entry);
+        }
+      } else if (node.isSet) {
+        // values of sets are computed to check that they are unique.
+        for (var entry in node.elements2) {
+          _find(entry);
+        }
       }
-      super.visitMapLiteral(node);
-    }
-  }
-
-  @override
-  void visitSetLiteral(SetLiteral node) {
-    if (node.isConst) {
-      _find(node);
-    } else {
-      super.visitSetLiteral(node);
+      super.visitSetOrMapLiteral(node);
     }
   }
 
@@ -235,7 +216,9 @@
     node.statements.accept(this);
   }
 
-  void _find(Expression node) {
+  /// Add dependencies of a [CollectionElement] or [Expression] (which is a type
+  /// of [CollectionElement]).
+  void _find(CollectionElement node) {
     if (node != null) {
       ReferenceFinder referenceFinder = new ReferenceFinder(dependencies.add);
       node.accept(referenceFinder);
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index c95889d..fcaa320 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -171,6 +171,12 @@
  * A representation of an instance of a Dart class.
  */
 class DartObjectImpl implements DartObject {
+  /// When `true`, `operator==` only compares constant values, ignoring types.
+  ///
+  /// This is a temporary hack to work around dartbug.com/35908.
+  /// TODO(paulberry): when #35908 is fixed, remove this hack.
+  static bool _ignoreTypesInEqualityComparison = false;
+
   @override
   final ParameterizedType type;
 
@@ -244,7 +250,8 @@
   @override
   bool operator ==(Object object) {
     if (object is DartObjectImpl) {
-      return type == object.type && _state == object._state;
+      return (_ignoreTypesInEqualityComparison || type == object.type) &&
+          _state == object._state;
     }
     return false;
   }
@@ -516,6 +523,21 @@
       new DartObjectImpl(
           typeProvider.intType, _state.integerDivide(rightOperand._state));
 
+  /// Indicates whether `this` is equal to [other], ignoring types both in this
+  /// object and sub-objects.
+  ///
+  /// This is a temporary hack to work around dartbug.com/35908.
+  /// TODO(paulberry): when #35908 is fixed, remove this hack.
+  bool isEqualIgnoringTypesRecursively(Object other) {
+    bool oldIgnoreTypesInEqualityComparison = _ignoreTypesInEqualityComparison;
+    _ignoreTypesInEqualityComparison = true;
+    try {
+      return this == other;
+    } finally {
+      _ignoreTypesInEqualityComparison = oldIgnoreTypesInEqualityComparison;
+    }
+  }
+
   /**
    * Return the result of invoking the identical function on this object with
    * the [rightOperand]. The [typeProvider] is the type provider used to find
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index e213e85..0997e08 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -1181,10 +1181,7 @@
     element.metadata = _createElementAnnotations(node.metadata);
 
     var parent = node.parent;
-    if (parent is ForEachStatement) {
-      var statement = parent;
-      element.setVisibleRange(statement.offset, statement.length);
-    } else if (parent is ForEachPartsWithDeclaration) {
+    if (parent is ForEachPartsWithDeclaration) {
       var statement = parent.parent;
       element.setVisibleRange(statement.offset, statement.length);
     }
@@ -1351,8 +1348,8 @@
       LocalVariableElementImpl element, VariableDeclaration node) {
     AstNode scopeNode;
     AstNode parent2 = node.parent.parent;
-    if (parent2 is ForStatement) {
-      scopeNode = parent2;
+    if (parent2 is ForPartsWithDeclarations) {
+      scopeNode = parent2.parent;
     } else {
       scopeNode = node.thisOrAncestorOfType<Block>();
     }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 56e2f2a..1f9c4c1 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -29,6 +29,8 @@
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary2/linked_unit_context.dart';
+import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/task/dart.dart';
 
 /// Assert that the given [object] is null, which in the places where this
@@ -412,6 +414,9 @@
   /// The unlinked representation of the class in the summary.
   final UnlinkedClass _unlinkedClass;
 
+  final Reference reference;
+  final LinkedNode _linkedNode;
+
   /// If this class is resynthesized, whether it has a constant constructor.
   bool _hasConstConstructorCached;
 
@@ -450,18 +455,31 @@
   /// Initialize a newly created class element to have the given [name] at the
   /// given [offset] in the file that contains the declaration of this element.
   ClassElementImpl(String name, int offset)
-      : _unlinkedClass = null,
+      : reference = null,
+        _linkedNode = null,
+        _unlinkedClass = null,
         super(name, offset);
 
+  ClassElementImpl.forLinkedNode(this.reference, this._linkedNode,
+      CompilationUnitElementImpl enclosingUnit)
+      : _unlinkedClass = null,
+        super.forSerialized(enclosingUnit) {
+    reference.element = this;
+  }
+
   /// Initialize a newly created class element to have the given [name].
   ClassElementImpl.forNode(Identifier name)
-      : _unlinkedClass = null,
+      : reference = null,
+        _linkedNode = null,
+        _unlinkedClass = null,
         super.forNode(name);
 
   /// Initialize using the given serialized information.
   ClassElementImpl.forSerialized(
       this._unlinkedClass, CompilationUnitElementImpl enclosingUnit)
-      : super.forSerialized(enclosingUnit);
+      : reference = null,
+        _linkedNode = null,
+        super.forSerialized(enclosingUnit);
 
   /// Set whether this class is abstract.
   void set abstract(bool isAbstract) {
@@ -518,6 +536,18 @@
       return _constructors = _computeMixinAppConstructors();
     }
 
+    if (_linkedNode != null) {
+      var context = enclosingUnit._linkedContext;
+      var containerRef = reference.getChild('@constructor');
+      _constructors = _linkedNode.classOrMixinDeclaration_members
+          .where((node) => node.kind == LinkedNodeKind.constructorDeclaration)
+          .map((node) {
+        var name = context.getConstructorDeclarationName(node);
+        var reference = containerRef.getChild(name);
+        return ConstructorElementImpl.forLinkedNode(reference, node, this);
+      }).toList();
+    }
+
     if (_unlinkedClass != null) {
       var unlinkedExecutables = _unlinkedClass.executables;
 
@@ -680,7 +710,16 @@
       return _interfaces;
     }
 
-    if (_unlinkedClass != null) {
+    if (_linkedNode != null) {
+      var context = enclosingUnit._linkedContext;
+      var implementsClause =
+          _linkedNode.classOrMixinDeclaration_implementsClause;
+      if (implementsClause != null) {
+        return _interfaces = implementsClause.implementsClause_interfaces
+            .map((node) => context.getInterfaceType(node.typeName_type))
+            .toList();
+      }
+    } else if (_unlinkedClass != null) {
       var unlinkedInterfaces = _unlinkedClass.interfaces;
       var length = unlinkedInterfaces.length;
       if (length == 0) {
@@ -718,6 +757,9 @@
 
   @override
   bool get isAbstract {
+    if (_linkedNode != null) {
+      return _linkedNode.classDeclaration_abstractKeyword != 0;
+    }
     if (_unlinkedClass != null) {
       return _unlinkedClass.isAbstract;
     }
@@ -830,7 +872,15 @@
       return _mixins;
     }
 
-    if (_unlinkedClass != null) {
+    if (_linkedNode != null) {
+      var context = enclosingUnit._linkedContext;
+      var withClause = _linkedNode.classDeclaration_withClause;
+      if (withClause != null) {
+        return _mixins = withClause.withClause_mixinTypes
+            .map((node) => context.getInterfaceType(node.typeName_type))
+            .toList();
+      }
+    } else if (_unlinkedClass != null) {
       var unlinkedMixins = _unlinkedClass.mixins;
       var length = unlinkedMixins.length;
       if (length == 0) {
@@ -873,6 +923,9 @@
 
   @override
   String get name {
+    if (_linkedNode != null) {
+      return reference.name;
+    }
     if (_unlinkedClass != null) {
       return _unlinkedClass.name;
     }
@@ -896,7 +949,15 @@
   @override
   InterfaceType get supertype {
     if (_supertype == null) {
-      if (_unlinkedClass != null) {
+      if (_linkedNode != null) {
+        var context = enclosingUnit._linkedContext;
+        var extendsClause = _linkedNode.classDeclaration_extendsClause;
+        if (extendsClause != null) {
+          _supertype = context.getInterfaceType(
+            extendsClause.extendsClause_superclass.typeName_type,
+          );
+        }
+      } else if (_unlinkedClass != null) {
         if (_unlinkedClass.supertype != null) {
           DartType type = enclosingUnit.resynthesizerContext
               .resolveTypeRef(this, _unlinkedClass.supertype);
@@ -1351,6 +1412,10 @@
   /// The unlinked representation of the part in the summary.
   final UnlinkedPart _unlinkedPart;
 
+  final LinkedUnitContext _linkedContext;
+  final Reference reference;
+  final LinkedNode _linkedNode;
+
   /// The source that corresponds to this compilation unit.
   @override
   Source source;
@@ -1412,12 +1477,28 @@
       : resynthesizerContext = null,
         _unlinkedUnit = null,
         _unlinkedPart = null,
+        _linkedContext = null,
+        reference = null,
+        _linkedNode = null,
         super(null, -1);
 
+  CompilationUnitElementImpl.forLinkedNode(LibraryElementImpl enclosingLibrary,
+      this._linkedContext, this.reference, this._linkedNode)
+      : resynthesizerContext = null,
+        _unlinkedUnit = null,
+        _unlinkedPart = null,
+        super.forSerialized(null) {
+    _enclosingElement = enclosingLibrary;
+    _nameOffset = -1;
+  }
+
   /// Initialize using the given serialized information.
   CompilationUnitElementImpl.forSerialized(LibraryElementImpl enclosingLibrary,
       this.resynthesizerContext, this._unlinkedUnit, this._unlinkedPart)
-      : super.forSerialized(null) {
+      : _linkedContext = null,
+        reference = null,
+        _linkedNode = null,
+        super.forSerialized(null) {
     _enclosingElement = enclosingLibrary;
     _nameOffset = -1;
   }
@@ -1630,7 +1711,17 @@
 
   @override
   List<ClassElement> get types {
-    if (_unlinkedUnit != null) {
+    if (_linkedNode != null) {
+      var context = enclosingUnit._linkedContext;
+      var containerRef = reference.getChild('@class');
+      _types = _linkedNode.compilationUnit_declarations
+          .where((node) => node.kind == LinkedNodeKind.classDeclaration)
+          .map((node) {
+        var name = context.getUnitMemberName(node);
+        var reference = containerRef.getChild(name);
+        return ClassElementImpl.forLinkedNode(reference, node, this);
+      }).toList();
+    } else if (_unlinkedUnit != null) {
       _types ??= _unlinkedUnit.classes
           .map((c) => new ClassElementImpl.forSerialized(c, this))
           .toList(growable: false);
@@ -1989,17 +2080,34 @@
   @override
   bool isConstantEvaluated = false;
 
+  final Reference reference;
+  final LinkedNode _linkedNode;
+
   /// Initialize a newly created constructor element to have the given [name
   /// ] and[offset].
-  ConstructorElementImpl(String name, int offset) : super(name, offset);
+  ConstructorElementImpl(String name, int offset)
+      : reference = null,
+        _linkedNode = null,
+        super(name, offset);
+
+  ConstructorElementImpl.forLinkedNode(
+      this.reference, this._linkedNode, ClassElementImpl enclosingClass)
+      : super.forLinkedNode(enclosingClass) {
+    reference.element = this;
+  }
 
   /// Initialize a newly created constructor element to have the given [name].
-  ConstructorElementImpl.forNode(Identifier name) : super.forNode(name);
+  ConstructorElementImpl.forNode(Identifier name)
+      : reference = null,
+        _linkedNode = null,
+        super.forNode(name);
 
   /// Initialize using the given serialized information.
   ConstructorElementImpl.forSerialized(
       UnlinkedExecutable serializedExecutable, ClassElementImpl enclosingClass)
-      : super.forSerialized(serializedExecutable, enclosingClass);
+      : reference = null,
+        _linkedNode = null,
+        super.forSerialized(serializedExecutable, enclosingClass);
 
   /// Return the constant initializers for this element, which will be empty if
   /// there are no initializers, or `null` if there was an error in the source.
@@ -2021,6 +2129,14 @@
   }
 
   @override
+  String get displayName {
+    if (_linkedNode != null) {
+      return reference.name;
+    }
+    return super.displayName;
+  }
+
+  @override
   ClassElementImpl get enclosingElement =>
       super.enclosingElement as ClassElementImpl;
 
@@ -2036,6 +2152,9 @@
 
   @override
   bool get isConst {
+    if (_linkedNode != null) {
+      return _linkedNode.constructorDeclaration_constKeyword != 0;
+    }
     if (serializedExecutable != null) {
       return serializedExecutable.isConst;
     }
@@ -2081,7 +2200,18 @@
   }
 
   @override
+  bool get isExternal {
+    if (_linkedNode != null) {
+      return _linkedNode.constructorDeclaration_externalKeyword != 0;
+    }
+    return super.isExternal;
+  }
+
+  @override
   bool get isFactory {
+    if (_linkedNode != null) {
+      return _linkedNode.constructorDeclaration_factoryKeyword != 0;
+    }
     if (serializedExecutable != null) {
       return serializedExecutable.isFactory;
     }
@@ -2092,9 +2222,25 @@
   bool get isStatic => false;
 
   @override
+  bool get isSynthetic {
+    if (_linkedNode != null) {
+      return _linkedNode.isSynthetic;
+    }
+    return super.isSynthetic;
+  }
+
+  @override
   ElementKind get kind => ElementKind.CONSTRUCTOR;
 
   @override
+  String get name {
+    if (_linkedNode != null) {
+      return reference.name;
+    }
+    return super.name;
+  }
+
+  @override
   int get nameEnd {
     if (serializedExecutable != null) {
       if (serializedExecutable.name.isNotEmpty) {
@@ -2696,6 +2842,9 @@
     this._name = StringUtilities.intern(name);
   }
 
+  /// Initialize from linked node.
+  ElementImpl.forLinkedNode(this._enclosingElement);
+
   /// Initialize a newly created element to have the given [name].
   ElementImpl.forNode(Identifier name)
       : this(name == null ? "" : name.name, name == null ? -1 : name.offset);
@@ -3008,6 +3157,8 @@
     _nameOffset = offset;
   }
 
+  Reference get reference => null;
+
   @override
   AnalysisSession get session {
     return _enclosingElement?.session;
@@ -3632,6 +3783,11 @@
       : serializedExecutable = null,
         super(name, offset);
 
+  /// Initialize using the given linked node.
+  ExecutableElementImpl.forLinkedNode(ElementImpl enclosingElement)
+      : serializedExecutable = null,
+        super.forLinkedNode(enclosingElement);
+
   /// Initialize a newly created executable element to have the given [name].
   ExecutableElementImpl.forNode(Identifier name)
       : serializedExecutable = null,
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 85712c3..5fbed4f 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -1505,6 +1505,15 @@
   }
 
   @override
+  bool get isDartCoreDouble {
+    ClassElement element = this.element;
+    if (element == null) {
+      return false;
+    }
+    return element.name == "double" && element.library.isDartCore;
+  }
+
+  @override
   bool get isDartCoreFunction {
     ClassElement element = this.element;
     if (element == null) {
@@ -1639,6 +1648,26 @@
     }
   }
 
+  /**
+   * Return either this type or a supertype of this type that is defined by the
+   * [targetElement], or `null` if such a type does not exist. If this type
+   * inherits from the target element along multiple paths, then the returned type
+   * is arbitrary.
+   *
+   * For example, given the following definitions
+   * ```
+   * class A<E> {}
+   * class B<E> implements A<E> {}
+   * class C implements A<String> {}
+   * ```
+   * Asking the type `B<int>` for the type associated with `A` will return the
+   * type `A<int>`. Asking the type `C` for the type associated with `A` will
+   * return the type `A<String>`.
+   */
+  InterfaceType asInstanceOf(ClassElement targetElement) {
+    return _asInstanceOf(targetElement, new Set<ClassElement>());
+  }
+
   @override
   DartType flattenFutures(TypeSystem typeSystem) {
     // Implement the cases:
@@ -2261,6 +2290,43 @@
   }
 
   /**
+   * Return  either this type or a supertype of this type that is defined by the
+   * [targetElement], or `null` if such a type does not exist. The set of
+   * [visitedClasses] is used to prevent infinite recursion.
+   */
+  InterfaceType _asInstanceOf(
+      ClassElement targetElement, Set<ClassElement> visitedClasses) {
+    ClassElement thisElement = element;
+    if (thisElement == targetElement) {
+      return this;
+    } else if (visitedClasses.add(thisElement)) {
+      InterfaceType type;
+      for (InterfaceType mixin in mixins) {
+        type = (mixin as InterfaceTypeImpl)
+            ._asInstanceOf(targetElement, visitedClasses);
+        if (type != null) {
+          return type;
+        }
+      }
+      if (superclass != null) {
+        type = (superclass as InterfaceTypeImpl)
+            ._asInstanceOf(targetElement, visitedClasses);
+        if (type != null) {
+          return type;
+        }
+      }
+      for (InterfaceType interface in interfaces) {
+        type = (interface as InterfaceTypeImpl)
+            ._asInstanceOf(targetElement, visitedClasses);
+        if (type != null) {
+          return type;
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
    * Flush cache members if the version of [element] for which members are
    * cached and the current version of the [element].
    */
@@ -2747,6 +2813,9 @@
   bool get isDartCoreBool => false;
 
   @override
+  bool get isDartCoreDouble => false;
+
+  @override
   bool get isDartCoreFunction => false;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index 185e224..39f9dee 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -178,6 +178,25 @@
               "rename the function in the imported library.");
 
   /**
+   * When "strict-inference" in enabled, uninitialized variables must be
+   * declared with a specific type.
+   */
+  static const HintCode INFERENCE_FAILURE_ON_UNINITIALIZED_VARIABLE =
+      const HintCode(
+          'INFERENCE_FAILURE_ON_UNINITIALIZED_VARIABLE',
+          "The type of {0} cannot be inferred without either a type or "
+          "initializer.",
+          correction: "Try specifying the type of the variable.");
+
+  /**
+   * When "strict-raw-types" is enabled, raw types must be inferred via the
+   * context type, or have type arguments other than dynamic.
+   */
+  static const HintCode STRICT_RAW_TYPE = HintCode('STRICT_RAW_TYPE',
+      "The generic type '{0}' should have explicit type arguments but doesn't.",
+      correction: "Use explicit type arguments for '{0}'.");
+
+  /**
    * This hint is generated anywhere a @factory annotation is associated with
    * anything other than a method.
    */
@@ -586,6 +605,14 @@
   static const HintCode UNNECESSARY_NO_SUCH_METHOD = const HintCode(
       'UNNECESSARY_NO_SUCH_METHOD', "Unnecessary 'noSuchMethod' declaration.",
       correction: "Try removing the declaration of 'noSuchMethod'.");
+  /**
+   * When the '?.' operator is used on a target that we know to be non-null,
+   * it is unnecessary.
+   */
+  static const HintCode UNNECESSARY_NULL_AWARE_CALL = const HintCode(
+      'UNNECESSARY_NULL_AWARE_CALL',
+      "The target expression cannot be null, and so '?.' is not necessary.",
+      correction: "Replace the '?.' with a '.' in the invocation.");
 
   /**
    * Unnecessary type checks, the result is always false.
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index 2d00fd9..1d45edd 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -189,6 +189,8 @@
   static const ParserErrorCode EXPECTED_TYPE_NAME =
       const ParserErrorCode('EXPECTED_TYPE_NAME', "Expected a type name.");
 
+  static const ParserErrorCode EXPERIMENT_NOT_ENABLED = _EXPERIMENT_NOT_ENABLED;
+
   static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE =
       _EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE;
 
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
index c983796..c4a7f45 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
@@ -100,6 +100,7 @@
   _INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER,
   _STACK_OVERFLOW,
   _MISSING_CATCH_OR_FINALLY,
+  _EXPERIMENT_NOT_ENABLED,
 ];
 
 const ParserErrorCode _ABSTRACT_CLASS_MEMBER = const ParserErrorCode(
@@ -241,6 +242,12 @@
 const ParserErrorCode _EXPECTED_INSTEAD = const ParserErrorCode(
     'EXPECTED_INSTEAD', r"Expected '#string' instead of this.");
 
+const ParserErrorCode _EXPERIMENT_NOT_ENABLED = const ParserErrorCode(
+    'EXPERIMENT_NOT_ENABLED',
+    r"This requires the --#string experiment to be enabled.",
+    correction:
+        "Try enabling this experiment by adding it to the command line when compiling and running.");
+
 const ParserErrorCode _EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE =
     const ParserErrorCode('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE',
         r"Export directives must preceed part directives.",
diff --git a/pkg/analyzer/lib/src/dart/resolver/definite_assignment.dart b/pkg/analyzer/lib/src/dart/resolver/definite_assignment.dart
index 8edf986..838c611 100644
--- a/pkg/analyzer/lib/src/dart/resolver/definite_assignment.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/definite_assignment.dart
@@ -530,29 +530,13 @@
     _current = _current.union(continueSet);
   }
 
-  void beginForEachStatement(ForEachStatement statement) {
-    // Not strongly necessary, because we discard everything anyway.
-    // Just for consistency, so that `break` is handled without `null`.
-    _statementToStackIndex[statement] = _stack.length;
-  }
-
-  void beginForEachStatementBody() {
-    _stack.add(_current);
-  }
-
-  void beginForStatement(ForStatement statement) {
-    // Not strongly necessary, because we discard everything anyway.
-    // Just for consistency, so that `break` is handled without `null`.
-    _statementToStackIndex[statement] = _stack.length;
-  }
-
   void beginForStatement2(ForStatement2 statement) {
     // Not strongly necessary, because we discard everything anyway.
     // Just for consistency, so that `break` is handled without `null`.
     _statementToStackIndex[statement] = _stack.length;
   }
 
-  void beginForStatementBody() {
+  void beginForStatement2Body() {
     _stack.add(_current); // break set
     _stack.add(_ElementSet.empty); // continue set
   }
@@ -624,11 +608,7 @@
     _current = _current.union(breakSet);
   }
 
-  void endForEachStatement() {
-    _current = _stack.removeLast();
-  }
-
-  void endForStatement() {
+  void endForStatement2() {
     _stack.removeLast(); // continue set
     _current = _stack.removeLast(); // break set, before body
   }
diff --git a/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart b/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
index 2f558cf..432367d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
@@ -178,23 +178,6 @@
       _nodeExits(node.expression);
 
   @override
-  bool visitForEachStatement(ForEachStatement node) {
-    bool outerBreakValue = _enclosingBlockContainsBreak;
-    _enclosingBlockContainsBreak = false;
-    try {
-      bool iterableExits = _nodeExits(node.iterable);
-      // Discard whether the for-each body exits; since the for-each iterable
-      // may be empty, execution may never enter the body, so it doesn't matter
-      // if it exits or not.  We still must visit the body, to accurately
-      // manage `_enclosingBlockBreaksLabel`.
-      _nodeExits(node.body);
-      return iterableExits;
-    } finally {
-      _enclosingBlockContainsBreak = outerBreakValue;
-    }
-  }
-
-  @override
   bool visitForElement(ForElement node) {
     bool outerBreakValue = _enclosingBlockContainsBreak;
     _enclosingBlockContainsBreak = false;
@@ -248,42 +231,6 @@
   }
 
   @override
-  bool visitForStatement(ForStatement node) {
-    bool outerBreakValue = _enclosingBlockContainsBreak;
-    _enclosingBlockContainsBreak = false;
-    try {
-      if (node.variables != null &&
-          _visitVariableDeclarations(node.variables.variables)) {
-        return true;
-      }
-      if (node.initialization != null && _nodeExits(node.initialization)) {
-        return true;
-      }
-      Expression conditionExpression = node.condition;
-      if (conditionExpression != null && _nodeExits(conditionExpression)) {
-        return true;
-      }
-      if (_visitExpressions(node.updaters)) {
-        return true;
-      }
-      bool blockReturns = _nodeExits(node.body);
-      // TODO(jwren) Do we want to take all constant expressions into account?
-      // If for(; true; ) (or for(;;)), and the body doesn't return or the body
-      // doesn't have a break, then return true.
-      bool implicitOrExplictTrue = conditionExpression == null ||
-          (conditionExpression is BooleanLiteral && conditionExpression.value);
-      if (implicitOrExplictTrue) {
-        if (blockReturns || !_enclosingBlockContainsBreak) {
-          return true;
-        }
-      }
-      return false;
-    } finally {
-      _enclosingBlockContainsBreak = outerBreakValue;
-    }
-  }
-
-  @override
   bool visitForStatement2(ForStatement2 node) {
     bool outerBreakValue = _enclosingBlockContainsBreak;
     _enclosingBlockContainsBreak = false;
@@ -445,8 +392,8 @@
   }
 
   @override
-  bool visitListLiteral2(ListLiteral2 node) {
-    for (CollectionElement element in node.elements) {
+  bool visitListLiteral(ListLiteral node) {
+    for (CollectionElement element in node.elements2) {
       if (_nodeExits(element)) {
         return true;
       }
@@ -458,16 +405,6 @@
   bool visitLiteral(Literal node) => false;
 
   @override
-  bool visitMapLiteral2(MapLiteral2 node) {
-    for (CollectionElement entry in node.entries) {
-      if (_nodeExits(entry)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @override
   bool visitMapLiteralEntry(MapLiteralEntry node) {
     return _nodeExits(node.key) || _nodeExits(node.value);
   }
@@ -526,8 +463,8 @@
   bool visitReturnStatement(ReturnStatement node) => true;
 
   @override
-  bool visitSetLiteral2(SetLiteral2 node) {
-    for (CollectionElement element in node.elements) {
+  bool visitSetOrMapLiteral(SetOrMapLiteral node) {
+    for (CollectionElement element in node.elements2) {
       if (_nodeExits(element)) {
         return true;
       }
diff --git a/pkg/analyzer/lib/src/dart/sdk/sdk.dart b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
index 6a4fef1..e20937d 100644
--- a/pkg/analyzer/lib/src/dart/sdk/sdk.dart
+++ b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
@@ -230,6 +230,16 @@
     return source;
   }
 
+  /**
+   * Return info for debugging https://github.com/dart-lang/sdk/issues/35226.
+   */
+  Map<String, Object> debugInfo() {
+    return <String, Object>{
+      'runtimeType': '$runtimeType',
+      'libraryMap': libraryMap.debugInfo(),
+    };
+  }
+
   String _getPath(File file) {
     List<SdkLibrary> libraries = libraryMap.sdkLibraries;
     int length = libraries.length;
@@ -552,6 +562,16 @@
   }
 
   /**
+   * Return info for debugging https://github.com/dart-lang/sdk/issues/35226.
+   */
+  @override
+  Map<String, Object> debugInfo() {
+    var result = super.debugInfo();
+    result['directory'] = _sdkDirectory.path;
+    return result;
+  }
+
+  /**
    * Determine the search order for trying to locate the [_LIBRARIES_FILE].
    */
   Iterable<File> get _libraryMapLocations sync* {
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 81dcb16..adb3a99 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -2146,6 +2146,15 @@
           correction: "Try removing the keyword 'const' from the map literal.");
 
   /**
+   * 12.7 Maps: It is a compile time error if an element of a constant map
+   * literal is not a compile-time constant.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_ELEMENT =
+      const CompileTimeErrorCode('NON_CONSTANT_MAP_ELEMENT',
+          "The elements in a const map literal must be constant.",
+          correction: "Try removing the keyword 'const' from the map literal.");
+
+  /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an
    * entry in a constant map literal is not a compile-time constant.
    *
@@ -3247,6 +3256,14 @@
           "The operator '{0}' isn't defined for the class '{1}'.",
           correction: "Try defining the operator '{0}'.");
 
+  static const StaticTypeWarningCode UNDEFINED_PREFIXED_NAME =
+      const StaticTypeWarningCode(
+          'UNDEFINED_PREFIXED_NAME',
+          "The name '{0}' is being referenced through the prefix '{1}', but it "
+          "isn't defined in any of the libraries imported using that prefix.",
+          correction: "Try correcting the prefix or "
+              "importing the library that defines '{0}'.");
+
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
    * It is a static type warning if <i>T</i> does not have an accessible
@@ -4649,6 +4666,10 @@
 
 /**
  * This class has Strong Mode specific error codes.
+ * 
+ * "Strong Mode" was the prototype for Dart 2's sound type system. Many of these
+ * errors became part of Dart 2. Some of them are optional flags, used for
+ * stricter checking.
  *
  * These error codes tend to use the same message across different severity
  * levels, so they are grouped for clarity.
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index a5f1196..d120057 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -3,10 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -454,7 +456,7 @@
           if (name == baseParameter.name && baseParameter.initializer != null) {
             var baseValue = baseParameter.computeConstantValue();
             var derivedResult = derivedElement.evaluationResult;
-            if (derivedResult.value != baseValue) {
+            if (!_constantValuesEqual(derivedResult.value, baseValue)) {
               reporter.reportErrorForNode(
                 StaticWarningCode
                     .INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED,
@@ -477,7 +479,7 @@
         if (baseElement.initializer != null) {
           var baseValue = baseElement.computeConstantValue();
           var derivedResult = derivedOptionalElements[i].evaluationResult;
-          if (derivedResult.value != baseValue) {
+          if (!_constantValuesEqual(derivedResult.value, baseValue)) {
             reporter.reportErrorForNode(
               StaticWarningCode
                   .INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL,
@@ -718,4 +720,12 @@
       );
     }
   }
+
+  static bool _constantValuesEqual(DartObject x, DartObject y) {
+    // If either constant value couldn't be computed due to an error, the
+    // corresponding DartObject will be `null`.  Since an error has already been
+    // reported, there's no need to report another.
+    if (x == null || y == null) return true;
+    return (x as DartObjectImpl).isEqualIgnoringTypesRecursively(y);
+  }
 }
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index edbcf3c..29d4bd9 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -7,27 +7,15 @@
 import 'package:analyzer/dart/ast/standard_ast_factory.dart' as standard;
 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType;
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast.dart'
     show
         ClassDeclarationImpl,
         ClassOrMixinDeclarationImpl,
+        CompilationUnitImpl,
         MixinDeclarationImpl;
 import 'package:analyzer/src/fasta/error_converter.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:front_end/src/fasta/parser.dart'
-    show
-        Assert,
-        FormalParameterKind,
-        IdentifierContext,
-        MemberKind,
-        optional,
-        Parser;
-import 'package:front_end/src/fasta/scanner.dart' hide StringToken;
-import 'package:front_end/src/scanner/errors.dart' show translateErrorToken;
-import 'package:front_end/src/scanner/token.dart'
-    show SyntheticStringToken, SyntheticToken;
-
-import 'package:front_end/src/fasta/problems.dart' show unhandled;
 import 'package:front_end/src/fasta/messages.dart'
     show
         LocatedMessage,
@@ -46,14 +34,31 @@
         messageStaticConstructor,
         messageTypedefNotFunction,
         templateDuplicateLabelInSwitchStatement,
+        templateExpectedButGot,
         templateExpectedIdentifier,
+        templateExperimentNotEnabled,
         templateUnexpectedToken;
+import 'package:front_end/src/fasta/parser.dart'
+    show
+        Assert,
+        FormalParameterKind,
+        IdentifierContext,
+        MemberKind,
+        optional,
+        Parser;
+import 'package:front_end/src/fasta/problems.dart' show unhandled;
 import 'package:front_end/src/fasta/quote.dart';
+import 'package:front_end/src/fasta/scanner.dart' hide StringToken;
 import 'package:front_end/src/fasta/scanner/token_constants.dart';
 import 'package:front_end/src/fasta/source/stack_listener.dart'
     show NullValue, StackListener;
+import 'package:front_end/src/scanner/errors.dart' show translateErrorToken;
+import 'package:front_end/src/scanner/token.dart'
+    show SyntheticStringToken, SyntheticToken;
 import 'package:kernel/ast.dart' show AsyncMarker;
 
+const _invalidCollectionElement = const _InvalidCollectionElement._();
+
 /// A parser listener that builds the analyzer's AST structure.
 class AstBuilder extends StackListener {
   final AstFactory ast = standard.astFactory;
@@ -106,406 +111,21 @@
   /// `true` if control-flow-collections behavior is enabled
   bool enableControlFlowCollections = false;
 
-  /// Is `true` if [enableNonNullable] is enabled, and the library directive
-  /// is annotated with `@pragma('analyzer:non-nullable')`.
-  bool hasPragmaAnalyzerNonNullable = false;
-
   AstBuilder(ErrorReporter errorReporter, this.fileUri, this.isFullAst,
       [Uri uri])
       : this.errorReporter = new FastaErrorReporter(errorReporter),
         uri = uri ?? fileUri;
 
-  void beginLiteralString(Token literalString) {
-    assert(identical(literalString.kind, STRING_TOKEN));
-    debugEvent("beginLiteralString");
-
-    push(literalString);
-  }
-
-  void handleNamedArgument(Token colon) {
-    assert(optional(':', colon));
-    debugEvent("NamedArgument");
-
-    Expression expression = pop();
-    SimpleIdentifier name = pop();
-    push(ast.namedExpression(ast.label(name, colon), expression));
-  }
-
   @override
-  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
-    debugEvent("NoConstructorReferenceContinuationAfterTypeArguments");
-
-    push(NullValue.ConstructorReferenceContinuationAfterTypeArguments);
-  }
-
-  @override
-  void endConstructorReference(
-      Token start, Token periodBeforeName, Token endToken) {
-    assert(optionalOrNull('.', periodBeforeName));
-    debugEvent("ConstructorReference");
-
-    SimpleIdentifier constructorName = pop();
-    TypeArgumentList typeArguments = pop();
-    Identifier typeNameIdentifier = pop();
-    push(ast.constructorName(ast.typeName(typeNameIdentifier, typeArguments),
-        periodBeforeName, constructorName));
-  }
-
-  @override
-  void endConstExpression(Token constKeyword) {
-    assert(optional('const', constKeyword));
-    debugEvent("ConstExpression");
-
-    _handleInstanceCreation(constKeyword);
-  }
-
-  @override
-  void endConstLiteral(Token token) {
-    debugEvent("endConstLiteral");
-  }
-
-  void _handleInstanceCreation(Token token) {
-    MethodInvocation arguments = pop();
-    ConstructorName constructorName;
-    TypeArgumentList typeArguments;
-    var object = pop();
-    if (object is _ConstructorNameWithInvalidTypeArgs) {
-      constructorName = object.name;
-      typeArguments = object.invalidTypeArgs;
-    } else {
-      constructorName = object;
+  void addProblem(Message message, int charOffset, int length,
+      {bool wasHandled: false, List<LocatedMessage> context}) {
+    if (directives.isEmpty &&
+        (message.code.analyzerCodes
+                ?.contains('NON_PART_OF_DIRECTIVE_IN_PART') ??
+            false)) {
+      message = messageDirectiveAfterDeclaration;
     }
-    push(ast.instanceCreationExpression(
-        token, constructorName, arguments.argumentList,
-        typeArguments: typeArguments));
-  }
-
-  @override
-  void endImplicitCreationExpression(Token token) {
-    debugEvent("ImplicitCreationExpression");
-
-    _handleInstanceCreation(null);
-  }
-
-  @override
-  void endNewExpression(Token newKeyword) {
-    assert(optional('new', newKeyword));
-    debugEvent("NewExpression");
-
-    _handleInstanceCreation(newKeyword);
-  }
-
-  @override
-  void handleParenthesizedCondition(Token leftParenthesis) {
-    // TODO(danrubel): Implement rather than forwarding.
-    handleParenthesizedExpression(leftParenthesis);
-  }
-
-  @override
-  void handleParenthesizedExpression(Token leftParenthesis) {
-    assert(optional('(', leftParenthesis));
-    debugEvent("ParenthesizedExpression");
-
-    Expression expression = pop();
-    push(ast.parenthesizedExpression(
-        leftParenthesis, expression, leftParenthesis?.endGroup));
-  }
-
-  @override
-  void handleStringPart(Token literalString) {
-    assert(identical(literalString.kind, STRING_TOKEN));
-    debugEvent("StringPart");
-
-    push(literalString);
-  }
-
-  @override
-  void handleInterpolationExpression(Token leftBracket, Token rightBracket) {
-    Expression expression = pop();
-    push(ast.interpolationExpression(leftBracket, expression, rightBracket));
-  }
-
-  @override
-  void endLiteralString(int interpolationCount, Token endToken) {
-    debugEvent("endLiteralString");
-
-    if (interpolationCount == 0) {
-      Token token = pop();
-      String value = unescapeString(token.lexeme, token, this);
-      push(ast.simpleStringLiteral(token, value));
-    } else {
-      List<Object> parts = popTypedList(1 + interpolationCount * 2);
-      Token first = parts.first;
-      Token last = parts.last;
-      Quote quote = analyzeQuote(first.lexeme);
-      List<InterpolationElement> elements = <InterpolationElement>[];
-      elements.add(ast.interpolationString(
-          first, unescapeFirstStringPart(first.lexeme, quote, first, this)));
-      for (int i = 1; i < parts.length - 1; i++) {
-        var part = parts[i];
-        if (part is Token) {
-          elements.add(ast.interpolationString(
-              part, unescape(part.lexeme, quote, part, this)));
-        } else if (part is InterpolationExpression) {
-          elements.add(part);
-        } else {
-          unhandled("${part.runtimeType}", "string interpolation",
-              first.charOffset, uri);
-        }
-      }
-      elements.add(ast.interpolationString(
-          last, unescapeLastStringPart(last.lexeme, quote, last, this)));
-      push(ast.stringInterpolation(elements));
-    }
-  }
-
-  @override
-  void handleNativeClause(Token nativeToken, bool hasName) {
-    debugEvent("NativeClause");
-
-    if (hasName) {
-      nativeName = pop(); // StringLiteral
-    } else {
-      nativeName = null;
-    }
-  }
-
-  void handleScript(Token token) {
-    assert(identical(token.type, TokenType.SCRIPT_TAG));
-    debugEvent("Script");
-
-    scriptTag = ast.scriptTag(token);
-  }
-
-  void beginIfControlFlow(Token ifToken) {
-    push(ifToken);
-  }
-
-  @override
-  void handleElseControlFlow(Token elseToken) {
-    push(elseToken);
-  }
-
-  @override
-  void endIfControlFlow(Token token) {
-    CollectionElement thenElement = pop();
-    ParenthesizedExpression condition = pop();
-    Token ifToken = pop();
-    pushIfControlFlowInfo(ifToken, condition, thenElement, null, null);
-  }
-
-  @override
-  void endIfElseControlFlow(Token token) {
-    CollectionElement elseElement = pop();
-    Token elseToken = pop();
-    CollectionElement thenElement = pop();
-    ParenthesizedExpression condition = pop();
-    Token ifToken = pop();
-    pushIfControlFlowInfo(
-        ifToken, condition, thenElement, elseToken, elseElement);
-  }
-
-  void pushIfControlFlowInfo(
-      Token ifToken,
-      ParenthesizedExpression condition,
-      CollectionElement thenElement,
-      Token elseToken,
-      CollectionElement elseElement) {
-    if (enableControlFlowCollections) {
-      push(ast.ifElement(
-        ifKeyword: ifToken,
-        leftParenthesis: condition.leftParenthesis,
-        condition: condition.expression,
-        rightParenthesis: condition.rightParenthesis,
-        thenElement: thenElement,
-        elseKeyword: elseToken,
-        elseElement: elseElement,
-      ));
-    } else {
-      handleRecoverableError(
-          templateUnexpectedToken.withArguments(ifToken), ifToken, ifToken);
-      push(thenElement);
-    }
-  }
-
-  @override
-  void handleSpreadExpression(Token spreadToken) {
-    if (enableSpreadCollections) {
-      push(ast.spreadElement(spreadOperator: spreadToken, expression: pop()));
-    } else {
-      handleRecoverableError(templateUnexpectedToken.withArguments(spreadToken),
-          spreadToken, spreadToken);
-    }
-  }
-
-  void handleStringJuxtaposition(int literalCount) {
-    debugEvent("StringJuxtaposition");
-
-    push(ast.adjacentStrings(popTypedList(literalCount)));
-  }
-
-  void endArguments(int count, Token leftParenthesis, Token rightParenthesis) {
-    assert(optional('(', leftParenthesis));
-    assert(optional(')', rightParenthesis));
-    debugEvent("Arguments");
-
-    List<Expression> expressions = popTypedList(count);
-    ArgumentList arguments =
-        ast.argumentList(leftParenthesis, expressions, rightParenthesis);
-    push(ast.methodInvocation(null, null, null, null, arguments));
-  }
-
-  void handleIdentifier(Token token, IdentifierContext context) {
-    assert(token.isKeywordOrIdentifier);
-    debugEvent("handleIdentifier");
-
-    if (context.inSymbol) {
-      push(token);
-      return;
-    }
-
-    SimpleIdentifier identifier =
-        ast.simpleIdentifier(token, isDeclaration: context.inDeclaration);
-    if (context.inLibraryOrPartOfDeclaration) {
-      if (!context.isContinuation) {
-        push([identifier]);
-      } else {
-        push(identifier);
-      }
-    } else if (context == IdentifierContext.enumValueDeclaration) {
-      List<Annotation> metadata = pop();
-      Comment comment = _findComment(null, token);
-      push(ast.enumConstantDeclaration(comment, metadata, identifier));
-    } else {
-      push(identifier);
-    }
-  }
-
-  void handleSend(Token beginToken, Token endToken) {
-    debugEvent("Send");
-
-    MethodInvocation arguments = pop();
-    TypeArgumentList typeArguments = pop();
-    if (arguments != null) {
-      doInvocation(typeArguments, arguments);
-    } else {
-      doPropertyGet();
-    }
-  }
-
-  void doInvocation(
-      TypeArgumentList typeArguments, MethodInvocation arguments) {
-    Expression receiver = pop();
-    if (receiver is SimpleIdentifier) {
-      arguments.methodName = receiver;
-      if (typeArguments != null) {
-        arguments.typeArguments = typeArguments;
-      }
-      push(arguments);
-    } else {
-      push(ast.functionExpressionInvocation(
-          receiver, typeArguments, arguments.argumentList));
-    }
-  }
-
-  void doPropertyGet() {}
-
-  void handleExpressionStatement(Token semicolon) {
-    assert(optional(';', semicolon));
-    debugEvent("ExpressionStatement");
-    Expression expression = pop();
-    reportErrorIfSuper(expression);
-    if (expression is SimpleIdentifier &&
-        expression.token?.keyword?.isBuiltInOrPseudo == false) {
-      // This error is also reported by the body builder.
-      handleRecoverableError(
-          messageExpectedStatement, expression.beginToken, expression.endToken);
-    }
-    if (expression is AssignmentExpression) {
-      if (!expression.leftHandSide.isAssignable) {
-        // This error is also reported by the body builder.
-        handleRecoverableError(
-            messageIllegalAssignmentToNonAssignable,
-            expression.leftHandSide.beginToken,
-            expression.leftHandSide.endToken);
-      }
-    }
-    push(ast.expressionStatement(expression, semicolon));
-  }
-
-  void reportErrorIfSuper(Expression expression) {
-    if (expression is SuperExpression) {
-      // This error is also reported by the body builder.
-      handleRecoverableError(messageMissingAssignableSelector,
-          expression.beginToken, expression.endToken);
-    }
-  }
-
-  @override
-  void handleNativeFunctionBody(Token nativeToken, Token semicolon) {
-    assert(optional('native', nativeToken));
-    assert(optional(';', semicolon));
-    debugEvent("NativeFunctionBody");
-
-    // TODO(danrubel) Change the parser to not produce these modifiers.
-    pop(); // star
-    pop(); // async
-    push(ast.nativeFunctionBody(nativeToken, nativeName, semicolon));
-  }
-
-  @override
-  void handleEmptyFunctionBody(Token semicolon) {
-    assert(optional(';', semicolon));
-    debugEvent("EmptyFunctionBody");
-
-    // TODO(scheglov) Change the parser to not produce these modifiers.
-    pop(); // star
-    pop(); // async
-    push(ast.emptyFunctionBody(semicolon));
-  }
-
-  @override
-  void handleEmptyStatement(Token semicolon) {
-    assert(optional(';', semicolon));
-    debugEvent("EmptyStatement");
-
-    push(ast.emptyStatement(semicolon));
-  }
-
-  void endBlockFunctionBody(int count, Token leftBracket, Token rightBracket) {
-    assert(optional('{', leftBracket));
-    assert(optional('}', rightBracket));
-    debugEvent("BlockFunctionBody");
-
-    List<Statement> statements = popTypedList(count);
-    Block block = ast.block(leftBracket, statements, rightBracket);
-    Token star = pop();
-    Token asyncKeyword = pop();
-    if (parseFunctionBodies) {
-      push(ast.blockFunctionBody(asyncKeyword, star, block));
-    } else {
-      // TODO(danrubel): Skip the block rather than parsing it.
-      push(ast.emptyFunctionBody(
-          new SyntheticToken(TokenType.SEMICOLON, leftBracket.charOffset)));
-    }
-  }
-
-  void finishFunction(
-      List annotations, formals, AsyncMarker asyncModifier, FunctionBody body) {
-    debugEvent("finishFunction");
-
-    Statement bodyStatement;
-    if (body is EmptyFunctionBody) {
-      bodyStatement = ast.emptyStatement(body.semicolon);
-    } else if (body is NativeFunctionBody) {
-      // TODO(danrubel): what do we need to do with NativeFunctionBody?
-    } else if (body is ExpressionFunctionBody) {
-      bodyStatement = ast.returnStatement(null, body.expression, null);
-    } else {
-      bodyStatement = (body as BlockFunctionBody).block;
-    }
-    // TODO(paulberry): what do we need to do with bodyStatement at this point?
-    bodyStatement; // Suppress "unused local variable" hint
+    errorReporter.reportMessage(message, charOffset, length);
   }
 
   void beginCascade(Token token) {
@@ -522,48 +142,141 @@
     push(NullValue.CascadeReceiver);
   }
 
-  void endCascade() {
-    debugEvent("Cascade");
-
-    Expression expression = pop();
-    CascadeExpression receiver = pop();
-    pop(); // Token.
-    receiver.cascadeSections.add(expression);
-    push(receiver);
-  }
-
-  void handleOperator(Token operatorToken) {
-    assert(operatorToken.isUserDefinableOperator);
-    debugEvent("Operator");
-
-    push(operatorToken);
-  }
-
-  void handleSymbolVoid(Token voidKeyword) {
-    assert(optional('void', voidKeyword));
-    debugEvent("SymbolVoid");
-
-    push(voidKeyword);
+  @override
+  void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
+    assert(classDeclaration == null && mixinDeclaration == null);
+    push(new _Modifiers()..abstractKeyword = abstractToken);
   }
 
   @override
-  void endBinaryExpression(Token operatorToken) {
-    assert(operatorToken.isOperator ||
-        optional('.', operatorToken) ||
-        optional('?.', operatorToken) ||
-        optional('..', operatorToken));
-    debugEvent("BinaryExpression");
+  void beginCompilationUnit(Token token) {
+    push(token);
+  }
 
-    if (identical(".", operatorToken.stringValue) ||
-        identical("?.", operatorToken.stringValue) ||
-        identical("..", operatorToken.stringValue)) {
-      doDotExpression(operatorToken);
-    } else {
-      Expression right = pop();
-      Expression left = pop();
-      reportErrorIfSuper(right);
-      push(ast.binaryExpression(left, operatorToken, right));
+  @override
+  void beginFactoryMethod(
+      Token lastConsumed, Token externalToken, Token constToken) {
+    push(new _Modifiers()
+      ..externalKeyword = externalToken
+      ..finalConstOrVarKeyword = constToken);
+  }
+
+  @override
+  void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
+      Token varFinalOrConst) {
+    push(new _Modifiers()
+      ..covariantKeyword = covariantToken
+      ..finalConstOrVarKeyword = varFinalOrConst);
+  }
+
+  @override
+  void beginFormalParameterDefaultValueExpression() {}
+
+  void beginIfControlFlow(Token ifToken) {
+    push(ifToken);
+  }
+
+  void beginLiteralString(Token literalString) {
+    assert(identical(literalString.kind, STRING_TOKEN));
+    debugEvent("beginLiteralString");
+
+    push(literalString);
+  }
+
+  @override
+  void beginMetadataStar(Token token) {
+    debugEvent("beginMetadataStar");
+  }
+
+  @override
+  void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
+      Token varFinalOrConst, Token getOrSet, Token name) {
+    _Modifiers modifiers = new _Modifiers();
+    if (externalToken != null) {
+      assert(externalToken.isModifier);
+      modifiers.externalKeyword = externalToken;
     }
+    if (staticToken != null) {
+      assert(staticToken.isModifier);
+      String className = classDeclaration != null
+          ? classDeclaration.name.name
+          : mixinDeclaration.name.name;
+      if (name?.lexeme == className && getOrSet == null) {
+        // This error is also reported in OutlineBuilder.beginMethod
+        handleRecoverableError(
+            messageStaticConstructor, staticToken, staticToken);
+      } else {
+        modifiers.staticKeyword = staticToken;
+      }
+    }
+    if (covariantToken != null) {
+      assert(covariantToken.isModifier);
+      modifiers.covariantKeyword = covariantToken;
+    }
+    if (varFinalOrConst != null) {
+      assert(varFinalOrConst.isModifier);
+      modifiers.finalConstOrVarKeyword = varFinalOrConst;
+    }
+    push(modifiers);
+  }
+
+  @override
+  void beginMixinDeclaration(Token mixinKeyword, Token name) {
+    assert(classDeclaration == null && mixinDeclaration == null);
+  }
+
+  @override
+  void beginNamedMixinApplication(
+      Token begin, Token abstractToken, Token name) {
+    push(new _Modifiers()..abstractKeyword = abstractToken);
+  }
+
+  void beginTopLevelMethod(Token lastConsumed, Token externalToken) {
+    push(new _Modifiers()..externalKeyword = externalToken);
+  }
+
+  @override
+  void beginTypeVariable(Token token) {
+    debugEvent("beginTypeVariable");
+    SimpleIdentifier name = pop();
+    List<Annotation> metadata = pop();
+
+    Comment comment = _findComment(metadata, name.beginToken);
+    var typeParameter = ast.typeParameter(comment, metadata, name, null, null);
+    localDeclarations[name.offset] = typeParameter;
+    push(typeParameter);
+  }
+
+  @override
+  void beginVariablesDeclaration(Token token, Token varFinalOrConst) {
+    debugEvent("beginVariablesDeclaration");
+    if (varFinalOrConst != null) {
+      push(new _Modifiers()..finalConstOrVarKeyword = varFinalOrConst);
+    } else {
+      push(NullValue.Modifiers);
+    }
+  }
+
+  void checkFieldFormalParameters(FormalParameterList parameters) {
+    if (parameters?.parameters != null) {
+      parameters.parameters.forEach((FormalParameter param) {
+        if (param is FieldFormalParameter) {
+          // This error is reported in the BodyBuilder.endFormalParameter.
+          handleRecoverableError(messageFieldInitializerOutsideConstructor,
+              param.thisKeyword, param.thisKeyword);
+        }
+      });
+    }
+  }
+
+  @override
+  void debugEvent(String name) {
+    // printEvent('AstBuilder: $name');
+  }
+
+  @override
+  void discardTypeReplacedWithCommentTypeAssign() {
+    pop();
   }
 
   void doDotExpression(Token dot) {
@@ -594,568 +307,32 @@
     }
   }
 
-  void handleLiteralInt(Token token) {
-    assert(identical(token.kind, INT_TOKEN) ||
-        identical(token.kind, HEXADECIMAL_TOKEN));
-    debugEvent("LiteralInt");
-
-    push(ast.integerLiteral(token, int.tryParse(token.lexeme)));
-  }
-
-  void handleExpressionFunctionBody(Token arrowToken, Token semicolon) {
-    assert(optional('=>', arrowToken) || optional('=', arrowToken));
-    assert(optionalOrNull(';', semicolon));
-    debugEvent("ExpressionFunctionBody");
-
-    Expression expression = pop();
-    pop(); // star (*)
-    Token asyncKeyword = pop();
-    if (parseFunctionBodies) {
-      push(ast.expressionFunctionBody(
-          asyncKeyword, arrowToken, expression, semicolon));
-    } else {
-      push(ast.emptyFunctionBody(semicolon));
-    }
-  }
-
-  void endReturnStatement(
-      bool hasExpression, Token returnKeyword, Token semicolon) {
-    assert(optional('return', returnKeyword));
-    assert(optional(';', semicolon));
-    debugEvent("ReturnStatement");
-
-    Expression expression = hasExpression ? pop() : null;
-    push(ast.returnStatement(returnKeyword, expression, semicolon));
-  }
-
-  void endIfStatement(Token ifToken, Token elseToken) {
-    assert(optional('if', ifToken));
-    assert(optionalOrNull('else', elseToken));
-
-    Statement elsePart = popIfNotNull(elseToken);
-    Statement thenPart = pop();
-    ParenthesizedExpression condition = pop();
-    push(ast.ifStatement(
-        ifToken,
-        condition.leftParenthesis,
-        condition.expression,
-        condition.rightParenthesis,
-        thenPart,
-        elseToken,
-        elsePart));
-  }
-
-  void handleNoInitializers() {
-    debugEvent("NoInitializers");
-
-    if (!isFullAst) return;
-    push(NullValue.ConstructorInitializerSeparator);
-    push(NullValue.ConstructorInitializers);
-  }
-
-  void endInitializers(int count, Token colon, Token endToken) {
-    assert(optional(':', colon));
-    debugEvent("Initializers");
-
-    List<Object> initializerObjects = popTypedList(count) ?? const [];
-    if (!isFullAst) return;
-
-    push(colon);
-
-    var initializers = <ConstructorInitializer>[];
-    for (Object initializerObject in initializerObjects) {
-      if (initializerObject is FunctionExpressionInvocation) {
-        Expression function = initializerObject.function;
-        if (function is SuperExpression) {
-          initializers.add(ast.superConstructorInvocation(function.superKeyword,
-              null, null, initializerObject.argumentList));
-        } else {
-          initializers.add(ast.redirectingConstructorInvocation(
-              (function as ThisExpression).thisKeyword,
-              null,
-              null,
-              initializerObject.argumentList));
-        }
-      } else if (initializerObject is MethodInvocation) {
-        Expression target = initializerObject.target;
-        if (target is SuperExpression) {
-          initializers.add(ast.superConstructorInvocation(
-              target.superKeyword,
-              initializerObject.operator,
-              initializerObject.methodName,
-              initializerObject.argumentList));
-        } else if (target is ThisExpression) {
-          initializers.add(ast.redirectingConstructorInvocation(
-              target.thisKeyword,
-              initializerObject.operator,
-              initializerObject.methodName,
-              initializerObject.argumentList));
-        } else {
-          // Invalid initializer
-          // TODO(danrubel): Capture this in the AST.
-        }
-      } else if (initializerObject is AssignmentExpression) {
-        Token thisKeyword;
-        Token period;
-        SimpleIdentifier fieldName;
-        Expression left = initializerObject.leftHandSide;
-        if (left is PropertyAccess) {
-          Expression target = left.target;
-          if (target is ThisExpression) {
-            thisKeyword = target.thisKeyword;
-            period = left.operator;
-          } else {
-            assert(target is SuperExpression);
-            // Recovery:
-            // Parser has reported FieldInitializedOutsideDeclaringClass.
-          }
-          fieldName = left.propertyName;
-        } else if (left is SimpleIdentifier) {
-          fieldName = left;
-        } else {
-          // Recovery:
-          // Parser has reported invalid assignment.
-          SuperExpression superExpression = left;
-          fieldName = ast.simpleIdentifier(superExpression.superKeyword);
-        }
-        initializers.add(ast.constructorFieldInitializer(
-            thisKeyword,
-            period,
-            fieldName,
-            initializerObject.operator,
-            initializerObject.rightHandSide));
-      } else if (initializerObject is AssertInitializer) {
-        initializers.add(initializerObject);
+  void doInvocation(
+      TypeArgumentList typeArguments, MethodInvocation arguments) {
+    Expression receiver = pop();
+    if (receiver is SimpleIdentifier) {
+      arguments.methodName = receiver;
+      if (typeArguments != null) {
+        arguments.typeArguments = typeArguments;
       }
-    }
-
-    push(initializers);
-  }
-
-  void endVariableInitializer(Token assignmentOperator) {
-    assert(optionalOrNull('=', assignmentOperator));
-    debugEvent("VariableInitializer");
-
-    Expression initializer = pop();
-    SimpleIdentifier identifier = pop();
-    // TODO(ahe): Don't push initializers, instead install them.
-    push(_makeVariableDeclaration(identifier, assignmentOperator, initializer));
-  }
-
-  VariableDeclaration _makeVariableDeclaration(
-      SimpleIdentifier name, Token equals, Expression initializer) {
-    var variableDeclaration =
-        ast.variableDeclaration(name, equals, initializer);
-    localDeclarations[name.offset] = variableDeclaration;
-    return variableDeclaration;
-  }
-
-  @override
-  void endWhileStatement(Token whileKeyword, Token endToken) {
-    assert(optional('while', whileKeyword));
-    debugEvent("WhileStatement");
-
-    Statement body = pop();
-    ParenthesizedExpression condition = pop();
-    push(ast.whileStatement(whileKeyword, condition.leftParenthesis,
-        condition.expression, condition.rightParenthesis, body));
-  }
-
-  @override
-  void endYieldStatement(Token yieldToken, Token starToken, Token semicolon) {
-    assert(optional('yield', yieldToken));
-    assert(optionalOrNull('*', starToken));
-    assert(optional(';', semicolon));
-    debugEvent("YieldStatement");
-
-    Expression expression = pop();
-    push(ast.yieldStatement(yieldToken, starToken, expression, semicolon));
-  }
-
-  @override
-  void handleNoVariableInitializer(Token token) {
-    debugEvent("NoVariableInitializer");
-  }
-
-  void endInitializedIdentifier(Token nameToken) {
-    debugEvent("InitializedIdentifier");
-
-    AstNode node = pop();
-    VariableDeclaration variable;
-    // TODO(paulberry): This seems kludgy.  It would be preferable if we
-    // could respond to a "handleNoVariableInitializer" event by converting a
-    // SimpleIdentifier into a VariableDeclaration, and then when this code was
-    // reached, node would always be a VariableDeclaration.
-    if (node is VariableDeclaration) {
-      variable = node;
-    } else if (node is SimpleIdentifier) {
-      variable = _makeVariableDeclaration(node, null, null);
+      push(arguments);
     } else {
-      unhandled("${node.runtimeType}", "identifier", nameToken.charOffset, uri);
-    }
-    push(variable);
-  }
-
-  @override
-  void beginVariablesDeclaration(Token token, Token varFinalOrConst) {
-    debugEvent("beginVariablesDeclaration");
-    if (varFinalOrConst != null) {
-      push(new _Modifiers()..finalConstOrVarKeyword = varFinalOrConst);
-    } else {
-      push(NullValue.Modifiers);
+      push(ast.functionExpressionInvocation(
+          receiver, typeArguments, arguments.argumentList));
     }
   }
 
-  @override
-  void endVariablesDeclaration(int count, Token semicolon) {
-    assert(optionalOrNull(';', semicolon));
-    debugEvent("VariablesDeclaration");
+  void doPropertyGet() {}
 
-    List<VariableDeclaration> variables = popTypedList(count);
-    _Modifiers modifiers = pop(NullValue.Modifiers);
-    TypeAnnotation type = pop();
-    Token keyword = modifiers?.finalConstOrVarKeyword;
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata,
-        variables[0].beginToken ?? type?.beginToken ?? modifiers.beginToken);
-    push(ast.variableDeclarationStatement(
-        ast.variableDeclarationList(
-            comment, metadata, keyword, type, variables),
-        semicolon));
-  }
+  void endArguments(int count, Token leftParenthesis, Token rightParenthesis) {
+    assert(optional('(', leftParenthesis));
+    assert(optional(')', rightParenthesis));
+    debugEvent("Arguments");
 
-  void handleAssignmentExpression(Token token) {
-    assert(token.type.isAssignmentOperator);
-    debugEvent("AssignmentExpression");
-
-    Expression rhs = pop();
-    Expression lhs = pop();
-    if (!lhs.isAssignable) {
-      // TODO(danrubel): Update the BodyBuilder to report this error.
-      handleRecoverableError(
-          messageMissingAssignableSelector, lhs.beginToken, lhs.endToken);
-    }
-    push(ast.assignmentExpression(lhs, token, rhs));
-  }
-
-  void endBlock(int count, Token leftBracket, Token rightBracket) {
-    assert(optional('{', leftBracket));
-    assert(optional('}', rightBracket));
-    debugEvent("Block");
-
-    List<Statement> statements = popTypedList(count) ?? <Statement>[];
-    push(ast.block(leftBracket, statements, rightBracket));
-  }
-
-  void handleInvalidTopLevelBlock(Token token) {
-    // TODO(danrubel): Consider improved recovery by adding this block
-    // as part of a synthetic top level function.
-    pop(); // block
-  }
-
-  @override
-  void handleForInitializerEmptyStatement(Token token) {
-    debugEvent("ForInitializerEmptyStatement");
-    push(NullValue.Expression);
-  }
-
-  @override
-  void handleForInitializerExpressionStatement(Token token) {
-    debugEvent("ForInitializerExpressionStatement");
-  }
-
-  @override
-  void handleForInitializerLocalVariableDeclaration(Token token) {
-    debugEvent("ForInitializerLocalVariableDeclaration");
-  }
-
-  @override
-  void handleForLoopParts(Token forKeyword, Token leftParen,
-      Token leftSeparator, int updateExpressionCount) {
-    assert(optional('for', forKeyword));
-    assert(optional('(', leftParen));
-    assert(optional(';', leftSeparator));
-    assert(updateExpressionCount >= 0);
-
-    List<Expression> updates = popTypedList(updateExpressionCount);
-    Statement conditionStatement = pop();
-    Object initializerPart = pop();
-
-    Expression condition;
-    Token rightSeparator;
-    if (conditionStatement is ExpressionStatement) {
-      condition = conditionStatement.expression;
-      rightSeparator = conditionStatement.semicolon;
-    } else {
-      rightSeparator = (conditionStatement as EmptyStatement).semicolon;
-    }
-
-    ForParts forLoopParts;
-    if (initializerPart is VariableDeclarationStatement) {
-      forLoopParts = ast.forPartsWithDeclarations(
-        variables: initializerPart.variables,
-        leftSeparator: leftSeparator,
-        condition: condition,
-        rightSeparator: rightSeparator,
-        updaters: updates,
-      );
-    } else {
-      forLoopParts = ast.forPartsWithExpression(
-        initialization: initializerPart as Expression,
-        leftSeparator: leftSeparator,
-        condition: condition,
-        rightSeparator: rightSeparator,
-        updaters: updates,
-      );
-    }
-
-    push(forKeyword);
-    push(leftParen);
-    push(forLoopParts);
-  }
-
-  @override
-  void endForControlFlow(Token token) {
-    debugEvent("endForControlFlow");
-    var entry = pop();
-    ForParts forLoopParts = pop();
-    Token leftParen = pop();
-    Token forToken = pop();
-
-    pushForControlFlowInfo(null, forToken, leftParen, forLoopParts, entry);
-  }
-
-  void pushForControlFlowInfo(Token awaitToken, Token forToken,
-      Token leftParenthesis, ForLoopParts forLoopParts, Object entry) {
-    if (enableControlFlowCollections) {
-      push(ast.forElement(
-        awaitKeyword: awaitToken,
-        forKeyword: forToken,
-        leftParenthesis: leftParenthesis,
-        forLoopParts: forLoopParts,
-        rightParenthesis: leftParenthesis.endGroup,
-        body: entry as CollectionElement,
-      ));
-    } else {
-      handleRecoverableError(
-          templateUnexpectedToken.withArguments(forToken), forToken, forToken);
-      push(entry);
-    }
-  }
-
-  @override
-  void endForStatement(Token endToken) {
-    debugEvent("ForStatement");
-    Statement body = pop();
-    ForParts forLoopParts = pop();
-    Token leftParen = pop();
-    Token forToken = pop();
-
-    if (enableControlFlowCollections || enableSpreadCollections) {
-      push(ast.forStatement2(
-        forKeyword: forToken,
-        leftParenthesis: leftParen,
-        forLoopParts: forLoopParts,
-        rightParenthesis: leftParen.endGroup,
-        body: body,
-      ));
-    } else {
-      VariableDeclarationList variableList;
-      Expression initializer;
-      if (forLoopParts is ForPartsWithDeclarations) {
-        variableList = forLoopParts.variables;
-      } else {
-        initializer = (forLoopParts as ForPartsWithExpression).initialization;
-      }
-      push(ast.forStatement(
-          forToken,
-          leftParen,
-          variableList,
-          initializer,
-          forLoopParts.leftSeparator,
-          forLoopParts.condition,
-          forLoopParts.rightSeparator,
-          forLoopParts.updaters,
-          leftParen?.endGroup,
-          body));
-    }
-  }
-
-  void handleLiteralList(
-      int count, Token leftBracket, Token constKeyword, Token rightBracket) {
-    assert(optional('[', leftBracket));
-    assert(optionalOrNull('const', constKeyword));
-    assert(optional(']', rightBracket));
-    debugEvent("LiteralList");
-
-    if (enableControlFlowCollections || enableSpreadCollections) {
-      List<CollectionElement> elements = popCollectionElements(count);
-
-      TypeArgumentList typeArguments = pop();
-      push(ast.listLiteral2(
-        constKeyword: constKeyword,
-        typeArguments: typeArguments,
-        leftBracket: leftBracket,
-        elements: elements,
-        rightBracket: rightBracket,
-      ));
-    } else {
-      List<Expression> expressions = popTypedList(count);
-      TypeArgumentList typeArguments = pop();
-      push(ast.listLiteral(
-          constKeyword, typeArguments, leftBracket, expressions, rightBracket));
-    }
-  }
-
-  void handleAsyncModifier(Token asyncToken, Token starToken) {
-    assert(asyncToken == null ||
-        optional('async', asyncToken) ||
-        optional('sync', asyncToken));
-    assert(optionalOrNull('*', starToken));
-    debugEvent("AsyncModifier");
-
-    push(asyncToken ?? NullValue.FunctionBodyAsyncToken);
-    push(starToken ?? NullValue.FunctionBodyStarToken);
-  }
-
-  void endAwaitExpression(Token awaitKeyword, Token endToken) {
-    assert(optional('await', awaitKeyword));
-    debugEvent("AwaitExpression");
-
-    push(ast.awaitExpression(awaitKeyword, pop()));
-  }
-
-  void handleLiteralBool(Token token) {
-    bool value = identical(token.stringValue, "true");
-    assert(value || identical(token.stringValue, "false"));
-    debugEvent("LiteralBool");
-
-    push(ast.booleanLiteral(token, value));
-  }
-
-  void handleLiteralDouble(Token token) {
-    assert(token.type == TokenType.DOUBLE);
-    debugEvent("LiteralDouble");
-
-    push(ast.doubleLiteral(token, double.parse(token.lexeme)));
-  }
-
-  void handleLiteralNull(Token token) {
-    assert(optional('null', token));
-    debugEvent("LiteralNull");
-
-    push(ast.nullLiteral(token));
-  }
-
-  @override
-  void handleLiteralSetOrMap(
-      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
-    // TODO(danrubel): From a type resolution standpoint, this could be either
-    // a set literal or a map literal depending upon the context
-    // in which this expression occurs.
-    handleLiteralMap(count, leftBrace, constKeyword, rightBrace);
-  }
-
-  void handleLiteralSet(
-      int count, Token leftBracket, Token constKeyword, Token rightBracket) {
-    assert(optional('{', leftBracket));
-    assert(optionalOrNull('const', constKeyword));
-    assert(optional('}', rightBracket));
-    debugEvent("LiteralSet");
-
-    if (enableControlFlowCollections || enableSpreadCollections) {
-      List<CollectionElement> elements = popCollectionElements(count);
-
-      TypeArgumentList typeArguments = pop();
-      push(ast.setLiteral2(
-        constKeyword: constKeyword,
-        typeArguments: typeArguments,
-        leftBracket: leftBracket,
-        elements: elements,
-        rightBracket: rightBracket,
-      ));
-    } else {
-      List<Expression> entries = popTypedList(count) ?? <Expression>[];
-      TypeArgumentList typeArguments = pop();
-      push(ast.setLiteral(
-          constKeyword, typeArguments, leftBracket, entries, rightBracket));
-    }
-  }
-
-  void handleLiteralMap(
-      int count, Token leftBracket, Token constKeyword, Token rightBracket) {
-    assert(optional('{', leftBracket));
-    assert(optionalOrNull('const', constKeyword));
-    assert(optional('}', rightBracket));
-    debugEvent("LiteralMap");
-
-    if (enableControlFlowCollections || enableSpreadCollections) {
-      List<CollectionElement> entries = popCollectionElements(count);
-      TypeArgumentList typeArguments = pop();
-      push(ast.mapLiteral2(
-        constKeyword: constKeyword,
-        typeArguments: typeArguments,
-        leftBracket: leftBracket,
-        entries: entries,
-        rightBracket: rightBracket,
-      ));
-    } else {
-      List<MapLiteralEntry> entries = <MapLiteralEntry>[];
-      popTypedList(count)?.forEach((entry) {
-        if (entry is MapLiteralEntry) {
-          entries.add(entry);
-        }
-      });
-
-      TypeArgumentList typeArguments = pop();
-      push(ast.mapLiteral(
-          constKeyword, typeArguments, leftBracket, entries, rightBracket));
-    }
-  }
-
-  void handleLiteralMapEntry(Token colon, Token endToken) {
-    assert(optional(':', colon));
-    debugEvent("LiteralMapEntry");
-
-    Expression value = pop();
-    Expression key = pop();
-    push(ast.mapLiteralEntry(key, colon, value));
-  }
-
-  void endLiteralSymbol(Token hashToken, int tokenCount) {
-    assert(optional('#', hashToken));
-    debugEvent("LiteralSymbol");
-
-    List<Token> components = popTypedList(tokenCount);
-    push(ast.symbolLiteral(hashToken, components));
-  }
-
-  @override
-  void handleSuperExpression(Token superKeyword, IdentifierContext context) {
-    assert(optional('super', superKeyword));
-    debugEvent("SuperExpression");
-
-    push(ast.superExpression(superKeyword));
-  }
-
-  @override
-  void handleThisExpression(Token thisKeyword, IdentifierContext context) {
-    assert(optional('this', thisKeyword));
-    debugEvent("ThisExpression");
-
-    push(ast.thisExpression(thisKeyword));
-  }
-
-  @override
-  void handleType(Token beginToken, Token questionMark) {
-    debugEvent("Type");
-    if (!enableNonNullable) {
-      reportErrorIfNullableType(questionMark);
-    }
-
-    TypeArgumentList arguments = pop();
-    Identifier name = pop();
-    push(ast.typeName(name, arguments, question: questionMark));
+    List<Expression> expressions = popTypedList(count);
+    ArgumentList arguments =
+        ast.argumentList(leftParenthesis, expressions, rightParenthesis);
+    push(ast.methodInvocation(null, null, null, null, arguments));
   }
 
   @override
@@ -1194,45 +371,107 @@
     }
   }
 
-  void handleAsOperator(Token asOperator) {
-    assert(optional('as', asOperator));
-    debugEvent("AsOperator");
+  void endAwaitExpression(Token awaitKeyword, Token endToken) {
+    assert(optional('await', awaitKeyword));
+    debugEvent("AwaitExpression");
 
-    TypeAnnotation type = pop();
-    Expression expression = pop();
-    push(ast.asExpression(expression, asOperator, type));
+    push(ast.awaitExpression(awaitKeyword, pop()));
   }
 
   @override
-  void handleBreakStatement(
-      bool hasTarget, Token breakKeyword, Token semicolon) {
-    assert(optional('break', breakKeyword));
-    assert(optional(';', semicolon));
-    debugEvent("BreakStatement");
+  void endBinaryExpression(Token operatorToken) {
+    assert(operatorToken.isOperator ||
+        optional('.', operatorToken) ||
+        optional('?.', operatorToken) ||
+        optional('..', operatorToken));
+    debugEvent("BinaryExpression");
 
-    SimpleIdentifier label = hasTarget ? pop() : null;
-    push(ast.breakStatement(breakKeyword, label, semicolon));
+    if (identical(".", operatorToken.stringValue) ||
+        identical("?.", operatorToken.stringValue) ||
+        identical("..", operatorToken.stringValue)) {
+      doDotExpression(operatorToken);
+    } else {
+      Expression right = pop();
+      Expression left = pop();
+      reportErrorIfSuper(right);
+      push(ast.binaryExpression(left, operatorToken, right));
+    }
+  }
+
+  void endBlock(int count, Token leftBracket, Token rightBracket) {
+    assert(optional('{', leftBracket));
+    assert(optional('}', rightBracket));
+    debugEvent("Block");
+
+    List<Statement> statements = popTypedList(count) ?? <Statement>[];
+    push(ast.block(leftBracket, statements, rightBracket));
+  }
+
+  void endBlockFunctionBody(int count, Token leftBracket, Token rightBracket) {
+    assert(optional('{', leftBracket));
+    assert(optional('}', rightBracket));
+    debugEvent("BlockFunctionBody");
+
+    List<Statement> statements = popTypedList(count);
+    Block block = ast.block(leftBracket, statements, rightBracket);
+    Token star = pop();
+    Token asyncKeyword = pop();
+    if (parseFunctionBodies) {
+      push(ast.blockFunctionBody(asyncKeyword, star, block));
+    } else {
+      // TODO(danrubel): Skip the block rather than parsing it.
+      push(ast.emptyFunctionBody(
+          new SyntheticToken(TokenType.SEMICOLON, leftBracket.charOffset)));
+    }
+  }
+
+  void endCascade() {
+    debugEvent("Cascade");
+
+    Expression expression = pop();
+    CascadeExpression receiver = pop();
+    pop(); // Token.
+    receiver.cascadeSections.add(expression);
+    push(receiver);
   }
 
   @override
-  void handleContinueStatement(
-      bool hasTarget, Token continueKeyword, Token semicolon) {
-    assert(optional('continue', continueKeyword));
-    assert(optional(';', semicolon));
-    debugEvent("ContinueStatement");
-
-    SimpleIdentifier label = hasTarget ? pop() : null;
-    push(ast.continueStatement(continueKeyword, label, semicolon));
+  void endClassDeclaration(Token beginToken, Token endToken) {
+    debugEvent("ClassDeclaration");
+    classDeclaration = null;
   }
 
-  void handleIsOperator(Token isOperator, Token not) {
-    assert(optional('is', isOperator));
-    assert(optionalOrNull('!', not));
-    debugEvent("IsOperator");
+  @override
+  void endClassOrMixinBody(
+      int memberCount, Token leftBracket, Token rightBracket) {
+    assert(optional('{', leftBracket));
+    assert(optional('}', rightBracket));
+    debugEvent("ClassOrMixinBody");
 
-    TypeAnnotation type = pop();
-    Expression expression = pop();
-    push(ast.isExpression(expression, isOperator, not, type));
+    ClassOrMixinDeclarationImpl declaration =
+        classDeclaration ?? mixinDeclaration;
+    declaration.leftBracket = leftBracket;
+    declaration.rightBracket = rightBracket;
+  }
+
+  @override
+  void endCombinators(int count) {
+    debugEvent("Combinators");
+    push(popTypedList<Combinator>(count) ?? NullValue.Combinators);
+  }
+
+  @override
+  void endCompilationUnit(int count, Token endToken) {
+    debugEvent("CompilationUnit");
+
+    Token beginToken = pop();
+    checkEmpty(endToken.charOffset);
+
+    CompilationUnitImpl unit = ast.compilationUnit(
+            beginToken, scriptTag, directives, declarations, endToken)
+        as CompilationUnitImpl;
+    unit.isNonNullable = enableNonNullable;
+    push(unit);
   }
 
   void endConditionalExpression(Token question, Token colon) {
@@ -1249,136 +488,258 @@
         condition, question, thenExpression, colon, elseExpression));
   }
 
-  @override
-  void endRedirectingFactoryBody(Token equalToken, Token endToken) {
-    assert(optional('=', equalToken));
-    debugEvent("RedirectingFactoryBody");
+  void endConditionalUri(Token ifKeyword, Token leftParen, Token equalSign) {
+    assert(optional('if', ifKeyword));
+    assert(optionalOrNull('(', leftParen));
+    assert(optionalOrNull('==', equalSign));
+    debugEvent("ConditionalUri");
 
-    ConstructorName constructorName = pop();
-    Token starToken = pop();
-    Token asyncToken = pop();
-    push(new _RedirectingFactoryBody(
-        asyncToken, starToken, equalToken, constructorName));
+    StringLiteral libraryUri = pop();
+    StringLiteral value = popIfNotNull(equalSign);
+    if (value is StringInterpolation) {
+      for (var child in value.childEntities) {
+        if (child is InterpolationExpression) {
+          // This error is reported in OutlineBuilder.endLiteralString
+          handleRecoverableError(
+              messageInterpolationInUri, child.beginToken, child.endToken);
+          break;
+        }
+      }
+    }
+    DottedName name = pop();
+    push(ast.configuration(ifKeyword, leftParen, name, equalSign, value,
+        leftParen?.endGroup, libraryUri));
   }
 
   @override
-  void endRethrowStatement(Token rethrowToken, Token semicolon) {
-    assert(optional('rethrow', rethrowToken));
+  void endConditionalUris(int count) {
+    debugEvent("ConditionalUris");
+
+    push(popTypedList<Configuration>(count) ?? NullValue.ConditionalUris);
+  }
+
+  @override
+  void endConstExpression(Token constKeyword) {
+    assert(optional('const', constKeyword));
+    debugEvent("ConstExpression");
+
+    _handleInstanceCreation(constKeyword);
+  }
+
+  @override
+  void endConstLiteral(Token token) {
+    debugEvent("endConstLiteral");
+  }
+
+  @override
+  void endConstructorReference(
+      Token start, Token periodBeforeName, Token endToken) {
+    assert(optionalOrNull('.', periodBeforeName));
+    debugEvent("ConstructorReference");
+
+    SimpleIdentifier constructorName = pop();
+    TypeArgumentList typeArguments = pop();
+    Identifier typeNameIdentifier = pop();
+    push(ast.constructorName(ast.typeName(typeNameIdentifier, typeArguments),
+        periodBeforeName, constructorName));
+  }
+
+  @override
+  void endDoWhileStatement(
+      Token doKeyword, Token whileKeyword, Token semicolon) {
+    assert(optional('do', doKeyword));
+    assert(optional('while', whileKeyword));
     assert(optional(';', semicolon));
-    debugEvent("RethrowStatement");
+    debugEvent("DoWhileStatement");
 
-    RethrowExpression expression = ast.rethrowExpression(rethrowToken);
-    // TODO(scheglov) According to the specification, 'rethrow' is a statement.
-    push(ast.expressionStatement(expression, semicolon));
-  }
-
-  void handleThrowExpression(Token throwToken, Token endToken) {
-    assert(optional('throw', throwToken));
-    debugEvent("ThrowExpression");
-
-    push(ast.throwExpression(throwToken, pop()));
+    ParenthesizedExpression condition = pop();
+    Statement body = pop();
+    push(ast.doStatement(
+        doKeyword,
+        body,
+        whileKeyword,
+        condition.leftParenthesis,
+        condition.expression,
+        condition.rightParenthesis,
+        semicolon));
   }
 
   @override
-  void endOptionalFormalParameters(
-      int count, Token leftDelimeter, Token rightDelimeter) {
-    assert((optional('[', leftDelimeter) && optional(']', rightDelimeter)) ||
-        (optional('{', leftDelimeter) && optional('}', rightDelimeter)));
-    debugEvent("OptionalFormalParameters");
-
-    push(new _OptionalFormalParameters(
-        popTypedList(count), leftDelimeter, rightDelimeter));
+  void endDoWhileStatementBody(Token token) {
+    debugEvent("endDoWhileStatementBody");
   }
 
   @override
-  void beginFormalParameterDefaultValueExpression() {}
-
-  @override
-  void endFormalParameterDefaultValueExpression() {
-    debugEvent("FormalParameterDefaultValueExpression");
-  }
-
-  void handleValuedFormalParameter(Token equals, Token token) {
-    assert(optional('=', equals) || optional(':', equals));
-    debugEvent("ValuedFormalParameter");
-
-    Expression value = pop();
-    push(new _ParameterDefaultValue(equals, value));
+  void endElseStatement(Token token) {
+    debugEvent("endElseStatement");
   }
 
   @override
-  void endFunctionType(Token functionToken, Token questionMark) {
-    assert(optional('Function', functionToken));
-    debugEvent("FunctionType");
-    if (!enableNonNullable) {
-      reportErrorIfNullableType(questionMark);
+  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+    assert(optional('enum', enumKeyword));
+    assert(optional('{', leftBrace));
+    debugEvent("Enum");
+
+    List<EnumConstantDeclaration> constants = popTypedList(count);
+    SimpleIdentifier name = pop();
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata, enumKeyword);
+    declarations.add(ast.enumDeclaration(comment, metadata, enumKeyword, name,
+        leftBrace, constants, leftBrace?.endGroup));
+  }
+
+  void endExport(Token exportKeyword, Token semicolon) {
+    assert(optional('export', exportKeyword));
+    assert(optional(';', semicolon));
+    debugEvent("Export");
+
+    List<Combinator> combinators = pop();
+    List<Configuration> configurations = pop();
+    StringLiteral uri = pop();
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata, exportKeyword);
+    directives.add(ast.exportDirective(comment, metadata, exportKeyword, uri,
+        configurations, combinators, semicolon));
+  }
+
+  @override
+  void endFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    assert(optional('factory', factoryKeyword));
+    assert(optional(';', endToken) || optional('}', endToken));
+    debugEvent("FactoryMethod");
+
+    FunctionBody body;
+    Token separator;
+    ConstructorName redirectedConstructor;
+    Object bodyObject = pop();
+    if (bodyObject is FunctionBody) {
+      body = bodyObject;
+    } else if (bodyObject is _RedirectingFactoryBody) {
+      separator = bodyObject.equalToken;
+      redirectedConstructor = bodyObject.constructorName;
+      body = ast.emptyFunctionBody(endToken);
+    } else {
+      unhandled("${bodyObject.runtimeType}", "bodyObject",
+          beginToken.charOffset, uri);
     }
 
     FormalParameterList parameters = pop();
-    TypeAnnotation returnType = pop();
     TypeParameterList typeParameters = pop();
-    push(ast.genericFunctionType(
-        returnType, functionToken, typeParameters, parameters,
-        question: questionMark));
-  }
+    Object constructorName = pop();
+    _Modifiers modifiers = pop();
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata, beginToken);
 
-  void handleFormalParameterWithoutValue(Token token) {
-    debugEvent("FormalParameterWithoutValue");
+    assert(parameters != null);
 
-    push(NullValue.ParameterDefaultValue);
-  }
-
-  @override
-  void endForInExpression(Token token) {
-    debugEvent("ForInExpression");
-  }
-
-  @override
-  void handleForInLoopParts(Token awaitToken, Token forToken,
-      Token leftParenthesis, Token inKeyword) {
-    assert(optionalOrNull('await', awaitToken));
-    assert(optional('for', forToken));
-    assert(optional('(', leftParenthesis));
-    assert(optional('in', inKeyword) || optional(':', inKeyword));
-
-    Expression iterator = pop();
-    Object variableOrDeclaration = pop();
-
-    ForEachParts forLoopParts;
-    if (variableOrDeclaration is VariableDeclarationStatement) {
-      VariableDeclarationList variableList = variableOrDeclaration.variables;
-      forLoopParts = ast.forEachPartsWithDeclaration(
-        loopVariable: ast.declaredIdentifier(
-            variableList.documentationComment,
-            variableList.metadata,
-            variableList.keyword,
-            variableList.type,
-            variableList.variables.first.name),
-        inKeyword: inKeyword,
-        iterable: iterator,
-      );
-    } else {
-      if (variableOrDeclaration is! SimpleIdentifier) {
-        // Parser has already reported the error.
-        if (!leftParenthesis.next.isIdentifier) {
-          parser.rewriter.insertToken(
-              leftParenthesis,
-              new SyntheticStringToken(
-                  TokenType.IDENTIFIER, '', leftParenthesis.next.charOffset));
-        }
-        variableOrDeclaration = ast.simpleIdentifier(leftParenthesis.next);
-      }
-      forLoopParts = ast.forEachPartsWithIdentifier(
-        identifier: variableOrDeclaration,
-        inKeyword: inKeyword,
-        iterable: iterator,
-      );
+    if (typeParameters != null) {
+      // TODO(danrubel): Update OutlineBuilder to report this error message.
+      handleRecoverableError(messageConstructorWithTypeParameters,
+          typeParameters.beginToken, typeParameters.endToken);
     }
 
-    push(awaitToken ?? NullValue.AwaitToken);
-    push(forToken);
-    push(leftParenthesis);
-    push(forLoopParts);
+    // Decompose the preliminary ConstructorName into the type name and
+    // the actual constructor name.
+    SimpleIdentifier returnType;
+    Token period;
+    SimpleIdentifier name;
+    Identifier typeName = constructorName;
+    if (typeName is SimpleIdentifier) {
+      returnType = typeName;
+    } else if (typeName is PrefixedIdentifier) {
+      returnType = typeName.prefix;
+      period = typeName.period;
+      name =
+          ast.simpleIdentifier(typeName.identifier.token, isDeclaration: true);
+    }
+
+    (classDeclaration ?? mixinDeclaration).members.add(
+        ast.constructorDeclaration(
+            comment,
+            metadata,
+            modifiers?.externalKeyword,
+            modifiers?.finalConstOrVarKeyword,
+            factoryKeyword,
+            ast.simpleIdentifier(returnType.token),
+            period,
+            name,
+            parameters,
+            separator,
+            null,
+            redirectedConstructor,
+            body));
+  }
+
+  void endFieldInitializer(Token assignment, Token token) {
+    assert(optional('=', assignment));
+    debugEvent("FieldInitializer");
+
+    Expression initializer = pop();
+    SimpleIdentifier name = pop();
+    push(_makeVariableDeclaration(name, assignment, initializer));
+  }
+
+  @override
+  void endFields(Token staticToken, Token covariantToken, Token varFinalOrConst,
+      int count, Token beginToken, Token semicolon) {
+    assert(optional(';', semicolon));
+    debugEvent("Fields");
+
+    List<VariableDeclaration> variables = popTypedList(count);
+    TypeAnnotation type = pop();
+    _Modifiers modifiers = new _Modifiers()
+      ..staticKeyword = staticToken
+      ..covariantKeyword = covariantToken
+      ..finalConstOrVarKeyword = varFinalOrConst;
+    var variableList = ast.variableDeclarationList(
+        null, null, modifiers?.finalConstOrVarKeyword, type, variables);
+    Token covariantKeyword = modifiers?.covariantKeyword;
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata, beginToken);
+    (classDeclaration ?? mixinDeclaration).members.add(ast.fieldDeclaration2(
+        comment: comment,
+        metadata: metadata,
+        covariantKeyword: covariantKeyword,
+        staticKeyword: modifiers?.staticKeyword,
+        fieldList: variableList,
+        semicolon: semicolon));
+  }
+
+  @override
+  void endForControlFlow(Token token) {
+    debugEvent("endForControlFlow");
+    var entry = pop();
+    ForParts forLoopParts = pop();
+    Token leftParen = pop();
+    Token forToken = pop();
+
+    pushForControlFlowInfo(null, forToken, leftParen, forLoopParts, entry);
+  }
+
+  @override
+  void endForIn(Token endToken) {
+    debugEvent("ForInExpression");
+
+    Statement body = pop();
+    ForEachParts forLoopParts = pop();
+    Token leftParenthesis = pop();
+    Token forToken = pop();
+    Token awaitToken = pop(NullValue.AwaitToken);
+
+    push(ast.forStatement2(
+      awaitKeyword: awaitToken,
+      forKeyword: forToken,
+      leftParenthesis: leftParenthesis,
+      forLoopParts: forLoopParts,
+      rightParenthesis: leftParenthesis.endGroup,
+      body: body,
+    ));
+  }
+
+  @override
+  void endForInBody(Token token) {
+    debugEvent("endForInBody");
   }
 
   @override
@@ -1396,53 +757,8 @@
   }
 
   @override
-  void endForIn(Token endToken) {
+  void endForInExpression(Token token) {
     debugEvent("ForInExpression");
-
-    Statement body = pop();
-    ForEachParts forLoopParts = pop();
-    Token leftParenthesis = pop();
-    Token forToken = pop();
-    Token awaitToken = pop(NullValue.AwaitToken);
-
-    if (enableControlFlowCollections || enableSpreadCollections) {
-      push(ast.forStatement2(
-        awaitKeyword: awaitToken,
-        forKeyword: forToken,
-        leftParenthesis: leftParenthesis,
-        forLoopParts: forLoopParts,
-        rightParenthesis: leftParenthesis.endGroup,
-        body: body,
-      ));
-    } else if (forLoopParts is ForEachPartsWithDeclaration) {
-      push(ast.forEachStatementWithDeclaration(
-          awaitToken,
-          forToken,
-          leftParenthesis,
-          forLoopParts.loopVariable,
-          forLoopParts.inKeyword,
-          forLoopParts.iterable,
-          leftParenthesis?.endGroup,
-          body));
-    } else {
-      push(ast.forEachStatementWithReference(
-          awaitToken,
-          forToken,
-          leftParenthesis,
-          (forLoopParts as ForEachPartsWithIdentifier).identifier,
-          forLoopParts.inKeyword,
-          forLoopParts.iterable,
-          leftParenthesis?.endGroup,
-          body));
-    }
-  }
-
-  @override
-  void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
-      Token varFinalOrConst) {
-    push(new _Modifiers()
-      ..covariantKeyword = covariantToken
-      ..finalConstOrVarKeyword = varFinalOrConst);
   }
 
   @override
@@ -1529,20 +845,8 @@
   }
 
   @override
-  void endFunctionTypedFormalParameter(Token nameToken) {
-    debugEvent("FunctionTypedFormalParameter");
-
-    FormalParameterList formalParameters = pop();
-    TypeAnnotation returnType = pop();
-    TypeParameterList typeParameters = pop();
-
-    // Create a temporary formal parameter that will be dissected later in
-    // [endFormalParameter].
-    push(ast.functionTypedFormalParameter2(
-        identifier: null,
-        returnType: returnType,
-        typeParameters: typeParameters,
-        parameters: formalParameters));
+  void endFormalParameterDefaultValueExpression() {
+    debugEvent("FormalParameterDefaultValueExpression");
   }
 
   void endFormalParameters(
@@ -1569,6 +873,683 @@
   }
 
   @override
+  void endForStatement(Token endToken) {
+    debugEvent("ForStatement");
+    Statement body = pop();
+    ForParts forLoopParts = pop();
+    Token leftParen = pop();
+    Token forToken = pop();
+
+    push(ast.forStatement2(
+      forKeyword: forToken,
+      leftParenthesis: leftParen,
+      forLoopParts: forLoopParts,
+      rightParenthesis: leftParen.endGroup,
+      body: body,
+    ));
+  }
+
+  @override
+  void endForStatementBody(Token token) {
+    debugEvent("endForStatementBody");
+  }
+
+  @override
+  void endFunctionExpression(Token beginToken, Token token) {
+    // TODO(paulberry): set up scopes properly to resolve parameters and type
+    // variables.  Note that this is tricky due to the handling of initializers
+    // in constructors, so the logic should be shared with BodyBuilder as much
+    // as possible.
+    debugEvent("FunctionExpression");
+
+    FunctionBody body = pop();
+    FormalParameterList parameters = pop();
+    TypeParameterList typeParameters = pop();
+    push(ast.functionExpression(typeParameters, parameters, body));
+  }
+
+  @override
+  void endFunctionName(Token beginToken, Token token) {
+    debugEvent("FunctionName");
+  }
+
+  @override
+  void endFunctionType(Token functionToken, Token questionMark) {
+    assert(optional('Function', functionToken));
+    debugEvent("FunctionType");
+    if (!enableNonNullable) {
+      reportErrorIfNullableType(questionMark);
+    }
+
+    FormalParameterList parameters = pop();
+    TypeAnnotation returnType = pop();
+    TypeParameterList typeParameters = pop();
+    push(ast.genericFunctionType(
+        returnType, functionToken, typeParameters, parameters,
+        question: questionMark));
+  }
+
+  @override
+  void endFunctionTypeAlias(
+      Token typedefKeyword, Token equals, Token semicolon) {
+    assert(optional('typedef', typedefKeyword));
+    assert(optionalOrNull('=', equals));
+    assert(optional(';', semicolon));
+    debugEvent("FunctionTypeAlias");
+
+    if (equals == null) {
+      FormalParameterList parameters = pop();
+      TypeParameterList typeParameters = pop();
+      SimpleIdentifier name = pop();
+      TypeAnnotation returnType = pop();
+      List<Annotation> metadata = pop();
+      Comment comment = _findComment(metadata, typedefKeyword);
+      declarations.add(ast.functionTypeAlias(comment, metadata, typedefKeyword,
+          returnType, name, typeParameters, parameters, semicolon));
+    } else {
+      TypeAnnotation type = pop();
+      TypeParameterList templateParameters = pop();
+      SimpleIdentifier name = pop();
+      List<Annotation> metadata = pop();
+      Comment comment = _findComment(metadata, typedefKeyword);
+      if (type is! GenericFunctionType) {
+        // This error is also reported in the OutlineBuilder.
+        handleRecoverableError(messageTypedefNotFunction, equals, equals);
+        type = null;
+      }
+      declarations.add(ast.genericTypeAlias(
+          comment,
+          metadata,
+          typedefKeyword,
+          name,
+          templateParameters,
+          equals,
+          type as GenericFunctionType,
+          semicolon));
+    }
+  }
+
+  @override
+  void endFunctionTypedFormalParameter(Token nameToken) {
+    debugEvent("FunctionTypedFormalParameter");
+
+    FormalParameterList formalParameters = pop();
+    TypeAnnotation returnType = pop();
+    TypeParameterList typeParameters = pop();
+
+    // Create a temporary formal parameter that will be dissected later in
+    // [endFormalParameter].
+    push(ast.functionTypedFormalParameter2(
+        identifier: null,
+        returnType: returnType,
+        typeParameters: typeParameters,
+        parameters: formalParameters));
+  }
+
+  @override
+  void endHide(Token hideKeyword) {
+    assert(optional('hide', hideKeyword));
+    debugEvent("Hide");
+
+    List<SimpleIdentifier> hiddenNames = pop();
+    push(ast.hideCombinator(hideKeyword, hiddenNames));
+  }
+
+  @override
+  void endIfControlFlow(Token token) {
+    CollectionElement thenElement = pop();
+    ParenthesizedExpression condition = pop();
+    Token ifToken = pop();
+    pushIfControlFlowInfo(ifToken, condition, thenElement, null, null);
+  }
+
+  @override
+  void endIfElseControlFlow(Token token) {
+    CollectionElement elseElement = pop();
+    Token elseToken = pop();
+    CollectionElement thenElement = pop();
+    ParenthesizedExpression condition = pop();
+    Token ifToken = pop();
+    pushIfControlFlowInfo(
+        ifToken, condition, thenElement, elseToken, elseElement);
+  }
+
+  void endIfStatement(Token ifToken, Token elseToken) {
+    assert(optional('if', ifToken));
+    assert(optionalOrNull('else', elseToken));
+
+    Statement elsePart = popIfNotNull(elseToken);
+    Statement thenPart = pop();
+    ParenthesizedExpression condition = pop();
+    push(ast.ifStatement(
+        ifToken,
+        condition.leftParenthesis,
+        condition.expression,
+        condition.rightParenthesis,
+        thenPart,
+        elseToken,
+        elsePart));
+  }
+
+  @override
+  void endImplicitCreationExpression(Token token) {
+    debugEvent("ImplicitCreationExpression");
+
+    _handleInstanceCreation(null);
+  }
+
+  @override
+  void endImport(Token importKeyword, Token semicolon) {
+    assert(optional('import', importKeyword));
+    assert(optionalOrNull(';', semicolon));
+    debugEvent("Import");
+
+    List<Combinator> combinators = pop();
+    Token deferredKeyword = pop(NullValue.Deferred);
+    Token asKeyword = pop(NullValue.As);
+    SimpleIdentifier prefix = pop(NullValue.Prefix);
+    List<Configuration> configurations = pop();
+    StringLiteral uri = pop();
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata, importKeyword);
+
+    directives.add(ast.importDirective(
+        comment,
+        metadata,
+        importKeyword,
+        uri,
+        configurations,
+        deferredKeyword,
+        asKeyword,
+        prefix,
+        combinators,
+        semicolon));
+  }
+
+  void endInitializedIdentifier(Token nameToken) {
+    debugEvent("InitializedIdentifier");
+
+    AstNode node = pop();
+    VariableDeclaration variable;
+    // TODO(paulberry): This seems kludgy.  It would be preferable if we
+    // could respond to a "handleNoVariableInitializer" event by converting a
+    // SimpleIdentifier into a VariableDeclaration, and then when this code was
+    // reached, node would always be a VariableDeclaration.
+    if (node is VariableDeclaration) {
+      variable = node;
+    } else if (node is SimpleIdentifier) {
+      variable = _makeVariableDeclaration(node, null, null);
+    } else {
+      unhandled("${node.runtimeType}", "identifier", nameToken.charOffset, uri);
+    }
+    push(variable);
+  }
+
+  void endInitializers(int count, Token colon, Token endToken) {
+    assert(optional(':', colon));
+    debugEvent("Initializers");
+
+    List<Object> initializerObjects = popTypedList(count) ?? const [];
+    if (!isFullAst) return;
+
+    push(colon);
+
+    var initializers = <ConstructorInitializer>[];
+    for (Object initializerObject in initializerObjects) {
+      if (initializerObject is FunctionExpressionInvocation) {
+        Expression function = initializerObject.function;
+        if (function is SuperExpression) {
+          initializers.add(ast.superConstructorInvocation(function.superKeyword,
+              null, null, initializerObject.argumentList));
+        } else {
+          initializers.add(ast.redirectingConstructorInvocation(
+              (function as ThisExpression).thisKeyword,
+              null,
+              null,
+              initializerObject.argumentList));
+        }
+      } else if (initializerObject is MethodInvocation) {
+        Expression target = initializerObject.target;
+        if (target is SuperExpression) {
+          initializers.add(ast.superConstructorInvocation(
+              target.superKeyword,
+              initializerObject.operator,
+              initializerObject.methodName,
+              initializerObject.argumentList));
+        } else if (target is ThisExpression) {
+          initializers.add(ast.redirectingConstructorInvocation(
+              target.thisKeyword,
+              initializerObject.operator,
+              initializerObject.methodName,
+              initializerObject.argumentList));
+        } else {
+          // Invalid initializer
+          // TODO(danrubel): Capture this in the AST.
+        }
+      } else if (initializerObject is AssignmentExpression) {
+        Token thisKeyword;
+        Token period;
+        SimpleIdentifier fieldName;
+        Expression left = initializerObject.leftHandSide;
+        if (left is PropertyAccess) {
+          Expression target = left.target;
+          if (target is ThisExpression) {
+            thisKeyword = target.thisKeyword;
+            period = left.operator;
+          } else {
+            assert(target is SuperExpression);
+            // Recovery:
+            // Parser has reported FieldInitializedOutsideDeclaringClass.
+          }
+          fieldName = left.propertyName;
+        } else if (left is SimpleIdentifier) {
+          fieldName = left;
+        } else {
+          // Recovery:
+          // Parser has reported invalid assignment.
+          SuperExpression superExpression = left;
+          fieldName = ast.simpleIdentifier(superExpression.superKeyword);
+        }
+        initializers.add(ast.constructorFieldInitializer(
+            thisKeyword,
+            period,
+            fieldName,
+            initializerObject.operator,
+            initializerObject.rightHandSide));
+      } else if (initializerObject is AssertInitializer) {
+        initializers.add(initializerObject);
+      }
+    }
+
+    push(initializers);
+  }
+
+  @override
+  void endLabeledStatement(int labelCount) {
+    debugEvent("LabeledStatement");
+
+    Statement statement = pop();
+    List<Label> labels = popTypedList(labelCount);
+    push(ast.labeledStatement(labels, statement));
+  }
+
+  @override
+  void endLibraryName(Token libraryKeyword, Token semicolon) {
+    assert(optional('library', libraryKeyword));
+    assert(optional(';', semicolon));
+    debugEvent("LibraryName");
+
+    List<SimpleIdentifier> libraryName = pop();
+    var name = ast.libraryIdentifier(libraryName);
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata, libraryKeyword);
+    directives.add(ast.libraryDirective(
+        comment, metadata, libraryKeyword, name, semicolon));
+  }
+
+  @override
+  void endLiteralString(int interpolationCount, Token endToken) {
+    debugEvent("endLiteralString");
+
+    if (interpolationCount == 0) {
+      Token token = pop();
+      String value = unescapeString(token.lexeme, token, this);
+      push(ast.simpleStringLiteral(token, value));
+    } else {
+      List<Object> parts = popTypedList(1 + interpolationCount * 2);
+      Token first = parts.first;
+      Token last = parts.last;
+      Quote quote = analyzeQuote(first.lexeme);
+      List<InterpolationElement> elements = <InterpolationElement>[];
+      elements.add(ast.interpolationString(
+          first, unescapeFirstStringPart(first.lexeme, quote, first, this)));
+      for (int i = 1; i < parts.length - 1; i++) {
+        var part = parts[i];
+        if (part is Token) {
+          elements.add(ast.interpolationString(
+              part, unescape(part.lexeme, quote, part, this)));
+        } else if (part is InterpolationExpression) {
+          elements.add(part);
+        } else {
+          unhandled("${part.runtimeType}", "string interpolation",
+              first.charOffset, uri);
+        }
+      }
+      elements.add(ast.interpolationString(
+          last,
+          unescapeLastStringPart(
+              last.lexeme, quote, last, last.isSynthetic, this)));
+      push(ast.stringInterpolation(elements));
+    }
+  }
+
+  void endLiteralSymbol(Token hashToken, int tokenCount) {
+    assert(optional('#', hashToken));
+    debugEvent("LiteralSymbol");
+
+    List<Token> components = popTypedList(tokenCount);
+    push(ast.symbolLiteral(hashToken, components));
+  }
+
+  @override
+  void endLocalFunctionDeclaration(Token token) {
+    debugEvent("LocalFunctionDeclaration");
+    FunctionBody body = pop();
+    if (isFullAst) {
+      pop(); // constructor initializers
+      pop(); // separator before constructor initializers
+    }
+    FormalParameterList parameters = pop();
+    checkFieldFormalParameters(parameters);
+    SimpleIdentifier name = pop();
+    TypeAnnotation returnType = pop();
+    TypeParameterList typeParameters = pop();
+    List<Annotation> metadata = pop(NullValue.Metadata);
+    FunctionExpression functionExpression =
+        ast.functionExpression(typeParameters, parameters, body);
+    var functionDeclaration = ast.functionDeclaration(
+        null, metadata, null, returnType, null, name, functionExpression);
+    localDeclarations[name.offset] = functionDeclaration;
+    push(ast.functionDeclarationStatement(functionDeclaration));
+  }
+
+  @override
+  void endMember() {
+    debugEvent("Member");
+  }
+
+  @override
+  void endMetadata(Token atSign, Token periodBeforeName, Token endToken) {
+    assert(optional('@', atSign));
+    assert(optionalOrNull('.', periodBeforeName));
+    debugEvent("Metadata");
+
+    MethodInvocation invocation = pop();
+    SimpleIdentifier constructorName = periodBeforeName != null ? pop() : null;
+    pop(); // Type arguments, not allowed.
+    Identifier name = pop();
+    push(ast.annotation(atSign, name, periodBeforeName, constructorName,
+        invocation?.argumentList));
+  }
+
+  @override
+  void endMetadataStar(int count) {
+    debugEvent("MetadataStar");
+
+    push(popTypedList<Annotation>(count) ?? NullValue.Metadata);
+  }
+
+  @override
+  void endMethod(
+      Token getOrSet, Token beginToken, Token beginParam, Token endToken) {
+    assert(getOrSet == null ||
+        optional('get', getOrSet) ||
+        optional('set', getOrSet));
+    debugEvent("Method");
+
+    var bodyObject = pop();
+    List<ConstructorInitializer> initializers = pop() ?? const [];
+    Token separator = pop();
+    FormalParameterList parameters = pop();
+    TypeParameterList typeParameters = pop();
+    var name = pop();
+    TypeAnnotation returnType = pop();
+    _Modifiers modifiers = pop();
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata, beginToken);
+
+    assert(parameters != null || optional('get', getOrSet));
+
+    ConstructorName redirectedConstructor;
+    FunctionBody body;
+    if (bodyObject is FunctionBody) {
+      body = bodyObject;
+    } else if (bodyObject is _RedirectingFactoryBody) {
+      separator = bodyObject.equalToken;
+      redirectedConstructor = bodyObject.constructorName;
+      body = ast.emptyFunctionBody(endToken);
+    } else {
+      unhandled("${bodyObject.runtimeType}", "bodyObject",
+          beginToken.charOffset, uri);
+    }
+
+    ClassOrMixinDeclarationImpl declaration =
+        classDeclaration ?? mixinDeclaration;
+
+    void constructor(
+        SimpleIdentifier prefixOrName, Token period, SimpleIdentifier name) {
+      if (typeParameters != null) {
+        // Outline builder also reports this error message.
+        handleRecoverableError(messageConstructorWithTypeParameters,
+            typeParameters.beginToken, typeParameters.endToken);
+      }
+      if (modifiers?.constKeyword != null &&
+          body != null &&
+          (body.length > 1 || body.beginToken?.lexeme != ';')) {
+        // This error is also reported in BodyBuilder.finishFunction
+        Token bodyToken = body.beginToken ?? modifiers.constKeyword;
+        handleRecoverableError(
+            messageConstConstructorWithBody, bodyToken, bodyToken);
+      }
+      if (returnType != null) {
+        // This error is also reported in OutlineBuilder.endMethod
+        handleRecoverableError(messageConstructorWithReturnType,
+            returnType.beginToken, returnType.beginToken);
+      }
+      ConstructorDeclaration constructor = ast.constructorDeclaration(
+          comment,
+          metadata,
+          modifiers?.externalKeyword,
+          modifiers?.finalConstOrVarKeyword,
+          null,
+          // TODO(paulberry): factoryKeyword
+          ast.simpleIdentifier(prefixOrName.token),
+          period,
+          name,
+          parameters,
+          separator,
+          initializers,
+          redirectedConstructor,
+          body);
+      declaration.members.add(constructor);
+      if (mixinDeclaration != null) {
+        // TODO (danrubel): Report an error if this is a mixin declaration.
+      }
+    }
+
+    void method(Token operatorKeyword, SimpleIdentifier name) {
+      if (modifiers?.constKeyword != null &&
+          body != null &&
+          (body.length > 1 || body.beginToken?.lexeme != ';')) {
+        // This error is also reported in OutlineBuilder.endMethod
+        handleRecoverableError(
+            messageConstMethod, modifiers.constKeyword, modifiers.constKeyword);
+      }
+      checkFieldFormalParameters(parameters);
+      declaration.members.add(ast.methodDeclaration(
+          comment,
+          metadata,
+          modifiers?.externalKeyword,
+          modifiers?.abstractKeyword ?? modifiers?.staticKeyword,
+          returnType,
+          getOrSet,
+          operatorKeyword,
+          name,
+          typeParameters,
+          parameters,
+          body));
+    }
+
+    if (name is SimpleIdentifier) {
+      if (name.name == declaration.name.name && getOrSet == null) {
+        constructor(name, null, null);
+      } else if (initializers.isNotEmpty) {
+        constructor(name, null, null);
+      } else {
+        method(null, name);
+      }
+    } else if (name is _OperatorName) {
+      method(name.operatorKeyword, name.name);
+    } else if (name is PrefixedIdentifier) {
+      constructor(name.prefix, name.period, name.identifier);
+    } else {
+      throw new UnimplementedError();
+    }
+  }
+
+  @override
+  void endMixinDeclaration(Token mixinKeyword, Token endToken) {
+    debugEvent("MixinDeclaration");
+    mixinDeclaration = null;
+  }
+
+  @override
+  void endNamedFunctionExpression(Token endToken) {
+    debugEvent("NamedFunctionExpression");
+    FunctionBody body = pop();
+    if (isFullAst) {
+      pop(); // constructor initializers
+      pop(); // separator before constructor initializers
+    }
+    FormalParameterList parameters = pop();
+    pop(); // name
+    pop(); // returnType
+    TypeParameterList typeParameters = pop();
+    push(ast.functionExpression(typeParameters, parameters, body));
+  }
+
+  @override
+  void endNamedMixinApplication(Token beginToken, Token classKeyword,
+      Token equalsToken, Token implementsKeyword, Token semicolon) {
+    assert(optional('class', classKeyword));
+    assert(optionalOrNull('=', equalsToken));
+    assert(optionalOrNull('implements', implementsKeyword));
+    assert(optional(';', semicolon));
+    debugEvent("NamedMixinApplication");
+
+    ImplementsClause implementsClause;
+    if (implementsKeyword != null) {
+      List<TypeName> interfaces = pop();
+      implementsClause = ast.implementsClause(implementsKeyword, interfaces);
+    }
+    WithClause withClause = pop(NullValue.WithClause);
+    TypeName superclass = pop();
+    _Modifiers modifiers = pop();
+    TypeParameterList typeParameters = pop();
+    SimpleIdentifier name = pop();
+    Token abstractKeyword = modifiers?.abstractKeyword;
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata, beginToken);
+    declarations.add(ast.classTypeAlias(
+        comment,
+        metadata,
+        classKeyword,
+        name,
+        typeParameters,
+        equalsToken,
+        abstractKeyword,
+        superclass,
+        withClause,
+        implementsClause,
+        semicolon));
+  }
+
+  @override
+  void endNewExpression(Token newKeyword) {
+    assert(optional('new', newKeyword));
+    debugEvent("NewExpression");
+
+    _handleInstanceCreation(newKeyword);
+  }
+
+  @override
+  void endOptionalFormalParameters(
+      int count, Token leftDelimeter, Token rightDelimeter) {
+    assert((optional('[', leftDelimeter) && optional(']', rightDelimeter)) ||
+        (optional('{', leftDelimeter) && optional('}', rightDelimeter)));
+    debugEvent("OptionalFormalParameters");
+
+    push(new _OptionalFormalParameters(
+        popTypedList(count), leftDelimeter, rightDelimeter));
+  }
+
+  @override
+  void endPart(Token partKeyword, Token semicolon) {
+    assert(optional('part', partKeyword));
+    assert(optional(';', semicolon));
+    debugEvent("Part");
+
+    StringLiteral uri = pop();
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata, partKeyword);
+    directives
+        .add(ast.partDirective(comment, metadata, partKeyword, uri, semicolon));
+  }
+
+  @override
+  void endPartOf(
+      Token partKeyword, Token ofKeyword, Token semicolon, bool hasName) {
+    assert(optional('part', partKeyword));
+    assert(optional('of', ofKeyword));
+    assert(optional(';', semicolon));
+    debugEvent("PartOf");
+    var libraryNameOrUri = pop();
+    LibraryIdentifier name;
+    StringLiteral uri;
+    if (libraryNameOrUri is StringLiteral) {
+      uri = libraryNameOrUri;
+    } else {
+      name = ast.libraryIdentifier(libraryNameOrUri as List<SimpleIdentifier>);
+    }
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata, partKeyword);
+    directives.add(ast.partOfDirective(
+        comment, metadata, partKeyword, ofKeyword, uri, name, semicolon));
+  }
+
+  @override
+  void endRedirectingFactoryBody(Token equalToken, Token endToken) {
+    assert(optional('=', equalToken));
+    debugEvent("RedirectingFactoryBody");
+
+    ConstructorName constructorName = pop();
+    Token starToken = pop();
+    Token asyncToken = pop();
+    push(new _RedirectingFactoryBody(
+        asyncToken, starToken, equalToken, constructorName));
+  }
+
+  @override
+  void endRethrowStatement(Token rethrowToken, Token semicolon) {
+    assert(optional('rethrow', rethrowToken));
+    assert(optional(';', semicolon));
+    debugEvent("RethrowStatement");
+
+    RethrowExpression expression = ast.rethrowExpression(rethrowToken);
+    // TODO(scheglov) According to the specification, 'rethrow' is a statement.
+    push(ast.expressionStatement(expression, semicolon));
+  }
+
+  void endReturnStatement(
+      bool hasExpression, Token returnKeyword, Token semicolon) {
+    assert(optional('return', returnKeyword));
+    assert(optional(';', semicolon));
+    debugEvent("ReturnStatement");
+
+    Expression expression = hasExpression ? pop() : null;
+    push(ast.returnStatement(returnKeyword, expression, semicolon));
+  }
+
+  @override
+  void endShow(Token showKeyword) {
+    assert(optional('show', showKeyword));
+    debugEvent("Show");
+
+    List<SimpleIdentifier> shownNames = pop();
+    push(ast.showCombinator(showKeyword, shownNames));
+  }
+
+  @override
   void endSwitchBlock(int caseCount, Token leftBracket, Token rightBracket) {
     assert(optional('{', leftBracket));
     assert(optional('}', rightBracket));
@@ -1648,17 +1629,6 @@
   }
 
   @override
-  void handleCaseMatch(Token caseKeyword, Token colon) {
-    assert(optional('case', caseKeyword));
-    assert(optional(':', colon));
-    debugEvent("CaseMatch");
-
-    Expression expression = pop();
-    push(ast.switchCase(
-        <Label>[], caseKeyword, expression, colon, <Statement>[]));
-  }
-
-  @override
   void endSwitchStatement(Token switchKeyword, Token endToken) {
     assert(optional('switch', switchKeyword));
     debugEvent("SwitchStatement");
@@ -1677,6 +1647,263 @@
         rightBracket));
   }
 
+  @override
+  void endThenStatement(Token token) {
+    debugEvent("endThenStatement");
+  }
+
+  @override
+  void endTopLevelDeclaration(Token token) {
+    debugEvent("TopLevelDeclaration");
+  }
+
+  void endTopLevelFields(Token staticToken, Token covariantToken,
+      Token varFinalOrConst, int count, Token beginToken, Token semicolon) {
+    assert(optional(';', semicolon));
+    debugEvent("TopLevelFields");
+
+    List<VariableDeclaration> variables = popTypedList(count);
+    TypeAnnotation type = pop();
+    _Modifiers modifiers = new _Modifiers()
+      ..staticKeyword = staticToken
+      ..covariantKeyword = covariantToken
+      ..finalConstOrVarKeyword = varFinalOrConst;
+    Token keyword = modifiers?.finalConstOrVarKeyword;
+    var variableList =
+        ast.variableDeclarationList(null, null, keyword, type, variables);
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata, beginToken);
+    declarations.add(ast.topLevelVariableDeclaration(
+        comment, metadata, variableList, semicolon));
+  }
+
+  void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
+    // TODO(paulberry): set up scopes properly to resolve parameters and type
+    // variables.
+    assert(getOrSet == null ||
+        optional('get', getOrSet) ||
+        optional('set', getOrSet));
+    debugEvent("TopLevelMethod");
+
+    FunctionBody body = pop();
+    FormalParameterList parameters = pop();
+    TypeParameterList typeParameters = pop();
+    SimpleIdentifier name = pop();
+    TypeAnnotation returnType = pop();
+    _Modifiers modifiers = pop();
+    Token externalKeyword = modifiers?.externalKeyword;
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata, beginToken);
+    declarations.add(ast.functionDeclaration(
+        comment,
+        metadata,
+        externalKeyword,
+        returnType,
+        getOrSet,
+        name,
+        ast.functionExpression(typeParameters, parameters, body)));
+  }
+
+  void endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
+    assert(optional('try', tryKeyword));
+    assert(optionalOrNull('finally', finallyKeyword));
+    debugEvent("TryStatement");
+
+    Block finallyBlock = popIfNotNull(finallyKeyword);
+    List<CatchClause> catchClauses = popTypedList(catchCount);
+    Block body = pop();
+    push(ast.tryStatement(
+        tryKeyword, body, catchClauses, finallyKeyword, finallyBlock));
+  }
+
+  @override
+  void endTypeArguments(int count, Token leftBracket, Token rightBracket) {
+    assert(optional('<', leftBracket));
+    assert(optional('>', rightBracket));
+    debugEvent("TypeArguments");
+
+    List<TypeAnnotation> arguments = popTypedList(count);
+    push(ast.typeArgumentList(leftBracket, arguments, rightBracket));
+  }
+
+  @override
+  void endTypeList(int count) {
+    debugEvent("TypeList");
+    push(popTypedList<TypeName>(count) ?? NullValue.TypeList);
+  }
+
+  @override
+  void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+    debugEvent("TypeVariable");
+    assert(extendsOrSuper == null ||
+        optional('extends', extendsOrSuper) ||
+        optional('super', extendsOrSuper));
+    TypeAnnotation bound = pop();
+
+    // Peek to leave type parameters on top of stack.
+    List<TypeParameter> typeParameters = peek();
+    typeParameters[index]
+      ..extendsKeyword = extendsOrSuper
+      ..bound = bound;
+  }
+
+  @override
+  void endTypeVariables(Token beginToken, Token endToken) {
+    assert(optional('<', beginToken));
+    assert(optional('>', endToken));
+    debugEvent("TypeVariables");
+
+    List<TypeParameter> typeParameters = pop();
+    push(ast.typeParameterList(beginToken, typeParameters, endToken));
+  }
+
+  void endVariableInitializer(Token assignmentOperator) {
+    assert(optionalOrNull('=', assignmentOperator));
+    debugEvent("VariableInitializer");
+
+    Expression initializer = pop();
+    SimpleIdentifier identifier = pop();
+    // TODO(ahe): Don't push initializers, instead install them.
+    push(_makeVariableDeclaration(identifier, assignmentOperator, initializer));
+  }
+
+  @override
+  void endVariablesDeclaration(int count, Token semicolon) {
+    assert(optionalOrNull(';', semicolon));
+    debugEvent("VariablesDeclaration");
+
+    List<VariableDeclaration> variables = popTypedList(count);
+    _Modifiers modifiers = pop(NullValue.Modifiers);
+    TypeAnnotation type = pop();
+    Token keyword = modifiers?.finalConstOrVarKeyword;
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata,
+        variables[0].beginToken ?? type?.beginToken ?? modifiers.beginToken);
+    push(ast.variableDeclarationStatement(
+        ast.variableDeclarationList(
+            comment, metadata, keyword, type, variables),
+        semicolon));
+  }
+
+  @override
+  void endWhileStatement(Token whileKeyword, Token endToken) {
+    assert(optional('while', whileKeyword));
+    debugEvent("WhileStatement");
+
+    Statement body = pop();
+    ParenthesizedExpression condition = pop();
+    push(ast.whileStatement(whileKeyword, condition.leftParenthesis,
+        condition.expression, condition.rightParenthesis, body));
+  }
+
+  @override
+  void endWhileStatementBody(Token token) {
+    debugEvent("endWhileStatementBody");
+  }
+
+  @override
+  void endYieldStatement(Token yieldToken, Token starToken, Token semicolon) {
+    assert(optional('yield', yieldToken));
+    assert(optionalOrNull('*', starToken));
+    assert(optional(';', semicolon));
+    debugEvent("YieldStatement");
+
+    Expression expression = pop();
+    push(ast.yieldStatement(yieldToken, starToken, expression, semicolon));
+  }
+
+  @override
+  void exitLocalScope() {}
+
+  @override
+  AstNode finishFields() {
+    debugEvent("finishFields");
+
+    if (classDeclaration != null) {
+      return classDeclaration.members
+          .removeAt(classDeclaration.members.length - 1);
+    } else if (mixinDeclaration != null) {
+      return mixinDeclaration.members
+          .removeAt(mixinDeclaration.members.length - 1);
+    } else {
+      return declarations.removeLast();
+    }
+  }
+
+  void finishFunction(
+      List annotations, formals, AsyncMarker asyncModifier, FunctionBody body) {
+    debugEvent("finishFunction");
+
+    Statement bodyStatement;
+    if (body is EmptyFunctionBody) {
+      bodyStatement = ast.emptyStatement(body.semicolon);
+    } else if (body is NativeFunctionBody) {
+      // TODO(danrubel): what do we need to do with NativeFunctionBody?
+    } else if (body is ExpressionFunctionBody) {
+      bodyStatement = ast.returnStatement(null, body.expression, null);
+    } else {
+      bodyStatement = (body as BlockFunctionBody).block;
+    }
+    // TODO(paulberry): what do we need to do with bodyStatement at this point?
+    bodyStatement; // Suppress "unused local variable" hint
+  }
+
+  void handleAsOperator(Token asOperator) {
+    assert(optional('as', asOperator));
+    debugEvent("AsOperator");
+
+    TypeAnnotation type = pop();
+    Expression expression = pop();
+    push(ast.asExpression(expression, asOperator, type));
+  }
+
+  void handleAssignmentExpression(Token token) {
+    assert(token.type.isAssignmentOperator);
+    debugEvent("AssignmentExpression");
+
+    Expression rhs = pop();
+    Expression lhs = pop();
+    if (!lhs.isAssignable) {
+      // TODO(danrubel): Update the BodyBuilder to report this error.
+      handleRecoverableError(
+          messageMissingAssignableSelector, lhs.beginToken, lhs.endToken);
+    }
+    push(ast.assignmentExpression(lhs, token, rhs));
+  }
+
+  void handleAsyncModifier(Token asyncToken, Token starToken) {
+    assert(asyncToken == null ||
+        optional('async', asyncToken) ||
+        optional('sync', asyncToken));
+    assert(optionalOrNull('*', starToken));
+    debugEvent("AsyncModifier");
+
+    push(asyncToken ?? NullValue.FunctionBodyAsyncToken);
+    push(starToken ?? NullValue.FunctionBodyStarToken);
+  }
+
+  @override
+  void handleBreakStatement(
+      bool hasTarget, Token breakKeyword, Token semicolon) {
+    assert(optional('break', breakKeyword));
+    assert(optional(';', semicolon));
+    debugEvent("BreakStatement");
+
+    SimpleIdentifier label = hasTarget ? pop() : null;
+    push(ast.breakStatement(breakKeyword, label, semicolon));
+  }
+
+  @override
+  void handleCaseMatch(Token caseKeyword, Token colon) {
+    assert(optional('case', caseKeyword));
+    assert(optional(':', colon));
+    debugEvent("CaseMatch");
+
+    Expression expression = pop();
+    push(ast.switchCase(
+        <Label>[], caseKeyword, expression, colon, <Statement>[]));
+  }
+
   void handleCatchBlock(Token onKeyword, Token catchKeyword, Token comma) {
     assert(optionalOrNull('on', onKeyword));
     assert(optionalOrNull('catch', catchKeyword));
@@ -1712,365 +1939,6 @@
   }
 
   @override
-  void handleFinallyBlock(Token finallyKeyword) {
-    debugEvent("FinallyBlock");
-    // The finally block is popped in "endTryStatement".
-  }
-
-  void endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
-    assert(optional('try', tryKeyword));
-    assert(optionalOrNull('finally', finallyKeyword));
-    debugEvent("TryStatement");
-
-    Block finallyBlock = popIfNotNull(finallyKeyword);
-    List<CatchClause> catchClauses = popTypedList(catchCount);
-    Block body = pop();
-    push(ast.tryStatement(
-        tryKeyword, body, catchClauses, finallyKeyword, finallyBlock));
-  }
-
-  @override
-  void handleLabel(Token colon) {
-    assert(optionalOrNull(':', colon));
-    debugEvent("Label");
-
-    SimpleIdentifier name = pop();
-    push(ast.label(name, colon));
-  }
-
-  void handleIndexedExpression(Token leftBracket, Token rightBracket) {
-    assert(optional('[', leftBracket));
-    assert(optional(']', rightBracket));
-    debugEvent("IndexedExpression");
-
-    Expression index = pop();
-    Expression target = pop();
-    if (target == null) {
-      CascadeExpression receiver = pop();
-      Token token = peek();
-      push(receiver);
-      IndexExpression expression = ast.indexExpressionForCascade(
-          token, leftBracket, index, rightBracket);
-      assert(expression.isCascaded);
-      push(expression);
-    } else {
-      push(ast.indexExpressionForTarget(
-          target, leftBracket, index, rightBracket));
-    }
-  }
-
-  @override
-  void handleInvalidExpression(Token token) {
-    debugEvent("InvalidExpression");
-  }
-
-  @override
-  void handleInvalidFunctionBody(Token leftBracket) {
-    assert(optional('{', leftBracket));
-    assert(optional('}', leftBracket.endGroup));
-    debugEvent("InvalidFunctionBody");
-    Block block = ast.block(leftBracket, [], leftBracket.endGroup);
-    Token star = pop();
-    Token asyncKeyword = pop();
-    push(ast.blockFunctionBody(asyncKeyword, star, block));
-  }
-
-  void handleUnaryPrefixExpression(Token operator) {
-    assert(operator.type.isUnaryPrefixOperator);
-    debugEvent("UnaryPrefixExpression");
-
-    push(ast.prefixExpression(operator, pop()));
-  }
-
-  void handleUnaryPrefixAssignmentExpression(Token operator) {
-    assert(operator.type.isUnaryPrefixOperator);
-    debugEvent("UnaryPrefixAssignmentExpression");
-
-    Expression expression = pop();
-    if (!expression.isAssignable) {
-      // This error is also reported by the body builder.
-      handleRecoverableError(messageMissingAssignableSelector,
-          expression.endToken, expression.endToken);
-    }
-    push(ast.prefixExpression(operator, expression));
-  }
-
-  void handleUnaryPostfixAssignmentExpression(Token operator) {
-    assert(operator.type.isUnaryPostfixOperator);
-    debugEvent("UnaryPostfixAssignmentExpression");
-
-    Expression expression = pop();
-    if (!expression.isAssignable) {
-      // This error is also reported by the body builder.
-      handleRecoverableError(
-          messageIllegalAssignmentToNonAssignable, operator, operator);
-    }
-    push(ast.postfixExpression(expression, operator));
-  }
-
-  void beginTopLevelMethod(Token lastConsumed, Token externalToken) {
-    push(new _Modifiers()..externalKeyword = externalToken);
-  }
-
-  void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
-    // TODO(paulberry): set up scopes properly to resolve parameters and type
-    // variables.
-    assert(getOrSet == null ||
-        optional('get', getOrSet) ||
-        optional('set', getOrSet));
-    debugEvent("TopLevelMethod");
-
-    FunctionBody body = pop();
-    FormalParameterList parameters = pop();
-    TypeParameterList typeParameters = pop();
-    SimpleIdentifier name = pop();
-    TypeAnnotation returnType = pop();
-    _Modifiers modifiers = pop();
-    Token externalKeyword = modifiers?.externalKeyword;
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, beginToken);
-    declarations.add(ast.functionDeclaration(
-        comment,
-        metadata,
-        externalKeyword,
-        returnType,
-        getOrSet,
-        name,
-        ast.functionExpression(typeParameters, parameters, body)));
-  }
-
-  @override
-  void endTopLevelDeclaration(Token token) {
-    debugEvent("TopLevelDeclaration");
-  }
-
-  @override
-  void handleInvalidTopLevelDeclaration(Token endToken) {
-    debugEvent("InvalidTopLevelDeclaration");
-
-    pop(); // metadata star
-    // TODO(danrubel): consider creating a AST node
-    // representing the invalid declaration to better support code completion,
-    // quick fixes, etc, rather than discarding the metadata and token
-  }
-
-  @override
-  void beginCompilationUnit(Token token) {
-    push(token);
-  }
-
-  @override
-  void endCompilationUnit(int count, Token endToken) {
-    debugEvent("CompilationUnit");
-
-    Token beginToken = pop();
-    checkEmpty(endToken.charOffset);
-
-    push(ast.compilationUnit(
-        beginToken, scriptTag, directives, declarations, endToken));
-  }
-
-  @override
-  void handleImportPrefix(Token deferredKeyword, Token asKeyword) {
-    assert(optionalOrNull('deferred', deferredKeyword));
-    assert(optionalOrNull('as', asKeyword));
-    debugEvent("ImportPrefix");
-
-    if (asKeyword == null) {
-      // If asKeyword is null, then no prefix has been pushed on the stack.
-      // Push a placeholder indicating that there is no prefix.
-      push(NullValue.Prefix);
-      push(NullValue.As);
-    } else {
-      push(asKeyword);
-    }
-    push(deferredKeyword ?? NullValue.Deferred);
-  }
-
-  @override
-  void endImport(Token importKeyword, Token semicolon) {
-    assert(optional('import', importKeyword));
-    assert(optionalOrNull(';', semicolon));
-    debugEvent("Import");
-
-    List<Combinator> combinators = pop();
-    Token deferredKeyword = pop(NullValue.Deferred);
-    Token asKeyword = pop(NullValue.As);
-    SimpleIdentifier prefix = pop(NullValue.Prefix);
-    List<Configuration> configurations = pop();
-    StringLiteral uri = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, importKeyword);
-
-    directives.add(ast.importDirective(
-        comment,
-        metadata,
-        importKeyword,
-        uri,
-        configurations,
-        deferredKeyword,
-        asKeyword,
-        prefix,
-        combinators,
-        semicolon));
-  }
-
-  @override
-  void handleRecoverImport(Token semicolon) {
-    assert(optionalOrNull(';', semicolon));
-    debugEvent("RecoverImport");
-
-    List<Combinator> combinators = pop();
-    Token deferredKeyword = pop(NullValue.Deferred);
-    Token asKeyword = pop(NullValue.As);
-    SimpleIdentifier prefix = pop(NullValue.Prefix);
-    List<Configuration> configurations = pop();
-
-    ImportDirective directive = directives.last;
-    if (combinators != null) {
-      directive.combinators.addAll(combinators);
-    }
-    directive.deferredKeyword ??= deferredKeyword;
-    if (directive.asKeyword == null && asKeyword != null) {
-      directive.asKeyword = asKeyword;
-      directive.prefix = prefix;
-    }
-    if (configurations != null) {
-      directive.configurations.addAll(configurations);
-    }
-    directive.semicolon = semicolon;
-  }
-
-  void endExport(Token exportKeyword, Token semicolon) {
-    assert(optional('export', exportKeyword));
-    assert(optional(';', semicolon));
-    debugEvent("Export");
-
-    List<Combinator> combinators = pop();
-    List<Configuration> configurations = pop();
-    StringLiteral uri = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, exportKeyword);
-    directives.add(ast.exportDirective(comment, metadata, exportKeyword, uri,
-        configurations, combinators, semicolon));
-  }
-
-  @override
-  void handleDottedName(int count, Token firstIdentifier) {
-    assert(firstIdentifier.isIdentifier);
-    debugEvent("DottedName");
-
-    List<SimpleIdentifier> components = popTypedList(count);
-    push(ast.dottedName(components));
-  }
-
-  @override
-  void endDoWhileStatement(
-      Token doKeyword, Token whileKeyword, Token semicolon) {
-    assert(optional('do', doKeyword));
-    assert(optional('while', whileKeyword));
-    assert(optional(';', semicolon));
-    debugEvent("DoWhileStatement");
-
-    ParenthesizedExpression condition = pop();
-    Statement body = pop();
-    push(ast.doStatement(
-        doKeyword,
-        body,
-        whileKeyword,
-        condition.leftParenthesis,
-        condition.expression,
-        condition.rightParenthesis,
-        semicolon));
-  }
-
-  void endConditionalUri(Token ifKeyword, Token leftParen, Token equalSign) {
-    assert(optional('if', ifKeyword));
-    assert(optionalOrNull('(', leftParen));
-    assert(optionalOrNull('==', equalSign));
-    debugEvent("ConditionalUri");
-
-    StringLiteral libraryUri = pop();
-    StringLiteral value = popIfNotNull(equalSign);
-    if (value is StringInterpolation) {
-      for (var child in value.childEntities) {
-        if (child is InterpolationExpression) {
-          // This error is reported in OutlineBuilder.endLiteralString
-          handleRecoverableError(
-              messageInterpolationInUri, child.beginToken, child.endToken);
-          break;
-        }
-      }
-    }
-    DottedName name = pop();
-    push(ast.configuration(ifKeyword, leftParen, name, equalSign, value,
-        leftParen?.endGroup, libraryUri));
-  }
-
-  @override
-  void endConditionalUris(int count) {
-    debugEvent("ConditionalUris");
-
-    push(popTypedList<Configuration>(count) ?? NullValue.ConditionalUris);
-  }
-
-  @override
-  void handleIdentifierList(int count) {
-    debugEvent("IdentifierList");
-
-    push(popTypedList<SimpleIdentifier>(count) ?? NullValue.IdentifierList);
-  }
-
-  @override
-  void endShow(Token showKeyword) {
-    assert(optional('show', showKeyword));
-    debugEvent("Show");
-
-    List<SimpleIdentifier> shownNames = pop();
-    push(ast.showCombinator(showKeyword, shownNames));
-  }
-
-  @override
-  void endHide(Token hideKeyword) {
-    assert(optional('hide', hideKeyword));
-    debugEvent("Hide");
-
-    List<SimpleIdentifier> hiddenNames = pop();
-    push(ast.hideCombinator(hideKeyword, hiddenNames));
-  }
-
-  @override
-  void endCombinators(int count) {
-    debugEvent("Combinators");
-    push(popTypedList<Combinator>(count) ?? NullValue.Combinators);
-  }
-
-  @override
-  void endTypeList(int count) {
-    debugEvent("TypeList");
-    push(popTypedList<TypeName>(count) ?? NullValue.TypeList);
-  }
-
-  @override
-  void endClassOrMixinBody(
-      int memberCount, Token leftBracket, Token rightBracket) {
-    assert(optional('{', leftBracket));
-    assert(optional('}', rightBracket));
-    debugEvent("ClassOrMixinBody");
-
-    ClassOrMixinDeclarationImpl declaration =
-        classDeclaration ?? mixinDeclaration;
-    declaration.leftBracket = leftBracket;
-    declaration.rightBracket = rightBracket;
-  }
-
-  @override
-  void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
-    assert(classDeclaration == null && mixinDeclaration == null);
-    push(new _Modifiers()..abstractKeyword = abstractToken);
-  }
-
-  @override
   void handleClassExtends(Token extendsKeyword) {
     assert(extendsKeyword == null || extendsKeyword.isKeywordOrIdentifier);
     debugEvent("ClassExtends");
@@ -2084,32 +1952,6 @@
   }
 
   @override
-  void handleClassWithClause(Token withKeyword) {
-    assert(optional('with', withKeyword));
-    List<TypeName> mixinTypes = pop();
-    push(ast.withClause(withKeyword, mixinTypes));
-  }
-
-  @override
-  void handleClassNoWithClause() {
-    push(NullValue.WithClause);
-  }
-
-  @override
-  void handleClassOrMixinImplements(
-      Token implementsKeyword, int interfacesCount) {
-    assert(optionalOrNull('implements', implementsKeyword));
-    debugEvent("ClassImplements");
-
-    if (implementsKeyword != null) {
-      List<TypeName> interfaces = popTypedList(interfacesCount);
-      push(ast.implementsClause(implementsKeyword, interfaces));
-    } else {
-      push(NullValue.IdentifierList);
-    }
-  }
-
-  @override
   void handleClassHeader(Token begin, Token classKeyword, Token nativeToken) {
     assert(optional('class', classKeyword));
     assert(optionalOrNull('native', nativeToken));
@@ -2141,7 +1983,8 @@
       extendsClause,
       withClause,
       implementsClause,
-      null, // leftBracket
+      null,
+      // leftBracket
       <ClassMember>[],
       null, // rightBracket
     );
@@ -2151,6 +1994,755 @@
   }
 
   @override
+  void handleClassNoWithClause() {
+    push(NullValue.WithClause);
+  }
+
+  @override
+  void handleClassOrMixinImplements(
+      Token implementsKeyword, int interfacesCount) {
+    assert(optionalOrNull('implements', implementsKeyword));
+    debugEvent("ClassImplements");
+
+    if (implementsKeyword != null) {
+      List<TypeName> interfaces = popTypedList(interfacesCount);
+      push(ast.implementsClause(implementsKeyword, interfaces));
+    } else {
+      push(NullValue.IdentifierList);
+    }
+  }
+
+  @override
+  void handleClassWithClause(Token withKeyword) {
+    assert(optional('with', withKeyword));
+    List<TypeName> mixinTypes = pop();
+    push(ast.withClause(withKeyword, mixinTypes));
+  }
+
+  @override
+  void handleCommentReference(
+      Token newKeyword, Token prefix, Token period, Token token) {
+    Identifier identifier = ast.simpleIdentifier(token);
+    if (prefix != null) {
+      identifier = ast.prefixedIdentifier(
+          ast.simpleIdentifier(prefix), period, identifier);
+    }
+    push(ast.commentReference(newKeyword, identifier));
+  }
+
+  @override
+  void handleCommentReferenceText(String referenceSource, int referenceOffset) {
+    push(referenceSource);
+    push(referenceOffset);
+  }
+
+  @override
+  void handleContinueStatement(
+      bool hasTarget, Token continueKeyword, Token semicolon) {
+    assert(optional('continue', continueKeyword));
+    assert(optional(';', semicolon));
+    debugEvent("ContinueStatement");
+
+    SimpleIdentifier label = hasTarget ? pop() : null;
+    push(ast.continueStatement(continueKeyword, label, semicolon));
+  }
+
+  @override
+  void handleDottedName(int count, Token firstIdentifier) {
+    assert(firstIdentifier.isIdentifier);
+    debugEvent("DottedName");
+
+    List<SimpleIdentifier> components = popTypedList(count);
+    push(ast.dottedName(components));
+  }
+
+  @override
+  void handleElseControlFlow(Token elseToken) {
+    push(elseToken);
+  }
+
+  @override
+  void handleEmptyFunctionBody(Token semicolon) {
+    assert(optional(';', semicolon));
+    debugEvent("EmptyFunctionBody");
+
+    // TODO(scheglov) Change the parser to not produce these modifiers.
+    pop(); // star
+    pop(); // async
+    push(ast.emptyFunctionBody(semicolon));
+  }
+
+  @override
+  void handleEmptyStatement(Token semicolon) {
+    assert(optional(';', semicolon));
+    debugEvent("EmptyStatement");
+
+    push(ast.emptyStatement(semicolon));
+  }
+
+  void handleExpressionFunctionBody(Token arrowToken, Token semicolon) {
+    assert(optional('=>', arrowToken) || optional('=', arrowToken));
+    assert(optionalOrNull(';', semicolon));
+    debugEvent("ExpressionFunctionBody");
+
+    Expression expression = pop();
+    pop(); // star (*)
+    Token asyncKeyword = pop();
+    if (parseFunctionBodies) {
+      push(ast.expressionFunctionBody(
+          asyncKeyword, arrowToken, expression, semicolon));
+    } else {
+      push(ast.emptyFunctionBody(semicolon));
+    }
+  }
+
+  void handleExpressionStatement(Token semicolon) {
+    assert(optional(';', semicolon));
+    debugEvent("ExpressionStatement");
+    Expression expression = pop();
+    reportErrorIfSuper(expression);
+    if (expression is SimpleIdentifier &&
+        expression.token?.keyword?.isBuiltInOrPseudo == false) {
+      // This error is also reported by the body builder.
+      handleRecoverableError(
+          messageExpectedStatement, expression.beginToken, expression.endToken);
+    }
+    if (expression is AssignmentExpression) {
+      if (!expression.leftHandSide.isAssignable) {
+        // This error is also reported by the body builder.
+        handleRecoverableError(
+            messageIllegalAssignmentToNonAssignable,
+            expression.leftHandSide.beginToken,
+            expression.leftHandSide.endToken);
+      }
+    }
+    push(ast.expressionStatement(expression, semicolon));
+  }
+
+  @override
+  void handleFinallyBlock(Token finallyKeyword) {
+    debugEvent("FinallyBlock");
+    // The finally block is popped in "endTryStatement".
+  }
+
+  @override
+  void handleForInitializerEmptyStatement(Token token) {
+    debugEvent("ForInitializerEmptyStatement");
+    push(NullValue.Expression);
+  }
+
+  @override
+  void handleForInitializerExpressionStatement(Token token) {
+    debugEvent("ForInitializerExpressionStatement");
+  }
+
+  @override
+  void handleForInitializerLocalVariableDeclaration(Token token) {
+    debugEvent("ForInitializerLocalVariableDeclaration");
+  }
+
+  @override
+  void handleForInLoopParts(Token awaitToken, Token forToken,
+      Token leftParenthesis, Token inKeyword) {
+    assert(optionalOrNull('await', awaitToken));
+    assert(optional('for', forToken));
+    assert(optional('(', leftParenthesis));
+    assert(optional('in', inKeyword) || optional(':', inKeyword));
+
+    Expression iterator = pop();
+    Object variableOrDeclaration = pop();
+
+    ForEachParts forLoopParts;
+    if (variableOrDeclaration is VariableDeclarationStatement) {
+      VariableDeclarationList variableList = variableOrDeclaration.variables;
+      forLoopParts = ast.forEachPartsWithDeclaration(
+        loopVariable: ast.declaredIdentifier(
+            variableList.documentationComment,
+            variableList.metadata,
+            variableList.keyword,
+            variableList.type,
+            variableList.variables.first.name),
+        inKeyword: inKeyword,
+        iterable: iterator,
+      );
+    } else {
+      if (variableOrDeclaration is! SimpleIdentifier) {
+        // Parser has already reported the error.
+        if (!leftParenthesis.next.isIdentifier) {
+          parser.rewriter.insertToken(
+              leftParenthesis,
+              new SyntheticStringToken(
+                  TokenType.IDENTIFIER, '', leftParenthesis.next.charOffset));
+        }
+        variableOrDeclaration = ast.simpleIdentifier(leftParenthesis.next);
+      }
+      forLoopParts = ast.forEachPartsWithIdentifier(
+        identifier: variableOrDeclaration,
+        inKeyword: inKeyword,
+        iterable: iterator,
+      );
+    }
+
+    push(awaitToken ?? NullValue.AwaitToken);
+    push(forToken);
+    push(leftParenthesis);
+    push(forLoopParts);
+  }
+
+  @override
+  void handleForLoopParts(Token forKeyword, Token leftParen,
+      Token leftSeparator, int updateExpressionCount) {
+    assert(optional('for', forKeyword));
+    assert(optional('(', leftParen));
+    assert(optional(';', leftSeparator));
+    assert(updateExpressionCount >= 0);
+
+    List<Expression> updates = popTypedList(updateExpressionCount);
+    Statement conditionStatement = pop();
+    Object initializerPart = pop();
+
+    Expression condition;
+    Token rightSeparator;
+    if (conditionStatement is ExpressionStatement) {
+      condition = conditionStatement.expression;
+      rightSeparator = conditionStatement.semicolon;
+    } else {
+      rightSeparator = (conditionStatement as EmptyStatement).semicolon;
+    }
+
+    ForParts forLoopParts;
+    if (initializerPart is VariableDeclarationStatement) {
+      forLoopParts = ast.forPartsWithDeclarations(
+        variables: initializerPart.variables,
+        leftSeparator: leftSeparator,
+        condition: condition,
+        rightSeparator: rightSeparator,
+        updaters: updates,
+      );
+    } else {
+      forLoopParts = ast.forPartsWithExpression(
+        initialization: initializerPart as Expression,
+        leftSeparator: leftSeparator,
+        condition: condition,
+        rightSeparator: rightSeparator,
+        updaters: updates,
+      );
+    }
+
+    push(forKeyword);
+    push(leftParen);
+    push(forLoopParts);
+  }
+
+  void handleFormalParameterWithoutValue(Token token) {
+    debugEvent("FormalParameterWithoutValue");
+
+    push(NullValue.ParameterDefaultValue);
+  }
+
+  void handleIdentifier(Token token, IdentifierContext context) {
+    assert(token.isKeywordOrIdentifier);
+    debugEvent("handleIdentifier");
+
+    if (context.inSymbol) {
+      push(token);
+      return;
+    }
+
+    SimpleIdentifier identifier =
+        ast.simpleIdentifier(token, isDeclaration: context.inDeclaration);
+    if (context.inLibraryOrPartOfDeclaration) {
+      if (!context.isContinuation) {
+        push([identifier]);
+      } else {
+        push(identifier);
+      }
+    } else if (context == IdentifierContext.enumValueDeclaration) {
+      List<Annotation> metadata = pop();
+      Comment comment = _findComment(null, token);
+      push(ast.enumConstantDeclaration(comment, metadata, identifier));
+    } else {
+      push(identifier);
+    }
+  }
+
+  @override
+  void handleIdentifierList(int count) {
+    debugEvent("IdentifierList");
+
+    push(popTypedList<SimpleIdentifier>(count) ?? NullValue.IdentifierList);
+  }
+
+  @override
+  void handleImportPrefix(Token deferredKeyword, Token asKeyword) {
+    assert(optionalOrNull('deferred', deferredKeyword));
+    assert(optionalOrNull('as', asKeyword));
+    debugEvent("ImportPrefix");
+
+    if (asKeyword == null) {
+      // If asKeyword is null, then no prefix has been pushed on the stack.
+      // Push a placeholder indicating that there is no prefix.
+      push(NullValue.Prefix);
+      push(NullValue.As);
+    } else {
+      push(asKeyword);
+    }
+    push(deferredKeyword ?? NullValue.Deferred);
+  }
+
+  void handleIndexedExpression(Token leftBracket, Token rightBracket) {
+    assert(optional('[', leftBracket));
+    assert(optional(']', rightBracket));
+    debugEvent("IndexedExpression");
+
+    Expression index = pop();
+    Expression target = pop();
+    if (target == null) {
+      CascadeExpression receiver = pop();
+      Token token = peek();
+      push(receiver);
+      IndexExpression expression = ast.indexExpressionForCascade(
+          token, leftBracket, index, rightBracket);
+      assert(expression.isCascaded);
+      push(expression);
+    } else {
+      push(ast.indexExpressionForTarget(
+          target, leftBracket, index, rightBracket));
+    }
+  }
+
+  @override
+  void handleInterpolationExpression(Token leftBracket, Token rightBracket) {
+    Expression expression = pop();
+    push(ast.interpolationExpression(leftBracket, expression, rightBracket));
+  }
+
+  @override
+  void handleInvalidExpression(Token token) {
+    debugEvent("InvalidExpression");
+  }
+
+  @override
+  void handleInvalidFunctionBody(Token leftBracket) {
+    assert(optional('{', leftBracket));
+    assert(optional('}', leftBracket.endGroup));
+    debugEvent("InvalidFunctionBody");
+    Block block = ast.block(leftBracket, [], leftBracket.endGroup);
+    Token star = pop();
+    Token asyncKeyword = pop();
+    push(ast.blockFunctionBody(asyncKeyword, star, block));
+  }
+
+  @override
+  void handleInvalidMember(Token endToken) {
+    debugEvent("InvalidMember");
+    pop(); // metadata star
+  }
+
+  @override
+  void handleInvalidOperatorName(Token operatorKeyword, Token token) {
+    assert(optional('operator', operatorKeyword));
+    debugEvent("InvalidOperatorName");
+
+    push(new _OperatorName(
+        operatorKeyword, ast.simpleIdentifier(token, isDeclaration: true)));
+  }
+
+  void handleInvalidTopLevelBlock(Token token) {
+    // TODO(danrubel): Consider improved recovery by adding this block
+    // as part of a synthetic top level function.
+    pop(); // block
+  }
+
+  @override
+  void handleInvalidTopLevelDeclaration(Token endToken) {
+    debugEvent("InvalidTopLevelDeclaration");
+
+    pop(); // metadata star
+    // TODO(danrubel): consider creating a AST node
+    // representing the invalid declaration to better support code completion,
+    // quick fixes, etc, rather than discarding the metadata and token
+  }
+
+  @override
+  void handleInvalidTypeArguments(Token token) {
+    TypeArgumentList invalidTypeArgs = pop();
+    var node = pop();
+    if (node is ConstructorName) {
+      push(new _ConstructorNameWithInvalidTypeArgs(node, invalidTypeArgs));
+    } else {
+      throw new UnimplementedError();
+    }
+  }
+
+  void handleIsOperator(Token isOperator, Token not) {
+    assert(optional('is', isOperator));
+    assert(optionalOrNull('!', not));
+    debugEvent("IsOperator");
+
+    TypeAnnotation type = pop();
+    Expression expression = pop();
+    push(ast.isExpression(expression, isOperator, not, type));
+  }
+
+  @override
+  void handleLabel(Token colon) {
+    assert(optionalOrNull(':', colon));
+    debugEvent("Label");
+
+    SimpleIdentifier name = pop();
+    push(ast.label(name, colon));
+  }
+
+  void handleLiteralBool(Token token) {
+    bool value = identical(token.stringValue, "true");
+    assert(value || identical(token.stringValue, "false"));
+    debugEvent("LiteralBool");
+
+    push(ast.booleanLiteral(token, value));
+  }
+
+  void handleLiteralDouble(Token token) {
+    assert(token.type == TokenType.DOUBLE);
+    debugEvent("LiteralDouble");
+
+    push(ast.doubleLiteral(token, double.parse(token.lexeme)));
+  }
+
+  void handleLiteralInt(Token token) {
+    assert(identical(token.kind, INT_TOKEN) ||
+        identical(token.kind, HEXADECIMAL_TOKEN));
+    debugEvent("LiteralInt");
+
+    push(ast.integerLiteral(token, int.tryParse(token.lexeme)));
+  }
+
+  void handleLiteralList(
+      int count, Token leftBracket, Token constKeyword, Token rightBracket) {
+    assert(optional('[', leftBracket));
+    assert(optionalOrNull('const', constKeyword));
+    assert(optional(']', rightBracket));
+    debugEvent("LiteralList");
+
+    if (enableControlFlowCollections || enableSpreadCollections) {
+      List<CollectionElement> elements = popCollectionElements(count);
+      TypeArgumentList typeArguments = pop();
+
+      // TODO(danrubel): Remove this and _InvalidCollectionElement
+      // once control flow and spread collection support is enabled by default
+      elements.removeWhere((e) => e == _invalidCollectionElement);
+
+      push(ast.listLiteral(
+          constKeyword, typeArguments, leftBracket, elements, rightBracket));
+    } else {
+      List<dynamic> elements = popTypedList(count);
+      TypeArgumentList typeArguments = pop();
+
+      List<Expression> expressions = <Expression>[];
+      if (elements != null) {
+        for (var elem in elements) {
+          if (elem is Expression) {
+            expressions.add(elem);
+          }
+        }
+      }
+
+      push(ast.listLiteral(
+          constKeyword, typeArguments, leftBracket, expressions, rightBracket));
+    }
+  }
+
+  void handleLiteralMapEntry(Token colon, Token endToken) {
+    assert(optional(':', colon));
+    debugEvent("LiteralMapEntry");
+
+    Expression value = pop();
+    Expression key = pop();
+    push(ast.mapLiteralEntry(key, colon, value));
+  }
+
+  void handleLiteralNull(Token token) {
+    assert(optional('null', token));
+    debugEvent("LiteralNull");
+
+    push(ast.nullLiteral(token));
+  }
+
+  @override
+  void handleLiteralSetOrMap(
+    int count,
+    Token leftBrace,
+    Token constKeyword,
+    Token rightBrace,
+    // TODO(danrubel): hasSetEntry parameter exists for replicating existing
+    // behavior and will be removed once unified collection has been enabled
+    bool hasSetEntry,
+  ) {
+    if (enableControlFlowCollections || enableSpreadCollections) {
+      List<CollectionElement> elements = popCollectionElements(count);
+
+      // TODO(danrubel): Remove this and _InvalidCollectionElement
+      // once control flow and spread collection support is enabled by default
+      elements.removeWhere((e) => e == _invalidCollectionElement);
+
+      TypeArgumentList typeArguments = pop();
+      push(ast.setOrMapLiteral(
+        constKeyword: constKeyword,
+        typeArguments: typeArguments,
+        leftBracket: leftBrace,
+        elements: elements,
+        rightBracket: rightBrace,
+      ));
+    } else {
+      List<dynamic> elements = popTypedList(count);
+      TypeArgumentList typeArguments = pop();
+
+      // Replicate existing behavior that has been removed from the parser.
+      // This will be removed once control flow collections
+      // and spread collections are enabled by default.
+
+      // Determine if this is a set or map based on type args and content
+      final typeArgCount = typeArguments?.arguments?.length;
+      bool isSet =
+          typeArgCount == 1 ? true : typeArgCount != null ? false : null;
+      isSet ??= hasSetEntry;
+
+      // Build the set or map
+      if (isSet) {
+        final setEntries = <Expression>[];
+        if (elements != null) {
+          for (var elem in elements) {
+            if (elem is MapLiteralEntry) {
+              setEntries.add(elem.key);
+              handleRecoverableError(
+                  templateUnexpectedToken.withArguments(elem.separator),
+                  elem.separator,
+                  elem.separator);
+            } else if (elem is Expression) {
+              setEntries.add(elem);
+            }
+          }
+        }
+        // ignore: deprecated_member_use_from_same_package
+        push(ast.setLiteral(
+            constKeyword, typeArguments, leftBrace, setEntries, rightBrace));
+      } else {
+        final mapEntries = <MapLiteralEntry>[];
+        if (elements != null) {
+          for (var elem in elements) {
+            if (elem is MapLiteralEntry) {
+              mapEntries.add(elem);
+            } else if (elem is Expression) {
+              Token next = elem.endToken.next;
+              int offset = next.offset;
+              handleRecoverableError(
+                  templateExpectedButGot.withArguments(':'), next, next);
+              handleRecoverableError(
+                  templateExpectedIdentifier.withArguments(next), next, next);
+              Token separator = SyntheticToken(TokenType.COLON, offset);
+              Expression value = ast.simpleIdentifier(
+                  SyntheticStringToken(TokenType.IDENTIFIER, '', offset));
+              mapEntries.add(ast.mapLiteralEntry(elem, separator, value));
+            }
+          }
+        }
+        // ignore: deprecated_member_use_from_same_package
+        push(ast.mapLiteral(
+            constKeyword, typeArguments, leftBrace, mapEntries, rightBrace));
+      }
+    }
+  }
+
+  @override
+  void handleMixinHeader(Token mixinKeyword) {
+    assert(optional('mixin', mixinKeyword));
+    assert(classDeclaration == null && mixinDeclaration == null);
+    debugEvent("MixinHeader");
+
+    ImplementsClause implementsClause = pop(NullValue.IdentifierList);
+    OnClause onClause = pop(NullValue.IdentifierList);
+    TypeParameterList typeParameters = pop();
+    SimpleIdentifier name = pop();
+    List<Annotation> metadata = pop();
+    Comment comment = _findComment(metadata, mixinKeyword);
+
+    mixinDeclaration = ast.mixinDeclaration(
+      comment,
+      metadata,
+      mixinKeyword,
+      name,
+      typeParameters,
+      onClause,
+      implementsClause,
+      null,
+      // leftBracket
+      <ClassMember>[],
+      null, // rightBracket
+    );
+    declarations.add(mixinDeclaration);
+  }
+
+  @override
+  void handleMixinOn(Token onKeyword, int typeCount) {
+    assert(onKeyword == null || onKeyword.isKeywordOrIdentifier);
+    debugEvent("MixinOn");
+
+    if (onKeyword != null) {
+      List<TypeName> types = popTypedList(typeCount);
+      push(ast.onClause(onKeyword, types));
+    } else {
+      push(NullValue.IdentifierList);
+    }
+  }
+
+  void handleNamedArgument(Token colon) {
+    assert(optional(':', colon));
+    debugEvent("NamedArgument");
+
+    Expression expression = pop();
+    SimpleIdentifier name = pop();
+    push(ast.namedExpression(ast.label(name, colon), expression));
+  }
+
+  @override
+  void handleNamedMixinApplicationWithClause(Token withKeyword) {
+    assert(optionalOrNull('with', withKeyword));
+    List<TypeName> mixinTypes = pop();
+    push(ast.withClause(withKeyword, mixinTypes));
+  }
+
+  @override
+  void handleNativeClause(Token nativeToken, bool hasName) {
+    debugEvent("NativeClause");
+
+    if (hasName) {
+      nativeName = pop(); // StringLiteral
+    } else {
+      nativeName = null;
+    }
+  }
+
+  @override
+  void handleNativeFunctionBody(Token nativeToken, Token semicolon) {
+    assert(optional('native', nativeToken));
+    assert(optional(';', semicolon));
+    debugEvent("NativeFunctionBody");
+
+    // TODO(danrubel) Change the parser to not produce these modifiers.
+    pop(); // star
+    pop(); // async
+    push(ast.nativeFunctionBody(nativeToken, nativeName, semicolon));
+  }
+
+  @override
+  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
+    debugEvent("NoConstructorReferenceContinuationAfterTypeArguments");
+
+    push(NullValue.ConstructorReferenceContinuationAfterTypeArguments);
+  }
+
+  @override
+  void handleNoFieldInitializer(Token token) {
+    debugEvent("NoFieldInitializer");
+
+    SimpleIdentifier name = pop();
+    push(_makeVariableDeclaration(name, null, null));
+  }
+
+  void handleNoInitializers() {
+    debugEvent("NoInitializers");
+
+    if (!isFullAst) return;
+    push(NullValue.ConstructorInitializerSeparator);
+    push(NullValue.ConstructorInitializers);
+  }
+
+  @override
+  void handleNonNullAssertExpression(Token bang) {
+    debugEvent('NonNullAssertExpression');
+    if (!enableNonNullable) {
+      reportNonNullAssertExpressionNotEnabled(bang);
+    } else {
+      push(ast.postfixExpression(pop(), bang));
+    }
+  }
+
+  @override
+  void handleNoVariableInitializer(Token token) {
+    debugEvent("NoVariableInitializer");
+  }
+
+  void handleOperator(Token operatorToken) {
+    assert(operatorToken.isUserDefinableOperator);
+    debugEvent("Operator");
+
+    push(operatorToken);
+  }
+
+  @override
+  void handleOperatorName(Token operatorKeyword, Token token) {
+    assert(optional('operator', operatorKeyword));
+    assert(token.type.isUserDefinableOperator);
+    debugEvent("OperatorName");
+
+    push(new _OperatorName(
+        operatorKeyword, ast.simpleIdentifier(token, isDeclaration: true)));
+  }
+
+  @override
+  void handleParenthesizedCondition(Token leftParenthesis) {
+    // TODO(danrubel): Implement rather than forwarding.
+    handleParenthesizedExpression(leftParenthesis);
+  }
+
+  @override
+  void handleParenthesizedExpression(Token leftParenthesis) {
+    assert(optional('(', leftParenthesis));
+    debugEvent("ParenthesizedExpression");
+
+    Expression expression = pop();
+    push(ast.parenthesizedExpression(
+        leftParenthesis, expression, leftParenthesis?.endGroup));
+  }
+
+  @override
+  void handleQualified(Token period) {
+    assert(optional('.', period));
+
+    SimpleIdentifier identifier = pop();
+    var prefix = pop();
+    if (prefix is List) {
+      // We're just accumulating components into a list.
+      prefix.add(identifier);
+      push(prefix);
+    } else if (prefix is SimpleIdentifier) {
+      // TODO(paulberry): resolve [identifier].  Note that BodyBuilder handles
+      // this situation using SendAccessGenerator.
+      push(ast.prefixedIdentifier(prefix, period, identifier));
+    } else {
+      // TODO(paulberry): implement.
+      logEvent('Qualified with >1 dot');
+    }
+  }
+
+  @override
+  void handleRecoverableError(
+      Message message, Token startToken, Token endToken) {
+    /// TODO(danrubel): Ignore this error until we deprecate `native` support.
+    if (message == messageNativeClauseShouldBeAnnotation && allowNativeClause) {
+      return;
+    }
+    debugEvent("Error: ${message.message}");
+    if (message.code.analyzerCodes == null && startToken is ErrorToken) {
+      translateErrorToken(startToken, errorReporter.reportScannerError);
+    } else {
+      int offset = startToken.offset;
+      int length = endToken.end - offset;
+      addProblem(message, offset, length);
+    }
+  }
+
+  @override
   void handleRecoverClassHeader() {
     debugEvent("RecoverClassHeader");
 
@@ -2181,55 +2773,29 @@
   }
 
   @override
-  void endClassDeclaration(Token beginToken, Token endToken) {
-    debugEvent("ClassDeclaration");
-    classDeclaration = null;
-  }
+  void handleRecoverImport(Token semicolon) {
+    assert(optionalOrNull(';', semicolon));
+    debugEvent("RecoverImport");
 
-  @override
-  void beginMixinDeclaration(Token mixinKeyword, Token name) {
-    assert(classDeclaration == null && mixinDeclaration == null);
-  }
+    List<Combinator> combinators = pop();
+    Token deferredKeyword = pop(NullValue.Deferred);
+    Token asKeyword = pop(NullValue.As);
+    SimpleIdentifier prefix = pop(NullValue.Prefix);
+    List<Configuration> configurations = pop();
 
-  @override
-  void handleMixinOn(Token onKeyword, int typeCount) {
-    assert(onKeyword == null || onKeyword.isKeywordOrIdentifier);
-    debugEvent("MixinOn");
-
-    if (onKeyword != null) {
-      List<TypeName> types = popTypedList(typeCount);
-      push(ast.onClause(onKeyword, types));
-    } else {
-      push(NullValue.IdentifierList);
+    ImportDirective directive = directives.last;
+    if (combinators != null) {
+      directive.combinators.addAll(combinators);
     }
-  }
-
-  @override
-  void handleMixinHeader(Token mixinKeyword) {
-    assert(optional('mixin', mixinKeyword));
-    assert(classDeclaration == null && mixinDeclaration == null);
-    debugEvent("MixinHeader");
-
-    ImplementsClause implementsClause = pop(NullValue.IdentifierList);
-    OnClause onClause = pop(NullValue.IdentifierList);
-    TypeParameterList typeParameters = pop();
-    SimpleIdentifier name = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, mixinKeyword);
-
-    mixinDeclaration = ast.mixinDeclaration(
-      comment,
-      metadata,
-      mixinKeyword,
-      name,
-      typeParameters,
-      onClause,
-      implementsClause,
-      null, // leftBracket
-      <ClassMember>[],
-      null, // rightBracket
-    );
-    declarations.add(mixinDeclaration);
+    directive.deferredKeyword ??= deferredKeyword;
+    if (directive.asKeyword == null && asKeyword != null) {
+      directive.asKeyword = asKeyword;
+      directive.prefix = prefix;
+    }
+    if (configurations != null) {
+      directive.configurations.addAll(configurations);
+    }
+    directive.semicolon = semicolon;
   }
 
   @override
@@ -2255,352 +2821,95 @@
     }
   }
 
-  @override
-  void endMixinDeclaration(Token mixinKeyword, Token endToken) {
-    debugEvent("MixinDeclaration");
-    mixinDeclaration = null;
+  void handleScript(Token token) {
+    assert(identical(token.type, TokenType.SCRIPT_TAG));
+    debugEvent("Script");
+
+    scriptTag = ast.scriptTag(token);
   }
 
-  @override
-  void beginNamedMixinApplication(
-      Token begin, Token abstractToken, Token name) {
-    push(new _Modifiers()..abstractKeyword = abstractToken);
-  }
+  void handleSend(Token beginToken, Token endToken) {
+    debugEvent("Send");
 
-  @override
-  void handleNamedMixinApplicationWithClause(Token withKeyword) {
-    assert(optionalOrNull('with', withKeyword));
-    List<TypeName> mixinTypes = pop();
-    push(ast.withClause(withKeyword, mixinTypes));
-  }
-
-  @override
-  void endNamedMixinApplication(Token beginToken, Token classKeyword,
-      Token equalsToken, Token implementsKeyword, Token semicolon) {
-    assert(optional('class', classKeyword));
-    assert(optionalOrNull('=', equalsToken));
-    assert(optionalOrNull('implements', implementsKeyword));
-    assert(optional(';', semicolon));
-    debugEvent("NamedMixinApplication");
-
-    ImplementsClause implementsClause;
-    if (implementsKeyword != null) {
-      List<TypeName> interfaces = pop();
-      implementsClause = ast.implementsClause(implementsKeyword, interfaces);
-    }
-    WithClause withClause = pop(NullValue.WithClause);
-    TypeName superclass = pop();
-    _Modifiers modifiers = pop();
-    TypeParameterList typeParameters = pop();
-    SimpleIdentifier name = pop();
-    Token abstractKeyword = modifiers?.abstractKeyword;
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, beginToken);
-    declarations.add(ast.classTypeAlias(
-        comment,
-        metadata,
-        classKeyword,
-        name,
-        typeParameters,
-        equalsToken,
-        abstractKeyword,
-        superclass,
-        withClause,
-        implementsClause,
-        semicolon));
-  }
-
-  @override
-  void endLabeledStatement(int labelCount) {
-    debugEvent("LabeledStatement");
-
-    Statement statement = pop();
-    List<Label> labels = popTypedList(labelCount);
-    push(ast.labeledStatement(labels, statement));
-  }
-
-  @override
-  void endLibraryName(Token libraryKeyword, Token semicolon) {
-    assert(optional('library', libraryKeyword));
-    assert(optional(';', semicolon));
-    debugEvent("LibraryName");
-
-    List<SimpleIdentifier> libraryName = pop();
-    var name = ast.libraryIdentifier(libraryName);
-    List<Annotation> metadata = pop();
-    if (enableNonNullable && metadata != null) {
-      for (Annotation annotation in metadata) {
-        Identifier pragma = annotation.name;
-        if (pragma is SimpleIdentifier && pragma.name == 'pragma') {
-          NodeList<Expression> arguments = annotation.arguments.arguments;
-          if (arguments.length == 1) {
-            Expression tag = arguments[0];
-            if (tag is StringLiteral) {
-              if (tag.stringValue == 'analyzer:non-nullable') {
-                hasPragmaAnalyzerNonNullable = true;
-                break;
-              }
-            }
-          }
-        }
-      }
-    }
-    Comment comment = _findComment(metadata, libraryKeyword);
-    directives.add(ast.libraryDirective(
-        comment, metadata, libraryKeyword, name, semicolon));
-  }
-
-  @override
-  void handleRecoverableError(
-      Message message, Token startToken, Token endToken) {
-    /// TODO(danrubel): Ignore this error until we deprecate `native` support.
-    if (message == messageNativeClauseShouldBeAnnotation && allowNativeClause) {
-      return;
-    }
-    debugEvent("Error: ${message.message}");
-    if (message.code.analyzerCodes == null && startToken is ErrorToken) {
-      translateErrorToken(startToken, errorReporter.reportScannerError);
+    MethodInvocation arguments = pop();
+    TypeArgumentList typeArguments = pop();
+    if (arguments != null) {
+      doInvocation(typeArguments, arguments);
     } else {
-      int offset = startToken.offset;
-      int length = endToken.end - offset;
-      addProblem(message, offset, length);
+      doPropertyGet();
     }
   }
 
   @override
-  void handleQualified(Token period) {
-    assert(optional('.', period));
-
-    SimpleIdentifier identifier = pop();
-    var prefix = pop();
-    if (prefix is List) {
-      // We're just accumulating components into a list.
-      prefix.add(identifier);
-      push(prefix);
-    } else if (prefix is SimpleIdentifier) {
-      // TODO(paulberry): resolve [identifier].  Note that BodyBuilder handles
-      // this situation using SendAccessGenerator.
-      push(ast.prefixedIdentifier(prefix, period, identifier));
+  void handleSpreadExpression(Token spreadToken) {
+    var expression = pop();
+    if (enableSpreadCollections) {
+      push(ast.spreadElement(
+          spreadOperator: spreadToken, expression: expression));
     } else {
-      // TODO(paulberry): implement.
-      logEvent('Qualified with >1 dot');
+      handleRecoverableError(
+          templateExperimentNotEnabled
+              .withArguments(EnableString.spread_collections),
+          spreadToken,
+          spreadToken);
+      push(_invalidCollectionElement);
     }
   }
 
-  @override
-  void endPart(Token partKeyword, Token semicolon) {
-    assert(optional('part', partKeyword));
-    assert(optional(';', semicolon));
-    debugEvent("Part");
+  void handleStringJuxtaposition(int literalCount) {
+    debugEvent("StringJuxtaposition");
 
-    StringLiteral uri = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, partKeyword);
-    directives
-        .add(ast.partDirective(comment, metadata, partKeyword, uri, semicolon));
+    push(ast.adjacentStrings(popTypedList(literalCount)));
   }
 
   @override
-  void endPartOf(
-      Token partKeyword, Token ofKeyword, Token semicolon, bool hasName) {
-    assert(optional('part', partKeyword));
-    assert(optional('of', ofKeyword));
-    assert(optional(';', semicolon));
-    debugEvent("PartOf");
-    var libraryNameOrUri = pop();
-    LibraryIdentifier name;
-    StringLiteral uri;
-    if (libraryNameOrUri is StringLiteral) {
-      uri = libraryNameOrUri;
-    } else {
-      name = ast.libraryIdentifier(libraryNameOrUri as List<SimpleIdentifier>);
-    }
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, partKeyword);
-    directives.add(ast.partOfDirective(
-        comment, metadata, partKeyword, ofKeyword, uri, name, semicolon));
+  void handleStringPart(Token literalString) {
+    assert(identical(literalString.kind, STRING_TOKEN));
+    debugEvent("StringPart");
+
+    push(literalString);
   }
 
   @override
-  void endFunctionExpression(Token beginToken, Token token) {
-    // TODO(paulberry): set up scopes properly to resolve parameters and type
-    // variables.  Note that this is tricky due to the handling of initializers
-    // in constructors, so the logic should be shared with BodyBuilder as much
-    // as possible.
-    debugEvent("FunctionExpression");
+  void handleSuperExpression(Token superKeyword, IdentifierContext context) {
+    assert(optional('super', superKeyword));
+    debugEvent("SuperExpression");
 
-    FunctionBody body = pop();
-    FormalParameterList parameters = pop();
-    TypeParameterList typeParameters = pop();
-    push(ast.functionExpression(typeParameters, parameters, body));
+    push(ast.superExpression(superKeyword));
+  }
+
+  void handleSymbolVoid(Token voidKeyword) {
+    assert(optional('void', voidKeyword));
+    debugEvent("SymbolVoid");
+
+    push(voidKeyword);
   }
 
   @override
-  void handleNoFieldInitializer(Token token) {
-    debugEvent("NoFieldInitializer");
+  void handleThisExpression(Token thisKeyword, IdentifierContext context) {
+    assert(optional('this', thisKeyword));
+    debugEvent("ThisExpression");
 
-    SimpleIdentifier name = pop();
-    push(_makeVariableDeclaration(name, null, null));
+    push(ast.thisExpression(thisKeyword));
+  }
+
+  void handleThrowExpression(Token throwToken, Token endToken) {
+    assert(optional('throw', throwToken));
+    debugEvent("ThrowExpression");
+
+    push(ast.throwExpression(throwToken, pop()));
   }
 
   @override
-  void beginFactoryMethod(
-      Token lastConsumed, Token externalToken, Token constToken) {
-    push(new _Modifiers()
-      ..externalKeyword = externalToken
-      ..finalConstOrVarKeyword = constToken);
-  }
-
-  @override
-  void endFactoryMethod(
-      Token beginToken, Token factoryKeyword, Token endToken) {
-    assert(optional('factory', factoryKeyword));
-    assert(optional(';', endToken) || optional('}', endToken));
-    debugEvent("FactoryMethod");
-
-    FunctionBody body;
-    Token separator;
-    ConstructorName redirectedConstructor;
-    Object bodyObject = pop();
-    if (bodyObject is FunctionBody) {
-      body = bodyObject;
-    } else if (bodyObject is _RedirectingFactoryBody) {
-      separator = bodyObject.equalToken;
-      redirectedConstructor = bodyObject.constructorName;
-      body = ast.emptyFunctionBody(endToken);
-    } else {
-      unhandled("${bodyObject.runtimeType}", "bodyObject",
-          beginToken.charOffset, uri);
+  void handleType(Token beginToken, Token questionMark) {
+    debugEvent("Type");
+    if (!enableNonNullable) {
+      reportErrorIfNullableType(questionMark);
     }
 
-    FormalParameterList parameters = pop();
-    TypeParameterList typeParameters = pop();
-    Object constructorName = pop();
-    _Modifiers modifiers = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, beginToken);
-
-    assert(parameters != null);
-
-    if (typeParameters != null) {
-      // TODO(danrubel): Update OutlineBuilder to report this error message.
-      handleRecoverableError(messageConstructorWithTypeParameters,
-          typeParameters.beginToken, typeParameters.endToken);
-    }
-
-    // Decompose the preliminary ConstructorName into the type name and
-    // the actual constructor name.
-    SimpleIdentifier returnType;
-    Token period;
-    SimpleIdentifier name;
-    Identifier typeName = constructorName;
-    if (typeName is SimpleIdentifier) {
-      returnType = typeName;
-    } else if (typeName is PrefixedIdentifier) {
-      returnType = typeName.prefix;
-      period = typeName.period;
-      name =
-          ast.simpleIdentifier(typeName.identifier.token, isDeclaration: true);
-    }
-
-    (classDeclaration ?? mixinDeclaration).members.add(
-        ast.constructorDeclaration(
-            comment,
-            metadata,
-            modifiers?.externalKeyword,
-            modifiers?.finalConstOrVarKeyword,
-            factoryKeyword,
-            ast.simpleIdentifier(returnType.token),
-            period,
-            name,
-            parameters,
-            separator,
-            null,
-            redirectedConstructor,
-            body));
-  }
-
-  void endFieldInitializer(Token assignment, Token token) {
-    assert(optional('=', assignment));
-    debugEvent("FieldInitializer");
-
-    Expression initializer = pop();
-    SimpleIdentifier name = pop();
-    push(_makeVariableDeclaration(name, assignment, initializer));
-  }
-
-  @override
-  void endNamedFunctionExpression(Token endToken) {
-    debugEvent("NamedFunctionExpression");
-    FunctionBody body = pop();
-    if (isFullAst) {
-      pop(); // constructor initializers
-      pop(); // separator before constructor initializers
-    }
-    FormalParameterList parameters = pop();
-    pop(); // name
-    pop(); // returnType
-    TypeParameterList typeParameters = pop();
-    push(ast.functionExpression(typeParameters, parameters, body));
-  }
-
-  @override
-  void endLocalFunctionDeclaration(Token token) {
-    debugEvent("LocalFunctionDeclaration");
-    FunctionBody body = pop();
-    if (isFullAst) {
-      pop(); // constructor initializers
-      pop(); // separator before constructor initializers
-    }
-    FormalParameterList parameters = pop();
-    checkFieldFormalParameters(parameters);
-    SimpleIdentifier name = pop();
-    TypeAnnotation returnType = pop();
-    TypeParameterList typeParameters = pop();
-    List<Annotation> metadata = pop(NullValue.Metadata);
-    FunctionExpression functionExpression =
-        ast.functionExpression(typeParameters, parameters, body);
-    var functionDeclaration = ast.functionDeclaration(
-        null, metadata, null, returnType, null, name, functionExpression);
-    localDeclarations[name.offset] = functionDeclaration;
-    push(ast.functionDeclarationStatement(functionDeclaration));
-  }
-
-  @override
-  void endFunctionName(Token beginToken, Token token) {
-    debugEvent("FunctionName");
-  }
-
-  void endTopLevelFields(Token staticToken, Token covariantToken,
-      Token varFinalOrConst, int count, Token beginToken, Token semicolon) {
-    assert(optional(';', semicolon));
-    debugEvent("TopLevelFields");
-
-    List<VariableDeclaration> variables = popTypedList(count);
-    TypeAnnotation type = pop();
-    _Modifiers modifiers = new _Modifiers()
-      ..staticKeyword = staticToken
-      ..covariantKeyword = covariantToken
-      ..finalConstOrVarKeyword = varFinalOrConst;
-    Token keyword = modifiers?.finalConstOrVarKeyword;
-    var variableList =
-        ast.variableDeclarationList(null, null, keyword, type, variables);
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, beginToken);
-    declarations.add(ast.topLevelVariableDeclaration(
-        comment, metadata, variableList, semicolon));
-  }
-
-  @override
-  void beginTypeVariable(Token token) {
-    debugEvent("beginTypeVariable");
-    SimpleIdentifier name = pop();
-    List<Annotation> metadata = pop();
-
-    Comment comment = _findComment(metadata, name.beginToken);
-    var typeParameter = ast.typeParameter(comment, metadata, name, null, null);
-    localDeclarations[name.offset] = typeParameter;
-    push(typeParameter);
+    TypeArgumentList arguments = pop();
+    Identifier name = pop();
+    push(ast.typeName(name, arguments, question: questionMark));
   }
 
   @override
@@ -2610,201 +2919,45 @@
     push(popTypedList(count, new List<TypeParameter>(count)));
   }
 
-  @override
-  void endTypeVariable(Token token, int index, Token extendsOrSuper) {
-    debugEvent("TypeVariable");
-    assert(extendsOrSuper == null ||
-        optional('extends', extendsOrSuper) ||
-        optional('super', extendsOrSuper));
-    TypeAnnotation bound = pop();
+  void handleUnaryPostfixAssignmentExpression(Token operator) {
+    assert(operator.type.isUnaryPostfixOperator);
+    debugEvent("UnaryPostfixAssignmentExpression");
 
-    // Peek to leave type parameters on top of stack.
-    List<TypeParameter> typeParameters = peek();
-    typeParameters[index]
-      ..extendsKeyword = extendsOrSuper
-      ..bound = bound;
+    Expression expression = pop();
+    if (!expression.isAssignable) {
+      // This error is also reported by the body builder.
+      handleRecoverableError(
+          messageIllegalAssignmentToNonAssignable, operator, operator);
+    }
+    push(ast.postfixExpression(expression, operator));
   }
 
-  @override
-  void endTypeVariables(Token beginToken, Token endToken) {
-    assert(optional('<', beginToken));
-    assert(optional('>', endToken));
-    debugEvent("TypeVariables");
+  void handleUnaryPrefixAssignmentExpression(Token operator) {
+    assert(operator.type.isUnaryPrefixOperator);
+    debugEvent("UnaryPrefixAssignmentExpression");
 
-    List<TypeParameter> typeParameters = pop();
-    push(ast.typeParameterList(beginToken, typeParameters, endToken));
+    Expression expression = pop();
+    if (!expression.isAssignable) {
+      // This error is also reported by the body builder.
+      handleRecoverableError(messageMissingAssignableSelector,
+          expression.endToken, expression.endToken);
+    }
+    push(ast.prefixExpression(operator, expression));
   }
 
-  @override
-  void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
-      Token varFinalOrConst, Token getOrSet, Token name) {
-    _Modifiers modifiers = new _Modifiers();
-    if (externalToken != null) {
-      assert(externalToken.isModifier);
-      modifiers.externalKeyword = externalToken;
-    }
-    if (staticToken != null) {
-      assert(staticToken.isModifier);
-      String className = classDeclaration != null
-          ? classDeclaration.name.name
-          : mixinDeclaration.name.name;
-      if (name?.lexeme == className && getOrSet == null) {
-        // This error is also reported in OutlineBuilder.beginMethod
-        handleRecoverableError(
-            messageStaticConstructor, staticToken, staticToken);
-      } else {
-        modifiers.staticKeyword = staticToken;
-      }
-    }
-    if (covariantToken != null) {
-      assert(covariantToken.isModifier);
-      modifiers.covariantKeyword = covariantToken;
-    }
-    if (varFinalOrConst != null) {
-      assert(varFinalOrConst.isModifier);
-      modifiers.finalConstOrVarKeyword = varFinalOrConst;
-    }
-    push(modifiers);
+  void handleUnaryPrefixExpression(Token operator) {
+    assert(operator.type.isUnaryPrefixOperator);
+    debugEvent("UnaryPrefixExpression");
+
+    push(ast.prefixExpression(operator, pop()));
   }
 
-  @override
-  void endMethod(
-      Token getOrSet, Token beginToken, Token beginParam, Token endToken) {
-    assert(getOrSet == null ||
-        optional('get', getOrSet) ||
-        optional('set', getOrSet));
-    debugEvent("Method");
+  void handleValuedFormalParameter(Token equals, Token token) {
+    assert(optional('=', equals) || optional(':', equals));
+    debugEvent("ValuedFormalParameter");
 
-    var bodyObject = pop();
-    List<ConstructorInitializer> initializers = pop() ?? const [];
-    Token separator = pop();
-    FormalParameterList parameters = pop();
-    TypeParameterList typeParameters = pop();
-    var name = pop();
-    TypeAnnotation returnType = pop();
-    _Modifiers modifiers = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, beginToken);
-
-    assert(parameters != null || optional('get', getOrSet));
-
-    ConstructorName redirectedConstructor;
-    FunctionBody body;
-    if (bodyObject is FunctionBody) {
-      body = bodyObject;
-    } else if (bodyObject is _RedirectingFactoryBody) {
-      separator = bodyObject.equalToken;
-      redirectedConstructor = bodyObject.constructorName;
-      body = ast.emptyFunctionBody(endToken);
-    } else {
-      unhandled("${bodyObject.runtimeType}", "bodyObject",
-          beginToken.charOffset, uri);
-    }
-
-    ClassOrMixinDeclarationImpl declaration =
-        classDeclaration ?? mixinDeclaration;
-
-    void constructor(
-        SimpleIdentifier prefixOrName, Token period, SimpleIdentifier name) {
-      if (typeParameters != null) {
-        // Outline builder also reports this error message.
-        handleRecoverableError(messageConstructorWithTypeParameters,
-            typeParameters.beginToken, typeParameters.endToken);
-      }
-      if (modifiers?.constKeyword != null &&
-          body != null &&
-          (body.length > 1 || body.beginToken?.lexeme != ';')) {
-        // This error is also reported in BodyBuilder.finishFunction
-        Token bodyToken = body.beginToken ?? modifiers.constKeyword;
-        handleRecoverableError(
-            messageConstConstructorWithBody, bodyToken, bodyToken);
-      }
-      if (returnType != null) {
-        // This error is also reported in OutlineBuilder.endMethod
-        handleRecoverableError(messageConstructorWithReturnType,
-            returnType.beginToken, returnType.beginToken);
-      }
-      ConstructorDeclaration constructor = ast.constructorDeclaration(
-          comment,
-          metadata,
-          modifiers?.externalKeyword,
-          modifiers?.finalConstOrVarKeyword,
-          null, // TODO(paulberry): factoryKeyword
-          ast.simpleIdentifier(prefixOrName.token),
-          period,
-          name,
-          parameters,
-          separator,
-          initializers,
-          redirectedConstructor,
-          body);
-      declaration.members.add(constructor);
-      if (mixinDeclaration != null) {
-        // TODO (danrubel): Report an error if this is a mixin declaration.
-      }
-    }
-
-    void method(Token operatorKeyword, SimpleIdentifier name) {
-      if (modifiers?.constKeyword != null &&
-          body != null &&
-          (body.length > 1 || body.beginToken?.lexeme != ';')) {
-        // This error is also reported in OutlineBuilder.endMethod
-        handleRecoverableError(
-            messageConstMethod, modifiers.constKeyword, modifiers.constKeyword);
-      }
-      checkFieldFormalParameters(parameters);
-      declaration.members.add(ast.methodDeclaration(
-          comment,
-          metadata,
-          modifiers?.externalKeyword,
-          modifiers?.abstractKeyword ?? modifiers?.staticKeyword,
-          returnType,
-          getOrSet,
-          operatorKeyword,
-          name,
-          typeParameters,
-          parameters,
-          body));
-    }
-
-    if (name is SimpleIdentifier) {
-      if (name.name == declaration.name.name && getOrSet == null) {
-        constructor(name, null, null);
-      } else if (initializers.isNotEmpty) {
-        constructor(name, null, null);
-      } else {
-        method(null, name);
-      }
-    } else if (name is _OperatorName) {
-      method(name.operatorKeyword, name.name);
-    } else if (name is PrefixedIdentifier) {
-      constructor(name.prefix, name.period, name.identifier);
-    } else {
-      throw new UnimplementedError();
-    }
-  }
-
-  void checkFieldFormalParameters(FormalParameterList parameters) {
-    if (parameters?.parameters != null) {
-      parameters.parameters.forEach((FormalParameter param) {
-        if (param is FieldFormalParameter) {
-          // This error is reported in the BodyBuilder.endFormalParameter.
-          handleRecoverableError(messageFieldInitializerOutsideConstructor,
-              param.thisKeyword, param.thisKeyword);
-        }
-      });
-    }
-  }
-
-  @override
-  void handleInvalidMember(Token endToken) {
-    debugEvent("InvalidMember");
-    pop(); // metadata star
-  }
-
-  @override
-  void endMember() {
-    debugEvent("Member");
+    Expression value = pop();
+    push(new _ParameterDefaultValue(equals, value));
   }
 
   @override
@@ -2819,191 +2972,128 @@
     handleType(voidKeyword, null);
   }
 
-  @override
-  void endFunctionTypeAlias(
-      Token typedefKeyword, Token equals, Token semicolon) {
-    assert(optional('typedef', typedefKeyword));
-    assert(optionalOrNull('=', equals));
-    assert(optional(';', semicolon));
-    debugEvent("FunctionTypeAlias");
+  /// Return `true` if [token] is either `null` or is the symbol or keyword
+  /// [value].
+  bool optionalOrNull(String value, Token token) {
+    return token == null || identical(value, token.stringValue);
+  }
 
-    if (equals == null) {
-      FormalParameterList parameters = pop();
-      TypeParameterList typeParameters = pop();
-      SimpleIdentifier name = pop();
-      TypeAnnotation returnType = pop();
-      List<Annotation> metadata = pop();
-      Comment comment = _findComment(metadata, typedefKeyword);
-      declarations.add(ast.functionTypeAlias(comment, metadata, typedefKeyword,
-          returnType, name, typeParameters, parameters, semicolon));
-    } else {
-      TypeAnnotation type = pop();
-      TypeParameterList templateParameters = pop();
-      SimpleIdentifier name = pop();
-      List<Annotation> metadata = pop();
-      Comment comment = _findComment(metadata, typedefKeyword);
-      if (type is! GenericFunctionType) {
-        // This error is also reported in the OutlineBuilder.
-        handleRecoverableError(messageTypedefNotFunction, equals, equals);
-        type = null;
+  List<CommentReference> parseCommentReferences(Token dartdoc) {
+    // Parse dartdoc into potential comment reference source/offset pairs
+    int count = parser.parseCommentReferences(dartdoc);
+    List sourcesAndOffsets = new List(count * 2);
+    popList(count * 2, sourcesAndOffsets);
+
+    // Parse each of the source/offset pairs into actual comment references
+    count = 0;
+    int index = 0;
+    while (index < sourcesAndOffsets.length) {
+      String referenceSource = sourcesAndOffsets[index++];
+      int referenceOffset = sourcesAndOffsets[index++];
+      ScannerResult result = scanString(referenceSource);
+      if (!result.hasErrors) {
+        Token token = result.tokens;
+        if (parser.parseOneCommentReference(token, referenceOffset)) {
+          ++count;
+        }
       }
-      declarations.add(ast.genericTypeAlias(
-          comment,
-          metadata,
-          typedefKeyword,
-          name,
-          templateParameters,
-          equals,
-          type as GenericFunctionType,
-          semicolon));
     }
+
+    final references = new List<CommentReference>(count);
+    popTypedList(count, references);
+    return references;
   }
 
-  @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    assert(optional('enum', enumKeyword));
-    assert(optional('{', leftBrace));
-    debugEvent("Enum");
-
-    List<EnumConstantDeclaration> constants = popTypedList(count);
-    SimpleIdentifier name = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, enumKeyword);
-    declarations.add(ast.enumDeclaration(comment, metadata, enumKeyword, name,
-        leftBrace, constants, leftBrace?.endGroup));
+  List<CollectionElement> popCollectionElements(int count) {
+    final elements = new List<CollectionElement>()..length = count;
+    for (int index = count - 1; index >= 0; --index) {
+      var element = pop();
+      elements[index] = element as CollectionElement;
+    }
+    return elements;
   }
 
-  @override
-  void endTypeArguments(int count, Token leftBracket, Token rightBracket) {
-    assert(optional('<', leftBracket));
-    assert(optional('>', rightBracket));
-    debugEvent("TypeArguments");
-
-    List<TypeAnnotation> arguments = popTypedList(count);
-    push(ast.typeArgumentList(leftBracket, arguments, rightBracket));
+  List popList(int n, List list) {
+    if (n == 0) return null;
+    return stack.popList(n, list, null);
   }
 
-  @override
-  void handleInvalidTypeArguments(Token token) {
-    TypeArgumentList invalidTypeArgs = pop();
-    var node = pop();
-    if (node is ConstructorName) {
-      push(new _ConstructorNameWithInvalidTypeArgs(node, invalidTypeArgs));
+  List<T> popTypedList<T>(int count, [List<T> list]) {
+    if (count == 0) return null;
+    assert(stack.arrayLength >= count);
+
+    final table = stack.array;
+    final length = stack.arrayLength;
+
+    final tailList = list ?? new List<T>.filled(count, null, growable: true);
+    final startIndex = length - count;
+    for (int i = 0; i < count; i++) {
+      final value = table[startIndex + i];
+      tailList[i] = value is NullValue ? null : value;
+      table[startIndex + i] = null;
+    }
+    stack.arrayLength -= count;
+
+    return tailList;
+  }
+
+  void pushForControlFlowInfo(Token awaitToken, Token forToken,
+      Token leftParenthesis, ForLoopParts forLoopParts, Object entry) {
+    if (entry == _invalidCollectionElement) {
+      push(_invalidCollectionElement);
+    } else if (enableControlFlowCollections) {
+      push(ast.forElement(
+        awaitKeyword: awaitToken,
+        forKeyword: forToken,
+        leftParenthesis: leftParenthesis,
+        forLoopParts: forLoopParts,
+        rightParenthesis: leftParenthesis.endGroup,
+        body: entry as CollectionElement,
+      ));
     } else {
-      throw new UnimplementedError();
+      handleRecoverableError(
+          templateExperimentNotEnabled
+              .withArguments(EnableString.control_flow_collections),
+          forToken,
+          forToken);
+      push(_invalidCollectionElement);
     }
   }
 
-  @override
-  void endFields(Token staticToken, Token covariantToken, Token varFinalOrConst,
-      int count, Token beginToken, Token semicolon) {
-    assert(optional(';', semicolon));
-    debugEvent("Fields");
-
-    List<VariableDeclaration> variables = popTypedList(count);
-    TypeAnnotation type = pop();
-    _Modifiers modifiers = new _Modifiers()
-      ..staticKeyword = staticToken
-      ..covariantKeyword = covariantToken
-      ..finalConstOrVarKeyword = varFinalOrConst;
-    var variableList = ast.variableDeclarationList(
-        null, null, modifiers?.finalConstOrVarKeyword, type, variables);
-    Token covariantKeyword = modifiers?.covariantKeyword;
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, beginToken);
-    (classDeclaration ?? mixinDeclaration).members.add(ast.fieldDeclaration2(
-        comment: comment,
-        metadata: metadata,
-        covariantKeyword: covariantKeyword,
-        staticKeyword: modifiers?.staticKeyword,
-        fieldList: variableList,
-        semicolon: semicolon));
-  }
-
-  @override
-  AstNode finishFields() {
-    debugEvent("finishFields");
-
-    if (classDeclaration != null) {
-      return classDeclaration.members
-          .removeAt(classDeclaration.members.length - 1);
-    } else if (mixinDeclaration != null) {
-      return mixinDeclaration.members
-          .removeAt(mixinDeclaration.members.length - 1);
+  void pushIfControlFlowInfo(
+      Token ifToken,
+      ParenthesizedExpression condition,
+      CollectionElement thenElement,
+      Token elseToken,
+      CollectionElement elseElement) {
+    if (thenElement == _invalidCollectionElement ||
+        elseElement == _invalidCollectionElement) {
+      push(_invalidCollectionElement);
+    } else if (enableControlFlowCollections) {
+      push(ast.ifElement(
+        ifKeyword: ifToken,
+        leftParenthesis: condition.leftParenthesis,
+        condition: condition.expression,
+        rightParenthesis: condition.rightParenthesis,
+        thenElement: thenElement,
+        elseKeyword: elseToken,
+        elseElement: elseElement,
+      ));
     } else {
-      return declarations.removeLast();
+      handleRecoverableError(
+          templateExperimentNotEnabled
+              .withArguments(EnableString.control_flow_collections),
+          ifToken,
+          ifToken);
+      push(_invalidCollectionElement);
     }
   }
 
-  @override
-  void handleOperatorName(Token operatorKeyword, Token token) {
-    assert(optional('operator', operatorKeyword));
-    assert(token.type.isUserDefinableOperator);
-    debugEvent("OperatorName");
-
-    push(new _OperatorName(
-        operatorKeyword, ast.simpleIdentifier(token, isDeclaration: true)));
-  }
-
-  @override
-  void handleInvalidOperatorName(Token operatorKeyword, Token token) {
-    assert(optional('operator', operatorKeyword));
-    debugEvent("InvalidOperatorName");
-
-    push(new _OperatorName(
-        operatorKeyword, ast.simpleIdentifier(token, isDeclaration: true)));
-  }
-
-  @override
-  void beginMetadataStar(Token token) {
-    debugEvent("beginMetadataStar");
-  }
-
-  @override
-  void endMetadata(Token atSign, Token periodBeforeName, Token endToken) {
-    assert(optional('@', atSign));
-    assert(optionalOrNull('.', periodBeforeName));
-    debugEvent("Metadata");
-
-    MethodInvocation invocation = pop();
-    SimpleIdentifier constructorName = periodBeforeName != null ? pop() : null;
-    pop(); // Type arguments, not allowed.
-    Identifier name = pop();
-    push(ast.annotation(atSign, name, periodBeforeName, constructorName,
-        invocation?.argumentList));
-  }
-
-  @override
-  void endMetadataStar(int count) {
-    debugEvent("MetadataStar");
-
-    push(popTypedList<Annotation>(count) ?? NullValue.Metadata);
-  }
-
-  @override
-  void handleCommentReferenceText(String referenceSource, int referenceOffset) {
-    push(referenceSource);
-    push(referenceOffset);
-  }
-
-  @override
-  void handleCommentReference(
-      Token newKeyword, Token prefix, Token period, Token token) {
-    Identifier identifier = ast.simpleIdentifier(token);
-    if (prefix != null) {
-      identifier = ast.prefixedIdentifier(
-          ast.simpleIdentifier(prefix), period, identifier);
-    }
-    push(ast.commentReference(newKeyword, identifier));
-  }
-
-  ParameterKind _toAnalyzerParameterKind(FormalParameterKind type) {
-    if (type == FormalParameterKind.optionalPositional) {
-      return ParameterKind.POSITIONAL;
-    } else if (type == FormalParameterKind.optionalNamed) {
-      return ParameterKind.NAMED;
-    } else {
-      return ParameterKind.REQUIRED;
+  void reportErrorIfSuper(Expression expression) {
+    if (expression is SuperExpression) {
+      // This error is also reported by the body builder.
+      handleRecoverableError(messageMissingAssignableSelector,
+          expression.beginToken, expression.endToken);
     }
   }
 
@@ -3042,164 +3132,58 @@
     return ast.documentationComment(tokens, references);
   }
 
-  List<CommentReference> parseCommentReferences(Token dartdoc) {
-    // Parse dartdoc into potential comment reference source/offset pairs
-    int count = parser.parseCommentReferences(dartdoc);
-    List sourcesAndOffsets = new List(count * 2);
-    popList(count * 2, sourcesAndOffsets);
-
-    // Parse each of the source/offset pairs into actual comment references
-    count = 0;
-    int index = 0;
-    while (index < sourcesAndOffsets.length) {
-      String referenceSource = sourcesAndOffsets[index++];
-      int referenceOffset = sourcesAndOffsets[index++];
-      ScannerResult result = scanString(referenceSource);
-      if (!result.hasErrors) {
-        Token token = result.tokens;
-        if (parser.parseOneCommentReference(token, referenceOffset)) {
-          ++count;
-        }
-      }
+  void _handleInstanceCreation(Token token) {
+    MethodInvocation arguments = pop();
+    ConstructorName constructorName;
+    TypeArgumentList typeArguments;
+    var object = pop();
+    if (object is _ConstructorNameWithInvalidTypeArgs) {
+      constructorName = object.name;
+      typeArguments = object.invalidTypeArgs;
+    } else {
+      constructorName = object;
     }
-
-    final references = new List<CommentReference>(count);
-    popTypedList(count, references);
-    return references;
+    push(ast.instanceCreationExpression(
+        token, constructorName, arguments.argumentList,
+        typeArguments: typeArguments));
   }
 
-  @override
-  void debugEvent(String name) {
-    // printEvent('AstBuilder: $name');
+  VariableDeclaration _makeVariableDeclaration(
+      SimpleIdentifier name, Token equals, Expression initializer) {
+    var variableDeclaration =
+        ast.variableDeclaration(name, equals, initializer);
+    localDeclarations[name.offset] = variableDeclaration;
+    return variableDeclaration;
   }
 
-  @override
-  void discardTypeReplacedWithCommentTypeAssign() {
-    pop();
-  }
-
-  @override
-  void addProblem(Message message, int charOffset, int length,
-      {bool wasHandled: false, List<LocatedMessage> context}) {
-    if (directives.isEmpty &&
-        (message.code.analyzerCodes
-                ?.contains('NON_PART_OF_DIRECTIVE_IN_PART') ??
-            false)) {
-      message = messageDirectiveAfterDeclaration;
+  ParameterKind _toAnalyzerParameterKind(FormalParameterKind type) {
+    if (type == FormalParameterKind.optionalPositional) {
+      return ParameterKind.POSITIONAL;
+    } else if (type == FormalParameterKind.optionalNamed) {
+      return ParameterKind.NAMED;
+    } else {
+      return ParameterKind.REQUIRED;
     }
-    errorReporter.reportMessage(message, charOffset, length);
-  }
-
-  /// Return `true` if [token] is either `null` or is the symbol or keyword
-  /// [value].
-  bool optionalOrNull(String value, Token token) {
-    return token == null || identical(value, token.stringValue);
-  }
-
-  List<T> popTypedList<T>(int count, [List<T> list]) {
-    if (count == 0) return null;
-    assert(stack.arrayLength >= count);
-
-    final table = stack.array;
-    final length = stack.arrayLength;
-
-    final tailList = list ?? new List<T>.filled(count, null, growable: true);
-    final startIndex = length - count;
-    for (int i = 0; i < count; i++) {
-      final value = table[startIndex + i];
-      tailList[i] = value is NullValue ? null : value;
-      table[startIndex + i] = null;
-    }
-    stack.arrayLength -= count;
-
-    return tailList;
-  }
-
-  @override
-  void exitLocalScope() {}
-
-  @override
-  void endDoWhileStatementBody(Token token) {
-    debugEvent("endDoWhileStatementBody");
-  }
-
-  @override
-  void endForStatementBody(Token token) {
-    debugEvent("endForStatementBody");
-  }
-
-  @override
-  void endForInBody(Token token) {
-    debugEvent("endForInBody");
-  }
-
-  @override
-  void endThenStatement(Token token) {
-    debugEvent("endThenStatement");
-  }
-
-  @override
-  void endWhileStatementBody(Token token) {
-    debugEvent("endWhileStatementBody");
-  }
-
-  @override
-  void endElseStatement(Token token) {
-    debugEvent("endElseStatement");
-  }
-
-  List<CollectionElement> popCollectionElements(int count) {
-    final elements = new List<CollectionElement>()..length = count;
-    for (int index = count - 1; index >= 0; --index) {
-      var element = pop();
-      elements[index] = element as CollectionElement;
-    }
-    return elements;
-  }
-
-  List popList(int n, List list) {
-    if (n == 0) return null;
-    return stack.popList(n, list, null);
   }
 }
 
-/// Data structure placed on the stack to represent the default parameter
-/// value with the separator token.
-class _ParameterDefaultValue {
-  final Token separator;
-  final Expression value;
+class _ConstructorNameWithInvalidTypeArgs {
+  final ConstructorName name;
+  final TypeArgumentList invalidTypeArgs;
 
-  _ParameterDefaultValue(this.separator, this.value);
+  _ConstructorNameWithInvalidTypeArgs(this.name, this.invalidTypeArgs);
 }
 
-/// Data structure placed on stack to represent the redirected constructor.
-class _RedirectingFactoryBody {
-  final Token asyncKeyword;
-  final Token starKeyword;
-  final Token equalToken;
-  final ConstructorName constructorName;
+/// When [enableSpreadCollections] and/or [enableControlFlowCollections]
+/// are false, this class is pushed on the stack when a disabled
+/// [CollectionElement] has been parsed.
+class _InvalidCollectionElement implements CollectionElement {
+  // TODO(danrubel): Remove this once control flow and spread collections
+  // have been enabled by default.
 
-  _RedirectingFactoryBody(this.asyncKeyword, this.starKeyword, this.equalToken,
-      this.constructorName);
-}
+  const _InvalidCollectionElement._();
 
-/// Data structure placed on the stack as a container for optional parameters.
-class _OptionalFormalParameters {
-  final List<FormalParameter> parameters;
-  final Token leftDelimiter;
-  final Token rightDelimiter;
-
-  _OptionalFormalParameters(
-      this.parameters, this.leftDelimiter, this.rightDelimiter);
-}
-
-/// Data structure placed on the stack to represent the keyword "operator"
-/// followed by a token.
-class _OperatorName {
-  final Token operatorKeyword;
-  final SimpleIdentifier name;
-
-  _OperatorName(this.operatorKeyword, this.name);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
 
 /// Data structure placed on the stack to represent a non-empty sequence
@@ -3268,9 +3252,41 @@
   }
 }
 
-class _ConstructorNameWithInvalidTypeArgs {
-  final ConstructorName name;
-  final TypeArgumentList invalidTypeArgs;
+/// Data structure placed on the stack to represent the keyword "operator"
+/// followed by a token.
+class _OperatorName {
+  final Token operatorKeyword;
+  final SimpleIdentifier name;
 
-  _ConstructorNameWithInvalidTypeArgs(this.name, this.invalidTypeArgs);
+  _OperatorName(this.operatorKeyword, this.name);
+}
+
+/// Data structure placed on the stack as a container for optional parameters.
+class _OptionalFormalParameters {
+  final List<FormalParameter> parameters;
+  final Token leftDelimiter;
+  final Token rightDelimiter;
+
+  _OptionalFormalParameters(
+      this.parameters, this.leftDelimiter, this.rightDelimiter);
+}
+
+/// Data structure placed on the stack to represent the default parameter
+/// value with the separator token.
+class _ParameterDefaultValue {
+  final Token separator;
+  final Expression value;
+
+  _ParameterDefaultValue(this.separator, this.value);
+}
+
+/// Data structure placed on stack to represent the redirected constructor.
+class _RedirectingFactoryBody {
+  final Token asyncKeyword;
+  final Token starKeyword;
+  final Token equalToken;
+  final ConstructorName constructorName;
+
+  _RedirectingFactoryBody(this.asyncKeyword, this.starKeyword, this.equalToken,
+      this.constructorName);
 }
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index 50f2609..16f6f09 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -40,6 +40,10 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, offset, length);
         return;
+      case "AWAIT_IN_WRONG_CONTEXT":
+        errorReporter?.reportErrorForOffset(
+            CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT, offset, length);
+        return;
       case "BUILT_IN_IDENTIFIER_AS_TYPE":
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE,
diff --git a/pkg/analyzer/lib/src/fasta/mock_type.dart b/pkg/analyzer/lib/src/fasta/mock_type.dart
deleted file mode 100644
index b8b357d..0000000
--- a/pkg/analyzer/lib/src/fasta/mock_type.dart
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/element/element.dart';
-
-import 'package:analyzer/dart/element/type.dart';
-
-import 'package:analyzer/src/generated/type_system.dart' show TypeSystem;
-
-import 'package:front_end/src/fasta/problems.dart' show unsupported;
-
-abstract class MockType extends DartType {
-  String get displayName => unsupported("displayName", -1, null);
-
-  Element get element => unsupported("element", -1, null);
-
-  bool get isBottom => unsupported("isBottom", -1, null);
-
-  bool get isDartAsyncFuture => unsupported("isDartAsyncFuture", -1, null);
-
-  bool get isDartAsyncFutureOr => unsupported("isDartAsyncFutureOr", -1, null);
-
-  bool get isDartCoreFunction => unsupported("isDartCoreFunction", -1, null);
-
-  bool get isDynamic => unsupported("isDynamic", -1, null);
-
-  bool get isObject => unsupported("isObject", -1, null);
-
-  bool get isUndefined => unsupported("isUndefined", -1, null);
-
-  bool get isVoid => unsupported("isVoid", -1, null);
-
-  String get name => unsupported("name", -1, null);
-
-  DartType flattenFutures(TypeSystem typeSystem) {
-    return unsupported("flattenFutures", -1, null);
-  }
-
-  bool isAssignableTo(DartType type) => unsupported("isAssignableTo", -1, null);
-
-  bool isMoreSpecificThan(DartType type) =>
-      unsupported("isMoreSpecificThan", -1, null);
-
-  bool isSubtypeOf(DartType type) => unsupported("isSubtypeOf", -1, null);
-
-  bool isSupertypeOf(DartType type) => unsupported("isSupertypeOf", -1, null);
-
-  DartType resolveToBound(DartType objectType) {
-    return unsupported("resolveToBound", -1, null);
-  }
-
-  DartType substitute2(
-      List<DartType> argumentTypes, List<DartType> parameterTypes) {
-    return unsupported("substitute2", -1, null);
-  }
-
-  List<DartType> get typeArguments {
-    return unsupported("typeArguments", -1, null);
-  }
-
-  List<TypeParameterElement> get typeParameters {
-    return unsupported("typeParameters", -1, null);
-  }
-
-  ParameterizedType instantiate(List<DartType> argumentTypes) {
-    return unsupported("instantiate", -1, null);
-  }
-}
-
-abstract class MockInterfaceType extends MockType implements InterfaceType {
-  ClassElement get element => unsupported("element", -1, null);
-
-  List<PropertyAccessorElement> get accessors {
-    return unsupported("accessors", -1, null);
-  }
-
-  List<ConstructorElement> get constructors {
-    return unsupported("constructors", -1, null);
-  }
-
-  List<InterfaceType> get interfaces {
-    return unsupported("interfaces", -1, null);
-  }
-
-  List<MethodElement> get methods {
-    return unsupported("methods", -1, null);
-  }
-
-  List<InterfaceType> get mixins {
-    return unsupported("mixins", -1, null);
-  }
-
-  InterfaceType get superclass => unsupported("superclass", -1, null);
-
-  PropertyAccessorElement getGetter(String name) {
-    return unsupported(" PropertyAccessorElement getGetter", -1, null);
-  }
-
-  MethodElement getMethod(String name) {
-    return unsupported("getMethod", -1, null);
-  }
-
-  PropertyAccessorElement getSetter(String name) {
-    return unsupported(" PropertyAccessorElement getSetter", -1, null);
-  }
-
-  bool isDirectSupertypeOf(InterfaceType type) {
-    return unsupported("isDirectSupertypeOf", -1, null);
-  }
-
-  ConstructorElement lookUpConstructor(String name, LibraryElement library) {
-    return unsupported(" ConstructorElement lookUpConstructor", -1, null);
-  }
-
-  PropertyAccessorElement lookUpGetter(String name, LibraryElement library) {
-    return unsupported(" PropertyAccessorElement lookUpGetter", -1, null);
-  }
-
-  PropertyAccessorElement lookUpGetterInSuperclass(
-      String name, LibraryElement library) {
-    return unsupported("lookUpGetterInSuperclass", -1, null);
-  }
-
-  PropertyAccessorElement lookUpInheritedGetter(String name,
-      {LibraryElement library, bool thisType: true}) {
-    return unsupported(
-        " PropertyAccessorElement lookUpInheritedGetter", -1, null);
-  }
-
-  ExecutableElement lookUpInheritedGetterOrMethod(String name,
-      {LibraryElement library}) {
-    return unsupported("lookUpInheritedGetterOrMethod", -1, null);
-  }
-
-  MethodElement lookUpInheritedMethod(String name,
-      {LibraryElement library, bool thisType: true}) {
-    return unsupported(" MethodElement lookUpInheritedMethod", -1, null);
-  }
-
-  PropertyAccessorElement lookUpInheritedSetter(String name,
-      {LibraryElement library, bool thisType: true}) {
-    return unsupported(
-        " PropertyAccessorElement lookUpInheritedSetter", -1, null);
-  }
-
-  MethodElement lookUpMethod(String name, LibraryElement library) {
-    return unsupported("lookUpMethod", -1, null);
-  }
-
-  MethodElement lookUpMethodInSuperclass(String name, LibraryElement library) {
-    return unsupported(" MethodElement lookUpMethodInSuperclass", -1, null);
-  }
-
-  PropertyAccessorElement lookUpSetter(String name, LibraryElement library) {
-    return unsupported(" PropertyAccessorElement lookUpSetter", -1, null);
-  }
-
-  PropertyAccessorElement lookUpSetterInSuperclass(
-      String name, LibraryElement library) {
-    return unsupported("lookUpSetterInSuperclass", -1, null);
-  }
-
-  InterfaceType instantiate(List<DartType> argumentTypes) {
-    return unsupported("instantiate", -1, null);
-  }
-
-  InterfaceType substitute2(
-      List<DartType> argumentTypes, List<DartType> parameterTypes) {
-    return unsupported("substitute2", -1, null);
-  }
-
-  InterfaceType substitute4(List<DartType> argumentTypes) {
-    return unsupported("substitute4", -1, null);
-  }
-
-  get isDartCoreNull => unsupported("isDartCoreNull", -1, null);
-}
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index b86cd55..9a99f54 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/precedence.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -414,6 +415,12 @@
   }
 
   @override
+  void visitGenericTypeAlias(GenericTypeAlias node) {
+    resolveMetadata(node);
+    return null;
+  }
+
+  @override
   void visitImportDirective(ImportDirective node) {
     SimpleIdentifier prefixNode = node.prefix;
     if (prefixNode != null) {
@@ -580,13 +587,6 @@
         return;
       }
       if (element == null) {
-        if (identifier.inSetterContext()) {
-          _resolver.errorReporter.reportErrorForNode(
-              StaticTypeWarningCode.UNDEFINED_SETTER,
-              identifier,
-              [identifier.name, prefixElement.name]);
-          return;
-        }
         AstNode parent = node.parent;
         if (parent is Annotation) {
           _resolver.errorReporter.reportErrorForNode(
@@ -595,7 +595,7 @@
               [identifier.name]);
         } else {
           _resolver.errorReporter.reportErrorForNode(
-              StaticTypeWarningCode.UNDEFINED_GETTER,
+              StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME,
               identifier,
               [identifier.name, prefixElement.name]);
         }
@@ -1877,8 +1877,13 @@
   @override
   int get offset => targetIdentifier.offset;
 
+  @Deprecated('In the next major release, type will change to `Precedence`.  '
+      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
+
+  @override
+  Precedence get precedence2 => Precedence.primary;
 
   @deprecated
   @override
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 3b581fa..808478c 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -31,14 +31,8 @@
 import 'package:analyzer/src/summary/api_signature.dart';
 import 'package:analyzer/src/task/api/dart.dart';
 import 'package:analyzer/src/task/api/model.dart';
-import 'package:analyzer/src/task/dart.dart';
-import 'package:analyzer/src/task/general.dart';
-import 'package:analyzer/src/task/html.dart';
 import 'package:analyzer/src/task/manager.dart';
-import 'package:analyzer/src/task/options.dart';
-import 'package:analyzer/src/task/yaml.dart';
 import 'package:front_end/src/fasta/scanner/token.dart';
-import 'package:html/dom.dart' show Document;
 import 'package:path/path.dart' as pathos;
 import 'package:plugin/manager.dart';
 import 'package:plugin/plugin.dart';
@@ -552,15 +546,6 @@
   CompilationUnit parseCompilationUnit(Source source);
 
   /**
-   * Parse a single HTML [source] to produce a document model.
-   *
-   * Throws an [AnalysisException] if the analysis could not be performed
-   *
-   * <b>Note:</b> This method cannot be used in an async environment.
-   */
-  Document parseHtmlDocument(Source source);
-
-  /**
    * Perform the next unit of work required to keep the analysis results
    * up-to-date and return information about the consequent changes to the
    * analysis results. This method can be long running.
@@ -830,8 +815,6 @@
   TaskManager get taskManager {
     if (_taskManager == null) {
       _taskManager = new TaskManager();
-      _initializeTaskMap();
-      _initializeResults();
     }
     return _taskManager;
   }
@@ -865,87 +848,6 @@
     }
   }
 
-  void _initializeResults() {
-    _taskManager.addGeneralResult(DART_ERRORS);
-  }
-
-  void _initializeTaskMap() {
-    //
-    // Register general tasks.
-    //
-    _taskManager.addTaskDescriptor(GetContentTask.DESCRIPTOR);
-    //
-    // Register Dart tasks.
-    //
-    _taskManager.addTaskDescriptor(BuildCompilationUnitElementTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(BuildDirectiveElementsTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(BuildEnumMemberElementsTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(BuildExportNamespaceTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(BuildLibraryElementTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(BuildPublicNamespaceTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(BuildSourceExportClosureTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(BuildTypeProviderTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ComputeConstantDependenciesTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ComputeConstantValueTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(
-        ComputeInferableStaticVariableDependenciesTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ComputeLibraryCycleTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ComputeRequiredConstantsTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ContainingLibrariesTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(DartErrorsTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(EvaluateUnitConstantsTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(GatherUsedImportedElementsTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(GatherUsedLocalElementsTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(GenerateHintsTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(GenerateLintsTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(InferInstanceMembersInUnitTask.DESCRIPTOR);
-    _taskManager
-        .addTaskDescriptor(InferStaticVariableTypesInUnitTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(InferStaticVariableTypeTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(LibraryErrorsReadyTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(LibraryUnitErrorsTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ParseDartTask.DESCRIPTOR);
-    _taskManager
-        .addTaskDescriptor(PartiallyResolveUnitReferencesTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ReadyLibraryElement2Task.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ReadyLibraryElement5Task.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ReadyLibraryElement7Task.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ReadyResolvedUnitTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ResolveConstantExpressionTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ResolveDirectiveElementsTask.DESCRIPTOR);
-    _taskManager
-        .addTaskDescriptor(ResolvedUnit7InLibraryClosureTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ResolvedUnit7InLibraryTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ResolveInstanceFieldsInUnitTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ResolveLibraryReferencesTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ResolveLibraryTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ResolveLibraryTypeNamesTask.DESCRIPTOR);
-    _taskManager
-        .addTaskDescriptor(ResolveTopLevelLibraryTypeBoundsTask.DESCRIPTOR);
-    _taskManager
-        .addTaskDescriptor(ResolveTopLevelUnitTypeBoundsTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ResolveUnitTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ResolveUnitTypeNamesTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ResolveVariableReferencesTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ScanDartTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(StrongModeVerifyUnitTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(VerifyUnitTask.DESCRIPTOR);
-    //
-    // Register HTML tasks.
-    //
-    _taskManager.addTaskDescriptor(DartScriptsTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(HtmlErrorsTask.DESCRIPTOR);
-    _taskManager.addTaskDescriptor(ParseHtmlTask.DESCRIPTOR);
-    //
-    // Register YAML tasks.
-    //
-    _taskManager.addTaskDescriptor(ParseYamlTask.DESCRIPTOR);
-    //
-    // Register analysis option file tasks.
-    //
-    _taskManager.addTaskDescriptor(GenerateOptionsErrorsTask.DESCRIPTOR);
-  }
-
   /**
    * Return `true` if the given [fileName] is an analysis options file.
    */
@@ -970,17 +872,6 @@
     String extension = FileNameUtilities.getExtension(fileName).toLowerCase();
     return extension == SUFFIX_DART;
   }
-
-  /**
-   * Return `true` if the given [fileName] is assumed to contain HTML.
-   */
-  static bool isHtmlFileName(String fileName) {
-    if (fileName == null) {
-      return false;
-    }
-    String extension = FileNameUtilities.getExtension(fileName).toLowerCase();
-    return extension == SUFFIX_HTML || extension == SUFFIX_HTM;
-  }
 }
 
 /**
@@ -1505,6 +1396,22 @@
   bool implicitDynamic = true;
 
   /**
+   * A flag indicating whether inference failures are allowed, off by default.
+   *
+   * This option is experimental and subject to change.
+   */
+  bool strictInference = false;
+
+  /**
+   * Whether raw types (types without explicit type arguments, such as `List`)
+   * should be reported as potential problems.
+   * 
+   * Raw types are a common source of `dynamic` being introduced implicitly.
+   * This often leads to cast failures later on in the program.
+   */
+  bool strictRawTypes = false;
+
+  /**
    * Initialize a newly created set of analysis options to have their default
    * values.
    */
@@ -1534,6 +1441,8 @@
       strongModeHints = options.strongModeHints;
       implicitCasts = options.implicitCasts;
       implicitDynamic = options.implicitDynamic;
+      strictInference = options.strictInference;
+      strictRawTypes = options.strictRawTypes;
     }
     trackCacheDependencies = options.trackCacheDependencies;
     disableCacheFlushing = options.disableCacheFlushing;
@@ -1708,6 +1617,8 @@
       buffer.addBool(enableLazyAssignmentOperators);
       buffer.addBool(implicitCasts);
       buffer.addBool(implicitDynamic);
+      buffer.addBool(strictInference);
+      buffer.addBool(strictRawTypes);
       buffer.addBool(strongModeHints);
       buffer.addBool(useFastaParser);
 
@@ -1724,6 +1635,7 @@
       }
 
       // Append lints.
+      buffer.addString(linterVersion ?? '');
       buffer.addInt(lintRules.length);
       for (Linter lintRule in lintRules) {
         buffer.addString(lintRule.lintCode.uniqueName);
@@ -1790,6 +1702,8 @@
     hint = true;
     implicitCasts = true;
     implicitDynamic = true;
+    strictInference = false;
+    strictRawTypes = false;
     lint = false;
     _lintRules = null;
     patchPaths = {};
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 55f766e..48f58c6 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -277,6 +277,8 @@
   /// fixed.
   final bool disableConflictingGenericsCheck;
 
+  bool _isNonNullable = false;
+
   /**
    * Initialize a newly created error verifier.
    */
@@ -397,7 +399,9 @@
       _checkForUseOfVoidResult(node.rightOperand);
       _checkForNullableDereference(node.leftOperand);
       _checkForNullableDereference(node.rightOperand);
-    } else if (type != TokenType.EQ_EQ && type != TokenType.BANG_EQ) {
+    } else if (type != TokenType.EQ_EQ &&
+        type != TokenType.BANG_EQ &&
+        type != TokenType.QUESTION_QUESTION) {
       _checkForArgumentTypeNotAssignableForArgument(node.rightOperand);
       _checkForNullableDereference(node.leftOperand);
     } else {
@@ -537,9 +541,11 @@
 
   @override
   void visitCompilationUnit(CompilationUnit node) {
+    _isNonNullable = (node as CompilationUnitImpl).isNonNullable;
     _checkDuplicateUnitMembers(node);
     _checkForDeferredPrefixCollisions(node);
     super.visitCompilationUnit(node);
+    _isNonNullable = false;
   }
 
   @override
@@ -734,6 +740,7 @@
   }
 
   @override
+  @deprecated
   void visitForEachStatement(ForEachStatement node) {
     _checkForInIterable(node);
     super.visitForEachStatement(node);
@@ -766,6 +773,7 @@
   }
 
   @override
+  @deprecated
   void visitForStatement(ForStatement node) {
     if (node.condition != null) {
       _checkForNonBoolCondition(node.condition);
@@ -998,6 +1006,7 @@
       _checkTypeArgumentCount(typeArguments, 1,
           StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS);
     }
+    _checkForRawTypedLiteral(node);
     _checkForImplicitDynamicTypedLiteral(node);
     _checkForListElementTypeNotAssignable(node);
 
@@ -1005,26 +1014,7 @@
   }
 
   @override
-  void visitListLiteral2(ListLiteral2 node) {
-    TypeArgumentList typeArguments = node.typeArguments;
-    if (typeArguments != null) {
-      if (node.isConst) {
-        NodeList<TypeAnnotation> arguments = typeArguments.arguments;
-        if (arguments.isNotEmpty) {
-          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments,
-              CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST);
-        }
-      }
-      _checkTypeArgumentCount(typeArguments, 1,
-          StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS);
-    }
-    _checkForImplicitDynamicTypedLiteral(node);
-    _checkForListElementTypeNotAssignable2(node);
-
-    super.visitListLiteral2(node);
-  }
-
-  @override
+  @deprecated
   void visitMapLiteral(MapLiteral node) {
     TypeArgumentList typeArguments = node.typeArguments;
     if (typeArguments != null) {
@@ -1038,6 +1028,7 @@
       _checkTypeArgumentCount(typeArguments, 2,
           StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS);
     }
+    _checkForRawTypedLiteral(node);
     _checkForImplicitDynamicTypedLiteral(node);
     _checkForMapTypeNotAssignable(node);
     _checkForNonConstMapAsExpressionStatement(node);
@@ -1045,26 +1036,6 @@
   }
 
   @override
-  void visitMapLiteral2(MapLiteral2 node) {
-    TypeArgumentList typeArguments = node.typeArguments;
-    if (typeArguments != null) {
-      NodeList<TypeAnnotation> arguments = typeArguments.arguments;
-      if (arguments.isNotEmpty) {
-        if (node.isConst) {
-          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments,
-              CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
-        }
-      }
-      _checkTypeArgumentCount(typeArguments, 2,
-          StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS);
-    }
-    _checkForImplicitDynamicTypedLiteral(node);
-    _checkForMapTypeNotAssignable2(node);
-    _checkForNonConstMapAsExpressionStatement2(node);
-    super.visitMapLiteral2(node);
-  }
-
-  @override
   void visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement previousFunction = _enclosingFunction;
     try {
@@ -1100,6 +1071,7 @@
       ClassElement typeReference = ElementResolver.getTypeReference(target);
       _checkForStaticAccessToInstanceMember(typeReference, methodName);
       _checkForInstanceAccessToStaticMember(typeReference, methodName);
+      _checkForUnnecessaryNullAware(target, node.operator);
     } else {
       _checkForUnqualifiedReferenceToNonLocalStaticMember(methodName);
       _checkForNullableDereference(node.function);
@@ -1216,6 +1188,7 @@
         propertyName.name != 'runtimeType') {
       _checkForNullableDereference(node.target);
     }
+    _checkForUnnecessaryNullAware(node.target, node.operator);
     super.visitPropertyAccess(node);
   }
 
@@ -1248,6 +1221,7 @@
   }
 
   @override
+  @deprecated
   void visitSetLiteral(SetLiteral node) {
     TypeArgumentList typeArguments = node.typeArguments;
     if (typeArguments != null) {
@@ -1261,6 +1235,7 @@
       _checkTypeArgumentCount(typeArguments, 1,
           StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS);
     }
+    _checkForRawTypedLiteral(node);
     _checkForImplicitDynamicTypedLiteral(node);
     _checkForSetElementTypeNotAssignable(node);
 
@@ -1268,23 +1243,41 @@
   }
 
   @override
-  void visitSetLiteral2(SetLiteral2 node) {
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
     TypeArgumentList typeArguments = node.typeArguments;
-    if (typeArguments != null) {
-      if (node.isConst) {
+    if (node.isMap) {
+      if (typeArguments != null) {
         NodeList<TypeAnnotation> arguments = typeArguments.arguments;
-        if (arguments.isNotEmpty) {
-          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments,
-              CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET);
+        if (node.isConst) {
+          if (arguments.isNotEmpty) {
+            _checkForInvalidTypeArgumentInConstTypedLiteral(arguments,
+                CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
+          }
         }
+        _checkTypeArgumentCount(typeArguments, 2,
+            StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS);
       }
-      _checkTypeArgumentCount(typeArguments, 1,
-          StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS);
+      _checkForRawTypedLiteral(node);
+      _checkForImplicitDynamicTypedLiteral(node);
+      _checkForMapTypeNotAssignable3(node);
+      _checkForNonConstMapAsExpressionStatement3(node);
+    } else if (node.isSet) {
+      if (typeArguments != null) {
+        if (node.isConst) {
+          NodeList<TypeAnnotation> arguments = typeArguments.arguments;
+          if (arguments.isNotEmpty) {
+            _checkForInvalidTypeArgumentInConstTypedLiteral(arguments,
+                CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET);
+          }
+        }
+        _checkTypeArgumentCount(typeArguments, 1,
+            StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS);
+      }
+      _checkForRawTypedLiteral(node);
+      _checkForImplicitDynamicTypedLiteral(node);
+      _checkForSetElementTypeNotAssignable3(node);
     }
-    _checkForImplicitDynamicTypedLiteral(node);
-    _checkForSetElementTypeNotAssignable2(node);
-
-    super.visitSetLiteral2(node);
+    super.visitSetOrMapLiteral(node);
   }
 
   @override
@@ -1378,6 +1371,7 @@
   @override
   void visitTypeName(TypeName node) {
     _checkForTypeArgumentNotMatchingBounds(node);
+    _checkForRawTypeName(node);
     super.visitTypeName(node);
   }
 
@@ -1427,7 +1421,9 @@
         grandparent is! FieldDeclaration) {
       VariableElement element = node.declaredElement;
       if (element != null) {
-        _hiddenElements.declare(element);
+        // There is no hidden elements if we are outside of a function body,
+        // which will happen for variables declared in control flow elements.
+        _hiddenElements?.declare(element);
       }
     }
   }
@@ -2250,18 +2246,6 @@
    * parameters. The [expectedStaticType] is the expected static type of the
    * parameter. The [actualStaticType] is the actual static type of the
    * argument.
-   *
-   * This method corresponds to
-   * [BestPracticesVerifier.checkForArgumentTypeNotAssignable].
-   *
-   * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE],
-   * [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE],
-   * [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE],
-   * [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE],
-   * [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE],
-   * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
-   * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE], and
-   * [StaticWarningCode.USE_OF_VOID_RESULT].
    */
   void _checkForArgumentTypeNotAssignable(
       Expression expression,
@@ -2300,6 +2284,63 @@
   }
 
   /**
+   * Verify that the type of the elements of the given [spreadExpression] (the
+   * [spreadExpressionType]) can be assigned to the element type of the
+   * enclosing collection (the [elementType]). If not, report an error with the
+   * given [errorCode].
+   */
+  void _checkForArgumentTypeNotAssignableInSpread(
+      Expression spreadExpression,
+      DartType spreadExpressionType,
+      DartType elementType,
+      ErrorCode errorCode) {
+    if (spreadExpressionType != null && elementType != null) {
+      if (!elementType.isVoid && _checkForUseOfVoidResult(spreadExpression)) {
+        return;
+      }
+      if (spreadExpressionType is InterfaceType) {
+        if (_typeSystem.isSubtypeOf(
+            spreadExpressionType, _typeProvider.iterableObjectType)) {
+          InterfaceType iterableType =
+              (spreadExpressionType as InterfaceTypeImpl)
+                  .asInstanceOf(_typeProvider.iterableType.element);
+          if (iterableType != null) {
+            // The `iterableType` will be `null` when `spreadExpressionType` is
+            // `Null`. Fall through in that case to perform the default type
+            // check.
+            List<DartType> typeArguments = iterableType.typeArguments;
+            if (typeArguments.length == 1) {
+              _checkForAssignableExpressionAtType(
+                  spreadExpression, typeArguments[0], elementType, errorCode);
+              return;
+            }
+          }
+        } else if (_typeSystem.isSubtypeOf(
+            spreadExpressionType, _typeProvider.mapObjectObjectType)) {
+          // TODO(brianwilkerson) Handle spreads involving maps? This method
+          //  isn't currently called for maps, but might be if it's reworked as
+          //  expected.
+//          InterfaceType mapType =
+//              (spreadExpressionType as InterfaceTypeImpl)
+//                  .asInstanceOf(_typeProvider.mapType.element);
+//          if (mapType != null) {
+//            List<DartType> typeArguments = mapType.typeArguments;
+//            if (typeArguments.length == 2) {
+//              _checkForAssignableExpressionAtType(
+//                  spreadExpression, typeArguments[0], keyType, errorCode);
+//              _checkForAssignableExpressionAtType(
+//                  spreadExpression, typeArguments[1], valueType, errorCode);
+//              return;
+//            }
+//          }
+        }
+      }
+      _checkForAssignableExpressionAtType(
+          spreadExpression, spreadExpressionType, elementType, errorCode);
+    }
+  }
+
+  /**
    * Verify that the given [expression] can be assigned to its corresponding
    * parameters. The [expectedStaticType] is the expected static type.
    *
@@ -2580,8 +2621,8 @@
           element, elementType, getStaticType(element), errorCode);
     } else if (element is SpreadElement) {
       Expression expression = element.expression;
-      _checkForArgumentTypeNotAssignable(
-          expression, elementType, getStaticType(expression), errorCode);
+      _checkForArgumentTypeNotAssignableInSpread(
+          expression, getStaticType(expression), elementType, errorCode);
     }
   }
 
@@ -3770,6 +3811,7 @@
    * Check for a type mis-match between the iterable expression and the
    * assigned variable in a for-in statement.
    */
+  @deprecated
   void _checkForInIterable(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
 
@@ -4041,40 +4083,7 @@
 
     // Check every list element.
     bool isConst = literal.isConst;
-    for (Expression element in literal.elements) {
-      if (isConst) {
-        // TODO(paulberry): this error should be based on the actual type of the
-        // list element, not the static type.  See dartbug.com/21119.
-        _checkForArgumentTypeNotAssignableWithExpectedTypes(
-            element,
-            listElementType,
-            CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE);
-      }
-      _checkForArgumentTypeNotAssignableWithExpectedTypes(element,
-          listElementType, StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE);
-    }
-  }
-
-  /**
-   * Verify that the elements of the given list [literal] are subtypes of the
-   * list's static type.
-   */
-  void _checkForListElementTypeNotAssignable2(ListLiteral2 literal) {
-    // Determine the list's element type. We base this on the static type and
-    // not the literal's type arguments because in strong mode, the type
-    // arguments may be inferred.
-    DartType listType = literal.staticType;
-    assert(listType is InterfaceTypeImpl);
-
-    List<DartType> typeArguments =
-        (listType as InterfaceTypeImpl).typeArguments;
-    assert(typeArguments.length == 1);
-
-    DartType listElementType = typeArguments[0];
-
-    // Check every list element.
-    bool isConst = literal.isConst;
-    for (CollectionElement element in literal.elements) {
+    for (CollectionElement element in literal.elements2) {
       if (isConst) {
         // TODO(paulberry): this error should be based on the actual type of the
         // list element, not the static type.  See dartbug.com/21119.
@@ -4150,6 +4159,7 @@
    * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
    * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE].
    */
+  @deprecated
   void _checkForMapTypeNotAssignable(MapLiteral literal) {
     // Determine the map's key and value types. We base this on the static type
     // and not the literal's type arguments because in strong mode, the type
@@ -4196,7 +4206,7 @@
    * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
    * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE].
    */
-  void _checkForMapTypeNotAssignable2(MapLiteral2 literal) {
+  void _checkForMapTypeNotAssignable3(SetOrMapLiteral literal) {
     // Determine the map's key and value types. We base this on the static type
     // and not the literal's type arguments because in strong mode, the type
     // arguments may be inferred.
@@ -4209,29 +4219,34 @@
     assert(mapType is InterfaceTypeImpl);
 
     List<DartType> typeArguments = (mapType as InterfaceTypeImpl).typeArguments;
-    assert(typeArguments.length == 2);
-    DartType keyType = typeArguments[0];
-    DartType valueType = typeArguments[1];
+    // It is possible for the number of type arguments to be inconsistent when
+    // the literal is ambiguous and a non-map type was selected.
+    // TODO(brianwilkerson) Unify this and _checkForSetElementTypeNotAssignable3
+    //  to better handle recovery situations.
+    if (typeArguments.length == 2) {
+      DartType keyType = typeArguments[0];
+      DartType valueType = typeArguments[1];
 
-    bool isConst = literal.isConst;
-    NodeList<CollectionElement> entries = literal.entries;
-    for (CollectionElement entry in entries) {
-      if (isConst) {
-        // TODO(paulberry): this error should be based on the actual type of the
-        // list element, not the static type.  See dartbug.com/21119.
-        _checkForMapElementTypeNotAssignableWithKeyOrValueType(
-            entry,
-            keyType,
-            valueType,
-            CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
-            CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE);
-      } else {
-        _checkForMapElementTypeNotAssignableWithKeyOrValueType(
-            entry,
-            keyType,
-            valueType,
-            StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
-            StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE);
+      bool isConst = literal.isConst;
+      NodeList<CollectionElement> entries = literal.elements2;
+      for (CollectionElement entry in entries) {
+        if (isConst) {
+          // TODO(paulberry): this error should be based on the actual type of
+          //  the map entries, not the static type.  See dartbug.com/21119.
+          _checkForMapElementTypeNotAssignableWithKeyOrValueType(
+              entry,
+              keyType,
+              valueType,
+              CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
+              CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE);
+        } else {
+          _checkForMapElementTypeNotAssignableWithKeyOrValueType(
+              entry,
+              keyType,
+              valueType,
+              StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
+              StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE);
+        }
       }
     }
   }
@@ -4557,11 +4572,9 @@
     Map<LibraryElement, Map<String, String>> mixedInNames =
         <LibraryElement, Map<String, String>>{};
 
-    /**
-     * Report an error and return `true` if the given [name] is a private name
-     * (which is defined in the given [library]) and it conflicts with another
-     * definition of that name inherited from the superclass.
-     */
+    /// Report an error and return `true` if the given [name] is a private name
+    /// (which is defined in the given [library]) and it conflicts with another
+    /// definition of that name inherited from the superclass.
     bool isConflictingName(
         String name, LibraryElement library, TypeName typeName) {
       if (Identifier.isPrivateName(name)) {
@@ -4802,6 +4815,7 @@
    *
    * See [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT].
    */
+  @deprecated
   void _checkForNonConstMapAsExpressionStatement(MapLiteral literal) {
     // "const"
     if (literal.constKeyword != null) {
@@ -4833,7 +4847,7 @@
    *
    * See [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT].
    */
-  void _checkForNonConstMapAsExpressionStatement2(MapLiteral2 literal) {
+  void _checkForNonConstMapAsExpressionStatement3(SetOrMapLiteral literal) {
     // "const"
     if (literal.constKeyword != null) {
       return;
@@ -4904,7 +4918,7 @@
    */
   bool _checkForNullableDereference(Expression expression) {
     if (expression == null ||
-        !_options.experimentStatus.non_nullable ||
+        !_isNonNullable ||
         expression.staticType == null ||
         (expression.staticType as TypeImpl).nullability !=
             Nullability.nullable) {
@@ -5049,6 +5063,93 @@
         CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, parameter);
   }
 
+  /// Similar to [_checkForRawTypeName] but for list/map/set literals.
+  void _checkForRawTypedLiteral(TypedLiteral node) {
+    if (!_options.strictRawTypes || node == null) return;
+    if (node.typeArguments != null) {
+      // Type has explicit type arguments.
+      return;
+    }
+    var type = node.staticType;
+    return _checkForRawTypeErrors(node, type, type.element, node);
+  }
+
+  /// Given a [node] without type arguments that refers to [element], issues
+  /// an error if [type] is a generic type, and the type arguments were not
+  /// supplied from inference or a non-dynamic default instantiation.
+  ///
+  /// This function is used by other node-specific raw type checking functions
+  /// (for example [_checkForRawTypeName]), and should only be called when
+  /// we already know [AnalysisOptionsImpl.strictRawTypes] is true and [node]
+  /// has no explicit `typeArguments`.
+  ///
+  /// [inferenceContextNode] is the node that has the downwards context type,
+  /// if any. For example an [InstanceCreationExpression].
+  ///
+  /// The raw type error [HintCode.STRICT_RAW_TYPE] will *not* be reported when
+  /// any of the following are true:
+  ///
+  /// - [inferenceContextNode] has an inference context type that does not
+  ///   contain `?`
+  /// - [type] does not have any `dynamic` type arguments.
+  /// - the element is marked with `@optionalTypeArgs` from "package:meta".
+  void _checkForRawTypeErrors(AstNode node, DartType type, Element element,
+      Expression inferenceContextNode) {
+    assert(_options.strictRawTypes);
+    // Check if this type has type arguments and at least one is dynamic.
+    // If so, we may need to issue a strict-raw-types error.
+    if (type is ParameterizedType &&
+        type.typeArguments.any((t) => t.isDynamic)) {
+      // If we have an inference context node, check if the type was inferred
+      // from it. Some cases will not have a context type, such as the type
+      // annotation `List` in `List list;`
+      if (inferenceContextNode != null) {
+        var contextType = InferenceContext.getContext(inferenceContextNode);
+        if (contextType != null && UnknownInferredType.isKnown(contextType)) {
+          // Type was inferred from downwards context: not an error.
+          return;
+        }
+      }
+      if (element.metadata.isNotEmpty) {
+        for (var annotation in element.metadata) {
+          var e = annotation.element;
+          // TODO(jmesserly): similar "package:meta" annotations are added to
+          // the element as boolean getters, that may be worth considering.
+          if (e?.name == 'optionalTypeArgs' &&
+              e.librarySource.uri.toString() == 'package:meta/meta.dart') {
+            // Type is marked with `@optionalTypeArgs`: not an error.
+            return;
+          }
+        }
+      }
+      _errorReporter.reportErrorForNode(HintCode.STRICT_RAW_TYPE, node, [type]);
+    }
+  }
+
+  /// Checks a type annotation for a raw generic type, and reports the
+  /// appropriate error if [AnalysisOptionsImpl.strictRawTypes] is set.
+  ///
+  /// This checks if [node] refers to a generic type and does not have explicit
+  /// or inferred type arguments. When that happens, it reports error code
+  /// [StrongModeCode.STRICT_RAW_TYPE].
+  void _checkForRawTypeName(TypeName node) {
+    if (!_options.strictRawTypes || node == null) return;
+    if (node.typeArguments != null) {
+      // Type has explicit type arguments.
+      return;
+    }
+    var parent = node.parent;
+    InstanceCreationExpression inferenceContextNode;
+    if (parent is ConstructorName) {
+      var grandparent = parent.parent;
+      if (grandparent is InstanceCreationExpression) {
+        inferenceContextNode = grandparent;
+      }
+    }
+    return _checkForRawTypeErrors(
+        node, node.type, node.name.staticElement, inferenceContextNode);
+  }
+
   /**
    * Check whether the given constructor [declaration] is the redirecting
    * generative constructor and references itself directly or indirectly. The
@@ -5374,6 +5475,7 @@
    * See [CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE], and
    * [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE].
    */
+  @deprecated
   void _checkForSetElementTypeNotAssignable(SetLiteral literal) {
     // Determine the list's element type. We base this on the static type and
     // not the literal's type arguments because in strong mode, the type
@@ -5386,7 +5488,7 @@
 
     DartType setElementType = typeArguments[0];
 
-    // Check every list element.
+    // Check every set element.
     bool isConst = literal.isConst;
     for (Expression element in literal.elements) {
       if (isConst) {
@@ -5409,31 +5511,37 @@
    * See [CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE], and
    * [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE].
    */
-  void _checkForSetElementTypeNotAssignable2(SetLiteral2 literal) {
-    // Determine the list's element type. We base this on the static type and
+  void _checkForSetElementTypeNotAssignable3(SetOrMapLiteral literal) {
+    // Determine the set's element type. We base this on the static type and
     // not the literal's type arguments because in strong mode, the type
     // arguments may be inferred.
     DartType setType = literal.staticType;
     assert(setType is InterfaceTypeImpl);
 
     List<DartType> typeArguments = (setType as InterfaceTypeImpl).typeArguments;
-    assert(typeArguments.length == 1);
+    // It is possible for the number of type arguments to be inconsistent when
+    // the literal is ambiguous and a non-set type was selected.
+    // TODO(brianwilkerson) Unify this and _checkForMapTypeNotAssignable3 to
+    //  better handle recovery situations.
+    if (typeArguments.length == 1) {
+      DartType setElementType = typeArguments[0];
 
-    DartType setElementType = typeArguments[0];
-
-    // Check every list element.
-    bool isConst = literal.isConst;
-    for (CollectionElement element in literal.elements) {
-      if (isConst) {
-        // TODO(paulberry): this error should be based on the actual type of the
-        // element, not the static type.  See dartbug.com/21119.
-        _checkForCollectionElementTypeNotAssignableWithElementType(
-            element,
-            setElementType,
-            CheckedModeCompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE);
-      } else {
-        _checkForCollectionElementTypeNotAssignableWithElementType(element,
-            setElementType, StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE);
+      // Check every set element.
+      bool isConst = literal.isConst;
+      for (CollectionElement element in literal.elements2) {
+        if (isConst) {
+          // TODO(paulberry): this error should be based on the actual type of
+          //  the element, not the static type.  See dartbug.com/21119.
+          _checkForCollectionElementTypeNotAssignableWithElementType(
+              element,
+              setElementType,
+              CheckedModeCompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE);
+        } else {
+          _checkForCollectionElementTypeNotAssignableWithElementType(
+              element,
+              setElementType,
+              StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE);
+        }
       }
     }
   }
@@ -5721,6 +5829,19 @@
     }
   }
 
+  void _checkForUnnecessaryNullAware(Expression target, Token operator) {
+    if (operator.type != TokenType.QUESTION_PERIOD || !_isNonNullable) {
+      return;
+    }
+
+    if (target.staticType != null &&
+        (target.staticType as TypeImpl).nullability ==
+            Nullability.nonNullable) {
+      _errorReporter.reportErrorForToken(
+          HintCode.UNNECESSARY_NULL_AWARE_CALL, operator, []);
+    }
+  }
+
   /**
    * Check that if the given [name] is a reference to a static member it is
    * defined in the enclosing class rather than in a superclass.
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 9ea56c4..5ecd8d4 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -225,6 +225,14 @@
   @deprecated
   void set enableAssertInitializer(bool enable) {}
 
+  /// Enables or disables parsing of control flow collections.
+  void set enableControlFlowCollections(bool value) {
+    if (value) {
+      throw new UnimplementedError('control_flow_collections experiment'
+          ' not supported by analyzer parser');
+    }
+  }
+
   /// Enables or disables non-nullable by default.
   void set enableNonNullable(bool value) {
     if (value) {
@@ -245,10 +253,8 @@
 
   /// Enables or disables parsing of set literals.
   void set enableSetLiterals(bool value) {
-    if (value) {
-      throw new UnimplementedError(
-          'set-literal experiment not supported by analyzer parser');
-    }
+    // TODO(danrubel): Remove this method once the reference to this flag
+    // has been removed from dartfmt.
   }
 
   /// Enables or disables parsing of spread collections.
@@ -259,14 +265,6 @@
     }
   }
 
-  /// Enables or disables parsing of control flow collections.
-  void set enableControlFlowCollections(bool value) {
-    if (value) {
-      throw new UnimplementedError('control_flow_collections experiment'
-          ' not supported by analyzer parser');
-    }
-  }
-
   /// Return `true` if the parser is to allow URI's in part-of directives.
   @deprecated
   bool get enableUriInPartOf => true;
@@ -2952,26 +2950,24 @@
           Expression iterator = parseExpression2();
           Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
           Statement body = parseStatement2();
+          ForLoopParts forLoopParts;
           if (loopVariable == null) {
-            return astFactory.forEachStatementWithReference(
-                awaitKeyword,
-                forKeyword,
-                leftParenthesis,
-                identifier,
-                inKeyword,
-                iterator,
-                rightParenthesis,
-                body);
+            forLoopParts = astFactory.forEachPartsWithIdentifier(
+                identifier: identifier,
+                inKeyword: inKeyword,
+                iterable: iterator);
+          } else {
+            forLoopParts = astFactory.forEachPartsWithDeclaration(
+                loopVariable: loopVariable,
+                inKeyword: inKeyword,
+                iterable: iterator);
           }
-          return astFactory.forEachStatementWithDeclaration(
-              awaitKeyword,
-              forKeyword,
-              leftParenthesis,
-              loopVariable,
-              inKeyword,
-              iterator,
-              rightParenthesis,
-              body);
+          return astFactory.forStatement2(
+              forKeyword: forKeyword,
+              leftParenthesis: leftParenthesis,
+              forLoopParts: forLoopParts,
+              rightParenthesis: rightParenthesis,
+              body: body);
         }
       }
       if (awaitKeyword != null) {
@@ -2988,19 +2984,30 @@
       if (!_matches(TokenType.CLOSE_PAREN)) {
         updaters = parseExpressionList();
       }
+      ForLoopParts forLoopParts;
+      if (variableList != null) {
+        forLoopParts = astFactory.forPartsWithDeclarations(
+            variables: variableList,
+            leftSeparator: leftSeparator,
+            condition: condition,
+            rightSeparator: rightSeparator,
+            updaters: updaters);
+      } else {
+        forLoopParts = astFactory.forPartsWithExpression(
+            initialization: initialization,
+            leftSeparator: leftSeparator,
+            condition: condition,
+            rightSeparator: rightSeparator,
+            updaters: updaters);
+      }
       Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
       Statement body = parseStatement2();
-      return astFactory.forStatement(
-          forKeyword,
-          leftParenthesis,
-          variableList,
-          initialization,
-          leftSeparator,
-          condition,
-          rightSeparator,
-          updaters,
-          rightParenthesis,
-          body);
+      return astFactory.forStatement2(
+          forKeyword: forKeyword,
+          leftParenthesis: leftParenthesis,
+          forLoopParts: forLoopParts,
+          rightParenthesis: rightParenthesis,
+          body: body);
     } finally {
       _inLoop = wasInLoop;
     }
@@ -3668,9 +3675,11 @@
   ///
   ///     mapLiteral ::=
   ///         'const'? typeArguments? '{' (mapLiteralEntry (',' mapLiteralEntry)* ','?)? '}'
-  MapLiteral parseMapLiteral(Token modifier, TypeArgumentList typeArguments) {
+  MapLiteral // ignore: deprecated_member_use_from_same_package
+      parseMapLiteral(Token modifier, TypeArgumentList typeArguments) {
     Token leftBracket = getAndAdvance();
     if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+      // ignore: deprecated_member_use_from_same_package
       return astFactory.mapLiteral(
           modifier, typeArguments, leftBracket, null, getAndAdvance());
     }
@@ -3680,12 +3689,14 @@
       List<MapLiteralEntry> entries = <MapLiteralEntry>[parseMapLiteralEntry()];
       while (_optional(TokenType.COMMA)) {
         if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+          // ignore: deprecated_member_use_from_same_package
           return astFactory.mapLiteral(
               modifier, typeArguments, leftBracket, entries, getAndAdvance());
         }
         entries.add(parseMapLiteralEntry());
       }
       Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
+      // ignore: deprecated_member_use_from_same_package
       return astFactory.mapLiteral(
           modifier, typeArguments, leftBracket, entries, rightBracket);
     } finally {
@@ -4021,6 +4032,7 @@
         _tokenMatchesKeyword(_peek(), Keyword.FOR)) {
       Token awaitToken = _currentToken;
       Statement statement = parseForStatement();
+      // ignore: deprecated_member_use_from_same_package
       if (statement is! ForStatement) {
         _reportErrorForToken(
             CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT, awaitToken);
diff --git a/pkg/analyzer/lib/src/generated/parser_fasta.dart b/pkg/analyzer/lib/src/generated/parser_fasta.dart
index 62e616e..b93eb52 100644
--- a/pkg/analyzer/lib/src/generated/parser_fasta.dart
+++ b/pkg/analyzer/lib/src/generated/parser_fasta.dart
@@ -27,7 +27,6 @@
       {bool allowNativeClause: false})
       : fastaParser = new fasta.Parser(null),
         astBuilder = new AstBuilder(errorReporter, fileUri, true) {
-    fastaParser.enableSetLiterals = IsEnabledByDefault.set_literals;
     fastaParser.listener = astBuilder;
     astBuilder.parser = fastaParser;
     astBuilder.allowNativeClause = allowNativeClause;
@@ -55,11 +54,8 @@
 
   @override
   void set enableSetLiterals(bool value) {
-    if (IsExpired.set_literals && value != IsEnabledByDefault.set_literals) {
-      throw new StateError(
-          'set_literals may only be set to ${IsEnabledByDefault.set_literals}');
-    }
-    fastaParser.enableSetLiterals = value;
+    // TODO(danrubel): Remove this method once the reference to this flag
+    // has been removed from dartfmt.
   }
 
   @override
@@ -189,8 +185,6 @@
     currentToken = fastaParser.parseUnit(currentToken);
     CompilationUnitImpl compilationUnit = astBuilder.pop();
     compilationUnit.localDeclarations = astBuilder.localDeclarations;
-    compilationUnit.hasPragmaAnalyzerNonNullable =
-        astBuilder.hasPragmaAnalyzerNonNullable;
     return compilationUnit;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index e10c1fd..7891289 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -36,6 +36,7 @@
 import 'package:analyzer/src/generated/type_system.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
+import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
 export 'package:analyzer/src/dart/constant/constant_verifier.dart';
@@ -764,6 +765,8 @@
         if (!element.displayName.isEmpty) {
           displayName = "$displayName.${element.displayName}";
         }
+      } else if (element is LibraryElement) {
+        displayName = element.definingCompilationUnit.source.uri.toString();
       } else if (displayName == FunctionElement.CALL_METHOD_NAME &&
           node is MethodInvocation &&
           node.staticInvokeType is InterfaceType) {
@@ -1130,6 +1133,9 @@
 
     // NULL_AWARE_IN_CONDITION
     if (parent is IfStatement && parent.condition == childOfParent ||
+        parent is ForPartsWithDeclarations &&
+            parent.condition == childOfParent ||
+        // ignore: deprecated_member_use_from_same_package
         parent is ForStatement && parent.condition == childOfParent ||
         parent is DoStatement && parent.condition == childOfParent ||
         parent is WhileStatement && parent.condition == childOfParent ||
@@ -1472,17 +1478,32 @@
   /// The object used to track the usage of labels within a given label scope.
   _LabelTracker labelTracker;
 
+  /// Is `true` if this unit has been parsed as non-nullable.
+  final bool _isNonNullableUnit;
+
   /// Initialize a newly created dead code verifier that will report dead code
   /// to the given [errorReporter] and will use the given [typeSystem] if one is
   /// provided.
-  DeadCodeVerifier(this._errorReporter, {TypeSystem typeSystem})
+  DeadCodeVerifier(this._errorReporter, this._isNonNullableUnit,
+      {TypeSystem typeSystem})
       : this._typeSystem = typeSystem ?? new Dart2TypeSystem(null);
 
   @override
+  void visitAssignmentExpression(AssignmentExpression node) {
+    TokenType operatorType = node.operator.type;
+    if (operatorType == TokenType.QUESTION_QUESTION_EQ) {
+      _checkForDeadNullCoalesce(
+          node.leftHandSide.staticType, node.rightHandSide);
+    }
+    super.visitAssignmentExpression(node);
+  }
+
+  @override
   void visitBinaryExpression(BinaryExpression node) {
     Token operator = node.operator;
     bool isAmpAmp = operator.type == TokenType.AMPERSAND_AMPERSAND;
     bool isBarBar = operator.type == TokenType.BAR_BAR;
+    bool isQuestionQuestion = operator.type == TokenType.QUESTION_QUESTION;
     if (isAmpAmp || isBarBar) {
       Expression lhsCondition = node.leftOperand;
       if (!_isDebugConstant(lhsCondition)) {
@@ -1525,6 +1546,8 @@
 //                return null;
 //              }
 //            }
+    } else if (isQuestionQuestion && _isNonNullableUnit) {
+      _checkForDeadNullCoalesce(node.leftOperand.staticType, node.rightOperand);
     }
     super.visitBinaryExpression(node);
   }
@@ -1811,6 +1834,12 @@
     }
   }
 
+  void _checkForDeadNullCoalesce(TypeImpl lhsType, Expression rhs) {
+    if (lhsType.nullability == Nullability.nonNullable) {
+      _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, rhs, []);
+    }
+  }
+
   /// Given some list of [statements], loop through the list searching for dead
   /// statements. If [allowMandated] is true, then allow dead statements that
   /// are mandated by the language spec. This allows for a final break,
@@ -1862,6 +1891,7 @@
             new DartObjectImpl(null, BoolState.from(false)));
       }
     }
+
     // Don't consider situations where we could evaluate to a constant boolean
     // expression with the ConstantVisitor
     // else {
@@ -4298,6 +4328,7 @@
   }
 
   @override
+  @deprecated
   void visitForEachStatementInScope(ForEachStatement node) {
     Expression iterable = node.iterable;
     DeclaredIdentifier loopVariable = node.loopVariable;
@@ -4454,6 +4485,7 @@
   }
 
   @override
+  @deprecated
   void visitForStatementInScope(ForStatement node) {
     node.variables?.accept(this);
     node.initialization?.accept(this);
@@ -4636,22 +4668,26 @@
 
   @override
   void visitListLiteral(ListLiteral node) {
-    InterfaceType listT;
+    InterfaceType listType;
 
-    if (node.typeArguments != null) {
-      var targs = node.typeArguments.arguments.map((t) => t.type).toList();
-      if (targs.length == 1 && !targs[0].isDynamic) {
-        listT = typeProvider.listType.instantiate([targs[0]]);
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments != null) {
+      if (typeArguments.arguments.length == 1) {
+        DartType elementType = typeArguments.arguments[0].type;
+        if (!elementType.isDynamic) {
+          listType = typeProvider.listType.instantiate([elementType]);
+        }
       }
     } else {
-      listT = typeAnalyzer.inferListType(node, downwards: true);
+      listType = typeAnalyzer.inferListType(node, downwards: true);
     }
-    if (listT != null) {
-      DartType eType = listT.typeArguments[0];
-      for (Expression child in node.elements) {
-        InferenceContext.setType(child, eType);
-      }
-      InferenceContext.setType(node, listT);
+    if (listType != null) {
+      DartType elementType = listType.typeArguments[0];
+      DartType iterableType =
+          typeProvider.iterableType.instantiate([elementType]);
+      _pushCollectionTypesDownToAll(node.elements2,
+          elementType: elementType, iterableType: iterableType);
+      InferenceContext.setType(node, listType);
     } else {
       InferenceContext.clearType(node);
     }
@@ -4659,29 +4695,7 @@
   }
 
   @override
-  void visitListLiteral2(ListLiteral2 node) {
-    InterfaceType listT;
-
-    if (node.typeArguments != null) {
-      var targs = node.typeArguments.arguments.map((t) => t.type).toList();
-      if (targs.length == 1 && !targs[0].isDynamic) {
-        listT = typeProvider.listType.instantiate([targs[0]]);
-      }
-    } else {
-      listT = typeAnalyzer.inferListType2(node, downwards: true);
-    }
-    if (listT != null) {
-      for (CollectionElement element in node.elements) {
-        _pushCollectionTypesDown(element, listT);
-      }
-      InferenceContext.setType(node, listT);
-    } else {
-      InferenceContext.clearType(node);
-    }
-    super.visitListLiteral2(node);
-  }
-
-  @override
+  @deprecated
   void visitMapLiteral(MapLiteral node) {
     InterfaceType mapT;
     if (node.typeArguments != null) {
@@ -4712,55 +4726,7 @@
     } else {
       InferenceContext.clearType(node);
     }
-    super.visitMapLiteral(node);
-  }
-
-  @override
-  void visitMapLiteral2(MapLiteral2 node) {
-    InterfaceType mapT;
-    if (node.typeArguments != null) {
-      var targs = node.typeArguments.arguments.map((t) => t.type).toList();
-      if (targs.length == 2 && targs.any((t) => !t.isDynamic)) {
-        mapT = typeProvider.mapType.instantiate([targs[0], targs[1]]);
-      }
-    } else {
-      mapT = typeAnalyzer.inferMapType2(node, downwards: true);
-      if (mapT != null &&
-          node.typeArguments == null &&
-          node.entries.isEmpty &&
-          typeSystem.isAssignableTo(typeProvider.iterableObjectType, mapT) &&
-          !typeSystem.isAssignableTo(typeProvider.mapObjectObjectType, mapT)) {
-        // The node is really an empty set literal with no type arguments, so
-        // don't try to visit the replaced map literal.
-        return;
-      }
-    }
-    if (mapT != null) {
-      DartType kType = mapT.typeArguments[0];
-      DartType vType = mapT.typeArguments[1];
-
-      void pushTypesDown(CollectionElement element) {
-        if (element is ForElement) {
-          pushTypesDown(element.body);
-        } else if (element is IfElement) {
-          pushTypesDown(element.thenElement);
-          pushTypesDown(element.elseElement);
-        } else if (element is MapLiteralEntry) {
-          InferenceContext.setType(element.key, kType);
-          InferenceContext.setType(element.value, vType);
-        } else if (element is SpreadElement) {
-          InferenceContext.setType(element.expression, mapT);
-        }
-      }
-
-      for (CollectionElement element in node.entries) {
-        pushTypesDown(element);
-      }
-      InferenceContext.setType(node, mapT);
-    } else {
-      InferenceContext.clearType(node);
-    }
-    super.visitMapLiteral2(node);
+    visitNode(node);
   }
 
   @override
@@ -4897,6 +4863,7 @@
   }
 
   @override
+  @deprecated
   void visitSetLiteral(SetLiteral node) {
     InterfaceType setT;
 
@@ -4920,33 +4887,33 @@
     } else {
       InferenceContext.clearType(node);
     }
-    super.visitSetLiteral(node);
+    visitNode(node);
   }
 
   @override
-  void visitSetLiteral2(SetLiteral2 node) {
-    InterfaceType setT;
-
-    TypeArgumentList typeArguments = node.typeArguments;
-    if (typeArguments != null) {
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
+    DartType literalType = _computeContextType(node);
+    // TODO(brianwilkerson) Determine whether we need special handling for type
+    // parameter types. (E-mail sent.)
+    if (literalType is InterfaceType) {
+      List<DartType> typeArguments = literalType.typeArguments;
       if (typeArguments.length == 1) {
-        DartType elementType = typeArguments.arguments[0].type;
-        if (!elementType.isDynamic) {
-          setT = typeProvider.setType.instantiate([elementType]);
-        }
+        DartType elementType = literalType.typeArguments[0];
+        DartType iterableType =
+            typeProvider.iterableType.instantiate([elementType]);
+        _pushCollectionTypesDownToAll(node.elements2,
+            elementType: elementType, iterableType: iterableType);
+      } else if (typeArguments.length == 2) {
+        DartType keyType = typeArguments[0];
+        DartType valueType = typeArguments[1];
+        _pushCollectionTypesDownToAll(node.elements2,
+            iterableType: literalType, keyType: keyType, valueType: valueType);
       }
-    } else {
-      setT = typeAnalyzer.inferSetType2(node, downwards: true);
-    }
-    if (setT != null) {
-      for (CollectionElement element in node.elements) {
-        _pushCollectionTypesDown(element, setT);
-      }
-      InferenceContext.setType(node, setT);
+      InferenceContext.setType(node, literalType);
     } else {
       InferenceContext.clearType(node);
     }
-    super.visitSetLiteral2(node);
+    super.visitSetOrMapLiteral(node);
   }
 
   @override
@@ -5109,6 +5076,59 @@
     }
   }
 
+  /// Compute the context type for the given set or map [literal].
+  DartType _computeContextType(SetOrMapLiteral literal) {
+    _LiteralResolution typeArgumentsResolution =
+        _fromTypeArguments(literal.typeArguments);
+    DartType contextType = InferenceContext.getContext(literal);
+    _LiteralResolution contextResolution = _fromContextType(contextType);
+    _LeafElements elementCounts = new _LeafElements(literal.elements2);
+    _LiteralResolution elementResolution = elementCounts.resolution;
+
+    List<_LiteralResolution> unambiguousResolutions = [];
+    Set<_LiteralResolutionKind> kinds = new Set<_LiteralResolutionKind>();
+    if (typeArgumentsResolution.kind != _LiteralResolutionKind.ambiguous) {
+      unambiguousResolutions.add(typeArgumentsResolution);
+      kinds.add(typeArgumentsResolution.kind);
+    }
+    if (contextResolution.kind != _LiteralResolutionKind.ambiguous) {
+      unambiguousResolutions.add(contextResolution);
+      kinds.add(contextResolution.kind);
+    }
+    if (elementResolution.kind != _LiteralResolutionKind.ambiguous) {
+      unambiguousResolutions.add(elementResolution);
+      kinds.add(elementResolution.kind);
+    }
+
+    if (kinds.length == 2) {
+      // It looks like it needs to be both a map and a set. Attempt to recover.
+      if (elementResolution.kind == _LiteralResolutionKind.ambiguous &&
+          elementResolution.contextType != null) {
+        return elementResolution.contextType;
+      } else if (typeArgumentsResolution.kind !=
+              _LiteralResolutionKind.ambiguous &&
+          typeArgumentsResolution.contextType != null) {
+        return typeArgumentsResolution.contextType;
+      } else if (contextResolution.kind != _LiteralResolutionKind.ambiguous &&
+          contextResolution.contextType != null) {
+        return contextResolution.contextType;
+      }
+    } else if (unambiguousResolutions.length >= 2) {
+      // If there are three resolutions, the last resolution is guaranteed to be
+      // from the elements, which always has a context type of `null` (when it
+      // is not ambiguous). So, whether there are 2 or 3 resolutions only the
+      // first two are potentially interesting.
+      return unambiguousResolutions[0].contextType ??
+          unambiguousResolutions[1].contextType;
+    } else if (unambiguousResolutions.length == 1) {
+      return unambiguousResolutions[0].contextType;
+    } else if (literal.elements2.isEmpty) {
+      return typeProvider.mapType
+          .instantiate([typeProvider.dynamicType, typeProvider.dynamicType]);
+    }
+    return null;
+  }
+
   /// Given the declared return type of a function, compute the type of the
   /// values which should be returned or yielded as appropriate.  If a type
   /// cannot be computed from the declared return type, return null.
@@ -5155,6 +5175,61 @@
     return typeProvider.futureOrType.instantiate([type]);
   }
 
+  /// If [contextType] is defined and is a subtype of `Iterable<Object>` and
+  /// [contextType] is not a subtype of `Map<Object, Object>`, then *e* is a set
+  /// literal.
+  ///
+  /// If [contextType] is defined and is a subtype of `Map<Object, Object>` and
+  /// [contextType] is not a subtype of `Iterable<Object>` then *e* is a map
+  /// literal.
+  _LiteralResolution _fromContextType(DartType contextType) {
+    if (contextType != null) {
+      DartType unwrap(DartType type) {
+        if (type is InterfaceType &&
+            type.isDartAsyncFutureOr &&
+            type.typeArguments.length == 1) {
+          return unwrap(type.typeArguments[0]);
+        }
+        return type;
+      }
+
+      DartType unwrappedContextType = unwrap(contextType);
+      // TODO(brianwilkerson) Find out what the "greatest closure" is and use that
+      // where [unwrappedContextType] is used below.
+      if (typeSystem.isAssignableTo(
+              typeProvider.iterableObjectType, unwrappedContextType) &&
+          !typeSystem.isAssignableTo(
+              typeProvider.mapObjectObjectType, unwrappedContextType)) {
+        return _LiteralResolution(
+            _LiteralResolutionKind.set, unwrappedContextType);
+      } else if (typeSystem.isAssignableTo(
+              typeProvider.mapObjectObjectType, unwrappedContextType) &&
+          !typeSystem.isAssignableTo(
+              typeProvider.iterableObjectType, unwrappedContextType)) {
+        return _LiteralResolution(
+            _LiteralResolutionKind.map, unwrappedContextType);
+      }
+    }
+    return _LiteralResolution(_LiteralResolutionKind.ambiguous, null);
+  }
+
+  /// Return the resolution that is indicated by the given [typeArgumentList].
+  _LiteralResolution _fromTypeArguments(TypeArgumentList typeArgumentList) {
+    if (typeArgumentList != null) {
+      NodeList<TypeAnnotation> arguments = typeArgumentList.arguments;
+      if (arguments.length == 1) {
+        return _LiteralResolution(_LiteralResolutionKind.set,
+            typeProvider.setType.instantiate([arguments[0].type]));
+      } else if (arguments.length == 2) {
+        return _LiteralResolution(
+            _LiteralResolutionKind.map,
+            typeProvider.mapType
+                .instantiate([arguments[0].type, arguments[1].type]));
+      }
+    }
+    return _LiteralResolution(_LiteralResolutionKind.ambiguous, null);
+  }
+
   /// Return `true` if the given [parameter] element of the AST being resolved
   /// is resynthesized and is an API-level, not local, so has its initializer
   /// serialized.
@@ -5361,17 +5436,50 @@
     }
   }
 
-  void _pushCollectionTypesDown(
-      CollectionElement element, ParameterizedType collectionType) {
+  void _pushCollectionTypesDown(CollectionElement element,
+      {DartType elementType,
+      @required DartType iterableType,
+      DartType keyType,
+      DartType valueType}) {
     if (element is ForElement) {
-      _pushCollectionTypesDown(element.body, collectionType);
+      _pushCollectionTypesDown(element.body,
+          elementType: elementType,
+          iterableType: iterableType,
+          keyType: keyType,
+          valueType: valueType);
     } else if (element is IfElement) {
-      _pushCollectionTypesDown(element.thenElement, collectionType);
-      _pushCollectionTypesDown(element.elseElement, collectionType);
+      _pushCollectionTypesDown(element.thenElement,
+          elementType: elementType,
+          iterableType: iterableType,
+          keyType: keyType,
+          valueType: valueType);
+      _pushCollectionTypesDown(element.elseElement,
+          elementType: elementType,
+          iterableType: iterableType,
+          keyType: keyType,
+          valueType: valueType);
     } else if (element is Expression) {
-      InferenceContext.setType(element, collectionType.typeArguments[0]);
+      InferenceContext.setType(element, elementType);
+    } else if (element is MapLiteralEntry) {
+      InferenceContext.setType(element.key, keyType);
+      InferenceContext.setType(element.value, valueType);
     } else if (element is SpreadElement) {
-      InferenceContext.setType(element.expression, collectionType);
+      InferenceContext.setType(element.expression, iterableType);
+    }
+  }
+
+  void _pushCollectionTypesDownToAll(List<CollectionElement> elements,
+      {DartType elementType,
+      @required DartType iterableType,
+      DartType keyType,
+      DartType valueType}) {
+    assert(iterableType != null);
+    for (CollectionElement element in elements) {
+      _pushCollectionTypesDown(element,
+          elementType: elementType,
+          iterableType: iterableType,
+          keyType: keyType,
+          valueType: valueType);
     }
   }
 
@@ -5763,6 +5871,7 @@
   }
 
   @override
+  @deprecated
   void visitForEachStatement(ForEachStatement node) {
     Scope outerNameScope = nameScope;
     ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
@@ -5781,6 +5890,7 @@
   /// intervene when type propagation is enabled.
   ///
   /// @param node the statement to be visited
+  @deprecated
   void visitForEachStatementInScope(ForEachStatement node) {
     //
     // We visit the iterator before the loop variable because the loop variable
@@ -5809,6 +5919,7 @@
   }
 
   @override
+  @deprecated
   void visitForStatement(ForStatement node) {
     Scope outerNameScope = nameScope;
     ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
@@ -5851,6 +5962,7 @@
   /// intervene when type propagation is enabled.
   ///
   /// @param node the statement to be visited
+  @deprecated
   void visitForStatementInScope(ForStatement node) {
     node.variables?.accept(this);
     node.initialization?.accept(this);
@@ -6256,7 +6368,7 @@
   final TypeSystem typeSystem;
   final DartType dynamicType;
   final DartType undefinedType;
-  final bool isNonNullableMigrated;
+  final bool isNonNullableUnit;
   final AnalysisOptionsImpl analysisOptions;
   final LibraryElement definingLibrary;
   final Source source;
@@ -6274,7 +6386,7 @@
   TypeNameResolver(
       this.typeSystem,
       TypeProvider typeProvider,
-      this.isNonNullableMigrated,
+      this.isNonNullableUnit,
       this.definingLibrary,
       this.source,
       this.errorListener,
@@ -6641,13 +6753,11 @@
 
   Nullability _getNullability(bool hasQuestion) {
     Nullability nullability;
-    if (analysisOptions.experimentStatus.non_nullable) {
+    if (isNonNullableUnit) {
       if (hasQuestion) {
         nullability = Nullability.nullable;
-      } else if (isNonNullableMigrated) {
-        nullability = Nullability.nonNullable;
       } else {
-        nullability = Nullability.indeterminate;
+        nullability = Nullability.nonNullable;
       }
     } else {
       nullability = Nullability.indeterminate;
@@ -6914,12 +7024,12 @@
 
   TypeParameterBoundsResolver(
       this.typeSystem, this.library, this.source, this.errorListener,
-      {bool isNonNullableMigrated = false})
+      {bool isNonNullableUnit = false})
       : libraryScope = new LibraryScope(library),
         typeNameResolver = new TypeNameResolver(
             typeSystem,
             typeSystem.typeProvider,
-            isNonNullableMigrated,
+            isNonNullableUnit,
             library,
             source,
             errorListener);
@@ -7566,8 +7676,8 @@
   /// Type type system in use for this resolver pass.
   TypeSystem _typeSystem;
 
-  /// Whether the library migrated to non-nullable.
-  final bool isNonNullableMigrated;
+  /// Whether the compilation unit is non-nullable.
+  final bool isNonNullableUnit;
 
   /// The helper to resolve types.
   TypeNameResolver _typeNameResolver;
@@ -7604,7 +7714,7 @@
   TypeResolverVisitor(LibraryElement definingLibrary, Source source,
       TypeProvider typeProvider, AnalysisErrorListener errorListener,
       {Scope nameScope,
-      this.isNonNullableMigrated: false,
+      this.isNonNullableUnit: false,
       this.mode: TypeResolverMode.everything,
       bool shouldUseWithClauseInferredTypes: true,
       this.shouldSetElementSupertypes: false})
@@ -7614,7 +7724,7 @@
     _undefinedType = typeProvider.undefinedType;
     _typeSystem = TypeSystem.create(definingLibrary.context);
     _typeNameResolver = new TypeNameResolver(_typeSystem, typeProvider,
-        isNonNullableMigrated, definingLibrary, source, errorListener,
+        isNonNullableUnit, definingLibrary, source, errorListener,
         shouldUseWithClauseInferredTypes: shouldUseWithClauseInferredTypes);
   }
 
@@ -8559,6 +8669,12 @@
   }
 
   @override
+  void visitCompilationUnit(CompilationUnit node) {
+    _localVariableInfo = (node as CompilationUnitImpl).localVariableInfo;
+    super.visitCompilationUnit(node);
+  }
+
+  @override
   void visitConstructorDeclaration(ConstructorDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     LocalVariableInfo outerLocalVariableInfo = _localVariableInfo;
@@ -8899,6 +9015,88 @@
   }
 }
 
+/// A set of counts of the kinds of leaf elements in a collection, used to help
+/// disambiguate map and set literals.
+class _LeafElements {
+  /// The number of expressions found in the collection.
+  int expressionCount = 0;
+
+  /// The number of map entries found in the collection.
+  int mapEntryCount = 0;
+
+  /// Initialize a newly created set of counts based on the given collection
+  /// [elements].
+  _LeafElements(List<CollectionElement> elements) {
+    for (CollectionElement element in elements) {
+      _count(element);
+    }
+  }
+
+  /// Return the resolution suggested by the set elements.
+  _LiteralResolution get resolution {
+    if (expressionCount > 0 && mapEntryCount == 0) {
+      return _LiteralResolution(_LiteralResolutionKind.set, null);
+    } else if (mapEntryCount > 0 && expressionCount == 0) {
+      return _LiteralResolution(_LiteralResolutionKind.map, null);
+    }
+    return _LiteralResolution(_LiteralResolutionKind.ambiguous, null);
+  }
+
+  /// Recursively add the given collection [element] to the counts.
+  void _count(CollectionElement element) {
+    if (element is ForElement) {
+      _count(element.body);
+    } else if (element is IfElement) {
+      _count(element.thenElement);
+      _count(element.elseElement);
+    } else if (element is Expression) {
+      if (_isComplete(element)) {
+        expressionCount++;
+      }
+    } else if (element is MapLiteralEntry) {
+      if (_isComplete(element)) {
+        mapEntryCount++;
+      }
+    }
+  }
+
+  /// Return `true` if the given collection [element] does not contain any
+  /// synthetic tokens.
+  bool _isComplete(CollectionElement element) {
+    Token token = element.beginToken;
+    int endOffset = element.endToken.offset;
+    while (token != null && token.offset <= endOffset) {
+      if (token.isSynthetic) {
+        return false;
+      }
+      token = token.next;
+    }
+    return true;
+  }
+}
+
+/// An indication of the way in which a set or map literal should be resolved to
+/// be either a set literal or a map literal.
+class _LiteralResolution {
+  /// The kind of collection that the literal should be.
+  final _LiteralResolutionKind kind;
+
+  /// The type that should be used as the inference context when performing type
+  /// inference for the literal.
+  DartType contextType;
+
+  /// Initialize a newly created resolution.
+  _LiteralResolution(this.kind, this.contextType);
+
+  @override
+  String toString() {
+    return '$kind ($contextType)';
+  }
+}
+
+/// The kind of literal to which an unknown literal should be resolved.
+enum _LiteralResolutionKind { ambiguous, map, set }
+
 class _ResolverVisitor_isVariableAccessedInClosure
     extends RecursiveAstVisitor<void> {
   final Element variable;
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index c7ae2db..67dfd49 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -168,6 +168,21 @@
   List<String> get uris => _libraryMap.keys.toList();
 
   /**
+   * Return info for debugging https://github.com/dart-lang/sdk/issues/35226.
+   */
+  Map<String, Object> debugInfo() {
+    var map = <String, Object>{};
+    for (var uri in _libraryMap.keys) {
+      var lib = _libraryMap[uri];
+      map[uri] = <String, Object>{
+        'path': lib.path,
+        'shortName': lib.shortName,
+      };
+    }
+    return map;
+  }
+
+  /**
    * Return the library with the given 'dart:' [uri], or `null` if the URI does
    * not map to a library.
    */
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index 23871b8..66fe369 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -60,6 +60,11 @@
   ExperimentStatus _experimentStatus;
 
   /**
+   * True if inference failures should be reported, otherwise false.
+   */
+  bool _strictInference;
+
+  /**
    * The type representing the class containing the nodes being analyzed,
    * or `null` if the nodes are not within a class.
    */
@@ -80,9 +85,10 @@
     _typeSystem = _resolver.typeSystem;
     _dynamicType = _typeProvider.dynamicType;
     _promoteManager = _resolver.promoteManager;
-    _experimentStatus = (_resolver.definingLibrary.context.analysisOptions
-            as AnalysisOptionsImpl)
-        .experimentStatus;
+    AnalysisOptionsImpl analysisOptions =
+        _resolver.definingLibrary.context.analysisOptions;
+    _experimentStatus = analysisOptions.experimentStatus;
+    _strictInference = analysisOptions.strictInference;
   }
 
   /**
@@ -160,44 +166,11 @@
       if (contextType == null) {
         return null;
       }
-
       elementTypes = [];
       parameters = [];
     } else {
       // Also use upwards information to infer the type.
-      elementTypes = node.elements
-          .map((e) => e.staticType)
-          .where((t) => t != null)
-          .toList();
-      var listTypeParam = _typeProvider.listType.typeParameters[0].type;
-      var syntheticParamElement = new ParameterElementImpl.synthetic(
-          'element', listTypeParam, ParameterKind.POSITIONAL);
-      parameters = new List.filled(elementTypes.length, syntheticParamElement);
-    }
-    DartType inferred = ts.inferGenericFunctionOrType<InterfaceType>(
-        _typeProvider.listType, parameters, elementTypes, contextType,
-        downwards: downwards,
-        errorReporter: _resolver.errorReporter,
-        errorNode: node);
-    return inferred;
-  }
-
-  DartType inferListType2(ListLiteral2 node, {bool downwards: false}) {
-    DartType contextType = InferenceContext.getContext(node);
-
-    var ts = _typeSystem as Dart2TypeSystem;
-    List<DartType> elementTypes;
-    List<ParameterElement> parameters;
-
-    if (downwards) {
-      if (contextType == null) {
-        return null;
-      }
-      elementTypes = [];
-      parameters = [];
-    } else {
-      // Also use upwards information to infer the type.
-      elementTypes = node.elements
+      elementTypes = node.elements2
           .map((element) => _computeElementType(element))
           .where((t) => t != null)
           .toList();
@@ -216,6 +189,7 @@
     return inferred;
   }
 
+  @deprecated
   ParameterizedType inferMapType(MapLiteral node, {bool downwards: false}) {
     DartType contextType = InferenceContext.getContext(node);
     if (contextType != null && _experimentStatus.set_literals) {
@@ -281,73 +255,7 @@
     return inferred;
   }
 
-  ParameterizedType inferMapType2(MapLiteral2 node, {bool downwards: false}) {
-    DartType contextType = InferenceContext.getContext(node);
-    if (contextType != null && _experimentStatus.set_literals) {
-      DartType unwrap(DartType type) {
-        if (type is InterfaceType &&
-            type.isDartAsyncFutureOr &&
-            type.typeArguments.length == 1) {
-          return unwrap(type.typeArguments[0]);
-        }
-        return type;
-      }
-
-      DartType unwrappedContextType = unwrap(contextType);
-      if (node.typeArguments == null &&
-          node.entries.isEmpty &&
-          _typeSystem.isAssignableTo(
-              _typeProvider.iterableObjectType, unwrappedContextType) &&
-          !_typeSystem.isAssignableTo(
-              _typeProvider.mapObjectObjectType, unwrappedContextType)) {
-        // The node is really an empty set literal with no type arguments.
-        // Rewrite the AST and infer the type of the set as appropriate.
-        SetLiteral setLiteral = new AstFactoryImpl().setLiteral(
-            node.constKeyword, null, node.leftBracket, null, node.rightBracket);
-        InferenceContext.setType(setLiteral, contextType);
-        NodeReplacer.replace(node, setLiteral);
-        DartType type = inferSetType(setLiteral, downwards: downwards);
-        setLiteral.staticType = type;
-        return type;
-      }
-    }
-    List<DartType> elementTypes;
-    List<ParameterElement> parameters;
-    if (downwards) {
-      if (contextType == null) {
-        return null;
-      }
-      elementTypes = [];
-      parameters = [];
-    } else {
-      var keyTypes = node.entries
-          .map((entry) => _computeKeyType(entry))
-          .where((t) => t != null);
-      var valueTypes = node.entries
-          .map((entry) => _computeValueType(entry))
-          .where((t) => t != null);
-      var keyTypeParam = _typeProvider.mapType.typeParameters[0].type;
-      var valueTypeParam = _typeProvider.mapType.typeParameters[1].type;
-      var syntheticKeyParameter = new ParameterElementImpl.synthetic(
-          'key', keyTypeParam, ParameterKind.POSITIONAL);
-      var syntheticValueParameter = new ParameterElementImpl.synthetic(
-          'value', valueTypeParam, ParameterKind.POSITIONAL);
-      parameters = new List.filled(keyTypes.length, syntheticKeyParameter,
-          growable: true)
-        ..addAll(new List.filled(valueTypes.length, syntheticValueParameter));
-      elementTypes = new List<DartType>.from(keyTypes)..addAll(valueTypes);
-    }
-
-    // Use both downwards and upwards information to infer the type.
-    var ts = _typeSystem as Dart2TypeSystem;
-    ParameterizedType inferred = ts.inferGenericFunctionOrType(
-        _typeProvider.mapType, parameters, elementTypes, contextType,
-        downwards: downwards,
-        errorReporter: _resolver.errorReporter,
-        errorNode: node);
-    return inferred;
-  }
-
+  @deprecated
   DartType inferSetType(SetLiteral node, {bool downwards: false}) {
     DartType contextType = InferenceContext.getContext(node);
 
@@ -381,41 +289,6 @@
     return inferred;
   }
 
-  DartType inferSetType2(SetLiteral2 node, {bool downwards: false}) {
-    DartType contextType = InferenceContext.getContext(node);
-
-    var ts = _typeSystem as Dart2TypeSystem;
-    List<DartType> elementTypes;
-    List<ParameterElement> parameters;
-
-    if (downwards) {
-      if (contextType == null) {
-        return null;
-      }
-
-      elementTypes = [];
-      parameters = [];
-    } else {
-      // Also use upwards information to infer the type.
-      elementTypes = node.elements
-          .map((element) => _computeElementType(element))
-          .where((t) => t != null)
-          .toList();
-      TypeParameterType setTypeParam =
-          _typeProvider.setType.typeParameters[0].type;
-      ParameterElementImpl syntheticParamElement =
-          new ParameterElementImpl.synthetic(
-              'element', setTypeParam, ParameterKind.POSITIONAL);
-      parameters = new List.filled(elementTypes.length, syntheticParamElement);
-    }
-    DartType inferred = ts.inferGenericFunctionOrType<InterfaceType>(
-        _typeProvider.setType, parameters, elementTypes, contextType,
-        downwards: downwards,
-        errorReporter: _resolver.errorReporter,
-        errorNode: node);
-    return inferred;
-  }
-
   /**
    * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
    * `String`.</blockquote>
@@ -830,45 +703,6 @@
     _recordStaticType(node, listDynamicType);
   }
 
-  @override
-  void visitListLiteral2(ListLiteral2 node) {
-    TypeArgumentList typeArguments = node.typeArguments;
-
-    // If we have explicit arguments, use them
-    if (typeArguments != null) {
-      DartType staticType = _dynamicType;
-      NodeList<TypeAnnotation> arguments = typeArguments.arguments;
-      if (arguments != null && arguments.length == 1) {
-        DartType argumentType = _getType(arguments[0]);
-        if (argumentType != null) {
-          staticType = argumentType;
-        }
-      }
-      _recordStaticType(
-          node, _typeProvider.listType.instantiate(<DartType>[staticType]));
-      return;
-    }
-
-    DartType listDynamicType =
-        _typeProvider.listType.instantiate(<DartType>[_dynamicType]);
-
-    // If there are no type arguments, try to infer some arguments.
-    DartType inferred = inferListType2(node);
-
-    if (inferred != listDynamicType) {
-      // TODO(jmesserly): this results in an "inferred" message even when we
-      // in fact had an error above, because it will still attempt to return
-      // a type. Perhaps we should record inference from TypeSystem if
-      // everything was successful?
-      _resolver.inferenceContext.recordInference(node, inferred);
-      _recordStaticType(node, inferred);
-      return;
-    }
-
-    // If we have no type arguments and couldn't infer any, use dynamic.
-    _recordStaticType(node, listDynamicType);
-  }
-
   /**
    * The Dart Language Specification, 12.7: <blockquote>The static type of a map literal of the form
    * <i><b>const</b> &lt;K, V&gt; {k<sub>1</sub>:e<sub>1</sub>, &hellip;,
@@ -882,6 +716,7 @@
    * <i>String</i>.</blockquote>
    */
   @override
+  @deprecated
   void visitMapLiteral(MapLiteral node) {
     TypeArgumentList typeArguments = node.typeArguments;
 
@@ -927,52 +762,6 @@
     _recordStaticType(node, mapDynamicType);
   }
 
-  @override
-  void visitMapLiteral2(MapLiteral2 node) {
-    TypeArgumentList typeArguments = node.typeArguments;
-
-    // If we have type arguments, use them
-    if (typeArguments != null) {
-      DartType staticKeyType = _dynamicType;
-      DartType staticValueType = _dynamicType;
-      NodeList<TypeAnnotation> arguments = typeArguments.arguments;
-      if (arguments != null && arguments.length == 2) {
-        DartType entryKeyType = _getType(arguments[0]);
-        if (entryKeyType != null) {
-          staticKeyType = entryKeyType;
-        }
-        DartType entryValueType = _getType(arguments[1]);
-        if (entryValueType != null) {
-          staticValueType = entryValueType;
-        }
-      }
-      _recordStaticType(
-          node,
-          _typeProvider.mapType
-              .instantiate(<DartType>[staticKeyType, staticValueType]));
-      return;
-    }
-
-    DartType mapDynamicType = _typeProvider.mapType
-        .instantiate(<DartType>[_dynamicType, _dynamicType]);
-
-    // If we have no explicit type arguments, try to infer type arguments.
-    ParameterizedType inferred = inferMapType2(node);
-
-    if (inferred != mapDynamicType) {
-      // TODO(jmesserly): this results in an "inferred" message even when we
-      // in fact had an error above, because it will still attempt to return
-      // a type. Perhaps we should record inference from TypeSystem if
-      // everything was successful?
-      _resolver.inferenceContext.recordInference(node, inferred);
-      _recordStaticType(node, inferred);
-      return;
-    }
-
-    // If no type arguments and no inference, use dynamic
-    _recordStaticType(node, mapDynamicType);
-  }
-
   /**
    * The Dart Language Specification, 12.15.1: <blockquote>An ordinary method invocation <i>i</i>
    * has the form <i>o.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
@@ -1221,6 +1010,7 @@
   }
 
   @override
+  @deprecated
   void visitSetLiteral(SetLiteral node) {
     TypeArgumentList typeArguments = node.typeArguments;
 
@@ -1260,42 +1050,26 @@
   }
 
   @override
-  void visitSetLiteral2(SetLiteral2 node) {
-    TypeArgumentList typeArguments = node.typeArguments;
-
-    // If we have type arguments, use them
-    if (typeArguments != null) {
-      DartType elementType = _dynamicType;
-      NodeList<TypeAnnotation> arguments = typeArguments.arguments;
-      if (arguments != null && arguments.length == 1) {
-        DartType type = _getType(arguments[0]);
-        if (type != null) {
-          elementType = type;
-        }
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
+    DartType staticType = node.staticType;
+    if (staticType == null) {
+      DartType literalType = _inferSetOrMapLiteralType(node);
+      if (literalType.element == _typeProvider.mapType.element) {
+        (node as SetOrMapLiteralImpl).becomeMap();
+      } else {
+        assert(literalType.element == _typeProvider.setType.element);
+        (node as SetOrMapLiteralImpl).becomeSet();
       }
-      _recordStaticType(
-          node, _typeProvider.setType.instantiate(<DartType>[elementType]));
-      return;
+      _resolver.inferenceContext.recordInference(node, literalType);
+      _recordStaticType(node, literalType);
+    } else if (staticType is InterfaceType) {
+      List<DartType> typeArguments = staticType.typeArguments;
+      if (typeArguments.length == 1) {
+        (node as SetOrMapLiteralImpl).becomeSet();
+      } else if (typeArguments.length == 2) {
+        (node as SetOrMapLiteralImpl).becomeMap();
+      }
     }
-
-    DartType setDynamicType =
-        _typeProvider.setType.instantiate(<DartType>[_dynamicType]);
-
-    // If we have no explicit type arguments, try to infer type arguments.
-    ParameterizedType inferred = inferSetType2(node);
-
-    if (inferred != setDynamicType) {
-      // TODO(jmesserly): this results in an "inferred" message even when we
-      // in fact had an error above, because it will still attempt to return
-      // a type. Perhaps we should record inference from TypeSystem if
-      // everything was successful?
-      _resolver.inferenceContext.recordInference(node, inferred);
-      _recordStaticType(node, inferred);
-      return;
-    }
-
-    // If no type arguments and no inference, use dynamic
-    _recordStaticType(node, setDynamicType);
   }
 
   /**
@@ -1536,30 +1310,6 @@
     return _dynamicType;
   }
 
-  DartType _computeKeyType(CollectionElement element) {
-    if (element is ForElement) {
-      return _computeKeyType(element.body);
-    } else if (element is IfElement) {
-      DartType thenType = _computeKeyType(element.thenElement);
-      if (element.elseElement == null) {
-        return thenType;
-      }
-      DartType elseType = _computeKeyType(element.elseElement);
-      return _typeSystem.leastUpperBound(thenType, elseType);
-    } else if (element is MapLiteralEntry) {
-      return element.key.staticType;
-    } else if (element is SpreadElement) {
-      DartType collectionType = element.expression.staticType;
-      if (collectionType is ParameterizedType) {
-        List<DartType> typeArguments = collectionType.typeArguments;
-        if (typeArguments.length == 2) {
-          return typeArguments[0];
-        }
-      }
-    }
-    return null;
-  }
-
   /**
    * Given a function body and its return type, compute the return type of
    * the entire function, taking into account whether the function body
@@ -1626,30 +1376,6 @@
     return returnType.type;
   }
 
-  DartType _computeValueType(CollectionElement element) {
-    if (element is ForElement) {
-      return _computeValueType(element.body);
-    } else if (element is IfElement) {
-      DartType thenType = _computeValueType(element.thenElement);
-      if (element.elseElement == null) {
-        return thenType;
-      }
-      DartType elseType = _computeValueType(element.elseElement);
-      return _typeSystem.leastUpperBound(thenType, elseType);
-    } else if (element is MapLiteralEntry) {
-      return element.value.staticType;
-    } else if (element is SpreadElement) {
-      DartType collectionType = element.expression.staticType;
-      if (collectionType is ParameterizedType) {
-        List<DartType> typeArguments = collectionType.typeArguments;
-        if (typeArguments.length == 2) {
-          return typeArguments[1];
-        }
-      }
-    }
-    return null;
-  }
-
   DartType _findIteratedType(DartType type, DartType targetType) {
     // TODO(vsm): Use leafp's matchType here?
     // Set by _find if match is found
@@ -1813,6 +1539,92 @@
     return functionType.returnType;
   }
 
+  _InferredCollectionElementTypeInformation _inferCollectionElementType(
+      CollectionElement element) {
+    if (element is ForElement) {
+      return _inferCollectionElementType(element.body);
+    } else if (element is IfElement) {
+      _InferredCollectionElementTypeInformation thenType =
+          _inferCollectionElementType(element.thenElement);
+      if (element.elseElement == null) {
+        return thenType;
+      }
+      _InferredCollectionElementTypeInformation elseType =
+          _inferCollectionElementType(element.elseElement);
+      return _InferredCollectionElementTypeInformation.leastUpperBound(
+          _typeSystem, thenType, elseType);
+    } else if (element is Expression) {
+      return _InferredCollectionElementTypeInformation(
+          elementType: element.staticType, keyType: null, valueType: null);
+    } else if (element is MapLiteralEntry) {
+      return _InferredCollectionElementTypeInformation(
+          elementType: null,
+          keyType: element.key.staticType,
+          valueType: element.value.staticType);
+    } else if (element is SpreadElement) {
+      DartType expressionType = element.expression.staticType;
+      bool isNull = expressionType.isDartCoreNull;
+      if (!isNull && expressionType is InterfaceType) {
+        if (_typeSystem.isSubtypeOf(
+            expressionType, _typeProvider.iterableObjectType)) {
+          InterfaceType iterableType = (expressionType as InterfaceTypeImpl)
+              .asInstanceOf(_typeProvider.iterableType.element);
+          if (iterableType != null) {
+            // The `iterableType` will be `null` when `expressionType` is
+            // `Null`. Fall through in that case to perform the default type
+            // check.
+            List<DartType> typeArguments = iterableType.typeArguments;
+            if (typeArguments.length == 1) {
+              return _InferredCollectionElementTypeInformation(
+                  elementType: typeArguments[0],
+                  keyType: null,
+                  valueType: null);
+            }
+          }
+          return _InferredCollectionElementTypeInformation(
+              elementType: _typeProvider.dynamicType,
+              keyType: null,
+              valueType: null);
+        } else if (_typeSystem.isSubtypeOf(
+            expressionType, _typeProvider.mapObjectObjectType)) {
+          InterfaceType mapType = (expressionType as InterfaceTypeImpl)
+              .asInstanceOf(_typeProvider.mapType.element);
+          if (mapType != null) {
+            // The `iterableType` will be `null` when `expressionType` is
+            // `Null`. Fall through in that case to perform the default type
+            // check.
+            List<DartType> typeArguments = mapType.typeArguments;
+            if (typeArguments.length == 2) {
+              return _InferredCollectionElementTypeInformation(
+                  elementType: null,
+                  keyType: typeArguments[0],
+                  valueType: typeArguments[1]);
+            }
+          }
+          DartType dynamicType = _typeProvider.dynamicType;
+          return _InferredCollectionElementTypeInformation(
+              elementType: null, keyType: dynamicType, valueType: dynamicType);
+        }
+      } else if (expressionType.isDynamic) {
+        return _InferredCollectionElementTypeInformation(
+            elementType: expressionType,
+            keyType: expressionType,
+            valueType: expressionType);
+      } else if (isNull &&
+          element.spreadOperator.type ==
+              TokenType.PERIOD_PERIOD_PERIOD_QUESTION) {
+        return _InferredCollectionElementTypeInformation(
+            elementType: expressionType,
+            keyType: expressionType,
+            valueType: expressionType);
+      }
+      return _InferredCollectionElementTypeInformation(
+          elementType: null, keyType: null, valueType: null);
+    } else {
+      throw StateError('Unknown element type ${element.runtimeType}');
+    }
+  }
+
   /**
    * Given a declared identifier from a foreach loop, attempt to infer
    * a type for it if one is not already present.  Inference is based
@@ -1820,15 +1632,31 @@
    * is defined.
    */
   void _inferForEachLoopVariableType(DeclaredIdentifier loopVariable) {
-    if (loopVariable != null &&
-        loopVariable.type == null &&
-        loopVariable.parent is ForEachStatement) {
-      ForEachStatement loop = loopVariable.parent;
-      if (loop.iterable != null) {
-        Expression expr = loop.iterable;
+    if (loopVariable != null && loopVariable.type == null) {
+      AstNode parent = loopVariable.parent;
+      Token awaitKeyword;
+      Expression iterable;
+      // ignore: deprecated_member_use_from_same_package
+      if (parent is ForEachStatement) {
+        awaitKeyword = parent.awaitKeyword;
+        iterable = parent.iterable;
+      } else if (parent is ForEachPartsWithDeclaration) {
+        AstNode parentParent = parent.parent;
+        if (parentParent is ForStatement2Impl) {
+          awaitKeyword = parentParent.awaitKeyword;
+        } else if (parentParent is ForElement) {
+          awaitKeyword = parentParent.awaitKeyword;
+        } else {
+          return;
+        }
+        iterable = parent.iterable;
+      } else {
+        return;
+      }
+      if (iterable != null) {
         LocalVariableElementImpl element = loopVariable.declaredElement;
-        DartType exprType = expr.staticType;
-        DartType targetType = (loop.awaitKeyword == null)
+        DartType exprType = iterable.staticType;
+        DartType targetType = (awaitKeyword == null)
             ? _typeProvider.iterableType
             : _typeProvider.streamType;
         DartType iteratedType = _findIteratedType(exprType, targetType);
@@ -1995,8 +1823,8 @@
    */
   void _inferLocalVariableType(
       VariableDeclaration node, Expression initializer) {
+    AstNode parent = node.parent;
     if (initializer != null) {
-      AstNode parent = node.parent;
       if (parent is VariableDeclarationList && parent.type == null) {
         DartType type = resolutionMap.staticTypeForExpression(initializer);
         if (type != null && !type.isBottom && !type.isDartCoreNull) {
@@ -2007,6 +1835,14 @@
           }
         }
       }
+    } else if (_strictInference) {
+      if (parent is VariableDeclarationList && parent.type == null) {
+        _resolver.errorReporter.reportTypeErrorForNode(
+          HintCode.INFERENCE_FAILURE_ON_UNINITIALIZED_VARIABLE,
+          node,
+          [node.name.name],
+        );
+      }
     }
   }
 
@@ -2115,6 +1951,38 @@
     return false;
   }
 
+  DartType _inferSetOrMapLiteralType(SetOrMapLiteral literal) {
+    DartType contextType = InferenceContext.getContext(literal);
+    NodeList<CollectionElement> elements = literal.elements2;
+    if (elements.length < 2 && contextType != null) {
+      return contextType;
+    }
+    List<_InferredCollectionElementTypeInformation> inferredTypes = [];
+    bool canBeAMap = true;
+    bool mustBeAMap = false;
+    bool canBeASet = true;
+    bool mustBeASet = false;
+    for (CollectionElement element in elements) {
+      _InferredCollectionElementTypeInformation inferredType =
+          _inferCollectionElementType(element);
+      inferredTypes.add(inferredType);
+      canBeAMap = canBeAMap && inferredType.canBeAMap;
+      mustBeAMap = mustBeAMap || inferredType.mustBeAMap;
+      canBeASet = canBeASet && inferredType.canBeASet;
+      mustBeASet = mustBeASet || inferredType.mustBeASet;
+    }
+    if (canBeASet && mustBeASet) {
+      return _toSetType(literal, contextType, inferredTypes);
+    } else if (canBeAMap && mustBeAMap) {
+      return _toMapType(literal, contextType, inferredTypes);
+    }
+    if (contextType == null) {
+      DartType dynamicType = _typeProvider.dynamicType;
+      return _typeProvider.mapType.instantiate([dynamicType, dynamicType]);
+    }
+    return contextType;
+  }
+
   /**
    * Return `true` if the given [node] is not a type literal.
    */
@@ -2145,6 +2013,55 @@
     }
   }
 
+  DartType _toMapType(SetOrMapLiteral node, DartType contextType,
+      List<_InferredCollectionElementTypeInformation> inferredTypes) {
+    DartType dynamicType = _typeProvider.dynamicType;
+    List<DartType> keyTypes = [];
+    List<DartType> valueTypes = [];
+    for (int i = 0; i < inferredTypes.length; i++) {
+      keyTypes.add(inferredTypes[i].keyType ?? dynamicType);
+      valueTypes.add(inferredTypes[i].valueType ?? dynamicType);
+    }
+    TypeParameterType keyTypeParam =
+        _typeProvider.mapType.typeParameters[0].type;
+    TypeParameterType valueTypeParam =
+        _typeProvider.mapType.typeParameters[1].type;
+    ParameterElementImpl syntheticKeyParameter =
+        new ParameterElementImpl.synthetic(
+            'key', keyTypeParam, ParameterKind.POSITIONAL);
+    ParameterElementImpl syntheticValueParameter =
+        new ParameterElementImpl.synthetic(
+            'value', valueTypeParam, ParameterKind.POSITIONAL);
+    List<ParameterElement> typeParameters =
+        new List.filled(keyTypes.length, syntheticKeyParameter, growable: true)
+          ..addAll(new List.filled(valueTypes.length, syntheticValueParameter));
+    List<DartType> elementTypes = new List<DartType>.from(keyTypes)
+      ..addAll(valueTypes);
+    return (_typeSystem as Dart2TypeSystem).inferGenericFunctionOrType(
+        _typeProvider.mapType, typeParameters, elementTypes, contextType,
+        errorReporter: _resolver.errorReporter, errorNode: node);
+  }
+
+  DartType _toSetType(SetOrMapLiteral node, DartType contextType,
+      List<_InferredCollectionElementTypeInformation> inferredTypes) {
+    DartType dynamicType = _typeProvider.dynamicType;
+    List<DartType> elementTypes = [];
+    for (int i = 0; i < inferredTypes.length; i++) {
+      elementTypes.add(inferredTypes[i].elementType ?? dynamicType);
+    }
+    TypeParameterType elementTypeParam =
+        _typeProvider.setType.typeParameters[0].type;
+    ParameterElementImpl syntheticElementParameter =
+        new ParameterElementImpl.synthetic(
+            'key', elementTypeParam, ParameterKind.POSITIONAL);
+    List<ParameterElement> parameters = new List.filled(
+        elementTypes.length, syntheticElementParameter,
+        growable: true);
+    return (_typeSystem as Dart2TypeSystem).inferGenericFunctionOrType(
+        _typeProvider.setType, parameters, elementTypes, contextType,
+        errorReporter: _resolver.errorReporter, errorNode: node);
+  }
+
   /**
    * Given a constructor for a generic type, returns the equivalent generic
    * function type that we could use to forward to the constructor, or for a
@@ -2180,3 +2097,48 @@
     return new FunctionTypeImpl.fresh(function.type);
   }
 }
+
+class _InferredCollectionElementTypeInformation {
+  final DartType elementType;
+  final DartType keyType;
+  final DartType valueType;
+
+  _InferredCollectionElementTypeInformation(
+      {this.elementType, this.keyType, this.valueType});
+
+  factory _InferredCollectionElementTypeInformation.leastUpperBound(
+          TypeSystem typeSystem,
+          _InferredCollectionElementTypeInformation first,
+          _InferredCollectionElementTypeInformation second) =>
+      _InferredCollectionElementTypeInformation(
+          elementType: _leastUpperBoundOfTypes(
+              typeSystem, first.elementType, second.elementType),
+          keyType: _leastUpperBoundOfTypes(
+              typeSystem, first.keyType, second.keyType),
+          valueType: _leastUpperBoundOfTypes(
+              typeSystem, first.valueType, second.valueType));
+
+  bool get canBeAMap => keyType != null || valueType != null;
+
+  bool get canBeASet => elementType != null;
+
+  bool get mustBeAMap => canBeAMap && elementType == null;
+
+  bool get mustBeASet => canBeASet && keyType == null && valueType == null;
+
+  @override
+  String toString() {
+    return '($elementType, $keyType, $valueType)';
+  }
+
+  static DartType _leastUpperBoundOfTypes(
+      TypeSystem typeSystem, DartType first, DartType second) {
+    if (first == null) {
+      return second;
+    } else if (second == null) {
+      return first;
+    } else {
+      return typeSystem.leastUpperBound(first, second);
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
index b6f7ccd..296457a 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -494,29 +494,31 @@
   static FieldFormalParameter fieldFormalParameter2(String identifier) =>
       fieldFormalParameter(null, null, identifier);
 
+  @Deprecated('Use forStatement2')
   static ForEachStatement forEachStatement(DeclaredIdentifier loopVariable,
           Expression iterator, Statement body) =>
-      astFactory.forEachStatementWithDeclaration(
-          null,
-          TokenFactory.tokenFromKeyword(Keyword.FOR),
-          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
-          loopVariable,
-          TokenFactory.tokenFromKeyword(Keyword.IN),
-          iterator,
-          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
-          body);
+      astFactory.forStatement2(
+          forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
+          leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          forLoopParts: astFactory.forEachPartsWithDeclaration(
+              loopVariable: loopVariable,
+              inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
+              iterable: iterator),
+          rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+          body: body);
 
+  @Deprecated('Use forStatement2')
   static ForEachStatement forEachStatement2(
           SimpleIdentifier identifier, Expression iterator, Statement body) =>
-      astFactory.forEachStatementWithReference(
-          null,
-          TokenFactory.tokenFromKeyword(Keyword.FOR),
-          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
-          identifier,
-          TokenFactory.tokenFromKeyword(Keyword.IN),
-          iterator,
-          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
-          body);
+      astFactory.forStatement2(
+          forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
+          leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          forLoopParts: astFactory.forEachPartsWithIdentifier(
+              identifier: identifier,
+              inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
+              iterable: iterator),
+          rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+          body: body);
 
   static FormalParameterList formalParameterList(
           [List<FormalParameter> parameters]) =>
@@ -527,33 +529,42 @@
           null,
           TokenFactory.tokenFromType(TokenType.CLOSE_PAREN));
 
+  @Deprecated('Use forStatement2')
   static ForStatement forStatement(Expression initialization,
           Expression condition, List<Expression> updaters, Statement body) =>
-      astFactory.forStatement(
-          TokenFactory.tokenFromKeyword(Keyword.FOR),
-          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
-          null,
-          initialization,
-          TokenFactory.tokenFromType(TokenType.SEMICOLON),
-          condition,
-          TokenFactory.tokenFromType(TokenType.SEMICOLON),
-          updaters,
-          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
-          body);
+      astFactory.forStatement2(
+          forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
+          leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          forLoopParts: astFactory.forPartsWithExpression(
+              initialization: initialization,
+              leftSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+              condition: condition,
+              rightSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+              updaters: updaters),
+          rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+          body: body);
 
-  static ForStatement forStatement2(VariableDeclarationList variableList,
-          Expression condition, List<Expression> updaters, Statement body) =>
-      astFactory.forStatement(
-          TokenFactory.tokenFromKeyword(Keyword.FOR),
-          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
-          variableList,
-          null,
-          TokenFactory.tokenFromType(TokenType.SEMICOLON),
-          condition,
-          TokenFactory.tokenFromType(TokenType.SEMICOLON),
-          updaters,
-          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
-          body);
+  static
+      // ignore: deprecated_member_use_from_same_package
+      ForStatement forStatement2(
+              VariableDeclarationList variableList,
+              Expression condition,
+              List<Expression> updaters,
+              Statement body) =>
+          astFactory.forStatement2(
+              forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
+              leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+              forLoopParts: astFactory.forPartsWithDeclarations(
+                  variables: variableList,
+                  leftSeparator:
+                      TokenFactory.tokenFromType(TokenType.SEMICOLON),
+                  condition: condition,
+                  rightSeparator:
+                      TokenFactory.tokenFromType(TokenType.SEMICOLON),
+                  updaters: updaters),
+              rightParenthesis:
+                  TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+              body: body);
 
   static FunctionDeclaration functionDeclaration(
           TypeAnnotation type,
@@ -822,6 +833,7 @@
           elements,
           TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
 
+  @Deprecated('Use setOrMapLiteral')
   static MapLiteral mapLiteral(Keyword keyword, TypeArgumentList typeArguments,
           [List<MapLiteralEntry> entries]) =>
       astFactory.mapLiteral(
@@ -831,6 +843,7 @@
           entries,
           TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
 
+  @Deprecated('Use setOrMapLiteral')
   static MapLiteral mapLiteral2([List<MapLiteralEntry> entries]) =>
       mapLiteral(null, null, entries);
 
@@ -1073,6 +1086,7 @@
   static ScriptTag scriptTag(String scriptTag) =>
       astFactory.scriptTag(TokenFactory.tokenFromString(scriptTag));
 
+  @Deprecated('Use setOrMapLiteral')
   static SetLiteral setLiteral(Keyword keyword, TypeArgumentList typeArguments,
           List<Expression> elements) =>
       astFactory.setLiteral(
@@ -1082,6 +1096,15 @@
           elements,
           TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
 
+  static SetOrMapLiteral setOrMapLiteral(
+          Keyword keyword, TypeArgumentList typeArguments,
+          [List<CollectionElement> elements]) =>
+      astFactory.setOrMapLiteral(
+          constKeyword:
+              keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          typeArguments: typeArguments,
+          elements: elements);
+
   static ShowCombinator showCombinator(List<SimpleIdentifier> identifiers) =>
       astFactory.showCombinator(
           TokenFactory.tokenFromString("show"), identifiers);
diff --git a/pkg/analyzer/lib/src/lint/linter_visitor.dart b/pkg/analyzer/lib/src/lint/linter_visitor.dart
index 98ba52c..6663be8 100644
--- a/pkg/analyzer/lib/src/lint/linter_visitor.dart
+++ b/pkg/analyzer/lib/src/lint/linter_visitor.dart
@@ -265,6 +265,7 @@
   }
 
   @override
+  @deprecated
   void visitForEachStatement(ForEachStatement node) {
     _runSubscriptions(node, registry._forForEachStatement);
     super.visitForEachStatement(node);
@@ -295,6 +296,7 @@
   }
 
   @override
+  @deprecated
   void visitForStatement(ForStatement node) {
     _runSubscriptions(node, registry._forForStatement);
     super.visitForStatement(node);
@@ -451,24 +453,13 @@
   }
 
   @override
-  void visitListLiteral2(ListLiteral2 node) {
-    _runSubscriptions(node, registry._forListLiteral2);
-    super.visitListLiteral2(node);
-  }
-
-  @override
+  @deprecated
   void visitMapLiteral(MapLiteral node) {
     _runSubscriptions(node, registry._forMapLiteral);
     super.visitMapLiteral(node);
   }
 
   @override
-  void visitMapLiteral2(MapLiteral2 node) {
-    _runSubscriptions(node, registry._forMapLiteral2);
-    super.visitMapLiteral2(node);
-  }
-
-  @override
   void visitMapLiteralEntry(MapLiteralEntry node) {
     _runSubscriptions(node, registry._forMapLiteralEntry);
     super.visitMapLiteralEntry(node);
@@ -572,9 +563,9 @@
   }
 
   @override
-  void visitSetLiteral2(SetLiteral2 node) {
-    _runSubscriptions(node, registry._forSetLiteral2);
-    super.visitSetLiteral2(node);
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
+    _runSubscriptions(node, registry._forSetOrMapLiteral);
+    super.visitSetOrMapLiteral(node);
   }
 
   @override
@@ -801,6 +792,7 @@
       _forForEachPartsWithDeclaration = [];
   final List<_Subscription<ForEachPartsWithIdentifier>>
       _forForEachPartsWithIdentifier = [];
+  @Deprecated('Use _forForStatement2')
   final List<_Subscription<ForEachStatement>> _forForEachStatement = [];
   final List<_Subscription<ForElement>> _forForElement = [];
   final List<_Subscription<FormalParameterList>> _forFormalParameterList = [];
@@ -808,6 +800,7 @@
       _forForPartsWithDeclarations = [];
   final List<_Subscription<ForPartsWithExpression>> _forForPartsWithExpression =
       [];
+  @Deprecated('Use _forForStatement2')
   final List<_Subscription<ForStatement>> _forForStatement = [];
   final List<_Subscription<ForStatement2>> _forForStatement2 = [];
   final List<_Subscription<FunctionDeclaration>> _forFunctionDeclaration = [];
@@ -839,9 +832,8 @@
   final List<_Subscription<LibraryDirective>> _forLibraryDirective = [];
   final List<_Subscription<LibraryIdentifier>> _forLibraryIdentifier = [];
   final List<_Subscription<ListLiteral>> _forListLiteral = [];
-  final List<_Subscription<ListLiteral2>> _forListLiteral2 = [];
+  @Deprecated('Use _forSetOrMapLiteral')
   final List<_Subscription<MapLiteral>> _forMapLiteral = [];
-  final List<_Subscription<MapLiteral2>> _forMapLiteral2 = [];
   final List<_Subscription<MapLiteralEntry>> _forMapLiteralEntry = [];
   final List<_Subscription<MethodDeclaration>> _forMethodDeclaration = [];
   final List<_Subscription<MethodInvocation>> _forMethodInvocation = [];
@@ -861,7 +853,7 @@
       _forRedirectingConstructorInvocation = [];
   final List<_Subscription<RethrowExpression>> _forRethrowExpression = [];
   final List<_Subscription<ReturnStatement>> _forReturnStatement = [];
-  final List<_Subscription<SetLiteral2>> _forSetLiteral2 = [];
+  final List<_Subscription<SetOrMapLiteral>> _forSetOrMapLiteral = [];
   final List<_Subscription<ShowCombinator>> _forShowCombinator = [];
   final List<_Subscription<SimpleFormalParameter>> _forSimpleFormalParameter =
       [];
@@ -1094,6 +1086,7 @@
         .add(new _Subscription(linter, visitor, _getTimer(linter)));
   }
 
+  @Deprecated('Use addForStatement2')
   void addForEachStatement(LintRule linter, AstVisitor visitor) {
     _forForEachStatement
         .add(new _Subscription(linter, visitor, _getTimer(linter)));
@@ -1118,6 +1111,7 @@
         .add(new _Subscription(linter, visitor, _getTimer(linter)));
   }
 
+  @Deprecated('Use addForStatement2')
   void addForStatement(LintRule linter, AstVisitor visitor) {
     _forForStatement.add(new _Subscription(linter, visitor, _getTimer(linter)));
   }
@@ -1242,18 +1236,11 @@
     _forListLiteral.add(new _Subscription(linter, visitor, _getTimer(linter)));
   }
 
-  void addListLiteral2(LintRule linter, AstVisitor visitor) {
-    _forListLiteral2.add(new _Subscription(linter, visitor, _getTimer(linter)));
-  }
-
+  @Deprecated('Use addSetOrMapLiteral')
   void addMapLiteral(LintRule linter, AstVisitor visitor) {
     _forMapLiteral.add(new _Subscription(linter, visitor, _getTimer(linter)));
   }
 
-  void addMapLiteral2(LintRule linter, AstVisitor visitor) {
-    _forMapLiteral2.add(new _Subscription(linter, visitor, _getTimer(linter)));
-  }
-
   void addMapLiteralEntry(LintRule linter, AstVisitor visitor) {
     _forMapLiteralEntry
         .add(new _Subscription(linter, visitor, _getTimer(linter)));
@@ -1338,8 +1325,9 @@
         .add(new _Subscription(linter, visitor, _getTimer(linter)));
   }
 
-  void addSetLiteral2(LintRule linter, AstVisitor visitor) {
-    _forSetLiteral2.add(new _Subscription(linter, visitor, _getTimer(linter)));
+  void addSetOrMapLiteral(LintRule linter, AstVisitor visitor) {
+    _forSetOrMapLiteral
+        .add(new _Subscription(linter, visitor, _getTimer(linter)));
   }
 
   void addShowCombinator(LintRule linter, AstVisitor visitor) {
diff --git a/pkg/analyzer/lib/src/lint/registry.dart b/pkg/analyzer/lib/src/lint/registry.dart
index e72f804..3b4bbea 100644
--- a/pkg/analyzer/lib/src/lint/registry.dart
+++ b/pkg/analyzer/lib/src/lint/registry.dart
@@ -58,10 +58,4 @@
   void register(LintRule rule) {
     _ruleMap[rule.name] = rule;
   }
-
-  // todo (pq): remove once linter-0.1.79 is in DEPS.
-  @deprecated
-  void registerDefault(LintRule rule) {
-    register(rule);
-  }
 }
diff --git a/pkg/analyzer/lib/src/plugin/engine_plugin.dart b/pkg/analyzer/lib/src/plugin/engine_plugin.dart
index 7d5a4a3..6f97315 100644
--- a/pkg/analyzer/lib/src/plugin/engine_plugin.dart
+++ b/pkg/analyzer/lib/src/plugin/engine_plugin.dart
@@ -9,8 +9,6 @@
 import 'package:analyzer/src/task/api/model.dart';
 import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/src/task/dart_work_manager.dart';
-import 'package:analyzer/src/task/html.dart';
-import 'package:analyzer/src/task/html_work_manager.dart';
 import 'package:analyzer/src/task/options_work_manager.dart';
 import 'package:plugin/plugin.dart';
 
@@ -141,7 +139,6 @@
     _registerWorkManagerFactoryExtensions(registerExtension);
     _registerDartErrorsForSource(registerExtension);
     _registerDartErrorsForUnit(registerExtension);
-    _registerHtmlErrors(registerExtension);
   }
 
   void _registerDartErrorsForSource(RegisterExtension registerExtension) {
@@ -154,18 +151,12 @@
         DART_ERRORS_FOR_UNIT_EXTENSION_POINT_ID, LIBRARY_UNIT_ERRORS);
   }
 
-  void _registerHtmlErrors(RegisterExtension registerExtension) {
-    registerExtension(HTML_ERRORS_EXTENSION_POINT_ID, HTML_DOCUMENT_ERRORS);
-  }
-
   void _registerWorkManagerFactoryExtensions(
       RegisterExtension registerExtension) {
     String taskId = WORK_MANAGER_EXTENSION_POINT_ID;
     registerExtension(taskId,
         (InternalAnalysisContext context) => new DartWorkManager(context));
     registerExtension(taskId,
-        (InternalAnalysisContext context) => new HtmlWorkManager(context));
-    registerExtension(taskId,
         (InternalAnalysisContext context) => new OptionsWorkManager(context));
   }
 }
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index a9056f4..4ec0123 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -28,6 +28,8 @@
 
 /// A top-level public declaration.
 class Declaration {
+  final String defaultArgumentListString;
+  final List<int> defaultArgumentListTextRanges;
   final String docComplete;
   final String docSummary;
   final bool isAbstract;
@@ -39,8 +41,15 @@
   final String locationPath;
   final int locationStartColumn;
   final int locationStartLine;
+
+  /// The name of the declaration.
+  /// For enum constants, the name of the constant.
   final String name;
+
+  /// Usually `null`.
+  /// For enum constants, the name of the enum.
   final String name2;
+
   final String parameters;
   final List<String> parameterNames;
   final List<String> parameterTypes;
@@ -51,6 +60,8 @@
   List<String> _relevanceTags;
 
   Declaration({
+    @required this.defaultArgumentListString,
+    @required this.defaultArgumentListTextRanges,
     @required this.docComplete,
     @required this.docSummary,
     @required this.isAbstract,
@@ -718,19 +729,22 @@
   }
 
   static List<String> _forExpression(Expression expression) {
-    if (expression is BooleanLiteral) return const ['dart:core::bool'];
-    if (expression is DoubleLiteral) return const ['dart:core::double'];
-    if (expression is IntegerLiteral) return const ['dart:core::int'];
-    if (expression is StringLiteral) return const ['dart:core::String'];
-
-    if (expression is ListLiteral || expression is ListLiteral2) {
+    if (expression is BooleanLiteral) {
+      return const ['dart:core::bool'];
+    } else if (expression is DoubleLiteral) {
+      return const ['dart:core::double'];
+    } else if (expression is IntegerLiteral) {
+      return const ['dart:core::int'];
+    } else if (expression is StringLiteral) {
+      return const ['dart:core::String'];
+    } else if (expression is ListLiteral) {
       return const ['dart:core::List'];
-    }
-    if (expression is MapLiteral || expression is MapLiteral2) {
-      return const ['dart:core::Map'];
-    }
-    if (expression is SetLiteral || expression is SetLiteral2) {
-      return const ['dart:core::Set'];
+    } else if (expression is SetOrMapLiteral) {
+      if (expression.isMap) {
+        return const ['dart:core::Map'];
+      } else if (expression.isSet) {
+        return const ['dart:core::Set'];
+      }
     }
 
     return null;
@@ -760,6 +774,12 @@
     }
 
     return Declaration(
+      defaultArgumentListString: d.defaultArgumentListString.isNotEmpty
+          ? d.defaultArgumentListString
+          : null,
+      defaultArgumentListTextRanges: d.defaultArgumentListTextRanges.isNotEmpty
+          ? d.defaultArgumentListTextRanges
+          : null,
       docComplete: hasDoc ? d.docComplete : null,
       docSummary: hasDoc ? d.docSummary : null,
       isAbstract: d.isAbstract,
@@ -857,6 +877,8 @@
 
     var idlKind = kindToIdl(d.kind);
     return idl.AvailableDeclarationBuilder(
+      defaultArgumentListString: d.defaultArgumentListString,
+      defaultArgumentListTextRanges: d.defaultArgumentListTextRanges,
       docComplete: d.docComplete,
       docSummary: d.docSummary,
       fieldMask: fieldMask,
@@ -881,6 +903,13 @@
   }
 }
 
+class _DefaultArguments {
+  final String text;
+  final List<int> ranges;
+
+  _DefaultArguments(this.text, this.ranges);
+}
+
 class _Export {
   final Uri uri;
   final List<_ExportCombinator> combinators;
@@ -914,7 +943,7 @@
 
 class _File {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 5;
+  static const int DATA_VERSION = 8;
 
   /// The next value for [id].
   static int _nextId = 0;
@@ -1089,6 +1118,8 @@
     }
 
     void addDeclaration({
+      String defaultArgumentListString,
+      List<int> defaultArgumentListTextRanges,
       bool isAbstract = false,
       bool isConst = false,
       bool isDeprecated = false,
@@ -1104,32 +1135,37 @@
       String returnType,
       String typeParameters,
     }) {
-      if (!Identifier.isPrivateName(name.name)) {
-        var locationOffset = name.offset;
-        var lineLocation = lineInfo.getLocation(locationOffset);
-        fileDeclarations.add(Declaration(
-          docComplete: docComplete,
-          docSummary: docSummary,
-          isAbstract: isAbstract,
-          isConst: isConst,
-          isDeprecated: isDeprecated,
-          isFinal: isFinal,
-          kind: kind,
-          locationOffset: locationOffset,
-          locationPath: path,
-          name: name.name,
-          name2: name2?.name,
-          locationStartColumn: lineLocation.columnNumber,
-          locationStartLine: lineLocation.lineNumber,
-          parameters: parameters,
-          parameterNames: parameterNames,
-          parameterTypes: parameterTypes,
-          relevanceTags: relevanceTags,
-          requiredParameterCount: requiredParameterCount,
-          returnType: returnType,
-          typeParameters: typeParameters,
-        ));
+      if (Identifier.isPrivateName(name.name) ||
+          name2 != null && Identifier.isPrivateName(name2.name)) {
+        return;
       }
+
+      var locationOffset = name.offset;
+      var lineLocation = lineInfo.getLocation(locationOffset);
+      fileDeclarations.add(Declaration(
+        defaultArgumentListString: defaultArgumentListString,
+        defaultArgumentListTextRanges: defaultArgumentListTextRanges,
+        docComplete: docComplete,
+        docSummary: docSummary,
+        isAbstract: isAbstract,
+        isConst: isConst,
+        isDeprecated: isDeprecated,
+        isFinal: isFinal,
+        kind: kind,
+        locationOffset: locationOffset,
+        locationPath: path,
+        name: name.name,
+        name2: name2?.name,
+        locationStartColumn: lineLocation.columnNumber,
+        locationStartLine: lineLocation.lineNumber,
+        parameters: parameters,
+        parameterNames: parameterNames,
+        parameterTypes: parameterTypes,
+        relevanceTags: relevanceTags,
+        requiredParameterCount: requiredParameterCount,
+        returnType: returnType,
+        typeParameters: typeParameters,
+      ));
     }
 
     for (var node in unit.declarations) {
@@ -1187,7 +1223,10 @@
                 _getFormalParameterRequiredCount(parameters),
           );
         } else {
+          var defaultArguments = _computeDefaultArguments(parameters);
           addDeclaration(
+            defaultArgumentListString: defaultArguments?.text,
+            defaultArgumentListTextRanges: defaultArguments?.ranges,
             isDeprecated: isDeprecated,
             kind: DeclarationKind.FUNCTION,
             name: node.name,
@@ -1298,6 +1337,39 @@
     }).toList();
   }
 
+  static _DefaultArguments _computeDefaultArguments(
+      FormalParameterList parameters) {
+    var buffer = StringBuffer();
+    var ranges = <int>[];
+    for (var parameter in parameters.parameters) {
+      if (parameter.isRequired) {
+        if (buffer.isNotEmpty) {
+          buffer.write(', ');
+        }
+        var valueOffset = buffer.length;
+        buffer.write(parameter.identifier.name);
+        var valueLength = buffer.length - valueOffset;
+        ranges.add(valueOffset);
+        ranges.add(valueLength);
+      } else if (parameter.isNamed && _hasRequiredAnnotation(parameter)) {
+        if (buffer.isNotEmpty) {
+          buffer.write(', ');
+        }
+        buffer.write(parameter.identifier.name);
+        buffer.write(': ');
+
+        var valueOffset = buffer.length;
+        buffer.write('null');
+        var valueLength = buffer.length - valueOffset;
+
+        ranges.add(valueOffset);
+        ranges.add(valueLength);
+      }
+    }
+    if (buffer.isEmpty) return null;
+    return _DefaultArguments(buffer.toString(), ranges);
+  }
+
   static List<String> _getFormalParameterNames(FormalParameterList parameters) {
     if (parameters == null) return const <String>[];
 
@@ -1356,6 +1428,19 @@
     return false;
   }
 
+  /// Return `true` if the [node] probably has `@required` annotation.
+  static bool _hasRequiredAnnotation(FormalParameter node) {
+    for (var annotation in node.metadata) {
+      var name = annotation.name;
+      if (name is SimpleIdentifier) {
+        if (name.name == 'required') {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
   static CompilationUnit _parse(String content) {
     var errorListener = AnalysisErrorListener.NULL_LISTENER;
     var source = StringSource(content, '');
diff --git a/pkg/analyzer/lib/src/services/lint.dart b/pkg/analyzer/lib/src/services/lint.dart
index 48c84cf..2548085 100644
--- a/pkg/analyzer/lib/src/services/lint.dart
+++ b/pkg/analyzer/lib/src/services/lint.dart
@@ -12,6 +12,9 @@
 /// Shared lint registry.
 LintRegistry lintRegistry = new LintRegistry();
 
+/// Current linter version.
+String linterVersion;
+
 /// Return lints associated with this [context], or an empty list if there are
 /// none.
 List<Linter> getLints(AnalysisContext context) =>
diff --git a/pkg/analyzer/lib/src/summary/base.dart b/pkg/analyzer/lib/src/summary/base.dart
index 7c3d8ae..6793692 100644
--- a/pkg/analyzer/lib/src/summary/base.dart
+++ b/pkg/analyzer/lib/src/summary/base.dart
@@ -59,3 +59,38 @@
 
   const TopLevel([this.fileIdentifier]);
 }
+
+/**
+ * Annotation used in the summary IDL to indicate the field name that is used
+ * to distinguish variants, or logical views on the same physical layout of
+ * fields.
+ */
+class Variant {
+  final String fieldName;
+
+  const Variant(this.fieldName);
+}
+
+/**
+ * Annotation used in the summary IDL to indicate the id of a field that
+ * represents a logical field.  The set of ids used by a class must cover the
+ * contiguous range from 0 to N-1, where N is the number of fields.  All logical
+ * fields must have the same type, which will become the type of the actual
+ * field.
+ *
+ * In order to preserve forwards and backwards compatibility, id numbers must
+ * be stable between releases.  So when new fields are added they should take
+ * the next available id without renumbering other fields.
+ */
+class VariantId {
+  /// The ID of the actual field.
+  final int value;
+
+  /// The value of the variant field in [Variant].
+  final Object variant;
+
+  /// The list of variant values for which this field exists.
+  final List<Object> variantList;
+
+  const VariantId(this.value, {this.variant, this.variantList});
+}
diff --git a/pkg/analyzer/lib/src/summary/expr_builder.dart b/pkg/analyzer/lib/src/summary/expr_builder.dart
index e6af09e..3301d95 100644
--- a/pkg/analyzer/lib/src/summary/expr_builder.dart
+++ b/pkg/analyzer/lib/src/summary/expr_builder.dart
@@ -7,14 +7,20 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart' show AstRewriteVisitor;
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/resynthesize.dart';
 
+bool _isSetOrMapEnabled(ExperimentStatus experimentStatus) =>
+    experimentStatus.spread_collections ||
+    experimentStatus.control_flow_collections;
+
 /**
  * Builder of [Expression]s from [UnlinkedExpr]s.
  */
@@ -25,13 +31,17 @@
   final ElementImpl context;
   final UnlinkedExpr _uc;
   final bool requireValidConst;
+  final bool useSetOrMap;
 
   int intPtr = 0;
   int doublePtr = 0;
   int stringPtr = 0;
   int refPtr = 0;
   int assignmentOperatorPtr = 0;
-  final List<Expression> stack = <Expression>[];
+
+  // The stack of values. Note that they are usually [Expression]s, but may be
+  // any [CollectionElement] to support map/set/list literals.
+  final List<CollectionElement> stack = <CollectionElement>[];
 
   final List<UnlinkedExecutable> localFunctions;
 
@@ -42,7 +52,10 @@
       this.localFunctions,
       Map<String, ParameterElement> parametersInScope})
       : this.parametersInScope =
-            parametersInScope ?? _parametersInScope(context);
+            parametersInScope ?? _parametersInScope(context),
+        this.useSetOrMap = _isSetOrMapEnabled((resynthesizer
+                .library.context.analysisOptions as AnalysisOptionsImpl)
+            .experimentStatus);
 
   bool get hasNonEmptyExpr => _uc != null && _uc.operations.isNotEmpty;
 
@@ -195,6 +208,9 @@
           _pushList(
               AstTestFactory.typeArgumentList(<TypeAnnotation>[itemType]));
           break;
+        case UnlinkedExprOperation.makeUntypedSetOrMap:
+          _pushSetOrMap(null);
+          break;
         case UnlinkedExprOperation.makeUntypedMap:
           _pushMap(null);
           break;
@@ -204,12 +220,27 @@
           _pushMap(AstTestFactory.typeArgumentList(
               <TypeAnnotation>[keyType, valueType]));
           break;
+        case UnlinkedExprOperation.makeMapLiteralEntry:
+          _pushMapLiteralEntry();
+          break;
+        case UnlinkedExprOperation.makeTypedMap2:
+          TypeAnnotation keyType = _newTypeName();
+          TypeAnnotation valueType = _newTypeName();
+          _pushSetOrMap(AstTestFactory.typeArgumentList(
+              <TypeAnnotation>[keyType, valueType]));
+          break;
         case UnlinkedExprOperation.makeUntypedSet:
           _pushSet(null);
           break;
         case UnlinkedExprOperation.makeTypedSet:
           TypeAnnotation itemType = _newTypeName();
-          _pushSet(AstTestFactory.typeArgumentList(<TypeAnnotation>[itemType]));
+          if (useSetOrMap) {
+            _pushSetOrMap(
+                AstTestFactory.typeArgumentList(<TypeAnnotation>[itemType]));
+          } else {
+            _pushSet(
+                AstTestFactory.typeArgumentList(<TypeAnnotation>[itemType]));
+          }
           break;
         case UnlinkedExprOperation.pushReference:
           _pushReference();
@@ -299,7 +330,7 @@
       int numNamedArgs = _uc.ints[intPtr++];
       int numPositionalArgs = _uc.ints[intPtr++];
       int numArgs = numNamedArgs + numPositionalArgs;
-      arguments = _removeTopItems(numArgs);
+      arguments = _removeTopExpressions(numArgs);
       // add names to the named arguments
       for (int i = 0; i < numNamedArgs; i++) {
         String name = _uc.strings[stringPtr++];
@@ -578,7 +609,9 @@
     return _buildTypeAst(type);
   }
 
-  Expression _pop() => stack.removeLast();
+  Expression _pop() => stack.removeLast() as Expression;
+
+  CollectionElement _popCollectionElement() => stack.removeLast();
 
   void _push(Expression expr) {
     stack.add(expr);
@@ -590,6 +623,10 @@
     _push(AstTestFactory.binaryExpression(left, operator, right));
   }
 
+  void _pushCollectionElement(CollectionElement collectionElement) {
+    stack.add(collectionElement);
+  }
+
   void _pushExtractProperty() {
     Expression target = _pop();
     String name = _uc.strings[stringPtr++];
@@ -788,8 +825,21 @@
         : typeArguments.arguments[1].type;
     var staticType =
         resynthesizer.typeProvider.mapType.instantiate([keyType, valueType]);
-    _push(AstTestFactory.mapLiteral(Keyword.CONST, typeArguments, entries)
-      ..staticType = staticType);
+    if (useSetOrMap) {
+      _push(
+          AstTestFactory.setOrMapLiteral(Keyword.CONST, typeArguments, entries)
+            ..staticType = staticType);
+    } else {
+      // ignore: deprecated_member_use_from_same_package
+      _push(AstTestFactory.mapLiteral(Keyword.CONST, typeArguments, entries)
+        ..staticType = staticType);
+    }
+  }
+
+  void _pushMapLiteralEntry() {
+    Expression value = _pop();
+    Expression key = _pop();
+    _pushCollectionElement(AstTestFactory.mapLiteralEntry2(key, value));
   }
 
   void _pushPrefix(TokenType operator) {
@@ -807,13 +857,41 @@
     for (int i = 0; i < count; i++) {
       elements.insert(0, _pop());
     }
+    // ignore: deprecated_member_use_from_same_package
     _push(AstTestFactory.setLiteral(Keyword.CONST, typeArguments, elements));
   }
 
-  List<Expression> _removeTopItems(int count) {
+  void _pushSetOrMap(TypeArgumentList typeArguments) {
+    int count = _uc.ints[intPtr++];
+    List<CollectionElement> elements = <CollectionElement>[];
+    for (int i = 0; i < count; i++) {
+      elements.add(_popCollectionElement());
+    }
+    DartType staticType;
+    if (typeArguments != null && typeArguments.arguments.length == 2) {
+      var keyType = typeArguments.arguments[0].type;
+      var valueType = typeArguments.arguments[1].type;
+      staticType =
+          resynthesizer.typeProvider.mapType.instantiate([keyType, valueType]);
+    } else if (typeArguments != null && typeArguments.arguments.length == 1) {
+      var valueType = typeArguments == null
+          ? resynthesizer.typeProvider.dynamicType
+          : typeArguments.arguments[0].type;
+      staticType = resynthesizer.typeProvider.setType.instantiate([valueType]);
+    }
+    _push(astFactory.setOrMapLiteral(
+        constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
+        typeArguments: typeArguments,
+        leftBracket: TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
+        elements: elements,
+        rightBracket: TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET))
+      ..staticType = staticType);
+  }
+
+  List<Expression> _removeTopExpressions(int count) {
     int start = stack.length - count;
     int end = stack.length;
-    List<Expression> items = stack.getRange(start, end).toList();
+    List<Expression> items = List<Expression>.from(stack.getRange(start, end));
     stack.removeRange(start, end);
     return items;
   }
diff --git a/pkg/analyzer/lib/src/summary/flat_buffers.dart b/pkg/analyzer/lib/src/summary/flat_buffers.dart
index c291d61..da60445 100644
--- a/pkg/analyzer/lib/src/summary/flat_buffers.dart
+++ b/pkg/analyzer/lib/src/summary/flat_buffers.dart
@@ -142,6 +142,19 @@
   }
 
   /**
+   * Add the [field] with the given 64-bit float [value].
+   */
+  void addFloat64(int field, double value, [double def]) {
+    _ensureCurrentVTable();
+    if (value != null && value != def) {
+      int size = 8;
+      _prepare(size, 1);
+      _trackField(field);
+      _setFloat64AtTail(_buf, _tail, value);
+    }
+  }
+
+  /**
    * Add the [field] with the given 32-bit signed integer [value].  The field is
    * not added if the [value] is equal to [def].
    */
@@ -755,6 +768,19 @@
 }
 
 /**
+ * The reader of 64-bit floats.
+ */
+class Float64Reader extends Reader<double> {
+  const Float64Reader() : super();
+
+  @override
+  int get size => 8;
+
+  @override
+  double read(BufferContext bc, int offset) => bc._getFloat64(offset);
+}
+
+/**
  * List of booleans backed by 8-bit unsigned integers.
  */
 class _FbBoolList with ListMixin<bool> implements List<bool> {
@@ -880,7 +906,7 @@
  */
 class _VTable {
   final List<int> fieldTails = <int>[];
-  final List<int> fieldOffsets = <int>[];
+  List<int> fieldOffsets;
 
   /**
    * The size of the table that uses this VTable.
@@ -924,10 +950,11 @@
    * Fill the [fieldOffsets] field.
    */
   void computeFieldOffsets(int tableTail) {
-    assert(fieldOffsets.isEmpty);
-    for (int fieldTail in fieldTails) {
-      int fieldOffset = fieldTail == null ? 0 : tableTail - fieldTail;
-      fieldOffsets.add(fieldOffset);
+    assert(fieldOffsets == null);
+    fieldOffsets = List<int>(fieldTails.length);
+    for (int i = 0; i < fieldTails.length; ++i) {
+      int fieldTail = fieldTails[i];
+      fieldOffsets[i] = fieldTail == null ? 0 : tableTail - fieldTail;
     }
   }
 
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index 7f866ae..f77a8b6 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -91,6 +91,68 @@
   }
 }
 
+class _LinkedNodeCommentTypeReader
+    extends fb.Reader<idl.LinkedNodeCommentType> {
+  const _LinkedNodeCommentTypeReader() : super();
+
+  @override
+  int get size => 1;
+
+  @override
+  idl.LinkedNodeCommentType read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
+    return index < idl.LinkedNodeCommentType.values.length
+        ? idl.LinkedNodeCommentType.values[index]
+        : idl.LinkedNodeCommentType.block;
+  }
+}
+
+class _LinkedNodeFormalParameterKindReader
+    extends fb.Reader<idl.LinkedNodeFormalParameterKind> {
+  const _LinkedNodeFormalParameterKindReader() : super();
+
+  @override
+  int get size => 1;
+
+  @override
+  idl.LinkedNodeFormalParameterKind read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
+    return index < idl.LinkedNodeFormalParameterKind.values.length
+        ? idl.LinkedNodeFormalParameterKind.values[index]
+        : idl.LinkedNodeFormalParameterKind.required;
+  }
+}
+
+class _LinkedNodeKindReader extends fb.Reader<idl.LinkedNodeKind> {
+  const _LinkedNodeKindReader() : super();
+
+  @override
+  int get size => 1;
+
+  @override
+  idl.LinkedNodeKind read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
+    return index < idl.LinkedNodeKind.values.length
+        ? idl.LinkedNodeKind.values[index]
+        : idl.LinkedNodeKind.adjacentStrings;
+  }
+}
+
+class _LinkedNodeTypeKindReader extends fb.Reader<idl.LinkedNodeTypeKind> {
+  const _LinkedNodeTypeKindReader() : super();
+
+  @override
+  int get size => 1;
+
+  @override
+  idl.LinkedNodeTypeKind read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
+    return index < idl.LinkedNodeTypeKind.values.length
+        ? idl.LinkedNodeTypeKind.values[index]
+        : idl.LinkedNodeTypeKind.bottom;
+  }
+}
+
 class _ReferenceKindReader extends fb.Reader<idl.ReferenceKind> {
   const _ReferenceKindReader() : super();
 
@@ -216,6 +278,36 @@
   }
 }
 
+class _UnlinkedTokenKindReader extends fb.Reader<idl.UnlinkedTokenKind> {
+  const _UnlinkedTokenKindReader() : super();
+
+  @override
+  int get size => 1;
+
+  @override
+  idl.UnlinkedTokenKind read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
+    return index < idl.UnlinkedTokenKind.values.length
+        ? idl.UnlinkedTokenKind.values[index]
+        : idl.UnlinkedTokenKind.nothing;
+  }
+}
+
+class _UnlinkedTokenTypeReader extends fb.Reader<idl.UnlinkedTokenType> {
+  const _UnlinkedTokenTypeReader() : super();
+
+  @override
+  int get size => 1;
+
+  @override
+  idl.UnlinkedTokenType read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
+    return index < idl.UnlinkedTokenType.values.length
+        ? idl.UnlinkedTokenType.values[index]
+        : idl.UnlinkedTokenType.NOTHING;
+  }
+}
+
 class AnalysisDriverExceptionContextBuilder extends Object
     with _AnalysisDriverExceptionContextMixin
     implements idl.AnalysisDriverExceptionContext {
@@ -2114,28 +2206,46 @@
 class AvailableDeclarationBuilder extends Object
     with _AvailableDeclarationMixin
     implements idl.AvailableDeclaration {
+  String _defaultArgumentListString;
+  List<int> _defaultArgumentListTextRanges;
   String _docComplete;
   String _docSummary;
   int _fieldMask;
-  idl.AvailableDeclarationKind _kind;
   bool _isAbstract;
   bool _isConst;
   bool _isDeprecated;
   bool _isFinal;
-  String _name;
-  String _name2;
+  idl.AvailableDeclarationKind _kind;
   int _locationOffset;
   int _locationStartColumn;
   int _locationStartLine;
+  String _name;
+  String _name2;
   List<String> _parameterNames;
   String _parameters;
   List<String> _parameterTypes;
-  int _requiredParameterCount;
   List<String> _relevanceTags;
+  int _requiredParameterCount;
   String _returnType;
   String _typeParameters;
 
   @override
+  String get defaultArgumentListString => _defaultArgumentListString ??= '';
+
+  void set defaultArgumentListString(String value) {
+    this._defaultArgumentListString = value;
+  }
+
+  @override
+  List<int> get defaultArgumentListTextRanges =>
+      _defaultArgumentListTextRanges ??= <int>[];
+
+  void set defaultArgumentListTextRanges(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._defaultArgumentListTextRanges = value;
+  }
+
+  @override
   String get docComplete => _docComplete ??= '';
 
   void set docComplete(String value) {
@@ -2158,15 +2268,6 @@
   }
 
   @override
-  idl.AvailableDeclarationKind get kind =>
-      _kind ??= idl.AvailableDeclarationKind.CLASS;
-
-  /// The kind of the declaration.
-  void set kind(idl.AvailableDeclarationKind value) {
-    this._kind = value;
-  }
-
-  @override
   bool get isAbstract => _isAbstract ??= false;
 
   void set isAbstract(bool value) {
@@ -2195,21 +2296,12 @@
   }
 
   @override
-  String get name => _name ??= '';
+  idl.AvailableDeclarationKind get kind =>
+      _kind ??= idl.AvailableDeclarationKind.CLASS;
 
-  /// The first part of the declaration name, usually the only one, for example
-  /// the name of a class like `MyClass`, or a function like `myFunction`.
-  void set name(String value) {
-    this._name = value;
-  }
-
-  @override
-  String get name2 => _name2 ??= '';
-
-  /// The second, optional, part of the declaration name.  For example enum
-  /// constants all have the same [name], but their own [name2].
-  void set name2(String value) {
-    this._name2 = value;
+  /// The kind of the declaration.
+  void set kind(idl.AvailableDeclarationKind value) {
+    this._kind = value;
   }
 
   @override
@@ -2237,6 +2329,24 @@
   }
 
   @override
+  String get name => _name ??= '';
+
+  /// The first part of the declaration name, usually the only one, for example
+  /// the name of a class like `MyClass`, or a function like `myFunction`.
+  void set name(String value) {
+    this._name = value;
+  }
+
+  @override
+  String get name2 => _name2 ??= '';
+
+  /// The second, optional, part of the declaration name.  For example enum
+  /// constants all have the same [name], but their own [name2].
+  void set name2(String value) {
+    this._name2 = value;
+  }
+
+  @override
   List<String> get parameterNames => _parameterNames ??= <String>[];
 
   void set parameterNames(List<String> value) {
@@ -2258,14 +2368,6 @@
   }
 
   @override
-  int get requiredParameterCount => _requiredParameterCount ??= 0;
-
-  void set requiredParameterCount(int value) {
-    assert(value == null || value >= 0);
-    this._requiredParameterCount = value;
-  }
-
-  @override
   List<String> get relevanceTags => _relevanceTags ??= <String>[];
 
   /// The partial list of relevance tags.  Not every declaration has one (for
@@ -2277,6 +2379,14 @@
   }
 
   @override
+  int get requiredParameterCount => _requiredParameterCount ??= 0;
+
+  void set requiredParameterCount(int value) {
+    assert(value == null || value >= 0);
+    this._requiredParameterCount = value;
+  }
+
+  @override
   String get returnType => _returnType ??= '';
 
   void set returnType(String value) {
@@ -2291,44 +2401,48 @@
   }
 
   AvailableDeclarationBuilder(
-      {String docComplete,
+      {String defaultArgumentListString,
+      List<int> defaultArgumentListTextRanges,
+      String docComplete,
       String docSummary,
       int fieldMask,
-      idl.AvailableDeclarationKind kind,
       bool isAbstract,
       bool isConst,
       bool isDeprecated,
       bool isFinal,
-      String name,
-      String name2,
+      idl.AvailableDeclarationKind kind,
       int locationOffset,
       int locationStartColumn,
       int locationStartLine,
+      String name,
+      String name2,
       List<String> parameterNames,
       String parameters,
       List<String> parameterTypes,
-      int requiredParameterCount,
       List<String> relevanceTags,
+      int requiredParameterCount,
       String returnType,
       String typeParameters})
-      : _docComplete = docComplete,
+      : _defaultArgumentListString = defaultArgumentListString,
+        _defaultArgumentListTextRanges = defaultArgumentListTextRanges,
+        _docComplete = docComplete,
         _docSummary = docSummary,
         _fieldMask = fieldMask,
-        _kind = kind,
         _isAbstract = isAbstract,
         _isConst = isConst,
         _isDeprecated = isDeprecated,
         _isFinal = isFinal,
-        _name = name,
-        _name2 = name2,
+        _kind = kind,
         _locationOffset = locationOffset,
         _locationStartColumn = locationStartColumn,
         _locationStartLine = locationStartLine,
+        _name = name,
+        _name2 = name2,
         _parameterNames = parameterNames,
         _parameters = parameters,
         _parameterTypes = parameterTypes,
-        _requiredParameterCount = requiredParameterCount,
         _relevanceTags = relevanceTags,
+        _requiredParameterCount = requiredParameterCount,
         _returnType = returnType,
         _typeParameters = typeParameters;
 
@@ -2341,19 +2455,28 @@
    * Accumulate non-[informative] data into [signature].
    */
   void collectApiSignature(api_sig.ApiSignature signature) {
+    signature.addString(this._defaultArgumentListString ?? '');
+    if (this._defaultArgumentListTextRanges == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._defaultArgumentListTextRanges.length);
+      for (var x in this._defaultArgumentListTextRanges) {
+        signature.addInt(x);
+      }
+    }
     signature.addString(this._docComplete ?? '');
     signature.addString(this._docSummary ?? '');
     signature.addInt(this._fieldMask ?? 0);
-    signature.addInt(this._kind == null ? 0 : this._kind.index);
     signature.addBool(this._isAbstract == true);
     signature.addBool(this._isConst == true);
     signature.addBool(this._isDeprecated == true);
     signature.addBool(this._isFinal == true);
-    signature.addString(this._name ?? '');
-    signature.addString(this._name2 ?? '');
+    signature.addInt(this._kind == null ? 0 : this._kind.index);
     signature.addInt(this._locationOffset ?? 0);
     signature.addInt(this._locationStartColumn ?? 0);
     signature.addInt(this._locationStartLine ?? 0);
+    signature.addString(this._name ?? '');
+    signature.addString(this._name2 ?? '');
     if (this._parameterNames == null) {
       signature.addInt(0);
     } else {
@@ -2371,7 +2494,6 @@
         signature.addString(x);
       }
     }
-    signature.addInt(this._requiredParameterCount ?? 0);
     if (this._relevanceTags == null) {
       signature.addInt(0);
     } else {
@@ -2380,11 +2502,14 @@
         signature.addString(x);
       }
     }
+    signature.addInt(this._requiredParameterCount ?? 0);
     signature.addString(this._returnType ?? '');
     signature.addString(this._typeParameters ?? '');
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_defaultArgumentListString;
+    fb.Offset offset_defaultArgumentListTextRanges;
     fb.Offset offset_docComplete;
     fb.Offset offset_docSummary;
     fb.Offset offset_name;
@@ -2395,6 +2520,15 @@
     fb.Offset offset_relevanceTags;
     fb.Offset offset_returnType;
     fb.Offset offset_typeParameters;
+    if (_defaultArgumentListString != null) {
+      offset_defaultArgumentListString =
+          fbBuilder.writeString(_defaultArgumentListString);
+    }
+    if (!(_defaultArgumentListTextRanges == null ||
+        _defaultArgumentListTextRanges.isEmpty)) {
+      offset_defaultArgumentListTextRanges =
+          fbBuilder.writeListUint32(_defaultArgumentListTextRanges);
+    }
     if (_docComplete != null) {
       offset_docComplete = fbBuilder.writeString(_docComplete);
     }
@@ -2429,35 +2563,35 @@
       offset_typeParameters = fbBuilder.writeString(_typeParameters);
     }
     fbBuilder.startTable();
+    if (offset_defaultArgumentListString != null) {
+      fbBuilder.addOffset(0, offset_defaultArgumentListString);
+    }
+    if (offset_defaultArgumentListTextRanges != null) {
+      fbBuilder.addOffset(1, offset_defaultArgumentListTextRanges);
+    }
     if (offset_docComplete != null) {
-      fbBuilder.addOffset(0, offset_docComplete);
+      fbBuilder.addOffset(2, offset_docComplete);
     }
     if (offset_docSummary != null) {
-      fbBuilder.addOffset(1, offset_docSummary);
+      fbBuilder.addOffset(3, offset_docSummary);
     }
     if (_fieldMask != null && _fieldMask != 0) {
-      fbBuilder.addUint32(2, _fieldMask);
-    }
-    if (_kind != null && _kind != idl.AvailableDeclarationKind.CLASS) {
-      fbBuilder.addUint8(3, _kind.index);
+      fbBuilder.addUint32(4, _fieldMask);
     }
     if (_isAbstract == true) {
-      fbBuilder.addBool(4, true);
-    }
-    if (_isConst == true) {
       fbBuilder.addBool(5, true);
     }
-    if (_isDeprecated == true) {
+    if (_isConst == true) {
       fbBuilder.addBool(6, true);
     }
-    if (_isFinal == true) {
+    if (_isDeprecated == true) {
       fbBuilder.addBool(7, true);
     }
-    if (offset_name != null) {
-      fbBuilder.addOffset(8, offset_name);
+    if (_isFinal == true) {
+      fbBuilder.addBool(8, true);
     }
-    if (offset_name2 != null) {
-      fbBuilder.addOffset(9, offset_name2);
+    if (_kind != null && _kind != idl.AvailableDeclarationKind.CLASS) {
+      fbBuilder.addUint8(9, _kind.index);
     }
     if (_locationOffset != null && _locationOffset != 0) {
       fbBuilder.addUint32(10, _locationOffset);
@@ -2468,26 +2602,32 @@
     if (_locationStartLine != null && _locationStartLine != 0) {
       fbBuilder.addUint32(12, _locationStartLine);
     }
+    if (offset_name != null) {
+      fbBuilder.addOffset(13, offset_name);
+    }
+    if (offset_name2 != null) {
+      fbBuilder.addOffset(14, offset_name2);
+    }
     if (offset_parameterNames != null) {
-      fbBuilder.addOffset(13, offset_parameterNames);
+      fbBuilder.addOffset(15, offset_parameterNames);
     }
     if (offset_parameters != null) {
-      fbBuilder.addOffset(14, offset_parameters);
+      fbBuilder.addOffset(16, offset_parameters);
     }
     if (offset_parameterTypes != null) {
-      fbBuilder.addOffset(15, offset_parameterTypes);
-    }
-    if (_requiredParameterCount != null && _requiredParameterCount != 0) {
-      fbBuilder.addUint32(16, _requiredParameterCount);
+      fbBuilder.addOffset(17, offset_parameterTypes);
     }
     if (offset_relevanceTags != null) {
-      fbBuilder.addOffset(17, offset_relevanceTags);
+      fbBuilder.addOffset(18, offset_relevanceTags);
+    }
+    if (_requiredParameterCount != null && _requiredParameterCount != 0) {
+      fbBuilder.addUint32(19, _requiredParameterCount);
     }
     if (offset_returnType != null) {
-      fbBuilder.addOffset(18, offset_returnType);
+      fbBuilder.addOffset(20, offset_returnType);
     }
     if (offset_typeParameters != null) {
-      fbBuilder.addOffset(19, offset_typeParameters);
+      fbBuilder.addOffset(21, offset_typeParameters);
     }
     return fbBuilder.endTable();
   }
@@ -2510,86 +2650,90 @@
 
   _AvailableDeclarationImpl(this._bc, this._bcOffset);
 
+  String _defaultArgumentListString;
+  List<int> _defaultArgumentListTextRanges;
   String _docComplete;
   String _docSummary;
   int _fieldMask;
-  idl.AvailableDeclarationKind _kind;
   bool _isAbstract;
   bool _isConst;
   bool _isDeprecated;
   bool _isFinal;
-  String _name;
-  String _name2;
+  idl.AvailableDeclarationKind _kind;
   int _locationOffset;
   int _locationStartColumn;
   int _locationStartLine;
+  String _name;
+  String _name2;
   List<String> _parameterNames;
   String _parameters;
   List<String> _parameterTypes;
-  int _requiredParameterCount;
   List<String> _relevanceTags;
+  int _requiredParameterCount;
   String _returnType;
   String _typeParameters;
 
   @override
+  String get defaultArgumentListString {
+    _defaultArgumentListString ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
+    return _defaultArgumentListString;
+  }
+
+  @override
+  List<int> get defaultArgumentListTextRanges {
+    _defaultArgumentListTextRanges ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 1, const <int>[]);
+    return _defaultArgumentListTextRanges;
+  }
+
+  @override
   String get docComplete {
-    _docComplete ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
+    _docComplete ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 2, '');
     return _docComplete;
   }
 
   @override
   String get docSummary {
-    _docSummary ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
+    _docSummary ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 3, '');
     return _docSummary;
   }
 
   @override
   int get fieldMask {
-    _fieldMask ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
+    _fieldMask ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 4, 0);
     return _fieldMask;
   }
 
   @override
-  idl.AvailableDeclarationKind get kind {
-    _kind ??= const _AvailableDeclarationKindReader()
-        .vTableGet(_bc, _bcOffset, 3, idl.AvailableDeclarationKind.CLASS);
-    return _kind;
-  }
-
-  @override
   bool get isAbstract {
-    _isAbstract ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 4, false);
+    _isAbstract ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 5, false);
     return _isAbstract;
   }
 
   @override
   bool get isConst {
-    _isConst ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 5, false);
+    _isConst ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 6, false);
     return _isConst;
   }
 
   @override
   bool get isDeprecated {
-    _isDeprecated ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 6, false);
+    _isDeprecated ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 7, false);
     return _isDeprecated;
   }
 
   @override
   bool get isFinal {
-    _isFinal ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 7, false);
+    _isFinal ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 8, false);
     return _isFinal;
   }
 
   @override
-  String get name {
-    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 8, '');
-    return _name;
-  }
-
-  @override
-  String get name2 {
-    _name2 ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 9, '');
-    return _name2;
+  idl.AvailableDeclarationKind get kind {
+    _kind ??= const _AvailableDeclarationKindReader()
+        .vTableGet(_bc, _bcOffset, 9, idl.AvailableDeclarationKind.CLASS);
+    return _kind;
   }
 
   @override
@@ -2614,49 +2758,61 @@
   }
 
   @override
+  String get name {
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 13, '');
+    return _name;
+  }
+
+  @override
+  String get name2 {
+    _name2 ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 14, '');
+    return _name2;
+  }
+
+  @override
   List<String> get parameterNames {
     _parameterNames ??= const fb.ListReader<String>(const fb.StringReader())
-        .vTableGet(_bc, _bcOffset, 13, const <String>[]);
+        .vTableGet(_bc, _bcOffset, 15, const <String>[]);
     return _parameterNames;
   }
 
   @override
   String get parameters {
-    _parameters ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 14, '');
+    _parameters ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 16, '');
     return _parameters;
   }
 
   @override
   List<String> get parameterTypes {
     _parameterTypes ??= const fb.ListReader<String>(const fb.StringReader())
-        .vTableGet(_bc, _bcOffset, 15, const <String>[]);
+        .vTableGet(_bc, _bcOffset, 17, const <String>[]);
     return _parameterTypes;
   }
 
   @override
-  int get requiredParameterCount {
-    _requiredParameterCount ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
-    return _requiredParameterCount;
-  }
-
-  @override
   List<String> get relevanceTags {
     _relevanceTags ??= const fb.ListReader<String>(const fb.StringReader())
-        .vTableGet(_bc, _bcOffset, 17, const <String>[]);
+        .vTableGet(_bc, _bcOffset, 18, const <String>[]);
     return _relevanceTags;
   }
 
   @override
+  int get requiredParameterCount {
+    _requiredParameterCount ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _requiredParameterCount;
+  }
+
+  @override
   String get returnType {
-    _returnType ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 18, '');
+    _returnType ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 20, '');
     return _returnType;
   }
 
   @override
   String get typeParameters {
     _typeParameters ??=
-        const fb.StringReader().vTableGet(_bc, _bcOffset, 19, '');
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 21, '');
     return _typeParameters;
   }
 }
@@ -2665,28 +2821,32 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
+    if (defaultArgumentListString != '')
+      _result["defaultArgumentListString"] = defaultArgumentListString;
+    if (defaultArgumentListTextRanges.isNotEmpty)
+      _result["defaultArgumentListTextRanges"] = defaultArgumentListTextRanges;
     if (docComplete != '') _result["docComplete"] = docComplete;
     if (docSummary != '') _result["docSummary"] = docSummary;
     if (fieldMask != 0) _result["fieldMask"] = fieldMask;
-    if (kind != idl.AvailableDeclarationKind.CLASS)
-      _result["kind"] = kind.toString().split('.')[1];
     if (isAbstract != false) _result["isAbstract"] = isAbstract;
     if (isConst != false) _result["isConst"] = isConst;
     if (isDeprecated != false) _result["isDeprecated"] = isDeprecated;
     if (isFinal != false) _result["isFinal"] = isFinal;
-    if (name != '') _result["name"] = name;
-    if (name2 != '') _result["name2"] = name2;
+    if (kind != idl.AvailableDeclarationKind.CLASS)
+      _result["kind"] = kind.toString().split('.')[1];
     if (locationOffset != 0) _result["locationOffset"] = locationOffset;
     if (locationStartColumn != 0)
       _result["locationStartColumn"] = locationStartColumn;
     if (locationStartLine != 0)
       _result["locationStartLine"] = locationStartLine;
+    if (name != '') _result["name"] = name;
+    if (name2 != '') _result["name2"] = name2;
     if (parameterNames.isNotEmpty) _result["parameterNames"] = parameterNames;
     if (parameters != '') _result["parameters"] = parameters;
     if (parameterTypes.isNotEmpty) _result["parameterTypes"] = parameterTypes;
+    if (relevanceTags.isNotEmpty) _result["relevanceTags"] = relevanceTags;
     if (requiredParameterCount != 0)
       _result["requiredParameterCount"] = requiredParameterCount;
-    if (relevanceTags.isNotEmpty) _result["relevanceTags"] = relevanceTags;
     if (returnType != '') _result["returnType"] = returnType;
     if (typeParameters != '') _result["typeParameters"] = typeParameters;
     return _result;
@@ -2694,24 +2854,26 @@
 
   @override
   Map<String, Object> toMap() => {
+        "defaultArgumentListString": defaultArgumentListString,
+        "defaultArgumentListTextRanges": defaultArgumentListTextRanges,
         "docComplete": docComplete,
         "docSummary": docSummary,
         "fieldMask": fieldMask,
-        "kind": kind,
         "isAbstract": isAbstract,
         "isConst": isConst,
         "isDeprecated": isDeprecated,
         "isFinal": isFinal,
-        "name": name,
-        "name2": name2,
+        "kind": kind,
         "locationOffset": locationOffset,
         "locationStartColumn": locationStartColumn,
         "locationStartLine": locationStartLine,
+        "name": name,
+        "name2": name2,
         "parameterNames": parameterNames,
         "parameters": parameters,
         "parameterTypes": parameterTypes,
-        "requiredParameterCount": requiredParameterCount,
         "relevanceTags": relevanceTags,
+        "requiredParameterCount": requiredParameterCount,
         "returnType": returnType,
         "typeParameters": typeParameters,
       };
@@ -4374,6 +4536,13583 @@
   String toString() => convert.json.encode(toJson());
 }
 
+class LinkedNodeBuilder extends Object
+    with _LinkedNodeMixin
+    implements idl.LinkedNode {
+  List<LinkedNodeBuilder> _variantField_2;
+  LinkedNodeBuilder _variantField_11;
+  List<LinkedNodeBuilder> _variantField_4;
+  LinkedNodeBuilder _variantField_6;
+  int _variantField_15;
+  LinkedNodeBuilder _variantField_7;
+  LinkedNodeBuilder _variantField_8;
+  int _variantField_16;
+  int _variantField_17;
+  int _variantField_18;
+  int _variantField_19;
+  LinkedNodeTypeBuilder _variantField_24;
+  bool _variantField_27;
+  LinkedNodeBuilder _variantField_9;
+  LinkedNodeBuilder _variantField_12;
+  List<LinkedNodeBuilder> _variantField_5;
+  LinkedNodeBuilder _variantField_13;
+  List<int> _variantField_28;
+  idl.LinkedNodeCommentType _variantField_29;
+  List<LinkedNodeBuilder> _variantField_3;
+  LinkedNodeBuilder _variantField_10;
+  double _variantField_21;
+  LinkedNodeTypeBuilder _variantField_25;
+  idl.LinkedNodeFormalParameterKind _variantField_26;
+  String _variantField_30;
+  LinkedNodeBuilder _variantField_14;
+  bool _isSynthetic;
+  idl.LinkedNodeKind _kind;
+  String _variantField_23;
+  bool _variantField_31;
+  String _variantField_20;
+  String _variantField_22;
+
+  @override
+  List<LinkedNodeBuilder> get adjacentStrings_strings {
+    assert(kind == idl.LinkedNodeKind.adjacentStrings);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get argumentList_arguments {
+    assert(kind == idl.LinkedNodeKind.argumentList);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get block_statements {
+    assert(kind == idl.LinkedNodeKind.block);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get cascadeExpression_sections {
+    assert(kind == idl.LinkedNodeKind.cascadeExpression);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get compilationUnit_declarations {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get constructorDeclaration_initializers {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get dottedName_components {
+    assert(kind == idl.LinkedNodeKind.dottedName);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get enumDeclaration_constants {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get formalParameterList_parameters {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get hideCombinator_hiddenNames {
+    assert(kind == idl.LinkedNodeKind.hideCombinator);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get implementsClause_interfaces {
+    assert(kind == idl.LinkedNodeKind.implementsClause);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get labeledStatement_labels {
+    assert(kind == idl.LinkedNodeKind.labeledStatement);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get libraryIdentifier_components {
+    assert(kind == idl.LinkedNodeKind.libraryIdentifier);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get listLiteral_elements {
+    assert(kind == idl.LinkedNodeKind.listLiteral);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get namespaceDirective_combinators {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get onClause_superclassConstraints {
+    assert(kind == idl.LinkedNodeKind.onClause);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get setOrMapLiteral_elements {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get showCombinator_shownNames {
+    assert(kind == idl.LinkedNodeKind.showCombinator);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get stringInterpolation_elements {
+    assert(kind == idl.LinkedNodeKind.stringInterpolation);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get switchStatement_members {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get tryStatement_catchClauses {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get typeArgumentList_arguments {
+    assert(kind == idl.LinkedNodeKind.typeArgumentList);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get typeParameterList_typeParameters {
+    assert(kind == idl.LinkedNodeKind.typeParameterList);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get variableDeclarationList_variables {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationList);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get withClause_mixinTypes {
+    assert(kind == idl.LinkedNodeKind.withClause);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  void set adjacentStrings_strings(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.adjacentStrings);
+    _variantField_2 = value;
+  }
+
+  void set argumentList_arguments(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.argumentList);
+    _variantField_2 = value;
+  }
+
+  void set block_statements(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.block);
+    _variantField_2 = value;
+  }
+
+  void set cascadeExpression_sections(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.cascadeExpression);
+    _variantField_2 = value;
+  }
+
+  void set compilationUnit_declarations(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    _variantField_2 = value;
+  }
+
+  void set constructorDeclaration_initializers(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_2 = value;
+  }
+
+  void set dottedName_components(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.dottedName);
+    _variantField_2 = value;
+  }
+
+  void set enumDeclaration_constants(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    _variantField_2 = value;
+  }
+
+  void set formalParameterList_parameters(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    _variantField_2 = value;
+  }
+
+  void set hideCombinator_hiddenNames(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.hideCombinator);
+    _variantField_2 = value;
+  }
+
+  void set implementsClause_interfaces(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.implementsClause);
+    _variantField_2 = value;
+  }
+
+  void set labeledStatement_labels(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.labeledStatement);
+    _variantField_2 = value;
+  }
+
+  void set libraryIdentifier_components(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.libraryIdentifier);
+    _variantField_2 = value;
+  }
+
+  void set listLiteral_elements(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.listLiteral);
+    _variantField_2 = value;
+  }
+
+  void set namespaceDirective_combinators(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective);
+    _variantField_2 = value;
+  }
+
+  void set onClause_superclassConstraints(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.onClause);
+    _variantField_2 = value;
+  }
+
+  void set setOrMapLiteral_elements(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    _variantField_2 = value;
+  }
+
+  void set showCombinator_shownNames(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.showCombinator);
+    _variantField_2 = value;
+  }
+
+  void set stringInterpolation_elements(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.stringInterpolation);
+    _variantField_2 = value;
+  }
+
+  void set switchStatement_members(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    _variantField_2 = value;
+  }
+
+  void set tryStatement_catchClauses(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    _variantField_2 = value;
+  }
+
+  void set typeArgumentList_arguments(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.typeArgumentList);
+    _variantField_2 = value;
+  }
+
+  void set typeParameterList_typeParameters(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.typeParameterList);
+    _variantField_2 = value;
+  }
+
+  void set variableDeclarationList_variables(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationList);
+    _variantField_2 = value;
+  }
+
+  void set withClause_mixinTypes(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.withClause);
+    _variantField_2 = value;
+  }
+
+  @override
+  LinkedNodeBuilder get annotatedNode_comment {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.constructorDeclaration ||
+        kind == idl.LinkedNodeKind.declaredIdentifier ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.enumConstantDeclaration ||
+        kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.fieldDeclaration ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.methodDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective ||
+        kind == idl.LinkedNodeKind.topLevelVariableDeclaration ||
+        kind == idl.LinkedNodeKind.typeParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration ||
+        kind == idl.LinkedNodeKind.variableDeclarationList);
+    return _variantField_11;
+  }
+
+  void set annotatedNode_comment(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.constructorDeclaration ||
+        kind == idl.LinkedNodeKind.declaredIdentifier ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.enumConstantDeclaration ||
+        kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.fieldDeclaration ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.methodDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective ||
+        kind == idl.LinkedNodeKind.topLevelVariableDeclaration ||
+        kind == idl.LinkedNodeKind.typeParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration ||
+        kind == idl.LinkedNodeKind.variableDeclarationList);
+    _variantField_11 = value;
+  }
+
+  @override
+  List<LinkedNodeBuilder> get annotatedNode_metadata {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.constructorDeclaration ||
+        kind == idl.LinkedNodeKind.declaredIdentifier ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.enumConstantDeclaration ||
+        kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.fieldDeclaration ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.methodDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective ||
+        kind == idl.LinkedNodeKind.topLevelVariableDeclaration ||
+        kind == idl.LinkedNodeKind.typeParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration ||
+        kind == idl.LinkedNodeKind.variableDeclarationList);
+    return _variantField_4 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get normalFormalParameter_metadata {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    return _variantField_4 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get switchMember_statements {
+    assert(kind == idl.LinkedNodeKind.switchCase ||
+        kind == idl.LinkedNodeKind.switchDefault);
+    return _variantField_4 ??= <LinkedNodeBuilder>[];
+  }
+
+  void set annotatedNode_metadata(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.constructorDeclaration ||
+        kind == idl.LinkedNodeKind.declaredIdentifier ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.enumConstantDeclaration ||
+        kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.fieldDeclaration ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.methodDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective ||
+        kind == idl.LinkedNodeKind.topLevelVariableDeclaration ||
+        kind == idl.LinkedNodeKind.typeParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration ||
+        kind == idl.LinkedNodeKind.variableDeclarationList);
+    _variantField_4 = value;
+  }
+
+  void set normalFormalParameter_metadata(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    _variantField_4 = value;
+  }
+
+  void set switchMember_statements(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.switchCase ||
+        kind == idl.LinkedNodeKind.switchDefault);
+    _variantField_4 = value;
+  }
+
+  @override
+  LinkedNodeBuilder get annotation_arguments {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get asExpression_expression {
+    assert(kind == idl.LinkedNodeKind.asExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get assertInitializer_condition {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get assertStatement_condition {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get assignmentExpression_leftHandSide {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get awaitExpression_expression {
+    assert(kind == idl.LinkedNodeKind.awaitExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get binaryExpression_leftOperand {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get blockFunctionBody_block {
+    assert(kind == idl.LinkedNodeKind.blockFunctionBody);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get breakStatement_label {
+    assert(kind == idl.LinkedNodeKind.breakStatement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get cascadeExpression_target {
+    assert(kind == idl.LinkedNodeKind.cascadeExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get catchClause_body {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get classDeclaration_extendsClause {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get classTypeAlias_typeParameters {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get compilationUnit_scriptTag {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get conditionalExpression_condition {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get configuration_name {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get constructorDeclaration_body {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get constructorFieldInitializer_expression {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get constructorName_name {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get continueStatement_label {
+    assert(kind == idl.LinkedNodeKind.continueStatement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get declaredIdentifier_identifier {
+    assert(kind == idl.LinkedNodeKind.declaredIdentifier);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get defaultFormalParameter_defaultValue {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get doStatement_body {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get enumConstantDeclaration_name {
+    assert(kind == idl.LinkedNodeKind.enumConstantDeclaration);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get expressionFunctionBody_expression {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get expressionStatement_expression {
+    assert(kind == idl.LinkedNodeKind.expressionStatement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get extendsClause_superclass {
+    assert(kind == idl.LinkedNodeKind.extendsClause);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get fieldDeclaration_fields {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get fieldFormalParameter_type {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get forEachParts_iterable {
+    assert(kind == idl.LinkedNodeKind.forEachPartsWithDeclaration ||
+        kind == idl.LinkedNodeKind.forEachPartsWithIdentifier);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get forMixin_forLoopParts {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get forParts_condition {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
+        kind == idl.LinkedNodeKind.forPartsWithExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get functionDeclaration_functionExpression {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get functionDeclarationStatement_functionDeclaration {
+    assert(kind == idl.LinkedNodeKind.functionDeclarationStatement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get functionExpression_body {
+    assert(kind == idl.LinkedNodeKind.functionExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get functionExpressionInvocation_function {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get functionTypeAlias_formalParameters {
+    assert(kind == idl.LinkedNodeKind.functionTypeAlias);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get functionTypedFormalParameter_formalParameters {
+    assert(kind == idl.LinkedNodeKind.functionTypedFormalParameter);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get genericFunctionType_typeParameters {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get genericTypeAlias_typeParameters {
+    assert(kind == idl.LinkedNodeKind.genericTypeAlias);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get ifMixin_condition {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get importDirective_prefix {
+    assert(kind == idl.LinkedNodeKind.importDirective);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get indexExpression_index {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get instanceCreationExpression_arguments {
+    assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get interpolationExpression_expression {
+    assert(kind == idl.LinkedNodeKind.interpolationExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get isExpression_expression {
+    assert(kind == idl.LinkedNodeKind.isExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get label_label {
+    assert(kind == idl.LinkedNodeKind.label);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get labeledStatement_statement {
+    assert(kind == idl.LinkedNodeKind.labeledStatement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get libraryDirective_name {
+    assert(kind == idl.LinkedNodeKind.libraryDirective);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get mapLiteralEntry_key {
+    assert(kind == idl.LinkedNodeKind.mapLiteralEntry);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get methodDeclaration_body {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get methodInvocation_methodName {
+    assert(kind == idl.LinkedNodeKind.methodInvocation);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get mixinDeclaration_onClause {
+    assert(kind == idl.LinkedNodeKind.mixinDeclaration);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get namedExpression_expression {
+    assert(kind == idl.LinkedNodeKind.namedExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get parenthesizedExpression_expression {
+    assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get partOfDirective_libraryName {
+    assert(kind == idl.LinkedNodeKind.partOfDirective);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get postfixExpression_operand {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get prefixedIdentifier_identifier {
+    assert(kind == idl.LinkedNodeKind.prefixedIdentifier);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get prefixExpression_operand {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get propertyAccess_propertyName {
+    assert(kind == idl.LinkedNodeKind.propertyAccess);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get redirectingConstructorInvocation_arguments {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get returnStatement_expression {
+    assert(kind == idl.LinkedNodeKind.returnStatement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get simpleFormalParameter_type {
+    assert(kind == idl.LinkedNodeKind.simpleFormalParameter);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get spreadElement_expression {
+    assert(kind == idl.LinkedNodeKind.spreadElement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get superConstructorInvocation_arguments {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get switchCase_expression {
+    assert(kind == idl.LinkedNodeKind.switchCase);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get throwExpression_expression {
+    assert(kind == idl.LinkedNodeKind.throwExpression);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get topLevelVariableDeclaration_variableList {
+    assert(kind == idl.LinkedNodeKind.topLevelVariableDeclaration);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get tryStatement_body {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get typeName_name {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get typeParameter_bound {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get variableDeclaration_initializer {
+    assert(kind == idl.LinkedNodeKind.variableDeclaration);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get variableDeclarationList_type {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationList);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get variableDeclarationStatement_variables {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationStatement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get whileStatement_body {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get yieldStatement_expression {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    return _variantField_6;
+  }
+
+  void set annotation_arguments(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_6 = value;
+  }
+
+  void set asExpression_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.asExpression);
+    _variantField_6 = value;
+  }
+
+  void set assertInitializer_condition(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    _variantField_6 = value;
+  }
+
+  void set assertStatement_condition(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    _variantField_6 = value;
+  }
+
+  void set assignmentExpression_leftHandSide(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    _variantField_6 = value;
+  }
+
+  void set awaitExpression_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.awaitExpression);
+    _variantField_6 = value;
+  }
+
+  void set binaryExpression_leftOperand(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_6 = value;
+  }
+
+  void set blockFunctionBody_block(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.blockFunctionBody);
+    _variantField_6 = value;
+  }
+
+  void set breakStatement_label(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.breakStatement);
+    _variantField_6 = value;
+  }
+
+  void set cascadeExpression_target(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.cascadeExpression);
+    _variantField_6 = value;
+  }
+
+  void set catchClause_body(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_6 = value;
+  }
+
+  void set classDeclaration_extendsClause(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    _variantField_6 = value;
+  }
+
+  void set classTypeAlias_typeParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    _variantField_6 = value;
+  }
+
+  void set compilationUnit_scriptTag(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    _variantField_6 = value;
+  }
+
+  void set conditionalExpression_condition(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    _variantField_6 = value;
+  }
+
+  void set configuration_name(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    _variantField_6 = value;
+  }
+
+  void set constructorDeclaration_body(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_6 = value;
+  }
+
+  void set constructorFieldInitializer_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    _variantField_6 = value;
+  }
+
+  void set constructorName_name(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    _variantField_6 = value;
+  }
+
+  void set continueStatement_label(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.continueStatement);
+    _variantField_6 = value;
+  }
+
+  void set declaredIdentifier_identifier(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.declaredIdentifier);
+    _variantField_6 = value;
+  }
+
+  void set defaultFormalParameter_defaultValue(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    _variantField_6 = value;
+  }
+
+  void set doStatement_body(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    _variantField_6 = value;
+  }
+
+  void set enumConstantDeclaration_name(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.enumConstantDeclaration);
+    _variantField_6 = value;
+  }
+
+  void set expressionFunctionBody_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    _variantField_6 = value;
+  }
+
+  void set expressionStatement_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.expressionStatement);
+    _variantField_6 = value;
+  }
+
+  void set extendsClause_superclass(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.extendsClause);
+    _variantField_6 = value;
+  }
+
+  void set fieldDeclaration_fields(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    _variantField_6 = value;
+  }
+
+  void set fieldFormalParameter_type(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    _variantField_6 = value;
+  }
+
+  void set forEachParts_iterable(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.forEachPartsWithDeclaration ||
+        kind == idl.LinkedNodeKind.forEachPartsWithIdentifier);
+    _variantField_6 = value;
+  }
+
+  void set forMixin_forLoopParts(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    _variantField_6 = value;
+  }
+
+  void set forParts_condition(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
+        kind == idl.LinkedNodeKind.forPartsWithExpression);
+    _variantField_6 = value;
+  }
+
+  void set functionDeclaration_functionExpression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration);
+    _variantField_6 = value;
+  }
+
+  void set functionDeclarationStatement_functionDeclaration(
+      LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionDeclarationStatement);
+    _variantField_6 = value;
+  }
+
+  void set functionExpression_body(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionExpression);
+    _variantField_6 = value;
+  }
+
+  void set functionExpressionInvocation_function(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation);
+    _variantField_6 = value;
+  }
+
+  void set functionTypeAlias_formalParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionTypeAlias);
+    _variantField_6 = value;
+  }
+
+  void set functionTypedFormalParameter_formalParameters(
+      LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionTypedFormalParameter);
+    _variantField_6 = value;
+  }
+
+  void set genericFunctionType_typeParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    _variantField_6 = value;
+  }
+
+  void set genericTypeAlias_typeParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.genericTypeAlias);
+    _variantField_6 = value;
+  }
+
+  void set ifMixin_condition(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    _variantField_6 = value;
+  }
+
+  void set importDirective_prefix(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.importDirective);
+    _variantField_6 = value;
+  }
+
+  void set indexExpression_index(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_6 = value;
+  }
+
+  void set instanceCreationExpression_arguments(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
+    _variantField_6 = value;
+  }
+
+  void set interpolationExpression_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.interpolationExpression);
+    _variantField_6 = value;
+  }
+
+  void set isExpression_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.isExpression);
+    _variantField_6 = value;
+  }
+
+  void set label_label(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.label);
+    _variantField_6 = value;
+  }
+
+  void set labeledStatement_statement(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.labeledStatement);
+    _variantField_6 = value;
+  }
+
+  void set libraryDirective_name(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.libraryDirective);
+    _variantField_6 = value;
+  }
+
+  void set mapLiteralEntry_key(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.mapLiteralEntry);
+    _variantField_6 = value;
+  }
+
+  void set methodDeclaration_body(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_6 = value;
+  }
+
+  void set methodInvocation_methodName(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.methodInvocation);
+    _variantField_6 = value;
+  }
+
+  void set mixinDeclaration_onClause(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_6 = value;
+  }
+
+  void set namedExpression_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.namedExpression);
+    _variantField_6 = value;
+  }
+
+  void set parenthesizedExpression_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
+    _variantField_6 = value;
+  }
+
+  void set partOfDirective_libraryName(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.partOfDirective);
+    _variantField_6 = value;
+  }
+
+  void set postfixExpression_operand(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    _variantField_6 = value;
+  }
+
+  void set prefixedIdentifier_identifier(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.prefixedIdentifier);
+    _variantField_6 = value;
+  }
+
+  void set prefixExpression_operand(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    _variantField_6 = value;
+  }
+
+  void set propertyAccess_propertyName(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.propertyAccess);
+    _variantField_6 = value;
+  }
+
+  void set redirectingConstructorInvocation_arguments(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_6 = value;
+  }
+
+  void set returnStatement_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.returnStatement);
+    _variantField_6 = value;
+  }
+
+  void set simpleFormalParameter_type(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.simpleFormalParameter);
+    _variantField_6 = value;
+  }
+
+  void set spreadElement_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.spreadElement);
+    _variantField_6 = value;
+  }
+
+  void set superConstructorInvocation_arguments(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_6 = value;
+  }
+
+  void set switchCase_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.switchCase);
+    _variantField_6 = value;
+  }
+
+  void set throwExpression_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.throwExpression);
+    _variantField_6 = value;
+  }
+
+  void set topLevelVariableDeclaration_variableList(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.topLevelVariableDeclaration);
+    _variantField_6 = value;
+  }
+
+  void set tryStatement_body(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    _variantField_6 = value;
+  }
+
+  void set typeName_name(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    _variantField_6 = value;
+  }
+
+  void set typeParameter_bound(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    _variantField_6 = value;
+  }
+
+  void set variableDeclaration_initializer(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.variableDeclaration);
+    _variantField_6 = value;
+  }
+
+  void set variableDeclarationList_type(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationList);
+    _variantField_6 = value;
+  }
+
+  void set variableDeclarationStatement_variables(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationStatement);
+    _variantField_6 = value;
+  }
+
+  void set whileStatement_body(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    _variantField_6 = value;
+  }
+
+  void set yieldStatement_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    _variantField_6 = value;
+  }
+
+  @override
+  int get annotation_atSign {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get argumentList_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.argumentList);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get asExpression_asOperator {
+    assert(kind == idl.LinkedNodeKind.asExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get assertInitializer_assertKeyword {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get assertStatement_assertKeyword {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get assignmentExpression_element {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get awaitExpression_awaitKeyword {
+    assert(kind == idl.LinkedNodeKind.awaitExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get binaryExpression_element {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get block_leftBracket {
+    assert(kind == idl.LinkedNodeKind.block);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get blockFunctionBody_keyword {
+    assert(kind == idl.LinkedNodeKind.blockFunctionBody);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get booleanLiteral_literal {
+    assert(kind == idl.LinkedNodeKind.booleanLiteral);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get breakStatement_breakKeyword {
+    assert(kind == idl.LinkedNodeKind.breakStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get catchClause_catchKeyword {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get classDeclaration_abstractKeyword {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get classTypeAlias_abstractKeyword {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get compilationUnit_beginToken {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get conditionalExpression_colon {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get configuration_ifKeyword {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get constructorDeclaration_constKeyword {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get constructorFieldInitializer_equals {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get constructorName_element {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get continueStatement_continueKeyword {
+    assert(kind == idl.LinkedNodeKind.continueStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get declaredIdentifier_keyword {
+    assert(kind == idl.LinkedNodeKind.declaredIdentifier);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get defaultFormalParameter_separator {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get doStatement_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get doubleLiteral_literal {
+    assert(kind == idl.LinkedNodeKind.doubleLiteral);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get emptyFunctionBody_semicolon {
+    assert(kind == idl.LinkedNodeKind.emptyFunctionBody);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get emptyStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.emptyStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get enumDeclaration_enumKeyword {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get expressionFunctionBody_arrow {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get expressionStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.expressionStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get extendsClause_extendsKeyword {
+    assert(kind == idl.LinkedNodeKind.extendsClause);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get fieldDeclaration_covariantKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get fieldFormalParameter_keyword {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get forEachParts_inKeyword {
+    assert(kind == idl.LinkedNodeKind.forEachPartsWithDeclaration ||
+        kind == idl.LinkedNodeKind.forEachPartsWithIdentifier);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get formalParameterList_leftDelimiter {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get forMixin_awaitKeyword {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get forParts_leftSeparator {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
+        kind == idl.LinkedNodeKind.forPartsWithExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get functionDeclaration_externalKeyword {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get genericFunctionType_functionKeyword {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get ifMixin_elseKeyword {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get implementsClause_implementsKeyword {
+    assert(kind == idl.LinkedNodeKind.implementsClause);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get importDirective_asKeyword {
+    assert(kind == idl.LinkedNodeKind.importDirective);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get indexExpression_element {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get instanceCreationExpression_keyword {
+    assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get integerLiteral_literal {
+    assert(kind == idl.LinkedNodeKind.integerLiteral);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get interpolationExpression_leftBracket {
+    assert(kind == idl.LinkedNodeKind.interpolationExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get interpolationString_token {
+    assert(kind == idl.LinkedNodeKind.interpolationString);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get isExpression_isOperator {
+    assert(kind == idl.LinkedNodeKind.isExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get label_colon {
+    assert(kind == idl.LinkedNodeKind.label);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get listLiteral_leftBracket {
+    assert(kind == idl.LinkedNodeKind.listLiteral);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get mapLiteralEntry_separator {
+    assert(kind == idl.LinkedNodeKind.mapLiteralEntry);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get methodDeclaration_externalKeyword {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get methodInvocation_operator {
+    assert(kind == idl.LinkedNodeKind.methodInvocation);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get mixinDeclaration_mixinKeyword {
+    assert(kind == idl.LinkedNodeKind.mixinDeclaration);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get nullLiteral_literal {
+    assert(kind == idl.LinkedNodeKind.nullLiteral);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get onClause_onKeyword {
+    assert(kind == idl.LinkedNodeKind.onClause);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get parenthesizedExpression_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get partOfDirective_semicolon {
+    assert(kind == idl.LinkedNodeKind.partOfDirective);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get postfixExpression_element {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get prefixedIdentifier_period {
+    assert(kind == idl.LinkedNodeKind.prefixedIdentifier);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get prefixExpression_element {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get propertyAccess_operator {
+    assert(kind == idl.LinkedNodeKind.propertyAccess);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get redirectingConstructorInvocation_element {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get rethrowExpression_rethrowKeyword {
+    assert(kind == idl.LinkedNodeKind.rethrowExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get returnStatement_returnKeyword {
+    assert(kind == idl.LinkedNodeKind.returnStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get scriptTag_scriptTag {
+    assert(kind == idl.LinkedNodeKind.scriptTag);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get setOrMapLiteral_leftBracket {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get simpleFormalParameter_keyword {
+    assert(kind == idl.LinkedNodeKind.simpleFormalParameter);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get simpleIdentifier_element {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get simpleStringLiteral_token {
+    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get spreadElement_spreadOperator {
+    assert(kind == idl.LinkedNodeKind.spreadElement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get superConstructorInvocation_element {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get superExpression_superKeyword {
+    assert(kind == idl.LinkedNodeKind.superExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get switchMember_keyword {
+    assert(kind == idl.LinkedNodeKind.switchCase ||
+        kind == idl.LinkedNodeKind.switchDefault);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get switchStatement_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get symbolLiteral_poundSign {
+    assert(kind == idl.LinkedNodeKind.symbolLiteral);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get thisExpression_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.thisExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get throwExpression_throwKeyword {
+    assert(kind == idl.LinkedNodeKind.throwExpression);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get topLevelVariableDeclaration_semicolon {
+    assert(kind == idl.LinkedNodeKind.topLevelVariableDeclaration);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get tryStatement_finallyKeyword {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get typeArgumentList_leftBracket {
+    assert(kind == idl.LinkedNodeKind.typeArgumentList);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get typeName_question {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get typeParameter_extendsKeyword {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get typeParameterList_leftBracket {
+    assert(kind == idl.LinkedNodeKind.typeParameterList);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get variableDeclaration_equals {
+    assert(kind == idl.LinkedNodeKind.variableDeclaration);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get variableDeclarationList_keyword {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationList);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get variableDeclarationStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get whileStatement_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get withClause_withKeyword {
+    assert(kind == idl.LinkedNodeKind.withClause);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get yieldStatement_yieldKeyword {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    return _variantField_15 ??= 0;
+  }
+
+  void set annotation_atSign(int value) {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set argumentList_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.argumentList);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set asExpression_asOperator(int value) {
+    assert(kind == idl.LinkedNodeKind.asExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set assertInitializer_assertKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set assertStatement_assertKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set assignmentExpression_element(int value) {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set awaitExpression_awaitKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.awaitExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set binaryExpression_element(int value) {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set block_leftBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.block);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set blockFunctionBody_keyword(int value) {
+    assert(kind == idl.LinkedNodeKind.blockFunctionBody);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set booleanLiteral_literal(int value) {
+    assert(kind == idl.LinkedNodeKind.booleanLiteral);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set breakStatement_breakKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.breakStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set catchClause_catchKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set classDeclaration_abstractKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set classTypeAlias_abstractKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set compilationUnit_beginToken(int value) {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set conditionalExpression_colon(int value) {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set configuration_ifKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set constructorDeclaration_constKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set constructorFieldInitializer_equals(int value) {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set constructorName_element(int value) {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set continueStatement_continueKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.continueStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set declaredIdentifier_keyword(int value) {
+    assert(kind == idl.LinkedNodeKind.declaredIdentifier);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set defaultFormalParameter_separator(int value) {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set doStatement_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set doubleLiteral_literal(int value) {
+    assert(kind == idl.LinkedNodeKind.doubleLiteral);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set emptyFunctionBody_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.emptyFunctionBody);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set emptyStatement_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.emptyStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set enumDeclaration_enumKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set expressionFunctionBody_arrow(int value) {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set expressionStatement_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.expressionStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set extendsClause_extendsKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.extendsClause);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set fieldDeclaration_covariantKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set fieldFormalParameter_keyword(int value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set forEachParts_inKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.forEachPartsWithDeclaration ||
+        kind == idl.LinkedNodeKind.forEachPartsWithIdentifier);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set formalParameterList_leftDelimiter(int value) {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set forMixin_awaitKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set forParts_leftSeparator(int value) {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
+        kind == idl.LinkedNodeKind.forPartsWithExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set functionDeclaration_externalKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set genericFunctionType_functionKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set ifMixin_elseKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set implementsClause_implementsKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.implementsClause);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set importDirective_asKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.importDirective);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set indexExpression_element(int value) {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set instanceCreationExpression_keyword(int value) {
+    assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set integerLiteral_literal(int value) {
+    assert(kind == idl.LinkedNodeKind.integerLiteral);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set interpolationExpression_leftBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.interpolationExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set interpolationString_token(int value) {
+    assert(kind == idl.LinkedNodeKind.interpolationString);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set isExpression_isOperator(int value) {
+    assert(kind == idl.LinkedNodeKind.isExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set label_colon(int value) {
+    assert(kind == idl.LinkedNodeKind.label);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set listLiteral_leftBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.listLiteral);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set mapLiteralEntry_separator(int value) {
+    assert(kind == idl.LinkedNodeKind.mapLiteralEntry);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set methodDeclaration_externalKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set methodInvocation_operator(int value) {
+    assert(kind == idl.LinkedNodeKind.methodInvocation);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set mixinDeclaration_mixinKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.mixinDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set nullLiteral_literal(int value) {
+    assert(kind == idl.LinkedNodeKind.nullLiteral);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set onClause_onKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.onClause);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set parenthesizedExpression_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set partOfDirective_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.partOfDirective);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set postfixExpression_element(int value) {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set prefixedIdentifier_period(int value) {
+    assert(kind == idl.LinkedNodeKind.prefixedIdentifier);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set prefixExpression_element(int value) {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set propertyAccess_operator(int value) {
+    assert(kind == idl.LinkedNodeKind.propertyAccess);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set redirectingConstructorInvocation_element(int value) {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set rethrowExpression_rethrowKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.rethrowExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set returnStatement_returnKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.returnStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set scriptTag_scriptTag(int value) {
+    assert(kind == idl.LinkedNodeKind.scriptTag);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set setOrMapLiteral_leftBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set simpleFormalParameter_keyword(int value) {
+    assert(kind == idl.LinkedNodeKind.simpleFormalParameter);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set simpleIdentifier_element(int value) {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set simpleStringLiteral_token(int value) {
+    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set spreadElement_spreadOperator(int value) {
+    assert(kind == idl.LinkedNodeKind.spreadElement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set superConstructorInvocation_element(int value) {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set superExpression_superKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.superExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set switchMember_keyword(int value) {
+    assert(kind == idl.LinkedNodeKind.switchCase ||
+        kind == idl.LinkedNodeKind.switchDefault);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set switchStatement_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set symbolLiteral_poundSign(int value) {
+    assert(kind == idl.LinkedNodeKind.symbolLiteral);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set thisExpression_thisKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.thisExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set throwExpression_throwKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.throwExpression);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set topLevelVariableDeclaration_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.topLevelVariableDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set tryStatement_finallyKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set typeArgumentList_leftBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.typeArgumentList);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set typeName_question(int value) {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set typeParameter_extendsKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set typeParameterList_leftBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.typeParameterList);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set variableDeclaration_equals(int value) {
+    assert(kind == idl.LinkedNodeKind.variableDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set variableDeclarationList_keyword(int value) {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationList);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set variableDeclarationStatement_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set whileStatement_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set withClause_withKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.withClause);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  void set yieldStatement_yieldKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  @override
+  LinkedNodeBuilder get annotation_constructorName {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get asExpression_type {
+    assert(kind == idl.LinkedNodeKind.asExpression);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get assertInitializer_message {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get assertStatement_message {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get assignmentExpression_rightHandSide {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get binaryExpression_rightOperand {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get catchClause_exceptionParameter {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get classDeclaration_withClause {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get classTypeAlias_superclass {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get conditionalExpression_elseExpression {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get configuration_value {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get constructorDeclaration_name {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get constructorFieldInitializer_fieldName {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get constructorName_type {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get declaredIdentifier_type {
+    assert(kind == idl.LinkedNodeKind.declaredIdentifier);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get defaultFormalParameter_parameter {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get doStatement_condition {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get fieldFormalParameter_typeParameters {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get forEachPartsWithDeclaration_loopVariable {
+    assert(kind == idl.LinkedNodeKind.forEachPartsWithDeclaration);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get forEachPartsWithIdentifier_identifier {
+    assert(kind == idl.LinkedNodeKind.forEachPartsWithIdentifier);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get forElement_body {
+    assert(kind == idl.LinkedNodeKind.forElement);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get forPartsWithDeclarations_variables {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get forPartsWithExpression_initialization {
+    assert(kind == idl.LinkedNodeKind.forPartsWithExpression);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get forStatement_body {
+    assert(kind == idl.LinkedNodeKind.forStatement);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get functionDeclaration_returnType {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get functionExpression_formalParameters {
+    assert(kind == idl.LinkedNodeKind.functionExpression);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get functionTypeAlias_returnType {
+    assert(kind == idl.LinkedNodeKind.functionTypeAlias);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get functionTypedFormalParameter_returnType {
+    assert(kind == idl.LinkedNodeKind.functionTypedFormalParameter);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get genericFunctionType_returnType {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get genericTypeAlias_functionType {
+    assert(kind == idl.LinkedNodeKind.genericTypeAlias);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get ifStatement_elseStatement {
+    assert(kind == idl.LinkedNodeKind.ifStatement);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get indexExpression_target {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get instanceCreationExpression_constructorName {
+    assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get isExpression_type {
+    assert(kind == idl.LinkedNodeKind.isExpression);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get mapLiteralEntry_value {
+    assert(kind == idl.LinkedNodeKind.mapLiteralEntry);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get methodDeclaration_formalParameters {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get methodInvocation_target {
+    assert(kind == idl.LinkedNodeKind.methodInvocation);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get namedExpression_name {
+    assert(kind == idl.LinkedNodeKind.namedExpression);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get partOfDirective_uri {
+    assert(kind == idl.LinkedNodeKind.partOfDirective);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get prefixedIdentifier_prefix {
+    assert(kind == idl.LinkedNodeKind.prefixedIdentifier);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get propertyAccess_target {
+    assert(kind == idl.LinkedNodeKind.propertyAccess);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get redirectingConstructorInvocation_constructorName {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get superConstructorInvocation_constructorName {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get switchStatement_expression {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get tryStatement_finallyBlock {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get typeName_typeArguments {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get typeParameter_name {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get variableDeclaration_name {
+    assert(kind == idl.LinkedNodeKind.variableDeclaration);
+    return _variantField_7;
+  }
+
+  @override
+  LinkedNodeBuilder get whileStatement_condition {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    return _variantField_7;
+  }
+
+  void set annotation_constructorName(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_7 = value;
+  }
+
+  void set asExpression_type(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.asExpression);
+    _variantField_7 = value;
+  }
+
+  void set assertInitializer_message(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    _variantField_7 = value;
+  }
+
+  void set assertStatement_message(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    _variantField_7 = value;
+  }
+
+  void set assignmentExpression_rightHandSide(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    _variantField_7 = value;
+  }
+
+  void set binaryExpression_rightOperand(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_7 = value;
+  }
+
+  void set catchClause_exceptionParameter(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_7 = value;
+  }
+
+  void set classDeclaration_withClause(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    _variantField_7 = value;
+  }
+
+  void set classTypeAlias_superclass(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    _variantField_7 = value;
+  }
+
+  void set conditionalExpression_elseExpression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    _variantField_7 = value;
+  }
+
+  void set configuration_value(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    _variantField_7 = value;
+  }
+
+  void set constructorDeclaration_name(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_7 = value;
+  }
+
+  void set constructorFieldInitializer_fieldName(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    _variantField_7 = value;
+  }
+
+  void set constructorName_type(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    _variantField_7 = value;
+  }
+
+  void set declaredIdentifier_type(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.declaredIdentifier);
+    _variantField_7 = value;
+  }
+
+  void set defaultFormalParameter_parameter(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    _variantField_7 = value;
+  }
+
+  void set doStatement_condition(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    _variantField_7 = value;
+  }
+
+  void set fieldFormalParameter_typeParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    _variantField_7 = value;
+  }
+
+  void set forEachPartsWithDeclaration_loopVariable(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.forEachPartsWithDeclaration);
+    _variantField_7 = value;
+  }
+
+  void set forEachPartsWithIdentifier_identifier(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.forEachPartsWithIdentifier);
+    _variantField_7 = value;
+  }
+
+  void set forElement_body(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.forElement);
+    _variantField_7 = value;
+  }
+
+  void set forPartsWithDeclarations_variables(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations);
+    _variantField_7 = value;
+  }
+
+  void set forPartsWithExpression_initialization(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.forPartsWithExpression);
+    _variantField_7 = value;
+  }
+
+  void set forStatement_body(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.forStatement);
+    _variantField_7 = value;
+  }
+
+  void set functionDeclaration_returnType(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration);
+    _variantField_7 = value;
+  }
+
+  void set functionExpression_formalParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionExpression);
+    _variantField_7 = value;
+  }
+
+  void set functionTypeAlias_returnType(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionTypeAlias);
+    _variantField_7 = value;
+  }
+
+  void set functionTypedFormalParameter_returnType(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionTypedFormalParameter);
+    _variantField_7 = value;
+  }
+
+  void set genericFunctionType_returnType(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    _variantField_7 = value;
+  }
+
+  void set genericTypeAlias_functionType(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.genericTypeAlias);
+    _variantField_7 = value;
+  }
+
+  void set ifStatement_elseStatement(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.ifStatement);
+    _variantField_7 = value;
+  }
+
+  void set indexExpression_target(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_7 = value;
+  }
+
+  void set instanceCreationExpression_constructorName(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
+    _variantField_7 = value;
+  }
+
+  void set isExpression_type(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.isExpression);
+    _variantField_7 = value;
+  }
+
+  void set mapLiteralEntry_value(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.mapLiteralEntry);
+    _variantField_7 = value;
+  }
+
+  void set methodDeclaration_formalParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_7 = value;
+  }
+
+  void set methodInvocation_target(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.methodInvocation);
+    _variantField_7 = value;
+  }
+
+  void set namedExpression_name(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.namedExpression);
+    _variantField_7 = value;
+  }
+
+  void set partOfDirective_uri(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.partOfDirective);
+    _variantField_7 = value;
+  }
+
+  void set prefixedIdentifier_prefix(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.prefixedIdentifier);
+    _variantField_7 = value;
+  }
+
+  void set propertyAccess_target(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.propertyAccess);
+    _variantField_7 = value;
+  }
+
+  void set redirectingConstructorInvocation_constructorName(
+      LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_7 = value;
+  }
+
+  void set superConstructorInvocation_constructorName(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_7 = value;
+  }
+
+  void set switchStatement_expression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    _variantField_7 = value;
+  }
+
+  void set tryStatement_finallyBlock(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    _variantField_7 = value;
+  }
+
+  void set typeName_typeArguments(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    _variantField_7 = value;
+  }
+
+  void set typeParameter_name(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    _variantField_7 = value;
+  }
+
+  void set variableDeclaration_name(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.variableDeclaration);
+    _variantField_7 = value;
+  }
+
+  void set whileStatement_condition(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    _variantField_7 = value;
+  }
+
+  @override
+  LinkedNodeBuilder get annotation_name {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get catchClause_exceptionType {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get classTypeAlias_withClause {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get conditionalExpression_thenExpression {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get configuration_uri {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get constructorDeclaration_parameters {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get fieldFormalParameter_formalParameters {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get functionExpression_typeParameters {
+    assert(kind == idl.LinkedNodeKind.functionExpression);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get functionTypeAlias_typeParameters {
+    assert(kind == idl.LinkedNodeKind.functionTypeAlias);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get functionTypedFormalParameter_typeParameters {
+    assert(kind == idl.LinkedNodeKind.functionTypedFormalParameter);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get genericFunctionType_formalParameters {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get ifElement_thenElement {
+    assert(kind == idl.LinkedNodeKind.ifElement);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get ifStatement_thenStatement {
+    assert(kind == idl.LinkedNodeKind.ifStatement);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get instanceCreationExpression_typeArguments {
+    assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
+    return _variantField_8;
+  }
+
+  @override
+  LinkedNodeBuilder get methodDeclaration_returnType {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    return _variantField_8;
+  }
+
+  void set annotation_name(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_8 = value;
+  }
+
+  void set catchClause_exceptionType(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_8 = value;
+  }
+
+  void set classTypeAlias_withClause(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    _variantField_8 = value;
+  }
+
+  void set conditionalExpression_thenExpression(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    _variantField_8 = value;
+  }
+
+  void set configuration_uri(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    _variantField_8 = value;
+  }
+
+  void set constructorDeclaration_parameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_8 = value;
+  }
+
+  void set fieldFormalParameter_formalParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    _variantField_8 = value;
+  }
+
+  void set functionExpression_typeParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionExpression);
+    _variantField_8 = value;
+  }
+
+  void set functionTypeAlias_typeParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionTypeAlias);
+    _variantField_8 = value;
+  }
+
+  void set functionTypedFormalParameter_typeParameters(
+      LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionTypedFormalParameter);
+    _variantField_8 = value;
+  }
+
+  void set genericFunctionType_formalParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    _variantField_8 = value;
+  }
+
+  void set ifElement_thenElement(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.ifElement);
+    _variantField_8 = value;
+  }
+
+  void set ifStatement_thenStatement(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.ifStatement);
+    _variantField_8 = value;
+  }
+
+  void set instanceCreationExpression_typeArguments(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
+    _variantField_8 = value;
+  }
+
+  void set methodDeclaration_returnType(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_8 = value;
+  }
+
+  @override
+  int get annotation_period {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get argumentList_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.argumentList);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get assertInitializer_comma {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get assertStatement_comma {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get assignmentExpression_operator {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get binaryExpression_operator {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get block_rightBracket {
+    assert(kind == idl.LinkedNodeKind.block);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get blockFunctionBody_star {
+    assert(kind == idl.LinkedNodeKind.blockFunctionBody);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get breakStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.breakStatement);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get catchClause_comma {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get classDeclaration_classKeyword {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get classTypeAlias_equals {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get compilationUnit_endToken {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get conditionalExpression_question {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get configuration_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get constructorDeclaration_externalKeyword {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get constructorFieldInitializer_period {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get constructorName_period {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get continueStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.continueStatement);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get doStatement_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get enumDeclaration_leftBracket {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get expressionFunctionBody_keyword {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get fieldDeclaration_semicolon {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get fieldFormalParameter_period {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get formalParameterList_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get forMixin_forKeyword {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get forParts_rightSeparator {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
+        kind == idl.LinkedNodeKind.forPartsWithExpression);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get functionDeclaration_propertyKeyword {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get genericFunctionType_question {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get genericTypeAlias_equals {
+    assert(kind == idl.LinkedNodeKind.genericTypeAlias);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get ifMixin_ifKeyword {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get importDirective_deferredKeyword {
+    assert(kind == idl.LinkedNodeKind.importDirective);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get indexExpression_leftBracket {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get integerLiteral_value {
+    assert(kind == idl.LinkedNodeKind.integerLiteral);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get interpolationExpression_rightBracket {
+    assert(kind == idl.LinkedNodeKind.interpolationExpression);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get isExpression_notOperator {
+    assert(kind == idl.LinkedNodeKind.isExpression);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get listLiteral_rightBracket {
+    assert(kind == idl.LinkedNodeKind.listLiteral);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get methodDeclaration_modifierKeyword {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get parenthesizedExpression_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get partOfDirective_ofKeyword {
+    assert(kind == idl.LinkedNodeKind.partOfDirective);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get postfixExpression_operator {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get prefixExpression_operator {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get redirectingConstructorInvocation_period {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get returnStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.returnStatement);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get setOrMapLiteral_rightBracket {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get simpleIdentifier_token {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get superConstructorInvocation_period {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get switchMember_colon {
+    assert(kind == idl.LinkedNodeKind.switchCase ||
+        kind == idl.LinkedNodeKind.switchDefault);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get switchStatement_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get tryStatement_tryKeyword {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get typeArgumentList_rightBracket {
+    assert(kind == idl.LinkedNodeKind.typeArgumentList);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get typeParameterList_rightBracket {
+    assert(kind == idl.LinkedNodeKind.typeParameterList);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get whileStatement_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
+  int get yieldStatement_star {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    return _variantField_16 ??= 0;
+  }
+
+  void set annotation_period(int value) {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set argumentList_rightParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.argumentList);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set assertInitializer_comma(int value) {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set assertStatement_comma(int value) {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set assignmentExpression_operator(int value) {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set binaryExpression_operator(int value) {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set block_rightBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.block);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set blockFunctionBody_star(int value) {
+    assert(kind == idl.LinkedNodeKind.blockFunctionBody);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set breakStatement_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.breakStatement);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set catchClause_comma(int value) {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set classDeclaration_classKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set classTypeAlias_equals(int value) {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set compilationUnit_endToken(int value) {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set conditionalExpression_question(int value) {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set configuration_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set constructorDeclaration_externalKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set constructorFieldInitializer_period(int value) {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set constructorName_period(int value) {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set continueStatement_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.continueStatement);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set doStatement_rightParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set enumDeclaration_leftBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set expressionFunctionBody_keyword(int value) {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set fieldDeclaration_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set fieldFormalParameter_period(int value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set formalParameterList_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set forMixin_forKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set forParts_rightSeparator(int value) {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
+        kind == idl.LinkedNodeKind.forPartsWithExpression);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set functionDeclaration_propertyKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set genericFunctionType_question(int value) {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set genericTypeAlias_equals(int value) {
+    assert(kind == idl.LinkedNodeKind.genericTypeAlias);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set ifMixin_ifKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set importDirective_deferredKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.importDirective);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set indexExpression_leftBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set integerLiteral_value(int value) {
+    assert(kind == idl.LinkedNodeKind.integerLiteral);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set interpolationExpression_rightBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.interpolationExpression);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set isExpression_notOperator(int value) {
+    assert(kind == idl.LinkedNodeKind.isExpression);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set listLiteral_rightBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.listLiteral);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set methodDeclaration_modifierKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set parenthesizedExpression_rightParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set partOfDirective_ofKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.partOfDirective);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set postfixExpression_operator(int value) {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set prefixExpression_operator(int value) {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set redirectingConstructorInvocation_period(int value) {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set returnStatement_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.returnStatement);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set setOrMapLiteral_rightBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set simpleIdentifier_token(int value) {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set superConstructorInvocation_period(int value) {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set switchMember_colon(int value) {
+    assert(kind == idl.LinkedNodeKind.switchCase ||
+        kind == idl.LinkedNodeKind.switchDefault);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set switchStatement_rightParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set tryStatement_tryKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set typeArgumentList_rightBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.typeArgumentList);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set typeParameterList_rightBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.typeParameterList);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set whileStatement_rightParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  void set yieldStatement_star(int value) {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  @override
+  int get assertInitializer_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get assertStatement_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get catchClause_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get configuration_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get constructorDeclaration_factoryKeyword {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get constructorFieldInitializer_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get directive_keyword {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get doStatement_doKeyword {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get enumDeclaration_rightBracket {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get expressionFunctionBody_semicolon {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get fieldDeclaration_staticKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get fieldFormalParameter_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get formalParameterList_rightDelimiter {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get forMixin_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get ifMixin_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get indexExpression_rightBracket {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get methodDeclaration_operatorKeyword {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get redirectingConstructorInvocation_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get superConstructorInvocation_superKeyword {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get switchStatement_switchKeyword {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get whileStatement_whileKeyword {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get yieldStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  void set assertInitializer_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set assertStatement_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set catchClause_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set configuration_rightParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set constructorDeclaration_factoryKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set constructorFieldInitializer_thisKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set directive_keyword(int value) {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set doStatement_doKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set enumDeclaration_rightBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set expressionFunctionBody_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set fieldDeclaration_staticKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set fieldFormalParameter_thisKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set formalParameterList_rightDelimiter(int value) {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set forMixin_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set ifMixin_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set indexExpression_rightBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set methodDeclaration_operatorKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set redirectingConstructorInvocation_thisKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set superConstructorInvocation_superKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set switchStatement_switchKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set whileStatement_whileKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  void set yieldStatement_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  @override
+  int get assertInitializer_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
+  int get assertStatement_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
+  int get catchClause_onKeyword {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
+  int get classOrMixinDeclaration_rightBracket {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
+  int get configuration_equalToken {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
+  int get constructorDeclaration_period {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
+  int get doStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
+  int get formalParameterList_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
+  int get ifMixin_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
+  int get methodDeclaration_propertyKeyword {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
+  int get namespaceDirective_semicolon {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
+  int get switchStatement_leftBracket {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
+  int get typeAlias_typedefKeyword {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias);
+    return _variantField_18 ??= 0;
+  }
+
+  void set assertInitializer_rightParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  void set assertStatement_rightParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  void set catchClause_onKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  void set classOrMixinDeclaration_rightBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  void set configuration_equalToken(int value) {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  void set constructorDeclaration_period(int value) {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  void set doStatement_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  void set formalParameterList_rightParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  void set ifMixin_rightParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  void set methodDeclaration_propertyKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  void set namespaceDirective_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  void set switchStatement_leftBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  void set typeAlias_typedefKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  @override
+  int get assertStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    return _variantField_19 ??= 0;
+  }
+
+  @override
+  int get catchClause_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    return _variantField_19 ??= 0;
+  }
+
+  @override
+  int get classOrMixinDeclaration_leftBracket {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    return _variantField_19 ??= 0;
+  }
+
+  @override
+  int get combinator_keyword {
+    assert(kind == idl.LinkedNodeKind.hideCombinator ||
+        kind == idl.LinkedNodeKind.showCombinator);
+    return _variantField_19 ??= 0;
+  }
+
+  @override
+  int get constructorDeclaration_separator {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    return _variantField_19 ??= 0;
+  }
+
+  @override
+  int get doStatement_whileKeyword {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    return _variantField_19 ??= 0;
+  }
+
+  @override
+  int get forMixin_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    return _variantField_19 ??= 0;
+  }
+
+  @override
+  int get normalFormalParameter_covariantKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    return _variantField_19 ??= 0;
+  }
+
+  @override
+  int get switchStatement_rightBracket {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    return _variantField_19 ??= 0;
+  }
+
+  @override
+  int get typeAlias_semicolon {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias);
+    return _variantField_19 ??= 0;
+  }
+
+  @override
+  int get typedLiteral_constKeyword {
+    assert(kind == idl.LinkedNodeKind.listLiteral ||
+        kind == idl.LinkedNodeKind.setOrMapLiteral);
+    return _variantField_19 ??= 0;
+  }
+
+  @override
+  int get uriBasedDirective_uriElement {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    return _variantField_19 ??= 0;
+  }
+
+  void set assertStatement_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    assert(value == null || value >= 0);
+    _variantField_19 = value;
+  }
+
+  void set catchClause_rightParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    assert(value == null || value >= 0);
+    _variantField_19 = value;
+  }
+
+  void set classOrMixinDeclaration_leftBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_19 = value;
+  }
+
+  void set combinator_keyword(int value) {
+    assert(kind == idl.LinkedNodeKind.hideCombinator ||
+        kind == idl.LinkedNodeKind.showCombinator);
+    assert(value == null || value >= 0);
+    _variantField_19 = value;
+  }
+
+  void set constructorDeclaration_separator(int value) {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_19 = value;
+  }
+
+  void set doStatement_whileKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    assert(value == null || value >= 0);
+    _variantField_19 = value;
+  }
+
+  void set forMixin_rightParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    assert(value == null || value >= 0);
+    _variantField_19 = value;
+  }
+
+  void set normalFormalParameter_covariantKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    assert(value == null || value >= 0);
+    _variantField_19 = value;
+  }
+
+  void set switchStatement_rightBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    assert(value == null || value >= 0);
+    _variantField_19 = value;
+  }
+
+  void set typeAlias_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias);
+    assert(value == null || value >= 0);
+    _variantField_19 = value;
+  }
+
+  void set typedLiteral_constKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.listLiteral ||
+        kind == idl.LinkedNodeKind.setOrMapLiteral);
+    assert(value == null || value >= 0);
+    _variantField_19 = value;
+  }
+
+  void set uriBasedDirective_uriElement(int value) {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    assert(value == null || value >= 0);
+    _variantField_19 = value;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get binaryExpression_invokeType {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    return _variantField_24;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get invocationExpression_invokeType {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.methodInvocation);
+    return _variantField_24;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get typeName_type {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    return _variantField_24;
+  }
+
+  void set binaryExpression_invokeType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_24 = value;
+  }
+
+  void set invocationExpression_invokeType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.methodInvocation);
+    _variantField_24 = value;
+  }
+
+  void set typeName_type(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    _variantField_24 = value;
+  }
+
+  @override
+  bool get booleanLiteral_value {
+    assert(kind == idl.LinkedNodeKind.booleanLiteral);
+    return _variantField_27 ??= false;
+  }
+
+  @override
+  bool get defaultFormalParameter_isNamed {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    return _variantField_27 ??= false;
+  }
+
+  @override
+  bool get setOrMapLiteral_isMap {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    return _variantField_27 ??= false;
+  }
+
+  void set booleanLiteral_value(bool value) {
+    assert(kind == idl.LinkedNodeKind.booleanLiteral);
+    _variantField_27 = value;
+  }
+
+  void set defaultFormalParameter_isNamed(bool value) {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    _variantField_27 = value;
+  }
+
+  void set setOrMapLiteral_isMap(bool value) {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    _variantField_27 = value;
+  }
+
+  @override
+  LinkedNodeBuilder get catchClause_stackTraceParameter {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    return _variantField_9;
+  }
+
+  @override
+  LinkedNodeBuilder get classTypeAlias_implementsClause {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    return _variantField_9;
+  }
+
+  @override
+  LinkedNodeBuilder get constructorDeclaration_redirectedConstructor {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    return _variantField_9;
+  }
+
+  @override
+  LinkedNodeBuilder get ifElement_elseElement {
+    assert(kind == idl.LinkedNodeKind.ifElement);
+    return _variantField_9;
+  }
+
+  @override
+  LinkedNodeBuilder get methodDeclaration_typeParameters {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    return _variantField_9;
+  }
+
+  void set catchClause_stackTraceParameter(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_9 = value;
+  }
+
+  void set classTypeAlias_implementsClause(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    _variantField_9 = value;
+  }
+
+  void set constructorDeclaration_redirectedConstructor(
+      LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_9 = value;
+  }
+
+  void set ifElement_elseElement(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.ifElement);
+    _variantField_9 = value;
+  }
+
+  void set methodDeclaration_typeParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_9 = value;
+  }
+
+  @override
+  LinkedNodeBuilder get classOrMixinDeclaration_implementsClause {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    return _variantField_12;
+  }
+
+  @override
+  LinkedNodeBuilder get invocationExpression_typeArguments {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.methodInvocation);
+    return _variantField_12;
+  }
+
+  @override
+  LinkedNodeBuilder get normalFormalParameter_identifier {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    return _variantField_12;
+  }
+
+  void set classOrMixinDeclaration_implementsClause(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_12 = value;
+  }
+
+  void set invocationExpression_typeArguments(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.methodInvocation);
+    _variantField_12 = value;
+  }
+
+  void set normalFormalParameter_identifier(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    _variantField_12 = value;
+  }
+
+  @override
+  List<LinkedNodeBuilder> get classOrMixinDeclaration_members {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    return _variantField_5 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get forParts_updaters {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
+        kind == idl.LinkedNodeKind.forPartsWithExpression);
+    return _variantField_5 ??= <LinkedNodeBuilder>[];
+  }
+
+  void set classOrMixinDeclaration_members(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_5 = value;
+  }
+
+  void set forParts_updaters(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
+        kind == idl.LinkedNodeKind.forPartsWithExpression);
+    _variantField_5 = value;
+  }
+
+  @override
+  LinkedNodeBuilder get classOrMixinDeclaration_typeParameters {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    return _variantField_13;
+  }
+
+  void set classOrMixinDeclaration_typeParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_13 = value;
+  }
+
+  @override
+  List<int> get comment_tokens {
+    assert(kind == idl.LinkedNodeKind.comment);
+    return _variantField_28 ??= <int>[];
+  }
+
+  @override
+  List<int> get symbolLiteral_components {
+    assert(kind == idl.LinkedNodeKind.symbolLiteral);
+    return _variantField_28 ??= <int>[];
+  }
+
+  void set comment_tokens(List<int> value) {
+    assert(kind == idl.LinkedNodeKind.comment);
+    assert(value == null || value.every((e) => e >= 0));
+    _variantField_28 = value;
+  }
+
+  void set symbolLiteral_components(List<int> value) {
+    assert(kind == idl.LinkedNodeKind.symbolLiteral);
+    assert(value == null || value.every((e) => e >= 0));
+    _variantField_28 = value;
+  }
+
+  @override
+  idl.LinkedNodeCommentType get comment_type {
+    assert(kind == idl.LinkedNodeKind.comment);
+    return _variantField_29 ??= idl.LinkedNodeCommentType.block;
+  }
+
+  void set comment_type(idl.LinkedNodeCommentType value) {
+    assert(kind == idl.LinkedNodeKind.comment);
+    _variantField_29 = value;
+  }
+
+  @override
+  List<LinkedNodeBuilder> get compilationUnit_directives {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    return _variantField_3 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get namespaceDirective_configurations {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective);
+    return _variantField_3 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
+  List<LinkedNodeBuilder> get switchMember_labels {
+    assert(kind == idl.LinkedNodeKind.switchCase ||
+        kind == idl.LinkedNodeKind.switchDefault);
+    return _variantField_3 ??= <LinkedNodeBuilder>[];
+  }
+
+  void set compilationUnit_directives(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    _variantField_3 = value;
+  }
+
+  void set namespaceDirective_configurations(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective);
+    _variantField_3 = value;
+  }
+
+  void set switchMember_labels(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.switchCase ||
+        kind == idl.LinkedNodeKind.switchDefault);
+    _variantField_3 = value;
+  }
+
+  @override
+  LinkedNodeBuilder get constructorDeclaration_returnType {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    return _variantField_10;
+  }
+
+  @override
+  LinkedNodeBuilder get methodDeclaration_name {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    return _variantField_10;
+  }
+
+  void set constructorDeclaration_returnType(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_10 = value;
+  }
+
+  void set methodDeclaration_name(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_10 = value;
+  }
+
+  @override
+  double get doubleLiteral_value {
+    assert(kind == idl.LinkedNodeKind.doubleLiteral);
+    return _variantField_21 ??= 0.0;
+  }
+
+  void set doubleLiteral_value(double value) {
+    assert(kind == idl.LinkedNodeKind.doubleLiteral);
+    _variantField_21 = value;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get expression_type {
+    assert(kind == idl.LinkedNodeKind.adjacentStrings ||
+        kind == idl.LinkedNodeKind.assignmentExpression ||
+        kind == idl.LinkedNodeKind.asExpression ||
+        kind == idl.LinkedNodeKind.awaitExpression ||
+        kind == idl.LinkedNodeKind.binaryExpression ||
+        kind == idl.LinkedNodeKind.booleanLiteral ||
+        kind == idl.LinkedNodeKind.cascadeExpression ||
+        kind == idl.LinkedNodeKind.conditionalExpression ||
+        kind == idl.LinkedNodeKind.doubleLiteral ||
+        kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.indexExpression ||
+        kind == idl.LinkedNodeKind.instanceCreationExpression ||
+        kind == idl.LinkedNodeKind.integerLiteral ||
+        kind == idl.LinkedNodeKind.isExpression ||
+        kind == idl.LinkedNodeKind.listLiteral ||
+        kind == idl.LinkedNodeKind.methodInvocation ||
+        kind == idl.LinkedNodeKind.namedExpression ||
+        kind == idl.LinkedNodeKind.nullLiteral ||
+        kind == idl.LinkedNodeKind.parenthesizedExpression ||
+        kind == idl.LinkedNodeKind.prefixExpression ||
+        kind == idl.LinkedNodeKind.prefixedIdentifier ||
+        kind == idl.LinkedNodeKind.propertyAccess ||
+        kind == idl.LinkedNodeKind.postfixExpression ||
+        kind == idl.LinkedNodeKind.rethrowExpression ||
+        kind == idl.LinkedNodeKind.setOrMapLiteral ||
+        kind == idl.LinkedNodeKind.simpleIdentifier ||
+        kind == idl.LinkedNodeKind.simpleStringLiteral ||
+        kind == idl.LinkedNodeKind.stringInterpolation ||
+        kind == idl.LinkedNodeKind.superExpression ||
+        kind == idl.LinkedNodeKind.symbolLiteral ||
+        kind == idl.LinkedNodeKind.thisExpression ||
+        kind == idl.LinkedNodeKind.throwExpression);
+    return _variantField_25;
+  }
+
+  void set expression_type(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.adjacentStrings ||
+        kind == idl.LinkedNodeKind.assignmentExpression ||
+        kind == idl.LinkedNodeKind.asExpression ||
+        kind == idl.LinkedNodeKind.awaitExpression ||
+        kind == idl.LinkedNodeKind.binaryExpression ||
+        kind == idl.LinkedNodeKind.booleanLiteral ||
+        kind == idl.LinkedNodeKind.cascadeExpression ||
+        kind == idl.LinkedNodeKind.conditionalExpression ||
+        kind == idl.LinkedNodeKind.doubleLiteral ||
+        kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.indexExpression ||
+        kind == idl.LinkedNodeKind.instanceCreationExpression ||
+        kind == idl.LinkedNodeKind.integerLiteral ||
+        kind == idl.LinkedNodeKind.isExpression ||
+        kind == idl.LinkedNodeKind.listLiteral ||
+        kind == idl.LinkedNodeKind.methodInvocation ||
+        kind == idl.LinkedNodeKind.namedExpression ||
+        kind == idl.LinkedNodeKind.nullLiteral ||
+        kind == idl.LinkedNodeKind.parenthesizedExpression ||
+        kind == idl.LinkedNodeKind.prefixExpression ||
+        kind == idl.LinkedNodeKind.prefixedIdentifier ||
+        kind == idl.LinkedNodeKind.propertyAccess ||
+        kind == idl.LinkedNodeKind.postfixExpression ||
+        kind == idl.LinkedNodeKind.rethrowExpression ||
+        kind == idl.LinkedNodeKind.setOrMapLiteral ||
+        kind == idl.LinkedNodeKind.simpleIdentifier ||
+        kind == idl.LinkedNodeKind.simpleStringLiteral ||
+        kind == idl.LinkedNodeKind.stringInterpolation ||
+        kind == idl.LinkedNodeKind.superExpression ||
+        kind == idl.LinkedNodeKind.symbolLiteral ||
+        kind == idl.LinkedNodeKind.thisExpression ||
+        kind == idl.LinkedNodeKind.throwExpression);
+    _variantField_25 = value;
+  }
+
+  @override
+  idl.LinkedNodeFormalParameterKind get formalParameter_kind {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    return _variantField_26 ??= idl.LinkedNodeFormalParameterKind.required;
+  }
+
+  void set formalParameter_kind(idl.LinkedNodeFormalParameterKind value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    _variantField_26 = value;
+  }
+
+  @override
+  String get interpolationString_value {
+    assert(kind == idl.LinkedNodeKind.interpolationString);
+    return _variantField_30 ??= '';
+  }
+
+  void set interpolationString_value(String value) {
+    assert(kind == idl.LinkedNodeKind.interpolationString);
+    _variantField_30 = value;
+  }
+
+  @override
+  LinkedNodeBuilder get invocationExpression_arguments {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.methodInvocation);
+    return _variantField_14;
+  }
+
+  @override
+  LinkedNodeBuilder get namedCompilationUnitMember_name {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    return _variantField_14;
+  }
+
+  @override
+  LinkedNodeBuilder get normalFormalParameter_comment {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    return _variantField_14;
+  }
+
+  @override
+  LinkedNodeBuilder get typedLiteral_typeArguments {
+    assert(kind == idl.LinkedNodeKind.listLiteral ||
+        kind == idl.LinkedNodeKind.setOrMapLiteral);
+    return _variantField_14;
+  }
+
+  @override
+  LinkedNodeBuilder get uriBasedDirective_uri {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    return _variantField_14;
+  }
+
+  void set invocationExpression_arguments(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.methodInvocation);
+    _variantField_14 = value;
+  }
+
+  void set namedCompilationUnitMember_name(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_14 = value;
+  }
+
+  void set normalFormalParameter_comment(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    _variantField_14 = value;
+  }
+
+  void set typedLiteral_typeArguments(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.listLiteral ||
+        kind == idl.LinkedNodeKind.setOrMapLiteral);
+    _variantField_14 = value;
+  }
+
+  void set uriBasedDirective_uri(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    _variantField_14 = value;
+  }
+
+  @override
+  bool get isSynthetic => _isSynthetic ??= false;
+
+  void set isSynthetic(bool value) {
+    this._isSynthetic = value;
+  }
+
+  @override
+  idl.LinkedNodeKind get kind => _kind ??= idl.LinkedNodeKind.adjacentStrings;
+
+  void set kind(idl.LinkedNodeKind value) {
+    this._kind = value;
+  }
+
+  @override
+  String get namespaceDirective_selectedUriContent {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective);
+    return _variantField_23 ??= '';
+  }
+
+  void set namespaceDirective_selectedUriContent(String value) {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective);
+    _variantField_23 = value;
+  }
+
+  @override
+  bool get setOrMapLiteral_isSet {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    return _variantField_31 ??= false;
+  }
+
+  void set setOrMapLiteral_isSet(bool value) {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    _variantField_31 = value;
+  }
+
+  @override
+  String get simpleStringLiteral_value {
+    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
+    return _variantField_20 ??= '';
+  }
+
+  void set simpleStringLiteral_value(String value) {
+    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
+    _variantField_20 = value;
+  }
+
+  @override
+  String get uriBasedDirective_uriContent {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    return _variantField_22 ??= '';
+  }
+
+  void set uriBasedDirective_uriContent(String value) {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    _variantField_22 = value;
+  }
+
+  LinkedNodeBuilder.adjacentStrings({
+    List<LinkedNodeBuilder> adjacentStrings_strings,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.adjacentStrings,
+        _variantField_2 = adjacentStrings_strings,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.argumentList({
+    List<LinkedNodeBuilder> argumentList_arguments,
+    int argumentList_leftParenthesis,
+    int argumentList_rightParenthesis,
+  })  : _kind = idl.LinkedNodeKind.argumentList,
+        _variantField_2 = argumentList_arguments,
+        _variantField_15 = argumentList_leftParenthesis,
+        _variantField_16 = argumentList_rightParenthesis;
+
+  LinkedNodeBuilder.block({
+    List<LinkedNodeBuilder> block_statements,
+    int block_leftBracket,
+    int block_rightBracket,
+  })  : _kind = idl.LinkedNodeKind.block,
+        _variantField_2 = block_statements,
+        _variantField_15 = block_leftBracket,
+        _variantField_16 = block_rightBracket;
+
+  LinkedNodeBuilder.cascadeExpression({
+    List<LinkedNodeBuilder> cascadeExpression_sections,
+    LinkedNodeBuilder cascadeExpression_target,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.cascadeExpression,
+        _variantField_2 = cascadeExpression_sections,
+        _variantField_6 = cascadeExpression_target,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.compilationUnit({
+    List<LinkedNodeBuilder> compilationUnit_declarations,
+    LinkedNodeBuilder compilationUnit_scriptTag,
+    int compilationUnit_beginToken,
+    int compilationUnit_endToken,
+    List<LinkedNodeBuilder> compilationUnit_directives,
+  })  : _kind = idl.LinkedNodeKind.compilationUnit,
+        _variantField_2 = compilationUnit_declarations,
+        _variantField_6 = compilationUnit_scriptTag,
+        _variantField_15 = compilationUnit_beginToken,
+        _variantField_16 = compilationUnit_endToken,
+        _variantField_3 = compilationUnit_directives;
+
+  LinkedNodeBuilder.constructorDeclaration({
+    List<LinkedNodeBuilder> constructorDeclaration_initializers,
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder constructorDeclaration_body,
+    int constructorDeclaration_constKeyword,
+    LinkedNodeBuilder constructorDeclaration_name,
+    LinkedNodeBuilder constructorDeclaration_parameters,
+    int constructorDeclaration_externalKeyword,
+    int constructorDeclaration_factoryKeyword,
+    int constructorDeclaration_period,
+    int constructorDeclaration_separator,
+    LinkedNodeBuilder constructorDeclaration_redirectedConstructor,
+    LinkedNodeBuilder constructorDeclaration_returnType,
+  })  : _kind = idl.LinkedNodeKind.constructorDeclaration,
+        _variantField_2 = constructorDeclaration_initializers,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = constructorDeclaration_body,
+        _variantField_15 = constructorDeclaration_constKeyword,
+        _variantField_7 = constructorDeclaration_name,
+        _variantField_8 = constructorDeclaration_parameters,
+        _variantField_16 = constructorDeclaration_externalKeyword,
+        _variantField_17 = constructorDeclaration_factoryKeyword,
+        _variantField_18 = constructorDeclaration_period,
+        _variantField_19 = constructorDeclaration_separator,
+        _variantField_9 = constructorDeclaration_redirectedConstructor,
+        _variantField_10 = constructorDeclaration_returnType;
+
+  LinkedNodeBuilder.dottedName({
+    List<LinkedNodeBuilder> dottedName_components,
+  })  : _kind = idl.LinkedNodeKind.dottedName,
+        _variantField_2 = dottedName_components;
+
+  LinkedNodeBuilder.enumDeclaration({
+    List<LinkedNodeBuilder> enumDeclaration_constants,
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    int enumDeclaration_enumKeyword,
+    int enumDeclaration_leftBracket,
+    int enumDeclaration_rightBracket,
+    LinkedNodeBuilder namedCompilationUnitMember_name,
+  })  : _kind = idl.LinkedNodeKind.enumDeclaration,
+        _variantField_2 = enumDeclaration_constants,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_15 = enumDeclaration_enumKeyword,
+        _variantField_16 = enumDeclaration_leftBracket,
+        _variantField_17 = enumDeclaration_rightBracket,
+        _variantField_14 = namedCompilationUnitMember_name;
+
+  LinkedNodeBuilder.formalParameterList({
+    List<LinkedNodeBuilder> formalParameterList_parameters,
+    int formalParameterList_leftDelimiter,
+    int formalParameterList_leftParenthesis,
+    int formalParameterList_rightDelimiter,
+    int formalParameterList_rightParenthesis,
+  })  : _kind = idl.LinkedNodeKind.formalParameterList,
+        _variantField_2 = formalParameterList_parameters,
+        _variantField_15 = formalParameterList_leftDelimiter,
+        _variantField_16 = formalParameterList_leftParenthesis,
+        _variantField_17 = formalParameterList_rightDelimiter,
+        _variantField_18 = formalParameterList_rightParenthesis;
+
+  LinkedNodeBuilder.hideCombinator({
+    List<LinkedNodeBuilder> hideCombinator_hiddenNames,
+    int combinator_keyword,
+  })  : _kind = idl.LinkedNodeKind.hideCombinator,
+        _variantField_2 = hideCombinator_hiddenNames,
+        _variantField_19 = combinator_keyword;
+
+  LinkedNodeBuilder.implementsClause({
+    List<LinkedNodeBuilder> implementsClause_interfaces,
+    int implementsClause_implementsKeyword,
+  })  : _kind = idl.LinkedNodeKind.implementsClause,
+        _variantField_2 = implementsClause_interfaces,
+        _variantField_15 = implementsClause_implementsKeyword;
+
+  LinkedNodeBuilder.labeledStatement({
+    List<LinkedNodeBuilder> labeledStatement_labels,
+    LinkedNodeBuilder labeledStatement_statement,
+  })  : _kind = idl.LinkedNodeKind.labeledStatement,
+        _variantField_2 = labeledStatement_labels,
+        _variantField_6 = labeledStatement_statement;
+
+  LinkedNodeBuilder.libraryIdentifier({
+    List<LinkedNodeBuilder> libraryIdentifier_components,
+  })  : _kind = idl.LinkedNodeKind.libraryIdentifier,
+        _variantField_2 = libraryIdentifier_components;
+
+  LinkedNodeBuilder.listLiteral({
+    List<LinkedNodeBuilder> listLiteral_elements,
+    int listLiteral_leftBracket,
+    int listLiteral_rightBracket,
+    int typedLiteral_constKeyword,
+    LinkedNodeTypeBuilder expression_type,
+    LinkedNodeBuilder typedLiteral_typeArguments,
+  })  : _kind = idl.LinkedNodeKind.listLiteral,
+        _variantField_2 = listLiteral_elements,
+        _variantField_15 = listLiteral_leftBracket,
+        _variantField_16 = listLiteral_rightBracket,
+        _variantField_19 = typedLiteral_constKeyword,
+        _variantField_25 = expression_type,
+        _variantField_14 = typedLiteral_typeArguments;
+
+  LinkedNodeBuilder.exportDirective({
+    List<LinkedNodeBuilder> namespaceDirective_combinators,
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    int directive_keyword,
+    int namespaceDirective_semicolon,
+    int uriBasedDirective_uriElement,
+    List<LinkedNodeBuilder> namespaceDirective_configurations,
+    LinkedNodeBuilder uriBasedDirective_uri,
+    String namespaceDirective_selectedUriContent,
+    String uriBasedDirective_uriContent,
+  })  : _kind = idl.LinkedNodeKind.exportDirective,
+        _variantField_2 = namespaceDirective_combinators,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_17 = directive_keyword,
+        _variantField_18 = namespaceDirective_semicolon,
+        _variantField_19 = uriBasedDirective_uriElement,
+        _variantField_3 = namespaceDirective_configurations,
+        _variantField_14 = uriBasedDirective_uri,
+        _variantField_23 = namespaceDirective_selectedUriContent,
+        _variantField_22 = uriBasedDirective_uriContent;
+
+  LinkedNodeBuilder.importDirective({
+    List<LinkedNodeBuilder> namespaceDirective_combinators,
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder importDirective_prefix,
+    int importDirective_asKeyword,
+    int importDirective_deferredKeyword,
+    int directive_keyword,
+    int namespaceDirective_semicolon,
+    int uriBasedDirective_uriElement,
+    List<LinkedNodeBuilder> namespaceDirective_configurations,
+    LinkedNodeBuilder uriBasedDirective_uri,
+    String namespaceDirective_selectedUriContent,
+    String uriBasedDirective_uriContent,
+  })  : _kind = idl.LinkedNodeKind.importDirective,
+        _variantField_2 = namespaceDirective_combinators,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = importDirective_prefix,
+        _variantField_15 = importDirective_asKeyword,
+        _variantField_16 = importDirective_deferredKeyword,
+        _variantField_17 = directive_keyword,
+        _variantField_18 = namespaceDirective_semicolon,
+        _variantField_19 = uriBasedDirective_uriElement,
+        _variantField_3 = namespaceDirective_configurations,
+        _variantField_14 = uriBasedDirective_uri,
+        _variantField_23 = namespaceDirective_selectedUriContent,
+        _variantField_22 = uriBasedDirective_uriContent;
+
+  LinkedNodeBuilder.onClause({
+    List<LinkedNodeBuilder> onClause_superclassConstraints,
+    int onClause_onKeyword,
+  })  : _kind = idl.LinkedNodeKind.onClause,
+        _variantField_2 = onClause_superclassConstraints,
+        _variantField_15 = onClause_onKeyword;
+
+  LinkedNodeBuilder.setOrMapLiteral({
+    List<LinkedNodeBuilder> setOrMapLiteral_elements,
+    int setOrMapLiteral_leftBracket,
+    int setOrMapLiteral_rightBracket,
+    int typedLiteral_constKeyword,
+    bool setOrMapLiteral_isMap,
+    LinkedNodeTypeBuilder expression_type,
+    LinkedNodeBuilder typedLiteral_typeArguments,
+    bool setOrMapLiteral_isSet,
+  })  : _kind = idl.LinkedNodeKind.setOrMapLiteral,
+        _variantField_2 = setOrMapLiteral_elements,
+        _variantField_15 = setOrMapLiteral_leftBracket,
+        _variantField_16 = setOrMapLiteral_rightBracket,
+        _variantField_19 = typedLiteral_constKeyword,
+        _variantField_27 = setOrMapLiteral_isMap,
+        _variantField_25 = expression_type,
+        _variantField_14 = typedLiteral_typeArguments,
+        _variantField_31 = setOrMapLiteral_isSet;
+
+  LinkedNodeBuilder.showCombinator({
+    List<LinkedNodeBuilder> showCombinator_shownNames,
+    int combinator_keyword,
+  })  : _kind = idl.LinkedNodeKind.showCombinator,
+        _variantField_2 = showCombinator_shownNames,
+        _variantField_19 = combinator_keyword;
+
+  LinkedNodeBuilder.stringInterpolation({
+    List<LinkedNodeBuilder> stringInterpolation_elements,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.stringInterpolation,
+        _variantField_2 = stringInterpolation_elements,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.switchStatement({
+    List<LinkedNodeBuilder> switchStatement_members,
+    int switchStatement_leftParenthesis,
+    LinkedNodeBuilder switchStatement_expression,
+    int switchStatement_rightParenthesis,
+    int switchStatement_switchKeyword,
+    int switchStatement_leftBracket,
+    int switchStatement_rightBracket,
+  })  : _kind = idl.LinkedNodeKind.switchStatement,
+        _variantField_2 = switchStatement_members,
+        _variantField_15 = switchStatement_leftParenthesis,
+        _variantField_7 = switchStatement_expression,
+        _variantField_16 = switchStatement_rightParenthesis,
+        _variantField_17 = switchStatement_switchKeyword,
+        _variantField_18 = switchStatement_leftBracket,
+        _variantField_19 = switchStatement_rightBracket;
+
+  LinkedNodeBuilder.tryStatement({
+    List<LinkedNodeBuilder> tryStatement_catchClauses,
+    LinkedNodeBuilder tryStatement_body,
+    int tryStatement_finallyKeyword,
+    LinkedNodeBuilder tryStatement_finallyBlock,
+    int tryStatement_tryKeyword,
+  })  : _kind = idl.LinkedNodeKind.tryStatement,
+        _variantField_2 = tryStatement_catchClauses,
+        _variantField_6 = tryStatement_body,
+        _variantField_15 = tryStatement_finallyKeyword,
+        _variantField_7 = tryStatement_finallyBlock,
+        _variantField_16 = tryStatement_tryKeyword;
+
+  LinkedNodeBuilder.typeArgumentList({
+    List<LinkedNodeBuilder> typeArgumentList_arguments,
+    int typeArgumentList_leftBracket,
+    int typeArgumentList_rightBracket,
+  })  : _kind = idl.LinkedNodeKind.typeArgumentList,
+        _variantField_2 = typeArgumentList_arguments,
+        _variantField_15 = typeArgumentList_leftBracket,
+        _variantField_16 = typeArgumentList_rightBracket;
+
+  LinkedNodeBuilder.typeParameterList({
+    List<LinkedNodeBuilder> typeParameterList_typeParameters,
+    int typeParameterList_leftBracket,
+    int typeParameterList_rightBracket,
+  })  : _kind = idl.LinkedNodeKind.typeParameterList,
+        _variantField_2 = typeParameterList_typeParameters,
+        _variantField_15 = typeParameterList_leftBracket,
+        _variantField_16 = typeParameterList_rightBracket;
+
+  LinkedNodeBuilder.variableDeclarationList({
+    List<LinkedNodeBuilder> variableDeclarationList_variables,
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder variableDeclarationList_type,
+    int variableDeclarationList_keyword,
+  })  : _kind = idl.LinkedNodeKind.variableDeclarationList,
+        _variantField_2 = variableDeclarationList_variables,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = variableDeclarationList_type,
+        _variantField_15 = variableDeclarationList_keyword;
+
+  LinkedNodeBuilder.withClause({
+    List<LinkedNodeBuilder> withClause_mixinTypes,
+    int withClause_withKeyword,
+  })  : _kind = idl.LinkedNodeKind.withClause,
+        _variantField_2 = withClause_mixinTypes,
+        _variantField_15 = withClause_withKeyword;
+
+  LinkedNodeBuilder.classDeclaration({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder classDeclaration_extendsClause,
+    int classDeclaration_abstractKeyword,
+    LinkedNodeBuilder classDeclaration_withClause,
+    int classDeclaration_classKeyword,
+    int classOrMixinDeclaration_rightBracket,
+    int classOrMixinDeclaration_leftBracket,
+    LinkedNodeBuilder classOrMixinDeclaration_implementsClause,
+    List<LinkedNodeBuilder> classOrMixinDeclaration_members,
+    LinkedNodeBuilder classOrMixinDeclaration_typeParameters,
+    LinkedNodeBuilder namedCompilationUnitMember_name,
+  })  : _kind = idl.LinkedNodeKind.classDeclaration,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = classDeclaration_extendsClause,
+        _variantField_15 = classDeclaration_abstractKeyword,
+        _variantField_7 = classDeclaration_withClause,
+        _variantField_16 = classDeclaration_classKeyword,
+        _variantField_18 = classOrMixinDeclaration_rightBracket,
+        _variantField_19 = classOrMixinDeclaration_leftBracket,
+        _variantField_12 = classOrMixinDeclaration_implementsClause,
+        _variantField_5 = classOrMixinDeclaration_members,
+        _variantField_13 = classOrMixinDeclaration_typeParameters,
+        _variantField_14 = namedCompilationUnitMember_name;
+
+  LinkedNodeBuilder.classTypeAlias({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder classTypeAlias_typeParameters,
+    int classTypeAlias_abstractKeyword,
+    LinkedNodeBuilder classTypeAlias_superclass,
+    LinkedNodeBuilder classTypeAlias_withClause,
+    int classTypeAlias_equals,
+    int typeAlias_typedefKeyword,
+    int typeAlias_semicolon,
+    LinkedNodeBuilder classTypeAlias_implementsClause,
+    LinkedNodeBuilder namedCompilationUnitMember_name,
+  })  : _kind = idl.LinkedNodeKind.classTypeAlias,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = classTypeAlias_typeParameters,
+        _variantField_15 = classTypeAlias_abstractKeyword,
+        _variantField_7 = classTypeAlias_superclass,
+        _variantField_8 = classTypeAlias_withClause,
+        _variantField_16 = classTypeAlias_equals,
+        _variantField_18 = typeAlias_typedefKeyword,
+        _variantField_19 = typeAlias_semicolon,
+        _variantField_9 = classTypeAlias_implementsClause,
+        _variantField_14 = namedCompilationUnitMember_name;
+
+  LinkedNodeBuilder.declaredIdentifier({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder declaredIdentifier_identifier,
+    int declaredIdentifier_keyword,
+    LinkedNodeBuilder declaredIdentifier_type,
+  })  : _kind = idl.LinkedNodeKind.declaredIdentifier,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = declaredIdentifier_identifier,
+        _variantField_15 = declaredIdentifier_keyword,
+        _variantField_7 = declaredIdentifier_type;
+
+  LinkedNodeBuilder.enumConstantDeclaration({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder enumConstantDeclaration_name,
+  })  : _kind = idl.LinkedNodeKind.enumConstantDeclaration,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = enumConstantDeclaration_name;
+
+  LinkedNodeBuilder.fieldDeclaration({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder fieldDeclaration_fields,
+    int fieldDeclaration_covariantKeyword,
+    int fieldDeclaration_semicolon,
+    int fieldDeclaration_staticKeyword,
+  })  : _kind = idl.LinkedNodeKind.fieldDeclaration,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = fieldDeclaration_fields,
+        _variantField_15 = fieldDeclaration_covariantKeyword,
+        _variantField_16 = fieldDeclaration_semicolon,
+        _variantField_17 = fieldDeclaration_staticKeyword;
+
+  LinkedNodeBuilder.functionDeclaration({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder functionDeclaration_functionExpression,
+    int functionDeclaration_externalKeyword,
+    LinkedNodeBuilder functionDeclaration_returnType,
+    int functionDeclaration_propertyKeyword,
+    LinkedNodeBuilder namedCompilationUnitMember_name,
+  })  : _kind = idl.LinkedNodeKind.functionDeclaration,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = functionDeclaration_functionExpression,
+        _variantField_15 = functionDeclaration_externalKeyword,
+        _variantField_7 = functionDeclaration_returnType,
+        _variantField_16 = functionDeclaration_propertyKeyword,
+        _variantField_14 = namedCompilationUnitMember_name;
+
+  LinkedNodeBuilder.functionTypeAlias({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder functionTypeAlias_formalParameters,
+    LinkedNodeBuilder functionTypeAlias_returnType,
+    LinkedNodeBuilder functionTypeAlias_typeParameters,
+    int typeAlias_typedefKeyword,
+    int typeAlias_semicolon,
+    LinkedNodeBuilder namedCompilationUnitMember_name,
+  })  : _kind = idl.LinkedNodeKind.functionTypeAlias,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = functionTypeAlias_formalParameters,
+        _variantField_7 = functionTypeAlias_returnType,
+        _variantField_8 = functionTypeAlias_typeParameters,
+        _variantField_18 = typeAlias_typedefKeyword,
+        _variantField_19 = typeAlias_semicolon,
+        _variantField_14 = namedCompilationUnitMember_name;
+
+  LinkedNodeBuilder.genericTypeAlias({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder genericTypeAlias_typeParameters,
+    LinkedNodeBuilder genericTypeAlias_functionType,
+    int genericTypeAlias_equals,
+    int typeAlias_typedefKeyword,
+    int typeAlias_semicolon,
+    LinkedNodeBuilder namedCompilationUnitMember_name,
+  })  : _kind = idl.LinkedNodeKind.genericTypeAlias,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = genericTypeAlias_typeParameters,
+        _variantField_7 = genericTypeAlias_functionType,
+        _variantField_16 = genericTypeAlias_equals,
+        _variantField_18 = typeAlias_typedefKeyword,
+        _variantField_19 = typeAlias_semicolon,
+        _variantField_14 = namedCompilationUnitMember_name;
+
+  LinkedNodeBuilder.libraryDirective({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder libraryDirective_name,
+    int directive_keyword,
+    int namespaceDirective_semicolon,
+  })  : _kind = idl.LinkedNodeKind.libraryDirective,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = libraryDirective_name,
+        _variantField_17 = directive_keyword,
+        _variantField_18 = namespaceDirective_semicolon;
+
+  LinkedNodeBuilder.methodDeclaration({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder methodDeclaration_body,
+    int methodDeclaration_externalKeyword,
+    LinkedNodeBuilder methodDeclaration_formalParameters,
+    LinkedNodeBuilder methodDeclaration_returnType,
+    int methodDeclaration_modifierKeyword,
+    int methodDeclaration_operatorKeyword,
+    int methodDeclaration_propertyKeyword,
+    LinkedNodeBuilder methodDeclaration_typeParameters,
+    LinkedNodeBuilder methodDeclaration_name,
+  })  : _kind = idl.LinkedNodeKind.methodDeclaration,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = methodDeclaration_body,
+        _variantField_15 = methodDeclaration_externalKeyword,
+        _variantField_7 = methodDeclaration_formalParameters,
+        _variantField_8 = methodDeclaration_returnType,
+        _variantField_16 = methodDeclaration_modifierKeyword,
+        _variantField_17 = methodDeclaration_operatorKeyword,
+        _variantField_18 = methodDeclaration_propertyKeyword,
+        _variantField_9 = methodDeclaration_typeParameters,
+        _variantField_10 = methodDeclaration_name;
+
+  LinkedNodeBuilder.mixinDeclaration({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder mixinDeclaration_onClause,
+    int mixinDeclaration_mixinKeyword,
+    int classOrMixinDeclaration_rightBracket,
+    int classOrMixinDeclaration_leftBracket,
+    LinkedNodeBuilder classOrMixinDeclaration_implementsClause,
+    List<LinkedNodeBuilder> classOrMixinDeclaration_members,
+    LinkedNodeBuilder classOrMixinDeclaration_typeParameters,
+    LinkedNodeBuilder namedCompilationUnitMember_name,
+  })  : _kind = idl.LinkedNodeKind.mixinDeclaration,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = mixinDeclaration_onClause,
+        _variantField_15 = mixinDeclaration_mixinKeyword,
+        _variantField_18 = classOrMixinDeclaration_rightBracket,
+        _variantField_19 = classOrMixinDeclaration_leftBracket,
+        _variantField_12 = classOrMixinDeclaration_implementsClause,
+        _variantField_5 = classOrMixinDeclaration_members,
+        _variantField_13 = classOrMixinDeclaration_typeParameters,
+        _variantField_14 = namedCompilationUnitMember_name;
+
+  LinkedNodeBuilder.partDirective({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    int directive_keyword,
+    int namespaceDirective_semicolon,
+    int uriBasedDirective_uriElement,
+    LinkedNodeBuilder uriBasedDirective_uri,
+    String namespaceDirective_selectedUriContent,
+    String uriBasedDirective_uriContent,
+  })  : _kind = idl.LinkedNodeKind.partDirective,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_17 = directive_keyword,
+        _variantField_18 = namespaceDirective_semicolon,
+        _variantField_19 = uriBasedDirective_uriElement,
+        _variantField_14 = uriBasedDirective_uri,
+        _variantField_23 = namespaceDirective_selectedUriContent,
+        _variantField_22 = uriBasedDirective_uriContent;
+
+  LinkedNodeBuilder.partOfDirective({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder partOfDirective_libraryName,
+    int partOfDirective_semicolon,
+    LinkedNodeBuilder partOfDirective_uri,
+    int partOfDirective_ofKeyword,
+    int directive_keyword,
+    String namespaceDirective_selectedUriContent,
+  })  : _kind = idl.LinkedNodeKind.partOfDirective,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = partOfDirective_libraryName,
+        _variantField_15 = partOfDirective_semicolon,
+        _variantField_7 = partOfDirective_uri,
+        _variantField_16 = partOfDirective_ofKeyword,
+        _variantField_17 = directive_keyword,
+        _variantField_23 = namespaceDirective_selectedUriContent;
+
+  LinkedNodeBuilder.topLevelVariableDeclaration({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder topLevelVariableDeclaration_variableList,
+    int topLevelVariableDeclaration_semicolon,
+  })  : _kind = idl.LinkedNodeKind.topLevelVariableDeclaration,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = topLevelVariableDeclaration_variableList,
+        _variantField_15 = topLevelVariableDeclaration_semicolon;
+
+  LinkedNodeBuilder.typeParameter({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder typeParameter_bound,
+    int typeParameter_extendsKeyword,
+    LinkedNodeBuilder typeParameter_name,
+  })  : _kind = idl.LinkedNodeKind.typeParameter,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = typeParameter_bound,
+        _variantField_15 = typeParameter_extendsKeyword,
+        _variantField_7 = typeParameter_name;
+
+  LinkedNodeBuilder.variableDeclaration({
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder variableDeclaration_initializer,
+    int variableDeclaration_equals,
+    LinkedNodeBuilder variableDeclaration_name,
+  })  : _kind = idl.LinkedNodeKind.variableDeclaration,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = variableDeclaration_initializer,
+        _variantField_15 = variableDeclaration_equals,
+        _variantField_7 = variableDeclaration_name;
+
+  LinkedNodeBuilder.fieldFormalParameter({
+    List<LinkedNodeBuilder> normalFormalParameter_metadata,
+    LinkedNodeBuilder fieldFormalParameter_type,
+    int fieldFormalParameter_keyword,
+    LinkedNodeBuilder fieldFormalParameter_typeParameters,
+    LinkedNodeBuilder fieldFormalParameter_formalParameters,
+    int fieldFormalParameter_period,
+    int fieldFormalParameter_thisKeyword,
+    int normalFormalParameter_covariantKeyword,
+    LinkedNodeBuilder normalFormalParameter_identifier,
+    idl.LinkedNodeFormalParameterKind formalParameter_kind,
+    LinkedNodeBuilder normalFormalParameter_comment,
+  })  : _kind = idl.LinkedNodeKind.fieldFormalParameter,
+        _variantField_4 = normalFormalParameter_metadata,
+        _variantField_6 = fieldFormalParameter_type,
+        _variantField_15 = fieldFormalParameter_keyword,
+        _variantField_7 = fieldFormalParameter_typeParameters,
+        _variantField_8 = fieldFormalParameter_formalParameters,
+        _variantField_16 = fieldFormalParameter_period,
+        _variantField_17 = fieldFormalParameter_thisKeyword,
+        _variantField_19 = normalFormalParameter_covariantKeyword,
+        _variantField_12 = normalFormalParameter_identifier,
+        _variantField_26 = formalParameter_kind,
+        _variantField_14 = normalFormalParameter_comment;
+
+  LinkedNodeBuilder.functionTypedFormalParameter({
+    List<LinkedNodeBuilder> normalFormalParameter_metadata,
+    LinkedNodeBuilder functionTypedFormalParameter_formalParameters,
+    LinkedNodeBuilder functionTypedFormalParameter_returnType,
+    LinkedNodeBuilder functionTypedFormalParameter_typeParameters,
+    int normalFormalParameter_covariantKeyword,
+    LinkedNodeBuilder normalFormalParameter_identifier,
+    idl.LinkedNodeFormalParameterKind formalParameter_kind,
+    LinkedNodeBuilder normalFormalParameter_comment,
+  })  : _kind = idl.LinkedNodeKind.functionTypedFormalParameter,
+        _variantField_4 = normalFormalParameter_metadata,
+        _variantField_6 = functionTypedFormalParameter_formalParameters,
+        _variantField_7 = functionTypedFormalParameter_returnType,
+        _variantField_8 = functionTypedFormalParameter_typeParameters,
+        _variantField_19 = normalFormalParameter_covariantKeyword,
+        _variantField_12 = normalFormalParameter_identifier,
+        _variantField_26 = formalParameter_kind,
+        _variantField_14 = normalFormalParameter_comment;
+
+  LinkedNodeBuilder.simpleFormalParameter({
+    List<LinkedNodeBuilder> normalFormalParameter_metadata,
+    LinkedNodeBuilder simpleFormalParameter_type,
+    int simpleFormalParameter_keyword,
+    int normalFormalParameter_covariantKeyword,
+    LinkedNodeBuilder normalFormalParameter_identifier,
+    idl.LinkedNodeFormalParameterKind formalParameter_kind,
+    LinkedNodeBuilder normalFormalParameter_comment,
+  })  : _kind = idl.LinkedNodeKind.simpleFormalParameter,
+        _variantField_4 = normalFormalParameter_metadata,
+        _variantField_6 = simpleFormalParameter_type,
+        _variantField_15 = simpleFormalParameter_keyword,
+        _variantField_19 = normalFormalParameter_covariantKeyword,
+        _variantField_12 = normalFormalParameter_identifier,
+        _variantField_26 = formalParameter_kind,
+        _variantField_14 = normalFormalParameter_comment;
+
+  LinkedNodeBuilder.switchCase({
+    List<LinkedNodeBuilder> switchMember_statements,
+    LinkedNodeBuilder switchCase_expression,
+    int switchMember_keyword,
+    int switchMember_colon,
+    List<LinkedNodeBuilder> switchMember_labels,
+  })  : _kind = idl.LinkedNodeKind.switchCase,
+        _variantField_4 = switchMember_statements,
+        _variantField_6 = switchCase_expression,
+        _variantField_15 = switchMember_keyword,
+        _variantField_16 = switchMember_colon,
+        _variantField_3 = switchMember_labels;
+
+  LinkedNodeBuilder.switchDefault({
+    List<LinkedNodeBuilder> switchMember_statements,
+    int switchMember_keyword,
+    int switchMember_colon,
+    List<LinkedNodeBuilder> switchMember_labels,
+  })  : _kind = idl.LinkedNodeKind.switchDefault,
+        _variantField_4 = switchMember_statements,
+        _variantField_15 = switchMember_keyword,
+        _variantField_16 = switchMember_colon,
+        _variantField_3 = switchMember_labels;
+
+  LinkedNodeBuilder.annotation({
+    LinkedNodeBuilder annotation_arguments,
+    int annotation_atSign,
+    LinkedNodeBuilder annotation_constructorName,
+    LinkedNodeBuilder annotation_name,
+    int annotation_period,
+  })  : _kind = idl.LinkedNodeKind.annotation,
+        _variantField_6 = annotation_arguments,
+        _variantField_15 = annotation_atSign,
+        _variantField_7 = annotation_constructorName,
+        _variantField_8 = annotation_name,
+        _variantField_16 = annotation_period;
+
+  LinkedNodeBuilder.asExpression({
+    LinkedNodeBuilder asExpression_expression,
+    int asExpression_asOperator,
+    LinkedNodeBuilder asExpression_type,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.asExpression,
+        _variantField_6 = asExpression_expression,
+        _variantField_15 = asExpression_asOperator,
+        _variantField_7 = asExpression_type,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.assertInitializer({
+    LinkedNodeBuilder assertInitializer_condition,
+    int assertInitializer_assertKeyword,
+    LinkedNodeBuilder assertInitializer_message,
+    int assertInitializer_comma,
+    int assertInitializer_leftParenthesis,
+    int assertInitializer_rightParenthesis,
+  })  : _kind = idl.LinkedNodeKind.assertInitializer,
+        _variantField_6 = assertInitializer_condition,
+        _variantField_15 = assertInitializer_assertKeyword,
+        _variantField_7 = assertInitializer_message,
+        _variantField_16 = assertInitializer_comma,
+        _variantField_17 = assertInitializer_leftParenthesis,
+        _variantField_18 = assertInitializer_rightParenthesis;
+
+  LinkedNodeBuilder.assertStatement({
+    LinkedNodeBuilder assertStatement_condition,
+    int assertStatement_assertKeyword,
+    LinkedNodeBuilder assertStatement_message,
+    int assertStatement_comma,
+    int assertStatement_leftParenthesis,
+    int assertStatement_rightParenthesis,
+    int assertStatement_semicolon,
+  })  : _kind = idl.LinkedNodeKind.assertStatement,
+        _variantField_6 = assertStatement_condition,
+        _variantField_15 = assertStatement_assertKeyword,
+        _variantField_7 = assertStatement_message,
+        _variantField_16 = assertStatement_comma,
+        _variantField_17 = assertStatement_leftParenthesis,
+        _variantField_18 = assertStatement_rightParenthesis,
+        _variantField_19 = assertStatement_semicolon;
+
+  LinkedNodeBuilder.assignmentExpression({
+    LinkedNodeBuilder assignmentExpression_leftHandSide,
+    int assignmentExpression_element,
+    LinkedNodeBuilder assignmentExpression_rightHandSide,
+    int assignmentExpression_operator,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.assignmentExpression,
+        _variantField_6 = assignmentExpression_leftHandSide,
+        _variantField_15 = assignmentExpression_element,
+        _variantField_7 = assignmentExpression_rightHandSide,
+        _variantField_16 = assignmentExpression_operator,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.awaitExpression({
+    LinkedNodeBuilder awaitExpression_expression,
+    int awaitExpression_awaitKeyword,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.awaitExpression,
+        _variantField_6 = awaitExpression_expression,
+        _variantField_15 = awaitExpression_awaitKeyword,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.binaryExpression({
+    LinkedNodeBuilder binaryExpression_leftOperand,
+    int binaryExpression_element,
+    LinkedNodeBuilder binaryExpression_rightOperand,
+    int binaryExpression_operator,
+    LinkedNodeTypeBuilder binaryExpression_invokeType,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.binaryExpression,
+        _variantField_6 = binaryExpression_leftOperand,
+        _variantField_15 = binaryExpression_element,
+        _variantField_7 = binaryExpression_rightOperand,
+        _variantField_16 = binaryExpression_operator,
+        _variantField_24 = binaryExpression_invokeType,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.blockFunctionBody({
+    LinkedNodeBuilder blockFunctionBody_block,
+    int blockFunctionBody_keyword,
+    int blockFunctionBody_star,
+  })  : _kind = idl.LinkedNodeKind.blockFunctionBody,
+        _variantField_6 = blockFunctionBody_block,
+        _variantField_15 = blockFunctionBody_keyword,
+        _variantField_16 = blockFunctionBody_star;
+
+  LinkedNodeBuilder.breakStatement({
+    LinkedNodeBuilder breakStatement_label,
+    int breakStatement_breakKeyword,
+    int breakStatement_semicolon,
+  })  : _kind = idl.LinkedNodeKind.breakStatement,
+        _variantField_6 = breakStatement_label,
+        _variantField_15 = breakStatement_breakKeyword,
+        _variantField_16 = breakStatement_semicolon;
+
+  LinkedNodeBuilder.catchClause({
+    LinkedNodeBuilder catchClause_body,
+    int catchClause_catchKeyword,
+    LinkedNodeBuilder catchClause_exceptionParameter,
+    LinkedNodeBuilder catchClause_exceptionType,
+    int catchClause_comma,
+    int catchClause_leftParenthesis,
+    int catchClause_onKeyword,
+    int catchClause_rightParenthesis,
+    LinkedNodeBuilder catchClause_stackTraceParameter,
+  })  : _kind = idl.LinkedNodeKind.catchClause,
+        _variantField_6 = catchClause_body,
+        _variantField_15 = catchClause_catchKeyword,
+        _variantField_7 = catchClause_exceptionParameter,
+        _variantField_8 = catchClause_exceptionType,
+        _variantField_16 = catchClause_comma,
+        _variantField_17 = catchClause_leftParenthesis,
+        _variantField_18 = catchClause_onKeyword,
+        _variantField_19 = catchClause_rightParenthesis,
+        _variantField_9 = catchClause_stackTraceParameter;
+
+  LinkedNodeBuilder.conditionalExpression({
+    LinkedNodeBuilder conditionalExpression_condition,
+    int conditionalExpression_colon,
+    LinkedNodeBuilder conditionalExpression_elseExpression,
+    LinkedNodeBuilder conditionalExpression_thenExpression,
+    int conditionalExpression_question,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.conditionalExpression,
+        _variantField_6 = conditionalExpression_condition,
+        _variantField_15 = conditionalExpression_colon,
+        _variantField_7 = conditionalExpression_elseExpression,
+        _variantField_8 = conditionalExpression_thenExpression,
+        _variantField_16 = conditionalExpression_question,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.configuration({
+    LinkedNodeBuilder configuration_name,
+    int configuration_ifKeyword,
+    LinkedNodeBuilder configuration_value,
+    LinkedNodeBuilder configuration_uri,
+    int configuration_leftParenthesis,
+    int configuration_rightParenthesis,
+    int configuration_equalToken,
+  })  : _kind = idl.LinkedNodeKind.configuration,
+        _variantField_6 = configuration_name,
+        _variantField_15 = configuration_ifKeyword,
+        _variantField_7 = configuration_value,
+        _variantField_8 = configuration_uri,
+        _variantField_16 = configuration_leftParenthesis,
+        _variantField_17 = configuration_rightParenthesis,
+        _variantField_18 = configuration_equalToken;
+
+  LinkedNodeBuilder.constructorFieldInitializer({
+    LinkedNodeBuilder constructorFieldInitializer_expression,
+    int constructorFieldInitializer_equals,
+    LinkedNodeBuilder constructorFieldInitializer_fieldName,
+    int constructorFieldInitializer_period,
+    int constructorFieldInitializer_thisKeyword,
+  })  : _kind = idl.LinkedNodeKind.constructorFieldInitializer,
+        _variantField_6 = constructorFieldInitializer_expression,
+        _variantField_15 = constructorFieldInitializer_equals,
+        _variantField_7 = constructorFieldInitializer_fieldName,
+        _variantField_16 = constructorFieldInitializer_period,
+        _variantField_17 = constructorFieldInitializer_thisKeyword;
+
+  LinkedNodeBuilder.constructorName({
+    LinkedNodeBuilder constructorName_name,
+    int constructorName_element,
+    LinkedNodeBuilder constructorName_type,
+    int constructorName_period,
+  })  : _kind = idl.LinkedNodeKind.constructorName,
+        _variantField_6 = constructorName_name,
+        _variantField_15 = constructorName_element,
+        _variantField_7 = constructorName_type,
+        _variantField_16 = constructorName_period;
+
+  LinkedNodeBuilder.continueStatement({
+    LinkedNodeBuilder continueStatement_label,
+    int continueStatement_continueKeyword,
+    int continueStatement_semicolon,
+  })  : _kind = idl.LinkedNodeKind.continueStatement,
+        _variantField_6 = continueStatement_label,
+        _variantField_15 = continueStatement_continueKeyword,
+        _variantField_16 = continueStatement_semicolon;
+
+  LinkedNodeBuilder.defaultFormalParameter({
+    LinkedNodeBuilder defaultFormalParameter_defaultValue,
+    int defaultFormalParameter_separator,
+    LinkedNodeBuilder defaultFormalParameter_parameter,
+    bool defaultFormalParameter_isNamed,
+  })  : _kind = idl.LinkedNodeKind.defaultFormalParameter,
+        _variantField_6 = defaultFormalParameter_defaultValue,
+        _variantField_15 = defaultFormalParameter_separator,
+        _variantField_7 = defaultFormalParameter_parameter,
+        _variantField_27 = defaultFormalParameter_isNamed;
+
+  LinkedNodeBuilder.doStatement({
+    LinkedNodeBuilder doStatement_body,
+    int doStatement_leftParenthesis,
+    LinkedNodeBuilder doStatement_condition,
+    int doStatement_rightParenthesis,
+    int doStatement_doKeyword,
+    int doStatement_semicolon,
+    int doStatement_whileKeyword,
+  })  : _kind = idl.LinkedNodeKind.doStatement,
+        _variantField_6 = doStatement_body,
+        _variantField_15 = doStatement_leftParenthesis,
+        _variantField_7 = doStatement_condition,
+        _variantField_16 = doStatement_rightParenthesis,
+        _variantField_17 = doStatement_doKeyword,
+        _variantField_18 = doStatement_semicolon,
+        _variantField_19 = doStatement_whileKeyword;
+
+  LinkedNodeBuilder.expressionFunctionBody({
+    LinkedNodeBuilder expressionFunctionBody_expression,
+    int expressionFunctionBody_arrow,
+    int expressionFunctionBody_keyword,
+    int expressionFunctionBody_semicolon,
+  })  : _kind = idl.LinkedNodeKind.expressionFunctionBody,
+        _variantField_6 = expressionFunctionBody_expression,
+        _variantField_15 = expressionFunctionBody_arrow,
+        _variantField_16 = expressionFunctionBody_keyword,
+        _variantField_17 = expressionFunctionBody_semicolon;
+
+  LinkedNodeBuilder.expressionStatement({
+    LinkedNodeBuilder expressionStatement_expression,
+    int expressionStatement_semicolon,
+  })  : _kind = idl.LinkedNodeKind.expressionStatement,
+        _variantField_6 = expressionStatement_expression,
+        _variantField_15 = expressionStatement_semicolon;
+
+  LinkedNodeBuilder.extendsClause({
+    LinkedNodeBuilder extendsClause_superclass,
+    int extendsClause_extendsKeyword,
+  })  : _kind = idl.LinkedNodeKind.extendsClause,
+        _variantField_6 = extendsClause_superclass,
+        _variantField_15 = extendsClause_extendsKeyword;
+
+  LinkedNodeBuilder.forEachPartsWithDeclaration({
+    LinkedNodeBuilder forEachParts_iterable,
+    int forEachParts_inKeyword,
+    LinkedNodeBuilder forEachPartsWithDeclaration_loopVariable,
+  })  : _kind = idl.LinkedNodeKind.forEachPartsWithDeclaration,
+        _variantField_6 = forEachParts_iterable,
+        _variantField_15 = forEachParts_inKeyword,
+        _variantField_7 = forEachPartsWithDeclaration_loopVariable;
+
+  LinkedNodeBuilder.forEachPartsWithIdentifier({
+    LinkedNodeBuilder forEachParts_iterable,
+    int forEachParts_inKeyword,
+    LinkedNodeBuilder forEachPartsWithIdentifier_identifier,
+  })  : _kind = idl.LinkedNodeKind.forEachPartsWithIdentifier,
+        _variantField_6 = forEachParts_iterable,
+        _variantField_15 = forEachParts_inKeyword,
+        _variantField_7 = forEachPartsWithIdentifier_identifier;
+
+  LinkedNodeBuilder.forElement({
+    LinkedNodeBuilder forMixin_forLoopParts,
+    int forMixin_awaitKeyword,
+    LinkedNodeBuilder forElement_body,
+    int forMixin_forKeyword,
+    int forMixin_leftParenthesis,
+    int forMixin_rightParenthesis,
+  })  : _kind = idl.LinkedNodeKind.forElement,
+        _variantField_6 = forMixin_forLoopParts,
+        _variantField_15 = forMixin_awaitKeyword,
+        _variantField_7 = forElement_body,
+        _variantField_16 = forMixin_forKeyword,
+        _variantField_17 = forMixin_leftParenthesis,
+        _variantField_19 = forMixin_rightParenthesis;
+
+  LinkedNodeBuilder.forStatement({
+    LinkedNodeBuilder forMixin_forLoopParts,
+    int forMixin_awaitKeyword,
+    LinkedNodeBuilder forStatement_body,
+    int forMixin_forKeyword,
+    int forMixin_leftParenthesis,
+    int forMixin_rightParenthesis,
+  })  : _kind = idl.LinkedNodeKind.forStatement,
+        _variantField_6 = forMixin_forLoopParts,
+        _variantField_15 = forMixin_awaitKeyword,
+        _variantField_7 = forStatement_body,
+        _variantField_16 = forMixin_forKeyword,
+        _variantField_17 = forMixin_leftParenthesis,
+        _variantField_19 = forMixin_rightParenthesis;
+
+  LinkedNodeBuilder.forPartsWithDeclarations({
+    LinkedNodeBuilder forParts_condition,
+    int forParts_leftSeparator,
+    LinkedNodeBuilder forPartsWithDeclarations_variables,
+    int forParts_rightSeparator,
+    List<LinkedNodeBuilder> forParts_updaters,
+  })  : _kind = idl.LinkedNodeKind.forPartsWithDeclarations,
+        _variantField_6 = forParts_condition,
+        _variantField_15 = forParts_leftSeparator,
+        _variantField_7 = forPartsWithDeclarations_variables,
+        _variantField_16 = forParts_rightSeparator,
+        _variantField_5 = forParts_updaters;
+
+  LinkedNodeBuilder.forPartsWithExpression({
+    LinkedNodeBuilder forParts_condition,
+    int forParts_leftSeparator,
+    LinkedNodeBuilder forPartsWithExpression_initialization,
+    int forParts_rightSeparator,
+    List<LinkedNodeBuilder> forParts_updaters,
+  })  : _kind = idl.LinkedNodeKind.forPartsWithExpression,
+        _variantField_6 = forParts_condition,
+        _variantField_15 = forParts_leftSeparator,
+        _variantField_7 = forPartsWithExpression_initialization,
+        _variantField_16 = forParts_rightSeparator,
+        _variantField_5 = forParts_updaters;
+
+  LinkedNodeBuilder.functionDeclarationStatement({
+    LinkedNodeBuilder functionDeclarationStatement_functionDeclaration,
+  })  : _kind = idl.LinkedNodeKind.functionDeclarationStatement,
+        _variantField_6 = functionDeclarationStatement_functionDeclaration;
+
+  LinkedNodeBuilder.functionExpression({
+    LinkedNodeBuilder functionExpression_body,
+    LinkedNodeBuilder functionExpression_formalParameters,
+    LinkedNodeBuilder functionExpression_typeParameters,
+  })  : _kind = idl.LinkedNodeKind.functionExpression,
+        _variantField_6 = functionExpression_body,
+        _variantField_7 = functionExpression_formalParameters,
+        _variantField_8 = functionExpression_typeParameters;
+
+  LinkedNodeBuilder.functionExpressionInvocation({
+    LinkedNodeBuilder functionExpressionInvocation_function,
+    LinkedNodeTypeBuilder invocationExpression_invokeType,
+    LinkedNodeBuilder invocationExpression_typeArguments,
+    LinkedNodeTypeBuilder expression_type,
+    LinkedNodeBuilder invocationExpression_arguments,
+  })  : _kind = idl.LinkedNodeKind.functionExpressionInvocation,
+        _variantField_6 = functionExpressionInvocation_function,
+        _variantField_24 = invocationExpression_invokeType,
+        _variantField_12 = invocationExpression_typeArguments,
+        _variantField_25 = expression_type,
+        _variantField_14 = invocationExpression_arguments;
+
+  LinkedNodeBuilder.genericFunctionType({
+    LinkedNodeBuilder genericFunctionType_typeParameters,
+    int genericFunctionType_functionKeyword,
+    LinkedNodeBuilder genericFunctionType_returnType,
+    LinkedNodeBuilder genericFunctionType_formalParameters,
+    int genericFunctionType_question,
+  })  : _kind = idl.LinkedNodeKind.genericFunctionType,
+        _variantField_6 = genericFunctionType_typeParameters,
+        _variantField_15 = genericFunctionType_functionKeyword,
+        _variantField_7 = genericFunctionType_returnType,
+        _variantField_8 = genericFunctionType_formalParameters,
+        _variantField_16 = genericFunctionType_question;
+
+  LinkedNodeBuilder.ifElement({
+    LinkedNodeBuilder ifMixin_condition,
+    int ifMixin_elseKeyword,
+    LinkedNodeBuilder ifElement_thenElement,
+    int ifMixin_ifKeyword,
+    int ifMixin_leftParenthesis,
+    int ifMixin_rightParenthesis,
+    LinkedNodeBuilder ifElement_elseElement,
+  })  : _kind = idl.LinkedNodeKind.ifElement,
+        _variantField_6 = ifMixin_condition,
+        _variantField_15 = ifMixin_elseKeyword,
+        _variantField_8 = ifElement_thenElement,
+        _variantField_16 = ifMixin_ifKeyword,
+        _variantField_17 = ifMixin_leftParenthesis,
+        _variantField_18 = ifMixin_rightParenthesis,
+        _variantField_9 = ifElement_elseElement;
+
+  LinkedNodeBuilder.ifStatement({
+    LinkedNodeBuilder ifMixin_condition,
+    int ifMixin_elseKeyword,
+    LinkedNodeBuilder ifStatement_elseStatement,
+    LinkedNodeBuilder ifStatement_thenStatement,
+    int ifMixin_ifKeyword,
+    int ifMixin_leftParenthesis,
+    int ifMixin_rightParenthesis,
+  })  : _kind = idl.LinkedNodeKind.ifStatement,
+        _variantField_6 = ifMixin_condition,
+        _variantField_15 = ifMixin_elseKeyword,
+        _variantField_7 = ifStatement_elseStatement,
+        _variantField_8 = ifStatement_thenStatement,
+        _variantField_16 = ifMixin_ifKeyword,
+        _variantField_17 = ifMixin_leftParenthesis,
+        _variantField_18 = ifMixin_rightParenthesis;
+
+  LinkedNodeBuilder.indexExpression({
+    LinkedNodeBuilder indexExpression_index,
+    int indexExpression_element,
+    LinkedNodeBuilder indexExpression_target,
+    int indexExpression_leftBracket,
+    int indexExpression_rightBracket,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.indexExpression,
+        _variantField_6 = indexExpression_index,
+        _variantField_15 = indexExpression_element,
+        _variantField_7 = indexExpression_target,
+        _variantField_16 = indexExpression_leftBracket,
+        _variantField_17 = indexExpression_rightBracket,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.instanceCreationExpression({
+    LinkedNodeBuilder instanceCreationExpression_arguments,
+    int instanceCreationExpression_keyword,
+    LinkedNodeBuilder instanceCreationExpression_constructorName,
+    LinkedNodeBuilder instanceCreationExpression_typeArguments,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.instanceCreationExpression,
+        _variantField_6 = instanceCreationExpression_arguments,
+        _variantField_15 = instanceCreationExpression_keyword,
+        _variantField_7 = instanceCreationExpression_constructorName,
+        _variantField_8 = instanceCreationExpression_typeArguments,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.interpolationExpression({
+    LinkedNodeBuilder interpolationExpression_expression,
+    int interpolationExpression_leftBracket,
+    int interpolationExpression_rightBracket,
+  })  : _kind = idl.LinkedNodeKind.interpolationExpression,
+        _variantField_6 = interpolationExpression_expression,
+        _variantField_15 = interpolationExpression_leftBracket,
+        _variantField_16 = interpolationExpression_rightBracket;
+
+  LinkedNodeBuilder.isExpression({
+    LinkedNodeBuilder isExpression_expression,
+    int isExpression_isOperator,
+    LinkedNodeBuilder isExpression_type,
+    int isExpression_notOperator,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.isExpression,
+        _variantField_6 = isExpression_expression,
+        _variantField_15 = isExpression_isOperator,
+        _variantField_7 = isExpression_type,
+        _variantField_16 = isExpression_notOperator,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.label({
+    LinkedNodeBuilder label_label,
+    int label_colon,
+  })  : _kind = idl.LinkedNodeKind.label,
+        _variantField_6 = label_label,
+        _variantField_15 = label_colon;
+
+  LinkedNodeBuilder.mapLiteralEntry({
+    LinkedNodeBuilder mapLiteralEntry_key,
+    int mapLiteralEntry_separator,
+    LinkedNodeBuilder mapLiteralEntry_value,
+  })  : _kind = idl.LinkedNodeKind.mapLiteralEntry,
+        _variantField_6 = mapLiteralEntry_key,
+        _variantField_15 = mapLiteralEntry_separator,
+        _variantField_7 = mapLiteralEntry_value;
+
+  LinkedNodeBuilder.methodInvocation({
+    LinkedNodeBuilder methodInvocation_methodName,
+    int methodInvocation_operator,
+    LinkedNodeBuilder methodInvocation_target,
+    LinkedNodeTypeBuilder invocationExpression_invokeType,
+    LinkedNodeBuilder invocationExpression_typeArguments,
+    LinkedNodeTypeBuilder expression_type,
+    LinkedNodeBuilder invocationExpression_arguments,
+  })  : _kind = idl.LinkedNodeKind.methodInvocation,
+        _variantField_6 = methodInvocation_methodName,
+        _variantField_15 = methodInvocation_operator,
+        _variantField_7 = methodInvocation_target,
+        _variantField_24 = invocationExpression_invokeType,
+        _variantField_12 = invocationExpression_typeArguments,
+        _variantField_25 = expression_type,
+        _variantField_14 = invocationExpression_arguments;
+
+  LinkedNodeBuilder.namedExpression({
+    LinkedNodeBuilder namedExpression_expression,
+    LinkedNodeBuilder namedExpression_name,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.namedExpression,
+        _variantField_6 = namedExpression_expression,
+        _variantField_7 = namedExpression_name,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.parenthesizedExpression({
+    LinkedNodeBuilder parenthesizedExpression_expression,
+    int parenthesizedExpression_leftParenthesis,
+    int parenthesizedExpression_rightParenthesis,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.parenthesizedExpression,
+        _variantField_6 = parenthesizedExpression_expression,
+        _variantField_15 = parenthesizedExpression_leftParenthesis,
+        _variantField_16 = parenthesizedExpression_rightParenthesis,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.postfixExpression({
+    LinkedNodeBuilder postfixExpression_operand,
+    int postfixExpression_element,
+    int postfixExpression_operator,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.postfixExpression,
+        _variantField_6 = postfixExpression_operand,
+        _variantField_15 = postfixExpression_element,
+        _variantField_16 = postfixExpression_operator,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.prefixedIdentifier({
+    LinkedNodeBuilder prefixedIdentifier_identifier,
+    int prefixedIdentifier_period,
+    LinkedNodeBuilder prefixedIdentifier_prefix,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.prefixedIdentifier,
+        _variantField_6 = prefixedIdentifier_identifier,
+        _variantField_15 = prefixedIdentifier_period,
+        _variantField_7 = prefixedIdentifier_prefix,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.prefixExpression({
+    LinkedNodeBuilder prefixExpression_operand,
+    int prefixExpression_element,
+    int prefixExpression_operator,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.prefixExpression,
+        _variantField_6 = prefixExpression_operand,
+        _variantField_15 = prefixExpression_element,
+        _variantField_16 = prefixExpression_operator,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.propertyAccess({
+    LinkedNodeBuilder propertyAccess_propertyName,
+    int propertyAccess_operator,
+    LinkedNodeBuilder propertyAccess_target,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.propertyAccess,
+        _variantField_6 = propertyAccess_propertyName,
+        _variantField_15 = propertyAccess_operator,
+        _variantField_7 = propertyAccess_target,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.redirectingConstructorInvocation({
+    LinkedNodeBuilder redirectingConstructorInvocation_arguments,
+    int redirectingConstructorInvocation_element,
+    LinkedNodeBuilder redirectingConstructorInvocation_constructorName,
+    int redirectingConstructorInvocation_period,
+    int redirectingConstructorInvocation_thisKeyword,
+  })  : _kind = idl.LinkedNodeKind.redirectingConstructorInvocation,
+        _variantField_6 = redirectingConstructorInvocation_arguments,
+        _variantField_15 = redirectingConstructorInvocation_element,
+        _variantField_7 = redirectingConstructorInvocation_constructorName,
+        _variantField_16 = redirectingConstructorInvocation_period,
+        _variantField_17 = redirectingConstructorInvocation_thisKeyword;
+
+  LinkedNodeBuilder.returnStatement({
+    LinkedNodeBuilder returnStatement_expression,
+    int returnStatement_returnKeyword,
+    int returnStatement_semicolon,
+  })  : _kind = idl.LinkedNodeKind.returnStatement,
+        _variantField_6 = returnStatement_expression,
+        _variantField_15 = returnStatement_returnKeyword,
+        _variantField_16 = returnStatement_semicolon;
+
+  LinkedNodeBuilder.spreadElement({
+    LinkedNodeBuilder spreadElement_expression,
+    int spreadElement_spreadOperator,
+  })  : _kind = idl.LinkedNodeKind.spreadElement,
+        _variantField_6 = spreadElement_expression,
+        _variantField_15 = spreadElement_spreadOperator;
+
+  LinkedNodeBuilder.superConstructorInvocation({
+    LinkedNodeBuilder superConstructorInvocation_arguments,
+    int superConstructorInvocation_element,
+    LinkedNodeBuilder superConstructorInvocation_constructorName,
+    int superConstructorInvocation_period,
+    int superConstructorInvocation_superKeyword,
+  })  : _kind = idl.LinkedNodeKind.superConstructorInvocation,
+        _variantField_6 = superConstructorInvocation_arguments,
+        _variantField_15 = superConstructorInvocation_element,
+        _variantField_7 = superConstructorInvocation_constructorName,
+        _variantField_16 = superConstructorInvocation_period,
+        _variantField_17 = superConstructorInvocation_superKeyword;
+
+  LinkedNodeBuilder.throwExpression({
+    LinkedNodeBuilder throwExpression_expression,
+    int throwExpression_throwKeyword,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.throwExpression,
+        _variantField_6 = throwExpression_expression,
+        _variantField_15 = throwExpression_throwKeyword,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.typeName({
+    LinkedNodeBuilder typeName_name,
+    int typeName_question,
+    LinkedNodeBuilder typeName_typeArguments,
+    LinkedNodeTypeBuilder typeName_type,
+  })  : _kind = idl.LinkedNodeKind.typeName,
+        _variantField_6 = typeName_name,
+        _variantField_15 = typeName_question,
+        _variantField_7 = typeName_typeArguments,
+        _variantField_24 = typeName_type;
+
+  LinkedNodeBuilder.variableDeclarationStatement({
+    LinkedNodeBuilder variableDeclarationStatement_variables,
+    int variableDeclarationStatement_semicolon,
+  })  : _kind = idl.LinkedNodeKind.variableDeclarationStatement,
+        _variantField_6 = variableDeclarationStatement_variables,
+        _variantField_15 = variableDeclarationStatement_semicolon;
+
+  LinkedNodeBuilder.whileStatement({
+    LinkedNodeBuilder whileStatement_body,
+    int whileStatement_leftParenthesis,
+    LinkedNodeBuilder whileStatement_condition,
+    int whileStatement_rightParenthesis,
+    int whileStatement_whileKeyword,
+  })  : _kind = idl.LinkedNodeKind.whileStatement,
+        _variantField_6 = whileStatement_body,
+        _variantField_15 = whileStatement_leftParenthesis,
+        _variantField_7 = whileStatement_condition,
+        _variantField_16 = whileStatement_rightParenthesis,
+        _variantField_17 = whileStatement_whileKeyword;
+
+  LinkedNodeBuilder.yieldStatement({
+    LinkedNodeBuilder yieldStatement_expression,
+    int yieldStatement_yieldKeyword,
+    int yieldStatement_star,
+    int yieldStatement_semicolon,
+  })  : _kind = idl.LinkedNodeKind.yieldStatement,
+        _variantField_6 = yieldStatement_expression,
+        _variantField_15 = yieldStatement_yieldKeyword,
+        _variantField_16 = yieldStatement_star,
+        _variantField_17 = yieldStatement_semicolon;
+
+  LinkedNodeBuilder.booleanLiteral({
+    int booleanLiteral_literal,
+    bool booleanLiteral_value,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.booleanLiteral,
+        _variantField_15 = booleanLiteral_literal,
+        _variantField_27 = booleanLiteral_value,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.doubleLiteral({
+    int doubleLiteral_literal,
+    double doubleLiteral_value,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.doubleLiteral,
+        _variantField_15 = doubleLiteral_literal,
+        _variantField_21 = doubleLiteral_value,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.emptyFunctionBody({
+    int emptyFunctionBody_semicolon,
+  })  : _kind = idl.LinkedNodeKind.emptyFunctionBody,
+        _variantField_15 = emptyFunctionBody_semicolon;
+
+  LinkedNodeBuilder.emptyStatement({
+    int emptyStatement_semicolon,
+  })  : _kind = idl.LinkedNodeKind.emptyStatement,
+        _variantField_15 = emptyStatement_semicolon;
+
+  LinkedNodeBuilder.integerLiteral({
+    int integerLiteral_literal,
+    int integerLiteral_value,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.integerLiteral,
+        _variantField_15 = integerLiteral_literal,
+        _variantField_16 = integerLiteral_value,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.interpolationString({
+    int interpolationString_token,
+    String interpolationString_value,
+  })  : _kind = idl.LinkedNodeKind.interpolationString,
+        _variantField_15 = interpolationString_token,
+        _variantField_30 = interpolationString_value;
+
+  LinkedNodeBuilder.nullLiteral({
+    int nullLiteral_literal,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.nullLiteral,
+        _variantField_15 = nullLiteral_literal,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.rethrowExpression({
+    int rethrowExpression_rethrowKeyword,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.rethrowExpression,
+        _variantField_15 = rethrowExpression_rethrowKeyword,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.scriptTag({
+    int scriptTag_scriptTag,
+  })  : _kind = idl.LinkedNodeKind.scriptTag,
+        _variantField_15 = scriptTag_scriptTag;
+
+  LinkedNodeBuilder.simpleIdentifier({
+    int simpleIdentifier_element,
+    int simpleIdentifier_token,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.simpleIdentifier,
+        _variantField_15 = simpleIdentifier_element,
+        _variantField_16 = simpleIdentifier_token,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.simpleStringLiteral({
+    int simpleStringLiteral_token,
+    LinkedNodeTypeBuilder expression_type,
+    String simpleStringLiteral_value,
+  })  : _kind = idl.LinkedNodeKind.simpleStringLiteral,
+        _variantField_15 = simpleStringLiteral_token,
+        _variantField_25 = expression_type,
+        _variantField_20 = simpleStringLiteral_value;
+
+  LinkedNodeBuilder.superExpression({
+    int superExpression_superKeyword,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.superExpression,
+        _variantField_15 = superExpression_superKeyword,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.symbolLiteral({
+    int symbolLiteral_poundSign,
+    List<int> symbolLiteral_components,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.symbolLiteral,
+        _variantField_15 = symbolLiteral_poundSign,
+        _variantField_28 = symbolLiteral_components,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.thisExpression({
+    int thisExpression_thisKeyword,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.thisExpression,
+        _variantField_15 = thisExpression_thisKeyword,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.comment({
+    List<int> comment_tokens,
+    idl.LinkedNodeCommentType comment_type,
+  })  : _kind = idl.LinkedNodeKind.comment,
+        _variantField_28 = comment_tokens,
+        _variantField_29 = comment_type;
+
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _variantField_2?.forEach((b) => b.flushInformative());
+    _variantField_11?.flushInformative();
+    _variantField_4?.forEach((b) => b.flushInformative());
+    _variantField_6?.flushInformative();
+    _variantField_7?.flushInformative();
+    _variantField_8?.flushInformative();
+    _variantField_24?.flushInformative();
+    _variantField_9?.flushInformative();
+    _variantField_12?.flushInformative();
+    _variantField_5?.forEach((b) => b.flushInformative());
+    _variantField_13?.flushInformative();
+    _variantField_3?.forEach((b) => b.flushInformative());
+    _variantField_10?.flushInformative();
+    _variantField_25?.flushInformative();
+    _variantField_14?.flushInformative();
+  }
+
+  /**
+   * Accumulate non-[informative] data into [signature].
+   */
+  void collectApiSignature(api_sig.ApiSignature signature) {
+    signature.addInt(this._kind == null ? 0 : this._kind.index);
+    signature.addBool(this._isSynthetic == true);
+    if (this._variantField_2 == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._variantField_2.length);
+      for (var x in this._variantField_2) {
+        x?.collectApiSignature(signature);
+      }
+    }
+    if (this._variantField_3 == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._variantField_3.length);
+      for (var x in this._variantField_3) {
+        x?.collectApiSignature(signature);
+      }
+    }
+    if (this._variantField_4 == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._variantField_4.length);
+      for (var x in this._variantField_4) {
+        x?.collectApiSignature(signature);
+      }
+    }
+    if (this._variantField_5 == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._variantField_5.length);
+      for (var x in this._variantField_5) {
+        x?.collectApiSignature(signature);
+      }
+    }
+    signature.addBool(this._variantField_6 != null);
+    this._variantField_6?.collectApiSignature(signature);
+    signature.addBool(this._variantField_7 != null);
+    this._variantField_7?.collectApiSignature(signature);
+    signature.addBool(this._variantField_8 != null);
+    this._variantField_8?.collectApiSignature(signature);
+    signature.addBool(this._variantField_9 != null);
+    this._variantField_9?.collectApiSignature(signature);
+    signature.addBool(this._variantField_10 != null);
+    this._variantField_10?.collectApiSignature(signature);
+    signature.addBool(this._variantField_11 != null);
+    this._variantField_11?.collectApiSignature(signature);
+    signature.addBool(this._variantField_12 != null);
+    this._variantField_12?.collectApiSignature(signature);
+    signature.addBool(this._variantField_13 != null);
+    this._variantField_13?.collectApiSignature(signature);
+    signature.addBool(this._variantField_14 != null);
+    this._variantField_14?.collectApiSignature(signature);
+    signature.addInt(this._variantField_15 ?? 0);
+    signature.addInt(this._variantField_16 ?? 0);
+    signature.addInt(this._variantField_17 ?? 0);
+    signature.addInt(this._variantField_18 ?? 0);
+    signature.addInt(this._variantField_19 ?? 0);
+    signature.addString(this._variantField_20 ?? '');
+    signature.addDouble(this._variantField_21 ?? 0.0);
+    signature.addString(this._variantField_22 ?? '');
+    signature.addString(this._variantField_23 ?? '');
+    signature.addBool(this._variantField_24 != null);
+    this._variantField_24?.collectApiSignature(signature);
+    signature.addBool(this._variantField_25 != null);
+    this._variantField_25?.collectApiSignature(signature);
+    signature.addInt(
+        this._variantField_26 == null ? 0 : this._variantField_26.index);
+    signature.addBool(this._variantField_27 == true);
+    if (this._variantField_28 == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._variantField_28.length);
+      for (var x in this._variantField_28) {
+        signature.addInt(x);
+      }
+    }
+    signature.addInt(
+        this._variantField_29 == null ? 0 : this._variantField_29.index);
+    signature.addString(this._variantField_30 ?? '');
+    signature.addBool(this._variantField_31 == true);
+  }
+
+  fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_variantField_2;
+    fb.Offset offset_variantField_11;
+    fb.Offset offset_variantField_4;
+    fb.Offset offset_variantField_6;
+    fb.Offset offset_variantField_7;
+    fb.Offset offset_variantField_8;
+    fb.Offset offset_variantField_24;
+    fb.Offset offset_variantField_9;
+    fb.Offset offset_variantField_12;
+    fb.Offset offset_variantField_5;
+    fb.Offset offset_variantField_13;
+    fb.Offset offset_variantField_28;
+    fb.Offset offset_variantField_3;
+    fb.Offset offset_variantField_10;
+    fb.Offset offset_variantField_25;
+    fb.Offset offset_variantField_30;
+    fb.Offset offset_variantField_14;
+    fb.Offset offset_variantField_23;
+    fb.Offset offset_variantField_20;
+    fb.Offset offset_variantField_22;
+    if (!(_variantField_2 == null || _variantField_2.isEmpty)) {
+      offset_variantField_2 = fbBuilder
+          .writeList(_variantField_2.map((b) => b.finish(fbBuilder)).toList());
+    }
+    if (_variantField_11 != null) {
+      offset_variantField_11 = _variantField_11.finish(fbBuilder);
+    }
+    if (!(_variantField_4 == null || _variantField_4.isEmpty)) {
+      offset_variantField_4 = fbBuilder
+          .writeList(_variantField_4.map((b) => b.finish(fbBuilder)).toList());
+    }
+    if (_variantField_6 != null) {
+      offset_variantField_6 = _variantField_6.finish(fbBuilder);
+    }
+    if (_variantField_7 != null) {
+      offset_variantField_7 = _variantField_7.finish(fbBuilder);
+    }
+    if (_variantField_8 != null) {
+      offset_variantField_8 = _variantField_8.finish(fbBuilder);
+    }
+    if (_variantField_24 != null) {
+      offset_variantField_24 = _variantField_24.finish(fbBuilder);
+    }
+    if (_variantField_9 != null) {
+      offset_variantField_9 = _variantField_9.finish(fbBuilder);
+    }
+    if (_variantField_12 != null) {
+      offset_variantField_12 = _variantField_12.finish(fbBuilder);
+    }
+    if (!(_variantField_5 == null || _variantField_5.isEmpty)) {
+      offset_variantField_5 = fbBuilder
+          .writeList(_variantField_5.map((b) => b.finish(fbBuilder)).toList());
+    }
+    if (_variantField_13 != null) {
+      offset_variantField_13 = _variantField_13.finish(fbBuilder);
+    }
+    if (!(_variantField_28 == null || _variantField_28.isEmpty)) {
+      offset_variantField_28 = fbBuilder.writeListUint32(_variantField_28);
+    }
+    if (!(_variantField_3 == null || _variantField_3.isEmpty)) {
+      offset_variantField_3 = fbBuilder
+          .writeList(_variantField_3.map((b) => b.finish(fbBuilder)).toList());
+    }
+    if (_variantField_10 != null) {
+      offset_variantField_10 = _variantField_10.finish(fbBuilder);
+    }
+    if (_variantField_25 != null) {
+      offset_variantField_25 = _variantField_25.finish(fbBuilder);
+    }
+    if (_variantField_30 != null) {
+      offset_variantField_30 = fbBuilder.writeString(_variantField_30);
+    }
+    if (_variantField_14 != null) {
+      offset_variantField_14 = _variantField_14.finish(fbBuilder);
+    }
+    if (_variantField_23 != null) {
+      offset_variantField_23 = fbBuilder.writeString(_variantField_23);
+    }
+    if (_variantField_20 != null) {
+      offset_variantField_20 = fbBuilder.writeString(_variantField_20);
+    }
+    if (_variantField_22 != null) {
+      offset_variantField_22 = fbBuilder.writeString(_variantField_22);
+    }
+    fbBuilder.startTable();
+    if (offset_variantField_2 != null) {
+      fbBuilder.addOffset(2, offset_variantField_2);
+    }
+    if (offset_variantField_11 != null) {
+      fbBuilder.addOffset(11, offset_variantField_11);
+    }
+    if (offset_variantField_4 != null) {
+      fbBuilder.addOffset(4, offset_variantField_4);
+    }
+    if (offset_variantField_6 != null) {
+      fbBuilder.addOffset(6, offset_variantField_6);
+    }
+    if (_variantField_15 != null && _variantField_15 != 0) {
+      fbBuilder.addUint32(15, _variantField_15);
+    }
+    if (offset_variantField_7 != null) {
+      fbBuilder.addOffset(7, offset_variantField_7);
+    }
+    if (offset_variantField_8 != null) {
+      fbBuilder.addOffset(8, offset_variantField_8);
+    }
+    if (_variantField_16 != null && _variantField_16 != 0) {
+      fbBuilder.addUint32(16, _variantField_16);
+    }
+    if (_variantField_17 != null && _variantField_17 != 0) {
+      fbBuilder.addUint32(17, _variantField_17);
+    }
+    if (_variantField_18 != null && _variantField_18 != 0) {
+      fbBuilder.addUint32(18, _variantField_18);
+    }
+    if (_variantField_19 != null && _variantField_19 != 0) {
+      fbBuilder.addUint32(19, _variantField_19);
+    }
+    if (offset_variantField_24 != null) {
+      fbBuilder.addOffset(24, offset_variantField_24);
+    }
+    if (_variantField_27 == true) {
+      fbBuilder.addBool(27, true);
+    }
+    if (offset_variantField_9 != null) {
+      fbBuilder.addOffset(9, offset_variantField_9);
+    }
+    if (offset_variantField_12 != null) {
+      fbBuilder.addOffset(12, offset_variantField_12);
+    }
+    if (offset_variantField_5 != null) {
+      fbBuilder.addOffset(5, offset_variantField_5);
+    }
+    if (offset_variantField_13 != null) {
+      fbBuilder.addOffset(13, offset_variantField_13);
+    }
+    if (offset_variantField_28 != null) {
+      fbBuilder.addOffset(28, offset_variantField_28);
+    }
+    if (_variantField_29 != null &&
+        _variantField_29 != idl.LinkedNodeCommentType.block) {
+      fbBuilder.addUint8(29, _variantField_29.index);
+    }
+    if (offset_variantField_3 != null) {
+      fbBuilder.addOffset(3, offset_variantField_3);
+    }
+    if (offset_variantField_10 != null) {
+      fbBuilder.addOffset(10, offset_variantField_10);
+    }
+    if (_variantField_21 != null && _variantField_21 != 0.0) {
+      fbBuilder.addFloat64(21, _variantField_21);
+    }
+    if (offset_variantField_25 != null) {
+      fbBuilder.addOffset(25, offset_variantField_25);
+    }
+    if (_variantField_26 != null &&
+        _variantField_26 != idl.LinkedNodeFormalParameterKind.required) {
+      fbBuilder.addUint8(26, _variantField_26.index);
+    }
+    if (offset_variantField_30 != null) {
+      fbBuilder.addOffset(30, offset_variantField_30);
+    }
+    if (offset_variantField_14 != null) {
+      fbBuilder.addOffset(14, offset_variantField_14);
+    }
+    if (_isSynthetic == true) {
+      fbBuilder.addBool(1, true);
+    }
+    if (_kind != null && _kind != idl.LinkedNodeKind.adjacentStrings) {
+      fbBuilder.addUint8(0, _kind.index);
+    }
+    if (offset_variantField_23 != null) {
+      fbBuilder.addOffset(23, offset_variantField_23);
+    }
+    if (_variantField_31 == true) {
+      fbBuilder.addBool(31, true);
+    }
+    if (offset_variantField_20 != null) {
+      fbBuilder.addOffset(20, offset_variantField_20);
+    }
+    if (offset_variantField_22 != null) {
+      fbBuilder.addOffset(22, offset_variantField_22);
+    }
+    return fbBuilder.endTable();
+  }
+}
+
+class _LinkedNodeReader extends fb.TableReader<_LinkedNodeImpl> {
+  const _LinkedNodeReader();
+
+  @override
+  _LinkedNodeImpl createObject(fb.BufferContext bc, int offset) =>
+      new _LinkedNodeImpl(bc, offset);
+}
+
+class _LinkedNodeImpl extends Object
+    with _LinkedNodeMixin
+    implements idl.LinkedNode {
+  final fb.BufferContext _bc;
+  final int _bcOffset;
+
+  _LinkedNodeImpl(this._bc, this._bcOffset);
+
+  List<idl.LinkedNode> _variantField_2;
+  idl.LinkedNode _variantField_11;
+  List<idl.LinkedNode> _variantField_4;
+  idl.LinkedNode _variantField_6;
+  int _variantField_15;
+  idl.LinkedNode _variantField_7;
+  idl.LinkedNode _variantField_8;
+  int _variantField_16;
+  int _variantField_17;
+  int _variantField_18;
+  int _variantField_19;
+  idl.LinkedNodeType _variantField_24;
+  bool _variantField_27;
+  idl.LinkedNode _variantField_9;
+  idl.LinkedNode _variantField_12;
+  List<idl.LinkedNode> _variantField_5;
+  idl.LinkedNode _variantField_13;
+  List<int> _variantField_28;
+  idl.LinkedNodeCommentType _variantField_29;
+  List<idl.LinkedNode> _variantField_3;
+  idl.LinkedNode _variantField_10;
+  double _variantField_21;
+  idl.LinkedNodeType _variantField_25;
+  idl.LinkedNodeFormalParameterKind _variantField_26;
+  String _variantField_30;
+  idl.LinkedNode _variantField_14;
+  bool _isSynthetic;
+  idl.LinkedNodeKind _kind;
+  String _variantField_23;
+  bool _variantField_31;
+  String _variantField_20;
+  String _variantField_22;
+
+  @override
+  List<idl.LinkedNode> get adjacentStrings_strings {
+    assert(kind == idl.LinkedNodeKind.adjacentStrings);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get argumentList_arguments {
+    assert(kind == idl.LinkedNodeKind.argumentList);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get block_statements {
+    assert(kind == idl.LinkedNodeKind.block);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get cascadeExpression_sections {
+    assert(kind == idl.LinkedNodeKind.cascadeExpression);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get compilationUnit_declarations {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get constructorDeclaration_initializers {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get dottedName_components {
+    assert(kind == idl.LinkedNodeKind.dottedName);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get enumDeclaration_constants {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get formalParameterList_parameters {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get hideCombinator_hiddenNames {
+    assert(kind == idl.LinkedNodeKind.hideCombinator);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get implementsClause_interfaces {
+    assert(kind == idl.LinkedNodeKind.implementsClause);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get labeledStatement_labels {
+    assert(kind == idl.LinkedNodeKind.labeledStatement);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get libraryIdentifier_components {
+    assert(kind == idl.LinkedNodeKind.libraryIdentifier);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get listLiteral_elements {
+    assert(kind == idl.LinkedNodeKind.listLiteral);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get namespaceDirective_combinators {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get onClause_superclassConstraints {
+    assert(kind == idl.LinkedNodeKind.onClause);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get setOrMapLiteral_elements {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get showCombinator_shownNames {
+    assert(kind == idl.LinkedNodeKind.showCombinator);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get stringInterpolation_elements {
+    assert(kind == idl.LinkedNodeKind.stringInterpolation);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get switchStatement_members {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get tryStatement_catchClauses {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get typeArgumentList_arguments {
+    assert(kind == idl.LinkedNodeKind.typeArgumentList);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get typeParameterList_typeParameters {
+    assert(kind == idl.LinkedNodeKind.typeParameterList);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get variableDeclarationList_variables {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationList);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  List<idl.LinkedNode> get withClause_mixinTypes {
+    assert(kind == idl.LinkedNodeKind.withClause);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
+  idl.LinkedNode get annotatedNode_comment {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.constructorDeclaration ||
+        kind == idl.LinkedNodeKind.declaredIdentifier ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.enumConstantDeclaration ||
+        kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.fieldDeclaration ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.methodDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective ||
+        kind == idl.LinkedNodeKind.topLevelVariableDeclaration ||
+        kind == idl.LinkedNodeKind.typeParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration ||
+        kind == idl.LinkedNodeKind.variableDeclarationList);
+    _variantField_11 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 11, null);
+    return _variantField_11;
+  }
+
+  @override
+  List<idl.LinkedNode> get annotatedNode_metadata {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.constructorDeclaration ||
+        kind == idl.LinkedNodeKind.declaredIdentifier ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.enumConstantDeclaration ||
+        kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.fieldDeclaration ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.methodDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective ||
+        kind == idl.LinkedNodeKind.topLevelVariableDeclaration ||
+        kind == idl.LinkedNodeKind.typeParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration ||
+        kind == idl.LinkedNodeKind.variableDeclarationList);
+    _variantField_4 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 4, const <idl.LinkedNode>[]);
+    return _variantField_4;
+  }
+
+  @override
+  List<idl.LinkedNode> get normalFormalParameter_metadata {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    _variantField_4 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 4, const <idl.LinkedNode>[]);
+    return _variantField_4;
+  }
+
+  @override
+  List<idl.LinkedNode> get switchMember_statements {
+    assert(kind == idl.LinkedNodeKind.switchCase ||
+        kind == idl.LinkedNodeKind.switchDefault);
+    _variantField_4 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 4, const <idl.LinkedNode>[]);
+    return _variantField_4;
+  }
+
+  @override
+  idl.LinkedNode get annotation_arguments {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get asExpression_expression {
+    assert(kind == idl.LinkedNodeKind.asExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get assertInitializer_condition {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get assertStatement_condition {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get assignmentExpression_leftHandSide {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get awaitExpression_expression {
+    assert(kind == idl.LinkedNodeKind.awaitExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get binaryExpression_leftOperand {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get blockFunctionBody_block {
+    assert(kind == idl.LinkedNodeKind.blockFunctionBody);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get breakStatement_label {
+    assert(kind == idl.LinkedNodeKind.breakStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get cascadeExpression_target {
+    assert(kind == idl.LinkedNodeKind.cascadeExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get catchClause_body {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get classDeclaration_extendsClause {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get classTypeAlias_typeParameters {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get compilationUnit_scriptTag {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get conditionalExpression_condition {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get configuration_name {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get constructorDeclaration_body {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get constructorFieldInitializer_expression {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get constructorName_name {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get continueStatement_label {
+    assert(kind == idl.LinkedNodeKind.continueStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get declaredIdentifier_identifier {
+    assert(kind == idl.LinkedNodeKind.declaredIdentifier);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get defaultFormalParameter_defaultValue {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get doStatement_body {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get enumConstantDeclaration_name {
+    assert(kind == idl.LinkedNodeKind.enumConstantDeclaration);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get expressionFunctionBody_expression {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get expressionStatement_expression {
+    assert(kind == idl.LinkedNodeKind.expressionStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get extendsClause_superclass {
+    assert(kind == idl.LinkedNodeKind.extendsClause);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get fieldDeclaration_fields {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get fieldFormalParameter_type {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get forEachParts_iterable {
+    assert(kind == idl.LinkedNodeKind.forEachPartsWithDeclaration ||
+        kind == idl.LinkedNodeKind.forEachPartsWithIdentifier);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get forMixin_forLoopParts {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get forParts_condition {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
+        kind == idl.LinkedNodeKind.forPartsWithExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get functionDeclaration_functionExpression {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get functionDeclarationStatement_functionDeclaration {
+    assert(kind == idl.LinkedNodeKind.functionDeclarationStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get functionExpression_body {
+    assert(kind == idl.LinkedNodeKind.functionExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get functionExpressionInvocation_function {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get functionTypeAlias_formalParameters {
+    assert(kind == idl.LinkedNodeKind.functionTypeAlias);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get functionTypedFormalParameter_formalParameters {
+    assert(kind == idl.LinkedNodeKind.functionTypedFormalParameter);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get genericFunctionType_typeParameters {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get genericTypeAlias_typeParameters {
+    assert(kind == idl.LinkedNodeKind.genericTypeAlias);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get ifMixin_condition {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get importDirective_prefix {
+    assert(kind == idl.LinkedNodeKind.importDirective);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get indexExpression_index {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get instanceCreationExpression_arguments {
+    assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get interpolationExpression_expression {
+    assert(kind == idl.LinkedNodeKind.interpolationExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get isExpression_expression {
+    assert(kind == idl.LinkedNodeKind.isExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get label_label {
+    assert(kind == idl.LinkedNodeKind.label);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get labeledStatement_statement {
+    assert(kind == idl.LinkedNodeKind.labeledStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get libraryDirective_name {
+    assert(kind == idl.LinkedNodeKind.libraryDirective);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get mapLiteralEntry_key {
+    assert(kind == idl.LinkedNodeKind.mapLiteralEntry);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get methodDeclaration_body {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get methodInvocation_methodName {
+    assert(kind == idl.LinkedNodeKind.methodInvocation);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get mixinDeclaration_onClause {
+    assert(kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get namedExpression_expression {
+    assert(kind == idl.LinkedNodeKind.namedExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get parenthesizedExpression_expression {
+    assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get partOfDirective_libraryName {
+    assert(kind == idl.LinkedNodeKind.partOfDirective);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get postfixExpression_operand {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get prefixedIdentifier_identifier {
+    assert(kind == idl.LinkedNodeKind.prefixedIdentifier);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get prefixExpression_operand {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get propertyAccess_propertyName {
+    assert(kind == idl.LinkedNodeKind.propertyAccess);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get redirectingConstructorInvocation_arguments {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get returnStatement_expression {
+    assert(kind == idl.LinkedNodeKind.returnStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get simpleFormalParameter_type {
+    assert(kind == idl.LinkedNodeKind.simpleFormalParameter);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get spreadElement_expression {
+    assert(kind == idl.LinkedNodeKind.spreadElement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get superConstructorInvocation_arguments {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get switchCase_expression {
+    assert(kind == idl.LinkedNodeKind.switchCase);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get throwExpression_expression {
+    assert(kind == idl.LinkedNodeKind.throwExpression);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get topLevelVariableDeclaration_variableList {
+    assert(kind == idl.LinkedNodeKind.topLevelVariableDeclaration);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get tryStatement_body {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get typeName_name {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get typeParameter_bound {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get variableDeclaration_initializer {
+    assert(kind == idl.LinkedNodeKind.variableDeclaration);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get variableDeclarationList_type {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationList);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get variableDeclarationStatement_variables {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get whileStatement_body {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get yieldStatement_expression {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  int get annotation_atSign {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get argumentList_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.argumentList);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get asExpression_asOperator {
+    assert(kind == idl.LinkedNodeKind.asExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get assertInitializer_assertKeyword {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get assertStatement_assertKeyword {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get assignmentExpression_element {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get awaitExpression_awaitKeyword {
+    assert(kind == idl.LinkedNodeKind.awaitExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get binaryExpression_element {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get block_leftBracket {
+    assert(kind == idl.LinkedNodeKind.block);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get blockFunctionBody_keyword {
+    assert(kind == idl.LinkedNodeKind.blockFunctionBody);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get booleanLiteral_literal {
+    assert(kind == idl.LinkedNodeKind.booleanLiteral);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get breakStatement_breakKeyword {
+    assert(kind == idl.LinkedNodeKind.breakStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get catchClause_catchKeyword {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get classDeclaration_abstractKeyword {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get classTypeAlias_abstractKeyword {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get compilationUnit_beginToken {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get conditionalExpression_colon {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get configuration_ifKeyword {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get constructorDeclaration_constKeyword {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get constructorFieldInitializer_equals {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get constructorName_element {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get continueStatement_continueKeyword {
+    assert(kind == idl.LinkedNodeKind.continueStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get declaredIdentifier_keyword {
+    assert(kind == idl.LinkedNodeKind.declaredIdentifier);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get defaultFormalParameter_separator {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get doStatement_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get doubleLiteral_literal {
+    assert(kind == idl.LinkedNodeKind.doubleLiteral);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get emptyFunctionBody_semicolon {
+    assert(kind == idl.LinkedNodeKind.emptyFunctionBody);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get emptyStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.emptyStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get enumDeclaration_enumKeyword {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get expressionFunctionBody_arrow {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get expressionStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.expressionStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get extendsClause_extendsKeyword {
+    assert(kind == idl.LinkedNodeKind.extendsClause);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get fieldDeclaration_covariantKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get fieldFormalParameter_keyword {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get forEachParts_inKeyword {
+    assert(kind == idl.LinkedNodeKind.forEachPartsWithDeclaration ||
+        kind == idl.LinkedNodeKind.forEachPartsWithIdentifier);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get formalParameterList_leftDelimiter {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get forMixin_awaitKeyword {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get forParts_leftSeparator {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
+        kind == idl.LinkedNodeKind.forPartsWithExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get functionDeclaration_externalKeyword {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get genericFunctionType_functionKeyword {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get ifMixin_elseKeyword {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get implementsClause_implementsKeyword {
+    assert(kind == idl.LinkedNodeKind.implementsClause);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get importDirective_asKeyword {
+    assert(kind == idl.LinkedNodeKind.importDirective);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get indexExpression_element {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get instanceCreationExpression_keyword {
+    assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get integerLiteral_literal {
+    assert(kind == idl.LinkedNodeKind.integerLiteral);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get interpolationExpression_leftBracket {
+    assert(kind == idl.LinkedNodeKind.interpolationExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get interpolationString_token {
+    assert(kind == idl.LinkedNodeKind.interpolationString);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get isExpression_isOperator {
+    assert(kind == idl.LinkedNodeKind.isExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get label_colon {
+    assert(kind == idl.LinkedNodeKind.label);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get listLiteral_leftBracket {
+    assert(kind == idl.LinkedNodeKind.listLiteral);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get mapLiteralEntry_separator {
+    assert(kind == idl.LinkedNodeKind.mapLiteralEntry);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get methodDeclaration_externalKeyword {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get methodInvocation_operator {
+    assert(kind == idl.LinkedNodeKind.methodInvocation);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get mixinDeclaration_mixinKeyword {
+    assert(kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get nullLiteral_literal {
+    assert(kind == idl.LinkedNodeKind.nullLiteral);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get onClause_onKeyword {
+    assert(kind == idl.LinkedNodeKind.onClause);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get parenthesizedExpression_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get partOfDirective_semicolon {
+    assert(kind == idl.LinkedNodeKind.partOfDirective);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get postfixExpression_element {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get prefixedIdentifier_period {
+    assert(kind == idl.LinkedNodeKind.prefixedIdentifier);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get prefixExpression_element {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get propertyAccess_operator {
+    assert(kind == idl.LinkedNodeKind.propertyAccess);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get redirectingConstructorInvocation_element {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get rethrowExpression_rethrowKeyword {
+    assert(kind == idl.LinkedNodeKind.rethrowExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get returnStatement_returnKeyword {
+    assert(kind == idl.LinkedNodeKind.returnStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get scriptTag_scriptTag {
+    assert(kind == idl.LinkedNodeKind.scriptTag);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get setOrMapLiteral_leftBracket {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get simpleFormalParameter_keyword {
+    assert(kind == idl.LinkedNodeKind.simpleFormalParameter);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get simpleIdentifier_element {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get simpleStringLiteral_token {
+    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get spreadElement_spreadOperator {
+    assert(kind == idl.LinkedNodeKind.spreadElement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get superConstructorInvocation_element {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get superExpression_superKeyword {
+    assert(kind == idl.LinkedNodeKind.superExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get switchMember_keyword {
+    assert(kind == idl.LinkedNodeKind.switchCase ||
+        kind == idl.LinkedNodeKind.switchDefault);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get switchStatement_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get symbolLiteral_poundSign {
+    assert(kind == idl.LinkedNodeKind.symbolLiteral);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get thisExpression_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.thisExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get throwExpression_throwKeyword {
+    assert(kind == idl.LinkedNodeKind.throwExpression);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get topLevelVariableDeclaration_semicolon {
+    assert(kind == idl.LinkedNodeKind.topLevelVariableDeclaration);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get tryStatement_finallyKeyword {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get typeArgumentList_leftBracket {
+    assert(kind == idl.LinkedNodeKind.typeArgumentList);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get typeName_question {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get typeParameter_extendsKeyword {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get typeParameterList_leftBracket {
+    assert(kind == idl.LinkedNodeKind.typeParameterList);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get variableDeclaration_equals {
+    assert(kind == idl.LinkedNodeKind.variableDeclaration);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get variableDeclarationList_keyword {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationList);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get variableDeclarationStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get whileStatement_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get withClause_withKeyword {
+    assert(kind == idl.LinkedNodeKind.withClause);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get yieldStatement_yieldKeyword {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  idl.LinkedNode get annotation_constructorName {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get asExpression_type {
+    assert(kind == idl.LinkedNodeKind.asExpression);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get assertInitializer_message {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get assertStatement_message {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get assignmentExpression_rightHandSide {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get binaryExpression_rightOperand {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get catchClause_exceptionParameter {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get classDeclaration_withClause {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get classTypeAlias_superclass {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get conditionalExpression_elseExpression {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get configuration_value {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get constructorDeclaration_name {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get constructorFieldInitializer_fieldName {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get constructorName_type {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get declaredIdentifier_type {
+    assert(kind == idl.LinkedNodeKind.declaredIdentifier);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get defaultFormalParameter_parameter {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get doStatement_condition {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get fieldFormalParameter_typeParameters {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get forEachPartsWithDeclaration_loopVariable {
+    assert(kind == idl.LinkedNodeKind.forEachPartsWithDeclaration);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get forEachPartsWithIdentifier_identifier {
+    assert(kind == idl.LinkedNodeKind.forEachPartsWithIdentifier);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get forElement_body {
+    assert(kind == idl.LinkedNodeKind.forElement);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get forPartsWithDeclarations_variables {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get forPartsWithExpression_initialization {
+    assert(kind == idl.LinkedNodeKind.forPartsWithExpression);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get forStatement_body {
+    assert(kind == idl.LinkedNodeKind.forStatement);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get functionDeclaration_returnType {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get functionExpression_formalParameters {
+    assert(kind == idl.LinkedNodeKind.functionExpression);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get functionTypeAlias_returnType {
+    assert(kind == idl.LinkedNodeKind.functionTypeAlias);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get functionTypedFormalParameter_returnType {
+    assert(kind == idl.LinkedNodeKind.functionTypedFormalParameter);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get genericFunctionType_returnType {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get genericTypeAlias_functionType {
+    assert(kind == idl.LinkedNodeKind.genericTypeAlias);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get ifStatement_elseStatement {
+    assert(kind == idl.LinkedNodeKind.ifStatement);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get indexExpression_target {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get instanceCreationExpression_constructorName {
+    assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get isExpression_type {
+    assert(kind == idl.LinkedNodeKind.isExpression);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get mapLiteralEntry_value {
+    assert(kind == idl.LinkedNodeKind.mapLiteralEntry);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get methodDeclaration_formalParameters {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get methodInvocation_target {
+    assert(kind == idl.LinkedNodeKind.methodInvocation);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get namedExpression_name {
+    assert(kind == idl.LinkedNodeKind.namedExpression);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get partOfDirective_uri {
+    assert(kind == idl.LinkedNodeKind.partOfDirective);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get prefixedIdentifier_prefix {
+    assert(kind == idl.LinkedNodeKind.prefixedIdentifier);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get propertyAccess_target {
+    assert(kind == idl.LinkedNodeKind.propertyAccess);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get redirectingConstructorInvocation_constructorName {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get superConstructorInvocation_constructorName {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get switchStatement_expression {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get tryStatement_finallyBlock {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get typeName_typeArguments {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get typeParameter_name {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get variableDeclaration_name {
+    assert(kind == idl.LinkedNodeKind.variableDeclaration);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get whileStatement_condition {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
+  idl.LinkedNode get annotation_name {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get catchClause_exceptionType {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get classTypeAlias_withClause {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get conditionalExpression_thenExpression {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get configuration_uri {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get constructorDeclaration_parameters {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get fieldFormalParameter_formalParameters {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get functionExpression_typeParameters {
+    assert(kind == idl.LinkedNodeKind.functionExpression);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get functionTypeAlias_typeParameters {
+    assert(kind == idl.LinkedNodeKind.functionTypeAlias);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get functionTypedFormalParameter_typeParameters {
+    assert(kind == idl.LinkedNodeKind.functionTypedFormalParameter);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get genericFunctionType_formalParameters {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get ifElement_thenElement {
+    assert(kind == idl.LinkedNodeKind.ifElement);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get ifStatement_thenStatement {
+    assert(kind == idl.LinkedNodeKind.ifStatement);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get instanceCreationExpression_typeArguments {
+    assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  idl.LinkedNode get methodDeclaration_returnType {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
+  int get annotation_period {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get argumentList_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.argumentList);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get assertInitializer_comma {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get assertStatement_comma {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get assignmentExpression_operator {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get binaryExpression_operator {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get block_rightBracket {
+    assert(kind == idl.LinkedNodeKind.block);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get blockFunctionBody_star {
+    assert(kind == idl.LinkedNodeKind.blockFunctionBody);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get breakStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.breakStatement);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get catchClause_comma {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get classDeclaration_classKeyword {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get classTypeAlias_equals {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get compilationUnit_endToken {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get conditionalExpression_question {
+    assert(kind == idl.LinkedNodeKind.conditionalExpression);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get configuration_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get constructorDeclaration_externalKeyword {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get constructorFieldInitializer_period {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get constructorName_period {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get continueStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.continueStatement);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get doStatement_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get enumDeclaration_leftBracket {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get expressionFunctionBody_keyword {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get fieldDeclaration_semicolon {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get fieldFormalParameter_period {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get formalParameterList_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get forMixin_forKeyword {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get forParts_rightSeparator {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
+        kind == idl.LinkedNodeKind.forPartsWithExpression);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get functionDeclaration_propertyKeyword {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get genericFunctionType_question {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get genericTypeAlias_equals {
+    assert(kind == idl.LinkedNodeKind.genericTypeAlias);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get ifMixin_ifKeyword {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get importDirective_deferredKeyword {
+    assert(kind == idl.LinkedNodeKind.importDirective);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get indexExpression_leftBracket {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get integerLiteral_value {
+    assert(kind == idl.LinkedNodeKind.integerLiteral);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get interpolationExpression_rightBracket {
+    assert(kind == idl.LinkedNodeKind.interpolationExpression);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get isExpression_notOperator {
+    assert(kind == idl.LinkedNodeKind.isExpression);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get listLiteral_rightBracket {
+    assert(kind == idl.LinkedNodeKind.listLiteral);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get methodDeclaration_modifierKeyword {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get parenthesizedExpression_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get partOfDirective_ofKeyword {
+    assert(kind == idl.LinkedNodeKind.partOfDirective);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get postfixExpression_operator {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get prefixExpression_operator {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get redirectingConstructorInvocation_period {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get returnStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.returnStatement);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get setOrMapLiteral_rightBracket {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get simpleIdentifier_token {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get superConstructorInvocation_period {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get switchMember_colon {
+    assert(kind == idl.LinkedNodeKind.switchCase ||
+        kind == idl.LinkedNodeKind.switchDefault);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get switchStatement_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get tryStatement_tryKeyword {
+    assert(kind == idl.LinkedNodeKind.tryStatement);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get typeArgumentList_rightBracket {
+    assert(kind == idl.LinkedNodeKind.typeArgumentList);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get typeParameterList_rightBracket {
+    assert(kind == idl.LinkedNodeKind.typeParameterList);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get whileStatement_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get yieldStatement_star {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
+  int get assertInitializer_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get assertStatement_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get catchClause_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get configuration_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get constructorDeclaration_factoryKeyword {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get constructorFieldInitializer_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get directive_keyword {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get doStatement_doKeyword {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get enumDeclaration_rightBracket {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get expressionFunctionBody_semicolon {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get fieldDeclaration_staticKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get fieldFormalParameter_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get formalParameterList_rightDelimiter {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get forMixin_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get ifMixin_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get indexExpression_rightBracket {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get methodDeclaration_operatorKeyword {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get redirectingConstructorInvocation_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get superConstructorInvocation_superKeyword {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get switchStatement_switchKeyword {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get whileStatement_whileKeyword {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get yieldStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get assertInitializer_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
+  int get assertStatement_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
+  int get catchClause_onKeyword {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
+  int get classOrMixinDeclaration_rightBracket {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
+  int get configuration_equalToken {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
+  int get constructorDeclaration_period {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
+  int get doStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
+  int get formalParameterList_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
+  int get ifMixin_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
+  int get methodDeclaration_propertyKeyword {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
+  int get namespaceDirective_semicolon {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
+  int get switchStatement_leftBracket {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
+  int get typeAlias_typedefKeyword {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
+  int get assertStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    _variantField_19 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _variantField_19;
+  }
+
+  @override
+  int get catchClause_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_19 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _variantField_19;
+  }
+
+  @override
+  int get classOrMixinDeclaration_leftBracket {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_19 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _variantField_19;
+  }
+
+  @override
+  int get combinator_keyword {
+    assert(kind == idl.LinkedNodeKind.hideCombinator ||
+        kind == idl.LinkedNodeKind.showCombinator);
+    _variantField_19 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _variantField_19;
+  }
+
+  @override
+  int get constructorDeclaration_separator {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_19 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _variantField_19;
+  }
+
+  @override
+  int get doStatement_whileKeyword {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    _variantField_19 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _variantField_19;
+  }
+
+  @override
+  int get forMixin_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    _variantField_19 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _variantField_19;
+  }
+
+  @override
+  int get normalFormalParameter_covariantKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    _variantField_19 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _variantField_19;
+  }
+
+  @override
+  int get switchStatement_rightBracket {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    _variantField_19 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _variantField_19;
+  }
+
+  @override
+  int get typeAlias_semicolon {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias);
+    _variantField_19 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _variantField_19;
+  }
+
+  @override
+  int get typedLiteral_constKeyword {
+    assert(kind == idl.LinkedNodeKind.listLiteral ||
+        kind == idl.LinkedNodeKind.setOrMapLiteral);
+    _variantField_19 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _variantField_19;
+  }
+
+  @override
+  int get uriBasedDirective_uriElement {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    _variantField_19 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+    return _variantField_19;
+  }
+
+  @override
+  idl.LinkedNodeType get binaryExpression_invokeType {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_24 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
+    return _variantField_24;
+  }
+
+  @override
+  idl.LinkedNodeType get invocationExpression_invokeType {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.methodInvocation);
+    _variantField_24 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
+    return _variantField_24;
+  }
+
+  @override
+  idl.LinkedNodeType get typeName_type {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    _variantField_24 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
+    return _variantField_24;
+  }
+
+  @override
+  bool get booleanLiteral_value {
+    assert(kind == idl.LinkedNodeKind.booleanLiteral);
+    _variantField_27 ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 27, false);
+    return _variantField_27;
+  }
+
+  @override
+  bool get defaultFormalParameter_isNamed {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    _variantField_27 ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 27, false);
+    return _variantField_27;
+  }
+
+  @override
+  bool get setOrMapLiteral_isMap {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    _variantField_27 ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 27, false);
+    return _variantField_27;
+  }
+
+  @override
+  idl.LinkedNode get catchClause_stackTraceParameter {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_9 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 9, null);
+    return _variantField_9;
+  }
+
+  @override
+  idl.LinkedNode get classTypeAlias_implementsClause {
+    assert(kind == idl.LinkedNodeKind.classTypeAlias);
+    _variantField_9 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 9, null);
+    return _variantField_9;
+  }
+
+  @override
+  idl.LinkedNode get constructorDeclaration_redirectedConstructor {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_9 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 9, null);
+    return _variantField_9;
+  }
+
+  @override
+  idl.LinkedNode get ifElement_elseElement {
+    assert(kind == idl.LinkedNodeKind.ifElement);
+    _variantField_9 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 9, null);
+    return _variantField_9;
+  }
+
+  @override
+  idl.LinkedNode get methodDeclaration_typeParameters {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_9 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 9, null);
+    return _variantField_9;
+  }
+
+  @override
+  idl.LinkedNode get classOrMixinDeclaration_implementsClause {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_12 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 12, null);
+    return _variantField_12;
+  }
+
+  @override
+  idl.LinkedNode get invocationExpression_typeArguments {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.methodInvocation);
+    _variantField_12 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 12, null);
+    return _variantField_12;
+  }
+
+  @override
+  idl.LinkedNode get normalFormalParameter_identifier {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    _variantField_12 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 12, null);
+    return _variantField_12;
+  }
+
+  @override
+  List<idl.LinkedNode> get classOrMixinDeclaration_members {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_5 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 5, const <idl.LinkedNode>[]);
+    return _variantField_5;
+  }
+
+  @override
+  List<idl.LinkedNode> get forParts_updaters {
+    assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
+        kind == idl.LinkedNodeKind.forPartsWithExpression);
+    _variantField_5 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 5, const <idl.LinkedNode>[]);
+    return _variantField_5;
+  }
+
+  @override
+  idl.LinkedNode get classOrMixinDeclaration_typeParameters {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_13 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 13, null);
+    return _variantField_13;
+  }
+
+  @override
+  List<int> get comment_tokens {
+    assert(kind == idl.LinkedNodeKind.comment);
+    _variantField_28 ??= const fb.Uint32ListReader()
+        .vTableGet(_bc, _bcOffset, 28, const <int>[]);
+    return _variantField_28;
+  }
+
+  @override
+  List<int> get symbolLiteral_components {
+    assert(kind == idl.LinkedNodeKind.symbolLiteral);
+    _variantField_28 ??= const fb.Uint32ListReader()
+        .vTableGet(_bc, _bcOffset, 28, const <int>[]);
+    return _variantField_28;
+  }
+
+  @override
+  idl.LinkedNodeCommentType get comment_type {
+    assert(kind == idl.LinkedNodeKind.comment);
+    _variantField_29 ??= const _LinkedNodeCommentTypeReader()
+        .vTableGet(_bc, _bcOffset, 29, idl.LinkedNodeCommentType.block);
+    return _variantField_29;
+  }
+
+  @override
+  List<idl.LinkedNode> get compilationUnit_directives {
+    assert(kind == idl.LinkedNodeKind.compilationUnit);
+    _variantField_3 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 3, const <idl.LinkedNode>[]);
+    return _variantField_3;
+  }
+
+  @override
+  List<idl.LinkedNode> get namespaceDirective_configurations {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective);
+    _variantField_3 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 3, const <idl.LinkedNode>[]);
+    return _variantField_3;
+  }
+
+  @override
+  List<idl.LinkedNode> get switchMember_labels {
+    assert(kind == idl.LinkedNodeKind.switchCase ||
+        kind == idl.LinkedNodeKind.switchDefault);
+    _variantField_3 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 3, const <idl.LinkedNode>[]);
+    return _variantField_3;
+  }
+
+  @override
+  idl.LinkedNode get constructorDeclaration_returnType {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_10 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 10, null);
+    return _variantField_10;
+  }
+
+  @override
+  idl.LinkedNode get methodDeclaration_name {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_10 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 10, null);
+    return _variantField_10;
+  }
+
+  @override
+  double get doubleLiteral_value {
+    assert(kind == idl.LinkedNodeKind.doubleLiteral);
+    _variantField_21 ??=
+        const fb.Float64Reader().vTableGet(_bc, _bcOffset, 21, 0.0);
+    return _variantField_21;
+  }
+
+  @override
+  idl.LinkedNodeType get expression_type {
+    assert(kind == idl.LinkedNodeKind.adjacentStrings ||
+        kind == idl.LinkedNodeKind.assignmentExpression ||
+        kind == idl.LinkedNodeKind.asExpression ||
+        kind == idl.LinkedNodeKind.awaitExpression ||
+        kind == idl.LinkedNodeKind.binaryExpression ||
+        kind == idl.LinkedNodeKind.booleanLiteral ||
+        kind == idl.LinkedNodeKind.cascadeExpression ||
+        kind == idl.LinkedNodeKind.conditionalExpression ||
+        kind == idl.LinkedNodeKind.doubleLiteral ||
+        kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.indexExpression ||
+        kind == idl.LinkedNodeKind.instanceCreationExpression ||
+        kind == idl.LinkedNodeKind.integerLiteral ||
+        kind == idl.LinkedNodeKind.isExpression ||
+        kind == idl.LinkedNodeKind.listLiteral ||
+        kind == idl.LinkedNodeKind.methodInvocation ||
+        kind == idl.LinkedNodeKind.namedExpression ||
+        kind == idl.LinkedNodeKind.nullLiteral ||
+        kind == idl.LinkedNodeKind.parenthesizedExpression ||
+        kind == idl.LinkedNodeKind.prefixExpression ||
+        kind == idl.LinkedNodeKind.prefixedIdentifier ||
+        kind == idl.LinkedNodeKind.propertyAccess ||
+        kind == idl.LinkedNodeKind.postfixExpression ||
+        kind == idl.LinkedNodeKind.rethrowExpression ||
+        kind == idl.LinkedNodeKind.setOrMapLiteral ||
+        kind == idl.LinkedNodeKind.simpleIdentifier ||
+        kind == idl.LinkedNodeKind.simpleStringLiteral ||
+        kind == idl.LinkedNodeKind.stringInterpolation ||
+        kind == idl.LinkedNodeKind.superExpression ||
+        kind == idl.LinkedNodeKind.symbolLiteral ||
+        kind == idl.LinkedNodeKind.thisExpression ||
+        kind == idl.LinkedNodeKind.throwExpression);
+    _variantField_25 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 25, null);
+    return _variantField_25;
+  }
+
+  @override
+  idl.LinkedNodeFormalParameterKind get formalParameter_kind {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    _variantField_26 ??= const _LinkedNodeFormalParameterKindReader().vTableGet(
+        _bc, _bcOffset, 26, idl.LinkedNodeFormalParameterKind.required);
+    return _variantField_26;
+  }
+
+  @override
+  String get interpolationString_value {
+    assert(kind == idl.LinkedNodeKind.interpolationString);
+    _variantField_30 ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 30, '');
+    return _variantField_30;
+  }
+
+  @override
+  idl.LinkedNode get invocationExpression_arguments {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.methodInvocation);
+    _variantField_14 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 14, null);
+    return _variantField_14;
+  }
+
+  @override
+  idl.LinkedNode get namedCompilationUnitMember_name {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_14 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 14, null);
+    return _variantField_14;
+  }
+
+  @override
+  idl.LinkedNode get normalFormalParameter_comment {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
+    _variantField_14 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 14, null);
+    return _variantField_14;
+  }
+
+  @override
+  idl.LinkedNode get typedLiteral_typeArguments {
+    assert(kind == idl.LinkedNodeKind.listLiteral ||
+        kind == idl.LinkedNodeKind.setOrMapLiteral);
+    _variantField_14 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 14, null);
+    return _variantField_14;
+  }
+
+  @override
+  idl.LinkedNode get uriBasedDirective_uri {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    _variantField_14 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 14, null);
+    return _variantField_14;
+  }
+
+  @override
+  bool get isSynthetic {
+    _isSynthetic ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 1, false);
+    return _isSynthetic;
+  }
+
+  @override
+  idl.LinkedNodeKind get kind {
+    _kind ??= const _LinkedNodeKindReader()
+        .vTableGet(_bc, _bcOffset, 0, idl.LinkedNodeKind.adjacentStrings);
+    return _kind;
+  }
+
+  @override
+  String get namespaceDirective_selectedUriContent {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective);
+    _variantField_23 ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 23, '');
+    return _variantField_23;
+  }
+
+  @override
+  bool get setOrMapLiteral_isSet {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    _variantField_31 ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 31, false);
+    return _variantField_31;
+  }
+
+  @override
+  String get simpleStringLiteral_value {
+    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
+    _variantField_20 ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 20, '');
+    return _variantField_20;
+  }
+
+  @override
+  String get uriBasedDirective_uriContent {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.partDirective);
+    _variantField_22 ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 22, '');
+    return _variantField_22;
+  }
+}
+
+abstract class _LinkedNodeMixin implements idl.LinkedNode {
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> _result = <String, Object>{};
+    if (isSynthetic != false) _result["isSynthetic"] = isSynthetic;
+    if (kind != idl.LinkedNodeKind.adjacentStrings)
+      _result["kind"] = kind.toString().split('.')[1];
+    if (kind == idl.LinkedNodeKind.adjacentStrings) {
+      if (adjacentStrings_strings.isNotEmpty)
+        _result["adjacentStrings_strings"] =
+            adjacentStrings_strings.map((_value) => _value.toJson()).toList();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.argumentList) {
+      if (argumentList_arguments.isNotEmpty)
+        _result["argumentList_arguments"] =
+            argumentList_arguments.map((_value) => _value.toJson()).toList();
+      if (argumentList_leftParenthesis != 0)
+        _result["argumentList_leftParenthesis"] = argumentList_leftParenthesis;
+      if (argumentList_rightParenthesis != 0)
+        _result["argumentList_rightParenthesis"] =
+            argumentList_rightParenthesis;
+    }
+    if (kind == idl.LinkedNodeKind.block) {
+      if (block_statements.isNotEmpty)
+        _result["block_statements"] =
+            block_statements.map((_value) => _value.toJson()).toList();
+      if (block_leftBracket != 0)
+        _result["block_leftBracket"] = block_leftBracket;
+      if (block_rightBracket != 0)
+        _result["block_rightBracket"] = block_rightBracket;
+    }
+    if (kind == idl.LinkedNodeKind.cascadeExpression) {
+      if (cascadeExpression_sections.isNotEmpty)
+        _result["cascadeExpression_sections"] = cascadeExpression_sections
+            .map((_value) => _value.toJson())
+            .toList();
+      if (cascadeExpression_target != null)
+        _result["cascadeExpression_target"] = cascadeExpression_target.toJson();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.compilationUnit) {
+      if (compilationUnit_declarations.isNotEmpty)
+        _result["compilationUnit_declarations"] = compilationUnit_declarations
+            .map((_value) => _value.toJson())
+            .toList();
+      if (compilationUnit_scriptTag != null)
+        _result["compilationUnit_scriptTag"] =
+            compilationUnit_scriptTag.toJson();
+      if (compilationUnit_beginToken != 0)
+        _result["compilationUnit_beginToken"] = compilationUnit_beginToken;
+      if (compilationUnit_endToken != 0)
+        _result["compilationUnit_endToken"] = compilationUnit_endToken;
+      if (compilationUnit_directives.isNotEmpty)
+        _result["compilationUnit_directives"] = compilationUnit_directives
+            .map((_value) => _value.toJson())
+            .toList();
+    }
+    if (kind == idl.LinkedNodeKind.constructorDeclaration) {
+      if (constructorDeclaration_initializers.isNotEmpty)
+        _result["constructorDeclaration_initializers"] =
+            constructorDeclaration_initializers
+                .map((_value) => _value.toJson())
+                .toList();
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (constructorDeclaration_body != null)
+        _result["constructorDeclaration_body"] =
+            constructorDeclaration_body.toJson();
+      if (constructorDeclaration_constKeyword != 0)
+        _result["constructorDeclaration_constKeyword"] =
+            constructorDeclaration_constKeyword;
+      if (constructorDeclaration_name != null)
+        _result["constructorDeclaration_name"] =
+            constructorDeclaration_name.toJson();
+      if (constructorDeclaration_parameters != null)
+        _result["constructorDeclaration_parameters"] =
+            constructorDeclaration_parameters.toJson();
+      if (constructorDeclaration_externalKeyword != 0)
+        _result["constructorDeclaration_externalKeyword"] =
+            constructorDeclaration_externalKeyword;
+      if (constructorDeclaration_factoryKeyword != 0)
+        _result["constructorDeclaration_factoryKeyword"] =
+            constructorDeclaration_factoryKeyword;
+      if (constructorDeclaration_period != 0)
+        _result["constructorDeclaration_period"] =
+            constructorDeclaration_period;
+      if (constructorDeclaration_separator != 0)
+        _result["constructorDeclaration_separator"] =
+            constructorDeclaration_separator;
+      if (constructorDeclaration_redirectedConstructor != null)
+        _result["constructorDeclaration_redirectedConstructor"] =
+            constructorDeclaration_redirectedConstructor.toJson();
+      if (constructorDeclaration_returnType != null)
+        _result["constructorDeclaration_returnType"] =
+            constructorDeclaration_returnType.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.dottedName) {
+      if (dottedName_components.isNotEmpty)
+        _result["dottedName_components"] =
+            dottedName_components.map((_value) => _value.toJson()).toList();
+    }
+    if (kind == idl.LinkedNodeKind.enumDeclaration) {
+      if (enumDeclaration_constants.isNotEmpty)
+        _result["enumDeclaration_constants"] =
+            enumDeclaration_constants.map((_value) => _value.toJson()).toList();
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (enumDeclaration_enumKeyword != 0)
+        _result["enumDeclaration_enumKeyword"] = enumDeclaration_enumKeyword;
+      if (enumDeclaration_leftBracket != 0)
+        _result["enumDeclaration_leftBracket"] = enumDeclaration_leftBracket;
+      if (enumDeclaration_rightBracket != 0)
+        _result["enumDeclaration_rightBracket"] = enumDeclaration_rightBracket;
+      if (namedCompilationUnitMember_name != null)
+        _result["namedCompilationUnitMember_name"] =
+            namedCompilationUnitMember_name.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.formalParameterList) {
+      if (formalParameterList_parameters.isNotEmpty)
+        _result["formalParameterList_parameters"] =
+            formalParameterList_parameters
+                .map((_value) => _value.toJson())
+                .toList();
+      if (formalParameterList_leftDelimiter != 0)
+        _result["formalParameterList_leftDelimiter"] =
+            formalParameterList_leftDelimiter;
+      if (formalParameterList_leftParenthesis != 0)
+        _result["formalParameterList_leftParenthesis"] =
+            formalParameterList_leftParenthesis;
+      if (formalParameterList_rightDelimiter != 0)
+        _result["formalParameterList_rightDelimiter"] =
+            formalParameterList_rightDelimiter;
+      if (formalParameterList_rightParenthesis != 0)
+        _result["formalParameterList_rightParenthesis"] =
+            formalParameterList_rightParenthesis;
+    }
+    if (kind == idl.LinkedNodeKind.hideCombinator) {
+      if (hideCombinator_hiddenNames.isNotEmpty)
+        _result["hideCombinator_hiddenNames"] = hideCombinator_hiddenNames
+            .map((_value) => _value.toJson())
+            .toList();
+      if (combinator_keyword != 0)
+        _result["combinator_keyword"] = combinator_keyword;
+    }
+    if (kind == idl.LinkedNodeKind.implementsClause) {
+      if (implementsClause_interfaces.isNotEmpty)
+        _result["implementsClause_interfaces"] = implementsClause_interfaces
+            .map((_value) => _value.toJson())
+            .toList();
+      if (implementsClause_implementsKeyword != 0)
+        _result["implementsClause_implementsKeyword"] =
+            implementsClause_implementsKeyword;
+    }
+    if (kind == idl.LinkedNodeKind.labeledStatement) {
+      if (labeledStatement_labels.isNotEmpty)
+        _result["labeledStatement_labels"] =
+            labeledStatement_labels.map((_value) => _value.toJson()).toList();
+      if (labeledStatement_statement != null)
+        _result["labeledStatement_statement"] =
+            labeledStatement_statement.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.libraryIdentifier) {
+      if (libraryIdentifier_components.isNotEmpty)
+        _result["libraryIdentifier_components"] = libraryIdentifier_components
+            .map((_value) => _value.toJson())
+            .toList();
+    }
+    if (kind == idl.LinkedNodeKind.listLiteral) {
+      if (listLiteral_elements.isNotEmpty)
+        _result["listLiteral_elements"] =
+            listLiteral_elements.map((_value) => _value.toJson()).toList();
+      if (listLiteral_leftBracket != 0)
+        _result["listLiteral_leftBracket"] = listLiteral_leftBracket;
+      if (listLiteral_rightBracket != 0)
+        _result["listLiteral_rightBracket"] = listLiteral_rightBracket;
+      if (typedLiteral_constKeyword != 0)
+        _result["typedLiteral_constKeyword"] = typedLiteral_constKeyword;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+      if (typedLiteral_typeArguments != null)
+        _result["typedLiteral_typeArguments"] =
+            typedLiteral_typeArguments.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.exportDirective) {
+      if (namespaceDirective_combinators.isNotEmpty)
+        _result["namespaceDirective_combinators"] =
+            namespaceDirective_combinators
+                .map((_value) => _value.toJson())
+                .toList();
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (directive_keyword != 0)
+        _result["directive_keyword"] = directive_keyword;
+      if (namespaceDirective_semicolon != 0)
+        _result["namespaceDirective_semicolon"] = namespaceDirective_semicolon;
+      if (uriBasedDirective_uriElement != 0)
+        _result["uriBasedDirective_uriElement"] = uriBasedDirective_uriElement;
+      if (namespaceDirective_configurations.isNotEmpty)
+        _result["namespaceDirective_configurations"] =
+            namespaceDirective_configurations
+                .map((_value) => _value.toJson())
+                .toList();
+      if (uriBasedDirective_uri != null)
+        _result["uriBasedDirective_uri"] = uriBasedDirective_uri.toJson();
+      if (namespaceDirective_selectedUriContent != '')
+        _result["namespaceDirective_selectedUriContent"] =
+            namespaceDirective_selectedUriContent;
+      if (uriBasedDirective_uriContent != '')
+        _result["uriBasedDirective_uriContent"] = uriBasedDirective_uriContent;
+    }
+    if (kind == idl.LinkedNodeKind.importDirective) {
+      if (namespaceDirective_combinators.isNotEmpty)
+        _result["namespaceDirective_combinators"] =
+            namespaceDirective_combinators
+                .map((_value) => _value.toJson())
+                .toList();
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (importDirective_prefix != null)
+        _result["importDirective_prefix"] = importDirective_prefix.toJson();
+      if (importDirective_asKeyword != 0)
+        _result["importDirective_asKeyword"] = importDirective_asKeyword;
+      if (importDirective_deferredKeyword != 0)
+        _result["importDirective_deferredKeyword"] =
+            importDirective_deferredKeyword;
+      if (directive_keyword != 0)
+        _result["directive_keyword"] = directive_keyword;
+      if (namespaceDirective_semicolon != 0)
+        _result["namespaceDirective_semicolon"] = namespaceDirective_semicolon;
+      if (uriBasedDirective_uriElement != 0)
+        _result["uriBasedDirective_uriElement"] = uriBasedDirective_uriElement;
+      if (namespaceDirective_configurations.isNotEmpty)
+        _result["namespaceDirective_configurations"] =
+            namespaceDirective_configurations
+                .map((_value) => _value.toJson())
+                .toList();
+      if (uriBasedDirective_uri != null)
+        _result["uriBasedDirective_uri"] = uriBasedDirective_uri.toJson();
+      if (namespaceDirective_selectedUriContent != '')
+        _result["namespaceDirective_selectedUriContent"] =
+            namespaceDirective_selectedUriContent;
+      if (uriBasedDirective_uriContent != '')
+        _result["uriBasedDirective_uriContent"] = uriBasedDirective_uriContent;
+    }
+    if (kind == idl.LinkedNodeKind.onClause) {
+      if (onClause_superclassConstraints.isNotEmpty)
+        _result["onClause_superclassConstraints"] =
+            onClause_superclassConstraints
+                .map((_value) => _value.toJson())
+                .toList();
+      if (onClause_onKeyword != 0)
+        _result["onClause_onKeyword"] = onClause_onKeyword;
+    }
+    if (kind == idl.LinkedNodeKind.setOrMapLiteral) {
+      if (setOrMapLiteral_elements.isNotEmpty)
+        _result["setOrMapLiteral_elements"] =
+            setOrMapLiteral_elements.map((_value) => _value.toJson()).toList();
+      if (setOrMapLiteral_leftBracket != 0)
+        _result["setOrMapLiteral_leftBracket"] = setOrMapLiteral_leftBracket;
+      if (setOrMapLiteral_rightBracket != 0)
+        _result["setOrMapLiteral_rightBracket"] = setOrMapLiteral_rightBracket;
+      if (typedLiteral_constKeyword != 0)
+        _result["typedLiteral_constKeyword"] = typedLiteral_constKeyword;
+      if (setOrMapLiteral_isMap != false)
+        _result["setOrMapLiteral_isMap"] = setOrMapLiteral_isMap;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+      if (typedLiteral_typeArguments != null)
+        _result["typedLiteral_typeArguments"] =
+            typedLiteral_typeArguments.toJson();
+      if (setOrMapLiteral_isSet != false)
+        _result["setOrMapLiteral_isSet"] = setOrMapLiteral_isSet;
+    }
+    if (kind == idl.LinkedNodeKind.showCombinator) {
+      if (showCombinator_shownNames.isNotEmpty)
+        _result["showCombinator_shownNames"] =
+            showCombinator_shownNames.map((_value) => _value.toJson()).toList();
+      if (combinator_keyword != 0)
+        _result["combinator_keyword"] = combinator_keyword;
+    }
+    if (kind == idl.LinkedNodeKind.stringInterpolation) {
+      if (stringInterpolation_elements.isNotEmpty)
+        _result["stringInterpolation_elements"] = stringInterpolation_elements
+            .map((_value) => _value.toJson())
+            .toList();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.switchStatement) {
+      if (switchStatement_members.isNotEmpty)
+        _result["switchStatement_members"] =
+            switchStatement_members.map((_value) => _value.toJson()).toList();
+      if (switchStatement_leftParenthesis != 0)
+        _result["switchStatement_leftParenthesis"] =
+            switchStatement_leftParenthesis;
+      if (switchStatement_expression != null)
+        _result["switchStatement_expression"] =
+            switchStatement_expression.toJson();
+      if (switchStatement_rightParenthesis != 0)
+        _result["switchStatement_rightParenthesis"] =
+            switchStatement_rightParenthesis;
+      if (switchStatement_switchKeyword != 0)
+        _result["switchStatement_switchKeyword"] =
+            switchStatement_switchKeyword;
+      if (switchStatement_leftBracket != 0)
+        _result["switchStatement_leftBracket"] = switchStatement_leftBracket;
+      if (switchStatement_rightBracket != 0)
+        _result["switchStatement_rightBracket"] = switchStatement_rightBracket;
+    }
+    if (kind == idl.LinkedNodeKind.tryStatement) {
+      if (tryStatement_catchClauses.isNotEmpty)
+        _result["tryStatement_catchClauses"] =
+            tryStatement_catchClauses.map((_value) => _value.toJson()).toList();
+      if (tryStatement_body != null)
+        _result["tryStatement_body"] = tryStatement_body.toJson();
+      if (tryStatement_finallyKeyword != 0)
+        _result["tryStatement_finallyKeyword"] = tryStatement_finallyKeyword;
+      if (tryStatement_finallyBlock != null)
+        _result["tryStatement_finallyBlock"] =
+            tryStatement_finallyBlock.toJson();
+      if (tryStatement_tryKeyword != 0)
+        _result["tryStatement_tryKeyword"] = tryStatement_tryKeyword;
+    }
+    if (kind == idl.LinkedNodeKind.typeArgumentList) {
+      if (typeArgumentList_arguments.isNotEmpty)
+        _result["typeArgumentList_arguments"] = typeArgumentList_arguments
+            .map((_value) => _value.toJson())
+            .toList();
+      if (typeArgumentList_leftBracket != 0)
+        _result["typeArgumentList_leftBracket"] = typeArgumentList_leftBracket;
+      if (typeArgumentList_rightBracket != 0)
+        _result["typeArgumentList_rightBracket"] =
+            typeArgumentList_rightBracket;
+    }
+    if (kind == idl.LinkedNodeKind.typeParameterList) {
+      if (typeParameterList_typeParameters.isNotEmpty)
+        _result["typeParameterList_typeParameters"] =
+            typeParameterList_typeParameters
+                .map((_value) => _value.toJson())
+                .toList();
+      if (typeParameterList_leftBracket != 0)
+        _result["typeParameterList_leftBracket"] =
+            typeParameterList_leftBracket;
+      if (typeParameterList_rightBracket != 0)
+        _result["typeParameterList_rightBracket"] =
+            typeParameterList_rightBracket;
+    }
+    if (kind == idl.LinkedNodeKind.variableDeclarationList) {
+      if (variableDeclarationList_variables.isNotEmpty)
+        _result["variableDeclarationList_variables"] =
+            variableDeclarationList_variables
+                .map((_value) => _value.toJson())
+                .toList();
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (variableDeclarationList_type != null)
+        _result["variableDeclarationList_type"] =
+            variableDeclarationList_type.toJson();
+      if (variableDeclarationList_keyword != 0)
+        _result["variableDeclarationList_keyword"] =
+            variableDeclarationList_keyword;
+    }
+    if (kind == idl.LinkedNodeKind.withClause) {
+      if (withClause_mixinTypes.isNotEmpty)
+        _result["withClause_mixinTypes"] =
+            withClause_mixinTypes.map((_value) => _value.toJson()).toList();
+      if (withClause_withKeyword != 0)
+        _result["withClause_withKeyword"] = withClause_withKeyword;
+    }
+    if (kind == idl.LinkedNodeKind.classDeclaration) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (classDeclaration_extendsClause != null)
+        _result["classDeclaration_extendsClause"] =
+            classDeclaration_extendsClause.toJson();
+      if (classDeclaration_abstractKeyword != 0)
+        _result["classDeclaration_abstractKeyword"] =
+            classDeclaration_abstractKeyword;
+      if (classDeclaration_withClause != null)
+        _result["classDeclaration_withClause"] =
+            classDeclaration_withClause.toJson();
+      if (classDeclaration_classKeyword != 0)
+        _result["classDeclaration_classKeyword"] =
+            classDeclaration_classKeyword;
+      if (classOrMixinDeclaration_rightBracket != 0)
+        _result["classOrMixinDeclaration_rightBracket"] =
+            classOrMixinDeclaration_rightBracket;
+      if (classOrMixinDeclaration_leftBracket != 0)
+        _result["classOrMixinDeclaration_leftBracket"] =
+            classOrMixinDeclaration_leftBracket;
+      if (classOrMixinDeclaration_implementsClause != null)
+        _result["classOrMixinDeclaration_implementsClause"] =
+            classOrMixinDeclaration_implementsClause.toJson();
+      if (classOrMixinDeclaration_members.isNotEmpty)
+        _result["classOrMixinDeclaration_members"] =
+            classOrMixinDeclaration_members
+                .map((_value) => _value.toJson())
+                .toList();
+      if (classOrMixinDeclaration_typeParameters != null)
+        _result["classOrMixinDeclaration_typeParameters"] =
+            classOrMixinDeclaration_typeParameters.toJson();
+      if (namedCompilationUnitMember_name != null)
+        _result["namedCompilationUnitMember_name"] =
+            namedCompilationUnitMember_name.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.classTypeAlias) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (classTypeAlias_typeParameters != null)
+        _result["classTypeAlias_typeParameters"] =
+            classTypeAlias_typeParameters.toJson();
+      if (classTypeAlias_abstractKeyword != 0)
+        _result["classTypeAlias_abstractKeyword"] =
+            classTypeAlias_abstractKeyword;
+      if (classTypeAlias_superclass != null)
+        _result["classTypeAlias_superclass"] =
+            classTypeAlias_superclass.toJson();
+      if (classTypeAlias_withClause != null)
+        _result["classTypeAlias_withClause"] =
+            classTypeAlias_withClause.toJson();
+      if (classTypeAlias_equals != 0)
+        _result["classTypeAlias_equals"] = classTypeAlias_equals;
+      if (typeAlias_typedefKeyword != 0)
+        _result["typeAlias_typedefKeyword"] = typeAlias_typedefKeyword;
+      if (typeAlias_semicolon != 0)
+        _result["typeAlias_semicolon"] = typeAlias_semicolon;
+      if (classTypeAlias_implementsClause != null)
+        _result["classTypeAlias_implementsClause"] =
+            classTypeAlias_implementsClause.toJson();
+      if (namedCompilationUnitMember_name != null)
+        _result["namedCompilationUnitMember_name"] =
+            namedCompilationUnitMember_name.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.declaredIdentifier) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (declaredIdentifier_identifier != null)
+        _result["declaredIdentifier_identifier"] =
+            declaredIdentifier_identifier.toJson();
+      if (declaredIdentifier_keyword != 0)
+        _result["declaredIdentifier_keyword"] = declaredIdentifier_keyword;
+      if (declaredIdentifier_type != null)
+        _result["declaredIdentifier_type"] = declaredIdentifier_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.enumConstantDeclaration) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (enumConstantDeclaration_name != null)
+        _result["enumConstantDeclaration_name"] =
+            enumConstantDeclaration_name.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.fieldDeclaration) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (fieldDeclaration_fields != null)
+        _result["fieldDeclaration_fields"] = fieldDeclaration_fields.toJson();
+      if (fieldDeclaration_covariantKeyword != 0)
+        _result["fieldDeclaration_covariantKeyword"] =
+            fieldDeclaration_covariantKeyword;
+      if (fieldDeclaration_semicolon != 0)
+        _result["fieldDeclaration_semicolon"] = fieldDeclaration_semicolon;
+      if (fieldDeclaration_staticKeyword != 0)
+        _result["fieldDeclaration_staticKeyword"] =
+            fieldDeclaration_staticKeyword;
+    }
+    if (kind == idl.LinkedNodeKind.functionDeclaration) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (functionDeclaration_functionExpression != null)
+        _result["functionDeclaration_functionExpression"] =
+            functionDeclaration_functionExpression.toJson();
+      if (functionDeclaration_externalKeyword != 0)
+        _result["functionDeclaration_externalKeyword"] =
+            functionDeclaration_externalKeyword;
+      if (functionDeclaration_returnType != null)
+        _result["functionDeclaration_returnType"] =
+            functionDeclaration_returnType.toJson();
+      if (functionDeclaration_propertyKeyword != 0)
+        _result["functionDeclaration_propertyKeyword"] =
+            functionDeclaration_propertyKeyword;
+      if (namedCompilationUnitMember_name != null)
+        _result["namedCompilationUnitMember_name"] =
+            namedCompilationUnitMember_name.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.functionTypeAlias) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (functionTypeAlias_formalParameters != null)
+        _result["functionTypeAlias_formalParameters"] =
+            functionTypeAlias_formalParameters.toJson();
+      if (functionTypeAlias_returnType != null)
+        _result["functionTypeAlias_returnType"] =
+            functionTypeAlias_returnType.toJson();
+      if (functionTypeAlias_typeParameters != null)
+        _result["functionTypeAlias_typeParameters"] =
+            functionTypeAlias_typeParameters.toJson();
+      if (typeAlias_typedefKeyword != 0)
+        _result["typeAlias_typedefKeyword"] = typeAlias_typedefKeyword;
+      if (typeAlias_semicolon != 0)
+        _result["typeAlias_semicolon"] = typeAlias_semicolon;
+      if (namedCompilationUnitMember_name != null)
+        _result["namedCompilationUnitMember_name"] =
+            namedCompilationUnitMember_name.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.genericTypeAlias) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (genericTypeAlias_typeParameters != null)
+        _result["genericTypeAlias_typeParameters"] =
+            genericTypeAlias_typeParameters.toJson();
+      if (genericTypeAlias_functionType != null)
+        _result["genericTypeAlias_functionType"] =
+            genericTypeAlias_functionType.toJson();
+      if (genericTypeAlias_equals != 0)
+        _result["genericTypeAlias_equals"] = genericTypeAlias_equals;
+      if (typeAlias_typedefKeyword != 0)
+        _result["typeAlias_typedefKeyword"] = typeAlias_typedefKeyword;
+      if (typeAlias_semicolon != 0)
+        _result["typeAlias_semicolon"] = typeAlias_semicolon;
+      if (namedCompilationUnitMember_name != null)
+        _result["namedCompilationUnitMember_name"] =
+            namedCompilationUnitMember_name.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.libraryDirective) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (libraryDirective_name != null)
+        _result["libraryDirective_name"] = libraryDirective_name.toJson();
+      if (directive_keyword != 0)
+        _result["directive_keyword"] = directive_keyword;
+      if (namespaceDirective_semicolon != 0)
+        _result["namespaceDirective_semicolon"] = namespaceDirective_semicolon;
+    }
+    if (kind == idl.LinkedNodeKind.methodDeclaration) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (methodDeclaration_body != null)
+        _result["methodDeclaration_body"] = methodDeclaration_body.toJson();
+      if (methodDeclaration_externalKeyword != 0)
+        _result["methodDeclaration_externalKeyword"] =
+            methodDeclaration_externalKeyword;
+      if (methodDeclaration_formalParameters != null)
+        _result["methodDeclaration_formalParameters"] =
+            methodDeclaration_formalParameters.toJson();
+      if (methodDeclaration_returnType != null)
+        _result["methodDeclaration_returnType"] =
+            methodDeclaration_returnType.toJson();
+      if (methodDeclaration_modifierKeyword != 0)
+        _result["methodDeclaration_modifierKeyword"] =
+            methodDeclaration_modifierKeyword;
+      if (methodDeclaration_operatorKeyword != 0)
+        _result["methodDeclaration_operatorKeyword"] =
+            methodDeclaration_operatorKeyword;
+      if (methodDeclaration_propertyKeyword != 0)
+        _result["methodDeclaration_propertyKeyword"] =
+            methodDeclaration_propertyKeyword;
+      if (methodDeclaration_typeParameters != null)
+        _result["methodDeclaration_typeParameters"] =
+            methodDeclaration_typeParameters.toJson();
+      if (methodDeclaration_name != null)
+        _result["methodDeclaration_name"] = methodDeclaration_name.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.mixinDeclaration) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (mixinDeclaration_onClause != null)
+        _result["mixinDeclaration_onClause"] =
+            mixinDeclaration_onClause.toJson();
+      if (mixinDeclaration_mixinKeyword != 0)
+        _result["mixinDeclaration_mixinKeyword"] =
+            mixinDeclaration_mixinKeyword;
+      if (classOrMixinDeclaration_rightBracket != 0)
+        _result["classOrMixinDeclaration_rightBracket"] =
+            classOrMixinDeclaration_rightBracket;
+      if (classOrMixinDeclaration_leftBracket != 0)
+        _result["classOrMixinDeclaration_leftBracket"] =
+            classOrMixinDeclaration_leftBracket;
+      if (classOrMixinDeclaration_implementsClause != null)
+        _result["classOrMixinDeclaration_implementsClause"] =
+            classOrMixinDeclaration_implementsClause.toJson();
+      if (classOrMixinDeclaration_members.isNotEmpty)
+        _result["classOrMixinDeclaration_members"] =
+            classOrMixinDeclaration_members
+                .map((_value) => _value.toJson())
+                .toList();
+      if (classOrMixinDeclaration_typeParameters != null)
+        _result["classOrMixinDeclaration_typeParameters"] =
+            classOrMixinDeclaration_typeParameters.toJson();
+      if (namedCompilationUnitMember_name != null)
+        _result["namedCompilationUnitMember_name"] =
+            namedCompilationUnitMember_name.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.partDirective) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (directive_keyword != 0)
+        _result["directive_keyword"] = directive_keyword;
+      if (namespaceDirective_semicolon != 0)
+        _result["namespaceDirective_semicolon"] = namespaceDirective_semicolon;
+      if (uriBasedDirective_uriElement != 0)
+        _result["uriBasedDirective_uriElement"] = uriBasedDirective_uriElement;
+      if (uriBasedDirective_uri != null)
+        _result["uriBasedDirective_uri"] = uriBasedDirective_uri.toJson();
+      if (namespaceDirective_selectedUriContent != '')
+        _result["namespaceDirective_selectedUriContent"] =
+            namespaceDirective_selectedUriContent;
+      if (uriBasedDirective_uriContent != '')
+        _result["uriBasedDirective_uriContent"] = uriBasedDirective_uriContent;
+    }
+    if (kind == idl.LinkedNodeKind.partOfDirective) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (partOfDirective_libraryName != null)
+        _result["partOfDirective_libraryName"] =
+            partOfDirective_libraryName.toJson();
+      if (partOfDirective_semicolon != 0)
+        _result["partOfDirective_semicolon"] = partOfDirective_semicolon;
+      if (partOfDirective_uri != null)
+        _result["partOfDirective_uri"] = partOfDirective_uri.toJson();
+      if (partOfDirective_ofKeyword != 0)
+        _result["partOfDirective_ofKeyword"] = partOfDirective_ofKeyword;
+      if (directive_keyword != 0)
+        _result["directive_keyword"] = directive_keyword;
+      if (namespaceDirective_selectedUriContent != '')
+        _result["namespaceDirective_selectedUriContent"] =
+            namespaceDirective_selectedUriContent;
+    }
+    if (kind == idl.LinkedNodeKind.topLevelVariableDeclaration) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (topLevelVariableDeclaration_variableList != null)
+        _result["topLevelVariableDeclaration_variableList"] =
+            topLevelVariableDeclaration_variableList.toJson();
+      if (topLevelVariableDeclaration_semicolon != 0)
+        _result["topLevelVariableDeclaration_semicolon"] =
+            topLevelVariableDeclaration_semicolon;
+    }
+    if (kind == idl.LinkedNodeKind.typeParameter) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (typeParameter_bound != null)
+        _result["typeParameter_bound"] = typeParameter_bound.toJson();
+      if (typeParameter_extendsKeyword != 0)
+        _result["typeParameter_extendsKeyword"] = typeParameter_extendsKeyword;
+      if (typeParameter_name != null)
+        _result["typeParameter_name"] = typeParameter_name.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.variableDeclaration) {
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (variableDeclaration_initializer != null)
+        _result["variableDeclaration_initializer"] =
+            variableDeclaration_initializer.toJson();
+      if (variableDeclaration_equals != 0)
+        _result["variableDeclaration_equals"] = variableDeclaration_equals;
+      if (variableDeclaration_name != null)
+        _result["variableDeclaration_name"] = variableDeclaration_name.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.fieldFormalParameter) {
+      if (normalFormalParameter_metadata.isNotEmpty)
+        _result["normalFormalParameter_metadata"] =
+            normalFormalParameter_metadata
+                .map((_value) => _value.toJson())
+                .toList();
+      if (fieldFormalParameter_type != null)
+        _result["fieldFormalParameter_type"] =
+            fieldFormalParameter_type.toJson();
+      if (fieldFormalParameter_keyword != 0)
+        _result["fieldFormalParameter_keyword"] = fieldFormalParameter_keyword;
+      if (fieldFormalParameter_typeParameters != null)
+        _result["fieldFormalParameter_typeParameters"] =
+            fieldFormalParameter_typeParameters.toJson();
+      if (fieldFormalParameter_formalParameters != null)
+        _result["fieldFormalParameter_formalParameters"] =
+            fieldFormalParameter_formalParameters.toJson();
+      if (fieldFormalParameter_period != 0)
+        _result["fieldFormalParameter_period"] = fieldFormalParameter_period;
+      if (fieldFormalParameter_thisKeyword != 0)
+        _result["fieldFormalParameter_thisKeyword"] =
+            fieldFormalParameter_thisKeyword;
+      if (normalFormalParameter_covariantKeyword != 0)
+        _result["normalFormalParameter_covariantKeyword"] =
+            normalFormalParameter_covariantKeyword;
+      if (normalFormalParameter_identifier != null)
+        _result["normalFormalParameter_identifier"] =
+            normalFormalParameter_identifier.toJson();
+      if (formalParameter_kind != idl.LinkedNodeFormalParameterKind.required)
+        _result["formalParameter_kind"] =
+            formalParameter_kind.toString().split('.')[1];
+      if (normalFormalParameter_comment != null)
+        _result["normalFormalParameter_comment"] =
+            normalFormalParameter_comment.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
+      if (normalFormalParameter_metadata.isNotEmpty)
+        _result["normalFormalParameter_metadata"] =
+            normalFormalParameter_metadata
+                .map((_value) => _value.toJson())
+                .toList();
+      if (functionTypedFormalParameter_formalParameters != null)
+        _result["functionTypedFormalParameter_formalParameters"] =
+            functionTypedFormalParameter_formalParameters.toJson();
+      if (functionTypedFormalParameter_returnType != null)
+        _result["functionTypedFormalParameter_returnType"] =
+            functionTypedFormalParameter_returnType.toJson();
+      if (functionTypedFormalParameter_typeParameters != null)
+        _result["functionTypedFormalParameter_typeParameters"] =
+            functionTypedFormalParameter_typeParameters.toJson();
+      if (normalFormalParameter_covariantKeyword != 0)
+        _result["normalFormalParameter_covariantKeyword"] =
+            normalFormalParameter_covariantKeyword;
+      if (normalFormalParameter_identifier != null)
+        _result["normalFormalParameter_identifier"] =
+            normalFormalParameter_identifier.toJson();
+      if (formalParameter_kind != idl.LinkedNodeFormalParameterKind.required)
+        _result["formalParameter_kind"] =
+            formalParameter_kind.toString().split('.')[1];
+      if (normalFormalParameter_comment != null)
+        _result["normalFormalParameter_comment"] =
+            normalFormalParameter_comment.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
+      if (normalFormalParameter_metadata.isNotEmpty)
+        _result["normalFormalParameter_metadata"] =
+            normalFormalParameter_metadata
+                .map((_value) => _value.toJson())
+                .toList();
+      if (simpleFormalParameter_type != null)
+        _result["simpleFormalParameter_type"] =
+            simpleFormalParameter_type.toJson();
+      if (simpleFormalParameter_keyword != 0)
+        _result["simpleFormalParameter_keyword"] =
+            simpleFormalParameter_keyword;
+      if (normalFormalParameter_covariantKeyword != 0)
+        _result["normalFormalParameter_covariantKeyword"] =
+            normalFormalParameter_covariantKeyword;
+      if (normalFormalParameter_identifier != null)
+        _result["normalFormalParameter_identifier"] =
+            normalFormalParameter_identifier.toJson();
+      if (formalParameter_kind != idl.LinkedNodeFormalParameterKind.required)
+        _result["formalParameter_kind"] =
+            formalParameter_kind.toString().split('.')[1];
+      if (normalFormalParameter_comment != null)
+        _result["normalFormalParameter_comment"] =
+            normalFormalParameter_comment.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.switchCase) {
+      if (switchMember_statements.isNotEmpty)
+        _result["switchMember_statements"] =
+            switchMember_statements.map((_value) => _value.toJson()).toList();
+      if (switchCase_expression != null)
+        _result["switchCase_expression"] = switchCase_expression.toJson();
+      if (switchMember_keyword != 0)
+        _result["switchMember_keyword"] = switchMember_keyword;
+      if (switchMember_colon != 0)
+        _result["switchMember_colon"] = switchMember_colon;
+      if (switchMember_labels.isNotEmpty)
+        _result["switchMember_labels"] =
+            switchMember_labels.map((_value) => _value.toJson()).toList();
+    }
+    if (kind == idl.LinkedNodeKind.switchDefault) {
+      if (switchMember_statements.isNotEmpty)
+        _result["switchMember_statements"] =
+            switchMember_statements.map((_value) => _value.toJson()).toList();
+      if (switchMember_keyword != 0)
+        _result["switchMember_keyword"] = switchMember_keyword;
+      if (switchMember_colon != 0)
+        _result["switchMember_colon"] = switchMember_colon;
+      if (switchMember_labels.isNotEmpty)
+        _result["switchMember_labels"] =
+            switchMember_labels.map((_value) => _value.toJson()).toList();
+    }
+    if (kind == idl.LinkedNodeKind.annotation) {
+      if (annotation_arguments != null)
+        _result["annotation_arguments"] = annotation_arguments.toJson();
+      if (annotation_atSign != 0)
+        _result["annotation_atSign"] = annotation_atSign;
+      if (annotation_constructorName != null)
+        _result["annotation_constructorName"] =
+            annotation_constructorName.toJson();
+      if (annotation_name != null)
+        _result["annotation_name"] = annotation_name.toJson();
+      if (annotation_period != 0)
+        _result["annotation_period"] = annotation_period;
+    }
+    if (kind == idl.LinkedNodeKind.asExpression) {
+      if (asExpression_expression != null)
+        _result["asExpression_expression"] = asExpression_expression.toJson();
+      if (asExpression_asOperator != 0)
+        _result["asExpression_asOperator"] = asExpression_asOperator;
+      if (asExpression_type != null)
+        _result["asExpression_type"] = asExpression_type.toJson();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.assertInitializer) {
+      if (assertInitializer_condition != null)
+        _result["assertInitializer_condition"] =
+            assertInitializer_condition.toJson();
+      if (assertInitializer_assertKeyword != 0)
+        _result["assertInitializer_assertKeyword"] =
+            assertInitializer_assertKeyword;
+      if (assertInitializer_message != null)
+        _result["assertInitializer_message"] =
+            assertInitializer_message.toJson();
+      if (assertInitializer_comma != 0)
+        _result["assertInitializer_comma"] = assertInitializer_comma;
+      if (assertInitializer_leftParenthesis != 0)
+        _result["assertInitializer_leftParenthesis"] =
+            assertInitializer_leftParenthesis;
+      if (assertInitializer_rightParenthesis != 0)
+        _result["assertInitializer_rightParenthesis"] =
+            assertInitializer_rightParenthesis;
+    }
+    if (kind == idl.LinkedNodeKind.assertStatement) {
+      if (assertStatement_condition != null)
+        _result["assertStatement_condition"] =
+            assertStatement_condition.toJson();
+      if (assertStatement_assertKeyword != 0)
+        _result["assertStatement_assertKeyword"] =
+            assertStatement_assertKeyword;
+      if (assertStatement_message != null)
+        _result["assertStatement_message"] = assertStatement_message.toJson();
+      if (assertStatement_comma != 0)
+        _result["assertStatement_comma"] = assertStatement_comma;
+      if (assertStatement_leftParenthesis != 0)
+        _result["assertStatement_leftParenthesis"] =
+            assertStatement_leftParenthesis;
+      if (assertStatement_rightParenthesis != 0)
+        _result["assertStatement_rightParenthesis"] =
+            assertStatement_rightParenthesis;
+      if (assertStatement_semicolon != 0)
+        _result["assertStatement_semicolon"] = assertStatement_semicolon;
+    }
+    if (kind == idl.LinkedNodeKind.assignmentExpression) {
+      if (assignmentExpression_leftHandSide != null)
+        _result["assignmentExpression_leftHandSide"] =
+            assignmentExpression_leftHandSide.toJson();
+      if (assignmentExpression_element != 0)
+        _result["assignmentExpression_element"] = assignmentExpression_element;
+      if (assignmentExpression_rightHandSide != null)
+        _result["assignmentExpression_rightHandSide"] =
+            assignmentExpression_rightHandSide.toJson();
+      if (assignmentExpression_operator != 0)
+        _result["assignmentExpression_operator"] =
+            assignmentExpression_operator;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.awaitExpression) {
+      if (awaitExpression_expression != null)
+        _result["awaitExpression_expression"] =
+            awaitExpression_expression.toJson();
+      if (awaitExpression_awaitKeyword != 0)
+        _result["awaitExpression_awaitKeyword"] = awaitExpression_awaitKeyword;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.binaryExpression) {
+      if (binaryExpression_leftOperand != null)
+        _result["binaryExpression_leftOperand"] =
+            binaryExpression_leftOperand.toJson();
+      if (binaryExpression_element != 0)
+        _result["binaryExpression_element"] = binaryExpression_element;
+      if (binaryExpression_rightOperand != null)
+        _result["binaryExpression_rightOperand"] =
+            binaryExpression_rightOperand.toJson();
+      if (binaryExpression_operator != 0)
+        _result["binaryExpression_operator"] = binaryExpression_operator;
+      if (binaryExpression_invokeType != null)
+        _result["binaryExpression_invokeType"] =
+            binaryExpression_invokeType.toJson();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.blockFunctionBody) {
+      if (blockFunctionBody_block != null)
+        _result["blockFunctionBody_block"] = blockFunctionBody_block.toJson();
+      if (blockFunctionBody_keyword != 0)
+        _result["blockFunctionBody_keyword"] = blockFunctionBody_keyword;
+      if (blockFunctionBody_star != 0)
+        _result["blockFunctionBody_star"] = blockFunctionBody_star;
+    }
+    if (kind == idl.LinkedNodeKind.breakStatement) {
+      if (breakStatement_label != null)
+        _result["breakStatement_label"] = breakStatement_label.toJson();
+      if (breakStatement_breakKeyword != 0)
+        _result["breakStatement_breakKeyword"] = breakStatement_breakKeyword;
+      if (breakStatement_semicolon != 0)
+        _result["breakStatement_semicolon"] = breakStatement_semicolon;
+    }
+    if (kind == idl.LinkedNodeKind.catchClause) {
+      if (catchClause_body != null)
+        _result["catchClause_body"] = catchClause_body.toJson();
+      if (catchClause_catchKeyword != 0)
+        _result["catchClause_catchKeyword"] = catchClause_catchKeyword;
+      if (catchClause_exceptionParameter != null)
+        _result["catchClause_exceptionParameter"] =
+            catchClause_exceptionParameter.toJson();
+      if (catchClause_exceptionType != null)
+        _result["catchClause_exceptionType"] =
+            catchClause_exceptionType.toJson();
+      if (catchClause_comma != 0)
+        _result["catchClause_comma"] = catchClause_comma;
+      if (catchClause_leftParenthesis != 0)
+        _result["catchClause_leftParenthesis"] = catchClause_leftParenthesis;
+      if (catchClause_onKeyword != 0)
+        _result["catchClause_onKeyword"] = catchClause_onKeyword;
+      if (catchClause_rightParenthesis != 0)
+        _result["catchClause_rightParenthesis"] = catchClause_rightParenthesis;
+      if (catchClause_stackTraceParameter != null)
+        _result["catchClause_stackTraceParameter"] =
+            catchClause_stackTraceParameter.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.conditionalExpression) {
+      if (conditionalExpression_condition != null)
+        _result["conditionalExpression_condition"] =
+            conditionalExpression_condition.toJson();
+      if (conditionalExpression_colon != 0)
+        _result["conditionalExpression_colon"] = conditionalExpression_colon;
+      if (conditionalExpression_elseExpression != null)
+        _result["conditionalExpression_elseExpression"] =
+            conditionalExpression_elseExpression.toJson();
+      if (conditionalExpression_thenExpression != null)
+        _result["conditionalExpression_thenExpression"] =
+            conditionalExpression_thenExpression.toJson();
+      if (conditionalExpression_question != 0)
+        _result["conditionalExpression_question"] =
+            conditionalExpression_question;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.configuration) {
+      if (configuration_name != null)
+        _result["configuration_name"] = configuration_name.toJson();
+      if (configuration_ifKeyword != 0)
+        _result["configuration_ifKeyword"] = configuration_ifKeyword;
+      if (configuration_value != null)
+        _result["configuration_value"] = configuration_value.toJson();
+      if (configuration_uri != null)
+        _result["configuration_uri"] = configuration_uri.toJson();
+      if (configuration_leftParenthesis != 0)
+        _result["configuration_leftParenthesis"] =
+            configuration_leftParenthesis;
+      if (configuration_rightParenthesis != 0)
+        _result["configuration_rightParenthesis"] =
+            configuration_rightParenthesis;
+      if (configuration_equalToken != 0)
+        _result["configuration_equalToken"] = configuration_equalToken;
+    }
+    if (kind == idl.LinkedNodeKind.constructorFieldInitializer) {
+      if (constructorFieldInitializer_expression != null)
+        _result["constructorFieldInitializer_expression"] =
+            constructorFieldInitializer_expression.toJson();
+      if (constructorFieldInitializer_equals != 0)
+        _result["constructorFieldInitializer_equals"] =
+            constructorFieldInitializer_equals;
+      if (constructorFieldInitializer_fieldName != null)
+        _result["constructorFieldInitializer_fieldName"] =
+            constructorFieldInitializer_fieldName.toJson();
+      if (constructorFieldInitializer_period != 0)
+        _result["constructorFieldInitializer_period"] =
+            constructorFieldInitializer_period;
+      if (constructorFieldInitializer_thisKeyword != 0)
+        _result["constructorFieldInitializer_thisKeyword"] =
+            constructorFieldInitializer_thisKeyword;
+    }
+    if (kind == idl.LinkedNodeKind.constructorName) {
+      if (constructorName_name != null)
+        _result["constructorName_name"] = constructorName_name.toJson();
+      if (constructorName_element != 0)
+        _result["constructorName_element"] = constructorName_element;
+      if (constructorName_type != null)
+        _result["constructorName_type"] = constructorName_type.toJson();
+      if (constructorName_period != 0)
+        _result["constructorName_period"] = constructorName_period;
+    }
+    if (kind == idl.LinkedNodeKind.continueStatement) {
+      if (continueStatement_label != null)
+        _result["continueStatement_label"] = continueStatement_label.toJson();
+      if (continueStatement_continueKeyword != 0)
+        _result["continueStatement_continueKeyword"] =
+            continueStatement_continueKeyword;
+      if (continueStatement_semicolon != 0)
+        _result["continueStatement_semicolon"] = continueStatement_semicolon;
+    }
+    if (kind == idl.LinkedNodeKind.defaultFormalParameter) {
+      if (defaultFormalParameter_defaultValue != null)
+        _result["defaultFormalParameter_defaultValue"] =
+            defaultFormalParameter_defaultValue.toJson();
+      if (defaultFormalParameter_separator != 0)
+        _result["defaultFormalParameter_separator"] =
+            defaultFormalParameter_separator;
+      if (defaultFormalParameter_parameter != null)
+        _result["defaultFormalParameter_parameter"] =
+            defaultFormalParameter_parameter.toJson();
+      if (defaultFormalParameter_isNamed != false)
+        _result["defaultFormalParameter_isNamed"] =
+            defaultFormalParameter_isNamed;
+    }
+    if (kind == idl.LinkedNodeKind.doStatement) {
+      if (doStatement_body != null)
+        _result["doStatement_body"] = doStatement_body.toJson();
+      if (doStatement_leftParenthesis != 0)
+        _result["doStatement_leftParenthesis"] = doStatement_leftParenthesis;
+      if (doStatement_condition != null)
+        _result["doStatement_condition"] = doStatement_condition.toJson();
+      if (doStatement_rightParenthesis != 0)
+        _result["doStatement_rightParenthesis"] = doStatement_rightParenthesis;
+      if (doStatement_doKeyword != 0)
+        _result["doStatement_doKeyword"] = doStatement_doKeyword;
+      if (doStatement_semicolon != 0)
+        _result["doStatement_semicolon"] = doStatement_semicolon;
+      if (doStatement_whileKeyword != 0)
+        _result["doStatement_whileKeyword"] = doStatement_whileKeyword;
+    }
+    if (kind == idl.LinkedNodeKind.expressionFunctionBody) {
+      if (expressionFunctionBody_expression != null)
+        _result["expressionFunctionBody_expression"] =
+            expressionFunctionBody_expression.toJson();
+      if (expressionFunctionBody_arrow != 0)
+        _result["expressionFunctionBody_arrow"] = expressionFunctionBody_arrow;
+      if (expressionFunctionBody_keyword != 0)
+        _result["expressionFunctionBody_keyword"] =
+            expressionFunctionBody_keyword;
+      if (expressionFunctionBody_semicolon != 0)
+        _result["expressionFunctionBody_semicolon"] =
+            expressionFunctionBody_semicolon;
+    }
+    if (kind == idl.LinkedNodeKind.expressionStatement) {
+      if (expressionStatement_expression != null)
+        _result["expressionStatement_expression"] =
+            expressionStatement_expression.toJson();
+      if (expressionStatement_semicolon != 0)
+        _result["expressionStatement_semicolon"] =
+            expressionStatement_semicolon;
+    }
+    if (kind == idl.LinkedNodeKind.extendsClause) {
+      if (extendsClause_superclass != null)
+        _result["extendsClause_superclass"] = extendsClause_superclass.toJson();
+      if (extendsClause_extendsKeyword != 0)
+        _result["extendsClause_extendsKeyword"] = extendsClause_extendsKeyword;
+    }
+    if (kind == idl.LinkedNodeKind.forEachPartsWithDeclaration) {
+      if (forEachParts_iterable != null)
+        _result["forEachParts_iterable"] = forEachParts_iterable.toJson();
+      if (forEachParts_inKeyword != 0)
+        _result["forEachParts_inKeyword"] = forEachParts_inKeyword;
+      if (forEachPartsWithDeclaration_loopVariable != null)
+        _result["forEachPartsWithDeclaration_loopVariable"] =
+            forEachPartsWithDeclaration_loopVariable.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.forEachPartsWithIdentifier) {
+      if (forEachParts_iterable != null)
+        _result["forEachParts_iterable"] = forEachParts_iterable.toJson();
+      if (forEachParts_inKeyword != 0)
+        _result["forEachParts_inKeyword"] = forEachParts_inKeyword;
+      if (forEachPartsWithIdentifier_identifier != null)
+        _result["forEachPartsWithIdentifier_identifier"] =
+            forEachPartsWithIdentifier_identifier.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.forElement) {
+      if (forMixin_forLoopParts != null)
+        _result["forMixin_forLoopParts"] = forMixin_forLoopParts.toJson();
+      if (forMixin_awaitKeyword != 0)
+        _result["forMixin_awaitKeyword"] = forMixin_awaitKeyword;
+      if (forElement_body != null)
+        _result["forElement_body"] = forElement_body.toJson();
+      if (forMixin_forKeyword != 0)
+        _result["forMixin_forKeyword"] = forMixin_forKeyword;
+      if (forMixin_leftParenthesis != 0)
+        _result["forMixin_leftParenthesis"] = forMixin_leftParenthesis;
+      if (forMixin_rightParenthesis != 0)
+        _result["forMixin_rightParenthesis"] = forMixin_rightParenthesis;
+    }
+    if (kind == idl.LinkedNodeKind.forStatement) {
+      if (forMixin_forLoopParts != null)
+        _result["forMixin_forLoopParts"] = forMixin_forLoopParts.toJson();
+      if (forMixin_awaitKeyword != 0)
+        _result["forMixin_awaitKeyword"] = forMixin_awaitKeyword;
+      if (forStatement_body != null)
+        _result["forStatement_body"] = forStatement_body.toJson();
+      if (forMixin_forKeyword != 0)
+        _result["forMixin_forKeyword"] = forMixin_forKeyword;
+      if (forMixin_leftParenthesis != 0)
+        _result["forMixin_leftParenthesis"] = forMixin_leftParenthesis;
+      if (forMixin_rightParenthesis != 0)
+        _result["forMixin_rightParenthesis"] = forMixin_rightParenthesis;
+    }
+    if (kind == idl.LinkedNodeKind.forPartsWithDeclarations) {
+      if (forParts_condition != null)
+        _result["forParts_condition"] = forParts_condition.toJson();
+      if (forParts_leftSeparator != 0)
+        _result["forParts_leftSeparator"] = forParts_leftSeparator;
+      if (forPartsWithDeclarations_variables != null)
+        _result["forPartsWithDeclarations_variables"] =
+            forPartsWithDeclarations_variables.toJson();
+      if (forParts_rightSeparator != 0)
+        _result["forParts_rightSeparator"] = forParts_rightSeparator;
+      if (forParts_updaters.isNotEmpty)
+        _result["forParts_updaters"] =
+            forParts_updaters.map((_value) => _value.toJson()).toList();
+    }
+    if (kind == idl.LinkedNodeKind.forPartsWithExpression) {
+      if (forParts_condition != null)
+        _result["forParts_condition"] = forParts_condition.toJson();
+      if (forParts_leftSeparator != 0)
+        _result["forParts_leftSeparator"] = forParts_leftSeparator;
+      if (forPartsWithExpression_initialization != null)
+        _result["forPartsWithExpression_initialization"] =
+            forPartsWithExpression_initialization.toJson();
+      if (forParts_rightSeparator != 0)
+        _result["forParts_rightSeparator"] = forParts_rightSeparator;
+      if (forParts_updaters.isNotEmpty)
+        _result["forParts_updaters"] =
+            forParts_updaters.map((_value) => _value.toJson()).toList();
+    }
+    if (kind == idl.LinkedNodeKind.functionDeclarationStatement) {
+      if (functionDeclarationStatement_functionDeclaration != null)
+        _result["functionDeclarationStatement_functionDeclaration"] =
+            functionDeclarationStatement_functionDeclaration.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.functionExpression) {
+      if (functionExpression_body != null)
+        _result["functionExpression_body"] = functionExpression_body.toJson();
+      if (functionExpression_formalParameters != null)
+        _result["functionExpression_formalParameters"] =
+            functionExpression_formalParameters.toJson();
+      if (functionExpression_typeParameters != null)
+        _result["functionExpression_typeParameters"] =
+            functionExpression_typeParameters.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.functionExpressionInvocation) {
+      if (functionExpressionInvocation_function != null)
+        _result["functionExpressionInvocation_function"] =
+            functionExpressionInvocation_function.toJson();
+      if (invocationExpression_invokeType != null)
+        _result["invocationExpression_invokeType"] =
+            invocationExpression_invokeType.toJson();
+      if (invocationExpression_typeArguments != null)
+        _result["invocationExpression_typeArguments"] =
+            invocationExpression_typeArguments.toJson();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+      if (invocationExpression_arguments != null)
+        _result["invocationExpression_arguments"] =
+            invocationExpression_arguments.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.genericFunctionType) {
+      if (genericFunctionType_typeParameters != null)
+        _result["genericFunctionType_typeParameters"] =
+            genericFunctionType_typeParameters.toJson();
+      if (genericFunctionType_functionKeyword != 0)
+        _result["genericFunctionType_functionKeyword"] =
+            genericFunctionType_functionKeyword;
+      if (genericFunctionType_returnType != null)
+        _result["genericFunctionType_returnType"] =
+            genericFunctionType_returnType.toJson();
+      if (genericFunctionType_formalParameters != null)
+        _result["genericFunctionType_formalParameters"] =
+            genericFunctionType_formalParameters.toJson();
+      if (genericFunctionType_question != 0)
+        _result["genericFunctionType_question"] = genericFunctionType_question;
+    }
+    if (kind == idl.LinkedNodeKind.ifElement) {
+      if (ifMixin_condition != null)
+        _result["ifMixin_condition"] = ifMixin_condition.toJson();
+      if (ifMixin_elseKeyword != 0)
+        _result["ifMixin_elseKeyword"] = ifMixin_elseKeyword;
+      if (ifElement_thenElement != null)
+        _result["ifElement_thenElement"] = ifElement_thenElement.toJson();
+      if (ifMixin_ifKeyword != 0)
+        _result["ifMixin_ifKeyword"] = ifMixin_ifKeyword;
+      if (ifMixin_leftParenthesis != 0)
+        _result["ifMixin_leftParenthesis"] = ifMixin_leftParenthesis;
+      if (ifMixin_rightParenthesis != 0)
+        _result["ifMixin_rightParenthesis"] = ifMixin_rightParenthesis;
+      if (ifElement_elseElement != null)
+        _result["ifElement_elseElement"] = ifElement_elseElement.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.ifStatement) {
+      if (ifMixin_condition != null)
+        _result["ifMixin_condition"] = ifMixin_condition.toJson();
+      if (ifMixin_elseKeyword != 0)
+        _result["ifMixin_elseKeyword"] = ifMixin_elseKeyword;
+      if (ifStatement_elseStatement != null)
+        _result["ifStatement_elseStatement"] =
+            ifStatement_elseStatement.toJson();
+      if (ifStatement_thenStatement != null)
+        _result["ifStatement_thenStatement"] =
+            ifStatement_thenStatement.toJson();
+      if (ifMixin_ifKeyword != 0)
+        _result["ifMixin_ifKeyword"] = ifMixin_ifKeyword;
+      if (ifMixin_leftParenthesis != 0)
+        _result["ifMixin_leftParenthesis"] = ifMixin_leftParenthesis;
+      if (ifMixin_rightParenthesis != 0)
+        _result["ifMixin_rightParenthesis"] = ifMixin_rightParenthesis;
+    }
+    if (kind == idl.LinkedNodeKind.indexExpression) {
+      if (indexExpression_index != null)
+        _result["indexExpression_index"] = indexExpression_index.toJson();
+      if (indexExpression_element != 0)
+        _result["indexExpression_element"] = indexExpression_element;
+      if (indexExpression_target != null)
+        _result["indexExpression_target"] = indexExpression_target.toJson();
+      if (indexExpression_leftBracket != 0)
+        _result["indexExpression_leftBracket"] = indexExpression_leftBracket;
+      if (indexExpression_rightBracket != 0)
+        _result["indexExpression_rightBracket"] = indexExpression_rightBracket;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.instanceCreationExpression) {
+      if (instanceCreationExpression_arguments != null)
+        _result["instanceCreationExpression_arguments"] =
+            instanceCreationExpression_arguments.toJson();
+      if (instanceCreationExpression_keyword != 0)
+        _result["instanceCreationExpression_keyword"] =
+            instanceCreationExpression_keyword;
+      if (instanceCreationExpression_constructorName != null)
+        _result["instanceCreationExpression_constructorName"] =
+            instanceCreationExpression_constructorName.toJson();
+      if (instanceCreationExpression_typeArguments != null)
+        _result["instanceCreationExpression_typeArguments"] =
+            instanceCreationExpression_typeArguments.toJson();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.interpolationExpression) {
+      if (interpolationExpression_expression != null)
+        _result["interpolationExpression_expression"] =
+            interpolationExpression_expression.toJson();
+      if (interpolationExpression_leftBracket != 0)
+        _result["interpolationExpression_leftBracket"] =
+            interpolationExpression_leftBracket;
+      if (interpolationExpression_rightBracket != 0)
+        _result["interpolationExpression_rightBracket"] =
+            interpolationExpression_rightBracket;
+    }
+    if (kind == idl.LinkedNodeKind.isExpression) {
+      if (isExpression_expression != null)
+        _result["isExpression_expression"] = isExpression_expression.toJson();
+      if (isExpression_isOperator != 0)
+        _result["isExpression_isOperator"] = isExpression_isOperator;
+      if (isExpression_type != null)
+        _result["isExpression_type"] = isExpression_type.toJson();
+      if (isExpression_notOperator != 0)
+        _result["isExpression_notOperator"] = isExpression_notOperator;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.label) {
+      if (label_label != null) _result["label_label"] = label_label.toJson();
+      if (label_colon != 0) _result["label_colon"] = label_colon;
+    }
+    if (kind == idl.LinkedNodeKind.mapLiteralEntry) {
+      if (mapLiteralEntry_key != null)
+        _result["mapLiteralEntry_key"] = mapLiteralEntry_key.toJson();
+      if (mapLiteralEntry_separator != 0)
+        _result["mapLiteralEntry_separator"] = mapLiteralEntry_separator;
+      if (mapLiteralEntry_value != null)
+        _result["mapLiteralEntry_value"] = mapLiteralEntry_value.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.methodInvocation) {
+      if (methodInvocation_methodName != null)
+        _result["methodInvocation_methodName"] =
+            methodInvocation_methodName.toJson();
+      if (methodInvocation_operator != 0)
+        _result["methodInvocation_operator"] = methodInvocation_operator;
+      if (methodInvocation_target != null)
+        _result["methodInvocation_target"] = methodInvocation_target.toJson();
+      if (invocationExpression_invokeType != null)
+        _result["invocationExpression_invokeType"] =
+            invocationExpression_invokeType.toJson();
+      if (invocationExpression_typeArguments != null)
+        _result["invocationExpression_typeArguments"] =
+            invocationExpression_typeArguments.toJson();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+      if (invocationExpression_arguments != null)
+        _result["invocationExpression_arguments"] =
+            invocationExpression_arguments.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.namedExpression) {
+      if (namedExpression_expression != null)
+        _result["namedExpression_expression"] =
+            namedExpression_expression.toJson();
+      if (namedExpression_name != null)
+        _result["namedExpression_name"] = namedExpression_name.toJson();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.parenthesizedExpression) {
+      if (parenthesizedExpression_expression != null)
+        _result["parenthesizedExpression_expression"] =
+            parenthesizedExpression_expression.toJson();
+      if (parenthesizedExpression_leftParenthesis != 0)
+        _result["parenthesizedExpression_leftParenthesis"] =
+            parenthesizedExpression_leftParenthesis;
+      if (parenthesizedExpression_rightParenthesis != 0)
+        _result["parenthesizedExpression_rightParenthesis"] =
+            parenthesizedExpression_rightParenthesis;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.postfixExpression) {
+      if (postfixExpression_operand != null)
+        _result["postfixExpression_operand"] =
+            postfixExpression_operand.toJson();
+      if (postfixExpression_element != 0)
+        _result["postfixExpression_element"] = postfixExpression_element;
+      if (postfixExpression_operator != 0)
+        _result["postfixExpression_operator"] = postfixExpression_operator;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.prefixedIdentifier) {
+      if (prefixedIdentifier_identifier != null)
+        _result["prefixedIdentifier_identifier"] =
+            prefixedIdentifier_identifier.toJson();
+      if (prefixedIdentifier_period != 0)
+        _result["prefixedIdentifier_period"] = prefixedIdentifier_period;
+      if (prefixedIdentifier_prefix != null)
+        _result["prefixedIdentifier_prefix"] =
+            prefixedIdentifier_prefix.toJson();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.prefixExpression) {
+      if (prefixExpression_operand != null)
+        _result["prefixExpression_operand"] = prefixExpression_operand.toJson();
+      if (prefixExpression_element != 0)
+        _result["prefixExpression_element"] = prefixExpression_element;
+      if (prefixExpression_operator != 0)
+        _result["prefixExpression_operator"] = prefixExpression_operator;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.propertyAccess) {
+      if (propertyAccess_propertyName != null)
+        _result["propertyAccess_propertyName"] =
+            propertyAccess_propertyName.toJson();
+      if (propertyAccess_operator != 0)
+        _result["propertyAccess_operator"] = propertyAccess_operator;
+      if (propertyAccess_target != null)
+        _result["propertyAccess_target"] = propertyAccess_target.toJson();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.redirectingConstructorInvocation) {
+      if (redirectingConstructorInvocation_arguments != null)
+        _result["redirectingConstructorInvocation_arguments"] =
+            redirectingConstructorInvocation_arguments.toJson();
+      if (redirectingConstructorInvocation_element != 0)
+        _result["redirectingConstructorInvocation_element"] =
+            redirectingConstructorInvocation_element;
+      if (redirectingConstructorInvocation_constructorName != null)
+        _result["redirectingConstructorInvocation_constructorName"] =
+            redirectingConstructorInvocation_constructorName.toJson();
+      if (redirectingConstructorInvocation_period != 0)
+        _result["redirectingConstructorInvocation_period"] =
+            redirectingConstructorInvocation_period;
+      if (redirectingConstructorInvocation_thisKeyword != 0)
+        _result["redirectingConstructorInvocation_thisKeyword"] =
+            redirectingConstructorInvocation_thisKeyword;
+    }
+    if (kind == idl.LinkedNodeKind.returnStatement) {
+      if (returnStatement_expression != null)
+        _result["returnStatement_expression"] =
+            returnStatement_expression.toJson();
+      if (returnStatement_returnKeyword != 0)
+        _result["returnStatement_returnKeyword"] =
+            returnStatement_returnKeyword;
+      if (returnStatement_semicolon != 0)
+        _result["returnStatement_semicolon"] = returnStatement_semicolon;
+    }
+    if (kind == idl.LinkedNodeKind.spreadElement) {
+      if (spreadElement_expression != null)
+        _result["spreadElement_expression"] = spreadElement_expression.toJson();
+      if (spreadElement_spreadOperator != 0)
+        _result["spreadElement_spreadOperator"] = spreadElement_spreadOperator;
+    }
+    if (kind == idl.LinkedNodeKind.superConstructorInvocation) {
+      if (superConstructorInvocation_arguments != null)
+        _result["superConstructorInvocation_arguments"] =
+            superConstructorInvocation_arguments.toJson();
+      if (superConstructorInvocation_element != 0)
+        _result["superConstructorInvocation_element"] =
+            superConstructorInvocation_element;
+      if (superConstructorInvocation_constructorName != null)
+        _result["superConstructorInvocation_constructorName"] =
+            superConstructorInvocation_constructorName.toJson();
+      if (superConstructorInvocation_period != 0)
+        _result["superConstructorInvocation_period"] =
+            superConstructorInvocation_period;
+      if (superConstructorInvocation_superKeyword != 0)
+        _result["superConstructorInvocation_superKeyword"] =
+            superConstructorInvocation_superKeyword;
+    }
+    if (kind == idl.LinkedNodeKind.throwExpression) {
+      if (throwExpression_expression != null)
+        _result["throwExpression_expression"] =
+            throwExpression_expression.toJson();
+      if (throwExpression_throwKeyword != 0)
+        _result["throwExpression_throwKeyword"] = throwExpression_throwKeyword;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.typeName) {
+      if (typeName_name != null)
+        _result["typeName_name"] = typeName_name.toJson();
+      if (typeName_question != 0)
+        _result["typeName_question"] = typeName_question;
+      if (typeName_typeArguments != null)
+        _result["typeName_typeArguments"] = typeName_typeArguments.toJson();
+      if (typeName_type != null)
+        _result["typeName_type"] = typeName_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.variableDeclarationStatement) {
+      if (variableDeclarationStatement_variables != null)
+        _result["variableDeclarationStatement_variables"] =
+            variableDeclarationStatement_variables.toJson();
+      if (variableDeclarationStatement_semicolon != 0)
+        _result["variableDeclarationStatement_semicolon"] =
+            variableDeclarationStatement_semicolon;
+    }
+    if (kind == idl.LinkedNodeKind.whileStatement) {
+      if (whileStatement_body != null)
+        _result["whileStatement_body"] = whileStatement_body.toJson();
+      if (whileStatement_leftParenthesis != 0)
+        _result["whileStatement_leftParenthesis"] =
+            whileStatement_leftParenthesis;
+      if (whileStatement_condition != null)
+        _result["whileStatement_condition"] = whileStatement_condition.toJson();
+      if (whileStatement_rightParenthesis != 0)
+        _result["whileStatement_rightParenthesis"] =
+            whileStatement_rightParenthesis;
+      if (whileStatement_whileKeyword != 0)
+        _result["whileStatement_whileKeyword"] = whileStatement_whileKeyword;
+    }
+    if (kind == idl.LinkedNodeKind.yieldStatement) {
+      if (yieldStatement_expression != null)
+        _result["yieldStatement_expression"] =
+            yieldStatement_expression.toJson();
+      if (yieldStatement_yieldKeyword != 0)
+        _result["yieldStatement_yieldKeyword"] = yieldStatement_yieldKeyword;
+      if (yieldStatement_star != 0)
+        _result["yieldStatement_star"] = yieldStatement_star;
+      if (yieldStatement_semicolon != 0)
+        _result["yieldStatement_semicolon"] = yieldStatement_semicolon;
+    }
+    if (kind == idl.LinkedNodeKind.booleanLiteral) {
+      if (booleanLiteral_literal != 0)
+        _result["booleanLiteral_literal"] = booleanLiteral_literal;
+      if (booleanLiteral_value != false)
+        _result["booleanLiteral_value"] = booleanLiteral_value;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.doubleLiteral) {
+      if (doubleLiteral_literal != 0)
+        _result["doubleLiteral_literal"] = doubleLiteral_literal;
+      if (doubleLiteral_value != 0.0)
+        _result["doubleLiteral_value"] = doubleLiteral_value.isFinite
+            ? doubleLiteral_value
+            : doubleLiteral_value.toString();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.emptyFunctionBody) {
+      if (emptyFunctionBody_semicolon != 0)
+        _result["emptyFunctionBody_semicolon"] = emptyFunctionBody_semicolon;
+    }
+    if (kind == idl.LinkedNodeKind.emptyStatement) {
+      if (emptyStatement_semicolon != 0)
+        _result["emptyStatement_semicolon"] = emptyStatement_semicolon;
+    }
+    if (kind == idl.LinkedNodeKind.integerLiteral) {
+      if (integerLiteral_literal != 0)
+        _result["integerLiteral_literal"] = integerLiteral_literal;
+      if (integerLiteral_value != 0)
+        _result["integerLiteral_value"] = integerLiteral_value;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.interpolationString) {
+      if (interpolationString_token != 0)
+        _result["interpolationString_token"] = interpolationString_token;
+      if (interpolationString_value != '')
+        _result["interpolationString_value"] = interpolationString_value;
+    }
+    if (kind == idl.LinkedNodeKind.nullLiteral) {
+      if (nullLiteral_literal != 0)
+        _result["nullLiteral_literal"] = nullLiteral_literal;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.rethrowExpression) {
+      if (rethrowExpression_rethrowKeyword != 0)
+        _result["rethrowExpression_rethrowKeyword"] =
+            rethrowExpression_rethrowKeyword;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.scriptTag) {
+      if (scriptTag_scriptTag != 0)
+        _result["scriptTag_scriptTag"] = scriptTag_scriptTag;
+    }
+    if (kind == idl.LinkedNodeKind.simpleIdentifier) {
+      if (simpleIdentifier_element != 0)
+        _result["simpleIdentifier_element"] = simpleIdentifier_element;
+      if (simpleIdentifier_token != 0)
+        _result["simpleIdentifier_token"] = simpleIdentifier_token;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.simpleStringLiteral) {
+      if (simpleStringLiteral_token != 0)
+        _result["simpleStringLiteral_token"] = simpleStringLiteral_token;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+      if (simpleStringLiteral_value != '')
+        _result["simpleStringLiteral_value"] = simpleStringLiteral_value;
+    }
+    if (kind == idl.LinkedNodeKind.superExpression) {
+      if (superExpression_superKeyword != 0)
+        _result["superExpression_superKeyword"] = superExpression_superKeyword;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.symbolLiteral) {
+      if (symbolLiteral_poundSign != 0)
+        _result["symbolLiteral_poundSign"] = symbolLiteral_poundSign;
+      if (symbolLiteral_components.isNotEmpty)
+        _result["symbolLiteral_components"] = symbolLiteral_components;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.thisExpression) {
+      if (thisExpression_thisKeyword != 0)
+        _result["thisExpression_thisKeyword"] = thisExpression_thisKeyword;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.comment) {
+      if (comment_tokens.isNotEmpty) _result["comment_tokens"] = comment_tokens;
+      if (comment_type != idl.LinkedNodeCommentType.block)
+        _result["comment_type"] = comment_type.toString().split('.')[1];
+    }
+    return _result;
+  }
+
+  @override
+  Map<String, Object> toMap() {
+    if (kind == idl.LinkedNodeKind.adjacentStrings) {
+      return {
+        "adjacentStrings_strings": adjacentStrings_strings,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.argumentList) {
+      return {
+        "argumentList_arguments": argumentList_arguments,
+        "argumentList_leftParenthesis": argumentList_leftParenthesis,
+        "argumentList_rightParenthesis": argumentList_rightParenthesis,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.block) {
+      return {
+        "block_statements": block_statements,
+        "block_leftBracket": block_leftBracket,
+        "block_rightBracket": block_rightBracket,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.cascadeExpression) {
+      return {
+        "cascadeExpression_sections": cascadeExpression_sections,
+        "cascadeExpression_target": cascadeExpression_target,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.compilationUnit) {
+      return {
+        "compilationUnit_declarations": compilationUnit_declarations,
+        "compilationUnit_scriptTag": compilationUnit_scriptTag,
+        "compilationUnit_beginToken": compilationUnit_beginToken,
+        "compilationUnit_endToken": compilationUnit_endToken,
+        "compilationUnit_directives": compilationUnit_directives,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.constructorDeclaration) {
+      return {
+        "constructorDeclaration_initializers":
+            constructorDeclaration_initializers,
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "constructorDeclaration_body": constructorDeclaration_body,
+        "constructorDeclaration_constKeyword":
+            constructorDeclaration_constKeyword,
+        "constructorDeclaration_name": constructorDeclaration_name,
+        "constructorDeclaration_parameters": constructorDeclaration_parameters,
+        "constructorDeclaration_externalKeyword":
+            constructorDeclaration_externalKeyword,
+        "constructorDeclaration_factoryKeyword":
+            constructorDeclaration_factoryKeyword,
+        "constructorDeclaration_period": constructorDeclaration_period,
+        "constructorDeclaration_separator": constructorDeclaration_separator,
+        "constructorDeclaration_redirectedConstructor":
+            constructorDeclaration_redirectedConstructor,
+        "constructorDeclaration_returnType": constructorDeclaration_returnType,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.dottedName) {
+      return {
+        "dottedName_components": dottedName_components,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.enumDeclaration) {
+      return {
+        "enumDeclaration_constants": enumDeclaration_constants,
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "enumDeclaration_enumKeyword": enumDeclaration_enumKeyword,
+        "enumDeclaration_leftBracket": enumDeclaration_leftBracket,
+        "enumDeclaration_rightBracket": enumDeclaration_rightBracket,
+        "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.formalParameterList) {
+      return {
+        "formalParameterList_parameters": formalParameterList_parameters,
+        "formalParameterList_leftDelimiter": formalParameterList_leftDelimiter,
+        "formalParameterList_leftParenthesis":
+            formalParameterList_leftParenthesis,
+        "formalParameterList_rightDelimiter":
+            formalParameterList_rightDelimiter,
+        "formalParameterList_rightParenthesis":
+            formalParameterList_rightParenthesis,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.hideCombinator) {
+      return {
+        "hideCombinator_hiddenNames": hideCombinator_hiddenNames,
+        "combinator_keyword": combinator_keyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.implementsClause) {
+      return {
+        "implementsClause_interfaces": implementsClause_interfaces,
+        "implementsClause_implementsKeyword":
+            implementsClause_implementsKeyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.labeledStatement) {
+      return {
+        "labeledStatement_labels": labeledStatement_labels,
+        "labeledStatement_statement": labeledStatement_statement,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.libraryIdentifier) {
+      return {
+        "libraryIdentifier_components": libraryIdentifier_components,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.listLiteral) {
+      return {
+        "listLiteral_elements": listLiteral_elements,
+        "listLiteral_leftBracket": listLiteral_leftBracket,
+        "listLiteral_rightBracket": listLiteral_rightBracket,
+        "typedLiteral_constKeyword": typedLiteral_constKeyword,
+        "expression_type": expression_type,
+        "typedLiteral_typeArguments": typedLiteral_typeArguments,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.exportDirective) {
+      return {
+        "namespaceDirective_combinators": namespaceDirective_combinators,
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "directive_keyword": directive_keyword,
+        "namespaceDirective_semicolon": namespaceDirective_semicolon,
+        "uriBasedDirective_uriElement": uriBasedDirective_uriElement,
+        "namespaceDirective_configurations": namespaceDirective_configurations,
+        "uriBasedDirective_uri": uriBasedDirective_uri,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+        "namespaceDirective_selectedUriContent":
+            namespaceDirective_selectedUriContent,
+        "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.importDirective) {
+      return {
+        "namespaceDirective_combinators": namespaceDirective_combinators,
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "importDirective_prefix": importDirective_prefix,
+        "importDirective_asKeyword": importDirective_asKeyword,
+        "importDirective_deferredKeyword": importDirective_deferredKeyword,
+        "directive_keyword": directive_keyword,
+        "namespaceDirective_semicolon": namespaceDirective_semicolon,
+        "uriBasedDirective_uriElement": uriBasedDirective_uriElement,
+        "namespaceDirective_configurations": namespaceDirective_configurations,
+        "uriBasedDirective_uri": uriBasedDirective_uri,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+        "namespaceDirective_selectedUriContent":
+            namespaceDirective_selectedUriContent,
+        "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.onClause) {
+      return {
+        "onClause_superclassConstraints": onClause_superclassConstraints,
+        "onClause_onKeyword": onClause_onKeyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.setOrMapLiteral) {
+      return {
+        "setOrMapLiteral_elements": setOrMapLiteral_elements,
+        "setOrMapLiteral_leftBracket": setOrMapLiteral_leftBracket,
+        "setOrMapLiteral_rightBracket": setOrMapLiteral_rightBracket,
+        "typedLiteral_constKeyword": typedLiteral_constKeyword,
+        "setOrMapLiteral_isMap": setOrMapLiteral_isMap,
+        "expression_type": expression_type,
+        "typedLiteral_typeArguments": typedLiteral_typeArguments,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+        "setOrMapLiteral_isSet": setOrMapLiteral_isSet,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.showCombinator) {
+      return {
+        "showCombinator_shownNames": showCombinator_shownNames,
+        "combinator_keyword": combinator_keyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.stringInterpolation) {
+      return {
+        "stringInterpolation_elements": stringInterpolation_elements,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.switchStatement) {
+      return {
+        "switchStatement_members": switchStatement_members,
+        "switchStatement_leftParenthesis": switchStatement_leftParenthesis,
+        "switchStatement_expression": switchStatement_expression,
+        "switchStatement_rightParenthesis": switchStatement_rightParenthesis,
+        "switchStatement_switchKeyword": switchStatement_switchKeyword,
+        "switchStatement_leftBracket": switchStatement_leftBracket,
+        "switchStatement_rightBracket": switchStatement_rightBracket,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.tryStatement) {
+      return {
+        "tryStatement_catchClauses": tryStatement_catchClauses,
+        "tryStatement_body": tryStatement_body,
+        "tryStatement_finallyKeyword": tryStatement_finallyKeyword,
+        "tryStatement_finallyBlock": tryStatement_finallyBlock,
+        "tryStatement_tryKeyword": tryStatement_tryKeyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.typeArgumentList) {
+      return {
+        "typeArgumentList_arguments": typeArgumentList_arguments,
+        "typeArgumentList_leftBracket": typeArgumentList_leftBracket,
+        "typeArgumentList_rightBracket": typeArgumentList_rightBracket,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.typeParameterList) {
+      return {
+        "typeParameterList_typeParameters": typeParameterList_typeParameters,
+        "typeParameterList_leftBracket": typeParameterList_leftBracket,
+        "typeParameterList_rightBracket": typeParameterList_rightBracket,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.variableDeclarationList) {
+      return {
+        "variableDeclarationList_variables": variableDeclarationList_variables,
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "variableDeclarationList_type": variableDeclarationList_type,
+        "variableDeclarationList_keyword": variableDeclarationList_keyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.withClause) {
+      return {
+        "withClause_mixinTypes": withClause_mixinTypes,
+        "withClause_withKeyword": withClause_withKeyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.classDeclaration) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "classDeclaration_extendsClause": classDeclaration_extendsClause,
+        "classDeclaration_abstractKeyword": classDeclaration_abstractKeyword,
+        "classDeclaration_withClause": classDeclaration_withClause,
+        "classDeclaration_classKeyword": classDeclaration_classKeyword,
+        "classOrMixinDeclaration_rightBracket":
+            classOrMixinDeclaration_rightBracket,
+        "classOrMixinDeclaration_leftBracket":
+            classOrMixinDeclaration_leftBracket,
+        "classOrMixinDeclaration_implementsClause":
+            classOrMixinDeclaration_implementsClause,
+        "classOrMixinDeclaration_members": classOrMixinDeclaration_members,
+        "classOrMixinDeclaration_typeParameters":
+            classOrMixinDeclaration_typeParameters,
+        "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.classTypeAlias) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "classTypeAlias_typeParameters": classTypeAlias_typeParameters,
+        "classTypeAlias_abstractKeyword": classTypeAlias_abstractKeyword,
+        "classTypeAlias_superclass": classTypeAlias_superclass,
+        "classTypeAlias_withClause": classTypeAlias_withClause,
+        "classTypeAlias_equals": classTypeAlias_equals,
+        "typeAlias_typedefKeyword": typeAlias_typedefKeyword,
+        "typeAlias_semicolon": typeAlias_semicolon,
+        "classTypeAlias_implementsClause": classTypeAlias_implementsClause,
+        "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.declaredIdentifier) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "declaredIdentifier_identifier": declaredIdentifier_identifier,
+        "declaredIdentifier_keyword": declaredIdentifier_keyword,
+        "declaredIdentifier_type": declaredIdentifier_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.enumConstantDeclaration) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "enumConstantDeclaration_name": enumConstantDeclaration_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.fieldDeclaration) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "fieldDeclaration_fields": fieldDeclaration_fields,
+        "fieldDeclaration_covariantKeyword": fieldDeclaration_covariantKeyword,
+        "fieldDeclaration_semicolon": fieldDeclaration_semicolon,
+        "fieldDeclaration_staticKeyword": fieldDeclaration_staticKeyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.functionDeclaration) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "functionDeclaration_functionExpression":
+            functionDeclaration_functionExpression,
+        "functionDeclaration_externalKeyword":
+            functionDeclaration_externalKeyword,
+        "functionDeclaration_returnType": functionDeclaration_returnType,
+        "functionDeclaration_propertyKeyword":
+            functionDeclaration_propertyKeyword,
+        "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.functionTypeAlias) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "functionTypeAlias_formalParameters":
+            functionTypeAlias_formalParameters,
+        "functionTypeAlias_returnType": functionTypeAlias_returnType,
+        "functionTypeAlias_typeParameters": functionTypeAlias_typeParameters,
+        "typeAlias_typedefKeyword": typeAlias_typedefKeyword,
+        "typeAlias_semicolon": typeAlias_semicolon,
+        "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.genericTypeAlias) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "genericTypeAlias_typeParameters": genericTypeAlias_typeParameters,
+        "genericTypeAlias_functionType": genericTypeAlias_functionType,
+        "genericTypeAlias_equals": genericTypeAlias_equals,
+        "typeAlias_typedefKeyword": typeAlias_typedefKeyword,
+        "typeAlias_semicolon": typeAlias_semicolon,
+        "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.libraryDirective) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "libraryDirective_name": libraryDirective_name,
+        "directive_keyword": directive_keyword,
+        "namespaceDirective_semicolon": namespaceDirective_semicolon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.methodDeclaration) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "methodDeclaration_body": methodDeclaration_body,
+        "methodDeclaration_externalKeyword": methodDeclaration_externalKeyword,
+        "methodDeclaration_formalParameters":
+            methodDeclaration_formalParameters,
+        "methodDeclaration_returnType": methodDeclaration_returnType,
+        "methodDeclaration_modifierKeyword": methodDeclaration_modifierKeyword,
+        "methodDeclaration_operatorKeyword": methodDeclaration_operatorKeyword,
+        "methodDeclaration_propertyKeyword": methodDeclaration_propertyKeyword,
+        "methodDeclaration_typeParameters": methodDeclaration_typeParameters,
+        "methodDeclaration_name": methodDeclaration_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.mixinDeclaration) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "mixinDeclaration_onClause": mixinDeclaration_onClause,
+        "mixinDeclaration_mixinKeyword": mixinDeclaration_mixinKeyword,
+        "classOrMixinDeclaration_rightBracket":
+            classOrMixinDeclaration_rightBracket,
+        "classOrMixinDeclaration_leftBracket":
+            classOrMixinDeclaration_leftBracket,
+        "classOrMixinDeclaration_implementsClause":
+            classOrMixinDeclaration_implementsClause,
+        "classOrMixinDeclaration_members": classOrMixinDeclaration_members,
+        "classOrMixinDeclaration_typeParameters":
+            classOrMixinDeclaration_typeParameters,
+        "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.partDirective) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "directive_keyword": directive_keyword,
+        "namespaceDirective_semicolon": namespaceDirective_semicolon,
+        "uriBasedDirective_uriElement": uriBasedDirective_uriElement,
+        "uriBasedDirective_uri": uriBasedDirective_uri,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+        "namespaceDirective_selectedUriContent":
+            namespaceDirective_selectedUriContent,
+        "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.partOfDirective) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "partOfDirective_libraryName": partOfDirective_libraryName,
+        "partOfDirective_semicolon": partOfDirective_semicolon,
+        "partOfDirective_uri": partOfDirective_uri,
+        "partOfDirective_ofKeyword": partOfDirective_ofKeyword,
+        "directive_keyword": directive_keyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+        "namespaceDirective_selectedUriContent":
+            namespaceDirective_selectedUriContent,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.topLevelVariableDeclaration) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "topLevelVariableDeclaration_variableList":
+            topLevelVariableDeclaration_variableList,
+        "topLevelVariableDeclaration_semicolon":
+            topLevelVariableDeclaration_semicolon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.typeParameter) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "typeParameter_bound": typeParameter_bound,
+        "typeParameter_extendsKeyword": typeParameter_extendsKeyword,
+        "typeParameter_name": typeParameter_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.variableDeclaration) {
+      return {
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "variableDeclaration_initializer": variableDeclaration_initializer,
+        "variableDeclaration_equals": variableDeclaration_equals,
+        "variableDeclaration_name": variableDeclaration_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.fieldFormalParameter) {
+      return {
+        "normalFormalParameter_metadata": normalFormalParameter_metadata,
+        "fieldFormalParameter_type": fieldFormalParameter_type,
+        "fieldFormalParameter_keyword": fieldFormalParameter_keyword,
+        "fieldFormalParameter_typeParameters":
+            fieldFormalParameter_typeParameters,
+        "fieldFormalParameter_formalParameters":
+            fieldFormalParameter_formalParameters,
+        "fieldFormalParameter_period": fieldFormalParameter_period,
+        "fieldFormalParameter_thisKeyword": fieldFormalParameter_thisKeyword,
+        "normalFormalParameter_covariantKeyword":
+            normalFormalParameter_covariantKeyword,
+        "normalFormalParameter_identifier": normalFormalParameter_identifier,
+        "formalParameter_kind": formalParameter_kind,
+        "normalFormalParameter_comment": normalFormalParameter_comment,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
+      return {
+        "normalFormalParameter_metadata": normalFormalParameter_metadata,
+        "functionTypedFormalParameter_formalParameters":
+            functionTypedFormalParameter_formalParameters,
+        "functionTypedFormalParameter_returnType":
+            functionTypedFormalParameter_returnType,
+        "functionTypedFormalParameter_typeParameters":
+            functionTypedFormalParameter_typeParameters,
+        "normalFormalParameter_covariantKeyword":
+            normalFormalParameter_covariantKeyword,
+        "normalFormalParameter_identifier": normalFormalParameter_identifier,
+        "formalParameter_kind": formalParameter_kind,
+        "normalFormalParameter_comment": normalFormalParameter_comment,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
+      return {
+        "normalFormalParameter_metadata": normalFormalParameter_metadata,
+        "simpleFormalParameter_type": simpleFormalParameter_type,
+        "simpleFormalParameter_keyword": simpleFormalParameter_keyword,
+        "normalFormalParameter_covariantKeyword":
+            normalFormalParameter_covariantKeyword,
+        "normalFormalParameter_identifier": normalFormalParameter_identifier,
+        "formalParameter_kind": formalParameter_kind,
+        "normalFormalParameter_comment": normalFormalParameter_comment,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.switchCase) {
+      return {
+        "switchMember_statements": switchMember_statements,
+        "switchCase_expression": switchCase_expression,
+        "switchMember_keyword": switchMember_keyword,
+        "switchMember_colon": switchMember_colon,
+        "switchMember_labels": switchMember_labels,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.switchDefault) {
+      return {
+        "switchMember_statements": switchMember_statements,
+        "switchMember_keyword": switchMember_keyword,
+        "switchMember_colon": switchMember_colon,
+        "switchMember_labels": switchMember_labels,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.annotation) {
+      return {
+        "annotation_arguments": annotation_arguments,
+        "annotation_atSign": annotation_atSign,
+        "annotation_constructorName": annotation_constructorName,
+        "annotation_name": annotation_name,
+        "annotation_period": annotation_period,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.asExpression) {
+      return {
+        "asExpression_expression": asExpression_expression,
+        "asExpression_asOperator": asExpression_asOperator,
+        "asExpression_type": asExpression_type,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.assertInitializer) {
+      return {
+        "assertInitializer_condition": assertInitializer_condition,
+        "assertInitializer_assertKeyword": assertInitializer_assertKeyword,
+        "assertInitializer_message": assertInitializer_message,
+        "assertInitializer_comma": assertInitializer_comma,
+        "assertInitializer_leftParenthesis": assertInitializer_leftParenthesis,
+        "assertInitializer_rightParenthesis":
+            assertInitializer_rightParenthesis,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.assertStatement) {
+      return {
+        "assertStatement_condition": assertStatement_condition,
+        "assertStatement_assertKeyword": assertStatement_assertKeyword,
+        "assertStatement_message": assertStatement_message,
+        "assertStatement_comma": assertStatement_comma,
+        "assertStatement_leftParenthesis": assertStatement_leftParenthesis,
+        "assertStatement_rightParenthesis": assertStatement_rightParenthesis,
+        "assertStatement_semicolon": assertStatement_semicolon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.assignmentExpression) {
+      return {
+        "assignmentExpression_leftHandSide": assignmentExpression_leftHandSide,
+        "assignmentExpression_element": assignmentExpression_element,
+        "assignmentExpression_rightHandSide":
+            assignmentExpression_rightHandSide,
+        "assignmentExpression_operator": assignmentExpression_operator,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.awaitExpression) {
+      return {
+        "awaitExpression_expression": awaitExpression_expression,
+        "awaitExpression_awaitKeyword": awaitExpression_awaitKeyword,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.binaryExpression) {
+      return {
+        "binaryExpression_leftOperand": binaryExpression_leftOperand,
+        "binaryExpression_element": binaryExpression_element,
+        "binaryExpression_rightOperand": binaryExpression_rightOperand,
+        "binaryExpression_operator": binaryExpression_operator,
+        "binaryExpression_invokeType": binaryExpression_invokeType,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.blockFunctionBody) {
+      return {
+        "blockFunctionBody_block": blockFunctionBody_block,
+        "blockFunctionBody_keyword": blockFunctionBody_keyword,
+        "blockFunctionBody_star": blockFunctionBody_star,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.breakStatement) {
+      return {
+        "breakStatement_label": breakStatement_label,
+        "breakStatement_breakKeyword": breakStatement_breakKeyword,
+        "breakStatement_semicolon": breakStatement_semicolon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.catchClause) {
+      return {
+        "catchClause_body": catchClause_body,
+        "catchClause_catchKeyword": catchClause_catchKeyword,
+        "catchClause_exceptionParameter": catchClause_exceptionParameter,
+        "catchClause_exceptionType": catchClause_exceptionType,
+        "catchClause_comma": catchClause_comma,
+        "catchClause_leftParenthesis": catchClause_leftParenthesis,
+        "catchClause_onKeyword": catchClause_onKeyword,
+        "catchClause_rightParenthesis": catchClause_rightParenthesis,
+        "catchClause_stackTraceParameter": catchClause_stackTraceParameter,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.conditionalExpression) {
+      return {
+        "conditionalExpression_condition": conditionalExpression_condition,
+        "conditionalExpression_colon": conditionalExpression_colon,
+        "conditionalExpression_elseExpression":
+            conditionalExpression_elseExpression,
+        "conditionalExpression_thenExpression":
+            conditionalExpression_thenExpression,
+        "conditionalExpression_question": conditionalExpression_question,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.configuration) {
+      return {
+        "configuration_name": configuration_name,
+        "configuration_ifKeyword": configuration_ifKeyword,
+        "configuration_value": configuration_value,
+        "configuration_uri": configuration_uri,
+        "configuration_leftParenthesis": configuration_leftParenthesis,
+        "configuration_rightParenthesis": configuration_rightParenthesis,
+        "configuration_equalToken": configuration_equalToken,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.constructorFieldInitializer) {
+      return {
+        "constructorFieldInitializer_expression":
+            constructorFieldInitializer_expression,
+        "constructorFieldInitializer_equals":
+            constructorFieldInitializer_equals,
+        "constructorFieldInitializer_fieldName":
+            constructorFieldInitializer_fieldName,
+        "constructorFieldInitializer_period":
+            constructorFieldInitializer_period,
+        "constructorFieldInitializer_thisKeyword":
+            constructorFieldInitializer_thisKeyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.constructorName) {
+      return {
+        "constructorName_name": constructorName_name,
+        "constructorName_element": constructorName_element,
+        "constructorName_type": constructorName_type,
+        "constructorName_period": constructorName_period,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.continueStatement) {
+      return {
+        "continueStatement_label": continueStatement_label,
+        "continueStatement_continueKeyword": continueStatement_continueKeyword,
+        "continueStatement_semicolon": continueStatement_semicolon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.defaultFormalParameter) {
+      return {
+        "defaultFormalParameter_defaultValue":
+            defaultFormalParameter_defaultValue,
+        "defaultFormalParameter_separator": defaultFormalParameter_separator,
+        "defaultFormalParameter_parameter": defaultFormalParameter_parameter,
+        "defaultFormalParameter_isNamed": defaultFormalParameter_isNamed,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.doStatement) {
+      return {
+        "doStatement_body": doStatement_body,
+        "doStatement_leftParenthesis": doStatement_leftParenthesis,
+        "doStatement_condition": doStatement_condition,
+        "doStatement_rightParenthesis": doStatement_rightParenthesis,
+        "doStatement_doKeyword": doStatement_doKeyword,
+        "doStatement_semicolon": doStatement_semicolon,
+        "doStatement_whileKeyword": doStatement_whileKeyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.expressionFunctionBody) {
+      return {
+        "expressionFunctionBody_expression": expressionFunctionBody_expression,
+        "expressionFunctionBody_arrow": expressionFunctionBody_arrow,
+        "expressionFunctionBody_keyword": expressionFunctionBody_keyword,
+        "expressionFunctionBody_semicolon": expressionFunctionBody_semicolon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.expressionStatement) {
+      return {
+        "expressionStatement_expression": expressionStatement_expression,
+        "expressionStatement_semicolon": expressionStatement_semicolon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.extendsClause) {
+      return {
+        "extendsClause_superclass": extendsClause_superclass,
+        "extendsClause_extendsKeyword": extendsClause_extendsKeyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.forEachPartsWithDeclaration) {
+      return {
+        "forEachParts_iterable": forEachParts_iterable,
+        "forEachParts_inKeyword": forEachParts_inKeyword,
+        "forEachPartsWithDeclaration_loopVariable":
+            forEachPartsWithDeclaration_loopVariable,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.forEachPartsWithIdentifier) {
+      return {
+        "forEachParts_iterable": forEachParts_iterable,
+        "forEachParts_inKeyword": forEachParts_inKeyword,
+        "forEachPartsWithIdentifier_identifier":
+            forEachPartsWithIdentifier_identifier,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.forElement) {
+      return {
+        "forMixin_forLoopParts": forMixin_forLoopParts,
+        "forMixin_awaitKeyword": forMixin_awaitKeyword,
+        "forElement_body": forElement_body,
+        "forMixin_forKeyword": forMixin_forKeyword,
+        "forMixin_leftParenthesis": forMixin_leftParenthesis,
+        "forMixin_rightParenthesis": forMixin_rightParenthesis,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.forStatement) {
+      return {
+        "forMixin_forLoopParts": forMixin_forLoopParts,
+        "forMixin_awaitKeyword": forMixin_awaitKeyword,
+        "forStatement_body": forStatement_body,
+        "forMixin_forKeyword": forMixin_forKeyword,
+        "forMixin_leftParenthesis": forMixin_leftParenthesis,
+        "forMixin_rightParenthesis": forMixin_rightParenthesis,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.forPartsWithDeclarations) {
+      return {
+        "forParts_condition": forParts_condition,
+        "forParts_leftSeparator": forParts_leftSeparator,
+        "forPartsWithDeclarations_variables":
+            forPartsWithDeclarations_variables,
+        "forParts_rightSeparator": forParts_rightSeparator,
+        "forParts_updaters": forParts_updaters,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.forPartsWithExpression) {
+      return {
+        "forParts_condition": forParts_condition,
+        "forParts_leftSeparator": forParts_leftSeparator,
+        "forPartsWithExpression_initialization":
+            forPartsWithExpression_initialization,
+        "forParts_rightSeparator": forParts_rightSeparator,
+        "forParts_updaters": forParts_updaters,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.functionDeclarationStatement) {
+      return {
+        "functionDeclarationStatement_functionDeclaration":
+            functionDeclarationStatement_functionDeclaration,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.functionExpression) {
+      return {
+        "functionExpression_body": functionExpression_body,
+        "functionExpression_formalParameters":
+            functionExpression_formalParameters,
+        "functionExpression_typeParameters": functionExpression_typeParameters,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.functionExpressionInvocation) {
+      return {
+        "functionExpressionInvocation_function":
+            functionExpressionInvocation_function,
+        "invocationExpression_invokeType": invocationExpression_invokeType,
+        "invocationExpression_typeArguments":
+            invocationExpression_typeArguments,
+        "expression_type": expression_type,
+        "invocationExpression_arguments": invocationExpression_arguments,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.genericFunctionType) {
+      return {
+        "genericFunctionType_typeParameters":
+            genericFunctionType_typeParameters,
+        "genericFunctionType_functionKeyword":
+            genericFunctionType_functionKeyword,
+        "genericFunctionType_returnType": genericFunctionType_returnType,
+        "genericFunctionType_formalParameters":
+            genericFunctionType_formalParameters,
+        "genericFunctionType_question": genericFunctionType_question,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.ifElement) {
+      return {
+        "ifMixin_condition": ifMixin_condition,
+        "ifMixin_elseKeyword": ifMixin_elseKeyword,
+        "ifElement_thenElement": ifElement_thenElement,
+        "ifMixin_ifKeyword": ifMixin_ifKeyword,
+        "ifMixin_leftParenthesis": ifMixin_leftParenthesis,
+        "ifMixin_rightParenthesis": ifMixin_rightParenthesis,
+        "ifElement_elseElement": ifElement_elseElement,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.ifStatement) {
+      return {
+        "ifMixin_condition": ifMixin_condition,
+        "ifMixin_elseKeyword": ifMixin_elseKeyword,
+        "ifStatement_elseStatement": ifStatement_elseStatement,
+        "ifStatement_thenStatement": ifStatement_thenStatement,
+        "ifMixin_ifKeyword": ifMixin_ifKeyword,
+        "ifMixin_leftParenthesis": ifMixin_leftParenthesis,
+        "ifMixin_rightParenthesis": ifMixin_rightParenthesis,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.indexExpression) {
+      return {
+        "indexExpression_index": indexExpression_index,
+        "indexExpression_element": indexExpression_element,
+        "indexExpression_target": indexExpression_target,
+        "indexExpression_leftBracket": indexExpression_leftBracket,
+        "indexExpression_rightBracket": indexExpression_rightBracket,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.instanceCreationExpression) {
+      return {
+        "instanceCreationExpression_arguments":
+            instanceCreationExpression_arguments,
+        "instanceCreationExpression_keyword":
+            instanceCreationExpression_keyword,
+        "instanceCreationExpression_constructorName":
+            instanceCreationExpression_constructorName,
+        "instanceCreationExpression_typeArguments":
+            instanceCreationExpression_typeArguments,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.interpolationExpression) {
+      return {
+        "interpolationExpression_expression":
+            interpolationExpression_expression,
+        "interpolationExpression_leftBracket":
+            interpolationExpression_leftBracket,
+        "interpolationExpression_rightBracket":
+            interpolationExpression_rightBracket,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.isExpression) {
+      return {
+        "isExpression_expression": isExpression_expression,
+        "isExpression_isOperator": isExpression_isOperator,
+        "isExpression_type": isExpression_type,
+        "isExpression_notOperator": isExpression_notOperator,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.label) {
+      return {
+        "label_label": label_label,
+        "label_colon": label_colon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.mapLiteralEntry) {
+      return {
+        "mapLiteralEntry_key": mapLiteralEntry_key,
+        "mapLiteralEntry_separator": mapLiteralEntry_separator,
+        "mapLiteralEntry_value": mapLiteralEntry_value,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.methodInvocation) {
+      return {
+        "methodInvocation_methodName": methodInvocation_methodName,
+        "methodInvocation_operator": methodInvocation_operator,
+        "methodInvocation_target": methodInvocation_target,
+        "invocationExpression_invokeType": invocationExpression_invokeType,
+        "invocationExpression_typeArguments":
+            invocationExpression_typeArguments,
+        "expression_type": expression_type,
+        "invocationExpression_arguments": invocationExpression_arguments,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.namedExpression) {
+      return {
+        "namedExpression_expression": namedExpression_expression,
+        "namedExpression_name": namedExpression_name,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.parenthesizedExpression) {
+      return {
+        "parenthesizedExpression_expression":
+            parenthesizedExpression_expression,
+        "parenthesizedExpression_leftParenthesis":
+            parenthesizedExpression_leftParenthesis,
+        "parenthesizedExpression_rightParenthesis":
+            parenthesizedExpression_rightParenthesis,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.postfixExpression) {
+      return {
+        "postfixExpression_operand": postfixExpression_operand,
+        "postfixExpression_element": postfixExpression_element,
+        "postfixExpression_operator": postfixExpression_operator,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.prefixedIdentifier) {
+      return {
+        "prefixedIdentifier_identifier": prefixedIdentifier_identifier,
+        "prefixedIdentifier_period": prefixedIdentifier_period,
+        "prefixedIdentifier_prefix": prefixedIdentifier_prefix,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.prefixExpression) {
+      return {
+        "prefixExpression_operand": prefixExpression_operand,
+        "prefixExpression_element": prefixExpression_element,
+        "prefixExpression_operator": prefixExpression_operator,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.propertyAccess) {
+      return {
+        "propertyAccess_propertyName": propertyAccess_propertyName,
+        "propertyAccess_operator": propertyAccess_operator,
+        "propertyAccess_target": propertyAccess_target,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.redirectingConstructorInvocation) {
+      return {
+        "redirectingConstructorInvocation_arguments":
+            redirectingConstructorInvocation_arguments,
+        "redirectingConstructorInvocation_element":
+            redirectingConstructorInvocation_element,
+        "redirectingConstructorInvocation_constructorName":
+            redirectingConstructorInvocation_constructorName,
+        "redirectingConstructorInvocation_period":
+            redirectingConstructorInvocation_period,
+        "redirectingConstructorInvocation_thisKeyword":
+            redirectingConstructorInvocation_thisKeyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.returnStatement) {
+      return {
+        "returnStatement_expression": returnStatement_expression,
+        "returnStatement_returnKeyword": returnStatement_returnKeyword,
+        "returnStatement_semicolon": returnStatement_semicolon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.spreadElement) {
+      return {
+        "spreadElement_expression": spreadElement_expression,
+        "spreadElement_spreadOperator": spreadElement_spreadOperator,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.superConstructorInvocation) {
+      return {
+        "superConstructorInvocation_arguments":
+            superConstructorInvocation_arguments,
+        "superConstructorInvocation_element":
+            superConstructorInvocation_element,
+        "superConstructorInvocation_constructorName":
+            superConstructorInvocation_constructorName,
+        "superConstructorInvocation_period": superConstructorInvocation_period,
+        "superConstructorInvocation_superKeyword":
+            superConstructorInvocation_superKeyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.throwExpression) {
+      return {
+        "throwExpression_expression": throwExpression_expression,
+        "throwExpression_throwKeyword": throwExpression_throwKeyword,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.typeName) {
+      return {
+        "typeName_name": typeName_name,
+        "typeName_question": typeName_question,
+        "typeName_typeArguments": typeName_typeArguments,
+        "typeName_type": typeName_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.variableDeclarationStatement) {
+      return {
+        "variableDeclarationStatement_variables":
+            variableDeclarationStatement_variables,
+        "variableDeclarationStatement_semicolon":
+            variableDeclarationStatement_semicolon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.whileStatement) {
+      return {
+        "whileStatement_body": whileStatement_body,
+        "whileStatement_leftParenthesis": whileStatement_leftParenthesis,
+        "whileStatement_condition": whileStatement_condition,
+        "whileStatement_rightParenthesis": whileStatement_rightParenthesis,
+        "whileStatement_whileKeyword": whileStatement_whileKeyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.yieldStatement) {
+      return {
+        "yieldStatement_expression": yieldStatement_expression,
+        "yieldStatement_yieldKeyword": yieldStatement_yieldKeyword,
+        "yieldStatement_star": yieldStatement_star,
+        "yieldStatement_semicolon": yieldStatement_semicolon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.booleanLiteral) {
+      return {
+        "booleanLiteral_literal": booleanLiteral_literal,
+        "booleanLiteral_value": booleanLiteral_value,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.doubleLiteral) {
+      return {
+        "doubleLiteral_literal": doubleLiteral_literal,
+        "doubleLiteral_value": doubleLiteral_value,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.emptyFunctionBody) {
+      return {
+        "emptyFunctionBody_semicolon": emptyFunctionBody_semicolon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.emptyStatement) {
+      return {
+        "emptyStatement_semicolon": emptyStatement_semicolon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.integerLiteral) {
+      return {
+        "integerLiteral_literal": integerLiteral_literal,
+        "integerLiteral_value": integerLiteral_value,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.interpolationString) {
+      return {
+        "interpolationString_token": interpolationString_token,
+        "interpolationString_value": interpolationString_value,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.nullLiteral) {
+      return {
+        "nullLiteral_literal": nullLiteral_literal,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.rethrowExpression) {
+      return {
+        "rethrowExpression_rethrowKeyword": rethrowExpression_rethrowKeyword,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.scriptTag) {
+      return {
+        "scriptTag_scriptTag": scriptTag_scriptTag,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.simpleIdentifier) {
+      return {
+        "simpleIdentifier_element": simpleIdentifier_element,
+        "simpleIdentifier_token": simpleIdentifier_token,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.simpleStringLiteral) {
+      return {
+        "simpleStringLiteral_token": simpleStringLiteral_token,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+        "simpleStringLiteral_value": simpleStringLiteral_value,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.superExpression) {
+      return {
+        "superExpression_superKeyword": superExpression_superKeyword,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.symbolLiteral) {
+      return {
+        "symbolLiteral_poundSign": symbolLiteral_poundSign,
+        "symbolLiteral_components": symbolLiteral_components,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.thisExpression) {
+      return {
+        "thisExpression_thisKeyword": thisExpression_thisKeyword,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.comment) {
+      return {
+        "comment_tokens": comment_tokens,
+        "comment_type": comment_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    throw StateError("Unexpected $kind");
+  }
+
+  @override
+  String toString() => convert.json.encode(toJson());
+}
+
+class LinkedNodeBundleBuilder extends Object
+    with _LinkedNodeBundleMixin
+    implements idl.LinkedNodeBundle {
+  LinkedNodeBuilder _node;
+  LinkedNodeReferenceBuilder _references;
+  UnlinkedTokensBuilder _tokens;
+
+  @override
+  LinkedNodeBuilder get node => _node;
+
+  void set node(LinkedNodeBuilder value) {
+    this._node = value;
+  }
+
+  @override
+  LinkedNodeReferenceBuilder get references => _references;
+
+  void set references(LinkedNodeReferenceBuilder value) {
+    this._references = value;
+  }
+
+  @override
+  UnlinkedTokensBuilder get tokens => _tokens;
+
+  void set tokens(UnlinkedTokensBuilder value) {
+    this._tokens = value;
+  }
+
+  LinkedNodeBundleBuilder(
+      {LinkedNodeBuilder node,
+      LinkedNodeReferenceBuilder references,
+      UnlinkedTokensBuilder tokens})
+      : _node = node,
+        _references = references,
+        _tokens = tokens;
+
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _node?.flushInformative();
+    _references?.flushInformative();
+    _tokens?.flushInformative();
+  }
+
+  /**
+   * Accumulate non-[informative] data into [signature].
+   */
+  void collectApiSignature(api_sig.ApiSignature signature) {
+    signature.addBool(this._tokens != null);
+    this._tokens?.collectApiSignature(signature);
+    signature.addBool(this._references != null);
+    this._references?.collectApiSignature(signature);
+    signature.addBool(this._node != null);
+    this._node?.collectApiSignature(signature);
+  }
+
+  List<int> toBuffer() {
+    fb.Builder fbBuilder = new fb.Builder();
+    return fbBuilder.finish(finish(fbBuilder), "LNBn");
+  }
+
+  fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_node;
+    fb.Offset offset_references;
+    fb.Offset offset_tokens;
+    if (_node != null) {
+      offset_node = _node.finish(fbBuilder);
+    }
+    if (_references != null) {
+      offset_references = _references.finish(fbBuilder);
+    }
+    if (_tokens != null) {
+      offset_tokens = _tokens.finish(fbBuilder);
+    }
+    fbBuilder.startTable();
+    if (offset_node != null) {
+      fbBuilder.addOffset(2, offset_node);
+    }
+    if (offset_references != null) {
+      fbBuilder.addOffset(1, offset_references);
+    }
+    if (offset_tokens != null) {
+      fbBuilder.addOffset(0, offset_tokens);
+    }
+    return fbBuilder.endTable();
+  }
+}
+
+idl.LinkedNodeBundle readLinkedNodeBundle(List<int> buffer) {
+  fb.BufferContext rootRef = new fb.BufferContext.fromBytes(buffer);
+  return const _LinkedNodeBundleReader().read(rootRef, 0);
+}
+
+class _LinkedNodeBundleReader extends fb.TableReader<_LinkedNodeBundleImpl> {
+  const _LinkedNodeBundleReader();
+
+  @override
+  _LinkedNodeBundleImpl createObject(fb.BufferContext bc, int offset) =>
+      new _LinkedNodeBundleImpl(bc, offset);
+}
+
+class _LinkedNodeBundleImpl extends Object
+    with _LinkedNodeBundleMixin
+    implements idl.LinkedNodeBundle {
+  final fb.BufferContext _bc;
+  final int _bcOffset;
+
+  _LinkedNodeBundleImpl(this._bc, this._bcOffset);
+
+  idl.LinkedNode _node;
+  idl.LinkedNodeReference _references;
+  idl.UnlinkedTokens _tokens;
+
+  @override
+  idl.LinkedNode get node {
+    _node ??= const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 2, null);
+    return _node;
+  }
+
+  @override
+  idl.LinkedNodeReference get references {
+    _references ??=
+        const _LinkedNodeReferenceReader().vTableGet(_bc, _bcOffset, 1, null);
+    return _references;
+  }
+
+  @override
+  idl.UnlinkedTokens get tokens {
+    _tokens ??=
+        const _UnlinkedTokensReader().vTableGet(_bc, _bcOffset, 0, null);
+    return _tokens;
+  }
+}
+
+abstract class _LinkedNodeBundleMixin implements idl.LinkedNodeBundle {
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> _result = <String, Object>{};
+    if (node != null) _result["node"] = node.toJson();
+    if (references != null) _result["references"] = references.toJson();
+    if (tokens != null) _result["tokens"] = tokens.toJson();
+    return _result;
+  }
+
+  @override
+  Map<String, Object> toMap() => {
+        "node": node,
+        "references": references,
+        "tokens": tokens,
+      };
+
+  @override
+  String toString() => convert.json.encode(toJson());
+}
+
+class LinkedNodeReferenceBuilder extends Object
+    with _LinkedNodeReferenceMixin
+    implements idl.LinkedNodeReference {
+  List<String> _name;
+  List<int> _parent;
+
+  @override
+  List<String> get name => _name ??= <String>[];
+
+  void set name(List<String> value) {
+    this._name = value;
+  }
+
+  @override
+  List<int> get parent => _parent ??= <int>[];
+
+  void set parent(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._parent = value;
+  }
+
+  LinkedNodeReferenceBuilder({List<String> name, List<int> parent})
+      : _name = name,
+        _parent = parent;
+
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {}
+
+  /**
+   * Accumulate non-[informative] data into [signature].
+   */
+  void collectApiSignature(api_sig.ApiSignature signature) {
+    if (this._parent == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._parent.length);
+      for (var x in this._parent) {
+        signature.addInt(x);
+      }
+    }
+    if (this._name == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._name.length);
+      for (var x in this._name) {
+        signature.addString(x);
+      }
+    }
+  }
+
+  fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_name;
+    fb.Offset offset_parent;
+    if (!(_name == null || _name.isEmpty)) {
+      offset_name = fbBuilder
+          .writeList(_name.map((b) => fbBuilder.writeString(b)).toList());
+    }
+    if (!(_parent == null || _parent.isEmpty)) {
+      offset_parent = fbBuilder.writeListUint32(_parent);
+    }
+    fbBuilder.startTable();
+    if (offset_name != null) {
+      fbBuilder.addOffset(1, offset_name);
+    }
+    if (offset_parent != null) {
+      fbBuilder.addOffset(0, offset_parent);
+    }
+    return fbBuilder.endTable();
+  }
+}
+
+class _LinkedNodeReferenceReader
+    extends fb.TableReader<_LinkedNodeReferenceImpl> {
+  const _LinkedNodeReferenceReader();
+
+  @override
+  _LinkedNodeReferenceImpl createObject(fb.BufferContext bc, int offset) =>
+      new _LinkedNodeReferenceImpl(bc, offset);
+}
+
+class _LinkedNodeReferenceImpl extends Object
+    with _LinkedNodeReferenceMixin
+    implements idl.LinkedNodeReference {
+  final fb.BufferContext _bc;
+  final int _bcOffset;
+
+  _LinkedNodeReferenceImpl(this._bc, this._bcOffset);
+
+  List<String> _name;
+  List<int> _parent;
+
+  @override
+  List<String> get name {
+    _name ??= const fb.ListReader<String>(const fb.StringReader())
+        .vTableGet(_bc, _bcOffset, 1, const <String>[]);
+    return _name;
+  }
+
+  @override
+  List<int> get parent {
+    _parent ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 0, const <int>[]);
+    return _parent;
+  }
+}
+
+abstract class _LinkedNodeReferenceMixin implements idl.LinkedNodeReference {
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> _result = <String, Object>{};
+    if (name.isNotEmpty) _result["name"] = name;
+    if (parent.isNotEmpty) _result["parent"] = parent;
+    return _result;
+  }
+
+  @override
+  Map<String, Object> toMap() => {
+        "name": name,
+        "parent": parent,
+      };
+
+  @override
+  String toString() => convert.json.encode(toJson());
+}
+
+class LinkedNodeTypeBuilder extends Object
+    with _LinkedNodeTypeMixin
+    implements idl.LinkedNodeType {
+  List<int> _functionFormalParameters;
+  LinkedNodeTypeBuilder _functionReturnType;
+  List<int> _functionTypeParameters;
+  int _interfaceClass;
+  List<LinkedNodeTypeBuilder> _interfaceTypeArguments;
+  idl.LinkedNodeTypeKind _kind;
+  int _typeParameterParameter;
+
+  @override
+  List<int> get functionFormalParameters =>
+      _functionFormalParameters ??= <int>[];
+
+  /// References to [LinkedNodeReference].
+  void set functionFormalParameters(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._functionFormalParameters = value;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get functionReturnType => _functionReturnType;
+
+  void set functionReturnType(LinkedNodeTypeBuilder value) {
+    this._functionReturnType = value;
+  }
+
+  @override
+  List<int> get functionTypeParameters => _functionTypeParameters ??= <int>[];
+
+  /// References to [LinkedNodeReference].
+  void set functionTypeParameters(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._functionTypeParameters = value;
+  }
+
+  @override
+  int get interfaceClass => _interfaceClass ??= 0;
+
+  /// Reference to a [LinkedNodeReference].
+  void set interfaceClass(int value) {
+    assert(value == null || value >= 0);
+    this._interfaceClass = value;
+  }
+
+  @override
+  List<LinkedNodeTypeBuilder> get interfaceTypeArguments =>
+      _interfaceTypeArguments ??= <LinkedNodeTypeBuilder>[];
+
+  void set interfaceTypeArguments(List<LinkedNodeTypeBuilder> value) {
+    this._interfaceTypeArguments = value;
+  }
+
+  @override
+  idl.LinkedNodeTypeKind get kind => _kind ??= idl.LinkedNodeTypeKind.bottom;
+
+  void set kind(idl.LinkedNodeTypeKind value) {
+    this._kind = value;
+  }
+
+  @override
+  int get typeParameterParameter => _typeParameterParameter ??= 0;
+
+  /// Reference to a [LinkedNodeReference].
+  void set typeParameterParameter(int value) {
+    assert(value == null || value >= 0);
+    this._typeParameterParameter = value;
+  }
+
+  LinkedNodeTypeBuilder(
+      {List<int> functionFormalParameters,
+      LinkedNodeTypeBuilder functionReturnType,
+      List<int> functionTypeParameters,
+      int interfaceClass,
+      List<LinkedNodeTypeBuilder> interfaceTypeArguments,
+      idl.LinkedNodeTypeKind kind,
+      int typeParameterParameter})
+      : _functionFormalParameters = functionFormalParameters,
+        _functionReturnType = functionReturnType,
+        _functionTypeParameters = functionTypeParameters,
+        _interfaceClass = interfaceClass,
+        _interfaceTypeArguments = interfaceTypeArguments,
+        _kind = kind,
+        _typeParameterParameter = typeParameterParameter;
+
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _functionReturnType?.flushInformative();
+    _interfaceTypeArguments?.forEach((b) => b.flushInformative());
+  }
+
+  /**
+   * Accumulate non-[informative] data into [signature].
+   */
+  void collectApiSignature(api_sig.ApiSignature signature) {
+    if (this._functionFormalParameters == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._functionFormalParameters.length);
+      for (var x in this._functionFormalParameters) {
+        signature.addInt(x);
+      }
+    }
+    signature.addBool(this._functionReturnType != null);
+    this._functionReturnType?.collectApiSignature(signature);
+    if (this._functionTypeParameters == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._functionTypeParameters.length);
+      for (var x in this._functionTypeParameters) {
+        signature.addInt(x);
+      }
+    }
+    signature.addInt(this._interfaceClass ?? 0);
+    if (this._interfaceTypeArguments == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._interfaceTypeArguments.length);
+      for (var x in this._interfaceTypeArguments) {
+        x?.collectApiSignature(signature);
+      }
+    }
+    signature.addInt(this._kind == null ? 0 : this._kind.index);
+    signature.addInt(this._typeParameterParameter ?? 0);
+  }
+
+  fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_functionFormalParameters;
+    fb.Offset offset_functionReturnType;
+    fb.Offset offset_functionTypeParameters;
+    fb.Offset offset_interfaceTypeArguments;
+    if (!(_functionFormalParameters == null ||
+        _functionFormalParameters.isEmpty)) {
+      offset_functionFormalParameters =
+          fbBuilder.writeListUint32(_functionFormalParameters);
+    }
+    if (_functionReturnType != null) {
+      offset_functionReturnType = _functionReturnType.finish(fbBuilder);
+    }
+    if (!(_functionTypeParameters == null || _functionTypeParameters.isEmpty)) {
+      offset_functionTypeParameters =
+          fbBuilder.writeListUint32(_functionTypeParameters);
+    }
+    if (!(_interfaceTypeArguments == null || _interfaceTypeArguments.isEmpty)) {
+      offset_interfaceTypeArguments = fbBuilder.writeList(
+          _interfaceTypeArguments.map((b) => b.finish(fbBuilder)).toList());
+    }
+    fbBuilder.startTable();
+    if (offset_functionFormalParameters != null) {
+      fbBuilder.addOffset(0, offset_functionFormalParameters);
+    }
+    if (offset_functionReturnType != null) {
+      fbBuilder.addOffset(1, offset_functionReturnType);
+    }
+    if (offset_functionTypeParameters != null) {
+      fbBuilder.addOffset(2, offset_functionTypeParameters);
+    }
+    if (_interfaceClass != null && _interfaceClass != 0) {
+      fbBuilder.addUint32(3, _interfaceClass);
+    }
+    if (offset_interfaceTypeArguments != null) {
+      fbBuilder.addOffset(4, offset_interfaceTypeArguments);
+    }
+    if (_kind != null && _kind != idl.LinkedNodeTypeKind.bottom) {
+      fbBuilder.addUint8(5, _kind.index);
+    }
+    if (_typeParameterParameter != null && _typeParameterParameter != 0) {
+      fbBuilder.addUint32(6, _typeParameterParameter);
+    }
+    return fbBuilder.endTable();
+  }
+}
+
+class _LinkedNodeTypeReader extends fb.TableReader<_LinkedNodeTypeImpl> {
+  const _LinkedNodeTypeReader();
+
+  @override
+  _LinkedNodeTypeImpl createObject(fb.BufferContext bc, int offset) =>
+      new _LinkedNodeTypeImpl(bc, offset);
+}
+
+class _LinkedNodeTypeImpl extends Object
+    with _LinkedNodeTypeMixin
+    implements idl.LinkedNodeType {
+  final fb.BufferContext _bc;
+  final int _bcOffset;
+
+  _LinkedNodeTypeImpl(this._bc, this._bcOffset);
+
+  List<int> _functionFormalParameters;
+  idl.LinkedNodeType _functionReturnType;
+  List<int> _functionTypeParameters;
+  int _interfaceClass;
+  List<idl.LinkedNodeType> _interfaceTypeArguments;
+  idl.LinkedNodeTypeKind _kind;
+  int _typeParameterParameter;
+
+  @override
+  List<int> get functionFormalParameters {
+    _functionFormalParameters ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 0, const <int>[]);
+    return _functionFormalParameters;
+  }
+
+  @override
+  idl.LinkedNodeType get functionReturnType {
+    _functionReturnType ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 1, null);
+    return _functionReturnType;
+  }
+
+  @override
+  List<int> get functionTypeParameters {
+    _functionTypeParameters ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 2, const <int>[]);
+    return _functionTypeParameters;
+  }
+
+  @override
+  int get interfaceClass {
+    _interfaceClass ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 3, 0);
+    return _interfaceClass;
+  }
+
+  @override
+  List<idl.LinkedNodeType> get interfaceTypeArguments {
+    _interfaceTypeArguments ??=
+        const fb.ListReader<idl.LinkedNodeType>(const _LinkedNodeTypeReader())
+            .vTableGet(_bc, _bcOffset, 4, const <idl.LinkedNodeType>[]);
+    return _interfaceTypeArguments;
+  }
+
+  @override
+  idl.LinkedNodeTypeKind get kind {
+    _kind ??= const _LinkedNodeTypeKindReader()
+        .vTableGet(_bc, _bcOffset, 5, idl.LinkedNodeTypeKind.bottom);
+    return _kind;
+  }
+
+  @override
+  int get typeParameterParameter {
+    _typeParameterParameter ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 6, 0);
+    return _typeParameterParameter;
+  }
+}
+
+abstract class _LinkedNodeTypeMixin implements idl.LinkedNodeType {
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> _result = <String, Object>{};
+    if (functionFormalParameters.isNotEmpty)
+      _result["functionFormalParameters"] = functionFormalParameters;
+    if (functionReturnType != null)
+      _result["functionReturnType"] = functionReturnType.toJson();
+    if (functionTypeParameters.isNotEmpty)
+      _result["functionTypeParameters"] = functionTypeParameters;
+    if (interfaceClass != 0) _result["interfaceClass"] = interfaceClass;
+    if (interfaceTypeArguments.isNotEmpty)
+      _result["interfaceTypeArguments"] =
+          interfaceTypeArguments.map((_value) => _value.toJson()).toList();
+    if (kind != idl.LinkedNodeTypeKind.bottom)
+      _result["kind"] = kind.toString().split('.')[1];
+    if (typeParameterParameter != 0)
+      _result["typeParameterParameter"] = typeParameterParameter;
+    return _result;
+  }
+
+  @override
+  Map<String, Object> toMap() => {
+        "functionFormalParameters": functionFormalParameters,
+        "functionReturnType": functionReturnType,
+        "functionTypeParameters": functionTypeParameters,
+        "interfaceClass": interfaceClass,
+        "interfaceTypeArguments": interfaceTypeArguments,
+        "kind": kind,
+        "typeParameterParameter": typeParameterParameter,
+      };
+
+  @override
+  String toString() => convert.json.encode(toJson());
+}
+
 class LinkedReferenceBuilder extends Object
     with _LinkedReferenceMixin
     implements idl.LinkedReference {
@@ -11363,6 +25102,403 @@
   String toString() => convert.json.encode(toJson());
 }
 
+class UnlinkedTokensBuilder extends Object
+    with _UnlinkedTokensMixin
+    implements idl.UnlinkedTokens {
+  List<int> _endGroup;
+  List<bool> _isSynthetic;
+  List<idl.UnlinkedTokenKind> _kind;
+  List<int> _length;
+  List<String> _lexeme;
+  List<int> _next;
+  List<int> _offset;
+  List<int> _precedingComment;
+  List<idl.UnlinkedTokenType> _type;
+
+  @override
+  List<int> get endGroup => _endGroup ??= <int>[];
+
+  /// The token that corresponds to this token, or `0` if this token is not
+  /// the first of a pair of matching tokens (such as parentheses).
+  void set endGroup(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._endGroup = value;
+  }
+
+  @override
+  List<bool> get isSynthetic => _isSynthetic ??= <bool>[];
+
+  /// Return `true` if this token is a synthetic token. A synthetic token is a
+  /// token that was introduced by the parser in order to recover from an error
+  /// in the code.
+  void set isSynthetic(List<bool> value) {
+    this._isSynthetic = value;
+  }
+
+  @override
+  List<idl.UnlinkedTokenKind> get kind => _kind ??= <idl.UnlinkedTokenKind>[];
+
+  void set kind(List<idl.UnlinkedTokenKind> value) {
+    this._kind = value;
+  }
+
+  @override
+  List<int> get length => _length ??= <int>[];
+
+  void set length(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._length = value;
+  }
+
+  @override
+  List<String> get lexeme => _lexeme ??= <String>[];
+
+  void set lexeme(List<String> value) {
+    this._lexeme = value;
+  }
+
+  @override
+  List<int> get next => _next ??= <int>[];
+
+  /// The next token in the token stream, `0` for [UnlinkedTokenType.EOF] or
+  /// the last comment token.
+  void set next(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._next = value;
+  }
+
+  @override
+  List<int> get offset => _offset ??= <int>[];
+
+  void set offset(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._offset = value;
+  }
+
+  @override
+  List<int> get precedingComment => _precedingComment ??= <int>[];
+
+  /// The first comment token in the list of comments that precede this token,
+  /// or `0` if there are no comments preceding this token. Additional comments
+  /// can be reached by following the token stream using [next] until `0` is
+  /// reached.
+  void set precedingComment(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._precedingComment = value;
+  }
+
+  @override
+  List<idl.UnlinkedTokenType> get type => _type ??= <idl.UnlinkedTokenType>[];
+
+  void set type(List<idl.UnlinkedTokenType> value) {
+    this._type = value;
+  }
+
+  UnlinkedTokensBuilder(
+      {List<int> endGroup,
+      List<bool> isSynthetic,
+      List<idl.UnlinkedTokenKind> kind,
+      List<int> length,
+      List<String> lexeme,
+      List<int> next,
+      List<int> offset,
+      List<int> precedingComment,
+      List<idl.UnlinkedTokenType> type})
+      : _endGroup = endGroup,
+        _isSynthetic = isSynthetic,
+        _kind = kind,
+        _length = length,
+        _lexeme = lexeme,
+        _next = next,
+        _offset = offset,
+        _precedingComment = precedingComment,
+        _type = type;
+
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {}
+
+  /**
+   * Accumulate non-[informative] data into [signature].
+   */
+  void collectApiSignature(api_sig.ApiSignature signature) {
+    if (this._endGroup == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._endGroup.length);
+      for (var x in this._endGroup) {
+        signature.addInt(x);
+      }
+    }
+    if (this._isSynthetic == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._isSynthetic.length);
+      for (var x in this._isSynthetic) {
+        signature.addBool(x);
+      }
+    }
+    if (this._kind == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._kind.length);
+      for (var x in this._kind) {
+        signature.addInt(x.index);
+      }
+    }
+    if (this._length == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._length.length);
+      for (var x in this._length) {
+        signature.addInt(x);
+      }
+    }
+    if (this._lexeme == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._lexeme.length);
+      for (var x in this._lexeme) {
+        signature.addString(x);
+      }
+    }
+    if (this._next == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._next.length);
+      for (var x in this._next) {
+        signature.addInt(x);
+      }
+    }
+    if (this._offset == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._offset.length);
+      for (var x in this._offset) {
+        signature.addInt(x);
+      }
+    }
+    if (this._precedingComment == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._precedingComment.length);
+      for (var x in this._precedingComment) {
+        signature.addInt(x);
+      }
+    }
+    if (this._type == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._type.length);
+      for (var x in this._type) {
+        signature.addInt(x.index);
+      }
+    }
+  }
+
+  fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_endGroup;
+    fb.Offset offset_isSynthetic;
+    fb.Offset offset_kind;
+    fb.Offset offset_length;
+    fb.Offset offset_lexeme;
+    fb.Offset offset_next;
+    fb.Offset offset_offset;
+    fb.Offset offset_precedingComment;
+    fb.Offset offset_type;
+    if (!(_endGroup == null || _endGroup.isEmpty)) {
+      offset_endGroup = fbBuilder.writeListUint32(_endGroup);
+    }
+    if (!(_isSynthetic == null || _isSynthetic.isEmpty)) {
+      offset_isSynthetic = fbBuilder.writeListBool(_isSynthetic);
+    }
+    if (!(_kind == null || _kind.isEmpty)) {
+      offset_kind =
+          fbBuilder.writeListUint8(_kind.map((b) => b.index).toList());
+    }
+    if (!(_length == null || _length.isEmpty)) {
+      offset_length = fbBuilder.writeListUint32(_length);
+    }
+    if (!(_lexeme == null || _lexeme.isEmpty)) {
+      offset_lexeme = fbBuilder
+          .writeList(_lexeme.map((b) => fbBuilder.writeString(b)).toList());
+    }
+    if (!(_next == null || _next.isEmpty)) {
+      offset_next = fbBuilder.writeListUint32(_next);
+    }
+    if (!(_offset == null || _offset.isEmpty)) {
+      offset_offset = fbBuilder.writeListUint32(_offset);
+    }
+    if (!(_precedingComment == null || _precedingComment.isEmpty)) {
+      offset_precedingComment = fbBuilder.writeListUint32(_precedingComment);
+    }
+    if (!(_type == null || _type.isEmpty)) {
+      offset_type =
+          fbBuilder.writeListUint8(_type.map((b) => b.index).toList());
+    }
+    fbBuilder.startTable();
+    if (offset_endGroup != null) {
+      fbBuilder.addOffset(0, offset_endGroup);
+    }
+    if (offset_isSynthetic != null) {
+      fbBuilder.addOffset(1, offset_isSynthetic);
+    }
+    if (offset_kind != null) {
+      fbBuilder.addOffset(2, offset_kind);
+    }
+    if (offset_length != null) {
+      fbBuilder.addOffset(3, offset_length);
+    }
+    if (offset_lexeme != null) {
+      fbBuilder.addOffset(4, offset_lexeme);
+    }
+    if (offset_next != null) {
+      fbBuilder.addOffset(5, offset_next);
+    }
+    if (offset_offset != null) {
+      fbBuilder.addOffset(6, offset_offset);
+    }
+    if (offset_precedingComment != null) {
+      fbBuilder.addOffset(7, offset_precedingComment);
+    }
+    if (offset_type != null) {
+      fbBuilder.addOffset(8, offset_type);
+    }
+    return fbBuilder.endTable();
+  }
+}
+
+class _UnlinkedTokensReader extends fb.TableReader<_UnlinkedTokensImpl> {
+  const _UnlinkedTokensReader();
+
+  @override
+  _UnlinkedTokensImpl createObject(fb.BufferContext bc, int offset) =>
+      new _UnlinkedTokensImpl(bc, offset);
+}
+
+class _UnlinkedTokensImpl extends Object
+    with _UnlinkedTokensMixin
+    implements idl.UnlinkedTokens {
+  final fb.BufferContext _bc;
+  final int _bcOffset;
+
+  _UnlinkedTokensImpl(this._bc, this._bcOffset);
+
+  List<int> _endGroup;
+  List<bool> _isSynthetic;
+  List<idl.UnlinkedTokenKind> _kind;
+  List<int> _length;
+  List<String> _lexeme;
+  List<int> _next;
+  List<int> _offset;
+  List<int> _precedingComment;
+  List<idl.UnlinkedTokenType> _type;
+
+  @override
+  List<int> get endGroup {
+    _endGroup ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 0, const <int>[]);
+    return _endGroup;
+  }
+
+  @override
+  List<bool> get isSynthetic {
+    _isSynthetic ??=
+        const fb.BoolListReader().vTableGet(_bc, _bcOffset, 1, const <bool>[]);
+    return _isSynthetic;
+  }
+
+  @override
+  List<idl.UnlinkedTokenKind> get kind {
+    _kind ??= const fb.ListReader<idl.UnlinkedTokenKind>(
+            const _UnlinkedTokenKindReader())
+        .vTableGet(_bc, _bcOffset, 2, const <idl.UnlinkedTokenKind>[]);
+    return _kind;
+  }
+
+  @override
+  List<int> get length {
+    _length ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 3, const <int>[]);
+    return _length;
+  }
+
+  @override
+  List<String> get lexeme {
+    _lexeme ??= const fb.ListReader<String>(const fb.StringReader())
+        .vTableGet(_bc, _bcOffset, 4, const <String>[]);
+    return _lexeme;
+  }
+
+  @override
+  List<int> get next {
+    _next ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 5, const <int>[]);
+    return _next;
+  }
+
+  @override
+  List<int> get offset {
+    _offset ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 6, const <int>[]);
+    return _offset;
+  }
+
+  @override
+  List<int> get precedingComment {
+    _precedingComment ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 7, const <int>[]);
+    return _precedingComment;
+  }
+
+  @override
+  List<idl.UnlinkedTokenType> get type {
+    _type ??= const fb.ListReader<idl.UnlinkedTokenType>(
+            const _UnlinkedTokenTypeReader())
+        .vTableGet(_bc, _bcOffset, 8, const <idl.UnlinkedTokenType>[]);
+    return _type;
+  }
+}
+
+abstract class _UnlinkedTokensMixin implements idl.UnlinkedTokens {
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> _result = <String, Object>{};
+    if (endGroup.isNotEmpty) _result["endGroup"] = endGroup;
+    if (isSynthetic.isNotEmpty) _result["isSynthetic"] = isSynthetic;
+    if (kind.isNotEmpty)
+      _result["kind"] =
+          kind.map((_value) => _value.toString().split('.')[1]).toList();
+    if (length.isNotEmpty) _result["length"] = length;
+    if (lexeme.isNotEmpty) _result["lexeme"] = lexeme;
+    if (next.isNotEmpty) _result["next"] = next;
+    if (offset.isNotEmpty) _result["offset"] = offset;
+    if (precedingComment.isNotEmpty)
+      _result["precedingComment"] = precedingComment;
+    if (type.isNotEmpty)
+      _result["type"] =
+          type.map((_value) => _value.toString().split('.')[1]).toList();
+    return _result;
+  }
+
+  @override
+  Map<String, Object> toMap() => {
+        "endGroup": endGroup,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+        "length": length,
+        "lexeme": lexeme,
+        "next": next,
+        "offset": offset,
+        "precedingComment": precedingComment,
+        "type": type,
+      };
+
+  @override
+  String toString() => convert.json.encode(toJson());
+}
+
 class UnlinkedTypedefBuilder extends Object
     with _UnlinkedTypedefMixin
     implements idl.UnlinkedTypedef {
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 640b861..bb8bc6b 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -137,6 +137,274 @@
   unit
 }
 
+/// Types of comments.
+enum LinkedNodeCommentType : byte {
+  block,
+
+  documentation,
+
+  endOfLine
+}
+
+/// Kinds of formal parameters.
+enum LinkedNodeFormalParameterKind : byte {
+  required,
+
+  optionalPositional,
+
+  optionalNamed
+}
+
+/// Kinds of [LinkedNode].
+enum LinkedNodeKind : byte {
+  adjacentStrings,
+
+  annotation,
+
+  argumentList,
+
+  asExpression,
+
+  assertInitializer,
+
+  assertStatement,
+
+  assignmentExpression,
+
+  awaitExpression,
+
+  binaryExpression,
+
+  block,
+
+  blockFunctionBody,
+
+  booleanLiteral,
+
+  breakStatement,
+
+  cascadeExpression,
+
+  catchClause,
+
+  classDeclaration,
+
+  classTypeAlias,
+
+  comment,
+
+  compilationUnit,
+
+  conditionalExpression,
+
+  configuration,
+
+  constructorDeclaration,
+
+  constructorFieldInitializer,
+
+  constructorName,
+
+  continueStatement,
+
+  declaredIdentifier,
+
+  defaultFormalParameter,
+
+  doubleLiteral,
+
+  doStatement,
+
+  dottedName,
+
+  emptyFunctionBody,
+
+  emptyStatement,
+
+  enumConstantDeclaration,
+
+  enumDeclaration,
+
+  exportDirective,
+
+  expressionFunctionBody,
+
+  expressionStatement,
+
+  extendsClause,
+
+  fieldDeclaration,
+
+  fieldFormalParameter,
+
+  formalParameterList,
+
+  forEachPartsWithDeclaration,
+
+  forEachPartsWithIdentifier,
+
+  forElement,
+
+  forPartsWithDeclarations,
+
+  forPartsWithExpression,
+
+  forStatement,
+
+  functionDeclaration,
+
+  functionDeclarationStatement,
+
+  functionExpression,
+
+  functionExpressionInvocation,
+
+  functionTypeAlias,
+
+  functionTypedFormalParameter,
+
+  genericFunctionType,
+
+  genericTypeAlias,
+
+  hideCombinator,
+
+  ifElement,
+
+  ifStatement,
+
+  implementsClause,
+
+  importDirective,
+
+  instanceCreationExpression,
+
+  indexExpression,
+
+  integerLiteral,
+
+  interpolationExpression,
+
+  interpolationString,
+
+  isExpression,
+
+  label,
+
+  labeledStatement,
+
+  libraryDirective,
+
+  libraryIdentifier,
+
+  listLiteral,
+
+  mapLiteralEntry,
+
+  methodDeclaration,
+
+  methodInvocation,
+
+  mixinDeclaration,
+
+  namedExpression,
+
+  nullLiteral,
+
+  onClause,
+
+  parenthesizedExpression,
+
+  partDirective,
+
+  partOfDirective,
+
+  postfixExpression,
+
+  prefixExpression,
+
+  prefixedIdentifier,
+
+  propertyAccess,
+
+  redirectingConstructorInvocation,
+
+  rethrowExpression,
+
+  returnStatement,
+
+  scriptTag,
+
+  setOrMapLiteral,
+
+  showCombinator,
+
+  simpleFormalParameter,
+
+  simpleIdentifier,
+
+  simpleStringLiteral,
+
+  spreadElement,
+
+  stringInterpolation,
+
+  superConstructorInvocation,
+
+  superExpression,
+
+  switchCase,
+
+  switchDefault,
+
+  switchStatement,
+
+  symbolLiteral,
+
+  thisExpression,
+
+  throwExpression,
+
+  topLevelVariableDeclaration,
+
+  tryStatement,
+
+  typeArgumentList,
+
+  typeName,
+
+  typeParameter,
+
+  typeParameterList,
+
+  variableDeclaration,
+
+  variableDeclarationList,
+
+  variableDeclarationStatement,
+
+  whileStatement,
+
+  withClause,
+
+  yieldStatement
+}
+
+/// Kinds of [LinkedNodeType]s.
+enum LinkedNodeTypeKind : byte {
+  bottom,
+
+  dynamic_,
+
+  function,
+
+  interface,
+
+  typeParameter,
+
+  void_
+}
+
 /// Enum used to indicate the kind of entity referred to by a
 /// [LinkedReference].
 enum ReferenceKind : byte {
@@ -406,6 +674,8 @@
   /// [UnlinkedExpr.ints]), interpret them as key/value pairs, place them in a
   /// [Map], and push the result back onto the stack.  The two type parameters
   /// for the [Map] are implicitly `dynamic`.
+  ///
+  /// To be replaced with [makeUntypedSetOrMap] for unified collections.
   makeUntypedMap,
 
   /// Pop the top n values from the stack (where n is obtained from
@@ -418,6 +688,10 @@
   /// [UnlinkedExpr.ints]), interpret them as key/value pairs, place them in a
   /// [Map], and push the result back onto the stack.  The two type parameters
   /// for the [Map] are obtained from [UnlinkedExpr.references].
+  ///
+  /// To be replaced with [makeTypedMap2] for unified collections. This is not
+  /// forwards compatible with [makeTypedMap2] because it expects
+  /// [CollectionElement]s instead of pairs of [Expression]s.
   makeTypedMap,
 
   /// Pop the top 2 values from the stack, evaluate `v1 == v2`, and push the
@@ -677,7 +951,26 @@
   /// [UnlinkedExpr.ints]), place them in a [Set], and push the result back
   /// onto the stack.  The type parameter for the [Set] is obtained from
   /// [UnlinkedExpr.references].
-  makeTypedSet
+  makeTypedSet,
+
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), which should be [CollectionElement]s, place them in
+  /// a [SetOrMap], and push the result back onto the stack.
+  makeUntypedSetOrMap,
+
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), which should be [CollectionElement]s, place them in
+  /// a [Map], and push the result back onto the stack. The two type parameters
+  /// for the [Map] are obtained from [UnlinkedExpr.references].
+  ///
+  /// To replace [makeTypedMap] for unified collections. This is not backwards
+  /// compatible with [makeTypedMap] because it expects [CollectionElement]s
+  /// instead of pairs of [Expression]s.
+  makeTypedMap2,
+
+  /// Pop the top 2 values from the stack, place them in a [MapLiteralEntry],
+  /// and push the result back onto the stack.
+  makeMapLiteralEntry
 }
 
 /// Enum used to indicate the kind of a parameter.
@@ -692,6 +985,292 @@
   named
 }
 
+/// TODO(scheglov) document
+enum UnlinkedTokenKind : byte {
+  nothing,
+
+  comment,
+
+  keyword,
+
+  simple,
+
+  string
+}
+
+/// TODO(scheglov) document
+enum UnlinkedTokenType : byte {
+  NOTHING,
+
+  ABSTRACT,
+
+  AMPERSAND,
+
+  AMPERSAND_AMPERSAND,
+
+  AMPERSAND_EQ,
+
+  AS,
+
+  ASSERT,
+
+  ASYNC,
+
+  AT,
+
+  AWAIT,
+
+  BACKPING,
+
+  BACKSLASH,
+
+  BANG,
+
+  BANG_EQ,
+
+  BAR,
+
+  BAR_BAR,
+
+  BAR_EQ,
+
+  BREAK,
+
+  CARET,
+
+  CARET_EQ,
+
+  CASE,
+
+  CATCH,
+
+  CLASS,
+
+  CLOSE_CURLY_BRACKET,
+
+  CLOSE_PAREN,
+
+  CLOSE_SQUARE_BRACKET,
+
+  COLON,
+
+  COMMA,
+
+  CONST,
+
+  CONTINUE,
+
+  COVARIANT,
+
+  DEFAULT,
+
+  DEFERRED,
+
+  DO,
+
+  DOUBLE,
+
+  DYNAMIC,
+
+  ELSE,
+
+  ENUM,
+
+  EOF,
+
+  EQ,
+
+  EQ_EQ,
+
+  EXPORT,
+
+  EXTENDS,
+
+  EXTERNAL,
+
+  FACTORY,
+
+  FALSE,
+
+  FINAL,
+
+  FINALLY,
+
+  FOR,
+
+  FUNCTION,
+
+  FUNCTION_KEYWORD,
+
+  GET,
+
+  GT,
+
+  GT_EQ,
+
+  GT_GT,
+
+  GT_GT_EQ,
+
+  HASH,
+
+  HEXADECIMAL,
+
+  HIDE,
+
+  IDENTIFIER,
+
+  IF,
+
+  IMPLEMENTS,
+
+  IMPORT,
+
+  IN,
+
+  INDEX,
+
+  INDEX_EQ,
+
+  INT,
+
+  INTERFACE,
+
+  IS,
+
+  LIBRARY,
+
+  LT,
+
+  LT_EQ,
+
+  LT_LT,
+
+  LT_LT_EQ,
+
+  MINUS,
+
+  MINUS_EQ,
+
+  MINUS_MINUS,
+
+  MIXIN,
+
+  MULTI_LINE_COMMENT,
+
+  NATIVE,
+
+  NEW,
+
+  NULL,
+
+  OF,
+
+  ON,
+
+  OPEN_CURLY_BRACKET,
+
+  OPEN_PAREN,
+
+  OPEN_SQUARE_BRACKET,
+
+  OPERATOR,
+
+  PART,
+
+  PATCH,
+
+  PERCENT,
+
+  PERCENT_EQ,
+
+  PERIOD,
+
+  PERIOD_PERIOD,
+
+  PERIOD_PERIOD_PERIOD,
+
+  PERIOD_PERIOD_PERIOD_QUESTION,
+
+  PLUS,
+
+  PLUS_EQ,
+
+  PLUS_PLUS,
+
+  QUESTION,
+
+  QUESTION_PERIOD,
+
+  QUESTION_QUESTION,
+
+  QUESTION_QUESTION_EQ,
+
+  RETHROW,
+
+  RETURN,
+
+  SCRIPT_TAG,
+
+  SEMICOLON,
+
+  SET,
+
+  SHOW,
+
+  SINGLE_LINE_COMMENT,
+
+  SLASH,
+
+  SLASH_EQ,
+
+  SOURCE,
+
+  STAR,
+
+  STAR_EQ,
+
+  STATIC,
+
+  STRING,
+
+  STRING_INTERPOLATION_EXPRESSION,
+
+  STRING_INTERPOLATION_IDENTIFIER,
+
+  SUPER,
+
+  SWITCH,
+
+  SYNC,
+
+  THIS,
+
+  THROW,
+
+  TILDE,
+
+  TILDE_SLASH,
+
+  TILDE_SLASH_EQ,
+
+  TRUE,
+
+  TRY,
+
+  TYPEDEF,
+
+  VAR,
+
+  VOID,
+
+  WHILE,
+
+  WITH,
+
+  YIELD
+}
+
 /// Information about the context of an exception in analysis driver.
 table AnalysisDriverExceptionContext {
   /// The exception string.
@@ -870,30 +1449,26 @@
 
 /// Information about a single declaration.
 table AvailableDeclaration {
-  docComplete:string (id: 0);
+  defaultArgumentListString:string (id: 0);
 
-  docSummary:string (id: 1);
+  defaultArgumentListTextRanges:[uint] (id: 1);
 
-  fieldMask:uint (id: 2);
+  docComplete:string (id: 2);
+
+  docSummary:string (id: 3);
+
+  fieldMask:uint (id: 4);
+
+  isAbstract:bool (id: 5);
+
+  isConst:bool (id: 6);
+
+  isDeprecated:bool (id: 7);
+
+  isFinal:bool (id: 8);
 
   /// The kind of the declaration.
-  kind:AvailableDeclarationKind (id: 3);
-
-  isAbstract:bool (id: 4);
-
-  isConst:bool (id: 5);
-
-  isDeprecated:bool (id: 6);
-
-  isFinal:bool (id: 7);
-
-  /// The first part of the declaration name, usually the only one, for example
-  /// the name of a class like `MyClass`, or a function like `myFunction`.
-  name:string (id: 8);
-
-  /// The second, optional, part of the declaration name.  For example enum
-  /// constants all have the same [name], but their own [name2].
-  name2:string (id: 9);
+  kind:AvailableDeclarationKind (id: 9);
 
   locationOffset:uint (id: 10);
 
@@ -901,23 +1476,31 @@
 
   locationStartLine:uint (id: 12);
 
-  parameterNames:[string] (id: 13);
+  /// The first part of the declaration name, usually the only one, for example
+  /// the name of a class like `MyClass`, or a function like `myFunction`.
+  name:string (id: 13);
 
-  parameters:string (id: 14);
+  /// The second, optional, part of the declaration name.  For example enum
+  /// constants all have the same [name], but their own [name2].
+  name2:string (id: 14);
 
-  parameterTypes:[string] (id: 15);
+  parameterNames:[string] (id: 15);
 
-  requiredParameterCount:uint (id: 16);
+  parameters:string (id: 16);
+
+  parameterTypes:[string] (id: 17);
 
   /// The partial list of relevance tags.  Not every declaration has one (for
   /// example, function do not currently), and not every declaration has to
   /// store one (for classes it can be computed when we know the library that
   /// includes this file).
-  relevanceTags:[string] (id: 17);
+  relevanceTags:[string] (id: 18);
 
-  returnType:string (id: 18);
+  requiredParameterCount:uint (id: 19);
 
-  typeParameters:string (id: 19);
+  returnType:string (id: 20);
+
+  typeParameters:string (id: 21);
 }
 
 /// Information about an available, even if not yet imported file.
@@ -1143,6 +1726,110 @@
   units:[LinkedUnit] (id: 3);
 }
 
+/// Information about a linked AST node.
+table LinkedNode {
+  variantField_2:[LinkedNode] (id: 2);
+
+  variantField_11:LinkedNode (id: 11);
+
+  variantField_4:[LinkedNode] (id: 4);
+
+  variantField_6:LinkedNode (id: 6);
+
+  variantField_15:uint (id: 15);
+
+  variantField_7:LinkedNode (id: 7);
+
+  variantField_8:LinkedNode (id: 8);
+
+  variantField_16:uint (id: 16);
+
+  variantField_17:uint (id: 17);
+
+  variantField_18:uint (id: 18);
+
+  variantField_19:uint (id: 19);
+
+  variantField_24:LinkedNodeType (id: 24);
+
+  variantField_27:bool (id: 27);
+
+  variantField_9:LinkedNode (id: 9);
+
+  variantField_12:LinkedNode (id: 12);
+
+  variantField_5:[LinkedNode] (id: 5);
+
+  variantField_13:LinkedNode (id: 13);
+
+  variantField_28:[uint] (id: 28);
+
+  variantField_29:LinkedNodeCommentType (id: 29);
+
+  variantField_3:[LinkedNode] (id: 3);
+
+  variantField_10:LinkedNode (id: 10);
+
+  variantField_21:double (id: 21);
+
+  variantField_25:LinkedNodeType (id: 25);
+
+  variantField_26:LinkedNodeFormalParameterKind (id: 26);
+
+  variantField_30:string (id: 30);
+
+  variantField_14:LinkedNode (id: 14);
+
+  isSynthetic:bool (id: 1);
+
+  kind:LinkedNodeKind (id: 0);
+
+  variantField_23:string (id: 23);
+
+  variantField_31:bool (id: 31);
+
+  variantField_20:string (id: 20);
+
+  variantField_22:string (id: 22);
+}
+
+/// TODO(scheglov) extend to support multiple libraries or remove
+table LinkedNodeBundle {
+  node:LinkedNode (id: 2);
+
+  references:LinkedNodeReference (id: 1);
+
+  tokens:UnlinkedTokens (id: 0);
+}
+
+/// Flattened tree of declarations referenced from [LinkedNode]s.
+table LinkedNodeReference {
+  name:[string] (id: 1);
+
+  parent:[uint] (id: 0);
+}
+
+/// Information about a Dart type.
+table LinkedNodeType {
+  /// References to [LinkedNodeReference].
+  functionFormalParameters:[uint] (id: 0);
+
+  functionReturnType:LinkedNodeType (id: 1);
+
+  /// References to [LinkedNodeReference].
+  functionTypeParameters:[uint] (id: 2);
+
+  /// Reference to a [LinkedNodeReference].
+  interfaceClass:uint (id: 3);
+
+  interfaceTypeArguments:[LinkedNodeType] (id: 4);
+
+  kind:LinkedNodeTypeKind (id: 5);
+
+  /// Reference to a [LinkedNodeReference].
+  typeParameterParameter:uint (id: 6);
+}
+
 /// Information about the resolution of an [UnlinkedReference].
 table LinkedReference {
   /// If this [LinkedReference] doesn't have an associated [UnlinkedReference],
@@ -1988,6 +2675,38 @@
   prefixReference:uint (id: 1);
 }
 
+/// TODO(scheglov) document
+table UnlinkedTokens {
+  /// The token that corresponds to this token, or `0` if this token is not
+  /// the first of a pair of matching tokens (such as parentheses).
+  endGroup:[uint] (id: 0);
+
+  /// Return `true` if this token is a synthetic token. A synthetic token is a
+  /// token that was introduced by the parser in order to recover from an error
+  /// in the code.
+  isSynthetic:[ubyte] (id: 1);
+
+  kind:[UnlinkedTokenKind] (id: 2);
+
+  length:[uint] (id: 3);
+
+  lexeme:[string] (id: 4);
+
+  /// The next token in the token stream, `0` for [UnlinkedTokenType.EOF] or
+  /// the last comment token.
+  next:[uint] (id: 5);
+
+  offset:[uint] (id: 6);
+
+  /// The first comment token in the list of comments that precede this token,
+  /// or `0` if there are no comments preceding this token. Additional comments
+  /// can be reached by following the token stream using [next] until `0` is
+  /// reached.
+  precedingComment:[uint] (id: 7);
+
+  type:[UnlinkedTokenType] (id: 8);
+}
+
 /// Unlinked summary information about a typedef declaration.
 table UnlinkedTypedef {
   /// Annotations for this typedef.
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index 6e3a1d8..b25b830 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -14,6 +14,8 @@
 ///   a default value of zero.
 /// - Getters of type String never return null, and have a default value of ''.
 /// - Getters of type bool never return null, and have a default value of false.
+/// - Getters of type double never return null, and have a default value of
+///   `0.0`.
 /// - Getters whose type is an enum never return null, and have a default value
 ///   of the first value declared in the enum.
 ///
@@ -40,7 +42,7 @@
 import 'package:analyzer/dart/element/element.dart';
 
 import 'base.dart' as base;
-import 'base.dart' show Id, TopLevel;
+import 'base.dart' show Id, TopLevel, Variant, VariantId;
 import 'format.dart' as generated;
 
 /// Annotation describing information which is not part of Dart semantics; in
@@ -286,39 +288,35 @@
 /// Information about a single declaration.
 abstract class AvailableDeclaration extends base.SummaryClass {
   @Id(0)
-  String get docComplete;
+  String get defaultArgumentListString;
 
   @Id(1)
-  String get docSummary;
+  List<int> get defaultArgumentListTextRanges;
 
   @Id(2)
-  int get fieldMask;
+  String get docComplete;
 
-  /// The kind of the declaration.
   @Id(3)
-  AvailableDeclarationKind get kind;
+  String get docSummary;
 
   @Id(4)
-  bool get isAbstract;
+  int get fieldMask;
 
   @Id(5)
-  bool get isConst;
+  bool get isAbstract;
 
   @Id(6)
-  bool get isDeprecated;
+  bool get isConst;
 
   @Id(7)
+  bool get isDeprecated;
+
+  @Id(8)
   bool get isFinal;
 
-  /// The first part of the declaration name, usually the only one, for example
-  /// the name of a class like `MyClass`, or a function like `myFunction`.
-  @Id(8)
-  String get name;
-
-  /// The second, optional, part of the declaration name.  For example enum
-  /// constants all have the same [name], but their own [name2].
+  /// The kind of the declaration.
   @Id(9)
-  String get name2;
+  AvailableDeclarationKind get kind;
 
   @Id(10)
   int get locationOffset;
@@ -329,29 +327,39 @@
   @Id(12)
   int get locationStartLine;
 
+  /// The first part of the declaration name, usually the only one, for example
+  /// the name of a class like `MyClass`, or a function like `myFunction`.
   @Id(13)
-  List<String> get parameterNames;
+  String get name;
 
+  /// The second, optional, part of the declaration name.  For example enum
+  /// constants all have the same [name], but their own [name2].
   @Id(14)
-  String get parameters;
+  String get name2;
 
   @Id(15)
-  List<String> get parameterTypes;
+  List<String> get parameterNames;
 
   @Id(16)
-  int get requiredParameterCount;
+  String get parameters;
+
+  @Id(17)
+  List<String> get parameterTypes;
 
   /// The partial list of relevance tags.  Not every declaration has one (for
   /// example, function do not currently), and not every declaration has to
   /// store one (for classes it can be computed when we know the library that
   /// includes this file).
-  @Id(17)
+  @Id(18)
   List<String> get relevanceTags;
 
-  @Id(18)
+  @Id(19)
+  int get requiredParameterCount;
+
+  @Id(20)
   String get returnType;
 
-  @Id(19)
+  @Id(21)
   String get typeParameters;
 }
 
@@ -743,6 +751,1646 @@
   List<LinkedUnit> get units;
 }
 
+/// Information about a linked AST node.
+@Variant('kind')
+abstract class LinkedNode extends base.SummaryClass {
+  @VariantId(2, variant: LinkedNodeKind.adjacentStrings)
+  List<LinkedNode> get adjacentStrings_strings;
+
+  @VariantId(11, variantList: [
+    LinkedNodeKind.classDeclaration,
+    LinkedNodeKind.classTypeAlias,
+    LinkedNodeKind.constructorDeclaration,
+    LinkedNodeKind.declaredIdentifier,
+    LinkedNodeKind.enumDeclaration,
+    LinkedNodeKind.enumConstantDeclaration,
+    LinkedNodeKind.exportDirective,
+    LinkedNodeKind.fieldDeclaration,
+    LinkedNodeKind.functionDeclaration,
+    LinkedNodeKind.functionTypeAlias,
+    LinkedNodeKind.genericTypeAlias,
+    LinkedNodeKind.importDirective,
+    LinkedNodeKind.libraryDirective,
+    LinkedNodeKind.methodDeclaration,
+    LinkedNodeKind.mixinDeclaration,
+    LinkedNodeKind.partDirective,
+    LinkedNodeKind.partOfDirective,
+    LinkedNodeKind.topLevelVariableDeclaration,
+    LinkedNodeKind.typeParameter,
+    LinkedNodeKind.variableDeclaration,
+    LinkedNodeKind.variableDeclarationList,
+  ])
+  LinkedNode get annotatedNode_comment;
+
+  @VariantId(4, variantList: [
+    LinkedNodeKind.classDeclaration,
+    LinkedNodeKind.classTypeAlias,
+    LinkedNodeKind.constructorDeclaration,
+    LinkedNodeKind.declaredIdentifier,
+    LinkedNodeKind.enumDeclaration,
+    LinkedNodeKind.enumConstantDeclaration,
+    LinkedNodeKind.exportDirective,
+    LinkedNodeKind.fieldDeclaration,
+    LinkedNodeKind.functionDeclaration,
+    LinkedNodeKind.functionTypeAlias,
+    LinkedNodeKind.genericTypeAlias,
+    LinkedNodeKind.importDirective,
+    LinkedNodeKind.libraryDirective,
+    LinkedNodeKind.methodDeclaration,
+    LinkedNodeKind.mixinDeclaration,
+    LinkedNodeKind.partDirective,
+    LinkedNodeKind.partOfDirective,
+    LinkedNodeKind.topLevelVariableDeclaration,
+    LinkedNodeKind.typeParameter,
+    LinkedNodeKind.variableDeclaration,
+    LinkedNodeKind.variableDeclarationList,
+  ])
+  List<LinkedNode> get annotatedNode_metadata;
+
+  @VariantId(6, variant: LinkedNodeKind.annotation)
+  LinkedNode get annotation_arguments;
+
+  @VariantId(15, variant: LinkedNodeKind.annotation)
+  int get annotation_atSign;
+
+  @VariantId(7, variant: LinkedNodeKind.annotation)
+  LinkedNode get annotation_constructorName;
+
+  @VariantId(8, variant: LinkedNodeKind.annotation)
+  LinkedNode get annotation_name;
+
+  @VariantId(16, variant: LinkedNodeKind.annotation)
+  int get annotation_period;
+
+  @VariantId(2, variant: LinkedNodeKind.argumentList)
+  List<LinkedNode> get argumentList_arguments;
+
+  @VariantId(15, variant: LinkedNodeKind.argumentList)
+  int get argumentList_leftParenthesis;
+
+  @VariantId(16, variant: LinkedNodeKind.argumentList)
+  int get argumentList_rightParenthesis;
+
+  @VariantId(15, variant: LinkedNodeKind.asExpression)
+  int get asExpression_asOperator;
+
+  @VariantId(6, variant: LinkedNodeKind.asExpression)
+  LinkedNode get asExpression_expression;
+
+  @VariantId(7, variant: LinkedNodeKind.asExpression)
+  LinkedNode get asExpression_type;
+
+  @VariantId(15, variant: LinkedNodeKind.assertInitializer)
+  int get assertInitializer_assertKeyword;
+
+  @VariantId(16, variant: LinkedNodeKind.assertInitializer)
+  int get assertInitializer_comma;
+
+  @VariantId(6, variant: LinkedNodeKind.assertInitializer)
+  LinkedNode get assertInitializer_condition;
+
+  @VariantId(17, variant: LinkedNodeKind.assertInitializer)
+  int get assertInitializer_leftParenthesis;
+
+  @VariantId(7, variant: LinkedNodeKind.assertInitializer)
+  LinkedNode get assertInitializer_message;
+
+  @VariantId(18, variant: LinkedNodeKind.assertInitializer)
+  int get assertInitializer_rightParenthesis;
+
+  @VariantId(15, variant: LinkedNodeKind.assertStatement)
+  int get assertStatement_assertKeyword;
+
+  @VariantId(16, variant: LinkedNodeKind.assertStatement)
+  int get assertStatement_comma;
+
+  @VariantId(6, variant: LinkedNodeKind.assertStatement)
+  LinkedNode get assertStatement_condition;
+
+  @VariantId(17, variant: LinkedNodeKind.assertStatement)
+  int get assertStatement_leftParenthesis;
+
+  @VariantId(7, variant: LinkedNodeKind.assertStatement)
+  LinkedNode get assertStatement_message;
+
+  @VariantId(18, variant: LinkedNodeKind.assertStatement)
+  int get assertStatement_rightParenthesis;
+
+  @VariantId(19, variant: LinkedNodeKind.assertStatement)
+  int get assertStatement_semicolon;
+
+  @VariantId(15, variant: LinkedNodeKind.assignmentExpression)
+  int get assignmentExpression_element;
+
+  @VariantId(6, variant: LinkedNodeKind.assignmentExpression)
+  LinkedNode get assignmentExpression_leftHandSide;
+
+  @VariantId(16, variant: LinkedNodeKind.assignmentExpression)
+  int get assignmentExpression_operator;
+
+  @VariantId(7, variant: LinkedNodeKind.assignmentExpression)
+  LinkedNode get assignmentExpression_rightHandSide;
+
+  @VariantId(15, variant: LinkedNodeKind.awaitExpression)
+  int get awaitExpression_awaitKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.awaitExpression)
+  LinkedNode get awaitExpression_expression;
+
+  @VariantId(15, variant: LinkedNodeKind.binaryExpression)
+  int get binaryExpression_element;
+
+  @VariantId(24, variant: LinkedNodeKind.binaryExpression)
+  LinkedNodeType get binaryExpression_invokeType;
+
+  @VariantId(6, variant: LinkedNodeKind.binaryExpression)
+  LinkedNode get binaryExpression_leftOperand;
+
+  @VariantId(16, variant: LinkedNodeKind.binaryExpression)
+  int get binaryExpression_operator;
+
+  @VariantId(7, variant: LinkedNodeKind.binaryExpression)
+  LinkedNode get binaryExpression_rightOperand;
+
+  @VariantId(15, variant: LinkedNodeKind.block)
+  int get block_leftBracket;
+
+  @VariantId(16, variant: LinkedNodeKind.block)
+  int get block_rightBracket;
+
+  @VariantId(2, variant: LinkedNodeKind.block)
+  List<LinkedNode> get block_statements;
+
+  @VariantId(6, variant: LinkedNodeKind.blockFunctionBody)
+  LinkedNode get blockFunctionBody_block;
+
+  @VariantId(15, variant: LinkedNodeKind.blockFunctionBody)
+  int get blockFunctionBody_keyword;
+
+  @VariantId(16, variant: LinkedNodeKind.blockFunctionBody)
+  int get blockFunctionBody_star;
+
+  @VariantId(15, variant: LinkedNodeKind.booleanLiteral)
+  int get booleanLiteral_literal;
+
+  @VariantId(27, variant: LinkedNodeKind.booleanLiteral)
+  bool get booleanLiteral_value;
+
+  @VariantId(15, variant: LinkedNodeKind.breakStatement)
+  int get breakStatement_breakKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.breakStatement)
+  LinkedNode get breakStatement_label;
+
+  @VariantId(16, variant: LinkedNodeKind.breakStatement)
+  int get breakStatement_semicolon;
+
+  @VariantId(2, variant: LinkedNodeKind.cascadeExpression)
+  List<LinkedNode> get cascadeExpression_sections;
+
+  @VariantId(6, variant: LinkedNodeKind.cascadeExpression)
+  LinkedNode get cascadeExpression_target;
+
+  @VariantId(6, variant: LinkedNodeKind.catchClause)
+  LinkedNode get catchClause_body;
+
+  @VariantId(15, variant: LinkedNodeKind.catchClause)
+  int get catchClause_catchKeyword;
+
+  @VariantId(16, variant: LinkedNodeKind.catchClause)
+  int get catchClause_comma;
+
+  @VariantId(7, variant: LinkedNodeKind.catchClause)
+  LinkedNode get catchClause_exceptionParameter;
+
+  @VariantId(8, variant: LinkedNodeKind.catchClause)
+  LinkedNode get catchClause_exceptionType;
+
+  @VariantId(17, variant: LinkedNodeKind.catchClause)
+  int get catchClause_leftParenthesis;
+
+  @VariantId(18, variant: LinkedNodeKind.catchClause)
+  int get catchClause_onKeyword;
+
+  @VariantId(19, variant: LinkedNodeKind.catchClause)
+  int get catchClause_rightParenthesis;
+
+  @VariantId(9, variant: LinkedNodeKind.catchClause)
+  LinkedNode get catchClause_stackTraceParameter;
+
+  @VariantId(15, variant: LinkedNodeKind.classDeclaration)
+  int get classDeclaration_abstractKeyword;
+
+  @VariantId(16, variant: LinkedNodeKind.classDeclaration)
+  int get classDeclaration_classKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.classDeclaration)
+  LinkedNode get classDeclaration_extendsClause;
+
+  @VariantId(7, variant: LinkedNodeKind.classDeclaration)
+  LinkedNode get classDeclaration_withClause;
+
+  @VariantId(12, variantList: [
+    LinkedNodeKind.classDeclaration,
+    LinkedNodeKind.mixinDeclaration,
+  ])
+  LinkedNode get classOrMixinDeclaration_implementsClause;
+
+  @VariantId(19, variantList: [
+    LinkedNodeKind.classDeclaration,
+    LinkedNodeKind.mixinDeclaration,
+  ])
+  int get classOrMixinDeclaration_leftBracket;
+
+  @VariantId(5, variantList: [
+    LinkedNodeKind.classDeclaration,
+    LinkedNodeKind.mixinDeclaration,
+  ])
+  List<LinkedNode> get classOrMixinDeclaration_members;
+
+  @VariantId(18, variantList: [
+    LinkedNodeKind.classDeclaration,
+    LinkedNodeKind.mixinDeclaration,
+  ])
+  int get classOrMixinDeclaration_rightBracket;
+
+  @VariantId(13, variantList: [
+    LinkedNodeKind.classDeclaration,
+    LinkedNodeKind.mixinDeclaration,
+  ])
+  LinkedNode get classOrMixinDeclaration_typeParameters;
+
+  @VariantId(15, variant: LinkedNodeKind.classTypeAlias)
+  int get classTypeAlias_abstractKeyword;
+
+  @VariantId(16, variant: LinkedNodeKind.classTypeAlias)
+  int get classTypeAlias_equals;
+
+  @VariantId(9, variant: LinkedNodeKind.classTypeAlias)
+  LinkedNode get classTypeAlias_implementsClause;
+
+  @VariantId(7, variant: LinkedNodeKind.classTypeAlias)
+  LinkedNode get classTypeAlias_superclass;
+
+  @VariantId(6, variant: LinkedNodeKind.classTypeAlias)
+  LinkedNode get classTypeAlias_typeParameters;
+
+  @VariantId(8, variant: LinkedNodeKind.classTypeAlias)
+  LinkedNode get classTypeAlias_withClause;
+
+  @VariantId(19, variantList: [
+    LinkedNodeKind.hideCombinator,
+    LinkedNodeKind.showCombinator,
+  ])
+  int get combinator_keyword;
+
+  @VariantId(28, variant: LinkedNodeKind.comment)
+  List<int> get comment_tokens;
+
+  @VariantId(29, variant: LinkedNodeKind.comment)
+  LinkedNodeCommentType get comment_type;
+
+  @VariantId(15, variant: LinkedNodeKind.compilationUnit)
+  int get compilationUnit_beginToken;
+
+  @VariantId(2, variant: LinkedNodeKind.compilationUnit)
+  List<LinkedNode> get compilationUnit_declarations;
+
+  @VariantId(3, variant: LinkedNodeKind.compilationUnit)
+  List<LinkedNode> get compilationUnit_directives;
+
+  @VariantId(16, variant: LinkedNodeKind.compilationUnit)
+  int get compilationUnit_endToken;
+
+  @VariantId(6, variant: LinkedNodeKind.compilationUnit)
+  LinkedNode get compilationUnit_scriptTag;
+
+  @VariantId(15, variant: LinkedNodeKind.conditionalExpression)
+  int get conditionalExpression_colon;
+
+  @VariantId(6, variant: LinkedNodeKind.conditionalExpression)
+  LinkedNode get conditionalExpression_condition;
+
+  @VariantId(7, variant: LinkedNodeKind.conditionalExpression)
+  LinkedNode get conditionalExpression_elseExpression;
+
+  @VariantId(16, variant: LinkedNodeKind.conditionalExpression)
+  int get conditionalExpression_question;
+
+  @VariantId(8, variant: LinkedNodeKind.conditionalExpression)
+  LinkedNode get conditionalExpression_thenExpression;
+
+  @VariantId(18, variant: LinkedNodeKind.configuration)
+  int get configuration_equalToken;
+
+  @VariantId(15, variant: LinkedNodeKind.configuration)
+  int get configuration_ifKeyword;
+
+  @VariantId(16, variant: LinkedNodeKind.configuration)
+  int get configuration_leftParenthesis;
+
+  @VariantId(6, variant: LinkedNodeKind.configuration)
+  LinkedNode get configuration_name;
+
+  @VariantId(17, variant: LinkedNodeKind.configuration)
+  int get configuration_rightParenthesis;
+
+  @VariantId(8, variant: LinkedNodeKind.configuration)
+  LinkedNode get configuration_uri;
+
+  @VariantId(7, variant: LinkedNodeKind.configuration)
+  LinkedNode get configuration_value;
+
+  @VariantId(6, variant: LinkedNodeKind.constructorDeclaration)
+  LinkedNode get constructorDeclaration_body;
+
+  @VariantId(15, variant: LinkedNodeKind.constructorDeclaration)
+  int get constructorDeclaration_constKeyword;
+
+  @VariantId(16, variant: LinkedNodeKind.constructorDeclaration)
+  int get constructorDeclaration_externalKeyword;
+
+  @VariantId(17, variant: LinkedNodeKind.constructorDeclaration)
+  int get constructorDeclaration_factoryKeyword;
+
+  @VariantId(2, variant: LinkedNodeKind.constructorDeclaration)
+  List<LinkedNode> get constructorDeclaration_initializers;
+
+  @VariantId(7, variant: LinkedNodeKind.constructorDeclaration)
+  LinkedNode get constructorDeclaration_name;
+
+  @VariantId(8, variant: LinkedNodeKind.constructorDeclaration)
+  LinkedNode get constructorDeclaration_parameters;
+
+  @VariantId(18, variant: LinkedNodeKind.constructorDeclaration)
+  int get constructorDeclaration_period;
+
+  @VariantId(9, variant: LinkedNodeKind.constructorDeclaration)
+  LinkedNode get constructorDeclaration_redirectedConstructor;
+
+  @VariantId(10, variant: LinkedNodeKind.constructorDeclaration)
+  LinkedNode get constructorDeclaration_returnType;
+
+  @VariantId(19, variant: LinkedNodeKind.constructorDeclaration)
+  int get constructorDeclaration_separator;
+
+  @VariantId(15, variant: LinkedNodeKind.constructorFieldInitializer)
+  int get constructorFieldInitializer_equals;
+
+  @VariantId(6, variant: LinkedNodeKind.constructorFieldInitializer)
+  LinkedNode get constructorFieldInitializer_expression;
+
+  @VariantId(7, variant: LinkedNodeKind.constructorFieldInitializer)
+  LinkedNode get constructorFieldInitializer_fieldName;
+
+  @VariantId(16, variant: LinkedNodeKind.constructorFieldInitializer)
+  int get constructorFieldInitializer_period;
+
+  @VariantId(17, variant: LinkedNodeKind.constructorFieldInitializer)
+  int get constructorFieldInitializer_thisKeyword;
+
+  @VariantId(15, variant: LinkedNodeKind.constructorName)
+  int get constructorName_element;
+
+  @VariantId(6, variant: LinkedNodeKind.constructorName)
+  LinkedNode get constructorName_name;
+
+  @VariantId(16, variant: LinkedNodeKind.constructorName)
+  int get constructorName_period;
+
+  @VariantId(7, variant: LinkedNodeKind.constructorName)
+  LinkedNode get constructorName_type;
+
+  @VariantId(15, variant: LinkedNodeKind.continueStatement)
+  int get continueStatement_continueKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.continueStatement)
+  LinkedNode get continueStatement_label;
+
+  @VariantId(16, variant: LinkedNodeKind.continueStatement)
+  int get continueStatement_semicolon;
+
+  @VariantId(6, variant: LinkedNodeKind.declaredIdentifier)
+  LinkedNode get declaredIdentifier_identifier;
+
+  @VariantId(15, variant: LinkedNodeKind.declaredIdentifier)
+  int get declaredIdentifier_keyword;
+
+  @VariantId(7, variant: LinkedNodeKind.declaredIdentifier)
+  LinkedNode get declaredIdentifier_type;
+
+  @VariantId(6, variant: LinkedNodeKind.defaultFormalParameter)
+  LinkedNode get defaultFormalParameter_defaultValue;
+
+  @VariantId(27, variant: LinkedNodeKind.defaultFormalParameter)
+  bool get defaultFormalParameter_isNamed;
+
+  @VariantId(7, variant: LinkedNodeKind.defaultFormalParameter)
+  LinkedNode get defaultFormalParameter_parameter;
+
+  @VariantId(15, variant: LinkedNodeKind.defaultFormalParameter)
+  int get defaultFormalParameter_separator;
+
+  @VariantId(17, variantList: [
+    LinkedNodeKind.exportDirective,
+    LinkedNodeKind.importDirective,
+    LinkedNodeKind.libraryDirective,
+    LinkedNodeKind.partDirective,
+    LinkedNodeKind.partOfDirective,
+  ])
+  int get directive_keyword;
+
+  @VariantId(6, variant: LinkedNodeKind.doStatement)
+  LinkedNode get doStatement_body;
+
+  @VariantId(7, variant: LinkedNodeKind.doStatement)
+  LinkedNode get doStatement_condition;
+
+  @VariantId(17, variant: LinkedNodeKind.doStatement)
+  int get doStatement_doKeyword;
+
+  @VariantId(15, variant: LinkedNodeKind.doStatement)
+  int get doStatement_leftParenthesis;
+
+  @VariantId(16, variant: LinkedNodeKind.doStatement)
+  int get doStatement_rightParenthesis;
+
+  @VariantId(18, variant: LinkedNodeKind.doStatement)
+  int get doStatement_semicolon;
+
+  @VariantId(19, variant: LinkedNodeKind.doStatement)
+  int get doStatement_whileKeyword;
+
+  @VariantId(2, variant: LinkedNodeKind.dottedName)
+  List<LinkedNode> get dottedName_components;
+
+  @VariantId(15, variant: LinkedNodeKind.doubleLiteral)
+  int get doubleLiteral_literal;
+
+  @VariantId(21, variant: LinkedNodeKind.doubleLiteral)
+  double get doubleLiteral_value;
+
+  @VariantId(15, variant: LinkedNodeKind.emptyFunctionBody)
+  int get emptyFunctionBody_semicolon;
+
+  @VariantId(15, variant: LinkedNodeKind.emptyStatement)
+  int get emptyStatement_semicolon;
+
+  @VariantId(6, variant: LinkedNodeKind.enumConstantDeclaration)
+  LinkedNode get enumConstantDeclaration_name;
+
+  @VariantId(2, variant: LinkedNodeKind.enumDeclaration)
+  List<LinkedNode> get enumDeclaration_constants;
+
+  @VariantId(15, variant: LinkedNodeKind.enumDeclaration)
+  int get enumDeclaration_enumKeyword;
+
+  @VariantId(16, variant: LinkedNodeKind.enumDeclaration)
+  int get enumDeclaration_leftBracket;
+
+  @VariantId(17, variant: LinkedNodeKind.enumDeclaration)
+  int get enumDeclaration_rightBracket;
+
+  @VariantId(25, variantList: [
+    LinkedNodeKind.adjacentStrings,
+    LinkedNodeKind.assignmentExpression,
+    LinkedNodeKind.asExpression,
+    LinkedNodeKind.awaitExpression,
+    LinkedNodeKind.binaryExpression,
+    LinkedNodeKind.booleanLiteral,
+    LinkedNodeKind.cascadeExpression,
+    LinkedNodeKind.conditionalExpression,
+    LinkedNodeKind.doubleLiteral,
+    LinkedNodeKind.functionExpressionInvocation,
+    LinkedNodeKind.indexExpression,
+    LinkedNodeKind.instanceCreationExpression,
+    LinkedNodeKind.integerLiteral,
+    LinkedNodeKind.isExpression,
+    LinkedNodeKind.listLiteral,
+    LinkedNodeKind.methodInvocation,
+    LinkedNodeKind.namedExpression,
+    LinkedNodeKind.nullLiteral,
+    LinkedNodeKind.parenthesizedExpression,
+    LinkedNodeKind.prefixExpression,
+    LinkedNodeKind.prefixedIdentifier,
+    LinkedNodeKind.propertyAccess,
+    LinkedNodeKind.postfixExpression,
+    LinkedNodeKind.rethrowExpression,
+    LinkedNodeKind.setOrMapLiteral,
+    LinkedNodeKind.simpleIdentifier,
+    LinkedNodeKind.simpleStringLiteral,
+    LinkedNodeKind.stringInterpolation,
+    LinkedNodeKind.superExpression,
+    LinkedNodeKind.symbolLiteral,
+    LinkedNodeKind.thisExpression,
+    LinkedNodeKind.throwExpression,
+  ])
+  LinkedNodeType get expression_type;
+
+  @VariantId(15, variant: LinkedNodeKind.expressionFunctionBody)
+  int get expressionFunctionBody_arrow;
+
+  @VariantId(6, variant: LinkedNodeKind.expressionFunctionBody)
+  LinkedNode get expressionFunctionBody_expression;
+
+  @VariantId(16, variant: LinkedNodeKind.expressionFunctionBody)
+  int get expressionFunctionBody_keyword;
+
+  @VariantId(17, variant: LinkedNodeKind.expressionFunctionBody)
+  int get expressionFunctionBody_semicolon;
+
+  @VariantId(6, variant: LinkedNodeKind.expressionStatement)
+  LinkedNode get expressionStatement_expression;
+
+  @VariantId(15, variant: LinkedNodeKind.expressionStatement)
+  int get expressionStatement_semicolon;
+
+  @VariantId(15, variant: LinkedNodeKind.extendsClause)
+  int get extendsClause_extendsKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.extendsClause)
+  LinkedNode get extendsClause_superclass;
+
+  @VariantId(15, variant: LinkedNodeKind.fieldDeclaration)
+  int get fieldDeclaration_covariantKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.fieldDeclaration)
+  LinkedNode get fieldDeclaration_fields;
+
+  @VariantId(16, variant: LinkedNodeKind.fieldDeclaration)
+  int get fieldDeclaration_semicolon;
+
+  @VariantId(17, variant: LinkedNodeKind.fieldDeclaration)
+  int get fieldDeclaration_staticKeyword;
+
+  @VariantId(8, variant: LinkedNodeKind.fieldFormalParameter)
+  LinkedNode get fieldFormalParameter_formalParameters;
+
+  @VariantId(15, variant: LinkedNodeKind.fieldFormalParameter)
+  int get fieldFormalParameter_keyword;
+
+  @VariantId(16, variant: LinkedNodeKind.fieldFormalParameter)
+  int get fieldFormalParameter_period;
+
+  @VariantId(17, variant: LinkedNodeKind.fieldFormalParameter)
+  int get fieldFormalParameter_thisKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.fieldFormalParameter)
+  LinkedNode get fieldFormalParameter_type;
+
+  @VariantId(7, variant: LinkedNodeKind.fieldFormalParameter)
+  LinkedNode get fieldFormalParameter_typeParameters;
+
+  @VariantId(15, variantList: [
+    LinkedNodeKind.forEachPartsWithDeclaration,
+    LinkedNodeKind.forEachPartsWithIdentifier,
+  ])
+  int get forEachParts_inKeyword;
+
+  @VariantId(6, variantList: [
+    LinkedNodeKind.forEachPartsWithDeclaration,
+    LinkedNodeKind.forEachPartsWithIdentifier,
+  ])
+  LinkedNode get forEachParts_iterable;
+
+  @VariantId(7, variant: LinkedNodeKind.forEachPartsWithDeclaration)
+  LinkedNode get forEachPartsWithDeclaration_loopVariable;
+
+  @VariantId(7, variant: LinkedNodeKind.forEachPartsWithIdentifier)
+  LinkedNode get forEachPartsWithIdentifier_identifier;
+
+  @VariantId(7, variant: LinkedNodeKind.forElement)
+  LinkedNode get forElement_body;
+
+  @VariantId(26, variantList: [
+    LinkedNodeKind.fieldFormalParameter,
+    LinkedNodeKind.functionTypedFormalParameter,
+    LinkedNodeKind.simpleFormalParameter,
+  ])
+  LinkedNodeFormalParameterKind get formalParameter_kind;
+
+  @VariantId(15, variant: LinkedNodeKind.formalParameterList)
+  int get formalParameterList_leftDelimiter;
+
+  @VariantId(16, variant: LinkedNodeKind.formalParameterList)
+  int get formalParameterList_leftParenthesis;
+
+  @VariantId(2, variant: LinkedNodeKind.formalParameterList)
+  List<LinkedNode> get formalParameterList_parameters;
+
+  @VariantId(17, variant: LinkedNodeKind.formalParameterList)
+  int get formalParameterList_rightDelimiter;
+
+  @VariantId(18, variant: LinkedNodeKind.formalParameterList)
+  int get formalParameterList_rightParenthesis;
+
+  @VariantId(15, variantList: [
+    LinkedNodeKind.forElement,
+    LinkedNodeKind.forStatement,
+  ])
+  int get forMixin_awaitKeyword;
+
+  @VariantId(16, variantList: [
+    LinkedNodeKind.forElement,
+    LinkedNodeKind.forStatement,
+  ])
+  int get forMixin_forKeyword;
+
+  @VariantId(6, variantList: [
+    LinkedNodeKind.forElement,
+    LinkedNodeKind.forStatement,
+  ])
+  LinkedNode get forMixin_forLoopParts;
+
+  @VariantId(17, variantList: [
+    LinkedNodeKind.forElement,
+    LinkedNodeKind.forStatement,
+  ])
+  int get forMixin_leftParenthesis;
+
+  @VariantId(19, variantList: [
+    LinkedNodeKind.forElement,
+    LinkedNodeKind.forStatement,
+  ])
+  int get forMixin_rightParenthesis;
+
+  @VariantId(6, variantList: [
+    LinkedNodeKind.forPartsWithDeclarations,
+    LinkedNodeKind.forPartsWithExpression,
+  ])
+  LinkedNode get forParts_condition;
+
+  @VariantId(15, variantList: [
+    LinkedNodeKind.forPartsWithDeclarations,
+    LinkedNodeKind.forPartsWithExpression,
+  ])
+  int get forParts_leftSeparator;
+
+  @VariantId(16, variantList: [
+    LinkedNodeKind.forPartsWithDeclarations,
+    LinkedNodeKind.forPartsWithExpression,
+  ])
+  int get forParts_rightSeparator;
+
+  @VariantId(5, variantList: [
+    LinkedNodeKind.forPartsWithDeclarations,
+    LinkedNodeKind.forPartsWithExpression,
+  ])
+  List<LinkedNode> get forParts_updaters;
+
+  @VariantId(7, variant: LinkedNodeKind.forPartsWithDeclarations)
+  LinkedNode get forPartsWithDeclarations_variables;
+
+  @VariantId(7, variant: LinkedNodeKind.forPartsWithExpression)
+  LinkedNode get forPartsWithExpression_initialization;
+
+  @VariantId(7, variant: LinkedNodeKind.forStatement)
+  LinkedNode get forStatement_body;
+
+  @VariantId(15, variant: LinkedNodeKind.functionDeclaration)
+  int get functionDeclaration_externalKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.functionDeclaration)
+  LinkedNode get functionDeclaration_functionExpression;
+
+  @VariantId(16, variant: LinkedNodeKind.functionDeclaration)
+  int get functionDeclaration_propertyKeyword;
+
+  @VariantId(7, variant: LinkedNodeKind.functionDeclaration)
+  LinkedNode get functionDeclaration_returnType;
+
+  @VariantId(6, variant: LinkedNodeKind.functionDeclarationStatement)
+  LinkedNode get functionDeclarationStatement_functionDeclaration;
+
+  @VariantId(6, variant: LinkedNodeKind.functionExpression)
+  LinkedNode get functionExpression_body;
+
+  @VariantId(7, variant: LinkedNodeKind.functionExpression)
+  LinkedNode get functionExpression_formalParameters;
+
+  @VariantId(8, variant: LinkedNodeKind.functionExpression)
+  LinkedNode get functionExpression_typeParameters;
+
+  @VariantId(6, variant: LinkedNodeKind.functionExpressionInvocation)
+  LinkedNode get functionExpressionInvocation_function;
+
+  @VariantId(6, variant: LinkedNodeKind.functionTypeAlias)
+  LinkedNode get functionTypeAlias_formalParameters;
+
+  @VariantId(7, variant: LinkedNodeKind.functionTypeAlias)
+  LinkedNode get functionTypeAlias_returnType;
+
+  @VariantId(8, variant: LinkedNodeKind.functionTypeAlias)
+  LinkedNode get functionTypeAlias_typeParameters;
+
+  @VariantId(6, variant: LinkedNodeKind.functionTypedFormalParameter)
+  LinkedNode get functionTypedFormalParameter_formalParameters;
+
+  @VariantId(7, variant: LinkedNodeKind.functionTypedFormalParameter)
+  LinkedNode get functionTypedFormalParameter_returnType;
+
+  @VariantId(8, variant: LinkedNodeKind.functionTypedFormalParameter)
+  LinkedNode get functionTypedFormalParameter_typeParameters;
+
+  @VariantId(8, variant: LinkedNodeKind.genericFunctionType)
+  LinkedNode get genericFunctionType_formalParameters;
+
+  @VariantId(15, variant: LinkedNodeKind.genericFunctionType)
+  int get genericFunctionType_functionKeyword;
+
+  @VariantId(16, variant: LinkedNodeKind.genericFunctionType)
+  int get genericFunctionType_question;
+
+  @VariantId(7, variant: LinkedNodeKind.genericFunctionType)
+  LinkedNode get genericFunctionType_returnType;
+
+  @VariantId(6, variant: LinkedNodeKind.genericFunctionType)
+  LinkedNode get genericFunctionType_typeParameters;
+
+  @VariantId(16, variant: LinkedNodeKind.genericTypeAlias)
+  int get genericTypeAlias_equals;
+
+  @VariantId(7, variant: LinkedNodeKind.genericTypeAlias)
+  LinkedNode get genericTypeAlias_functionType;
+
+  @VariantId(6, variant: LinkedNodeKind.genericTypeAlias)
+  LinkedNode get genericTypeAlias_typeParameters;
+
+  @VariantId(2, variant: LinkedNodeKind.hideCombinator)
+  List<LinkedNode> get hideCombinator_hiddenNames;
+
+  @VariantId(9, variant: LinkedNodeKind.ifElement)
+  LinkedNode get ifElement_elseElement;
+
+  @VariantId(8, variant: LinkedNodeKind.ifElement)
+  LinkedNode get ifElement_thenElement;
+
+  @VariantId(6, variantList: [
+    LinkedNodeKind.ifElement,
+    LinkedNodeKind.ifStatement,
+  ])
+  LinkedNode get ifMixin_condition;
+
+  @VariantId(15, variantList: [
+    LinkedNodeKind.ifElement,
+    LinkedNodeKind.ifStatement,
+  ])
+  int get ifMixin_elseKeyword;
+
+  @VariantId(16, variantList: [
+    LinkedNodeKind.ifElement,
+    LinkedNodeKind.ifStatement,
+  ])
+  int get ifMixin_ifKeyword;
+
+  @VariantId(17, variantList: [
+    LinkedNodeKind.ifElement,
+    LinkedNodeKind.ifStatement,
+  ])
+  int get ifMixin_leftParenthesis;
+
+  @VariantId(18, variantList: [
+    LinkedNodeKind.ifElement,
+    LinkedNodeKind.ifStatement,
+  ])
+  int get ifMixin_rightParenthesis;
+
+  @VariantId(7, variant: LinkedNodeKind.ifStatement)
+  LinkedNode get ifStatement_elseStatement;
+
+  @VariantId(8, variant: LinkedNodeKind.ifStatement)
+  LinkedNode get ifStatement_thenStatement;
+
+  @VariantId(15, variant: LinkedNodeKind.implementsClause)
+  int get implementsClause_implementsKeyword;
+
+  @VariantId(2, variant: LinkedNodeKind.implementsClause)
+  List<LinkedNode> get implementsClause_interfaces;
+
+  @VariantId(15, variant: LinkedNodeKind.importDirective)
+  int get importDirective_asKeyword;
+
+  @VariantId(16, variant: LinkedNodeKind.importDirective)
+  int get importDirective_deferredKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.importDirective)
+  LinkedNode get importDirective_prefix;
+
+  @VariantId(15, variant: LinkedNodeKind.indexExpression)
+  int get indexExpression_element;
+
+  @VariantId(6, variant: LinkedNodeKind.indexExpression)
+  LinkedNode get indexExpression_index;
+
+  @VariantId(16, variant: LinkedNodeKind.indexExpression)
+  int get indexExpression_leftBracket;
+
+  @VariantId(17, variant: LinkedNodeKind.indexExpression)
+  int get indexExpression_rightBracket;
+
+  @VariantId(7, variant: LinkedNodeKind.indexExpression)
+  LinkedNode get indexExpression_target;
+
+  @VariantId(6, variant: LinkedNodeKind.instanceCreationExpression)
+  LinkedNode get instanceCreationExpression_arguments;
+
+  @VariantId(7, variant: LinkedNodeKind.instanceCreationExpression)
+  LinkedNode get instanceCreationExpression_constructorName;
+
+  @VariantId(15, variant: LinkedNodeKind.instanceCreationExpression)
+  int get instanceCreationExpression_keyword;
+
+  @VariantId(8, variant: LinkedNodeKind.instanceCreationExpression)
+  LinkedNode get instanceCreationExpression_typeArguments;
+
+  @VariantId(15, variant: LinkedNodeKind.integerLiteral)
+  int get integerLiteral_literal;
+
+  @VariantId(16, variant: LinkedNodeKind.integerLiteral)
+  int get integerLiteral_value;
+
+  @VariantId(6, variant: LinkedNodeKind.interpolationExpression)
+  LinkedNode get interpolationExpression_expression;
+
+  @VariantId(15, variant: LinkedNodeKind.interpolationExpression)
+  int get interpolationExpression_leftBracket;
+
+  @VariantId(16, variant: LinkedNodeKind.interpolationExpression)
+  int get interpolationExpression_rightBracket;
+
+  @VariantId(15, variant: LinkedNodeKind.interpolationString)
+  int get interpolationString_token;
+
+  @VariantId(30, variant: LinkedNodeKind.interpolationString)
+  String get interpolationString_value;
+
+  @VariantId(14, variantList: [
+    LinkedNodeKind.functionExpressionInvocation,
+    LinkedNodeKind.methodInvocation,
+  ])
+  LinkedNode get invocationExpression_arguments;
+
+  @VariantId(24, variantList: [
+    LinkedNodeKind.functionExpressionInvocation,
+    LinkedNodeKind.methodInvocation,
+  ])
+  LinkedNodeType get invocationExpression_invokeType;
+
+  @VariantId(12, variantList: [
+    LinkedNodeKind.functionExpressionInvocation,
+    LinkedNodeKind.methodInvocation,
+  ])
+  LinkedNode get invocationExpression_typeArguments;
+
+  @VariantId(6, variant: LinkedNodeKind.isExpression)
+  LinkedNode get isExpression_expression;
+
+  @VariantId(15, variant: LinkedNodeKind.isExpression)
+  int get isExpression_isOperator;
+
+  @VariantId(16, variant: LinkedNodeKind.isExpression)
+  int get isExpression_notOperator;
+
+  @VariantId(7, variant: LinkedNodeKind.isExpression)
+  LinkedNode get isExpression_type;
+
+  @Id(1)
+  bool get isSynthetic;
+
+  @Id(0)
+  LinkedNodeKind get kind;
+
+  @VariantId(15, variant: LinkedNodeKind.label)
+  int get label_colon;
+
+  @VariantId(6, variant: LinkedNodeKind.label)
+  LinkedNode get label_label;
+
+  @VariantId(2, variant: LinkedNodeKind.labeledStatement)
+  List<LinkedNode> get labeledStatement_labels;
+
+  @VariantId(6, variant: LinkedNodeKind.labeledStatement)
+  LinkedNode get labeledStatement_statement;
+
+  @VariantId(6, variant: LinkedNodeKind.libraryDirective)
+  LinkedNode get libraryDirective_name;
+
+  @VariantId(2, variant: LinkedNodeKind.libraryIdentifier)
+  List<LinkedNode> get libraryIdentifier_components;
+
+  @VariantId(2, variant: LinkedNodeKind.listLiteral)
+  List<LinkedNode> get listLiteral_elements;
+
+  @VariantId(15, variant: LinkedNodeKind.listLiteral)
+  int get listLiteral_leftBracket;
+
+  @VariantId(16, variant: LinkedNodeKind.listLiteral)
+  int get listLiteral_rightBracket;
+
+  @VariantId(6, variant: LinkedNodeKind.mapLiteralEntry)
+  LinkedNode get mapLiteralEntry_key;
+
+  @VariantId(15, variant: LinkedNodeKind.mapLiteralEntry)
+  int get mapLiteralEntry_separator;
+
+  @VariantId(7, variant: LinkedNodeKind.mapLiteralEntry)
+  LinkedNode get mapLiteralEntry_value;
+
+  @VariantId(6, variant: LinkedNodeKind.methodDeclaration)
+  LinkedNode get methodDeclaration_body;
+
+  @VariantId(15, variant: LinkedNodeKind.methodDeclaration)
+  int get methodDeclaration_externalKeyword;
+
+  @VariantId(7, variant: LinkedNodeKind.methodDeclaration)
+  LinkedNode get methodDeclaration_formalParameters;
+
+  @VariantId(16, variant: LinkedNodeKind.methodDeclaration)
+  int get methodDeclaration_modifierKeyword;
+
+  @VariantId(10, variant: LinkedNodeKind.methodDeclaration)
+  LinkedNode get methodDeclaration_name;
+
+  @VariantId(17, variant: LinkedNodeKind.methodDeclaration)
+  int get methodDeclaration_operatorKeyword;
+
+  @VariantId(18, variant: LinkedNodeKind.methodDeclaration)
+  int get methodDeclaration_propertyKeyword;
+
+  @VariantId(8, variant: LinkedNodeKind.methodDeclaration)
+  LinkedNode get methodDeclaration_returnType;
+
+  @VariantId(9, variant: LinkedNodeKind.methodDeclaration)
+  LinkedNode get methodDeclaration_typeParameters;
+
+  @VariantId(6, variant: LinkedNodeKind.methodInvocation)
+  LinkedNode get methodInvocation_methodName;
+
+  @VariantId(15, variant: LinkedNodeKind.methodInvocation)
+  int get methodInvocation_operator;
+
+  @VariantId(7, variant: LinkedNodeKind.methodInvocation)
+  LinkedNode get methodInvocation_target;
+
+  @VariantId(15, variant: LinkedNodeKind.mixinDeclaration)
+  int get mixinDeclaration_mixinKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.mixinDeclaration)
+  LinkedNode get mixinDeclaration_onClause;
+
+  @VariantId(14, variantList: [
+    LinkedNodeKind.classDeclaration,
+    LinkedNodeKind.classTypeAlias,
+    LinkedNodeKind.enumDeclaration,
+    LinkedNodeKind.functionDeclaration,
+    LinkedNodeKind.functionTypeAlias,
+    LinkedNodeKind.genericTypeAlias,
+    LinkedNodeKind.mixinDeclaration,
+  ])
+  LinkedNode get namedCompilationUnitMember_name;
+
+  @VariantId(6, variant: LinkedNodeKind.namedExpression)
+  LinkedNode get namedExpression_expression;
+
+  @VariantId(7, variant: LinkedNodeKind.namedExpression)
+  LinkedNode get namedExpression_name;
+
+  @VariantId(2, variantList: [
+    LinkedNodeKind.exportDirective,
+    LinkedNodeKind.importDirective,
+  ])
+  List<LinkedNode> get namespaceDirective_combinators;
+
+  @VariantId(3, variantList: [
+    LinkedNodeKind.exportDirective,
+    LinkedNodeKind.importDirective,
+  ])
+  List<LinkedNode> get namespaceDirective_configurations;
+
+  @VariantId(23, variantList: [
+    LinkedNodeKind.exportDirective,
+    LinkedNodeKind.importDirective,
+    LinkedNodeKind.partDirective,
+    LinkedNodeKind.partOfDirective,
+  ])
+  String get namespaceDirective_selectedUriContent;
+
+  @VariantId(18, variantList: [
+    LinkedNodeKind.exportDirective,
+    LinkedNodeKind.importDirective,
+    LinkedNodeKind.libraryDirective,
+    LinkedNodeKind.partDirective,
+  ])
+  int get namespaceDirective_semicolon;
+
+  @VariantId(14, variantList: [
+    LinkedNodeKind.fieldFormalParameter,
+    LinkedNodeKind.functionTypedFormalParameter,
+    LinkedNodeKind.simpleFormalParameter,
+  ])
+  LinkedNode get normalFormalParameter_comment;
+
+  @VariantId(19, variantList: [
+    LinkedNodeKind.fieldFormalParameter,
+    LinkedNodeKind.functionTypedFormalParameter,
+    LinkedNodeKind.simpleFormalParameter,
+  ])
+  int get normalFormalParameter_covariantKeyword;
+
+  @VariantId(12, variantList: [
+    LinkedNodeKind.fieldFormalParameter,
+    LinkedNodeKind.functionTypedFormalParameter,
+    LinkedNodeKind.simpleFormalParameter,
+  ])
+  LinkedNode get normalFormalParameter_identifier;
+
+  @VariantId(4, variantList: [
+    LinkedNodeKind.fieldFormalParameter,
+    LinkedNodeKind.functionTypedFormalParameter,
+    LinkedNodeKind.simpleFormalParameter,
+  ])
+  List<LinkedNode> get normalFormalParameter_metadata;
+
+  @VariantId(15, variant: LinkedNodeKind.nullLiteral)
+  int get nullLiteral_literal;
+
+  @VariantId(15, variant: LinkedNodeKind.onClause)
+  int get onClause_onKeyword;
+
+  @VariantId(2, variant: LinkedNodeKind.onClause)
+  List<LinkedNode> get onClause_superclassConstraints;
+
+  @VariantId(6, variant: LinkedNodeKind.parenthesizedExpression)
+  LinkedNode get parenthesizedExpression_expression;
+
+  @VariantId(15, variant: LinkedNodeKind.parenthesizedExpression)
+  int get parenthesizedExpression_leftParenthesis;
+
+  @VariantId(16, variant: LinkedNodeKind.parenthesizedExpression)
+  int get parenthesizedExpression_rightParenthesis;
+
+  @VariantId(6, variant: LinkedNodeKind.partOfDirective)
+  LinkedNode get partOfDirective_libraryName;
+
+  @VariantId(16, variant: LinkedNodeKind.partOfDirective)
+  int get partOfDirective_ofKeyword;
+
+  @VariantId(15, variant: LinkedNodeKind.partOfDirective)
+  int get partOfDirective_semicolon;
+
+  @VariantId(7, variant: LinkedNodeKind.partOfDirective)
+  LinkedNode get partOfDirective_uri;
+
+  @VariantId(15, variant: LinkedNodeKind.postfixExpression)
+  int get postfixExpression_element;
+
+  @VariantId(6, variant: LinkedNodeKind.postfixExpression)
+  LinkedNode get postfixExpression_operand;
+
+  @VariantId(16, variant: LinkedNodeKind.postfixExpression)
+  int get postfixExpression_operator;
+
+  @VariantId(6, variant: LinkedNodeKind.prefixedIdentifier)
+  LinkedNode get prefixedIdentifier_identifier;
+
+  @VariantId(15, variant: LinkedNodeKind.prefixedIdentifier)
+  int get prefixedIdentifier_period;
+
+  @VariantId(7, variant: LinkedNodeKind.prefixedIdentifier)
+  LinkedNode get prefixedIdentifier_prefix;
+
+  @VariantId(15, variant: LinkedNodeKind.prefixExpression)
+  int get prefixExpression_element;
+
+  @VariantId(6, variant: LinkedNodeKind.prefixExpression)
+  LinkedNode get prefixExpression_operand;
+
+  @VariantId(16, variant: LinkedNodeKind.prefixExpression)
+  int get prefixExpression_operator;
+
+  @VariantId(15, variant: LinkedNodeKind.propertyAccess)
+  int get propertyAccess_operator;
+
+  @VariantId(6, variant: LinkedNodeKind.propertyAccess)
+  LinkedNode get propertyAccess_propertyName;
+
+  @VariantId(7, variant: LinkedNodeKind.propertyAccess)
+  LinkedNode get propertyAccess_target;
+
+  @VariantId(6, variant: LinkedNodeKind.redirectingConstructorInvocation)
+  LinkedNode get redirectingConstructorInvocation_arguments;
+
+  @VariantId(7, variant: LinkedNodeKind.redirectingConstructorInvocation)
+  LinkedNode get redirectingConstructorInvocation_constructorName;
+
+  @VariantId(15, variant: LinkedNodeKind.redirectingConstructorInvocation)
+  int get redirectingConstructorInvocation_element;
+
+  @VariantId(16, variant: LinkedNodeKind.redirectingConstructorInvocation)
+  int get redirectingConstructorInvocation_period;
+
+  @VariantId(17, variant: LinkedNodeKind.redirectingConstructorInvocation)
+  int get redirectingConstructorInvocation_thisKeyword;
+
+  @VariantId(15, variant: LinkedNodeKind.rethrowExpression)
+  int get rethrowExpression_rethrowKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.returnStatement)
+  LinkedNode get returnStatement_expression;
+
+  @VariantId(15, variant: LinkedNodeKind.returnStatement)
+  int get returnStatement_returnKeyword;
+
+  @VariantId(16, variant: LinkedNodeKind.returnStatement)
+  int get returnStatement_semicolon;
+
+  @VariantId(15, variant: LinkedNodeKind.scriptTag)
+  int get scriptTag_scriptTag;
+
+  @VariantId(2, variant: LinkedNodeKind.setOrMapLiteral)
+  List<LinkedNode> get setOrMapLiteral_elements;
+
+  @VariantId(27, variant: LinkedNodeKind.setOrMapLiteral)
+  bool get setOrMapLiteral_isMap;
+
+  @VariantId(31, variant: LinkedNodeKind.setOrMapLiteral)
+  bool get setOrMapLiteral_isSet;
+
+  @VariantId(15, variant: LinkedNodeKind.setOrMapLiteral)
+  int get setOrMapLiteral_leftBracket;
+
+  @VariantId(16, variant: LinkedNodeKind.setOrMapLiteral)
+  int get setOrMapLiteral_rightBracket;
+
+  @VariantId(2, variant: LinkedNodeKind.showCombinator)
+  List<LinkedNode> get showCombinator_shownNames;
+
+  @VariantId(15, variant: LinkedNodeKind.simpleFormalParameter)
+  int get simpleFormalParameter_keyword;
+
+  @VariantId(6, variant: LinkedNodeKind.simpleFormalParameter)
+  LinkedNode get simpleFormalParameter_type;
+
+  @VariantId(15, variant: LinkedNodeKind.simpleIdentifier)
+  int get simpleIdentifier_element;
+
+  @VariantId(16, variant: LinkedNodeKind.simpleIdentifier)
+  int get simpleIdentifier_token;
+
+  @VariantId(15, variant: LinkedNodeKind.simpleStringLiteral)
+  int get simpleStringLiteral_token;
+
+  @VariantId(20, variant: LinkedNodeKind.simpleStringLiteral)
+  String get simpleStringLiteral_value;
+
+  @VariantId(6, variant: LinkedNodeKind.spreadElement)
+  LinkedNode get spreadElement_expression;
+
+  @VariantId(15, variant: LinkedNodeKind.spreadElement)
+  int get spreadElement_spreadOperator;
+
+  @VariantId(2, variant: LinkedNodeKind.stringInterpolation)
+  List<LinkedNode> get stringInterpolation_elements;
+
+  @VariantId(6, variant: LinkedNodeKind.superConstructorInvocation)
+  LinkedNode get superConstructorInvocation_arguments;
+
+  @VariantId(7, variant: LinkedNodeKind.superConstructorInvocation)
+  LinkedNode get superConstructorInvocation_constructorName;
+
+  @VariantId(15, variant: LinkedNodeKind.superConstructorInvocation)
+  int get superConstructorInvocation_element;
+
+  @VariantId(16, variant: LinkedNodeKind.superConstructorInvocation)
+  int get superConstructorInvocation_period;
+
+  @VariantId(17, variant: LinkedNodeKind.superConstructorInvocation)
+  int get superConstructorInvocation_superKeyword;
+
+  @VariantId(15, variant: LinkedNodeKind.superExpression)
+  int get superExpression_superKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.switchCase)
+  LinkedNode get switchCase_expression;
+
+  @VariantId(16, variantList: [
+    LinkedNodeKind.switchCase,
+    LinkedNodeKind.switchDefault,
+  ])
+  int get switchMember_colon;
+
+  @VariantId(15, variantList: [
+    LinkedNodeKind.switchCase,
+    LinkedNodeKind.switchDefault,
+  ])
+  int get switchMember_keyword;
+
+  @VariantId(3, variantList: [
+    LinkedNodeKind.switchCase,
+    LinkedNodeKind.switchDefault,
+  ])
+  List<LinkedNode> get switchMember_labels;
+
+  @VariantId(4, variantList: [
+    LinkedNodeKind.switchCase,
+    LinkedNodeKind.switchDefault,
+  ])
+  List<LinkedNode> get switchMember_statements;
+
+  @VariantId(7, variant: LinkedNodeKind.switchStatement)
+  LinkedNode get switchStatement_expression;
+
+  @VariantId(18, variant: LinkedNodeKind.switchStatement)
+  int get switchStatement_leftBracket;
+
+  @VariantId(15, variant: LinkedNodeKind.switchStatement)
+  int get switchStatement_leftParenthesis;
+
+  @VariantId(2, variant: LinkedNodeKind.switchStatement)
+  List<LinkedNode> get switchStatement_members;
+
+  @VariantId(19, variant: LinkedNodeKind.switchStatement)
+  int get switchStatement_rightBracket;
+
+  @VariantId(16, variant: LinkedNodeKind.switchStatement)
+  int get switchStatement_rightParenthesis;
+
+  @VariantId(17, variant: LinkedNodeKind.switchStatement)
+  int get switchStatement_switchKeyword;
+
+  @VariantId(28, variant: LinkedNodeKind.symbolLiteral)
+  List<int> get symbolLiteral_components;
+
+  @VariantId(15, variant: LinkedNodeKind.symbolLiteral)
+  int get symbolLiteral_poundSign;
+
+  @VariantId(15, variant: LinkedNodeKind.thisExpression)
+  int get thisExpression_thisKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.throwExpression)
+  LinkedNode get throwExpression_expression;
+
+  @VariantId(15, variant: LinkedNodeKind.throwExpression)
+  int get throwExpression_throwKeyword;
+
+  @VariantId(15, variant: LinkedNodeKind.topLevelVariableDeclaration)
+  int get topLevelVariableDeclaration_semicolon;
+
+  @VariantId(6, variant: LinkedNodeKind.topLevelVariableDeclaration)
+  LinkedNode get topLevelVariableDeclaration_variableList;
+
+  @VariantId(6, variant: LinkedNodeKind.tryStatement)
+  LinkedNode get tryStatement_body;
+
+  @VariantId(2, variant: LinkedNodeKind.tryStatement)
+  List<LinkedNode> get tryStatement_catchClauses;
+
+  @VariantId(7, variant: LinkedNodeKind.tryStatement)
+  LinkedNode get tryStatement_finallyBlock;
+
+  @VariantId(15, variant: LinkedNodeKind.tryStatement)
+  int get tryStatement_finallyKeyword;
+
+  @VariantId(16, variant: LinkedNodeKind.tryStatement)
+  int get tryStatement_tryKeyword;
+
+  @VariantId(19, variantList: [
+    LinkedNodeKind.classTypeAlias,
+    LinkedNodeKind.functionTypeAlias,
+    LinkedNodeKind.genericTypeAlias,
+  ])
+  int get typeAlias_semicolon;
+
+  @VariantId(18, variantList: [
+    LinkedNodeKind.classTypeAlias,
+    LinkedNodeKind.functionTypeAlias,
+    LinkedNodeKind.genericTypeAlias,
+  ])
+  int get typeAlias_typedefKeyword;
+
+  @VariantId(2, variant: LinkedNodeKind.typeArgumentList)
+  List<LinkedNode> get typeArgumentList_arguments;
+
+  @VariantId(15, variant: LinkedNodeKind.typeArgumentList)
+  int get typeArgumentList_leftBracket;
+
+  @VariantId(16, variant: LinkedNodeKind.typeArgumentList)
+  int get typeArgumentList_rightBracket;
+
+  @VariantId(19, variantList: [
+    LinkedNodeKind.listLiteral,
+    LinkedNodeKind.setOrMapLiteral,
+  ])
+  int get typedLiteral_constKeyword;
+
+  @VariantId(14, variantList: [
+    LinkedNodeKind.listLiteral,
+    LinkedNodeKind.setOrMapLiteral,
+  ])
+  LinkedNode get typedLiteral_typeArguments;
+
+  @VariantId(6, variant: LinkedNodeKind.typeName)
+  LinkedNode get typeName_name;
+
+  @VariantId(15, variant: LinkedNodeKind.typeName)
+  int get typeName_question;
+
+  @VariantId(24, variant: LinkedNodeKind.typeName)
+  LinkedNodeType get typeName_type;
+
+  @VariantId(7, variant: LinkedNodeKind.typeName)
+  LinkedNode get typeName_typeArguments;
+
+  @VariantId(6, variant: LinkedNodeKind.typeParameter)
+  LinkedNode get typeParameter_bound;
+
+  @VariantId(15, variant: LinkedNodeKind.typeParameter)
+  int get typeParameter_extendsKeyword;
+
+  @VariantId(7, variant: LinkedNodeKind.typeParameter)
+  LinkedNode get typeParameter_name;
+
+  @VariantId(15, variant: LinkedNodeKind.typeParameterList)
+  int get typeParameterList_leftBracket;
+
+  @VariantId(16, variant: LinkedNodeKind.typeParameterList)
+  int get typeParameterList_rightBracket;
+
+  @VariantId(2, variant: LinkedNodeKind.typeParameterList)
+  List<LinkedNode> get typeParameterList_typeParameters;
+
+  @VariantId(14, variantList: [
+    LinkedNodeKind.exportDirective,
+    LinkedNodeKind.importDirective,
+    LinkedNodeKind.partDirective,
+  ])
+  LinkedNode get uriBasedDirective_uri;
+
+  @VariantId(22, variantList: [
+    LinkedNodeKind.exportDirective,
+    LinkedNodeKind.importDirective,
+    LinkedNodeKind.partDirective,
+  ])
+  String get uriBasedDirective_uriContent;
+
+  @VariantId(19, variantList: [
+    LinkedNodeKind.exportDirective,
+    LinkedNodeKind.importDirective,
+    LinkedNodeKind.partDirective,
+  ])
+  int get uriBasedDirective_uriElement;
+
+  @VariantId(15, variant: LinkedNodeKind.variableDeclaration)
+  int get variableDeclaration_equals;
+
+  @VariantId(6, variant: LinkedNodeKind.variableDeclaration)
+  LinkedNode get variableDeclaration_initializer;
+
+  @VariantId(7, variant: LinkedNodeKind.variableDeclaration)
+  LinkedNode get variableDeclaration_name;
+
+  @VariantId(15, variant: LinkedNodeKind.variableDeclarationList)
+  int get variableDeclarationList_keyword;
+
+  @VariantId(6, variant: LinkedNodeKind.variableDeclarationList)
+  LinkedNode get variableDeclarationList_type;
+
+  @VariantId(2, variant: LinkedNodeKind.variableDeclarationList)
+  List<LinkedNode> get variableDeclarationList_variables;
+
+  @VariantId(15, variant: LinkedNodeKind.variableDeclarationStatement)
+  int get variableDeclarationStatement_semicolon;
+
+  @VariantId(6, variant: LinkedNodeKind.variableDeclarationStatement)
+  LinkedNode get variableDeclarationStatement_variables;
+
+  @VariantId(6, variant: LinkedNodeKind.whileStatement)
+  LinkedNode get whileStatement_body;
+
+  @VariantId(7, variant: LinkedNodeKind.whileStatement)
+  LinkedNode get whileStatement_condition;
+
+  @VariantId(15, variant: LinkedNodeKind.whileStatement)
+  int get whileStatement_leftParenthesis;
+
+  @VariantId(16, variant: LinkedNodeKind.whileStatement)
+  int get whileStatement_rightParenthesis;
+
+  @VariantId(17, variant: LinkedNodeKind.whileStatement)
+  int get whileStatement_whileKeyword;
+
+  @VariantId(2, variant: LinkedNodeKind.withClause)
+  List<LinkedNode> get withClause_mixinTypes;
+
+  @VariantId(15, variant: LinkedNodeKind.withClause)
+  int get withClause_withKeyword;
+
+  @VariantId(6, variant: LinkedNodeKind.yieldStatement)
+  LinkedNode get yieldStatement_expression;
+
+  @VariantId(17, variant: LinkedNodeKind.yieldStatement)
+  int get yieldStatement_semicolon;
+
+  @VariantId(16, variant: LinkedNodeKind.yieldStatement)
+  int get yieldStatement_star;
+
+  @VariantId(15, variant: LinkedNodeKind.yieldStatement)
+  int get yieldStatement_yieldKeyword;
+}
+
+/// TODO(scheglov) extend to support multiple libraries or remove
+@TopLevel('LNBn')
+abstract class LinkedNodeBundle extends base.SummaryClass {
+  factory LinkedNodeBundle.fromBuffer(List<int> buffer) =>
+      generated.readLinkedNodeBundle(buffer);
+
+  @Id(2)
+  LinkedNode get node;
+
+  @Id(1)
+  LinkedNodeReference get references;
+
+  @Id(0)
+  UnlinkedTokens get tokens;
+}
+
+/// Types of comments.
+enum LinkedNodeCommentType { block, documentation, endOfLine }
+
+/// Kinds of formal parameters.
+enum LinkedNodeFormalParameterKind {
+  required,
+  optionalPositional,
+  optionalNamed
+}
+
+/// Kinds of [LinkedNode].
+enum LinkedNodeKind {
+  adjacentStrings,
+  annotation,
+  argumentList,
+  asExpression,
+  assertInitializer,
+  assertStatement,
+  assignmentExpression,
+  awaitExpression,
+  binaryExpression,
+  block,
+  blockFunctionBody,
+  booleanLiteral,
+  breakStatement,
+  cascadeExpression,
+  catchClause,
+  classDeclaration,
+  classTypeAlias,
+  comment,
+  compilationUnit,
+  conditionalExpression,
+  configuration,
+  constructorDeclaration,
+  constructorFieldInitializer,
+  constructorName,
+  continueStatement,
+  declaredIdentifier,
+  defaultFormalParameter,
+  doubleLiteral,
+  doStatement,
+  dottedName,
+  emptyFunctionBody,
+  emptyStatement,
+  enumConstantDeclaration,
+  enumDeclaration,
+  exportDirective,
+  expressionFunctionBody,
+  expressionStatement,
+  extendsClause,
+  fieldDeclaration,
+  fieldFormalParameter,
+  formalParameterList,
+  forEachPartsWithDeclaration,
+  forEachPartsWithIdentifier,
+  forElement,
+  forPartsWithDeclarations,
+  forPartsWithExpression,
+  forStatement,
+  functionDeclaration,
+  functionDeclarationStatement,
+  functionExpression,
+  functionExpressionInvocation,
+  functionTypeAlias,
+  functionTypedFormalParameter,
+  genericFunctionType,
+  genericTypeAlias,
+  hideCombinator,
+  ifElement,
+  ifStatement,
+  implementsClause,
+  importDirective,
+  instanceCreationExpression,
+  indexExpression,
+  integerLiteral,
+  interpolationExpression,
+  interpolationString,
+  isExpression,
+  label,
+  labeledStatement,
+  libraryDirective,
+  libraryIdentifier,
+  listLiteral,
+  mapLiteralEntry,
+  methodDeclaration,
+  methodInvocation,
+  mixinDeclaration,
+  namedExpression,
+  nullLiteral,
+  onClause,
+  parenthesizedExpression,
+  partDirective,
+  partOfDirective,
+  postfixExpression,
+  prefixExpression,
+  prefixedIdentifier,
+  propertyAccess,
+  redirectingConstructorInvocation,
+  rethrowExpression,
+  returnStatement,
+  scriptTag,
+  setOrMapLiteral,
+  showCombinator,
+  simpleFormalParameter,
+  simpleIdentifier,
+  simpleStringLiteral,
+  spreadElement,
+  stringInterpolation,
+  superConstructorInvocation,
+  superExpression,
+  switchCase,
+  switchDefault,
+  switchStatement,
+  symbolLiteral,
+  thisExpression,
+  throwExpression,
+  topLevelVariableDeclaration,
+  tryStatement,
+  typeArgumentList,
+  typeName,
+  typeParameter,
+  typeParameterList,
+  variableDeclaration,
+  variableDeclarationList,
+  variableDeclarationStatement,
+  whileStatement,
+  withClause,
+  yieldStatement,
+}
+
+/// Flattened tree of declarations referenced from [LinkedNode]s.
+abstract class LinkedNodeReference extends base.SummaryClass {
+  @Id(1)
+  List<String> get name;
+
+  @Id(0)
+  List<int> get parent;
+}
+
+/// Information about a Dart type.
+abstract class LinkedNodeType extends base.SummaryClass {
+  /// References to [LinkedNodeReference].
+  @Id(0)
+  List<int> get functionFormalParameters;
+
+  @Id(1)
+  LinkedNodeType get functionReturnType;
+
+  /// References to [LinkedNodeReference].
+  @Id(2)
+  List<int> get functionTypeParameters;
+
+  /// Reference to a [LinkedNodeReference].
+  @Id(3)
+  int get interfaceClass;
+
+  @Id(4)
+  List<LinkedNodeType> get interfaceTypeArguments;
+
+  @Id(5)
+  LinkedNodeTypeKind get kind;
+
+  /// Reference to a [LinkedNodeReference].
+  @Id(6)
+  int get typeParameterParameter;
+}
+
+/// Kinds of [LinkedNodeType]s.
+enum LinkedNodeTypeKind {
+  bottom,
+  dynamic_,
+  function,
+  interface,
+  typeParameter,
+  void_
+}
+
 /// Information about the resolution of an [UnlinkedReference].
 abstract class LinkedReference extends base.SummaryClass {
   /// If this [LinkedReference] doesn't have an associated [UnlinkedReference],
@@ -1837,6 +3485,8 @@
   /// [UnlinkedExpr.ints]), interpret them as key/value pairs, place them in a
   /// [Map], and push the result back onto the stack.  The two type parameters
   /// for the [Map] are implicitly `dynamic`.
+  ///
+  /// To be replaced with [makeUntypedSetOrMap] for unified collections.
   makeUntypedMap,
 
   /// Pop the top n values from the stack (where n is obtained from
@@ -1849,6 +3499,10 @@
   /// [UnlinkedExpr.ints]), interpret them as key/value pairs, place them in a
   /// [Map], and push the result back onto the stack.  The two type parameters
   /// for the [Map] are obtained from [UnlinkedExpr.references].
+  ///
+  /// To be replaced with [makeTypedMap2] for unified collections. This is not
+  /// forwards compatible with [makeTypedMap2] because it expects
+  /// [CollectionElement]s instead of pairs of [Expression]s.
   makeTypedMap,
 
   /// Pop the top 2 values from the stack, evaluate `v1 == v2`, and push the
@@ -2109,6 +3763,25 @@
   /// onto the stack.  The type parameter for the [Set] is obtained from
   /// [UnlinkedExpr.references].
   makeTypedSet,
+
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), which should be [CollectionElement]s, place them in
+  /// a [SetOrMap], and push the result back onto the stack.
+  makeUntypedSetOrMap,
+
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), which should be [CollectionElement]s, place them in
+  /// a [Map], and push the result back onto the stack. The two type parameters
+  /// for the [Map] are obtained from [UnlinkedExpr.references].
+  ///
+  /// To replace [makeTypedMap] for unified collections. This is not backwards
+  /// compatible with [makeTypedMap] because it expects [CollectionElement]s
+  /// instead of pairs of [Expression]s.
+  makeTypedMap2,
+
+  /// Pop the top 2 values from the stack, place them in a [MapLiteralEntry],
+  /// and push the result back onto the stack.
+  makeMapLiteralEntry,
 }
 
 /// Unlinked summary information about an import declaration.
@@ -2375,6 +4048,189 @@
   int get prefixReference;
 }
 
+/// TODO(scheglov) document
+enum UnlinkedTokenKind { nothing, comment, keyword, simple, string }
+
+/// TODO(scheglov) document
+abstract class UnlinkedTokens extends base.SummaryClass {
+  /// The token that corresponds to this token, or `0` if this token is not
+  /// the first of a pair of matching tokens (such as parentheses).
+  @Id(0)
+  List<int> get endGroup;
+
+  /// Return `true` if this token is a synthetic token. A synthetic token is a
+  /// token that was introduced by the parser in order to recover from an error
+  /// in the code.
+  @Id(1)
+  List<bool> get isSynthetic;
+
+  @Id(2)
+  List<UnlinkedTokenKind> get kind;
+
+  @Id(3)
+  List<int> get length;
+
+  @Id(4)
+  List<String> get lexeme;
+
+  /// The next token in the token stream, `0` for [UnlinkedTokenType.EOF] or
+  /// the last comment token.
+  @Id(5)
+  List<int> get next;
+
+  @Id(6)
+  List<int> get offset;
+
+  /// The first comment token in the list of comments that precede this token,
+  /// or `0` if there are no comments preceding this token. Additional comments
+  /// can be reached by following the token stream using [next] until `0` is
+  /// reached.
+  @Id(7)
+  List<int> get precedingComment;
+
+  @Id(8)
+  List<UnlinkedTokenType> get type;
+}
+
+/// TODO(scheglov) document
+enum UnlinkedTokenType {
+  NOTHING,
+  ABSTRACT,
+  AMPERSAND,
+  AMPERSAND_AMPERSAND,
+  AMPERSAND_EQ,
+  AS,
+  ASSERT,
+  ASYNC,
+  AT,
+  AWAIT,
+  BACKPING,
+  BACKSLASH,
+  BANG,
+  BANG_EQ,
+  BAR,
+  BAR_BAR,
+  BAR_EQ,
+  BREAK,
+  CARET,
+  CARET_EQ,
+  CASE,
+  CATCH,
+  CLASS,
+  CLOSE_CURLY_BRACKET,
+  CLOSE_PAREN,
+  CLOSE_SQUARE_BRACKET,
+  COLON,
+  COMMA,
+  CONST,
+  CONTINUE,
+  COVARIANT,
+  DEFAULT,
+  DEFERRED,
+  DO,
+  DOUBLE,
+  DYNAMIC,
+  ELSE,
+  ENUM,
+  EOF,
+  EQ,
+  EQ_EQ,
+  EXPORT,
+  EXTENDS,
+  EXTERNAL,
+  FACTORY,
+  FALSE,
+  FINAL,
+  FINALLY,
+  FOR,
+  FUNCTION,
+  FUNCTION_KEYWORD,
+  GET,
+  GT,
+  GT_EQ,
+  GT_GT,
+  GT_GT_EQ,
+  HASH,
+  HEXADECIMAL,
+  HIDE,
+  IDENTIFIER,
+  IF,
+  IMPLEMENTS,
+  IMPORT,
+  IN,
+  INDEX,
+  INDEX_EQ,
+  INT,
+  INTERFACE,
+  IS,
+  LIBRARY,
+  LT,
+  LT_EQ,
+  LT_LT,
+  LT_LT_EQ,
+  MINUS,
+  MINUS_EQ,
+  MINUS_MINUS,
+  MIXIN,
+  MULTI_LINE_COMMENT,
+  NATIVE,
+  NEW,
+  NULL,
+  OF,
+  ON,
+  OPEN_CURLY_BRACKET,
+  OPEN_PAREN,
+  OPEN_SQUARE_BRACKET,
+  OPERATOR,
+  PART,
+  PATCH,
+  PERCENT,
+  PERCENT_EQ,
+  PERIOD,
+  PERIOD_PERIOD,
+  PERIOD_PERIOD_PERIOD,
+  PERIOD_PERIOD_PERIOD_QUESTION,
+  PLUS,
+  PLUS_EQ,
+  PLUS_PLUS,
+  QUESTION,
+  QUESTION_PERIOD,
+  QUESTION_QUESTION,
+  QUESTION_QUESTION_EQ,
+  RETHROW,
+  RETURN,
+  SCRIPT_TAG,
+  SEMICOLON,
+  SET,
+  SHOW,
+  SINGLE_LINE_COMMENT,
+  SLASH,
+  SLASH_EQ,
+  SOURCE,
+  STAR,
+  STAR_EQ,
+  STATIC,
+  STRING,
+  STRING_INTERPOLATION_EXPRESSION,
+  STRING_INTERPOLATION_IDENTIFIER,
+  SUPER,
+  SWITCH,
+  SYNC,
+  THIS,
+  THROW,
+  TILDE,
+  TILDE_SLASH,
+  TILDE_SLASH_EQ,
+  TRUE,
+  TRY,
+  TYPEDEF,
+  VAR,
+  VOID,
+  WHILE,
+  WITH,
+  YIELD,
+}
+
 /// Unlinked summary information about a typedef declaration.
 abstract class UnlinkedTypedef extends base.SummaryClass {
   /// Annotations for this typedef.
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index f0a1a4a..541cfe7 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -424,6 +424,12 @@
   @override
   bool get implicitCasts => true;
 
+  @override
+  bool get strictInference => false;
+
+  @override
+  bool get strictRawTypes => false;
+
   @deprecated
   @override
   bool get previewDart2 => true;
@@ -2536,7 +2542,9 @@
     expression = container.expression;
     if (_linker.getAst != null) {
       expression.accept(_typeResolverVisitor);
-      expression.accept(_variableResolverVisitor);
+    }
+    expression.accept(_variableResolverVisitor);
+    if (_linker.getAst != null) {
       expression.accept(_partialResolverVisitor);
     }
     expression.accept(_resolverVisitor);
@@ -5198,6 +5206,7 @@
         case UnlinkedExprOperation.makeUntypedList:
         case UnlinkedExprOperation.makeUntypedMap:
         case UnlinkedExprOperation.makeUntypedSet:
+        case UnlinkedExprOperation.makeUntypedSetOrMap:
           intPtr++;
           break;
         case UnlinkedExprOperation.makeTypedList:
@@ -5206,6 +5215,7 @@
           intPtr++;
           break;
         case UnlinkedExprOperation.makeTypedMap:
+        case UnlinkedExprOperation.makeTypedMap2:
           refPtr += 2;
           intPtr++;
           break;
diff --git a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
index 0fc9762..5e93786 100644
--- a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
@@ -344,10 +344,16 @@
           typeName.typeArguments != null);
     } else if (expr is ListLiteral) {
       _serializeListLiteral(expr);
+      // ignore: deprecated_member_use_from_same_package
     } else if (expr is MapLiteral) {
+      // ignore: deprecated_member_use_from_same_package
       _serializeMapLiteral(expr);
+      // ignore: deprecated_member_use_from_same_package
     } else if (expr is SetLiteral) {
+      // ignore: deprecated_member_use_from_same_package
       _serializeSetLiteral(expr);
+    } else if (expr is SetOrMapLiteral) {
+      _serializeSetOrMapLiteral(expr);
     } else if (expr is MethodInvocation) {
       _serializeMethodInvocation(expr);
     } else if (expr is BinaryExpression) {
@@ -536,10 +542,24 @@
     }
   }
 
+  void _serializeCollectionElement(CollectionElement element) {
+    if (element is Expression) {
+      _serialize(element);
+    } else if (element is MapLiteralEntry) {
+      _serialize(element.key);
+      _serialize(element.value);
+      operations.add(UnlinkedExprOperation.makeMapLiteralEntry);
+    } else {
+      // TODO(paulberry): Implement serialization for spread and control flow
+      //  elements.
+      throw new StateError('Unsupported CollectionElement: $element');
+    }
+  }
+
   void _serializeListLiteral(ListLiteral expr) {
     if (forConst || expr.typeArguments == null) {
-      List<Expression> elements = expr.elements;
-      elements.forEach(_serialize);
+      List<CollectionElement> elements = expr.elements2;
+      elements.forEach(_serializeCollectionElement);
       ints.add(elements.length);
     } else {
       ints.add(0);
@@ -553,6 +573,7 @@
     }
   }
 
+  @deprecated
   void _serializeMapLiteral(MapLiteral expr) {
     if (forConst || expr.typeArguments == null) {
       for (MapLiteralEntry entry in expr.entries) {
@@ -652,6 +673,7 @@
     }
   }
 
+  @deprecated
   void _serializeSetLiteral(SetLiteral expr) {
     if (forConst || expr.typeArguments == null) {
       List<Expression> elements = expr.elements;
@@ -669,6 +691,29 @@
     }
   }
 
+  void _serializeSetOrMapLiteral(SetOrMapLiteral expr) {
+    if (forConst || expr.typeArguments == null) {
+      for (CollectionElement element in expr.elements2) {
+        _serializeCollectionElement(element);
+      }
+      ints.add(expr.elements2.length);
+    } else {
+      ints.add(0);
+    }
+
+    List<TypeAnnotation> typeArguments = expr.typeArguments?.arguments;
+    if (typeArguments != null && typeArguments.length == 2) {
+      references.add(serializeType(typeArguments[0]));
+      references.add(serializeType(typeArguments[1]));
+      operations.add(UnlinkedExprOperation.makeTypedMap2);
+    } else if (typeArguments != null && typeArguments.length == 1) {
+      references.add(serializeType(typeArguments[0]));
+      operations.add(UnlinkedExprOperation.makeTypedSet);
+    } else {
+      operations.add(UnlinkedExprOperation.makeUntypedSetOrMap);
+    }
+  }
+
   void _serializeString(StringLiteral expr) {
     if (expr is AdjacentStrings) {
       if (expr.strings.every((string) => string is SimpleStringLiteral)) {
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
new file mode 100644
index 0000000..f8490e1
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -0,0 +1,1801 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/standard_ast_factory.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary2/reference.dart';
+
+/// Deserializer of fully resolved ASTs from flat buffers.
+class AstBinaryReader {
+  final Reference _nameRoot;
+  final LinkedNodeReference _linkedReferences;
+  final List<Reference> _references;
+
+  final UnlinkedTokens _tokensBinary;
+  final List<Token> _tokens;
+
+  AstBinaryReader(this._nameRoot, this._linkedReferences, this._tokensBinary)
+      : _references = List<Reference>(_linkedReferences.name.length),
+        _tokens = List<Token>(_tokensBinary.type.length);
+
+  AstNode readNode(LinkedNode data) {
+    if (data == null) return null;
+
+    switch (data.kind) {
+      case LinkedNodeKind.adjacentStrings:
+        return _read_adjacentStrings(data);
+      case LinkedNodeKind.annotation:
+        return _read_annotation(data);
+      case LinkedNodeKind.argumentList:
+        return _read_argumentList(data);
+      case LinkedNodeKind.asExpression:
+        return _read_asExpression(data);
+      case LinkedNodeKind.assertInitializer:
+        return _read_assertInitializer(data);
+      case LinkedNodeKind.assertStatement:
+        return _read_assertStatement(data);
+      case LinkedNodeKind.assignmentExpression:
+        return _read_assignmentExpression(data);
+      case LinkedNodeKind.awaitExpression:
+        return _read_awaitExpression(data);
+      case LinkedNodeKind.binaryExpression:
+        return _read_binaryExpression(data);
+      case LinkedNodeKind.block:
+        return _read_block(data);
+      case LinkedNodeKind.blockFunctionBody:
+        return _read_blockFunctionBody(data);
+      case LinkedNodeKind.booleanLiteral:
+        return _read_booleanLiteral(data);
+      case LinkedNodeKind.breakStatement:
+        return _read_breakStatement(data);
+      case LinkedNodeKind.cascadeExpression:
+        return _read_cascadeExpression(data);
+      case LinkedNodeKind.catchClause:
+        return _read_catchClause(data);
+      case LinkedNodeKind.classDeclaration:
+        return _read_classDeclaration(data);
+      case LinkedNodeKind.classTypeAlias:
+        return _read_classTypeAlias(data);
+      case LinkedNodeKind.comment:
+        return _read_comment(data);
+      case LinkedNodeKind.compilationUnit:
+        return _read_compilationUnit(data);
+      case LinkedNodeKind.conditionalExpression:
+        return _read_conditionalExpression(data);
+      case LinkedNodeKind.configuration:
+        return _read_configuration(data);
+      case LinkedNodeKind.constructorDeclaration:
+        return _read_constructorDeclaration(data);
+      case LinkedNodeKind.constructorFieldInitializer:
+        return _read_constructorFieldInitializer(data);
+      case LinkedNodeKind.constructorName:
+        return _read_constructorName(data);
+      case LinkedNodeKind.continueStatement:
+        return _read_continueStatement(data);
+      case LinkedNodeKind.declaredIdentifier:
+        return _read_declaredIdentifier(data);
+      case LinkedNodeKind.defaultFormalParameter:
+        return _read_defaultFormalParameter(data);
+      case LinkedNodeKind.doStatement:
+        return _read_doStatement(data);
+      case LinkedNodeKind.dottedName:
+        return _read_dottedName(data);
+      case LinkedNodeKind.doubleLiteral:
+        return _read_doubleLiteral(data);
+      case LinkedNodeKind.emptyFunctionBody:
+        return _read_emptyFunctionBody(data);
+      case LinkedNodeKind.emptyStatement:
+        return _read_emptyStatement(data);
+      case LinkedNodeKind.enumConstantDeclaration:
+        return _read_enumConstantDeclaration(data);
+      case LinkedNodeKind.enumDeclaration:
+        return _read_enumDeclaration(data);
+      case LinkedNodeKind.exportDirective:
+        return _read_exportDirective(data);
+      case LinkedNodeKind.expressionFunctionBody:
+        return _read_expressionFunctionBody(data);
+      case LinkedNodeKind.expressionStatement:
+        return _read_expressionStatement(data);
+      case LinkedNodeKind.extendsClause:
+        return _read_extendsClause(data);
+      case LinkedNodeKind.fieldDeclaration:
+        return _read_fieldDeclaration(data);
+      case LinkedNodeKind.fieldFormalParameter:
+        return _read_fieldFormalParameter(data);
+      case LinkedNodeKind.forEachPartsWithDeclaration:
+        return _read_forEachPartsWithDeclaration(data);
+      case LinkedNodeKind.forEachPartsWithIdentifier:
+        return _read_forEachPartsWithIdentifier(data);
+      case LinkedNodeKind.forElement:
+        return _read_forElement(data);
+      case LinkedNodeKind.forPartsWithExpression:
+        return _read_forPartsWithExpression(data);
+      case LinkedNodeKind.forPartsWithDeclarations:
+        return _read_forPartsWithDeclarations(data);
+      case LinkedNodeKind.forStatement:
+        return _read_forStatement(data);
+      case LinkedNodeKind.formalParameterList:
+        return _read_formalParameterList(data);
+      case LinkedNodeKind.functionDeclaration:
+        return _read_functionDeclaration(data);
+      case LinkedNodeKind.functionDeclarationStatement:
+        return _read_functionDeclarationStatement(data);
+      case LinkedNodeKind.functionExpression:
+        return _read_functionExpression(data);
+      case LinkedNodeKind.functionExpressionInvocation:
+        return _read_functionExpressionInvocation(data);
+      case LinkedNodeKind.functionTypeAlias:
+        return _read_functionTypeAlias(data);
+      case LinkedNodeKind.functionTypedFormalParameter:
+        return _read_functionTypedFormalParameter(data);
+      case LinkedNodeKind.genericFunctionType:
+        return _read_genericFunctionType(data);
+      case LinkedNodeKind.genericTypeAlias:
+        return _read_genericTypeAlias(data);
+      case LinkedNodeKind.hideCombinator:
+        return _read_hideCombinator(data);
+      case LinkedNodeKind.ifElement:
+        return _read_ifElement(data);
+      case LinkedNodeKind.ifStatement:
+        return _read_ifStatement(data);
+      case LinkedNodeKind.implementsClause:
+        return _read_implementsClause(data);
+      case LinkedNodeKind.importDirective:
+        return _read_importDirective(data);
+      case LinkedNodeKind.indexExpression:
+        return _read_indexExpression(data);
+      case LinkedNodeKind.instanceCreationExpression:
+        return _read_instanceCreationExpression(data);
+      case LinkedNodeKind.integerLiteral:
+        return _read_integerLiteral(data);
+      case LinkedNodeKind.interpolationString:
+        return _read_interpolationString(data);
+      case LinkedNodeKind.interpolationExpression:
+        return _read_interpolationExpression(data);
+      case LinkedNodeKind.isExpression:
+        return _read_isExpression(data);
+      case LinkedNodeKind.label:
+        return _read_label(data);
+      case LinkedNodeKind.labeledStatement:
+        return _read_labeledStatement(data);
+      case LinkedNodeKind.libraryDirective:
+        return _read_libraryDirective(data);
+      case LinkedNodeKind.libraryIdentifier:
+        return _read_libraryIdentifier(data);
+      case LinkedNodeKind.listLiteral:
+        return _read_listLiteral(data);
+      case LinkedNodeKind.mapLiteralEntry:
+        return _read_mapLiteralEntry(data);
+      case LinkedNodeKind.methodDeclaration:
+        return _read_methodDeclaration(data);
+      case LinkedNodeKind.methodInvocation:
+        return _read_methodInvocation(data);
+      case LinkedNodeKind.mixinDeclaration:
+        return _read_mixinDeclaration(data);
+      case LinkedNodeKind.namedExpression:
+        return _read_namedExpression(data);
+      case LinkedNodeKind.nullLiteral:
+        return _read_nullLiteral(data);
+      case LinkedNodeKind.onClause:
+        return _read_onClause(data);
+      case LinkedNodeKind.parenthesizedExpression:
+        return _read_parenthesizedExpression(data);
+      case LinkedNodeKind.partDirective:
+        return _read_partDirective(data);
+      case LinkedNodeKind.partOfDirective:
+        return _read_partOfDirective(data);
+      case LinkedNodeKind.postfixExpression:
+        return _read_postfixExpression(data);
+      case LinkedNodeKind.prefixExpression:
+        return _read_prefixExpression(data);
+      case LinkedNodeKind.propertyAccess:
+        return _read_propertyAccess(data);
+      case LinkedNodeKind.prefixedIdentifier:
+        return _read_prefixedIdentifier(data);
+      case LinkedNodeKind.redirectingConstructorInvocation:
+        return _read_redirectingConstructorInvocation(data);
+      case LinkedNodeKind.rethrowExpression:
+        return _read_rethrowExpression(data);
+      case LinkedNodeKind.returnStatement:
+        return _read_returnStatement(data);
+      case LinkedNodeKind.scriptTag:
+        return _read_scriptTag(data);
+      case LinkedNodeKind.setOrMapLiteral:
+        return _read_setOrMapLiteral(data);
+      case LinkedNodeKind.showCombinator:
+        return _read_showCombinator(data);
+      case LinkedNodeKind.simpleFormalParameter:
+        return _read_simpleFormalParameter(data);
+      case LinkedNodeKind.simpleIdentifier:
+        return _read_simpleIdentifier(data);
+      case LinkedNodeKind.simpleStringLiteral:
+        return _read_simpleStringLiteral(data);
+      case LinkedNodeKind.spreadElement:
+        return _read_spreadElement(data);
+      case LinkedNodeKind.stringInterpolation:
+        return _read_stringInterpolation(data);
+      case LinkedNodeKind.superConstructorInvocation:
+        return _read_superConstructorInvocation(data);
+      case LinkedNodeKind.superExpression:
+        return _read_superExpression(data);
+      case LinkedNodeKind.switchCase:
+        return _read_switchCase(data);
+      case LinkedNodeKind.switchDefault:
+        return _read_switchDefault(data);
+      case LinkedNodeKind.switchStatement:
+        return _read_switchStatement(data);
+      case LinkedNodeKind.symbolLiteral:
+        return _read_symbolLiteral(data);
+      case LinkedNodeKind.thisExpression:
+        return _read_thisExpression(data);
+      case LinkedNodeKind.throwExpression:
+        return _read_throwExpression(data);
+      case LinkedNodeKind.topLevelVariableDeclaration:
+        return _read_topLevelVariableDeclaration(data);
+      case LinkedNodeKind.tryStatement:
+        return _read_tryStatement(data);
+      case LinkedNodeKind.typeArgumentList:
+        return _read_typeArgumentList(data);
+      case LinkedNodeKind.typeName:
+        return _read_typeName(data);
+      case LinkedNodeKind.typeParameter:
+        return _read_typeParameter(data);
+      case LinkedNodeKind.typeParameterList:
+        return _read_typeParameterList(data);
+      case LinkedNodeKind.variableDeclaration:
+        return _read_variableDeclaration(data);
+      case LinkedNodeKind.variableDeclarationList:
+        return _read_variableDeclarationList(data);
+      case LinkedNodeKind.variableDeclarationStatement:
+        return _read_variableDeclarationStatement(data);
+      case LinkedNodeKind.whileStatement:
+        return _read_whileStatement(data);
+      case LinkedNodeKind.withClause:
+        return _read_withClause(data);
+      case LinkedNodeKind.yieldStatement:
+        return _read_yieldStatement(data);
+      default:
+        throw UnimplementedError('Expression kind: ${data.kind}');
+    }
+  }
+
+  CommentToken _getCommentToken(int index) {
+    var result = _getToken(index);
+    var token = result;
+    while (true) {
+      index = _tokensBinary.next[index];
+      if (index == 0) return result;
+
+      var nextToken = _getToken(index);
+      token.next = nextToken;
+      token = nextToken;
+    }
+  }
+
+  T _getElement<T extends Element>(int index) {
+    return _getReferenceByIndex(index)?.element;
+  }
+
+  List<T> _getElements<T extends Element>(List<int> indexList) {
+    var result = List<T>(indexList.length);
+    for (var i = 0; i < indexList.length; ++i) {
+      var index = indexList[i];
+      result[i] = _getElement(index);
+    }
+    return result;
+  }
+
+  Reference _getReferenceByIndex(int index) {
+    var reference = _references[index];
+    if (reference != null) return reference;
+
+    if (index == 0) {
+      _references[index] = _nameRoot;
+      return _nameRoot;
+    }
+
+    var parentIndex = _linkedReferences.parent[index];
+    var parent = _getReferenceByIndex(parentIndex);
+    if (parent == null) return null;
+
+    var name = _linkedReferences.name[index];
+    reference = parent[name];
+    _references[index] = reference;
+
+    return reference;
+  }
+
+  Token _getToken(int index) {
+    var token = _tokens[index];
+    if (token == null) {
+      var kind = _tokensBinary.kind[index];
+      switch (kind) {
+        case UnlinkedTokenKind.nothing:
+          return null;
+        case UnlinkedTokenKind.comment:
+          return CommentToken(
+            _binaryToAstTokenType(_tokensBinary.type[index]),
+            _tokensBinary.lexeme[index],
+            _tokensBinary.offset[index],
+          );
+        case UnlinkedTokenKind.keyword:
+          return KeywordToken(
+            _binaryToAstTokenType(_tokensBinary.type[index]),
+            _tokensBinary.offset[index],
+            _getCommentToken(_tokensBinary.precedingComment[index]),
+          );
+        case UnlinkedTokenKind.simple:
+          return SimpleToken(
+            _binaryToAstTokenType(_tokensBinary.type[index]),
+            _tokensBinary.offset[index],
+            _getCommentToken(_tokensBinary.precedingComment[index]),
+          );
+        case UnlinkedTokenKind.string:
+          return StringToken(
+            _binaryToAstTokenType(_tokensBinary.type[index]),
+            _tokensBinary.lexeme[index],
+            _tokensBinary.offset[index],
+            _getCommentToken(_tokensBinary.precedingComment[index]),
+          );
+        default:
+          throw UnimplementedError('Token kind: $kind');
+      }
+    }
+    return token;
+  }
+
+  List<Token> _getTokens(List<int> indexList) {
+    var result = List<Token>(indexList.length);
+    for (var i = 0; i < indexList.length; ++i) {
+      var index = indexList[i];
+      result[i] = _getToken(index);
+    }
+    return result;
+  }
+
+  AdjacentStrings _read_adjacentStrings(LinkedNode data) {
+    return astFactory.adjacentStrings(
+      _readNodeList(data.adjacentStrings_strings),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  Annotation _read_annotation(LinkedNode data) {
+    return astFactory.annotation(
+      _getToken(data.annotation_atSign),
+      readNode(data.annotation_name),
+      _getToken(data.annotation_period),
+      readNode(data.annotation_constructorName),
+      readNode(data.annotation_arguments),
+    );
+  }
+
+  ArgumentList _read_argumentList(LinkedNode data) {
+    return astFactory.argumentList(
+      _getToken(data.argumentList_leftParenthesis),
+      _readNodeList(data.argumentList_arguments),
+      _getToken(data.argumentList_rightParenthesis),
+    );
+  }
+
+  AsExpression _read_asExpression(LinkedNode data) {
+    return astFactory.asExpression(
+      readNode(data.asExpression_expression),
+      _getToken(data.asExpression_asOperator),
+      readNode(data.asExpression_type),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  AssertInitializer _read_assertInitializer(LinkedNode data) {
+    return astFactory.assertInitializer(
+      _getToken(data.assertInitializer_assertKeyword),
+      _getToken(data.assertInitializer_leftParenthesis),
+      readNode(data.assertInitializer_condition),
+      _getToken(data.assertInitializer_comma),
+      readNode(data.assertInitializer_message),
+      _getToken(data.assertInitializer_rightParenthesis),
+    );
+  }
+
+  AssertStatement _read_assertStatement(LinkedNode data) {
+    return astFactory.assertStatement(
+      _getToken(data.assertStatement_assertKeyword),
+      _getToken(data.assertStatement_leftParenthesis),
+      readNode(data.assertStatement_condition),
+      _getToken(data.assertStatement_comma),
+      readNode(data.assertStatement_message),
+      _getToken(data.assertStatement_rightParenthesis),
+      _getToken(data.assertStatement_semicolon),
+    );
+  }
+
+  AssignmentExpression _read_assignmentExpression(LinkedNode data) {
+    return astFactory.assignmentExpression(
+      readNode(data.assignmentExpression_leftHandSide),
+      _getToken(data.assignmentExpression_operator),
+      readNode(data.assignmentExpression_rightHandSide),
+    )
+      ..staticElement = _getElement(data.assignmentExpression_element)
+      ..staticType = _readType(data.expression_type);
+  }
+
+  AwaitExpression _read_awaitExpression(LinkedNode data) {
+    return astFactory.awaitExpression(
+      _getToken(data.awaitExpression_awaitKeyword),
+      readNode(data.awaitExpression_expression),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  BinaryExpression _read_binaryExpression(LinkedNode data) {
+    return astFactory.binaryExpression(
+      readNode(data.binaryExpression_leftOperand),
+      _getToken(data.binaryExpression_operator),
+      readNode(data.binaryExpression_rightOperand),
+    )
+      ..staticElement = _getElement(data.binaryExpression_element)
+      ..staticType = _readType(data.expression_type);
+  }
+
+  Block _read_block(LinkedNode data) {
+    return astFactory.block(
+      _getToken(data.block_leftBracket),
+      _readNodeList(data.block_statements),
+      _getToken(data.block_rightBracket),
+    );
+  }
+
+  BlockFunctionBody _read_blockFunctionBody(LinkedNode data) {
+    return astFactory.blockFunctionBody(
+      _getToken(data.blockFunctionBody_keyword),
+      _getToken(data.blockFunctionBody_star),
+      readNode(data.blockFunctionBody_block),
+    );
+  }
+
+  BooleanLiteral _read_booleanLiteral(LinkedNode data) {
+    return astFactory.booleanLiteral(
+      _getToken(data.booleanLiteral_literal),
+      data.booleanLiteral_value,
+    )..staticType = _readType(data.expression_type);
+  }
+
+  BreakStatement _read_breakStatement(LinkedNode data) {
+    return astFactory.breakStatement(
+      _getToken(data.breakStatement_breakKeyword),
+      readNode(data.breakStatement_label),
+      _getToken(data.breakStatement_semicolon),
+    );
+  }
+
+  CascadeExpression _read_cascadeExpression(LinkedNode data) {
+    return astFactory.cascadeExpression(
+      readNode(data.cascadeExpression_target),
+      _readNodeList(data.cascadeExpression_sections),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  CatchClause _read_catchClause(LinkedNode data) {
+    return astFactory.catchClause(
+      _getToken(data.catchClause_onKeyword),
+      readNode(data.catchClause_exceptionType),
+      _getToken(data.catchClause_catchKeyword),
+      _getToken(data.catchClause_leftParenthesis),
+      readNode(data.catchClause_exceptionParameter),
+      _getToken(data.catchClause_comma),
+      readNode(data.catchClause_stackTraceParameter),
+      _getToken(data.catchClause_rightParenthesis),
+      readNode(data.catchClause_body),
+    );
+  }
+
+  ClassDeclaration _read_classDeclaration(LinkedNode data) {
+    return astFactory.classDeclaration(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.classDeclaration_abstractKeyword),
+      _getToken(data.classDeclaration_classKeyword),
+      readNode(data.namedCompilationUnitMember_name),
+      readNode(data.classOrMixinDeclaration_typeParameters),
+      readNode(data.classDeclaration_extendsClause),
+      readNode(data.classDeclaration_withClause),
+      readNode(data.classOrMixinDeclaration_implementsClause),
+      _getToken(data.classOrMixinDeclaration_leftBracket),
+      _readNodeList(data.classOrMixinDeclaration_members),
+      _getToken(data.classOrMixinDeclaration_rightBracket),
+    );
+  }
+
+  ClassTypeAlias _read_classTypeAlias(LinkedNode data) {
+    return astFactory.classTypeAlias(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.typeAlias_typedefKeyword),
+      readNode(data.namedCompilationUnitMember_name),
+      readNode(data.classTypeAlias_typeParameters),
+      _getToken(data.classTypeAlias_equals),
+      _getToken(data.classTypeAlias_abstractKeyword),
+      readNode(data.classTypeAlias_superclass),
+      readNode(data.classTypeAlias_withClause),
+      readNode(data.classTypeAlias_implementsClause),
+      _getToken(data.typeAlias_semicolon),
+    );
+  }
+
+  Comment _read_comment(LinkedNode data) {
+    var tokens = _getTokens(data.comment_tokens);
+    switch (data.comment_type) {
+      case LinkedNodeCommentType.block:
+        return astFactory.endOfLineComment(
+          tokens,
+        );
+      case LinkedNodeCommentType.documentation:
+        return astFactory.documentationComment(
+          tokens,
+          // TODO(scheglov) references
+        );
+      case LinkedNodeCommentType.endOfLine:
+        return astFactory.endOfLineComment(
+          tokens,
+        );
+      default:
+        throw StateError('${data.comment_type}');
+    }
+  }
+
+  CompilationUnit _read_compilationUnit(LinkedNode data) {
+    return astFactory.compilationUnit(
+      _getToken(data.compilationUnit_beginToken),
+      readNode(data.compilationUnit_scriptTag),
+      _readNodeList(data.compilationUnit_directives),
+      _readNodeList(data.compilationUnit_declarations),
+      _getToken(data.compilationUnit_endToken),
+    );
+  }
+
+  ConditionalExpression _read_conditionalExpression(LinkedNode data) {
+    return astFactory.conditionalExpression(
+      readNode(data.conditionalExpression_condition),
+      _getToken(data.conditionalExpression_question),
+      readNode(data.conditionalExpression_thenExpression),
+      _getToken(data.conditionalExpression_colon),
+      readNode(data.conditionalExpression_elseExpression),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  Configuration _read_configuration(LinkedNode data) {
+    return astFactory.configuration(
+      _getToken(data.configuration_ifKeyword),
+      _getToken(data.configuration_leftParenthesis),
+      readNode(data.configuration_name),
+      _getToken(data.configuration_equalToken),
+      readNode(data.configuration_value),
+      _getToken(data.configuration_rightParenthesis),
+      readNode(data.configuration_uri),
+    );
+  }
+
+  ConstructorDeclaration _read_constructorDeclaration(LinkedNode data) {
+    return astFactory.constructorDeclaration(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.constructorDeclaration_externalKeyword),
+      _getToken(data.constructorDeclaration_constKeyword),
+      _getToken(data.constructorDeclaration_factoryKeyword),
+      readNode(data.constructorDeclaration_returnType),
+      _getToken(data.constructorDeclaration_period),
+      readNode(data.constructorDeclaration_name),
+      readNode(data.constructorDeclaration_parameters),
+      _getToken(data.constructorDeclaration_separator),
+      _readNodeList(data.constructorDeclaration_initializers),
+      readNode(data.constructorDeclaration_redirectedConstructor),
+      readNode(data.constructorDeclaration_body),
+    );
+  }
+
+  ConstructorFieldInitializer _read_constructorFieldInitializer(
+      LinkedNode data) {
+    return astFactory.constructorFieldInitializer(
+      _getToken(data.constructorFieldInitializer_thisKeyword),
+      _getToken(data.constructorFieldInitializer_period),
+      readNode(data.constructorFieldInitializer_fieldName),
+      _getToken(data.constructorFieldInitializer_equals),
+      readNode(data.constructorFieldInitializer_expression),
+    );
+  }
+
+  ConstructorName _read_constructorName(LinkedNode data) {
+    return astFactory.constructorName(
+      readNode(data.constructorName_type),
+      _getToken(data.constructorName_period),
+      readNode(data.constructorName_name),
+    )..staticElement = _getElement(data.constructorName_element);
+  }
+
+  ContinueStatement _read_continueStatement(LinkedNode data) {
+    return astFactory.continueStatement(
+      _getToken(data.continueStatement_continueKeyword),
+      readNode(data.continueStatement_label),
+      _getToken(data.continueStatement_semicolon),
+    );
+  }
+
+  DeclaredIdentifier _read_declaredIdentifier(LinkedNode data) {
+    return astFactory.declaredIdentifier(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.declaredIdentifier_keyword),
+      readNode(data.declaredIdentifier_type),
+      readNode(data.declaredIdentifier_identifier),
+    );
+  }
+
+  DefaultFormalParameter _read_defaultFormalParameter(LinkedNode data) {
+    return astFactory.defaultFormalParameter(
+      readNode(data.defaultFormalParameter_parameter),
+      data.defaultFormalParameter_isNamed
+          ? ParameterKind.NAMED
+          : ParameterKind.POSITIONAL,
+      _getToken(data.defaultFormalParameter_separator),
+      readNode(data.defaultFormalParameter_defaultValue),
+    );
+  }
+
+  DoStatement _read_doStatement(LinkedNode data) {
+    return astFactory.doStatement(
+      _getToken(data.doStatement_doKeyword),
+      readNode(data.doStatement_body),
+      _getToken(data.doStatement_whileKeyword),
+      _getToken(data.doStatement_leftParenthesis),
+      readNode(data.doStatement_condition),
+      _getToken(data.doStatement_rightParenthesis),
+      _getToken(data.doStatement_semicolon),
+    );
+  }
+
+  DottedName _read_dottedName(LinkedNode data) {
+    return astFactory.dottedName(
+      _readNodeList(data.dottedName_components),
+    );
+  }
+
+  DoubleLiteral _read_doubleLiteral(LinkedNode data) {
+    return astFactory.doubleLiteral(
+      _getToken(data.doubleLiteral_literal),
+      data.doubleLiteral_value,
+    )..staticType = _readType(data.expression_type);
+  }
+
+  EmptyFunctionBody _read_emptyFunctionBody(LinkedNode data) {
+    return astFactory.emptyFunctionBody(
+      _getToken(data.emptyFunctionBody_semicolon),
+    );
+  }
+
+  EmptyStatement _read_emptyStatement(LinkedNode data) {
+    return astFactory.emptyStatement(
+      _getToken(data.emptyStatement_semicolon),
+    );
+  }
+
+  EnumConstantDeclaration _read_enumConstantDeclaration(LinkedNode data) {
+    return astFactory.enumConstantDeclaration(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      readNode(data.enumConstantDeclaration_name),
+    );
+  }
+
+  EnumDeclaration _read_enumDeclaration(LinkedNode data) {
+    return astFactory.enumDeclaration(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.enumDeclaration_enumKeyword),
+      readNode(data.namedCompilationUnitMember_name),
+      _getToken(data.enumDeclaration_leftBracket),
+      _readNodeList(data.enumDeclaration_constants),
+      _getToken(data.enumDeclaration_rightBracket),
+    );
+  }
+
+  ExportDirective _read_exportDirective(LinkedNode data) {
+    return astFactory.exportDirective(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.directive_keyword),
+      readNode(data.uriBasedDirective_uri),
+      _readNodeList(data.namespaceDirective_configurations),
+      _readNodeList(data.namespaceDirective_combinators),
+      _getToken(data.namespaceDirective_semicolon),
+    );
+  }
+
+  ExpressionFunctionBody _read_expressionFunctionBody(LinkedNode data) {
+    return astFactory.expressionFunctionBody(
+      _getToken(data.expressionFunctionBody_keyword),
+      _getToken(data.expressionFunctionBody_arrow),
+      readNode(data.expressionFunctionBody_expression),
+      _getToken(data.expressionFunctionBody_semicolon),
+    );
+  }
+
+  ExpressionStatement _read_expressionStatement(LinkedNode data) {
+    return astFactory.expressionStatement(
+      readNode(data.expressionStatement_expression),
+      _getToken(data.expressionStatement_semicolon),
+    );
+  }
+
+  ExtendsClause _read_extendsClause(LinkedNode data) {
+    return astFactory.extendsClause(
+      _getToken(data.extendsClause_extendsKeyword),
+      readNode(data.extendsClause_superclass),
+    );
+  }
+
+  FieldDeclaration _read_fieldDeclaration(LinkedNode data) {
+    return astFactory.fieldDeclaration2(
+      comment: readNode(data.annotatedNode_comment),
+      covariantKeyword: _getToken(data.fieldDeclaration_covariantKeyword),
+      fieldList: readNode(data.fieldDeclaration_fields),
+      metadata: _readNodeList(data.annotatedNode_metadata),
+      semicolon: _getToken(data.fieldDeclaration_semicolon),
+      staticKeyword: _getToken(data.fieldDeclaration_staticKeyword),
+    );
+  }
+
+  FieldFormalParameter _read_fieldFormalParameter(LinkedNode data) {
+    return astFactory.fieldFormalParameter2(
+      identifier: readNode(data.normalFormalParameter_identifier),
+      period: _getToken(data.fieldFormalParameter_period),
+      thisKeyword: _getToken(data.fieldFormalParameter_thisKeyword),
+      covariantKeyword: _getToken(data.normalFormalParameter_covariantKeyword),
+      typeParameters: readNode(data.fieldFormalParameter_typeParameters),
+      keyword: _getToken(data.fieldFormalParameter_keyword),
+      metadata: _readNodeList(data.normalFormalParameter_metadata),
+      comment: readNode(data.normalFormalParameter_comment),
+      type: readNode(data.fieldFormalParameter_type),
+      parameters: readNode(data.fieldFormalParameter_formalParameters),
+    );
+  }
+
+  ForEachPartsWithDeclaration _read_forEachPartsWithDeclaration(
+      LinkedNode data) {
+    return astFactory.forEachPartsWithDeclaration(
+      inKeyword: _getToken(data.forEachParts_inKeyword),
+      iterable: readNode(data.forEachParts_iterable),
+      loopVariable: readNode(data.forEachPartsWithDeclaration_loopVariable),
+    );
+  }
+
+  ForEachPartsWithIdentifier _read_forEachPartsWithIdentifier(LinkedNode data) {
+    return astFactory.forEachPartsWithIdentifier(
+      inKeyword: _getToken(data.forEachParts_inKeyword),
+      iterable: readNode(data.forEachParts_iterable),
+      identifier: readNode(data.forEachPartsWithIdentifier_identifier),
+    );
+  }
+
+  ForElement _read_forElement(LinkedNode data) {
+    return astFactory.forElement(
+      awaitKeyword: _getToken(data.forMixin_awaitKeyword),
+      body: readNode(data.forElement_body),
+      forKeyword: _getToken(data.forMixin_forKeyword),
+      forLoopParts: readNode(data.forMixin_forLoopParts),
+      leftParenthesis: _getToken(data.forMixin_leftParenthesis),
+      rightParenthesis: _getToken(data.forMixin_rightParenthesis),
+    );
+  }
+
+  FormalParameterList _read_formalParameterList(LinkedNode data) {
+    return astFactory.formalParameterList(
+      _getToken(data.formalParameterList_leftParenthesis),
+      _readNodeList(data.formalParameterList_parameters),
+      _getToken(data.formalParameterList_leftDelimiter),
+      _getToken(data.formalParameterList_rightDelimiter),
+      _getToken(data.formalParameterList_rightParenthesis),
+    );
+  }
+
+  ForPartsWithDeclarations _read_forPartsWithDeclarations(LinkedNode data) {
+    return astFactory.forPartsWithDeclarations(
+      condition: readNode(data.forParts_condition),
+      leftSeparator: _getToken(data.forParts_leftSeparator),
+      rightSeparator: _getToken(data.forParts_rightSeparator),
+      updaters: _readNodeList(data.forParts_updaters),
+      variables: readNode(data.forPartsWithDeclarations_variables),
+    );
+  }
+
+  ForPartsWithExpression _read_forPartsWithExpression(LinkedNode data) {
+    return astFactory.forPartsWithExpression(
+      condition: readNode(data.forParts_condition),
+      initialization: readNode(data.forPartsWithExpression_initialization),
+      leftSeparator: _getToken(data.forParts_leftSeparator),
+      rightSeparator: _getToken(data.forParts_rightSeparator),
+      updaters: _readNodeList(data.forParts_updaters),
+    );
+  }
+
+  ForStatement2 _read_forStatement(LinkedNode data) {
+    return astFactory.forStatement2(
+      forKeyword: _getToken(data.forMixin_forKeyword),
+      leftParenthesis: _getToken(data.forMixin_leftParenthesis),
+      forLoopParts: readNode(data.forMixin_forLoopParts),
+      rightParenthesis: _getToken(data.forMixin_rightParenthesis),
+      body: readNode(data.forStatement_body),
+    );
+  }
+
+  FunctionDeclaration _read_functionDeclaration(LinkedNode data) {
+    return astFactory.functionDeclaration(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.functionDeclaration_externalKeyword),
+      readNode(data.functionDeclaration_returnType),
+      _getToken(data.functionDeclaration_propertyKeyword),
+      readNode(data.namedCompilationUnitMember_name),
+      readNode(data.functionDeclaration_functionExpression),
+    );
+  }
+
+  FunctionDeclarationStatement _read_functionDeclarationStatement(
+      LinkedNode data) {
+    return astFactory.functionDeclarationStatement(
+      readNode(data.functionDeclarationStatement_functionDeclaration),
+    );
+  }
+
+  FunctionExpression _read_functionExpression(LinkedNode data) {
+    return astFactory.functionExpression(
+      readNode(data.functionExpression_typeParameters),
+      readNode(data.functionExpression_formalParameters),
+      readNode(data.functionExpression_body),
+    );
+  }
+
+  FunctionExpressionInvocation _read_functionExpressionInvocation(
+      LinkedNode data) {
+    return astFactory.functionExpressionInvocation(
+      readNode(data.functionExpressionInvocation_function),
+      readNode(data.invocationExpression_typeArguments),
+      readNode(data.invocationExpression_arguments),
+    )..staticInvokeType = _readType(data.invocationExpression_invokeType);
+  }
+
+  FunctionTypeAlias _read_functionTypeAlias(LinkedNode data) {
+    return astFactory.functionTypeAlias(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.typeAlias_typedefKeyword),
+      readNode(data.functionTypeAlias_returnType),
+      readNode(data.namedCompilationUnitMember_name),
+      readNode(data.functionTypeAlias_typeParameters),
+      readNode(data.functionTypeAlias_formalParameters),
+      _getToken(data.typeAlias_semicolon),
+    );
+  }
+
+  FunctionTypedFormalParameter _read_functionTypedFormalParameter(
+      LinkedNode data) {
+    return astFactory.functionTypedFormalParameter2(
+      identifier: readNode(data.normalFormalParameter_identifier),
+      parameters: readNode(data.functionTypedFormalParameter_formalParameters),
+      returnType: readNode(data.functionTypedFormalParameter_returnType),
+      covariantKeyword: _getToken(data.normalFormalParameter_covariantKeyword),
+      comment: readNode(data.normalFormalParameter_comment),
+      metadata: _readNodeList(data.normalFormalParameter_metadata),
+      typeParameters:
+          readNode(data.functionTypedFormalParameter_typeParameters),
+    );
+  }
+
+  GenericFunctionType _read_genericFunctionType(LinkedNode data) {
+    return astFactory.genericFunctionType(
+      readNode(data.genericFunctionType_returnType),
+      _getToken(data.genericFunctionType_functionKeyword),
+      readNode(data.genericFunctionType_typeParameters),
+      readNode(data.genericFunctionType_formalParameters),
+      question: _getToken(data.genericFunctionType_question),
+    );
+  }
+
+  GenericTypeAlias _read_genericTypeAlias(LinkedNode data) {
+    return astFactory.genericTypeAlias(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.typeAlias_typedefKeyword),
+      readNode(data.namedCompilationUnitMember_name),
+      readNode(data.genericTypeAlias_typeParameters),
+      _getToken(data.genericTypeAlias_equals),
+      readNode(data.genericTypeAlias_functionType),
+      _getToken(data.typeAlias_semicolon),
+    );
+  }
+
+  HideCombinator _read_hideCombinator(LinkedNode data) {
+    return astFactory.hideCombinator(
+      _getToken(data.combinator_keyword),
+      _readNodeList(data.hideCombinator_hiddenNames),
+    );
+  }
+
+  IfElement _read_ifElement(LinkedNode data) {
+    return astFactory.ifElement(
+      condition: readNode(data.ifMixin_condition),
+      elseElement: readNode(data.ifElement_elseElement),
+      elseKeyword: _getToken(data.ifMixin_elseKeyword),
+      ifKeyword: _getToken(data.ifMixin_ifKeyword),
+      leftParenthesis: _getToken(data.ifMixin_leftParenthesis),
+      rightParenthesis: _getToken(data.ifMixin_rightParenthesis),
+      thenElement: readNode(data.ifElement_thenElement),
+    );
+  }
+
+  IfStatement _read_ifStatement(LinkedNode data) {
+    return astFactory.ifStatement(
+      _getToken(data.ifMixin_ifKeyword),
+      _getToken(data.ifMixin_leftParenthesis),
+      readNode(data.ifMixin_condition),
+      _getToken(data.ifMixin_rightParenthesis),
+      readNode(data.ifStatement_thenStatement),
+      _getToken(data.ifMixin_elseKeyword),
+      readNode(data.ifStatement_elseStatement),
+    );
+  }
+
+  ImplementsClause _read_implementsClause(LinkedNode data) {
+    return astFactory.implementsClause(
+      _getToken(data.implementsClause_implementsKeyword),
+      _readNodeList(data.implementsClause_interfaces),
+    );
+  }
+
+  ImportDirective _read_importDirective(LinkedNode data) {
+    return astFactory.importDirective(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.directive_keyword),
+      readNode(data.uriBasedDirective_uri),
+      _readNodeList(data.namespaceDirective_configurations),
+      _getToken(data.importDirective_deferredKeyword),
+      _getToken(data.importDirective_asKeyword),
+      readNode(data.importDirective_prefix),
+      _readNodeList(data.namespaceDirective_combinators),
+      _getToken(data.namespaceDirective_semicolon),
+    );
+  }
+
+  IndexExpression _read_indexExpression(LinkedNode data) {
+    return astFactory.indexExpressionForTarget(
+      readNode(data.indexExpression_target),
+      _getToken(data.indexExpression_leftBracket),
+      readNode(data.indexExpression_index),
+      _getToken(data.indexExpression_rightBracket),
+    )
+      ..staticElement = _getElement(data.indexExpression_element)
+      ..staticType = _readType(data.expression_type);
+  }
+
+  InstanceCreationExpression _read_instanceCreationExpression(LinkedNode data) {
+    return astFactory.instanceCreationExpression(
+      _getToken(data.instanceCreationExpression_keyword),
+      readNode(data.instanceCreationExpression_constructorName),
+      readNode(data.instanceCreationExpression_arguments),
+      typeArguments: readNode(data.instanceCreationExpression_typeArguments),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  IntegerLiteral _read_integerLiteral(LinkedNode data) {
+    return astFactory.integerLiteral(
+      _getToken(data.integerLiteral_literal),
+      data.integerLiteral_value,
+    )..staticType = _readType(data.expression_type);
+  }
+
+  InterpolationExpression _read_interpolationExpression(LinkedNode data) {
+    return astFactory.interpolationExpression(
+      _getToken(data.interpolationExpression_leftBracket),
+      readNode(data.interpolationExpression_expression),
+      _getToken(data.interpolationExpression_rightBracket),
+    );
+  }
+
+  InterpolationString _read_interpolationString(LinkedNode data) {
+    return astFactory.interpolationString(
+      _getToken(data.interpolationString_token),
+      data.interpolationString_value,
+    );
+  }
+
+  IsExpression _read_isExpression(LinkedNode data) {
+    return astFactory.isExpression(
+      readNode(data.isExpression_expression),
+      _getToken(data.isExpression_isOperator),
+      _getToken(data.isExpression_notOperator),
+      readNode(data.isExpression_type),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  Label _read_label(LinkedNode data) {
+    return astFactory.label(
+      readNode(data.label_label),
+      _getToken(data.label_colon),
+    );
+  }
+
+  LabeledStatement _read_labeledStatement(LinkedNode data) {
+    return astFactory.labeledStatement(
+      _readNodeList(data.labeledStatement_labels),
+      readNode(data.labeledStatement_statement),
+    );
+  }
+
+  LibraryDirective _read_libraryDirective(LinkedNode data) {
+    return astFactory.libraryDirective(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.directive_keyword),
+      readNode(data.libraryDirective_name),
+      _getToken(data.namespaceDirective_semicolon),
+    );
+  }
+
+  LibraryIdentifier _read_libraryIdentifier(LinkedNode data) {
+    return astFactory.libraryIdentifier(
+      _readNodeList(data.libraryIdentifier_components),
+    );
+  }
+
+  ListLiteral _read_listLiteral(LinkedNode data) {
+    return astFactory.listLiteral(
+      _getToken(data.typedLiteral_constKeyword),
+      readNode(data.typedLiteral_typeArguments),
+      _getToken(data.listLiteral_leftBracket),
+      _readNodeList(data.listLiteral_elements),
+      _getToken(data.listLiteral_rightBracket),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  MapLiteralEntry _read_mapLiteralEntry(LinkedNode data) {
+    return astFactory.mapLiteralEntry(
+      readNode(data.mapLiteralEntry_key),
+      _getToken(data.mapLiteralEntry_separator),
+      readNode(data.mapLiteralEntry_value),
+    );
+  }
+
+  MethodDeclaration _read_methodDeclaration(LinkedNode data) {
+    return astFactory.methodDeclaration(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.methodDeclaration_externalKeyword),
+      _getToken(data.methodDeclaration_modifierKeyword),
+      readNode(data.methodDeclaration_returnType),
+      _getToken(data.methodDeclaration_propertyKeyword),
+      _getToken(data.methodDeclaration_operatorKeyword),
+      readNode(data.methodDeclaration_name),
+      readNode(data.methodDeclaration_typeParameters),
+      readNode(data.methodDeclaration_formalParameters),
+      readNode(data.methodDeclaration_body),
+    );
+  }
+
+  MethodInvocation _read_methodInvocation(LinkedNode data) {
+    return astFactory.methodInvocation(
+      readNode(data.methodInvocation_target),
+      _getToken(data.methodInvocation_operator),
+      readNode(data.methodInvocation_methodName),
+      readNode(data.invocationExpression_typeArguments),
+      readNode(data.invocationExpression_arguments),
+    )..staticInvokeType = _readType(data.invocationExpression_invokeType);
+  }
+
+  MixinDeclaration _read_mixinDeclaration(LinkedNode data) {
+    return astFactory.mixinDeclaration(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.mixinDeclaration_mixinKeyword),
+      readNode(data.namedCompilationUnitMember_name),
+      readNode(data.classOrMixinDeclaration_typeParameters),
+      readNode(data.mixinDeclaration_onClause),
+      readNode(data.classOrMixinDeclaration_implementsClause),
+      _getToken(data.classOrMixinDeclaration_leftBracket),
+      _readNodeList(data.classOrMixinDeclaration_members),
+      _getToken(data.classOrMixinDeclaration_rightBracket),
+    );
+  }
+
+  NamedExpression _read_namedExpression(LinkedNode data) {
+    return astFactory.namedExpression(
+      readNode(data.namedExpression_name),
+      readNode(data.namedExpression_expression),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  NullLiteral _read_nullLiteral(LinkedNode data) {
+    return astFactory.nullLiteral(
+      _getToken(data.nullLiteral_literal),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  OnClause _read_onClause(LinkedNode data) {
+    return astFactory.onClause(
+      _getToken(data.onClause_onKeyword),
+      _readNodeList(data.onClause_superclassConstraints),
+    );
+  }
+
+  ParenthesizedExpression _read_parenthesizedExpression(LinkedNode data) {
+    return astFactory.parenthesizedExpression(
+      _getToken(data.parenthesizedExpression_leftParenthesis),
+      readNode(data.parenthesizedExpression_expression),
+      _getToken(data.parenthesizedExpression_rightParenthesis),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  PartDirective _read_partDirective(LinkedNode data) {
+    return astFactory.partDirective(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.directive_keyword),
+      readNode(data.uriBasedDirective_uri),
+      _getToken(data.namespaceDirective_semicolon),
+    );
+  }
+
+  PartOfDirective _read_partOfDirective(LinkedNode data) {
+    return astFactory.partOfDirective(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.directive_keyword),
+      _getToken(data.partOfDirective_ofKeyword),
+      readNode(data.partOfDirective_uri),
+      readNode(data.partOfDirective_libraryName),
+      _getToken(data.partOfDirective_semicolon),
+    );
+  }
+
+  PostfixExpression _read_postfixExpression(LinkedNode data) {
+    return astFactory.postfixExpression(
+      readNode(data.postfixExpression_operand),
+      _getToken(data.postfixExpression_operator),
+    )
+      ..staticElement = _getElement(data.postfixExpression_element)
+      ..staticType = _readType(data.expression_type);
+  }
+
+  PrefixedIdentifier _read_prefixedIdentifier(LinkedNode data) {
+    return astFactory.prefixedIdentifier(
+      readNode(data.prefixedIdentifier_prefix),
+      _getToken(data.prefixedIdentifier_period),
+      readNode(data.prefixedIdentifier_identifier),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  PrefixExpression _read_prefixExpression(LinkedNode data) {
+    return astFactory.prefixExpression(
+      _getToken(data.prefixExpression_operator),
+      readNode(data.prefixExpression_operand),
+    )
+      ..staticElement = _getElement(data.prefixExpression_element)
+      ..staticType = _readType(data.expression_type);
+  }
+
+  PropertyAccess _read_propertyAccess(LinkedNode data) {
+    return astFactory.propertyAccess(
+      readNode(data.propertyAccess_target),
+      _getToken(data.propertyAccess_operator),
+      readNode(data.propertyAccess_propertyName),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  RedirectingConstructorInvocation _read_redirectingConstructorInvocation(
+      LinkedNode data) {
+    return astFactory.redirectingConstructorInvocation(
+      _getToken(data.redirectingConstructorInvocation_thisKeyword),
+      _getToken(data.redirectingConstructorInvocation_period),
+      readNode(data.redirectingConstructorInvocation_constructorName),
+      readNode(data.redirectingConstructorInvocation_arguments),
+    )..staticElement =
+        _getElement(data.redirectingConstructorInvocation_element);
+  }
+
+  RethrowExpression _read_rethrowExpression(LinkedNode data) {
+    return astFactory.rethrowExpression(
+      _getToken(data.rethrowExpression_rethrowKeyword),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  ReturnStatement _read_returnStatement(LinkedNode data) {
+    return astFactory.returnStatement(
+      _getToken(data.returnStatement_returnKeyword),
+      readNode(data.returnStatement_expression),
+      _getToken(data.returnStatement_semicolon),
+    );
+  }
+
+  ScriptTag _read_scriptTag(LinkedNode data) {
+    return astFactory.scriptTag(
+      _getToken(data.scriptTag_scriptTag),
+    );
+  }
+
+  SetOrMapLiteral _read_setOrMapLiteral(LinkedNode data) {
+    SetOrMapLiteralImpl node = astFactory.setOrMapLiteral(
+      constKeyword: _getToken(data.typedLiteral_constKeyword),
+      elements: _readNodeList(data.setOrMapLiteral_elements),
+      leftBracket: _getToken(data.setOrMapLiteral_leftBracket),
+      typeArguments: readNode(data.typedLiteral_typeArguments),
+      rightBracket: _getToken(data.setOrMapLiteral_leftBracket),
+    );
+    if (data.setOrMapLiteral_isMap) {
+      node.becomeMap();
+    } else if (data.setOrMapLiteral_isSet) {
+      node.becomeSet();
+    }
+    return node;
+  }
+
+  ShowCombinator _read_showCombinator(LinkedNode data) {
+    return astFactory.showCombinator(
+      _getToken(data.combinator_keyword),
+      _readNodeList(data.showCombinator_shownNames),
+    );
+  }
+
+  SimpleFormalParameter _read_simpleFormalParameter(LinkedNode data) {
+    return astFactory.simpleFormalParameter2(
+      identifier: readNode(data.normalFormalParameter_identifier),
+      type: readNode(data.simpleFormalParameter_type),
+      covariantKeyword: _getToken(data.normalFormalParameter_covariantKeyword),
+      comment: readNode(data.normalFormalParameter_comment),
+      metadata: _readNodeList(data.normalFormalParameter_metadata),
+      keyword: _getToken(data.simpleFormalParameter_keyword),
+    );
+  }
+
+  SimpleIdentifier _read_simpleIdentifier(LinkedNode data) {
+    return astFactory.simpleIdentifier(
+      _getToken(data.simpleIdentifier_token),
+    )
+      ..staticElement = _getElement(data.simpleIdentifier_element)
+      ..staticType = _readType(data.expression_type);
+  }
+
+  SimpleStringLiteral _read_simpleStringLiteral(LinkedNode data) {
+    return astFactory.simpleStringLiteral(
+      _getToken(data.simpleStringLiteral_token),
+      data.simpleStringLiteral_value,
+    )..staticType = _readType(data.expression_type);
+  }
+
+  SpreadElement _read_spreadElement(LinkedNode data) {
+    return astFactory.spreadElement(
+      spreadOperator: _getToken(data.spreadElement_spreadOperator),
+      expression: readNode(data.spreadElement_expression),
+    );
+  }
+
+  StringInterpolation _read_stringInterpolation(LinkedNode data) {
+    return astFactory.stringInterpolation(
+      _readNodeList(data.stringInterpolation_elements),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  SuperConstructorInvocation _read_superConstructorInvocation(LinkedNode data) {
+    return astFactory.superConstructorInvocation(
+      _getToken(data.superConstructorInvocation_superKeyword),
+      _getToken(data.superConstructorInvocation_period),
+      readNode(data.superConstructorInvocation_constructorName),
+      readNode(data.superConstructorInvocation_arguments),
+    )..staticElement = _getElement(data.superConstructorInvocation_element);
+  }
+
+  SuperExpression _read_superExpression(LinkedNode data) {
+    return astFactory.superExpression(
+      _getToken(data.superExpression_superKeyword),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  SwitchCase _read_switchCase(LinkedNode data) {
+    return astFactory.switchCase(
+      _readNodeList(data.switchMember_labels),
+      _getToken(data.switchMember_keyword),
+      readNode(data.switchCase_expression),
+      _getToken(data.switchMember_colon),
+      _readNodeList(data.switchMember_statements),
+    );
+  }
+
+  SwitchDefault _read_switchDefault(LinkedNode data) {
+    return astFactory.switchDefault(
+      _readNodeList(data.switchMember_labels),
+      _getToken(data.switchMember_keyword),
+      _getToken(data.switchMember_colon),
+      _readNodeList(data.switchMember_statements),
+    );
+  }
+
+  SwitchStatement _read_switchStatement(LinkedNode data) {
+    return astFactory.switchStatement(
+      _getToken(data.switchStatement_switchKeyword),
+      _getToken(data.switchStatement_leftParenthesis),
+      readNode(data.switchStatement_expression),
+      _getToken(data.switchStatement_rightParenthesis),
+      _getToken(data.switchStatement_leftBracket),
+      _readNodeList(data.switchStatement_members),
+      _getToken(data.switchStatement_rightBracket),
+    );
+  }
+
+  SymbolLiteral _read_symbolLiteral(LinkedNode data) {
+    return astFactory.symbolLiteral(
+      _getToken(data.symbolLiteral_poundSign),
+      _getTokens(data.symbolLiteral_components),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  ThisExpression _read_thisExpression(LinkedNode data) {
+    return astFactory.thisExpression(
+      _getToken(data.thisExpression_thisKeyword),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  ThrowExpression _read_throwExpression(LinkedNode data) {
+    return astFactory.throwExpression(
+      _getToken(data.throwExpression_throwKeyword),
+      readNode(data.throwExpression_expression),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  TopLevelVariableDeclaration _read_topLevelVariableDeclaration(
+      LinkedNode data) {
+    return astFactory.topLevelVariableDeclaration(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      readNode(data.topLevelVariableDeclaration_variableList),
+      _getToken(data.topLevelVariableDeclaration_semicolon),
+    );
+  }
+
+  TryStatement _read_tryStatement(LinkedNode data) {
+    return astFactory.tryStatement(
+      _getToken(data.tryStatement_tryKeyword),
+      readNode(data.tryStatement_body),
+      _readNodeList(data.tryStatement_catchClauses),
+      _getToken(data.tryStatement_tryKeyword),
+      readNode(data.tryStatement_finallyBlock),
+    );
+  }
+
+  TypeArgumentList _read_typeArgumentList(LinkedNode data) {
+    return astFactory.typeArgumentList(
+      _getToken(data.typeArgumentList_leftBracket),
+      _readNodeList(data.typeArgumentList_arguments),
+      _getToken(data.typeArgumentList_rightBracket),
+    );
+  }
+
+  TypeName _read_typeName(LinkedNode data) {
+    return astFactory.typeName(
+      readNode(data.typeName_name),
+      readNode(data.typeName_typeArguments),
+      question: _getToken(data.typeName_question),
+    )..type = _readType(data.typeName_type);
+  }
+
+  TypeParameter _read_typeParameter(LinkedNode data) {
+    return astFactory.typeParameter(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      readNode(data.typeParameter_name),
+      _getToken(data.typeParameter_extendsKeyword),
+      readNode(data.typeParameter_bound),
+    );
+  }
+
+  TypeParameterList _read_typeParameterList(LinkedNode data) {
+    return astFactory.typeParameterList(
+      _getToken(data.typeParameterList_leftBracket),
+      _readNodeList(data.typeParameterList_typeParameters),
+      _getToken(data.typeParameterList_rightBracket),
+    );
+  }
+
+  VariableDeclaration _read_variableDeclaration(LinkedNode data) {
+    return astFactory.variableDeclaration(
+      readNode(data.variableDeclaration_name),
+      _getToken(data.variableDeclaration_equals),
+      readNode(data.variableDeclaration_initializer),
+    );
+  }
+
+  VariableDeclarationList _read_variableDeclarationList(LinkedNode data) {
+    return astFactory.variableDeclarationList(
+      readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.variableDeclarationList_keyword),
+      readNode(data.variableDeclarationList_type),
+      _readNodeList(data.variableDeclarationList_variables),
+    );
+  }
+
+  VariableDeclarationStatement _read_variableDeclarationStatement(
+      LinkedNode data) {
+    return astFactory.variableDeclarationStatement(
+      readNode(data.variableDeclarationStatement_variables),
+      _getToken(data.variableDeclarationStatement_semicolon),
+    );
+  }
+
+  WhileStatement _read_whileStatement(LinkedNode data) {
+    return astFactory.whileStatement(
+      _getToken(data.whileStatement_whileKeyword),
+      _getToken(data.whileStatement_leftParenthesis),
+      readNode(data.whileStatement_condition),
+      _getToken(data.whileStatement_rightParenthesis),
+      readNode(data.whileStatement_body),
+    );
+  }
+
+  WithClause _read_withClause(LinkedNode data) {
+    return astFactory.withClause(
+      _getToken(data.withClause_withKeyword),
+      _readNodeList(data.withClause_mixinTypes),
+    );
+  }
+
+  YieldStatement _read_yieldStatement(LinkedNode data) {
+    return astFactory.yieldStatement(
+      _getToken(data.yieldStatement_yieldKeyword),
+      _getToken(data.yieldStatement_star),
+      readNode(data.yieldStatement_expression),
+      _getToken(data.yieldStatement_semicolon),
+    );
+  }
+
+  List<T> _readNodeList<T>(List<LinkedNode> nodeList) {
+    var result = List<T>.filled(nodeList.length, null);
+    for (var i = 0; i < nodeList.length; ++i) {
+      var linkedNode = nodeList[i];
+      result[i] = readNode(linkedNode) as T;
+    }
+    return result;
+  }
+
+  DartType _readType(LinkedNodeType data) {
+    if (data == null) return null;
+
+    switch (data.kind) {
+      case LinkedNodeTypeKind.bottom:
+        return BottomTypeImpl.instance;
+      case LinkedNodeTypeKind.dynamic_:
+        return DynamicTypeImpl.instance;
+      case LinkedNodeTypeKind.function:
+        return FunctionTypeImpl.synthetic(
+          _readType(data.functionReturnType),
+          _getElements(data.functionTypeParameters),
+          _getElements(data.functionFormalParameters),
+        );
+      case LinkedNodeTypeKind.interface:
+        var element = _getElement(data.interfaceClass);
+        if (element != null) {
+          return InterfaceTypeImpl.explicit(
+            element,
+            _readTypes(
+              data.interfaceTypeArguments,
+              const <InterfaceType>[],
+            ),
+          );
+        }
+        return DynamicTypeImpl.instance;
+      case LinkedNodeTypeKind.typeParameter:
+        var element = _getElement(data.typeParameterParameter);
+        // TODO(scheglov) Remove when references include all type parameters.
+        element ??= TypeParameterElementImpl('', -1);
+        return TypeParameterTypeImpl(element);
+      case LinkedNodeTypeKind.void_:
+        return VoidTypeImpl.instance;
+      default:
+        throw UnimplementedError('Type kind: ${data.kind}');
+    }
+  }
+
+  List<T> _readTypes<T extends DartType>(
+    List<LinkedNodeType> dataList,
+    List<T> ifEmpty,
+  ) {
+    if (dataList.isEmpty) return ifEmpty;
+
+    var result = List<T>(dataList.length);
+    for (var i = 0; i < dataList.length; ++i) {
+      var data = dataList[i];
+      result[i] = _readType(data);
+    }
+    return result;
+  }
+
+  static TokenType _binaryToAstTokenType(UnlinkedTokenType type) {
+    switch (type) {
+      case UnlinkedTokenType.ABSTRACT:
+        return Keyword.ABSTRACT;
+      case UnlinkedTokenType.AMPERSAND:
+        return TokenType.AMPERSAND;
+      case UnlinkedTokenType.AMPERSAND_AMPERSAND:
+        return TokenType.AMPERSAND_AMPERSAND;
+      case UnlinkedTokenType.AMPERSAND_EQ:
+        return TokenType.AMPERSAND_EQ;
+      case UnlinkedTokenType.AS:
+        return TokenType.AS;
+      case UnlinkedTokenType.ASSERT:
+        return Keyword.ASSERT;
+      case UnlinkedTokenType.ASYNC:
+        return Keyword.ASYNC;
+      case UnlinkedTokenType.AT:
+        return TokenType.AT;
+      case UnlinkedTokenType.AWAIT:
+        return Keyword.AWAIT;
+      case UnlinkedTokenType.BACKPING:
+        return TokenType.BACKPING;
+      case UnlinkedTokenType.BACKSLASH:
+        return TokenType.BACKSLASH;
+      case UnlinkedTokenType.BANG:
+        return TokenType.BANG;
+      case UnlinkedTokenType.BANG_EQ:
+        return TokenType.BANG_EQ;
+      case UnlinkedTokenType.BAR:
+        return TokenType.BAR;
+      case UnlinkedTokenType.BAR_BAR:
+        return TokenType.BAR_BAR;
+      case UnlinkedTokenType.BAR_EQ:
+        return TokenType.BAR_EQ;
+      case UnlinkedTokenType.BREAK:
+        return Keyword.BREAK;
+      case UnlinkedTokenType.CARET:
+        return TokenType.CARET;
+      case UnlinkedTokenType.CARET_EQ:
+        return TokenType.CARET_EQ;
+      case UnlinkedTokenType.CASE:
+        return Keyword.CASE;
+      case UnlinkedTokenType.CATCH:
+        return Keyword.CATCH;
+      case UnlinkedTokenType.CLASS:
+        return Keyword.CLASS;
+      case UnlinkedTokenType.CLOSE_CURLY_BRACKET:
+        return TokenType.CLOSE_CURLY_BRACKET;
+      case UnlinkedTokenType.CLOSE_PAREN:
+        return TokenType.CLOSE_PAREN;
+      case UnlinkedTokenType.CLOSE_SQUARE_BRACKET:
+        return TokenType.CLOSE_SQUARE_BRACKET;
+      case UnlinkedTokenType.COLON:
+        return TokenType.COLON;
+      case UnlinkedTokenType.COMMA:
+        return TokenType.COMMA;
+      case UnlinkedTokenType.CONST:
+        return Keyword.CONST;
+      case UnlinkedTokenType.CONTINUE:
+        return Keyword.CONTINUE;
+      case UnlinkedTokenType.COVARIANT:
+        return Keyword.COVARIANT;
+      case UnlinkedTokenType.DEFAULT:
+        return Keyword.DEFAULT;
+      case UnlinkedTokenType.DEFERRED:
+        return Keyword.DEFERRED;
+      case UnlinkedTokenType.DO:
+        return Keyword.DO;
+      case UnlinkedTokenType.DOUBLE:
+        return TokenType.DOUBLE;
+      case UnlinkedTokenType.DYNAMIC:
+        return Keyword.DYNAMIC;
+      case UnlinkedTokenType.ELSE:
+        return Keyword.ELSE;
+      case UnlinkedTokenType.ENUM:
+        return Keyword.ENUM;
+      case UnlinkedTokenType.EOF:
+        return TokenType.EOF;
+      case UnlinkedTokenType.EQ:
+        return TokenType.EQ;
+      case UnlinkedTokenType.EQ_EQ:
+        return TokenType.EQ_EQ;
+      case UnlinkedTokenType.EXPORT:
+        return Keyword.EXPORT;
+      case UnlinkedTokenType.EXTENDS:
+        return Keyword.EXTENDS;
+      case UnlinkedTokenType.EXTERNAL:
+        return Keyword.EXTERNAL;
+      case UnlinkedTokenType.FACTORY:
+        return Keyword.FACTORY;
+      case UnlinkedTokenType.FALSE:
+        return Keyword.FALSE;
+      case UnlinkedTokenType.FINAL:
+        return Keyword.FINAL;
+      case UnlinkedTokenType.FINALLY:
+        return Keyword.FINALLY;
+      case UnlinkedTokenType.FOR:
+        return Keyword.FOR;
+      case UnlinkedTokenType.FUNCTION:
+        return TokenType.FUNCTION;
+      case UnlinkedTokenType.FUNCTION_KEYWORD:
+        return Keyword.FUNCTION;
+      case UnlinkedTokenType.GET:
+        return Keyword.GET;
+      case UnlinkedTokenType.GT:
+        return TokenType.GT;
+      case UnlinkedTokenType.GT_EQ:
+        return TokenType.GT_EQ;
+      case UnlinkedTokenType.GT_GT:
+        return TokenType.GT_GT;
+      case UnlinkedTokenType.GT_GT_EQ:
+        return TokenType.GT_GT_EQ;
+      case UnlinkedTokenType.HASH:
+        return TokenType.HASH;
+      case UnlinkedTokenType.HEXADECIMAL:
+        return TokenType.HEXADECIMAL;
+      case UnlinkedTokenType.HIDE:
+        return Keyword.HIDE;
+      case UnlinkedTokenType.IDENTIFIER:
+        return TokenType.IDENTIFIER;
+      case UnlinkedTokenType.IF:
+        return Keyword.IF;
+      case UnlinkedTokenType.IMPLEMENTS:
+        return Keyword.IMPLEMENTS;
+      case UnlinkedTokenType.IMPORT:
+        return Keyword.IMPORT;
+      case UnlinkedTokenType.IN:
+        return Keyword.IN;
+      case UnlinkedTokenType.INDEX:
+        return TokenType.INDEX;
+      case UnlinkedTokenType.INDEX_EQ:
+        return TokenType.INDEX_EQ;
+      case UnlinkedTokenType.INT:
+        return TokenType.INT;
+      case UnlinkedTokenType.INTERFACE:
+        return Keyword.INTERFACE;
+      case UnlinkedTokenType.IS:
+        return TokenType.IS;
+      case UnlinkedTokenType.LIBRARY:
+        return Keyword.LIBRARY;
+      case UnlinkedTokenType.LT:
+        return TokenType.LT;
+      case UnlinkedTokenType.LT_EQ:
+        return TokenType.LT_EQ;
+      case UnlinkedTokenType.LT_LT:
+        return TokenType.LT_LT;
+      case UnlinkedTokenType.LT_LT_EQ:
+        return TokenType.LT_LT_EQ;
+      case UnlinkedTokenType.MINUS:
+        return TokenType.MINUS;
+      case UnlinkedTokenType.MINUS_EQ:
+        return TokenType.MINUS_EQ;
+      case UnlinkedTokenType.MINUS_MINUS:
+        return TokenType.MINUS_MINUS;
+      case UnlinkedTokenType.MIXIN:
+        return Keyword.MIXIN;
+      case UnlinkedTokenType.MULTI_LINE_COMMENT:
+        return TokenType.MULTI_LINE_COMMENT;
+      case UnlinkedTokenType.NATIVE:
+        return Keyword.NATIVE;
+      case UnlinkedTokenType.NEW:
+        return Keyword.NEW;
+      case UnlinkedTokenType.NULL:
+        return Keyword.NULL;
+      case UnlinkedTokenType.OF:
+        return Keyword.OF;
+      case UnlinkedTokenType.ON:
+        return Keyword.ON;
+      case UnlinkedTokenType.OPEN_CURLY_BRACKET:
+        return TokenType.OPEN_CURLY_BRACKET;
+      case UnlinkedTokenType.OPEN_PAREN:
+        return TokenType.OPEN_PAREN;
+      case UnlinkedTokenType.OPEN_SQUARE_BRACKET:
+        return TokenType.OPEN_SQUARE_BRACKET;
+      case UnlinkedTokenType.OPERATOR:
+        return Keyword.OPERATOR;
+      case UnlinkedTokenType.PART:
+        return Keyword.PART;
+      case UnlinkedTokenType.PATCH:
+        return Keyword.PATCH;
+      case UnlinkedTokenType.PERCENT:
+        return TokenType.PERCENT;
+      case UnlinkedTokenType.PERCENT_EQ:
+        return TokenType.PERCENT_EQ;
+      case UnlinkedTokenType.PERIOD:
+        return TokenType.PERIOD;
+      case UnlinkedTokenType.PERIOD_PERIOD:
+        return TokenType.PERIOD_PERIOD;
+      case UnlinkedTokenType.PERIOD_PERIOD_PERIOD:
+        return TokenType.PERIOD_PERIOD_PERIOD;
+      case UnlinkedTokenType.PERIOD_PERIOD_PERIOD_QUESTION:
+        return TokenType.PERIOD_PERIOD_PERIOD_QUESTION;
+      case UnlinkedTokenType.PLUS:
+        return TokenType.PLUS;
+      case UnlinkedTokenType.PLUS_EQ:
+        return TokenType.PLUS_EQ;
+      case UnlinkedTokenType.PLUS_PLUS:
+        return TokenType.PLUS_PLUS;
+      case UnlinkedTokenType.QUESTION:
+        return TokenType.QUESTION;
+      case UnlinkedTokenType.QUESTION_PERIOD:
+        return TokenType.QUESTION_PERIOD;
+      case UnlinkedTokenType.QUESTION_QUESTION:
+        return TokenType.QUESTION_QUESTION;
+      case UnlinkedTokenType.QUESTION_QUESTION_EQ:
+        return TokenType.QUESTION_QUESTION_EQ;
+      case UnlinkedTokenType.RETHROW:
+        return Keyword.RETHROW;
+      case UnlinkedTokenType.RETURN:
+        return Keyword.RETURN;
+      case UnlinkedTokenType.SCRIPT_TAG:
+        return TokenType.SCRIPT_TAG;
+      case UnlinkedTokenType.SEMICOLON:
+        return TokenType.SEMICOLON;
+      case UnlinkedTokenType.SET:
+        return Keyword.SET;
+      case UnlinkedTokenType.SHOW:
+        return Keyword.SHOW;
+      case UnlinkedTokenType.SINGLE_LINE_COMMENT:
+        return TokenType.SINGLE_LINE_COMMENT;
+      case UnlinkedTokenType.SLASH:
+        return TokenType.SLASH;
+      case UnlinkedTokenType.SLASH_EQ:
+        return TokenType.SLASH_EQ;
+      case UnlinkedTokenType.SOURCE:
+        return Keyword.SOURCE;
+      case UnlinkedTokenType.STAR:
+        return TokenType.STAR;
+      case UnlinkedTokenType.STAR_EQ:
+        return TokenType.STAR_EQ;
+      case UnlinkedTokenType.STATIC:
+        return Keyword.STATIC;
+      case UnlinkedTokenType.STRING:
+        return TokenType.STRING;
+      case UnlinkedTokenType.STRING_INTERPOLATION_EXPRESSION:
+        return TokenType.STRING_INTERPOLATION_EXPRESSION;
+      case UnlinkedTokenType.STRING_INTERPOLATION_IDENTIFIER:
+        return TokenType.STRING_INTERPOLATION_IDENTIFIER;
+      case UnlinkedTokenType.SUPER:
+        return Keyword.SUPER;
+      case UnlinkedTokenType.SWITCH:
+        return Keyword.SWITCH;
+      case UnlinkedTokenType.SYNC:
+        return Keyword.SYNC;
+      case UnlinkedTokenType.THIS:
+        return Keyword.THIS;
+      case UnlinkedTokenType.THROW:
+        return Keyword.THROW;
+      case UnlinkedTokenType.TILDE:
+        return TokenType.TILDE;
+      case UnlinkedTokenType.TILDE_SLASH:
+        return TokenType.TILDE_SLASH;
+      case UnlinkedTokenType.TILDE_SLASH_EQ:
+        return TokenType.TILDE_SLASH_EQ;
+      case UnlinkedTokenType.TRUE:
+        return Keyword.TRUE;
+      case UnlinkedTokenType.TRY:
+        return Keyword.TRY;
+      case UnlinkedTokenType.TYPEDEF:
+        return Keyword.TYPEDEF;
+      case UnlinkedTokenType.VAR:
+        return Keyword.VAR;
+      case UnlinkedTokenType.VOID:
+        return Keyword.VOID;
+      case UnlinkedTokenType.WHILE:
+        return Keyword.WHILE;
+      case UnlinkedTokenType.WITH:
+        return Keyword.WITH;
+      case UnlinkedTokenType.YIELD:
+        return Keyword.YIELD;
+      default:
+        throw StateError('Unexpected type: $type');
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
new file mode 100644
index 0000000..185370e
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -0,0 +1,2034 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/summary/format.dart';
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary2/reference.dart';
+import 'package:meta/meta.dart';
+
+/// Serializer of fully resolved ASTs into flat buffers.
+class AstBinaryWriter extends ThrowingAstVisitor<LinkedNodeBuilder> {
+  final referenceRoot = Reference.root();
+  final referenceBuilder = LinkedNodeReferenceBuilder();
+  final _references = <Reference>[];
+
+  final UnlinkedTokensBuilder tokens = UnlinkedTokensBuilder();
+  final Map<Token, int> _tokenMap = Map.identity();
+  int _tokenIndex = 0;
+
+  AstBinaryWriter() {
+    _references.add(referenceRoot);
+    _addToken(
+      isSynthetic: true,
+      kind: UnlinkedTokenKind.nothing,
+      length: 0,
+      lexeme: '',
+      offset: 0,
+      precedingComment: 0,
+      type: UnlinkedTokenType.NOTHING,
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitAdjacentStrings(AdjacentStrings node) {
+    return LinkedNodeBuilder.adjacentStrings(
+      adjacentStrings_strings: _writeNodeList(node.strings),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitAnnotation(Annotation node) {
+    return LinkedNodeBuilder.annotation(
+      annotation_arguments: node.arguments?.accept(this),
+      annotation_atSign: _getToken(node.atSign),
+      annotation_constructorName: node.constructorName?.accept(this),
+      annotation_name: node.name?.accept(this),
+      annotation_period: _getToken(node.period),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitArgumentList(ArgumentList node) {
+    return LinkedNodeBuilder.argumentList(
+      argumentList_arguments: _writeNodeList(node.arguments),
+      argumentList_leftParenthesis: _getToken(node.leftParenthesis),
+      argumentList_rightParenthesis: _getToken(node.rightParenthesis),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitAsExpression(AsExpression node) {
+    return LinkedNodeBuilder.asExpression(
+      asExpression_asOperator: _getToken(node.asOperator),
+      asExpression_expression: node.expression.accept(this),
+      asExpression_type: node.type.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitAssertInitializer(AssertInitializer node) {
+    return LinkedNodeBuilder.assertInitializer(
+      assertInitializer_assertKeyword: _getToken(node.assertKeyword),
+      assertInitializer_comma: _getToken(node.comma),
+      assertInitializer_condition: node.condition.accept(this),
+      assertInitializer_leftParenthesis: _getToken(node.leftParenthesis),
+      assertInitializer_message: node.message?.accept(this),
+      assertInitializer_rightParenthesis: _getToken(node.rightParenthesis),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitAssertStatement(AssertStatement node) {
+    var builder = LinkedNodeBuilder.assertStatement(
+      assertStatement_assertKeyword: _getToken(node.assertKeyword),
+      assertStatement_comma: _getToken(node.comma),
+      assertStatement_condition: node.condition.accept(this),
+      assertStatement_leftParenthesis: _getToken(node.leftParenthesis),
+      assertStatement_message: node.message?.accept(this),
+      assertStatement_rightParenthesis: _getToken(node.rightParenthesis),
+      assertStatement_semicolon: _getToken(node.semicolon),
+    );
+    _storeStatement(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitAssignmentExpression(AssignmentExpression node) {
+    return LinkedNodeBuilder.assignmentExpression(
+      assignmentExpression_element: _getReference(node.staticElement).index,
+      assignmentExpression_leftHandSide: node.leftHandSide.accept(this),
+      assignmentExpression_operator: _getToken(node.operator),
+      assignmentExpression_rightHandSide: node.rightHandSide.accept(this),
+      expression_type: _writeType(node.staticType),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitAwaitExpression(AwaitExpression node) {
+    return LinkedNodeBuilder.awaitExpression(
+      awaitExpression_awaitKeyword: _getToken(node.awaitKeyword),
+      awaitExpression_expression: node.expression.accept(this),
+      expression_type: _writeType(node.staticType),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitBinaryExpression(BinaryExpression node) {
+    return LinkedNodeBuilder.binaryExpression(
+      binaryExpression_element: _getReference(node.staticElement).index,
+      binaryExpression_leftOperand: node.leftOperand.accept(this),
+      binaryExpression_operator: _getToken(node.operator),
+      binaryExpression_rightOperand: node.rightOperand.accept(this),
+      expression_type: _writeType(node.staticType),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitBlock(Block node) {
+    return LinkedNodeBuilder.block(
+      block_leftBracket: _getToken(node.leftBracket),
+      block_rightBracket: _getToken(node.rightBracket),
+      block_statements: _writeNodeList(node.statements),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitBlockFunctionBody(BlockFunctionBody node) {
+    return LinkedNodeBuilder.blockFunctionBody(
+      blockFunctionBody_block: node.block.accept(this),
+      blockFunctionBody_keyword: _getToken(node.keyword),
+      blockFunctionBody_star: _getToken(node.star),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitBooleanLiteral(BooleanLiteral node) {
+    return LinkedNodeBuilder.booleanLiteral(
+      booleanLiteral_literal: _getToken(node.literal),
+      booleanLiteral_value: node.value,
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitBreakStatement(BreakStatement node) {
+    var builder = LinkedNodeBuilder.breakStatement(
+      breakStatement_breakKeyword: _getToken(node.breakKeyword),
+      breakStatement_label: node.label?.accept(this),
+      breakStatement_semicolon: _getToken(node.semicolon),
+    );
+    _storeStatement(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitCascadeExpression(CascadeExpression node) {
+    var builder = LinkedNodeBuilder.cascadeExpression(
+      cascadeExpression_target: node.target.accept(this),
+      cascadeExpression_sections: _writeNodeList(node.cascadeSections),
+    );
+    _storeExpression(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitCatchClause(CatchClause node) {
+    return LinkedNodeBuilder.catchClause(
+      catchClause_body: node.body.accept(this),
+      catchClause_catchKeyword: _getToken(node.catchKeyword),
+      catchClause_comma: _getToken(node.comma),
+      catchClause_exceptionParameter: node.exceptionParameter?.accept(this),
+      catchClause_exceptionType: node.exceptionType?.accept(this),
+      catchClause_leftParenthesis: _getToken(node.leftParenthesis),
+      catchClause_onKeyword: _getToken(node.onKeyword),
+      catchClause_rightParenthesis: _getToken(node.rightParenthesis),
+      catchClause_stackTraceParameter: node.stackTraceParameter?.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitClassDeclaration(ClassDeclaration node) {
+    var builder = LinkedNodeBuilder.classDeclaration(
+      classDeclaration_abstractKeyword: _getToken(node.abstractKeyword),
+      classDeclaration_classKeyword: _getToken(node.classKeyword),
+      classDeclaration_extendsClause: node.extendsClause?.accept(this),
+      classDeclaration_withClause: node.withClause?.accept(this),
+    );
+    _storeClassOrMixinDeclaration(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitClassTypeAlias(ClassTypeAlias node) {
+    var builder = LinkedNodeBuilder.classTypeAlias(
+      classTypeAlias_abstractKeyword: _getToken(node.abstractKeyword),
+      classTypeAlias_equals: _getToken(node.equals),
+      classTypeAlias_implementsClause: node.implementsClause?.accept(this),
+      classTypeAlias_superclass: node.superclass.accept(this),
+      classTypeAlias_typeParameters: node.typeParameters?.accept(this),
+      classTypeAlias_withClause: node.withClause.accept(this),
+    );
+    _storeTypeAlias(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitComment(Comment node) {
+    LinkedNodeCommentType type;
+    if (node.isBlock) {
+      type = LinkedNodeCommentType.block;
+    } else if (node.isDocumentation) {
+      type = LinkedNodeCommentType.documentation;
+    } else if (node.isEndOfLine) {
+      type = LinkedNodeCommentType.endOfLine;
+    }
+
+    return LinkedNodeBuilder.comment(
+      comment_tokens: _getTokens(node.tokens),
+      comment_type: type,
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitCompilationUnit(CompilationUnit node) {
+    return LinkedNodeBuilder.compilationUnit(
+      compilationUnit_beginToken: _getToken(node.beginToken),
+      compilationUnit_declarations: _writeNodeList(node.declarations),
+      compilationUnit_directives: _writeNodeList(node.directives),
+      compilationUnit_endToken: _getToken(node.endToken),
+      compilationUnit_scriptTag: node.scriptTag?.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitConditionalExpression(ConditionalExpression node) {
+    var builder = LinkedNodeBuilder.conditionalExpression(
+      conditionalExpression_colon: _getToken(node.colon),
+      conditionalExpression_condition: node.condition.accept(this),
+      conditionalExpression_elseExpression: node.elseExpression.accept(this),
+      conditionalExpression_question: _getToken(node.question),
+      conditionalExpression_thenExpression: node.thenExpression.accept(this),
+    );
+    _storeExpression(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitConfiguration(Configuration node) {
+    return LinkedNodeBuilder.configuration(
+      configuration_equalToken: _getToken(node.equalToken),
+      configuration_ifKeyword: _getToken(node.ifKeyword),
+      configuration_leftParenthesis: _getToken(node.leftParenthesis),
+      configuration_name: node.name?.accept(this),
+      configuration_rightParenthesis: _getToken(node.rightParenthesis),
+      configuration_value: node.value?.accept(this),
+      configuration_uri: node.uri?.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitConstructorDeclaration(ConstructorDeclaration node) {
+    var builder = LinkedNodeBuilder.constructorDeclaration(
+      constructorDeclaration_body: node.body?.accept(this),
+      constructorDeclaration_constKeyword: _getToken(node.constKeyword),
+      constructorDeclaration_externalKeyword: _getToken(node.externalKeyword),
+      constructorDeclaration_factoryKeyword: _getToken(node.factoryKeyword),
+      constructorDeclaration_initializers: _writeNodeList(node.initializers),
+      constructorDeclaration_name: node.name?.accept(this),
+      constructorDeclaration_parameters: node.parameters.accept(this),
+      constructorDeclaration_period: _getToken(node.period),
+      constructorDeclaration_redirectedConstructor:
+          node.redirectedConstructor?.accept(this),
+      constructorDeclaration_returnType: node.returnType.accept(this),
+      constructorDeclaration_separator: _getToken(node.separator),
+    );
+    _storeClassMember(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitConstructorFieldInitializer(
+      ConstructorFieldInitializer node) {
+    var builder = LinkedNodeBuilder.constructorFieldInitializer(
+      constructorFieldInitializer_equals: _getToken(node.equals),
+      constructorFieldInitializer_expression: node.expression.accept(this),
+      constructorFieldInitializer_fieldName: node.fieldName.accept(this),
+      constructorFieldInitializer_period: _getToken(node.period),
+      constructorFieldInitializer_thisKeyword: _getToken(node.thisKeyword),
+    );
+    _storeConstructorInitializer(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitConstructorName(ConstructorName node) {
+    return LinkedNodeBuilder.constructorName(
+      constructorName_element: _getReference(node.staticElement).index,
+      constructorName_name: node.name?.accept(this),
+      constructorName_period: _getToken(node.period),
+      constructorName_type: node.type.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitContinueStatement(ContinueStatement node) {
+    var builder = LinkedNodeBuilder.continueStatement(
+      continueStatement_continueKeyword: _getToken(node.continueKeyword),
+      continueStatement_label: node.label?.accept(this),
+      continueStatement_semicolon: _getToken(node.semicolon),
+    );
+    _storeStatement(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitDeclaredIdentifier(DeclaredIdentifier node) {
+    var builder = LinkedNodeBuilder.declaredIdentifier(
+      declaredIdentifier_identifier: node.identifier.accept(this),
+      declaredIdentifier_keyword: _getToken(node.keyword),
+      declaredIdentifier_type: node.type?.accept(this),
+    );
+    _storeDeclaration(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitDefaultFormalParameter(DefaultFormalParameter node) {
+    return LinkedNodeBuilder.defaultFormalParameter(
+      defaultFormalParameter_defaultValue: node.defaultValue?.accept(this),
+      defaultFormalParameter_isNamed: node.isNamed,
+      defaultFormalParameter_parameter: node.parameter.accept(this),
+      defaultFormalParameter_separator: _getToken(node.separator),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitDoStatement(DoStatement node) {
+    return LinkedNodeBuilder.doStatement(
+      doStatement_body: node.body.accept(this),
+      doStatement_condition: node.condition.accept(this),
+      doStatement_doKeyword: _getToken(node.doKeyword),
+      doStatement_leftParenthesis: _getToken(node.leftParenthesis),
+      doStatement_rightParenthesis: _getToken(node.rightParenthesis),
+      doStatement_semicolon: _getToken(node.whileKeyword),
+      doStatement_whileKeyword: _getToken(node.whileKeyword),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitDottedName(DottedName node) {
+    return LinkedNodeBuilder.dottedName(
+      dottedName_components: _writeNodeList(node.components),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitDoubleLiteral(DoubleLiteral node) {
+    return LinkedNodeBuilder.doubleLiteral(
+      doubleLiteral_literal: _getToken(node.literal),
+      doubleLiteral_value: node.value,
+      expression_type: _writeType(node.staticType),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitEmptyFunctionBody(EmptyFunctionBody node) {
+    var builder = LinkedNodeBuilder.emptyFunctionBody(
+      emptyFunctionBody_semicolon: _getToken(node.semicolon),
+    );
+    _storeFunctionBody(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitEmptyStatement(EmptyStatement node) {
+    return LinkedNodeBuilder.emptyStatement(
+      emptyStatement_semicolon: _getToken(node.semicolon),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    var builder = LinkedNodeBuilder.enumConstantDeclaration(
+      enumConstantDeclaration_name: node.name.accept(this),
+    );
+    _storeDeclaration(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitEnumDeclaration(EnumDeclaration node) {
+    var builder = LinkedNodeBuilder.enumDeclaration(
+      enumDeclaration_constants: _writeNodeList(node.constants),
+      enumDeclaration_enumKeyword: _getToken(node.enumKeyword),
+      enumDeclaration_leftBracket: _getToken(node.leftBracket),
+      enumDeclaration_rightBracket: _getToken(node.rightBracket),
+    );
+    _storeNamedCompilationUnitMember(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitExportDirective(ExportDirective node) {
+    var builder = LinkedNodeBuilder.exportDirective();
+    _storeNamespaceDirective(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    return LinkedNodeBuilder.expressionFunctionBody(
+      expressionFunctionBody_arrow: _getToken(node.functionDefinition),
+      expressionFunctionBody_expression: node.expression.accept(this),
+      expressionFunctionBody_keyword: _getToken(node.keyword),
+      expressionFunctionBody_semicolon: _getToken(node.semicolon),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitExpressionStatement(ExpressionStatement node) {
+    return LinkedNodeBuilder.expressionStatement(
+      expressionStatement_expression: node.expression.accept(this),
+      expressionStatement_semicolon: _getToken(node.semicolon),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitExtendsClause(ExtendsClause node) {
+    return LinkedNodeBuilder.extendsClause(
+      extendsClause_extendsKeyword: _getToken(node.extendsKeyword),
+      extendsClause_superclass: node.superclass.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitFieldDeclaration(FieldDeclaration node) {
+    var builder = LinkedNodeBuilder.fieldDeclaration(
+      fieldDeclaration_covariantKeyword: _getToken(node.covariantKeyword),
+      fieldDeclaration_fields: node.fields.accept(this),
+      fieldDeclaration_semicolon: _getToken(node.semicolon),
+      fieldDeclaration_staticKeyword: _getToken(node.staticKeyword),
+    );
+    _storeClassMember(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitFieldFormalParameter(FieldFormalParameter node) {
+    var builder = LinkedNodeBuilder.fieldFormalParameter(
+      fieldFormalParameter_formalParameters: node.parameters?.accept(this),
+      fieldFormalParameter_keyword: _getToken(node.keyword),
+      fieldFormalParameter_period: _getToken(node.period),
+      fieldFormalParameter_thisKeyword: _getToken(node.thisKeyword),
+      fieldFormalParameter_type: node.type?.accept(this),
+      fieldFormalParameter_typeParameters: node.typeParameters?.accept(this),
+    );
+    _storeNormalFormalParameter(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitForEachPartsWithDeclaration(
+      ForEachPartsWithDeclaration node) {
+    var builder = LinkedNodeBuilder.forEachPartsWithDeclaration(
+      forEachPartsWithDeclaration_loopVariable: node.loopVariable.accept(this),
+    );
+    _storeForEachParts(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitForEachPartsWithIdentifier(
+      ForEachPartsWithIdentifier node) {
+    var builder = LinkedNodeBuilder.forEachPartsWithIdentifier(
+      forEachPartsWithIdentifier_identifier: node.identifier.accept(this),
+    );
+    _storeForEachParts(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitForElement(ForElement node) {
+    var builder = LinkedNodeBuilder.forElement(
+      forElement_body: node.body.accept(this),
+    );
+    _storeForMixin(builder, node as ForElementImpl);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitFormalParameterList(FormalParameterList node) {
+    return LinkedNodeBuilder.formalParameterList(
+      formalParameterList_leftDelimiter: _getToken(node.leftDelimiter),
+      formalParameterList_leftParenthesis: _getToken(node.leftParenthesis),
+      formalParameterList_parameters: _writeNodeList(node.parameters),
+      formalParameterList_rightDelimiter: _getToken(node.rightDelimiter),
+      formalParameterList_rightParenthesis: _getToken(node.rightParenthesis),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitForPartsWithDeclarations(
+      ForPartsWithDeclarations node) {
+    var builder = LinkedNodeBuilder.forPartsWithDeclarations(
+      forPartsWithDeclarations_variables: node.variables.accept(this),
+    );
+    _storeForParts(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitForPartsWithExpression(ForPartsWithExpression node) {
+    var builder = LinkedNodeBuilder.forPartsWithExpression(
+      forPartsWithExpression_initialization: node.initialization?.accept(this),
+    );
+    _storeForParts(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitForStatement2(ForStatement2 node) {
+    var builder = LinkedNodeBuilder.forStatement(
+      forStatement_body: node.body.accept(this),
+    );
+    _storeForMixin(builder, node as ForStatement2Impl);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitFunctionDeclaration(FunctionDeclaration node) {
+    var builder = LinkedNodeBuilder.functionDeclaration(
+      functionDeclaration_externalKeyword: _getToken(node.externalKeyword),
+      functionDeclaration_functionExpression:
+          node.functionExpression?.accept(this),
+      functionDeclaration_propertyKeyword: _getToken(node.propertyKeyword),
+      functionDeclaration_returnType: node.returnType?.accept(this),
+    );
+    _storeNamedCompilationUnitMember(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitFunctionDeclarationStatement(
+      FunctionDeclarationStatement node) {
+    return LinkedNodeBuilder.functionDeclarationStatement(
+      functionDeclarationStatement_functionDeclaration:
+          node.functionDeclaration.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitFunctionExpression(FunctionExpression node) {
+    return LinkedNodeBuilder.functionExpression(
+      functionExpression_body: node.body?.accept(this),
+      functionExpression_formalParameters: node.parameters?.accept(this),
+      functionExpression_typeParameters: node.typeParameters?.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitFunctionExpressionInvocation(
+      FunctionExpressionInvocation node) {
+    var builder = LinkedNodeBuilder.functionExpressionInvocation(
+      functionExpressionInvocation_function: node.function?.accept(this),
+    );
+    _storeInvocationExpression(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitFunctionTypeAlias(FunctionTypeAlias node) {
+    var builder = LinkedNodeBuilder.functionTypeAlias(
+      functionTypeAlias_formalParameters: node.parameters.accept(this),
+      functionTypeAlias_returnType: node.returnType?.accept(this),
+      functionTypeAlias_typeParameters: node.typeParameters?.accept(this),
+    );
+    _storeTypeAlias(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitFunctionTypedFormalParameter(
+      FunctionTypedFormalParameter node) {
+    var builder = LinkedNodeBuilder.functionTypedFormalParameter(
+      functionTypedFormalParameter_formalParameters:
+          node.parameters.accept(this),
+      functionTypedFormalParameter_returnType: node.returnType?.accept(this),
+      functionTypedFormalParameter_typeParameters:
+          node.typeParameters?.accept(this),
+    );
+    _storeNormalFormalParameter(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitGenericFunctionType(GenericFunctionType node) {
+    return LinkedNodeBuilder.genericFunctionType(
+      genericFunctionType_formalParameters: node.parameters.accept(this),
+      genericFunctionType_functionKeyword: _getToken(node.functionKeyword),
+      genericFunctionType_question: _getToken(node.question),
+      genericFunctionType_returnType: node.returnType?.accept(this),
+      genericFunctionType_typeParameters: node.typeParameters?.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitGenericTypeAlias(GenericTypeAlias node) {
+    var builder = LinkedNodeBuilder.genericTypeAlias(
+      genericTypeAlias_equals: _getToken(node.equals),
+      genericTypeAlias_functionType: node.functionType.accept(this),
+      genericTypeAlias_typeParameters: node.typeParameters?.accept(this),
+    );
+    _storeTypeAlias(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitHideCombinator(HideCombinator node) {
+    var builder = LinkedNodeBuilder.hideCombinator(
+      hideCombinator_hiddenNames: _writeNodeList(node.hiddenNames),
+    );
+    _storeCombinator(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitIfElement(IfElement node) {
+    var builder = LinkedNodeBuilder.ifElement(
+      ifElement_elseElement: node.elseElement?.accept(this),
+      ifElement_thenElement: node.thenElement.accept(this),
+    );
+    _storeIfMixin(builder, node as IfElementImpl);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitIfStatement(IfStatement node) {
+    var builder = LinkedNodeBuilder.ifStatement(
+      ifMixin_condition: node.condition.accept(this),
+      ifMixin_elseKeyword: _getToken(node.elseKeyword),
+      ifStatement_elseStatement: node.elseStatement?.accept(this),
+      ifMixin_ifKeyword: _getToken(node.ifKeyword),
+      ifMixin_leftParenthesis: _getToken(node.leftParenthesis),
+      ifMixin_rightParenthesis: _getToken(node.rightParenthesis),
+      ifStatement_thenStatement: node.thenStatement.accept(this),
+    );
+    _storeIfMixin(builder, node as IfStatementImpl);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitImplementsClause(ImplementsClause node) {
+    return LinkedNodeBuilder.implementsClause(
+      implementsClause_implementsKeyword: _getToken(node.implementsKeyword),
+      implementsClause_interfaces: _writeNodeList(node.interfaces),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitImportDirective(ImportDirective node) {
+    var builder = LinkedNodeBuilder.importDirective(
+      importDirective_asKeyword: _getToken(node.asKeyword),
+      importDirective_deferredKeyword: _getToken(node.deferredKeyword),
+      importDirective_prefix: node.prefix?.accept(this),
+    );
+    _storeNamespaceDirective(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitIndexExpression(IndexExpression node) {
+    return LinkedNodeBuilder.indexExpression(
+      indexExpression_element: _getReference(node.staticElement).index,
+      indexExpression_index: node.index.accept(this),
+      indexExpression_leftBracket: _getToken(node.leftBracket),
+      indexExpression_rightBracket: _getToken(node.rightBracket),
+      indexExpression_target: node.target?.accept(this),
+      expression_type: _writeType(node.staticType),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitInstanceCreationExpression(
+      InstanceCreationExpression node) {
+    InstanceCreationExpressionImpl nodeImpl = node;
+    return LinkedNodeBuilder.instanceCreationExpression(
+      instanceCreationExpression_arguments: node.argumentList.accept(this),
+      instanceCreationExpression_constructorName:
+          node.constructorName.accept(this),
+      instanceCreationExpression_keyword: _getToken(node.keyword),
+      instanceCreationExpression_typeArguments:
+          nodeImpl.typeArguments?.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitIntegerLiteral(IntegerLiteral node) {
+    return LinkedNodeBuilder.integerLiteral(
+      integerLiteral_literal: _getToken(node.literal),
+      integerLiteral_value: node.value,
+      expression_type: _writeType(node.staticType),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitInterpolationExpression(InterpolationExpression node) {
+    return LinkedNodeBuilder.interpolationExpression(
+      interpolationExpression_expression: node.expression.accept(this),
+      interpolationExpression_leftBracket: _getToken(node.leftBracket),
+      interpolationExpression_rightBracket: _getToken(node.rightBracket),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitInterpolationString(InterpolationString node) {
+    return LinkedNodeBuilder.interpolationString(
+      interpolationString_token: _getToken(node.contents),
+      interpolationString_value: node.value,
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitIsExpression(IsExpression node) {
+    var builder = LinkedNodeBuilder.isExpression(
+      isExpression_expression: node.expression.accept(this),
+      isExpression_isOperator: _getToken(node.isOperator),
+      isExpression_notOperator: _getToken(node.notOperator),
+      isExpression_type: node.type.accept(this),
+    );
+    _storeExpression(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitLabel(Label node) {
+    return LinkedNodeBuilder.label(
+      label_label: node.label.accept(this),
+      label_colon: _getToken(node.colon),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitLabeledStatement(LabeledStatement node) {
+    return LinkedNodeBuilder.labeledStatement(
+      labeledStatement_labels: _writeNodeList(node.labels),
+      labeledStatement_statement: node.statement.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitLibraryDirective(LibraryDirective node) {
+    var builder = LinkedNodeBuilder.libraryDirective(
+      libraryDirective_name: node.name.accept(this),
+    );
+    _storeDirective(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitLibraryIdentifier(LibraryIdentifier node) {
+    return LinkedNodeBuilder.libraryIdentifier(
+      libraryIdentifier_components: _writeNodeList(node.components),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitListLiteral(ListLiteral node) {
+    var builder = LinkedNodeBuilder.listLiteral(
+      listLiteral_elements: _writeNodeList(node.elements2),
+      listLiteral_leftBracket: _getToken(node.leftBracket),
+      listLiteral_rightBracket: _getToken(node.rightBracket),
+    );
+    _storeTypedLiteral(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitMapLiteralEntry(MapLiteralEntry node) {
+    return LinkedNodeBuilder.mapLiteralEntry(
+      mapLiteralEntry_key: node.key.accept(this),
+      mapLiteralEntry_separator: _getToken(node.separator),
+      mapLiteralEntry_value: node.value.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitMethodDeclaration(MethodDeclaration node) {
+    var builder = LinkedNodeBuilder.methodDeclaration(
+      methodDeclaration_body: node.body?.accept(this),
+      methodDeclaration_externalKeyword: _getToken(node.externalKeyword),
+      methodDeclaration_formalParameters: node.parameters?.accept(this),
+      methodDeclaration_modifierKeyword: _getToken(node.modifierKeyword),
+      methodDeclaration_name: node.name.accept(this),
+      methodDeclaration_operatorKeyword: _getToken(node.operatorKeyword),
+      methodDeclaration_propertyKeyword: _getToken(node.propertyKeyword),
+      methodDeclaration_returnType: node.returnType?.accept(this),
+    );
+    _storeClassMember(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitMethodInvocation(MethodInvocation node) {
+    var builder = LinkedNodeBuilder.methodInvocation(
+      methodInvocation_methodName: node.methodName?.accept(this),
+      methodInvocation_operator: _getToken(node.operator),
+      methodInvocation_target: node.target?.accept(this),
+    );
+    _storeInvocationExpression(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitMixinDeclaration(MixinDeclaration node) {
+    var builder = LinkedNodeBuilder.mixinDeclaration(
+      mixinDeclaration_mixinKeyword: _getToken(node.mixinKeyword),
+      mixinDeclaration_onClause: node.onClause?.accept(this),
+    );
+    _storeClassOrMixinDeclaration(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitNamedExpression(NamedExpression node) {
+    return LinkedNodeBuilder.namedExpression(
+      namedExpression_expression: node.expression.accept(this),
+      namedExpression_name: node.name.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitNullLiteral(NullLiteral node) {
+    var builder = LinkedNodeBuilder.nullLiteral(
+      nullLiteral_literal: _getToken(node.literal),
+    );
+    _storeExpression(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitOnClause(OnClause node) {
+    return LinkedNodeBuilder.onClause(
+      onClause_onKeyword: _getToken(node.onKeyword),
+      onClause_superclassConstraints:
+          _writeNodeList(node.superclassConstraints),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitParenthesizedExpression(ParenthesizedExpression node) {
+    var builder = LinkedNodeBuilder.parenthesizedExpression(
+      parenthesizedExpression_expression: node.expression.accept(this),
+      parenthesizedExpression_leftParenthesis: _getToken(node.leftParenthesis),
+      parenthesizedExpression_rightParenthesis:
+          _getToken(node.rightParenthesis),
+    );
+    _storeExpression(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitPartDirective(PartDirective node) {
+    var builder = LinkedNodeBuilder.partDirective();
+    _storeUriBasedDirective(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitPartOfDirective(PartOfDirective node) {
+    var builder = LinkedNodeBuilder.partOfDirective(
+      partOfDirective_libraryName: node.libraryName?.accept(this),
+      partOfDirective_ofKeyword: _getToken(node.ofKeyword),
+      partOfDirective_semicolon: _getToken(node.semicolon),
+      partOfDirective_uri: node.uri?.accept(this),
+    );
+    _storeDirective(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitPostfixExpression(PostfixExpression node) {
+    return LinkedNodeBuilder.postfixExpression(
+      expression_type: _writeType(node.staticType),
+      postfixExpression_element: _getReference(node.staticElement).index,
+      postfixExpression_operand: node.operand.accept(this),
+      postfixExpression_operator: _getToken(node.operator),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitPrefixedIdentifier(PrefixedIdentifier node) {
+    return LinkedNodeBuilder.prefixedIdentifier(
+      prefixedIdentifier_identifier: node.identifier.accept(this),
+      prefixedIdentifier_period: _getToken(node.period),
+      prefixedIdentifier_prefix: node.prefix.accept(this),
+      expression_type: _writeType(node.staticType),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitPrefixExpression(PrefixExpression node) {
+    return LinkedNodeBuilder.prefixExpression(
+      expression_type: _writeType(node.staticType),
+      prefixExpression_element: _getReference(node.staticElement).index,
+      prefixExpression_operand: node.operand.accept(this),
+      prefixExpression_operator: _getToken(node.operator),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitPropertyAccess(PropertyAccess node) {
+    var builder = LinkedNodeBuilder.propertyAccess(
+      propertyAccess_operator: _getToken(node.operator),
+      propertyAccess_propertyName: node.propertyName.accept(this),
+      propertyAccess_target: node.target?.accept(this),
+    );
+    _storeExpression(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    var builder = LinkedNodeBuilder.redirectingConstructorInvocation(
+      redirectingConstructorInvocation_arguments:
+          node.argumentList.accept(this),
+      redirectingConstructorInvocation_constructorName:
+          node.constructorName?.accept(this),
+      redirectingConstructorInvocation_element:
+          _getReference(node.staticElement).index,
+      redirectingConstructorInvocation_period: _getToken(node.period),
+      redirectingConstructorInvocation_thisKeyword: _getToken(node.thisKeyword),
+    );
+    _storeConstructorInitializer(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitRethrowExpression(RethrowExpression node) {
+    var builder = LinkedNodeBuilder.rethrowExpression(
+      rethrowExpression_rethrowKeyword: _getToken(node.rethrowKeyword),
+    );
+    _storeExpression(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitReturnStatement(ReturnStatement node) {
+    return LinkedNodeBuilder.returnStatement(
+      returnStatement_expression: node.expression?.accept(this),
+      returnStatement_returnKeyword: _getToken(node.returnKeyword),
+      returnStatement_semicolon: _getToken(node.semicolon),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitScriptTag(ScriptTag node) {
+    return LinkedNodeBuilder.scriptTag(
+      scriptTag_scriptTag: _getToken(node.scriptTag),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitSetOrMapLiteral(SetOrMapLiteral node) {
+    var builder = LinkedNodeBuilder.setOrMapLiteral(
+      setOrMapLiteral_elements: _writeNodeList(node.elements2),
+      setOrMapLiteral_isMap: node.isMap,
+      setOrMapLiteral_isSet: node.isSet,
+      setOrMapLiteral_leftBracket: _getToken(node.leftBracket),
+      setOrMapLiteral_rightBracket: _getToken(node.rightBracket),
+    );
+    _storeTypedLiteral(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitShowCombinator(ShowCombinator node) {
+    var builder = LinkedNodeBuilder.showCombinator(
+      showCombinator_shownNames: _writeNodeList(node.shownNames),
+    );
+    _storeCombinator(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitSimpleFormalParameter(SimpleFormalParameter node) {
+    var builder = LinkedNodeBuilder.simpleFormalParameter(
+      simpleFormalParameter_keyword: _getToken(node.keyword),
+      simpleFormalParameter_type: node.type?.accept(this),
+    );
+    _storeNormalFormalParameter(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitSimpleIdentifier(SimpleIdentifier node) {
+    var isDeclared = node.inDeclarationContext();
+
+    return LinkedNodeBuilder.simpleIdentifier(
+      simpleIdentifier_element:
+          isDeclared ? null : _getReference(node.staticElement).index,
+      simpleIdentifier_token: _getToken(node.token),
+      expression_type: _writeType(node.staticType),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitSimpleStringLiteral(SimpleStringLiteral node) {
+    var builder = LinkedNodeBuilder.simpleStringLiteral(
+      simpleStringLiteral_token: _getToken(node.literal),
+      simpleStringLiteral_value: node.value,
+    );
+    _storeExpression(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitSpreadElement(SpreadElement node) {
+    return LinkedNodeBuilder.spreadElement(
+      spreadElement_expression: node.expression.accept(this),
+      spreadElement_spreadOperator: _getToken(node.spreadOperator),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitStringInterpolation(StringInterpolation node) {
+    return LinkedNodeBuilder.stringInterpolation(
+      stringInterpolation_elements: _writeNodeList(node.elements),
+      expression_type: _writeType(node.staticType),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitSuperConstructorInvocation(
+      SuperConstructorInvocation node) {
+    var builder = LinkedNodeBuilder.superConstructorInvocation(
+      superConstructorInvocation_arguments: node.argumentList.accept(this),
+      superConstructorInvocation_constructorName:
+          node.constructorName?.accept(this),
+      superConstructorInvocation_element:
+          _getReference(node.staticElement).index,
+      superConstructorInvocation_period: _getToken(node.period),
+      superConstructorInvocation_superKeyword: _getToken(node.superKeyword),
+    );
+    _storeConstructorInitializer(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitSuperExpression(SuperExpression node) {
+    var builder = LinkedNodeBuilder.superExpression(
+      superExpression_superKeyword: _getToken(node.superKeyword),
+    );
+    _storeExpression(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitSwitchCase(SwitchCase node) {
+    var builder = LinkedNodeBuilder.switchCase(
+      switchCase_expression: node.expression.accept(this),
+    );
+    _storeSwitchMember(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitSwitchDefault(SwitchDefault node) {
+    var builder = LinkedNodeBuilder.switchDefault();
+    _storeSwitchMember(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitSwitchStatement(SwitchStatement node) {
+    return LinkedNodeBuilder.switchStatement(
+      switchStatement_expression: node.expression.accept(this),
+      switchStatement_leftBracket: _getToken(node.leftBracket),
+      switchStatement_leftParenthesis: _getToken(node.leftParenthesis),
+      switchStatement_members: _writeNodeList(node.members),
+      switchStatement_rightBracket: _getToken(node.rightBracket),
+      switchStatement_rightParenthesis: _getToken(node.rightParenthesis),
+      switchStatement_switchKeyword: _getToken(node.switchKeyword),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitSymbolLiteral(SymbolLiteral node) {
+    var builder = LinkedNodeBuilder.symbolLiteral(
+      symbolLiteral_poundSign: _getToken(node.poundSign),
+      symbolLiteral_components: _getTokens(node.components),
+    );
+    _storeExpression(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitThisExpression(ThisExpression node) {
+    var builder = LinkedNodeBuilder.thisExpression(
+      thisExpression_thisKeyword: _getToken(node.thisKeyword),
+    );
+    _storeExpression(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitThrowExpression(ThrowExpression node) {
+    return LinkedNodeBuilder.throwExpression(
+      throwExpression_expression: node.expression.accept(this),
+      throwExpression_throwKeyword: _getToken(node.throwKeyword),
+      expression_type: _writeType(node.staticType),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitTopLevelVariableDeclaration(
+      TopLevelVariableDeclaration node) {
+    var builder = LinkedNodeBuilder.topLevelVariableDeclaration(
+      topLevelVariableDeclaration_semicolon: _getToken(node.semicolon),
+      topLevelVariableDeclaration_variableList: node.variables?.accept(this),
+    );
+    _storeCompilationUnitMember(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitTryStatement(TryStatement node) {
+    return LinkedNodeBuilder.tryStatement(
+      tryStatement_body: node.body.accept(this),
+      tryStatement_catchClauses: _writeNodeList(node.catchClauses),
+      tryStatement_finallyBlock: node.finallyBlock?.accept(this),
+      tryStatement_finallyKeyword: _getToken(node.finallyKeyword),
+      tryStatement_tryKeyword: _getToken(node.tryKeyword),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitTypeArgumentList(TypeArgumentList node) {
+    return LinkedNodeBuilder.typeArgumentList(
+      typeArgumentList_arguments: _writeNodeList(node.arguments),
+      typeArgumentList_leftBracket: _getToken(node.leftBracket),
+      typeArgumentList_rightBracket: _getToken(node.rightBracket),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitTypeName(TypeName node) {
+    return LinkedNodeBuilder.typeName(
+      typeName_name: node.name.accept(this),
+      typeName_question: _getToken(node.question),
+      typeName_type: _writeType(node.type),
+      typeName_typeArguments: node.typeArguments?.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitTypeParameter(TypeParameter node) {
+    var builder = LinkedNodeBuilder.typeParameter(
+        typeParameter_bound: node.bound?.accept(this),
+        typeParameter_extendsKeyword: _getToken(node.extendsKeyword),
+        typeParameter_name: node.name.accept(this));
+    _storeDeclaration(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitTypeParameterList(TypeParameterList node) {
+    return LinkedNodeBuilder.typeParameterList(
+      typeParameterList_leftBracket: _getToken(node.leftBracket),
+      typeParameterList_rightBracket: _getToken(node.rightBracket),
+      typeParameterList_typeParameters: _writeNodeList(node.typeParameters),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitVariableDeclaration(VariableDeclaration node) {
+    return LinkedNodeBuilder.variableDeclaration(
+      variableDeclaration_equals: _getToken(node.equals),
+      variableDeclaration_initializer: node.initializer?.accept(this),
+      variableDeclaration_name: node.name.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitVariableDeclarationList(VariableDeclarationList node) {
+    var builder = LinkedNodeBuilder.variableDeclarationList(
+      variableDeclarationList_keyword: _getToken(node.keyword),
+      variableDeclarationList_type: node.type?.accept(this),
+      variableDeclarationList_variables: _writeNodeList(node.variables),
+    );
+    _storeAnnotatedNode(builder, node);
+    return builder;
+  }
+
+  @override
+  LinkedNodeBuilder visitVariableDeclarationStatement(
+      VariableDeclarationStatement node) {
+    return LinkedNodeBuilder.variableDeclarationStatement(
+      variableDeclarationStatement_semicolon: _getToken(node.semicolon),
+      variableDeclarationStatement_variables: node.variables.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitWhileStatement(WhileStatement node) {
+    return LinkedNodeBuilder.whileStatement(
+      whileStatement_body: node.body.accept(this),
+      whileStatement_condition: node.condition.accept(this),
+      whileStatement_leftParenthesis: _getToken(node.leftParenthesis),
+      whileStatement_rightParenthesis: _getToken(node.rightParenthesis),
+      whileStatement_whileKeyword: _getToken(node.whileKeyword),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitWithClause(WithClause node) {
+    return LinkedNodeBuilder.withClause(
+      withClause_mixinTypes: _writeNodeList(node.mixinTypes),
+      withClause_withKeyword: _getToken(node.withKeyword),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitYieldStatement(YieldStatement node) {
+    var builder = LinkedNodeBuilder.yieldStatement(
+      yieldStatement_yieldKeyword: _getToken(node.yieldKeyword),
+      yieldStatement_expression: node.expression.accept(this),
+      yieldStatement_semicolon: _getToken(node.semicolon),
+      yieldStatement_star: _getToken(node.star),
+    );
+    _storeStatement(builder, node);
+    return builder;
+  }
+
+  LinkedNodeBuilder writeNode(AstNode node) {
+    _writeTokens(node.beginToken, node.endToken);
+    return node.accept(this);
+  }
+
+  /// Write [referenceRoot] and all its children into [referenceBuilder].
+  void writeReferences() {
+    for (var reference in _references) {
+      referenceBuilder.parent.add(reference.parent?.index ?? 0);
+      referenceBuilder.name.add(reference.name);
+    }
+  }
+
+  void _addToken({
+    @required bool isSynthetic,
+    @required UnlinkedTokenKind kind,
+    @required int length,
+    @required String lexeme,
+    @required int offset,
+    @required int precedingComment,
+    @required UnlinkedTokenType type,
+  }) {
+    tokens.endGroup.add(0);
+    tokens.isSynthetic.add(isSynthetic);
+    tokens.kind.add(kind);
+    tokens.length.add(length);
+    tokens.lexeme.add(lexeme);
+    tokens.next.add(0);
+    tokens.offset.add(offset);
+    tokens.precedingComment.add(precedingComment);
+    tokens.type.add(type);
+    _tokenIndex++;
+  }
+
+  void _ensureReferenceIndex(Reference reference) {
+    if (reference.index == null) {
+      reference.index = _references.length;
+      _references.add(reference);
+    }
+  }
+
+  Reference _getReference(Element element) {
+    if (element == null) return referenceRoot;
+
+    // TODO(scheglov) handle Member elements
+
+    Reference result;
+    if (element is ClassElement) {
+      var containerRef = _getReference(element.library).getChild('@class');
+      _ensureReferenceIndex(containerRef);
+
+      result = containerRef.getChild(element.name);
+    } else if (element is CompilationUnitElement) {
+      return _getReference(element.enclosingElement);
+    } else if (element is ConstructorElement) {
+      var enclosingRef = _getReference(element.enclosingElement);
+      var containerRef = enclosingRef.getChild('@constructor');
+      _ensureReferenceIndex(containerRef);
+
+      result = containerRef.getChild(element.name);
+    } else if (element is DynamicElementImpl) {
+      result = _getReference(element.library).getChild('@dynamic');
+    } else if (element is FieldElement) {
+      var enclosingRef = _getReference(element.enclosingElement);
+      var containerRef = enclosingRef.getChild('@field');
+      _ensureReferenceIndex(containerRef);
+
+      result = containerRef.getChild(element.name);
+    } else if (element is FunctionElement) {
+      var containerRef = _getReference(element.library).getChild('@function');
+      _ensureReferenceIndex(containerRef);
+
+      result = containerRef.getChild(element.name ?? '');
+    } else if (element is FunctionTypeAliasElement) {
+      var libraryRef = _getReference(element.library);
+      var containerRef = libraryRef.getChild('@functionTypeAlias');
+      _ensureReferenceIndex(containerRef);
+
+      result = containerRef.getChild(element.name);
+    } else if (element is GenericFunctionTypeElement) {
+      if (element.enclosingElement is GenericTypeAliasElement) {
+        return _getReference(element.enclosingElement);
+      } else {
+        var libraryRef = _getReference(element.library);
+        var containerRef = libraryRef.getChild('@functionType');
+        _ensureReferenceIndex(containerRef);
+
+        // TODO(scheglov) do we need to store these elements at all?
+        result = containerRef.getChild('<unnamed>');
+      }
+    } else if (element is GenericTypeAliasElement) {
+      var containerRef = _getReference(element.library).getChild('@typeAlias');
+      _ensureReferenceIndex(containerRef);
+
+      result = containerRef.getChild(element.name);
+    } else if (element is GenericFunctionTypeElement &&
+        element.enclosingElement is ParameterElement) {
+      return _getReference(element.enclosingElement);
+    } else if (element is LibraryElement) {
+      var uriStr = element.source.uri.toString();
+      result = referenceRoot.getChild(uriStr);
+    } else if (element is LabelElement) {
+      var enclosingRef = _getReference(element.enclosingElement);
+      var containerRef = enclosingRef.getChild('@label');
+      _ensureReferenceIndex(containerRef);
+
+      // TODO(scheglov) use index instead of offset
+      result = containerRef.getChild('${element.nameOffset}');
+    } else if (element is LocalVariableElement) {
+      var enclosingRef = _getReference(element.enclosingElement);
+      var containerRef = enclosingRef.getChild('@localVariable');
+      _ensureReferenceIndex(containerRef);
+
+      // TODO(scheglov) use index instead of offset
+      result = containerRef.getChild('${element.nameOffset}');
+    } else if (element is MethodElement) {
+      var enclosingRef = _getReference(element.enclosingElement);
+      var containerRef = enclosingRef.getChild('@method');
+      _ensureReferenceIndex(containerRef);
+
+      result = containerRef.getChild(element.name);
+    } else if (element is MultiplyDefinedElement) {
+      return referenceRoot;
+    } else if (element is ParameterElement) {
+      var enclosing = element.enclosingElement;
+      var enclosingRef = _getReference(enclosing);
+      var containerRef = enclosingRef.getChild('@parameter');
+      _ensureReferenceIndex(containerRef);
+
+      result = containerRef.getChild(element.name);
+    } else if (element is PrefixElement) {
+      var containerRef = _getReference(element.library).getChild('@prefix');
+      _ensureReferenceIndex(containerRef);
+
+      result = containerRef.getChild(element.name);
+    } else if (element is PropertyAccessorElement) {
+      var enclosingRef = _getReference(element.library);
+      var containerRef = enclosingRef.getChild(
+        element.isGetter ? '@getter' : '@setter',
+      );
+      _ensureReferenceIndex(containerRef);
+
+      result = containerRef.getChild(element.displayName);
+    } else if (element is TopLevelVariableElement) {
+      var enclosingRef = _getReference(element.library);
+      var containerRef = enclosingRef.getChild('@variable');
+      _ensureReferenceIndex(containerRef);
+
+      result = containerRef.getChild(element.name);
+    } else if (element is TypeParameterElement) {
+      var enclosingRef = _getReference(element.enclosingElement);
+      var containerRef = enclosingRef.getChild('@typeParameter');
+      _ensureReferenceIndex(containerRef);
+
+      result = containerRef.getChild(element.name);
+    } else {
+      throw UnimplementedError('(${element.runtimeType}) $element');
+    }
+    _ensureReferenceIndex(result);
+    return result;
+  }
+
+  List<int> _getReferences(List<Element> elements) {
+    var result = List<int>(elements.length);
+    for (var i = 0; i < elements.length; ++i) {
+      var element = elements[i];
+      result[i] = _getReference(element).index;
+    }
+    return result;
+  }
+
+  int _getToken(Token token) {
+    if (token == null) return 0;
+
+    var index = _tokenMap[token];
+    if (index == null) {
+      throw StateError('Token must be written first: $token');
+    }
+    return index;
+  }
+
+  List<int> _getTokens(List<Token> tokenList) {
+    var result = List<int>(tokenList.length);
+    for (var i = 0; i < tokenList.length; ++i) {
+      var token = tokenList[i];
+      result[i] = _getToken(token);
+    }
+    return result;
+  }
+
+  void _storeAnnotatedNode(LinkedNodeBuilder builder, AnnotatedNode node) {
+    builder
+      ..annotatedNode_comment = node.documentationComment?.accept(this)
+      ..annotatedNode_metadata = _writeNodeList(node.metadata);
+  }
+
+  void _storeClassMember(LinkedNodeBuilder builder, ClassMember node) {
+    _storeDeclaration(builder, node);
+  }
+
+  void _storeClassOrMixinDeclaration(
+      LinkedNodeBuilder builder, ClassOrMixinDeclaration node) {
+    builder
+      ..classOrMixinDeclaration_implementsClause =
+          node.implementsClause?.accept(this)
+      ..classOrMixinDeclaration_leftBracket = _getToken(node.leftBracket)
+      ..classOrMixinDeclaration_members = _writeNodeList(node.members)
+      ..classOrMixinDeclaration_rightBracket = _getToken(node.rightBracket)
+      ..classOrMixinDeclaration_typeParameters =
+          node.typeParameters?.accept(this);
+    _storeNamedCompilationUnitMember(builder, node);
+  }
+
+  void _storeCombinator(LinkedNodeBuilder builder, Combinator node) {
+    builder.combinator_keyword = _getToken(node.keyword);
+  }
+
+  void _storeCompilationUnitMember(
+      LinkedNodeBuilder builder, CompilationUnitMember node) {
+    _storeDeclaration(builder, node);
+  }
+
+  void _storeConstructorInitializer(
+      LinkedNodeBuilder builder, ConstructorInitializer node) {}
+
+  void _storeDeclaration(LinkedNodeBuilder builder, Declaration node) {
+    _storeAnnotatedNode(builder, node);
+  }
+
+  void _storeDirective(LinkedNodeBuilder builder, Directive node) {
+    _storeAnnotatedNode(builder, node);
+    builder..directive_keyword = _getToken(node.keyword);
+  }
+
+  void _storeExpression(LinkedNodeBuilder builder, Expression node) {
+    builder.expression_type = _writeType(node.staticType);
+  }
+
+  void _storeForEachParts(LinkedNodeBuilder builder, ForEachParts node) {
+    _storeForLoopParts(builder, node);
+    builder
+      ..forEachParts_inKeyword = _getToken(node.inKeyword)
+      ..forEachParts_iterable = node.iterable?.accept(this);
+  }
+
+  void _storeForLoopParts(LinkedNodeBuilder builder, ForLoopParts node) {}
+
+  void _storeFormalParameter(LinkedNodeBuilder builder, FormalParameter node) {
+    var kind = LinkedNodeFormalParameterKind.required;
+    if (node.isNamed) {
+      kind = LinkedNodeFormalParameterKind.optionalNamed;
+    } else if (node.isOptionalPositional) {
+      kind = LinkedNodeFormalParameterKind.optionalPositional;
+    }
+
+    builder.formalParameter_kind = kind;
+  }
+
+  void _storeForMixin(LinkedNodeBuilder builder, ForMixin node) {
+    builder
+      ..forMixin_awaitKeyword = _getToken(node.awaitKeyword)
+      ..forMixin_forKeyword = _getToken(node.forKeyword)
+      ..forMixin_forLoopParts = node.forLoopParts.accept(this)
+      ..forMixin_leftParenthesis = _getToken(node.leftParenthesis)
+      ..forMixin_rightParenthesis = _getToken(node.rightParenthesis);
+  }
+
+  void _storeForParts(LinkedNodeBuilder builder, ForParts node) {
+    _storeForLoopParts(builder, node);
+    builder
+      ..forParts_leftSeparator = _getToken(node.leftSeparator)
+      ..forParts_condition = node.condition?.accept(this)
+      ..forParts_rightSeparator = _getToken(node.rightSeparator)
+      ..forParts_updaters = _writeNodeList(node.updaters);
+  }
+
+  void _storeFunctionBody(LinkedNodeBuilder builder, FunctionBody node) {}
+
+  void _storeIfMixin(LinkedNodeBuilder builder, IfMixin node) {
+    builder
+      ..ifMixin_condition = node.condition.accept(this)
+      ..ifMixin_elseKeyword = _getToken(node.elseKeyword)
+      ..ifMixin_ifKeyword = _getToken(node.ifKeyword)
+      ..ifMixin_leftParenthesis = _getToken(node.leftParenthesis)
+      ..ifMixin_rightParenthesis = _getToken(node.rightParenthesis);
+  }
+
+  void _storeInvocationExpression(
+      LinkedNodeBuilder builder, InvocationExpression node) {
+    _storeExpression(builder, node);
+    builder
+      ..invocationExpression_arguments = node.argumentList.accept(this)
+      ..invocationExpression_invokeType = _writeType(node.staticInvokeType)
+      ..invocationExpression_typeArguments = node.typeArguments?.accept(this);
+  }
+
+  void _storeNamedCompilationUnitMember(
+      LinkedNodeBuilder builder, NamedCompilationUnitMember node) {
+    _storeCompilationUnitMember(builder, node);
+    builder..namedCompilationUnitMember_name = node.name.accept(this);
+  }
+
+  void _storeNamespaceDirective(
+      LinkedNodeBuilder builder, NamespaceDirective node) {
+    _storeUriBasedDirective(builder, node);
+    builder
+      ..namespaceDirective_combinators = _writeNodeList(node.combinators)
+      ..namespaceDirective_configurations = _writeNodeList(node.configurations)
+      ..namespaceDirective_selectedUriContent = node.selectedUriContent
+      ..namespaceDirective_semicolon = _getToken(node.semicolon);
+  }
+
+  void _storeNormalFormalParameter(
+      LinkedNodeBuilder builder, NormalFormalParameter node) {
+    _storeFormalParameter(builder, node);
+    builder
+      ..normalFormalParameter_comment = node.documentationComment?.accept(this)
+      ..normalFormalParameter_covariantKeyword =
+          _getToken(node.covariantKeyword)
+      ..normalFormalParameter_identifier = node.identifier?.accept(this)
+      ..normalFormalParameter_metadata = _writeNodeList(node.metadata);
+  }
+
+  void _storeStatement(LinkedNodeBuilder builder, Statement node) {}
+
+  void _storeSwitchMember(LinkedNodeBuilder builder, SwitchMember node) {
+    builder.switchMember_colon = _getToken(node.colon);
+    builder.switchMember_keyword = _getToken(node.keyword);
+    builder.switchMember_labels = _writeNodeList(node.labels);
+    builder.switchMember_statements = _writeNodeList(node.statements);
+  }
+
+  void _storeTypeAlias(LinkedNodeBuilder builder, TypeAlias node) {
+    _storeNamedCompilationUnitMember(builder, node);
+    builder
+      ..typeAlias_semicolon = _getToken(node.semicolon)
+      ..typeAlias_typedefKeyword = _getToken(node.typedefKeyword);
+  }
+
+  void _storeTypedLiteral(LinkedNodeBuilder builder, TypedLiteral node) {
+    _storeExpression(builder, node);
+    builder
+      ..typedLiteral_constKeyword = _getToken(node.constKeyword)
+      ..typedLiteral_typeArguments = node.typeArguments?.accept(this);
+  }
+
+  void _storeUriBasedDirective(
+      LinkedNodeBuilder builder, UriBasedDirective node) {
+    _storeDirective(builder, node);
+    builder
+      ..uriBasedDirective_uri = node.uri.accept(this)
+      ..uriBasedDirective_uriContent = node.uriContent
+      ..uriBasedDirective_uriElement = _getReference(node.uriElement).index;
+  }
+
+  int _writeCommentToken(CommentToken token) {
+    if (token == null) return 0;
+    var firstIndex = _tokenIndex;
+
+    var previousIndex = 0;
+    while (token != null) {
+      var index = _tokenIndex;
+      _tokenMap[token] = index;
+      _addToken(
+        isSynthetic: false,
+        kind: UnlinkedTokenKind.comment,
+        length: token.length,
+        lexeme: token.lexeme,
+        offset: token.offset,
+        precedingComment: 0,
+        type: _astToBinaryTokenType(token.type),
+      );
+
+      if (previousIndex != 0) {
+        tokens.next[previousIndex] = index;
+      }
+      previousIndex = index;
+
+      token = token.next;
+    }
+
+    return firstIndex;
+  }
+
+  List<LinkedNodeBuilder> _writeNodeList(List<AstNode> nodeList) {
+    var result = List<LinkedNodeBuilder>.filled(
+      nodeList.length,
+      null,
+      growable: true,
+    );
+    for (var i = 0; i < nodeList.length; ++i) {
+      result[i] = nodeList[i].accept(this);
+    }
+    return result;
+  }
+
+  int _writeToken(Token token) {
+    assert(_tokenMap[token] == null);
+
+    var commentIndex = _writeCommentToken(token.precedingComments);
+
+    var index = _tokenIndex;
+    _tokenMap[token] = index;
+
+    if (token is KeywordToken) {
+      _addToken(
+        isSynthetic: token.isSynthetic,
+        kind: UnlinkedTokenKind.keyword,
+        lexeme: '',
+        offset: token.offset,
+        length: token.length,
+        precedingComment: commentIndex,
+        type: _astToBinaryTokenType(token.type),
+      );
+    } else if (token is StringToken) {
+      _addToken(
+        isSynthetic: token.isSynthetic,
+        kind: UnlinkedTokenKind.string,
+        lexeme: token.lexeme,
+        offset: token.offset,
+        length: token.length,
+        precedingComment: commentIndex,
+        type: _astToBinaryTokenType(token.type),
+      );
+    } else if (token is SimpleToken) {
+      _addToken(
+        isSynthetic: token.isSynthetic,
+        kind: UnlinkedTokenKind.simple,
+        lexeme: token.lexeme,
+        offset: token.offset,
+        length: token.length,
+        precedingComment: commentIndex,
+        type: _astToBinaryTokenType(token.type),
+      );
+    } else {
+      throw UnimplementedError('(${token.runtimeType}) $token');
+    }
+
+    return index;
+  }
+
+  /// Write all the tokens from the [first] to the [last] inclusively.
+  void _writeTokens(Token first, Token last) {
+    if (first is CommentToken) {
+      first = (first as CommentToken).parent;
+    }
+
+    var endGroupToBeginIndexMap = <Token, int>{};
+    var previousIndex = 0;
+    for (var token = first;; token = token.next) {
+      var index = _writeToken(token);
+
+      if (previousIndex != 0) {
+        tokens.next[previousIndex] = index;
+      }
+      previousIndex = index;
+
+      if (token.endGroup != null) {
+        endGroupToBeginIndexMap[token.endGroup] = index;
+      }
+
+      var beginIndex = endGroupToBeginIndexMap[token];
+      if (beginIndex != null) {
+        tokens.endGroup[beginIndex] = index;
+      }
+
+      if (token == last) break;
+    }
+  }
+
+  LinkedNodeTypeBuilder _writeType(DartType type) {
+    if (type == null) return null;
+
+    if (type.isBottom) {
+      return LinkedNodeTypeBuilder(
+        kind: LinkedNodeTypeKind.bottom,
+      );
+    } else if (type.isDynamic) {
+      return LinkedNodeTypeBuilder(
+        kind: LinkedNodeTypeKind.dynamic_,
+      );
+    } else if (type is FunctionType) {
+      return LinkedNodeTypeBuilder(
+        kind: LinkedNodeTypeKind.function,
+        functionFormalParameters: _getReferences(type.parameters),
+        functionReturnType: _writeType(type.returnType),
+        functionTypeParameters: _getReferences(type.parameters),
+      );
+    } else if (type is InterfaceType) {
+      return LinkedNodeTypeBuilder(
+        kind: LinkedNodeTypeKind.interface,
+        interfaceClass: _getReference(type.element).index,
+        interfaceTypeArguments: type.typeArguments.map(_writeType).toList(),
+      );
+    } else if (type is TypeParameterType) {
+      return LinkedNodeTypeBuilder(
+        kind: LinkedNodeTypeKind.typeParameter,
+        typeParameterParameter: _getReference(type.element).index,
+      );
+    } else if (type is VoidType) {
+      return LinkedNodeTypeBuilder(
+        kind: LinkedNodeTypeKind.void_,
+      );
+    } else {
+      throw UnimplementedError('(${type.runtimeType}) $type');
+    }
+  }
+
+  static UnlinkedTokenType _astToBinaryTokenType(TokenType type) {
+    if (type == Keyword.ABSTRACT) {
+      return UnlinkedTokenType.ABSTRACT;
+    } else if (type == TokenType.AMPERSAND) {
+      return UnlinkedTokenType.AMPERSAND;
+    } else if (type == TokenType.AMPERSAND_AMPERSAND) {
+      return UnlinkedTokenType.AMPERSAND_AMPERSAND;
+    } else if (type == TokenType.AMPERSAND_EQ) {
+      return UnlinkedTokenType.AMPERSAND_EQ;
+    } else if (type == TokenType.AS) {
+      return UnlinkedTokenType.AS;
+    } else if (type == Keyword.ASSERT) {
+      return UnlinkedTokenType.ASSERT;
+    } else if (type == Keyword.ASYNC) {
+      return UnlinkedTokenType.ASYNC;
+    } else if (type == TokenType.AT) {
+      return UnlinkedTokenType.AT;
+    } else if (type == Keyword.AWAIT) {
+      return UnlinkedTokenType.AWAIT;
+    } else if (type == TokenType.BACKPING) {
+      return UnlinkedTokenType.BACKPING;
+    } else if (type == TokenType.BACKSLASH) {
+      return UnlinkedTokenType.BACKSLASH;
+    } else if (type == TokenType.BANG) {
+      return UnlinkedTokenType.BANG;
+    } else if (type == TokenType.BANG_EQ) {
+      return UnlinkedTokenType.BANG_EQ;
+    } else if (type == TokenType.BAR) {
+      return UnlinkedTokenType.BAR;
+    } else if (type == TokenType.BAR_BAR) {
+      return UnlinkedTokenType.BAR_BAR;
+    } else if (type == TokenType.BAR_EQ) {
+      return UnlinkedTokenType.BAR_EQ;
+    } else if (type == Keyword.BREAK) {
+      return UnlinkedTokenType.BREAK;
+    } else if (type == TokenType.CARET) {
+      return UnlinkedTokenType.CARET;
+    } else if (type == TokenType.CARET_EQ) {
+      return UnlinkedTokenType.CARET_EQ;
+    } else if (type == Keyword.CASE) {
+      return UnlinkedTokenType.CASE;
+    } else if (type == Keyword.CATCH) {
+      return UnlinkedTokenType.CATCH;
+    } else if (type == Keyword.CLASS) {
+      return UnlinkedTokenType.CLASS;
+    } else if (type == TokenType.CLOSE_CURLY_BRACKET) {
+      return UnlinkedTokenType.CLOSE_CURLY_BRACKET;
+    } else if (type == TokenType.CLOSE_PAREN) {
+      return UnlinkedTokenType.CLOSE_PAREN;
+    } else if (type == TokenType.CLOSE_SQUARE_BRACKET) {
+      return UnlinkedTokenType.CLOSE_SQUARE_BRACKET;
+    } else if (type == TokenType.COLON) {
+      return UnlinkedTokenType.COLON;
+    } else if (type == TokenType.COMMA) {
+      return UnlinkedTokenType.COMMA;
+    } else if (type == Keyword.CONST) {
+      return UnlinkedTokenType.CONST;
+    } else if (type == Keyword.CONTINUE) {
+      return UnlinkedTokenType.CONTINUE;
+    } else if (type == Keyword.COVARIANT) {
+      return UnlinkedTokenType.COVARIANT;
+    } else if (type == Keyword.DEFAULT) {
+      return UnlinkedTokenType.DEFAULT;
+    } else if (type == Keyword.DEFERRED) {
+      return UnlinkedTokenType.DEFERRED;
+    } else if (type == Keyword.DO) {
+      return UnlinkedTokenType.DO;
+    } else if (type == TokenType.DOUBLE) {
+      return UnlinkedTokenType.DOUBLE;
+    } else if (type == Keyword.DYNAMIC) {
+      return UnlinkedTokenType.DYNAMIC;
+    } else if (type == Keyword.ELSE) {
+      return UnlinkedTokenType.ELSE;
+    } else if (type == Keyword.ENUM) {
+      return UnlinkedTokenType.ENUM;
+    } else if (type == TokenType.EOF) {
+      return UnlinkedTokenType.EOF;
+    } else if (type == TokenType.EQ) {
+      return UnlinkedTokenType.EQ;
+    } else if (type == TokenType.EQ_EQ) {
+      return UnlinkedTokenType.EQ_EQ;
+    } else if (type == Keyword.EXPORT) {
+      return UnlinkedTokenType.EXPORT;
+    } else if (type == Keyword.EXTENDS) {
+      return UnlinkedTokenType.EXTENDS;
+    } else if (type == Keyword.EXTERNAL) {
+      return UnlinkedTokenType.EXTERNAL;
+    } else if (type == Keyword.FACTORY) {
+      return UnlinkedTokenType.FACTORY;
+    } else if (type == Keyword.FALSE) {
+      return UnlinkedTokenType.FALSE;
+    } else if (type == Keyword.FINAL) {
+      return UnlinkedTokenType.FINAL;
+    } else if (type == Keyword.FINALLY) {
+      return UnlinkedTokenType.FINALLY;
+    } else if (type == Keyword.FOR) {
+      return UnlinkedTokenType.FOR;
+    } else if (type == Keyword.FUNCTION) {
+      return UnlinkedTokenType.FUNCTION_KEYWORD;
+    } else if (type == TokenType.FUNCTION) {
+      return UnlinkedTokenType.FUNCTION;
+    } else if (type == Keyword.GET) {
+      return UnlinkedTokenType.GET;
+    } else if (type == TokenType.GT) {
+      return UnlinkedTokenType.GT;
+    } else if (type == TokenType.GT_EQ) {
+      return UnlinkedTokenType.GT_EQ;
+    } else if (type == TokenType.GT_GT) {
+      return UnlinkedTokenType.GT_GT;
+    } else if (type == TokenType.GT_GT_EQ) {
+      return UnlinkedTokenType.GT_GT_EQ;
+    } else if (type == TokenType.HASH) {
+      return UnlinkedTokenType.HASH;
+    } else if (type == TokenType.HEXADECIMAL) {
+      return UnlinkedTokenType.HEXADECIMAL;
+    } else if (type == Keyword.HIDE) {
+      return UnlinkedTokenType.HIDE;
+    } else if (type == TokenType.IDENTIFIER) {
+      return UnlinkedTokenType.IDENTIFIER;
+    } else if (type == Keyword.IF) {
+      return UnlinkedTokenType.IF;
+    } else if (type == Keyword.IMPLEMENTS) {
+      return UnlinkedTokenType.IMPLEMENTS;
+    } else if (type == Keyword.IMPORT) {
+      return UnlinkedTokenType.IMPORT;
+    } else if (type == Keyword.IN) {
+      return UnlinkedTokenType.IN;
+    } else if (type == TokenType.INDEX) {
+      return UnlinkedTokenType.INDEX;
+    } else if (type == TokenType.INDEX_EQ) {
+      return UnlinkedTokenType.INDEX_EQ;
+    } else if (type == TokenType.INT) {
+      return UnlinkedTokenType.INT;
+    } else if (type == Keyword.INTERFACE) {
+      return UnlinkedTokenType.INTERFACE;
+    } else if (type == TokenType.IS) {
+      return UnlinkedTokenType.IS;
+    } else if (type == Keyword.LIBRARY) {
+      return UnlinkedTokenType.LIBRARY;
+    } else if (type == TokenType.LT) {
+      return UnlinkedTokenType.LT;
+    } else if (type == TokenType.LT_EQ) {
+      return UnlinkedTokenType.LT_EQ;
+    } else if (type == TokenType.LT_LT) {
+      return UnlinkedTokenType.LT_LT;
+    } else if (type == TokenType.LT_LT_EQ) {
+      return UnlinkedTokenType.LT_LT_EQ;
+    } else if (type == TokenType.MINUS) {
+      return UnlinkedTokenType.MINUS;
+    } else if (type == TokenType.MINUS_EQ) {
+      return UnlinkedTokenType.MINUS_EQ;
+    } else if (type == TokenType.MINUS_MINUS) {
+      return UnlinkedTokenType.MINUS_MINUS;
+    } else if (type == Keyword.MIXIN) {
+      return UnlinkedTokenType.MIXIN;
+    } else if (type == TokenType.MULTI_LINE_COMMENT) {
+      return UnlinkedTokenType.MULTI_LINE_COMMENT;
+    } else if (type == Keyword.NATIVE) {
+      return UnlinkedTokenType.NATIVE;
+    } else if (type == Keyword.NEW) {
+      return UnlinkedTokenType.NEW;
+    } else if (type == Keyword.NULL) {
+      return UnlinkedTokenType.NULL;
+    } else if (type == Keyword.OF) {
+      return UnlinkedTokenType.OF;
+    } else if (type == Keyword.ON) {
+      return UnlinkedTokenType.ON;
+    } else if (type == TokenType.OPEN_CURLY_BRACKET) {
+      return UnlinkedTokenType.OPEN_CURLY_BRACKET;
+    } else if (type == TokenType.OPEN_PAREN) {
+      return UnlinkedTokenType.OPEN_PAREN;
+    } else if (type == TokenType.OPEN_SQUARE_BRACKET) {
+      return UnlinkedTokenType.OPEN_SQUARE_BRACKET;
+    } else if (type == Keyword.OPERATOR) {
+      return UnlinkedTokenType.OPERATOR;
+    } else if (type == Keyword.PART) {
+      return UnlinkedTokenType.PART;
+    } else if (type == Keyword.PATCH) {
+      return UnlinkedTokenType.PATCH;
+    } else if (type == TokenType.PERCENT) {
+      return UnlinkedTokenType.PERCENT;
+    } else if (type == TokenType.PERCENT_EQ) {
+      return UnlinkedTokenType.PERCENT_EQ;
+    } else if (type == TokenType.PERIOD) {
+      return UnlinkedTokenType.PERIOD;
+    } else if (type == TokenType.PERIOD_PERIOD) {
+      return UnlinkedTokenType.PERIOD_PERIOD;
+    } else if (type == TokenType.PERIOD_PERIOD_PERIOD) {
+      return UnlinkedTokenType.PERIOD_PERIOD_PERIOD;
+    } else if (type == TokenType.PERIOD_PERIOD_PERIOD_QUESTION) {
+      return UnlinkedTokenType.PERIOD_PERIOD_PERIOD_QUESTION;
+    } else if (type == TokenType.PLUS) {
+      return UnlinkedTokenType.PLUS;
+    } else if (type == TokenType.PLUS_EQ) {
+      return UnlinkedTokenType.PLUS_EQ;
+    } else if (type == TokenType.PLUS_PLUS) {
+      return UnlinkedTokenType.PLUS_PLUS;
+    } else if (type == TokenType.QUESTION) {
+      return UnlinkedTokenType.QUESTION;
+    } else if (type == TokenType.QUESTION_PERIOD) {
+      return UnlinkedTokenType.QUESTION_PERIOD;
+    } else if (type == TokenType.QUESTION_QUESTION) {
+      return UnlinkedTokenType.QUESTION_QUESTION;
+    } else if (type == TokenType.QUESTION_QUESTION_EQ) {
+      return UnlinkedTokenType.QUESTION_QUESTION_EQ;
+    } else if (type == Keyword.RETHROW) {
+      return UnlinkedTokenType.RETHROW;
+    } else if (type == Keyword.RETURN) {
+      return UnlinkedTokenType.RETURN;
+    } else if (type == TokenType.SCRIPT_TAG) {
+      return UnlinkedTokenType.SCRIPT_TAG;
+    } else if (type == TokenType.SEMICOLON) {
+      return UnlinkedTokenType.SEMICOLON;
+    } else if (type == Keyword.SET) {
+      return UnlinkedTokenType.SET;
+    } else if (type == Keyword.SHOW) {
+      return UnlinkedTokenType.SHOW;
+    } else if (type == TokenType.SINGLE_LINE_COMMENT) {
+      return UnlinkedTokenType.SINGLE_LINE_COMMENT;
+    } else if (type == TokenType.SLASH) {
+      return UnlinkedTokenType.SLASH;
+    } else if (type == TokenType.SLASH_EQ) {
+      return UnlinkedTokenType.SLASH_EQ;
+    } else if (type == Keyword.SOURCE) {
+      return UnlinkedTokenType.SOURCE;
+    } else if (type == TokenType.STAR) {
+      return UnlinkedTokenType.STAR;
+    } else if (type == TokenType.STAR_EQ) {
+      return UnlinkedTokenType.STAR_EQ;
+    } else if (type == Keyword.STATIC) {
+      return UnlinkedTokenType.STATIC;
+    } else if (type == TokenType.STRING) {
+      return UnlinkedTokenType.STRING;
+    } else if (type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
+      return UnlinkedTokenType.STRING_INTERPOLATION_EXPRESSION;
+    } else if (type == TokenType.STRING_INTERPOLATION_IDENTIFIER) {
+      return UnlinkedTokenType.STRING_INTERPOLATION_IDENTIFIER;
+    } else if (type == Keyword.SUPER) {
+      return UnlinkedTokenType.SUPER;
+    } else if (type == Keyword.SWITCH) {
+      return UnlinkedTokenType.SWITCH;
+    } else if (type == Keyword.SYNC) {
+      return UnlinkedTokenType.SYNC;
+    } else if (type == Keyword.THIS) {
+      return UnlinkedTokenType.THIS;
+    } else if (type == Keyword.THROW) {
+      return UnlinkedTokenType.THROW;
+    } else if (type == TokenType.TILDE) {
+      return UnlinkedTokenType.TILDE;
+    } else if (type == TokenType.TILDE_SLASH) {
+      return UnlinkedTokenType.TILDE_SLASH;
+    } else if (type == TokenType.TILDE_SLASH_EQ) {
+      return UnlinkedTokenType.TILDE_SLASH_EQ;
+    } else if (type == Keyword.TRUE) {
+      return UnlinkedTokenType.TRUE;
+    } else if (type == Keyword.TRY) {
+      return UnlinkedTokenType.TRY;
+    } else if (type == Keyword.TYPEDEF) {
+      return UnlinkedTokenType.TYPEDEF;
+    } else if (type == Keyword.VAR) {
+      return UnlinkedTokenType.VAR;
+    } else if (type == Keyword.VOID) {
+      return UnlinkedTokenType.VOID;
+    } else if (type == Keyword.WHILE) {
+      return UnlinkedTokenType.WHILE;
+    } else if (type == Keyword.WITH) {
+      return UnlinkedTokenType.WITH;
+    } else if (type == Keyword.YIELD) {
+      return UnlinkedTokenType.YIELD;
+    } else {
+      throw StateError('Unexpected type: $type');
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary2/builder/library_builder.dart b/pkg/analyzer/lib/src/summary2/builder/library_builder.dart
new file mode 100644
index 0000000..a816247
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/builder/library_builder.dart
@@ -0,0 +1,82 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary2/builder/prefix_builder.dart';
+import 'package:analyzer/src/summary2/declaration.dart';
+import 'package:analyzer/src/summary2/linked_unit_context.dart';
+import 'package:analyzer/src/summary2/reference.dart';
+import 'package:analyzer/src/summary2/scope.dart';
+
+class LibraryBuilder {
+  final Uri uri;
+  final Reference reference;
+  final List<UnitBuilder> units = [];
+
+  /// The import scope of the library.
+  final Scope importScope;
+
+  /// Local declarations, enclosed by [importScope].
+  final Scope scope;
+
+  /// The export scope of the library.
+  final Scope exportScope = Scope.top();
+
+  LibraryBuilder(Uri uri, Reference reference)
+      : this._(uri, reference, Scope.top());
+
+  LibraryBuilder._(this.uri, this.reference, this.importScope)
+      : scope = Scope(importScope, <String, Declaration>{});
+
+  /// Add top-level declaration of the library units to the local scope.
+  void addLocalDeclarations() {
+    for (var unit in units) {
+      for (var node in unit.node.compilationUnit_declarations) {
+        if (node.kind == LinkedNodeKind.classDeclaration) {
+          var name = unit.context.getUnitMemberName(node);
+          var reference = this.reference.getChild('@class').getChild(name);
+          reference.node = node;
+          var declaration = Declaration(name, reference);
+          scope.declare(name, declaration);
+        } else {
+          // TODO(scheglov) implement
+          throw UnimplementedError();
+        }
+      }
+    }
+  }
+
+  /// Return `true` if the export scope was modified.
+  bool addToExportScope(String name, Declaration declaration) {
+    if (name.startsWith('_')) return false;
+    if (declaration is PrefixBuilder) return false;
+
+    var existing = exportScope.map[name];
+    if (existing == declaration) return false;
+
+    // Ambiguous declaration detected.
+    if (existing != null) return false;
+
+    exportScope.map[name] = declaration;
+    return true;
+  }
+
+  void addUnit(LinkedUnitContext context, LinkedNode node) {
+    units.add(UnitBuilder(context, node));
+  }
+
+  void buildInitialExportScope() {
+    // TODO(scheglov) Maybe store export scopes in summaries?
+    scope.forEach((name, declaration) {
+      addToExportScope(name, declaration);
+    });
+  }
+}
+
+class UnitBuilder {
+  final LinkedUnitContext context;
+  final LinkedNode node;
+
+  UnitBuilder(this.context, this.node);
+}
diff --git a/pkg/analyzer/lib/src/summary2/builder/prefix_builder.dart b/pkg/analyzer/lib/src/summary2/builder/prefix_builder.dart
new file mode 100644
index 0000000..c655f34
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/builder/prefix_builder.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/summary2/declaration.dart';
+
+class PrefixBuilder extends Declaration {
+  PrefixBuilder(String name) : super(name, null);
+}
diff --git a/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart b/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart
new file mode 100644
index 0000000..c676b9b
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart
@@ -0,0 +1,109 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/summary/format.dart';
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary2/builder/library_builder.dart';
+import 'package:analyzer/src/summary2/link.dart';
+import 'package:analyzer/src/summary2/linked_bundle_context.dart';
+import 'package:analyzer/src/summary2/linked_unit_context.dart';
+import 'package:analyzer/src/summary2/reference.dart';
+
+class SourceLibraryBuilder extends LibraryBuilder {
+  final Linker linker;
+  final LinkedBundleContext bundleContext;
+  final Reference reference;
+
+  SourceLibraryBuilder(this.linker, this.bundleContext, Uri uri, this.reference)
+      : super(uri, reference);
+
+  void addSyntheticConstructors() {
+    for (var declaration in scope.map.values) {
+      var reference = declaration.reference;
+      var node = reference.node;
+
+      if (node.kind != LinkedNodeKind.classDeclaration) continue;
+
+      // Skip the class if it already has a constructor.
+      if (node.classOrMixinDeclaration_members
+          .any((n) => n.kind == LinkedNodeKind.constructorDeclaration)) {
+        continue;
+      }
+
+      node.classOrMixinDeclaration_members.add(
+        LinkedNodeBuilder.constructorDeclaration(
+          constructorDeclaration_parameters:
+              LinkedNodeBuilder.formalParameterList(),
+        )..isSynthetic = true,
+      );
+    }
+  }
+
+  void resolveTypes() {
+    for (var unit in units) {
+      for (var node in unit.node.compilationUnit_declarations) {
+        if (node.kind == LinkedNodeKind.classDeclaration) {
+          var extendsClause = node.classDeclaration_extendsClause;
+          if (extendsClause != null) {
+            _resolveTypeName(
+              unit.context,
+              extendsClause.extendsClause_superclass,
+            );
+          }
+
+          var withClause = node.classDeclaration_withClause;
+          if (withClause != null) {
+            for (var typeName in withClause.withClause_mixinTypes) {
+              _resolveTypeName(unit.context, typeName);
+            }
+          }
+
+          var implementsClause = node.classOrMixinDeclaration_implementsClause;
+          if (implementsClause != null) {
+            for (var typeName in implementsClause.implementsClause_interfaces) {
+              _resolveTypeName(unit.context, typeName);
+            }
+          }
+
+          // TODO(scheglov) type parameters
+          assert(node.classOrMixinDeclaration_typeParameters == null);
+        } else {
+          // TODO(scheglov) implement
+          throw UnimplementedError();
+        }
+      }
+    }
+  }
+
+  int _referenceIndex(Reference reference) {
+    if (reference.index == null) {
+      reference.index = linker.references.length;
+      linker.references.add(reference);
+    }
+    return reference.index;
+  }
+
+  void _resolveTypeName(LinkedUnitContext context, LinkedNodeBuilder typeName) {
+    var identifier = typeName.typeName_name;
+    if (identifier.kind == LinkedNodeKind.simpleIdentifier) {
+      var name = context.getSimpleName(identifier);
+      var reference = exportScope.lookup(name).reference;
+      var referenceIndex = _referenceIndex(reference);
+      identifier.simpleIdentifier_element = referenceIndex;
+      if (reference.isClass) {
+        typeName.typeName_type = LinkedNodeTypeBuilder(
+          kind: LinkedNodeTypeKind.interface,
+          interfaceClass: referenceIndex,
+        );
+        // TODO(scheglov) type arguments
+      } else {
+        // TODO(scheglov) set Object? keep unresolved?
+        throw UnimplementedError();
+      }
+    } else {
+      // TODO(scheglov) implement
+      throw UnimplementedError();
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary2/declaration.dart b/pkg/analyzer/lib/src/summary2/declaration.dart
new file mode 100644
index 0000000..d717375
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/declaration.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/summary2/reference.dart';
+
+/// A declaration in a scope.
+///
+/// A declaration can be associated with a named node and have [reference] set;
+/// or can be an import prefix, then the [reference] is `null`.
+class Declaration {
+  final String name;
+  final Reference reference;
+
+  Declaration(this.name, this.reference);
+}
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
new file mode 100644
index 0000000..e24fc84
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -0,0 +1,141 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart' show CompilationUnit;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/summary/format.dart';
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary2/ast_binary_writer.dart';
+import 'package:analyzer/src/summary2/builder/library_builder.dart';
+import 'package:analyzer/src/summary2/builder/source_library_builder.dart';
+import 'package:analyzer/src/summary2/linked_bundle_context.dart';
+import 'package:analyzer/src/summary2/linked_unit_context.dart';
+import 'package:analyzer/src/summary2/reference.dart';
+
+LinkResult link(
+  Reference rootReference,
+  Map<Source, Map<Source, CompilationUnit>> unitMap,
+) {
+  var linker = Linker(rootReference);
+  linker.link(unitMap);
+  return LinkResult(linker.references, linker.libraryResults);
+}
+
+class LibraryLinkResult {
+  final Source source;
+  final Map<Source, UnitLinkResult> units;
+
+  LibraryLinkResult(this.source, this.units);
+}
+
+class Linker {
+  final Reference rootReference;
+
+  /// References used in all libraries being linked.
+  /// Element references in [LinkedNode]s are indexes in this list.
+  final List<Reference> references = [null];
+
+  /// The output results.
+  var libraryResults = <Source, LibraryLinkResult>{};
+
+  /// Libraries that are being linked, or are already linked.
+  final Map<Uri, LibraryBuilder> builders = {};
+
+  Linker(this.rootReference);
+
+  void addBuilder(LibraryBuilder builder) {
+    builders[builder.uri] = builder;
+  }
+
+  void addSyntheticConstructors() {
+    for (var library in builders.values) {
+      if (library is SourceLibraryBuilder) {
+        library.addSyntheticConstructors();
+      }
+    }
+  }
+
+  void buildOutlines() {
+    computeLibraryScopes();
+    resolveTypes();
+    addSyntheticConstructors();
+  }
+
+  void computeLibraryScopes() {
+    for (var uri in builders.keys) {
+      var library = builders[uri];
+      library.buildInitialExportScope();
+    }
+
+    // TODO(scheglov) process imports and exports
+  }
+
+  void link(Map<Source, Map<Source, CompilationUnit>> unitMap) {
+    var linkedBundleContext = LinkedBundleContext(references);
+    for (var librarySource in unitMap.keys) {
+      var libraryUriStr = librarySource.uri.toString();
+      var libraryReference = rootReference.getChild(libraryUriStr);
+
+      var unitResults = <Source, UnitLinkResult>{};
+      libraryResults[librarySource] = LibraryLinkResult(
+        librarySource,
+        unitResults,
+      );
+
+      var libraryBuilder = SourceLibraryBuilder(
+        this,
+        linkedBundleContext,
+        librarySource.uri,
+        libraryReference,
+      );
+      addBuilder(libraryBuilder);
+
+      var libraryUnits = unitMap[librarySource];
+      for (var unitSource in libraryUnits.keys) {
+        var unit = libraryUnits[unitSource];
+
+        var writer = AstBinaryWriter();
+        var unitData = writer.writeNode(unit);
+
+        var unitLinkResult = UnitLinkResult(writer.tokens, unitData);
+        unitResults[unitSource] = unitLinkResult;
+
+        var linkedUnitContext = LinkedUnitContext(
+          linkedBundleContext,
+          writer.tokens,
+        );
+        libraryBuilder.addUnit(linkedUnitContext, unitData);
+      }
+
+      libraryBuilder.addLocalDeclarations();
+    }
+
+    buildOutlines();
+  }
+
+  void resolveTypes() {
+    for (var uri in builders.keys) {
+      var library = builders[uri];
+      if (library is SourceLibraryBuilder) {
+        library.resolveTypes();
+      }
+    }
+  }
+}
+
+class LinkResult {
+  /// Element references in [LinkedNode]s are indexes in this list.
+  final List<Reference> references;
+
+  final Map<Source, LibraryLinkResult> libraries;
+
+  LinkResult(this.references, this.libraries);
+}
+
+class UnitLinkResult {
+  final UnlinkedTokensBuilder tokens;
+  final LinkedNodeBuilder node;
+
+  UnitLinkResult(this.tokens, this.node);
+}
diff --git a/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart b/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart
new file mode 100644
index 0000000..2b1d0ed
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary2/reference.dart';
+
+/// The context of a linked bundle, with shared references.
+class LinkedBundleContext {
+  final List<Reference> references;
+
+  LinkedBundleContext(this.references);
+
+  InterfaceType getInterfaceType(LinkedNodeType linkedType) {
+    if (linkedType.kind == LinkedNodeTypeKind.interface) {
+      var element = references[linkedType.interfaceClass].element;
+      // TODO(scheglov) type arguments
+      assert(linkedType.interfaceTypeArguments.isEmpty);
+      return InterfaceTypeImpl.explicit(element, []);
+    }
+    return null;
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
new file mode 100644
index 0000000..f7869e1
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary2/linked_bundle_context.dart';
+
+/// The context of a unit - the context of the bundle, and the unit tokens.
+class LinkedUnitContext {
+  final LinkedBundleContext bundleContext;
+  final UnlinkedTokens tokens;
+
+  LinkedUnitContext(this.bundleContext, this.tokens);
+
+  String getConstructorDeclarationName(LinkedNode node) {
+    var name = node.constructorDeclaration_name;
+    if (name != null) {
+      return getSimpleName(name);
+    }
+    return '';
+  }
+
+  InterfaceType getInterfaceType(LinkedNodeType linkedType) {
+    return bundleContext.getInterfaceType(linkedType);
+  }
+
+  String getSimpleName(LinkedNode node) {
+    return tokens.lexeme[node.simpleIdentifier_token];
+  }
+
+  String getUnitMemberName(LinkedNode node) {
+    return getSimpleName(node.namedCompilationUnitMember_name);
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary2/reference.dart b/pkg/analyzer/lib/src/summary2/reference.dart
new file mode 100644
index 0000000..6045db9
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/reference.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/summary/idl.dart';
+
+/// Indirection between a name and the corresponding [Element].
+///
+/// References are organized in a prefix tree.
+/// Each reference knows its parent, children, and the [Element].
+///
+///      Library:
+///         URI of library
+///
+///      Class:
+///         Reference of the enclosing library
+///         "@class"
+///         Name of the class
+///
+///      Method:
+///         Reference of the enclosing class
+///         "@method"
+///         Name of the method
+///
+/// There is only one reference object per [Element].
+class Reference {
+  /// The parent of this reference, or `null` if the root.
+  final Reference parent;
+
+  /// The simple name of the reference in its [parent].
+  final String name;
+
+  /// The corresponding [LinkedNode], or `null` if a named container.
+  LinkedNode node;
+
+  /// The corresponding [Element], or `null` if a named container.
+  Element element;
+
+  /// Temporary index used during serialization and linking.
+  int index;
+
+  Map<String, Reference> _children;
+
+  Reference.root() : this._(null, '');
+
+  Reference._(this.parent, this.name);
+
+  bool get isClass => parent != null && parent.name == '@class';
+
+  /// Return the child with the given name, or `null` if does not exist.
+  Reference operator [](String name) {
+    return _children != null ? _children[name] : null;
+  }
+
+  /// Return the child with the given name, create if does not exist yet.
+  Reference getChild(String name) {
+    var map = _children ??= <String, Reference>{};
+    return map[name] ??= new Reference._(this, name);
+  }
+
+  String toString() => parent == null ? 'root' : '$parent::$name';
+}
diff --git a/pkg/analyzer/lib/src/summary2/scope.dart b/pkg/analyzer/lib/src/summary2/scope.dart
new file mode 100644
index 0000000..6917dea
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/scope.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/summary2/declaration.dart';
+
+class Scope {
+  final Scope parent;
+  final Map<String, Declaration> map;
+
+  Scope(this.parent, this.map);
+
+  Scope.top() : this(null, <String, Declaration>{});
+
+  void declare(String name, Declaration declaration) {
+    map[name] = declaration;
+  }
+
+  void forEach(f(String name, Declaration declaration)) {
+    map.forEach(f);
+  }
+
+  Declaration lookup(String name) {
+    return map[name];
+  }
+}
diff --git a/pkg/analyzer/lib/src/task/api/html.dart b/pkg/analyzer/lib/src/task/api/html.dart
deleted file mode 100644
index 8a7cae8..0000000
--- a/pkg/analyzer/lib/src/task/api/html.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/task/api/model.dart';
-import 'package:html/dom.dart';
-
-/**
- * The result of parsing an HTML file.
- */
-final ResultDescriptor<Document> HTML_DOCUMENT =
-    new ResultDescriptor<Document>('HTML_DOCUMENT', null);
-
-/**
- * The analysis errors associated with a [Source] representing an HTML file.
- */
-final ListResultDescriptor<AnalysisError> HTML_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'HTML_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * The sources of the Dart libraries referenced by an HTML file.
- */
-final ListResultDescriptor<Source> REFERENCED_LIBRARIES =
-    new ListResultDescriptor<Source>('REFERENCED_LIBRARIES', const <Source>[]);
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index 50e3992..47c7c65 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -18,13 +18,16 @@
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/dart/ast/ast.dart'
-    show NamespaceDirectiveImpl, UriBasedDirectiveImpl, UriValidationCode;
+    show
+        CompilationUnitImpl,
+        NamespaceDirectiveImpl,
+        UriBasedDirectiveImpl,
+        UriValidationCode;
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/constant/constant_verifier.dart';
 import 'package:analyzer/src/dart/element/builder.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
-import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/dart/sdk/patch.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
@@ -48,7 +51,6 @@
 import 'package:analyzer/src/task/api/model.dart';
 import 'package:analyzer/src/task/driver.dart';
 import 'package:analyzer/src/task/general.dart';
-import 'package:analyzer/src/task/html.dart';
 import 'package:analyzer/src/task/inputs.dart';
 import 'package:analyzer/src/task/model.dart';
 import 'package:analyzer/src/task/strong/checker.dart';
@@ -2837,7 +2839,9 @@
     //
     // Generate errors.
     //
-    unit.accept(new DeadCodeVerifier(errorReporter, typeSystem: typeSystem));
+    unit.accept(new DeadCodeVerifier(
+        errorReporter, (unit as CompilationUnitImpl).isNonNullable,
+        typeSystem: typeSystem));
     // Verify imports.
     {
       ImportsVerifier verifier = new ImportsVerifier();
@@ -5314,52 +5318,6 @@
             source, 0, 0, ScannerErrorCode.UNABLE_GET_CONTENT, [message]));
       }
     }
-    if (target is DartScript) {
-      DartScript script = target;
-      List<ScriptFragment> fragments = script.fragments;
-      if (fragments.length < 1) {
-        throw new AnalysisException('Cannot scan scripts with no fragments');
-      } else if (fragments.length > 1) {
-        throw new AnalysisException(
-            'Cannot scan scripts with multiple fragments');
-      }
-      ScriptFragment fragment = fragments[0];
-
-      Scanner scanner = new Scanner(
-          source,
-          new SubSequenceReader(fragment.content, fragment.offset),
-          errorListener);
-      scanner.setSourceStart(fragment.line, fragment.column);
-      scanner.preserveComments = context.analysisOptions.preserveComments;
-      scanner.scanLazyAssignmentOperators =
-          context.analysisOptions.enableLazyAssignmentOperators;
-
-      LineInfo lineInfo = new LineInfo(scanner.lineStarts);
-
-      outputs[TOKEN_STREAM] = scanner.tokenize();
-      outputs[LINE_INFO] = lineInfo;
-      outputs[IGNORE_INFO] =
-          IgnoreInfo.calculateIgnores(fragment.content, lineInfo);
-      outputs[SCAN_ERRORS] = getUniqueErrors(errorListener.errors);
-    } else if (target is Source) {
-      String content = getRequiredInput(CONTENT_INPUT_NAME);
-
-      Scanner scanner =
-          new Scanner(source, new CharSequenceReader(content), errorListener);
-      scanner.preserveComments = context.analysisOptions.preserveComments;
-      scanner.scanLazyAssignmentOperators =
-          context.analysisOptions.enableLazyAssignmentOperators;
-
-      LineInfo lineInfo = new LineInfo(scanner.lineStarts);
-
-      outputs[TOKEN_STREAM] = scanner.tokenize();
-      outputs[LINE_INFO] = lineInfo;
-      outputs[IGNORE_INFO] = IgnoreInfo.calculateIgnores(content, lineInfo);
-      outputs[SCAN_ERRORS] = getUniqueErrors(errorListener.errors);
-    } else {
-      throw new AnalysisException(
-          'Cannot scan Dart code from a ${target.runtimeType}');
-    }
   }
 
   /**
@@ -5373,15 +5331,6 @@
         CONTENT_INPUT_NAME: CONTENT.of(target, flushOnAccess: true),
         MODIFICATION_TIME_INPUT: MODIFICATION_TIME.of(target)
       };
-    } else if (target is DartScript) {
-      // This task does not use the following input; it is included only to add
-      // a dependency between this value and the containing source so that when
-      // the containing source is modified these results will be invalidated.
-      Source source = target.source;
-      return <String, TaskInput>{
-        '-': DART_SCRIPTS.of(source),
-        MODIFICATION_TIME_INPUT: MODIFICATION_TIME.of(source)
-      };
     }
     throw new AnalysisException(
         'Cannot build inputs for a ${target.runtimeType}');
@@ -5404,8 +5353,6 @@
         return TaskSuitability.HIGHEST;
       }
       return TaskSuitability.LOWEST;
-    } else if (target is DartScript) {
-      return TaskSuitability.HIGHEST;
     }
     return TaskSuitability.NONE;
   }
diff --git a/pkg/analyzer/lib/src/task/dart_work_manager.dart b/pkg/analyzer/lib/src/task/dart_work_manager.dart
index 2a27c15..5aa9869 100644
--- a/pkg/analyzer/lib/src/task/dart_work_manager.dart
+++ b/pkg/analyzer/lib/src/task/dart_work_manager.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/src/task/api/dart.dart';
 import 'package:analyzer/src/task/api/model.dart';
 import 'package:analyzer/src/task/dart.dart';
-import 'package:analyzer/src/task/html.dart';
 
 /**
  * The manager for Dart specific analysis.
@@ -168,7 +167,7 @@
 
   @override
   List<AnalysisError> getErrors(Source source) {
-    if (!_isDartSource(source) && source is! DartScript) {
+    if (!_isDartSource(source)) {
       return AnalysisError.NO_ERRORS;
     }
     // If analysis is finished, use all the errors.
diff --git a/pkg/analyzer/lib/src/task/html.dart b/pkg/analyzer/lib/src/task/html.dart
deleted file mode 100644
index 502db66..0000000
--- a/pkg/analyzer/lib/src/task/html.dart
+++ /dev/null
@@ -1,416 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/exception/exception.dart';
-import 'package:analyzer/src/context/cache.dart';
-import 'package:analyzer/src/dart/scanner/scanner.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_engine.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/plugin/engine_plugin.dart';
-import 'package:analyzer/src/task/api/dart.dart';
-import 'package:analyzer/src/task/api/general.dart';
-import 'package:analyzer/src/task/api/html.dart';
-import 'package:analyzer/src/task/api/model.dart';
-import 'package:analyzer/src/task/general.dart';
-import 'package:html/dom.dart';
-import 'package:html/parser.dart';
-import 'package:source_span/source_span.dart';
-
-/**
- * The Dart scripts that are embedded in an HTML file.
- */
-final ListResultDescriptor<DartScript> DART_SCRIPTS =
-    new ListResultDescriptor<DartScript>('DART_SCRIPTS', const <DartScript>[]);
-
-/**
- * The errors found while parsing an HTML file.
- */
-final ListResultDescriptor<AnalysisError> HTML_DOCUMENT_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'HTML_DOCUMENT_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * A Dart script that is embedded in an HTML file.
- */
-class DartScript implements Source {
-  /**
-   * The source containing this script.
-   */
-  final Source source;
-
-  /**
-   * The fragments that comprise this content of the script.
-   */
-  final List<ScriptFragment> fragments;
-
-  /**
-   * Initialize a newly created script in the given [source] that is composed of
-   * given [fragments].
-   */
-  DartScript(this.source, this.fragments);
-
-  @override
-  TimestampedData<String> get contents =>
-      new TimestampedData(modificationStamp, fragments[0].content);
-
-  @override
-  String get encoding => source.encoding;
-
-  @override
-  String get fullName => source.fullName;
-
-  @override
-  bool get isInSystemLibrary => source.isInSystemLibrary;
-
-  @override
-  Source get librarySource => source;
-
-  @override
-  int get modificationStamp => source.modificationStamp;
-
-  @override
-  String get shortName => source.shortName;
-
-  @override
-  Uri get uri => source.uri
-      .replace(queryParameters: {'offset': fragments[0].offset.toString()});
-
-  @override
-  UriKind get uriKind =>
-      throw new StateError('uriKind not supported for scripts');
-
-  @override
-  bool exists() => source.exists();
-}
-
-/**
- * A task that looks for Dart scripts in an HTML file and computes both the Dart
- * libraries that are referenced by those scripts and the embedded Dart scripts.
- */
-class DartScriptsTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [HTML_DOCUMENT] input.
-   */
-  static const String DOCUMENT_INPUT = 'DOCUMENT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'DartScriptsTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[DART_SCRIPTS, REFERENCED_LIBRARIES]);
-
-  DartScriptsTask(InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    Source source = target.source;
-    Document document = getRequiredInput(DOCUMENT_INPUT);
-    //
-    // Process the script tags.
-    //
-    List<Source> libraries = <Source>[];
-    List<DartScript> inlineScripts = <DartScript>[];
-    List<Element> scripts = document.getElementsByTagName('script');
-    for (Element script in scripts) {
-      Map<dynamic, String> attributes = script.attributes;
-      if (attributes['type'] == 'application/dart') {
-        String src = attributes['src'];
-        if (src == null) {
-          if (script.hasContent()) {
-            List<ScriptFragment> fragments = <ScriptFragment>[];
-            for (Node node in script.nodes) {
-              if (node.nodeType == Node.TEXT_NODE) {
-                FileLocation start = node.sourceSpan.start;
-                fragments.add(new ScriptFragment(start.offset, start.line,
-                    start.column, (node as Text).data));
-              }
-            }
-            inlineScripts.add(new DartScript(source, fragments));
-          }
-        } else if (AnalysisEngine.isDartFileName(src)) {
-          Source source = context.sourceFactory.resolveUri(target.source, src);
-          if (source != null) {
-            libraries.add(source);
-          }
-        }
-      }
-    }
-    //
-    // Record outputs.
-    //
-    outputs[REFERENCED_LIBRARIES] =
-        libraries.isEmpty ? const <Source>[] : libraries;
-    outputs[DART_SCRIPTS] =
-        inlineScripts.isEmpty ? const <DartScript>[] : inlineScripts;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    return <String, TaskInput>{DOCUMENT_INPUT: HTML_DOCUMENT.of(target)};
-  }
-
-  /**
-   * Create a [DartScriptsTask] based on the given [target] in the given
-   * [context].
-   */
-  static DartScriptsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new DartScriptsTask(context, target);
-  }
-}
-
-/**
- * A task that merges all of the errors for a single source into a single list
- * of errors.
- */
-class HtmlErrorsTask extends SourceBasedAnalysisTask {
-  /**
-   * The suffix to add to the names of contributed error results.
-   */
-  static const String INPUT_SUFFIX = '_input';
-
-  /**
-   * The name of the input that is a list of errors from each of the embedded
-   * Dart scripts.
-   */
-  static const String DART_ERRORS_INPUT = 'DART_ERRORS';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor('HtmlErrorsTask',
-      createTask, buildInputs, <ResultDescriptor>[HTML_ERRORS]);
-
-  HtmlErrorsTask(InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    EnginePlugin enginePlugin = AnalysisEngine.instance.enginePlugin;
-    //
-    // Prepare inputs.
-    //
-    List<List<AnalysisError>> dartErrors = getRequiredInput(DART_ERRORS_INPUT);
-    List<List<AnalysisError>> htmlErrors = <List<AnalysisError>>[];
-    for (ResultDescriptor result in enginePlugin.htmlErrors) {
-      String inputName = result.name + INPUT_SUFFIX;
-      htmlErrors.add(getRequiredInput(inputName));
-    }
-    //
-    // Compute the error list.
-    //
-    List<List<AnalysisError>> errorLists = <List<AnalysisError>>[];
-    errorLists.addAll(dartErrors);
-    errorLists.addAll(htmlErrors);
-    //
-    // Record outputs.
-    //
-    outputs[HTML_ERRORS] = AnalysisError.mergeLists(errorLists);
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    EnginePlugin enginePlugin = AnalysisEngine.instance.enginePlugin;
-    Map<String, TaskInput> inputs = <String, TaskInput>{
-      DART_ERRORS_INPUT: DART_SCRIPTS.of(target).toListOf(DART_ERRORS)
-    };
-    for (ResultDescriptor result in enginePlugin.htmlErrors) {
-      String inputName = result.name + INPUT_SUFFIX;
-      inputs[inputName] = result.of(target);
-    }
-    return inputs;
-  }
-
-  /**
-   * Create an [HtmlErrorsTask] based on the given [target] in the given
-   * [context].
-   */
-  static HtmlErrorsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new HtmlErrorsTask(context, target);
-  }
-}
-
-/**
- * A task that scans the content of a file, producing a set of Dart tokens.
- */
-class ParseHtmlTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the input whose value is the content of the file.
-   */
-  static const String CONTENT_INPUT_NAME = 'CONTENT_INPUT_NAME';
-
-  /**
-   * The name of the input whose value is the modification time of the file.
-   */
-  static const String MODIFICATION_TIME_INPUT = 'MODIFICATION_TIME_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ParseHtmlTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[HTML_DOCUMENT, HTML_DOCUMENT_ERRORS, LINE_INFO],
-      suitabilityFor: suitabilityFor);
-
-  /**
-   * Initialize a newly created task to access the content of the source
-   * associated with the given [target] in the given [context].
-   */
-  ParseHtmlTask(InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    String content = getRequiredInput(CONTENT_INPUT_NAME);
-
-    int modificationTime = getRequiredInput(MODIFICATION_TIME_INPUT);
-    if (modificationTime < 0) {
-      String message = 'Content could not be read';
-      if (context is InternalAnalysisContext) {
-        CacheEntry entry =
-            (context as InternalAnalysisContext).getCacheEntry(target);
-        CaughtException exception = entry.exception;
-        if (exception != null) {
-          message = exception.toString();
-        }
-      }
-
-      outputs[HTML_DOCUMENT] = new Document();
-      outputs[HTML_DOCUMENT_ERRORS] = <AnalysisError>[
-        new AnalysisError(
-            target.source, 0, 0, ScannerErrorCode.UNABLE_GET_CONTENT, [message])
-      ];
-      outputs[LINE_INFO] = new LineInfo(<int>[0]);
-    } else {
-      HtmlParser parser = new HtmlParser(content,
-          generateSpans: true, lowercaseAttrName: false);
-      parser.compatMode = 'quirks';
-      Document document = parser.parse();
-      //
-      // Convert errors.
-      //
-      List<AnalysisError> errors = <AnalysisError>[];
-      // TODO(scheglov) https://github.com/dart-lang/sdk/issues/24643
-//      List<ParseError> parseErrors = parser.errors;
-//      for (ParseError parseError in parseErrors) {
-//        if (parseError.errorCode == 'expected-doctype-but-got-start-tag') {
-//          continue;
-//        }
-//        SourceSpan span = parseError.span;
-//        errors.add(new AnalysisError(target.source, span.start.offset,
-//            span.length, HtmlErrorCode.PARSE_ERROR, [parseError.message]));
-//      }
-      //
-      // Record outputs.
-      //
-      outputs[HTML_DOCUMENT] = document;
-      outputs[HTML_DOCUMENT_ERRORS] = errors;
-      outputs[LINE_INFO] = _computeLineInfo(content);
-    }
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the given
-   * [source].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget source) {
-    return <String, TaskInput>{
-      CONTENT_INPUT_NAME: CONTENT.of(source),
-      MODIFICATION_TIME_INPUT: MODIFICATION_TIME.of(source)
-    };
-  }
-
-  /**
-   * Create a [ParseHtmlTask] based on the given [target] in the given [context].
-   */
-  static ParseHtmlTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ParseHtmlTask(context, target);
-  }
-
-  /**
-   * Return an indication of how suitable this task is for the given [target].
-   */
-  static TaskSuitability suitabilityFor(AnalysisTarget target) {
-    if (target is Source) {
-      String name = target.shortName;
-      if (name.endsWith(AnalysisEngine.SUFFIX_HTML) ||
-          name.endsWith(AnalysisEngine.SUFFIX_HTM)) {
-        return TaskSuitability.HIGHEST;
-      }
-    }
-    return TaskSuitability.NONE;
-  }
-
-  /**
-   * Compute [LineInfo] for the given [content].
-   */
-  static LineInfo _computeLineInfo(String content) {
-    List<int> lineStarts = StringUtilities.computeLineStarts(content);
-    return new LineInfo(lineStarts);
-  }
-}
-
-/**
- * A fragment of a [DartScript].
- */
-class ScriptFragment {
-  /**
-   * The offset of the first character of the fragment, relative to the start of
-   * the containing source.
-   */
-  final int offset;
-
-  /**
-   * The line number of the line containing the first character of the fragment.
-   */
-  final int line;
-
-  /**
-   * The column number of the line containing the first character of the
-   * fragment.
-   */
-  final int column;
-
-  /**
-   * The content of the fragment.
-   */
-  final String content;
-
-  /**
-   * Initialize a newly created script fragment to have the given [offset] and
-   * [content].
-   */
-  ScriptFragment(this.offset, this.line, this.column, this.content);
-}
diff --git a/pkg/analyzer/lib/src/task/html_work_manager.dart b/pkg/analyzer/lib/src/task/html_work_manager.dart
deleted file mode 100644
index a7038d1..0000000
--- a/pkg/analyzer/lib/src/task/html_work_manager.dart
+++ /dev/null
@@ -1,250 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:collection';
-
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/context/cache.dart';
-import 'package:analyzer/src/generated/engine.dart'
-    show AnalysisEngine, AnalysisErrorInfo, CacheState, InternalAnalysisContext;
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/utilities_collection.dart';
-import 'package:analyzer/src/task/api/html.dart';
-import 'package:analyzer/src/task/api/model.dart';
-import 'package:analyzer/src/task/html.dart';
-
-/**
- * The manager for HTML specific analysis.
- */
-class HtmlWorkManager implements WorkManager {
-  /**
-   * The context for which work is being managed.
-   */
-  final InternalAnalysisContext context;
-
-  /**
-   * The [TargetedResult]s that should be computed with priority.
-   */
-  final LinkedHashSet<TargetedResult> priorityResultQueue =
-      new LinkedHashSet<TargetedResult>();
-
-  /**
-   * The HTML sources.
-   */
-  final LinkedHashSet<Source> sourceQueue = new LinkedHashSet<Source>();
-
-  /**
-   * Initialize a newly created manager.
-   */
-  HtmlWorkManager(this.context) {
-    context.onResultInvalidated.listen(onResultInvalidated);
-  }
-
-  /**
-   * Returns the correctly typed result of `context.analysisCache`.
-   */
-  AnalysisCache get analysisCache => context.analysisCache;
-
-  /**
-   * The partition that contains analysis results that are not shared with other
-   * contexts.
-   */
-  CachePartition get privateAnalysisCachePartition =>
-      context.privateAnalysisCachePartition;
-
-  /**
-   * Specifies that the client want the given [result] of the given [target]
-   * to be computed with priority.
-   */
-  void addPriorityResult(AnalysisTarget target, ResultDescriptor result) {
-    priorityResultQueue.add(new TargetedResult(target, result));
-  }
-
-  @override
-  void applyChange(List<Source> addedSources, List<Source> changedSources,
-      List<Source> removedSources) {
-    addedSources = addedSources.where(_isHtmlSource).toList();
-    changedSources = changedSources.where(_isHtmlSource).toList();
-    removedSources = removedSources.where(_isHtmlSource).toList();
-    // source queue
-    sourceQueue.addAll(addedSources);
-    sourceQueue.addAll(changedSources);
-    sourceQueue.removeAll(removedSources);
-  }
-
-  @override
-  void applyPriorityTargets(List<AnalysisTarget> targets) {
-    // Unschedule the old targets.
-    List<TargetedResult> resultsToUnschedule = <TargetedResult>[];
-    for (TargetedResult result in priorityResultQueue) {
-      if (result.result == HTML_ERRORS) {
-        resultsToUnschedule.add(result);
-      }
-    }
-    priorityResultQueue.removeAll(resultsToUnschedule);
-    // Schedule new targets.
-    for (AnalysisTarget target in targets) {
-      if (_isHtmlSource(target)) {
-        addPriorityResult(target, HTML_ERRORS);
-      }
-    }
-  }
-
-  @override
-  List<AnalysisError> getErrors(Source source) {
-    if (!_isHtmlSource(source)) {
-      return AnalysisError.NO_ERRORS;
-    }
-    // If analysis is finished, use all the errors.
-    if (analysisCache.getState(source, HTML_ERRORS) == CacheState.VALID) {
-      return analysisCache.getValue(source, HTML_ERRORS);
-    }
-    // If analysis is in progress, combine all known partial results.
-    List<AnalysisError> errors = <AnalysisError>[];
-    errors.addAll(analysisCache.getValue(source, HTML_DOCUMENT_ERRORS));
-    List<DartScript> scripts = analysisCache.getValue(source, DART_SCRIPTS);
-    for (DartScript script in scripts) {
-      errors.addAll(context.getErrors(script).errors);
-    }
-    return errors;
-  }
-
-  @override
-  TargetedResult getNextResult() {
-    // Try to find a priority result to compute.
-    while (priorityResultQueue.isNotEmpty) {
-      TargetedResult result = priorityResultQueue.first;
-      if (!_needsComputing(result.target, result.result)) {
-        priorityResultQueue.remove(result);
-        continue;
-      }
-      return result;
-    }
-    // Try to find a new HTML file to analyze.
-    while (sourceQueue.isNotEmpty) {
-      Source htmlSource = sourceQueue.first;
-      if (!_needsComputing(htmlSource, HTML_ERRORS)) {
-        sourceQueue.remove(htmlSource);
-        continue;
-      }
-      return new TargetedResult(htmlSource, HTML_ERRORS);
-    }
-    // No results to compute.
-    return null;
-  }
-
-  @override
-  WorkOrderPriority getNextResultPriority() {
-    if (priorityResultQueue.isNotEmpty) {
-      return WorkOrderPriority.PRIORITY;
-    }
-    if (sourceQueue.isNotEmpty) {
-      return WorkOrderPriority.NORMAL;
-    }
-    return WorkOrderPriority.NONE;
-  }
-
-  /**
-   * Notifies the manager about analysis options changes.
-   */
-  void onAnalysisOptionsChanged() {
-    _invalidateAllLocalResolutionInformation(false);
-  }
-
-  /**
-   * Notifies the manager that a result has been invalidated.
-   */
-  onResultInvalidated(InvalidatedResult event) {
-    ResultDescriptor descriptor = event.descriptor;
-    if (descriptor == HTML_ERRORS) {
-      sourceQueue.add(event.entry.target);
-    } else if (descriptor == DART_SCRIPTS) {
-      // TODO(brianwilkerson) Remove the scripts from the DartWorkManager's
-      // queues.
-    }
-  }
-
-  /**
-   * Notifies the manager about [SourceFactory] changes.
-   */
-  void onSourceFactoryChanged() {
-    _invalidateAllLocalResolutionInformation(true);
-  }
-
-  @override
-  void resultsComputed(
-      AnalysisTarget target, Map<ResultDescriptor, dynamic> outputs) {
-    // Update notice.
-    if (_isHtmlSource(target)) {
-      bool shouldSetErrors = false;
-      outputs.forEach((ResultDescriptor descriptor, value) {
-        if (descriptor == HTML_ERRORS) {
-          shouldSetErrors = true;
-        } else if (descriptor == DART_SCRIPTS) {
-          // List<DartScript> scripts = value;
-          if (priorityResultQueue.contains(target)) {
-            // TODO(brianwilkerson) Add the scripts to the DartWorkManager's
-            // priority queue.
-          } else {
-            // TODO(brianwilkerson) Add the scripts to the DartWorkManager's
-            // library queue.
-          }
-        }
-      });
-      if (shouldSetErrors) {
-        AnalysisErrorInfo info = context.getErrors(target);
-        context.getNotice(target).setErrors(info.errors, info.lineInfo);
-      }
-    }
-  }
-
-  /**
-   * Invalidate all of the resolution results computed by this context. The flag
-   * [invalidateUris] should be `true` if the cached results of converting URIs
-   * to source files should also be invalidated.
-   */
-  void _invalidateAllLocalResolutionInformation(bool invalidateUris) {
-    CachePartition partition = privateAnalysisCachePartition;
-    // Prepare targets and values to invalidate.
-    List<Source> htmlSources = <Source>[];
-    List<DartScript> scriptTargets = <DartScript>[];
-    MapIterator<AnalysisTarget, CacheEntry> iterator = partition.iterator();
-    while (iterator.moveNext()) {
-      AnalysisTarget target = iterator.key;
-      if (_isHtmlSource(target)) {
-        htmlSources.add(target);
-      }
-      if (target is DartScript) {
-        scriptTargets.add(target);
-      }
-    }
-    // Invalidate targets and values.
-    scriptTargets.forEach(partition.remove);
-    for (Source htmlSource in htmlSources) {
-      CacheEntry entry = partition.get(htmlSource);
-      if (entry != null) {
-        entry.setState(HTML_ERRORS, CacheState.INVALID);
-        if (invalidateUris) {
-          entry.setState(REFERENCED_LIBRARIES, CacheState.INVALID);
-        }
-      }
-    }
-  }
-
-  /**
-   * Returns `true` if the given [result] of the given [target] needs
-   * computing, i.e. it is not in the valid and not in the error state.
-   */
-  bool _needsComputing(AnalysisTarget target, ResultDescriptor result) {
-    CacheState state = analysisCache.getState(target, result);
-    return state != CacheState.VALID && state != CacheState.ERROR;
-  }
-
-  /**
-   * Return `true` if the given target is an HTML source.
-   */
-  static bool _isHtmlSource(AnalysisTarget target) {
-    return target is Source && AnalysisEngine.isHtmlFileName(target.fullName);
-  }
-}
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 8c56720..b195c6c 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -58,6 +58,10 @@
   static const String implicitCasts = 'implicit-casts';
   static const String implicitDynamic = 'implicit-dynamic';
 
+  // Language options (see AnalysisOptionsImpl for documentation).
+  static const String strictInference = 'strict-inference';
+  static const String strictRawTypes = 'strict-raw-types';
+
   /// Ways to say `ignore`.
   static const List<String> ignoreSynonyms = const ['ignore', 'false'];
 
@@ -89,7 +93,10 @@
   ];
 
   /// Supported `analyzer` language options.
-  static const List<String> languageOptions = const [];
+  static const List<String> languageOptions = const [
+    strictInference,
+    strictRawTypes
+  ];
 }
 
 /// Validates `analyzer` options.
@@ -696,7 +703,12 @@
       AnalysisOptionsImpl options, Object feature, Object value) {
     bool boolValue = toBool(value);
     if (boolValue != null) {
-      // Currently no supported language options.
+      if (feature == AnalyzerOptions.strictInference) {
+        options.strictInference = boolValue;
+      }
+      if (feature == AnalyzerOptions.strictRawTypes) {
+        options.strictRawTypes = boolValue;
+      }
     }
   }
 
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index da18f90..feb81ad 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -389,46 +389,6 @@
   }
 
   @override
-  void visitForEachStatement(ForEachStatement node) {
-    var loopVariable = node.identifier ?? node.loopVariable?.identifier;
-
-    // Safely handle malformed statements.
-    if (loopVariable != null) {
-      // Find the element type of the sequence.
-      var sequenceInterface = node.awaitKeyword != null
-          ? typeProvider.streamType
-          : typeProvider.iterableType;
-      var iterableType = _getExpressionType(node.iterable);
-      var elementType =
-          rules.mostSpecificTypeArgument(iterableType, sequenceInterface);
-
-      // If the sequence is not an Iterable (or Stream for await for) but is a
-      // supertype of it, do an implicit downcast to Iterable<dynamic>. Then
-      // we'll do a separate cast of the dynamic element to the variable's type.
-      if (elementType == null) {
-        var sequenceType =
-            sequenceInterface.instantiate([DynamicTypeImpl.instance]);
-
-        if (rules.isSubtypeOf(sequenceType, iterableType)) {
-          _recordImplicitCast(node.iterable, sequenceType, from: iterableType);
-          elementType = DynamicTypeImpl.instance;
-        }
-      }
-
-      // If the sequence doesn't implement the interface at all, [ErrorVerifier]
-      // will report the error, so ignore it here.
-      if (elementType != null) {
-        // Insert a cast from the sequence's element type to the loop variable's
-        // if needed.
-        _checkImplicitCast(loopVariable, _getExpressionType(loopVariable),
-            from: elementType);
-      }
-    }
-
-    node.visitChildren(this);
-  }
-
-  @override
   void visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
     if (node.condition != null) {
       checkBoolean(node.condition);
@@ -445,14 +405,6 @@
   }
 
   @override
-  void visitForStatement(ForStatement node) {
-    if (node.condition != null) {
-      checkBoolean(node.condition);
-    }
-    node.visitChildren(this);
-  }
-
-  @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     _checkFunctionApplication(node);
     node.visitChildren(this);
@@ -517,103 +469,11 @@
         }
       }
     }
-    NodeList<Expression> elements = node.elements;
-    for (int i = 0; i < elements.length; i++) {
-      checkArgument(elements[i], type);
-    }
-    super.visitListLiteral(node);
-  }
-
-  @override
-  void visitListLiteral2(ListLiteral2 node) {
-    DartType type = DynamicTypeImpl.instance;
-    if (node.typeArguments != null) {
-      NodeList<TypeAnnotation> targs = node.typeArguments.arguments;
-      if (targs.length > 0) {
-        type = targs[0].type;
-      }
-    } else {
-      DartType staticType = node.staticType;
-      if (staticType is InterfaceType) {
-        List<DartType> targs = staticType.typeArguments;
-        if (targs != null && targs.length > 0) {
-          type = targs[0];
-        }
-      }
-    }
-    NodeList<CollectionElement> elements = node.elements;
+    NodeList<CollectionElement> elements = node.elements2;
     for (int i = 0; i < elements.length; i++) {
       checkCollectionElement(elements[i], type);
     }
-    super.visitListLiteral2(node);
-  }
-
-  @override
-  void visitMapLiteral(MapLiteral node) {
-    DartType ktype = DynamicTypeImpl.instance;
-    DartType vtype = DynamicTypeImpl.instance;
-    if (node.typeArguments != null) {
-      NodeList<TypeAnnotation> targs = node.typeArguments.arguments;
-      if (targs.length > 0) {
-        ktype = targs[0].type;
-      }
-      if (targs.length > 1) {
-        vtype = targs[1].type;
-      }
-    } else {
-      DartType staticType = node.staticType;
-      if (staticType is InterfaceType) {
-        List<DartType> targs = staticType.typeArguments;
-        if (targs != null) {
-          if (targs.length > 0) {
-            ktype = targs[0];
-          }
-          if (targs.length > 1) {
-            vtype = targs[1];
-          }
-        }
-      }
-    }
-    NodeList<MapLiteralEntry> entries = node.entries;
-    for (int i = 0; i < entries.length; i++) {
-      MapLiteralEntry entry = entries[i];
-      checkArgument(entry.key, ktype);
-      checkArgument(entry.value, vtype);
-    }
-    super.visitMapLiteral(node);
-  }
-
-  @override
-  void visitMapLiteral2(MapLiteral2 node) {
-    DartType keyType = DynamicTypeImpl.instance;
-    DartType valueType = DynamicTypeImpl.instance;
-    if (node.typeArguments != null) {
-      NodeList<TypeAnnotation> typeArguments = node.typeArguments.arguments;
-      if (typeArguments.length > 0) {
-        keyType = typeArguments[0].type;
-      }
-      if (typeArguments.length > 1) {
-        valueType = typeArguments[1].type;
-      }
-    } else {
-      DartType staticType = node.staticType;
-      if (staticType is InterfaceType) {
-        List<DartType> typeArguments = staticType.typeArguments;
-        if (typeArguments != null) {
-          if (typeArguments.length > 0) {
-            keyType = typeArguments[0];
-          }
-          if (typeArguments.length > 1) {
-            valueType = typeArguments[1];
-          }
-        }
-      }
-    }
-    NodeList<CollectionElement> entries = node.entries;
-    for (int i = 0; i < entries.length; i++) {
-      checkMapElement(entries[i], keyType, valueType);
-    }
-    super.visitMapLiteral2(node);
+    super.visitListLiteral(node);
   }
 
   @override
@@ -697,51 +557,58 @@
   }
 
   @override
-  void visitSetLiteral(SetLiteral node) {
-    DartType type = DynamicTypeImpl.instance;
-    if (node.typeArguments != null) {
-      NodeList<TypeAnnotation> targs = node.typeArguments.arguments;
-      if (targs.length > 0) {
-        type = targs[0].type;
-      }
-    } else {
-      DartType staticType = node.staticType;
-      if (staticType is InterfaceType) {
-        List<DartType> typeArguments = staticType.typeArguments;
-        if (typeArguments != null && typeArguments.length > 0) {
-          type = typeArguments[0];
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
+    if (node.isMap) {
+      DartType keyType = DynamicTypeImpl.instance;
+      DartType valueType = DynamicTypeImpl.instance;
+      if (node.typeArguments != null) {
+        NodeList<TypeAnnotation> typeArguments = node.typeArguments.arguments;
+        if (typeArguments.length > 0) {
+          keyType = typeArguments[0].type;
+        }
+        if (typeArguments.length > 1) {
+          valueType = typeArguments[1].type;
+        }
+      } else {
+        DartType staticType = node.staticType;
+        if (staticType is InterfaceType) {
+          List<DartType> typeArguments = staticType.typeArguments;
+          if (typeArguments != null) {
+            if (typeArguments.length > 0) {
+              keyType = typeArguments[0];
+            }
+            if (typeArguments.length > 1) {
+              valueType = typeArguments[1];
+            }
+          }
         }
       }
-    }
-    NodeList<Expression> elements = node.elements;
-    for (int i = 0; i < elements.length; i++) {
-      checkArgument(elements[i], type);
-    }
-    super.visitSetLiteral(node);
-  }
-
-  @override
-  void visitSetLiteral2(SetLiteral2 node) {
-    DartType type = DynamicTypeImpl.instance;
-    if (node.typeArguments != null) {
-      NodeList<TypeAnnotation> targs = node.typeArguments.arguments;
-      if (targs.length > 0) {
-        type = targs[0].type;
+      NodeList<CollectionElement> elements = node.elements2;
+      for (int i = 0; i < elements.length; i++) {
+        checkMapElement(elements[i], keyType, valueType);
       }
-    } else {
-      DartType staticType = node.staticType;
-      if (staticType is InterfaceType) {
-        List<DartType> typeArguments = staticType.typeArguments;
-        if (typeArguments != null && typeArguments.length > 0) {
-          type = typeArguments[0];
+    } else if (node.isSet) {
+      DartType type = DynamicTypeImpl.instance;
+      if (node.typeArguments != null) {
+        NodeList<TypeAnnotation> typeArguments = node.typeArguments.arguments;
+        if (typeArguments.length > 0) {
+          type = typeArguments[0].type;
+        }
+      } else {
+        DartType staticType = node.staticType;
+        if (staticType is InterfaceType) {
+          List<DartType> typeArguments = staticType.typeArguments;
+          if (typeArguments != null && typeArguments.length > 0) {
+            type = typeArguments[0];
+          }
         }
       }
+      NodeList<CollectionElement> elements = node.elements2;
+      for (int i = 0; i < elements.length; i++) {
+        checkCollectionElement(elements[i], type);
+      }
     }
-    NodeList<CollectionElement> elements = node.elements;
-    for (int i = 0; i < elements.length; i++) {
-      checkCollectionElement(elements[i], type);
-    }
-    super.visitSetLiteral2(node);
+    super.visitSetOrMapLiteral(node);
   }
 
   @override
@@ -1233,12 +1100,16 @@
       if (expr is ListLiteral) {
         _recordMessage(
             expr, StrongModeCode.INVALID_CAST_LITERAL_LIST, [from, to]);
-      } else if (expr is MapLiteral) {
-        _recordMessage(
-            expr, StrongModeCode.INVALID_CAST_LITERAL_MAP, [from, to]);
-      } else if (expr is SetLiteral) {
-        _recordMessage(
-            expr, StrongModeCode.INVALID_CAST_LITERAL_SET, [from, to]);
+      } else if (expr is SetOrMapLiteral) {
+        if (expr.isMap) {
+          _recordMessage(
+              expr, StrongModeCode.INVALID_CAST_LITERAL_MAP, [from, to]);
+        } else {
+          // Ambiguity should be resolved by now
+          assert(expr.isSet);
+          _recordMessage(
+              expr, StrongModeCode.INVALID_CAST_LITERAL_SET, [from, to]);
+        }
       } else {
         _recordMessage(
             expr, StrongModeCode.INVALID_CAST_LITERAL, [expr, from, to]);
@@ -1913,27 +1784,6 @@
   }
 
   @override
-  visitListLiteral2(ListLiteral2 node) {
-    if (node.typeArguments == null) {
-      super.visitListLiteral2(node);
-    }
-  }
-
-  @override
-  visitMapLiteral(MapLiteral node) {
-    if (node.typeArguments == null) {
-      super.visitMapLiteral(node);
-    }
-  }
-
-  @override
-  visitMapLiteral2(MapLiteral2 node) {
-    if (node.typeArguments == null) {
-      super.visitMapLiteral2(node);
-    }
-  }
-
-  @override
   visitMethodInvocation(MethodInvocation node) {
     node.target?.accept(this);
     var method = node.methodName.staticElement;
@@ -1970,16 +1820,9 @@
   }
 
   @override
-  visitSetLiteral(SetLiteral node) {
+  visitSetOrMapLiteral(SetOrMapLiteral node) {
     if (node.typeArguments == null) {
-      super.visitSetLiteral(node);
-    }
-  }
-
-  @override
-  visitSetLiteral2(SetLiteral2 node) {
-    if (node.typeArguments == null) {
-      super.visitSetLiteral2(node);
+      super.visitSetOrMapLiteral(node);
     }
   }
 
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index 9bf696b..90dc42a 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -91,12 +91,8 @@
     return _node(search, (n) => n is FieldFormalParameter);
   }
 
-  ForEachStatement forEachStatement(String search) {
-    return _node(search, (n) => n is ForEachStatement);
-  }
-
-  ForStatement forStatement(String search) {
-    return _node(search, (n) => n is ForStatement);
+  ForStatement2 forStatement2(String search) {
+    return _node(search, (n) => n is ForStatement2);
   }
 
   FunctionBody functionBody(String search) {
@@ -131,6 +127,10 @@
     return _node(search, (n) => n is InstanceCreationExpression);
   }
 
+  IntegerLiteral integerLiteral(String search) {
+    return _node(search, (n) => n is IntegerLiteral);
+  }
+
   LibraryDirective library(String search) {
     return _node(search, (n) => n is LibraryDirective);
   }
@@ -139,10 +139,6 @@
     return _node(search, (n) => n is ListLiteral);
   }
 
-  MapLiteral mapLiteral(String search) {
-    return _node(search, (n) => n is MapLiteral);
-  }
-
   MethodDeclaration methodDeclaration(String search) {
     return _node(search, (n) => n is MethodDeclaration);
   }
@@ -187,8 +183,8 @@
     return _node(search, (n) => n is RethrowExpression);
   }
 
-  SetLiteral setLiteral(String search) {
-    return _node(search, (n) => n is SetLiteral);
+  SetOrMapLiteral setOrMapLiteral(String search) {
+    return _node(search, (n) => n is SetOrMapLiteral);
   }
 
   SimpleIdentifier simple(String search) {
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index 94f6ed8..f9828f5 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -218,6 +218,8 @@
 
   int operator ~();
 
+  int gcd(int other);
+
   external static int parse(String source,
       {int radix, int onError(String source)});
 }
@@ -266,9 +268,9 @@
 }
 
 class Map<K, V> {
-  factory Map() => {}
+  factory Map() => null;
   factory Map.fromIterable(Iterable iterable,
-      {K key(element), V value(element)}) => {}
+      {K key(element), V value(element)}) => null;
   Iterable<K> get keys => null;
   int get length => 0;
   Iterable<V> get values => null;
diff --git a/pkg/analyzer/lib/src/test_utilities/package_mixin.dart b/pkg/analyzer/lib/src/test_utilities/package_mixin.dart
new file mode 100644
index 0000000..9ad69d8
--- /dev/null
+++ b/pkg/analyzer/lib/src/test_utilities/package_mixin.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+
+/// A mixin for test classes that provides support for creating packages.
+mixin PackageMixin implements ResourceProviderMixin {
+  /// Return the map from package names to lists of folders that is used to
+  /// resolve 'package:' URIs.
+  Map<String, List<Folder>> get packageMap;
+
+  /// Create a fake 'meta' package that can be used by tests.
+  void addMetaPackage() {
+    Folder lib = addPubPackage('meta');
+    newFile(join(lib.path, 'meta.dart'), content: r'''
+library meta;
+
+const _AlwaysThrows alwaysThrows = const _AlwaysThrows();
+const _Factory factory = const _Factory();
+const Immutable immutable = const Immutable();
+const _Literal literal = const _Literal();
+const _MustCallSuper mustCallSuper = const _MustCallSuper();
+const _Protected protected = const _Protected();
+const Required required = const Required();
+const _Sealed sealed = const _Sealed();
+const _VisibleForTesting visibleForTesting = const _VisibleForTesting();
+
+class Immutable {
+  final String reason;
+  const Immutable([this.reason]);
+}
+class _AlwaysThrows {
+  const _AlwaysThrows();
+}
+class _Factory {
+  const _Factory();
+}
+class _Literal {
+  const _Literal();
+}
+class _MustCallSuper {
+  const _MustCallSuper();
+}
+class _Protected {
+  const _Protected();
+}
+class Required {
+  final String reason;
+  const Required([this.reason]);
+}
+class _Sealed {
+  const _Sealed();
+}
+class _VisibleForTesting {
+  const _VisibleForTesting();
+}
+''');
+  }
+
+  /// Return a newly created directory in which the contents of a pub package
+  /// with the given [packageName] can be written. The package will be added to
+  /// the package map so that the package can be referenced from the code being
+  /// analyzed.
+  Folder addPubPackage(String packageName) {
+    // TODO(brianwilkerson) Consider renaming this to `addPackage` and passing
+    //  in a `PackageStyle` (pub, bazel, gn, build, plain) in order to support
+    //  creating other styles of packages.
+    Folder lib = getFolder('/.pub-cache/$packageName/lib');
+    packageMap[packageName] = [lib];
+    return lib;
+  }
+}
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 38d06b9..1906862 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.35.1
+version: 0.35.3
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
@@ -11,10 +11,9 @@
   collection: ^1.10.1
   convert: ^2.0.0
   crypto: '>=1.1.1 <3.0.0'
-  front_end: 0.1.11
+  front_end: 0.1.13
   glob: ^1.0.3
-  html: '>=0.12.0 <1.14.0'
-  kernel: 0.3.11
+  kernel: 0.3.13
   meta: ^1.0.2
   package_config: '>=0.1.5 <2.0.0'
   path: '>=0.9.0 <2.0.0'
diff --git a/pkg/analyzer/test/dart/ast/ast_test.dart b/pkg/analyzer/test/dart/ast/ast_test.dart
index a6b658a..829b1a9 100644
--- a/pkg/analyzer/test/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/dart/ast/ast_test.dart
@@ -743,6 +743,7 @@
     SimpleIdentifier identifier = AstTestFactory.identifier3("a");
     Expression iterator = AstTestFactory.listLiteral();
     Statement body = AstTestFactory.block();
+    // ignore: deprecated_member_use_from_same_package
     AstTestFactory.forEachStatement2(identifier, iterator, body);
     expect(identifier.inGetterContext(), isFalse);
   }
@@ -788,6 +789,7 @@
     SimpleIdentifier identifier = AstTestFactory.identifier3("a");
     Expression iterator = AstTestFactory.listLiteral();
     Statement body = AstTestFactory.block();
+    // ignore: deprecated_member_use_from_same_package
     AstTestFactory.forEachStatement2(identifier, iterator, body);
     expect(identifier.inSetterContext(), isTrue);
   }
diff --git a/pkg/analyzer/test/dart/element/builder_test.dart b/pkg/analyzer/test/dart/element/builder_test.dart
index ca9248f..5284855 100644
--- a/pkg/analyzer/test/dart/element/builder_test.dart
+++ b/pkg/analyzer/test/dart/element/builder_test.dart
@@ -766,6 +766,7 @@
     String variableName = "v";
     DeclaredIdentifier variableIdentifier =
         AstTestFactory.declaredIdentifier3('v');
+    // ignore: deprecated_member_use_from_same_package
     Statement statement = AstTestFactory.forEachStatement(variableIdentifier,
         AstTestFactory.listLiteral(), AstTestFactory.block());
     _setNodeSourceRange(statement, 100, 110);
@@ -796,7 +797,7 @@
     String variableName = "v";
     VariableDeclaration variableIdentifier =
         AstTestFactory.variableDeclaration('v');
-    ForStatement statement = AstTestFactory.forStatement2(
+    ForStatement2 statement = AstTestFactory.forStatement2(
         AstTestFactory.variableDeclarationList(
             null, AstTestFactory.typeName4('T'), [variableIdentifier]),
         null,
diff --git a/pkg/analyzer/test/error/error_test.dart b/pkg/analyzer/test/error/error_test.dart
index a33f0f2..adbf418 100644
--- a/pkg/analyzer/test/error/error_test.dart
+++ b/pkg/analyzer/test/error/error_test.dart
@@ -70,7 +70,7 @@
                 member.variables.variables[0].name.name == 'errorCodeValues',
             orElse: () => null);
     ListLiteral listLiteral = declaration.variables.variables[0].initializer;
-    for (PrefixedIdentifier element in listLiteral.elements) {
+    for (PrefixedIdentifier element in listLiteral.elements2) {
       listedCodes.add(element.name);
     }
     return listedCodes;
diff --git a/pkg/analyzer/test/generated/analysis_context_factory.dart b/pkg/analyzer/test/generated/analysis_context_factory.dart
index 0ab45f5..2b99d3b 100644
--- a/pkg/analyzer/test/generated/analysis_context_factory.dart
+++ b/pkg/analyzer/test/generated/analysis_context_factory.dart
@@ -486,53 +486,6 @@
   }
 }
 
-/**
- * Helper for creating and managing single [AnalysisContext].
- */
-class AnalysisContextHelper {
-  MemoryResourceProvider resourceProvider;
-  AnalysisContext context;
-
-  /**
-   * Creates new [AnalysisContext] using [AnalysisContextFactory].
-   */
-  AnalysisContextHelper(
-      [AnalysisOptionsImpl options, MemoryResourceProvider provider]) {
-    resourceProvider = provider ?? new MemoryResourceProvider();
-    context = AnalysisContextFactory.contextWithCoreAndOptions(
-        options ?? new AnalysisOptionsImpl(),
-        resourceProvider: resourceProvider);
-  }
-
-  Source addSource(String path, String code) {
-    Source source = resourceProvider
-        .getFile(resourceProvider.convertPath(path))
-        .createSource();
-    if (path.endsWith(".dart") || path.endsWith(".html")) {
-      ChangeSet changeSet = new ChangeSet();
-      changeSet.addedSource(source);
-      context.applyChanges(changeSet);
-    }
-    context.setContents(source, code);
-    return source;
-  }
-
-  CompilationUnitElement getDefiningUnitElement(Source source) =>
-      context.getCompilationUnitElement(source, source);
-
-  CompilationUnit resolveDefiningUnit(Source source) {
-    LibraryElement libraryElement = context.computeLibraryElement(source);
-    return context.resolveCompilationUnit(source, libraryElement);
-  }
-
-  void runTasks() {
-    AnalysisResult result = context.performAnalysisTask();
-    while (result.changeNotices != null) {
-      result = context.performAnalysisTask();
-    }
-  }
-}
-
 class TestPackageUriResolver extends UriResolver {
   Map<String, Source> sourceMap = new HashMap<String, Source>();
 
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code.dart
index a666f7a..66185d3 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code.dart
@@ -479,10 +479,8 @@
   test_listElementTypeNotAssignable() async {
     Source source = addSource("var v = const <String> [42];");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
-      StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-    ]);
+    assertErrors(source,
+        [CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_driver_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_driver_test.dart
index f8d85f2..12bc001 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_driver_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_driver_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -14,6 +13,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(CheckedModeCompileTimeErrorCodeTest_Driver);
     defineReflectiveTests(SetElementTypeNotAssignableTest);
+    defineReflectiveTests(SetElementTypeNotAssignableWithCodeAsUITest);
   });
 }
 
@@ -27,9 +27,6 @@
 @reflectiveTest
 class SetElementTypeNotAssignableTest extends ResolverTestCase {
   @override
-  List<String> get enabledExperiments => [EnableString.set_literals];
-
-  @override
   bool get enableNewAnalysisDriver => true;
 
   test_simple() async {
@@ -43,3 +40,43 @@
     verify([source]);
   }
 }
+
+@reflectiveTest
+class SetElementTypeNotAssignableWithCodeAsUITest extends ResolverTestCase {
+  @override
+  List<String> get enabledExperiments => ['spread-collections'];
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_simple_const() async {
+    // TODO(brianwilkerson) This test is not dependent on the experiments and
+    //  should be moved when these tests are cleaned up.
+    Source source = addSource("var v = const <String>{42};");
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CheckedModeCompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  test_simple_nonConst() async {
+    // TODO(brianwilkerson) This test is not dependent on the experiments and
+    //  should be moved when these tests are cleaned up.
+    Source source = addSource("var v = <String>{42};");
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  test_spread_valid_const() async {
+    await assertNoErrorsInCode('''
+var v = const <String>{...['a', 'b']};
+''');
+  }
+
+  test_spread_valid_nonConst() async {
+    await assertNoErrorsInCode('''
+var v = <String>{...['a', 'b']};
+''');
+  }
+}
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_driver_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_driver_test.dart
index 9c33cd5..1ea8ecc 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_driver_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_driver_test.dart
@@ -103,9 +103,6 @@
 @reflectiveTest
 class ConstSetElementTypeImplementsEqualsTest extends ResolverTestCase {
   @override
-  List<String> get enabledExperiments => [EnableString.set_literals];
-
-  @override
   bool get enableNewAnalysisDriver => true;
 
   test_constField() async {
@@ -207,7 +204,7 @@
 class ControlFlowCollectionsTest extends ResolverTestCase {
   @override
   List<String> get enabledExperiments =>
-      [EnableString.control_flow_collections, EnableString.set_literals];
+      [EnableString.control_flow_collections];
 
   @override
   bool get enableNewAnalysisDriver => true;
@@ -266,13 +263,22 @@
 }''', [StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS]);
   }
 
-  test_expectedTwoMapTypeArguments_three() async {
+  test_expectedTwoMapTypeArguments_three_ambiguous() async {
+    // TODO(brianwilkerson) We probably need a new error code for "expected
+    //  either one or two type arguments" to handle the ambiguous case.
     await assertErrorsInCode(r'''
 main() {
   <int, int, int>{};
 }''', [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
   }
 
+  test_expectedTwoMapTypeArguments_three_map() async {
+    await assertErrorsInCode(r'''
+main() {
+  <int, int, int>{1:2};
+}''', [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
+  }
+
   test_forIn_declaredVariableWrongType() async {
     await assertErrorsInCode('''
 f() {
@@ -543,9 +549,6 @@
 @reflectiveTest
 class InvalidTypeArgumentInConstSetTest extends ResolverTestCase {
   @override
-  List<String> get enabledExperiments => [EnableString.set_literals];
-
-  @override
   bool get enableNewAnalysisDriver => true;
 
   test_class() async {
@@ -565,9 +568,6 @@
 @reflectiveTest
 class NonConstSetElementFromDeferredLibraryTest extends ResolverTestCase {
   @override
-  List<String> get enabledExperiments => [EnableString.set_literals];
-
-  @override
   bool get enableNewAnalysisDriver => true;
 
   test_topLevelVariable_immediate() async {
@@ -606,9 +606,6 @@
 @reflectiveTest
 class NonConstSetElementTest extends ResolverTestCase {
   @override
-  List<String> get enabledExperiments => [EnableString.set_literals];
-
-  @override
   bool get enableNewAnalysisDriver => true;
 
   test_parameter() async {
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index 8f80f48..7a8053c 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -19,7 +19,6 @@
 import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/string_source.dart';
 import 'package:analyzer/src/task/api/model.dart';
-import 'package:html/dom.dart' show Document;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -623,11 +622,6 @@
   }
 
   @override
-  Document parseHtmlDocument(Source source) {
-    fail("Unexpected invocation of parseHtmlDocument");
-  }
-
-  @override
   AnalysisResult performAnalysisTask() {
     fail("Unexpected invocation of performAnalysisTask");
   }
diff --git a/pkg/analyzer/test/generated/hint_code_driver_test.dart b/pkg/analyzer/test/generated/hint_code_driver_test.dart
deleted file mode 100644
index c7a7758..0000000
--- a/pkg/analyzer/test/generated/hint_code_driver_test.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'hint_code_test.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(HintCodeTest_Driver);
-  });
-}
-
-@reflectiveTest
-class HintCodeTest_Driver extends HintCodeTest {
-  @override
-  bool get enableNewAnalysisDriver => true;
-}
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
index 6695ba9..9182c50 100644
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_test.dart
@@ -15,11 +15,13 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(CrossPackageHintCodeTest);
+    defineReflectiveTests(HintCodeTest);
   });
 }
 
-final metaLibraryStub = r'''
+/// The contents of the 'meta' package. Code that uses this variable should be
+/// converted to use PackageMixin.addMetaPackage.
+final _metaLibraryStub = r'''
 library meta;
 
 const _AlwaysThrows alwaysThrows = const _AlwaysThrows();
@@ -64,298 +66,14 @@
 ''';
 
 @reflectiveTest
-class CrossPackageHintCodeTest extends ResolverTestCase {
+class HintCodeTest extends ResolverTestCase {
   @override
   bool get enableNewAnalysisDriver => true;
 
-  test_subtypeOfSealedClass_extending() async {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub],
-      [
-        'foo',
-        r'''
-import 'package:meta/meta.dart';
-@sealed class Foo {}
-'''
-      ]
-    ]);
-
-    _newPubPackageRoot('/pkg1');
-    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
-                    import 'package:foo/foo.dart';
-                    class Bar extends Foo {}
-                    ''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
-    verify([source]);
-  }
-
-  test_subtypeOfSealedClass_implementing() async {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub],
-      [
-        'foo',
-        r'''
-import 'package:meta/meta.dart';
-@sealed class Foo {}
-'''
-      ]
-    ]);
-
-    _newPubPackageRoot('/pkg1');
-    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
-                    import 'package:foo/foo.dart';
-                    class Bar implements Foo {}
-                    ''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
-    verify([source]);
-  }
-
-  test_subtypeOfSealedClass_mixinApplication() async {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub],
-      [
-        'foo',
-        r'''
-import 'package:meta/meta.dart';
-@sealed class Foo {}
-'''
-      ]
-    ]);
-
-    _newPubPackageRoot('/pkg1');
-    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
-                    import 'package:foo/foo.dart';
-                    class Bar1 {}
-                    class Bar2 = Bar1 with Foo;
-                    ''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
-    verify([source]);
-  }
-
-  test_subtypeOfSealedClass_mixinImplements() async {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub],
-      [
-        'foo',
-        r'''
-import 'package:meta/meta.dart';
-@sealed class Foo {}
-'''
-      ]
-    ]);
-
-    _newPubPackageRoot('/pkg1');
-    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
-                    import 'package:foo/foo.dart';
-                    mixin Bar implements Foo {}
-                    ''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
-    verify([source]);
-  }
-
-  test_subtypeOfSealedClass_mixinOn() async {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub],
-      [
-        'foo',
-        r'''
-import 'package:meta/meta.dart';
-@sealed class Foo {}
-'''
-      ]
-    ]);
-
-    _newPubPackageRoot('/pkg1');
-    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
-                    import 'package:foo/foo.dart';
-                    mixin Bar on Foo {}
-                    ''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.MIXIN_ON_SEALED_CLASS]);
-    verify([source]);
-  }
-
-  test_subtypeOfSealedClass_with() async {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub],
-      [
-        'foo',
-        r'''
-import 'package:meta/meta.dart';
-@sealed class Foo {}
-'''
-      ]
-    ]);
-
-    _newPubPackageRoot('/pkg1');
-    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
-                    import 'package:foo/foo.dart';
-                    class Bar extends Object with Foo {}
-                    ''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
-    verify([source]);
-  }
-
-  test_subtypeOfSealedClass_withinLibrary_OK() async {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub],
-    ]);
-
-    _newPubPackageRoot('/pkg1');
-    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
-                    import 'package:meta/meta.dart';
-                    @sealed class Foo {}
-
-                    class Bar1 extends Foo {}
-                    class Bar2 implements Foo {}
-                    class Bar4 = Bar1 with Foo;
-                    mixin Bar5 on Foo {}
-                    mixin Bar6 implements Foo {}
-                    ''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_subtypeOfSealedClass_withinPackageLibDirectory_OK() async {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub],
-    ]);
-
-    _newPubPackageRoot('/pkg1');
-    Source source1 = addNamedSource('/pkg1/lib/lib1.dart', r'''
-                     import 'package:meta/meta.dart';
-                     @sealed class Foo {}
-                     ''');
-    Source source2 = addNamedSource('/pkg1/lib/src/lib2.dart', r'''
-                     import '../lib1.dart';
-                     class Bar1 extends Foo {}
-                     class Bar2 implements Foo {}
-                     class Bar4 = Bar1 with Foo;
-                     mixin Bar5 on Foo {}
-                     mixin Bar6 implements Foo {}
-                     ''');
-    await computeAnalysisResult(source1);
-    await computeAnalysisResult(source2);
-    assertNoErrors(source1);
-    assertNoErrors(source2);
-    verify([source1, source2]);
-  }
-
-  test_subtypeOfSealedClass_withinPackageTestDirectory_OK() async {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub],
-    ]);
-
-    newFolder('/pkg1');
-    _newPubPackageRoot('/pkg1');
-
-    Source source1 = addNamedSource('/pkg1/lib/lib1.dart', r'''
-                     import 'package:meta/meta.dart';
-                     @sealed class Foo {}
-                     ''');
-    Source source2 = addNamedSource('/pkg1/test/test.dart', r'''
-                     import '../lib/lib1.dart';
-                     class Bar1 extends Foo {}
-                     class Bar2 implements Foo {}
-                     class Bar4 = Bar1 with Foo;
-                     mixin Bar5 on Foo {}
-                     mixin Bar6 implements Foo {}
-                     ''');
-    await computeAnalysisResult(source1);
-    await computeAnalysisResult(source2);
-    assertNoErrors(source1);
-    assertNoErrors(source2);
-    verify([source1, source2]);
-  }
-
-  test_subtypeOfSealedClass_withinPart_OK() async {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub],
-    ]);
-
-    _newPubPackageRoot('/pkg1');
-    Source source1 = addNamedSource('/pkg1/lib/lib1.dart', r'''
-                     import 'package:meta/meta.dart';
-                     part 'part1.dart';
-                     @sealed class Foo {}
-                     ''');
-    addNamedSource('/pkg1/lib/part1.dart', r'''
-                     part of 'lib1.dart';
-                     class Bar1 extends Foo {}
-                     class Bar2 implements Foo {}
-                     class Bar4 = Bar1 with Foo;
-                     mixin Bar5 on Foo {}
-                     mixin Bar6 implements Foo {}
-                     ''');
-    await computeAnalysisResult(source1);
-    assertNoErrors(source1);
-    verify([source1]);
-  }
-
-  test_subtypeOfSealedMixin_mixinApplication() async {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub],
-      [
-        'foo',
-        r'''
-import 'package:meta/meta.dart';
-@sealed mixin Foo {}
-'''
-      ]
-    ]);
-
-    _newPubPackageRoot('/pkg1');
-    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
-                    import 'package:foo/foo.dart';
-                    class Bar1 {}
-                    class Bar2 = Bar1 with Foo;
-                    ''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
-    verify([source]);
-  }
-
-  test_subtypeOfSealedMixin_with() async {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub],
-      [
-        'foo',
-        r'''
-import 'package:meta/meta.dart';
-@sealed mixin Foo {}
-'''
-      ]
-    ]);
-
-    _newPubPackageRoot('/pkg1');
-    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
-                    import 'package:foo/foo.dart';
-                    class Bar extends Object with Foo {}
-                    ''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
-    verify([source]);
-  }
-
-  /// Write a pubspec file at [root], so that BestPracticesVerifier can see
-  /// that [root] is the root of a PubWorkspace, and a PubWorkspacePackage.
-  void _newPubPackageRoot(String root) {
-    newFile('$root/pubspec.yaml');
-  }
-}
-
-@reflectiveTest
-class HintCodeTest extends ResolverTestCase {
   @override
   void reset() {
     super.resetWith(packages: [
-      ['meta', metaLibraryStub],
+      ['meta', _metaLibraryStub],
       [
         'js',
         r'''
@@ -380,542 +98,6 @@
     ]);
   }
 
-  test_deadCode_deadBlock_conditionalElse() async {
-    Source source = addSource(r'''
-f() {
-  true ? 1 : 2;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_conditionalElse_nested() async {
-    // test that a dead else-statement can't generate additional violations
-    Source source = addSource(r'''
-f() {
-  true ? true : false && false;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_conditionalIf() async {
-    Source source = addSource(r'''
-f() {
-  false ? 1 : 2;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_conditionalIf_nested() async {
-    // test that a dead then-statement can't generate additional violations
-    Source source = addSource(r'''
-f() {
-  false ? false && false : true;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_else() async {
-    Source source = addSource(r'''
-f() {
-  if(true) {} else {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_else_nested() async {
-    // test that a dead else-statement can't generate additional violations
-    Source source = addSource(r'''
-f() {
-  if(true) {} else {if (false) {}}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_if() async {
-    Source source = addSource(r'''
-f() {
-  if(false) {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_if_nested() async {
-    // test that a dead then-statement can't generate additional violations
-    Source source = addSource(r'''
-f() {
-  if(false) {if(false) {}}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_while() async {
-    Source source = addSource(r'''
-f() {
-  while(false) {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_while_nested() async {
-    // test that a dead while body can't generate additional violations
-    Source source = addSource(r'''
-f() {
-  while(false) {if(false) {}}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadCatch_catchFollowingCatch() async {
-    Source source = addSource(r'''
-class A {}
-f() {
-  try {} catch (e) {} catch (e) {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
-    verify([source]);
-  }
-
-  test_deadCode_deadCatch_catchFollowingCatch_nested() async {
-    // test that a dead catch clause can't generate additional violations
-    Source source = addSource(r'''
-class A {}
-f() {
-  try {} catch (e) {} catch (e) {if(false) {}}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
-    verify([source]);
-  }
-
-  test_deadCode_deadCatch_catchFollowingCatch_object() async {
-    Source source = addSource(r'''
-f() {
-  try {} on Object catch (e) {} catch (e) {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
-    verify([source]);
-  }
-
-  test_deadCode_deadCatch_catchFollowingCatch_object_nested() async {
-    // test that a dead catch clause can't generate additional violations
-    Source source = addSource(r'''
-f() {
-  try {} on Object catch (e) {} catch (e) {if(false) {}}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
-    verify([source]);
-  }
-
-  test_deadCode_deadCatch_onCatchSubtype() async {
-    Source source = addSource(r'''
-class A {}
-class B extends A {}
-f() {
-  try {} on A catch (e) {} on B catch (e) {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadCatch_onCatchSubtype_nested() async {
-    // test that a dead catch clause can't generate additional violations
-    Source source = addSource(r'''
-class A {}
-class B extends A {}
-f() {
-  try {} on A catch (e) {} on B catch (e) {if(false) {}}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadFinalReturnInCase() async {
-    Source source = addSource(r'''
-f() {
-  switch (true) {
-  case true:
-    try {
-      int a = 1;
-    } finally {
-      return;
-    }
-    return;
-  default:
-    break;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadFinalStatementInCase() async {
-    Source source = addSource(r'''
-f() {
-  switch (true) {
-  case true:
-    try {
-      int a = 1;
-    } finally {
-      return;
-    }
-    int b = 1;
-  default:
-    break;
-  }
-}''');
-    // A single dead statement at the end of a switch case that is not a
-    // terminating statement will yield two errors.
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [HintCode.DEAD_CODE, StaticWarningCode.CASE_BLOCK_NOT_TERMINATED]);
-    verify([source]);
-  }
-
-  test_deadCode_deadOperandLHS_and() async {
-    Source source = addSource(r'''
-f() {
-  bool b = false && false;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadOperandLHS_and_nested() async {
-    Source source = addSource(r'''
-f() {
-  bool b = false && (false && false);
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadOperandLHS_or() async {
-    Source source = addSource(r'''
-f() {
-  bool b = true || true;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_deadOperandLHS_or_nested() async {
-    Source source = addSource(r'''
-f() {
-  bool b = true || (false && false);
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterAlwaysThrowsFunction() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-
-@alwaysThrows
-void a() {
-  throw 'msg';
-}
-
-f() {
-  var one = 1;
-  a();
-  var two = 2;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  @failingTest
-  test_deadCode_statementAfterAlwaysThrowsGetter() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-
-class C {
-  @alwaysThrows
-  int get a {
-    throw 'msg';
-  }
-}
-
-f() {
-  var one = 1;
-  new C().a;
-  var two = 2;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterAlwaysThrowsMethod() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-
-class C {
-  @alwaysThrows
-  void a() {
-    throw 'msg';
-  }
-}
-
-f() {
-  var one = 1;
-  new C().a();
-  var two = 2;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterBreak_inDefaultCase() async {
-    Source source = addSource(r'''
-f(v) {
-  switch(v) {
-    case 1:
-    default:
-      break;
-      var a;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterBreak_inForEachStatement() async {
-    Source source = addSource(r'''
-f() {
-  var list;
-  for(var l in list) {
-    break;
-    var a;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterBreak_inForStatement() async {
-    Source source = addSource(r'''
-f() {
-  for(;;) {
-    break;
-    var a;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterBreak_inSwitchCase() async {
-    Source source = addSource(r'''
-f(v) {
-  switch(v) {
-    case 1:
-      break;
-      var a;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterBreak_inWhileStatement() async {
-    Source source = addSource(r'''
-f(v) {
-  while(v) {
-    break;
-    var a;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterContinue_inForEachStatement() async {
-    Source source = addSource(r'''
-f() {
-  var list;
-  for(var l in list) {
-    continue;
-    var a;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterContinue_inForStatement() async {
-    Source source = addSource(r'''
-f() {
-  for(;;) {
-    continue;
-    var a;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterContinue_inWhileStatement() async {
-    Source source = addSource(r'''
-f(v) {
-  while(v) {
-    continue;
-    var a;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterExitingIf_returns() async {
-    Source source = addSource(r'''
-f() {
-  if (1 > 2) {
-    return;
-  } else {
-    return;
-  }
-  var one = 1;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterRethrow() async {
-    Source source = addSource(r'''
-f() {
-  try {
-    var one = 1;
-  } catch (e) {
-    rethrow;
-    var two = 2;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterReturn_function() async {
-    Source source = addSource(r'''
-f() {
-  var one = 1;
-  return;
-  var two = 2;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterReturn_ifStatement() async {
-    Source source = addSource(r'''
-f(bool b) {
-  if(b) {
-    var one = 1;
-    return;
-    var two = 2;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterReturn_method() async {
-    Source source = addSource(r'''
-class A {
-  m() {
-    var one = 1;
-    return;
-    var two = 2;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterReturn_nested() async {
-    Source source = addSource(r'''
-f() {
-  var one = 1;
-  return;
-  if(false) {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterReturn_twoReturns() async {
-    Source source = addSource(r'''
-f() {
-  var one = 1;
-  return;
-  var two = 2;
-  return;
-  var three = 3;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterThrow() async {
-    Source source = addSource(r'''
-f() {
-  var one = 1;
-  throw 'Stop here';
-  var two = 2;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
   test_deprecatedFunction_class() async {
     Source source = addSource(r'''
 class Function {}
@@ -1235,142 +417,6 @@
     ]);
   }
 
-  test_invalidImmutableAnnotation_method() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @immutable
-  void m() {}
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.INVALID_IMMUTABLE_ANNOTATION]);
-    verify([source]);
-  }
-
-  test_invalidLiteralAnnotation_nonConstConstructor() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @literal
-  A() {}
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.INVALID_LITERAL_ANNOTATION]);
-    verify([source]);
-  }
-
-  test_nonConstCallToLiteralConstructor_nonConstContext() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @literal
-  const A();
-}
-void main() {
-  var a = A();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  test_nonConstCallToLiteralConstructor_usingNew() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @literal
-  const A();
-}
-void main() {
-  var a = new A();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW]);
-    verify([source]);
-  }
-
-  test_nonConstCallToLiteralConstructor_namedConstructor() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @literal
-  const A.named();
-}
-void main() {
-  var a = A.named();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  test_invalidLiteralAnnotation_nonConstructor() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @literal
-  void m() {}
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.INVALID_LITERAL_ANNOTATION]);
-    verify([source]);
-  }
-
-  test_invalidSealedAnnotation_onClass() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-
-@sealed class A {}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_invalidSealedAnnotation_onMixin() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-
-@sealed mixin M {}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.INVALID_SEALED_ANNOTATION]);
-    verify([source]);
-  }
-
-  test_invalidSealedAnnotation_onMixinApplication() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-
-abstract class A {}
-
-abstract class B {}
-
-@sealed abstract class M = A with B;
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_invalidSealedAnnotation_onNonClass() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-
-@sealed m({a = 1}) => null;
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.INVALID_SEALED_ANNOTATION]);
-    verify([source]);
-  }
-
   test_invalidUseOfProtectedMember_closure() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:meta/meta.dart';
@@ -2362,228 +1408,6 @@
     verify([source]);
   }
 
-  test_mustBeImmutable_direct() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-@immutable
-class A {
-  int x;
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.MUST_BE_IMMUTABLE]);
-    verify([source]);
-  }
-
-  test_mustBeImmutable_directMixin() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-@immutable
-mixin A {
-  int x;
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.MUST_BE_IMMUTABLE]);
-    verify([source]);
-  }
-
-  test_mustBeImmutable_extends() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-@immutable
-class A {}
-class B extends A {
-  int x;
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.MUST_BE_IMMUTABLE]);
-    verify([source]);
-  }
-
-  test_mustBeImmutable_fromMixin() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-@immutable
-class A {}
-class B {
-  int x;
-}
-class C extends A with B {}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.MUST_BE_IMMUTABLE]);
-    verify([source]);
-  }
-
-  test_mustBeImmutable_instance() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-@immutable
-class A {
-  static int x;
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, []);
-    verify([source]);
-  }
-
-  test_mustBeImmutable_mixinApplication() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-@immutable
-class A {}
-class B {
-  int x;
-}
-class C = A with B;
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.MUST_BE_IMMUTABLE]);
-    verify([source]);
-  }
-
-  test_mustBeImmutable_mixinApplicationBase() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  int x;
-}
-class B {}
-@immutable
-class C = A with B;
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.MUST_BE_IMMUTABLE]);
-    verify([source]);
-  }
-
-  test_mustCallSuper() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @mustCallSuper
-  void a() {}
-}
-class B extends A {
-  @override
-  void a()
-  {}
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.MUST_CALL_SUPER]);
-    verify([source]);
-  }
-
-  test_mustCallSuper_fromInterface() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @mustCallSuper
-  void a() {}
-}
-class C implements A {
-  @override
-  void a() {}
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, []);
-    verify([source]);
-  }
-
-  test_mustCallSuper_indirect() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @mustCallSuper
-  void a() {}
-}
-class C extends A {
-  @override
-  void a() {
-    super.a();
-  }
-}
-class D extends C {
-  @override
-  void a() {}
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.MUST_CALL_SUPER]);
-    verify([source]);
-  }
-
-  test_mustCallSuper_overridden() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @mustCallSuper
-  void a() {}
-}
-class C extends A {
-  @override
-  void a() {
-    super.a(); //OK
-  }
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, []);
-    verify([source]);
-  }
-
-  test_mustCallSuper_overridden_w_future() async {
-    //https://github.com/flutter/flutter/issues/11646
-    Source source = addSource(r'''
-import 'dart:async';
-import 'package:meta/meta.dart';
-class A {
-  @mustCallSuper
-  Future<Null> bar() => new Future<Null>.value();
-}
-class C extends A {
-  @override
-  Future<Null> bar() {
-    final value = super.bar();
-    return value.then((Null _) {
-      return null;
-    });
-  }
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, []);
-    verify([source]);
-  }
-
-  test_mustCallSuper_overridden_w_future2() async {
-    //https://github.com/flutter/flutter/issues/11646
-    Source source = addSource(r'''
-import 'dart:async';
-import 'package:meta/meta.dart';
-class A {
-  @mustCallSuper
-  Future<Null> bar() => new Future<Null>.value();
-}
-class C extends A {
-  @override
-  Future<Null> bar() {
-    return super.bar().then((Null _) {
-      return null;
-    });
-  }
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, []);
-    verify([source]);
-  }
-
   test_no_missingReturn_async_futureOrVoid() async {
     Source source = addSource('''
 import 'dart:async';
diff --git a/pkg/analyzer/test/generated/non_error_resolver.dart b/pkg/analyzer/test/generated/non_error_resolver.dart
index 3d06cd2..bba51ce 100644
--- a/pkg/analyzer/test/generated/non_error_resolver.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver.dart
@@ -907,6 +907,19 @@
     expect(classC.documentationComment, isNotNull);
   }
 
+  test_closure_in_type_inferred_variable_in_other_lib() async {
+    Source source = addSource('''
+import 'other.dart';
+var x = y;
+    ''');
+    addNamedSource('/other.dart', '''
+var y = (Object x) => x is int && x.isEven;
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_concreteClassWithAbstractMember() async {
     Source source = addSource(r'''
 abstract class A {
diff --git a/pkg/analyzer/test/generated/non_error_resolver_driver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_driver_test.dart
index 0e14cfb..af22a4a 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_driver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_driver_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonErrorResolverTest_Driver);
+    defineReflectiveTests(NonErrorResolverTest_WithUiAsCode);
     defineReflectiveTests(NonConstantValueInInitializer);
   });
 }
@@ -72,3 +73,10 @@
     return super.test_null_callOperator();
   }
 }
+
+@reflectiveTest
+class NonErrorResolverTest_WithUiAsCode extends NonErrorResolverTest_Driver {
+  @override
+  List<String> get enabledExperiments =>
+      [EnableString.spread_collections, EnableString.control_flow_collections];
+}
diff --git a/pkg/analyzer/test/generated/non_hint_code.dart b/pkg/analyzer/test/generated/non_hint_code.dart
index 206e154..75e1a3d 100644
--- a/pkg/analyzer/test/generated/non_hint_code.dart
+++ b/pkg/analyzer/test/generated/non_hint_code.dart
@@ -41,230 +41,6 @@
     verify([source]);
   }
 
-  test_deadCode_afterForEachWithBreakLabel() async {
-    Source source = addSource('''
-f() {
-  named: {
-    for (var x in [1]) {
-      if (x == null)
-        break named;
-    }
-    return;
-  }
-  print('not dead');
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_afterForWithBreakLabel() async {
-    Source source = addSource('''
-f() {
-  named: {
-    for (int i = 0; i < 7; i++) {
-      if (i == null)
-        break named;
-    }
-    return;
-  }
-  print('not dead');
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_afterTryCatch() async {
-    Source source = addSource('''
-main() {
-  try {
-    return f();
-  } catch (e) {
-    print(e);
-  }
-  print('not dead');
-}
-f() {
-  throw 'foo';
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_conditionalElse_debugConst() async {
-    Source source = addSource(r'''
-const bool DEBUG = true;
-f() {
-  DEBUG ? 1 : 2;
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_conditionalIf_debugConst() async {
-    Source source = addSource(r'''
-const bool DEBUG = false;
-f() {
-  DEBUG ? 1 : 2;
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_else() async {
-    Source source = addSource(r'''
-const bool DEBUG = true;
-f() {
-  if(DEBUG) {} else {}
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_if_debugConst_prefixedIdentifier() async {
-    Source source = addSource(r'''
-class A {
-  static const bool DEBUG = false;
-}
-f() {
-  if(A.DEBUG) {}
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_if_debugConst_prefixedIdentifier2() async {
-    Source source = addSource(r'''
-library L;
-import 'lib2.dart';
-f() {
-  if(A.DEBUG) {}
-}''');
-    addNamedSource("/lib2.dart", r'''
-library lib2;
-class A {
-  static const bool DEBUG = false;
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_if_debugConst_propertyAccessor() async {
-    Source source = addSource(r'''
-library L;
-import 'lib2.dart' as LIB;
-f() {
-  if(LIB.A.DEBUG) {}
-}''');
-    addNamedSource("/lib2.dart", r'''
-library lib2;
-class A {
-  static const bool DEBUG = false;
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_if_debugConst_simpleIdentifier() async {
-    Source source = addSource(r'''
-const bool DEBUG = false;
-f() {
-  if(DEBUG) {}
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_deadBlock_while_debugConst() async {
-    Source source = addSource(r'''
-const bool DEBUG = false;
-f() {
-  while(DEBUG) {}
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_deadCatch_onCatchSubtype() async {
-    Source source = addSource(r'''
-class A {}
-class B extends A {}
-f() {
-  try {} on B catch (e) {} on A catch (e) {} catch (e) {}
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_deadFinalBreakInCase() async {
-    Source source = addSource(r'''
-f() {
-  switch (true) {
-  case true:
-    try {
-      int a = 1;
-    } finally {
-      return;
-    }
-    break;
-  default:
-    break;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_deadOperandLHS_and_debugConst() async {
-    Source source = addSource(r'''
-const bool DEBUG = false;
-f() {
-  bool b = DEBUG && false;
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_deadOperandLHS_or_debugConst() async {
-    Source source = addSource(r'''
-const bool DEBUG = true;
-f() {
-  bool b = DEBUG || true;
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_statementAfterIfWithoutElse() async {
-    Source source = addSource(r'''
-f() {
-  if (1 < 0) {
-    return;
-  }
-  int a = 1;
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_duplicateImport_as() async {
     Source source = addSource(r'''
 library L;
@@ -462,70 +238,6 @@
     verify([source]);
   }
 
-  test_invalidLiteralAnnotation_constConstructor() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @literal
-  const A();
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_nonConstCallToLiteralConstructor_constCreation() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @literal
-  const A();
-}
-
-void main() {
-  const a = const A();
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_nonConstCallToLiteralConstructor_constContextCreation() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @literal
-  const A();
-}
-
-void main() {
-  const a = A();
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_nonConstCallToLiteralConstructor_unconstableCreation() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-class A {
-  @literal
-  const A(List list);
-}
-
-void main() {
-  var a = A(new List());
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_overrideOnNonOverridingField_inInterface() async {
     Source source = addSource(r'''
 class A {
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 4809b48..f90204a 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -7,10 +7,10 @@
 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType;
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart' show ErrorReporter;
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
+import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/fasta/ast_builder.dart';
 import 'package:analyzer/src/generated/parser.dart' as analyzer;
 import 'package:analyzer/src/generated/utilities_dart.dart';
@@ -75,7 +75,6 @@
     // Run parser
     ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
     fasta.Parser parser = new fasta.Parser(null);
-    parser.enableSetLiterals = IsEnabledByDefault.set_literals;
     AstBuilder astBuilder = new AstBuilder(errorReporter, source.uri, true);
     parser.listener = astBuilder;
     astBuilder.parser = parser;
@@ -121,21 +120,20 @@
         errors: errors,
         expectedEndOffset: expectedEndOffset,
         inAsync: inAsync,
-        parseSetLiterals: true,
         parseSpreadCollections: true,
         parseControlFlowCollections: true);
   }
 
   void test_listLiteral_for() {
-    ListLiteral2 list = parseCollectionLiteral(
+    ListLiteral list = parseCollectionLiteral(
       '[1, await for (var x in list) 2]',
       inAsync: true,
     );
-    expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    expect(list.elements2, hasLength(2));
+    IntegerLiteral first = list.elements2[0];
     expect(first.value, 1);
 
-    ForElement second = list.elements[1];
+    ForElement second = list.elements2[1];
     expect(second.awaitKeyword, isNotNull);
     expect(second.forKeyword.isKeyword, isTrue);
     expect(second.leftParenthesis.lexeme, '(');
@@ -149,15 +147,15 @@
   }
 
   void test_listLiteral_forIf() {
-    ListLiteral2 list = parseCollectionLiteral(
+    ListLiteral list = parseCollectionLiteral(
       '[1, await for (var x in list) if (c) 2]',
       inAsync: true,
     );
-    expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    expect(list.elements2, hasLength(2));
+    IntegerLiteral first = list.elements2[0];
     expect(first.value, 1);
 
-    ForElement second = list.elements[1];
+    ForElement second = list.elements2[1];
     expect(second.awaitKeyword, isNotNull);
     expect(second.forKeyword.isKeyword, isTrue);
     expect(second.leftParenthesis.lexeme, '(');
@@ -177,13 +175,13 @@
   }
 
   void test_listLiteral_forSpread() {
-    ListLiteral2 list =
+    ListLiteral list =
         parseCollectionLiteral('[1, for (int x = 0; x < 10; ++x) ...[2]]');
-    expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    expect(list.elements2, hasLength(2));
+    IntegerLiteral first = list.elements2[0];
     expect(first.value, 1);
 
-    ForElement second = list.elements[1];
+    ForElement second = list.elements2[1];
     expect(second.awaitKeyword, isNull);
     expect(second.forKeyword.isKeyword, isTrue);
     expect(second.leftParenthesis.lexeme, '(');
@@ -200,12 +198,12 @@
   }
 
   void test_listLiteral_if() {
-    ListLiteral2 list = parseCollectionLiteral('[1, if (true) 2]');
-    expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    ListLiteral list = parseCollectionLiteral('[1, if (true) 2]');
+    expect(list.elements2, hasLength(2));
+    IntegerLiteral first = list.elements2[0];
     expect(first.value, 1);
 
-    IfElement second = list.elements[1];
+    IfElement second = list.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     IntegerLiteral thenElement = second.thenElement;
@@ -214,12 +212,12 @@
   }
 
   void test_listLiteral_ifElse() {
-    ListLiteral2 list = parseCollectionLiteral('[1, if (true) 2 else 5]');
-    expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    ListLiteral list = parseCollectionLiteral('[1, if (true) 2 else 5]');
+    expect(list.elements2, hasLength(2));
+    IntegerLiteral first = list.elements2[0];
     expect(first.value, 1);
 
-    IfElement second = list.elements[1];
+    IfElement second = list.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     IntegerLiteral thenElement = second.thenElement;
@@ -229,13 +227,13 @@
   }
 
   void test_listLiteral_ifElseFor() {
-    ListLiteral2 list =
+    ListLiteral list =
         parseCollectionLiteral('[1, if (true) 2 else for (a in b) 5]');
-    expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    expect(list.elements2, hasLength(2));
+    IntegerLiteral first = list.elements2[0];
     expect(first.value, 1);
 
-    IfElement second = list.elements[1];
+    IfElement second = list.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     IntegerLiteral thenElement = second.thenElement;
@@ -250,13 +248,13 @@
   }
 
   void test_listLiteral_ifElseSpread() {
-    ListLiteral2 list =
+    ListLiteral list =
         parseCollectionLiteral('[1, if (true) ...[2] else ...?[5]]');
-    expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    expect(list.elements2, hasLength(2));
+    IntegerLiteral first = list.elements2[0];
     expect(first.value, 1);
 
-    IfElement second = list.elements[1];
+    IfElement second = list.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     SpreadElement thenElement = second.thenElement;
@@ -266,12 +264,12 @@
   }
 
   void test_listLiteral_ifFor() {
-    ListLiteral2 list = parseCollectionLiteral('[1, if (true) for (a in b) 2]');
-    expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    ListLiteral list = parseCollectionLiteral('[1, if (true) for (a in b) 2]');
+    expect(list.elements2, hasLength(2));
+    IntegerLiteral first = list.elements2[0];
     expect(first.value, 1);
 
-    IfElement second = list.elements[1];
+    IfElement second = list.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
 
@@ -285,12 +283,12 @@
   }
 
   void test_listLiteral_ifSpread() {
-    ListLiteral2 list = parseCollectionLiteral('[1, if (true) ...[2]]');
-    expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    ListLiteral list = parseCollectionLiteral('[1, if (true) ...[2]]');
+    expect(list.elements2, hasLength(2));
+    IntegerLiteral first = list.elements2[0];
     expect(first.value, 1);
 
-    IfElement second = list.elements[1];
+    IfElement second = list.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     SpreadElement thenElement = second.thenElement;
@@ -299,38 +297,39 @@
   }
 
   void test_listLiteral_spread() {
-    ListLiteral2 list = parseCollectionLiteral('[1, ...[2]]');
-    expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    ListLiteral list = parseCollectionLiteral('[1, ...[2]]');
+    expect(list.elements2, hasLength(2));
+    IntegerLiteral first = list.elements2[0];
     expect(first.value, 1);
 
-    SpreadElement element = list.elements[1];
+    SpreadElement element = list.elements2[1];
     expect(element.spreadOperator.lexeme, '...');
-    ListLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.elements, hasLength(1));
+    ListLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 
   void test_listLiteral_spreadQ() {
-    ListLiteral2 list = parseCollectionLiteral('[1, ...?[2]]');
-    expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    ListLiteral list = parseCollectionLiteral('[1, ...?[2]]');
+    expect(list.elements2, hasLength(2));
+    IntegerLiteral first = list.elements2[0];
     expect(first.value, 1);
 
-    SpreadElement element = list.elements[1];
+    SpreadElement element = list.elements2[1];
     expect(element.spreadOperator.lexeme, '...?');
-    ListLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.elements, hasLength(1));
+    ListLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 
   void test_mapLiteral_for() {
-    MapLiteral2 map = parseCollectionLiteral('{1:7, await for (y in list) 2:3}',
+    SetOrMapLiteral map = parseCollectionLiteral(
+        '{1:7, await for (y in list) 2:3}',
         inAsync: true);
-    expect(map.entries, hasLength(2));
-    MapLiteralEntry first = map.entries[0];
+    expect(map.elements2, hasLength(2));
+    MapLiteralEntry first = map.elements2[0];
     IntegerLiteral firstValue = first.value;
     expect(firstValue.value, 7);
 
-    ForElement second = map.entries[1];
+    ForElement second = map.elements2[1];
     expect(second.awaitKeyword, isNotNull);
     expect(second.forKeyword.isKeyword, isTrue);
     expect(second.leftParenthesis.lexeme, '(');
@@ -344,15 +343,15 @@
   }
 
   void test_mapLiteral_forIf() {
-    MapLiteral2 map = parseCollectionLiteral(
+    SetOrMapLiteral map = parseCollectionLiteral(
         '{1:7, await for (y in list) if (c) 2:3}',
         inAsync: true);
-    expect(map.entries, hasLength(2));
-    MapLiteralEntry first = map.entries[0];
+    expect(map.elements2, hasLength(2));
+    MapLiteralEntry first = map.elements2[0];
     IntegerLiteral firstValue = first.value;
     expect(firstValue.value, 7);
 
-    ForElement second = map.entries[1];
+    ForElement second = map.elements2[1];
     expect(second.awaitKeyword, isNotNull);
     expect(second.forKeyword.isKeyword, isTrue);
     expect(second.leftParenthesis.lexeme, '(');
@@ -373,14 +372,14 @@
   }
 
   void test_mapLiteral_forSpread() {
-    MapLiteral2 map =
+    SetOrMapLiteral map =
         parseCollectionLiteral('{1:7, for (x = 0; x < 10; ++x) ...{2:3}}');
-    expect(map.entries, hasLength(2));
-    MapLiteralEntry first = map.entries[0];
+    expect(map.elements2, hasLength(2));
+    MapLiteralEntry first = map.elements2[0];
     IntegerLiteral firstValue = first.value;
     expect(firstValue.value, 7);
 
-    ForElement second = map.entries[1];
+    ForElement second = map.elements2[1];
     expect(second.awaitKeyword, isNull);
     expect(second.forKeyword.isKeyword, isTrue);
     expect(second.leftParenthesis.lexeme, '(');
@@ -398,13 +397,13 @@
   }
 
   void test_mapLiteral_if() {
-    MapLiteral2 map = parseCollectionLiteral('{1:1, if (true) 2:4}');
-    expect(map.entries, hasLength(2));
-    MapLiteralEntry first = map.entries[0];
+    SetOrMapLiteral map = parseCollectionLiteral('{1:1, if (true) 2:4}');
+    expect(map.elements2, hasLength(2));
+    MapLiteralEntry first = map.elements2[0];
     IntegerLiteral firstValue = first.value;
     expect(firstValue.value, 1);
 
-    IfElement second = map.entries[1];
+    IfElement second = map.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     MapLiteralEntry thenElement = second.thenElement;
@@ -414,13 +413,14 @@
   }
 
   void test_mapLiteral_ifElse() {
-    MapLiteral2 map = parseCollectionLiteral('{1:1, if (true) 2:4 else 5:6}');
-    expect(map.entries, hasLength(2));
-    MapLiteralEntry first = map.entries[0];
+    SetOrMapLiteral map =
+        parseCollectionLiteral('{1:1, if (true) 2:4 else 5:6}');
+    expect(map.elements2, hasLength(2));
+    MapLiteralEntry first = map.elements2[0];
     IntegerLiteral firstValue = first.value;
     expect(firstValue.value, 1);
 
-    IfElement second = map.entries[1];
+    IfElement second = map.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     MapLiteralEntry thenElement = second.thenElement;
@@ -432,14 +432,14 @@
   }
 
   void test_mapLiteral_ifElseFor() {
-    MapLiteral2 map =
+    SetOrMapLiteral map =
         parseCollectionLiteral('{1:1, if (true) 2:4 else for (c in d) 5:6}');
-    expect(map.entries, hasLength(2));
-    MapLiteralEntry first = map.entries[0];
+    expect(map.elements2, hasLength(2));
+    MapLiteralEntry first = map.elements2[0];
     IntegerLiteral firstValue = first.value;
     expect(firstValue.value, 1);
 
-    IfElement second = map.entries[1];
+    IfElement second = map.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     MapLiteralEntry thenElement = second.thenElement;
@@ -456,36 +456,36 @@
   }
 
   void test_mapLiteral_ifElseSpread() {
-    MapLiteral2 map =
+    SetOrMapLiteral map =
         parseCollectionLiteral('{1:7, if (true) ...{2:4} else ...?{5:6}}');
-    expect(map.entries, hasLength(2));
-    MapLiteralEntry first = map.entries[0];
+    expect(map.elements2, hasLength(2));
+    MapLiteralEntry first = map.elements2[0];
     IntegerLiteral firstValue = first.value;
     expect(firstValue.value, 7);
 
-    IfElement second = map.entries[1];
+    IfElement second = map.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     SpreadElement thenElement = second.thenElement;
     expect(thenElement.spreadOperator.lexeme, '...');
     SpreadElement elseElement = second.elseElement;
     expect(elseElement.spreadOperator.lexeme, '...?');
-    MapLiteral2 elseElementExpression = elseElement.expression;
-    expect(elseElementExpression.entries, hasLength(1));
-    MapLiteralEntry entry = elseElementExpression.entries[0];
+    SetOrMapLiteral elseElementExpression = elseElement.expression;
+    expect(elseElementExpression.elements2, hasLength(1));
+    MapLiteralEntry entry = elseElementExpression.elements2[0];
     IntegerLiteral entryValue = entry.value;
     expect(entryValue.value, 6);
   }
 
   void test_mapLiteral_ifFor() {
-    MapLiteral2 map =
+    SetOrMapLiteral map =
         parseCollectionLiteral('{1:1, if (true) for (a in b) 2:4}');
-    expect(map.entries, hasLength(2));
-    MapLiteralEntry first = map.entries[0];
+    expect(map.elements2, hasLength(2));
+    MapLiteralEntry first = map.elements2[0];
     IntegerLiteral firstValue = first.value;
     expect(firstValue.value, 1);
 
-    IfElement second = map.entries[1];
+    IfElement second = map.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
 
@@ -500,13 +500,13 @@
   }
 
   void test_mapLiteral_ifSpread() {
-    MapLiteral2 map = parseCollectionLiteral('{1:1, if (true) ...{2:4}}');
-    expect(map.entries, hasLength(2));
-    MapLiteralEntry first = map.entries[0];
+    SetOrMapLiteral map = parseCollectionLiteral('{1:1, if (true) ...{2:4}}');
+    expect(map.elements2, hasLength(2));
+    MapLiteralEntry first = map.elements2[0];
     IntegerLiteral firstValue = first.value;
     expect(firstValue.value, 1);
 
-    IfElement second = map.entries[1];
+    IfElement second = map.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     SpreadElement thenElement = second.thenElement;
@@ -515,84 +515,85 @@
   }
 
   void test_mapLiteral_spread() {
-    MapLiteral2 map = parseCollectionLiteral('{1: 2, ...{3: 4}}');
+    SetOrMapLiteral map = parseCollectionLiteral('{1: 2, ...{3: 4}}');
     expect(map.constKeyword, isNull);
     expect(map.typeArguments, isNull);
-    expect(map.entries, hasLength(2));
+    expect(map.elements2, hasLength(2));
 
-    SpreadElement element = map.entries[1];
+    SpreadElement element = map.elements2[1];
     expect(element.spreadOperator.lexeme, '...');
-    MapLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.entries, hasLength(1));
+    SetOrMapLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 
   void test_mapLiteral_spread2_typed() {
-    MapLiteral2 map = parseCollectionLiteral('<int, int>{1: 2, ...{3: 4}}');
+    SetOrMapLiteral map = parseCollectionLiteral('<int, int>{1: 2, ...{3: 4}}');
     expect(map.constKeyword, isNull);
     expect(map.typeArguments.arguments, hasLength(2));
-    expect(map.entries, hasLength(2));
+    expect(map.elements2, hasLength(2));
 
-    SpreadElement element = map.entries[1];
+    SpreadElement element = map.elements2[1];
     expect(element.spreadOperator.lexeme, '...');
-    MapLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.entries, hasLength(1));
+    SetOrMapLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 
   void test_mapLiteral_spread_typed() {
-    MapLiteral2 map = parseCollectionLiteral('<int, int>{...{3: 4}}');
+    SetOrMapLiteral map = parseCollectionLiteral('<int, int>{...{3: 4}}');
     expect(map.constKeyword, isNull);
     expect(map.typeArguments.arguments, hasLength(2));
-    expect(map.entries, hasLength(1));
+    expect(map.elements2, hasLength(1));
 
-    SpreadElement element = map.entries[0];
+    SpreadElement element = map.elements2[0];
     expect(element.spreadOperator.lexeme, '...');
-    MapLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.entries, hasLength(1));
+    SetOrMapLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 
   void test_mapLiteral_spreadQ() {
-    MapLiteral2 map = parseCollectionLiteral('{1: 2, ...?{3: 4}}');
+    SetOrMapLiteral map = parseCollectionLiteral('{1: 2, ...?{3: 4}}');
     expect(map.constKeyword, isNull);
     expect(map.typeArguments, isNull);
-    expect(map.entries, hasLength(2));
+    expect(map.elements2, hasLength(2));
 
-    SpreadElement element = map.entries[1];
+    SpreadElement element = map.elements2[1];
     expect(element.spreadOperator.lexeme, '...?');
-    MapLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.entries, hasLength(1));
+    SetOrMapLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 
   void test_mapLiteral_spreadQ2_typed() {
-    MapLiteral2 map = parseCollectionLiteral('<int, int>{1: 2, ...?{3: 4}}');
+    SetOrMapLiteral map =
+        parseCollectionLiteral('<int, int>{1: 2, ...?{3: 4}}');
     expect(map.constKeyword, isNull);
     expect(map.typeArguments.arguments, hasLength(2));
-    expect(map.entries, hasLength(2));
+    expect(map.elements2, hasLength(2));
 
-    SpreadElement element = map.entries[1];
+    SpreadElement element = map.elements2[1];
     expect(element.spreadOperator.lexeme, '...?');
-    MapLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.entries, hasLength(1));
+    SetOrMapLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 
   void test_mapLiteral_spreadQ_typed() {
-    MapLiteral2 map = parseCollectionLiteral('<int, int>{...?{3: 4}}');
+    SetOrMapLiteral map = parseCollectionLiteral('<int, int>{...?{3: 4}}');
     expect(map.constKeyword, isNull);
     expect(map.typeArguments.arguments, hasLength(2));
-    expect(map.entries, hasLength(1));
+    expect(map.elements2, hasLength(1));
 
-    SpreadElement element = map.entries[0];
+    SpreadElement element = map.elements2[0];
     expect(element.spreadOperator.lexeme, '...?');
-    MapLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.entries, hasLength(1));
+    SetOrMapLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 
   void test_setLiteral_if() {
-    SetLiteral2 setLiteral = parseCollectionLiteral('{1, if (true) 2}');
-    expect(setLiteral.elements, hasLength(2));
-    IntegerLiteral first = setLiteral.elements[0];
+    SetOrMapLiteral setLiteral = parseCollectionLiteral('{1, if (true) 2}');
+    expect(setLiteral.elements2, hasLength(2));
+    IntegerLiteral first = setLiteral.elements2[0];
     expect(first.value, 1);
 
-    IfElement second = setLiteral.elements[1];
+    IfElement second = setLiteral.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     IntegerLiteral thenElement = second.thenElement;
@@ -601,12 +602,13 @@
   }
 
   void test_setLiteral_ifElse() {
-    SetLiteral2 setLiteral = parseCollectionLiteral('{1, if (true) 2 else 5}');
-    expect(setLiteral.elements, hasLength(2));
-    IntegerLiteral first = setLiteral.elements[0];
+    SetOrMapLiteral setLiteral =
+        parseCollectionLiteral('{1, if (true) 2 else 5}');
+    expect(setLiteral.elements2, hasLength(2));
+    IntegerLiteral first = setLiteral.elements2[0];
     expect(first.value, 1);
 
-    IfElement second = setLiteral.elements[1];
+    IfElement second = setLiteral.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     IntegerLiteral thenElement = second.thenElement;
@@ -616,32 +618,33 @@
   }
 
   void test_setLiteral_ifElseSpread() {
-    SetLiteral2 setLiteral =
+    SetOrMapLiteral setLiteral =
         parseCollectionLiteral('{1, if (true) ...{2} else ...?[5]}');
-    expect(setLiteral.elements, hasLength(2));
-    IntegerLiteral first = setLiteral.elements[0];
+    expect(setLiteral.elements2, hasLength(2));
+    IntegerLiteral first = setLiteral.elements2[0];
     expect(first.value, 1);
 
-    IfElement second = setLiteral.elements[1];
+    IfElement second = setLiteral.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     SpreadElement thenElement = second.thenElement;
     expect(thenElement.spreadOperator.lexeme, '...');
-    SetLiteral2 theExpression = thenElement.expression;
-    expect(theExpression.elements, hasLength(1));
+    SetOrMapLiteral theExpression = thenElement.expression;
+    expect(theExpression.elements2, hasLength(1));
     SpreadElement elseElement = second.elseElement;
     expect(elseElement.spreadOperator.lexeme, '...?');
-    ListLiteral2 elseExpression = elseElement.expression;
-    expect(elseExpression.elements, hasLength(1));
+    ListLiteral elseExpression = elseElement.expression;
+    expect(elseExpression.elements2, hasLength(1));
   }
 
   void test_setLiteral_ifSpread() {
-    SetLiteral2 setLiteral = parseCollectionLiteral('{1, if (true) ...[2]}');
-    expect(setLiteral.elements, hasLength(2));
-    IntegerLiteral first = setLiteral.elements[0];
+    SetOrMapLiteral setLiteral =
+        parseCollectionLiteral('{1, if (true) ...[2]}');
+    expect(setLiteral.elements2, hasLength(2));
+    IntegerLiteral first = setLiteral.elements2[0];
     expect(first.value, 1);
 
-    IfElement second = setLiteral.elements[1];
+    IfElement second = setLiteral.elements2[1];
     BooleanLiteral condition = second.condition;
     expect(condition.value, isTrue);
     SpreadElement thenElement = second.thenElement;
@@ -650,79 +653,79 @@
   }
 
   void test_setLiteral_spread2() {
-    SetLiteral2 set = parseCollectionLiteral('{3, ...[4]}');
+    SetOrMapLiteral set = parseCollectionLiteral('{3, ...[4]}');
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNull);
-    expect(set.elements, hasLength(2));
-    IntegerLiteral value = set.elements[0];
+    expect(set.elements2, hasLength(2));
+    IntegerLiteral value = set.elements2[0];
     expect(value.value, 3);
 
-    SpreadElement element = set.elements[1];
+    SpreadElement element = set.elements2[1];
     expect(element.spreadOperator.lexeme, '...');
-    ListLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.elements, hasLength(1));
+    ListLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 
   void test_setLiteral_spread2Q() {
-    SetLiteral2 set = parseCollectionLiteral('{3, ...?[4]}');
+    SetOrMapLiteral set = parseCollectionLiteral('{3, ...?[4]}');
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNull);
-    expect(set.elements, hasLength(2));
-    IntegerLiteral value = set.elements[0];
+    expect(set.elements2, hasLength(2));
+    IntegerLiteral value = set.elements2[0];
     expect(value.value, 3);
 
-    SpreadElement element = set.elements[1];
+    SpreadElement element = set.elements2[1];
     expect(element.spreadOperator.lexeme, '...?');
-    ListLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.elements, hasLength(1));
+    ListLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 
   void test_setLiteral_spread_typed() {
-    SetLiteral2 set = parseCollectionLiteral('<int>{...[3]}');
+    SetOrMapLiteral set = parseCollectionLiteral('<int>{...[3]}');
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNotNull);
-    expect(set.elements, hasLength(1));
+    expect(set.elements2, hasLength(1));
 
-    SpreadElement element = set.elements[0];
+    SpreadElement element = set.elements2[0];
     expect(element.spreadOperator.lexeme, '...');
-    ListLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.elements, hasLength(1));
+    ListLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 
   void test_setLiteral_spreadQ_typed() {
-    SetLiteral2 set = parseCollectionLiteral('<int>{...?[3]}');
+    SetOrMapLiteral set = parseCollectionLiteral('<int>{...?[3]}');
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNotNull);
-    expect(set.elements, hasLength(1));
+    expect(set.elements2, hasLength(1));
 
-    SpreadElement element = set.elements[0];
+    SpreadElement element = set.elements2[0];
     expect(element.spreadOperator.lexeme, '...?');
-    ListLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.elements, hasLength(1));
+    ListLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 
   void test_setOrMapLiteral_spread() {
-    MapLiteral2 map = parseCollectionLiteral('{...{3: 4}}');
+    SetOrMapLiteral map = parseCollectionLiteral('{...{3: 4}}');
     expect(map.constKeyword, isNull);
     expect(map.typeArguments, isNull);
-    expect(map.entries, hasLength(1));
+    expect(map.elements2, hasLength(1));
 
-    SpreadElement element = map.entries[0];
+    SpreadElement element = map.elements2[0];
     expect(element.spreadOperator.lexeme, '...');
-    MapLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.entries, hasLength(1));
+    SetOrMapLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 
   void test_setOrMapLiteral_spreadQ() {
-    MapLiteral2 map = parseCollectionLiteral('{...?{3: 4}}');
+    SetOrMapLiteral map = parseCollectionLiteral('{...?{3: 4}}');
     expect(map.constKeyword, isNull);
     expect(map.typeArguments, isNull);
-    expect(map.entries, hasLength(1));
+    expect(map.elements2, hasLength(1));
 
-    SpreadElement element = map.entries[0];
+    SpreadElement element = map.elements2[0];
     expect(element.spreadOperator.lexeme, '...?');
-    MapLiteral2 spreadExpression = element.expression;
-    expect(spreadExpression.entries, hasLength(1));
+    SetOrMapLiteral spreadExpression = element.expression;
+    expect(spreadExpression.elements2, hasLength(1));
   }
 }
 
@@ -743,7 +746,7 @@
     Expression elseExpression = expression.elseExpression;
     expect(elseExpression, isSimpleIdentifier);
     assertErrors(
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 9, 1)]);
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 9, 1)]);
   }
 
   void test_conditionalExpression_precedence_nullableType_as3() {
@@ -759,7 +762,7 @@
     Expression elseExpression = expression.elseExpression;
     expect(elseExpression, isSimpleIdentifier);
     assertErrors(
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 10, 1)]);
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 10, 1)]);
   }
 
   void test_conditionalExpression_precedence_nullableType_is2() {
@@ -774,7 +777,7 @@
     Expression elseExpression = expression.elseExpression;
     expect(elseExpression, isSimpleIdentifier);
     assertErrors(
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 11, 1)]);
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 11, 1)]);
   }
 
   void test_conditionalExpression_precedence_nullableType_is3() {
@@ -790,7 +793,7 @@
     Expression elseExpression = expression.elseExpression;
     expect(elseExpression, isSimpleIdentifier);
     assertErrors(
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 12, 1)]);
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 12, 1)]);
   }
 }
 
@@ -800,6 +803,46 @@
 @reflectiveTest
 class ErrorParserTest_Fasta extends FastaParserTestCase
     with ErrorParserTestMixin {
+  void test_await_missing_async_issue36048() {
+    parseCompilationUnit('''
+main() { // missing async
+  await foo();
+}
+''', errors: [
+      expectedError(CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT, 28, 5)
+    ]);
+  }
+
+  void test_await_missing_async2_issue36048() {
+    parseCompilationUnit('''
+main() { // missing async
+  await foo.bar();
+}
+''', errors: [
+      expectedError(CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT, 28, 5)
+    ]);
+  }
+
+  void test_await_missing_async3_issue36048() {
+    parseCompilationUnit('''
+main() { // missing async
+  (await foo);
+}
+''', errors: [
+      expectedError(CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT, 29, 5)
+    ]);
+  }
+
+  void test_await_missing_async4_issue36048() {
+    parseCompilationUnit('''
+main() { // missing async
+  [await foo];
+}
+''', errors: [
+      expectedError(CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT, 29, 5)
+    ]);
+  }
+
   @override
   void test_expectedListOrMapLiteral() {
     // The fasta parser returns an 'IntegerLiteralImpl' when parsing '1'.
@@ -867,33 +910,29 @@
   void test_listLiteral_spread() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
     ListLiteral list = parseExpression('[1, ...[2]]', errors: [
-      expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 4, 3),
+      expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 4, 3),
     ]);
-    expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    expect(list.elements2, hasLength(1));
+    IntegerLiteral first = list.elements2[0];
     expect(first.value, 1);
-    ListLiteral second = list.elements[1];
-    expect(second.elements, hasLength(1));
   }
 
   void test_listLiteral_spreadQ() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
     ListLiteral list = parseExpression('[1, ...?[2]]', errors: [
-      expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 4, 4),
+      expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 4, 4),
     ]);
-    expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    expect(list.elements2, hasLength(1));
+    IntegerLiteral first = list.elements2[0];
     expect(first.value, 1);
-    ListLiteral second = list.elements[1];
-    expect(second.elements, hasLength(1));
   }
 
   void test_mapLiteral() {
-    MapLiteral map = parseExpression('{3: 6}', parseSetLiterals: true);
+    SetOrMapLiteral map = parseExpression('{3: 6}');
     expect(map.constKeyword, isNull);
     expect(map.typeArguments, isNull);
-    expect(map.entries, hasLength(1));
-    MapLiteralEntry entry = map.entries[0];
+    expect(map.elements2, hasLength(1));
+    MapLiteralEntry entry = map.elements2[0];
     IntegerLiteral key = entry.key;
     expect(key.value, 3);
     IntegerLiteral value = entry.value;
@@ -901,11 +940,11 @@
   }
 
   void test_mapLiteral_const() {
-    MapLiteral map = parseExpression('const {3: 6}', parseSetLiterals: true);
+    SetOrMapLiteral map = parseExpression('const {3: 6}');
     expect(map.constKeyword, isNotNull);
     expect(map.typeArguments, isNull);
-    expect(map.entries, hasLength(1));
-    MapLiteralEntry entry = map.entries[0];
+    expect(map.elements2, hasLength(1));
+    MapLiteralEntry entry = map.elements2[0];
     IntegerLiteral key = entry.key;
     expect(key.value, 3);
     IntegerLiteral value = entry.value;
@@ -913,20 +952,18 @@
   }
 
   void test_mapLiteral_invalid_set_entry() {
-    MapLiteral map =
-        parseExpression('<int, int>{1}', parseSetLiterals: true, errors: [
+    SetOrMapLiteral map = parseExpression('<int, int>{1}', errors: [
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 1),
       expectedError(ParserErrorCode.MISSING_IDENTIFIER, 12, 1),
     ]);
     expect(map.constKeyword, isNull);
     expect(map.typeArguments.arguments, hasLength(2));
-    expect(map.entries, hasLength(1));
+    expect(map.elements2, hasLength(1));
   }
 
   @failingTest
   void test_mapLiteral_invalid_too_many_type_arguments1() {
-    MapLiteral map =
-        parseExpression('<int, int, int>{}', parseSetLiterals: true, errors: [
+    SetOrMapLiteral map = parseExpression('<int, int, int>{}', errors: [
       // TODO(danrubel): Currently the resolver reports invalid number of
       // type arguments, but the parser could report this.
       expectedError(
@@ -936,13 +973,12 @@
           3),
     ]);
     expect(map.constKeyword, isNull);
-    expect(map.entries, hasLength(0));
+    expect(map.elements2, hasLength(0));
   }
 
   @failingTest
   void test_mapLiteral_invalid_too_many_type_arguments2() {
-    MapLiteral map =
-        parseExpression('<int, int, int>{1}', parseSetLiterals: true, errors: [
+    SetOrMapLiteral map = parseExpression('<int, int, int>{1}', errors: [
       // TODO(danrubel): Currently the resolver reports invalid number of
       // type arguments, but the parser could report this.
       expectedError(
@@ -952,67 +988,69 @@
           3),
     ]);
     expect(map.constKeyword, isNull);
-    expect(map.entries, hasLength(0));
+    expect(map.elements2, hasLength(0));
   }
 
   void test_mapLiteral_spread() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
-    MapLiteral map = parseExpression('{1: 2, ...{3: 4}}',
-        parseSetLiterals: true,
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 7, 3)]);
+    SetOrMapLiteral map = parseExpression('{1: 2, ...{3: 4}}', errors: [
+      expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 7, 3),
+    ]);
     expect(map.constKeyword, isNull);
     expect(map.typeArguments, isNull);
-    expect(map.entries, hasLength(1));
+    expect(map.elements2, hasLength(1));
   }
 
   void test_mapLiteral_spread2_typed() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
-    MapLiteral map = parseExpression('<int, int>{1: 2, ...{3: 4}}',
-        parseSetLiterals: true,
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 17, 3)]);
+    SetOrMapLiteral map =
+        parseExpression('<int, int>{1: 2, ...{3: 4}}', errors: [
+      expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 17, 3),
+    ]);
     expect(map.constKeyword, isNull);
     expect(map.typeArguments.arguments, hasLength(2));
-    expect(map.entries, hasLength(1));
+    expect(map.elements2, hasLength(1));
   }
 
   void test_mapLiteral_spread_typed() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
-    MapLiteral map = parseExpression('<int, int>{...{3: 4}}',
-        parseSetLiterals: true,
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 11, 3)]);
+    SetOrMapLiteral map = parseExpression('<int, int>{...{3: 4}}', errors: [
+      expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 11, 3),
+    ]);
     expect(map.constKeyword, isNull);
     expect(map.typeArguments.arguments, hasLength(2));
-    expect(map.entries, hasLength(0));
+    expect(map.elements2, hasLength(0));
   }
 
   void test_mapLiteral_spreadQ() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
-    MapLiteral map = parseExpression('{1: 2, ...?{3: 4}}',
-        parseSetLiterals: true,
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 7, 4)]);
+    SetOrMapLiteral map = parseExpression('{1: 2, ...?{3: 4}}', errors: [
+      expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 7, 4),
+    ]);
     expect(map.constKeyword, isNull);
     expect(map.typeArguments, isNull);
-    expect(map.entries, hasLength(1));
+    expect(map.elements2, hasLength(1));
   }
 
   void test_mapLiteral_spreadQ2_typed() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
-    MapLiteral map = parseExpression('<int, int>{1: 2, ...?{3: 4}}',
-        parseSetLiterals: true,
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 17, 4)]);
+    SetOrMapLiteral map =
+        parseExpression('<int, int>{1: 2, ...?{3: 4}}', errors: [
+      expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 17, 4),
+    ]);
     expect(map.constKeyword, isNull);
     expect(map.typeArguments.arguments, hasLength(2));
-    expect(map.entries, hasLength(1));
+    expect(map.elements2, hasLength(1));
   }
 
   void test_mapLiteral_spreadQ_typed() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
-    MapLiteral map = parseExpression('<int, int>{...?{3: 4}}',
-        parseSetLiterals: true,
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 11, 4)]);
+    SetOrMapLiteral map = parseExpression('<int, int>{...?{3: 4}}', errors: [
+      expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 11, 4),
+    ]);
     expect(map.constKeyword, isNull);
     expect(map.typeArguments.arguments, hasLength(2));
-    expect(map.entries, hasLength(0));
+    expect(map.elements2, hasLength(0));
   }
 
   @override
@@ -1034,50 +1072,49 @@
   }
 
   void test_setLiteral() {
-    SetLiteral set = parseExpression('{3}', parseSetLiterals: true);
+    SetOrMapLiteral set = parseExpression('{3}');
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNull);
-    expect(set.elements, hasLength(1));
-    IntegerLiteral value = set.elements[0];
+    expect(set.elements2, hasLength(1));
+    IntegerLiteral value = set.elements2[0];
     expect(value.value, 3);
   }
 
   void test_setLiteral_const() {
-    SetLiteral set = parseExpression('const {3, 6}', parseSetLiterals: true);
+    SetOrMapLiteral set = parseExpression('const {3, 6}');
     expect(set.constKeyword, isNotNull);
     expect(set.typeArguments, isNull);
-    expect(set.elements, hasLength(2));
-    IntegerLiteral value1 = set.elements[0];
+    expect(set.elements2, hasLength(2));
+    IntegerLiteral value1 = set.elements2[0];
     expect(value1.value, 3);
-    IntegerLiteral value2 = set.elements[1];
+    IntegerLiteral value2 = set.elements2[1];
     expect(value2.value, 6);
   }
 
   void test_setLiteral_const_typed() {
-    SetLiteral set = parseExpression('const <int>{3}', parseSetLiterals: true);
+    SetOrMapLiteral set = parseExpression('const <int>{3}');
     expect(set.constKeyword, isNotNull);
     expect(set.typeArguments.arguments, hasLength(1));
     NamedType typeArg = set.typeArguments.arguments[0];
     expect(typeArg.name.name, 'int');
-    expect(set.elements.length, 1);
-    IntegerLiteral value = set.elements[0];
+    expect(set.elements2.length, 1);
+    IntegerLiteral value = set.elements2[0];
     expect(value.value, 3);
   }
 
   void test_setLiteral_invalid_map_entry() {
-    SetLiteral set =
-        parseExpression('<int>{1: 1}', parseSetLiterals: true, errors: [
-      expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1),
+    SetOrMapLiteral set = parseExpression('<int>{1: 1}', errors: [
+      expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 7, 1),
     ]);
     expect(set.constKeyword, isNull);
     expect(set.typeArguments.arguments, hasLength(1));
     NamedType typeArg = set.typeArguments.arguments[0];
     expect(typeArg.name.name, 'int');
-    expect(set.elements.length, 1);
+    expect(set.elements2.length, 1);
   }
 
   void test_setLiteral_nested_typeArgument() {
-    SetLiteral set = parseExpression('<Set<int>>{{3}}', parseSetLiterals: true);
+    SetOrMapLiteral set = parseExpression('<Set<int>>{{3}}');
     expect(set.constKeyword, isNull);
     expect(set.typeArguments.arguments, hasLength(1));
     NamedType typeArg1 = set.typeArguments.arguments[0];
@@ -1085,94 +1122,80 @@
     expect(typeArg1.typeArguments.arguments, hasLength(1));
     NamedType typeArg2 = typeArg1.typeArguments.arguments[0];
     expect(typeArg2.name.name, 'int');
-    expect(set.elements.length, 1);
-    SetLiteral intSet = set.elements[0];
-    expect(intSet.elements, hasLength(1));
-    IntegerLiteral value = intSet.elements[0];
+    expect(set.elements2.length, 1);
+    SetOrMapLiteral intSet = set.elements2[0];
+    expect(intSet.elements2, hasLength(1));
+    IntegerLiteral value = intSet.elements2[0];
     expect(value.value, 3);
   }
 
   void test_setLiteral_spread2() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
-    SetLiteral set = parseExpression('{3, ...[4]}',
-        parseSetLiterals: true,
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 4, 3)]);
+    SetOrMapLiteral set = parseExpression('{3, ...[4]}',
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 4, 3)]);
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNull);
-    expect(set.elements, hasLength(2));
-    IntegerLiteral value = set.elements[0];
+    expect(set.elements2, hasLength(1));
+    IntegerLiteral value = set.elements2[0];
     expect(value.value, 3);
-    ListLiteral list = set.elements[1];
-    expect(list.elements, hasLength(1));
   }
 
   void test_setLiteral_spread2Q() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
-    SetLiteral set = parseExpression('{3, ...?[4]}',
-        parseSetLiterals: true,
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 4, 4)]);
+    SetOrMapLiteral set = parseExpression('{3, ...?[4]}',
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 4, 4)]);
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNull);
-    expect(set.elements, hasLength(2));
-    IntegerLiteral value = set.elements[0];
+    expect(set.elements2, hasLength(1));
+    IntegerLiteral value = set.elements2[0];
     expect(value.value, 3);
-    ListLiteral list = set.elements[1];
-    expect(list.elements, hasLength(1));
   }
 
   void test_setLiteral_spread_typed() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
-    SetLiteral set = parseExpression('<int>{...[3]}',
-        parseSetLiterals: true,
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 6, 3)]);
+    SetOrMapLiteral set = parseExpression('<int>{...[3]}',
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 6, 3)]);
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNotNull);
-    expect(set.elements, hasLength(1));
-    ListLiteral list = set.elements[0];
-    expect(list.elements, hasLength(1));
+    expect(set.elements2, hasLength(0));
   }
 
   void test_setLiteral_spreadQ_typed() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
-    SetLiteral set = parseExpression('<int>{...?[3]}',
-        parseSetLiterals: true,
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 6, 4)]);
+    SetOrMapLiteral set = parseExpression('<int>{...?[3]}',
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 6, 4)]);
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNotNull);
-    expect(set.elements, hasLength(1));
-    ListLiteral list = set.elements[0];
-    expect(list.elements, hasLength(1));
+    expect(set.elements2, hasLength(0));
   }
 
   void test_setLiteral_typed() {
-    SetLiteral set = parseExpression('<int>{3}', parseSetLiterals: true);
+    SetOrMapLiteral set = parseExpression('<int>{3}');
     expect(set.constKeyword, isNull);
     expect(set.typeArguments.arguments, hasLength(1));
     NamedType typeArg = set.typeArguments.arguments[0];
     expect(typeArg.name.name, 'int');
-    expect(set.elements.length, 1);
-    IntegerLiteral value = set.elements[0];
+    expect(set.elements2.length, 1);
+    IntegerLiteral value = set.elements2[0];
     expect(value.value, 3);
   }
 
   void test_setOrMapLiteral_spread() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
-    MapLiteral set = parseExpression('{...{3: 4}}',
-        parseSetLiterals: true,
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 1, 3)]);
-    expect(set.constKeyword, isNull);
-    expect(set.typeArguments, isNull);
-    expect(set.entries, hasLength(0));
+    SetOrMapLiteral map = parseExpression('{...{3: 4}}',
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 1, 3)]);
+    expect(map.constKeyword, isNull);
+    expect(map.typeArguments, isNull);
+    expect(map.elements2, hasLength(0));
   }
 
   void test_setOrMapLiteral_spreadQ() {
     // TODO(danrubel): Remove this once spread_collections is enabled by default
-    MapLiteral set = parseExpression('{...?{3: 4}}',
-        parseSetLiterals: true,
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 1, 4)]);
-    expect(set.constKeyword, isNull);
-    expect(set.typeArguments, isNull);
-    expect(set.entries, hasLength(0));
+    SetOrMapLiteral map = parseExpression('{...?{3: 4}}',
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 1, 4)]);
+    expect(map.constKeyword, isNull);
+    expect(map.typeArguments, isNull);
+    expect(map.elements2, hasLength(0));
   }
 }
 
@@ -1377,7 +1400,6 @@
     // Run parser
     ErrorReporter errorReporter = new ErrorReporter(listener, source);
     fasta.Parser parser = new fasta.Parser(null);
-    parser.enableSetLiterals = IsEnabledByDefault.set_literals;
     AstBuilder astBuilder = new AstBuilder(errorReporter, source.uri, true);
     parser.listener = astBuilder;
     astBuilder.parser = parser;
@@ -1433,11 +1455,9 @@
       List<ExpectedError> errors,
       int expectedEndOffset,
       bool inAsync = false,
-      bool parseSetLiterals = false,
       bool parseSpreadCollections = false,
       bool parseControlFlowCollections = false}) {
     createParser(source, expectedEndOffset: expectedEndOffset);
-    _parserProxy.fastaParser.enableSetLiterals = parseSetLiterals;
     _parserProxy.astBuilder.enableSpreadCollections = parseSpreadCollections;
     _parserProxy.astBuilder.enableControlFlowCollections =
         parseControlFlowCollections;
@@ -1451,7 +1471,10 @@
 
   @override
   List<Expression> parseExpressionList(String code) {
-    return (_parseExpression('[$code]') as ListLiteral).elements.toList();
+    return (_parseExpression('[$code]') as ListLiteral)
+        .elements2
+        .toList()
+        .cast<Expression>();
   }
 
   @override
@@ -1541,7 +1564,7 @@
   }
 
   @override
-  MapLiteral parseMapLiteral(
+  SetOrMapLiteral parseMapLiteral(
       analyzer.Token token, String typeArgumentsCode, String code) {
     String sc = '';
     if (token != null) {
@@ -1551,13 +1574,13 @@
       sc += typeArgumentsCode;
     }
     sc += code;
-    return parsePrimaryExpression(sc) as MapLiteral;
+    return parsePrimaryExpression(sc) as SetOrMapLiteral;
   }
 
   @override
   MapLiteralEntry parseMapLiteralEntry(String code) {
     var mapLiteral = parseMapLiteral(null, null, '{ $code }');
-    return mapLiteral.entries.single;
+    return mapLiteral.elements2.single;
   }
 
   @override
@@ -1627,7 +1650,6 @@
       bool parseControlFlowCollections = false,
       bool inAsync = false}) {
     createParser(source, expectedEndOffset: expectedEndOffset);
-    _parserProxy.fastaParser.enableSetLiterals = parseSetLiterals;
     _parserProxy.astBuilder.enableSpreadCollections = parseSpreadCollections;
     _parserProxy.astBuilder.enableControlFlowCollections =
         parseControlFlowCollections;
@@ -1710,10 +1732,7 @@
 class NNBDParserTest_Fasta extends FastaParserTestCase {
   CompilationUnit parseNNBDCompilationUnit(String code,
       {List<ExpectedError> errors}) {
-    createParser('''
-@pragma('analyzer:non-nullable') library nnbd.parser.test;
-$code
-''');
+    createParser(code);
     _parserProxy.astBuilder.enableNonNullable = true;
     CompilationUnit unit = _parserProxy.parseCompilationUnit2();
     assertErrors(errors: errors);
@@ -1752,9 +1771,9 @@
   void test_conditional_error() {
     parseNNBDCompilationUnit('D? foo(X? x) { X ? ? x2 = x + bar(7) : y; }',
         errors: [
-          expectedError(ParserErrorCode.MISSING_IDENTIFIER, 78, 1),
-          expectedError(ParserErrorCode.EXPECTED_TOKEN, 99, 1),
-          expectedError(ParserErrorCode.MISSING_IDENTIFIER, 99, 1),
+          expectedError(ParserErrorCode.MISSING_IDENTIFIER, 19, 1),
+          expectedError(ParserErrorCode.EXPECTED_TOKEN, 40, 1),
+          expectedError(ParserErrorCode.MISSING_IDENTIFIER, 40, 1),
         ]);
   }
 
@@ -1764,7 +1783,7 @@
 
   void test_enableNonNullable_false() {
     parseCompilationUnit('main() { x is String? ? (x + y) : z; }',
-        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 20, 1)]);
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 20, 1)]);
   }
 
   void test_for() {
@@ -1841,31 +1860,144 @@
     expect(elseExpression, isSimpleIdentifier);
   }
 
-  void test_pragma_missing() {
-    createParser("library foo;");
-    _parserProxy.astBuilder.enableNonNullable = true;
-    CompilationUnitImpl unit = _parserProxy.parseCompilationUnit2();
-    expect(unit.hasPragmaAnalyzerNonNullable, false);
+  void test_nullCheck() {
+    var unit = parseNNBDCompilationUnit('f(int? y) { var x = y!; }');
+    FunctionDeclaration function = unit.declarations[0];
+    BlockFunctionBody body = function.functionExpression.body;
+    VariableDeclarationStatement statement = body.block.statements[0];
+    PostfixExpression expression = statement.variables.variables[0].initializer;
+    SimpleIdentifier identifier = expression.operand;
+    expect(identifier.name, 'y');
+    expect(expression.operator.lexeme, '!');
   }
 
-  void test_pragma_non_nullable() {
-    createParser("@pragma('analyzer:non-nullable') library foo;");
-    _parserProxy.astBuilder.enableNonNullable = true;
-    CompilationUnitImpl unit = _parserProxy.parseCompilationUnit2();
-    expect(unit.hasPragmaAnalyzerNonNullable, true);
+  void test_nullCheck_disabled() {
+    // TODO(danrubel): remove this once NNBD is enabled by default
+    var unit = parseCompilationUnit('f(int? y) { var x = y!; }', errors: [
+      expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 5, 1),
+      expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 21, 1),
+    ]);
+    FunctionDeclaration function = unit.declarations[0];
+    BlockFunctionBody body = function.functionExpression.body;
+    VariableDeclarationStatement statement = body.block.statements[0];
+    SimpleIdentifier identifier = statement.variables.variables[0].initializer;
+    expect(identifier.name, 'y');
   }
 
-  void test_pragma_non_nullable_not_enabled() {
-    createParser("@pragma('analyzer:non-nullable') library foo;");
-    CompilationUnitImpl unit = _parserProxy.parseCompilationUnit2();
-    expect(unit.hasPragmaAnalyzerNonNullable, false);
+  void test_nullCheckFunctionResult() {
+    parseNNBDCompilationUnit('f() { var x = g()! + 7; }');
   }
 
-  void test_pragma_other() {
-    createParser("@pragma('analyzer:foo') library foo;");
-    _parserProxy.astBuilder.enableNonNullable = true;
-    CompilationUnitImpl unit = _parserProxy.parseCompilationUnit2();
-    expect(unit.hasPragmaAnalyzerNonNullable, false);
+  void test_nullCheckIndexedValue() {
+    parseNNBDCompilationUnit('f(int? y) { var x = y[0]! + 7; }');
+  }
+
+  void test_nullCheckIndexedValue2() {
+    parseNNBDCompilationUnit('f(int? y) { var x = super.y[0]! + 7; }');
+  }
+
+  void test_nullCheckInExpression() {
+    parseNNBDCompilationUnit('f(int? y) { var x = y! + 7; }');
+  }
+
+  void test_nullCheckInExpression_disabled() {
+    // TODO(danrubel): remove this once NNBD is enabled by default
+    parseCompilationUnit('f(int? y) { var x = y! + 7; }', errors: [
+      expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 5, 1),
+      expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 21, 1),
+    ]);
+  }
+
+  void test_nullCheckMethodResult() {
+    parseNNBDCompilationUnit('f() { var x = g.m()! + 7; }');
+  }
+
+  void test_nullCheckMethodResult2() {
+    parseNNBDCompilationUnit('f() { var x = g?.m()! + 7; }');
+  }
+
+  void test_nullCheckMethodResult3() {
+    parseNNBDCompilationUnit('f() { var x = super.m()! + 7; }');
+  }
+
+  void test_nullCheckOnConstConstructor() {
+    parseNNBDCompilationUnit('f() { var x = const Foo()!; }');
+  }
+
+  void test_nullCheckOnConstructor() {
+    parseNNBDCompilationUnit('f() { var x = new Foo()!; }');
+  }
+
+  void test_nullCheckOnLiteral_disabled() {
+    // TODO(danrubel): remove this once NNBD is enabled by default
+    parseCompilationUnit('f() { var x = 0!; }',
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 15, 1)]);
+  }
+
+  void test_nullCheckOnLiteralDouble() {
+    // Issues like this should be caught during later analysis
+    parseNNBDCompilationUnit('f() { var x = 1.2!; }');
+  }
+
+  void test_nullCheckOnLiteralInt() {
+    // Issues like this should be caught during later analysis
+    parseNNBDCompilationUnit('f() { var x = 0!; }');
+  }
+
+  void test_nullCheckOnLiteralList() {
+    // Issues like this should be caught during later analysis
+    parseNNBDCompilationUnit('f() { var x = [1,2]!; }');
+  }
+
+  void test_nullCheckOnLiteralMap() {
+    // Issues like this should be caught during later analysis
+    parseNNBDCompilationUnit('f() { var x = {1:2}!; }');
+  }
+
+  void test_nullCheckOnLiteralSet() {
+    // Issues like this should be caught during later analysis
+    parseNNBDCompilationUnit('f() { var x = {1,2}!; }');
+  }
+
+  void test_nullCheckOnLiteralString() {
+    // Issues like this should be caught during later analysis
+    parseNNBDCompilationUnit('f() { var x = "seven"!; }');
+  }
+
+  void test_nullCheckOnNull() {
+    // Issues like this should be caught during later analysis
+    parseNNBDCompilationUnit('f() { var x = null!; }');
+  }
+
+  void test_nullCheckOnSymbol() {
+    // Issues like this should be caught during later analysis
+    parseNNBDCompilationUnit('f() { var x = #seven!; }');
+  }
+
+  void test_nullCheckOnValue() {
+    parseNNBDCompilationUnit('f(Point p) { var x = p.y! + 7; }');
+  }
+
+  void test_nullCheckOnValue_disabled() {
+    // TODO(danrubel): remove this once NNBD is enabled by default
+    parseCompilationUnit('f(Point p) { var x = p.y! + 7; }',
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 24, 1)]);
+  }
+
+  void test_nullCheckParenthesizedExpression() {
+    parseNNBDCompilationUnit('f(int? y) { var x = (y)! + 7; }');
+  }
+
+  void test_nullCheckPropertyAccess() {
+    parseNNBDCompilationUnit('f() { var x = g.p! + 7; }');
+  }
+
+  void test_nullCheckPropertyAccess2() {
+    parseNNBDCompilationUnit('f() { var x = g?.p! + 7; }');
+  }
+
+  void test_nullCheckPropertyAccess3() {
+    parseNNBDCompilationUnit('f() { var x = super.p! + 7; }');
   }
 }
 
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index faf4a1c..2dc3f7a 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -204,7 +204,7 @@
 
   Expression parseLogicalOrExpression(String code);
 
-  MapLiteral parseMapLiteral(
+  SetOrMapLiteral parseMapLiteral(
       Token token, String typeArgumentsCode, String code);
 
   MapLiteralEntry parseMapLiteralEntry(String code);
@@ -3938,6 +3938,16 @@
     );
   }
 
+  void test_invalidInterpolation_missingClosingBrace_issue35900() {
+    parseCompilationUnit(r"main () { print('${x' '); }", errors: [
+      expectedError(ScannerErrorCode.EXPECTED_TOKEN, 23, 1),
+      expectedError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 26, 1),
+      expectedError(ParserErrorCode.EXPECTED_TOKEN, 20, 3),
+      expectedError(ParserErrorCode.EXPECTED_STRING_LITERAL, 23, 1),
+      expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 27, 0),
+    ]);
+  }
+
   void test_invalidInterpolationIdentifier_startWithDigit() {
     StringLiteral literal = parseExpression("'\$1'", errors: [
       usingFastaParser
@@ -6268,7 +6278,7 @@
     expect(literal.constKeyword, isNotNull);
     expect(literal.typeArguments, isNotNull);
     expect(literal.leftBracket, isNotNull);
-    expect(literal.elements, hasLength(0));
+    expect(literal.elements2, hasLength(0));
     expect(literal.rightBracket, isNotNull);
   }
 
@@ -6280,7 +6290,7 @@
     expect(literal.constKeyword, isNotNull);
     expect(literal.typeArguments, isNull);
     expect(literal.leftBracket, isNotNull);
-    expect(literal.elements, hasLength(0));
+    expect(literal.elements2, hasLength(0));
     expect(literal.rightBracket, isNotNull);
   }
 
@@ -6288,9 +6298,9 @@
     Expression expression = parseConstExpression('const <A, B> {}');
     expect(expression, isNotNull);
     assertNoErrors();
-    var literal = expression as MapLiteral;
+    var literal = expression as SetOrMapLiteral;
     expect(literal.leftBracket, isNotNull);
-    expect(literal.entries, hasLength(0));
+    expect(literal.elements2, hasLength(0));
     expect(literal.rightBracket, isNotNull);
     expect(literal.typeArguments, isNotNull);
   }
@@ -6299,9 +6309,9 @@
     Expression expression = parseExpression('const <A, B {}',
         errors: [expectedError(ParserErrorCode.EXPECTED_TOKEN, 10, 1)]);
     expect(expression, isNotNull);
-    var literal = expression as MapLiteral;
+    var literal = expression as SetOrMapLiteral;
     expect(literal.leftBracket, isNotNull);
-    expect(literal.entries, hasLength(0));
+    expect(literal.elements2, hasLength(0));
     expect(literal.rightBracket, isNotNull);
     expect(literal.typeArguments, isNotNull);
   }
@@ -6310,9 +6320,9 @@
     Expression expression = parseConstExpression('const {}');
     expect(expression, isNotNull);
     assertNoErrors();
-    var literal = expression as MapLiteral;
+    var literal = expression as SetOrMapLiteral;
     expect(literal.leftBracket, isNotNull);
-    expect(literal.entries, hasLength(0));
+    expect(literal.elements2, hasLength(0));
     expect(literal.rightBracket, isNotNull);
     expect(literal.typeArguments, isNull);
   }
@@ -6803,7 +6813,7 @@
     expect(literal.constKeyword.keyword, Keyword.CONST);
     expect(literal.typeArguments, isNull);
     expect(literal.leftBracket, isNotNull);
-    expect(literal.elements, hasLength(0));
+    expect(literal.elements2, hasLength(0));
     expect(literal.rightBracket, isNotNull);
   }
 
@@ -6816,7 +6826,7 @@
     Token leftBracket = literal.leftBracket;
     expect(leftBracket, isNotNull);
     expect(leftBracket.precedingComments, isNotNull);
-    expect(literal.elements, hasLength(0));
+    expect(literal.elements2, hasLength(0));
     expect(literal.rightBracket, isNotNull);
   }
 
@@ -6828,7 +6838,7 @@
     expect(literal.constKeyword.keyword, Keyword.CONST);
     expect(literal.typeArguments, isNull);
     expect(literal.leftBracket, isNotNull);
-    expect(literal.elements, hasLength(0));
+    expect(literal.elements2, hasLength(0));
     expect(literal.rightBracket, isNotNull);
   }
 
@@ -6839,7 +6849,7 @@
     expect(literal.constKeyword, isNull);
     expect(literal.typeArguments, isNull);
     expect(literal.leftBracket, isNotNull);
-    expect(literal.elements, hasLength(3));
+    expect(literal.elements2, hasLength(3));
     expect(literal.rightBracket, isNotNull);
   }
 
@@ -6850,7 +6860,7 @@
     expect(literal.constKeyword, isNull);
     expect(literal.typeArguments, isNull);
     expect(literal.leftBracket, isNotNull);
-    expect(literal.elements, hasLength(1));
+    expect(literal.elements2, hasLength(1));
     expect(literal.rightBracket, isNotNull);
   }
 
@@ -6861,7 +6871,7 @@
     expect(literal.constKeyword, isNull);
     expect(literal.typeArguments, isNotNull);
     expect(literal.leftBracket, isNotNull);
-    expect(literal.elements, hasLength(1));
+    expect(literal.elements2, hasLength(1));
     expect(literal.rightBracket, isNotNull);
   }
 
@@ -6873,7 +6883,7 @@
     expect(listLiteral.constKeyword, isNull);
     expect(listLiteral.typeArguments, isNull);
     expect(listLiteral.leftBracket, isNotNull);
-    expect(listLiteral.elements, hasLength(1));
+    expect(listLiteral.elements2, hasLength(1));
     expect(listLiteral.rightBracket, isNotNull);
   }
 
@@ -6885,7 +6895,7 @@
     expect(listLiteral.constKeyword, isNull);
     expect(listLiteral.typeArguments, isNotNull);
     expect(listLiteral.leftBracket, isNotNull);
-    expect(listLiteral.elements, hasLength(1));
+    expect(listLiteral.elements2, hasLength(1));
     expect(listLiteral.rightBracket, isNotNull);
   }
 
@@ -6893,11 +6903,11 @@
     TypedLiteral literal = parseListOrMapLiteral(null, "{'1' : 1}");
     expect(literal, isNotNull);
     assertNoErrors();
-    var mapLiteral = literal as MapLiteral;
+    var mapLiteral = literal as SetOrMapLiteral;
     expect(mapLiteral.constKeyword, isNull);
     expect(mapLiteral.typeArguments, isNull);
     expect(mapLiteral.leftBracket, isNotNull);
-    expect(mapLiteral.entries, hasLength(1));
+    expect(mapLiteral.elements2, hasLength(1));
     expect(mapLiteral.rightBracket, isNotNull);
   }
 
@@ -6906,11 +6916,11 @@
         parseListOrMapLiteral(null, "<String, int> {'1' : 1}");
     expect(literal, isNotNull);
     assertNoErrors();
-    var mapLiteral = literal as MapLiteral;
+    var mapLiteral = literal as SetOrMapLiteral;
     expect(mapLiteral.constKeyword, isNull);
     expect(mapLiteral.typeArguments, isNotNull);
     expect(mapLiteral.leftBracket, isNotNull);
-    expect(mapLiteral.entries, hasLength(1));
+    expect(mapLiteral.elements2, hasLength(1));
     expect(mapLiteral.rightBracket, isNotNull);
   }
 
@@ -6938,40 +6948,41 @@
 
   void test_parseMapLiteral_empty() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
-    MapLiteral literal = parseMapLiteral(token, '<String, int>', '{}');
+    SetOrMapLiteral literal = parseMapLiteral(token, '<String, int>', '{}');
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.constKeyword.keyword, Keyword.CONST);
     expect(literal.typeArguments, isNotNull);
     expect(literal.leftBracket, isNotNull);
-    expect(literal.entries, hasLength(0));
+    expect(literal.elements2, hasLength(0));
     expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseMapLiteral_multiple() {
-    MapLiteral literal = parseMapLiteral(null, null, "{'a' : b, 'x' : y}");
+    SetOrMapLiteral literal = parseMapLiteral(null, null, "{'a' : b, 'x' : y}");
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.leftBracket, isNotNull);
-    expect(literal.entries, hasLength(2));
+    expect(literal.elements2, hasLength(2));
     expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseMapLiteral_multiple_trailing_comma() {
-    MapLiteral literal = parseMapLiteral(null, null, "{'a' : b, 'x' : y,}");
+    SetOrMapLiteral literal =
+        parseMapLiteral(null, null, "{'a' : b, 'x' : y,}");
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.leftBracket, isNotNull);
-    expect(literal.entries, hasLength(2));
+    expect(literal.elements2, hasLength(2));
     expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseMapLiteral_single() {
-    MapLiteral literal = parseMapLiteral(null, null, "{'x' : y}");
+    SetOrMapLiteral literal = parseMapLiteral(null, null, "{'x' : y}");
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.leftBracket, isNotNull);
-    expect(literal.entries, hasLength(1));
+    expect(literal.elements2, hasLength(1));
     expect(literal.rightBracket, isNotNull);
   }
 
@@ -7255,7 +7266,7 @@
     Expression expression = parsePrimaryExpression('{}');
     expect(expression, isNotNull);
     assertNoErrors();
-    var literal = expression as MapLiteral;
+    var literal = expression as SetOrMapLiteral;
     expect(literal.typeArguments, isNull);
     expect(literal, isNotNull);
   }
@@ -7264,7 +7275,7 @@
     Expression expression = parsePrimaryExpression('<A, B>{}');
     expect(expression, isNotNull);
     assertNoErrors();
-    var literal = expression as MapLiteral;
+    var literal = expression as SetOrMapLiteral;
     expect(literal.typeArguments, isNotNull);
     expect(literal.typeArguments.arguments, hasLength(2));
   }
@@ -9543,7 +9554,10 @@
   List<Expression> parseExpressionList(String code) {
     if (usingFastaParser) {
       createParser('[$code]');
-      return (parser.parseExpression2() as ListLiteral).elements.toList();
+      return (parser.parseExpression2() as ListLiteral)
+          .elements2
+          .toList()
+          .cast<Expression>();
     } else {
       createParser(code);
       return parser.parseExpressionList();
@@ -9679,7 +9693,7 @@
   }
 
   @override
-  MapLiteral parseMapLiteral(
+  SetOrMapLiteral parseMapLiteral(
       Token token, String typeArgumentsCode, String code) {
     if (usingFastaParser) {
       String sc = '';
@@ -9691,7 +9705,7 @@
       }
       sc += code;
       createParser(sc);
-      return parser.parseExpression2() as MapLiteral;
+      return parser.parseExpression2() as SetOrMapLiteral;
     } else {
       TypeArgumentList typeArguments;
       if (typeArgumentsCode != null) {
@@ -9707,7 +9721,7 @@
   MapLiteralEntry parseMapLiteralEntry(String code) {
     if (usingFastaParser) {
       var mapLiteral = parseMapLiteral(null, null, '{ $code }');
-      return mapLiteral.entries.single;
+      return mapLiteral.elements2.single;
     } else {
       createParser(code);
       return parser.parseMapLiteralEntry();
@@ -10862,17 +10876,18 @@
   void test_incompleteForEach() {
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
-    ForStatement statement = parseStatement('for (String item i) {}');
+    ForStatement2 statement = parseStatement('for (String item i) {}');
     listener.assertErrors([
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 4),
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 17, 1)
     ]);
     expect(statement, isForStatement);
     expect(statement.toSource(), 'for (String item; i;) {}');
-    expect(statement.leftSeparator, isNotNull);
-    expect(statement.leftSeparator.type, TokenType.SEMICOLON);
-    expect(statement.rightSeparator, isNotNull);
-    expect(statement.rightSeparator.type, TokenType.SEMICOLON);
+    var forParts = statement.forLoopParts as ForParts;
+    expect(forParts.leftSeparator, isNotNull);
+    expect(forParts.leftSeparator.type, TokenType.SEMICOLON);
+    expect(forParts.rightSeparator, isNotNull);
+    expect(forParts.rightSeparator.type, TokenType.SEMICOLON);
   }
 
   void test_incompleteLocalVariable_atTheEndOfBlock() {
@@ -11130,6 +11145,7 @@
     MethodDeclaration method = declaration.members[0];
     expect(method.name.name, 'C');
     expect(method.isGetter, isTrue);
+    expect(method.parameters, isNull);
   }
 
   void test_issue_34610_initializers() {
@@ -11161,6 +11177,30 @@
   }
 
   void test_issue_34610_missing_param() {
+    final unit = parseCompilationUnit('class C { C => null; }',
+        errors: usingFastaParser
+            ? [expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 10, 1)]
+            : [
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 18, 2),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 18, 2),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 18, 2),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 21, 4),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 21, 4),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 25, 1),
+              ]);
+    ClassDeclaration declaration = unit.declarations[0];
+    if (usingFastaParser) {
+      ConstructorDeclaration constructor = declaration.members[0];
+      expect(constructor.name, isNull);
+      expect(constructor.parameters, isNotNull);
+      expect(constructor.parameters.parameters, hasLength(0));
+    } else {
+      FieldDeclaration field = declaration.members[0];
+      expect(field.fields.type.toSource(), 'C');
+    }
+  }
+
+  void test_issue_34610_named_missing_param() {
     final unit = parseCompilationUnit('class C { C.named => null; }',
         errors: usingFastaParser
             ? [expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 10, 1)]
@@ -11184,6 +11224,38 @@
     }
   }
 
+  void test_issue_34610_set() {
+    final unit = parseCompilationUnit('class C { set C.named => null; }',
+        errors: usingFastaParser
+            ? [
+                expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 14, 1),
+                expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 15, 1),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 15, 1),
+                expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 16, 5),
+              ]
+            : [
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 15, 1),
+                expectedError(ParserErrorCode.MISSING_IDENTIFIER, 15, 1),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 15, 1),
+                expectedError(
+                    ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, 15, 1),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 15, 1),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 15, 1),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 22, 2),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 22, 2),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 22, 2),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 25, 4),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 25, 4),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 29, 1),
+              ]);
+    ClassDeclaration declaration = unit.declarations[0];
+    MethodDeclaration method = declaration.members[0];
+    expect(method.name.name, 'C');
+    expect(method.isSetter, isTrue);
+    expect(method.parameters, isNotNull);
+    expect(method.parameters.parameters, hasLength(usingFastaParser ? 0 : 1));
+  }
+
   void test_keywordInPlaceOfIdentifier() {
     // TODO(brianwilkerson) We could do better with this.
     parseCompilationUnit("do() {}",
@@ -14576,15 +14648,15 @@
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
     String code = 'await for (element in list) {}';
-    var forStatement = _parseAsyncStatement(code) as ForEachStatement;
+    var forStatement = _parseAsyncStatement(code) as ForStatement2;
     assertNoErrors();
-    expect(forStatement.awaitKeyword, isNotNull);
+    expect(forStatement.awaitKeyword, usingFastaParser ? isNotNull : isNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    expect(forStatement.loopVariable, isNull);
-    expect(forStatement.identifier, isNotNull);
-    expect(forStatement.inKeyword, isNotNull);
-    expect(forStatement.iterable, isNotNull);
+    var forEachParts = forStatement.forLoopParts as ForEachPartsWithIdentifier;
+    expect(forEachParts.identifier, isNotNull);
+    expect(forEachParts.inKeyword, isNotNull);
+    expect(forEachParts.iterable, isNotNull);
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14594,15 +14666,15 @@
     // entry parsing is enabled by default
     var forStatement =
         parseStatement('for (void Function<T>(T) element in list) {}')
-            as ForEachStatement;
+            as ForStatement2;
     assertNoErrors();
     expect(forStatement.awaitKeyword, isNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    expect(forStatement.loopVariable, isNotNull);
-    expect(forStatement.identifier, isNull);
-    expect(forStatement.inKeyword, isNotNull);
-    expect(forStatement.iterable, isNotNull);
+    var forEachParts = forStatement.forLoopParts as ForEachPartsWithDeclaration;
+    expect(forEachParts.loopVariable, isNotNull);
+    expect(forEachParts.inKeyword, isNotNull);
+    expect(forEachParts.iterable, isNotNull);
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14611,15 +14683,15 @@
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
     var forStatement =
-        parseStatement('for (element in list) {}') as ForEachStatement;
+        parseStatement('for (element in list) {}') as ForStatement2;
     assertNoErrors();
     expect(forStatement.awaitKeyword, isNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    expect(forStatement.loopVariable, isNull);
-    expect(forStatement.identifier, isNotNull);
-    expect(forStatement.inKeyword, isNotNull);
-    expect(forStatement.iterable, isNotNull);
+    var forEachParts = forStatement.forLoopParts as ForEachPartsWithIdentifier;
+    expect(forEachParts.identifier, isNotNull);
+    expect(forEachParts.inKeyword, isNotNull);
+    expect(forEachParts.iterable, isNotNull);
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14628,16 +14700,16 @@
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
     var forStatement =
-        parseStatement('for (@A var element in list) {}') as ForEachStatement;
+        parseStatement('for (@A var element in list) {}') as ForStatement2;
     assertNoErrors();
     expect(forStatement.awaitKeyword, isNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    expect(forStatement.loopVariable, isNotNull);
-    expect(forStatement.loopVariable.metadata, hasLength(1));
-    expect(forStatement.identifier, isNull);
-    expect(forStatement.inKeyword, isNotNull);
-    expect(forStatement.iterable, isNotNull);
+    var forEachParts = forStatement.forLoopParts as ForEachPartsWithDeclaration;
+    expect(forEachParts.loopVariable, isNotNull);
+    expect(forEachParts.loopVariable.metadata, hasLength(1));
+    expect(forEachParts.inKeyword, isNotNull);
+    expect(forEachParts.iterable, isNotNull);
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14646,15 +14718,15 @@
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
     var forStatement =
-        parseStatement('for (A element in list) {}') as ForEachStatement;
+        parseStatement('for (A element in list) {}') as ForStatement2;
     assertNoErrors();
     expect(forStatement.awaitKeyword, isNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    expect(forStatement.loopVariable, isNotNull);
-    expect(forStatement.identifier, isNull);
-    expect(forStatement.inKeyword, isNotNull);
-    expect(forStatement.iterable, isNotNull);
+    var forEachParts = forStatement.forLoopParts as ForEachPartsWithDeclaration;
+    expect(forEachParts.loopVariable, isNotNull);
+    expect(forEachParts.inKeyword, isNotNull);
+    expect(forEachParts.iterable, isNotNull);
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14663,15 +14735,15 @@
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
     var forStatement =
-        parseStatement('for (var element in list) {}') as ForEachStatement;
+        parseStatement('for (var element in list) {}') as ForStatement2;
     assertNoErrors();
     expect(forStatement.awaitKeyword, isNull);
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    expect(forStatement.loopVariable, isNotNull);
-    expect(forStatement.identifier, isNull);
-    expect(forStatement.inKeyword, isNotNull);
-    expect(forStatement.iterable, isNotNull);
+    var forEachParts = forStatement.forLoopParts as ForEachPartsWithDeclaration;
+    expect(forEachParts.loopVariable, isNotNull);
+    expect(forEachParts.inKeyword, isNotNull);
+    expect(forEachParts.iterable, isNotNull);
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14679,16 +14751,16 @@
   void test_parseForStatement_loop_c() {
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
-    var forStatement = parseStatement('for (; i < count;) {}') as ForStatement;
+    var forStatement = parseStatement('for (; i < count;) {}') as ForStatement2;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    expect(forStatement.variables, isNull);
-    expect(forStatement.initialization, isNull);
-    expect(forStatement.leftSeparator, isNotNull);
-    expect(forStatement.condition, isNotNull);
-    expect(forStatement.rightSeparator, isNotNull);
-    expect(forStatement.updaters, hasLength(0));
+    var forParts = forStatement.forLoopParts as ForPartsWithExpression;
+    expect(forParts.initialization, isNull);
+    expect(forParts.leftSeparator, isNotNull);
+    expect(forParts.condition, isNotNull);
+    expect(forParts.rightSeparator, isNotNull);
+    expect(forParts.updaters, hasLength(0));
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14697,16 +14769,16 @@
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
     var forStatement =
-        parseStatement('for (; i < count; i++) {}') as ForStatement;
+        parseStatement('for (; i < count; i++) {}') as ForStatement2;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    expect(forStatement.variables, isNull);
-    expect(forStatement.initialization, isNull);
-    expect(forStatement.leftSeparator, isNotNull);
-    expect(forStatement.condition, isNotNull);
-    expect(forStatement.rightSeparator, isNotNull);
-    expect(forStatement.updaters, hasLength(1));
+    var forParts = forStatement.forLoopParts as ForPartsWithExpression;
+    expect(forParts.initialization, isNull);
+    expect(forParts.leftSeparator, isNotNull);
+    expect(forParts.condition, isNotNull);
+    expect(forParts.rightSeparator, isNotNull);
+    expect(forParts.updaters, hasLength(1));
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14715,16 +14787,16 @@
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
     var forStatement =
-        parseStatement('for (i--; i < count; i++) {}') as ForStatement;
+        parseStatement('for (i--; i < count; i++) {}') as ForStatement2;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    expect(forStatement.variables, isNull);
-    expect(forStatement.initialization, isNotNull);
-    expect(forStatement.leftSeparator, isNotNull);
-    expect(forStatement.condition, isNotNull);
-    expect(forStatement.rightSeparator, isNotNull);
-    expect(forStatement.updaters, hasLength(1));
+    var forParts = forStatement.forLoopParts as ForPartsWithExpression;
+    expect(forParts.initialization, isNotNull);
+    expect(forParts.leftSeparator, isNotNull);
+    expect(forParts.condition, isNotNull);
+    expect(forParts.rightSeparator, isNotNull);
+    expect(forParts.updaters, hasLength(1));
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14732,19 +14804,19 @@
   void test_parseForStatement_loop_i() {
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
-    var forStatement = parseStatement('for (var i = 0;;) {}') as ForStatement;
+    var forStatement = parseStatement('for (var i = 0;;) {}') as ForStatement2;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    VariableDeclarationList variables = forStatement.variables;
+    var forParts = forStatement.forLoopParts as ForPartsWithDeclarations;
+    VariableDeclarationList variables = forParts.variables;
     expect(variables, isNotNull);
     expect(variables.metadata, hasLength(0));
     expect(variables.variables, hasLength(1));
-    expect(forStatement.initialization, isNull);
-    expect(forStatement.leftSeparator, isNotNull);
-    expect(forStatement.condition, isNull);
-    expect(forStatement.rightSeparator, isNotNull);
-    expect(forStatement.updaters, hasLength(0));
+    expect(forParts.leftSeparator, isNotNull);
+    expect(forParts.condition, isNull);
+    expect(forParts.rightSeparator, isNotNull);
+    expect(forParts.updaters, hasLength(0));
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14753,19 +14825,19 @@
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
     var forStatement =
-        parseStatement('for (@A var i = 0;;) {}') as ForStatement;
+        parseStatement('for (@A var i = 0;;) {}') as ForStatement2;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    VariableDeclarationList variables = forStatement.variables;
+    var forParts = forStatement.forLoopParts as ForPartsWithDeclarations;
+    VariableDeclarationList variables = forParts.variables;
     expect(variables, isNotNull);
     expect(variables.metadata, hasLength(1));
     expect(variables.variables, hasLength(1));
-    expect(forStatement.initialization, isNull);
-    expect(forStatement.leftSeparator, isNotNull);
-    expect(forStatement.condition, isNull);
-    expect(forStatement.rightSeparator, isNotNull);
-    expect(forStatement.updaters, hasLength(0));
+    expect(forParts.leftSeparator, isNotNull);
+    expect(forParts.condition, isNull);
+    expect(forParts.rightSeparator, isNotNull);
+    expect(forParts.updaters, hasLength(0));
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14774,18 +14846,18 @@
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
     var forStatement =
-        parseStatement('for (var i = 0; i < count;) {}') as ForStatement;
+        parseStatement('for (var i = 0; i < count;) {}') as ForStatement2;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    VariableDeclarationList variables = forStatement.variables;
+    var forParts = forStatement.forLoopParts as ForPartsWithDeclarations;
+    VariableDeclarationList variables = forParts.variables;
     expect(variables, isNotNull);
     expect(variables.variables, hasLength(1));
-    expect(forStatement.initialization, isNull);
-    expect(forStatement.leftSeparator, isNotNull);
-    expect(forStatement.condition, isNotNull);
-    expect(forStatement.rightSeparator, isNotNull);
-    expect(forStatement.updaters, hasLength(0));
+    expect(forParts.leftSeparator, isNotNull);
+    expect(forParts.condition, isNotNull);
+    expect(forParts.rightSeparator, isNotNull);
+    expect(forParts.updaters, hasLength(0));
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14794,18 +14866,18 @@
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
     var forStatement =
-        parseStatement('for (var i = 0; i < count; i++) {}') as ForStatement;
+        parseStatement('for (var i = 0; i < count; i++) {}') as ForStatement2;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    VariableDeclarationList variables = forStatement.variables;
+    var forParts = forStatement.forLoopParts as ForPartsWithDeclarations;
+    VariableDeclarationList variables = forParts.variables;
     expect(variables, isNotNull);
     expect(variables.variables, hasLength(1));
-    expect(forStatement.initialization, isNull);
-    expect(forStatement.leftSeparator, isNotNull);
-    expect(forStatement.condition, isNotNull);
-    expect(forStatement.rightSeparator, isNotNull);
-    expect(forStatement.updaters, hasLength(1));
+    expect(forParts.leftSeparator, isNotNull);
+    expect(forParts.condition, isNotNull);
+    expect(forParts.rightSeparator, isNotNull);
+    expect(forParts.updaters, hasLength(1));
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14815,18 +14887,18 @@
     // entry parsing is enabled by default
     var forStatement =
         parseStatement('for (int i = 0, j = count; i < j; i++, j--) {}')
-            as ForStatement;
+            as ForStatement2;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    VariableDeclarationList variables = forStatement.variables;
+    var forParts = forStatement.forLoopParts as ForPartsWithDeclarations;
+    VariableDeclarationList variables = forParts.variables;
     expect(variables, isNotNull);
     expect(variables.variables, hasLength(2));
-    expect(forStatement.initialization, isNull);
-    expect(forStatement.leftSeparator, isNotNull);
-    expect(forStatement.condition, isNotNull);
-    expect(forStatement.rightSeparator, isNotNull);
-    expect(forStatement.updaters, hasLength(2));
+    expect(forParts.leftSeparator, isNotNull);
+    expect(forParts.condition, isNotNull);
+    expect(forParts.rightSeparator, isNotNull);
+    expect(forParts.updaters, hasLength(2));
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14835,18 +14907,18 @@
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
     var forStatement =
-        parseStatement('for (var i = 0;; i++) {}') as ForStatement;
+        parseStatement('for (var i = 0;; i++) {}') as ForStatement2;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    VariableDeclarationList variables = forStatement.variables;
+    var forParts = forStatement.forLoopParts as ForPartsWithDeclarations;
+    VariableDeclarationList variables = forParts.variables;
     expect(variables, isNotNull);
     expect(variables.variables, hasLength(1));
-    expect(forStatement.initialization, isNull);
-    expect(forStatement.leftSeparator, isNotNull);
-    expect(forStatement.condition, isNull);
-    expect(forStatement.rightSeparator, isNotNull);
-    expect(forStatement.updaters, hasLength(1));
+    expect(forParts.leftSeparator, isNotNull);
+    expect(forParts.condition, isNull);
+    expect(forParts.rightSeparator, isNotNull);
+    expect(forParts.updaters, hasLength(1));
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
@@ -14854,16 +14926,16 @@
   void test_parseForStatement_loop_u() {
     // TODO(danrubel): remove this once control flow and spread collection
     // entry parsing is enabled by default
-    var forStatement = parseStatement('for (;; i++) {}') as ForStatement;
+    var forStatement = parseStatement('for (;; i++) {}') as ForStatement2;
     assertNoErrors();
     expect(forStatement.forKeyword, isNotNull);
     expect(forStatement.leftParenthesis, isNotNull);
-    expect(forStatement.variables, isNull);
-    expect(forStatement.initialization, isNull);
-    expect(forStatement.leftSeparator, isNotNull);
-    expect(forStatement.condition, isNull);
-    expect(forStatement.rightSeparator, isNotNull);
-    expect(forStatement.updaters, hasLength(1));
+    var forParts = forStatement.forLoopParts as ForPartsWithExpression;
+    expect(forParts.initialization, isNull);
+    expect(forParts.leftSeparator, isNotNull);
+    expect(forParts.condition, isNull);
+    expect(forParts.rightSeparator, isNotNull);
+    expect(forParts.updaters, hasLength(1));
     expect(forStatement.rightParenthesis, isNotNull);
     expect(forStatement.body, isNotNull);
   }
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index a4d99bb..cc3da4a 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -216,7 +216,7 @@
     expect(break1.target, same(whileStatement));
 
     var break2 = findNode.breakStatement('break loop2;');
-    var forStatement = findNode.forStatement('for (');
+    var forStatement = findNode.forStatement2('for (');
     expect(break2.target, same(forStatement));
   }
 
@@ -245,7 +245,7 @@
 ''');
     await resolveTestFile();
 
-    var forStatement = findNode.forStatement('for (');
+    var forStatement = findNode.forStatement2('for (');
     var breakStatement = findNode.breakStatement('break;');
     expect(breakStatement.target, same(forStatement));
   }
@@ -260,7 +260,7 @@
 ''');
     await resolveTestFile();
 
-    var forStatement = findNode.forEachStatement('for (');
+    var forStatement = findNode.forStatement2('for (');
     var breakStatement = findNode.breakStatement('break;');
     expect(breakStatement.target, same(forStatement));
   }
@@ -353,7 +353,7 @@
     expect(continue1.target, same(whileStatement));
 
     var continue2 = findNode.continueStatement('continue loop2');
-    var forStatement = findNode.forStatement('for (');
+    var forStatement = findNode.forStatement2('for (');
     expect(continue2.target, same(forStatement));
   }
 
@@ -382,7 +382,7 @@
 ''');
     await resolveTestFile();
 
-    var forStatement = findNode.forStatement('for (');
+    var forStatement = findNode.forStatement2('for (');
     var continueStatement = findNode.continueStatement('continue;');
     expect(continueStatement.target, same(forStatement));
   }
@@ -397,7 +397,7 @@
 ''');
     await resolveTestFile();
 
-    var forStatement = findNode.forEachStatement('for (');
+    var forStatement = findNode.forStatement2('for (');
     var continueStatement = findNode.continueStatement('continue;');
     expect(continueStatement.target, same(forStatement));
   }
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index c6bafc8..020414b 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
@@ -37,6 +36,7 @@
     defineReflectiveTests(StaticTypeAnalyzerTest);
     defineReflectiveTests(StaticTypeAnalyzer3Test);
     defineReflectiveTests(StaticTypeAnalyzerWithSetLiteralsTest);
+    defineReflectiveTests(StaticTypeAnalyzerWithStrictInferenceTest);
   });
 }
 
@@ -52,9 +52,6 @@
 @reflectiveTest
 class SetLiteralsTest extends StaticTypeAnalyzer2TestShared {
   @override
-  List<String> get enabledExperiments => [EnableString.set_literals];
-
-  @override
   bool get enableNewAnalysisDriver => true;
 
   test_emptySetLiteral_parameter_typed() async {
@@ -1180,6 +1177,7 @@
 
   void test_visitMapLiteral_empty() {
     // {}
+    // ignore: deprecated_member_use_from_same_package
     Expression node = AstTestFactory.mapLiteral2();
     DartType resultType = _analyze(node);
     _assertType2(
@@ -1191,6 +1189,7 @@
 
   void test_visitMapLiteral_nonEmpty() {
     // {"k" : 0}
+    // ignore: deprecated_member_use_from_same_package
     Expression node = AstTestFactory.mapLiteral2(
         [AstTestFactory.mapLiteralEntry("k", _resolvedInteger(0))]);
     DartType resultType = _analyze(node);
@@ -1664,8 +1663,6 @@
 class StaticTypeAnalyzerWithSetLiteralsTest
     extends StaticTypeAnalyzer2TestShared {
   @override
-  List<String> get enabledExperiments => [EnableString.set_literals];
-
   bool get enableNewAnalysisDriver => true;
 
   test_emptySetLiteral_inferredFromLinkedHashSet() async {
@@ -1687,3 +1684,83 @@
     expectExpressionType('{{}}', 'Set<Set<int>>');
   }
 }
+
+/**
+ * Tests of the static type analyzer with "strict-inference" enabled.
+ */
+@reflectiveTest
+class StaticTypeAnalyzerWithStrictInferenceTest
+    extends StaticTypeAnalyzer2TestShared {
+  @override
+  void setUp() {
+    super.setUp();
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.strictInference = true;
+    resetWith(options: options);
+  }
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_topLevelVariable() async {
+    String code = r'''
+var a;
+''';
+    await resolveTestUnit(code, noErrors: false);
+    await assertErrorsInCode(
+        code, [HintCode.INFERENCE_FAILURE_ON_UNINITIALIZED_VARIABLE]);
+  }
+
+  test_topLevelVariable_withType() async {
+    String code = r'''
+int a;
+dynamic b;
+Object c;
+Null d;
+''';
+    await resolveTestUnit(code, noErrors: false);
+    await assertNoErrorsInCode(code);
+  }
+
+  test_topLevelVariable_withInitializer() async {
+    String code = r'''
+var a = 7;
+''';
+    await resolveTestUnit(code, noErrors: false);
+    await assertNoErrorsInCode(code);
+  }
+
+  test_localVariable() async {
+    String code = r'''
+f() {
+  var a;
+}
+''';
+    await resolveTestUnit(code, noErrors: false);
+    await assertErrorsInCode(
+        code, [HintCode.INFERENCE_FAILURE_ON_UNINITIALIZED_VARIABLE]);
+  }
+
+  test_localVariable_withType() async {
+    String code = r'''
+f() {
+  int a;
+  dynamic b;
+  Object c;
+  Null d;
+}
+''';
+    await resolveTestUnit(code, noErrors: false);
+    await assertNoErrorsInCode(code);
+  }
+
+  test_localVariable_withInitializer() async {
+    String code = r'''
+f() {
+  var a = 7;
+}
+''';
+    await resolveTestUnit(code, noErrors: false);
+    await assertNoErrorsInCode(code);
+  }
+}
diff --git a/pkg/analyzer/test/generated/static_warning_code_driver_test.dart b/pkg/analyzer/test/generated/static_warning_code_driver_test.dart
index ec8e367..2be665c 100644
--- a/pkg/analyzer/test/generated/static_warning_code_driver_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_driver_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -20,9 +19,6 @@
 @reflectiveTest
 class SetElementTypeNotAssignableTest extends ResolverTestCase {
   @override
-  List<String> get enabledExperiments => [EnableString.set_literals];
-
-  @override
   bool get enableNewAnalysisDriver => true;
 
   test_setElementTypeNotAssignable() async {
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index 53664c9..1aab715 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:test/test.dart';
@@ -21,9 +20,6 @@
 @reflectiveTest
 class EqualValuesInConstSetTest extends ResolverTestCase {
   @override
-  List<String> get enabledExperiments => [EnableString.set_literals];
-
-  @override
   bool get enableNewAnalysisDriver => true;
 
   test_simpleValues() async {
diff --git a/pkg/analyzer/test/generated/strong_mode.dart b/pkg/analyzer/test/generated/strong_mode.dart
index d5d561b..f327129 100644
--- a/pkg/analyzer/test/generated/strong_mode.dart
+++ b/pkg/analyzer/test/generated/strong_mode.dart
@@ -1753,13 +1753,16 @@
     assertMapOfIntToListOfInt(
         resolutionMap.elementDeclaredByMethodDeclaration(mapC).returnType);
 
-    MapLiteral mapLiteralB = mapB.initializer;
-    MapLiteral mapLiteralC = (mapC.body as ExpressionFunctionBody).expression;
+    SetOrMapLiteral mapLiteralB = mapB.initializer;
+    SetOrMapLiteral mapLiteralC =
+        (mapC.body as ExpressionFunctionBody).expression;
     assertMapOfIntToListOfInt(mapLiteralB.staticType);
     assertMapOfIntToListOfInt(mapLiteralC.staticType);
 
-    ListLiteral listLiteralB = mapLiteralB.entries[0].value;
-    ListLiteral listLiteralC = mapLiteralC.entries[0].value;
+    ListLiteral listLiteralB =
+        (mapLiteralB.elements2[0] as MapLiteralEntry).value;
+    ListLiteral listLiteralC =
+        (mapLiteralC.elements2[0] as MapLiteralEntry).value;
     assertListOfInt(listLiteralB.staticType);
     assertListOfInt(listLiteralC.staticType);
   }
@@ -2010,9 +2013,9 @@
     assertListOfListOfInt(literal(2).staticType);
     assertListOfListOfInt(literal(3).staticType);
 
-    assertListOfInt(literal(1).elements[0].staticType);
-    assertListOfInt(literal(2).elements[0].staticType);
-    assertListOfInt(literal(3).elements[0].staticType);
+    assertListOfInt((literal(1).elements2[0] as Expression).staticType);
+    assertListOfInt((literal(2).elements2[0] as Expression).staticType);
+    assertListOfInt((literal(3).elements2[0] as Expression).staticType);
   }
 
   test_listLiteral_simple() async {
@@ -2134,10 +2137,10 @@
     CompilationUnit unit = await resolveSource(code);
     List<Statement> statements =
         AstFinder.getStatementsInTopLevelFunction(unit, "main");
-    MapLiteral literal(int i) {
+    SetOrMapLiteral literal(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
-      MapLiteral exp = decl.initializer;
+      SetOrMapLiteral exp = decl.initializer;
       return exp;
     }
 
@@ -2151,10 +2154,14 @@
     assertMapOfIntToListOfString(literal(3).staticType);
     assertMapOfIntToListOfString(literal(4).staticType);
 
-    assertListOfString(literal(1).entries[0].value.staticType);
-    assertListOfString(literal(2).entries[0].value.staticType);
-    assertListOfString(literal(3).entries[0].value.staticType);
-    assertListOfString(literal(4).entries[0].value.staticType);
+    assertListOfString(
+        (literal(1).elements2[0] as MapLiteralEntry).value.staticType);
+    assertListOfString(
+        (literal(2).elements2[0] as MapLiteralEntry).value.staticType);
+    assertListOfString(
+        (literal(3).elements2[0] as MapLiteralEntry).value.staticType);
+    assertListOfString(
+        (literal(4).elements2[0] as MapLiteralEntry).value.staticType);
   }
 
   test_mapLiteral_simple() async {
@@ -2173,7 +2180,7 @@
     DartType literal(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
-      MapLiteral exp = decl.initializer;
+      SetOrMapLiteral exp = decl.initializer;
       return exp.staticType;
     }
 
@@ -2201,7 +2208,7 @@
     DartType literal(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
-      MapLiteral exp = decl.initializer;
+      SetOrMapLiteral exp = decl.initializer;
       return exp.staticType;
     }
 
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index 5215932..6f3ca73 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -9,13 +9,13 @@
     as checked_mode_compile_time_error_code_driver_test;
 import 'compile_time_error_code_driver_test.dart'
     as compile_time_error_code_driver_test;
-import 'constant_test.dart'
-    as constant_test; // ignore: deprecated_member_use_from_same_package
+
+// ignore: deprecated_member_use_from_same_package
+import 'constant_test.dart' as constant_test;
 import 'declaration_resolver_test.dart' as declaration_resolver_test;
 import 'element_resolver_test.dart' as element_resolver_test;
 import 'engine_test.dart' as engine_test;
 import 'error_suppression_driver_test.dart' as error_suppression_driver_test;
-import 'hint_code_driver_test.dart' as hint_code_driver_test;
 import 'hint_code_test.dart' as hint_code_test;
 import 'inheritance_manager_test.dart' as inheritance_manager_test;
 import 'invalid_code_driver_test.dart' as invalid_code_driver_test;
@@ -54,7 +54,6 @@
     element_resolver_test.main();
     engine_test.main();
     error_suppression_driver_test.main();
-    hint_code_driver_test.main();
     hint_code_test.main();
     inheritance_manager_test.main();
     invalid_code_driver_test.main();
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index 4568043..502ee0d 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -471,6 +471,10 @@
     _assertCloneUnitMember('class C { C(A this.a); }');
   }
 
+  void test_visitForEachStatement_await() {
+    _assertCloneStatement('await for (var a in b) {}');
+  }
+
   void test_visitForEachStatement_declared() {
     _assertCloneStatement('for (var a in b) {}');
   }
@@ -1172,7 +1176,7 @@
   }
 
   Statement _parseStatement(String code) {
-    CompilationUnit unit = _parseUnit('main() { $code }');
+    CompilationUnit unit = _parseUnit('main() async { $code }');
     FunctionDeclaration main = unit.declarations.single;
     BlockFunctionBody body = main.functionExpression.body;
     return body.block.statements.single;
@@ -1702,75 +1706,83 @@
 }
 
 class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier
-    implements NodeReplacerTest_Getter<ForEachStatement, Statement> {
+    implements NodeReplacerTest_Getter<ForStatement2, Statement> {
   @override
-  Statement get(ForEachStatement node) => node.body;
+  Statement get(ForStatement2 node) => node.body;
 }
 
 class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_2
-    implements NodeReplacerTest_Getter<ForEachStatement, SimpleIdentifier> {
+    implements NodeReplacerTest_Getter<ForStatement2, SimpleIdentifier> {
   @override
-  SimpleIdentifier get(ForEachStatement node) => node.identifier;
+  SimpleIdentifier get(ForStatement2 node) =>
+      (node.forLoopParts as ForEachPartsWithIdentifier).identifier;
 }
 
 class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_3
-    implements NodeReplacerTest_Getter<ForEachStatement, Expression> {
+    implements NodeReplacerTest_Getter<ForStatement2, Expression> {
   @override
-  Expression get(ForEachStatement node) => node.iterable;
+  Expression get(ForStatement2 node) =>
+      (node.forLoopParts as ForEachParts).iterable;
 }
 
 class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable
-    implements NodeReplacerTest_Getter<ForEachStatement, Expression> {
+    implements NodeReplacerTest_Getter<ForStatement2, Expression> {
   @override
-  Expression get(ForEachStatement node) => node.iterable;
+  Expression get(ForStatement2 node) =>
+      (node.forLoopParts as ForEachParts).iterable;
 }
 
 class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_2
-    implements NodeReplacerTest_Getter<ForEachStatement, DeclaredIdentifier> {
+    implements NodeReplacerTest_Getter<ForStatement2, DeclaredIdentifier> {
   @override
-  DeclaredIdentifier get(ForEachStatement node) => node.loopVariable;
+  DeclaredIdentifier get(ForStatement2 node) =>
+      (node.forLoopParts as ForEachPartsWithDeclaration).loopVariable;
 }
 
 class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_3
-    implements NodeReplacerTest_Getter<ForEachStatement, Statement> {
+    implements NodeReplacerTest_Getter<ForStatement2, Statement> {
   @override
-  Statement get(ForEachStatement node) => node.body;
+  Statement get(ForStatement2 node) => node.body;
 }
 
 class Getter_NodeReplacerTest_test_forStatement_withInitialization
-    implements NodeReplacerTest_Getter<ForStatement, Statement> {
+    implements NodeReplacerTest_Getter<ForStatement2, Statement> {
   @override
-  Statement get(ForStatement node) => node.body;
+  Statement get(ForStatement2 node) => node.body;
 }
 
 class Getter_NodeReplacerTest_test_forStatement_withInitialization_2
-    implements NodeReplacerTest_Getter<ForStatement, Expression> {
+    implements NodeReplacerTest_Getter<ForStatement2, Expression> {
   @override
-  Expression get(ForStatement node) => node.condition;
+  Expression get(ForStatement2 node) =>
+      (node.forLoopParts as ForParts).condition;
 }
 
 class Getter_NodeReplacerTest_test_forStatement_withInitialization_3
-    implements NodeReplacerTest_Getter<ForStatement, Expression> {
+    implements NodeReplacerTest_Getter<ForStatement2, Expression> {
   @override
-  Expression get(ForStatement node) => node.initialization;
+  Expression get(ForStatement2 node) =>
+      (node.forLoopParts as ForPartsWithExpression).initialization;
 }
 
 class Getter_NodeReplacerTest_test_forStatement_withVariables
-    implements NodeReplacerTest_Getter<ForStatement, Statement> {
+    implements NodeReplacerTest_Getter<ForStatement2, Statement> {
   @override
-  Statement get(ForStatement node) => node.body;
+  Statement get(ForStatement2 node) => node.body;
 }
 
 class Getter_NodeReplacerTest_test_forStatement_withVariables_2
-    implements NodeReplacerTest_Getter<ForStatement, VariableDeclarationList> {
+    implements NodeReplacerTest_Getter<ForStatement2, VariableDeclarationList> {
   @override
-  VariableDeclarationList get(ForStatement node) => node.variables;
+  VariableDeclarationList get(ForStatement2 node) =>
+      (node.forLoopParts as ForPartsWithDeclarations).variables;
 }
 
 class Getter_NodeReplacerTest_test_forStatement_withVariables_3
-    implements NodeReplacerTest_Getter<ForStatement, Expression> {
+    implements NodeReplacerTest_Getter<ForStatement2, Expression> {
   @override
-  Expression get(ForStatement node) => node.condition;
+  Expression get(ForStatement2 node) =>
+      (node.forLoopParts as ForParts).condition;
 }
 
 class Getter_NodeReplacerTest_test_functionDeclaration
@@ -2414,21 +2426,23 @@
 }
 
 class ListGetter_NodeReplacerTest_test_forStatement_withInitialization
-    extends NodeReplacerTest_ListGetter<ForStatement, Expression> {
+    extends NodeReplacerTest_ListGetter<ForStatement2, Expression> {
   ListGetter_NodeReplacerTest_test_forStatement_withInitialization(int arg0)
       : super(arg0);
 
   @override
-  NodeList<Expression> getList(ForStatement node) => node.updaters;
+  NodeList<Expression> getList(ForStatement2 node) =>
+      (node.forLoopParts as ForParts).updaters;
 }
 
 class ListGetter_NodeReplacerTest_test_forStatement_withVariables
-    extends NodeReplacerTest_ListGetter<ForStatement, Expression> {
+    extends NodeReplacerTest_ListGetter<ForStatement2, Expression> {
   ListGetter_NodeReplacerTest_test_forStatement_withVariables(int arg0)
       : super(arg0);
 
   @override
-  NodeList<Expression> getList(ForStatement node) => node.updaters;
+  NodeList<Expression> getList(ForStatement2 node) =>
+      (node.forLoopParts as ForParts).updaters;
 }
 
 class ListGetter_NodeReplacerTest_test_hideCombinator
@@ -2464,19 +2478,19 @@
 }
 
 class ListGetter_NodeReplacerTest_test_listLiteral
-    extends NodeReplacerTest_ListGetter<ListLiteral, Expression> {
+    extends NodeReplacerTest_ListGetter<ListLiteral, CollectionElement> {
   ListGetter_NodeReplacerTest_test_listLiteral(int arg0) : super(arg0);
 
   @override
-  NodeList<Expression> getList(ListLiteral node) => node.elements;
+  NodeList<CollectionElement> getList(ListLiteral node) => node.elements2;
 }
 
 class ListGetter_NodeReplacerTest_test_mapLiteral
-    extends NodeReplacerTest_ListGetter<MapLiteral, MapLiteralEntry> {
+    extends NodeReplacerTest_ListGetter<SetOrMapLiteral, MapLiteralEntry> {
   ListGetter_NodeReplacerTest_test_mapLiteral(int arg0) : super(arg0);
 
   @override
-  NodeList<MapLiteralEntry> getList(MapLiteral node) => node.entries;
+  NodeList<MapLiteralEntry> getList(SetOrMapLiteral node) => node.elements2;
 }
 
 class ListGetter_NodeReplacerTest_test_showCombinator
@@ -3051,7 +3065,8 @@
   }
 
   void test_forEachStatement_withIdentifier() {
-    ForEachStatement node = AstTestFactory.forEachStatement2(
+    // ignore: deprecated_member_use_from_same_package
+    ForStatement2 node = AstTestFactory.forEachStatement2(
         AstTestFactory.identifier3("i"),
         AstTestFactory.identifier3("l"),
         AstTestFactory.block());
@@ -3064,7 +3079,8 @@
   }
 
   void test_forEachStatement_withLoopVariable() {
-    ForEachStatement node = AstTestFactory.forEachStatement(
+    // ignore: deprecated_member_use_from_same_package
+    ForStatement2 node = AstTestFactory.forEachStatement(
         AstTestFactory.declaredIdentifier3("e"),
         AstTestFactory.identifier3("l"),
         AstTestFactory.block());
@@ -3084,6 +3100,7 @@
   }
 
   void test_forStatement_withInitialization() {
+    // ignore: deprecated_member_use_from_same_package
     ForStatement node = AstTestFactory.forStatement(
         AstTestFactory.identifier3("a"),
         AstTestFactory.booleanLiteral(true),
@@ -3102,6 +3119,7 @@
   }
 
   void test_forStatement_withVariables() {
+    // ignore: deprecated_member_use_from_same_package
     ForStatement node = AstTestFactory.forStatement2(
         AstTestFactory.variableDeclarationList2(
             null, [AstTestFactory.variableDeclaration("i")]),
@@ -3308,7 +3326,8 @@
   }
 
   void test_mapLiteral() {
-    MapLiteral node = AstTestFactory.mapLiteral(
+    // ignore: deprecated_member_use_from_same_package
+    SetOrMapLiteral node = AstTestFactory.mapLiteral(
         null,
         AstTestFactory.typeArgumentList([AstTestFactory.typeName4("E")]),
         [AstTestFactory.mapLiteralEntry("k", AstTestFactory.identifier3("v"))]);
@@ -3619,7 +3638,7 @@
       AstNode clone = child.accept(new AstCloner());
       NodeReplacer.replace(child, clone);
       expect(getter.get(parent), clone);
-      expect(clone.parent, parent);
+      expect(clone.parent, child.parent);
     }
   }
 
diff --git a/pkg/analyzer/test/src/abstract_single_unit.dart b/pkg/analyzer/test/src/abstract_single_unit.dart
deleted file mode 100644
index d42f775..0000000
--- a/pkg/analyzer/test/src/abstract_single_unit.dart
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/dart/ast/element_locator.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/generated/java_engine.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:test/test.dart';
-
-import 'context/abstract_context.dart';
-
-class AbstractSingleUnitTest extends AbstractContextTest {
-  bool verifyNoTestUnitErrors = true;
-
-  String testCode;
-  String testFile = '/test.dart';
-  Source testSource;
-  CompilationUnit testUnit;
-  CompilationUnitElement testUnitElement;
-  LibraryElement testLibraryElement;
-
-  Source addTestSource(String code, [Uri uri]) {
-    testCode = code;
-    testSource = addSource(testFile, code);
-    return testSource;
-  }
-
-  void assertNoErrorsInSource(Source source) {
-    List<AnalysisError> errors = context.getErrors(source).errors;
-    expect(errors, isEmpty);
-  }
-
-  Element findElement(String name, [ElementKind kind]) {
-    return findChildElement(testUnitElement, name, kind);
-  }
-
-  int findEnd(String search) {
-    return findOffset(search) + search.length;
-  }
-
-  /**
-   * Returns the [SimpleIdentifier] at the given search pattern.
-   */
-  SimpleIdentifier findIdentifier(String search) {
-    return findNodeAtString(search, (node) => node is SimpleIdentifier);
-  }
-
-  AstNode findNodeAtOffset(int offset, [Predicate<AstNode> predicate]) {
-    AstNode result = new NodeLocator(offset).searchWithin(testUnit);
-    if (result != null && predicate != null) {
-      result = result.thisOrAncestorMatching(predicate);
-    }
-    return result;
-  }
-
-  AstNode findNodeAtString(String search, [Predicate<AstNode> predicate]) {
-    int offset = findOffset(search);
-    return findNodeAtOffset(offset, predicate);
-  }
-
-  Element findNodeElementAtString(String search,
-      [Predicate<AstNode> predicate]) {
-    AstNode node = findNodeAtString(search, predicate);
-    if (node == null) {
-      return null;
-    }
-    return ElementLocator.locate(node);
-  }
-
-  int findOffset(String search) {
-    int offset = testCode.indexOf(search);
-    expect(offset, isNonNegative, reason: "Not found '$search' in\n$testCode");
-    return offset;
-  }
-
-  int getLeadingIdentifierLength(String search) {
-    int length = 0;
-    while (length < search.length) {
-      int c = search.codeUnitAt(length);
-      if (c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0)) {
-        length++;
-        continue;
-      }
-      if (c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0)) {
-        length++;
-        continue;
-      }
-      if (c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0)) {
-        length++;
-        continue;
-      }
-      break;
-    }
-    return length;
-  }
-
-  void resolveTestUnit(String code) {
-    addTestSource(code);
-    testUnit = resolveLibraryUnit(testSource);
-    if (verifyNoTestUnitErrors) {
-      assertNoErrorsInSource(testSource);
-    }
-    testUnitElement = testUnit.declaredElement;
-    testLibraryElement = testUnitElement.library;
-  }
-}
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 5c6cd3c..cc22d22 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -952,6 +952,8 @@
     expect(actual.strongModeHints, expected.strongModeHints);
     expect(actual.implicitCasts, expected.implicitCasts);
     expect(actual.implicitDynamic, expected.implicitDynamic);
+    expect(actual.strictInference, expected.strictInference);
+    expect(actual.strictRawTypes, expected.strictRawTypes);
     expect(actual.trackCacheDependencies, expected.trackCacheDependencies);
     expect(actual.disableCacheFlushing, expected.disableCacheFlushing);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart
index a834e3d..98af793 100644
--- a/pkg/analyzer/test/src/dart/analysis/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/base.dart
@@ -66,6 +66,8 @@
   String testFile;
   String testCode;
 
+  List<String> enabledExperiments = [];
+
   bool get disableChangesAndCacheAllResults => false;
 
   void addTestFile(String content, {bool priority: false}) {
@@ -104,8 +106,9 @@
         externalSummaries: externalSummaries);
   }
 
-  AnalysisOptionsImpl createAnalysisOptions() =>
-      new AnalysisOptionsImpl()..useFastaParser = analyzer.Parser.useFasta;
+  AnalysisOptionsImpl createAnalysisOptions() => new AnalysisOptionsImpl()
+    ..useFastaParser = analyzer.Parser.useFasta
+    ..enabledExperiments = enabledExperiments;
 
   int findOffset(String search) {
     int offset = testCode.indexOf(search);
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart b/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart
index aacbb42..36027c4 100644
--- a/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart
@@ -20,6 +20,7 @@
     defineReflectiveTests(ImplReferenceCollectorTest);
     defineReflectiveTests(ShadowReferenceCollectorTest);
     defineReflectiveTests(StatementReferenceCollectorTest);
+    defineReflectiveTests(StatementReferenceCollectorTest_SpreadCollections);
     defineReflectiveTests(TypeReferenceCollectorTest);
   });
 }
@@ -1385,10 +1386,6 @@
 
 @reflectiveTest
 class ExpressionReferenceCollectorTest_SetLiterals extends _Base {
-  @override
-  AnalysisOptionsImpl get analysisOptions =>
-      AnalysisOptionsImpl()..enabledExperiments = [EnableString.set_literals];
-
   test_setLiteral() async {
     var library = await buildTestLibrary(a, r'''
 test() {
@@ -2161,6 +2158,14 @@
 }
 
 @reflectiveTest
+class StatementReferenceCollectorTest_SpreadCollections
+    extends StatementReferenceCollectorTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [EnableString.spread_collections];
+}
+
+@reflectiveTest
 class TypeReferenceCollectorTest extends _Base {
   test_dynamic() async {
     var library = await buildTestLibrary(a, r'''
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index f5d7695..b47fb50 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -4941,12 +4941,12 @@
     BlockFunctionBody fooBody = fooDeclaration.body;
     List<Statement> statements = fooBody.block.statements;
 
-    ForEachStatement forEachStatement = statements[0];
+    ForStatement2 forEachStatement = statements[0];
     Block forBlock = forEachStatement.body;
+    var forEachParts =
+        forEachStatement.forLoopParts as ForEachPartsWithIdentifier;
 
-    expect(forEachStatement.loopVariable, isNull);
-
-    SimpleIdentifier vInFor = forEachStatement.identifier;
+    SimpleIdentifier vInFor = forEachParts.identifier;
     expect(vInFor.staticElement, same(vElement.setter));
     expect(vInFor.staticType, typeProvider.numType);
 
@@ -4976,12 +4976,12 @@
     LocalVariableElement vElement = vNode.declaredElement;
     expect(vElement.type, typeProvider.numType);
 
-    ForEachStatement forEachStatement = statements[1];
+    ForStatement2 forEachStatement = statements[1];
     Block forBlock = forEachStatement.body;
+    var forEachParts =
+        forEachStatement.forLoopParts as ForEachPartsWithIdentifier;
 
-    expect(forEachStatement.loopVariable, isNull);
-
-    SimpleIdentifier vInFor = forEachStatement.identifier;
+    SimpleIdentifier vInFor = forEachParts.identifier;
     expect(vInFor.staticElement, vElement);
     expect(vInFor.staticType, typeProvider.numType);
 
@@ -5011,12 +5011,12 @@
     TopLevelVariableElement vElement = vNode.declaredElement;
     expect(vElement.type, typeProvider.numType);
 
-    ForEachStatement forEachStatement = statements[0];
+    ForStatement2 forEachStatement = statements[0];
     Block forBlock = forEachStatement.body;
+    var forEachParts =
+        forEachStatement.forLoopParts as ForEachPartsWithIdentifier;
 
-    expect(forEachStatement.loopVariable, isNull);
-
-    SimpleIdentifier vInFor = forEachStatement.identifier;
+    SimpleIdentifier vInFor = forEachParts.identifier;
     expect(vInFor.staticElement, same(vElement.setter));
     expect(vInFor.staticType, typeProvider.numType);
 
@@ -5040,10 +5040,12 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    ForEachStatement forEachStatement = statements[0];
+    ForStatement2 forEachStatement = statements[0];
     Block forBlock = forEachStatement.body;
+    var forEachParts =
+        forEachStatement.forLoopParts as ForEachPartsWithDeclaration;
 
-    DeclaredIdentifier vNode = forEachStatement.loopVariable;
+    DeclaredIdentifier vNode = forEachParts.loopVariable;
     LocalVariableElement vElement = vNode.declaredElement;
     expect(vElement.type, typeProvider.intType);
 
@@ -5070,10 +5072,12 @@
 
     List<Statement> statements = _getMainStatements(result);
 
-    ForEachStatement forEachStatement = statements[0];
+    ForStatement2 forEachStatement = statements[0];
     Block forBlock = forEachStatement.body;
+    var forEachParts =
+        forEachStatement.forLoopParts as ForEachPartsWithDeclaration;
 
-    DeclaredIdentifier vNode = forEachStatement.loopVariable;
+    DeclaredIdentifier vNode = forEachParts.loopVariable;
     LocalVariableElement vElement = vNode.declaredElement;
     expect(vElement.type, typeProvider.numType);
 
@@ -5192,7 +5196,7 @@
 
     {
       ExpressionStatement statement = statements[0];
-      MapLiteral mapLiteral = statement.expression;
+      SetOrMapLiteral mapLiteral = statement.expression;
       expect(
           mapLiteral.staticType,
           typeProvider.mapType
@@ -5201,7 +5205,7 @@
 
     {
       ExpressionStatement statement = statements[1];
-      MapLiteral mapLiteral = statement.expression;
+      SetOrMapLiteral mapLiteral = statement.expression;
       expect(
           mapLiteral.staticType,
           typeProvider.mapType
@@ -5218,7 +5222,7 @@
     await resolveTestFile();
     expect(result.errors, isNotEmpty);
 
-    var literal = findNode.mapLiteral('<bool, int, double>{}');
+    var literal = findNode.setOrMapLiteral('<bool, int, double>{}');
     assertType(literal, 'Map<dynamic, dynamic>');
 
     var boolRef = findNode.simple('bool, ');
@@ -6725,7 +6729,7 @@
     await resolveTestFile();
     expect(result.errors, isEmpty);
 
-    var literal = findNode.setLiteral('<int>{}');
+    var literal = findNode.setOrMapLiteral('<int>{}');
     assertType(literal, 'Set<int>');
 
     var intRef = findNode.simple('int>{}');
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index 0a97168..f01268d 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -817,6 +817,7 @@
 class C {}
 typedef F();
 enum E {E1, E2}
+mixin M {}
 void f() {}
 var V1;
 get V2 => null;
@@ -827,6 +828,7 @@
 class _C {}
 typedef _F();
 enum _E {E1, E2}
+mixin _M {}
 void _f() {}
 var _V1;
 get _V2 => null;
@@ -840,11 +842,14 @@
       expect(declarations[name]?.kind, kind);
     }
 
-    expect(declarations.keys,
-        unorderedEquals(['C', 'F', 'E', 'f', 'V1', 'V2', 'V3', 'V4']));
+    expect(
+      declarations.keys,
+      unorderedEquals(['C', 'F', 'E', 'M', 'f', 'V1', 'V2', 'V3', 'V4']),
+    );
     assertHas('C', TopLevelDeclarationKind.type);
     assertHas('F', TopLevelDeclarationKind.type);
     assertHas('E', TopLevelDeclarationKind.type);
+    assertHas('M', TopLevelDeclarationKind.type);
     assertHas('f', TopLevelDeclarationKind.function);
     assertHas('V1', TopLevelDeclarationKind.variable);
     assertHas('V2', TopLevelDeclarationKind.variable);
diff --git a/pkg/analyzer/test/src/dart/analysis/results_test.dart b/pkg/analyzer/test/src/dart/analysis/results_test.dart
new file mode 100644
index 0000000..bb60ff5
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/analysis/results_test.dart
@@ -0,0 +1,477 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/results.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(GetElementDeclarationParsedTest);
+    defineReflectiveTests(GetElementDeclarationResolvedTest);
+  });
+}
+
+mixin GetElementDeclarationMixin implements DriverResolutionTest {
+  Future<ElementDeclarationResult> getElementDeclaration(Element element);
+
+  test_class() async {
+    addTestFile(r'''
+class A {}
+''');
+    await resolveTestFile();
+
+    var element = findNode.classDeclaration('A').declaredElement;
+    var result = await getElementDeclaration(element);
+    ClassDeclaration node = result.node;
+    expect(node.name.name, 'A');
+  }
+
+  test_class_duplicate() async {
+    addTestFile(r'''
+class A {} // 1
+class A {} // 2
+''');
+    await resolveTestFile();
+
+    {
+      var element = findNode.classDeclaration('A {} // 1').declaredElement;
+      var result = await getElementDeclaration(element);
+      ClassDeclaration node = result.node;
+      expect(node.name.name, 'A');
+      expect(
+        node.name.offset,
+        this.result.content.indexOf('A {} // 1'),
+      );
+    }
+
+    {
+      var element = findNode.classDeclaration('A {} // 2').declaredElement;
+      var result = await getElementDeclaration(element);
+      ClassDeclaration node = result.node;
+      expect(node.name.name, 'A');
+      expect(
+        node.name.offset,
+        this.result.content.indexOf('A {} // 2'),
+      );
+    }
+  }
+
+  test_class_inPart() async {
+    newFile('/test/lib/a.dart', content: r'''
+part of 'test.dart';
+class A {}
+''');
+    addTestFile(r'''
+part 'a.dart';
+''');
+    await resolveTestFile();
+
+    var library = this.result.unit.declaredElement.library;
+    var element = library.getType('A');
+    var result = await getElementDeclaration(element);
+    ClassDeclaration node = result.node;
+    expect(node.name.name, 'A');
+  }
+
+  test_class_missingName() async {
+    addTestFile('''
+class {}
+''');
+    await resolveTestFile();
+
+    var element = findNode.classDeclaration('class {}').declaredElement;
+    var result = await getElementDeclaration(element);
+    ClassDeclaration node = result.node;
+    expect(node.name.name, '');
+    expect(node.name.offset, 6);
+  }
+
+  test_classTypeAlias() async {
+    addTestFile(r'''
+mixin M {}
+class A {}
+class B = A with M;
+''');
+    await resolveTestFile();
+
+    var element = findElement.class_('B');
+    var result = await getElementDeclaration(element);
+    ClassTypeAlias node = result.node;
+    expect(node.name.name, 'B');
+  }
+
+  test_constructor() async {
+    addTestFile(r'''
+class A {
+  A();
+  A.named();
+}
+''');
+    await resolveTestFile();
+
+    {
+      var unnamed = findNode.constructor('A();').declaredElement;
+      var result = await getElementDeclaration(unnamed);
+      ConstructorDeclaration node = result.node;
+      expect(node.name, isNull);
+    }
+
+    {
+      var named = findNode.constructor('A.named();').declaredElement;
+      var result = await getElementDeclaration(named);
+      ConstructorDeclaration node = result.node;
+      expect(node.name.name, 'named');
+    }
+  }
+
+  test_constructor_duplicate_named() async {
+    addTestFile(r'''
+class A {
+  A.named(); // 1
+  A.named(); // 2
+}
+''');
+    await resolveTestFile();
+
+    {
+      var element = findNode.constructor('A.named(); // 1').declaredElement;
+      var result = await getElementDeclaration(element);
+      ConstructorDeclaration node = result.node;
+      expect(node.name.name, 'named');
+      expect(
+        node.name.offset,
+        this.result.content.indexOf('named(); // 1'),
+      );
+    }
+
+    {
+      var element = findNode.constructor('A.named(); // 2').declaredElement;
+      var result = await getElementDeclaration(element);
+      ConstructorDeclaration node = result.node;
+      expect(node.name.name, 'named');
+      expect(
+        node.name.offset,
+        this.result.content.indexOf('named(); // 2'),
+      );
+    }
+  }
+
+  test_constructor_duplicate_unnamed() async {
+    addTestFile(r'''
+class A {
+  A(); // 1
+  A(); // 2
+}
+''');
+    await resolveTestFile();
+
+    {
+      var element = findNode.constructor('A(); // 1').declaredElement;
+      var result = await getElementDeclaration(element);
+      ConstructorDeclaration node = result.node;
+      expect(node.name, isNull);
+      expect(
+        node.returnType.offset,
+        this.result.content.indexOf('A(); // 1'),
+      );
+    }
+
+    {
+      var element = findNode.constructor('A(); // 2').declaredElement;
+      var result = await getElementDeclaration(element);
+      ConstructorDeclaration node = result.node;
+      expect(node.name, isNull);
+      expect(
+        node.returnType.offset,
+        this.result.content.indexOf('A(); // 2'),
+      );
+    }
+  }
+
+  test_constructor_synthetic() async {
+    addTestFile(r'''
+class A {}
+''');
+    await resolveTestFile();
+
+    var element = findElement.class_('A').unnamedConstructor;
+    expect(element.isSynthetic, isTrue);
+
+    var result = await getElementDeclaration(element);
+    expect(result, isNull);
+  }
+
+  test_enum() async {
+    addTestFile(r'''
+enum MyEnum {a, b, c}
+''');
+    await resolveTestFile();
+
+    var element = findElement.enum_('MyEnum');
+    var result = await getElementDeclaration(element);
+    EnumDeclaration node = result.node;
+    expect(node.name.name, 'MyEnum');
+  }
+
+  test_enum_constant() async {
+    addTestFile(r'''
+enum MyEnum {a, b, c}
+''');
+    await resolveTestFile();
+
+    var element = findElement.field('a');
+    var result = await getElementDeclaration(element);
+    EnumConstantDeclaration node = result.node;
+    expect(node.name.name, 'a');
+  }
+
+  test_field() async {
+    addTestFile(r'''
+class C {
+  int foo;
+}
+''');
+    await resolveTestFile();
+
+    var element = findElement.field('foo');
+
+    var result = await getElementDeclaration(element);
+    VariableDeclaration node = result.node;
+    expect(node.name.name, 'foo');
+  }
+
+  test_functionDeclaration_local() async {
+    addTestFile(r'''
+main() {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    var element = findElement.localFunction('foo');
+
+    var result = await getElementDeclaration(element);
+    FunctionDeclaration node = result.node;
+    expect(node.name.name, 'foo');
+  }
+
+  test_functionDeclaration_top() async {
+    addTestFile(r'''
+void foo() {}
+''');
+    await resolveTestFile();
+
+    var element = findElement.topFunction('foo');
+
+    var result = await getElementDeclaration(element);
+    FunctionDeclaration node = result.node;
+    expect(node.name.name, 'foo');
+  }
+
+  test_getter_class() async {
+    addTestFile(r'''
+class A {
+  int get x => 0;
+}
+''');
+    await resolveTestFile();
+
+    var element = findElement.getter('x');
+    var result = await getElementDeclaration(element);
+    MethodDeclaration node = result.node;
+    expect(node.name.name, 'x');
+    expect(node.isGetter, isTrue);
+  }
+
+  test_getter_top() async {
+    addTestFile(r'''
+int get x => 0;
+''');
+    await resolveTestFile();
+
+    var element = findElement.topGet('x');
+    var result = await getElementDeclaration(element);
+    FunctionDeclaration node = result.node;
+    expect(node.name.name, 'x');
+    expect(node.isGetter, isTrue);
+  }
+
+  test_localVariable() async {
+    addTestFile(r'''
+main() {
+  int foo;
+}
+''');
+    await resolveTestFile();
+
+    var element = findElement.localVar('foo');
+
+    var result = await getElementDeclaration(element);
+    VariableDeclaration node = result.node;
+    expect(node.name.name, 'foo');
+  }
+
+  test_method() async {
+    addTestFile(r'''
+class C {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    var element = findElement.method('foo');
+
+    var result = await getElementDeclaration(element);
+    MethodDeclaration node = result.node;
+    expect(node.name.name, 'foo');
+  }
+
+  test_mixin() async {
+    addTestFile(r'''
+mixin M {}
+''');
+    await resolveTestFile();
+
+    var element = findElement.mixin('M');
+    var result = await getElementDeclaration(element);
+    MixinDeclaration node = result.node;
+    expect(node.name.name, 'M');
+  }
+
+  test_parameter() async {
+    addTestFile(r'''
+void f(int a) {}
+''');
+    await resolveTestFile();
+
+    var element = findElement.parameter('a');
+
+    var result = await getElementDeclaration(element);
+    SimpleFormalParameter node = result.node;
+    expect(node.identifier.name, 'a');
+  }
+
+  test_parameter_missingName_named() async {
+    addTestFile(r'''
+void f({@a}) {}
+''');
+    await resolveTestFile();
+
+    var f = findElement.topFunction('f');
+    var element = f.parameters.single;
+    expect(element.name, '');
+    expect(element.isNamed, isTrue);
+
+    var result = await getElementDeclaration(element);
+    DefaultFormalParameter node = result.node;
+    expect(node.identifier.name, '');
+  }
+
+  test_parameter_missingName_required() async {
+    addTestFile(r'''
+void f(@a) {}
+''');
+    await resolveTestFile();
+
+    var f = findElement.topFunction('f');
+    var element = f.parameters.single;
+    expect(element.name, '');
+    expect(element.isPositional, isTrue);
+
+    var result = await getElementDeclaration(element);
+    SimpleFormalParameter node = result.node;
+    expect(node.identifier.name, '');
+  }
+
+  test_setter_class() async {
+    addTestFile(r'''
+class A {
+  set x(_) {}
+}
+''');
+    await resolveTestFile();
+
+    var element = findElement.setter('x');
+    var result = await getElementDeclaration(element);
+    MethodDeclaration node = result.node;
+    expect(node.name.name, 'x');
+    expect(node.isSetter, isTrue);
+  }
+
+  test_setter_top() async {
+    addTestFile(r'''
+set x(_) {}
+''');
+    await resolveTestFile();
+
+    var element = findElement.topSet('x');
+    var result = await getElementDeclaration(element);
+    FunctionDeclaration node = result.node;
+    expect(node.name.name, 'x');
+    expect(node.isSetter, isTrue);
+  }
+
+  test_topLevelVariable() async {
+    addTestFile(r'''
+int foo;
+''');
+    await resolveTestFile();
+
+    var element = findElement.topVar('foo');
+
+    var result = await getElementDeclaration(element);
+    VariableDeclaration node = result.node;
+    expect(node.name.name, 'foo');
+  }
+
+  test_topLevelVariable_synthetic() async {
+    addTestFile(r'''
+int get foo => 0;
+''');
+    await resolveTestFile();
+
+    var element = findElement.topVar('foo');
+
+    var result = await getElementDeclaration(element);
+    expect(result, isNull);
+  }
+}
+
+@reflectiveTest
+class GetElementDeclarationParsedTest extends DriverResolutionTest
+    with GetElementDeclarationMixin {
+  @override
+  Future<ElementDeclarationResult> getElementDeclaration(
+      Element element) async {
+    var libraryPath = element.library.source.fullName;
+    var library = _getParsedLibrary(libraryPath);
+    return library.getElementDeclaration(element);
+  }
+
+  ParsedLibraryResultImpl _getParsedLibrary(String path) {
+    return driver.getParsedLibrary(path);
+  }
+}
+
+@reflectiveTest
+class GetElementDeclarationResolvedTest extends DriverResolutionTest
+    with GetElementDeclarationMixin {
+  @override
+  Future<ElementDeclarationResult> getElementDeclaration(
+      Element element) async {
+    var libraryPath = element.library.source.fullName;
+    var library = await _getResolvedLibrary(libraryPath);
+    return library.getElementDeclaration(element);
+  }
+
+  Future<ResolvedLibraryResult> _getResolvedLibrary(String path) {
+    return driver.getResolvedLibrary(path);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
index f815fbc..a5b6353 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
@@ -76,258 +76,19 @@
   }
 
   test_getElementDeclaration_class() async {
-    newFile('/test/lib/test.dart', content: r'''
+    addTestFile(r'''
 class A {}
 ''');
     await resolveTestFile();
 
-    var element = findNode.classDeclaration('A').declaredElement;
+    var element = findElement.class_('A');
     var result = await helper.getElementDeclaration(element);
     ClassDeclaration node = result.node;
     expect(node.name.name, 'A');
   }
 
-  test_getElementDeclaration_class_duplicate() async {
-    newFile('/test/lib/test.dart', content: r'''
-class A {} // 1
-class A {} // 2
-''');
-    await resolveTestFile();
-
-    {
-      var element = findNode.classDeclaration('A {} // 1').declaredElement;
-      var result = await helper.getElementDeclaration(element);
-      ClassDeclaration node = result.node;
-      expect(node.name.name, 'A');
-      expect(
-        node.name.offset,
-        this.result.content.indexOf('A {} // 1'),
-      );
-    }
-
-    {
-      var element = findNode.classDeclaration('A {} // 2').declaredElement;
-      var result = await helper.getElementDeclaration(element);
-      ClassDeclaration node = result.node;
-      expect(node.name.name, 'A');
-      expect(
-        node.name.offset,
-        this.result.content.indexOf('A {} // 2'),
-      );
-    }
-  }
-
-  test_getElementDeclaration_class_inPart() async {
-    newFile('/test/lib/a.dart', content: r'''
-part of 'test.dart';
-class A {}
-''');
-    newFile('/test/lib/test.dart', content: r'''
-part 'a.dart';
-''');
-    await resolveTestFile();
-
-    var library = this.result.unit.declaredElement.library;
-    var element = library.getType('A');
-    var result = await helper.getElementDeclaration(element);
-    ClassDeclaration node = result.node;
-    expect(node.name.name, 'A');
-  }
-
-  test_getElementDeclaration_constructor() async {
-    newFile('/test/lib/test.dart', content: r'''
-class A {
-  A();
-  A.named();
-}
-''');
-    await resolveTestFile();
-
-    {
-      var unnamed = findNode.constructor('A();').declaredElement;
-      var result = await helper.getElementDeclaration(unnamed);
-      ConstructorDeclaration node = result.node;
-      expect(node.name, isNull);
-    }
-
-    {
-      var named = findNode.constructor('A.named();').declaredElement;
-      var result = await helper.getElementDeclaration(named);
-      ConstructorDeclaration node = result.node;
-      expect(node.name.name, 'named');
-    }
-  }
-
-  test_getElementDeclaration_constructor_duplicate_named() async {
-    newFile('/test/lib/test.dart', content: r'''
-class A {
-  A.named(); // 1
-  A.named(); // 2
-}
-''');
-    await resolveTestFile();
-
-    {
-      var element = findNode.constructor('A.named(); // 1').declaredElement;
-      var result = await helper.getElementDeclaration(element);
-      ConstructorDeclaration node = result.node;
-      expect(node.name.name, 'named');
-      expect(
-        node.name.offset,
-        this.result.content.indexOf('named(); // 1'),
-      );
-    }
-
-    {
-      var element = findNode.constructor('A.named(); // 2').declaredElement;
-      var result = await helper.getElementDeclaration(element);
-      ConstructorDeclaration node = result.node;
-      expect(node.name.name, 'named');
-      expect(
-        node.name.offset,
-        this.result.content.indexOf('named(); // 2'),
-      );
-    }
-  }
-
-  test_getElementDeclaration_constructor_duplicate_unnamed() async {
-    newFile('/test/lib/test.dart', content: r'''
-class A {
-  A(); // 1
-  A(); // 2
-}
-''');
-    await resolveTestFile();
-
-    {
-      var element = findNode.constructor('A(); // 1').declaredElement;
-      var result = await helper.getElementDeclaration(element);
-      ConstructorDeclaration node = result.node;
-      expect(node.name, isNull);
-      expect(
-        node.returnType.offset,
-        this.result.content.indexOf('A(); // 1'),
-      );
-    }
-
-    {
-      var element = findNode.constructor('A(); // 2').declaredElement;
-      var result = await helper.getElementDeclaration(element);
-      ConstructorDeclaration node = result.node;
-      expect(node.name, isNull);
-      expect(
-        node.returnType.offset,
-        this.result.content.indexOf('A(); // 2'),
-      );
-    }
-  }
-
-  test_getElementDeclaration_constructor_synthetic() async {
-    newFile('/test/lib/test.dart', content: r'''
-class A {}
-''');
-    await resolveTestFile();
-
-    var element = findElement.class_('A').unnamedConstructor;
-    expect(element.isSynthetic, isTrue);
-
-    var result = await helper.getElementDeclaration(element);
-    expect(result, isNull);
-  }
-
-  test_getElementDeclaration_field() async {
-    newFile('/test/lib/test.dart', content: r'''
-class C {
-  int foo;
-}
-''');
-    await resolveTestFile();
-
-    var element = findElement.field('foo');
-    var result = await helper.getElementDeclaration(element);
-    VariableDeclaration node = result.node;
-    expect(node.name.name, 'foo');
-  }
-
-  test_getElementDeclaration_functionDeclaration_local() async {
-    newFile('/test/lib/test.dart', content: r'''
-main() {
-  void foo() {}
-}
-''');
-    await resolveTestFile();
-
-    var element = findElement.localFunction('foo');
-    var result = await helper.getElementDeclaration(element);
-    FunctionDeclaration node = result.node;
-    expect(node.name.name, 'foo');
-  }
-
-  test_getElementDeclaration_functionDeclaration_top() async {
-    newFile('/test/lib/test.dart', content: r'''
-void foo() {}
-''');
-    await resolveTestFile();
-
-    var element = findElement.topFunction('foo');
-    var result = await helper.getElementDeclaration(element);
-    FunctionDeclaration node = result.node;
-    expect(node.name.name, 'foo');
-  }
-
-  test_getElementDeclaration_localVariable() async {
-    newFile('/test/lib/test.dart', content: r'''
-main() {
-  int foo;
-}
-''');
-    await resolveTestFile();
-
-    var element = findElement.localVar('foo');
-    var result = await helper.getElementDeclaration(element);
-    VariableDeclaration node = result.node;
-    expect(node.name.name, 'foo');
-  }
-
-  test_getElementDeclaration_method() async {
-    newFile('/test/lib/test.dart', content: r'''
-class C {
-  void foo() {}
-}
-''');
-    await resolveTestFile();
-
-    var element = findElement.method('foo');
-    var result = await helper.getElementDeclaration(element);
-    MethodDeclaration node = result.node;
-    expect(node.name.name, 'foo');
-  }
-
-  test_getElementDeclaration_topLevelVariable() async {
-    newFile('/test/lib/test.dart', content: r'''
-int foo;
-''');
-    await resolveTestFile();
-
-    var element = findElement.topVar('foo');
-    var result = await helper.getElementDeclaration(element);
-    VariableDeclaration node = result.node;
-    expect(node.name.name, 'foo');
-  }
-
-  test_getElementDeclaration_topLevelVariable_synthetic() async {
-    newFile('/test/lib/test.dart', content: r'''
-int get foo => 0;
-''');
-    await resolveTestFile();
-
-    var element = findElement.topVar('foo');
-    var result = await helper.getElementDeclaration(element);
-    expect(result, isNull);
-  }
-
   test_getResolvedUnitByElement() async {
-    newFile('/test/lib/test.dart', content: r'''
+    addTestFile(r'''
 class A {}
 class B {}
 ''');
diff --git a/pkg/analyzer/test/src/dart/analysis/test_all.dart b/pkg/analyzer/test/src/dart/analysis/test_all.dart
index 77d968e..d1428d6 100644
--- a/pkg/analyzer/test/src/dart/analysis/test_all.dart
+++ b/pkg/analyzer/test/src/dart/analysis/test_all.dart
@@ -22,6 +22,7 @@
 import 'index_test.dart' as index;
 import 'mutex_test.dart' as mutex;
 import 'referenced_names_test.dart' as referenced_names;
+import 'results_test.dart' as results;
 import 'search_test.dart' as search;
 import 'session_helper_test.dart' as session_helper;
 import 'session_test.dart' as session;
@@ -47,6 +48,7 @@
     index.main();
     mutex.main();
     referenced_names.main();
+    results.main();
     search.main();
     session.main();
     session_helper.main();
diff --git a/pkg/analyzer/test/src/dart/ast/parse_base.dart b/pkg/analyzer/test/src/dart/ast/parse_base.dart
index a157430..257820f 100644
--- a/pkg/analyzer/test/src/dart/ast/parse_base.dart
+++ b/pkg/analyzer/test/src/dart/ast/parse_base.dart
@@ -35,7 +35,6 @@
     var useFasta = analysisOptions.useFastaParser;
     var parser = Parser(source, errorListener, useFasta: useFasta);
     parser.enableOptionalNewAndConst = true;
-    parser.enableSetLiterals = experimentStatus.set_literals;
     parser.enableNonNullable = experimentStatus.non_nullable;
     parser.enableSpreadCollections = experimentStatus.spread_collections;
     parser.enableControlFlowCollections =
diff --git a/pkg/analyzer/test/src/dart/ast/utilities_test.dart b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
index 1a9032b..28f67c2 100644
--- a/pkg/analyzer/test/src/dart/ast/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
@@ -563,67 +563,38 @@
   }
 
   void test_visitListLiteral() {
-    ListLiteral fromNode = AstTestFactory.listLiteral();
-    DartType staticType = ElementFactory.classElement2("C").type;
-    fromNode.staticType = staticType;
-    ListLiteral toNode = AstTestFactory.listLiteral();
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    expect(toNode.staticType, same(staticType));
-  }
-
-  void test_visitListLiteral2() {
-    ListLiteral2 createNode() => astFactory.listLiteral2(
-        typeArguments:
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('A')]),
-        elements: [AstTestFactory.identifier3('b')]);
-
-    DartType typeA = ElementFactory.classElement2("A").type;
-    DartType typeB = ElementFactory.classElement2("B").type;
-
-    ListLiteral2 fromNode = createNode();
-    (fromNode.typeArguments.arguments[0] as TypeName).type = typeA;
-    (fromNode.elements[0] as SimpleIdentifier).staticType = typeB;
-
-    ListLiteral2 toNode = createNode();
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    expect((toNode.typeArguments.arguments[0] as TypeName).type, same(typeA));
-    expect((toNode.elements[0] as SimpleIdentifier).staticType, same(typeB));
-  }
-
-  void test_visitMapLiteral() {
-    MapLiteral fromNode = AstTestFactory.mapLiteral2();
-    DartType staticType = ElementFactory.classElement2("C").type;
-    fromNode.staticType = staticType;
-    MapLiteral toNode = AstTestFactory.mapLiteral2();
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    expect(toNode.staticType, same(staticType));
-  }
-
-  void test_visitMapLiteral2() {
-    MapLiteral2 createNode() => astFactory.mapLiteral2(
-        typeArguments: AstTestFactory.typeArgumentList(
-            [AstTestFactory.typeName4('A'), AstTestFactory.typeName4('B')]),
-        entries: [AstTestFactory.mapLiteralEntry3('c', 'd')]);
+    ListLiteral createNode() => astFactory.listLiteral(
+        null,
+        AstTestFactory.typeArgumentList([AstTestFactory.typeName4('A')]),
+        null,
+        [AstTestFactory.identifier3('b')],
+        null);
 
     DartType typeA = ElementFactory.classElement2("A").type;
     DartType typeB = ElementFactory.classElement2("B").type;
     DartType typeC = ElementFactory.classElement2("C").type;
-    DartType typeD = ElementFactory.classElement2("D").type;
 
-    MapLiteral2 fromNode = createNode();
+    ListLiteral fromNode = createNode();
     (fromNode.typeArguments.arguments[0] as TypeName).type = typeA;
-    (fromNode.typeArguments.arguments[1] as TypeName).type = typeB;
-    MapLiteralEntry fromEntry = fromNode.entries[0] as MapLiteralEntry;
-    (fromEntry.key as SimpleStringLiteral).staticType = typeC;
-    (fromEntry.value as SimpleStringLiteral).staticType = typeD;
+    (fromNode.elements2[0] as SimpleIdentifier).staticType = typeB;
+    fromNode.staticType = typeC;
 
-    MapLiteral2 toNode = createNode();
+    ListLiteral toNode = createNode();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     expect((toNode.typeArguments.arguments[0] as TypeName).type, same(typeA));
-    expect((toNode.typeArguments.arguments[1] as TypeName).type, same(typeB));
-    MapLiteralEntry toEntry = fromNode.entries[0] as MapLiteralEntry;
-    expect((toEntry.key as SimpleStringLiteral).staticType, same(typeC));
-    expect((toEntry.value as SimpleStringLiteral).staticType, same(typeD));
+    expect((toNode.elements2[0] as SimpleIdentifier).staticType, same(typeB));
+    expect(fromNode.staticType, same(typeC));
+  }
+
+  void test_visitMapLiteral() {
+    // ignore: deprecated_member_use_from_same_package
+    SetOrMapLiteral fromNode = AstTestFactory.mapLiteral2();
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    // ignore: deprecated_member_use_from_same_package
+    SetOrMapLiteral toNode = AstTestFactory.mapLiteral2();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitMethodInvocation() {
@@ -762,8 +733,35 @@
     expect(toNode.staticType, same(staticType));
   }
 
-  void test_visitSetLiteral2() {
-    SetLiteral2 createNode() => astFactory.setLiteral2(
+  void test_visitSetOrMapLiteral_map() {
+    SetOrMapLiteral createNode() => astFactory.setOrMapLiteral(
+        typeArguments: AstTestFactory.typeArgumentList(
+            [AstTestFactory.typeName4('A'), AstTestFactory.typeName4('B')]),
+        elements: [AstTestFactory.mapLiteralEntry3('c', 'd')]);
+
+    DartType typeA = ElementFactory.classElement2("A").type;
+    DartType typeB = ElementFactory.classElement2("B").type;
+    DartType typeC = ElementFactory.classElement2("C").type;
+    DartType typeD = ElementFactory.classElement2("D").type;
+
+    SetOrMapLiteral fromNode = createNode();
+    (fromNode.typeArguments.arguments[0] as TypeName).type = typeA;
+    (fromNode.typeArguments.arguments[1] as TypeName).type = typeB;
+    MapLiteralEntry fromEntry = fromNode.elements2[0] as MapLiteralEntry;
+    (fromEntry.key as SimpleStringLiteral).staticType = typeC;
+    (fromEntry.value as SimpleStringLiteral).staticType = typeD;
+
+    SetOrMapLiteral toNode = createNode();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect((toNode.typeArguments.arguments[0] as TypeName).type, same(typeA));
+    expect((toNode.typeArguments.arguments[1] as TypeName).type, same(typeB));
+    MapLiteralEntry toEntry = fromNode.elements2[0] as MapLiteralEntry;
+    expect((toEntry.key as SimpleStringLiteral).staticType, same(typeC));
+    expect((toEntry.value as SimpleStringLiteral).staticType, same(typeD));
+  }
+
+  void test_visitSetOrMapLiteral_set() {
+    SetOrMapLiteral createNode() => astFactory.setOrMapLiteral(
         typeArguments:
             AstTestFactory.typeArgumentList([AstTestFactory.typeName4('A')]),
         elements: [AstTestFactory.identifier3('b')]);
@@ -771,14 +769,14 @@
     DartType typeA = ElementFactory.classElement2("A").type;
     DartType typeB = ElementFactory.classElement2("B").type;
 
-    SetLiteral2 fromNode = createNode();
+    SetOrMapLiteral fromNode = createNode();
     (fromNode.typeArguments.arguments[0] as TypeName).type = typeA;
-    (fromNode.elements[0] as SimpleIdentifier).staticType = typeB;
+    (fromNode.elements2[0] as SimpleIdentifier).staticType = typeB;
 
-    SetLiteral2 toNode = createNode();
+    SetOrMapLiteral toNode = createNode();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     expect((toNode.typeArguments.arguments[0] as TypeName).type, same(typeA));
-    expect((toNode.elements[0] as SimpleIdentifier).staticType, same(typeB));
+    expect((toNode.elements2[0] as SimpleIdentifier).staticType, same(typeB));
   }
 
   void test_visitSimpleIdentifier() {
@@ -811,19 +809,19 @@
     SpreadElement createNode() => astFactory.spreadElement(
         spreadOperator:
             TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD_PERIOD),
-        expression: astFactory
-            .listLiteral2(elements: [AstTestFactory.identifier3('a')]));
+        expression: astFactory.listLiteral(
+            null, null, null, [AstTestFactory.identifier3('a')], null));
 
     DartType typeA = ElementFactory.classElement2("A").type;
 
     SpreadElement fromNode = createNode();
-    ((fromNode.expression as ListLiteral2).elements[0] as SimpleIdentifier)
+    ((fromNode.expression as ListLiteral).elements2[0] as SimpleIdentifier)
         .staticType = typeA;
 
     SpreadElement toNode = createNode();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     expect(
-        ((toNode.expression as ListLiteral2).elements[0] as SimpleIdentifier)
+        ((toNode.expression as ListLiteral).elements2[0] as SimpleIdentifier)
             .staticType,
         same(typeA));
   }
@@ -1816,6 +1814,7 @@
   void test_visitForEachStatement_declared() {
     _assertSource(
         "for (var a in b) {}",
+        // ignore: deprecated_member_use_from_same_package
         AstTestFactory.forEachStatement(AstTestFactory.declaredIdentifier3("a"),
             AstTestFactory.identifier3("b"), AstTestFactory.block()));
   }
@@ -1823,29 +1822,30 @@
   void test_visitForEachStatement_variable() {
     _assertSource(
         "for (a in b) {}",
-        astFactory.forEachStatementWithReference(
-            null,
-            TokenFactory.tokenFromKeyword(Keyword.FOR),
-            TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
-            AstTestFactory.identifier3("a"),
-            TokenFactory.tokenFromKeyword(Keyword.IN),
-            AstTestFactory.identifier3("b"),
-            TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
-            AstTestFactory.block()));
+        astFactory.forStatement2(
+            forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
+            leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+            forLoopParts: astFactory.forEachPartsWithIdentifier(
+                identifier: AstTestFactory.identifier3("a"),
+                inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
+                iterable: AstTestFactory.identifier3("b")),
+            rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+            body: AstTestFactory.block()));
   }
 
   void test_visitForEachStatement_variable_await() {
     _assertSource(
         "await for (a in b) {}",
-        astFactory.forEachStatementWithReference(
-            TokenFactory.tokenFromString("await"),
-            TokenFactory.tokenFromKeyword(Keyword.FOR),
-            TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
-            AstTestFactory.identifier3("a"),
-            TokenFactory.tokenFromKeyword(Keyword.IN),
-            AstTestFactory.identifier3("b"),
-            TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
-            AstTestFactory.block()));
+        astFactory.forStatement2(
+            awaitKeyword: TokenFactory.tokenFromString("await"),
+            forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
+            leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+            forLoopParts: astFactory.forEachPartsWithIdentifier(
+                identifier: AstTestFactory.identifier3("a"),
+                inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
+                iterable: AstTestFactory.identifier3("b")),
+            rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+            body: AstTestFactory.block()));
   }
 
   void test_visitForElement() {
@@ -2061,6 +2061,7 @@
   void test_visitForStatement_c() {
     _assertSource(
         "for (; c;) {}",
+        // ignore: deprecated_member_use_from_same_package
         AstTestFactory.forStatement(null, AstTestFactory.identifier3("c"), null,
             AstTestFactory.block()));
   }
@@ -2068,6 +2069,7 @@
   void test_visitForStatement_cu() {
     _assertSource(
         "for (; c; u) {}",
+        // ignore: deprecated_member_use_from_same_package
         AstTestFactory.forStatement(null, AstTestFactory.identifier3("c"),
             [AstTestFactory.identifier3("u")], AstTestFactory.block()));
   }
@@ -2075,6 +2077,7 @@
   void test_visitForStatement_e() {
     _assertSource(
         "for (e;;) {}",
+        // ignore: deprecated_member_use_from_same_package
         AstTestFactory.forStatement(AstTestFactory.identifier3("e"), null, null,
             AstTestFactory.block()));
   }
@@ -2082,6 +2085,7 @@
   void test_visitForStatement_ec() {
     _assertSource(
         "for (e; c;) {}",
+        // ignore: deprecated_member_use_from_same_package
         AstTestFactory.forStatement(AstTestFactory.identifier3("e"),
             AstTestFactory.identifier3("c"), null, AstTestFactory.block()));
   }
@@ -2089,6 +2093,7 @@
   void test_visitForStatement_ecu() {
     _assertSource(
         "for (e; c; u) {}",
+        // ignore: deprecated_member_use_from_same_package
         AstTestFactory.forStatement(
             AstTestFactory.identifier3("e"),
             AstTestFactory.identifier3("c"),
@@ -2099,6 +2104,7 @@
   void test_visitForStatement_eu() {
     _assertSource(
         "for (e;; u) {}",
+        // ignore: deprecated_member_use_from_same_package
         AstTestFactory.forStatement(AstTestFactory.identifier3("e"), null,
             [AstTestFactory.identifier3("u")], AstTestFactory.block()));
   }
@@ -2150,6 +2156,7 @@
   void test_visitForStatement_u() {
     _assertSource(
         "for (;; u) {}",
+        // ignore: deprecated_member_use_from_same_package
         AstTestFactory.forStatement(null, null,
             [AstTestFactory.identifier3("u")], AstTestFactory.block()));
   }
@@ -2627,13 +2634,14 @@
         AstTestFactory.libraryIdentifier([AstTestFactory.identifier3("a")]));
   }
 
-  void test_visitListLiteral2_complex() {
+  void test_visitListLiteral_complex() {
     _assertSource(
         '<int>[0, for (e in l) 0, if (b) 1, ...[0]]',
-        astFactory.listLiteral2(
-            typeArguments: AstTestFactory.typeArgumentList(
-                [AstTestFactory.typeName4('int')]),
-            elements: [
+        astFactory.listLiteral(
+            null,
+            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            null,
+            [
               AstTestFactory.integer(0),
               astFactory.forElement(
                   forLoopParts: astFactory.forEachPartsWithIdentifier(
@@ -2646,41 +2654,10 @@
               astFactory.spreadElement(
                   spreadOperator: TokenFactory.tokenFromType(
                       TokenType.PERIOD_PERIOD_PERIOD),
-                  expression: astFactory
-                      .listLiteral2(elements: [AstTestFactory.integer(0)]))
-            ]));
-  }
-
-  void test_visitListLiteral2_withConst_withoutTypeArgs() {
-    _assertSource(
-        'const [0]',
-        astFactory.listLiteral2(
-            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
-            elements: [AstTestFactory.integer(0)]));
-  }
-
-  void test_visitListLiteral2_withConst_withTypeArgs() {
-    _assertSource(
-        'const <int>[0]',
-        astFactory.listLiteral2(
-            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
-            typeArguments: AstTestFactory.typeArgumentList(
-                [AstTestFactory.typeName4('int')]),
-            elements: [AstTestFactory.integer(0)]));
-  }
-
-  void test_visitListLiteral2_withoutConst_withoutTypeArgs() {
-    _assertSource(
-        '[0]', astFactory.listLiteral2(elements: [AstTestFactory.integer(0)]));
-  }
-
-  void test_visitListLiteral2_withoutConst_withTypeArgs() {
-    _assertSource(
-        '<int>[0]',
-        astFactory.listLiteral2(
-            typeArguments: AstTestFactory.typeArgumentList(
-                [AstTestFactory.typeName4('int')]),
-            elements: [AstTestFactory.integer(0)]));
+                  expression: astFactory.listLiteral(
+                      null, null, null, [AstTestFactory.integer(0)], null))
+            ],
+            null));
   }
 
   void test_visitListLiteral_const() {
@@ -2701,81 +2678,56 @@
         ]));
   }
 
-  void test_visitMapLiteral2_complex() {
+  void test_visitListLiteral_withConst_withoutTypeArgs() {
     _assertSource(
-        "<String, String>{'a' : 'b', for (c in d) 'e' : 'f', if (g) 'h' : 'i', ...{'j' : 'k'}}",
-        astFactory.mapLiteral2(
-            typeArguments: AstTestFactory.typeArgumentList([
-              AstTestFactory.typeName4('String'),
-              AstTestFactory.typeName4('String')
-            ]),
-            entries: [
-              AstTestFactory.mapLiteralEntry3('a', 'b'),
-              astFactory.forElement(
-                  forLoopParts: astFactory.forEachPartsWithIdentifier(
-                      identifier: AstTestFactory.identifier3('c'),
-                      iterable: AstTestFactory.identifier3('d')),
-                  body: AstTestFactory.mapLiteralEntry3('e', 'f')),
-              astFactory.ifElement(
-                  condition: AstTestFactory.identifier3('g'),
-                  thenElement: AstTestFactory.mapLiteralEntry3('h', 'i')),
-              astFactory.spreadElement(
-                  spreadOperator: TokenFactory.tokenFromType(
-                      TokenType.PERIOD_PERIOD_PERIOD),
-                  expression: astFactory.mapLiteral2(
-                      entries: [AstTestFactory.mapLiteralEntry3('j', 'k')]))
-            ]));
+        'const [0]',
+        astFactory.listLiteral(TokenFactory.tokenFromKeyword(Keyword.CONST),
+            null, null, [AstTestFactory.integer(0)], null));
   }
 
-  void test_visitMapLiteral2_withConst_withoutTypeArgs() {
+  void test_visitListLiteral_withConst_withTypeArgs() {
     _assertSource(
-        "const {'a' : 'b'}",
-        astFactory.mapLiteral2(
-            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
-            entries: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+        'const <int>[0]',
+        astFactory.listLiteral(
+            TokenFactory.tokenFromKeyword(Keyword.CONST),
+            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            null,
+            [AstTestFactory.integer(0)],
+            null));
   }
 
-  void test_visitMapLiteral2_withConst_withTypeArgs() {
+  void test_visitListLiteral_withoutConst_withoutTypeArgs() {
     _assertSource(
-        "const <String, String>{'a' : 'b'}",
-        astFactory.mapLiteral2(
-            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
-            typeArguments: AstTestFactory.typeArgumentList([
-              AstTestFactory.typeName4('String'),
-              AstTestFactory.typeName4('String')
-            ]),
-            entries: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+        '[0]',
+        astFactory.listLiteral(
+            null, null, null, [AstTestFactory.integer(0)], null));
   }
 
-  void test_visitMapLiteral2_withoutConst_withoutTypeArgs() {
+  void test_visitListLiteral_withoutConst_withTypeArgs() {
     _assertSource(
-        "{'a' : 'b'}",
-        astFactory
-            .mapLiteral2(entries: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
-  }
-
-  void test_visitMapLiteral2_withoutConst_withTypeArgs() {
-    _assertSource(
-        "<String, String>{'a' : 'b'}",
-        astFactory.mapLiteral2(
-            typeArguments: AstTestFactory.typeArgumentList([
-              AstTestFactory.typeName4('String'),
-              AstTestFactory.typeName4('String')
-            ]),
-            entries: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+        '<int>[0]',
+        astFactory.listLiteral(
+            null,
+            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            null,
+            [AstTestFactory.integer(0)],
+            null));
   }
 
   void test_visitMapLiteral_const() {
+    // ignore: deprecated_member_use_from_same_package
     _assertSource("const {}", AstTestFactory.mapLiteral(Keyword.CONST, null));
   }
 
   void test_visitMapLiteral_empty() {
+    // ignore: deprecated_member_use_from_same_package
     _assertSource("{}", AstTestFactory.mapLiteral2());
   }
 
   void test_visitMapLiteral_nonEmpty() {
     _assertSource(
         "{'a' : a, 'b' : b, 'c' : c}",
+        // ignore: deprecated_member_use_from_same_package
         AstTestFactory.mapLiteral2([
           AstTestFactory.mapLiteralEntry("a", AstTestFactory.identifier3("a")),
           AstTestFactory.mapLiteralEntry("b", AstTestFactory.identifier3("b")),
@@ -3143,10 +3095,74 @@
     _assertSource(scriptTag, AstTestFactory.scriptTag(scriptTag));
   }
 
-  void test_visitSetLiteral2_complex() {
+  void test_visitSetOrMapLiteral_map_complex() {
+    _assertSource(
+        "<String, String>{'a' : 'b', for (c in d) 'e' : 'f', if (g) 'h' : 'i', ...{'j' : 'k'}}",
+        astFactory.setOrMapLiteral(
+            typeArguments: AstTestFactory.typeArgumentList([
+              AstTestFactory.typeName4('String'),
+              AstTestFactory.typeName4('String')
+            ]),
+            elements: [
+              AstTestFactory.mapLiteralEntry3('a', 'b'),
+              astFactory.forElement(
+                  forLoopParts: astFactory.forEachPartsWithIdentifier(
+                      identifier: AstTestFactory.identifier3('c'),
+                      iterable: AstTestFactory.identifier3('d')),
+                  body: AstTestFactory.mapLiteralEntry3('e', 'f')),
+              astFactory.ifElement(
+                  condition: AstTestFactory.identifier3('g'),
+                  thenElement: AstTestFactory.mapLiteralEntry3('h', 'i')),
+              astFactory.spreadElement(
+                  spreadOperator: TokenFactory.tokenFromType(
+                      TokenType.PERIOD_PERIOD_PERIOD),
+                  expression: astFactory.setOrMapLiteral(
+                      elements: [AstTestFactory.mapLiteralEntry3('j', 'k')]))
+            ]));
+  }
+
+  void test_visitSetOrMapLiteral_map_withConst_withoutTypeArgs() {
+    _assertSource(
+        "const {'a' : 'b'}",
+        astFactory.setOrMapLiteral(
+            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
+            elements: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+  }
+
+  void test_visitSetOrMapLiteral_map_withConst_withTypeArgs() {
+    _assertSource(
+        "const <String, String>{'a' : 'b'}",
+        astFactory.setOrMapLiteral(
+            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
+            typeArguments: AstTestFactory.typeArgumentList([
+              AstTestFactory.typeName4('String'),
+              AstTestFactory.typeName4('String')
+            ]),
+            elements: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+  }
+
+  void test_visitSetOrMapLiteral_map_withoutConst_withoutTypeArgs() {
+    _assertSource(
+        "{'a' : 'b'}",
+        astFactory.setOrMapLiteral(
+            elements: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+  }
+
+  void test_visitSetOrMapLiteral_map_withoutConst_withTypeArgs() {
+    _assertSource(
+        "<String, String>{'a' : 'b'}",
+        astFactory.setOrMapLiteral(
+            typeArguments: AstTestFactory.typeArgumentList([
+              AstTestFactory.typeName4('String'),
+              AstTestFactory.typeName4('String')
+            ]),
+            elements: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+  }
+
+  void test_visitSetOrMapLiteral_set_complex() {
     _assertSource(
         '<int>{0, for (e in l) 0, if (b) 1, ...[0]}',
-        astFactory.setLiteral2(
+        astFactory.setOrMapLiteral(
             typeArguments: AstTestFactory.typeArgumentList(
                 [AstTestFactory.typeName4('int')]),
             elements: [
@@ -3162,38 +3178,38 @@
               astFactory.spreadElement(
                   spreadOperator: TokenFactory.tokenFromType(
                       TokenType.PERIOD_PERIOD_PERIOD),
-                  expression: astFactory
-                      .listLiteral2(elements: [AstTestFactory.integer(0)]))
+                  expression: astFactory.listLiteral(
+                      null, null, null, [AstTestFactory.integer(0)], null))
             ]));
   }
 
-  void test_visitSetLiteral2_withConst_withoutTypeArgs() {
+  void test_visitSetOrMapLiteral_set_withConst_withoutTypeArgs() {
     _assertSource(
         'const {0}',
-        astFactory.setLiteral2(
+        astFactory.setOrMapLiteral(
             constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
             elements: [AstTestFactory.integer(0)]));
   }
 
-  void test_visitSetLiteral2_withConst_withTypeArgs() {
+  void test_visitSetOrMapLiteral_set_withConst_withTypeArgs() {
     _assertSource(
         'const <int>{0}',
-        astFactory.setLiteral2(
+        astFactory.setOrMapLiteral(
             constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
             typeArguments: AstTestFactory.typeArgumentList(
                 [AstTestFactory.typeName4('int')]),
             elements: [AstTestFactory.integer(0)]));
   }
 
-  void test_visitSetLiteral2_withoutConst_withoutTypeArgs() {
-    _assertSource(
-        '{0}', astFactory.setLiteral2(elements: [AstTestFactory.integer(0)]));
+  void test_visitSetOrMapLiteral_set_withoutConst_withoutTypeArgs() {
+    _assertSource('{0}',
+        astFactory.setOrMapLiteral(elements: [AstTestFactory.integer(0)]));
   }
 
-  void test_visitSetLiteral2_withoutConst_withTypeArgs() {
+  void test_visitSetOrMapLiteral_set_withoutConst_withTypeArgs() {
     _assertSource(
         '<int>{0}',
-        astFactory.setLiteral2(
+        astFactory.setOrMapLiteral(
             typeArguments: AstTestFactory.typeArgumentList(
                 [AstTestFactory.typeName4('int')]),
             elements: [AstTestFactory.integer(0)]));
@@ -3248,8 +3264,8 @@
         astFactory.spreadElement(
             spreadOperator:
                 TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD_PERIOD),
-            expression: astFactory
-                .listLiteral2(elements: [AstTestFactory.integer(0)])));
+            expression: astFactory.listLiteral(
+                null, null, null, [AstTestFactory.integer(0)], null)));
   }
 
   @failingTest
@@ -3261,8 +3277,8 @@
         astFactory.spreadElement(
             spreadOperator:
                 TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD_PERIOD),
-            expression: astFactory
-                .listLiteral2(elements: [AstTestFactory.integer(0)])));
+            expression: astFactory.listLiteral(
+                null, null, null, [AstTestFactory.integer(0)], null)));
   }
 
   void test_visitStringInterpolation() {
@@ -4503,29 +4519,30 @@
   void test_visitForEachStatement_variable() {
     _assertSource(
         "for (a in b) {}",
-        astFactory.forEachStatementWithReference(
-            null,
-            TokenFactory.tokenFromKeyword(Keyword.FOR),
-            TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
-            AstTestFactory.identifier3("a"),
-            TokenFactory.tokenFromKeyword(Keyword.IN),
-            AstTestFactory.identifier3("b"),
-            TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
-            AstTestFactory.block()));
+        astFactory.forStatement2(
+            forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
+            leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+            forLoopParts: astFactory.forEachPartsWithIdentifier(
+                identifier: AstTestFactory.identifier3("a"),
+                inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
+                iterable: AstTestFactory.identifier3("b")),
+            rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+            body: AstTestFactory.block()));
   }
 
   void test_visitForEachStatement_variable_await() {
     _assertSource(
         "await for (a in b) {}",
-        astFactory.forEachStatementWithReference(
-            TokenFactory.tokenFromString("await"),
-            TokenFactory.tokenFromKeyword(Keyword.FOR),
-            TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
-            AstTestFactory.identifier3("a"),
-            TokenFactory.tokenFromKeyword(Keyword.IN),
-            AstTestFactory.identifier3("b"),
-            TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
-            AstTestFactory.block()));
+        astFactory.forStatement2(
+            awaitKeyword: TokenFactory.tokenFromString("await"),
+            forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
+            leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+            forLoopParts: astFactory.forEachPartsWithIdentifier(
+                identifier: AstTestFactory.identifier3("a"),
+                inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
+                iterable: AstTestFactory.identifier3("b")),
+            rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+            body: AstTestFactory.block()));
   }
 
   void test_visitForElement() {
@@ -5307,13 +5324,14 @@
         AstTestFactory.libraryIdentifier([AstTestFactory.identifier3("a")]));
   }
 
-  void test_visitListLiteral2_complex() {
+  void test_visitListLiteral_complex() {
     _assertSource(
         '<int>[0, for (e in l) 0, if (b) 1, ...[0]]',
-        astFactory.listLiteral2(
-            typeArguments: AstTestFactory.typeArgumentList(
-                [AstTestFactory.typeName4('int')]),
-            elements: [
+        astFactory.listLiteral(
+            null,
+            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            null,
+            [
               AstTestFactory.integer(0),
               astFactory.forElement(
                   forLoopParts: astFactory.forEachPartsWithIdentifier(
@@ -5326,41 +5344,10 @@
               astFactory.spreadElement(
                   spreadOperator: TokenFactory.tokenFromType(
                       TokenType.PERIOD_PERIOD_PERIOD),
-                  expression: astFactory
-                      .listLiteral2(elements: [AstTestFactory.integer(0)]))
-            ]));
-  }
-
-  void test_visitListLiteral2_withConst_withoutTypeArgs() {
-    _assertSource(
-        'const [0]',
-        astFactory.listLiteral2(
-            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
-            elements: [AstTestFactory.integer(0)]));
-  }
-
-  void test_visitListLiteral2_withConst_withTypeArgs() {
-    _assertSource(
-        'const <int>[0]',
-        astFactory.listLiteral2(
-            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
-            typeArguments: AstTestFactory.typeArgumentList(
-                [AstTestFactory.typeName4('int')]),
-            elements: [AstTestFactory.integer(0)]));
-  }
-
-  void test_visitListLiteral2_withoutConst_withoutTypeArgs() {
-    _assertSource(
-        '[0]', astFactory.listLiteral2(elements: [AstTestFactory.integer(0)]));
-  }
-
-  void test_visitListLiteral2_withoutConst_withTypeArgs() {
-    _assertSource(
-        '<int>[0]',
-        astFactory.listLiteral2(
-            typeArguments: AstTestFactory.typeArgumentList(
-                [AstTestFactory.typeName4('int')]),
-            elements: [AstTestFactory.integer(0)]));
+                  expression: astFactory.listLiteral(
+                      null, null, null, [AstTestFactory.integer(0)], null))
+            ],
+            null));
   }
 
   void test_visitListLiteral_const() {
@@ -5381,68 +5368,40 @@
         ]));
   }
 
-  void test_visitMapLiteral2_complex() {
+  void test_visitListLiteral_withConst_withoutTypeArgs() {
     _assertSource(
-        "<String, String>{'a' : 'b', for (c in d) 'e' : 'f', if (g) 'h' : 'i', ...{'j' : 'k'}}",
-        astFactory.mapLiteral2(
-            typeArguments: AstTestFactory.typeArgumentList([
-              AstTestFactory.typeName4('String'),
-              AstTestFactory.typeName4('String')
-            ]),
-            entries: [
-              AstTestFactory.mapLiteralEntry3('a', 'b'),
-              astFactory.forElement(
-                  forLoopParts: astFactory.forEachPartsWithIdentifier(
-                      identifier: AstTestFactory.identifier3('c'),
-                      iterable: AstTestFactory.identifier3('d')),
-                  body: AstTestFactory.mapLiteralEntry3('e', 'f')),
-              astFactory.ifElement(
-                  condition: AstTestFactory.identifier3('g'),
-                  thenElement: AstTestFactory.mapLiteralEntry3('h', 'i')),
-              astFactory.spreadElement(
-                  spreadOperator: TokenFactory.tokenFromType(
-                      TokenType.PERIOD_PERIOD_PERIOD),
-                  expression: astFactory.mapLiteral2(
-                      entries: [AstTestFactory.mapLiteralEntry3('j', 'k')]))
-            ]));
+        'const [0]',
+        astFactory.listLiteral(TokenFactory.tokenFromKeyword(Keyword.CONST),
+            null, null, [AstTestFactory.integer(0)], null));
   }
 
-  void test_visitMapLiteral2_withConst_withoutTypeArgs() {
+  void test_visitListLiteral_withConst_withTypeArgs() {
     _assertSource(
-        "const {'a' : 'b'}",
-        astFactory.mapLiteral2(
-            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
-            entries: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+        'const <int>[0]',
+        astFactory.listLiteral(
+            TokenFactory.tokenFromKeyword(Keyword.CONST),
+            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            null,
+            [AstTestFactory.integer(0)],
+            null));
   }
 
-  void test_visitMapLiteral2_withConst_withTypeArgs() {
+  void test_visitListLiteral_withoutConst_withoutTypeArgs() {
     _assertSource(
-        "const <String, String>{'a' : 'b'}",
-        astFactory.mapLiteral2(
-            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
-            typeArguments: AstTestFactory.typeArgumentList([
-              AstTestFactory.typeName4('String'),
-              AstTestFactory.typeName4('String')
-            ]),
-            entries: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+        '[0]',
+        astFactory.listLiteral(
+            null, null, null, [AstTestFactory.integer(0)], null));
   }
 
-  void test_visitMapLiteral2_withoutConst_withoutTypeArgs() {
+  void test_visitListLiteral_withoutConst_withTypeArgs() {
     _assertSource(
-        "{'a' : 'b'}",
-        astFactory
-            .mapLiteral2(entries: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
-  }
-
-  void test_visitMapLiteral2_withoutConst_withTypeArgs() {
-    _assertSource(
-        "<String, String>{'a' : 'b'}",
-        astFactory.mapLiteral2(
-            typeArguments: AstTestFactory.typeArgumentList([
-              AstTestFactory.typeName4('String'),
-              AstTestFactory.typeName4('String')
-            ]),
-            entries: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+        '<int>[0]',
+        astFactory.listLiteral(
+            null,
+            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            null,
+            [AstTestFactory.integer(0)],
+            null));
   }
 
   void test_visitMapLiteral_const() {
@@ -5814,10 +5773,74 @@
     _assertSource(scriptTag, AstTestFactory.scriptTag(scriptTag));
   }
 
-  void test_visitSetLiteral2_complex() {
+  void test_visitSetOrMapLiteral_map_complex() {
+    _assertSource(
+        "<String, String>{'a' : 'b', for (c in d) 'e' : 'f', if (g) 'h' : 'i', ...{'j' : 'k'}}",
+        astFactory.setOrMapLiteral(
+            typeArguments: AstTestFactory.typeArgumentList([
+              AstTestFactory.typeName4('String'),
+              AstTestFactory.typeName4('String')
+            ]),
+            elements: [
+              AstTestFactory.mapLiteralEntry3('a', 'b'),
+              astFactory.forElement(
+                  forLoopParts: astFactory.forEachPartsWithIdentifier(
+                      identifier: AstTestFactory.identifier3('c'),
+                      iterable: AstTestFactory.identifier3('d')),
+                  body: AstTestFactory.mapLiteralEntry3('e', 'f')),
+              astFactory.ifElement(
+                  condition: AstTestFactory.identifier3('g'),
+                  thenElement: AstTestFactory.mapLiteralEntry3('h', 'i')),
+              astFactory.spreadElement(
+                  spreadOperator: TokenFactory.tokenFromType(
+                      TokenType.PERIOD_PERIOD_PERIOD),
+                  expression: astFactory.setOrMapLiteral(
+                      elements: [AstTestFactory.mapLiteralEntry3('j', 'k')]))
+            ]));
+  }
+
+  void test_visitSetOrMapLiteral_map_withConst_withoutTypeArgs() {
+    _assertSource(
+        "const {'a' : 'b'}",
+        astFactory.setOrMapLiteral(
+            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
+            elements: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+  }
+
+  void test_visitSetOrMapLiteral_map_withConst_withTypeArgs() {
+    _assertSource(
+        "const <String, String>{'a' : 'b'}",
+        astFactory.setOrMapLiteral(
+            constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
+            typeArguments: AstTestFactory.typeArgumentList([
+              AstTestFactory.typeName4('String'),
+              AstTestFactory.typeName4('String')
+            ]),
+            elements: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+  }
+
+  void test_visitSetOrMapLiteral_map_withoutConst_withoutTypeArgs() {
+    _assertSource(
+        "{'a' : 'b'}",
+        astFactory.setOrMapLiteral(
+            elements: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+  }
+
+  void test_visitSetOrMapLiteral_map_withoutConst_withTypeArgs() {
+    _assertSource(
+        "<String, String>{'a' : 'b'}",
+        astFactory.setOrMapLiteral(
+            typeArguments: AstTestFactory.typeArgumentList([
+              AstTestFactory.typeName4('String'),
+              AstTestFactory.typeName4('String')
+            ]),
+            elements: [AstTestFactory.mapLiteralEntry3('a', 'b')]));
+  }
+
+  void test_visitSetOrMapLiteral_set_complex() {
     _assertSource(
         '<int>{0, for (e in l) 0, if (b) 1, ...[0]}',
-        astFactory.setLiteral2(
+        astFactory.setOrMapLiteral(
             typeArguments: AstTestFactory.typeArgumentList(
                 [AstTestFactory.typeName4('int')]),
             elements: [
@@ -5833,38 +5856,38 @@
               astFactory.spreadElement(
                   spreadOperator: TokenFactory.tokenFromType(
                       TokenType.PERIOD_PERIOD_PERIOD),
-                  expression: astFactory
-                      .listLiteral2(elements: [AstTestFactory.integer(0)]))
+                  expression: astFactory.listLiteral(
+                      null, null, null, [AstTestFactory.integer(0)], null))
             ]));
   }
 
-  void test_visitSetLiteral2_withConst_withoutTypeArgs() {
+  void test_visitSetOrMapLiteral_set_withConst_withoutTypeArgs() {
     _assertSource(
         'const {0}',
-        astFactory.setLiteral2(
+        astFactory.setOrMapLiteral(
             constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
             elements: [AstTestFactory.integer(0)]));
   }
 
-  void test_visitSetLiteral2_withConst_withTypeArgs() {
+  void test_visitSetOrMapLiteral_set_withConst_withTypeArgs() {
     _assertSource(
         'const <int>{0}',
-        astFactory.setLiteral2(
+        astFactory.setOrMapLiteral(
             constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
             typeArguments: AstTestFactory.typeArgumentList(
                 [AstTestFactory.typeName4('int')]),
             elements: [AstTestFactory.integer(0)]));
   }
 
-  void test_visitSetLiteral2_withoutConst_withoutTypeArgs() {
-    _assertSource(
-        '{0}', astFactory.setLiteral2(elements: [AstTestFactory.integer(0)]));
+  void test_visitSetOrMapLiteral_set_withoutConst_withoutTypeArgs() {
+    _assertSource('{0}',
+        astFactory.setOrMapLiteral(elements: [AstTestFactory.integer(0)]));
   }
 
-  void test_visitSetLiteral2_withoutConst_withTypeArgs() {
+  void test_visitSetOrMapLiteral_set_withoutConst_withTypeArgs() {
     _assertSource(
         '<int>{0}',
-        astFactory.setLiteral2(
+        astFactory.setOrMapLiteral(
             typeArguments: AstTestFactory.typeArgumentList(
                 [AstTestFactory.typeName4('int')]),
             elements: [AstTestFactory.integer(0)]));
@@ -5919,8 +5942,8 @@
         astFactory.spreadElement(
             spreadOperator:
                 TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD_PERIOD),
-            expression: astFactory
-                .listLiteral2(elements: [AstTestFactory.integer(0)])));
+            expression: astFactory.listLiteral(
+                null, null, null, [AstTestFactory.integer(0)], null)));
   }
 
   @failingTest
@@ -5932,8 +5955,8 @@
         astFactory.spreadElement(
             spreadOperator:
                 TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD_PERIOD),
-            expression: astFactory
-                .listLiteral2(elements: [AstTestFactory.integer(0)])));
+            expression: astFactory.listLiteral(
+                null, null, null, [AstTestFactory.integer(0)], null)));
   }
 
   void test_visitStringInterpolation() {
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index fe9fbf9..f0e2140 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -799,7 +799,6 @@
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
     ..enabledExperiments = [
       EnableString.control_flow_collections,
-      EnableString.set_literals,
       EnableString.spread_collections
     ];
 
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 565ee2d..1abce89 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -9,8 +9,7 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/generated/engine.dart'
-    show AnalysisContext, AnalysisOptionsImpl;
+import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
@@ -18,10 +17,8 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../../generated/analysis_context_factory.dart'
-    show AnalysisContextHelper;
-import '../../../generated/resolver_test_case.dart';
 import '../../../generated/test_support.dart';
+import '../resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -29,7 +26,6 @@
     defineReflectiveTests(FieldElementImplTest);
     defineReflectiveTests(FunctionTypeImplTest);
     defineReflectiveTests(InterfaceTypeImplTest);
-    defineReflectiveTests(LocalVariableElementImplTest);
     defineReflectiveTests(TypeParameterTypeImplTest);
     defineReflectiveTests(VoidTypeImplTest);
     defineReflectiveTests(ClassElementImplTest);
@@ -37,9 +33,6 @@
     defineReflectiveTests(ElementLocationImplTest);
     defineReflectiveTests(ElementImplTest);
     defineReflectiveTests(LibraryElementImplTest);
-    defineReflectiveTests(MethodElementImplTest);
-    defineReflectiveTests(MethodMemberTest);
-    defineReflectiveTests(ParameterElementImplTest);
     defineReflectiveTests(PropertyAccessorElementImplTest);
     defineReflectiveTests(TopLevelVariableElementImplTest);
   });
@@ -872,34 +865,30 @@
   }
 }
 
-/// TODO(paulberry): migrate this test away from the task model.
-/// See dartbug.com/35734.
 @reflectiveTest
-class ElementAnnotationImplTest extends ResolverTestCase {
-  void test_computeConstantValue() {
-    addNamedSource('/a.dart', r'''
+class ElementAnnotationImplTest extends DriverResolutionTest {
+  test_computeConstantValue() async {
+    newFile('/test/lib/a.dart', content: r'''
 class A {
   final String f;
   const A(this.f);
 }
 void f(@A('x') int p) {}
 ''');
-    Source source = addSource(r'''
+    addTestFile(r'''
 import 'a.dart';
 main() {
   f(3);
 }
 ''');
-    LibraryElement library = resolve2(source);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    FunctionDeclaration main = unit.declarations[0];
-    BlockFunctionBody body = main.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    MethodInvocation invocation = statement.expression;
-    ParameterElement parameter =
-        invocation.argumentList.arguments[0].staticParameterElement;
+    await resolveTestFile();
+
+    var argument = findNode.integerLiteral('3');
+    ParameterElement parameter = argument.staticParameterElement;
+
     ElementAnnotation annotation = parameter.metadata[0];
     expect(annotation.constantValue, isNull);
+
     DartObject value = annotation.computeConstantValue();
     expect(value, isNotNull);
     expect(value.getField('f').toStringValue(), 'x');
@@ -1068,54 +1057,20 @@
   }
 }
 
-/// TODO(paulberry): migrate this test away from the task model.
-/// See dartbug.com/35734.
 @reflectiveTest
-class FieldElementImplTest extends EngineTestCase {
-  @deprecated
-  void test_computeNode() {
-    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
-    AnalysisContext context = contextHelper.context;
-    Source source = contextHelper.addSource("/test.dart", r'''
-class A {
-  int a;
-}
-enum B {B1, B2, B3}''');
-    // prepare CompilationUnitElement
-    LibraryElement libraryElement = context.computeLibraryElement(source);
-    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
-    // A
-    {
-      FieldElement elementA = unitElement.getType("A").getField('a');
-      VariableDeclaration nodeA = elementA.computeNode();
-      expect(nodeA, isNotNull);
-      expect(nodeA.name.name, "a");
-      expect(nodeA.declaredElement, same(elementA));
-    }
-    // B
-    {
-      FieldElement elementB = unitElement.getEnum("B").getField('B2');
-      EnumConstantDeclaration nodeB = elementB.computeNode();
-      expect(nodeB, isNotNull);
-      expect(nodeB.name.name, "B2");
-      expect(nodeB.declaredElement, same(elementB));
-    }
-  }
-
-  void test_isEnumConstant() {
-    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
-    AnalysisContext context = contextHelper.context;
-    Source source = contextHelper.addSource("/test.dart", r'''
+class FieldElementImplTest extends DriverResolutionTest {
+  test_isEnumConstant() async {
+    addTestFile(r'''
 enum B {B1, B2, B3}
 ''');
-    // prepare CompilationUnitElement
-    LibraryElement libraryElement = context.computeLibraryElement(source);
-    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
+    await resolveTestFile();
 
-    FieldElement b2Element = unitElement.getEnum("B").getField('B2');
+    var B = findElement.enum_('B');
+
+    FieldElement b2Element = B.getField('B2');
     expect(b2Element.isEnumConstant, isTrue);
 
-    FieldElement indexElement = unitElement.getEnum("B").getField('index');
+    FieldElement indexElement = B.getField('index');
     expect(indexElement.isEnumConstant, isFalse);
   }
 }
@@ -2045,6 +2000,38 @@
     _typeProvider = new TestTypeProvider();
   }
 
+  test_asInstanceOf_explicitGeneric() {
+    // class A<E> {}
+    // class B implements A<C> {}
+    // class C {}
+    ClassElementImpl classA = ElementFactory.classElement2('A', ['E']);
+    ClassElementImpl classB = ElementFactory.classElement2('B');
+    ClassElementImpl classC = ElementFactory.classElement2('C');
+    classB.interfaces = <InterfaceType>[
+      classA.type.instantiate([classC.type])
+    ];
+
+    InterfaceTypeImpl targetType = classB.type as InterfaceTypeImpl;
+    InterfaceType result = targetType.asInstanceOf(classA);
+    expect(result, classA.type.instantiate([classC.type]));
+  }
+
+  test_asInstanceOf_passThroughGeneric() {
+    // class A<E> {}
+    // class B<E> implements A<E> {}
+    ClassElementImpl classA = ElementFactory.classElement2('A', ['E']);
+    ClassElementImpl classB = ElementFactory.classElement2('B', ['E']);
+    ClassElementImpl classC = ElementFactory.classElement2('C');
+    classB.interfaces = <InterfaceType>[
+      classA.type.instantiate([classB.typeParameters[0].type])
+    ];
+
+    InterfaceTypeImpl targetType =
+        classB.type.instantiate([classC.type]) as InterfaceTypeImpl;
+    InterfaceType result = targetType.asInstanceOf(classA);
+    expect(result, classA.type.instantiate([classC.type]));
+  }
+
   void test_computeLongestInheritancePathToObject_multipleInterfacePaths() {
     //
     //   Object
@@ -3674,214 +3661,6 @@
 }
 
 @reflectiveTest
-class LocalVariableElementImplTest extends EngineTestCase {}
-
-/// TODO(paulberry): migrate this test away from the task model.
-/// See dartbug.com/35734.
-@reflectiveTest
-class MethodElementImplTest extends EngineTestCase {
-  @deprecated
-  void test_computeNode() {
-    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
-    AnalysisContext context = contextHelper.context;
-    Source source = contextHelper.addSource("/test.dart", r'''
-abstract class A {
-  String m1() => null;
-  m2();
-}
-''');
-    // prepare CompilationUnitElement
-    LibraryElement libraryElement = context.computeLibraryElement(source);
-    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
-    // m1
-    {
-      MethodElement m1Element = unitElement.getType("A").getMethod('m1');
-      MethodDeclaration m1Node = m1Element.computeNode();
-      expect(m1Node, isNotNull);
-      expect(m1Node.name.name, "m1");
-      expect(m1Node.declaredElement, same(m1Element));
-    }
-    // m2
-    {
-      MethodElement m2Element = unitElement.getType("A").getMethod('m2');
-      MethodDeclaration m2Node = m2Element.computeNode();
-      expect(m2Node, isNotNull);
-      expect(m2Node.name.name, "m2");
-      expect(m2Node.declaredElement, same(m2Element));
-    }
-  }
-
-  @deprecated
-  void test_computeNode_withoutFunctionBody() {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.analyzeFunctionBodies = false;
-    AnalysisContextHelper contextHelper = new AnalysisContextHelper(options);
-    AnalysisContext context = contextHelper.context;
-    Source source = contextHelper.addSource("/test.dart", r'''
-abstract class A {
-  String m1() => null;
-  m2();
-}
-''');
-    // prepare CompilationUnitElement
-    LibraryElement libraryElement = context.computeLibraryElement(source);
-    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
-    // m1
-    {
-      MethodElement m1Element = unitElement.getType("A").getMethod('m1');
-      MethodDeclaration m1Node = m1Element.computeNode();
-      expect(m1Node, isNotNull);
-      expect(m1Node.name.name, "m1");
-      expect(m1Node.declaredElement, same(m1Element));
-    }
-    // m2
-    {
-      MethodElement m2Element = unitElement.getType("A").getMethod('m2');
-      MethodDeclaration m2Node = m2Element.computeNode();
-      expect(m2Node, isNotNull);
-      expect(m2Node.name.name, "m2");
-      expect(m2Node.declaredElement, same(m2Element));
-    }
-  }
-}
-
-/// TODO(paulberry): migrate this test away from the task model.
-/// See dartbug.com/35734.
-@reflectiveTest
-class MethodMemberTest extends EngineTestCase {
-  /**
-   * The type provider used to access the types.
-   */
-  TestTypeProvider _typeProvider;
-
-  @override
-  void setUp() {
-    super.setUp();
-    _typeProvider = new TestTypeProvider();
-  }
-
-  void test_getReifiedType_substituteFor() {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.analyzeFunctionBodies = false;
-    AnalysisContextHelper contextHelper = new AnalysisContextHelper(options);
-    AnalysisContext context = contextHelper.context;
-    Source source = contextHelper.addSource("/test.dart", r'''
-class A<T> {
-  T f(T x) => x;
-}
-class B<S> extends A<S> {
-  S f(S x) => x;
-}
-''');
-    // prepare CompilationUnitElement
-    LibraryElement libraryElement = context.computeLibraryElement(source);
-    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
-    DartType objectType = _typeProvider.objectType;
-    // B.f
-    ClassElement elementB = unitElement.getType("B");
-    MethodElement BfElement = elementB.type
-        .lookUpInheritedMethod("f", library: libraryElement, thisType: true);
-    MethodElement AfElement = elementB.type
-        .lookUpInheritedMethod("f", library: libraryElement, thisType: false);
-    expect(
-        // ignore: deprecated_member_use_from_same_package
-        BfElement.getReifiedType(objectType),
-        // ignore: deprecated_member_use_from_same_package
-        equals(AfElement.getReifiedType(objectType)));
-  }
-}
-
-/// TODO(paulberry): migrate this test away from the task model.
-/// See dartbug.com/35734.
-@reflectiveTest
-class ParameterElementImplTest extends EngineTestCase {
-  @deprecated
-  void test_computeNode_DefaultFormalParameter() {
-    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
-    AnalysisContext context = contextHelper.context;
-    Source source = contextHelper.addSource("/test.dart", r'''
-main([int p = 42]) {
-}''');
-    // prepare CompilationUnitElement
-    LibraryElement libraryElement = context.computeLibraryElement(source);
-    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
-    // p
-    {
-      ParameterElement element = unitElement.functions[0].parameters[0];
-      DefaultFormalParameter node = element.computeNode();
-      expect(node, isNotNull);
-      expect(node.identifier.name, 'p');
-      expect(node.declaredElement, same(element));
-    }
-  }
-
-  @deprecated
-  void test_computeNode_FieldFormalParameter() {
-    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
-    AnalysisContext context = contextHelper.context;
-    Source source = contextHelper.addSource("/test.dart", r'''
-class A {
-  int p;
-  A(this.p) {
-  }
-}''');
-    // prepare CompilationUnitElement
-    LibraryElement libraryElement = context.computeLibraryElement(source);
-    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
-    // p
-    {
-      ClassElement classA = unitElement.types[0];
-      ConstructorElement constructorA = classA.constructors[0];
-      FieldFormalParameterElement element = constructorA.parameters[0];
-      FieldFormalParameter node = element.computeNode();
-      expect(node, isNotNull);
-      expect(node.identifier.name, 'p');
-      expect(node.declaredElement, same(element));
-    }
-  }
-
-  @deprecated
-  void test_computeNode_FunctionTypedFormalParameter() {
-    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
-    AnalysisContext context = contextHelper.context;
-    Source source = contextHelper.addSource("/test.dart", r'''
-main(p(int a, int b)) {
-}''');
-    // prepare CompilationUnitElement
-    LibraryElement libraryElement = context.computeLibraryElement(source);
-    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
-    // p
-    {
-      ParameterElement element = unitElement.functions[0].parameters[0];
-      FunctionTypedFormalParameter node = element.computeNode();
-      expect(node, isNotNull);
-      expect(node.identifier.name, 'p');
-      expect(node.declaredElement, same(element));
-    }
-  }
-
-  @deprecated
-  void test_computeNode_SimpleFormalParameter() {
-    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
-    AnalysisContext context = contextHelper.context;
-    Source source = contextHelper.addSource("/test.dart", r'''
-main(int p) {
-}''');
-    // prepare CompilationUnitElement
-    LibraryElement libraryElement = context.computeLibraryElement(source);
-    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
-    // p
-    {
-      ParameterElement element = unitElement.functions[0].parameters[0];
-      SimpleFormalParameter node = element.computeNode();
-      expect(node, isNotNull);
-      expect(node.identifier.name, 'p');
-      expect(node.declaredElement, same(element));
-    }
-  }
-}
-
-@reflectiveTest
 class PropertyAccessorElementImplTest extends EngineTestCase {
   void test_matchesHandle_getter() {
     CompilationUnitElementImpl compilationUnitElement =
@@ -3926,30 +3705,25 @@
   }
 }
 
-/// TODO(paulberry): migrate this test away from the task model.
-/// See dartbug.com/35734.
 @reflectiveTest
-class TopLevelVariableElementImplTest extends ResolverTestCase {
-  void test_computeConstantValue() {
-    addNamedSource('/a.dart', r'''
+class TopLevelVariableElementImplTest extends DriverResolutionTest {
+  test_computeConstantValue() async {
+    newFile('/test/lib/a.dart', content: r'''
 const int C = 42;
 ''');
-    Source source = addSource(r'''
+    addTestFile(r'''
 import 'a.dart';
 main() {
   print(C);
 }
 ''');
-    LibraryElement library = resolve2(source);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    FunctionDeclaration main = unit.declarations[0];
-    BlockFunctionBody body = main.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    MethodInvocation invocation = statement.expression;
-    SimpleIdentifier argument = invocation.argumentList.arguments[0];
+    await resolveTestFile();
+
+    SimpleIdentifier argument = findNode.simple('C);');
     PropertyAccessorElementImpl getter = argument.staticElement;
     TopLevelVariableElement constant = getter.variable;
     expect(constant.constantValue, isNull);
+
     DartObject value = constant.computeConstantValue();
     expect(value, isNotNull);
     expect(value.toIntValue(), 42);
diff --git a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
index 8e1a8a1..4d0fd0f 100644
--- a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
@@ -160,7 +160,7 @@
     var cascade = findNode.cascade('<int, double>');
     assertType(cascade, 'Map<int, double>');
 
-    MapLiteral map = cascade.target;
+    SetOrMapLiteral map = cascade.target;
     assertType(map, 'Map<int, double>');
     assertTypeName(map.typeArguments.arguments[0], intElement, 'int');
     assertTypeName(map.typeArguments.arguments[1], doubleElement, 'double');
diff --git a/pkg/analyzer/test/src/dart/resolution/definite_assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/definite_assignment_test.dart
index 48a15c7..5e163c0 100644
--- a/pkg/analyzer/test/src/dart/resolution/definite_assignment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/definite_assignment_test.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/resolver/definite_assignment.dart';
+import 'package:analyzer/src/test_utilities/package_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -19,7 +20,8 @@
 }
 
 @reflectiveTest
-class DefiniteAssignmentTrackerTest extends DriverResolutionTest {
+class DefiniteAssignmentTrackerTest extends DriverResolutionTest
+    with PackageMixin {
   DefiniteAssignmentTracker tracker;
 
   /// Assert that only local variables with the given names are marked as read
@@ -1319,77 +1321,35 @@
   }
 
   @override
-  void visitForEachStatement(ForEachStatement node) {
-    var iterable = node.iterable;
-    var body = node.body;
-
-    tracker.beginForEachStatement(node);
-    iterable.accept(this);
-
-    tracker.beginForEachStatementBody();
-    body.accept(this);
-
-    tracker.endForEachStatement();
-  }
-
-  @override
-  void visitForStatement(ForStatement node) {
-    var variables = node.variables;
-    var initialization = node.initialization;
-
-    var condition = node.condition;
-    var updaters = node.updaters;
-    var body = node.body;
-
-    tracker.beginForStatement(node);
-
-    variables?.accept(this);
-    initialization?.accept(this);
-    condition?.accept(this);
-
-    tracker.beginForStatementBody();
-    body?.accept(this);
-
-    tracker.beginForStatementUpdaters();
-    updaters?.accept(this);
-
-    tracker.endForStatement();
-  }
-
-  @override
   void visitForStatement2(ForStatement2 node) {
     var parts = node.forLoopParts;
-    VariableDeclarationList variables;
-    Expression initialization;
-    Expression condition;
-    Expression iterable;
-    NodeList<Expression> updaters;
-    if (parts is ForPartsWithDeclarations) {
-      variables = parts.variables;
-      condition = parts.condition;
-      updaters = parts.updaters;
-    } else if (parts is ForPartsWithExpression) {
-      initialization = parts.initialization;
-      condition = parts.condition;
-      updaters = parts.updaters;
-    } else if (parts is ForEachParts) {
-      iterable = parts.iterable;
-    }
 
     tracker.beginForStatement2(node);
 
-    variables?.accept(this);
-    initialization?.accept(this);
-    condition?.accept(this);
-    iterable?.accept(this);
+    if (parts is ForParts) {
+      if (parts is ForPartsWithDeclarations) {
+        parts.variables?.accept(this);
+      } else if (parts is ForPartsWithExpression) {
+        parts.initialization?.accept(this);
+      } else {
+        throw new StateError('Unrecognized for loop parts');
+      }
+      parts.condition?.accept(this);
+    } else if (parts is ForEachParts) {
+      parts.iterable.accept(this);
+    } else {
+      throw new StateError('Unrecognized for loop parts');
+    }
 
-    tracker.beginForStatementBody();
+    tracker.beginForStatement2Body();
     node.body?.accept(this);
 
-    tracker.beginForStatementUpdaters();
-    updaters?.accept(this);
+    if (parts is ForParts) {
+      tracker.beginForStatementUpdaters();
+      parts.updaters?.accept(this);
+    }
 
-    tracker.endForStatement();
+    tracker.endForStatement2();
   }
 
   @override
@@ -1538,8 +1498,7 @@
   AstNode _getLabelTarget(AstNode node, LabelElement element) {
     for (; node != null; node = node.parent) {
       if (node is DoStatement ||
-          node is ForEachStatement ||
-          node is ForStatement ||
+          node is ForStatement2 ||
           node is SwitchStatement ||
           node is WhileStatement) {
         if (element == null) {
diff --git a/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart b/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart
index 50902ca..39405f2 100644
--- a/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart
@@ -27,20 +27,13 @@
   PerformanceLog logger;
 
   DartSdk sdk;
+  Map<String, List<Folder>> packageMap;
   AnalysisDriverScheduler scheduler;
   AnalysisDriver driver;
 
   /// Override this to change the analysis options for a given set of tests.
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl();
 
-  void addMetaPackage() {
-    newFile('/.pub-cache/meta/lib/meta.dart', content: r'''
-library meta;
-
-const alwaysThrows = const Object();
-''');
-  }
-
   @override
   Future<ResolvedUnitResult> resolveFile(String path) async {
     return await driver.getResult(path);
@@ -51,7 +44,9 @@
     logger = new PerformanceLog(logBuffer);
     scheduler = new AnalysisDriverScheduler(logger);
 
-    Map<String, List<Folder>> packageMap = <String, List<Folder>>{
+    // TODO(brianwilkerson) Create an empty package map by default and only add
+    //  packages in the tests that need them.
+    packageMap = <String, List<Folder>>{
       'test': [getFolder('/test/lib')],
       'aaa': [getFolder('/aaa/lib')],
       'bbb': [getFolder('/bbb/lib')],
diff --git a/pkg/analyzer/test/src/dart/resolution/flow_analysis_test.dart b/pkg/analyzer/test/src/dart/resolution/flow_analysis_test.dart
index 4c7daeb..236303f 100644
--- a/pkg/analyzer/test/src/dart/resolution/flow_analysis_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/flow_analysis_test.dart
@@ -9,7 +9,9 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_system.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -20,6 +22,7 @@
     defineReflectiveTests(NullableFlowTest);
     defineReflectiveTests(DefiniteAssignmentFlowTest);
     defineReflectiveTests(ReachableFlowTest);
+    defineReflectiveTests(ReachableFlowTest_SpreadCollections);
     defineReflectiveTests(TypePromotionFlowTest);
   });
 }
@@ -2115,6 +2118,13 @@
 }
 
 @reflectiveTest
+class ReachableFlowTest_SpreadCollections extends ReachableFlowTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => new AnalysisOptionsImpl()
+    ..enabledExperiments = [EnableString.spread_collections];
+}
+
+@reflectiveTest
 class TypePromotionFlowTest extends DriverResolutionTest {
   final Map<AstNode, DartType> promotedTypes = {};
 
@@ -2947,27 +2957,34 @@
   }
 
   @override
-  void visitForEachStatement(ForEachStatement node) {
-    var iterable = node.iterable;
-    var body = node.body;
+  void visitForStatement2(ForStatement2 node) {
+    var forLoopParts = node.forLoopParts;
+    if (forLoopParts is ForParts) {
+      if (forLoopParts is ForPartsWithExpression) {
+        forLoopParts.initialization?.accept(this);
+      } else if (forLoopParts is ForPartsWithDeclarations) {
+        forLoopParts.variables?.accept(this);
+      } else {
+        throw new StateError('Unrecognized for loop parts');
+      }
 
-    iterable.accept(this);
+      assignedVariables.beginLoop();
+      forLoopParts.condition?.accept(this);
+      node.body.accept(this);
+      forLoopParts.updaters?.accept(this);
+      assignedVariables.endLoop(node);
+    } else if (forLoopParts is ForEachParts) {
+      var iterable = forLoopParts.iterable;
+      var body = node.body;
 
-    assignedVariables.beginLoop();
-    body.accept(this);
-    assignedVariables.endLoop(node);
-  }
+      iterable.accept(this);
 
-  @override
-  void visitForStatement(ForStatement node) {
-    node.initialization?.accept(this);
-    node.variables?.accept(this);
-
-    assignedVariables.beginLoop();
-    node.condition?.accept(this);
-    node.body.accept(this);
-    node.updaters?.accept(this);
-    assignedVariables.endLoop(node);
+      assignedVariables.beginLoop();
+      body.accept(this);
+      assignedVariables.endLoop(node);
+    } else {
+      throw new StateError('Unrecognized for loop parts');
+    }
   }
 
   @override
@@ -3215,47 +3232,9 @@
   }
 
   @override
-  void visitForEachStatement(ForEachStatement node) {
-    _checkUnreachableNode(node);
-
-    var iterable = node.iterable;
-    var body = node.body;
-
-    iterable.accept(this);
-    flow.forEachStatement_bodyBegin(assignedVariables[node]);
-
-    body.accept(this);
-
-    flow.forEachStatement_end();
-  }
-
-  @override
-  void visitForStatement(ForStatement node) {
-    _checkUnreachableNode(node);
-
-    var condition = node.condition;
-
-    node.initialization?.accept(this);
-    node.variables?.accept(this);
-
-    flow.forStatement_conditionBegin(assignedVariables[node]);
-    if (condition != null) {
-      condition.accept(this);
-    } else {
-      flow.trueLiteral(trueLiteral);
-    }
-
-    flow.forStatement_bodyBegin(node, condition ?? trueLiteral);
-    node.body.accept(this);
-
-    flow.forStatement_updaterBegin();
-    node.updaters?.accept(this);
-
-    flow.forStatement_end();
-  }
-
-  @override
   void visitForStatement2(ForStatement2 node) {
+    _checkUnreachableNode(node);
+
     ForLoopParts parts = node.forLoopParts;
     if (parts is ForEachParts) {
       parts.iterable?.accept(this);
@@ -3516,8 +3495,7 @@
   AstNode _getLabelTarget(AstNode node, LabelElement element) {
     for (; node != null; node = node.parent) {
       if (node is DoStatement ||
-          node is ForEachStatement ||
-          node is ForStatement ||
+          node is ForStatement2 ||
           node is SwitchStatement ||
           node is WhileStatement) {
         if (element == null) {
diff --git a/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart b/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart
index 0616164..e1704c6 100644
--- a/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -11,13 +12,13 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonNullableTest);
+    defineReflectiveTests(NullableTest);
   });
 }
 
 @reflectiveTest
 class NonNullableTest extends DriverResolutionTest {
-  static const _migrated = "@pragma('analyzer:non-nullable') library test;";
-
+  // TODO(danrubel): Implement a more fine grained way to specify non-nullable.
   @override
   AnalysisOptionsImpl get analysisOptions =>
       AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
@@ -25,6 +26,134 @@
   @override
   bool get typeToStringWithNullability => true;
 
+  test_local_parameter_interfaceType() async {
+    addTestFile('''
+main() {
+  f(int? a, int b) {}
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('int? a'), 'int?');
+    assertType(findNode.typeName('int b'), 'int!');
+  }
+
+  test_local_returnType_interfaceType() async {
+    addTestFile('''
+main() {
+  int? f() => 0;
+  int g() => 0;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('int? f'), 'int?');
+    assertType(findNode.typeName('int g'), 'int!');
+  }
+
+  @failingTest
+  test_local_variable_genericFunctionType() async {
+    addTestFile('''
+main() {
+  int? Function(bool, String?)? a;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(
+      findNode.genericFunctionType('Function('),
+      '(bool!, String?) → int??',
+    );
+  }
+
+  test_local_variable_interfaceType() async {
+    addTestFile('''
+main() {
+  int? a = 0;
+  int b = 0;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('int? a'), 'int?');
+    assertType(findNode.typeName('int b'), 'int!');
+  }
+
+  test_local_variable_interfaceType_generic() async {
+    addTestFile('''
+main() {
+  List<int?>? a = [];
+  List<int>? b = [];
+  List<int?> c = [];
+  List<int> d = [];
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('List<int?>? a'), 'List<int?>?');
+    assertType(findNode.typeName('List<int>? b'), 'List<int!>?');
+    assertType(findNode.typeName('List<int?> c'), 'List<int?>!');
+    assertType(findNode.typeName('List<int> d'), 'List<int!>!');
+  }
+
+  test_local_variable_typeParameter() async {
+    addTestFile('''
+class A<T> {
+  main(T a) {
+    T? b;
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('T a'), 'T!');
+    assertType(findNode.typeName('T? b'), 'T?');
+  }
+
+  test_typedef_classic() async {
+    addTestFile('''
+typedef int? F(bool a, String? b);
+
+main() {
+  F? a;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('F? a'), '(bool!, String?) → int??');
+  }
+
+  @failingTest
+  test_typedef_function() async {
+    addTestFile('''
+typedef F<T> = int? Function(bool, T, T?);
+
+main() {
+  F<String>? a;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(
+      findNode.typeName('F<String>'),
+      '(bool!, String!, String?) → int??',
+    );
+  }
+}
+
+@reflectiveTest
+class NullableTest extends DriverResolutionTest {
+  @override
+  bool get typeToStringWithNullability => true;
+
   test_class_hierarchy() async {
     addTestFile('''
 class A {}
@@ -57,86 +186,6 @@
     assertType(findNode.typeName('C;'), 'C!');
   }
 
-  test_local_parameter_interfaceType() async {
-    addTestFile('''
-$_migrated
-main() {
-  f(int? a, int b) {}
-}
-''');
-    await resolveTestFile();
-    assertNoTestErrors();
-
-    assertType(findNode.typeName('int? a'), 'int?');
-    assertType(findNode.typeName('int b'), 'int!');
-  }
-
-  test_local_returnType_interfaceType() async {
-    addTestFile('''
-$_migrated
-main() {
-  int? f() => 0;
-  int g() => 0;
-}
-''');
-    await resolveTestFile();
-    assertNoTestErrors();
-
-    assertType(findNode.typeName('int? f'), 'int?');
-    assertType(findNode.typeName('int g'), 'int!');
-  }
-
-  @failingTest
-  test_local_variable_genericFunctionType() async {
-    addTestFile('''
-$_migrated
-main() {
-  int? Function(bool, String?)? a;
-}
-''');
-    await resolveTestFile();
-    assertNoTestErrors();
-
-    assertType(
-      findNode.genericFunctionType('Function('),
-      '(bool!, String?) → int??',
-    );
-  }
-
-  test_local_variable_interfaceType() async {
-    addTestFile('''
-$_migrated
-main() {
-  int? a = 0;
-  int b = 0;
-}
-''');
-    await resolveTestFile();
-    assertNoTestErrors();
-
-    assertType(findNode.typeName('int? a'), 'int?');
-    assertType(findNode.typeName('int b'), 'int!');
-  }
-
-  test_local_variable_interfaceType_generic() async {
-    addTestFile('''
-$_migrated
-main() {
-  List<int?>? a = [];
-  List<int>? b = [];
-  List<int?> c = [];
-  List<int> d = [];
-}
-''');
-    await resolveTestFile();
-    assertNoTestErrors();
-
-    assertType(findNode.typeName('List<int?>? a'), 'List<int?>?');
-    assertType(findNode.typeName('List<int>? b'), 'List<int!>?');
-    assertType(findNode.typeName('List<int?> c'), 'List<int?>!');
-    assertType(findNode.typeName('List<int> d'), 'List<int!>!');
-  }
-
   test_local_variable_interfaceType_notMigrated() async {
     addTestFile('''
 main() {
@@ -145,29 +194,12 @@
 }
 ''');
     await resolveTestFile();
-    assertNoTestErrors();
+    assertTestErrors([ParserErrorCode.EXPERIMENT_NOT_ENABLED]);
 
-    assertType(findNode.typeName('int? a'), 'int?');
+    assertType(findNode.typeName('int? a'), 'int*');
     assertType(findNode.typeName('int b'), 'int*');
   }
 
-  test_local_variable_typeParameter() async {
-    addTestFile('''
-$_migrated
-
-class A<T> {
-  main(T a) {
-    T? b;
-  }
-}
-''');
-    await resolveTestFile();
-    assertNoTestErrors();
-
-    assertType(findNode.typeName('T a'), 'T!');
-    assertType(findNode.typeName('T? b'), 'T?');
-  }
-
   test_mixin_hierarchy() async {
     addTestFile('''
 class A {}
@@ -181,40 +213,4 @@
     assertType(findNode.typeName('A {} // 1'), 'A!');
     assertType(findNode.typeName('A {} // 2'), 'A!');
   }
-
-  test_typedef_classic() async {
-    addTestFile('''
-$_migrated
-
-typedef int? F(bool a, String? b);
-
-main() {
-  F? a;
-}
-''');
-    await resolveTestFile();
-    assertNoTestErrors();
-
-    assertType(findNode.typeName('F? a'), '(bool!, String?) → int??');
-  }
-
-  @failingTest
-  test_typedef_function() async {
-    addTestFile('''
-$_migrated
-
-typedef F<T> = int? Function(bool, T, T?);
-
-main() {
-  F<String>? a;
-}
-''');
-    await resolveTestFile();
-    assertNoTestErrors();
-
-    assertType(
-      findNode.typeName('F<String>'),
-      '(bool!, String!, String?) → int??',
-    );
-  }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index d8c0076..71d5075 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -24,6 +24,7 @@
 import 'optional_const_test.dart' as optional_const_test;
 import 'property_access_test.dart' as property_access_test;
 import 'top_type_inference_test.dart' as top_type_inference_test;
+import 'type_inference/test_all.dart' as type_inference;
 
 main() {
   defineReflectiveSuite(() {
@@ -45,5 +46,6 @@
     optional_const_test.main();
     property_access_test.main();
     top_type_inference_test.main();
+    type_inference.main();
   }, name: 'resolution');
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
new file mode 100644
index 0000000..2f0f5a8
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
@@ -0,0 +1,248 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ListLiteralTest);
+    defineReflectiveTests(ListLiteralWithFlowControlAndSpreadCollectionsTest);
+  });
+}
+
+@reflectiveTest
+class ListLiteralTest extends DriverResolutionTest {
+  test_context_noTypeArgs_expression_conflict() async {
+    addTestFile('''
+List<int> a = ['a'];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<int>');
+  }
+
+  test_context_noTypeArgs_expression_noConflict() async {
+    addTestFile('''
+List<int> a = [1];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<int>');
+  }
+
+  test_context_noTypeArgs_noElements() async {
+    addTestFile('''
+List<String> a = [];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<String>');
+  }
+
+  test_context_typeArgs_expression_conflict() async {
+    addTestFile('''
+List<String> a = <String>[0];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<String>');
+  }
+
+  test_context_typeArgs_expression_noConflict() async {
+    addTestFile('''
+List<String> a = <String>['a'];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<String>');
+  }
+
+  test_context_typeArgs_noElements_conflict() async {
+    addTestFile('''
+List<String> a = <int>[];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<int>');
+  }
+
+  test_context_typeArgs_noElements_noConflict() async {
+    addTestFile('''
+List<String> a = <String>[];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<String>');
+  }
+
+  test_noContext_noTypeArgs_expressions_conflict() async {
+    addTestFile('''
+var a = [1, '2', 3];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<Object>');
+  }
+
+  test_noContext_noTypeArgs_expressions_noConflict() async {
+    addTestFile('''
+var a = [1, 2, 3];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<int>');
+  }
+
+  test_noContext_noTypeArgs_noElements() async {
+    addTestFile('''
+var a = [];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<dynamic>');
+  }
+
+  test_noContext_typeArgs_expression_conflict() async {
+    addTestFile('''
+var a = <String>[1];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<String>');
+  }
+
+  test_noContext_typeArgs_expression_noConflict() async {
+    addTestFile('''
+var a = <int>[1];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<int>');
+  }
+
+  test_noContext_typeArgs_noElements() async {
+    addTestFile('''
+var a = <num>[];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<num>');
+  }
+}
+
+@reflectiveTest
+class ListLiteralWithFlowControlAndSpreadCollectionsTest
+    extends ListLiteralTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections
+    ];
+
+  test_noContext_noTypeArgs_forEachWithDeclaration() async {
+    addTestFile('''
+var c = [1, 2, 3];
+var a = [for (int e in c) e * 2];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('[for'), 'List<int>');
+  }
+
+  test_noContext_noTypeArgs_forEachWithIdentifier() async {
+    addTestFile('''
+var c = [1, 2, 3];
+int b;
+var a = [for (b in c) b * 2];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('[for'), 'List<int>');
+  }
+
+  test_noContext_noTypeArgs_forWithDeclaration() async {
+    addTestFile('''
+var a = [for (var i = 0; i < 2; i++) i * 2];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('[for'), 'List<int>');
+  }
+
+  test_noContext_noTypeArgs_forWithExpression() async {
+    addTestFile('''
+int i;
+var a = [for (i = 0; i < 2; i++) i * 2];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('[for'), 'List<int>');
+  }
+
+  test_noContext_noTypeArgs_if() async {
+    addTestFile('''
+var c = true;
+var a = [if (c) 1];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<int>');
+  }
+
+  test_noContext_noTypeArgs_ifElse_conflict() async {
+    addTestFile('''
+var c = true;
+var a = [if (c) 1 else '2'];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<Object>');
+  }
+
+  test_noContext_noTypeArgs_ifElse_noConflict() async {
+    addTestFile('''
+var c = true;
+var a = [if (c) 1 else 2];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<int>');
+  }
+
+  test_noContext_noTypeArgs_spread() async {
+    addTestFile('''
+var c = [1, 2, 3];
+var a = [...c];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('[...'), 'List<int>');
+  }
+
+  test_noContext_noTypeArgs_spread_conflict() async {
+    addTestFile('''
+var c = [1];
+var b = ['a'];
+var a = [...b, ...c];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('[...'), 'List<Object>');
+  }
+
+  test_noContext_noTypeArgs_spread_noConflict() async {
+    addTestFile('''
+var c = [1];
+var b = [2];
+var a = [...b, ...c];
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('[...'), 'List<int>');
+  }
+
+  test_noContext_noTypeArgs_spread_onlyNull() async {
+    addTestFile('''
+f() {
+  var futureNull = Future.value(null);
+  var a = [...?await futureNull];
+}
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<dynamic>');
+  }
+
+  test_noContext_noTypeArgs_spread_nullAndNotNull() async {
+    addTestFile('''
+f() {
+  var futureNull = Future.value(null);
+  var a = [1, ...?await futureNull, 2];
+}
+''');
+    await resolveTestFile();
+    assertType(findNode.listLiteral('['), 'List<int>');
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
new file mode 100644
index 0000000..e796c8e
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
@@ -0,0 +1,248 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MapLiteralTest);
+    defineReflectiveTests(MapLiteralWithFlowControlAndSpreadCollectionsTest);
+  });
+}
+
+@reflectiveTest
+class MapLiteralTest extends DriverResolutionTest {
+  AstNode setOrMapLiteral(String search) => findNode.setOrMapLiteral(search);
+
+  test_context_noTypeArgs_entry_conflict() async {
+    addTestFile('''
+Map<int, int> a = {'a' : 1};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<int, int>');
+  }
+
+  test_context_noTypeArgs_entry_noConflict() async {
+    addTestFile('''
+Map<int, int> a = {1 : 2};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<int, int>');
+  }
+
+  test_context_noTypeArgs_noEntries() async {
+    addTestFile('''
+Map<String, String> a = {};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<String, String>');
+  }
+
+  test_context_typeArgs_entry_conflict() async {
+    addTestFile('''
+Map<String, String> a = <String, String>{0 : 'a'};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<String, String>');
+  }
+
+  test_context_typeArgs_entry_noConflict() async {
+    addTestFile('''
+Map<String, String> a = <String, String>{'a' : 'b'};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<String, String>');
+  }
+
+  test_context_typeArgs_noEntries_conflict() async {
+    addTestFile('''
+Map<String, String> a = <int, int>{};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<int, int>');
+  }
+
+  test_context_typeArgs_noEntries_noConflict() async {
+    addTestFile('''
+Map<String, String> a = <String, String>{};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<String, String>');
+  }
+
+  test_noContext_noTypeArgs_expressions_conflict() async {
+    addTestFile('''
+var a = {1 : '1', '2' : 2, 3 : '3'};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<Object, Object>');
+  }
+
+  test_noContext_noTypeArgs_expressions_noConflict() async {
+    addTestFile('''
+var a = {1 : 'a', 2 : 'b', 3 : 'c'};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<int, String>');
+  }
+
+  test_noContext_noTypeArgs_noEntries() async {
+    addTestFile('''
+var a = {};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<dynamic, dynamic>');
+  }
+
+  test_noContext_typeArgs_entry_conflict() async {
+    addTestFile('''
+var a = <String, int>{'a' : 1};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<String, int>');
+  }
+
+  test_noContext_typeArgs_entry_noConflict() async {
+    addTestFile('''
+var a = <int, int>{1 : 2};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<int, int>');
+  }
+
+  test_noContext_typeArgs_expression_conflict() async {
+    addTestFile('''
+var a = <int, String>{1};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<int, String>');
+  }
+
+  test_noContext_typeArgs_noEntries() async {
+    addTestFile('''
+var a = <num, String>{};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<num, String>');
+  }
+}
+
+@reflectiveTest
+class MapLiteralWithFlowControlAndSpreadCollectionsTest extends MapLiteralTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections
+    ];
+
+  @override
+  AstNode setOrMapLiteral(String search) => findNode.setOrMapLiteral(search);
+
+  test_noContext_noTypeArgs_forEachWithDeclaration() async {
+    addTestFile('''
+var c = [1, 2, 3];
+var a = {for (int e in c) e : e * 2};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{for'), 'Map<int, int>');
+  }
+
+  test_noContext_noTypeArgs_forEachWithIdentifier() async {
+    addTestFile('''
+var c = [1, 2, 3];
+int b;
+var a = {for (b in c) b * 2 : b};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{for'), 'Map<int, int>');
+  }
+
+  test_noContext_noTypeArgs_forWithDeclaration() async {
+    addTestFile('''
+var a = {for (var i = 0; i < 2; i++) i : i * 2};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{for'), 'Map<int, int>');
+  }
+
+  test_noContext_noTypeArgs_forWithExpression() async {
+    addTestFile('''
+int i;
+var a = {for (i = 0; i < 2; i++) i * 2 : i};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{for'), 'Map<int, int>');
+  }
+
+  test_noContext_noTypeArgs_if() async {
+    addTestFile('''
+var c = true;
+var a = {if (c) 1 : 2};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<int, int>');
+  }
+
+  test_noContext_noTypeArgs_ifElse_conflict() async {
+    addTestFile('''
+var c = true;
+var a = {if (c) 1 : '1' else '2': 2 };
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<Object, Object>');
+  }
+
+  test_noContext_noTypeArgs_ifElse_noConflict() async {
+    addTestFile('''
+var c = true;
+var a = {if (c) 1 : 3 else 2 : 4};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{'), 'Map<int, int>');
+  }
+
+  test_noContext_noTypeArgs_spread() async {
+    addTestFile('''
+Map<int, int> c = {1 : 1, 2 : 2, 3 : 3};
+var a = {...c};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{...'), 'Map<int, int>');
+  }
+
+  test_noContext_noTypeArgs_spread_conflict() async {
+    addTestFile('''
+Map<int, int> c = {1 : 2};
+Map<String, String> b = {'a' : 'b'};
+var a = {...b, ...c};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{...'), 'Map<Object, Object>');
+  }
+
+  test_noContext_noTypeArgs_spread_dynamic() async {
+    addTestFile('''
+var c = {1 : 1, 2 : 2, 3 : 3};
+var a = {...c};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{...'), 'Map<int, int>');
+  }
+
+  test_noContext_noTypeArgs_spread_noConflict() async {
+    addTestFile('''
+Map<int, int> c = {1 : 3};
+Map<int, int> b = {2 : 4};
+var a = {...b, ...c};
+''');
+    await resolveTestFile();
+    assertType(setOrMapLiteral('{...'), 'Map<int, int>');
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/set_literal_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/set_literal_test.dart
new file mode 100644
index 0000000..b4bd6a9
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/set_literal_test.dart
@@ -0,0 +1,240 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SetLiteralTest);
+    defineReflectiveTests(SetLiteralWithFlowControlAndSpreadCollectionsTest);
+  });
+}
+
+@reflectiveTest
+class SetLiteralTest extends DriverResolutionTest {
+  AstNode setLiteral(String search) => findNode.setOrMapLiteral(search);
+
+  test_context_noTypeArgs_expression_conflict() async {
+    addTestFile('''
+Set<int> a = {'a'};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<int>');
+  }
+
+  test_context_noTypeArgs_expression_noConflict() async {
+    addTestFile('''
+Set<int> a = {1};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<int>');
+  }
+
+  test_context_noTypeArgs_noElements() async {
+    addTestFile('''
+Set<String> a = {};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<String>');
+  }
+
+  test_context_noTypeArgs_noElements_typeParameter() async {
+    addTestFile('''
+class A<E extends Set<int>> {
+  E a = {};
+}
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{}'), 'Set<dynamic>');
+  }
+
+  test_context_typeArgs_expression_conflict() async {
+    addTestFile('''
+Set<String> a = <String>{0};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<String>');
+  }
+
+  test_context_typeArgs_expression_noConflict() async {
+    addTestFile('''
+Set<String> a = <String>{'a'};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<String>');
+  }
+
+  test_context_typeArgs_noElements_conflict() async {
+    addTestFile('''
+Set<String> a = <int>{};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<int>');
+  }
+
+  test_context_typeArgs_noElements_noConflict() async {
+    addTestFile('''
+Set<String> a = <String>{};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<String>');
+  }
+
+  test_noContext_noTypeArgs_expressions_conflict() async {
+    addTestFile('''
+var a = {1, '2', 3};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<Object>');
+  }
+
+  test_noContext_noTypeArgs_expressions_noConflict() async {
+    addTestFile('''
+var a = {1, 2, 3};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<int>');
+  }
+
+  test_noContext_typeArgs_expression_conflict() async {
+    addTestFile('''
+var a = <String>{1};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<String>');
+  }
+
+  test_noContext_typeArgs_expression_noConflict() async {
+    addTestFile('''
+var a = <int>{1};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<int>');
+  }
+
+  test_noContext_typeArgs_noElements() async {
+    addTestFile('''
+var a = <num>{};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<num>');
+  }
+}
+
+@reflectiveTest
+class SetLiteralWithFlowControlAndSpreadCollectionsTest extends SetLiteralTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections
+    ];
+
+  @override
+  AstNode setLiteral(String search) => findNode.setOrMapLiteral(search);
+
+  @failingTest
+  @override
+  test_context_noTypeArgs_noElements_typeParameter() async {
+    // Failing because Map<dynamic, dynamic> is being inferred.
+    await super.test_context_noTypeArgs_noElements_typeParameter();
+  }
+
+  test_noContext_noTypeArgs_forEachWithDeclaration() async {
+    addTestFile('''
+var c = [1, 2, 3];
+var a = {for (int e in c) e * 2};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{for'), 'Set<int>');
+  }
+
+  test_noContext_noTypeArgs_forEachWithIdentifier() async {
+    addTestFile('''
+var c = [1, 2, 3];
+int b;
+var a = {for (b in c) b * 2};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{for'), 'Set<int>');
+  }
+
+  test_noContext_noTypeArgs_forWithDeclaration() async {
+    addTestFile('''
+var a = {for (var i = 0; i < 2; i++) i * 2};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{for'), 'Set<int>');
+  }
+
+  test_noContext_noTypeArgs_forWithExpression() async {
+    addTestFile('''
+int i;
+var a = {for (i = 0; i < 2; i++) i * 2};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{for'), 'Set<int>');
+  }
+
+  test_noContext_noTypeArgs_if() async {
+    addTestFile('''
+var c = true;
+var a = {if (c) 1};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<int>');
+  }
+
+  test_noContext_noTypeArgs_ifElse_conflict() async {
+    addTestFile('''
+var c = true;
+var a = {if (c) 1 else '2'};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<Object>');
+  }
+
+  test_noContext_noTypeArgs_ifElse_noConflict() async {
+    addTestFile('''
+var c = true;
+var a = {if (c) 1 else 2};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{'), 'Set<int>');
+  }
+
+  test_noContext_noTypeArgs_spread() async {
+    addTestFile('''
+var c = [1, 2, 3];
+var a = {...c};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{...'), 'Set<int>');
+  }
+
+  test_noContext_noTypeArgs_spread_conflict() async {
+    addTestFile('''
+var c = [1];
+var b = ['a'];
+var a = {...b, ...c};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{...'), 'Set<Object>');
+  }
+
+  test_noContext_noTypeArgs_spread_noConflict() async {
+    addTestFile('''
+var c = [1];
+var b = [2];
+var a = {...b, ...c};
+''');
+    await resolveTestFile();
+    assertType(setLiteral('{...'), 'Set<int>');
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/test_all.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/test_all.dart
new file mode 100644
index 0000000..54ada38
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/test_all.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'list_literal_test.dart' as list_literal;
+import 'map_literal_test.dart' as map_literal;
+import 'set_literal_test.dart' as set_literal;
+
+main() {
+  defineReflectiveSuite(() {
+    list_literal.main();
+    map_literal.main();
+    set_literal.main();
+  }, name: 'type inference');
+}
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
index 5915938..b40bc8e 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -14,10 +14,7 @@
 }
 
 @reflectiveTest
-class ArgumentTypeNotAssignableTest extends ResolverTestCase {
-  @override
-  bool get enableNewAnalysisDriver => true;
-
+class ArgumentTypeNotAssignableTest extends DriverResolutionTest {
   test_functionType() async {
     await assertErrorsInCode(r'''
 m() {
diff --git a/pkg/analyzer/test/src/diagnostics/can_be_null_after_null_aware_test.dart b/pkg/analyzer/test/src/diagnostics/can_be_null_after_null_aware_test.dart
index 534c440..3e9bddb 100644
--- a/pkg/analyzer/test/src/diagnostics/can_be_null_after_null_aware_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/can_be_null_after_null_aware_test.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -14,10 +14,7 @@
 }
 
 @reflectiveTest
-class CanBeNullAfterNullAwareTest extends ResolverTestCase {
-  @override
-  bool get enableNewAnalysisDriver => true;
-
+class CanBeNullAfterNullAwareTest extends DriverResolutionTest {
   test_afterCascade() async {
     await assertErrorsInCode(r'''
 m(x) {
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
new file mode 100644
index 0000000..1c179be
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConstConstructorParamTypeMismatchTest);
+  });
+}
+
+/// TODO(paulberry): move other tests from [CheckedModeCompileTimeErrorCodeTest]
+/// to this class.
+@reflectiveTest
+class ConstConstructorParamTypeMismatchTest extends DriverResolutionTest {
+  test_int_to_double_reference_from_other_library_other_file_after() async {
+    addTestFile('''
+class C {
+  final double d;
+  const C(this.d);
+}
+const C constant = const C(0);
+''');
+    newFile('/test/lib/other.dart', content: '''
+import 'test.dart';
+class D {
+  final C c;
+  const D(this.c);
+}
+const D constant2 = const D(constant);
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    var otherFileResult =
+        await resolveFile(convertPath('/test/lib/other.dart'));
+    expect(otherFileResult.errors, isEmpty);
+  }
+
+  test_int_to_double_reference_from_other_library_other_file_before() async {
+    addTestFile('''
+class C {
+  final double d;
+  const C(this.d);
+}
+const C constant = const C(0);
+''');
+    newFile('/test/lib/other.dart', content: '''
+import 'test.dart';
+class D {
+  final C c;
+  const D(this.c);
+}
+const D constant2 = const D(constant);
+''');
+    var otherFileResult =
+        await resolveFile(convertPath('/test/lib/other.dart'));
+    expect(otherFileResult.errors, isEmpty);
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+
+  test_int_to_double_single_library() async {
+    addTestFile('''
+class C {
+  final double d;
+  const C(this.d);
+}
+const C constant = const C(0);
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+
+  test_int_to_double_via_default_value_other_file_after() async {
+    addTestFile('''
+import 'other.dart';
+
+void main() {
+  const c = C();
+}
+''');
+    newFile('/test/lib/other.dart', content: '''
+class C {
+  final double x;
+  const C([this.x = 0]);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    var otherFileResult =
+        await resolveFile(convertPath('/test/lib/other.dart'));
+    expect(otherFileResult.errors, isEmpty);
+  }
+
+  test_int_to_double_via_default_value_other_file_before() async {
+    addTestFile('''
+import 'other.dart';
+
+void main() {
+  const c = C();
+}
+''');
+    newFile('/test/lib/other.dart', content: '''
+class C {
+  final double x;
+  const C([this.x = 0]);
+}
+''');
+    var otherFileResult =
+        await resolveFile(convertPath('/test/lib/other.dart'));
+    expect(otherFileResult.errors, isEmpty);
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
new file mode 100644
index 0000000..f51e17b
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConstEvalThrowsExceptionTest);
+  });
+}
+
+/// TODO(paulberry): move other tests from [CheckedModeCompileTimeErrorCodeTest]
+/// and [CompileTimeErrorCodeTestBase] to this class.
+@reflectiveTest
+class ConstEvalThrowsExceptionTest extends DriverResolutionTest {
+  test_CastError_intToDouble_constructor_importAnalyzedAfter() async {
+    // See dartbug.com/35993
+    addTestFile(r'''
+import 'other.dart';
+
+void main() {
+  const foo = Foo(1);
+  const bar = Bar.some();
+  print("$foo, $bar");
+}
+''');
+    newFile('/test/lib/other.dart', content: '''
+class Foo {
+  final double value;
+
+  const Foo(this.value);
+}
+
+class Bar {
+  final Foo value;
+
+  const Bar(this.value);
+
+  const Bar.some() : this(const Foo(1));
+}''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    var otherFileResult =
+        await resolveFile(convertPath('/test/lib/other.dart'));
+    expect(otherFileResult.errors, isEmpty);
+  }
+
+  test_CastError_intToDouble_constructor_importAnalyzedBefore() async {
+    // See dartbug.com/35993
+    addTestFile(r'''
+import 'other.dart';
+
+void main() {
+  const foo = Foo(1);
+  const bar = Bar.some();
+  print("$foo, $bar");
+}
+''');
+    newFile('/test/lib/other.dart', content: '''
+class Foo {
+  final double value;
+
+  const Foo(this.value);
+}
+
+class Bar {
+  final Foo value;
+
+  const Bar(this.value);
+
+  const Bar.some() : this(const Foo(1));
+}''');
+    var otherFileResult =
+        await resolveFile(convertPath('/test/lib/other.dart'));
+    expect(otherFileResult.errors, isEmpty);
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/dead_code_test.dart b/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
new file mode 100644
index 0000000..48ccc75
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
@@ -0,0 +1,664 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DeadCodeTest);
+    defineReflectiveTests(UncheckedUseOfNullableValueTest);
+  });
+}
+
+@reflectiveTest
+class DeadCodeTest extends DriverResolutionTest with PackageMixin {
+  test_deadBlock_conditionalElse() async {
+    await assertErrorsInCode(r'''
+f() {
+  true ? 1 : 2;
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadBlock_conditionalElse_nested() async {
+    // Test that a dead else-statement can't generate additional violations.
+    await assertErrorsInCode(r'''
+f() {
+  true ? true : false && false;
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadBlock_conditionalIf() async {
+    await assertErrorsInCode(r'''
+f() {
+  false ? 1 : 2;
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadBlock_conditionalIf_nested() async {
+    // Test that a dead then-statement can't generate additional violations.
+    await assertErrorsInCode(r'''
+f() {
+  false ? false && false : true;
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadBlock_conditionalElse_debugConst() async {
+    await assertNoErrorsInCode(r'''
+const bool DEBUG = true;
+f() {
+  DEBUG ? 1 : 2;
+}''');
+  }
+
+  test_deadBlock_conditionalIf_debugConst() async {
+    await assertNoErrorsInCode(r'''
+const bool DEBUG = false;
+f() {
+  DEBUG ? 1 : 2;
+}''');
+  }
+
+  test_deadBlock_else() async {
+    await assertErrorsInCode(r'''
+f() {
+  if(true) {} else {}
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadBlock_else_debugConst() async {
+    await assertNoErrorsInCode(r'''
+const bool DEBUG = true;
+f() {
+  if(DEBUG) {} else {}
+}''');
+  }
+
+  test_deadBlock_if_debugConst_prefixedIdentifier() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  static const bool DEBUG = false;
+}
+f() {
+  if(A.DEBUG) {}
+}''');
+  }
+
+  test_deadBlock_if_debugConst_prefixedIdentifier2() async {
+    newFile('/test/lib/lib2.dart', content: r'''
+library lib2;
+class A {
+  static const bool DEBUG = false;
+}''');
+    await assertNoErrorsInCode(r'''
+library L;
+import 'lib2.dart';
+f() {
+  if(A.DEBUG) {}
+}''');
+  }
+
+  test_deadBlock_if_debugConst_propertyAccessor() async {
+    newFile('/test/lib/lib2.dart', content: r'''
+library lib2;
+class A {
+  static const bool DEBUG = false;
+}''');
+    await assertNoErrorsInCode(r'''
+library L;
+import 'lib2.dart' as LIB;
+f() {
+  if(LIB.A.DEBUG) {}
+}''');
+  }
+
+  test_deadBlock_if_debugConst_simpleIdentifier() async {
+    await assertNoErrorsInCode(r'''
+const bool DEBUG = false;
+f() {
+  if(DEBUG) {}
+}''');
+  }
+
+  test_deadBlock_else_nested() async {
+    // Test that a dead else-statement can't generate additional violations.
+    await assertErrorsInCode(r'''
+f() {
+  if(true) {} else {if (false) {}}
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadBlock_if() async {
+    await assertErrorsInCode(r'''
+f() {
+  if(false) {}
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadBlock_if_nested() async {
+    // Test that a dead then-statement can't generate additional violations.
+    await assertErrorsInCode(r'''
+f() {
+  if(false) {if(false) {}}
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadBlock_while() async {
+    await assertErrorsInCode(r'''
+f() {
+  while(false) {}
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadBlock_while_nested() async {
+    // Test that a dead while body can't generate additional violations.
+    await assertErrorsInCode(r'''
+f() {
+  while(false) {if(false) {}}
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadBlock_while_debugConst() async {
+    await assertNoErrorsInCode(r'''
+const bool DEBUG = false;
+f() {
+  while(DEBUG) {}
+}''');
+  }
+
+  test_deadCatch_catchFollowingCatch() async {
+    await assertErrorsInCode(r'''
+class A {}
+f() {
+  try {} catch (e) {} catch (e) {}
+}''', [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
+  }
+
+  test_deadCatch_catchFollowingCatch_nested() async {
+    // Test that a dead catch clause can't generate additional violations.
+    await assertErrorsInCode(r'''
+class A {}
+f() {
+  try {} catch (e) {} catch (e) {if(false) {}}
+}''', [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
+  }
+
+  test_deadCatch_catchFollowingCatch_object() async {
+    await assertErrorsInCode(r'''
+f() {
+  try {} on Object catch (e) {} catch (e) {}
+}''', [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
+  }
+
+  test_deadCatch_catchFollowingCatch_object_nested() async {
+    // Test that a dead catch clause can't generate additional violations.
+    await assertErrorsInCode(r'''
+f() {
+  try {} on Object catch (e) {} catch (e) {if(false) {}}
+}''', [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
+  }
+
+  test_deadCatch_onCatchSubtype() async {
+    await assertErrorsInCode(r'''
+class A {}
+class B extends A {}
+f() {
+  try {} on A catch (e) {} on B catch (e) {}
+}''', [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
+  }
+
+  test_deadCatch_onCatchSubtype_nested() async {
+    // Test that a dead catch clause can't generate additional violations.
+    await assertErrorsInCode(r'''
+class A {}
+class B extends A {}
+f() {
+  try {} on A catch (e) {} on B catch (e) {if(false) {}}
+}''', [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
+  }
+
+  test_deadCatch_onCatchSupertype() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+class B extends A {}
+f() {
+  try {} on B catch (e) {} on A catch (e) {} catch (e) {}
+}''');
+  }
+
+  test_afterTryCatch() async {
+    await assertNoErrorsInCode(r'''
+main() {
+  try {
+    return f();
+  } catch (e) {
+    print(e);
+  }
+  print('not dead');
+}
+f() {
+  throw 'foo';
+}
+''');
+  }
+
+  test_deadFinalReturnInCase() async {
+    await assertErrorsInCode(r'''
+f() {
+  switch (true) {
+  case true:
+    try {
+      int a = 1;
+    } finally {
+      return;
+    }
+    return;
+  default:
+    break;
+  }
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadFinalStatementInCase() async {
+    await assertErrorsInCode(r'''
+f() {
+  switch (true) {
+  case true:
+    try {
+      int a = 1;
+    } finally {
+      return;
+    }
+    throw 'msg';
+  default:
+    break;
+  }
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadFinalBreakInCase() async {
+    await assertNoErrorsInCode(r'''
+f() {
+  switch (true) {
+  case true:
+    try {
+      int a = 1;
+    } finally {
+      return;
+    }
+    break;
+  default:
+    break;
+  }
+}''');
+  }
+
+  test_deadOperandLHS_and() async {
+    await assertErrorsInCode(r'''
+f() {
+  bool b = false && false;
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadOperandLHS_and_nested() async {
+    await assertErrorsInCode(r'''
+f() {
+  bool b = false && (false && false);
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadOperandLHS_or() async {
+    await assertErrorsInCode(r'''
+f() {
+  bool b = true || true;
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadOperandLHS_or_nested() async {
+    await assertErrorsInCode(r'''
+f() {
+  bool b = true || (false && false);
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_deadOperandLHS_and_debugConst() async {
+    await assertNoErrorsInCode(r'''
+const bool DEBUG = false;
+f() {
+  bool b = DEBUG && false;
+}''');
+  }
+
+  test_deadOperandLHS_or_debugConst() async {
+    await assertNoErrorsInCode(r'''
+const bool DEBUG = true;
+f() {
+  bool b = DEBUG || true;
+}''');
+  }
+
+  test_statementAfterAlwaysThrowsFunction() async {
+    addMetaPackage();
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+@alwaysThrows
+void a() {
+  throw 'msg';
+}
+
+f() {
+  var one = 1;
+  a();
+  var two = 2;
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  @failingTest
+  test_statementAfterAlwaysThrowsGetter() async {
+    addMetaPackage();
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+class C {
+  @alwaysThrows
+  int get a {
+    throw 'msg';
+  }
+
+f() {
+  var one = 1;
+  new C().a;
+  var two = 2;
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterAlwaysThrowsMethod() async {
+    addMetaPackage();
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+class C {
+  @alwaysThrows
+  void a() {
+    throw 'msg';
+  }
+}
+
+f() {
+  var one = 1;
+  new C().a();
+  var two = 2;
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterBreak_inDefaultCase() async {
+    await assertErrorsInCode(r'''
+f(v) {
+  switch(v) {
+    case 1:
+    default:
+      break;
+      var a;
+  }
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterBreak_inForEachStatement() async {
+    await assertErrorsInCode(r'''
+f() {
+  var list;
+  for(var l in list) {
+    break;
+    var a;
+  }
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterBreak_inForStatement() async {
+    await assertErrorsInCode(r'''
+f() {
+  for(;;) {
+    break;
+    var a;
+  }
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterBreak_inSwitchCase() async {
+    await assertErrorsInCode(r'''
+f(v) {
+  switch(v) {
+    case 1:
+      break;
+      var a;
+  }
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterBreak_inWhileStatement() async {
+    await assertErrorsInCode(r'''
+f(v) {
+  while(v) {
+    break;
+    var a;
+  }
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterContinue_inForEachStatement() async {
+    await assertErrorsInCode(r'''
+f() {
+  var list;
+  for(var l in list) {
+    continue;
+    var a;
+  }
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterContinue_inForStatement() async {
+    await assertErrorsInCode(r'''
+f() {
+  for(;;) {
+    continue;
+    var a;
+  }
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterContinue_inWhileStatement() async {
+    await assertErrorsInCode(r'''
+f(v) {
+  while(v) {
+    continue;
+    var a;
+  }
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterExitingIf_returns() async {
+    await assertErrorsInCode(r'''
+f() {
+  if (1 > 2) {
+    return;
+  } else {
+    return;
+  }
+  var one = 1;
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterIfWithoutElse() async {
+    await assertNoErrorsInCode(r'''
+f() {
+  if (1 < 0) {
+    return;
+  }
+  int a = 1;
+}''');
+  }
+
+  test_statementAfterRethrow() async {
+    await assertErrorsInCode(r'''
+f() {
+  try {
+    var one = 1;
+  } catch (e) {
+    rethrow;
+    var two = 2;
+  }
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterReturn_function() async {
+    await assertErrorsInCode(r'''
+f() {
+  var one = 1;
+  return;
+  var two = 2;
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterReturn_ifStatement() async {
+    await assertErrorsInCode(r'''
+f(bool b) {
+  if(b) {
+    var one = 1;
+    return;
+    var two = 2;
+  }
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterReturn_method() async {
+    await assertErrorsInCode(r'''
+class A {
+  m() {
+    var one = 1;
+    return;
+    var two = 2;
+  }
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterReturn_nested() async {
+    await assertErrorsInCode(r'''
+f() {
+  var one = 1;
+  return;
+  if(false) {}
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterReturn_twoReturns() async {
+    await assertErrorsInCode(r'''
+f() {
+  var one = 1;
+  return;
+  var two = 2;
+  return;
+  var three = 3;
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_statementAfterThrow() async {
+    await assertErrorsInCode(r'''
+f() {
+  var one = 1;
+  throw 'Stop here';
+  var two = 2;
+}''', [HintCode.DEAD_CODE]);
+  }
+
+  test_afterForEachWithBreakLabel() async {
+    await assertNoErrorsInCode(r'''
+f() {
+  named: {
+    for (var x in [1]) {
+      if (x == null)
+        break named;
+    }
+    return;
+  }
+  print('not dead');
+}
+''');
+  }
+
+  test_afterForWithBreakLabel() async {
+    await assertNoErrorsInCode(r'''
+f() {
+  named: {
+    for (int i = 0; i < 7; i++) {
+      if (i == null)
+        break named;
+    }
+    return;
+  }
+  print('not dead');
+}
+''');
+  }
+}
+
+@reflectiveTest
+class UncheckedUseOfNullableValueTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_nullCoalesce_nonNullable() async {
+    await assertErrorsInCode(r'''
+@pragma('analyzer:non-nullable')
+library foo;
+
+m() {
+  int x;
+  x ?? 1;
+}
+''', [HintCode.DEAD_CODE]);
+  }
+
+  test_nullCoalesce_nullable() async {
+    await assertNoErrorsInCode(r'''
+@pragma('analyzer:non-nullable')
+library foo;
+
+m() {
+  int? x;
+  x ?? 1;
+}
+''');
+  }
+
+  test_nullCoalesceAssign_nonNullable() async {
+    await assertErrorsInCode(r'''
+@pragma('analyzer:non-nullable')
+library foo;
+
+m() {
+  int x;
+  x ??= 1;
+}
+''', [HintCode.DEAD_CODE]);
+  }
+
+  test_nullCoalesceAssign_nullable() async {
+    await assertNoErrorsInCode(r'''
+@pragma('analyzer:non-nullable')
+library foo;
+
+m() {
+  int? x;
+  x ??= 1;
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
index 2f91806..0c4a842 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../generated/resolver_test_case.dart';
@@ -82,10 +84,15 @@
 ''');
 
     newPubPackage('/pkg1');
-    assertErrorsInCode(r'''
+    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
 import 'package:foo/foo.dart';
 f(A a) {}
-''', [HintCode.DEPRECATED_MEMBER_USE], sourceName: '/pkg1/lib/lib1.dart');
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    this.verify([source]);
+    TestAnalysisResult result = analysisResults[source];
+    expect(result.errors[0].message, contains('package:foo/foo.dart'));
   }
 
   test_basicWorkspace() async {
diff --git a/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart b/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart
index 7fb98b8..eaadc2d 100644
--- a/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -14,10 +14,7 @@
 }
 
 @reflectiveTest
-class DivisionOptimizationTest extends ResolverTestCase {
-  @override
-  bool get enableNewAnalysisDriver => true;
-
+class DivisionOptimizationTest extends DriverResolutionTest {
   test_divisionOptimization() async {
     await assertNoErrorsInCode(r'''
 f(int x, int y) {
diff --git a/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_test.dart b/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_test.dart
new file mode 100644
index 0000000..2469819
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_test.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(EqualKeysInMapWithUiAsCodeTest);
+  });
+}
+
+@reflectiveTest
+class EqualKeysInMapWithUiAsCodeTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+    ];
+
+  test_ifElement_elseBranch_evaluated_addsDuplicate() async {
+    await assertErrorsInCode('''
+void main() {
+  const notTrue = false;
+  const {1: null, if (notTrue) 2: null else 1: null};
+}
+''', [StaticWarningCode.EQUAL_KEYS_IN_MAP]);
+  }
+
+  test_ifElement_evaluated_addsDuplicate() async {
+    await assertErrorsInCode('''
+void main() {
+  const {1: null, if (true) 1: null};
+}
+''', [StaticWarningCode.EQUAL_KEYS_IN_MAP]);
+  }
+
+  @failingTest
+  test_ifElement_notEvaluated_doesntAddDuplicate() async {
+    await assertNoErrorsInCode('''
+void main() {
+  const notTrue = false;
+  const {1: null, if (notTrue) 1: null};
+}
+''');
+  }
+
+  @failingTest
+  test_ifElement_withElse_evaluated_doesntAddDuplicate() async {
+    await assertNoErrorsInCode('''
+void main() {
+  const isTrue = true;
+  const {if (isTrue) 1: null : 1 :null};
+}
+''');
+  }
+
+  @failingTest
+  test_nonConst_noDuplicateReported() async {
+    await assertNoErrorsInCode('''
+void main() {
+  print({1: null, 1: null});
+}
+''');
+  }
+
+  @failingTest
+  test_spreadElement_addsDuplicate() async {
+    await assertErrorsInCode('''
+void main() {
+  const {1: null, ...{1: null}};
+}
+''', [StaticWarningCode.EQUAL_KEYS_IN_MAP]);
+  }
+
+  test_spreadElement_doesntAddDuplicate() async {
+    await assertNoErrorsInCode('''
+void main() {
+  const {1: null, ...{2: null}};
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
index f35bbcc..c67ce98 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -14,10 +14,7 @@
 }
 
 @reflectiveTest
-class InvalidAssignmentTest extends ResolverTestCase {
-  @override
-  bool get enableNewAnalysisDriver => true;
-
+class InvalidAssignmentTest extends DriverResolutionTest {
   test_instanceVariable() async {
     await assertErrorsInCode(r'''
 class A {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_cast_new_expr_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_cast_new_expr_test.dart
index 125d43d..f1c94b4 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_cast_new_expr_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_cast_new_expr_test.dart
@@ -3,9 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -14,12 +15,10 @@
 }
 
 @reflectiveTest
-class InvalidCastNewExprTest extends ResolverTestCase {
+class InvalidCastNewExprTest extends DriverResolutionTest {
   @override
-  List<String> get enabledExperiments => ['set-literals'];
-
-  @override
-  bool get enableNewAnalysisDriver => true;
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = ['set-literals'];
 
   test_listLiteral_const() async {
     await assertErrorsInCode(r'''
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_immutable_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_immutable_annotation_test.dart
new file mode 100644
index 0000000..8b6e57f
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_immutable_annotation_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidImmutableAnnotationTest);
+  });
+}
+
+@reflectiveTest
+class InvalidImmutableAnnotationTest extends DriverResolutionTest
+    with PackageMixin {
+  test_method() async {
+    addMetaPackage();
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @immutable
+  void m() {}
+}
+''', [HintCode.INVALID_IMMUTABLE_ANNOTATION]);
+  }
+
+  test_class() async {
+    addMetaPackage();
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@immutable
+class A {
+  const A();
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_literal_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_literal_annotation_test.dart
new file mode 100644
index 0000000..9751a2b
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_literal_annotation_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidLiteralAnnotationTest);
+  });
+}
+
+@reflectiveTest
+class InvalidLiteralAnnotationTest extends DriverResolutionTest
+    with PackageMixin {
+  test_nonConstConstructor() async {
+    addMetaPackage();
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  A() {}
+}
+''', [HintCode.INVALID_LITERAL_ANNOTATION]);
+  }
+
+  test_nonConstructor() async {
+    addMetaPackage();
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  void m() {}
+}
+''', [HintCode.INVALID_LITERAL_ANNOTATION]);
+  }
+
+  test_constConstructor() async {
+    addMetaPackage();
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  const A();
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_named_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_named_test.dart
index 684a9c3..035a8e5 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_named_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_named_test.dart
@@ -41,6 +41,70 @@
 }''');
   }
 
+  test_equal_values_generic_different_files() async {
+    newFile('/test/lib/other.dart', content: '''
+class C {
+  f({x: const ['x']}) {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'other.dart';
+class D extends C {
+  f({x: const ['x']}) {}
+}
+''');
+  }
+
+  test_equal_values_generic_undefined_value_base() async {
+    // Note: we expect some errors due to the constant referring to undefined
+    // values, but there should not be any INVALID_OVERRIDE... error.
+    await assertErrorsInCode('''
+class A {
+  m({x = Undefined.value}) {}
+}
+class B extends A {
+  m({x = 1}) {}
+}
+''', [
+      CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE,
+      StaticWarningCode.UNDEFINED_IDENTIFIER
+    ]);
+  }
+
+  test_equal_values_generic_undefined_value_both() async {
+    // Note: we expect some errors due to the constant referring to undefined
+    // values, but there should not be any INVALID_OVERRIDE... error.
+    await assertErrorsInCode('''
+class A {
+  m({x = Undefined.value}) {}
+}
+class B extends A {
+  m({x = Undefined2.value2}) {}
+}
+''', [
+      CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE,
+      CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE,
+      StaticWarningCode.UNDEFINED_IDENTIFIER,
+      StaticWarningCode.UNDEFINED_IDENTIFIER
+    ]);
+  }
+
+  test_equal_values_generic_undefined_value_derived() async {
+    // Note: we expect some errors due to the constant referring to undefined
+    // values, but there should not be any INVALID_OVERRIDE... error.
+    await assertErrorsInCode('''
+class A {
+  m({x = 1}) {}
+}
+class B extends A {
+  m({x = Undefined.value}) {}
+}
+''', [
+      CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE,
+      StaticWarningCode.UNDEFINED_IDENTIFIER
+    ]);
+  }
+
   test_equalValues() async {
     await assertNoErrorsInCode(r'''
 abstract class A {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_positional_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_positional_test.dart
index 0de7735..fc83949 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_positional_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_positional_test.dart
@@ -41,6 +41,70 @@
 }''');
   }
 
+  test_equal_values_generic_different_files() async {
+    newFile('/test/lib/other.dart', content: '''
+class C {
+  f([x = const ['x']]) {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'other.dart';
+class D extends C {
+  f([x = const ['x']]) {}
+}
+''');
+  }
+
+  test_equal_values_generic_undefined_value_base() async {
+    // Note: we expect some errors due to the constant referring to undefined
+    // values, but there should not be any INVALID_OVERRIDE... error.
+    await assertErrorsInCode('''
+class A {
+  m([x = Undefined.value]) {}
+}
+class B extends A {
+  m([x = 1]) {}
+}
+''', [
+      CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE,
+      StaticWarningCode.UNDEFINED_IDENTIFIER
+    ]);
+  }
+
+  test_equal_values_generic_undefined_value_both() async {
+    // Note: we expect some errors due to the constant referring to undefined
+    // values, but there should not be any INVALID_OVERRIDE... error.
+    await assertErrorsInCode('''
+class A {
+  m([x = Undefined.value]) {}
+}
+class B extends A {
+  m([x = Undefined2.value2]) {}
+}
+''', [
+      CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE,
+      CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE,
+      StaticWarningCode.UNDEFINED_IDENTIFIER,
+      StaticWarningCode.UNDEFINED_IDENTIFIER
+    ]);
+  }
+
+  test_equal_values_generic_undefined_value_derived() async {
+    // Note: we expect some errors due to the constant referring to undefined
+    // values, but there should not be any INVALID_OVERRIDE... error.
+    await assertErrorsInCode('''
+class A {
+  m([x = 1]) {}
+}
+class B extends A {
+  m([x = Undefined.value]) {}
+}
+''', [
+      CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE,
+      StaticWarningCode.UNDEFINED_IDENTIFIER
+    ]);
+  }
+
   test_equalValues() async {
     await assertNoErrorsInCode(r'''
 abstract class A {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_required_param_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_required_param_test.dart
index d426e08..96f6722c 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_required_param_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_required_param_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/test_utilities/package_mixin.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/hint_code_test.dart' show metaLibraryStub;
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -15,15 +15,11 @@
 }
 
 @reflectiveTest
-class InvalidRequiredParamTest extends ResolverTestCase {
+class InvalidRequiredParamTest extends DriverResolutionTest with PackageMixin {
   @override
-  bool get enableNewAnalysisDriver => true;
-
-  @override
-  void reset() {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub]
-    ]);
+  void setUp() {
+    super.setUp();
+    addMetaPackage();
   }
 
   test_namedParameter_withDefault() async {
@@ -34,6 +30,14 @@
 ''', [HintCode.INVALID_REQUIRED_PARAM]);
   }
 
+  test_positionalParameter_noDefault() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+m([@required a]) => null;
+''', [HintCode.INVALID_REQUIRED_PARAM]);
+  }
+
   test_positionalParameter_withDefault() async {
     await assertErrorsInCode(r'''
 import 'package:meta/meta.dart';
@@ -42,14 +46,6 @@
 ''', [HintCode.INVALID_REQUIRED_PARAM]);
   }
 
-  test_ppositionalParameter_noDefault() async {
-    await assertErrorsInCode(r'''
-import 'package:meta/meta.dart';
-
-m([@required a]) => null;
-''', [HintCode.INVALID_REQUIRED_PARAM]);
-  }
-
   test_requiredParameter() async {
     await assertErrorsInCode(r'''
 import 'package:meta/meta.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_sealed_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_sealed_annotation_test.dart
new file mode 100644
index 0000000..99876eb
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_sealed_annotation_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidLiteralAnnotationTest);
+  });
+}
+
+@reflectiveTest
+class InvalidLiteralAnnotationTest extends DriverResolutionTest
+    with PackageMixin {
+  setUp() {
+    super.setUp();
+    addMetaPackage();
+  }
+
+  test_class() async {
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+@sealed class A {}
+''');
+  }
+
+  test_mixin() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+@sealed mixin M {}
+''', [HintCode.INVALID_SEALED_ANNOTATION]);
+  }
+
+  test_mixinApplication() async {
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+abstract class A {}
+
+abstract class B {}
+
+@sealed abstract class M = A with B;
+''');
+  }
+
+  test_nonClass() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+@sealed m({a = 1}) => null;
+''', [HintCode.INVALID_SEALED_ANNOTATION]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_visibility_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_visibility_annotation_test.dart
index b842600..dd8ad78 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_visibility_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_visibility_annotation_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/test_utilities/package_mixin.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/hint_code_test.dart' show metaLibraryStub;
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -15,113 +15,19 @@
 }
 
 @reflectiveTest
-class InvalidVisibilityAnnotationTest extends ResolverTestCase {
+class InvalidVisibilityAnnotationTest extends DriverResolutionTest
+    with PackageMixin {
   @override
-  bool get enableNewAnalysisDriver => true;
-
-  @override
-  void reset() {
-    super.resetWith(packages: [
-      ['meta', metaLibraryStub]
-    ]);
+  void setUp() {
+    super.setUp();
+    addMetaPackage();
   }
 
-  test_publicTopLevelVariable() async {
-    await assertErrorsInCode(r'''
-import 'package:meta/meta.dart';
-@visibleForTesting final _a = 1;
-''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
-  }
-
-  test_topLevelVariable_multiplePrivate() async {
-    await assertErrorsInCode(r'''
-import 'package:meta/meta.dart';
-@visibleForTesting final _a = 1, _b = 2;
-''', [
-      HintCode.INVALID_VISIBILITY_ANNOTATION,
-      HintCode.INVALID_VISIBILITY_ANNOTATION
-    ]);
-  }
-
-  test_topLevelVariable_multipleMixed() async {
-    await assertErrorsInCode(r'''
-import 'package:meta/meta.dart';
-@visibleForTesting final _a = 1, b = 2;
-''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
-  }
-
-  test_topLevelVariable_multiplePublic() async {
-    await assertNoErrorsInCode(r'''
-import 'package:meta/meta.dart';
-@visibleForTesting final a = 1, b = 2;
-''');
-  }
-
-  test_privateTopLevelFucntion() async {
-    await assertErrorsInCode(r'''
-import 'package:meta/meta.dart';
-@visibleForTesting void _f() {}
-''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
-  }
-
-  test_privateTopLevelFunction() async {
-    await assertErrorsInCode(r'''
-import 'package:meta/meta.dart';
-@visibleForTesting void _f() {}
-''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
-  }
-
-  test_privateEnum() async {
-    await assertErrorsInCode(r'''
-import 'package:meta/meta.dart';
-@visibleForTesting enum _E {a, b, c}
-''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
-  }
-
-  test_privateTypedef() async {
-    await assertErrorsInCode(r'''
-import 'package:meta/meta.dart';
-@visibleForTesting typedef _T = Function();
-''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
-  }
-
-  test_privateClass() async {
-    await assertErrorsInCode(r'''
-import 'package:meta/meta.dart';
-@visibleForTesting class _C {}
-''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
-  }
-
-  test_privateMixin() async {
-    await assertErrorsInCode(r'''
-import 'package:meta/meta.dart';
-@visibleForTesting mixin _M {}
-''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
-  }
-
-  test_privateConstructor() async {
+  test_fields_multipleMixed() async {
     await assertErrorsInCode(r'''
 import 'package:meta/meta.dart';
 class C {
-  @visibleForTesting C._() {}
-}
-''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
-  }
-
-  test_privateMethod() async {
-    await assertErrorsInCode(r'''
-import 'package:meta/meta.dart';
-class C {
-  @visibleForTesting void _m() {}
-}
-''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
-  }
-
-  test_privateField() async {
-    await assertErrorsInCode(r'''
-import 'package:meta/meta.dart';
-class C {
-  @visibleForTesting int _a;
+  @visibleForTesting int _a, b;
 }
 ''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
   }
@@ -138,15 +44,6 @@
     ]);
   }
 
-  test_fields_multipleMixed() async {
-    await assertErrorsInCode(r'''
-import 'package:meta/meta.dart';
-class C {
-  @visibleForTesting int _a, b;
-}
-''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
-  }
-
   test_fields_multiplePublic() async {
     await assertNoErrorsInCode(r'''
 import 'package:meta/meta.dart';
@@ -156,6 +53,99 @@
 ''');
   }
 
+  test_privateClass() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@visibleForTesting class _C {}
+''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
+  }
+
+  test_privateConstructor() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class C {
+  @visibleForTesting C._() {}
+}
+''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
+  }
+
+  test_privateEnum() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@visibleForTesting enum _E {a, b, c}
+''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
+  }
+
+  test_privateField() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class C {
+  @visibleForTesting int _a;
+}
+''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
+  }
+
+  test_privateMethod() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class C {
+  @visibleForTesting void _m() {}
+}
+''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
+  }
+
+  test_privateMixin() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@visibleForTesting mixin _M {}
+''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
+  }
+
+  test_privateTopLevelFunction() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@visibleForTesting void _f() {}
+''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
+  }
+
+  test_privateTopLevelVariable() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@visibleForTesting final _a = 1;
+''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
+  }
+
+  test_privateTypedef() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@visibleForTesting typedef _T = Function();
+''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
+  }
+
+  test_topLevelVariable_multipleMixed() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@visibleForTesting final _a = 1, b = 2;
+''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
+  }
+
+  test_topLevelVariable_multiplePrivate() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@visibleForTesting final _a = 1, _b = 2;
+''', [
+      HintCode.INVALID_VISIBILITY_ANNOTATION,
+      HintCode.INVALID_VISIBILITY_ANNOTATION
+    ]);
+  }
+
+  test_topLevelVariable_multiplePublic() async {
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@visibleForTesting final a = 1, b = 2;
+''');
+  }
+
   test_valid() async {
     await assertNoErrorsInCode(r'''
 import 'package:meta/meta.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart
new file mode 100644
index 0000000..ab64700
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart
@@ -0,0 +1,120 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MixinOnSealedClassTest);
+  });
+}
+
+@reflectiveTest
+class MixinOnSealedClassTest extends DriverResolutionTest with PackageMixin {
+  test_mixinOnSealedClass() async {
+    addMetaPackage();
+    _addPackage('foo', r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+''');
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:foo/foo.dart';
+mixin Bar on Foo {}
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    assertTestErrors([HintCode.MIXIN_ON_SEALED_CLASS]);
+  }
+
+  test_withinLibrary_OK() async {
+    addMetaPackage();
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+
+mixin Bar on Foo {}
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    assertNoTestErrors();
+  }
+
+  test_withinPackageLibDirectory_OK() async {
+    addMetaPackage();
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+''');
+    newFile('/pkg1/lib/src/lib2.dart', content: r'''
+import '../lib1.dart';
+mixin Bar on Foo {}
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    await _resolveTestFile('/pkg1/lib/src/lib2.dart');
+    assertNoTestErrors();
+  }
+
+  test_withinPackageTestDirectory_OK() async {
+    addMetaPackage();
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+''');
+    newFile('/pkg1/test/test.dart', content: r'''
+import '../lib/lib1.dart';
+mixin Bar on Foo {}
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    await _resolveTestFile('/pkg1/test/test.dart');
+    assertNoTestErrors();
+  }
+
+  test_withinPart_OK() async {
+    addMetaPackage();
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:meta/meta.dart';
+part 'part1.dart';
+@sealed class Foo {}
+''');
+    newFile('/pkg1/lib/part1.dart', content: r'''
+part of 'lib1.dart';
+mixin Bar on Foo {}
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    assertNoTestErrors();
+  }
+
+  /// Add a package named [name], and one library file, with content
+  /// [libraryContent].
+  void _addPackage(String name, String libraryContent) {
+    Folder lib = addPubPackage(name);
+    newFile(join(lib.path, '$name.dart'), content: libraryContent);
+  }
+
+  /// Write a pubspec file at [root], so that BestPracticesVerifier can see
+  /// that [root] is the root of a PubWorkspace, and a PubWorkspacePackage.
+  void _newPubPackageRoot(String root) {
+    newFile('$root/pubspec.yaml');
+  }
+
+  /// Resolve the test file at [path].
+  ///
+  /// Similar to ResolutionTest.resolveTestFile, but a custom path is supported.
+  Future<void> _resolveTestFile(String path) async {
+    result = await resolveFile(convertPath(path));
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/must_be_immutable_test.dart b/pkg/analyzer/test/src/diagnostics/must_be_immutable_test.dart
new file mode 100644
index 0000000..c444236
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/must_be_immutable_test.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MustBeImmutableTest);
+  });
+}
+
+@reflectiveTest
+class MustBeImmutableTest extends DriverResolutionTest with PackageMixin {
+  void setUp() {
+    super.setUp();
+    addMetaPackage();
+  }
+
+  test_directAnnotation() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@immutable
+class A {
+  int x;
+}
+''', [HintCode.MUST_BE_IMMUTABLE]);
+  }
+
+  test_directMixinAnnotation() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@immutable
+mixin A {
+  int x;
+}
+''', [HintCode.MUST_BE_IMMUTABLE]);
+  }
+
+  test_extendsClassWithAnnotation() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@immutable
+class A {}
+class B extends A {
+  int x;
+}
+''', [HintCode.MUST_BE_IMMUTABLE]);
+  }
+
+  test_fromMixinWithAnnotation() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@immutable
+class A {}
+class B {
+  int x;
+}
+class C extends A with B {}
+''', [HintCode.MUST_BE_IMMUTABLE]);
+  }
+
+  test_staticField() async {
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@immutable
+class A {
+  static int x;
+}
+''');
+  }
+
+  test_mixinApplication() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@immutable
+class A {}
+class B {
+  int x;
+}
+class C = A with B;
+''', [HintCode.MUST_BE_IMMUTABLE]);
+  }
+
+  test_mixinApplicationBase() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  int x;
+}
+class B {}
+@immutable
+class C = A with B;
+''', [HintCode.MUST_BE_IMMUTABLE]);
+  }
+
+  test_finalField() async {
+    addMetaPackage();
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+@immutable
+class A {
+  final x = 7;
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/must_call_super_test.dart b/pkg/analyzer/test/src/diagnostics/must_call_super_test.dart
new file mode 100644
index 0000000..d2e6efb
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/must_call_super_test.dart
@@ -0,0 +1,129 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MustCallSuperTest);
+  });
+}
+
+@reflectiveTest
+class MustCallSuperTest extends DriverResolutionTest with PackageMixin {
+  setUp() {
+    super.setUp();
+    addMetaPackage();
+  }
+
+  test_fromExtendingClass() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @mustCallSuper
+  void a() {}
+}
+class B extends A {
+  @override
+  void a()
+  {}
+}
+''', [HintCode.MUST_CALL_SUPER]);
+  }
+
+  test_fromInterface() async {
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @mustCallSuper
+  void a() {}
+}
+class C implements A {
+  @override
+  void a() {}
+}
+''');
+  }
+
+  test_indirectlyInherited() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @mustCallSuper
+  void a() {}
+}
+class C extends A {
+  @override
+  void a() {
+    super.a();
+  }
+}
+class D extends C {
+  @override
+  void a() {}
+}
+''', [HintCode.MUST_CALL_SUPER]);
+  }
+
+  test_containsSuperCall() async {
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @mustCallSuper
+  void a() {}
+}
+class C extends A {
+  @override
+  void a() {
+    super.a(); // OK
+  }
+}
+''');
+  }
+
+  test_overriddenWithFuture() async {
+    // https://github.com/flutter/flutter/issues/11646
+    await assertNoErrorsInCode(r'''
+import 'dart:async';
+import 'package:meta/meta.dart';
+class A {
+  @mustCallSuper
+  Future<Null> bar() => new Future<Null>.value();
+}
+class C extends A {
+  @override
+  Future<Null> bar() {
+    final value = super.bar();
+    return value.then((Null _) {
+      return null;
+    });
+  }
+}
+''');
+  }
+
+  test_overriddenWithFuture2() async {
+    // https://github.com/flutter/flutter/issues/11646
+    await assertNoErrorsInCode(r'''
+import 'dart:async';
+import 'package:meta/meta.dart';
+class A {
+  @mustCallSuper
+  Future<Null> bar() => new Future<Null>.value();
+}
+class C extends A {
+  @override
+  Future<Null> bar() {
+    return super.bar().then((Null _) {
+      return null;
+    });
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor.dart b/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor.dart
new file mode 100644
index 0000000..a0f1591
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor.dart
@@ -0,0 +1,116 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NonConstCallToLiteralConstructorTest);
+  });
+}
+
+@reflectiveTest
+class NonConstCallToLiteralConstructorTest extends DriverResolutionTest
+    with PackageMixin {
+  @override
+  void setUp() {
+    super.setUp();
+    addMetaPackage();
+  }
+
+  test_nonConstContext() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  const A();
+}
+void main() {
+  var a = A();
+}
+''', [HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR]);
+  }
+
+  test_usingNew() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  const A();
+}
+void main() {
+  var a = new A();
+}
+''', [HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW]);
+  }
+
+  test_namedConstructor() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  const A.named();
+}
+void main() {
+  var a = A.named();
+}
+''', [HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR]);
+  }
+
+  test_constConstructor() async {
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  const A();
+}
+''');
+  }
+
+  test_constCreation() async {
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  const A();
+}
+
+void main() {
+  const a = const A();
+}
+''');
+  }
+
+  test_constContextCreation() async {
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  const A();
+}
+
+void main() {
+  const a = A();
+}
+''');
+  }
+
+  test_unconstableCreation() async {
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  const A(List list);
+}
+
+void main() {
+  var a = A(new List());
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
new file mode 100644
index 0000000..459422f
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NonConstantMapElementWithUiAsCodeTest);
+  });
+}
+
+@reflectiveTest
+class NonConstantMapElementWithUiAsCodeTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+    ];
+
+  test_forElement_cannotBeConst() async {
+    await assertErrorsInCode('''
+void main() {
+  const {1: null, for (final x in const []) null: null};
+}
+''', [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
+  }
+
+  test_forElement_nested_cannotBeConst() async {
+    await assertErrorsInCode('''
+void main() {
+  const {1: null, if (true) for (final x in const []) null: null};
+}
+''', [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
+  }
+
+  test_forElement_notConst_noError() async {
+    await assertNoErrorsInCode('''
+void main() {
+  var x;
+  print({x: x, for (final x2 in [x]) x2: x2});
+}
+''');
+  }
+
+  test_ifElement_mayBeConst() async {
+    await assertNoErrorsInCode('''
+void main() {
+  const {1: null, if (true) null: null};
+}
+''');
+  }
+
+  test_ifElement_nested_mayBeConst() async {
+    await assertNoErrorsInCode('''
+void main() {
+  const {1: null, if (true) if (true) null: null};
+}
+''');
+  }
+
+  test_ifElement_notConstCondition() async {
+    await assertErrorsInCode('''
+void main() {
+  bool notConst = true;
+  const {1: null, if (notConst) null: null};
+}
+''', [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
+  }
+
+  @failingTest
+  test_ifElementWithElse_mayBeConst() async {
+    await assertNoErrorsInCode('''
+void main() {
+  const isTrue = true;
+  const {1: null, if (isTrue) null: null else null: null};
+}
+''');
+  }
+
+  test_spreadElement_mayBeConst() async {
+    await assertNoErrorsInCode('''
+void main() {
+  const {1: null, ...{null: null}};
+}
+''');
+  }
+
+  test_spreadElement_notConst() async {
+    await assertErrorsInCode('''
+void main() {
+  var notConst = {};
+  const {1: null, ...notConst};
+}
+''', [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart b/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart
new file mode 100644
index 0000000..c0efd81
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart
@@ -0,0 +1,214 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SubtypeOfSealedClassTest);
+  });
+}
+
+@reflectiveTest
+class SubtypeOfSealedClassTest extends DriverResolutionTest with PackageMixin {
+  test_extendingSealedClass() async {
+    addMetaPackage();
+    _addPackage('foo', r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+''');
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:foo/foo.dart';
+class Bar extends Foo {}
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    assertTestErrors([HintCode.SUBTYPE_OF_SEALED_CLASS]);
+  }
+
+  test_implementingSealedClass() async {
+    addMetaPackage();
+    _addPackage('foo', r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+''');
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:foo/foo.dart';
+class Bar implements Foo {}
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    assertTestErrors([HintCode.SUBTYPE_OF_SEALED_CLASS]);
+  }
+
+  test_mixinApplicationOfSealedClass() async {
+    addMetaPackage();
+    _addPackage('foo', r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+''');
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:foo/foo.dart';
+class Bar1 {}
+class Bar2 = Bar1 with Foo;
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    assertTestErrors([HintCode.SUBTYPE_OF_SEALED_CLASS]);
+  }
+
+  test_mixinImplementsSealedClass() async {
+    addMetaPackage();
+    _addPackage('foo', r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+''');
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:foo/foo.dart';
+mixin Bar implements Foo {}
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    assertTestErrors([HintCode.SUBTYPE_OF_SEALED_CLASS]);
+  }
+
+  test_mixingInWithSealedMixin() async {
+    addMetaPackage();
+    _addPackage('foo', r'''
+import 'package:meta/meta.dart';
+@sealed mixin Foo {}
+''');
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:foo/foo.dart';
+class Bar extends Object with Foo {}
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    assertTestErrors([HintCode.SUBTYPE_OF_SEALED_CLASS]);
+  }
+
+  test_mixinApplicationOfSealedMixin() async {
+    addMetaPackage();
+    _addPackage('foo', r'''
+import 'package:meta/meta.dart';
+@sealed mixin Foo {}
+''');
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:foo/foo.dart';
+class Bar1 {}
+class Bar2 = Bar1 with Foo;
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    assertTestErrors([HintCode.SUBTYPE_OF_SEALED_CLASS]);
+  }
+
+  test_withinLibrary_OK() async {
+    addMetaPackage();
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+
+class Bar1 extends Foo {}
+class Bar2 implements Foo {}
+class Bar4 = Bar1 with Foo;
+mixin Bar5 implements Foo {}
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    assertNoTestErrors();
+  }
+
+  test_withinPackageLibDirectory_OK() async {
+    addMetaPackage();
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+''');
+    newFile('/pkg1/lib/src/lib2.dart', content: r'''
+import '../lib1.dart';
+class Bar1 extends Foo {}
+class Bar2 implements Foo {}
+class Bar4 = Bar1 with Foo;
+mixin Bar5 implements Foo {}
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    await _resolveTestFile('/pkg1/lib/src/lib2.dart');
+    assertNoTestErrors();
+  }
+
+  test_withinPackageTestDirectory_OK() async {
+    addMetaPackage();
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+''');
+    newFile('/pkg1/test/test.dart', content: r'''
+import '../lib/lib1.dart';
+class Bar1 extends Foo {}
+class Bar2 implements Foo {}
+class Bar4 = Bar1 with Foo;
+mixin Bar5 implements Foo {}
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    await _resolveTestFile('/pkg1/test/test.dart');
+    assertNoTestErrors();
+  }
+
+  test_withinPart_OK() async {
+    addMetaPackage();
+
+    _newPubPackageRoot('/pkg1');
+    newFile('/pkg1/lib/lib1.dart', content: r'''
+import 'package:meta/meta.dart';
+part 'part1.dart';
+@sealed class Foo {}
+''');
+    newFile('/pkg1/lib/part1.dart', content: r'''
+part of 'lib1.dart';
+class Bar1 extends Foo {}
+class Bar2 implements Foo {}
+class Bar4 = Bar1 with Foo;
+mixin Bar5 implements Foo {}
+''');
+    await _resolveTestFile('/pkg1/lib/lib1.dart');
+    assertNoTestErrors();
+  }
+
+  /// Add a package named [name], and one library file, with content
+  /// [libraryContent].
+  void _addPackage(String name, String libraryContent) {
+    Folder lib = addPubPackage(name);
+    newFile(join(lib.path, '$name.dart'), content: libraryContent);
+  }
+
+  /// Write a pubspec file at [root], so that BestPracticesVerifier can see
+  /// that [root] is the root of a PubWorkspace, and a PubWorkspacePackage.
+  void _newPubPackageRoot(String root) {
+    newFile('$root/pubspec.yaml');
+  }
+
+  /// Resolve the test file at [path].
+  ///
+  /// Similar to ResolutionTest.resolveTestFile, but a custom path is supported.
+  Future<void> _resolveTestFile(String path) async {
+    result = await resolveFile(convertPath(path));
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 5deb7f2..fed2324 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -6,15 +6,27 @@
 
 import 'argument_type_not_assignable_test.dart' as argument_type_not_assignable;
 import 'can_be_null_after_null_aware_test.dart' as can_be_null_after_null_aware;
+import 'const_constructor_param_type_mismatch_test.dart'
+    as const_constructor_param_type_mismatch;
+import 'dead_code_test.dart' as dead_code;
 import 'deprecated_member_use_test.dart' as deprecated_member_use;
 import 'division_optimization_test.dart' as division_optimization;
+import 'equal_keys_in_map_test.dart' as equal_keys_in_map;
 import 'invalid_assignment_test.dart' as invalid_assignment;
 import 'invalid_cast_new_expr_test.dart' as invalid_cast_new_expr;
+import 'invalid_immutable_annotation_test.dart' as invalid_immutable_annotation;
+import 'invalid_literal_annotation_test.dart' as invalid_literal_annotation;
 import 'invalid_override_different_default_values_named_test.dart'
     as invalid_override_different_default_values_named;
 import 'invalid_override_different_default_values_positional_test.dart'
     as invalid_override_different_default_values_positional;
 import 'invalid_required_param_test.dart' as invalid_required_param;
+import 'invalid_sealed_annotation_test.dart' as invalid_sealed_annotation;
+import 'mixin_on_sealed_class_test.dart' as mixin_on_sealed_class;
+import 'must_be_immutable_test.dart' as must_be_immutable;
+import 'must_call_super_test.dart' as must_call_super;
+import 'subtype_of_sealed_class_test.dart' as subtype_of_sealed_class;
+import 'non_constant_map_element_test.dart' as non_constant_map_element;
 import 'top_level_instance_getter_test.dart' as top_level_instance_getter;
 import 'top_level_instance_method_test.dart' as top_level_instance_method;
 import 'type_check_is_not_null_test.dart' as type_check_is_not_null;
@@ -22,10 +34,12 @@
 import 'undefined_getter_test.dart' as undefined_getter;
 import 'undefined_hidden_name_test.dart' as undefined_hidden_name;
 import 'undefined_operator_test.dart' as undefined_operator;
+import 'undefined_prefixed_name_test.dart' as undefined_prefixed_name;
 import 'undefined_setter_test.dart' as undefined_setter;
 import 'undefined_shown_name_test.dart' as undefined_shown_name;
 import 'unnecessary_cast_test.dart' as unnecessary_cast;
 import 'unnecessary_no_such_method_test.dart' as unnecessary_no_such_method;
+import 'unnecessary_null_aware_call_test.dart' as unnecessary_null_aware_call;
 import 'unnecessary_type_check_false_test.dart' as unnecessary_type_check_false;
 import 'unnecessary_type_check_true_test.dart' as unnecessary_type_check_true;
 import 'unused_catch_clause_test.dart' as unused_catch_clause;
@@ -37,18 +51,30 @@
 import 'unused_local_variable_test.dart' as unused_local_variable;
 import 'unused_shown_name_test.dart' as unused_shown_name;
 import 'use_of_void_result_test.dart' as use_of_void_result;
+import 'variable_type_mismatch_test.dart' as variable_type_mismatch;
 
 main() {
   defineReflectiveSuite(() {
     argument_type_not_assignable.main();
     can_be_null_after_null_aware.main();
+    const_constructor_param_type_mismatch.main();
+    dead_code.main();
     deprecated_member_use.main();
     division_optimization.main();
+    equal_keys_in_map.main();
     invalid_assignment.main();
     invalid_cast_new_expr.main();
+    invalid_immutable_annotation.main();
+    invalid_literal_annotation.main();
     invalid_override_different_default_values_named.main();
     invalid_override_different_default_values_positional.main();
     invalid_required_param.main();
+    invalid_sealed_annotation.main();
+    mixin_on_sealed_class.main();
+    must_be_immutable.main();
+    must_call_super.main();
+    subtype_of_sealed_class.main();
+    non_constant_map_element.main();
     top_level_instance_getter.main();
     top_level_instance_method.main();
     type_check_is_not_null.main();
@@ -56,10 +82,12 @@
     undefined_getter.main();
     undefined_hidden_name.main();
     undefined_operator.main();
+    undefined_prefixed_name.main();
     undefined_setter.main();
     undefined_shown_name.main();
     unnecessary_cast.main();
     unnecessary_no_such_method.main();
+    unnecessary_null_aware_call.main();
     unnecessary_type_check_false.main();
     unnecessary_type_check_true.main();
     unused_catch_clause.main();
@@ -71,5 +99,6 @@
     unused_local_variable.main();
     unused_shown_name.main();
     use_of_void_result.main();
+    variable_type_mismatch.main();
   }, name: 'diagnostics');
 }
diff --git a/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart
index 36dc5fb..621b6b3 100644
--- a/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart
@@ -4,9 +4,10 @@
 
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -15,12 +16,10 @@
 }
 
 @reflectiveTest
-class UncheckedUseOfNullableValueTest extends ResolverTestCase {
+class UncheckedUseOfNullableValueTest extends DriverResolutionTest {
   @override
-  List<String> get enabledExperiments => [EnableString.non_nullable];
-
-  @override
-  bool get enableNewAnalysisDriver => true;
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
 
   test_and_nonNullable() async {
     await assertNoErrorsInCode(r'''
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
index e0f34b6..75f0359 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
@@ -4,9 +4,10 @@
 
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -16,10 +17,7 @@
 }
 
 @reflectiveTest
-class UndefinedGetterTest extends ResolverTestCase {
-  @override
-  bool get enableNewAnalysisDriver => true;
-
+class UndefinedGetterTest extends DriverResolutionTest {
   test_ifStatement_notPromoted() async {
     await assertErrorsInCode('''
 f(int x) {
@@ -27,7 +25,7 @@
     x.length;
   }
 }
-''', [StaticTypeWarningCode.UNDEFINED_GETTER], verify: false);
+''', [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   test_ifStatement_promoted() async {
@@ -47,25 +45,23 @@
     y.isEven;
   }
 }
-''', [StaticTypeWarningCode.UNDEFINED_GETTER], verify: false);
+''', [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 }
 
 @reflectiveTest
-class UndefinedGetterWithControlFlowCollectionsTest extends ResolverTestCase {
+class UndefinedGetterWithControlFlowCollectionsTest
+    extends DriverResolutionTest {
   @override
-  List<String> get enabledExperiments =>
-      [EnableString.control_flow_collections, EnableString.set_literals];
-
-  @override
-  bool get enableNewAnalysisDriver => true;
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [EnableString.control_flow_collections];
 
   test_ifElement_inList_notPromoted() async {
     await assertErrorsInCode('''
 f(int x) {
   return [if (x is String) x.length];
 }
-''', [StaticTypeWarningCode.UNDEFINED_GETTER], verify: false);
+''', [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   test_ifElement_inList_promoted() async {
@@ -81,7 +77,7 @@
 f(int x) {
   return {if (x is String) x : x.length};
 }
-''', [StaticTypeWarningCode.UNDEFINED_GETTER], verify: false);
+''', [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   test_ifElement_inMap_promoted() async {
@@ -97,7 +93,7 @@
 f(int x) {
   return {if (x is String) x.length};
 }
-''', [StaticTypeWarningCode.UNDEFINED_GETTER], verify: false);
+''', [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   test_ifElement_inSet_promoted() async {
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart
new file mode 100644
index 0000000..b6ba333
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UndefinedPrefixedNameTest);
+  });
+}
+
+@reflectiveTest
+class UndefinedPrefixedNameTest extends DriverResolutionTest {
+  test_getterContext() async {
+    newFile('/test/lib/lib.dart');
+    await assertErrorsInCode('''
+import 'lib.dart' as p;
+f() => p.c;
+''', [StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME]);
+  }
+
+  test_setterContext() async {
+    newFile('/test/lib/lib.dart');
+    await assertErrorsInCode('''
+import 'lib.dart' as p;
+f() {
+  p.c = 0;
+}
+''', [StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart
index 28e76bf..5459327 100644
--- a/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -14,7 +14,7 @@
 }
 
 @reflectiveTest
-class UnnecessaryCastTest extends ResolverTestCase {
+class UnnecessaryCastTest extends DriverResolutionTest {
   test_conditionalExpression() async {
     await assertNoErrorsInCode(r'''
 abstract class I {}
@@ -57,6 +57,17 @@
 ''');
   }
 
+  test_generics() async {
+    // dartbug.com/18953
+    assertErrorsInCode(r'''
+import 'dart:async';
+Future<int> f() => new Future.value(0);
+void g(bool c) {
+  (c ? f(): new Future.value(0) as Future<int>).then((int value) {});
+}
+''', [HintCode.UNNECESSARY_CAST]);
+  }
+
   test_parameter_A() async {
     // dartbug.com/13855, dartbug.com/13732
     await assertNoErrorsInCode(r'''
@@ -95,18 +106,4 @@
 }
 ''', [HintCode.UNNECESSARY_CAST]);
   }
-
-  @override
-  bool get enableNewAnalysisDriver => true;
-
-  test_generics() async {
-    // dartbug.com/18953
-    assertErrorsInCode(r'''
-import 'dart:async';
-Future<int> f() => new Future.value(0);
-void g(bool c) {
-  (c ? f(): new Future.value(0) as Future<int>).then((int value) {});
-}
-''', [HintCode.UNNECESSARY_CAST]);
-  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_null_aware_call_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_null_aware_call_test.dart
new file mode 100644
index 0000000..49c7eb1
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_null_aware_call_test.dart
@@ -0,0 +1,120 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnnecesaryNullAwareCallTest);
+  });
+}
+
+@reflectiveTest
+class UnnecesaryNullAwareCallTest extends ResolverTestCase {
+  @override
+  List<String> get enabledExperiments => [EnableString.non_nullable];
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_getter_parenthesized_nonNull() async {
+    await assertErrorsInCode('''
+@pragma('analyzer:non-nullable')
+library foo;
+
+f() {
+  int x;
+  (x)?.isEven;
+}
+''', [HintCode.UNNECESSARY_NULL_AWARE_CALL]);
+  }
+
+  test_getter_parenthesized_nullable() async {
+    await assertNoErrorsInCode('''
+@pragma('analyzer:non-nullable')
+library foo;
+
+f() {
+  int? x;
+  (x)?.isEven;
+}
+''');
+  }
+
+  test_getter_simple_nonNull() async {
+    await assertErrorsInCode('''
+@pragma('analyzer:non-nullable')
+library foo;
+
+f() {
+  int x;
+  x?.isEven;
+}
+''', [HintCode.UNNECESSARY_NULL_AWARE_CALL]);
+  }
+
+  test_getter_simple_nullable() async {
+    await assertNoErrorsInCode('''
+@pragma('analyzer:non-nullable')
+library foo;
+
+f() {
+  int? x;
+  x?.isEven;
+}
+''');
+  }
+
+  test_method_parenthesized_nonNull() async {
+    await assertErrorsInCode('''
+@pragma('analyzer:non-nullable')
+library foo;
+
+f() {
+  int x;
+  (x)?.round();
+}
+''', [HintCode.UNNECESSARY_NULL_AWARE_CALL]);
+  }
+
+  test_method_parenthesized_nullable() async {
+    await assertNoErrorsInCode('''
+@pragma('analyzer:non-nullable')
+library foo;
+
+f() {
+  int? x;
+  (x)?.round();
+}
+''');
+  }
+
+  test_method_simple_nonNull() async {
+    await assertErrorsInCode('''
+@pragma('analyzer:non-nullable')
+library foo;
+
+f() {
+  int x;
+  x?.round();
+}
+''', [HintCode.UNNECESSARY_NULL_AWARE_CALL]);
+  }
+
+  test_method_simple_nullable() async {
+    await assertNoErrorsInCode('''
+@pragma('analyzer:non-nullable')
+library foo;
+
+f() {
+  int? x;
+  x?.round();
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/unused_catch_stack_test.dart b/pkg/analyzer/test/src/diagnostics/unused_catch_stack_test.dart
index 0a7330b..71bba94 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_catch_stack_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_catch_stack_test.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -14,12 +14,11 @@
 }
 
 @reflectiveTest
-class UnusedCatchStackTest extends ResolverTestCase {
+class UnusedCatchStackTest extends DriverResolutionTest {
   @override
-  bool get enableNewAnalysisDriver => true;
+  bool get enableUnusedLocalVariable => true;
 
   test_on_unusedStack() async {
-    enableUnusedLocalVariable = true;
     await assertErrorsInCode(r'''
 main() {
   try {
@@ -30,7 +29,6 @@
   }
 
   test_on_usedStack() async {
-    enableUnusedLocalVariable = true;
     await assertNoErrorsInCode(r'''
 main() {
   try {
@@ -42,7 +40,6 @@
   }
 
   test_unusedStack() async {
-    enableUnusedLocalVariable = true;
     await assertErrorsInCode(r'''
 main() {
   try {
@@ -53,7 +50,6 @@
   }
 
   test_usedStack() async {
-    enableUnusedLocalVariable = true;
     await assertNoErrorsInCode(r'''
 main() {
   try {
diff --git a/pkg/analyzer/test/src/diagnostics/unused_field_test.dart b/pkg/analyzer/test/src/diagnostics/unused_field_test.dart
index 3fa352c..91c7082 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_field_test.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -14,10 +14,7 @@
 }
 
 @reflectiveTest
-class UnusedFieldTest extends ResolverTestCase {
-  @override
-  bool get enableNewAnalysisDriver => true;
-
+class UnusedFieldTest extends DriverResolutionTest {
   @override
   bool get enableUnusedElement => true;
 
diff --git a/pkg/analyzer/test/src/diagnostics/unused_import_test.dart b/pkg/analyzer/test/src/diagnostics/unused_import_test.dart
index 34319e4..f94815c 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_import_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_import_test.dart
@@ -3,10 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -15,210 +14,142 @@
 }
 
 @reflectiveTest
-class UnusedImportTest extends ResolverTestCase {
-  @override
-  bool get enableNewAnalysisDriver => true;
-
+class UnusedImportTest extends DriverResolutionTest {
   test_annotationOnDirective() async {
-    Source source = addSource(r'''
-library L;
-@A()
-import 'lib1.dart';
-''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
+    newFile('/test/lib/lib1.dart', content: r'''
 class A {
   const A() {}
 }
 ''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source);
-    verify([source, source2]);
+    await assertNoErrorsInCode(r'''
+@A()
+import 'lib1.dart';
+''');
   }
 
   test_as() async {
-    Source source = addSource(r'''
-library L;
+    newFile('/test/lib/lib1.dart', content: r'''
+class A {}
+''');
+    await assertErrorsInCode(r'''
 import 'lib1.dart';
 import 'lib1.dart' as one;
 one.A a;
-''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    verify([source, source2]);
+''', [HintCode.UNUSED_IMPORT]);
   }
 
   test_as_equalPrefixes_referenced() async {
     // 18818
-    Source source = addSource(r'''
-library L;
+    newFile('/test/lib/lib1.dart', content: r'''
+class A {}
+''');
+    newFile('/test/lib/lib2.dart', content: r'''
+class B {}
+''');
+    await assertNoErrorsInCode(r'''
 import 'lib1.dart' as one;
 import 'lib2.dart' as one;
 one.A a;
 one.B b;
 ''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}
-''');
-    Source source3 = addNamedSource("/lib2.dart", r'''
-library lib2;
-class B {}
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    await computeAnalysisResult(source3);
-    assertErrors(source);
-    assertNoErrors(source2);
-    assertNoErrors(source3);
-    verify([source, source2, source3]);
   }
 
   @failingTest
   test_as_equalPrefixes_unreferenced() async {
     // See todo at ImportsVerifier.prefixElementMap.
-    Source source = addSource(r'''
-library L;
+    newFile('/test/lib/lib1.dart', content: r'''
+class A {}
+''');
+    newFile('/test/lib/lib2.dart', content: r'''
+class B {}
+''');
+    await assertErrorsInCode(r'''
 import 'lib1.dart' as one;
 import 'lib2.dart' as one;
 one.A a;
-''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}
-''');
-    Source source3 = addNamedSource("/lib2.dart", r'''
-library lib2;
-class B {}
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    await computeAnalysisResult(source3);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    assertNoErrors(source3);
-    verify([source, source2, source3]);
+''', [HintCode.UNUSED_IMPORT]);
   }
 
   test_core_library() async {
-    Source source = addSource(r'''
-library L;
+    await assertNoErrorsInCode(r'''
 import 'dart:core';
 ''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   test_export() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart';
-Two two;
-''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
+    newFile('/test/lib/lib1.dart', content: r'''
 export 'lib2.dart';
 class One {}
 ''');
-    addNamedSource("/lib2.dart", r'''
-library lib2;
+    newFile('/test/lib/lib2.dart', content: r'''
 class Two {}
 ''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await assertNoErrorsInCode(r'''
+import 'lib1.dart';
+Two two;
+''');
   }
 
   test_export2() async {
-    Source source = addSource(r'''
-library L;
+    newFile('/test/lib/lib1.dart', content: r'''
+export 'lib2.dart';
+class One {}
+''');
+    newFile('/test/lib/lib2.dart', content: r'''
+export 'lib3.dart';
+class Two {}
+''');
+    newFile('/test/lib/lib3.dart', content: r'''
+class Three {}
+''');
+    await assertNoErrorsInCode(r'''
 import 'lib1.dart';
 Three three;
 ''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-export 'lib2.dart';
-class One {}
-''');
-    addNamedSource("/lib2.dart", r'''
-library lib2;
-export 'lib3.dart';
-class Two {}
-''');
-    addNamedSource("/lib3.dart", r'''
-library lib3;
-class Three {}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   test_export_infiniteLoop() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart';
-Two two;
-''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
+    newFile('/test/lib/lib1.dart', content: r'''
 export 'lib2.dart';
 class One {}
 ''');
-    addNamedSource("/lib2.dart", r'''
-library lib2;
+    newFile('/test/lib/lib2.dart', content: r'''
 export 'lib3.dart';
 class Two {}
 ''');
-    addNamedSource("/lib3.dart", r'''
-library lib3;
+    newFile('/test/lib/lib3.dart', content: r'''
 export 'lib2.dart';
 class Three {}
 ''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    await assertNoErrorsInCode(r'''
+import 'lib1.dart';
+Two two;
+''');
   }
 
   test_hide() async {
-    Source source = addSource(r'''
-library L;
+    newFile('/test/lib/lib1.dart', content: r'''
+class A {}
+''');
+    await assertErrorsInCode(r'''
 import 'lib1.dart';
 import 'lib1.dart' hide A;
 A a;
-''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    verify([source, source2]);
+''', [HintCode.UNUSED_IMPORT]);
   }
 
   test_inComment_libraryDirective() async {
-    Source source = addSource(r'''
+    await assertNoErrorsInCode(r'''
 /// Use [Future] class.
-library L;
 import 'dart:async';
 ''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
   }
 
   test_metadata() async {
-    Source source = addSource(r'''
-library L;
+    newFile('/test/lib/lib1.dart', content: r'''
+const x = 0;
+''');
+    await assertNoErrorsInCode(r'''
 @A(x)
 import 'lib1.dart';
 class A {
@@ -226,18 +157,14 @@
   const A(this.value);
 }
 ''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-const x = 0;
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   test_prefix_topLevelFunction() async {
-    Source source = addSource(r'''
-library L;
+    newFile('/test/lib/lib1.dart', content: r'''
+class One {}
+topLevelFunction() {}
+''');
+    await assertNoErrorsInCode(r'''
 import 'lib1.dart' hide topLevelFunction;
 import 'lib1.dart' as one show topLevelFunction;
 class A {
@@ -247,19 +174,14 @@
   }
 }
 ''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-class One {}
-topLevelFunction() {}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   test_prefix_topLevelFunction2() async {
-    Source source = addSource(r'''
-library L;
+    newFile('/test/lib/lib1.dart', content: r'''
+class One {}
+topLevelFunction() {}
+''');
+    await assertNoErrorsInCode(r'''
 import 'lib1.dart' hide topLevelFunction;
 import 'lib1.dart' as one show topLevelFunction;
 import 'lib1.dart' as two show topLevelFunction;
@@ -271,47 +193,24 @@
   }
 }
 ''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-class One {}
-topLevelFunction() {}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
   }
 
   test_show() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' show A;
-import 'lib1.dart' show B;
-A a;
-''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
+    newFile('/test/lib/lib1.dart', content: r'''
 class A {}
 class B {}
 ''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    verify([source, source2]);
+    await assertErrorsInCode(r'''
+import 'lib1.dart' show A;
+import 'lib1.dart' show B;
+A a;
+''', [HintCode.UNUSED_IMPORT]);
   }
 
   test_unusedImport() async {
-    Source source = addSource(r'''
-library L;
+    newFile('/test/lib/lib1.dart');
+    await assertErrorsInCode(r'''
 import 'lib1.dart';
-''');
-    Source source2 = addNamedSource("/lib1.dart", '''
-library lib1;
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    verify([source, source2]);
+''', [HintCode.UNUSED_IMPORT]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/unused_label_test.dart b/pkg/analyzer/test/src/diagnostics/unused_label_test.dart
index e14f291..7d3a4f4 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_label_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_label_test.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -14,10 +14,7 @@
 }
 
 @reflectiveTest
-class UnusedLabelTest extends ResolverTestCase {
-  @override
-  bool get enableNewAnalysisDriver => true;
-
+class UnusedLabelTest extends DriverResolutionTest {
   test_unused_inSwitch() async {
     await assertErrorsInCode(r'''
 f(x) {
diff --git a/pkg/analyzer/test/src/diagnostics/unused_local_variable_test.dart b/pkg/analyzer/test/src/diagnostics/unused_local_variable_test.dart
index ee12d06..ef082c4 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_local_variable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_local_variable_test.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -14,12 +14,11 @@
 }
 
 @reflectiveTest
-class UnusedLocalVariableTest extends ResolverTestCase {
+class UnusedLocalVariableTest extends DriverResolutionTest {
   @override
-  bool get enableNewAnalysisDriver => true;
+  bool get enableUnusedLocalVariable => true;
 
   test_inFor_underscore_ignored() async {
-    enableUnusedLocalVariable = true;
     await assertNoErrorsInCode(r'''
 main() {
   for (var _ in [1,2,3]) {
@@ -32,7 +31,6 @@
   }
 
   test_inFunction() async {
-    enableUnusedLocalVariable = true;
     await assertErrorsInCode(r'''
 main() {
   var v = 1;
@@ -42,7 +40,6 @@
   }
 
   test_inMethod() async {
-    enableUnusedLocalVariable = true;
     await assertErrorsInCode(r'''
 class A {
   foo() {
@@ -54,7 +51,6 @@
   }
 
   test_isInvoked() async {
-    enableUnusedLocalVariable = true;
     await assertNoErrorsInCode(r'''
 typedef Foo();
 main() {
@@ -65,7 +61,6 @@
   }
 
   test_isNullAssigned() async {
-    enableUnusedLocalVariable = true;
     await assertNoErrorsInCode(r'''
 typedef Foo();
 main() {
@@ -77,7 +72,6 @@
   }
 
   test_isRead_notUsed_compoundAssign() async {
-    enableUnusedLocalVariable = true;
     await assertErrorsInCode(r'''
 main() {
   var v = 1;
@@ -87,7 +81,6 @@
   }
 
   test_isRead_notUsed_postfixExpr() async {
-    enableUnusedLocalVariable = true;
     await assertErrorsInCode(r'''
 main() {
   var v = 1;
@@ -97,7 +90,6 @@
   }
 
   test_isRead_notUsed_prefixExpr() async {
-    enableUnusedLocalVariable = true;
     await assertErrorsInCode(r'''
 main() {
   var v = 1;
@@ -107,7 +99,6 @@
   }
 
   test_isRead_usedArgument() async {
-    enableUnusedLocalVariable = true;
     await assertNoErrorsInCode(r'''
 main() {
   var v = 1;
@@ -118,7 +109,6 @@
   }
 
   test_isRead_usedInvocationTarget() async {
-    enableUnusedLocalVariable = true;
     await assertNoErrorsInCode(r'''
 class A {
   foo() {}
diff --git a/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart b/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
index 7b9f834..c798569 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
@@ -3,10 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -15,89 +14,57 @@
 }
 
 @reflectiveTest
-class UnusedShownNameTest extends ResolverTestCase {
-  @override
-  bool get enableNewAnalysisDriver => true;
-
+class UnusedShownNameTest extends DriverResolutionTest {
   test_unreferenced() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' show A, B;
-A a;
-''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
+    newFile('/test/lib/lib1.dart', content: r'''
 class A {}
 class B {}
 ''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
-    assertNoErrors(source2);
-    verify([source, source2]);
+    assertErrorsInCode(r'''
+import 'lib1.dart' show A, B;
+A a;
+''', [HintCode.UNUSED_SHOWN_NAME]);
   }
 
   test_unusedShownName_as() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' as p show A, B;
-p.A a;
-''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
+    newFile('/test/lib/lib1.dart', content: r'''
 class A {}
 class B {}
 ''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
-    assertNoErrors(source2);
-    verify([source, source2]);
+    assertErrorsInCode(r'''
+import 'lib1.dart' as p show A, B;
+p.A a;
+''', [HintCode.UNUSED_SHOWN_NAME]);
   }
 
   test_unusedShownName_duplicates() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' show A, B;
-import 'lib1.dart' show C, D;
-A a;
-C c;
-''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
+    newFile('/test/lib/lib1.dart', content: r'''
 class A {}
 class B {}
 class C {}
 class D {}
 ''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(
-        source, [HintCode.UNUSED_SHOWN_NAME, HintCode.UNUSED_SHOWN_NAME]);
-    assertNoErrors(source2);
-    verify([source, source2]);
+    assertErrorsInCode(r'''
+import 'lib1.dart' show A, B;
+import 'lib1.dart' show C, D;
+A a;
+C c;
+''', [HintCode.UNUSED_SHOWN_NAME, HintCode.UNUSED_SHOWN_NAME]);
   }
 
   test_unusedShownName_topLevelVariable() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' show var1, var2;
-import 'lib1.dart' show var3, var4;
-int a = var1;
-int b = var2;
-int c = var3;
-''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
+    newFile('/test/lib/lib1.dart', content: r'''
 const int var1 = 1;
 const int var2 = 2;
 const int var3 = 3;
 const int var4 = 4;
 ''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
-    assertNoErrors(source2);
-    verify([source, source2]);
+    assertErrorsInCode(r'''
+import 'lib1.dart' show var1, var2;
+import 'lib1.dart' show var3, var4;
+int a = var1;
+int b = var2;
+int c = var3;
+''', [HintCode.UNUSED_SHOWN_NAME]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
index dfe12c9..3d0a5a4 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -13,10 +13,7 @@
 }
 
 @reflectiveTest
-class UseOfVoidResultTest extends ResolverTestCase {
-  @override
-  bool get enableNewAnalysisDriver => true;
-
+class UseOfVoidResultTest extends DriverResolutionTest {
   test_implicitReturnValue() async {
     await assertNoErrorsInCode(r'''
 f() {}
diff --git a/pkg/analyzer/test/src/diagnostics/variable_type_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/variable_type_mismatch_test.dart
new file mode 100644
index 0000000..00ffa49
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/variable_type_mismatch_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(VariableTypeMismatchTest);
+  });
+}
+
+/// TODO(paulberry): move other tests from [CheckedModeCompileTimeErrorCodeTest]
+/// to this class.
+@reflectiveTest
+class VariableTypeMismatchTest extends DriverResolutionTest {
+  @FailingTest(reason: 'Workaround for #35993 is too broad')
+  test_int_to_double_variable_reference_is_not_promoted() async {
+    // Note: in the following code, the declaration of `y` should produce an
+    // error because we should only promote literal ints to doubles; we
+    // shouldn't promote the reference to the variable `x`.
+    addTestFile('''
+const Object x = 0;
+const double y = x;
+    ''');
+    await resolveTestFile();
+    assertTestErrors([CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH]);
+  }
+}
diff --git a/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart b/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
index ad6a248..dbb41eb 100644
--- a/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
@@ -13,6 +13,7 @@
     defineReflectiveTests(MapLiteralTest);
     defineReflectiveTests(MissingCodeTest);
     defineReflectiveTests(ParameterListTest);
+    defineReflectiveTests(TypedefTest);
   });
 }
 
@@ -210,6 +211,22 @@
     testUserDefinableOperatorWithSuper('==');
   }
 
+  void test_expressionBody_missingGt() {
+    testRecovery('''
+f(x) = x;
+''', [ParserErrorCode.MISSING_FUNCTION_BODY], '''
+f(x) => x;
+''');
+  }
+
+  void test_expressionBody_return() {
+    testRecovery('''
+f(x) return x;
+''', [ParserErrorCode.MISSING_FUNCTION_BODY], '''
+f(x) => x;
+''');
+  }
+
   void test_greaterThan() {
     testBinaryExpression('>');
   }
@@ -397,10 +414,16 @@
     testUserDefinableOperatorWithSuper('*');
   }
 
+  @failingTest
   void test_stringInterpolation_unclosed() {
     // https://github.com/dart-lang/sdk/issues/946
     // TODO(brianwilkerson) Try to recover better. Ideally there would be a
     // single error about an unterminated interpolation block.
+
+    // https://github.com/dart-lang/sdk/issues/36101
+    // TODO(danrubel): improve recovery so that the scanner/parser associates
+    // `${` with a synthetic `}` inside the " " rather than the `}` at the end.
+
     testRecovery(r'''
 f() {
   print("${42");
@@ -712,3 +735,18 @@
 ''');
   }
 }
+
+/**
+ * Test how well the parser recovers when tokens are missing in a typedef.
+ */
+@reflectiveTest
+class TypedefTest extends AbstractRecoveryTest {
+  @failingTest
+  void test_missingFunction() {
+    testRecovery('''
+typedef Predicate = bool <E>(E element);
+''', [ParserErrorCode.MISSING_IDENTIFIER], '''
+typedef Predicate = bool Function<E>(E element);
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/services/available_declarations_test.dart b/pkg/analyzer/test/src/services/available_declarations_test.dart
index 2f03798..2fe5b77 100644
--- a/pkg/analyzer/test/src/services/available_declarations_test.dart
+++ b/pkg/analyzer/test/src/services/available_declarations_test.dart
@@ -937,6 +937,8 @@
         requiredParameterCount: 0,
         returnType: 'void');
     _assertDeclaration(library, 'd', DeclarationKind.FUNCTION,
+        defaultArgumentListString: 'p1, p2',
+        defaultArgumentListTextRanges: [0, 2, 4, 2],
         parameters: '(Map<String, int> p1, int p2, {double p3})',
         parameterNames: ['p1', 'p2', 'p3'],
         parameterTypes: ['Map<String, int>', 'int', 'double'],
@@ -951,6 +953,53 @@
         typeParameters: '<T extends num, U>');
   }
 
+  test_FUNCTION_defaultArgumentList() async {
+    newFile('/home/test/lib/test.dart', content: r'''
+void a() {}
+
+void b(int a, double bb, String ccc) {}
+
+void c(int a, [double b, String c]) {}
+
+void d(int a, {int b, @required int c, @required int d, int e}) {}
+''');
+
+    tracker.addContext(testAnalysisContext);
+    await _doAllTrackerWork();
+
+    var library = _getLibrary('package:test/test.dart');
+    _assertDeclaration(library, 'a', DeclarationKind.FUNCTION,
+        parameterNames: [],
+        parameters: '()',
+        parameterTypes: [],
+        requiredParameterCount: 0,
+        returnType: 'void');
+    _assertDeclaration(library, 'b', DeclarationKind.FUNCTION,
+        defaultArgumentListString: 'a, bb, ccc',
+        defaultArgumentListTextRanges: [0, 1, 3, 2, 7, 3],
+        parameters: '(int a, double bb, String ccc)',
+        parameterNames: ['a', 'bb', 'ccc'],
+        parameterTypes: ['int', 'double', 'String'],
+        requiredParameterCount: 3,
+        returnType: 'void');
+    _assertDeclaration(library, 'c', DeclarationKind.FUNCTION,
+        defaultArgumentListString: 'a',
+        defaultArgumentListTextRanges: [0, 1],
+        parameters: '(int a, [double b, String c])',
+        parameterNames: ['a', 'b', 'c'],
+        parameterTypes: ['int', 'double', 'String'],
+        requiredParameterCount: 1,
+        returnType: 'void');
+    _assertDeclaration(library, 'd', DeclarationKind.FUNCTION,
+        defaultArgumentListString: 'a, c: null, d: null',
+        defaultArgumentListTextRanges: [0, 1, 6, 4, 15, 4],
+        parameters: '(int a, {int b, @required int c, @required int d, int e})',
+        parameterNames: ['a', 'b', 'c', 'd', 'e'],
+        parameterTypes: ['int', 'int', 'int', 'int', 'int'],
+        requiredParameterCount: 1,
+        returnType: 'void');
+  }
+
   test_FUNCTION_TYPE_ALIAS() async {
     newFile('/home/test/lib/test.dart', content: r'''
 typedef A = void Function();
@@ -1158,6 +1207,28 @@
     ]);
   }
 
+  test_library_publicOnly_enum() async {
+    newFile('/home/test/lib/a.dart', content: r'''
+part of 'test.dart';
+enum A {a, _a}
+enum _A {a, _a}
+''');
+    newFile('/home/test/lib/test.dart', content: r'''
+part 'a.dart';
+enum B {b, _b}
+enum _B {b, _b}
+''');
+    tracker.addContext(testAnalysisContext);
+
+    await _doAllTrackerWork();
+    _assertHasLibrary('package:test/test.dart', declarations: [
+      _ExpectedDeclaration.enum_('A'),
+      _ExpectedDeclaration.enumConstant('a', 'A'),
+      _ExpectedDeclaration.enum_('B'),
+      _ExpectedDeclaration.enumConstant('b', 'B'),
+    ]);
+  }
+
   test_location() async {
     var code = r'''
 class A {}
@@ -2096,6 +2167,8 @@
     Library library,
     String name,
     DeclarationKind kind, {
+    String defaultArgumentListString,
+    List<int> defaultArgumentListTextRanges,
     String docComplete,
     String docSummary,
     bool isAbstract = false,
@@ -2116,6 +2189,11 @@
     String typeParameters,
   }) {
     var declaration = _getDeclaration(library, name);
+    expect(declaration.defaultArgumentListString, defaultArgumentListString);
+    expect(
+      declaration.defaultArgumentListTextRanges,
+      defaultArgumentListTextRanges,
+    );
     expect(declaration.docComplete, docComplete);
     expect(declaration.docSummary, docSummary);
     expect(declaration.name, name);
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 2870078..63c0599 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -306,7 +306,7 @@
   void writeExpression(AstNode e, [Expression enclosing]) {
     bool needsParenthesis = e is Expression &&
         enclosing != null &&
-        e.precedence < enclosing.precedence;
+        e.precedence2 < enclosing.precedence2;
 
     if (needsParenthesis) {
       buffer.write('(');
@@ -384,19 +384,20 @@
       if (e.typeArguments != null) {
         writeList('<', '>', e.typeArguments.arguments, ', ', writeExpression);
       }
-      writeList('[', ']', e.elements, ', ', writeExpression,
+      writeList('[', ']', e.elements2, ', ', writeExpression,
           includeEmpty: true);
     } else if (e is Label) {
       writeExpression(e.label);
       buffer.write(': ');
-    } else if (e is MapLiteral) {
+    } else if (e is SetOrMapLiteral) {
       if (e.constKeyword != null) {
         buffer.write('const ');
       }
       if (e.typeArguments != null) {
         writeList('<', '>', e.typeArguments.arguments, ', ', writeExpression);
       }
-      writeList('{', '}', e.entries, ', ', writeExpression, includeEmpty: true);
+      writeList('{', '}', e.elements2, ', ', writeExpression,
+          includeEmpty: true);
     } else if (e is MapLiteralEntry) {
       writeExpression(e.key);
       buffer.write(': ');
@@ -952,5 +953,6 @@
   final int offset;
   final int end;
   final String text;
+
   _Replacement(this.offset, this.end, this.text);
 }
diff --git a/pkg/analyzer/test/src/summary/expr_builder_test.dart b/pkg/analyzer/test/src/summary/expr_builder_test.dart
index e655fec..92cfb7f 100644
--- a/pkg/analyzer/test/src/summary/expr_builder_test.dart
+++ b/pkg/analyzer/test/src/summary/expr_builder_test.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/string_source.dart';
 import 'package:analyzer/src/summary/expr_builder.dart';
@@ -28,8 +27,6 @@
   });
 }
 
-/// TODO(paulberry): migrate this test away from the task model.
-/// See dartbug.com/35734.
 @reflectiveTest
 class ExprBuilderTest extends ResynthesizeTestStrategyTwoPhase
     with ExprBuilderTestCases, ExprBuilderTestHelpers {}
@@ -419,11 +416,11 @@
   }
 
   void test_makeTypedList_const() {
-    checkSimpleExpression('const <int> []');
+    checkSimpleExpression('const <int>[]');
   }
 
   void test_makeTypedMap_const() {
-    checkSimpleExpression('const <int, bool> {}');
+    checkSimpleExpression('const <int, bool>{}');
   }
 
   void test_makeUntypedList_const() {
@@ -488,7 +485,6 @@
 
   @failingTest
   void test_pushLocalFunctionReference_nested() {
-    prepareAnalysisContext(new AnalysisOptionsImpl());
     var expr =
         checkSimpleExpression('(x) => (y) => x + y') as FunctionExpression;
     var outerFunctionElement = expr.declaredElement;
@@ -511,7 +507,6 @@
 
   @failingTest
   void test_pushLocalFunctionReference_paramReference() {
-    prepareAnalysisContext(new AnalysisOptionsImpl());
     var expr = checkSimpleExpression('(x, y) => x + y') as FunctionExpression;
     var localFunctionElement = expr.declaredElement;
     var xElement = localFunctionElement.parameters[0];
diff --git a/pkg/analyzer/test/src/summary/flat_buffers_test.dart b/pkg/analyzer/test/src/summary/flat_buffers_test.dart
index c8fb485..d5cb5cc 100644
--- a/pkg/analyzer/test/src/summary/flat_buffers_test.dart
+++ b/pkg/analyzer/test/src/summary/flat_buffers_test.dart
@@ -181,6 +181,7 @@
       builder.addInt32(4, 40);
       builder.addUint32(5, 0x9ABCDEF0);
       builder.addUint8(6, 0x9A);
+      builder.addFloat64(7, -12.34);
       Offset offset = builder.endTable();
       byteList = builder.finish(offset);
     }
@@ -194,6 +195,7 @@
     expect(const Int32Reader().vTableGet(buf, objectOffset, 4), 40);
     expect(const Uint32Reader().vTableGet(buf, objectOffset, 5), 0x9ABCDEF0);
     expect(const Uint8Reader().vTableGet(buf, objectOffset, 6), 0x9A);
+    expect(const Float64Reader().vTableGet(buf, objectOffset, 7), -12.34);
   }
 
   void test_writeList_of_Uint32() {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
new file mode 100644
index 0000000..efbdbf9
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -0,0 +1,3460 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/summary2/link.dart';
+import 'package:analyzer/src/summary2/linked_bundle_context.dart';
+import 'package:analyzer/src/summary2/linked_unit_context.dart';
+import 'package:analyzer/src/summary2/reference.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'resynthesize_common.dart';
+import 'test_strategies.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ResynthesizeAst2Test);
+  });
+}
+
+@reflectiveTest
+class ResynthesizeAst2Test extends ResynthesizeTestStrategyTwoPhase
+    with ResynthesizeTestCases {
+  @override
+  Future<LibraryElementImpl> checkLibrary(String text,
+      {bool allowErrors = false, bool dumpSummaries = false}) async {
+    var source = addTestSource(text);
+
+    var unit = parseText(text, experimentStatus: experimentStatus);
+
+    // TODO(scheglov) add other libraries
+    var libraryUnitMap = {
+      source: {source: unit},
+    };
+
+    var rootReference = Reference.root();
+    var linkResult = link(rootReference, libraryUnitMap);
+
+    var libraryLinkResult = linkResult.libraries[source];
+    var defaultUnitResult = libraryLinkResult.units[source];
+
+    var linkedBundleContext = LinkedBundleContext(linkResult.references);
+    var linkedUnitContext = LinkedUnitContext(
+      linkedBundleContext,
+      defaultUnitResult.tokens,
+    );
+
+    // TODO(scheglov) use actual names
+    // TODO(scheglov) support parts
+    var libraryElement = LibraryElementImpl(null, null, '', -1, 0);
+    var unitElement = CompilationUnitElementImpl.forLinkedNode(
+      libraryElement,
+      linkedUnitContext,
+      rootReference.getChild('${libraryLinkResult.source.uri}'),
+      defaultUnitResult.node,
+    );
+    libraryElement.definingCompilationUnit = unitElement;
+
+    return libraryElement;
+  }
+
+  @override
+  @failingTest
+  test_class_alias() async {
+    await super.test_class_alias();
+  }
+
+  @override
+  @failingTest
+  test_class_alias_abstract() async {
+    await super.test_class_alias_abstract();
+  }
+
+  @override
+  @failingTest
+  test_class_alias_documented() async {
+    await super.test_class_alias_documented();
+  }
+
+  @override
+  @failingTest
+  test_class_alias_documented_tripleSlash() async {
+    await super.test_class_alias_documented_tripleSlash();
+  }
+
+  @override
+  @failingTest
+  test_class_alias_documented_withLeadingNonDocumentation() async {
+    await super.test_class_alias_documented_withLeadingNonDocumentation();
+  }
+
+  @override
+  @failingTest
+  test_class_alias_generic() async {
+    await super.test_class_alias_generic();
+  }
+
+  @override
+  @failingTest
+  test_class_alias_with_forwarding_constructors() async {
+    await super.test_class_alias_with_forwarding_constructors();
+  }
+
+  @override
+  @failingTest
+  test_class_alias_with_forwarding_constructors_type_substitution() async {
+    await super
+        .test_class_alias_with_forwarding_constructors_type_substitution();
+  }
+
+  @override
+  @failingTest
+  test_class_alias_with_forwarding_constructors_type_substitution_complex() async {
+    await super
+        .test_class_alias_with_forwarding_constructors_type_substitution_complex();
+  }
+
+  @override
+  @failingTest
+  test_class_alias_with_mixin_members() async {
+    await super.test_class_alias_with_mixin_members();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_explicit_type_params() async {
+    await super.test_class_constructor_explicit_type_params();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_field_formal_dynamic_dynamic() async {
+    await super.test_class_constructor_field_formal_dynamic_dynamic();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_field_formal_dynamic_typed() async {
+    await super.test_class_constructor_field_formal_dynamic_typed();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_field_formal_dynamic_untyped() async {
+    await super.test_class_constructor_field_formal_dynamic_untyped();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_field_formal_functionTyped_noReturnType() async {
+    await super
+        .test_class_constructor_field_formal_functionTyped_noReturnType();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_field_formal_functionTyped_withReturnType() async {
+    await super
+        .test_class_constructor_field_formal_functionTyped_withReturnType();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_field_formal_multiple_matching_fields() async {
+    await super.test_class_constructor_field_formal_multiple_matching_fields();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_field_formal_no_matching_field() async {
+    await super.test_class_constructor_field_formal_no_matching_field();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_field_formal_typed_dynamic() async {
+    await super.test_class_constructor_field_formal_typed_dynamic();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_field_formal_typed_typed() async {
+    await super.test_class_constructor_field_formal_typed_typed();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_field_formal_typed_untyped() async {
+    await super.test_class_constructor_field_formal_typed_untyped();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_field_formal_untyped_dynamic() async {
+    await super.test_class_constructor_field_formal_untyped_dynamic();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_field_formal_untyped_typed() async {
+    await super.test_class_constructor_field_formal_untyped_typed();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_field_formal_untyped_untyped() async {
+    await super.test_class_constructor_field_formal_untyped_untyped();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_fieldFormal_named_noDefault() async {
+    await super.test_class_constructor_fieldFormal_named_noDefault();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_fieldFormal_named_withDefault() async {
+    await super.test_class_constructor_fieldFormal_named_withDefault();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_fieldFormal_optional_noDefault() async {
+    await super.test_class_constructor_fieldFormal_optional_noDefault();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_fieldFormal_optional_withDefault() async {
+    await super.test_class_constructor_fieldFormal_optional_withDefault();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_implicit_type_params() async {
+    await super.test_class_constructor_implicit_type_params();
+  }
+
+  @override
+  @failingTest
+  test_class_constructor_params() async {
+    await super.test_class_constructor_params();
+  }
+
+  @override
+  @failingTest
+  test_class_documented() async {
+    await super.test_class_documented();
+  }
+
+  @override
+  @failingTest
+  test_class_documented_mix() async {
+    await super.test_class_documented_mix();
+  }
+
+  @override
+  @failingTest
+  test_class_documented_tripleSlash() async {
+    await super.test_class_documented_tripleSlash();
+  }
+
+  @override
+  @failingTest
+  test_class_documented_with_references() async {
+    await super.test_class_documented_with_references();
+  }
+
+  @override
+  @failingTest
+  test_class_documented_with_windows_line_endings() async {
+    await super.test_class_documented_with_windows_line_endings();
+  }
+
+  @override
+  @failingTest
+  test_class_documented_withLeadingNotDocumentation() async {
+    await super.test_class_documented_withLeadingNotDocumentation();
+  }
+
+  @override
+  @failingTest
+  test_class_documented_withMetadata() async {
+    await super.test_class_documented_withMetadata();
+  }
+
+  @override
+  @failingTest
+  test_class_field_const() async {
+    await super.test_class_field_const();
+  }
+
+  @override
+  @failingTest
+  test_class_field_implicit_type() async {
+    await super.test_class_field_implicit_type();
+  }
+
+  @override
+  @failingTest
+  test_class_field_static() async {
+    await super.test_class_field_static();
+  }
+
+  @override
+  @failingTest
+  test_class_fields() async {
+    await super.test_class_fields();
+  }
+
+  @override
+  @failingTest
+  test_class_getter_abstract() async {
+    await super.test_class_getter_abstract();
+  }
+
+  @override
+  @failingTest
+  test_class_getter_external() async {
+    await super.test_class_getter_external();
+  }
+
+  @override
+  @failingTest
+  test_class_getter_implicit_return_type() async {
+    await super.test_class_getter_implicit_return_type();
+  }
+
+  @override
+  @failingTest
+  test_class_getter_static() async {
+    await super.test_class_getter_static();
+  }
+
+  @override
+  @failingTest
+  test_class_getters() async {
+    await super.test_class_getters();
+  }
+
+  @override
+  @failingTest
+  test_class_implicitField_getterFirst() async {
+    await super.test_class_implicitField_getterFirst();
+  }
+
+  @override
+  @failingTest
+  test_class_implicitField_setterFirst() async {
+    await super.test_class_implicitField_setterFirst();
+  }
+
+  @override
+  @failingTest
+  test_class_interfaces_unresolved() async {
+    await super.test_class_interfaces_unresolved();
+  }
+
+  @override
+  @failingTest
+  test_class_method_abstract() async {
+    await super.test_class_method_abstract();
+  }
+
+  @override
+  @failingTest
+  test_class_method_external() async {
+    await super.test_class_method_external();
+  }
+
+  @override
+  @failingTest
+  test_class_method_params() async {
+    await super.test_class_method_params();
+  }
+
+  @override
+  @failingTest
+  test_class_method_static() async {
+    await super.test_class_method_static();
+  }
+
+  @override
+  @failingTest
+  test_class_methods() async {
+    await super.test_class_methods();
+  }
+
+  @override
+  @failingTest
+  test_class_mixins_generic() async {
+    await super.test_class_mixins_generic();
+  }
+
+  @override
+  @failingTest
+  test_class_mixins_unresolved() async {
+    await super.test_class_mixins_unresolved();
+  }
+
+  @override
+  @failingTest
+  test_class_setter_abstract() async {
+    await super.test_class_setter_abstract();
+  }
+
+  @override
+  @failingTest
+  test_class_setter_external() async {
+    await super.test_class_setter_external();
+  }
+
+  @override
+  @failingTest
+  test_class_setter_implicit_param_type() async {
+    await super.test_class_setter_implicit_param_type();
+  }
+
+  @override
+  @failingTest
+  test_class_setter_implicit_return_type() async {
+    await super.test_class_setter_implicit_return_type();
+  }
+
+  @override
+  @failingTest
+  test_class_setter_invalid_named_parameter() async {
+    await super.test_class_setter_invalid_named_parameter();
+  }
+
+  @override
+  @failingTest
+  test_class_setter_invalid_no_parameter() async {
+    await super.test_class_setter_invalid_no_parameter();
+  }
+
+  @override
+  @failingTest
+  test_class_setter_invalid_optional_parameter() async {
+    await super.test_class_setter_invalid_optional_parameter();
+  }
+
+  @override
+  @failingTest
+  test_class_setter_invalid_too_many_parameters() async {
+    await super.test_class_setter_invalid_too_many_parameters();
+  }
+
+  @override
+  @failingTest
+  test_class_setter_static() async {
+    await super.test_class_setter_static();
+  }
+
+  @override
+  @failingTest
+  test_class_setters() async {
+    await super.test_class_setters();
+  }
+
+  @override
+  @failingTest
+  test_class_supertype_typeArguments() async {
+    await super.test_class_supertype_typeArguments();
+  }
+
+  @override
+  @failingTest
+  test_class_supertype_unresolved() async {
+    await super.test_class_supertype_unresolved();
+  }
+
+  @override
+  @failingTest
+  test_class_type_parameters() async {
+    await super.test_class_type_parameters();
+  }
+
+  @override
+  @failingTest
+  test_class_type_parameters_bound() async {
+    await super.test_class_type_parameters_bound();
+  }
+
+  @override
+  @failingTest
+  test_class_type_parameters_f_bound_complex() async {
+    await super.test_class_type_parameters_f_bound_complex();
+  }
+
+  @override
+  @failingTest
+  test_class_type_parameters_f_bound_simple() async {
+    await super.test_class_type_parameters_f_bound_simple();
+  }
+
+  @override
+  @failingTest
+  test_closure_executable_with_return_type_from_closure() async {
+    await super.test_closure_executable_with_return_type_from_closure();
+  }
+
+  @override
+  @failingTest
+  test_closure_generic() async {
+    await super.test_closure_generic();
+  }
+
+  @override
+  @failingTest
+  test_closure_in_variable_declaration_in_part() async {
+    await super.test_closure_in_variable_declaration_in_part();
+  }
+
+  @override
+  @failingTest
+  test_codeRange_class() async {
+    await super.test_codeRange_class();
+  }
+
+  @override
+  @failingTest
+  test_codeRange_class_namedMixin() async {
+    await super.test_codeRange_class_namedMixin();
+  }
+
+  @override
+  @failingTest
+  test_codeRange_constructor() async {
+    await super.test_codeRange_constructor();
+  }
+
+  @override
+  @failingTest
+  test_codeRange_constructor_factory() async {
+    await super.test_codeRange_constructor_factory();
+  }
+
+  @override
+  @failingTest
+  test_codeRange_field() async {
+    await super.test_codeRange_field();
+  }
+
+  @override
+  @failingTest
+  test_codeRange_field_annotations() async {
+    await super.test_codeRange_field_annotations();
+  }
+
+  @override
+  @failingTest
+  test_codeRange_function() async {
+    await super.test_codeRange_function();
+  }
+
+  @override
+  @failingTest
+  test_codeRange_method() async {
+    await super.test_codeRange_method();
+  }
+
+  @override
+  @failingTest
+  test_codeRange_parameter() async {
+    await super.test_codeRange_parameter();
+  }
+
+  @override
+  @failingTest
+  test_codeRange_parameter_annotations() async {
+    await super.test_codeRange_parameter_annotations();
+  }
+
+  @override
+  @failingTest
+  test_codeRange_topLevelVariable() async {
+    await super.test_codeRange_topLevelVariable();
+  }
+
+  @override
+  @failingTest
+  test_codeRange_topLevelVariable_annotations() async {
+    await super.test_codeRange_topLevelVariable_annotations();
+  }
+
+  @override
+  @failingTest
+  test_const_constructor_inferred_args() async {
+    await super.test_const_constructor_inferred_args();
+  }
+
+  @override
+  @failingTest
+  test_const_finalField_hasConstConstructor() async {
+    await super.test_const_finalField_hasConstConstructor();
+  }
+
+  @override
+  @failingTest
+  test_const_invalid_field_const() async {
+    await super.test_const_invalid_field_const();
+  }
+
+  @override
+  @failingTest
+  test_const_invalid_field_final() async {
+    await super.test_const_invalid_field_final();
+  }
+
+  @override
+  @failingTest
+  test_const_invalid_intLiteral() async {
+    await super.test_const_invalid_intLiteral();
+  }
+
+  @override
+  @failingTest
+  test_const_invalid_topLevel() async {
+    await super.test_const_invalid_topLevel();
+  }
+
+  @override
+  @failingTest
+  test_const_invalid_typeMismatch() async {
+    await super.test_const_invalid_typeMismatch();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_generic_named() async {
+    await super.test_const_invokeConstructor_generic_named();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_generic_named_imported() async {
+    await super.test_const_invokeConstructor_generic_named_imported();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_generic_named_imported_withPrefix() async {
+    await super
+        .test_const_invokeConstructor_generic_named_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_generic_noTypeArguments() async {
+    await super.test_const_invokeConstructor_generic_noTypeArguments();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_generic_unnamed() async {
+    await super.test_const_invokeConstructor_generic_unnamed();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_generic_unnamed_imported() async {
+    await super.test_const_invokeConstructor_generic_unnamed_imported();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_generic_unnamed_imported_withPrefix() async {
+    await super
+        .test_const_invokeConstructor_generic_unnamed_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_named() async {
+    await super.test_const_invokeConstructor_named();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_named_imported() async {
+    await super.test_const_invokeConstructor_named_imported();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_named_imported_withPrefix() async {
+    await super.test_const_invokeConstructor_named_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_named_unresolved() async {
+    await super.test_const_invokeConstructor_named_unresolved();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_named_unresolved2() async {
+    await super.test_const_invokeConstructor_named_unresolved2();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_named_unresolved3() async {
+    await super.test_const_invokeConstructor_named_unresolved3();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_named_unresolved4() async {
+    await super.test_const_invokeConstructor_named_unresolved4();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_named_unresolved5() async {
+    await super.test_const_invokeConstructor_named_unresolved5();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_named_unresolved6() async {
+    await super.test_const_invokeConstructor_named_unresolved6();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_unnamed() async {
+    await super.test_const_invokeConstructor_unnamed();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_unnamed_imported() async {
+    await super.test_const_invokeConstructor_unnamed_imported();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_unnamed_imported_withPrefix() async {
+    await super.test_const_invokeConstructor_unnamed_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_unnamed_unresolved() async {
+    await super.test_const_invokeConstructor_unnamed_unresolved();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_unnamed_unresolved2() async {
+    await super.test_const_invokeConstructor_unnamed_unresolved2();
+  }
+
+  @override
+  @failingTest
+  test_const_invokeConstructor_unnamed_unresolved3() async {
+    await super.test_const_invokeConstructor_unnamed_unresolved3();
+  }
+
+  @override
+  @failingTest
+  test_const_length_ofClassConstField() async {
+    await super.test_const_length_ofClassConstField();
+  }
+
+  @override
+  @failingTest
+  test_const_length_ofClassConstField_imported() async {
+    await super.test_const_length_ofClassConstField_imported();
+  }
+
+  @override
+  @failingTest
+  test_const_length_ofClassConstField_imported_withPrefix() async {
+    await super.test_const_length_ofClassConstField_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  test_const_length_ofStringLiteral() async {
+    await super.test_const_length_ofStringLiteral();
+  }
+
+  @override
+  @failingTest
+  test_const_length_ofTopLevelVariable() async {
+    await super.test_const_length_ofTopLevelVariable();
+  }
+
+  @override
+  @failingTest
+  test_const_length_ofTopLevelVariable_imported() async {
+    await super.test_const_length_ofTopLevelVariable_imported();
+  }
+
+  @override
+  @failingTest
+  test_const_length_ofTopLevelVariable_imported_withPrefix() async {
+    await super.test_const_length_ofTopLevelVariable_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  test_const_length_staticMethod() async {
+    await super.test_const_length_staticMethod();
+  }
+
+  @override
+  @failingTest
+  test_const_list_inferredType() async {
+    await super.test_const_list_inferredType();
+  }
+
+  @override
+  @failingTest
+  test_const_map_inferredType() async {
+    await super.test_const_map_inferredType();
+  }
+
+  @override
+  @failingTest
+  test_const_parameterDefaultValue_initializingFormal_functionTyped() async {
+    await super
+        .test_const_parameterDefaultValue_initializingFormal_functionTyped();
+  }
+
+  @override
+  @failingTest
+  test_const_parameterDefaultValue_initializingFormal_named() async {
+    await super.test_const_parameterDefaultValue_initializingFormal_named();
+  }
+
+  @override
+  @failingTest
+  test_const_parameterDefaultValue_initializingFormal_positional() async {
+    await super
+        .test_const_parameterDefaultValue_initializingFormal_positional();
+  }
+
+  @override
+  @failingTest
+  test_const_parameterDefaultValue_normal() async {
+    await super.test_const_parameterDefaultValue_normal();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_staticField() async {
+    await super.test_const_reference_staticField();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_staticField_imported() async {
+    await super.test_const_reference_staticField_imported();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_staticField_imported_withPrefix() async {
+    await super.test_const_reference_staticField_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_staticMethod() async {
+    await super.test_const_reference_staticMethod();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_staticMethod_imported() async {
+    await super.test_const_reference_staticMethod_imported();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_staticMethod_imported_withPrefix() async {
+    await super.test_const_reference_staticMethod_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_topLevelFunction() async {
+    await super.test_const_reference_topLevelFunction();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_topLevelFunction_generic() async {
+    await super.test_const_reference_topLevelFunction_generic();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_topLevelFunction_imported() async {
+    await super.test_const_reference_topLevelFunction_imported();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_topLevelFunction_imported_withPrefix() async {
+    await super.test_const_reference_topLevelFunction_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_topLevelVariable() async {
+    await super.test_const_reference_topLevelVariable();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_topLevelVariable_imported() async {
+    await super.test_const_reference_topLevelVariable_imported();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_topLevelVariable_imported_withPrefix() async {
+    await super.test_const_reference_topLevelVariable_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_type() async {
+    await super.test_const_reference_type();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_type_functionType() async {
+    await super.test_const_reference_type_functionType();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_type_imported() async {
+    await super.test_const_reference_type_imported();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_type_imported_withPrefix() async {
+    await super.test_const_reference_type_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_type_typeParameter() async {
+    await super.test_const_reference_type_typeParameter();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_unresolved_prefix0() async {
+    await super.test_const_reference_unresolved_prefix0();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_unresolved_prefix1() async {
+    await super.test_const_reference_unresolved_prefix1();
+  }
+
+  @override
+  @failingTest
+  test_const_reference_unresolved_prefix2() async {
+    await super.test_const_reference_unresolved_prefix2();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_binary() async {
+    await super.test_const_topLevel_binary();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_conditional() async {
+    await super.test_const_topLevel_conditional();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_identical() async {
+    await super.test_const_topLevel_identical();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_ifNull() async {
+    await super.test_const_topLevel_ifNull();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_literal() async {
+    await super.test_const_topLevel_literal();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_parenthesis() async {
+    await super.test_const_topLevel_parenthesis();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_prefix() async {
+    await super.test_const_topLevel_prefix();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_super() async {
+    await super.test_const_topLevel_super();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_this() async {
+    await super.test_const_topLevel_this();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_throw() async {
+    await super.test_const_topLevel_throw();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_typedList() async {
+    await super.test_const_topLevel_typedList();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_typedList_imported() async {
+    await super.test_const_topLevel_typedList_imported();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_typedList_importedWithPrefix() async {
+    await super.test_const_topLevel_typedList_importedWithPrefix();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_typedList_typedefArgument() async {
+    await super.test_const_topLevel_typedList_typedefArgument();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_typedMap() async {
+    await super.test_const_topLevel_typedMap();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_untypedList() async {
+    await super.test_const_topLevel_untypedList();
+  }
+
+  @override
+  @failingTest
+  test_const_topLevel_untypedMap() async {
+    await super.test_const_topLevel_untypedMap();
+  }
+
+  @override
+  @failingTest
+  test_constExpr_pushReference_enum_field() async {
+    await super.test_constExpr_pushReference_enum_field();
+  }
+
+  @override
+  @failingTest
+  test_constExpr_pushReference_enum_method() async {
+    await super.test_constExpr_pushReference_enum_method();
+  }
+
+  @override
+  @failingTest
+  test_constExpr_pushReference_field_simpleIdentifier() async {
+    await super.test_constExpr_pushReference_field_simpleIdentifier();
+  }
+
+  @override
+  @failingTest
+  test_constExpr_pushReference_staticMethod_simpleIdentifier() async {
+    await super.test_constExpr_pushReference_staticMethod_simpleIdentifier();
+  }
+
+  @override
+  @failingTest
+  test_constructor_documented() async {
+    await super.test_constructor_documented();
+  }
+
+  @override
+  @failingTest
+  test_constructor_initializers_assertInvocation() async {
+    await super.test_constructor_initializers_assertInvocation();
+  }
+
+  @override
+  @failingTest
+  test_constructor_initializers_assertInvocation_message() async {
+    await super.test_constructor_initializers_assertInvocation_message();
+  }
+
+  @override
+  @failingTest
+  test_constructor_initializers_field() async {
+    await super.test_constructor_initializers_field();
+  }
+
+  @override
+  @failingTest
+  test_constructor_initializers_field_notConst() async {
+    await super.test_constructor_initializers_field_notConst();
+  }
+
+  @override
+  @failingTest
+  test_constructor_initializers_field_withParameter() async {
+    await super.test_constructor_initializers_field_withParameter();
+  }
+
+  @override
+  @failingTest
+  test_constructor_initializers_superInvocation_named() async {
+    await super.test_constructor_initializers_superInvocation_named();
+  }
+
+  @override
+  @failingTest
+  test_constructor_initializers_superInvocation_named_underscore() async {
+    await super
+        .test_constructor_initializers_superInvocation_named_underscore();
+  }
+
+  @override
+  @failingTest
+  test_constructor_initializers_superInvocation_namedExpression() async {
+    await super.test_constructor_initializers_superInvocation_namedExpression();
+  }
+
+  @override
+  @failingTest
+  test_constructor_initializers_superInvocation_unnamed() async {
+    await super.test_constructor_initializers_superInvocation_unnamed();
+  }
+
+  @override
+  @failingTest
+  test_constructor_initializers_thisInvocation_named() async {
+    await super.test_constructor_initializers_thisInvocation_named();
+  }
+
+  @override
+  @failingTest
+  test_constructor_initializers_thisInvocation_namedExpression() async {
+    await super.test_constructor_initializers_thisInvocation_namedExpression();
+  }
+
+  @override
+  @failingTest
+  test_constructor_initializers_thisInvocation_unnamed() async {
+    await super.test_constructor_initializers_thisInvocation_unnamed();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_named() async {
+    await super.test_constructor_redirected_factory_named();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_named_generic() async {
+    await super.test_constructor_redirected_factory_named_generic();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_named_imported() async {
+    await super.test_constructor_redirected_factory_named_imported();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_named_imported_generic() async {
+    await super.test_constructor_redirected_factory_named_imported_generic();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_named_prefixed() async {
+    await super.test_constructor_redirected_factory_named_prefixed();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_named_prefixed_generic() async {
+    await super.test_constructor_redirected_factory_named_prefixed_generic();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_named_unresolved_class() async {
+    await super.test_constructor_redirected_factory_named_unresolved_class();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_named_unresolved_constructor() async {
+    await super
+        .test_constructor_redirected_factory_named_unresolved_constructor();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_unnamed() async {
+    await super.test_constructor_redirected_factory_unnamed();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_unnamed_generic() async {
+    await super.test_constructor_redirected_factory_unnamed_generic();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_unnamed_imported() async {
+    await super.test_constructor_redirected_factory_unnamed_imported();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_unnamed_imported_generic() async {
+    await super.test_constructor_redirected_factory_unnamed_imported_generic();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_unnamed_prefixed() async {
+    await super.test_constructor_redirected_factory_unnamed_prefixed();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_unnamed_prefixed_generic() async {
+    await super.test_constructor_redirected_factory_unnamed_prefixed_generic();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_factory_unnamed_unresolved() async {
+    await super.test_constructor_redirected_factory_unnamed_unresolved();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_thisInvocation_named() async {
+    await super.test_constructor_redirected_thisInvocation_named();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_thisInvocation_named_generic() async {
+    await super.test_constructor_redirected_thisInvocation_named_generic();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_thisInvocation_unnamed() async {
+    await super.test_constructor_redirected_thisInvocation_unnamed();
+  }
+
+  @override
+  @failingTest
+  test_constructor_redirected_thisInvocation_unnamed_generic() async {
+    await super.test_constructor_redirected_thisInvocation_unnamed_generic();
+  }
+
+  @override
+  @failingTest
+  test_constructor_withCycles_const() async {
+    await super.test_constructor_withCycles_const();
+  }
+
+  @override
+  @failingTest
+  test_constructor_withCycles_nonConst() async {
+    await super.test_constructor_withCycles_nonConst();
+  }
+
+  @override
+  @failingTest
+  test_defaultValue_genericFunction() async {
+    await super.test_defaultValue_genericFunction();
+  }
+
+  @override
+  @failingTest
+  test_defaultValue_refersToGenericClass_constructor() async {
+    await super.test_defaultValue_refersToGenericClass_constructor();
+  }
+
+  @override
+  @failingTest
+  test_defaultValue_refersToGenericClass_constructor2() async {
+    await super.test_defaultValue_refersToGenericClass_constructor2();
+  }
+
+  @override
+  @failingTest
+  test_defaultValue_refersToGenericClass_functionG() async {
+    await super.test_defaultValue_refersToGenericClass_functionG();
+  }
+
+  @override
+  @failingTest
+  test_defaultValue_refersToGenericClass_methodG() async {
+    await super.test_defaultValue_refersToGenericClass_methodG();
+  }
+
+  @override
+  @failingTest
+  test_defaultValue_refersToGenericClass_methodG_classG() async {
+    await super.test_defaultValue_refersToGenericClass_methodG_classG();
+  }
+
+  @override
+  @failingTest
+  test_defaultValue_refersToGenericClass_methodNG() async {
+    await super.test_defaultValue_refersToGenericClass_methodNG();
+  }
+
+  @override
+  @failingTest
+  test_enum_documented() async {
+    await super.test_enum_documented();
+  }
+
+  @override
+  @failingTest
+  test_enum_value_documented() async {
+    await super.test_enum_value_documented();
+  }
+
+  @override
+  @failingTest
+  test_enum_values() async {
+    await super.test_enum_values();
+  }
+
+  @override
+  @failingTest
+  test_enums() async {
+    await super.test_enums();
+  }
+
+  @override
+  @failingTest
+  test_error_extendsEnum() async {
+    await super.test_error_extendsEnum();
+  }
+
+  @override
+  @failingTest
+  test_executable_parameter_type_typedef() async {
+    await super.test_executable_parameter_type_typedef();
+  }
+
+  @override
+  @failingTest
+  test_export_class() async {
+    await super.test_export_class();
+  }
+
+  @override
+  @failingTest
+  test_export_class_type_alias() async {
+    await super.test_export_class_type_alias();
+  }
+
+  @override
+  @failingTest
+  test_export_configurations_useDefault() async {
+    await super.test_export_configurations_useDefault();
+  }
+
+  @override
+  @failingTest
+  test_export_configurations_useFirst() async {
+    await super.test_export_configurations_useFirst();
+  }
+
+  @override
+  @failingTest
+  test_export_configurations_useSecond() async {
+    await super.test_export_configurations_useSecond();
+  }
+
+  @override
+  @failingTest
+  test_export_function() async {
+    await super.test_export_function();
+  }
+
+  @override
+  @failingTest
+  test_export_getter() async {
+    await super.test_export_getter();
+  }
+
+  @override
+  @failingTest
+  test_export_hide() async {
+    await super.test_export_hide();
+  }
+
+  @override
+  @failingTest
+  test_export_multiple_combinators() async {
+    await super.test_export_multiple_combinators();
+  }
+
+  @override
+  @failingTest
+  test_export_setter() async {
+    await super.test_export_setter();
+  }
+
+  @override
+  @failingTest
+  test_export_show() async {
+    await super.test_export_show();
+  }
+
+  @override
+  @failingTest
+  test_export_typedef() async {
+    await super.test_export_typedef();
+  }
+
+  @override
+  @failingTest
+  test_export_variable() async {
+    await super.test_export_variable();
+  }
+
+  @override
+  @failingTest
+  test_export_variable_const() async {
+    await super.test_export_variable_const();
+  }
+
+  @override
+  @failingTest
+  test_export_variable_final() async {
+    await super.test_export_variable_final();
+  }
+
+  @override
+  @failingTest
+  test_exportImport_configurations_useDefault() async {
+    await super.test_exportImport_configurations_useDefault();
+  }
+
+  @override
+  @failingTest
+  test_exportImport_configurations_useFirst() async {
+    await super.test_exportImport_configurations_useFirst();
+  }
+
+  @override
+  @failingTest
+  test_exports() async {
+    await super.test_exports();
+  }
+
+  @override
+  @failingTest
+  test_expr_invalid_typeParameter_asPrefix() async {
+    await super.test_expr_invalid_typeParameter_asPrefix();
+  }
+
+  @override
+  @failingTest
+  test_field_covariant() async {
+    await super.test_field_covariant();
+  }
+
+  @override
+  @failingTest
+  test_field_documented() async {
+    await super.test_field_documented();
+  }
+
+  @override
+  @failingTest
+  test_field_formal_param_inferred_type_implicit() async {
+    await super.test_field_formal_param_inferred_type_implicit();
+  }
+
+  @override
+  @failingTest
+  test_field_inferred_type_nonStatic_explicit_initialized() async {
+    await super.test_field_inferred_type_nonStatic_explicit_initialized();
+  }
+
+  @override
+  @failingTest
+  test_field_inferred_type_nonStatic_implicit_initialized() async {
+    await super.test_field_inferred_type_nonStatic_implicit_initialized();
+  }
+
+  @override
+  @failingTest
+  test_field_inferred_type_nonStatic_implicit_uninitialized() async {
+    await super.test_field_inferred_type_nonStatic_implicit_uninitialized();
+  }
+
+  @override
+  @failingTest
+  test_field_inferred_type_static_implicit_initialized() async {
+    await super.test_field_inferred_type_static_implicit_initialized();
+  }
+
+  @override
+  @failingTest
+  test_field_propagatedType_const_noDep() async {
+    await super.test_field_propagatedType_const_noDep();
+  }
+
+  @override
+  @failingTest
+  test_field_propagatedType_final_dep_inLib() async {
+    await super.test_field_propagatedType_final_dep_inLib();
+  }
+
+  @override
+  @failingTest
+  test_field_propagatedType_final_dep_inPart() async {
+    await super.test_field_propagatedType_final_dep_inPart();
+  }
+
+  @override
+  @failingTest
+  test_field_propagatedType_final_noDep_instance() async {
+    await super.test_field_propagatedType_final_noDep_instance();
+  }
+
+  @override
+  @failingTest
+  test_field_propagatedType_final_noDep_static() async {
+    await super.test_field_propagatedType_final_noDep_static();
+  }
+
+  @override
+  @failingTest
+  test_field_static_final_untyped() async {
+    await super.test_field_static_final_untyped();
+  }
+
+  @override
+  @failingTest
+  test_field_typed() async {
+    await super.test_field_typed();
+  }
+
+  @override
+  @failingTest
+  test_field_untyped() async {
+    await super.test_field_untyped();
+  }
+
+  @override
+  @failingTest
+  test_function_async() async {
+    await super.test_function_async();
+  }
+
+  @override
+  @failingTest
+  test_function_asyncStar() async {
+    await super.test_function_asyncStar();
+  }
+
+  @override
+  @failingTest
+  test_function_documented() async {
+    await super.test_function_documented();
+  }
+
+  @override
+  @failingTest
+  test_function_entry_point() async {
+    await super.test_function_entry_point();
+  }
+
+  @override
+  @failingTest
+  test_function_entry_point_in_export() async {
+    await super.test_function_entry_point_in_export();
+  }
+
+  @override
+  @failingTest
+  test_function_entry_point_in_export_hidden() async {
+    await super.test_function_entry_point_in_export_hidden();
+  }
+
+  @override
+  @failingTest
+  test_function_entry_point_in_part() async {
+    await super.test_function_entry_point_in_part();
+  }
+
+  @override
+  @failingTest
+  test_function_external() async {
+    await super.test_function_external();
+  }
+
+  @override
+  @failingTest
+  test_function_parameter_final() async {
+    await super.test_function_parameter_final();
+  }
+
+  @override
+  @failingTest
+  test_function_parameter_kind_named() async {
+    await super.test_function_parameter_kind_named();
+  }
+
+  @override
+  @failingTest
+  test_function_parameter_kind_positional() async {
+    await super.test_function_parameter_kind_positional();
+  }
+
+  @override
+  @failingTest
+  test_function_parameter_kind_required() async {
+    await super.test_function_parameter_kind_required();
+  }
+
+  @override
+  @failingTest
+  test_function_parameter_parameters() async {
+    await super.test_function_parameter_parameters();
+  }
+
+  @override
+  @failingTest
+  test_function_parameter_return_type() async {
+    await super.test_function_parameter_return_type();
+  }
+
+  @override
+  @failingTest
+  test_function_parameter_return_type_void() async {
+    await super.test_function_parameter_return_type_void();
+  }
+
+  @override
+  @failingTest
+  test_function_parameter_type() async {
+    await super.test_function_parameter_type();
+  }
+
+  @override
+  @failingTest
+  test_function_parameters() async {
+    await super.test_function_parameters();
+  }
+
+  @override
+  @failingTest
+  test_function_return_type() async {
+    await super.test_function_return_type();
+  }
+
+  @override
+  @failingTest
+  test_function_return_type_implicit() async {
+    await super.test_function_return_type_implicit();
+  }
+
+  @override
+  @failingTest
+  test_function_return_type_void() async {
+    await super.test_function_return_type_void();
+  }
+
+  @override
+  @failingTest
+  test_function_type_parameter() async {
+    await super.test_function_type_parameter();
+  }
+
+  @override
+  @failingTest
+  test_function_type_parameter_with_function_typed_parameter() async {
+    await super.test_function_type_parameter_with_function_typed_parameter();
+  }
+
+  @override
+  @failingTest
+  test_function_typed_parameter_implicit() async {
+    await super.test_function_typed_parameter_implicit();
+  }
+
+  @override
+  @failingTest
+  test_functions() async {
+    await super.test_functions();
+  }
+
+  @override
+  @failingTest
+  test_futureOr() async {
+    await super.test_futureOr();
+  }
+
+  @override
+  @failingTest
+  test_futureOr_const() async {
+    await super.test_futureOr_const();
+  }
+
+  @override
+  @failingTest
+  test_futureOr_inferred() async {
+    await super.test_futureOr_inferred();
+  }
+
+  @override
+  @failingTest
+  test_generic_gClass_gMethodStatic() async {
+    await super.test_generic_gClass_gMethodStatic();
+  }
+
+  @override
+  @failingTest
+  test_genericFunction_asFunctionReturnType() async {
+    await super.test_genericFunction_asFunctionReturnType();
+  }
+
+  @override
+  @failingTest
+  test_genericFunction_asFunctionTypedParameterReturnType() async {
+    await super.test_genericFunction_asFunctionTypedParameterReturnType();
+  }
+
+  @override
+  @failingTest
+  test_genericFunction_asGenericFunctionReturnType() async {
+    await super.test_genericFunction_asGenericFunctionReturnType();
+  }
+
+  @override
+  @failingTest
+  test_genericFunction_asMethodReturnType() async {
+    await super.test_genericFunction_asMethodReturnType();
+  }
+
+  @override
+  @failingTest
+  test_genericFunction_asParameterType() async {
+    await super.test_genericFunction_asParameterType();
+  }
+
+  @override
+  @failingTest
+  test_genericFunction_asTopLevelVariableType() async {
+    await super.test_genericFunction_asTopLevelVariableType();
+  }
+
+  @override
+  @failingTest
+  test_getter_documented() async {
+    await super.test_getter_documented();
+  }
+
+  @override
+  @failingTest
+  test_getter_external() async {
+    await super.test_getter_external();
+  }
+
+  @override
+  @failingTest
+  test_getter_inferred_type_nonStatic_implicit_return() async {
+    await super.test_getter_inferred_type_nonStatic_implicit_return();
+  }
+
+  @override
+  @failingTest
+  test_getters() async {
+    await super.test_getters();
+  }
+
+  @override
+  @failingTest
+  test_implicitTopLevelVariable_getterFirst() async {
+    await super.test_implicitTopLevelVariable_getterFirst();
+  }
+
+  @override
+  @failingTest
+  test_implicitTopLevelVariable_setterFirst() async {
+    await super.test_implicitTopLevelVariable_setterFirst();
+  }
+
+  @override
+  @failingTest
+  test_import_configurations_useDefault() async {
+    await super.test_import_configurations_useDefault();
+  }
+
+  @override
+  @failingTest
+  test_import_configurations_useFirst() async {
+    await super.test_import_configurations_useFirst();
+  }
+
+  @override
+  @failingTest
+  test_import_deferred() async {
+    await super.test_import_deferred();
+  }
+
+  @override
+  @failingTest
+  test_import_export() async {
+    await super.test_import_export();
+  }
+
+  @override
+  @failingTest
+  test_import_hide() async {
+    await super.test_import_hide();
+  }
+
+  @override
+  @failingTest
+  test_import_invalidUri_metadata() async {
+    await super.test_import_invalidUri_metadata();
+  }
+
+  @override
+  @failingTest
+  test_import_multiple_combinators() async {
+    await super.test_import_multiple_combinators();
+  }
+
+  @override
+  @failingTest
+  test_import_prefixed() async {
+    await super.test_import_prefixed();
+  }
+
+  @override
+  @failingTest
+  test_import_self() async {
+    await super.test_import_self();
+  }
+
+  @override
+  @failingTest
+  test_import_short_absolute() async {
+    await super.test_import_short_absolute();
+  }
+
+  @override
+  @failingTest
+  test_import_show() async {
+    await super.test_import_show();
+  }
+
+  @override
+  @failingTest
+  test_imports() async {
+    await super.test_imports();
+  }
+
+  @override
+  @failingTest
+  test_infer_generic_typedef_simple() async {
+    await super.test_infer_generic_typedef_simple();
+  }
+
+  @override
+  @failingTest
+  test_infer_instanceCreation_fromArguments() async {
+    await super.test_infer_instanceCreation_fromArguments();
+  }
+
+  @override
+  @failingTest
+  test_infer_property_set() async {
+    await super.test_infer_property_set();
+  }
+
+  @override
+  @failingTest
+  test_inference_issue_32394() async {
+    await super.test_inference_issue_32394();
+  }
+
+  @override
+  @failingTest
+  test_inference_map() async {
+    await super.test_inference_map();
+  }
+
+  @override
+  @failingTest
+  test_inferred_function_type_for_variable_in_generic_function() async {
+    await super.test_inferred_function_type_for_variable_in_generic_function();
+  }
+
+  @override
+  @failingTest
+  test_inferred_function_type_in_generic_class_constructor() async {
+    await super.test_inferred_function_type_in_generic_class_constructor();
+  }
+
+  @override
+  @failingTest
+  test_inferred_function_type_in_generic_class_getter() async {
+    await super.test_inferred_function_type_in_generic_class_getter();
+  }
+
+  @override
+  @failingTest
+  test_inferred_function_type_in_generic_class_in_generic_method() async {
+    await super
+        .test_inferred_function_type_in_generic_class_in_generic_method();
+  }
+
+  @override
+  @failingTest
+  test_inferred_function_type_in_generic_class_setter() async {
+    await super.test_inferred_function_type_in_generic_class_setter();
+  }
+
+  @override
+  @failingTest
+  test_inferred_function_type_in_generic_closure() async {
+    await super.test_inferred_function_type_in_generic_closure();
+  }
+
+  @override
+  @failingTest
+  test_inferred_generic_function_type_in_generic_closure() async {
+    await super.test_inferred_generic_function_type_in_generic_closure();
+  }
+
+  @override
+  @failingTest
+  test_inferred_type_is_typedef() async {
+    await super.test_inferred_type_is_typedef();
+  }
+
+  @override
+  @failingTest
+  test_inferred_type_refers_to_bound_type_param() async {
+    await super.test_inferred_type_refers_to_bound_type_param();
+  }
+
+  @override
+  @failingTest
+  test_inferred_type_refers_to_function_typed_param_of_typedef() async {
+    await super.test_inferred_type_refers_to_function_typed_param_of_typedef();
+  }
+
+  @override
+  @failingTest
+  test_inferred_type_refers_to_function_typed_parameter_type_generic_class() async {
+    await super
+        .test_inferred_type_refers_to_function_typed_parameter_type_generic_class();
+  }
+
+  @override
+  @failingTest
+  test_inferred_type_refers_to_function_typed_parameter_type_other_lib() async {
+    await super
+        .test_inferred_type_refers_to_function_typed_parameter_type_other_lib();
+  }
+
+  @override
+  @failingTest
+  test_inferred_type_refers_to_method_function_typed_parameter_type() async {
+    await super
+        .test_inferred_type_refers_to_method_function_typed_parameter_type();
+  }
+
+  @override
+  @failingTest
+  test_inferred_type_refers_to_nested_function_typed_param() async {
+    await super.test_inferred_type_refers_to_nested_function_typed_param();
+  }
+
+  @override
+  @failingTest
+  test_inferred_type_refers_to_nested_function_typed_param_named() async {
+    await super
+        .test_inferred_type_refers_to_nested_function_typed_param_named();
+  }
+
+  @override
+  @failingTest
+  test_inferred_type_refers_to_setter_function_typed_parameter_type() async {
+    await super
+        .test_inferred_type_refers_to_setter_function_typed_parameter_type();
+  }
+
+  @override
+  @failingTest
+  test_inferredType_definedInSdkLibraryPart() async {
+    await super.test_inferredType_definedInSdkLibraryPart();
+  }
+
+  @override
+  @failingTest
+  test_inferredType_implicitCreation() async {
+    await super.test_inferredType_implicitCreation();
+  }
+
+  @override
+  @failingTest
+  test_inferredType_implicitCreation_prefixed() async {
+    await super.test_inferredType_implicitCreation_prefixed();
+  }
+
+  @override
+  @failingTest
+  test_inferredType_usesSyntheticFunctionType_functionTypedParam() async {
+    await super
+        .test_inferredType_usesSyntheticFunctionType_functionTypedParam();
+  }
+
+  @override
+  @failingTest
+  test_inheritance_errors() async {
+    await super.test_inheritance_errors();
+  }
+
+  @override
+  @failingTest
+  test_initializer_executable_with_return_type_from_closure() async {
+    await super.test_initializer_executable_with_return_type_from_closure();
+  }
+
+  @override
+  @failingTest
+  test_initializer_executable_with_return_type_from_closure_await_dynamic() async {
+    await super
+        .test_initializer_executable_with_return_type_from_closure_await_dynamic();
+  }
+
+  @override
+  @failingTest
+  test_initializer_executable_with_return_type_from_closure_await_future3_int() async {
+    await super
+        .test_initializer_executable_with_return_type_from_closure_await_future3_int();
+  }
+
+  @override
+  @failingTest
+  test_initializer_executable_with_return_type_from_closure_await_future_int() async {
+    await super
+        .test_initializer_executable_with_return_type_from_closure_await_future_int();
+  }
+
+  @override
+  @failingTest
+  test_initializer_executable_with_return_type_from_closure_await_future_noArg() async {
+    await super
+        .test_initializer_executable_with_return_type_from_closure_await_future_noArg();
+  }
+
+  @override
+  @failingTest
+  test_initializer_executable_with_return_type_from_closure_field() async {
+    await super
+        .test_initializer_executable_with_return_type_from_closure_field();
+  }
+
+  @override
+  @failingTest
+  test_initializer_executable_with_return_type_from_closure_local() async {
+    await super
+        .test_initializer_executable_with_return_type_from_closure_local();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_boundRefersToEarlierTypeArgument() async {
+    await super.test_instantiateToBounds_boundRefersToEarlierTypeArgument();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_boundRefersToItself() async {
+    await super.test_instantiateToBounds_boundRefersToItself();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_boundRefersToLaterTypeArgument() async {
+    await super.test_instantiateToBounds_boundRefersToLaterTypeArgument();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_functionTypeAlias_reexported() async {
+    await super.test_instantiateToBounds_functionTypeAlias_reexported();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_functionTypeAlias_simple() async {
+    await super.test_instantiateToBounds_functionTypeAlias_simple();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_simple() async {
+    await super.test_instantiateToBounds_simple();
+  }
+
+  @override
+  @failingTest
+  test_invalid_annotation_prefixed_constructor() async {
+    await super.test_invalid_annotation_prefixed_constructor();
+  }
+
+  @override
+  @failingTest
+  test_invalid_annotation_unprefixed_constructor() async {
+    await super.test_invalid_annotation_unprefixed_constructor();
+  }
+
+  @override
+  @failingTest
+  test_invalid_importPrefix_asTypeArgument() async {
+    await super.test_invalid_importPrefix_asTypeArgument();
+  }
+
+  @override
+  @failingTest
+  test_invalid_nameConflict_imported() async {
+    await super.test_invalid_nameConflict_imported();
+  }
+
+  @override
+  @failingTest
+  test_invalid_nameConflict_imported_exported() async {
+    await super.test_invalid_nameConflict_imported_exported();
+  }
+
+  @override
+  @failingTest
+  test_invalid_nameConflict_local() async {
+    await super.test_invalid_nameConflict_local();
+  }
+
+  @override
+  @failingTest
+  test_invalid_setterParameter_fieldFormalParameter() async {
+    await super.test_invalid_setterParameter_fieldFormalParameter();
+  }
+
+  @override
+  @failingTest
+  test_invalid_setterParameter_fieldFormalParameter_self() async {
+    await super.test_invalid_setterParameter_fieldFormalParameter_self();
+  }
+
+  @override
+  @failingTest
+  test_invalidUri_part_emptyUri() async {
+    await super.test_invalidUri_part_emptyUri();
+  }
+
+  @override
+  @failingTest
+  test_invalidUris() async {
+    await super.test_invalidUris();
+  }
+
+  @override
+  @failingTest
+  test_library_documented_lines() async {
+    await super.test_library_documented_lines();
+  }
+
+  @override
+  @failingTest
+  test_library_documented_stars() async {
+    await super.test_library_documented_stars();
+  }
+
+  @override
+  @failingTest
+  test_library_name_with_spaces() async {
+    await super.test_library_name_with_spaces();
+  }
+
+  @override
+  @failingTest
+  test_library_named() async {
+    await super.test_library_named();
+  }
+
+  @override
+  @failingTest
+  test_localFunctions() async {
+    await super.test_localFunctions();
+  }
+
+  @override
+  @failingTest
+  test_localFunctions_inMethod() async {
+    await super.test_localFunctions_inMethod();
+  }
+
+  @override
+  @failingTest
+  test_localFunctions_inTopLevelGetter() async {
+    await super.test_localFunctions_inTopLevelGetter();
+  }
+
+  @override
+  @failingTest
+  test_localLabels_inMethod() async {
+    await super.test_localLabels_inMethod();
+  }
+
+  @override
+  @failingTest
+  test_localLabels_inTopLevelFunction() async {
+    await super.test_localLabels_inTopLevelFunction();
+  }
+
+  @override
+  @failingTest
+  test_main_class_alias() async {
+    await super.test_main_class_alias();
+  }
+
+  @override
+  @failingTest
+  test_main_class_alias_via_export() async {
+    await super.test_main_class_alias_via_export();
+  }
+
+  @override
+  @failingTest
+  test_main_class_via_export() async {
+    await super.test_main_class_via_export();
+  }
+
+  @override
+  @failingTest
+  test_main_getter() async {
+    await super.test_main_getter();
+  }
+
+  @override
+  @failingTest
+  test_main_getter_via_export() async {
+    await super.test_main_getter_via_export();
+  }
+
+  @override
+  @failingTest
+  test_main_typedef() async {
+    await super.test_main_typedef();
+  }
+
+  @override
+  @failingTest
+  test_main_typedef_via_export() async {
+    await super.test_main_typedef_via_export();
+  }
+
+  @override
+  @failingTest
+  test_main_variable() async {
+    await super.test_main_variable();
+  }
+
+  @override
+  @failingTest
+  test_main_variable_via_export() async {
+    await super.test_main_variable_via_export();
+  }
+
+  @override
+  @failingTest
+  test_member_function_async() async {
+    await super.test_member_function_async();
+  }
+
+  @override
+  @failingTest
+  test_member_function_asyncStar() async {
+    await super.test_member_function_asyncStar();
+  }
+
+  @override
+  @failingTest
+  test_member_function_syncStar() async {
+    await super.test_member_function_syncStar();
+  }
+
+  @override
+  @failingTest
+  test_metadata_classDeclaration() async {
+    await super.test_metadata_classDeclaration();
+  }
+
+  @override
+  @failingTest
+  test_metadata_classTypeAlias() async {
+    await super.test_metadata_classTypeAlias();
+  }
+
+  @override
+  @failingTest
+  test_metadata_constructor_call_named() async {
+    await super.test_metadata_constructor_call_named();
+  }
+
+  @override
+  @failingTest
+  test_metadata_constructor_call_named_prefixed() async {
+    await super.test_metadata_constructor_call_named_prefixed();
+  }
+
+  @override
+  @failingTest
+  test_metadata_constructor_call_unnamed() async {
+    await super.test_metadata_constructor_call_unnamed();
+  }
+
+  @override
+  @failingTest
+  test_metadata_constructor_call_unnamed_prefixed() async {
+    await super.test_metadata_constructor_call_unnamed_prefixed();
+  }
+
+  @override
+  @failingTest
+  test_metadata_constructor_call_with_args() async {
+    await super.test_metadata_constructor_call_with_args();
+  }
+
+  @override
+  @failingTest
+  test_metadata_constructorDeclaration_named() async {
+    await super.test_metadata_constructorDeclaration_named();
+  }
+
+  @override
+  @failingTest
+  test_metadata_constructorDeclaration_unnamed() async {
+    await super.test_metadata_constructorDeclaration_unnamed();
+  }
+
+  @override
+  @failingTest
+  test_metadata_enumConstantDeclaration() async {
+    await super.test_metadata_enumConstantDeclaration();
+  }
+
+  @override
+  @failingTest
+  test_metadata_enumDeclaration() async {
+    await super.test_metadata_enumDeclaration();
+  }
+
+  @override
+  @failingTest
+  test_metadata_exportDirective() async {
+    await super.test_metadata_exportDirective();
+  }
+
+  @override
+  @failingTest
+  test_metadata_fieldDeclaration() async {
+    await super.test_metadata_fieldDeclaration();
+  }
+
+  @override
+  @failingTest
+  test_metadata_fieldFormalParameter() async {
+    await super.test_metadata_fieldFormalParameter();
+  }
+
+  @override
+  @failingTest
+  test_metadata_fieldFormalParameter_withDefault() async {
+    await super.test_metadata_fieldFormalParameter_withDefault();
+  }
+
+  @override
+  @failingTest
+  test_metadata_functionDeclaration_function() async {
+    await super.test_metadata_functionDeclaration_function();
+  }
+
+  @override
+  @failingTest
+  test_metadata_functionDeclaration_getter() async {
+    await super.test_metadata_functionDeclaration_getter();
+  }
+
+  @override
+  @failingTest
+  test_metadata_functionDeclaration_setter() async {
+    await super.test_metadata_functionDeclaration_setter();
+  }
+
+  @override
+  @failingTest
+  test_metadata_functionTypeAlias() async {
+    await super.test_metadata_functionTypeAlias();
+  }
+
+  @override
+  @failingTest
+  test_metadata_functionTypedFormalParameter() async {
+    await super.test_metadata_functionTypedFormalParameter();
+  }
+
+  @override
+  @failingTest
+  test_metadata_functionTypedFormalParameter_withDefault() async {
+    await super.test_metadata_functionTypedFormalParameter_withDefault();
+  }
+
+  @override
+  @failingTest
+  test_metadata_importDirective() async {
+    await super.test_metadata_importDirective();
+  }
+
+  @override
+  @failingTest
+  test_metadata_invalid_classDeclaration() async {
+    await super.test_metadata_invalid_classDeclaration();
+  }
+
+  @override
+  @failingTest
+  test_metadata_libraryDirective() async {
+    await super.test_metadata_libraryDirective();
+  }
+
+  @override
+  @failingTest
+  test_metadata_methodDeclaration_getter() async {
+    await super.test_metadata_methodDeclaration_getter();
+  }
+
+  @override
+  @failingTest
+  test_metadata_methodDeclaration_method() async {
+    await super.test_metadata_methodDeclaration_method();
+  }
+
+  @override
+  @failingTest
+  test_metadata_methodDeclaration_setter() async {
+    await super.test_metadata_methodDeclaration_setter();
+  }
+
+  @override
+  @failingTest
+  test_metadata_partDirective() async {
+    await super.test_metadata_partDirective();
+  }
+
+  @override
+  @failingTest
+  test_metadata_prefixed_variable() async {
+    await super.test_metadata_prefixed_variable();
+  }
+
+  @override
+  @failingTest
+  test_metadata_simpleFormalParameter() async {
+    await super.test_metadata_simpleFormalParameter();
+  }
+
+  @override
+  @failingTest
+  test_metadata_simpleFormalParameter_withDefault() async {
+    await super.test_metadata_simpleFormalParameter_withDefault();
+  }
+
+  @override
+  @failingTest
+  test_metadata_topLevelVariableDeclaration() async {
+    await super.test_metadata_topLevelVariableDeclaration();
+  }
+
+  @override
+  @failingTest
+  test_metadata_typeParameter_ofClass() async {
+    await super.test_metadata_typeParameter_ofClass();
+  }
+
+  @override
+  @failingTest
+  test_metadata_typeParameter_ofClassTypeAlias() async {
+    await super.test_metadata_typeParameter_ofClassTypeAlias();
+  }
+
+  @override
+  @failingTest
+  test_metadata_typeParameter_ofFunction() async {
+    await super.test_metadata_typeParameter_ofFunction();
+  }
+
+  @override
+  @failingTest
+  test_metadata_typeParameter_ofTypedef() async {
+    await super.test_metadata_typeParameter_ofTypedef();
+  }
+
+  @override
+  @failingTest
+  test_method_documented() async {
+    await super.test_method_documented();
+  }
+
+  @override
+  @failingTest
+  test_method_inferred_type_nonStatic_implicit_param() async {
+    await super.test_method_inferred_type_nonStatic_implicit_param();
+  }
+
+  @override
+  @failingTest
+  test_method_inferred_type_nonStatic_implicit_return() async {
+    await super.test_method_inferred_type_nonStatic_implicit_return();
+  }
+
+  @override
+  @failingTest
+  test_method_type_parameter() async {
+    await super.test_method_type_parameter();
+  }
+
+  @override
+  @failingTest
+  test_method_type_parameter_in_generic_class() async {
+    await super.test_method_type_parameter_in_generic_class();
+  }
+
+  @override
+  @failingTest
+  test_method_type_parameter_with_function_typed_parameter() async {
+    await super.test_method_type_parameter_with_function_typed_parameter();
+  }
+
+  @override
+  @failingTest
+  test_methodInvocation_implicitCall() async {
+    await super.test_methodInvocation_implicitCall();
+  }
+
+  @override
+  @failingTest
+  test_mixin() async {
+    await super.test_mixin();
+  }
+
+  @override
+  @failingTest
+  test_mixin_implicitObjectSuperclassConstraint() async {
+    await super.test_mixin_implicitObjectSuperclassConstraint();
+  }
+
+  @override
+  @failingTest
+  test_nameConflict_exportedAndLocal() async {
+    await super.test_nameConflict_exportedAndLocal();
+  }
+
+  @override
+  @failingTest
+  test_nameConflict_exportedAndLocal_exported() async {
+    await super.test_nameConflict_exportedAndLocal_exported();
+  }
+
+  @override
+  @failingTest
+  test_nameConflict_exportedAndParted() async {
+    await super.test_nameConflict_exportedAndParted();
+  }
+
+  @override
+  @failingTest
+  test_nameConflict_importWithRelativeUri_exportWithAbsolute() async {
+    // TODO(scheglov) unexpectedly passes on Windows
+    fail('unexpectedly passes on Windows');
+//    await super.test_nameConflict_importWithRelativeUri_exportWithAbsolute();
+  }
+
+  @override
+  @failingTest
+  test_nested_generic_functions_in_generic_class_with_function_typed_params() async {
+    await super
+        .test_nested_generic_functions_in_generic_class_with_function_typed_params();
+  }
+
+  @override
+  @failingTest
+  test_nested_generic_functions_in_generic_class_with_local_variables() async {
+    await super
+        .test_nested_generic_functions_in_generic_class_with_local_variables();
+  }
+
+  @override
+  @failingTest
+  test_nested_generic_functions_with_function_typed_param() async {
+    await super.test_nested_generic_functions_with_function_typed_param();
+  }
+
+  @override
+  @failingTest
+  test_nested_generic_functions_with_local_variables() async {
+    await super.test_nested_generic_functions_with_local_variables();
+  }
+
+  @override
+  @failingTest
+  test_operator() async {
+    await super.test_operator();
+  }
+
+  @override
+  @failingTest
+  test_operator_equal() async {
+    await super.test_operator_equal();
+  }
+
+  @override
+  @failingTest
+  test_operator_external() async {
+    await super.test_operator_external();
+  }
+
+  @override
+  @failingTest
+  test_operator_greater_equal() async {
+    await super.test_operator_greater_equal();
+  }
+
+  @override
+  @failingTest
+  test_operator_index() async {
+    await super.test_operator_index();
+  }
+
+  @override
+  @failingTest
+  test_operator_index_set() async {
+    await super.test_operator_index_set();
+  }
+
+  @override
+  @failingTest
+  test_operator_less_equal() async {
+    await super.test_operator_less_equal();
+  }
+
+  @override
+  @failingTest
+  test_parameter() async {
+    await super.test_parameter();
+  }
+
+  @override
+  @failingTest
+  test_parameter_covariant() async {
+    await super.test_parameter_covariant();
+  }
+
+  @override
+  @failingTest
+  test_parameter_covariant_inherited() async {
+    await super.test_parameter_covariant_inherited();
+  }
+
+  @override
+  @failingTest
+  test_parameter_parameters() async {
+    await super.test_parameter_parameters();
+  }
+
+  @override
+  @failingTest
+  test_parameter_parameters_in_generic_class() async {
+    await super.test_parameter_parameters_in_generic_class();
+  }
+
+  @override
+  @failingTest
+  test_parameter_return_type() async {
+    await super.test_parameter_return_type();
+  }
+
+  @override
+  @failingTest
+  test_parameter_return_type_void() async {
+    await super.test_parameter_return_type_void();
+  }
+
+  @override
+  @failingTest
+  test_parameterTypeNotInferred_constructor() async {
+    await super.test_parameterTypeNotInferred_constructor();
+  }
+
+  @override
+  @failingTest
+  test_parameterTypeNotInferred_initializingFormal() async {
+    await super.test_parameterTypeNotInferred_initializingFormal();
+  }
+
+  @override
+  @failingTest
+  test_parameterTypeNotInferred_staticMethod() async {
+    await super.test_parameterTypeNotInferred_staticMethod();
+  }
+
+  @override
+  @failingTest
+  test_parameterTypeNotInferred_topLevelFunction() async {
+    await super.test_parameterTypeNotInferred_topLevelFunction();
+  }
+
+  @override
+  @failingTest
+  test_parts() async {
+    await super.test_parts();
+  }
+
+  @override
+  @failingTest
+  test_parts_invalidUri() async {
+    await super.test_parts_invalidUri();
+  }
+
+  @override
+  @failingTest
+  test_parts_invalidUri_nullStringValue() async {
+    await super.test_parts_invalidUri_nullStringValue();
+  }
+
+  @override
+  @failingTest
+  test_propagated_type_refers_to_closure() async {
+    await super.test_propagated_type_refers_to_closure();
+  }
+
+  @override
+  @failingTest
+  test_setter_covariant() async {
+    await super.test_setter_covariant();
+  }
+
+  @override
+  @failingTest
+  test_setter_documented() async {
+    await super.test_setter_documented();
+  }
+
+  @override
+  @failingTest
+  test_setter_external() async {
+    await super.test_setter_external();
+  }
+
+  @override
+  @failingTest
+  test_setter_inferred_type_conflictingInheritance() async {
+    await super.test_setter_inferred_type_conflictingInheritance();
+  }
+
+  @override
+  @failingTest
+  test_setter_inferred_type_nonStatic_implicit_param() async {
+    await super.test_setter_inferred_type_nonStatic_implicit_param();
+  }
+
+  @override
+  @failingTest
+  test_setter_inferred_type_static_implicit_return() async {
+    await super.test_setter_inferred_type_static_implicit_return();
+  }
+
+  @override
+  @failingTest
+  test_setter_inferred_type_top_level_implicit_return() async {
+    await super.test_setter_inferred_type_top_level_implicit_return();
+  }
+
+  @override
+  @failingTest
+  test_setters() async {
+    await super.test_setters();
+  }
+
+  @override
+  @failingTest
+  test_syntheticFunctionType_genericClosure() async {
+    await super.test_syntheticFunctionType_genericClosure();
+  }
+
+  @override
+  @failingTest
+  test_syntheticFunctionType_genericClosure_inGenericFunction() async {
+    await super.test_syntheticFunctionType_genericClosure_inGenericFunction();
+  }
+
+  @override
+  @failingTest
+  test_syntheticFunctionType_inGenericClass() async {
+    await super.test_syntheticFunctionType_inGenericClass();
+  }
+
+  @override
+  @failingTest
+  test_syntheticFunctionType_inGenericFunction() async {
+    await super.test_syntheticFunctionType_inGenericFunction();
+  }
+
+  @override
+  @failingTest
+  test_syntheticFunctionType_noArguments() async {
+    await super.test_syntheticFunctionType_noArguments();
+  }
+
+  @override
+  @failingTest
+  test_syntheticFunctionType_withArguments() async {
+    await super.test_syntheticFunctionType_withArguments();
+  }
+
+  @override
+  @failingTest
+  test_type_arguments_explicit_dynamic_dynamic() async {
+    await super.test_type_arguments_explicit_dynamic_dynamic();
+  }
+
+  @override
+  @failingTest
+  test_type_arguments_explicit_dynamic_int() async {
+    await super.test_type_arguments_explicit_dynamic_int();
+  }
+
+  @override
+  @failingTest
+  test_type_arguments_explicit_String_dynamic() async {
+    await super.test_type_arguments_explicit_String_dynamic();
+  }
+
+  @override
+  @failingTest
+  test_type_arguments_explicit_String_int() async {
+    await super.test_type_arguments_explicit_String_int();
+  }
+
+  @override
+  @failingTest
+  test_type_arguments_implicit() async {
+    await super.test_type_arguments_implicit();
+  }
+
+  @override
+  @failingTest
+  test_type_dynamic() async {
+    await super.test_type_dynamic();
+  }
+
+  @override
+  @failingTest
+  test_type_inference_based_on_loadLibrary() async {
+    await super.test_type_inference_based_on_loadLibrary();
+  }
+
+  @override
+  @failingTest
+  test_type_inference_closure_with_function_typed_parameter() async {
+    await super.test_type_inference_closure_with_function_typed_parameter();
+  }
+
+  @override
+  @failingTest
+  test_type_inference_closure_with_function_typed_parameter_new() async {
+    await super.test_type_inference_closure_with_function_typed_parameter_new();
+  }
+
+  @override
+  @failingTest
+  test_type_inference_depends_on_exported_variable() async {
+    await super.test_type_inference_depends_on_exported_variable();
+  }
+
+  @override
+  @failingTest
+  test_type_inference_nested_function() async {
+    await super.test_type_inference_nested_function();
+  }
+
+  @override
+  @failingTest
+  test_type_inference_nested_function_with_parameter_types() async {
+    await super.test_type_inference_nested_function_with_parameter_types();
+  }
+
+  @override
+  @failingTest
+  test_type_inference_of_closure_with_default_value() async {
+    await super.test_type_inference_of_closure_with_default_value();
+  }
+
+  @override
+  @failingTest
+  test_type_invalid_topLevelVariableElement_asType() async {
+    await super.test_type_invalid_topLevelVariableElement_asType();
+  }
+
+  @override
+  @failingTest
+  test_type_invalid_topLevelVariableElement_asTypeArgument() async {
+    await super.test_type_invalid_topLevelVariableElement_asTypeArgument();
+  }
+
+  @override
+  @failingTest
+  test_type_invalid_typeParameter_asPrefix() async {
+    await super.test_type_invalid_typeParameter_asPrefix();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_lib_to_lib() async {
+    await super.test_type_reference_lib_to_lib();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_lib_to_part() async {
+    await super.test_type_reference_lib_to_part();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_part_to_lib() async {
+    await super.test_type_reference_part_to_lib();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_part_to_other_part() async {
+    await super.test_type_reference_part_to_other_part();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_part_to_part() async {
+    await super.test_type_reference_part_to_part();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_class() async {
+    await super.test_type_reference_to_class();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_class_with_type_arguments() async {
+    await super.test_type_reference_to_class_with_type_arguments();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_class_with_type_arguments_implicit() async {
+    await super.test_type_reference_to_class_with_type_arguments_implicit();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_enum() async {
+    await super.test_type_reference_to_enum();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_import() async {
+    await super.test_type_reference_to_import();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_import_export() async {
+    await super.test_type_reference_to_import_export();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_import_export_export() async {
+    await super.test_type_reference_to_import_export_export();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_import_export_export_in_subdirs() async {
+    await super.test_type_reference_to_import_export_export_in_subdirs();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_import_export_in_subdirs() async {
+    await super.test_type_reference_to_import_export_in_subdirs();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_import_part() async {
+    await super.test_type_reference_to_import_part();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_import_part2() async {
+    await super.test_type_reference_to_import_part2();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_import_part_in_subdir() async {
+    await super.test_type_reference_to_import_part_in_subdir();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_import_relative() async {
+    await super.test_type_reference_to_import_relative();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_typedef() async {
+    await super.test_type_reference_to_typedef();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_typedef_with_type_arguments() async {
+    await super.test_type_reference_to_typedef_with_type_arguments();
+  }
+
+  @override
+  @failingTest
+  test_type_reference_to_typedef_with_type_arguments_implicit() async {
+    await super.test_type_reference_to_typedef_with_type_arguments_implicit();
+  }
+
+  @override
+  @failingTest
+  test_type_unresolved() async {
+    await super.test_type_unresolved();
+  }
+
+  @override
+  @failingTest
+  test_type_unresolved_prefixed() async {
+    await super.test_type_unresolved_prefixed();
+  }
+
+  @override
+  @failingTest
+  test_typedef_documented() async {
+    await super.test_typedef_documented();
+  }
+
+  @override
+  @failingTest
+  test_typedef_generic() async {
+    await super.test_typedef_generic();
+  }
+
+  @override
+  @failingTest
+  test_typedef_generic_asFieldType() async {
+    await super.test_typedef_generic_asFieldType();
+  }
+
+  @override
+  @failingTest
+  test_typedef_parameter_parameters() async {
+    await super.test_typedef_parameter_parameters();
+  }
+
+  @override
+  @failingTest
+  test_typedef_parameter_parameters_in_generic_class() async {
+    await super.test_typedef_parameter_parameters_in_generic_class();
+  }
+
+  @override
+  @failingTest
+  test_typedef_parameter_return_type() async {
+    await super.test_typedef_parameter_return_type();
+  }
+
+  @override
+  @failingTest
+  test_typedef_parameter_type() async {
+    await super.test_typedef_parameter_type();
+  }
+
+  @override
+  @failingTest
+  test_typedef_parameter_type_generic() async {
+    await super.test_typedef_parameter_type_generic();
+  }
+
+  @override
+  @failingTest
+  test_typedef_parameters() async {
+    await super.test_typedef_parameters();
+  }
+
+  @override
+  @failingTest
+  test_typedef_parameters_named() async {
+    await super.test_typedef_parameters_named();
+  }
+
+  @override
+  @failingTest
+  test_typedef_return_type() async {
+    await super.test_typedef_return_type();
+  }
+
+  @override
+  @failingTest
+  test_typedef_return_type_generic() async {
+    await super.test_typedef_return_type_generic();
+  }
+
+  @override
+  @failingTest
+  test_typedef_return_type_implicit() async {
+    await super.test_typedef_return_type_implicit();
+  }
+
+  @override
+  @failingTest
+  test_typedef_return_type_void() async {
+    await super.test_typedef_return_type_void();
+  }
+
+  @override
+  @failingTest
+  test_typedef_type_parameters() async {
+    await super.test_typedef_type_parameters();
+  }
+
+  @override
+  @failingTest
+  test_typedef_type_parameters_bound() async {
+    await super.test_typedef_type_parameters_bound();
+  }
+
+  @override
+  @failingTest
+  test_typedef_type_parameters_bound_recursive() async {
+    await super.test_typedef_type_parameters_bound_recursive();
+  }
+
+  @override
+  @failingTest
+  test_typedef_type_parameters_bound_recursive2() async {
+    await super.test_typedef_type_parameters_bound_recursive2();
+  }
+
+  @override
+  @failingTest
+  test_typedef_type_parameters_f_bound_complex() async {
+    await super.test_typedef_type_parameters_f_bound_complex();
+  }
+
+  @override
+  @failingTest
+  test_typedef_type_parameters_f_bound_simple() async {
+    await super.test_typedef_type_parameters_f_bound_simple();
+  }
+
+  @override
+  @failingTest
+  test_typedef_type_parameters_f_bound_simple_new_syntax() async {
+    await super.test_typedef_type_parameters_f_bound_simple_new_syntax();
+  }
+
+  @override
+  @failingTest
+  test_typedefs() async {
+    await super.test_typedefs();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_annotation_instanceCreation_argument_this() async {
+    await super.test_unresolved_annotation_instanceCreation_argument_this();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_annotation_namedConstructorCall_noClass() async {
+    await super.test_unresolved_annotation_namedConstructorCall_noClass();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_annotation_namedConstructorCall_noConstructor() async {
+    await super.test_unresolved_annotation_namedConstructorCall_noConstructor();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_annotation_prefixedIdentifier_badPrefix() async {
+    await super.test_unresolved_annotation_prefixedIdentifier_badPrefix();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_annotation_prefixedIdentifier_noDeclaration() async {
+    await super.test_unresolved_annotation_prefixedIdentifier_noDeclaration();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix() async {
+    await super
+        .test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_annotation_prefixedNamedConstructorCall_noClass() async {
+    await super
+        .test_unresolved_annotation_prefixedNamedConstructorCall_noClass();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor() async {
+    await super
+        .test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix() async {
+    await super
+        .test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass() async {
+    await super
+        .test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_annotation_simpleIdentifier() async {
+    await super.test_unresolved_annotation_simpleIdentifier();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_annotation_unnamedConstructorCall_noClass() async {
+    await super.test_unresolved_annotation_unnamedConstructorCall_noClass();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_export() async {
+    await super.test_unresolved_export();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_import() async {
+    await super.test_unresolved_import();
+  }
+
+  @override
+  @failingTest
+  test_unresolved_part() async {
+    await super.test_unresolved_part();
+  }
+
+  @override
+  @failingTest
+  test_unused_type_parameter() async {
+    await super.test_unused_type_parameter();
+  }
+
+  @override
+  @failingTest
+  test_variable() async {
+    await super.test_variable();
+  }
+
+  @override
+  @failingTest
+  test_variable_const() async {
+    await super.test_variable_const();
+  }
+
+  @override
+  @failingTest
+  test_variable_documented() async {
+    await super.test_variable_documented();
+  }
+
+  @override
+  @failingTest
+  test_variable_final() async {
+    await super.test_variable_final();
+  }
+
+  @override
+  @failingTest
+  test_variable_getterInLib_setterInPart() async {
+    await super.test_variable_getterInLib_setterInPart();
+  }
+
+  @override
+  @failingTest
+  test_variable_getterInPart_setterInLib() async {
+    await super.test_variable_getterInPart_setterInLib();
+  }
+
+  @override
+  @failingTest
+  test_variable_getterInPart_setterInPart() async {
+    await super.test_variable_getterInPart_setterInPart();
+  }
+
+  @override
+  @failingTest
+  test_variable_implicit_type() async {
+    await super.test_variable_implicit_type();
+  }
+
+  @override
+  @failingTest
+  test_variable_inferred_type_implicit_initialized() async {
+    await super.test_variable_inferred_type_implicit_initialized();
+  }
+
+  @override
+  @failingTest
+  test_variable_initializer() async {
+    await super.test_variable_initializer();
+  }
+
+  @override
+  @failingTest
+  test_variable_initializer_final() async {
+    await super.test_variable_initializer_final();
+  }
+
+  @override
+  @failingTest
+  test_variable_initializer_final_untyped() async {
+    await super.test_variable_initializer_final_untyped();
+  }
+
+  @override
+  @failingTest
+  test_variable_initializer_untyped() async {
+    await super.test_variable_initializer_untyped();
+  }
+
+  @override
+  @failingTest
+  test_variable_propagatedType_const_noDep() async {
+    await super.test_variable_propagatedType_const_noDep();
+  }
+
+  @override
+  @failingTest
+  test_variable_propagatedType_final_dep_inLib() async {
+    await super.test_variable_propagatedType_final_dep_inLib();
+  }
+
+  @override
+  @failingTest
+  test_variable_propagatedType_final_dep_inPart() async {
+    await super.test_variable_propagatedType_final_dep_inPart();
+  }
+
+  @override
+  @failingTest
+  test_variable_propagatedType_final_noDep() async {
+    await super.test_variable_propagatedType_final_noDep();
+  }
+
+  @override
+  @failingTest
+  test_variable_propagatedType_implicit_dep() async {
+    await super.test_variable_propagatedType_implicit_dep();
+  }
+
+  @override
+  @failingTest
+  test_variable_setterInPart_getterInPart() async {
+    await super.test_variable_setterInPart_getterInPart();
+  }
+
+  @override
+  @failingTest
+  test_variables() async {
+    await super.test_variables();
+  }
+}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
index a3b399e..985f379 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
@@ -22,8 +22,6 @@
   }
 }
 
-/// TODO(paulberry): migrate this test away from the task model.
-/// See dartbug.com/35734.
 @reflectiveTest
 class ResynthesizeAstStrongTest extends ResynthesizeTestStrategyTwoPhase
     with ResynthesizeTestCases, ResynthesizeTestHelpers {
@@ -39,25 +37,7 @@
 
   @override
   @failingTest
-  test_syntheticFunctionType_genericClosure() async {
-    await super.test_syntheticFunctionType_genericClosure();
-  }
-
-  @override
-  @failingTest
   test_syntheticFunctionType_inGenericClass() async {
     await super.test_syntheticFunctionType_inGenericClass();
   }
-
-  @override
-  @failingTest
-  test_syntheticFunctionType_noArguments() async {
-    await super.test_syntheticFunctionType_noArguments();
-  }
-
-  @override
-  @failingTest
-  test_syntheticFunctionType_withArguments() async {
-    await super.test_syntheticFunctionType_withArguments();
-  }
 }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index dd5daa7..3f672e4 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -6,32 +6,20 @@
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_resolution_map.dart';
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/handle.dart';
-import 'package:analyzer/src/dart/element/member.dart';
-import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/resolver.dart' show Namespace;
-import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/resynthesize.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../generated/test_support.dart';
 import '../../util/element_type_matchers.dart';
-import '../abstract_single_unit.dart';
 import 'element_text.dart';
 import 'test_strategies.dart';
 
@@ -40,7 +28,14 @@
  *
  * The return type separator: →
  */
-abstract class AbstractResynthesizeTest extends AbstractSingleUnitTest {
+abstract class AbstractResynthesizeTest with ResourceProviderMixin {
+  DeclaredVariables declaredVariables = new DeclaredVariables();
+  AnalysisOptionsImpl analysisOptions = AnalysisOptionsImpl();
+  SourceFactory sourceFactory;
+  MockSdk sdk;
+
+  String testFile;
+  Source testSource;
   Set<Source> otherLibrarySources = new Set<Source>();
 
   /**
@@ -49,70 +44,64 @@
    */
   bool allowMissingFiles = false;
 
+  AbstractResynthesizeTest() {
+    sdk = new MockSdk(resourceProvider: resourceProvider);
+
+    sourceFactory = SourceFactory(
+      [
+        DartUriResolver(sdk),
+        ResourceUriResolver(resourceProvider),
+      ],
+      null,
+      resourceProvider,
+    );
+
+    testFile = convertPath('/test.dart');
+  }
+
   void addLibrary(String uri) {
-    otherLibrarySources.add(context.sourceFactory.forUri(uri));
+    var source = sourceFactory.forUri(uri);
+    otherLibrarySources.add(source);
   }
 
   Source addLibrarySource(String filePath, String contents) {
-    Source source = addSource(filePath, contents);
+    var source = addSource(filePath, contents);
     otherLibrarySources.add(source);
     return source;
   }
 
-  void assertNoErrors(Source source) {
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    for (AnalysisError error in context.computeErrors(source)) {
-      expect(error.source, source);
-      ErrorCode errorCode = error.errorCode;
-      if (errorCode == HintCode.UNUSED_ELEMENT ||
-          errorCode == HintCode.UNUSED_FIELD) {
-        continue;
-      }
-      if (errorCode == HintCode.UNUSED_CATCH_CLAUSE ||
-          errorCode == HintCode.UNUSED_CATCH_STACK ||
-          errorCode == HintCode.UNUSED_LOCAL_VARIABLE) {
-        continue;
-      }
-      errorListener.onError(error);
-    }
-    errorListener.assertNoErrors();
+  Source addSource(String path, String contents) {
+    var file = newFile(path, content: contents);
+    var source = file.createSource();
+    return source;
+  }
+
+  Source addTestSource(String code, [Uri uri]) {
+    testSource = addSource(testFile, code);
+    return testSource;
   }
 
   /**
    * Verify that the [resynthesizer] didn't do any unnecessary work when
-   * resynthesizing [library].
+   * resynthesizing the library with the [expectedLibraryUri].
    */
-  void checkMinimalResynthesisWork(
-      TestSummaryResynthesizer resynthesizer, LibraryElement library) {
+  void checkMinimalResynthesisWork(TestSummaryResynthesizer resynthesizer,
+      Uri expectedLibraryUri, List<Uri> expectedUnitUriList) {
     // Check that no other summaries needed to be resynthesized to resynthesize
     // the library element.
     expect(resynthesizer.resynthesisCount, 3);
     // Check that the only linked summary consulted was that for [uri].
     expect(resynthesizer.linkedSummariesRequested, hasLength(1));
     expect(resynthesizer.linkedSummariesRequested.first,
-        library.source.uri.toString());
+        expectedLibraryUri.toString());
     // Check that the only unlinked summaries consulted were those for the
     // library in question.
-    Set<String> expectedCompilationUnitUris = library.units
-        .map((CompilationUnitElement unit) => unit.source.uri.toString())
-        .toSet();
+    var expectedUnitUriStrSet =
+        expectedUnitUriList.map((uri) => uri.toString()).toSet();
     for (String requestedUri in resynthesizer.unlinkedSummariesRequested) {
-      expect(expectedCompilationUnitUris, contains(requestedUri));
+      expect(expectedUnitUriStrSet, contains(requestedUri));
     }
   }
-
-  DartSdk createDartSdk() => new MockSdk(resourceProvider: resourceProvider);
-
-  /**
-   * Create the analysis options that should be used for this test.
-   */
-  AnalysisOptionsImpl createOptions() => new AnalysisOptionsImpl();
-
-  @override
-  void setUp() {
-    super.setUp();
-    prepareAnalysisContext(createOptions());
-  }
 }
 
 /// Mixin containing test cases exercising summary resynthesis.  Intended to be
@@ -1922,7 +1911,6 @@
   }
 
   test_const_invalid_field_const() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 class C {
   static const f = 1 + foo();
@@ -1939,7 +1927,6 @@
   }
 
   test_const_invalid_field_final() async {
-    variablesWithNotConstInitializers.add('f');
     var library = await checkLibrary(r'''
 class C {
   final f = 1 + foo();
@@ -1964,7 +1951,6 @@
   }
 
   test_const_invalid_topLevel() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 const v = 1 + foo();
 int foo() => 42;
@@ -2175,7 +2161,6 @@
   }
 
   test_const_invokeConstructor_named_unresolved() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 class C {}
 const V = const C.named();
@@ -2190,7 +2175,6 @@
   }
 
   test_const_invokeConstructor_named_unresolved2() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 const V = const C.named();
 ''', allowErrors: true);
@@ -2202,7 +2186,6 @@
   }
 
   test_const_invokeConstructor_named_unresolved3() async {
-    shouldCompareLibraryElements = false;
     addLibrarySource('/a.dart', r'''
 class C {
 }
@@ -2221,7 +2204,6 @@
   }
 
   test_const_invokeConstructor_named_unresolved4() async {
-    shouldCompareLibraryElements = false;
     addLibrarySource('/a.dart', '');
     var library = await checkLibrary(r'''
 import 'a.dart' as p;
@@ -2237,7 +2219,6 @@
   }
 
   test_const_invokeConstructor_named_unresolved5() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 const V = const p.C.named();
 ''', allowErrors: true);
@@ -2250,7 +2231,6 @@
   }
 
   test_const_invokeConstructor_named_unresolved6() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 class C<T> {}
 const V = const C.named();
@@ -2315,7 +2295,6 @@
   }
 
   test_const_invokeConstructor_unnamed_unresolved() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 const V = const C();
 ''', allowErrors: true);
@@ -2326,7 +2305,6 @@
   }
 
   test_const_invokeConstructor_unnamed_unresolved2() async {
-    shouldCompareLibraryElements = false;
     addLibrarySource('/a.dart', '');
     var library = await checkLibrary(r'''
 import 'a.dart' as p;
@@ -2341,7 +2319,6 @@
   }
 
   test_const_invokeConstructor_unnamed_unresolved3() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 const V = const p.C();
 ''', allowErrors: true);
@@ -2909,7 +2886,6 @@
   }
 
   test_const_reference_unresolved_prefix0() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 const V = foo;
 ''', allowErrors: true);
@@ -2920,7 +2896,6 @@
   }
 
   test_const_reference_unresolved_prefix1() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 class C {}
 const V = C.foo;
@@ -2935,7 +2910,6 @@
   }
 
   test_const_reference_unresolved_prefix2() async {
-    shouldCompareLibraryElements = false;
     addLibrarySource('/foo.dart', '''
 class C {}
 ''');
@@ -3081,7 +3055,6 @@
   }
 
   test_const_topLevel_super() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 const vSuper = super;
 ''');
@@ -3091,7 +3064,6 @@
   }
 
   test_const_topLevel_this() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 const vThis = this;
 ''');
@@ -3101,7 +3073,6 @@
   }
 
   test_const_topLevel_throw() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 const c = throw 42;
 ''');
@@ -3167,7 +3138,6 @@
   }
 
   test_const_topLevel_typedList_typedefArgument() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 typedef int F(String id);
 const v = const <F>[];
@@ -3356,7 +3326,6 @@
   }
 
   test_constructor_initializers_field_notConst() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary('''
 class C {
   final x;
@@ -4237,7 +4206,7 @@
   }
 
   test_export_configurations_useDefault() async {
-    context.declaredVariables =
+    declaredVariables =
         new DeclaredVariables.fromMap({'dart.library.io': 'false'});
     addLibrarySource('/foo.dart', 'class A {}');
     addLibrarySource('/foo_io.dart', 'class A {}');
@@ -4254,7 +4223,7 @@
   }
 
   test_export_configurations_useFirst() async {
-    context.declaredVariables = new DeclaredVariables.fromMap(
+    declaredVariables = new DeclaredVariables.fromMap(
         {'dart.library.io': 'true', 'dart.library.html': 'true'});
     addLibrarySource('/foo.dart', 'class A {}');
     addLibrarySource('/foo_io.dart', 'class A {}');
@@ -4271,7 +4240,7 @@
   }
 
   test_export_configurations_useSecond() async {
-    context.declaredVariables = new DeclaredVariables.fromMap(
+    declaredVariables = new DeclaredVariables.fromMap(
         {'dart.library.io': 'false', 'dart.library.html': 'true'});
     addLibrarySource('/foo.dart', 'class A {}');
     addLibrarySource('/foo_io.dart', 'class A {}');
@@ -4372,7 +4341,7 @@
   }
 
   test_exportImport_configurations_useDefault() async {
-    context.declaredVariables =
+    declaredVariables =
         new DeclaredVariables.fromMap({'dart.library.io': 'false'});
     addLibrarySource('/foo.dart', 'class A {}');
     addLibrarySource('/foo_io.dart', 'class A {}');
@@ -4396,7 +4365,7 @@
   }
 
   test_exportImport_configurations_useFirst() async {
-    context.declaredVariables = new DeclaredVariables.fromMap(
+    declaredVariables = new DeclaredVariables.fromMap(
         {'dart.library.io': 'true', 'dart.library.html': 'true'});
     addLibrarySource('/foo.dart', 'class A {}');
     addLibrarySource('/foo_io.dart', 'class A {}');
@@ -4430,7 +4399,6 @@
   }
 
   test_expr_invalid_typeParameter_asPrefix() async {
-    variablesWithNotConstInitializers.add('f');
     var library = await checkLibrary('''
 class C<T> {
   final f = T.k;
@@ -4886,7 +4854,6 @@
   }
 
   test_genericFunction_asFunctionReturnType() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 int Function(int a, String b) f() => null;
 ''');
@@ -4896,7 +4863,6 @@
   }
 
   test_genericFunction_asFunctionTypedParameterReturnType() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 void f(int Function(int a, String b) p(num c)) => null;
 ''');
@@ -4906,7 +4872,6 @@
   }
 
   test_genericFunction_asGenericFunctionReturnType() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 typedef F = void Function(String a) Function(int b);
 ''');
@@ -4916,7 +4881,6 @@
   }
 
   test_genericFunction_asMethodReturnType() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 class C {
   int Function(int a, String b) m() => null;
@@ -4930,7 +4894,6 @@
   }
 
   test_genericFunction_asParameterType() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 void f(int Function(int a, String b) p) => null;
 ''');
@@ -4940,7 +4903,6 @@
   }
 
   test_genericFunction_asTopLevelVariableType() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 int Function(int a, String b) v;
 ''');
@@ -4949,86 +4911,73 @@
 ''');
   }
 
+  test_getElement_class() async {
+    var resynthesized = _validateGetElement(
+      'class C { m() {} }',
+      ['C'],
+    );
+    expect(resynthesized, isClassElement);
+  }
+
   test_getElement_constructor_named() async {
-    String text = 'class C { C.named(); }';
-    Source source = addLibrarySource('/test.dart', text);
-    ConstructorElement original = context
-        .computeLibraryElement(source)
-        .getType('C')
-        .getNamedConstructor('named');
-    expect(original, isNotNull);
-    ConstructorElement resynthesized = _validateGetElement(text, original);
-    compareConstructorElements(resynthesized, original, 'C.constructor named');
+    var resynthesized = _validateGetElement(
+      'class C { C.named(); }',
+      ['C', 'named'],
+    );
+    expect(resynthesized, isConstructorElement);
   }
 
   test_getElement_constructor_unnamed() async {
-    String text = 'class C { C(); }';
-    Source source = addLibrarySource('/test.dart', text);
-    ConstructorElement original =
-        context.computeLibraryElement(source).getType('C').unnamedConstructor;
-    expect(original, isNotNull);
-    ConstructorElement resynthesized = _validateGetElement(text, original);
-    compareConstructorElements(resynthesized, original, 'C.constructor');
+    var resynthesized = _validateGetElement(
+      'class C { C(); }',
+      ['C', ''],
+    );
+    expect(resynthesized, isConstructorElement);
   }
 
   test_getElement_field() async {
-    String text = 'class C { var f; }';
-    Source source = addLibrarySource('/test.dart', text);
-    FieldElement original =
-        context.computeLibraryElement(source).getType('C').getField('f');
-    expect(original, isNotNull);
-    FieldElement resynthesized = _validateGetElement(text, original);
-    compareFieldElements(resynthesized, original, 'C.field f');
+    var resynthesized = _validateGetElement(
+      'class C { var f; }',
+      ['C', 'f'],
+    );
+    expect(resynthesized, isFieldElement);
   }
 
   test_getElement_getter() async {
-    String text = 'class C { get f => null; }';
-    Source source = addLibrarySource('/test.dart', text);
-    PropertyAccessorElement original =
-        context.computeLibraryElement(source).getType('C').getGetter('f');
-    expect(original, isNotNull);
-    PropertyAccessorElement resynthesized = _validateGetElement(text, original);
-    comparePropertyAccessorElements(resynthesized, original, 'C.getter f');
+    var resynthesized = _validateGetElement(
+      'class C { get f => null; }',
+      ['C', 'f?'],
+    );
+    expect(resynthesized, isPropertyAccessorElement);
   }
 
   test_getElement_method() async {
-    String text = 'class C { f() {} }';
-    Source source = addLibrarySource('/test.dart', text);
-    MethodElement original =
-        context.computeLibraryElement(source).getType('C').getMethod('f');
-    expect(original, isNotNull);
-    MethodElement resynthesized = _validateGetElement(text, original);
-    compareMethodElements(resynthesized, original, 'C.method f');
+    var resynthesized = _validateGetElement(
+      'class C { m() {} }',
+      ['C', 'm'],
+    );
+    expect(resynthesized, isMethodElement);
   }
 
   test_getElement_operator() async {
-    String text = 'class C { operator+(x) => null; }';
-    Source source = addLibrarySource('/test.dart', text);
-    MethodElement original =
-        context.computeLibraryElement(source).getType('C').getMethod('+');
-    expect(original, isNotNull);
-    MethodElement resynthesized = _validateGetElement(text, original);
-    compareMethodElements(resynthesized, original, 'C.operator+');
+    var resynthesized = _validateGetElement(
+      'class C { operator+(x) => null; }',
+      ['C', '+'],
+    );
+    expect(resynthesized, isMethodElement);
   }
 
   test_getElement_setter() async {
-    String text = 'class C { void set f(value) {} }';
-    Source source = addLibrarySource('/test.dart', text);
-    PropertyAccessorElement original =
-        context.computeLibraryElement(source).getType('C').getSetter('f');
-    expect(original, isNotNull);
-    PropertyAccessorElement resynthesized = _validateGetElement(text, original);
-    comparePropertyAccessorElements(resynthesized, original, 'C.setter f');
+    var resynthesized = _validateGetElement(
+      'class C { void set f(value) {} }',
+      ['C', 'f='],
+    );
+    expect(resynthesized, isPropertyAccessorElement);
   }
 
   test_getElement_unit() async {
-    String text = 'class C { f() {} }';
-    Source source = addLibrarySource('/test.dart', text);
-    CompilationUnitElement original =
-        context.computeLibraryElement(source).definingCompilationUnit;
-    expect(original, isNotNull);
-    CompilationUnitElement resynthesized = _validateGetElement(text, original);
-    compareCompilationUnitElements(resynthesized, original);
+    var resynthesized = _validateGetElement('class C {}', []);
+    expect(resynthesized, isCompilationUnitElement);
   }
 
   test_getter_documented() async {
@@ -5106,8 +5055,9 @@
   }
 
   test_import_configurations_useDefault() async {
-    context.declaredVariables =
-        new DeclaredVariables.fromMap({'dart.library.io': 'false'});
+    declaredVariables = new DeclaredVariables.fromMap({
+      'dart.library.io': 'false',
+    });
     addLibrarySource('/foo.dart', 'class A {}');
     addLibrarySource('/foo_io.dart', 'class A {}');
     addLibrarySource('/foo_html.dart', 'class A {}');
@@ -5128,8 +5078,10 @@
   }
 
   test_import_configurations_useFirst() async {
-    context.declaredVariables = new DeclaredVariables.fromMap(
-        {'dart.library.io': 'true', 'dart.library.html': 'true'});
+    declaredVariables = new DeclaredVariables.fromMap({
+      'dart.library.io': 'true',
+      'dart.library.html': 'true',
+    });
     addLibrarySource('/foo.dart', 'class A {}');
     addLibrarySource('/foo_io.dart', 'class A {}');
     addLibrarySource('/foo_html.dart', 'class A {}');
@@ -5196,7 +5148,6 @@
 
   test_import_invalidUri_metadata() async {
     allowMissingFiles = true;
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary('''
 @foo
 import '';
@@ -5690,7 +5641,6 @@
   }
 
   test_inferredType_implicitCreation() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 class A {
   A();
@@ -5710,7 +5660,6 @@
   }
 
   test_inferredType_implicitCreation_prefixed() async {
-    shouldCompareLibraryElements = false;
     addLibrarySource('/foo.dart', '''
 class A {
   A();
@@ -5732,7 +5681,6 @@
   test_inferredType_usesSyntheticFunctionType_functionTypedParam() async {
     // AnalysisContext does not set the enclosing element for the synthetic
     // FunctionElement created for the [f, g] type argument.
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary('''
 int f(int x(String y)) => null;
 String g(int x(String y)) => null;
@@ -5939,7 +5887,6 @@
   }
 
   test_invalid_annotation_prefixed_constructor() async {
-    shouldCompareLibraryElements = false;
     addLibrarySource('/a.dart', r'''
 class C {
   const C.named();
@@ -5962,7 +5909,6 @@
   }
 
   test_invalid_annotation_unprefixed_constructor() async {
-    shouldCompareLibraryElements = false;
     addLibrarySource('/a.dart', r'''
 class C {
   const C.named();
@@ -5999,8 +5945,6 @@
   }
 
   test_invalid_nameConflict_imported() async {
-    shouldCompareLibraryElements = false;
-    namesThatCannotBeResolved.add('V');
     addLibrarySource('/a.dart', 'V() {}');
     addLibrarySource('/b.dart', 'V() {}');
     var library = await checkLibrary('''
@@ -6017,8 +5961,6 @@
   }
 
   test_invalid_nameConflict_imported_exported() async {
-    shouldCompareLibraryElements = false;
-    namesThatCannotBeResolved.add('V');
     addLibrarySource('/a.dart', 'V() {}');
     addLibrarySource('/b.dart', 'V() {}');
     addLibrarySource('/c.dart', r'''
@@ -6037,8 +5979,6 @@
   }
 
   test_invalid_nameConflict_local() async {
-    shouldCompareLibraryElements = false;
-    namesThatCannotBeResolved.add('V');
     var library = await checkLibrary('''
 foo([p = V]) {}
 V() {}
@@ -6082,7 +6022,6 @@
 
   test_invalidUri_part_emptyUri() async {
     allowMissingFiles = true;
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 part '';
 class B extends A {}
@@ -6099,7 +6038,6 @@
 
   test_invalidUris() async {
     allowMissingFiles = true;
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 import ':[invaliduri]';
 import ':[invaliduri]:foo.dart';
@@ -6725,7 +6663,6 @@
   }
 
   test_metadata_invalid_classDeclaration() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary('f(_) {} @f(42) class C {}');
     checkElementText(library, r'''
 @
@@ -7048,7 +6985,6 @@
   }
 
   test_nameConflict_exportedAndLocal() async {
-    namesThatCannotBeResolved.add('V');
     addLibrarySource('/a.dart', 'class C {}');
     addLibrarySource('/c.dart', '''
 export 'a.dart';
@@ -7065,7 +7001,6 @@
   }
 
   test_nameConflict_exportedAndLocal_exported() async {
-    namesThatCannotBeResolved.add('V');
     addLibrarySource('/a.dart', 'class C {}');
     addLibrarySource('/c.dart', '''
 export 'a.dart';
@@ -7083,7 +7018,6 @@
   }
 
   test_nameConflict_exportedAndParted() async {
-    namesThatCannotBeResolved.add('V');
     addLibrarySource('/a.dart', 'class C {}');
     addLibrarySource('/b.dart', '''
 part of lib;
@@ -7438,7 +7372,6 @@
 
   test_parts_invalidUri() async {
     allowMissingFiles = true;
-    shouldCompareLibraryElements = false;
     addSource('/foo/bar.dart', 'part of my.lib;');
     var library = await checkLibrary('library my.lib; part "foo/";');
     checkElementText(library, r'''
@@ -7452,7 +7385,6 @@
 
   test_parts_invalidUri_nullStringValue() async {
     allowMissingFiles = true;
-    shouldCompareLibraryElements = false;
     addSource('/foo/bar.dart', 'part of my.lib;');
     var library = await checkLibrary(r'''
 library my.lib;
@@ -8149,7 +8081,6 @@
   }
 
   test_typedef_generic_asFieldType() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
 typedef Foo<S> = S Function<T>(T x);
 class A {
@@ -8259,7 +8190,6 @@
   }
 
   test_typedef_type_parameters_bound_recursive() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary('typedef void F<T extends F>();');
     // Typedefs cannot reference themselves.
     checkElementText(library, r'''
@@ -8268,7 +8198,6 @@
   }
 
   test_typedef_type_parameters_bound_recursive2() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary('typedef void F<T extends List<F>>();');
     // Typedefs cannot reference themselves.
     checkElementText(library, r'''
@@ -8329,7 +8258,6 @@
   }
 
   test_unresolved_annotation_instanceCreation_argument_this() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary('''
 class A {
   const A(_);
@@ -8350,7 +8278,6 @@
   }
 
   test_unresolved_annotation_namedConstructorCall_noClass() async {
-    shouldCompareLibraryElements = false;
     var library =
         await checkLibrary('@foo.bar() class C {}', allowErrors: true);
     checkElementText(library, r'''
@@ -8363,7 +8290,6 @@
   }
 
   test_unresolved_annotation_namedConstructorCall_noConstructor() async {
-    shouldCompareLibraryElements = false;
     var library =
         await checkLibrary('@String.foo() class C {}', allowErrors: true);
     checkElementText(library, r'''
@@ -8376,7 +8302,6 @@
   }
 
   test_unresolved_annotation_prefixedIdentifier_badPrefix() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary('@foo.bar class C {}', allowErrors: true);
     checkElementText(library, r'''
 @
@@ -8388,7 +8313,6 @@
   }
 
   test_unresolved_annotation_prefixedIdentifier_noDeclaration() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(
         'import "dart:async" as foo; @foo.bar class C {}',
         allowErrors: true);
@@ -8403,7 +8327,6 @@
   }
 
   test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix() async {
-    shouldCompareLibraryElements = false;
     var library =
         await checkLibrary('@foo.bar.baz() class C {}', allowErrors: true);
     checkElementText(library, r'''
@@ -8417,7 +8340,6 @@
   }
 
   test_unresolved_annotation_prefixedNamedConstructorCall_noClass() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(
         'import "dart:async" as foo; @foo.bar.baz() class C {}',
         allowErrors: true);
@@ -8433,7 +8355,6 @@
   }
 
   test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(
         'import "dart:async" as foo; @foo.Future.bar() class C {}',
         allowErrors: true);
@@ -8449,7 +8370,6 @@
   }
 
   test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix() async {
-    shouldCompareLibraryElements = false;
     var library =
         await checkLibrary('@foo.bar() class C {}', allowErrors: true);
     checkElementText(library, r'''
@@ -8462,7 +8382,6 @@
   }
 
   test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary(
         'import "dart:async" as foo; @foo.bar() class C {}',
         allowErrors: true);
@@ -8477,7 +8396,6 @@
   }
 
   test_unresolved_annotation_simpleIdentifier() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary('@foo class C {}', allowErrors: true);
     checkElementText(library, r'''
 @
@@ -8488,7 +8406,6 @@
   }
 
   test_unresolved_annotation_unnamedConstructorCall_noClass() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary('@foo() class C {}', allowErrors: true);
     checkElementText(library, r'''
 @
@@ -8530,7 +8447,6 @@
   }
 
   test_unused_type_parameter() async {
-    shouldCompareLibraryElements = false;
     var library = await checkLibrary('''
 class C<T> {
   void f() {}
@@ -8770,15 +8686,22 @@
   }
 
   /**
-   * Encode the library containing [original] into a summary and then use
-   * [TestSummaryResynthesizer.getElement] to retrieve just the original
-   * element from the resynthesized summary.
+   * Encode the library [text] into a summary and then use
+   * [TestSummaryResynthesizer.getElement] to retrieve just the element with
+   * the specified [names] from the resynthesized summary.
    */
-  Element _validateGetElement(String text, Element original) {
-    SummaryResynthesizer resynthesizer = encodeLibrary(original.library.source);
-    ElementLocationImpl location = original.location;
+  Element _validateGetElement(String text, List<String> names) {
+    Source source = addTestSource(text);
+    SummaryResynthesizer resynthesizer = encodeLibrary(source);
+
+    var locationComponents = [
+      source.uri.toString(),
+      source.uri.toString(),
+    ]..addAll(names);
+    var location = ElementLocationImpl.con3(locationComponents);
+
     Element result = resynthesizer.getElement(location);
-    checkMinimalResynthesisWork(resynthesizer, original.library);
+    checkMinimalResynthesisWork(resynthesizer, source.uri, [source.uri]);
     // Check that no other summaries needed to be resynthesized to resynthesize
     // the library element.
     expect(resynthesizer.resynthesisCount, 3);
@@ -8790,1250 +8713,12 @@
 /// Mixin containing helper methods for testing summary resynthesis.  Intended
 /// to be applied to a class implementing [ResynthesizeTestStrategy].
 mixin ResynthesizeTestHelpers implements ResynthesizeTestStrategy {
-  /**
-   * Names of variables which have initializers that are not valid constants,
-   * so they are not resynthesized.
-   */
-  final variablesWithNotConstInitializers = Set<String>();
-
-  /**
-   * Tests may set this to `false` to indicate that resynthesized elements
-   * should not be compare with elements created using AnalysisContext.
-   */
-  bool shouldCompareLibraryElements = true;
-
-  /**
-   * Names that cannot be resolved, e.g. because of duplicate declaration.
-   */
-  final namesThatCannotBeResolved = Set<String>();
-
-  /**
-   * Verify that the given prefix is safe to elide from a resynthesized AST.
-   */
-  void checkElidablePrefix(SimpleIdentifier prefix) {
-    if (prefix.staticElement is! PrefixElement &&
-        prefix.staticElement is! ClassElement) {
-      fail('Prefix of type ${prefix.staticElement.runtimeType}'
-          ' should not have been elided');
-    }
-  }
-
   Future<LibraryElementImpl> checkLibrary(String text,
       {bool allowErrors: false, bool dumpSummaries: false}) async {
     Source source = addTestSource(text);
-    LibraryElementImpl resynthesized = _encodeDecodeLibraryElement(source);
-    LibraryElementImpl original = context.computeLibraryElement(source);
-    if (!allowErrors) {
-      List<AnalysisError> errors = context.computeErrors(source);
-      if (errors.where((e) => e.message.startsWith('unused')).isNotEmpty) {
-        fail('Analysis errors: $errors');
-      }
-    }
-    if (shouldCompareLibraryElements) {
-      checkLibraryElements(original, resynthesized);
-    }
-    return resynthesized;
-  }
-
-  void checkLibraryElements(
-      LibraryElementImpl original, LibraryElementImpl resynthesized) {
-    compareElements(resynthesized, original, '(library)');
-    expect(resynthesized.displayName, original.displayName);
-    expect(original.enclosingElement, isNull);
-    expect(resynthesized.enclosingElement, isNull);
-    expect(resynthesized.hasExtUri, original.hasExtUri);
-    compareCompilationUnitElements(resynthesized.definingCompilationUnit,
-        original.definingCompilationUnit);
-    expect(resynthesized.parts.length, original.parts.length, reason: 'parts');
-    for (int i = 0; i < resynthesized.parts.length; i++) {
-      compareCompilationUnitElements(resynthesized.parts[i], original.parts[i]);
-    }
-    expect(resynthesized.imports.length, original.imports.length,
-        reason: 'imports');
-    for (int i = 0; i < resynthesized.imports.length; i++) {
-      ImportElement originalImport = original.imports[i];
-      compareImportElements(
-          resynthesized.imports[i], originalImport, originalImport.toString());
-    }
-    expect(resynthesized.exports.length, original.exports.length,
-        reason: 'exports');
-    for (int i = 0; i < resynthesized.exports.length; i++) {
-      ExportElement originalExport = original.exports[i];
-      compareExportElements(
-          resynthesized.exports[i], originalExport, originalExport.toString());
-    }
-    expect(resynthesized.nameLength, original.nameLength);
-    compareNamespaces(resynthesized.publicNamespace, original.publicNamespace,
-        '(public namespace)');
-    compareNamespaces(resynthesized.exportNamespace, original.exportNamespace,
-        '(export namespace)');
-    if (original.entryPoint == null) {
-      expect(resynthesized.entryPoint, isNull);
-    } else {
-      expect(resynthesized.entryPoint, isNotNull);
-      compareFunctionElements(
-          resynthesized.entryPoint, original.entryPoint, '(entry point)');
-    }
-    // The libraries `dart:core` and `dart:async` cannot create their
-    // `loadLibrary` functions until after both are created.
-    if (original.name != 'dart.core' && original.name != 'dart.async') {
-      compareExecutableElements(
-          resynthesized.loadLibraryFunction as ExecutableElementImpl,
-          original.loadLibraryFunction as ExecutableElementImpl,
-          '(loadLibraryFunction)');
-    }
-    expect(resynthesized.libraryCycle.toSet(), original.libraryCycle.toSet());
-  }
-
-  void checkPossibleLocalElements(Element resynthesized, Element original) {
-    if (original is! LocalElement && resynthesized is! LocalElement) {
-      return;
-    }
-    if (original is LocalElement && resynthesized is LocalElement) {
-      expect(resynthesized.visibleRange, original.visibleRange);
-    } else {
-      fail('Incompatible local elements '
-          '${resynthesized.runtimeType} vs. ${original.runtimeType}');
-    }
-  }
-
-  void checkPossibleMember(
-      Element resynthesized, Element original, String desc) {
-    Element resynthesizedNonHandle = resynthesized is ElementHandle
-        ? resynthesized.actualElement
-        : resynthesized;
-    if (original is Member) {
-      expect(resynthesizedNonHandle, new TypeMatcher<Member>(), reason: desc);
-      if (resynthesizedNonHandle is Member) {
-        List<DartType> resynthesizedTypeArguments =
-            resynthesizedNonHandle.definingType.typeArguments;
-        List<DartType> originalTypeArguments =
-            original.definingType.typeArguments;
-        expect(
-            resynthesizedTypeArguments, hasLength(originalTypeArguments.length),
-            reason: desc);
-        for (int i = 0; i < originalTypeArguments.length; i++) {
-          compareTypeImpls(resynthesizedTypeArguments[i],
-              originalTypeArguments[i], '$desc type argument $i');
-        }
-      }
-    } else {
-      expect(
-          resynthesizedNonHandle, isNot(new TypeMatcher<ConstructorMember>()),
-          reason: desc);
-    }
-  }
-
-  void compareClassElements(ClassElement r, ClassElement o, String desc) {
-    compareElements(r, o, desc);
-    expect(r.fields.length, o.fields.length, reason: '$desc fields.length');
-    for (int i = 0; i < r.fields.length; i++) {
-      String name = o.fields[i].name;
-      compareFieldElements(r.fields[i], o.fields[i], '$desc.field $name');
-    }
-    compareTypes(r.supertype, o.supertype, '$desc supertype');
-    expect(r.interfaces.length, o.interfaces.length,
-        reason: '$desc interfaces.length');
-    for (int i = 0; i < r.interfaces.length; i++) {
-      compareTypes(r.interfaces[i], o.interfaces[i],
-          '$desc interface ${o.interfaces[i].name}');
-    }
-    expect(r.mixins.length, o.mixins.length, reason: '$desc mixins.length');
-    for (int i = 0; i < r.mixins.length; i++) {
-      compareTypes(r.mixins[i], o.mixins[i], '$desc mixin ${o.mixins[i].name}');
-    }
-    expect(r.typeParameters.length, o.typeParameters.length,
-        reason: '$desc typeParameters.length');
-    for (int i = 0; i < r.typeParameters.length; i++) {
-      compareTypeParameterElements(r.typeParameters[i], o.typeParameters[i],
-          '$desc type parameter ${o.typeParameters[i].name}');
-    }
-    expect(r.constructors.length, o.constructors.length,
-        reason: '$desc constructors.length');
-    for (int i = 0; i < r.constructors.length; i++) {
-      compareConstructorElements(r.constructors[i], o.constructors[i],
-          '$desc constructor ${o.constructors[i].name}');
-    }
-    expect(r.accessors.length, o.accessors.length,
-        reason: '$desc accessors.length');
-    List<PropertyAccessorElement> rAccessors = _getSortedPropertyAccessors(r);
-    List<PropertyAccessorElement> oAccessors = _getSortedPropertyAccessors(o);
-    for (int i = 0; i < r.accessors.length; i++) {
-      comparePropertyAccessorElements(
-          rAccessors[i], oAccessors[i], '$desc accessor ${oAccessors[i].name}');
-    }
-    expect(r.methods.length, o.methods.length, reason: '$desc methods.length');
-    for (int i = 0; i < r.methods.length; i++) {
-      compareMethodElements(
-          r.methods[i], o.methods[i], '$desc.${o.methods[i].name}');
-    }
-    compareTypes(r.type, o.type, desc);
-    if (r is ClassElementImpl && o is ClassElementImpl) {
-      expect(r.hasBeenInferred, o.hasBeenInferred, reason: desc);
-    }
-  }
-
-  void compareCompilationUnitElements(CompilationUnitElementImpl resynthesized,
-      CompilationUnitElementImpl original) {
-    String desc = 'Compilation unit ${original.source.uri}';
-    expect(resynthesized.source, original.source);
-    expect(resynthesized.librarySource, original.librarySource);
-    compareLineInfo(resynthesized.lineInfo, original.lineInfo);
-
-    expect(resynthesized.types.length, original.types.length,
-        reason: '$desc.types.length');
-    for (int i = 0; i < resynthesized.types.length; i++) {
-      compareClassElements(
-          resynthesized.types[i], original.types[i], original.types[i].name);
-    }
-
-    // TODO(scheglov) Uncomment once the tasks based implementation is ready.
-//    expect(resynthesized.mixins.length, original.mixins.length,
-//        reason: '$desc.mixins.length');
-//    for (int i = 0; i < resynthesized.mixins.length; i++) {
-//      compareClassElements(
-//          resynthesized.mixins[i], original.mixins[i], original.mixins[i].name);
-//    }
-
-    expect(resynthesized.topLevelVariables.length,
-        original.topLevelVariables.length,
-        reason: '$desc.topLevelVariables.length');
-    for (int i = 0; i < resynthesized.topLevelVariables.length; i++) {
-      String name = resynthesized.topLevelVariables[i].name;
-      compareTopLevelVariableElements(
-          resynthesized.topLevelVariables[i],
-          original.topLevelVariables
-              .singleWhere((TopLevelVariableElement e) => e.name == name),
-          '$desc.topLevelVariables[$name]');
-    }
-    expect(resynthesized.functions.length, original.functions.length,
-        reason: '$desc.functions.length');
-    for (int i = 0; i < resynthesized.functions.length; i++) {
-      compareFunctionElements(resynthesized.functions[i], original.functions[i],
-          '$desc.functions[$i] /* ${original.functions[i].name} */');
-    }
-    expect(resynthesized.functionTypeAliases.length,
-        original.functionTypeAliases.length,
-        reason: '$desc.functionTypeAliases.length');
-    for (int i = 0; i < resynthesized.functionTypeAliases.length; i++) {
-      compareFunctionTypeAliasElements(
-          resynthesized.functionTypeAliases[i],
-          original.functionTypeAliases[i],
-          original.functionTypeAliases[i].name);
-    }
-    expect(resynthesized.enums.length, original.enums.length,
-        reason: '$desc.enums.length');
-    for (int i = 0; i < resynthesized.enums.length; i++) {
-      compareClassElements(
-          resynthesized.enums[i], original.enums[i], original.enums[i].name);
-    }
-    expect(resynthesized.accessors.length, original.accessors.length,
-        reason: '$desc.accessors.length');
-    for (int i = 0; i < resynthesized.accessors.length; i++) {
-      String name = resynthesized.accessors[i].name;
-      if (original.accessors[i].isGetter) {
-        comparePropertyAccessorElements(
-            resynthesized.accessors[i],
-            original.accessors
-                .singleWhere((PropertyAccessorElement e) => e.name == name),
-            '$desc.accessors[$i] /* getter $name */');
-      } else {
-        comparePropertyAccessorElements(
-            resynthesized.accessors[i],
-            original.accessors
-                .singleWhere((PropertyAccessorElement e) => e.name == name),
-            '$desc.accessors[$i] /* setter $name */');
-      }
-    }
-    // Note: no need to test CompilationUnitElementImpl._offsetToElementMap
-    // since it is built on demand when needed (see
-    // CompilationUnitElementImpl.getElementAt])
-  }
-
-  void compareConstAstLists(
-      List<Object> rItems, List<Object> oItems, String desc) {
-    if (rItems == null && oItems == null) {
-      return;
-    }
-    expect(rItems != null && oItems != null, isTrue);
-    expect(rItems, hasLength(oItems.length));
-    for (int i = 0; i < oItems.length; i++) {
-      Object rItem = rItems[i];
-      Object oItem = oItems[i];
-      if (rItem is Expression && oItem is Expression) {
-        compareConstAsts(rItem, oItem, desc);
-      } else if (rItem is TypeName && oItem is TypeName) {
-        compareConstAsts(rItem.name, oItem.name, desc);
-      } else if (rItem is InterpolationString && oItem is InterpolationString) {
-        expect(rItem.value, oItem.value);
-      } else if (rItem is InterpolationExpression &&
-          oItem is InterpolationExpression) {
-        compareConstAsts(rItem.expression, oItem.expression, desc);
-      } else if (rItem is MapLiteralEntry && oItem is MapLiteralEntry) {
-        compareConstAsts(rItem.key, oItem.key, desc);
-        compareConstAsts(rItem.value, oItem.value, desc);
-      } else if (oItem is ConstructorFieldInitializer &&
-          rItem is ConstructorFieldInitializer) {
-        compareConstAsts(rItem.fieldName, oItem.fieldName, desc);
-        if (variablesWithNotConstInitializers.contains(rItem.fieldName.name)) {
-          expect(rItem.expression, isNull, reason: desc);
-        } else {
-          compareConstAsts(rItem.expression, oItem.expression, desc);
-        }
-      } else if (oItem is AssertInitializer && rItem is AssertInitializer) {
-        compareConstAsts(rItem.condition, oItem.condition, '$desc condition');
-        compareConstAsts(rItem.message, oItem.message, '$desc message');
-      } else if (oItem is SuperConstructorInvocation &&
-          rItem is SuperConstructorInvocation) {
-        compareElements(rItem.staticElement, oItem.staticElement, desc);
-        compareConstAsts(rItem.constructorName, oItem.constructorName, desc);
-        compareConstAstLists(
-            rItem.argumentList.arguments, oItem.argumentList.arguments, desc);
-      } else if (oItem is RedirectingConstructorInvocation &&
-          rItem is RedirectingConstructorInvocation) {
-        compareElements(rItem.staticElement, oItem.staticElement, desc);
-        compareConstAsts(rItem.constructorName, oItem.constructorName, desc);
-        compareConstAstLists(
-            rItem.argumentList.arguments, oItem.argumentList.arguments, desc);
-      } else {
-        fail('$desc Incompatible item types: '
-            '${rItem.runtimeType} vs. ${oItem.runtimeType}');
-      }
-    }
-  }
-
-  void compareConstAsts(AstNode r, AstNode o, String desc) {
-    if (o == null) {
-      expect(r, isNull, reason: desc);
-    } else {
-      expect(r, isNotNull, reason: desc);
-      // ConstantAstCloner does not copy static types, and constant values
-      // computer does not use static types. So, we don't set them during
-      // resynthesis and should not check them here.
-      if (o is ParenthesizedExpression) {
-        // We don't resynthesize parenthesis, so just ignore it.
-        compareConstAsts(r, o.expression, desc);
-      } else if (o is SimpleIdentifier && r is SimpleIdentifier) {
-        expect(r.name, o.name, reason: desc);
-        if (namesThatCannotBeResolved.contains(r.name)) {
-          expect(r.staticElement, isNull);
-        } else {
-          compareElements(r.staticElement, o.staticElement, desc);
-        }
-      } else if (o is PrefixedIdentifier && r is SimpleIdentifier) {
-        // We don't resynthesize prefixed identifiers when the prefix refers to
-        // a PrefixElement or a ClassElement.  We use simple identifiers with
-        // correct elements.
-        if (o.prefix.staticElement is PrefixElement ||
-            o.prefix.staticElement is ClassElement) {
-          compareConstAsts(r, o.identifier, desc);
-        } else {
-          fail('Prefix of type ${o.prefix.staticElement.runtimeType} should not'
-              ' have been elided');
-        }
-      } else if (o is SimpleIdentifier && r is PrefixedIdentifier) {
-        // In 'class C {static const a = 0; static const b = a;}' the reference
-        // to 'a' in 'b' is serialized as a fully qualified 'C.a' reference.
-        if (r.prefix.staticElement is ClassElement) {
-          Element oElement = resolutionMap.staticElementForIdentifier(o);
-          compareElements(
-              r.prefix.staticElement, oElement?.enclosingElement, desc);
-          compareConstAsts(r.identifier, o, desc);
-        } else {
-          fail('Prefix of type ${r.prefix.staticElement.runtimeType} should not'
-              ' have been elided');
-        }
-      } else if (o is PropertyAccess &&
-          o.target is PrefixedIdentifier &&
-          r is PrefixedIdentifier) {
-        // We don't resynthesize prefixed identifiers when the prefix refers to
-        // a PrefixElement or a ClassElement.  Which means that if the original
-        // expression was e.g. `prefix.topLevelVariableName.length`, it will get
-        // resynthesized as `topLevelVariableName.length`
-        PrefixedIdentifier oTarget = o.target;
-        checkElidablePrefix(oTarget.prefix);
-        compareConstAsts(
-            r,
-            AstTestFactory.identifier(oTarget.identifier, o.propertyName),
-            desc);
-      } else if (o is PrefixedIdentifier && r is PrefixedIdentifier) {
-        compareConstAsts(r.prefix, o.prefix, desc);
-        compareConstAsts(r.identifier, o.identifier, desc);
-      } else if (o is PropertyAccess && r is PropertyAccess) {
-        compareConstAsts(r.target, o.target, desc);
-        String oName = o.propertyName.name;
-        String rName = r.propertyName.name;
-        expect(rName, oName, reason: desc);
-        if (oName == 'length') {
-          compareElements(
-              r.propertyName.staticElement, o.propertyName.staticElement, desc);
-        }
-      } else if (o is PropertyAccess &&
-          o.target is PrefixedIdentifier &&
-          r is SimpleIdentifier) {
-        // We don't resynthesize property access when it takes the form
-        // `prefixName.className.staticMember`.  We just resynthesize a
-        // SimpleIdentifier correctly resolved to the static member.
-        PrefixedIdentifier oTarget = o.target;
-        checkElidablePrefix(oTarget.prefix);
-        checkElidablePrefix(oTarget.identifier);
-        compareConstAsts(r, o.propertyName, desc);
-      } else if (o is SuperExpression && r is SuperExpression) {
-        // Nothing to compare.
-      } else if (o is ThisExpression && r is ThisExpression) {
-        // Nothing to compare.
-      } else if (o is NullLiteral) {
-        expect(r, new TypeMatcher<NullLiteral>(), reason: desc);
-      } else if (o is BooleanLiteral && r is BooleanLiteral) {
-        expect(r.value, o.value, reason: desc);
-      } else if (o is IntegerLiteral && r is IntegerLiteral) {
-        expect(r.value ?? 0, o.value ?? 0, reason: desc);
-      } else if (o is IntegerLiteral && r is PrefixExpression) {
-        expect(r.operator.type, TokenType.MINUS);
-        IntegerLiteral ri = r.operand;
-        expect(-ri.value, o.value, reason: desc);
-      } else if (o is DoubleLiteral && r is DoubleLiteral) {
-        if (r.value != null &&
-            r.value.isNaN &&
-            o.value != null &&
-            o.value.isNaN) {
-          // NaN is not comparable.
-        } else {
-          expect(r.value, o.value, reason: desc);
-        }
-      } else if (o is StringInterpolation && r is StringInterpolation) {
-        compareConstAstLists(r.elements, o.elements, desc);
-      } else if (o is StringLiteral && r is StringLiteral) {
-        // We don't keep all the tokens of AdjacentStrings.
-        // So, we can compare only their values.
-        expect(r.stringValue, o.stringValue, reason: desc);
-      } else if (o is SymbolLiteral && r is SymbolLiteral) {
-        // We don't keep all the tokens of symbol literals.
-        // So, we can compare only their values.
-        expect(r.components.map((t) => t.lexeme).join('.'),
-            o.components.map((t) => t.lexeme).join('.'),
-            reason: desc);
-      } else if (o is NamedExpression && r is NamedExpression) {
-        expect(r.name.label.name, o.name.label.name, reason: desc);
-        compareConstAsts(r.expression, o.expression, desc);
-      } else if (o is BinaryExpression && r is BinaryExpression) {
-        expect(r.operator.lexeme, o.operator.lexeme, reason: desc);
-        compareConstAsts(r.leftOperand, o.leftOperand, desc);
-        compareConstAsts(r.rightOperand, o.rightOperand, desc);
-      } else if (o is PrefixExpression && r is PrefixExpression) {
-        expect(r.operator.lexeme, o.operator.lexeme, reason: desc);
-        compareConstAsts(r.operand, o.operand, desc);
-      } else if (o is ConditionalExpression && r is ConditionalExpression) {
-        compareConstAsts(r.condition, o.condition, desc);
-        compareConstAsts(r.thenExpression, o.thenExpression, desc);
-        compareConstAsts(r.elseExpression, o.elseExpression, desc);
-      } else if (o is ListLiteral && r is ListLiteral) {
-        compareConstAstLists(
-            r.typeArguments?.arguments, o.typeArguments?.arguments, desc);
-        compareConstAstLists(r.elements, o.elements, desc);
-      } else if (o is MapLiteral && r is MapLiteral) {
-        compareConstAstLists(
-            r.typeArguments?.arguments, o.typeArguments?.arguments, desc);
-        compareConstAstLists(r.entries, o.entries, desc);
-      } else if (o is MethodInvocation && r is MethodInvocation) {
-        compareConstAsts(r.target, o.target, desc);
-        compareConstAsts(r.methodName, o.methodName, desc);
-        compareConstAstLists(
-            r.typeArguments?.arguments, o.typeArguments?.arguments, desc);
-        compareConstAstLists(
-            r.argumentList?.arguments, o.argumentList?.arguments, desc);
-      } else if (o is InstanceCreationExpression &&
-          r is InstanceCreationExpression) {
-        compareElements(r.staticElement, o.staticElement, desc);
-        ConstructorName oConstructor = o.constructorName;
-        ConstructorName rConstructor = r.constructorName;
-        expect(oConstructor, isNotNull, reason: desc);
-        expect(rConstructor, isNotNull, reason: desc);
-        // Note: just compare rConstructor.staticElement and
-        // oConstructor.staticElement as elements, because we just want to
-        // check that they're pointing to the correct elements; we don't want
-        // to check that their constructor initializers match, because that
-        // could lead to infinite regress.
-        compareElements(
-            rConstructor.staticElement, oConstructor.staticElement, desc);
-        TypeName oType = oConstructor.type;
-        TypeName rType = rConstructor.type;
-        expect(oType, isNotNull, reason: desc);
-        expect(rType, isNotNull, reason: desc);
-        compareConstAsts(rType.name, oType.name, desc);
-        compareConstAsts(rConstructor.name, oConstructor.name, desc);
-        // In strong mode type inference is performed, so that
-        // `C<int> v = new C();` is serialized as `C<int> v = new C<int>();`.
-        // So, if there are not type arguments originally, not need to check.
-        if (oType.typeArguments?.arguments?.isNotEmpty ?? false) {
-          compareConstAstLists(rType.typeArguments?.arguments,
-              oType.typeArguments?.arguments, desc);
-        }
-        compareConstAstLists(
-            r.argumentList.arguments, o.argumentList.arguments, desc);
-      } else if (o is AnnotationImpl && r is AnnotationImpl) {
-        expect(o.atSign.lexeme, r.atSign.lexeme, reason: desc);
-        Identifier rName = r.name;
-        Identifier oName = o.name;
-        if (oName is PrefixedIdentifier &&
-            rName is PrefixedIdentifier &&
-            o.constructorName != null &&
-            o.element != null &&
-            r.constructorName == null) {
-          // E.g. `@prefix.cls.ctor`.  This sometimes gets resynthesized as
-          // `@cls.ctor`, with `cls.ctor` represented as a PrefixedIdentifier.
-          compareConstAsts(rName.prefix, oName.identifier, desc);
-          expect(rName.period.lexeme, '.', reason: desc);
-          compareConstAsts(rName.identifier, o.constructorName, desc);
-          expect(r.period, isNull, reason: desc);
-          expect(r.constructorName, isNull, reason: desc);
-        } else {
-          compareConstAsts(r.name, o.name, desc);
-          expect(r.period?.lexeme, o.period?.lexeme, reason: desc);
-          compareConstAsts(r.constructorName, o.constructorName, desc);
-        }
-        compareConstAstLists(
-            r.arguments?.arguments, o.arguments?.arguments, desc);
-        compareElements(r.element, o.element, desc);
-        // elementAnnotation should be null; it is only used in the full AST.
-        expect(o.elementAnnotation, isNull);
-        expect(r.elementAnnotation, isNull);
-      } else {
-        fail('Not implemented for ${r.runtimeType} vs. ${o.runtimeType}');
-      }
-    }
-  }
-
-  void compareConstructorElements(ConstructorElement resynthesized,
-      ConstructorElement original, String desc) {
-    if (original == null && resynthesized == null) {
-      return;
-    }
-    compareExecutableElements(resynthesized, original, desc);
-    ConstructorElementImpl resynthesizedImpl =
-        getActualElement(resynthesized, desc);
-    ConstructorElementImpl originalImpl = getActualElement(original, desc);
-    if (original.isConst) {
-      compareConstAstLists(resynthesizedImpl.constantInitializers,
-          originalImpl.constantInitializers, desc);
-    }
-    if (original.redirectedConstructor == null) {
-      expect(resynthesized.redirectedConstructor, isNull, reason: desc);
-    } else {
-      compareConstructorElements(resynthesized.redirectedConstructor,
-          original.redirectedConstructor, '$desc redirectedConstructor');
-    }
-    checkPossibleMember(resynthesized, original, desc);
-    expect(resynthesized.nameEnd, original.nameEnd, reason: desc);
-    expect(resynthesized.periodOffset, original.periodOffset, reason: desc);
-    expect(resynthesizedImpl.isCycleFree, originalImpl.isCycleFree,
-        reason: desc);
-  }
-
-  void compareConstValues(
-      DartObject resynthesized, DartObject original, String desc) {
-    if (original == null) {
-      expect(resynthesized, isNull, reason: desc);
-    } else {
-      expect(resynthesized, isNotNull, reason: desc);
-      compareTypes(resynthesized.type, original.type, desc);
-      expect(resynthesized.hasKnownValue, original.hasKnownValue, reason: desc);
-      if (original.isNull) {
-        expect(resynthesized.isNull, isTrue, reason: desc);
-      } else if (original.toBoolValue() != null) {
-        expect(resynthesized.toBoolValue(), original.toBoolValue(),
-            reason: desc);
-      } else if (original.toIntValue() != null) {
-        expect(resynthesized.toIntValue(), original.toIntValue(), reason: desc);
-      } else if (original.toDoubleValue() != null) {
-        expect(resynthesized.toDoubleValue(), original.toDoubleValue(),
-            reason: desc);
-      } else if (original.toListValue() != null) {
-        List<DartObject> resynthesizedList = resynthesized.toListValue();
-        List<DartObject> originalList = original.toListValue();
-        expect(resynthesizedList, hasLength(originalList.length));
-        for (int i = 0; i < originalList.length; i++) {
-          compareConstValues(resynthesizedList[i], originalList[i], desc);
-        }
-      } else if (original.toMapValue() != null) {
-        Map<DartObject, DartObject> resynthesizedMap =
-            resynthesized.toMapValue();
-        Map<DartObject, DartObject> originalMap = original.toMapValue();
-        expect(resynthesizedMap, hasLength(originalMap.length));
-        List<DartObject> resynthesizedKeys = resynthesizedMap.keys.toList();
-        List<DartObject> originalKeys = originalMap.keys.toList();
-        for (int i = 0; i < originalKeys.length; i++) {
-          DartObject resynthesizedKey = resynthesizedKeys[i];
-          DartObject originalKey = originalKeys[i];
-          compareConstValues(resynthesizedKey, originalKey, desc);
-          DartObject resynthesizedValue = resynthesizedMap[resynthesizedKey];
-          DartObject originalValue = originalMap[originalKey];
-          compareConstValues(resynthesizedValue, originalValue, desc);
-        }
-      } else if (original.toStringValue() != null) {
-        expect(resynthesized.toStringValue(), original.toStringValue(),
-            reason: desc);
-      } else if (original.toSymbolValue() != null) {
-        expect(resynthesized.toSymbolValue(), original.toSymbolValue(),
-            reason: desc);
-      } else if (original.toTypeValue() != null) {
-        fail('Not implemented');
-      }
-    }
-  }
-
-  void compareElementAnnotations(ElementAnnotationImpl resynthesized,
-      ElementAnnotationImpl original, String desc) {
-    if (original.element == null) {
-      expect(resynthesized.element, isNull);
-    } else {
-      expect(resynthesized.element, isNotNull, reason: desc);
-      expect(resynthesized.element.kind, original.element.kind, reason: desc);
-      expect(resynthesized.element.location, original.element.location,
-          reason: desc);
-    }
-    expect(resynthesized.compilationUnit, isNotNull, reason: desc);
-    expect(resynthesized.compilationUnit.location,
-        original.compilationUnit.location,
-        reason: desc);
-    expect(resynthesized.annotationAst, isNotNull, reason: desc);
-    compareConstAsts(resynthesized.annotationAst, original.annotationAst, desc);
-  }
-
-  void compareElementLocations(
-      Element resynthesized, Element original, String desc) {
-    bool hasFunctionElementByValue(Element e) {
-      if (e == null) {
-        return false;
-      }
-      if (e is FunctionElementImpl_forLUB) {
-        return true;
-      }
-      return hasFunctionElementByValue(e.enclosingElement);
-    }
-
-    if (hasFunctionElementByValue(resynthesized)) {
-      // We resynthesize elements representing types of local functions
-      // without corresponding name offsets, so their locations don't have
-      // corresponding valid @offset components. Also, we don't put
-      // resynthesized local functions into initializers of variables.
-      return;
-    }
-    expect(resynthesized.location, original.location, reason: desc);
-  }
-
-  void compareElements(Element resynthesized, Element original, String desc) {
-    ElementImpl rImpl = getActualElement(resynthesized, desc);
-    ElementImpl oImpl = getActualElement(original, desc);
-    if (oImpl == null && rImpl == null) {
-      return;
-    }
-    if (oImpl is PrefixElement) {
-      // TODO(scheglov) prefixes cannot be resynthesized
-      return;
-    }
-    expect(original, isNotNull);
-    expect(resynthesized, isNotNull, reason: desc);
-    if (rImpl is DefaultParameterElementImpl && oImpl is ParameterElementImpl) {
-      // This is ok provided the resynthesized parameter element doesn't have
-      // any evaluation result.
-      expect(rImpl.evaluationResult, isNull);
-    } else {
-      Type rRuntimeType;
-      if (rImpl is ConstFieldElementImpl) {
-        rRuntimeType = ConstFieldElementImpl;
-      } else if (rImpl is FunctionElementImpl) {
-        rRuntimeType = FunctionElementImpl;
-      } else {
-        rRuntimeType = rImpl.runtimeType;
-      }
-      expect(rRuntimeType, oImpl.runtimeType);
-    }
-    expect(resynthesized.kind, original.kind);
-    compareElementLocations(resynthesized, original, desc);
-    expect(resynthesized.name, original.name);
-    expect(resynthesized.nameOffset, original.nameOffset,
-        reason: '$desc.nameOffset');
-    expect(rImpl.codeOffset, oImpl.codeOffset, reason: desc);
-    expect(rImpl.codeLength, oImpl.codeLength, reason: desc);
-    expect(resynthesized.documentationComment, original.documentationComment,
-        reason: desc);
-    compareMetadata(resynthesized.metadata, original.metadata, desc);
-
-    // Validate modifiers.
-    for (Modifier modifier in Modifier.values) {
-      bool got = _hasModifier(resynthesized, modifier);
-      bool want = _hasModifier(original, modifier);
-      expect(got, want,
-          reason: 'Mismatch in $desc.$modifier: got $got, want $want');
-    }
-
-    // Validate members.
-    if (oImpl is Member) {
-      expect(rImpl, new TypeMatcher<Member>(), reason: desc);
-    } else {
-      expect(rImpl, isNot(new TypeMatcher<Member>()), reason: desc);
-    }
-  }
-
-  void compareExecutableElements(
-      ExecutableElement resynthesized, ExecutableElement original, String desc,
-      {bool shallow: false}) {
-    compareElements(resynthesized, original, desc);
-    compareParameterElementLists(
-        resynthesized.parameters, original.parameters, desc);
-    if (!original.hasImplicitReturnType) {
-      compareTypes(
-          resynthesized.returnType, original.returnType, '$desc return type');
-    }
-    if (!shallow) {
-      compareTypes(resynthesized.type, original.type, desc);
-    }
-    expect(resynthesized.typeParameters.length, original.typeParameters.length);
-    for (int i = 0; i < resynthesized.typeParameters.length; i++) {
-      compareTypeParameterElements(
-          resynthesized.typeParameters[i],
-          original.typeParameters[i],
-          '$desc type parameter ${original.typeParameters[i].name}');
-    }
-  }
-
-  void compareExportElements(ExportElementImpl resynthesized,
-      ExportElementImpl original, String desc) {
-    expect(resynthesized.exportedLibrary.location,
-        original.exportedLibrary.location);
-    expect(resynthesized.combinators.length, original.combinators.length);
-    for (int i = 0; i < resynthesized.combinators.length; i++) {
-      compareNamespaceCombinators(
-          resynthesized.combinators[i], original.combinators[i]);
-    }
-  }
-
-  void compareFieldElements(
-      FieldElementImpl resynthesized, FieldElementImpl original, String desc) {
-    comparePropertyInducingElements(resynthesized, original, desc);
-  }
-
-  void compareFunctionElements(
-      FunctionElement resynthesized, FunctionElement original, String desc,
-      {bool shallow: false}) {
-    if (original == null && resynthesized == null) {
-      return;
-    }
-    expect(resynthesized, isNotNull, reason: desc);
-    compareExecutableElements(resynthesized, original, desc, shallow: shallow);
-    checkPossibleLocalElements(resynthesized, original);
-  }
-
-  void compareFunctionTypeAliasElements(FunctionTypeAliasElement resynthesized,
-      FunctionTypeAliasElement original, String desc) {
-    compareElements(resynthesized, original, desc);
-    ElementImpl rImpl = getActualElement(resynthesized, desc);
-    ElementImpl oImpl = getActualElement(original, desc);
-    if (rImpl is GenericTypeAliasElementImpl) {
-      if (oImpl is GenericTypeAliasElementImpl) {
-        compareGenericFunctionTypeElements(
-            rImpl.function, oImpl.function, '$desc.function');
-      } else {
-        fail(
-            'Resynthesized a GenericTypeAliasElementImpl, but expected a ${oImpl.runtimeType}');
-      }
-    } else {
-      fail('Resynthesized a ${rImpl.runtimeType}');
-    }
-    compareTypes(resynthesized.type, original.type, desc);
-    expect(resynthesized.typeParameters.length, original.typeParameters.length);
-    for (int i = 0; i < resynthesized.typeParameters.length; i++) {
-      compareTypeParameterElements(
-          resynthesized.typeParameters[i],
-          original.typeParameters[i],
-          '$desc.typeParameters[$i] /* ${original.typeParameters[i].name} */');
-    }
-  }
-
-  void compareGenericFunctionTypeElements(
-      GenericFunctionTypeElement resynthesized,
-      GenericFunctionTypeElement original,
-      String desc) {
-    if (resynthesized == null) {
-      if (original != null) {
-        fail('Failed to resynthesize generic function type');
-      }
-    } else if (original == null) {
-      fail('Resynthesizes a generic function type when none expected');
-    }
-    compareTypeParameterElementLists(resynthesized.typeParameters,
-        original.typeParameters, '$desc.typeParameters');
-    compareParameterElementLists(
-        resynthesized.parameters, original.parameters, '$desc.parameters');
-    compareTypes(
-        resynthesized.returnType, original.returnType, '$desc.returnType');
-  }
-
-  void compareImportElements(ImportElementImpl resynthesized,
-      ImportElementImpl original, String desc) {
-    expect(resynthesized.importedLibrary.location,
-        original.importedLibrary.location,
-        reason: '$desc importedLibrary location');
-    expect(resynthesized.prefixOffset, original.prefixOffset,
-        reason: '$desc prefixOffset');
-    if (original.prefix == null) {
-      expect(resynthesized.prefix, isNull, reason: '$desc prefix');
-    } else {
-      comparePrefixElements(
-          resynthesized.prefix, original.prefix, original.prefix.name);
-    }
-    expect(resynthesized.combinators.length, original.combinators.length,
-        reason: '$desc combinators');
-    for (int i = 0; i < resynthesized.combinators.length; i++) {
-      compareNamespaceCombinators(
-          resynthesized.combinators[i], original.combinators[i]);
-    }
-  }
-
-  void compareLabelElements(
-      LabelElementImpl resynthesized, LabelElementImpl original, String desc) {
-    expect(resynthesized.isOnSwitchMember, original.isOnSwitchMember,
-        reason: desc);
-    expect(resynthesized.isOnSwitchStatement, original.isOnSwitchStatement,
-        reason: desc);
-    compareElements(resynthesized, original, desc);
-  }
-
-  void compareLineInfo(LineInfo resynthesized, LineInfo original) {
-    expect(resynthesized.lineCount, original.lineCount);
-    expect(resynthesized.lineStarts, original.lineStarts);
-  }
-
-  void compareMetadata(List<ElementAnnotation> resynthesized,
-      List<ElementAnnotation> original, String desc) {
-    expect(resynthesized, hasLength(original.length), reason: desc);
-    for (int i = 0; i < original.length; i++) {
-      compareElementAnnotations(
-          resynthesized[i], original[i], '$desc annotation $i');
-    }
-  }
-
-  void compareMethodElements(MethodElementImpl resynthesized,
-      MethodElementImpl original, String desc) {
-    // TODO(paulberry): do we need to deal with
-    // MultiplyInheritedMethodElementImpl?
-    compareExecutableElements(resynthesized, original, desc);
-  }
-
-  void compareNamespaceCombinators(
-      NamespaceCombinator resynthesized, NamespaceCombinator original) {
-    if (original is ShowElementCombinatorImpl &&
-        resynthesized is ShowElementCombinatorImpl) {
-      expect(resynthesized.shownNames, original.shownNames,
-          reason: 'shownNames');
-      expect(resynthesized.offset, original.offset, reason: 'offset');
-      expect(resynthesized.end, original.end, reason: 'end');
-    } else if (original is HideElementCombinatorImpl &&
-        resynthesized is HideElementCombinatorImpl) {
-      expect(resynthesized.hiddenNames, original.hiddenNames,
-          reason: 'hiddenNames');
-    } else if (resynthesized.runtimeType != original.runtimeType) {
-      fail(
-          'Type mismatch: expected ${original.runtimeType}, got ${resynthesized.runtimeType}');
-    } else {
-      fail('Unimplemented comparison for ${original.runtimeType}');
-    }
-  }
-
-  void compareNamespaces(
-      Namespace resynthesized, Namespace original, String desc) {
-    Map<String, Element> resynthesizedMap = resynthesized.definedNames;
-    Map<String, Element> originalMap = original.definedNames;
-    expect(resynthesizedMap.keys.toSet(), originalMap.keys.toSet(),
-        reason: desc);
-    for (String key in originalMap.keys) {
-      Element resynthesizedElement = resynthesizedMap[key];
-      Element originalElement = originalMap[key];
-      compareElements(resynthesizedElement, originalElement, key);
-    }
-  }
-
-  void compareParameterElementLists(
-      List<ParameterElement> resynthesizedParameters,
-      List<ParameterElement> originalParameters,
-      String desc) {
-    expect(resynthesizedParameters.length, originalParameters.length);
-    for (int i = 0; i < resynthesizedParameters.length; i++) {
-      compareParameterElements(
-          resynthesizedParameters[i],
-          originalParameters[i],
-          '$desc.parameters[$i] /* ${originalParameters[i].name} */');
-    }
-  }
-
-  void compareParameterElements(
-      ParameterElement resynthesized, ParameterElement original, String desc) {
-    compareVariableElements(resynthesized, original, desc);
-    compareParameterElementLists(
-        resynthesized.parameters, original.parameters, desc);
-    // ignore: deprecated_member_use_from_same_package
-    expect(resynthesized.parameterKind, original.parameterKind, reason: desc);
-    expect(resynthesized.isInitializingFormal, original.isInitializingFormal,
-        reason: desc);
-    expect(resynthesized is FieldFormalParameterElementImpl,
-        original is FieldFormalParameterElementImpl);
-    if (resynthesized is FieldFormalParameterElementImpl &&
-        original is FieldFormalParameterElementImpl) {
-      if (original.field == null) {
-        expect(resynthesized.field, isNull, reason: '$desc field');
-      } else {
-        expect(resynthesized.field, isNotNull, reason: '$desc field');
-        compareFieldElements(
-            resynthesized.field, original.field, '$desc field');
-      }
-    }
-    expect(resynthesized.defaultValueCode, original.defaultValueCode,
-        reason: desc);
-    expect(resynthesized.isCovariant, original.isCovariant,
-        reason: '$desc isCovariant');
-    ParameterElementImpl resynthesizedActual =
-        getActualElement(resynthesized, desc);
-    ParameterElementImpl originalActual = getActualElement(original, desc);
-    expect(resynthesizedActual.isExplicitlyCovariant,
-        originalActual.isExplicitlyCovariant,
-        reason: desc);
-    compareFunctionElements(
-        resynthesizedActual.initializer, originalActual.initializer, desc);
-  }
-
-  void comparePrefixElements(PrefixElementImpl resynthesized,
-      PrefixElementImpl original, String desc) {
-    compareElements(resynthesized, original, desc);
-  }
-
-  void comparePropertyAccessorElements(
-      PropertyAccessorElementImpl resynthesized,
-      PropertyAccessorElementImpl original,
-      String desc) {
-    // TODO(paulberry): do I need to worry about
-    // MultiplyInheritedPropertyAccessorElementImpl?
-    compareExecutableElements(resynthesized, original, desc);
-    expect(resynthesized.variable, isNotNull);
-    expect(resynthesized.variable.location, original.variable.location);
-  }
-
-  void comparePropertyInducingElements(
-      PropertyInducingElementImpl resynthesized,
-      PropertyInducingElementImpl original,
-      String desc) {
-    compareVariableElements(resynthesized, original, desc);
-    if (original.getter == null) {
-      expect(resynthesized.getter, isNull);
-    } else {
-      expect(resynthesized.getter, isNotNull);
-      expect(resynthesized.getter.location, original.getter.location);
-    }
-    if (original.setter == null) {
-      expect(resynthesized.setter, isNull);
-    } else {
-      expect(resynthesized.setter, isNotNull);
-      expect(resynthesized.setter.location, original.setter.location);
-    }
-  }
-
-  void compareTopLevelVariableElements(
-      TopLevelVariableElementImpl resynthesized,
-      TopLevelVariableElementImpl original,
-      String desc) {
-    comparePropertyInducingElements(resynthesized, original, desc);
-  }
-
-  void compareTypeImpls(
-      TypeImpl resynthesized, TypeImpl original, String desc) {
-    compareElementLocations(
-        resynthesized.element, original.element, '$desc.element.location');
-    expect(resynthesized.name, original.name, reason: '$desc.name');
-  }
-
-  void compareTypeParameterElementLists(
-      List<TypeParameterElement> resynthesized,
-      List<TypeParameterElement> original,
-      String desc) {
-    int length = original.length;
-    expect(resynthesized.length, length, reason: '$desc.length');
-    for (int i = 0; i < length; i++) {
-      compareTypeParameterElements(resynthesized[i], original[i], '$desc[$i]');
-    }
-  }
-
-  void compareTypeParameterElements(TypeParameterElement resynthesized,
-      TypeParameterElement original, String desc) {
-    compareElements(resynthesized, original, desc);
-    compareTypes(resynthesized.type, original.type, '$desc.type');
-    compareTypes(resynthesized.bound, original.bound, '$desc.bound');
-  }
-
-  void compareTypes(DartType resynthesized, DartType original, String desc) {
-    if (original == null) {
-      expect(resynthesized, isNull, reason: desc);
-    } else if (resynthesized is InterfaceTypeImpl &&
-        original is InterfaceTypeImpl) {
-      compareTypeImpls(resynthesized, original, desc);
-      expect(resynthesized.typeArguments.length, original.typeArguments.length,
-          reason: '$desc.typeArguments.length');
-      for (int i = 0; i < resynthesized.typeArguments.length; i++) {
-        compareTypes(resynthesized.typeArguments[i], original.typeArguments[i],
-            '$desc.typeArguments[$i] /* ${original.typeArguments[i].name} */');
-      }
-    } else if (resynthesized is TypeParameterTypeImpl &&
-        original is TypeParameterTypeImpl) {
-      compareTypeImpls(resynthesized, original, desc);
-    } else if (resynthesized is DynamicTypeImpl &&
-        original is DynamicTypeImpl) {
-      expect(resynthesized, same(original));
-    } else if (resynthesized is UndefinedTypeImpl &&
-        original is UndefinedTypeImpl) {
-      expect(resynthesized, same(original));
-    } else if (resynthesized is FunctionTypeImpl &&
-        original is FunctionTypeImpl) {
-      compareTypeImpls(resynthesized, original, desc);
-      expect(resynthesized.isInstantiated, original.isInstantiated,
-          reason: desc);
-      if (original.element.enclosingElement == null &&
-          original.element is FunctionElement) {
-        expect(resynthesized.element, isFunctionElement);
-        expect(resynthesized.element.enclosingElement, isNull, reason: desc);
-        compareFunctionElements(
-            resynthesized.element, original.element, '$desc.element',
-            shallow: true);
-        expect(resynthesized.element.type, same(resynthesized));
-      }
-      expect(resynthesized.typeArguments.length, original.typeArguments.length,
-          reason: '$desc.typeArguments.length');
-      for (int i = 0; i < resynthesized.typeArguments.length; i++) {
-        if (resynthesized.typeArguments[i].isDynamic &&
-            original.typeArguments[i] is TypeParameterType) {
-          // It's ok for type arguments to get converted to `dynamic` if they
-          // are not used.
-          expect(
-              isTypeParameterUsed(
-                  original.typeArguments[i], original.element.type),
-              isFalse);
-        } else {
-          compareTypes(
-              resynthesized.typeArguments[i],
-              original.typeArguments[i],
-              '$desc.typeArguments[$i] /* ${original.typeArguments[i].name} */');
-        }
-      }
-      if (original.typeParameters == null) {
-        expect(resynthesized.typeParameters, isNull, reason: desc);
-      } else {
-        expect(resynthesized.typeParameters, isNotNull, reason: desc);
-        expect(
-            resynthesized.typeParameters.length, original.typeParameters.length,
-            reason: desc);
-        for (int i = 0; i < resynthesized.typeParameters.length; i++) {
-          compareTypeParameterElements(resynthesized.typeParameters[i],
-              original.typeParameters[i], '$desc.typeParameters[$i]');
-        }
-      }
-      expect(resynthesized.typeFormals.length, original.typeFormals.length,
-          reason: desc);
-      for (int i = 0; i < resynthesized.typeFormals.length; i++) {
-        compareTypeParameterElements(resynthesized.typeFormals[i],
-            original.typeFormals[i], '$desc.typeFormals[$i]');
-      }
-    } else if (resynthesized is VoidTypeImpl && original is VoidTypeImpl) {
-      expect(resynthesized, same(original));
-    } else if (resynthesized is DynamicTypeImpl &&
-        original is UndefinedTypeImpl) {
-      // TODO(scheglov) In the strong mode constant variable like
-      //  `var V = new Unresolved()` gets `UndefinedTypeImpl`, and it gets
-      // `DynamicTypeImpl` in the spec mode.
-    } else if (resynthesized is BottomTypeImpl && original is BottomTypeImpl) {
-      expect(resynthesized, same(original));
-    } else if (resynthesized.runtimeType != original.runtimeType) {
-      fail('Type mismatch: expected $original,'
-          ' got $resynthesized ($desc)');
-    } else {
-      fail('Unimplemented comparison for ${original.runtimeType}');
-    }
-  }
-
-  void compareVariableElements(
-      VariableElement resynthesized, VariableElement original, String desc) {
-    compareElements(resynthesized, original, desc);
-    if ((resynthesized as VariableElementImpl).typeInferenceError == null) {
-      compareTypes(resynthesized.type, original.type, '$desc.type');
-    }
-    VariableElementImpl resynthesizedActual =
-        getActualElement(resynthesized, desc);
-    VariableElementImpl originalActual = getActualElement(original, desc);
-    compareFunctionElements(resynthesizedActual.initializer,
-        originalActual.initializer, '$desc.initializer');
-    if (originalActual is ConstVariableElement) {
-      Element oEnclosing = original.enclosingElement;
-      if (oEnclosing is ClassElement && oEnclosing.isEnum) {
-        compareConstValues(resynthesized.constantValue, original.constantValue,
-            '$desc.constantValue');
-      } else {
-        Expression initializer = resynthesizedActual.constantInitializer;
-        if (variablesWithNotConstInitializers.contains(resynthesized.name)) {
-          expect(initializer, isNull, reason: desc);
-        } else {
-          compareConstAsts(initializer, originalActual.constantInitializer,
-              '$desc.constantInitializer');
-        }
-      }
-    }
-    checkPossibleMember(resynthesized, original, desc);
-    checkPossibleLocalElements(resynthesized, original);
-  }
-
-  ElementImpl getActualElement(Element element, String desc) {
-    if (element == null) {
-      return null;
-    } else if (element is ElementImpl) {
-      return element;
-    } else if (element is ElementHandle) {
-      Element actualElement = element.actualElement;
-      // A handle should never point to a member, because if it did, then
-      // "is Member" checks on the handle would produce the wrong result.
-      expect(actualElement, isNot(new TypeMatcher<Member>()), reason: desc);
-      return getActualElement(actualElement, desc);
-    } else if (element is Member) {
-      return getActualElement(element.baseElement, desc);
-    } else {
-      fail('Unexpected type for resynthesized ($desc):'
-          ' ${element.runtimeType}');
-    }
-  }
-
-  /**
-   * Determine if [type] makes use of the given [typeParameter].
-   */
-  bool isTypeParameterUsed(TypeParameterType typeParameter, DartType type) {
-    if (type is FunctionType) {
-      return isTypeParameterUsed(typeParameter, type.returnType) ||
-          type.parameters.any((ParameterElement e) =>
-              isTypeParameterUsed(typeParameter, e.type));
-    } else if (type is InterfaceType) {
-      return type.typeArguments
-          .any((DartType t) => isTypeParameterUsed(typeParameter, t));
-    } else if (type is TypeParameterType) {
-      return type == typeParameter;
-    } else {
-      expect(type.isDynamic || type.isVoid, isTrue);
-      return false;
-    }
-  }
-
-  LibraryElementImpl _encodeDecodeLibraryElement(Source source) {
     SummaryResynthesizer resynthesizer = encodeLibrary(source);
     return resynthesizer.getLibraryElement(source.uri.toString());
   }
-
-  List<PropertyAccessorElement> _getSortedPropertyAccessors(
-      ClassElement classElement) {
-    List<PropertyAccessorElement> accessors = classElement.accessors.toList();
-    accessors.sort((a, b) => a.displayName.compareTo(b.displayName));
-    return accessors;
-  }
-
-  bool _hasModifier(Element element, Modifier modifier) {
-    if (modifier == Modifier.ABSTRACT) {
-      if (element is ClassElement) {
-        return element.isAbstract;
-      }
-      if (element is ExecutableElement) {
-        return element.isAbstract;
-      }
-      return false;
-    } else if (modifier == Modifier.ASYNCHRONOUS) {
-      if (element is ExecutableElement) {
-        return element.isAsynchronous;
-      }
-      return false;
-    } else if (modifier == Modifier.CONST) {
-      if (element is VariableElement) {
-        return element.isConst;
-      }
-      return false;
-    } else if (modifier == Modifier.COVARIANT) {
-      if (element is ParameterElementImpl) {
-        return element.isExplicitlyCovariant;
-      }
-      return false;
-    } else if (modifier == Modifier.DEFERRED) {
-      if (element is ImportElement) {
-        return element.isDeferred;
-      }
-      return false;
-    } else if (modifier == Modifier.ENUM) {
-      if (element is ClassElement) {
-        return element.isEnum;
-      }
-      return false;
-    } else if (modifier == Modifier.EXTERNAL) {
-      if (element is ExecutableElement) {
-        return element.isExternal;
-      }
-      return false;
-    } else if (modifier == Modifier.FACTORY) {
-      if (element is ConstructorElement) {
-        return element.isFactory;
-      }
-      return false;
-    } else if (modifier == Modifier.FINAL) {
-      if (element is VariableElement) {
-        return element.isFinal;
-      }
-      return false;
-    } else if (modifier == Modifier.GENERATOR) {
-      if (element is ExecutableElement) {
-        return element.isGenerator;
-      }
-      return false;
-    } else if (modifier == Modifier.GETTER) {
-      if (element is PropertyAccessorElement) {
-        return element.isGetter;
-      }
-      return false;
-    } else if (modifier == Modifier.HAS_EXT_URI) {
-      if (element is LibraryElement) {
-        return element.hasExtUri;
-      }
-      return false;
-    } else if (modifier == Modifier.IMPLICIT_TYPE) {
-      if (element is ExecutableElement) {
-        return element.hasImplicitReturnType;
-      }
-      return false;
-    } else if (modifier == Modifier.MIXIN_APPLICATION) {
-      if (element is ClassElement) {
-        return element.isMixinApplication;
-      }
-      return false;
-    } else if (modifier == Modifier.REFERENCES_SUPER) {
-      if (element is ClassElement) {
-        return element.hasReferenceToSuper;
-      }
-      return false;
-    } else if (modifier == Modifier.SETTER) {
-      if (element is PropertyAccessorElement) {
-        return element.isSetter;
-      }
-      return false;
-    } else if (modifier == Modifier.STATIC) {
-      if (element is ExecutableElement) {
-        return element.isStatic;
-      } else if (element is FieldElement) {
-        return element.isStatic;
-      }
-      return false;
-    } else if (modifier == Modifier.SYNTHETIC) {
-      return element.isSynthetic;
-    }
-    throw new UnimplementedError(
-        'Modifier $modifier for ${element?.runtimeType}');
-  }
 }
 
 class TestSummaryResynthesizer extends SummaryResynthesizer {
@@ -10053,12 +8738,13 @@
    */
   final Set<String> linkedSummariesRequested = new Set<String>();
 
-  TestSummaryResynthesizer(AnalysisContext context, this.unlinkedSummaries,
+  TestSummaryResynthesizer(AnalysisContextImpl context, this.unlinkedSummaries,
       this.linkedSummaries, this.allowMissingFiles)
       : super(context, null, context.sourceFactory, true) {
     // Clear after resynthesizing TypeProvider in super().
     unlinkedSummariesRequested.clear();
     linkedSummariesRequested.clear();
+    context.typeProvider = typeProvider;
   }
 
   @override
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 71fd7cd..9d73270 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -10775,7 +10775,6 @@
     var scanner = new Scanner(stringSource, reader, errorListener);
     var startToken = scanner.tokenize();
     var parser = new Parser(stringSource, errorListener)
-      ..enableSetLiterals = experimentStatus.set_literals
       ..enableNonNullable = experimentStatus.non_nullable;
     var compilationUnit = parser.parseCompilationUnit(startToken);
     var f = compilationUnit.declarations[0] as FunctionDeclaration;
diff --git a/pkg/analyzer/test/src/summary/test_all.dart b/pkg/analyzer/test/src/summary/test_all.dart
index 1ffc606..184c0e7 100644
--- a/pkg/analyzer/test/src/summary/test_all.dart
+++ b/pkg/analyzer/test/src/summary/test_all.dart
@@ -1,29 +1,37 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'expr_builder_test.dart' as expr_builder_test;
-import 'in_summary_source_test.dart' as in_summary_source_test;
-import 'linker_test.dart' as linker_test;
-import 'name_filter_test.dart' as name_filter_test;
-import 'package_bundle_reader_test.dart' as package_bundle_reader_test;
-import 'prelinker_test.dart' as prelinker_test;
-import 'resynthesize_ast_test.dart' as resynthesize_ast_test;
-import 'summarize_ast_strong_test.dart' as summarize_ast_strong_test;
-import 'top_level_inference_test.dart' as top_level_inference_test;
+import 'api_signature_test.dart' as api_signature;
+import 'dependency_walker_test.dart' as dependency_walker;
+import 'expr_builder_test.dart' as expr_builder;
+import 'flat_buffers_test.dart' as flat_buffers;
+import 'in_summary_source_test.dart' as in_summary_source;
+import 'linker_test.dart' as linker;
+import 'name_filter_test.dart' as name_filter;
+import 'package_bundle_reader_test.dart' as package_bundle_reader;
+import 'prelinker_test.dart' as prelinker;
+import 'resynthesize_ast2_test.dart' as resynthesize_ast2;
+import 'resynthesize_ast_test.dart' as resynthesize_ast;
+import 'summarize_ast_strong_test.dart' as summarize_ast_strong;
+import 'top_level_inference_test.dart' as top_level_inference;
 
 main() {
   defineReflectiveSuite(() {
-    expr_builder_test.main();
-    in_summary_source_test.main();
-    linker_test.main();
-    name_filter_test.main();
-    package_bundle_reader_test.main();
-    prelinker_test.main();
-    resynthesize_ast_test.main();
-    summarize_ast_strong_test.main();
-    top_level_inference_test.main();
+    api_signature.main();
+    dependency_walker.main();
+    expr_builder.main();
+    flat_buffers.main();
+    in_summary_source.main();
+    linker.main();
+    name_filter.main();
+    package_bundle_reader.main();
+    prelinker.main();
+    resynthesize_ast2.main();
+    resynthesize_ast.main();
+    summarize_ast_strong.main();
+    top_level_inference.main();
   }, name: 'summary');
 }
diff --git a/pkg/analyzer/test/src/summary/test_strategies.dart b/pkg/analyzer/test/src/summary/test_strategies.dart
index fe525e0..0ceebdf 100644
--- a/pkg/analyzer/test/src/summary/test_strategies.dart
+++ b/pkg/analyzer/test/src/summary/test_strategies.dart
@@ -2,16 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/analysis/restricted_analysis_context.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
@@ -22,7 +21,6 @@
 import 'package:analyzer/src/summary/prelink.dart';
 import 'package:analyzer/src/summary/summarize_ast.dart';
 import 'package:analyzer/src/summary/summarize_elements.dart';
-import 'package:analyzer/src/task/api/general.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:path/path.dart' show posix;
 import 'package:test/test.dart';
@@ -35,7 +33,7 @@
   return posix.toUri(absolutePath).toString();
 }
 
-CompilationUnit _parseText(
+CompilationUnit parseText(
   String text, {
   ExperimentStatus experimentStatus,
 }) {
@@ -46,7 +44,6 @@
   Token token = scanner.tokenize();
   Parser parser =
       new Parser(NonExistingSource.unknown, AnalysisErrorListener.NULL_LISTENER)
-        ..enableSetLiterals = experimentStatus.set_literals
         ..enableNonNullable = experimentStatus.non_nullable;
   CompilationUnit unit = parser.parseCompilationUnit(token);
   unit.lineInfo = new LineInfo(scanner.lineStarts);
@@ -99,7 +96,7 @@
 
   void set allowMissingFiles(bool value);
 
-  AnalysisContextImpl get context;
+  set declaredVariables(DeclaredVariables declaredVariables);
 
   MemoryResourceProvider get resourceProvider;
 
@@ -115,12 +112,10 @@
 
   Source addTestSource(String code, [Uri uri]);
 
-  void checkMinimalResynthesisWork(
-      TestSummaryResynthesizer resynthesizer, LibraryElement library);
+  void checkMinimalResynthesisWork(TestSummaryResynthesizer resynthesizer,
+      Uri expectedLibraryUri, List<Uri> expectedUnitUriList);
 
   TestSummaryResynthesizer encodeLibrary(Source source);
-
-  void prepareAnalysisContext([AnalysisOptions options]);
 }
 
 /// Implementation of [SummaryBlackBoxTestStrategy] that drives summary
@@ -170,17 +165,21 @@
     }
 
     Set<String> nonSdkLibraryUris = serializedSources
-        .where((Source source) =>
-            !source.isInSystemLibrary &&
-            context.computeKindOf(source) == SourceKind.LIBRARY)
+        .where((Source source) => !source.isInSystemLibrary)
         .map((Source source) => source.uri.toString())
         .toSet();
 
-    Map<String, LinkedLibrary> linkedSummaries = link(nonSdkLibraryUris,
-        getDependency, getUnit, context.declaredVariables.get);
+    Map<String, LinkedLibrary> linkedSummaries =
+        link(nonSdkLibraryUris, getDependency, getUnit, declaredVariables.get);
+
+    var analysisContext = RestrictedAnalysisContext(
+      analysisOptions,
+      declaredVariables,
+      sourceFactory,
+    );
 
     return new TestSummaryResynthesizer(
-        context,
+        analysisContext,
         new Map<String, UnlinkedUnit>()
           ..addAll(SerializedMockSdk.instance.uriToUnlinkedUnit)
           ..addAll(unlinkedSummaries),
@@ -204,17 +203,20 @@
       }
     }
     return uriToUnit.putIfAbsent(uriStr, () {
-      int modificationTime = context.computeResult(source, MODIFICATION_TIME);
-      if (modificationTime < 0) {
+      var file = getFile(source.fullName);
+
+      String contents;
+      if (file.exists) {
+        contents = file.readAsStringSync();
+      } else {
         // Source does not exist.
         if (!allowMissingFiles) {
           fail('Unexpectedly tried to get unlinked summary for $source');
         }
-        return null;
+        contents = '';
       }
 
-      String contents = context.getContents(source).data;
-      CompilationUnit unit = _parseText(contents);
+      CompilationUnit unit = parseText(contents);
 
       UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
       bundleAssembler.addUnlinkedUnit(source, unlinkedUnit);
@@ -231,7 +233,7 @@
     }
 
     UnlinkedUnit getPart(String absoluteUri) {
-      Source source = context.sourceFactory.forUri(absoluteUri);
+      Source source = sourceFactory.forUri(absoluteUri);
       return _getUnlinkedUnit(source);
     }
 
@@ -242,9 +244,9 @@
     UnlinkedUnit definingUnit = _getUnlinkedUnit(librarySource);
     if (definingUnit != null) {
       LinkedLibraryBuilder linkedLibrary = prelink(librarySource.uri.toString(),
-          definingUnit, getPart, getImport, context.declaredVariables.get);
+          definingUnit, getPart, getImport, declaredVariables.get);
       linkedLibrary.dependencies.skip(1).forEach((LinkedDependency d) {
-        Source source = context.sourceFactory.forUri(d.uri);
+        Source source = sourceFactory.forUri(d.uri);
         _serializeLibrary(source);
       });
     }
@@ -528,7 +530,7 @@
 
   @override
   void addNamedSource(String filePath, String contents) {
-    CompilationUnit unit = _parseText(contents);
+    CompilationUnit unit = parseText(contents);
     UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
     _filesToLink.uriToUnit[absUri(filePath)] = unlinkedUnit;
   }
@@ -552,8 +554,7 @@
   }
 
   UnlinkedUnitBuilder createUnlinkedSummary(Uri uri, String text) =>
-      serializeAstUnlinked(
-          _parseText(text, experimentStatus: experimentStatus));
+      serializeAstUnlinked(parseText(text, experimentStatus: experimentStatus));
 
   _LinkerInputs _createLinkerInputs(String text,
       {String path: '/test.dart', String uri}) {
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index 9151786..b2c8847 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -6,6 +6,8 @@
 
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/analysis/base.dart';
@@ -16,6 +18,8 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(TopLevelInferenceTest);
     defineReflectiveTests(TopLevelInferenceErrorsTest);
+    defineReflectiveTests(TopLevelInferenceTestWithSpread);
+    defineReflectiveTests(TopLevelInferenceErrorsTestWithUiAsCode);
 //    defineReflectiveTests(ApplyCheckElementTextReplacements);
   });
 }
@@ -365,6 +369,20 @@
 }
 
 @reflectiveTest
+class TopLevelInferenceErrorsTestWithUiAsCode
+    extends TopLevelInferenceErrorsTest {
+  @override
+  List<String> get enabledExperiments =>
+      [EnableString.spread_collections, EnableString.control_flow_collections];
+
+  @failingTest
+  @override
+  test_initializer_untypedMap() async {
+    await super.test_initializer_untypedMap();
+  }
+}
+
+@reflectiveTest
 class TopLevelInferenceTest extends BaseAnalysisDriverTest {
   test_initializer_additive() async {
     var library = await _encodeDecodeLibrary(r'''
@@ -2629,3 +2647,15 @@
     return result.element.library;
   }
 }
+
+@reflectiveTest
+class TopLevelInferenceTestWithSpread extends TopLevelInferenceTest {
+  @override
+  List<String> get enabledExperiments => [EnableString.spread_collections];
+
+  @override
+  @failingTest
+  test_initializer_literal_map_untyped_empty() async {
+    fail('times out.');
+  }
+}
diff --git a/pkg/analyzer/test/src/summary2/ast_binary_writer_test.dart b/pkg/analyzer/test/src/summary2/ast_binary_writer_test.dart
new file mode 100644
index 0000000..f97c7a7
--- /dev/null
+++ b/pkg/analyzer/test/src/summary2/ast_binary_writer_test.dart
@@ -0,0 +1,139 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/summary2/ast_binary_reader.dart';
+import 'package:analyzer/src/summary2/ast_binary_writer.dart';
+import 'package:analyzer/src/summary2/reference.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AstBinaryWriterTest);
+  });
+}
+
+/// Just a very simple test that at least something works.
+@reflectiveTest
+class AstBinaryWriterTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.non_nullable,
+      EnableString.spread_collections,
+    ];
+
+  test_classTypeAlias() async {
+    _assertUnresolvedCode('''
+mixin M1 {}
+mixin M2 {}
+
+class I1 {}
+class I2 {}
+
+class X = Object with M1, M2 implements I1, I2;
+''');
+  }
+
+  test_configuration() async {
+    _assertUnresolvedCode('''
+import 'dart:math'
+  if (a.b.c == 'd1') 'e1'
+  if (a.b.c == 'd2') 'e2';
+''');
+  }
+
+  test_emptyStatement() async {
+    _assertUnresolvedCode('''
+main() {
+  if (true);
+}
+''');
+  }
+
+  test_forElement() async {
+    _assertUnresolvedCode('''
+main() {
+  return [1, for (var i = 0; i < 10; i++) i * i, 2];
+}
+''');
+  }
+
+  test_ifElement() async {
+    _assertUnresolvedCode('''
+main(bool b) {
+  return [1, if (b) 2 else 3, 4];
+}
+''');
+  }
+
+  test_labeledStatement() async {
+    _assertUnresolvedCode('''
+main() {
+  a: b: 42;
+}
+''');
+  }
+
+  test_scriptTag() async {
+    _assertUnresolvedCode('''
+#!/bin/dart
+
+main() {}
+''');
+  }
+
+  test_simple() async {
+    _assertUnresolvedCode('''
+const zero = 0;
+
+@zero
+class A<T extends num> {}
+
+class B extends A<int> {}
+
+void f() { // ref
+  1 + 2.0;
+  <double>[1, 2];
+}
+''');
+  }
+
+  test_spreadElement() async {
+    _assertUnresolvedCode('''
+main() {
+var a = [1, 2, 3];
+  return [...a];
+}
+''');
+  }
+
+  void _assertUnresolvedCode(String inputCode) {
+    var path = convertPath('/test/lib/test.dart');
+    newFile(path, content: inputCode);
+
+    var parseResult = driver.parseFileSync(path);
+    var originalUnit = parseResult.unit;
+    var originalCode = originalUnit.toSource();
+
+    var writer = new AstBinaryWriter();
+    var builder = writer.writeNode(originalUnit);
+    writer.writeReferences();
+
+    var reader = AstBinaryReader(
+      Reference.root(),
+      writer.referenceBuilder,
+      writer.tokens,
+    );
+    var deserializedUnit = reader.readNode(builder);
+    var deserializedCode = deserializedUnit.toSource();
+
+    expect(deserializedCode, originalCode);
+  }
+}
diff --git a/pkg/analyzer/test/src/task/html_work_manager_test.dart b/pkg/analyzer/test/src/task/html_work_manager_test.dart
deleted file mode 100644
index 714894a..0000000
--- a/pkg/analyzer/test/src/task/html_work_manager_test.dart
+++ /dev/null
@@ -1,420 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/error/error.dart' show AnalysisError;
-import 'package:analyzer/exception/exception.dart';
-import 'package:analyzer/src/context/cache.dart';
-import 'package:analyzer/src/context/context.dart';
-import 'package:analyzer/src/context/source.dart';
-import 'package:analyzer/src/error/codes.dart' show HtmlErrorCode;
-import 'package:analyzer/src/generated/engine.dart'
-    show
-        AnalysisEngine,
-        AnalysisErrorInfo,
-        AnalysisErrorInfoImpl,
-        CacheState,
-        ChangeNoticeImpl,
-        InternalAnalysisContext;
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/task/api/dart.dart';
-import 'package:analyzer/src/task/api/general.dart';
-import 'package:analyzer/src/task/api/html.dart';
-import 'package:analyzer/src/task/api/model.dart';
-import 'package:analyzer/src/task/html.dart';
-import 'package:analyzer/src/task/html_work_manager.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../../generated/test_support.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(HtmlWorkManagerTest);
-    defineReflectiveTests(HtmlWorkManagerIntegrationTest);
-  });
-}
-
-@reflectiveTest
-class HtmlWorkManagerIntegrationTest {
-  InternalAnalysisContext context = new AnalysisContextImpl();
-  HtmlWorkManager manager;
-
-  Source source1 = new TestSource('1.html');
-  Source source2 = new TestSource('2.html');
-  CacheEntry entry1;
-  CacheEntry entry2;
-
-  void expect_sourceQueue(List<Source> sources) {
-    expect(manager.sourceQueue, unorderedEquals(sources));
-  }
-
-  void setUp() {
-    manager = new HtmlWorkManager(context);
-    entry1 = context.getCacheEntry(source1);
-    entry2 = context.getCacheEntry(source2);
-  }
-
-  void
-      test_onResultInvalidated_scheduleInvalidatedLibrariesAfterSetSourceFactory() {
-    // Change the source factory, changing the analysis cache from when
-    // the work manager was constructed. This used to create a failure
-    // case for test_onResultInvalidated_scheduleInvalidLibraries so its
-    // tested here.
-    context.sourceFactory = new SourceFactoryImpl(<UriResolver>[]);
-
-    // now just do the same checks as
-    // test_onResultInvalidated_scheduleInvalidLibraries
-
-    // set HTML_ERRORS for source1 and source2
-    entry1.setValue(HTML_ERRORS, [], []);
-    entry2.setValue(HTML_ERRORS, [], []);
-    // invalidate HTML_ERRORS for source1, schedule it
-    entry1.setState(HTML_ERRORS, CacheState.INVALID);
-    expect_sourceQueue([source1]);
-    // invalidate HTML_ERRORS for source2, schedule it
-    entry2.setState(HTML_ERRORS, CacheState.INVALID);
-    expect_sourceQueue([source1, source2]);
-  }
-}
-
-@reflectiveTest
-class HtmlWorkManagerTest {
-  _InternalAnalysisContextMock context = new _InternalAnalysisContextMock();
-  AnalysisCache cache;
-  HtmlWorkManager manager;
-
-  CaughtException caughtException = new CaughtException(null, null);
-
-  Source source1 = new TestSource('1.html');
-  Source source2 = new TestSource('2.html');
-  Source source3 = new TestSource('3.html');
-  Source source4 = new TestSource('4.html');
-  CacheEntry entry1;
-  CacheEntry entry2;
-  CacheEntry entry3;
-  CacheEntry entry4;
-
-  void expect_sourceQueue(List<Source> sources) {
-    expect(manager.sourceQueue, unorderedEquals(sources));
-  }
-
-  void setUp() {
-    cache = context.analysisCache;
-    manager = new HtmlWorkManager(context);
-    entry1 = context.getCacheEntry(source1);
-    entry2 = context.getCacheEntry(source2);
-    entry3 = context.getCacheEntry(source3);
-    entry4 = context.getCacheEntry(source4);
-  }
-
-  void test_applyChange_add() {
-    // add source1
-    manager.applyChange([source1], [], []);
-    expect_sourceQueue([source1]);
-    // add source2
-    manager.applyChange([source2], [], []);
-    expect_sourceQueue([source1, source2]);
-  }
-
-  void test_applyChange_add_duplicate() {
-    // add source1
-    manager.applyChange([source1], [], []);
-    expect_sourceQueue([source1]);
-    // add source1 again
-    manager.applyChange([source1], [], []);
-    expect_sourceQueue([source1]);
-  }
-
-  void test_applyChange_change() {
-    // change source1
-    manager.applyChange([], [source1], []);
-    expect_sourceQueue([source1]);
-  }
-
-  void test_applyChange_change_afterAdd() {
-    manager.applyChange([source1, source2], [], []);
-    // change source1
-    manager.applyChange([], [source1], []);
-    expect_sourceQueue([source1, source2]);
-  }
-
-  void test_applyChange_remove() {
-    manager.applyChange([source1, source2], [], []);
-    // remove source1
-    manager.applyChange([], [], [source1]);
-    expect_sourceQueue([source2]);
-    // remove source2
-    manager.applyChange([], [], [source2]);
-    expect_sourceQueue([]);
-    // remove source3
-    manager.applyChange([], [], [source3]);
-    expect_sourceQueue([]);
-  }
-
-  void test_applyPriorityTargets() {
-    context.setShouldErrorsBeAnalyzed(source2, true);
-    context.setShouldErrorsBeAnalyzed(source3, true);
-    manager.priorityResultQueue.add(new TargetedResult(source1, HTML_ERRORS));
-    manager.priorityResultQueue.add(new TargetedResult(source2, HTML_ERRORS));
-    // -source1 +source3
-    manager.applyPriorityTargets([source2, source3]);
-    expect(
-        manager.priorityResultQueue,
-        unorderedEquals([
-          new TargetedResult(source2, HTML_ERRORS),
-          new TargetedResult(source3, HTML_ERRORS)
-        ]));
-    // get next request
-    TargetedResult request = manager.getNextResult();
-    expect(request.target, source2);
-    expect(request.result, HTML_ERRORS);
-  }
-
-  void test_getErrors_fullList() {
-    AnalysisError error1 =
-        new AnalysisError(source1, 1, 0, HtmlErrorCode.PARSE_ERROR, ['']);
-    AnalysisError error2 =
-        new AnalysisError(source1, 2, 0, HtmlErrorCode.PARSE_ERROR, ['']);
-    entry1.setValue(HTML_DOCUMENT_ERRORS, <AnalysisError>[error1], []);
-
-    DartScript script = new DartScript(source1, []);
-    entry1.setValue(DART_SCRIPTS, [script], []);
-    CacheEntry scriptEntry = context.getCacheEntry(script);
-    scriptEntry.setValue(DART_ERRORS, [error2], []);
-
-    List<AnalysisError> errors = manager.getErrors(source1);
-    expect(errors, unorderedEquals([error1, error2]));
-  }
-
-  void test_getErrors_partialList() {
-    AnalysisError error1 =
-        new AnalysisError(source1, 1, 0, HtmlErrorCode.PARSE_ERROR, ['']);
-    AnalysisError error2 =
-        new AnalysisError(source1, 2, 0, HtmlErrorCode.PARSE_ERROR, ['']);
-    entry1.setValue(HTML_DOCUMENT_ERRORS, <AnalysisError>[error1, error2], []);
-
-    List<AnalysisError> errors = manager.getErrors(source1);
-    expect(errors, unorderedEquals([error1, error2]));
-  }
-
-  void test_getNextResult_hasNormal_firstIsError() {
-    entry1.setErrorState(caughtException, [HTML_ERRORS]);
-    manager.sourceQueue.addAll([source1, source2]);
-    TargetedResult request = manager.getNextResult();
-    expect(request.target, source2);
-    expect(request.result, HTML_ERRORS);
-    // source1 is out, source2 is waiting
-    expect_sourceQueue([source2]);
-  }
-
-  void test_getNextResult_hasNormal_firstIsInvalid() {
-    entry1.setState(HTML_ERRORS, CacheState.INVALID);
-    manager.sourceQueue.addAll([source1, source2]);
-    TargetedResult request = manager.getNextResult();
-    expect(request.target, source1);
-    expect(request.result, HTML_ERRORS);
-    // no changes until computed
-    expect_sourceQueue([source1, source2]);
-  }
-
-  void test_getNextResult_hasNormal_firstIsValid() {
-    entry1.setValue(HTML_ERRORS, [], []);
-    manager.sourceQueue.addAll([source1, source2]);
-    TargetedResult request = manager.getNextResult();
-    expect(request.target, source2);
-    expect(request.result, HTML_ERRORS);
-    // source1 is out, source2 is waiting
-    expect_sourceQueue([source2]);
-  }
-
-  void test_getNextResult_hasNormalAndPriority() {
-    entry1.setState(HTML_ERRORS, CacheState.INVALID);
-    manager.sourceQueue.addAll([source1, source2]);
-    manager.addPriorityResult(source3, HTML_ERRORS);
-
-    TargetedResult request = manager.getNextResult();
-    expect(request.target, source3);
-    expect(request.result, HTML_ERRORS);
-    // no changes until computed
-    expect_sourceQueue([source1, source2]);
-  }
-
-  void test_getNextResult_hasPriority() {
-    manager.addPriorityResult(source1, HTML_ERRORS);
-    manager.addPriorityResult(source2, HTML_ERRORS);
-    expect(
-        manager.priorityResultQueue,
-        unorderedEquals([
-          new TargetedResult(source1, HTML_ERRORS),
-          new TargetedResult(source2, HTML_ERRORS)
-        ]));
-
-    TargetedResult request = manager.getNextResult();
-    expect(request.target, source1);
-    expect(request.result, HTML_ERRORS);
-    // no changes until computed
-    expect(
-        manager.priorityResultQueue,
-        unorderedEquals([
-          new TargetedResult(source1, HTML_ERRORS),
-          new TargetedResult(source2, HTML_ERRORS)
-        ]));
-  }
-
-  void test_getNextResult_nothingToDo() {
-    TargetedResult request = manager.getNextResult();
-    expect(request, isNull);
-  }
-
-  void test_getNextResultPriority_hasPriority() {
-    manager.addPriorityResult(source1, SOURCE_KIND);
-    expect(manager.getNextResultPriority(), WorkOrderPriority.PRIORITY);
-  }
-
-  void test_getNextResultPriority_hasSource() {
-    manager.sourceQueue.addAll([source1]);
-    expect(manager.getNextResultPriority(), WorkOrderPriority.NORMAL);
-  }
-
-  void test_getNextResultPriority_nothingToDo() {
-    expect(manager.getNextResultPriority(), WorkOrderPriority.NONE);
-  }
-
-  void test_onAnalysisOptionsChanged() {
-    context.everythingExists = true;
-    // set cache values
-    entry1.setValue(DART_SCRIPTS, [], []);
-    entry1.setValue(HTML_DOCUMENT, null, []);
-    entry1.setValue(HTML_DOCUMENT_ERRORS, [], []);
-    entry1.setValue(HTML_ERRORS, [], []);
-    entry1.setValue(REFERENCED_LIBRARIES, [], []);
-    // notify
-    manager.onAnalysisOptionsChanged();
-    // Only resolution-based values are invalidated.
-    expect(entry1.getState(DART_SCRIPTS), CacheState.VALID);
-    expect(entry1.getState(HTML_DOCUMENT), CacheState.VALID);
-    expect(entry1.getState(HTML_DOCUMENT_ERRORS), CacheState.VALID);
-    expect(entry1.getState(HTML_ERRORS), CacheState.INVALID);
-    expect(entry1.getState(REFERENCED_LIBRARIES), CacheState.VALID);
-  }
-
-  void test_onResultInvalidated_scheduleInvalidatedLibraries() {
-    // set HTML_ERRORS for source1 and source3
-    entry1.setValue(HTML_ERRORS, [], []);
-    entry3.setValue(HTML_ERRORS, [], []);
-    // invalidate HTML_ERRORS for source1, schedule it
-    entry1.setState(HTML_ERRORS, CacheState.INVALID);
-    expect_sourceQueue([source1]);
-    // invalidate HTML_ERRORS for source3, schedule it
-    entry3.setState(HTML_ERRORS, CacheState.INVALID);
-    expect_sourceQueue([source1, source3]);
-  }
-
-  void test_onSourceFactoryChanged() {
-    context.everythingExists = true;
-    // set cache values
-    entry1.setValue(DART_SCRIPTS, [], []);
-    entry1.setValue(HTML_DOCUMENT, null, []);
-    entry1.setValue(HTML_DOCUMENT_ERRORS, [], []);
-    entry1.setValue(HTML_ERRORS, [], []);
-    entry1.setValue(REFERENCED_LIBRARIES, [], []);
-    // notify
-    manager.onSourceFactoryChanged();
-    // Only resolution-based values are invalidated.
-    expect(entry1.getState(DART_SCRIPTS), CacheState.VALID);
-    expect(entry1.getState(HTML_DOCUMENT), CacheState.VALID);
-    expect(entry1.getState(HTML_DOCUMENT_ERRORS), CacheState.VALID);
-    expect(entry1.getState(HTML_ERRORS), CacheState.INVALID);
-    expect(entry1.getState(REFERENCED_LIBRARIES), CacheState.INVALID);
-  }
-
-  void test_resultsComputed_errors() {
-    AnalysisError error1 =
-        new AnalysisError(source1, 1, 0, HtmlErrorCode.PARSE_ERROR, ['']);
-    AnalysisError error2 =
-        new AnalysisError(source1, 2, 0, HtmlErrorCode.PARSE_ERROR, ['']);
-    LineInfo lineInfo = new LineInfo([0]);
-    entry1.setValue(LINE_INFO, lineInfo, []);
-    entry1.setValue(HTML_ERRORS, <AnalysisError>[error1, error2], []);
-    // RESOLVED_UNIT is ready, set errors
-    manager.resultsComputed(source1, {HTML_ERRORS: null});
-    // all of the errors are included
-    ChangeNoticeImpl notice = context.getNotice(source1);
-    expect(notice.errors, unorderedEquals([error1, error2]));
-    expect(notice.lineInfo, lineInfo);
-  }
-}
-
-class _InternalAnalysisContextMock implements InternalAnalysisContext {
-  @override
-  CachePartition privateAnalysisCachePartition;
-
-  @override
-  AnalysisCache analysisCache;
-
-  bool everythingExists = false;
-
-  Map<Source, bool> shouldErrorsBeAnalyzedMap = <Source, bool>{};
-
-  // The production version is a stream that carries messages from the cache
-  // since the cache changes. Here, we can just pass the inner stream because
-  // it doesn't change.
-  Map<Source, ChangeNoticeImpl> _pendingNotices = <Source, ChangeNoticeImpl>{};
-
-  _InternalAnalysisContextMock() {
-    privateAnalysisCachePartition = new UniversalCachePartition(this);
-    analysisCache = new AnalysisCache([privateAnalysisCachePartition]);
-  }
-
-  @override
-  get onResultInvalidated => analysisCache.onResultInvalidated;
-
-  @override
-  bool exists(Source source) {
-    return everythingExists;
-  }
-
-  @override
-  CacheEntry getCacheEntry(AnalysisTarget target) {
-    CacheEntry entry = analysisCache.get(target);
-    if (entry == null) {
-      entry = new CacheEntry(target);
-      analysisCache.put(entry);
-    }
-    return entry;
-  }
-
-  @override
-  AnalysisErrorInfo getErrors(Source source) {
-    String name = source.shortName;
-    List<AnalysisError> errors = AnalysisError.NO_ERRORS;
-    if (AnalysisEngine.isDartFileName(name) || source is DartScript) {
-      errors = getCacheEntry(source).getValue(DART_ERRORS);
-    } else if (AnalysisEngine.isHtmlFileName(name)) {
-      errors = getCacheEntry(source).getValue(HTML_ERRORS);
-    }
-    return new AnalysisErrorInfoImpl(
-        errors, getCacheEntry(source).getValue(LINE_INFO));
-  }
-
-  @override
-  ChangeNoticeImpl getNotice(Source source) {
-    return _pendingNotices.putIfAbsent(
-        source, () => new ChangeNoticeImpl(source));
-  }
-
-  @override
-  noSuchMethod(Invocation invocation) {
-    throw new StateError('Unexpected invocation of ${invocation.memberName}');
-  }
-
-  void setShouldErrorsBeAnalyzed(Source source, bool value) {
-    shouldErrorsBeAnalyzedMap[source] = value;
-  }
-
-  @override
-  bool shouldErrorsBeAnalyzed(Source source) {
-    return shouldErrorsBeAnalyzedMap[source];
-  }
-}
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index 02f48c5..ee00e8e6 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -373,10 +373,10 @@
 analyzer:
   language:
     unsupported: true
-''', [AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITHOUT_VALUES]);
+''', [AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUES]);
   }
 
-  test_analyzer_language_unsupported_value() {
+  test_analyzer_strong_mode_unsupported_value() {
     validate('''
 analyzer:
   strong-mode:
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index f46df08..0d931a6 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -3647,6 +3647,233 @@
 ''');
   }
 
+  test_strictRawTypes_classes() async {
+    addFile(r'''
+class C<T> {
+  C([T t]);
+}
+
+class M<T> {}
+
+class ExtendRawType extends /*info:STRICT_RAW_TYPE*/C {}
+class MixinRawType extends Object with /*info:STRICT_RAW_TYPE*/M {}
+class ImplementRawType implements /*info:STRICT_RAW_TYPE*/C {}
+class MixinApplicationRawType = Object with /*info:STRICT_RAW_TYPE*/M;
+
+class ClassWithNumBound<T extends num> {}
+class ClassWithObjectBound<T extends Object> {}
+class ClassWithDynamicBound<T extends dynamic> {}
+
+class ClassWithRawTypeBound<T extends /*info:STRICT_RAW_TYPE*/List> {}
+
+/*info:STRICT_RAW_TYPE*/C topLevelField;
+/*info:STRICT_RAW_TYPE*/C get topLevelGetter => null;
+set topLevelSetter(/*info:STRICT_RAW_TYPE*/C c) {}
+
+/*info:STRICT_RAW_TYPE*/C returnType() => null;
+parameterType(/*info:STRICT_RAW_TYPE*/C c) {}
+
+C<int> explicitTypeArgsAreOK;
+
+main() {
+  {
+    // These should be allowed:
+    C<int> downwardsInferenceIsOK = C();
+    C<dynamic> downwardsInferenceDynamicIsOK = C();
+    var inferredFromConstructorParameterIsOK = C(42);
+    var explicitDynamicIsOK = C<dynamic>(42);
+
+    ClassWithNumBound classWithNumBoundOK;
+    ClassWithObjectBound classWithObjectBoundOK;
+    /*info:STRICT_RAW_TYPE*/ClassWithDynamicBound classWithDynamicBound;
+
+    var rawConstructorCall = /*info:STRICT_RAW_TYPE*/C();
+    /*info:STRICT_RAW_TYPE*/C rawConstructorCallFromType = C();
+
+    var upwardsInfersDynamic = /*info:STRICT_RAW_TYPE*/C(42 as dynamic);
+  }
+
+  {
+    // These should be allowed:
+    List<int> downwardsInferenceIsOK = [];
+    List<dynamic> downwardsInferenceDynamicIsOK = [];
+    var upwardsInferNonDynamicIsOK = [42];
+    var explicitDynamicIsOK = <dynamic>[42];
+
+    var rawList = /*info:STRICT_RAW_TYPE*/[];
+    var rawListOfLists = </*info:STRICT_RAW_TYPE*/List>[];
+    /*info:STRICT_RAW_TYPE*/List rawListFromType = [];
+
+    var upwardsInfersDynamic = /*info:STRICT_RAW_TYPE*/[42 as dynamic];
+  }
+
+  {
+    // These should be allowed:
+    List<int> downwardsInferenceIsOK = [];
+    List<dynamic> downwardsInferenceDynamicIsOK = [];
+    var upwardsInferNonDynamicIsOK = [42];
+    var explicitDynamicIsOK = <dynamic>[42];
+
+    var rawList = /*info:STRICT_RAW_TYPE*/[];
+    var rawListOfLists = </*info:STRICT_RAW_TYPE*/List>[];
+    /*info:STRICT_RAW_TYPE*/List rawListFromType = [];
+
+    var upwardsInfersDynamic = /*info:STRICT_RAW_TYPE*/[42 as dynamic];
+  }
+
+  {
+    // These should be allowed:
+    Set<int> downwardsInferenceIsOK = {};
+    Set<dynamic> downwardsInferenceDynamicIsOK = {};
+    var upwardsInferNonDynamicIsOK = {42};
+    var explicitDynamicIsOK = <dynamic>{42};
+
+    var rawSetOfSets = </*info:STRICT_RAW_TYPE*/Set>{};
+    /*info:STRICT_RAW_TYPE*/Set rawSetFromType = {};
+
+    var upwardsInfersDynamic = /*info:STRICT_RAW_TYPE*/{42 as dynamic};
+  }
+
+  {
+    // These should be allowed:
+    Map<int, int> downwardsInferenceIsOK = {};
+    Map<dynamic, int> downwardsInferenceDynamicIsOK1 = {};
+    Map<int, dynamic> downwardsInferenceDynamicIsOK2 = {};
+    Map<dynamic, dynamic> downwardsInferenceDynamicIsOK3 = {};
+
+    var upwardsInferNonDynamicIsOK = {4: 2};
+    var explicitDynamicIsOK = <dynamic, dynamic>{4: 2};
+
+    var rawMap = /*info:STRICT_RAW_TYPE*/{};
+    var rawMapOfMaps = </*info:STRICT_RAW_TYPE*/Map>{};
+    /*info:STRICT_RAW_TYPE*/Map rawMapFromType = {};
+
+    dynamic d;
+    var upwardsInfersDynamic1 = /*info:STRICT_RAW_TYPE*/{d: 2};
+    var upwardsInfersDynamic2 = /*info:STRICT_RAW_TYPE*/{4: d};
+    var upwardsInfersDynamic3 = /*info:STRICT_RAW_TYPE*/{d: d};
+  }
+
+  {
+    Object isCheck;
+    if (isCheck is /*info:STRICT_RAW_TYPE*/List) {}
+    if (isCheck is /*info:STRICT_RAW_TYPE*/C) {}
+
+    if (isCheck is List<dynamic>) {}
+    if (isCheck is List<int>) {}
+    if (isCheck is C<dynamic>) {}
+    if (isCheck is C<int>) {}
+  }
+}
+    ''');
+    await check(strictRawTypes: true);
+  }
+
+  test_strictRawTypes_classes_optionalTypeArgs() async {
+    addFile(r'''
+class _OptionalTypeArgs { const _OptionalTypeArgs(); }
+const optionalTypeArgs = _OptionalTypeArgs();
+    ''', name: 'package:meta/meta.dart');
+
+    addFile(r'''
+import 'package:meta/meta.dart';
+@optionalTypeArgs
+class C<T> {
+  C([T t]);
+}
+
+@optionalTypeArgs
+class M<T> {}
+
+class ExtendRawType extends C {}
+class MixinRawType extends Object with M {}
+class ImplementRawType implements C {}
+class MixinApplicationRawType = Object with M;
+
+C topLevelField;
+C get topLevelGetter => null;
+set topLevelSetter(C c) {}
+
+C returnType() => null;
+parameterType(C c) {}
+
+C<int> explicitTypeArgsAreOK;
+
+main() {
+  // These should be allowed:
+  C<int> downwardsInferenceIsOK = C();
+  C<dynamic> downwardsInferenceDynamicIsOK = C();
+  var inferredFromConstructorParameterIsOK = C(42);
+  var explicitDynamicIsOK = C<dynamic>(42);
+
+  var rawConstructorCall = C();
+  C rawConstructorCallFromType = C();
+  var upwardsInfersDynamic = C(42 as dynamic);
+
+  Object isChecksAreAllowed;
+  if (isChecksAreAllowed is C) {}
+}
+    ''');
+
+    await check(strictRawTypes: true);
+  }
+
+  test_strictRawTypes_typedefs() async {
+    addFile(r'''
+typedef T F1<T>(T _);
+typedef F2<T> = T Function(T);
+typedef G1<T> = S Function<S>(T);
+typedef G2<T> = S Function<S>(S); // right side does not use `T`
+
+typedef G3 = T Function<T>(T); // typedef has no type params.
+
+testTypedefs() {
+  /*info:STRICT_RAW_TYPE*/F1 rawTypedefDart1Syntax;
+  /*info:STRICT_RAW_TYPE*/F2 rawTypedefDart2Syntax;
+  /*info:STRICT_RAW_TYPE*/G1 rawTypedefGenericFunction;
+  /*info:STRICT_RAW_TYPE*/G2 rawTypedefGenericFunction2;
+  {
+    F1<dynamic> explicitTypedefDart1SyntaxIsOK;
+    F2<dynamic> explicitTypedefDart2SyntaxIsOK;
+    G1<dynamic> explicitTypedefGenericFunctionIsOK;
+    G2<dynamic> explicitTypedefGenericFunction2IsOK;
+    G3 typedefWithoutTypeParamsIsOK;
+  }
+  {
+    F1<int> explicitTypedefDart1SyntaxIsOK;
+    F2<int> explicitTypedefDart2SyntaxIsOK;
+    G1<int> explicitTypedefGenericFunctionIsOK;
+    G2<int> explicitTypedefGenericFunction2IsOK;
+  }
+}
+    ''');
+    await check(strictRawTypes: true);
+  }
+
+  test_strictRawTypes_typedefs_optionalTypeArgs() async {
+    addFile(r'''
+class _OptionalTypeArgs { const _OptionalTypeArgs(); }
+const optionalTypeArgs = _OptionalTypeArgs();
+    ''', name: 'package:meta/meta.dart');
+
+    addFile(r'''
+import 'package:meta/meta.dart';
+
+@optionalTypeArgs typedef T F1<T>(T _);
+@optionalTypeArgs typedef F2<T> = T Function(T);
+@optionalTypeArgs typedef G1<T> = S Function<S>(T);
+@optionalTypeArgs typedef G2<T> = S Function<S>(S);
+
+testTypedefs() {
+  F1 rawTypedefDart1Syntax;
+  F2 rawTypedefDart2Syntax;
+  G1 rawTypedefGenericFunction;
+  G2 rawTypedefGenericFunction2;
+}
+    ''');
+    await check(strictRawTypes: true);
+  }
+
   test_superCallPlacement() async {
     await checkFile('''
 class Base {
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index 80c62f1..777c51f 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -6,7 +6,6 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -1309,7 +1308,7 @@
   test_downwardsInferenceOnListLiterals_inferDownwards() async {
     await checkFileElement('''
 void foo([List<String> list1 = /*info:INFERRED_TYPE_LITERAL*/const [],
-          List<String> list2 = /*info:INFERRED_TYPE_LITERAL*/const [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/42]]) {
+          List<String> list2 = /*info:INFERRED_TYPE_LITERAL*/const [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/42]]) {
 }
 
 void main() {
@@ -1340,8 +1339,8 @@
   {
     const List<int> c0 = /*info:INFERRED_TYPE_LITERAL*/const [];
     const List<int> c1 = /*info:INFERRED_TYPE_LITERAL*/const [3];
-    const List<int> c2 = /*info:INFERRED_TYPE_LITERAL*/const [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"];
-    const List<int> c3 = /*info:INFERRED_TYPE_LITERAL*/const [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3];
+    const List<int> c2 = /*info:INFERRED_TYPE_LITERAL*/const [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"];
+    const List<int> c3 = /*info:INFERRED_TYPE_LITERAL*/const [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3];
   }
 }
 ''');
@@ -4493,9 +4492,6 @@
 class InferredTypeTest_SetLiterals extends AbstractStrongTest
     with InferredTypeMixin {
   @override
-  List<String> get enabledExperiments => [EnableString.set_literals];
-
-  @override
   bool get enableNewAnalysisDriver => true;
 
   @override
diff --git a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
index 521f759..38d5a42 100644
--- a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
+++ b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
@@ -238,7 +238,7 @@
 }
 
 class AbstractStrongTest with ResourceProviderMixin {
-  bool _checkCalled = false;
+  bool _checkCalled = true;
 
   AnalysisContext _context = null;
   AnalysisDriver _driver = null;
@@ -266,8 +266,9 @@
   ///
   /// For a single file, you may also use [checkFile].
   void addFile(String content, {String name: '/main.dart'}) {
-    name = name.replaceFirst('^package:', '/packages/');
+    name = name.replaceFirst(RegExp('^package:'), '/packages/');
     newFile(name, content: content);
+    _checkCalled = false;
   }
 
   /// Run the checker on a program, staring from '/main.dart', and verifies that
@@ -278,7 +279,9 @@
   ///
   /// Returns the main resolved library. This can be used for further checks.
   Future<CompilationUnit> check(
-      {bool implicitCasts: true, bool implicitDynamic: true}) async {
+      {bool implicitCasts: true,
+      bool implicitDynamic: true,
+      bool strictRawTypes: false}) async {
     _checkCalled = true;
 
     File mainFile = getFile('/main.dart');
@@ -288,6 +291,7 @@
     analysisOptions.strongModeHints = true;
     analysisOptions.implicitCasts = implicitCasts;
     analysisOptions.implicitDynamic = implicitDynamic;
+    analysisOptions.strictRawTypes = strictRawTypes;
     analysisOptions.enabledExperiments = enabledExperiments;
 
     var mockSdk = new MockSdk(resourceProvider: resourceProvider);
@@ -353,7 +357,12 @@
             e.errorCode != HintCode.UNUSED_FIELD &&
             e.errorCode != HintCode.UNUSED_IMPORT &&
             e.errorCode != HintCode.UNUSED_LOCAL_VARIABLE &&
-            e.errorCode != TodoCode.TODO));
+            e.errorCode != TodoCode.TODO &&
+            // If testing strict-raw-types, ignore other (unrelated) hints.
+            (!strictRawTypes ||
+                e.errorCode.errorSeverity.ordinal >
+                    ErrorSeverity.INFO.ordinal ||
+                e.errorCode == HintCode.STRICT_RAW_TYPE)));
         _expectErrors(analysisOptions, analysisResult.unit, errors);
       }
     }
diff --git a/pkg/analyzer/test/src/task/test_all.dart b/pkg/analyzer/test/src/task/test_all.dart
index f8f989c5..f66959e 100644
--- a/pkg/analyzer/test/src/task/test_all.dart
+++ b/pkg/analyzer/test/src/task/test_all.dart
@@ -6,7 +6,6 @@
 
 import 'dart_work_manager_test.dart' as dart_work_manager_test;
 import 'general_test.dart' as general_test;
-import 'html_work_manager_test.dart' as html_work_manager_test;
 import 'inputs_test.dart' as inputs_test;
 import 'manager_test.dart' as manager_test;
 import 'model_test.dart' as model_test;
@@ -19,7 +18,6 @@
   defineReflectiveSuite(() {
     dart_work_manager_test.main();
     general_test.main();
-    html_work_manager_test.main();
     inputs_test.main();
     manager_test.main();
     model_test.main();
diff --git a/pkg/analyzer/test/util/ast_type_matchers.dart b/pkg/analyzer/test/util/ast_type_matchers.dart
index a56dddf..9682a87 100644
--- a/pkg/analyzer/test/util/ast_type_matchers.dart
+++ b/pkg/analyzer/test/util/ast_type_matchers.dart
@@ -111,13 +111,19 @@
 
 const isFieldFormalParameter = const TypeMatcher<FieldFormalParameter>();
 
-const isForEachStatement = const TypeMatcher<ForEachStatement>();
+/// TODO(paulberry): remove the explicit type `Matcher` once an SDK has been
+/// released that includes ba5644b76cb811e8f01ffb375b87d20d6295749c.
+final Matcher isForEachStatement = predicate(
+    (Object o) => o is ForStatement2 && o.forLoopParts is ForEachParts);
 
 const isFormalParameter = const TypeMatcher<FormalParameter>();
 
 const isFormalParameterList = const TypeMatcher<FormalParameterList>();
 
-const isForStatement = const TypeMatcher<ForStatement>();
+/// TODO(paulberry): remove the explicit type `Matcher` once an SDK has been
+/// released that includes ba5644b76cb811e8f01ffb375b87d20d6295749c.
+final Matcher isForStatement =
+    predicate((Object o) => o is ForStatement2 && o.forLoopParts is ForParts);
 
 const isFunctionBody = const TypeMatcher<FunctionBody>();
 
@@ -179,7 +185,10 @@
 
 const isLiteral = const TypeMatcher<Literal>();
 
-const isMapLiteral = const TypeMatcher<MapLiteral>();
+/// TODO(paulberry): remove the explicit type `Matcher` once an SDK has been
+/// released that includes ba5644b76cb811e8f01ffb375b87d20d6295749c.
+final Matcher isMapLiteral =
+    predicate((Object o) => o is SetOrMapLiteral && o.isMap);
 
 const isMapLiteralEntry = const TypeMatcher<MapLiteralEntry>();
 
@@ -234,7 +243,10 @@
 
 const isScriptTag = const TypeMatcher<ScriptTag>();
 
-const isSetLiteral = const TypeMatcher<SetLiteral>();
+/// TODO(paulberry): remove the explicit type `Matcher` once an SDK has been
+/// released that includes ba5644b76cb811e8f01ffb375b87d20d6295749c.
+final Matcher isSetLiteral =
+    predicate((Object o) => o is SetOrMapLiteral && o.isSet);
 
 const isShowCombinator = const TypeMatcher<ShowCombinator>();
 
diff --git a/pkg/analyzer/tool/summary/generate.dart b/pkg/analyzer/tool/summary/generate.dart
index d4d5157..f3426c1 100644
--- a/pkg/analyzer/tool/summary/generate.dart
+++ b/pkg/analyzer/tool/summary/generate.dart
@@ -21,7 +21,6 @@
 import 'dart:io';
 
 import 'package:analysis_tool/tools.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:front_end/src/fasta/scanner/string_scanner.dart';
 import 'package:front_end/src/scanner/token.dart' show Token;
 import 'package:front_end/src/testing/package_root.dart' as package_root;
@@ -86,7 +85,6 @@
     var startingToken = scanner.tokenize();
     var listener = new MiniAstBuilder();
     var parser = new MiniAstParser(listener);
-    parser.enableSetLiterals = IsEnabledByDefault.set_literals;
     parser.parseUnit(startingToken);
     extractIdl(listener.compilationUnit);
     checkIdl();
@@ -177,6 +175,8 @@
     } else if (_idl.enums.containsKey(type.typeName)) {
       return '${idlPrefix(type.typeName)}.'
           '${_idl.enums[type.typeName].values[0].name}';
+    } else if (type.typeName == 'double') {
+      return '0.0';
     } else if (type.typeName == 'int') {
       return '0';
     } else if (type.typeName == 'String') {
@@ -218,6 +218,7 @@
         bool isDeprecated = false;
         String fileIdentifier;
         String clsName = decl.name;
+        String variantField;
         for (Annotation annotation in decl.metadata) {
           if (annotation.arguments != null &&
               annotation.name == 'TopLevel' &&
@@ -240,11 +241,33 @@
               annotation.name == 'deprecated' &&
               annotation.constructorName == null) {
             isDeprecated = true;
+          } else if (annotation.arguments != null &&
+              annotation.name == 'Variant' &&
+              annotation.constructorName == null) {
+            if (annotation.arguments.length == 1) {
+              Expression arg = annotation.arguments[0];
+              if (arg is StringLiteral) {
+                variantField = arg.stringValue;
+              } else {
+                throw new Exception(
+                  'Class `$clsName`: @Variant argument must be a string literal',
+                );
+              }
+            } else if (annotation.arguments.length != 0) {
+              throw Exception(
+                'Class `$clsName`: @Variant requires 1 argument',
+              );
+            }
           }
         }
-        String doc = _getNodeDoc(decl);
         idlModel.ClassDeclaration cls = new idlModel.ClassDeclaration(
-            doc, clsName, isTopLevel, fileIdentifier, isDeprecated);
+          documentation: _getNodeDoc(decl),
+          name: clsName,
+          isTopLevel: isTopLevel,
+          fileIdentifier: fileIdentifier,
+          isDeprecated: isDeprecated,
+          variantField: variantField,
+        );
         _idl.classes[clsName] = cls;
         String expectedBase = 'base.SummaryClass';
         if (decl.superclass == null || decl.superclass.name != expectedBase) {
@@ -253,61 +276,7 @@
         }
         for (ClassMember classMember in decl.members) {
           if (classMember is MethodDeclaration && classMember.isGetter) {
-            String desc = '$clsName.${classMember.name}';
-            if (classMember.returnType == null) {
-              throw new Exception('Class member needs a type: $desc');
-            }
-            TypeName type = classMember.returnType;
-            bool isList = false;
-            if (type.name == 'List' &&
-                type.typeArguments != null &&
-                type.typeArguments.length == 1) {
-              isList = true;
-              type = type.typeArguments[0];
-            }
-            if (type.typeArguments != null) {
-              throw new Exception('Cannot handle type arguments in `$type`');
-            }
-            int id;
-            bool isDeprecated = false;
-            bool isInformative = false;
-            for (Annotation annotation in classMember.metadata) {
-              if (annotation.name == 'Id') {
-                if (id != null) {
-                  throw new Exception(
-                      'Duplicate @id annotation ($classMember)');
-                }
-                if (annotation.arguments == null) {
-                  throw new Exception('@Id must be passed an argument');
-                }
-                if (annotation.arguments.length != 1) {
-                  throw new Exception(
-                      '@Id must be passed exactly one argument ($desc)');
-                }
-                Expression expression = annotation.arguments[0];
-                if (expression is IntegerLiteral) {
-                  id = expression.value;
-                } else {
-                  throw new Exception(
-                      '@Id parameter must be an integer literal ($desc)');
-                }
-              } else if (annotation.name == 'deprecated') {
-                if (annotation.arguments != null) {
-                  throw new Exception('@deprecated does not take args ($desc)');
-                }
-                isDeprecated = true;
-              } else if (annotation.name == 'informative') {
-                isInformative = true;
-              }
-            }
-            if (id == null) {
-              throw new Exception('Missing @id annotation ($desc)');
-            }
-            String doc = _getNodeDoc(classMember);
-            idlModel.FieldType fieldType =
-                new idlModel.FieldType(type.name, isList);
-            cls.allFields.add(new idlModel.FieldDeclaration(doc,
-                classMember.name, fieldType, id, isDeprecated, isInformative));
+            _addFieldForGetter(cls, classMember);
           } else if (classMember is ConstructorDeclaration &&
               classMember.name.endsWith('fromBuffer')) {
             // Ignore `fromBuffer` declarations; they simply forward to the
@@ -525,6 +494,169 @@
     return json.encode(s);
   }
 
+  void _addFieldForGetter(
+    idlModel.ClassDeclaration cls,
+    MethodDeclaration getter,
+  ) {
+    var desc = '${cls.name}.${getter.name}';
+    if (getter.returnType == null) {
+      throw new Exception('Getter needs a type: $desc');
+    }
+
+    var type = getter.returnType;
+
+    var isList = false;
+    if (type.name == 'List' &&
+        type.typeArguments != null &&
+        type.typeArguments.length == 1) {
+      isList = true;
+      type = type.typeArguments[0];
+    }
+    if (type.typeArguments != null) {
+      throw new Exception('Cannot handle type arguments in `$type`');
+    }
+
+    int id;
+    List<String> variants;
+    bool isDeprecated = false;
+    bool isInformative = false;
+
+    for (Annotation annotation in getter.metadata) {
+      if (annotation.name == 'Id') {
+        if (id != null) {
+          throw new Exception('Duplicate @id annotation ($getter)');
+        }
+        if (annotation.arguments == null) {
+          throw Exception('@Id must be passed an argument ($desc)');
+        }
+        if (annotation.arguments.length != 1) {
+          throw Exception('@Id must be passed exactly one argument ($desc)');
+        }
+
+        var idExpression = annotation.arguments[0];
+        if (idExpression is IntegerLiteral) {
+          id = idExpression.value;
+        } else {
+          throw new Exception(
+            '@Id argument must be an integer literal ($desc)',
+          );
+        }
+      } else if (annotation.name == 'deprecated') {
+        if (annotation.arguments != null) {
+          throw new Exception('@deprecated does not take args ($desc)');
+        }
+        isDeprecated = true;
+      } else if (annotation.name == 'informative') {
+        isInformative = true;
+      } else if (annotation.name == 'VariantId') {
+        if (id != null) {
+          throw Exception('Cannot specify both @Id and @VariantId ($getter)');
+        }
+        if (variants != null) {
+          throw Exception('Duplicate @VariantId annotation ($getter)');
+        }
+
+        if (annotation.arguments == null) {
+          throw Exception('@VariantId must be given arguments ($desc)');
+        }
+        if (annotation.arguments.length != 2) {
+          throw Exception(
+            '@VariantId must be given exactly two arguments ($desc)',
+          );
+        }
+
+        var idExpression = annotation.arguments[0];
+        if (idExpression is IntegerLiteral) {
+          id = idExpression.value;
+        } else {
+          throw Exception(
+            '@VariantId argument must be an integer literal ($desc)',
+          );
+        }
+
+        var variantExpression = annotation.arguments[1];
+        if (variantExpression is NamedExpression) {
+          if (variantExpression.name == 'variant') {
+            variants = [variantExpression.expression.toCode()];
+          } else if (variantExpression.name == 'variantList') {
+            variants = (variantExpression.expression as ListLiteral)
+                .elements
+                .map((e) => e.toCode())
+                .toList();
+          } else {
+            throw Exception(
+              'Only "key" or "keyList" expected in @VariantId ($desc)',
+            );
+          }
+        } else {
+          throw Exception(
+            'The second argument of @VariantId must be named ($desc)',
+          );
+        }
+      }
+    }
+    if (id == null) {
+      throw new Exception('Missing @id annotation ($desc)');
+    }
+
+    var fieldType = new idlModel.FieldType(type.name, isList);
+
+    String name = getter.name;
+    Map<String, List<String>> variantMap;
+    if (variants != null) {
+      var fieldsWithSameId =
+          cls.allFields.where((field) => field.id == id).toList();
+      if (fieldsWithSameId.isNotEmpty) {
+        var existingField = fieldsWithSameId.first;
+        if (existingField.variantMap == null) {
+          throw Exception('$desc: id $id is already used as a non-variant '
+              'field: ${existingField.name}');
+        }
+
+        var map = existingField.variantMap;
+        for (var variant in variants) {
+          for (var logicalName in map.keys) {
+            if (map[logicalName].contains(variant)) {
+              throw Exception('$desc: id $id is already used for $logicalName');
+            }
+          }
+        }
+
+        if (existingField.type != fieldType) {
+          throw Exception(
+            '$desc: id $id is already used with type ${existingField.type}',
+          );
+        }
+
+        map.putIfAbsent(getter.name, () => <String>[]).addAll(variants);
+        return;
+      } else {
+        name = 'variantField_$id';
+        variantMap = <String, List<String>>{getter.name: variants};
+      }
+    }
+
+    cls.allFields.add(
+      idlModel.FieldDeclaration(
+        documentation: _getNodeDoc(getter),
+        name: name,
+        type: fieldType,
+        id: id,
+        isDeprecated: isDeprecated,
+        isInformative: isInformative,
+        variantMap: variantMap,
+      ),
+    );
+  }
+
+  Iterable<String> _computeVariants(idlModel.ClassDeclaration cls) {
+    return cls.fields
+        .map((f) => f.variantMap?.values ?? [])
+        .expand((v) => v)
+        .expand((v) => v)
+        .toSet();
+  }
+
   void _generateBuilder(idlModel.ClassDeclaration cls) {
     String name = cls.name;
     String builderName = name + 'Builder';
@@ -541,6 +673,7 @@
         String typeStr = encodedType(type);
         out('$typeStr _$fieldName;');
       }
+
       // Generate getters and setters.
       for (idlModel.FieldDeclaration field in cls.allFields) {
         String fieldName = field.name;
@@ -549,41 +682,101 @@
         String def = defaultValue(fieldType, true);
         String defSuffix = def == null ? '' : ' ??= $def';
         out();
-        out('@override');
         if (field.isDeprecated) {
+          out('@override');
           out('Null get $fieldName => $_throwDeprecated;');
         } else {
-          out('$typeStr get $fieldName => _$fieldName$defSuffix;');
-          out();
-          outDoc(field.documentation);
-          constructorParams.add('$typeStr $fieldName');
-          out('void set $fieldName($typeStr value) {');
-          indent(() {
-            String stateFieldName = '_' + fieldName;
-            // Validate that int(s) are non-negative.
-            if (fieldType.typeName == 'int') {
-              if (!fieldType.isList) {
-                out('assert(value == null || value >= 0);');
-              } else {
-                out('assert(value == null || value.every((e) => e >= 0));');
-              }
+          if (field.variantMap != null) {
+            for (var logicalName in field.variantMap.keys) {
+              var variants = field.variantMap[logicalName];
+              out('@override');
+              out('$typeStr get $logicalName {');
+              indent(() {
+                out(_variantAssertStatement(cls, variants));
+                out('return _${field.name}$defSuffix;');
+              });
+              out('}');
+              out();
             }
-            // Set the value.
-            out('this.$stateFieldName = value;');
-          });
-          out('}');
+          } else {
+            out('@override');
+            out('$typeStr get $fieldName => _$fieldName$defSuffix;');
+          }
+          out();
+
+          constructorParams.add('$typeStr $fieldName');
+
+          outDoc(field.documentation);
+
+          if (field.variantMap != null) {
+            for (var logicalName in field.variantMap.keys) {
+              var variants = field.variantMap[logicalName];
+              out('void set $logicalName($typeStr value) {');
+              indent(() {
+                out(_variantAssertStatement(cls, variants));
+                _generateNonNegativeInt(fieldType);
+                out('_variantField_${field.id} = value;');
+              });
+              out('}');
+              out();
+            }
+          } else {
+            out('void set $fieldName($typeStr value) {');
+            indent(() {
+              _generateNonNegativeInt(fieldType);
+              out('this._$fieldName = value;');
+            });
+            out('}');
+          }
         }
       }
       // Generate constructor.
       out();
-      out('$builderName({${constructorParams.join(', ')}})');
-      List<idlModel.FieldDeclaration> fields = cls.fields.toList();
-      for (int i = 0; i < fields.length; i++) {
-        idlModel.FieldDeclaration field = fields[i];
-        String prefix = i == 0 ? '  : ' : '    ';
-        String suffix = i == fields.length - 1 ? ';' : ',';
-        out('${prefix}_${field.name} = ${field.name}$suffix');
+      if (cls.variantField != null) {
+        for (var variant in _computeVariants(cls)) {
+          var constructorName = variant.split('.')[1];
+          out('$builderName.$constructorName({');
+
+          for (var field in cls.fields) {
+            if (field.variantMap != null) {
+              for (var property in field.variantMap.keys) {
+                if (field.variantMap[property].contains(variant)) {
+                  out('${encodedType(field.type)} $property,');
+                }
+              }
+            }
+          }
+
+          out('}) : ');
+
+          out('_${cls.variantField} = idl.$variant');
+
+          var separator = ',';
+          for (var field in cls.fields) {
+            if (field.variantMap != null) {
+              for (var property in field.variantMap.keys) {
+                if (field.variantMap[property].contains(variant)) {
+                  out('$separator _${field.name} = $property');
+                  separator = ', ';
+                }
+              }
+            }
+          }
+
+          out(';');
+          out();
+        }
+      } else {
+        out('$builderName({${constructorParams.join(', ')}})');
+        List<idlModel.FieldDeclaration> fields = cls.fields.toList();
+        for (int i = 0; i < fields.length; i++) {
+          idlModel.FieldDeclaration field = fields[i];
+          String prefix = i == 0 ? '  : ' : '    ';
+          String suffix = i == fields.length - 1 ? ';' : ',';
+          out('${prefix}_${field.name} = ${field.name}$suffix');
+        }
       }
+
       // Generate flushInformative().
       {
         out();
@@ -736,6 +929,9 @@
           } else if (fieldType.typeName == 'bool') {
             condition = '$valueName == true';
             writeCode = 'fbBuilder.addBool($index, true);';
+          } else if (fieldType.typeName == 'double') {
+            condition += ' && $valueName != ${defaultValue(fieldType, true)}';
+            writeCode = 'fbBuilder.addFloat64($index, $valueName);';
           } else if (fieldType.typeName == 'int') {
             condition += ' && $valueName != ${defaultValue(fieldType, true)}';
             writeCode = 'fbBuilder.addUint32($index, $valueName);';
@@ -829,6 +1025,8 @@
           }
         } else if (typeName == 'bool') {
           readCode = 'const fb.BoolReader()';
+        } else if (typeName == 'double') {
+          readCode = 'const fb.Float64Reader()';
         } else if (typeName == 'int') {
           readCode = 'const fb.Uint32Reader()';
         } else if (typeName == 'String') {
@@ -841,19 +1039,37 @@
         assert(readCode != null);
         // Write the getter implementation.
         out();
-        out('@override');
         String returnType = dartType(type);
         if (field.isDeprecated) {
+          out('@override');
           out('Null get $fieldName => $_throwDeprecated;');
         } else {
-          out('$returnType get $fieldName {');
-          indent(() {
-            String readExpr =
-                '$readCode.vTableGet(_bc, _bcOffset, $index, $def)';
-            out('_$fieldName ??= $readExpr;');
-            out('return _$fieldName;');
-          });
-          out('}');
+          if (field.variantMap != null) {
+            for (var logicalName in field.variantMap.keys) {
+              var variants = field.variantMap[logicalName];
+              out('@override');
+              out('$returnType get $logicalName {');
+              indent(() {
+                out(_variantAssertStatement(cls, variants));
+                String readExpr =
+                    '$readCode.vTableGet(_bc, _bcOffset, $index, $def)';
+                out('_$fieldName ??= $readExpr;');
+                out('return _$fieldName;');
+              });
+              out('}');
+              out();
+            }
+          } else {
+            out('@override');
+            out('$returnType get $fieldName {');
+            indent(() {
+              String readExpr =
+                  '$readCode.vTableGet(_bc, _bcOffset, $index, $def)';
+              out('_$fieldName ??= $readExpr;');
+              out('return _$fieldName;');
+            });
+            out('}');
+          }
         }
       }
     });
@@ -865,55 +1081,122 @@
     String mixinName = '_${name}Mixin';
     out('abstract class $mixinName implements ${idlPrefix(name)} {');
     indent(() {
+      String jsonCondition(idlModel.FieldType type, String name) {
+        if (type.isList) {
+          return '$name.isNotEmpty';
+        } else {
+          return '$name != ${defaultValue(type, false)}';
+        }
+      }
+
+      String jsonStore(idlModel.FieldType type, String name) {
+        _StringToString convertItem;
+        if (_idl.classes.containsKey(type.typeName)) {
+          convertItem = (String name) => '$name.toJson()';
+        } else if (_idl.enums.containsKey(type.typeName)) {
+          // TODO(paulberry): it would be better to generate a const list of
+          // strings so that we don't have to do this kludge.
+          convertItem = (String name) => "$name.toString().split('.')[1]";
+        } else if (type.typeName == 'double') {
+          convertItem =
+              (String name) => '$name.isFinite ? $name : $name.toString()';
+        }
+        String convertField;
+        if (convertItem == null) {
+          convertField = name;
+        } else if (type.isList) {
+          convertField = '$name.map((_value) =>'
+              ' ${convertItem('_value')}).toList()';
+        } else {
+          convertField = convertItem(name);
+        }
+        return '_result[${quoted(name)}] = $convertField';
+      }
+
       // Write toJson().
       out('@override');
       out('Map<String, Object> toJson() {');
       indent(() {
         out('Map<String, Object> _result = <String, Object>{};');
-        for (idlModel.FieldDeclaration field in cls.fields) {
-          String condition;
-          if (field.type.isList) {
-            condition = '${field.name}.isNotEmpty';
-          } else {
-            condition = '${field.name} != ${defaultValue(field.type, false)}';
-          }
-          _StringToString convertItem;
-          if (_idl.classes.containsKey(field.type.typeName)) {
-            convertItem = (String name) => '$name.toJson()';
-          } else if (_idl.enums.containsKey(field.type.typeName)) {
-            // TODO(paulberry): it would be better to generate a const list of
-            // strings so that we don't have to do this kludge.
-            convertItem = (String name) => "$name.toString().split('.')[1]";
-          } else if (field.type.typeName == 'double') {
-            convertItem =
-                (String name) => '$name.isFinite ? $name : $name.toString()';
-          }
-          String convertField;
-          if (convertItem == null) {
-            convertField = field.name;
-          } else if (field.type.isList) {
-            convertField = '${field.name}.map((_value) =>'
-                ' ${convertItem('_value')}).toList()';
-          } else {
-            convertField = convertItem(field.name);
-          }
-          String storeField = '_result[${quoted(field.name)}] = $convertField';
-          out('if ($condition) $storeField;');
+
+        if (cls.variantField != null) {
+          indent(() {
+            for (idlModel.FieldDeclaration field in cls.fields) {
+              if (field.variantMap == null) {
+                var condition = jsonCondition(field.type, field.name);
+                var storeField = jsonStore(field.type, field.name);
+                out('if ($condition) $storeField;');
+              }
+            }
+            for (var variant in _computeVariants(cls)) {
+              out('if (${cls.variantField} == idl.$variant) {');
+              indent(() {
+                for (idlModel.FieldDeclaration field in cls.fields) {
+                  if (field.variantMap != null) {
+                    for (var logicalName in field.variantMap.keys) {
+                      if (field.variantMap[logicalName].contains(variant)) {
+                        var condition = jsonCondition(field.type, logicalName);
+                        var storeField = jsonStore(field.type, logicalName);
+                        out('if ($condition) $storeField;');
+                      }
+                    }
+                  }
+                }
+              });
+              out('}');
+            }
+          });
+        } else {
+          indent(() {
+            for (idlModel.FieldDeclaration field in cls.fields) {
+              String condition = jsonCondition(field.type, field.name);
+              String storeField = jsonStore(field.type, field.name);
+              out('if ($condition) $storeField;');
+            }
+          });
         }
+
         out('return _result;');
       });
       out('}');
       out();
+
       // Write toMap().
       out('@override');
-      out('Map<String, Object> toMap() => {');
-      indent(() {
-        for (idlModel.FieldDeclaration field in cls.fields) {
-          String fieldName = field.name;
-          out('${quoted(fieldName)}: $fieldName,');
+      if (cls.variantField != null) {
+        out('Map<String, Object> toMap() {');
+        for (var variant in _computeVariants(cls)) {
+          out('if (${cls.variantField} == idl.$variant) {');
+          indent(() {
+            out('return {');
+            for (idlModel.FieldDeclaration field in cls.fields) {
+              if (field.variantMap != null) {
+                for (var logicalName in field.variantMap.keys) {
+                  if (field.variantMap[logicalName].contains(variant)) {
+                    out('${quoted(logicalName)}: $logicalName,');
+                  }
+                }
+              } else {
+                String fieldName = field.name;
+                out('${quoted(fieldName)}: $fieldName,');
+              }
+            }
+            out('};');
+          });
+          out('}');
         }
-      });
-      out('};');
+        out('throw StateError("Unexpected \$${cls.variantField}");');
+        out('}');
+      } else {
+        out('Map<String, Object> toMap() => {');
+        indent(() {
+          for (idlModel.FieldDeclaration field in cls.fields) {
+            String fieldName = field.name;
+            out('${quoted(fieldName)}: $fieldName,');
+          }
+        });
+        out('};');
+      }
       out();
       // Write toString().
       out('@override');
@@ -922,6 +1205,16 @@
     out('}');
   }
 
+  void _generateNonNegativeInt(idlModel.FieldType fieldType) {
+    if (fieldType.typeName == 'int') {
+      if (!fieldType.isList) {
+        out('assert(value == null || value >= 0);');
+      } else {
+        out('assert(value == null || value.every((e) => e >= 0));');
+      }
+    }
+  }
+
   void _generateReader(idlModel.ClassDeclaration cls) {
     String name = cls.name;
     String readerName = '_${name}Reader';
@@ -1020,4 +1313,14 @@
     }
     return null;
   }
+
+  String _variantAssertStatement(
+    idlModel.ClassDeclaration class_,
+    List<String> variants,
+  ) {
+    var assertCondition = variants
+        ?.map((key) => '${class_.variantField} == idl.$key')
+        ?.join(' || ');
+    return 'assert($assertCondition);';
+  }
 }
diff --git a/pkg/analyzer/tool/summary/idl_model.dart b/pkg/analyzer/tool/summary/idl_model.dart
index 31252e2..597e669 100644
--- a/pkg/analyzer/tool/summary/idl_model.dart
+++ b/pkg/analyzer/tool/summary/idl_model.dart
@@ -7,6 +7,8 @@
  * semantic model of the IDL used to code generate summary serialization and
  * deserialization code.
  */
+import 'package:meta/meta.dart';
+
 /**
  * Information about a single class defined in the IDL.
  */
@@ -32,9 +34,16 @@
    */
   final bool isDeprecated;
 
-  ClassDeclaration(String documentation, String name, this.isTopLevel,
-      this.fileIdentifier, this.isDeprecated)
-      : super(documentation, name);
+  final String variantField;
+
+  ClassDeclaration({
+    @required String documentation,
+    @required this.fileIdentifier,
+    @required String name,
+    @required this.isDeprecated,
+    @required this.isTopLevel,
+    @required this.variantField,
+  }) : super(documentation, name);
 
   /**
    * Get the non-deprecated fields defined in the class.
@@ -105,9 +114,20 @@
    */
   final bool isInformative;
 
-  FieldDeclaration(String documentation, String name, this.type, this.id,
-      this.isDeprecated, this.isInformative)
-      : super(documentation, name);
+  /**
+   * Maps logical property names to variants in which this field is available.
+   */
+  final Map<String, List<String>> variantMap;
+
+  FieldDeclaration({
+    @required String documentation,
+    @required String name,
+    @required this.type,
+    @required this.id,
+    @required this.isDeprecated,
+    @required this.isInformative,
+    @required this.variantMap,
+  }) : super(documentation, name);
 }
 
 /**
@@ -128,6 +148,20 @@
   FieldType(this.typeName, this.isList);
 
   @override
+  int get hashCode {
+    var hash = 0x3fffffff & typeName.hashCode;
+    hash = 0x3fffffff & (hash * 31 + (hash ^ isList.hashCode));
+    return hash;
+  }
+
+  bool operator ==(Object other) {
+    if (other is FieldType) {
+      return other.typeName == typeName && other.isList == isList;
+    }
+    return false;
+  }
+
+  @override
   String toString() => isList ? 'List<$typeName>' : typeName;
 }
 
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index 031b497..a4e718e 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -114,7 +114,11 @@
 }
 
 /// "Mini AST" representation of an expression.
-class Expression {}
+class Expression {
+  String toCode() {
+    throw UnimplementedError('$runtimeType');
+  }
+}
 
 /// "Mini AST" representation of an integer literal.
 class IntegerLiteral extends Expression {
@@ -123,6 +127,43 @@
   IntegerLiteral(this.value);
 }
 
+/// "Mini AST" representation of a list literal.
+class ListLiteral extends Expression {
+  final Token leftBracket;
+  final List<Expression> elements;
+  final Token rightBracket;
+
+  ListLiteral(this.leftBracket, this.elements, this.rightBracket);
+
+  @override
+  String toCode() {
+    return '[' + elements.map((e) => e.toCode()).join(', ') + ']';
+  }
+}
+
+/// "Mini AST" representation of a named expression.
+class NamedExpression extends Expression {
+  final String name;
+  final Token colon;
+  final Expression expression;
+
+  NamedExpression(this.name, this.colon, this.expression);
+}
+
+/// "Mini AST" representation of a named expression.
+class PrefixedIdentifier extends Expression {
+  final String prefix;
+  final Token operator;
+  final String identifier;
+
+  PrefixedIdentifier(this.prefix, this.operator, this.identifier);
+
+  @override
+  String toCode() {
+    return '$prefix.$identifier';
+  }
+}
+
 /// "Mini AST" representation of a method declaration.
 class MethodDeclaration extends ClassMember {
   final bool isGetter;
@@ -370,10 +411,15 @@
   @override
   void handleSend(Token beginToken, Token endToken) {
     debugEvent("Send");
-    pop(); // Arguments
+
+    var arguments = pop();
     pop(); // Type arguments
-    pop(); // Receiver
-    push(new UnknownExpression());
+    if (arguments != null) {
+      pop(); // Receiver
+      push(new UnknownExpression());
+    } else {
+      // Property get.
+    }
   }
 
   @override
@@ -383,6 +429,31 @@
   }
 
   @override
+  void handleNamedArgument(Token colon) {
+    var expression = pop();
+    var name = pop();
+    push(NamedExpression(name, colon, expression));
+  }
+
+  @override
+  void handleLiteralList(
+      int count, Token leftBracket, Token constKeyword, Token rightBracket) {
+    debugEvent("LiteralList");
+
+    var elements = List<Object>(count);
+    popList(count, elements);
+    pop(); // type arguments
+
+    push(
+      ListLiteral(
+        leftBracket,
+        List<Expression>.from(elements),
+        rightBracket,
+      ),
+    );
+  }
+
+  @override
   void endTopLevelFields(Token staticToken, Token covariantToken,
       Token varFinalOrConst, int count, Token beginToken, Token endToken) {
     // We ignore top level variable declarations; they are present just to make
@@ -416,9 +487,20 @@
   @override
   void endBinaryExpression(Token token) {
     debugEvent("BinaryExpression");
-    pop(); // RHS
-    pop(); // LHS
-    push(new UnknownExpression());
+
+    if (identical('.', token.stringValue)) {
+      var rightOperand = pop();
+      var leftOperand = pop();
+      if (leftOperand is String && !leftOperand.contains('.')) {
+        push(PrefixedIdentifier(leftOperand, token, rightOperand));
+      } else {
+        push(new UnknownExpression());
+      }
+    } else {
+      pop(); // RHS
+      pop(); // LHS
+      push(new UnknownExpression());
+    }
   }
 
   @override
@@ -486,6 +568,11 @@
     push(new TypeName(name, typeArguments));
   }
 
+  @override
+  void handleNonNullAssertExpression(Token bang) {
+    reportNonNullAssertExpressionNotEnabled(bang);
+  }
+
   /// Calls [pop] and creates a list with the appropriate type parameter `T`
   /// from the resulting `List<dynamic>`.
   List<T> popTypedList<T>() {
diff --git a/pkg/analyzer/tool/task_dependency_graph/check_test.dart b/pkg/analyzer/tool/task_dependency_graph/check_test.dart
deleted file mode 100644
index efc365d..0000000
--- a/pkg/analyzer/tool/task_dependency_graph/check_test.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analysis_tool/tools.dart';
-import 'package:front_end/src/testing/package_root.dart' as package_root;
-import 'package:path/path.dart';
-
-import 'generate.dart';
-
-/**
- * Check that the target file has been code generated.  If it hasn't tell the
- * user to run generate.dart.
- */
-main() async {
-  String pkgPath = normalize(join(package_root.packageRoot, 'analyzer'));
-  await GeneratedContent.checkAll(pkgPath,
-      'tool/task_dependency_graph/generate.dart', <GeneratedContent>[target]);
-}
diff --git a/pkg/analyzer/tool/task_dependency_graph/generate.dart b/pkg/analyzer/tool/task_dependency_graph/generate.dart
deleted file mode 100644
index da4e3a9..0000000
--- a/pkg/analyzer/tool/task_dependency_graph/generate.dart
+++ /dev/null
@@ -1,400 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This file contains code to output a description of tasks and their
- * dependencies in ".dot" format.  Prior to running, the user should run "pub
- * get" in the analyzer directory to ensure that a "packages" folder exists.
- *
- * TODO(paulberry):
- * - Add general.dart and html.dart for completeness.
- * - Use Graphviz's "record" feature to produce more compact output
- *   (http://www.graphviz.org/content/node-shapes#record)
- * - Produce a warning if a result descriptor is found which isn't the output
- *   of exactly one task.
- * - Convert this tool to use package_config to find the package map.
- */
-import 'dart:async';
-import 'dart:io' hide File;
-import 'dart:io' as io;
-
-import 'package:analysis_tool/tools.dart';
-import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/context/builder.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/analysis/file_state.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
-import 'package:analyzer/src/dart/sdk/sdk.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
-import 'package:analyzer/src/generated/constant.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/resolver.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:front_end/src/testing/package_root.dart' as package_root;
-import 'package:path/path.dart' as path;
-import 'package:path/path.dart';
-
-/**
- * Generate the target .dot file.
- */
-main() async {
-  String pkgPath = normalize(join(package_root.packageRoot, 'analyzer'));
-  await GeneratedContent.generateAll(
-      pkgPath, <GeneratedContent>[target, htmlTarget]);
-}
-
-final GeneratedFile htmlTarget = new GeneratedFile(
-    'doc/tasks.html', (String pkgPath) => new Driver(pkgPath).generateHtml());
-
-final GeneratedFile target = new GeneratedFile(
-    'tool/task_dependency_graph/tasks.dot',
-    (String pkgPath) => new Driver(pkgPath).generateFileContents());
-
-typedef void GetterFinderCallback(PropertyAccessorElement element);
-
-class Driver {
-  static bool hasInitializedPlugins = false;
-  PhysicalResourceProvider resourceProvider;
-  AnalysisDriver driver;
-  InterfaceType resultDescriptorType;
-  InterfaceType listOfResultDescriptorType;
-  ClassElement enginePluginClass;
-  CompilationUnitElement taskUnitElement;
-  InterfaceType extensionPointIdType;
-
-  final String rootDir;
-
-  Driver(String pkgPath) : rootDir = new Directory(pkgPath).absolute.path;
-
-  /**
-   * Get an [io.File] object corresponding to the file in which the generated
-   * graph should be output.
-   */
-  io.File get file => new io.File(
-      path.join(rootDir, 'tool', 'task_dependency_graph', 'tasks.dot'));
-
-  /**
-   * Starting at [node], find all calls to registerExtension() which refer to
-   * the given [extensionIdVariable], and execute [callback] for the associated
-   * result descriptors.
-   */
-  void findExtensions(AstNode node, TopLevelVariableElement extensionIdVariable,
-      void callback(String descriptorName)) {
-    Set<PropertyAccessorElement> resultDescriptors =
-        new Set<PropertyAccessorElement>();
-    node.accept(new ExtensionFinder(
-        resultDescriptorType, extensionIdVariable, resultDescriptors.add));
-    for (PropertyAccessorElement resultDescriptor in resultDescriptors) {
-      callback(resultDescriptor.name);
-    }
-  }
-
-  /**
-   * Starting at [node], find all references to a getter of type
-   * `List<ResultDescriptor>`, and execute [callback] on the getter names.
-   */
-  void findResultDescriptorLists(
-      AstNode node, void callback(String descriptorListName)) {
-    Set<PropertyAccessorElement> resultDescriptorLists =
-        new Set<PropertyAccessorElement>();
-    node.accept(new GetterFinder(
-        listOfResultDescriptorType, resultDescriptorLists.add));
-    for (PropertyAccessorElement resultDescriptorList
-        in resultDescriptorLists) {
-      // We only care about result descriptor lists associated with getters in
-      // the engine plugin class.
-      if (resultDescriptorList.enclosingElement != enginePluginClass) {
-        continue;
-      }
-      callback(resultDescriptorList.name);
-    }
-  }
-
-  void findResultDescriptors(
-      AstNode node, void callback(String descriptorName)) {
-    Set<PropertyAccessorElement> resultDescriptors =
-        new Set<PropertyAccessorElement>();
-    node.accept(new GetterFinder(resultDescriptorType, resultDescriptors.add));
-    for (PropertyAccessorElement resultDescriptor in resultDescriptors) {
-      callback(resultDescriptor.name);
-    }
-  }
-
-  /**
-   * Generate the task dependency graph and return it as a [String].
-   */
-  Future<String> generateFileContents() async {
-    String data = await generateGraphData();
-    return '''
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// This file has been automatically generated.  Please do not edit it manually.
-// To regenerate the file, use the script
-// "pkg/analyzer/tool/task_dependency_graph/generate.dart".
-//
-// To render this graph using Graphviz (www.graphviz.org) use the command:
-// "dot tasks.dot -Tpdf -O".
-digraph G {
-$data
-}
-''';
-  }
-
-  Future<String> generateGraphData() async {
-    if (!hasInitializedPlugins) {
-      AnalysisEngine.instance.processRequiredPlugins();
-      hasInitializedPlugins = true;
-    }
-    List<String> lines = <String>[];
-    resourceProvider = PhysicalResourceProvider.INSTANCE;
-    DartSdk sdk = new FolderBasedDartSdk(resourceProvider,
-        FolderBasedDartSdk.defaultSdkDirectory(resourceProvider));
-
-    ContextBuilderOptions builderOptions = new ContextBuilderOptions();
-    if (Platform.packageConfig != null) {
-      builderOptions.defaultPackageFilePath =
-          Uri.parse(Platform.packageConfig).toFilePath();
-    } else {
-      // Let the context builder use the default algorithm for package
-      // resolution.
-    }
-
-    ContextBuilder builder = new ContextBuilder(resourceProvider, null, null,
-        options: builderOptions);
-    List<UriResolver> uriResolvers = [
-      new DartUriResolver(sdk),
-      new PackageMapUriResolver(resourceProvider,
-          builder.convertPackagesToMap(builder.createPackageMap(''))),
-      new ResourceUriResolver(resourceProvider)
-    ];
-
-    var logger = new PerformanceLog(null);
-    var scheduler = new AnalysisDriverScheduler(logger);
-    driver = new AnalysisDriver(
-        scheduler,
-        logger,
-        resourceProvider,
-        new MemoryByteStore(),
-        new FileContentOverlay(),
-        null,
-        new SourceFactory(uriResolvers),
-        new AnalysisOptionsImpl());
-    scheduler.start();
-
-    TypeProvider typeProvider = await driver.currentSession.typeProvider;
-
-    String dartDartPath = path.join(rootDir, 'lib', 'src', 'task', 'dart.dart');
-    String taskPath = path.join(rootDir, 'lib', 'src', 'plugin', 'task.dart');
-    String modelPath =
-        path.join(rootDir, 'lib', 'src', 'task', 'api', 'model.dart');
-    String enginePluginPath =
-        path.join(rootDir, 'lib', 'src', 'plugin', 'engine_plugin.dart');
-
-    CompilationUnitElement modelElement = await getUnitElement(modelPath);
-    InterfaceType analysisTaskType = modelElement.getType('AnalysisTask').type;
-    DartType dynamicType = typeProvider.dynamicType;
-    resultDescriptorType = modelElement
-        .getType('ResultDescriptor')
-        .type
-        .instantiate([dynamicType]);
-    listOfResultDescriptorType =
-        typeProvider.listType.instantiate([resultDescriptorType]);
-    CompilationUnit enginePluginUnit = await getUnit(enginePluginPath);
-    enginePluginClass =
-        enginePluginUnit.declaredElement.getType('EnginePlugin');
-    extensionPointIdType =
-        enginePluginUnit.declaredElement.getType('ExtensionPointId').type;
-    CompilationUnit dartDartUnit = await getUnit(dartDartPath);
-    CompilationUnit taskUnit = await getUnit(taskPath);
-    taskUnitElement = taskUnit.declaredElement;
-    Set<String> results = new Set<String>();
-    Set<String> resultLists = new Set<String>();
-    for (CompilationUnitMember dartUnitMember in dartDartUnit.declarations) {
-      if (dartUnitMember is ClassDeclaration) {
-        ClassDeclaration clazz = dartUnitMember;
-        if (!clazz.isAbstract &&
-            clazz.declaredElement.type.isSubtypeOf(analysisTaskType)) {
-          String task = clazz.name.name;
-
-          MethodDeclaration buildInputsAst;
-          VariableDeclaration descriptorField;
-          for (ClassMember classMember in clazz.members) {
-            if (classMember is MethodDeclaration &&
-                classMember.name.name == 'buildInputs') {
-              buildInputsAst = classMember;
-            }
-            if (classMember is FieldDeclaration) {
-              for (VariableDeclaration field in classMember.fields.variables) {
-                if (field.name.name == 'DESCRIPTOR') {
-                  descriptorField = field;
-                }
-              }
-            }
-          }
-
-          findResultDescriptors(buildInputsAst, (String input) {
-            results.add(input);
-            lines.add('  $input -> $task');
-          });
-          findResultDescriptorLists(buildInputsAst, (String input) {
-            resultLists.add(input);
-            lines.add('  $input -> $task');
-          });
-          findResultDescriptors(descriptorField, (String out) {
-            results.add(out);
-            lines.add('  $task -> $out');
-          });
-        }
-      }
-    }
-    for (String resultList in resultLists) {
-      lines.add('  $resultList [shape=hexagon]');
-      TopLevelVariableElement extensionIdVariable = _getExtensionId(resultList);
-      findExtensions(enginePluginUnit, extensionIdVariable, (String extension) {
-        results.add(extension);
-        lines.add('  $extension -> $resultList');
-      });
-    }
-    for (String result in results) {
-      lines.add('  $result [shape=box]');
-    }
-    lines.sort();
-    return lines.join('\n');
-  }
-
-  Future<String> generateHtml() async {
-    var data = await generateGraphData();
-    return '''
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Analysis Task Dependency Graph</title>
-    <link rel="stylesheet" href="support/style.css">
-    <script src="support/viz.js"></script>
-    <script type="application/dart" src="support/web_app.dart.js"></script>
-    <script src="support/dart.js"></script>
-</head>
-<body>
-<button id="zoomBtn">Zoom</button>
-<script type="text/vnd.graphviz" id="dot">
-digraph G {
-  tooltip="Analysis Task Dependency Graph";
-  node [fontname=Helvetica];
-  edge [fontname=Helvetica, fontcolor=gray];
-$data
-}
-</script>
-</body>
-</html>
-''';
-  }
-
-  Future<CompilationUnit> getUnit(String path) async {
-    var result = await driver.getResult(path);
-    return result.unit;
-  }
-
-  Future<CompilationUnitElement> getUnitElement(String path) async {
-    UnitElementResult result = await driver.getUnitElement(path);
-    return result.element;
-  }
-
-  /**
-   * Find the result list getter having name [resultListGetterName] in the
-   * [EnginePlugin] class, and use the [ExtensionPointId] annotation on that
-   * getter to find the associated [TopLevelVariableElement] which can be used
-   * to register extensions for that getter.
-   */
-  TopLevelVariableElement _getExtensionId(String resultListGetterName) {
-    PropertyAccessorElement getter =
-        enginePluginClass.getGetter(resultListGetterName);
-    for (ElementAnnotation annotation in getter.metadata) {
-      DartObjectImpl annotationValue = annotation.constantValue;
-      if (annotationValue.type.isSubtypeOf(extensionPointIdType)) {
-        String extensionPointId =
-            annotationValue.fields['extensionPointId'].toStringValue();
-        for (TopLevelVariableElement variable
-            in taskUnitElement.topLevelVariables) {
-          if (variable.name == extensionPointId) {
-            return variable;
-          }
-        }
-      }
-    }
-    throw new Exception(
-        'Could not find extension ID corresponding to $resultListGetterName');
-  }
-}
-
-/**
- * Visitor that finds calls that register extension points.  Specifically, we
- * look for calls of the form `method(extensionIdVariable, resultDescriptor)`,
- * where `resultDescriptor` has type [resultDescriptorType], and we pass the
- * corresponding result descriptor names to [callback].
- */
-class ExtensionFinder extends GeneralizingAstVisitor {
-  final InterfaceType resultDescriptorType;
-  final TopLevelVariableElement extensionIdVariable;
-  final GetterFinderCallback callback;
-
-  ExtensionFinder(
-      this.resultDescriptorType, this.extensionIdVariable, this.callback);
-
-  @override
-  visitIdentifier(Identifier node) {
-    Element element = node.staticElement;
-    if (element is PropertyAccessorElement &&
-        element.isGetter &&
-        element.variable == extensionIdVariable) {
-      AstNode parent = node.parent;
-      if (parent is ArgumentList &&
-          parent.arguments.length == 2 &&
-          parent.arguments[0] == node) {
-        Expression extension = parent.arguments[1];
-        if (extension is Identifier) {
-          Element element = extension.staticElement;
-          if (element is PropertyAccessorElement &&
-              element.isGetter &&
-              element.returnType.isSubtypeOf(resultDescriptorType)) {
-            callback(element);
-            return;
-          }
-        }
-      }
-      throw new Exception('Could not decode extension setup: $parent');
-    }
-  }
-}
-
-/**
- * Visitor that finds references to getters having a specific type (or a
- * subtype of that type)
- */
-class GetterFinder extends GeneralizingAstVisitor {
-  final InterfaceType type;
-  final GetterFinderCallback callback;
-
-  GetterFinder(this.type, this.callback);
-
-  @override
-  visitIdentifier(Identifier node) {
-    Element element = node.staticElement;
-    if (element is PropertyAccessorElement &&
-        element.isGetter &&
-        element.returnType.isSubtypeOf(type)) {
-      callback(element);
-    }
-  }
-}
diff --git a/pkg/analyzer/tool/task_dependency_graph/tasks.dot b/pkg/analyzer/tool/task_dependency_graph/tasks.dot
deleted file mode 100644
index a812143..0000000
--- a/pkg/analyzer/tool/task_dependency_graph/tasks.dot
+++ /dev/null
@@ -1,363 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// This file has been automatically generated.  Please do not edit it manually.
-// To regenerate the file, use the script
-// "pkg/analyzer/tool/task_dependency_graph/generate.dart".
-//
-// To render this graph using Graphviz (www.graphviz.org) use the command:
-// "dot tasks.dot -Tpdf -O".
-digraph G {
-  BUILD_DIRECTIVES_ERRORS -> LibraryUnitErrorsTask
-  BUILD_DIRECTIVES_ERRORS [shape=box]
-  BUILD_LIBRARY_ERRORS -> LibraryUnitErrorsTask
-  BUILD_LIBRARY_ERRORS [shape=box]
-  BuildCompilationUnitElementTask -> COMPILATION_UNIT_CONSTANTS
-  BuildCompilationUnitElementTask -> COMPILATION_UNIT_ELEMENT
-  BuildCompilationUnitElementTask -> CREATED_RESOLVED_UNIT1
-  BuildCompilationUnitElementTask -> RESOLVED_UNIT1
-  BuildDirectiveElementsTask -> BUILD_DIRECTIVES_ERRORS
-  BuildDirectiveElementsTask -> LIBRARY_ELEMENT2
-  BuildEnumMemberElementsTask -> CREATED_RESOLVED_UNIT3
-  BuildEnumMemberElementsTask -> RESOLVED_UNIT3
-  BuildExportNamespaceTask -> LIBRARY_ELEMENT4
-  BuildLibraryElementTask -> BUILD_LIBRARY_ERRORS
-  BuildLibraryElementTask -> IS_LAUNCHABLE
-  BuildLibraryElementTask -> LIBRARY_ELEMENT1
-  BuildPublicNamespaceTask -> LIBRARY_ELEMENT3
-  BuildSourceExportClosureTask -> EXPORT_SOURCE_CLOSURE
-  BuildTypeProviderTask -> TYPE_PROVIDER
-  COMPILATION_UNIT_CONSTANTS -> EvaluateUnitConstantsTask
-  COMPILATION_UNIT_CONSTANTS [shape=box]
-  COMPILATION_UNIT_ELEMENT [shape=box]
-  CONSTANT_DEPENDENCIES -> ComputeConstantValueTask
-  CONSTANT_DEPENDENCIES [shape=box]
-  CONSTANT_EXPRESSIONS_DEPENDENCIES -> EvaluateUnitConstantsTask
-  CONSTANT_EXPRESSIONS_DEPENDENCIES [shape=box]
-  CONSTANT_EXPRESSION_RESOLVED -> ComputeConstantDependenciesTask
-  CONSTANT_EXPRESSION_RESOLVED [shape=box]
-  CONSTANT_VALUE -> ComputeConstantValueTask
-  CONSTANT_VALUE -> EvaluateUnitConstantsTask
-  CONSTANT_VALUE -> VerifyUnitTask
-  CONSTANT_VALUE [shape=box]
-  CONTAINING_LIBRARIES -> DartErrorsTask
-  CONTAINING_LIBRARIES [shape=box]
-  CONTENT -> ScanDartTask
-  CONTENT [shape=box]
-  CREATED_RESOLVED_UNIT [shape=box]
-  CREATED_RESOLVED_UNIT1 [shape=box]
-  CREATED_RESOLVED_UNIT10 -> InferInstanceMembersInUnitTask
-  CREATED_RESOLVED_UNIT10 -> InferStaticVariableTypeTask
-  CREATED_RESOLVED_UNIT10 -> PartiallyResolveUnitReferencesTask
-  CREATED_RESOLVED_UNIT10 -> ResolveInstanceFieldsInUnitTask
-  CREATED_RESOLVED_UNIT10 -> ResolveUnitTask
-  CREATED_RESOLVED_UNIT10 [shape=box]
-  CREATED_RESOLVED_UNIT11 -> ResolveConstantExpressionTask
-  CREATED_RESOLVED_UNIT11 [shape=box]
-  CREATED_RESOLVED_UNIT12 [shape=box]
-  CREATED_RESOLVED_UNIT2 [shape=box]
-  CREATED_RESOLVED_UNIT3 [shape=box]
-  CREATED_RESOLVED_UNIT4 [shape=box]
-  CREATED_RESOLVED_UNIT5 [shape=box]
-  CREATED_RESOLVED_UNIT6 [shape=box]
-  CREATED_RESOLVED_UNIT7 [shape=box]
-  CREATED_RESOLVED_UNIT8 -> ResolveInstanceFieldsInUnitTask
-  CREATED_RESOLVED_UNIT8 [shape=box]
-  CREATED_RESOLVED_UNIT9 -> InferInstanceMembersInUnitTask
-  CREATED_RESOLVED_UNIT9 [shape=box]
-  ComputeConstantDependenciesTask -> CONSTANT_DEPENDENCIES
-  ComputeConstantValueTask -> CONSTANT_VALUE
-  ComputeInferableStaticVariableDependenciesTask -> INFERABLE_STATIC_VARIABLE_DEPENDENCIES
-  ComputeLibraryCycleTask -> LIBRARY_CYCLE
-  ComputeLibraryCycleTask -> LIBRARY_CYCLE_DEPENDENCIES
-  ComputeLibraryCycleTask -> LIBRARY_CYCLE_UNITS
-  ComputeRequiredConstantsTask -> PENDING_ERRORS
-  ComputeRequiredConstantsTask -> REQUIRED_CONSTANTS
-  ContainingLibrariesTask -> CONTAINING_LIBRARIES
-  DART_ERRORS -> LibraryErrorsReadyTask
-  DART_ERRORS [shape=box]
-  DART_SCRIPTS -> ScanDartTask
-  DART_SCRIPTS [shape=box]
-  DartErrorsTask -> DART_ERRORS
-  EXPLICITLY_IMPORTED_LIBRARIES [shape=box]
-  EXPORTED_LIBRARIES -> BuildDirectiveElementsTask
-  EXPORTED_LIBRARIES -> ReadyLibraryElement2Task
-  EXPORTED_LIBRARIES -> ReadyLibraryElement5Task
-  EXPORTED_LIBRARIES -> ReadyLibraryElement7Task
-  EXPORTED_LIBRARIES -> ResolveDirectiveElementsTask
-  EXPORTED_LIBRARIES -> ResolveTopLevelLibraryTypeBoundsTask
-  EXPORTED_LIBRARIES [shape=box]
-  EXPORT_SOURCE_CLOSURE -> BuildExportNamespaceTask
-  EXPORT_SOURCE_CLOSURE -> ResolveTopLevelUnitTypeBoundsTask
-  EXPORT_SOURCE_CLOSURE [shape=box]
-  EvaluateUnitConstantsTask -> CREATED_RESOLVED_UNIT12
-  EvaluateUnitConstantsTask -> RESOLVED_UNIT12
-  GatherUsedImportedElementsTask -> USED_IMPORTED_ELEMENTS
-  GatherUsedLocalElementsTask -> USED_LOCAL_ELEMENTS
-  GenerateHintsTask -> HINTS
-  GenerateLintsTask -> LINTS
-  HINTS -> LibraryUnitErrorsTask
-  HINTS [shape=box]
-  IGNORE_INFO -> DartErrorsTask
-  IGNORE_INFO [shape=box]
-  IMPORTED_LIBRARIES -> BuildDirectiveElementsTask
-  IMPORTED_LIBRARIES -> ReadyLibraryElement2Task
-  IMPORTED_LIBRARIES -> ReadyLibraryElement5Task
-  IMPORTED_LIBRARIES -> ReadyLibraryElement7Task
-  IMPORTED_LIBRARIES -> ResolveDirectiveElementsTask
-  IMPORTED_LIBRARIES -> ResolveTopLevelLibraryTypeBoundsTask
-  IMPORTED_LIBRARIES -> ResolveTopLevelUnitTypeBoundsTask
-  IMPORTED_LIBRARIES [shape=box]
-  INCLUDED_PARTS -> BuildLibraryElementTask
-  INCLUDED_PARTS [shape=box]
-  INFERABLE_STATIC_VARIABLES_IN_UNIT -> InferStaticVariableTypesInUnitTask
-  INFERABLE_STATIC_VARIABLES_IN_UNIT [shape=box]
-  INFERABLE_STATIC_VARIABLE_DEPENDENCIES -> InferStaticVariableTypeTask
-  INFERABLE_STATIC_VARIABLE_DEPENDENCIES [shape=box]
-  INFERRED_STATIC_VARIABLE -> InferStaticVariableTypeTask
-  INFERRED_STATIC_VARIABLE -> InferStaticVariableTypesInUnitTask
-  INFERRED_STATIC_VARIABLE [shape=box]
-  IS_LAUNCHABLE [shape=box]
-  InferInstanceMembersInUnitTask -> CREATED_RESOLVED_UNIT10
-  InferInstanceMembersInUnitTask -> RESOLVED_UNIT10
-  InferStaticVariableTypeTask -> INFERRED_STATIC_VARIABLE
-  InferStaticVariableTypeTask -> STATIC_VARIABLE_RESOLUTION_ERRORS
-  InferStaticVariableTypesInUnitTask -> CREATED_RESOLVED_UNIT8
-  InferStaticVariableTypesInUnitTask -> RESOLVED_UNIT8
-  InferStaticVariableTypesInUnitTask -> STATIC_VARIABLE_RESOLUTION_ERRORS_IN_UNIT
-  LIBRARY_CYCLE [shape=box]
-  LIBRARY_CYCLE_DEPENDENCIES -> InferInstanceMembersInUnitTask
-  LIBRARY_CYCLE_DEPENDENCIES -> InferStaticVariableTypeTask
-  LIBRARY_CYCLE_DEPENDENCIES -> PartiallyResolveUnitReferencesTask
-  LIBRARY_CYCLE_DEPENDENCIES -> ResolveInstanceFieldsInUnitTask
-  LIBRARY_CYCLE_DEPENDENCIES [shape=box]
-  LIBRARY_CYCLE_UNITS -> InferInstanceMembersInUnitTask
-  LIBRARY_CYCLE_UNITS -> ResolveInstanceFieldsInUnitTask
-  LIBRARY_CYCLE_UNITS -> ResolveUnitTask
-  LIBRARY_CYCLE_UNITS [shape=box]
-  LIBRARY_ELEMENT -> LibraryErrorsReadyTask
-  LIBRARY_ELEMENT [shape=box]
-  LIBRARY_ELEMENT1 -> BuildDirectiveElementsTask
-  LIBRARY_ELEMENT1 -> ResolveVariableReferencesTask
-  LIBRARY_ELEMENT1 [shape=box]
-  LIBRARY_ELEMENT2 -> BuildPublicNamespaceTask
-  LIBRARY_ELEMENT2 -> BuildSourceExportClosureTask
-  LIBRARY_ELEMENT2 -> ComputeLibraryCycleTask
-  LIBRARY_ELEMENT2 -> ReadyLibraryElement2Task
-  LIBRARY_ELEMENT2 -> ResolveDirectiveElementsTask
-  LIBRARY_ELEMENT2 [shape=box]
-  LIBRARY_ELEMENT3 -> BuildExportNamespaceTask
-  LIBRARY_ELEMENT3 -> BuildTypeProviderTask
-  LIBRARY_ELEMENT3 [shape=box]
-  LIBRARY_ELEMENT4 -> ResolveTopLevelLibraryTypeBoundsTask
-  LIBRARY_ELEMENT4 -> ResolveTopLevelUnitTypeBoundsTask
-  LIBRARY_ELEMENT4 [shape=box]
-  LIBRARY_ELEMENT5 -> ResolveLibraryTypeNamesTask
-  LIBRARY_ELEMENT5 -> ResolveTopLevelLibraryTypeBoundsTask
-  LIBRARY_ELEMENT5 -> ResolveUnitTypeNamesTask
-  LIBRARY_ELEMENT5 [shape=box]
-  LIBRARY_ELEMENT6 -> PartiallyResolveUnitReferencesTask
-  LIBRARY_ELEMENT6 -> ReadyLibraryElement5Task
-  LIBRARY_ELEMENT6 -> ResolveInstanceFieldsInUnitTask
-  LIBRARY_ELEMENT6 -> ResolvedUnit7InLibraryTask
-  LIBRARY_ELEMENT6 [shape=box]
-  LIBRARY_ELEMENT7 -> ReadyLibraryElement7Task
-  LIBRARY_ELEMENT7 -> ResolvedUnit7InLibraryClosureTask
-  LIBRARY_ELEMENT7 [shape=box]
-  LIBRARY_ELEMENT8 -> ResolveLibraryReferencesTask
-  LIBRARY_ELEMENT8 -> ResolveUnitTask
-  LIBRARY_ELEMENT8 [shape=box]
-  LIBRARY_ELEMENT9 -> EvaluateUnitConstantsTask
-  LIBRARY_ELEMENT9 -> ResolveLibraryTask
-  LIBRARY_ELEMENT9 [shape=box]
-  LIBRARY_ERRORS_READY [shape=box]
-  LIBRARY_SPECIFIC_UNITS -> GenerateHintsTask
-  LIBRARY_SPECIFIC_UNITS -> ReadyResolvedUnitTask
-  LIBRARY_SPECIFIC_UNITS -> ResolveLibraryReferencesTask
-  LIBRARY_SPECIFIC_UNITS -> ResolveLibraryTypeNamesTask
-  LIBRARY_SPECIFIC_UNITS -> ResolveTopLevelLibraryTypeBoundsTask
-  LIBRARY_SPECIFIC_UNITS -> ResolvedUnit7InLibraryTask
-  LIBRARY_SPECIFIC_UNITS [shape=box]
-  LIBRARY_UNIT_ERRORS -> dartErrorsForUnit
-  LIBRARY_UNIT_ERRORS [shape=box]
-  LINE_INFO -> BuildCompilationUnitElementTask
-  LINE_INFO -> DartErrorsTask
-  LINE_INFO -> ParseDartTask
-  LINE_INFO [shape=box]
-  LINTS -> LibraryUnitErrorsTask
-  LINTS [shape=box]
-  LibraryErrorsReadyTask -> LIBRARY_ERRORS_READY
-  LibraryUnitErrorsTask -> LIBRARY_UNIT_ERRORS
-  MODIFICATION_TIME -> BuildDirectiveElementsTask
-  MODIFICATION_TIME -> BuildLibraryElementTask
-  MODIFICATION_TIME -> ParseDartTask
-  MODIFICATION_TIME -> ResolveDirectiveElementsTask
-  MODIFICATION_TIME -> ScanDartTask
-  MODIFICATION_TIME -> VerifyUnitTask
-  MODIFICATION_TIME [shape=box]
-  PARSED_UNIT -> BuildCompilationUnitElementTask
-  PARSED_UNIT [shape=box]
-  PARSE_ERRORS -> dartErrorsForSource
-  PARSE_ERRORS [shape=box]
-  PENDING_ERRORS -> VerifyUnitTask
-  PENDING_ERRORS [shape=box]
-  ParseDartTask -> EXPLICITLY_IMPORTED_LIBRARIES
-  ParseDartTask -> EXPORTED_LIBRARIES
-  ParseDartTask -> IMPORTED_LIBRARIES
-  ParseDartTask -> INCLUDED_PARTS
-  ParseDartTask -> LIBRARY_SPECIFIC_UNITS
-  ParseDartTask -> PARSED_UNIT
-  ParseDartTask -> PARSE_ERRORS
-  ParseDartTask -> REFERENCED_SOURCES
-  ParseDartTask -> SOURCE_KIND
-  ParseDartTask -> UNITS
-  PartiallyResolveUnitReferencesTask -> CREATED_RESOLVED_UNIT7
-  PartiallyResolveUnitReferencesTask -> INFERABLE_STATIC_VARIABLES_IN_UNIT
-  PartiallyResolveUnitReferencesTask -> RESOLVED_UNIT7
-  READY_LIBRARY_ELEMENT2 -> ComputeLibraryCycleTask
-  READY_LIBRARY_ELEMENT2 -> ReadyLibraryElement2Task
-  READY_LIBRARY_ELEMENT2 [shape=box]
-  READY_LIBRARY_ELEMENT6 -> PartiallyResolveUnitReferencesTask
-  READY_LIBRARY_ELEMENT6 -> ReadyLibraryElement5Task
-  READY_LIBRARY_ELEMENT6 [shape=box]
-  READY_LIBRARY_ELEMENT7 -> ReadyLibraryElement7Task
-  READY_LIBRARY_ELEMENT7 -> ResolvedUnit7InLibraryClosureTask
-  READY_LIBRARY_ELEMENT7 [shape=box]
-  READY_RESOLVED_UNIT -> ResolveLibraryTask
-  READY_RESOLVED_UNIT -> VerifyUnitTask
-  READY_RESOLVED_UNIT [shape=box]
-  REFERENCED_SOURCES -> BuildDirectiveElementsTask
-  REFERENCED_SOURCES -> ResolveDirectiveElementsTask
-  REFERENCED_SOURCES -> VerifyUnitTask
-  REFERENCED_SOURCES [shape=box]
-  REQUIRED_CONSTANTS -> VerifyUnitTask
-  REQUIRED_CONSTANTS [shape=box]
-  RESOLVED_UNIT -> ComputeRequiredConstantsTask
-  RESOLVED_UNIT -> GenerateHintsTask
-  RESOLVED_UNIT -> GenerateLintsTask
-  RESOLVED_UNIT -> ReadyResolvedUnitTask
-  RESOLVED_UNIT -> VerifyUnitTask
-  RESOLVED_UNIT [shape=box]
-  RESOLVED_UNIT1 -> BuildDirectiveElementsTask
-  RESOLVED_UNIT1 -> BuildLibraryElementTask
-  RESOLVED_UNIT1 -> ResolveDirectiveElementsTask
-  RESOLVED_UNIT1 [shape=box]
-  RESOLVED_UNIT10 -> ResolveUnitTask
-  RESOLVED_UNIT10 [shape=box]
-  RESOLVED_UNIT11 -> EvaluateUnitConstantsTask
-  RESOLVED_UNIT11 -> GatherUsedImportedElementsTask
-  RESOLVED_UNIT11 -> GatherUsedLocalElementsTask
-  RESOLVED_UNIT11 -> ResolveLibraryReferencesTask
-  RESOLVED_UNIT11 [shape=box]
-  RESOLVED_UNIT12 -> StrongModeVerifyUnitTask
-  RESOLVED_UNIT12 [shape=box]
-  RESOLVED_UNIT2 -> BuildEnumMemberElementsTask
-  RESOLVED_UNIT2 [shape=box]
-  RESOLVED_UNIT3 -> ResolveTopLevelUnitTypeBoundsTask
-  RESOLVED_UNIT3 [shape=box]
-  RESOLVED_UNIT4 -> ResolveTopLevelLibraryTypeBoundsTask
-  RESOLVED_UNIT4 -> ResolveUnitTypeNamesTask
-  RESOLVED_UNIT4 [shape=box]
-  RESOLVED_UNIT5 -> ResolveLibraryTypeNamesTask
-  RESOLVED_UNIT5 -> ResolveVariableReferencesTask
-  RESOLVED_UNIT5 [shape=box]
-  RESOLVED_UNIT6 -> PartiallyResolveUnitReferencesTask
-  RESOLVED_UNIT6 [shape=box]
-  RESOLVED_UNIT7 -> ComputeInferableStaticVariableDependenciesTask
-  RESOLVED_UNIT7 -> InferStaticVariableTypeTask
-  RESOLVED_UNIT7 -> InferStaticVariableTypesInUnitTask
-  RESOLVED_UNIT7 -> ResolvedUnit7InLibraryTask
-  RESOLVED_UNIT7 [shape=box]
-  RESOLVED_UNIT8 -> ResolveInstanceFieldsInUnitTask
-  RESOLVED_UNIT8 [shape=box]
-  RESOLVED_UNIT9 -> InferInstanceMembersInUnitTask
-  RESOLVED_UNIT9 [shape=box]
-  RESOLVE_DIRECTIVES_ERRORS -> LibraryUnitErrorsTask
-  RESOLVE_DIRECTIVES_ERRORS [shape=box]
-  RESOLVE_TYPE_BOUNDS_ERRORS -> LibraryUnitErrorsTask
-  RESOLVE_TYPE_BOUNDS_ERRORS [shape=box]
-  RESOLVE_TYPE_NAMES_ERRORS -> LibraryUnitErrorsTask
-  RESOLVE_TYPE_NAMES_ERRORS [shape=box]
-  RESOLVE_UNIT_ERRORS -> LibraryUnitErrorsTask
-  RESOLVE_UNIT_ERRORS [shape=box]
-  ReadyLibraryElement2Task -> READY_LIBRARY_ELEMENT2
-  ReadyLibraryElement5Task -> READY_LIBRARY_ELEMENT6
-  ReadyLibraryElement7Task -> READY_LIBRARY_ELEMENT7
-  ReadyResolvedUnitTask -> READY_RESOLVED_UNIT
-  ResolveConstantExpressionTask -> CONSTANT_EXPRESSION_RESOLVED
-  ResolveDirectiveElementsTask -> CREATED_RESOLVED_UNIT2
-  ResolveDirectiveElementsTask -> RESOLVED_UNIT2
-  ResolveDirectiveElementsTask -> RESOLVE_DIRECTIVES_ERRORS
-  ResolveInstanceFieldsInUnitTask -> CREATED_RESOLVED_UNIT9
-  ResolveInstanceFieldsInUnitTask -> RESOLVED_UNIT9
-  ResolveLibraryReferencesTask -> LIBRARY_ELEMENT9
-  ResolveLibraryTask -> LIBRARY_ELEMENT
-  ResolveLibraryTypeNamesTask -> LIBRARY_ELEMENT6
-  ResolveTopLevelLibraryTypeBoundsTask -> LIBRARY_ELEMENT5
-  ResolveTopLevelUnitTypeBoundsTask -> CREATED_RESOLVED_UNIT4
-  ResolveTopLevelUnitTypeBoundsTask -> RESOLVED_UNIT4
-  ResolveTopLevelUnitTypeBoundsTask -> RESOLVE_TYPE_BOUNDS_ERRORS
-  ResolveUnitTask -> CONSTANT_EXPRESSIONS_DEPENDENCIES
-  ResolveUnitTask -> CREATED_RESOLVED_UNIT11
-  ResolveUnitTask -> RESOLVED_UNIT11
-  ResolveUnitTask -> RESOLVE_UNIT_ERRORS
-  ResolveUnitTypeNamesTask -> CREATED_RESOLVED_UNIT5
-  ResolveUnitTypeNamesTask -> RESOLVED_UNIT5
-  ResolveUnitTypeNamesTask -> RESOLVE_TYPE_NAMES_ERRORS
-  ResolveVariableReferencesTask -> CREATED_RESOLVED_UNIT6
-  ResolveVariableReferencesTask -> RESOLVED_UNIT6
-  ResolveVariableReferencesTask -> VARIABLE_REFERENCE_ERRORS
-  ResolvedUnit7InLibraryClosureTask -> LIBRARY_ELEMENT8
-  ResolvedUnit7InLibraryTask -> LIBRARY_ELEMENT7
-  SCAN_ERRORS -> dartErrorsForSource
-  SCAN_ERRORS [shape=box]
-  SOURCE_KIND -> BuildDirectiveElementsTask
-  SOURCE_KIND -> ResolveDirectiveElementsTask
-  SOURCE_KIND [shape=box]
-  STATIC_VARIABLE_RESOLUTION_ERRORS -> InferStaticVariableTypesInUnitTask
-  STATIC_VARIABLE_RESOLUTION_ERRORS [shape=box]
-  STATIC_VARIABLE_RESOLUTION_ERRORS_IN_UNIT -> LibraryUnitErrorsTask
-  STATIC_VARIABLE_RESOLUTION_ERRORS_IN_UNIT [shape=box]
-  STRONG_MODE_ERRORS -> LibraryUnitErrorsTask
-  STRONG_MODE_ERRORS [shape=box]
-  ScanDartTask -> IGNORE_INFO
-  ScanDartTask -> LINE_INFO
-  ScanDartTask -> SCAN_ERRORS
-  ScanDartTask -> TOKEN_STREAM
-  StrongModeVerifyUnitTask -> CREATED_RESOLVED_UNIT
-  StrongModeVerifyUnitTask -> RESOLVED_UNIT
-  StrongModeVerifyUnitTask -> STRONG_MODE_ERRORS
-  TOKEN_STREAM -> ParseDartTask
-  TOKEN_STREAM [shape=box]
-  TYPE_PROVIDER -> BuildEnumMemberElementsTask
-  TYPE_PROVIDER -> ComputeConstantDependenciesTask
-  TYPE_PROVIDER -> ComputeConstantValueTask
-  TYPE_PROVIDER -> GenerateHintsTask
-  TYPE_PROVIDER -> InferInstanceMembersInUnitTask
-  TYPE_PROVIDER -> InferStaticVariableTypeTask
-  TYPE_PROVIDER -> PartiallyResolveUnitReferencesTask
-  TYPE_PROVIDER -> ResolveInstanceFieldsInUnitTask
-  TYPE_PROVIDER -> ResolveLibraryTypeNamesTask
-  TYPE_PROVIDER -> ResolveUnitTask
-  TYPE_PROVIDER -> ResolveUnitTypeNamesTask
-  TYPE_PROVIDER -> ResolveVariableReferencesTask
-  TYPE_PROVIDER -> StrongModeVerifyUnitTask
-  TYPE_PROVIDER -> VerifyUnitTask
-  TYPE_PROVIDER [shape=box]
-  UNITS -> LibraryErrorsReadyTask
-  UNITS [shape=box]
-  USED_IMPORTED_ELEMENTS -> GenerateHintsTask
-  USED_IMPORTED_ELEMENTS [shape=box]
-  USED_LOCAL_ELEMENTS -> GenerateHintsTask
-  USED_LOCAL_ELEMENTS [shape=box]
-  VARIABLE_REFERENCE_ERRORS -> LibraryUnitErrorsTask
-  VARIABLE_REFERENCE_ERRORS [shape=box]
-  VERIFY_ERRORS -> LibraryUnitErrorsTask
-  VERIFY_ERRORS [shape=box]
-  VerifyUnitTask -> VERIFY_ERRORS
-  dartErrorsForSource -> DartErrorsTask
-  dartErrorsForSource [shape=hexagon]
-  dartErrorsForUnit -> DartErrorsTask
-  dartErrorsForUnit [shape=hexagon]
-}
diff --git a/pkg/analyzer_cli/lib/src/error_formatter.dart b/pkg/analyzer_cli/lib/src/error_formatter.dart
index 72ea9ed..4bcfb70 100644
--- a/pkg/analyzer_cli/lib/src/error_formatter.dart
+++ b/pkg/analyzer_cli/lib/src/error_formatter.dart
@@ -312,6 +312,7 @@
   static final int _slashCodeUnit = '\\'.codeUnitAt(0);
   static final int _newline = '\n'.codeUnitAt(0);
   static final int _return = '\r'.codeUnitAt(0);
+  final Set<AnalysisError> _seenErrors = <AnalysisError>{};
 
   MachineErrorFormatter(
       StringSink out, CommandLineOptions options, AnalysisStats stats,
@@ -322,6 +323,10 @@
 
   void formatError(
       Map<AnalysisError, LineInfo> errorToLine, AnalysisError error) {
+    // Ensure we don't over-report (#36062).
+    if (!_seenErrors.add(error)) {
+      return;
+    }
     Source source = error.source;
     var location = errorToLine[error].getLocation(error.offset);
     int length = error.length;
diff --git a/pkg/analyzer_cli/test/errors_reported_once_test.dart b/pkg/analyzer_cli/test/errors_reported_once_test.dart
index 7127abf..be311d7 100644
--- a/pkg/analyzer_cli/test/errors_reported_once_test.dart
+++ b/pkg/analyzer_cli/test/errors_reported_once_test.dart
@@ -53,4 +53,23 @@
     expect(output, contains(unusedWarning));
     expect(unusedWarning.allMatches(output).toList(), hasLength(1));
   }
+
+  test_once_machine() async {
+    String testDir = path.join(testDirectory, 'data', 'errors_reported_once');
+    Driver driver = new Driver(isTesting: true);
+    await driver.start([
+      '--format',
+      'machine',
+      path.join(testDir, 'foo.dart'),
+      path.join(testDir, 'bar.dart')
+    ]);
+
+    expect(exitCode, 0);
+
+    // Ensure that we only have one copy of the error.
+    final String unusedWarning = 'Unused import';
+    String output = errorSink.toString();
+    expect(output, contains(unusedWarning));
+    expect(unusedWarning.allMatches(output).toList(), hasLength(1));
+  }
 }
diff --git a/pkg/analyzer_plugin/CHANGELOG.md b/pkg/analyzer_plugin/CHANGELOG.md
index 94e7e97..923ee0c 100644
--- a/pkg/analyzer_plugin/CHANGELOG.md
+++ b/pkg/analyzer_plugin/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Changelog
 
+## 0.0.1-alpha.7
+
+- Remove CompletionSuggestion.elementUri, replaced with AvailableSuggestionSet.
+- Remove 'importUri' from CompletionSuggestion.
+- Include type parameters into suggested code completions.
+
 ## 0.0.1-alpha.4
 
 - Upgrade the Dart SDK version contraint
diff --git a/pkg/analyzer_plugin/doc/api.html b/pkg/analyzer_plugin/doc/api.html
index 0d84b98..40ba1aa 100644
--- a/pkg/analyzer_plugin/doc/api.html
+++ b/pkg/analyzer_plugin/doc/api.html
@@ -1004,12 +1004,6 @@
           is only defined if the displayed text should be different than the
           completion.  Otherwise it is omitted.
         </p>
-      </dd><dt class="field"><b>elementUri: String<span style="color:#999999"> (optional)</span></b></dt><dd>
-        
-        <p>
-          The URI of the element corresponding to this suggestion. It will be
-          set whenever analysis server is able to compute it.
-        </p>
       </dd><dt class="field"><b>selectionOffset: int</b></dt><dd>
         
         <p>
@@ -1120,12 +1114,6 @@
           The type of the options parameter being suggested. This field is
           omitted if the parameterName field is omitted.
         </p>
-      </dd><dt class="field"><b>importUri: String<span style="color:#999999"> (optional)</span></b></dt><dd>
-        
-        <p>
-          The import to be added if the suggestion is out of scope and needs
-          an import to be added to be in scope.
-        </p>
       </dd></dl></dd><dt class="typeDefinition"><a name="type_CompletionSuggestionKind">CompletionSuggestionKind: String</a></dt><dd>
     <p>
       An enumeration of the kinds of elements that can be included in a
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
index b7718d7..120085a 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
@@ -598,7 +598,6 @@
  *   "relevance": int
  *   "completion": String
  *   "displayText": optional String
- *   "elementUri": optional String
  *   "selectionOffset": int
  *   "selectionLength": int
  *   "isDeprecated": bool
@@ -616,7 +615,6 @@
  *   "hasNamedParameters": optional bool
  *   "parameterName": optional String
  *   "parameterType": optional String
- *   "importUri": optional String
  * }
  *
  * Clients may not extend, implement or mix-in this class.
@@ -630,8 +628,6 @@
 
   String _displayText;
 
-  String _elementUri;
-
   int _selectionOffset;
 
   int _selectionLength;
@@ -666,8 +662,6 @@
 
   String _parameterType;
 
-  String _importUri;
-
   /**
    * The kind of element being suggested.
    */
@@ -732,20 +726,6 @@
   }
 
   /**
-   * The URI of the element corresponding to this suggestion. It will be set
-   * whenever analysis server is able to compute it.
-   */
-  String get elementUri => _elementUri;
-
-  /**
-   * The URI of the element corresponding to this suggestion. It will be set
-   * whenever analysis server is able to compute it.
-   */
-  void set elementUri(String value) {
-    this._elementUri = value;
-  }
-
-  /**
    * The offset, relative to the beginning of the completion, of where the
    * selection should be placed after insertion.
    */
@@ -997,20 +977,6 @@
     this._parameterType = value;
   }
 
-  /**
-   * The import to be added if the suggestion is out of scope and needs an
-   * import to be added to be in scope.
-   */
-  String get importUri => _importUri;
-
-  /**
-   * The import to be added if the suggestion is out of scope and needs an
-   * import to be added to be in scope.
-   */
-  void set importUri(String value) {
-    this._importUri = value;
-  }
-
   CompletionSuggestion(
       CompletionSuggestionKind kind,
       int relevance,
@@ -1020,7 +986,6 @@
       bool isDeprecated,
       bool isPotential,
       {String displayText,
-      String elementUri,
       String docSummary,
       String docComplete,
       String declaringType,
@@ -1033,13 +998,11 @@
       int requiredParameterCount,
       bool hasNamedParameters,
       String parameterName,
-      String parameterType,
-      String importUri}) {
+      String parameterType}) {
     this.kind = kind;
     this.relevance = relevance;
     this.completion = completion;
     this.displayText = displayText;
-    this.elementUri = elementUri;
     this.selectionOffset = selectionOffset;
     this.selectionLength = selectionLength;
     this.isDeprecated = isDeprecated;
@@ -1057,7 +1020,6 @@
     this.hasNamedParameters = hasNamedParameters;
     this.parameterName = parameterName;
     this.parameterType = parameterType;
-    this.importUri = importUri;
   }
 
   factory CompletionSuggestion.fromJson(
@@ -1092,11 +1054,6 @@
         displayText = jsonDecoder.decodeString(
             jsonPath + ".displayText", json["displayText"]);
       }
-      String elementUri;
-      if (json.containsKey("elementUri")) {
-        elementUri = jsonDecoder.decodeString(
-            jsonPath + ".elementUri", json["elementUri"]);
-      }
       int selectionOffset;
       if (json.containsKey("selectionOffset")) {
         selectionOffset = jsonDecoder.decodeInt(
@@ -1194,15 +1151,9 @@
         parameterType = jsonDecoder.decodeString(
             jsonPath + ".parameterType", json["parameterType"]);
       }
-      String importUri;
-      if (json.containsKey("importUri")) {
-        importUri = jsonDecoder.decodeString(
-            jsonPath + ".importUri", json["importUri"]);
-      }
       return new CompletionSuggestion(kind, relevance, completion,
           selectionOffset, selectionLength, isDeprecated, isPotential,
           displayText: displayText,
-          elementUri: elementUri,
           docSummary: docSummary,
           docComplete: docComplete,
           declaringType: declaringType,
@@ -1215,8 +1166,7 @@
           requiredParameterCount: requiredParameterCount,
           hasNamedParameters: hasNamedParameters,
           parameterName: parameterName,
-          parameterType: parameterType,
-          importUri: importUri);
+          parameterType: parameterType);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "CompletionSuggestion", json);
     }
@@ -1231,9 +1181,6 @@
     if (displayText != null) {
       result["displayText"] = displayText;
     }
-    if (elementUri != null) {
-      result["elementUri"] = elementUri;
-    }
     result["selectionOffset"] = selectionOffset;
     result["selectionLength"] = selectionLength;
     result["isDeprecated"] = isDeprecated;
@@ -1277,9 +1224,6 @@
     if (parameterType != null) {
       result["parameterType"] = parameterType;
     }
-    if (importUri != null) {
-      result["importUri"] = importUri;
-    }
     return result;
   }
 
@@ -1293,7 +1237,6 @@
           relevance == other.relevance &&
           completion == other.completion &&
           displayText == other.displayText &&
-          elementUri == other.elementUri &&
           selectionOffset == other.selectionOffset &&
           selectionLength == other.selectionLength &&
           isDeprecated == other.isDeprecated &&
@@ -1313,8 +1256,7 @@
           requiredParameterCount == other.requiredParameterCount &&
           hasNamedParameters == other.hasNamedParameters &&
           parameterName == other.parameterName &&
-          parameterType == other.parameterType &&
-          importUri == other.importUri;
+          parameterType == other.parameterType;
     }
     return false;
   }
@@ -1326,7 +1268,6 @@
     hash = JenkinsSmiHash.combine(hash, relevance.hashCode);
     hash = JenkinsSmiHash.combine(hash, completion.hashCode);
     hash = JenkinsSmiHash.combine(hash, displayText.hashCode);
-    hash = JenkinsSmiHash.combine(hash, elementUri.hashCode);
     hash = JenkinsSmiHash.combine(hash, selectionOffset.hashCode);
     hash = JenkinsSmiHash.combine(hash, selectionLength.hashCode);
     hash = JenkinsSmiHash.combine(hash, isDeprecated.hashCode);
@@ -1344,7 +1285,6 @@
     hash = JenkinsSmiHash.combine(hash, hasNamedParameters.hashCode);
     hash = JenkinsSmiHash.combine(hash, parameterName.hashCode);
     hash = JenkinsSmiHash.combine(hash, parameterType.hashCode);
-    hash = JenkinsSmiHash.combine(hash, importUri.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
index 298c22c..f35495b 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
@@ -288,8 +288,10 @@
 
   @override
   void addDeletion(SourceRange range) {
-    EditBuilderImpl builder = createEditBuilder(range.offset, range.length);
-    _addEdit(builder);
+    if (range.length > 0) {
+      EditBuilderImpl builder = createEditBuilder(range.offset, range.length);
+      _addEdit(builder);
+    }
   }
 
   @override
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 5ce4c0e..e504aac 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -1210,7 +1210,7 @@
     @required String targetPath,
     @required int targetOffset,
     @required LibraryElement requestedLibrary,
-    @required String requestedName,
+    @required Element requestedElement,
   }) {
     if (librariesToImport.isNotEmpty) {
       throw StateError('Only one library can be safely imported.');
@@ -1221,7 +1221,7 @@
       targetPath: targetPath,
       targetOffset: targetOffset,
       requestedLibrary: requestedLibrary,
-      requestedName: requestedName,
+      requestedElement: requestedElement,
     );
 
     var prefix = request.prefix;
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/dart/import_library_element.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/dart/import_library_element.dart
index 086f7c6..b9e33ed 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/dart/import_library_element.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/dart/import_library_element.dart
@@ -13,13 +13,13 @@
   @required String targetPath,
   @required int targetOffset,
   @required LibraryElement requestedLibrary,
-  @required String requestedName,
+  @required Element requestedElement,
 }) {
   var targetLibrary = targetResolvedLibrary.element;
 
   var requestedLibraryUri = requestedLibrary.source.uri;
-  var requestedElement = requestedLibrary.exportNamespace.get(requestedName);
   var requestedElementUri = requestedElement.librarySource.uri;
+  var requestedName = requestedElement.displayName;
 
   // If the element is defined in this library, then no prefix needed.
   if (targetLibrary == requestedElement.library) {
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/dart/syntactic_scope.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/dart/syntactic_scope.dart
index 71cf0f0..c12faf9 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/dart/syntactic_scope.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/dart/syntactic_scope.dart
@@ -142,18 +142,6 @@
   }
 
   @override
-  void visitForEachStatement(ForEachStatement node) {
-    if (!_isCoveredBy(node)) return;
-
-    if (node.loopVariable != null && _isCoveredBy(node.body)) {
-      _addName(node.loopVariable.identifier);
-    }
-
-    node.iterable?.accept(this);
-    node.body.accept(this);
-  }
-
-  @override
   void visitForElement(ForElement node) {
     if (!_isCoveredBy(node)) return;
 
@@ -163,19 +151,6 @@
   }
 
   @override
-  void visitForStatement(ForStatement node) {
-    if (!_isCoveredBy(node)) return;
-
-    if (node.variables != null) {
-      _addVariables(node.variables);
-    }
-
-    node.condition?.accept(this);
-    node.updaters?.accept(this);
-    node.body.accept(this);
-  }
-
-  @override
   void visitForStatement2(ForStatement2 node) {
     if (!_isCoveredBy(node)) return;
 
@@ -263,6 +238,8 @@
   void _addFormalParameter(FormalParameter parameter) {
     if (parameter is DefaultFormalParameter) {
       _addFormalParameter(parameter.parameter);
+    } else if (parameter is FieldFormalParameter) {
+      _addName(parameter.identifier);
     } else if (parameter is FunctionTypedFormalParameter) {
       _addName(parameter.identifier);
       var parameters = parameter.parameters;
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
index bddc32d..c25eb10 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -599,15 +600,18 @@
   }
 
   @override
-  void visitForEachStatement(ForEachStatement node) {
-    if (identical(entity, node.identifier)) {
+  visitForEachParts(ForEachParts node) {
+    if (node is ForEachPartsWithIdentifier &&
+        identical(entity, node.identifier)) {
       optype.includeTypeNameSuggestions = true;
     }
-    if (identical(entity, node.loopVariable)) {
+    if (node is ForEachPartsWithDeclaration &&
+        identical(entity, node.loopVariable)) {
       optype.includeTypeNameSuggestions = true;
     }
     if (identical(entity, node.inKeyword) && offset <= node.inKeyword.offset) {
-      if (node.identifier == null && node.loopVariable == null) {
+      if (!(node is ForEachPartsWithIdentifier && node.identifier != null ||
+          node is ForEachPartsWithDeclaration && node.loopVariable != null)) {
         optype.includeTypeNameSuggestions = true;
       }
     }
@@ -655,7 +659,7 @@
   }
 
   @override
-  void visitForStatement(ForStatement node) {
+  visitForParts(ForParts node) {
     var entity = this.entity;
     if (_isEntityPrevTokenSynthetic()) {
       // Actual: for (var v i^)
@@ -668,13 +672,6 @@
       //                    ^
       optype.includeVarNameSuggestions = true;
     } else {
-      // for (^) {}
-      // for (Str^ str = null;) {}
-      // In theory it is possible to specify any expression in initializer,
-      // but for any practical use we need only types.
-      if (entity == node.initialization || entity == node.variables) {
-        optype.includeTypeNameSuggestions = true;
-      }
       // for (; ^) {}
       if (entity == node.condition) {
         optype.includeTypeNameSuggestions = true;
@@ -690,6 +687,33 @@
   }
 
   @override
+  void visitForStatement2(ForStatement2 node) {
+    var entity = this.entity;
+    var entity2 = entity; // Work around limitations of type promotion
+    if (entity2 is SyntacticEntity &&
+        entity2.offset >= node.forLoopParts.offset &&
+        entity2.end <= node.forLoopParts.end) {
+      // Older versions of the analyzer yield elements of `node.forLoopParts`
+      // when iterating through children of `ForEachStatement`.  Handle this
+      // situation by simulating the behavior of newer versions of the analyzer.
+      // TODO(paulberry): remove this case once we require a version of analyzer
+      // containing a1349ac52972a4c69e1b05079ed1662b3b0f8c3f
+      if (entity2.offset == node.forLoopParts.offset) {
+        entity = node.forLoopParts;
+      } else {
+        return node.forLoopParts.accept(this);
+      }
+    }
+    // for (^) {}
+    // for (Str^ str = null;) {}
+    // In theory it is possible to specify any expression in initializer,
+    // but for any practical use we need only types.
+    if (entity == node.forLoopParts) {
+      optype.includeTypeNameSuggestions = true;
+    }
+  }
+
+  @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
     if (identical(entity, node.returnType) ||
         identical(entity, node.name) && node.returnType == null) {
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
index d0fbadc..d5122fc75 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/source.dart' show Source, UriKind;
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide Element, ElementKind;
 import 'package:analyzer_plugin/src/utilities/documentation.dart';
@@ -81,8 +80,7 @@
   CompletionSuggestion forElement(Element element,
       {String completion,
       CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      int relevance: DART_RELEVANCE_DEFAULT,
-      Source importForSource}) {
+      int relevance: DART_RELEVANCE_DEFAULT}) {
     // Copied from analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
     if (element == null) {
       return null;
@@ -137,35 +135,6 @@
       addDefaultArgDetails(
           suggestion, element, requiredParameters, namedParameters);
     }
-    if (importForSource != null) {
-      String srcPath =
-          resourceProvider.pathContext.dirname(importForSource.fullName);
-      LibraryElement libElem = element.library;
-      if (libElem != null) {
-        Source libSource = libElem.source;
-        if (libSource != null) {
-          UriKind uriKind = libSource.uriKind;
-          if (uriKind == UriKind.DART_URI) {
-            suggestion.importUri = libSource.uri.toString();
-          } else if (uriKind == UriKind.PACKAGE_URI) {
-            suggestion.importUri = libSource.uri.toString();
-          } else if (uriKind == UriKind.FILE_URI &&
-              element.source.uriKind == UriKind.FILE_URI) {
-            try {
-              suggestion.importUri = resourceProvider.pathContext
-                  .relative(libSource.fullName, from: srcPath);
-            } catch (_) {
-              // ignored
-            }
-          }
-        }
-      }
-      if (suggestion.importUri == null) {
-        // Do not include out of scope suggestions
-        // for which we cannot determine an import
-        return null;
-      }
-    }
     return suggestion;
   }
 
diff --git a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
index dca1c1a..4f3fdd1 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
@@ -43,6 +43,8 @@
 
   void declaredMethod(MethodDeclaration declaration);
 
+  void declaredMixin(MixinDeclaration declaration) {}
+
   void declaredParam(SimpleIdentifier name, TypeAnnotation type);
 
   void declaredTopLevelVar(
@@ -131,6 +133,9 @@
           declaration.functionType,
           declaration.functionType.typeParameters,
         );
+      } else if (declaration is MixinDeclaration) {
+        declaredMixin(declaration);
+        _visitTypeParameters(declaration, declaration.typeParameters);
       }
     });
   }
@@ -142,31 +147,30 @@
   }
 
   @override
-  void visitForEachStatement(ForEachStatement node) {
-    SimpleIdentifier id;
-    TypeAnnotation type;
-    DeclaredIdentifier loopVar = node.loopVariable;
-    if (loopVar != null) {
-      id = loopVar.identifier;
-      type = loopVar.type;
-    } else {
-      id = node.identifier;
-      type = null;
-    }
-    if (id != null) {
-      // If there is no loop variable, don't declare it.
-      declaredLocalVar(id, type);
-    }
-    visitNode(node);
-  }
-
-  @override
-  void visitForStatement(ForStatement node) {
-    VariableDeclarationList varList = node.variables;
-    if (varList != null) {
-      varList.variables.forEach((VariableDeclaration varDecl) {
-        declaredLocalVar(varDecl.name, varList.type);
-      });
+  visitForStatement2(ForStatement2 node) {
+    var forLoopParts = node.forLoopParts;
+    if (forLoopParts is ForEachPartsWithDeclaration) {
+      DeclaredIdentifier loopVar = forLoopParts.loopVariable;
+      if (loopVar != null) {
+        SimpleIdentifier id = loopVar.identifier;
+        if (id != null) {
+          // If there is no loop variable, don't declare it.
+          declaredLocalVar(id, loopVar.type);
+        }
+      }
+    } else if (forLoopParts is ForEachPartsWithIdentifier) {
+      SimpleIdentifier id = forLoopParts.identifier;
+      if (id != null) {
+        // If there is no loop variable, don't declare it.
+        declaredLocalVar(id, null);
+      }
+    } else if (forLoopParts is ForPartsWithDeclarations) {
+      VariableDeclarationList varList = forLoopParts.variables;
+      if (varList != null) {
+        varList.variables.forEach((VariableDeclaration varDecl) {
+          declaredLocalVar(varDecl.name, varList.type);
+        });
+      }
     }
     visitNode(node);
   }
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
index 50e2721..a00516b 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
@@ -380,7 +380,7 @@
     @required String targetPath,
     @required int targetOffset,
     @required LibraryElement requestedLibrary,
-    @required String requestedName,
+    @required Element requestedElement,
   });
 
   /**
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/suggestion_builder.dart b/pkg/analyzer_plugin/lib/utilities/completion/suggestion_builder.dart
index 8ce11fa..3ad0713 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/suggestion_builder.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/suggestion_builder.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
 import 'package:analyzer_plugin/utilities/completion/relevance.dart';
-import 'package:analyzer/src/generated/source.dart' show Source;
 
 /**
  * An object used to build code completion suggestions for Dart code.
@@ -13,13 +12,10 @@
 abstract class SuggestionBuilder {
   /**
    * Return a suggestion based on the given [element], or `null` if a suggestion
-   * is not appropriate for the given element. If the suggestion is not
-   * currently in scope, then specify [importForSource] as the source to which
-   * an import should be added.
+   * is not appropriate for the given element.
    */
   CompletionSuggestion forElement(Element element,
       {String completion,
       CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      int relevance: DART_RELEVANCE_DEFAULT,
-      Source importForSource});
+      int relevance: DART_RELEVANCE_DEFAULT});
 }
diff --git a/pkg/analyzer_plugin/pubspec.yaml b/pkg/analyzer_plugin/pubspec.yaml
index c1c6502..277eda1 100644
--- a/pkg/analyzer_plugin/pubspec.yaml
+++ b/pkg/analyzer_plugin/pubspec.yaml
@@ -1,6 +1,6 @@
 name: analyzer_plugin
 description: A framework for building plugins for the analysis server.
-version: 0.0.1-alpha.6
+version: 0.0.1-alpha.7
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer_plugin
 
@@ -8,7 +8,7 @@
   sdk: '>=1.8.0 <3.0.0'
 
 dependencies:
-  analyzer: '^0.34.2'
+  analyzer: '^0.35.3'
   charcode: '^1.1.0'
   html: '^0.13.1'
   meta: ^1.0.2
diff --git a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
index d95c14d..3691e51 100644
--- a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
+++ b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
@@ -134,7 +134,6 @@
  *   "relevance": int
  *   "completion": String
  *   "displayText": optional String
- *   "elementUri": optional String
  *   "selectionOffset": int
  *   "selectionLength": int
  *   "isDeprecated": bool
@@ -152,7 +151,6 @@
  *   "hasNamedParameters": optional bool
  *   "parameterName": optional String
  *   "parameterType": optional String
- *   "importUri": optional String
  * }
  */
 final Matcher isCompletionSuggestion =
@@ -166,7 +164,6 @@
           "isPotential": isBool
         }, optionalFields: {
           "displayText": isString,
-          "elementUri": isString,
           "docSummary": isString,
           "docComplete": isString,
           "declaringType": isString,
@@ -179,8 +176,7 @@
           "requiredParameterCount": isInt,
           "hasNamedParameters": isBool,
           "parameterName": isString,
-          "parameterType": isString,
-          "importUri": isString
+          "parameterType": isString
         }));
 
 /**
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/import_library_element_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/import_library_element_test.dart
index 7f5ea6f..02e19d1 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/import_library_element_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/import_library_element_test.dart
@@ -735,8 +735,8 @@
     var resolvedLibrary = await session.getResolvedLibrary(path);
     var requestedLibrary = await session.getLibraryByUri(uriStr);
 
-    var element = requestedLibrary.exportNamespace.get(name);
-    expect(element, isNotNull, reason: '`$name` in $uriStr');
+    var requestedElement = requestedLibrary.exportNamespace.get(name);
+    expect(requestedElement, isNotNull, reason: '`$name` in $uriStr');
 
     var builder = newBuilder();
     await builder.addFileEdit(path, (builder) {
@@ -745,7 +745,7 @@
         targetPath: path,
         targetOffset: offset,
         requestedLibrary: requestedLibrary,
-        requestedName: name,
+        requestedElement: requestedElement,
       );
       expect(result.prefix, expectedPrefix);
     });
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/syntactic_scope_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/syntactic_scope_test.dart
index d4f04be..40bdcbc 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/syntactic_scope_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/syntactic_scope_test.dart
@@ -279,14 +279,14 @@
   test_ConstructorDeclaration() {
     _assertScopeNames(code: r'''
 class N1<N2> extends N3 {
-  N1.N4(N5 ^1) {
+  N1.N4(N5, this.N6, ^1) {
     ^2
   }
   ^3
 }
 ''', expected: r'''
-1: N2, N5
-2: N2, N5
+1: N2, N5, N6
+2: N2, N5, N6
 3: N2
 ''');
   }
diff --git a/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart b/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart
index fd96c31..1b68a17 100644
--- a/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart
@@ -45,8 +45,8 @@
     FunctionDeclaration f = declarations[1] as FunctionDeclaration;
     expect(f, isNotNull);
     BlockFunctionBody body = f.functionExpression.body as BlockFunctionBody;
-    Statement statement = body.block.statements[0];
-    expect(statement, const TypeMatcher<ForEachStatement>());
+    var statement = body.block.statements[0] as ForStatement2;
+    expect(statement.forLoopParts, const TypeMatcher<ForEachParts>());
     statement.accept(new TestVisitor(statement.offset));
   }
 }
diff --git a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
index 665a350..d7a9ec2 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
@@ -95,7 +95,6 @@
   CompletionSuggestion assertSuggest(String completion,
       {CompletionSuggestionKind csKind: CompletionSuggestionKind.INVOCATION,
       int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       ElementKind elemKind: null,
       bool isDeprecated: false,
       bool isPotential: false,
@@ -117,7 +116,6 @@
     } else {
       expect(cs.relevance, equals(relevance), reason: completion);
     }
-    expect(cs.importUri, importUri);
     expect(cs.selectionOffset, equals(selectionOffset ?? completion.length));
     expect(cs.selectionLength, equals(0));
     expect(cs.isDeprecated, equals(isDeprecated));
@@ -153,7 +151,6 @@
 
   CompletionSuggestion assertSuggestClass(String name,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
       bool isDeprecated: false,
       String elemFile,
@@ -162,7 +159,6 @@
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
-        importUri: importUri,
         isDeprecated: isDeprecated,
         elemFile: elemFile,
         elemOffset: elemOffset);
@@ -193,13 +189,11 @@
 
   CompletionSuggestion assertSuggestConstructor(String name,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       int elemOffset,
       String defaultArgListString: _UNCHECKED,
       List<int> defaultArgumentListTextRanges}) {
     CompletionSuggestion cs = assertSuggest(name,
         relevance: relevance,
-        importUri: importUri,
         elemOffset: elemOffset,
         defaultArgListString: defaultArgListString,
         defaultArgumentListTextRanges: defaultArgumentListTextRanges);
@@ -232,13 +226,11 @@
 
   CompletionSuggestion assertSuggestField(String name, String type,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
       bool isDeprecated: false}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
-        importUri: importUri,
         elemKind: ElementKind.FIELD,
         isDeprecated: isDeprecated);
     // The returnType represents the type of a field
@@ -258,13 +250,11 @@
       {CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
       bool isDeprecated: false,
       int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       String defaultArgListString: _UNCHECKED,
       List<int> defaultArgumentListTextRanges}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
-        importUri: importUri,
         isDeprecated: isDeprecated,
         defaultArgListString: defaultArgListString,
         defaultArgumentListTextRanges: defaultArgumentListTextRanges);
@@ -295,13 +285,9 @@
       String name, String returnType,
       {bool isDeprecated: false,
       int relevance: DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      String importUri}) {
+      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION}) {
     CompletionSuggestion cs = assertSuggest(name,
-        csKind: kind,
-        relevance: relevance,
-        importUri: importUri,
-        isDeprecated: isDeprecated);
+        csKind: kind, relevance: relevance, isDeprecated: isDeprecated);
     if (returnType != null) {
       expect(cs.returnType, returnType);
     } else if (isNullExpectedReturnTypeConsideredDynamic) {
@@ -328,13 +314,11 @@
 
   CompletionSuggestion assertSuggestGetter(String name, String returnType,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
       bool isDeprecated: false}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
-        importUri: importUri,
         elemKind: ElementKind.GETTER,
         isDeprecated: isDeprecated);
     expect(cs.returnType, returnType != null ? returnType : 'dynamic');
@@ -352,7 +336,6 @@
   CompletionSuggestion assertSuggestMethod(
       String name, String declaringType, String returnType,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
       bool isDeprecated: false,
       String defaultArgListString: _UNCHECKED,
@@ -360,7 +343,6 @@
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
-        importUri: importUri,
         isDeprecated: isDeprecated,
         defaultArgListString: defaultArgListString,
         defaultArgumentListTextRanges: defaultArgumentListTextRanges);
@@ -381,14 +363,10 @@
 
   CompletionSuggestion assertSuggestName(String name,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       CompletionSuggestionKind kind: CompletionSuggestionKind.IDENTIFIER,
       bool isDeprecated: false}) {
     CompletionSuggestion cs = assertSuggest(name,
-        csKind: kind,
-        relevance: relevance,
-        importUri: importUri,
-        isDeprecated: isDeprecated);
+        csKind: kind, relevance: relevance, isDeprecated: isDeprecated);
     expect(cs.completion, equals(name));
     expect(cs.element, isNull);
     assertHasNoParameterInfo(cs);
@@ -397,13 +375,9 @@
 
   CompletionSuggestion assertSuggestSetter(String name,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri,
       CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION}) {
     CompletionSuggestion cs = assertSuggest(name,
-        csKind: kind,
-        relevance: relevance,
-        importUri: importUri,
-        elemKind: ElementKind.SETTER);
+        csKind: kind, relevance: relevance, elemKind: ElementKind.SETTER);
     Element element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.SETTER));
@@ -420,10 +394,9 @@
 
   CompletionSuggestion assertSuggestTopLevelVar(String name, String returnType,
       {int relevance: DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      String importUri}) {
-    CompletionSuggestion cs = assertSuggest(name,
-        csKind: kind, relevance: relevance, importUri: importUri);
+      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION}) {
+    CompletionSuggestion cs =
+        assertSuggest(name, csKind: kind, relevance: relevance);
     if (returnType != null) {
       expect(cs.returnType, returnType);
     } else if (isNullExpectedReturnTypeConsideredDynamic) {
diff --git a/pkg/analyzer_plugin/tool/spec/common_types_spec.html b/pkg/analyzer_plugin/tool/spec/common_types_spec.html
index d12b351..ddb7f01 100644
--- a/pkg/analyzer_plugin/tool/spec/common_types_spec.html
+++ b/pkg/analyzer_plugin/tool/spec/common_types_spec.html
@@ -206,13 +206,6 @@
           completion.  Otherwise it is omitted.
         </p>
       </field>
-      <field name="elementUri" optional="true">
-        <ref>String</ref>
-        <p>
-          The URI of the element corresponding to this suggestion. It will be
-          set whenever analysis server is able to compute it.
-        </p>
-      </field>
       <field name="selectionOffset">
         <ref>int</ref>
         <p>
@@ -346,13 +339,6 @@
           omitted if the parameterName field is omitted.
         </p>
       </field>
-      <field name="importUri" optional="true">
-        <ref>String</ref>
-        <p>
-          The import to be added if the suggestion is out of scope and needs
-          an import to be added to be in scope.
-        </p>
-      </field>
     </object>
   </type>
   <type name="CompletionSuggestionKind">
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 991fb58..053c508 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -84,6 +84,7 @@
   static const String readData = '--read-data';
   static const String writeData = '--write-data';
   static const String cfeOnly = '--cfe-only';
+  static const String debugGlobalInference = '--debug-global-inference';
 
   static const String serverMode = '--server-mode';
 
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart
index ad9214f..e8ac328 100644
--- a/pkg/compiler/lib/src/common/resolution.dart
+++ b/pkg/compiler/lib/src/common/resolution.dart
@@ -14,6 +14,7 @@
 
   Iterable<Feature> get features => const <Feature>[];
   Iterable<MapLiteralUse> get mapLiterals => const <MapLiteralUse>[];
+  Iterable<SetLiteralUse> get setLiterals => const <SetLiteralUse>[];
   Iterable<ListLiteralUse> get listLiterals => const <ListLiteralUse>[];
   Iterable<String> get constSymbolNames => const <String>[];
   Iterable<ConstantExpression> get constantLiterals =>
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 124cfce..11c0efa 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -7,12 +7,12 @@
 
 import 'common.dart';
 import 'common/names.dart' show Identifiers, Uris;
+import 'constants/constant_system.dart' as constant_system;
 import 'constants/expressions.dart' show ConstantExpression;
 import 'constants/values.dart';
 import 'elements/entities.dart';
 import 'elements/types.dart';
 import 'inferrer/abstract_value_domain.dart';
-import 'js_backend/constant_system_javascript.dart';
 import 'js_backend/native_data.dart' show NativeBasicData;
 import 'kernel/dart2js_target.dart';
 import 'universe/selector.dart' show Selector;
@@ -58,6 +58,9 @@
   /// The `List` class defined in 'dart:core';
   ClassEntity get listClass;
 
+  /// The `Set` class defined in 'dart:core';
+  ClassEntity get setClass;
+
   /// The `Map` class defined in 'dart:core';
   ClassEntity get mapClass;
 
@@ -162,6 +165,12 @@
   /// If no type argument is provided, the canonical raw type is returned.
   InterfaceType listType([DartType elementType]);
 
+  /// Returns an instance of the `Set` type defined in 'dart:core' with
+  /// [elementType] as its type argument.
+  ///
+  /// If no type argument is provided, the canonical raw type is returned.
+  InterfaceType setType([DartType elementType]);
+
   /// Returns an instance of the `Map` type defined in 'dart:core' with
   /// [keyType] and [valueType] as its type arguments.
   ///
@@ -198,21 +207,25 @@
   InterfaceType getConstantMapTypeFor(InterfaceType sourceType,
       {bool hasProtoKey: false, bool onlyStringKeys: false});
 
+  InterfaceType getConstantSetTypeFor(InterfaceType sourceType);
+
   FieldEntity get symbolField;
 
   InterfaceType get symbolImplementationType;
 
   // From dart:core
   ClassEntity get mapLiteralClass;
-
   ConstructorEntity get mapLiteralConstructor;
-
   ConstructorEntity get mapLiteralConstructorEmpty;
-
   FunctionEntity get mapLiteralUntypedMaker;
-
   FunctionEntity get mapLiteralUntypedEmptyMaker;
 
+  ClassEntity get setLiteralClass;
+  ConstructorEntity get setLiteralConstructor;
+  ConstructorEntity get setLiteralConstructorEmpty;
+  FunctionEntity get setLiteralUntypedMaker;
+  FunctionEntity get setLiteralUntypedEmptyMaker;
+
   FunctionEntity get objectNoSuchMethod;
 
   bool isDefaultNoSuchMethodImplementation(FunctionEntity element);
@@ -315,6 +328,8 @@
 
   ClassEntity get constMapLiteralClass;
 
+  ClassEntity get constSetLiteralClass;
+
   ClassEntity get typeVariableClass;
 
   ClassEntity get jsInvocationMirrorClass;
@@ -471,10 +486,6 @@
 
   ClassEntity get jsGetNameEnum;
 
-  ClassEntity get expectNoInlineClass;
-
-  ClassEntity get expectAssumeDynamicClass;
-
   /// Returns `true` if [member] is a "foreign helper", that is, a member whose
   /// semantics is defined synthetically and not through Dart code.
   ///
@@ -491,14 +502,6 @@
 
   ClassEntity get jsAnonymousClass;
 
-  ClassEntity get noSideEffectsClass;
-
-  ClassEntity get noThrowsClass;
-
-  ClassEntity get noInlineClass;
-
-  ClassEntity get forceInlineClass;
-
   ClassEntity get pragmaClass;
   FieldEntity get pragmaClassNameField;
   FieldEntity get pragmaClassOptionsField;
@@ -652,6 +655,10 @@
   ClassEntity _listClass;
   ClassEntity get listClass => _listClass ??= _findClass(coreLibrary, 'List');
 
+  /// The `Set` class defined in 'dart:core'.
+  ClassEntity _setClass;
+  ClassEntity get setClass => _setClass ??= _findClass(coreLibrary, 'Set');
+
   /// The `Map` class defined in 'dart:core';
   ClassEntity _mapClass;
   ClassEntity get mapClass => _mapClass ??= _findClass(coreLibrary, 'Map');
@@ -839,6 +846,17 @@
     return _createInterfaceType(listClass, [elementType]);
   }
 
+  /// Returns an instance of the `Set` type defined in 'dart:core' with
+  /// [elementType] as its type argument.
+  ///
+  /// If no type argument is provided, the canonical raw type is returned.
+  InterfaceType setType([DartType elementType]) {
+    if (elementType == null) {
+      return _getRawType(setClass);
+    }
+    return _createInterfaceType(setClass, [elementType]);
+  }
+
   /// Returns an instance of the `Map` type defined in 'dart:core' with
   /// [keyType] and [valueType] as its type arguments.
   ///
@@ -948,6 +966,12 @@
     }
   }
 
+  InterfaceType getConstantSetTypeFor(InterfaceType sourceType) =>
+      sourceType.treatAsRaw
+          ? _env.getRawType(constSetLiteralClass)
+          : _env.createInterfaceType(
+              constSetLiteralClass, sourceType.typeArguments);
+
   FieldEntity get symbolField => symbolImplementationField;
 
   InterfaceType get symbolImplementationType =>
@@ -1012,6 +1036,48 @@
     return _mapLiteralUntypedEmptyMaker;
   }
 
+  ClassEntity _setLiteralClass;
+  ClassEntity get setLiteralClass => _setLiteralClass ??=
+      _findClass(_env.lookupLibrary(Uris.dart_collection), 'LinkedHashSet');
+
+  ConstructorEntity _setLiteralConstructor;
+  ConstructorEntity _setLiteralConstructorEmpty;
+  FunctionEntity _setLiteralUntypedMaker;
+  FunctionEntity _setLiteralUntypedEmptyMaker;
+
+  void _ensureSetLiteralHelpers() {
+    if (_setLiteralConstructor != null) return;
+
+    _setLiteralConstructor =
+        _env.lookupConstructor(setLiteralClass, '_literal');
+    _setLiteralConstructorEmpty =
+        _env.lookupConstructor(setLiteralClass, '_empty');
+    _setLiteralUntypedMaker =
+        _env.lookupLocalClassMember(setLiteralClass, '_makeLiteral');
+    _setLiteralUntypedEmptyMaker =
+        _env.lookupLocalClassMember(setLiteralClass, '_makeEmpty');
+  }
+
+  ConstructorEntity get setLiteralConstructor {
+    _ensureSetLiteralHelpers();
+    return _setLiteralConstructor;
+  }
+
+  ConstructorEntity get setLiteralConstructorEmpty {
+    _ensureSetLiteralHelpers();
+    return _setLiteralConstructorEmpty;
+  }
+
+  FunctionEntity get setLiteralUntypedMaker {
+    _ensureSetLiteralHelpers();
+    return _setLiteralUntypedMaker;
+  }
+
+  FunctionEntity get setLiteralUntypedEmptyMaker {
+    _ensureSetLiteralHelpers();
+    return _setLiteralUntypedEmptyMaker;
+  }
+
   FunctionEntity _objectNoSuchMethod;
   FunctionEntity get objectNoSuchMethod {
     return _objectNoSuchMethod ??=
@@ -1303,26 +1369,16 @@
   ClassEntity get constMapLiteralClass =>
       _constMapLiteralClass ??= _findHelperClass('ConstantMap');
 
+  // TODO(fishythefish): Implement a `ConstantSet` class and update the backend
+  // impacts + constant emitter accordingly.
+  ClassEntity _constSetLiteralClass;
+  ClassEntity get constSetLiteralClass =>
+      _constSetLiteralClass ??= unmodifiableSetClass;
+
   ClassEntity _typeVariableClass;
   ClassEntity get typeVariableClass =>
       _typeVariableClass ??= _findHelperClass('TypeVariable');
 
-  ClassEntity _noSideEffectsClass;
-  ClassEntity get noSideEffectsClass =>
-      _noSideEffectsClass ??= _findHelperClass('NoSideEffects');
-
-  ClassEntity _noThrowsClass;
-  ClassEntity get noThrowsClass =>
-      _noThrowsClass ??= _findHelperClass('NoThrows');
-
-  ClassEntity _noInlineClass;
-  ClassEntity get noInlineClass =>
-      _noInlineClass ??= _findHelperClass('NoInline');
-
-  ClassEntity _forceInlineClass;
-  ClassEntity get forceInlineClass =>
-      _forceInlineClass ??= _findHelperClass('ForceInline');
-
   ClassEntity _pragmaClass;
   ClassEntity get pragmaClass =>
       _pragmaClass ??= _findClass(coreLibrary, 'pragma');
@@ -1354,13 +1410,13 @@
   ClassEntity get stackTraceHelperClass => _findHelperClass('_StackTrace');
 
   ClassEntity get constantMapClass =>
-      _findHelperClass(JavaScriptMapConstant.DART_CLASS);
+      _findHelperClass(constant_system.JavaScriptMapConstant.DART_CLASS);
   ClassEntity get constantStringMapClass =>
-      _findHelperClass(JavaScriptMapConstant.DART_STRING_CLASS);
+      _findHelperClass(constant_system.JavaScriptMapConstant.DART_STRING_CLASS);
   ClassEntity get constantProtoMapClass =>
-      _findHelperClass(JavaScriptMapConstant.DART_PROTO_CLASS);
-  ClassEntity get generalConstantMapClass =>
-      _findHelperClass(JavaScriptMapConstant.DART_GENERAL_CLASS);
+      _findHelperClass(constant_system.JavaScriptMapConstant.DART_PROTO_CLASS);
+  ClassEntity get generalConstantMapClass => _findHelperClass(
+      constant_system.JavaScriptMapConstant.DART_GENERAL_CLASS);
 
   ClassEntity get annotationCreatesClass => _findHelperClass('Creates');
 
@@ -1658,39 +1714,6 @@
       _env.lookupLibrary(Uris.dart__js_embedded_names, required: true),
       'JsBuiltin');
 
-  static final Uri PACKAGE_EXPECT =
-      new Uri(scheme: 'package', path: 'expect/expect.dart');
-
-  bool _expectAnnotationChecked = false;
-  ClassEntity _expectNoInlineClass;
-  ClassEntity _expectAssumeDynamicClass;
-
-  void _ensureExpectAnnotations() {
-    if (!_expectAnnotationChecked) {
-      _expectAnnotationChecked = true;
-      LibraryEntity library = _env.lookupLibrary(PACKAGE_EXPECT);
-      if (library != null) {
-        _expectNoInlineClass = _env.lookupClass(library, 'NoInline');
-        _expectAssumeDynamicClass = _env.lookupClass(library, 'AssumeDynamic');
-        if (_expectNoInlineClass == null || _expectAssumeDynamicClass == null) {
-          // This is not the package you're looking for.
-          _expectNoInlineClass = null;
-          _expectAssumeDynamicClass = null;
-        }
-      }
-    }
-  }
-
-  ClassEntity get expectNoInlineClass {
-    _ensureExpectAnnotations();
-    return _expectNoInlineClass;
-  }
-
-  ClassEntity get expectAssumeDynamicClass {
-    _ensureExpectAnnotations();
-    return _expectAssumeDynamicClass;
-  }
-
   static final Uri PACKAGE_META_DART2JS =
       new Uri(scheme: 'package', path: 'meta/dart2js.dart');
 
diff --git a/pkg/compiler/lib/src/compile_time_constants.dart b/pkg/compiler/lib/src/compile_time_constants.dart
index 9055af7..20e7219 100644
--- a/pkg/compiler/lib/src/compile_time_constants.dart
+++ b/pkg/compiler/lib/src/compile_time_constants.dart
@@ -5,15 +5,11 @@
 library dart2js.compile_time_constant_evaluator;
 
 import 'common/tasks.dart' show CompilerTask, Measurer;
-import 'constants/constant_system.dart';
 import 'elements/entities.dart';
 
 /// A [ConstantEnvironment] provides access for constants compiled for variable
 /// initializers.
-abstract class ConstantEnvironment {
-  /// The [ConstantSystem] used by this environment.
-  ConstantSystem get constantSystem;
-}
+abstract class ConstantEnvironment {}
 
 /// A [BackendConstantEnvironment] provides access to constants needed for
 /// backend implementation.
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index b35401a..baffff3 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -251,6 +251,10 @@
     if (options.readDataUri != null) {
       GlobalTypeInferenceResults results =
           await serializationTask.deserialize();
+      if (options.debugGlobalInference) {
+        performGlobalTypeInference(results.closedWorld);
+        return;
+      }
       generateJavaScriptCode(results);
     } else {
       KernelResult result = await kernelLoader.load(uri);
diff --git a/pkg/compiler/lib/src/constant_system_dart.dart b/pkg/compiler/lib/src/constant_system_dart.dart
deleted file mode 100644
index 1fc88a5..0000000
--- a/pkg/compiler/lib/src/constant_system_dart.dart
+++ /dev/null
@@ -1,496 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.constant_system.dart;
-
-import 'constants/constant_system.dart';
-import 'constants/values.dart';
-import 'common_elements.dart' show CommonElements;
-import 'elements/types.dart';
-
-const DART_CONSTANT_SYSTEM = const DartConstantSystem();
-
-class BitNotOperation implements UnaryOperation {
-  final String name = '~';
-  const BitNotOperation();
-  ConstantValue fold(ConstantValue constant) {
-    if (constant.isInt) {
-      IntConstantValue intConstant = constant;
-      return DART_CONSTANT_SYSTEM.createInt(~intConstant.intValue);
-    }
-    return null;
-  }
-}
-
-class NegateOperation implements UnaryOperation {
-  final String name = 'negate';
-  const NegateOperation();
-  ConstantValue fold(ConstantValue constant) {
-    if (constant.isInt) {
-      IntConstantValue intConstant = constant;
-      return DART_CONSTANT_SYSTEM.createInt(-intConstant.intValue);
-    }
-    if (constant.isDouble) {
-      DoubleConstantValue doubleConstant = constant;
-      return DART_CONSTANT_SYSTEM.createDouble(-doubleConstant.doubleValue);
-    }
-    return null;
-  }
-}
-
-class NotOperation implements UnaryOperation {
-  final String name = '!';
-  const NotOperation();
-  ConstantValue fold(ConstantValue constant) {
-    if (constant.isBool) {
-      BoolConstantValue boolConstant = constant;
-      return DART_CONSTANT_SYSTEM.createBool(!boolConstant.boolValue);
-    }
-    return null;
-  }
-}
-
-/// Operations that only work if both arguments are integers.
-abstract class BinaryBitOperation implements BinaryOperation {
-  const BinaryBitOperation();
-  ConstantValue fold(ConstantValue left, ConstantValue right) {
-    if (left.isInt && right.isInt) {
-      IntConstantValue leftInt = left;
-      IntConstantValue rightInt = right;
-      BigInt resultValue = foldInts(leftInt.intValue, rightInt.intValue);
-      if (resultValue == null) return null;
-      return DART_CONSTANT_SYSTEM.createInt(resultValue);
-    }
-    return null;
-  }
-
-  BigInt foldInts(BigInt left, BigInt right);
-}
-
-class BitOrOperation extends BinaryBitOperation {
-  final String name = '|';
-  const BitOrOperation();
-  BigInt foldInts(BigInt left, BigInt right) => left | right;
-  apply(left, right) => left | right;
-}
-
-class BitAndOperation extends BinaryBitOperation {
-  final String name = '&';
-  const BitAndOperation();
-  BigInt foldInts(BigInt left, BigInt right) => left & right;
-  apply(left, right) => left & right;
-}
-
-class BitXorOperation extends BinaryBitOperation {
-  final String name = '^';
-  const BitXorOperation();
-  BigInt foldInts(BigInt left, BigInt right) => left ^ right;
-  apply(left, right) => left ^ right;
-}
-
-class ShiftLeftOperation extends BinaryBitOperation {
-  final String name = '<<';
-  const ShiftLeftOperation();
-  BigInt foldInts(BigInt left, BigInt right) {
-    // TODO(floitsch): find a better way to guard against excessive shifts to
-    // the left.
-    if (right > new BigInt.from(100) || right < BigInt.zero) return null;
-    return left << right.toInt();
-  }
-
-  apply(left, right) => left << right;
-}
-
-class ShiftRightOperation extends BinaryBitOperation {
-  final String name = '>>';
-  const ShiftRightOperation();
-  BigInt foldInts(BigInt left, BigInt right) {
-    if (right < BigInt.zero) return null;
-    return left >> right.toInt();
-  }
-
-  apply(left, right) => left >> right;
-}
-
-abstract class BinaryBoolOperation implements BinaryOperation {
-  const BinaryBoolOperation();
-  ConstantValue fold(ConstantValue left, ConstantValue right) {
-    if (left.isBool && right.isBool) {
-      BoolConstantValue leftBool = left;
-      BoolConstantValue rightBool = right;
-      bool resultValue = foldBools(leftBool.boolValue, rightBool.boolValue);
-      return DART_CONSTANT_SYSTEM.createBool(resultValue);
-    }
-    return null;
-  }
-
-  bool foldBools(bool left, bool right);
-}
-
-class BooleanAndOperation extends BinaryBoolOperation {
-  final String name = '&&';
-  const BooleanAndOperation();
-  bool foldBools(bool left, bool right) => left && right;
-  apply(left, right) => left && right;
-}
-
-class BooleanOrOperation extends BinaryBoolOperation {
-  final String name = '||';
-  const BooleanOrOperation();
-  bool foldBools(bool left, bool right) => left || right;
-  apply(left, right) => left || right;
-}
-
-abstract class ArithmeticNumOperation implements BinaryOperation {
-  const ArithmeticNumOperation();
-  ConstantValue fold(ConstantValue left, ConstantValue right) {
-    if (left.isNum && right.isNum) {
-      NumConstantValue leftNum = left;
-      NumConstantValue rightNum = right;
-      var foldedValue;
-      if (left.isInt && right.isInt) {
-        IntConstantValue leftInt = leftNum;
-        IntConstantValue rightInt = rightNum;
-        foldedValue = foldInts(leftInt.intValue, rightInt.intValue);
-      } else {
-        foldedValue = foldNums(leftNum.doubleValue, rightNum.doubleValue);
-      }
-      // A division by 0 means that we might not have a folded value.
-      if (foldedValue == null) return null;
-      if (left.isInt && right.isInt && !isDivide() || isTruncatingDivide()) {
-        assert(foldedValue is BigInt);
-        return DART_CONSTANT_SYSTEM.createInt(foldedValue);
-      } else {
-        return DART_CONSTANT_SYSTEM.createDouble(foldedValue);
-      }
-    }
-    return null;
-  }
-
-  bool isDivide() => false;
-  bool isTruncatingDivide() => false;
-  foldInts(BigInt left, BigInt right);
-  foldNums(num left, num right);
-}
-
-class SubtractOperation extends ArithmeticNumOperation {
-  final String name = '-';
-  const SubtractOperation();
-  BigInt foldInts(BigInt left, BigInt right) => left - right;
-  num foldNums(num left, num right) => left - right;
-  apply(left, right) => left - right;
-}
-
-class MultiplyOperation extends ArithmeticNumOperation {
-  final String name = '*';
-  const MultiplyOperation();
-  BigInt foldInts(BigInt left, BigInt right) => left * right;
-  num foldNums(num left, num right) => left * right;
-  apply(left, right) => left * right;
-}
-
-class ModuloOperation extends ArithmeticNumOperation {
-  final String name = '%';
-  const ModuloOperation();
-  BigInt foldInts(BigInt left, BigInt right) {
-    if (right == BigInt.zero) return null;
-    return left % right;
-  }
-
-  num foldNums(num left, num right) => left % right;
-  apply(left, right) => left % right;
-}
-
-class RemainderOperation extends ArithmeticNumOperation {
-  final String name = 'remainder';
-  const RemainderOperation();
-  BigInt foldInts(BigInt left, BigInt right) => null;
-  // Not a defined constant operation.
-  num foldNums(num left, num right) => null;
-  apply(left, right) => left.remainder(right);
-}
-
-class TruncatingDivideOperation extends ArithmeticNumOperation {
-  final String name = '~/';
-  const TruncatingDivideOperation();
-  BigInt foldInts(BigInt left, BigInt right) {
-    if (right == BigInt.zero) return null;
-    return left ~/ right;
-  }
-
-  BigInt foldNums(num left, num right) {
-    num ratio = left / right;
-    if (ratio.isNaN || ratio.isInfinite) return null;
-    return new BigInt.from(ratio.truncate().toInt());
-  }
-
-  apply(left, right) => left ~/ right;
-  bool isTruncatingDivide() => true;
-}
-
-class DivideOperation extends ArithmeticNumOperation {
-  final String name = '/';
-  const DivideOperation();
-  double foldInts(BigInt left, BigInt right) => left / right;
-  num foldNums(num left, num right) => left / right;
-  bool isDivide() => true;
-  apply(left, right) => left / right;
-}
-
-class AddOperation implements BinaryOperation {
-  final String name = '+';
-  const AddOperation();
-  ConstantValue fold(ConstantValue left, ConstantValue right) {
-    if (left.isInt && right.isInt) {
-      IntConstantValue leftInt = left;
-      IntConstantValue rightInt = right;
-      BigInt result = leftInt.intValue + rightInt.intValue;
-      return DART_CONSTANT_SYSTEM.createInt(result);
-    } else if (left.isNum && right.isNum) {
-      NumConstantValue leftNum = left;
-      NumConstantValue rightNum = right;
-      double result = leftNum.doubleValue + rightNum.doubleValue;
-      return DART_CONSTANT_SYSTEM.createDouble(result);
-    } else if (left.isString && right.isString) {
-      StringConstantValue leftString = left;
-      StringConstantValue rightString = right;
-      String result = leftString.stringValue + rightString.stringValue;
-      return DART_CONSTANT_SYSTEM.createString(result);
-    } else {
-      return null;
-    }
-  }
-
-  apply(left, right) => left + right;
-}
-
-abstract class RelationalNumOperation implements BinaryOperation {
-  const RelationalNumOperation();
-  ConstantValue fold(ConstantValue left, ConstantValue right) {
-    if (!left.isNum || !right.isNum) return null;
-    bool foldedValue;
-    if (left.isInt && right.isInt) {
-      IntConstantValue leftInt = left;
-      IntConstantValue rightInt = right;
-      foldedValue = foldInts(leftInt.intValue, rightInt.intValue);
-    } else {
-      NumConstantValue leftNum = left;
-      NumConstantValue rightNum = right;
-      foldedValue = foldNums(leftNum.doubleValue, rightNum.doubleValue);
-    }
-    assert(foldedValue != null);
-    return DART_CONSTANT_SYSTEM.createBool(foldedValue);
-  }
-
-  bool foldInts(BigInt left, BigInt right);
-  bool foldNums(num left, num right);
-}
-
-class LessOperation extends RelationalNumOperation {
-  final String name = '<';
-  const LessOperation();
-  bool foldInts(BigInt left, BigInt right) => left < right;
-  bool foldNums(num left, num right) => left < right;
-  apply(left, right) => left < right;
-}
-
-class LessEqualOperation extends RelationalNumOperation {
-  final String name = '<=';
-  const LessEqualOperation();
-  bool foldInts(BigInt left, BigInt right) => left <= right;
-  bool foldNums(num left, num right) => left <= right;
-  apply(left, right) => left <= right;
-}
-
-class GreaterOperation extends RelationalNumOperation {
-  final String name = '>';
-  const GreaterOperation();
-  bool foldInts(BigInt left, BigInt right) => left > right;
-  bool foldNums(num left, num right) => left > right;
-  apply(left, right) => left > right;
-}
-
-class GreaterEqualOperation extends RelationalNumOperation {
-  final String name = '>=';
-  const GreaterEqualOperation();
-  bool foldInts(BigInt left, BigInt right) => left >= right;
-  bool foldNums(num left, num right) => left >= right;
-  apply(left, right) => left >= right;
-}
-
-class EqualsOperation implements BinaryOperation {
-  final String name = '==';
-  const EqualsOperation();
-  ConstantValue fold(ConstantValue left, ConstantValue right) {
-    // Numbers need to be treated specially because: NaN != NaN, -0.0 == 0.0,
-    // and 1 == 1.0.
-    if (left.isInt && right.isInt) {
-      IntConstantValue leftInt = left;
-      IntConstantValue rightInt = right;
-      bool result = leftInt.intValue == rightInt.intValue;
-      return DART_CONSTANT_SYSTEM.createBool(result);
-    }
-
-    if (left.isNum && right.isNum) {
-      NumConstantValue leftNum = left;
-      NumConstantValue rightNum = right;
-      bool result = leftNum.doubleValue == rightNum.doubleValue;
-      return DART_CONSTANT_SYSTEM.createBool(result);
-    }
-
-    if (left.isConstructedObject) {
-      if (right.isNull) {
-        return DART_CONSTANT_SYSTEM.createBool(false);
-      }
-      // Unless we know that the user-defined object does not implement the
-      // equality operator we cannot fold here.
-      return null;
-    }
-
-    return DART_CONSTANT_SYSTEM.createBool(left == right);
-  }
-
-  apply(left, right) => left == right;
-}
-
-class IdentityOperation implements BinaryOperation {
-  final String name = '===';
-  const IdentityOperation();
-  BoolConstantValue fold(ConstantValue left, ConstantValue right) {
-    // In order to preserve runtime semantics which says that NaN !== NaN don't
-    // constant fold NaN === NaN. Otherwise the output depends on inlined
-    // variables and other optimizations.
-    if (left.isNaN && right.isNaN) return null;
-    return DART_CONSTANT_SYSTEM.createBool(left == right);
-  }
-
-  apply(left, right) => identical(left, right);
-}
-
-class IfNullOperation implements BinaryOperation {
-  final String name = '??';
-  const IfNullOperation();
-  ConstantValue fold(ConstantValue left, ConstantValue right) {
-    if (left.isNull) return right;
-    return left;
-  }
-
-  apply(left, right) => left ?? right;
-}
-
-class CodeUnitAtOperation implements BinaryOperation {
-  String get name => 'charCodeAt';
-  const CodeUnitAtOperation();
-  ConstantValue fold(ConstantValue left, ConstantValue right) => null;
-  apply(left, right) => left.codeUnitAt(right);
-}
-
-class CodeUnitAtRuntimeOperation extends CodeUnitAtOperation {
-  const CodeUnitAtRuntimeOperation();
-  IntConstantValue fold(ConstantValue left, ConstantValue right) {
-    if (left.isString && right.isInt) {
-      StringConstantValue stringConstant = left;
-      IntConstantValue indexConstant = right;
-      String string = stringConstant.stringValue;
-      int index = indexConstant.intValue.toInt();
-      if (index < 0 || index >= string.length) return null;
-      int value = string.codeUnitAt(index);
-      return DART_CONSTANT_SYSTEM.createIntFromInt(value);
-    }
-    return null;
-  }
-}
-
-class UnfoldedUnaryOperation implements UnaryOperation {
-  final String name;
-  const UnfoldedUnaryOperation(this.name);
-  ConstantValue fold(ConstantValue constant) {
-    return null;
-  }
-}
-
-/// A constant system implementing the Dart semantics. This system relies on
-/// the underlying runtime-system. That is, if dart2js is run in an environment
-/// that doesn't correctly implement Dart's semantics this constant system will
-/// not return the correct values.
-class DartConstantSystem extends ConstantSystem {
-  final add = const AddOperation();
-  final bitAnd = const BitAndOperation();
-  final bitNot = const BitNotOperation();
-  final bitOr = const BitOrOperation();
-  final bitXor = const BitXorOperation();
-  final booleanAnd = const BooleanAndOperation();
-  final booleanOr = const BooleanOrOperation();
-  final divide = const DivideOperation();
-  final equal = const EqualsOperation();
-  final greaterEqual = const GreaterEqualOperation();
-  final greater = const GreaterOperation();
-  final identity = const IdentityOperation();
-  final ifNull = const IfNullOperation();
-  final lessEqual = const LessEqualOperation();
-  final less = const LessOperation();
-  final modulo = const ModuloOperation();
-  final multiply = const MultiplyOperation();
-  final negate = const NegateOperation();
-  final not = const NotOperation();
-  final remainder = const RemainderOperation();
-  final shiftLeft = const ShiftLeftOperation();
-  final shiftRight = const ShiftRightOperation();
-  final subtract = const SubtractOperation();
-  final truncatingDivide = const TruncatingDivideOperation();
-  final codeUnitAt = const CodeUnitAtOperation();
-  final round = const UnfoldedUnaryOperation('round');
-  final abs = const UnfoldedUnaryOperation('abs');
-
-  const DartConstantSystem();
-
-  @override
-  IntConstantValue createInt(BigInt i) => new IntConstantValue(i);
-
-  @override
-  DoubleConstantValue createDouble(double d) => new DoubleConstantValue(d);
-
-  @override
-  StringConstantValue createString(String string) {
-    return new StringConstantValue(string);
-  }
-
-  @override
-  BoolConstantValue createBool(bool value) => new BoolConstantValue(value);
-
-  @override
-  NullConstantValue createNull() => new NullConstantValue();
-
-  @override
-  ListConstantValue createList(InterfaceType type, List<ConstantValue> values) {
-    return new ListConstantValue(type, values);
-  }
-
-  @override
-  MapConstantValue createMap(CommonElements commonElements, InterfaceType type,
-      List<ConstantValue> keys, List<ConstantValue> values) {
-    return new MapConstantValue(type, keys, values);
-  }
-
-  @override
-  ConstantValue createType(CommonElements commonElements, DartType type) {
-    InterfaceType implementationType = commonElements.typeLiteralType;
-    return new TypeConstantValue(type, implementationType);
-  }
-
-  @override
-  ConstantValue createSymbol(CommonElements commonElements, String text) {
-    throw new UnsupportedError('DartConstantSystem.createSymbol');
-  }
-
-  bool isInt(ConstantValue constant) => constant.isInt;
-  bool isDouble(ConstantValue constant) => constant.isDouble;
-  bool isString(ConstantValue constant) => constant.isString;
-  bool isBool(ConstantValue constant) => constant.isBool;
-  bool isNull(ConstantValue constant) => constant.isNull;
-
-  bool isSubtype(DartTypes types, DartType s, DartType t) {
-    return types.isSubtype(s, t);
-  }
-}
diff --git a/pkg/compiler/lib/src/constants/constant_system.dart b/pkg/compiler/lib/src/constants/constant_system.dart
index 91d89f2..701fc39 100644
--- a/pkg/compiler/lib/src/constants/constant_system.dart
+++ b/pkg/compiler/lib/src/constants/constant_system.dart
@@ -2,13 +2,253 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// Constant system following the semantics for Dart code that has been
+/// compiled to JavaScript.
 library dart2js.constant_system;
 
 import '../common_elements.dart' show CommonElements;
+import '../elements/entities.dart';
 import '../elements/operators.dart';
 import '../elements/types.dart';
 import 'values.dart';
 
+final _BITS32 = new BigInt.from(0xFFFFFFFF);
+
+const add = const AddOperation();
+const bitAnd = const BitAndOperation();
+const bitNot = const BitNotOperation();
+const bitOr = const BitOrOperation();
+const bitXor = const BitXorOperation();
+const booleanAnd = const BooleanAndOperation();
+const booleanOr = const BooleanOrOperation();
+const divide = const DivideOperation();
+const equal = const EqualsOperation();
+const greaterEqual = const GreaterEqualOperation();
+const greater = const GreaterOperation();
+const identity = const IdentityOperation();
+const ifNull = const IfNullOperation();
+const lessEqual = const LessEqualOperation();
+const less = const LessOperation();
+const modulo = const ModuloOperation();
+const multiply = const MultiplyOperation();
+const negate = const NegateOperation();
+const not = const NotOperation();
+const remainder = const RemainderOperation();
+const shiftLeft = const ShiftLeftOperation();
+const shiftRight = const ShiftRightOperation();
+const subtract = const SubtractOperation();
+const truncatingDivide = const TruncatingDivideOperation();
+const codeUnitAt = const CodeUnitAtOperation();
+const round = const RoundOperation();
+const abs = const UnfoldedUnaryOperation('abs');
+
+/// Returns true if [value] will turn into NaN or infinity
+/// at runtime.
+bool _integerBecomesNanOrInfinity(BigInt value) {
+  double doubleValue = value.toDouble();
+  return doubleValue.isNaN || doubleValue.isInfinite;
+}
+
+NumConstantValue _convertToJavaScriptConstant(NumConstantValue constant) {
+  if (constant.isInt) {
+    IntConstantValue intConstant = constant;
+    BigInt intValue = intConstant.intValue;
+    if (_integerBecomesNanOrInfinity(intValue)) {
+      return new DoubleConstantValue(intValue.toDouble());
+    }
+    // If the integer loses precision with JavaScript numbers, use
+    // the floored version JavaScript will use.
+    BigInt floorValue = new BigInt.from(intValue.toDouble());
+    if (floorValue != intValue) {
+      return new IntConstantValue(floorValue);
+    }
+  } else if (constant.isDouble) {
+    DoubleConstantValue doubleResult = constant;
+    double doubleValue = doubleResult.doubleValue;
+    if (!doubleValue.isInfinite &&
+        !doubleValue.isNaN &&
+        !constant.isMinusZero) {
+      double truncated = doubleValue.truncateToDouble();
+      if (truncated == doubleValue) {
+        return new IntConstantValue(new BigInt.from(truncated));
+      }
+    }
+  }
+  return constant;
+}
+
+NumConstantValue createInt(BigInt i) =>
+    _convertToJavaScriptConstant(new IntConstantValue(i));
+NumConstantValue createIntFromInt(int i) => createInt(new BigInt.from(i));
+NumConstantValue _createInt32(BigInt i) => new IntConstantValue(i & _BITS32);
+NumConstantValue createDouble(double d) =>
+    _convertToJavaScriptConstant(new DoubleConstantValue(d));
+StringConstantValue createString(String string) =>
+    new StringConstantValue(string);
+BoolConstantValue createBool(bool value) => new BoolConstantValue(value);
+NullConstantValue createNull() => new NullConstantValue();
+ListConstantValue createList(InterfaceType type, List<ConstantValue> values) =>
+    new ListConstantValue(type, values);
+
+ConstantValue createType(CommonElements commonElements, DartType type) {
+  InterfaceType instanceType = commonElements.typeLiteralType;
+  return new TypeConstantValue(type, instanceType);
+}
+
+/// Returns true if the [constant] is an integer at runtime.
+///
+/// Integer checks report true for -0.0, INFINITY, and -INFINITY.  At
+/// runtime an 'X is int' check is implemented as:
+///
+/// typeof(X) === "number" && Math.floor(X) === X
+///
+/// We consistently match that runtime semantics at compile time as well.
+bool isInt(ConstantValue constant) =>
+    constant.isInt ||
+    constant.isMinusZero ||
+    constant.isPositiveInfinity ||
+    constant.isNegativeInfinity;
+
+/// Returns true if the [constant] is a double at runtime.
+bool isDouble(ConstantValue constant) =>
+    constant.isDouble && !constant.isMinusZero;
+
+/// Returns true if the [constant] is a string at runtime.
+bool isString(ConstantValue constant) => constant.isString;
+
+/// Returns true if the [constant] is a boolean at runtime.
+bool isBool(ConstantValue constant) => constant.isBool;
+
+/// Returns true if the [constant] is null at runtime.
+bool isNull(ConstantValue constant) => constant.isNull;
+
+bool isSubtype(DartTypes types, DartType s, DartType t) {
+  // At runtime, an integer is both an integer and a double: the
+  // integer type check is Math.floor, which will return true only
+  // for real integers, and our double type check is 'typeof number'
+  // which will return true for both integers and doubles.
+  if (s == types.commonElements.intType &&
+      t == types.commonElements.doubleType) {
+    return true;
+  }
+  return types.isSubtype(s, t);
+}
+
+SetConstantValue createSet(CommonElements commonElements,
+    InterfaceType sourceType, List<ConstantValue> values) {
+  InterfaceType type = commonElements.getConstantSetTypeFor(sourceType);
+  DartType elementType = type.typeArguments.first;
+  InterfaceType mapType =
+      commonElements.mapType(elementType, commonElements.nullType);
+  List<NullConstantValue> nulls = new List<NullConstantValue>.filled(
+      values.length, const NullConstantValue());
+  MapConstantValue entries = createMap(commonElements, mapType, values, nulls);
+  return new JavaScriptSetConstant(type, entries);
+}
+
+MapConstantValue createMap(
+    CommonElements commonElements,
+    InterfaceType sourceType,
+    List<ConstantValue> keys,
+    List<ConstantValue> values) {
+  bool onlyStringKeys = true;
+  ConstantValue protoValue = null;
+  for (int i = 0; i < keys.length; i++) {
+    dynamic key = keys[i];
+    if (key.isString) {
+      if (key.stringValue == JavaScriptMapConstant.PROTO_PROPERTY) {
+        protoValue = values[i];
+      }
+    } else {
+      onlyStringKeys = false;
+      // Don't handle __proto__ values specially in the general map case.
+      protoValue = null;
+      break;
+    }
+  }
+
+  bool hasProtoKey = (protoValue != null);
+  InterfaceType keysType;
+  if (sourceType.treatAsRaw) {
+    keysType = commonElements.listType();
+  } else {
+    keysType = commonElements.listType(sourceType.typeArguments.first);
+  }
+  ListConstantValue keysList = new ListConstantValue(keysType, keys);
+  InterfaceType type = commonElements.getConstantMapTypeFor(sourceType,
+      hasProtoKey: hasProtoKey, onlyStringKeys: onlyStringKeys);
+  return new JavaScriptMapConstant(
+      type, keysList, values, protoValue, onlyStringKeys);
+}
+
+ConstantValue createSymbol(CommonElements commonElements, String text) {
+  InterfaceType type = commonElements.symbolImplementationType;
+  FieldEntity field = commonElements.symbolField;
+  ConstantValue argument = createString(text);
+  // TODO(johnniwinther): Use type arguments when all uses no longer expect
+  // a [FieldElement].
+  var fields = <FieldEntity, ConstantValue>{field: argument};
+  return new ConstructedConstantValue(type, fields);
+}
+
+UnaryOperation lookupUnary(UnaryOperator operator) {
+  switch (operator.kind) {
+    case UnaryOperatorKind.COMPLEMENT:
+      return bitNot;
+    case UnaryOperatorKind.NEGATE:
+      return negate;
+    case UnaryOperatorKind.NOT:
+      return not;
+    default:
+      return null;
+  }
+}
+
+BinaryOperation lookupBinary(BinaryOperator operator) {
+  switch (operator.kind) {
+    case BinaryOperatorKind.ADD:
+      return add;
+    case BinaryOperatorKind.SUB:
+      return subtract;
+    case BinaryOperatorKind.MUL:
+      return multiply;
+    case BinaryOperatorKind.DIV:
+      return divide;
+    case BinaryOperatorKind.MOD:
+      return modulo;
+    case BinaryOperatorKind.IDIV:
+      return truncatingDivide;
+    case BinaryOperatorKind.OR:
+      return bitOr;
+    case BinaryOperatorKind.AND:
+      return bitAnd;
+    case BinaryOperatorKind.XOR:
+      return bitXor;
+    case BinaryOperatorKind.LOGICAL_OR:
+      return booleanOr;
+    case BinaryOperatorKind.LOGICAL_AND:
+      return booleanAnd;
+    case BinaryOperatorKind.SHL:
+      return shiftLeft;
+    case BinaryOperatorKind.SHR:
+      return shiftRight;
+    case BinaryOperatorKind.LT:
+      return less;
+    case BinaryOperatorKind.LTEQ:
+      return lessEqual;
+    case BinaryOperatorKind.GT:
+      return greater;
+    case BinaryOperatorKind.GTEQ:
+      return greaterEqual;
+    case BinaryOperatorKind.EQ:
+      return equal;
+    case BinaryOperatorKind.IF_NULL:
+      return ifNull;
+    default:
+      return null;
+  }
+}
+
 abstract class Operation {
   String get name;
 }
@@ -24,125 +264,755 @@
   apply(left, right);
 }
 
-/// A [ConstantSystem] is responsible for creating constants and folding them.
-abstract class ConstantSystem {
-  BinaryOperation get add;
-  BinaryOperation get bitAnd;
-  UnaryOperation get bitNot;
-  BinaryOperation get bitOr;
-  BinaryOperation get bitXor;
-  BinaryOperation get booleanAnd;
-  BinaryOperation get booleanOr;
-  BinaryOperation get divide;
-  BinaryOperation get equal;
-  BinaryOperation get greaterEqual;
-  BinaryOperation get greater;
-  BinaryOperation get identity;
-  BinaryOperation get ifNull;
-  BinaryOperation get lessEqual;
-  BinaryOperation get less;
-  BinaryOperation get modulo;
-  BinaryOperation get multiply;
-  UnaryOperation get negate;
-  UnaryOperation get not;
-  BinaryOperation get remainder;
-  BinaryOperation get shiftLeft;
-  BinaryOperation get shiftRight;
-  BinaryOperation get subtract;
-  BinaryOperation get truncatingDivide;
+class BitNotOperation implements UnaryOperation {
+  @override
+  final String name = '~';
 
-  BinaryOperation get codeUnitAt;
-  UnaryOperation get round;
-  UnaryOperation get abs;
+  const BitNotOperation();
 
-  const ConstantSystem();
-
-  ConstantValue createInt(BigInt i);
-  ConstantValue createIntFromInt(int i) => createInt(new BigInt.from(i));
-  ConstantValue createDouble(double d);
-  ConstantValue createString(String string);
-  ConstantValue createBool(bool value);
-  ConstantValue createNull();
-  ConstantValue createList(InterfaceType type, List<ConstantValue> values);
-  ConstantValue createMap(CommonElements commonElements, InterfaceType type,
-      List<ConstantValue> keys, List<ConstantValue> values);
-  ConstantValue createType(CommonElements commonElements, DartType type);
-  ConstantValue createSymbol(CommonElements commonElements, String text);
-
-  // We need to special case the subtype check for JavaScript constant
-  // system because an int is a double at runtime.
-  bool isSubtype(DartTypes types, DartType s, DartType t);
-
-  /// Returns true if the [constant] is an integer at runtime.
-  bool isInt(ConstantValue constant);
-
-  /// Returns true if the [constant] is a double at runtime.
-  bool isDouble(ConstantValue constant);
-
-  /// Returns true if the [constant] is a string at runtime.
-  bool isString(ConstantValue constant);
-
-  /// Returns true if the [constant] is a boolean at runtime.
-  bool isBool(ConstantValue constant);
-
-  /// Returns true if the [constant] is null at runtime.
-  bool isNull(ConstantValue constant);
-
-  UnaryOperation lookupUnary(UnaryOperator operator) {
-    switch (operator.kind) {
-      case UnaryOperatorKind.COMPLEMENT:
-        return bitNot;
-      case UnaryOperatorKind.NEGATE:
-        return negate;
-      case UnaryOperatorKind.NOT:
-        return not;
-      default:
-        return null;
+  @override
+  ConstantValue fold(ConstantValue constant) {
+    if (isInt(constant)) {
+      // In JavaScript we don't check for -0 and treat it as if it was zero.
+      if (constant.isMinusZero) {
+        constant = createInt(BigInt.zero);
+      }
+      IntConstantValue intConstant = constant;
+      // We convert the result of bit-operations to 32 bit unsigned integers.
+      return _createInt32(~intConstant.intValue);
     }
+    return null;
+  }
+}
+
+class NegateOperation implements UnaryOperation {
+  @override
+  final String name = 'negate';
+
+  const NegateOperation();
+
+  @override
+  ConstantValue fold(ConstantValue constant) {
+    ConstantValue _fold(ConstantValue constant) {
+      if (constant.isInt) {
+        IntConstantValue intConstant = constant;
+        return createInt(-intConstant.intValue);
+      }
+      if (constant.isDouble) {
+        DoubleConstantValue doubleConstant = constant;
+        return createDouble(-doubleConstant.doubleValue);
+      }
+      return null;
+    }
+
+    if (constant.isInt) {
+      IntConstantValue intConstant = constant;
+      if (intConstant.intValue == BigInt.zero) {
+        return createDouble(-0.0);
+      }
+    }
+    return _fold(constant);
+  }
+}
+
+class NotOperation implements UnaryOperation {
+  @override
+  final String name = '!';
+
+  const NotOperation();
+
+  @override
+  ConstantValue fold(ConstantValue constant) {
+    if (constant.isBool) {
+      BoolConstantValue boolConstant = constant;
+      return createBool(!boolConstant.boolValue);
+    }
+    return null;
+  }
+}
+
+/// Operations that only work if both arguments are integers.
+abstract class BinaryBitOperation implements BinaryOperation {
+  const BinaryBitOperation();
+
+  @override
+  ConstantValue fold(ConstantValue left, ConstantValue right) {
+    ConstantValue _fold(ConstantValue left, ConstantValue right) {
+      if (left.isInt && right.isInt) {
+        IntConstantValue leftInt = left;
+        IntConstantValue rightInt = right;
+        BigInt resultValue = foldInts(leftInt.intValue, rightInt.intValue);
+        if (resultValue == null) return null;
+        return createInt(resultValue);
+      }
+      return null;
+    }
+
+    // In JavaScript we don't check for -0 and treat it as if it was zero.
+    if (left.isMinusZero) {
+      left = createInt(BigInt.zero);
+    }
+    if (right.isMinusZero) {
+      right = createInt(BigInt.zero);
+    }
+    IntConstantValue result = _fold(left, right);
+    if (result != null) {
+      // We convert the result of bit-operations to 32 bit unsigned integers.
+      return _createInt32(result.intValue);
+    }
+    return result;
   }
 
-  BinaryOperation lookupBinary(BinaryOperator operator) {
-    switch (operator.kind) {
-      case BinaryOperatorKind.ADD:
-        return add;
-      case BinaryOperatorKind.SUB:
-        return subtract;
-      case BinaryOperatorKind.MUL:
-        return multiply;
-      case BinaryOperatorKind.DIV:
-        return divide;
-      case BinaryOperatorKind.MOD:
-        return modulo;
-      case BinaryOperatorKind.IDIV:
-        return truncatingDivide;
-      case BinaryOperatorKind.OR:
-        return bitOr;
-      case BinaryOperatorKind.AND:
-        return bitAnd;
-      case BinaryOperatorKind.XOR:
-        return bitXor;
-      case BinaryOperatorKind.LOGICAL_OR:
-        return booleanOr;
-      case BinaryOperatorKind.LOGICAL_AND:
-        return booleanAnd;
-      case BinaryOperatorKind.SHL:
-        return shiftLeft;
-      case BinaryOperatorKind.SHR:
-        return shiftRight;
-      case BinaryOperatorKind.LT:
-        return less;
-      case BinaryOperatorKind.LTEQ:
-        return lessEqual;
-      case BinaryOperatorKind.GT:
-        return greater;
-      case BinaryOperatorKind.GTEQ:
-        return greaterEqual;
-      case BinaryOperatorKind.EQ:
-        return equal;
-      case BinaryOperatorKind.IF_NULL:
-        return ifNull;
-      default:
-        return null;
+  BigInt foldInts(BigInt left, BigInt right);
+}
+
+class BitAndOperation extends BinaryBitOperation {
+  @override
+  final String name = '&';
+
+  const BitAndOperation();
+
+  @override
+  BigInt foldInts(BigInt left, BigInt right) => left & right;
+
+  @override
+  apply(left, right) => left & right;
+}
+
+class BitOrOperation extends BinaryBitOperation {
+  @override
+  final String name = '|';
+
+  const BitOrOperation();
+
+  @override
+  BigInt foldInts(BigInt left, BigInt right) => left | right;
+
+  @override
+  apply(left, right) => left | right;
+}
+
+class BitXorOperation extends BinaryBitOperation {
+  @override
+  final String name = '^';
+
+  const BitXorOperation();
+
+  @override
+  BigInt foldInts(BigInt left, BigInt right) => left ^ right;
+
+  @override
+  apply(left, right) => left ^ right;
+}
+
+class ShiftLeftOperation extends BinaryBitOperation {
+  @override
+  final String name = '<<';
+
+  const ShiftLeftOperation();
+
+  @override
+  BigInt foldInts(BigInt left, BigInt right) {
+    // TODO(floitsch): find a better way to guard against excessive shifts to
+    // the left.
+    if (right > new BigInt.from(100) || right < BigInt.zero) return null;
+    return left << right.toInt();
+  }
+
+  @override
+  apply(left, right) => left << right;
+}
+
+class ShiftRightOperation extends BinaryBitOperation {
+  @override
+  final String name = '>>';
+
+  const ShiftRightOperation();
+
+  @override
+  ConstantValue fold(ConstantValue left, ConstantValue right) {
+    // Truncate the input value to 32 bits if necessary.
+    if (left.isInt) {
+      IntConstantValue intConstant = left;
+      BigInt value = intConstant.intValue;
+      BigInt truncatedValue = value & _BITS32;
+      if (value < BigInt.zero) {
+        // Sign-extend if the input was negative. The current semantics don't
+        // make much sense, since we only look at bit 31.
+        // TODO(floitsch): we should treat the input to right shifts as
+        // unsigned.
+
+        // A 32 bit complement-two value x can be computed by:
+        //    x_u - 2^32 (where x_u is its unsigned representation).
+        // Example: 0xFFFFFFFF - 0x100000000 => -1.
+        // We simply and with the sign-bit and multiply by two. If the sign-bit
+        // was set, then the result is 0. Otherwise it will become 2^32.
+        final BigInt SIGN_BIT = new BigInt.from(0x80000000);
+        truncatedValue -= BigInt.two * (truncatedValue & SIGN_BIT);
+      }
+      if (value != truncatedValue) {
+        left = createInt(truncatedValue);
+      }
     }
+    return super.fold(left, right);
+  }
+
+  @override
+  BigInt foldInts(BigInt left, BigInt right) {
+    if (right < BigInt.zero) return null;
+    return left >> right.toInt();
+  }
+
+  @override
+  apply(left, right) => left >> right;
+}
+
+abstract class BinaryBoolOperation implements BinaryOperation {
+  const BinaryBoolOperation();
+
+  @override
+  ConstantValue fold(ConstantValue left, ConstantValue right) {
+    if (left.isBool && right.isBool) {
+      BoolConstantValue leftBool = left;
+      BoolConstantValue rightBool = right;
+      bool resultValue = foldBools(leftBool.boolValue, rightBool.boolValue);
+      return createBool(resultValue);
+    }
+    return null;
+  }
+
+  bool foldBools(bool left, bool right);
+}
+
+class BooleanAndOperation extends BinaryBoolOperation {
+  @override
+  final String name = '&&';
+
+  const BooleanAndOperation();
+
+  @override
+  bool foldBools(bool left, bool right) => left && right;
+
+  @override
+  apply(left, right) => left && right;
+}
+
+class BooleanOrOperation extends BinaryBoolOperation {
+  @override
+  final String name = '||';
+
+  const BooleanOrOperation();
+
+  @override
+  bool foldBools(bool left, bool right) => left || right;
+
+  @override
+  apply(left, right) => left || right;
+}
+
+abstract class ArithmeticNumOperation implements BinaryOperation {
+  const ArithmeticNumOperation();
+
+  @override
+  ConstantValue fold(ConstantValue left, ConstantValue right) {
+    ConstantValue _fold(ConstantValue left, ConstantValue right) {
+      if (left.isNum && right.isNum) {
+        NumConstantValue leftNum = left;
+        NumConstantValue rightNum = right;
+        var foldedValue;
+        if (left.isInt && right.isInt) {
+          IntConstantValue leftInt = leftNum;
+          IntConstantValue rightInt = rightNum;
+          foldedValue = foldInts(leftInt.intValue, rightInt.intValue);
+        } else {
+          foldedValue = foldNums(leftNum.doubleValue, rightNum.doubleValue);
+        }
+        // A division by 0 means that we might not have a folded value.
+        if (foldedValue == null) return null;
+        if (left.isInt && right.isInt && !isDivide() || isTruncatingDivide()) {
+          assert(foldedValue is BigInt);
+          return createInt(foldedValue);
+        } else {
+          return createDouble(foldedValue);
+        }
+      }
+      return null;
+    }
+
+    ConstantValue result = _fold(left, right);
+    if (result == null) return result;
+    return _convertToJavaScriptConstant(result);
+  }
+
+  bool isDivide() => false;
+  bool isTruncatingDivide() => false;
+  foldInts(BigInt left, BigInt right);
+  foldNums(num left, num right);
+}
+
+class SubtractOperation extends ArithmeticNumOperation {
+  @override
+  final String name = '-';
+
+  const SubtractOperation();
+
+  @override
+  BigInt foldInts(BigInt left, BigInt right) => left - right;
+
+  @override
+  num foldNums(num left, num right) => left - right;
+
+  @override
+  apply(left, right) => left - right;
+}
+
+class MultiplyOperation extends ArithmeticNumOperation {
+  @override
+  final String name = '*';
+
+  const MultiplyOperation();
+
+  @override
+  BigInt foldInts(BigInt left, BigInt right) => left * right;
+
+  @override
+  num foldNums(num left, num right) => left * right;
+
+  @override
+  apply(left, right) => left * right;
+}
+
+class ModuloOperation extends ArithmeticNumOperation {
+  @override
+  final String name = '%';
+
+  const ModuloOperation();
+
+  @override
+  BigInt foldInts(BigInt left, BigInt right) {
+    if (right == BigInt.zero) return null;
+    return left % right;
+  }
+
+  @override
+  num foldNums(num left, num right) => left % right;
+
+  @override
+  apply(left, right) => left % right;
+}
+
+class RemainderOperation extends ArithmeticNumOperation {
+  @override
+  final String name = 'remainder';
+
+  const RemainderOperation();
+
+  @override
+  BigInt foldInts(BigInt left, BigInt right) {
+    if (right == BigInt.zero) return null;
+    return left.remainder(right);
+  }
+
+  @override
+  num foldNums(num left, num right) => left.remainder(right);
+
+  @override
+  apply(left, right) => left.remainder(right);
+}
+
+class TruncatingDivideOperation extends ArithmeticNumOperation {
+  @override
+  final String name = '~/';
+
+  const TruncatingDivideOperation();
+
+  @override
+  BigInt foldInts(BigInt left, BigInt right) {
+    if (right == BigInt.zero) return null;
+    return left ~/ right;
+  }
+
+  @override
+  BigInt foldNums(num left, num right) {
+    num ratio = left / right;
+    if (ratio.isNaN || ratio.isInfinite) return null;
+    return new BigInt.from(ratio.truncate().toInt());
+  }
+
+  @override
+  apply(left, right) => left ~/ right;
+
+  @override
+  bool isTruncatingDivide() => true;
+}
+
+class DivideOperation extends ArithmeticNumOperation {
+  @override
+  final String name = '/';
+
+  const DivideOperation();
+
+  @override
+  double foldInts(BigInt left, BigInt right) => left / right;
+
+  @override
+  num foldNums(num left, num right) => left / right;
+
+  @override
+  bool isDivide() => true;
+
+  @override
+  apply(left, right) => left / right;
+}
+
+class AddOperation implements BinaryOperation {
+  @override
+  final String name = '+';
+
+  const AddOperation();
+
+  @override
+  ConstantValue fold(ConstantValue left, ConstantValue right) {
+    ConstantValue _fold(ConstantValue left, ConstantValue right) {
+      if (left.isInt && right.isInt) {
+        IntConstantValue leftInt = left;
+        IntConstantValue rightInt = right;
+        BigInt result = leftInt.intValue + rightInt.intValue;
+        return createInt(result);
+      } else if (left.isNum && right.isNum) {
+        NumConstantValue leftNum = left;
+        NumConstantValue rightNum = right;
+        double result = leftNum.doubleValue + rightNum.doubleValue;
+        return createDouble(result);
+      } else if (left.isString && right.isString) {
+        StringConstantValue leftString = left;
+        StringConstantValue rightString = right;
+        String result = leftString.stringValue + rightString.stringValue;
+        return createString(result);
+      } else {
+        return null;
+      }
+    }
+
+    ConstantValue result = _fold(left, right);
+    if (result != null && result.isNum) {
+      return _convertToJavaScriptConstant(result);
+    }
+    return result;
+  }
+
+  @override
+  apply(left, right) => left + right;
+}
+
+abstract class RelationalNumOperation implements BinaryOperation {
+  const RelationalNumOperation();
+
+  @override
+  ConstantValue fold(ConstantValue left, ConstantValue right) {
+    if (!left.isNum || !right.isNum) return null;
+    bool foldedValue;
+    if (left.isInt && right.isInt) {
+      IntConstantValue leftInt = left;
+      IntConstantValue rightInt = right;
+      foldedValue = foldInts(leftInt.intValue, rightInt.intValue);
+    } else {
+      NumConstantValue leftNum = left;
+      NumConstantValue rightNum = right;
+      foldedValue = foldNums(leftNum.doubleValue, rightNum.doubleValue);
+    }
+    assert(foldedValue != null);
+    return createBool(foldedValue);
+  }
+
+  bool foldInts(BigInt left, BigInt right);
+  bool foldNums(num left, num right);
+}
+
+class LessOperation extends RelationalNumOperation {
+  @override
+  final String name = '<';
+
+  const LessOperation();
+
+  @override
+  bool foldInts(BigInt left, BigInt right) => left < right;
+
+  @override
+  bool foldNums(num left, num right) => left < right;
+
+  @override
+  apply(left, right) => left < right;
+}
+
+class LessEqualOperation extends RelationalNumOperation {
+  @override
+  final String name = '<=';
+
+  const LessEqualOperation();
+
+  @override
+  bool foldInts(BigInt left, BigInt right) => left <= right;
+
+  @override
+  bool foldNums(num left, num right) => left <= right;
+
+  @override
+  apply(left, right) => left <= right;
+}
+
+class GreaterOperation extends RelationalNumOperation {
+  @override
+  final String name = '>';
+
+  const GreaterOperation();
+
+  @override
+  bool foldInts(BigInt left, BigInt right) => left > right;
+
+  @override
+  bool foldNums(num left, num right) => left > right;
+
+  @override
+  apply(left, right) => left > right;
+}
+
+class GreaterEqualOperation extends RelationalNumOperation {
+  @override
+  final String name = '>=';
+
+  const GreaterEqualOperation();
+
+  @override
+  bool foldInts(BigInt left, BigInt right) => left >= right;
+
+  @override
+  bool foldNums(num left, num right) => left >= right;
+
+  @override
+  apply(left, right) => left >= right;
+}
+
+class EqualsOperation implements BinaryOperation {
+  @override
+  final String name = '==';
+
+  const EqualsOperation();
+
+  @override
+  ConstantValue fold(ConstantValue left, ConstantValue right) {
+    // Numbers need to be treated specially because: NaN != NaN, -0.0 == 0.0,
+    // and 1 == 1.0.
+    if (left.isInt && right.isInt) {
+      IntConstantValue leftInt = left;
+      IntConstantValue rightInt = right;
+      bool result = leftInt.intValue == rightInt.intValue;
+      return createBool(result);
+    }
+
+    if (left.isNum && right.isNum) {
+      NumConstantValue leftNum = left;
+      NumConstantValue rightNum = right;
+      bool result = leftNum.doubleValue == rightNum.doubleValue;
+      return createBool(result);
+    }
+
+    if (left.isConstructedObject) {
+      if (right.isNull) {
+        return createBool(false);
+      }
+      // Unless we know that the user-defined object does not implement the
+      // equality operator we cannot fold here.
+      return null;
+    }
+
+    return createBool(left == right);
+  }
+
+  @override
+  apply(left, right) => left == right;
+}
+
+class IdentityOperation implements BinaryOperation {
+  @override
+  final String name = '===';
+
+  const IdentityOperation();
+
+  @override
+  BoolConstantValue fold(ConstantValue left, ConstantValue right) {
+    BoolConstantValue _fold(ConstantValue left, ConstantValue right) {
+      // In order to preserve runtime semantics which says that NaN !== NaN
+      // don't constant fold NaN === NaN. Otherwise the output depends on
+      // inlined variables and other optimizations.
+      if (left.isNaN && right.isNaN) return null;
+      return createBool(left == right);
+    }
+
+    BoolConstantValue result = _fold(left, right);
+    if (result == null || result.boolValue) return result;
+    // In JavaScript -0.0 === 0 and all doubles are equal to their integer
+    // values. Furthermore NaN !== NaN.
+    if (left.isInt && right.isInt) {
+      IntConstantValue leftInt = left;
+      IntConstantValue rightInt = right;
+      return new BoolConstantValue(leftInt.intValue == rightInt.intValue);
+    }
+    if (left.isNum && right.isNum) {
+      NumConstantValue leftNum = left;
+      NumConstantValue rightNum = right;
+      double leftDouble = leftNum.doubleValue;
+      double rightDouble = rightNum.doubleValue;
+      return new BoolConstantValue(leftDouble == rightDouble);
+    }
+    return result;
+  }
+
+  @override
+  apply(left, right) => identical(left, right);
+}
+
+class IfNullOperation implements BinaryOperation {
+  @override
+  final String name = '??';
+
+  const IfNullOperation();
+
+  @override
+  ConstantValue fold(ConstantValue left, ConstantValue right) {
+    if (left.isNull) return right;
+    return left;
+  }
+
+  @override
+  apply(left, right) => left ?? right;
+}
+
+class CodeUnitAtOperation implements BinaryOperation {
+  @override
+  final String name = 'charCodeAt';
+
+  const CodeUnitAtOperation();
+
+  @override
+  IntConstantValue fold(ConstantValue left, ConstantValue right) {
+    if (left.isString && right.isInt) {
+      StringConstantValue stringConstant = left;
+      IntConstantValue indexConstant = right;
+      String string = stringConstant.stringValue;
+      int index = indexConstant.intValue.toInt();
+      if (index < 0 || index >= string.length) return null;
+      int value = string.codeUnitAt(index);
+      return createIntFromInt(value);
+    }
+    return null;
+  }
+
+  @override
+  apply(left, right) => left.codeUnitAt(right);
+}
+
+class RoundOperation implements UnaryOperation {
+  @override
+  final String name = 'round';
+
+  const RoundOperation();
+
+  @override
+  ConstantValue fold(ConstantValue constant) {
+    // Be careful to round() only values that do not throw on either the host or
+    // target platform.
+    ConstantValue tryToRound(double value) {
+      // Due to differences between browsers, only 'round' easy cases. Avoid
+      // cases where nudging the value up or down changes the answer.
+      // 13 digits is safely within the ~15 digit precision of doubles.
+      const severalULP = 0.0000000000001;
+      // Use 'roundToDouble()' to avoid exceptions on rounding the nudged value.
+      double rounded = value.roundToDouble();
+      double rounded1 = (value * (1.0 + severalULP)).roundToDouble();
+      double rounded2 = (value * (1.0 - severalULP)).roundToDouble();
+      if (rounded != rounded1 || rounded != rounded2) return null;
+      return _convertToJavaScriptConstant(
+          new IntConstantValue(new BigInt.from(value.round())));
+    }
+
+    if (constant.isInt) {
+      IntConstantValue intConstant = constant;
+      double value = intConstant.intValue.toDouble();
+      if (value >= -double.maxFinite && value <= double.maxFinite) {
+        return tryToRound(value);
+      }
+    }
+    if (constant.isDouble) {
+      DoubleConstantValue doubleConstant = constant;
+      double value = doubleConstant.doubleValue;
+      // NaN and infinities will throw.
+      if (value.isNaN) return null;
+      if (value.isInfinite) return null;
+      return tryToRound(value);
+    }
+    return null;
+  }
+}
+
+class UnfoldedUnaryOperation implements UnaryOperation {
+  @override
+  final String name;
+
+  const UnfoldedUnaryOperation(this.name);
+
+  @override
+  ConstantValue fold(ConstantValue constant) {
+    return null;
+  }
+}
+
+class JavaScriptSetConstant extends SetConstantValue {
+  final MapConstantValue entries;
+
+  JavaScriptSetConstant(InterfaceType type, this.entries)
+      : super(type, entries.keys);
+
+  @override
+  List<ConstantValue> getDependencies() => [entries];
+}
+
+class JavaScriptMapConstant extends MapConstantValue {
+  /// The [PROTO_PROPERTY] must not be used as normal property in any JavaScript
+  /// object. It would change the prototype chain.
+  static const String PROTO_PROPERTY = "__proto__";
+
+  /// The dart class implementing constant map literals.
+  static const String DART_CLASS = "ConstantMap";
+  static const String DART_STRING_CLASS = "ConstantStringMap";
+  static const String DART_PROTO_CLASS = "ConstantProtoMap";
+  static const String DART_GENERAL_CLASS = "GeneralConstantMap";
+  static const String LENGTH_NAME = "_length";
+  static const String JS_OBJECT_NAME = "_jsObject";
+  static const String KEYS_NAME = "_keys";
+  static const String PROTO_VALUE = "_protoValue";
+  static const String JS_DATA_NAME = "_jsData";
+
+  final ListConstantValue keyList;
+  final ConstantValue protoValue;
+  final bool onlyStringKeys;
+
+  JavaScriptMapConstant(InterfaceType type, ListConstantValue keyList,
+      List<ConstantValue> values, this.protoValue, this.onlyStringKeys)
+      : this.keyList = keyList,
+        super(type, keyList.entries, values);
+  bool get isMap => true;
+
+  List<ConstantValue> getDependencies() {
+    List<ConstantValue> result = <ConstantValue>[];
+    if (onlyStringKeys) {
+      result.add(keyList);
+    } else {
+      // Add the keys individually to avoid generating an unused list constant
+      // for the keys.
+      result.addAll(keys);
+    }
+    result.addAll(values);
+    return result;
   }
 }
diff --git a/pkg/compiler/lib/src/constants/evaluation.dart b/pkg/compiler/lib/src/constants/evaluation.dart
index 386a2ee..e9ac77a 100644
--- a/pkg/compiler/lib/src/constants/evaluation.dart
+++ b/pkg/compiler/lib/src/constants/evaluation.dart
@@ -24,12 +24,6 @@
   /// Type in the enclosing constructed
   InterfaceType get enclosingConstructedType;
 
-  /// Whether the immediate parent is a set literal.
-  ///
-  /// Used to distinguish map-literal from set-literal errors. This will be
-  /// removed once the CFE reports errors on constants.
-  bool get immediateUnderSetLiteral;
-
   /// Read environments string passed in using the '-Dname=value' option.
   String readFromEnvironment(String name);
 
@@ -78,7 +72,6 @@
 abstract class EvaluationEnvironmentBase implements EvaluationEnvironment {
   Link<Spannable> _spannableStack = const Link<Spannable>();
   InterfaceType enclosingConstructedType;
-  bool immediateUnderSetLiteral = false;
   final Set<FieldEntity> _currentlyEvaluatedFields = new Set<FieldEntity>();
   final bool constantRequired;
 
@@ -126,14 +119,10 @@
     _spannableStack = _spannableStack.prepend(constructor);
     var old = enclosingConstructedType;
     enclosingConstructedType = type;
-    if (type.element == commonElements.unmodifiableSetClass) {
-      immediateUnderSetLiteral = true;
-    }
     ConstantValue result = evaluate();
     // All const set literals have as an immediate child a const map. The map
     // evaluate method calls evaluateMapBody and reset this flag immediately.
     // Because there are no other children, the flag is kept false.
-    assert(!immediateUnderSetLiteral);
     enclosingConstructedType = old;
     _spannableStack = _spannableStack.tail;
     return result;
@@ -141,7 +130,6 @@
 
   @override
   ConstantValue evaluateMapBody(ConstantValue evaluate()) {
-    immediateUnderSetLiteral = false;
     return evaluate();
   }
 
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index 82f640d..d0abc41 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -4,9 +4,11 @@
 
 library dart2js.constants.expressions;
 
+import 'dart:collection';
+
 import '../common.dart';
-import '../constants/constant_system.dart';
 import '../common_elements.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../elements/entities.dart';
 import '../elements/operators.dart';
 import '../elements/types.dart';
@@ -32,6 +34,7 @@
   INT,
   INT_FROM_ENVIRONMENT,
   LIST,
+  SET,
   MAP,
   NULL,
   STRING,
@@ -70,10 +73,8 @@
   /// Substitute free variables using arguments.
   ConstantExpression apply(NormalizedArguments arguments) => this;
 
-  /// Compute the [ConstantValue] for this expression using the [environment]
-  /// and the [constantSystem].
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem);
+  /// Compute the [ConstantValue] for this expression using the [environment].
+  ConstantValue evaluate(EvaluationEnvironment environment);
 
   /// Returns the type of this constant expression, if it is independent of the
   /// environment values.
@@ -142,8 +143,7 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     // TODO(johnniwinther): Use non-constant values for errors.
     return new NonConstantValue();
   }
@@ -178,9 +178,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createBool(boolValue);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createBool(boolValue);
   }
 
   @override
@@ -214,9 +213,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createInt(intValue);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createInt(intValue);
   }
 
   @override
@@ -250,9 +248,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createDouble(doubleValue);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createDouble(doubleValue);
   }
 
   @override
@@ -286,9 +283,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createString(stringValue);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createString(stringValue);
   }
 
   @override
@@ -320,9 +316,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createNull();
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createNull();
   }
 
   @override
@@ -362,10 +357,9 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createList(type,
-        values.map((v) => v.evaluate(environment, constantSystem)).toList());
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createList(
+        type, values.map((v) => v.evaluate(environment)).toList());
   }
 
   ConstantExpression apply(NormalizedArguments arguments) {
@@ -402,6 +396,77 @@
   bool get isPotential => values.any((e) => e.isPotential);
 }
 
+/// Literal set constant.
+class SetConstantExpression extends ConstantExpression {
+  final InterfaceType type;
+  final List<ConstantExpression> values;
+
+  SetConstantExpression(this.type, this.values);
+
+  @override
+  ConstantExpressionKind get kind => ConstantExpressionKind.SET;
+
+  @override
+  accept(ConstantExpressionVisitor visitor, [context]) {
+    return visitor.visitSet(this, context);
+  }
+
+  @override
+  ConstantExpression apply(NormalizedArguments arguments) =>
+      new SetConstantExpression(
+          type, values.map((v) => v.apply(arguments)).toList());
+
+  @override
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    // TODO(fishythefish): Delete once the CFE provides these error messages.
+    Set<ConstantValue> set = new LinkedHashSet<ConstantValue>();
+    for (int i = 0; i < values.length; i++) {
+      ConstantValue value = values[i].evaluate(environment);
+      if (!value.isConstant) return new NonConstantValue();
+      if (!set.add(value)) {
+        environment.reportError(values[i], MessageKind.EQUAL_SET_ENTRY, {});
+      }
+    }
+
+    return constant_system.createSet(
+        environment.commonElements, type, set.toList());
+  }
+
+  @override
+  DartType getKnownType(CommonElements commonElements) => type;
+
+  @override
+  void _createStructuredText(StringBuffer sb) {
+    sb.write('Set(type=$type,values=[');
+    String delimiter = '';
+    for (ConstantExpression value in values) {
+      sb.write(delimiter);
+      value._createStructuredText(sb);
+      delimiter = ',';
+    }
+    sb.write('])');
+  }
+
+  @override
+  int _computeHashCode() => Hashing.listHash(values, Hashing.objectHash(type));
+
+  @override
+  bool _equals(SetConstantExpression other) {
+    if (type != other.type) return false;
+    if (values.length != other.values.length) return false;
+    for (int i = 0; i < values.length; i++) {
+      if (values[i] != other.values[i]) return false;
+    }
+    return true;
+  }
+
+  @override
+  bool get isImplicit => false;
+
+  @override
+  bool get isPotential => values.any((v) => v.isPotential);
+}
+
 /// Literal map constant.
 class MapConstantExpression extends ConstantExpression {
   final InterfaceType type;
@@ -431,32 +496,25 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     // TODO(sigmund): delete once the CFE provides these error messages.
-    bool isSetLiteral = environment.immediateUnderSetLiteral;
     return environment.evaluateMapBody(() {
       Map<ConstantValue, ConstantValue> map = <ConstantValue, ConstantValue>{};
       for (int i = 0; i < keys.length; i++) {
-        ConstantValue key = keys[i].evaluate(environment, constantSystem);
+        ConstantValue key = keys[i].evaluate(environment);
         if (!key.isConstant) {
           return new NonConstantValue();
         }
-        ConstantValue value = values[i].evaluate(environment, constantSystem);
+        ConstantValue value = values[i].evaluate(environment);
         if (!value.isConstant) {
           return new NonConstantValue();
         }
         if (map.containsKey(key)) {
-          environment.reportError(
-              keys[i],
-              isSetLiteral
-                  ? MessageKind.EQUAL_SET_ENTRY
-                  : MessageKind.EQUAL_MAP_ENTRY_KEY,
-              {});
+          environment.reportError(keys[i], MessageKind.EQUAL_MAP_ENTRY_KEY, {});
         }
         map[key] = value;
       }
-      return constantSystem.createMap(environment.commonElements, type,
+      return constant_system.createMap(environment.commonElements, type,
           map.keys.toList(), map.values.toList());
     });
   }
@@ -553,8 +611,7 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     InterfaceType instanceType = computeInstanceType(environment);
     return environment.evaluateConstructor(target, instanceType, () {
       InstanceData instanceData = computeInstanceData(environment);
@@ -566,7 +623,7 @@
           <FieldEntity, ConstantValue>{};
       instanceData.fieldMap
           .forEach((FieldEntity field, ConstantExpression constant) {
-        ConstantValue value = constant.evaluate(environment, constantSystem);
+        ConstantValue value = constant.evaluate(environment);
         assert(
             value != null,
             failedAt(CURRENT_ELEMENT_SPANNABLE,
@@ -578,7 +635,7 @@
         }
       });
       for (AssertConstantExpression assertion in instanceData.assertions) {
-        if (!assertion.evaluate(environment, constantSystem).isConstant) {
+        if (!assertion.evaluate(environment).isConstant) {
           isValidAsConstant = false;
         }
       }
@@ -650,12 +707,11 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     bool isValid = true;
     StringBuffer sb = new StringBuffer();
     for (ConstantExpression expression in expressions) {
-      ConstantValue value = expression.evaluate(environment, constantSystem);
+      ConstantValue value = expression.evaluate(environment);
       if (!value.isConstant) {
         isValid = false;
         // Use `continue` instead of `return` here to report all errors in the
@@ -687,7 +743,7 @@
       }
     }
     if (isValid) {
-      return constantSystem.createString(sb.toString());
+      return constant_system.createString(sb.toString());
     }
     return new NonConstantValue();
   }
@@ -746,9 +802,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createSymbol(environment.commonElements, name);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createSymbol(environment.commonElements, name);
   }
 
   @override
@@ -779,9 +834,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return constantSystem.createType(environment.commonElements, type);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return constant_system.createType(environment.commonElements, type);
   }
 
   @override
@@ -819,8 +873,7 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     // Running example for comments:
     //
     //     class A<T> {
@@ -835,8 +888,7 @@
     // We visit `t as A.T` while evaluating `const B<num>(0)`.
 
     // The expression value is `0`.
-    ConstantValue expressionValue =
-        expression.evaluate(environment, constantSystem);
+    ConstantValue expressionValue = expression.evaluate(environment);
 
     if (!environment.checkCasts) return expressionValue;
 
@@ -849,7 +901,7 @@
 
     // Check that the expression type, `int`, is a subtype of the type in
     // context, `num`.
-    if (!constantSystem.isSubtype(
+    if (!constant_system.isSubtype(
         environment.types, expressionType, typeInContext)) {
       // TODO(sigmund): consider reporting different messages and error
       // locations for implicit vs explicit casts.
@@ -896,11 +948,10 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     return environment.evaluateField(element, () {
       ConstantExpression constant = environment.getFieldConstant(element);
-      return constant.evaluate(environment, constantSystem);
+      return constant.evaluate(environment);
     });
   }
 
@@ -931,10 +982,9 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     ConstantExpression constant = environment.getLocalConstant(element);
-    return constant.evaluate(environment, constantSystem);
+    return constant.evaluate(environment);
   }
 
   @override
@@ -965,8 +1015,7 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     return new FunctionConstantValue(element, type);
   }
 
@@ -1013,13 +1062,32 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue leftValue = left.evaluate(environment, constantSystem);
-    ConstantValue rightValue = right.evaluate(environment, constantSystem);
-    if (!leftValue.isConstant || !rightValue.isConstant) {
-      return new NonConstantValue();
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue leftValue = left.evaluate(environment);
+    if (!leftValue.isConstant) return new NonConstantValue();
+    ConstantValue rightValue;
+    // Short-circuit && and || operators.
+    switch (operator.kind) {
+      case BinaryOperatorKind.LOGICAL_AND:
+        if (leftValue.isBool && leftValue.isFalse) {
+          rightValue = new FalseConstantValue();
+        } else {
+          rightValue = right.evaluate(environment);
+        }
+        break;
+
+      case BinaryOperatorKind.LOGICAL_OR:
+        if (leftValue.isBool && leftValue.isTrue) {
+          rightValue = new TrueConstantValue();
+        } else {
+          rightValue = right.evaluate(environment);
+        }
+        break;
+      default:
+        rightValue = right.evaluate(environment);
     }
+
+    if (!rightValue.isConstant) return new NonConstantValue();
     bool isValid = true;
     switch (operator.kind) {
       case BinaryOperatorKind.EQ:
@@ -1218,11 +1286,12 @@
       switch (operator.kind) {
         case BinaryOperatorKind.NOT_EQ:
           BoolConstantValue equals =
-              constantSystem.equal.fold(leftValue, rightValue);
+              constant_system.equal.fold(leftValue, rightValue);
           return equals.negate();
         default:
-          ConstantValue value =
-              constantSystem.lookupBinary(operator).fold(leftValue, rightValue);
+          ConstantValue value = constant_system
+              .lookupBinary(operator)
+              .fold(leftValue, rightValue);
           if (value != null) {
             return value;
           }
@@ -1357,12 +1426,11 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue leftValue = left.evaluate(environment, constantSystem);
-    ConstantValue rightValue = right.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue leftValue = left.evaluate(environment);
+    ConstantValue rightValue = right.evaluate(environment);
     if (leftValue.isConstant && rightValue.isConstant) {
-      return constantSystem.identity.fold(leftValue, rightValue);
+      return constant_system.identity.fold(leftValue, rightValue);
     }
     return new NonConstantValue();
   }
@@ -1417,10 +1485,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue expressionValue =
-        expression.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue expressionValue = expression.evaluate(environment);
     bool isValid = true;
     switch (operator.kind) {
       case UnaryOperatorKind.NOT:
@@ -1459,7 +1525,7 @@
     }
     if (isValid) {
       ConstantValue value =
-          constantSystem.lookupUnary(operator).fold(expressionValue);
+          constant_system.lookupUnary(operator).fold(expressionValue);
       if (value != null) {
         return value;
       }
@@ -1520,9 +1586,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue value = expression.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue value = expression.evaluate(environment);
     if (!value.isString) {
       environment.reportError(
           expression, MessageKind.INVALID_CONSTANT_STRING_LENGTH_TYPE, {
@@ -1532,7 +1597,7 @@
       return new NonConstantValue();
     } else {
       StringConstantValue stringValue = value;
-      return constantSystem
+      return constant_system
           .createInt(new BigInt.from(stringValue.stringValue.length));
     }
   }
@@ -1610,12 +1675,10 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue conditionValue =
-        condition.evaluate(environment, constantSystem);
-    ConstantValue trueValue = trueExp.evaluate(environment, constantSystem);
-    ConstantValue falseValue = falseExp.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue conditionValue = condition.evaluate(environment);
+    ConstantValue trueValue = trueExp.evaluate(environment);
+    ConstantValue falseValue = falseExp.evaluate(environment);
     bool isValid = true;
     if (!conditionValue.isBool) {
       environment.reportError(
@@ -1681,9 +1744,8 @@
   bool _equals(PositionalArgumentReference other) => index == other.index;
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    throw new UnsupportedError('PositionalArgumentReference.evaluate');
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return new NonConstantValue();
   }
 
   @override
@@ -1720,9 +1782,8 @@
   bool _equals(NamedArgumentReference other) => name == other.name;
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    throw new UnsupportedError('NamedArgumentReference.evaluate');
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    return new NonConstantValue();
   }
 
   @override
@@ -1799,15 +1860,13 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue nameConstantValue =
-        name.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue nameConstantValue = name.evaluate(environment);
     ConstantValue defaultConstantValue;
     if (defaultValue != null) {
-      defaultConstantValue = defaultValue.evaluate(environment, constantSystem);
+      defaultConstantValue = defaultValue.evaluate(environment);
     } else {
-      defaultConstantValue = constantSystem.createBool(false);
+      defaultConstantValue = constant_system.createBool(false);
     }
     if (!nameConstantValue.isConstant || !defaultConstantValue.isConstant) {
       return new NonConstantValue();
@@ -1829,9 +1888,9 @@
       String text =
           environment.readFromEnvironment(nameStringConstantValue.stringValue);
       if (text == 'true') {
-        return constantSystem.createBool(true);
+        return constant_system.createBool(true);
       } else if (text == 'false') {
-        return constantSystem.createBool(false);
+        return constant_system.createBool(false);
       } else {
         return defaultConstantValue;
       }
@@ -1878,15 +1937,13 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue nameConstantValue =
-        name.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue nameConstantValue = name.evaluate(environment);
     ConstantValue defaultConstantValue;
     if (defaultValue != null) {
-      defaultConstantValue = defaultValue.evaluate(environment, constantSystem);
+      defaultConstantValue = defaultValue.evaluate(environment);
     } else {
-      defaultConstantValue = constantSystem.createNull();
+      defaultConstantValue = constant_system.createNull();
     }
     if (!nameConstantValue.isConstant || !defaultConstantValue.isConstant) {
       return new NonConstantValue();
@@ -1914,7 +1971,7 @@
       if (value == null) {
         return defaultConstantValue;
       } else {
-        return constantSystem.createInt(value);
+        return constant_system.createInt(value);
       }
     }
     return new NonConstantValue();
@@ -1959,15 +2016,13 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue nameConstantValue =
-        name.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue nameConstantValue = name.evaluate(environment);
     ConstantValue defaultConstantValue;
     if (defaultValue != null) {
-      defaultConstantValue = defaultValue.evaluate(environment, constantSystem);
+      defaultConstantValue = defaultValue.evaluate(environment);
     } else {
-      defaultConstantValue = constantSystem.createNull();
+      defaultConstantValue = constant_system.createNull();
     }
     if (!nameConstantValue.isConstant || !defaultConstantValue.isConstant) {
       return new NonConstantValue();
@@ -1991,7 +2046,7 @@
       if (text == null) {
         return defaultConstantValue;
       } else {
-        return constantSystem.createString(text);
+        return constant_system.createString(text);
       }
     }
     return new NonConstantValue();
@@ -2040,10 +2095,8 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    ConstantValue conditionValue =
-        condition.evaluate(environment, constantSystem);
+  ConstantValue evaluate(EvaluationEnvironment environment) {
+    ConstantValue conditionValue = condition.evaluate(environment);
     bool validAssert;
     if (environment.enableAssertions) {
       // Boolean conversion:
@@ -2054,7 +2107,7 @@
     }
     if (!validAssert) {
       if (message != null) {
-        ConstantValue value = message.evaluate(environment, constantSystem);
+        ConstantValue value = message.evaluate(environment);
         if (value is StringConstantValue) {
           String text = '${value.stringValue}';
           environment.reportError(this,
@@ -2102,12 +2155,11 @@
   }
 
   @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
+  ConstantValue evaluate(EvaluationEnvironment environment) {
     List<DartType> typeArgumentsInContext =
         typeArguments.map(environment.getTypeInContext).toList();
-    return new InstantiationConstantValue(typeArgumentsInContext,
-        expression.evaluate(environment, constantSystem));
+    return new InstantiationConstantValue(
+        typeArgumentsInContext, expression.evaluate(environment));
   }
 
   @override
@@ -2151,6 +2203,7 @@
   R visitString(StringConstantExpression exp, A context);
   R visitNull(NullConstantExpression exp, A context);
   R visitList(ListConstantExpression exp, A context);
+  R visitSet(SetConstantExpression exp, A context);
   R visitMap(MapConstantExpression exp, A context);
   R visitConstructed(ConstructedConstantExpression exp, A context);
   R visitConcatenate(ConcatenateConstantExpression exp, A context);
@@ -2261,6 +2314,15 @@
   }
 
   @override
+  void visitSet(SetConstantExpression exp, [_]) {
+    sb.write('const ');
+    writeTypeArguments(exp.type);
+    sb.write('{');
+    sb.writeAll(exp.values, ', ');
+    sb.write('}');
+  }
+
+  @override
   void visitMap(MapConstantExpression exp, [_]) {
     sb.write('const ');
     writeTypeArguments(exp.type);
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index 3d30d3b..dc26f40 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -19,6 +19,7 @@
   BOOL,
   STRING,
   LIST,
+  SET,
   MAP,
   CONSTRUCTED,
   TYPE,
@@ -39,6 +40,7 @@
   R visitBool(covariant BoolConstantValue constant, covariant A arg);
   R visitString(covariant StringConstantValue constant, covariant A arg);
   R visitList(covariant ListConstantValue constant, covariant A arg);
+  R visitSet(covariant SetConstantValue constant, covariant A arg);
   R visitMap(covariant MapConstantValue constant, covariant A arg);
   R visitConstructed(
       covariant ConstructedConstantValue constant, covariant A arg);
@@ -68,6 +70,7 @@
   bool get isNum => false;
   bool get isString => false;
   bool get isList => false;
+  bool get isSet => false;
   bool get isMap => false;
   bool get isConstructedObject => false;
   bool get isFunction => false;
@@ -447,10 +450,10 @@
 
   bool operator ==(other) {
     return other is TypeConstantValue &&
-        representedType == other.representedType;
+        representedType.unaliased == other.representedType.unaliased;
   }
 
-  int get hashCode => representedType.hashCode * 13;
+  int get hashCode => representedType.unaliased.hashCode * 13;
 
   List<ConstantValue> getDependencies() => const <ConstantValue>[];
 
@@ -521,7 +524,65 @@
   }
 }
 
-class MapConstantValue extends ObjectConstantValue {
+abstract class SetConstantValue extends ObjectConstantValue {
+  final List<ConstantValue> values;
+  final int hashCode;
+
+  SetConstantValue(InterfaceType type, List<ConstantValue> values)
+      : values = values,
+        hashCode = Hashing.listHash(values, Hashing.objectHash(type)),
+        super(type);
+
+  @override
+  bool get isSet => true;
+
+  bool operator ==(var other) {
+    if (identical(this, other)) return true;
+    if (other is! SetConstantValue) return false;
+    SetConstantValue otherSet = other;
+    if (hashCode != otherSet.hashCode) return false;
+    if (type != otherSet.type) return false;
+    if (length != otherSet.length) return false;
+    for (int i = 0; i < values.length; i++) {
+      if (values[i] != otherSet.values[i]) return false;
+    }
+    return true;
+  }
+
+  @override
+  List<ConstantValue> getDependencies() => values;
+
+  int get length => values.length;
+
+  @override
+  accept(ConstantValueVisitor visitor, arg) => visitor.visitSet(this, arg);
+
+  @override
+  String toDartText() {
+    StringBuffer sb = new StringBuffer();
+    _unparseTypeArguments(sb);
+    sb.write('{');
+    sb.writeAll(values.map((v) => v.toDartText()), ',');
+    sb.write('}');
+    return sb.toString();
+  }
+
+  @override
+  String toStructuredText() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('SetConstant(');
+    _unparseTypeArguments(sb);
+    sb.write('{');
+    sb.writeAll(values.map((v) => v.toStructuredText()), ', ');
+    sb.write('}');
+    return sb.toString();
+  }
+
+  @override
+  ConstantValueKind get kind => ConstantValueKind.SET;
+}
+
+abstract class MapConstantValue extends ObjectConstantValue {
   final List<ConstantValue> keys;
   final List<ConstantValue> values;
   final int hashCode;
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 50b8aeb..3aa386e 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -271,6 +271,19 @@
     compilationStrategy = CompilationStrategy.toData;
   }
 
+  void setDumpInfo(String argument) {
+    passThrough(Flags.dumpInfo);
+    if (argument == Flags.dumpInfo || argument == "${Flags.dumpInfo}=json") {
+      return;
+    }
+    if (argument == "${Flags.dumpInfo}=binary") {
+      passThrough(argument);
+      return;
+    }
+    helpAndFail("Error: Unsupported dump-info format '$argument', "
+        "supported formats are: json or binary");
+  }
+
   void handleThrowOnError(String argument) {
     throwOnError = true;
     String parameter = extractParameter(argument, isOptionalArgument: true);
@@ -331,6 +344,7 @@
     new OptionHandler('${Flags.readData}|${Flags.readData}=.+', setReadData),
     new OptionHandler('${Flags.writeData}|${Flags.writeData}=.+', setWriteData),
     new OptionHandler(Flags.cfeOnly, setCfeOnly),
+    new OptionHandler(Flags.debugGlobalInference, passThrough),
     new OptionHandler('--out=.+|-o.*', setOutput, multipleArguments: true),
     new OptionHandler('-O.*', setOptimizationLevel),
     new OptionHandler(Flags.allowMockCompilation, ignoreOption),
@@ -372,7 +386,7 @@
     new OptionHandler('--deferred-map=.+', passThrough),
     new OptionHandler(Flags.newDeferredSplit, passThrough),
     new OptionHandler(Flags.reportInvalidInferredDeferredTypes, passThrough),
-    new OptionHandler(Flags.dumpInfo, passThrough),
+    new OptionHandler('${Flags.dumpInfo}|${Flags.dumpInfo}=.+', setDumpInfo),
     new OptionHandler('--disallow-unsafe-eval', ignoreOption),
     new OptionHandler(Option.showPackageWarnings, passThrough),
     new OptionHandler(Option.enableLanguageExperiments, passThrough),
@@ -407,7 +421,7 @@
     new OptionHandler(Flags.experimentalTrackAllocations, passThrough),
     new OptionHandler("${Flags.experimentalAllocationsPath}=.+", passThrough),
 
-    new OptionHandler(Flags.experimentLocalNames, passThrough),
+    new OptionHandler(Flags.experimentLocalNames, ignoreOption),
     new OptionHandler(Flags.experimentStartupFunctions, passThrough),
     new OptionHandler(Flags.experimentToBoolean, passThrough),
     new OptionHandler(Flags.experimentCallInstrumentation, passThrough),
@@ -874,10 +888,10 @@
     Generates a json file with a mapping from each deferred import to a list of
     the part.js files that will be loaded.
 
-  --dump-info
-    Generates an out.info.json file with information about the generated code.
-    You can inspect the generated file with the viewer at:
-        https://dart-lang.github.io/dump-info-visualizer/
+  --dump-info[=<format>]
+    Generates information about the generated code. 'format' can be either
+    'json' or 'binary'.
+    You can inspect the generated data using tools from 'package:dart2js_info'.
 
   --generate-code-with-compile-time-errors
     Generates output even if the program contains compile-time errors. Use the
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index d3f9c4d..d4c2161 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -8,6 +8,8 @@
     show ChunkedConversionSink, JsonEncoder, StringConversionSink;
 
 import 'package:dart2js_info/info.dart';
+import 'package:dart2js_info/json_info_codec.dart';
+import 'package:dart2js_info/binary_serialization.dart' as dump_info;
 
 import '../compiler_new.dart';
 import 'common/names.dart';
@@ -16,16 +18,18 @@
 import 'common_elements.dart' show JElementEnvironment;
 import 'compiler.dart' show Compiler;
 import 'constants/values.dart' show ConstantValue, InterceptorConstantValue;
-import 'deferred_load.dart' show OutputUnit;
+import 'deferred_load.dart' show OutputUnit, deferredPartFileName;
 import 'elements/entities.dart';
 import 'inferrer/abstract_value_domain.dart';
 import 'inferrer/types.dart'
     show GlobalTypeInferenceMemberResult, GlobalTypeInferenceResults;
 import 'js/js.dart' as jsAst;
 import 'js_backend/js_backend.dart' show JavaScriptBackend;
+import 'js_backend/field_analysis.dart';
 import 'universe/codegen_world_builder.dart';
 import 'universe/world_impact.dart'
     show ImpactUseCase, WorldImpact, WorldImpactVisitorImpl;
+import 'util/sink_adapter.dart';
 import 'world.dart' show JClosedWorld;
 
 class ElementInfoCollector {
@@ -48,11 +52,11 @@
   void run() {
     dumpInfoTask._constantToNode.forEach((constant, node) {
       // TODO(sigmund): add dependencies on other constants
-      var size = dumpInfoTask._nodeData[node].length;
-      var code = jsAst.prettyPrint(node,
-          enableMinification: compiler.options.enableMinification);
+      var span = dumpInfoTask._nodeData[node];
       var info = new ConstantInfo(
-          size: size, code: code, outputUnit: _unitInfoForConstant(constant));
+          size: span.end - span.start,
+          code: [span],
+          outputUnit: _unitInfoForConstant(constant));
       _constantToInfo[constant] = info;
       result.constants.add(info);
     });
@@ -124,7 +128,7 @@
     }
 
     int size = dumpInfoTask.sizeOf(field);
-    String code = dumpInfoTask.codeOf(field);
+    List<CodeSpan> code = dumpInfoTask.codeOf(field);
 
     // TODO(het): Why doesn't `size` account for the code size already?
     if (code != null) size += code.length;
@@ -137,9 +141,9 @@
         outputUnit: _unitInfoForMember(field),
         isConst: field.isConst);
     _entityToInfo[field] = info;
-    if (codegenWorldBuilder.hasConstantFieldInitializer(field)) {
-      info.initializer = _constantToInfo[
-          codegenWorldBuilder.getConstantFieldInitializer(field)];
+    FieldAnalysisData fieldData = closedWorld.fieldAnalysis.getFieldData(field);
+    if (fieldData.initialValue != null) {
+      info.initializer = _constantToInfo[fieldData.initialValue];
     }
 
     if (compiler.options.experimentCallInstrumentation) {
@@ -261,7 +265,7 @@
           : false,
       isExternal: function.isExternal,
     );
-    String code = dumpInfoTask.codeOf(function);
+    List<CodeSpan> code = dumpInfoTask.codeOf(function);
 
     List<ParameterInfo> parameters = <ParameterInfo>[];
     List<String> inferredParameterTypes = <String>[];
@@ -340,8 +344,11 @@
       // emitter is used it will fail here.
       JavaScriptBackend backend = compiler.backend;
       assert(outputUnit.name != null || outputUnit.isMainOutput);
-      OutputUnitInfo info = new OutputUnitInfo(
-          outputUnit.name, backend.emitter.emitter.generatedSize(outputUnit));
+      var filename = outputUnit.isMainOutput
+          ? compiler.options.outputUri.pathSegments.last
+          : deferredPartFileName(compiler.options, outputUnit.name);
+      OutputUnitInfo info = new OutputUnitInfo(filename, outputUnit.name,
+          backend.emitter.emitter.generatedSize(outputUnit));
       info.imports
           .addAll(closedWorld.outputUnitData.getImportNames(outputUnit));
       result.outputUnits.add(info);
@@ -389,9 +396,10 @@
 class DumpInfoTask extends CompilerTask implements InfoReporter {
   static const ImpactUseCase IMPACT_USE = const ImpactUseCase('Dump info');
   final Compiler compiler;
+  final bool useBinaryFormat;
 
-  DumpInfoTask(Compiler compiler)
-      : compiler = compiler,
+  DumpInfoTask(this.compiler)
+      : useBinaryFormat = compiler.options.useDumpInfoBinaryFormat,
         super(compiler.measurer);
 
   String get name => "Dump Info";
@@ -404,7 +412,7 @@
   /// Data associated with javascript AST nodes. The map only contains keys for
   /// nodes that we care about.  Keys are automatically added when
   /// [registerEntityAst] is called.
-  final Map<jsAst.Node, _CodeData> _nodeData = <jsAst.Node, _CodeData>{};
+  final Map<jsAst.Node, CodeSpan> _nodeData = <jsAst.Node, CodeSpan>{};
 
   // A mapping from Dart Entities to Javascript AST Nodes.
   final Map<Entity, List<jsAst.Node>> _entityToNodes =
@@ -475,7 +483,7 @@
       _entityToNodes
           .putIfAbsent(entity, () => new List<jsAst.Node>())
           .add(code);
-      _nodeData[code] ??= _CodeData();
+      _nodeData[code] ??= useBinaryFormat ? new CodeSpan() : new _CodeData();
     }
   }
 
@@ -484,34 +492,39 @@
       assert(_constantToNode[constant] == null ||
           _constantToNode[constant] == code);
       _constantToNode[constant] = code;
-      _nodeData[code] ??= _CodeData();
+      _nodeData[code] ??= useBinaryFormat ? new CodeSpan() : new _CodeData();
     }
   }
 
+  bool get shouldEmitText => !useBinaryFormat;
   // TODO(sigmund): delete the stack once we stop emitting the source text.
   List<_CodeData> _stack = [];
   void enterNode(jsAst.Node node, int start) {
     var data = _nodeData[node];
-    if (data != null) {
+    data?.start = start;
+
+    if (shouldEmitText && data != null) {
       _stack.add(data);
-      data.start = start;
     }
   }
 
   void emit(String string) {
-    // Note: historically we emitted the full body of classes and methods, so
-    // instance methods ended up emitted twice.  Once we use a different
-    // encoding of dump info, we also plan to remove this duplication.
-    _stack.forEach((f) => f.text.write(string));
+    if (shouldEmitText) {
+      // Note: historically we emitted the full body of classes and methods, so
+      // instance methods ended up emitted twice.  Once we use a different
+      // encoding of dump info, we also plan to remove this duplication.
+      _stack.forEach((f) => f._text.write(string));
+    }
   }
 
   void exitNode(jsAst.Node node, int start, int end, int closing) {
     var data = _nodeData[node];
-    if (data == null) return;
-    var last = _stack.removeLast();
-    assert(data == last);
-    assert(data.start == start);
-    data.end = end;
+    data?.end = end;
+    if (shouldEmitText && data != null) {
+      var last = _stack.removeLast();
+      assert(data == last);
+      assert(data.start == start);
+    }
   }
 
   /// Returns the size of the source code that was generated for an entity.
@@ -524,17 +537,16 @@
     }
   }
 
-  int sizeOfNode(jsAst.Node node) => _nodeData[node].length ?? 0;
+  int sizeOfNode(jsAst.Node node) {
+    CodeSpan span = _nodeData[node];
+    if (span == null) return 0;
+    return span.end - span.start;
+  }
 
-  String codeOf(Entity entity) {
+  List<CodeSpan> codeOf(MemberEntity entity) {
     List<jsAst.Node> code = _entityToNodes[entity];
-    if (code == null) return null;
-    // Concatenate rendered ASTs.
-    StringBuffer sb = new StringBuffer();
-    for (jsAst.Node ast in code) {
-      sb.writeln(_nodeData[ast].text);
-    }
-    return sb.toString();
+    if (code == null) return const [];
+    return code.map((ast) => _nodeData[ast]).toList();
   }
 
   void dumpInfo(JClosedWorld closedWorld,
@@ -543,20 +555,46 @@
       infoCollector = new ElementInfoCollector(
           compiler, this, closedWorld, globalInferenceResults)
         ..run();
-      StringBuffer jsonBuffer = new StringBuffer();
-      dumpInfoJson(jsonBuffer, closedWorld);
-      compiler.outputProvider.createOutputSink(
-          compiler.options.outputUri.pathSegments.last,
-          'info.json',
-          OutputType.dumpInfo)
-        ..add(jsonBuffer.toString())
-        ..close();
-      BasicInfo.resetIds();
+
+      var allInfo = buildDumpInfoData(closedWorld);
+      if (useBinaryFormat) {
+        dumpInfoBinary(allInfo);
+      } else {
+        dumpInfoJson(allInfo);
+      }
     });
   }
 
-  void dumpInfoJson(StringSink buffer, JClosedWorld closedWorld) {
+  void dumpInfoJson(AllInfo data) {
+    StringBuffer jsonBuffer = new StringBuffer();
     JsonEncoder encoder = const JsonEncoder.withIndent('  ');
+    ChunkedConversionSink<Object> sink = encoder.startChunkedConversion(
+        new StringConversionSink.fromStringSink(jsonBuffer));
+    sink.add(new AllInfoJsonCodec(isBackwardCompatible: true).encode(data));
+    compiler.outputProvider.createOutputSink(
+        compiler.options.outputUri.pathSegments.last,
+        'info.json',
+        OutputType.dumpInfo)
+      ..add(jsonBuffer.toString())
+      ..close();
+    compiler.reporter.reportInfo(NO_LOCATION_SPANNABLE, MessageKind.GENERIC, {
+      'text': "View the dumped .info.json file at "
+          "https://dart-lang.github.io/dump-info-visualizer"
+    });
+  }
+
+  void dumpInfoBinary(AllInfo data) {
+    var name = compiler.options.outputUri.pathSegments.last + ".info.data";
+    Sink<List<int>> sink = new BinaryOutputSinkAdapter(compiler.outputProvider
+        .createBinarySink(compiler.options.outputUri.resolve(name)));
+    dump_info.encode(data, sink);
+    compiler.reporter.reportInfo(NO_LOCATION_SPANNABLE, MessageKind.GENERIC, {
+      'text': "Use `package:dart2js_info` to parse and process the dumped "
+          ".info.data file."
+    });
+  }
+
+  AllInfo buildDumpInfoData(JClosedWorld closedWorld) {
     Stopwatch stopwatch = new Stopwatch();
     stopwatch.start();
 
@@ -573,8 +611,8 @@
         // Don't register dart2js builtin functions that are not recorded.
         Info useInfo = infoCollector._entityToInfo[selection.selectedEntity];
         if (useInfo == null) continue;
-        info.uses.add(
-            new DependencyInfo(useInfo, '${selection.receiverConstraint}'));
+        info.uses.add(new DependencyInfo(
+            useInfo, selection.receiverConstraint?.toString()));
       }
     }
 
@@ -588,8 +626,8 @@
       for (Selection selection in uses) {
         Info useInfo = infoCollector._entityToInfo[selection.selectedEntity];
         if (useInfo == null) continue;
-        info.uses.add(
-            new DependencyInfo(useInfo, '${selection.receiverConstraint}'));
+        info.uses.add(new DependencyInfo(
+            useInfo, selection.receiverConstraint?.toString()));
       }
     }
 
@@ -629,24 +667,14 @@
         isMirrorsUsed: closedWorld.backendUsage.isMirrorsUsed,
         minified: compiler.options.enableMinification);
 
-    ChunkedConversionSink<Object> sink = encoder.startChunkedConversion(
-        new StringConversionSink.fromStringSink(buffer));
-    sink.add(new AllInfoJsonCodec().encode(result));
-    compiler.reporter.reportInfo(NO_LOCATION_SPANNABLE, MessageKind.GENERIC, {
-      'text': "View the dumped .info.json file at "
-          "https://dart-lang.github.io/dump-info-visualizer"
-    });
+    return result;
   }
 }
 
 /// Helper class to store what dump-info will show for a piece of code.
-///
-/// Currently we print out the actual text, in the future, we will only emit
-/// start and end offsets.
-class _CodeData {
-  int start;
-  int end;
-  StringBuffer text = new StringBuffer();
-
+// TODO(sigmund): delete once we no longer emit text by default.
+class _CodeData extends CodeSpan {
+  StringBuffer _text = new StringBuffer();
+  String get text => '$_text';
   int get length => end - start;
 }
diff --git a/pkg/compiler/lib/src/frontend_strategy.dart b/pkg/compiler/lib/src/frontend_strategy.dart
index 23a1cee..39d0872 100644
--- a/pkg/compiler/lib/src/frontend_strategy.dart
+++ b/pkg/compiler/lib/src/frontend_strategy.dart
@@ -13,7 +13,7 @@
 import 'elements/types.dart';
 import 'enqueue.dart';
 import 'js_backend/annotations.dart';
-import 'js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
+import 'js_backend/field_analysis.dart' show KFieldAnalysis;
 import 'js_backend/backend_usage.dart';
 import 'js_backend/interceptor_data.dart';
 import 'js_backend/native_data.dart';
@@ -45,7 +45,7 @@
   DartTypes get dartTypes;
 
   /// Returns the [AnnotationProcessor] for this strategy.
-  AnnotationProcessor get annotationProcesser;
+  AnnotationProcessor get annotationProcessor;
 
   NativeBasicData get nativeBasicData;
 
@@ -70,7 +70,7 @@
       InterceptorDataBuilder interceptorDataBuilder,
       BackendUsageBuilder backendUsageBuilder,
       RuntimeTypesNeedBuilder rtiNeedBuilder,
-      KAllocatorAnalysis allocatorAnalysis,
+      KFieldAnalysis allocatorAnalysis,
       NativeResolutionEnqueuer nativeResolutionEnqueuer,
       NoSuchMethodRegistry noSuchMethodRegistry,
       AnnotationsDataBuilder annotationsDataBuilder,
@@ -85,7 +85,8 @@
       NativeDataBuilder nativeDataBuilder,
       AnnotationsDataBuilder annotationsDataBuilder,
       ImpactTransformer impactTransformer,
-      Map<Entity, WorldImpact> impactCache);
+      Map<Entity, WorldImpact> impactCache,
+      KFieldAnalysis fieldAnalysis);
 
   /// Computes the main function from [mainLibrary] adding additional world
   /// impact to [impactBuilder].
diff --git a/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart b/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart
index 6322222..1352562 100644
--- a/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart
+++ b/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart
@@ -99,6 +99,10 @@
   /// runtime.
   AbstractValue get listType;
 
+  /// The [AbstractValue] that represents a non-null subtype of `Set` at
+  /// runtime.
+  AbstractValue get setType;
+
   /// The [AbstractValue] that represents a non-null subtype of `Map` at
   /// runtime.
   AbstractValue get mapType;
@@ -133,6 +137,10 @@
   /// runtime.
   AbstractValue get constListType;
 
+  /// The [AbstractValue] that represents a non-null constant set literal at
+  /// runtime.
+  AbstractValue get constSetType;
+
   /// The [AbstractValue] that represents a non-null constant map literal at
   /// runtime.
   AbstractValue get constMapType;
@@ -377,6 +385,24 @@
   /// represent a container value at runtime.
   int getContainerLength(AbstractValue value);
 
+  /// Returns `true` if [value] represents a set value at runtime.
+  bool isSet(covariant AbstractValue value);
+
+  /// Creates a set value specialization of [originalValue] with the inferred
+  /// [elementType] runtime value.
+  ///
+  /// The [allocationNode] is used to identify this particular set allocation.
+  /// The [allocationElement] is used only for debugging.
+  AbstractValue createSetValue(
+      AbstractValue originalValue,
+      Object allocationNode,
+      MemberEntity allocationElement,
+      AbstractValue elementType);
+
+  /// Returns the element type of [value] if it represents a set value at
+  /// runtime. Returns [dynamicType] otherwise.
+  AbstractValue getSetElementType(AbstractValue value);
+
   /// Returns `true` if [value] represents a map value at runtime.
   bool isMap(covariant AbstractValue value);
 
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 204cdce..b88d849 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -7,7 +7,7 @@
 import '../closure.dart';
 import '../common.dart';
 import '../common/names.dart';
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/jumps.dart';
@@ -17,6 +17,7 @@
 import '../ir/static_type_provider.dart';
 import '../ir/util.dart';
 import '../js_backend/backend.dart';
+import '../js_backend/field_analysis.dart';
 import '../js_model/element_map.dart';
 import '../js_model/locals.dart' show JumpVisitor;
 import '../js_model/js_world.dart';
@@ -629,6 +630,26 @@
   }
 
   @override
+  TypeInformation visitSetLiteral(ir.SetLiteral node) {
+    return _inferrer.concreteTypes.putIfAbsent(node, () {
+      TypeInformation elementType;
+      for (ir.Expression element in node.expressions) {
+        TypeInformation type = visit(element);
+        elementType = elementType == null
+            ? _types.allocatePhi(null, null, type, isTry: false)
+            : _types.addPhiInput(null, elementType, type);
+      }
+      elementType = elementType == null
+          ? _types.nonNullEmpty()
+          : _types.simplifyPhi(null, null, elementType);
+      TypeInformation containerType =
+          node.isConst ? _types.constSetType : _types.setType;
+      return _types.allocateSet(
+          containerType, node, _analyzedMember, elementType);
+    });
+  }
+
+  @override
   TypeInformation visitMapLiteral(ir.MapLiteral node) {
     return _inferrer.concreteTypes.putIfAbsent(node, () {
       List keyTypes = <TypeInformation>[];
@@ -661,24 +682,20 @@
   }
 
   @override
-  TypeInformation visitIntLiteral(ir.IntLiteral node) {
-    ConstantSystem constantSystem = _closedWorld.constantSystem;
-    // The JavaScript backend may turn this literal into a double at
-    // runtime.
-    return _types.getConcreteTypeFor(_closedWorld.abstractValueDomain
-        .computeAbstractValueForConstant(
-            constantSystem.createIntFromInt(node.value)));
-  }
+  TypeInformation visitIntLiteral(ir.IntLiteral node) =>
+      // The JavaScript backend may turn this literal into a double at
+      // runtime.
+      _types.getConcreteTypeFor(_closedWorld.abstractValueDomain
+          .computeAbstractValueForConstant(
+              constant_system.createIntFromInt(node.value)));
 
   @override
-  TypeInformation visitDoubleLiteral(ir.DoubleLiteral node) {
-    ConstantSystem constantSystem = _closedWorld.constantSystem;
-    // The JavaScript backend may turn this literal into an integer at
-    // runtime.
-    return _types.getConcreteTypeFor(_closedWorld.abstractValueDomain
-        .computeAbstractValueForConstant(
-            constantSystem.createDouble(node.value)));
-  }
+  TypeInformation visitDoubleLiteral(ir.DoubleLiteral node) =>
+      // The JavaScript backend may turn this literal into an integer at
+      // runtime.
+      _types.getConcreteTypeFor(_closedWorld.abstractValueDomain
+          .computeAbstractValueForConstant(
+              constant_system.createDouble(node.value)));
 
   @override
   TypeInformation visitStringLiteral(ir.StringLiteral node) {
@@ -883,15 +900,10 @@
     if (variable != null) {
       Local local = _localsMap.getLocalVariable(variable);
       if (!_capturedVariables.contains(local)) {
-        TypeInformation refinedType = _types
-            .refineReceiver(selector, mask, receiverType, isConditional: false);
         DartType type = _localsMap.getLocalType(_elementMap, local);
         _state.updateLocal(
-            _inferrer, _capturedAndBoxed, local, refinedType, node, type);
-        List<Refinement> refinements = _localRefinementMap[variable];
-        if (refinements != null) {
-          refinements.add(new Refinement(selector, mask));
-        }
+            _inferrer, _capturedAndBoxed, local, receiverType, node, type,
+            isNullable: selector.appliesToNullWithoutThrow());
       }
     }
 
@@ -928,60 +940,10 @@
         callType, node, selector, mask, receiverType, arguments);
   }
 
-  /// Map from synthesized variables created for non-null operations to observed
-  /// refinements. This is used to refine locals in cases like:
-  ///
-  ///     local?.method()
-  ///
-  /// which in kernel is encoded as
-  ///
-  ///     let #t1 = local in #t1 == null ? null : #1.method()
-  ///
-  Map<ir.VariableDeclaration, List<Refinement>> _localRefinementMap =
-      <ir.VariableDeclaration, List<Refinement>>{};
-
   @override
   TypeInformation visitLet(ir.Let node) {
-    ir.VariableDeclaration alias;
-    ir.Expression body = node.body;
-    if (node.variable.name == null &&
-        node.variable.isFinal &&
-        node.variable.initializer is ir.VariableGet &&
-        body is ir.ConditionalExpression &&
-        body.condition is ir.MethodInvocation &&
-        body.then is ir.NullLiteral) {
-      ir.VariableGet get = node.variable.initializer;
-      ir.MethodInvocation invocation = body.condition;
-      ir.Expression receiver = invocation.receiver;
-      if (invocation.name.name == '==' &&
-          receiver is ir.VariableGet &&
-          receiver.variable == node.variable &&
-          invocation.arguments.positional.single is ir.NullLiteral) {
-        // We have
-        //   let #t1 = local in #t1 == null ? null : e
-        alias = get.variable;
-        _localRefinementMap[node.variable] = <Refinement>[];
-      }
-    }
     visit(node.variable);
-    TypeInformation type = visit(body);
-    if (alias != null) {
-      List<Refinement> refinements = _localRefinementMap.remove(node.variable);
-      if (refinements.isNotEmpty) {
-        Local local = _localsMap.getLocalVariable(alias);
-        DartType type = _localsMap.getLocalType(_elementMap, local);
-        TypeInformation localType =
-            _state.readLocal(_inferrer, _capturedAndBoxed, local);
-        for (Refinement refinement in refinements) {
-          localType = _types.refineReceiver(
-              refinement.selector, refinement.mask, localType,
-              isConditional: true);
-          _state.updateLocal(
-              _inferrer, _capturedAndBoxed, local, localType, node, type);
-        }
-      }
-    }
-    return type;
+    return visit(node.body);
   }
 
   @override
@@ -1107,12 +1069,11 @@
       return firstArgument.value;
     } else if (firstArgument is ir.StaticGet) {
       MemberEntity member = _elementMap.getMember(firstArgument.target);
-      if (member.isField &&
-          (member.isStatic || member.isTopLevel) &&
-          _closedWorld.fieldNeverChanges(member)) {
-        ConstantValue value = _elementMap.getFieldConstantValue(member);
-        if (value != null && value.isInt) {
-          IntConstantValue intValue = value;
+      if (member.isField) {
+        FieldAnalysisData fieldData =
+            _closedWorld.fieldAnalysis.getFieldData(member);
+        if (fieldData.isEffectivelyConstant && fieldData.constantValue.isInt) {
+          IntConstantValue intValue = fieldData.constantValue;
           return intValue.intValue.toInt();
         }
       }
@@ -1537,7 +1498,8 @@
       Local local = _localsMap.getLocalVariable(variable);
       DartType type = _localsMap.getLocalType(_elementMap, local);
       _state.updateLocal(
-          _inferrer, _capturedAndBoxed, local, localFunctionType, node, type);
+          _inferrer, _capturedAndBoxed, local, localFunctionType, node, type,
+          isNullable: false);
     }
 
     // We don't put the closure in the work queue of the
@@ -1653,14 +1615,16 @@
       }
       Local local = _localsMap.getLocalVariable(exception);
       _state.updateLocal(
-          _inferrer, _capturedAndBoxed, local, mask, node, const DynamicType());
+          _inferrer, _capturedAndBoxed, local, mask, node, const DynamicType(),
+          isNullable: false /* `throw null` produces a NullThrownError */);
     }
     ir.VariableDeclaration stackTrace = node.stackTrace;
     if (stackTrace != null) {
       Local local = _localsMap.getLocalVariable(stackTrace);
       // TODO(johnniwinther): Use a mask based on [StackTrace].
       _state.updateLocal(_inferrer, _capturedAndBoxed, local,
-          _types.dynamicType, node, const DynamicType());
+          _types.dynamicType, node, const DynamicType(),
+          isNullable: false /* if requested, the stack is never null */);
     }
     visit(node.body);
     return null;
@@ -1798,6 +1762,12 @@
     // TODO(johnniwinther): Maybe this should be [empty] instead?
     return _types.dynamicType;
   }
+
+  @override
+  TypeInformation visitConstantExpression(ir.ConstantExpression node) {
+    // TODO(johnniwinther,fishythefish): Compute the precise type information.
+    return _types.dynamicType;
+  }
 }
 
 class Refinement {
@@ -1889,9 +1859,10 @@
       Local local,
       TypeInformation type,
       ir.Node node,
-      DartType staticType) {
+      DartType staticType,
+      {isNullable: true}) {
     assert(type != null);
-    type = inferrer.types.narrowType(type, staticType);
+    type = inferrer.types.narrowType(type, staticType, isNullable: isNullable);
 
     FieldEntity field = capturedAndBoxed[local];
     if (field != null) {
@@ -1907,10 +1878,9 @@
       Local local,
       DartType type,
       ir.Node node) {
-    TypeInformation existing = readLocal(inferrer, capturedAndBoxed, local);
-    TypeInformation newType =
-        inferrer.types.narrowType(existing, type, isNullable: false);
-    updateLocal(inferrer, capturedAndBoxed, local, newType, node, type);
+    TypeInformation currentType = readLocal(inferrer, capturedAndBoxed, local);
+    updateLocal(inferrer, capturedAndBoxed, local, currentType, node, type,
+        isNullable: false);
   }
 
   LocalState mergeFlow(InferrerEngine inferrer, LocalState other) {
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index 2eedb7b..9692c59 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -33,6 +33,7 @@
 import 'locals_handler.dart';
 import 'list_tracer.dart';
 import 'map_tracer.dart';
+import 'set_tracer.dart';
 import 'type_graph_dump.dart';
 import 'type_graph_inferrer.dart';
 import 'type_graph_nodes.dart';
@@ -78,6 +79,7 @@
 
   void analyze(MemberEntity member);
   void analyzeListAndEnqueue(ListTypeInformation info);
+  void analyzeSetAndEnqueue(SetTypeInformation info);
   void analyzeMapAndEnqueue(MapTypeInformation info);
 
   /// Notifies to the inferrer that [analyzedElement] can have return type
@@ -441,6 +443,23 @@
     workQueue.add(info.elementType);
   }
 
+  void analyzeSetAndEnqueue(SetTypeInformation info) {
+    if (info.analyzed) return;
+    info.analyzed = true;
+
+    SetTracerVisitor tracer = new SetTracerVisitor(info, this);
+    bool succeeded = tracer.run();
+    if (!succeeded) return;
+
+    info.bailedOut = false;
+    info.elementType.inferred = true;
+
+    tracer.assignments.forEach(info.elementType.addAssignment);
+    // Enqueue the set for later refinement.
+    workQueue.add(info);
+    workQueue.add(info.elementType);
+  }
+
   void analyzeMapAndEnqueue(MapTypeInformation info) {
     if (info.analyzed) return;
     info.analyzed = true;
@@ -480,6 +499,11 @@
       analyzeListAndEnqueue(info);
     });
 
+    // Try to infer element types of sets and compute their escape information.
+    types.allocatedSets.values.forEach((TypeInformation info) {
+      analyzeSetAndEnqueue(info);
+    });
+
     // Try to infer the key and value types for maps and compute the values'
     // escape information.
     types.allocatedMaps.values.forEach((TypeInformation info) {
@@ -587,6 +611,13 @@
             'at ${abstractValueDomain.getAllocationElement(info.originalType)}'
             'after ${info.refineCount}');
       });
+      types.allocatedSets.values.forEach((_info) {
+        SetTypeInformation info = _info;
+        print('${info.type} '
+            'for ${abstractValueDomain.getAllocationNode(info.originalType)} '
+            'at ${abstractValueDomain.getAllocationElement(info.originalType)} '
+            'after ${info.refineCount}');
+      });
       types.allocatedMaps.values.forEach((_info) {
         MapTypeInformation info = _info;
         print('${info.type} '
@@ -806,7 +837,7 @@
   /// Returns the [ConstantValue] for the initial value of [field], or
   /// `null` if the initializer is not a constant value.
   ConstantValue getFieldConstant(FieldEntity field) {
-    return closedWorld.elementMap.getFieldConstantValue(field);
+    return closedWorld.fieldAnalysis.getFieldData(field).initialValue;
   }
 
   /// Returns `true` if [cls] has a 'call' method.
@@ -1176,6 +1207,7 @@
     generativeConstructorsExposingThis.clear();
 
     types.allocatedMaps.values.forEach(cleanup);
+    types.allocatedSets.values.forEach(cleanup);
     types.allocatedLists.values.forEach(cleanup);
 
     _memberData.clear();
@@ -1261,6 +1293,9 @@
   bool checkMapNode(ir.Node node) => true;
 
   @override
+  bool checkSetNode(ir.Node node) => true;
+
+  @override
   bool checkListNode(ir.Node node) => true;
 
   @override
diff --git a/pkg/compiler/lib/src/inferrer/node_tracer.dart b/pkg/compiler/lib/src/inferrer/node_tracer.dart
index e0abccf..0a3d2ee 100644
--- a/pkg/compiler/lib/src/inferrer/node_tracer.dart
+++ b/pkg/compiler/lib/src/inferrer/node_tracer.dart
@@ -51,6 +51,31 @@
   'checkGrowable',
 ]);
 
+Set<String> doesNotEscapeSetSet = new Set<String>.from(const <String>[
+  // From Object.
+  '==',
+  'hashCode',
+  'toString',
+  'noSuchMethod',
+  'runtimeType',
+
+  // From Iterable.
+  'isEmpty',
+  'isNotEmpty',
+  'length',
+  'contains',
+  'join',
+
+  // From Set.
+  'add',
+  'addAll',
+  'clear',
+  'containsAll',
+  'remove',
+  'removeAll',
+  'retainAll',
+]);
+
 Set<String> doesNotEscapeMapSet = new Set<String>.from(const <String>[
   // From Object.
   '==',
@@ -81,17 +106,23 @@
 
   TracerVisitor(this.tracedType, this.inferrer);
 
-  // Work list that gets populated with [TypeInformation] that could
-  // contain the container.
+  /// Work list that gets populated with [TypeInformation] that could
+  /// contain the container.
   final List<TypeInformation> workList = <TypeInformation>[];
 
-  // Work list of lists to analyze after analyzing the users of a
-  // [TypeInformation]. We know the [tracedType] has been stored in these
-  // lists and we must check how it escapes from these lists.
+  /// Work list of lists to analyze after analyzing the users of a
+  /// [TypeInformation]. We know the [tracedType] has been stored in these
+  /// lists and we must check how it escapes from these lists.
   final List<ListTypeInformation> listsToAnalyze = <ListTypeInformation>[];
-  // Work list of maps to analyze after analyzing the users of a
-  // [TypeInformation]. We know the [tracedType] has been stored in these
-  // maps and we must check how it escapes from these maps.
+
+  /// Work list of sets to analyze after analyzing the users of a
+  /// [TypeInformation]. We know the [tracedType] has been stored in these sets
+  /// and we must check how it escapes from these sets.
+  final List<SetTypeInformation> setsToAnalyze = <SetTypeInformation>[];
+
+  /// Work list of maps to analyze after analyzing the users of a
+  /// [TypeInformation]. We know the [tracedType] has been stored in these
+  /// maps and we must check how it escapes from these maps.
   final List<MapTypeInformation> mapsToAnalyze = <MapTypeInformation>[];
 
   final Setlet<TypeInformation> flowsInto = new Setlet<TypeInformation>();
@@ -136,6 +167,9 @@
       while (!listsToAnalyze.isEmpty) {
         analyzeStoredIntoList(listsToAnalyze.removeLast());
       }
+      while (setsToAnalyze.isNotEmpty) {
+        analyzeStoredIntoSet(setsToAnalyze.removeLast());
+      }
       while (!mapsToAnalyze.isEmpty) {
         analyzeStoredIntoMap(mapsToAnalyze.removeLast());
       }
@@ -175,6 +209,10 @@
     addNewEscapeInformation(info);
   }
 
+  void visitElementInSetTypeInformation(ElementInSetTypeInformation info) {
+    addNewEscapeInformation(info);
+  }
+
   void visitKeyInMapTypeInformation(KeyInMapTypeInformation info) {
     // We do not track the use of keys from a map, so we have to bail.
     bailout('Used as key in Map');
@@ -188,6 +226,10 @@
     listsToAnalyze.add(info);
   }
 
+  void visitSetTypeInformation(SetTypeInformation info) {
+    setsToAnalyze.add(info);
+  }
+
   void visitMapTypeInformation(MapTypeInformation info) {
     mapsToAnalyze.add(info);
   }
@@ -230,6 +272,24 @@
     }
   }
 
+  void analyzeStoredIntoSet(SetTypeInformation set) {
+    inferrer.analyzeSetAndEnqueue(set);
+    if (set.bailedOut) {
+      bailout('Stored in a set that bailed out');
+    } else {
+      set.flowsInto.forEach((flow) {
+        flow.users.forEach((dynamic user) {
+          if (user.receiver != flow) return;
+          if (user.selector.isIndex) {
+            addNewEscapeInformation(user);
+          } else if (!doesNotEscapeSetSet.contains(user.selector.name)) {
+            bailout('Escape from a set via [${user.selector.name}]');
+          }
+        });
+      });
+    }
+  }
+
   void analyzeStoredIntoMap(MapTypeInformation map) {
     inferrer.analyzeMapAndEnqueue(map);
     if (map.bailedOut) {
diff --git a/pkg/compiler/lib/src/inferrer/set_tracer.dart b/pkg/compiler/lib/src/inferrer/set_tracer.dart
new file mode 100644
index 0000000..6c809ad
--- /dev/null
+++ b/pkg/compiler/lib/src/inferrer/set_tracer.dart
@@ -0,0 +1,131 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library compiler.src.inferrer.set_tracer;
+
+import '../elements/entities.dart';
+import '../js_backend/backend.dart' show JavaScriptBackend;
+import '../universe/selector.dart' show Selector;
+import 'node_tracer.dart';
+import 'type_graph_nodes.dart';
+
+/// A set of selector names that [Set] implements and which we know do not
+/// change the element type of the set or let the set escape to code that might
+/// change the element type.
+Set<String> okSetSelectorSet = new Set<String>.from(const <String>[
+  // From Object.
+  '==',
+  'hashCode',
+  'toString',
+  'noSuchMethod',
+  'runtimeType',
+
+  // From Iterable.
+  'iterator',
+  'map',
+  'where',
+  'expand',
+  'contains',
+  'forEach',
+  'reduce',
+  'fold',
+  'every',
+  'join',
+  'any',
+  'toList',
+  'toSet',
+  'length',
+  'isEmpty',
+  'isNotEmpty',
+  'take',
+  'takeWhile',
+  'skip',
+  'skipWhile',
+  'first',
+  'last',
+  'single',
+  'firstWhere',
+  'lastWhere',
+  'singleWhere',
+  'elementAt',
+
+  // From Set.
+  'clear',
+  'containsAll',
+  'difference',
+  'intersection',
+  'lookup',
+  'remove',
+  'removeAll',
+  'removeWhere',
+  'retainAll',
+  'retainWhere',
+  'union',
+]);
+
+class SetTracerVisitor extends TracerVisitor {
+  List<TypeInformation> assignments = <TypeInformation>[];
+
+  SetTracerVisitor(tracedType, inferrer) : super(tracedType, inferrer);
+
+  /// Returns [true] if the analysis completed successfully, [false] if it
+  /// bailed out. In the former case, [assignments] holds a list of
+  /// [TypeInformation] nodes that flow into the element type of this set.
+  bool run() {
+    analyze();
+    SetTypeInformation set = tracedType;
+    if (continueAnalyzing) {
+      set.addFlowsIntoTargets(flowsInto);
+      return true;
+    }
+    assignments = null;
+    return false;
+  }
+
+  @override
+  visitClosureCallSiteTypeInformation(ClosureCallSiteTypeInformation info) {
+    bailout('Passed to a closure');
+  }
+
+  @override
+  visitStaticCallSiteTypeInformation(StaticCallSiteTypeInformation info) {
+    super.visitStaticCallSiteTypeInformation(info);
+    MemberEntity called = info.calledElement;
+    if (inferrer.closedWorld.commonElements.isForeign(called) &&
+        called.name == JavaScriptBackend.JS) {
+      bailout('Used in JS ${info.debugName}');
+    }
+  }
+
+  @override
+  visitDynamicCallSiteTypeInformation(DynamicCallSiteTypeInformation info) {
+    super.visitDynamicCallSiteTypeInformation(info);
+    Selector selector = info.selector;
+    String selectorName = selector.name;
+    if (currentUser == info.receiver) {
+      if (!okSetSelectorSet.contains(selectorName)) {
+        if (selector.isCall) {
+          switch (selectorName) {
+            case 'add':
+              assignments.add(info.arguments.positional[0]);
+              break;
+            case 'addAll':
+              // TODO(fishythefish): Extract type argument from type
+              // information.
+              bailout('Adding iterable with unknown typeinfo to current set');
+              break;
+            default:
+              bailout('Set used in a not-ok selector [$selectorName]');
+          }
+          return;
+        }
+      }
+    } else if (selector.isCall &&
+        (info.hasClosureCallTargets ||
+            info.concreteTargets.any((element) => !element.isFunction))) {
+      bailout('Passed to a closure');
+      return;
+    }
+  }
+}
diff --git a/pkg/compiler/lib/src/inferrer/trivial.dart b/pkg/compiler/lib/src/inferrer/trivial.dart
index 86df64c..dcd5e97 100644
--- a/pkg/compiler/lib/src/inferrer/trivial.dart
+++ b/pkg/compiler/lib/src/inferrer/trivial.dart
@@ -146,6 +146,22 @@
   bool isMap(AbstractValue value) => false;
 
   @override
+  AbstractValue getSetElementType(AbstractValue value) {
+    throw new UnsupportedError("TrivialAbstractValueDomain.getSetElementType");
+  }
+
+  @override
+  AbstractValue createSetValue(
+          AbstractValue originalValue,
+          Object allocationNode,
+          MemberEntity allocationElement,
+          AbstractValue elementType) =>
+      const TrivialAbstractValue();
+
+  @override
+  bool isSet(AbstractValue value) => false;
+
+  @override
   int getContainerLength(AbstractValue value) => null;
 
   @override
@@ -356,6 +372,9 @@
   AbstractValue get constMapType => const TrivialAbstractValue();
 
   @override
+  AbstractValue get constSetType => const TrivialAbstractValue();
+
+  @override
   AbstractValue get constListType => const TrivialAbstractValue();
 
   @override
@@ -383,6 +402,9 @@
   AbstractValue get mapType => const TrivialAbstractValue();
 
   @override
+  AbstractValue get setType => const TrivialAbstractValue();
+
+  @override
   AbstractValue get listType => const TrivialAbstractValue();
 
   @override
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
index 9eadce5..d9ddd4d 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
@@ -335,6 +335,10 @@
     addNode(info, 'ElementInContainer');
   }
 
+  void visitElementInSetTypeInformation(ElementInSetTypeInformation info) {
+    addNode(info, 'ElementInSet');
+  }
+
   void visitKeyInMapTypeInformation(KeyInMapTypeInformation info) {
     addNode(info, 'KeyInMap');
   }
@@ -347,6 +351,10 @@
     addNode(info, 'List');
   }
 
+  void visitSetTypeInformation(SetTypeInformation info) {
+    addNode(info, 'Set');
+  }
+
   void visitMapTypeInformation(MapTypeInformation info) {
     addNode(info, 'Map');
   }
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index 794e62d..467890a 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -1580,6 +1580,65 @@
   }
 }
 
+/// A [SetTypeInformation] is a [TypeInformation] created for sets.
+class SetTypeInformation extends TypeInformation with TracedTypeInformation {
+  final ElementInSetTypeInformation elementType;
+
+  final AbstractValue originalType;
+
+  SetTypeInformation(
+      MemberTypeInformation context, this.originalType, this.elementType)
+      : super(originalType, context) {
+    elementType.addUser(this);
+  }
+
+  String toString() => 'Set type $type';
+
+  accept(TypeInformationVisitor visitor) {
+    return visitor.visitSetTypeInformation(this);
+  }
+
+  AbstractValue computeType(InferrerEngine inferrer) {
+    AbstractValueDomain abstractValueDomain = inferrer.abstractValueDomain;
+    AbstractValue mask = type;
+    if (!abstractValueDomain.isSet(type) ||
+        abstractValueDomain.getSetElementType(type) != elementType.type) {
+      return abstractValueDomain.createSetValue(
+          abstractValueDomain.getGeneralization(originalType),
+          abstractValueDomain.getAllocationNode(originalType),
+          abstractValueDomain.getAllocationElement(originalType),
+          elementType.type);
+    }
+    return mask;
+  }
+
+  AbstractValue safeType(InferrerEngine inferrer) => originalType;
+
+  bool hasStableType(InferrerEngine inferrer) {
+    return elementType.isStable && super.hasStableType(inferrer);
+  }
+
+  void cleanup() {
+    super.cleanup();
+    elementType.cleanup();
+    _flowsInto = null;
+  }
+}
+
+/// An [ElementInSetTypeInformation] holds the common type of the elements in a
+/// [SetTypeInformation].
+class ElementInSetTypeInformation extends InferredTypeInformation {
+  ElementInSetTypeInformation(AbstractValueDomain abstractValueDomain,
+      MemberTypeInformation context, elementType)
+      : super(abstractValueDomain, context, elementType);
+
+  String toString() => 'Element in set $type';
+
+  accept(TypeInformationVisitor visitor) {
+    return visitor.visitElementInSetTypeInformation(this);
+  }
+}
+
 /// A [MapTypeInformation] is a [TypeInformation] created
 /// for maps.
 class MapTypeInformation extends TypeInformation with TracedTypeInformation {
@@ -1920,9 +1979,11 @@
   T visitPhiElementTypeInformation(PhiElementTypeInformation info);
   T visitElementInContainerTypeInformation(
       ElementInContainerTypeInformation info);
+  T visitElementInSetTypeInformation(ElementInSetTypeInformation info);
   T visitKeyInMapTypeInformation(KeyInMapTypeInformation info);
   T visitValueInMapTypeInformation(ValueInMapTypeInformation info);
   T visitListTypeInformation(ListTypeInformation info);
+  T visitSetTypeInformation(SetTypeInformation info);
   T visitMapTypeInformation(MapTypeInformation info);
   T visitConcreteTypeInformation(ConcreteTypeInformation info);
   T visitStringLiteralTypeInformation(StringLiteralTypeInformation info);
diff --git a/pkg/compiler/lib/src/inferrer/type_system.dart b/pkg/compiler/lib/src/inferrer/type_system.dart
index 21c5316..aa827d3 100644
--- a/pkg/compiler/lib/src/inferrer/type_system.dart
+++ b/pkg/compiler/lib/src/inferrer/type_system.dart
@@ -6,7 +6,6 @@
 import '../common.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
-import '../universe/selector.dart';
 import '../world.dart';
 import 'abstract_value_domain.dart';
 import 'type_graph_nodes.dart';
@@ -36,6 +35,9 @@
   /// Returns whether [node] is valid as a list allocation node.
   bool checkListNode(ir.Node node);
 
+  /// Returns whether [node] is valid as a set allocation node.
+  bool checkSetNode(ir.Node node);
+
   /// Returns whether [node] is valid as a map allocation node.
   bool checkMapNode(ir.Node node);
 
@@ -64,6 +66,10 @@
   final Map<ir.TreeNode, ListTypeInformation> allocatedLists =
       new Map<ir.TreeNode, ListTypeInformation>();
 
+  /// [SetTypeInformation] for allocated Sets.
+  final Map<ir.TreeNode, SetTypeInformation> allocatedSets =
+      new Map<ir.TreeNode, SetTypeInformation>();
+
   /// [MapTypeInformation] for allocated Maps.
   final Map<ir.TreeNode, TypeInformation> allocatedMaps =
       new Map<ir.TreeNode, TypeInformation>();
@@ -92,6 +98,7 @@
         parameterTypeInformations.values,
         memberTypeInformations.values,
         allocatedLists.values,
+        allocatedSets.values,
         allocatedMaps.values,
         allocatedClosures,
         concreteTypes.values,
@@ -205,6 +212,14 @@
         getConcreteTypeFor(_abstractValueDomain.growableListType);
   }
 
+  TypeInformation setTypeCache;
+  TypeInformation get setType =>
+      setTypeCache ??= getConcreteTypeFor(_abstractValueDomain.setType);
+
+  TypeInformation constSetTypeCache;
+  TypeInformation get constSetType => constSetTypeCache ??=
+      getConcreteTypeFor(_abstractValueDomain.constSetType);
+
   TypeInformation mapTypeCache;
   TypeInformation get mapType {
     if (mapTypeCache != null) return mapTypeCache;
@@ -293,52 +308,28 @@
     return info.type != mask;
   }
 
-  /// Returns a new receiver type for this [selector] applied to
-  /// [receiverType].
-  ///
-  /// The option [isConditional] is true when [selector] was seen in a
-  /// conditional send (e.g.  `a?.selector`), in which case the returned type
-  /// may be null.
-  TypeInformation refineReceiver(
-      Selector selector, AbstractValue mask, TypeInformation receiver,
-      {bool isConditional}) {
-    if (_abstractValueDomain.isExact(receiver.type).isDefinitelyTrue) {
-      return receiver;
-    }
-    AbstractValue otherType = _closedWorld.computeReceiverType(selector, mask);
-    // Conditional sends (a?.b) can still narrow the possible types of `a`,
-    // however, we still need to consider that `a` may be null.
-    if (isConditional) {
-      // Note: we don't check that receiver.type.isNullable here because this is
-      // called during the graph construction.
-      otherType = _abstractValueDomain.includeNull(otherType);
-    }
-    // If this is refining to nullable subtype of `Object` just return
-    // the receiver. We know the narrowing is useless.
-    if (_abstractValueDomain.isNull(otherType).isPotentiallyTrue &&
-        _abstractValueDomain.containsAll(otherType).isPotentiallyTrue) {
-      return receiver;
-    }
-    TypeInformation newType =
-        new NarrowTypeInformation(_abstractValueDomain, receiver, otherType);
-    allocatedTypes.add(newType);
-    return newType;
-  }
+  bool _isNonNullNarrow(TypeInformation type) =>
+      type is NarrowTypeInformation &&
+      _abstractValueDomain.isNull(type.typeAnnotation).isDefinitelyFalse;
 
   /// Returns the intersection between [type] and [annotation].
   /// [isNullable] indicates whether the annotation implies a null
   /// type.
   TypeInformation narrowType(TypeInformation type, DartType annotation,
       {bool isNullable: true}) {
-    if (annotation.treatAsDynamic) return type;
-    if (annotation.isVoid) return type;
     AbstractValue otherType;
-    if (annotation.isInterfaceType) {
+    if (annotation.isVoid) return type;
+    if (annotation.treatAsDynamic) {
+      if (isNullable) return type;
+      // If the input is already narrowed to be not-null, there is no value
+      // in adding another narrowing node.
+      if (_isNonNullNarrow(type)) return type;
+      otherType = _abstractValueDomain.excludeNull(dynamicType.type);
+    } else if (annotation.isInterfaceType) {
       InterfaceType interface = annotation;
       if (interface.element == _closedWorld.commonElements.objectClass) {
-        if (isNullable) {
-          return type;
-        }
+        if (isNullable) return type;
+        if (_isNonNullNarrow(type)) return type;
         otherType = _abstractValueDomain.excludeNull(dynamicType.type);
       } else {
         otherType =
@@ -357,23 +348,9 @@
     if (isNullable) {
       otherType = _abstractValueDomain.includeNull(otherType);
     }
-    if (_abstractValueDomain.isExact(type.type).isDefinitelyTrue) {
-      return type;
-    } else {
-      TypeInformation newType =
-          new NarrowTypeInformation(_abstractValueDomain, type, otherType);
-      allocatedTypes.add(newType);
-      return newType;
-    }
-  }
-
-  /// Returns the non-nullable type of [type].
-  TypeInformation narrowNotNull(TypeInformation type) {
-    if (_abstractValueDomain.isExact(type.type).isDefinitelyTrue) {
-      return type;
-    }
-    TypeInformation newType = new NarrowTypeInformation(_abstractValueDomain,
-        type, _abstractValueDomain.excludeNull(dynamicType.type));
+    if (_abstractValueDomain.isExact(type.type).isDefinitelyTrue) return type;
+    TypeInformation newType =
+        new NarrowTypeInformation(_abstractValueDomain, type, otherType);
     allocatedTypes.add(newType);
     return newType;
   }
@@ -494,6 +471,25 @@
     return result;
   }
 
+  TypeInformation allocateSet(
+      TypeInformation type, ir.Node node, MemberEntity enclosing,
+      [TypeInformation elementType]) {
+    assert(strategy.checkSetNode(node));
+    bool isConst = type.type == _abstractValueDomain.constSetType;
+
+    AbstractValue elementTypeMask =
+        isConst ? elementType.type : dynamicType.type;
+    AbstractValue mask = _abstractValueDomain.createSetValue(
+        type.type, node, enclosing, elementTypeMask);
+    ElementInSetTypeInformation element = new ElementInSetTypeInformation(
+        _abstractValueDomain, currentMember, elementType);
+    element.inferred = isConst;
+
+    allocatedTypes.add(element);
+    return allocatedSets[node] =
+        new SetTypeInformation(currentMember, mask, element);
+  }
+
   TypeInformation allocateMap(
       ConcreteTypeInformation type, ir.Node node, MemberEntity element,
       [List<TypeInformation> keyTypes, List<TypeInformation> valueTypes]) {
@@ -501,22 +497,38 @@
     assert(keyTypes.length == valueTypes.length);
     bool isFixed = (type.type == _abstractValueDomain.constMapType);
 
-    AbstractValue keyType, valueType;
+    TypeInformation keyType, valueType;
+    for (int i = 0; i < keyTypes.length; ++i) {
+      TypeInformation type = keyTypes[i];
+      keyType = keyType == null
+          ? allocatePhi(null, null, type, isTry: false)
+          : addPhiInput(null, keyType, type);
+
+      type = valueTypes[i];
+      valueType = valueType == null
+          ? allocatePhi(null, null, type, isTry: false)
+          : addPhiInput(null, valueType, type);
+    }
+
+    keyType =
+        keyType == null ? nonNullEmpty() : simplifyPhi(null, null, keyType);
+    valueType =
+        valueType == null ? nonNullEmpty() : simplifyPhi(null, null, valueType);
+
+    AbstractValue keyTypeMask, valueTypeMask;
     if (isFixed) {
-      keyType = keyTypes.fold(nonNullEmptyType.type,
-          (type, info) => _abstractValueDomain.union(type, info.type));
-      valueType = valueTypes.fold(nonNullEmptyType.type,
-          (type, info) => _abstractValueDomain.union(type, info.type));
+      keyTypeMask = keyType.type;
+      valueTypeMask = valueType.type;
     } else {
-      keyType = valueType = dynamicType.type;
+      keyTypeMask = valueTypeMask = dynamicType.type;
     }
     AbstractValue mask = _abstractValueDomain.createMapValue(
-        type.type, node, element, keyType, valueType);
+        type.type, node, element, keyTypeMask, valueTypeMask);
 
-    TypeInformation keyTypeInfo =
-        new KeyInMapTypeInformation(_abstractValueDomain, currentMember, null);
+    TypeInformation keyTypeInfo = new KeyInMapTypeInformation(
+        _abstractValueDomain, currentMember, keyType);
     TypeInformation valueTypeInfo = new ValueInMapTypeInformation(
-        _abstractValueDomain, currentMember, null);
+        _abstractValueDomain, currentMember, valueType);
     allocatedTypes.add(keyTypeInfo);
     allocatedTypes.add(valueTypeInfo);
 
@@ -623,14 +635,20 @@
     // mapped iterable, we save the intermediate results to avoid computing them
     // again.
     var list = [];
+    bool isDynamicIngoringNull = false;
+    bool mayBeNull = false;
     for (AbstractValue mask in masks) {
       // Don't do any work on computing unions if we know that after all that
       // work the result will be `dynamic`.
       // TODO(sigmund): change to `mask == dynamicType` so we can continue to
       // track the non-nullable bit.
       if (_abstractValueDomain.containsAll(mask).isPotentiallyTrue) {
-        return dynamicType;
+        isDynamicIngoringNull = true;
       }
+      if (_abstractValueDomain.isNull(mask).isPotentiallyTrue) {
+        mayBeNull = true;
+      }
+      if (isDynamicIngoringNull && mayBeNull) return dynamicType;
       list.add(mask);
     }
 
@@ -640,8 +658,12 @@
           newType == null ? mask : _abstractValueDomain.union(newType, mask);
       // Likewise - stop early if we already reach dynamic.
       if (_abstractValueDomain.containsAll(newType).isPotentiallyTrue) {
-        return dynamicType;
+        isDynamicIngoringNull = true;
       }
+      if (_abstractValueDomain.isNull(newType).isPotentiallyTrue) {
+        mayBeNull = true;
+      }
+      if (isDynamicIngoringNull && mayBeNull) return dynamicType;
     }
 
     return newType ?? _abstractValueDomain.emptyType;
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/constants.dart b/pkg/compiler/lib/src/inferrer/typemasks/constants.dart
index c539521..9b5232f 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/constants.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/constants.dart
@@ -5,6 +5,7 @@
 library types.constants;
 
 import '../../common.dart';
+import '../../constants/constant_system.dart' as constant_system;
 import '../../constants/values.dart';
 import '../../js_backend/js_backend.dart' show SyntheticConstantKind;
 import '../../world.dart' show JClosedWorld;
@@ -37,7 +38,7 @@
   @override
   TypeMask visitDouble(DoubleConstantValue constant, JClosedWorld closedWorld) {
     // We have to recognize double constants that are 'is int'.
-    if (closedWorld.constantSystem.isInt(constant)) {
+    if (constant_system.isInt(constant)) {
       if (constant.isMinusZero) {
         return closedWorld.abstractValueDomain.uint31Type;
       } else {
@@ -104,6 +105,11 @@
   }
 
   @override
+  TypeMask visitSet(SetConstantValue constant, JClosedWorld closedWorld) {
+    return closedWorld.abstractValueDomain.constSetType;
+  }
+
+  @override
   TypeMask visitMap(MapConstantValue constant, JClosedWorld closedWorld) {
     return closedWorld.abstractValueDomain.constMapType;
   }
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
index 41db5e8..8478b0f 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
@@ -98,6 +98,7 @@
 
   bool get isUnion => false;
   bool get isContainer => false;
+  bool get isSet => false;
   bool get isMap => false;
   bool get isDictionary => false;
   bool get isForwarding => false;
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart
index 7b8e73a..6021460 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart
@@ -19,6 +19,7 @@
 
   bool get isUnion => false;
   bool get isContainer => false;
+  bool get isSet => false;
   bool get isMap => false;
   bool get isDictionary => false;
   bool get isValue => false;
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index 03ccfef..748c280 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
@@ -29,6 +29,7 @@
 part 'flat_type_mask.dart';
 part 'forwarding_type_mask.dart';
 part 'map_type_mask.dart';
+part 'set_type_mask.dart';
 part 'type_mask.dart';
 part 'union_type_mask.dart';
 part 'value_type_mask.dart';
@@ -57,6 +58,8 @@
   TypeMask _constListType;
   TypeMask _fixedListType;
   TypeMask _growableListType;
+  TypeMask _setType;
+  TypeMask _constSetType;
   TypeMask _mapType;
   TypeMask _constMapType;
   TypeMask _stringType;
@@ -142,6 +145,14 @@
           commonElements.jsExtendableArrayClass, _closedWorld);
 
   @override
+  TypeMask get setType => _setType ??=
+      new TypeMask.nonNullSubtype(commonElements.setLiteralClass, _closedWorld);
+
+  @override
+  TypeMask get constSetType => _constSetType ??= new TypeMask.nonNullSubtype(
+      commonElements.constSetLiteralClass, _closedWorld);
+
+  @override
   TypeMask get mapType => _mapType ??=
       new TypeMask.nonNullSubtype(commonElements.mapLiteralClass, _closedWorld);
 
@@ -705,6 +716,11 @@
   }
 
   @override
+  bool isSet(TypeMask value) {
+    return value.isSet;
+  }
+
+  @override
   bool isContainer(TypeMask value) {
     return value.isContainer;
   }
@@ -745,6 +761,21 @@
   }
 
   @override
+  AbstractValue createSetValue(AbstractValue forwardTo, Object allocationNode,
+      MemberEntity allocationElement, AbstractValue elementType) {
+    return new SetTypeMask(
+        forwardTo, allocationNode, allocationElement, elementType);
+  }
+
+  @override
+  AbstractValue getSetElementType(AbstractValue value) {
+    if (value is SetTypeMask) {
+      return value.elementType ?? dynamicType;
+    }
+    return dynamicType;
+  }
+
+  @override
   bool isSpecializationOf(
       AbstractValue specialization, AbstractValue generalization) {
     return specialization is ForwardingTypeMask &&
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
new file mode 100644
index 0000000..fb0a7e2
--- /dev/null
+++ b/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
@@ -0,0 +1,116 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of masks;
+
+/// A [SetTypeMask] is a [TypeMask] for a specific allocation site of a set
+/// (currently only the internal Set class) that will get specialized once the
+/// [TypeGraphInferrer] phase finds an element type for it.
+class SetTypeMask extends AllocationTypeMask {
+  /// Tag used for identifying serialized [SetTypeMask] objects in a debugging
+  /// data stream.
+  static const String tag = 'set-type-mask';
+
+  final TypeMask forwardTo;
+
+  // The [Node] where this type mask was created.
+  final ir.TreeNode allocationNode;
+
+  // The [Entity] where this type mask was created.
+  final MemberEntity allocationElement;
+
+  // The element type of this set.
+  final TypeMask elementType;
+
+  SetTypeMask(this.forwardTo, this.allocationNode, this.allocationElement,
+      this.elementType);
+
+  /// Deserializes a [SetTypeMask] object from [source].
+  factory SetTypeMask.readFromDataSource(
+      DataSource source, JClosedWorld closedWorld) {
+    source.begin(tag);
+    TypeMask forwardTo = new TypeMask.readFromDataSource(source, closedWorld);
+    ir.TreeNode allocationNode = source.readTreeNodeOrNull();
+    MemberEntity allocationElement = source.readMemberOrNull();
+    TypeMask elementType = new TypeMask.readFromDataSource(source, closedWorld);
+    source.end(tag);
+    return new SetTypeMask(
+        forwardTo, allocationNode, allocationElement, elementType);
+  }
+
+  /// Serializes this [SetTypeMask] to [sink].
+  @override
+  void writeToDataSink(DataSink sink) {
+    sink.writeEnum(TypeMaskKind.set);
+    sink.begin(tag);
+    forwardTo.writeToDataSink(sink);
+    sink.writeTreeNodeOrNull(allocationNode);
+    sink.writeMemberOrNull(allocationElement);
+    elementType.writeToDataSink(sink);
+    sink.end(tag);
+  }
+
+  @override
+  TypeMask nullable() => isNullable
+      ? this
+      : new SetTypeMask(
+          forwardTo.nullable(), allocationNode, allocationElement, elementType);
+
+  @override
+  TypeMask nonNullable() => isNullable
+      ? new SetTypeMask(forwardTo.nonNullable(), allocationNode,
+          allocationElement, elementType)
+      : this;
+
+  @override
+  bool get isSet => true;
+
+  @override
+  bool get isExact => true;
+
+  @override
+  bool equalsDisregardNull(other) {
+    if (other is! SetTypeMask) return false;
+    return super.equalsDisregardNull(other) &&
+        allocationNode == other.allocationNode &&
+        elementType == other.elementType;
+  }
+
+  @override
+  TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
+    TypeMask forwardIntersection = forwardTo.intersection(other, closedWorld);
+    if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
+    return forwardIntersection.isNullable ? nullable() : nonNullable();
+  }
+
+  @override
+  TypeMask union(dynamic other, JClosedWorld closedWorld) {
+    if (this == other) {
+      return this;
+    } else if (equalsDisregardNull(other)) {
+      return other.isNullable ? other : this;
+    } else if (other.isEmptyOrNull) {
+      return other.isNullable ? this.nullable() : this;
+    } else if (other.isSet &&
+        elementType != null &&
+        other.elementType != null) {
+      TypeMask newElementType =
+          elementType.union(other.elementType, closedWorld);
+      TypeMask newForwardTo = forwardTo.union(other.forwardTo, closedWorld);
+      return new SetTypeMask(newForwardTo, null, null, newElementType);
+    } else {
+      return forwardTo.union(other, closedWorld);
+    }
+  }
+
+  @override
+  bool operator ==(other) => super == other;
+
+  @override
+  int get hashCode =>
+      computeHashCode(allocationNode, isNullable, elementType, forwardTo);
+
+  @override
+  String toString() => 'Set($forwardTo, element: $elementType)';
+}
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
index d54859d..cb54ce7 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
@@ -98,6 +98,7 @@
   flat,
   union,
   container,
+  set,
   map,
   dictionary,
   value,
@@ -230,6 +231,8 @@
         return new UnionTypeMask.readFromDataSource(source, closedWorld);
       case TypeMaskKind.container:
         return new ContainerTypeMask.readFromDataSource(source, closedWorld);
+      case TypeMaskKind.set:
+        return new SetTypeMask.readFromDataSource(source, closedWorld);
       case TypeMaskKind.map:
         return new MapTypeMask.readFromDataSource(source, closedWorld);
       case TypeMaskKind.dictionary:
@@ -329,6 +332,9 @@
   /// Returns `true` if this mask is a [ContainerTypeMask].
   bool get isContainer;
 
+  /// Returns `true` if this mask is a [SetTypeMask].
+  bool get isSet;
+
   /// Returns `true` if this mask is a [MapTypeMask].
   bool get isMap;
 
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
index 2f1f9de..98a5a87 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
@@ -227,6 +227,7 @@
   bool get isExact => false;
   bool get isUnion => true;
   bool get isContainer => false;
+  bool get isSet => false;
   bool get isMap => false;
   bool get isDictionary => false;
   bool get isForwarding => false;
diff --git a/pkg/compiler/lib/src/ir/annotations.dart b/pkg/compiler/lib/src/ir/annotations.dart
new file mode 100644
index 0000000..485362e
--- /dev/null
+++ b/pkg/compiler/lib/src/ir/annotations.dart
@@ -0,0 +1,130 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+import '../common/names.dart';
+
+class IrAnnotationData {
+  Map<ir.Class, String> _nativeClassNames = {};
+
+  Map<ir.Library, String> _jsInteropLibraryNames = {};
+  Map<ir.Class, String> _jsInteropClassNames = {};
+  Set<ir.Class> _anonymousJsInteropClasses = {};
+  Map<ir.Member, String> _jsInteropMemberNames = {};
+
+  String getNativeClassName(ir.Class node) => _nativeClassNames[node];
+
+  String getJsInteropLibraryName(ir.Library node) =>
+      _jsInteropLibraryNames[node];
+  String getJsInteropClassName(ir.Class node) => _jsInteropClassNames[node];
+  bool isAnonymousJsInteropClass(ir.Class node) =>
+      _anonymousJsInteropClasses.contains(node);
+  String getJsInteropMemberName(ir.Member node) => _jsInteropMemberNames[node];
+}
+
+IrAnnotationData processAnnotations(ir.Component component) {
+  IrAnnotationData data = new IrAnnotationData();
+
+  void processMember(ir.Member member) {
+    for (ir.Expression annotation in member.annotations) {
+      if (annotation is ir.ConstantExpression) {
+        ir.Constant constant = annotation.constant;
+        String jsName = _getJsInteropName(constant);
+        if (jsName != null) {
+          data._jsInteropMemberNames[member] = jsName;
+        }
+      }
+    }
+  }
+
+  for (ir.Library library in component.libraries) {
+    for (ir.Expression annotation in library.annotations) {
+      if (annotation is ir.ConstantExpression) {
+        ir.Constant constant = annotation.constant;
+
+        String jsName = _getJsInteropName(constant);
+        if (jsName != null) {
+          data._jsInteropLibraryNames[library] = jsName;
+        }
+      }
+    }
+    for (ir.Class cls in library.classes) {
+      for (ir.Expression annotation in cls.annotations) {
+        if (annotation is ir.ConstantExpression) {
+          ir.Constant constant = annotation.constant;
+
+          String nativeClassName = _getNativeClassName(constant);
+          if (nativeClassName != null) {
+            data._nativeClassNames[cls] = nativeClassName;
+          }
+
+          String jsName = _getJsInteropName(constant);
+          if (jsName != null) {
+            data._jsInteropClassNames[cls] = jsName;
+          }
+
+          bool isAnonymousJsInteropClass = _isAnonymousJsInterop(constant);
+          if (isAnonymousJsInteropClass) {
+            data._anonymousJsInteropClasses.add(cls);
+          }
+        }
+      }
+      for (ir.Member member in cls.members) {
+        processMember(member);
+      }
+    }
+    for (ir.Member member in library.members) {
+      processMember(member);
+    }
+  }
+  return data;
+}
+
+String _getNativeClassName(ir.Constant constant) {
+  if (constant is ir.InstanceConstant) {
+    if (constant.classNode.name == 'Native' &&
+        constant.classNode.enclosingLibrary.importUri == Uris.dart__js_helper) {
+      if (constant.fieldValues.length == 1) {
+        ir.Constant fieldValue = constant.fieldValues.values.single;
+        String name;
+        if (fieldValue is ir.StringConstant) {
+          name = fieldValue.value;
+        }
+        if (name != null) {
+          return name;
+        }
+      }
+    }
+  }
+  return null;
+}
+
+String _getJsInteropName(ir.Constant constant) {
+  if (constant is ir.InstanceConstant) {
+    if (constant.classNode.name == 'JS' &&
+        constant.classNode.enclosingLibrary.importUri == Uris.package_js) {
+      if (constant.fieldValues.length == 1) {
+        ir.Constant fieldValue = constant.fieldValues.values.single;
+        String name;
+        if (fieldValue is ir.NullConstant) {
+          name = '';
+        } else if (fieldValue is ir.StringConstant) {
+          name = fieldValue.value;
+        }
+        if (name != null) {
+          return name;
+        }
+      }
+    }
+  }
+  return null;
+}
+
+bool _isAnonymousJsInterop(ir.Constant constant) {
+  if (constant is ir.InstanceConstant) {
+    return constant.classNode.name == '_Anonymous' &&
+        constant.classNode.enclosingLibrary.importUri == Uris.package_js;
+  }
+  return false;
+}
diff --git a/pkg/compiler/lib/src/ir/closure.dart b/pkg/compiler/lib/src/ir/closure.dart
index c53f10f..2bc573f 100644
--- a/pkg/compiler/lib/src/ir/closure.dart
+++ b/pkg/compiler/lib/src/ir/closure.dart
@@ -185,6 +185,9 @@
   /// A type variable passed as the type argument of a list literal.
   listLiteral,
 
+  /// A type variable passed as the type argument of a set literal.
+  setLiteral,
+
   /// A type variable passed as the type argument of a map literal.
   mapLiteral,
 
@@ -307,6 +310,9 @@
   static const VariableUse listLiteral =
       const VariableUse._simple(VariableUseKind.listLiteral);
 
+  static const VariableUse setLiteral =
+      const VariableUse._simple(VariableUseKind.setLiteral);
+
   static const VariableUse mapLiteral =
       const VariableUse._simple(VariableUseKind.mapLiteral);
 
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index f7118bd..dd5802a 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -175,6 +175,8 @@
   void registerRuntimeTypeUse(ir.PropertyGet node, RuntimeTypeUseKind kind,
       ir.DartType receiverType, ir.DartType argumentType);
 
+  void registerConstant(ir.ConstantExpression node);
+
   // TODO(johnniwinther): Remove these when CFE provides constants.
   void registerConstructorNode(ir.Constructor node);
   void registerFieldNode(ir.Field node);
@@ -645,6 +647,11 @@
       ir.DartType receiverType, ir.DartType argumentType) {
     registerRuntimeTypeUse(node, kind, receiverType, argumentType);
   }
+
+  @override
+  void handleConstantExpression(ir.ConstantExpression node) {
+    registerConstant(node);
+  }
 }
 
 /// Visitor that builds an [ImpactData] object for the world impact.
diff --git a/pkg/compiler/lib/src/ir/impact_data.dart b/pkg/compiler/lib/src/ir/impact_data.dart
index 20bd480..cf3ab20 100644
--- a/pkg/compiler/lib/src/ir/impact_data.dart
+++ b/pkg/compiler/lib/src/ir/impact_data.dart
@@ -405,6 +405,12 @@
   }
 
   @override
+  void registerConstant(ir.ConstantExpression node) {
+    _data._constants ??= [];
+    _data._constants.add(node);
+  }
+
+  @override
   void registerConstructorNode(ir.Constructor node) {
     _data._constructorNodes ??= [];
     _data._constructorNodes.add(node);
@@ -488,6 +494,7 @@
   List<double> _doubleLiterals;
   List<int> _intLiterals;
   List<_RuntimeTypeUse> _runtimeTypeUses;
+  List<ir.ConstantExpression> _constants;
 
   // TODO(johnniwinther): Remove these when CFE provides constants.
   List<ir.Constructor> _constructorNodes;
diff --git a/pkg/compiler/lib/src/ir/scope.dart b/pkg/compiler/lib/src/ir/scope.dart
index 1b547d2..a323f6f 100644
--- a/pkg/compiler/lib/src/ir/scope.dart
+++ b/pkg/compiler/lib/src/ir/scope.dart
@@ -9,8 +9,10 @@
 class ScopeModel {
   final ClosureScopeModel closureScopeModel;
   final VariableScopeModel variableScopeModel;
+  final InitializerComplexity initializerComplexity;
 
-  ScopeModel(this.closureScopeModel, this.variableScopeModel);
+  ScopeModel(this.closureScopeModel, this.variableScopeModel,
+      this.initializerComplexity);
 
   /// Inspect members and mark if those members capture any state that needs to
   /// be marked as free variables.
@@ -31,20 +33,23 @@
       hasThisLocal = true;
     }
     ClosureScopeModel closureScopeModel = new ClosureScopeModel();
-    ScopeModelBuilder translator =
+    ScopeModelBuilder builder =
         new ScopeModelBuilder(closureScopeModel, hasThisLocal: hasThisLocal);
+    InitializerComplexity initializerComplexity =
+        const InitializerComplexity.lazy();
     if (node is ir.Field) {
       if (node is ir.Field && node.initializer != null) {
-        node.accept(translator);
+        initializerComplexity = node.accept(builder);
       } else {
         assert(node.isInstanceMember);
         closureScopeModel.scopeInfo = new KernelScopeInfo(true);
       }
     } else {
       assert(node is ir.Procedure || node is ir.Constructor);
-      node.accept(translator);
+      node.accept(builder);
     }
-    return new ScopeModel(closureScopeModel, translator.variableScopeModel);
+    return new ScopeModel(
+        closureScopeModel, builder.variableScopeModel, initializerComplexity);
   }
 }
 
diff --git a/pkg/compiler/lib/src/ir/scope_visitor.dart b/pkg/compiler/lib/src/ir/scope_visitor.dart
index 2e7061a..07ae385 100644
--- a/pkg/compiler/lib/src/ir/scope_visitor.dart
+++ b/pkg/compiler/lib/src/ir/scope_visitor.dart
@@ -11,7 +11,8 @@
 /// assigned/captured/free at various points to build a [ClosureScopeModel] and
 /// a [VariableScopeModel] that can respond to queries about how a particular
 /// variable is being used at any point in the code.
-class ScopeModelBuilder extends ir.Visitor<void> with VariableCollectorMixin {
+class ScopeModelBuilder extends ir.Visitor<InitializerComplexity>
+    with VariableCollectorMixin {
   ClosureScopeModel _model;
 
   /// A map of each visited call node with the associated information about what
@@ -77,17 +78,19 @@
       : this._hasThisLocal = hasThisLocal;
 
   @override
-  ir.DartType defaultNode(ir.Node node) =>
+  InitializerComplexity defaultNode(ir.Node node) =>
       throw UnsupportedError('Unhandled node $node (${node.runtimeType})');
 
-  void visitNode(ir.Node node) {
+  InitializerComplexity visitNode(ir.Node node) {
     return node?.accept(this);
   }
 
-  void visitNodes(List<ir.Node> nodes) {
+  InitializerComplexity visitNodes(List<ir.Node> nodes) {
+    InitializerComplexity complexity = const InitializerComplexity.constant();
     for (ir.Node node in nodes) {
-      visitNode(node);
+      complexity = complexity.combine(visitNode(node));
     }
+    return complexity;
   }
 
   /// Update the [CapturedScope] object corresponding to
@@ -167,12 +170,12 @@
   }
 
   @override
-  void visitNamedExpression(ir.NamedExpression node) {
-    visitNode(node.value);
+  InitializerComplexity visitNamedExpression(ir.NamedExpression node) {
+    return visitNode(node.value);
   }
 
   @override
-  void visitTryCatch(ir.TryCatch node) {
+  InitializerComplexity visitTryCatch(ir.TryCatch node) {
     bool oldInTry = _inTry;
     _inTry = true;
     visitInVariableScope(node, () {
@@ -180,10 +183,11 @@
     });
     visitNodes(node.catches);
     _inTry = oldInTry;
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitTryFinally(ir.TryFinally node) {
+  InitializerComplexity visitTryFinally(ir.TryFinally node) {
     bool oldInTry = _inTry;
     _inTry = true;
     visitInVariableScope(node, () {
@@ -191,21 +195,24 @@
     });
     visitNode(node.finalizer);
     _inTry = oldInTry;
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitVariableGet(ir.VariableGet node) {
+  InitializerComplexity visitVariableGet(ir.VariableGet node) {
     _markVariableAsUsed(node.variable, VariableUse.explicit);
     // Don't visit `node.promotedType`.
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitVariableSet(ir.VariableSet node) {
+  InitializerComplexity visitVariableSet(ir.VariableSet node) {
     _mutatedVariables.add(node.variable);
     _markVariableAsUsed(node.variable, VariableUse.explicit);
     visitInContext(node.variable.type, VariableUse.localType);
     visitNode(node.value);
     registerAssignedVariable(node.variable);
+    return const InitializerComplexity.lazy();
   }
 
   void _handleVariableDeclaration(
@@ -219,8 +226,9 @@
   }
 
   @override
-  void visitVariableDeclaration(ir.VariableDeclaration node) {
+  InitializerComplexity visitVariableDeclaration(ir.VariableDeclaration node) {
     _handleVariableDeclaration(node, VariableUse.localType);
+    return const InitializerComplexity.lazy();
   }
 
   /// Add this variable to the set of free variables if appropriate and add to
@@ -255,12 +263,15 @@
   }
 
   @override
-  void visitThisExpression(ir.ThisExpression thisExpression) {
-    if (_hasThisLocal) _registerNeedsThis(VariableUse.explicit);
+  InitializerComplexity visitThisExpression(ir.ThisExpression thisExpression) {
+    if (_hasThisLocal) {
+      _registerNeedsThis(VariableUse.explicit);
+    }
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitTypeParameter(ir.TypeParameter typeParameter) {
+  InitializerComplexity visitTypeParameter(ir.TypeParameter typeParameter) {
     ir.TreeNode context = _executableContext;
     TypeVariableTypeWithContext typeVariable = new TypeVariableTypeWithContext(
         new ir.TypeParameterType(typeParameter),
@@ -288,6 +299,7 @@
         _useTypeVariableAsLocal(typeVariable, _currentTypeUsage);
       }
     }
+    return const InitializerComplexity.constant();
   }
 
   /// Add `this` as a variable that needs to be accessed (and thus may become a
@@ -306,7 +318,7 @@
   }
 
   @override
-  void visitForInStatement(ir.ForInStatement node) {
+  InitializerComplexity visitForInStatement(ir.ForInStatement node) {
     // We need to set `inTry` to true if this is an async for-in because we
     // desugar it into a try-finally in the SSA phase.
     bool oldInTry = _inTry;
@@ -323,28 +335,31 @@
     if (node.isAsync) {
       _inTry = oldInTry;
     }
+    return const InitializerComplexity.lazy();
   }
 
-  void visitWhileStatement(ir.WhileStatement node) {
+  InitializerComplexity visitWhileStatement(ir.WhileStatement node) {
     enterNewScope(node, () {
       visitInVariableScope(node, () {
         visitNode(node.condition);
         visitNode(node.body);
       });
     });
+    return const InitializerComplexity.lazy();
   }
 
-  void visitDoStatement(ir.DoStatement node) {
+  InitializerComplexity visitDoStatement(ir.DoStatement node) {
     enterNewScope(node, () {
       visitInVariableScope(node, () {
         visitNode(node.body);
         visitNode(node.condition);
       });
     });
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitForStatement(ir.ForStatement node) {
+  InitializerComplexity visitForStatement(ir.ForStatement node) {
     List<ir.VariableDeclaration> boxedLoopVariables =
         <ir.VariableDeclaration>[];
     enterNewScope(node, () {
@@ -382,20 +397,23 @@
       }
     });
     KernelCapturedScope scope = _scopesCapturedInClosureMap[node];
-    if (scope == null) return;
-    _scopesCapturedInClosureMap[node] = new KernelCapturedLoopScope(
-        scope.boxedVariables,
-        scope.capturedVariablesAccessor,
-        boxedLoopVariables,
-        scope.localsUsedInTryOrSync,
-        scope.freeVariables,
-        scope.freeVariablesForRti,
-        scope.thisUsedAsFreeVariable,
-        scope.thisUsedAsFreeVariableIfNeedsRti,
-        scope.hasThisLocal);
+    if (scope != null) {
+      _scopesCapturedInClosureMap[node] = new KernelCapturedLoopScope(
+          scope.boxedVariables,
+          scope.capturedVariablesAccessor,
+          boxedLoopVariables,
+          scope.localsUsedInTryOrSync,
+          scope.freeVariables,
+          scope.freeVariablesForRti,
+          scope.thisUsedAsFreeVariable,
+          scope.thisUsedAsFreeVariableIfNeedsRti,
+          scope.hasThisLocal);
+    }
+    return const InitializerComplexity.lazy();
   }
 
-  void visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
+  InitializerComplexity visitSuperMethodInvocation(
+      ir.SuperMethodInvocation node) {
     if (_hasThisLocal) {
       _registerNeedsThis(VariableUse.explicit);
     }
@@ -405,19 +423,22 @@
     }
     visitNodes(node.arguments.positional);
     visitNodes(node.arguments.named);
+    return const InitializerComplexity.lazy();
   }
 
-  void visitSuperPropertySet(ir.SuperPropertySet node) {
+  InitializerComplexity visitSuperPropertySet(ir.SuperPropertySet node) {
     if (_hasThisLocal) {
       _registerNeedsThis(VariableUse.explicit);
     }
     visitNode(node.value);
+    return const InitializerComplexity.lazy();
   }
 
-  void visitSuperPropertyGet(ir.SuperPropertyGet node) {
+  InitializerComplexity visitSuperPropertyGet(ir.SuperPropertyGet node) {
     if (_hasThisLocal) {
       _registerNeedsThis(VariableUse.explicit);
     }
+    return const InitializerComplexity.lazy();
   }
 
   void visitInvokable(ir.TreeNode node, void f()) {
@@ -492,132 +513,155 @@
   }
 
   @override
-  void visitField(ir.Field node) {
+  InitializerComplexity visitField(ir.Field node) {
     _currentTypeUsage = VariableUse.fieldType;
+    InitializerComplexity complexity;
     visitInvokable(node, () {
-      visitNode(node.initializer);
+      complexity = visitNode(node.initializer);
     });
     _currentTypeUsage = null;
+    return complexity;
   }
 
   @override
-  void visitConstructor(ir.Constructor node) {
+  InitializerComplexity visitConstructor(ir.Constructor node) {
     visitInvokable(node, () {
       visitNodes(node.initializers);
       visitNode(node.function);
     });
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitProcedure(ir.Procedure node) {
+  InitializerComplexity visitProcedure(ir.Procedure node) {
     visitInvokable(node, () {
       visitNode(node.function);
     });
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitFunctionExpression(ir.FunctionExpression node) {
+  InitializerComplexity visitFunctionExpression(ir.FunctionExpression node) {
     visitInvokable(node, () {
       visitInVariableScope(node, () {
         visitNode(node.function);
       });
     });
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitFunctionDeclaration(ir.FunctionDeclaration node) {
+  InitializerComplexity visitFunctionDeclaration(ir.FunctionDeclaration node) {
     visitInvokable(node, () {
       visitInVariableScope(node, () {
         visitNode(node.function);
       });
     });
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitDynamicType(ir.DynamicType node) {}
+  InitializerComplexity visitDynamicType(ir.DynamicType node) =>
+      const InitializerComplexity.constant();
 
   @override
-  void visitBottomType(ir.BottomType node) {}
+  InitializerComplexity visitBottomType(ir.BottomType node) =>
+      const InitializerComplexity.lazy();
 
   @override
-  void visitInvalidType(ir.InvalidType node) {}
+  InitializerComplexity visitInvalidType(ir.InvalidType node) =>
+      const InitializerComplexity.lazy();
 
   @override
-  void visitVoidType(ir.VoidType node) {}
+  InitializerComplexity visitVoidType(ir.VoidType node) =>
+      const InitializerComplexity.constant();
 
   @override
-  void visitInterfaceType(ir.InterfaceType node) {
-    visitNodes(node.typeArguments);
+  InitializerComplexity visitInterfaceType(ir.InterfaceType node) {
+    return visitNodes(node.typeArguments);
   }
 
   @override
-  void visitFunctionType(ir.FunctionType node) {
-    visitNode(node.returnType);
-    visitNodes(node.positionalParameters);
-    visitNodes(node.namedParameters);
-    visitNodes(node.typeParameters);
+  InitializerComplexity visitFunctionType(ir.FunctionType node) {
+    InitializerComplexity complexity = visitNode(node.returnType);
+    complexity = complexity.combine(visitNodes(node.positionalParameters));
+    complexity = complexity.combine(visitNodes(node.namedParameters));
+    return complexity.combine(visitNodes(node.typeParameters));
   }
 
   @override
-  void visitNamedType(ir.NamedType node) {
-    visitNode(node.type);
+  InitializerComplexity visitNamedType(ir.NamedType node) {
+    return visitNode(node.type);
   }
 
   @override
-  void visitTypeParameterType(ir.TypeParameterType node) {
+  InitializerComplexity visitTypeParameterType(ir.TypeParameterType node) {
     _analyzeTypeVariable(node, _currentTypeUsage);
+    return const InitializerComplexity.lazy();
   }
 
-  void visitInContext(ir.Node node, VariableUse use) {
+  InitializerComplexity visitInContext(ir.Node node, VariableUse use) {
     VariableUse oldCurrentTypeUsage = _currentTypeUsage;
     _currentTypeUsage = use;
-    visitNode(node);
+    InitializerComplexity complexity = visitNode(node);
     _currentTypeUsage = oldCurrentTypeUsage;
+    return complexity;
   }
 
-  void visitNodesInContext(List<ir.Node> nodes, VariableUse use) {
+  InitializerComplexity visitNodesInContext(
+      List<ir.Node> nodes, VariableUse use) {
     VariableUse oldCurrentTypeUsage = _currentTypeUsage;
     _currentTypeUsage = use;
-    visitNodes(nodes);
+    InitializerComplexity complexity = visitNodes(nodes);
     _currentTypeUsage = oldCurrentTypeUsage;
+    return complexity;
   }
 
   @override
-  void visitTypeLiteral(ir.TypeLiteral node) {
-    visitInContext(node.type, VariableUse.explicit);
+  InitializerComplexity visitTypeLiteral(ir.TypeLiteral node) {
+    return visitInContext(node.type, VariableUse.explicit);
   }
 
   @override
-  void visitIsExpression(ir.IsExpression node) {
+  InitializerComplexity visitIsExpression(ir.IsExpression node) {
     visitNode(node.operand);
     visitInContext(node.type, VariableUse.explicit);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitAsExpression(ir.AsExpression node) {
+  InitializerComplexity visitAsExpression(ir.AsExpression node) {
     visitNode(node.operand);
     visitInContext(node.type,
         node.isTypeError ? VariableUse.implicitCast : VariableUse.explicit);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitAwaitExpression(ir.AwaitExpression node) {
+  InitializerComplexity visitAwaitExpression(ir.AwaitExpression node) {
     visitNode(node.operand);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitYieldStatement(ir.YieldStatement node) {
+  InitializerComplexity visitYieldStatement(ir.YieldStatement node) {
     visitNode(node.expression);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitLoadLibrary(ir.LoadLibrary node) {}
+  InitializerComplexity visitLoadLibrary(ir.LoadLibrary node) {
+    return const InitializerComplexity.lazy();
+  }
 
   @override
-  void visitCheckLibraryIsLoaded(ir.CheckLibraryIsLoaded node) {}
+  InitializerComplexity visitCheckLibraryIsLoaded(
+      ir.CheckLibraryIsLoaded node) {
+    return const InitializerComplexity.lazy();
+  }
 
   @override
-  void visitFunctionNode(ir.FunctionNode node) {
+  InitializerComplexity visitFunctionNode(ir.FunctionNode node) {
     VariableUse parameterUsage = node.parent is ir.Member
         ? new VariableUse.memberParameter(node.parent)
         : new VariableUse.localParameter(node.parent);
@@ -634,59 +678,88 @@
             ? new VariableUse.memberReturnType(node.parent)
             : new VariableUse.localReturnType(node.parent));
     visitNode(node.body);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitListLiteral(ir.ListLiteral node) {
+  InitializerComplexity visitListLiteral(ir.ListLiteral node) {
     visitInContext(node.typeArgument, VariableUse.listLiteral);
     visitNodes(node.expressions);
+    return node.isConst
+        ? const InitializerComplexity.constant()
+        : const InitializerComplexity.lazy();
   }
 
   @override
-  void visitMapLiteral(ir.MapLiteral node) {
+  InitializerComplexity visitSetLiteral(ir.SetLiteral node) {
+    visitInContext(node.typeArgument, VariableUse.setLiteral);
+    visitNodes(node.expressions);
+    return node.isConst
+        ? const InitializerComplexity.constant()
+        : const InitializerComplexity.lazy();
+  }
+
+  @override
+  InitializerComplexity visitMapLiteral(ir.MapLiteral node) {
     visitInContext(node.keyType, VariableUse.mapLiteral);
     visitInContext(node.valueType, VariableUse.mapLiteral);
     visitNodes(node.entries);
+    return node.isConst
+        ? const InitializerComplexity.constant()
+        : const InitializerComplexity.lazy();
   }
 
   @override
-  void visitMapEntry(ir.MapEntry node) {
-    visitNode(node.key);
-    visitNode(node.value);
+  InitializerComplexity visitMapEntry(ir.MapEntry node) {
+    InitializerComplexity complexity = visitNode(node.key);
+    return complexity.combine(visitNode(node.value));
   }
 
   @override
-  void visitNullLiteral(ir.NullLiteral node) {}
+  InitializerComplexity visitNullLiteral(ir.NullLiteral node) =>
+      const InitializerComplexity.constant();
 
   @override
-  void visitStringLiteral(ir.StringLiteral node) {}
-  @override
-  void visitIntLiteral(ir.IntLiteral node) {}
+  InitializerComplexity visitStringLiteral(ir.StringLiteral node) =>
+      const InitializerComplexity.constant();
 
   @override
-  void visitDoubleLiteral(ir.DoubleLiteral node) {}
+  InitializerComplexity visitIntLiteral(ir.IntLiteral node) =>
+      const InitializerComplexity.constant();
 
   @override
-  void visitSymbolLiteral(ir.SymbolLiteral node) {}
+  InitializerComplexity visitDoubleLiteral(ir.DoubleLiteral node) =>
+      const InitializerComplexity.constant();
 
   @override
-  void visitBoolLiteral(ir.BoolLiteral node) {}
+  InitializerComplexity visitSymbolLiteral(ir.SymbolLiteral node) =>
+      const InitializerComplexity.constant();
 
   @override
-  void visitStringConcatenation(ir.StringConcatenation node) {
+  InitializerComplexity visitBoolLiteral(ir.BoolLiteral node) =>
+      const InitializerComplexity.constant();
+
+  @override
+  InitializerComplexity visitStringConcatenation(ir.StringConcatenation node) {
     visitNodes(node.expressions);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitStaticGet(ir.StaticGet node) {}
+  InitializerComplexity visitStaticGet(ir.StaticGet node) {
+    return node.target.isConst
+        ? const InitializerComplexity.constant()
+        : const InitializerComplexity.lazy();
+  }
 
   @override
-  void visitStaticSet(ir.StaticSet node) {
+  InitializerComplexity visitStaticSet(ir.StaticSet node) {
     visitNode(node.value);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitStaticInvocation(ir.StaticInvocation node) {
+  InitializerComplexity visitStaticInvocation(ir.StaticInvocation node) {
     if (node.arguments.types.isNotEmpty) {
       VariableUse usage;
       if (node.target.kind == ir.ProcedureKind.Factory) {
@@ -699,28 +772,36 @@
     }
     visitNodes(node.arguments.positional);
     visitNodes(node.arguments.named);
+    return node.isConst
+        ? const InitializerComplexity.constant()
+        : const InitializerComplexity.lazy();
   }
 
   @override
-  void visitConstructorInvocation(ir.ConstructorInvocation node) {
+  InitializerComplexity visitConstructorInvocation(
+      ir.ConstructorInvocation node) {
     if (node.arguments.types.isNotEmpty) {
       visitNodesInContext(node.arguments.types,
           new VariableUse.constructorTypeArgument(node.target));
     }
     visitNodes(node.arguments.positional);
     visitNodes(node.arguments.named);
+    return node.isConst
+        ? const InitializerComplexity.constant()
+        : const InitializerComplexity.lazy();
   }
 
   @override
-  void visitConditionalExpression(ir.ConditionalExpression node) {
-    visitNode(node.condition);
-    visitNode(node.then);
-    visitNode(node.otherwise);
+  InitializerComplexity visitConditionalExpression(
+      ir.ConditionalExpression node) {
+    InitializerComplexity complexity = visitNode(node.condition);
+    complexity = complexity.combine(visitNode(node.then));
+    return complexity.combine(visitNode(node.otherwise));
     // Don't visit `node.staticType`.
   }
 
   @override
-  void visitMethodInvocation(ir.MethodInvocation node) {
+  InitializerComplexity visitMethodInvocation(ir.MethodInvocation node) {
     ir.TreeNode receiver = node.receiver;
     visitNode(receiver);
     if (node.arguments.types.isNotEmpty) {
@@ -737,164 +818,199 @@
     }
     visitNodes(node.arguments.positional);
     visitNodes(node.arguments.named);
+    // TODO(johnniwinther): Recognize constant operations.
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitPropertyGet(ir.PropertyGet node) {
+  InitializerComplexity visitPropertyGet(ir.PropertyGet node) {
     visitNode(node.receiver);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitPropertySet(ir.PropertySet node) {
+  InitializerComplexity visitPropertySet(ir.PropertySet node) {
     visitNode(node.receiver);
     visitNode(node.value);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitDirectPropertyGet(ir.DirectPropertyGet node) {
+  InitializerComplexity visitDirectPropertyGet(ir.DirectPropertyGet node) {
     visitNode(node.receiver);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitDirectPropertySet(ir.DirectPropertySet node) {
+  InitializerComplexity visitDirectPropertySet(ir.DirectPropertySet node) {
     visitNode(node.receiver);
     visitNode(node.value);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitNot(ir.Not node) {
-    visitNode(node.operand);
+  InitializerComplexity visitNot(ir.Not node) {
+    return visitNode(node.operand);
   }
 
   @override
-  void visitLogicalExpression(ir.LogicalExpression node) {
-    visitNode(node.left);
-    visitNode(node.right);
+  InitializerComplexity visitLogicalExpression(ir.LogicalExpression node) {
+    InitializerComplexity complexity = visitNode(node.left);
+    return complexity.combine(visitNode(node.right));
   }
 
   @override
-  void visitLet(ir.Let node) {
+  InitializerComplexity visitLet(ir.Let node) {
     visitNode(node.variable);
     visitNode(node.body);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitCatch(ir.Catch node) {
+  InitializerComplexity visitCatch(ir.Catch node) {
     visitInContext(node.guard, VariableUse.explicit);
     visitNode(node.exception);
     visitNode(node.stackTrace);
     visitInVariableScope(node, () {
       visitNode(node.body);
     });
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitInstantiation(ir.Instantiation node) {
-    visitNodesInContext(
+  InitializerComplexity visitInstantiation(ir.Instantiation node) {
+    InitializerComplexity complexity = visitNodesInContext(
         node.typeArguments, new VariableUse.instantiationTypeArgument(node));
-    visitNode(node.expression);
+    return complexity.combine(visitNode(node.expression));
   }
 
   @override
-  void visitThrow(ir.Throw node) {
+  InitializerComplexity visitThrow(ir.Throw node) {
     visitNode(node.expression);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitRethrow(ir.Rethrow node) {}
+  InitializerComplexity visitRethrow(ir.Rethrow node) =>
+      const InitializerComplexity.lazy();
 
   @override
-  void visitBlock(ir.Block node) {
+  InitializerComplexity visitBlock(ir.Block node) {
     visitNodes(node.statements);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitAssertStatement(ir.AssertStatement node) {
+  InitializerComplexity visitAssertStatement(ir.AssertStatement node) {
     visitInVariableScope(node, () {
       visitNode(node.condition);
       visitNode(node.message);
     });
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitReturnStatement(ir.ReturnStatement node) {
+  InitializerComplexity visitReturnStatement(ir.ReturnStatement node) {
     visitNode(node.expression);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitEmptyStatement(ir.EmptyStatement node) {}
+  InitializerComplexity visitEmptyStatement(ir.EmptyStatement node) {
+    return const InitializerComplexity.lazy();
+  }
 
   @override
-  void visitExpressionStatement(ir.ExpressionStatement node) {
+  InitializerComplexity visitExpressionStatement(ir.ExpressionStatement node) {
     visitNode(node.expression);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitSwitchStatement(ir.SwitchStatement node) {
+  InitializerComplexity visitSwitchStatement(ir.SwitchStatement node) {
     visitNode(node.expression);
     visitInVariableScope(node, () {
       visitNodes(node.cases);
     });
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitSwitchCase(ir.SwitchCase node) {
+  InitializerComplexity visitSwitchCase(ir.SwitchCase node) {
     visitNode(node.body);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitContinueSwitchStatement(ir.ContinueSwitchStatement node) {
+  InitializerComplexity visitContinueSwitchStatement(
+      ir.ContinueSwitchStatement node) {
     registerContinueSwitch();
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitBreakStatement(ir.BreakStatement node) {}
+  InitializerComplexity visitBreakStatement(ir.BreakStatement node) {
+    return const InitializerComplexity.lazy();
+  }
 
   @override
-  void visitLabeledStatement(ir.LabeledStatement node) {
+  InitializerComplexity visitLabeledStatement(ir.LabeledStatement node) {
     visitNode(node.body);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitFieldInitializer(ir.FieldInitializer node) {
+  InitializerComplexity visitFieldInitializer(ir.FieldInitializer node) {
     visitNode(node.value);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitLocalInitializer(ir.LocalInitializer node) {
+  InitializerComplexity visitLocalInitializer(ir.LocalInitializer node) {
     visitNode(node.variable.initializer);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitSuperInitializer(ir.SuperInitializer node) {
+  InitializerComplexity visitSuperInitializer(ir.SuperInitializer node) {
     if (node.arguments.types.isNotEmpty) {
       visitNodesInContext(node.arguments.types,
           new VariableUse.constructorTypeArgument(node.target));
     }
     visitNodes(node.arguments.positional);
     visitNodes(node.arguments.named);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitRedirectingInitializer(ir.RedirectingInitializer node) {
+  InitializerComplexity visitRedirectingInitializer(
+      ir.RedirectingInitializer node) {
     if (node.arguments.types.isNotEmpty) {
       visitNodesInContext(node.arguments.types,
           new VariableUse.constructorTypeArgument(node.target));
     }
     visitNodes(node.arguments.positional);
     visitNodes(node.arguments.named);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitAssertInitializer(ir.AssertInitializer node) {
+  InitializerComplexity visitAssertInitializer(ir.AssertInitializer node) {
     visitNode(node.statement);
+    return const InitializerComplexity.lazy();
   }
 
   @override
-  void visitIfStatement(ir.IfStatement node) {
+  InitializerComplexity visitIfStatement(ir.IfStatement node) {
     visitNode(node.condition);
     visitNode(node.then);
     visitNode(node.otherwise);
+    return const InitializerComplexity.lazy();
+  }
+
+  @override
+  InitializerComplexity visitConstantExpression(ir.ConstantExpression node) {
+    return const InitializerComplexity.constant();
   }
 
   /// Returns true if the node is a field, or a constructor (factory or
@@ -940,3 +1056,52 @@
     _markVariableAsUsed(typeVariable, usage);
   }
 }
+
+enum ComplexityLevel {
+  constant,
+  potentiallyEager,
+  definitelyLazy,
+}
+
+class InitializerComplexity {
+  final ComplexityLevel level;
+
+  // TODO(johnniwinther): This should hold the constant literal from CFE when
+  // provided.
+  const InitializerComplexity.constant() : level = ComplexityLevel.constant;
+
+  // TODO(johnniwinther): Use this to collect data on the size of the
+  //  initializer.
+  const InitializerComplexity.eager()
+      : level = ComplexityLevel.potentiallyEager;
+
+  const InitializerComplexity.lazy() : level = ComplexityLevel.definitelyLazy;
+
+  InitializerComplexity combine(InitializerComplexity other) {
+    if (level == other.level) {
+      // TODO(johnniwinther): Special case 'eager' when it contains data.
+      return this;
+    } else if (level == ComplexityLevel.definitelyLazy ||
+        other.level == ComplexityLevel.definitelyLazy) {
+      return const InitializerComplexity.lazy();
+    } else if (level == ComplexityLevel.potentiallyEager) {
+      return this;
+    } else {
+      assert(other.level == ComplexityLevel.potentiallyEager);
+      return other;
+    }
+  }
+
+  /// Returns a short textual representation used for testing.
+  String get shortText {
+    switch (level) {
+      case ComplexityLevel.constant:
+        return 'constant';
+      case ComplexityLevel.potentiallyEager:
+        return 'eager';
+      case ComplexityLevel.definitelyLazy:
+        return 'lazy';
+    }
+    throw new UnsupportedError("Unexpected complexity level $level");
+  }
+}
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 8ec8bad..b8d423c 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -1227,6 +1227,14 @@
     }
     handleVariableDeclaration(node);
   }
+
+  void handleConstantExpression(ir.ConstantExpression node) {}
+
+  @override
+  ir.DartType visitConstantExpression(ir.ConstantExpression node) {
+    handleConstantExpression(node);
+    return super.visitConstantExpression(node);
+  }
 }
 
 class ArgumentTypes {
diff --git a/pkg/compiler/lib/src/ir/static_type_base.dart b/pkg/compiler/lib/src/ir/static_type_base.dart
index 5cd8001..2ed1a24 100644
--- a/pkg/compiler/lib/src/ir/static_type_base.dart
+++ b/pkg/compiler/lib/src/ir/static_type_base.dart
@@ -215,4 +215,10 @@
   ir.DartType visitLoadLibrary(ir.LoadLibrary node) {
     return typeEnvironment.futureType(const ir.DynamicType());
   }
+
+  @override
+  ir.DartType visitConstantExpression(ir.ConstantExpression node) {
+    // TODO(johnniwinther): Include interface exactness where applicable.
+    return node.getStaticType(typeEnvironment);
+  }
 }
diff --git a/pkg/compiler/lib/src/ir/visitors.dart b/pkg/compiler/lib/src/ir/visitors.dart
index 549ad34..fabd55d 100644
--- a/pkg/compiler/lib/src/ir/visitors.dart
+++ b/pkg/compiler/lib/src/ir/visitors.dart
@@ -9,8 +9,10 @@
 import 'package:kernel/type_environment.dart' as ir;
 
 import '../common.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/constructors.dart';
 import '../constants/expressions.dart';
+import '../constants/values.dart';
 import '../common_elements.dart';
 import '../elements/entities.dart';
 import '../elements/operators.dart';
@@ -211,6 +213,22 @@
   }
 
   @override
+  ConstantExpression visitSetLiteral(ir.SetLiteral node) {
+    if (!node.isConst) {
+      return defaultExpression(node);
+    }
+    DartType elementType = elementMap.getDartType(node.typeArgument);
+    List<ConstantExpression> values = <ConstantExpression>[];
+    for (ir.Expression expression in node.expressions) {
+      ConstantExpression value = visit(expression);
+      if (value == null) return null;
+      values.add(value);
+    }
+    return new SetConstantExpression(
+        _commonElements.setType(elementType), values);
+  }
+
+  @override
   ConstantExpression visitListLiteral(ir.ListLiteral node) {
     if (!node.isConst) {
       return defaultExpression(node);
@@ -634,3 +652,118 @@
     return elementMap.commonElements.nullType;
   }
 }
+
+class ConstantValuefier implements ir.ConstantVisitor<ConstantValue> {
+  final IrToElementMap elementMap;
+
+  ConstantValuefier(this.elementMap);
+
+  @override
+  ConstantValue defaultConstant(ir.Constant node) {
+    throw new UnsupportedError(
+        "Unexpected constant $node (${node.runtimeType}).");
+  }
+
+  @override
+  ConstantValue visitUnevaluatedConstant(ir.UnevaluatedConstant node) {
+    throw new UnsupportedError("Unexpected unevaluated constant $node.");
+  }
+
+  @override
+  ConstantValue visitTypeLiteralConstant(ir.TypeLiteralConstant node) {
+    return constant_system.createType(
+        elementMap.commonElements, elementMap.getDartType(node.type));
+  }
+
+  @override
+  ConstantValue visitTearOffConstant(ir.TearOffConstant node) {
+    FunctionEntity function = elementMap.getMethod(node.procedure);
+    DartType type = elementMap.getFunctionType(node.procedure.function);
+    return new FunctionConstantValue(function, type);
+  }
+
+  @override
+  ConstantValue visitPartialInstantiationConstant(
+      ir.PartialInstantiationConstant node) {
+    List<DartType> typeArguments = [];
+    for (ir.DartType type in node.types) {
+      typeArguments.add(elementMap.getDartType(type));
+    }
+    FunctionConstantValue function = node.accept(this);
+    return new InstantiationConstantValue(typeArguments, function);
+  }
+
+  @override
+  ConstantValue visitInstanceConstant(ir.InstanceConstant node) {
+    InterfaceType type =
+        elementMap.createInterfaceType(node.classNode, node.typeArguments);
+    Map<FieldEntity, ConstantValue> fields = {};
+    node.fieldValues.forEach((ir.Reference reference, ir.Constant value) {
+      FieldEntity field = elementMap.getField(reference.asField);
+      fields[field] = value.accept(this);
+    });
+    return new ConstructedConstantValue(type, fields);
+  }
+
+  @override
+  ConstantValue visitListConstant(ir.ListConstant node) {
+    List<ConstantValue> elements = [];
+    for (ir.Constant element in node.entries) {
+      elements.add(element.accept(this));
+    }
+    DartType type = elementMap.commonElements
+        .listType(elementMap.getDartType(node.typeArgument));
+    return constant_system.createList(type, elements);
+  }
+
+  @override
+  ConstantValue visitSetConstant(ir.SetConstant node) {
+    // TODO(johnniwinther, fishythefish): Create a set constant value.
+    throw new UnsupportedError("Set literal constants not implemented.");
+  }
+
+  @override
+  ConstantValue visitMapConstant(ir.MapConstant node) {
+    List<ConstantValue> keys = [];
+    List<ConstantValue> values = [];
+    for (ir.ConstantMapEntry element in node.entries) {
+      keys.add(element.key.accept(this));
+      values.add(element.value.accept(this));
+    }
+    DartType type = elementMap.commonElements.mapType(
+        elementMap.getDartType(node.keyType),
+        elementMap.getDartType(node.valueType));
+    return constant_system.createMap(
+        elementMap.commonElements, type, keys, values);
+  }
+
+  @override
+  ConstantValue visitSymbolConstant(ir.SymbolConstant node) {
+    return constant_system.createSymbol(elementMap.commonElements, node.name);
+  }
+
+  @override
+  ConstantValue visitStringConstant(ir.StringConstant node) {
+    return constant_system.createString(node.value);
+  }
+
+  @override
+  ConstantValue visitDoubleConstant(ir.DoubleConstant node) {
+    return constant_system.createDouble(node.value);
+  }
+
+  @override
+  ConstantValue visitIntConstant(ir.IntConstant node) {
+    return constant_system.createIntFromInt(node.value);
+  }
+
+  @override
+  ConstantValue visitBoolConstant(ir.BoolConstant node) {
+    return constant_system.createBool(node.value);
+  }
+
+  @override
+  ConstantValue visitNullConstant(ir.NullConstant node) {
+    return constant_system.createNull();
+  }
+}
diff --git a/pkg/compiler/lib/src/js_backend/allocator_analysis.dart b/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
deleted file mode 100644
index 123f627..0000000
--- a/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:kernel/ast.dart' as ir;
-
-import '../constants/values.dart';
-import '../js_model/elements.dart' show JField;
-import '../js_model/js_world_builder.dart';
-import '../kernel/element_map.dart';
-import '../kernel/kernel_strategy.dart';
-import '../kernel/kelements.dart' show KClass, KField;
-import '../options.dart';
-import '../serialization/serialization.dart';
-
-abstract class AllocatorAnalysis {}
-
-/// AllocatorAnalysis
-///
-/// Analysis to determine features of the allocator functions. The allocator
-/// function takes parameters for each field initializer and initializes the
-/// fields.  Parameters may be omitted if the initializer is always the same
-/// constant value.  How the allocator is emitted will determine what kind of
-/// constants can be handled.  The initial implementation only permits `null`.
-
-// TODO(sra): Analysis to determine field order. Current field order is
-// essentially declaration order, subclass first. We can reorder fields so that
-// fields initialized with the same constant are together to allow chained
-// initialization. Fields of a class and superclass can be reordered to allow
-// chaining, e.g.
-//
-//     this.x = this.z = null;
-//
-class KAllocatorAnalysis implements AllocatorAnalysis {
-  final KernelToElementMap _elementMap;
-
-  final Map<KField, ConstantValue> _fixedInitializers = {};
-
-  KAllocatorAnalysis(KernelFrontEndStrategy kernelStrategy)
-      : _elementMap = kernelStrategy.elementMap;
-
-  // Register class during resolution. Use simple syntactic analysis to find
-  // null-initialized fields.
-  void registerInstantiatedClass(KClass class_) {
-    ir.Class classNode = _elementMap.getClassNode(class_);
-
-    Map<ir.Field, ConstantValue> inits = {};
-    for (ir.Field field in classNode.fields) {
-      if (!field.isInstanceMember) continue;
-      ir.Expression initializer = field.initializer;
-      // TODO(sra): Should really be using constant evaluator to determine
-      // value.
-      if (initializer == null || initializer is ir.NullLiteral) {
-        inits[field] = const NullConstantValue();
-      } else if (initializer is ir.IntLiteral) {
-        BigInt intValue = BigInt.from(initializer.value).toUnsigned(64);
-        inits[field] = IntConstantValue(intValue);
-      } else if (initializer is ir.BoolLiteral) {
-        inits[field] = BoolConstantValue(initializer.value);
-      } else if (initializer is ir.StringLiteral) {
-        if (initializer.value.length <= 20) {
-          inits[field] = StringConstantValue(initializer.value);
-        }
-      }
-    }
-
-    for (ir.Constructor constructor in classNode.constructors) {
-      for (ir.Initializer initializer in constructor.initializers) {
-        if (initializer is ir.FieldInitializer) {
-          // TODO(sra): Check explicit initializer value to see if consistent
-          // over all constructors.
-          inits.remove(initializer.field);
-        }
-      }
-    }
-
-    inits.forEach((ir.Field fieldNode, ConstantValue value) {
-      _fixedInitializers[_elementMap.getField(fieldNode)] = value;
-    });
-  }
-
-  ConstantValue getFixedInitializerForTesting(KField field) =>
-      _fixedInitializers[field];
-}
-
-class JAllocatorAnalysis implements AllocatorAnalysis {
-  /// Tag used for identifying serialized [JAllocatorAnalysis] objects in a
-  /// debugging data stream.
-  static const String tag = 'allocator-analysis';
-
-  // --csp and --fast-startup have different constraints to the generated code.
-  final Map<JField, ConstantValue> _fixedInitializers = {};
-
-  JAllocatorAnalysis._();
-
-  /// Deserializes a [JAllocatorAnalysis] object from [source].
-  factory JAllocatorAnalysis.readFromDataSource(
-      DataSource source, CompilerOptions options) {
-    source.begin(tag);
-    JAllocatorAnalysis analysis = new JAllocatorAnalysis._();
-    int fieldCount = source.readInt();
-    for (int i = 0; i < fieldCount; i++) {
-      JField field = source.readMember();
-      ConstantValue value = source.readConstant();
-      analysis._fixedInitializers[field] = value;
-    }
-    source.end(tag);
-    return analysis;
-  }
-
-  /// Serializes this [JAllocatorAnalysis] to [sink].
-  void writeToDataSink(DataSink sink) {
-    sink.begin(tag);
-    sink.writeInt(_fixedInitializers.length);
-    _fixedInitializers.forEach((JField field, ConstantValue value) {
-      sink.writeMember(field);
-      sink.writeConstant(value);
-    });
-    sink.end(tag);
-  }
-
-  static JAllocatorAnalysis from(KAllocatorAnalysis kAnalysis,
-      JsToFrontendMap map, CompilerOptions options) {
-    var result = JAllocatorAnalysis._();
-
-    kAnalysis._fixedInitializers.forEach((KField kField, ConstantValue value) {
-      // TODO(sra): Translate constant, but Null and these primitives do not
-      // need translating.
-      if (value.isNull || value.isInt || value.isBool || value.isString) {
-        JField jField = map.toBackendMember(kField);
-        if (jField != null) {
-          result._fixedInitializers[jField] = value;
-        }
-      }
-    });
-
-    return result;
-  }
-
-  bool get _isEnabled {
-    return true;
-  }
-  // TODO(sra): Add way to let injected fields be initialized to a constant in
-  // allocator.
-
-  bool isInitializedInAllocator(JField field) {
-    if (!_isEnabled) return false;
-    return _fixedInitializers[field] != null;
-  }
-
-  /// Return constant for a field initialized in allocator. Returns `null` for
-  /// fields not initialized in allocator.
-  ConstantValue initializerValue(JField field) {
-    assert(_isEnabled);
-    return _fixedInitializers[field];
-  }
-}
diff --git a/pkg/compiler/lib/src/js_backend/annotations.dart b/pkg/compiler/lib/src/js_backend/annotations.dart
index 5290143..f0c48f7 100644
--- a/pkg/compiler/lib/src/js_backend/annotations.dart
+++ b/pkg/compiler/lib/src/js_backend/annotations.dart
@@ -10,31 +10,10 @@
 import '../diagnostics/messages.dart';
 import '../elements/entities.dart';
 import '../kernel/dart2js_target.dart';
+import '../options.dart';
 import '../serialization/serialization.dart';
 import '../util/enumset.dart';
 
-/// Returns `true` if inference of parameter types is disabled for [element].
-bool _assumeDynamic(KElementEnvironment elementEnvironment,
-    KCommonElements commonElements, MemberEntity element) {
-  return _hasAnnotation(
-      elementEnvironment, element, commonElements.expectAssumeDynamicClass);
-}
-
-/// Returns `true` if [element] is annotated with [annotationClass].
-bool _hasAnnotation(KElementEnvironment elementEnvironment,
-    MemberEntity element, ClassEntity annotationClass) {
-  if (annotationClass == null) return false;
-  for (ConstantValue value in elementEnvironment.getMemberMetadata(element)) {
-    if (value.isConstructedObject) {
-      ConstructedConstantValue constructedConstant = value;
-      if (constructedConstant.type.element == annotationClass) {
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
 class PragmaAnnotation {
   final int _index;
   final String name;
@@ -52,9 +31,12 @@
     return _index;
   }
 
+  /// Tells the optimizing compiler to not inline the annotated method.
   static const PragmaAnnotation noInline =
       const PragmaAnnotation(0, 'noInline', forFunctionsOnly: true);
 
+  /// Tells the optimizing compiler to always inline the annotated method, if
+  /// possible.
   static const PragmaAnnotation tryInline =
       const PragmaAnnotation(1, 'tryInline', forFunctionsOnly: true);
 
@@ -62,24 +44,29 @@
       2, 'disableFinal',
       forFunctionsOnly: true, internalOnly: true);
 
-  static const PragmaAnnotation noElision = const PragmaAnnotation(
-      3, 'noElision',
-      forFieldsOnly: true, internalOnly: true);
+  static const PragmaAnnotation noElision =
+      const PragmaAnnotation(3, 'noElision');
 
+  /// Tells the optimizing compiler that the annotated method cannot throw.
+  /// Requires @pragma('dart2js:noInline') to function correctly.
   static const PragmaAnnotation noThrows = const PragmaAnnotation(4, 'noThrows',
       forFunctionsOnly: true, internalOnly: true);
 
+  /// Tells the optimizing compiler that the annotated method has no
+  /// side-effects. Allocations don't count as side-effects, since they can be
+  /// dropped without changing the semantics of the program.
+  ///
+  /// Requires @pragma('dart2js:noInline') to function correctly.
   static const PragmaAnnotation noSideEffects = const PragmaAnnotation(
       5, 'noSideEffects',
       forFunctionsOnly: true, internalOnly: true);
 
-  // TODO(johnniwinther): Remove this.
-  static const PragmaAnnotation trustTypeAnnotations = const PragmaAnnotation(
-      6, 'trustTypeAnnotations',
-      forFunctionsOnly: true, internalOnly: true);
-
+  /// Use this as metadata on method declarations to disable closed world
+  /// assumptions on parameters, effectively assuming that the runtime arguments
+  /// could be any value. Note that the constraints due to static types still
+  /// apply.
   static const PragmaAnnotation assumeDynamic = const PragmaAnnotation(
-      7, 'assumeDynamic',
+      6, 'assumeDynamic',
       forFunctionsOnly: true, internalOnly: true);
 
   static const List<PragmaAnnotation> values = [
@@ -89,12 +76,12 @@
     noElision,
     noThrows,
     noSideEffects,
-    trustTypeAnnotations,
     assumeDynamic,
   ];
 }
 
 Set<PragmaAnnotation> processMemberAnnotations(
+    CompilerOptions options,
     DiagnosticReporter reporter,
     KCommonElements commonElements,
     KElementEnvironment elementEnvironment,
@@ -102,12 +89,9 @@
     MemberEntity element) {
   EnumSet<PragmaAnnotation> values = new EnumSet<PragmaAnnotation>();
 
-  if (_assumeDynamic(elementEnvironment, commonElements, element)) {
-    values.add(PragmaAnnotation.assumeDynamic);
-  }
-
   LibraryEntity library = element.library;
-  bool platformAnnotationsAllowed = library.canonicalUri.scheme == 'dart' ||
+  bool platformAnnotationsAllowed = options.testMode ||
+      library.canonicalUri.scheme == 'dart' ||
       maybeEnableNative(library.canonicalUri);
 
   for (ConstantValue constantValue
@@ -117,73 +101,23 @@
     ClassEntity cls = value.type.element;
     assert(cls != null); // Unresolved classes null.
 
-    if (platformAnnotationsAllowed) {
-      if (cls == commonElements.forceInlineClass) {
-        values.add(PragmaAnnotation.tryInline);
-        if (element is! FunctionEntity) {
-          reporter.internalError(element,
-              "@TryInline() is only allowed in methods and constructors.");
-        }
-      } else if (cls == commonElements.noInlineClass) {
-        values.add(PragmaAnnotation.noInline);
-        if (element is! FunctionEntity) {
-          reporter.internalError(element,
-              "@NoInline() is only allowed in methods and constructors.");
-        }
-      } else if (cls == commonElements.noThrowsClass) {
-        values.add(PragmaAnnotation.noThrows);
-        bool isValid = true;
-        if (element is FunctionEntity) {
-          if (element.isTopLevel) {
-            isValid = true;
-          } else if (element.isStatic) {
-            isValid = true;
-          } else if (element is ConstructorEntity &&
-              element.isFactoryConstructor) {
-            isValid = true;
-          }
-        } else {
-          isValid = false;
-        }
-        if (!isValid) {
-          reporter.internalError(
-              element,
-              "@NoThrows() is currently limited to top-level"
-              " or static functions and factory constructors.");
-        }
-      } else if (cls == commonElements.noSideEffectsClass) {
-        values.add(PragmaAnnotation.noSideEffects);
-        if (element is! FunctionEntity) {
-          reporter.internalError(element,
-              "@NoSideEffects() is only allowed in methods and constructors.");
-        }
-      }
-    }
-
-    if (cls == commonElements.expectNoInlineClass) {
-      values.add(PragmaAnnotation.noInline);
-      if (element is! FunctionEntity) {
-        reporter.internalError(element,
-            "@NoInline() is only allowed in methods and constructors.");
-      }
-    } else if (cls == commonElements.metaNoInlineClass) {
+    if (cls == commonElements.metaNoInlineClass) {
       values.add(PragmaAnnotation.noInline);
       if (element is! FunctionEntity) {
         reporter.internalError(
-            element, "@noInline is only allowed in methods and constructors.");
+            element,
+            "@pragma('dart2js:noInline') is only allowed in methods "
+            "and constructors.");
       }
     } else if (cls == commonElements.metaTryInlineClass) {
       values.add(PragmaAnnotation.tryInline);
       if (element is! FunctionEntity) {
         reporter.internalError(
-            element, "@tryInline is only allowed in methods and constructors.");
+            element,
+            "@pragma('dart2js:tryInline') is only allowed in methods "
+            "and constructors.");
       }
     } else if (cls == commonElements.pragmaClass) {
-      // Recognize:
-      //
-      //     @pragma('dart2js:noInline')
-      //     @pragma('dart2js:tryInline')
-      //
       ConstantValue nameValue =
           value.fields[commonElements.pragmaClassNameField];
       if (nameValue == null || !nameValue.isString) continue;
@@ -236,19 +170,25 @@
 
   if (values.contains(PragmaAnnotation.tryInline) &&
       values.contains(PragmaAnnotation.noInline)) {
-    reporter.reportErrorMessage(element, MessageKind.GENERIC,
-        {'text': '@tryInline must not be used with @noInline.'});
+    reporter.reportErrorMessage(element, MessageKind.GENERIC, {
+      'text': "@pragma('dart2js:tryInline') must not be used with "
+          "@pragma('dart2js:noInline')."
+    });
     values.remove(PragmaAnnotation.tryInline);
   }
   if (values.contains(PragmaAnnotation.noThrows) &&
       !values.contains(PragmaAnnotation.noInline)) {
     reporter.internalError(
-        element, "@NoThrows() should always be combined with @noInline.");
+        element,
+        "@pragma('dart2js:noThrows') should always be combined with "
+        "@pragma('dart2js:noInline').");
   }
   if (values.contains(PragmaAnnotation.noSideEffects) &&
       !values.contains(PragmaAnnotation.noInline)) {
     reporter.internalError(
-        element, "@NoSideEffects() should always be combined with @noInline.");
+        element,
+        "@pragma('dart2js:noSideEffects') should always be combined with "
+        "@pragma('dart2js:noInline').");
   }
   annotationsDataBuilder.registerPragmaAnnotations(element, values);
   return new Set<PragmaAnnotation>.from(
@@ -263,14 +203,14 @@
   /// Serializes this [AnnotationsData] to [sink].
   void writeToDataSink(DataSink sink);
 
-  /// Returns `true` if [member] has an `@AssumeDynamic()` annotation.
+  /// Returns `true` if [member] has an `@pragma('dart2js:assumeDynamic')` annotation.
   bool hasAssumeDynamic(MemberEntity member);
 
-  /// Returns `true` if [member] has a `@NoInline()`, `@noInline`, or
+  /// Returns `true` if [member] has a `@pragma('dart2js:noInline')`, or
   /// `@pragma('dart2js:noInline')` annotation.
   bool hasNoInline(MemberEntity member);
 
-  /// Returns `true` if [member] has a `@ForceInline()`, `@tryInline`, or
+  /// Returns `true` if [member] has a `@pragma('dart2js:tryInline')`, or
   /// `@pragma('dart2js:tryInline')` annotation.
   bool hasTryInline(MemberEntity member);
 
@@ -278,7 +218,8 @@
   /// annotation.
   bool hasDisableFinal(MemberEntity member);
 
-  /// Returns `true` if [member] has a `@pragma('dart2js:noElision')` annotation.
+  /// Returns `true` if [member] has a `@pragma('dart2js:noElision')`
+  /// annotation.
   bool hasNoElision(MemberEntity member);
 
   /// Returns `true` if [member] has a `@NoThrows()` annotation.
@@ -287,18 +228,20 @@
   /// Returns `true` if [member] has a `@NoSideEffects()` annotation.
   bool hasNoSideEffects(MemberEntity member);
 
-  /// Calls [f] for all functions with a `@NoInline()`, `@noInline`, or
+  /// Calls [f] for all functions with a `@pragma('dart2js:noInline')`, or
   /// `@pragma('dart2js:noInline')` annotation.
   void forEachNoInline(void f(FunctionEntity function));
 
-  /// Calls [f] for all functions with a `@ForceInline()`, `@tryInline`, or
+  /// Calls [f] for all functions with a `@pragma('dart2js:tryInline')`, or
   /// `@pragma('dart2js:tryInline')` annotation.
   void forEachTryInline(void f(FunctionEntity function));
 
-  /// Calls [f] for all functions with a `@NoThrows()` annotation.
+  /// Calls [f] for all functions with a `@pragma('dart2js:noThrows')`
+  /// annotation.
   void forEachNoThrows(void f(FunctionEntity function));
 
-  /// Calls [f] for all functions with a `@NoSideEffects()` annotation.
+  /// Calls [f] for all functions with a `@pragma('dart2js:noSideEffects')`
+  /// annotation.
   void forEachNoSideEffects(void f(FunctionEntity function));
 }
 
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 5d868e8..6f44b97 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -12,7 +12,6 @@
 import '../common_elements.dart'
     show CommonElements, ElementEnvironment, JElementEnvironment;
 import '../compiler.dart' show Compiler;
-import '../constants/constant_system.dart';
 import '../deferred_load.dart' show DeferredLoadTask;
 import '../dump_info.dart' show DumpInfoTask;
 import '../elements/entities.dart';
@@ -43,7 +42,7 @@
     show ImpactStrategy, ImpactUseCase, WorldImpact, WorldImpactVisitor;
 import '../util/util.dart';
 import '../world.dart' show JClosedWorld;
-import 'allocator_analysis.dart';
+import 'field_analysis.dart';
 import 'annotations.dart';
 import 'backend_impact.dart';
 import 'backend_usage.dart';
@@ -351,7 +350,7 @@
   /// constructors for custom elements.
   CustomElementsCodegenAnalysis _customElementsCodegenAnalysis;
 
-  KAllocatorAnalysis _allocatorResolutionAnalysis;
+  KFieldAnalysis _fieldAnalysis;
 
   /// Support for classifying `noSuchMethod` implementations.
   NoSuchMethodRegistry noSuchMethodRegistry;
@@ -400,16 +399,11 @@
         this, compiler.measurer, sourceInformationStrategy);
   }
 
-  /// The [ConstantSystem] used to interpret compile-time constants for this
-  /// backend.
-  ConstantSystem get constantSystem => constants.constantSystem;
-
   DiagnosticReporter get reporter => compiler.reporter;
 
   ImpactCacheDeleter get impactCacheDeleter => compiler.impactCacheDeleter;
 
-  KAllocatorAnalysis get allocatorResolutionAnalysisForTesting =>
-      _allocatorResolutionAnalysis;
+  KFieldAnalysis get fieldAnalysisForTesting => _fieldAnalysis;
 
   /// Resolution support for generating table of interceptors and
   /// constructors for custom elements.
@@ -525,7 +519,7 @@
 
   /// Called when the resolution queue has been closed.
   void onResolutionEnd() {
-    frontendStrategy.annotationProcesser.processJsInteropAnnotations(
+    frontendStrategy.annotationProcessor.processJsInteropAnnotations(
         frontendStrategy.nativeBasicData, nativeDataBuilder);
   }
 
@@ -546,13 +540,11 @@
         compiler.frontendStrategy.createNativeClassFinder(nativeBasicData));
     _nativeDataBuilder = new NativeDataBuilderImpl(nativeBasicData);
     _customElementsResolutionAnalysis = new CustomElementsResolutionAnalysis(
-        constantSystem,
         elementEnvironment,
         commonElements,
         nativeBasicData,
         _backendUsageBuilder);
-    _allocatorResolutionAnalysis =
-        new KAllocatorAnalysis(compiler.frontendStrategy);
+    _fieldAnalysis = new KFieldAnalysis(compiler.frontendStrategy);
     ClassQueries classQueries = compiler.frontendStrategy.createClassQueries();
     ClassHierarchyBuilder classHierarchyBuilder =
         new ClassHierarchyBuilder(commonElements, classQueries);
@@ -587,7 +579,7 @@
             noSuchMethodRegistry,
             customElementsResolutionAnalysis,
             _nativeResolutionEnqueuer,
-            _allocatorResolutionAnalysis,
+            _fieldAnalysis,
             compiler.deferredLoadTask),
         compiler.frontendStrategy.createResolutionWorldBuilder(
             nativeBasicData,
@@ -595,7 +587,7 @@
             interceptorDataBuilder,
             _backendUsageBuilder,
             rtiNeedBuilder,
-            _allocatorResolutionAnalysis,
+            _fieldAnalysis,
             _nativeResolutionEnqueuer,
             noSuchMethodRegistry,
             annotationsDataBuilder,
@@ -607,7 +599,8 @@
             _nativeDataBuilder,
             annotationsDataBuilder,
             impactTransformer,
-            compiler.impactCache));
+            compiler.impactCache,
+            _fieldAnalysis));
   }
 
   /// Creates an [Enqueuer] for code generation specific to this backend.
@@ -620,10 +613,7 @@
     CommonElements commonElements = closedWorld.commonElements;
     BackendImpacts impacts = new BackendImpacts(commonElements);
     _customElementsCodegenAnalysis = new CustomElementsCodegenAnalysis(
-        constantSystem,
-        commonElements,
-        elementEnvironment,
-        closedWorld.nativeData);
+        commonElements, elementEnvironment, closedWorld.nativeData);
     _nativeCodegenEnqueuer = new NativeCodegenEnqueuer(
         compiler.options,
         elementEnvironment,
@@ -736,7 +726,7 @@
   /// been loaded.
   void setAnnotations(LibraryEntity library) {
     AnnotationProcessor processor =
-        compiler.frontendStrategy.annotationProcesser;
+        compiler.frontendStrategy.annotationProcessor;
     if (maybeEnableNative(library.canonicalUri)) {
       processor.extractNativeAnnotations(library);
     }
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index f553d9f..36d9600 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -298,6 +298,15 @@
     ]);
   }
 
+  BackendImpact _constantSetLiteral;
+
+  BackendImpact get constantSetLiteral =>
+      _constantSetLiteral ??= new BackendImpact(instantiatedClasses: [
+        _commonElements.constSetLiteralClass,
+      ], otherImpacts: [
+        constantMapLiteral
+      ]);
+
   BackendImpact _symbolConstructor;
 
   BackendImpact get symbolConstructor {
@@ -570,6 +579,15 @@
         ]);
   }
 
+  BackendImpact _setClass;
+
+  BackendImpact get setClass => _setClass ??= new BackendImpact(globalClasses: [
+        // The backend will use a literal list to initialize the entries
+        // of the set.
+        _commonElements.listClass,
+        _commonElements.setLiteralClass,
+      ]);
+
   BackendImpact _boundClosureClass;
 
   BackendImpact get boundClosureClass {
@@ -601,6 +619,16 @@
     ]);
   }
 
+  BackendImpact _setLiteralClass;
+
+  BackendImpact get setLiteralClass =>
+      _setLiteralClass ??= new BackendImpact(globalUses: [
+        _commonElements.setLiteralConstructor,
+        _commonElements.setLiteralConstructorEmpty,
+        _commonElements.setLiteralUntypedMaker,
+        _commonElements.setLiteralUntypedEmptyMaker,
+      ]);
+
   BackendImpact _closureClass;
 
   BackendImpact get closureClass {
diff --git a/pkg/compiler/lib/src/js_backend/backend_usage.dart b/pkg/compiler/lib/src/js_backend/backend_usage.dart
index 39612fd..ed86add 100644
--- a/pkg/compiler/lib/src/js_backend/backend_usage.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_usage.dart
@@ -165,6 +165,8 @@
       return true;
     } else if (element == _commonElements.listClass ||
         element == _commonElements.mapLiteralClass ||
+        element == _commonElements.setLiteralClass ||
+        element == _commonElements.unmodifiableSetClass ||
         element == _commonElements.functionClass ||
         element == _commonElements.stringClass) {
       // TODO(johnniwinther): Avoid these.
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index e705bb1..86cbeb5 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -4,6 +4,7 @@
 
 import '../common.dart';
 import '../common_elements.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
@@ -13,8 +14,7 @@
 import '../js_emitter/code_emitter_task.dart';
 import '../options.dart';
 import '../universe/codegen_world_builder.dart';
-import 'allocator_analysis.dart' show JAllocatorAnalysis;
-import 'constant_system_javascript.dart';
+import 'field_analysis.dart' show JFieldAnalysis;
 import 'js_backend.dart';
 import 'runtime_types.dart';
 
@@ -38,7 +38,7 @@
   final CodegenWorldBuilder _worldBuilder;
   final RuntimeTypesNeed _rtiNeed;
   final RuntimeTypesEncoder _rtiEncoder;
-  final JAllocatorAnalysis _allocatorAnalysis;
+  final JFieldAnalysis _fieldAnalysis;
   final CodeEmitterTask _task;
   final _ConstantReferenceGenerator constantReferenceGenerator;
   final _ConstantListGenerator makeConstantList;
@@ -52,7 +52,7 @@
       this._worldBuilder,
       this._rtiNeed,
       this._rtiEncoder,
-      this._allocatorAnalysis,
+      this._fieldAnalysis,
       this._task,
       this.constantReferenceGenerator,
       this.makeConstantList);
@@ -184,12 +184,37 @@
   }
 
   @override
-  jsAst.Expression visitMap(JavaScriptMapConstant constant, [_]) {
+  jsAst.Expression visitSet(constant_system.JavaScriptSetConstant constant,
+      [_]) {
+    InterfaceType sourceType = constant.type;
+    ClassEntity classElement = sourceType.element;
+    String className = classElement.name;
+    if (!identical(classElement, _commonElements.constSetLiteralClass)) {
+      failedAt(
+          classElement, "Compiler encoutered unexpected set class $className");
+    }
+
+    List<jsAst.Expression> arguments = <jsAst.Expression>[
+      constantReferenceGenerator(constant.entries),
+    ];
+
+    if (_rtiNeed.classNeedsTypeArguments(classElement)) {
+      arguments.add(_reifiedTypeArguments(constant, sourceType.typeArguments));
+    }
+
+    jsAst.Expression constructor = _emitter.constructorAccess(classElement);
+    return new jsAst.New(constructor, arguments);
+  }
+
+  @override
+  jsAst.Expression visitMap(constant_system.JavaScriptMapConstant constant,
+      [_]) {
     jsAst.Expression jsMap() {
       List<jsAst.Property> properties = <jsAst.Property>[];
       for (int i = 0; i < constant.length; i++) {
         StringConstantValue key = constant.keys[i];
-        if (key.stringValue == JavaScriptMapConstant.PROTO_PROPERTY) {
+        if (key.stringValue ==
+            constant_system.JavaScriptMapConstant.PROTO_PROPERTY) {
           continue;
         }
 
@@ -226,17 +251,21 @@
     _worldBuilder.forEachInstanceField(classElement,
         (ClassEntity enclosing, FieldEntity field, {bool isElided}) {
       if (isElided) return;
-      if (field.name == JavaScriptMapConstant.LENGTH_NAME) {
+      if (field.name == constant_system.JavaScriptMapConstant.LENGTH_NAME) {
         arguments
             .add(new jsAst.LiteralNumber('${constant.keyList.entries.length}'));
-      } else if (field.name == JavaScriptMapConstant.JS_OBJECT_NAME) {
+      } else if (field.name ==
+          constant_system.JavaScriptMapConstant.JS_OBJECT_NAME) {
         arguments.add(jsMap());
-      } else if (field.name == JavaScriptMapConstant.KEYS_NAME) {
+      } else if (field.name ==
+          constant_system.JavaScriptMapConstant.KEYS_NAME) {
         arguments.add(constantReferenceGenerator(constant.keyList));
-      } else if (field.name == JavaScriptMapConstant.PROTO_VALUE) {
+      } else if (field.name ==
+          constant_system.JavaScriptMapConstant.PROTO_VALUE) {
         assert(constant.protoValue != null);
         arguments.add(constantReferenceGenerator(constant.protoValue));
-      } else if (field.name == JavaScriptMapConstant.JS_DATA_NAME) {
+      } else if (field.name ==
+          constant_system.JavaScriptMapConstant.JS_DATA_NAME) {
         arguments.add(jsGeneralMap());
       } else {
         failedAt(field,
@@ -244,11 +273,12 @@
       }
       emittedArgumentCount++;
     });
-    if ((className == JavaScriptMapConstant.DART_STRING_CLASS &&
+    if ((className == constant_system.JavaScriptMapConstant.DART_STRING_CLASS &&
             emittedArgumentCount != 3) ||
-        (className == JavaScriptMapConstant.DART_PROTO_CLASS &&
+        (className == constant_system.JavaScriptMapConstant.DART_PROTO_CLASS &&
             emittedArgumentCount != 4) ||
-        (className == JavaScriptMapConstant.DART_GENERAL_CLASS &&
+        (className ==
+                constant_system.JavaScriptMapConstant.DART_GENERAL_CLASS &&
             emittedArgumentCount != 1)) {
       failedAt(classElement,
           "Compiler and ${className} disagree on number of fields.");
@@ -322,7 +352,7 @@
     _worldBuilder.forEachInstanceField(element, (_, FieldEntity field,
         {bool isElided}) {
       if (isElided) return;
-      if (!_allocatorAnalysis.isInitializedInAllocator(field)) {
+      if (!_fieldAnalysis.getFieldData(field).isInitializedInAllocator) {
         fields.add(constantReferenceGenerator(constant.fields[field]));
       }
     });
diff --git a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
index 6b9de6a..1335b2e 100644
--- a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
@@ -4,10 +4,7 @@
 
 import '../compile_time_constants.dart';
 import '../compiler.dart' show Compiler;
-import '../constants/constant_system.dart';
-import '../constant_system_dart.dart';
 import '../elements/entities.dart';
-import 'constant_system_javascript.dart';
 
 /// [ConstantCompilerTask] for compilation of constants for the JavaScript
 /// backend.
@@ -17,18 +14,13 @@
 /// [DartConstantCompiler] for the frontend interpretation of the constants and
 /// to a [JavaScriptConstantCompiler] for the backend interpretation.
 class JavaScriptConstantTask extends ConstantCompilerTask {
-  ConstantSystem dartConstantSystem;
   JavaScriptConstantCompiler jsConstantCompiler;
 
   JavaScriptConstantTask(Compiler compiler)
-      : this.dartConstantSystem = const DartConstantSystem(),
-        this.jsConstantCompiler = new JavaScriptConstantCompiler(),
+      : this.jsConstantCompiler = new JavaScriptConstantCompiler(),
         super(compiler.measurer);
 
   String get name => 'ConstantHandler';
-
-  @override
-  ConstantSystem get constantSystem => dartConstantSystem;
 }
 
 /// The [JavaScriptConstantCompiler] is used to keep track of compile-time
@@ -41,8 +33,6 @@
 
   JavaScriptConstantCompiler();
 
-  ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
-
   @override
   void registerLazyStatic(FieldEntity element) {
     lazyStatics.add(element);
diff --git a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
deleted file mode 100644
index 21eabbf..0000000
--- a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
+++ /dev/null
@@ -1,445 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.constant_system.js;
-
-import '../constant_system_dart.dart';
-import '../constants/constant_system.dart';
-import '../constants/values.dart';
-import '../common_elements.dart' show CommonElements;
-import '../elements/types.dart';
-import '../elements/entities.dart';
-
-class JavaScriptBitNotOperation extends BitNotOperation {
-  const JavaScriptBitNotOperation();
-
-  ConstantValue fold(ConstantValue constant) {
-    if (JavaScriptConstantSystem.only.isInt(constant)) {
-      // In JavaScript we don't check for -0 and treat it as if it was zero.
-      if (constant.isMinusZero) {
-        constant = DART_CONSTANT_SYSTEM.createInt(BigInt.zero);
-      }
-      IntConstantValue intConstant = constant;
-      // We convert the result of bit-operations to 32 bit unsigned integers.
-      return JavaScriptConstantSystem.only.createInt32(~intConstant.intValue);
-    }
-    return null;
-  }
-}
-
-/// In JavaScript we truncate the result to an unsigned 32 bit integer. Also, -0
-/// is treated as if it was the integer 0.
-class JavaScriptBinaryBitOperation implements BinaryOperation {
-  final BinaryBitOperation dartBitOperation;
-
-  const JavaScriptBinaryBitOperation(this.dartBitOperation);
-
-  String get name => dartBitOperation.name;
-
-  ConstantValue fold(ConstantValue left, ConstantValue right) {
-    // In JavaScript we don't check for -0 and treat it as if it was zero.
-    if (left.isMinusZero) {
-      left = DART_CONSTANT_SYSTEM.createInt(BigInt.zero);
-    }
-    if (right.isMinusZero) {
-      right = DART_CONSTANT_SYSTEM.createInt(BigInt.zero);
-    }
-    IntConstantValue result = dartBitOperation.fold(left, right);
-    if (result != null) {
-      // We convert the result of bit-operations to 32 bit unsigned integers.
-      return JavaScriptConstantSystem.only.createInt32(result.intValue);
-    }
-    return result;
-  }
-
-  apply(left, right) => dartBitOperation.apply(left, right);
-}
-
-class JavaScriptShiftRightOperation extends JavaScriptBinaryBitOperation {
-  const JavaScriptShiftRightOperation() : super(const ShiftRightOperation());
-
-  ConstantValue fold(ConstantValue left, ConstantValue right) {
-    // Truncate the input value to 32 bits if necessary.
-    if (left.isInt) {
-      IntConstantValue intConstant = left;
-      BigInt value = intConstant.intValue;
-      BigInt truncatedValue = value & JavaScriptConstantSystem.only.BITS32;
-      if (value < BigInt.zero) {
-        // Sign-extend if the input was negative. The current semantics don't
-        // make much sense, since we only look at bit 31.
-        // TODO(floitsch): we should treat the input to right shifts as
-        // unsigned.
-
-        // A 32 bit complement-two value x can be computed by:
-        //    x_u - 2^32 (where x_u is its unsigned representation).
-        // Example: 0xFFFFFFFF - 0x100000000 => -1.
-        // We simply and with the sign-bit and multiply by two. If the sign-bit
-        // was set, then the result is 0. Otherwise it will become 2^32.
-        final BigInt SIGN_BIT = new BigInt.from(0x80000000);
-        truncatedValue -= BigInt.two * (truncatedValue & SIGN_BIT);
-      }
-      if (value != truncatedValue) {
-        left = DART_CONSTANT_SYSTEM.createInt(truncatedValue);
-      }
-    }
-    return super.fold(left, right);
-  }
-}
-
-class JavaScriptNegateOperation implements UnaryOperation {
-  final NegateOperation dartNegateOperation = const NegateOperation();
-
-  const JavaScriptNegateOperation();
-
-  String get name => dartNegateOperation.name;
-
-  ConstantValue fold(ConstantValue constant) {
-    if (constant.isInt) {
-      IntConstantValue intConstant = constant;
-      if (intConstant.intValue == BigInt.zero) {
-        return JavaScriptConstantSystem.only.createDouble(-0.0);
-      }
-    }
-    return dartNegateOperation.fold(constant);
-  }
-}
-
-class JavaScriptAddOperation implements BinaryOperation {
-  final _addOperation = const AddOperation();
-  String get name => _addOperation.name;
-
-  const JavaScriptAddOperation();
-
-  ConstantValue fold(ConstantValue left, ConstantValue right) {
-    ConstantValue result = _addOperation.fold(left, right);
-    if (result != null && result.isNum) {
-      return JavaScriptConstantSystem.only.convertToJavaScriptConstant(result);
-    }
-    return result;
-  }
-
-  apply(left, right) => _addOperation.apply(left, right);
-}
-
-class JavaScriptRemainderOperation extends ArithmeticNumOperation {
-  String get name => 'remainder';
-
-  const JavaScriptRemainderOperation();
-
-  BigInt foldInts(BigInt left, BigInt right) {
-    if (right == BigInt.zero) return null;
-    return left.remainder(right);
-  }
-
-  num foldNums(num left, num right) => left.remainder(right);
-  apply(left, right) => left.remainder(right);
-}
-
-class JavaScriptBinaryArithmeticOperation implements BinaryOperation {
-  final BinaryOperation dartArithmeticOperation;
-
-  const JavaScriptBinaryArithmeticOperation(this.dartArithmeticOperation);
-
-  String get name => dartArithmeticOperation.name;
-
-  ConstantValue fold(ConstantValue left, ConstantValue right) {
-    ConstantValue result = dartArithmeticOperation.fold(left, right);
-    if (result == null) return result;
-    return JavaScriptConstantSystem.only.convertToJavaScriptConstant(result);
-  }
-
-  apply(left, right) => dartArithmeticOperation.apply(left, right);
-}
-
-class JavaScriptIdentityOperation implements BinaryOperation {
-  final IdentityOperation dartIdentityOperation = const IdentityOperation();
-
-  const JavaScriptIdentityOperation();
-
-  String get name => dartIdentityOperation.name;
-
-  BoolConstantValue fold(ConstantValue left, ConstantValue right) {
-    BoolConstantValue result = dartIdentityOperation.fold(left, right);
-    if (result == null || result.boolValue) return result;
-    // In JavaScript -0.0 === 0 and all doubles are equal to their integer
-    // values. Furthermore NaN !== NaN.
-    if (left.isInt && right.isInt) {
-      IntConstantValue leftInt = left;
-      IntConstantValue rightInt = right;
-      return new BoolConstantValue(leftInt.intValue == rightInt.intValue);
-    }
-    if (left.isNum && right.isNum) {
-      NumConstantValue leftNum = left;
-      NumConstantValue rightNum = right;
-      double leftDouble = leftNum.doubleValue;
-      double rightDouble = rightNum.doubleValue;
-      return new BoolConstantValue(leftDouble == rightDouble);
-    }
-    return result;
-  }
-
-  apply(left, right) => identical(left, right);
-}
-
-class JavaScriptRoundOperation implements UnaryOperation {
-  const JavaScriptRoundOperation();
-  String get name => DART_CONSTANT_SYSTEM.round.name;
-  ConstantValue fold(ConstantValue constant) {
-    // Be careful to round() only values that do not throw on either the host or
-    // target platform.
-    ConstantValue tryToRound(double value) {
-      // Due to differences between browsers, only 'round' easy cases. Avoid
-      // cases where nudging the value up or down changes the answer.
-      // 13 digits is safely within the ~15 digit precision of doubles.
-      const severalULP = 0.0000000000001;
-      // Use 'roundToDouble()' to avoid exceptions on rounding the nudged value.
-      double rounded = value.roundToDouble();
-      double rounded1 = (value * (1.0 + severalULP)).roundToDouble();
-      double rounded2 = (value * (1.0 - severalULP)).roundToDouble();
-      if (rounded != rounded1 || rounded != rounded2) return null;
-      return JavaScriptConstantSystem.only.convertToJavaScriptConstant(
-          new IntConstantValue(new BigInt.from(value.round())));
-    }
-
-    if (constant.isInt) {
-      IntConstantValue intConstant = constant;
-      double value = intConstant.intValue.toDouble();
-      if (value >= -double.maxFinite && value <= double.maxFinite) {
-        return tryToRound(value);
-      }
-    }
-    if (constant.isDouble) {
-      DoubleConstantValue doubleConstant = constant;
-      double value = doubleConstant.doubleValue;
-      // NaN and infinities will throw.
-      if (value.isNaN) return null;
-      if (value.isInfinite) return null;
-      return tryToRound(value);
-    }
-    return null;
-  }
-}
-
-/// Constant system following the semantics for Dart code that has been
-/// compiled to JavaScript.
-class JavaScriptConstantSystem extends ConstantSystem {
-  final BITS32 = new BigInt.from(0xFFFFFFFF);
-
-  final add = const JavaScriptAddOperation();
-  final bitAnd = const JavaScriptBinaryBitOperation(const BitAndOperation());
-  final bitNot = const JavaScriptBitNotOperation();
-  final bitOr = const JavaScriptBinaryBitOperation(const BitOrOperation());
-  final bitXor = const JavaScriptBinaryBitOperation(const BitXorOperation());
-  final booleanAnd = const BooleanAndOperation();
-  final booleanOr = const BooleanOrOperation();
-  final divide =
-      const JavaScriptBinaryArithmeticOperation(const DivideOperation());
-  final equal = const EqualsOperation();
-  final greaterEqual = const GreaterEqualOperation();
-  final greater = const GreaterOperation();
-  final identity = const JavaScriptIdentityOperation();
-  final ifNull = const IfNullOperation();
-  final lessEqual = const LessEqualOperation();
-  final less = const LessOperation();
-  final modulo =
-      const JavaScriptBinaryArithmeticOperation(const ModuloOperation());
-  final multiply =
-      const JavaScriptBinaryArithmeticOperation(const MultiplyOperation());
-  final negate = const JavaScriptNegateOperation();
-  final not = const NotOperation();
-  final remainder = const JavaScriptRemainderOperation();
-  final shiftLeft =
-      const JavaScriptBinaryBitOperation(const ShiftLeftOperation());
-  final shiftRight = const JavaScriptShiftRightOperation();
-  final subtract =
-      const JavaScriptBinaryArithmeticOperation(const SubtractOperation());
-  final truncatingDivide = const JavaScriptBinaryArithmeticOperation(
-      const TruncatingDivideOperation());
-  final codeUnitAt = const CodeUnitAtRuntimeOperation();
-  final round = const JavaScriptRoundOperation();
-  final abs = const UnfoldedUnaryOperation('abs');
-
-  static final JavaScriptConstantSystem only =
-      new JavaScriptConstantSystem._internal();
-
-  JavaScriptConstantSystem._internal();
-
-  /// Returns true if [value] will turn into NaN or infinity
-  /// at runtime.
-  bool integerBecomesNanOrInfinity(BigInt value) {
-    double doubleValue = value.toDouble();
-    return doubleValue.isNaN || doubleValue.isInfinite;
-  }
-
-  NumConstantValue convertToJavaScriptConstant(NumConstantValue constant) {
-    if (constant.isInt) {
-      IntConstantValue intConstant = constant;
-      BigInt intValue = intConstant.intValue;
-      if (integerBecomesNanOrInfinity(intValue)) {
-        return new DoubleConstantValue(intValue.toDouble());
-      }
-      // If the integer loses precision with JavaScript numbers, use
-      // the floored version JavaScript will use.
-      BigInt floorValue = new BigInt.from(intValue.toDouble());
-      if (floorValue != intValue) {
-        return new IntConstantValue(floorValue);
-      }
-    } else if (constant.isDouble) {
-      DoubleConstantValue doubleResult = constant;
-      double doubleValue = doubleResult.doubleValue;
-      if (!doubleValue.isInfinite &&
-          !doubleValue.isNaN &&
-          !constant.isMinusZero) {
-        double truncated = doubleValue.truncateToDouble();
-        if (truncated == doubleValue) {
-          return new IntConstantValue(new BigInt.from(truncated));
-        }
-      }
-    }
-    return constant;
-  }
-
-  @override
-  NumConstantValue createInt(BigInt i) {
-    return convertToJavaScriptConstant(new IntConstantValue(i));
-  }
-
-  NumConstantValue createInt32(BigInt i) => new IntConstantValue(i & BITS32);
-  NumConstantValue createDouble(double d) =>
-      convertToJavaScriptConstant(new DoubleConstantValue(d));
-  StringConstantValue createString(String string) {
-    return new StringConstantValue(string);
-  }
-
-  BoolConstantValue createBool(bool value) => new BoolConstantValue(value);
-  NullConstantValue createNull() => new NullConstantValue();
-
-  @override
-  ListConstantValue createList(InterfaceType type, List<ConstantValue> values) {
-    return new ListConstantValue(type, values);
-  }
-
-  @override
-  ConstantValue createType(CommonElements commonElements, DartType type) {
-    InterfaceType instanceType = commonElements.typeLiteralType;
-    return new TypeConstantValue(type, instanceType);
-  }
-
-  // Integer checks report true for -0.0, INFINITY, and -INFINITY.  At
-  // runtime an 'X is int' check is implemented as:
-  //
-  // typeof(X) === "number" && Math.floor(X) === X
-  //
-  // We consistently match that runtime semantics at compile time as well.
-  bool isInt(ConstantValue constant) {
-    return constant.isInt ||
-        constant.isMinusZero ||
-        constant.isPositiveInfinity ||
-        constant.isNegativeInfinity;
-  }
-
-  bool isDouble(ConstantValue constant) =>
-      constant.isDouble && !constant.isMinusZero;
-  bool isString(ConstantValue constant) => constant.isString;
-  bool isBool(ConstantValue constant) => constant.isBool;
-  bool isNull(ConstantValue constant) => constant.isNull;
-
-  bool isSubtype(DartTypes types, DartType s, DartType t) {
-    // At runtime, an integer is both an integer and a double: the
-    // integer type check is Math.floor, which will return true only
-    // for real integers, and our double type check is 'typeof number'
-    // which will return true for both integers and doubles.
-    if (s == types.commonElements.intType &&
-        t == types.commonElements.doubleType) {
-      return true;
-    }
-    return types.isSubtype(s, t);
-  }
-
-  MapConstantValue createMap(
-      CommonElements commonElements,
-      InterfaceType sourceType,
-      List<ConstantValue> keys,
-      List<ConstantValue> values) {
-    bool onlyStringKeys = true;
-    ConstantValue protoValue = null;
-    for (int i = 0; i < keys.length; i++) {
-      dynamic key = keys[i];
-      if (key.isString) {
-        if (key.stringValue == JavaScriptMapConstant.PROTO_PROPERTY) {
-          protoValue = values[i];
-        }
-      } else {
-        onlyStringKeys = false;
-        // Don't handle __proto__ values specially in the general map case.
-        protoValue = null;
-        break;
-      }
-    }
-
-    bool hasProtoKey = (protoValue != null);
-    InterfaceType keysType;
-    if (sourceType.treatAsRaw) {
-      keysType = commonElements.listType();
-    } else {
-      keysType = commonElements.listType(sourceType.typeArguments.first);
-    }
-    ListConstantValue keysList = new ListConstantValue(keysType, keys);
-    InterfaceType type = commonElements.getConstantMapTypeFor(sourceType,
-        hasProtoKey: hasProtoKey, onlyStringKeys: onlyStringKeys);
-    return new JavaScriptMapConstant(
-        type, keysList, values, protoValue, onlyStringKeys);
-  }
-
-  @override
-  ConstantValue createSymbol(CommonElements commonElements, String text) {
-    InterfaceType type = commonElements.symbolImplementationType;
-    FieldEntity field = commonElements.symbolField;
-    ConstantValue argument = createString(text);
-    // TODO(johnniwinther): Use type arguments when all uses no longer expect
-    // a [FieldElement].
-    var fields = <FieldEntity, ConstantValue>{field: argument};
-    return new ConstructedConstantValue(type, fields);
-  }
-}
-
-class JavaScriptMapConstant extends MapConstantValue {
-  /// The [PROTO_PROPERTY] must not be used as normal property in any JavaScript
-  /// object. It would change the prototype chain.
-  static const String PROTO_PROPERTY = "__proto__";
-
-  /// The dart class implementing constant map literals.
-  static const String DART_CLASS = "ConstantMap";
-  static const String DART_STRING_CLASS = "ConstantStringMap";
-  static const String DART_PROTO_CLASS = "ConstantProtoMap";
-  static const String DART_GENERAL_CLASS = "GeneralConstantMap";
-  static const String LENGTH_NAME = "_length";
-  static const String JS_OBJECT_NAME = "_jsObject";
-  static const String KEYS_NAME = "_keys";
-  static const String PROTO_VALUE = "_protoValue";
-  static const String JS_DATA_NAME = "_jsData";
-
-  final ListConstantValue keyList;
-  final ConstantValue protoValue;
-  final bool onlyStringKeys;
-
-  JavaScriptMapConstant(InterfaceType type, ListConstantValue keyList,
-      List<ConstantValue> values, this.protoValue, this.onlyStringKeys)
-      : this.keyList = keyList,
-        super(type, keyList.entries, values);
-  bool get isMap => true;
-
-  List<ConstantValue> getDependencies() {
-    List<ConstantValue> result = <ConstantValue>[];
-    if (onlyStringKeys) {
-      result.add(keyList);
-    } else {
-      // Add the keys individually to avoid generating an unused list constant
-      // for the keys.
-      result.addAll(keys);
-    }
-    result.addAll(values);
-    return result;
-  }
-}
diff --git a/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart b/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
index 79a4453..a3c61f7 100644
--- a/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import '../common_elements.dart';
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
@@ -84,13 +84,12 @@
   final CustomElementsAnalysisJoin join;
 
   CustomElementsResolutionAnalysis(
-      ConstantSystem constantSystem,
       ElementEnvironment elementEnvironment,
       CommonElements commonElements,
       NativeBasicData nativeData,
       BackendUsageBuilder backendUsageBuilder)
       : join = new CustomElementsAnalysisJoin(
-            constantSystem, elementEnvironment, commonElements, nativeData,
+            elementEnvironment, commonElements, nativeData,
             backendUsageBuilder: backendUsageBuilder),
         super(elementEnvironment, commonElements, nativeData) {
     // TODO(sra): Remove this work-around.  We should mark allClassesSelected in
@@ -120,13 +119,10 @@
 class CustomElementsCodegenAnalysis extends CustomElementsAnalysisBase {
   final CustomElementsAnalysisJoin join;
 
-  CustomElementsCodegenAnalysis(
-      ConstantSystem constantSystem,
-      CommonElements commonElements,
-      ElementEnvironment elementEnvironment,
-      NativeBasicData nativeData)
+  CustomElementsCodegenAnalysis(CommonElements commonElements,
+      ElementEnvironment elementEnvironment, NativeBasicData nativeData)
       : join = new CustomElementsAnalysisJoin(
-            constantSystem, elementEnvironment, commonElements, nativeData),
+            elementEnvironment, commonElements, nativeData),
         super(elementEnvironment, commonElements, nativeData) {
     // TODO(sra): Remove this work-around.  We should mark allClassesSelected in
     // both joins only when we see a construct generating an unknown [Type] but
@@ -149,7 +145,6 @@
 }
 
 class CustomElementsAnalysisJoin {
-  final ConstantSystem _constantSystem;
   final ElementEnvironment _elementEnvironment;
   final CommonElements _commonElements;
   final NativeBasicData _nativeData;
@@ -175,8 +170,8 @@
   // ClassesOutput: classes requiring metadata.
   final Set<ClassEntity> activeClasses = new Set<ClassEntity>();
 
-  CustomElementsAnalysisJoin(this._constantSystem, this._elementEnvironment,
-      this._commonElements, this._nativeData,
+  CustomElementsAnalysisJoin(
+      this._elementEnvironment, this._commonElements, this._nativeData,
       {BackendUsageBuilder backendUsageBuilder})
       : this._backendUsageBuilder = backendUsageBuilder,
         this.forResolution = backendUsageBuilder != null;
@@ -217,7 +212,7 @@
 
   TypeConstantValue _makeTypeConstant(ClassEntity cls) {
     DartType type = _elementEnvironment.getRawType(cls);
-    return _constantSystem.createType(_commonElements, type);
+    return constant_system.createType(_commonElements, type);
   }
 
   List<ConstructorEntity> computeEscapingConstructors(ClassEntity cls) {
diff --git a/pkg/compiler/lib/src/js_backend/field_analysis.dart b/pkg/compiler/lib/src/js_backend/field_analysis.dart
new file mode 100644
index 0000000..41477f0
--- /dev/null
+++ b/pkg/compiler/lib/src/js_backend/field_analysis.dart
@@ -0,0 +1,444 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+
+import '../constants/values.dart';
+import '../elements/entities.dart';
+import '../ir/scope_visitor.dart';
+import '../js_model/elements.dart' show JField;
+import '../js_model/js_world_builder.dart';
+import '../kernel/element_map.dart';
+import '../kernel/kernel_strategy.dart';
+import '../kernel/kelements.dart' show KClass, KField, KConstructor;
+import '../options.dart';
+import '../serialization/serialization.dart';
+import '../universe/member_usage.dart';
+import '../world.dart';
+
+abstract class FieldAnalysis {}
+
+/// AllocatorAnalysis
+///
+/// Analysis to determine features of the allocator functions. The allocator
+/// function takes parameters for each field initializer and initializes the
+/// fields.  Parameters may be omitted if the initializer is always the same
+/// constant value.  How the allocator is emitted will determine what kind of
+/// constants can be handled.  The initial implementation only permits `null`.
+
+// TODO(sra): Analysis to determine field order. Current field order is
+// essentially declaration order, subclass first. We can reorder fields so that
+// fields initialized with the same constant are together to allow chained
+// initialization. Fields of a class and superclass can be reordered to allow
+// chaining, e.g.
+//
+//     this.x = this.z = null;
+//
+class KFieldAnalysis implements FieldAnalysis {
+  final KernelToElementMap _elementMap;
+
+  final Map<KClass, ClassData> _classData = {};
+  final Map<KField, StaticFieldData> _staticFieldData = {};
+
+  KFieldAnalysis(KernelFrontEndStrategy kernelStrategy)
+      : _elementMap = kernelStrategy.elementMap;
+
+  // Register class during resolution. Use simple syntactic analysis to find
+  // null-initialized fields.
+  void registerInstantiatedClass(KClass class_) {
+    ir.Class classNode = _elementMap.getClassNode(class_);
+
+    List<KConstructor> constructors = [];
+    Map<KField, AllocatorData> fieldData = {};
+    for (ir.Field field in classNode.fields) {
+      if (!field.isInstanceMember) continue;
+
+      FieldEntity fieldElement = _elementMap.getField(field);
+      ir.Expression expression = field.initializer;
+      ConstantValue value = _elementMap.getConstantValue(expression,
+          requireConstant: false, implicitNull: true);
+      if (value != null && value.isConstant) {
+        fieldData[fieldElement] = new AllocatorData(value);
+      }
+    }
+
+    for (ir.Constructor constructor in classNode.constructors) {
+      KConstructor constructorElement = _elementMap.getConstructor(constructor);
+      constructors.add(constructorElement);
+      for (ir.Initializer initializer in constructor.initializers) {
+        if (initializer is ir.FieldInitializer) {
+          AllocatorData data =
+              fieldData[_elementMap.getField(initializer.field)];
+          if (data == null) {
+            // TODO(johnniwinther): Support initializers with side-effects?
+
+            // The field has a non-constant initializer.
+            continue;
+          }
+
+          Initializer initializerValue = const Initializer.complex();
+          ir.Expression value = initializer.value;
+          ConstantValue constantValue = _elementMap.getConstantValue(value,
+              requireConstant: false, implicitNull: true);
+          if (constantValue != null && constantValue.isConstant) {
+            initializerValue = new Initializer.direct(constantValue);
+          } else if (value is ir.VariableGet) {
+            ir.VariableDeclaration parameter = value.variable;
+            int position =
+                constructor.function.positionalParameters.indexOf(parameter);
+            if (position != -1) {
+              if (position >= constructor.function.requiredParameterCount) {
+                constantValue = _elementMap.getConstantValue(
+                    parameter.initializer,
+                    requireConstant: false,
+                    implicitNull: true);
+                if (constantValue != null && constantValue.isConstant) {
+                  initializerValue =
+                      new Initializer.positional(position, constantValue);
+                }
+              }
+            } else {
+              position =
+                  constructor.function.namedParameters.indexOf(parameter);
+              if (position != -1) {
+                constantValue = _elementMap.getConstantValue(
+                    parameter.initializer,
+                    requireConstant: false,
+                    implicitNull: true);
+                if (constantValue != null && constantValue.isConstant) {
+                  initializerValue =
+                      new Initializer.named(parameter.name, constantValue);
+                }
+              }
+            }
+          }
+          data.initializers[constructorElement] = initializerValue;
+        }
+      }
+    }
+    _classData[class_] = new ClassData(constructors, fieldData);
+  }
+
+  void registerStaticField(KField field, InitializerComplexity complexity) {
+    ir.Field node = _elementMap.getMemberNode(field);
+    ir.Expression expression = node.initializer;
+    ConstantValue value = _elementMap.getConstantValue(expression,
+        requireConstant: node.isConst, implicitNull: true);
+    if (value != null && !value.isConstant) {
+      value = null;
+    }
+    // TODO(johnniwinther): Remove evaluation of constant when [complexity]
+    // holds the constant literal from CFE.
+    _staticFieldData[field] = new StaticFieldData(value, complexity);
+  }
+
+  AllocatorData getAllocatorDataForTesting(KField field) {
+    return _classData[field.enclosingClass].fieldData[field];
+  }
+
+  StaticFieldData getStaticFieldDataForTesting(KField field) {
+    return _staticFieldData[field];
+  }
+}
+
+class ClassData {
+  final List<KConstructor> constructors;
+  final Map<KField, AllocatorData> fieldData;
+
+  ClassData(this.constructors, this.fieldData);
+}
+
+class StaticFieldData {
+  final ConstantValue initialValue;
+  final InitializerComplexity complexity;
+
+  StaticFieldData(this.initialValue, this.complexity);
+}
+
+class AllocatorData {
+  final ConstantValue initialValue;
+  final Map<KConstructor, Initializer> initializers = {};
+
+  AllocatorData(this.initialValue);
+}
+
+enum InitializerKind {
+  direct,
+  positional,
+  named,
+  complex,
+}
+
+class Initializer {
+  final InitializerKind kind;
+  final int index;
+  final String name;
+  final ConstantValue value;
+
+  Initializer.direct(this.value)
+      : kind = InitializerKind.direct,
+        index = null,
+        name = null;
+
+  Initializer.positional(this.index, this.value)
+      : kind = InitializerKind.positional,
+        name = null;
+
+  Initializer.named(this.name, this.value)
+      : kind = InitializerKind.named,
+        index = null;
+
+  const Initializer.complex()
+      : kind = InitializerKind.complex,
+        index = null,
+        name = null,
+        value = null;
+
+  String get shortText {
+    switch (kind) {
+      case InitializerKind.direct:
+        return value.toStructuredText();
+      case InitializerKind.positional:
+        return '$index:${value.toStructuredText()}';
+      case InitializerKind.named:
+        return '$name:${value.toStructuredText()}';
+      case InitializerKind.complex:
+        return '?';
+    }
+    throw new UnsupportedError('Unexpected kind $kind');
+  }
+
+  String toString() => shortText;
+}
+
+class JFieldAnalysis implements FieldAnalysis {
+  /// Tag used for identifying serialized [JFieldAnalysis] objects in a
+  /// debugging data stream.
+  static const String tag = 'allocator-analysis';
+
+  // --csp and --fast-startup have different constraints to the generated code.
+
+  final Map<FieldEntity, FieldAnalysisData> _fieldData;
+
+  JFieldAnalysis._(this._fieldData);
+
+  /// Deserializes a [JFieldAnalysis] object from [source].
+  factory JFieldAnalysis.readFromDataSource(
+      DataSource source, CompilerOptions options) {
+    source.begin(tag);
+    Map<FieldEntity, FieldAnalysisData> fieldData = source
+        .readMemberMap(() => new FieldAnalysisData.fromDataSource(source));
+    source.end(tag);
+    return new JFieldAnalysis._(fieldData);
+  }
+
+  /// Serializes this [JFieldAnalysis] to [sink].
+  void writeToDataSink(DataSink sink) {
+    sink.begin(tag);
+    sink.writeMemberMap(
+        _fieldData, (FieldAnalysisData data) => data.writeToDataSink(sink));
+    sink.end(tag);
+  }
+
+  factory JFieldAnalysis.from(
+      KClosedWorld closedWorld, JsToFrontendMap map, CompilerOptions options) {
+    Map<FieldEntity, FieldAnalysisData> fieldData = {};
+
+    bool canBeElided(FieldEntity field) {
+      return !closedWorld.annotationsData.hasNoElision(field) &&
+          !closedWorld.nativeData.isNativeMember(field);
+    }
+
+    closedWorld.fieldAnalysis._classData
+        .forEach((ClassEntity cls, ClassData classData) {
+      classData.fieldData.forEach((KField kField, AllocatorData data) {
+        JField jField = map.toBackendMember(kField);
+        if (jField == null) {
+          return;
+        }
+
+        // TODO(johnniwinther): Should elided static fields be removed from the
+        // J model? Static setters might still assign to them.
+
+        MemberUsage memberUsage = closedWorld.liveMemberUsage[kField];
+        if (!memberUsage.hasRead) {
+          if (canBeElided(kField)) {
+            fieldData[jField] = const FieldAnalysisData(isElided: true);
+          }
+        } else {
+          if (data.initialValue != null) {
+            ConstantValue initialValue;
+            bool isTooComplex = false;
+
+            void includeInitialValue(ConstantValue value) {
+              if (isTooComplex) return;
+              if (initialValue == null) {
+                initialValue = value;
+              } else if (initialValue != value) {
+                initialValue = null;
+                isTooComplex = true;
+              }
+            }
+
+            bool inAllConstructors = true;
+            for (KConstructor constructor in classData.constructors) {
+              if (isTooComplex) {
+                break;
+              }
+
+              MemberUsage constructorUsage =
+                  closedWorld.liveMemberUsage[constructor];
+              if (constructorUsage == null) return;
+              ParameterStructure invokedParameters =
+                  closedWorld.annotationsData.hasNoElision(constructor)
+                      ? constructor.parameterStructure
+                      : constructorUsage.invokedParameters;
+
+              Initializer initializer = data.initializers[constructor];
+              if (initializer == null) {
+                inAllConstructors = false;
+              } else {
+                switch (initializer.kind) {
+                  case InitializerKind.direct:
+                    includeInitialValue(initializer.value);
+                    break;
+                  case InitializerKind.positional:
+                    if (initializer.index >=
+                        invokedParameters.positionalParameters) {
+                      includeInitialValue(initializer.value);
+                    } else {
+                      isTooComplex = true;
+                    }
+                    break;
+                  case InitializerKind.named:
+                    if (!invokedParameters.namedParameters
+                        .contains(initializer.name)) {
+                      includeInitialValue(initializer.value);
+                    } else {
+                      isTooComplex = true;
+                    }
+                    break;
+                  case InitializerKind.complex:
+                    isTooComplex = true;
+                    break;
+                }
+              }
+            }
+            if (!inAllConstructors) {
+              includeInitialValue(data.initialValue);
+            }
+            if (!isTooComplex && initialValue != null) {
+              ConstantValue value = map.toBackendConstant(initialValue);
+              bool isEffectivelyConstant = false;
+              bool isInitializedInAllocator = false;
+              assert(value != null);
+              if (!memberUsage.hasWrite && canBeElided(kField)) {
+                isEffectivelyConstant = true;
+              } else if (value.isNull ||
+                  value.isInt ||
+                  value.isBool ||
+                  value.isString) {
+                // TODO(johnniwinther,sra): Support non-primitive constants in
+                // allocators when it does cause allocators to deoptimized
+                // because of deferred loading.
+                isInitializedInAllocator = true;
+              }
+              fieldData[jField] = new FieldAnalysisData(
+                  initialValue: value,
+                  isEffectivelyFinal: isEffectivelyConstant,
+                  isElided: isEffectivelyConstant,
+                  isInitializedInAllocator: isInitializedInAllocator);
+            }
+          }
+        }
+      });
+    });
+
+    closedWorld.liveMemberUsage
+        .forEach((MemberEntity member, MemberUsage memberUsage) {
+      if (member.isField && !member.isInstanceMember) {
+        JField jField = map.toBackendMember(member);
+        if (jField == null) return;
+
+        if (!memberUsage.hasRead && canBeElided(member)) {
+          fieldData[jField] = const FieldAnalysisData(isElided: true);
+        } else {
+          bool isEffectivelyFinal = !memberUsage.hasWrite;
+          StaticFieldData staticFieldData =
+              closedWorld.fieldAnalysis._staticFieldData[member];
+          ConstantValue value = map
+              .toBackendConstant(staticFieldData.initialValue, allowNull: true);
+          bool isElided =
+              isEffectivelyFinal && value != null && canBeElided(member);
+          // TODO(johnniwinther): Compute effective initializer complexity.
+          if (value != null || isEffectivelyFinal) {
+            fieldData[jField] = new FieldAnalysisData(
+                initialValue: value,
+                isEffectivelyFinal: isEffectivelyFinal,
+                isElided: isElided);
+          }
+        }
+      }
+    });
+
+    return new JFieldAnalysis._(fieldData);
+  }
+
+  // TODO(sra): Add way to let injected fields be initialized to a constant in
+  // allocator.
+
+  FieldAnalysisData getFieldData(JField field) {
+    return _fieldData[field] ?? const FieldAnalysisData();
+  }
+}
+
+// TODO(johnniwinther): Merge this into [FieldData].
+class FieldAnalysisData {
+  static const String tag = 'field-analysis-data';
+
+  final ConstantValue initialValue;
+  final bool isInitializedInAllocator;
+  final bool isEffectivelyFinal;
+  final bool isElided;
+
+  const FieldAnalysisData(
+      {this.initialValue,
+      this.isInitializedInAllocator: false,
+      this.isEffectivelyFinal: false,
+      this.isElided: false});
+
+  factory FieldAnalysisData.fromDataSource(DataSource source) {
+    source.begin(tag);
+
+    ConstantValue initialValue = source.readConstantOrNull();
+    bool isInitializedInAllocator = source.readBool();
+    bool isEffectivelyFinal = source.readBool();
+    bool isElided = source.readBool();
+    source.end(tag);
+    return new FieldAnalysisData(
+        initialValue: initialValue,
+        isInitializedInAllocator: isInitializedInAllocator,
+        isEffectivelyFinal: isEffectivelyFinal,
+        isElided: isElided);
+  }
+
+  void writeToDataSink(DataSink sink) {
+    sink.begin(tag);
+    sink.writeConstantOrNull(initialValue);
+    sink.writeBool(isInitializedInAllocator);
+    sink.writeBool(isEffectivelyFinal);
+    sink.writeBool(isElided);
+    sink.end(tag);
+  }
+
+  bool get isEffectivelyConstant =>
+      isEffectivelyFinal && isElided && initialValue != null;
+
+  ConstantValue get constantValue => isEffectivelyFinal ? initialValue : null;
+
+  String toString() =>
+      'FieldAnalysisData(initialValue=${initialValue?.toStructuredText()},'
+      'isInitializedInAllocator=$isInitializedInAllocator,'
+      'isEffectivelyFinal=$isEffectivelyFinal,isElided=$isElided)';
+}
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index 9a04642..4ee816a2 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -225,6 +225,15 @@
       }
     }
 
+    for (SetLiteralUse setLiteralUse in worldImpact.setLiterals) {
+      if (setLiteralUse.isConstant) {
+        registerImpact(_impacts.constantSetLiteral);
+      } else {
+        transformed
+            .registerTypeUse(new TypeUse.instantiation(setLiteralUse.type));
+      }
+    }
+
     for (ListLiteralUse listLiteralUse in worldImpact.listLiterals) {
       // TODO(johnniwinther): Use the [isConstant] and [isEmpty] property when
       // factory constructors are registered directly.
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 51674ab..3222b70 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -14,6 +14,7 @@
 import '../closure.dart';
 import '../common.dart';
 import '../common/names.dart' show Identifiers, Names, Selectors;
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../common_elements.dart' show CommonElements, ElementEnvironment;
 import '../diagnostics/invariant.dart' show DEBUG_MODE;
@@ -31,7 +32,6 @@
 import '../util/util.dart';
 import '../world.dart' show JClosedWorld;
 import 'backend.dart';
-import 'constant_system_javascript.dart';
 import 'native_data.dart';
 import 'runtime_types.dart';
 
@@ -574,7 +574,7 @@
   }
 
   /// Used to disambiguate names for constants in [constantName].
-  final NamingScope constantScope = new NamingScope();
+  final NamingScope _constantScope = new NamingScope();
 
   /// Used to store scopes for instances of [PrivatelyNamedJsEntity]
   final Map<Entity, NamingScope> _privateNamingScopes = {};
@@ -583,8 +583,8 @@
 
   final Map<LibraryEntity, String> libraryLongNames = HashMap();
 
-  final Map<ConstantValue, jsAst.Name> constantNames = HashMap();
-  final Map<ConstantValue, String> constantLongNames = {};
+  final Map<ConstantValue, jsAst.Name> _constantNames = HashMap();
+  final Map<ConstantValue, String> _constantLongNames = {};
   ConstantCanonicalHasher _constantHasher;
 
   /// Maps private names to a library that may use that name without prefixing
@@ -718,25 +718,25 @@
     // function constants since the function-implementation itself serves as
     // constant and can be accessed directly.
     assert(!constant.isFunction);
-    jsAst.Name result = constantNames[constant];
+    jsAst.Name result = _constantNames[constant];
     if (result == null) {
       String longName = constantLongName(constant);
-      result = getFreshName(constantScope, longName);
-      constantNames[constant] = result;
+      result = getFreshName(_constantScope, longName);
+      _constantNames[constant] = result;
     }
     return _newReference(result);
   }
 
   /// Proposed name for [constant].
   String constantLongName(ConstantValue constant) {
-    String longName = constantLongNames[constant];
+    String longName = _constantLongNames[constant];
     if (longName == null) {
       _constantHasher ??=
           new ConstantCanonicalHasher(rtiEncoder, _codegenWorldBuilder);
       longName = new ConstantNamingVisitor(
               rtiEncoder, _codegenWorldBuilder, _constantHasher)
           .getName(constant);
-      constantLongNames[constant] = longName;
+      _constantLongNames[constant] = longName;
     }
     return longName;
   }
@@ -816,7 +816,10 @@
     FunctionEntity function = method.function;
     return _disambiguateInternalMember(method, () {
       String invocationName = operatorNameToIdentifier(function.name);
-      return '${invocationName}\$body\$${method.enclosingClass.name}';
+      // TODO(sra): If the generator is for a closure's 'call' method, we don't
+      // need to incorporate the enclosing class.
+      String className = method.enclosingClass.name.replaceAll('&', '_');
+      return '${invocationName}\$body\$${className}';
     });
   }
 
@@ -1968,7 +1971,18 @@
   }
 
   @override
-  void visitMap(covariant JavaScriptMapConstant constant, [_]) {
+  void visitSet(SetConstantValue constant, [_]) {
+    // TODO(9476): Incorporate type parameters into name.
+    addRoot('Set');
+    if (constant.length == 0) {
+      add('empty');
+    } else {
+      add(getHashTag(constant, 5));
+    }
+  }
+
+  @override
+  void visitMap(covariant constant_system.JavaScriptMapConstant constant, [_]) {
     // TODO(9476): Incorporate type parameters into name.
     addRoot('Map');
     if (constant.length == 0) {
@@ -2139,6 +2153,11 @@
   }
 
   @override
+  int visitSet(SetConstantValue constant, [_]) {
+    return _hashList(constant.length, constant.values);
+  }
+
+  @override
   int visitMap(MapConstantValue constant, [_]) {
     int hash = _hashList(constant.length, constant.keys);
     return _hashList(hash, constant.values);
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index 9c2fc09..e084b4c 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -17,7 +17,7 @@
 import '../universe/use.dart' show StaticUse, TypeUse;
 import '../universe/world_impact.dart'
     show WorldImpact, WorldImpactBuilder, WorldImpactBuilderImpl;
-import 'allocator_analysis.dart';
+import 'field_analysis.dart';
 import 'backend_impact.dart';
 import 'backend_usage.dart';
 import 'checked_mode_helpers.dart';
@@ -43,7 +43,7 @@
   final CustomElementsResolutionAnalysis _customElementsAnalysis;
 
   final NativeResolutionEnqueuer _nativeEnqueuer;
-  final KAllocatorAnalysis _allocatorAnalysis;
+  final KFieldAnalysis _fieldAnalysis;
 
   /// True when we enqueue the loadLibrary code.
   bool _isLoadLibraryFunctionResolved = false;
@@ -59,7 +59,7 @@
       this._noSuchMethodRegistry,
       this._customElementsAnalysis,
       this._nativeEnqueuer,
-      this._allocatorAnalysis,
+      this._fieldAnalysis,
       this._deferredLoadTask);
 
   void _registerBackendImpact(
@@ -328,12 +328,16 @@
       _registerBackendImpact(impactBuilder, _impacts.functionClass);
     } else if (cls == _commonElements.mapClass) {
       _registerBackendImpact(impactBuilder, _impacts.mapClass);
+    } else if (cls == _commonElements.setClass) {
+      _registerBackendImpact(impactBuilder, _impacts.setClass);
     } else if (cls == _commonElements.boundClosureClass) {
       _registerBackendImpact(impactBuilder, _impacts.boundClosureClass);
     } else if (_nativeData.isNativeOrExtendsNative(cls)) {
       _registerBackendImpact(impactBuilder, _impacts.nativeOrExtendsClass);
     } else if (cls == _commonElements.mapLiteralClass) {
       _registerBackendImpact(impactBuilder, _impacts.mapLiteralClass);
+    } else if (cls == _commonElements.setLiteralClass) {
+      _registerBackendImpact(impactBuilder, _impacts.setLiteralClass);
     }
     if (cls == _commonElements.closureClass) {
       _registerBackendImpact(impactBuilder, _impacts.closureClass);
@@ -405,7 +409,7 @@
 
   @override
   WorldImpact registerInstantiatedClass(ClassEntity cls) {
-    _allocatorAnalysis.registerInstantiatedClass(cls);
+    _fieldAnalysis.registerInstantiatedClass(cls);
     return _processClass(cls);
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index b9a0d33..382475a 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -1047,6 +1047,10 @@
       _getClassNode(commonElements.jsArrayClass)
           .addDependency(_getClassNode(commonElements.listClass));
     }
+    if (commonElements.setLiteralClass != null) {
+      _getClassNode(commonElements.setLiteralClass)
+          .addDependency(_getClassNode(commonElements.setClass));
+    }
     if (commonElements.mapLiteralClass != null) {
       _getClassNode(commonElements.mapLiteralClass)
           .addDependency(_getClassNode(commonElements.mapClass));
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index 7fac11d..987d957 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -189,7 +189,7 @@
           namer,
           this,
           closedWorld,
-          closedWorld.allocatorAnalysis,
+          closedWorld.fieldAnalysis,
           inferredData,
           backend.sourceInformationStrategy,
           closedWorld.sorter,
diff --git a/pkg/compiler/lib/src/js_emitter/constant_ordering.dart b/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
index 93b4e7d..9b4aed2 100644
--- a/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
+++ b/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
@@ -113,6 +113,13 @@
     return compareDartTypes(a.type, b.type);
   }
 
+  @override
+  int visitSet(SetConstantValue a, SetConstantValue b) {
+    int r = compareLists(compareValues, a.values, b.values);
+    if (r != 0) return r;
+    return compareDartTypes(a.type, b.type);
+  }
+
   int visitMap(MapConstantValue a, MapConstantValue b) {
     int r = compareLists(compareValues, a.keys, b.keys);
     if (r != 0) return r;
@@ -201,14 +208,15 @@
   static const int BOOL = 5;
   static const int STRING = 6;
   static const int LIST = 7;
-  static const int MAP = 8;
-  static const int CONSTRUCTED = 9;
-  static const int TYPE = 10;
-  static const int INTERCEPTOR = 11;
-  static const int SYNTHETIC = 12;
-  static const int DEFERRED_GLOBAL = 13;
-  static const int NONCONSTANT = 14;
-  static const int INSTANTIATION = 15;
+  static const int SET = 8;
+  static const int MAP = 9;
+  static const int CONSTRUCTED = 10;
+  static const int TYPE = 11;
+  static const int INTERCEPTOR = 12;
+  static const int SYNTHETIC = 13;
+  static const int DEFERRED_GLOBAL = 14;
+  static const int NONCONSTANT = 15;
+  static const int INSTANTIATION = 16;
 
   static int kind(ConstantValue constant) =>
       constant.accept(const _KindVisitor(), null);
@@ -221,6 +229,7 @@
   int visitBool(BoolConstantValue a, _) => BOOL;
   int visitString(StringConstantValue a, _) => STRING;
   int visitList(ListConstantValue a, _) => LIST;
+  int visitSet(SetConstantValue a, _) => SET;
   int visitMap(MapConstantValue a, _) => MAP;
   int visitConstructed(ConstructedConstantValue a, _) => CONSTRUCTED;
   int visitType(TypeConstantValue a, _) => TYPE;
diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
index 9fb47bc..6f7b580 100644
--- a/pkg/compiler/lib/src/js_emitter/model.dart
+++ b/pkg/compiler/lib/src/js_emitter/model.dart
@@ -384,6 +384,8 @@
 
   final ConstantValue initializerInAllocator;
 
+  final ConstantValue constantValue;
+
   final bool isElided;
 
   // TODO(floitsch): support renamed fields.
@@ -395,6 +397,7 @@
       this.setterFlags,
       this.needsCheckedSetter,
       this.initializerInAllocator,
+      this.constantValue,
       this.isElided);
 
   bool get needsGetter => getterFlags != 0;
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
index e57a3ab..d74d9c7 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
@@ -273,8 +273,9 @@
         // TODO(johnniwinther): This should be accessed from a codegen closed
         // world.
         _worldBuilder.allReferencedStaticFields.where((FieldEntity field) {
-      return field.isAssignable &&
-          _worldBuilder.hasConstantFieldInitializer(field);
+      FieldAnalysisData fieldData =
+          _closedWorld.fieldAnalysis.getFieldData(field);
+      return !fieldData.isEffectivelyFinal && fieldData.initialValue != null;
     });
 
     _sorter.sortMembers(fields).forEach((MemberEntity e) => addToOutputUnit(e));
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index b981d83..efd77cd 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -18,7 +18,8 @@
 import '../../elements/types.dart';
 import '../../io/source_information.dart';
 import '../../js/js.dart' as js;
-import '../../js_backend/allocator_analysis.dart' show JAllocatorAnalysis;
+import '../../js_backend/field_analysis.dart'
+    show FieldAnalysisData, JFieldAnalysis;
 import '../../js_backend/backend.dart' show SuperMemberData;
 import '../../js_backend/backend_usage.dart';
 import '../../js_backend/constant_handler_javascript.dart'
@@ -79,7 +80,7 @@
   final Namer _namer;
   final CodeEmitterTask _task;
   final JClosedWorld _closedWorld;
-  final JAllocatorAnalysis _allocatorAnalysis;
+  final JFieldAnalysis _fieldAnalysis;
   final InferredData _inferredData;
   final SourceInformationStrategy _sourceInformationStrategy;
 
@@ -123,7 +124,7 @@
       this._namer,
       this._task,
       this._closedWorld,
-      this._allocatorAnalysis,
+      this._fieldAnalysis,
       this._inferredData,
       this._sourceInformationStrategy,
       this._sorter,
@@ -406,8 +407,8 @@
   }
 
   StaticField _buildStaticField(FieldEntity element) {
-    ConstantValue initialValue =
-        _worldBuilder.getConstantFieldInitializer(element);
+    FieldAnalysisData fieldData = _fieldAnalysis.getFieldData(element);
+    ConstantValue initialValue = fieldData.initialValue;
     // TODO(zarah): The holder should not be registered during building of
     // a static field.
     _registry.registerHolder(_namer.globalObjectForConstant(initialValue),
@@ -701,12 +702,16 @@
     if (!onlyForRti) {
       if (_elementEnvironment.isSuperMixinApplication(cls)) {
         List<MemberEntity> members = <MemberEntity>[];
-        _elementEnvironment.forEachLocalClassMember(cls, (MemberEntity member) {
+        void add(MemberEntity member) {
           if (member.enclosingClass == cls) {
             members.add(member);
             isSuperMixinApplication = true;
           }
-        });
+        }
+
+        _elementEnvironment.forEachLocalClassMember(cls, add);
+        _elementEnvironment.forEachInjectedClassMember(cls, add);
+
         if (members.isNotEmpty) {
           _sorter.sortMembers(members).forEach(visitMember);
         }
@@ -1067,9 +1072,14 @@
         }
       }
 
-      ConstantValue initializerInAllocator = null;
-      if (_allocatorAnalysis.isInitializedInAllocator(field)) {
-        initializerInAllocator = _allocatorAnalysis.initializerValue(field);
+      FieldAnalysisData fieldData = _fieldAnalysis.getFieldData(field);
+      ConstantValue initializerInAllocator;
+      if (fieldData.isInitializedInAllocator) {
+        initializerInAllocator = fieldData.initialValue;
+      }
+      ConstantValue constantValue;
+      if (fieldData.isEffectivelyConstant) {
+        constantValue = fieldData.constantValue;
       }
 
       fields.add(new Field(
@@ -1080,7 +1090,8 @@
           setterFlags,
           needsCheckedSetter,
           initializerInAllocator,
-          _closedWorld.elidedFields.contains(field)));
+          constantValue,
+          fieldData.isElided));
     }
 
     FieldVisitor visitor = new FieldVisitor(_options, _elementEnvironment,
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index 965e232..e47c77a 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -1078,17 +1078,33 @@
   Method generateGetter(Field field) {
     assert(field.needsGetter);
 
-    String template;
-    if (field.needsInterceptedGetterOnReceiver) {
-      template = "function(receiver) { return receiver[#]; }";
-    } else if (field.needsInterceptedGetterOnThis) {
-      template = "function(receiver) { return this[#]; }";
+    js.Expression code;
+    if (field.isElided) {
+      ConstantValue constantValue = field.constantValue;
+      if (constantValue == null) {
+        assert(_closedWorld.abstractValueDomain is TrivialAbstractValueDomain);
+        // Since static types are not used in invocation/access of instance
+        // members in codegen, we see dynamic uses in codegen that are not
+        // present in resolution when using the trivial abstract value domain.
+        // This means that resolution can determine that a field is never read
+        // but codegen thinks it is read.
+        constantValue = new NullConstantValue();
+      }
+      code = js.js(
+          "function() { return #; }", generateConstantReference(constantValue));
     } else {
-      assert(!field.needsInterceptedGetter);
-      template = "function() { return this[#]; }";
+      String template;
+      if (field.needsInterceptedGetterOnReceiver) {
+        template = "function(receiver) { return receiver[#]; }";
+      } else if (field.needsInterceptedGetterOnThis) {
+        template = "function(receiver) { return this[#]; }";
+      } else {
+        assert(!field.needsInterceptedGetter);
+        template = "function() { return this[#]; }";
+      }
+      js.Expression fieldName = js.quoteName(field.name);
+      code = js.js(template, fieldName);
     }
-    js.Expression fieldName = js.quoteName(field.name);
-    js.Expression code = js.js(template, fieldName);
     js.Name getterName = namer.deriveGetterName(field.accessorName);
     return new StubMethod(getterName, code);
   }
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index d091e73..6497bf4 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -32,10 +32,12 @@
 import '../../../compiler_new.dart';
 import '../../common.dart';
 import '../../compiler.dart' show Compiler;
-import '../../constants/values.dart' show ConstantValue, FunctionConstantValue;
+import '../../constants/values.dart'
+    show ConstantValue, FunctionConstantValue, NullConstantValue;
 import '../../common_elements.dart' show CommonElements;
 import '../../elements/entities.dart';
 import '../../hash/sha1.dart' show Hasher;
+import '../../inferrer/trivial.dart';
 import '../../io/code_output.dart';
 import '../../io/location_provider.dart' show LocationCollector;
 import '../../io/source_map_builder.dart' show SourceMapBuilder;
@@ -89,7 +91,7 @@
         compiler.codegenWorldBuilder,
         _closedWorld.rtiNeed,
         compiler.backend.rtiEncoder,
-        _closedWorld.allocatorAnalysis,
+        _closedWorld.fieldAnalysis,
         task,
         this.generateConstantReference,
         constantListGenerator);
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index 5057b6a..5582d45 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -7,7 +7,6 @@
 import '../closure.dart';
 import '../common.dart';
 import '../constants/expressions.dart';
-import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/names.dart' show Name;
 import '../elements/types.dart';
@@ -259,6 +258,12 @@
               return true;
             }
             break;
+          case VariableUseKind.setLiteral:
+            if (rtiNeed.classNeedsTypeArguments(
+                _elementMap.commonElements.setLiteralClass)) {
+              return true;
+            }
+            break;
           case VariableUseKind.mapLiteral:
             if (rtiNeed.classNeedsTypeArguments(
                 _elementMap.commonElements.mapLiteralClass)) {
@@ -1143,25 +1148,6 @@
   }
 
   @override
-  ConstantValue getConstantFieldInitializer(IrToElementMap elementMap) {
-    failedAt(
-        definition.location,
-        "Unexpected field ${definition} in "
-        "ClosureFieldData.getConstantFieldInitializer");
-    return null;
-  }
-
-  @override
-  bool hasConstantFieldInitializer(IrToElementMap elementMap) {
-    return false;
-  }
-
-  @override
-  ConstantValue getFieldConstantValue(IrToElementMap elementMap) {
-    return null;
-  }
-
-  @override
   ClassTypeVariableAccess get classTypeVariableAccess =>
       ClassTypeVariableAccess.none;
 }
diff --git a/pkg/compiler/lib/src/js_model/element_map.dart b/pkg/compiler/lib/src/js_model/element_map.dart
index b495237..9371d5c 100644
--- a/pkg/compiler/lib/src/js_model/element_map.dart
+++ b/pkg/compiler/lib/src/js_model/element_map.dart
@@ -144,10 +144,6 @@
   js.Template getJsBuiltinTemplate(
       ConstantValue constant, CodeEmitterTask emitter);
 
-  /// Return the [ConstantValue] the initial value of [field] or `null` if
-  /// the initializer is not a constant expression.
-  ConstantValue getFieldConstantValue(FieldEntity field);
-
   /// Returns a [Spannable] for a message pointing to the IR [node] in the
   /// context of [member].
   Spannable getSpannable(MemberEntity member, ir.Node node);
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index ad03cc0..31e729e 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -16,7 +16,6 @@
 import '../common/names.dart';
 import '../common_elements.dart';
 import '../compile_time_constants.dart';
-import '../constants/constant_system.dart';
 import '../constants/constructors.dart';
 import '../constants/evaluation.dart';
 import '../constants/expressions.dart';
@@ -37,7 +36,7 @@
 import '../ir/static_type_provider.dart';
 import '../ir/util.dart';
 import '../js/js.dart' as js;
-import '../js_backend/constant_system_javascript.dart';
+import '../js_backend/annotations.dart';
 import '../js_backend/namer.dart';
 import '../js_backend/native_data.dart';
 import '../js_emitter/code_emitter_task.dart';
@@ -61,12 +60,6 @@
 
 /// Interface for kernel queries needed to implement the [CodegenWorldBuilder].
 abstract class JsToWorldBuilder implements JsToElementMap {
-  /// Returns `true` if [field] has a constant initializer.
-  bool hasConstantFieldInitializer(FieldEntity field);
-
-  /// Returns the constant initializer for [field].
-  ConstantValue getConstantFieldInitializer(FieldEntity field);
-
   /// Calls [f] for each parameter of [function] providing the type and name of
   /// the parameter and the [defaultValue] if the parameter is optional.
   void forEachParameter(FunctionEntity function,
@@ -149,7 +142,8 @@
       this.reporter,
       Environment environment,
       KernelToElementMapImpl _elementMap,
-      Map<MemberEntity, MemberUsage> liveMemberUsage)
+      Map<MemberEntity, MemberUsage> liveMemberUsage,
+      AnnotationsData annotations)
       : this.options = _elementMap.options {
     _elementEnvironment = new JsElementEnvironment(this);
     _commonElements = new CommonElementsImpl(_elementEnvironment);
@@ -221,8 +215,8 @@
       LibraryEntity newLibrary = libraries.getEntity(oldLibrary.libraryIndex);
       ClassEntity newClass =
           oldClass != null ? classes.getEntity(oldClass.classIndex) : null;
-      IndexedMember newMember =
-          convertMember(newLibrary, newClass, oldMember, memberUsage);
+      IndexedMember newMember = convertMember(
+          newLibrary, newClass, oldMember, memberUsage, annotations);
       members.register(newMember, data.convert());
       assert(
           newMember.memberIndex == oldMember.memberIndex,
@@ -1381,6 +1375,10 @@
 
   ConstantValue getConstantValue(ir.Expression node,
       {bool requireConstant: true, bool implicitNull: false}) {
+    if (node is ir.ConstantExpression) {
+      return node.constant.accept(new ConstantValuefier(this));
+    }
+
     ConstantExpression constant;
     if (node == null) {
       if (!implicitNull) {
@@ -1533,8 +1531,12 @@
     return createTypedef(library, typedef.name);
   }
 
-  MemberEntity convertMember(LibraryEntity library, ClassEntity cls,
-      IndexedMember member, MemberUsage memberUsage) {
+  MemberEntity convertMember(
+      LibraryEntity library,
+      ClassEntity cls,
+      IndexedMember member,
+      MemberUsage memberUsage,
+      AnnotationsData annotations) {
     Name memberName = new Name(member.memberName.text, library,
         isSetter: member.memberName.isSetter);
     if (member.isField) {
@@ -1545,17 +1547,19 @@
           isConst: field.isConst);
     } else if (member.isConstructor) {
       IndexedConstructor constructor = member;
+      ParameterStructure parameterStructure =
+          annotations.hasNoElision(constructor)
+              ? constructor.parameterStructure
+              : memberUsage.invokedParameters;
       if (constructor.isFactoryConstructor) {
         // TODO(redemption): This should be a JFunction.
-        return createFactoryConstructor(
-            cls, memberName, memberUsage.invokedParameters,
+        return createFactoryConstructor(cls, memberName, parameterStructure,
             isExternal: constructor.isExternal,
             isConst: constructor.isConst,
             isFromEnvironmentConstructor:
                 constructor.isFromEnvironmentConstructor);
       } else {
-        return createGenerativeConstructor(
-            cls, memberName, memberUsage.invokedParameters,
+        return createGenerativeConstructor(cls, memberName, parameterStructure,
             isExternal: constructor.isExternal, isConst: constructor.isConst);
       }
     } else if (member.isGetter) {
@@ -1572,8 +1576,11 @@
           isAbstract: setter.isAbstract);
     } else {
       IndexedFunction function = member;
-      return createMethod(library, cls, memberName,
-          memberUsage.invokedParameters, function.asyncMarker,
+      ParameterStructure parameterStructure = annotations.hasNoElision(function)
+          ? function.parameterStructure
+          : memberUsage.invokedParameters;
+      return createMethod(
+          library, cls, memberName, parameterStructure, function.asyncMarker,
           isStatic: function.isStatic,
           isExternal: function.isExternal,
           isAbstract: function.isAbstract);
@@ -1729,25 +1736,6 @@
   }
 
   @override
-  ConstantValue getFieldConstantValue(covariant IndexedField field) {
-    assert(checkFamily(field));
-    JFieldData data = members.getData(field);
-    return data.getFieldConstantValue(this);
-  }
-
-  @override
-  bool hasConstantFieldInitializer(covariant IndexedField field) {
-    JFieldData data = members.getData(field);
-    return data.hasConstantFieldInitializer(this);
-  }
-
-  @override
-  ConstantValue getConstantFieldInitializer(covariant IndexedField field) {
-    JFieldData data = members.getData(field);
-    return data.getConstantFieldInitializer(this);
-  }
-
-  @override
   void forEachParameter(covariant IndexedFunction function,
       void f(DartType type, String name, ConstantValue defaultValue),
       {bool isNative: false}) {
@@ -2491,17 +2479,13 @@
 
   JsConstantEnvironment(this._elementMap, this._environment);
 
-  @override
-  ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
-
   ConstantValue _getConstantValue(
       Spannable spannable, ConstantExpression expression,
       {bool constantRequired}) {
     return _valueMap.putIfAbsent(expression, () {
-      return expression.evaluate(
-          new JsEvaluationEnvironment(_elementMap, _environment, spannable,
-              constantRequired: constantRequired),
-          constantSystem);
+      return expression.evaluate(new JsEvaluationEnvironment(
+          _elementMap, _environment, spannable,
+          constantRequired: constantRequired));
     });
   }
 }
diff --git a/pkg/compiler/lib/src/js_model/env.dart b/pkg/compiler/lib/src/js_model/env.dart
index 17cc2e9..1e72ff3 100644
--- a/pkg/compiler/lib/src/js_model/env.dart
+++ b/pkg/compiler/lib/src/js_model/env.dart
@@ -930,14 +930,6 @@
 
   ConstantExpression getFieldConstantExpression(
       JsKernelToElementMap elementMap);
-
-  /// Return the [ConstantValue] the initial value of [field] or `null` if
-  /// the initializer is not a constant expression.
-  ConstantValue getFieldConstantValue(JsKernelToElementMap elementMap);
-
-  bool hasConstantFieldInitializer(JsKernelToElementMap elementMap);
-
-  ConstantValue getConstantFieldInitializer(JsKernelToElementMap elementMap);
 }
 
 class JFieldDataImpl extends JMemberDataImpl implements JFieldData {
@@ -946,8 +938,6 @@
   static const String tag = 'field-data';
 
   DartType _type;
-  bool _isConstantComputed = false;
-  ConstantValue _constantValue;
   ConstantExpression _constantExpression;
 
   JFieldDataImpl(ir.Field node, MemberDefinition definition,
@@ -997,33 +987,6 @@
   }
 
   @override
-  ConstantValue getFieldConstantValue(JsKernelToElementMap elementMap) {
-    if (!_isConstantComputed) {
-      _constantValue = elementMap.getConstantValue(node.initializer,
-          requireConstant: node.isConst, implicitNull: !node.isConst);
-      _isConstantComputed = true;
-    }
-    return _constantValue;
-  }
-
-  @override
-  bool hasConstantFieldInitializer(JsKernelToElementMap elementMap) {
-    return getFieldConstantValue(elementMap) != null;
-  }
-
-  @override
-  ConstantValue getConstantFieldInitializer(JsKernelToElementMap elementMap) {
-    ConstantValue value = getFieldConstantValue(elementMap);
-    assert(
-        value != null,
-        failedAt(
-            definition.location,
-            "Field ${definition} doesn't have a "
-            "constant initial value."));
-    return value;
-  }
-
-  @override
   ClassTypeVariableAccess get classTypeVariableAccess {
     if (node.isInstanceMember) return ClassTypeVariableAccess.instanceField;
     return ClassTypeVariableAccess.none;
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 8715893..e605804 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -64,7 +64,8 @@
         _compiler.reporter,
         _compiler.environment,
         strategy.elementMap,
-        closedWorld.liveMemberUsage);
+        closedWorld.liveMemberUsage,
+        closedWorld.annotationsData);
     GlobalLocalsMap _globalLocalsMap = new GlobalLocalsMap();
     ClosureDataBuilder closureDataBuilder = new ClosureDataBuilder(
         _elementMap, _globalLocalsMap, _compiler.options);
diff --git a/pkg/compiler/lib/src/js_model/js_world.dart b/pkg/compiler/lib/src/js_model/js_world.dart
index 3f6ca05..024408f 100644
--- a/pkg/compiler/lib/src/js_model/js_world.dart
+++ b/pkg/compiler/lib/src/js_model/js_world.dart
@@ -9,7 +9,6 @@
 import '../common.dart';
 import '../common/names.dart';
 import '../common_elements.dart' show JCommonElements, JElementEnvironment;
-import '../constants/constant_system.dart';
 import '../deferred_load.dart';
 import '../diagnostics/diagnostic_listener.dart';
 import '../elements/entities.dart';
@@ -20,9 +19,8 @@
 import '../inferrer/abstract_value_domain.dart';
 import '../js_emitter/sorter.dart';
 import '../js_backend/annotations.dart';
-import '../js_backend/allocator_analysis.dart';
+import '../js_backend/field_analysis.dart';
 import '../js_backend/backend_usage.dart';
-import '../js_backend/constant_system_javascript.dart';
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/native_data.dart';
 import '../js_backend/no_such_method_registry.dart';
@@ -75,12 +73,11 @@
   final JsKernelToElementMap elementMap;
   final RuntimeTypesNeed rtiNeed;
   AbstractValueDomain _abstractValueDomain;
-  final JAllocatorAnalysis allocatorAnalysis;
+  final JFieldAnalysis fieldAnalysis;
   final AnnotationsData annotationsData;
   final GlobalLocalsMap globalLocalsMap;
   final ClosureData closureDataLookup;
   final OutputUnitData outputUnitData;
-  final Set<FieldEntity> elidedFields;
   Sorter _sorter;
 
   JsClosedWorld(
@@ -89,7 +86,7 @@
       this.interceptorData,
       this.backendUsage,
       this.rtiNeed,
-      this.allocatorAnalysis,
+      this.fieldAnalysis,
       this.noSuchMethodData,
       this.implementedClasses,
       this.liveNativeClasses,
@@ -103,8 +100,7 @@
       this.annotationsData,
       this.globalLocalsMap,
       this.closureDataLookup,
-      this.outputUnitData,
-      this.elidedFields) {
+      this.outputUnitData) {
     _abstractValueDomain = abstractValueStrategy.createDomain(this);
   }
 
@@ -134,8 +130,8 @@
     BackendUsage backendUsage = new BackendUsage.readFromDataSource(source);
     RuntimeTypesNeed rtiNeed = new RuntimeTypesNeed.readFromDataSource(
         source, elementMap.elementEnvironment);
-    JAllocatorAnalysis allocatorAnalysis =
-        new JAllocatorAnalysis.readFromDataSource(source, options);
+    JFieldAnalysis allocatorAnalysis =
+        new JFieldAnalysis.readFromDataSource(source, options);
     NoSuchMethodData noSuchMethodData =
         new NoSuchMethodData.readFromDataSource(source);
 
@@ -158,8 +154,6 @@
     OutputUnitData outputUnitData =
         new OutputUnitData.readFromDataSource(source);
 
-    Set<FieldEntity> elidedFields = source.readMembers<FieldEntity>().toSet();
-
     source.end(tag);
 
     return new JsClosedWorld(
@@ -182,8 +176,7 @@
         annotationsData,
         globalLocalsMap,
         closureData,
-        outputUnitData,
-        elidedFields);
+        outputUnitData);
   }
 
   /// Serializes this [JsClosedWorld] to [sink].
@@ -197,7 +190,7 @@
     interceptorData.writeToDataSink(sink);
     backendUsage.writeToDataSink(sink);
     rtiNeed.writeToDataSink(sink);
-    allocatorAnalysis.writeToDataSink(sink);
+    fieldAnalysis.writeToDataSink(sink);
     noSuchMethodData.writeToDataSink(sink);
     sink.writeClasses(implementedClasses);
     sink.writeClasses(liveNativeClasses);
@@ -211,12 +204,9 @@
     annotationsData.writeToDataSink(sink);
     closureDataLookup.writeToDataSink(sink);
     outputUnitData.writeToDataSink(sink);
-    sink.writeMembers(elidedFields);
     sink.end(tag);
   }
 
-  ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
-
   JElementEnvironment get elementEnvironment => elementMap.elementEnvironment;
 
   JCommonElements get commonElements => elementMap.commonElements;
diff --git a/pkg/compiler/lib/src/js_model/js_world_builder.dart b/pkg/compiler/lib/src/js_model/js_world_builder.dart
index 3b39476..baff70c 100644
--- a/pkg/compiler/lib/src/js_model/js_world_builder.dart
+++ b/pkg/compiler/lib/src/js_model/js_world_builder.dart
@@ -7,6 +7,7 @@
 import '../closure.dart';
 import '../common.dart';
 import '../common_elements.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../deferred_load.dart';
 import '../elements/entities.dart';
@@ -16,8 +17,8 @@
 import '../inferrer/abstract_value_domain.dart';
 import '../ir/closure.dart';
 import '../js_backend/annotations.dart';
-import '../js_backend/allocator_analysis.dart';
 import '../js_backend/backend_usage.dart';
+import '../js_backend/field_analysis.dart';
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/native_data.dart';
 import '../js_backend/no_such_method_registry.dart';
@@ -28,7 +29,6 @@
 import '../universe/class_hierarchy.dart';
 import '../universe/class_set.dart';
 import '../universe/feature.dart';
-import '../universe/member_usage.dart';
 import '../universe/selector.dart';
 import '../world.dart';
 import 'closure.dart';
@@ -192,8 +192,8 @@
         map.toBackendFunctionSet(oldNoSuchMethodData.otherImpls),
         map.toBackendFunctionSet(oldNoSuchMethodData.forwardingSyntaxImpls));
 
-    JAllocatorAnalysis allocatorAnalysis =
-        JAllocatorAnalysis.from(closedWorld.allocatorAnalysis, map, _options);
+    JFieldAnalysis allocatorAnalysis =
+        JFieldAnalysis.from(closedWorld, map, _options);
 
     AnnotationsDataImpl oldAnnotationsData = closedWorld.annotationsData;
     AnnotationsData annotationsData = new AnnotationsDataImpl(
@@ -202,19 +202,6 @@
     OutputUnitData outputUnitData =
         _convertOutputUnitData(map, kOutputUnitData, closureData);
 
-    Set<FieldEntity> elidedFields = new Set();
-    closedWorld.liveMemberUsage
-        .forEach((MemberEntity member, MemberUsage memberUsage) {
-      // TODO(johnniwinther): Should elided static fields be removed from the
-      // J model? Static setters might still assign to them.
-      if (member.isField &&
-          !memberUsage.hasRead &&
-          !closedWorld.annotationsData.hasNoElision(member) &&
-          !closedWorld.nativeData.isNativeMember(member)) {
-        elidedFields.add(map.toBackendMember(member));
-      }
-    });
-
     return new JsClosedWorld(
         _elementMap,
         nativeData,
@@ -239,8 +226,7 @@
         annotationsData,
         _globalLocalsMap,
         closureData,
-        outputUnitData,
-        elidedFields);
+        outputUnitData);
   }
 
   BackendUsage _convertBackendUsage(
@@ -608,7 +594,7 @@
 
   DartType toBackendType(DartType type, {bool allowFreeVariables: false});
 
-  ConstantValue toBackendConstant(ConstantValue value);
+  ConstantValue toBackendConstant(ConstantValue value, {bool allowNull: false});
 
   Set<LibraryEntity> toBackendLibrarySet(Iterable<LibraryEntity> set) {
     return set.map(toBackendLibrary).toSet();
@@ -730,7 +716,14 @@
         .getEntity(indexedTypeVariable.typeVariableIndex);
   }
 
-  ConstantValue toBackendConstant(ConstantValue constant) {
+  ConstantValue toBackendConstant(ConstantValue constant,
+      {bool allowNull: false}) {
+    if (constant == null) {
+      if (!allowNull) {
+        throw new UnsupportedError('Null not allowed as constant value.');
+      }
+      return null;
+    }
     return constant.accept(new _ConstantConverter(toBackendEntity), null);
   }
 }
@@ -864,16 +857,31 @@
     return new ListConstantValue(type, entries);
   }
 
-  ConstantValue visitMap(MapConstantValue constant, _) {
-    var type = typeConverter.visit(constant.type, toBackendEntity);
-    List<ConstantValue> keys = _handleValues(constant.keys);
-    List<ConstantValue> values = _handleValues(constant.values);
-    if (identical(keys, constant.keys) &&
-        identical(values, constant.values) &&
-        type == constant.type) {
+  @override
+  ConstantValue visitSet(
+      covariant constant_system.JavaScriptSetConstant constant, _) {
+    DartType type = typeConverter.visit(constant.type, toBackendEntity);
+    MapConstantValue entries = constant.entries.accept(this, null);
+    if (identical(entries, constant.entries) && type == constant.type) {
       return constant;
     }
-    return new MapConstantValue(type, keys, values);
+    return new constant_system.JavaScriptSetConstant(type, entries);
+  }
+
+  ConstantValue visitMap(
+      covariant constant_system.JavaScriptMapConstant constant, _) {
+    DartType type = typeConverter.visit(constant.type, toBackendEntity);
+    ListConstantValue keys = constant.keyList.accept(this, null);
+    List<ConstantValue> values = _handleValues(constant.values);
+    ConstantValue protoValue = constant.protoValue?.accept(this, null);
+    if (identical(keys, constant.keys) &&
+        identical(values, constant.values) &&
+        type == constant.type &&
+        protoValue == constant.protoValue) {
+      return constant;
+    }
+    return new constant_system.JavaScriptMapConstant(
+        type, keys, values, protoValue, constant.onlyStringKeys);
   }
 
   ConstantValue visitConstructed(ConstructedConstantValue constant, _) {
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index a021418..38c496d 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -75,6 +75,9 @@
   bool get errorOnUnexactWebIntLiterals => true;
 
   @override
+  bool get supportsSetLiterals => true;
+
+  @override
   void performModularTransformationsOnLibraries(
       ir.Component component,
       CoreTypes coreTypes,
@@ -143,7 +146,7 @@
   // TODO(askesc): Return specialized dart2js constants backend.
   @override
   ConstantsBackend constantsBackend(CoreTypes coreTypes) =>
-      new ConstantsBackend();
+      const ConstantsBackend();
 }
 
 // TODO(sigmund): this "extraRequiredLibraries" needs to be removed...
diff --git a/pkg/compiler/lib/src/kernel/deferred_load.dart b/pkg/compiler/lib/src/kernel/deferred_load.dart
index ecdbd9f..ba487b3 100644
--- a/pkg/compiler/lib/src/kernel/deferred_load.dart
+++ b/pkg/compiler/lib/src/kernel/deferred_load.dart
@@ -177,6 +177,15 @@
   }
 
   @override
+  void visitSetLiteral(ir.SetLiteral literal) {
+    if (literal.isConst) {
+      add(literal);
+    } else {
+      super.visitSetLiteral(literal);
+    }
+  }
+
+  @override
   void visitMapLiteral(ir.MapLiteral literal) {
     if (literal.isConst) {
       add(literal);
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index 8fd2d17..3a22be9 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -108,8 +108,6 @@
   js.Name getNameForJsGetName(ConstantValue constant, Namer namer);
 
   /// Computes the [ConstantValue] for the constant [expression].
-  // TODO(johnniwinther): Move to [KernelToElementMapForBuilding]. This is only
-  // used in impact builder for symbol constants.
   ConstantValue getConstantValue(ir.Expression expression,
       {bool requireConstant: true, bool implicitNull: false});
 
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 343e484..db56ed7 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -17,7 +17,6 @@
 import '../common/resolution.dart';
 import '../common_elements.dart';
 import '../compile_time_constants.dart';
-import '../constants/constant_system.dart';
 import '../constants/constructors.dart';
 import '../constants/evaluation.dart';
 import '../constants/expressions.dart';
@@ -28,6 +27,7 @@
 import '../elements/types.dart';
 import '../environment.dart';
 import '../frontend_strategy.dart';
+import '../ir/annotations.dart';
 import '../ir/debug.dart';
 import '../ir/element_map.dart';
 import '../ir/impact.dart';
@@ -40,7 +40,6 @@
 import '../js/js.dart' as js;
 import '../js_backend/annotations.dart';
 import '../js_backend/backend.dart' show JavaScriptBackend;
-import '../js_backend/constant_system_javascript.dart';
 import '../js_backend/namer.dart';
 import '../js_backend/native_data.dart';
 import '../js_backend/no_such_method_registry.dart';
@@ -996,6 +995,10 @@
       {bool requireConstant: true,
       bool implicitNull: false,
       bool checkCasts: true}) {
+    if (node is ir.ConstantExpression) {
+      return node.constant.accept(new ConstantValuefier(this));
+    }
+
     ConstantExpression constant;
     if (node == null) {
       if (!implicitNull) {
@@ -1874,17 +1877,13 @@
 
   KernelConstantEnvironment(this._elementMap, this._environment);
 
-  @override
-  ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
-
   ConstantValue _getConstantValue(
       Spannable spannable, ConstantExpression expression,
       {bool constantRequired, bool checkCasts: true}) {
     return _valueMap.putIfAbsent(expression, () {
-      return expression.evaluate(
-          new KernelEvaluationEnvironment(_elementMap, _environment, spannable,
-              constantRequired: constantRequired, checkCasts: checkCasts),
-          constantSystem);
+      return expression.evaluate(new KernelEvaluationEnvironment(
+          _elementMap, _environment, spannable,
+          constantRequired: constantRequired, checkCasts: checkCasts));
     });
   }
 }
@@ -1939,56 +1938,171 @@
   bool get enableAssertions => _elementMap.options.enableUserAssertions;
 }
 
-class KernelNativeMemberResolver extends NativeMemberResolverBase {
-  final KernelToElementMap elementMap;
-  final NativeBasicData nativeBasicData;
-  final NativeDataBuilder nativeDataBuilder;
+class KernelNativeMemberResolver implements NativeMemberResolver {
+  static final RegExp _identifier = new RegExp(r'^[a-zA-Z_$][a-zA-Z0-9_$]*$');
+
+  final KernelToElementMap _elementMap;
+  final NativeBasicData _nativeBasicData;
+  final NativeDataBuilder _nativeDataBuilder;
 
   KernelNativeMemberResolver(
-      this.elementMap, this.nativeBasicData, this.nativeDataBuilder);
+      this._elementMap, this._nativeBasicData, this._nativeDataBuilder);
+
+  KElementEnvironment get _elementEnvironment => _elementMap.elementEnvironment;
+
+  CommonElements get _commonElements => _elementMap.commonElements;
 
   @override
-  KElementEnvironment get elementEnvironment => elementMap.elementEnvironment;
-
-  @override
-  CommonElements get commonElements => elementMap.commonElements;
-
-  @override
-  NativeBehavior computeNativeFieldStoreBehavior(covariant KField field) {
-    ir.Field node = elementMap.getMemberNode(field);
-    return elementMap.getNativeBehaviorForFieldStore(node);
+  void resolveNativeMember(MemberEntity element) {
+    bool isJsInterop = _isJsInteropMember(element);
+    if (element.isFunction ||
+        element.isConstructor ||
+        element.isGetter ||
+        element.isSetter) {
+      FunctionEntity method = element;
+      bool isNative = _processMethodAnnotations(method);
+      if (isNative || isJsInterop) {
+        NativeBehavior behavior =
+            _computeNativeMethodBehavior(method, isJsInterop: isJsInterop);
+        _nativeDataBuilder.setNativeMethodBehavior(method, behavior);
+      }
+    } else if (element.isField) {
+      FieldEntity field = element;
+      bool isNative = _processFieldAnnotations(field);
+      if (isNative || isJsInterop) {
+        NativeBehavior fieldLoadBehavior =
+            _computeNativeFieldLoadBehavior(field, isJsInterop: isJsInterop);
+        NativeBehavior fieldStoreBehavior =
+            _computeNativeFieldStoreBehavior(field);
+        _nativeDataBuilder.setNativeFieldLoadBehavior(field, fieldLoadBehavior);
+        _nativeDataBuilder.setNativeFieldStoreBehavior(
+            field, fieldStoreBehavior);
+      }
+    }
   }
 
-  @override
-  NativeBehavior computeNativeFieldLoadBehavior(covariant KField field,
+  /// Process the potentially native [field]. Adds information from metadata
+  /// attributes. Returns `true` of [method] is native.
+  bool _processFieldAnnotations(covariant FieldEntity element) {
+    if (element.isInstanceMember &&
+        _nativeBasicData.isNativeClass(element.enclosingClass)) {
+      // Exclude non-instance (static) fields - they are not really native and
+      // are compiled as isolate globals.  Access of a property of a constructor
+      // function or a non-method property in the prototype chain, must be coded
+      // using a JS-call.
+      _setNativeName(element);
+      return true;
+    } else {
+      String name = _findJsNameFromAnnotation(element);
+      if (name != null) {
+        failedAt(
+            element,
+            '@JSName(...) annotation is not supported for static fields: '
+            '$element.');
+      }
+    }
+    return false;
+  }
+
+  /// Process the potentially native [method]. Adds information from metadata
+  /// attributes. Returns `true` of [method] is native.
+  bool _processMethodAnnotations(covariant FunctionEntity method) {
+    if (_isNativeMethod(method)) {
+      if (method.isStatic) {
+        _setNativeNameForStaticMethod(method);
+      } else {
+        _setNativeName(method);
+      }
+      return true;
+    }
+    return false;
+  }
+
+  /// Sets the native name of [element], either from an annotation, or
+  /// defaulting to the Dart name.
+  void _setNativeName(MemberEntity element) {
+    String name = _findJsNameFromAnnotation(element);
+    if (name == null) name = element.name;
+    _nativeDataBuilder.setNativeMemberName(element, name);
+  }
+
+  /// Sets the native name of the static native method [element], using the
+  /// following rules:
+  /// 1. If [element] has a @JSName annotation that is an identifier, qualify
+  ///    that identifier to the @Native name of the enclosing class
+  /// 2. If [element] has a @JSName annotation that is not an identifier,
+  ///    use the declared @JSName as the expression
+  /// 3. If [element] does not have a @JSName annotation, qualify the name of
+  ///    the method with the @Native name of the enclosing class.
+  void _setNativeNameForStaticMethod(FunctionEntity element) {
+    String name = _findJsNameFromAnnotation(element);
+    if (name == null) name = element.name;
+    if (_isIdentifier(name)) {
+      List<String> nativeNames =
+          _nativeBasicData.getNativeTagsOfClass(element.enclosingClass);
+      if (nativeNames.length != 1) {
+        failedAt(
+            element,
+            'Unable to determine a native name for the enclosing class, '
+            'options: $nativeNames');
+      }
+      _nativeDataBuilder.setNativeMemberName(
+          element, '${nativeNames[0]}.$name');
+    } else {
+      _nativeDataBuilder.setNativeMemberName(element, name);
+    }
+  }
+
+  bool _isIdentifier(String s) => _identifier.hasMatch(s);
+
+  /// Returns the JSName annotation string or `null` if no JSName annotation is
+  /// present.
+  String _findJsNameFromAnnotation(MemberEntity element) {
+    String jsName = null;
+    for (ConstantValue value
+        in _elementEnvironment.getMemberMetadata(element)) {
+      String name = readAnnotationName(
+          element, value, _commonElements.annotationJSNameClass);
+      if (jsName == null) {
+        jsName = name;
+      } else if (name != null) {
+        failedAt(element, 'Too many JSName annotations: ${value.toDartText()}');
+      }
+    }
+    return jsName;
+  }
+
+  NativeBehavior _computeNativeFieldStoreBehavior(covariant KField field) {
+    ir.Field node = _elementMap.getMemberNode(field);
+    return _elementMap.getNativeBehaviorForFieldStore(node);
+  }
+
+  NativeBehavior _computeNativeFieldLoadBehavior(covariant KField field,
       {bool isJsInterop}) {
-    ir.Field node = elementMap.getMemberNode(field);
-    return elementMap.getNativeBehaviorForFieldLoad(node,
+    ir.Field node = _elementMap.getMemberNode(field);
+    return _elementMap.getNativeBehaviorForFieldLoad(node,
         isJsInterop: isJsInterop);
   }
 
-  @override
-  NativeBehavior computeNativeMethodBehavior(covariant KFunction function,
+  NativeBehavior _computeNativeMethodBehavior(covariant KFunction function,
       {bool isJsInterop}) {
-    ir.Member node = elementMap.getMemberNode(function);
-    return elementMap.getNativeBehaviorForMethod(node,
+    ir.Member node = _elementMap.getMemberNode(function);
+    return _elementMap.getNativeBehaviorForMethod(node,
         isJsInterop: isJsInterop);
   }
 
-  @override
-  bool isNativeMethod(covariant KFunction function) {
+  bool _isNativeMethod(covariant KFunction function) {
     if (!maybeEnableNative(function.library.canonicalUri)) return false;
-    ir.Member node = elementMap.getMemberNode(function);
+    ir.Member node = _elementMap.getMemberNode(function);
     return node.annotations.any((ir.Expression expression) {
       return expression is ir.ConstructorInvocation &&
-          elementMap.getInterfaceType(expression.constructedType) ==
-              commonElements.externalNameType;
+          _elementMap.getInterfaceType(expression.constructedType) ==
+              _commonElements.externalNameType;
     });
   }
 
-  @override
-  bool isJsInteropMember(MemberEntity element) {
-    return nativeBasicData.isJsInteropMember(element);
+  bool _isJsInteropMember(MemberEntity element) {
+    return _nativeBasicData.isJsInteropMember(element);
   }
 }
 
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index 7ed64b3..a721968 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -827,20 +827,10 @@
 
   ConstantExpression getFieldConstantExpression(
       KernelToElementMapImpl elementMap);
-
-  /// Return the [ConstantValue] the initial value of [field] or `null` if
-  /// the initializer is not a constant expression.
-  ConstantValue getFieldConstantValue(KernelToElementMapImpl elementMap);
-
-  bool hasConstantFieldInitializer(KernelToElementMapImpl elementMap);
-
-  ConstantValue getConstantFieldInitializer(KernelToElementMapImpl elementMap);
 }
 
 class KFieldDataImpl extends KMemberDataImpl implements KFieldData {
   DartType _type;
-  bool _isConstantComputed = false;
-  ConstantValue _constantValue;
   ConstantExpression _constantExpression;
 
   KFieldDataImpl(ir.Field node) : super(node);
@@ -868,33 +858,6 @@
   }
 
   @override
-  ConstantValue getFieldConstantValue(KernelToElementMapImpl elementMap) {
-    if (!_isConstantComputed) {
-      _constantValue = elementMap.getConstantValue(node.initializer,
-          requireConstant: node.isConst, implicitNull: !node.isConst);
-      _isConstantComputed = true;
-    }
-    return _constantValue;
-  }
-
-  @override
-  bool hasConstantFieldInitializer(KernelToElementMapImpl elementMap) {
-    return getFieldConstantValue(elementMap) != null;
-  }
-
-  @override
-  ConstantValue getConstantFieldInitializer(KernelToElementMapImpl elementMap) {
-    ConstantValue value = getFieldConstantValue(elementMap);
-    assert(
-        value != null,
-        failedAt(
-            computeSourceSpanFromTreeNode(node),
-            "Field ${node} doesn't have a "
-            "constant initial value."));
-    return value;
-  }
-
-  @override
   ClassTypeVariableAccess get classTypeVariableAccess {
     if (node.isInstanceMember) return ClassTypeVariableAccess.instanceField;
     return ClassTypeVariableAccess.none;
diff --git a/pkg/compiler/lib/src/kernel/kelements.dart b/pkg/compiler/lib/src/kernel/kelements.dart
index ce9a04a..2f1a8f5 100644
--- a/pkg/compiler/lib/src/kernel/kelements.dart
+++ b/pkg/compiler/lib/src/kernel/kelements.dart
@@ -169,25 +169,6 @@
   bool get isGenerativeConstructor => false;
 }
 
-class KConstructorBody extends KFunction implements ConstructorBodyEntity {
-  final ConstructorEntity constructor;
-
-  KConstructorBody(this.constructor)
-      : super(
-            constructor.library,
-            constructor.enclosingClass,
-            constructor.memberName,
-            constructor.parameterStructure,
-            AsyncMarker.SYNC,
-            isStatic: false,
-            isExternal: false);
-
-  @override
-  bool get isFunction => true;
-
-  String get _kind => 'constructor_body';
-}
-
 class KMethod extends KFunction {
   final bool isAbstract;
 
diff --git a/pkg/compiler/lib/src/kernel/kernel_impact.dart b/pkg/compiler/lib/src/kernel/kernel_impact.dart
index 4853aab..f65c5d6 100644
--- a/pkg/compiler/lib/src/kernel/kernel_impact.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_impact.dart
@@ -231,7 +231,10 @@
   @override
   void registerSetLiteral(ir.DartType elementType,
       {bool isConst, bool isEmpty}) {
-    // TODO(johnniwinther,fishythefish): Register set literals.
+    impactBuilder.registerSetLiteral(new SetLiteralUse(
+        commonElements.setType(elementMap.getDartType(elementType)),
+        isConstant: isConst,
+        isEmpty: isEmpty));
   }
 
   @override
@@ -730,6 +733,13 @@
   }
 
   @override
+  void registerConstant(ir.ConstantExpression node) {
+    // ignore: unused_local_variable
+    ConstantValue value = elementMap.getConstantValue(node);
+    // TODO(johnniwinther,fishythefish): Register the constant.
+  }
+
+  @override
   void registerLoadLibrary() {
     impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
         commonElements.loadDeferredLibrary, CallStructure.ONE_ARG));
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 32d2c7a..7feda83 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -17,10 +17,11 @@
 import '../enqueue.dart';
 import '../environment.dart' as env;
 import '../frontend_strategy.dart';
+import '../ir/annotations.dart';
 import '../ir/closure.dart' show ClosureScopeModel;
 import '../ir/scope.dart' show ScopeModel;
 import '../js_backend/annotations.dart';
-import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
+import '../js_backend/field_analysis.dart' show KFieldAnalysis;
 import '../js_backend/backend_usage.dart';
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/native_data.dart';
@@ -46,7 +47,7 @@
   KernelToElementMapImpl _elementMap;
   RuntimeTypesNeedBuilder _runtimeTypesNeedBuilder;
 
-  KernelAnnotationProcessor _annotationProcesser;
+  KernelAnnotationProcessor _annotationProcessor;
 
   final Map<MemberEntity, ClosureScopeModel> closureModels = {};
 
@@ -60,6 +61,8 @@
   @override
   void registerLoadedLibraries(KernelResult kernelResult) {
     _elementMap.addComponent(kernelResult.component);
+    _annotationProcessor = new KernelAnnotationProcessor(elementMap,
+        nativeBasicDataBuilder, processAnnotations(kernelResult.component));
   }
 
   @override
@@ -73,8 +76,11 @@
   KernelToElementMap get elementMap => _elementMap;
 
   @override
-  AnnotationProcessor get annotationProcesser => _annotationProcesser ??=
-      new KernelAnnotationProcessor(elementMap, nativeBasicDataBuilder);
+  AnnotationProcessor get annotationProcessor {
+    assert(_annotationProcessor != null,
+        "AnnotationProcessor has not been created.");
+    return _annotationProcessor;
+  }
 
   @override
   DeferredLoadTask createDeferredLoadTask(Compiler compiler) =>
@@ -112,7 +118,7 @@
       InterceptorDataBuilder interceptorDataBuilder,
       BackendUsageBuilder backendUsageBuilder,
       RuntimeTypesNeedBuilder rtiNeedBuilder,
-      KAllocatorAnalysis allocatorAnalysis,
+      KFieldAnalysis allocatorAnalysis,
       NativeResolutionEnqueuer nativeResolutionEnqueuer,
       NoSuchMethodRegistry noSuchMethodRegistry,
       AnnotationsDataBuilder annotationsDataBuilder,
@@ -145,7 +151,8 @@
       NativeDataBuilder nativeDataBuilder,
       AnnotationsDataBuilder annotationsDataBuilder,
       ImpactTransformer impactTransformer,
-      Map<Entity, WorldImpact> impactCache) {
+      Map<Entity, WorldImpact> impactCache,
+      KFieldAnalysis fieldAnalysis) {
     return new KernelWorkItemBuilder(
         _compilerTask,
         elementMap,
@@ -154,7 +161,8 @@
         annotationsDataBuilder,
         impactTransformer,
         closureModels,
-        impactCache);
+        impactCache,
+        fieldAnalysis);
   }
 
   ClassQueries createClassQueries() {
@@ -173,8 +181,9 @@
   final ImpactTransformer _impactTransformer;
   final NativeMemberResolver _nativeMemberResolver;
   final AnnotationsDataBuilder _annotationsDataBuilder;
-  final Map<MemberEntity, ClosureScopeModel> closureModels;
-  final Map<Entity, WorldImpact> impactCache;
+  final Map<MemberEntity, ClosureScopeModel> _closureModels;
+  final Map<Entity, WorldImpact> _impactCache;
+  final KFieldAnalysis _fieldAnalysis;
 
   KernelWorkItemBuilder(
       this._compilerTask,
@@ -183,8 +192,9 @@
       NativeDataBuilder nativeDataBuilder,
       this._annotationsDataBuilder,
       this._impactTransformer,
-      this.closureModels,
-      this.impactCache)
+      this._closureModels,
+      this._impactCache,
+      this._fieldAnalysis)
       : _nativeMemberResolver = new KernelNativeMemberResolver(
             _elementMap, nativeBasicData, nativeDataBuilder);
 
@@ -197,8 +207,9 @@
         _nativeMemberResolver,
         _annotationsDataBuilder,
         entity,
-        closureModels,
-        impactCache);
+        _closureModels,
+        _impactCache,
+        _fieldAnalysis);
   }
 }
 
@@ -209,8 +220,9 @@
   final NativeMemberResolver _nativeMemberResolver;
   final AnnotationsDataBuilder _annotationsDataBuilder;
   final MemberEntity element;
-  final Map<MemberEntity, ClosureScopeModel> closureModels;
-  final Map<Entity, WorldImpact> impactCache;
+  final Map<MemberEntity, ClosureScopeModel> _closureModels;
+  final Map<Entity, WorldImpact> _impactCache;
+  final KFieldAnalysis _fieldAnalysis;
 
   KernelWorkItem(
       this._compilerTask,
@@ -219,14 +231,16 @@
       this._nativeMemberResolver,
       this._annotationsDataBuilder,
       this.element,
-      this.closureModels,
-      this.impactCache);
+      this._closureModels,
+      this._impactCache,
+      this._fieldAnalysis);
 
   @override
   WorldImpact run() {
     return _compilerTask.measure(() {
       _nativeMemberResolver.resolveNativeMember(element);
       Set<PragmaAnnotation> annotations = processMemberAnnotations(
+          _elementMap.options,
           _elementMap.reporter,
           _elementMap.commonElements,
           _elementMap.elementEnvironment,
@@ -235,7 +249,11 @@
       ScopeModel scopeModel = _compilerTask.measureSubtask('closures', () {
         ScopeModel scopeModel = _elementMap.computeScopeModel(element);
         if (scopeModel?.closureScopeModel != null) {
-          closureModels[element] = scopeModel.closureScopeModel;
+          _closureModels[element] = scopeModel.closureScopeModel;
+        }
+        if (element.isField && !element.isInstanceMember) {
+          _fieldAnalysis.registerStaticField(
+              element, scopeModel?.initializerComplexity);
         }
         return scopeModel;
       });
@@ -244,8 +262,8 @@
             element, scopeModel?.variableScopeModel, annotations);
         WorldImpact worldImpact =
             _impactTransformer.transformResolutionImpact(impact);
-        if (impactCache != null) {
-          impactCache[element] = worldImpact;
+        if (_impactCache != null) {
+          _impactCache[element] = worldImpact;
         }
         return worldImpact;
       });
diff --git a/pkg/compiler/lib/src/kernel/kernel_world.dart b/pkg/compiler/lib/src/kernel/kernel_world.dart
index 1167b48..673ba75 100644
--- a/pkg/compiler/lib/src/kernel/kernel_world.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_world.dart
@@ -8,7 +8,7 @@
 
 import '../elements/types.dart';
 import '../js_backend/annotations.dart';
-import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
+import '../js_backend/field_analysis.dart' show KFieldAnalysis;
 import '../js_backend/backend_usage.dart';
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/native_data.dart';
@@ -43,7 +43,7 @@
 
   /// Members that are written either directly or through a setter selector.
   final Iterable<MemberEntity> assignedInstanceMembers;
-  final KAllocatorAnalysis allocatorAnalysis;
+  final KFieldAnalysis fieldAnalysis;
 
   final Iterable<ClassEntity> liveNativeClasses;
 
@@ -66,7 +66,7 @@
       this.noSuchMethodData,
       ResolutionWorldBuilder resolutionWorldBuilder,
       RuntimeTypesNeedBuilder rtiNeedBuilder,
-      this.allocatorAnalysis,
+      this.fieldAnalysis,
       Set<ClassEntity> implementedClasses,
       this.liveNativeClasses,
       this.liveInstanceMembers,
diff --git a/pkg/compiler/lib/src/kernel/native_basic_data.dart b/pkg/compiler/lib/src/kernel/native_basic_data.dart
index 5aa12e1..8bcc052 100644
--- a/pkg/compiler/lib/src/kernel/native_basic_data.dart
+++ b/pkg/compiler/lib/src/kernel/native_basic_data.dart
@@ -8,22 +8,29 @@
 class KernelAnnotationProcessor implements AnnotationProcessor {
   final KernelToElementMapImpl elementMap;
   final NativeBasicDataBuilder _nativeBasicDataBuilder;
+  final IrAnnotationData annotationData;
 
-  KernelAnnotationProcessor(this.elementMap, this._nativeBasicDataBuilder);
+  KernelAnnotationProcessor(
+      this.elementMap, this._nativeBasicDataBuilder, this.annotationData);
 
   void extractNativeAnnotations(LibraryEntity library) {
     KElementEnvironment elementEnvironment = elementMap.elementEnvironment;
     KCommonElements commonElements = elementMap.commonElements;
 
     elementEnvironment.forEachClass(library, (ClassEntity cls) {
-      String annotationName;
-      for (ConstantValue value in elementEnvironment.getClassMetadata(cls)) {
-        String name = readAnnotationName(
-            cls, value, commonElements.nativeAnnotationClass);
-        if (annotationName == null) {
-          annotationName = name;
-        } else if (name != null) {
-          failedAt(cls, 'Too many name annotations.');
+      ir.Class node = elementMap.getClassNode(cls);
+      String annotationName = annotationData.getNativeClassName(node);
+      if (annotationName == null) {
+        // TODO(johnniwinther): Remove this branch when we use constants from
+        // CFE.
+        for (ConstantValue value in elementEnvironment.getClassMetadata(cls)) {
+          String name = readAnnotationName(
+              cls, value, commonElements.nativeAnnotationClass);
+          if (annotationName == null) {
+            annotationName = name;
+          } else if (name != null) {
+            failedAt(cls, 'Too many name annotations.');
+          }
         }
       }
       if (annotationName != null) {
@@ -64,13 +71,19 @@
     KElementEnvironment elementEnvironment = elementMap.elementEnvironment;
     KCommonElements commonElements = elementMap.commonElements;
 
-    String libraryName = getJsInteropName(
+    ir.Library libraryNode = elementMap.getLibraryNode(library);
+    String libraryName = annotationData.getJsInteropLibraryName(libraryNode);
+    // TODO(johnniwinther): Remove this when we use constants from CFE.
+    libraryName ??= getJsInteropName(
         library, elementEnvironment.getLibraryMetadata(library));
     final bool isExplicitlylyJsLibrary = libraryName != null;
     bool isJsLibrary = isExplicitlylyJsLibrary;
 
     elementEnvironment.forEachLibraryMember(library, (MemberEntity member) {
-      String memberName = getJsInteropName(
+      ir.Member memberNode = elementMap.getMemberNode(member);
+      String memberName = annotationData.getJsInteropMemberName(memberNode);
+      // TODO(johnniwinther): Remove this when we use constants from CFE.
+      memberName ??= getJsInteropName(
           library, elementEnvironment.getMemberMetadata(member));
       if (member.isField) {
         if (memberName != null) {
@@ -106,15 +119,22 @@
     });
 
     elementEnvironment.forEachClass(library, (ClassEntity cls) {
+      ir.Class classNode = elementMap.getClassNode(cls);
+      String className = annotationData.getJsInteropClassName(classNode);
       Iterable<ConstantValue> metadata =
           elementEnvironment.getClassMetadata(cls);
-      String className = getJsInteropName(cls, metadata);
+      // TODO(johnniwinther): Remove this when we use constants from CFE.
+      className ??= getJsInteropName(cls, metadata);
       if (className != null) {
-        bool isAnonymous = false;
-        for (ConstantValue value in metadata) {
-          if (isAnnotation(cls, value, commonElements.jsAnonymousClass)) {
-            isAnonymous = true;
-            break;
+        bool isAnonymous = annotationData.isAnonymousJsInteropClass(classNode);
+        if (!isAnonymous) {
+          // TODO(johnniwinther): Remove this branch when we use constants from
+          // CFE.
+          for (ConstantValue value in metadata) {
+            if (isAnnotation(cls, value, commonElements.jsAnonymousClass)) {
+              isAnonymous = true;
+              break;
+            }
           }
         }
         // TODO(johnniwinther): Report an error if the class is anonymous but
@@ -132,7 +152,11 @@
                 member, MessageKind.IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED);*/
           } else {
             FunctionEntity function = member;
-            String memberName = getJsInteropName(
+            ir.Member memberNode = elementMap.getMemberNode(member);
+            String memberName =
+                annotationData.getJsInteropMemberName(memberNode);
+            // TODO(johnniwinther): Remove this when we use constants from CFE.
+            memberName ??= getJsInteropName(
                 library, elementEnvironment.getMemberMetadata(function));
 
             if (function.isExternal) {
@@ -253,9 +277,11 @@
       // before a superclass that has not yet had "markJsInteropClass" called on
       // it.
       elementEnvironment.forEachClass(library, (ClassEntity cls) {
-        Iterable<ConstantValue> metadata =
-            elementEnvironment.getClassMetadata(cls);
-        String className = getJsInteropName(cls, metadata);
+        ir.Class classNode = elementMap.getClassNode(cls);
+        String className = annotationData.getJsInteropClassName(classNode);
+        // TODO(johnniwinther): Remove this when we use constants from CFE.
+        className ??=
+            getJsInteropName(cls, elementEnvironment.getClassMetadata(cls));
         if (className != null) {
           bool implementsJsJavaScriptObjectClass = false;
           elementEnvironment.forEachSupertype(cls, (InterfaceType supertype) {
diff --git a/pkg/compiler/lib/src/native/resolver.dart b/pkg/compiler/lib/src/native/resolver.dart
index f621d9e..2b4ad8a 100644
--- a/pkg/compiler/lib/src/native/resolver.dart
+++ b/pkg/compiler/lib/src/native/resolver.dart
@@ -3,11 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import '../common.dart';
-import '../common_elements.dart' show CommonElements, KElementEnvironment;
+import '../common_elements.dart' show KElementEnvironment;
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../js_backend/native_data.dart';
-import 'behavior.dart';
 
 /// Interface for computing native members.
 abstract class NativeMemberResolver {
@@ -15,140 +14,6 @@
   void resolveNativeMember(MemberEntity element);
 }
 
-abstract class NativeMemberResolverBase implements NativeMemberResolver {
-  static final RegExp _identifier = new RegExp(r'^[a-zA-Z_$][a-zA-Z0-9_$]*$');
-
-  KElementEnvironment get elementEnvironment;
-  CommonElements get commonElements;
-  NativeBasicData get nativeBasicData;
-  NativeDataBuilder get nativeDataBuilder;
-
-  bool isJsInteropMember(covariant MemberEntity element);
-  bool isNativeMethod(covariant FunctionEntity element);
-
-  NativeBehavior computeNativeMethodBehavior(covariant FunctionEntity function,
-      {bool isJsInterop});
-  NativeBehavior computeNativeFieldLoadBehavior(covariant FieldEntity field,
-      {bool isJsInterop});
-  NativeBehavior computeNativeFieldStoreBehavior(covariant FieldEntity field);
-
-  @override
-  void resolveNativeMember(MemberEntity element) {
-    bool isJsInterop = isJsInteropMember(element);
-    if (element.isFunction ||
-        element.isConstructor ||
-        element.isGetter ||
-        element.isSetter) {
-      FunctionEntity method = element;
-      bool isNative = _processMethodAnnotations(method);
-      if (isNative || isJsInterop) {
-        NativeBehavior behavior =
-            computeNativeMethodBehavior(method, isJsInterop: isJsInterop);
-        nativeDataBuilder.setNativeMethodBehavior(method, behavior);
-      }
-    } else if (element.isField) {
-      FieldEntity field = element;
-      bool isNative = _processFieldAnnotations(field);
-      if (isNative || isJsInterop) {
-        NativeBehavior fieldLoadBehavior =
-            computeNativeFieldLoadBehavior(field, isJsInterop: isJsInterop);
-        NativeBehavior fieldStoreBehavior =
-            computeNativeFieldStoreBehavior(field);
-        nativeDataBuilder.setNativeFieldLoadBehavior(field, fieldLoadBehavior);
-        nativeDataBuilder.setNativeFieldStoreBehavior(
-            field, fieldStoreBehavior);
-      }
-    }
-  }
-
-  /// Process the potentially native [field]. Adds information from metadata
-  /// attributes. Returns `true` of [method] is native.
-  bool _processFieldAnnotations(covariant FieldEntity element) {
-    if (element.isInstanceMember &&
-        nativeBasicData.isNativeClass(element.enclosingClass)) {
-      // Exclude non-instance (static) fields - they are not really native and
-      // are compiled as isolate globals.  Access of a property of a constructor
-      // function or a non-method property in the prototype chain, must be coded
-      // using a JS-call.
-      _setNativeName(element);
-      return true;
-    } else {
-      String name = _findJsNameFromAnnotation(element);
-      if (name != null) {
-        failedAt(element,
-            '@JSName(...) annotation is not supported for static fields.');
-      }
-    }
-    return false;
-  }
-
-  /// Process the potentially native [method]. Adds information from metadata
-  /// attributes. Returns `true` of [method] is native.
-  bool _processMethodAnnotations(covariant FunctionEntity method) {
-    if (isNativeMethod(method)) {
-      if (method.isStatic) {
-        _setNativeNameForStaticMethod(method);
-      } else {
-        _setNativeName(method);
-      }
-      return true;
-    }
-    return false;
-  }
-
-  /// Sets the native name of [element], either from an annotation, or
-  /// defaulting to the Dart name.
-  void _setNativeName(MemberEntity element) {
-    String name = _findJsNameFromAnnotation(element);
-    if (name == null) name = element.name;
-    nativeDataBuilder.setNativeMemberName(element, name);
-  }
-
-  /// Sets the native name of the static native method [element], using the
-  /// following rules:
-  /// 1. If [element] has a @JSName annotation that is an identifier, qualify
-  ///    that identifier to the @Native name of the enclosing class
-  /// 2. If [element] has a @JSName annotation that is not an identifier,
-  ///    use the declared @JSName as the expression
-  /// 3. If [element] does not have a @JSName annotation, qualify the name of
-  ///    the method with the @Native name of the enclosing class.
-  void _setNativeNameForStaticMethod(FunctionEntity element) {
-    String name = _findJsNameFromAnnotation(element);
-    if (name == null) name = element.name;
-    if (_isIdentifier(name)) {
-      List<String> nativeNames =
-          nativeBasicData.getNativeTagsOfClass(element.enclosingClass);
-      if (nativeNames.length != 1) {
-        failedAt(
-            element,
-            'Unable to determine a native name for the enclosing class, '
-            'options: $nativeNames');
-      }
-      nativeDataBuilder.setNativeMemberName(element, '${nativeNames[0]}.$name');
-    } else {
-      nativeDataBuilder.setNativeMemberName(element, name);
-    }
-  }
-
-  bool _isIdentifier(String s) => _identifier.hasMatch(s);
-
-  /// Returns the JSName annotation string or `null` if no JSName annotation is
-  /// present.
-  String _findJsNameFromAnnotation(MemberEntity element) {
-    String jsName = null;
-    for (ConstantValue value in elementEnvironment.getMemberMetadata(element)) {
-      String name = readAnnotationName(
-          element, value, commonElements.annotationJSNameClass);
-      if (jsName == null) {
-        jsName = name;
-      } else if (name != null) {
-        failedAt(element, 'Too many JSName annotations: ${value.toDartText()}');
-      }
-    }
-    return jsName;
-  }
-}
-
 /// Determines all native classes in a set of libraries.
 abstract class NativeClassFinder {
   /// Returns the set of all native classes declared in [libraries].
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 89e4c55..c9c8862 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -66,6 +66,15 @@
   /// [outputUri].
   bool cfeOnly = false;
 
+  /// Flag only meant for dart2js developers to iterate on global inference
+  /// changes.
+  ///
+  /// When working on large apps this flag allows to load serialized data for
+  /// the app (via --read-data), reuse its closed world, and rerun the global
+  /// inference phase (even though the serialized data already contains a global
+  /// inference result).
+  bool debugGlobalInference = false;
+
   /// Resolved constant "environment" values passed to the compiler via the `-D`
   /// flags.
   Map<String, String> environment = const <String, String>{};
@@ -152,12 +161,15 @@
   /// Whether to disable optimization for need runtime type information.
   bool disableRtiOptimization = false;
 
-  /// Whether to emit a .json file with a summary of the information used by the
-  /// compiler during optimization. This includes resolution details,
-  /// dependencies between elements, results of type inference, and the output
-  /// code for each function.
+  /// Whether to emit a summary of the information used by the compiler during
+  /// optimization. This includes resolution details, dependencies between
+  /// elements, results of type inference, and data about generated code.
   bool dumpInfo = false;
 
+  /// Whether to use the new dump-info binary format. This will be the default
+  /// after a transitional period.
+  bool useDumpInfoBinaryFormat = false;
+
   /// Whether we allow passing an extra argument to `assert`, containing a
   /// reason for why an assertion fails. (experimental)
   ///
@@ -191,7 +203,7 @@
   /// Whether to generate a source-map file together with the output program.
   bool generateSourceMap = true;
 
-  /// URI of the main output if the compiler is generating source maps.
+  /// URI of the main output of the compiler.
   Uri outputUri;
 
   /// Location of the libraries specification file.
@@ -265,9 +277,6 @@
   /// This is an experimental feature.
   bool experimentalTrackAllocations = false;
 
-  /// Expermental optimization.
-  bool experimentLocalNames = false;
-
   /// Experimental part file function generation.
   bool experimentStartupFunctions = false;
 
@@ -325,6 +334,8 @@
       ..disableRtiOptimization =
           _hasOption(options, Flags.disableRtiOptimization)
       ..dumpInfo = _hasOption(options, Flags.dumpInfo)
+      ..useDumpInfoBinaryFormat =
+          _hasOption(options, "${Flags.dumpInfo}=binary")
       ..enableExperimentalMirrors =
           _hasOption(options, Flags.enableExperimentalMirrors)
       ..enableMinification = _hasOption(options, Flags.minify)
@@ -337,7 +348,6 @@
           _hasOption(options, Flags.experimentalTrackAllocations)
       ..experimentalAllocationsPath = _extractStringOption(
           options, "${Flags.experimentalAllocationsPath}=", null)
-      ..experimentLocalNames = _hasOption(options, Flags.experimentLocalNames)
       ..experimentStartupFunctions =
           _hasOption(options, Flags.experimentStartupFunctions)
       ..experimentToBoolean = _hasOption(options, Flags.experimentToBoolean)
@@ -368,7 +378,8 @@
       ..showInternalProgress = _hasOption(options, Flags.progress)
       ..readDataUri = _extractUriOption(options, '${Flags.readData}=')
       ..writeDataUri = _extractUriOption(options, '${Flags.writeData}=')
-      ..cfeOnly = _hasOption(options, Flags.cfeOnly);
+      ..cfeOnly = _hasOption(options, Flags.cfeOnly)
+      ..debugGlobalInference = _hasOption(options, Flags.debugGlobalInference);
   }
 
   void validate() {
diff --git a/pkg/compiler/lib/src/resolution/registry.dart b/pkg/compiler/lib/src/resolution/registry.dart
index 18f373a..853beb3 100644
--- a/pkg/compiler/lib/src/resolution/registry.dart
+++ b/pkg/compiler/lib/src/resolution/registry.dart
@@ -17,6 +17,7 @@
   final String name;
   EnumSet<Feature> _features;
   Setlet<MapLiteralUse> _mapLiterals;
+  Setlet<SetLiteralUse> _setLiterals;
   Setlet<ListLiteralUse> _listLiterals;
   Setlet<String> _constSymbolNames;
   Setlet<ConstantExpression> _constantLiterals;
@@ -41,6 +42,16 @@
     return _mapLiterals != null ? _mapLiterals : const <MapLiteralUse>[];
   }
 
+  void registerSetLiteral(SetLiteralUse setLiteralUse) {
+    assert(setLiteralUse != null);
+    _setLiterals ??= new Setlet<SetLiteralUse>();
+    _setLiterals.add(setLiteralUse);
+  }
+
+  @override
+  Iterable<SetLiteralUse> get setLiterals =>
+      _setLiterals ?? const <SetLiteralUse>[];
+
   void registerListLiteral(ListLiteralUse listLiteralUse) {
     assert(listLiteralUse != null);
     _listLiterals ??= new Setlet<ListLiteralUse>();
@@ -145,6 +156,12 @@
         sb.write('\n  $use');
       }
     }
+    if (_setLiterals != null) {
+      sb.write('\n set-literals:');
+      for (SetLiteralUse use in _setLiterals) {
+        sb.write('\n  $use');
+      }
+    }
     if (_listLiterals != null) {
       sb.write('\n list-literals:');
       for (ListLiteralUse use in _listLiterals) {
diff --git a/pkg/compiler/lib/src/serialization/abstract_sink.dart b/pkg/compiler/lib/src/serialization/abstract_sink.dart
index d63db8f..0c95e75 100644
--- a/pkg/compiler/lib/src/serialization/abstract_sink.dart
+++ b/pkg/compiler/lib/src/serialization/abstract_sink.dart
@@ -395,11 +395,18 @@
         writeDartType(constant.type);
         writeConstants(constant.entries);
         break;
-      case ConstantValueKind.MAP:
-        MapConstantValue constant = value;
+      case ConstantValueKind.SET:
+        constant_system.JavaScriptSetConstant constant = value;
         writeDartType(constant.type);
-        writeConstants(constant.keys);
+        writeConstant(constant.entries);
+        break;
+      case ConstantValueKind.MAP:
+        constant_system.JavaScriptMapConstant constant = value;
+        writeDartType(constant.type);
+        writeConstant(constant.keyList);
         writeConstants(constant.values);
+        writeConstantOrNull(constant.protoValue);
+        writeBool(constant.onlyStringKeys);
         break;
       case ConstantValueKind.CONSTRUCTED:
         ConstructedConstantValue constant = value;
diff --git a/pkg/compiler/lib/src/serialization/abstract_source.dart b/pkg/compiler/lib/src/serialization/abstract_source.dart
index 792ae23..a78fbea 100644
--- a/pkg/compiler/lib/src/serialization/abstract_source.dart
+++ b/pkg/compiler/lib/src/serialization/abstract_source.dart
@@ -457,11 +457,18 @@
         DartType type = readDartType();
         List<ConstantValue> entries = readConstants();
         return new ListConstantValue(type, entries);
+      case ConstantValueKind.SET:
+        DartType type = readDartType();
+        MapConstantValue entries = readConstant();
+        return new constant_system.JavaScriptSetConstant(type, entries);
       case ConstantValueKind.MAP:
         DartType type = readDartType();
-        List<ConstantValue> keys = readConstants();
+        ListConstantValue keyList = readConstant();
         List<ConstantValue> values = readConstants();
-        return new MapConstantValue(type, keys, values);
+        ConstantValue protoValue = readConstantOrNull();
+        bool onlyStringKeys = readBool();
+        return new constant_system.JavaScriptMapConstant(
+            type, keyList, values, protoValue, onlyStringKeys);
       case ConstantValueKind.CONSTRUCTED:
         InterfaceType type = readDartType();
         Map<FieldEntity, ConstantValue> fields =
diff --git a/pkg/compiler/lib/src/serialization/mixins.dart b/pkg/compiler/lib/src/serialization/mixins.dart
index be891a1..385c282 100644
--- a/pkg/compiler/lib/src/serialization/mixins.dart
+++ b/pkg/compiler/lib/src/serialization/mixins.dart
@@ -256,6 +256,15 @@
   }
 
   @override
+  ConstantValue readConstantOrNull() {
+    bool hasClass = readBool();
+    if (hasClass) {
+      return readConstant();
+    }
+    return null;
+  }
+
+  @override
   List<E> readConstants<E extends ConstantValue>({bool emptyAsNull: false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -611,6 +620,14 @@
   }
 
   @override
+  void writeConstantOrNull(ConstantValue value) {
+    writeBool(value != null);
+    if (value != null) {
+      writeConstant(value);
+    }
+  }
+
+  @override
   void writeConstants(Iterable<ConstantValue> values, {bool allowNull: false}) {
     if (values == null) {
       assert(allowNull);
diff --git a/pkg/compiler/lib/src/serialization/node_indexer.dart b/pkg/compiler/lib/src/serialization/node_indexer.dart
index 7087849..f54ac9c 100644
--- a/pkg/compiler/lib/src/serialization/node_indexer.dart
+++ b/pkg/compiler/lib/src/serialization/node_indexer.dart
@@ -93,6 +93,12 @@
   }
 
   @override
+  void visitSetLiteral(ir.SetLiteral node) {
+    registerNode(node);
+    super.visitSetLiteral(node);
+  }
+
+  @override
   void visitMapLiteral(ir.MapLiteral node) {
     registerNode(node);
     super.visitMapLiteral(node);
diff --git a/pkg/compiler/lib/src/serialization/serialization.dart b/pkg/compiler/lib/src/serialization/serialization.dart
index c4dab5a..b974951 100644
--- a/pkg/compiler/lib/src/serialization/serialization.dart
+++ b/pkg/compiler/lib/src/serialization/serialization.dart
@@ -9,6 +9,7 @@
 import 'package:kernel/binary/ast_from_binary.dart' as ir;
 import 'package:kernel/binary/ast_to_binary.dart' as ir;
 import '../closure.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../diagnostics/source_span.dart';
 import '../elements/entities.dart';
@@ -315,6 +316,9 @@
   /// Writes the constant [value] to this data sink.
   void writeConstant(ConstantValue value);
 
+  /// Writes the potentially `null` constant [value] to this data sink.
+  void writeConstantOrNull(ConstantValue value);
+
   /// Writes constant [values] to this data sink. If [allowNull] is `true`,
   /// [values] is allowed to be `null`.
   ///
@@ -626,6 +630,9 @@
   /// Reads a constant value from this data source.
   ConstantValue readConstant();
 
+  /// Reads a potentially `null` constant value from this data source.
+  ConstantValue readConstantOrNull();
+
   /// Reads a double value from this data source.
   double readDoubleValue();
 
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index e8d55ba..242f060 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -10,6 +10,7 @@
 import '../common/names.dart';
 import '../common_elements.dart';
 import '../compiler.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart'
     show
         ConstantValue,
@@ -27,9 +28,9 @@
 import '../ir/static_type_provider.dart';
 import '../ir/util.dart';
 import '../js/js.dart' as js;
-import '../js_backend/allocator_analysis.dart' show JAllocatorAnalysis;
+import '../js_backend/field_analysis.dart'
+    show FieldAnalysisData, JFieldAnalysis;
 import '../js_backend/backend.dart' show FunctionInlineCache, JavaScriptBackend;
-import '../js_backend/runtime_types.dart' show RuntimeTypesSubstitutions;
 import '../js_emitter/js_emitter.dart' show NativeEmitter;
 import '../js_model/locals.dart' show JumpVisitor;
 import '../js_model/elements.dart' show JGeneratorBody;
@@ -89,7 +90,6 @@
   final CodegenWorldBuilder _worldBuilder;
   final CodegenRegistry registry;
   final ClosureData closureDataLookup;
-  JAllocatorAnalysis _allocatorAnalysis;
 
   /// A stack of [InterfaceType]s that have been seen during inlining of
   /// factory constructors.  These types are preserved in [HInvokeStatic]s and
@@ -145,7 +145,6 @@
       this.inlineCache)
       : this.targetElement = _effectiveTargetElementFor(initialTargetElement),
         _infoReporter = compiler.dumpInfoTask,
-        _allocatorAnalysis = closedWorld.allocatorAnalysis,
         this.closureDataLookup = closedWorld.closureDataLookup {
     _enterFrame(targetElement, null);
     this.loopHandler = new KernelLoopHandler(this);
@@ -164,6 +163,8 @@
 
   JCommonElements get _commonElements => _elementMap.commonElements;
 
+  JFieldAnalysis get _fieldAnalysis => closedWorld.fieldAnalysis;
+
   KernelToTypeInferenceMap get _typeInferenceMap =>
       _currentFrame.typeInferenceMap;
 
@@ -340,12 +341,6 @@
     return function;
   }
 
-  @override
-  ConstantValue getFieldInitialConstantValue(FieldEntity field) {
-    assert(field == targetElement);
-    return _elementMap.getFieldConstantValue(field);
-  }
-
   void buildField(ir.Field node) {
     _inLazyInitializerExpression = node.isStatic;
     FieldEntity field = _elementMap.getMember(node);
@@ -363,7 +358,7 @@
       graph.entry.addBefore(graph.entry.last, parameter);
       HInstruction value = typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
           parameter, _getDartTypeIfValid(node.type));
-      if (!closedWorld.elidedFields.contains(field)) {
+      if (!_fieldAnalysis.getFieldData(field).isElided) {
         add(new HFieldSet(abstractValueDomain, field, thisInstruction, value));
       }
     } else {
@@ -528,7 +523,7 @@
       HInstruction value = constructorData.fieldValues[member];
       if (value == null) {
         assert(
-            _allocatorAnalysis.isInitializedInAllocator(member) ||
+            _fieldAnalysis.getFieldData(member).isInitializedInAllocator ||
                 isCustomElement ||
                 reporter.hasReportedError,
             'No initializer value for field ${member}');
@@ -554,7 +549,8 @@
       // Null guard ensures an error if we are being called from an explicit
       // 'new' of the constructor instead of via an upgrade. It is optimized out
       // if there are field initializers.
-      add(new HFieldGet(null, newObject, abstractValueDomain.dynamicType,
+      add(new HFieldGet(
+          null, newObject, abstractValueDomain.dynamicType, sourceInformation,
           isAssignable: false));
       for (int i = 0; i < fields.length; i++) {
         add(new HFieldSet(abstractValueDomain, fields[i], newObject,
@@ -756,19 +752,16 @@
         ignoreAllocatorAnalysis = true;
       }
 
-      if (node.initializer == null) {
-        if (ignoreAllocatorAnalysis ||
-            !_allocatorAnalysis.isInitializedInAllocator(field)) {
+      if (ignoreAllocatorAnalysis ||
+          !_fieldAnalysis.getFieldData(field).isInitializedInAllocator) {
+        if (node.initializer == null) {
           constructorData.fieldValues[field] =
               graph.addConstantNull(closedWorld);
-        }
-      } else {
-        // Compile the initializer in the context of the field so we know that
-        // class type parameters are accessed as values.
-        // TODO(sra): It would be sufficient to know the context was a field
-        // initializer.
-        if (ignoreAllocatorAnalysis ||
-            !_allocatorAnalysis.isInitializedInAllocator(field)) {
+        } else {
+          // Compile the initializer in the context of the field so we know that
+          // class type parameters are accessed as values.
+          // TODO(sra): It would be sufficient to know the context was a field
+          // initializer.
           inlinedFrom(field,
               _sourceInformationBuilder.buildAssignment(node.initializer), () {
             node.initializer.accept(this);
@@ -802,10 +795,11 @@
     var foundSuperOrRedirectCall = false;
     for (var initializer in constructor.initializers) {
       if (initializer is ir.FieldInitializer) {
-        // TODO(sra): Skip fields initialized in allocator.
-        initializer.value.accept(this);
-        constructorData.fieldValues[_elementMap.getField(initializer.field)] =
-            pop();
+        FieldEntity field = _elementMap.getField(initializer.field);
+        if (!_fieldAnalysis.getFieldData(field).isInitializedInAllocator) {
+          initializer.value.accept(this);
+          constructorData.fieldValues[field] = pop();
+        }
       } else if (initializer is ir.SuperInitializer) {
         assert(!foundSuperOrRedirectCall);
         foundSuperOrRedirectCall = true;
@@ -1424,12 +1418,13 @@
 
   @override
   void defaultExpression(ir.Expression expression) {
-    // TODO(het): This is only to get tests working.
+    // TODO(johnniwinther): We should make this an internal error.
     _trap('Unhandled ir.${expression.runtimeType}  $expression');
   }
 
   @override
   void defaultStatement(ir.Statement statement) {
+    // TODO(johnniwinther): We should make this an internal error.
     _trap('Unhandled ir.${statement.runtimeType}  $statement');
     pop();
   }
@@ -1579,6 +1574,14 @@
       }
     }
     handleInTryStatement();
+    if (_inliningStack.isEmpty && targetElement.isSetter) {
+      if (node.parent is ir.FunctionNode) {
+        // An arrow function definition of a setter has a ReturnStatemnt as a
+        // body, e.g. "set foo(x) => this._x = x;". There is no way to access
+        // the returned value, so don't emit a return.
+        return;
+      }
+    }
     _emitReturn(value, sourceInformation);
   }
 
@@ -2545,7 +2548,7 @@
       List<ConstantValue> getConstants(
           ir.SwitchStatement parentSwitch, ir.SwitchCase switchCase) {
         return <ConstantValue>[
-          constantSystem.createIntFromInt(caseIndex[switchCase])
+          constant_system.createIntFromInt(caseIndex[switchCase])
         ];
       }
 
@@ -2859,6 +2862,85 @@
   }
 
   @override
+  void visitSetLiteral(ir.SetLiteral node) {
+    if (node.isConst) {
+      stack.add(
+          graph.addConstant(_elementMap.getConstantValue(node), closedWorld));
+      return;
+    }
+
+    // The set literal constructors take the elements as a List.
+    List<HInstruction> elements = <HInstruction>[];
+    for (ir.Expression element in node.expressions) {
+      element.accept(this);
+      elements.add(pop());
+    }
+
+    // The constructor is a procedure because it's a factory.
+    FunctionEntity constructor;
+    List<HInstruction> inputs = <HInstruction>[];
+    if (elements.isEmpty) {
+      constructor = _commonElements.setLiteralConstructorEmpty;
+    } else {
+      constructor = _commonElements.setLiteralConstructor;
+      HLiteralList argList = buildLiteralList(elements);
+      add(argList);
+      inputs.add(argList);
+    }
+
+    assert(
+        constructor is ConstructorEntity && constructor.isFactoryConstructor);
+
+    InterfaceType type = localsHandler.substInContext(
+        _commonElements.setType(_elementMap.getDartType(node.typeArgument)));
+    ClassEntity cls = constructor.enclosingClass;
+
+    if (rtiNeed.classNeedsTypeArguments(cls)) {
+      List<HInstruction> typeInputs = <HInstruction>[];
+      type.typeArguments.forEach((DartType argument) {
+        typeInputs
+            .add(typeBuilder.analyzeTypeArgument(argument, sourceElement));
+      });
+
+      // We lift this common call pattern into a helper function to save space
+      // in the output.
+      if (typeInputs.every((HInstruction input) =>
+          input.isNull(abstractValueDomain).isDefinitelyTrue)) {
+        if (elements.isEmpty) {
+          constructor = _commonElements.setLiteralUntypedEmptyMaker;
+        } else {
+          constructor = _commonElements.setLiteralUntypedMaker;
+        }
+      } else {
+        inputs.addAll(typeInputs);
+      }
+    }
+
+    // If runtime type information is needed and the set literal has no type
+    // parameter, 'constructor' is a static function that forwards the call to
+    // the factory constructor without a type parameter.
+    assert(constructor.isFunction ||
+        (constructor is ConstructorEntity && constructor.isFactoryConstructor));
+
+    // The instruction type will always be a subtype of the setLiteralClass, but
+    // type inference might discover a more specific type or find nothing (in
+    // dart2js unit tests).
+
+    AbstractValue setType = abstractValueDomain
+        .createNonNullSubtype(_commonElements.setLiteralClass);
+    AbstractValue returnTypeMask =
+        _typeInferenceMap.getReturnTypeOf(constructor);
+    AbstractValue instructionType =
+        abstractValueDomain.intersection(setType, returnTypeMask);
+
+    addImplicitInstantiation(type);
+    _pushStaticInvocation(
+        constructor, inputs, instructionType, const <DartType>[],
+        sourceInformation: _sourceInformationBuilder.buildNew(node));
+    removeImplicitInstantiation(type);
+  }
+
+  @override
   void visitMapLiteral(ir.MapLiteral node) {
     if (node.isConst) {
       stack.add(
@@ -2995,9 +3077,9 @@
           sourceInformation: sourceInformation);
     } else if (staticTarget is ir.Field) {
       FieldEntity field = _elementMap.getField(staticTarget);
-      ConstantValue value = _elementMap.getFieldConstantValue(field);
-      if (value != null) {
-        if (!field.isAssignable) {
+      FieldAnalysisData fieldData = _fieldAnalysis.getFieldData(field);
+      if (fieldData.initialValue != null) {
+        if (fieldData.isEffectivelyFinal) {
           var unit = closedWorld.outputUnitData.outputUnitForMember(field);
           // TODO(sigmund): this is not equivalent to what the old FE does: if
           // there is no prefix the old FE wouldn't treat this in any special
@@ -3005,10 +3087,10 @@
           // unit, the old FE would still generate a deferred wrapper here.
           if (!closedWorld.outputUnitData
               .hasOnlyNonDeferredImportPaths(targetElement, field)) {
-            stack.add(graph.addDeferredConstant(
-                value, unit, sourceInformation, compiler, closedWorld));
+            stack.add(graph.addDeferredConstant(fieldData.initialValue, unit,
+                sourceInformation, compiler, closedWorld));
           } else {
-            stack.add(graph.addConstant(value, closedWorld,
+            stack.add(graph.addConstant(fieldData.initialValue, closedWorld,
                 sourceInformation: sourceInformation));
           }
         } else {
@@ -3041,7 +3123,7 @@
       pop();
     } else {
       MemberEntity target = _elementMap.getMember(staticTarget);
-      if (!closedWorld.elidedFields.contains(target)) {
+      if (!_fieldAnalysis.getFieldData(target).isElided) {
         add(new HStaticStore(
             abstractValueDomain,
             target,
@@ -3760,8 +3842,7 @@
     }
 
     HConstant nameConstant = graph.addConstant(
-        closedWorld.constantSystem
-            .createSymbol(closedWorld.commonElements, name),
+        constant_system.createSymbol(closedWorld.commonElements, name),
         closedWorld);
 
     List<HInstruction> arguments = <HInstruction>[];
@@ -3793,7 +3874,7 @@
     for (String argumentName
         in selector.callStructure.getOrderedNamedArguments()) {
       ConstantValue argumentNameConstant =
-          constantSystem.createString(argumentName);
+          constant_system.createString(argumentName);
       argumentNames.add(graph.addConstant(argumentNameConstant, closedWorld));
     }
     HInstruction argumentNamesInstruction = buildLiteralList(argumentNames);
@@ -3805,7 +3886,7 @@
     js.Name internalName = namer.invocationName(selector);
 
     ConstantValue kindConstant =
-        constantSystem.createIntFromInt(selector.invocationMirrorKind);
+        constant_system.createIntFromInt(selector.invocationMirrorKind);
 
     _pushStaticInvocation(
         _commonElements.createUnmangledInvocationMirror,
@@ -4587,7 +4668,7 @@
     FunctionEntity noSuchMethod =
         _elementMap.getSuperNoSuchMethod(containingClass);
 
-    ConstantValue nameConstant = constantSystem.createString(publicName);
+    ConstantValue nameConstant = constant_system.createString(publicName);
 
     js.Name internalName = namer.invocationName(selector);
 
@@ -4597,14 +4678,14 @@
     var argumentNames = new List<HInstruction>();
     for (String argumentName in selector.namedArguments) {
       ConstantValue argumentNameConstant =
-          constantSystem.createString(argumentName);
+          constant_system.createString(argumentName);
       argumentNames.add(graph.addConstant(argumentNameConstant, closedWorld));
     }
     var argumentNamesInstruction = buildLiteralList(argumentNames);
     add(argumentNamesInstruction);
 
     ConstantValue kindConstant =
-        constantSystem.createIntFromInt(selector.invocationMirrorKind);
+        constant_system.createIntFromInt(selector.invocationMirrorKind);
 
     _pushStaticInvocation(
         _commonElements.createInvocationMirror,
@@ -4674,15 +4755,24 @@
     if (member == null) {
       _generateSuperNoSuchMethod(node, _elementMap.getSelector(node).name,
           const <HInstruction>[], const <DartType>[], sourceInformation);
-    } else {
-      _buildInvokeSuper(
-          _elementMap.getSelector(node),
-          _elementMap.getClass(_containingClass(node)),
-          member,
-          const <HInstruction>[],
-          const <DartType>[],
-          sourceInformation);
+      return;
     }
+    if (member.isField) {
+      FieldAnalysisData fieldData = _fieldAnalysis.getFieldData(member);
+      if (fieldData.isEffectivelyConstant) {
+        ConstantValue value = fieldData.constantValue;
+        stack.add(graph.addConstant(value, closedWorld,
+            sourceInformation: sourceInformation));
+        return;
+      }
+    }
+    _buildInvokeSuper(
+        _elementMap.getSelector(node),
+        _elementMap.getClass(_containingClass(node)),
+        member,
+        const <HInstruction>[],
+        const <DartType>[],
+        sourceInformation);
   }
 
   @override
@@ -4869,12 +4959,11 @@
       return;
     }
 
-    if (RuntimeTypesSubstitutions.hasTypeArguments(typeValue)) {
-      InterfaceType interfaceType = typeValue;
+    if (typeValue is InterfaceType && !_canIgnoreTypeArguments(typeValue)) {
       HInstruction representations = typeBuilder
           .buildTypeArgumentRepresentations(typeValue, sourceElement);
       add(representations);
-      ClassEntity element = interfaceType.element;
+      ClassEntity element = typeValue.element;
       js.Name operator = namer.operatorIs(element);
       HInstruction isFieldName =
           graph.addConstantStringFromName(operator, closedWorld);
@@ -4914,6 +5003,24 @@
     return;
   }
 
+  /// Whether an is-check for [type] can be done ignoring type-arguments.
+  /// This will be true if [type] is raw, or all its type-arguments match the
+  /// type-parameter bounds.
+  bool _canIgnoreTypeArguments(InterfaceType type) {
+    InterfaceType thisType =
+        _elementMap.elementEnvironment.getThisType(type.element);
+    List<DartType> bounds = thisType.typeArguments;
+    for (int i = 0; i < bounds.length; i++) {
+      DartType arg = type.typeArguments[i];
+      if (arg.treatAsDynamic) continue;
+      TypeVariableType typeVariable = bounds[i];
+      DartType bound = _elementMap.elementEnvironment
+          .getTypeVariableBound(typeVariable.element);
+      if (bound != arg) return false;
+    }
+    return true;
+  }
+
   @override
   void visitThrow(ir.Throw node) {
     _visitThrowExpression(node.expression);
@@ -5244,10 +5351,9 @@
           function is! ConstructorBodyEntity &&
           (mask == null ||
               abstractValueDomain.isNull(mask).isPotentiallyTrue)) {
-        add(new HFieldGet(
-            null, providedArguments[0], abstractValueDomain.dynamicType,
-            isAssignable: false)
-          ..sourceInformation = sourceInformation);
+        add(new HFieldGet(null, providedArguments[0],
+            abstractValueDomain.dynamicType, sourceInformation,
+            isAssignable: false));
       }
       List<HInstruction> compiledArguments = _completeCallArgumentsList(
           function, selector, providedArguments, currentNode);
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index f93696b..ffccada 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -11,7 +11,7 @@
 import '../common/names.dart';
 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
 import '../common/tasks.dart' show CompilerTask;
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../common_elements.dart' show JCommonElements;
 import '../elements/entities.dart';
@@ -31,6 +31,7 @@
 import '../native/behavior.dart';
 import '../native/enqueue.dart';
 import '../options.dart';
+import '../tracer.dart';
 import '../universe/call_structure.dart' show CallStructure;
 import '../universe/selector.dart' show Selector;
 import '../universe/use.dart'
@@ -40,6 +41,11 @@
 import 'nodes.dart';
 import 'variable_allocator.dart';
 
+abstract class CodegenPhase {
+  String get name => '$runtimeType';
+  void visitGraph(HGraph graph);
+}
+
 class SsaCodeGeneratorTask extends CompilerTask {
   final JavaScriptBackend backend;
   final SourceInformationStrategy sourceInformationFactory;
@@ -89,6 +95,7 @@
           .createBuilderForContext(work.element)
           .buildDeclaration(work.element);
       SsaCodeGenerator codegen = new SsaCodeGenerator(
+          this,
           backend.compiler.options,
           backend.emitter,
           backend.nativeCodegenEnqueuer,
@@ -98,6 +105,7 @@
           backend.rtiEncoder,
           backend.namer,
           backend.superMemberData,
+          backend.tracer,
           closedWorld,
           work);
       codegen.visitGraph(graph);
@@ -114,6 +122,7 @@
         work.registry.registerAsyncMarker(element.asyncMarker);
       }
       SsaCodeGenerator codegen = new SsaCodeGenerator(
+          this,
           backend.compiler.options,
           backend.emitter,
           backend.nativeCodegenEnqueuer,
@@ -123,6 +132,7 @@
           backend.rtiEncoder,
           backend.namer,
           backend.superMemberData,
+          backend.tracer,
           closedWorld,
           work);
       codegen.visitGraph(graph);
@@ -152,6 +162,7 @@
   /// This includes declarations, which are generated as expressions.
   bool isGeneratingExpression = false;
 
+  final CompilerTask _codegenTask;
   final CompilerOptions _options;
   final CodeEmitterTask _emitter;
   final NativeCodegenEnqueuer _nativeEnqueuer;
@@ -161,6 +172,7 @@
   final RuntimeTypesEncoder _rtiEncoder;
   final Namer _namer;
   final SuperMemberData _superMemberData;
+  final Tracer _tracer;
   final JClosedWorld _closedWorld;
   final CodegenWorkItem _work;
 
@@ -207,6 +219,7 @@
   Queue<HBasicBlock> blockQueue;
 
   SsaCodeGenerator(
+      this._codegenTask,
       this._options,
       this._emitter,
       this._nativeEnqueuer,
@@ -216,6 +229,7 @@
       this._rtiEncoder,
       this._namer,
       this._superMemberData,
+      this._tracer,
       this._closedWorld,
       this._work,
       {SourceInformation sourceInformation})
@@ -235,8 +249,6 @@
 
   JCommonElements get _commonElements => _closedWorld.commonElements;
 
-  ConstantSystem get _constantSystem => _closedWorld.constantSystem;
-
   NativeData get _nativeData => _closedWorld.nativeData;
 
   InterceptorData get _interceptorData => _closedWorld.interceptorData;
@@ -352,78 +364,38 @@
   }
 
   void preGenerateMethod(HGraph graph) {
-    new SsaInstructionSelection(_options, _closedWorld, _interceptorData)
-        .visitGraph(graph);
-    new SsaTypeKnownRemover().visitGraph(graph);
-    new SsaTrustedCheckRemover(_options).visitGraph(graph);
-    new SsaInstructionMerger(
-            _abstractValueDomain, generateAtUseSite, _superMemberData)
-        .visitGraph(graph);
-    new SsaConditionMerger(generateAtUseSite, controlFlowOperators)
-        .visitGraph(graph);
-    new SsaShareRegionConstants(_options).visitGraph(graph);
+    void runPhase(CodegenPhase phase, {bool traceGraph = true}) {
+      _codegenTask.measureSubtask(phase.name, () => phase.visitGraph(graph));
+      if (traceGraph) {
+        _tracer.traceGraph(phase.name, graph);
+      }
+      assert(graph.isValid(), 'Graph not valid after ${phase.name}');
+    }
+
+    runPhase(
+        new SsaInstructionSelection(_options, _closedWorld, _interceptorData));
+    runPhase(new SsaTypeKnownRemover());
+    runPhase(new SsaTrustedCheckRemover(_options));
+    runPhase(new SsaAssignmentChaining(_options, _closedWorld));
+    runPhase(new SsaInstructionMerger(
+        _abstractValueDomain, generateAtUseSite, _superMemberData));
+    runPhase(new SsaConditionMerger(generateAtUseSite, controlFlowOperators));
+    runPhase(new SsaShareRegionConstants(_options));
+
     SsaLiveIntervalBuilder intervalBuilder =
         new SsaLiveIntervalBuilder(generateAtUseSite, controlFlowOperators);
-    intervalBuilder.visitGraph(graph);
+    runPhase(intervalBuilder, traceGraph: false);
     SsaVariableAllocator allocator = new SsaVariableAllocator(
         _namer,
         intervalBuilder.liveInstructions,
         intervalBuilder.liveIntervals,
         generateAtUseSite);
-    allocator.visitGraph(graph);
+    runPhase(allocator, traceGraph: false);
     variableNames = allocator.names;
     shouldGroupVarDeclarations = allocator.names.numberOfVariables > 1;
   }
 
   void handleDelayedVariableDeclarations(SourceInformation sourceInformation) {
-    if (_options.experimentLocalNames) {
-      handleDelayedVariableDeclarations2(sourceInformation);
-      return;
-    }
-
-    // If we have only one variable declaration and the first statement is an
-    // assignment to that variable then we can merge the two.  We count the
-    // number of variables in the variable allocator to try to avoid this issue,
-    // but it sometimes happens that the variable allocator introduces a
-    // temporary variable that it later eliminates.
-    if (!collectedVariableDeclarations.isEmpty) {
-      if (collectedVariableDeclarations.length == 1 &&
-          currentContainer.statements.length >= 1 &&
-          currentContainer.statements[0] is js.ExpressionStatement) {
-        String name = collectedVariableDeclarations.first;
-        js.ExpressionStatement statement = currentContainer.statements[0];
-        if (statement.expression is js.Assignment) {
-          js.Assignment assignment = statement.expression;
-          if (!assignment.isCompound &&
-              assignment.leftHandSide is js.VariableReference) {
-            js.VariableReference variableReference = assignment.leftHandSide;
-            if (variableReference.name == name) {
-              js.VariableDeclaration decl = new js.VariableDeclaration(name);
-              js.VariableInitialization initialization =
-                  new js.VariableInitialization(decl, assignment.value);
-              currentContainer.statements[0] = new js.ExpressionStatement(
-                      new js.VariableDeclarationList([initialization]))
-                  .withSourceInformation(sourceInformation);
-              return;
-            }
-          }
-        }
-      }
-      // If we can't merge the declaration with the first assignment then we
-      // just do it with a new var z,y,x; statement.
-      List<js.VariableInitialization> declarations =
-          <js.VariableInitialization>[];
-      collectedVariableDeclarations.forEach((String name) {
-        declarations.add(new js.VariableInitialization(
-            new js.VariableDeclaration(name), null));
-      });
-      var declarationList = new js.VariableDeclarationList(declarations)
-          .withSourceInformation(sourceInformation);
-      insertStatementAtStart(new js.ExpressionStatement(declarationList));
-    }
-  }
-
-  void handleDelayedVariableDeclarations2(SourceInformation sourceInformation) {
     // Create 'var' list at the start of function.  Move assignment statements
     // from the top of the body into the variable initializers.
     if (collectedVariableDeclarations.isEmpty) return;
@@ -521,11 +493,9 @@
         if (current.isControlFlow()) {
           return TYPE_STATEMENT;
         }
-        // HFieldSet generates code on the form x.y = ..., which isn't
-        // valid in a declaration, but it also always have no uses, so
-        // it's caught by that test too.
-        assert(current is! HFieldSet || current.usedBy.isEmpty);
-        if (current.usedBy.isEmpty) {
+        // HFieldSet generates code on the form "x.y = ...", which isn't valid
+        // in a declaration.
+        if (current.usedBy.isEmpty || current is HFieldSet) {
           result = TYPE_EXPRESSION;
         }
         current = current.next;
@@ -2365,7 +2335,7 @@
             .withSourceInformation(sourceInformation));
       } else if (canGenerateOptimizedComparison(input)) {
         HRelational relational = input;
-        BinaryOperation operation = relational.operation(_constantSystem);
+        constant_system.BinaryOperation operation = relational.operation();
         String op = mapRelationalOperator(operation.name, true);
         handleInvokeBinary(input, op, sourceInformation);
       } else {
diff --git a/pkg/compiler/lib/src/ssa/codegen_helpers.dart b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
index 78ddc04..6c28b79 100644
--- a/pkg/compiler/lib/src/ssa/codegen_helpers.dart
+++ b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
@@ -10,11 +10,12 @@
 import '../options.dart';
 import '../universe/selector.dart' show Selector;
 import '../world.dart' show JClosedWorld;
+import 'codegen.dart' show CodegenPhase;
 import 'nodes.dart';
 
 /// Replaces some instructions with specialized versions to make codegen easier.
 /// Caches codegen information on nodes.
-class SsaInstructionSelection extends HBaseVisitor {
+class SsaInstructionSelection extends HBaseVisitor with CodegenPhase {
   final JClosedWorld _closedWorld;
   final InterceptorData _interceptorData;
   final CompilerOptions _options;
@@ -341,7 +342,7 @@
 
 /// Remove [HTypeKnown] instructions from the graph, to make codegen
 /// analysis easier.
-class SsaTypeKnownRemover extends HBaseVisitor {
+class SsaTypeKnownRemover extends HBaseVisitor with CodegenPhase {
   void visitGraph(HGraph graph) {
     visitDominatorTree(graph);
   }
@@ -368,7 +369,7 @@
 
 /// Remove [HTypeConversion] instructions from the graph in '--trust-primitives'
 /// mode.
-class SsaTrustedCheckRemover extends HBaseVisitor {
+class SsaTrustedCheckRemover extends HBaseVisitor with CodegenPhase {
   final CompilerOptions _options;
 
   SsaTrustedCheckRemover(this._options);
@@ -395,6 +396,169 @@
   }
 }
 
+/// Use the result of static and field assignments where it is profitable to use
+/// the result of the assignment instead of the value.
+///
+///     a.x = v;
+///     b.y = v;
+/// -->
+///     b.y = a.x = v;
+class SsaAssignmentChaining extends HBaseVisitor with CodegenPhase {
+  final JClosedWorld _closedWorld;
+  final CompilerOptions _options;
+  //HGraph graph;
+
+  SsaAssignmentChaining(this._options, this._closedWorld);
+
+  AbstractValueDomain get _abstractValueDomain =>
+      _closedWorld.abstractValueDomain;
+
+  void visitGraph(HGraph graph) {
+    //this.graph = graph;
+    visitDominatorTree(graph);
+  }
+
+  void visitBasicBlock(HBasicBlock block) {
+    HInstruction instruction = block.first;
+    while (instruction != null) {
+      instruction = instruction.accept(this);
+    }
+  }
+
+  /// Returns the next instruction.
+  HInstruction visitInstruction(HInstruction node) {
+    return node.next;
+  }
+
+  HInstruction visitFieldSet(HFieldSet setter) {
+    return tryChainAssignment(setter, setter.value);
+  }
+
+  HInstruction visitStaticStore(HStaticStore store) {
+    return tryChainAssignment(store, store.inputs.single);
+  }
+
+  HInstruction tryChainAssignment(HInstruction setter, HInstruction value) {
+    // Try to use result of field or static assignment
+    //
+    //     t1 = v;  x.f = t1;  ... t1 ...
+    // -->
+    //     t1 = x.f = v;  ... t1 ...
+    //
+
+    // Single use is this setter so there will be no other uses to chain to.
+    if (value.usedBy.length <= 1) return setter.next;
+
+    // It is always worthwhile chaining into another setter, since it reduces
+    // the number of references to [value].
+    HInstruction chain = setter;
+    setter.instructionType = value.instructionType;
+    for (HInstruction current = setter.next;;) {
+      if (current is HFieldSet) {
+        HFieldSet nextSetter = current;
+        if (nextSetter.value == value && nextSetter.receiver != value) {
+          nextSetter.changeUse(value, chain);
+          nextSetter.instructionType = value.instructionType;
+          chain = nextSetter;
+          current = nextSetter.next;
+          continue;
+        }
+      } else if (current is HStaticStore) {
+        HStaticStore nextStore = current;
+        if (nextStore.value == value) {
+          nextStore.changeUse(value, chain);
+          nextStore.instructionType = value.instructionType;
+          chain = nextStore;
+          current = nextStore.next;
+          continue;
+        }
+      } else if (current is HReturn) {
+        if (current.inputs.single == value) {
+          current.changeUse(value, chain);
+          return current.next;
+        }
+      }
+      break;
+    }
+
+    final HInstruction next = chain.next;
+
+    if (value.usedBy.length <= 1) return next; // setter is only remaining use.
+
+    // Chain to other places.
+    var uses = DominatedUses.of(value, chain, excludeDominator: true);
+
+    if (uses.isEmpty) return next;
+
+    bool simpleSource = value is HConstant || value is HParameterValue;
+
+    if (uses.isSingleton) {
+      var use = uses.single;
+      if (use is HPhi) {
+        // Filter out back-edges - that causes problems for variable
+        // assignment.
+        // TODO(sra): Better analysis to permit phis that are part of a
+        // forwards-only tree.
+        if (use.block.id < chain.block.id) return next;
+        if (use.usedBy.any((node) => node is HPhi)) return next;
+
+        // A forward phi often has a new name. We want to avoid [value] having a
+        // name at the same time, so chain into the phi only if [value] (1) will
+        // never have a name (like a constant) (2) unavoidably has a name
+        // (e.g. a parameter) or (3) chaining will result in a single use that
+        // variable allocator can try to name consistently with the other phi
+        // inputs.
+        if (simpleSource || value.usedBy.length <= 2) {
+          if (value.isPure(_abstractValueDomain) ||
+              setter.previous == value ||
+              // the following tests for immediately previous phi.
+              (setter.previous == null && value.block == setter.block)) {
+            uses.replaceWith(chain);
+          }
+        }
+        return next;
+      }
+      // TODO(sra): Chains with one remaining potential use have the potential
+      // to generate huge expression containing many nested assignments. This
+      // will be smaller but nearly impossible to read. Are there interior
+      // positions that we should chain into because they are not too difficult
+      // to read?
+      return next;
+    }
+
+    if (simpleSource) return next;
+
+    // If there are many remaining uses, but they are all dominated by [chain],
+    // the variable allocator will try to give them all the same name.
+    if (uses.length >= 2 &&
+        value.usedBy.length - uses.length <= 1 &&
+        value == value.nonCheck()) {
+      // If [value] is a phi, it might have a name. Exceptions are phis that can
+      // be compiled into expressions like `a?b:c` and `a&&b`. We can't tell
+      // here if the phi is an expression, which we could chain, or an
+      // if-then-else with assignments to a variable. If we try to chain an
+      // if-then-else phi we will end up generating code like
+      //
+      //     t2 = this.x = t1;  // t1 is the phi, t2 is the chained name
+      //
+      if (value is HPhi) return next;
+
+      // We need [value] to be generate-at-use in the setter to avoid it having
+      // a name. As a quick check for generate-at-use, accept pure and
+      // immediately preceding instructions.
+      if (value.isPure(_abstractValueDomain) || setter.previous == value) {
+        // TODO(sra): We can tolerate a few non-throwing loads between setter
+        // and value.
+        uses.replaceWith(chain);
+        chain.sourceElement ??= value.sourceElement;
+      }
+      return next;
+    }
+
+    return next;
+  }
+}
+
 /// Instead of emitting each SSA instruction with a temporary variable
 /// mark instructions that can be emitted at their use-site.
 /// For example, in:
@@ -403,7 +567,7 @@
 ///   t2 = add(t0, t1);
 /// t0 and t1 would be marked and the resulting code would then be:
 ///   t2 = add(4, 3);
-class SsaInstructionMerger extends HBaseVisitor {
+class SsaInstructionMerger extends HBaseVisitor with CodegenPhase {
   final AbstractValueDomain _abstractValueDomain;
   final SuperMemberData _superMemberData;
 
@@ -703,7 +867,7 @@
 ///  Detect control flow arising from short-circuit logical and
 ///  conditional operators, and prepare the program to be generated
 ///  using these operators instead of nested ifs and boolean variables.
-class SsaConditionMerger extends HGraphVisitor {
+class SsaConditionMerger extends HGraphVisitor with CodegenPhase {
   Set<HInstruction> generateAtUseSite;
   Set<HInstruction> controlFlowOperators;
 
@@ -877,13 +1041,12 @@
 /// Insert 'caches' for whole-function region-constants when the local minified
 /// name would be shorter than repeated references.  These are caches for 'this'
 /// and constant values.
-class SsaShareRegionConstants extends HBaseVisitor {
+class SsaShareRegionConstants extends HBaseVisitor with CodegenPhase {
   final CompilerOptions _options;
 
   SsaShareRegionConstants(this._options);
 
   visitGraph(HGraph graph) {
-    if (!_options.experimentLocalNames) return;
     // We need the async rewrite to be smarter about hoisting region constants
     // before it is worth-while.
     if (graph.needsAsyncRewrite) return;
diff --git a/pkg/compiler/lib/src/ssa/graph_builder.dart b/pkg/compiler/lib/src/ssa/graph_builder.dart
index cf71ede..4b5d9cf 100644
--- a/pkg/compiler/lib/src/ssa/graph_builder.dart
+++ b/pkg/compiler/lib/src/ssa/graph_builder.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import '../constants/constant_system.dart';
 import '../common/codegen.dart' show CodegenRegistry;
 import '../common_elements.dart';
 import '../compiler.dart';
@@ -79,8 +78,6 @@
 
   JavaScriptConstantCompiler get constants => backend.constants;
 
-  ConstantSystem get constantSystem => constants.constantSystem;
-
   RuntimeTypesEncoder get rtiEncoder => backend.rtiEncoder;
 
   InferredData get inferredData => globalInferenceResults.inferredData;
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index fb3df50..7e6e84c 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import '../common_elements.dart' show JCommonElements;
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/names.dart';
@@ -57,7 +57,7 @@
         new CallStructure(selector.argumentCount));
   }
 
-  Operation operation(ConstantSystem constantSystem) => null;
+  constant_system.Operation operation() => null;
 
   static InvokeDynamicSpecializer lookupSpecializer(Selector selector) {
     if (selector.isIndex) return const IndexSpecializer();
@@ -221,8 +221,8 @@
 class BitNotSpecializer extends InvokeDynamicSpecializer {
   const BitNotSpecializer();
 
-  UnaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.bitNot;
+  constant_system.UnaryOperation operation() {
+    return constant_system.bitNot;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -266,8 +266,8 @@
 class UnaryNegateSpecializer extends InvokeDynamicSpecializer {
   const UnaryNegateSpecializer();
 
-  UnaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.negate;
+  constant_system.UnaryOperation operation() {
+    return constant_system.negate;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -322,8 +322,8 @@
 class AbsSpecializer extends InvokeDynamicSpecializer {
   const AbsSpecializer();
 
-  UnaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.abs;
+  constant_system.UnaryOperation operation() {
+    return constant_system.abs;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -480,8 +480,8 @@
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
   }
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.add;
+  constant_system.BinaryOperation operation() {
+    return constant_system.add;
   }
 
   HInstruction newBuiltinVariant(
@@ -506,8 +506,8 @@
 class DivideSpecializer extends BinaryArithmeticSpecializer {
   const DivideSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.divide;
+  constant_system.BinaryOperation operation() {
+    return constant_system.divide;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -554,8 +554,8 @@
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
   }
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.modulo;
+  constant_system.BinaryOperation operation() {
+    return constant_system.modulo;
   }
 
   HInstruction newBuiltinVariant(
@@ -646,8 +646,8 @@
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
   }
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.remainder;
+  constant_system.BinaryOperation operation() {
+    return constant_system.remainder;
   }
 
   HInstruction newBuiltinVariant(
@@ -672,8 +672,8 @@
 class MultiplySpecializer extends BinaryArithmeticSpecializer {
   const MultiplySpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.multiply;
+  constant_system.BinaryOperation operation() {
+    return constant_system.multiply;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -710,8 +710,8 @@
 class SubtractSpecializer extends BinaryArithmeticSpecializer {
   const SubtractSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.subtract;
+  constant_system.BinaryOperation operation() {
+    return constant_system.subtract;
   }
 
   HInstruction newBuiltinVariant(
@@ -736,8 +736,8 @@
 class TruncatingDivideSpecializer extends BinaryArithmeticSpecializer {
   const TruncatingDivideSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.truncatingDivide;
+  constant_system.BinaryOperation operation() {
+    return constant_system.truncatingDivide;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -895,8 +895,8 @@
 class ShiftLeftSpecializer extends BinaryBitOpSpecializer {
   const ShiftLeftSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.shiftLeft;
+  constant_system.BinaryOperation operation() {
+    return constant_system.shiftLeft;
   }
 
   HInstruction tryConvertToBuiltin(
@@ -1027,8 +1027,8 @@
         computeTypeFromInputTypes(instruction, results, options, closedWorld));
   }
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.shiftRight;
+  constant_system.BinaryOperation operation() {
+    return constant_system.shiftRight;
   }
 
   @override
@@ -1041,8 +1041,8 @@
 class BitOrSpecializer extends BinaryBitOpSpecializer {
   const BitOrSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.bitOr;
+  constant_system.BinaryOperation operation() {
+    return constant_system.bitOr;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -1081,8 +1081,8 @@
 class BitAndSpecializer extends BinaryBitOpSpecializer {
   const BitAndSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.bitAnd;
+  constant_system.BinaryOperation operation() {
+    return constant_system.bitAnd;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -1124,8 +1124,8 @@
 class BitXorSpecializer extends BinaryBitOpSpecializer {
   const BitXorSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.bitXor;
+  constant_system.BinaryOperation operation() {
+    return constant_system.bitXor;
   }
 
   AbstractValue computeTypeFromInputTypes(
@@ -1250,8 +1250,8 @@
     return null;
   }
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.equal;
+  constant_system.BinaryOperation operation() {
+    return constant_system.equal;
   }
 
   HInstruction newBuiltinVariant(
@@ -1270,8 +1270,8 @@
 class LessSpecializer extends RelationalSpecializer {
   const LessSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.less;
+  constant_system.BinaryOperation operation() {
+    return constant_system.less;
   }
 
   HInstruction newBuiltinVariant(
@@ -1290,8 +1290,8 @@
 class GreaterSpecializer extends RelationalSpecializer {
   const GreaterSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.greater;
+  constant_system.BinaryOperation operation() {
+    return constant_system.greater;
   }
 
   HInstruction newBuiltinVariant(
@@ -1310,8 +1310,8 @@
 class GreaterEqualSpecializer extends RelationalSpecializer {
   const GreaterEqualSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.greaterEqual;
+  constant_system.BinaryOperation operation() {
+    return constant_system.greaterEqual;
   }
 
   HInstruction newBuiltinVariant(
@@ -1330,8 +1330,8 @@
 class LessEqualSpecializer extends RelationalSpecializer {
   const LessEqualSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.lessEqual;
+  constant_system.BinaryOperation operation() {
+    return constant_system.lessEqual;
   }
 
   HInstruction newBuiltinVariant(
@@ -1350,8 +1350,8 @@
 class CodeUnitAtSpecializer extends InvokeDynamicSpecializer {
   const CodeUnitAtSpecializer();
 
-  BinaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.codeUnitAt;
+  constant_system.BinaryOperation operation() {
+    return constant_system.codeUnitAt;
   }
 
   HInstruction tryConvertToBuiltin(
@@ -1510,8 +1510,8 @@
 class RoundSpecializer extends InvokeDynamicSpecializer {
   const RoundSpecializer();
 
-  UnaryOperation operation(ConstantSystem constantSystem) {
-    return constantSystem.round;
+  constant_system.UnaryOperation operation() {
+    return constant_system.round;
   }
 
   HInstruction tryConvertToBuiltin(
diff --git a/pkg/compiler/lib/src/ssa/locals_handler.dart b/pkg/compiler/lib/src/ssa/locals_handler.dart
index 991cef0..b74bb8c 100644
--- a/pkg/compiler/lib/src/ssa/locals_handler.dart
+++ b/pkg/compiler/lib/src/ssa/locals_handler.dart
@@ -346,9 +346,10 @@
       AbstractValue type = local is BoxLocal
           ? _abstractValueDomain.nonNullType
           : getTypeOfCapturedVariable(redirect);
-      HInstruction fieldGet = new HFieldGet(redirect, receiver, type);
+      HInstruction fieldGet =
+          new HFieldGet(redirect, receiver, type, sourceInformation);
       builder.add(fieldGet);
-      return fieldGet..sourceInformation = sourceInformation;
+      return fieldGet;
     } else if (isBoxed(local)) {
       FieldEntity redirect = redirectionMapping[local];
       BoxLocal localBox;
@@ -363,10 +364,10 @@
       assert(localBox != null);
 
       HInstruction box = readLocal(localBox);
-      HInstruction lookup =
-          new HFieldGet(redirect, box, getTypeOfCapturedVariable(redirect));
+      HInstruction lookup = new HFieldGet(redirect, box,
+          getTypeOfCapturedVariable(redirect), sourceInformation);
       builder.add(lookup);
-      return lookup..sourceInformation = sourceInformation;
+      return lookup;
     } else {
       assert(_isUsedInTryOrGenerator(local));
       HLocalValue localValue = getLocal(local);
diff --git a/pkg/compiler/lib/src/ssa/logging.dart b/pkg/compiler/lib/src/ssa/logging.dart
index 68d648f..cdaef90 100644
--- a/pkg/compiler/lib/src/ssa/logging.dart
+++ b/pkg/compiler/lib/src/ssa/logging.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import '../elements/entities.dart';
 import '../util/features.dart';
 import 'nodes.dart';
 
@@ -28,8 +29,12 @@
 
   void registerFieldGet(HInvokeDynamicGetter original, HFieldGet converted) {
     Features features = new Features();
-    features['name'] =
-        '${converted.element.enclosingClass.name}.${converted.element.name}';
+    if (converted.element != null) {
+      features['name'] =
+          '${converted.element.enclosingClass.name}.${converted.element.name}';
+    } else {
+      features['name'] = '<null-guard>';
+    }
     entries.add(new OptimizationLogEntry('FieldGet', features));
   }
 
@@ -44,6 +49,33 @@
     entries.add(new OptimizationLogEntry('FieldSet', features));
   }
 
+  void registerFieldCall(HInvokeDynamicMethod original, HFieldGet converted) {
+    Features features = new Features();
+    if (converted.element != null) {
+      features['name'] =
+          '${converted.element.enclosingClass.name}.${converted.element.name}';
+    } else {
+      features['name'] = '<null-guard>';
+    }
+    entries.add(new OptimizationLogEntry('FieldCall', features));
+  }
+
+  void registerConstantFieldGet(
+      HInvokeDynamicGetter original, FieldEntity field, HConstant converted) {
+    Features features = new Features();
+    features['name'] = '${field.enclosingClass.name}.${field.name}';
+    features['value'] = converted.constant.toStructuredText();
+    entries.add(new OptimizationLogEntry('ConstantFieldGet', features));
+  }
+
+  void registerConstantFieldCall(
+      HInvokeDynamicMethod original, FieldEntity field, HConstant converted) {
+    Features features = new Features();
+    features['name'] = '${field.enclosingClass.name}.${field.name}';
+    features['value'] = converted.constant.toStructuredText();
+    entries.add(new OptimizationLogEntry('ConstantFieldCall', features));
+  }
+
   Features _registerSpecializer(
       HInvokeDynamic original, HInstruction converted, String name,
       [String unconvertedName]) {
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 5b0006f..3b46935 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -7,7 +7,7 @@
 import '../closure.dart';
 import '../common.dart';
 import '../compiler.dart' show Compiler;
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../deferred_load.dart' show OutputUnit;
 import '../elements/entities.dart';
@@ -298,23 +298,21 @@
   }
 
   HConstant addConstantInt(int i, JClosedWorld closedWorld) {
-    return addConstant(
-        closedWorld.constantSystem.createIntFromInt(i), closedWorld);
+    return addConstant(constant_system.createIntFromInt(i), closedWorld);
   }
 
   HConstant addConstantIntAsUnsigned(int i, JClosedWorld closedWorld) {
     return addConstant(
-        closedWorld.constantSystem.createInt(new BigInt.from(i).toUnsigned(64)),
+        constant_system.createInt(new BigInt.from(i).toUnsigned(64)),
         closedWorld);
   }
 
   HConstant addConstantDouble(double d, JClosedWorld closedWorld) {
-    return addConstant(closedWorld.constantSystem.createDouble(d), closedWorld);
+    return addConstant(constant_system.createDouble(d), closedWorld);
   }
 
   HConstant addConstantString(String str, JClosedWorld closedWorld) {
-    return addConstant(
-        closedWorld.constantSystem.createString(str), closedWorld);
+    return addConstant(constant_system.createString(str), closedWorld);
   }
 
   HConstant addConstantStringFromName(js.Name name, JClosedWorld closedWorld) {
@@ -325,12 +323,11 @@
   }
 
   HConstant addConstantBool(bool value, JClosedWorld closedWorld) {
-    return addConstant(
-        closedWorld.constantSystem.createBool(value), closedWorld);
+    return addConstant(constant_system.createBool(value), closedWorld);
   }
 
   HConstant addConstantNull(JClosedWorld closedWorld) {
-    return addConstant(closedWorld.constantSystem.createNull(), closedWorld);
+    return addConstant(constant_system.createNull(), closedWorld);
   }
 
   HConstant addConstantUnreachable(JClosedWorld closedWorld) {
@@ -364,6 +361,35 @@
         }
       }
     }
+    assignDominatorRanges();
+  }
+
+  void assignDominatorRanges() {
+    // DFS walk of dominator tree to assign dfs-in and dfs-out numbers to basic
+    // blocks. A dominator has a dfs-in..dfs-out range that includes the range
+    // of the dominated block. See [HGraphVisitor.visitDominatorTree] for
+    // recursion-free schema.
+    _Frame frame = new _Frame(null);
+    frame.block = entry;
+    frame.index = 0;
+
+    int dfsNumber = 0;
+    frame.block.dominatorDfsIn = dfsNumber;
+
+    while (frame != null) {
+      HBasicBlock block = frame.block;
+      int index = frame.index;
+      if (index < block.dominatedBlocks.length) {
+        frame.index = index + 1;
+        frame = frame.next ??= new _Frame(frame);
+        frame.block = block.dominatedBlocks[index];
+        frame.index = 0;
+        frame.block.dominatorDfsIn = ++dfsNumber;
+        continue;
+      }
+      block.dominatorDfsOut = dfsNumber;
+      frame = frame.previous;
+    }
   }
 
   bool isValid() {
@@ -633,6 +659,8 @@
 
   HBasicBlock dominator = null;
   final List<HBasicBlock> dominatedBlocks;
+  int dominatorDfsIn;
+  int dominatorDfsOut;
 
   HBasicBlock() : this.withId(null);
   HBasicBlock.withId(this.id)
@@ -891,20 +919,9 @@
     return validator.isValid;
   }
 
-  Map<HBasicBlock, bool> dominatesCache;
-
   bool dominates(HBasicBlock other) {
-    if (dominatesCache == null) {
-      dominatesCache = new Map<HBasicBlock, bool>();
-    } else {
-      bool res = dominatesCache[other];
-      if (res != null) return res;
-    }
-    do {
-      if (identical(this, other)) return dominatesCache[other] = true;
-      other = other.dominator;
-    } while (other != null && other.id >= id);
-    return dominatesCache[other] = false;
+    return this.dominatorDfsIn <= other.dominatorDfsIn &&
+        other.dominatorDfsOut <= this.dominatorDfsOut;
   }
 
   toString() => 'HBasicBlock($id)';
@@ -1327,6 +1344,7 @@
 
   bool get isEmpty => _instructions.isEmpty;
   bool get isNotEmpty => !isEmpty;
+  int get length => _instructions.length;
 
   /// Changes all the uses in the set to [newInstruction].
   void replaceWith(HInstruction newInstruction) {
@@ -1350,6 +1368,8 @@
 
   HInstruction get single => _instructions.single;
 
+  Iterable<HInstruction> get instructions => _instructions;
+
   void _addUse(HInstruction user, int inputIndex) {
     _instructions.add(user);
     _indexes.add(inputIndex);
@@ -1863,10 +1883,12 @@
   final bool isAssignable;
 
   HFieldGet(FieldEntity element, HInstruction receiver, AbstractValue type,
+      SourceInformation sourceInformation,
       {bool isAssignable})
       : this.isAssignable =
             (isAssignable != null) ? isAssignable : element.isAssignable,
         super(element, <HInstruction>[receiver], type) {
+    this.sourceInformation = sourceInformation;
     sideEffects.clearAllSideEffects();
     sideEffects.clearAllDependencies();
     setUseGvn();
@@ -1921,7 +1943,9 @@
   HInstruction get value => inputs[1];
   accept(HVisitor visitor) => visitor.visitFieldSet(this);
 
-  bool isJsStatement() => true;
+  // HFieldSet is an expression if it has a user.
+  bool isJsStatement() => usedBy.isEmpty;
+
   String toString() => "FieldSet(element=$element,type=$instructionType)";
 }
 
@@ -2134,14 +2158,14 @@
   HInstruction get left => inputs[0];
   HInstruction get right => inputs[1];
 
-  BinaryOperation operation(ConstantSystem constantSystem);
+  constant_system.BinaryOperation operation();
 }
 
 abstract class HBinaryArithmetic extends HInvokeBinary {
   HBinaryArithmetic(HInstruction left, HInstruction right, Selector selector,
       AbstractValue type)
       : super(left, right, selector, type);
-  BinaryOperation operation(ConstantSystem constantSystem);
+  constant_system.BinaryOperation operation();
 }
 
 class HAdd extends HBinaryArithmetic {
@@ -2150,8 +2174,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitAdd(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.add;
+  constant_system.BinaryOperation operation() => constant_system.add;
   int typeCode() => HInstruction.ADD_TYPECODE;
   bool typeEquals(other) => other is HAdd;
   bool dataEquals(HInstruction other) => true;
@@ -2163,8 +2186,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitDivide(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.divide;
+  constant_system.BinaryOperation operation() => constant_system.divide;
   int typeCode() => HInstruction.DIVIDE_TYPECODE;
   bool typeEquals(other) => other is HDivide;
   bool dataEquals(HInstruction other) => true;
@@ -2176,7 +2198,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitMultiply(this);
 
-  BinaryOperation operation(ConstantSystem operations) => operations.multiply;
+  constant_system.BinaryOperation operation() => constant_system.multiply;
   int typeCode() => HInstruction.MULTIPLY_TYPECODE;
   bool typeEquals(other) => other is HMultiply;
   bool dataEquals(HInstruction other) => true;
@@ -2188,8 +2210,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitSubtract(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.subtract;
+  constant_system.BinaryOperation operation() => constant_system.subtract;
   int typeCode() => HInstruction.SUBTRACT_TYPECODE;
   bool typeEquals(other) => other is HSubtract;
   bool dataEquals(HInstruction other) => true;
@@ -2201,8 +2222,8 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitTruncatingDivide(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.truncatingDivide;
+  constant_system.BinaryOperation operation() =>
+      constant_system.truncatingDivide;
   int typeCode() => HInstruction.TRUNCATING_DIVIDE_TYPECODE;
   bool typeEquals(other) => other is HTruncatingDivide;
   bool dataEquals(HInstruction other) => true;
@@ -2214,8 +2235,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitRemainder(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.remainder;
+  constant_system.BinaryOperation operation() => constant_system.remainder;
   int typeCode() => HInstruction.REMAINDER_TYPECODE;
   bool typeEquals(other) => other is HRemainder;
   bool dataEquals(HInstruction other) => true;
@@ -2253,8 +2273,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitShiftLeft(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.shiftLeft;
+  constant_system.BinaryOperation operation() => constant_system.shiftLeft;
   int typeCode() => HInstruction.SHIFT_LEFT_TYPECODE;
   bool typeEquals(other) => other is HShiftLeft;
   bool dataEquals(HInstruction other) => true;
@@ -2266,8 +2285,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitShiftRight(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.shiftRight;
+  constant_system.BinaryOperation operation() => constant_system.shiftRight;
   int typeCode() => HInstruction.SHIFT_RIGHT_TYPECODE;
   bool typeEquals(other) => other is HShiftRight;
   bool dataEquals(HInstruction other) => true;
@@ -2279,8 +2297,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitBitOr(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.bitOr;
+  constant_system.BinaryOperation operation() => constant_system.bitOr;
   int typeCode() => HInstruction.BIT_OR_TYPECODE;
   bool typeEquals(other) => other is HBitOr;
   bool dataEquals(HInstruction other) => true;
@@ -2292,8 +2309,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitBitAnd(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.bitAnd;
+  constant_system.BinaryOperation operation() => constant_system.bitAnd;
   int typeCode() => HInstruction.BIT_AND_TYPECODE;
   bool typeEquals(other) => other is HBitAnd;
   bool dataEquals(HInstruction other) => true;
@@ -2305,8 +2321,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitBitXor(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.bitXor;
+  constant_system.BinaryOperation operation() => constant_system.bitXor;
   int typeCode() => HInstruction.BIT_XOR_TYPECODE;
   bool typeEquals(other) => other is HBitXor;
   bool dataEquals(HInstruction other) => true;
@@ -2323,7 +2338,7 @@
 
   HInstruction get operand => inputs[0];
 
-  UnaryOperation operation(ConstantSystem constantSystem);
+  constant_system.UnaryOperation operation();
 }
 
 class HNegate extends HInvokeUnary {
@@ -2331,8 +2346,7 @@
       : super(input, selector, type);
   accept(HVisitor visitor) => visitor.visitNegate(this);
 
-  UnaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.negate;
+  constant_system.UnaryOperation operation() => constant_system.negate;
   int typeCode() => HInstruction.NEGATE_TYPECODE;
   bool typeEquals(other) => other is HNegate;
   bool dataEquals(HInstruction other) => true;
@@ -2343,7 +2357,7 @@
       : super(input, selector, type);
   accept(HVisitor visitor) => visitor.visitAbs(this);
 
-  UnaryOperation operation(ConstantSystem constantSystem) => constantSystem.abs;
+  constant_system.UnaryOperation operation() => constant_system.abs;
   int typeCode() => HInstruction.ABS_TYPECODE;
   bool typeEquals(other) => other is HAbs;
   bool dataEquals(HInstruction other) => true;
@@ -2354,8 +2368,7 @@
       : super(input, selector, type);
   accept(HVisitor visitor) => visitor.visitBitNot(this);
 
-  UnaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.bitNot;
+  constant_system.UnaryOperation operation() => constant_system.bitNot;
   int typeCode() => HInstruction.BIT_NOT_TYPECODE;
   bool typeEquals(other) => other is HBitNot;
   bool dataEquals(HInstruction other) => true;
@@ -2621,8 +2634,7 @@
   HIdentity(left, right, selector, type) : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitIdentity(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.identity;
+  constant_system.BinaryOperation operation() => constant_system.identity;
   int typeCode() => HInstruction.IDENTITY_TYPECODE;
   bool typeEquals(other) => other is HIdentity;
   bool dataEquals(HInstruction other) => true;
@@ -2632,8 +2644,7 @@
   HGreater(left, right, selector, type) : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitGreater(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.greater;
+  constant_system.BinaryOperation operation() => constant_system.greater;
   int typeCode() => HInstruction.GREATER_TYPECODE;
   bool typeEquals(other) => other is HGreater;
   bool dataEquals(HInstruction other) => true;
@@ -2644,8 +2655,7 @@
       : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitGreaterEqual(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.greaterEqual;
+  constant_system.BinaryOperation operation() => constant_system.greaterEqual;
   int typeCode() => HInstruction.GREATER_EQUAL_TYPECODE;
   bool typeEquals(other) => other is HGreaterEqual;
   bool dataEquals(HInstruction other) => true;
@@ -2655,8 +2665,7 @@
   HLess(left, right, selector, type) : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitLess(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.less;
+  constant_system.BinaryOperation operation() => constant_system.less;
   int typeCode() => HInstruction.LESS_TYPECODE;
   bool typeEquals(other) => other is HLess;
   bool dataEquals(HInstruction other) => true;
@@ -2666,8 +2675,7 @@
   HLessEqual(left, right, selector, type) : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitLessEqual(this);
 
-  BinaryOperation operation(ConstantSystem constantSystem) =>
-      constantSystem.lessEqual;
+  constant_system.BinaryOperation operation() => constant_system.lessEqual;
   int typeCode() => HInstruction.LESS_EQUAL_TYPECODE;
   bool typeEquals(other) => other is HLessEqual;
   bool dataEquals(HInstruction other) => true;
@@ -2860,10 +2868,12 @@
   toString() => 'static store ${element.name}';
   accept(HVisitor visitor) => visitor.visitStaticStore(this);
 
+  HInstruction get value => inputs.single;
+
   int typeCode() => HInstruction.STATIC_STORE_TYPECODE;
   bool typeEquals(other) => other is HStaticStore;
   bool dataEquals(HStaticStore other) => element == other.element;
-  bool isJsStatement() => true;
+  bool isJsStatement() => usedBy.isEmpty;
 }
 
 class HLiteralList extends HInstruction {
@@ -2968,9 +2978,10 @@
       HInterceptor interceptor,
       AbstractValue type,
       SourceInformation sourceInformation) {
-    assert(
-        (typeExpression.isFunctionType || typeExpression.isInterfaceType) &&
-            typeExpression.treatAsRaw,
+    // TODO(sigmund): re-add `&& typeExpression.treatAsRaw` or something
+    // equivalent (which started failing once we allowed typeExpressions that
+    // contain type parameters matching the original bounds of the type).
+    assert((typeExpression.isFunctionType || typeExpression.isInterfaceType),
         "Unexpected raw is-test type: $typeExpression");
     return new HIs.internal(typeExpression, [expression, interceptor],
         RAW_CHECK, type, sourceInformation);
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 007950f..e40719b 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -7,14 +7,15 @@
 import '../common/names.dart' show Selectors;
 import '../common/tasks.dart' show CompilerTask;
 import '../compiler.dart' show Compiler;
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../common_elements.dart' show JCommonElements;
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../inferrer/abstract_value_domain.dart';
 import '../inferrer/types.dart';
-import '../js_backend/allocator_analysis.dart' show JAllocatorAnalysis;
+import '../js_backend/field_analysis.dart'
+    show FieldAnalysisData, JFieldAnalysis;
 import '../js_backend/backend.dart';
 import '../js_backend/native_data.dart' show NativeData;
 import '../js_backend/runtime_types.dart';
@@ -204,8 +205,6 @@
 
   JCommonElements get commonElements => _closedWorld.commonElements;
 
-  ConstantSystem get constantSystem => _closedWorld.constantSystem;
-
   AbstractValueDomain get _abstractValueDomain =>
       _closedWorld.abstractValueDomain;
 
@@ -478,12 +477,12 @@
   }
 
   HInstruction visitInvokeUnary(HInvokeUnary node) {
-    HInstruction folded =
-        foldUnary(node.operation(constantSystem), node.operand);
+    HInstruction folded = foldUnary(node.operation(), node.operand);
     return folded != null ? folded : node;
   }
 
-  HInstruction foldUnary(UnaryOperation operation, HInstruction operand) {
+  HInstruction foldUnary(
+      constant_system.UnaryOperation operation, HInstruction operand) {
     if (operand is HConstant) {
       HConstant receiver = operand;
       ConstantValue folded = operation.fold(receiver.constant);
@@ -533,7 +532,7 @@
 
   HInstruction handleInterceptedCall(HInvokeDynamic node) {
     // Try constant folding the instruction.
-    Operation operation = node.specializer.operation(constantSystem);
+    constant_system.Operation operation = node.specializer.operation();
     if (operation != null) {
       HInstruction instruction = node.inputs.length == 2
           ? foldUnary(operation, node.inputs[1])
@@ -696,8 +695,8 @@
       if (folded != node) return folded;
     }
 
-    AbstractValue receiverType =
-        node.getDartReceiver(_closedWorld).instructionType;
+    HInstruction receiver = node.getDartReceiver(_closedWorld);
+    AbstractValue receiverType = receiver.instructionType;
     MemberEntity element =
         _closedWorld.locateSingleMember(node.selector, receiverType);
     // TODO(ngeoffray): Also fold if it's a getter or variable.
@@ -734,20 +733,47 @@
       FieldEntity field = element;
       if (!_nativeData.isNativeMember(field) &&
           !node.isCallOnInterceptor(_closedWorld)) {
-        HInstruction receiver = node.getDartReceiver(_closedWorld);
-        AbstractValue type = AbstractValueFactory.inferredTypeForMember(
-            // ignore: UNNECESSARY_CAST
-            field as Entity,
-            _globalInferenceResults);
-        HInstruction load = new HFieldGet(field, receiver, type);
-        node.block.addBefore(node, load);
+        // Insertion point for the closure call.
+        HInstruction insertionPoint = node;
+        HInstruction load;
+        FieldAnalysisData fieldData =
+            _closedWorld.fieldAnalysis.getFieldData(field);
+        if (fieldData.isEffectivelyConstant) {
+          // The field is elided and replace it with its constant value.
+          if (_abstractValueDomain.isNull(receiverType).isPotentiallyTrue) {
+            // The receiver is potentially `null` so we insert a null receiver
+            // guard to trigger a null pointer exception.
+            //
+            // This could be inserted unconditionally and removed by later
+            // optimizations if unnecessary, but performance we do it
+            // conditionally here.
+            // TODO(35996): Replace with null receiver guard instruction.
+            HInstruction dummyGet = new HFieldGet(null, receiver,
+                _abstractValueDomain.dynamicType, node.sourceInformation,
+                isAssignable: false);
+            _log?.registerFieldCall(node, dummyGet);
+            node.block.addBefore(node, dummyGet);
+            insertionPoint = dummyGet;
+          }
+          ConstantValue value = fieldData.constantValue;
+          load = _graph.addConstant(value, _closedWorld,
+              sourceInformation: node.sourceInformation);
+          _log?.registerConstantFieldCall(node, field, load);
+        } else {
+          AbstractValue type = AbstractValueFactory.inferredTypeForMember(
+              field, _globalInferenceResults);
+          load = new HFieldGet(field, receiver, type, node.sourceInformation);
+          _log?.registerFieldCall(node, load);
+          node.block.addBefore(node, load);
+          insertionPoint = load;
+        }
         Selector callSelector = new Selector.callClosureFrom(node.selector);
         List<HInstruction> inputs = <HInstruction>[load]
           ..addAll(node.inputs.skip(node.isInterceptedCall ? 2 : 1));
         HInstruction closureCall = new HInvokeClosure(
             callSelector, inputs, node.instructionType, node.typeArguments)
           ..sourceInformation = node.sourceInformation;
-        node.block.addAfter(load, closureCall);
+        node.block.addAfter(insertionPoint, closureCall);
         return closureCall;
       }
     }
@@ -831,7 +857,7 @@
     if (index.isConstant()) {
       HConstant constantInstruction = index;
       assert(!constantInstruction.constant.isInt);
-      if (!constantSystem.isInt(constantInstruction.constant)) {
+      if (!constant_system.isInt(constantInstruction.constant)) {
         // -0.0 is a double but will pass the runtime integer check.
         node.staticChecks = HBoundsCheck.ALWAYS_FALSE;
       }
@@ -839,8 +865,8 @@
     return node;
   }
 
-  HInstruction foldBinary(
-      BinaryOperation operation, HInstruction left, HInstruction right) {
+  HInstruction foldBinary(constant_system.BinaryOperation operation,
+      HInstruction left, HInstruction right) {
     if (left is HConstant && right is HConstant) {
       HConstant op1 = left;
       HConstant op2 = right;
@@ -877,7 +903,7 @@
   HInstruction visitInvokeBinary(HInvokeBinary node) {
     HInstruction left = node.left;
     HInstruction right = node.right;
-    BinaryOperation operation = node.operation(constantSystem);
+    constant_system.BinaryOperation operation = node.operation();
     HConstant folded = foldBinary(operation, left, right);
     if (folded != null) return folded;
     return node;
@@ -1215,17 +1241,43 @@
       if (folded != node) return folded;
     }
     HInstruction receiver = node.getDartReceiver(_closedWorld);
+    AbstractValue receiverType = receiver.instructionType;
     FieldEntity field = node.element is FieldEntity
         ? node.element
         : findConcreteFieldForDynamicAccess(node, receiver);
     if (field != null) {
-      HFieldGet result = _directFieldGet(receiver, field, node);
-      _log?.registerFieldGet(node, result);
-      return result;
+      FieldAnalysisData fieldData =
+          _closedWorld.fieldAnalysis.getFieldData(field);
+      if (fieldData.isEffectivelyConstant) {
+        // The field is elided and replace it with its constant value.
+        if (_abstractValueDomain.isNull(receiverType).isPotentiallyTrue) {
+          // The receiver is potentially `null` so we insert a null receiver
+          // guard to trigger a null pointer exception.
+          //
+          // This could be inserted unconditionally and removed by later
+          // optimizations if unnecessary, but performance we do it
+          // conditionally here.
+          // TODO(35996): Replace with null receiver guard instruction.
+          HInstruction dummyGet = new HFieldGet(null, receiver,
+              _abstractValueDomain.dynamicType, node.sourceInformation,
+              isAssignable: false);
+          _log?.registerFieldGet(node, dummyGet);
+          node.block.addBefore(node, dummyGet);
+        }
+        ConstantValue constant = fieldData.constantValue;
+        HConstant result = _graph.addConstant(constant, _closedWorld,
+            sourceInformation: node.sourceInformation);
+        _log?.registerConstantFieldGet(node, field, result);
+        return result;
+      } else {
+        HFieldGet result = _directFieldGet(receiver, field, node);
+        _log?.registerFieldGet(node, result);
+        return result;
+      }
     }
 
-    node.element ??= _closedWorld.locateSingleMember(
-        node.selector, receiver.instructionType);
+    node.element ??=
+        _closedWorld.locateSingleMember(node.selector, receiverType);
     if (node.element != null &&
         node.element.name == node.selector.name &&
         node.element.isFunction) {
@@ -1256,8 +1308,8 @@
           field, _globalInferenceResults);
     }
 
-    return new HFieldGet(field, receiver, type, isAssignable: isAssignable)
-      ..sourceInformation = node.sourceInformation;
+    return new HFieldGet(field, receiver, type, node.sourceInformation,
+        isAssignable: isAssignable);
   }
 
   HInstruction visitInvokeDynamicSetter(HInvokeDynamicSetter node) {
@@ -1292,7 +1344,7 @@
         value = other;
       }
     }
-    if (_closedWorld.elidedFields.contains(field)) {
+    if (_closedWorld.fieldAnalysis.getFieldData(field).isElided) {
       _log?.registerFieldSet(node);
       return value;
     } else {
@@ -1466,7 +1518,7 @@
     }
 
     HInstruction folded = _graph.addConstant(
-        constantSystem
+        constant_system
             .createString(leftString.stringValue + rightString.stringValue),
         _closedWorld);
     if (prefix == null) return folded;
@@ -1480,7 +1532,7 @@
     }
 
     HInstruction asString(String string) =>
-        _graph.addConstant(constantSystem.createString(string), _closedWorld);
+        _graph.addConstant(constant_system.createString(string), _closedWorld);
 
     HInstruction tryConstant() {
       if (!input.isConstant()) return null;
@@ -2832,7 +2884,7 @@
 class SsaLoadElimination extends HBaseVisitor implements OptimizationPhase {
   final Compiler compiler;
   final JClosedWorld closedWorld;
-  final JAllocatorAnalysis _allocatorAnalysis;
+  final JFieldAnalysis _fieldAnalysis;
   final String name = "SsaLoadElimination";
   MemorySet memorySet;
   List<MemorySet> memories;
@@ -2840,7 +2892,7 @@
   HGraph _graph;
 
   SsaLoadElimination(this.compiler, this.closedWorld)
-      : _allocatorAnalysis = closedWorld.allocatorAnalysis;
+      : _fieldAnalysis = closedWorld.fieldAnalysis;
 
   AbstractValueDomain get _abstractValueDomain =>
       closedWorld.abstractValueDomain;
@@ -2956,9 +3008,10 @@
         if (compiler.elementHasCompileTimeError(
             // ignore: UNNECESSARY_CAST
             member as Entity)) return;
-        if (_allocatorAnalysis.isInitializedInAllocator(member)) {
+        FieldAnalysisData fieldData = _fieldAnalysis.getFieldData(member);
+        if (fieldData.isInitializedInAllocator) {
           // TODO(sra): Can we avoid calling HGraph.addConstant?
-          ConstantValue value = _allocatorAnalysis.initializerValue(member);
+          ConstantValue value = fieldData.initialValue;
           HConstant constant = _graph.addConstant(value, closedWorld);
           memorySet.registerFieldValue(member, instruction, constant);
         } else {
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index 08cda42..41360b05 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -6,11 +6,11 @@
 
 import '../common/codegen.dart' show CodegenWorkItem, CodegenRegistry;
 import '../common/tasks.dart' show CompilerTask, Measurer;
-import '../constants/values.dart';
-import '../elements/entities.dart' show FieldEntity, MemberEntity;
+import '../elements/entities.dart' show MemberEntity;
 import '../inferrer/types.dart';
 import '../io/source_information.dart';
 import '../js/js.dart' as js;
+import '../js_backend/field_analysis.dart';
 import '../js_backend/backend.dart' show JavaScriptBackend, FunctionCompiler;
 import '../universe/call_structure.dart';
 import '../universe/use.dart';
@@ -38,7 +38,7 @@
   }
 
   /// Generates JavaScript code for `work.element`.
-  /// Using the ssa builder, optimizer and codegenerator.
+  /// Using the ssa builder, optimizer and code generator.
   js.Fun compile(CodegenWorkItem work, JClosedWorld closedWorld,
       GlobalTypeInferenceResults globalInferenceResults) {
     HGraph graph = _builder.build(work, closedWorld, globalInferenceResults);
@@ -98,8 +98,6 @@
 }
 
 abstract class SsaBuilderFieldMixin {
-  ConstantValue getFieldInitialConstantValue(covariant FieldEntity field);
-
   /// Handle field initializer of [element]. Returns `true` if no code
   /// is needed for the field.
   ///
@@ -112,10 +110,11 @@
   bool handleConstantField(MemberEntity element, CodegenRegistry registry,
       JClosedWorld closedWorld) {
     if (element.isField) {
-      ConstantValue initialValue = getFieldInitialConstantValue(element);
-      if (initialValue != null) {
+      FieldAnalysisData fieldData =
+          closedWorld.fieldAnalysis.getFieldData(element);
+      if (fieldData.initialValue != null) {
         registry.worldImpact
-            .registerConstantUse(new ConstantUse.init(initialValue));
+            .registerConstantUse(new ConstantUse.init(fieldData.initialValue));
         // We don't need to generate code for static or top-level
         // variables. For instance variables, we may need to generate
         // the checked setter.
diff --git a/pkg/compiler/lib/src/ssa/types_propagation.dart b/pkg/compiler/lib/src/ssa/types_propagation.dart
index 8199ed4..0c7b575 100644
--- a/pkg/compiler/lib/src/ssa/types_propagation.dart
+++ b/pkg/compiler/lib/src/ssa/types_propagation.dart
@@ -422,22 +422,10 @@
     AbstractValue receiverType = receiver.instructionType;
     instruction.mask = receiverType;
 
-    // Try to specialize the receiver after this call by inserting a refinement
-    // node (HTypeKnown). There are two potentially expensive tests - are there
-    // any uses of the receiver dominated by and following this call?, and what
-    // is the refined type? The first is expensive if the receiver has many
-    // uses, the second is expensive if many classes implement the selector. So
-    // we try to do the least expensive test first.
-    const int _MAX_QUICK_USERS = 50;
-    if (!instruction.selector.isClosureCall) {
-      AbstractValue newType;
-      AbstractValue computeNewType() {
-        newType = closedWorld.computeReceiverType(
-            instruction.selector, instruction.mask);
-        newType = abstractValueDomain.intersection(newType, receiverType);
-        return newType;
-      }
-
+    // Try to refine that the receiver is not null after this call by inserting
+    // a refinement node (HTypeKnown).
+    var selector = instruction.selector;
+    if (!selector.isClosureCall && !selector.appliesToNullWithoutThrow()) {
       var next = instruction.next;
       if (next is HTypeKnown && next.checkedInput == receiver) {
         // On a previous pass or iteration we already refined [receiver] by
@@ -445,23 +433,18 @@
         // uses with the refinement. We update the type of the [HTypeKnown]
         // instruction because it may have been refined with a correct type at
         // the time, but incorrect now.
-        if (next.instructionType != computeNewType()) {
+        AbstractValue newType = abstractValueDomain.excludeNull(receiverType);
+        if (next.instructionType != newType) {
           next.knownType = next.instructionType = newType;
           addDependentInstructionsToWorkList(next);
         }
-      } else {
-        DominatedUses uses;
-        bool hasCandidates() {
-          uses =
-              DominatedUses.of(receiver, instruction, excludeDominator: true);
-          return uses.isNotEmpty;
-        }
-
-        if ((receiver.usedBy.length <= _MAX_QUICK_USERS)
-            ? (hasCandidates() && computeNewType() != receiverType)
-            : (computeNewType() != receiverType && hasCandidates())) {
+      } else if (abstractValueDomain.isNull(receiverType).isPotentiallyTrue) {
+        DominatedUses uses =
+            DominatedUses.of(receiver, instruction, excludeDominator: true);
+        if (uses.isNotEmpty) {
           // Insert a refinement node after the call and update all users
           // dominated by the call to use that node instead of [receiver].
+          AbstractValue newType = abstractValueDomain.excludeNull(receiverType);
           HTypeKnown converted =
               new HTypeKnown.witnessed(newType, receiver, instruction);
           instruction.block.addBefore(instruction.next, converted);
diff --git a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
index a4bfd96..639c727 100644
--- a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
+++ b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
@@ -2,20 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import '../constant_system_dart.dart';
-import '../constants/constant_system.dart';
+import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../world.dart' show JClosedWorld;
 import 'nodes.dart';
 import 'optimize.dart';
 
 class ValueRangeInfo {
-  final ConstantSystem constantSystem;
-
   IntValue intZero;
   IntValue intOne;
 
-  ValueRangeInfo(this.constantSystem) {
+  ValueRangeInfo() {
     intZero = newIntValue(BigInt.zero);
     intOne = newIntValue(BigInt.one);
   }
@@ -129,9 +126,9 @@
   Value operator +(dynamic other) {
     if (other.isZero) return this;
     if (other is! IntValue) return other + this;
-    ConstantSystem constantSystem = info.constantSystem;
-    dynamic constant = constantSystem.add.fold(
-        constantSystem.createInt(value), constantSystem.createInt(other.value));
+    dynamic constant = constant_system.add.fold(
+        constant_system.createInt(value),
+        constant_system.createInt(other.value));
     if (!constant.isInt) return const UnknownValue();
     return info.newIntValue(constant.intValue);
   }
@@ -139,27 +136,26 @@
   Value operator -(dynamic other) {
     if (other.isZero) return this;
     if (other is! IntValue) return -other + this;
-    ConstantSystem constantSystem = info.constantSystem;
-    dynamic constant = constantSystem.subtract.fold(
-        constantSystem.createInt(value), constantSystem.createInt(other.value));
+    dynamic constant = constant_system.subtract.fold(
+        constant_system.createInt(value),
+        constant_system.createInt(other.value));
     if (!constant.isInt) return const UnknownValue();
     return info.newIntValue(constant.intValue);
   }
 
   Value operator -() {
     if (isZero) return this;
-    ConstantSystem constantSystem = info.constantSystem;
     dynamic constant =
-        constantSystem.negate.fold(constantSystem.createInt(value));
+        constant_system.negate.fold(constant_system.createInt(value));
     if (!constant.isInt) return const UnknownValue();
     return info.newIntValue(constant.intValue);
   }
 
   Value operator &(dynamic other) {
     if (other is! IntValue) return const UnknownValue();
-    ConstantSystem constantSystem = info.constantSystem;
-    dynamic constant = constantSystem.bitAnd.fold(
-        constantSystem.createInt(value), constantSystem.createInt(other.value));
+    dynamic constant = constant_system.bitAnd.fold(
+        constant_system.createInt(value),
+        constant_system.createInt(other.value));
     return info.newIntValue(constant.intValue);
   }
 
@@ -579,11 +575,9 @@
   HGraph graph;
 
   SsaValueRangeAnalyzer(JClosedWorld closedWorld, this.optimizer)
-      : info = new ValueRangeInfo(closedWorld.constantSystem),
+      : info = new ValueRangeInfo(),
         this.closedWorld = closedWorld;
 
-  ConstantSystem get constantSystem => closedWorld.constantSystem;
-
   void visitGraph(HGraph graph) {
     this.graph = graph;
     visitDominatorTree(graph);
@@ -776,7 +770,7 @@
     if (right.isInteger(closedWorld.abstractValueDomain).isPotentiallyFalse) {
       return info.newUnboundRange();
     }
-    BinaryOperation operation = relational.operation(constantSystem);
+    constant_system.BinaryOperation operation = relational.operation();
     Range rightRange = ranges[relational.right];
     Range leftRange = ranges[relational.left];
 
@@ -881,7 +875,7 @@
       return info.newUnboundRange();
     }
     return instruction
-        .operation(constantSystem)
+        .operation()
         .apply(ranges[instruction.left], ranges[instruction.right]);
   }
 
@@ -943,46 +937,48 @@
     return newInstruction;
   }
 
-  static BinaryOperation negateOperation(BinaryOperation operation) {
-    if (operation == const LessOperation()) {
-      return const GreaterEqualOperation();
-    } else if (operation == const LessEqualOperation()) {
-      return const GreaterOperation();
-    } else if (operation == const GreaterOperation()) {
-      return const LessEqualOperation();
-    } else if (operation == const GreaterEqualOperation()) {
-      return const LessOperation();
+  static constant_system.BinaryOperation negateOperation(
+      constant_system.BinaryOperation operation) {
+    if (operation == const constant_system.LessOperation()) {
+      return const constant_system.GreaterEqualOperation();
+    } else if (operation == const constant_system.LessEqualOperation()) {
+      return const constant_system.GreaterOperation();
+    } else if (operation == const constant_system.GreaterOperation()) {
+      return const constant_system.LessEqualOperation();
+    } else if (operation == const constant_system.GreaterEqualOperation()) {
+      return const constant_system.LessOperation();
     } else {
       return null;
     }
   }
 
-  static BinaryOperation flipOperation(BinaryOperation operation) {
-    if (operation == const LessOperation()) {
-      return const GreaterOperation();
-    } else if (operation == const LessEqualOperation()) {
-      return const GreaterEqualOperation();
-    } else if (operation == const GreaterOperation()) {
-      return const LessOperation();
-    } else if (operation == const GreaterEqualOperation()) {
-      return const LessEqualOperation();
+  static constant_system.BinaryOperation flipOperation(
+      constant_system.BinaryOperation operation) {
+    if (operation == const constant_system.LessOperation()) {
+      return const constant_system.GreaterOperation();
+    } else if (operation == const constant_system.LessEqualOperation()) {
+      return const constant_system.GreaterEqualOperation();
+    } else if (operation == const constant_system.GreaterOperation()) {
+      return const constant_system.LessOperation();
+    } else if (operation == const constant_system.GreaterEqualOperation()) {
+      return const constant_system.LessEqualOperation();
     } else {
       return null;
     }
   }
 
-  Range computeConstrainedRange(
-      BinaryOperation operation, Range leftRange, Range rightRange) {
+  Range computeConstrainedRange(constant_system.BinaryOperation operation,
+      Range leftRange, Range rightRange) {
     Range range;
-    if (operation == const LessOperation()) {
+    if (operation == const constant_system.LessOperation()) {
       range = info.newNormalizedRange(
           const MinIntValue(), rightRange.upper - info.intOne);
-    } else if (operation == const LessEqualOperation()) {
+    } else if (operation == const constant_system.LessEqualOperation()) {
       range = info.newNormalizedRange(const MinIntValue(), rightRange.upper);
-    } else if (operation == const GreaterOperation()) {
+    } else if (operation == const constant_system.GreaterOperation()) {
       range = info.newNormalizedRange(
           rightRange.lower + info.intOne, const MaxIntValue());
-    } else if (operation == const GreaterEqualOperation()) {
+    } else if (operation == const constant_system.GreaterEqualOperation()) {
       range = info.newNormalizedRange(rightRange.lower, const MaxIntValue());
     } else {
       range = info.newUnboundRange();
@@ -1006,8 +1002,8 @@
 
     Range rightRange = ranges[right];
     Range leftRange = ranges[left];
-    Operation operation = condition.operation(constantSystem);
-    Operation mirrorOp = flipOperation(operation);
+    constant_system.Operation operation = condition.operation();
+    constant_system.Operation mirrorOp = flipOperation(operation);
     // Only update the true branch if this block is the only
     // predecessor.
     if (branch.trueBranch.predecessors.length == 1) {
@@ -1033,8 +1029,8 @@
     // predecessor.
     if (branch.falseBranch.predecessors.length == 1) {
       assert(branch.falseBranch.predecessors[0] == branch.block);
-      Operation reverse = negateOperation(operation);
-      Operation reversedMirror = flipOperation(reverse);
+      constant_system.Operation reverse = negateOperation(operation);
+      constant_system.Operation reversedMirror = flipOperation(reverse);
       // Update the false branch to use narrower ranges for [left] and
       // [right].
       Range range = computeConstrainedRange(reverse, leftRange, rightRange);
@@ -1132,7 +1128,7 @@
     Range leftRange = visit(instruction.left);
     Range rightRange = visit(instruction.right);
     if (leftRange == null || rightRange == null) return null;
-    BinaryOperation operation = instruction.operation(info.constantSystem);
+    constant_system.BinaryOperation operation = instruction.operation();
     return operation.apply(leftRange, rightRange);
   }
 }
diff --git a/pkg/compiler/lib/src/ssa/variable_allocator.dart b/pkg/compiler/lib/src/ssa/variable_allocator.dart
index 6837537..aca7c88 100644
--- a/pkg/compiler/lib/src/ssa/variable_allocator.dart
+++ b/pkg/compiler/lib/src/ssa/variable_allocator.dart
@@ -4,6 +4,7 @@
 
 import '../common.dart';
 import '../js_backend/js_backend.dart';
+import 'codegen.dart' show CodegenPhase;
 import 'nodes.dart';
 
 /// The [LiveRange] class covers a range where an instruction is live.
@@ -153,7 +154,7 @@
 /// Builds the live intervals of each instruction. The algorithm visits
 /// the graph post-dominator tree to find the last uses of an
 /// instruction, and computes the liveIns of each basic block.
-class SsaLiveIntervalBuilder extends HBaseVisitor {
+class SsaLiveIntervalBuilder extends HBaseVisitor with CodegenPhase {
   final Set<HInstruction> generateAtUseSite;
   final Set<HInstruction> controlFlowOperators;
 
@@ -561,7 +562,7 @@
 /// instruction, it frees the names of the inputs that die at that
 /// instruction, and allocates a name to the instruction. For each phi,
 /// it adds a copy to the CopyHandler of the corresponding predecessor.
-class SsaVariableAllocator extends HBaseVisitor {
+class SsaVariableAllocator extends HBaseVisitor with CodegenPhase {
   final Namer _namer;
   final Map<HBasicBlock, LiveEnvironment> liveInstructions;
   final Map<HInstruction, LiveInterval> liveIntervals;
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index 323bca3..4bf8ac1 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -70,12 +70,6 @@
   void forEachInvokedSetter(
       f(String name, Map<Selector, SelectorConstraints> selectors));
 
-  /// Returns `true` if [field] has a constant initializer.
-  bool hasConstantFieldInitializer(covariant FieldEntity field);
-
-  /// Returns the constant initializer for [field].
-  ConstantValue getConstantFieldInitializer(covariant FieldEntity field);
-
   /// Returns `true` if [member] is invoked as a setter.
   bool hasInvokedSetter(MemberEntity member);
 
@@ -681,16 +675,6 @@
   }
 
   @override
-  bool hasConstantFieldInitializer(FieldEntity field) {
-    return _elementMap.hasConstantFieldInitializer(field);
-  }
-
-  @override
-  ConstantValue getConstantFieldInitializer(FieldEntity field) {
-    return _elementMap.getConstantFieldInitializer(field);
-  }
-
-  @override
   void forEachParameter(FunctionEntity function,
       void f(DartType type, String name, ConstantValue defaultValue)) {
     _elementMap.forEachParameter(function, f,
@@ -714,7 +698,8 @@
     _elementEnvironment.forEachClassMember(cls,
         (ClassEntity declarer, MemberEntity member) {
       if (member.isField && member.isInstanceMember) {
-        f(declarer, member, isElided: _world.elidedFields.contains(member));
+        f(declarer, member,
+            isElided: _world.fieldAnalysis.getFieldData(member).isElided);
       }
     });
   }
@@ -730,7 +715,7 @@
       if (declarer != cls) return;
       if (!member.isField) return;
       if (!member.isInstanceMember) return;
-      f(member, isElided: _world.elidedFields.contains(member));
+      f(member, isElided: _world.fieldAnalysis.getFieldData(member).isElided);
     });
   }
 
diff --git a/pkg/compiler/lib/src/universe/feature.dart b/pkg/compiler/lib/src/universe/feature.dart
index 1367e6d..f0c29bc 100644
--- a/pkg/compiler/lib/src/universe/feature.dart
+++ b/pkg/compiler/lib/src/universe/feature.dart
@@ -122,6 +122,29 @@
   }
 }
 
+/// Describes a use of a set literal in the program.
+class SetLiteralUse {
+  final InterfaceType type;
+  final bool isConstant;
+  final bool isEmpty;
+
+  SetLiteralUse(this.type, {this.isConstant: false, this.isEmpty: false});
+
+  int get hashCode =>
+      type.hashCode * 13 + isConstant.hashCode * 17 + isEmpty.hashCode * 19;
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    if (other is! SetLiteralUse) return false;
+    return type == other.type &&
+        isConstant == other.isConstant &&
+        isEmpty == other.isEmpty;
+  }
+
+  String toString() =>
+      'SetLiteralUse($type,isConstant:$isConstant,isEmpty:$isEmpty)';
+}
+
 /// Describes the use of a list literal in the program.
 class ListLiteralUse {
   final InterfaceType type;
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index da4c609..9835da3 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -10,7 +10,7 @@
 import '../elements/types.dart';
 import '../ir/static_type.dart';
 import '../js_backend/annotations.dart';
-import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
+import '../js_backend/field_analysis.dart' show KFieldAnalysis;
 import '../js_backend/backend_usage.dart'
     show BackendUsage, BackendUsageBuilder;
 import '../js_backend/interceptor_data.dart' show InterceptorDataBuilder;
@@ -397,7 +397,7 @@
   final InterceptorDataBuilder _interceptorDataBuilder;
   final BackendUsageBuilder _backendUsageBuilder;
   final RuntimeTypesNeedBuilder _rtiNeedBuilder;
-  final KAllocatorAnalysis _allocatorAnalysis;
+  final KFieldAnalysis _allocatorAnalysis;
   final NativeResolutionEnqueuer _nativeResolutionEnqueuer;
   final NoSuchMethodRegistry _noSuchMethodRegistry;
   final AnnotationsDataBuilder _annotationsDataBuilder;
@@ -1095,7 +1095,7 @@
         noSuchMethodData: _noSuchMethodRegistry.close(),
         resolutionWorldBuilder: this,
         rtiNeedBuilder: _rtiNeedBuilder,
-        allocatorAnalysis: _allocatorAnalysis,
+        fieldAnalysis: _allocatorAnalysis,
         implementedClasses: _implementedClasses,
         liveNativeClasses: _nativeResolutionEnqueuer.liveNativeClasses,
         liveInstanceMembers: _liveInstanceMembers,
diff --git a/pkg/compiler/lib/src/universe/selector.dart b/pkg/compiler/lib/src/universe/selector.dart
index 0696300..f8a1dc4 100644
--- a/pkg/compiler/lib/src/universe/selector.dart
+++ b/pkg/compiler/lib/src/universe/selector.dart
@@ -263,6 +263,27 @@
     return signatureApplies(element);
   }
 
+  /// Whether [this] could be a valid selector on `Null` without throwing.
+  bool appliesToNullWithoutThrow() {
+    var name = this.name;
+    if (isOperator && name == "==") return true;
+    // Known getters and valid tear-offs.
+    if (isGetter &&
+        (name == "hashCode" ||
+            name == "runtimeType" ||
+            name == "toString" ||
+            name == "noSuchMethod")) return true;
+    // Calling toString always succeeds, calls to `noSuchMethod` (even well
+    // formed calls) always throw.
+    if (isCall &&
+        name == "toString" &&
+        positionalArgumentCount == 0 &&
+        namedArgumentCount == 0) {
+      return true;
+    }
+    return false;
+  }
+
   bool signatureApplies(FunctionEntity function) {
     return callStructure.signatureApplies(function.parameterStructure);
   }
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index b674a0b..9b9e9e9 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -12,7 +12,6 @@
         JElementEnvironment,
         KCommonElements,
         KElementEnvironment;
-import 'constants/constant_system.dart';
 import 'deferred_load.dart';
 import 'diagnostics/diagnostic_listener.dart';
 import 'elements/entities.dart';
@@ -21,8 +20,7 @@
 import 'inferrer/abstract_value_domain.dart';
 import 'ir/static_type.dart';
 import 'js_backend/annotations.dart';
-import 'js_backend/allocator_analysis.dart'
-    show JAllocatorAnalysis, KAllocatorAnalysis;
+import 'js_backend/field_analysis.dart' show JFieldAnalysis, KFieldAnalysis;
 import 'js_backend/backend_usage.dart' show BackendUsage;
 import 'js_backend/interceptor_data.dart' show InterceptorData;
 import 'js_backend/native_data.dart' show NativeData;
@@ -47,7 +45,7 @@
 /// optimizations and other compiler decisions during code generation.
 // TODO(johnniwinther): Maybe this should just be called the JWorld.
 abstract class JClosedWorld implements World {
-  JAllocatorAnalysis get allocatorAnalysis;
+  JFieldAnalysis get fieldAnalysis;
 
   BackendUsage get backendUsage;
 
@@ -64,8 +62,6 @@
   /// Returns the [AbstractValueDomain] used in the global type inference.
   AbstractValueDomain get abstractValueDomain;
 
-  ConstantSystem get constantSystem;
-
   RuntimeTypesNeed get rtiNeed;
 
   NoSuchMethodData get noSuchMethodData;
@@ -202,8 +198,6 @@
   /// Returns the single [MemberEntity] that matches a call to [selector] on the
   /// [receiver]. If multiple targets exist, `null` is returned.
   MemberEntity locateSingleMember(Selector selector, AbstractValue receiver);
-
-  Iterable<FieldEntity> get elidedFields;
 }
 
 abstract class OpenWorld implements World {
@@ -233,7 +227,7 @@
 
 abstract class KClosedWorld {
   DartTypes get dartTypes;
-  KAllocatorAnalysis get allocatorAnalysis;
+  KFieldAnalysis get fieldAnalysis;
   BackendUsage get backendUsage;
   NativeData get nativeData;
   InterceptorData get interceptorData;
diff --git a/pkg/dart_internal/pubspec.yaml b/pkg/dart_internal/pubspec.yaml
index f44d167..da61ece 100644
--- a/pkg/dart_internal/pubspec.yaml
+++ b/pkg/dart_internal/pubspec.yaml
@@ -1,5 +1,5 @@
 name: dart_internal
-version: 0.1.2
+version: 0.1.3
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
@@ -16,4 +16,4 @@
 environment:
   # Restrict the upper bound so that we can remove support for this in a later
   # version of the SDK without it being a breaking change.
-  sdk: ">=2.0.0-dev.12.0 <2.2.0"
+  sdk: ">=2.0.0-dev.12.0 <2.3.0"
diff --git a/pkg/dartfix/test/src/driver_exclude_test.dart b/pkg/dartfix/test/src/driver_exclude_test.dart
index 7cb2020..b57f4a1 100644
--- a/pkg/dartfix/test/src/driver_exclude_test.dart
+++ b/pkg/dartfix/test/src/driver_exclude_test.dart
@@ -9,7 +9,7 @@
 
 import 'test_context.dart';
 
-const _debug = false;
+const _debug = true;
 
 main() {
   File exampleFile;
@@ -21,16 +21,23 @@
 
     final driver = new Driver();
     final testContext = new TestContext();
-    final testLogger = new TestLogger();
+    final testLogger = new TestLogger(debug: _debug);
     String exampleSource = await exampleFile.readAsString();
 
-    await driver.start(['-xuse-mixin', exampleDir.path],
-        testContext: testContext, testLogger: testLogger);
+    var args = ['-xuse-mixin', exampleDir.path];
     if (_debug) {
-      print(testLogger.stderrBuffer.toString());
-      print(testLogger.stdoutBuffer.toString());
-      print('--- original example');
-      print(exampleSource);
+      args.add('-v');
+    }
+    try {
+      await driver.start(args,
+          testContext: testContext, testLogger: testLogger);
+    } finally {
+      if (_debug) {
+        print(testLogger.stderrBuffer.toString());
+        print(testLogger.stdoutBuffer.toString());
+        print('--- original example');
+        print(exampleSource);
+      }
     }
 
     final suggestions = driver.result.suggestions;
diff --git a/pkg/dartfix/test/src/test_context.dart b/pkg/dartfix/test/src/test_context.dart
index 39ab0b3..11010eb 100644
--- a/pkg/dartfix/test/src/test_context.dart
+++ b/pkg/dartfix/test/src/test_context.dart
@@ -36,17 +36,18 @@
 }
 
 class TestLogger implements Logger {
+  final bool debug;
   final Ansi ansi;
   final stdoutBuffer = new StringBuffer();
   final stderrBuffer = new StringBuffer();
 
-  TestLogger() : this.ansi = new Ansi(false);
+  TestLogger({this.debug = false}) : this.ansi = new Ansi(false);
 
   @override
   void flush() {}
 
   @override
-  bool get isVerbose => false;
+  bool get isVerbose => debug;
 
   @override
   Progress progress(String message) {
@@ -64,7 +65,11 @@
   }
 
   @override
-  void trace(String message) {}
+  void trace(String message) {
+    if (debug) {
+      stdoutBuffer.writeln(message);
+    }
+  }
 }
 
 void expectHasSuggestion(
diff --git a/pkg/dev_compiler/bin/dartdevc.dart b/pkg/dev_compiler/bin/dartdevc.dart
index b366550..fbe7114 100755
--- a/pkg/dev_compiler/bin/dartdevc.dart
+++ b/pkg/dev_compiler/bin/dartdevc.dart
@@ -42,16 +42,22 @@
   _CompilerWorker(this._startupArgs, AsyncWorkerConnection workerConnection)
       : super(connection: workerConnection);
 
+  /// Keeps track of our last compilation result so it can potentially be
+  /// re-used in a worker.
+  CompilerResult lastResult;
+
   /// Performs each individual work request.
   Future<WorkResponse> performRequest(WorkRequest request) async {
     var args = _startupArgs.merge(request.arguments);
     var output = StringBuffer();
-    var result = await runZoned(() => compile(args), zoneSpecification:
-        ZoneSpecification(print: (self, parent, zone, message) {
+    var context = args.reuseResult ? lastResult : null;
+    lastResult = await runZoned(() => compile(args, previousResult: context),
+        zoneSpecification:
+            ZoneSpecification(print: (self, parent, zone, message) {
       output.writeln(message.toString());
     }));
     return WorkResponse()
-      ..exitCode = result.success ? 0 : 1
+      ..exitCode = lastResult.success ? 0 : 1
       ..output = output.toString();
   }
 }
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index 54e0f0f..cbb7d34 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -14,6 +14,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/ast/token.dart' show StringToken;
+import 'package:analyzer/src/dart/ast/utilities.dart' show UIAsCodeVisitorMixin;
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -66,7 +67,10 @@
 // expressions (which result in JS.Expression) and statements
 // (which result in (JS.Statement).
 class CodeGenerator extends Object
-    with NullableTypeInference, SharedCompiler<LibraryElement, ClassElement>
+    with
+        UIAsCodeVisitorMixin<JS.Node>,
+        NullableTypeInference,
+        SharedCompiler<LibraryElement, ClassElement>
     implements AstVisitor<JS.Node> {
   final SummaryDataStore summaryData;
 
@@ -336,6 +340,9 @@
     compilationUnits.forEach(visitCompilationUnit);
     assert(_deferredProperties.isEmpty);
 
+    moduleItems.addAll(afterClassDefItems);
+    afterClassDefItems.clear();
+
     // Visit directives (for exports)
     compilationUnits.forEach(_emitExportDirectives);
 
@@ -884,7 +891,7 @@
       classDef = _defineClassTypeArguments(
           classElem, typeFormals, classDef, className, deferredSupertypes);
     } else {
-      body.addAll(deferredSupertypes);
+      afterClassDefItems.addAll(deferredSupertypes);
     }
 
     body = [classDef];
@@ -3359,8 +3366,8 @@
   }
 
   /// Emits the raw type corresponding to the [element].
-  JS.Expression _emitTypeDefiningElement(TypeDefiningElement element) {
-    return _emitType(fillDynamicTypeArgsForElement(element));
+  JS.Expression _emitTypeDefiningElement(TypeDefiningElement e) {
+    return _emitType(instantiateElementTypeToBounds(rules, e));
   }
 
   JS.Expression _emitGenericClassType(
@@ -5416,21 +5423,6 @@
   }
 
   @override
-  JS.For visitForStatement(ForStatement node) {
-    var init = _visitExpression(node.initialization) ??
-        visitVariableDeclarationList(node.variables);
-    var updaters = node.updaters;
-    JS.Expression update;
-    if (updaters != null && updaters.isNotEmpty) {
-      update =
-          JS.Expression.binary(updaters.map(_visitExpression).toList(), ',')
-              .toVoidExpression();
-    }
-    var condition = _visitTest(node.condition);
-    return JS.For(init, condition, update, _visitScope(node.body));
-  }
-
-  @override
   JS.While visitWhileStatement(WhileStatement node) {
     return JS.While(_visitTest(node.condition), _visitScope(node.body));
   }
@@ -5440,32 +5432,8 @@
     return JS.Do(_visitScope(node.body), _visitTest(node.condition));
   }
 
-  @override
-  JS.Statement visitForEachStatement(ForEachStatement node) {
-    if (node.awaitKeyword != null) {
-      return _emitAwaitFor(node);
-    }
-
-    var init = _visitExpression(node.identifier);
-    var iterable = _visitExpression(node.iterable);
-
-    var body = _visitScope(node.body);
-    if (init == null) {
-      var id = _emitVariableDef(node.loopVariable.identifier);
-      init = js.call('let #', id);
-      if (_annotatedNullCheck(node.loopVariable.declaredElement)) {
-        body = JS.Block([_nullParameterCheck(JS.Identifier(id.name)), body]);
-      }
-      if (variableIsReferenced(id.name, iterable)) {
-        var temp = JS.TemporaryId('iter');
-        return JS.Block(
-            [iterable.toVariableDeclaration(temp), JS.ForOf(init, temp, body)]);
-      }
-    }
-    return JS.ForOf(init, iterable, body);
-  }
-
-  JS.Statement _emitAwaitFor(ForEachStatement node) {
+  JS.Statement _emitAwaitFor(SimpleIdentifier identifier,
+      DeclaredIdentifier loopVariable, Expression iterable, Statement body) {
     // Emits `await for (var value in stream) ...`, which desugars as:
     //
     // let iter = new StreamIterator(stream);
@@ -5488,10 +5456,10 @@
     var createStreamIter = _emitInstanceCreationExpression(
         streamIterator.element.unnamedConstructor,
         streamIterator,
-        () => [_visitExpression(node.iterable)]);
+        () => [_visitExpression(iterable)]);
     var iter = JS.TemporaryId('iter');
-    var variable = node.identifier ?? node.loopVariable.identifier;
-    var init = _visitExpression(node.identifier);
+    var variable = identifier ?? loopVariable.identifier;
+    var init = _visitExpression(identifier);
     if (init == null) {
       init = js.call('let # = #.current', [_emitVariableDef(variable), iter]);
     } else {
@@ -5510,7 +5478,7 @@
           JS.Yield(js.call('#.moveNext()', iter))
             ..sourceInformation = _nodeStart(variable),
           init,
-          _visitStatement(node.body),
+          _visitStatement(body),
           JS.Yield(js.call('#.cancel()', iter))
             ..sourceInformation = _nodeStart(variable)
         ]);
@@ -5525,6 +5493,34 @@
   @override
   visitContinueStatement(ContinueStatement node) {
     var label = node.label;
+    if (node.label != null) {
+      var parent = node.parent;
+      if (parent is SwitchCase) {
+        // If this is the last statement in this case, and we're jumping to the
+        // next statement in the following case, just omit the continue.  JS
+        // will fall through.
+        if (parent.statements.last == node) {
+          var grandparent = parent.parent;
+          if (grandparent is SwitchStatement) {
+            var members = grandparent.members;
+            for (int i = 0; i < members.length; ++i) {
+              if (members[i] == parent) {
+                if (i < members.length - 1) {
+                  var next = members[i + 1];
+                  if (next is SwitchMember &&
+                      next.labels
+                          .map((l) => l.label.name)
+                          .contains(node.label.name)) {
+                    return js.comment('continue to next case');
+                  }
+                }
+                break;
+              }
+            }
+          }
+        }
+      }
+    }
     return JS.Continue(label?.name);
   }
 
@@ -5721,26 +5717,27 @@
   JS.Expression visitListLiteral(ListLiteral node) {
     var elementType = (node.staticType as InterfaceType).typeArguments[0];
     if (!node.isConst) {
-      return _emitList(elementType, _visitExpressionList(node.elements));
+      return _emitList(elementType, _visitExpressionList(node.elements2));
     }
-    return _cacheConst(
-        () => _emitConstList(elementType, _visitExpressionList(node.elements)));
+    return _cacheConst(() =>
+        _emitConstList(elementType, _visitExpressionList(node.elements2)));
   }
 
-  @override
-  JS.Expression visitSetLiteral(SetLiteral node) {
+  // TODO(nshahan) Cleanup after control flow collections experiments are removed.
+  JS.Expression _emitSetLiteral(
+      Iterable<CollectionElement> elements, SetOrMapLiteral node) {
     var type = node.staticType as InterfaceType;
     if (!node.isConst) {
       var setType = _emitType(type);
-      if (node.elements.isEmpty) {
+      if (elements.isEmpty) {
         return js.call('#.new()', [setType]);
       }
-      return js
-          .call('#.from([#])', [setType, _visitExpressionList(node.elements)]);
+      return js.call(
+          '#.from([#])', [setType, _visitCollectionElementList(elements)]);
     }
     return _cacheConst(() => runtimeCall('constSet(#, [#])', [
           _emitType((node.staticType as InterfaceType).typeArguments[0]),
-          _visitExpressionList(node.elements)
+          _visitCollectionElementList(elements)
         ]));
   }
 
@@ -5764,26 +5761,19 @@
     return js.call('#.of(#)', [_emitType(arrayType), list]);
   }
 
-  @override
-  visitMapLiteral(MapLiteral node) {
-    emitEntries() {
-      var entries = <JS.Expression>[];
-      for (var e in node.entries) {
-        entries.add(_visitExpression(e.key));
-        entries.add(_visitExpression(e.value));
-      }
-      return entries;
-    }
-
+  JS.Expression _emitMapLiteral(
+      Iterable<CollectionElement> elements, SetOrMapLiteral node) {
     var type = node.staticType as InterfaceType;
     if (!node.isConst) {
       var mapType = _emitMapImplType(type);
-      if (node.entries.isEmpty) {
+      if (elements.isEmpty) {
         return js.call('new #.new()', [mapType]);
       }
-      return js.call('new #.from([#])', [mapType, emitEntries()]);
+      return js.call(
+          'new #.from([#])', [mapType, _visitCollectionElementList(elements)]);
     }
-    return _cacheConst(() => _emitConstMap(type, emitEntries()));
+    return _cacheConst(
+        () => _emitConstMap(type, _visitCollectionElementList(elements)));
   }
 
   JS.Expression _emitConstMap(InterfaceType type, List<JS.Expression> entries) {
@@ -5855,6 +5845,11 @@
     return e;
   }
 
+  /// Visits [nodes] with [_visitExpression].
+  List<JS.Expression> _visitExpressionList(Iterable<AstNode> nodes) {
+    return nodes?.map(_visitExpression)?.toList();
+  }
+
   /// Visit a Dart [node] that produces a JS statement, and marks its source
   /// location for debugging.
   JS.Statement _visitStatement(AstNode node) {
@@ -5869,9 +5864,20 @@
     return nodes?.map(_visitStatement)?.toList();
   }
 
-  /// Visits [nodes] with [_visitExpression].
-  List<JS.Expression> _visitExpressionList(Iterable<AstNode> nodes) {
-    return nodes?.map(_visitExpression)?.toList();
+  /// Visits [nodes] with [_visitColelctionElement].
+  List<JS.Expression> _visitCollectionElementList(
+      Iterable<CollectionElement> nodes) {
+    var expressions = <JS.Expression>[];
+    for (var node in nodes) {
+      //TODO(nshahan) Handle [IfElement] and [ForElement].
+      if (node is MapLiteralEntry) {
+        expressions.add(_visitExpression(node.key));
+        expressions.add(_visitExpression(node.value));
+      } else {
+        expressions.add(_visitExpression(node));
+      }
+    }
+    return expressions;
   }
 
   /// Gets the start position of [node] for use in source mapping.
@@ -6317,7 +6323,7 @@
   @override
   visitRedirectingConstructorInvocation(node) => _unreachable(node);
 
-  /// Unused. Handled in [visitForEachStatement].
+  /// Unused. Handled in [visitForStatement2].
   @override
   visitDeclaredIdentifier(node) => _unreachable(node);
 
@@ -6381,7 +6387,7 @@
   @override
   visitLibraryIdentifier(node) => _unreachable(node);
 
-  /// Unused, see [visitMapLiteral].
+  /// Unused, see [visitSetOrMapLiteral].
   @override
   visitMapLiteralEntry(node) => _unreachable(node);
 
@@ -6421,6 +6427,48 @@
   @override
   visitWithClause(node) => _unreachable(node);
 
+  // TODO(nshahan) Simplify when control-flow-collections experiments are removed.
+  // Should just accept a ForParts as an arg with fewer casts.
+  JS.For _emitFor(Expression initialization, VariableDeclarationList variables,
+      Expression condition, Iterable<Expression> updaters, Statement body) {
+    var init = _visitExpression(initialization) ??
+        visitVariableDeclarationList(variables);
+    JS.Expression update;
+    if (updaters != null && updaters.isNotEmpty) {
+      update =
+          JS.Expression.binary(updaters.map(_visitExpression).toList(), ',')
+              .toVoidExpression();
+    }
+
+    return JS.For(init, _visitTest(condition), update, _visitScope(body));
+  }
+
+  // TODO(nshahan) Simplify when control-flow-collections experiments are removed.
+  // Should just accept a ForEachParts as an arg with fewer casts.
+  JS.Statement _emitForEach(SimpleIdentifier identifier,
+      DeclaredIdentifier loopVariable, Expression iterable, Statement body) {
+    var jsLeftExpression = _visitExpression(identifier);
+    var jsIterable = _visitExpression(iterable);
+
+    var jsBody = _visitScope(body);
+    if (jsLeftExpression == null) {
+      var id = _emitVariableDef(loopVariable.identifier);
+      jsLeftExpression = js.call('let #', id);
+      if (_annotatedNullCheck(loopVariable.declaredElement)) {
+        jsBody =
+            JS.Block([_nullParameterCheck(JS.Identifier(id.name)), jsBody]);
+      }
+      if (variableIsReferenced(id.name, jsIterable)) {
+        var temp = JS.TemporaryId('iter');
+        return JS.Block([
+          jsIterable.toVariableDeclaration(temp),
+          JS.ForOf(jsLeftExpression, temp, jsBody)
+        ]);
+      }
+    }
+    return JS.ForOf(jsLeftExpression, jsIterable, jsBody);
+  }
+
   @override
   visitForElement(ForElement node) => _unreachable(node);
 
@@ -6436,18 +6484,51 @@
       _unreachable(node);
 
   @override
-  visitForStatement2(ForStatement2 node) => _unreachable(node);
+  JS.Statement visitForStatement2(ForStatement2 node) {
+    // TODO(nshahan) Simplify when control-flow-collections experiments are removed.
+    var forParts = node.forLoopParts;
+    if (forParts is ForPartsWithExpression) {
+      return _emitFor(forParts.initialization, null, forParts.condition,
+          forParts.updaters, node.body);
+    } else if (forParts is ForPartsWithDeclarations) {
+      return _emitFor(null, forParts.variables, forParts.condition,
+          forParts.updaters, node.body);
+    } else if (node.awaitKeyword == null) {
+      if (forParts is ForEachPartsWithIdentifier) {
+        return _emitForEach(
+            forParts.identifier, null, forParts.iterable, node.body);
+      } else if (forParts is ForEachPartsWithDeclaration) {
+        return _emitForEach(
+            null, forParts.loopVariable, forParts.iterable, node.body);
+      }
+    } else if (forParts is ForEachPartsWithIdentifier) {
+      return _emitAwaitFor(
+          forParts.identifier, null, forParts.iterable, node.body);
+    } else if (forParts is ForEachPartsWithDeclaration) {
+      return _emitAwaitFor(
+          null, forParts.loopVariable, forParts.iterable, node.body);
+    }
+    return _unreachable(node);
+  }
 
+  @deprecated
   @override
   visitListLiteral2(ListLiteral2 node) => _unreachable(node);
 
+  @deprecated
   @override
   visitMapLiteral2(MapLiteral2 node) => _unreachable(node);
 
+  @deprecated
   @override
   visitSetLiteral2(SetLiteral2 node) => _unreachable(node);
 
   @override
+  visitSetOrMapLiteral(SetOrMapLiteral node) => node.isSet
+      ? _emitSetLiteral(node.elements2, node)
+      : _emitMapLiteral(node.elements2, node);
+
+  @override
   visitSpreadElement(SpreadElement node) => _unreachable(node);
 
   @override
diff --git a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
index f9d836d..fc060a9 100644
--- a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/src/generated/constant.dart'
     show DartObject, DartObjectImpl;
 import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/generated/type_system.dart' show Dart2TypeSystem;
 
 class Tuple2<T0, T1> {
   final T0 e0;
@@ -20,7 +21,12 @@
   Tuple2(this.e0, this.e1);
 }
 
-// TODO(jmesserly): replace this with instantiateToBounds
+/// Instantiates [t] with dynamic bounds.
+///
+/// Note: this should only be used when the resulting type is later replaced,
+/// such as a "deferred supertype" (used to break circularity between the
+/// supertype's type arguments and the class definition). Otherwise
+/// [instantiateElementTypeToBounds] should be used instead.
 InterfaceType fillDynamicTypeArgsForClass(InterfaceType t) {
   if (t.typeArguments.isNotEmpty) {
     var rawT = t.element.type;
@@ -30,16 +36,32 @@
   return t;
 }
 
-// TODO(jmesserly): replace this with instantiateToBounds
-DartType fillDynamicTypeArgsForElement(TypeDefiningElement element) {
+/// Instantiates the [element] type to bounds.
+///
+/// Conceptually this is similar to [Dart2TypeSystem.instantiateToBounds] on
+/// `element.type`, but unfortunately typedef elements do not return a
+/// meaningful type, so we need to work around that.
+DartType instantiateElementTypeToBounds(
+    Dart2TypeSystem rules, TypeDefiningElement element) {
   Element e = element;
   if (e is TypeParameterizedElement) {
-    // TODO(jmesserly): GenericTypeAliasElement.type does not return the correct
-    // type (it is missing the type formals), so we workaround that here.
+    // TODO(jmesserly): we can't use `instantiateToBounds` because typedefs do
+    // not include their type parameters, for example:
+    //
+    //     typedef void void Func<T>(T x);               // Dart 1 syntax.
+    //     typedef void GenericFunc<T> = S Func<S>(T x); // Dart 2 syntax.
+    //
+    // There is no way to get a type that has `<T>` as a type formal from the
+    // element (without constructing it ourselves).
+    //
+    // Futhermore, the second line is represented by a GenericTypeAliasElement,
+    // and its type getter does not even include its own type formals `<S>`.
+    // That has to be worked around using `.function.type`.
     var type = e is GenericTypeAliasElement ? e.function.type : e.type;
+    var bounds = rules.instantiateTypeFormalsToBounds(e.typeParameters);
+    if (bounds == null) return type;
     return type.substitute2(
-        List.filled(e.typeParameters.length, DynamicTypeImpl.instance),
-        TypeParameterTypeImpl.getTypes(e.typeParameters));
+        bounds, TypeParameterTypeImpl.getTypes(e.typeParameters));
   }
   return element.type;
 }
diff --git a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
index 179dbb1..7ad873d 100644
--- a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
@@ -214,9 +214,7 @@
       ..addOption('module-root',
           help: '(deprecated) used to determine the default module name and\n'
               'summary import name if those are not provided.',
-          hide: hide)
-      ..addOption('library-root',
-          help: '(deprecated) used to name libraries inside the module.');
+          hide: hide);
   }
 
   static String _getLibraryRoot(ArgResults args) {
diff --git a/pkg/dev_compiler/lib/src/analyzer/nullable_type_inference.dart b/pkg/dev_compiler/lib/src/analyzer/nullable_type_inference.dart
index 8359048..4716548 100644
--- a/pkg/dev_compiler/lib/src/analyzer/nullable_type_inference.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/nullable_type_inference.dart
@@ -352,21 +352,27 @@
   }
 
   @override
-  visitForEachStatement(ForEachStatement node) {
-    if (node.identifier == null) {
-      var declaration = node.loopVariable;
-      var element = declaration.declaredElement;
-      _locals.add(element);
-      if (!_assertedNotNull(element)) {
-        _nullableLocals.add(element);
-      }
-    } else {
-      var element = node.identifier.staticElement;
-      if (element is LocalVariableElement && !_assertedNotNull(element)) {
-        _nullableLocals.add(element);
+  visitForStatement2(ForStatement2 node) {
+    var forLoopParts = node.forLoopParts;
+    if (forLoopParts is ForEachParts) {
+      if (forLoopParts is ForEachPartsWithIdentifier &&
+          forLoopParts.identifier != null) {
+        var element = forLoopParts.identifier.staticElement;
+        if (element is LocalVariableElement && !_assertedNotNull(element)) {
+          _nullableLocals.add(element);
+        }
+      } else if (forLoopParts is ForEachPartsWithDeclaration) {
+        var declaration = forLoopParts.loopVariable;
+        var element = declaration.declaredElement;
+        _locals.add(element);
+        if (!_assertedNotNull(element)) {
+          _nullableLocals.add(element);
+        }
+      } else {
+        throw new StateError('Unrecognized for loop parts');
       }
     }
-    super.visitForEachStatement(node);
+    super.visitForStatement2(node);
   }
 
   @override
diff --git a/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart b/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart
index 5c5ff36..3ad9677 100644
--- a/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart
@@ -82,29 +82,41 @@
   }
 
   @override
-  visitForEachStatement(ForEachStatement node) {
-    // Visit other children.
-    node.iterable.accept(this);
-    node.body.accept(this);
+  void visitForStatement2(ForStatement2 node) {
+    var forLoopParts = node.forLoopParts;
+    if (forLoopParts is ForEachParts) {
+      // Visit other children.
+      forLoopParts.iterable.accept(this);
+      node.body.accept(this);
 
-    // If needed, assert a cast inside the body before the variable is read.
-    var variable = node.identifier ?? node.loopVariable.identifier;
-    var castType = ast_properties.getImplicitCast(variable);
-    if (castType != null) {
-      // Build the cast. We will place this cast in the body, so need to clone
-      // the variable's AST node and clear out its static type (otherwise we
-      // will optimize away the cast).
-      var cast = castExpression(
-          _clone(variable)..staticType = DynamicTypeImpl.instance, castType);
-
-      var body = node.body;
-      var blockBody = <Statement>[ast.expressionStatement(cast)];
-      if (body is Block) {
-        blockBody.addAll(body.statements);
+      // If needed, assert a cast inside the body before the variable is read.
+      SimpleIdentifier variable;
+      if (forLoopParts is ForEachPartsWithIdentifier) {
+        variable = forLoopParts.identifier;
+      } else if (forLoopParts is ForEachPartsWithDeclaration) {
+        variable = forLoopParts.loopVariable.identifier;
       } else {
-        blockBody.add(body);
+        throw new StateError('Unrecognized for loop parts');
       }
-      _replaceNode(node, body, ast.block(blockBody));
+      var castType = ast_properties.getImplicitCast(variable);
+      if (castType != null) {
+        // Build the cast. We will place this cast in the body, so need to clone
+        // the variable's AST node and clear out its static type (otherwise we
+        // will optimize away the cast).
+        var cast = castExpression(
+            _clone(variable)..staticType = DynamicTypeImpl.instance, castType);
+
+        var body = node.body;
+        var blockBody = <Statement>[ast.expressionStatement(cast)];
+        if (body is Block) {
+          blockBody.addAll(body.statements);
+        } else {
+          blockBody.add(body);
+        }
+        _replaceNode(node, body, ast.block(blockBody));
+      }
+    } else {
+      super.visitForStatement2(node);
     }
   }
 
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_command.dart b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
index 39c4759..03558be 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_command.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
@@ -148,6 +148,10 @@
           help: '--bazel-mapping=gen/to/library.dart,to/library.dart\n'
               'adjusts the path in source maps.',
           splitCommas: false,
+          hide: hide)
+      ..addOption('library-root',
+          help: '(deprecated) used to name libraries inside the module, '
+              'ignored with -k.',
           hide: hide);
   }
 
@@ -467,8 +471,17 @@
   /// instead of Analyzer trees for representing the Dart code.
   final bool isKernel;
 
+  /// Whether to re-use the last compiler result when in a worker.
+  ///
+  /// This is useful if we are repeatedly compiling things in the same context,
+  /// e.g. in a debugger REPL.
+  final bool reuseResult;
+
   ParsedArguments._(this.rest,
-      {this.isBatch = false, this.isWorker = false, this.isKernel = false});
+      {this.isBatch = false,
+      this.isWorker = false,
+      this.isKernel = false,
+      this.reuseResult = false});
 
   /// Preprocess arguments to determine whether DDK is used in batch mode or as a
   /// persistent worker.
@@ -486,6 +499,7 @@
     bool isWorker = false;
     bool isBatch = false;
     bool isKernel = false;
+    bool reuseResult = false;
     var len = args.length;
     for (int i = 0; i < len; i++) {
       var arg = args[i];
@@ -502,12 +516,17 @@
         isBatch = true;
       } else if (arg == '--kernel' || arg == '-k') {
         isKernel = true;
+      } else if (arg == '--reuse-compiler-result') {
+        reuseResult = true;
       } else {
         newArgs.add(arg);
       }
     }
     return ParsedArguments._(newArgs,
-        isWorker: isWorker, isBatch: isBatch, isKernel: isKernel);
+        isWorker: isWorker,
+        isBatch: isBatch,
+        isKernel: isKernel,
+        reuseResult: reuseResult);
   }
 
   /// Whether the compiler is running in [isBatch] or [isWorker] mode.
@@ -532,7 +551,8 @@
     return ParsedArguments._(rest.toList()..addAll(newArgs.rest),
         isWorker: isWorker,
         isBatch: isBatch,
-        isKernel: isKernel || newArgs.isKernel);
+        isKernel: isKernel || newArgs.isKernel,
+        reuseResult: reuseResult);
   }
 }
 
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
index a39888c..66e0628 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
@@ -28,6 +28,12 @@
   /// The list of output module items, in the order they need to be emitted in.
   final moduleItems = <JS.ModuleItem>[];
 
+  /// Like [moduleItems] but for items that should be emitted after classes.
+  ///
+  /// This is used for deferred supertypes of mutually recursive non-generic
+  /// classes.
+  final afterClassDefItems = <JS.ModuleItem>[];
+
   /// When compiling the body of a `operator []=` method, this will be non-null
   /// and will indicate the the value that should be returned from any `return;`
   /// statements.
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 15dd91c..b3852c9 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -67,10 +67,11 @@
         abbr: 'h', help: 'Display this message.', negatable: false)
     ..addOption('out', abbr: 'o', help: 'Output file (required).')
     ..addOption('packages', help: 'The package spec file to use.')
-    // TODO(jmesserly): should default to `false` and be hidden.
-    // For now this is very helpful in debugging the compiler.
+    // TODO(jmesserly): is this still useful for us, or can we remove it now?
     ..addFlag('summarize-text',
-        help: 'emit API summary in a .js.txt file', defaultsTo: true)
+        help: 'emit API summary in a .js.txt file',
+        defaultsTo: false,
+        hide: true)
     // TODO(jmesserly): add verbose help to show hidden options
     ..addOption('dart-sdk-summary',
         help: 'The path to the Dart SDK summary file.', hide: true)
@@ -246,9 +247,9 @@
     outFiles.add(sink.flush().then((_) => sink.close()));
   }
   if (argResults['summarize-text'] as bool) {
-    var sink = File(output + '.txt').openWrite();
-    kernel.Printer(sink, showExternal: false).writeComponentFile(component);
-    outFiles.add(sink.flush().then((_) => sink.close()));
+    StringBuffer sb = new StringBuffer();
+    kernel.Printer(sb, showExternal: false).writeComponentFile(component);
+    outFiles.add(File(output + '.txt').writeAsString(sb.toString()));
   }
   var target = compilerState.options.target as DevCompilerTarget;
   var compiler =
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index cd0af30e..6c5ccc6 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -314,6 +314,9 @@
     // This is done by forward declaring items.
     libraries.forEach(_emitLibrary);
 
+    moduleItems.addAll(afterClassDefItems);
+    afterClassDefItems.clear();
+
     // Visit directives (for exports)
     libraries.forEach(_emitExports);
 
@@ -569,7 +572,7 @@
       classDef = _defineClassTypeArguments(
           c, typeFormals, classDef, className, deferredSupertypes);
     } else {
-      body.addAll(deferredSupertypes);
+      afterClassDefItems.addAll(deferredSupertypes);
     }
 
     body = [classDef];
@@ -1116,14 +1119,34 @@
     return runtimeStatement('addTypeTests(#, #)', [defaultInst, isClassSymbol]);
   }
 
-  void _emitSymbols(Iterable<JS.TemporaryId> vars, List<JS.ModuleItem> body) {
+  JS.Expression _emitDartSymbol(String symbolName) {
+    // TODO(vsm): Handle qualified symbols correctly.
+    var last = symbolName.split('.').last;
+    var name = js.escapedString(symbolName, "'");
+    if (last.startsWith('_')) {
+      var nativeSymbol = emitPrivateNameSymbol(_currentLibrary, last);
+      return js.call('new #.new(#, #)', [
+        _emitConstructorAccess(privateSymbolClass.rawType),
+        name,
+        nativeSymbol
+      ]);
+    } else {
+      return js.call('new #.new(#)', [
+        _emitConstructorAccess(coreTypes.internalSymbolClass.rawType),
+        name
+      ]);
+    }
+  }
+
+  void _emitDartSymbols(
+      Iterable<JS.TemporaryId> vars, List<JS.ModuleItem> body) {
     for (var id in vars) {
       body.add(js.statement('const # = Symbol(#)', [id, js.string(id.name)]));
     }
   }
 
   void _emitSuperHelperSymbols(List<JS.Statement> body) {
-    _emitSymbols(
+    _emitDartSymbols(
         _superHelpers.values.map((m) => m.name as JS.TemporaryId), body);
     _superHelpers.clear();
   }
@@ -3821,6 +3844,9 @@
       if (value is PrimitiveConstant) return value.accept(this);
     }
 
+    // TODO(markzipan): reifyTearOff check can be removed when we enable
+    // front-end constant evaluation because static tear-offs will be
+    // treated as constants and handled by visitTearOffConstant.
     var result = _emitStaticTarget(target);
     if (_reifyTearoff(target)) {
       // TODO(jmesserly): we could tag static/top-level function types once
@@ -4820,26 +4846,7 @@
 
   @override
   visitSymbolLiteral(SymbolLiteral node) {
-    JS.Expression emitSymbol() {
-      // TODO(vsm): Handle qualified symbols correctly.
-      var last = node.value.split('.').last;
-      var name = js.escapedString(node.value, "'");
-      if (last.startsWith('_')) {
-        var nativeSymbol = emitPrivateNameSymbol(_currentLibrary, last);
-        return js.call('new #.new(#, #)', [
-          _emitConstructorAccess(privateSymbolClass.rawType),
-          name,
-          nativeSymbol
-        ]);
-      } else {
-        return js.call('new #.new(#)', [
-          _emitConstructorAccess(coreTypes.internalSymbolClass.rawType),
-          name
-        ]);
-      }
-    }
-
-    return _emitConst(emitSymbol);
+    return _emitConst(() => _emitDartSymbol(node.value));
   }
 
   JS.Expression _cacheConst(JS.Expression expr()) {
@@ -4865,8 +4872,10 @@
       _cacheConst(() => runtimeCall('const(#)', expr()));
 
   @override
-  visitTypeLiteral(TypeLiteral node) {
-    var typeRep = _emitType(node.type);
+  visitTypeLiteral(TypeLiteral node) => _emitTypeLiteral(node.type);
+
+  _emitTypeLiteral(DartType type) {
+    var typeRep = _emitType(type);
     // If the type is a type literal expression in Dart code, wrap the raw
     // runtime type in a "Type" instance.
     return _isInForeignJS ? typeRep : runtimeCall('wrapType(#)', typeRep);
@@ -4887,6 +4896,7 @@
   @override
   visitListLiteral(ListLiteral node) {
     var elementType = node.typeArgument;
+    // TODO(markzipan): remove const check when we use front-end const eval
     if (!node.isConst) {
       return _emitList(elementType, _visitExpressionList(node.expressions));
     }
@@ -4896,6 +4906,7 @@
 
   @override
   visitSetLiteral(SetLiteral node) {
+    // TODO(markzipan): remove const check when we use front-end const eval
     if (!node.isConst) {
       var setType = visitInterfaceType(
           InterfaceType(linkedHashSetClass, [node.typeArgument]));
@@ -4942,6 +4953,7 @@
       return JS.ArrayInitializer(entries);
     }
 
+    // TODO(markzipan): remove const check when we use front-end const eval
     if (!node.isConst) {
       var mapType =
           _emitMapImplType(node.getStaticType(types) as InterfaceType);
@@ -5025,6 +5037,11 @@
   }
 
   @override
+  visitBlockExpression(BlockExpression node) {
+    throw UnimplementedError('ProgramCompiler.visitBlockExpression');
+  }
+
+  @override
   visitInstantiation(Instantiation node) {
     return runtimeCall('gbind(#, #)', [
       _visitExpression(node.expression),
@@ -5090,6 +5107,7 @@
     return _constants.getNameFromAnnotation(findAnnotation(node, test));
   }
 
+  JS.Expression visitConstant(Constant node) => node.accept(this);
   @override
   visitNullConstant(NullConstant node) => JS.LiteralNull();
   @override
@@ -5106,21 +5124,87 @@
   @override
   defaultConstant(Constant node) => _emitInvalidNode(node);
   @override
-  visitSymbolConstant(node) => defaultConstant(node);
+  visitSymbolConstant(node) {
+    return _emitConst(() => _emitDartSymbol(node.name));
+  }
+
   @override
-  visitMapConstant(node) => defaultConstant(node);
+  visitMapConstant(node) {
+    emitEntries() {
+      var entries = <JS.Expression>[];
+      for (var e in node.entries) {
+        entries.add(visitConstant(e.key));
+        entries.add(visitConstant(e.value));
+      }
+      return JS.ArrayInitializer(entries);
+    }
+
+    return _cacheConst(() => runtimeCall('constMap(#, #, #)',
+        [_emitType(node.keyType), _emitType(node.valueType), emitEntries()]));
+  }
+
   @override
-  visitListConstant(node) => defaultConstant(node);
+  visitListConstant(node) {
+    return _cacheConst(() => _emitConstList(
+        node.typeArgument, node.entries.map(visitConstant).toList()));
+  }
+
   @override
-  visitInstanceConstant(node) => defaultConstant(node);
+  visitSetConstant(node) {
+    // Set literals are currently desugared in the frontend.
+    // Implement this method before flipping the supportsSetLiterals flag
+    // in DevCompilerTarget to true.
+    throw "Set literal constants not supported.";
+  }
+
   @override
-  visitTearOffConstant(node) => defaultConstant(node);
+  visitInstanceConstant(node) {
+    entryToProperty(entry) {
+      var field = entry.key.asField.name.name;
+      var constant = entry.value.accept(this);
+      var member = entry.key.asField;
+      var prevLibrary = _currentLibrary;
+      _currentLibrary = member.enclosingLibrary;
+      var result =
+          JS.Property(_emitMemberName(field, member: member), constant);
+      _currentLibrary = prevLibrary;
+      return result;
+    }
+
+    var type = visitInterfaceType(node.getType(types) as InterfaceType);
+    JS.Expression prototype = js("#.prototype", [type]);
+    JS.Property proto_prop = JS.Property(_propertyName("__proto__"), prototype);
+    List<JS.Property> properties = [proto_prop]
+      ..addAll(node.fieldValues.entries.map(entryToProperty));
+    var objectInit = JS.ObjectInitializer(properties, multiline: true);
+    return _emitConst(() => objectInit);
+  }
+
   @override
-  visitTypeLiteralConstant(node) => defaultConstant(node);
+  visitTearOffConstant(node) {
+    var target = node.procedure;
+    var result = _emitStaticTarget(target);
+    // TODO(jmesserly): we could tag static/top-level function types once
+    // in the module initialization, rather than at the point where they
+    // escape.
+    return _emitFunctionTagged(result, target.function.functionType);
+  }
+
   @override
-  visitPartialInstantiationConstant(node) => defaultConstant(node);
+  visitTypeLiteralConstant(node) => _emitTypeLiteral(node.type);
+
   @override
-  visitUnevaluatedConstant(node) => defaultConstant(node);
+  visitPartialInstantiationConstant(node) {
+    return runtimeCall('gbind(#, #)', [
+      visitConstant(node.tearOffConstant),
+      node.types.map(_emitType).toList()
+    ]);
+  }
+
+  @override
+  visitUnevaluatedConstant(node) {
+    return _visitExpression(node.expression);
+  }
 }
 
 bool isSdkInternalRuntime(Library l) =>
diff --git a/pkg/dev_compiler/lib/src/kernel/constants.dart b/pkg/dev_compiler/lib/src/kernel/constants.dart
index 0e9d692..5f1e815 100644
--- a/pkg/dev_compiler/lib/src/kernel/constants.dart
+++ b/pkg/dev_compiler/lib/src/kernel/constants.dart
@@ -19,7 +19,7 @@
   DevCompilerConstants(
       TypeEnvironment types, Map<String, String> declaredVariables)
       : _visitor = _ConstantVisitor(types.coreTypes),
-        _evaluator = ConstantEvaluator(DevCompilerConstantsBackend(),
+        _evaluator = ConstantEvaluator(const DevCompilerConstantsBackend(),
             declaredVariables, types, false, const _ErrorReporter());
 
   /// Determines if an expression is constant.
@@ -170,24 +170,10 @@
 
 /// Implement the class for compiler specific behavior.
 class DevCompilerConstantsBackend extends ConstantsBackend {
-  DevCompilerConstantsBackend();
+  const DevCompilerConstantsBackend();
 
   @override
-  Constant lowerConstant(Constant constant) {
-    if (constant is DoubleConstant) {
-      // Convert to an integer when possible (matching the runtime behavior
-      // of `is int`).
-      var d = constant.value;
-      if (d.isFinite) {
-        var i = d.toInt();
-        if (d == i.toDouble()) return IntConstant(i);
-      }
-    }
-    return constant;
-  }
-
-  // Use doubles to match JS number semantics.
-  num prepareNumericOperand(num operand) => operand.toDouble();
+  NumberSemantics get numberSemantics => NumberSemantics.js;
 }
 
 class _ErrorReporter extends SimpleErrorReporter {
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 75aedd1..1227ed7 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -151,7 +151,7 @@
 
   @override
   ConstantsBackend constantsBackend(CoreTypes coreTypes) =>
-      new DevCompilerConstantsBackend();
+      const DevCompilerConstantsBackend();
 }
 
 /// Analyzes a component to determine if any covariance checks in private
diff --git a/pkg/dev_compiler/test/sourcemap/ddc_common.dart b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
index 3d187dd..437b008 100644
--- a/pkg/dev_compiler/test/sourcemap/ddc_common.dart
+++ b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
@@ -134,15 +134,24 @@
     let global = new Function('return this;')();
     $d8Preambles
 
+    // d8 does not seem to print the `.stack` property like
+    // node.js and browsers do, so include that.
+    Error.prototype.toString = function() {
+      // Note: on d8, the stack property includes the error message too.
+      return this.stack;
+    };
+
+    global.scheduleImmediate = function(callback) {
+      // Ensure unhandled promise rejections get printed.
+      Promise.resolve(null).then(callback).catch(e => console.error(e));
+    };
+
     let main = $inputFileNameNoExt.main;
     dart.ignoreWhitelistedErrors(false);
     try {
       dartMainRunner(main, []);
     } catch(e) {
       console.error(e);
-      // d8 does not seem to print the `.stack` property like
-      // node.js and browsers do.
-      console.error(e.stack);
     }
     """;
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/libraries.dart b/pkg/dev_compiler/tool/input_sdk/libraries.dart
index 1a08e42..6009d0c 100644
--- a/pkg/dev_compiler/tool/input_sdk/libraries.dart
+++ b/pkg/dev_compiler/tool/input_sdk/libraries.dart
@@ -61,11 +61,6 @@
       categories: "Client,Server,Embedded",
       maturity: Maturity.UNSTABLE,
       dart2jsPatchPath: "_internal/js_runtime/lib/developer_patch.dart"),
-  "ffi": const LibraryInfo("ffi/ffi.dart",
-      categories: "Server",
-      // TODO(dacoharkes): Update maturity when we release dart:ffi.
-      // https://github.com/dart-lang/sdk/issues/34452
-      maturity: Maturity.EXPERIMENTAL),
   "html": const LibraryInfo("html/dart2js/html_dart2js.dart",
       categories: "Client",
       maturity: Maturity.WEB_STABLE,
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
index fe36fea..ca4ef7d 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
@@ -9,9 +9,6 @@
 import 'dart:_foreign_helper' show JS, JSExportName;
 import 'dart:_runtime' as dart;
 
-typedef void _Callback();
-typedef void _TakeCallback(_Callback callback);
-
 /// This function adapts ES6 generators to implement Dart's async/await.
 ///
 /// It's designed to interact with Dart's Future and follow Dart async/await
@@ -135,77 +132,39 @@
 @patch
 class _AsyncRun {
   @patch
-  static void _scheduleImmediate(void callback()) {
+  static void _scheduleImmediate(void Function() callback) {
     _scheduleImmediateClosure(callback);
   }
 
   // Lazily initialized.
-  static final _TakeCallback _scheduleImmediateClosure =
-      _initializeScheduleImmediate();
+  static final _scheduleImmediateClosure = _initializeScheduleImmediate();
 
-  static _TakeCallback _initializeScheduleImmediate() {
-    // TODO(rnystrom): Not needed by dev_compiler.
-    // requiresPreamble();
+  static void Function(void Function()) _initializeScheduleImmediate() {
+    // d8 support, see preambles/d8.js for the definiton of `scheduleImmediate`.
+    //
+    // TODO(jmesserly): do we need this? It's only for our d8 stack trace test.
     if (JS('', '#.scheduleImmediate', dart.global_) != null) {
-      return _scheduleImmediateJsOverride;
+      return _scheduleImmediateJSOverride;
     }
-    if (JS('', '#.MutationObserver', dart.global_) != null &&
-        JS('', '#.document', dart.global_) != null) {
-      // Use mutationObservers.
-      var div = JS('', '#.document.createElement("div")', dart.global_);
-      var span = JS('', '#.document.createElement("span")', dart.global_);
-      _Callback storedCallback;
-
-      internalCallback(_) {
-        var f = storedCallback;
-        storedCallback = null;
-        dart.removeAsyncCallback();
-        f();
-      }
-
-      var observer =
-          JS('', 'new #.MutationObserver(#)', dart.global_, internalCallback);
-      JS('', '#.observe(#, { childList: true })', observer, div);
-
-      return (void callback()) {
-        assert(storedCallback == null);
-        dart.addAsyncCallback();
-        storedCallback = callback;
-        // Because of a broken shadow-dom polyfill we have to change the
-        // children instead a cheap property.
-        // See https://github.com/Polymer/ShadowDOM/issues/468
-        JS('', '#.firstChild ? #.removeChild(#): #.appendChild(#)', div, div,
-            span, div, span);
-      };
-    } else if (JS('', '#.setImmediate', dart.global_) != null) {
-      return _scheduleImmediateWithSetImmediate;
-    }
-    // TODO(20055): We should use DOM promises when available.
-    return _scheduleImmediateWithTimer;
+    return _scheduleImmediateWithPromise;
   }
 
-  static void _scheduleImmediateJsOverride(void callback()) {
-    internalCallback() {
+  @ReifyFunctionTypes(false)
+  static void _scheduleImmediateJSOverride(void Function() callback) {
+    dart.addAsyncCallback();
+    JS('void', '#.scheduleImmediate(#)', dart.global_, () {
       dart.removeAsyncCallback();
       callback();
-    }
-
-    dart.addAsyncCallback();
-    JS('void', '#.scheduleImmediate(#)', dart.global_, internalCallback);
+    });
   }
 
-  static void _scheduleImmediateWithSetImmediate(void callback()) {
-    internalCallback() {
+  @ReifyFunctionTypes(false)
+  static Object _scheduleImmediateWithPromise(void Function() callback) {
+    dart.addAsyncCallback();
+    JS('', '#.Promise.resolve(null).then(#)', dart.global_, () {
       dart.removeAsyncCallback();
       callback();
-    }
-
-    dart.addAsyncCallback();
-    JS('void', '#.setImmediate(#)', dart.global_, internalCallback);
-  }
-
-  static void _scheduleImmediateWithTimer(void callback()) {
-    Timer._createTimer(Duration.zero, callback);
+    });
   }
 }
 
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
index 781a0c9..f9dd584 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
@@ -465,7 +465,7 @@
         var equals = _equals;
         for (int i = 0, n = JS('!', '#.length', buckets); i < n; i++) {
           E k = JS('', '#[#]', buckets, i);
-          if (equals(k, key)) return JS('', '#', k);
+          if (equals(k, key)) return k;
         }
       }
     }
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
index 581bc3f..9027893 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
@@ -374,6 +374,22 @@
 
   @patch
   static int _now() => Primitives.timerTicks();
+
+  @patch
+  int get elapsedMicroseconds {
+    int ticks = elapsedTicks;
+    if (_frequency == 1000000) return ticks;
+    assert(_frequency == 1000);
+    return ticks * 1000;
+  }
+
+  @patch
+  int get elapsedMilliseconds {
+    int ticks = elapsedTicks;
+    if (_frequency == 1000) return ticks;
+    assert(_frequency == 1000000);
+    return ticks ~/ 1000;
+  }
 }
 
 // Patch for List implementation.
@@ -1246,7 +1262,7 @@
   /// Shifts the digits of [xDigits] into the right place in [resultDigits].
   ///
   /// `resultDigits[ds..xUsed+ds] = xDigits[0..xUsed-1] << (n % _DIGIT_BITS)`
-  ///   where `ds = ceil(n / _DIGIT_BITS)`
+  ///   where `ds = n ~/ _DIGIT_BITS`
   ///
   /// Does *not* clear digits below ds.
   static void _lsh(
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
index 7d28269..7f5e4fe 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
@@ -4,9 +4,11 @@
 
 // Patch file for dart:developer library.
 
-import 'dart:_js_helper' show patch, ForceInline;
-import 'dart:_foreign_helper' show JS;
+import 'dart:_js_helper' show patch, ForceInline, ReifyFunctionTypes;
+import 'dart:_foreign_helper' show JS, JSExportName;
+import 'dart:_runtime' as dart;
 import 'dart:async';
+import 'dart:convert' show json;
 import 'dart:isolate';
 
 @patch
@@ -61,6 +63,33 @@
   JS('', 'console.debug("dart.developer.registerExtension", #)', method);
 }
 
+/// Returns a JS `Promise` that resolves with the result of invoking
+/// [methodName] with an [encodedJson] map as its parameters.
+///
+/// This is used by the VM Service Prototcol to invoke extensions registered
+/// with [registerExtension]. For example, in JS:
+///
+///     await sdk.developer.invokeExtension(
+/// .         "ext.flutter.inspector.getRootWidget", '{"objectGroup":""}');
+///
+@JSExportName('invokeExtension')
+@ReifyFunctionTypes(false)
+_invokeExtension(String methodName, String encodedJson) {
+  // TODO(vsm): We should factor this out as future<->promise.
+  return JS('', 'new #.Promise(#)', dart.global_,
+      (Function(Object) resolve, Function(Object) reject) async {
+    try {
+      var method = _lookupExtension(methodName);
+      var parameters = (json.decode(encodedJson) as Map).cast<String, String>();
+      var result = await method(methodName, parameters);
+      resolve(result._toString());
+    } catch (e) {
+      // TODO(vsm): Reject or encode in result?
+      reject('$e');
+    }
+  });
+}
+
 @patch
 void _postEvent(String eventKind, String eventData) {
   JS('', 'console.debug("dart.developer.postEvent", #, #)', eventKind,
diff --git a/pkg/dev_compiler/tool/input_sdk/private/custom_hash_map.dart b/pkg/dev_compiler/tool/input_sdk/private/custom_hash_map.dart
index e2cde4c..6b90717 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/custom_hash_map.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/custom_hash_map.dart
@@ -101,7 +101,10 @@
         var equals = _equals;
         for (int i = 0, n = JS('int', '#.length', buckets); i < n; i++) {
           K k = JS('', '#[#]', buckets, i);
-          if (equals(k, key)) return JS('', '#.get(#)', _map, k);
+          if (equals(k, key)) {
+            V value = JS('', '#.get(#)', _map, k);
+            return value == null ? null : value; // coerce undefined to null.
+          }
         }
       }
     }
@@ -147,6 +150,7 @@
       JS('', '#.push(#)', buckets, key);
     }
     V value = ifAbsent();
+    if (value == null) value = null; // coerce undefined to null.
     JS('', '#.set(#, #)', _map, key, value);
     _modifications = (_modifications + 1) & 0x3ffffff;
     return value;
@@ -171,7 +175,7 @@
           V value = JS('', '#.get(#)', map, k);
           JS('', '#.delete(#)', map, k);
           _modifications = (_modifications + 1) & 0x3ffffff;
-          return value;
+          return value == null ? null : value; // coerce undefined to null.
         }
       }
     }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
index 70ccace..8c8e929 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
@@ -168,6 +168,7 @@
     '''class DartError extends Error {
       constructor(error) {
         super();
+        if (error == null) error = #;
         this[#] = error;
         if (error != null && typeof error == "object" && error[#] == null) {
           error[#] = this;
@@ -177,6 +178,7 @@
         return #(this[#]);
       }
     }''',
+    NullThrownError(),
     _thrownValue,
     _jsError,
     _jsError,
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
index ef023d2..5e784a4 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
@@ -140,3 +140,21 @@
   JS('', '#.set(#, #)', _loadedSourceMaps, moduleName, sourceMap);
   JS('', '#.set(#, #)', _loadedModules, moduleName, libraries);
 }
+
+List<String> _libraries;
+
+/// Returns a JSArray of library uris (e.g,
+/// ['dart:core', 'dart:_internal', ..., 'package:foo/bar.dart', ... 'main.dart'])
+/// loaded in this application.
+List<String> getLibraries() {
+  if (_libraries == null) {
+    _libraries = [];
+    var modules = getModuleNames();
+    for (var name in modules) {
+      var module = getModuleLibraries(name);
+      List props = getOwnPropertyNames(module);
+      _libraries.addAll(props.whereType());
+    }
+  }
+  return _libraries;
+}
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
index 5eaff1c..7b161fb 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
@@ -165,7 +165,8 @@
 /// A list of functions to reset static fields back to their uninitialized
 /// state.
 ///
-/// This is populated by [defineLazyField].
+/// This is populated by [defineLazyField], and only contains the list of fields
+/// that have actually been initialized.
 @notNull
 final List<void Function()> _resetFields = JS('', '[]');
 
@@ -174,6 +175,7 @@
 /// This should be called when the user requests a hot-restart, when the UI is
 /// handling that user action.
 void hotRestart() {
+  // TODO(jmesserly): we need to prevent all pending callbacks from firing.
   for (var f in _resetFields) f();
   _resetFields.clear();
   for (var m in _cacheMaps) JS('', '#.clear()', m);
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
index dcaf067..435d89e 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
@@ -76,6 +76,16 @@
     let f = init;
     init = $throwCyclicInitializationError;
     if (f === init) f($name); // throw cycle error
+
+    // On the first (non-cyclic) execution, record the field so we can reset it
+    // later if needed (hot restart).
+    $_resetFields.push(() => {
+      init = initializer;
+      value = null;
+    });
+
+    // Try to evaluate the field, using try+catch to ensure we implement the
+    // correct Dart error semantics.
     try {
       value = f();
       init = null;
@@ -93,10 +103,6 @@
       value = x;
     };
   }
-  $_resetFields.push(() => {
-    init = initializer;
-    value = null;
-  });
   return ${defineProperty(to, name, desc)};
 })()''');
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
index 63849d8..3a6f4e9 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
@@ -659,7 +659,13 @@
   bool hasChildren(object) => true;
 
   String preview(object) {
-    return dart.typeName(dart.getReifiedType(object));
+    // The debugger can createa a preview of a FunctionType while it's being
+    // constructed (before argument types exist), so we need to catch errors.
+    try {
+      return dart.typeName(dart.getReifiedType(object));
+    } catch (e) {
+      return safePreview(object, JsonMLConfig.none);
+    }
   }
 
   List<NameValuePair> children(object) => <NameValuePair>[
diff --git a/pkg/dev_compiler/tool/input_sdk/private/identity_hash_map.dart b/pkg/dev_compiler/tool/input_sdk/private/identity_hash_map.dart
index 22d2125..d75f86932 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/identity_hash_map.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/identity_hash_map.dart
@@ -55,7 +55,8 @@
   }
 
   V operator [](Object key) {
-    return JS('', '#.get(#)', _map, key);
+    V value = JS('', '#.get(#)', _map, key);
+    return value == null ? null : value; // coerce undefined to null.
   }
 
   void operator []=(K key, V value) {
@@ -70,6 +71,7 @@
   V putIfAbsent(K key, V ifAbsent()) {
     if (JS('bool', '#.has(#)', _map, key)) return JS('', '#.get(#)', _map, key);
     V value = ifAbsent();
+    if (value == null) value = null; // coerce undefined to null.
     JS('', '#.set(#, #)', _map, key, value);
     _modifications = (_modifications + 1) & 0x3ffffff;
     return value;
@@ -80,7 +82,7 @@
     if (JS('bool', '#.delete(#)', _map, key)) {
       _modifications = (_modifications + 1) & 0x3ffffff;
     }
-    return value;
+    return value == null ? null : value; // coerce undefined to null.
   }
 
   void clear() {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
index a8672f1..8916dcc 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
@@ -197,7 +197,7 @@
   }
 
   static int timerFrequency;
-  static Function timerTicks;
+  static num Function() timerTicks;
 
   static bool get isD8 {
     return JS(
diff --git a/pkg/dev_compiler/tool/input_sdk/private/linked_hash_map.dart b/pkg/dev_compiler/tool/input_sdk/private/linked_hash_map.dart
index f5cde5c..f3bbaad 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/linked_hash_map.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/linked_hash_map.dart
@@ -153,7 +153,8 @@
       }
       return null;
     }
-    return JS('', '#.get(#)', _map, key);
+    V value = JS('', '#.get(#)', _map, key);
+    return value == null ? null : value; // coerce undefined to null.
   }
 
   void operator []=(K key, V value) {
@@ -195,6 +196,7 @@
       return JS('', '#.get(#)', map, key);
     }
     V value = ifAbsent();
+    if (value == null) value = null; // coerce undefined to null.
     JS('', '#.set(#, #)', map, key, value);
     _modifications = (_modifications + 1) & 0x3ffffff;
     return value;
@@ -229,7 +231,7 @@
     if (JS('bool', '#.delete(#)', map, key)) {
       _modifications = (_modifications + 1) & 0x3ffffff;
     }
-    return value;
+    return value == null ? null : value; // coerce undefined to null.
   }
 
   void clear() {
diff --git a/pkg/expect/lib/async_minitest.dart b/pkg/expect/lib/async_minitest.dart
index 6d135bc..40c69da 100644
--- a/pkg/expect/lib/async_minitest.dart
+++ b/pkg/expect/lib/async_minitest.dart
@@ -56,7 +56,7 @@
   _popName(oldName);
 }
 
-void expect(Object value, Object matcher) {
+void expect(Object value, Object matcher, {String reason}) {
   Matcher m;
   if (matcher is _Matcher) {
     m = matcher.call;
@@ -260,6 +260,10 @@
   Expect.type<List>(o);
 }
 
+void isNotNull(Object o) {
+  Expect.isNotNull(o);
+}
+
 abstract class _Matcher {
   void call(Object o);
 }
diff --git a/pkg/expect/lib/expect.dart b/pkg/expect/lib/expect.dart
index 9a59d3d..3b2b2bf 100644
--- a/pkg/expect/lib/expect.dart
+++ b/pkg/expect/lib/expect.dart
@@ -668,20 +668,6 @@
   String toString() => message;
 }
 
-/// Annotation class for testing of dart2js. Use this as metadata on method
-/// declarations to disable inlining of the annotated method.
-class NoInline {
-  const NoInline();
-}
-
-/// Annotation class for testing of dart2js. Use this as metadata on method
-/// declarations to disable closed world assumptions on parameters, effectively
-/// assuming that the runtime arguments could be any value. Note that the
-/// constraints due to [TrustTypeAnnotations] still apply.
-class AssumeDynamic {
-  const AssumeDynamic();
-}
-
 /// Is true iff type assertions are enabled.
 // TODO(rnystrom): Remove this once all tests are no longer using it.
 final bool typeAssertionsEnabled = (() {
diff --git a/pkg/front_end/lib/src/api_prototype/compiler_options.dart b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
index e867b2c..a1c0ef4 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -147,6 +147,10 @@
   /// If not specified, the default target is the VM.
   Target target;
 
+  /// Whether asserts in initializers in const constructors are checked during
+  /// constant evaluation.
+  bool enableAsserts = false;
+
   /// Whether to show verbose messages (mainly for debugging and performance
   /// tracking).
   ///
@@ -223,7 +227,9 @@
     if (flag == null) {
       onError("Unknown experiment: " + experiment);
     } else if (flags.containsKey(flag)) {
-      onError("Experiment mentioned more than once: " + experiment);
+      if (flags[flag] != value) {
+        onError("Experiment specified with conflicting values: " + experiment);
+      }
     } else {
       flags[flag] = value;
     }
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index 768d05c..9ff093c 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
@@ -26,6 +26,10 @@
         initializeFromDillUri);
   }
 
+  /// Initialize the incremental compiler from a component.
+  ///
+  /// Notice that the component has to include the platform, and that no other
+  /// platform will be loaded.
   factory IncrementalKernelGenerator.fromComponent(
       CompilerOptions options, Uri entryPoint, Component component) {
     return new IncrementalCompiler.fromComponent(
@@ -36,7 +40,7 @@
 
   /// Returns a component whose libraries are the recompiled libraries,
   /// or - in the case of [fullComponent] - a full Component.
-  Future<Component> computeDelta({Uri entryPoint, bool fullComponent});
+  Future<Component> computeDelta({List<Uri> entryPoints, bool fullComponent});
 
   /// Remove the file associated with the given file [uri] from the set of
   /// valid files.  This guarantees that those files will be re-read on the
diff --git a/pkg/front_end/lib/src/api_unstable/vm.dart b/pkg/front_end/lib/src/api_unstable/vm.dart
index e7c5bcd..e3ef443 100644
--- a/pkg/front_end/lib/src/api_unstable/vm.dart
+++ b/pkg/front_end/lib/src/api_unstable/vm.dart
@@ -65,4 +65,6 @@
 
 export '../fasta/kernel/utils.dart' show serializeComponent, serializeProcedure;
 
+export '../fasta/resolve_input_uri.dart' show resolveInputUri;
+
 export '../fasta/severity.dart' show Severity;
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index 82804be..e56f20f 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -155,6 +155,10 @@
 
   Ticker ticker;
 
+  Uri get packagesUriRaw => _raw.packagesFileUri;
+
+  bool get enableAsserts => _raw.enableAsserts;
+
   bool get verbose => _raw.verbose;
 
   bool get verify => _raw.verify;
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 3c4f54a..05441e7 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -24,7 +24,7 @@
 
 abstract class ClassBuilder<T extends TypeBuilder, R>
     extends TypeDeclarationBuilder<T, R> {
-  final List<TypeVariableBuilder> typeVariables;
+  List<TypeVariableBuilder> typeVariables;
 
   T supertype;
 
diff --git a/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart b/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
index 0556c747..8ed8b22 100644
--- a/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
@@ -11,6 +11,7 @@
         covariantMask,
         externalMask,
         finalMask,
+        hasConstConstructorMask,
         hasInitializerMask,
         initializingFormalMask,
         namedMixinApplicationMask,
@@ -50,6 +51,8 @@
 
   bool get isInitializingFormal => (modifiers & initializingFormalMask) != 0;
 
+  bool get hasConstConstructor => (modifiers & hasConstConstructorMask) != 0;
+
   bool get isClassMember => false;
 
   String get name;
diff --git a/pkg/front_end/lib/src/fasta/builder_graph.dart b/pkg/front_end/lib/src/fasta/builder_graph.dart
index 7f54bc2..9aa4b18 100644
--- a/pkg/front_end/lib/src/fasta/builder_graph.dart
+++ b/pkg/front_end/lib/src/fasta/builder_graph.dart
@@ -32,9 +32,12 @@
     }
     if (library is SourceLibraryBuilder) {
       for (Import import in library.imports) {
-        Uri uri = import.imported.uri;
-        if (builders.containsKey(uri)) {
-          yield uri;
+        // 'imported' can be null for fake imports, such as dart-ext:.
+        if (import.imported != null) {
+          Uri uri = import.imported.uri;
+          if (builders.containsKey(uri)) {
+            yield uri;
+          }
         }
       }
       for (Export export in library.exports) {
diff --git a/pkg/front_end/lib/src/fasta/constant_context.dart b/pkg/front_end/lib/src/fasta/constant_context.dart
index a4d646a..77e4127 100644
--- a/pkg/front_end/lib/src/fasta/constant_context.dart
+++ b/pkg/front_end/lib/src/fasta/constant_context.dart
@@ -23,4 +23,9 @@
   /// This means that `Object()` and `[]` are equivalent to `const Object()` and
   /// `const []` respectively. `new Object()` is a compile-time error.
   inferred,
+
+  /// In a context where constant expressions are required, but `const` is not
+  /// inferred. This includes default values of optional parameters and
+  /// initializing expressions on fields in classes with a `const` constructor.
+  required,
 }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index fd0a4d2..cb12b88 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -4,7 +4,8 @@
 
 library fasta.dill_class_builder;
 
-import 'package:kernel/ast.dart' show Class, DartType, Member, Supertype;
+import 'package:kernel/ast.dart'
+    show Class, DartType, Member, Supertype, TypeParameter;
 
 import '../problems.dart' show unimplemented;
 
@@ -12,9 +13,11 @@
     show
         KernelClassBuilder,
         KernelTypeBuilder,
+        KernelTypeVariableBuilder,
         LibraryBuilder,
         MemberBuilder,
-        Scope;
+        Scope,
+        TypeVariableBuilder;
 
 import '../modifier.dart' show abstractMask;
 
@@ -41,6 +44,15 @@
             parent,
             cls.fileOffset);
 
+  List<TypeVariableBuilder> get typeVariables {
+    List<TypeVariableBuilder> typeVariables = super.typeVariables;
+    if (typeVariables == null && cls.typeParameters.isNotEmpty) {
+      typeVariables = super.typeVariables =
+          computeTypeVariableBuilders(library, cls.typeParameters);
+    }
+    return typeVariables;
+  }
+
   Uri get fileUri => cls.fileUri;
 
   KernelTypeBuilder get supertype {
@@ -133,3 +145,15 @@
       ? null
       : library.loader.computeTypeBuilder(supertype.asInterfaceType);
 }
+
+List<TypeVariableBuilder> computeTypeVariableBuilders(
+    DillLibraryBuilder library, List<TypeParameter> typeParameters) {
+  if (typeParameters == null || typeParameters.length == 0) return null;
+  List<TypeVariableBuilder> result =
+      new List.filled(typeParameters.length, null);
+  for (int i = 0; i < result.length; i++) {
+    result[i] =
+        new KernelTypeVariableBuilder.fromKernel(typeParameters[i], library);
+  }
+  return result;
+}
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index e57910c..37cff6c 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -2975,6 +2975,34 @@
     const MessageCode("ExpectedUri", message: r"""Expected a URI.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
+            string)> templateExperimentNotEnabled = const Template<
+        Message Function(String string)>(
+    messageTemplate:
+        r"""This requires the --#string experiment to be enabled.""",
+    tipTemplate:
+        r"""Try enabling this experiment by adding it to the command line when compiling and running.""",
+    withArguments: _withArgumentsExperimentNotEnabled);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)> codeExperimentNotEnabled =
+    const Code<Message Function(String string)>(
+        "ExperimentNotEnabled", templateExperimentNotEnabled,
+        index: 93);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsExperimentNotEnabled(String string) {
+  if (string.isEmpty) throw 'No string provided';
+  return new Message(codeExperimentNotEnabled,
+      message: """This requires the --${string} experiment to be enabled.""",
+      tip:
+          """Try enabling this experiment by adding it to the command line when compiling and running.""",
+      arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExportAfterPart = messageExportAfterPart;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3286,6 +3314,9 @@
   --target=dart2js|dart2js_server|dart_runner|flutter|flutter_runner|none|vm
     Specify the target configuration.
 
+  --enable-asserts
+    Check asserts in initializers during constant evaluation.
+
   --verify
     Check that the generated output is free of various problems. This is mostly
     useful for developers of this compiler or Kernel transformations.
@@ -8194,6 +8225,68 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        DartType _type,
+        DartType
+            _type2)> templateSpreadElementTypeMismatch = const Template<
+        Message Function(DartType _type, DartType _type2)>(
+    messageTemplate:
+        r"""Can't assign spread elements of type '#type' to collection elements of type '#type2'.""",
+    withArguments: _withArgumentsSpreadElementTypeMismatch);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, DartType _type2)>
+    codeSpreadElementTypeMismatch =
+    const Code<Message Function(DartType _type, DartType _type2)>(
+        "SpreadElementTypeMismatch", templateSpreadElementTypeMismatch,
+        analyzerCodes: <String>["LIST_ELEMENT_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadElementTypeMismatch(
+    DartType _type, DartType _type2) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeSpreadElementTypeMismatch,
+      message:
+          """Can't assign spread elements of type '${type}' to collection elements of type '${type2}'.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        DartType
+            _type)> templateSpreadTypeMismatch = const Template<
+        Message Function(DartType _type)>(
+    messageTemplate:
+        r"""Unexpected type '#type' of a spread.  Expected 'dynamic' or an Iterable.""",
+    withArguments: _withArgumentsSpreadTypeMismatch);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type)> codeSpreadTypeMismatch =
+    const Code<Message Function(DartType _type)>(
+  "SpreadTypeMismatch",
+  templateSpreadTypeMismatch,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadTypeMismatch(DartType _type) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
+  return new Message(codeSpreadTypeMismatch,
+      message:
+          """Unexpected type '${type}' of a spread.  Expected 'dynamic' or an Iterable.""" +
+              labeler.originMessages,
+      arguments: {'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeStackOverflow = messageStackOverflow;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 4155df3..a8245b2 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -27,7 +27,6 @@
         Procedure,
         ProcedureKind,
         ReturnStatement,
-        Source,
         TreeNode,
         TypeParameter;
 
@@ -91,8 +90,9 @@
   List<LibraryBuilder> platformBuilders;
   Map<Uri, LibraryBuilder> userBuilders;
   final Uri initializeFromDillUri;
-  Component componentToInitializeFrom;
+  final Component componentToInitializeFrom;
   bool initializedFromDill = false;
+  Uri previousPackagesUri;
   bool hasToCheckPackageUris = false;
   Map<Uri, List<DiagnosticMessageFromJson>> remainingComponentProblems =
       new Map<Uri, List<DiagnosticMessageFromJson>>();
@@ -110,14 +110,17 @@
 
   @override
   Future<Component> computeDelta(
-      {Uri entryPoint, bool fullComponent: false}) async {
+      {List<Uri> entryPoints, bool fullComponent: false}) async {
     ticker.reset();
-    entryPoint ??= context.options.inputs.single;
+    entryPoints ??= context.options.inputs;
     return context.runInContext<Component>((CompilerContext c) async {
       IncrementalCompilerData data = new IncrementalCompilerData();
 
       bool bypassCache = false;
-      if (this.invalidatedUris.contains(c.options.packagesUri)) {
+      if (!identical(previousPackagesUri, c.options.packagesUriRaw)) {
+        previousPackagesUri = c.options.packagesUriRaw;
+        bypassCache = true;
+      } else if (this.invalidatedUris.contains(c.options.packagesUri)) {
         bypassCache = true;
       }
       hasToCheckPackageUris = hasToCheckPackageUris || bypassCache;
@@ -126,56 +129,62 @@
       ticker.logMs("Read packages file");
 
       if (dillLoadedData == null) {
-        List<int> summaryBytes = await c.options.loadSdkSummaryBytes();
-        int bytesLength = prepareSummary(summaryBytes, uriTranslator, c, data);
-        if (initializeFromDillUri != null) {
-          try {
-            bytesLength += await initializeFromDill(uriTranslator, c, data);
-          } catch (e, st) {
-            // We might have loaded x out of y libraries into the component.
-            // To avoid any unforeseen problems start over.
-            bytesLength = prepareSummary(summaryBytes, uriTranslator, c, data);
+        int bytesLength = 0;
+        if (componentToInitializeFrom != null) {
+          // If initializing from a component it has to include the sdk,
+          // so we explicitly don't load it here.
+          initializeFromComponent(uriTranslator, c, data);
+        } else {
+          List<int> summaryBytes = await c.options.loadSdkSummaryBytes();
+          bytesLength = prepareSummary(summaryBytes, uriTranslator, c, data);
+          if (initializeFromDillUri != null) {
+            try {
+              bytesLength += await initializeFromDill(uriTranslator, c, data);
+            } catch (e, st) {
+              // We might have loaded x out of y libraries into the component.
+              // To avoid any unforeseen problems start over.
+              bytesLength =
+                  prepareSummary(summaryBytes, uriTranslator, c, data);
 
-            if (e is InvalidKernelVersionError || e is PackageChangedError) {
-              // Don't report any warning.
-            } else {
-              Uri gzInitializedFrom;
-              if (c.options.writeFileOnCrashReport) {
-                gzInitializedFrom = saveAsGzip(
-                    data.initializationBytes, "initialize_from.dill");
-                recordTemporaryFileForTesting(gzInitializedFrom);
-              }
-              if (e is CanonicalNameError) {
-                Message message = gzInitializedFrom != null
-                    ? templateInitializeFromDillNotSelfContained.withArguments(
-                        initializeFromDillUri.toString(), gzInitializedFrom)
-                    : templateInitializeFromDillNotSelfContainedNoDump
-                        .withArguments(initializeFromDillUri.toString());
-                dillLoadedData.loader
-                    .addProblem(message, TreeNode.noOffset, 1, null);
+              if (e is InvalidKernelVersionError || e is PackageChangedError) {
+                // Don't report any warning.
               } else {
-                // Unknown error: Report problem as such.
-                Message message = gzInitializedFrom != null
-                    ? templateInitializeFromDillUnknownProblem.withArguments(
-                        initializeFromDillUri.toString(),
-                        "$e",
-                        "$st",
-                        gzInitializedFrom)
-                    : templateInitializeFromDillUnknownProblemNoDump
-                        .withArguments(
-                            initializeFromDillUri.toString(), "$e", "$st");
-                dillLoadedData.loader
-                    .addProblem(message, TreeNode.noOffset, 1, null);
+                Uri gzInitializedFrom;
+                if (c.options.writeFileOnCrashReport) {
+                  gzInitializedFrom = saveAsGzip(
+                      data.initializationBytes, "initialize_from.dill");
+                  recordTemporaryFileForTesting(gzInitializedFrom);
+                }
+                if (e is CanonicalNameError) {
+                  Message message = gzInitializedFrom != null
+                      ? templateInitializeFromDillNotSelfContained
+                          .withArguments(initializeFromDillUri.toString(),
+                              gzInitializedFrom)
+                      : templateInitializeFromDillNotSelfContainedNoDump
+                          .withArguments(initializeFromDillUri.toString());
+                  dillLoadedData.loader
+                      .addProblem(message, TreeNode.noOffset, 1, null);
+                } else {
+                  // Unknown error: Report problem as such.
+                  Message message = gzInitializedFrom != null
+                      ? templateInitializeFromDillUnknownProblem.withArguments(
+                          initializeFromDillUri.toString(),
+                          "$e",
+                          "$st",
+                          gzInitializedFrom)
+                      : templateInitializeFromDillUnknownProblemNoDump
+                          .withArguments(
+                              initializeFromDillUri.toString(), "$e", "$st");
+                  dillLoadedData.loader
+                      .addProblem(message, TreeNode.noOffset, 1, null);
+                }
               }
             }
           }
-        } else if (componentToInitializeFrom != null) {
-          initializeFromComponent(uriTranslator, c, data);
         }
         appendLibraries(data, bytesLength);
 
         await dillLoadedData.buildOutlines();
-        summaryBytes = null;
         userBuilders = <Uri, LibraryBuilder>{};
         platformBuilders = <LibraryBuilder>[];
         dillLoadedData.loader.builders.forEach((uri, builder) {
@@ -190,19 +199,6 @@
       data.initializationBytes = null;
 
       Set<Uri> invalidatedUris = this.invalidatedUris.toSet();
-      if ((data.includeUserLoadedLibraries &&
-              componentToInitializeFrom ==
-                  null) // when loading state from component no need to invalidate anything
-          ||
-          fullComponent) {
-        invalidatedUris.add(entryPoint);
-      }
-      if (componentToInitializeFrom != null) {
-        // Once compiler was initialized from component, no need to skip logic
-        // above that adds entryPoint to invalidatedUris for successive
-        // [computeDelta] calls.
-        componentToInitializeFrom = null;
-      }
 
       ClassHierarchy hierarchy = userCode?.loader?.hierarchy;
       Set<LibraryBuilder> notReusedLibraries = new Set<LibraryBuilder>();
@@ -253,15 +249,16 @@
 
       for (LibraryBuilder library in reusedLibraries) {
         userCode.loader.builders[library.uri] = library;
-        if (entryPoint == library.uri) {
-          userCode.loader.first = library;
-        }
         if (library.uri.scheme == "dart" && library.uri.path == "core") {
           userCode.loader.coreLibrary = library;
         }
       }
 
-      entryPoint = userCode.setEntryPoints(<Uri>[entryPoint]).single;
+      entryPoints = userCode.setEntryPoints(entryPoints);
+      if (userCode.loader.first == null &&
+          userCode.loader.builders[entryPoints.first] != null) {
+        userCode.loader.first = userCode.loader.builders[entryPoints.first];
+      }
       await userCode.buildOutlines();
 
       // This is not the full component. It is the component including all
@@ -284,13 +281,19 @@
 
       List<Library> outputLibraries;
       Set<Library> allLibraries;
-      if (data.includeUserLoadedLibraries || fullComponent) {
+      if (data.component != null || fullComponent) {
         outputLibraries = computeTransitiveClosure(compiledLibraries,
-            entryPoint, reusedLibraries, hierarchy, uriTranslator);
+            entryPoints, reusedLibraries, hierarchy, uriTranslator);
         allLibraries = outputLibraries.toSet();
+        if (!c.options.omitPlatform) {
+          for (int i = 0; i < platformBuilders.length; i++) {
+            Library lib = platformBuilders[i].target;
+            outputLibraries.add(lib);
+          }
+        }
       } else {
         outputLibraries = new List<Library>();
-        allLibraries = computeTransitiveClosure(compiledLibraries, entryPoint,
+        allLibraries = computeTransitiveClosure(compiledLibraries, entryPoints,
                 reusedLibraries, hierarchy, uriTranslator, outputLibraries)
             .toSet();
       }
@@ -332,7 +335,7 @@
   List<String> reissueComponentProblems(Component componentWithDill) {
     // These problems have already been reported.
     Set<String> issuedProblems = new Set<String>();
-    if (componentWithDill.problemsAsJson != null) {
+    if (componentWithDill?.problemsAsJson != null) {
       issuedProblems.addAll(componentWithDill.problemsAsJson);
     }
 
@@ -348,7 +351,7 @@
     }
 
     // Save any new component-problems.
-    if (componentWithDill.problemsAsJson != null) {
+    if (componentWithDill?.problemsAsJson != null) {
       for (String jsonString in componentWithDill.problemsAsJson) {
         DiagnosticMessageFromJson message =
             new DiagnosticMessageFromJson.fromJson(jsonString);
@@ -379,7 +382,7 @@
   /// any saved component problems for such builders.
   List<Library> computeTransitiveClosure(
       List<Library> inputLibraries,
-      Uri entry,
+      List<Uri> entries,
       List<LibraryBuilder> reusedLibraries,
       ClassHierarchy hierarchy,
       UriTranslator uriTranslator,
@@ -400,7 +403,7 @@
     }
 
     List<Uri> worklist = new List<Uri>();
-    worklist.add(entry);
+    worklist.addAll(entries);
     for (LibraryBuilder library in reusedLibraries) {
       if (library.uri.scheme == "dart" && !library.isSynthetic) {
         continue;
@@ -506,7 +509,6 @@
         initializedFromDill = true;
         bytesLength += initializationBytes.length;
         data.userLoadedUriMain = data.component.mainMethod;
-        data.includeUserLoadedLibraries = true;
         saveComponentProblems(data);
       }
     }
@@ -529,36 +531,32 @@
   // This procedure will set up compiler from [componentToInitializeFrom].
   void initializeFromComponent(UriTranslator uriTranslator, CompilerContext c,
       IncrementalCompilerData data) {
-    ticker.logMs("Read initializeFromComponent");
+    ticker.logMs("About to initializeFromComponent");
 
-    // [libraries] and [uriToSource] from [componentToInitializeFrom] take
-    // precedence over what was already read into [data.component]. Assumption
-    // is that [data.component] is initialized with standard prebuilt various
-    // platform libraries.
-    List<Library> combinedLibs = <Library>[];
-    Set<Uri> readLibs =
-        componentToInitializeFrom.libraries.map((lib) => lib.fileUri).toSet();
-    combinedLibs.addAll(componentToInitializeFrom.libraries);
-    for (Library lib in data.component.libraries) {
-      if (!readLibs.contains(lib.fileUri)) {
-        combinedLibs.add(lib);
-      }
-    }
-    Map<Uri, Source> combinedMaps = new Map<Uri, Source>();
-    combinedMaps.addAll(componentToInitializeFrom.uriToSource);
-    Set<Uri> uris = combinedMaps.keys.toSet();
-    for (MapEntry<Uri, Source> entry in data.component.uriToSource.entries) {
-      if (!uris.contains(entry.key)) {
-        combinedMaps[entry.key] = entry.value;
-      }
-    }
-
-    data.component =
-        new Component(libraries: combinedLibs, uriToSource: combinedMaps)
-          ..mainMethod = componentToInitializeFrom.mainMethod;
-    data.userLoadedUriMain = data.component.mainMethod;
-    data.includeUserLoadedLibraries = true;
+    dillLoadedData = new DillTarget(ticker, uriTranslator, c.options.target);
+    data.component = new Component(
+        libraries: componentToInitializeFrom.libraries,
+        uriToSource: componentToInitializeFrom.uriToSource)
+      ..mainMethod = componentToInitializeFrom.mainMethod;
+    data.userLoadedUriMain = componentToInitializeFrom.mainMethod;
     saveComponentProblems(data);
+
+    bool foundDartCore = false;
+    for (int i = 0; i < data.component.libraries.length; i++) {
+      Library library = data.component.libraries[i];
+      if (library.importUri.scheme == "dart" &&
+          library.importUri.path == "core") {
+        foundDartCore = true;
+        break;
+      }
+    }
+
+    if (!foundDartCore) {
+      throw const InitializeFromComponentError("Did not find dart:core when "
+          "tried to initialize from component.");
+    }
+
+    ticker.logMs("Ran initializeFromComponent");
   }
 
   void appendLibraries(IncrementalCompilerData data, int bytesLength) {
@@ -806,8 +804,15 @@
   const PackageChangedError();
 }
 
+class InitializeFromComponentError {
+  final String message;
+
+  const InitializeFromComponentError(this.message);
+
+  String toString() => message;
+}
+
 class IncrementalCompilerData {
-  bool includeUserLoadedLibraries = false;
   Procedure userLoadedUriMain = null;
   Component component = null;
   List<int> initializationBytes = null;
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index d2dd71e..123e9f2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -65,6 +65,8 @@
 import '../type_inference/type_promotion.dart'
     show TypePromoter, TypePromotionFact, TypePromotionScope;
 
+import 'collections.dart' show SpreadElement, SpreadMapEntry;
+
 import 'constness.dart' show Constness;
 
 import 'expression_generator.dart'
@@ -109,8 +111,6 @@
         getRedirectionTarget,
         isRedirectingFactory;
 
-import 'transform_set_literals.dart' show SetLiteralTransformer;
-
 import 'type_algorithms.dart' show calculateBounds;
 
 import 'kernel_api.dart';
@@ -122,6 +122,10 @@
 // TODO(ahe): Remove this and ensure all nodes have a location.
 const noLocation = null;
 
+// TODO(danrubel): Remove this once control flow and spread collection support
+// has been enabled by default.
+const invalidCollectionElement = const Object();
+
 abstract class BodyBuilder extends ScopeListener<JumpTarget>
     implements ExpressionGeneratorHelper {
   // TODO(ahe): Rename [library] to 'part'.
@@ -204,6 +208,10 @@
 
   int functionNestingLevel = 0;
 
+  // Set when a spread element is encountered in a collection so the collection
+  // needs to be desugared after type inference.
+  bool transformCollections = false;
+
   // Set by type inference when a set literal is encountered that needs to be
   // transformed because the backend target does not support set literals.
   bool transformSetLiterals = false;
@@ -450,14 +458,8 @@
   void inferAnnotations(List<Expression> annotations) {
     if (annotations != null) {
       _typeInferrer?.inferMetadata(this, annotations);
-      if (transformSetLiterals) {
-        library.loader.setLiteralTransformer ??=
-            new SetLiteralTransformer(library.loader);
-        for (int i = 0; i < annotations.length; i++) {
-          annotations[i] =
-              annotations[i].accept(library.loader.setLiteralTransformer);
-        }
-      }
+      library.loader.transformListPostInference(
+          annotations, transformSetLiterals, transformCollections);
     }
   }
 
@@ -567,12 +569,8 @@
           field.initializer = initializer;
           _typeInferrer?.inferFieldInitializer(
               this, field.builtType, initializer);
-
-          if (transformSetLiterals) {
-            library.loader.setLiteralTransformer ??=
-                new SetLiteralTransformer(library.loader);
-            field.target.accept(library.loader.setLiteralTransformer);
-          }
+          library.loader.transformPostInference(
+              field.target, transformSetLiterals, transformCollections);
         }
       }
     }
@@ -755,22 +753,17 @@
           realParameter.initializer = initializer..parent = realParameter;
           _typeInferrer?.inferParameterInitializer(
               this, initializer, realParameter.type);
-          if (transformSetLiterals) {
-            library.loader.setLiteralTransformer ??=
-                new SetLiteralTransformer(library.loader);
-            realParameter.accept(library.loader.setLiteralTransformer);
-          }
+          library.loader.transformPostInference(
+              realParameter, transformSetLiterals, transformCollections);
         }
       }
     }
 
     _typeInferrer?.inferFunctionBody(
         this, _computeReturnTypeContext(member), asyncModifier, body);
-
-    if (transformSetLiterals) {
-      library.loader.setLiteralTransformer ??=
-          new SetLiteralTransformer(library.loader);
-      body?.accept(library.loader.setLiteralTransformer);
+    if (body != null) {
+      library.loader.transformPostInference(
+          body, transformSetLiterals, transformCollections);
     }
 
     // For async, async*, and sync* functions with declared return types, we
@@ -1176,14 +1169,8 @@
       constructor.initializers.add(initializer);
     }
     setParents(constructor.initializers, constructor);
-    if (transformSetLiterals) {
-      library.loader.setLiteralTransformer ??=
-          new SetLiteralTransformer(library.loader);
-      for (int i = 0; i < constructor.initializers.length; i++) {
-        constructor.initializers[i]
-            .accept(library.loader.setLiteralTransformer);
-      }
-    }
+    library.loader.transformListPostInference(
+        constructor.initializers, transformSetLiterals, transformCollections);
     if (constructor.function.body == null) {
       /// >If a generative constructor c is not a redirecting constructor
       /// >and no body is provided, then c implicitly has an empty body {}.
@@ -1688,8 +1675,13 @@
     } else if (context.inDeclaration) {
       if (context == IdentifierContext.topLevelVariableDeclaration ||
           context == IdentifierContext.fieldDeclaration) {
-        constantContext =
-            member.isConst ? ConstantContext.inferred : ConstantContext.none;
+        constantContext = member.isConst
+            ? ConstantContext.inferred
+            : !member.isStatic &&
+                    classBuilder != null &&
+                    classBuilder.hasConstConstructor
+                ? ConstantContext.required
+                : ConstantContext.none;
       }
     } else if (constantContext != ConstantContext.none &&
         !context.allowedInConstantExpression) {
@@ -1730,7 +1722,7 @@
         declaration.isInstanceMember &&
         inFieldInitializer &&
         !inInitializer) {
-      return new IncompleteErrorGenerator(this, token, declaration.target,
+      return new IncompleteErrorGenerator(this, token,
           fasta.templateThisAccessInFieldInitializer.withArguments(name));
     }
     if (declaration == null ||
@@ -1756,8 +1748,8 @@
       if (constantContext != ConstantContext.none &&
           !declaration.isConst &&
           !member.isConstructor) {
-        addProblem(
-            fasta.messageNotAConstantExpression, charOffset, token.length);
+        return new IncompleteErrorGenerator(
+            this, token, fasta.messageNotAConstantExpression);
       }
       // An initializing formal parameter might be final without its
       // VariableDeclaration being final. See
@@ -1898,7 +1890,8 @@
       }
       // Contains more than just \' or \".
       if (last.lexeme.length > 1) {
-        String value = unescapeLastStringPart(last.lexeme, quote, last, this);
+        String value = unescapeLastStringPart(
+            last.lexeme, quote, last, last.isSynthetic, this);
         if (value.isNotEmpty) {
           expressions.add(forest.literalString(value, last));
         }
@@ -2088,7 +2081,7 @@
   @override
   void handleNoFieldInitializer(Token token) {
     debugEvent("NoFieldInitializer");
-    if (constantContext != ConstantContext.none) {
+    if (constantContext == ConstantContext.inferred) {
       // Creating a null value to prevent the Dart VM from crashing.
       push(forest.literalNull(token));
     } else {
@@ -2279,8 +2272,8 @@
   void endForControlFlow(Token token) {
     debugEvent("endForControlFlow");
     // TODO(danrubel) implement control flow support
-    var entry = pop();
 
+    var entry = pop();
     int updateExpressionCount = pop();
     pop(); // left separator
     pop(); // left parenthesis
@@ -2289,13 +2282,21 @@
     popListForEffect(updateExpressionCount); // updates
     popStatement(); // condition
     Object variableOrExpression = pop();
-    buildVariableDeclarations(variableOrExpression); // variables
 
-    push(entry); // push the entry back on the stack and drop the rest
-    handleRecoverableError(
-        fasta.templateUnexpectedToken.withArguments(forToken),
-        forToken,
-        forToken);
+    if (entry != invalidCollectionElement) {
+      // TODO(danrubel): Replace with control flow structures
+      buildVariableDeclarations(variableOrExpression); // variables
+      // TODO(danrubel): Report a more user friendly error message
+      // when an experiment is not enabled
+      handleRecoverableError(
+          fasta.templateUnexpectedToken.withArguments(forToken),
+          forToken,
+          forToken);
+      push(invalidCollectionElement);
+    } else {
+      // TODO(danrubel): Remove once unified collections enabled by default
+      push(invalidCollectionElement);
+    }
   }
 
   @override
@@ -2365,8 +2366,22 @@
   void handleLiteralList(
       int count, Token leftBracket, Token constKeyword, Token rightBracket) {
     debugEvent("LiteralList");
-    List<Expression> expressions = popListForValue(count);
+
+    // TODO(danrubel): Replace this with popListForValue
+    // when control flow and spread collections have been enabled by default
+    List<Expression> expressions =
+        new List<Expression>.filled(count, null, growable: true);
+    for (int i = count - 1; i >= 0; i--) {
+      var elem = pop();
+      if (elem != invalidCollectionElement) {
+        expressions[i] = toValue(elem);
+      } else {
+        expressions.removeAt(i);
+      }
+    }
+
     List<UnresolvedType<KernelTypeBuilder>> typeArguments = pop();
+
     DartType typeArgument;
     if (typeArguments != null) {
       if (typeArguments.length > 1) {
@@ -2385,6 +2400,7 @@
     } else {
       typeArgument = implicitTypeArgument;
     }
+
     Expression node = forest.literalList(
         constKeyword,
         constKeyword != null || constantContext == ConstantContext.inferred,
@@ -2397,30 +2413,33 @@
     push(node);
   }
 
-  @override
-  void handleLiteralSet(
-      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
-    debugEvent("LiteralSet");
-    List<Expression> expressions = popListForValue(count);
-    List<UnresolvedType<KernelTypeBuilder>> typeArguments = pop();
+  void buildLiteralSet(List<UnresolvedType<KernelTypeBuilder>> typeArguments,
+      Token constKeyword, Token leftBrace, List<dynamic> setOrMapEntries) {
     DartType typeArgument;
     if (typeArguments != null) {
-      if (typeArguments.length > 1) {
-        addProblem(
-            fasta.messageSetLiteralTooManyTypeArguments,
-            offsetForToken(leftBrace),
-            lengthOfSpan(leftBrace, leftBrace.endGroup));
-        typeArgument = const InvalidType();
-      } else {
-        typeArgument = buildDartType(typeArguments.single);
-        if (!library.loader.target.legacyMode) {
-          typeArgument =
-              instantiateToBounds(typeArgument, coreTypes.objectClass);
-        }
+      typeArgument = buildDartType(typeArguments.single);
+      if (!library.loader.target.legacyMode) {
+        typeArgument = instantiateToBounds(typeArgument, coreTypes.objectClass);
       }
     } else {
       typeArgument = implicitTypeArgument;
     }
+
+    var expressions = <Expression>[];
+    if (setOrMapEntries != null) {
+      for (var entry in setOrMapEntries) {
+        if (entry is MapEntry) {
+          // TODO(danrubel): report the error on the colon
+          addProblem(fasta.templateExpectedButGot.withArguments(','),
+              entry.value.fileOffset - 1, 1);
+        } else {
+          // TODO(danrubel): Revise once control flow and spread
+          //  collection entries are supported.
+          expressions.add(entry as Expression);
+        }
+      }
+    }
+
     Expression node = forest.literalSet(
         constKeyword,
         constKeyword != null || constantContext == ConstantContext.inferred,
@@ -2428,7 +2447,7 @@
         typeArguments,
         leftBrace,
         expressions,
-        rightBrace);
+        leftBrace.endGroup);
     library.checkBoundsInSetLiteral(node, typeEnvironment);
     if (!library.loader.target.enableSetLiterals) {
       internalProblem(
@@ -2440,10 +2459,51 @@
 
   @override
   void handleLiteralSetOrMap(
-      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
+    int count,
+    Token leftBrace,
+    Token constKeyword,
+    Token rightBrace,
+    // TODO(danrubel): hasSetEntry parameter exists for replicating existing
+    // behavior and will be removed once unified collection has been enabled
+    bool hasSetEntry,
+  ) {
     debugEvent("LiteralSetOrMap");
-    // Treat as map literal - type inference will find the right type.
-    handleLiteralMap(count, leftBrace, constKeyword, rightBrace);
+
+    var setOrMapEntries = new List<dynamic>.filled(count, null, growable: true);
+    for (int i = count - 1; i >= 0; i--) {
+      var elem = pop();
+      // TODO(danrubel): Revise this to handle control flow and spread
+      if (elem == invalidCollectionElement) {
+        setOrMapEntries.removeAt(i);
+      } else if (elem is MapEntry) {
+        setOrMapEntries[i] = elem;
+      } else {
+        setOrMapEntries[i] = toValue(elem);
+      }
+    }
+    List<UnresolvedType<KernelTypeBuilder>> typeArguments = pop();
+
+    // Replicate existing behavior that has been removed from the parser.
+    // This will be removed once unified collections is implemented.
+
+    // Determine if this is a set or map based on type args and content
+    // TODO(danrubel): Since type resolution is needed to disambiguate
+    // set or map in some situations, consider always deferring determination
+    // until the type resolution phase.
+    final typeArgCount = typeArguments?.length;
+    bool isSet = typeArgCount == 1 ? true : typeArgCount != null ? false : null;
+
+    // TODO(danrubel): If the type arguments are not known (null) then
+    // defer set/map determination until after type resolution as per the
+    // unified collection spec: https://github.com/dart-lang/language/pull/200
+    // rather than trying to guess as done below.
+    isSet ??= hasSetEntry;
+
+    if (isSet) {
+      buildLiteralSet(typeArguments, constKeyword, leftBrace, setOrMapEntries);
+    } else {
+      buildLiteralMap(typeArguments, constKeyword, leftBrace, setOrMapEntries);
+    }
   }
 
   @override
@@ -2466,30 +2526,12 @@
     push(forest.literalNull(token));
   }
 
-  @override
-  void handleLiteralMap(
-      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
-    debugEvent("LiteralMap");
-
-    // TODO(danrubel): Revise once spread collection entries are supported.
-    // For now, drop those on the floor
-    // as error(s) have already been reported in handleSpreadExpression.
-    List<MapEntry> entries = <MapEntry>[];
-    const FixedNullableList<dynamic>().pop(stack, count)?.forEach((entry) {
-      if (entry is MapEntry) {
-        entries.add(entry);
-      }
-    });
-
-    List<UnresolvedType<KernelTypeBuilder>> typeArguments = pop();
+  void buildLiteralMap(List<UnresolvedType<KernelTypeBuilder>> typeArguments,
+      Token constKeyword, Token leftBrace, List<dynamic> setOrMapEntries) {
     DartType keyType;
     DartType valueType;
     if (typeArguments != null) {
       if (typeArguments.length != 2) {
-        addProblem(
-            fasta.messageMapLiteralTypeArgumentMismatch,
-            offsetForToken(leftBrace),
-            lengthOfSpan(leftBrace, leftBrace.endGroup));
         keyType = const InvalidType();
         valueType = const InvalidType();
       } else {
@@ -2505,6 +2547,25 @@
       keyType = implicitTypeArgument;
       valueType = implicitTypeArgument;
     }
+
+    List<MapEntry> entries = <MapEntry>[];
+    if (setOrMapEntries != null) {
+      for (var entry in setOrMapEntries) {
+        if (entry is MapEntry) {
+          entries.add(entry);
+        } else if (entry is SpreadElement) {
+          entries.add(new SpreadMapEntry(entry.expression));
+        } else {
+          addProblem(
+            fasta.templateExpectedAfterButGot.withArguments(':'),
+            (entry as Expression).fileOffset,
+            // TODO(danrubel): what is the length of the expression?
+            1,
+          );
+        }
+      }
+    }
+
     Expression node = forest.literalMap(
         constKeyword,
         constKeyword != null || constantContext == ConstantContext.inferred,
@@ -2513,7 +2574,7 @@
         typeArguments,
         leftBrace,
         entries,
-        rightBrace);
+        leftBrace.endGroup);
     library.checkBoundsInMapLiteral(node, typeEnvironment);
     push(node);
   }
@@ -2565,6 +2626,11 @@
   }
 
   @override
+  void handleNonNullAssertExpression(Token bang) {
+    reportNonNullAssertExpressionNotEnabled(bang);
+  }
+
+  @override
   void handleType(Token beginToken, Token questionMark) {
     // TODO(ahe): The scope is wrong for return types of generic functions.
     debugEvent("Type");
@@ -2880,7 +2946,7 @@
   @override
   void beginFormalParameterDefaultValueExpression() {
     super.push(constantContext);
-    constantContext = ConstantContext.none;
+    constantContext = ConstantContext.required;
   }
 
   @override
@@ -3581,7 +3647,8 @@
   }
 
   void beginIfControlFlow(Token ifToken) {
-    // TODO(danrubel): remove this when control flow support is added
+    // TODO(danrubel): consider removing this when control flow support is added
+    // if the ifToken is not needed for error reporting
     push(ifToken);
   }
 
@@ -3589,35 +3656,61 @@
   void endIfControlFlow(Token token) {
     debugEvent("endIfControlFlow");
     // TODO(danrubel) implement control flow support
+
     var entry = pop();
     pop(); // parenthesized expression
     Token ifToken = pop();
-    push(entry); // push the entry back on the stack and drop the rest
-    handleRecoverableError(
-        fasta.templateUnexpectedToken.withArguments(ifToken), ifToken, ifToken);
+    if (entry != invalidCollectionElement) {
+      // TODO(danrubel): Replace this with control flow structure
+      // TODO(danrubel): Report a more user friendly error message
+      // when an experiment is not enabled
+      handleRecoverableError(
+          fasta.templateUnexpectedToken.withArguments(ifToken),
+          ifToken,
+          ifToken);
+      push(invalidCollectionElement);
+    } else {
+      // TODO(danrubel): Remove this when unified collections enabled
+      push(invalidCollectionElement);
+    }
   }
 
   @override
   void endIfElseControlFlow(Token token) {
     debugEvent("endIfElseControlFlow");
     // TODO(danrubel) implement control flow support
-    pop(); // else entry
-    var entry = pop(); // then entry
+
+    var elseEntry = pop(); // else entry
+    var thenEntry = pop(); // then entry
     pop(); // parenthesized expression
     Token ifToken = pop();
-    push(entry); // push the entry back on the stack and drop the rest
-    handleRecoverableError(
-        fasta.templateUnexpectedToken.withArguments(ifToken), ifToken, ifToken);
+    if (thenEntry != invalidCollectionElement &&
+        elseEntry != invalidCollectionElement) {
+      // TODO(danrubel): Replace this with control flow support
+      // TODO(danrubel): Report a more user friendly error message
+      // when an experiment is not enabled
+      handleRecoverableError(
+          fasta.templateUnexpectedToken.withArguments(ifToken),
+          ifToken,
+          ifToken);
+      push(invalidCollectionElement);
+    } else {
+      // TODO(danrubel): Remove when unified collections enabled
+      push(invalidCollectionElement);
+    }
   }
 
   @override
   void handleSpreadExpression(Token spreadToken) {
     debugEvent("SpreadExpression");
-    // TODO(danrubel) implement spread expression support
-    handleRecoverableError(
-        fasta.templateUnexpectedToken.withArguments(spreadToken),
-        spreadToken,
-        spreadToken);
+    if (!library.loader.target.enableSpreadCollections) {
+      return handleRecoverableError(
+          fasta.templateUnexpectedToken.withArguments(spreadToken),
+          spreadToken,
+          spreadToken);
+    }
+    transformCollections = true;
+    push(forest.spreadElement(popForValue(), spreadToken));
   }
 
   @override
@@ -3642,7 +3735,7 @@
           this, token, inInitializer, inFieldInitializer));
     } else {
       push(new IncompleteErrorGenerator(
-          this, token, null, fasta.messageThisAsIdentifier));
+          this, token, fasta.messageThisAsIdentifier));
     }
   }
 
@@ -3657,7 +3750,7 @@
           isSuper: true));
     } else {
       push(new IncompleteErrorGenerator(
-          this, token, null, fasta.messageSuperAsIdentifier));
+          this, token, fasta.messageSuperAsIdentifier));
     }
   }
 
@@ -3910,20 +4003,27 @@
   void endForInControlFlow(Token token) {
     debugEvent("endForInControlFlow");
     // TODO(danrubel) implement control flow support
-    var entry = pop();
 
+    var entry = pop();
     pop(); // `in` keyword
     Token forToken = pop();
     pop(NullValue.AwaitToken); // await token
-
     popForValue(); // expression
     pop(); // lvalue
 
-    push(entry); // push the entry back on the stack and drop the rest
-    handleRecoverableError(
-        fasta.templateUnexpectedToken.withArguments(forToken),
-        forToken,
-        forToken);
+    if (entry != invalidCollectionElement) {
+      // TODO(danrubel): Replace this with control flow element
+      // TODO(danrubel): Report a more user friendly error message
+      // when an experiment is not enabled
+      handleRecoverableError(
+          fasta.templateUnexpectedToken.withArguments(forToken),
+          forToken,
+          forToken);
+      push(invalidCollectionElement);
+    } else {
+      // TODO(danrubel): Remove once unified collections enabled by default
+      push(invalidCollectionElement);
+    }
   }
 
   @override
@@ -4827,7 +4927,7 @@
           addProblem(message.messageObject, message.charOffset, message.length);
           suppressMessage = true;
         }
-      } else if (constantContext != ConstantContext.none) {
+      } else if (constantContext == ConstantContext.inferred) {
         message = fasta.messageTypeVariableInConstantContext.withLocation(
             unresolved.fileUri,
             unresolved.charOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index 89f7efa..2593336 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -195,6 +195,43 @@
         .substituteType(supertype.build(null));
   }
 
+  InterfaceType getKernelLegacyLeastUpperBound(
+      InterfaceType type1, InterfaceType type2) {
+    if (type1 == type2) return type1;
+    ClassHierarchyNode node1 = getNodeFromKernelClass(type1.classNode);
+    ClassHierarchyNode node2 = getNodeFromKernelClass(type2.classNode);
+    Set<ClassHierarchyNode> nodes1 = node1.computeAllSuperNodes(this).toSet();
+    List<ClassHierarchyNode> nodes2 = node2.computeAllSuperNodes(this);
+    List<ClassHierarchyNode> common = <ClassHierarchyNode>[];
+
+    for (int i = 0; i < nodes2.length; i++) {
+      ClassHierarchyNode node = nodes2[i];
+      if (node == null) continue;
+      if (nodes1.contains(node)) {
+        DartType candidate1 = getKernelTypeAsInstanceOf(type1, node.cls.target);
+        DartType candidate2 = getKernelTypeAsInstanceOf(type2, node.cls.target);
+        if (candidate1 == candidate2) {
+          common.add(node);
+        }
+      }
+    }
+
+    if (common.length == 1) return objectKernelClass.rawType;
+    common.sort(ClassHierarchyNode.compareMaxInheritancePath);
+
+    for (int i = 0; i < common.length - 1; i++) {
+      ClassHierarchyNode node = common[i];
+      if (node.maxInheritancePath != common[i + 1].maxInheritancePath) {
+        return getKernelTypeAsInstanceOf(type1, node.cls.target);
+      } else {
+        do {
+          i++;
+        } while (node.maxInheritancePath == common[i + 1].maxInheritancePath);
+      }
+    }
+    return objectKernelClass.rawType;
+  }
+
   static ClassHierarchyBuilder build(
       KernelClassBuilder objectClass,
       List<KernelClassBuilder> classes,
@@ -430,13 +467,17 @@
 
     List<KernelTypeBuilder> interfaces;
 
+    int maxInheritancePath;
+
     if (supernode == null) {
       // This should be Object.
       classMembers = localMembers;
       classSetters = localSetters;
       superclasses = new List<KernelTypeBuilder>(0);
       interfaces = new List<KernelTypeBuilder>(0);
+      maxInheritancePath = 0;
     } else {
+      maxInheritancePath = supernode.maxInheritancePath + 1;
       superclasses =
           new List<KernelTypeBuilder>(supernode.superclasses.length + 1);
       superclasses.setRange(0, superclasses.length - 1,
@@ -479,19 +520,23 @@
           }
         }
         for (int i = 0; i < directInterfaces.length; i++) {
-          addInterface(interfaces, superclasses, directInterfaces[i]);
+          KernelTypeBuilder directInterface = directInterfaces[i];
+          addInterface(interfaces, superclasses, directInterface);
           ClassHierarchyNode interfaceNode =
-              hierarchy.getNodeFromType(directInterfaces[i]);
+              hierarchy.getNodeFromType(directInterface);
           if (interfaceNode != null) {
-            List<KernelTypeBuilder> types = substSupertypes(
-                directInterfaces[i], interfaceNode.superclasses);
+            if (maxInheritancePath < interfaceNode.maxInheritancePath + 1) {
+              maxInheritancePath = interfaceNode.maxInheritancePath + 1;
+            }
+            List<KernelTypeBuilder> types =
+                substSupertypes(directInterface, interfaceNode.superclasses);
             for (int i = 0; i < types.length; i++) {
               addInterface(interfaces, superclasses, types[i]);
             }
 
             if (interfaceNode.interfaces != null) {
-              List<KernelTypeBuilder> types = substSupertypes(
-                  directInterfaces[i], interfaceNode.interfaces);
+              List<KernelTypeBuilder> types =
+                  substSupertypes(directInterface, interfaceNode.interfaces);
               for (int i = 0; i < types.length; i++) {
                 addInterface(interfaces, superclasses, types[i]);
               }
@@ -501,7 +546,7 @@
       } else {
         interfaceMembers = supernode.interfaceMembers;
         interfaceSetters = supernode.interfaceSetters;
-        interfaces = supernode.interfaces;
+        interfaces = substSupertypes(cls.supertype, supernode.interfaces);
       }
       if (interfaceMembers != null) {
         interfaceMembers =
@@ -535,6 +580,7 @@
       interfaceSetters,
       superclasses,
       interfaces,
+      maxInheritancePath,
     );
   }
 
@@ -787,7 +833,6 @@
   }
 
   void inferMixinApplication() {
-    if (!hierarchy.loader.target.backendTarget.legacyMode) return;
     Class kernelClass = cls.target;
     Supertype kernelMixedInType = kernelClass.mixedInType;
     if (kernelMixedInType == null) return;
@@ -843,6 +888,9 @@
   /// any classes from [superclasses].
   final List<KernelTypeBuilder> interfaces;
 
+  /// The longest inheritance path from [cls] to `Object`.
+  final int maxInheritancePath;
+
   int get depth => superclasses.length;
 
   ClassHierarchyNode(
@@ -852,14 +900,41 @@
       this.interfaceMembers,
       this.interfaceSetters,
       this.superclasses,
-      this.interfaces);
+      this.interfaces,
+      this.maxInheritancePath);
+
+  /// Returns a list of all supertypes of [cls], including this node.
+  List<ClassHierarchyNode> computeAllSuperNodes(
+      ClassHierarchyBuilder hierarchy) {
+    List<ClassHierarchyNode> result = new List<ClassHierarchyNode>(
+        1 + superclasses.length + interfaces.length);
+    for (int i = 0; i < superclasses.length; i++) {
+      Declaration declaration = superclasses[i].declaration;
+      if (declaration is KernelClassBuilder) {
+        result[i] = hierarchy.getNodeFromClass(declaration);
+      }
+    }
+    for (int i = 0; i < interfaces.length; i++) {
+      Declaration declaration = interfaces[i].declaration;
+      if (declaration is KernelClassBuilder) {
+        result[i + superclasses.length] =
+            hierarchy.getNodeFromClass(declaration);
+      }
+    }
+    return result..last = this;
+  }
 
   String toString([StringBuffer sb]) {
     sb ??= new StringBuffer();
     sb
       ..write(cls.fullNameForErrors)
-      ..writeln(":")
-      ..writeln("  superclasses:");
+      ..writeln(":");
+    if (maxInheritancePath != this.depth) {
+      sb
+        ..write("  Longest path to Object: ")
+        ..writeln(maxInheritancePath);
+    }
+    sb..writeln("  superclasses:");
     int depth = 0;
     for (KernelTypeBuilder superclass in superclasses) {
       sb.write("  " * (depth + 2));
@@ -904,6 +979,11 @@
         ..writeln();
     }
   }
+
+  static int compareMaxInheritancePath(
+      ClassHierarchyNode a, ClassHierarchyNode b) {
+    return b.maxInheritancePath.compareTo(a.maxInheritancePath);
+  }
 }
 
 class MergeResult {
@@ -1040,7 +1120,6 @@
   @override
   InterfaceType getLegacyLeastUpperBound(
       InterfaceType type1, InterfaceType type2) {
-    // TODO(ahe): Compute the actual LUB.
-    return type1;
+    return hierarchy.getKernelLegacyLeastUpperBound(type1, type2);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/collections.dart b/pkg/front_end/lib/src/fasta/kernel/collections.dart
new file mode 100644
index 0000000..b830d4b
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/collections.dart
@@ -0,0 +1,333 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+library fasta.collections;
+
+import 'dart:core' hide MapEntry;
+
+import 'package:kernel/ast.dart'
+    show
+        DartType,
+        Expression,
+        MapEntry,
+        setParents,
+        transformList,
+        TreeNode,
+        VariableDeclaration,
+        visitList;
+
+import 'package:kernel/type_environment.dart' show TypeEnvironment;
+
+import 'package:kernel/visitor.dart'
+    show
+        ExpressionVisitor,
+        ExpressionVisitor1,
+        Transformer,
+        TreeVisitor,
+        Visitor;
+
+import '../problems.dart' show getFileUri, unsupported;
+
+/// Spread and control-flow elements are not truly expressions and they cannot
+/// appear in arbitrary expression contexts in the Kernel program.  They can
+/// only appear as elements in list or set literals.
+mixin _FakeExpressionMixin on Expression {
+  /// Spread and contol-flow elements are not expressions and do not have a
+  /// static type.
+  @override
+  DartType getStaticType(TypeEnvironment types) {
+    return unsupported("getStaticType", fileOffset, getFileUri(this));
+  }
+
+  @override
+  accept(ExpressionVisitor<Object> v) => v.defaultExpression(this);
+
+  @override
+  accept1(ExpressionVisitor1<Object, Object> v, arg) =>
+      v.defaultExpression(this, arg);
+}
+
+/// A spread element in a list or set literal.
+class SpreadElement extends Expression with _FakeExpressionMixin {
+  Expression expression;
+  bool isNullAware;
+
+  SpreadElement(this.expression, this.isNullAware) {
+    expression?.parent = this;
+  }
+
+  @override
+  visitChildren(Visitor<Object> v) {
+    expression?.accept(v);
+  }
+
+  @override
+  transformChildren(Transformer v) {
+    if (expression != null) {
+      expression = expression.accept(v);
+      expression?.parent = this;
+    }
+  }
+}
+
+/// An 'if' element in a list or set literal.
+class IfElement extends Expression with _FakeExpressionMixin {
+  Expression condition;
+  Expression then;
+  Expression otherwise;
+
+  IfElement(this.condition, this.then, this.otherwise) {
+    condition?.parent = this;
+    then?.parent = this;
+    otherwise?.parent = this;
+  }
+
+  @override
+  visitChildren(Visitor<Object> v) {
+    condition?.accept(v);
+    then?.accept(v);
+    otherwise?.accept(v);
+  }
+
+  @override
+  transformChildren(Transformer v) {
+    if (condition != null) {
+      condition = condition.accept(v);
+      condition?.parent = this;
+    }
+    if (then != null) {
+      then = then.accept(v);
+      then?.parent = this;
+    }
+    if (otherwise != null) {
+      otherwise = otherwise.accept(v);
+      otherwise?.parent = this;
+    }
+  }
+}
+
+/// A 'for' element in a list or set literal.
+class ForElement extends Expression with _FakeExpressionMixin {
+  final List<VariableDeclaration> variables; // May be empty, but not null.
+  Expression condition; // May be null.
+  final List<Expression> updates; // May be empty, but not null.
+  Expression body;
+
+  ForElement(this.variables, this.condition, this.updates, this.body) {
+    setParents(variables, this);
+    condition?.parent = this;
+    setParents(updates, this);
+    body?.parent = this;
+  }
+
+  @override
+  visitChildren(Visitor<Object> v) {
+    visitList(variables, v);
+    condition?.accept(v);
+    visitList(updates, v);
+    body?.accept(v);
+  }
+
+  @override
+  transformChildren(Transformer v) {
+    transformList(variables, v, this);
+    if (condition != null) {
+      condition = condition.accept(v);
+      condition?.parent = this;
+    }
+    transformList(updates, v, this);
+    if (body != null) {
+      body = body.accept(v);
+      body?.parent = this;
+    }
+  }
+}
+
+/// A 'for-in' element in a list or set literal.
+class ForInElement extends Expression with _FakeExpressionMixin {
+  VariableDeclaration variable; // Has no initializer.
+  Expression iterable;
+  Expression body;
+  bool isAsync; // True if this is an 'await for' loop.
+
+  ForInElement(this.variable, this.iterable, this.body, {this.isAsync: false}) {
+    variable?.parent = this;
+    iterable?.parent = this;
+    body?.parent = this;
+  }
+
+  visitChildren(Visitor<Object> v) {
+    variable?.accept(v);
+    iterable?.accept(v);
+    body?.accept(v);
+  }
+
+  transformChildren(Transformer v) {
+    if (variable != null) {
+      variable = variable.accept(v);
+      variable?.parent = this;
+    }
+    if (iterable != null) {
+      iterable = iterable.accept(v);
+      iterable?.parent = this;
+    }
+    if (body != null) {
+      body = body.accept(v);
+      body?.parent = this;
+    }
+  }
+}
+
+mixin _FakeMapEntryMixin implements MapEntry {
+  @override
+  Expression get key => throw UnsupportedError('SpreadMapEntry.key getter');
+
+  @override
+  void set key(Expression expr) {
+    throw UnsupportedError('SpreadMapEntry.key setter');
+  }
+
+  @override
+  Expression get value => throw UnsupportedError('SpreadMapEntry.value getter');
+
+  @override
+  void set value(Expression expr) {
+    throw UnsupportedError('SpreadMapEntry.value setter');
+  }
+
+  @override
+  accept(TreeVisitor<Object> v) {
+    throw UnsupportedError('SpreadMapEntry.accept');
+  }
+}
+
+/// A spread element in a map literal.
+class SpreadMapEntry extends TreeNode with _FakeMapEntryMixin {
+  Expression expression;
+
+  SpreadMapEntry(this.expression) {
+    expression?.parent = this;
+  }
+
+  @override
+  visitChildren(Visitor<Object> v) {
+    expression?.accept(v);
+  }
+
+  @override
+  transformChildren(Transformer v) {
+    if (expression != null) {
+      expression = expression.accept(v);
+      expression?.parent = this;
+    }
+  }
+}
+
+/// An 'if' element in a map literal.
+class IfMapEntry extends TreeNode with _FakeMapEntryMixin {
+  Expression condition;
+  MapEntry then;
+  MapEntry otherwise;
+
+  IfMapEntry(this.condition, this.then, this.otherwise) {
+    condition?.parent = this;
+    then?.parent = this;
+    otherwise?.parent = this;
+  }
+
+  @override
+  visitChildren(Visitor<Object> v) {
+    condition?.accept(v);
+    then?.accept(v);
+    otherwise?.accept(v);
+  }
+
+  @override
+  transformChildren(Transformer v) {
+    if (condition != null) {
+      condition = condition.accept(v);
+      condition?.parent = this;
+    }
+    if (then != null) {
+      then = then.accept(v);
+      then?.parent = this;
+    }
+    if (otherwise != null) {
+      otherwise = otherwise.accept(v);
+      otherwise?.parent = this;
+    }
+  }
+}
+
+/// A 'for' element in a map literal.
+class ForMapEntry extends TreeNode with _FakeMapEntryMixin {
+  final List<VariableDeclaration> variables; // May be empty, but not null.
+  Expression condition; // May be null.
+  final List<Expression> updates; // May be empty, but not null.
+  MapEntry body;
+
+  ForMapEntry(this.variables, this.condition, this.updates, this.body) {
+    setParents(variables, this);
+    condition?.parent = this;
+    setParents(updates, this);
+    body?.parent = this;
+  }
+
+  @override
+  visitChildren(Visitor<Object> v) {
+    visitList(variables, v);
+    condition?.accept(v);
+    visitList(updates, v);
+    body?.accept(v);
+  }
+
+  @override
+  transformChildren(Transformer v) {
+    transformList(variables, v, this);
+    if (condition != null) {
+      condition = condition.accept(v);
+      condition?.parent = this;
+    }
+    transformList(updates, v, this);
+    if (body != null) {
+      body = body.accept(v);
+      body?.parent = this;
+    }
+  }
+}
+
+/// A 'for-in' element in a map literal.
+class ForInMapEntry extends TreeNode with _FakeMapEntryMixin {
+  VariableDeclaration variable; // Has no initializer.
+  Expression iterable;
+  MapEntry body;
+  bool isAsync; // True if this is an 'await for' loop.
+
+  ForInMapEntry(this.variable, this.iterable, this.body,
+      {this.isAsync: false}) {
+    variable?.parent = this;
+    iterable?.parent = this;
+    body?.parent = this;
+  }
+
+  visitChildren(Visitor<Object> v) {
+    variable?.accept(v);
+    iterable?.accept(v);
+    body?.accept(v);
+  }
+
+  transformChildren(Transformer v) {
+    if (variable != null) {
+      variable = variable.accept(v);
+      variable?.parent = this;
+    }
+    if (iterable != null) {
+      iterable = iterable.accept(v);
+      iterable?.parent = this;
+    }
+    if (body != null) {
+      body = body.accept(v);
+      body?.parent = this;
+    }
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 412bc68..eee9401 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -53,6 +53,8 @@
 
 import 'body_builder.dart' show LabelTarget;
 
+import 'collections.dart' show SpreadElement;
+
 import 'kernel_expression_generator.dart'
     show
         KernelDeferredAccessGenerator,
@@ -275,6 +277,12 @@
   }
 
   @override
+  Expression spreadElement(Expression expression, Token token) {
+    return new SpreadElement(expression, token.lexeme == '...?')
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
   AssertInitializer assertInitializer(
       Token assertKeyword,
       Token leftParenthesis,
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 2ec0e2c..e024458 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -188,6 +188,8 @@
 
   Expression asExpression(Expression expression, DartType type, Token location);
 
+  Expression spreadElement(Expression expression, Token token);
+
   /// Return a representation of an assert that appears in a constructor's
   /// initializer list.
   Object assertInitializer(Token assertKeyword, Token leftParenthesis,
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_type.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
similarity index 89%
rename from pkg/front_end/lib/src/fasta/kernel/implicit_type.dart
rename to pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
index 218438d..902db15 100644
--- a/pkg/front_end/lib/src/fasta/kernel/implicit_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
@@ -13,11 +13,11 @@
 
 import 'kernel_builder.dart' show MemberBuilder;
 
-class ImplicitType extends DartType {
+class ImplicitFieldType extends DartType {
   final MemberBuilder member;
   final Token initializerToken;
 
-  const ImplicitType(this.member, this.initializerToken);
+  const ImplicitFieldType(this.member, this.initializerToken);
 
   accept(DartTypeVisitor<Object> v) {
     unsupported("accept", member.charOffset, member.fileUri);
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 470da0c..d108638 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -11,13 +11,13 @@
 
   @override
   void defaultExpression(Expression node, DartType typeContext) {
-    unhandled("${node.runtimeType}", "InferenceVistor", node.fileOffset,
+    unhandled("${node.runtimeType}", "InferenceVisitor", node.fileOffset,
         inferrer.helper.uri);
   }
 
   @override
   void defaultStatement(Statement node, _) {
-    unhandled("${node.runtimeType}", "InferenceVistor", node.fileOffset,
+    unhandled("${node.runtimeType}", "InferenceVisitor", node.fileOffset,
         inferrer.helper.uri);
   }
 
@@ -638,6 +638,17 @@
     inferrer.inferStatement(node.body);
   }
 
+  DartType getSpreadElementType(DartType spreadType) {
+    if (spreadType is InterfaceType) {
+      InterfaceType supertype = inferrer.typeSchemaEnvironment
+          .getTypeAsInstanceOf(spreadType, inferrer.coreTypes.iterableClass);
+      if (supertype == null) return null;
+      return supertype.typeArguments[0];
+    }
+    if (spreadType is DynamicType) return const DynamicType();
+    return null;
+  }
+
   void visitListLiteralJudgment(
       ListLiteralJudgment node, DartType typeContext) {
     var listClass = inferrer.coreTypes.listClass;
@@ -661,16 +672,36 @@
     } else {
       inferredTypeArgument = node.typeArgument;
     }
+    List<DartType> spreadTypes =
+        typeChecksNeeded ? new List<DartType>(node.expressions.length) : null;
     if (inferenceNeeded || typeChecksNeeded) {
       for (int i = 0; i < node.expressions.length; ++i) {
         Expression judgment = node.expressions[i];
-        inferrer.inferExpression(
-            judgment, inferredTypeArgument, inferenceNeeded || typeChecksNeeded,
-            isVoidAllowed: true);
-        if (inferenceNeeded) {
-          formalTypes.add(listType.typeArguments[0]);
+        if (judgment is SpreadElement) {
+          DartType spreadType = inferrer.inferExpression(
+              judgment.expression,
+              new InterfaceType(inferrer.coreTypes.iterableClass,
+                  <DartType>[inferredTypeArgument]),
+              inferenceNeeded || typeChecksNeeded,
+              isVoidAllowed: true);
+          if (inferenceNeeded) {
+            formalTypes.add(listType.typeArguments[0]);
+          }
+          if (typeChecksNeeded) {
+            spreadTypes[i] = spreadType;
+          }
+          // Use 'dynamic' for error recovery.
+          actualTypes
+              .add(getSpreadElementType(spreadType) ?? const DynamicType());
+        } else {
+          inferrer.inferExpression(judgment, inferredTypeArgument,
+              inferenceNeeded || typeChecksNeeded,
+              isVoidAllowed: true);
+          if (inferenceNeeded) {
+            formalTypes.add(listType.typeArguments[0]);
+          }
+          actualTypes.add(getInferredType(judgment, inferrer));
         }
-        actualTypes.add(getInferredType(judgment, inferrer));
       }
     }
     if (inferenceNeeded) {
@@ -691,9 +722,44 @@
     }
     if (typeChecksNeeded) {
       for (int i = 0; i < node.expressions.length; i++) {
-        inferrer.ensureAssignable(node.typeArgument, actualTypes[i],
-            node.expressions[i], node.expressions[i].fileOffset,
-            isVoidAllowed: node.typeArgument is VoidType);
+        Expression item = node.expressions[i];
+        if (item is SpreadElement) {
+          DartType spreadType = spreadTypes[i];
+          DartType spreadElementType = getSpreadElementType(spreadType);
+          if (spreadElementType == null) {
+            node.replaceChild(
+                node.expressions[i],
+                inferrer.helper.desugarSyntheticExpression(inferrer.helper
+                    .buildProblem(
+                        templateSpreadTypeMismatch.withArguments(spreadType),
+                        item.expression.fileOffset,
+                        1)));
+          } else if (spreadType is DynamicType) {
+            inferrer.ensureAssignable(inferrer.coreTypes.iterableClass.rawType,
+                spreadType, item.expression, item.expression.fileOffset);
+          } else if (spreadType is InterfaceType) {
+            if (spreadType.classNode == inferrer.coreTypes.nullClass) {
+              // TODO(dmitryas):  Handle this case when null-aware spreads are
+              // supported by the parser.
+            } else {
+              if (!inferrer.isAssignable(
+                  node.typeArgument, spreadElementType)) {
+                node.replaceChild(
+                    node.expressions[i],
+                    inferrer.helper.desugarSyntheticExpression(inferrer.helper
+                        .buildProblem(
+                            templateSpreadElementTypeMismatch.withArguments(
+                                spreadElementType, node.typeArgument),
+                            item.expression.fileOffset,
+                            1)));
+              }
+            }
+          }
+        } else {
+          inferrer.ensureAssignable(
+              node.typeArgument, actualTypes[i], item, item.fileOffset,
+              isVoidAllowed: node.typeArgument is VoidType);
+        }
       }
     }
     node.inferredType = new InterfaceType(listClass, [inferredTypeArgument]);
@@ -703,6 +769,7 @@
           node, inferrer.typeSchemaEnvironment,
           inferred: true);
     }
+
     return null;
   }
 
@@ -774,11 +841,19 @@
     List<Expression> cachedKeys = new List(node.entries.length);
     List<Expression> cachedValues = new List(node.entries.length);
     for (int i = 0; i < node.entries.length; i++) {
-      cachedKeys[i] = node.entries[i].key;
-      cachedValues[i] = node.entries[i].value;
+      MapEntry entry = node.entries[i];
+      if (entry is! SpreadMapEntry) {
+        cachedKeys[i] = node.entries[i].key;
+        cachedValues[i] = node.entries[i].value;
+      }
     }
     if (inferenceNeeded || typeChecksNeeded) {
       for (MapEntry entry in node.entries) {
+        if (entry is SpreadMapEntry) {
+          actualTypes.add(const BottomType());
+          actualTypes.add(inferrer.coreTypes.nullClass.rawType);
+          continue;
+        }
         Expression key = entry.key;
         inferrer.inferExpression(key, inferredKeyType, true,
             isVoidAllowed: true);
@@ -814,6 +889,13 @@
     if (typeChecksNeeded) {
       for (int i = 0; i < node.entries.length; ++i) {
         Expression keyJudgment = cachedKeys[i];
+        if (keyJudgment == null) {
+          node.entries[i] = new MapEntry(
+              new InvalidExpression('unimplemented spread entry')
+                ..fileOffset = node.fileOffset,
+              new NullLiteral()..parent = node);
+          continue;
+        }
         inferrer.ensureAssignable(node.keyType, actualTypes[2 * i], keyJudgment,
             keyJudgment.fileOffset,
             isVoidAllowed: node.keyType is VoidType);
@@ -1072,16 +1154,36 @@
     } else {
       inferredTypeArgument = node.typeArgument;
     }
+    List<DartType> spreadTypes =
+        typeChecksNeeded ? new List<DartType>(node.expressions.length) : null;
     if (inferenceNeeded || typeChecksNeeded) {
       for (int i = 0; i < node.expressions.length; ++i) {
         Expression judgment = node.expressions[i];
-        inferrer.inferExpression(
-            judgment, inferredTypeArgument, inferenceNeeded || typeChecksNeeded,
-            isVoidAllowed: true);
-        if (inferenceNeeded) {
-          formalTypes.add(setType.typeArguments[0]);
+        if (judgment is SpreadElement) {
+          DartType spreadType = inferrer.inferExpression(
+              judgment.expression,
+              new InterfaceType(inferrer.coreTypes.iterableClass,
+                  <DartType>[inferredTypeArgument]),
+              inferenceNeeded || typeChecksNeeded,
+              isVoidAllowed: true);
+          if (inferenceNeeded) {
+            formalTypes.add(setType.typeArguments[0]);
+          }
+          if (typeChecksNeeded) {
+            spreadTypes[i] = spreadType;
+          }
+          // Use 'dynamic' for error recovery.
+          actualTypes
+              .add(getSpreadElementType(spreadType) ?? const DynamicType());
+        } else {
+          inferrer.inferExpression(judgment, inferredTypeArgument,
+              inferenceNeeded || typeChecksNeeded,
+              isVoidAllowed: true);
+          if (inferenceNeeded) {
+            formalTypes.add(setType.typeArguments[0]);
+          }
+          actualTypes.add(getInferredType(judgment, inferrer));
         }
-        actualTypes.add(getInferredType(judgment, inferrer));
       }
     }
     if (inferenceNeeded) {
@@ -1102,9 +1204,44 @@
     }
     if (typeChecksNeeded) {
       for (int i = 0; i < node.expressions.length; i++) {
-        inferrer.ensureAssignable(node.typeArgument, actualTypes[i],
-            node.expressions[i], node.expressions[i].fileOffset,
-            isVoidAllowed: node.typeArgument is VoidType);
+        Expression item = node.expressions[i];
+        if (item is SpreadElement) {
+          DartType spreadType = spreadTypes[i];
+          DartType spreadElementType = getSpreadElementType(spreadType);
+          if (spreadElementType == null) {
+            node.replaceChild(
+                node.expressions[i],
+                inferrer.helper.desugarSyntheticExpression(inferrer.helper
+                    .buildProblem(
+                        templateSpreadTypeMismatch.withArguments(spreadType),
+                        item.expression.fileOffset,
+                        1)));
+          } else if (spreadType is DynamicType) {
+            inferrer.ensureAssignable(inferrer.coreTypes.iterableClass.rawType,
+                spreadType, item.expression, item.expression.fileOffset);
+          } else if (spreadType is InterfaceType) {
+            if (spreadType.classNode == inferrer.coreTypes.nullClass) {
+              // TODO(dmitryas):  Handle this case when null-aware spreads are
+              // supported by the parser.
+            } else {
+              if (!inferrer.isAssignable(
+                  node.typeArgument, spreadElementType)) {
+                node.replaceChild(
+                    node.expressions[i],
+                    inferrer.helper.desugarSyntheticExpression(inferrer.helper
+                        .buildProblem(
+                            templateSpreadElementTypeMismatch.withArguments(
+                                spreadElementType, node.typeArgument),
+                            item.expression.fileOffset,
+                            1)));
+              }
+            }
+          }
+        } else {
+          inferrer.ensureAssignable(node.typeArgument, actualTypes[i],
+              node.expressions[i], node.expressions[i].fileOffset,
+              isVoidAllowed: node.typeArgument is VoidType);
+        }
       }
     }
     node.inferredType = new InterfaceType(setClass, [inferredTypeArgument]);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
index eb8a506..afd74e5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
@@ -18,7 +18,7 @@
 
 export 'class_hierarchy_builder.dart' show ClassHierarchyBuilder;
 
-export 'implicit_type.dart' show ImplicitType;
+export 'implicit_field_type.dart' show ImplicitFieldType;
 
 export 'kernel_class_builder.dart' show KernelClassBuilder;
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
index 08e5bce..be2ec5c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
@@ -225,11 +225,10 @@
 
 class IncompleteErrorGenerator extends IncompleteSendGenerator
     with ErroneousExpressionGenerator {
-  final Member member;
   final Message message;
 
   IncompleteErrorGenerator(
-      ExpressionGeneratorHelper helper, Token token, this.member, this.message)
+      ExpressionGeneratorHelper helper, Token token, this.message)
       : super(helper, token, null);
 
   String get plainNameForRead => token.lexeme;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
index adf0f98..38d5e24 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
@@ -19,7 +19,7 @@
 import 'kernel_builder.dart'
     show
         Declaration,
-        ImplicitType,
+        ImplicitFieldType,
         FieldBuilder,
         KernelLibraryBuilder,
         KernelTypeBuilder,
@@ -83,12 +83,12 @@
         .createTopLevelTypeInferrer(
             field.enclosingClass?.thisType, field, null);
     if (hasInitializer) {
-      if (field.type is! ImplicitType) {
+      if (field.type is! ImplicitFieldType) {
         unsupported(
             "$name has unexpected type ${field.type}", charOffset, fileUri);
         return;
       }
-      ImplicitType type = field.type;
+      ImplicitFieldType type = field.type;
       field.type = const DynamicType();
       initializer = new KernelBodyBuilder.forField(this, typeInferrer)
           .parseFieldInitializer(type.initializerToken);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 4277b49..a7fbd0a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -97,6 +97,7 @@
 import '../modifier.dart'
     show
         abstractMask,
+        hasConstConstructorMask,
         hasInitializerMask,
         initializingFormalMask,
         mixinDeclarationMask,
@@ -124,7 +125,7 @@
         DynamicTypeBuilder,
         EnumConstantInfo,
         FormalParameterBuilder,
-        ImplicitType,
+        ImplicitFieldType,
         InvalidTypeBuilder,
         KernelClassBuilder,
         KernelConstructorBuilder,
@@ -294,6 +295,9 @@
       isMixinDeclaration = true;
       modifiers = (modifiers & ~mixinDeclarationMask) | abstractMask;
     }
+    if (declaration.hasConstConstructor) {
+      modifiers |= hasConstConstructorMask;
+    }
     ClassBuilder cls = new SourceClassBuilder(
         metadata,
         modifiers,
@@ -634,7 +638,8 @@
     addBuilder(name, field, charOffset);
     if (initializerTokenForInference != null) {
       assert(type == null);
-      field.target.type = new ImplicitType(field, initializerTokenForInference);
+      field.target.type =
+          new ImplicitFieldType(field, initializerTokenForInference);
     }
     loader.target.metadataCollector
         ?.setDocumentationComment(field.target, documentationComment);
@@ -681,6 +686,7 @@
     if (nativeMethodName != null) {
       addNativeMethod(procedure);
     }
+    if (procedure.isConst) currentDeclaration?.hasConstConstructor = true;
   }
 
   void addProcedure(
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index 7f2d72a..b85bee7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -42,6 +42,8 @@
         templateForInLoopElementTypeNotAssignable,
         templateForInLoopTypeNotIterable,
         templateIntegerLiteralIsOutOfRange,
+        templateSpreadElementTypeMismatch,
+        templateSpreadTypeMismatch,
         templateSwitchExpressionNotAssignable,
         templateWebLiteralCannotBeRepresentedExactly;
 
@@ -71,6 +73,8 @@
 
 import 'body_builder.dart' show combineStatements;
 
+import 'collections.dart' show SpreadElement, SpreadMapEntry;
+
 import 'implicit_type_argument.dart' show ImplicitTypeArgument;
 
 import 'kernel_builder.dart' show KernelLibraryBuilder;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 104f403..a766167 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -134,6 +134,11 @@
 
   final bool excludeSource = !CompilerContext.current.options.embedSourceText;
 
+  final Map<String, String> environmentDefines =
+      CompilerContext.current.options.environmentDefines;
+
+  final bool enableAsserts = CompilerContext.current.options.enableAsserts;
+
   final List<Object> clonedFormals = <Object>[];
 
   KernelTarget(this.fileSystem, this.includeComments, DillTarget dillTarget,
@@ -330,11 +335,8 @@
 
     this.uriToSource.forEach(copySource);
 
-    Component component = CompilerContext.current.options.target
-        .configureComponent(new Component(
-            nameRoot: nameRoot,
-            libraries: libraries,
-            uriToSource: uriToSource));
+    Component component = backendTarget.configureComponent(new Component(
+        nameRoot: nameRoot, libraries: libraries, uriToSource: uriToSource));
     if (loader.first != null) {
       // TODO(sigmund): do only for full program
       Declaration declaration =
@@ -558,7 +560,6 @@
       "dart:_internal",
       "dart:async",
       "dart:core",
-      "dart:ffi",
       "dart:mirrors"
     ]) {
       Uri uri = Uri.parse(platformLibrary);
@@ -574,16 +575,16 @@
             break;
           }
         }
-        if (!found && uri.path != "mirrors" && uri.path != "ffi") {
-          // dart:mirrors and dart:ffi are optional.
+        if (!found && uri.path != "mirrors") {
+          // dart:mirrors is optional.
           throw "Can't find $uri";
         }
       } else {
         libraries.add(library.target);
       }
     }
-    Component plaformLibraries = CompilerContext.current.options.target
-        .configureComponent(new Component());
+    Component plaformLibraries =
+        backendTarget.configureComponent(new Component());
     // Add libraries directly to prevent that their parents are changed.
     plaformLibraries.libraries.addAll(libraries);
     loader.computeCoreTypes(plaformLibraries);
@@ -751,15 +752,15 @@
   /// libraries for the first time.
   void runBuildTransformations() {
     if (loader.target.enableConstantUpdate2018) {
-      TypeEnvironment environment = new TypeEnvironment(
-          loader.coreTypes, loader.hierarchy,
-          legacyMode: false);
+      TypeEnvironment environment =
+          new TypeEnvironment(loader.coreTypes, loader.hierarchy);
       constants.transformLibraries(
           loader.libraries,
-          loader.target.backendTarget.constantsBackend(loader.coreTypes),
-          CompilerContext.current.options.environmentDefines,
+          backendTarget.constantsBackend(loader.coreTypes),
+          environmentDefines,
           environment,
-          new KernelConstantErrorReporter(loader, environment));
+          new KernelConstantErrorReporter(loader, environment),
+          enableAsserts: enableAsserts);
       ticker.logMs("Evaluated constants");
     }
     backendTarget.performModularTransformationsOnLibraries(
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
index c427799..9137222 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
@@ -106,6 +106,14 @@
         name, parent, charOffset, bound.clone(newTypes));
   }
 
+  @override
+  bool operator ==(Object other) {
+    return other is KernelTypeVariableBuilder && target == other.target;
+  }
+
+  @override
+  int get hashCode => target.hashCode;
+
   static List<TypeParameter> kernelTypeParametersFromBuilders(
       List<TypeVariableBuilder> builders) {
     if (builders == null) return null;
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
new file mode 100644
index 0000000..27244cd
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
@@ -0,0 +1,177 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.transform_collections;
+
+import 'package:kernel/ast.dart'
+    show
+        Arguments,
+        Block,
+        BlockExpression,
+        DartType,
+        DynamicType,
+        Expression,
+        ExpressionStatement,
+        ForInStatement,
+        IfStatement,
+        InterfaceType,
+        InvalidExpression,
+        ListLiteral,
+        MethodInvocation,
+        Name,
+        Not,
+        NullLiteral,
+        Procedure,
+        SetLiteral,
+        Statement,
+        StaticInvocation,
+        TreeNode,
+        VariableDeclaration,
+        VariableGet;
+
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+import 'package:kernel/visitor.dart' show Transformer;
+
+import 'collections.dart' show SpreadElement;
+
+import '../source/source_loader.dart' show SourceLoader;
+
+import 'redirecting_factory_body.dart' show RedirectingFactoryBody;
+
+class CollectionTransformer extends Transformer {
+  final CoreTypes coreTypes;
+  final Procedure listAdd;
+  final Procedure setFactory;
+  final Procedure setAdd;
+  final Procedure objectEquals;
+
+  static Procedure _findSetFactory(CoreTypes coreTypes) {
+    Procedure factory = coreTypes.index.getMember('dart:core', 'Set', '');
+    RedirectingFactoryBody body = factory?.function?.body;
+    return body?.target;
+  }
+
+  CollectionTransformer(SourceLoader loader)
+      : coreTypes = loader.coreTypes,
+        listAdd = loader.coreTypes.index.getMember('dart:core', 'List', 'add'),
+        setFactory = _findSetFactory(loader.coreTypes),
+        setAdd = loader.coreTypes.index.getMember('dart:core', 'Set', 'add'),
+        objectEquals =
+            loader.coreTypes.index.getMember('dart:core', 'Object', '==');
+
+  TreeNode _translateListOrSet(
+      Expression node, DartType elementType, List<Expression> elements,
+      {bool isSet: false, bool isConst: false}) {
+    // Translate elements in place up to the first spread if any.
+    int i = 0;
+    for (; i < elements.length; ++i) {
+      if (elements[i] is SpreadElement) break;
+      elements[i] = elements[i].accept(this)..parent = node;
+    }
+
+    // If there was no spread, we are done.
+    if (i == elements.length) return node;
+
+    if (isConst) {
+      // We don't desugar const lists here.  Remove spread for now so that they
+      // don't leak out.
+      for (; i < elements.length; ++i) {
+        Expression element = elements[i];
+        if (element is SpreadElement) {
+          elements[i] = InvalidExpression('unimplemented spread element')
+            ..fileOffset = element.fileOffset
+            ..parent = node;
+        } else {
+          elements[i] = element.accept(this)..parent = node;
+        }
+      }
+      return node;
+    }
+
+    // Build a block expression and create an empty list or set.
+    VariableDeclaration result;
+    if (isSet) {
+      // TODO(kmillikin): When all the back ends handle set literals we can use
+      // one here.
+      result = new VariableDeclaration.forValue(
+          new StaticInvocation(
+              setFactory, new Arguments([], types: [elementType])),
+          type: new InterfaceType(coreTypes.setClass, [elementType]),
+          isFinal: true);
+    } else {
+      result = new VariableDeclaration.forValue(
+          new ListLiteral([], typeArgument: elementType),
+          type: new InterfaceType(coreTypes.listClass, [elementType]),
+          isFinal: true);
+    }
+    List<Statement> body = [result];
+    // Add the elements up to the first spread.
+    for (int j = 0; j < i; ++j) {
+      body.add(new ExpressionStatement(new MethodInvocation(
+          new VariableGet(result),
+          new Name('add'),
+          new Arguments([elements[j]]),
+          isSet ? setAdd : listAdd)));
+    }
+    // Translate the elements starting with the first spread.
+    for (; i < elements.length; ++i) {
+      Expression element = elements[i];
+      if (element is SpreadElement) {
+        Expression value = element.expression.accept(this);
+        // Null-aware spreads require testing the subexpression's value.
+        VariableDeclaration temp;
+        if (element.isNullAware) {
+          temp = new VariableDeclaration.forValue(value,
+              type: const DynamicType(), isFinal: true);
+          body.add(temp);
+          value = new VariableGet(temp);
+        }
+
+        VariableDeclaration elt =
+            new VariableDeclaration(null, type: elementType, isFinal: true);
+        Statement statement = new ForInStatement(
+            elt,
+            value,
+            new ExpressionStatement(new MethodInvocation(
+                new VariableGet(result),
+                new Name('add'),
+                new Arguments([new VariableGet(elt)]),
+                isSet ? setAdd : listAdd)));
+
+        if (element.isNullAware) {
+          statement = new IfStatement(
+              new Not(new MethodInvocation(
+                  new VariableGet(temp),
+                  new Name('=='),
+                  new Arguments([new NullLiteral()]),
+                  objectEquals)),
+              statement,
+              null);
+        }
+        body.add(statement);
+      } else {
+        body.add(new ExpressionStatement(new MethodInvocation(
+            new VariableGet(result),
+            new Name('add'),
+            new Arguments([element.accept(this)]),
+            isSet ? setAdd : listAdd)));
+      }
+    }
+
+    return new BlockExpression(new Block(body), new VariableGet(result));
+  }
+
+  @override
+  TreeNode visitListLiteral(ListLiteral node) {
+    return _translateListOrSet(node, node.typeArgument, node.expressions,
+        isConst: node.isConst, isSet: false);
+  }
+
+  @override
+  TreeNode visitSetLiteral(SetLiteral node) {
+    return _translateListOrSet(node, node.typeArgument, node.expressions,
+        isConst: node.isConst, isSet: true);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
index 390f4e4..8aad22c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
@@ -15,6 +15,7 @@
         InterfaceType,
         InvalidType,
         Library,
+        NamedType,
         TypeParameter,
         TypeParameterType,
         TypedefType,
@@ -24,6 +25,8 @@
     show
         DynamicTypeBuilder,
         KernelClassBuilder,
+        KernelFormalParameterBuilder,
+        KernelFunctionTypeBuilder,
         KernelNamedTypeBuilder,
         KernelTypeBuilder,
         KernelTypeVariableBuilder,
@@ -32,6 +35,8 @@
 
 import '../loader.dart' show Loader;
 
+import '../parser.dart' show FormalParameterKind;
+
 class TypeBuilderComputer implements DartTypeVisitor<KernelTypeBuilder> {
   final Loader<Library> loader;
 
@@ -75,8 +80,37 @@
     return new KernelNamedTypeBuilder(cls.name, arguments)..bind(cls);
   }
 
+  @override
   KernelTypeBuilder visitFunctionType(FunctionType node) {
-    throw "Not implemented";
+    KernelTypeBuilder returnType = node.returnType.accept(this);
+    // We could compute the type variables here. However, the current
+    // implementation of [visitTypeParameterType] is suffient.
+    List<KernelTypeVariableBuilder> typeVariables = null;
+    List<DartType> positionalParameters = node.positionalParameters;
+    List<NamedType> namedParameters = node.namedParameters;
+    List<KernelFormalParameterBuilder> formals =
+        new List<KernelFormalParameterBuilder>(
+            positionalParameters.length + namedParameters.length);
+    for (int i = 0; i < positionalParameters.length; i++) {
+      KernelTypeBuilder type = positionalParameters[i].accept(this);
+      FormalParameterKind kind = FormalParameterKind.mandatory;
+      if (i >= node.requiredParameterCount) {
+        kind = FormalParameterKind.optionalPositional;
+      }
+      formals[i] =
+          new KernelFormalParameterBuilder(null, 0, type, null, null, -1)
+            ..kind = kind;
+    }
+    for (int i = 0; i < namedParameters.length; i++) {
+      NamedType parameter = namedParameters[i];
+      KernelTypeBuilder type = positionalParameters[i].accept(this);
+      formals[i + positionalParameters.length] =
+          new KernelFormalParameterBuilder(
+              null, 0, type, parameter.name, null, -1)
+            ..kind = FormalParameterKind.optionalNamed;
+    }
+
+    return new KernelFunctionTypeBuilder(returnType, typeVariables, formals);
   }
 
   KernelTypeBuilder visitTypeParameterType(TypeParameterType node) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
index c0be105..43815bf 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
@@ -25,6 +25,7 @@
         NullConstant,
         PartialInstantiationConstant,
         Procedure,
+        SetConstant,
         StringConstant,
         SymbolConstant,
         TearOffConstant,
@@ -266,6 +267,19 @@
     result.add("]");
   }
 
+  void visitSetConstant(SetConstant node) {
+    result.add("<");
+    node.typeArgument.accept(this);
+    result.add(">{");
+    bool first = true;
+    for (Constant constant in node.entries) {
+      if (!first) result.add(", ");
+      constant.accept(this);
+      first = false;
+    }
+    result.add("}");
+  }
+
   void visitMapConstant(MapConstant node) {
     result.add("<");
     node.keyType.accept(this);
diff --git a/pkg/front_end/lib/src/fasta/kernel/types.dart b/pkg/front_end/lib/src/fasta/kernel/types.dart
index d7207b5..9f6d5c1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/types.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/types.dart
@@ -272,7 +272,8 @@
 
   @override
   bool isTypedefRelated(TypedefType s, InterfaceType t, Types types) {
-    return false;
+    // Rule 5.
+    return types.isSubtypeOfKernel(s.unalias, t);
   }
 
   @override
@@ -407,7 +408,9 @@
   @override
   bool isTypeParameterRelated(
       TypeParameterType s, TypeParameterType t, Types types) {
-    return s.parameter == t.parameter;
+    return s.parameter == t.parameter ||
+        // Rule 13.
+        types.isSubtypeOfKernel(s.bound, t);
   }
 
   @override
@@ -511,14 +514,63 @@
   @override
   bool isFutureOrRelated(
       InterfaceType sFutureOr, InterfaceType tFutureOr, Types types) {
-    //return types.isSubtypeOfKernel(
-    //    sFutureOr.typeArguments.single, futureOr.typeArguments.single);
-    // TODO(ahe): Not tested yet.
-    return true;
+    // This follows from combining rules 7, 10, and 11.
+    return types.isSubtypeOfKernel(
+        sFutureOr.typeArguments.single, tFutureOr.typeArguments.single);
   }
 
-  // TODO(ahe): Remove this method.
-  noSuchMethod(invocation) => super.noSuchMethod(invocation);
+  @override
+  bool isDynamicRelated(DynamicType s, InterfaceType futureOr, Types types) {
+    // Rule 11.
+    return types.isSubtypeOfKernel(s, futureOr.typeArguments.single);
+  }
+
+  @override
+  bool isVoidRelated(VoidType s, InterfaceType futureOr, Types types) {
+    // Rule 11.
+    return types.isSubtypeOfKernel(s, futureOr.typeArguments.single);
+  }
+
+  @override
+  bool isTypeParameterRelated(
+      TypeParameterType s, InterfaceType futureOr, Types types) {
+    List<DartType> arguments = futureOr.typeArguments;
+    if (types.isSubtypeOfKernel(s, arguments.single)) {
+      // Rule 11.
+      return true;
+    }
+
+    if (types.isSubtypeOfKernel(s.parameter.bound, futureOr)) {
+      // Rule 13.
+      return true;
+    }
+
+    // Rule 10.
+    return types.isSubtypeOfKernel(
+        s, new InterfaceType(types.hierarchy.futureKernelClass, arguments));
+  }
+
+  @override
+  bool isFunctionRelated(FunctionType s, InterfaceType futureOr, Types types) {
+    // Rule 11.
+    return types.isSubtypeOfKernel(s, futureOr.typeArguments.single);
+  }
+
+  @override
+  bool isIntersectionRelated(
+      TypeParameterType intersection, InterfaceType futureOr, Types types) {
+    if (isTypeParameterRelated(intersection, futureOr, types)) {
+      // Rule 8.
+      return true;
+    }
+    // Rule 12.
+    return types.isSubtypeOfKernel(intersection.promotedBound, futureOr);
+  }
+
+  @override
+  bool isTypedefRelated(TypedefType s, InterfaceType futureOr, Types types) {
+    return types.isSubtypeOfKernel(s.unalias, futureOr);
+  }
 }
 
 class IsIntersectionSubtypeOf extends TypeRelation<TypeParameterType> {
@@ -548,6 +600,28 @@
     return s.classNode == types.hierarchy.nullKernelClass; // Rule 4.
   }
 
-  // TODO(ahe): Remove this method.
-  noSuchMethod(invocation) => super.noSuchMethod(invocation);
+  bool isDynamicRelated(
+      DynamicType s, TypeParameterType intersection, Types types) {
+    return false;
+  }
+
+  bool isFunctionRelated(
+      FunctionType s, TypeParameterType intersection, Types types) {
+    return false;
+  }
+
+  bool isFutureOrRelated(
+      InterfaceType futureOr, TypeParameterType intersection, Types types) {
+    return false;
+  }
+
+  bool isTypedefRelated(
+      TypedefType s, TypeParameterType intersection, Types types) {
+    // Rule 5.
+    return types.isSubtypeOfKernel(s.unalias, intersection);
+  }
+
+  bool isVoidRelated(VoidType s, TypeParameterType intersection, Types types) {
+    return false;
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index 8709bb4..ac98334 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart
@@ -53,7 +53,6 @@
         ? new BinaryPrinter(sink)
         : new LimitedBinaryPrinter(sink, filter ?? (_) => true, false);
     printer.writeComponentFile(component);
-    component.unbindCanonicalNames();
   } finally {
     await sink.close();
   }
diff --git a/pkg/front_end/lib/src/fasta/modifier.dart b/pkg/front_end/lib/src/fasta/modifier.dart
index 4b7ed12..8c3f40c 100644
--- a/pkg/front_end/lib/src/fasta/modifier.dart
+++ b/pkg/front_end/lib/src/fasta/modifier.dart
@@ -42,6 +42,10 @@
 /// Not a modifier, used by formal parameters to track if they are initializing.
 const int initializingFormalMask = hasInitializerMask << 1;
 
+/// Not a modifier, used by classes to track if the class has a const
+/// constructor.
+const int hasConstConstructorMask = initializingFormalMask << 1;
+
 /// Not a real modifier, and by setting it to zero, it is automatically ignored
 /// by [Modifier.validate] below.
 const int varMask = 0;
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index 585a7b2..10f0a20 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -703,6 +703,20 @@
   }
 
   @override
+  void handleLiteralSetOrMap(
+    int count,
+    Token leftBrace,
+    Token constKeyword,
+    Token rightBrace,
+    // TODO(danrubel): hasSetEntry parameter exists for replicating existing
+    // behavior and will be removed once unified collection has been enabled
+    bool hasSetEntry,
+  ) {
+    listener?.handleLiteralSetOrMap(
+        count, leftBrace, constKeyword, rightBrace, hasSetEntry);
+  }
+
+  @override
   void endLiteralString(int interpolationCount, Token endToken) {
     listener?.endLiteralString(interpolationCount, endToken);
   }
@@ -1013,12 +1027,6 @@
   }
 
   @override
-  void handleLiteralSetOrMap(
-      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
-    listener?.handleLiteralSetOrMap(count, leftBrace, constKeyword, rightBrace);
-  }
-
-  @override
   void handleExpressionFunctionBody(Token arrowToken, Token endToken) {
     listener?.handleExpressionFunctionBody(arrowToken, endToken);
   }
@@ -1145,23 +1153,11 @@
   }
 
   @override
-  void handleLiteralMap(
-      int count, Token beginToken, Token constKeyword, Token endToken) {
-    listener?.handleLiteralMap(count, beginToken, constKeyword, endToken);
-  }
-
-  @override
   void handleLiteralNull(Token token) {
     listener?.handleLiteralNull(token);
   }
 
   @override
-  void handleLiteralSet(
-      int count, Token beginToken, Token constKeyword, Token token) {
-    listener?.handleLiteralSet(count, beginToken, constKeyword, token);
-  }
-
-  @override
   void handleMixinHeader(Token mixinKeyword) {
     listener?.handleMixinHeader(mixinKeyword);
   }
@@ -1266,6 +1262,11 @@
   }
 
   @override
+  void handleNonNullAssertExpression(Token bang) {
+    listener?.handleNonNullAssertExpression(bang);
+  }
+
+  @override
   void handleNoName(Token token) {
     listener?.handleNoName(token);
   }
@@ -1450,6 +1451,11 @@
   }
 
   @override
+  void reportNonNullAssertExpressionNotEnabled(Token bang) {
+    listener?.reportNonNullAssertExpressionNotEnabled(bang);
+  }
+
+  @override
   set suppressParseErrors(bool value) {
     listener?.suppressParseErrors = value;
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index 86036d3..5dc7b63 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -6,7 +6,7 @@
 
 import '../../scanner/token.dart' show Token;
 
-import '../fasta_codes.dart' show Message, templateUnexpectedToken;
+import '../fasta_codes.dart' show Message, templateExperimentNotEnabled;
 
 import '../quote.dart' show UnescapeErrorListener;
 
@@ -947,18 +947,31 @@
     logEvent("Type");
   }
 
+  /// Called when parser encounters a '!'
+  /// used as a non-null postfix assertion in an expression.
+  void handleNonNullAssertExpression(Token bang) {
+    logEvent("NonNullAssertExpression");
+  }
+
   // TODO(danrubel): Remove this once all listeners have been updated
   // to properly handle nullable types
   void reportErrorIfNullableType(Token questionMark) {
     if (questionMark != null) {
       assert(optional('?', questionMark));
       handleRecoverableError(
-          templateUnexpectedToken.withArguments(questionMark),
+          templateExperimentNotEnabled.withArguments('non-nullable'),
           questionMark,
           questionMark);
     }
   }
 
+  // TODO(danrubel): Remove this once all listeners have been updated
+  // to properly handle non-null assert expressions
+  void reportNonNullAssertExpressionNotEnabled(Token bang) {
+    handleRecoverableError(
+        templateExperimentNotEnabled.withArguments('non-nullable'), bang, bang);
+  }
+
   void handleNoName(Token token) {
     logEvent("NoName");
   }
@@ -1200,18 +1213,15 @@
     logEvent("LiteralList");
   }
 
-  void handleLiteralMap(
-      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
-    logEvent("LiteralMap");
-  }
-
-  void handleLiteralSet(
-      int count, Token beginToken, Token constKeyword, Token token) {
-    logEvent("LiteralSet");
-  }
-
   void handleLiteralSetOrMap(
-      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
+    int count,
+    Token leftBrace,
+    Token constKeyword,
+    Token rightBrace,
+    // TODO(danrubel): hasSetEntry parameter exists for replicating existing
+    // behavior and will be removed once unified collection has been enabled
+    bool hasSetEntry,
+  ) {
     logEvent('LiteralSetOrMap');
   }
 
diff --git a/pkg/front_end/lib/src/fasta/parser/literal_entry_info.dart b/pkg/front_end/lib/src/fasta/parser/literal_entry_info.dart
index 00bf0a1..cb85853 100644
--- a/pkg/front_end/lib/src/fasta/parser/literal_entry_info.dart
+++ b/pkg/front_end/lib/src/fasta/parser/literal_entry_info.dart
@@ -8,6 +8,10 @@
 import 'parser.dart';
 import 'util.dart';
 
+/// [simpleEntry] is the first step for parsing a literal entry
+/// without any control flow or spread collection operator.
+const LiteralEntryInfo simpleEntry = const LiteralEntryInfo(true);
+
 /// [LiteralEntryInfo] represents steps for processing an entry
 /// in a literal list, map, or set. These steps will handle parsing
 /// both control flow and spreadable operators, and indicate
diff --git a/pkg/front_end/lib/src/fasta/parser/literal_entry_info_impl.dart b/pkg/front_end/lib/src/fasta/parser/literal_entry_info_impl.dart
index 87bd6ad..f62ba96 100644
--- a/pkg/front_end/lib/src/fasta/parser/literal_entry_info_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/literal_entry_info_impl.dart
@@ -11,10 +11,6 @@
 /// starting with `if` control flow.
 const LiteralEntryInfo ifCondition = const IfCondition();
 
-/// [simpleEntry] is the first step for parsing a literal entry
-/// without any control flow or spread collection operator.
-const LiteralEntryInfo simpleEntry = const LiteralEntryInfo(true);
-
 /// [spreadOperator] is the first step for parsing a literal entry
 /// preceded by a '...' spread operator.
 const LiteralEntryInfo spreadOperator = const SpreadOperator();
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 0baa173..260fe3e 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -18,6 +18,7 @@
         EQUALITY_PRECEDENCE,
         Keyword,
         POSTFIX_PRECEDENCE,
+        PREFIX_PRECEDENCE,
         RELATIONAL_PRECEDENCE,
         SELECTOR_PRECEDENCE,
         SyntheticBeginToken,
@@ -69,7 +70,11 @@
 import 'listener.dart' show Listener;
 
 import 'literal_entry_info.dart'
-    show computeLiteralEntry, LiteralEntryInfo, looksLikeLiteralEntry;
+    show
+        LiteralEntryInfo,
+        computeLiteralEntry,
+        looksLikeLiteralEntry,
+        simpleEntry;
 
 import 'loop_state.dart' show LoopState;
 
@@ -265,10 +270,6 @@
 
   bool mayParseFunctionExpressions = true;
 
-  /// Experimental flag for enabling set literal support.
-  /// See https://github.com/dart-lang/sdk/issues/35121
-  bool enableSetLiterals = true;
-
   /// Represents parser state: what asynchronous syntax is allowed in the
   /// function being currently parsed. In rare situations, this can be set by
   /// external clients, for example, to parse an expression outside a function.
@@ -3357,9 +3358,11 @@
     } else if (optional('=>', next)) {
       return parseExpressionFunctionBody(next, ofFunctionExpression);
     } else if (optional('=', next)) {
-      Token begin = next;
       // Recover from a bad factory method.
       reportRecoverableError(next, fasta.messageExpectedBody);
+      next = rewriter.insertToken(
+          next, new SyntheticToken(TokenType.FUNCTION, next.next.charOffset));
+      Token begin = next;
       token = parseExpression(next);
       if (!ofFunctionExpression) {
         token = ensureSemicolon(token);
@@ -3568,7 +3571,16 @@
       throw "Internal error: Unknown asyncState: '$asyncState'.";
     } else if (identical(value, 'const')) {
       return parseExpressionStatementOrConstDeclaration(token);
-    } else if (!inPlainSync && identical(value, 'await')) {
+    } else if (identical(value, 'await')) {
+      if (inPlainSync) {
+        if (!looksLikeAwaitExpression(token)) {
+          return parseExpressionStatementOrDeclaration(token);
+        }
+        // Recovery: looks like an expression preceded by `await`
+        // but not inside an async context.
+        // Fall through to parseExpressionStatement
+        // and parseAwaitExpression will report the error.
+      }
       return parseExpressionStatement(token);
     } else if (identical(value, 'set') && token.next.next.isIdentifier) {
       // Recovery: invalid use of `set`
@@ -3772,6 +3784,13 @@
             listener.handleUnaryPostfixAssignmentExpression(token.next);
             token = next;
           }
+        } else if (identical(tokenLevel, PREFIX_PRECEDENCE)) {
+          // The '!' has prefix precedence but here it's being used as a
+          // postfix operator to assert the expression has a non-null value.
+          if ((identical(type, TokenType.BANG))) {
+            listener.handleNonNullAssertExpression(token.next);
+            token = next;
+          }
         } else if (identical(tokenLevel, SELECTOR_PRECEDENCE)) {
           if (identical(type, TokenType.PERIOD) ||
               identical(type, TokenType.QUESTION_PERIOD)) {
@@ -3877,10 +3896,13 @@
     // Prefix:
     if (identical(value, 'await')) {
       if (inPlainSync) {
-        return parsePrimary(token, IdentifierContext.expression);
-      } else {
-        return parseAwaitExpression(token, allowCascades);
+        if (!looksLikeAwaitExpression(token)) {
+          return parsePrimary(token, IdentifierContext.expression);
+        }
+        // Recovery: Looks like an expression preceded by `await`.
+        // Fall through and let parseAwaitExpression report the error.
       }
+      return parseAwaitExpression(token, allowCascades);
     } else if (identical(value, '+')) {
       // Dart no longer allows prefix-plus.
       rewriteAndRecover(
@@ -4038,7 +4060,7 @@
       listener.handleNoTypeArguments(token.next);
       return parseLiteralSetOrMapSuffix(token, null);
     } else if (kind == LT_TOKEN) {
-      return parseLiteralListOrMapOrFunction(token, null);
+      return parseLiteralListSetMapOrFunction(token, null);
     } else {
       // Fall through to the recovery code.
     }
@@ -4242,60 +4264,60 @@
   /// This method parses the portion of a set or map literal that starts with
   /// the left curly brace when there are no leading type arguments.
   Token parseLiteralSetOrMapSuffix(Token token, Token constKeyword) {
-    if (!enableSetLiterals) {
-      // TODO(danrubel): remove this once set literals are permanent
-      return parseLiteralMapSuffix(token, constKeyword);
-    }
-
     Token leftBrace = token = token.next;
     assert(optional('{', leftBrace));
     Token next = token.next;
     if (optional('}', next)) {
-      listener.handleLiteralSetOrMap(0, leftBrace, constKeyword, next);
+      listener.handleLiteralSetOrMap(0, leftBrace, constKeyword, next, false);
       return next;
     }
 
     final old = mayParseFunctionExpressions;
     mayParseFunctionExpressions = true;
     int count = 0;
-    bool isMap;
+    // TODO(danrubel): hasSetEntry parameter exists for replicating existing
+    // behavior and will be removed once unified collection has been enabled
+    bool hasSetEntry;
 
-    // Parse entries until we determine it's a map, or set, or no more entries
     while (true) {
       LiteralEntryInfo info = computeLiteralEntry(token);
-      while (info != null) {
-        if (info.hasEntry) {
-          token = parseExpression(token);
-          if (isMap == null) {
-            isMap = optional(':', token.next);
-          }
-          if (isMap) {
-            Token colon = ensureColon(token);
-            token = parseExpression(colon);
-            listener.handleLiteralMapEntry(colon, token.next);
-          }
-        } else {
-          token = info.parse(token, this);
+      if (info == simpleEntry) {
+        // TODO(danrubel): Remove this section and use the while loop below
+        // once hasSetEntry is no longer needed.
+        token = parseExpression(token);
+        var isMapEntry = optional(':', token.next);
+        hasSetEntry ??= !isMapEntry;
+        if (isMapEntry) {
+          Token colon = token.next;
+          token = parseExpression(colon);
+          listener.handleLiteralMapEntry(colon, token.next);
         }
-        info = info.computeNext(token);
+      } else {
+        while (info != null) {
+          if (info.hasEntry) {
+            token = parseExpression(token);
+            if (optional(':', token.next)) {
+              Token colon = token.next;
+              token = parseExpression(colon);
+              listener.handleLiteralMapEntry(colon, token.next);
+            }
+          } else {
+            token = info.parse(token, this);
+          }
+          info = info.computeNext(token);
+        }
       }
       ++count;
       next = token.next;
 
-      if (isMap != null) {
-        mayParseFunctionExpressions = old;
-        return isMap
-            ? parseLiteralMapRest(token, count, constKeyword, leftBrace)
-            : parseLiteralSetRest(token, count, constKeyword, leftBrace);
-      }
-
       Token comma;
       if (optional(',', next)) {
         comma = token = next;
         next = token.next;
       }
       if (optional('}', next)) {
-        listener.handleLiteralSetOrMap(count, leftBrace, constKeyword, next);
+        listener.handleLiteralSetOrMap(
+            count, leftBrace, constKeyword, next, hasSetEntry ?? false);
         mayParseFunctionExpressions = old;
         return next;
       }
@@ -4314,7 +4336,8 @@
               next, fasta.templateExpectedButGot.withArguments('}'));
           // Scanner guarantees a closing curly bracket
           next = leftBrace.endGroup;
-          listener.handleLiteralSetOrMap(count, leftBrace, constKeyword, next);
+          listener.handleLiteralSetOrMap(
+              count, leftBrace, constKeyword, next, hasSetEntry ?? false);
           mayParseFunctionExpressions = old;
           return next;
         }
@@ -4322,153 +4345,6 @@
     }
   }
 
-  /// This method parses the portion of a map literal that starts with the left
-  /// curly brace.
-  ///
-  /// ```
-  /// mapLiteral:
-  ///   'const'? typeArguments? '{' mapLiteralEntry (',' mapLiteralEntry)* ','? '}'
-  /// ;
-  /// ```
-  ///
-  /// Provide a [constKeyword] if the literal is preceded by 'const', or `null`
-  /// if not. This is a suffix parser because it is assumed that type arguments
-  /// have been parsed, or `listener.handleNoTypeArguments` has been executed.
-  Token parseLiteralMapSuffix(Token token, Token constKeyword) {
-    Token beginToken = token = token.next;
-    assert(optional('{', beginToken));
-    if (optional('}', token.next)) {
-      token = token.next;
-      listener.handleLiteralMap(0, beginToken, constKeyword, token);
-      return token;
-    }
-
-    bool old = mayParseFunctionExpressions;
-    mayParseFunctionExpressions = true;
-    token = parseMapLiteralEntry(token);
-    mayParseFunctionExpressions = old;
-
-    return parseLiteralMapRest(token, 1, constKeyword, beginToken);
-  }
-
-  /// Parse a literal map after the first entry.
-  Token parseLiteralMapRest(
-      Token token, int count, Token constKeyword, Token beginToken) {
-    bool old = mayParseFunctionExpressions;
-    mayParseFunctionExpressions = true;
-    while (true) {
-      Token next = token.next;
-      Token comma;
-      if (optional(',', next)) {
-        comma = token = next;
-        next = token.next;
-      }
-      if (optional('}', next)) {
-        token = next;
-        break;
-      }
-      if (comma == null) {
-        // Recovery
-        if (looksLikeLiteralEntry(next)) {
-          // If this looks like the start of an expression,
-          // then report an error, insert the comma, and continue parsing.
-          token = rewriteAndRecover(
-              token,
-              fasta.templateExpectedButGot.withArguments(','),
-              new SyntheticToken(TokenType.COMMA, next.offset));
-        } else {
-          reportRecoverableError(
-              next, fasta.templateExpectedButGot.withArguments('}'));
-          // Scanner guarantees a closing curly bracket
-          token = beginToken.endGroup;
-          break;
-        }
-      }
-      token = parseMapLiteralEntry(token);
-      ++count;
-    }
-    assert(optional('}', token));
-    mayParseFunctionExpressions = old;
-    listener.handleLiteralMap(count, beginToken, constKeyword, token);
-    return token;
-  }
-
-  /// This method parses the portion of a set literal that starts with the left
-  /// curly brace.
-  ///
-  /// ```
-  /// setLiteral:
-  ///   'const'?  typeArguments? '{' expression (',' expression)* ','? '}'
-  /// ;
-  /// ```
-  ///
-  /// Provide a [constKeyword] if the literal is preceded by 'const', or `null`
-  /// if not. This is a suffix parser because it is assumed that type arguments
-  /// have been parsed, or `listener.handleNoTypeArguments` has been executed.
-  Token parseLiteralSetSuffix(Token token, Token constKeyword) {
-    if (!enableSetLiterals) {
-      // TODO(danrubel): remove this once set literals are permanent
-      return parseLiteralMapSuffix(token, constKeyword);
-    }
-
-    Token beginToken = token = token.next;
-    assert(optional('{', beginToken));
-    if (optional('}', token.next)) {
-      token = token.next;
-      listener.handleLiteralSet(0, beginToken, constKeyword, token);
-      return token;
-    }
-
-    bool old = mayParseFunctionExpressions;
-    mayParseFunctionExpressions = true;
-    token = parseListOrSetLiteralEntry(token);
-    mayParseFunctionExpressions = old;
-
-    return parseLiteralSetRest(token, 1, constKeyword, beginToken);
-  }
-
-  /// Parse a literal set after the first expression.
-  Token parseLiteralSetRest(
-      Token token, int count, Token constKeyword, Token beginToken) {
-    bool old = mayParseFunctionExpressions;
-    mayParseFunctionExpressions = true;
-    while (true) {
-      Token next = token.next;
-      Token comma;
-      if (optional(',', next)) {
-        comma = token = next;
-        next = token.next;
-      }
-      if (optional('}', next)) {
-        token = next;
-        break;
-      }
-      if (comma == null) {
-        // Recovery
-        if (looksLikeLiteralEntry(next)) {
-          // If this looks like the start of an expression,
-          // then report an error, insert the comma, and continue parsing.
-          token = rewriteAndRecover(
-              token,
-              fasta.templateExpectedButGot.withArguments(','),
-              new SyntheticToken(TokenType.COMMA, next.offset));
-        } else {
-          reportRecoverableError(
-              next, fasta.templateExpectedButGot.withArguments('}'));
-          // Scanner guarantees a closing curly bracket
-          token = beginToken.endGroup;
-          break;
-        }
-      }
-      token = parseListOrSetLiteralEntry(token);
-      ++count;
-    }
-    assert(optional('}', token));
-    mayParseFunctionExpressions = old;
-    listener.handleLiteralSet(count, beginToken, constKeyword, token);
-    return token;
-  }
-
   /// formalParameterList functionBody.
   ///
   /// This is a suffix parser because it is assumed that type arguments have
@@ -4496,7 +4372,8 @@
   ///   genericFunctionLiteral ::=
   ///       typeParameters formalParameterList functionBody
   /// Provide token for [constKeyword] if preceded by 'const', null if not.
-  Token parseLiteralListOrMapOrFunction(final Token start, Token constKeyword) {
+  Token parseLiteralListSetMapOrFunction(
+      final Token start, Token constKeyword) {
     assert(optional('<', start.next));
     TypeParamOrArgInfo typeParamOrArg = computeTypeParamOrArg(start, true);
     Token token = typeParamOrArg.skip(start);
@@ -4511,16 +4388,14 @@
     }
     token = typeParamOrArg.parseArguments(start, this);
     if (optional('{', next)) {
-      switch (typeParamOrArg.typeArgumentCount) {
-        case 0:
-          return parseLiteralSetOrMapSuffix(token, constKeyword);
-        case 1:
-          return parseLiteralSetSuffix(token, constKeyword);
-        case 2:
-          return parseLiteralMapSuffix(token, constKeyword);
-        default:
-          return parseLiteralSetOrMapSuffix(token, constKeyword);
+      if (typeParamOrArg.typeArgumentCount > 2) {
+        // TODO(danrubel): remove code in listeners which report this error
+        listener.handleRecoverableError(
+            fasta.messageSetOrMapLiteralTooManyTypeArguments,
+            start.next,
+            token);
       }
+      return parseLiteralSetOrMapSuffix(token, constKeyword);
     }
     if (!optional('[', next) && !optional('[]', next)) {
       // TODO(danrubel): Improve this error message.
@@ -4674,7 +4549,7 @@
     }
     if (identical(value, '<')) {
       listener.beginConstLiteral(next);
-      token = parseLiteralListOrMapOrFunction(token, constKeyword);
+      token = parseLiteralListSetMapOrFunction(token, constKeyword);
       listener.endConstLiteral(token.next);
       return token;
     }
@@ -5606,6 +5481,31 @@
     return token;
   }
 
+  /// Determine if the following tokens look like an 'await' expression
+  /// and not a local variable or local function declaration.
+  bool looksLikeAwaitExpression(Token token) {
+    token = token.next;
+    assert(optional('await', token));
+    token = token.next;
+
+    // TODO(danrubel): Consider parsing the potential expression following
+    // the `await` token once doing so does not modify the token stream.
+    // For now, use simple look ahead and ensure no false positives.
+
+    if (token.isIdentifier) {
+      token = token.next;
+      if (optional('(', token)) {
+        token = token.endGroup.next;
+        if (isOneOf(token, [';', '.', '..', '?', '?.'])) {
+          return true;
+        }
+      } else if (isOneOf(token, ['.', ')', ']'])) {
+        return true;
+      }
+    }
+    return false;
+  }
+
   /// ```
   /// awaitExpression:
   ///   'await' unaryExpression
diff --git a/pkg/front_end/lib/src/fasta/quote.dart b/pkg/front_end/lib/src/fasta/quote.dart
index 682419f..c145b5c 100644
--- a/pkg/front_end/lib/src/fasta/quote.dart
+++ b/pkg/front_end/lib/src/fasta/quote.dart
@@ -127,10 +127,10 @@
       location, listener);
 }
 
-String unescapeLastStringPart(
-    String last, Quote quote, Object location, UnescapeErrorListener listener) {
-  return unescape(last.substring(0, last.length - lastQuoteLength(quote)),
-      quote, location, listener);
+String unescapeLastStringPart(String last, Quote quote, Object location,
+    bool isLastQuoteSynthetic, UnescapeErrorListener listener) {
+  int end = last.length - (isLastQuoteSynthetic ? 0 : lastQuoteLength(quote));
+  return unescape(last.substring(0, end), quote, location, listener);
 }
 
 String unescapeString(
diff --git a/pkg/front_end/tool/_fasta/resolve_input_uri.dart b/pkg/front_end/lib/src/fasta/resolve_input_uri.dart
similarity index 100%
rename from pkg/front_end/tool/_fasta/resolve_input_uri.dart
rename to pkg/front_end/lib/src/fasta/resolve_input_uri.dart
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 362b102..32a7071 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -967,6 +967,11 @@
   }
 
   @override
+  void handleNonNullAssertExpression(Token bang) {
+    reportNonNullAssertExpressionNotEnabled(bang);
+  }
+
+  @override
   void handleType(Token beginToken, Token questionMark) {
     debugEvent("Type");
     reportErrorIfNullableType(questionMark);
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 1d33fb1..3d178d3 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -941,6 +941,8 @@
 
   List<TypeVariableBuilder> typeVariables;
 
+  bool hasConstConstructor = false;
+
   DeclarationBuilder(this.members, this.setters, this.constructors, this.name,
       this.charOffset, this.parent) {
     assert(name != null);
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 05cc836..dee067a 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -23,7 +23,8 @@
         Library,
         LibraryDependency,
         ProcedureKind,
-        Supertype;
+        Supertype,
+        TreeNode;
 
 import 'package:kernel/class_hierarchy.dart'
     show ClassHierarchy, HandleAmbiguousSupertypes;
@@ -91,6 +92,8 @@
 
 import '../kernel/body_builder.dart' show BodyBuilder;
 
+import '../kernel/transform_collections.dart' show CollectionTransformer;
+
 import '../kernel/transform_set_literals.dart' show SetLiteralTransformer;
 
 import '../kernel/type_builder_computer.dart' show TypeBuilderComputer;
@@ -109,9 +112,6 @@
 
 import '../type_inference/interface_resolver.dart' show InterfaceResolver;
 
-import '../type_inference/type_inferrer.dart'
-    show KernelHierarchyMixinInferrerCallback;
-
 import 'diet_listener.dart' show DietListener;
 
 import 'diet_parser.dart' show DietParser;
@@ -145,6 +145,8 @@
 
   Instrumentation instrumentation;
 
+  CollectionTransformer collectionTransformer;
+
   SetLiteralTransformer setLiteralTransformer;
 
   SourceLoader(this.fileSystem, this.includeComments, KernelTarget target)
@@ -771,7 +773,9 @@
     List<Library> workList = <Library>[];
     builders.forEach((Uri uri, LibraryBuilder library) {
       if (!library.isPatch &&
-          (library.loader == this || library.uri.scheme == "dart")) {
+          (library.loader == this ||
+              library.uri.scheme == "dart" ||
+              library == this.first)) {
         if (libraries.add(library.target)) {
           workList.add(library.target);
         }
@@ -798,13 +802,9 @@
     };
     if (hierarchy == null) {
       hierarchy = new ClassHierarchy(computeFullComponent(),
-          onAmbiguousSupertypes: onAmbiguousSupertypes,
-          mixinInferrer: new KernelHierarchyMixinInferrerCallback(
-              this, target.legacyMode));
+          onAmbiguousSupertypes: onAmbiguousSupertypes);
     } else {
       hierarchy.onAmbiguousSupertypes = onAmbiguousSupertypes;
-      hierarchy.mixinInferrer =
-          new KernelHierarchyMixinInferrerCallback(this, target.legacyMode);
       Component component = computeFullComponent();
       hierarchy.applyTreeChanges(const [], component.libraries,
           reissueAmbiguousSupertypesFor: component);
@@ -1014,6 +1014,34 @@
     ticker.logMs("Performed top level inference");
   }
 
+  void transformPostInference(
+      TreeNode node, bool transformSetLiterals, bool transformCollections) {
+    if (transformCollections) {
+      node.accept(collectionTransformer ??= new CollectionTransformer(this));
+    }
+    if (transformSetLiterals) {
+      node.accept(setLiteralTransformer ??= new SetLiteralTransformer(this));
+    }
+  }
+
+  void transformListPostInference(List<TreeNode> list,
+      bool transformSetLiterals, bool transformCollections) {
+    if (transformSetLiterals) {
+      SetLiteralTransformer transformer =
+          setLiteralTransformer ??= new SetLiteralTransformer(this);
+      for (int i = 0; i < list.length; ++i) {
+        list[i] = list[i].accept(transformer);
+      }
+    }
+    if (transformCollections) {
+      CollectionTransformer transformer =
+          collectionTransformer ??= new CollectionTransformer(this);
+      for (int i = 0; i < list.length; ++i) {
+        list[i] = list[i].accept(transformer);
+      }
+    }
+  }
+
   Expression instantiateInvocation(Expression receiver, String name,
       Arguments arguments, int offset, bool isSuper) {
     return target.backendTarget.instantiateInvocation(
@@ -1116,6 +1144,9 @@
   KernelClassBuilder computeClassBuilderFromTargetClass(Class cls) {
     Library kernelLibrary = cls.enclosingLibrary;
     LibraryBuilder library = builders[kernelLibrary.importUri];
+    if (library == null) {
+      return target.dillTarget.loader.computeClassBuilderFromTargetClass(cls);
+    }
     return library[cls.name];
   }
 
diff --git a/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart b/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart
index c78a6a1..c818a43 100644
--- a/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart
@@ -871,24 +871,15 @@
   }
 
   @override
-  void handleLiteralSet(
-      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
-    debugEvent("LiteralSet", leftBrace);
-    state.discard(count);
-    state.pushNull("{}", leftBrace);
-  }
-
-  @override
-  void handleLiteralMap(
-      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
-    debugEvent("LiteralMap", leftBrace);
-    state.discard(count);
-    state.pushNull("{}", leftBrace);
-  }
-
-  @override
   void handleLiteralSetOrMap(
-      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
+    int count,
+    Token leftBrace,
+    Token constKeyword,
+    Token rightBrace,
+    // TODO(danrubel): hasSetEntry parameter exists for replicating existing
+    // behavior and will be removed once unified collection has been enabled
+    bool hasSetEntry,
+  ) {
     debugEvent("LiteralSetOrMap", leftBrace);
     state.discard(count);
     state.pushNull("{}", leftBrace);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index d719e07..3de6c94 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -52,8 +52,6 @@
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
-import 'package:kernel/class_hierarchy.dart' as kernel show MixinInferrer;
-
 import 'package:kernel/core_types.dart' show CoreTypes;
 
 import 'package:kernel/type_algebra.dart'
@@ -119,8 +117,6 @@
 
 import '../problems.dart' show internalProblem, unexpected, unhandled;
 
-import '../source/source_loader.dart' show SourceLoader;
-
 import 'inference_helper.dart' show InferenceHelper;
 
 import 'interface_resolver.dart' show ForwardingNode, SyntheticAccessor;
@@ -1909,29 +1905,6 @@
   }
 }
 
-// TODO(ahe): I'm working on removing this.
-class KernelHierarchyMixinInferrerCallback implements kernel.MixinInferrer {
-  final SourceLoader loader;
-  final bool legacyMode;
-
-  KernelHierarchyMixinInferrerCallback(this.loader, this.legacyMode);
-
-  @override
-  void infer(ClassHierarchy hierarchy, Class classNode) {
-    if (legacyMode) return;
-    Supertype mixedInType = classNode.mixedInType;
-    List<DartType> typeArguments = mixedInType.typeArguments;
-    if (typeArguments.isEmpty || typeArguments.first is! UnknownType) return;
-    new KernelHierarchyMixinInferrer(
-            hierarchy,
-            loader,
-            new TypeConstraintGatherer(
-                new TypeSchemaEnvironment(loader.coreTypes, hierarchy),
-                mixedInType.classNode.typeParameters))
-        .infer(classNode);
-  }
-}
-
 abstract class MixinInferrer {
   final CoreTypes coreTypes;
   final TypeConstraintGatherer gatherer;
@@ -2074,26 +2047,6 @@
   }
 }
 
-// TODO(ahe): I'm working on removing this.
-class KernelHierarchyMixinInferrer extends MixinInferrer {
-  final ClassHierarchy hierarchy;
-  final SourceLoader loader;
-
-  KernelHierarchyMixinInferrer(
-      this.hierarchy, this.loader, TypeConstraintGatherer gatherer)
-      : super(loader.coreTypes, gatherer);
-
-  @override
-  Supertype asInstantiationOf(Supertype type, Class superclass) {
-    return hierarchy.asInstantiationOf(type, superclass);
-  }
-
-  @override
-  void reportProblem(Message message, Class cls) {
-    loader.addProblem(message, cls.fileOffset, noLength, cls.fileUri);
-  }
-}
-
 /// The result of an expression inference.
 class ExpressionInferenceResult {
   final Expression expression;
diff --git a/pkg/front_end/lib/src/scanner/token.dart b/pkg/front_end/lib/src/scanner/token.dart
index 3b01015..5a78cd2 100644
--- a/pkg/front_end/lib/src/scanner/token.dart
+++ b/pkg/front_end/lib/src/scanner/token.dart
@@ -1012,97 +1012,97 @@
    * A value used to indicate that the token type is an additive operator.
    */
   static const TokenClass ADDITIVE_OPERATOR =
-      const TokenClass('ADDITIVE_OPERATOR', 13);
+      const TokenClass('ADDITIVE_OPERATOR', ADDITIVE_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is an assignment operator.
    */
   static const TokenClass ASSIGNMENT_OPERATOR =
-      const TokenClass('ASSIGNMENT_OPERATOR', 1);
+      const TokenClass('ASSIGNMENT_OPERATOR', ASSIGNMENT_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is a bitwise-and operator.
    */
   static const TokenClass BITWISE_AND_OPERATOR =
-      const TokenClass('BITWISE_AND_OPERATOR', 11);
+      const TokenClass('BITWISE_AND_OPERATOR', BITWISE_AND_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is a bitwise-or operator.
    */
   static const TokenClass BITWISE_OR_OPERATOR =
-      const TokenClass('BITWISE_OR_OPERATOR', 9);
+      const TokenClass('BITWISE_OR_OPERATOR', BITWISE_OR_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is a bitwise-xor operator.
    */
   static const TokenClass BITWISE_XOR_OPERATOR =
-      const TokenClass('BITWISE_XOR_OPERATOR', 10);
+      const TokenClass('BITWISE_XOR_OPERATOR', BITWISE_XOR_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is a cascade operator.
    */
   static const TokenClass CASCADE_OPERATOR =
-      const TokenClass('CASCADE_OPERATOR', 2);
+      const TokenClass('CASCADE_OPERATOR', CASCADE_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is a conditional operator.
    */
   static const TokenClass CONDITIONAL_OPERATOR =
-      const TokenClass('CONDITIONAL_OPERATOR', 3);
+      const TokenClass('CONDITIONAL_OPERATOR', CONDITIONAL_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is an equality operator.
    */
   static const TokenClass EQUALITY_OPERATOR =
-      const TokenClass('EQUALITY_OPERATOR', 7);
+      const TokenClass('EQUALITY_OPERATOR', EQUALITY_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is an if-null operator.
    */
   static const TokenClass IF_NULL_OPERATOR =
-      const TokenClass('IF_NULL_OPERATOR', 4);
+      const TokenClass('IF_NULL_OPERATOR', IF_NULL_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is a logical-and operator.
    */
   static const TokenClass LOGICAL_AND_OPERATOR =
-      const TokenClass('LOGICAL_AND_OPERATOR', 6);
+      const TokenClass('LOGICAL_AND_OPERATOR', LOGICAL_AND_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is a logical-or operator.
    */
   static const TokenClass LOGICAL_OR_OPERATOR =
-      const TokenClass('LOGICAL_OR_OPERATOR', 5);
+      const TokenClass('LOGICAL_OR_OPERATOR', LOGICAL_OR_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is a multiplicative operator.
    */
   static const TokenClass MULTIPLICATIVE_OPERATOR =
-      const TokenClass('MULTIPLICATIVE_OPERATOR', 14);
+      const TokenClass('MULTIPLICATIVE_OPERATOR', MULTIPLICATIVE_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is a relational operator.
    */
   static const TokenClass RELATIONAL_OPERATOR =
-      const TokenClass('RELATIONAL_OPERATOR', 8);
+      const TokenClass('RELATIONAL_OPERATOR', RELATIONAL_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is a shift operator.
    */
   static const TokenClass SHIFT_OPERATOR =
-      const TokenClass('SHIFT_OPERATOR', 12);
+      const TokenClass('SHIFT_OPERATOR', SHIFT_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is a unary operator.
    */
   static const TokenClass UNARY_POSTFIX_OPERATOR =
-      const TokenClass('UNARY_POSTFIX_OPERATOR', 16);
+      const TokenClass('UNARY_POSTFIX_OPERATOR', POSTFIX_PRECEDENCE);
 
   /**
    * A value used to indicate that the token type is a unary operator.
    */
   static const TokenClass UNARY_PREFIX_OPERATOR =
-      const TokenClass('UNARY_PREFIX_OPERATOR', 15);
+      const TokenClass('UNARY_PREFIX_OPERATOR', PREFIX_PRECEDENCE);
 
   /**
    * The name of the token class.
@@ -1119,7 +1119,7 @@
    * Initialize a newly created class of tokens to have the given [name] and
    * [precedence].
    */
-  const TokenClass(this.name, [this.precedence = 0]);
+  const TokenClass(this.name, [this.precedence = NO_PRECEDENCE]);
 
   @override
   String toString() => name;
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 9303b17..e1f1b74 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -140,6 +140,7 @@
 ExpectedType/example: Fail
 ExpectedUri/analyzerCode: Fail
 ExpectedUri/example: Fail
+ExperimentNotEnabled/example: Fail
 ExportAfterPart/script1: Fail
 ExpressionNotMetadata/analyzerCode: Fail
 ExpressionNotMetadata/example: Fail
@@ -335,6 +336,10 @@
 SourceBodySummary/example: Fail
 SourceOutlineSummary/analyzerCode: Fail
 SourceOutlineSummary/example: Fail
+SpreadElementTypeMismatch/script: Fail # Can't be tested until 'spread-collections' flag is on.
+SpreadTypeMismatch/analyzerCode: Fail # There's not analyzer code for that error yet.
+SpreadTypeMismatch/script1: Fail # Can't be tested until 'spread-collections' flag is on.
+SpreadTypeMismatch/script2: Fail # Can't be tested until 'spread-collections' flag is on.
 StackOverflow/example: Fail
 StaticAfterConst/script1: Fail
 SuperAsExpression/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 023e1d2..8b18378 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -173,6 +173,12 @@
   template: "Unable to decode bytes as UTF-8."
   bytes: [255]
 
+ExperimentNotEnabled:
+  index: 93
+  template: "This requires the --#string experiment to be enabled."
+  tip: "Try enabling this experiment by adding it to the command line when compiling and running."
+  analyzerCode: ParserErrorCode.EXPERIMENT_NOT_ENABLED
+
 EmptyNamedParameterList:
   template: "Named parameter lists cannot be empty."
   tip: "Try adding a named parameter to the list."
@@ -1544,6 +1550,9 @@
       --target=dart2js|dart2js_server|dart_runner|flutter|flutter_runner|none|vm
         Specify the target configuration.
 
+      --enable-asserts
+        Check asserts in initializers during constant evaluation.
+
       --verify
         Check that the generated output is free of various problems. This is mostly
         useful for developers of this compiler or Kernel transformations.
@@ -3461,3 +3470,26 @@
   # Used by dart:ffi
   template: "Class '#name' is a dart:ffi Pointer but has no struct annotation. Only struct Pointers can have fields."
   external: test/ffi_test.dart
+
+SpreadTypeMismatch:
+  template: "Unexpected type '#type' of a spread.  Expected 'dynamic' or an Iterable."
+  script:
+    - |
+      main() {
+        int a = 42;
+        var b = [...a];
+      }
+    - |
+      main() {
+        int Function() a = null;
+        var b = [...a];
+      }
+
+SpreadElementTypeMismatch:
+  template: "Can't assign spread elements of type '#type' to collection elements of type '#type2'."
+  analyzerCode: LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+  script: >
+    main() {
+      List<String> a = <String>["foo"];
+      List<int> b = <int>[...a];
+    }
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index 4928c97..5ca71fb 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -1,7 +1,7 @@
 name: front_end
 # Currently, front_end API is not stable and users should not
 # depend on semver semantics when depending on this package.
-version: 0.1.11
+version: 0.1.13
 author: Dart Team <misc@dartlang.org>
 description: Front end for compilation of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/front_end
@@ -11,14 +11,14 @@
   charcode: '^1.1.1'
   convert: '^2.0.1'
   crypto: '^2.0.2'
-  kernel: 0.3.11
+  kernel: 0.3.13
   meta: '^1.1.1'
   package_config: '^1.0.1'
   path: '^1.3.9'
   source_span: '^1.2.3'
   yaml: '^2.1.12'
 dev_dependencies:
-  analyzer: 0.35.1
+  analyzer: 0.35.3
   args: '>=0.13.0 <2.0.0'
   build_integration:
     path: ../build_integration
diff --git a/pkg/front_end/test/fasta/expression_test.dart b/pkg/front_end/test/fasta/expression_test.dart
index 0a895c8..643d94c 100644
--- a/pkg/front_end/test/fasta/expression_test.dart
+++ b/pkg/front_end/test/fasta/expression_test.dart
@@ -107,6 +107,9 @@
           buffer.write(line);
         }
         buffer.write("\n");
+        // TODO(jensj): Ignore context for now.
+        // Remove once we have positions on type parameters.
+        break;
       }
     }
     buffer.write("}\n");
@@ -125,6 +128,8 @@
 
   final Uri entryPoint;
 
+  final Uri import;
+
   final List<String> definitions;
 
   final List<String> typeDefinitions;
@@ -142,6 +147,7 @@
   TestCase(
       this.description,
       this.entryPoint,
+      this.import,
       this.definitions,
       this.typeDefinitions,
       this.isStaticMethod,
@@ -152,6 +158,7 @@
   String toString() {
     return "TestCase("
         "$entryPoint, "
+        "$import, "
         "$definitions, "
         "$typeDefinitions,"
         "$library, "
@@ -242,6 +249,7 @@
     String contents = await new File.fromUri(uri).readAsString();
 
     Uri entryPoint;
+    Uri import;
     List<String> definitions = <String>[];
     List<String> typeDefinitions = <String>[];
     bool isStaticMethod = false;
@@ -260,6 +268,8 @@
 
         if (key == "entry_point") {
           entryPoint = description.uri.resolveUri(Uri.parse(value as String));
+        } else if (key == "import") {
+          import = description.uri.resolveUri(Uri.parse(value as String));
         } else if (key == "position") {
           Uri uri = description.uri.resolveUri(Uri.parse(value as String));
           library = uri.removeFragment();
@@ -277,7 +287,7 @@
           expression = value;
         }
       }
-      var test = new TestCase(description, entryPoint, definitions,
+      var test = new TestCase(description, entryPoint, import, definitions,
           typeDefinitions, isStaticMethod, library, className, expression);
       var result = test.validate();
       if (result != null) {
@@ -331,9 +341,14 @@
       context.fileSystem.entityForUri(test.entryPoint).writeAsBytesSync(
           await new File.fromUri(test.entryPoint).readAsBytes());
 
+      if (test.import != null) {
+        context.fileSystem.entityForUri(test.import).writeAsBytesSync(
+            await new File.fromUri(test.import).readAsBytes());
+      }
+
       var sourceCompiler = new IncrementalCompiler(context.compilerContext);
       Component component =
-          await sourceCompiler.computeDelta(entryPoint: test.entryPoint);
+          await sourceCompiler.computeDelta(entryPoints: [test.entryPoint]);
       var errors = context.takeErrors();
       if (!errors.isEmpty) {
         return fail(tests, "Couldn't compile entry-point: $errors");
@@ -350,7 +365,8 @@
 
       var dillCompiler =
           new IncrementalCompiler(context.compilerContext, dillFileUri);
-      component = await dillCompiler.computeDelta(entryPoint: test.entryPoint);
+      component =
+          await dillCompiler.computeDelta(entryPoints: [test.entryPoint]);
       component.computeCanonicalNames();
       await dillFile.delete();
 
@@ -390,6 +406,7 @@
   final CompilerOptions optionBuilder = new CompilerOptions()
     ..target = new VmTarget(new TargetFlags())
     ..verbose = true
+    ..omitPlatform = true
     ..fileSystem = fs
     ..sdkSummary = sdkSummary
     ..onDiagnostic = (DiagnosticMessage message) {
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index 7580c2a..6987266 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -205,7 +205,7 @@
         "ThisAccessGenerator(offset: 4, isInitializer: false, isSuper: false)",
         new ThisAccessGenerator(helper, token, false, false));
     check("IncompleteErrorGenerator(offset: 4, message: Unspecified)",
-        new IncompleteErrorGenerator(helper, token, getter, message));
+        new IncompleteErrorGenerator(helper, token, message));
     check("SendAccessGenerator(offset: 4, name: bar, arguments: (\"arg\"))",
         new SendAccessGenerator(helper, token, name, arguments));
     check("IncompletePropertyAccessGenerator(offset: 4, name: bar)",
diff --git a/pkg/front_end/test/fasta/incremental_hello_test.dart b/pkg/front_end/test/fasta/incremental_hello_test.dart
index 1ac768d..a662c8c 100644
--- a/pkg/front_end/test/fasta/incremental_hello_test.dart
+++ b/pkg/front_end/test/fasta/incremental_hello_test.dart
@@ -37,6 +37,7 @@
     ..packagesFileUri = Uri.base.resolve(".packages")
     ..target = new VmTarget(new TargetFlags(legacyMode: true))
     ..legacyMode = true
+    ..omitPlatform = true
     ..onDiagnostic = diagnosticMessageHandler;
 
   if (sdkFromSource) {
@@ -71,12 +72,12 @@
 
   compiler.invalidate(helloDart);
 
-  component = await compiler.computeDelta(entryPoint: helloDart);
+  component = await compiler.computeDelta(entryPoints: [helloDart]);
   // Expect that the new component contains exactly hello.dart
   Expect.isTrue(
       component.libraries.length == 1, "${component.libraries.length} != 1");
 
-  component = await compiler.computeDelta(entryPoint: helloDart);
+  component = await compiler.computeDelta(entryPoints: [helloDart]);
   Expect.isTrue(component.libraries.isEmpty);
 }
 
diff --git a/pkg/front_end/test/fasta/incremental_test.dart b/pkg/front_end/test/fasta/incremental_test.dart
index 5324602..4208d17 100644
--- a/pkg/front_end/test/fasta/incremental_test.dart
+++ b/pkg/front_end/test/fasta/incremental_test.dart
@@ -153,7 +153,8 @@
         return edits == 0 ? fail(test, "No sources found") : pass(test);
       }
       var compiler = context.compiler;
-      Component component = await compiler.computeDelta(entryPoint: entryPoint);
+      Component component =
+          await compiler.computeDelta(entryPoints: [entryPoint]);
       List<DiagnosticMessage> errors = context.takeErrors();
       if (test.expectations[edits].hasCompileTimeError) {
         if (errors.isEmpty) {
diff --git a/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart b/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
index 0da8a6c..31ca046 100644
--- a/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
@@ -480,7 +480,7 @@
         'beginConstLiteral {',
         'handleNoTypeArguments {',
         'handleLiteralInt 5',
-        'handleLiteralSet 1, {, const, }',
+        'handleLiteralSetOrMap 1, {, const, }',
         'endConstLiteral ',
         'handleSpreadExpression ...',
         'endIfElseControlFlow }',
@@ -696,7 +696,7 @@
         'handleLiteralInt 2',
         'handleLiteralInt 3',
         'handleLiteralMapEntry :, }',
-        'handleLiteralMap 1, {, null, }',
+        'handleLiteralSetOrMap 1, {, null, }',
         'handleSpreadExpression ...',
         'endForInControlFlow }',
       ],
@@ -733,7 +733,7 @@
         'handleLiteralInt 2',
         'handleLiteralInt 7',
         'handleLiteralMapEntry :, }',
-        'handleLiteralMap 1, {, null, }',
+        'handleLiteralSetOrMap 1, {, null, }',
         'handleSpreadExpression ...?',
         'endForControlFlow }',
       ],
@@ -766,7 +766,7 @@
         'handleLiteralInt 2',
         'handleLiteralInt 3',
         'handleLiteralMapEntry :, }',
-        'handleLiteralMap 1, {, null, }',
+        'handleLiteralSetOrMap 1, {, null, }',
         'handleSpreadExpression ...',
         'endIfControlFlow }',
       ],
@@ -788,7 +788,7 @@
       'handleLiteralInt 1',
       'handleLiteralInt 2',
       'handleLiteralMapEntry :, }',
-      'handleLiteralMap 1, {, const, }',
+      'handleLiteralSetOrMap 1, {, const, }',
       'endConstLiteral ',
       'handleSpreadExpression ...',
     ]);
@@ -801,7 +801,7 @@
       'handleLiteralInt 1',
       'handleLiteralInt 3',
       'handleLiteralMapEntry :, }',
-      'handleLiteralMap 1, {, const, }',
+      'handleLiteralSetOrMap 1, {, const, }',
       'endConstLiteral ',
       'handleSpreadExpression ...?',
     ]);
@@ -996,10 +996,17 @@
   }
 
   @override
-  void handleLiteralMap(
-      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
-    calls
-        .add('handleLiteralMap $count, $leftBrace, $constKeyword, $rightBrace');
+  void handleLiteralSetOrMap(
+    int count,
+    Token leftBrace,
+    Token constKeyword,
+    Token rightBrace,
+    // TODO(danrubel): hasSetEntry parameter exists for replicating existing
+    // behavior and will be removed once unified collection has been enabled
+    bool hasSetEntry,
+  ) {
+    calls.add(
+        'handleLiteralSetOrMap $count, $leftBrace, $constKeyword, $rightBrace');
   }
 
   @override
@@ -1008,12 +1015,6 @@
   }
 
   @override
-  void handleLiteralSet(
-      int count, Token beginToken, Token constKeyword, Token token) {
-    calls.add('handleLiteralSet $count, $beginToken, $constKeyword, $token');
-  }
-
-  @override
   void handleNoArguments(Token token) {
     calls.add('handleNoArguments $token');
   }
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 6689d9f..7a22a03 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -132,6 +132,7 @@
   final bool legacyMode;
   final bool onlyCrashes;
   final bool enableSetLiterals;
+  final bool enableSpreadCollections;
   final bool skipVm;
   final Map<Component, KernelTarget> componentToTarget =
       <Component, KernelTarget>{};
@@ -156,6 +157,7 @@
       this.platformBinaries,
       this.onlyCrashes,
       this.enableSetLiterals,
+      this.enableSpreadCollections,
       bool ignoreExpectations,
       this.updateExpectations,
       bool updateComments,
@@ -243,7 +245,10 @@
     Uri sdk = Uri.base.resolve("sdk/");
     Uri vm = Uri.base.resolveUri(new Uri.file(Platform.resolvedExecutable));
     Uri packages = Uri.base.resolve(".packages");
+    bool legacyMode = environment.containsKey(LEGACY_MODE);
     bool enableSetLiterals = environment["enableSetLiterals"] != "false";
+    bool enableSpreadCollections =
+        environment["enableSpreadCollections"] != "false" && !legacyMode;
     var options = new ProcessedOptions(
         options: new CompilerOptions()
           ..onDiagnostic = (DiagnosticMessage message) {
@@ -252,10 +257,10 @@
           ..sdkRoot = sdk
           ..packagesFileUri = packages
           ..experimentalFlags = <ExperimentalFlag, bool>{
-            ExperimentalFlag.setLiterals: enableSetLiterals
+            ExperimentalFlag.setLiterals: enableSetLiterals,
+            ExperimentalFlag.spreadCollections: enableSpreadCollections,
           });
     UriTranslator uriTranslator = await options.getUriTranslator();
-    bool legacyMode = environment.containsKey(LEGACY_MODE);
     bool onlyCrashes = environment["onlyCrashes"] == "true";
     bool ignoreExpectations = environment["ignoreExpectations"] == "true";
     bool updateExpectations = environment["updateExpectations"] == "true";
@@ -275,6 +280,7 @@
             : Uri.base.resolve(platformBinaries),
         onlyCrashes,
         enableSetLiterals,
+        enableSpreadCollections,
         ignoreExpectations,
         updateExpectations,
         updateComments,
@@ -341,7 +347,8 @@
             errors.writeAll(message.plainTextFormatted, "\n");
           }
           ..experimentalFlags = <ExperimentalFlag, bool>{
-            ExperimentalFlag.setLiterals: context.enableSetLiterals
+            ExperimentalFlag.setLiterals: context.enableSetLiterals,
+            ExperimentalFlag.spreadCollections: context.enableSpreadCollections,
           },
         inputs: <Uri>[description.uri]);
     return await CompilerContext.runWithOptions(options, (_) async {
diff --git a/pkg/front_end/test/fasta/types/.gitignore b/pkg/front_end/test/fasta/types/.gitignore
new file mode 100644
index 0000000..7d444c6
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/.gitignore
@@ -0,0 +1,2 @@
+benchmark_data.tar.gz
+benchmark_data/
diff --git a/pkg/front_end/test/fasta/types/README.md b/pkg/front_end/test/fasta/types/README.md
new file mode 100644
index 0000000..d459f63
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/README.md
@@ -0,0 +1,28 @@
+<!--
+  -- Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+  -- for details. All rights reserved. Use of this source code is governed by a
+  -- BSD-style license that can be found in the LICENSE file.
+  -->
+
+# Type Relation Test and Benchmarks
+
+This directory contains tests and benchmarks of type relations, for example,
+isSubtypeOf.
+
+## Create or Update Benchmark Data
+
+To collect new data for a benchmark, follow these steps:
+
+1. Identify the program that the benchmark is based on, for example,
+`pkg/compiler/bin/dart2js.dart`.
+
+2. Modify `pkg/kernel/lib/type_environment.dart` as described in the method
+`SubtypeTester._collect_isSubtypeOf`.
+
+3. Compile the program using Fasta, for example:
+
+    ./sdk/bin/dart pkg/front_end/tool/_fasta/compile.dart pkg/compiler/bin/dart2js.dart
+
+4. This produces a file named `type_checks.json` in the current directory.
+
+5. Compress the file using `gzip`.
\ No newline at end of file
diff --git a/pkg/front_end/test/fasta/types/benchmark_data.tar.gz.sha1 b/pkg/front_end/test/fasta/types/benchmark_data.tar.gz.sha1
new file mode 100644
index 0000000..c90e80c
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/benchmark_data.tar.gz.sha1
@@ -0,0 +1 @@
+99b405b34da1ffbac3c55d2aeece5d72bb9434b4
\ No newline at end of file
diff --git a/pkg/front_end/test/fasta/types/dart2js_benchmark.dart b/pkg/front_end/test/fasta/types/dart2js_benchmark.dart
new file mode 100644
index 0000000..414a69a
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/dart2js_benchmark.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:io" show Platform;
+
+import "subtypes_benchmark.dart" show run;
+
+main() =>
+    run(Platform.script.resolve("benchmark_data/dart2js.json.gz"), "Dart2js");
diff --git a/pkg/front_end/test/fasta/types/dart2js_benchmark_test.dart b/pkg/front_end/test/fasta/types/dart2js_benchmark_test.dart
new file mode 100644
index 0000000..551647d
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/dart2js_benchmark_test.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart2js_benchmark.dart" as bench show main;
+
+main() => bench.main();
diff --git a/pkg/front_end/test/fasta/types/dill_hierachy_test.dart b/pkg/front_end/test/fasta/types/dill_hierachy_test.dart
new file mode 100644
index 0000000..31304d3
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/dill_hierachy_test.dart
@@ -0,0 +1,132 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:async_helper/async_helper.dart" show asyncTest;
+
+import "package:expect/expect.dart" show Expect;
+
+import "package:kernel/ast.dart" show Class, Component, Library;
+
+import "package:kernel/core_types.dart" show CoreTypes;
+
+import "package:kernel/target/targets.dart" show NoneTarget, TargetFlags;
+
+import "package:front_end/src/api_prototype/compiler_options.dart"
+    show CompilerOptions;
+
+import "package:front_end/src/base/processed_options.dart"
+    show ProcessedOptions;
+
+import "package:front_end/src/fasta/compiler_context.dart" show CompilerContext;
+
+import "package:front_end/src/fasta/dill/dill_loader.dart" show DillLoader;
+
+import "package:front_end/src/fasta/dill/dill_target.dart" show DillTarget;
+
+import "package:front_end/src/fasta/kernel/kernel_builder.dart"
+    show ClassHierarchyBuilder, KernelClassBuilder;
+
+import "package:front_end/src/fasta/ticker.dart" show Ticker;
+
+import "kernel_type_parser.dart" show parseComponent;
+
+const String expectedHierachy = """
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+  classSetters:
+
+A:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+  classSetters:
+
+B:
+  Longest path to Object: 2
+  superclasses:
+    Object
+  interfaces: A
+  classMembers:
+  classSetters:
+  interfaceMembers:
+  interfaceSetters:
+
+C:
+  Longest path to Object: 2
+  superclasses:
+    Object
+  interfaces: A
+  classMembers:
+  classSetters:
+  interfaceMembers:
+  interfaceSetters:
+
+D:
+  Longest path to Object: 3
+  superclasses:
+    Object
+  interfaces: B<T>, A, C<U>
+  classMembers:
+  classSetters:
+  interfaceMembers:
+  interfaceSetters:
+
+E:
+  Longest path to Object: 4
+  superclasses:
+    Object
+  interfaces: D<int, double>, B<int>, A, C<double>
+  classMembers:
+  classSetters:
+  interfaceMembers:
+  interfaceSetters:
+
+F:
+  Longest path to Object: 4
+  superclasses:
+    Object
+  interfaces: D<int, bool>, B<int>, A, C<bool>
+  classMembers:
+  classSetters:
+  interfaceMembers:
+  interfaceSetters:
+""";
+
+main() {
+  final Ticker ticker = new Ticker(isVerbose: false);
+  final Component component = parseComponent("""
+class A;
+class B<T> implements A;
+class C<U> implements A;
+class D<T, U> implements B<T>, C<U>;
+class E implements D<int, double>;
+class F implements D<int, bool>;""",
+      Uri.parse("org-dartlang-test:///library.dart"));
+
+  final CompilerContext context = new CompilerContext(new ProcessedOptions(
+      options: new CompilerOptions()
+        ..packagesFileUri = Uri.base.resolve(".packages")));
+
+  asyncTest(() => context.runInContext<void>((_) async {
+        DillTarget target = new DillTarget(
+            ticker,
+            await context.options.getUriTranslator(),
+            new NoneTarget(new TargetFlags()));
+        final DillLoader loader = target.loader;
+        loader.appendLibraries(component);
+        await target.buildOutlines();
+        KernelClassBuilder objectClass = loader.coreLibrary["Object"];
+        ClassHierarchyBuilder hierarchy = new ClassHierarchyBuilder(
+            objectClass, loader, new CoreTypes(component));
+        Library library = component.libraries.last;
+        for (Class cls in library.classes) {
+          hierarchy.getNodeFromKernelClass(cls);
+        }
+        Expect.stringEquals(
+            expectedHierachy, hierarchy.nodes.values.join("\n"));
+      }));
+}
diff --git a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
new file mode 100644
index 0000000..5e53470
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:kernel/ast.dart" show DartType;
+
+import "package:kernel/core_types.dart" show CoreTypes;
+
+import "package:kernel/target/targets.dart" show NoneTarget, TargetFlags;
+
+import "package:front_end/src/api_prototype/compiler_options.dart"
+    show CompilerOptions;
+
+import "package:front_end/src/base/processed_options.dart"
+    show ProcessedOptions;
+
+import "package:front_end/src/fasta/compiler_context.dart" show CompilerContext;
+
+import "package:front_end/src/fasta/dill/dill_loader.dart" show DillLoader;
+
+import "package:front_end/src/fasta/dill/dill_target.dart" show DillTarget;
+
+import "package:front_end/src/fasta/kernel/kernel_builder.dart"
+    show ClassHierarchyBuilder, KernelClassBuilder;
+
+import "package:front_end/src/fasta/ticker.dart" show Ticker;
+
+import "legacy_upper_bound_helper.dart" show LegacyUpperBoundTest;
+
+class FastaLegacyUpperBoundTest extends LegacyUpperBoundTest {
+  final Ticker ticker;
+  final CompilerContext context;
+
+  ClassHierarchyBuilder hierarchy;
+
+  FastaLegacyUpperBoundTest(this.ticker, this.context);
+
+  @override
+  Future<void> parseComponent(String source) async {
+    await super.parseComponent(source);
+
+    DillTarget target = new DillTarget(
+        ticker,
+        await context.options.getUriTranslator(),
+        new NoneTarget(new TargetFlags()));
+    final DillLoader loader = target.loader;
+    loader.appendLibraries(component);
+    await target.buildOutlines();
+    KernelClassBuilder objectClass = loader.coreLibrary["Object"];
+    hierarchy = new ClassHierarchyBuilder(
+        objectClass, loader, new CoreTypes(component));
+  }
+
+  @override
+  DartType getLegacyLeastUpperBound(DartType a, DartType b) {
+    return hierarchy.getKernelLegacyLeastUpperBound(a, b);
+  }
+}
+
+main() {
+  final Ticker ticker = new Ticker();
+  final CompilerContext context = new CompilerContext(new ProcessedOptions(
+      options: new CompilerOptions()
+        ..packagesFileUri = Uri.base.resolve(".packages")));
+  context.runInContext<void>(
+      (_) => new FastaLegacyUpperBoundTest(ticker, context).test());
+}
diff --git a/pkg/front_end/test/fasta/types/fasta_types_test.dart b/pkg/front_end/test/fasta/types/fasta_types_test.dart
index 7f50ad6..42ce99d 100644
--- a/pkg/front_end/test/fasta/types/fasta_types_test.dart
+++ b/pkg/front_end/test/fasta/types/fasta_types_test.dart
@@ -36,7 +36,7 @@
 import "type_parser.dart" as type_parser show parse, parseTypeVariables;
 
 main() {
-  final Ticker ticker = Ticker();
+  final Ticker ticker = new Ticker(isVerbose: false);
   final CompilerContext context = new CompilerContext(new ProcessedOptions(
       options: new CompilerOptions()
         ..packagesFileUri = Uri.base.resolve(".packages")));
diff --git a/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
new file mode 100644
index 0000000..9004191
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "legacy_upper_bound_helper.dart" show LegacyUpperBoundTest;
+
+import "package:kernel/ast.dart" show DartType;
+
+import "package:kernel/class_hierarchy.dart" show ClassHierarchy;
+
+class KernelLegacyUpperBoundTest extends LegacyUpperBoundTest {
+  ClassHierarchy hierarchy;
+
+  @override
+  Future<void> parseComponent(String source) {
+    super.parseComponent(source);
+    hierarchy = new ClassHierarchy(component);
+    return null;
+  }
+
+  @override
+  DartType getLegacyLeastUpperBound(DartType a, DartType b) {
+    return hierarchy.getLegacyLeastUpperBound(a, b);
+  }
+}
+
+main() {
+  new KernelLegacyUpperBoundTest().test();
+}
diff --git a/pkg/front_end/test/fasta/types/kernel_type_parser.dart b/pkg/front_end/test/fasta/types/kernel_type_parser.dart
index 86f8a68..6d92bac 100644
--- a/pkg/front_end/test/fasta/types/kernel_type_parser.dart
+++ b/pkg/front_end/test/fasta/types/kernel_type_parser.dart
@@ -6,6 +6,7 @@
     show
         BottomType,
         Class,
+        Component,
         DartType,
         DynamicType,
         FunctionType,
@@ -24,6 +25,8 @@
 
 import "package:kernel/src/bounds_checks.dart" show calculateBounds;
 
+import "mock_sdk.dart" show mockSdk;
+
 import "type_parser.dart" as type_parser show parse;
 
 import "type_parser.dart"
@@ -38,13 +41,34 @@
         ParsedVoidType,
         Visitor;
 
+Component parseComponent(String source, Uri uri) {
+  Uri coreUri = Uri.parse("dart:core");
+  KernelEnvironment coreEnvironment = new KernelEnvironment(coreUri, coreUri);
+  Library coreLibrary =
+      parseLibrary(coreUri, mockSdk, environment: coreEnvironment);
+  KernelEnvironment libraryEnvironment =
+      new KernelEnvironment(uri, uri).extend(coreEnvironment.declarations);
+  Library library = parseLibrary(uri, source, environment: libraryEnvironment);
+  library.name = "lib";
+  return new Component(libraries: <Library>[coreLibrary, library]);
+}
+
 Library parseLibrary(Uri uri, String text,
     {Uri fileUri, KernelEnvironment environment}) {
   fileUri ??= uri;
   environment ??= new KernelEnvironment(uri, fileUri);
   Library library =
       new Library(uri, fileUri: fileUri, name: uri.path.replaceAll("/", "."));
-  for (ParsedType type in type_parser.parse(text)) {
+  List<ParsedType> types = type_parser.parse(text);
+  for (ParsedType type in types) {
+    if (type is ParsedClass) {
+      String name = type.name;
+      environment[name] = new Class(fileUri: fileUri, name: name)
+        ..typeParameters.addAll(
+            new List<TypeParameter>.filled(type.typeVariables.length, null));
+    }
+  }
+  for (ParsedType type in types) {
     Node node = environment.kernelFromParsedType(type);
     if (node is Class) {
       library.addClass(node);
@@ -64,7 +88,9 @@
 
   final Map<String, TreeNode> declarations = <String, TreeNode>{};
 
-  KernelEnvironment(this.uri, this.fileUri);
+  final KernelEnvironment parent;
+
+  KernelEnvironment(this.uri, this.fileUri, [this.parent]);
 
   Node kernelFromParsedType(ParsedType type) {
     Node node = type.accept(const KernelFromParsedType(), this);
@@ -76,7 +102,12 @@
   Class get objectClass => this["Object"];
 
   TreeNode operator [](String name) {
-    return declarations[name] ?? (throw "Not found: $name");
+    TreeNode result = declarations[name];
+    if (result == null && parent != null) {
+      return parent[name];
+    }
+    if (result == null) throw "Not found: $name";
+    return result;
   }
 
   void operator []=(String name, TreeNode declaration) {
@@ -88,8 +119,7 @@
   }
 
   KernelEnvironment extend(Map<String, TreeNode> declarations) {
-    return new KernelEnvironment(uri, fileUri)
-      ..declarations.addAll(this.declarations)
+    return new KernelEnvironment(uri, fileUri, this)
       ..declarations.addAll(declarations);
   }
 }
@@ -146,13 +176,14 @@
 
   Class visitClass(ParsedClass node, KernelEnvironment environment) {
     String name = node.name;
-    Class cls =
-        environment[name] = new Class(fileUri: environment.fileUri, name: name);
+    Class cls = environment[name];
     ParameterEnvironment parameterEnvironment =
         computeTypeParameterEnvironment(node.typeVariables, environment);
     List<TypeParameter> parameters = parameterEnvironment.parameters;
     setParents(parameters, cls);
-    cls.typeParameters.addAll(parameters);
+    cls.typeParameters
+      ..clear()
+      ..addAll(parameters);
     {
       KernelEnvironment environment = parameterEnvironment.environment;
       InterfaceType type =
@@ -164,6 +195,11 @@
       } else {
         cls.supertype = toSupertype(type);
       }
+      InterfaceType mixedInType =
+          node.mixedInType?.accept<Node, KernelEnvironment>(this, environment);
+      if (mixedInType != null) {
+        cls.mixedInType = toSupertype(mixedInType);
+      }
       List<ParsedType> interfaces = node.interfaces;
       for (int i = 0; i < interfaces.length; i++) {
         cls.implementedTypes.add(toSupertype(
@@ -276,7 +312,7 @@
         typeParameter
           ..bound = type
           // The default type will be overridden below, but we need to set it
-          // so [calculateBounds] can destinquish between explicit and implicit
+          // so [calculateBounds] can distinguish between explicit and implicit
           // bounds.
           ..defaultType = type;
       }
diff --git a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
index ea220ac..3280ce7 100644
--- a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
@@ -17,28 +17,23 @@
 import "kernel_type_parser.dart"
     show KernelEnvironment, KernelFromParsedType, parseLibrary;
 
+import "mock_sdk.dart" show mockSdk;
+
 import "shared_type_tests.dart" show SubtypeTest;
 
 import "type_parser.dart" as type_parser show parse, parseTypeVariables;
 
 const String testSdk = """
-class Object;
-class Comparable<T>;
-class num implements Comparable<num>;
-class int extends num;
-class double extends num;
-class Iterable<T>;
-class List<T> extends Iterable<T>;
-class Future<T>;
-class FutureOr<T>;
-class Null;
-class Function;
 typedef Typedef<T> <S>(T) -> S;
 typedef VoidFunction () -> void;
 class DefaultTypes<S, T extends Object, U extends List<S>, V extends List<T>, W extends Comparable<W>, X extends (W) -> void, Y extends () -> W>;
 typedef TestDefaultTypes () -> DefaultTypes;
 typedef Id<T> T;
 typedef TestSorting ({int c, int b, int a}) -> void;
+class Super implements Comparable<Sub>;
+class Sub extends Super;
+class FBound<T extends FBound<T>>;
+class MixinApplication extends Object with FBound<MixinApplication>;
 """;
 
 const String expectedSdk = """
@@ -72,12 +67,25 @@
 }
 class Function extends self::Object {
 }
+class String extends self::Object {
+}
+class bool extends self::Object {
+}
 class DefaultTypes<S extends self::Object = dynamic, T extends self::Object = self::Object, U extends self::List<self::DefaultTypes::S> = self::List<dynamic>, V extends self::List<self::DefaultTypes::T> = self::List<self::Object>, W extends self::Comparable<self::DefaultTypes::W> = self::Comparable<dynamic>, X extends (self::DefaultTypes::W) → void = (<BottomType>) → void, Y extends () → self::DefaultTypes::W = () → self::Comparable<dynamic>> extends self::Object {
 }
+class Super extends self::Object implements self::Comparable<self::Sub> {
+}
+class Sub extends self::Super {
+}
+class FBound<T extends self::FBound<self::FBound::T> = self::FBound<dynamic>> extends self::Object {
+}
+class MixinApplication = self::Object with self::FBound<self::MixinApplication> {
+}
 """;
 
 Component parseSdk(Uri uri, KernelEnvironment environment) {
-  Library library = parseLibrary(uri, testSdk, environment: environment);
+  Library library =
+      parseLibrary(uri, mockSdk + testSdk, environment: environment);
   StringBuffer sb = new StringBuffer();
   Printer printer = new Printer(sb);
   printer.writeLibraryFile(library);
@@ -103,6 +111,9 @@
 
   KernelSubtypeTest(this.coreTypes, this.hierarchy, this.environment);
 
+  @override
+  bool get skipFutureOrPromotion => true;
+
   DartType toType(String text, KernelEnvironment environment) {
     return environment.kernelFromParsedType(type_parser.parse(text).single);
   }
diff --git a/pkg/front_end/test/fasta/types/large_app_benchmark.dart b/pkg/front_end/test/fasta/types/large_app_benchmark.dart
new file mode 100644
index 0000000..94a5601
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/large_app_benchmark.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:io" show Platform;
+
+import "subtypes_benchmark.dart" show run;
+
+main() => run(
+    Platform.script.resolve("benchmark_data/large_app.json.gz"), "LargeApp");
diff --git a/pkg/front_end/test/fasta/types/large_app_benchmark_test.dart b/pkg/front_end/test/fasta/types/large_app_benchmark_test.dart
new file mode 100644
index 0000000..4dca6c8
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/large_app_benchmark_test.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "large_app_benchmark.dart" as bench show main;
+
+main() => bench.main();
diff --git a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
new file mode 100644
index 0000000..1a6c955
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
@@ -0,0 +1,164 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:async_helper/async_helper.dart" show asyncTest;
+
+import "package:expect/expect.dart" show Expect;
+
+import "package:kernel/ast.dart" show Class, Component, DartType, InterfaceType;
+
+import "package:kernel/library_index.dart" show LibraryIndex;
+
+import "kernel_type_parser.dart" as kernel_type_parser show parseComponent;
+
+final Uri libraryUri = Uri.parse("org-dartlang-test:///library.dart");
+
+abstract class LegacyUpperBoundTest {
+  Component component;
+
+  LibraryIndex index;
+
+  DartType get objectType => getCoreClass("Object").rawType;
+
+  DartType get intType => getCoreClass("int").rawType;
+
+  DartType get stringType => getCoreClass("String").rawType;
+
+  DartType get doubleType => getCoreClass("double").rawType;
+
+  DartType get boolType => getCoreClass("bool").rawType;
+
+  void parseComponent(String source) {
+    component = kernel_type_parser.parseComponent(source, libraryUri);
+    index = new LibraryIndex.all(component);
+  }
+
+  Class getClass(String name) {
+    return index.getClass("$libraryUri", name);
+  }
+
+  Class getCoreClass(String name) {
+    return index.getClass("dart:core", name);
+  }
+
+  DartType getLegacyLeastUpperBound(DartType a, DartType b);
+
+  void checkGetLegacyLeastUpperBound(
+      DartType a, DartType b, DartType expected) {
+    DartType actual = getLegacyLeastUpperBound(a, b);
+    Expect.equals(expected, actual);
+  }
+
+  Future<void> test() {
+    return asyncTest(() async {
+      await test_getLegacyLeastUpperBound_expansive();
+      await test_getLegacyLeastUpperBound_generic();
+      await test_getLegacyLeastUpperBound_nonGeneric();
+    });
+  }
+
+  /// Copy of the tests/language/least_upper_bound_expansive_test.dart test.
+  Future<void> test_getLegacyLeastUpperBound_expansive() async {
+    await parseComponent("""
+class N<T>;
+class C1<T> extends N<N<C1<T>>>;
+class C2<T> extends N<N<C2<N<C2<T>>>>>;
+""");
+
+    Class N = getClass("N");
+    Class C1 = getClass("C1");
+    Class C2 = getClass("C2");
+
+    // The least upper bound of C1<int> and N<C1<String>> is Object since the
+    // supertypes are
+    //     {C1<int>, N<N<C1<int>>>, Object} for C1<int> and
+    //     {N<C1<String>>, Object} for N<C1<String>> and
+    // Object is the most specific type in the intersection of the supertypes.
+    checkGetLegacyLeastUpperBound(
+        new InterfaceType(C1, [intType]),
+        new InterfaceType(N, [
+          new InterfaceType(C1, [stringType])
+        ]),
+        objectType);
+
+    // The least upper bound of C2<int> and N<C2<String>> is Object since the
+    // supertypes are
+    //     {C2<int>, N<N<C2<N<C2<int>>>>>, Object} for C2<int> and
+    //     {N<C2<String>>, Object} for N<C2<String>> and
+    // Object is the most specific type in the intersection of the supertypes.
+    checkGetLegacyLeastUpperBound(
+        new InterfaceType(C2, [intType]),
+        new InterfaceType(N, [
+          new InterfaceType(C2, [stringType])
+        ]),
+        objectType);
+  }
+
+  Future<void> test_getLegacyLeastUpperBound_generic() async {
+    await parseComponent("""
+class A;
+class B<T> implements A;
+class C<U> implements A;
+class D<T, U> implements B<T>, C<U>;
+class E implements D<int, double>;
+class F implements D<int, bool>;
+""");
+
+    Class a = getClass("A");
+    Class b = getClass("B");
+    Class c = getClass("C");
+    Class d = getClass("D");
+    Class e = getClass("E");
+    Class f = getClass("F");
+
+    checkGetLegacyLeastUpperBound(
+        new InterfaceType(d, [intType, doubleType]),
+        new InterfaceType(d, [intType, doubleType]),
+        new InterfaceType(d, [intType, doubleType]));
+    checkGetLegacyLeastUpperBound(
+        new InterfaceType(d, [intType, doubleType]),
+        new InterfaceType(d, [intType, boolType]),
+        new InterfaceType(b, [intType]));
+    checkGetLegacyLeastUpperBound(
+        new InterfaceType(d, [intType, doubleType]),
+        new InterfaceType(d, [boolType, doubleType]),
+        new InterfaceType(c, [doubleType]));
+    checkGetLegacyLeastUpperBound(new InterfaceType(d, [intType, doubleType]),
+        new InterfaceType(d, [boolType, intType]), a.rawType);
+    checkGetLegacyLeastUpperBound(
+        e.rawType, f.rawType, new InterfaceType(b, [intType]));
+  }
+
+  Future<void> test_getLegacyLeastUpperBound_nonGeneric() async {
+    await parseComponent("""
+class A;
+class B;
+class C implements A;
+class D implements A;
+class E implements A;
+class F implements C, D;
+class G implements C, D;
+class H implements C, D, E;
+class I implements C, D, E;
+""");
+
+    Class a = getClass("A");
+    Class b = getClass("B");
+    Class c = getClass("C");
+    Class d = getClass("D");
+    Class f = getClass("F");
+    Class g = getClass("G");
+    Class h = getClass("H");
+    Class i = getClass("I");
+
+    checkGetLegacyLeastUpperBound(a.rawType, b.rawType, objectType);
+    checkGetLegacyLeastUpperBound(a.rawType, objectType, objectType);
+    checkGetLegacyLeastUpperBound(objectType, b.rawType, objectType);
+    checkGetLegacyLeastUpperBound(c.rawType, d.rawType, a.rawType);
+    checkGetLegacyLeastUpperBound(c.rawType, a.rawType, a.rawType);
+    checkGetLegacyLeastUpperBound(a.rawType, d.rawType, a.rawType);
+    checkGetLegacyLeastUpperBound(f.rawType, g.rawType, a.rawType);
+    checkGetLegacyLeastUpperBound(h.rawType, i.rawType, a.rawType);
+  }
+}
diff --git a/pkg/front_end/test/fasta/types/legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/legacy_upper_bound_test.dart
deleted file mode 100644
index 24b04d2..0000000
--- a/pkg/front_end/test/fasta/types/legacy_upper_bound_test.dart
+++ /dev/null
@@ -1,292 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/matchers_lite.dart";
-
-import "package:kernel/ast.dart";
-import "package:kernel/class_hierarchy.dart";
-import "package:kernel/core_types.dart";
-import "package:kernel/testing/mock_sdk_component.dart";
-import "package:kernel/text/ast_to_text.dart";
-import "package:kernel/type_algebra.dart";
-
-main() {
-  new LegacyUpperBoundTest().test_getLegacyLeastUpperBound_expansive();
-
-  new LegacyUpperBoundTest().test_getLegacyLeastUpperBound_generic();
-
-  new LegacyUpperBoundTest().test_getLegacyLeastUpperBound_nonGeneric();
-}
-
-class LegacyUpperBoundTest {
-  final Component component = createMockSdkComponent();
-
-  CoreTypes coreTypes;
-
-  final Library library =
-      new Library(Uri.parse('org-dartlang:///test.dart'), name: 'test');
-
-  ClassHierarchy _hierarchy;
-
-  LegacyUpperBoundTest() {
-    coreTypes = new CoreTypes(component);
-    library.parent = component;
-    component.libraries.add(library);
-  }
-
-  Class get objectClass => coreTypes.objectClass;
-
-  Supertype get objectSuper => coreTypes.objectClass.asThisSupertype;
-
-  ClassHierarchy get hierarchy {
-    return _hierarchy ??= createClassHierarchy(component);
-  }
-
-  Class addClass(Class c) {
-    if (_hierarchy != null) {
-      fail('The classs hierarchy has already been created.');
-    }
-    library.addClass(c);
-    return c;
-  }
-
-  /// Assert that the test [library] has the [expectedText] presentation.
-  /// The presentation is close, but not identical to the normal Kernel one.
-  void _assertTestLibraryText(String expectedText) {
-    _assertLibraryText(library, expectedText);
-  }
-
-  void _assertLibraryText(Library lib, String expectedText) {
-    StringBuffer sb = new StringBuffer();
-    Printer printer = new Printer(sb);
-    printer.writeLibraryFile(lib);
-
-    String actualText = sb.toString();
-
-    // Clean up the text a bit.
-    const oftenUsedPrefix = '''
-library test;
-import self as self;
-import "dart:core" as core;
-
-''';
-    if (actualText.startsWith(oftenUsedPrefix)) {
-      actualText = actualText.substring(oftenUsedPrefix.length);
-    }
-    actualText = actualText.replaceAll('{\n}', '{}');
-    actualText = actualText.replaceAll(' extends core::Object', '');
-
-    if (actualText != expectedText) {
-      print('-------- Actual --------');
-      print(actualText + '------------------------');
-    }
-
-    expect(actualText, expectedText);
-  }
-
-  ClassHierarchy createClassHierarchy(Component component) {
-    return new ClassHierarchy(component);
-  }
-
-  /// Add a new generic class with the given [name] and [typeParameterNames].
-  /// The [TypeParameterType]s corresponding to [typeParameterNames] are
-  /// passed to optional [extends_] and [implements_] callbacks.
-  Class addGenericClass(String name, List<String> typeParameterNames,
-      {Supertype extends_(List<DartType> typeParameterTypes),
-      List<Supertype> implements_(List<DartType> typeParameterTypes)}) {
-    var typeParameters = typeParameterNames
-        .map((name) => new TypeParameter(name, objectClass.rawType))
-        .toList();
-    var typeParameterTypes = typeParameters
-        .map((parameter) => new TypeParameterType(parameter))
-        .toList();
-    var supertype =
-        extends_ != null ? extends_(typeParameterTypes) : objectSuper;
-    var implementedTypes =
-        implements_ != null ? implements_(typeParameterTypes) : <Supertype>[];
-    return addClass(new Class(
-        name: name,
-        typeParameters: typeParameters,
-        supertype: supertype,
-        implementedTypes: implementedTypes));
-  }
-
-  /// Add a new class with the given [name] that extends `Object` and
-  /// [implements_] the given classes.
-  Class addImplementsClass(String name, List<Class> implements_) {
-    return addClass(new Class(
-        name: name,
-        supertype: objectSuper,
-        implementedTypes: implements_.map((c) => c.asThisSupertype).toList()));
-  }
-
-  /// Copy of the tests/language/least_upper_bound_expansive_test.dart test.
-  void test_getLegacyLeastUpperBound_expansive() {
-    var int = coreTypes.intClass.rawType;
-    var string = coreTypes.stringClass.rawType;
-
-    // class N<T> {}
-    var NT = new TypeParameter('T', objectClass.rawType);
-    var N = addClass(
-        new Class(name: 'N', typeParameters: [NT], supertype: objectSuper));
-
-    // class C1<T> extends N<N<C1<T>>> {}
-    Class C1;
-    {
-      var T = new TypeParameter('T', objectClass.rawType);
-      C1 = addClass(
-          new Class(name: 'C1', typeParameters: [T], supertype: objectSuper));
-      DartType C1_T = Substitution.fromMap({T: new TypeParameterType(T)})
-          .substituteType(C1.thisType);
-      DartType N_C1_T =
-          Substitution.fromMap({NT: C1_T}).substituteType(N.thisType);
-      Supertype N_N_C1_T = Substitution.fromMap({NT: N_C1_T})
-          .substituteSupertype(N.asThisSupertype);
-      C1.supertype = N_N_C1_T;
-    }
-
-    // class C2<T> extends N<N<C2<N<C2<T>>>>> {}
-    Class C2;
-    {
-      var T = new TypeParameter('T', objectClass.rawType);
-      C2 = addClass(
-          new Class(name: 'C2', typeParameters: [T], supertype: objectSuper));
-      DartType C2_T = Substitution.fromMap({T: new TypeParameterType(T)})
-          .substituteType(C2.thisType);
-      DartType N_C2_T =
-          Substitution.fromMap({NT: C2_T}).substituteType(N.thisType);
-      DartType C2_N_C2_T =
-          Substitution.fromMap({T: N_C2_T}).substituteType(C2.thisType);
-      DartType N_C2_N_C2_T =
-          Substitution.fromMap({NT: C2_N_C2_T}).substituteType(N.thisType);
-      Supertype N_N_C2_N_C2_T = Substitution.fromMap({NT: N_C2_N_C2_T})
-          .substituteSupertype(N.asThisSupertype);
-      C2.supertype = N_N_C2_N_C2_T;
-    }
-
-    _assertTestLibraryText('''
-class N<T> {}
-class C1<T> extends self::N<self::N<self::C1<self::C1::T>>> {}
-class C2<T> extends self::N<self::N<self::C2<self::N<self::C2<self::C2::T>>>>> {}
-''');
-
-    // The least upper bound of C1<int> and N<C1<String>> is Object since the
-    // supertypes are
-    //     {C1<int>, N<N<C1<int>>>, Object} for C1<int> and
-    //     {N<C1<String>>, Object} for N<C1<String>> and
-    // Object is the most specific type in the intersection of the supertypes.
-    expect(
-        hierarchy.getLegacyLeastUpperBound(
-            new InterfaceType(C1, [int]),
-            new InterfaceType(N, [
-              new InterfaceType(C1, [string])
-            ])),
-        objectClass.thisType);
-
-    // The least upper bound of C2<int> and N<C2<String>> is Object since the
-    // supertypes are
-    //     {C2<int>, N<N<C2<N<C2<int>>>>>, Object} for C2<int> and
-    //     {N<C2<String>>, Object} for N<C2<String>> and
-    // Object is the most specific type in the intersection of the supertypes.
-    expect(
-        hierarchy.getLegacyLeastUpperBound(
-            new InterfaceType(C2, [int]),
-            new InterfaceType(N, [
-              new InterfaceType(C2, [string])
-            ])),
-        objectClass.thisType);
-  }
-
-  void test_getLegacyLeastUpperBound_generic() {
-    var int = coreTypes.intClass.rawType;
-    var double = coreTypes.doubleClass.rawType;
-    var bool = coreTypes.boolClass.rawType;
-
-    var a = addGenericClass('A', []);
-    var b =
-        addGenericClass('B', ['T'], implements_: (_) => [a.asThisSupertype]);
-    var c =
-        addGenericClass('C', ['U'], implements_: (_) => [a.asThisSupertype]);
-    var d = addGenericClass('D', ['T', 'U'], implements_: (typeParameterTypes) {
-      var t = typeParameterTypes[0];
-      var u = typeParameterTypes[1];
-      return [
-        new Supertype(b, [t]),
-        new Supertype(c, [u])
-      ];
-    });
-    var e = addGenericClass('E', [],
-        implements_: (_) => [
-              new Supertype(d, [int, double])
-            ]);
-    var f = addGenericClass('F', [],
-        implements_: (_) => [
-              new Supertype(d, [int, bool])
-            ]);
-
-    _assertTestLibraryText('''
-class A {}
-class B<T> implements self::A {}
-class C<U> implements self::A {}
-class D<T, U> implements self::B<self::D::T>, self::C<self::D::U> {}
-class E implements self::D<core::int, core::double> {}
-class F implements self::D<core::int, core::bool> {}
-''');
-
-    expect(
-        hierarchy.getLegacyLeastUpperBound(new InterfaceType(d, [int, double]),
-            new InterfaceType(d, [int, double])),
-        new InterfaceType(d, [int, double]));
-    expect(
-        hierarchy.getLegacyLeastUpperBound(new InterfaceType(d, [int, double]),
-            new InterfaceType(d, [int, bool])),
-        new InterfaceType(b, [int]));
-    expect(
-        hierarchy.getLegacyLeastUpperBound(new InterfaceType(d, [int, double]),
-            new InterfaceType(d, [bool, double])),
-        new InterfaceType(c, [double]));
-    expect(
-        hierarchy.getLegacyLeastUpperBound(new InterfaceType(d, [int, double]),
-            new InterfaceType(d, [bool, int])),
-        a.rawType);
-    expect(hierarchy.getLegacyLeastUpperBound(e.rawType, f.rawType),
-        new InterfaceType(b, [int]));
-  }
-
-  void test_getLegacyLeastUpperBound_nonGeneric() {
-    var a = addImplementsClass('A', []);
-    var b = addImplementsClass('B', []);
-    var c = addImplementsClass('C', [a]);
-    var d = addImplementsClass('D', [a]);
-    var e = addImplementsClass('E', [a]);
-    var f = addImplementsClass('F', [c, d]);
-    var g = addImplementsClass('G', [c, d]);
-    var h = addImplementsClass('H', [c, d, e]);
-    var i = addImplementsClass('I', [c, d, e]);
-
-    _assertTestLibraryText('''
-class A {}
-class B {}
-class C implements self::A {}
-class D implements self::A {}
-class E implements self::A {}
-class F implements self::C, self::D {}
-class G implements self::C, self::D {}
-class H implements self::C, self::D, self::E {}
-class I implements self::C, self::D, self::E {}
-''');
-
-    expect(hierarchy.getLegacyLeastUpperBound(a.rawType, b.rawType),
-        objectClass.rawType);
-    expect(hierarchy.getLegacyLeastUpperBound(a.rawType, objectClass.rawType),
-        objectClass.rawType);
-    expect(hierarchy.getLegacyLeastUpperBound(objectClass.rawType, b.rawType),
-        objectClass.rawType);
-    expect(hierarchy.getLegacyLeastUpperBound(c.rawType, d.rawType), a.rawType);
-    expect(hierarchy.getLegacyLeastUpperBound(c.rawType, a.rawType), a.rawType);
-    expect(hierarchy.getLegacyLeastUpperBound(a.rawType, d.rawType), a.rawType);
-    expect(hierarchy.getLegacyLeastUpperBound(f.rawType, g.rawType), a.rawType);
-    expect(hierarchy.getLegacyLeastUpperBound(h.rawType, i.rawType), a.rawType);
-  }
-}
diff --git a/pkg/front_end/test/fasta/types/mock_sdk.dart b/pkg/front_end/test/fasta/types/mock_sdk.dart
new file mode 100644
index 0000000..d4a937b
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/mock_sdk.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String mockSdk = """
+class Object;
+class Comparable<T>;
+class num implements Comparable<num>;
+class int extends num;
+class double extends num;
+class Iterable<T>;
+class List<T> extends Iterable<T>;
+class Future<T>;
+class FutureOr<T>;
+class Null;
+class Function;
+class String;
+class bool;
+""";
diff --git a/pkg/front_end/test/fasta/types/shared_type_tests.dart b/pkg/front_end/test/fasta/types/shared_type_tests.dart
index 38093c4..2911257 100644
--- a/pkg/front_end/test/fasta/types/shared_type_tests.dart
+++ b/pkg/front_end/test/fasta/types/shared_type_tests.dart
@@ -23,6 +23,8 @@
         "$subtypeString shouldn't be a subtype of $supertypeString.");
   }
 
+  bool get skipFutureOrPromotion => false;
+
   T toType(String text, E environment);
 
   bool isSubtypeImpl(T subtype, T supertype);
@@ -117,6 +119,42 @@
     isNotSubtype('FutureOr<int>', 'num');
     isSubtype('Null', 'FutureOr<int>');
     isSubtype('Null', 'Future<int>');
+    isSubtype('dynamic', 'FutureOr<dynamic>');
+    isNotSubtype('dynamic', 'FutureOr<String>');
+    isSubtype('void', 'FutureOr<void>');
+    isNotSubtype('void', 'FutureOr<String>');
+    isSubtype('E', 'FutureOr<E>', typeParameters: 'E');
+    isNotSubtype('E', 'FutureOr<String>', typeParameters: 'E');
+    isSubtype('() -> String', 'FutureOr<() -> void>');
+    isNotSubtype('() -> void', 'FutureOr<() -> String>');
+    isSubtype('FutureOr<int>', 'FutureOr<num>');
+    isNotSubtype('FutureOr<num>', 'FutureOr<int>');
+    isSubtype('T & int', 'FutureOr<num>', typeParameters: 'T');
+    isSubtype('T & Future<num>', 'FutureOr<num>', typeParameters: 'T');
+    isSubtype('T & Future<int>', 'FutureOr<num>', typeParameters: 'T');
+    if (!skipFutureOrPromotion) {
+      isSubtype('T & FutureOr<int>', 'FutureOr<num>', typeParameters: 'T');
+      isSubtype('T & FutureOr<num>', 'FutureOr<num>', typeParameters: 'T');
+      isSubtype('T & String', 'FutureOr<num>', typeParameters: 'T extends int');
+      isSubtype('T & Future<String>', 'FutureOr<num>',
+          typeParameters: 'T extends Future<num>');
+      isSubtype('T & FutureOr<String>', 'FutureOr<num>',
+          typeParameters: 'T extends FutureOr<int>');
+      isSubtype('T & FutureOr<String>', 'FutureOr<num>',
+          typeParameters: 'T extends FutureOr<num>');
+    }
+    isNotSubtype('T & num', 'FutureOr<int>', typeParameters: 'T');
+    isNotSubtype('T & Future<num>', 'FutureOr<int>', typeParameters: 'T');
+    isNotSubtype('T & FutureOr<num>', 'FutureOr<int>', typeParameters: 'T');
+    isNotSubtype('T & String', 'FutureOr<int>',
+        typeParameters: 'T extends num');
+    isNotSubtype('T & Future<String>', 'FutureOr<int>',
+        typeParameters: 'T extends Future<num>');
+    isNotSubtype('T & FutureOr<String>', 'FutureOr<int>',
+        typeParameters: 'T extends FutureOr<num>');
+    isSubtype('Id<int>', 'FutureOr<num>');
+    isNotSubtype('Id<num>', 'FutureOr<int>');
+    isSubtype('FutureOr<Object>', 'FutureOr<FutureOr<Object>>');
 
     // T & B <: T & A if B <: A
     isSubtype('T & int', 'T & int', typeParameters: 'T');
@@ -141,6 +179,21 @@
     // T extends A <: T extends A
     isSubtype('T', 'T', typeParameters: 'T extends num');
 
+    isSubtype('T', 'T', typeParameters: 'T');
+    isNotSubtype('S', 'T', typeParameters: 'S, T');
+
+    isSubtype('T', 'T', typeParameters: 'T extends Object');
+    isNotSubtype('S', 'T',
+        typeParameters: 'S extends Object, T extends Object');
+
+    isSubtype('T', 'T', typeParameters: 'T extends dynamic');
+    isNotSubtype('S', 'T',
+        typeParameters: 'S extends dynamic, T extends dynamic');
+
+    // S <: T extends S
+    isNotSubtype('S', 'T', typeParameters: 'S, T extends S');
+    isSubtype('T', 'S', typeParameters: 'S, T extends S');
+
     // S & B <: A if B <: A, A is not S (or a promotion thereof)
     isSubtype('S & int', 'int', typeParameters: 'S');
     isSubtype('S & int', 'num', typeParameters: 'S');
@@ -266,6 +319,18 @@
     isSubtype('T & (void) -> void', 'Id<(int) -> Object>', typeParameters: 'T');
 
     isNotSubtype('T & (void) -> void', 'Id<(int) -> int>', typeParameters: 'T');
+    isNotSubtype('dynamic', 'T & dynamic', typeParameters: 'T extends dynamic');
+    isNotSubtype('() -> T', 'T & () -> T', typeParameters: 'T');
+
+    isNotSubtype('FutureOr<T & String>', 'T & String', typeParameters: 'T');
+
+    isSubtype('Id<T & String>', 'T & String', typeParameters: 'T');
+    isSubtype('Id<T & String>', 'T', typeParameters: 'T');
+    isSubtype('Id<T & String>', 'String', typeParameters: 'T');
+    isNotSubtype('Id<T & String>', 'S & String', typeParameters: 'T, S');
+
+    isNotSubtype('void', 'T & void', typeParameters: 'T');
+    isNotSubtype('void', 'T & void', typeParameters: 'T extends void');
 
     isSubtype('T', 'Id<T>', typeParameters: 'T');
     isSubtype('T', 'Id<Object>', typeParameters: 'T');
diff --git a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
new file mode 100644
index 0000000..26d25da
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
@@ -0,0 +1,180 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:convert" show json, utf8;
+
+import "dart:io" show File, gzip;
+
+import "package:kernel/ast.dart" show Component, DartType, Library;
+
+import "package:kernel/class_hierarchy.dart" show ClassHierarchy;
+
+import "package:kernel/core_types.dart" show CoreTypes;
+
+import "package:kernel/target/targets.dart" show NoneTarget, TargetFlags;
+
+import "package:kernel/type_environment.dart" show TypeEnvironment;
+
+import "kernel_type_parser.dart"
+    show KernelEnvironment, KernelFromParsedType, parseLibrary;
+
+import "type_parser.dart" as type_parser show parse, parseTypeVariables;
+
+import "package:front_end/src/api_prototype/compiler_options.dart"
+    show CompilerOptions;
+
+import "package:front_end/src/base/processed_options.dart"
+    show ProcessedOptions;
+
+import "package:front_end/src/fasta/compiler_context.dart" show CompilerContext;
+
+import "package:front_end/src/fasta/dill/dill_loader.dart" show DillLoader;
+
+import "package:front_end/src/fasta/dill/dill_target.dart" show DillTarget;
+
+import "package:front_end/src/fasta/kernel/kernel_builder.dart"
+    show ClassHierarchyBuilder, KernelClassBuilder;
+
+import "package:front_end/src/fasta/ticker.dart" show Ticker;
+
+class SubtypesBenchmark {
+  final Library library;
+  final List<SubtypeCheck> checks;
+
+  SubtypesBenchmark(this.library, this.checks);
+}
+
+class SubtypeCheck {
+  final DartType s;
+  final DartType t;
+  final bool isSubtype;
+
+  SubtypeCheck(this.s, this.t, this.isSubtype);
+
+  String toString() {
+    return (new StringBuffer()
+          ..write(s)
+          ..write(isSubtype ? " <: " : " !<: ")
+          ..write(t))
+        .toString();
+  }
+}
+
+SubtypesBenchmark parseBenchMark(String source) {
+  Map<Object, Object> data = json.decode(source);
+  List<Object> classes = data["classes"];
+  Uri uri = Uri.parse("dart:core");
+  KernelEnvironment environment = new KernelEnvironment(uri, uri);
+  Library library =
+      parseLibrary(uri, classes.join("\n"), environment: environment);
+  List<Object> checks = data["checks"];
+  List<SubtypeCheck> subtypeChecks = <SubtypeCheck>[];
+  for (Map<Object, Object> check in checks) {
+    String kind = check["kind"];
+    List<Object> arguments = check["arguments"];
+    String sSource = arguments[0];
+    String tSource = arguments[1];
+    if (sSource.contains("?")) continue;
+    if (tSource.contains("?")) continue;
+    if (sSource.contains("⊥")) continue;
+    if (tSource.contains("⊥")) continue;
+    KernelEnvironment localEnvironment = environment;
+    if (arguments.length > 2) {
+      List<Object> typeParametersSource = arguments[2];
+      localEnvironment = const KernelFromParsedType()
+          .computeTypeParameterEnvironment(
+              type_parser
+                  .parseTypeVariables("<${typeParametersSource.join(', ')}>"),
+              environment)
+          .environment;
+    }
+    DartType s = localEnvironment
+        .kernelFromParsedType(type_parser.parse(sSource).single);
+    DartType t = localEnvironment
+        .kernelFromParsedType(type_parser.parse(tSource).single);
+    subtypeChecks.add(new SubtypeCheck(s, t, kind == "isSubtype"));
+  }
+  return new SubtypesBenchmark(library, subtypeChecks);
+}
+
+void performChecks(List<SubtypeCheck> checks, TypeEnvironment environment) {
+  for (int i = 0; i < checks.length; i++) {
+    SubtypeCheck check = checks[i];
+    bool isSubtype = environment.isSubtypeOf(check.s, check.t);
+    if (isSubtype != check.isSubtype) {
+      throw "Check failed: $check";
+    }
+  }
+}
+
+void performFastaChecks(
+    List<SubtypeCheck> checks, ClassHierarchyBuilder hierarchy) {
+  for (int i = 0; i < checks.length; i++) {
+    SubtypeCheck check = checks[i];
+    bool isSubtype = hierarchy.types.isSubtypeOfKernel(check.s, check.t);
+    if (isSubtype != check.isSubtype) {
+      throw "Check failed: $check";
+    }
+  }
+}
+
+Future<void> run(Uri benchmarkInput, String name) async {
+  const int runs = 50;
+  final Ticker ticker = new Ticker(isVerbose: false);
+  Stopwatch kernelWatch = new Stopwatch();
+  Stopwatch fastaWatch = new Stopwatch();
+  List<int> bytes = await new File.fromUri(benchmarkInput).readAsBytes();
+  if (bytes.length > 3) {
+    if (bytes[0] == 0x1f && bytes[1] == 0x8b && bytes[2] == 0x08) {
+      bytes = gzip.decode(bytes);
+    }
+  }
+  SubtypesBenchmark bench = parseBenchMark(utf8.decode(bytes));
+  bytes = null;
+  ticker.logMs("Parsed benchmark file");
+  Component c = new Component(libraries: [bench.library]);
+  ClassHierarchy hierarchy = new ClassHierarchy(c);
+  CoreTypes coreTypes = new CoreTypes(c);
+  TypeEnvironment environment = new TypeEnvironment(coreTypes, hierarchy);
+
+  final CompilerContext context = new CompilerContext(new ProcessedOptions(
+      options: new CompilerOptions()
+        ..packagesFileUri = Uri.base.resolve(".packages")));
+  await context.runInContext<void>((_) async {
+    DillTarget target = new DillTarget(
+        ticker,
+        await context.options.getUriTranslator(),
+        new NoneTarget(new TargetFlags()));
+    final DillLoader loader = target.loader;
+    loader.appendLibraries(c);
+    await target.buildOutlines();
+    KernelClassBuilder objectClass = loader.coreLibrary["Object"];
+    ClassHierarchyBuilder hierarchy =
+        new ClassHierarchyBuilder(objectClass, loader, coreTypes);
+
+    for (int i = 0; i < runs; i++) {
+      kernelWatch.start();
+      performChecks(bench.checks, environment);
+      kernelWatch.stop();
+
+      fastaWatch.start();
+      performFastaChecks(bench.checks, hierarchy);
+      fastaWatch.stop();
+
+      if (i == 0) {
+        print("SubtypeKernel${name}First(RuntimeRaw): "
+            "${kernelWatch.elapsedMilliseconds} ms");
+        print("SubtypeFasta${name}First(RuntimeRaw): "
+            "${fastaWatch.elapsedMilliseconds} ms");
+      }
+    }
+  });
+
+  print("SubtypeKernel${name}Avg${runs}(RuntimeRaw): "
+      "${kernelWatch.elapsedMilliseconds / runs} ms");
+  print("SubtypeFasta${name}Avg${runs}(RuntimeRaw): "
+      "${fastaWatch.elapsedMilliseconds / runs} ms");
+}
+
+main() => run(Uri.base.resolve("type_checks.json"), "***");
diff --git a/pkg/front_end/test/fasta/types/type_parser.dart b/pkg/front_end/test/fasta/types/type_parser.dart
index 1e72c17..89a21b7 100644
--- a/pkg/front_end/test/fasta/types/type_parser.dart
+++ b/pkg/front_end/test/fasta/types/type_parser.dart
@@ -43,11 +43,12 @@
 class ParsedClass extends ParsedDeclaration {
   final List<ParsedTypeVariable> typeVariables;
   final ParsedInterfaceType supertype;
+  final ParsedInterfaceType mixedInType;
   final List<ParsedType> interfaces;
   final ParsedFunctionType callableType;
 
-  ParsedClass(String name, this.typeVariables, this.supertype, this.interfaces,
-      this.callableType)
+  ParsedClass(String name, this.typeVariables, this.supertype, this.mixedInType,
+      this.interfaces, this.callableType)
       : super(name);
 
   String toString() {
@@ -372,8 +373,12 @@
     String name = parseName();
     List<ParsedTypeVariable> typeVariables = parseTypeVariablesOpt();
     ParsedType supertype;
+    ParsedType mixedInType;
     if (optionalAdvance("extends")) {
       supertype = parseType();
+      if (optionalAdvance("with")) {
+        mixedInType = parseType();
+      }
     }
     List<ParsedType> interfaces = <ParsedType>[];
     if (optionalAdvance("implements")) {
@@ -389,7 +394,7 @@
       expect(";");
     }
     return new ParsedClass(
-        name, typeVariables, supertype, interfaces, callableType);
+        name, typeVariables, supertype, mixedInType, interfaces, callableType);
   }
 
   /// This parses a general typedef on this form:
diff --git a/pkg/front_end/test/incremental_bulk_compiler_full.dart b/pkg/front_end/test/incremental_bulk_compiler_full.dart
index a52ac90..c39739d 100644
--- a/pkg/front_end/test/incremental_bulk_compiler_full.dart
+++ b/pkg/front_end/test/incremental_bulk_compiler_full.dart
@@ -56,6 +56,7 @@
   var options = new CompilerOptions()
     ..sdkRoot = sdkRoot
     ..librariesSpecificationUri = Uri.base.resolve("sdk/lib/libraries.json")
+    ..omitPlatform = true
     ..onDiagnostic = (DiagnosticMessage message) {
       // Ignored.
     }
@@ -98,7 +99,7 @@
             new IncrementalKernelGenerator(getOptions(true), uri);
       }
       Component bulkCompiledComponent = await context.compiler
-          .computeDelta(entryPoint: uri, fullComponent: true);
+          .computeDelta(entryPoints: [uri], fullComponent: true);
       bulkSerialized = util.postProcess(bulkCompiledComponent);
     } catch (e) {
       bulkFailed = true;
@@ -114,7 +115,7 @@
             new IncrementalKernelGenerator(getOptions(true), uri);
       }
       Component bulkCompiledComponent = await context.compiler
-          .computeDelta(entryPoint: uri, fullComponent: true);
+          .computeDelta(entryPoints: [uri], fullComponent: true);
       bulkSerialized2 = util.postProcess(bulkCompiledComponent);
     } catch (e) {
       bulk2Failed = true;
diff --git a/pkg/front_end/test/incremental_load_from_dill_test.dart b/pkg/front_end/test/incremental_load_from_dill_test.dart
index 682f362..d20b5c7 100644
--- a/pkg/front_end/test/incremental_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_test.dart
@@ -111,6 +111,7 @@
         await newWorldTest(
           map["strong"],
           map["worlds"],
+          map["omitPlatform"],
         );
         break;
       default:
@@ -179,7 +180,7 @@
   checkIsEqual(normalDillData, initializedDillData);
 }
 
-Future<Null> newWorldTest(bool strong, List worlds) async {
+Future<Null> newWorldTest(bool strong, List worlds, bool omitPlatform) async {
   final Uri sdkRoot = computePlatformBinariesLocation(forceBuildDir: true);
   final Uri base = Uri.parse("org-dartlang-test:///");
   final Uri sdkSummary = base.resolve("vm_platform.dill");
@@ -204,6 +205,10 @@
     if (world["worldType"] == "updated") {
       brandNewWorld = false;
     }
+    bool noFullComponent = false;
+    if (world["noFullComponent"] == true) {
+      noFullComponent = true;
+    }
 
     if (brandNewWorld) {
       fs = new MemoryFileSystem(base);
@@ -235,15 +240,19 @@
       }
       fs.entityForUri(uri).writeAsStringSync(data);
     }
+    if (world["dotPackagesFile"] != null) {
+      packagesUri = base.resolve(world["dotPackagesFile"]);
+    }
 
     if (brandNewWorld) {
       options = getOptions(strong);
       options.fileSystem = fs;
       options.sdkRoot = null;
       options.sdkSummary = sdkSummary;
-      if (packagesUri != null) {
-        options.packagesFileUri = packagesUri;
-      }
+      options.omitPlatform = omitPlatform != false;
+    }
+    if (packagesUri != null) {
+      options.packagesFileUri = packagesUri;
     }
     bool gotError = false;
     final Set<String> formattedErrors = Set<String>();
@@ -270,13 +279,23 @@
       }
     };
 
-    Uri entry = base.resolve(world["entry"]);
+    List<Uri> entries;
+    if (world["entry"] is String) {
+      entries = [base.resolve(world["entry"])];
+    } else {
+      entries = new List<Uri>();
+      List<dynamic> entryList = world["entry"];
+      for (String entry in entryList) {
+        entries.add(base.resolve(entry));
+      }
+    }
     if (brandNewWorld) {
       if (world["fromComponent"] == true) {
         compiler = new TestIncrementalCompiler.fromComponent(
-            options, entry, newestWholeComponent);
+            options, entries.first, newestWholeComponent);
       } else {
-        compiler = new TestIncrementalCompiler(options, entry, initializeFrom);
+        compiler =
+            new TestIncrementalCompiler(options, entries.first, initializeFrom);
       }
     }
 
@@ -291,20 +310,40 @@
 
     Stopwatch stopwatch = new Stopwatch()..start();
     Component component = await compiler.computeDelta(
-        fullComponent: brandNewWorld ? false : true);
+        entryPoints: entries,
+        fullComponent:
+            brandNewWorld ? false : (noFullComponent ? false : true));
     performErrorAndWarningCheck(
         world, gotError, formattedErrors, gotWarning, formattedWarnings);
     util.throwOnEmptyMixinBodies(component);
     print("Compile took ${stopwatch.elapsedMilliseconds} ms");
     newestWholeComponentData = util.postProcess(component);
     newestWholeComponent = component;
-    print("*****\n\ncomponent:\n${componentToString(component)}\n\n\n");
+    print("*****\n\ncomponent:\n"
+        "${componentToStringSdkFiltered(component)}\n\n\n");
 
     int nonSyntheticLibraries = countNonSyntheticLibraries(component);
+    int nonSyntheticPlatformLibraries =
+        countNonSyntheticPlatformLibraries(component);
     int syntheticLibraries = countSyntheticLibraries(component);
-    if (nonSyntheticLibraries != world["expectedLibraryCount"]) {
-      throw "Expected ${world["expectedLibraryCount"]} non-synthetic "
-          "libraries, got ${nonSyntheticLibraries}";
+    if (world["expectsPlatform"] == true) {
+      if (nonSyntheticPlatformLibraries < 5)
+        throw "Expected to have at least 5 platform libraries "
+            "(actually, the entire sdk), "
+            "but got $nonSyntheticPlatformLibraries.";
+    } else {
+      if (nonSyntheticPlatformLibraries != 0)
+        throw "Expected to have 0 platform libraries "
+            "but got $nonSyntheticPlatformLibraries.";
+    }
+    if (world["expectedLibraryCount"] != null) {
+      if (nonSyntheticLibraries - nonSyntheticPlatformLibraries !=
+          world["expectedLibraryCount"]) {
+        throw "Expected ${world["expectedLibraryCount"]} non-synthetic "
+            "libraries, got "
+            "${nonSyntheticLibraries - nonSyntheticPlatformLibraries} "
+            "(not counting platform libraries)";
+      }
     }
     if (world["expectedSyntheticLibraryCount"] != null) {
       if (syntheticLibraries != world["expectedSyntheticLibraryCount"]) {
@@ -312,12 +351,15 @@
             "libraries, got ${syntheticLibraries}";
       }
     }
-    List<Library> entryLib = component.libraries
-        .where((Library lib) => lib.importUri == entry || lib.fileUri == entry)
-        .toList();
-    if (entryLib.length != 1) {
-      throw "Expected the entry to become a library. Got ${entryLib.length} "
-          "libraries for it.";
+    if (!noFullComponent) {
+      List<Library> entryLib = component.libraries
+          .where((Library lib) =>
+              entries.contains(lib.importUri) || entries.contains(lib.fileUri))
+          .toList();
+      if (entryLib.length != entries.length) {
+        throw "Expected the entries to become libraries. Got ${entryLib.length} "
+            "libraries for the expected ${entries.length} entries.";
+      }
     }
     if (compiler.initializedFromDill != expectInitializeFromDill) {
       throw "Expected that initializedFromDill would be "
@@ -340,18 +382,20 @@
       }
     }
 
-    {
+    if (!noFullComponent) {
       Set<String> prevFormattedErrors = formattedErrors.toSet();
       Set<String> prevFormattedWarnings = formattedWarnings.toSet();
       gotError = false;
       formattedErrors.clear();
       gotWarning = false;
       formattedWarnings.clear();
-      Component component2 = await compiler.computeDelta(fullComponent: true);
+      Component component2 = await compiler.computeDelta(
+          entryPoints: entries, fullComponent: true);
       performErrorAndWarningCheck(
           world, gotError, formattedErrors, gotWarning, formattedWarnings);
       List<int> thisWholeComponent = util.postProcess(component2);
-      print("*****\n\ncomponent2:\n${componentToString(component2)}\n\n\n");
+      print("*****\n\ncomponent2:\n"
+          "${componentToStringSdkFiltered(component2)}\n\n\n");
       checkIsEqual(newestWholeComponentData, thisWholeComponent);
       if (prevFormattedErrors.length != formattedErrors.length) {
         Expect.fail("Previously had ${prevFormattedErrors.length} errors, "
@@ -380,6 +424,31 @@
   }
 }
 
+String componentToStringSdkFiltered(Component node) {
+  Component c = new Component();
+  List<Uri> dartUris = new List<Uri>();
+  for (Library lib in node.libraries) {
+    if (lib.importUri.scheme == "dart") {
+      dartUris.add(lib.importUri);
+    } else {
+      c.libraries.add(lib);
+    }
+  }
+
+  StringBuffer s = new StringBuffer();
+  s.write(componentToString(c));
+
+  if (dartUris.isNotEmpty) {
+    s.writeln("");
+    s.writeln("And ${dartUris.length} platform libraries:");
+    for (Uri uri in dartUris) {
+      s.writeln(" - $uri");
+    }
+  }
+
+  return s.toString();
+}
+
 int countNonSyntheticLibraries(Component c) {
   int result = 0;
   for (Library lib in c.libraries) {
@@ -388,6 +457,14 @@
   return result;
 }
 
+int countNonSyntheticPlatformLibraries(Component c) {
+  int result = 0;
+  for (Library lib in c.libraries) {
+    if (!lib.isSynthetic && lib.importUri.scheme == "dart") result++;
+  }
+  return result;
+}
+
 int countSyntheticLibraries(Component c) {
   int result = 0;
   for (Library lib in c.libraries) {
@@ -433,6 +510,7 @@
     ..sdkRoot = sdkRoot
     ..target = new VmTarget(new TargetFlags(legacyMode: !strong))
     ..librariesSpecificationUri = Uri.base.resolve("sdk/lib/libraries.json")
+    ..omitPlatform = true
     ..onDiagnostic = (DiagnosticMessage message) {
       if (message.severity == Severity.error ||
           message.severity == Severity.warning) {
@@ -571,9 +649,9 @@
 
   @override
   Future<Component> computeDelta(
-      {Uri entryPoint, bool fullComponent = false}) async {
+      {List<Uri> entryPoints, bool fullComponent = false}) async {
     Component result = await super
-        .computeDelta(entryPoint: entryPoint, fullComponent: fullComponent);
+        .computeDelta(entryPoints: entryPoints, fullComponent: fullComponent);
 
     // We should at least have the SDK builders available. Slight smoke test.
     if (!dillLoadedData.loader.builders.keys
diff --git a/pkg/front_end/test/incremental_utils.dart b/pkg/front_end/test/incremental_utils.dart
index ef4626a..7cb1c0d 100644
--- a/pkg/front_end/test/incremental_utils.dart
+++ b/pkg/front_end/test/incremental_utils.dart
@@ -12,11 +12,14 @@
     return "${l1.fileUri}".compareTo("${l2.fileUri}");
   });
 
+  c.problemsAsJson?.sort();
+
   c.computeCanonicalNames();
   for (Library library in c.libraries) {
     library.additionalExports.sort((Reference r1, Reference r2) {
       return "${r1.canonicalName}".compareTo("${r2.canonicalName}");
     });
+    library.problemsAsJson?.sort();
   }
 
   return serializeComponent(c);
diff --git a/pkg/front_end/tool/_fasta/resolve_input_uri_test.dart b/pkg/front_end/test/resolve_input_uri_test.dart
similarity index 95%
rename from pkg/front_end/tool/_fasta/resolve_input_uri_test.dart
rename to pkg/front_end/test/resolve_input_uri_test.dart
index e520fec..1084424 100644
--- a/pkg/front_end/tool/_fasta/resolve_input_uri_test.dart
+++ b/pkg/front_end/test/resolve_input_uri_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:expect/expect.dart' show Expect;
 
-import 'resolve_input_uri.dart';
+import 'package:front_end/src/fasta/resolve_input_uri.dart';
 
 test() {
   // data URI scheme is supported by default'.
diff --git a/pkg/front_end/test/type_labeler_test.dart b/pkg/front_end/test/type_labeler_test.dart
index f24c86d..d303273 100644
--- a/pkg/front_end/test/type_labeler_test.dart
+++ b/pkg/front_end/test/type_labeler_test.dart
@@ -230,6 +230,12 @@
   Constant listBoolConst = new ListConstant(boolType, [falseConst, trueConst]);
   check({listBoolConst: "<bool>[false, true]"}, 0);
 
+  Constant setConst = new SetConstant(dynamicType, [intConst, doubleConst]);
+  check({setConst: "<dynamic>{2, 2.5}"}, 0);
+
+  Constant setBoolConst = new SetConstant(boolType, [falseConst, trueConst]);
+  check({setBoolConst: "<bool>{false, true}"}, 0);
+
   Constant mapConst = new MapConstant(boolType, numType, [
     new ConstantMapEntry(trueConst, intConst),
     new ConstantMapEntry(falseConst, doubleConst)
diff --git a/pkg/front_end/testcases/abstract_members.dart.hierarchy.expect b/pkg/front_end/testcases/abstract_members.dart.hierarchy.expect
index dad4f9b..231e9e1 100644
--- a/pkg/front_end/testcases/abstract_members.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/abstract_members.dart.hierarchy.expect
@@ -75,6 +75,7 @@
   classSetters:
 
 A:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Interface1, Interface2, Interface3
@@ -118,6 +119,7 @@
     A.property2
 
 B:
+  Longest path to Object: 3
   superclasses:
     Object
       -> A
@@ -166,6 +168,7 @@
     A.property2
 
 MyClass:
+  Longest path to Object: 4
   superclasses:
     Object
       -> A
@@ -221,6 +224,7 @@
     MyClass.property2
 
 MyMock1:
+  Longest path to Object: 4
   superclasses:
     Object
       -> A
@@ -270,6 +274,7 @@
     A.property2
 
 MyMock2:
+  Longest path to Object: 5
   superclasses:
     Object
       -> A
@@ -320,6 +325,7 @@
     A.property2
 
 MyMock3:
+  Longest path to Object: 4
   superclasses:
     Object
       -> A
diff --git a/pkg/front_end/testcases/bug32426.dart.hierarchy.expect b/pkg/front_end/testcases/bug32426.dart.hierarchy.expect
index 9e96032..b816c89 100644
--- a/pkg/front_end/testcases/bug32426.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/bug32426.dart.hierarchy.expect
@@ -37,6 +37,7 @@
   classSetters:
 
 C:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I
diff --git a/pkg/front_end/testcases/bug32866.dart.hierarchy.expect b/pkg/front_end/testcases/bug32866.dart.hierarchy.expect
index 74b5528..ec9f23e 100644
--- a/pkg/front_end/testcases/bug32866.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/bug32866.dart.hierarchy.expect
@@ -37,6 +37,7 @@
   classSetters:
 
 A:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: B
diff --git a/pkg/front_end/testcases/bug33099.dart.hierarchy.expect b/pkg/front_end/testcases/bug33099.dart.hierarchy.expect
index 883d29c..443af04 100644
--- a/pkg/front_end/testcases/bug33099.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/bug33099.dart.hierarchy.expect
@@ -54,6 +54,7 @@
   classSetters:
 
 Object with MyTest:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: MyTest
@@ -85,6 +86,7 @@
   interfaceSetters:
 
 MyTest2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _MyTest2&Object&MyTest
diff --git a/pkg/front_end/testcases/bug34511.dart.hierarchy.expect b/pkg/front_end/testcases/bug34511.dart.hierarchy.expect
index 60cd20b..57d451c 100644
--- a/pkg/front_end/testcases/bug34511.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/bug34511.dart.hierarchy.expect
@@ -36,6 +36,7 @@
   classSetters:
 
 Object with A<() -> Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A<() -> Z>
@@ -65,6 +66,7 @@
   interfaceSetters:
 
 B:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _B&Object&A<Z>
diff --git a/pkg/front_end/testcases/clone_function_type.dart.hierarchy.expect b/pkg/front_end/testcases/clone_function_type.dart.hierarchy.expect
index aa9301e..49f41ab 100644
--- a/pkg/front_end/testcases/clone_function_type.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/clone_function_type.dart.hierarchy.expect
@@ -36,6 +36,7 @@
   classSetters:
 
 Object with Am1<(null) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<(null) -> null, Z>
@@ -65,6 +66,7 @@
   interfaceSetters:
 
 Bm1:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Bm1&Object&Am1<Z>
@@ -95,6 +97,7 @@
   interfaceSetters:
 
 Object with Am1<(x) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<(x) -> null, Z>
@@ -124,6 +127,7 @@
   interfaceSetters:
 
 Cm1:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Cm1&Object&Am1<Z>
@@ -154,6 +158,7 @@
   interfaceSetters:
 
 Object with Am1<() -> int, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<() -> int, Z>
@@ -183,6 +188,7 @@
   interfaceSetters:
 
 Dm1:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Dm1&Object&Am1<Z>
@@ -213,6 +219,7 @@
   interfaceSetters:
 
 Object with Am1<() -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<() -> null, Z>
@@ -242,6 +249,7 @@
   interfaceSetters:
 
 Em1:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Em1&Object&Am1<Z>
@@ -272,6 +280,7 @@
   interfaceSetters:
 
 Object with Am1<() -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<() -> null, Z>
@@ -301,6 +310,7 @@
   interfaceSetters:
 
 Fm1:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Fm1&Object&Am1<Z>
@@ -331,6 +341,7 @@
   interfaceSetters:
 
 Object with Am1<(x) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<(x) -> null, Z>
@@ -360,6 +371,7 @@
   interfaceSetters:
 
 Gm1:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Gm1&Object&Am1<Z>
@@ -390,6 +402,7 @@
   interfaceSetters:
 
 Object with Am1<(null) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<(null) -> null, Z>
@@ -419,6 +432,7 @@
   interfaceSetters:
 
 Hm1:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Hm1&Object&Am1<Z>
@@ -449,6 +463,7 @@
   interfaceSetters:
 
 Object with Am1<(x) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<(x) -> null, Z>
@@ -478,6 +493,7 @@
   interfaceSetters:
 
 Im1:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Im1&Object&Am1<Z>
@@ -508,6 +524,7 @@
   interfaceSetters:
 
 Object with Am1<Function, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<Function, Z>
@@ -537,6 +554,7 @@
   interfaceSetters:
 
 Jm1:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Jm1&Object&Am1<Z>
@@ -567,6 +585,7 @@
   interfaceSetters:
 
 Object with Am1<(Function) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<(Function) -> null, Z>
@@ -596,6 +615,7 @@
   interfaceSetters:
 
 Km1:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Km1&Object&Am1<Z>
@@ -626,6 +646,7 @@
   interfaceSetters:
 
 Object with Am1<() -> (Function) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<() -> (Function) -> null, Z>
@@ -655,6 +676,7 @@
   interfaceSetters:
 
 Lm1:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Lm1&Object&Am1<Z>
@@ -685,6 +707,7 @@
   interfaceSetters:
 
 Mm1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<(null) -> null, Z>
@@ -714,6 +737,7 @@
   interfaceSetters:
 
 Nm1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<(x) -> null, Z>
@@ -743,6 +767,7 @@
   interfaceSetters:
 
 Om1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<() -> int, Z>
@@ -772,6 +797,7 @@
   interfaceSetters:
 
 Pm1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<() -> null, Z>
@@ -801,6 +827,7 @@
   interfaceSetters:
 
 Qm1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<() -> null, Z>
@@ -830,6 +857,7 @@
   interfaceSetters:
 
 Rm1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<(x) -> null, Z>
@@ -859,6 +887,7 @@
   interfaceSetters:
 
 Sm1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<(null) -> null, Z>
@@ -888,6 +917,7 @@
   interfaceSetters:
 
 Tm1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<(x) -> null, Z>
@@ -917,6 +947,7 @@
   interfaceSetters:
 
 Um1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<Function, Z>
@@ -946,6 +977,7 @@
   interfaceSetters:
 
 Vm1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<(Function) -> null, Z>
@@ -975,6 +1007,7 @@
   interfaceSetters:
 
 Wm1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am1<() -> (Function) -> null, Z>
@@ -1021,6 +1054,7 @@
   classSetters:
 
 Object with Am2<(null) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<(null) -> null, Z>
@@ -1050,6 +1084,7 @@
   interfaceSetters:
 
 Bm2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Bm2&Object&Am2<Z>
@@ -1080,6 +1115,7 @@
   interfaceSetters:
 
 Object with Am2<(x) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<(x) -> null, Z>
@@ -1109,6 +1145,7 @@
   interfaceSetters:
 
 Cm2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Cm2&Object&Am2<Z>
@@ -1139,6 +1176,7 @@
   interfaceSetters:
 
 Object with Am2<() -> int, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<() -> int, Z>
@@ -1168,6 +1206,7 @@
   interfaceSetters:
 
 Dm2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Dm2&Object&Am2<Z>
@@ -1198,6 +1237,7 @@
   interfaceSetters:
 
 Object with Am2<() -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<() -> null, Z>
@@ -1227,6 +1267,7 @@
   interfaceSetters:
 
 Em2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Em2&Object&Am2<Z>
@@ -1257,6 +1298,7 @@
   interfaceSetters:
 
 Object with Am2<() -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<() -> null, Z>
@@ -1286,6 +1328,7 @@
   interfaceSetters:
 
 Fm2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Fm2&Object&Am2<Z>
@@ -1316,6 +1359,7 @@
   interfaceSetters:
 
 Object with Am2<(x) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<(x) -> null, Z>
@@ -1345,6 +1389,7 @@
   interfaceSetters:
 
 Gm2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Gm2&Object&Am2<Z>
@@ -1375,6 +1420,7 @@
   interfaceSetters:
 
 Object with Am2<(null) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<(null) -> null, Z>
@@ -1404,6 +1450,7 @@
   interfaceSetters:
 
 Hm2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Hm2&Object&Am2<Z>
@@ -1434,6 +1481,7 @@
   interfaceSetters:
 
 Object with Am2<(x) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<(x) -> null, Z>
@@ -1463,6 +1511,7 @@
   interfaceSetters:
 
 Im2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Im2&Object&Am2<Z>
@@ -1493,6 +1542,7 @@
   interfaceSetters:
 
 Object with Am2<Function, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<Function, Z>
@@ -1522,6 +1572,7 @@
   interfaceSetters:
 
 Jm2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Jm2&Object&Am2<Z>
@@ -1552,6 +1603,7 @@
   interfaceSetters:
 
 Object with Am2<(Function) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<(Function) -> null, Z>
@@ -1581,6 +1633,7 @@
   interfaceSetters:
 
 Km2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Km2&Object&Am2<Z>
@@ -1611,6 +1664,7 @@
   interfaceSetters:
 
 Object with Am2<() -> (Function) -> null, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<() -> (Function) -> null, Z>
@@ -1640,6 +1694,7 @@
   interfaceSetters:
 
 Lm2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Lm2&Object&Am2<Z>
@@ -1670,6 +1725,7 @@
   interfaceSetters:
 
 Mm2:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<(null) -> null, Z>
@@ -1699,6 +1755,7 @@
   interfaceSetters:
 
 Nm2:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<(x) -> null, Z>
@@ -1728,6 +1785,7 @@
   interfaceSetters:
 
 Om2:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<() -> int, Z>
@@ -1757,6 +1815,7 @@
   interfaceSetters:
 
 Pm2:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<() -> null, Z>
@@ -1786,6 +1845,7 @@
   interfaceSetters:
 
 Qm2:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<() -> null, Z>
@@ -1815,6 +1875,7 @@
   interfaceSetters:
 
 Rm2:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<(x) -> null, Z>
@@ -1844,6 +1905,7 @@
   interfaceSetters:
 
 Sm2:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<(null) -> null, Z>
@@ -1873,6 +1935,7 @@
   interfaceSetters:
 
 Tm2:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<(x) -> null, Z>
@@ -1902,6 +1965,7 @@
   interfaceSetters:
 
 Um2:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<Function, Z>
@@ -1931,6 +1995,7 @@
   interfaceSetters:
 
 Vm2:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<(Function) -> null, Z>
@@ -1960,6 +2025,7 @@
   interfaceSetters:
 
 Wm2:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am2<() -> (Function) -> null, Z>
@@ -2006,6 +2072,7 @@
   classSetters:
 
 Object with Am3<TdB, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am3<TdB, Z>
@@ -2035,6 +2102,7 @@
   interfaceSetters:
 
 Bm3:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Bm3&Object&Am3<Z>
@@ -2065,6 +2133,7 @@
   interfaceSetters:
 
 Object with Am3<TdC, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am3<TdC, Z>
@@ -2094,6 +2163,7 @@
   interfaceSetters:
 
 Cm3:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Cm3&Object&Am3<Z>
@@ -2124,6 +2194,7 @@
   interfaceSetters:
 
 Object with Am3<TdD, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am3<TdD, Z>
@@ -2153,6 +2224,7 @@
   interfaceSetters:
 
 Dm3:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Dm3&Object&Am3<Z>
@@ -2183,6 +2255,7 @@
   interfaceSetters:
 
 Object with Am3<TdE, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am3<TdE, Z>
@@ -2212,6 +2285,7 @@
   interfaceSetters:
 
 Em3:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Em3&Object&Am3<Z>
@@ -2242,6 +2316,7 @@
   interfaceSetters:
 
 Object with Am3<TdF, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am3<TdF, Z>
@@ -2271,6 +2346,7 @@
   interfaceSetters:
 
 Fm3:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Fm3&Object&Am3<Z>
@@ -2301,6 +2377,7 @@
   interfaceSetters:
 
 Object with Am3<TdG, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am3<TdG, Z>
@@ -2330,6 +2407,7 @@
   interfaceSetters:
 
 Gm3:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Gm3&Object&Am3<Z>
@@ -2360,6 +2438,7 @@
   interfaceSetters:
 
 Object with Am3<TdH, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am3<TdH, Z>
@@ -2389,6 +2468,7 @@
   interfaceSetters:
 
 Hm3:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Hm3&Object&Am3<Z>
@@ -2419,6 +2499,7 @@
   interfaceSetters:
 
 Object with Am3<TdI, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am3<TdI, Z>
@@ -2448,6 +2529,7 @@
   interfaceSetters:
 
 Im3:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Im3&Object&Am3<Z>
@@ -2478,6 +2560,7 @@
   interfaceSetters:
 
 Object with Am3<TdJ, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am3<TdJ, Z>
@@ -2507,6 +2590,7 @@
   interfaceSetters:
 
 Jm3:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Jm3&Object&Am3<Z>
@@ -2537,6 +2621,7 @@
   interfaceSetters:
 
 Object with Am3<TdK, Z>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Am3<TdK, Z>
@@ -2566,6 +2651,7 @@
   interfaceSetters:
 
 Km3:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Km3&Object&Am3<Z>
diff --git a/pkg/front_end/testcases/complex_class_hierarchy.dart b/pkg/front_end/testcases/complex_class_hierarchy.dart
index 86dba1e..3363794 100644
--- a/pkg/front_end/testcases/complex_class_hierarchy.dart
+++ b/pkg/front_end/testcases/complex_class_hierarchy.dart
@@ -39,3 +39,9 @@
 class GU extends GW {}
 
 class GV extends GU implements GW {}
+
+class ARO<S> {}
+
+class ARQ<T> extends Object implements ARO<T> {}
+
+class ARN extends ARQ<A> {}
diff --git a/pkg/front_end/testcases/complex_class_hierarchy.dart.hierarchy.expect b/pkg/front_end/testcases/complex_class_hierarchy.dart.hierarchy.expect
index b3c7b13..1ad7539 100644
--- a/pkg/front_end/testcases/complex_class_hierarchy.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/complex_class_hierarchy.dart.hierarchy.expect
@@ -164,6 +164,7 @@
   classSetters:
 
 X:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A
@@ -193,6 +194,7 @@
   interfaceSetters:
 
 Y:
+  Longest path to Object: 3
   superclasses:
     Object
       -> X
@@ -223,6 +225,7 @@
   interfaceSetters:
 
 Z:
+  Longest path to Object: 4
   superclasses:
     Object
   interfaces: Y, X, A
@@ -252,6 +255,7 @@
   interfaceSetters:
 
 W:
+  Longest path to Object: 5
   superclasses:
     Object
   interfaces: Z, Y, X, A
@@ -281,6 +285,7 @@
   interfaceSetters:
 
 GX:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: G<A>
@@ -310,6 +315,7 @@
   interfaceSetters:
 
 GY:
+  Longest path to Object: 3
   superclasses:
     Object
       -> X
@@ -340,6 +346,7 @@
   interfaceSetters:
 
 GZ:
+  Longest path to Object: 4
   superclasses:
     Object
   interfaces: Y, X, A, GC, G<C>
@@ -369,6 +376,7 @@
   interfaceSetters:
 
 GW:
+  Longest path to Object: 5
   superclasses:
     Object
   interfaces: Z, Y, X, A, GD, G<D>
@@ -398,6 +406,7 @@
   interfaceSetters:
 
 GU:
+  Longest path to Object: 6
   superclasses:
     Object
       -> GW
@@ -428,6 +437,7 @@
   interfaceSetters:
 
 GV:
+  Longest path to Object: 7
   superclasses:
     Object
       -> GW
@@ -457,3 +467,81 @@
     Object._simpleInstanceOfTrue
     Object.==
   interfaceSetters:
+
+ARO:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+ARQ:
+  Longest path to Object: 2
+  superclasses:
+    Object
+  interfaces: ARO<T>
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+  interfaceMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  interfaceSetters:
+
+ARN:
+  Longest path to Object: 3
+  superclasses:
+    Object
+      -> ARQ<A>
+  interfaces: ARO<A>
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+  interfaceMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  interfaceSetters:
diff --git a/pkg/front_end/testcases/complex_class_hierarchy.dart.legacy.expect b/pkg/front_end/testcases/complex_class_hierarchy.dart.legacy.expect
index faa6b6d..a77011e 100644
--- a/pkg/front_end/testcases/complex_class_hierarchy.dart.legacy.expect
+++ b/pkg/front_end/testcases/complex_class_hierarchy.dart.legacy.expect
@@ -92,4 +92,19 @@
     : super self::GU::•()
     ;
 }
+class ARO<S extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::ARO<self::ARO::S>
+    : super core::Object::•()
+    ;
+}
+class ARQ<T extends core::Object = dynamic> extends core::Object implements self::ARO<self::ARQ::T> {
+  synthetic constructor •() → self::ARQ<self::ARQ::T>
+    : super core::Object::•()
+    ;
+}
+class ARN extends self::ARQ<self::A> {
+  synthetic constructor •() → self::ARN
+    : super self::ARQ::•()
+    ;
+}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/complex_class_hierarchy.dart.legacy.transformed.expect b/pkg/front_end/testcases/complex_class_hierarchy.dart.legacy.transformed.expect
index faa6b6d..a77011e 100644
--- a/pkg/front_end/testcases/complex_class_hierarchy.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/complex_class_hierarchy.dart.legacy.transformed.expect
@@ -92,4 +92,19 @@
     : super self::GU::•()
     ;
 }
+class ARO<S extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::ARO<self::ARO::S>
+    : super core::Object::•()
+    ;
+}
+class ARQ<T extends core::Object = dynamic> extends core::Object implements self::ARO<self::ARQ::T> {
+  synthetic constructor •() → self::ARQ<self::ARQ::T>
+    : super core::Object::•()
+    ;
+}
+class ARN extends self::ARQ<self::A> {
+  synthetic constructor •() → self::ARN
+    : super self::ARQ::•()
+    ;
+}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/complex_class_hierarchy.dart.outline.expect b/pkg/front_end/testcases/complex_class_hierarchy.dart.outline.expect
index f1265b2..0d412a05 100644
--- a/pkg/front_end/testcases/complex_class_hierarchy.dart.outline.expect
+++ b/pkg/front_end/testcases/complex_class_hierarchy.dart.outline.expect
@@ -74,5 +74,17 @@
   synthetic constructor •() → self::GV
     ;
 }
+class ARO<S extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::ARO<self::ARO::S>
+    ;
+}
+class ARQ<T extends core::Object = dynamic> extends core::Object implements self::ARO<self::ARQ::T> {
+  synthetic constructor •() → self::ARQ<self::ARQ::T>
+    ;
+}
+class ARN extends self::ARQ<self::A> {
+  synthetic constructor •() → self::ARN
+    ;
+}
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/complex_class_hierarchy.dart.strong.expect b/pkg/front_end/testcases/complex_class_hierarchy.dart.strong.expect
index 1bca20f..af41678 100644
--- a/pkg/front_end/testcases/complex_class_hierarchy.dart.strong.expect
+++ b/pkg/front_end/testcases/complex_class_hierarchy.dart.strong.expect
@@ -92,4 +92,19 @@
     : super self::GU::•()
     ;
 }
+class ARO<S extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::ARO<self::ARO::S>
+    : super core::Object::•()
+    ;
+}
+class ARQ<T extends core::Object = dynamic> extends core::Object implements self::ARO<self::ARQ::T> {
+  synthetic constructor •() → self::ARQ<self::ARQ::T>
+    : super core::Object::•()
+    ;
+}
+class ARN extends self::ARQ<self::A> {
+  synthetic constructor •() → self::ARN
+    : super self::ARQ::•()
+    ;
+}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/complex_class_hierarchy.dart.strong.transformed.expect b/pkg/front_end/testcases/complex_class_hierarchy.dart.strong.transformed.expect
index 1bca20f..af41678 100644
--- a/pkg/front_end/testcases/complex_class_hierarchy.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/complex_class_hierarchy.dart.strong.transformed.expect
@@ -92,4 +92,19 @@
     : super self::GU::•()
     ;
 }
+class ARO<S extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::ARO<self::ARO::S>
+    : super core::Object::•()
+    ;
+}
+class ARQ<T extends core::Object = dynamic> extends core::Object implements self::ARO<self::ARQ::T> {
+  synthetic constructor •() → self::ARQ<self::ARQ::T>
+    : super core::Object::•()
+    ;
+}
+class ARN extends self::ARQ<self::A> {
+  synthetic constructor •() → self::ARN
+    : super self::ARQ::•()
+    ;
+}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/escape.dart.hierarchy.expect b/pkg/front_end/testcases/escape.dart.hierarchy.expect
index 07af593..6fbadf9 100644
--- a/pkg/front_end/testcases/escape.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/escape.dart.hierarchy.expect
@@ -74,6 +74,7 @@
   classSetters:
 
 X:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A, B
diff --git a/pkg/front_end/testcases/expression/class_type_param_bound_2.expression.yaml b/pkg/front_end/testcases/expression/class_type_param_bound_2.expression.yaml
new file mode 100644
index 0000000..373069e
--- /dev/null
+++ b/pkg/front_end/testcases/expression/class_type_param_bound_2.expression.yaml
@@ -0,0 +1,10 @@
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+entry_point: "main_2.dart"
+import: "main.dart"
+definitions: ["x"]
+position: "main.dart#C"
+expression: |
+  hasBound<T>()
diff --git a/pkg/front_end/testcases/expression/class_type_param_bound_2.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_bound_2.expression.yaml.expect
new file mode 100644
index 0000000..2fef29d
--- /dev/null
+++ b/pkg/front_end/testcases/expression/class_type_param_bound_2.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
+  return main::hasBound<main::C::T>();
diff --git a/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml.expect
index b75af9f..2bc51ce 100644
--- a/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml.expect
@@ -4,9 +4,6 @@
   Try changing type arguments so that they conform to the bounds.
   hasBound<T>()
   ^
-  pkg/front_end/testcases/expression/main.dart:36:15: Context: This is the type variable whose bound isn't conformed to.
-  void hasBound<T extends Bound>() {}
-                ^
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
   return main::hasBound<main::A::T>();
diff --git a/pkg/front_end/testcases/expression/class_type_param_bound_illegal_2.expression.yaml b/pkg/front_end/testcases/expression/class_type_param_bound_illegal_2.expression.yaml
new file mode 100644
index 0000000..e6a0f33
--- /dev/null
+++ b/pkg/front_end/testcases/expression/class_type_param_bound_illegal_2.expression.yaml
@@ -0,0 +1,10 @@
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+entry_point: "main_2.dart"
+import: "main.dart"
+definitions: ["x"]
+position: "main.dart#A"
+expression: |
+  hasBound<T>()
diff --git a/pkg/front_end/testcases/expression/class_type_param_bound_illegal_2.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_bound_illegal_2.expression.yaml.expect
new file mode 100644
index 0000000..2bc51ce
--- /dev/null
+++ b/pkg/front_end/testcases/expression/class_type_param_bound_illegal_2.expression.yaml.expect
@@ -0,0 +1,9 @@
+Errors: {
+  org-dartlang-debug:synthetic_debug_expression:1:1: Error: Type argument 'T' doesn't conform to the bound 'Bound' of the type variable 'T' on 'hasBound'.
+   - 'Bound' is from 'pkg/front_end/testcases/expression/main.dart'.
+  Try changing type arguments so that they conform to the bounds.
+  hasBound<T>()
+  ^
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
+  return main::hasBound<main::A::T>();
diff --git a/pkg/front_end/testcases/expression/main_2.dart b/pkg/front_end/testcases/expression/main_2.dart
new file mode 100644
index 0000000..5cebe18
--- /dev/null
+++ b/pkg/front_end/testcases/expression/main_2.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library main_2;
+
+import 'main.dart' as m;
+
+main() {
+  m.main();
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/expression/type_param_bound.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_bound.expression.yaml.expect
index bb5b00a..4d0bbb7 100644
--- a/pkg/front_end/testcases/expression/type_param_bound.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_bound.expression.yaml.expect
@@ -4,9 +4,6 @@
   Try changing type arguments so that they conform to the bounds.
   hasBound<T>()
   ^
-  pkg/front_end/testcases/expression/main.dart:36:15: Context: This is the type variable whose bound isn't conformed to.
-  void hasBound<T extends Bound>() {}
-                ^
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
   return main::hasBound<#lib1::debugExpr::T>();
diff --git a/pkg/front_end/testcases/expression/type_param_bound_2.expression.yaml b/pkg/front_end/testcases/expression/type_param_bound_2.expression.yaml
new file mode 100644
index 0000000..b584ef2
--- /dev/null
+++ b/pkg/front_end/testcases/expression/type_param_bound_2.expression.yaml
@@ -0,0 +1,11 @@
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+entry_point: "main_2.dart"
+import: "main.dart"
+definitions: []
+type_definitions: ["T"]
+position: "main.dart"
+expression: |
+  hasBound<T>()
diff --git a/pkg/front_end/testcases/expression/type_param_bound_2.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_bound_2.expression.yaml.expect
new file mode 100644
index 0000000..4d0bbb7
--- /dev/null
+++ b/pkg/front_end/testcases/expression/type_param_bound_2.expression.yaml.expect
@@ -0,0 +1,9 @@
+Errors: {
+  org-dartlang-debug:synthetic_debug_expression:1:1: Error: Type argument 'T' doesn't conform to the bound 'Bound' of the type variable 'T' on 'hasBound'.
+   - 'Bound' is from 'pkg/front_end/testcases/expression/main.dart'.
+  Try changing type arguments so that they conform to the bounds.
+  hasBound<T>()
+  ^
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
+  return main::hasBound<#lib1::debugExpr::T>();
diff --git a/pkg/front_end/testcases/function_type_is_check.dart.hierarchy.expect b/pkg/front_end/testcases/function_type_is_check.dart.hierarchy.expect
index 98d4425..8dc6d36 100644
--- a/pkg/front_end/testcases/function_type_is_check.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/function_type_is_check.dart.hierarchy.expect
@@ -94,6 +94,7 @@
   classSetters:
 
 ExpectException:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Exception
@@ -124,40 +125,6 @@
     Object.==
   interfaceSetters:
 
-NoInline:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-AssumeDynamic:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
 Immutable:
   superclasses:
     Object
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.hierarchy.expect b/pkg/front_end/testcases/implicit_scope_test.dart.hierarchy.expect
index 336c761..15f5bfb 100644
--- a/pkg/front_end/testcases/implicit_scope_test.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/implicit_scope_test.dart.hierarchy.expect
@@ -113,6 +113,7 @@
   classSetters:
 
 ExpectException:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Exception
@@ -143,40 +144,6 @@
     Object.==
   interfaceSetters:
 
-NoInline:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-AssumeDynamic:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
 Immutable:
   superclasses:
     Object
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml
index 9fbdf62..649545e 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml
@@ -2,14 +2,16 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE.md file.
 
-# Initialize from component, where the component is linked to one sdk, and where
-# the incremental compiler loads another sdk. Risk when doing this: Having two
-# definitions of the same thing (e.g. the class 'String'), which could lead to
-# errors such as "The argument type 'dart.core::String' can't be assigned to
+# Initialize from component, where the component is linked to a sdk, and where
+# the incremental compiler (could) load another sdk.
+# Risk when doing this: Having two definitions of the same thing
+# (e.g. the class 'String'), which could lead to errors such as
+# "The argument type 'dart.core::String' can't be assigned to
 # the parameter type 'dart.core::String'".
 
 type: newworld
 strong: true
+omitPlatform: false
 worlds:
   - entry: main.dart
     errors: false
@@ -28,9 +30,11 @@
           print("Hello from useString: $s");
         }
     expectedLibraryCount: 2
+    expectsPlatform: true
   - entry: main.dart
     errors: false
     warnings: false
+    expectInitializeFromDill: false
     fromComponent: true
     invalidate:
       - main.dart
@@ -47,4 +51,5 @@
         void useString(String s) {
           print("Hello from useString: $s");
         }
-    expectedLibraryCount: 2
\ No newline at end of file
+    expectedLibraryCount: 2
+    expectsPlatform: true
\ No newline at end of file
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/multiple_entriepoints.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/multiple_entriepoints.yaml
new file mode 100644
index 0000000..83c53a0
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/multiple_entriepoints.yaml
@@ -0,0 +1,27 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Check that asking to compile two files that doesn't import each other actually
+# results in getting both libraries (aka that multiple entry points work).
+
+type: newworld
+strong: true
+worlds:
+  - entry:
+      - a.dart
+      - b.dart
+    sources:
+      a.dart: |
+        a() {
+          print("hello a");
+        }
+      b.dart: |
+        b() {
+          print("hello b");
+        }
+      c.dart: |
+        b() {
+          print("hello c (I'm not included!)");
+        }
+    expectedLibraryCount: 2
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml
new file mode 100644
index 0000000..e306e5a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml
@@ -0,0 +1,27 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Compile a hello world program, check that omit platform works as expected.
+
+type: newworld
+strong: true
+omitPlatform: true
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        main() {
+          print("Hello world");
+        }
+    expectedLibraryCount: 1
+  - entry: main.dart
+    noFullComponent: true
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        main() {
+          print("Hello world!");
+        }
+    expectedLibraryCount: 1
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml
new file mode 100644
index 0000000..e1a42a8a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml
@@ -0,0 +1,27 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Compile a hello world program, check that omit platform works as expected.
+# Omit platform is true by default in tests.
+
+type: newworld
+strong: true
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        main() {
+          print("Hello world");
+        }
+    expectedLibraryCount: 1
+  - entry: main.dart
+    noFullComponent: true
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        main() {
+          print("Hello world!");
+        }
+    expectedLibraryCount: 1
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml
new file mode 100644
index 0000000..b649bbd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Compile a hello world program, check that omit platform works as expected.
+# Check that we can compile again, that changes work, than we can ask for a full
+# component again etc.
+
+type: newworld
+strong: true
+omitPlatform: false
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        main() {
+          print("Hello world");
+        }
+    expectedLibraryCount: 1
+    expectsPlatform: true
+    expectInitializeFromDill: false
+  - entry: main.dart
+    noFullComponent: true
+    worldType: updated
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import "lib.dart";
+        main() {
+          print(lib());
+        }
+      lib.dart: |
+        lib() {
+          return "hello";
+        }
+    expectedLibraryCount: 2
+    expectsPlatform: false
+    expectInitializeFromDill: false
+  - entry: main.dart
+    noFullComponent: true
+    worldType: updated
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import "lib.dart";
+        main() {
+          print(lib() + "!");
+        }
+    expectedLibraryCount: 1
+    expectsPlatform: false
+    expectInitializeFromDill: false
+  - entry: main.dart
+    noFullComponent: false
+    worldType: updated
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import "lib.dart";
+        main() {
+          print(lib());
+        }
+    expectedLibraryCount: 2
+    expectsPlatform: true
+    expectInitializeFromDill: false
+  - entry: main.dart
+    noFullComponent: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import "lib.dart";
+        main() {
+          print(lib() + "!!");
+        }
+    expectedLibraryCount: 2
+    expectsPlatform: true
+    expectInitializeFromDill: true
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/status.status b/pkg/front_end/testcases/incremental_initialize_from_dill/status.status
index 003bd93..f3d01d2 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/status.status
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/status.status
@@ -3,5 +3,3 @@
 # BSD-style license that can be found in the LICENSE.md file.
 
 # Status file for the test suite ../test/incremental_load_from_dill_yaml_test.dart.
-
-load_from_component_explicitly_import_dart_core: Crash
\ No newline at end of file
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml
new file mode 100644
index 0000000..cf01000
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml
@@ -0,0 +1,44 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Compile an application with a .packages file.
+# Then change which file should be the .packages file to use, and everything
+# should now be relative to the new .packages file.
+
+type: newworld
+strong: true
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        import "package:example/b.dart";
+        main() {
+          print("hello");
+          b();
+        }
+      package_0.1.0/a.dart: |
+        a() {
+          la1();
+        }
+        la1() {
+          print("v0.1.0");
+        }
+      package_0.1.0/b.dart: |
+        import "a.dart";
+        b() {
+          a();
+        }
+      .packages: example:package_0.1.0
+    expectedLibraryCount: 3
+  - entry: main.dart
+    worldType: updated
+    expectInitializeFromDill: false
+    sources:
+      package_0.1.1/b.dart: |
+        b() {
+          print("hello from v0.1.1");
+        }
+      .packages2: example:package_0.1.1
+    dotPackagesFile: .packages2
+    expectedLibraryCount: 2
diff --git a/pkg/front_end/testcases/inference/async_await.dart.hierarchy.expect b/pkg/front_end/testcases/inference/async_await.dart.hierarchy.expect
index 494e3cb..8a18ee5 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<int>
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.hierarchy.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.hierarchy.expect
index 0590bd0..10cabb6 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.hierarchy.expect
@@ -40,6 +40,7 @@
     C._redirecting#
 
 CImpl:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: C<T>
diff --git a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.hierarchy.expect b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.hierarchy.expect
index 824f22f..2549864 100644
--- a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.hierarchy.expect
@@ -37,6 +37,7 @@
   classSetters:
 
 B:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.hierarchy.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.hierarchy.expect
index 00b2c95..dc148c5 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.hierarchy.expect
@@ -37,6 +37,7 @@
   classSetters:
 
 C:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: B
diff --git a/pkg/front_end/testcases/inference/future_then.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_2.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_3.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_4.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_5.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_6.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.hierarchy.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.hierarchy.expect
index 06d97d1..89a66e0 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.hierarchy.expect
@@ -48,6 +48,7 @@
   classSetters:
 
 MyFuture:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Future<T>
diff --git a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.hierarchy.expect b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.hierarchy.expect
index 0d0e29f..1e44eee 100644
--- a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.hierarchy.expect
@@ -38,6 +38,7 @@
     B.x
 
 A:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: B
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.hierarchy.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.hierarchy.expect
index 0d0e29f..1e44eee 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.hierarchy.expect
@@ -38,6 +38,7 @@
     B.x
 
 A:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: B
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.hierarchy.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.hierarchy.expect
index fab6c77..245115c 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.hierarchy.expect
@@ -37,6 +37,7 @@
   classSetters:
 
 B:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: C
@@ -68,6 +69,7 @@
   interfaceSetters:
 
 A:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: B, C
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.hierarchy.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.hierarchy.expect
index 06440ff..167ba88 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.hierarchy.expect
@@ -37,6 +37,7 @@
     C.x
 
 B:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: C
@@ -68,6 +69,7 @@
     B.x
 
 A:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: B, C
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.hierarchy.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.hierarchy.expect
index d7a8370..26fee5a 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.hierarchy.expect
@@ -95,6 +95,7 @@
     D.x
 
 E:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A
@@ -128,6 +129,7 @@
     E.x
 
 F:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: B
@@ -161,6 +163,7 @@
     F.x
 
 Object with B:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: B
@@ -192,6 +195,7 @@
   interfaceSetters:
 
 G:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _G&Object&B
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.hierarchy.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.hierarchy.expect
index 20d7855..66315ee 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.hierarchy.expect
@@ -95,6 +95,7 @@
     D.x
 
 E:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A
@@ -128,6 +129,7 @@
     E.x
 
 F:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: B
@@ -161,6 +163,7 @@
     F.x
 
 Object with B:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: B
@@ -192,6 +195,7 @@
     B.x
 
 G:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _G&Object&B
diff --git a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.hierarchy.expect b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.hierarchy.expect
index 31b4162..559c5bd 100644
--- a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.hierarchy.expect
@@ -37,6 +37,7 @@
   classSetters:
 
 B:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: C
@@ -68,6 +69,7 @@
   interfaceSetters:
 
 A:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: B, C
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.hierarchy.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.hierarchy.expect
index 69c8242..ecf08eb 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.hierarchy.expect
@@ -59,6 +59,7 @@
   classSetters:
 
 C:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A, B
diff --git a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.hierarchy.expect b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.hierarchy.expect
index 368c13e..2543994 100644
--- a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.hierarchy.expect
@@ -37,6 +37,7 @@
     C.x
 
 B:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: C
@@ -68,6 +69,7 @@
     B.x
 
 A:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: B, C
diff --git a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.hierarchy.expect b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.hierarchy.expect
index f852cff..9ae2e27 100644
--- a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.hierarchy.expect
@@ -55,6 +55,7 @@
   classSetters:
 
 C:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I1, I2
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.hierarchy.expect
index 06b9b49..b21414f 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.hierarchy.expect
@@ -54,6 +54,7 @@
   classSetters:
 
 M1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I<int>
@@ -83,6 +84,7 @@
   interfaceSetters:
 
 M1 with M0<int, String>:
+  Longest path to Object: 3
   superclasses:
     Object
       -> M1
@@ -113,6 +115,7 @@
   interfaceSetters:
 
 A:
+  Longest path to Object: 4
   superclasses:
     Object
       -> M1
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.hierarchy.expect
index 3f48b79..6d65499 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.hierarchy.expect
@@ -54,6 +54,7 @@
   classSetters:
 
 M1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I<int>
@@ -83,6 +84,7 @@
   interfaceSetters:
 
 M1 with M0<int, int>:
+  Longest path to Object: 3
   superclasses:
     Object
       -> M1
@@ -113,6 +115,7 @@
   interfaceSetters:
 
 A:
+  Longest path to Object: 4
   superclasses:
     Object
       -> M1
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.hierarchy.expect
index 7daaa837..88712a2 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.hierarchy.expect
@@ -54,6 +54,7 @@
   classSetters:
 
 M1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I<int>
@@ -83,6 +84,7 @@
   interfaceSetters:
 
 M1 with M0<int, Comparable<dynamic>>:
+  Longest path to Object: 3
   superclasses:
     Object
       -> M1
@@ -113,6 +115,7 @@
   interfaceSetters:
 
 A:
+  Longest path to Object: 4
   superclasses:
     Object
       -> M1
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.hierarchy.expect
index eebc3a2..3e686b6 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.hierarchy.expect
@@ -114,6 +114,7 @@
   interfaceSetters:
 
 M1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I<int>
@@ -143,6 +144,7 @@
   interfaceSetters:
 
 M2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> M1
@@ -173,6 +175,7 @@
   interfaceSetters:
 
 M2 with M0<int, double>:
+  Longest path to Object: 4
   superclasses:
     Object
       -> M1
@@ -204,6 +207,7 @@
   interfaceSetters:
 
 A:
+  Longest path to Object: 5
   superclasses:
     Object
       -> M1
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.hierarchy.expect
index 45aa225..74bb85d 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.hierarchy.expect
@@ -36,6 +36,7 @@
   classSetters:
 
 M0:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I<T>
@@ -83,6 +84,7 @@
   classSetters:
 
 Object with M0<dynamic>:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: M0<dynamic>, I<dynamic>
@@ -112,6 +114,7 @@
   interfaceSetters:
 
 _A&Object&M0 with M1<int>:
+  Longest path to Object: 4
   superclasses:
     Object
       -> _A&Object&M0
@@ -142,6 +145,7 @@
   interfaceSetters:
 
 A:
+  Longest path to Object: 5
   superclasses:
     Object
       -> _A&Object&M0
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.hierarchy.expect
index 1d1e2f0..d2343d3 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.hierarchy.expect
@@ -36,6 +36,7 @@
   classSetters:
 
 M0:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I<T>
@@ -83,6 +84,7 @@
   classSetters:
 
 Object with M0<dynamic>:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: M0<dynamic>, I<dynamic>
@@ -112,6 +114,7 @@
   interfaceSetters:
 
 _A&Object&M0 with M1<dynamic>:
+  Longest path to Object: 4
   superclasses:
     Object
       -> _A&Object&M0
@@ -142,6 +145,7 @@
   interfaceSetters:
 
 A:
+  Longest path to Object: 5
   superclasses:
     Object
       -> _A&Object&M0
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.hierarchy.expect
index 9e4e1b8..fb14a36 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.hierarchy.expect
@@ -36,6 +36,7 @@
   classSetters:
 
 M0:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I<T, int>
@@ -65,6 +66,7 @@
   interfaceSetters:
 
 M1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I<String, T>
@@ -94,6 +96,7 @@
   interfaceSetters:
 
 Object with M0<dynamic>:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: M0<dynamic>, I<dynamic, int>
@@ -123,6 +126,7 @@
   interfaceSetters:
 
 _A&Object&M0 with M1<dynamic>:
+  Longest path to Object: 4
   superclasses:
     Object
       -> _A&Object&M0
@@ -153,6 +157,7 @@
   interfaceSetters:
 
 A:
+  Longest path to Object: 5
   superclasses:
     Object
       -> _A&Object&M0
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.hierarchy.expect
index e8cc39f..f1f8e8d 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.hierarchy.expect
@@ -36,6 +36,7 @@
   classSetters:
 
 M0:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I<T, List<T>>
@@ -65,6 +66,7 @@
   interfaceSetters:
 
 M1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I<List<T>, T>
@@ -94,6 +96,7 @@
   interfaceSetters:
 
 Object with M0<dynamic>:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: M0<dynamic>, I<dynamic, List<dynamic>>
@@ -123,6 +126,7 @@
   interfaceSetters:
 
 _A&Object&M0 with M1<dynamic>:
+  Longest path to Object: 4
   superclasses:
     Object
       -> _A&Object&M0
@@ -153,6 +157,7 @@
   interfaceSetters:
 
 A:
+  Longest path to Object: 5
   superclasses:
     Object
       -> _A&Object&M0
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.hierarchy.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.hierarchy.expect
index 4e3fcb5..f92d773 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.hierarchy.expect
@@ -55,6 +55,7 @@
   classSetters:
 
 C:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I1, I2
@@ -85,6 +86,7 @@
   interfaceSetters:
 
 D:
+  Longest path to Object: 3
   superclasses:
     Object
       -> C
@@ -117,6 +119,7 @@
   interfaceSetters:
 
 E:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I2, I1
@@ -147,6 +150,7 @@
   interfaceSetters:
 
 F:
+  Longest path to Object: 3
   superclasses:
     Object
       -> E
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.hierarchy.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.hierarchy.expect
index a0eaeca..00d3da3 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.hierarchy.expect
@@ -127,6 +127,7 @@
   classSetters:
 
 G:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: D, E, F
@@ -157,6 +158,7 @@
   interfaceSetters:
 
 H:
+  Longest path to Object: 3
   superclasses:
     Object
       -> G
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.hierarchy.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.hierarchy.expect
index 1931b4d..f3dfb42 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.hierarchy.expect
@@ -146,6 +146,7 @@
   classSetters:
 
 ExpectException:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Exception
@@ -176,40 +177,6 @@
     Object.==
   interfaceSetters:
 
-NoInline:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-AssumeDynamic:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
 Immutable:
   superclasses:
     Object
diff --git a/pkg/front_end/testcases/legacy.status b/pkg/front_end/testcases/legacy.status
index 686bf31..947de8b 100644
--- a/pkg/front_end/testcases/legacy.status
+++ b/pkg/front_end/testcases/legacy.status
@@ -42,7 +42,7 @@
 rasta/bad_default_constructor: Fail # Compile-time error destroys program.
 rasta/bad_explicit_super_constructor: RuntimeError
 rasta/bad_implicit_super_constructor: RuntimeError
-rasta/bad_interpolation: Fail
+rasta/bad_interpolation: RuntimeError
 rasta/bad_redirection: Fail
 rasta/bad_setter_initializer: RuntimeError
 rasta/bad_unicode: Fail
@@ -68,7 +68,6 @@
 rasta/issue_000042: Fail
 rasta/issue_000043: Fail
 rasta/issue_000044: Fail
-rasta/issue_000045: Fail
 rasta/issue_000046: RuntimeError
 rasta/issue_000047: Fail
 rasta/issue_000081: Fail
diff --git a/pkg/front_end/testcases/magic_const.dart.legacy.expect b/pkg/front_end/testcases/magic_const.dart.legacy.expect
index 78ce95a..3b3544f 100644
--- a/pkg/front_end/testcases/magic_const.dart.legacy.expect
+++ b/pkg/front_end/testcases/magic_const.dart.legacy.expect
@@ -20,7 +20,7 @@
     : super core::Object::•()
     ;
 }
-static method foo({dynamic a = new self::Constant::•(), dynamic b = new self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
+static method foo({dynamic a = const self::Constant::•(), dynamic b = const self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/magic_const.dart:18:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
 Try using a constructor or factory that is 'const'.
diff --git a/pkg/front_end/testcases/magic_const.dart.legacy.transformed.expect b/pkg/front_end/testcases/magic_const.dart.legacy.transformed.expect
index 78ce95a..3b3544f 100644
--- a/pkg/front_end/testcases/magic_const.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/magic_const.dart.legacy.transformed.expect
@@ -20,7 +20,7 @@
     : super core::Object::•()
     ;
 }
-static method foo({dynamic a = new self::Constant::•(), dynamic b = new self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
+static method foo({dynamic a = const self::Constant::•(), dynamic b = const self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/magic_const.dart:18:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
 Try using a constructor or factory that is 'const'.
diff --git a/pkg/front_end/testcases/magic_const.dart.strong.expect b/pkg/front_end/testcases/magic_const.dart.strong.expect
index e5aa39c..8bd3e19 100644
--- a/pkg/front_end/testcases/magic_const.dart.strong.expect
+++ b/pkg/front_end/testcases/magic_const.dart.strong.expect
@@ -20,7 +20,7 @@
     : super core::Object::•()
     ;
 }
-static method foo({dynamic a = new self::Constant::•(), dynamic b = new self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
+static method foo({dynamic a = const self::Constant::•(), dynamic b = const self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/magic_const.dart:18:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
 Try using a constructor or factory that is 'const'.
diff --git a/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect b/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect
index e5aa39c..8bd3e19 100644
--- a/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect
@@ -20,7 +20,7 @@
     : super core::Object::•()
     ;
 }
-static method foo({dynamic a = new self::Constant::•(), dynamic b = new self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
+static method foo({dynamic a = const self::Constant::•(), dynamic b = const self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
 static method test() → dynamic {
   invalid-expression "pkg/front_end/testcases/magic_const.dart:18:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
 Try using a constructor or factory that is 'const'.
diff --git a/pkg/front_end/testcases/mixin.dart.hierarchy.expect b/pkg/front_end/testcases/mixin.dart.hierarchy.expect
index a86326c..7b25a03 100644
--- a/pkg/front_end/testcases/mixin.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/mixin.dart.hierarchy.expect
@@ -55,6 +55,7 @@
   classSetters:
 
 Object with M1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: M1
@@ -86,6 +87,7 @@
   interfaceSetters:
 
 _C&Object&M1 with M2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _C&Object&M1
@@ -118,6 +120,7 @@
   interfaceSetters:
 
 C:
+  Longest path to Object: 4
   superclasses:
     Object
       -> _C&Object&M1
@@ -169,6 +172,7 @@
   classSetters:
 
 Object with G1<S>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: G1<S>
@@ -200,6 +204,7 @@
   interfaceSetters:
 
 D:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _D&Object&G1<S>
@@ -232,6 +237,7 @@
   interfaceSetters:
 
 Object with M1:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: M1
@@ -263,6 +269,7 @@
   interfaceSetters:
 
 _B&Object&M1 with M2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _B&Object&M1
@@ -295,6 +302,7 @@
   interfaceSetters:
 
 B:
+  Longest path to Object: 4
   superclasses:
     Object
       -> _B&Object&M1
diff --git a/pkg/front_end/testcases/mixin_conflicts.dart.hierarchy.expect b/pkg/front_end/testcases/mixin_conflicts.dart.hierarchy.expect
index d311de4..8999f35 100644
--- a/pkg/front_end/testcases/mixin_conflicts.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/mixin_conflicts.dart.hierarchy.expect
@@ -37,6 +37,7 @@
   classSetters:
 
 N:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: M
@@ -68,6 +69,7 @@
   interfaceSetters:
 
 Object with N:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: N, M
@@ -99,6 +101,7 @@
   interfaceSetters:
 
 C:
+  Longest path to Object: 4
   superclasses:
     Object
       -> _C&Object&N
@@ -131,6 +134,7 @@
   interfaceSetters:
 
 M2:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: M
@@ -163,6 +167,7 @@
   interfaceSetters:
 
 N2:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: M2, M
@@ -195,6 +200,7 @@
   interfaceSetters:
 
 N3:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: M2, M
@@ -227,6 +233,7 @@
   interfaceSetters:
 
 Object with M2:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: M2, M
@@ -259,6 +266,7 @@
   interfaceSetters:
 
 C2:
+  Longest path to Object: 4
   superclasses:
     Object
       -> _C2&Object&M2
@@ -292,6 +300,7 @@
   interfaceSetters:
 
 Object with M2:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: M2, M
@@ -324,6 +333,7 @@
   interfaceSetters:
 
 C3:
+  Longest path to Object: 4
   superclasses:
     Object
       -> _C3&Object&M2
diff --git a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.hierarchy.expect b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.hierarchy.expect
index 78bd7cb..c71f63f 100644
--- a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.hierarchy.expect
@@ -268,6 +268,7 @@
   classSetters:
 
 ExpectException:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Exception
@@ -298,40 +299,6 @@
     Object.==
   interfaceSetters:
 
-NoInline:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-AssumeDynamic:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
 Immutable:
   superclasses:
     Object
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.hierarchy.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.hierarchy.expect
index 56969f8..85f7304 100644
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.hierarchy.expect
@@ -77,6 +77,7 @@
     C._field
 
 Object with C<B>:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: C<B>
@@ -112,6 +113,7 @@
     C._field
 
 Foo:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Foo&Object&C
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.hierarchy.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.hierarchy.expect
index 0482f3b..7f7d266 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.hierarchy.expect
@@ -38,6 +38,7 @@
     I.foo
 
 A:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I
@@ -69,6 +70,7 @@
     I.foo
 
 B:
+  Longest path to Object: 3
   superclasses:
     Object
       -> A
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.hierarchy.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.hierarchy.expect
index 785f78b..018c929 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.hierarchy.expect
@@ -38,6 +38,7 @@
     A.foo
 
 B:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A
@@ -69,6 +70,7 @@
     A.foo
 
 Object with B:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: B, A
@@ -100,6 +102,7 @@
     A.foo
 
 C:
+  Longest path to Object: 4
   superclasses:
     Object
       -> _C&Object&B
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.hierarchy.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.hierarchy.expect
index 20bc332..f9e9b82 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.hierarchy.expect
@@ -38,6 +38,7 @@
     A.foo
 
 B:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A
@@ -70,6 +71,7 @@
     A.foo
 
 C:
+  Longest path to Object: 3
   superclasses:
     Object
       -> B
@@ -103,6 +105,7 @@
     A.foo
 
 D:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A
@@ -135,6 +138,7 @@
     D.foo
 
 E:
+  Longest path to Object: 3
   superclasses:
     Object
       -> D
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.hierarchy.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.hierarchy.expect
index 71bf144..22986a4 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.hierarchy.expect
@@ -38,6 +38,7 @@
     A.foo
 
 B:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A<int>
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.hierarchy.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.hierarchy.expect
index 5b5669e..a38db13 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.hierarchy.expect
@@ -55,6 +55,7 @@
   classSetters:
 
 B:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I
@@ -85,6 +86,7 @@
   interfaceSetters:
 
 A with B:
+  Longest path to Object: 3
   superclasses:
     Object
       -> A
@@ -117,6 +119,7 @@
   interfaceSetters:
 
 C:
+  Longest path to Object: 4
   superclasses:
     Object
       -> A
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.hierarchy.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.hierarchy.expect
index c3d12b3..6f90578 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.hierarchy.expect
@@ -55,6 +55,7 @@
   classSetters:
 
 M:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I1, I2
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.hierarchy.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.hierarchy.expect
index 2cea300..38e9a5f 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.hierarchy.expect
@@ -37,6 +37,7 @@
   classSetters:
 
 A:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I
@@ -67,6 +68,7 @@
   interfaceSetters:
 
 Object with A:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: A, I
@@ -97,6 +99,7 @@
   interfaceSetters:
 
 B:
+  Longest path to Object: 4
   superclasses:
     Object
       -> _B&Object&A
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.hierarchy.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.hierarchy.expect
index 8b453b8..84d907a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.hierarchy.expect
@@ -54,6 +54,7 @@
   classSetters:
 
 Object with M:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: M
@@ -83,6 +84,7 @@
   interfaceSetters:
 
 A:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _A&Object&M
@@ -114,6 +116,7 @@
   interfaceSetters:
 
 Object with M:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: M
@@ -143,6 +146,7 @@
   interfaceSetters:
 
 B:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _B&Object&M
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.hierarchy.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.hierarchy.expect
index 254f85b..e270c79 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.hierarchy.expect
@@ -36,6 +36,7 @@
   classSetters:
 
 Object with A:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A
@@ -65,6 +66,7 @@
   interfaceSetters:
 
 B:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _B&Object&A
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.hierarchy.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.hierarchy.expect
index 3227a6f..29f5d07 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.hierarchy.expect
@@ -54,6 +54,7 @@
   classSetters:
 
 Object with M:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: M
@@ -83,6 +84,7 @@
   interfaceSetters:
 
 A:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _A&Object&M
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.hierarchy.expect b/pkg/front_end/testcases/no_such_method_private_setter.dart.hierarchy.expect
index dba9cc0..95cc6fb 100644
--- a/pkg/front_end/testcases/no_such_method_private_setter.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/no_such_method_private_setter.dart.hierarchy.expect
@@ -38,6 +38,7 @@
     Bar._x
 
 Foo:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Bar
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index da7ac91..59f7d53 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -240,7 +240,6 @@
 inference/unsafe_block_closure_inference_method_call_no_type_param: Fail
 inference/void_return_type_subtypes_dynamic: Fail
 
-rasta/issue_000045: Fail
 rasta/issue_000047: Fail
 rasta/native_is_illegal: Pass # Issue 29763
 rasta/type_with_parse_error: Fail
diff --git a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.hierarchy.expect b/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.hierarchy.expect
index 98db882..d53d249 100644
--- a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.hierarchy.expect
@@ -54,6 +54,7 @@
   classSetters:
 
 Hest:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Bar
diff --git a/pkg/front_end/testcases/private_method_tearoff.dart.hierarchy.expect b/pkg/front_end/testcases/private_method_tearoff.dart.hierarchy.expect
index 6906912..c696ebc 100644
--- a/pkg/front_end/testcases/private_method_tearoff.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/private_method_tearoff.dart.hierarchy.expect
@@ -37,6 +37,7 @@
   classSetters:
 
 Foo:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Bar
@@ -67,6 +68,7 @@
   interfaceSetters:
 
 Baz:
+  Longest path to Object: 3
   superclasses:
     Object
       -> Foo
diff --git a/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.expect b/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.expect
new file mode 100644
index 0000000..fba617b
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.expect
@@ -0,0 +1,26 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:13: Error: String starting with " must end with ".
+//   print(" $x.);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:8: Error: Can't find ')' to match '('.
+//   print(" $x.);
+//        ^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:12: Warning: Getter not found: 'x'.
+//   print(" $x.);
+//            ^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:13: Error: Expected ';' after this.
+//   print(" $x.);
+//             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print(" ${throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))}.);\"");
+}
diff --git a/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.transformed.expect
new file mode 100644
index 0000000..fba617b
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.transformed.expect
@@ -0,0 +1,26 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:13: Error: String starting with " must end with ".
+//   print(" $x.);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:8: Error: Can't find ')' to match '('.
+//   print(" $x.);
+//        ^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:12: Warning: Getter not found: 'x'.
+//   print(" $x.);
+//            ^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:13: Error: Expected ';' after this.
+//   print(" $x.);
+//             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print(" ${throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))}.);\"");
+}
diff --git a/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.expect
index 36fe259..9e8cbc2 100644
--- a/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.expect
@@ -24,5 +24,5 @@
 static method main() → dynamic {
   core::print(" ${invalid-expression "pkg/front_end/testcases/rasta/bad_interpolation.dart:6:12: Error: Getter not found: 'x'.
   print(\" \$x.);
-           ^"}.);");
+           ^"}.);\"");
 }
diff --git a/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.transformed.expect
index 36fe259..9e8cbc2 100644
--- a/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.transformed.expect
@@ -24,5 +24,5 @@
 static method main() → dynamic {
   core::print(" ${invalid-expression "pkg/front_end/testcases/rasta/bad_interpolation.dart:6:12: Error: Getter not found: 'x'.
   print(\" \$x.);
-           ^"}.);");
+           ^"}.);\"");
 }
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.hierarchy.expect
index ee525c0..8d71816 100644
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.hierarchy.expect
@@ -38,6 +38,7 @@
     Mixin.field
 
 Object with Mixin:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Mixin
@@ -71,6 +72,7 @@
     Mixin.field
 
 _A&Object&Mixin with Mixin:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _A&Object&Mixin
@@ -105,6 +107,7 @@
     Mixin.field
 
 A:
+  Longest path to Object: 4
   superclasses:
     Object
       -> _A&Object&Mixin
diff --git a/pkg/front_end/testcases/rasta/issue_000002.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/issue_000002.dart.hierarchy.expect
index 87c1e96..8f4a8e0 100644
--- a/pkg/front_end/testcases/rasta/issue_000002.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000002.dart.hierarchy.expect
@@ -112,6 +112,7 @@
   classSetters:
 
 ExpectException:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Exception
@@ -142,40 +143,6 @@
     Object.==
   interfaceSetters:
 
-NoInline:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-AssumeDynamic:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
 Immutable:
   superclasses:
     Object
diff --git a/pkg/front_end/testcases/rasta/issue_000004.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/issue_000004.dart.hierarchy.expect
index 98d4425..8dc6d36 100644
--- a/pkg/front_end/testcases/rasta/issue_000004.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000004.dart.hierarchy.expect
@@ -94,6 +94,7 @@
   classSetters:
 
 ExpectException:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Exception
@@ -124,40 +125,6 @@
     Object.==
   interfaceSetters:
 
-NoInline:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-AssumeDynamic:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
 Immutable:
   superclasses:
     Object
diff --git a/pkg/front_end/testcases/rasta/issue_000045.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000045.dart.legacy.expect
index 1cafd63..2622c42 100644
--- a/pkg/front_end/testcases/rasta/issue_000045.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000045.dart.legacy.expect
@@ -1,5 +1,19 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:5:18: Error: String starting with """ must end with """.
+// main() => """${1}
+//                  ^...
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:5:18: Error: Expected ';' after this.
+// main() => """${1}
+//                  ^...
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:6:1: Error: Unexpected token ''.
+//
 import self as self;
 
 static method main() → dynamic
-  invalid-statement;
+  return "${1}
+\"\"\"";
diff --git a/pkg/front_end/testcases/rasta/issue_000045.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000045.dart.legacy.transformed.expect
new file mode 100644
index 0000000..2622c42
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000045.dart.legacy.transformed.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:5:18: Error: String starting with """ must end with """.
+// main() => """${1}
+//                  ^...
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:5:18: Error: Expected ';' after this.
+// main() => """${1}
+//                  ^...
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:6:1: Error: Unexpected token ''.
+//
+import self as self;
+
+static method main() → dynamic
+  return "${1}
+\"\"\"";
diff --git a/pkg/front_end/testcases/rasta/issue_000045.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000045.dart.outline.expect
index 1cafd63..562267f 100644
--- a/pkg/front_end/testcases/rasta/issue_000045.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000045.dart.outline.expect
@@ -1,5 +1,12 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:5:18: Error: String starting with """ must end with """.
+// main() => """${1}
+//                  ^...
+//
 import self as self;
 
 static method main() → dynamic
-  invalid-statement;
+  ;
diff --git a/pkg/front_end/testcases/rasta/issue_000045.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000045.dart.strong.expect
index 389cb09..2622c42 100644
--- a/pkg/front_end/testcases/rasta/issue_000045.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000045.dart.strong.expect
@@ -16,4 +16,4 @@
 
 static method main() → dynamic
   return "${1}
-";
+\"\"\"";
diff --git a/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect
index 389cb09..2622c42 100644
--- a/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect
@@ -16,4 +16,4 @@
 
 static method main() → dynamic
   return "${1}
-";
+\"\"\"";
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.hierarchy.expect
index 705a7e3..e760d0a 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.hierarchy.expect
@@ -155,6 +155,7 @@
   classSetters:
 
 ExpectException:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Exception
@@ -185,40 +186,6 @@
     Object.==
   interfaceSetters:
 
-NoInline:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-AssumeDynamic:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
 Immutable:
   superclasses:
     Object
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.hierarchy.expect
index 9a18fb1..cfd122c 100644
--- a/pkg/front_end/testcases/rasta/issue_000068.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.hierarchy.expect
@@ -165,6 +165,7 @@
   classSetters:
 
 ExpectException:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Exception
@@ -195,40 +196,6 @@
     Object.==
   interfaceSetters:
 
-NoInline:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-AssumeDynamic:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
 Immutable:
   superclasses:
     Object
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.hierarchy.expect
index c2b7ee7..dbe120e 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.hierarchy.expect
@@ -149,6 +149,7 @@
   classSetters:
 
 ExpectException:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Exception
@@ -179,40 +180,6 @@
     Object.==
   interfaceSetters:
 
-NoInline:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-AssumeDynamic:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
 Immutable:
   superclasses:
     Object
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.hierarchy.expect
index 76d68ab..2d401aa0a 100644
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.hierarchy.expect
@@ -39,6 +39,7 @@
     Mixin.field
 
 Object with Mixin:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Mixin
@@ -74,6 +75,7 @@
     Mixin.field
 
 Foo:
+  Longest path to Object: 3
   superclasses:
     Object
       -> _Foo&Object&Mixin
diff --git a/pkg/front_end/testcases/rasta/parser_error.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/parser_error.dart.hierarchy.expect
index 98d4425..8dc6d36 100644
--- a/pkg/front_end/testcases/rasta/parser_error.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/parser_error.dart.hierarchy.expect
@@ -94,6 +94,7 @@
   classSetters:
 
 ExpectException:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Exception
@@ -124,40 +125,6 @@
     Object.==
   interfaceSetters:
 
-NoInline:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-AssumeDynamic:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
 Immutable:
   superclasses:
     Object
diff --git a/pkg/front_end/testcases/redirecting_factory.dart.hierarchy.expect b/pkg/front_end/testcases/redirecting_factory.dart.hierarchy.expect
index a3bb376..e601475 100644
--- a/pkg/front_end/testcases/redirecting_factory.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/redirecting_factory.dart.hierarchy.expect
@@ -39,6 +39,7 @@
     FooBase._redirecting#
 
 Foo:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: FooBase
@@ -73,6 +74,7 @@
     Foo._redirecting#
 
 Bar:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: Foo<Tb>, FooBase
@@ -143,6 +145,7 @@
     SimpleCase._redirecting#
 
 SimpleCaseImpl:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: SimpleCase<Ai, Bi>
@@ -176,6 +179,7 @@
     SimpleCaseImpl._redirecting#
 
 SimpleCaseImpl2:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: SimpleCaseImpl<Ai2, Bi2>, SimpleCase<Ai2, Bi2>
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.hierarchy.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.hierarchy.expect
index 8645346..4985228 100644
--- a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.hierarchy.expect
@@ -38,6 +38,7 @@
     _X._redirecting#
 
 _Y:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: _X<T>
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.hierarchy.expect b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.hierarchy.expect
index 6e0f389..137a8fe 100644
--- a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.hierarchy.expect
@@ -152,6 +152,7 @@
   classSetters:
 
 ExpectException:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Exception
@@ -182,40 +183,6 @@
     Object.==
   interfaceSetters:
 
-NoInline:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-AssumeDynamic:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
 Immutable:
   superclasses:
     Object
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.hierarchy.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.hierarchy.expect
index 6e0f389..137a8fe 100644
--- a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.hierarchy.expect
@@ -152,6 +152,7 @@
   classSetters:
 
 ExpectException:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Exception
@@ -182,40 +183,6 @@
     Object.==
   interfaceSetters:
 
-NoInline:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-AssumeDynamic:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
 Immutable:
   superclasses:
     Object
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.hierarchy.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.hierarchy.expect
index 80cea1b..d2d552d 100644
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/redirection_type_arguments.dart.hierarchy.expect
@@ -131,6 +131,7 @@
   classSetters:
 
 ExpectException:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Exception
@@ -161,40 +162,6 @@
     Object.==
   interfaceSetters:
 
-NoInline:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-AssumeDynamic:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
 Immutable:
   superclasses:
     Object
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.hierarchy.expect b/pkg/front_end/testcases/regress/issue_31996.dart.hierarchy.expect
index 8e9e795..627064d 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.hierarchy.expect
@@ -53,6 +53,7 @@
   classSetters:
 
 Base:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: B
@@ -82,6 +83,7 @@
   interfaceSetters:
 
 Child1:
+  Longest path to Object: 3
   superclasses:
     Object
       -> Base
@@ -112,6 +114,7 @@
   interfaceSetters:
 
 Child2:
+  Longest path to Object: 3
   superclasses:
     Object
       -> Base
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.hierarchy.expect b/pkg/front_end/testcases/regress/issue_35260.dart.hierarchy.expect
index 4158779..2c646a0 100644
--- a/pkg/front_end/testcases/regress/issue_35260.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.hierarchy.expect
@@ -38,6 +38,7 @@
     Supertype._redirecting#
 
 X:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: Supertype
diff --git a/pkg/front_end/testcases/regress/issue_35900.dart b/pkg/front_end/testcases/regress/issue_35900.dart
new file mode 100644
index 0000000..7d0849d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35900.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main () { int x; print('${x' '); }
diff --git a/pkg/front_end/testcases/regress/issue_35900.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35900.dart.legacy.expect
new file mode 100644
index 0000000..34c8236
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35900.dart.legacy.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:25: Error: Can't find '}' to match '${'.
+// main () { int x; print('${x' '); }
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:24: Error: String starting with ' must end with '.
+// main () { int x; print('${x' '); }
+//                        ^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:6:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:28: Error: Expected '}' before this.
+// main () { int x; print('${x' '); }
+//                            ^^^
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:31: Error: Expected a String, but got ')'.
+// main () { int x; print('${x' '); }
+//                               ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int x;
+  core::print("${x}");
+}
diff --git a/pkg/front_end/testcases/regress/issue_35900.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35900.dart.legacy.transformed.expect
new file mode 100644
index 0000000..34c8236
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35900.dart.legacy.transformed.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:25: Error: Can't find '}' to match '${'.
+// main () { int x; print('${x' '); }
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:24: Error: String starting with ' must end with '.
+// main () { int x; print('${x' '); }
+//                        ^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:6:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:28: Error: Expected '}' before this.
+// main () { int x; print('${x' '); }
+//                            ^^^
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:31: Error: Expected a String, but got ')'.
+// main () { int x; print('${x' '); }
+//                               ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int x;
+  core::print("${x}");
+}
diff --git a/pkg/front_end/testcases/regress/issue_35900.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35900.dart.outline.expect
new file mode 100644
index 0000000..da0b63f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35900.dart.outline.expect
@@ -0,0 +1,18 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:25: Error: Can't find '}' to match '${'.
+// main () { int x; print('${x' '); }
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:24: Error: String starting with ' must end with '.
+// main () { int x; print('${x' '); }
+//                        ^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:6:1: Error: Expected a declaration, but got ''.
+//
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_35900.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35900.dart.strong.expect
new file mode 100644
index 0000000..34c8236
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35900.dart.strong.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:25: Error: Can't find '}' to match '${'.
+// main () { int x; print('${x' '); }
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:24: Error: String starting with ' must end with '.
+// main () { int x; print('${x' '); }
+//                        ^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:6:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:28: Error: Expected '}' before this.
+// main () { int x; print('${x' '); }
+//                            ^^^
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:31: Error: Expected a String, but got ')'.
+// main () { int x; print('${x' '); }
+//                               ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int x;
+  core::print("${x}");
+}
diff --git a/pkg/front_end/testcases/regress/issue_35900.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35900.dart.strong.transformed.expect
new file mode 100644
index 0000000..34c8236
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35900.dart.strong.transformed.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:25: Error: Can't find '}' to match '${'.
+// main () { int x; print('${x' '); }
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:24: Error: String starting with ' must end with '.
+// main () { int x; print('${x' '); }
+//                        ^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:6:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:28: Error: Expected '}' before this.
+// main () { int x; print('${x' '); }
+//                            ^^^
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:31: Error: Expected a String, but got ')'.
+// main () { int x; print('${x' '); }
+//                               ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int x;
+  core::print("${x}");
+}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.hierarchy.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.hierarchy.expect
index 570f5d0..5eaaea6 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.hierarchy.expect
@@ -38,6 +38,7 @@
   classSetters:
 
 C:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I<int>
@@ -71,6 +72,7 @@
   interfaceSetters:
 
 D:
+  Longest path to Object: 3
   superclasses:
     Object
       -> C<U>
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.hierarchy.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.hierarchy.expect
index a0755f9..3142f9e 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.hierarchy.expect
@@ -38,6 +38,7 @@
     C.x
 
 D:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: C
@@ -71,6 +72,7 @@
     D.x
 
 E:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: D, C
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.hierarchy.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.hierarchy.expect
index a0755f9..3142f9e 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.hierarchy.expect
@@ -38,6 +38,7 @@
     C.x
 
 D:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: C
@@ -71,6 +72,7 @@
     D.x
 
 E:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: D, C
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.hierarchy.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.hierarchy.expect
index 7a4dfeb..7242fb4 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.hierarchy.expect
@@ -56,6 +56,7 @@
     D.x
 
 E:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: D, C
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.hierarchy.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.hierarchy.expect
index be3c79b..c37a550 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.hierarchy.expect
@@ -39,6 +39,7 @@
     C.x
 
 D:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: C<num>
@@ -76,6 +77,7 @@
     D.x
 
 E:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: C<num>
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.hierarchy.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.hierarchy.expect
index 11d6411..7c05629 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.hierarchy.expect
@@ -37,6 +37,7 @@
     A.x
 
 B:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A
@@ -72,6 +73,7 @@
     B.x
 
 C:
+  Longest path to Object: 3
   superclasses:
     Object
   interfaces: B, A
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.hierarchy.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.hierarchy.expect
index 7b54720..eb5ae02 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.hierarchy.expect
@@ -40,6 +40,7 @@
     B.x
 
 C:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: B<num>
@@ -77,6 +78,7 @@
     C.x
 
 D:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: B<T>
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.hierarchy.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.hierarchy.expect
index e32d429..dc66ff9 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.hierarchy.expect
@@ -117,7 +117,7 @@
     Object
       -> B
         -> C<int>
-  interfaces: M<F<T>>, I<T>
+  interfaces: M<F<int>>, I<int>
   classMembers:
     D.f
     Object.toString
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.hierarchy.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.hierarchy.expect
index 86cc21b..dfb9fc6 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.hierarchy.expect
@@ -37,6 +37,7 @@
   classSetters:
 
 B:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A<F<T>>
@@ -68,6 +69,7 @@
   interfaceSetters:
 
 I:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: A<F<T>>
@@ -99,6 +101,7 @@
   interfaceSetters:
 
 C:
+  Longest path to Object: 3
   superclasses:
     Object
       -> B<F<T>>
diff --git a/pkg/front_end/testcases/spread_collection.dart.legacy.expect b/pkg/front_end/testcases/spread_collection.dart.legacy.expect
index e6445d9..4872fd1 100644
--- a/pkg/front_end/testcases/spread_collection.dart.legacy.expect
+++ b/pkg/front_end/testcases/spread_collection.dart.legacy.expect
@@ -18,6 +18,14 @@
 //   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
 //                                            ^^^^
 //
+// pkg/front_end/testcases/spread_collection.dart:7:36: Error: Expected ':' after this.
+//   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
+//                                    ^
+//
+// pkg/front_end/testcases/spread_collection.dart:7:48: Error: Expected ':' after this.
+//   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
+//                                                ^
+//
 // pkg/front_end/testcases/spread_collection.dart:8:25: Error: Unexpected token '...'.
 //   final aSet = <int>{1, ...[2], ...?[3]};
 //                         ^^^
@@ -30,6 +38,10 @@
 //   final aSetOrMap = {...foo()};
 //                      ^^^
 //
+// pkg/front_end/testcases/spread_collection.dart:9:25: Error: Expected ':' after this.
+//   final aSetOrMap = {...foo()};
+//                         ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/spread_collection.dart.legacy.transformed.expect b/pkg/front_end/testcases/spread_collection.dart.legacy.transformed.expect
index e6445d9..4872fd1 100644
--- a/pkg/front_end/testcases/spread_collection.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/spread_collection.dart.legacy.transformed.expect
@@ -18,6 +18,14 @@
 //   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
 //                                            ^^^^
 //
+// pkg/front_end/testcases/spread_collection.dart:7:36: Error: Expected ':' after this.
+//   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
+//                                    ^
+//
+// pkg/front_end/testcases/spread_collection.dart:7:48: Error: Expected ':' after this.
+//   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
+//                                                ^
+//
 // pkg/front_end/testcases/spread_collection.dart:8:25: Error: Unexpected token '...'.
 //   final aSet = <int>{1, ...[2], ...?[3]};
 //                         ^^^
@@ -30,6 +38,10 @@
 //   final aSetOrMap = {...foo()};
 //                      ^^^
 //
+// pkg/front_end/testcases/spread_collection.dart:9:25: Error: Expected ':' after this.
+//   final aSetOrMap = {...foo()};
+//                         ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/spread_collection.dart.strong.expect b/pkg/front_end/testcases/spread_collection.dart.strong.expect
index 8721adb..4b1c6d9 100644
--- a/pkg/front_end/testcases/spread_collection.dart.strong.expect
+++ b/pkg/front_end/testcases/spread_collection.dart.strong.expect
@@ -1,84 +1,31 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/spread_collection.dart:6:26: Error: Unexpected token '...'.
-//   final aList = <int>[1, ...[2], ...?[3]];
-//                          ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:6:34: Error: Unexpected token '...?'.
-//   final aList = <int>[1, ...[2], ...?[3]];
-//                                  ^^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:7:33: Error: Unexpected token '...'.
-//   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
-//                                 ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:7:44: Error: Unexpected token '...?'.
-//   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
-//                                            ^^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:8:25: Error: Unexpected token '...'.
-//   final aSet = <int>{1, ...[2], ...?[3]};
-//                         ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:8:33: Error: Unexpected token '...?'.
-//   final aSet = <int>{1, ...[2], ...?[3]};
-//                                 ^^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:9:22: Error: Unexpected token '...'.
-//   final aSetOrMap = {...foo()};
-//                      ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:6:29: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
-//  - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   final aList = <int>[1, ...[2], ...?[3]];
-//                             ^
-//
-// pkg/front_end/testcases/spread_collection.dart:6:38: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
-//  - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   final aList = <int>[1, ...[2], ...?[3]];
-//                                      ^
-//
-// pkg/front_end/testcases/spread_collection.dart:8:28: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
-//  - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   final aSet = <int>{1, ...[2], ...?[3]};
-//                            ^
-//
-// pkg/front_end/testcases/spread_collection.dart:8:37: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
-//  - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   final aSet = <int>{1, ...[2], ...?[3]};
-//                                     ^
-//
 import self as self;
 import "dart:core" as core;
 import "dart:collection" as col;
 
 static method main() → dynamic {
-  final core::List<core::int> aList = <core::int>[1, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/spread_collection.dart:6:29: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- - 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  final aList = <int>[1, ...[2], ...?[3]];
-                            ^" in <core::int>[2] as{TypeError} core::int, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/spread_collection.dart:6:38: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- - 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  final aList = <int>[1, ...[2], ...?[3]];
-                                     ^" in <core::int>[3] as{TypeError} core::int];
-  final core::Map<core::int, core::int> aMap = <core::int, core::int>{1: 1};
-  final core::Set<core::int> aSet = let final core::Set<core::int> #t3 = col::LinkedHashSet::•<core::int>() in let final dynamic #t4 = #t3.{core::Set::add}(1) in let final dynamic #t5 = #t3.{core::Set::add}(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/spread_collection.dart:8:28: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- - 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  final aSet = <int>{1, ...[2], ...?[3]};
-                           ^" in <core::int>[2] as{TypeError} core::int) in let final dynamic #t7 = #t3.{core::Set::add}(let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/spread_collection.dart:8:37: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- - 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  final aSet = <int>{1, ...[2], ...?[3]};
-                                    ^" in <core::int>[3] as{TypeError} core::int) in #t3;
-  final core::Map<dynamic, dynamic> aSetOrMap = <dynamic, dynamic>{};
+  final core::List<core::int> aList = block {
+    final core::List<core::int> #t1 = <core::int>[];
+    #t1.{core::List::add}(1);
+    for (final core::int #t2 in <core::int>[2])
+      #t1.{core::List::add}(#t2);
+    final dynamic #t3 = <core::int>[3];
+    if(!#t3.{core::Object::==}(null))
+      for (final core::int #t4 in #t3)
+        #t1.{core::List::add}(#t4);
+  } =>#t1;
+  final core::Map<core::int, core::int> aMap = <core::int, core::int>{1: 1, invalid-expression "unimplemented spread entry": null, invalid-expression "unimplemented spread entry": null};
+  final core::Set<core::int> aSet = block {
+    final core::Set<core::int> #t5 = col::LinkedHashSet::•<core::int>();
+    #t5.{core::Set::add}(1);
+    for (final core::int #t6 in <core::int>[2])
+      #t5.{core::Set::add}(#t6);
+    final dynamic #t7 = <core::int>[3];
+    if(!#t7.{core::Object::==}(null))
+      for (final core::int #t8 in #t7)
+        #t5.{core::Set::add}(#t8);
+  } =>#t5;
+  final core::Map<dynamic, dynamic> aSetOrMap = <dynamic, dynamic>{invalid-expression "unimplemented spread entry": null};
   core::print(aList);
   core::print(aSet);
   core::print(aMap);
diff --git a/pkg/front_end/testcases/spread_collection.dart.strong.transformed.expect b/pkg/front_end/testcases/spread_collection.dart.strong.transformed.expect
index 6ee5ecf..4b1c6d9 100644
--- a/pkg/front_end/testcases/spread_collection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/spread_collection.dart.strong.transformed.expect
@@ -1,84 +1,31 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/spread_collection.dart:6:26: Error: Unexpected token '...'.
-//   final aList = <int>[1, ...[2], ...?[3]];
-//                          ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:6:34: Error: Unexpected token '...?'.
-//   final aList = <int>[1, ...[2], ...?[3]];
-//                                  ^^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:7:33: Error: Unexpected token '...'.
-//   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
-//                                 ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:7:44: Error: Unexpected token '...?'.
-//   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
-//                                            ^^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:8:25: Error: Unexpected token '...'.
-//   final aSet = <int>{1, ...[2], ...?[3]};
-//                         ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:8:33: Error: Unexpected token '...?'.
-//   final aSet = <int>{1, ...[2], ...?[3]};
-//                                 ^^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:9:22: Error: Unexpected token '...'.
-//   final aSetOrMap = {...foo()};
-//                      ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:6:29: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
-//  - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   final aList = <int>[1, ...[2], ...?[3]];
-//                             ^
-//
-// pkg/front_end/testcases/spread_collection.dart:6:38: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
-//  - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   final aList = <int>[1, ...[2], ...?[3]];
-//                                      ^
-//
-// pkg/front_end/testcases/spread_collection.dart:8:28: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
-//  - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   final aSet = <int>{1, ...[2], ...?[3]};
-//                            ^
-//
-// pkg/front_end/testcases/spread_collection.dart:8:37: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
-//  - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   final aSet = <int>{1, ...[2], ...?[3]};
-//                                     ^
-//
 import self as self;
 import "dart:core" as core;
 import "dart:collection" as col;
 
 static method main() → dynamic {
-  final core::List<core::int> aList = <core::int>[1, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/spread_collection.dart:6:29: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- - 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  final aList = <int>[1, ...[2], ...?[3]];
-                            ^" in <core::int>[2] as{TypeError} core::int, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/spread_collection.dart:6:38: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- - 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  final aList = <int>[1, ...[2], ...?[3]];
-                                     ^" in <core::int>[3] as{TypeError} core::int];
-  final core::Map<core::int, core::int> aMap = <core::int, core::int>{1: 1};
-  final core::Set<core::int> aSet = let final core::Set<core::int> #t3 = col::LinkedHashSet::•<core::int>() in let final core::bool #t4 = #t3.{core::Set::add}(1) in let final core::bool #t5 = #t3.{core::Set::add}(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/spread_collection.dart:8:28: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- - 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  final aSet = <int>{1, ...[2], ...?[3]};
-                           ^" in <core::int>[2] as{TypeError} core::int) in let final core::bool #t7 = #t3.{core::Set::add}(let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/spread_collection.dart:8:37: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- - 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  final aSet = <int>{1, ...[2], ...?[3]};
-                                    ^" in <core::int>[3] as{TypeError} core::int) in #t3;
-  final core::Map<dynamic, dynamic> aSetOrMap = <dynamic, dynamic>{};
+  final core::List<core::int> aList = block {
+    final core::List<core::int> #t1 = <core::int>[];
+    #t1.{core::List::add}(1);
+    for (final core::int #t2 in <core::int>[2])
+      #t1.{core::List::add}(#t2);
+    final dynamic #t3 = <core::int>[3];
+    if(!#t3.{core::Object::==}(null))
+      for (final core::int #t4 in #t3)
+        #t1.{core::List::add}(#t4);
+  } =>#t1;
+  final core::Map<core::int, core::int> aMap = <core::int, core::int>{1: 1, invalid-expression "unimplemented spread entry": null, invalid-expression "unimplemented spread entry": null};
+  final core::Set<core::int> aSet = block {
+    final core::Set<core::int> #t5 = col::LinkedHashSet::•<core::int>();
+    #t5.{core::Set::add}(1);
+    for (final core::int #t6 in <core::int>[2])
+      #t5.{core::Set::add}(#t6);
+    final dynamic #t7 = <core::int>[3];
+    if(!#t7.{core::Object::==}(null))
+      for (final core::int #t8 in #t7)
+        #t5.{core::Set::add}(#t8);
+  } =>#t5;
+  final core::Map<dynamic, dynamic> aSetOrMap = <dynamic, dynamic>{invalid-expression "unimplemented spread entry": null};
   core::print(aList);
   core::print(aSet);
   core::print(aMap);
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart b/pkg/front_end/testcases/spread_collection_inference.dart
new file mode 100644
index 0000000..c1cfb85
--- /dev/null
+++ b/pkg/front_end/testcases/spread_collection_inference.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test case checks that inference works for spread collections, and that
+// the errors are reported when necessary.
+
+/*@testedFeatures=inference,error*/
+
+foo() {
+  List<int> spread = <int>[1, 2, 3];
+  int notSpreadInt = 42;
+  int Function() notSpreadFunction = null;
+
+  var /*@type=List<dynamic>*/ lhs10 = /*@typeArgs=dynamic*/ [...
+    /*@typeArgs=dynamic*/ []];
+
+  var /*@type=Set<dynamic>*/ set10 = <dynamic>{... /*@typeArgs=dynamic*/ []};
+
+  var /*@type=List<int>*/ lhs20 = /*@typeArgs=int*/ [...spread];
+
+  var /*@type=Set<int>*/ set20 = /*@typeArgs=int*/ {...spread, 42};
+
+  var /*@type=List<dynamic>*/ lhs21 = /*@typeArgs=dynamic*/ [...(spread as
+      dynamic)];
+
+  var /*@type=Set<dynamic>*/ set21 = /*@typeArgs=dynamic*/ {...(spread as
+      dynamic), 42};
+
+  List<int> lhs22 = /*@typeArgs=int*/ [... /*@typeArgs=int*/ []];
+
+  Set<int> set22 = /*@typeArgs=int*/ {... /*@typeArgs=int*/ [], 42};
+
+  List<List<int>> lhs23 = /*@typeArgs=List<int>*/ [... /*@typeArgs=List<int>*/
+    [/*@typeArgs=int*/ []]];
+
+  Set<List<int>> set23 = /*@typeArgs=List<int>*/ {... /*@typeArgs=List<int>*/
+    [/*@typeArgs=int*/ []], <int>[42]};
+
+  int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
+
+  int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
+
+  List<dynamic> lhs40 = <dynamic>[... /*@error=SpreadTypeMismatch*/
+    notSpreadInt];
+
+  Set<dynamic> set40 = <dynamic>{... /*@error=SpreadTypeMismatch*/
+    notSpreadInt};
+
+  List<dynamic> lhs50 = <dynamic> [... /*@error=SpreadTypeMismatch*/
+    notSpreadFunction];
+
+  Set<dynamic> set50 = <dynamic> {... /*@error=SpreadTypeMismatch*/
+    notSpreadFunction};
+
+  List<String> lhs60 = <String>[... /*@error=SpreadElementTypeMismatch*/
+    spread];
+
+  Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.legacy.expect b/pkg/front_end/testcases/spread_collection_inference.dart.legacy.expect
new file mode 100644
index 0000000..8af1aa9
--- /dev/null
+++ b/pkg/front_end/testcases/spread_collection_inference.dart.legacy.expect
@@ -0,0 +1,103 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:15:62: Error: Unexpected token '...'.
+//   var /*@type=List<dynamic>*/ lhs10 = /*@typeArgs=dynamic*/ [...
+//                                                              ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:18:48: Error: Unexpected token '...'.
+//   var /*@type=Set<dynamic>*/ set10 = <dynamic>{... /*@typeArgs=dynamic*/ []};
+//                                                ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:20:54: Error: Unexpected token '...'.
+//   var /*@type=List<int>*/ lhs20 = /*@typeArgs=int*/ [...spread];
+//                                                      ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:22:53: Error: Unexpected token '...'.
+//   var /*@type=Set<int>*/ set20 = /*@typeArgs=int*/ {...spread, 42};
+//                                                     ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:24:62: Error: Unexpected token '...'.
+//   var /*@type=List<dynamic>*/ lhs21 = /*@typeArgs=dynamic*/ [...(spread as
+//                                                              ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:27:61: Error: Unexpected token '...'.
+//   var /*@type=Set<dynamic>*/ set21 = /*@typeArgs=dynamic*/ {...(spread as
+//                                                             ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:30:40: Error: Unexpected token '...'.
+//   List<int> lhs22 = /*@typeArgs=int*/ [... /*@typeArgs=int*/ []];
+//                                        ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:32:39: Error: Unexpected token '...'.
+//   Set<int> set22 = /*@typeArgs=int*/ {... /*@typeArgs=int*/ [], 42};
+//                                       ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:34:52: Error: Unexpected token '...'.
+//   List<List<int>> lhs23 = /*@typeArgs=List<int>*/ [... /*@typeArgs=List<int>*/
+//                                                    ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:37:51: Error: Unexpected token '...'.
+//   Set<List<int>> set23 = /*@typeArgs=List<int>*/ {... /*@typeArgs=List<int>*/
+//                                                   ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:40:63: Error: Unexpected token '...'.
+//   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
+//                                                               ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:42:63: Error: Unexpected token '...'.
+//   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:44:35: Error: Unexpected token '...'.
+//   List<dynamic> lhs40 = <dynamic>[... /*@error=SpreadTypeMismatch*/
+//                                   ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:47:34: Error: Unexpected token '...'.
+//   Set<dynamic> set40 = <dynamic>{... /*@error=SpreadTypeMismatch*/
+//                                  ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:50:36: Error: Unexpected token '...'.
+//   List<dynamic> lhs50 = <dynamic> [... /*@error=SpreadTypeMismatch*/
+//                                    ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:53:35: Error: Unexpected token '...'.
+//   Set<dynamic> set50 = <dynamic> {... /*@error=SpreadTypeMismatch*/
+//                                   ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:56:33: Error: Unexpected token '...'.
+//   List<String> lhs60 = <String>[... /*@error=SpreadElementTypeMismatch*/
+//                                 ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:59:32: Error: Unexpected token '...'.
+//   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
+//                                ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method foo() → dynamic {
+  core::List<core::int> spread = <core::int>[1, 2, 3];
+  core::int notSpreadInt = 42;
+  () → core::int notSpreadFunction = null;
+  dynamic lhs10 = <dynamic>[<dynamic>[]];
+  dynamic set10 = <dynamic>{<dynamic>[]};
+  dynamic lhs20 = <dynamic>[spread];
+  dynamic set20 = <dynamic>{spread, 42};
+  dynamic lhs21 = <dynamic>[spread as dynamic];
+  dynamic set21 = <dynamic>{spread as dynamic, 42};
+  core::List<core::int> lhs22 = <dynamic>[<dynamic>[]];
+  core::Set<core::int> set22 = <dynamic>{<dynamic>[], 42};
+  core::List<core::List<core::int>> lhs23 = <dynamic>[<dynamic>[<dynamic>[]]];
+  core::Set<core::List<core::int>> set23 = <dynamic>{<dynamic>[<dynamic>[]], <core::int>[42]};
+  core::int lhs30 = <dynamic>[spread];
+  core::int set30 = <dynamic>{spread, 42};
+  core::List<dynamic> lhs40 = <dynamic>[notSpreadInt];
+  core::Set<dynamic> set40 = <dynamic>{notSpreadInt};
+  core::List<dynamic> lhs50 = <dynamic>[notSpreadFunction];
+  core::Set<dynamic> set50 = <dynamic>{notSpreadFunction};
+  core::List<core::String> lhs60 = <core::String>[spread];
+  core::Set<core::String> set60 = <core::String>{spread};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect
new file mode 100644
index 0000000..8af1aa9
--- /dev/null
+++ b/pkg/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect
@@ -0,0 +1,103 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:15:62: Error: Unexpected token '...'.
+//   var /*@type=List<dynamic>*/ lhs10 = /*@typeArgs=dynamic*/ [...
+//                                                              ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:18:48: Error: Unexpected token '...'.
+//   var /*@type=Set<dynamic>*/ set10 = <dynamic>{... /*@typeArgs=dynamic*/ []};
+//                                                ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:20:54: Error: Unexpected token '...'.
+//   var /*@type=List<int>*/ lhs20 = /*@typeArgs=int*/ [...spread];
+//                                                      ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:22:53: Error: Unexpected token '...'.
+//   var /*@type=Set<int>*/ set20 = /*@typeArgs=int*/ {...spread, 42};
+//                                                     ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:24:62: Error: Unexpected token '...'.
+//   var /*@type=List<dynamic>*/ lhs21 = /*@typeArgs=dynamic*/ [...(spread as
+//                                                              ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:27:61: Error: Unexpected token '...'.
+//   var /*@type=Set<dynamic>*/ set21 = /*@typeArgs=dynamic*/ {...(spread as
+//                                                             ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:30:40: Error: Unexpected token '...'.
+//   List<int> lhs22 = /*@typeArgs=int*/ [... /*@typeArgs=int*/ []];
+//                                        ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:32:39: Error: Unexpected token '...'.
+//   Set<int> set22 = /*@typeArgs=int*/ {... /*@typeArgs=int*/ [], 42};
+//                                       ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:34:52: Error: Unexpected token '...'.
+//   List<List<int>> lhs23 = /*@typeArgs=List<int>*/ [... /*@typeArgs=List<int>*/
+//                                                    ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:37:51: Error: Unexpected token '...'.
+//   Set<List<int>> set23 = /*@typeArgs=List<int>*/ {... /*@typeArgs=List<int>*/
+//                                                   ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:40:63: Error: Unexpected token '...'.
+//   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
+//                                                               ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:42:63: Error: Unexpected token '...'.
+//   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:44:35: Error: Unexpected token '...'.
+//   List<dynamic> lhs40 = <dynamic>[... /*@error=SpreadTypeMismatch*/
+//                                   ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:47:34: Error: Unexpected token '...'.
+//   Set<dynamic> set40 = <dynamic>{... /*@error=SpreadTypeMismatch*/
+//                                  ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:50:36: Error: Unexpected token '...'.
+//   List<dynamic> lhs50 = <dynamic> [... /*@error=SpreadTypeMismatch*/
+//                                    ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:53:35: Error: Unexpected token '...'.
+//   Set<dynamic> set50 = <dynamic> {... /*@error=SpreadTypeMismatch*/
+//                                   ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:56:33: Error: Unexpected token '...'.
+//   List<String> lhs60 = <String>[... /*@error=SpreadElementTypeMismatch*/
+//                                 ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:59:32: Error: Unexpected token '...'.
+//   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
+//                                ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method foo() → dynamic {
+  core::List<core::int> spread = <core::int>[1, 2, 3];
+  core::int notSpreadInt = 42;
+  () → core::int notSpreadFunction = null;
+  dynamic lhs10 = <dynamic>[<dynamic>[]];
+  dynamic set10 = <dynamic>{<dynamic>[]};
+  dynamic lhs20 = <dynamic>[spread];
+  dynamic set20 = <dynamic>{spread, 42};
+  dynamic lhs21 = <dynamic>[spread as dynamic];
+  dynamic set21 = <dynamic>{spread as dynamic, 42};
+  core::List<core::int> lhs22 = <dynamic>[<dynamic>[]];
+  core::Set<core::int> set22 = <dynamic>{<dynamic>[], 42};
+  core::List<core::List<core::int>> lhs23 = <dynamic>[<dynamic>[<dynamic>[]]];
+  core::Set<core::List<core::int>> set23 = <dynamic>{<dynamic>[<dynamic>[]], <core::int>[42]};
+  core::int lhs30 = <dynamic>[spread];
+  core::int set30 = <dynamic>{spread, 42};
+  core::List<dynamic> lhs40 = <dynamic>[notSpreadInt];
+  core::Set<dynamic> set40 = <dynamic>{notSpreadInt};
+  core::List<dynamic> lhs50 = <dynamic>[notSpreadFunction];
+  core::Set<dynamic> set50 = <dynamic>{notSpreadFunction};
+  core::List<core::String> lhs60 = <core::String>[spread];
+  core::Set<core::String> set60 = <core::String>{spread};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.outline.expect b/pkg/front_end/testcases/spread_collection_inference.dart.outline.expect
new file mode 100644
index 0000000..07ce31d
--- /dev/null
+++ b/pkg/front_end/testcases/spread_collection_inference.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.strong.expect b/pkg/front_end/testcases/spread_collection_inference.dart.strong.expect
new file mode 100644
index 0000000..c93245e
--- /dev/null
+++ b/pkg/front_end/testcases/spread_collection_inference.dart.strong.expect
@@ -0,0 +1,141 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:40:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+//  - 'List' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
+//                                                              ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:42:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+//  - 'Set' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
+//                                                              ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:45:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+//     notSpreadInt];
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:48:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+//     notSpreadInt};
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:51:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+//     notSpreadFunction];
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:54:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+//     notSpreadFunction};
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:57:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+//     spread];
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:59:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+//   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
+//                                                                         ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method foo() → dynamic {
+  core::List<core::int> spread = <core::int>[1, 2, 3];
+  core::int notSpreadInt = 42;
+  () → core::int notSpreadFunction = null;
+  core::List<dynamic> lhs10 = block {
+    final core::List<dynamic> #t1 = <dynamic>[];
+    for (final dynamic #t2 in <dynamic>[])
+      #t1.{core::List::add}(#t2);
+  } =>#t1;
+  core::Set<dynamic> set10 = block {
+    final core::Set<dynamic> #t3 = col::LinkedHashSet::•<dynamic>();
+    for (final dynamic #t4 in <dynamic>[])
+      #t3.{core::Set::add}(#t4);
+  } =>#t3;
+  core::List<core::int> lhs20 = block {
+    final core::List<core::int> #t5 = <core::int>[];
+    for (final core::int #t6 in spread)
+      #t5.{core::List::add}(#t6);
+  } =>#t5;
+  core::Set<core::int> set20 = block {
+    final core::Set<core::int> #t7 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t8 in spread)
+      #t7.{core::Set::add}(#t8);
+    #t7.{core::Set::add}(42);
+  } =>#t7;
+  core::List<dynamic> lhs21 = block {
+    final core::List<dynamic> #t9 = <dynamic>[];
+    for (final dynamic #t10 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
+      #t9.{core::List::add}(#t10);
+  } =>#t9;
+  core::Set<dynamic> set21 = block {
+    final core::Set<dynamic> #t11 = col::LinkedHashSet::•<dynamic>();
+    for (final dynamic #t12 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
+      #t11.{core::Set::add}(#t12);
+    #t11.{core::Set::add}(42);
+  } =>#t11;
+  core::List<core::int> lhs22 = block {
+    final core::List<core::int> #t13 = <core::int>[];
+    for (final core::int #t14 in <core::int>[])
+      #t13.{core::List::add}(#t14);
+  } =>#t13;
+  core::Set<core::int> set22 = block {
+    final core::Set<core::int> #t15 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t16 in <core::int>[])
+      #t15.{core::Set::add}(#t16);
+    #t15.{core::Set::add}(42);
+  } =>#t15;
+  core::List<core::List<core::int>> lhs23 = block {
+    final core::List<core::List<core::int>> #t17 = <core::List<core::int>>[];
+    for (final core::List<core::int> #t18 in <core::List<core::int>>[<core::int>[]])
+      #t17.{core::List::add}(#t18);
+  } =>#t17;
+  core::Set<core::List<core::int>> set23 = block {
+    final core::Set<core::List<core::int>> #t19 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (final core::List<core::int> #t20 in <core::List<core::int>>[<core::int>[]])
+      #t19.{core::Set::add}(#t20);
+    #t19.{core::Set::add}(<core::int>[42]);
+  } =>#t19;
+  core::int lhs30 = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:40:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
+                                                             ^" in ( block {
+    final core::List<core::int> #t22 = <core::int>[];
+    for (final core::int #t23 in spread)
+      #t22.{core::List::add}(#t23);
+  } =>#t22) as{TypeError} core::int;
+  core::int set30 = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:42:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+ - 'Set' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
+                                                             ^" in ( block {
+    final core::Set<core::int> #t25 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t26 in spread)
+      #t25.{core::Set::add}(#t26);
+    #t25.{core::Set::add}(42);
+  } =>#t25) as{TypeError} core::int;
+  core::List<dynamic> lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:45:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+    notSpreadInt];
+    ^"];
+  core::Set<dynamic> set40 = let final core::Set<dynamic> #t27 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t28 = #t27.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:48:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+    notSpreadInt};
+    ^") in #t27;
+  core::List<dynamic> lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:51:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+    notSpreadFunction];
+    ^"];
+  core::Set<dynamic> set50 = let final core::Set<dynamic> #t29 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t30 = #t29.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:54:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+    notSpreadFunction};
+    ^") in #t29;
+  core::List<core::String> lhs60 = <core::String>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:57:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+    spread];
+    ^"];
+  core::Set<core::String> set60 = let final core::Set<core::String> #t31 = col::LinkedHashSet::•<core::String>() in let final dynamic #t32 = #t31.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:59:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
+                                                                        ^") in #t31;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..81ec36f
--- /dev/null
+++ b/pkg/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect
@@ -0,0 +1,141 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:40:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+//  - 'List' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
+//                                                              ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:42:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+//  - 'Set' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
+//                                                              ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:45:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+//     notSpreadInt];
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:48:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+//     notSpreadInt};
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:51:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+//     notSpreadFunction];
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:54:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+//     notSpreadFunction};
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:57:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+//     spread];
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:59:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+//   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
+//                                                                         ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method foo() → dynamic {
+  core::List<core::int> spread = <core::int>[1, 2, 3];
+  core::int notSpreadInt = 42;
+  () → core::int notSpreadFunction = null;
+  core::List<dynamic> lhs10 = block {
+    final core::List<dynamic> #t1 = <dynamic>[];
+    for (final dynamic #t2 in <dynamic>[])
+      #t1.{core::List::add}(#t2);
+  } =>#t1;
+  core::Set<dynamic> set10 = block {
+    final core::Set<dynamic> #t3 = col::LinkedHashSet::•<dynamic>();
+    for (final dynamic #t4 in <dynamic>[])
+      #t3.{core::Set::add}(#t4);
+  } =>#t3;
+  core::List<core::int> lhs20 = block {
+    final core::List<core::int> #t5 = <core::int>[];
+    for (final core::int #t6 in spread)
+      #t5.{core::List::add}(#t6);
+  } =>#t5;
+  core::Set<core::int> set20 = block {
+    final core::Set<core::int> #t7 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t8 in spread)
+      #t7.{core::Set::add}(#t8);
+    #t7.{core::Set::add}(42);
+  } =>#t7;
+  core::List<dynamic> lhs21 = block {
+    final core::List<dynamic> #t9 = <dynamic>[];
+    for (final dynamic #t10 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
+      #t9.{core::List::add}(#t10);
+  } =>#t9;
+  core::Set<dynamic> set21 = block {
+    final core::Set<dynamic> #t11 = col::LinkedHashSet::•<dynamic>();
+    for (final dynamic #t12 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
+      #t11.{core::Set::add}(#t12);
+    #t11.{core::Set::add}(42);
+  } =>#t11;
+  core::List<core::int> lhs22 = block {
+    final core::List<core::int> #t13 = <core::int>[];
+    for (final core::int #t14 in <core::int>[])
+      #t13.{core::List::add}(#t14);
+  } =>#t13;
+  core::Set<core::int> set22 = block {
+    final core::Set<core::int> #t15 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t16 in <core::int>[])
+      #t15.{core::Set::add}(#t16);
+    #t15.{core::Set::add}(42);
+  } =>#t15;
+  core::List<core::List<core::int>> lhs23 = block {
+    final core::List<core::List<core::int>> #t17 = <core::List<core::int>>[];
+    for (final core::List<core::int> #t18 in <core::List<core::int>>[<core::int>[]])
+      #t17.{core::List::add}(#t18);
+  } =>#t17;
+  core::Set<core::List<core::int>> set23 = block {
+    final core::Set<core::List<core::int>> #t19 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (final core::List<core::int> #t20 in <core::List<core::int>>[<core::int>[]])
+      #t19.{core::Set::add}(#t20);
+    #t19.{core::Set::add}(<core::int>[42]);
+  } =>#t19;
+  core::int lhs30 = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:40:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
+                                                             ^" in ( block {
+    final core::List<core::int> #t22 = <core::int>[];
+    for (final core::int #t23 in spread)
+      #t22.{core::List::add}(#t23);
+  } =>#t22) as{TypeError} core::int;
+  core::int set30 = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:42:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+ - 'Set' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
+                                                             ^" in ( block {
+    final core::Set<core::int> #t25 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t26 in spread)
+      #t25.{core::Set::add}(#t26);
+    #t25.{core::Set::add}(42);
+  } =>#t25) as{TypeError} core::int;
+  core::List<dynamic> lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:45:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+    notSpreadInt];
+    ^"];
+  core::Set<dynamic> set40 = let final core::Set<dynamic> #t27 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t28 = #t27.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:48:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+    notSpreadInt};
+    ^") in #t27;
+  core::List<dynamic> lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:51:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+    notSpreadFunction];
+    ^"];
+  core::Set<dynamic> set50 = let final core::Set<dynamic> #t29 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t30 = #t29.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:54:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+    notSpreadFunction};
+    ^") in #t29;
+  core::List<core::String> lhs60 = <core::String>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:57:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+    spread];
+    ^"];
+  core::Set<core::String> set60 = let final core::Set<core::String> #t31 = col::LinkedHashSet::•<core::String>() in let final core::bool #t32 = #t31.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:59:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
+                                                                        ^") in #t31;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 1fde8dc..25ac322 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -146,8 +146,8 @@
 runtime_checks_new/mixin_forwarding_stub_getter: TypeCheckError
 runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
 set_literals/disambiguation_rule: RuntimeError
+spread_collection: RuntimeError
 statements: Crash
-spread_collection: RuntimeError # Should be fixed as part of implementing spread collection support
 type_variable_as_super: RuntimeError
 type_variable_prefix: RuntimeError
 unsound_promotion: RuntimeError
diff --git a/pkg/front_end/testcases/super_nsm.dart.hierarchy.expect b/pkg/front_end/testcases/super_nsm.dart.hierarchy.expect
index bfe9aef..368b420 100644
--- a/pkg/front_end/testcases/super_nsm.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/super_nsm.dart.hierarchy.expect
@@ -37,6 +37,7 @@
   classSetters:
 
 C:
+  Longest path to Object: 2
   superclasses:
     Object
   interfaces: I
@@ -67,6 +68,7 @@
   interfaceSetters:
 
 D:
+  Longest path to Object: 3
   superclasses:
     Object
       -> C
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 0027189..fe97d6b 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -6,17 +6,18 @@
 # the round trip for Kernel textual serialization where the initial binary
 # Kernel files are produced by compiling Dart code via Fasta.
 
+DeltaBlue: TextSerializationFailure # Was: Pass
 abstract_members: TypeCheckError
 accessors: TextSerializationFailure # Was: RuntimeError
-ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
+ambiguous_exports: TextSerializationFailure # Was: RuntimeError # Expected, this file exports two main methods.
 annotation_eof: TextSerializationFailure # Was: Pass
 annotation_on_enum_values: TextSerializationFailure # Was: Pass
 annotation_top: TextSerializationFailure # Was: Pass
-annotation_typedef_formals_resolution: TextSerializationFailure # Was: Pass
 annotation_typedef_formals: TextSerializationFailure # Was: Pass
+annotation_typedef_formals_resolution: TextSerializationFailure # Was: Pass
 annotation_variable_declaration: TextSerializationFailure # Was: Pass
-argument_mismatch: InstrumentationMismatch # Test assumes Dart 1.0 semantics
 argument: TextSerializationFailure # Was: Pass
+argument_mismatch: InstrumentationMismatch # Test assumes Dart 1.0 semantics
 arithmetic: TextSerializationFailure # Was: Pass
 arrow_function: TextSerializationFailure # Was: Pass
 async_function: TextSerializationFailure # Was: Pass
@@ -49,8 +50,8 @@
 check_deferred_before_call: TextSerializationFailure # Was: Pass
 check_deferred_before_write: TextSerializationFailure # Was: Pass
 check_deferred_is_check: TextSerializationFailure # Was: Pass
-check_deferred_read_static_field: TextSerializationFailure # Was: Pass
 check_deferred_read: TextSerializationFailure # Was: Pass
+check_deferred_read_static_field: TextSerializationFailure # Was: Pass
 check_deferred_read_type: TextSerializationFailure # Was: Pass
 check_deferred_static_method_call: TextSerializationFailure # Was: Pass
 check_deferred_type_declaration: TextSerializationFailure # Was: Pass
@@ -64,20 +65,19 @@
 constructor_cycle: TextSerializationFailure # Was: Pass
 constructor_function_types: TextSerializationFailure # Was: Pass
 constructor_initializer_invalid: TextSerializationFailure # Was: RuntimeError # Fails execution after recovery
-continue_inference_after_error_lib: TextSerializationFailure # Was: Pass
 continue_inference_after_error: TextSerializationFailure # Was: Pass
+continue_inference_after_error_lib: TextSerializationFailure # Was: Pass
 covariant_generic: TextSerializationFailure # Was: RuntimeError
 cycles: TextSerializationFailure # Was: Pass
 default_values: TextSerializationFailure # Was: Pass
 deferred_lib: TextSerializationFailure # Was: Pass
 deferred_type_annotation: TextSerializationFailure # Was: Pass
-DeltaBlue: TextSerializationFailure # Was: Pass
+duplicated_bad_prefix: TextSerializationFailure # Was: Pass
 duplicated_bad_prefix_lib1: TextSerializationFailure # Was: Pass
 duplicated_bad_prefix_lib2: TextSerializationFailure # Was: Pass
-duplicated_bad_prefix: TextSerializationFailure # Was: Pass
+duplicated_declarations: TypeCheckError
 duplicated_declarations_lib: TextSerializationFailure # Was: Pass
 duplicated_declarations_part: TextSerializationFailure # Was: Pass
-duplicated_declarations: TypeCheckError
 duplicated_field_initializer: TextSerializationFailure # Was: RuntimeError
 duplicated_named_args_3: TextSerializationFailure # Was: Pass
 dynamic_and_void: InstrumentationMismatch # Test assumes Dart 1.0 semantics
@@ -87,34 +87,35 @@
 expression/eval: TextSerializationFailure # Was: Pass
 expression/main: TextSerializationFailure # Was: Pass
 expressions: TextSerializationFailure # Was: RuntimeError
-external_import: TextSerializationFailure # Was: RuntimeError # The native extension to import doesn't exist. This is ok.
 external: TextSerializationFailure # Was: Pass
+external_import: TextSerializationFailure # Was: RuntimeError # The native extension to import doesn't exist. This is ok.
 fallthrough: ExpectationFileMismatch
 fibonacci: TextSerializationFailure # Was: Pass
 for_in_scope: TextSerializationFailure # Was: Pass
 for_in_without_declaration: TextSerializationFailure
 function_in_field: TextSerializationFailure # Was: Pass
-functions: TextSerializationFailure # Was: Pass
 function_type_assignments: TextSerializationFailure # Was: Pass
+function_type_default_value: TextSerializationFailure
 function_type_is_check: TextSerializationFailure # Was: Pass
 function_type_recovery: TextSerializationFailure # Was: Pass
+functions: TextSerializationFailure # Was: Pass
 future_or_test: TextSerializationFailure # Was: Pass
 hello: TextSerializationFailure # Was: Pass
-illegal_named_function_expression_scope: TextSerializationFailure # Was: Pass
 illegal_named_function_expression: TextSerializationFailure # Was: Pass
+illegal_named_function_expression_scope: TextSerializationFailure # Was: Pass
 implicit_const_with_static_fields: TextSerializationFailure # Was: Pass
 implicit_new: TextSerializationFailure # Was: Pass
 implicit_scope_test: TextSerializationFailure # Was: Pass
 implicit_this: TextSerializationFailure # Was: Pass
 incomplete_field_formal_parameter: TextSerializationFailure # Was: RuntimeError
 inference/abstract_class_instantiation: InstrumentationMismatch # Issue #30040
-inference/assert_initializer: TextSerializationFailure # Was: Pass
 inference/assert: TextSerializationFailure # Was: Pass
+inference/assert_initializer: TextSerializationFailure # Was: Pass
 inference/assign_local: TextSerializationFailure # Was: Pass
 inference/async_await: TextSerializationFailure # Was: Pass
 inference/async_closure_return_type_flatten: TextSerializationFailure # Was: Pass
-inference/async_closure_return_type_future_or: TextSerializationFailure # Was: Pass
 inference/async_closure_return_type_future: TextSerializationFailure # Was: Pass
+inference/async_closure_return_type_future_or: TextSerializationFailure # Was: Pass
 inference/block_bodied_lambdas_async_all_returns_are_futures: TextSerializationFailure # Was: Pass
 inference/block_bodied_lambdas_async_all_returns_are_values: TextSerializationFailure # Was: Pass
 inference/block_bodied_lambdas_async_mix_of_values_and_futures: TextSerializationFailure # Was: Pass
@@ -123,34 +124,34 @@
 inference/block_bodied_lambdas_basic_void: TextSerializationFailure # Was: Pass
 inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference: TextSerializationFailure # Was: Pass
 inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_infer_bottom_async_star: TextSerializationFailure # Was: Pass
 inference/block_bodied_lambdas_infer_bottom_async: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_infer_bottom_sync_star: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_infer_bottom_async_star: TextSerializationFailure # Was: Pass
 inference/block_bodied_lambdas_infer_bottom_sync: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_infer_bottom_sync_star: TextSerializationFailure # Was: Pass
 inference/block_bodied_lambdas_lub: TextSerializationFailure # Was: Pass
 inference/block_bodied_lambdas_nested_lambdas: TextSerializationFailure # Was: Pass
 inference/block_bodied_lambdas_no_return: TextSerializationFailure # Was: Pass
 inference/block_bodied_lambdas_returns: TextSerializationFailure # Was: Pass
 inference/block_bodied_lambdas_sync_star: TextSerializationFailure # Was: Pass
 inference/block_bodied_lambdas_void_context: TextSerializationFailure # Was: Pass
-inference/bottom_in_closure: TextSerializationFailure # Was: Pass
 inference/bottom: TextSerializationFailure # Was: Pass
+inference/bottom_in_closure: TextSerializationFailure # Was: Pass
 inference/bug30251: TextSerializationFailure # Was: Pass
+inference/bug30620: TextSerializationFailure # Was: Pass
 inference/bug30620_b: TextSerializationFailure # Was: Pass
 inference/bug30620_c: TextSerializationFailure # Was: Pass
 inference/bug30620_d: TextSerializationFailure # Was: Pass
-inference/bug30620: TextSerializationFailure # Was: Pass
 inference/bug30624: TextSerializationFailure # Was: Pass
 inference/bug31132: TextSerializationFailure # Was: Pass
 inference/bug31133: TextSerializationFailure # Was: Pass
 inference/bug31436: TextSerializationFailure # Was: Pass
 inference/bug32291: TextSerializationFailure # Was: Pass
 inference/bug33324: TextSerializationFailure # Was: Pass
-inference/callable_generic_class: TextSerializationFailure # Was: Pass
 inference/call_corner_cases: TextSerializationFailure # Was: Pass
+inference/callable_generic_class: TextSerializationFailure # Was: Pass
 inference/circular_method_inference: TextSerializationFailure # Was: Pass
-inference/circular_reference_via_closures_initializer_types: TextSerializationFailure # Was: Pass
 inference/circular_reference_via_closures: TextSerializationFailure # Was: Pass
+inference/circular_reference_via_closures_initializer_types: TextSerializationFailure # Was: Pass
 inference/closure_param_null_to_object: TextSerializationFailure # Was: Pass
 inference/coerce_bottom_and_null_types: TextSerializationFailure # Was: Pass
 inference/complex_predecrement: TextSerializationFailure # Was: Pass
@@ -159,19 +160,19 @@
 inference/conflicts_can_happen2: TypeCheckError
 inference/conflicts_can_happen: TypeCheckError
 inference/constructors_downwards_with_constraint: TextSerializationFailure # Was: Pass
-inference/constructors_inference_f_bounded: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments: TextSerializationFailure # Was: Pass
 inference/constructors_infer_from_arguments_argument_not_assignable: TypeCheckError
 inference/constructors_infer_from_arguments_const: TextSerializationFailure # Was: Pass
 inference/constructors_infer_from_arguments_const_with_upper_bound: TextSerializationFailure # Was: Pass
 inference/constructors_infer_from_arguments_downwards_from_constructor: TextSerializationFailure # Was: Pass
-inference/constructors_infer_from_arguments_factory_calls_constructor: TextSerializationFailure # Was: Pass
 inference/constructors_infer_from_arguments_factory: TextSerializationFailure # Was: Pass
-inference/constructors_infer_from_arguments_named_factory: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments_factory_calls_constructor: TextSerializationFailure # Was: Pass
 inference/constructors_infer_from_arguments_named: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments_named_factory: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments_redirecting: TextSerializationFailure # Was: Pass
 inference/constructors_infer_from_arguments_redirecting_factory: TextSerializationFailure # Was: Pass
 inference/constructors_infer_from_arguments_redirecting_factory_to_factory: TextSerializationFailure # Was: Pass
-inference/constructors_infer_from_arguments_redirecting: TextSerializationFailure # Was: Pass
-inference/constructors_infer_from_arguments: TextSerializationFailure # Was: Pass
+inference/constructors_inference_f_bounded: TextSerializationFailure # Was: Pass
 inference/constructors_reverse_type_parameters: TextSerializationFailure # Was: Pass
 inference/constructors_too_many_positional_arguments: InstrumentationMismatch # Issue #30040
 inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer: TypeCheckError
@@ -181,22 +182,22 @@
 inference/downward_inference_fixes_no_upwards_errors: TextSerializationFailure # Was: Pass
 inference/downward_inference_miscellaneous: TextSerializationFailure # Was: Pass
 inference/downwards_context_from_inferred_field_type: TextSerializationFailure # Was: Pass
+inference/downwards_inference_annotations: TextSerializationFailure # Was: Pass
 inference/downwards_inference_annotations_class_members: TextSerializationFailure # Was: Pass
 inference/downwards_inference_annotations_for_loop_variable: TextSerializationFailure # Was: Pass
-inference/downwards_inference_annotations_locals_referring_to_locals: TextSerializationFailure # Was: Pass
 inference/downwards_inference_annotations_locals: TextSerializationFailure # Was: Pass
-inference/downwards_inference_annotations_parameter_local: TextSerializationFailure # Was: Pass
+inference/downwards_inference_annotations_locals_referring_to_locals: TextSerializationFailure # Was: Pass
 inference/downwards_inference_annotations_parameter: TextSerializationFailure # Was: Pass
-inference/downwards_inference_annotations: TextSerializationFailure # Was: Pass
-inference/downwards_inference_annotations_typedef: TextSerializationFailure # Was: Pass
+inference/downwards_inference_annotations_parameter_local: TextSerializationFailure # Was: Pass
 inference/downwards_inference_annotations_type_variable: InstrumentationMismatch # Issue 28981
 inference/downwards_inference_annotations_type_variable_local: TextSerializationFailure # Was: Pass
+inference/downwards_inference_annotations_typedef: TextSerializationFailure # Was: Pass
 inference/downwards_inference_assignment_statements: TextSerializationFailure # Was: Pass
 inference/downwards_inference_async_await: TextSerializationFailure # Was: Pass
 inference/downwards_inference_for_each: TextSerializationFailure # Was: Pass
 inference/downwards_inference_initializing_formal_default_formal: TextSerializationFailure # Was: Pass
-inference/downwards_inference_inside_top_level_2: TextSerializationFailure # Was: Pass
 inference/downwards_inference_inside_top_level: TextSerializationFailure # Was: Pass
+inference/downwards_inference_inside_top_level_2: TextSerializationFailure # Was: Pass
 inference/downwards_inference_on_constructor_arguments_infer_downwards: TextSerializationFailure # Was: Pass
 inference/downwards_inference_on_function_arguments_infer_downwards: TextSerializationFailure # Was: Pass
 inference/downwards_inference_on_function_expressions: TextSerializationFailure # Was: Pass
@@ -222,33 +223,33 @@
 inference/for_loop_initializer_expression: TextSerializationFailure # Was: Pass
 inference/for_loop_promotion: TextSerializationFailure # Was: Pass
 inference/future_or_subtyping: TextSerializationFailure # Was: Pass
+inference/future_then: TextSerializationFailure # Was: Pass
 inference/future_then_2: TextSerializationFailure # Was: Pass
 inference/future_then_3: TextSerializationFailure # Was: Pass
 inference/future_then_4: TextSerializationFailure # Was: Pass
 inference/future_then_5: TextSerializationFailure # Was: Pass
 inference/future_then_6: TextSerializationFailure # Was: Pass
+inference/future_then_conditional: TextSerializationFailure # Was: Pass
 inference/future_then_conditional_2: TextSerializationFailure # Was: Pass
 inference/future_then_conditional_3: TextSerializationFailure # Was: Pass
 inference/future_then_conditional_4: TextSerializationFailure # Was: Pass
 inference/future_then_conditional_5: TextSerializationFailure # Was: Pass
 inference/future_then_conditional_6: TextSerializationFailure # Was: Pass
-inference/future_then_conditional: TextSerializationFailure # Was: Pass
 inference/future_then_downwards_method_target: TextSerializationFailure # Was: Pass
 inference/future_then_explicit_future: InstrumentationMismatch # Issue #30040
 inference/future_then_ifNull: TextSerializationFailure # Was: Pass
-inference/future_then: TextSerializationFailure # Was: Pass
+inference/future_then_upwards: TextSerializationFailure # Was: RuntimeError
 inference/future_then_upwards_2: TextSerializationFailure # Was: RuntimeError
 inference/future_then_upwards_3: TextSerializationFailure # Was: Pass
 inference/future_then_upwards_from_block: TextSerializationFailure # Was: Pass
-inference/future_then_upwards: TextSerializationFailure # Was: RuntimeError
-inference/future_union_async_conditional_2: TextSerializationFailure # Was: Pass
 inference/future_union_async_conditional: TextSerializationFailure # Was: Pass
+inference/future_union_async_conditional_2: TextSerializationFailure # Was: Pass
+inference/future_union_downwards: TextSerializationFailure # Was: Pass
 inference/future_union_downwards_2: TextSerializationFailure # Was: Pass
 inference/future_union_downwards_3: TextSerializationFailure # Was: Pass
 inference/future_union_downwards_4: TextSerializationFailure # Was: Pass
 inference/future_union_downwards_generic_method_with_future_return: TextSerializationFailure # Was: Pass
 inference/future_union_downwards_generic_method_with_generic_return: TextSerializationFailure # Was: Pass
-inference/future_union_downwards: TextSerializationFailure # Was: Pass
 inference/future_union_upwards_generic_methods: TextSerializationFailure # Was: Pass
 inference/generator_closure: TextSerializationFailure # Was: Pass
 inference/generic_functions_return_typedef: InstrumentationMismatch # Issue #29798
@@ -259,19 +260,19 @@
 inference/generic_methods_downwards_inference_affects_arguments: TextSerializationFailure # Was: Pass
 inference/generic_methods_downwards_inference_fold: TextSerializationFailure # Was: Pass
 inference/generic_methods_handle_override_of_non_generic_with_generic: TypeCheckError
-inference/generic_methods_inference_error: TextSerializationFailure # Was: Pass
 inference/generic_methods_infer_generic_function_parameter_type2: TextSerializationFailure # Was: Pass
 inference/generic_methods_infer_generic_function_parameter_type: TextSerializationFailure # Was: Pass
 inference/generic_methods_infer_generic_function_return_type: TextSerializationFailure # Was: Pass
 inference/generic_methods_infer_generic_instantiation: TextSerializationFailure # Was: Pass
 inference/generic_methods_infer_generic_method_type: TextSerializationFailure # Was: Pass
 inference/generic_methods_infer_js_builtin: InstrumentationMismatch # Issue #30029
+inference/generic_methods_inference_error: TextSerializationFailure # Was: Pass
 inference/generic_methods_iterable_and_future: TextSerializationFailure # Was: Pass
 inference/generic_methods_nested_generic_instantiation: TextSerializationFailure # Was: Pass
 inference/generic_methods_uses_greatest_lower_bound: TextSerializationFailure # Was: Pass
 inference/greatest_closure_multiple_params: TextSerializationFailure # Was: Pass
-inference/index_assign_operator_return_type_2: TextSerializationFailure # Was: Pass
 inference/index_assign_operator_return_type: TextSerializationFailure # Was: Pass
+inference/index_assign_operator_return_type_2: TextSerializationFailure # Was: Pass
 inference/infer_accessor_from_later_inferred_field: TextSerializationFailure # Was: Pass
 inference/infer_assign_to_implicit_this: TextSerializationFailure # Was: Pass
 inference/infer_assign_to_implicit_this_upwards: TextSerializationFailure # Was: Pass
@@ -295,9 +296,9 @@
 inference/infer_binary_int_double: TextSerializationFailure # Was: Pass
 inference/infer_binary_int_int: TextSerializationFailure # Was: Pass
 inference/infer_conditional: TextSerializationFailure # Was: Pass
+inference/infer_consts_transitively_2: TextSerializationFailure # Was: Pass
 inference/infer_consts_transitively_2_a: TextSerializationFailure # Was: Pass
 inference/infer_consts_transitively_2_b: TextSerializationFailure # Was: Pass
-inference/infer_consts_transitively_2: TextSerializationFailure # Was: Pass
 inference/infer_consts_transitively_b: TextSerializationFailure # Was: Pass
 inference/infer_correctly_on_multiple_variables_declared_together: TextSerializationFailure # Was: Pass
 inference/infer_field_from_later_inferred_field: TextSerializationFailure # Was: Pass
@@ -305,9 +306,9 @@
 inference/infer_field_from_later_inferred_setter: TextSerializationFailure # Was: Pass
 inference/infer_field_override_multiple: TypeCheckError
 inference/infer_field_override_of_override: TextSerializationFailure # Was: Pass
+inference/infer_field_override_with_substitution: TextSerializationFailure # Was: Pass
 inference/infer_field_overrides_getter: TextSerializationFailure # Was: Pass
 inference/infer_field_overrides_setter: TextSerializationFailure # Was: Pass
-inference/infer_field_override_with_substitution: TextSerializationFailure # Was: Pass
 inference/infer_field_static: TextSerializationFailure # Was: Pass
 inference/infer_final_field_getter_and_setter: TextSerializationFailure # Was: Pass
 inference/infer_final_field_getter_only: TextSerializationFailure # Was: Pass
@@ -315,14 +316,14 @@
 inference/infer_from_complex_expressions_if_outer_most_value_is_precise: TypeCheckError # Issue #35630
 inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2: TextSerializationFailure # Was: Pass
 inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields: TextSerializationFailure # Was: Pass
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a: TextSerializationFailure # Was: Pass
 inference/infer_from_variables_in_cycle_libs_when_flag_is_on2: TextSerializationFailure # Was: Pass
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a: TextSerializationFailure # Was: Pass
+inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a: TextSerializationFailure # Was: Pass
 inference/infer_from_variables_in_cycle_libs_when_flag_is_on: TextSerializationFailure # Was: Pass
-inference/infer_from_variables_in_non_cycle_imports_with_flag2_a: TextSerializationFailure # Was: Pass
+inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a: TextSerializationFailure # Was: Pass
 inference/infer_from_variables_in_non_cycle_imports_with_flag2: TextSerializationFailure # Was: Pass
-inference/infer_from_variables_in_non_cycle_imports_with_flag_a: TextSerializationFailure # Was: Pass
+inference/infer_from_variables_in_non_cycle_imports_with_flag2_a: TextSerializationFailure # Was: Pass
 inference/infer_from_variables_in_non_cycle_imports_with_flag: TextSerializationFailure # Was: Pass
+inference/infer_from_variables_in_non_cycle_imports_with_flag_a: TextSerializationFailure # Was: Pass
 inference/infer_generic_method_type_named: TextSerializationFailure # Was: Pass
 inference/infer_generic_method_type_positional2: TextSerializationFailure # Was: Pass
 inference/infer_generic_method_type_positional: TextSerializationFailure # Was: Pass
@@ -336,8 +337,46 @@
 inference/infer_method_missing_params: TypeCheckError
 inference/infer_parameter_type_setter_from_field: TextSerializationFailure # Was: Pass
 inference/infer_parameter_type_setter_from_setter: TextSerializationFailure # Was: Pass
-inference/infer_prefix_expression_custom: TextSerializationFailure # Was: Pass
 inference/infer_prefix_expression: TextSerializationFailure # Was: Pass
+inference/infer_prefix_expression_custom: TextSerializationFailure # Was: Pass
+inference/infer_rethrow: TextSerializationFailure # Was: Pass
+inference/infer_return_of_statement_lambda: TextSerializationFailure # Was: Pass
+inference/infer_return_type_for_static_setter: TextSerializationFailure # Was: Pass
+inference/infer_setter_cross_to_getter: TextSerializationFailure # Was: Pass
+inference/infer_setter_from_later_inferred_setter: TextSerializationFailure # Was: Pass
+inference/infer_setter_function_typed: TextSerializationFailure # Was: Pass
+inference/infer_setter_return_type_only: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively2: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively3: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively3_a: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively_2_a: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively_a: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively_b: TextSerializationFailure # Was: Pass
+inference/infer_statics_with_method_invocations: TextSerializationFailure # Was: Pass
+inference/infer_statics_with_method_invocations_a: TextSerializationFailure # Was: Pass
+inference/infer_throw: TextSerializationFailure # Was: Pass
+inference/infer_throw_downwards: TextSerializationFailure # Was: Pass
+inference/infer_type_on_overridden_fields2: TextSerializationFailure # Was: Pass
+inference/infer_type_on_overridden_fields4: TextSerializationFailure # Was: Pass
+inference/infer_type_on_var2: TextSerializationFailure # Was: Pass
+inference/infer_type_on_var: TextSerializationFailure # Was: Pass
+inference/infer_type_on_var_from_field: TextSerializationFailure # Was: Pass
+inference/infer_type_on_var_from_top_level: TextSerializationFailure # Was: Pass
+inference/infer_type_regardless_of_declaration_order_or_cycles: TextSerializationFailure # Was: RuntimeError
+inference/infer_type_regardless_of_declaration_order_or_cycles_b: TextSerializationFailure # Was: Pass
+inference/infer_typed_map_literal: TextSerializationFailure # Was: Pass
+inference/infer_types_on_generic_instantiations_3: TextSerializationFailure # Was: Pass
+inference/infer_types_on_generic_instantiations_4: TextSerializationFailure # Was: RuntimeError
+inference/infer_types_on_generic_instantiations_5: TextSerializationFailure # Was: Pass
+inference/infer_types_on_generic_instantiations_in_library_cycle: TextSerializationFailure # Was: Pass
+inference/infer_types_on_generic_instantiations_in_library_cycle_a: TextSerializationFailure # Was: Pass
+inference/infer_types_on_generic_instantiations_infer: TypeCheckError
+inference/infer_types_on_loop_indices_for_each_loop: TextSerializationFailure # Was: Pass
+inference/infer_types_on_loop_indices_for_each_loop_async: TextSerializationFailure # Was: Pass
+inference/infer_types_on_loop_indices_for_loop_with_inference: TextSerializationFailure # Was: Pass
+inference/infer_use_of_void_local: TextSerializationFailure # Was: Pass
+inference/infer_variable_void: TextSerializationFailure # Was: Pass
 inference/inferred_initializing_formal_checks_default_value: TextSerializationFailure # Was: Pass
 inference/inferred_nonstatic_field_depends_on_static_field_complex: TextSerializationFailure # Was: Pass
 inference/inferred_nonstatic_field_depends_on_top_level_var_simple: TextSerializationFailure # Was: Pass
@@ -357,65 +396,27 @@
 inference/inferred_type_invoke_method_via_interface: TextSerializationFailure # Was: Pass
 inference/inferred_type_is_enum: TextSerializationFailure # Was: Pass
 inference/inferred_type_is_enum_values: TextSerializationFailure # Was: Pass
-inference/inferred_type_is_typedef_parameterized: TextSerializationFailure # Was: Pass
 inference/inferred_type_is_typedef: TextSerializationFailure # Was: Pass
+inference/inferred_type_is_typedef_parameterized: TextSerializationFailure # Was: Pass
+inference/inferred_type_uses_synthetic_function_type: TextSerializationFailure # Was: Pass
 inference/inferred_type_uses_synthetic_function_type_function_typed_param: TextSerializationFailure # Was: Pass
 inference/inferred_type_uses_synthetic_function_type_named_param: TextSerializationFailure # Was: Pass
 inference/inferred_type_uses_synthetic_function_type_positional_param: TextSerializationFailure # Was: Pass
 inference/inferred_type_uses_synthetic_function_type_required_param: TextSerializationFailure # Was: Pass
-inference/inferred_type_uses_synthetic_function_type: TextSerializationFailure # Was: Pass
 inference/inferred_type_via_closure_multiple_levels_of_nesting: TextSerializationFailure # Was: Pass
 inference/inferred_type_via_closure_type_depends_on_args: TextSerializationFailure # Was: Pass
 inference/inferred_type_via_closure_type_independent_of_args_field: TextSerializationFailure # Was: Pass
 inference/inferred_type_via_closure_type_independent_of_args_top_level: TextSerializationFailure # Was: Pass
-inference/infer_rethrow: TextSerializationFailure # Was: Pass
-inference/infer_return_of_statement_lambda: TextSerializationFailure # Was: Pass
-inference/infer_return_type_for_static_setter: TextSerializationFailure # Was: Pass
-inference/infer_setter_cross_to_getter: TextSerializationFailure # Was: Pass
-inference/infer_setter_from_later_inferred_setter: TextSerializationFailure # Was: Pass
-inference/infer_setter_function_typed: TextSerializationFailure # Was: Pass
-inference/infer_setter_return_type_only: TextSerializationFailure # Was: Pass
-inference/infer_statics_transitively_2_a: TextSerializationFailure # Was: Pass
-inference/infer_statics_transitively2: TextSerializationFailure # Was: Pass
-inference/infer_statics_transitively3_a: TextSerializationFailure # Was: Pass
-inference/infer_statics_transitively3: TextSerializationFailure # Was: Pass
-inference/infer_statics_transitively_a: TextSerializationFailure # Was: Pass
-inference/infer_statics_transitively_b: TextSerializationFailure # Was: Pass
-inference/infer_statics_transitively: TextSerializationFailure # Was: Pass
-inference/infer_statics_with_method_invocations_a: TextSerializationFailure # Was: Pass
-inference/infer_statics_with_method_invocations: TextSerializationFailure # Was: Pass
-inference/infer_throw_downwards: TextSerializationFailure # Was: Pass
-inference/infer_throw: TextSerializationFailure # Was: Pass
-inference/infer_typed_map_literal: TextSerializationFailure # Was: Pass
-inference/infer_type_on_overridden_fields2: TextSerializationFailure # Was: Pass
-inference/infer_type_on_overridden_fields4: TextSerializationFailure # Was: Pass
-inference/infer_type_on_var2: TextSerializationFailure # Was: Pass
-inference/infer_type_on_var_from_field: TextSerializationFailure # Was: Pass
-inference/infer_type_on_var_from_top_level: TextSerializationFailure # Was: Pass
-inference/infer_type_on_var: TextSerializationFailure # Was: Pass
-inference/infer_type_regardless_of_declaration_order_or_cycles_b: TextSerializationFailure # Was: Pass
-inference/infer_type_regardless_of_declaration_order_or_cycles: TextSerializationFailure # Was: RuntimeError
-inference/infer_types_on_generic_instantiations_3: TextSerializationFailure # Was: Pass
-inference/infer_types_on_generic_instantiations_4: TextSerializationFailure # Was: RuntimeError
-inference/infer_types_on_generic_instantiations_5: TextSerializationFailure # Was: Pass
-inference/infer_types_on_generic_instantiations_infer: TypeCheckError
-inference/infer_types_on_generic_instantiations_in_library_cycle_a: TextSerializationFailure # Was: Pass
-inference/infer_types_on_generic_instantiations_in_library_cycle: TextSerializationFailure # Was: Pass
-inference/infer_types_on_loop_indices_for_each_loop_async: TextSerializationFailure # Was: Pass
-inference/infer_types_on_loop_indices_for_each_loop: TextSerializationFailure # Was: Pass
-inference/infer_types_on_loop_indices_for_loop_with_inference: TextSerializationFailure # Was: Pass
-inference/infer_use_of_void_local: TextSerializationFailure # Was: Pass
-inference/infer_variable_void: TextSerializationFailure # Was: Pass
 inference/inheritance_does_not_imply_circularity: TextSerializationFailure # Was: Pass
 inference/instance_creation_downwards: TextSerializationFailure # Was: Pass
+inference/instantiate_tearoff: TextSerializationFailure # Was: Pass
 inference/instantiate_tearoff_after_contravariance_check: TextSerializationFailure # Was: Pass
 inference/instantiate_tearoff_of_call: TypeCheckError # Issue #31746
-inference/instantiate_tearoff: TextSerializationFailure # Was: Pass
 inference/instantiate_to_bounds_generic2_has_bound_defined_after: TextSerializationFailure # Was: Pass
 inference/instantiate_to_bounds_generic2_has_bound_defined_before: TextSerializationFailure # Was: Pass
 inference/instantiate_to_bounds_generic2_no_bound: TextSerializationFailure # Was: Pass
-inference/instantiate_to_bounds_generic_has_bound_defined_after: TextSerializationFailure # Was: Pass
 inference/instantiate_to_bounds_generic_has_bound_defined_after transform: RuntimeError
+inference/instantiate_to_bounds_generic_has_bound_defined_after: TextSerializationFailure # Was: Pass
 inference/instantiate_to_bounds_generic_has_bound_defined_before: TextSerializationFailure # Was: Pass
 inference/instantiate_to_bounds_invoke_constructor_no_bound: TextSerializationFailure # Was: Pass
 inference/instantiate_to_bounds_invoke_constructor_type_args_exact: TextSerializationFailure # Was: Pass
@@ -424,19 +425,19 @@
 inference/lambda_does_not_have_propagated_type_hint: TextSerializationFailure # Was: Pass
 inference/lambda_return_type: TextSerializationFailure # Was: Pass
 inference/lambda_void_context: TextSerializationFailure # Was: Pass
-inference/list_literals_can_infer_null_bottom: TextSerializationFailure # Was: Pass
-inference/list_literals: TextSerializationFailure # Was: Pass
-inference/list_literals_top_level: TextSerializationFailure # Was: Pass
 inference/list_literal_typed: TextSerializationFailure # Was: Pass
+inference/list_literals: TextSerializationFailure # Was: Pass
+inference/list_literals_can_infer_null_bottom: TextSerializationFailure # Was: Pass
+inference/list_literals_top_level: TextSerializationFailure # Was: Pass
 inference/local_constructor_from_arguments: TextSerializationFailure # Was: Pass
 inference/local_reference_upwards_local: TextSerializationFailure # Was: Pass
 inference/local_return_and_yield: TextSerializationFailure # Was: Pass
 inference/logical_or_promotion: TextSerializationFailure # Was: Pass
-inference/map_literals_can_infer_null: TextSerializationFailure # Was: Pass
 inference/map_literals: TextSerializationFailure # Was: Pass
+inference/map_literals_can_infer_null: TextSerializationFailure # Was: Pass
 inference/map_literals_top_level: TextSerializationFailure # Was: Pass
-inference/method_call_with_type_arguments_instance_method_identifier_sequence: TextSerializationFailure # Was: Pass
 inference/method_call_with_type_arguments_instance_method: TextSerializationFailure # Was: Pass
+inference/method_call_with_type_arguments_instance_method_identifier_sequence: TextSerializationFailure # Was: Pass
 inference/method_call_with_type_arguments_static_method: TextSerializationFailure # Was: Pass
 inference/method_call_with_type_arguments_top_level_function: TextSerializationFailure # Was: Pass
 inference/mixin_inference_instantiate_to_bounds_1: TextSerializationFailure # Was: Pass
@@ -450,71 +451,13 @@
 inference/mixin_inference_outwards_4: TypeCheckError
 inference/mixin_inference_unification_1: TypeCheckError
 inference/mixin_inference_unification_2: TypeCheckError
-inference_new/const_invocation: TextSerializationFailure # Was: Pass
-inference_new/dependency_only_if_generic_method: TextSerializationFailure # Was: Pass
-inference_new/dependency_only_if_overloaded: TextSerializationFailure # Was: Pass
-inference_new/do_loop: TextSerializationFailure # Was: Pass
-inference_new/downwards_inference_inside_top_level_2: TextSerializationFailure # Was: Pass
-inference_new/downwards_inference_inside_top_level: TextSerializationFailure # Was: Pass
-inference_new/field_inference_circularity: TextSerializationFailure # Was: Pass
-inference_new/for_each_identifier_downwards: TextSerializationFailure # Was: Pass
-inference_new/for_each_invalid_iterable: TextSerializationFailure # Was: Pass
-inference_new/for_each_outer_var_type: TextSerializationFailure # Was: Pass
-inference_new/indexed_assign_combiner: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_implicit_this: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_implicit_this_upwards: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_index_full: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_index_set_vs_get: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_index_super: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_index_super_upwards: TypeCheckError
-inference_new/infer_assign_to_index: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_index_this: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_index_this_upwards: TypeCheckError
-inference_new/infer_assign_to_index_upwards: TypeCheckError
-inference_new/infer_assign_to_local: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_local_upwards: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_property_custom: TypeCheckError
-inference_new/infer_assign_to_property_full: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_property_null_aware: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_property_null_aware_upwards: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_property_super: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_property_super_upwards: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_property: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_property_upwards: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_ref: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_static: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_static_upwards: TextSerializationFailure # Was: Pass
-inference_new/infer_field_getter_setter_mismatch: TypeCheckError
-inference_new/infer_field_override_getter_overrides_setter: TypeCheckError
-inference_new/infer_field_override_setter_overrides_getter: TextSerializationFailure # Was: Pass
-inference_new/infer_instance_accessor_ref: TextSerializationFailure # Was: Pass
-inference_new/infer_instance_field_ref_circular: TextSerializationFailure # Was: Pass
-inference_new/infer_instance_field_ref: TextSerializationFailure # Was: Pass
-inference_new/infer_logical: TextSerializationFailure # Was: Pass
-inference_new/infer_use_of_void: TextSerializationFailure # Was: Pass
-inference_new/invalid_assignment_during_toplevel_inference: TypeCheckError
-inference_new/list_literals_can_infer_null_top_level: TextSerializationFailure # Was: Pass
-inference_new/map_literals_can_infer_null_top_level: TextSerializationFailure # Was: Pass
-inference_new/multiple_interface_inheritance: TextSerializationFailure # Was: Pass
-inference_new/property_assign_combiner: TextSerializationFailure # Was: Pass
-inference_new/property_get_toplevel: TextSerializationFailure # Was: Pass
-inference_new/static_assign_combiner: TextSerializationFailure # Was: Pass
-inference_new/strongly_connected_component: TextSerializationFailure # Was: Pass
-inference_new/super_index_get_substitution: TextSerializationFailure # Was: Pass
-inference_new/super_index_get: TextSerializationFailure # Was: Pass
-inference_new/switch: TextSerializationFailure # Was: Pass
-inference_new/top_level_field_depends_on_multiple_inheritance: TextSerializationFailure # Was: Pass
-inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: TextSerializationFailure # Was: Pass
-inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: TextSerializationFailure # Was: Pass
-inference_new/void_return_type_subtypes_dynamic: TextSerializationFailure # Was: Pass
-inference_new/while_loop: TextSerializationFailure # Was: Pass
 inference/no_error_when_declared_type_is_num_and_assigned_null: TextSerializationFailure # Was: Pass
 inference/non_const_invocation: TextSerializationFailure # Was: Pass
 inference/non_inferrable_getter_setter: TextSerializationFailure # Was: Pass
 inference/null_aware_method_invocation: TextSerializationFailure # Was: Pass
 inference/null_aware_property_get: TextSerializationFailure # Was: Pass
-inference/null_coalescing_operator_2: TextSerializationFailure # Was: Pass
 inference/null_coalescing_operator: TextSerializationFailure # Was: Pass
+inference/null_coalescing_operator_2: TextSerializationFailure # Was: Pass
 inference/null_literal_should_not_infer_as_bottom: TextSerializationFailure # Was: Pass
 inference/overloaded_int_operators: TextSerializationFailure # Was: Pass
 inference/override_equals: TextSerializationFailure # Was: RuntimeError
@@ -523,14 +466,14 @@
 inference/promote_bounds: TextSerializationFailure # Was: Pass
 inference/promote_from_logical_rhs: TextSerializationFailure # Was: Pass
 inference/promotion_subtype_check: TextSerializationFailure # Was: Pass
-inference/propagate_inference_to_field_in_class_dynamic_warnings: TextSerializationFailure # Was: Pass
 inference/propagate_inference_to_field_in_class: TextSerializationFailure # Was: Pass
+inference/propagate_inference_to_field_in_class_dynamic_warnings: TextSerializationFailure # Was: Pass
 inference/propagate_inference_transitively2: TextSerializationFailure # Was: Pass
 inference/propagate_inference_transitively: TextSerializationFailure # Was: Pass
 inference/propagate_variable_get: TextSerializationFailure # Was: Pass
 inference/property_get_toplevel: TextSerializationFailure # Was: Pass
-inference/property_set_bad_setter: TextSerializationFailure # Was: Pass
 inference/property_set: TextSerializationFailure # Was: Pass
+inference/property_set_bad_setter: TextSerializationFailure # Was: Pass
 inference/recursive_generic_function: TextSerializationFailure # Was: Pass
 inference/reference_to_typedef: TextSerializationFailure # Was: Pass
 inference/refine_binary_expression_type_type_parameter_t_double: TextSerializationFailure # Was: Pass
@@ -540,29 +483,30 @@
 inference/simple_literal_bool: TextSerializationFailure # Was: Pass
 inference/simple_literal_double: TextSerializationFailure # Was: Pass
 inference/simple_literal_int: TextSerializationFailure # Was: Pass
+inference/simple_literal_null: TextSerializationFailure
 inference/static_method_tear_off: TextSerializationFailure # Was: Pass
 inference/string_literal: TextSerializationFailure # Was: Pass
 inference/subexpressions_of_explicitly_typed_fields: TextSerializationFailure # Was: Pass
-inference/super_index_set_substitution: TextSerializationFailure # Was: Pass
 inference/super_index_set: TextSerializationFailure # Was: Pass
-inference/super_initializer_substitution: TextSerializationFailure # Was: Pass
+inference/super_index_set_substitution: TextSerializationFailure # Was: Pass
 inference/super_initializer: TextSerializationFailure # Was: Pass
-inference/super_method_invocation_substitution: TextSerializationFailure # Was: Pass
+inference/super_initializer_substitution: TextSerializationFailure # Was: Pass
 inference/super_method_invocation: TextSerializationFailure # Was: Pass
+inference/super_method_invocation_substitution: TextSerializationFailure # Was: Pass
+inference/super_property_get: TextSerializationFailure # Was: Pass
 inference/super_property_get_invoke_function_typed: TextSerializationFailure # Was: Pass
 inference/super_property_get_invoke_implicit_call: TextSerializationFailure # Was: Pass
 inference/super_property_get_substitution: TextSerializationFailure # Was: Pass
 inference/super_property_get_tearoff: TextSerializationFailure # Was: Pass
-inference/super_property_get: TextSerializationFailure # Was: Pass
 inference/super_property_set_substitution: TextSerializationFailure # Was: Pass
 inference/switch_continue: TextSerializationFailure # Was: Pass
 inference/symbol_literal: TextSerializationFailure # Was: Pass
 inference/this_reference: TextSerializationFailure # Was: Pass
-inference/toplevel_inference_toplevel_var: TextSerializationFailure # Was: Pass
 inference/top_level_return_and_yield: TextSerializationFailure # Was: Pass
+inference/toplevel_inference_toplevel_var: TextSerializationFailure # Was: Pass
+inference/try_catch: TextSerializationFailure # Was: Pass
 inference/try_catch_finally: TextSerializationFailure # Was: Pass
 inference/try_catch_promotion: TextSerializationFailure # Was: Pass
-inference/try_catch: TextSerializationFailure # Was: Pass
 inference/try_finally: TextSerializationFailure # Was: Pass
 inference/type_cast: TextSerializationFailure # Was: Pass
 inference/type_promotion_ignores_local_functions: TextSerializationFailure # Was: Pass
@@ -598,6 +542,64 @@
 inference/unsafe_block_closure_inference_method_call_implicit_type_param: TextSerializationFailure # Was: Pass
 inference/unsafe_block_closure_inference_method_call_no_type_param: TextSerializationFailure # Was: Pass
 inference/void_return_type_subtypes_dynamic: TextSerializationFailure # Was: Pass
+inference_new/const_invocation: TextSerializationFailure # Was: Pass
+inference_new/dependency_only_if_generic_method: TextSerializationFailure # Was: Pass
+inference_new/dependency_only_if_overloaded: TextSerializationFailure # Was: Pass
+inference_new/do_loop: TextSerializationFailure # Was: Pass
+inference_new/downwards_inference_inside_top_level: TextSerializationFailure # Was: Pass
+inference_new/downwards_inference_inside_top_level_2: TextSerializationFailure # Was: Pass
+inference_new/field_inference_circularity: TextSerializationFailure # Was: Pass
+inference_new/for_each_identifier_downwards: TextSerializationFailure # Was: Pass
+inference_new/for_each_invalid_iterable: TextSerializationFailure # Was: Pass
+inference_new/for_each_outer_var_type: TextSerializationFailure # Was: Pass
+inference_new/indexed_assign_combiner: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_implicit_this: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_implicit_this_upwards: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_index: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_index_full: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_index_set_vs_get: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_index_super: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_index_super_upwards: TypeCheckError
+inference_new/infer_assign_to_index_this: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_index_this_upwards: TypeCheckError
+inference_new/infer_assign_to_index_upwards: TypeCheckError
+inference_new/infer_assign_to_local: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_local_upwards: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property_custom: TypeCheckError
+inference_new/infer_assign_to_property_full: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property_null_aware: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property_null_aware_upwards: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property_super: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property_super_upwards: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property_upwards: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_ref: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_static: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_static_upwards: TextSerializationFailure # Was: Pass
+inference_new/infer_field_getter_setter_mismatch: TypeCheckError
+inference_new/infer_field_override_getter_overrides_setter: TypeCheckError
+inference_new/infer_field_override_setter_overrides_getter: TextSerializationFailure # Was: Pass
+inference_new/infer_instance_accessor_ref: TextSerializationFailure # Was: Pass
+inference_new/infer_instance_field_ref: TextSerializationFailure # Was: Pass
+inference_new/infer_instance_field_ref_circular: TextSerializationFailure # Was: Pass
+inference_new/infer_logical: TextSerializationFailure # Was: Pass
+inference_new/infer_use_of_void: TextSerializationFailure # Was: Pass
+inference_new/invalid_assignment_during_toplevel_inference: TypeCheckError
+inference_new/list_literals_can_infer_null_top_level: TextSerializationFailure # Was: Pass
+inference_new/map_literals_can_infer_null_top_level: TextSerializationFailure # Was: Pass
+inference_new/multiple_interface_inheritance: TextSerializationFailure # Was: Pass
+inference_new/property_assign_combiner: TextSerializationFailure # Was: Pass
+inference_new/property_get_toplevel: TextSerializationFailure # Was: Pass
+inference_new/static_assign_combiner: TextSerializationFailure # Was: Pass
+inference_new/strongly_connected_component: TextSerializationFailure # Was: Pass
+inference_new/super_index_get: TextSerializationFailure # Was: Pass
+inference_new/super_index_get_substitution: TextSerializationFailure # Was: Pass
+inference_new/switch: TextSerializationFailure # Was: Pass
+inference_new/top_level_field_depends_on_multiple_inheritance: TextSerializationFailure # Was: Pass
+inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: TextSerializationFailure # Was: Pass
+inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: TextSerializationFailure # Was: Pass
+inference_new/void_return_type_subtypes_dynamic: TextSerializationFailure # Was: Pass
+inference_new/while_loop: TextSerializationFailure # Was: Pass
 instantiate_to_bound/all_steps: TextSerializationFailure # Was: Pass
 instantiate_to_bound/body_generic_classes_from_dill: TextSerializationFailure # Was: Pass
 instantiate_to_bound/body_literal_list: TextSerializationFailure # Was: Pass
@@ -610,16 +612,16 @@
 instantiate_to_bound/body_typedef_literal_map: TextSerializationFailure # Was: Pass
 instantiate_to_bound/body_typedef_omitted_bound: TextSerializationFailure # Was: Pass
 instantiate_to_bound/body_typedef_super_bounded_type: TextSerializationFailure # Was: Pass
-instantiate_to_bound/contravariant_dependence_in_literals: TextSerializationFailure # Was: Pass
 instantiate_to_bound/contravariant_dependence: TextSerializationFailure # Was: Pass
-instantiate_to_bound/contravariant_mutual_dependence_in_literals: TextSerializationFailure # Was: Pass
+instantiate_to_bound/contravariant_dependence_in_literals: TextSerializationFailure # Was: Pass
 instantiate_to_bound/contravariant_mutual_dependence: TextSerializationFailure # Was: Pass
-instantiate_to_bound/covariant_dependence_in_literals: TextSerializationFailure # Was: Pass
+instantiate_to_bound/contravariant_mutual_dependence_in_literals: TextSerializationFailure # Was: Pass
 instantiate_to_bound/covariant_dependence: TextSerializationFailure # Was: Pass
-instantiate_to_bound/covariant_mutual_dependence_in_literals: TextSerializationFailure # Was: Pass
+instantiate_to_bound/covariant_dependence_in_literals: TextSerializationFailure # Was: Pass
 instantiate_to_bound/covariant_mutual_dependence: TextSerializationFailure # Was: Pass
-instantiate_to_bound/dependence_in_literals: TextSerializationFailure # Was: Pass
+instantiate_to_bound/covariant_mutual_dependence_in_literals: TextSerializationFailure # Was: Pass
 instantiate_to_bound/dependence: TextSerializationFailure # Was: Pass
+instantiate_to_bound/dependence_in_literals: TextSerializationFailure # Was: Pass
 instantiate_to_bound/generic_classes_from_dill: TextSerializationFailure # Was: Pass
 instantiate_to_bound/inference_constrained_by_bound: TextSerializationFailure # Was: Pass
 instantiate_to_bound/inference_defaults_to_bound: TextSerializationFailure # Was: Pass
@@ -630,22 +632,22 @@
 instantiate_to_bound/literal_list_with_generic_argument: TextSerializationFailure # Was: Pass
 instantiate_to_bound/literal_map: TextSerializationFailure # Was: Pass
 instantiate_to_bound/multiple_strongly_connected: TextSerializationFailure # Was: Pass
-instantiate_to_bound/mutual_dependence_in_literals: TextSerializationFailure # Was: Pass
 instantiate_to_bound/mutual_dependence: TextSerializationFailure # Was: Pass
+instantiate_to_bound/mutual_dependence_in_literals: TextSerializationFailure # Was: Pass
 instantiate_to_bound/non_simple_bound_due_to_non_simple: TextSerializationFailure # Was: Pass
 instantiate_to_bound/non_simple_bound_due_to_variables: TextSerializationFailure # Was: Pass
 instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: TextSerializationFailure # Was: RuntimeError # Expected
 instantiate_to_bound/non_simple_class_typedef_cycle: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_co_inductive: TextSerializationFailure # Was: Pass
 instantiate_to_bound/non_simple_co_inductive_for_each: TextSerializationFailure # Was: Pass
 instantiate_to_bound/non_simple_co_inductive_no_dup: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_co_inductive: TextSerializationFailure # Was: Pass
 instantiate_to_bound/non_simple_folded_regress: TextSerializationFailure # Was: Pass
 instantiate_to_bound/non_simple_for_each: TextSerializationFailure # Was: Pass
 instantiate_to_bound/non_simple_from_compiled: TextSerializationFailure # Was: Pass
 instantiate_to_bound/non_simple_generic_function_in_bound_regress: TextSerializationFailure # Was: RuntimeError # Expected
-instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_many_libs_same_name_cycle: TextSerializationFailure # Was: Pass
 instantiate_to_bound/non_simple_many: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_many_libs_same_name_cycle: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib: TextSerializationFailure # Was: Pass
 instantiate_to_bound/non_simple_no_dup: TextSerializationFailure # Was: Pass
 instantiate_to_bound/non_simple_suppress_consequence: TextSerializationFailure # Was: Pass
 instantiate_to_bound/non_simple_variables_from_same: TextSerializationFailure # Was: Pass
@@ -677,21 +679,21 @@
 micro: TextSerializationFailure # Was: RuntimeError
 minimum_int: TextSerializationFailure # Was: Pass
 missing_constructor: TextSerializationFailure # Was: Pass
+mixin: TextSerializationFailure # Was: Pass
 mixin_application_override: TypeCheckError
 mixin_conflicts: TextSerializationFailure
 mixin_constructors_with_default_values: TextSerializationFailure # Was: Pass
 mixin_inherited_setter_for_mixed_in_field: TextSerializationFailure # Was: Pass
 mixin_super_repeated: TextSerializationFailure # Was: Pass
 mixin_with_static_member: TextSerializationFailure
-mixin: TextSerializationFailure # Was: Pass
 named_function_scope: TextSerializationFailure # Was: Pass
 named_parameters: TextSerializationFailure # Was: Pass
 native_as_name: TextSerializationFailure # Was: Pass
 nested_implicit_const_with_env_var: TextSerializationFailure # Was: Pass
 new_const_insertion/simple: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/abstract_accessors_from_field: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/abstract_accessors_from_field_one_defined: TextSerializationFailure # Was: Pass
-no_such_method_forwarders/abstract_accessors_from_field: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/abstract_accessors_from_field_with_substitution: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/abstract_interface_nsm_inherited: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application: TextSerializationFailure # Was: Pass
@@ -700,21 +702,22 @@
 no_such_method_forwarders/forwarders_not_assumed_from_mixin: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/interface_with_concrete: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/interface_with_nsm: TextSerializationFailure # Was: Pass
-no_such_method_forwarders/no_forwarders_for_abstract_classes_chain: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/no_forwarders_for_abstract_classes: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/no_forwarders_for_abstract_classes_chain: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/nsm_inherited: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/nsm_mixed_in: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/private: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/private_module: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/private_same: TextSerializationFailure # Was: Pass
-no_such_method_forwarders/private: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/same: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/setter_not_shadowed_by_method: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/subst_on_forwarder: TextSerializationFailure # Was: Pass
-no_such_method_private_setter_lib: TextSerializationFailure # Was: Pass
 no_such_method_private_setter: TextSerializationFailure # Was: Pass
+no_such_method_private_setter_lib: TextSerializationFailure # Was: Pass
 null_aware: TextSerializationFailure # Was: Pass
 operators: TextSerializationFailure # Was: Pass
 optional: TypeCheckError
+override: TextSerializationFailure # Was: Pass
 override_check_accessor_after_inference: TypeCheckError # Issue #31620
 override_check_accessor_basic: TypeCheckError # Issue #31620
 override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
@@ -723,24 +726,24 @@
 override_check_generic_method_f_bounded: TextSerializationFailure # Was: Pass
 override_check_two_substitutions: TextSerializationFailure # Was: Pass
 override_check_with_covariant_modifier: TypeCheckError # Issue #31620
-override: TextSerializationFailure # Was: Pass
-part_as_entry_point_lib: TextSerializationFailure # Was: Pass
 part_as_entry_point: TextSerializationFailure # Was: Pass
+part_as_entry_point_lib: TextSerializationFailure # Was: Pass
 part_not_part_of: TextSerializationFailure
 part_not_part_of_same_named_library: TextSerializationFailure
 part_part_of_different_unnamed_library: TextSerializationFailure
 part_part_of_differently_named_library: TextSerializationFailure
+platform: TextSerializationFailure
 prefer_baseclass: TextSerializationFailure # Was: Pass
-private_method_tearoff_lib: TextSerializationFailure # Was: Pass
 private_method_tearoff: TextSerializationFailure # Was: Pass
-public_method_tearoff_lib: TextSerializationFailure # Was: Pass
+private_method_tearoff_lib: TextSerializationFailure # Was: Pass
 public_method_tearoff: TextSerializationFailure # Was: Pass
+public_method_tearoff_lib: TextSerializationFailure # Was: Pass
+qualified: TextSerializationFailure # Was: Pass
 qualified_lib: TextSerializationFailure # Was: Pass
 qualified_part: TextSerializationFailure # Was: Pass
-qualified: TextSerializationFailure # Was: Pass
 rasta/abstract_constructor: TextSerializationFailure # Was: RuntimeError
 rasta/bad_constructor_redirection: TextSerializationFailure # Was: RuntimeError
-rasta/bad_continue: RuntimeError
+rasta/bad_continue: TextSerializationFailure # Was: RuntimeError
 rasta/bad_default_constructor: VerificationError
 rasta/bad_explicit_super_constructor: TextSerializationFailure # Was: RuntimeError
 rasta/bad_implicit_super_constructor: TextSerializationFailure # Was: RuntimeError
@@ -748,7 +751,7 @@
 rasta/bad_redirection: TextSerializationFailure # Was: RuntimeError
 rasta/bad_setter_initializer: TextSerializationFailure # Was: RuntimeError
 rasta/bad_unicode: TextSerializationFailure # Was: Pass
-rasta/breaking_bad: RuntimeError
+rasta/breaking_bad: TextSerializationFailure # Was: RuntimeError
 rasta/cascades: TextSerializationFailure # Was: Pass
 rasta/class_hierarchy: TextSerializationFailure # Was: RuntimeError
 rasta/class_member: TextSerializationFailure # Was: RuntimeError
@@ -776,16 +779,19 @@
 rasta/issue_000026: TextSerializationFailure # Was: Pass
 rasta/issue_000031: TextSerializationFailure # Was: RuntimeError
 rasta/issue_000032: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000033: TextSerializationFailure
 rasta/issue_000034: TextSerializationFailure # Was: RuntimeError
-rasta/issue_000035a: TextSerializationFailure # Was: Pass
 rasta/issue_000035: TextSerializationFailure # Was: Pass
-rasta/issue_000036: RuntimeError
+rasta/issue_000035a: TextSerializationFailure # Was: Pass
+rasta/issue_000036: TextSerializationFailure # Was: RuntimeError
 rasta/issue_000039: VerificationError
 rasta/issue_000041: TextSerializationFailure # Was: RuntimeError
 rasta/issue_000042: TextSerializationFailure # Was: RuntimeError
 rasta/issue_000043: TextSerializationFailure # Was: RuntimeError
 rasta/issue_000044: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000045: TextSerializationFailure
 rasta/issue_000046: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000047: TextSerializationFailure
 rasta/issue_000048: TextSerializationFailure # Was: Pass
 rasta/issue_000052: TextSerializationFailure # Was: Pass
 rasta/issue_000053: TextSerializationFailure # Was: Pass
@@ -796,64 +802,81 @@
 rasta/issue_000080: TextSerializationFailure # Was: Pass
 rasta/issue_000081: TextSerializationFailure # Was: RuntimeError
 rasta/malformed_const_constructor: TextSerializationFailure # Was: RuntimeError
-rasta/malformed_function: RuntimeError
+rasta/malformed_function: TextSerializationFailure # Was: RuntimeError
 rasta/malformed_function_type: TextSerializationFailure # Was: Pass
+rasta/mandatory_parameter_initializer: TextSerializationFailure
 rasta/mixin_library: TypeCheckError
 rasta/native_is_illegal: TextSerializationFailure # Was: RuntimeError
 rasta/parser_error: TextSerializationFailure # Was: RuntimeError
 rasta/previsit_deferred: TextSerializationFailure # Was: Pass
 rasta/static: TextSerializationFailure # Was: RuntimeError
+rasta/super: TypeCheckError
 rasta/super_initializer: TextSerializationFailure # Was: RuntimeError
 rasta/super_mixin: TypeCheckError
 rasta/super_operator: TypeCheckError
-rasta/super: TypeCheckError
 rasta/supports_reflection: TextSerializationFailure # Was: Pass
 rasta/switch_execution_case_t02: TextSerializationFailure # Was: Pass
 rasta/switch_fall_through: TextSerializationFailure # Was: Pass
 rasta/this_invoke: TextSerializationFailure # Was: Pass
-rasta/typedef: Crash
+rasta/try_label: TextSerializationFailure
 rasta/type_literals: Crash
 rasta/type_with_parse_error: TextSerializationFailure # Was: Pass
+rasta/typedef: Crash
+rasta/unresolved: TextSerializationFailure # Was: RuntimeError
 rasta/unresolved_constructor: TextSerializationFailure # Was: RuntimeError
 rasta/unresolved_for_in: TextSerializationFailure # Was: RuntimeError
 rasta/unresolved_recovery: TypeCheckError
-rasta/unresolved: RuntimeError
+rasta/unsupported_platform_library: TextSerializationFailure
 redirecting_constructor: TextSerializationFailure # Was: Pass
+redirecting_factory: TextSerializationFailure # Was: Pass
 redirecting_factory_chain_test: TextSerializationFailure # Was: Pass
 redirecting_factory_const_inference: TextSerializationFailure # Was: Pass
 redirecting_factory_metadata: TextSerializationFailure # Was: Pass
 redirecting_factory_simple_test: TextSerializationFailure # Was: Pass
-redirecting_factory: TextSerializationFailure # Was: Pass
 redirecting_factory_typeargs_test: TextSerializationFailure # Was: Pass
-redirecting_factory_typeparambounds_test: TextSerializationFailure # Was: Pass
 redirecting_factory_typeparam_test: TextSerializationFailure # Was: Pass
+redirecting_factory_typeparambounds_test: TextSerializationFailure # Was: Pass
 redirecting_initializer_arguments_assignable_test: TextSerializationFailure # Was: Pass
 redirecting_initializer_arguments_test: TextSerializationFailure # Was: Pass
-redirection_chain_type_arguments_subst: TextSerializationFailure # Was: Pass
 redirection_chain_type_arguments: TextSerializationFailure # Was: Pass
+redirection_chain_type_arguments_subst: TextSerializationFailure # Was: Pass
 redirection_type_arguments: TextSerializationFailure # Was: Pass
 regress/issue_29937: TextSerializationFailure # Was: Pass
 regress/issue_29940: TextSerializationFailure # Was: Pass
 regress/issue_29941: TextSerializationFailure # Was: Pass
 regress/issue_29942: TextSerializationFailure # Was: Pass
+regress/issue_29943: TextSerializationFailure
 regress/issue_29944: TextSerializationFailure # Was: Pass
-regress/issue_29976: RuntimeError # Tests runtime behavior of error recovery.
+regress/issue_29945: TextSerializationFailure
+regress/issue_29975: TextSerializationFailure
+regress/issue_29976: TextSerializationFailure # Was:  RuntimeError # Tests runtime behavior of error recovery.
+regress/issue_29977: TextSerializationFailure
 regress/issue_29978: TextSerializationFailure # Was: Pass
 regress/issue_29979: TextSerializationFailure # Was: Pass
+regress/issue_29980: TextSerializationFailure
 regress/issue_29981: TextSerializationFailure # Was: Pass
 regress/issue_29982: TextSerializationFailure # Was: RuntimeError # Tests runtime behavior of error recovery.
 regress/issue_29983: TextSerializationFailure # Was: Pass
 regress/issue_29984: TextSerializationFailure # Was: Pass
+regress/issue_29985: TextSerializationFailure
+regress/issue_29986: TextSerializationFailure
+regress/issue_29987: TextSerializationFailure
 regress/issue_30834: TextSerializationFailure # Was: Pass
 regress/issue_30836: TextSerializationFailure # Was: RuntimeError # Issue 30836.
 regress/issue_30838: TextSerializationFailure # Was: Pass
 regress/issue_30981: TextSerializationFailure # Was: Pass
+regress/issue_30994: TextSerializationFailure
 regress/issue_31155: TextSerializationFailure # Was: Pass
+regress/issue_31157: TextSerializationFailure
 regress/issue_31171: TextSerializationFailure # Was: Pass
+regress/issue_31180: TextSerializationFailure
 regress/issue_31181: TextSerializationFailure # Was: Pass
 regress/issue_31183: TextSerializationFailure # Was: Pass
 regress/issue_31184: TextSerializationFailure # Was: Pass
 regress/issue_31185: TextSerializationFailure # Was: Pass
+regress/issue_31186: TextSerializationFailure
+regress/issue_31187: TextSerializationFailure
+regress/issue_31188: TextSerializationFailure
 regress/issue_31190: TextSerializationFailure # Was: Pass
 regress/issue_31192: TextSerializationFailure # Was: Pass
 regress/issue_31198: TextSerializationFailure # Was: Pass
@@ -870,12 +893,12 @@
 regress/issue_33452: TextSerializationFailure # Was: RuntimeError # Test has an intentional error
 regress/issue_33672: TextSerializationFailure # Was: Pass
 regress/issue_34225: TextSerializationFailure # Was: RuntimeError
-regress/issue_34291_lib: TextSerializationFailure # Was: Pass
 regress/issue_34291: TextSerializationFailure # Was: Pass
-regress/issue_34403_lib: TextSerializationFailure # Was: Pass
+regress/issue_34291_lib: TextSerializationFailure # Was: Pass
 regress/issue_34403: TextSerializationFailure # Was: Pass
-regress/issue_34498_lib: TextSerializationFailure # Was: Pass
+regress/issue_34403_lib: TextSerializationFailure # Was: Pass
 regress/issue_34498: TextSerializationFailure # Was: Pass
+regress/issue_34498_lib: TextSerializationFailure # Was: Pass
 regress/issue_34563: TextSerializationFailure # Was: RuntimeError # Test execution after recovery
 regress/issue_34610: TextSerializationFailure # Was: Pass
 regress/issue_34614: TextSerializationFailure # Was: Pass
@@ -887,38 +910,39 @@
 regress/issue_35259: TextSerializationFailure # Was: RuntimeError # Expected
 regress/issue_35260: TextSerializationFailure # Was: RuntimeError # Expected
 regress/issue_35266: TextSerializationFailure # Was: RuntimeError # Expected
+regress/issue_35900: TextSerializationFailure
 reject_generic_function_types_in_bounds: TextSerializationFailure # Was: RuntimeError # Expected
 return_with_unknown_type_in_context: TextSerializationFailure # Was: Pass
+runtime_checks/call_kinds: TextSerializationFailure # Was: Pass
 runtime_checks/call_kinds_get: TextSerializationFailure # Was: Pass
 runtime_checks/call_kinds_set: TextSerializationFailure # Was: Pass
-runtime_checks/call_kinds: TextSerializationFailure # Was: Pass
-runtime_checks/call_method_implicit_tear_off_future_or: TextSerializationFailure # Was: Pass
 runtime_checks/call_method_implicit_tear_off: TextSerializationFailure # Was: Pass
+runtime_checks/call_method_implicit_tear_off_future_or: TextSerializationFailure # Was: Pass
 runtime_checks/contravariant_field: TextSerializationFailure # Was: Pass
 runtime_checks/contravariant_generic_method_type_parameter: TextSerializationFailure # Was: Pass
+runtime_checks/contravariant_generic_return: TextSerializationFailure # Was: Pass
 runtime_checks/contravariant_generic_return_null_aware: TextSerializationFailure # Was: Pass
 runtime_checks/contravariant_generic_return_tear_off: TextSerializationFailure # Was: Pass
-runtime_checks/contravariant_generic_return: TextSerializationFailure # Was: Pass
-runtime_checks/contravariant_getter_return_null_aware: TextSerializationFailure # Was: Pass
-runtime_checks/contravariant_getter_return: TextSerializationFailure # Was: Pass
 runtime_checks/contravariant_getter: TextSerializationFailure # Was: Pass
+runtime_checks/contravariant_getter_return: TextSerializationFailure # Was: Pass
+runtime_checks/contravariant_getter_return_null_aware: TextSerializationFailure # Was: Pass
 runtime_checks/covariant_generic_method_type_parameter: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_parameter_complex: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_parameter_in_interface_mixin: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_parameter_in_interface_super_mixin: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_parameter_in_interface_super: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_parameter_in_interface: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_parameter_tear_off: TextSerializationFailure # Was: Pass
 runtime_checks/covariant_generic_parameter: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_keyword_field_inherited_by_setter: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_keyword_field: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_keyword_setter_inherited_by_field: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_keyword_setter: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_parameter_complex: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_parameter_in_interface: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_parameter_in_interface_mixin: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_parameter_in_interface_super: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_parameter_in_interface_super_mixin: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_parameter_tear_off: TextSerializationFailure # Was: Pass
 runtime_checks/covariant_keyword: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_keyword_field: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_keyword_field_inherited_by_setter: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_keyword_setter: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_keyword_setter_inherited_by_field: TextSerializationFailure # Was: Pass
 runtime_checks/covariant_setter: TextSerializationFailure # Was: Pass
+runtime_checks/dynamic_invocation: TextSerializationFailure # Was: Pass
 runtime_checks/dynamic_invocation_generic: TextSerializationFailure # Was: Pass
 runtime_checks/dynamic_invocation_of_getter: TextSerializationFailure # Was: Pass
-runtime_checks/dynamic_invocation: TextSerializationFailure # Was: Pass
 runtime_checks/field_forwarding_stub_generic_covariant: TextSerializationFailure # Was: Pass
 runtime_checks/forwarding_stub_with_default_values: TextSerializationFailure # Was: Pass
 runtime_checks/forwarding_stub_with_non_covariant_param: TextSerializationFailure # Was: Pass
@@ -950,15 +974,16 @@
 runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
 runtime_checks_new/stub_checked_via_target: TextSerializationFailure # Was: Pass
 runtime_checks_new/stub_from_interface_contravariant_from_class: TextSerializationFailure # Was: Pass
-runtime_checks_new/stub_from_interface_covariant_from_interface: TextSerializationFailure # Was: Pass
-runtime_checks_new/stub_from_interface_covariant_from_super: TextSerializationFailure # Was: Pass
 runtime_checks_new/stub_from_interface_covariantImpl_from_class: TextSerializationFailure # Was: Pass
 runtime_checks_new/stub_from_interface_covariantImpl_from_interface: TextSerializationFailure # Was: Pass
 runtime_checks_new/stub_from_interface_covariantImpl_from_super: TextSerializationFailure # Was: Pass
 runtime_checks_new/stub_from_interface_covariantInterface_from_class: TextSerializationFailure # Was: Pass
+runtime_checks_new/stub_from_interface_covariant_from_interface: TextSerializationFailure # Was: Pass
+runtime_checks_new/stub_from_interface_covariant_from_super: TextSerializationFailure # Was: Pass
 sdk_diagnostic: TextSerializationFailure
 set_literals/disambiguation_rule: TextSerializationFailure # Was: RuntimeError
 spread_collection: TextSerializationFailure # Should be fixed as part of implementing spread collection support
+spread_collection_inference: TextSerializationFailure # Should be fixed as part of implementing spread collection support
 statements: Crash
 static_setter: TextSerializationFailure # Was: Pass
 store_load: TextSerializationFailure # Was: Pass
@@ -966,16 +991,16 @@
 super_call: TextSerializationFailure # Was: Pass
 super_nsm: TextSerializationFailure # Was: Pass
 tabs: TextSerializationFailure # Was: Pass
-top_level_accessors_part: TextSerializationFailure # Was: Pass
 top_level_accessors: TextSerializationFailure # Was: Pass
+top_level_accessors_part: TextSerializationFailure # Was: Pass
 top_level_library_method: TextSerializationFailure # Was: Pass
-typedef: TextSerializationFailure # Was: Pass
 type_of_null: TextSerializationFailure
 type_variable_as_super: TextSerializationFailure # Was: RuntimeError
 type_variable_prefix: TextSerializationFailure # Was: RuntimeError
 type_variable_uses: TextSerializationFailure # Was: Pass
-undefined_getter_in_compound_assignment: TextSerializationFailure # Was: Pass
+typedef: TextSerializationFailure # Was: Pass
 undefined: TextSerializationFailure # Was: Pass
+undefined_getter_in_compound_assignment: TextSerializationFailure # Was: Pass
 uninitialized_fields: TextSerializationFailure # Was: Pass
 unsound_promotion: TextSerializationFailure
 unused_methods: TextSerializationFailure # Was: Pass
diff --git a/pkg/front_end/tool/_fasta/bench_maker.dart b/pkg/front_end/tool/_fasta/bench_maker.dart
new file mode 100644
index 0000000..a8683a9
--- /dev/null
+++ b/pkg/front_end/tool/_fasta/bench_maker.dart
@@ -0,0 +1,314 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.tool.entry_points;
+
+import "dart:convert" show JsonEncoder;
+
+import "dart:io" show File;
+
+import "package:kernel/ast.dart" hide MapEntry;
+
+import "package:front_end/src/fasta/type_inference/type_schema.dart"
+    show UnknownType;
+
+String jsonEncode(Object object) {
+  return const JsonEncoder.withIndent("  ").convert(object);
+}
+
+Iterable<String> nameGenerator() sync* {
+  int i = 0;
+  while (true) {
+    List<int> characters = <int>[];
+    int j = i;
+    while (j > 25) {
+      int c = j % 26;
+      j = (j ~/ 26) - 1;
+      characters.add(c + 65);
+    }
+    characters.add(j + 65);
+    yield new String.fromCharCodes(characters.reversed);
+    i++;
+  }
+}
+
+class BenchMaker implements DartTypeVisitor1<void, StringBuffer> {
+  final List<Object> checks = <Object>[];
+
+  final Map<TreeNode, String> nodeNames = <TreeNode, String>{};
+
+  final Set<String> usedNames = new Set<String>();
+
+  final Iterator<String> names = nameGenerator().iterator..moveNext();
+
+  final List<String> classes = <String>[];
+
+  final List<TypeParameter> usedTypeParameters = <TypeParameter>[];
+
+  String serializeTypeChecks(List<Object> typeChecks) {
+    for (List<Object> list in typeChecks) {
+      writeTypeCheck(list[0], list[1], list[2]);
+    }
+    writeClasses();
+    return jsonEncode(this);
+  }
+
+  void writeTypeCheck(DartType s, DartType t, bool expected) {
+    assert(usedTypeParameters.isEmpty);
+    usedTypeParameters.clear();
+    StringBuffer sb = new StringBuffer();
+    s.accept1(this, sb);
+    String sString = "$sb";
+    sb.clear();
+    t.accept1(this, sb);
+    String tString = "$sb";
+    List<Object> arguments = <Object>[sString, tString];
+    Set<TypeParameter> seenTypeParameters = new Set<TypeParameter>();
+    List<String> parameterStrings = <String>[];
+    while (usedTypeParameters.isNotEmpty) {
+      List<TypeParameter> typeParameters = usedTypeParameters.toList();
+      usedTypeParameters.clear();
+      for (TypeParameter parameter in typeParameters) {
+        if (seenTypeParameters.add(parameter)) {
+          sb.clear();
+          writeTypeParameter(parameter, sb);
+          parameterStrings.add("$sb");
+        }
+      }
+    }
+    if (parameterStrings.isNotEmpty) {
+      arguments.add(parameterStrings);
+    }
+    checks.add(<String, dynamic>{
+      "kind": expected ? "isSubtype" : "isNotSubtype",
+      "arguments": arguments,
+    });
+  }
+
+  void writeTypeParameter(TypeParameter parameter, StringBuffer sb) {
+    sb.write(computeName(parameter));
+    DartType bound = parameter.bound;
+    DartType defaultType = parameter.defaultType;
+    bool hasExplicitBound = true;
+    if (bound is InterfaceType && defaultType is DynamicType) {
+      if (bound.classNode.supertype == null) {
+        hasExplicitBound = false;
+      }
+    }
+    if (hasExplicitBound) {
+      sb.write(" extends ");
+      bound.accept1(this, sb);
+    }
+  }
+
+  void writeTypeParameters(
+      List<TypeParameter> typeParameters, StringBuffer sb) {
+    if (typeParameters.isNotEmpty) {
+      sb.write("<");
+      bool first = true;
+      for (TypeParameter p in typeParameters) {
+        if (!first) sb.write(", ");
+        writeTypeParameter(p, sb);
+        first = false;
+      }
+      sb.write(">");
+    }
+  }
+
+  void writeClasses() {
+    Set<Class> writtenClasses = new Set<Class>();
+    int index = 0;
+    List<TreeNode> nodes = nodeNames.keys.toList();
+    while (index < nodes.length) {
+      for (; index < nodes.length; index++) {
+        TreeNode node = nodes[index];
+        if (node is Class) {
+          writeClass(node, writtenClasses);
+        }
+      }
+      nodes = nodeNames.keys.toList();
+    }
+  }
+
+  void writeClass(Class cls, Set<Class> writtenClasses) {
+    if (cls == null || !writtenClasses.add(cls)) return;
+    Supertype supertype = cls.supertype;
+    writeClass(supertype?.classNode, writtenClasses);
+    Supertype mixedInType = cls.mixedInType;
+    writeClass(mixedInType?.classNode, writtenClasses);
+    for (Supertype implementedType in cls.implementedTypes) {
+      writeClass(implementedType.classNode, writtenClasses);
+    }
+    StringBuffer sb = new StringBuffer();
+    sb.write("class ");
+    sb.write(computeName(cls));
+    writeTypeParameters(cls.typeParameters, sb);
+    if (supertype != null) {
+      sb.write(" extends ");
+      supertype.asInterfaceType.accept1(this, sb);
+    }
+    if (mixedInType != null) {
+      sb.write(" with ");
+      mixedInType.asInterfaceType.accept1(this, sb);
+    }
+    bool first = true;
+    for (Supertype implementedType in cls.implementedTypes) {
+      if (first) {
+        sb.write(" implements ");
+      } else {
+        sb.write(", ");
+      }
+      implementedType.asInterfaceType.accept1(this, sb);
+      first = false;
+    }
+    Procedure callOperator;
+    for (Procedure procedure in cls.procedures) {
+      if (procedure.name.name == "call") {
+        callOperator = procedure;
+      }
+    }
+    if (callOperator != null) {
+      sb.write("{ ");
+      callOperator.function.functionType.accept1(this, sb);
+      sb.write(" }");
+    } else {
+      sb.write(";");
+    }
+    classes.add("$sb");
+  }
+
+  String computeName(TreeNode node) {
+    String name = nodeNames[node];
+    if (name != null) return name;
+    if (node is Class) {
+      Library library = node.enclosingLibrary;
+      String uriString = "${library?.importUri}";
+      if (uriString == "dart:core" || uriString == "dart:async") {
+        if (!usedNames.add(node.name)) {
+          throw "Class name conflict for $node";
+        }
+        return nodeNames[node] = node.name;
+      }
+    }
+    while (!usedNames.add(name = names.current)) {
+      names.moveNext();
+    }
+    names.moveNext();
+    return nodeNames[node] = name;
+  }
+
+  @override
+  void defaultDartType(DartType node, StringBuffer sb) {
+    if (node is UnknownType) {
+      sb.write("?");
+    } else {
+      throw "Unsupported: ${node.runtimeType}";
+    }
+  }
+
+  @override
+  void visitInvalidType(InvalidType node, StringBuffer sb) {
+    throw "not implemented";
+  }
+
+  @override
+  void visitDynamicType(DynamicType node, StringBuffer sb) {
+    sb.write("dynamic");
+  }
+
+  @override
+  void visitVoidType(VoidType node, StringBuffer sb) {
+    sb.write("void");
+  }
+
+  @override
+  void visitBottomType(BottomType node, StringBuffer sb) {
+    sb.write("⊥");
+  }
+
+  @override
+  void visitInterfaceType(InterfaceType node, StringBuffer sb) {
+    sb.write(computeName(node.classNode));
+    if (node.typeArguments.isNotEmpty) {
+      sb.write("<");
+      bool first = true;
+      for (DartType type in node.typeArguments) {
+        if (!first) sb.write(", ");
+        type.accept1(this, sb);
+        first = false;
+      }
+      sb.write(">");
+    }
+  }
+
+  @override
+  void visitFunctionType(FunctionType node, StringBuffer sb) {
+    writeTypeParameters(node.typeParameters, sb);
+    sb.write("(");
+    bool first = true;
+    for (int i = 0; i < node.requiredParameterCount; i++) {
+      if (!first) sb.write(", ");
+      node.positionalParameters[i].accept1(this, sb);
+      first = false;
+    }
+    if (node.requiredParameterCount != node.positionalParameters.length) {
+      if (!first) sb.write(", ");
+      sb.write("[");
+      first = true;
+      for (int i = node.requiredParameterCount;
+          i < node.positionalParameters.length;
+          i++) {
+        if (!first) sb.write(", ");
+        node.positionalParameters[i].accept1(this, sb);
+        first = false;
+      }
+      sb.write("]");
+      first = false;
+    }
+    if (node.namedParameters.isNotEmpty) {
+      if (!first) sb.write(", ");
+      sb.write("{");
+      first = true;
+      for (NamedType named in node.namedParameters) {
+        if (!first) sb.write(", ");
+        named.type.accept1(this, sb);
+        sb.write(" ");
+        sb.write(named.name);
+        first = false;
+      }
+      sb.write("}");
+      first = false;
+    }
+    sb.write(") -> ");
+    node.returnType.accept1(this, sb);
+  }
+
+  @override
+  void visitTypeParameterType(TypeParameterType node, StringBuffer sb) {
+    String name = computeName(node.parameter);
+    usedTypeParameters.add(node.parameter);
+    sb.write(name);
+    if (node.promotedBound != null) {
+      sb.write(" & ");
+      node.promotedBound.accept1(this, sb);
+    }
+  }
+
+  @override
+  void visitTypedefType(TypedefType node, StringBuffer sb) {
+    throw "not implemented";
+  }
+
+  Map<String, dynamic> toJson() {
+    return <String, dynamic>{
+      "classes": classes,
+      "checks": checks,
+    };
+  }
+
+  static void writeTypeChecks(String filename, List<Object> typeChecks) {
+    new File(filename)
+        .writeAsString(new BenchMaker().serializeTypeChecks(typeChecks));
+  }
+}
diff --git a/pkg/front_end/tool/_fasta/command_line.dart b/pkg/front_end/tool/_fasta/command_line.dart
index 77987c1..385d151 100644
--- a/pkg/front_end/tool/_fasta/command_line.dart
+++ b/pkg/front_end/tool/_fasta/command_line.dart
@@ -40,6 +40,9 @@
 
 import 'package:front_end/src/fasta/problems.dart' show DebugAbort, unhandled;
 
+import 'package:front_end/src/fasta/resolve_input_uri.dart'
+    show resolveInputUri;
+
 import 'package:front_end/src/fasta/severity.dart' show Severity;
 
 import 'package:front_end/src/scheme_based_file_system.dart'
@@ -48,8 +51,6 @@
 import 'package:kernel/target/targets.dart'
     show Target, getTarget, TargetFlags, targets;
 
-import 'resolve_input_uri.dart' show resolveInputUri;
-
 class CommandLineProblem {
   final Message message;
 
@@ -258,6 +259,7 @@
   "--single-root-scheme": String,
   "--supermixin": true,
   "--target": String,
+  "--enable-asserts": false,
   "--verbose": false,
   "--verify": false,
   "-D": "<define>",
@@ -308,6 +310,8 @@
         "Valid targets are:\n  ${targets.keys.join("\n  ")}");
   }
 
+  final bool enableAsserts = options["--enable-asserts"];
+
   final bool verify = options["--verify"];
 
   final bool dumpIr = options["--dump-ir"];
@@ -371,6 +375,7 @@
           ..packagesFileUri = packages
           ..legacyMode = legacyMode
           ..target = target
+          ..enableAsserts = enableAsserts
           ..throwOnErrorsForDebugging = errorsAreFatal
           ..throwOnWarningsForDebugging = warningsAreFatal
           ..embedSourceText = !excludeSource
@@ -407,6 +412,7 @@
     ..packagesFileUri = packages
     ..legacyMode = legacyMode
     ..target = target
+    ..enableAsserts = enableAsserts
     ..throwOnErrorsForDebugging = errorsAreFatal
     ..throwOnWarningsForDebugging = warningsAreFatal
     ..embedSourceText = !excludeSource
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index c5dea7c..a3cd069 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -4,9 +4,9 @@
 
 library fasta.tool.entry_points;
 
-import 'dart:async' show Future, Stream;
+import 'dart:async' show Stream;
 
-import 'dart:convert' show jsonDecode, jsonEncode, LineSplitter, utf8;
+import 'dart:convert' show LineSplitter, jsonDecode, jsonEncode, utf8;
 
 import 'dart:io' show File, Platform, exitCode, stderr, stdin, stdout;
 
@@ -15,6 +15,8 @@
 
 import 'package:kernel/target/targets.dart' show Target, TargetFlags, getTarget;
 
+import 'package:kernel/type_environment.dart' show SubtypeTester;
+
 import 'package:vm/bytecode/gen_bytecode.dart' show generateBytecode;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
@@ -49,6 +51,8 @@
 
 import 'additional_targets.dart' show installAdditionalTargets;
 
+import 'bench_maker.dart' show BenchMaker;
+
 import 'command_line.dart' show runProtectedFromAbort, withGlobalOptions;
 
 const bool summary = const bool.fromEnvironment("summary", defaultValue: false);
@@ -70,6 +74,10 @@
     stopwatch.stop();
 
     elapsedTimes.add(stopwatch.elapsedMilliseconds.toDouble());
+    List<Object> typeChecks = SubtypeTester.typeChecks;
+    if (typeChecks?.isNotEmpty ?? false) {
+      BenchMaker.writeTypeChecks("type_checks.json", typeChecks);
+    }
   }
 
   if (summary) {
diff --git a/pkg/kernel/bin/transform.dart b/pkg/kernel/bin/transform.dart
index 3fe69da..5f792a5 100755
--- a/pkg/kernel/bin/transform.dart
+++ b/pkg/kernel/bin/transform.dart
@@ -20,10 +20,8 @@
 import 'package:kernel/transformations/empty.dart' as empty;
 import 'package:kernel/transformations/method_call.dart' as method_call;
 import 'package:kernel/transformations/mixin_full_resolution.dart' as mix;
-import 'package:kernel/transformations/treeshaker.dart' as treeshaker;
 import 'package:kernel/transformations/coq.dart' as coq;
 import 'package:kernel/vm/constants_native_effects.dart';
-import 'package:kernel/src/tool/command_line_util.dart';
 
 ArgParser parser = new ArgParser()
   ..addOption('format',
@@ -38,9 +36,6 @@
       help: 'Be verbose (e.g. prints transformed main library).',
       defaultsTo: false)
   ..addMultiOption('define', abbr: 'D', splitCommas: false)
-  ..addMultiOption('embedder-entry-points-manifest',
-      help: 'A path to a file describing entrypoints '
-          '(lines of the form `<library>,<class>,<member>`).')
   ..addOption('transformation',
       abbr: 't',
       help: 'The transformation to apply.',
@@ -89,11 +84,6 @@
     output = '${input.substring(0, input.lastIndexOf('.'))}.transformed.dill';
   }
 
-  List<String> embedderEntryPointManifests =
-      options['embedder-entry-points-manifest'] as List<String>;
-  List<treeshaker.ProgramRoot> programRoots =
-      parseProgramRoots(embedderEntryPointManifests);
-
   var component = loadComponentFromBinary(input);
 
   final coreTypes = new CoreTypes(component);
@@ -114,10 +104,6 @@
       component = constants.transformComponent(
           component, backend, defines, const constants.SimpleErrorReporter());
       break;
-    case 'treeshake':
-      component = treeshaker.transformComponent(coreTypes, hierarchy, component,
-          programRoots: programRoots, legacyMode: true);
-      break;
     case 'methodcall':
       component =
           method_call.transformComponent(coreTypes, hierarchy, component);
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 8ea99dc..5fab418 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -137,7 +137,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 18;
+  UInt32 formatVersion = 20;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
   UriSource sourceMap;
@@ -845,6 +845,12 @@
   Expression body;
 }
 
+type BlockExpression extends Expression {
+  Byte tag = 82;
+  List<Statement> body;
+  Expression value;
+}
+
 type Instantiation extends Expression {
   Byte tag = 54;
   Expression expression;
@@ -911,6 +917,12 @@
   List<ConstantReference> values;
 }
 
+type SetConstant extends Constant {
+  Byte tag = 13; // Note: tag is out of order.
+  DartType type;
+  List<ConstantReference> values;
+}
+
 type InstanceConstant extends Constant {
   Byte tag = 8;
   CanonicalNameReference class;
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index d738ec5..939af1f 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -155,8 +155,6 @@
 
   Component get enclosingComponent => parent?.enclosingComponent;
 
-  Library get enclosingLibrary => parent?.enclosingLibrary;
-
   /// Returns the best known source location of the given AST node, or `null` if
   /// the node is orphaned.
   ///
@@ -468,8 +466,6 @@
   Location _getLocationInEnclosingFile(int offset) {
     return _getLocationInComponent(enclosingComponent, fileUri, offset);
   }
-
-  Library get enclosingLibraray => this;
 }
 
 /// An import or export declaration in a library.
@@ -3648,6 +3644,37 @@
   }
 }
 
+class BlockExpression extends Expression {
+  Block body;
+  Expression value;
+
+  BlockExpression(this.body, this.value) {
+    body?.parent = this;
+    value?.parent = this;
+  }
+
+  DartType getStaticType(TypeEnvironment types) => value.getStaticType(types);
+
+  accept(ExpressionVisitor v) => v.visitBlockExpression(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitBlockExpression(this, arg);
+
+  visitChildren(Visitor v) {
+    body?.accept(v);
+    value?.accept(v);
+  }
+
+  transformChildren(Transformer v) {
+    if (body != null) {
+      body = body.accept(v);
+      body?.parent = this;
+    }
+    if (value != null) {
+      value = value.accept(v);
+      value?.parent = this;
+    }
+  }
+}
+
 /// Attempt to load the library referred to by a deferred import.
 ///
 /// This instruction is concerned with:
@@ -5319,6 +5346,38 @@
       types.literalListType(typeArgument);
 }
 
+class SetConstant extends Constant {
+  final DartType typeArgument;
+  final List<Constant> entries;
+
+  SetConstant(this.typeArgument, this.entries);
+
+  visitChildren(Visitor v) {
+    typeArgument.accept(v);
+    for (final Constant constant in entries) {
+      constant.acceptReference(v);
+    }
+  }
+
+  accept(ConstantVisitor v) => v.visitSetConstant(this);
+  acceptReference(Visitor v) => v.visitSetConstantReference(this);
+
+  String toString() => '${this.runtimeType}<$typeArgument>($entries)';
+
+  int _cachedHashCode;
+  int get hashCode {
+    return _cachedHashCode ??= typeArgument.hashCode ^ listHashCode(entries);
+  }
+
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is SetConstant &&
+          other.typeArgument == typeArgument &&
+          listEquals(other.entries, entries));
+
+  DartType getType(TypeEnvironment types) => types.literalSetType(typeArgument);
+}
+
 class InstanceConstant extends Constant {
   final Reference classReference;
   final List<DartType> typeArguments;
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index cc11d87..29fc2cc 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -239,6 +239,15 @@
           entries[i] = readConstantReference();
         }
         return new ListConstant(typeArgument, entries);
+      case ConstantTag.SetConstant:
+        final DartType typeArgument = readDartType();
+        final int length = readUInt();
+        final List<Constant> entries =
+            new List<Constant>.filled(length, null, growable: true);
+        for (int i = 0; i < length; i++) {
+          entries[i] = readConstantReference();
+        }
+        return new SetConstant(typeArgument, entries);
       case ConstantTag.InstanceConstant:
         final Reference classReference = readClassReference();
         final int typeArgumentCount = readUInt();
@@ -1593,6 +1602,12 @@
         var body = readExpression();
         variableStack.length = stackHeight;
         return new Let(variable, body);
+      case Tag.BlockExpression:
+        int stackHeight = variableStack.length;
+        var statements = readStatementList();
+        var value = readExpression();
+        variableStack.length = stackHeight;
+        return new BlockExpression(new Block(statements), value);
       case Tag.Instantiation:
         var expression = readExpression();
         var typeArguments = readDartTypeList();
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 1b945ba..383e6ba 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -219,6 +219,11 @@
       writeDartType(constant.typeArgument);
       writeUInt30(constant.entries.length);
       constant.entries.forEach(writeConstantReference);
+    } else if (constant is SetConstant) {
+      writeByte(ConstantTag.SetConstant);
+      writeDartType(constant.typeArgument);
+      writeUInt30(constant.entries.length);
+      constant.entries.forEach(writeConstantReference);
     } else if (constant is InstanceConstant) {
       writeByte(ConstantTag.InstanceConstant);
       writeClassReference(constant.classNode);
@@ -1614,6 +1619,16 @@
   }
 
   @override
+  void visitBlockExpression(BlockExpression node) {
+    writeByte(Tag.BlockExpression);
+    _variableIndexer ??= new VariableIndexer();
+    _variableIndexer.pushScope();
+    writeNodeList(node.body.statements);
+    writeNode(node.value);
+    _variableIndexer.popScope();
+  }
+
+  @override
   void visitInstantiation(Instantiation node) {
     writeByte(Tag.Instantiation);
     writeNode(node.expression);
@@ -2110,6 +2125,16 @@
   }
 
   @override
+  void visitSetConstant(SetConstant node) {
+    throw new UnsupportedError('serialization of SetConstants');
+  }
+
+  @override
+  void visitSetConstantReference(SetConstant node) {
+    throw new UnsupportedError('serialization of SetConstant references');
+  }
+
+  @override
   void visitMapConstant(MapConstant node) {
     throw new UnsupportedError('serialization of MapConstants');
   }
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 280454f..ff6e228 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -67,6 +67,7 @@
   static const int AwaitExpression = 51;
   static const int FunctionExpression = 52;
   static const int Let = 53;
+  static const int BlockExpression = 82;
   static const int Instantiation = 54;
   static const int PositiveIntLiteral = 55;
   static const int NegativeIntLiteral = 56;
@@ -98,6 +99,7 @@
   static const int FunctionDeclaration = 79;
   static const int AsyncForInStatement = 80;
   static const int AssertBlock = 81;
+  // 82 is occupied by [BlockExpression] (expression).
 
   // Types
   static const int TypedefType = 87;
@@ -137,7 +139,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 18;
+  static const int BinaryFormatVersion = 20;
 }
 
 abstract class ConstantTag {
@@ -149,9 +151,11 @@
   static const int SymbolConstant = 5;
   static const int MapConstant = 6;
   static const int ListConstant = 7;
+  static const int SetConstant = 13;
   static const int InstanceConstant = 8;
   static const int PartialInstantiationConstant = 9;
   static const int TearOffConstant = 10;
   static const int TypeLiteralConstant = 11;
   static const int UnevaluatedConstant = 12;
+  // 13 is occupied by [SetConstant]
 }
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 17ade68..a059436 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -277,6 +277,10 @@
     return new Let(newVariable, clone(node.body));
   }
 
+  visitBlockExpression(BlockExpression node) {
+    return new BlockExpression(clone(node.body), clone(node.value));
+  }
+
   visitExpressionStatement(ExpressionStatement node) {
     return new ExpressionStatement(clone(node.expression));
   }
diff --git a/pkg/kernel/lib/core_types.dart b/pkg/kernel/lib/core_types.dart
index ddc4aac..aa8d0f7 100644
--- a/pkg/kernel/lib/core_types.dart
+++ b/pkg/kernel/lib/core_types.dart
@@ -33,11 +33,6 @@
     'dart:async': [
       'Future',
       'Stream',
-    ],
-    'dart:ffi': [
-      'DynamicLibrary',
-      'Pointer',
-      'Struct',
     ]
   };
 
@@ -100,95 +95,9 @@
   Field _pragmaOptions;
   Constructor _pragmaConstructor;
 
-  Library _ffiLibrary;
-  Class _ffiPointerClass;
-  Procedure _ffiPointerLoadProcedure;
-  Procedure _ffiPointerStoreProcedure;
-  Procedure _ffiPointerCastProcedure;
-  Procedure _ffiPointerOffsetByProcedure;
-  Procedure _ffiPointerAsFunctionProcedure;
-  Field _ffiStructField;
-  Class _ffiDynamicLibraryClass;
-  Procedure _ffiDynamicLibraryLookupFunctionProcedure;
-  Procedure _ffiAllocateProcedure;
-  Procedure _ffiSizeOfProcedure;
-  Procedure _ffiFromFunctionProcedure;
-  Class _ffiNativeFunctionClass;
-
   CoreTypes(Component component)
       : index = new LibraryIndex.coreLibraries(component);
 
-  Library get ffiLibrary {
-    return _ffiLibrary ??= index.getLibrary('dart:ffi');
-  }
-
-  Class get ffiPointerClass {
-    return _ffiPointerClass ??= index.getClass('dart:ffi', 'Pointer');
-  }
-
-  Procedure get ffiPointerLoadProcedure {
-    return _ffiPointerLoadProcedure ??=
-        index.getMember('dart:ffi', 'Pointer', 'load');
-  }
-
-  Procedure get ffiPointerStoreProcedure {
-    return _ffiPointerStoreProcedure ??=
-        index.getMember('dart:ffi', 'Pointer', 'store');
-  }
-
-  Procedure get ffiPointerCastProcedure {
-    return _ffiPointerCastProcedure ??=
-        index.getMember('dart:ffi', 'Pointer', 'cast');
-  }
-
-  Procedure get ffiPointerOffsetByProcedure {
-    return _ffiPointerOffsetByProcedure ??=
-        index.getMember('dart:ffi', 'Pointer', 'offsetBy');
-  }
-
-  Procedure get ffiPointerAsFunctionProcedure {
-    return _ffiPointerAsFunctionProcedure ??=
-        index.getMember('dart:ffi', 'Pointer', 'asFunction');
-  }
-
-  Field get ffiStructField {
-    return _ffiStructField ??= index.getTopLevelMember('dart:ffi', 'struct');
-  }
-
-  Class get ffiDynamicLibraryClass {
-    return _ffiDynamicLibraryClass ??=
-        index.getClass('dart:ffi', 'DynamicLibrary');
-  }
-
-  Procedure get ffiDynamicLibraryLookupFunctionProcedure {
-    return _ffiDynamicLibraryLookupFunctionProcedure ??=
-        index.getMember('dart:ffi', 'DynamicLibrary', 'lookupFunction');
-  }
-
-  Procedure get ffiAllocateProcedure {
-    return _ffiAllocateProcedure ??=
-        index.getTopLevelMember('dart:ffi', 'allocate');
-  }
-
-  Procedure get ffiSizeOfProcedure {
-    return _ffiSizeOfProcedure ??=
-        index.getTopLevelMember('dart:ffi', 'sizeOf');
-  }
-
-  Procedure get ffiFromFunctionProcedure {
-    return _ffiFromFunctionProcedure ??=
-        index.getTopLevelMember('dart:ffi', 'fromFunction');
-  }
-
-  Class get ffiNativeFunctionClass {
-    return _ffiNativeFunctionClass ??=
-        index.getClass('dart:ffi', 'NativeFunction');
-  }
-
-  Class ffiNativeTypeClass(String name) {
-    return index.getClass('dart:ffi', name);
-  }
-
   Procedure get asyncErrorWrapperHelperProcedure {
     return _asyncErrorWrapperHelperProcedure ??=
         index.getTopLevelMember('dart:async', '_asyncErrorWrapperHelper');
diff --git a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
index beae19b..d41962f 100644
--- a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
+++ b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
@@ -15,9 +15,8 @@
 class HierarchyBasedTypeEnvironment extends TypeEnvironment {
   final ClassHierarchy hierarchy;
 
-  HierarchyBasedTypeEnvironment(CoreTypes coreTypes, this.hierarchy,
-      {bool legacyMode: false})
-      : super.fromSubclass(coreTypes, legacyMode: legacyMode);
+  HierarchyBasedTypeEnvironment(CoreTypes coreTypes, this.hierarchy)
+      : super.fromSubclass(coreTypes);
 
   @override
   InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass) {
diff --git a/pkg/kernel/lib/src/tool/command_line_util.dart b/pkg/kernel/lib/src/tool/command_line_util.dart
index 7149f76..937093e 100644
--- a/pkg/kernel/lib/src/tool/command_line_util.dart
+++ b/pkg/kernel/lib/src/tool/command_line_util.dart
@@ -5,67 +5,6 @@
 import 'dart:io';
 
 import 'package:kernel/kernel.dart';
-import 'package:kernel/transformations/treeshaker.dart';
-
-/// Parses all given [embedderEntryPointManifests] and returns the program roots
-/// specified in them.
-///
-/// A embedder manifest consists of lines of the following form:
-///
-///   <import-uri>,<class-name>,<member-name>
-///
-/// Where
-///
-///   <import-uri> : The uri of the library which contains the root.
-///   <class-name> : Is either the name of the class or '::' for the library.
-///   <member-name>: Can be of the forms:
-///
-///     - get:<name>
-///     - set:<name>
-///     - <field-name>
-///     - <procedure-name>
-///     - <constructor-name>
-///     - <klass>.<factory-constructor-name>
-///     - *external-instantiation*
-///
-List<ProgramRoot> parseProgramRoots(List<String> embedderEntryPointManifests) {
-  List<ProgramRoot> roots = <ProgramRoot>[];
-
-  for (var file in embedderEntryPointManifests) {
-    var lines = new File(file).readAsStringSync().trim().split('\n');
-    for (var line in lines) {
-      var parts = line.split(',');
-      assert(parts.length == 3);
-
-      var library = parts[0];
-      var klass = parts[1];
-      var member = parts[2];
-
-      // The vm represents the toplevel class as '::'.
-      if (klass == '::') klass = null;
-
-      ProgramRootKind kind = ProgramRootKind.Other;
-
-      if (member.startsWith('set:')) {
-        kind = ProgramRootKind.Setter;
-        member = member.substring('set:'.length);
-      } else if (member.startsWith('get:')) {
-        kind = ProgramRootKind.Getter;
-        member = member.substring('get:'.length);
-      } else if (member == "*external-instantiation*") {
-        kind = ProgramRootKind.ExternallyInstantiatedClass;
-        member = null;
-      } else if (member.startsWith('$klass.')) {
-        kind = ProgramRootKind.Constructor;
-        member = member.substring('$klass.'.length);
-      }
-
-      roots.add(new ProgramRoot(library, klass, member, kind));
-    }
-  }
-
-  return roots;
-}
 
 class CommandLineHelper {
   static requireExactlyOneArgument(List<String> args, void Function() usage,
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index a0e9a5b..3472254 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -7,22 +7,13 @@
 import '../class_hierarchy.dart';
 import '../core_types.dart';
 import '../transformations/constants.dart' show ConstantsBackend;
-import '../transformations/treeshaker.dart' show ProgramRoot;
 
 final List<String> targetNames = targets.keys.toList();
 
 class TargetFlags {
   final bool legacyMode;
-  final bool treeShake;
 
-  final List<ProgramRoot> programRoots;
-  final Uri kernelRuntime;
-
-  TargetFlags(
-      {this.legacyMode: false,
-      this.treeShake: false,
-      this.programRoots: const <ProgramRoot>[],
-      this.kernelRuntime});
+  TargetFlags({this.legacyMode: false});
 }
 
 typedef Target _TargetBuilder(TargetFlags flags);
@@ -240,5 +231,5 @@
 
   @override
   ConstantsBackend constantsBackend(CoreTypes coreTypes) =>
-      new ConstantsBackend();
+      const ConstantsBackend();
 }
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index dc0a65e..94d2f55 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -448,6 +448,8 @@
         Library nodeLibrary = node.enclosingLibrary;
         String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
         write(prefix + '::' + node.name);
+      } else if (reference.canonicalName != null) {
+        write(reference.canonicalName.toString());
       } else {
         throw new UnimplementedError('${node.runtimeType}');
       }
@@ -1392,6 +1394,13 @@
     writeExpression(node.body);
   }
 
+  visitBlockExpression(BlockExpression node) {
+    writeSpaced('block');
+    writeBlockBody(node.body.statements, asExpression: true);
+    writeSymbol(' =>');
+    writeExpression(node.value);
+  }
+
   visitInstantiation(Instantiation node) {
     writeExpression(node.expression);
     writeSymbol('<');
@@ -1541,33 +1550,28 @@
     endLine(';');
   }
 
-  visitBlock(Block node) {
-    writeIndentation();
-    if (node.statements.isEmpty) {
-      endLine('{}');
-      return null;
+  void writeBlockBody(List<Statement> statements, {bool asExpression = false}) {
+    if (statements.isEmpty) {
+      asExpression ? writeSymbol('{}') : endLine('{}');
+      return;
     }
     endLine('{');
     ++indentation;
-    node.statements.forEach(writeNode);
+    statements.forEach(writeNode);
     --indentation;
     writeIndentation();
-    endLine('}');
+    asExpression ? writeSymbol('}') : endLine('}');
+  }
+
+  visitBlock(Block node) {
+    writeIndentation();
+    writeBlockBody(node.statements);
   }
 
   visitAssertBlock(AssertBlock node) {
     writeIndentation();
     writeSpaced('assert');
-    if (node.statements.isEmpty) {
-      endLine('{}');
-      return;
-    }
-    endLine('{');
-    ++indentation;
-    node.statements.forEach(writeNode);
-    --indentation;
-    writeIndentation();
-    endLine('}');
+    writeBlockBody(node.statements);
   }
 
   visitEmptyStatement(EmptyStatement node) {
@@ -1575,8 +1579,8 @@
     endLine(';');
   }
 
-  visitAssertStatement(AssertStatement node, {bool asExpr = false}) {
-    if (asExpr != true) {
+  visitAssertStatement(AssertStatement node, {bool asExpression = false}) {
+    if (!asExpression) {
       writeIndentation();
     }
     writeWord('assert');
@@ -1586,7 +1590,7 @@
       writeComma();
       writeExpression(node.message);
     }
-    if (asExpr != true) {
+    if (!asExpression) {
       endLine(');');
     } else {
       writeSymbol(')');
@@ -1863,7 +1867,7 @@
   }
 
   visitAssertInitializer(AssertInitializer node) {
-    visitAssertStatement(node.statement, asExpr: true);
+    visitAssertStatement(node.statement, asExpression: true);
   }
 
   defaultInitializer(Initializer node) {
@@ -1944,6 +1948,15 @@
     endLine('${node.runtimeType}<${node.typeArgument}>($entries)');
   }
 
+  visitSetConstant(SetConstant node) {
+    final String name = syntheticNames.nameConstant(node);
+    write('  $name = ');
+    final String entries = node.entries.map((Constant constant) {
+      return syntheticNames.nameConstant(constant);
+    }).join(', ');
+    endLine('${node.runtimeType}<${node.typeArgument}>($entries)');
+  }
+
   visitMapConstant(MapConstant node) {
     final String name = syntheticNames.nameConstant(node);
     write('  $name = ');
diff --git a/pkg/kernel/lib/text/serializer_combinators.dart b/pkg/kernel/lib/text/serializer_combinators.dart
index c06937d..e6db3ac 100644
--- a/pkg/kernel/lib/text/serializer_combinators.dart
+++ b/pkg/kernel/lib/text/serializer_combinators.dart
@@ -11,49 +11,51 @@
 import 'text_serializer.dart' show Tagger;
 
 class DeserializationEnvironment<T extends Node> {
-  final Map<String, T> locals = <String, T>{};
-
   final DeserializationEnvironment<T> parent;
 
-  final Set<String> usedNames = new Set<String>();
+  final Map<String, T> locals = <String, T>{};
 
-  DeserializationEnvironment(this.parent) {
-    if (parent != null) {
-      usedNames.addAll(parent.usedNames);
-    }
-  }
+  final Map<String, T> binders = <String, T>{};
+
+  final Set<String> usedNames;
+
+  DeserializationEnvironment(this.parent)
+      : usedNames = parent?.usedNames?.toSet() ?? new Set<String>();
 
   T lookup(String name) => locals[name] ?? parent?.lookup(name);
 
-  T add(String name, T node) {
+  T addBinder(String name, T node) {
     if (usedNames.contains(name)) {
       throw StateError("name '$name' is already declared in this scope");
     }
     usedNames.add(name);
-    return locals[name] = node;
+    return binders[name] = node;
+  }
+
+  void close() {
+    locals.addAll(binders);
+    binders.clear();
   }
 }
 
 class SerializationEnvironment<T extends Node> {
+  final SerializationEnvironment<T> parent;
+
   final Map<T, String> locals = new Map<T, String>.identity();
 
+  final Map<T, String> binders = new Map<T, String>.identity();
+
   int nameCount;
 
-  final SerializationEnvironment<T> parent;
-
-  static const String separator = "^";
-
-  static final int codeOfZero = "0".codeUnitAt(0);
-
-  static final int codeOfNine = "9".codeUnitAt(0);
-
-  SerializationEnvironment(this.parent) {
-    nameCount = (parent?.nameCount ?? 0);
-  }
+  SerializationEnvironment(this.parent) : nameCount = parent?.nameCount ?? 0;
 
   String lookup(T node) => locals[node] ?? parent?.lookup(node);
 
-  String add(T node, String name) {
+  String addBinder(T node, String name) {
+    final String separator = "^";
+    final int codeOfZero = "0".codeUnitAt(0);
+    final int codeOfNine = "9".codeUnitAt(0);
+
     int prefixLength = name.length - 1;
     bool isOnlyDigits = true;
     while (prefixLength >= 0 && name[prefixLength] != separator) {
@@ -65,7 +67,12 @@
       prefixLength = name.length;
     }
     String prefix = name.substring(0, prefixLength);
-    return locals[node] = "$prefix$separator${nameCount++}";
+    return binders[node] = "$prefix$separator${nameCount++}";
+  }
+
+  void close() {
+    locals.addAll(binders);
+    binders.clear();
   }
 }
 
@@ -417,3 +424,125 @@
     }
   }
 }
+
+/// Introduces a binder to the environment.
+///
+/// Serializes an object and uses it as a binder for the name that is retrieved
+/// from the object using [nameGetter] and (temporarily) modified using
+/// [nameSetter].  The binder is added to the enclosing environment.
+class Binder<T extends Node> extends TextSerializer<T> {
+  final TextSerializer<T> contents;
+  final String Function(T) nameGetter;
+  final void Function(T, String) nameSetter;
+
+  const Binder(this.contents, this.nameGetter, this.nameSetter);
+
+  T readFrom(Iterator<Object> stream, DeserializationState state) {
+    T object = contents.readFrom(stream, state);
+    state.environment.addBinder(nameGetter(object), object);
+    return object;
+  }
+
+  void writeTo(StringBuffer buffer, T object, SerializationState state) {
+    String oldName = nameGetter(object);
+    String newName = state.environment.addBinder(object, oldName);
+    nameSetter(object, newName);
+    contents.writeTo(buffer, object, state);
+    nameSetter(object, oldName);
+  }
+}
+
+/// Binds binders from one term in the other.
+///
+/// Serializes a [Tuple2] of [pattern] and [term], closing [term] over the
+/// binders found in [pattern].  The binders aren't added to the enclosing
+/// environment.
+class Bind<P, T> extends TextSerializer<Tuple2<P, T>> {
+  final TextSerializer<P> pattern;
+  final TextSerializer<T> term;
+
+  const Bind(this.pattern, this.term);
+
+  Tuple2<P, T> readFrom(Iterator<Object> stream, DeserializationState state) {
+    var bindingState = new DeserializationState(
+        new DeserializationEnvironment(state.environment), state.nameRoot);
+    P first = pattern.readFrom(stream, bindingState);
+    bindingState.environment.close();
+    T second = term.readFrom(stream, bindingState);
+    return new Tuple2(first, second);
+  }
+
+  void writeTo(
+      StringBuffer buffer, Tuple2<P, T> tuple, SerializationState state) {
+    var bindingState =
+        new SerializationState(new SerializationEnvironment(state.environment));
+    pattern.writeTo(buffer, tuple.first, bindingState);
+    bindingState.environment.close();
+    buffer.write(' ');
+    term.writeTo(buffer, tuple.second, bindingState);
+  }
+}
+
+/// Binds binders from one term in the other and adds them to the environment.
+///
+/// Serializes a [Tuple2] of [pattern] and [term], closing [term] over the
+/// binders found in [pattern].  The binders are added to the enclosing
+/// environment.
+class Rebind<P, T> extends TextSerializer<Tuple2<P, T>> {
+  final TextSerializer<P> pattern;
+  final TextSerializer<T> term;
+
+  const Rebind(this.pattern, this.term);
+
+  Tuple2<P, T> readFrom(Iterator<Object> stream, DeserializationState state) {
+    P first = pattern.readFrom(stream, state);
+    var closedState = new DeserializationState(
+        new DeserializationEnvironment(state.environment)
+          ..binders.addAll(state.environment.binders)
+          ..close(),
+        state.nameRoot);
+    T second = term.readFrom(stream, closedState);
+    return new Tuple2(first, second);
+  }
+
+  void writeTo(
+      StringBuffer buffer, Tuple2<P, T> tuple, SerializationState state) {
+    pattern.writeTo(buffer, tuple.first, state);
+    var closedState =
+        new SerializationState(new SerializationEnvironment(state.environment)
+          ..binders.addAll(state.environment.binders)
+          ..close());
+    buffer.write(' ');
+    term.writeTo(buffer, tuple.second, closedState);
+  }
+}
+
+class Zip<T, T1, T2> extends TextSerializer<List<T>> {
+  final TextSerializer<Tuple2<List<T1>, List<T2>>> lists;
+  final T Function(T1, T2) zip;
+  final Tuple2<T1, T2> Function(T) unzip;
+
+  const Zip(this.lists, this.zip, this.unzip);
+
+  List<T> readFrom(Iterator<Object> stream, DeserializationState state) {
+    Tuple2<List<T1>, List<T2>> toZip = lists.readFrom(stream, state);
+    List<T1> firsts = toZip.first;
+    List<T2> seconds = toZip.second;
+    List<T> zipped = new List<T>(toZip.first.length);
+    for (int i = 0; i < zipped.length; ++i) {
+      zipped[i] = zip(firsts[i], seconds[i]);
+    }
+    return zipped;
+  }
+
+  void writeTo(StringBuffer buffer, List<T> zipped, SerializationState state) {
+    List<T1> firsts = new List<T1>(zipped.length);
+    List<T2> seconds = new List<T2>(zipped.length);
+    for (int i = 0; i < zipped.length; ++i) {
+      Tuple2<T1, T2> tuple = unzip(zipped[i]);
+      firsts[i] = tuple.first;
+      seconds[i] = tuple.second;
+    }
+    lists.writeTo(buffer, new Tuple2(firsts, seconds), state);
+  }
+}
diff --git a/pkg/kernel/lib/text/text_serialization_verifier.dart b/pkg/kernel/lib/text/text_serialization_verifier.dart
index 78659ef..2625376 100644
--- a/pkg/kernel/lib/text/text_serialization_verifier.dart
+++ b/pkg/kernel/lib/text/text_serialization_verifier.dart
@@ -10,7 +10,11 @@
 import '../text/text_reader.dart' show TextIterator;
 
 import '../text/text_serializer.dart'
-    show dartTypeSerializer, expressionSerializer, initializeSerializers;
+    show
+        dartTypeSerializer,
+        expressionSerializer,
+        initializeSerializers,
+        statementSerializer;
 
 import '../visitor.dart' show Visitor;
 
@@ -144,6 +148,28 @@
     }
   }
 
+  void makeStatementRoundTrip(Statement node) {
+    Uri uri = noUri;
+    int offset = noOffset;
+    Location location = node.location;
+    if (location != null) {
+      uri = location.file;
+      offset = node.fileOffset;
+    }
+
+    String initial = writeNode(node, statementSerializer, uri, offset);
+
+    // Do the round trip.
+    Statement deserialized =
+        readNode(initial, statementSerializer, uri, offset);
+    String serialized =
+        writeNode(deserialized, expressionSerializer, uri, offset);
+
+    if (initial != serialized) {
+      failures.add(new TextRoundTripFailure(initial, serialized, uri, offset));
+    }
+  }
+
   @override
   void defaultExpression(Expression node) {
     throw new UnsupportedError("defaultExpression");
@@ -262,6 +288,12 @@
   }
 
   @override
+  void visitSetConstantReference(SetConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
   void visitMapConstantReference(MapConstant node) {
     storeLastSeenUriAndOffset(node);
     node.visitChildren(this);
@@ -346,6 +378,12 @@
   }
 
   @override
+  void visitSetConstant(SetConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
   void visitMapConstant(MapConstant node) {
     storeLastSeenUriAndOffset(node);
     node.visitChildren(this);
@@ -588,121 +626,121 @@
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitYieldStatement(YieldStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitTryFinally(TryFinally node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitTryCatch(TryCatch node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitReturnStatement(ReturnStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitIfStatement(IfStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitContinueSwitchStatement(ContinueSwitchStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitSwitchStatement(SwitchStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitForInStatement(ForInStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitForStatement(ForStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitDoStatement(DoStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitWhileStatement(WhileStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitBreakStatement(BreakStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitLabeledStatement(LabeledStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitAssertStatement(AssertStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitEmptyStatement(EmptyStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitAssertBlock(AssertBlock node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitBlock(Block node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
   void visitExpressionStatement(ExpressionStatement node) {
     storeLastSeenUriAndOffset(node);
-    node.visitChildren(this);
+    makeStatementRoundTrip(node);
   }
 
   @override
@@ -730,6 +768,12 @@
   }
 
   @override
+  void visitBlockExpression(BlockExpression node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
   void visitNullLiteral(NullLiteral node) {
     storeLastSeenUriAndOffset(node);
     makeExpressionRoundTrip(node);
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index b3a3595..f13dc82 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -388,37 +388,27 @@
       keyType: tuple.first, valueType: tuple.second, isConst: true);
 }
 
-class LetSerializer extends TextSerializer<Let> {
-  const LetSerializer();
+TextSerializer<Let> letSerializer = new Wrapped(
+    unwrapLet,
+    wrapLet,
+    new Bind(
+        new Binder(variableDeclarationSerializer, getVariableDeclarationName,
+            setVariableDeclarationName),
+        expressionSerializer));
 
-  Let readFrom(Iterator<Object> stream, DeserializationState state) {
-    VariableDeclaration variable =
-        variableDeclarationSerializer.readFrom(stream, state);
-    Expression body = expressionSerializer.readFrom(
-        stream,
-        new DeserializationState(
-            new DeserializationEnvironment(state.environment)
-              ..add(variable.name, variable),
-            state.nameRoot));
-    return new Let(variable, body);
-  }
-
-  void writeTo(StringBuffer buffer, Let object, SerializationState state) {
-    SerializationState bodyState =
-        new SerializationState(new SerializationEnvironment(state.environment));
-    VariableDeclaration variable = object.variable;
-    String oldVariableName = variable.name;
-    String newVariableName =
-        bodyState.environment.add(variable, oldVariableName);
-    variableDeclarationSerializer.writeTo(
-        buffer, variable..name = newVariableName, state);
-    variable.name = oldVariableName;
-    buffer.write(' ');
-    expressionSerializer.writeTo(buffer, object.body, bodyState);
-  }
+Tuple2<VariableDeclaration, Expression> unwrapLet(Let expression) {
+  return new Tuple2(expression.variable, expression.body);
 }
 
-TextSerializer<Let> letSerializer = const LetSerializer();
+Let wrapLet(Tuple2<VariableDeclaration, Expression> tuple) {
+  return new Let(tuple.first, tuple.second);
+}
+
+String getVariableDeclarationName(VariableDeclaration node) => node.name;
+
+void setVariableDeclarationName(VariableDeclaration node, String name) {
+  node.name = name;
+}
 
 TextSerializer<PropertyGet> propertyGetSerializer = new Wrapped(
     unwrapPropertyGet,
@@ -828,6 +818,50 @@
   constDeclarationSerializer,
 ]);
 
+TextSerializer<TypeParameter> typeParameterSerializer =
+    new Wrapped(unwrapTypeParameter, wrapTypeParameter, const DartString());
+
+String unwrapTypeParameter(TypeParameter node) => node.name;
+
+TypeParameter wrapTypeParameter(String name) => new TypeParameter(name);
+
+TextSerializer<List<TypeParameter>> typeParametersSerializer = new Zip(
+    new Rebind(
+        new Zip(
+            new Rebind(
+                new ListSerializer(new Binder(typeParameterSerializer,
+                    getTypeParameterName, setTypeParameterName)),
+                new ListSerializer(dartTypeSerializer)),
+            zipTypeParameterBound,
+            unzipTypeParameterBound),
+        new ListSerializer(dartTypeSerializer)),
+    zipTypeParameterDefaultType,
+    unzipTypeParameterDefaultType);
+
+String getTypeParameterName(TypeParameter node) => node.name;
+
+void setTypeParameterName(TypeParameter node, String name) {
+  node.name = name;
+}
+
+TypeParameter zipTypeParameterBound(TypeParameter node, DartType bound) {
+  return node..bound = bound;
+}
+
+Tuple2<TypeParameter, DartType> unzipTypeParameterBound(TypeParameter node) {
+  return new Tuple2(node, node.bound);
+}
+
+TypeParameter zipTypeParameterDefaultType(
+    TypeParameter node, DartType defaultType) {
+  return node..defaultType = defaultType;
+}
+
+Tuple2<TypeParameter, DartType> unzipTypeParameterDefaultType(
+    TypeParameter node) {
+  return new Tuple2(node, node.defaultType);
+}
+
 class DartTypeTagger extends DartTypeVisitor<String>
     implements Tagger<DartType> {
   const DartTypeTagger();
@@ -839,6 +873,7 @@
   String visitVoidType(VoidType _) => "void";
   String visitBottomType(BottomType _) => "bottom";
   String visitFunctionType(FunctionType _) => "->";
+  String visitTypeParameterType(TypeParameterType _) => "par";
 }
 
 TextSerializer<InvalidType> invalidTypeSerializer =
@@ -869,26 +904,93 @@
 
 BottomType wrapBottomType(void ignored) => const BottomType();
 
-// TODO(dmitryas):  Also handle typeParameters, nameParameters, and typedefType.
+// TODO(dmitryas):  Also handle nameParameters, and typedefType.
 TextSerializer<FunctionType> functionTypeSerializer = new Wrapped(
     unwrapFunctionType,
     wrapFunctionType,
-    Tuple3Serializer(new ListSerializer(dartTypeSerializer), const DartInt(),
-        dartTypeSerializer));
+    new Bind(
+        typeParametersSerializer,
+        new Tuple4Serializer(
+            new ListSerializer(dartTypeSerializer),
+            new ListSerializer(dartTypeSerializer),
+            new ListSerializer(namedTypeSerializer),
+            dartTypeSerializer)));
 
-Tuple3<List<DartType>, int, DartType> unwrapFunctionType(FunctionType type) {
-  return new Tuple3(
-      type.positionalParameters, type.requiredParameterCount, type.returnType);
+Tuple2<List<TypeParameter>,
+        Tuple4<List<DartType>, List<DartType>, List<NamedType>, DartType>>
+    unwrapFunctionType(FunctionType type) {
+  return new Tuple2(
+      type.typeParameters,
+      new Tuple4(
+          type.positionalParameters.sublist(0, type.requiredParameterCount),
+          type.positionalParameters.sublist(type.requiredParameterCount),
+          type.namedParameters,
+          type.returnType));
 }
 
-FunctionType wrapFunctionType(Tuple3<List<DartType>, int, DartType> tuple) {
-  return new FunctionType(tuple.first, tuple.third,
-      requiredParameterCount: tuple.second);
+FunctionType wrapFunctionType(
+    Tuple2<List<TypeParameter>,
+            Tuple4<List<DartType>, List<DartType>, List<NamedType>, DartType>>
+        tuple) {
+  return new FunctionType(
+      tuple.second.first + tuple.second.second, tuple.second.fourth,
+      requiredParameterCount: tuple.second.first.length,
+      typeParameters: tuple.first,
+      namedParameters: tuple.second.third);
+}
+
+TextSerializer<NamedType> namedTypeSerializer = new Wrapped(unwrapNamedType,
+    wrapNamedType, Tuple2Serializer(const DartString(), dartTypeSerializer));
+
+Tuple2<String, DartType> unwrapNamedType(NamedType namedType) {
+  return new Tuple2(namedType.name, namedType.type);
+}
+
+NamedType wrapNamedType(Tuple2<String, DartType> tuple) {
+  return new NamedType(tuple.first, tuple.second);
+}
+
+TextSerializer<TypeParameterType> typeParameterTypeSerializer = new Wrapped(
+    unwrapTypeParameterType,
+    wrapTypeParameterType,
+    Tuple2Serializer(
+        new ScopedUse<TypeParameter>(), new Optional(dartTypeSerializer)));
+
+Tuple2<TypeParameter, DartType> unwrapTypeParameterType(
+    TypeParameterType node) {
+  return new Tuple2(node.parameter, node.promotedBound);
+}
+
+TypeParameterType wrapTypeParameterType(Tuple2<TypeParameter, DartType> tuple) {
+  return new TypeParameterType(tuple.first, tuple.second);
 }
 
 Case<DartType> dartTypeSerializer =
     new Case.uninitialized(const DartTypeTagger());
 
+class StatementTagger extends StatementVisitor<String>
+    implements Tagger<Statement> {
+  const StatementTagger();
+
+  String tag(Statement statement) => statement.accept(this);
+
+  String visitExpressionStatement(ExpressionStatement _) => "expr";
+}
+
+TextSerializer<ExpressionStatement> expressionStatementSerializer = new Wrapped(
+    unwrapExpressionStatement, wrapExpressionStatement, expressionSerializer);
+
+Expression unwrapExpressionStatement(ExpressionStatement statement) {
+  return statement.expression;
+}
+
+ExpressionStatement wrapExpressionStatement(Expression expression) {
+  return new ExpressionStatement(expression);
+}
+
+Case<Statement> statementSerializer =
+    new Case.uninitialized(const StatementTagger());
+
 void initializeSerializers() {
   expressionSerializer.tags.addAll([
     "string",
@@ -986,6 +1088,7 @@
     "void",
     "bottom",
     "->",
+    "par",
   ]);
   dartTypeSerializer.serializers.addAll([
     invalidTypeSerializer,
@@ -993,5 +1096,12 @@
     voidTypeSerializer,
     bottomTypeSerializer,
     functionTypeSerializer,
+    typeParameterTypeSerializer,
+  ]);
+  statementSerializer.tags.addAll([
+    "expr",
+  ]);
+  statementSerializer.serializers.addAll([
+    expressionStatementSerializer,
   ]);
 }
diff --git a/pkg/kernel/lib/transformations/constants.dart b/pkg/kernel/lib/transformations/constants.dart
index eceaa13..f4361bd 100644
--- a/pkg/kernel/lib/transformations/constants.dart
+++ b/pkg/kernel/lib/transformations/constants.dart
@@ -22,6 +22,7 @@
 
 import '../ast.dart';
 import '../class_hierarchy.dart';
+import '../clone.dart';
 import '../core_types.dart';
 import '../kernel.dart';
 import '../type_algebra.dart';
@@ -30,7 +31,6 @@
 Component transformComponent(Component component, ConstantsBackend backend,
     Map<String, String> environmentDefines, ErrorReporter errorReporter,
     {bool keepFields: false,
-    bool legacyMode: false,
     bool enableAsserts: false,
     bool evaluateAnnotations: true,
     CoreTypes coreTypes,
@@ -38,8 +38,7 @@
   coreTypes ??= new CoreTypes(component);
   hierarchy ??= new ClassHierarchy(component);
 
-  final typeEnvironment =
-      new TypeEnvironment(coreTypes, hierarchy, legacyMode: legacyMode);
+  final typeEnvironment = new TypeEnvironment(coreTypes, hierarchy);
 
   transformLibraries(component.libraries, backend, environmentDefines,
       typeEnvironment, errorReporter,
@@ -203,9 +202,7 @@
 
   visitFunctionNode(FunctionNode node) {
     final positionalParameterCount = node.positionalParameters.length;
-    for (int i = node.requiredParameterCount;
-        i < positionalParameterCount;
-        ++i) {
+    for (int i = 0; i < positionalParameterCount; ++i) {
       final VariableDeclaration variable = node.positionalParameters[i];
       transformAnnotations(variable.annotations, variable);
       if (variable.initializer != null) {
@@ -375,6 +372,7 @@
 
 class ConstantEvaluator extends RecursiveVisitor {
   final ConstantsBackend backend;
+  final NumberSemantics numberSemantics;
   Map<String, String> environmentDefines;
   final CoreTypes coreTypes;
   final TypeEnvironment typeEnvironment;
@@ -385,6 +383,7 @@
 
   final Map<Constant, Constant> canonicalizationCache;
   final Map<Node, Object> nodeCache;
+  final CloneVisitor cloner = new CloneVisitor();
 
   final NullConstant nullConstant = new NullConstant();
   final BoolConstant trueConstant = new BoolConstant(true);
@@ -394,23 +393,68 @@
 
   InstanceBuilder instanceBuilder;
   EvaluationEnvironment env;
+  Expression evaluationRoot;
+  Set<TreeNode> unevaluatedNodes;
+  Set<Expression> replacementNodes;
+
+  bool get targetingJavaScript => numberSemantics == NumberSemantics.js;
 
   ConstantEvaluator(this.backend, this.environmentDefines, this.typeEnvironment,
       this.enableAsserts, this.errorReporter)
-      : coreTypes = typeEnvironment.coreTypes,
+      : numberSemantics = backend.numberSemantics,
+        coreTypes = typeEnvironment.coreTypes,
         canonicalizationCache = <Constant, Constant>{},
         nodeCache = <Node, Constant>{},
         env = new EvaluationEnvironment();
 
   /// Evaluates [node] and possibly cache the evaluation result.
   Constant evaluate(Expression node) {
+    evaluationRoot = node;
     try {
       return _evaluateSubexpression(node);
     } on _AbortCurrentEvaluation catch (e) {
       return new UnevaluatedConstant(new InvalidExpression(e.message));
+    } finally {
+      // Release collections used to keep track of unevaluated nodes.
+      evaluationRoot = null;
+      unevaluatedNodes = null;
+      replacementNodes = null;
     }
   }
 
+  /// Produce an unevaluated constant node for an expression.
+  /// Mark all ancestors (up to the root of the constant evaluation) to
+  /// indicate that they should also be unevaluated.
+  Constant unevaluated(Expression original, Expression replacement) {
+    assert(evaluationRoot != null);
+    replacement.fileOffset = original.fileOffset;
+    unevaluatedNodes ??= new Set<TreeNode>.identity();
+    TreeNode mark = original;
+    while (unevaluatedNodes.add(mark)) {
+      if (identical(mark, evaluationRoot)) break;
+      mark = mark.parent;
+    }
+    return new UnevaluatedConstant(replacement);
+  }
+
+  /// Called whenever an expression is extracted from an unevaluated constant
+  /// to become part of the expression tree of another unevaluated constant.
+  /// Makes sure a particular expression occurs only once in the tree by
+  /// cloning further instances.
+  Expression unique(Expression expression) {
+    replacementNodes ??= new Set<Expression>.identity();
+    if (!replacementNodes.add(expression)) {
+      expression = cloner.clone(expression);
+      replacementNodes.add(expression);
+    }
+    return expression;
+  }
+
+  /// Should this node become unevaluated because of an unevaluated child?
+  bool hasUnevaluatedChild(TreeNode node) {
+    return unevaluatedNodes != null && unevaluatedNodes.contains(node);
+  }
+
   /// Evaluates [node] and possibly cache the evaluation result.
   /// @throws _AbortCurrentEvaluation if expression can't be evaluated.
   Constant _evaluateSubexpression(Expression node) {
@@ -477,7 +521,7 @@
   }
 
   visitDoubleLiteral(DoubleLiteral node) {
-    return canonicalize(new DoubleConstant(node.value));
+    return canonicalize(makeDoubleConstant(node.value));
   }
 
   visitStringLiteral(StringLiteral node) {
@@ -504,10 +548,45 @@
     }
     final List<Constant> entries = new List<Constant>(node.expressions.length);
     for (int i = 0; i < node.expressions.length; ++i) {
-      entries[i] = node.expressions[i].accept(this);
+      entries[i] = _evaluateSubexpression(node.expressions[i]);
+    }
+    if (hasUnevaluatedChild(node)) {
+      final expressions = new List<Expression>(node.expressions.length);
+      for (int i = 0; i < node.expressions.length; ++i) {
+        expressions[i] = unique(entries[i].asExpression());
+      }
+      return unevaluated(
+          node,
+          new ListLiteral(expressions,
+              typeArgument: node.typeArgument, isConst: true));
     }
     final DartType typeArgument = evaluateDartType(node, node.typeArgument);
-    return canonicalize(new ListConstant(typeArgument, entries));
+    return canonicalize(
+        backend.lowerListConstant(new ListConstant(typeArgument, entries)));
+  }
+
+  visitSetLiteral(SetLiteral node) {
+    if (!node.isConst) {
+      throw new _AbortCurrentEvaluation(
+          errorReporter.nonConstLiteral(contextChain, node, 'Set'));
+    }
+    final List<Constant> entries = new List<Constant>(node.expressions.length);
+    for (int i = 0; i < node.expressions.length; ++i) {
+      entries[i] = _evaluateSubexpression(node.expressions[i]);
+    }
+    if (hasUnevaluatedChild(node)) {
+      final expressions = new List<Expression>(node.expressions.length);
+      for (int i = 0; i < node.expressions.length; ++i) {
+        expressions[i] = unique(entries[i].asExpression());
+      }
+      return unevaluated(
+          node,
+          new SetLiteral(expressions,
+              typeArgument: node.typeArgument, isConst: true));
+    }
+    final DartType typeArgument = evaluateDartType(node, node.typeArgument);
+    return canonicalize(
+        backend.lowerSetConstant(new SetConstant(typeArgument, entries)));
   }
 
   visitMapLiteral(MapLiteral node) {
@@ -519,8 +598,8 @@
     final List<ConstantMapEntry> entries =
         new List<ConstantMapEntry>(node.entries.length);
     for (int i = 0; i < node.entries.length; ++i) {
-      final key = node.entries[i].key.accept(this);
-      final value = node.entries[i].value.accept(this);
+      final key = _evaluateSubexpression(node.entries[i].key);
+      final value = _evaluateSubexpression(node.entries[i].value);
       if (!usedKeys.add(key)) {
         // TODO(kustermann): We should change the context handling from just
         // capturing the `TreeNode`s to a `(TreeNode, String message)` tuple and
@@ -530,9 +609,21 @@
       }
       entries[i] = new ConstantMapEntry(key, value);
     }
+    if (hasUnevaluatedChild(node)) {
+      final mapEntries = new List<MapEntry>(node.entries.length);
+      for (int i = 0; i < node.entries.length; ++i) {
+        mapEntries[i] = new MapEntry(unique(entries[i].key.asExpression()),
+            unique(entries[i].value.asExpression()));
+      }
+      return unevaluated(
+          node,
+          new MapLiteral(mapEntries,
+              keyType: node.keyType, valueType: node.valueType, isConst: true));
+    }
     final DartType keyType = evaluateDartType(node, node.keyType);
     final DartType valueType = evaluateDartType(node, node.valueType);
-    return canonicalize(new MapConstant(keyType, valueType, entries));
+    return canonicalize(
+        backend.lowerMapConstant(new MapConstant(keyType, valueType, entries)));
   }
 
   visitFunctionExpression(FunctionExpression node) {
@@ -551,22 +642,28 @@
         constructor.function.body is! EmptyStatement) {
       throw 'Constructor "$node" has non-trivial body "${constructor.function.body.runtimeType}".';
     }
-    if (constructor.isInExternalLibrary &&
-        constructor.initializers.isEmpty &&
-        constructor.enclosingClass.supertype != null) {
-      // The constructor is unavailable due to separate compilation.
-      return new UnevaluatedConstant(new ConstructorInvocation(
-          constructor, unevaluatedArguments(node.arguments),
-          isConst: true));
-    }
     if (klass.isAbstract) {
       throw 'Constructor "$node" belongs to abstract class "${klass}".';
     }
 
-    final typeArguments = evaluateTypeArguments(node, node.arguments);
     final positionals = evaluatePositionalArguments(node.arguments);
     final named = evaluateNamedArguments(node.arguments);
 
+    // Is the constructor unavailable due to separate compilation?
+    bool isUnavailable = constructor.isInExternalLibrary &&
+        constructor.initializers.isEmpty &&
+        constructor.enclosingClass.supertype != null;
+
+    if (isUnavailable || hasUnevaluatedChild(node)) {
+      return unevaluated(
+          node,
+          new ConstructorInvocation(constructor,
+              unevaluatedArguments(positionals, named, node.arguments.types),
+              isConst: true));
+    }
+
+    final typeArguments = evaluateTypeArguments(node, node.arguments);
+
     // Fill in any missing type arguments with "dynamic".
     for (int i = typeArguments.length; i < klass.typeParameters.length; i++) {
       typeArguments.add(const DynamicType());
@@ -790,16 +887,19 @@
                 evaluateNamedArguments(init.arguments));
           } else if (init is AssertInitializer) {
             if (enableAsserts) {
-              final Constant condition = init.statement.condition.accept(this);
+              final Constant condition =
+                  _evaluateSubexpression(init.statement.condition);
 
               if (condition is BoolConstant) {
                 if (!condition.value) {
-                  final Constant message = init.statement.message?.accept(this);
-                  if (message == null) {
+                  if (init.statement.message == null) {
                     throw new _AbortCurrentEvaluation(
                         errorReporter.failedAssertion(
                             contextChain, init.statement.condition, null));
-                  } else if (message is StringConstant) {
+                  }
+                  final Constant message =
+                      _evaluateSubexpression(init.statement.message);
+                  if (message is StringConstant) {
                     throw new _AbortCurrentEvaluation(
                         errorReporter.failedAssertion(contextChain,
                             init.statement.condition, message.value));
@@ -840,6 +940,13 @@
     final List<Constant> arguments =
         evaluatePositionalArguments(node.arguments);
 
+    if (hasUnevaluatedChild(node)) {
+      return unevaluated(
+          node,
+          new MethodInvocation(unique(receiver.asExpression()), node.name,
+              unevaluatedArguments(arguments, {}, node.arguments.types)));
+    }
+
     // TODO(http://dartbug.com/31799): Ensure we only invoke ==/!= on
     // null/bool/int/double/String objects.
 
@@ -873,35 +980,6 @@
                     other.getType(typeEnvironment)));
         }
       }
-    } else if (receiver is BoolConstant) {
-      if (arguments.length == 1) {
-        switch (node.name.name) {
-          case '!':
-            return !receiver.value ? trueConstant : falseConstant;
-        }
-      } else if (arguments.length == 2) {
-        final right = arguments[0];
-        if (right is BoolConstant) {
-          switch (node.name.name) {
-            case '&&':
-              return (receiver.value && right.value)
-                  ? trueConstant
-                  : falseConstant;
-            case '||':
-              return (receiver.value || right.value)
-                  ? trueConstant
-                  : falseConstant;
-          }
-        }
-        throw new _AbortCurrentEvaluation(
-            errorReporter.invalidBinaryOperandType(
-                contextChain,
-                node,
-                receiver,
-                '${node.name.name}',
-                typeEnvironment.boolType,
-                right.getType(typeEnvironment)));
-      }
     } else if (receiver is IntConstant) {
       if (arguments.length == 0) {
         switch (node.name.name) {
@@ -966,7 +1044,7 @@
       if (arguments.length == 0) {
         switch (node.name.name) {
           case 'unary-':
-            return canonicalize(new DoubleConstant(-receiver.value));
+            return canonicalize(makeDoubleConstant(-receiver.value));
         }
       } else if (arguments.length == 1) {
         final Constant other = arguments[0];
@@ -994,13 +1072,19 @@
 
   visitLogicalExpression(LogicalExpression node) {
     final Constant left = _evaluateSubexpression(node.left);
+    if (left is UnevaluatedConstant) {
+      return unevaluated(
+          node,
+          new LogicalExpression(
+              unique(left.expression), node.operator, node.right));
+    }
     switch (node.operator) {
       case '||':
         if (left is BoolConstant) {
           if (left.value) return trueConstant;
 
           final Constant right = _evaluateSubexpression(node.right);
-          if (right is BoolConstant) {
+          if (right is BoolConstant || right is UnevaluatedConstant) {
             return right;
           }
 
@@ -1020,9 +1104,10 @@
           if (!left.value) return falseConstant;
 
           final Constant right = _evaluateSubexpression(node.right);
-          if (right is BoolConstant) {
+          if (right is BoolConstant || right is UnevaluatedConstant) {
             return right;
           }
+
           throw new _AbortCurrentEvaluation(
               errorReporter.invalidBinaryOperandType(
                   contextChain,
@@ -1045,14 +1130,19 @@
   }
 
   visitConditionalExpression(ConditionalExpression node) {
-    final Constant constant = _evaluateSubexpression(node.condition);
-    if (constant == trueConstant) {
+    final Constant condition = _evaluateSubexpression(node.condition);
+    if (condition == trueConstant) {
       return _evaluateSubexpression(node.then);
-    } else if (constant == falseConstant) {
+    } else if (condition == falseConstant) {
       return _evaluateSubexpression(node.otherwise);
+    } else if (condition is UnevaluatedConstant) {
+      return unevaluated(
+          node,
+          new ConditionalExpression(unique(condition.expression), node.then,
+              node.otherwise, node.staticType));
     } else {
       throw new _AbortCurrentEvaluation(errorReporter.invalidDartType(
-          contextChain, node, constant, typeEnvironment.boolType));
+          contextChain, node, condition, typeEnvironment.boolType));
     }
   }
 
@@ -1076,6 +1166,11 @@
           return receiver.fieldValues[fieldRef];
         }
       }
+    } else if (receiver is UnevaluatedConstant) {
+      return unevaluated(
+          node,
+          new PropertyGet(
+              unique(receiver.expression), node.name, node.interfaceTarget));
     }
     throw 'Could not evaluate property get on $receiver.';
   }
@@ -1083,7 +1178,7 @@
   visitLet(Let node) {
     env.addVariableValue(
         node.variable, _evaluateSubexpression(node.variable.initializer));
-    return node.body.accept(this);
+    return _evaluateSubexpression(node.body);
   }
 
   visitVariableGet(VariableGet node) {
@@ -1116,7 +1211,7 @@
         if (target.isConst) {
           if (target.isInExternalLibrary && target.initializer == null) {
             // The variable is unavailable due to separate compilation.
-            return new UnevaluatedConstant(node);
+            return unevaluated(node, node);
           }
           return runInsideContext(target, () {
             return _evaluateSubexpression(target.initializer);
@@ -1138,48 +1233,63 @@
   }
 
   visitStringConcatenation(StringConcatenation node) {
-    final String value = node.expressions.map((Expression node) {
-      final Constant constant = node.accept(this);
-
-      if (constant is NullConstant) {
-        return 'null';
-      } else if (constant is BoolConstant) {
-        return constant.value ? 'true' : 'false';
-      } else if (constant is IntConstant) {
-        return constant.value.toString();
-      } else if (constant is DoubleConstant) {
-        return constant.value.toString();
-      } else if (constant is StringConstant) {
-        return constant.value;
+    final List<Object> concatenated = <Object>[new StringBuffer()];
+    for (int i = 0; i < node.expressions.length; i++) {
+      Constant constant = _evaluateSubexpression(node.expressions[i]);
+      if (constant is PrimitiveConstant) {
+        String value = constant.value.toString();
+        Object last = concatenated.last;
+        if (last is StringBuffer) {
+          last.write(value);
+        } else {
+          concatenated.add(new StringBuffer(value));
+        }
+      } else if (constant is UnevaluatedConstant) {
+        concatenated.add(constant);
       } else {
         throw new _AbortCurrentEvaluation(errorReporter
             .invalidStringInterpolationOperand(contextChain, node, constant));
       }
-    }).join('');
-    return canonicalize(new StringConstant(value));
+    }
+    if (concatenated.length > 1) {
+      final expressions = new List<Expression>(concatenated.length);
+      for (int i = 0; i < concatenated.length; i++) {
+        Object value = concatenated[i];
+        if (value is UnevaluatedConstant) {
+          expressions[i] = unique(value.expression);
+        } else {
+          expressions[i] = new ConstantExpression(
+              canonicalize(new StringConstant(value.toString())));
+        }
+      }
+      return unevaluated(node, new StringConcatenation(expressions));
+    }
+    return canonicalize(new StringConstant(concatenated.single.toString()));
   }
 
   visitStaticInvocation(StaticInvocation node) {
     final Procedure target = node.target;
     final Arguments arguments = node.arguments;
+    final positionals = evaluatePositionalArguments(arguments);
+    final named = evaluateNamedArguments(arguments);
+    if (hasUnevaluatedChild(node)) {
+      return unevaluated(
+          node,
+          new StaticInvocation(
+              target, unevaluatedArguments(positionals, named, arguments.types),
+              isConst: true));
+    }
     if (target.kind == ProcedureKind.Factory) {
       if (target.isConst &&
           target.name.name == "fromEnvironment" &&
           target.enclosingLibrary == coreTypes.coreLibrary &&
-          arguments.positional.length == 1) {
+          positionals.length == 1) {
         if (environmentDefines != null) {
           // Evaluate environment constant.
-          Constant name = arguments.positional[0].accept(this);
+          Constant name = positionals.single;
           if (name is StringConstant) {
             String value = environmentDefines[name.value];
-            Constant defaultValue = null;
-            for (int i = 0; i < arguments.named.length; i++) {
-              NamedExpression named = arguments.named[i];
-              if (named.name == "defaultValue") {
-                defaultValue = named.value.accept(this);
-                break;
-              }
-            }
+            Constant defaultValue = named["defaultValue"];
 
             if (target.enclosingClass == coreTypes.boolClass) {
               Constant boolConstant = value == "true"
@@ -1208,18 +1318,19 @@
           // TODO(askesc): Give more meaningful error message if name is null.
         } else {
           // Leave environment constant unevaluated.
-          return new UnevaluatedConstant(new StaticInvocation(
-              target, unevaluatedArguments(arguments),
-              isConst: true));
+          return unevaluated(
+              node,
+              new StaticInvocation(target,
+                  unevaluatedArguments(positionals, named, arguments.types),
+                  isConst: true));
         }
       }
     } else if (target.name.name == 'identical') {
       // Ensure the "identical()" function comes from dart:core.
       final parent = target.parent;
       if (parent is Library && parent == coreTypes.coreLibrary) {
-        final positionalArguments = evaluatePositionalArguments(arguments);
-        final Constant left = positionalArguments[0];
-        final Constant right = positionalArguments[1];
+        final Constant left = positionals[0];
+        final Constant right = positionals[1];
         // Since we canonicalize constants during the evaluation, we can use
         // identical here.
         return identical(left, right) ? trueConstant : falseConstant;
@@ -1230,16 +1341,23 @@
   }
 
   visitAsExpression(AsExpression node) {
-    final Constant constant = node.operand.accept(this);
+    final Constant constant = _evaluateSubexpression(node.operand);
+    if (constant is UnevaluatedConstant) {
+      return unevaluated(
+          node, new AsExpression(unique(constant.expression), node.type));
+    }
     ensureIsSubtype(constant, evaluateDartType(node, node.type), node);
     return constant;
   }
 
   visitNot(Not node) {
-    final Constant constant = node.operand.accept(this);
+    final Constant constant = _evaluateSubexpression(node.operand);
     if (constant is BoolConstant) {
       return constant == trueConstant ? falseConstant : trueConstant;
     }
+    if (constant is UnevaluatedConstant) {
+      return unevaluated(node, new Not(unique(constant.expression)));
+    }
     throw new _AbortCurrentEvaluation(errorReporter.invalidDartType(
         contextChain, node, constant, typeEnvironment.boolType));
   }
@@ -1263,6 +1381,10 @@
           'The number of type arguments supplied in the partial instantiation '
           'does not match the number of type arguments of the $constant.');
     }
+    if (constant is UnevaluatedConstant) {
+      return unevaluated(node,
+          new Instantiation(unique(constant.expression), node.typeArguments));
+    }
     throw new Exception(
         'Only tear-off constants can be partially instantiated.');
   }
@@ -1275,6 +1397,18 @@
 
   // Helper methods:
 
+  Constant makeDoubleConstant(double value) {
+    if (targetingJavaScript) {
+      // Convert to an integer when possible (matching the runtime behavior
+      // of `is int`).
+      if (value.isFinite) {
+        var i = value.toInt();
+        if (value == i.toDouble()) return new IntConstant(i);
+      }
+    }
+    return new DoubleConstant(value);
+  }
+
   void ensureIsSubtype(Constant constant, DartType type, TreeNode node) {
     DartType constantType = constant.getType(typeEnvironment);
 
@@ -1312,7 +1446,7 @@
 
   List<Constant> evaluatePositionalArguments(Arguments arguments) {
     return arguments.positional.map((Expression node) {
-      return node.accept(this) as Constant;
+      return _evaluateSubexpression(node);
     }).toList();
   }
 
@@ -1321,28 +1455,26 @@
 
     final Map<String, Constant> named = {};
     arguments.named.forEach((NamedExpression pair) {
-      named[pair.name] = pair.value.accept(this);
+      named[pair.name] = _evaluateSubexpression(pair.value);
     });
     return named;
   }
 
-  Arguments unevaluatedArguments(Arguments arguments) {
-    final positional = new List<Expression>(arguments.positional.length);
-    final named = new List<NamedExpression>(arguments.named.length);
-    for (int i = 0; i < arguments.positional.length; ++i) {
-      Constant constant = arguments.positional[i].accept(this);
-      positional[i] = constant.asExpression();
+  Arguments unevaluatedArguments(List<Constant> positionalArgs,
+      Map<String, Constant> namedArgs, List<DartType> types) {
+    final positional = new List<Expression>(positionalArgs.length);
+    final named = new List<NamedExpression>(namedArgs.length);
+    for (int i = 0; i < positionalArgs.length; ++i) {
+      positional[i] = unique(positionalArgs[i].asExpression());
     }
-    for (int i = 0; i < arguments.named.length; ++i) {
-      NamedExpression arg = arguments.named[i];
-      Constant constant = arg.value.accept(this);
-      named[i] = new NamedExpression(arg.name, constant.asExpression());
-    }
-    return new Arguments(positional, named: named, types: arguments.types);
+    int i = 0;
+    namedArgs.forEach((String name, Constant value) {
+      named[i++] = new NamedExpression(name, unique(value.asExpression()));
+    });
+    return new Arguments(positional, named: named, types: types);
   }
 
   Constant canonicalize(Constant constant) {
-    constant = backend.lowerConstant(constant);
     return canonicalizationCache.putIfAbsent(constant, () => constant);
   }
 
@@ -1368,8 +1500,10 @@
 
   Constant evaluateBinaryNumericOperation(
       String op, num a, num b, TreeNode node) {
-    a = backend.prepareNumericOperand(a);
-    b = backend.prepareNumericOperand(b);
+    if (targetingJavaScript) {
+      a = a.toDouble();
+      b = b.toDouble();
+    }
     num result;
     switch (op) {
       case '+':
@@ -1392,10 +1526,11 @@
         break;
     }
 
-    if (result != null) {
-      return canonicalize(result is int
-          ? new IntConstant(result.toSigned(64))
-          : new DoubleConstant(result as double));
+    if (result is int) {
+      return canonicalize(new IntConstant(result.toSigned(64)));
+    }
+    if (result is double) {
+      return canonicalize(makeDoubleConstant(result));
     }
 
     switch (op) {
@@ -1491,16 +1626,30 @@
   }
 }
 
+/// The different kinds of number semantics supported by the constant evaluator.
+enum NumberSemantics {
+  /// Dart VM number semantics.
+  vm,
+
+  /// JavaScript (Dart2js and DDC) number semantics.
+  js,
+}
+
 // Backend specific constant evaluation behavior
 class ConstantsBackend {
-  /// Transformation of constants prior to canonicalization, e.g. to change the
-  /// representation of certain kinds of constants, or to implement specific
-  /// number semantics.
-  Constant lowerConstant(Constant constant) => constant;
+  const ConstantsBackend();
 
-  /// Transformation of numeric operands prior to a binary operation,
-  /// e.g. to implement specific number semantics.
-  num prepareNumericOperand(num operand) => operand;
+  /// Lowering of a list constant to a backend-specific representation.
+  Constant lowerListConstant(ListConstant constant) => constant;
+
+  /// Lowering of a set constant to a backend-specific representation.
+  Constant lowerSetConstant(SetConstant constant) => constant;
+
+  /// Lowering of a map constant to a backend-specific representation.
+  Constant lowerMapConstant(MapConstant constant) => constant;
+
+  /// Number semantics to use for this backend.
+  NumberSemantics get numberSemantics => NumberSemantics.vm;
 }
 
 // Used as control-flow to abort the current evaluation.
diff --git a/pkg/kernel/lib/transformations/treeshaker.dart b/pkg/kernel/lib/transformations/treeshaker.dart
deleted file mode 100644
index b340326..0000000
--- a/pkg/kernel/lib/transformations/treeshaker.dart
+++ /dev/null
@@ -1,1247 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library kernel.tree_shaker;
-
-import '../ast.dart';
-import '../class_hierarchy.dart';
-import '../core_types.dart';
-import '../type_environment.dart';
-import '../library_index.dart';
-
-Component transformComponent(
-    CoreTypes coreTypes, ClassHierarchy hierarchy, Component component,
-    {List<ProgramRoot> programRoots, bool legacyMode: false}) {
-  new TreeShaker(coreTypes, hierarchy, component,
-          programRoots: programRoots, legacyMode: legacyMode)
-      .transform(component);
-  return component;
-}
-
-enum ProgramRootKind {
-  /// The root is a class which will be instantiated by
-  /// external / non-Dart code.
-  ExternallyInstantiatedClass,
-
-  /// The root is a setter function or a field.
-  Setter,
-
-  /// The root is a getter function or a field.
-  Getter,
-
-  /// The root is some kind of constructor.
-  Constructor,
-
-  /// The root is a field, normal procedure or constructor.
-  Other,
-}
-
-/// A program root which the vm or embedder uses and needs to be retained.
-class ProgramRoot {
-  /// The library the root is contained in.
-  final String library;
-
-  /// The name of the class inside the library (optional).
-  final String klass;
-
-  /// The name of the member inside the library (or class, optional).
-  final String member;
-
-  /// The kind of this program root.
-  final ProgramRootKind kind;
-
-  ProgramRoot(this.library, this.klass, this.member, this.kind);
-
-  String toString() => "ProgramRoot($library, $klass, $member, $kind)";
-
-  String get disambiguatedName {
-    if (kind == ProgramRootKind.Getter) return 'get:$member';
-    if (kind == ProgramRootKind.Setter) return 'set:$member';
-    return member;
-  }
-
-  Member getMember(LibraryIndex table) {
-    assert(klass != null);
-    assert(member != null);
-    return table.getMember(
-        library, klass ?? LibraryIndex.topLevel, disambiguatedName);
-  }
-
-  Class getClass(LibraryIndex table) {
-    assert(klass != null);
-    return table.getClass(library, klass);
-  }
-}
-
-/// Tree shaking based on class hierarchy analysis.
-///
-/// Any dynamic dispatch not on `this` is conservatively assumed to target
-/// any instantiated class that implements a member matching the selector.
-///
-/// Member bodies are analyzed relative to a given "host class" which is the
-/// concrete type of `this` (or null if in static context), so dispatches on
-/// `this` can be resolved more precisely.
-///
-/// The tree shaker computes the following in a fixed-point iteration:
-/// - a set of instantiated classes
-/// - for each member, a set of potential host classes
-/// - a set of names used in dynamic dispatch not on `this`
-///
-/// If the `dart:mirrors` library is used then nothing will be tree-shaken.
-//
-// TODO(asgerf): Tree shake unused instance fields.
-class TreeShaker {
-  final CoreTypes coreTypes;
-  final ClosedWorldClassHierarchy hierarchy;
-  final ClassHierarchySubtypes hierarchySubtypes;
-  final Map<Class, int> numberedClasses;
-  final List<Class> classes;
-  final Component component;
-  final bool legacyMode;
-  final List<ProgramRoot> programRoots;
-
-  /// Map from classes to set of names that have been dispatched with that class
-  /// as the static receiver type (meaning any subtype of that class can be
-  /// the potential concrete receiver).
-  ///
-  /// The map is implemented as a list, indexed by
-  /// [ClassHierarchy.getClassIndex].
-  final List<Set<Name>> _dispatchedNames;
-
-  /// Map from names to the set of classes that might be the concrete receiver
-  /// of a call with the given name.
-  final Map<Name, ClassSet> _receiversOfName = <Name, ClassSet>{};
-
-  /// Instance members that are potential targets for dynamic dispatch, but
-  /// whose name has not yet been seen in a dynamic dispatch invocation.
-  ///
-  /// The map is indexed by the name of the member, and value is a list of
-  /// interleaved (host class, member) pairs.
-  final Map<Name, List<TreeNode>> _dispatchTargetCandidates =
-      <Name, List<TreeNode>>{};
-
-  /// Map from classes to the set of members that are reachable with that
-  /// class as host.
-  ///
-  /// The map is implemented as a list, indexed according to
-  /// [ClassHierarchy.getClassIndex].
-  final List<Set<Member>> _usedMembersWithHost;
-
-  /// Map from used members (regardless of host) to a summary object describing
-  /// how the member invokes other members on `this`.
-  ///
-  /// The summary object is a heterogeneous list containing the [Member]s that
-  /// are invoked using `super` and the [Name]s that are dispatched on `this`.
-  ///
-  /// Names that are dispatched as a setter are preceded by the
-  /// [_setterSentinel] object, to distinguish them from getter/call names.
-  final Map<Member, List<Node>> _usedMembers = <Member, List<Node>>{};
-
-  /// The level to which a class must be retained after tree shaking.
-  ///
-  /// See [ClassRetention].
-  final List<ClassRetention> _classRetention;
-
-  /// Interleaved (host class, member) pairs that are reachable but have not yet
-  /// been analyzed for more uses.
-  final List<TreeNode> _worklist = new List<TreeNode>();
-
-  /// Classes whose interface can be used by external code to invoke user code.
-  final Set<Class> _escapedClasses = new Set<Class>();
-
-  /// Members that have been overridden by a member whose concrete body is
-  /// needed.  These must be preserved in order to maintain interface targets
-  /// for typed calls.
-  final Set<Member> _overriddenMembers = new Set<Member>();
-
-  final Set<Member> _usedInterfaceMembers = new Set<Member>();
-
-  final Set<Typedef> _usedTypedefs = new Set<Typedef>();
-
-  final List<Expression> _typedCalls = <Expression>[];
-
-  /// AST visitor for finding static uses and dynamic dispatches in code.
-  _TreeShakerVisitor _visitor;
-
-  /// AST visitor for analyzing type annotations on external members.
-  _ExternalTypeVisitor _covariantVisitor;
-  _ExternalTypeVisitor _contravariantVisitor;
-  _ExternalTypeVisitor _invariantVisitor;
-
-  Library _mirrorsLibrary;
-
-  /// Set to true if any use of the `dart:mirrors` API is found.
-  bool isUsingMirrors = false;
-
-  /// If we have roots, we will shake, even if we encounter some elements from
-  /// the mirrors library.
-  bool get forceShaking => programRoots != null && programRoots.isNotEmpty;
-
-  TreeShaker(CoreTypes coreTypes, ClassHierarchy hierarchy, Component component,
-      {List<ProgramRoot> programRoots, bool legacyMode: false})
-      : this._internal(
-            coreTypes, hierarchy, component, legacyMode, programRoots);
-
-  bool isMemberBodyUsed(Member member) {
-    return _usedMembers.containsKey(member);
-  }
-
-  bool isMemberOverridden(Member member) {
-    return _overriddenMembers.contains(member);
-  }
-
-  bool isMemberUsedInInterfaceTarget(Member member) {
-    return _usedInterfaceMembers.contains(member);
-  }
-
-  bool isTypedefUsed(Typedef node) {
-    return _usedTypedefs.contains(node);
-  }
-
-  bool isMemberUsed(Member member) {
-    return isMemberBodyUsed(member) || isMemberOverridden(member);
-  }
-
-  bool isInstantiated(Class classNode) {
-    return getClassRetention(classNode).index >= ClassRetention.Instance.index;
-  }
-
-  bool isHierarchyUsed(Class classNode) {
-    return getClassRetention(classNode).index >= ClassRetention.Hierarchy.index;
-  }
-
-  bool isNamespaceUsed(Class classNode) {
-    return getClassRetention(classNode).index >= ClassRetention.Namespace.index;
-  }
-
-  ClassRetention getClassRetention(Class classNode) {
-    int index = numberedClasses[classNode];
-    return _classRetention[index];
-  }
-
-  /// Applies the tree shaking results to the component.
-  ///
-  /// This removes unused classes, members, and hierarchy data.
-  void transform(Component component) {
-    if (isUsingMirrors) return; // Give up if using mirrors.
-    new _TreeShakingTransformer(this).transform(component);
-  }
-
-  TreeShaker._internal(this.coreTypes, this.hierarchy, this.component,
-      this.legacyMode, this.programRoots)
-      : this._dispatchedNames = new List<Set<Name>>(hierarchy.numberOfClasses),
-        this._usedMembersWithHost =
-            new List<Set<Member>>(hierarchy.numberOfClasses),
-        this._classRetention = new List<ClassRetention>.filled(
-            hierarchy.numberOfClasses, ClassRetention.None),
-        this.hierarchySubtypes = hierarchy.computeSubtypesInformation(),
-        this.numberedClasses = createMapNumberIndex(hierarchy.classes),
-        this.classes = new List<Class>.from(hierarchy.classes) {
-    _visitor = new _TreeShakerVisitor(this);
-    _covariantVisitor = new _ExternalTypeVisitor(this, isCovariant: true);
-    _contravariantVisitor =
-        new _ExternalTypeVisitor(this, isContravariant: true);
-    _invariantVisitor = new _ExternalTypeVisitor(this,
-        isCovariant: true, isContravariant: true);
-    _mirrorsLibrary = coreTypes.mirrorsLibrary;
-    try {
-      _build();
-    } on _UsingMirrorsException {
-      isUsingMirrors = true;
-    }
-  }
-
-  static Map<Class, int> createMapNumberIndex(Iterable<Class> classes) {
-    Map<Class, int> result = new Map<Class, int>();
-    for (Class class_ in classes) {
-      result[class_] = result.length;
-    }
-    return result;
-  }
-
-  void _build() {
-    if (component.mainMethod == null) {
-      throw 'Cannot perform tree shaking on a component without a main method';
-    }
-    if (component.mainMethod.function.positionalParameters.length > 0) {
-      // The main method takes a List<String> as argument.
-      _addInstantiatedExternalSubclass(coreTypes.listClass);
-      _addInstantiatedExternalSubclass(coreTypes.stringClass);
-    }
-    _addDispatchedName(coreTypes.objectClass, new Name('noSuchMethod'));
-    _addPervasiveUses();
-    _addUsedMember(null, component.mainMethod);
-    if (programRoots != null) {
-      var table =
-          new LibraryIndex(component, programRoots.map((r) => r.library));
-      for (var root in programRoots) {
-        _addUsedRoot(root, table);
-      }
-    }
-
-    _iterateWorklist();
-
-    // Mark overridden members in order to preserve abstract members as
-    // necessary.
-    if (!legacyMode) {
-      for (int i = classes.length - 1; i >= 0; --i) {
-        Class class_ = classes[i];
-        if (isHierarchyUsed(class_)) {
-          hierarchy.forEachOverridePair(class_,
-              (Member ownMember, Member superMember, bool isSetter) {
-            if (isMemberBodyUsed(ownMember) ||
-                _overriddenMembers.contains(ownMember)) {
-              _overriddenMembers.add(superMember);
-              // Ensure the types mentioned in the member can be preserved.
-              _visitor.visitMemberInterface(superMember);
-            }
-          });
-        }
-      }
-      // Marking members as overridden should not cause new code to become
-      // reachable.
-      assert(_worklist.isEmpty);
-    }
-  }
-
-  /// Registers some extremely commonly used core classes as instantiated, so
-  /// we don't have to register them for every use we find.
-  void _addPervasiveUses() {
-    _addInstantiatedExternalSubclass(coreTypes.stringClass);
-    _addInstantiatedExternalSubclass(coreTypes.intClass);
-    _addInstantiatedExternalSubclass(coreTypes.boolClass);
-    _addInstantiatedExternalSubclass(coreTypes.nullClass);
-    _addInstantiatedExternalSubclass(coreTypes.functionClass);
-    _addInstantiatedExternalSubclass(coreTypes.invocationClass);
-  }
-
-  /// Registers the given name as seen in a dynamic dispatch, and discovers used
-  /// instance members accordingly.
-  void _addDispatchedName(Class receiver, Name name) {
-    int index = numberedClasses[receiver];
-    Set<Name> receiverNames = _dispatchedNames[index] ??= new Set<Name>();
-    // TODO(asgerf): make use of selector arity and getter/setter kind
-    if (receiverNames.add(name)) {
-      List<TreeNode> candidates = _dispatchTargetCandidates[name];
-      if (candidates != null) {
-        for (int i = 0; i < candidates.length; i += 2) {
-          Class host = candidates[i];
-          if (hierarchy.isSubtypeOf(host, receiver)) {
-            // This (host, member) pair is a potential target of the dispatch.
-            Member member = candidates[i + 1];
-
-            // Remove the (host,member) pair from the candidate list.
-            // Move the last pair into the current index and shrink the list.
-            int lastPair = candidates.length - 2;
-            candidates[i] = candidates[lastPair];
-            candidates[i + 1] = candidates[lastPair + 1];
-            candidates.length -= 2;
-            i -= 2; // Revisit the same index now that it has been updated.
-
-            // Mark the pair as used.  This should be done after removing it
-            // from the candidate list, since this call may recursively scan
-            // for more used members.
-            _addUsedMember(host, member);
-          }
-        }
-      }
-      var subtypes = hierarchySubtypes.getSubtypesOf(receiver);
-      var receiverSet = _receiversOfName[name];
-      _receiversOfName[name] = receiverSet == null
-          ? subtypes
-          : _receiversOfName[name].union(subtypes);
-    }
-  }
-
-  /// Registers the given method as a potential target of dynamic dispatch on
-  /// the given class.
-  void _addDispatchTarget(Class host, Member member) {
-    ClassSet receivers = _receiversOfName[member.name];
-    if (receivers != null && receivers.contains(host)) {
-      _addUsedMember(host, member);
-    } else {
-      _dispatchTargetCandidates.putIfAbsent(member.name, _makeTreeNodeList)
-        ..add(host)
-        ..add(member);
-    }
-  }
-
-  static List<TreeNode> _makeTreeNodeList() => <TreeNode>[];
-
-  /// Registers the given class as instantiated and discovers new dispatch
-  /// target candidates accordingly.
-  void _addInstantiatedClass(Class classNode) {
-    int index = numberedClasses[classNode];
-    ClassRetention retention = _classRetention[index];
-    if (retention.index < ClassRetention.Instance.index) {
-      _classRetention[index] = ClassRetention.Instance;
-      _propagateClassInstanceLevel(classNode, retention);
-    }
-  }
-
-  /// Register that an external subclass of the given class may be instantiated.
-  void _addInstantiatedExternalSubclass(Class classNode) {
-    int index = numberedClasses[classNode];
-    ClassRetention retention = _classRetention[index];
-    if (retention.index < ClassRetention.ExternalInstance.index) {
-      _classRetention[index] = ClassRetention.ExternalInstance;
-      _propagateClassExternalInstanceLevel(classNode, retention);
-    }
-  }
-
-  void _propagateClassExternalInstanceLevel(
-      Class classNode, ClassRetention oldRetention) {
-    if (oldRetention.index >= ClassRetention.ExternalInstance.index) {
-      return;
-    }
-    _propagateClassInstanceLevel(classNode, oldRetention);
-    for (Member member in hierarchy.getInterfaceMembers(classNode)) {
-      if (member is Field) {
-        _covariantVisitor.visit(member.type);
-      } else {
-        _addCallToExternalProcedure(member);
-      }
-      _addDispatchTarget(classNode, member);
-    }
-    for (Member member
-        in hierarchy.getInterfaceMembers(classNode, setters: true)) {
-      _addDispatchTarget(classNode, member);
-    }
-  }
-
-  /// Called when the retention level for [classNode] has been raised from
-  /// [oldRetention] to instance level.
-  ///
-  /// Ensures that the relevant members are put in the worklist, and super types
-  /// and raised to hierarchy level.
-  void _propagateClassInstanceLevel(
-      Class classNode, ClassRetention oldRetention) {
-    if (oldRetention.index >= ClassRetention.Instance.index) {
-      return;
-    }
-    _propagateClassHierarchyLevel(classNode, oldRetention);
-    for (Member member in hierarchy.getDispatchTargets(classNode)) {
-      _addDispatchTarget(classNode, member);
-    }
-    for (Member member
-        in hierarchy.getDispatchTargets(classNode, setters: true)) {
-      _addDispatchTarget(classNode, member);
-    }
-    // TODO(asgerf): Shake off unused instance fields.
-    // For now, just register them all inherited fields as used to ensure the
-    // effects of their initializers are taken into account.  To shake a field,
-    // we still need to preserve the side effects of the initializer.
-    for (Class node = classNode; node != null; node = node.superclass) {
-      for (Field field in node.mixin.fields) {
-        if (!field.isStatic) {
-          _addUsedMember(classNode, field);
-        }
-      }
-    }
-  }
-
-  /// Called when the retention level for [classNode] has been raised from
-  /// [oldRetention] to hierarchy level or higher.
-  ///
-  /// Ensure that all super types and type parameter bounds are also raised
-  /// to hierarchy level.
-  void _propagateClassHierarchyLevel(
-      Class classNode, ClassRetention oldRetention) {
-    if (oldRetention.index >= ClassRetention.Hierarchy.index) {
-      return;
-    }
-    _propagateClassNamespaceLevel(classNode, oldRetention);
-    var visitor = _visitor;
-    classNode.supertype?.accept(visitor);
-    classNode.mixedInType?.accept(visitor);
-    visitList(classNode.implementedTypes, visitor);
-    visitList(classNode.typeParameters, visitor);
-  }
-
-  /// Called when the retention level for [classNode] has been raised from
-  /// [oldRetention] to namespace level or higher.
-  ///
-  /// Ensures that all annotations on the class are analyzed.
-  void _propagateClassNamespaceLevel(
-      Class classNode, ClassRetention oldRetention) {
-    if (oldRetention.index >= ClassRetention.Namespace.index) {
-      return;
-    }
-    visitList(classNode.annotations, _visitor);
-  }
-
-  /// Registers the given root as being used.
-  void _addUsedRoot(ProgramRoot root, LibraryIndex table) {
-    if (root.kind == ProgramRootKind.ExternallyInstantiatedClass) {
-      Class class_ = root.getClass(table);
-
-      // This is a class which will be instantiated by non-Dart code (whether it
-      // has a valid generative constructor or not).
-      _addInstantiatedClass(class_);
-
-      // We keep all the constructors of externally instantiated classes.
-      // Sometimes the runtime might do a constructor call and sometimes it
-      // might just allocate the class without invoking the constructor.
-      // So we try to be on the safe side here!
-      for (var constructor in class_.constructors) {
-        _addUsedMember(class_, constructor);
-      }
-
-      // We keep all factory constructors as well for the same reason.
-      for (var member in class_.procedures) {
-        if (member.isStatic && member.kind == ProcedureKind.Factory) {
-          _addUsedMember(class_, member);
-        }
-      }
-    } else {
-      var member = root.getMember(table);
-      _addUsedMember(member.enclosingClass, member);
-      if (member is Constructor) {
-        _addInstantiatedClass(member.enclosingClass);
-      }
-    }
-  }
-
-  /// Registers the given class as being used in a type annotation.
-  void _addClassUsedInType(Class classNode) {
-    int index = numberedClasses[classNode];
-    ClassRetention retention = _classRetention[index];
-    if (retention.index < ClassRetention.Hierarchy.index) {
-      _classRetention[index] = ClassRetention.Hierarchy;
-      _propagateClassHierarchyLevel(classNode, retention);
-    }
-  }
-
-  /// Registers the given member as being used in an interface target.
-  void _addUsedInterfaceMember(Member member) {
-    _usedInterfaceMembers.add(member);
-  }
-
-  /// Registers the given typedef as being used.
-  void addUsedTypedef(Typedef node) {
-    if (_usedTypedefs.add(node)) {
-      visitList(node.annotations, _visitor);
-      node.type.accept(_visitor);
-    }
-  }
-
-  /// Registers the given class or library as containing static members.
-  void _addStaticNamespace(TreeNode container) {
-    assert(container is Class || container is Library);
-    if (container is Class) {
-      int index = numberedClasses[container];
-      var oldRetention = _classRetention[index];
-      if (oldRetention == ClassRetention.None) {
-        _classRetention[index] = ClassRetention.Namespace;
-        _propagateClassNamespaceLevel(container, oldRetention);
-      }
-    }
-  }
-
-  /// Registers the given member as being used, in the following sense:
-  /// - Fields are used if they can be read or written or their initializer is
-  ///   evaluated.
-  /// - Constructors are used if they can be invoked, either directly or through
-  ///   the initializer list of another constructor.
-  /// - Procedures are used if they can be invoked or torn off.
-  void _addUsedMember(Class host, Member member) {
-    if (!forceShaking && member.enclosingLibrary == _mirrorsLibrary) {
-      throw new _UsingMirrorsException();
-    }
-    if (host != null) {
-      // Check if the member has been seen with this host before.
-      int index = numberedClasses[host];
-      Set<Member> members = _usedMembersWithHost[index] ??= new Set<Member>();
-      if (!members.add(member)) return;
-      _usedMembers.putIfAbsent(member, _makeIncompleteSummary);
-    } else {
-      // Check if the member has been seen before.
-      if (_usedMembers.containsKey(member)) return;
-      _usedMembers[member] = _makeIncompleteSummary();
-      if (member is! Constructor) {
-        _addStaticNamespace(member.parent);
-      }
-    }
-    _worklist..add(host)..add(member);
-    if (member is Procedure && member.isExternal) {
-      _addCallToExternalProcedure(member);
-    }
-  }
-
-  /// Models the impact of a call from user code to an external implementation
-  /// of [member] based on its type annotations.
-  ///
-  /// Types in covariant position are assumed to be instantiated externally,
-  /// and types in contravariant position are assumed to have their methods
-  /// invoked by the external code.
-  void _addCallToExternalProcedure(Procedure member) {
-    FunctionNode function = member.function;
-    _covariantVisitor.visit(function.returnType);
-    for (int i = 0; i < function.positionalParameters.length; ++i) {
-      _contravariantVisitor.visit(function.positionalParameters[i].type);
-    }
-    for (int i = 0; i < function.namedParameters.length; ++i) {
-      _contravariantVisitor.visit(function.namedParameters[i].type);
-    }
-  }
-
-  /// Called when external code may invoke the interface of the given class.
-  void _addEscapedClass(Class node) {
-    if (!_escapedClasses.add(node)) return;
-    for (Member member in hierarchy.getInterfaceMembers(node)) {
-      if (member is Procedure) {
-        _addDispatchedName(node, member.name);
-      }
-    }
-  }
-
-  /// Creates a incomplete summary object, indicating that a member has not
-  /// yet been analyzed.
-  static List<Node> _makeIncompleteSummary() => <Node>[null];
-
-  bool isIncompleteSummary(List<Node> summary) {
-    return summary.isNotEmpty && summary[0] == null;
-  }
-
-  void _iterateWorklist() {
-    while (_worklist.isNotEmpty) {
-      // Get the host and member.
-      Member member = _worklist.removeLast();
-      Class host = _worklist.removeLast();
-
-      // Analyze the method body if we have not done so before.
-      List<Node> summary = _usedMembers[member];
-      if (isIncompleteSummary(summary)) {
-        summary.clear();
-        _visitor.analyzeAndBuildSummary(member, summary);
-      }
-
-      // Apply the summary in the context of this host.
-      for (int i = 0; i < summary.length; ++i) {
-        Node summaryNode = summary[i];
-        if (summaryNode is Member) {
-          _addUsedMember(host, summaryNode);
-        } else if (summaryNode is Name) {
-          Member target = hierarchy.getDispatchTarget(host, summaryNode);
-          if (target != null) {
-            _addUsedMember(host, target);
-          }
-        } else if (identical(summaryNode, _setterSentinel)) {
-          Name name = summary[++i];
-          Member target = hierarchy.getDispatchTarget(host, name, setter: true);
-          if (target != null) {
-            _addUsedMember(host, target);
-          }
-        } else {
-          throw 'Unexpected summary node: $summaryNode';
-        }
-      }
-    }
-  }
-
-  String getDiagnosticString() {
-    return """
-dispatchNames: ${_dispatchedNames.length}
-dispatchTargetCandidates.keys: ${_dispatchTargetCandidates.length}
-usedMembersWithHost: ${_usedMembersWithHost.length}
-usedMembers: ${_usedMembers.length}
-classRetention: ${_classRetention.length}
-escapedClasses: ${_escapedClasses.length}
-""";
-  }
-}
-
-/// Sentinel that occurs in method summaries in front of each name that should
-/// be interpreted as a setter.
-final Node _setterSentinel = const InvalidType();
-
-/// Searches the AST for static references and dynamically dispatched names.
-class _TreeShakerVisitor extends RecursiveVisitor {
-  final Set<Constant> visitedConstants = new Set<Constant>();
-
-  final TreeShaker shaker;
-  final CoreTypes coreTypes;
-  final TypeEnvironment types;
-  final bool legacyMode;
-  List<Node> summary;
-
-  _TreeShakerVisitor(TreeShaker shaker)
-      : this.shaker = shaker,
-        this.coreTypes = shaker.coreTypes,
-        this.legacyMode = shaker.legacyMode,
-        this.types = new TypeEnvironment(shaker.coreTypes, shaker.hierarchy,
-            legacyMode: true) {
-    types.errorHandler = handleError;
-  }
-
-  void handleError(TreeNode node, String message) {
-    print('[error] $message (${node.location})');
-  }
-
-  void analyzeAndBuildSummary(Member member, List<Node> summary) {
-    this.summary = summary;
-    types.thisType = member.enclosingClass?.thisType;
-    member.accept(this);
-  }
-
-  void visitMemberInterface(Member node) {
-    if (node is Field) {
-      node.type.accept(this);
-    } else if (node is Procedure) {
-      visitFunctionInterface(node.function);
-    }
-  }
-
-  visitFunctionInterface(FunctionNode node) {
-    for (var parameter in node.typeParameters) {
-      parameter.bound.accept(this);
-    }
-    for (var parameter in node.positionalParameters) {
-      parameter.type.accept(this);
-    }
-    for (var parameter in node.namedParameters) {
-      parameter.type.accept(this);
-    }
-    node.returnType.accept(this);
-  }
-
-  @override
-  visitFunctionNode(FunctionNode node) {
-    switch (node.asyncMarker) {
-      case AsyncMarker.Sync:
-        break;
-      case AsyncMarker.SyncStar:
-        shaker._addInstantiatedExternalSubclass(coreTypes.iterableClass);
-        break;
-      case AsyncMarker.Async:
-        shaker._addInstantiatedExternalSubclass(coreTypes.futureClass);
-        break;
-      case AsyncMarker.AsyncStar:
-        shaker._addInstantiatedExternalSubclass(coreTypes.streamClass);
-        break;
-      case AsyncMarker.SyncYielding:
-        break;
-    }
-    node.visitChildren(this);
-  }
-
-  void addUseFrom(Member target, Class from) {
-    shaker._addUsedMember(from, target);
-  }
-
-  void addUseFromCurrentHost(Member target) {
-    summary.add(target);
-  }
-
-  void addStaticUse(Member target) {
-    shaker._addUsedMember(null, target);
-  }
-
-  void addSelfDispatch(Name name, {bool setter: false}) {
-    if (setter) {
-      summary..add(_setterSentinel)..add(name);
-    } else {
-      summary.add(name);
-    }
-  }
-
-  @override
-  visitSuperInitializer(SuperInitializer node) {
-    addUseFromCurrentHost(node.target);
-    node.visitChildren(this);
-  }
-
-  @override
-  visitRedirectingInitializer(RedirectingInitializer node) {
-    addUseFromCurrentHost(node.target);
-    node.visitChildren(this);
-  }
-
-  @override
-  visitConstructorInvocation(ConstructorInvocation node) {
-    shaker._addInstantiatedClass(node.target.enclosingClass);
-    addUseFrom(node.target, node.target.enclosingClass);
-    node.visitChildren(this);
-  }
-
-  @override
-  visitStaticInvocation(StaticInvocation node) {
-    addStaticUse(node.target);
-    node.visitChildren(this);
-  }
-
-  @override
-  visitDirectMethodInvocation(DirectMethodInvocation node) {
-    if (node.receiver is! ThisExpression) {
-      // TODO(asgerf): Support arbitrary direct calls.
-      throw 'Direct calls are only supported on "this"';
-    }
-    addUseFromCurrentHost(node.target);
-    node.visitChildren(this);
-  }
-
-  Class getKnownSupertype(DartType type) {
-    if (type is InterfaceType) {
-      return type.classNode;
-    } else if (type is TypeParameterType) {
-      return getKnownSupertype(type.parameter.bound);
-    } else if (type is FunctionType) {
-      return coreTypes.functionClass;
-    } else if (type is BottomType) {
-      return coreTypes.nullClass;
-    } else {
-      return coreTypes.objectClass;
-    }
-  }
-
-  Class getStaticType(Expression node) {
-    if (legacyMode) return coreTypes.objectClass;
-    return getKnownSupertype(node.getStaticType(types));
-  }
-
-  @override
-  visitMethodInvocation(MethodInvocation node) {
-    if (node.receiver is ThisExpression) {
-      addSelfDispatch(node.name);
-    } else {
-      shaker._addDispatchedName(getStaticType(node.receiver), node.name);
-    }
-    if (node.interfaceTarget != null) {
-      shaker._addUsedInterfaceMember(node.interfaceTarget);
-      shaker._typedCalls.add(node);
-    }
-    node.visitChildren(this);
-  }
-
-  @override
-  visitStaticGet(StaticGet node) {
-    addStaticUse(node.target);
-    node.visitChildren(this);
-  }
-
-  @override
-  visitStaticSet(StaticSet node) {
-    addStaticUse(node.target);
-    node.visitChildren(this);
-  }
-
-  @override
-  visitDirectPropertyGet(DirectPropertyGet node) {
-    if (node.receiver is! ThisExpression) {
-      // TODO(asgerf): Support arbitrary direct calls.
-      throw 'Direct calls are only supported on "this"';
-    }
-    addUseFromCurrentHost(node.target);
-    node.visitChildren(this);
-  }
-
-  @override
-  visitDirectPropertySet(DirectPropertySet node) {
-    if (node.receiver is! ThisExpression) {
-      // TODO(asgerf): Support arbitrary direct calls.
-      throw 'Direct calls are only supported on "this"';
-    }
-    addUseFromCurrentHost(node.target);
-    node.visitChildren(this);
-  }
-
-  @override
-  visitPropertyGet(PropertyGet node) {
-    if (node.receiver is ThisExpression) {
-      addSelfDispatch(node.name);
-    } else {
-      shaker._addDispatchedName(getStaticType(node.receiver), node.name);
-    }
-    if (node.interfaceTarget != null) {
-      shaker._addUsedInterfaceMember(node.interfaceTarget);
-      shaker._typedCalls.add(node);
-    }
-    node.visitChildren(this);
-  }
-
-  @override
-  visitPropertySet(PropertySet node) {
-    if (node.receiver is ThisExpression) {
-      addSelfDispatch(node.name, setter: true);
-    } else {
-      shaker._addDispatchedName(getStaticType(node.receiver), node.name);
-    }
-    if (node.interfaceTarget != null) {
-      shaker._addUsedInterfaceMember(node.interfaceTarget);
-      shaker._typedCalls.add(node);
-    }
-    node.visitChildren(this);
-  }
-
-  @override
-  visitListLiteral(ListLiteral node) {
-    shaker._addInstantiatedExternalSubclass(coreTypes.listClass);
-    node.visitChildren(this);
-  }
-
-  @override
-  visitMapLiteral(MapLiteral node) {
-    shaker._addInstantiatedExternalSubclass(coreTypes.mapClass);
-    node.visitChildren(this);
-  }
-
-  static final Name _toStringName = new Name('toString');
-
-  @override
-  visitStringConcatenation(StringConcatenation node) {
-    for (var expression in node.expressions) {
-      shaker._addDispatchedName(getStaticType(expression), _toStringName);
-    }
-    node.visitChildren(this);
-  }
-
-  @override
-  visitInterfaceType(InterfaceType node) {
-    shaker._addClassUsedInType(node.classNode);
-    node.visitChildren(this);
-  }
-
-  @override
-  visitSupertype(Supertype node) {
-    shaker._addClassUsedInType(node.classNode);
-    node.visitChildren(this);
-  }
-
-  @override
-  visitDoubleLiteral(DoubleLiteral node) {
-    shaker._addInstantiatedExternalSubclass(coreTypes.doubleClass);
-  }
-
-  @override
-  visitSymbolLiteral(SymbolLiteral node) {
-    shaker._addInstantiatedExternalSubclass(coreTypes.symbolClass);
-  }
-
-  @override
-  visitTypeLiteral(TypeLiteral node) {
-    shaker._addInstantiatedExternalSubclass(coreTypes.typeClass);
-    node.visitChildren(this);
-  }
-
-  @override
-  visitConstantExpression(ConstantExpression node) {
-    if (visitedConstants.add(node.constant)) {
-      node.constant.accept(this);
-    }
-  }
-
-  @override
-  defaultConstant(Constant node) {
-    // This will visit all members of the [Constant], including any
-    // [DartType]s and [Reference]s to other constants.
-    node.visitChildren(this);
-  }
-
-  @override
-  visitNullConstant(NullConstant node) {
-    shaker._addInstantiatedExternalSubclass(shaker.coreTypes.nullClass);
-  }
-
-  @override
-  visitBoolConstant(BoolConstant node) {
-    shaker._addInstantiatedExternalSubclass(shaker.coreTypes.boolClass);
-  }
-
-  @override
-  visitIntConstant(IntConstant node) {
-    shaker._addInstantiatedExternalSubclass(shaker.coreTypes.intClass);
-  }
-
-  @override
-  visitDoubleConstant(DoubleConstant node) {
-    shaker._addInstantiatedExternalSubclass(shaker.coreTypes.doubleClass);
-  }
-
-  @override
-  visitStringConstant(StringConstant node) {
-    shaker._addInstantiatedExternalSubclass(shaker.coreTypes.stringClass);
-  }
-
-  @override
-  visitMapConstant(MapConstant node) {
-    shaker._addInstantiatedExternalSubclass(shaker.coreTypes.mapClass);
-    super.visitMapConstant(node);
-  }
-
-  @override
-  visitListConstant(ListConstant node) {
-    shaker._addInstantiatedExternalSubclass(shaker.coreTypes.listClass);
-    super.visitListConstant(node);
-  }
-
-  @override
-  visitInstanceConstant(InstanceConstant node) {
-    shaker._addInstantiatedClass(node.classNode);
-    super.visitInstanceConstant(node);
-  }
-
-  @override
-  visitTearOffConstant(TearOffConstant node) {
-    addStaticUse(node.procedure);
-    super.visitTearOffConstant(node);
-  }
-
-  @override
-  defaultConstantReference(Constant node) {
-    // Recurse into referenced constants.
-    if (visitedConstants.add(node)) {
-      node.accept(this);
-    }
-  }
-
-  @override
-  visitSuperPropertyGet(SuperPropertyGet node) {
-    throw 'The treeshaker assumes mixins have been desugared.';
-  }
-
-  @override
-  visitSuperPropertySet(SuperPropertySet node) {
-    throw 'The treeshaker assumes mixins have been desugared.';
-  }
-
-  @override
-  visitSuperMethodInvocation(SuperMethodInvocation node) {
-    throw 'The treeshaker assumes mixins have been desugared.';
-  }
-}
-
-/// The degree to which a class is needed in a program.
-///
-/// Each level implies those before it.
-enum ClassRetention {
-  /// The class can be removed.
-  None,
-
-  /// The class contains used static members but is otherwise unused.
-  Namespace,
-
-  /// The class is used in a type or has an instantiated subtype, or for some
-  /// other reason must have its hierarchy information preserved.
-  Hierarchy,
-
-  /// The class is instantiated.
-  Instance,
-
-  /// The class has an instantiated external subclass.
-  ExternalInstance,
-}
-
-/// Removes classes and members that are not needed.
-///
-/// There must not be any dangling references in the program afterwards.
-class _TreeShakingTransformer extends Transformer {
-  final TreeShaker shaker;
-
-  _TreeShakingTransformer(this.shaker);
-
-  Member _translateInterfaceTarget(Member target) {
-    final isUsed = target != null &&
-        (shaker.isMemberUsed(target) ||
-            shaker.isMemberUsedInInterfaceTarget(target));
-    return isUsed ? target : null;
-  }
-
-  void transform(Component component) {
-    for (Expression node in shaker._typedCalls) {
-      // We should not leave dangling references, so if the target of a typed
-      // call has been removed, we must remove the reference.  The receiver of
-      // such a call can only be null.
-      // TODO(asgerf): Rewrite to a NSM call instead of adding dynamic calls.
-      if (node is MethodInvocation) {
-        node.interfaceTarget = _translateInterfaceTarget(node.interfaceTarget);
-      } else if (node is PropertyGet) {
-        node.interfaceTarget = _translateInterfaceTarget(node.interfaceTarget);
-      } else if (node is PropertySet) {
-        node.interfaceTarget = _translateInterfaceTarget(node.interfaceTarget);
-      }
-    }
-    for (var library in component.libraries) {
-      if (!shaker.forceShaking && library.importUri.scheme == 'dart') {
-        // The backend expects certain things to be present in the core
-        // libraries, so we currently don't shake off anything there.
-        continue;
-      }
-      library.transformChildren(this);
-      // Note: we can't shake off empty libraries yet since we don't check if
-      // there are private names that use the library.
-
-      // The transformer API does not iterate over `Library.additionalExports`,
-      // so we manually delete the references to shaken nodes.
-      library.additionalExports.removeWhere((Reference reference) {
-        final node = reference.node;
-        if (node is Class) {
-          return !shaker.isNamespaceUsed(node);
-        } else if (node is Typedef) {
-          return !shaker.isTypedefUsed(node);
-        } else {
-          return !shaker.isMemberUsed(node as Member);
-        }
-      });
-    }
-  }
-
-  Typedef visitTypedef(Typedef node) {
-    if (shaker.isTypedefUsed(node)) return node;
-    return null;
-  }
-
-  Class visitClass(Class node) {
-    switch (shaker.getClassRetention(node)) {
-      case ClassRetention.None:
-        node.canonicalName?.unbind();
-        return null; // Remove the class.
-
-      case ClassRetention.Namespace:
-        // The class is only a namespace for static members.  Remove its
-        // hierarchy information.   This is mandatory, since these references
-        // might otherwise become dangling.
-        node.supertype = shaker.coreTypes.objectClass.asRawSupertype;
-        node.implementedTypes.clear();
-        node.typeParameters.clear();
-        node.isAbstract = true;
-        // Mixin applications cannot have static members.
-        assert(node.mixedInType == null);
-        // Unused members will be removed below.
-        break;
-
-      case ClassRetention.Hierarchy:
-        node.isAbstract = true;
-        break;
-
-      case ClassRetention.Instance:
-      case ClassRetention.ExternalInstance:
-        break;
-    }
-    node.transformChildren(this);
-    return node;
-  }
-
-  Member defaultMember(Member node) {
-    if (!shaker.isMemberBodyUsed(node)) {
-      if (!shaker.isMemberOverridden(node) &&
-          !shaker.isMemberUsedInInterfaceTarget(node)) {
-        node.canonicalName?.unbind();
-        return null;
-      }
-      if (node is Procedure) {
-        // Remove body of unused member.
-        if (node.enclosingClass.isAbstract) {
-          node.isAbstract = true;
-          node.function.body = null;
-        } else {
-          // If the enclosing class is not abstract, the method should still
-          // have a body even if it can never be called.
-          if (node.function.body != null) {
-            node.function.body = new ExpressionStatement(
-                new Throw(new StringLiteral('Method removed by tree-shaking')))
-              ..parent = node.function;
-          }
-        }
-        node.function.asyncMarker = AsyncMarker.Sync;
-      } else if (node is Field) {
-        node.initializer = null;
-      }
-    }
-    return node;
-  }
-
-  TreeNode defaultTreeNode(TreeNode node) {
-    return node; // Do not traverse into other nodes.
-  }
-}
-
-class _ExternalTypeVisitor extends DartTypeVisitor {
-  final TreeShaker shaker;
-  final bool isCovariant;
-  final bool isContravariant;
-  ClassHierarchy get hierarchy => shaker.hierarchy;
-
-  _ExternalTypeVisitor(this.shaker,
-      {this.isCovariant: false, this.isContravariant: false});
-
-  void visit(DartType type) => type?.accept(this);
-
-  /// Analyze [type] with the opposite variance.
-  void visitContravariant(DartType type) {
-    if (isCovariant && isContravariant) {
-      type?.accept(this);
-    } else if (isContravariant) {
-      type?.accept(shaker._covariantVisitor);
-    } else {
-      type?.accept(shaker._contravariantVisitor);
-    }
-  }
-
-  void visitCovariant(DartType type) => type?.accept(this);
-
-  void visitInvariant(DartType type) => shaker._invariantVisitor.visit(type);
-
-  void visitInvalidType(InvalidType node) {}
-
-  void visitDynamicType(DynamicType node) {
-    // TODO(asgerf): Find a suitable model for untyped externals, e.g. track
-    // them to the first type boundary.
-  }
-
-  void visitVoidType(VoidType node) {}
-
-  void visitInterfaceType(InterfaceType node) {
-    if (isCovariant) {
-      shaker._addInstantiatedExternalSubclass(node.classNode);
-    }
-    if (isContravariant) {
-      shaker._addEscapedClass(node.classNode);
-    }
-    for (int i = 0; i < node.typeArguments.length; ++i) {
-      DartType typeArgument = node.typeArguments[i];
-      // In practice we don't get much out of analyzing variance here, so
-      // just use a whitelist of classes that can be seen as covariant
-      // for external purposes.
-      // TODO(asgerf): Variance analysis might pay off for other external APIs.
-      if (isWhitelistedCovariant(node.classNode)) {
-        visitCovariant(typeArgument);
-      } else {
-        visitInvariant(typeArgument);
-      }
-    }
-  }
-
-  void visitTypedefType(TypedefType node) {
-    shaker.addUsedTypedef(node.typedefNode);
-  }
-
-  void visitFunctionType(FunctionType node) {
-    visit(node.returnType);
-    for (int i = 0; i < node.positionalParameters.length; ++i) {
-      visitContravariant(node.positionalParameters[i]);
-    }
-    for (int i = 0; i < node.namedParameters.length; ++i) {
-      visitContravariant(node.namedParameters[i].type);
-    }
-  }
-
-  void visitTypeParameterType(TypeParameterType node) {}
-
-  /// Just treat a couple of whitelisted classes as having covariant type
-  /// parameters.
-  bool isWhitelistedCovariant(Class classNode) {
-    if (classNode.typeParameters.isEmpty) return false;
-    CoreTypes coreTypes = shaker.coreTypes;
-    return classNode == coreTypes.iteratorClass ||
-        classNode == coreTypes.iterableClass ||
-        classNode == coreTypes.futureClass ||
-        classNode == coreTypes.streamClass ||
-        classNode == coreTypes.listClass ||
-        classNode == coreTypes.mapClass;
-  }
-}
-
-/// Exception that is thrown to stop the tree shaking analysis when a use
-/// of `dart:mirrors` is found.
-class _UsingMirrorsException {}
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index 11503d0..56eb744 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -19,10 +19,8 @@
   final bool ignoreSdk;
   TypeEnvironment environment;
 
-  TypeChecker(this.coreTypes, this.hierarchy,
-      {bool legacyMode: false, this.ignoreSdk: true})
-      : environment =
-            new TypeEnvironment(coreTypes, hierarchy, legacyMode: legacyMode);
+  TypeChecker(this.coreTypes, this.hierarchy, {this.ignoreSdk: true})
+      : environment = new TypeEnvironment(coreTypes, hierarchy);
 
   void checkComponent(Component component) {
     for (var library in component.libraries) {
@@ -489,6 +487,12 @@
   }
 
   @override
+  DartType visitBlockExpression(BlockExpression node) {
+    visitStatement(node.body);
+    return visitExpression(node.value);
+  }
+
+  @override
   DartType visitInstantiation(Instantiation node) {
     DartType type = visitExpression(node.expression);
     if (type is! FunctionType) {
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index 20cceb6..795f9d4 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -16,9 +16,6 @@
 abstract class TypeEnvironment extends SubtypeTester {
   final CoreTypes coreTypes;
 
-  @override
-  final bool legacyMode;
-
   InterfaceType thisType;
 
   DartType returnType;
@@ -29,12 +26,10 @@
   /// be tolerated.  See [typeError].
   ErrorHandler errorHandler;
 
-  TypeEnvironment.fromSubclass(this.coreTypes, {this.legacyMode: false});
+  TypeEnvironment.fromSubclass(this.coreTypes);
 
-  factory TypeEnvironment(CoreTypes coreTypes, ClassHierarchy hierarchy,
-      {bool legacyMode: false}) {
-    return new HierarchyBasedTypeEnvironment(coreTypes, hierarchy,
-        legacyMode: legacyMode);
+  factory TypeEnvironment(CoreTypes coreTypes, ClassHierarchy hierarchy) {
+    return new HierarchyBasedTypeEnvironment(coreTypes, hierarchy);
   }
 
   InterfaceType get objectType => coreTypes.objectClass.rawType;
@@ -161,7 +156,8 @@
   InterfaceType get rawFunctionType;
   Class get futureOrClass;
   InterfaceType futureType(DartType type);
-  bool get legacyMode;
+
+  static List<Object> typeChecks;
 
   InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass);
 
@@ -170,6 +166,19 @@
   bool isTop(DartType type) =>
       type is DynamicType || type is VoidType || type == objectType;
 
+  /// Can be use to collect type checks. To use:
+  /// 1. Rename `isSubtypeOf` to `_isSubtypeOf`.
+  /// 2. Rename `_collect_isSubtypeOf` to `isSubtypeOf`.
+  /// 3. Comment out the call to `_isSubtypeOf` below.
+  // ignore:unused_element
+  bool _collect_isSubtypeOf(DartType subtype, DartType supertype) {
+    bool result = true;
+    // result = _isSubtypeOf(subtype, supertype);
+    typeChecks ??= <Object>[];
+    typeChecks.add([subtype, supertype, result]);
+    return result;
+  }
+
   /// Returns true if [subtype] is a subtype of [supertype].
   bool isSubtypeOf(DartType subtype, DartType supertype) {
     subtype = subtype.unalias;
@@ -183,8 +192,7 @@
     if (isTop(supertype)) return true;
 
     // Handle FutureOr<T> union type.
-    if (!legacyMode &&
-        subtype is InterfaceType &&
+    if (subtype is InterfaceType &&
         identical(subtype.classNode, futureOrClass)) {
       var subtypeArg = subtype.typeArguments[0];
       if (supertype is InterfaceType &&
@@ -201,8 +209,7 @@
           isSubtypeOf(subtypeArg, supertype);
     }
 
-    if (!legacyMode &&
-        supertype is InterfaceType &&
+    if (supertype is InterfaceType &&
         identical(supertype.classNode, futureOrClass)) {
       // given t2 is Future<A> | A, then:
       // t1 <: (Future<A> | A) iff t1 <: Future<A> or t1 <: A
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 85a8177..39ee540 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -338,6 +338,21 @@
     visitWithLocalScope(node);
   }
 
+  visitBlockExpression(BlockExpression node) {
+    int stackHeight = enterLocalScope();
+    // Do not visit the block directly because the value expression needs to
+    // be in its scope.
+    TreeNode oldParent = enterParent(node);
+    enterParent(node.body);
+    for (int i = 0; i < node.body.statements.length; ++i) {
+      node.body.statements[i].accept(this);
+    }
+    exitParent(node);
+    node.value.accept(this);
+    exitParent(oldParent);
+    exitLocalScope(stackHeight);
+  }
+
   visitCatch(Catch node) {
     bool savedInCatchBlock = inCatchBlock;
     inCatchBlock = true;
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index a83374b..53ea440 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -57,6 +57,7 @@
   R visitBoolLiteral(BoolLiteral node) => defaultBasicLiteral(node);
   R visitNullLiteral(NullLiteral node) => defaultBasicLiteral(node);
   R visitLet(Let node) => defaultExpression(node);
+  R visitBlockExpression(BlockExpression node) => defaultExpression(node);
   R visitInstantiation(Instantiation node) => defaultExpression(node);
   R visitLoadLibrary(LoadLibrary node) => defaultExpression(node);
   R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) =>
@@ -179,6 +180,7 @@
   R visitBoolLiteral(BoolLiteral node) => defaultBasicLiteral(node);
   R visitNullLiteral(NullLiteral node) => defaultBasicLiteral(node);
   R visitLet(Let node) => defaultExpression(node);
+  R visitBlockExpression(BlockExpression node) => defaultExpression(node);
   R visitInstantiation(Instantiation node) => defaultExpression(node);
   R visitLoadLibrary(LoadLibrary node) => defaultExpression(node);
   R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) =>
@@ -290,6 +292,7 @@
   R visitSymbolConstant(SymbolConstant node) => defaultConstant(node);
   R visitMapConstant(MapConstant node) => defaultConstant(node);
   R visitListConstant(ListConstant node) => defaultConstant(node);
+  R visitSetConstant(SetConstant node) => defaultConstant(node);
   R visitInstanceConstant(InstanceConstant node) => defaultConstant(node);
   R visitPartialInstantiationConstant(PartialInstantiationConstant node) =>
       defaultConstant(node);
@@ -344,6 +347,7 @@
   R visitSymbolConstant(SymbolConstant node) => defaultConstant(node);
   R visitMapConstant(MapConstant node) => defaultConstant(node);
   R visitListConstant(ListConstant node) => defaultConstant(node);
+  R visitSetConstant(SetConstant node) => defaultConstant(node);
   R visitInstanceConstant(InstanceConstant node) => defaultConstant(node);
   R visitPartialInstantiationConstant(PartialInstantiationConstant node) =>
       defaultConstant(node);
@@ -373,6 +377,8 @@
       defaultConstantReference(node);
   R visitListConstantReference(ListConstant node) =>
       defaultConstantReference(node);
+  R visitSetConstantReference(SetConstant node) =>
+      defaultConstantReference(node);
   R visitInstanceConstantReference(InstanceConstant node) =>
       defaultConstantReference(node);
   R visitPartialInstantiationConstantReference(
@@ -516,6 +522,8 @@
   R visitBoolLiteral(BoolLiteral node, T arg) => defaultBasicLiteral(node, arg);
   R visitNullLiteral(NullLiteral node, T arg) => defaultBasicLiteral(node, arg);
   R visitLet(Let node, T arg) => defaultExpression(node, arg);
+  R visitBlockExpression(BlockExpression node, T arg) =>
+      defaultExpression(node, arg);
   R visitInstantiation(Instantiation node, T arg) =>
       defaultExpression(node, arg);
   R visitLoadLibrary(LoadLibrary node, T arg) => defaultExpression(node, arg);
diff --git a/pkg/kernel/lib/vm/constants_native_effects.dart b/pkg/kernel/lib/vm/constants_native_effects.dart
index 58c8eca..9a9c9c8 100644
--- a/pkg/kernel/lib/vm/constants_native_effects.dart
+++ b/pkg/kernel/lib/vm/constants_native_effects.dart
@@ -26,30 +26,26 @@
   }
 
   @override
-  Constant lowerConstant(Constant constant) {
-    if (constant is MapConstant) {
-      // The _ImmutableMap class is implemented via one field pointing to a list
-      // of key/value pairs -- see runtime/lib/immutable_map.dart!
-      final List<Constant> kvListPairs =
-          new List<Constant>(2 * constant.entries.length);
-      for (int i = 0; i < constant.entries.length; i++) {
-        final ConstantMapEntry entry = constant.entries[i];
-        kvListPairs[2 * i] = entry.key;
-        kvListPairs[2 * i + 1] = entry.value;
-      }
-      // This is a bit fishy, since we merge the key and the value type by
-      // putting both into the same list.
-      final kvListConstant = new ListConstant(const DynamicType(), kvListPairs);
-      assert(immutableMapClass.fields.length == 1);
-      final Field kvPairListField = immutableMapClass.fields[0];
-      return new InstanceConstant(immutableMapClass.reference, <DartType>[
-        constant.keyType,
-        constant.valueType,
-      ], <Reference, Constant>{
-        kvPairListField.reference: kvListConstant,
-      });
+  Constant lowerMapConstant(MapConstant constant) {
+    // The _ImmutableMap class is implemented via one field pointing to a list
+    // of key/value pairs -- see runtime/lib/immutable_map.dart!
+    final List<Constant> kvListPairs =
+        new List<Constant>(2 * constant.entries.length);
+    for (int i = 0; i < constant.entries.length; i++) {
+      final ConstantMapEntry entry = constant.entries[i];
+      kvListPairs[2 * i] = entry.key;
+      kvListPairs[2 * i + 1] = entry.value;
     }
-
-    return constant;
+    // This is a bit fishy, since we merge the key and the value type by
+    // putting both into the same list.
+    final kvListConstant = new ListConstant(const DynamicType(), kvListPairs);
+    assert(immutableMapClass.fields.length == 1);
+    final Field kvPairListField = immutableMapClass.fields[0];
+    return new InstanceConstant(immutableMapClass.reference, <DartType>[
+      constant.keyType,
+      constant.valueType,
+    ], <Reference, Constant>{
+      kvPairListField.reference: kvListConstant,
+    });
   }
 }
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index 21e199c..02c4e5e 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -1,7 +1,7 @@
 name: kernel
 # Currently, kernel API is not stable and users should
 # not depend on semver semantics when depending on this package.
-version: 0.3.11
+version: 0.3.13
 author: Dart Team <misc@dartlang.org>
 description: Dart IR (Intermediate Representation)
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/kernel
@@ -16,6 +16,6 @@
   front_end:
     path: ../front_end
   test:
-    path: ../third_party/pkg/test
+    path: ../../third_party/pkg/test
   testing:
     path: ../testing
diff --git a/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart b/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
index 34f572b..9603db8 100644
--- a/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
+++ b/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
@@ -14,19 +14,19 @@
 }
 
 // Wrappers for testing.
-Expression readExpression(String input, DeserializationState state) {
+Statement readStatement(String input, DeserializationState state) {
   TextIterator stream = new TextIterator(input, 0);
   stream.moveNext();
-  Expression result = expressionSerializer.readFrom(stream, state);
+  Statement result = statementSerializer.readFrom(stream, state);
   if (stream.moveNext()) {
     throw StateError("extra cruft in basic literal");
   }
   return result;
 }
 
-String writeExpression(Expression expression, SerializationState state) {
+String writeStatement(Statement statement, SerializationState state) {
   StringBuffer buffer = new StringBuffer();
-  expressionSerializer.writeTo(buffer, expression, state);
+  statementSerializer.writeTo(buffer, statement, state);
   return buffer.toString();
 }
 
@@ -53,54 +53,59 @@
   List<String> failures = [];
   List<TestCase> tests = <TestCase>[
     new TestCase(
-        name: "let dynamic x = 42 in x",
+        name: "let dynamic x = 42 in x;",
         node: () {
           VariableDeclaration x = new VariableDeclaration("x",
               type: const DynamicType(), initializer: new IntLiteral(42));
-          return new Let(x, new VariableGet(x));
-        }(),
-        expectation:
-            "(let (var \"x^0\" (dynamic) (int 42) ()) (get-var \"x^0\" _))"),
-    new TestCase(
-        name: "let dynamic x = 42 in let Bottom x^0 = null in x",
-        node: () {
-          VariableDeclaration outterLetVar = new VariableDeclaration("x",
-              type: const DynamicType(), initializer: new IntLiteral(42));
-          VariableDeclaration innerLetVar = new VariableDeclaration("x",
-              type: const BottomType(), initializer: new NullLiteral());
-          return new Let(outterLetVar,
-              new Let(innerLetVar, new VariableGet(outterLetVar)));
+          return new ExpressionStatement(new Let(x, new VariableGet(x)));
         }(),
         expectation: ""
-            "(let (var \"x^0\" (dynamic) (int 42) ())"
-            " (let (var \"x^1\" (bottom) (null) ())"
+            "(expr (let (var \"x^0\" (dynamic) (int 42) ())"
             " (get-var \"x^0\" _)))"),
     new TestCase(
-        name: "let dynamic x = 42 in let Bottom x^0 = null in x^0",
+        name: "let dynamic x = 42 in let Bottom x^0 = null in x;",
         node: () {
           VariableDeclaration outterLetVar = new VariableDeclaration("x",
               type: const DynamicType(), initializer: new IntLiteral(42));
           VariableDeclaration innerLetVar = new VariableDeclaration("x",
               type: const BottomType(), initializer: new NullLiteral());
-          return new Let(
-              outterLetVar, new Let(innerLetVar, new VariableGet(innerLetVar)));
+          return new ExpressionStatement(new Let(outterLetVar,
+              new Let(innerLetVar, new VariableGet(outterLetVar))));
         }(),
         expectation: ""
-            "(let (var \"x^0\" (dynamic) (int 42) ())"
+            "(expr (let (var \"x^0\" (dynamic) (int 42) ())"
             " (let (var \"x^1\" (bottom) (null) ())"
-            " (get-var \"x^1\" _)))"),
+            " (get-var \"x^0\" _))))"),
+    new TestCase(
+        name: "let dynamic x = 42 in let Bottom x^0 = null in x^0;",
+        node: () {
+          VariableDeclaration outterLetVar = new VariableDeclaration("x",
+              type: const DynamicType(), initializer: new IntLiteral(42));
+          VariableDeclaration innerLetVar = new VariableDeclaration("x",
+              type: const BottomType(), initializer: new NullLiteral());
+          return new ExpressionStatement(new Let(outterLetVar,
+              new Let(innerLetVar, new VariableGet(innerLetVar))));
+        }(),
+        expectation: ""
+            "(expr (let (var \"x^0\" (dynamic) (int 42) ())"
+            " (let (var \"x^1\" (bottom) (null) ())"
+            " (get-var \"x^1\" _))))"),
     () {
       VariableDeclaration x =
           new VariableDeclaration("x", type: const DynamicType());
       return new TestCase(
-          name: "/* suppose: dynamic x; */ x = 42",
-          node: new VariableSet(x, new IntLiteral(42)),
-          expectation: "(set-var \"x^0\" (int 42))",
+          name: "/* suppose: dynamic x; */ x = 42;",
+          node: new ExpressionStatement(new VariableSet(x, new IntLiteral(42))),
+          expectation: "(expr (set-var \"x^0\" (int 42)))",
           serializationState: new SerializationState(
-            new SerializationEnvironment(null)..add(x, "x^0"),
+            new SerializationEnvironment(null)
+              ..addBinder(x, "x^0")
+              ..close(),
           ),
           deserializationState: new DeserializationState(
-              new DeserializationEnvironment(null)..add("x^0", x),
+              new DeserializationEnvironment(null)
+                ..addBinder("x^0", x)
+                ..close(),
               new CanonicalName.root()));
     }(),
     () {
@@ -111,9 +116,10 @@
       Component component = new Component(libraries: <Library>[library]);
       component.computeCanonicalNames();
       return new TestCase(
-          name: "/* suppose top-level: dynamic field; */ field",
-          node: new StaticGet(field),
-          expectation: "(get-static \"package:foo/bar.dart::@fields::field\")",
+          name: "/* suppose top-level: dynamic field; */ field;",
+          node: new ExpressionStatement(new StaticGet(field)),
+          expectation: ""
+              "(expr (get-static \"package:foo/bar.dart::@fields::field\"))",
           serializationState: new SerializationState(null),
           deserializationState: new DeserializationState(null, component.root));
     }(),
@@ -125,10 +131,12 @@
       Component component = new Component(libraries: <Library>[library]);
       component.computeCanonicalNames();
       return new TestCase(
-          name: "/* suppose top-level: dynamic field; */ field = 1",
-          node: new StaticSet(field, new IntLiteral(1)),
-          expectation:
-              "(set-static \"package:foo/bar.dart::@fields::field\" (int 1))",
+          name: "/* suppose top-level: dynamic field; */ field = 1;",
+          node:
+              new ExpressionStatement(new StaticSet(field, new IntLiteral(1))),
+          expectation: ""
+              "(expr"
+              " (set-static \"package:foo/bar.dart::@fields::field\" (int 1)))",
           serializationState: new SerializationState(null),
           deserializationState: new DeserializationState(null, component.root));
     }(),
@@ -146,13 +154,14 @@
       Component component = new Component(libraries: <Library>[library]);
       component.computeCanonicalNames();
       return new TestCase(
-          name: "/* suppose top-level: foo(dynamic x) {...}; */ foo(42)",
-          node: new StaticInvocation.byReference(topLevelProcedure.reference,
+          name: "/* suppose top-level: foo(dynamic x) {...}; */ foo(42);",
+          node: new ExpressionStatement(new StaticInvocation.byReference(
+              topLevelProcedure.reference,
               new Arguments(<Expression>[new IntLiteral(42)]),
-              isConst: false),
+              isConst: false)),
           expectation: ""
-              "(invoke-static \"package:foo/bar.dart::@methods::foo\""
-              " () ((int 42)) ())",
+              "(expr (invoke-static \"package:foo/bar.dart::@methods::foo\""
+              " () ((int 42)) ()))",
           serializationState: new SerializationState(null),
           deserializationState: new DeserializationState(null, component.root));
     }(),
@@ -170,14 +179,14 @@
       return new TestCase(
           name: ""
               "/* suppose A { const A(); const factory A.foo() = A; } */"
-              " const A.foo()",
-          node: new StaticInvocation.byReference(
+              " const A.foo();",
+          node: new ExpressionStatement(new StaticInvocation.byReference(
               factoryConstructor.reference, new Arguments([]),
-              isConst: true),
+              isConst: true)),
           expectation: ""
-              "(invoke-const-static"
+              "(expr (invoke-const-static"
               " \"package:foo/bar.dart::A::@factories::foo\""
-              " () () ())",
+              " () () ()))",
           serializationState: new SerializationState(null),
           deserializationState: new DeserializationState(null, component.root));
     }(),
@@ -193,16 +202,20 @@
       VariableDeclaration x =
           new VariableDeclaration("x", type: const DynamicType());
       return new TestCase(
-          name: "/* suppose A {dynamic field;} A x; */ x.{A::field}",
-          node: new DirectPropertyGet.byReference(
-              new VariableGet(x), field.reference),
+          name: "/* suppose A {dynamic field;} A x; */ x.{A::field};",
+          node: new ExpressionStatement(new DirectPropertyGet.byReference(
+              new VariableGet(x), field.reference)),
           expectation: ""
-              "(get-direct-prop (get-var \"x^0\" _)"
-              " \"package:foo/bar.dart::A::@fields::field\")",
-          serializationState: new SerializationState(
-              new SerializationEnvironment(null)..add(x, "x^0")),
+              "(expr (get-direct-prop (get-var \"x^0\" _)"
+              " \"package:foo/bar.dart::A::@fields::field\"))",
+          serializationState:
+              new SerializationState(new SerializationEnvironment(null)
+                ..addBinder(x, "x^0")
+                ..close()),
           deserializationState: new DeserializationState(
-              new DeserializationEnvironment(null)..add("x^0", x),
+              new DeserializationEnvironment(null)
+                ..addBinder("x^0", x)
+                ..close(),
               component.root));
     }(),
     () {
@@ -217,16 +230,20 @@
       VariableDeclaration x =
           new VariableDeclaration("x", type: const DynamicType());
       return new TestCase(
-          name: "/* suppose A {dynamic field;} A x; */ x.{A::field} = 42",
-          node: new DirectPropertySet.byReference(
-              new VariableGet(x), field.reference, new IntLiteral(42)),
+          name: "/* suppose A {dynamic field;} A x; */ x.{A::field} = 42;",
+          node: new ExpressionStatement(new DirectPropertySet.byReference(
+              new VariableGet(x), field.reference, new IntLiteral(42))),
           expectation: ""
-              "(set-direct-prop (get-var \"x^0\" _)"
-              " \"package:foo/bar.dart::A::@fields::field\" (int 42))",
-          serializationState: new SerializationState(
-              new SerializationEnvironment(null)..add(x, "x^0")),
+              "(expr (set-direct-prop (get-var \"x^0\" _)"
+              " \"package:foo/bar.dart::A::@fields::field\" (int 42)))",
+          serializationState:
+              new SerializationState(new SerializationEnvironment(null)
+                ..addBinder(x, "x^0")
+                ..close()),
           deserializationState: new DeserializationState(
-              new DeserializationEnvironment(null)..add("x^0", x),
+              new DeserializationEnvironment(null)
+                ..addBinder("x^0", x)
+                ..close(),
               component.root));
     }(),
     () {
@@ -243,17 +260,21 @@
       VariableDeclaration x =
           new VariableDeclaration("x", type: const DynamicType());
       return new TestCase(
-          name: "/* suppose A {foo() {...}} A x; */ x.{A::foo}()",
-          node: new DirectMethodInvocation.byReference(
-              new VariableGet(x), method.reference, new Arguments([])),
+          name: "/* suppose A {foo() {...}} A x; */ x.{A::foo}();",
+          node: new ExpressionStatement(new DirectMethodInvocation.byReference(
+              new VariableGet(x), method.reference, new Arguments([]))),
           expectation: ""
-              "(invoke-direct-method (get-var \"x^0\" _)"
+              "(expr (invoke-direct-method (get-var \"x^0\" _)"
               " \"package:foo/bar.dart::A::@methods::foo\""
-              " () () ())",
-          serializationState: new SerializationState(
-              new SerializationEnvironment(null)..add(x, "x^0")),
+              " () () ()))",
+          serializationState:
+              new SerializationState(new SerializationEnvironment(null)
+                ..addBinder(x, "x^0")
+                ..close()),
           deserializationState: new DeserializationState(
-              new DeserializationEnvironment(null)..add("x^0", x),
+              new DeserializationEnvironment(null)
+                ..addBinder("x^0", x)
+                ..close(),
               component.root));
     }(),
     () {
@@ -267,13 +288,13 @@
       Component component = new Component(libraries: <Library>[library]);
       component.computeCanonicalNames();
       return new TestCase(
-          name: "/* suppose A {A.foo();} */ new A()",
-          node: new ConstructorInvocation.byReference(
-              constructor.reference, new Arguments([])),
+          name: "/* suppose A {A.foo();} */ new A();",
+          node: new ExpressionStatement(new ConstructorInvocation.byReference(
+              constructor.reference, new Arguments([]))),
           expectation: ""
-              "(invoke-constructor"
+              "(expr (invoke-constructor"
               " \"package:foo/bar.dart::A::@constructors::foo\""
-              " () () ())",
+              " () () ()))",
           serializationState: new SerializationState(null),
           deserializationState: new DeserializationState(null, component.root));
     }(),
@@ -288,21 +309,44 @@
       Component component = new Component(libraries: <Library>[library]);
       component.computeCanonicalNames();
       return new TestCase(
-          name: "/* suppose A {const A.foo();} */ const A()",
-          node: new ConstructorInvocation.byReference(
+          name: "/* suppose A {const A.foo();} */ const A();",
+          node: new ExpressionStatement(new ConstructorInvocation.byReference(
               constructor.reference, new Arguments([]),
-              isConst: true),
+              isConst: true)),
           expectation: ""
-              "(invoke-const-constructor"
+              "(expr (invoke-const-constructor"
               " \"package:foo/bar.dart::A::@constructors::foo\""
-              " () () ())",
+              " () () ()))",
           serializationState: new SerializationState(null),
           deserializationState: new DeserializationState(null, component.root));
     }(),
+    () {
+      TypeParameter outterParam =
+          new TypeParameter("T", const DynamicType(), const DynamicType());
+      TypeParameter innerParam =
+          new TypeParameter("T", const DynamicType(), const DynamicType());
+      return new TestCase(
+          name: "/* T Function<T>(T Function<T>()); */",
+          node: new ExpressionStatement(new TypeLiteral(new FunctionType(
+              [
+                new FunctionType([], new TypeParameterType(innerParam),
+                    typeParameters: [innerParam])
+              ],
+              new TypeParameterType(outterParam),
+              typeParameters: [outterParam]))),
+          expectation: ""
+              "(expr (type (-> (\"T^0\") ((dynamic)) ((dynamic)) "
+              "((-> (\"T^1\") ((dynamic)) ((dynamic)) () () () "
+              "(par \"T^1\" _))) () () (par \"T^0\" _))))",
+          serializationState:
+              new SerializationState(new SerializationEnvironment(null)),
+          deserializationState: new DeserializationState(
+              new DeserializationEnvironment(null), null));
+    }(),
   ];
   for (TestCase testCase in tests) {
     String roundTripInput =
-        writeExpression(testCase.node, testCase.serializationState);
+        writeStatement(testCase.node, testCase.serializationState);
     if (roundTripInput != testCase.expectation) {
       failures.add(''
           '* initial serialization for test "${testCase.name}"'
@@ -310,9 +354,9 @@
     }
 
     TreeNode deserialized =
-        readExpression(roundTripInput, testCase.deserializationState);
+        readStatement(roundTripInput, testCase.deserializationState);
     String roundTripOutput =
-        writeExpression(deserialized, testCase.serializationState);
+        writeStatement(deserialized, testCase.serializationState);
     if (roundTripOutput != roundTripInput) {
       failures.add(''
           '* input "${testCase.name}" gave output "${roundTripOutput}"');
diff --git a/pkg/kernel/test/text_serializer_test.dart b/pkg/kernel/test/text_serializer_test.dart
index 1cd569c..ae80281 100644
--- a/pkg/kernel/test/text_serializer_test.dart
+++ b/pkg/kernel/test/text_serializer_test.dart
@@ -79,11 +79,17 @@
     "(map (dynamic) (void) ((int 0) (null) (int 1) (null) (int 2) (null)))",
     "(const-map (dynamic) (void) ((int 0) (null) (int 1) (null) "
         "(int 2) (null)))",
-    "(type (-> ((dynamic)) 1 (dynamic)))",
-    "(type (-> ((dynamic)) 0 (dynamic)))",
-    "(type (-> ((dynamic) (dynamic)) 2 (dynamic)))",
-    "(type (-> () 0 (dynamic)))",
-    "(type (-> ((-> ((dynamic)) 1 (dynamic))) 1 (dynamic)))",
+    "(type (-> () () () ((dynamic)) () () (dynamic)))",
+    "(type (-> () () () () ((dynamic)) () (dynamic)))",
+    "(type (-> () () () ((dynamic) (dynamic)) () () (dynamic)))",
+    "(type (-> () () () () () () (dynamic)))",
+    "(type (-> () () () ((-> () () () ((dynamic)) () () (dynamic))) () () "
+        "(dynamic)))",
+    "(type (-> (\"T^0\") ((dynamic)) ((dynamic)) () () () (dynamic)))",
+    "(type (-> (\"T^0\") ((dynamic)) ((dynamic)) ((par \"T^0\" _)) () () "
+        "(par \"T^0\" _)))",
+    "(type (-> (\"T^0\" \"S^1\") ((par \"S^1\" _) (par \"T^0\" _)) ((dynamic) "
+        "(dynamic)) () () () (dynamic)))",
   ];
   for (var test in tests) {
     var literal = readExpression(test);
diff --git a/pkg/kernel/test/treeshaker_bench.dart b/pkg/kernel/test/treeshaker_bench.dart
deleted file mode 100644
index a34ac9e..0000000
--- a/pkg/kernel/test/treeshaker_bench.dart
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-library kernel.treeshaker_bench;
-
-import 'dart:io';
-
-import 'package:args/args.dart';
-import 'package:kernel/class_hierarchy.dart';
-import 'package:kernel/core_types.dart';
-import 'package:kernel/kernel.dart';
-import 'package:kernel/transformations/treeshaker.dart';
-
-import 'class_hierarchy_basic.dart';
-
-ArgParser argParser = new ArgParser(allowTrailingOptions: true)
-  ..addFlag('basic',
-      help: 'Use the basic class hierarchy implementation', negatable: false)
-  ..addFlag('from-scratch',
-      help: 'Rebuild class hierarchy for each tree shaking', negatable: false)
-  ..addFlag('diagnose',
-      abbr: 'd', help: 'Print internal diagnostics', negatable: false)
-  ..addFlag('legacy-mode',
-      help: 'Run the tree shaker in legacy mode', negatable: false);
-
-String usage = '''
-Usage: treeshaker_bench [options] FILE.dill
-
-Benchmark the tree shaker and the class hierarchy it depends on.
-
-Options:
-${argParser.usage}
-''';
-
-void main(List<String> args) {
-  if (args.length == 0) {
-    print(usage);
-    exit(1);
-  }
-  ArgResults options = argParser.parse(args);
-  if (options.rest.length != 1) {
-    print('Exactly one file must be given');
-    exit(1);
-  }
-  String filename = options.rest.single;
-  bool legacyMode = options['legacy-mode'];
-
-  Component component = loadComponentFromBinary(filename);
-
-  ClassHierarchy buildClassHierarchy() {
-    return options['basic']
-        ? new BasicClassHierarchy(component)
-        : new ClassHierarchy(component);
-  }
-
-  CoreTypes coreTypes = new CoreTypes(component);
-
-  var watch = new Stopwatch()..start();
-  ClassHierarchy sharedClassHierarchy = buildClassHierarchy();
-  int coldHierarchyTime = watch.elapsedMicroseconds;
-  var shaker = new TreeShaker(coreTypes, sharedClassHierarchy, component,
-      legacyMode: legacyMode);
-  if (options['diagnose']) {
-    print(shaker.getDiagnosticString());
-  }
-  shaker = null;
-  int coldTreeShakingTime = watch.elapsedMicroseconds;
-
-  ClassHierarchy getClassHierarchy() {
-    return options['from-scratch']
-        ? buildClassHierarchy()
-        : sharedClassHierarchy;
-  }
-
-  const int numberOfTrials = 50;
-  int hotHierarchyTime = 0;
-  int hotTreeShakingTime = 0;
-  watch.reset();
-  for (int i = 0; i < numberOfTrials; i++) {
-    watch.reset();
-    var hierarchy = getClassHierarchy();
-    hotHierarchyTime += watch.elapsedMicroseconds;
-    new TreeShaker(coreTypes, hierarchy, component, legacyMode: legacyMode);
-    hotTreeShakingTime += watch.elapsedMicroseconds;
-  }
-  hotHierarchyTime ~/= numberOfTrials;
-  hotTreeShakingTime ~/= numberOfTrials;
-
-  var coldShakingMs = coldTreeShakingTime ~/ 1000;
-  var coldHierarchyMs = coldHierarchyTime ~/ 1000;
-  var hotShakingMs = hotTreeShakingTime ~/ 1000;
-  var hotHierarchyMs = hotHierarchyTime ~/ 1000;
-
-  print('''
-build.cold $coldShakingMs ms ($coldHierarchyMs ms from hierarchy)
-build.hot  $hotShakingMs ms ($hotHierarchyMs ms from hierarchy)''');
-}
diff --git a/pkg/kernel/test/treeshaker_check.dart b/pkg/kernel/test/treeshaker_check.dart
deleted file mode 100644
index 92711b6..0000000
--- a/pkg/kernel/test/treeshaker_check.dart
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-library kernel.treeshaker_check;
-
-import 'dart:io';
-
-import 'package:kernel/class_hierarchy.dart';
-import 'package:kernel/core_types.dart';
-import 'package:kernel/kernel.dart';
-import 'package:kernel/transformations/treeshaker.dart';
-
-String usage = '''
-Usage: treeshaker_check FILE.dill
-
-Run the tree shaker on FILE.dill and perform some internal sanity checks.
-''';
-
-main(List<String> args) {
-  if (args.length == 0) {
-    print(usage);
-    exit(1);
-  }
-  var component = loadComponentFromBinary(args[0]);
-  var coreTypes = new CoreTypes(component);
-  var hierarchy = new ClassHierarchy(component);
-  var shaker =
-      new TreeShaker(coreTypes, hierarchy, component, legacyMode: true);
-  shaker.transform(component);
-  new TreeShakingSanityCheck(shaker).visit(component);
-}
-
-class TreeShakingSanityCheck extends RecursiveVisitor {
-  final TreeShaker shaker;
-  bool isInCoreLibrary = false;
-
-  TreeShakingSanityCheck(this.shaker);
-
-  void visit(Node node) {
-    node.accept(this);
-  }
-
-  visitLibrary(Library node) {
-    isInCoreLibrary = (node.importUri.scheme == 'dart');
-    super.visitLibrary(node);
-  }
-
-  defaultMember(Member member) {
-    if (!isInCoreLibrary &&
-        member is! Constructor &&
-        !shaker.isMemberUsed(member)) {
-      throw 'Unused member $member was not removed';
-    }
-  }
-
-  defaultMemberReference(Member target) {
-    if (!shaker.isMemberUsed(target)) {
-      throw 'Found reference to $target';
-    }
-  }
-}
diff --git a/pkg/kernel/test/treeshaker_dump.dart b/pkg/kernel/test/treeshaker_dump.dart
deleted file mode 100644
index 1073c6d..0000000
--- a/pkg/kernel/test/treeshaker_dump.dart
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-library kernel.treeshaker_dump;
-
-import 'dart:io';
-import 'package:kernel/class_hierarchy.dart';
-import 'package:kernel/core_types.dart';
-import 'package:kernel/kernel.dart';
-import 'package:kernel/transformations/treeshaker.dart';
-import 'package:args/args.dart';
-import 'package:path/path.dart' as pathlib;
-import 'package:kernel/text/ast_to_text.dart';
-
-ArgParser parser = new ArgParser(allowTrailingOptions: true)
-  ..addFlag('used', help: 'Print used members', negatable: false)
-  ..addFlag('unused', help: 'Print unused members', negatable: false)
-  ..addFlag('instantiated',
-      help: 'Print instantiated classes', negatable: false)
-  ..addFlag('types', help: 'Print classes used as a type', negatable: false)
-  ..addFlag('summary',
-      help: 'Print short summary of tree shaking results', defaultsTo: true)
-  ..addFlag('diff',
-      help: 'Print textual output before and after tree shaking.\n'
-          'Files are written to FILE.before.txt and FILE.after.txt',
-      negatable: false)
-  ..addOption('output',
-      help: 'The --diff files are written to the given directory instead of '
-          'the working directory')
-  ..addFlag('legacy-mode', help: 'Run the tree shaker in legacy mode');
-
-String usage = '''
-Usage: treeshaker_dump [options] FILE.dill
-
-Runs tree shaking on the given component and prints information about the results.
-
-Example:
-  treeshaker_dump --instantiated foo.dill
-
-Example:
-    treeshaker_dump --diff foo.dill
-    diff -cd foo.{before,after}.txt > diff.txt
-    # open diff.txt in an editor
-
-Options:
-${parser.usage}
-''';
-
-main(List<String> args) {
-  if (args.isEmpty) {
-    print(usage);
-    exit(1);
-  }
-  ArgResults options = parser.parse(args);
-  if (options.rest.length != 1) {
-    print('Exactly one file should be given.');
-    exit(1);
-  }
-  String filename = options.rest.single;
-
-  if (options['output'] != null && !options['diff']) {
-    print('--output must be used with --diff');
-    exit(1);
-  }
-
-  bool legacyMode = options['legacy-mode'];
-
-  Component component = loadComponentFromBinary(filename);
-  CoreTypes coreTypes = new CoreTypes(component);
-  ClassHierarchy hierarchy = new ClassHierarchy(component);
-  TreeShaker shaker =
-      new TreeShaker(coreTypes, hierarchy, component, legacyMode: legacyMode);
-  int totalClasses = 0;
-  int totalInstantiationCandidates = 0;
-  int totalMembers = 0;
-  int usedClasses = 0;
-  int instantiatedClasses = 0;
-  int usedMembers = 0;
-
-  void visitMember(Member member) {
-    if (member.isAbstract) return; // Abstract members are not relevant.
-    ++totalMembers;
-    bool isUsed = shaker.isMemberBodyUsed(member);
-    if (isUsed) {
-      ++usedMembers;
-    }
-    if (isUsed && options['used'] || !isUsed && options['unused']) {
-      String prefix = (options['used'] && options['unused'])
-          ? (isUsed ? 'USED   ' : 'UNUSED ')
-          : '';
-      print('$prefix$member');
-    }
-  }
-
-  for (var library in component.libraries) {
-    library.members.forEach(visitMember);
-    for (Class classNode in library.classes) {
-      ++totalClasses;
-      if (shaker.isInstantiated(classNode)) {
-        ++instantiatedClasses;
-        ++totalInstantiationCandidates;
-      } else if (!classNode.isAbstract &&
-          classNode.members.any((m) => m.isInstanceMember)) {
-        ++totalInstantiationCandidates;
-      }
-      if (shaker.isHierarchyUsed(classNode)) {
-        ++usedClasses;
-      }
-      classNode.members.forEach(visitMember);
-      if (options['instantiated'] && shaker.isInstantiated(classNode)) {
-        print(classNode);
-      }
-      if (options['types'] && shaker.isHierarchyUsed(classNode)) {
-        print(classNode);
-      }
-    }
-  }
-
-  if (options['summary']) {
-    print('Classes used:         ${ratio(usedClasses, totalClasses)}');
-    print('Classes instantiated: '
-        '${ratio(instantiatedClasses, totalInstantiationCandidates)}');
-    print('Members used:         ${ratio(usedMembers, totalMembers)}');
-  }
-
-  if (options['diff']) {
-    String name = pathlib.basenameWithoutExtension(filename);
-    String outputDir = options['output'] ?? '';
-    String beforeFile = pathlib.join(outputDir, '$name.before.txt');
-    String afterFile = pathlib.join(outputDir, '$name.after.txt');
-    NameSystem names = new NameSystem();
-    StringBuffer before = new StringBuffer();
-    new Printer(before, syntheticNames: names).writeComponentFile(component);
-    new File(beforeFile).writeAsStringSync('$before');
-    new TreeShaker(coreTypes, hierarchy, component, legacyMode: legacyMode)
-        .transform(component);
-    StringBuffer after = new StringBuffer();
-    new Printer(after, syntheticNames: names).writeComponentFile(component);
-    new File(afterFile).writeAsStringSync('$after');
-    print('Text written to $beforeFile and $afterFile');
-  }
-}
-
-String ratio(num x, num total) {
-  return '$x / $total (${percent(x, total)})';
-}
-
-String percent(num x, num total) {
-  return total == 0 ? '0%' : ((100 * x / total).toStringAsFixed(0) + '%');
-}
diff --git a/pkg/kernel/test/treeshaker_membench.dart b/pkg/kernel/test/treeshaker_membench.dart
deleted file mode 100644
index 937637d..0000000
--- a/pkg/kernel/test/treeshaker_membench.dart
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/env dart
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-library kernel.treeshaker_membench;
-
-import 'package:kernel/kernel.dart';
-import 'package:kernel/transformations/treeshaker.dart';
-import 'package:kernel/class_hierarchy.dart';
-import 'package:kernel/core_types.dart';
-import 'package:args/args.dart';
-import 'dart:io';
-
-ArgParser argParser = new ArgParser(allowTrailingOptions: true)
-  ..addOption('count',
-      abbr: 'c', help: 'Build N copies of the tree shaker', defaultsTo: '100')
-  ..addFlag('legacy-mode', help: 'Run the tree shaker in legacy mode');
-
-String usage = """
-Usage: treeshaker_membench [options] FILE.dill
-
-Options:
-${argParser.usage}
-""";
-
-/// Builds N copies of the tree shaker data structure for the given component.
-/// Pass --print-metrics to the Dart VM to measure the memory use.
-main(List<String> args) {
-  if (args.length == 0) {
-    print(usage);
-    exit(1);
-  }
-  ArgResults options = argParser.parse(args);
-  if (options.rest.length != 1) {
-    print('Exactly one file should be given');
-    exit(1);
-  }
-  String filename = options.rest.single;
-  bool legacyMode = options['legacy-mode'];
-
-  Component component = loadComponentFromBinary(filename);
-  ClassHierarchy hierarchy = new ClassHierarchy(component);
-  CoreTypes coreTypes = new CoreTypes(component);
-
-  int copyCount = int.parse(options['count']);
-
-  TreeShaker buildTreeShaker() {
-    return new TreeShaker(coreTypes, hierarchy, component,
-        legacyMode: legacyMode);
-  }
-
-  List<TreeShaker> keepAlive = <TreeShaker>[];
-  for (int i = 0; i < copyCount; ++i) {
-    keepAlive.add(buildTreeShaker());
-  }
-
-  print('$copyCount copies built');
-
-  if (args.contains('-v')) {
-    // Use of the list for something to avoid premature GC.
-    for (var treeShaker in keepAlive) {
-      treeShaker.getClassRetention(coreTypes.objectClass);
-    }
-  }
-}
diff --git a/pkg/kernel/test/typecheck.dart b/pkg/kernel/test/typecheck.dart
deleted file mode 100644
index 565892b..0000000
--- a/pkg/kernel/test/typecheck.dart
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:kernel/kernel.dart';
-import 'package:kernel/class_hierarchy.dart';
-import 'package:kernel/core_types.dart';
-import 'package:kernel/type_checker.dart';
-import 'dart:io';
-
-final String usage = '''
-Usage: typecheck FILE.dill
-
-Runs the type checker on the given component.
-''';
-
-main(List<String> args) {
-  if (args.length != 1) {
-    print(usage);
-    exit(1);
-  }
-  var component = loadComponentFromBinary(args[0]);
-  var coreTypes = new CoreTypes(component);
-  var hierarchy = new ClassHierarchy(component);
-  new TestTypeChecker(coreTypes, hierarchy).checkComponent(component);
-}
-
-class TestTypeChecker extends TypeChecker {
-  TestTypeChecker(CoreTypes coreTypes, ClassHierarchy hierarchy)
-      : super(coreTypes, hierarchy, legacyMode: true);
-
-  @override
-  void checkAssignable(TreeNode where, DartType from, DartType to) {
-    if (!environment.isSubtypeOf(from, to)) {
-      fail(where, '$from is not a subtype of $to');
-    }
-  }
-
-  @override
-  void fail(TreeNode where, String message) {
-    Location location = where.location;
-    String locationString = location == null ? '' : '($location)';
-    print('[error] $message $locationString');
-  }
-}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index edb50ff..d26e5ee 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -40,6 +40,8 @@
 front_end/test/fasta/shaker_test: Skip # Issue http://dartbug.com/32531
 front_end/test/fasta/strong_test: Pass, ExtraSlow
 front_end/test/fasta/text_serialization_test: Pass, ExtraSlow
+front_end/test/fasta/types/dart2js_benchmark_test: Pass, Slow
+front_end/test/fasta/types/large_app_benchmark_test: Pass, ExtraSlow
 front_end/test/minimal_incremental_kernel_generator_test: Slow, Pass
 front_end/test/whole_program_test: Slow, Pass
 front_end/testcases/*: Skip # These are not tests but input for tests.
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 141fb61..619c943 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -110,6 +110,7 @@
       ..packagesFileUri = packagesUri
       ..sdkSummary = platformKernelPath
       ..verbose = verbose
+      ..omitPlatform = true
       ..bytecode = bytecode
       ..experimentalFlags =
           parseExperimentalFlags(expFlags, (msg) => errors.add(msg))
diff --git a/pkg/vm/bin/list_libraries.dart b/pkg/vm/bin/list_libraries.dart
new file mode 100644
index 0000000..dcaf735
--- /dev/null
+++ b/pkg/vm/bin/list_libraries.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:kernel/kernel.dart' show Component;
+import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
+
+final String _usage = '''
+Usage: list_libraries input.dill
+Lists libraries included in a kernel binary file.
+''';
+
+main(List<String> arguments) async {
+  if (arguments.length != 1) {
+    print(_usage);
+    exit(1);
+  }
+
+  final input = arguments[0];
+
+  final component = new Component();
+
+  final List<int> bytes = new File(input).readAsBytesSync();
+  new BinaryBuilder(bytes).readComponent(component);
+
+  for (final lib in component.libraries) {
+    print(lib.importUri);
+  }
+}
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index 8b15aa5..e0b9cfc 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -333,6 +333,7 @@
     Component component;
     if (options['incremental']) {
       _compilerOptions = compilerOptions;
+      _compilerOptions.omitPlatform = false;
       _generator =
           generator ?? _createGenerator(new Uri.file(_initializeFromDill));
       await invalidateIfInitializingFromDill();
@@ -430,7 +431,15 @@
         // Ignore errors that might be caused by non-file uris.
         continue nextUri;
       }
-      if (!await entity.exists()) {
+
+      bool exists;
+      try {
+        exists = await entity.exists();
+      } catch (e) {
+        exists = false;
+      }
+
+      if (!exists) {
         _generator.invalidate(uri);
         continue nextUri;
       }
diff --git a/pkg/vm/lib/incremental_compiler.dart b/pkg/vm/lib/incremental_compiler.dart
index e1715745..7914070 100644
--- a/pkg/vm/lib/incremental_compiler.dart
+++ b/pkg/vm/lib/incremental_compiler.dart
@@ -17,10 +17,6 @@
 class IncrementalCompiler {
   IncrementalKernelGenerator _generator;
 
-  // Component that reflect current state of the compiler, which has not
-  // been yet accepted by the client. Is [null] if no compilation was done
-  // since last accept/reject acknowledgement by the client.
-  Component _candidate;
   // Component that reflect the state that was most recently accepted by the
   // client. Is [null], if no compilation results were accepted by the client.
   Component _lastKnownGood;
@@ -47,58 +43,69 @@
   /// compilation. Otherwise, previously set entryPoint is used.
   Future<Component> compile({Uri entryPoint}) async {
     _entryPoint = entryPoint ?? _entryPoint;
+    List<Uri> entryPoints;
+    if (entryPoint != null) entryPoints = [entryPoint];
     Component component = await _generator.computeDelta(
-        entryPoint: entryPoint, fullComponent: fullComponent);
+        entryPoints: entryPoints, fullComponent: fullComponent);
     initialized = true;
     fullComponent = false;
-    final bool firstDelta = _pendingDeltas.isEmpty;
     _pendingDeltas.add(component);
-    if (!firstDelta) {
-      // If more than one delta is pending, we need to combine them.
-      Procedure mainMethod;
-      Map<Uri, Library> combined = <Uri, Library>{};
-      for (Component delta in _pendingDeltas) {
-        if (delta.mainMethod != null) {
-          mainMethod = delta.mainMethod;
-        }
-        for (Library library in delta.libraries) {
-          combined[library.importUri] = library;
-        }
+    return _combinePendingDeltas(false);
+  }
+
+  _combinePendingDeltas(bool includePlatform) {
+    Procedure mainMethod;
+    Map<Uri, Library> combined = <Uri, Library>{};
+    Map<Uri, Source> uriToSource = new Map<Uri, Source>();
+    for (Component delta in _pendingDeltas) {
+      if (delta.mainMethod != null) {
+        mainMethod = delta.mainMethod;
       }
-      // TODO(vegorov) this needs to merge metadata repositories from deltas.
-      component = new Component(libraries: combined.values.toList())
-        ..mainMethod = mainMethod;
+      uriToSource.addAll(delta.uriToSource);
+      for (Library library in delta.libraries) {
+        bool isPlatform =
+            library.importUri.scheme == "dart" && !library.isSynthetic;
+        if (!includePlatform && isPlatform) continue;
+        combined[library.importUri] = library;
+      }
     }
-    _candidate = component;
-    return component;
+
+    // TODO(vegorov) this needs to merge metadata repositories from deltas.
+    return new Component(
+        libraries: combined.values.toList(), uriToSource: uriToSource)
+      ..mainMethod = mainMethod;
   }
 
   /// This lets incremental compiler know that results of last [compile] call
   /// were accepted, don't need to be included into subsequent [compile] calls
   /// results.
   accept() {
-    _pendingDeltas.clear();
-
     Map<Uri, Library> combined = <Uri, Library>{};
+    Map<Uri, Source> uriToSource = <Uri, Source>{};
+
     if (_lastKnownGood != null) {
       // TODO(aam): Figure out how to skip no-longer-used libraries from
       // [_lastKnownGood] libraries.
       for (Library library in _lastKnownGood.libraries) {
         combined[library.importUri] = library;
       }
-    }
-    for (Library library in _candidate.libraries) {
-      combined[library.importUri] = library;
-    }
-    _lastKnownGood = new Component(
-      libraries: combined.values.toList(),
-      uriToSource: _candidate.uriToSource,
-    )..mainMethod = _candidate.mainMethod;
-    for (final repo in _candidate.metadata.values) {
-      _lastKnownGood.addMetadataRepository(repo);
+      uriToSource.addAll(_lastKnownGood.uriToSource);
     }
 
-    _candidate = null;
+    Component candidate = _combinePendingDeltas(true);
+    for (Library library in candidate.libraries) {
+      combined[library.importUri] = library;
+    }
+    uriToSource.addAll(candidate.uriToSource);
+
+    _lastKnownGood = new Component(
+      libraries: combined.values.toList(),
+      uriToSource: uriToSource,
+    )..mainMethod = candidate.mainMethod;
+    for (final repo in candidate.metadata.values) {
+      _lastKnownGood.addMetadataRepository(repo);
+    }
+    _pendingDeltas.clear();
   }
 
   /// This lets incremental compiler know that results of last [compile] call
@@ -106,12 +113,11 @@
   /// be processed without changes picked up by rejected [compile] call.
   reject() async {
     _pendingDeltas.clear();
-    _candidate = null;
     // Need to reset and warm up compiler so that expression evaluation requests
     // are processed in that known good state.
     _generator = new IncrementalKernelGenerator.fromComponent(
         _compilerOptions, _entryPoint, _lastKnownGood);
-    await _generator.computeDelta(entryPoint: _entryPoint);
+    await _generator.computeDelta(entryPoints: [_entryPoint]);
   }
 
   /// This tells incremental compiler that it needs rescan [uri] file during
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 088a723..78063e2 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -551,6 +551,9 @@
 /// Convert URI to a package URI if it is inside one of the packages.
 Future<Uri> convertToPackageUri(
     FileSystem fileSystem, Uri uri, Uri packagesUri) async {
+  if (uri.scheme == 'package') {
+    return uri;
+  }
   // Convert virtual URI to a real file URI.
   String uriString = (await asFileUri(fileSystem, uri)).toString();
   List<String> packages;
@@ -636,8 +639,10 @@
       final IOSink sink = new File(filename).openWrite();
 
       final main = component.mainMethod;
+      final problems = component.problemsAsJson;
       if (package != 'main') {
         component.mainMethod = null;
+        component.problemsAsJson = null;
       }
 
       ASTRemover astRemover;
@@ -663,6 +668,7 @@
           (lib) => packageFor(lib) == package, false /* excludeUriToSource */);
       printer.writeComponentFile(component);
       component.mainMethod = main;
+      component.problemsAsJson = problems;
       if (genBytecode && dropAST) {
         astRemover.restoreAST();
       }
@@ -716,3 +722,6 @@
   file.write('\n');
   await file.close();
 }
+
+// Used by kernel_front_end_test.dart
+main() {}
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index 1682f35..5af1fdd 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -90,9 +90,9 @@
 
     transformFfi.ReplacedMembers replacedFields =
         transformFfiDefinitions.transformLibraries(
-            coreTypes, hierarchy, libraries, diagnosticReporter);
-    transformFfiUseSites.transformLibraries(
-        coreTypes, hierarchy, libraries, diagnosticReporter, replacedFields);
+            component, coreTypes, hierarchy, libraries, diagnosticReporter);
+    transformFfiUseSites.transformLibraries(component, coreTypes, hierarchy,
+        libraries, diagnosticReporter, replacedFields);
     logger?.call("Transformed ffi annotations");
 
     // TODO(kmillikin): Make this run on a per-method basis.
diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart
index f79ce37..ba4e06d 100644
--- a/pkg/vm/lib/transformations/ffi.dart
+++ b/pkg/vm/lib/transformations/ffi.dart
@@ -10,6 +10,7 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/core_types.dart';
+import 'package:kernel/library_index.dart' show LibraryIndex;
 import 'package:kernel/target/targets.dart' show DiagnosticReporter;
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
 
@@ -77,6 +78,7 @@
 /// _FfiUseSiteTransformer and _FfiDefinitionTransformer.
 class FfiTransformer extends Transformer {
   final TypeEnvironment env;
+  final LibraryIndex index;
   final ClassHierarchy hierarchy;
   final DiagnosticReporter diagnosticReporter;
 
@@ -99,25 +101,28 @@
   /// Classes corresponding to [NativeType], indexed by [NativeType].
   final List<Class> nativeTypesClasses;
 
-  FfiTransformer(this.hierarchy, CoreTypes coreTypes, this.diagnosticReporter)
+  FfiTransformer(
+      this.index, CoreTypes coreTypes, this.hierarchy, this.diagnosticReporter)
       : env = new TypeEnvironment(coreTypes, hierarchy),
         intClass = coreTypes.intClass,
         doubleClass = coreTypes.doubleClass,
-        ffiLibrary = coreTypes.ffiLibrary,
-        nativeFunctionClass = coreTypes.ffiNativeFunctionClass,
-        pointerClass = coreTypes.ffiPointerClass,
-        castMethod = coreTypes.ffiPointerCastProcedure,
-        loadMethod = coreTypes.ffiPointerLoadProcedure,
-        storeMethod = coreTypes.ffiPointerStoreProcedure,
-        offsetByMethod = coreTypes.ffiPointerOffsetByProcedure,
-        asFunctionMethod = coreTypes.ffiPointerAsFunctionProcedure,
-        lookupFunctionMethod =
-            coreTypes.ffiDynamicLibraryLookupFunctionProcedure,
-        fromFunctionMethod = coreTypes.ffiFromFunctionProcedure,
-        structField = coreTypes.ffiStructField,
         pragmaConstructor = coreTypes.pragmaConstructor,
-        nativeTypesClasses =
-            nativeTypeClassNames.map(coreTypes.ffiNativeTypeClass).toList() {}
+        ffiLibrary = index.getLibrary('dart:ffi'),
+        nativeFunctionClass = index.getClass('dart:ffi', 'NativeFunction'),
+        pointerClass = index.getClass('dart:ffi', 'Pointer'),
+        castMethod = index.getMember('dart:ffi', 'Pointer', 'cast'),
+        loadMethod = index.getMember('dart:ffi', 'Pointer', 'load'),
+        storeMethod = index.getMember('dart:ffi', 'Pointer', 'store'),
+        offsetByMethod = index.getMember('dart:ffi', 'Pointer', 'offsetBy'),
+        asFunctionMethod = index.getMember('dart:ffi', 'Pointer', 'asFunction'),
+        lookupFunctionMethod =
+            index.getMember('dart:ffi', 'DynamicLibrary', 'lookupFunction'),
+        fromFunctionMethod =
+            index.getTopLevelMember('dart:ffi', 'fromFunction'),
+        structField = index.getTopLevelMember('dart:ffi', 'struct'),
+        nativeTypesClasses = nativeTypeClassNames
+            .map((name) => index.getClass('dart:ffi', name))
+            .toList() {}
 
   /// Computes the Dart type corresponding to a ffi.[NativeType], returns null
   /// if it is not a valid NativeType.
@@ -133,6 +138,7 @@
   /// [IntPtr]                             -> [int]
   /// [Double]                             -> [double]
   /// [Float]                              -> [double]
+  /// [Void]                               -> [void]
   /// [Pointer]<T>                         -> [Pointer]<T>
   /// T extends [Pointer]                  -> T
   /// [NativeFunction]<T1 Function(T2, T3) -> S1 Function(S2, S3)
@@ -157,6 +163,9 @@
     if (nativeType_ == NativeType.kFloat || nativeType_ == NativeType.kDouble) {
       return InterfaceType(doubleClass);
     }
+    if (nativeType_ == NativeType.kVoid) {
+      return VoidType();
+    }
     if (nativeType_ == NativeType.kNativeFunction) {
       DartType fun = (nativeType as InterfaceType).typeArguments[0];
       if (fun is FunctionType) {
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index e738406..72110a3 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library kernel.transformations.ffi_definitions;
+library vm.transformations.ffi_definitions;
 
 import 'dart:math' as math;
 
@@ -13,10 +13,10 @@
         templateFfiTypeMismatch,
         templateFfiFieldInitializer;
 
-import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
-
 import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/core_types.dart';
+import 'package:kernel/library_index.dart' show LibraryIndex;
 import 'package:kernel/target/targets.dart' show DiagnosticReporter;
 
 import 'ffi.dart'
@@ -63,12 +63,18 @@
 ///   static int sizeOf() => 24;
 /// }
 ReplacedMembers transformLibraries(
+    Component component,
     CoreTypes coreTypes,
     ClassHierarchy hierarchy,
     List<Library> libraries,
     DiagnosticReporter diagnosticReporter) {
-  final transformer =
-      new _FfiDefinitionTransformer(hierarchy, coreTypes, diagnosticReporter);
+  final index = new LibraryIndex(component, ["dart:ffi"]);
+  if (!index.containsLibrary("dart:ffi")) {
+    // if dart:ffi is not loaded, do not do the transformation
+    return ReplacedMembers({}, {});
+  }
+  final transformer = new _FfiDefinitionTransformer(
+      index, coreTypes, hierarchy, diagnosticReporter);
   libraries.forEach(transformer.visitLibrary);
   return ReplacedMembers(
       transformer.replacedGetters, transformer.replacedSetters);
@@ -79,9 +85,9 @@
   Map<Field, Procedure> replacedGetters = {};
   Map<Field, Procedure> replacedSetters = {};
 
-  _FfiDefinitionTransformer(ClassHierarchy hierarchy, CoreTypes coreTypes,
-      DiagnosticReporter diagnosticReporter)
-      : super(hierarchy, coreTypes, diagnosticReporter) {}
+  _FfiDefinitionTransformer(LibraryIndex index, CoreTypes coreTypes,
+      ClassHierarchy hierarchy, DiagnosticReporter diagnosticReporter)
+      : super(index, coreTypes, hierarchy, diagnosticReporter) {}
 
   @override
   visitClass(Class node) {
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index 8e9227c..4b40caf 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library kernel.transformations.ffi_use_sites;
+library vm.transformations.ffi_use_sites;
 
 import 'package:front_end/src/api_unstable/vm.dart'
     show
@@ -11,10 +11,10 @@
         templateFfiTypeUnsized,
         templateFfiNotStatic;
 
-import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
-
 import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/core_types.dart';
+import 'package:kernel/library_index.dart' show LibraryIndex;
 import 'package:kernel/target/targets.dart' show DiagnosticReporter;
 
 import 'ffi.dart'
@@ -27,14 +27,21 @@
 
 /// Checks and replaces calls to dart:ffi struct fields and methods.
 void transformLibraries(
+    Component component,
     CoreTypes coreTypes,
     ClassHierarchy hierarchy,
     List<Library> libraries,
     DiagnosticReporter diagnosticReporter,
     ReplacedMembers replacedFields) {
+  final index = new LibraryIndex(component, ["dart:ffi"]);
+  if (!index.containsLibrary("dart:ffi")) {
+    // if dart:ffi is not loaded, do not do the transformation
+    return;
+  }
   final transformer = new _FfiUseSiteTransformer(
-      hierarchy,
+      index,
       coreTypes,
+      hierarchy,
       diagnosticReporter,
       replacedFields.replacedGetters,
       replacedFields.replacedSetters);
@@ -46,13 +53,22 @@
   final Map<Field, Procedure> replacedGetters;
   final Map<Field, Procedure> replacedSetters;
 
+  bool isFfiLibrary;
+
   _FfiUseSiteTransformer(
-      ClassHierarchy hierarchy,
+      LibraryIndex index,
       CoreTypes coreTypes,
+      ClassHierarchy hierarchy,
       DiagnosticReporter diagnosticReporter,
       this.replacedGetters,
       this.replacedSetters)
-      : super(hierarchy, coreTypes, diagnosticReporter) {}
+      : super(index, coreTypes, hierarchy, diagnosticReporter) {}
+
+  @override
+  TreeNode visitLibrary(Library node) {
+    isFfiLibrary = node == ffiLibrary;
+    return super.visitLibrary(node);
+  }
 
   @override
   visitClass(Class node) {
@@ -124,7 +140,7 @@
         _ensureNativeTypeValid(nativeType, node);
         _ensureNativeTypeToDartType(nativeType, dartType, node);
       } else if (target == asFunctionMethod) {
-        if (node.enclosingLibrary == ffiLibrary) {
+        if (isFfiLibrary) {
           // Library code of dart:ffi uses asFunction to implement
           // lookupFunction. Since we treat lookupFunction as well, this call
           // can be generic and still support AOT.
diff --git a/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart b/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart
index 8ff744d..b059fd3 100644
--- a/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart
+++ b/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart
@@ -50,6 +50,11 @@
   }
 
   @override
+  visitConstructor(Constructor ctor) {
+    _addIfEntryPoint(ctor.annotations, ctor.name.name, ctor);
+  }
+
+  @override
   visitProcedure(Procedure proc) {
     _addIfEntryPoint(proc.annotations, proc.name.name, proc);
   }
diff --git a/pkg/vm/lib/transformations/pragma.dart b/pkg/vm/lib/transformations/pragma.dart
index 0ab0b88..ff3431b 100644
--- a/pkg/vm/lib/transformations/pragma.dart
+++ b/pkg/vm/lib/transformations/pragma.dart
@@ -13,7 +13,7 @@
 
 abstract class ParsedPragma {}
 
-enum PragmaEntryPointType { Always, GetterOnly, SetterOnly }
+enum PragmaEntryPointType { Default, GetterOnly, SetterOnly, CallOnly }
 
 class ParsedEntryPointPragma extends ParsedPragma {
   final PragmaEntryPointType type;
@@ -73,17 +73,20 @@
       case kEntryPointPragmaName:
         PragmaEntryPointType type;
         if (options is NullConstant) {
-          type = PragmaEntryPointType.Always;
+          type = PragmaEntryPointType.Default;
         } else if (options is BoolConstant && options.value == true) {
-          type = PragmaEntryPointType.Always;
+          type = PragmaEntryPointType.Default;
         } else if (options is StringConstant) {
           if (options.value == "get") {
             type = PragmaEntryPointType.GetterOnly;
           } else if (options.value == "set") {
             type = PragmaEntryPointType.SetterOnly;
+          } else if (options.value == "call") {
+            type = PragmaEntryPointType.CallOnly;
           } else {
             throw "Error: string directive to @pragma('$kEntryPointPragmaName', ...) "
-                "must be either 'get' or 'set'.";
+                "must be either 'get' or 'set' for fields "
+                "or 'get' or 'call' for procedures.";
           }
         }
         return type != null ? new ParsedEntryPointPragma(type) : null;
diff --git a/pkg/vm/lib/transformations/type_flow/native_code.dart b/pkg/vm/lib/transformations/type_flow/native_code.dart
index 291237b..26f3c47 100644
--- a/pkg/vm/lib/transformations/type_flow/native_code.dart
+++ b/pkg/vm/lib/transformations/type_flow/native_code.dart
@@ -58,7 +58,7 @@
     if (!klass.isAbstract) {
       var type = _annotationsDefineRoot(klass.annotations);
       if (type != null) {
-        if (type != PragmaEntryPointType.Always) {
+        if (type != PragmaEntryPointType.Default) {
           throw "Error: pragma entry-point definition on a class must evaluate "
               "to null, true or false. See entry_points_pragma.md.";
         }
@@ -73,17 +73,39 @@
   visitProcedure(Procedure proc) {
     var type = _annotationsDefineRoot(proc.annotations);
     if (type != null) {
-      if (type != PragmaEntryPointType.Always) {
-        throw "Error: pragma entry-point definition on a procedure (including"
-            "getters and setters) must evaluate to null, true or false. "
-            "See entry_points_pragma.md.";
+      void addSelector(CallKind ck) {
+        entryPoints.addRawCall(proc.isInstanceMember
+            ? new InterfaceSelector(proc, callKind: ck)
+            : new DirectSelector(proc, callKind: ck));
       }
-      var callKind = proc.isGetter
+
+      final defaultCallKind = proc.isGetter
           ? CallKind.PropertyGet
           : (proc.isSetter ? CallKind.PropertySet : CallKind.Method);
-      entryPoints.addRawCall(proc.isInstanceMember
-          ? new InterfaceSelector(proc, callKind: callKind)
-          : new DirectSelector(proc, callKind: callKind));
+
+      switch (type) {
+        case PragmaEntryPointType.CallOnly:
+          addSelector(defaultCallKind);
+          break;
+        case PragmaEntryPointType.SetterOnly:
+          if (!proc.isSetter) {
+            throw "Error: cannot generate a setter for a method or getter ($proc).";
+          }
+          addSelector(CallKind.PropertySet);
+          break;
+        case PragmaEntryPointType.GetterOnly:
+          if (proc.isSetter) {
+            throw "Error: cannot closurize a setter ($proc).";
+          }
+          addSelector(CallKind.PropertyGet);
+          break;
+        case PragmaEntryPointType.Default:
+          addSelector(defaultCallKind);
+          if (!proc.isSetter && !proc.isGetter) {
+            addSelector(CallKind.PropertyGet);
+          }
+      }
+
       nativeCodeOracle.setMemberReferencedFromNativeCode(proc);
     }
   }
@@ -92,9 +114,10 @@
   visitConstructor(Constructor ctor) {
     var type = _annotationsDefineRoot(ctor.annotations);
     if (type != null) {
-      if (type != PragmaEntryPointType.Always) {
-        throw "Error: pragma entry-point definition on a constructor must "
-            "evaluate to null, true or false. See entry_points_pragma.md.";
+      if (type != PragmaEntryPointType.Default &&
+          type != PragmaEntryPointType.CallOnly) {
+        throw "Error: pragma entry-point definition on a constructor ($ctor) must"
+            "evaluate to null, true, false or 'call'. See entry_points_pragma.md.";
       }
       entryPoints
           .addRawCall(new DirectSelector(ctor, callKind: CallKind.Method));
@@ -125,12 +148,15 @@
         }
         addSelector(CallKind.PropertySet);
         break;
-      case PragmaEntryPointType.Always:
+      case PragmaEntryPointType.Default:
         addSelector(CallKind.PropertyGet);
         if (!field.isFinal) {
           addSelector(CallKind.PropertySet);
         }
         break;
+      case PragmaEntryPointType.CallOnly:
+        throw "Error: can't generate invocation dispatcher for field $field"
+            "through @pragma('vm:entry-point')";
     }
 
     nativeCodeOracle.setMemberReferencedFromNativeCode(field);
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index c0b92a0..b0fb04b 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -60,8 +60,13 @@
       matcher: matcher);
 
   Procedure main = component.mainMethod;
-  final Selector mainSelector = new DirectSelector(main);
-  typeFlowAnalysis.addRawCall(mainSelector);
+
+  // `main` can be null, roots can also come from @pragma("vm:entry-point").
+  if (main != null) {
+    final Selector mainSelector = new DirectSelector(main);
+    typeFlowAnalysis.addRawCall(mainSelector);
+  }
+
   typeFlowAnalysis.process();
 
   analysisStopWatch.stop();
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index 4050a60..7f4482d 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -336,6 +336,74 @@
       vm.kill();
     });
   });
+
+  group('reject', () {
+    Directory mytest;
+    setUpAll(() {
+      mytest = Directory.systemTemp.createTempSync('incremental_reject');
+    });
+
+    tearDownAll(() {
+      try {
+        mytest.deleteSync(recursive: true);
+      } catch (_) {
+        // Ignore errors;
+      }
+    });
+
+    test('compile, reject, compile again', () async {
+      var packageUri = Uri.file('${mytest.path}/.packages');
+      new File(packageUri.toFilePath()).writeAsStringSync('foo:lib/\n');
+      new Directory(mytest.path + "/lib").createSync();
+      var fooUri = Uri.file('${mytest.path}/lib/foo.dart');
+      new File(fooUri.toFilePath())
+          .writeAsStringSync("import 'package:foo/bar.dart';\n"
+              "import 'package:foo/baz.dart';\n"
+              "main() {\n"
+              "  new A();\n"
+              "  openReceivePortSoWeWontDie();"
+              "}\n");
+
+      var barUri = Uri.file('${mytest.path}/lib/bar.dart');
+      new File(barUri.toFilePath())
+          .writeAsStringSync("class A { static int a; }\n");
+
+      var bazUri = Uri.file('${mytest.path}/lib/baz.dart');
+      new File(bazUri.toFilePath()).writeAsStringSync("import 'dart:isolate';\n"
+          "openReceivePortSoWeWontDie() { new RawReceivePort(); }\n");
+
+      Uri packageEntry = Uri.parse('package:foo/foo.dart');
+      options.packagesFileUri = packageUri;
+      IncrementalCompiler compiler =
+          new IncrementalCompiler(options, packageEntry);
+      {
+        Component component = await compiler.compile(entryPoint: packageEntry);
+        File outputFile = new File('${mytest.path}/foo.dart.dill');
+        await _writeProgramToFile(component, outputFile);
+      }
+      compiler.accept();
+      {
+        Procedure procedure = await compiler.compileExpression(
+            'a', <String>[], <String>[], 'package:foo/bar.dart', 'A', true);
+        expect(procedure, isNotNull);
+      }
+
+      new File(barUri.toFilePath())
+          .writeAsStringSync("class A { static int b; }\n");
+      compiler.invalidate(barUri);
+      {
+        Component component = await compiler.compile(entryPoint: packageEntry);
+        File outputFile = new File('${mytest.path}/foo1.dart.dill');
+        await _writeProgramToFile(component, outputFile);
+      }
+      await compiler.reject();
+      {
+        Procedure procedure = await compiler.compileExpression(
+            'a', <String>[], <String>[], 'package:foo/bar.dart', 'A', true);
+        expect(procedure, isNotNull);
+      }
+    });
+  });
 }
 
 _writeProgramToFile(Component component, File outputFile) async {
diff --git a/pkg/vm/test/kernel_front_end_test.dart b/pkg/vm/test/kernel_front_end_test.dart
index 5a8379c..ec3e8b0 100644
--- a/pkg/vm/test/kernel_front_end_test.dart
+++ b/pkg/vm/test/kernel_front_end_test.dart
@@ -16,6 +16,7 @@
     .toFilePath();
 
 const String mainScript = 'pkg/vm/bin/gen_kernel.dart';
+const String mainScriptPackageUri = 'package:vm/kernel_front_end.dart';
 const String packagesFile = '.packages';
 
 void testCompile(List<String> args) async {
@@ -65,6 +66,22 @@
     ]);
   });
 
+  test('compile-multi-root-with-package-uri-main', () async {
+    await testCompile([
+      '--platform',
+      platformPath(),
+      '--filesystem-scheme',
+      'test-filesystem-scheme',
+      '--filesystem-root',
+      sdkDir,
+      '--packages',
+      'test-filesystem-scheme:///$packagesFile',
+      '--output',
+      outputDill(),
+      '$mainScriptPackageUri',
+    ]);
+  });
+
   test('compile-package-split', () async {
     await testCompile([
       '--platform',
diff --git a/pkg/vm/test/transformations/type_flow/annotation_matcher.dart b/pkg/vm/test/transformations/type_flow/annotation_matcher.dart
index 1b959c5..2b7f278 100644
--- a/pkg/vm/test/transformations/type_flow/annotation_matcher.dart
+++ b/pkg/vm/test/transformations/type_flow/annotation_matcher.dart
@@ -49,7 +49,7 @@
       case kEntryPointPragmaName:
         // We ignore the option because we can't properly evaluate it, assume
         // it's true.
-        return new ParsedEntryPointPragma(PragmaEntryPointType.Always);
+        return new ParsedEntryPointPragma(PragmaEntryPointType.Default);
       case kExactResultTypePragmaName:
         if (options is TypeLiteral) {
           return new ParsedResultTypeByTypePragma(options.type);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
index 5c65020..5fc9b87 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
@@ -45,7 +45,7 @@
   synthetic constructor •() → self::B
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
     return new self::T1::•();
   }
   no-such-method-forwarder get bar() → dynamic
@@ -59,7 +59,7 @@
   synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
     return new self::T2::•();
   }
 }
@@ -78,7 +78,7 @@
   synthetic constructor •() → self::E
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
     return new self::T4::•();
   }
   no-such-method-forwarder get bar() → dynamic
@@ -88,7 +88,7 @@
   synthetic constructor •() → self::F
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
     return new self::T2::•();
   }
 }
@@ -96,7 +96,7 @@
   synthetic constructor •() → self::G
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasThisUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
     return new self::T5::•();
   }
 }
@@ -106,7 +106,7 @@
     ;
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo({[@vm.inferred-type.metadata=dart.core::_Smi] dynamic left = null, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic right = null}) → dynamic
     return new self::T6::•();
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
     return new self::T7::•();
   }
 }
diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
index 0e3e2e2..919ee59 100644
--- a/runtime/BUILD.gn
+++ b/runtime/BUILD.gn
@@ -143,12 +143,7 @@
   }
 
   if (is_fuchsia) {
-    import("//build/config/scudo/scudo.gni")
     include_dirs += [ "//zircon/system/ulib/zx/include" ]
-    if (!use_scudo) {
-      defines += [ "DART_USE_JEMALLOC" ]
-      include_dirs += [ "//zircon/third_party/ulib/jemalloc/include" ]
-    }
   }
 
   if (!is_win) {
@@ -166,6 +161,7 @@
       "-ggdb3",
       "-fno-rtti",
       "-fno-exceptions",
+      "-Wimplicit-fallthrough",
     ]
 
     ldflags = []
@@ -220,6 +216,12 @@
     "third_party/double-conversion/src:libdouble_conversion",
     ":generate_version_cc_file",
   ]
+  if (is_fuchsia) {
+    extra_deps += [
+      "//zircon/public/lib/fbl",
+      "//zircon/public/lib/trace-engine",
+    ]
+  }
   configurable_deps = [
     "platform:libdart_platform",
     "vm:libdart_lib",
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 41a4b0a..51c708c 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -179,6 +179,13 @@
       ]
     }
 
+    if (!is_win) {
+      # Adds all symbols to the dynamic symbol table, not just used ones.
+      # This is needed to make native extensions work. It is also needed to get
+      # symbols in VM-generated backtraces and profiles.
+      ldflags = [ "-rdynamic" ]
+    }
+
     if (is_win) {
       libs = [
         "iphlpapi.lib",
@@ -434,7 +441,7 @@
 
 gen_snapshot_action("generate_snapshot_bin") {
   deps = [
-    "../vm:vm_platform",
+    "../vm:vm_platform_stripped",
   ]
   vm_snapshot_data = "$target_gen_dir/vm_snapshot_data.bin"
   vm_snapshot_instructions = "$target_gen_dir/vm_snapshot_instructions.bin"
@@ -442,7 +449,7 @@
   isolate_snapshot_instructions =
       "$target_gen_dir/isolate_snapshot_instructions.bin"
 
-  platform_dill = "$root_out_dir/vm_platform_strong.dill"
+  platform_dill = "$root_out_dir/vm_platform_strong_stripped.dill"
   inputs = [
     platform_dill,
   ]
@@ -730,7 +737,8 @@
       ldflags = [ "/EXPORT:Dart_True" ]
     } else {
       # Adds all symbols to the dynamic symbol table, not just used ones.
-      # This is needed to make native extensions work.
+      # This is needed to make native extensions work. It is also needed to get
+      # symbols in VM-generated backtraces and profiles.
       ldflags = [ "-rdynamic" ]
     }
 
@@ -943,6 +951,9 @@
             ] + builtin_impl_tests + vm_tests + compiler_tests + heap_tests
 
   if (!is_win) {
+    # Adds all symbols to the dynamic symbol table, not just used ones.
+    # This is needed to make native extensions work. It is also needed to get
+    # symbols in VM-generated backtraces and profiles.
     ldflags = [ "-rdynamic" ]
   }
 
diff --git a/runtime/bin/common_patch.dart b/runtime/bin/common_patch.dart
index 8df0749..1bcd089 100644
--- a/runtime/bin/common_patch.dart
+++ b/runtime/bin/common_patch.dart
@@ -55,7 +55,7 @@
   static Uint8List getRandomBytes(int count) native "Crypto_GetRandomBytes";
 }
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 _setupHooks() {
   VMLibraryHooks.eventHandlerSendData = _EventHandler._sendData;
   VMLibraryHooks.timerMillisecondClock = _EventHandler._timerMillisecondClock;
diff --git a/runtime/bin/crypto_android.cc b/runtime/bin/crypto_android.cc
index 2b6147c..6af505f 100644
--- a/runtime/bin/crypto_android.cc
+++ b/runtime/bin/crypto_android.cc
@@ -28,13 +28,13 @@
         read(fd, buffer + bytes_read, count - bytes_read));
     if (res < 0) {
       int err = errno;
-      VOID_TEMP_FAILURE_RETRY_NO_SIGNAL_BLOCKER(close(fd));
+      close(fd);
       errno = err;
       return false;
     }
     bytes_read += res;
   } while (bytes_read < count);
-  VOID_TEMP_FAILURE_RETRY_NO_SIGNAL_BLOCKER(close(fd));
+  close(fd);
   return true;
 }
 
diff --git a/runtime/bin/crypto_linux.cc b/runtime/bin/crypto_linux.cc
index 0a9fcb1..9a14ee3 100644
--- a/runtime/bin/crypto_linux.cc
+++ b/runtime/bin/crypto_linux.cc
@@ -28,13 +28,13 @@
         read(fd, buffer + bytes_read, count - bytes_read));
     if (res < 0) {
       int err = errno;
-      VOID_TEMP_FAILURE_RETRY_NO_SIGNAL_BLOCKER(close(fd));
+      close(fd);
       errno = err;
       return false;
     }
     bytes_read += res;
   } while (bytes_read < count);
-  VOID_TEMP_FAILURE_RETRY_NO_SIGNAL_BLOCKER(close(fd));
+  close(fd);
   return true;
 }
 
diff --git a/runtime/bin/crypto_macos.cc b/runtime/bin/crypto_macos.cc
index c799d07..5d0690e 100644
--- a/runtime/bin/crypto_macos.cc
+++ b/runtime/bin/crypto_macos.cc
@@ -28,13 +28,13 @@
         read(fd, buffer + bytes_read, count - bytes_read));
     if (res < 0) {
       int err = errno;
-      VOID_TEMP_FAILURE_RETRY_NO_SIGNAL_BLOCKER(close(fd));
+      close(fd);
       errno = err;
       return false;
     }
     bytes_read += res;
   } while (bytes_read < count);
-  VOID_TEMP_FAILURE_RETRY_NO_SIGNAL_BLOCKER(close(fd));
+  close(fd);
   return true;
 }
 
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index 40a605f..517df57 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -31,10 +31,6 @@
 namespace dart {
 namespace bin {
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-DFE dfe;
-#endif
-
 #if defined(DART_NO_SNAPSHOT) || defined(DART_PRECOMPILER)
 const uint8_t* kernel_service_dill = NULL;
 const intptr_t kernel_service_dill_size = 0;
@@ -47,6 +43,10 @@
 const intptr_t platform_strong_dill_size = kPlatformStrongDillSize;
 #endif
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+DFE dfe;
+#endif
+
 const char kKernelServiceSnapshot[] = "kernel-service.dart.snapshot";
 const char kSnapshotsDirectory[] = "snapshots";
 
@@ -94,6 +94,9 @@
     return;
   }
 
+  Dart_SetDartLibrarySourcesKernel(platform_strong_dill,
+                                   platform_strong_dill_size);
+
   if (frontend_filename_ == NULL) {
     // Look for the frontend snapshot next to the executable.
     char* dir_prefix = GetDirectoryPrefixFromExeName();
diff --git a/runtime/bin/directory_android.cc b/runtime/bin/directory_android.cc
index 9152f91..507aadb 100644
--- a/runtime/bin/directory_android.cc
+++ b/runtime/bin/directory_android.cc
@@ -142,8 +142,8 @@
         if (!listing->follow_links()) {
           return kListLink;
         }
-      // Else fall through to next case.
-      // Fall through.
+        // Else fall through to next case.
+        FALL_THROUGH;
       case DT_UNKNOWN: {
         // On some file systems the entry type is not determined by
         // readdir. For those and for links we use stat to determine
diff --git a/runtime/bin/directory_fuchsia.cc b/runtime/bin/directory_fuchsia.cc
index d1f89ea..0ddddd1 100644
--- a/runtime/bin/directory_fuchsia.cc
+++ b/runtime/bin/directory_fuchsia.cc
@@ -148,8 +148,8 @@
         if (!listing->follow_links()) {
           return kListLink;
         }
-      // Else fall through to next case.
-      // Fall through.
+        // Else fall through to next case.
+        FALL_THROUGH;
       case DT_UNKNOWN: {
         // On some file systems the entry type is not determined by
         // readdir. For those and for links we use stat to determine
diff --git a/runtime/bin/directory_linux.cc b/runtime/bin/directory_linux.cc
index ade373e..73a199a 100644
--- a/runtime/bin/directory_linux.cc
+++ b/runtime/bin/directory_linux.cc
@@ -142,8 +142,8 @@
         if (!listing->follow_links()) {
           return kListLink;
         }
-      // Else fall through to next case.
-      // Fall through.
+        // Else fall through to next case.
+        FALL_THROUGH;
       case DT_UNKNOWN: {
         // On some file systems the entry type is not determined by
         // readdir. For those and for links we use stat to determine
diff --git a/runtime/bin/directory_macos.cc b/runtime/bin/directory_macos.cc
index 3c2262f..e7bb3a5 100644
--- a/runtime/bin/directory_macos.cc
+++ b/runtime/bin/directory_macos.cc
@@ -131,8 +131,8 @@
         if (!listing->follow_links()) {
           return kListLink;
         }
-      // Else fall through to next case.
-      // Fall through.
+        // Else fall through to next case.
+        FALL_THROUGH;
       case DT_UNKNOWN: {
         // On some file systems the entry type is not determined by
         // readdir_r. For those and for links we use stat to determine
diff --git a/runtime/bin/directory_patch.dart b/runtime/bin/directory_patch.dart
index 8249bbd..7549f72 100644
--- a/runtime/bin/directory_patch.dart
+++ b/runtime/bin/directory_patch.dart
@@ -67,5 +67,5 @@
   return new Uri.directory(result);
 }
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 _getUriBaseClosure() => _uriBaseClosure;
diff --git a/runtime/bin/entrypoints_verification_test_extension.cc b/runtime/bin/entrypoints_verification_test_extension.cc
index e070996..5088e75 100644
--- a/runtime/bin/entrypoints_verification_test_extension.cc
+++ b/runtime/bin/entrypoints_verification_test_extension.cc
@@ -16,25 +16,14 @@
     abort();                                                                   \
   }
 
-Dart_Handle GetCurrentLibrary() {
-  Dart_Handle libraries = Dart_GetLoadedLibraries();
-  CHECK(libraries);
-  intptr_t length = 0;
-  CHECK(Dart_ListLength(libraries, &length));
-  for (intptr_t i = 0; i < length; ++i) {
-    Dart_Handle library = Dart_ListGetAt(libraries, i);
-    CHECK(library);
-    Dart_Handle url = Dart_LibraryUrl(library);
-    CHECK(url);
-    const char* url_str;
-    CHECK(Dart_StringToCString(url, &url_str));
-    if (strstr(url_str, "entrypoints_verification_test")) {
-      return library;
-    }
+bool isDartPrecompiledRuntime = true;
+
+// Some invalid accesses are allowed in AOT since we don't retain @pragma
+// annotations. Therefore we skip the negative tests in AOT.
+#define FAIL(name, result)                                                     \
+  if (!isDartPrecompiledRuntime) {                                             \
+    Fail(name, result);                                                        \
   }
-  fprintf(stderr, "Could not find current library!");
-  abort();
-}
 
 void Fail(const char* name, Dart_Handle result) {
   ASSERT(Dart_IsApiError(result));
@@ -43,52 +32,67 @@
   ASSERT(strstr(error, "It is illegal to access"));
 }
 
-void FailClosurize(const char* name, Dart_Handle result) {
+#define FAIL_INVOKE_FIELD(name, result)                                        \
+  if (!isDartPrecompiledRuntime) {                                             \
+    FailInvokeField(name, result);                                             \
+  }
+
+void FailInvokeField(const char* name, Dart_Handle result) {
   ASSERT(Dart_IsApiError(result));
   const char* error = Dart_GetError(result);
   ASSERT(strstr(error, name));
-  ASSERT(strstr(error, "Entry-points do not allow closurizing methods"));
+  ASSERT(strstr(error, "Entry-points do not allow invoking fields"));
+}
+
+void FailClosurizeConstructor(const char* name, Dart_Handle result) {
+  ASSERT(Dart_IsUnhandledExceptionError(result));
+  const char* error = Dart_GetError(result);
+  ASSERT(strstr(error, name));
+  ASSERT(strstr(error, "No static getter"));
 }
 
 void TestFields(Dart_Handle target) {
-  Fail("fld0", Dart_GetField(target, Dart_NewStringFromCString("fld0")));
-  Fail("fld0",
+  FAIL("fld0", Dart_GetField(target, Dart_NewStringFromCString("fld0")));
+  FAIL("fld0",
        Dart_SetField(target, Dart_NewStringFromCString("fld0"), Dart_Null()));
 
-  Dart_Handle result =
-      Dart_Invoke(target, Dart_NewStringFromCString("fld0"), 0, nullptr);
-  FailClosurize("fld0", result);
+  FAIL_INVOKE_FIELD(
+      "fld0",
+      Dart_Invoke(target, Dart_NewStringFromCString("fld0"), 0, nullptr));
 
   CHECK(Dart_GetField(target, Dart_NewStringFromCString("fld1")));
   CHECK(Dart_SetField(target, Dart_NewStringFromCString("fld1"), Dart_Null()));
-  FailClosurize("fld1", Dart_Invoke(target, Dart_NewStringFromCString("fld1"),
-                                    0, nullptr));
+  FAIL_INVOKE_FIELD(
+      "fld1",
+      Dart_Invoke(target, Dart_NewStringFromCString("fld1"), 0, nullptr));
 
   CHECK(Dart_GetField(target, Dart_NewStringFromCString("fld2")));
-  Fail("fld2",
+  FAIL("fld2",
        Dart_SetField(target, Dart_NewStringFromCString("fld2"), Dart_Null()));
-  FailClosurize("fld2", Dart_Invoke(target, Dart_NewStringFromCString("fld2"),
-                                    0, nullptr));
+  FAIL_INVOKE_FIELD(
+      "fld2",
+      Dart_Invoke(target, Dart_NewStringFromCString("fld2"), 0, nullptr));
 
-  Fail("fld3", Dart_GetField(target, Dart_NewStringFromCString("fld3")));
+  FAIL("fld3", Dart_GetField(target, Dart_NewStringFromCString("fld3")));
   CHECK(Dart_SetField(target, Dart_NewStringFromCString("fld3"), Dart_Null()));
-  FailClosurize("fld3", Dart_Invoke(target, Dart_NewStringFromCString("fld3"),
-                                    0, nullptr));
+  FAIL_INVOKE_FIELD(
+      "fld3",
+      Dart_Invoke(target, Dart_NewStringFromCString("fld3"), 0, nullptr));
 }
 
 void RunTests(Dart_NativeArguments arguments) {
-  Dart_Handle lib = GetCurrentLibrary();
+  Dart_Handle lib = Dart_RootLibrary();
 
   //////// Test allocation and constructor invocation.
 
-  Fail("C", Dart_GetClass(lib, Dart_NewStringFromCString("C")));
+  FAIL("C", Dart_GetClass(lib, Dart_NewStringFromCString("C")));
 
   Dart_Handle D_class = Dart_GetClass(lib, Dart_NewStringFromCString("D"));
   CHECK(D_class);
 
   CHECK(Dart_Allocate(D_class));
 
-  Fail("D.", Dart_New(D_class, Dart_Null(), 0, nullptr));
+  FAIL("D.", Dart_New(D_class, Dart_Null(), 0, nullptr));
 
   CHECK(Dart_New(D_class, Dart_NewStringFromCString("defined"), 0, nullptr));
   Dart_Handle D =
@@ -97,32 +101,51 @@
 
   //////// Test actions against methods
 
-  Fail("fn0", Dart_Invoke(D, Dart_NewStringFromCString("fn0"), 0, nullptr));
+  FailClosurizeConstructor(
+      "defined", Dart_GetField(D_class, Dart_NewStringFromCString("defined")));
+  FailClosurizeConstructor(
+      "fact", Dart_GetField(D_class, Dart_NewStringFromCString("fact")));
+
+  FAIL("fn0", Dart_Invoke(D, Dart_NewStringFromCString("fn0"), 0, nullptr));
 
   CHECK(Dart_Invoke(D, Dart_NewStringFromCString("fn1"), 0, nullptr));
+  FAIL("fn1", Dart_Invoke(D, Dart_NewStringFromCString("fn1_get"), 0, nullptr));
+  CHECK(Dart_Invoke(D, Dart_NewStringFromCString("fn1_call"), 0, nullptr));
 
-  Fail("get_fn0", Dart_GetField(D, Dart_NewStringFromCString("fn0")));
+  FAIL("fn0", Dart_GetField(D, Dart_NewStringFromCString("fn0")));
 
-  Fail("get_fn1", Dart_GetField(D, Dart_NewStringFromCString("fn1")));
+  CHECK(Dart_GetField(D, Dart_NewStringFromCString("fn1")));
+  CHECK(Dart_GetField(D, Dart_NewStringFromCString("fn1_get")));
+  FAIL("fn1", Dart_GetField(D, Dart_NewStringFromCString("fn1_call")));
 
-  Fail("fn2",
+  FAIL("fn2",
        Dart_Invoke(D_class, Dart_NewStringFromCString("fn2"), 0, nullptr));
 
   CHECK(Dart_Invoke(D_class, Dart_NewStringFromCString("fn3"), 0, nullptr));
+  CHECK(
+      Dart_Invoke(D_class, Dart_NewStringFromCString("fn3_call"), 0, nullptr));
+  FAIL("fn3",
+       Dart_Invoke(D_class, Dart_NewStringFromCString("fn3_get"), 0, nullptr));
 
-  FailClosurize("fn2",
-                Dart_GetField(D_class, Dart_NewStringFromCString("fn2")));
+  FAIL("fn2", Dart_GetField(D_class, Dart_NewStringFromCString("fn2")));
 
-  FailClosurize("fn3",
-                Dart_GetField(D_class, Dart_NewStringFromCString("fn3")));
+  CHECK(Dart_GetField(D_class, Dart_NewStringFromCString("fn3")));
+  FAIL("fn3_call",
+       Dart_GetField(D_class, Dart_NewStringFromCString("fn3_call")));
+  CHECK(Dart_GetField(D_class, Dart_NewStringFromCString("fn3_get")));
 
-  Fail("fn0", Dart_Invoke(lib, Dart_NewStringFromCString("fn0"), 0, nullptr));
+  FAIL("fn0", Dart_Invoke(lib, Dart_NewStringFromCString("fn0"), 0, nullptr));
 
   CHECK(Dart_Invoke(lib, Dart_NewStringFromCString("fn1"), 0, nullptr));
+  FAIL("fn1",
+       Dart_Invoke(lib, Dart_NewStringFromCString("fn1_get"), 0, nullptr));
+  CHECK(Dart_Invoke(lib, Dart_NewStringFromCString("fn1_call"), 0, nullptr));
 
-  FailClosurize("fn0", Dart_GetField(lib, Dart_NewStringFromCString("fn0")));
+  FAIL("fn0", Dart_GetField(lib, Dart_NewStringFromCString("fn0")));
 
-  FailClosurize("fn1", Dart_GetField(lib, Dart_NewStringFromCString("fn1")));
+  CHECK(Dart_GetField(lib, Dart_NewStringFromCString("fn1")));
+  CHECK(Dart_GetField(lib, Dart_NewStringFromCString("fn1_get")));
+  FAIL("fn1", Dart_GetField(lib, Dart_NewStringFromCString("fn1_call")));
 
   //////// Test actions against fields
 
@@ -146,6 +169,8 @@
 
 DART_EXPORT Dart_Handle
 entrypoints_verification_test_extension_Init(Dart_Handle parent_library) {
+  isDartPrecompiledRuntime = Dart_IsPrecompiledRuntime();
+
   if (Dart_IsError(parent_library)) {
     return parent_library;
   }
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index a6bd764..4fe2832 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -120,9 +120,9 @@
 
 EventHandlerImplementation::~EventHandlerImplementation() {
   socket_map_.Clear(DeleteDescriptorInfo);
-  VOID_TEMP_FAILURE_RETRY(close(epoll_fd_));
-  VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[0]));
-  VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[1]));
+  close(epoll_fd_);
+  close(interrupt_fds_[0]);
+  close(interrupt_fds_[1]);
 }
 
 void EventHandlerImplementation::UpdateEpollInstance(intptr_t old_mask,
@@ -401,8 +401,9 @@
 }
 
 void EventHandlerImplementation::Start(EventHandler* handler) {
-  int result = Thread::Start(&EventHandlerImplementation::Poll,
-                             reinterpret_cast<uword>(handler));
+  int result =
+      Thread::Start("dart:io EventHandler", &EventHandlerImplementation::Poll,
+                    reinterpret_cast<uword>(handler));
   if (result != 0) {
     FATAL1("Failed to start event handler thread %d", result);
   }
diff --git a/runtime/bin/eventhandler_android.h b/runtime/bin/eventhandler_android.h
index 0cfd543..d8cceca 100644
--- a/runtime/bin/eventhandler_android.h
+++ b/runtime/bin/eventhandler_android.h
@@ -30,7 +30,7 @@
   intptr_t GetPollEvents();
 
   virtual void Close() {
-    VOID_TEMP_FAILURE_RETRY(close(fd_));
+    close(fd_);
     fd_ = -1;
   }
 
diff --git a/runtime/bin/eventhandler_fuchsia.cc b/runtime/bin/eventhandler_fuchsia.cc
index a74f0c2..1b4769b 100644
--- a/runtime/bin/eventhandler_fuchsia.cc
+++ b/runtime/bin/eventhandler_fuchsia.cc
@@ -553,8 +553,9 @@
 }
 
 void EventHandlerImplementation::Start(EventHandler* handler) {
-  int result = Thread::Start(&EventHandlerImplementation::Poll,
-                             reinterpret_cast<uword>(handler));
+  int result =
+      Thread::Start("dart:io EventHandler", &EventHandlerImplementation::Poll,
+                    reinterpret_cast<uword>(handler));
   if (result != 0) {
     FATAL1("Failed to start event handler thread %d", result);
   }
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index d02a49e..142f0b1 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -127,10 +127,10 @@
 
 EventHandlerImplementation::~EventHandlerImplementation() {
   socket_map_.Clear(DeleteDescriptorInfo);
-  VOID_TEMP_FAILURE_RETRY(close(epoll_fd_));
-  VOID_TEMP_FAILURE_RETRY(close(timer_fd_));
-  VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[0]));
-  VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[1]));
+  close(epoll_fd_);
+  close(timer_fd_);
+  close(interrupt_fds_[0]);
+  close(interrupt_fds_[1]);
 }
 
 void EventHandlerImplementation::UpdateEpollInstance(intptr_t old_mask,
@@ -405,8 +405,9 @@
 }
 
 void EventHandlerImplementation::Start(EventHandler* handler) {
-  int result = Thread::Start(&EventHandlerImplementation::Poll,
-                             reinterpret_cast<uword>(handler));
+  int result =
+      Thread::Start("dart:io EventHandler", &EventHandlerImplementation::Poll,
+                    reinterpret_cast<uword>(handler));
   if (result != 0) {
     FATAL1("Failed to start event handler thread %d", result);
   }
diff --git a/runtime/bin/eventhandler_linux.h b/runtime/bin/eventhandler_linux.h
index ac468dc..31cb3ec 100644
--- a/runtime/bin/eventhandler_linux.h
+++ b/runtime/bin/eventhandler_linux.h
@@ -29,7 +29,7 @@
   intptr_t GetPollEvents();
 
   virtual void Close() {
-    VOID_TEMP_FAILURE_RETRY(close(fd_));
+    close(fd_);
     fd_ = -1;
   }
 
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index 04abaac..e3d5a9a 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -137,9 +137,9 @@
 
 EventHandlerImplementation::~EventHandlerImplementation() {
   socket_map_.Clear(DeleteDescriptorInfo);
-  VOID_TEMP_FAILURE_RETRY(close(kqueue_fd_));
-  VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[0]));
-  VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[1]));
+  close(kqueue_fd_);
+  close(interrupt_fds_[0]);
+  close(interrupt_fds_[1]);
 }
 
 void EventHandlerImplementation::UpdateKQueueInstance(intptr_t old_mask,
@@ -464,7 +464,8 @@
 }
 
 void EventHandlerImplementation::Start(EventHandler* handler) {
-  int result = Thread::Start(&EventHandlerImplementation::EventHandlerEntry,
+  int result = Thread::Start("dart:io EventHandler",
+                             &EventHandlerImplementation::EventHandlerEntry,
                              reinterpret_cast<uword>(handler));
   if (result != 0) {
     FATAL1("Failed to start event handler thread %d", result);
diff --git a/runtime/bin/eventhandler_macos.h b/runtime/bin/eventhandler_macos.h
index 7550fce..a7684f2 100644
--- a/runtime/bin/eventhandler_macos.h
+++ b/runtime/bin/eventhandler_macos.h
@@ -30,7 +30,7 @@
   intptr_t GetPollEvents();
 
   virtual void Close() {
-    VOID_TEMP_FAILURE_RETRY(close(fd_));
+    close(fd_);
     fd_ = -1;
   }
 
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index 7b73b7e..e328f72 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -301,7 +301,8 @@
     // Completing asynchronously through thread.
     pending_read_ = buffer;
     read_thread_starting_ = true;
-    int result = Thread::Start(ReadFileThread, reinterpret_cast<uword>(this));
+    int result = Thread::Start("dart:io ReadFile", ReadFileThread,
+                               reinterpret_cast<uword>(this));
     if (result != 0) {
       FATAL1("Failed to start read file thread %d", result);
     }
@@ -781,7 +782,8 @@
     // the events it puts on the IO completion port. The reference is
     // Released by DeleteIfClosed.
     Retain();
-    int result = Thread::Start(WriteFileThread, reinterpret_cast<uword>(this));
+    int result = Thread::Start("dart:io WriteFile", WriteFileThread,
+                               reinterpret_cast<uword>(this));
     if (result != 0) {
       FATAL1("Failed to start write file thread %d", result);
     }
@@ -1460,8 +1462,8 @@
 }
 
 void EventHandlerImplementation::Start(EventHandler* handler) {
-  int result =
-      Thread::Start(EventHandlerEntry, reinterpret_cast<uword>(handler));
+  int result = Thread::Start("dart:io EventHandler", EventHandlerEntry,
+                             reinterpret_cast<uword>(handler));
   if (result != 0) {
     FATAL1("Failed to start event handler thread %d", result);
   }
diff --git a/runtime/bin/fdutils_android.cc b/runtime/bin/fdutils_android.cc
index 86e501b..de1fb6b 100644
--- a/runtime/bin/fdutils_android.cc
+++ b/runtime/bin/fdutils_android.cc
@@ -132,7 +132,7 @@
 
 void FDUtils::SaveErrorAndClose(intptr_t fd) {
   int err = errno;
-  VOID_TEMP_FAILURE_RETRY(close(fd));
+  close(fd);
   errno = err;
 }
 
diff --git a/runtime/bin/fdutils_linux.cc b/runtime/bin/fdutils_linux.cc
index 2cc20c5..1caa786 100644
--- a/runtime/bin/fdutils_linux.cc
+++ b/runtime/bin/fdutils_linux.cc
@@ -132,7 +132,7 @@
 
 void FDUtils::SaveErrorAndClose(intptr_t fd) {
   int err = errno;
-  VOID_TEMP_FAILURE_RETRY(close(fd));
+  close(fd);
   errno = err;
 }
 
diff --git a/runtime/bin/fdutils_macos.cc b/runtime/bin/fdutils_macos.cc
index e691506..341e85f 100644
--- a/runtime/bin/fdutils_macos.cc
+++ b/runtime/bin/fdutils_macos.cc
@@ -132,7 +132,7 @@
 
 void FDUtils::SaveErrorAndClose(intptr_t fd) {
   int err = errno;
-  VOID_TEMP_FAILURE_RETRY(close(fd));
+  close(fd);
   errno = err;
 }
 
diff --git a/runtime/bin/ffi_test_functions.cc b/runtime/bin/ffi_test_functions.cc
index 0248829..5d95e49 100644
--- a/runtime/bin/ffi_test_functions.cc
+++ b/runtime/bin/ffi_test_functions.cc
@@ -4,8 +4,15 @@
 
 // This file contains test functions for the dart:ffi test cases.
 
+// The tests which use this don't run on Windows yet.
+#if !defined(_WIN32)
+
 #include <stddef.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
 #include <iostream>
+#include <limits>
 
 #include "include/dart_api.h"
 
@@ -365,4 +372,48 @@
   return retval;
 }
 
+// Does nothing with input.
+// Used for testing functions that return void
+DART_EXPORT void DevNullFloat(float a) {
+  std::cout << "DevNullFloat(" << a << ")\n";
+  std::cout << "returning nothing\n";
+}
+
+// Invents an elite floating point number.
+// Used for testing functions that do not take any arguments.
+DART_EXPORT float InventFloatValue() {
+  std::cout << "InventFloatValue()\n";
+  float retval = 1337.0f;
+  std::cout << "returning " << retval << "\n";
+  return retval;
+}
+
+// Functions for stress-testing GC by returning values that require boxing.
+
+DART_EXPORT int64_t MinInt64() {
+  return 0x8000000000000000;
+}
+
+DART_EXPORT int64_t MinInt32() {
+  return 0x80000000;
+}
+
+DART_EXPORT double SmallDouble() {
+  return 0x80000000 * -1.0;
+}
+
+DART_EXPORT void* SmallPointer() {
+  return reinterpret_cast<void*>(-0x80000000L);
+}
+
+DART_EXPORT int RedirectStderr() {
+  char filename[256];
+  snprintf(filename, sizeof(filename), "/tmp/captured_stderr_%d", getpid());
+  freopen(filename, "w", stderr);
+  printf("Got file %s\n", filename);
+  return getpid();
+}
+
 }  // namespace dart
+
+#endif
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 918565a..0ef2414 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -56,9 +56,9 @@
     int null_fd = TEMP_FAILURE_RETRY(open("/dev/null", O_WRONLY));
     ASSERT(null_fd >= 0);
     VOID_TEMP_FAILURE_RETRY(dup2(null_fd, handle_->fd()));
-    VOID_TEMP_FAILURE_RETRY(close(null_fd));
+    close(null_fd);
   } else {
-    int err = TEMP_FAILURE_RETRY(close(handle_->fd()));
+    int err = close(handle_->fd());
     if (err != 0) {
       const int kBufferSize = 1024;
       char error_buf[kBufferSize];
@@ -402,7 +402,7 @@
       openat(newns.fd(), newns.path(), O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC,
              st.st_mode));
   if (new_fd < 0) {
-    VOID_TEMP_FAILURE_RETRY(close(old_fd));
+    close(old_fd);
     return false;
   }
   off_t offset = 0;
@@ -427,8 +427,8 @@
     }
   }
   int e = errno;
-  VOID_TEMP_FAILURE_RETRY(close(old_fd));
-  VOID_TEMP_FAILURE_RETRY(close(new_fd));
+  close(old_fd);
+  close(new_fd);
   if (result < 0) {
     VOID_NO_RETRY_EXPECTED(unlinkat(newns.fd(), newns.path(), 0));
     errno = e;
diff --git a/runtime/bin/file_fuchsia.cc b/runtime/bin/file_fuchsia.cc
index 40aaf7d..9ee69ea 100644
--- a/runtime/bin/file_fuchsia.cc
+++ b/runtime/bin/file_fuchsia.cc
@@ -395,7 +395,7 @@
       openat(newns.fd(), newns.path(),
              O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, st.st_mode));
   if (new_fd < 0) {
-    VOID_TEMP_FAILURE_RETRY(close(old_fd));
+    close(old_fd);
     return false;
   }
   // TODO(ZX-429): Use sendfile/copyfile or equivalent when there is one.
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index ee59efe..3346d64 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -55,9 +55,9 @@
     int null_fd = TEMP_FAILURE_RETRY(open("/dev/null", O_WRONLY));
     ASSERT(null_fd >= 0);
     VOID_TEMP_FAILURE_RETRY(dup2(null_fd, handle_->fd()));
-    VOID_TEMP_FAILURE_RETRY(close(null_fd));
+    close(null_fd);
   } else {
-    int err = TEMP_FAILURE_RETRY(close(handle_->fd()));
+    int err = close(handle_->fd());
     if (err != 0) {
       const int kBufferSize = 1024;
       char error_buf[kBufferSize];
@@ -396,7 +396,7 @@
       openat64(newns.fd(), newns.path(),
                O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, st.st_mode));
   if (new_fd < 0) {
-    VOID_TEMP_FAILURE_RETRY(close(old_fd));
+    close(old_fd);
     return false;
   }
   int64_t offset = 0;
@@ -421,8 +421,8 @@
     }
   }
   int e = errno;
-  VOID_TEMP_FAILURE_RETRY(close(old_fd));
-  VOID_TEMP_FAILURE_RETRY(close(new_fd));
+  close(old_fd);
+  close(new_fd);
   if (result < 0) {
     VOID_NO_RETRY_EXPECTED(unlinkat(newns.fd(), newns.path(), 0));
     errno = e;
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 244838f..3320491 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -55,9 +55,9 @@
     intptr_t null_fd = TEMP_FAILURE_RETRY(open("/dev/null", O_WRONLY));
     ASSERT(null_fd >= 0);
     VOID_TEMP_FAILURE_RETRY(dup2(null_fd, handle_->fd()));
-    VOID_TEMP_FAILURE_RETRY(close(null_fd));
+    close(null_fd);
   } else {
-    intptr_t err = TEMP_FAILURE_RETRY(close(handle_->fd()));
+    intptr_t err = close(handle_->fd());
     if (err != 0) {
       const int kBufferSize = 1024;
       char error_message[kBufferSize];
diff --git a/runtime/bin/file_patch.dart b/runtime/bin/file_patch.dart
index a9b3637..338a260 100644
--- a/runtime/bin/file_patch.dart
+++ b/runtime/bin/file_patch.dart
@@ -415,7 +415,7 @@
   }
 }
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 Uint8List _makeUint8ListView(Uint8List source, int offsetInBytes, int length) {
   return new Uint8List.view(source.buffer, offsetInBytes, length);
 }
diff --git a/runtime/bin/file_system_watcher_macos.cc b/runtime/bin/file_system_watcher_macos.cc
index 53ca879..770ed06 100644
--- a/runtime/bin/file_system_watcher_macos.cc
+++ b/runtime/bin/file_system_watcher_macos.cc
@@ -75,7 +75,7 @@
 
     ~Node() {
       Stop();
-      VOID_TEMP_FAILURE_RETRY(close(write_fd_));
+      close(write_fd_);
       CFRelease(path_ref_);
     }
 
@@ -178,7 +178,7 @@
   FSEventsWatcher() : run_loop_(0) { Start(); }
 
   void Start() {
-    Thread::Start(Run, reinterpret_cast<uword>(this));
+    Thread::Start("dart:io FileWatcher", Run, reinterpret_cast<uword>(this));
     monitor_.Enter();
     while (run_loop_ == NULL) {
       monitor_.Wait(Monitor::kNoTimeout);
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index c0656b7..8dfc9202 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -15,7 +15,6 @@
 #include "bin/builtin.h"
 #include "bin/console.h"
 #include "bin/dartutils.h"
-#include "bin/dfe.h"
 #include "bin/eventhandler.h"
 #include "bin/file.h"
 #include "bin/loader.h"
@@ -60,6 +59,15 @@
     exit(exit_code);                                                           \
   }
 
+// The environment provided through the command line using -D options.
+static dart::SimpleHashMap* environment = NULL;
+
+static bool ProcessEnvironmentOption(const char* arg,
+                                     CommandLineOptions* vm_options) {
+  return OptionProcessor::ProcessEnvironmentOption(arg, vm_options,
+                                                   &environment);
+}
+
 // The core snapshot to use when creating isolates. Normally NULL, but loaded
 // from a file when creating AppJIT snapshots.
 const uint8_t* isolate_snapshot_data = NULL;
@@ -79,20 +87,6 @@
 };
 static SnapshotKind snapshot_kind = kCore;
 
-// Global state which contains a pointer to the script name for which
-// a snapshot needs to be created (NULL would result in the creation
-// of a generic snapshot that contains only the corelibs).
-static char* app_script_name = NULL;
-
-// The environment provided through the command line using -D options.
-static dart::SimpleHashMap* environment = NULL;
-
-static bool ProcessEnvironmentOption(const char* arg,
-                                     CommandLineOptions* vm_options) {
-  return OptionProcessor::ProcessEnvironmentOption(arg, vm_options,
-                                                   &environment);
-}
-
 // The ordering of this list must match the SnapshotKind enum above.
 static const char* kSnapshotKindNames[] = {
     // clang-format off
@@ -102,7 +96,8 @@
     "app-jit",
     "app-aot-blobs",
     "app-aot-assembly",
-    "vm-aot-assembly", NULL,
+    "vm-aot-assembly",
+    NULL,
     // clang-format on
 };
 
@@ -122,11 +117,8 @@
   V(reused_instructions, reused_instructions_filename)                         \
   V(blobs_container_filename, blobs_container_filename)                        \
   V(assembly, assembly_filename)                                               \
-  V(dependencies, dependencies_filename)                                       \
   V(load_compilation_trace, load_compilation_trace_filename)                   \
   V(load_type_feedback, load_type_feedback_filename)                           \
-  V(package_root, commandline_package_root)                                    \
-  V(packages, commandline_packages_file)                                       \
   V(save_obfuscation_map, obfuscation_map_filename)
 
 #define BOOL_OPTIONS_LIST(V)                                                   \
@@ -164,13 +156,6 @@
 "Usage: gen_snapshot [<vm-flags>] [<options>] <dart-kernel-file>             \n"
 "                                                                            \n"
 "Common options:                                                             \n"
-"--package_root=<path>                                                       \n"
-"  Where to find packages, that is, package:...  imports.                    \n"
-"--packages=<packages_file>                                                  \n"
-"  Where to find a package spec file                                         \n"
-"--dependencies=<output-file>                                                \n"
-"  Generates a Makefile with snapshot output files as targets and all        \n"
-"  transitive imports as sources.                                            \n"
 "--help                                                                      \n"
 "  Display this message (add --verbose for information about all VM options).\n"
 "--version                                                                   \n"
@@ -180,15 +165,7 @@
 "--snapshot_kind=core                                                        \n"
 "--vm_snapshot_data=<output-file>                                            \n"
 "--isolate_snapshot_data=<output-file>                                       \n"
-"[<dart-kernel-file>]                                                        \n"
-"                                                                            \n"
-"Writes a snapshot of <dart-kernel-file> to the specified snapshot files.    \n"
-"If no <dart-kernel-file> is passed, a generic snapshot of all the corelibs  \n"
-"is created.                                                                 \n"
-"                                                                            \n"
-"Writes a snapshot of <dart-kernel-file> to the specified snapshot files.    \n"
-"If no <dart-kernel-file> is passed, a generic snapshot of all the corelibs  \n"
-"is created.                                                                 \n"
+"<dart-kernel-file>                                                          \n"
 "                                                                            \n"
 "To create an AOT application snapshot as blobs suitable for loading with    \n"
 "mmap:                                                                       \n"
@@ -199,7 +176,7 @@
 "--isolate_snapshot_instructions=<output-file>                               \n"
 "[--obfuscate]                                                               \n"
 "[--save-obfuscation-map=<map-filename>]                                     \n"
-" <dart-kernel-file>                                                         \n"
+"<dart-kernel-file>                                                          \n"
 "                                                                            \n"
 "To create an AOT application snapshot as assembly suitable for compilation  \n"
 "as a static or dynamic library:                                             \n"
@@ -232,7 +209,7 @@
 static int ParseArguments(int argc,
                           char** argv,
                           CommandLineOptions* vm_options,
-                          char** script_name) {
+                          CommandLineOptions* inputs) {
   const char* kPrefix = "-";
   const intptr_t kPrefixLen = strlen(kPrefix);
 
@@ -250,12 +227,10 @@
     i += 1;
   }
 
-  // Get the script name.
-  if (i < argc) {
-    *script_name = argv[i];
-    i += 1;
-  } else {
-    *script_name = NULL;
+  // Parse out the kernel inputs.
+  while (i < argc) {
+    inputs->AddArgument(argv[i]);
+    i++;
   }
 
   if (help) {
@@ -267,11 +242,8 @@
   }
 
   // Verify consistency of arguments.
-  if ((commandline_package_root != NULL) &&
-      (commandline_packages_file != NULL)) {
-    Log::PrintErr(
-        "Specifying both a packages directory and a packages "
-        "file is invalid.\n\n");
+  if (inputs->count() < 1) {
+    Log::PrintErr("At least one input is required\n");
     return -1;
   }
 
@@ -316,12 +288,6 @@
       break;
     }
     case kAppAOTBlobs: {
-      if (*script_name == NULL) {
-        Log::PrintErr(
-            "Building an AOT snapshot as blobs requires specifying "
-            " a kernel file.\n\n");
-        return -1;
-      }
       if ((blobs_container_filename == NULL) &&
           ((vm_snapshot_data_filename == NULL) ||
            (vm_snapshot_instructions_filename == NULL) ||
@@ -350,19 +316,19 @@
       break;
     }
     case kAppAOTAssembly: {
-      if ((assembly_filename == NULL) || (*script_name == NULL)) {
+      if (assembly_filename == NULL) {
         Log::PrintErr(
             "Building an AOT snapshot as assembly requires specifying "
-            "an output file for --assembly and a kernel file.\n\n");
+            "an output file for --assembly.\n\n");
         return -1;
       }
       break;
     }
     case kVMAOTAssembly: {
-      if ((assembly_filename == NULL) || (*script_name == NULL)) {
+      if (assembly_filename == NULL) {
         Log::PrintErr(
             "Building an AOT snapshot as assembly requires specifying "
-            "an output file for --assembly and a kernel file.\n\n");
+            "an output file for --assembly.\n\n");
         return -1;
       }
       break;
@@ -428,124 +394,14 @@
   }
 }
 
-// Generates a depfile like gcc -M -MF. Must be consumable by Ninja.
-class DependenciesFileWriter : public ValueObject {
- public:
-  DependenciesFileWriter() : dependencies_(NULL), file_(NULL), success_(true) {}
-
-  void WriteDependencies(MallocGrowableArray<char*>* dependencies) {
-    dependencies_ = dependencies;
-
-    file_ = File::Open(NULL, dependencies_filename, File::kWriteTruncate);
-    if (file_ == NULL) {
-      Log::PrintErr("Error: Unable to open dependencies file: %s\n\n",
-                    dependencies_filename);
-      exit(kErrorExitCode);
-    }
-    RefCntReleaseScope<File> rs(file_);
-
-    // Write dependencies for one of the output files.
-    // TODO(https://github.com/ninja-build/ninja/issues/1184): Do this for all
-    // output files.
-    switch (snapshot_kind) {
-      case kCore:
-        WriteDependenciesWithTarget(vm_snapshot_data_filename);
-        // WriteDependenciesWithTarget(isolate_snapshot_data_filename);
-        break;
-      case kAppAOTAssembly:
-        WriteDependenciesWithTarget(assembly_filename);
-        break;
-      case kApp:
-      case kAppJIT:
-        WriteDependenciesWithTarget(isolate_snapshot_data_filename);
-        // WriteDependenciesWithTarget(isolate_snapshot_instructions_filename);
-        break;
-      case kCoreJIT:
-        WriteDependenciesWithTarget(vm_snapshot_data_filename);
-        // WriteDependenciesWithTarget(vm_snapshot_instructions_filename);
-        // WriteDependenciesWithTarget(isolate_snapshot_data_filename);
-        // WriteDependenciesWithTarget(isolate_snapshot_instructions_filename);
-        break;
-      case kAppAOTBlobs:
-        if (blobs_container_filename != NULL) {
-          WriteDependenciesWithTarget(blobs_container_filename);
-        } else {
-          WriteDependenciesWithTarget(vm_snapshot_data_filename);
-          // WriteDependenciesWithTarget(vm_snapshot_instructions_filename);
-          // WriteDependenciesWithTarget(isolate_snapshot_data_filename);
-          // WriteDependenciesWithTarget(isolate_snapshot_instructions_filename);
-        }
-        break;
-      default:
-        UNREACHABLE();
-    }
-
-    if (!success_) {
-      Log::PrintErr("Error: Unable to write dependencies file: %s\n\n",
-                    dependencies_filename);
-      exit(kErrorExitCode);
-    }
+static void MaybeLoadExtraInputs(const CommandLineOptions& inputs) {
+  for (intptr_t i = 1; i < inputs.count(); i++) {
+    uint8_t* buffer = NULL;
+    intptr_t size = 0;
+    ReadFile(inputs.GetArgument(i), &buffer, &size);
+    Dart_Handle result = Dart_LoadLibraryFromKernel(buffer, size);
+    CHECK_RESULT(result);
   }
-
- private:
-  void WriteDependenciesWithTarget(const char* target) {
-    WritePath(target);
-    Write(": ");
-
-    for (intptr_t i = 0; i < dependencies_->length(); i++) {
-      WritePath(dependencies_->At(i));
-    }
-
-    Write("\n");
-  }
-
-  char* EscapePath(const char* path) {
-    char* escaped_path = reinterpret_cast<char*>(malloc(strlen(path) * 2 + 1));
-    const char* read_cursor = path;
-    char* write_cursor = escaped_path;
-    while (*read_cursor != '\0') {
-      if ((*read_cursor == ' ') || (*read_cursor == '\\')) {
-        *write_cursor++ = '\\';
-      }
-      *write_cursor++ = *read_cursor++;
-    }
-    *write_cursor = '\0';
-    return escaped_path;
-  }
-
-  void WritePath(const char* path) {
-    char* escaped_path = EscapePath(path);
-    success_ &= file_->Print("%s ", escaped_path);
-    free(escaped_path);
-  }
-
-  void Write(const char* string) { success_ &= file_->Print("%s", string); }
-
-  MallocGrowableArray<char*>* dependencies_;
-  File* file_;
-  bool success_;
-};
-
-static void CreateAndWriteDependenciesFile() {
-  IsolateData* isolate_data =
-      reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
-  MallocGrowableArray<char*>* dependencies = isolate_data->dependencies();
-  if (dependencies == NULL) {
-    return;
-  }
-
-  Loader::ResolveDependenciesAsFilePaths();
-
-  ASSERT(dependencies_filename != NULL);
-  if (dependencies_filename != NULL) {
-    DependenciesFileWriter writer;
-    writer.WriteDependencies(dependencies);
-  }
-
-  for (intptr_t i = 0; i < dependencies->length(); i++) {
-    free(dependencies->At(i));
-  }
-  dependencies->Clear();
 }
 
 static void MaybeLoadCode() {
@@ -845,24 +701,21 @@
     {NULL, NULL, NULL}  // Must be terminated with NULL entries.
 };
 
-static int GenerateSnapshotFromKernel(const uint8_t* kernel_buffer,
-                                      intptr_t kernel_buffer_size) {
-  char* error = NULL;
-  IsolateData* isolate_data = new IsolateData(NULL, commandline_package_root,
-                                              commandline_packages_file, NULL);
-  if (dependencies_filename != NULL) {
-    isolate_data->set_dependencies(new MallocGrowableArray<char*>());
-  }
+static int CreateIsolateAndSnapshot(const CommandLineOptions& inputs) {
+  uint8_t* kernel_buffer = NULL;
+  intptr_t kernel_buffer_size = NULL;
+  ReadFile(inputs.GetArgument(0), &kernel_buffer, &kernel_buffer_size);
 
   Dart_IsolateFlags isolate_flags;
   Dart_IsolateFlagsInitialize(&isolate_flags);
-
   if (IsSnapshottingForPrecompilation()) {
     isolate_flags.obfuscate = obfuscate;
     isolate_flags.entry_points = no_entry_points;
   }
 
+  IsolateData* isolate_data = new IsolateData(NULL, NULL, NULL, NULL);
   Dart_Isolate isolate;
+  char* error = NULL;
   if (isolate_snapshot_data == NULL) {
     // We need to capture the vmservice library in the core snapshot, so load it
     // in the main isolate as well.
@@ -905,23 +758,11 @@
       Dart_LoadLibraryFromKernel(kernel_buffer, kernel_buffer_size));
   CHECK_RESULT(result);
 
+  MaybeLoadExtraInputs(inputs);
+
   MaybeLoadCode();
 
   switch (snapshot_kind) {
-    case kAppAOTBlobs:
-    case kAppAOTAssembly: {
-      if (Dart_IsNull(Dart_RootLibrary())) {
-        Log::PrintErr(
-            "Unable to load root library from the input dill file.\n");
-        return kErrorExitCode;
-      }
-
-      CreateAndWritePrecompiledSnapshot();
-
-      CreateAndWriteDependenciesFile();
-
-      break;
-    }
     case kCore:
       CreateAndWriteCoreSnapshot();
       break;
@@ -934,6 +775,10 @@
     case kAppJIT:
       CreateAndWriteAppJITSnapshot();
       break;
+    case kAppAOTBlobs:
+    case kAppAOTAssembly:
+      CreateAndWritePrecompiledSnapshot();
+      break;
     case kVMAOTAssembly: {
       File* file = OpenFile(assembly_filename);
       RefCntReleaseScope<File> rs(file);
@@ -947,18 +792,13 @@
 
   Dart_ExitScope();
   Dart_ShutdownIsolate();
-  error = Dart_Cleanup();
-  if (error != NULL) {
-    Log::PrintErr("VM cleanup failed: %s\n", error);
-    free(error);
-  }
-  EventHandler::Stop();
   return 0;
 }
 
 int main(int argc, char** argv) {
   const int EXTRA_VM_ARGUMENTS = 7;
   CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS);
+  CommandLineOptions inputs(argc);
 
   // When running from the command line we assume that we are optimizing for
   // throughput, and therefore use a larger new gen semi space size and a faster
@@ -972,25 +812,12 @@
   vm_options.AddArgument("--deterministic");
 
   // Parse command line arguments.
-  if (ParseArguments(argc, argv, &vm_options, &app_script_name) < 0) {
+  if (ParseArguments(argc, argv, &vm_options, &inputs) < 0) {
     PrintUsage();
     return kErrorExitCode;
   }
   DartUtils::SetEnvironment(environment);
 
-  // Sniff the script to check if it is actually a dill file.
-  uint8_t* kernel_buffer = NULL;
-  intptr_t kernel_buffer_size = NULL;
-  if (app_script_name != NULL) {
-    dfe.ReadScript(app_script_name, &kernel_buffer, &kernel_buffer_size);
-  }
-  if (kernel_buffer != NULL) {
-    if (dependencies_filename != NULL) {
-      Log::PrintErr("Depfiles are not supported in Dart 2.\n");
-      return kErrorExitCode;
-    }
-  }
-
   if (!Platform::Initialize()) {
     Log::PrintErr("Initialization failed\n");
     return kErrorExitCode;
@@ -1026,16 +853,9 @@
     return kErrorExitCode;
   }
 
-  // Initialize the Dart VM.
-  // Note: We don't expect isolates to be created from dart code during
-  // core library snapshot generation. However for the case when a full
-  // snasphot is generated from a script (app_script_name != NULL) we will
-  // need the service isolate to resolve URI and load code.
-
   Dart_InitializeParams init_params;
   memset(&init_params, 0, sizeof(init_params));
   init_params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION;
-  ASSERT((app_script_name != NULL) || (kernel_buffer == NULL));
   init_params.file_open = DartUtils::OpenFile;
   init_params.file_read = DartUtils::ReadFile;
   init_params.file_write = DartUtils::WriteFile;
@@ -1075,13 +895,18 @@
     return kErrorExitCode;
   }
 
-  if (kernel_buffer != NULL) {
-    return GenerateSnapshotFromKernel(kernel_buffer, kernel_buffer_size);
-  } else {
-    Log::PrintErr("Invalid input script specified : %s\n",
-                  (app_script_name == NULL) ? "null Script" : app_script_name);
-    return kErrorExitCode;
+  int result = CreateIsolateAndSnapshot(inputs);
+  if (result != 0) {
+    return result;
   }
+
+  error = Dart_Cleanup();
+  if (error != NULL) {
+    Log::PrintErr("VM cleanup failed: %s\n", error);
+    free(error);
+  }
+  EventHandler::Stop();
+  return 0;
 }
 
 }  // namespace bin
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 301b3ee..2d7ea6f 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -353,6 +353,14 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
   }
 
+  if (Options::gen_snapshot_kind() == kAppJIT) {
+    // If we sort, we must do it for all isolates, not just the main isolate,
+    // otherwise isolates related by spawnFunction will disagree on CIDs and
+    // cannot correctly send each other messages.
+    result = Dart_SortClasses();
+    CHECK_RESULT(result);
+  }
+
   // Make the isolate runnable so that it is ready to handle messages.
   Dart_ExitScope();
   Dart_ExitIsolate();
@@ -872,8 +880,6 @@
     }
 
     if (Options::gen_snapshot_kind() == kAppJIT) {
-      result = Dart_SortClasses();
-      CHECK_RESULT(result);
       LoadBytecode();
     }
 
diff --git a/runtime/bin/namespace_patch.dart b/runtime/bin/namespace_patch.dart
index f28c104..d8b7295 100644
--- a/runtime/bin/namespace_patch.dart
+++ b/runtime/bin/namespace_patch.dart
@@ -35,7 +35,7 @@
 @pragma("vm:entry-point")
 class _Namespace {
   @patch
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   static void _setupNamespace(var namespace) {
     _NamespaceImpl._setupNamespace(namespace);
   }
diff --git a/runtime/bin/platform_android.cc b/runtime/bin/platform_android.cc
index cd1efd7..37240b9 100644
--- a/runtime/bin/platform_android.cc
+++ b/runtime/bin/platform_android.cc
@@ -28,10 +28,9 @@
 static void segv_handler(int signal, siginfo_t* siginfo, void* context) {
   Log::PrintErr(
       "\n===== CRASH =====\n"
-      "version=%s\n"
       "si_signo=%s(%d), si_code=%d, si_addr=%p\n",
-      Dart_VersionString(), strsignal(siginfo->si_signo), siginfo->si_signo,
-      siginfo->si_code, siginfo->si_addr);
+      strsignal(siginfo->si_signo), siginfo->si_signo, siginfo->si_code,
+      siginfo->si_addr);
   Dart_DumpNativeStackTrace(context);
   abort();
 }
diff --git a/runtime/bin/platform_linux.cc b/runtime/bin/platform_linux.cc
index 260a900..6bc50aa 100644
--- a/runtime/bin/platform_linux.cc
+++ b/runtime/bin/platform_linux.cc
@@ -28,10 +28,9 @@
 static void segv_handler(int signal, siginfo_t* siginfo, void* context) {
   Log::PrintErr(
       "\n===== CRASH =====\n"
-      "version=%s\n"
       "si_signo=%s(%d), si_code=%d, si_addr=%p\n",
-      Dart_VersionString(), strsignal(siginfo->si_signo), siginfo->si_signo,
-      siginfo->si_code, siginfo->si_addr);
+      strsignal(siginfo->si_signo), siginfo->si_signo, siginfo->si_code,
+      siginfo->si_addr);
   Dart_DumpNativeStackTrace(context);
   abort();
 }
diff --git a/runtime/bin/platform_macos.cc b/runtime/bin/platform_macos.cc
index c41e8b2..ef3c90f 100644
--- a/runtime/bin/platform_macos.cc
+++ b/runtime/bin/platform_macos.cc
@@ -36,10 +36,9 @@
 static void segv_handler(int signal, siginfo_t* siginfo, void* context) {
   Log::PrintErr(
       "\n===== CRASH =====\n"
-      "version=%s\n"
       "si_signo=%s(%d), si_code=%d, si_addr=%p\n",
-      Dart_VersionString(), strsignal(siginfo->si_signo), siginfo->si_signo,
-      siginfo->si_code, siginfo->si_addr);
+      strsignal(siginfo->si_signo), siginfo->si_signo, siginfo->si_code,
+      siginfo->si_addr);
   Dart_DumpNativeStackTrace(context);
   abort();
 }
diff --git a/runtime/bin/platform_win.cc b/runtime/bin/platform_win.cc
index 5cdf6fc..9b2face 100644
--- a/runtime/bin/platform_win.cc
+++ b/runtime/bin/platform_win.cc
@@ -75,9 +75,8 @@
          EXCEPTION_ILLEGAL_INSTRUCTION)) {
       Log::PrintErr(
           "\n===== CRASH =====\n"
-          "version=%s\n"
           "ExceptionCode=%d, ExceptionFlags=%d, ExceptionAddress=%p\n",
-          Dart_VersionString(), ExceptionInfo->ExceptionRecord->ExceptionCode,
+          ExceptionInfo->ExceptionRecord->ExceptionCode,
           ExceptionInfo->ExceptionRecord->ExceptionFlags,
           ExceptionInfo->ExceptionRecord->ExceptionAddress);
       Dart_DumpNativeStackTrace(ExceptionInfo->ContextRecord);
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index d379d2d..54c1f3b 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -46,7 +46,7 @@
  public:
   ProcessInfo(pid_t pid, intptr_t fd) : pid_(pid), fd_(fd) {}
   ~ProcessInfo() {
-    int closed = TEMP_FAILURE_RETRY(close(fd_));
+    int closed = close(fd_);
     if (closed != 0) {
       FATAL("Failed to close process exit code pipe");
     }
@@ -141,7 +141,8 @@
     }
 
     // Start thread that handles process exits when wait returns.
-    int result = Thread::Start(ExitCodeHandlerEntry, 0);
+    int result =
+        Thread::Start("dart:io Process.start", ExitCodeHandlerEntry, 0);
     if (result != 0) {
       FATAL1("Failed to start exit code handler worker thread %d", result);
     }
@@ -337,14 +338,14 @@
     }
 
     // Read the result of executing the child process.
-    VOID_TEMP_FAILURE_RETRY(close(exec_control_[1]));
+    close(exec_control_[1]);
     exec_control_[1] = -1;
     if (Process::ModeIsAttached(mode_)) {
       err = ReadExecResult();
     } else {
       err = ReadDetachedExecResult(&pid);
     }
-    VOID_TEMP_FAILURE_RETRY(close(exec_control_[0]));
+    close(exec_control_[0]);
     exec_control_[0] = -1;
 
     // Return error code if any failures.
@@ -355,7 +356,7 @@
         // GetProcessExitCodes will get a broken pipe error when it
         // tries to write to the writing side of the pipe and it will
         // ignore the error.
-        VOID_TEMP_FAILURE_RETRY(close(*exit_event_));
+        close(*exit_event_);
         *exit_event_ = -1;
       }
       CloseAllPipes();
@@ -366,17 +367,17 @@
       // Connect stdio, stdout and stderr.
       FDUtils::SetNonBlocking(read_in_[0]);
       *in_ = read_in_[0];
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[1]));
+      close(read_in_[1]);
       FDUtils::SetNonBlocking(write_out_[1]);
       *out_ = write_out_[1];
-      VOID_TEMP_FAILURE_RETRY(close(write_out_[0]));
+      close(write_out_[0]);
       FDUtils::SetNonBlocking(read_err_[0]);
       *err_ = read_err_[0];
-      VOID_TEMP_FAILURE_RETRY(close(read_err_[1]));
+      close(read_err_[1]);
     } else {
       // Close all fds.
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[0]));
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[1]));
+      close(read_in_[0]);
+      close(read_in_[1]);
       ASSERT(write_out_[0] == -1);
       ASSERT(write_out_[1] == -1);
       ASSERT(read_err_[0] == -1);
@@ -513,9 +514,9 @@
       ASSERT(read_err_[1] == -1);
       // For a detached process the pipe to connect stdout is only used for
       // signaling when to do the first fork.
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[0]));
+      close(read_in_[0]);
       read_in_[0] = -1;
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[1]));
+      close(read_in_[1]);
       read_in_[1] = -1;
     } else {
       // Don't close any fds if keeping stdio open to the detached process.
@@ -631,7 +632,7 @@
     }
     for (int fd = 0; fd < max_fds; fd++) {
       if (fd != exec_control_[1]) {
-        VOID_TEMP_FAILURE_RETRY(close(fd));
+        close(fd);
       }
     }
 
@@ -663,24 +664,24 @@
     for (int fd = 0; fd < max_fds; fd++) {
       if ((fd != exec_control_[1]) && (fd != write_out_[0]) &&
           (fd != read_in_[1]) && (fd != read_err_[1])) {
-        VOID_TEMP_FAILURE_RETRY(close(fd));
+        close(fd);
       }
     }
 
     if (TEMP_FAILURE_RETRY(dup2(write_out_[0], STDIN_FILENO)) == -1) {
       ReportChildError();
     }
-    VOID_TEMP_FAILURE_RETRY(close(write_out_[0]));
+    close(write_out_[0]);
 
     if (TEMP_FAILURE_RETRY(dup2(read_in_[1], STDOUT_FILENO)) == -1) {
       ReportChildError();
     }
-    VOID_TEMP_FAILURE_RETRY(close(read_in_[1]));
+    close(read_in_[1]);
 
     if (TEMP_FAILURE_RETRY(dup2(read_err_[1], STDERR_FILENO)) == -1) {
       ReportChildError();
     }
-    VOID_TEMP_FAILURE_RETRY(close(read_err_[1]));
+    close(read_err_[1]);
   }
 
   int CleanupAndReturnError() {
@@ -715,7 +716,7 @@
       FDUtils::WriteToBlocking(exec_control_[1], os_error_message,
                                strlen(os_error_message) + 1);
     }
-    VOID_TEMP_FAILURE_RETRY(close(exec_control_[1]));
+    close(exec_control_[1]);
 
     // We avoid running through registered atexit() handlers because that is
     // unnecessary work.
@@ -747,7 +748,7 @@
   void ClosePipe(int* fds) {
     for (int i = 0; i < 2; i++) {
       if (fds[i] != -1) {
-        VOID_TEMP_FAILURE_RETRY(close(fds[i]));
+        close(fds[i]);
         fds[i] = -1;
       }
     }
@@ -805,9 +806,9 @@
 
 static bool CloseProcessBuffers(struct pollfd fds[3]) {
   int e = errno;
-  VOID_TEMP_FAILURE_RETRY(close(fds[0].fd));
-  VOID_TEMP_FAILURE_RETRY(close(fds[1].fd));
-  VOID_TEMP_FAILURE_RETRY(close(fds[2].fd));
+  close(fds[0].fd);
+  close(fds[1].fd);
+  close(fds[2].fd);
   errno = e;
   return false;
 }
@@ -819,7 +820,7 @@
                    intptr_t exit_event,
                    ProcessResult* result) {
   // Close input to the process right away.
-  VOID_TEMP_FAILURE_RETRY(close(in));
+  close(in);
 
   // There is no return from this function using Dart_PropagateError
   // as memory used by the buffer lists is freed through their
@@ -873,7 +874,7 @@
         }
       }
       if ((fds[i].revents & POLLHUP) != 0) {
-        VOID_TEMP_FAILURE_RETRY(close(fds[i].fd));
+        close(fds[i].fd);
         alive--;
         if (i < alive) {
           fds[i] = fds[alive];
@@ -954,7 +955,7 @@
 };
 
 SignalInfo::~SignalInfo() {
-  VOID_TEMP_FAILURE_RETRY(close(fd_));
+  close(fd_);
 }
 
 static void SignalHandler(int signal) {
@@ -985,8 +986,8 @@
     return -1;
   }
   if (!FDUtils::SetNonBlocking(fds[0])) {
-    VOID_TEMP_FAILURE_RETRY(close(fds[0]));
-    VOID_TEMP_FAILURE_RETRY(close(fds[1]));
+    close(fds[0]);
+    close(fds[1]);
     return -1;
   }
   ThreadSignalBlocker blocker(kSignalsCount, kSignals);
@@ -1010,8 +1011,8 @@
     }
     int status = NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
     if (status < 0) {
-      VOID_TEMP_FAILURE_RETRY(close(fds[0]));
-      VOID_TEMP_FAILURE_RETRY(close(fds[1]));
+      close(fds[0]);
+      close(fds[1]);
       return -1;
     }
   }
diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc
index 6fd29a0..072e0da 100644
--- a/runtime/bin/process_fuchsia.cc
+++ b/runtime/bin/process_fuchsia.cc
@@ -12,7 +12,6 @@
 #include <lib/fdio/io.h>
 #include <lib/fdio/namespace.h>
 #include <lib/fdio/spawn.h>
-#include <lib/fdio/util.h>
 #include <poll.h>
 #include <pthread.h>
 #include <stdbool.h>
@@ -167,7 +166,8 @@
     }
 
     // Start thread that handles process exits when wait returns.
-    intptr_t result = Thread::Start(ExitCodeHandlerEntry, 0);
+    intptr_t result =
+        Thread::Start("dart:io Process.start", ExitCodeHandlerEntry, 0);
     if (result != 0) {
       FATAL1("Failed to start exit code handler worker thread %ld", result);
     }
@@ -580,7 +580,7 @@
         TEMP_FAILURE_RETRY(openat(ns.fd(), ns.path(), O_RDONLY));
     zx_handle_t vmo = ZX_HANDLE_INVALID;
     zx_status_t status = fdio_get_vmo_clone(pathfd, &vmo);
-    VOID_TEMP_FAILURE_RETRY(close(pathfd));
+    close(pathfd);
     if (status != ZX_OK) {
       close(exit_pipe_fds[0]);
       close(exit_pipe_fds[1]);
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index 825bc1d..98ab964 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -46,7 +46,7 @@
  public:
   ProcessInfo(pid_t pid, intptr_t fd) : pid_(pid), fd_(fd) {}
   ~ProcessInfo() {
-    int closed = TEMP_FAILURE_RETRY(close(fd_));
+    int closed = close(fd_);
     if (closed != 0) {
       FATAL("Failed to close process exit code pipe");
     }
@@ -141,7 +141,8 @@
     }
 
     // Start thread that handles process exits when wait returns.
-    int result = Thread::Start(ExitCodeHandlerEntry, 0);
+    int result =
+        Thread::Start("dart:io Process.start", ExitCodeHandlerEntry, 0);
     if (result != 0) {
       FATAL1("Failed to start exit code handler worker thread %d", result);
     }
@@ -337,14 +338,14 @@
     }
 
     // Read the result of executing the child process.
-    VOID_TEMP_FAILURE_RETRY(close(exec_control_[1]));
+    close(exec_control_[1]);
     exec_control_[1] = -1;
     if (Process::ModeIsAttached(mode_)) {
       err = ReadExecResult();
     } else {
       err = ReadDetachedExecResult(&pid);
     }
-    VOID_TEMP_FAILURE_RETRY(close(exec_control_[0]));
+    close(exec_control_[0]);
     exec_control_[0] = -1;
 
     // Return error code if any failures.
@@ -355,7 +356,7 @@
         // GetProcessExitCodes will get a broken pipe error when it
         // tries to write to the writing side of the pipe and it will
         // ignore the error.
-        VOID_TEMP_FAILURE_RETRY(close(*exit_event_));
+        close(*exit_event_);
         *exit_event_ = -1;
       }
       CloseAllPipes();
@@ -366,17 +367,17 @@
       // Connect stdio, stdout and stderr.
       FDUtils::SetNonBlocking(read_in_[0]);
       *in_ = read_in_[0];
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[1]));
+      close(read_in_[1]);
       FDUtils::SetNonBlocking(write_out_[1]);
       *out_ = write_out_[1];
-      VOID_TEMP_FAILURE_RETRY(close(write_out_[0]));
+      close(write_out_[0]);
       FDUtils::SetNonBlocking(read_err_[0]);
       *err_ = read_err_[0];
-      VOID_TEMP_FAILURE_RETRY(close(read_err_[1]));
+      close(read_err_[1]);
     } else {
       // Close all fds.
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[0]));
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[1]));
+      close(read_in_[0]);
+      close(read_in_[1]);
       ASSERT(write_out_[0] == -1);
       ASSERT(write_out_[1] == -1);
       ASSERT(read_err_[0] == -1);
@@ -513,9 +514,9 @@
       ASSERT(read_err_[1] == -1);
       // For a detached process the pipe to connect stdout is only used for
       // signaling when to do the first fork.
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[0]));
+      close(read_in_[0]);
       read_in_[0] = -1;
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[1]));
+      close(read_in_[1]);
       read_in_[1] = -1;
     } else {
       // Don't close any fds if keeping stdio open to the detached process.
@@ -631,7 +632,7 @@
     }
     for (int fd = 0; fd < max_fds; fd++) {
       if (fd != exec_control_[1]) {
-        VOID_TEMP_FAILURE_RETRY(close(fd));
+        close(fd);
       }
     }
 
@@ -663,24 +664,24 @@
     for (int fd = 0; fd < max_fds; fd++) {
       if ((fd != exec_control_[1]) && (fd != write_out_[0]) &&
           (fd != read_in_[1]) && (fd != read_err_[1])) {
-        VOID_TEMP_FAILURE_RETRY(close(fd));
+        close(fd);
       }
     }
 
     if (TEMP_FAILURE_RETRY(dup2(write_out_[0], STDIN_FILENO)) == -1) {
       ReportChildError();
     }
-    VOID_TEMP_FAILURE_RETRY(close(write_out_[0]));
+    close(write_out_[0]);
 
     if (TEMP_FAILURE_RETRY(dup2(read_in_[1], STDOUT_FILENO)) == -1) {
       ReportChildError();
     }
-    VOID_TEMP_FAILURE_RETRY(close(read_in_[1]));
+    close(read_in_[1]);
 
     if (TEMP_FAILURE_RETRY(dup2(read_err_[1], STDERR_FILENO)) == -1) {
       ReportChildError();
     }
-    VOID_TEMP_FAILURE_RETRY(close(read_err_[1]));
+    close(read_err_[1]);
   }
 
   int CleanupAndReturnError() {
@@ -715,7 +716,7 @@
       FDUtils::WriteToBlocking(exec_control_[1], os_error_message,
                                strlen(os_error_message) + 1);
     }
-    VOID_TEMP_FAILURE_RETRY(close(exec_control_[1]));
+    close(exec_control_[1]);
 
     // We avoid running through registered atexit() handlers because that is
     // unnecessary work.
@@ -747,7 +748,7 @@
   void ClosePipe(int* fds) {
     for (int i = 0; i < 2; i++) {
       if (fds[i] != -1) {
-        VOID_TEMP_FAILURE_RETRY(close(fds[i]));
+        close(fds[i]);
         fds[i] = -1;
       }
     }
@@ -805,9 +806,9 @@
 
 static bool CloseProcessBuffers(struct pollfd fds[3]) {
   int e = errno;
-  VOID_TEMP_FAILURE_RETRY(close(fds[0].fd));
-  VOID_TEMP_FAILURE_RETRY(close(fds[1].fd));
-  VOID_TEMP_FAILURE_RETRY(close(fds[2].fd));
+  close(fds[0].fd);
+  close(fds[1].fd);
+  close(fds[2].fd);
   errno = e;
   return false;
 }
@@ -819,7 +820,7 @@
                    intptr_t exit_event,
                    ProcessResult* result) {
   // Close input to the process right away.
-  VOID_TEMP_FAILURE_RETRY(close(in));
+  close(in);
 
   // There is no return from this function using Dart_PropagateError
   // as memory used by the buffer lists is freed through their
@@ -873,7 +874,7 @@
         }
       }
       if ((fds[i].revents & POLLHUP) != 0) {
-        VOID_TEMP_FAILURE_RETRY(close(fds[i].fd));
+        close(fds[i].fd);
         alive--;
         if (i < alive) {
           fds[i] = fds[alive];
@@ -954,7 +955,7 @@
 };
 
 SignalInfo::~SignalInfo() {
-  VOID_TEMP_FAILURE_RETRY(close(fd_));
+  close(fd_);
 }
 
 static void SignalHandler(int signal) {
@@ -1006,8 +1007,8 @@
     int status = sigaction(signal, &act, NULL);
     if (status < 0) {
       int err = errno;
-      VOID_TEMP_FAILURE_RETRY(close(fds[0]));
-      VOID_TEMP_FAILURE_RETRY(close(fds[1]));
+      close(fds[0]);
+      close(fds[1]);
       errno = err;
       return -1;
     }
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index d83443a..830705c 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -45,7 +45,7 @@
  public:
   ProcessInfo(pid_t pid, intptr_t fd) : pid_(pid), fd_(fd) {}
   ~ProcessInfo() {
-    int closed = TEMP_FAILURE_RETRY(close(fd_));
+    int closed = close(fd_);
     if (closed != 0) {
       FATAL("Failed to close process exit code pipe");
     }
@@ -140,7 +140,8 @@
     }
 
     // Start thread that handles process exits when wait returns.
-    int result = Thread::Start(ExitCodeHandlerEntry, 0);
+    int result =
+        Thread::Start("dart:io Process.start", ExitCodeHandlerEntry, 0);
     if (result != 0) {
       FATAL1("Failed to start exit code handler worker thread %d", result);
     }
@@ -331,14 +332,14 @@
     }
 
     // Read the result of executing the child process.
-    VOID_TEMP_FAILURE_RETRY(close(exec_control_[1]));
+    close(exec_control_[1]);
     exec_control_[1] = -1;
     if (Process::ModeIsAttached(mode_)) {
       err = ReadExecResult();
     } else {
       err = ReadDetachedExecResult(&pid);
     }
-    VOID_TEMP_FAILURE_RETRY(close(exec_control_[0]));
+    close(exec_control_[0]);
     exec_control_[0] = -1;
 
     // Return error code if any failures.
@@ -349,7 +350,7 @@
         // GetProcessExitCodes will get a broken pipe error when it
         // tries to write to the writing side of the pipe and it will
         // ignore the error.
-        VOID_TEMP_FAILURE_RETRY(close(*exit_event_));
+        close(*exit_event_);
         *exit_event_ = -1;
       }
       CloseAllPipes();
@@ -360,17 +361,17 @@
       // Connect stdio, stdout and stderr.
       FDUtils::SetNonBlocking(read_in_[0]);
       *in_ = read_in_[0];
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[1]));
+      close(read_in_[1]);
       FDUtils::SetNonBlocking(write_out_[1]);
       *out_ = write_out_[1];
-      VOID_TEMP_FAILURE_RETRY(close(write_out_[0]));
+      close(write_out_[0]);
       FDUtils::SetNonBlocking(read_err_[0]);
       *err_ = read_err_[0];
-      VOID_TEMP_FAILURE_RETRY(close(read_err_[1]));
+      close(read_err_[1]);
     } else {
       // Close all fds.
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[0]));
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[1]));
+      close(read_in_[0]);
+      close(read_in_[1]);
       ASSERT(write_out_[0] == -1);
       ASSERT(write_out_[1] == -1);
       ASSERT(read_err_[0] == -1);
@@ -482,9 +483,9 @@
       ASSERT(read_err_[1] == -1);
       // For a detached process the pipe to connect stdout is only used for
       // signaling when to do the first fork.
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[0]));
+      close(read_in_[0]);
       read_in_[0] = -1;
-      VOID_TEMP_FAILURE_RETRY(close(read_in_[1]));
+      close(read_in_[1]);
       read_in_[1] = -1;
     } else {
       // Don't close any fds if keeping stdio open to the detached process.
@@ -596,7 +597,7 @@
     }
     for (int fd = 0; fd < max_fds; fd++) {
       if (fd != exec_control_[1]) {
-        VOID_TEMP_FAILURE_RETRY(close(fd));
+        close(fd);
       }
     }
 
@@ -628,24 +629,24 @@
     for (int fd = 0; fd < max_fds; fd++) {
       if ((fd != exec_control_[1]) && (fd != write_out_[0]) &&
           (fd != read_in_[1]) && (fd != read_err_[1])) {
-        VOID_TEMP_FAILURE_RETRY(close(fd));
+        close(fd);
       }
     }
 
     if (TEMP_FAILURE_RETRY(dup2(write_out_[0], STDIN_FILENO)) == -1) {
       ReportChildError();
     }
-    VOID_TEMP_FAILURE_RETRY(close(write_out_[0]));
+    close(write_out_[0]);
 
     if (TEMP_FAILURE_RETRY(dup2(read_in_[1], STDOUT_FILENO)) == -1) {
       ReportChildError();
     }
-    VOID_TEMP_FAILURE_RETRY(close(read_in_[1]));
+    close(read_in_[1]);
 
     if (TEMP_FAILURE_RETRY(dup2(read_err_[1], STDERR_FILENO)) == -1) {
       ReportChildError();
     }
-    VOID_TEMP_FAILURE_RETRY(close(read_err_[1]));
+    close(read_err_[1]);
   }
 
   int CleanupAndReturnError() {
@@ -680,7 +681,7 @@
       FDUtils::WriteToBlocking(exec_control_[1], os_error_message,
                                strlen(os_error_message) + 1);
     }
-    VOID_TEMP_FAILURE_RETRY(close(exec_control_[1]));
+    close(exec_control_[1]);
     exit(1);
   }
 
@@ -709,7 +710,7 @@
   void ClosePipe(int* fds) {
     for (int i = 0; i < 2; i++) {
       if (fds[i] != -1) {
-        VOID_TEMP_FAILURE_RETRY(close(fds[i]));
+        close(fds[i]);
         fds[i] = -1;
       }
     }
@@ -766,9 +767,9 @@
 
 static bool CloseProcessBuffers(struct pollfd fds[3]) {
   int e = errno;
-  VOID_TEMP_FAILURE_RETRY(close(fds[0].fd));
-  VOID_TEMP_FAILURE_RETRY(close(fds[1].fd));
-  VOID_TEMP_FAILURE_RETRY(close(fds[2].fd));
+  close(fds[0].fd);
+  close(fds[1].fd);
+  close(fds[2].fd);
   errno = e;
   return false;
 }
@@ -780,7 +781,7 @@
                    intptr_t exit_event,
                    ProcessResult* result) {
   // Close input to the process right away.
-  VOID_TEMP_FAILURE_RETRY(close(in));
+  close(in);
 
   // There is no return from this function using Dart_PropagateError
   // as memory used by the buffer lists is freed through their
@@ -840,7 +841,7 @@
       }
       if (((fds[i].revents & POLLHUP) != 0) ||
           (((fds[i].revents & POLLIN) != 0) && (avail == 0))) {
-        VOID_TEMP_FAILURE_RETRY(close(fds[i].fd));
+        close(fds[i].fd);
         alive--;
         if (i < alive) {
           fds[i] = fds[alive];
@@ -973,7 +974,7 @@
 };
 
 SignalInfo::~SignalInfo() {
-  VOID_TEMP_FAILURE_RETRY(close(fd_));
+  close(fd_);
 }
 
 static void SignalHandler(int signal) {
@@ -1009,8 +1010,8 @@
   }
   if (!FDUtils::SetCloseOnExec(fds[0]) || !FDUtils::SetCloseOnExec(fds[1]) ||
       !FDUtils::SetNonBlocking(fds[0])) {
-    VOID_TEMP_FAILURE_RETRY(close(fds[0]));
-    VOID_TEMP_FAILURE_RETRY(close(fds[1]));
+    close(fds[0]);
+    close(fds[1]);
     return -1;
   }
   ThreadSignalBlocker blocker(kSignalsCount, kSignals);
@@ -1034,8 +1035,8 @@
     }
     intptr_t status = NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
     if (status < 0) {
-      VOID_TEMP_FAILURE_RETRY(close(fds[0]));
-      VOID_TEMP_FAILURE_RETRY(close(fds[1]));
+      close(fds[0]);
+      close(fds[1]);
       return -1;
     }
   }
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 373eb7d..1e5ae1e 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -129,7 +129,7 @@
       native "Process_ClearSignalHandler";
 }
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 Function _getWatchSignalInternal() => _ProcessUtils._watchSignalInternal;
 
 @patch
diff --git a/runtime/bin/socket_base_android.cc b/runtime/bin/socket_base_android.cc
index 83f400b..084ab2f 100644
--- a/runtime/bin/socket_base_android.cc
+++ b/runtime/bin/socket_base_android.cc
@@ -260,7 +260,7 @@
 
 void SocketBase::Close(intptr_t fd) {
   ASSERT(fd >= 0);
-  VOID_TEMP_FAILURE_RETRY(close(fd));
+  close(fd);
 }
 
 bool SocketBase::GetNoDelay(intptr_t fd, bool* enabled) {
diff --git a/runtime/bin/socket_base_linux.cc b/runtime/bin/socket_base_linux.cc
index 2e6b461..87aedbd 100644
--- a/runtime/bin/socket_base_linux.cc
+++ b/runtime/bin/socket_base_linux.cc
@@ -301,7 +301,7 @@
 
 void SocketBase::Close(intptr_t fd) {
   ASSERT(fd >= 0);
-  VOID_TEMP_FAILURE_RETRY(close(fd));
+  close(fd);
 }
 
 bool SocketBase::GetNoDelay(intptr_t fd, bool* enabled) {
diff --git a/runtime/bin/socket_base_macos.cc b/runtime/bin/socket_base_macos.cc
index 4a53bac..a448911 100644
--- a/runtime/bin/socket_base_macos.cc
+++ b/runtime/bin/socket_base_macos.cc
@@ -291,7 +291,7 @@
 
 void SocketBase::Close(intptr_t fd) {
   ASSERT(fd >= 0);
-  VOID_TEMP_FAILURE_RETRY(close(fd));
+  close(fd);
 }
 
 bool SocketBase::GetNoDelay(intptr_t fd, bool* enabled) {
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index fb7b69d..870179c 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -1971,7 +1971,7 @@
   void setRawOption(RawSocketOption option) => _socket.setRawOption(option);
 }
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 Datagram _makeDatagram(
     List<int> data, String address, List<int> in_addr, int port) {
   return new Datagram(data, new _InternetAddress(address, null, in_addr), port);
diff --git a/runtime/bin/thread.h b/runtime/bin/thread.h
index 8e31cb6..09c9743 100644
--- a/runtime/bin/thread.h
+++ b/runtime/bin/thread.h
@@ -43,7 +43,9 @@
   // Start a thread running the specified function. Returns 0 if the
   // thread started successfuly and a system specific error code if
   // the thread failed to start.
-  static int Start(ThreadStartFunction function, uword parameters);
+  static int Start(const char* name,
+                   ThreadStartFunction function,
+                   uword parameters);
 
   static ThreadLocalKey CreateThreadLocal();
   static void DeleteThreadLocal(ThreadLocalKey key);
diff --git a/runtime/bin/thread_android.cc b/runtime/bin/thread_android.cc
index 4970240..2bef99c 100644
--- a/runtime/bin/thread_android.cc
+++ b/runtime/bin/thread_android.cc
@@ -58,13 +58,17 @@
 
 class ThreadStartData {
  public:
-  ThreadStartData(Thread::ThreadStartFunction function, uword parameter)
-      : function_(function), parameter_(parameter) {}
+  ThreadStartData(const char* name,
+                  Thread::ThreadStartFunction function,
+                  uword parameter)
+      : name_(name), function_(function), parameter_(parameter) {}
 
+  const char* name() const { return name_; }
   Thread::ThreadStartFunction function() const { return function_; }
   uword parameter() const { return parameter_; }
 
  private:
+  const char* name_;
   Thread::ThreadStartFunction function_;
   uword parameter_;
 
@@ -77,17 +81,23 @@
 static void* ThreadStart(void* data_ptr) {
   ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
 
+  const char* name = data->name();
   Thread::ThreadStartFunction function = data->function();
   uword parameter = data->parameter();
   delete data;
 
+  // Set the thread name.
+  pthread_setname_np(pthread_self(), name);
+
   // Call the supplied thread start function handing it its parameters.
   function(parameter);
 
   return NULL;
 }
 
-int Thread::Start(ThreadStartFunction function, uword parameter) {
+int Thread::Start(const char* name,
+                  ThreadStartFunction function,
+                  uword parameter) {
   pthread_attr_t attr;
   int result = pthread_attr_init(&attr);
   RETURN_ON_PTHREAD_FAILURE(result);
@@ -98,7 +108,7 @@
   result = pthread_attr_setstacksize(&attr, Thread::GetMaxStackSize());
   RETURN_ON_PTHREAD_FAILURE(result);
 
-  ThreadStartData* data = new ThreadStartData(function, parameter);
+  ThreadStartData* data = new ThreadStartData(name, function, parameter);
 
   pthread_t tid;
   result = pthread_create(&tid, &attr, ThreadStart, data);
diff --git a/runtime/bin/thread_fuchsia.cc b/runtime/bin/thread_fuchsia.cc
index 793e9c1..d71a1df 100644
--- a/runtime/bin/thread_fuchsia.cc
+++ b/runtime/bin/thread_fuchsia.cc
@@ -8,8 +8,12 @@
 #include "bin/thread.h"
 #include "bin/thread_fuchsia.h"
 
-#include <errno.h>         // NOLINT
-#include <sys/time.h>      // NOLINT
+#include <errno.h>     // NOLINT
+#include <sys/time.h>  // NOLINT
+#include <zircon/status.h>
+#include <zircon/syscalls.h>
+#include <zircon/threads.h>
+#include <zircon/types.h>
 
 #include "platform/assert.h"
 #include "platform/utils.h"
@@ -57,13 +61,17 @@
 
 class ThreadStartData {
  public:
-  ThreadStartData(Thread::ThreadStartFunction function, uword parameter)
-      : function_(function), parameter_(parameter) {}
+  ThreadStartData(const char* name,
+                  Thread::ThreadStartFunction function,
+                  uword parameter)
+      : name_(name), function_(function), parameter_(parameter) {}
 
+  const char* name() const { return name_; }
   Thread::ThreadStartFunction function() const { return function_; }
   uword parameter() const { return parameter_; }
 
  private:
+  const char* name_;
   Thread::ThreadStartFunction function_;
   uword parameter_;
 
@@ -76,17 +84,24 @@
 static void* ThreadStart(void* data_ptr) {
   ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
 
+  const char* name = data->name();
   Thread::ThreadStartFunction function = data->function();
   uword parameter = data->parameter();
   delete data;
 
+  // Set the thread name.
+  zx_handle_t thread_handle = thrd_get_zx_handle(thrd_current());
+  zx_object_set_property(thread_handle, ZX_PROP_NAME, name, strlen(name) + 1);
+
   // Call the supplied thread start function handing it its parameters.
   function(parameter);
 
   return NULL;
 }
 
-int Thread::Start(ThreadStartFunction function, uword parameter) {
+int Thread::Start(const char* name,
+                  ThreadStartFunction function,
+                  uword parameter) {
   pthread_attr_t attr;
   int result = pthread_attr_init(&attr);
   RETURN_ON_PTHREAD_FAILURE(result);
@@ -97,7 +112,7 @@
   result = pthread_attr_setstacksize(&attr, Thread::GetMaxStackSize());
   RETURN_ON_PTHREAD_FAILURE(result);
 
-  ThreadStartData* data = new ThreadStartData(function, parameter);
+  ThreadStartData* data = new ThreadStartData(name, function, parameter);
 
   pthread_t tid;
   result = pthread_create(&tid, &attr, ThreadStart, data);
diff --git a/runtime/bin/thread_linux.cc b/runtime/bin/thread_linux.cc
index 1140ed4..2b3a7e6 100644
--- a/runtime/bin/thread_linux.cc
+++ b/runtime/bin/thread_linux.cc
@@ -58,13 +58,17 @@
 
 class ThreadStartData {
  public:
-  ThreadStartData(Thread::ThreadStartFunction function, uword parameter)
-      : function_(function), parameter_(parameter) {}
+  ThreadStartData(const char* name,
+                  Thread::ThreadStartFunction function,
+                  uword parameter)
+      : name_(name), function_(function), parameter_(parameter) {}
 
+  const char* name() const { return name_; }
   Thread::ThreadStartFunction function() const { return function_; }
   uword parameter() const { return parameter_; }
 
  private:
+  const char* name_;
   Thread::ThreadStartFunction function_;
   uword parameter_;
 
@@ -77,17 +81,23 @@
 static void* ThreadStart(void* data_ptr) {
   ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
 
+  const char* name = data->name();
   Thread::ThreadStartFunction function = data->function();
   uword parameter = data->parameter();
   delete data;
 
+  // Set the thread name.
+  pthread_setname_np(pthread_self(), name);
+
   // Call the supplied thread start function handing it its parameters.
   function(parameter);
 
   return NULL;
 }
 
-int Thread::Start(ThreadStartFunction function, uword parameter) {
+int Thread::Start(const char* name,
+                  ThreadStartFunction function,
+                  uword parameter) {
   pthread_attr_t attr;
   int result = pthread_attr_init(&attr);
   RETURN_ON_PTHREAD_FAILURE(result);
@@ -98,7 +108,7 @@
   result = pthread_attr_setstacksize(&attr, Thread::GetMaxStackSize());
   RETURN_ON_PTHREAD_FAILURE(result);
 
-  ThreadStartData* data = new ThreadStartData(function, parameter);
+  ThreadStartData* data = new ThreadStartData(name, function, parameter);
 
   pthread_t tid;
   result = pthread_create(&tid, &attr, ThreadStart, data);
diff --git a/runtime/bin/thread_macos.cc b/runtime/bin/thread_macos.cc
index 6618ba8..af636f0 100644
--- a/runtime/bin/thread_macos.cc
+++ b/runtime/bin/thread_macos.cc
@@ -52,13 +52,17 @@
 
 class ThreadStartData {
  public:
-  ThreadStartData(Thread::ThreadStartFunction function, uword parameter)
-      : function_(function), parameter_(parameter) {}
+  ThreadStartData(const char* name,
+                  Thread::ThreadStartFunction function,
+                  uword parameter)
+      : name_(name), function_(function), parameter_(parameter) {}
 
+  const char* name() const { return name_; }
   Thread::ThreadStartFunction function() const { return function_; }
   uword parameter() const { return parameter_; }
 
  private:
+  const char* name_;
   Thread::ThreadStartFunction function_;
   uword parameter_;
 
@@ -71,17 +75,23 @@
 static void* ThreadStart(void* data_ptr) {
   ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
 
+  const char* name = data->name();
   Thread::ThreadStartFunction function = data->function();
   uword parameter = data->parameter();
   delete data;
 
+  // Set the thread name.
+  pthread_setname_np(name);
+
   // Call the supplied thread start function handing it its parameters.
   function(parameter);
 
   return NULL;
 }
 
-int Thread::Start(ThreadStartFunction function, uword parameter) {
+int Thread::Start(const char* name,
+                  ThreadStartFunction function,
+                  uword parameter) {
   pthread_attr_t attr;
   int result = pthread_attr_init(&attr);
   RETURN_ON_PTHREAD_FAILURE(result);
@@ -92,7 +102,7 @@
   result = pthread_attr_setstacksize(&attr, Thread::GetMaxStackSize());
   RETURN_ON_PTHREAD_FAILURE(result);
 
-  ThreadStartData* data = new ThreadStartData(function, parameter);
+  ThreadStartData* data = new ThreadStartData(name, function, parameter);
 
   pthread_t tid;
   result = pthread_create(&tid, &attr, ThreadStart, data);
diff --git a/runtime/bin/thread_win.cc b/runtime/bin/thread_win.cc
index cba3652..ef6b632 100644
--- a/runtime/bin/thread_win.cc
+++ b/runtime/bin/thread_win.cc
@@ -17,13 +17,17 @@
 
 class ThreadStartData {
  public:
-  ThreadStartData(Thread::ThreadStartFunction function, uword parameter)
-      : function_(function), parameter_(parameter) {}
+  ThreadStartData(const char* name,
+                  Thread::ThreadStartFunction function,
+                  uword parameter)
+      : name_(name), function_(function), parameter_(parameter) {}
 
+  const char* name() const { return name_; }
   Thread::ThreadStartFunction function() const { return function_; }
   uword parameter() const { return parameter_; }
 
  private:
+  const char* name_;
   Thread::ThreadStartFunction function_;
   uword parameter_;
 
@@ -46,8 +50,10 @@
   return 0;
 }
 
-int Thread::Start(ThreadStartFunction function, uword parameter) {
-  ThreadStartData* start_data = new ThreadStartData(function, parameter);
+int Thread::Start(const char* name,
+                  ThreadStartFunction function,
+                  uword parameter) {
+  ThreadStartData* start_data = new ThreadStartData(name, function, parameter);
   uint32_t tid;
   uintptr_t thread = _beginthreadex(NULL, Thread::GetMaxStackSize(),
                                     ThreadEntry, start_data, 0, &tid);
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index f4733ae..dcad9f8 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.dart
@@ -4,7 +4,7 @@
 
 part of vmservice_io;
 
-final bool silentObservatory = const bool.fromEnvironment('SILENT_OBSERVATORY');
+final bool silentObservatory = new bool.fromEnvironment('SILENT_OBSERVATORY');
 
 void serverPrint(String s) {
   if (silentObservatory) {
@@ -81,10 +81,9 @@
           socket.addUtf8Text(result.payload);
           break;
       }
-    } catch (e, st) {
-      serverPrint("Ignoring error posting over WebSocket.");
-      serverPrint(e.toString());
-      serverPrint(st.toString());
+    } on StateError catch (_) {
+      // VM has shutdown, do nothing.
+      return;
     }
   }
 
diff --git a/runtime/docs/compiler/aot/entry_point_pragma.md b/runtime/docs/compiler/aot/entry_point_pragma.md
index c560070..3694a98 100644
--- a/runtime/docs/compiler/aot/entry_point_pragma.md
+++ b/runtime/docs/compiler/aot/entry_point_pragma.md
@@ -55,16 +55,24 @@
 @pragma("vm:entry-point")
 @pragma("vm:entry-point", true/false)
 @pragma("vm:entry-point", !const bool.formEnvironment("dart.vm.product"))
+@pragma("vm:entry-point", "get")
+@pragma("vm:entry-point", "call")
 void foo() { ... }
 ```
 
-If the second parameter is missing, `null` or `true`, the procedure will
-available for lookup and invocation directly from native or VM code. If the
-procedure is a *generative* constructor, the enclosing class must also be
+If the second parameter is missing, `null` or `true`, the procedure (and its
+closurized form, excluding constructors and setters) will available for lookup
+and invocation directly from native or VM code.
+
+If the procedure is a *generative* constructor, the enclosing class must also be
 annotated for allocation from native or VM code.
 
-Note that annotating a procedure does not allow closurizing it, e.g. access a
-non-getter via `Dart_GetField`.
+If the annotation is "get" or "call", the procedure will only be available for
+closurization (access via `Dart_GetField`) or invocation (access via
+`Dart_Invoke`).
+
+"@pragma("vm:entry-point", "get") against constructors or setters is disallowed
+since they cannot be closurized.
 
 ### Fields
 
@@ -86,3 +94,5 @@
 'get'/'set' parameter is used, only the getter/setter is marked. For static
 fields, the implicit getter is always marked. The third form does not make sense
 for static fields because they do not belong to an interface.
+
+Note that no form of entry-point annotation allows invoking a field.
diff --git a/runtime/docs/gc.md b/runtime/docs/gc.md
index 22aebee..37303f1 100644
--- a/runtime/docs/gc.md
+++ b/runtime/docs/gc.md
@@ -1,13 +1,31 @@
 # Garbage Collection
 
+The Dart VM has a generational garbage collector with two generations. The new generation is collected by a stop-the-world semispace [scavenger](https://github.com/dart-lang/sdk/blob/master/runtime/vm/heap/scavenger.h). The old generation is collected by concurrent-[mark](https://github.com/dart-lang/sdk/blob/master/runtime/vm/heap/marker.h)-concurrent-[sweep](https://github.com/dart-lang/sdk/blob/master/runtime/vm/heap/sweeper.h) or by concurrent-mark-parallel-[compact](https://github.com/dart-lang/sdk/blob/master/runtime/vm/heap/compactor.h).
+
 ## Object representation
 
+Object pointers refer either to immediate objects or heap objects, distinguished by a tag in the low bits of the pointer. The Dart VM has only one kind of immediate object, Smis (small integers), whose pointers have a tag of 0. Heap objects have a pointer tag of 1. The upper bits of a Smi pointer are its value, and the upper bits of a heap object pointer are the most signficant bits of its address (the least significant bit is always 0 because heap objects always have greater than 2-byte alignment).
+
+A tag of 0 allows many operations to be performed on Smis without untagging and retagging. It also allows hiding aligned addresses to the C heap from the GC.
+
+A tag of 1 has no penalty on heap object access because removing the tag can be folded into the offset used by load and store instructions.
+
+Heap objects are always allocated in double-word increments. Objects in old-space are kept at double-word alignment, and objects in new-space are kept offset from double-word alignment. This allows checking an object's age without comparing to a boundry address, avoiding restrictions on heap placement and avoiding loading the boundry from thread-local storage. Additionally, the scavenger can quickly skip over both immediates and old objects with a single branch.
+
+Heap objects have a single-word header, which encodes the object's class, size, and some status flags.
+
+On 64-bit architectures, the header of heap objects also contains a 32-bit identity hash field. On 32-bit architectures, the identity hash for heap objects is kept in a side table.
+
 ## Scavenge
 
+See [Cheney's algorithm](https://dl.acm.org/citation.cfm?doid=362790.362798).
+
 ## Mark-Sweep
 
 ## Mark-Compact
 
+The Dart VM includes a sliding compactor. The forwarding table is compactly represented by dividing the heap into blocks and for each block recording its target address and the bitvector for each surviving double-word. The table is accessed in constant time by keeping heap pages aligned so the page header of any object can be accessed by masking the object.
+
 ## Concurrent Marking
 
 To reduce the time the mutator is paused for old-space GCs, we allow the mutator to continue running during most of the marking work. 
@@ -85,7 +103,7 @@
 
 ### Data races
 
-Operations on headers and slots use (relaxed ordering)[https://en.cppreference.com/w/cpp/atomic/memory_order] and do not provide synchronization.
+Operations on headers and slots use [relaxed ordering](https://en.cppreference.com/w/cpp/atomic/memory_order) and do not provide synchronization.
 
 The concurrent marker starts with an acquire-release operation, so all writes by the mutator up to the time that marking starts are visible to the marker.
 
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index a017584..1c4c151 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -967,6 +967,20 @@
 DART_EXPORT void Dart_NotifyLowMemory();
 
 /**
+ * Starts the CPU sampling profiler.
+ */
+DART_EXPORT void Dart_StartProfiling();
+
+/**
+ * Stops the CPU sampling profiler.
+ *
+ * Note that some profile samples might still be taken after this fucntion
+ * returns due to the asynchronous nature of the implementation on some
+ * platforms.
+ */
+DART_EXPORT void Dart_StopProfiling();
+
+/**
  * Notifies the VM that the current thread should not be profiled until a
  * matching call to Dart_ThreadEnableProfiling is made.
  *
@@ -3124,6 +3138,19 @@
 
 DART_EXPORT Dart_KernelCompilationResult Dart_KernelListDependencies();
 
+/**
+ * Sets the kernel buffer which will be used to load Dart SDK sources
+ * dynamically at runtime.
+ *
+ * \param platform_kernel A buffer containing kernel which has sources for the
+ * Dart SDK populated. Note: The VM does not take ownership of this memory.
+ *
+ * \param platform_kernel_size The length of the platform_kernel buffer.
+ */
+DART_EXPORT void Dart_SetDartLibrarySourcesKernel(
+    const uint8_t* platform_kernel,
+    const intptr_t platform_kernel_size);
+
 #define DART_KERNEL_ISOLATE_NAME "kernel-service"
 
 /*
@@ -3151,6 +3178,20 @@
  */
 DART_EXPORT Dart_Port Dart_ServiceWaitForLoadPort();
 
+/**
+ * Writes the CPU profile to the timeline as a series of 'instant' events.
+ *
+ * Note that this is an expensive operation.
+ *
+ * \param main_port The main port of the Isolate whose profile samples to write.
+ * \param error An optional error, must be free()ed by caller.
+ *
+ * \return Returns true if the profile is successfully written and false
+ *         otherwise.
+ */
+DART_EXPORT bool Dart_WriteProfileToTimeline(Dart_Port main_port,
+                                             char** error);
+
 /*
  * ====================
  * Compilation Feedback
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index ae31e47..39b29ff 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -122,7 +122,6 @@
  * data references from the message are allocated by the caller and
  * will be reclaimed when returning to it.
  */
-
 typedef void (*Dart_NativeMessageHandler)(Dart_Port dest_port_id,
                                           Dart_CObject* message);
 
diff --git a/runtime/lib/array_patch.dart b/runtime/lib/array_patch.dart
index 7bea7c9..99daf3a 100644
--- a/runtime/lib/array_patch.dart
+++ b/runtime/lib/array_patch.dart
@@ -65,7 +65,7 @@
 
   // Factory constructing a mutable List from a parser generated List literal.
   // [elements] contains elements that are already type checked.
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   factory List._fromLiteral(List elements) {
     if (elements.isEmpty) {
       return new _GrowableList<E>(0);
diff --git a/runtime/lib/async_patch.dart b/runtime/lib/async_patch.dart
index c293221..f0381ab 100644
--- a/runtime/lib/async_patch.dart
+++ b/runtime/lib/async_patch.dart
@@ -120,7 +120,7 @@
   object._awaiter = awaiter;
 }
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 void _asyncStarMoveNextHelper(var stream) {
   if (stream is! _StreamImpl) {
     return;
@@ -289,7 +289,7 @@
   Function _generator;
 }
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 void _completeOnAsyncReturn(Completer completer, Object value) {
   completer.complete(value);
 }
@@ -299,11 +299,11 @@
 Object _asyncStackTraceHelper(Function async_op)
     native "StackTrace_asyncStackTraceHelper";
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 void _clearAsyncThreadStackTrace()
     native "StackTrace_clearAsyncThreadStackTrace";
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 void _setAsyncThreadStackTrace(StackTrace stackTrace)
     native "StackTrace_setAsyncThreadStackTrace";
 
diff --git a/runtime/lib/bigint_patch.dart b/runtime/lib/bigint_patch.dart
index 0341923..be23866 100644
--- a/runtime/lib/bigint_patch.dart
+++ b/runtime/lib/bigint_patch.dart
@@ -537,7 +537,7 @@
   /// Shifts the digits of [xDigits] into the right place in [resultDigits].
   ///
   /// `resultDigits[ds..xUsed+ds] = xDigits[0..xUsed-1] << (n % _digitBits)`
-  ///   where `ds = ceil(n / _digitBits)`
+  ///   where `ds = n ~/ _digitBits`
   ///
   /// Does *not* clear digits below ds.
   ///
@@ -582,7 +582,8 @@
     }
     // Need one extra digit to hold bits shifted by bitShift.
     var resultUsed = _used + digitShift + 1;
-    var resultDigits = _newDigits(resultUsed);
+    // The 64-bit intrinsic requires one extra pair to work with.
+    var resultDigits = _newDigits(resultUsed + 1);
     _lsh(_digits, _used, shiftAmount, resultDigits);
     return new _BigIntImpl._(_isNegative, resultUsed, resultDigits);
   }
@@ -598,7 +599,8 @@
     }
     // Need one extra digit to hold bits shifted by bitShift.
     var resultUsed = xUsed + digitsShift + 1;
-    assert(resultDigits.length >= resultUsed + (resultUsed & 1));
+    // The 64-bit intrinsic requires one extra pair to work with.
+    assert(resultDigits.length >= resultUsed + 2 - (resultUsed & 1));
     _lsh(xDigits, xUsed, n, resultDigits);
     var i = digitsShift;
     while (--i >= 0) {
diff --git a/runtime/lib/class_id_fasta.dart b/runtime/lib/class_id_fasta.dart
index f8579c0..c95930f 100644
--- a/runtime/lib/class_id_fasta.dart
+++ b/runtime/lib/class_id_fasta.dart
@@ -6,7 +6,7 @@
 
 @pragma("vm:entry-point")
 class ClassID {
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   static int getID(Object value) native "ClassID_getID";
 
diff --git a/runtime/lib/compact_hash.dart b/runtime/lib/compact_hash.dart
index 8123b0f..e73a551 100644
--- a/runtime/lib/compact_hash.dart
+++ b/runtime/lib/compact_hash.dart
@@ -8,7 +8,7 @@
 
 // This function takes care of rehashing of the linked hashmaps in [objects]. We
 // do this eagerly after snapshot deserialization.
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 void _rehashObjects(List objects) {
   final int length = objects.length;
   for (int i = 0; i < length; ++i) {
@@ -614,6 +614,11 @@
   // is not required by the spec. (For instance, always using an identity set
   // would be technically correct, albeit surprising.)
   Set<E> toSet() => new _CompactLinkedHashSet<E>()..addAll(this);
+
+  // This method is called by [_rehashObjects] (see above).
+  void _regenerateIndex() {
+    _rehash();
+  }
 }
 
 class _CompactLinkedIdentityHashSet<E> extends _CompactLinkedHashSet<E>
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index 1fd86bd..1e61ce6 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_patch.dart
@@ -31,7 +31,7 @@
   // AssertionError_throwNew in errors.cc fishes the assertion source code
   // out of the script. It expects a Dart stack frame from class
   // _AssertionError. Thus we need a Dart stub that calls the native code.
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   static _throwNew(int assertionStart, int assertionEnd, Object message) {
     _doThrowNew(assertionStart, assertionEnd, message);
   }
@@ -39,7 +39,7 @@
   static _doThrowNew(int assertionStart, int assertionEnd, Object message)
       native "AssertionError_throwNew";
 
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   static _evaluateAssertion(condition) {
     if (identical(condition, true) || identical(condition, false)) {
       return condition;
@@ -194,7 +194,7 @@
   // The compiler emits a call to _throwNew when it cannot resolve a static
   // method at compile time. The receiver is actually the literal class of the
   // unresolved method.
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   static void _throwNew(Object receiver, String memberName, int invocation_type,
       Object typeArguments, List arguments, List argumentNames) {
     throw new NoSuchMethodError._withType(receiver, memberName, invocation_type,
diff --git a/runtime/lib/ffi.cc b/runtime/lib/ffi.cc
index 0621990..4186a1e 100644
--- a/runtime/lib/ffi.cc
+++ b/runtime/lib/ffi.cc
@@ -2,9 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#include "vm/compiler/ffi.h"
 #include "include/dart_api.h"
 #include "vm/bootstrap_natives.h"
 #include "vm/class_finalizer.h"
+#include "vm/class_id.h"
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/exceptions.h"
 #include "vm/log.h"
@@ -211,37 +213,6 @@
   return Double::Cast(instance);
 }
 
-// Native data types sizes in bytes
-
-static const size_t kSizeUnknown = 0;
-
-static const intptr_t kNumElementSizes = kFfiVoidCid - kFfiPointerCid + 1;
-
-static const size_t element_size_table[kNumElementSizes] = {
-    sizeof(intptr_t),  // kFfiPointerCid
-    kSizeUnknown,      // kFfiNativeFunctionCid
-    1,                 // kFfiInt8Cid
-    2,                 // kFfiInt16Cid
-    4,                 // kFfiInt32Cid
-    8,                 // kFfiInt64Cid
-    1,                 // kFfiUint8Cid
-    2,                 // kFfiUint16Cid
-    4,                 // kFfiUint32Cid
-    8,                 // kFfiUint64Cid
-    sizeof(intptr_t),  // kFfiIntPtrCid
-    4,                 // kFfiFloatCid
-    8,                 // kFfiDoubleCid
-    kSizeUnknown,      // kFfiVoidCid
-};
-
-static size_t ElementSizeInBytes(intptr_t class_id) {
-  ASSERT(RawObject::IsFfiTypeClassId(class_id));
-  ASSERT(class_id != kFfiNativeFunctionCid);
-  ASSERT(class_id != kFfiVoidCid);
-  intptr_t index = class_id - kFfiPointerCid;
-  return element_size_table[index];
-}
-
 // The remainder of this file implements the dart:ffi native methods.
 
 DEFINE_NATIVE_ENTRY(Ffi_allocate, 1, 1) {
@@ -256,18 +227,19 @@
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, argCount, arguments->NativeArgAt(0));
   int64_t count = argCount.AsInt64Value();
   classid_t type_cid = type_arg.type_class_id();
-  int64_t max_count = INTPTR_MAX / ElementSizeInBytes(type_cid);
+  int64_t max_count = INTPTR_MAX / ffi::ElementSizeInBytes(type_cid);
   CheckRange(argCount, 1, max_count, "count");
 
-  size_t size = ElementSizeInBytes(type_cid) * count;
-  uint8_t* memory = reinterpret_cast<uint8_t*>(malloc(size));
-  if (memory == NULL) {
+  size_t size = ffi::ElementSizeInBytes(type_cid) * count;
+  intptr_t memory = reinterpret_cast<intptr_t>(malloc(size));
+  if (memory == 0) {
     const String& error = String::Handle(String::NewFormatted(
         "allocating (%" Pd ") bytes of memory failed", size));
     Exceptions::ThrowArgumentError(error);
   }
 
-  RawPointer* result = Pointer::New(type_arg, memory);
+  RawPointer* result =
+      Pointer::New(type_arg, Integer::Handle(zone, Integer::New(memory)));
   return result;
 }
 
@@ -279,12 +251,11 @@
   CheckIsConcreteNativeType(native_type);
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, arg_ptr, arguments->NativeArgAt(0));
 
-  uint8_t* address = reinterpret_cast<uint8_t*>(arg_ptr.AsInt64Value());
-  // TODO(dacoharkes): should this return NULL if addres is 0?
+  // TODO(dacoharkes): should this return NULL if address is 0?
   // https://github.com/dart-lang/sdk/issues/35756
 
   RawPointer* result =
-      Pointer::New(native_type, address, type_arg.type_class_id());
+      Pointer::New(native_type, arg_ptr, type_arg.type_class_id());
   return result;
 }
 
@@ -292,14 +263,15 @@
   GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, index, arguments->NativeArgAt(1));
   AbstractType& pointer_type_arg =
-      AbstractType::Handle(pointer.type_argument());
+      AbstractType::Handle(zone, pointer.type_argument());
   CheckSized(pointer_type_arg);
 
   classid_t class_id = pointer_type_arg.type_class_id();
-  uint8_t* address = pointer.GetCMemoryAddress();
-  uint8_t* address_new =
-      address + index.AsInt64Value() * ElementSizeInBytes(class_id);
-  RawPointer* result = Pointer::New(pointer_type_arg, address_new);
+  Integer& address = Integer::Handle(zone, pointer.GetCMemoryAddress());
+  address =
+      Integer::New(address.AsInt64Value() +
+                   index.AsInt64Value() * ffi::ElementSizeInBytes(class_id));
+  RawPointer* result = Pointer::New(pointer_type_arg, address);
   return result;
 }
 
@@ -309,9 +281,11 @@
   AbstractType& pointer_type_arg =
       AbstractType::Handle(pointer.type_argument());
 
-  uint8_t* address = pointer.GetCMemoryAddress();
-  uint8_t* address_new = address + offset.AsInt64Value();
-  RawPointer* result = Pointer::New(pointer_type_arg, address_new);
+  intptr_t address =
+      Integer::Handle(zone, pointer.GetCMemoryAddress()).AsInt64Value() +
+      offset.AsInt64Value();
+  RawPointer* result = Pointer::New(
+      pointer_type_arg, Integer::Handle(zone, Integer::New(address)));
   return result;
 }
 
@@ -323,7 +297,7 @@
       type_args.TypeAtNullSafe(Pointer::kNativeTypeArgPos));
   CheckIsConcreteNativeType(native_type);
 
-  uint8_t* address = pointer.GetCMemoryAddress();
+  const Integer& address = Integer::Handle(zone, pointer.GetCMemoryAddress());
   RawPointer* result =
       Pointer::New(native_type, address, type_arg.type_class_id());
   return result;
@@ -332,35 +306,37 @@
 DEFINE_NATIVE_ENTRY(Ffi_free, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0));
 
-  uint8_t* address = pointer.GetCMemoryAddress();
-  free(address);
-  pointer.SetCMemoryAddress(0);
+  const Integer& address = Integer::Handle(zone, pointer.GetCMemoryAddress());
+  free(reinterpret_cast<void*>(address.AsInt64Value()));
+  pointer.SetCMemoryAddress(Integer::Handle(zone, Integer::New(0)));
   return Object::null();
 }
 
 DEFINE_NATIVE_ENTRY(Ffi_address, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0));
-
-  uint8_t* address = pointer.GetCMemoryAddress();
-  intptr_t int_ptr = reinterpret_cast<intptr_t>(address);
-  return Integer::NewFromUint64(int_ptr);
+  return pointer.GetCMemoryAddress();
 }
 
-static RawInstance* BoxLoadPointer(uint8_t* address,
+static RawInstance* BoxLoadPointer(Zone* zone,
+                                   uint8_t* address,
                                    const AbstractType& instance_type_arg,
                                    intptr_t type_cid) {
   // TODO(dacoharkes): should this return NULL if addres is 0?
   // https://github.com/dart-lang/sdk/issues/35756
-  if (address == 0) {  // 0 is the c++ null pointer
+  if (address == nullptr) {
     return Instance::null();
   }
   AbstractType& type_arg =
       AbstractType::Handle(TypeArguments::Handle(instance_type_arg.arguments())
                                .TypeAt(Pointer::kNativeTypeArgPos));
-  return Pointer::New(type_arg, address, type_cid);
+  return Pointer::New(
+      type_arg,
+      Integer::Handle(zone, Integer::New(reinterpret_cast<intptr_t>(address))),
+      type_cid);
 }
 
-static RawInstance* LoadValue(uint8_t* address,
+static RawInstance* LoadValue(Zone* zone,
+                              uint8_t* address,
                               const AbstractType& instance_type_arg) {
   classid_t type_cid = instance_type_arg.type_class_id();
   switch (type_cid) {
@@ -389,7 +365,7 @@
     case kFfiPointerCid:
     default:
       ASSERT(IsPointerType(instance_type_arg));
-      return BoxLoadPointer(*reinterpret_cast<uint8_t**>(address),
+      return BoxLoadPointer(zone, *reinterpret_cast<uint8_t**>(address),
                             instance_type_arg, type_cid);
   }
 }
@@ -402,14 +378,17 @@
   CheckSized(pointer_type_arg);
   ASSERT(DartAndCTypeCorrespond(pointer_type_arg, type_arg));
 
-  uint8_t* address = pointer.GetCMemoryAddress();
-  return LoadValue(address, pointer_type_arg);
+  uint8_t* address = reinterpret_cast<uint8_t*>(
+      Integer::Handle(pointer.GetCMemoryAddress()).AsInt64Value());
+  return LoadValue(zone, address, pointer_type_arg);
 }
 
-static void StoreValue(const Pointer& pointer,
+static void StoreValue(Zone* zone,
+                       const Pointer& pointer,
                        classid_t type_cid,
                        const Instance& new_value) {
-  uint8_t* address = pointer.GetCMemoryAddress();
+  uint8_t* address = reinterpret_cast<uint8_t*>(
+      Integer::Handle(pointer.GetCMemoryAddress()).AsInt64Value());
   AbstractType& pointer_type_arg =
       AbstractType::Handle(pointer.type_argument());
   switch (type_cid) {
@@ -457,14 +436,16 @@
     case kFfiPointerCid:
     default: {
       ASSERT(IsPointerType(pointer_type_arg));
-      uint8_t* new_value_unwrapped = nullptr;
+      intptr_t new_value_unwrapped = 0;
       if (!new_value.IsNull()) {
         ASSERT(new_value.IsPointer());
-        new_value_unwrapped = AsPointer(new_value).GetCMemoryAddress();
+        new_value_unwrapped =
+            Integer::Handle(AsPointer(new_value).GetCMemoryAddress())
+                .AsInt64Value();
         // TODO(dacoharkes): should this return NULL if addres is 0?
         // https://github.com/dart-lang/sdk/issues/35756
       }
-      *reinterpret_cast<uint8_t**>(address) = new_value_unwrapped;
+      *reinterpret_cast<intptr_t*>(address) = new_value_unwrapped;
     } break;
   }
 }
@@ -479,7 +460,7 @@
   ASSERT(DartAndCTypeCorrespond(pointer_type_arg, arg_type));
 
   classid_t type_cid = pointer_type_arg.type_class_id();
-  StoreValue(pointer, type_cid, new_value);
+  StoreValue(zone, pointer, type_cid, new_value);
   return Object::null();
 }
 
@@ -489,7 +470,7 @@
   CheckSized(type_arg);
 
   classid_t type_cid = type_arg.type_class_id();
-  return Smi::New(ElementSizeInBytes(type_cid));
+  return Smi::New(ffi::ElementSizeInBytes(type_cid));
 }
 
 // Generates assembly to trampoline from Dart into C++.
@@ -531,7 +512,7 @@
   ObjectPoolBuilder object_pool_builder;
   Assembler assembler(&object_pool_builder);
   GenerateFfiTrampoline(&assembler, c_signature);
-  const Code& code = Code::Handle(Code::FinalizeCode(
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       function, nullptr, &assembler, Code::PoolAttachment::kAttachPool));
   code.set_exception_handlers(
       ExceptionHandlers::Handle(ExceptionHandlers::New(0)));
@@ -590,9 +571,7 @@
   // the function so that we can reuse the function for each c function with
   // the same signature.
   Context& context = Context::Handle(Context::New(1));
-  context.SetAt(0,
-                Object::Handle(Integer::NewFromUint64(
-                    reinterpret_cast<intptr_t>(pointer.GetCMemoryAddress()))));
+  context.SetAt(0, Integer::Handle(zone, pointer.GetCMemoryAddress()));
 
   RawClosure* raw_closure =
       Closure::New(Object::null_type_arguments(), Object::null_type_arguments(),
@@ -622,8 +601,8 @@
   Assembler assembler(&object_pool_builder);
   GenerateFfiInverseTrampoline(&assembler, signature, dart_entry_point);
   const Code& code = Code::Handle(
-      Code::FinalizeCode("inverse trampoline", nullptr, &assembler,
-                         Code::PoolAttachment::kAttachPool, false));
+      Code::FinalizeCodeAndNotify("inverse trampoline", nullptr, &assembler,
+                                  Code::PoolAttachment::kAttachPool, false));
 
   uword entryPoint = code.EntryPoint();
 
@@ -652,7 +631,8 @@
   THR_Print("Ffi_fromFunction: %p\n", entryPoint);
   THR_Print("Ffi_fromFunction: %" Pd "\n", code.Size());
 
-  void* address = GenerateFfiInverseTrampoline(c_signature, entryPoint);
+  intptr_t address = reinterpret_cast<intptr_t>(
+      GenerateFfiInverseTrampoline(c_signature, entryPoint));
 
   TypeArguments& type_args = TypeArguments::Handle(zone);
   type_args = TypeArguments::New(1);
@@ -671,8 +651,8 @@
 
   address = 0;  // https://github.com/dart-lang/sdk/issues/35761
 
-  Pointer& result = Pointer::Handle(
-      Pointer::New(native_function_type, reinterpret_cast<uint8_t*>(address)));
+  Pointer& result = Pointer::Handle(Pointer::New(
+      native_function_type, Integer::Handle(zone, Integer::New(address))));
 
   return result.raw();
 }
diff --git a/runtime/lib/ffi_dynamic_library.cc b/runtime/lib/ffi_dynamic_library.cc
index b083e04..3af92da 100644
--- a/runtime/lib/ffi_dynamic_library.cc
+++ b/runtime/lib/ffi_dynamic_library.cc
@@ -19,51 +19,14 @@
 
 namespace dart {
 
-// Concatenates a NULL terminated array of strings.
-// The returned string is scope allocated.
-// TODO(dacoharkes): Can we share this with runtime/bin/extensions.cc?
-const char* Concatenate(const char** strings) {
-  int size = 1;  // null termination.
-  for (int i = 0; strings[i] != NULL; i++) {
-    size += strlen(strings[i]);
-  }
-  char* result = reinterpret_cast<char*>(Dart_ScopeAllocate(size));
-  int index = 0;
-  for (int i = 0; strings[i] != NULL; i++) {
-    index += snprintf(result + index, size - index, "%s", strings[i]);
-  }
-  ASSERT(index == size - 1);
-  ASSERT(result[size - 1] == '\0');
-  return result;
-}
-
-// TODO(dacoharkes): Can we share this with runtime/bin/extensions.cc?
-const char* LibraryPath(const char* library_name) {
-  const char* library_prefix = "lib";
-#if defined(TARGET_OS_LINUX)
-  const char* library_extension = "so";
-#elif defined(TARGET_OS_MACOS)
-  const char* library_extension = "dylib";
-#else
-  const char* library_extension = "";
-  UNREACHABLE();
-#endif
-
-  const char* path_components[] = {
-      library_prefix, library_name, ".", library_extension, NULL,
-  };
-
-  return Concatenate(path_components);
-}
-
 DEFINE_NATIVE_ENTRY(Ffi_dl_open, 0, 1) {
 #if !defined(TARGET_OS_LINUX) && !defined(TARGET_OS_MACOS)
   UNREACHABLE();
 #else
-  GET_NON_NULL_NATIVE_ARGUMENT(String, argName, arguments->NativeArgAt(0));
+  GET_NON_NULL_NATIVE_ARGUMENT(String, lib_path, arguments->NativeArgAt(0));
 
   dlerror();  // Clear any errors.
-  void* handle = dlopen(LibraryPath(argName.ToCString()), RTLD_LAZY);
+  void* handle = dlopen(lib_path.ToCString(), RTLD_LAZY);
   if (handle == nullptr) {
     char* error = dlerror();
     const String& msg = String::Handle(
@@ -88,8 +51,8 @@
   void* handle = dlib.GetHandle();
 
   dlerror();  // Clear any errors.
-  uint8_t* pointer =
-      reinterpret_cast<uint8_t*>(dlsym(handle, argSymbolName.ToCString()));
+  intptr_t pointer =
+      reinterpret_cast<intptr_t>(dlsym(handle, argSymbolName.ToCString()));
   char* error;
   if ((error = dlerror()) != NULL) {
     const String& msg = String::Handle(
@@ -99,7 +62,8 @@
 
   // TODO(dacoharkes): should this return NULL if addres is 0?
   // https://github.com/dart-lang/sdk/issues/35756
-  RawPointer* result = Pointer::New(type_arg, pointer);
+  RawPointer* result =
+      Pointer::New(type_arg, Integer::Handle(zone, Integer::New(pointer)));
   return result;
 #endif
 }
diff --git a/runtime/lib/ffi_dynamic_library_patch.dart b/runtime/lib/ffi_dynamic_library_patch.dart
index db45805..29e8c88 100644
--- a/runtime/lib/ffi_dynamic_library_patch.dart
+++ b/runtime/lib/ffi_dynamic_library_patch.dart
@@ -7,9 +7,9 @@
 DynamicLibrary _open(String name) native "Ffi_dl_open";
 
 @patch
+@pragma("vm:entry-point")
 class DynamicLibrary {
   @patch
-  @pragma("vm:entry-point")
   factory DynamicLibrary.open(String name) {
     return _open(name);
   }
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index e22e8bf..876e6df 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -150,7 +150,7 @@
 
   void _setIndexed(int index, T value) native "GrowableList_setIndexed";
 
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   void add(T value) {
     var len = length;
     if (len == _capacity) {
diff --git a/runtime/lib/identical_patch.dart b/runtime/lib/identical_patch.dart
index 36607fb..7fa8959 100644
--- a/runtime/lib/identical_patch.dart
+++ b/runtime/lib/identical_patch.dart
@@ -9,5 +9,5 @@
 bool identical(Object a, Object b) native "Identical_comparison";
 
 @patch
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 int identityHashCode(Object object) => object._identityHashCode;
diff --git a/runtime/lib/internal_patch.dart b/runtime/lib/internal_patch.dart
index 83359ac..1b2bfe6 100644
--- a/runtime/lib/internal_patch.dart
+++ b/runtime/lib/internal_patch.dart
@@ -68,7 +68,7 @@
 
 bool _inquireIs64Bit() native "Internal_inquireIs64Bit";
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 @pragma("vm:exact-result-type", bool)
 bool _classRangeCheck(int cid, int lowerLimit, int upperLimit) {
   return cid >= lowerLimit && cid <= upperLimit;
@@ -99,13 +99,13 @@
 // function type arguments (may be null). The result is null if both input
 // vectors are null or is a newly allocated and canonicalized vector of length
 // 'totalLen'.
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 _prependTypeArguments(functionTypeArguments, parentTypeArguments, parentLen,
     totalLen) native "Internal_prependTypeArguments";
 
 // Check that a set of type arguments satisfy the type parameter bounds on a
 // closure.
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 _boundsCheckForPartialInstantiation(closure, typeArgs)
     native "Internal_boundsCheckForPartialInstantiation";
 
diff --git a/runtime/lib/invocation_mirror_patch.dart b/runtime/lib/invocation_mirror_patch.dart
index f982d3a..e7e2fe3 100644
--- a/runtime/lib/invocation_mirror_patch.dart
+++ b/runtime/lib/invocation_mirror_patch.dart
@@ -176,7 +176,7 @@
       this._positionalArguments, this._namedArguments, this._isSuperInvocation,
       [this._delayedTypeArgumentsLen = 0]);
 
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   static _allocateInvocationMirror(String functionName,
       List argumentsDescriptor, List arguments, bool isSuperInvocation,
       [int type = null]) {
@@ -189,7 +189,7 @@
   // indicate 0 type arguments, but the actual number of type arguments are
   // passed in `delayedTypeArgumentsLen`. If any type arguments are available,
   // the type arguments vector will be the first entry in `arguments`.
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   static _allocateInvocationMirrorForClosure(
       String functionName,
       List argumentsDescriptor,
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index a9a6a41..5e5c235 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -107,7 +107,7 @@
   _pendingImmediateCallback = callback;
 }
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 void _runPendingImmediateCallback() {
   if (_pendingImmediateCallback != null) {
     var callback = _pendingImmediateCallback;
@@ -124,7 +124,7 @@
 
 /// The embedder can execute this function to get hold of
 /// [_isolateScheduleImmediate] above.
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 Function _getIsolateScheduleImmediateClosure() {
   return _isolateScheduleImmediate;
 }
@@ -156,14 +156,14 @@
   _get_sendport() native "RawReceivePortImpl_get_sendport";
 
   // Called from the VM to retrieve the handler for a message.
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   static _lookupHandler(int id) {
     var result = _handlerMap[id];
     return result;
   }
 
   // Called from the VM to dispatch to the handler.
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   static void _handleMessage(Function handler, var message) {
     // TODO(floitsch): this relies on the fact that any exception aborts the
     // VM. Once we have non-fatal global exceptions we need to catch errors
@@ -197,7 +197,7 @@
 @pragma("vm:entry-point")
 class _SendPortImpl implements SendPort {
   /*--- public interface ---*/
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   void send(var message) {
     _sendInternal(message);
   }
@@ -227,7 +227,7 @@
  * initial message.  Defers execution of the entry point until the
  * isolate is in the message loop.
  */
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 void _startMainIsolate(Function entryPoint, List<String> args) {
   _startIsolate(
       null, // no parent port
@@ -245,7 +245,7 @@
  * once support for @pragma("vm:entry_point", "get") as documented in
  * https://github.com/dart-lang/sdk/issues/35720 lands.
  */
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 Function _getStartMainIsolateFunction() {
   return _startMainIsolate;
 }
@@ -254,7 +254,7 @@
  * Takes the real entry point as argument and invokes it with the initial
  * message.
  */
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 void _startIsolate(
     SendPort parentPort,
     Function entryPoint,
diff --git a/runtime/lib/lib_prefix.dart b/runtime/lib/lib_prefix.dart
index c895931..483a660 100644
--- a/runtime/lib/lib_prefix.dart
+++ b/runtime/lib/lib_prefix.dart
@@ -47,7 +47,7 @@
 var _outstandingLoadRequests = new List<List>();
 
 // Called from the VM when an outstanding load request has finished.
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 _completeDeferredLoads() {
   // Determine which outstanding load requests have completed and complete
   // their completer (with an error or true). For outstanding load requests
diff --git a/runtime/lib/map_patch.dart b/runtime/lib/map_patch.dart
index a604206..07dbc69 100644
--- a/runtime/lib/map_patch.dart
+++ b/runtime/lib/map_patch.dart
@@ -11,7 +11,7 @@
   // The keys are at position 2*n and are already type checked by the parser
   // in checked mode.
   // The values are at position 2*n+1 and are not yet type checked.
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   factory Map._fromLiteral(List elements) {
     var map = new LinkedHashMap<K, V>();
     var len = elements.length;
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 81ce5c3..d0e9f93 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -274,6 +274,8 @@
       ((is_ctor && func.is_redirecting()) << Mirrors::kRedirectingCtor);
   kind_flags |= ((is_ctor && func.IsFactory()) << Mirrors::kFactoryCtor);
   kind_flags |= (func.is_external() << Mirrors::kExternal);
+  bool is_synthetic = func.is_no_such_method_forwarder();
+  kind_flags |= (is_synthetic << Mirrors::kSynthetic);
   args.SetAt(5, Smi::Handle(Smi::New(kind_flags)));
 
   return CreateMirror(Symbols::_LocalMethodMirror(), args);
diff --git a/runtime/lib/mirrors.h b/runtime/lib/mirrors.h
index d6a5398..7a6fe4a 100644
--- a/runtime/lib/mirrors.h
+++ b/runtime/lib/mirrors.h
@@ -20,7 +20,8 @@
   V(kGenerativeCtor)                                                           \
   V(kRedirectingCtor)                                                          \
   V(kFactoryCtor)                                                              \
-  V(kExternal)
+  V(kExternal)                                                                 \
+  V(kSynthetic)
 
   // These offsets much be kept in sync with those in mirrors_impl.dart.
   enum KindShifts {
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index b11223b..0047640 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -1181,6 +1181,7 @@
   static const kRedirectingCtor = 6;
   static const kFactoryCtor = 7;
   static const kExternal = 8;
+  static const kSynthetic = 9;
 
   // These offsets much be kept in sync with those in mirrors.h.
   bool get isAbstract => 0 != (_kindFlags & (1 << kAbstract));
@@ -1194,6 +1195,7 @@
       0 != (_kindFlags & (1 << kRedirectingCtor));
   bool get isFactoryConstructor => 0 != (_kindFlags & (1 << kFactoryCtor));
   bool get isExternal => 0 != (_kindFlags & (1 << kExternal));
+  bool get isSynthetic => 0 != (_kindFlags & (1 << kSynthetic));
 
   static const _operators = const [
     "%", "&", "*", "+", "-", "/", "<", "<<", //
@@ -1216,7 +1218,6 @@
       _n(simpleName).startsWith('_') || _n(constructorName).startsWith('_');
 
   bool get isTopLevel => owner is LibraryMirror;
-  bool get isSynthetic => false;
 
   TypeMirror _returnType;
   TypeMirror get returnType {
diff --git a/runtime/lib/object_patch.dart b/runtime/lib/object_patch.dart
index 20e62c3..c6dbf5b 100644
--- a/runtime/lib/object_patch.dart
+++ b/runtime/lib/object_patch.dart
@@ -44,7 +44,7 @@
   static String _toString(obj) native "Object_toString";
 
   @patch
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   dynamic noSuchMethod(Invocation invocation) {
     // TODO(regis): Remove temp constructor identifier 'withInvocation'.
     throw new NoSuchMethodError.withInvocation(this, invocation);
@@ -54,21 +54,21 @@
   @pragma("vm:exact-result-type", "dart:core#_Type")
   Type get runtimeType native "Object_runtimeType";
 
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   @pragma("vm:exact-result-type", bool)
   static bool _haveSameRuntimeType(a, b) native "Object_haveSameRuntimeType";
 
   // Call this function instead of inlining instanceof, thus collecting
   // type feedback and reducing code size of unoptimized code.
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   bool _instanceOf(instantiatorTypeArguments, functionTypeArguments, type)
       native "Object_instanceOf";
 
   // Group of functions for implementing fast simple instance of.
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   bool _simpleInstanceOf(type) native "Object_simpleInstanceOf";
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   bool _simpleInstanceOfTrue(type) => true;
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   bool _simpleInstanceOfFalse(type) => false;
 }
diff --git a/runtime/lib/schedule_microtask_patch.dart b/runtime/lib/schedule_microtask_patch.dart
index 58e30e7..0f90f1e 100644
--- a/runtime/lib/schedule_microtask_patch.dart
+++ b/runtime/lib/schedule_microtask_patch.dart
@@ -21,12 +21,12 @@
   static _ScheduleImmediateClosure _closure;
 }
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 void _setScheduleImmediateClosure(_ScheduleImmediateClosure closure) {
   _ScheduleImmediate._closure = closure;
 }
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 void _ensureScheduleImmediate() {
   _AsyncRun._scheduleImmediate(_startMicrotaskLoop);
 }
diff --git a/runtime/lib/stopwatch_patch.dart b/runtime/lib/stopwatch_patch.dart
index 3e8a55c..87bc584 100644
--- a/runtime/lib/stopwatch_patch.dart
+++ b/runtime/lib/stopwatch_patch.dart
@@ -6,6 +6,8 @@
 
 @patch
 class Stopwatch {
+  static const _maxInt = 0x7FFFFFFFFFFFFFFF;
+
   @patch
   static void _initTicker() {
     if (_frequency == null) {
@@ -19,4 +21,36 @@
 
   // Returns the frequency of clock ticks in Hz.
   static int _computeFrequency() native "Stopwatch_frequency";
+
+  @patch
+  int get elapsedMicroseconds {
+    int ticks = elapsedTicks;
+    // Special case the more likely frequencies to avoid division,
+    // or divide by a known value.
+    if (_frequency == 1000000000) return ticks ~/ 1000;
+    if (_frequency == 1000000) return ticks;
+    if (_frequency == 1000) return ticks * 1000;
+    if (ticks <= (_maxInt ~/ 1000000)) {
+      return (ticks * 1000000) ~/ _frequency;
+    }
+    // Multiplication would have overflowed.
+    int ticksPerSecond = ticks ~/ _frequency;
+    int remainingTicks = ticks.remainder(_frequency);
+    return ticksPerSecond * 1000000 + (remainingTicks * 1000000) ~/ _frequency;
+  }
+
+  @patch
+  int get elapsedMilliseconds {
+    int ticks = elapsedTicks;
+    if (_frequency == 1000000000) return ticks ~/ 1000000;
+    if (_frequency == 1000000) return ticks ~/ 1000;
+    if (_frequency == 1000) return ticks;
+    if (ticks <= (_maxInt ~/ 1000)) {
+      return (ticks * 1000) ~/ _frequency;
+    }
+    // Multiplication would have overflowed.
+    int ticksPerSecond = ticks ~/ _frequency;
+    int remainingTicks = ticks.remainder(_frequency);
+    return ticksPerSecond * 1000 + (remainingTicks * 1000) ~/ _frequency;
+  }
 }
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index e90667a..0fcb35c 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -811,7 +811,7 @@
   }
 
   // Convert single object to string.
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   static String _interpolateSingle(Object o) {
     if (o is String) return o;
     final s = o.toString();
@@ -826,7 +826,7 @@
    * into a result string.
    * Modifies the input list if it contains non-`String` values.
    */
-  @pragma("vm:entry-point")
+  @pragma("vm:entry-point", "call")
   static String _interpolate(final List values) {
     final numValues = values.length;
     int totalLength = 0;
diff --git a/runtime/lib/timer_impl.dart b/runtime/lib/timer_impl.dart
index 01db53f..f6e85bd 100644
--- a/runtime/lib/timer_impl.dart
+++ b/runtime/lib/timer_impl.dart
@@ -462,7 +462,7 @@
   }
 }
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 _setupHooks() {
   VMLibraryHooks.timerFactory = _Timer._factory;
 }
diff --git a/runtime/observatory/tests/service/get_source_report_test.dart b/runtime/observatory/tests/service/get_source_report_test.dart
index 6b70552..eb8c14d 100644
--- a/runtime/observatory/tests/service/get_source_report_test.dart
+++ b/runtime/observatory/tests/service/get_source_report_test.dart
@@ -91,9 +91,9 @@
     final numRanges = coverage['ranges'].length;
     expect(coverage['type'], equals('SourceReport'));
 
-    // Running in app_jitk mode will result in the number of ranges being 10
-    // during the training run and 11 when running from the snapshot.
-    expect(((numRanges == 10) || (numRanges == 11)), isTrue);
+    // Running in app_jitk mode will result in the number of ranges being 9
+    // during the training run and 10 when running from the snapshot.
+    expect(((numRanges == 9) || (numRanges == 10)), isTrue);
     expect(coverage['ranges'][0], equals(expectedRange));
     expect(coverage['scripts'].length, 1);
     expect(
@@ -108,7 +108,7 @@
     };
     coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
     expect(coverage['type'], equals('SourceReport'));
-    expect(coverage['ranges'].length, numRanges + 3);
+    expect(coverage['ranges'].length, numRanges + 2);
     expect(allRangesCompiled(coverage), isTrue);
 
     // One function
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 0dfd620..6171827 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -5,6 +5,16 @@
 #ifndef RUNTIME_PLATFORM_GLOBALS_H_
 #define RUNTIME_PLATFORM_GLOBALS_H_
 
+#if __cplusplus >= 201703L            // C++17
+#define FALL_THROUGH [[fallthrough]]  // NOLINT
+#elif defined(__GNUC__) && __GNUC__ >= 7
+#define FALL_THROUGH __attribute__((fallthrough));
+#elif defined(__clang__)
+#define FALL_THROUGH [[clang::fallthrough]]  // NOLINT
+#else
+#define FALL_THROUGH ((void)0)
+#endif
+
 // __STDC_FORMAT_MACROS has to be defined before including <inttypes.h> to
 // enable platform independent printf format specifiers.
 #ifndef __STDC_FORMAT_MACROS
diff --git a/runtime/platform/text_buffer.cc b/runtime/platform/text_buffer.cc
index b1ef63a..ec42113 100644
--- a/runtime/platform/text_buffer.cc
+++ b/runtime/platform/text_buffer.cc
@@ -135,12 +135,7 @@
 void TextBuffer::EnsureCapacity(intptr_t len) {
   intptr_t remaining = buf_size_ - msg_len_;
   if (remaining <= len) {
-    const int kBufferSpareCapacity = 64;  // Somewhat arbitrary.
-    // TODO(turnidge): do we need to guard against overflow or other
-    // security issues here? Text buffers are used by the debugger
-    // to send user-controlled data (e.g. values of string variables) to
-    // the debugger front-end.
-    intptr_t new_size = buf_size_ + len + kBufferSpareCapacity;
+    intptr_t new_size = buf_size_ + Utils::Maximum(buf_size_, len);
     char* new_buf = reinterpret_cast<char*>(realloc(buf_, new_size));
     if (new_buf == NULL) {
       OUT_OF_MEMORY();
diff --git a/runtime/platform/utils.cc b/runtime/platform/utils.cc
index 205cafc..ee982dc 100644
--- a/runtime/platform/utils.cc
+++ b/runtime/platform/utils.cc
@@ -78,10 +78,10 @@
   switch (size) {
     case 3:
       hash ^= cursor[2] << 16;
-      /* Falls through. */
+      FALL_THROUGH;
     case 2:
       hash ^= cursor[1] << 8;
-      /* Falls through. */
+      FALL_THROUGH;
     case 1:
       hash ^= cursor[0];
       hash *= M;
diff --git a/runtime/tests/vm/dart/null_checks_with_dwarf_stack_traces_test.dart b/runtime/tests/vm/dart/null_checks_with_dwarf_stack_traces_test.dart
new file mode 100644
index 0000000..e8dfe76
--- /dev/null
+++ b/runtime/tests/vm/dart/null_checks_with_dwarf_stack_traces_test.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--dwarf-stack-traces
+
+// This test verifies that null checks are handled correctly
+// with --dwarf-stack-traces option (dartbug.com/35851).
+
+import "package:expect/expect.dart";
+
+class A {
+  void foo() {
+    Expect.fail('A.foo should not be reachable');
+  }
+
+  dynamic get bar {
+    Expect.fail('A.bar should not be reachable');
+  }
+
+  set bazz(int x) {
+    Expect.fail('A.bazz should not be reachable');
+  }
+}
+
+A myNull;
+double doubleNull;
+int intNull;
+
+main(List<String> args) {
+  // Make sure value of `myNull` is not a compile-time null and
+  // devirtualization happens.
+  if (args.length > 42) {
+    myNull = new A();
+    doubleNull = 3.14;
+    intNull = 2;
+  }
+
+  Expect.throws(() => myNull.foo(), (e) => e is NoSuchMethodError);
+
+  Expect.throws(() => myNull.foo, (e) => e is NoSuchMethodError);
+
+  Expect.throws(() => myNull.bar, (e) => e is NoSuchMethodError);
+
+  Expect.throws(() => myNull.bar(), (e) => e is NoSuchMethodError);
+
+  Expect.throws(() {
+    myNull.bazz = 3;
+  }, (e) => e is NoSuchMethodError);
+
+  Expect.throws(() => doubleNull + 2.17, (e) => e is NoSuchMethodError);
+
+  Expect.throws(() => 9.81 - doubleNull, (e) => e is NoSuchMethodError);
+
+  Expect.throws(() => intNull * 7, (e) => e is NoSuchMethodError);
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 4e33a68..a56a92eb 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -39,22 +39,6 @@
 dart/redirection_type_shuffling_test/none: RuntimeError
 dart/snapshot_version_test: RuntimeError
 
-[ $compiler == dart2js ]
-dart/byte_array_optimized_test: Skip # compilers not aware of byte arrays
-dart/byte_array_test: Skip # compilers not aware of byte arrays
-dart/error_messages_in_null_checks_test: SkipByDesign # Dart2js throws NullError exceptions with different messages.
-dart/inline_stack_frame_test: Skip # Issue 7953, Methods can be missing in dart2js stack traces due to inlining. Also when minifying they can be renamed, which is issue 7953.
-dart/issue32950_test: SkipByDesign # uses isolates.
-dart/optimized_stacktrace_line_and_column_test: RuntimeError # The source positions do not match with dart2js.
-dart/optimized_stacktrace_line_test: RuntimeError # The source positions do not match with dart2js.
-dart/redirection_type_shuffling_test: Skip # Depends on lazy enforcement of type bounds
-dart/simd128float32_array_test: Skip # compilers not aware of Simd128
-dart/simd128float32_test: Skip # compilers not aware of Simd128
-dart/truncating_ints_test: SkipByDesign # The test requires int64.
-dart/wrap_around_in_range_analysis_test: SkipByDesign # The test requires int64.
-dart/regress_range_analysis_shift_test: SkipByDesign # The test requires int64.
-dart/fuzz3608420507_regression_test: SkipByDesign # Not relevant to dart2js.
-
 [ $compiler != dartk || ($arch != x64 && $arch != simarm && $arch != arm) || $hot_reload || $hot_reload_rollback ]
 dart/entrypoints/jit/*: SkipByDesign  # Only supported in the Dart 2 JIT and AOT, and test optimizations - hence disabled on hotreload bots.
 
@@ -87,8 +71,7 @@
 dart/data_uri_import_test/badencodeddate: CompileTimeError
 
 [ $compiler == precompiler ]
-dart/byte_array_test: Skip # Incompatible flag --disable_alloc_stubs_after_gc
-vm/dart/error_stacktrace_test: Skip # Dart 1 AOT to be retired soon.
+dart/byte_array_test: SkipByDesign # Incompatible flag --disable_alloc_stubs_after_gc
 
 [ $mode == debug ]
 cc/CorelibIsolateStartup: SkipByDesign # This is a benchmark that is not informative in debug mode.
@@ -104,10 +87,7 @@
 cc/CorelibIsolateStartup: Timeout, Pass
 
 [ $runtime != vm ]
-dart/hello_fuchsia_test: SkipByDesign # This is a test for fuchsia OS
-dart/snapshot_version_test: SkipByDesign # Spawns processes
-dart/spawn_infinite_loop_test: SkipByDesign # VM shutdown test
-dart/spawn_shutdown_test: SkipByDesign # VM Shutdown test
+dart/*: SkipByDesign # VM specific tests
 
 [ $runtime != dart_precompiled  || $system == android ]
 dart/bare_instructions_trampolines_test: SkipByDesign # This test is for VM AOT only (android fails due to listing interfaces).
@@ -129,6 +109,12 @@
 cc/GenKernelKernelMaxRSS: Skip  # Issue 34393.
 dart/appjit_bytecode_simple_test: Skip  # Issue 34393.
 
+[ $arch == simarm || $arch == simarm64 || $arch == simdbc || $arch == simdbc64 || $arch == ia32 || $arch == arm ]
+cc/GenKernelKernelLoadKernel: SkipByDesign  # No interpreter support.
+cc/GenKernelKernelReadAllBytecode: SkipByDesign  # No interpreter support.
+cc/GenKernelKernelCombined: SkipByDesign  # No interpreter support.
+cc/GenKernelKernelMaxRSS: SkipByDesign  # No interpreter support.
+
 [ !$strong ]
 dart/callee_side_type_checks_test: SkipByDesign
 
@@ -146,10 +132,6 @@
 [ $builder_tag == asan && $mode == debug && ($runtime == dart_precompiled || $runtime == vm) ]
 cc/Dart2JSCompileAll: SkipSlow # Timeout.
 
-[ ($compiler == dartk || $compiler == dartkb) && $mode == debug && $runtime == vm ]
-cc/PrintJSON: Crash
-cc/Service_TokenStream: Crash
-
 # Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
 # batch mode.
@@ -158,7 +140,6 @@
 
 [ ($compiler == dartk || $compiler == dartkb) && $mode == release && $runtime == vm ]
 cc/CorelibIsolateStartup: Timeout, Pass
-cc/Service_TokenStream: Fail
 
 [ ($compiler == dartk || $compiler == dartkb) && $runtime == vm ]
 cc/Class_ComputeEndTokenPos: Crash
@@ -174,20 +155,6 @@
 cc/Debugger_SetBreakpointInPartOfLibrary: Crash
 cc/IsolateReload_NotTypedefToTypedef: Fail
 cc/IsolateReload_TypedefToNotTypedef: Fail
-cc/SourceReport_CallSites_PolymorphicCall: Fail
-cc/SourceReport_CallSites_SimpleCall: Fail
-cc/SourceReport_Coverage_AllFunctions: Fail
-cc/SourceReport_Coverage_AllFunctions_ForceCompile: Fail
-cc/SourceReport_Coverage_ForceCompile: Fail
-cc/SourceReport_Coverage_NestedFunctions: Fail
-cc/SourceReport_Coverage_NoCalls: Fail
-cc/SourceReport_Coverage_RestrictedRange: Fail
-cc/SourceReport_Coverage_SimpleCall: Fail
-cc/SourceReport_Coverage_UnusedClass_ForceCompile: Fail
-cc/SourceReport_Coverage_UnusedClass_ForceCompileError: Crash
-cc/SourceReport_Coverage_UnusedClass_NoForceCompile: Fail
-cc/SourceReport_MultipleReports: Fail
-cc/SourceReport_PossibleBreakpoints_Simple: Fail
 dart/data_uri_import_test/utf16: MissingRuntimeError
 dart/spawn_shutdown_test: SkipSlow
 
@@ -250,32 +217,32 @@
 # up with the real Dart stack trace and hence we don't get correct
 # symbol names.
 [ $arch == simarm || $arch == simarm64 || $arch == simarmv5te || $arch == simarmv6 || $arch == simdbc || $arch == simdbc64 ]
-cc/LargeMap: Skip
-cc/Profiler_AllocationSampleTest: Skip
-cc/Profiler_ArrayAllocation: Skip
-cc/Profiler_BasicSourcePosition: Skip
-cc/Profiler_BasicSourcePositionOptimized: Skip
-cc/Profiler_BinaryOperatorSourcePosition: Skip
-cc/Profiler_BinaryOperatorSourcePositionOptimized: Skip
-cc/Profiler_ChainedSamples: Skip
-cc/Profiler_ClosureAllocation: Skip
-cc/Profiler_CodeTicks: Skip
-cc/Profiler_ContextAllocation: Skip
-cc/Profiler_FunctionInline: Skip
-cc/Profiler_FunctionTicks: Skip
-cc/Profiler_GetSourceReport: Skip
-cc/Profiler_InliningIntervalBoundry: Skip
-cc/Profiler_IntrinsicAllocation: Skip
-cc/Profiler_SampleBufferIterateTest: Skip
-cc/Profiler_SampleBufferWrapTest: Skip
-cc/Profiler_SourcePosition: Skip
-cc/Profiler_SourcePositionOptimized: Skip
-cc/Profiler_StringAllocation: Skip
-cc/Profiler_StringInterpolation: Skip
-cc/Profiler_ToggleRecordAllocation: Skip
-cc/Profiler_TrivialRecordAllocation: Skip
-cc/Profiler_TypedArrayAllocation: Skip
-cc/Service_Profile: Skip
+cc/LargeMap: SkipByDesign
+cc/Profiler_AllocationSampleTest: SkipByDesign
+cc/Profiler_ArrayAllocation: SkipByDesign
+cc/Profiler_BasicSourcePosition: SkipByDesign
+cc/Profiler_BasicSourcePositionOptimized: SkipByDesign
+cc/Profiler_BinaryOperatorSourcePosition: SkipByDesign
+cc/Profiler_BinaryOperatorSourcePositionOptimized: SkipByDesign
+cc/Profiler_ChainedSamples: SkipByDesign
+cc/Profiler_ClosureAllocation: SkipByDesign
+cc/Profiler_CodeTicks: SkipByDesign
+cc/Profiler_ContextAllocation: SkipByDesign
+cc/Profiler_FunctionInline: SkipByDesign
+cc/Profiler_FunctionTicks: SkipByDesign
+cc/Profiler_GetSourceReport: SkipByDesign
+cc/Profiler_InliningIntervalBoundry: SkipByDesign
+cc/Profiler_IntrinsicAllocation: SkipByDesign
+cc/Profiler_SampleBufferIterateTest: SkipByDesign
+cc/Profiler_SampleBufferWrapTest: SkipByDesign
+cc/Profiler_SourcePosition: SkipByDesign
+cc/Profiler_SourcePositionOptimized: SkipByDesign
+cc/Profiler_StringAllocation: SkipByDesign
+cc/Profiler_StringInterpolation: SkipByDesign
+cc/Profiler_ToggleRecordAllocation: SkipByDesign
+cc/Profiler_TrivialRecordAllocation: SkipByDesign
+cc/Profiler_TypedArrayAllocation: SkipByDesign
+cc/Service_Profile: SkipByDesign
 
 [ $arch == simdbc || $arch == simdbc64 ]
 cc/GuardFieldConstructor2Test: Skip # TODO(vegorov) Field guards are disabled for SIMDBC
@@ -287,7 +254,7 @@
 cc/RegExp_ExternalTwoByteString: Skip # TODO(vegorov) These tests don't seem to work if FLAG_interpret_irregexp is switched on by default because they attempt to call regexp functions directly instead of going through JSSyntaxRegExp_ExecuteMatch.
 cc/RegExp_OneByteString: Skip # TODO(vegorov) These tests don't seem to work if FLAG_interpret_irregexp is switched on by default because they attempt to call regexp functions directly instead of going through JSSyntaxRegExp_ExecuteMatch.
 cc/RegExp_TwoByteString: Skip # TODO(vegorov) These tests don't seem to work if FLAG_interpret_irregexp is switched on by default because they attempt to call regexp functions directly instead of going through JSSyntaxRegExp_ExecuteMatch.
-cc/RegenerateAllocStubs: Skip # This test is meaningless for DBC as allocation stubs are not used.
+cc/RegenerateAllocStubs: SkipByDesign # This test is meaningless for DBC as allocation stubs are not used.
 
 [ $arch == simdbc || $arch == simdbc64 || $compiler == dartkb ]
 dart/generic_field_invocation_test: SkipByDesign # DBC and KBC interpreters do not support --no_lazy_dispatchers
@@ -321,9 +288,6 @@
 dart/spawn_shutdown_test: Skip # We can shutdown an isolate before it reloads.
 dart/stack_overflow_shared_test: SkipSlow # Too slow with --shared-slow-path-triggers-gc flag and not relevant outside precompiled.
 
-[ ($runtime == vm || $runtime == dart_precompiled) && !$preview_dart_2 ]
-*:SkipByDesign # Deprecating all Dart1 modes of execution
-
 [ $builder_tag == obfuscated && $compiler == dartkp ]
 dart/optimized_stacktrace_line_and_column_test: SkipByDesign # Looks for filenames in stacktrace output
 dart/optimized_stacktrace_line_test: SkipByDesign # Looks for filenames in stacktrace output
diff --git a/runtime/tools/dartfuzz/dartfuzz.dart b/runtime/tools/dartfuzz/dartfuzz.dart
index 9843383..12f1d93 100644
--- a/runtime/tools/dartfuzz/dartfuzz.dart
+++ b/runtime/tools/dartfuzz/dartfuzz.dart
@@ -12,10 +12,10 @@
 // Version of DartFuzz. Increase this each time changes are made
 // to preserve the property that a given version of DartFuzz yields
 // the same fuzzed program for a deterministic random seed.
-const String version = '1.3';
+const String version = '1.4';
 
 // Restriction on statement and expression depths.
-const int stmtDepth = 5;
+const int stmtDepth = 2;
 const int exprDepth = 2;
 
 // Naming conventions.
@@ -33,6 +33,7 @@
     // Initialize program variables.
     rand = new Random(seed);
     indent = 0;
+    nest = 0;
     currentClass = null;
     currentMethod = null;
     // Setup the types.
@@ -52,6 +53,7 @@
     assert(currentClass == null);
     assert(currentMethod == null);
     assert(indent == 0);
+    assert(nest == 0);
     assert(localVars.length == 0);
   }
 
@@ -223,6 +225,15 @@
     return false;
   }
 
+  // Emit a throw statement.
+  bool emitThrow() {
+    DartType tp = getType();
+    emitLn('throw ', newline: false);
+    emitExpr(0, tp);
+    emit(';', newline: true);
+    return false;
+  }
+
   // Emit a one-way if statement.
   bool emitIf1(int depth) {
     emitLn('if (', newline: false);
@@ -258,12 +269,113 @@
     emitSmallPositiveInt();
     emit('; $localName$i++) {', newline: true);
     indent += 2;
+    nest++;
     localVars.add(DartType.INT);
-    bool b = emitStatements(depth + 1);
+    emitStatements(depth + 1);
     localVars.removeLast();
+    nest--;
     indent -= 2;
     emitLn('}');
-    return b;
+    return true;
+  }
+
+  // Emit a simple membership for-in-loop.
+  bool emitForIn(int depth) {
+    int i = localVars.length;
+    emitLn('for (var $localName$i in ', newline: false);
+    emitExpr(0, DartType.INT_LIST);
+    emit(') {', newline: true);
+    indent += 2;
+    nest++;
+    localVars.add(DartType.INT);
+    emitStatements(depth + 1);
+    localVars.removeLast();
+    nest--;
+    indent -= 2;
+    emitLn('}');
+    return true;
+  }
+
+  // Emit a while-loop.
+  bool emitWhile(int depth) {
+    int i = localVars.length;
+    emitLn('{ int $localName$i = ', newline: false);
+    emitSmallPositiveInt();
+    emit(';', newline: true);
+    indent += 2;
+    emitLn('while (--$localName$i > 0) {');
+    indent += 2;
+    nest++;
+    localVars.add(DartType.INT);
+    emitStatements(depth + 1);
+    localVars.removeLast();
+    nest--;
+    indent -= 2;
+    emitLn('}');
+    indent -= 2;
+    emitLn('}');
+    return true;
+  }
+
+  // Emit a do-while-loop.
+  bool emitDoWhile(int depth) {
+    int i = localVars.length;
+    emitLn('{ int $localName$i = 0;');
+    indent += 2;
+    emitLn('do {');
+    indent += 2;
+    nest++;
+    localVars.add(DartType.INT);
+    emitStatements(depth + 1);
+    localVars.removeLast();
+    nest--;
+    indent -= 2;
+    emitLn('} while (++$localName$i < ', newline: false);
+    emitSmallPositiveInt();
+    emit(');', newline: true);
+    indent -= 2;
+    emitLn('}');
+    return true;
+  }
+
+  // Emit a break/continue when inside iteration.
+  bool emitBreakOrContinue(int depth) {
+    if (nest > 0) {
+      switch (rand.nextInt(2)) {
+        case 0:
+          emitLn('continue;');
+          return false;
+        default:
+          emitLn('break;');
+          return false;
+      }
+    }
+    return emitAssign(); // resort to assignment
+  }
+
+  // Emit a switch statement.
+  bool emitSwitch(int depth) {
+    emitLn('switch (', newline: false);
+    emitExpr(0, DartType.INT);
+    emit(') {', newline: true);
+    int start = rand.nextInt(1 << 32);
+    int step = 1 + rand.nextInt(10);
+    for (int i = 0; i < 2; i++, start += step) {
+      indent += 2;
+      if (i == 2) {
+        emitLn('default: {');
+      } else {
+        emitLn('case $start: {');
+      }
+      indent += 2;
+      emitStatements(depth + 1);
+      indent -= 2;
+      emitLn('}');
+      emitLn('break;'); // always generate, avoid FE complaints
+      indent -= 2;
+    }
+    emitLn('}');
+    return true;
   }
 
   // Emit a new program scope that introduces a new local variable.
@@ -278,11 +390,31 @@
     localVars.removeLast();
     indent -= 2;
     emitLn('}');
-    return b;
+    return true;
   }
 
-  // Emit a statement. Returns true if code may fall-through.
-  // TODO: add many more constructs
+  // Emit try/catch/finally.
+  bool emitTryCatch(int depth) {
+    emitLn('try {');
+    indent += 2;
+    emitStatements(depth + 1);
+    indent -= 2;
+    emitLn('} catch (e) {');
+    indent += 2;
+    emitStatements(depth + 1);
+    indent -= 2;
+    if (rand.nextInt(2) == 0) {
+      emitLn('} finally {');
+      indent += 2;
+      emitStatements(depth + 1);
+      indent -= 2;
+    }
+    emitLn('}');
+    return true;
+  }
+
+  // Emit a statement. Returns true if code *may* fall-through
+  // (not made too advanced to avoid FE complaints).
   bool emitStatement(int depth) {
     // Throw in a comment every once in a while.
     if (rand.nextInt(10) == 0) {
@@ -293,20 +425,34 @@
       return emitAssign();
     }
     // Possibly nested statement.
-    switch (rand.nextInt(8)) {
+    switch (rand.nextInt(16)) {
       // Favors assignment.
       case 0:
-        return emitIf1(depth);
-      case 1:
-        return emitIf2(depth);
-      case 2:
-        return emitFor(depth);
-      case 3:
-        return emitScope(depth);
-      case 4:
         return emitPrint();
-      case 5:
+      case 1:
         return emitReturn();
+      case 2:
+        return emitThrow();
+      case 3:
+        return emitIf1(depth);
+      case 4:
+        return emitIf2(depth);
+      case 5:
+        return emitFor(depth);
+      case 6:
+        return emitForIn(depth);
+      case 7:
+        return emitWhile(depth);
+      case 8:
+        return emitDoWhile(depth);
+      case 9:
+        return emitBreakOrContinue(depth);
+      case 10:
+        return emitSwitch(depth);
+      case 11:
+        return emitScope(depth);
+      case 12:
+        return emitTryCatch(depth);
       default:
         return emitAssign();
     }
@@ -908,6 +1054,7 @@
   // Program variables.
   Random rand;
   int indent;
+  int nest;
   int currentClass;
   int currentMethod;
 
diff --git a/runtime/tools/dartfuzz/dartfuzz_test.dart b/runtime/tools/dartfuzz/dartfuzz_test.dart
index 148f19e..e90bbae 100644
--- a/runtime/tools/dartfuzz/dartfuzz_test.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_test.dart
@@ -27,7 +27,6 @@
 
 /// Command runner.
 TestResult runCommand(List<String> cmd, Map<String, String> env) {
-  // TODO: use Dart API for some of the modes?
   ProcessResult res = Process.runSync(
       'timeout', ['-s', '$sigkill', '$timeout'] + cmd,
       environment: env);
diff --git a/runtime/tools/dartfuzz/dartfuzz_values.dart b/runtime/tools/dartfuzz/dartfuzz_values.dart
index c97249d..163fc4c 100644
--- a/runtime/tools/dartfuzz/dartfuzz_values.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_values.dart
@@ -4,7 +4,7 @@
 
 /// Class that represents some common Dart types.
 ///
-/// TODO(ajcbik): generalize
+/// TODO(ajcbik): generalize Dart types
 ///
 class DartType {
   final String name;
diff --git a/runtime/tools/graphexplorer/graphexplorer.css b/runtime/tools/graphexplorer/graphexplorer.css
new file mode 100644
index 0000000..c3d78f3
--- /dev/null
+++ b/runtime/tools/graphexplorer/graphexplorer.css
@@ -0,0 +1,67 @@
+/*
+Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+*/
+
+.actionCell {
+    cursor: pointer;
+}
+.actionCell:hover {
+    text-decoration: underline;
+}
+
+.headerRow {
+    font-weight: bold;
+    background-color: #BBBBBB;
+}
+
+.nameCell {
+    flex-basis: 0px;
+    flex-grow: 3;
+    overflow: hidden;
+    white-space: nowrap;
+    padding: 5;
+}
+
+.edgeCell {
+    flex-basis: 0px;
+    flex-grow: 2;
+    overflow: hidden;
+    white-space: nowrap;
+    padding: 5;
+}
+
+.classCell {
+    flex-basis: 0px;
+    flex-grow: 1;
+    overflow: hidden;
+    white-space: nowrap;
+    padding: 5;
+}
+
+.sizeCell {
+    flex-basis: 7em;
+    flex-grow: 0;
+    text-align: right;
+    padding: 5;
+}
+
+.sizePercentCell {
+    flex-basis: 2.5em;
+    flex-grow: 0;
+    text-align: right;
+    padding: 5;
+    color: gray;
+}
+
+.treemapTile {
+    position: absolute;
+    box-sizing: border-box;
+    border: solid 1px;
+    font-size: 10;
+    text-align: center;
+    overflow: hidden;
+    white-space: nowrap;
+    cursor: default;
+}
diff --git a/runtime/tools/graphexplorer/graphexplorer.html b/runtime/tools/graphexplorer/graphexplorer.html
new file mode 100644
index 0000000..4ca288a
--- /dev/null
+++ b/runtime/tools/graphexplorer/graphexplorer.html
@@ -0,0 +1,14 @@
+<!--
+Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+-->
+<html>
+  <head>
+    <title>Graph Explorer</title>
+    <link rel="stylesheet" type="text/css" href="graphexplorer.css">
+  </head>
+  <body>
+    <script src="graphexplorer.js"></script>
+  </body>
+</html>
diff --git a/runtime/tools/graphexplorer/graphexplorer.js b/runtime/tools/graphexplorer/graphexplorer.js
new file mode 100644
index 0000000..9b6132b
--- /dev/null
+++ b/runtime/tools/graphexplorer/graphexplorer.js
@@ -0,0 +1,1455 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO:
+//  - starting dominator treemap from a group of nodes instead of only a
+//    single node
+
+"use strict";
+
+function Graph() {
+  // Create all slots up front to prevent V8 map transitions.
+
+  // We extensively use parallel arrays instead of objects like
+  //
+  // function Vertex {
+  //   this.size = 0;
+  //   this.successors = new Array();
+  //   this.predecessors = new Array();
+  //   this.semi = 0;
+  //   this.dom = 0;
+  //   this.label = 0;
+  //   this.parent = 0;
+  //   this.ancestor = 0;
+  // }
+  //
+  // This avoids GC work in V8, and it allows us to release the memory for
+  // intermediate values that are only needed while computing the dominators.
+
+  // Inputs.
+  this.N_ = 0;  // Number of nodes.
+  this.E_ = 0;  // Number of edges.
+  this.strings_ = null;
+  this.name_ = null;
+  this.class_ = null;
+  this.shallowSize_ = null;
+  this.firstSuccessor_ = null;
+  this.successors_ = null;
+  this.successorName_ = null;
+
+  // Outputs.
+  this.shallowSizeSum_ = 0;
+  this.firstPredecessor_ = null;
+  this.predecessors_ = null;
+  this.predecessorName_ = null;
+  this.retainedSize_ = null;
+  this.dom_ = null;
+  this.domHead_ = null;
+  this.domNext_ = null;
+
+  // Intermediates.
+  this.Nconnected_ = 0;  // Number of nodes reachable from root.
+  this.vertex_ = null;
+  this.semi_ = null;
+  this.parent_ = null;
+  this.ancestor_ = null;
+  this.label_ = null;
+  this.bucket_ = null;
+
+  // Recycled memory.
+  this.mark_ = null;
+  this.stack_ = null;
+}
+
+// Load a graph in V8 heap profile format from `data`, then compute the graph's
+// dominator tree and the retained size of each vertex.
+//
+// If `rewriteForOwners` is true, for each vertex that has an "owner" edge,
+// replace all edges to the vertex with an edge from the owner to the vertex.
+// This can be the graph more hierachical and reveal more structure in the
+// dominator tree.
+Graph.prototype.loadV8Profile = function(data, rewriteForOwners) {
+  console.log("Building successors...");
+
+  const N = data.snapshot.node_count;
+  const E = data.snapshot.edge_count;
+
+  const firstSuccessor = new Uint32Array(N + 2);
+  const successors = new Uint32Array(E);
+  const successorName = new Uint32Array(E);
+
+  const name = new Uint32Array(N + 1);
+  const clazz = new Array(N + 1);
+  const shallowSize = new Uint32Array(N + 1);
+  let shallowSizeSum = 0;
+
+  const node_stride = data.snapshot.meta.node_fields.length;
+  const node_type_offset = data.snapshot.meta.node_fields.indexOf("type");
+  const node_name_offset = data.snapshot.meta.node_fields.indexOf("name");
+  const node_id_offset = data.snapshot.meta.node_fields.indexOf("id");
+  const node_size_offset = data.snapshot.meta.node_fields.indexOf("self_size");
+  const node_edge_count_offset = data.snapshot.meta.node_fields.indexOf("edge_count");
+
+  const edge_stride = data.snapshot.meta.edge_fields.length;
+  const edge_type_offset = data.snapshot.meta.edge_fields.indexOf("type");
+  const edge_name_or_index_offset = data.snapshot.meta.edge_fields.indexOf("name_or_index");
+  const edge_target_offset = data.snapshot.meta.edge_fields.indexOf("to_node");
+  const edge_type_property = data.snapshot.meta.edge_types[0].indexOf("property");
+
+  let nextSuccessorIndex = 0;
+  let edge_cursor = 0;
+  let i = 1;
+  for (let node_cursor = 0;
+       node_cursor < data.nodes.length;
+       node_cursor += node_stride) {
+    let type = data.nodes[node_cursor + node_type_offset];
+    let node_name = data.nodes[node_cursor + node_name_offset];
+    let id = data.nodes[node_cursor + node_id_offset];
+    let self_size = data.nodes[node_cursor + node_size_offset];
+    let edge_count = data.nodes[node_cursor + node_edge_count_offset];
+
+    name[i] = node_name;
+    clazz[i] = data.snapshot.meta.node_types[0][type];
+    shallowSize[i] = self_size;
+    shallowSizeSum += self_size;
+    firstSuccessor[i] = nextSuccessorIndex;
+
+    for (let j = 0; j < edge_count; j++) {
+      let edge_type = data.edges[edge_cursor + edge_type_offset];
+      let edge_name_or_index = data.edges[edge_cursor + edge_name_or_index_offset];
+      let edge_to_node = (data.edges[edge_cursor + edge_target_offset] / node_stride) + 1;
+      edge_cursor += edge_stride;
+
+      if (edge_to_node < 1 || edge_to_node > N) {
+        throw "Invalid edge target";
+      }
+
+      successors[nextSuccessorIndex] = edge_to_node;
+
+      if (edge_type == edge_type_property) {
+        successorName[nextSuccessorIndex] = edge_name_or_index;
+      }
+
+      nextSuccessorIndex++;
+    }
+
+    i++;
+  }
+  firstSuccessor[N + 1] = nextSuccessorIndex;
+
+  if (i != (N + 1)) {
+    throw "Incorrect node_count!";
+  }
+  if (nextSuccessorIndex != E) {
+    throw "Incorrect edge_count!";
+  }
+
+  // Free memory.
+  data["nodes"] = null;
+  data["edges"] = null;
+
+  this.N_ = N;
+  this.E_ = E;
+  this.strings_ = data.strings;
+  this.firstSuccessor_ = firstSuccessor;
+  this.successorName_ = successorName;
+  this.successors_ = successors;
+  this.name_ = name;
+  this.class_ = clazz;
+  this.shallowSize_ = shallowSize;
+  this.shallowSizeSum_ = shallowSizeSum;
+
+  this.computePredecessors();
+  if (rewriteForOwners) {
+    this.rewriteEdgesForOwners();
+  }
+  this.computePreorder(1);
+  this.computeDominators();
+  this.computeRetainedSizes();
+  this.linkDominatorChildren();
+
+  this.mark_ = new Uint8Array(N + 1);
+  this.stack_ = new Uint32Array(E);
+};
+
+Graph.prototype.computePredecessors = function() {
+  console.log("Building predecessors...");
+
+  const N = this.N_;
+  const E = this.E_;
+  const firstSuccessor = this.firstSuccessor_;
+  const successors = this.successors_;
+  const successorName = this.successorName_;
+  const firstPredecessor = new Uint32Array(N + 2);
+  const predecessors = new Uint32Array(E);
+  const predecessorName = new Uint32Array(E);
+
+  const predecessorCount = new Uint32Array(N + 1);
+  for (let i = 1; i <= N; i++) {
+    let firstSuccessorIndex = firstSuccessor[i];
+    let lastSuccessorIndex = firstSuccessor[i + 1];
+    for (let successorIndex = firstSuccessorIndex;
+       successorIndex < lastSuccessorIndex;
+       successorIndex++) {
+      let successor = successors[successorIndex];
+      predecessorCount[successor]++;
+    }
+  }
+
+  let nextPredecessorIndex = 0;
+  for (let i = 1; i <= N; i++) {
+    firstPredecessor[i] = nextPredecessorIndex;
+    nextPredecessorIndex += predecessorCount[i];
+  }
+  firstPredecessor[N + 1] = nextPredecessorIndex;
+  if (nextPredecessorIndex != E) {
+    throw "Mismatched edges";
+  }
+
+  for (let i = 1; i <= N; i++) {
+    let firstSuccessorIndex = firstSuccessor[i];
+    let lastSuccessorIndex = firstSuccessor[i + 1];
+    for (let successorIndex = firstSuccessorIndex;
+       successorIndex < lastSuccessorIndex;
+       successorIndex++) {
+      let successor = successors[successorIndex];
+      let count = --predecessorCount[successor];
+      let predecessorIndex = firstPredecessor[successor] + count;
+      predecessors[predecessorIndex] = i;
+      predecessorName[predecessorIndex] = successorName[successorIndex];
+    }
+  }
+
+  this.firstPredecessor_ = firstPredecessor;
+  this.predecessors_ = predecessors;
+  this.predecessorName_ = predecessorName;
+};
+
+Graph.prototype.rewriteEdgesForOwners = function() {
+  console.log("Rewriting edges for owners...");
+
+  // Rewrite some edges to make the graph more hierarchical.
+  // If there is an edge A.owner -> B,
+  //   - remove all edges to A, and
+  //   - add edge B.<unnamed> -> A.
+
+  const N = this.N_;
+  const E = this.E_;
+  const firstSuccessor = this.firstSuccessor_;
+  const successors = this.successors_;
+  const successorName = this.successorName_;
+  const firstPredecessor = this.firstPredecessor_;
+  const predecessors = this.predecessors_;
+  const predecessorName = this.predecessorName_;
+  const owners = new Uint32Array(N + 1);
+  const owneeCount = new Uint32Array(N + 1);
+
+  // Identify owner.
+  for (let i = 1; i <= N; i++) {
+    let cls = this.class_[i];
+    let ownerEdgeName;
+
+    if (cls == "Class") {
+      ownerEdgeName = "library_";
+    } else if (cls == "PatchClass") {
+      ownerEdgeName = "patched_class_";
+    } else if (cls == "Function") {
+      ownerEdgeName = "owner_";
+    } else if (cls == "Field") {
+      ownerEdgeName = "owner_";
+    } else if (cls == "Code") {
+      ownerEdgeName = "owner_";
+    } else if (cls == "ICData") {
+      ownerEdgeName = "owner_";
+    } else {
+      continue;
+    }
+
+    let firstSuccessorIndex = firstSuccessor[i];
+    let lastSuccessorIndex = firstSuccessor[i + 1];
+    for (let successorIndex = firstSuccessorIndex;
+         successorIndex < lastSuccessorIndex;
+         successorIndex++) {
+      let edge = this.strings_[this.successorName_[successorIndex]];
+      if (edge == ownerEdgeName) {
+        let owner = successors[successorIndex];
+        owners[i] = owner;
+        owneeCount[owner]++;
+        break;
+      }
+    }
+  }
+
+  // Remove successors if the target has an owner.
+  // Allocate space for extra successors added to owners.
+  const newSuccessors = new Uint32Array(E);
+  const newSuccessorName = new Uint32Array(E);
+  let newSuccessorIndex = 0;
+  for (let i = 1; i <= N; i++) {
+    let firstSuccessorIndex = firstSuccessor[i];
+    let lastSuccessorIndex = firstSuccessor[i + 1];
+    firstSuccessor[i] = newSuccessorIndex;
+    for (let successorIndex = firstSuccessorIndex;
+         successorIndex < lastSuccessorIndex;
+         successorIndex++) {
+      let successor = successors[successorIndex];
+      let name = successorName[successorIndex];
+
+      if (owners[successor] != 0) {
+        // Drop successor.
+      } else {
+        newSuccessors[newSuccessorIndex] = successor;
+        newSuccessorName[newSuccessorIndex] = name;
+        newSuccessorIndex++;
+      }
+    }
+    newSuccessorIndex += owneeCount[i];
+  }
+  firstSuccessor[N + 1] = newSuccessorIndex;
+
+  // Remove predecessors if the target has an owner.
+  // Add the owner as a predecessor.
+  // Add extra successors for owner.
+  for (let i = 1; i <= N; i++) {
+    let owner = owners[i];
+    if (owner == 0) {
+      continue;
+    }
+
+    let firstPredecessorIndex = firstPredecessor[i];
+    let lastPredecessorIndex = firstPredecessor[i + 1];
+    for (let predecessorIndex = firstPredecessorIndex;
+         predecessorIndex < lastPredecessorIndex;
+         predecessorIndex++) {
+      predecessors[predecessorIndex] = 0;
+    }
+    predecessors[firstPredecessorIndex] = owner;
+
+    let nextSuccessorIndex = firstSuccessor[owner + 1] - owneeCount[owner];
+    newSuccessors[nextSuccessorIndex] = i;
+    owneeCount[owner]--;
+  }
+
+  this.successors_ = newSuccessors;
+  this.successorName_ = newSuccessorName;
+};
+
+// Thomas Lengauer and Robert Endre Tarjan. 1979. A fast algorithm for finding
+// dominators in a flowgraph. ACM Trans. Program. Lang. Syst. 1, 1 (January
+// 1979), 121-141. DOI: https://doi.org/10.1145/357062.357071
+
+Graph.prototype.computePreorder = function(root) {
+  console.log("Computing preorder...");
+
+  // Lengauer and Tarjan Step 1.
+  const N = this.N_;
+  const firstSuccessor = this.firstSuccessor_;
+  const successors = this.successors_;
+
+  const semi = new Uint32Array(N + 1);
+  const vertex = new Uint32Array(N + 1);
+  const ancestor = new Uint32Array(N + 1);
+  const parent = new Uint32Array(N + 1);
+  const label = new Uint32Array(N + 1);
+
+  let preorderNumber = 0;
+
+  let stackNodes = new Uint32Array(N + 1);
+  let stackEdges = new Uint32Array(N + 1);
+  let stackTop = 0;
+
+  // Push root.
+  preorderNumber++;
+  vertex[preorderNumber] = root;
+  semi[root] = preorderNumber;
+  label[root] = root;
+  ancestor[root] = 0;
+  stackNodes[stackTop] = root;
+  stackEdges[stackTop] = firstSuccessor[root];
+
+  while (stackTop >= 0) {
+    let v = stackNodes[stackTop];
+    let e = stackEdges[stackTop];
+
+    if (e < firstSuccessor[v + 1]) {
+      // Visit next successor.
+      let w = successors[e];
+      e++;
+      stackEdges[stackTop] = e;
+
+      if (semi[w] == 0) {
+        parent[w] = v;
+
+        preorderNumber++;
+        vertex[preorderNumber] = w;
+        semi[w] = preorderNumber;
+        label[w] = w;
+        ancestor[w] = 0;
+
+        // Push successor.
+        stackTop++;
+        stackNodes[stackTop] = w;
+        stackEdges[stackTop] = firstSuccessor[w];
+      }
+    } else {
+      // No more successors: pop.
+      stackTop--;
+    }
+  }
+
+  this.Nconnected_ = preorderNumber;
+  if (this.Nconnected_ != N) {
+    console.log("Graph is not fully connected: " + this.Nconnected_ +
+          " nodes are reachable, but graph has " + this.N_ + " nodes");
+  }
+
+  this.semi_ = semi;
+  this.vertex_ = vertex;
+  this.ancestor_ = ancestor;
+  this.parent_ = parent;
+  this.label_ = label;
+};
+
+Graph.prototype.computeDominators = function() {
+  console.log("Computing dominator tree...");
+
+  const N = this.N_;
+  const Nconnected = this.Nconnected_;
+  const firstPredecessor = this.firstPredecessor_;
+  const predecessors = this.predecessors_;
+  const vertex = this.vertex_;
+  const semi = this.semi_;
+  const bucket = new Array(N + 1);
+  const parent = this.parent_;
+  const dom = new Uint32Array(N + 1);
+
+  for (let i = Nconnected; i > 1; i--) {
+    let w = vertex[i];
+
+    // Lengauer and Tarjan Step 2.
+    let firstPredecessorIndex = firstPredecessor[w];
+    let lastPredecessorIndex = firstPredecessor[w + 1];
+    for (let predecessorIndex = firstPredecessorIndex;
+         predecessorIndex < lastPredecessorIndex;
+         predecessorIndex++) {
+      let v = predecessors[predecessorIndex];
+
+      if (semi[v] == 0) {
+        // The predecessor was not reachable from the root: ignore
+        // this edge.
+        continue;
+      }
+
+      let u = this.forestEval(v);
+      if (semi[u] < semi[w]) {
+        semi[w] = semi[u]
+      }
+    }
+
+    let z = vertex[semi[w]];
+    let b = bucket[z];
+    if (b == null) {
+      b = new Array();
+      bucket[z] = b;
+    }
+    b.push(w);
+    this.forestLink(parent[w], w);
+
+    // Lengauer and Tarjan Step 3.
+    z = parent[w];
+    b = bucket[z];
+    bucket[z] = null;
+    if (b != null) {
+      for (let j = 0; j < b.length; j++) {
+        let v = b[j];
+        let u = this.forestEval(v);
+        dom[v] = semi[u] < semi[v] ? u : parent[w];
+      }
+    }
+  }
+
+  this.ancestor_ = null;
+  this.label_ = null;
+  this.parent_ = null;
+  this.bucket_ = null;
+
+  // Lengauer and Tarjan Step 4.
+  for (let i = 2; i <= Nconnected; i++) {
+    let w = vertex[i];
+    if (dom[w] != vertex[semi[w]]) {
+      dom[w] = dom[dom[w]];
+    }
+  }
+  dom[vertex[1]] = 0;
+
+  this.semi_ = null;
+  this.dom_ = dom;
+};
+
+Graph.prototype.forestCompress = function(v) {
+  const ancestor = this.ancestor_;
+  if (ancestor[ancestor[v]] != 0) {
+    this.forestCompress(ancestor[v]);
+    const semi = this.semi_;
+    const label = this.label_;
+    if (semi[label[ancestor[v]]] < semi[label[v]]) {
+      label[v] = label[ancestor[v]];
+    }
+    ancestor[v] = ancestor[ancestor[v]];
+  }
+};
+
+Graph.prototype.forestEval = function(v) {
+  if (this.ancestor_[v] == 0) {
+    return v;
+  } else {
+    this.forestCompress(v);
+    return this.label_[v];
+  }
+};
+
+Graph.prototype.forestLink = function(v, w) {
+  this.ancestor_[w] = v;
+};
+
+Graph.prototype.computeRetainedSizes = function() {
+  console.log("Computing retained sizes...");
+
+  const N = this.N_;
+  const Nconnected = this.Nconnected_;
+  const vertex = this.vertex_;
+  const dom = this.dom_;
+  const shallowSize = this.shallowSize_;
+  const retainedSize = new Uint32Array(N + 1);
+
+  let shallowSum = 0;
+
+  for (let i = 1; i <= Nconnected; i++) {
+    let w = vertex[i];
+    let shallow = shallowSize[w];
+    retainedSize[w] = shallow;
+    shallowSum += shallow;
+  }
+
+  for (let i = Nconnected; i > 1; i--) {
+    let w = vertex[i];
+    retainedSize[dom[w]] += retainedSize[w];
+  }
+
+  if (retainedSize[vertex[1]] != shallowSum) {
+    console.log("Retained size mismatch: root retains " + retainedSize[vertex[1]] +
+                " but shallow sizes sum to " + shallowSum);
+  }
+
+  this.retainedSize_ = retainedSize;
+};
+
+Graph.prototype.linkDominatorChildren = function() {
+  console.log("Linking dominator tree children...");
+
+  const N = this.N_;
+  const Nconnected = this.Nconnected_;
+
+  const vertex = this.vertex_;
+  const dom = this.dom_;
+  const head = new Uint32Array(N + 1);
+  const next = new Uint32Array(N + 1);
+
+  for (let i = 2; i <= Nconnected; i++) {
+    let child = vertex[i];
+    let parent = dom[child];
+    next[child] = head[parent];
+    head[parent] = child;
+  }
+
+  this.domHead_ = head;
+  this.domNext_ = next;
+};
+
+Graph.prototype.getTotalSize = function() {
+  return this.shallowSizeSum_;
+};
+
+Graph.prototype.getRoot = function() {
+  return this.vertex_[1];
+};
+
+Graph.prototype.getAll = function() {
+  let nodes = new Array();
+  for (let v = 1; v <= this.N_; v++) {
+    nodes.push(v);
+  }
+  return nodes;
+};
+
+function removeDuplicates(array) {
+  let set = new Set(array);
+  let result = new Array();
+  for (let element of set) {
+    result.push(element);
+  }
+  return result
+}
+
+Graph.prototype.successorsOfDo = function(v, action) {
+  let cls = this.class_[v];
+  let firstSuccessorIndex = this.firstSuccessor_[v];
+  let lastSuccessorIndex = this.firstSuccessor_[v + 1];
+  for (let successorIndex = firstSuccessorIndex;
+     successorIndex < lastSuccessorIndex;
+     successorIndex++) {
+    let successor = this.successors_[successorIndex];
+    let edgeName = this.strings_[this.successorName_[successorIndex]];
+    action(successor, cls + "::" + edgeName);
+  }
+}
+
+Graph.prototype.predecessorsOfDo = function(v, action) {
+  let firstPredecessorIndex = this.firstPredecessor_[v];
+  let lastPredecessorIndex = this.firstPredecessor_[v + 1];
+  for (let predecessorIndex = firstPredecessorIndex;
+     predecessorIndex < lastPredecessorIndex;
+     predecessorIndex++) {
+    let predecessor = this.predecessors_[predecessorIndex];
+    let cls = this.class_[predecessor];
+    let edgeName = this.strings_[this.predecessorName_[predecessorIndex]];
+    action(predecessor, cls + "::" + edgeName);
+  }
+}
+
+Graph.prototype.dominatorChildrenOfDo = function(v, action) {
+  for (let w = this.domHead_[v]; w != 0; w = this.domNext_[w]) {
+    action(w);
+  }
+};
+
+Graph.prototype.nameOf = function(v) {
+  return this.strings_[this.name_[v]];
+};
+
+Graph.prototype.classOf = function(v) {
+  return this.class_[v];
+};
+
+Graph.prototype.shallowSizeOf = function(v) {
+  return this.shallowSize_[v];
+};
+
+Graph.prototype.retainedSizeOf = function(v) {
+  return this.retainedSize_[v];
+};
+
+Graph.prototype.shallowSizeOfSet = function(nodes) {
+  let sum = 0;
+  for (let i = 0; i < nodes.length; i++) {
+    sum += this.shallowSize_[nodes[i]];
+  }
+  return sum;
+};
+
+Graph.prototype.retainedSizeOfSet = function(nodes) {
+  const N = this.N_;
+  const E = this.E_;
+  const mark = this.mark_;
+  const stack = this.stack_;
+
+  for (let i = 1; i <= N; i++) {
+    mark[i] = 0;
+  }
+
+  for (let i = 0; i < nodes.length; i++) {
+    let v = nodes[i];
+    mark[v] = 1;
+  }
+
+  let scan = 0;
+  let top = 0;
+  stack[top++] = 1;
+
+  while (scan < top) {
+    let v = stack[scan++];
+    let firstSuccessorIndex = this.firstSuccessor_[v];
+    let lastSuccessorIndex = this.firstSuccessor_[v + 1];
+    for (let successorIndex = firstSuccessorIndex;
+       successorIndex < lastSuccessorIndex;
+       successorIndex++) {
+      let successor = this.successors_[successorIndex];
+      if (mark[successor] == 0) {
+        mark[successor] = 1;
+        stack[top++] = successor;
+      }
+    }
+  }
+
+
+  for (let i = 0; i < nodes.length; i++) {
+    let v = nodes[i];
+    mark[v] = 0;
+  }
+  for (let i = 0; i < nodes.length; i++) {
+    let v = nodes[i];
+    if (mark[v] == 0) {
+      mark[v] = 1;
+      stack[top++] = v;
+    }
+  }
+
+  let sum = 0;
+  while (scan < top) {
+    let v = stack[scan++];
+    sum += this.shallowSize_[v];
+    let firstSuccessorIndex = this.firstSuccessor_[v];
+    let lastSuccessorIndex = this.firstSuccessor_[v + 1];
+    for (let successorIndex = firstSuccessorIndex;
+       successorIndex < lastSuccessorIndex;
+       successorIndex++) {
+      let successor = this.successors_[successorIndex];
+      if (mark[successor] == 0) {
+        mark[successor] = 1;
+        stack[top++] = successor;
+      }
+    }
+  }
+  return sum;
+};
+
+function hash(string) {
+  // Jenkin's one_at_a_time.
+  let h = string.length;
+  for (let i = 0; i < string.length; i++) {
+    h += string.charCodeAt(i);
+    h += h << 10;
+    h ^= h >> 6;
+  }
+  h += h << 3;
+  h ^= h >> 11;
+  h += h << 15;
+  return h;
+}
+
+function color(string) {
+  let hue = hash(string) % 360;
+  return "hsl(" + hue + ",60%,60%)";
+}
+
+function prettySize(size) {
+  if (size < 1024) return size + "B";
+  size /= 1024;
+  if (size < 1024) return size.toFixed(1) + "KiB";
+  size /= 1024;
+  if (size < 1024) return size.toFixed(1) + "MiB";
+  size /= 1024;
+  return size.toFixed(1) + "GiB";
+}
+
+function prettyPercent(fraction) {
+  return (fraction * 100).toFixed(1);
+}
+
+function createTreemapTile(v, width, height, depth) {
+  let div = document.createElement("div");
+  div.className = "treemapTile";
+  div.style["background-color"] = color(graph.classOf(v));
+  div.ondblclick = function(event) {
+    event.stopPropagation();
+    if (depth == 0) {
+      let dom = graph.dom_[v];
+      if (dom == 0) {
+        // Already at root.
+      } else {
+        showDominatorTree(dom);  // Zoom out.
+      }
+    } else {
+      showDominatorTree(v);  // Zoom in.
+    }
+  };
+  div.oncontextmenu = function(event) {
+    event.stopPropagation();
+    event.preventDefault();
+    showTables([v]);
+  };
+
+  let left = 0;
+  let top = 0;
+
+  const kPadding = 5;
+  const kBorder = 1;
+  left += kPadding - kBorder;
+  top += kPadding - kBorder;
+  width -= 2 * kPadding;
+  height -= 2 * kPadding;
+
+  div.title =
+    graph.nameOf(v) +
+    " \nclass: " + graph.classOf(v) +
+    " \nretained: " + graph.retainedSizeOf(v) +
+    " \nshallow: " + graph.shallowSizeOf(v);
+
+  if (width < 10 || height < 10) {
+    // Too small: don't render label or children.
+    return div;
+  }
+
+  let label = graph.nameOf(v) + " [" + prettySize(graph.retainedSizeOf(v)) + "]";
+  div.appendChild(document.createTextNode(label));
+  const kLabelHeight = 9;
+  top += kLabelHeight;
+  height -= kLabelHeight;
+
+  if (depth > 2) {
+    // Too deep: don't render children.
+    return div;
+  }
+  if (width < 4 || height < 4) {
+    // Too small: don't render children.
+    return div;
+  }
+
+  let children = new Array();
+  graph.dominatorChildrenOfDo(v, function(c) {
+    // Size 0 children seem to confuse the layout algorithm (accumulating
+    // rounding errors?).
+    if (graph.retainedSizeOf(c) > 0) {
+      children.push(c);
+    }
+  });
+  children.sort(function (a, b) {
+    return graph.retainedSizeOf(b) - graph.retainedSizeOf(a);
+  });
+
+  const scale = width * height / graph.retainedSizeOf(v);
+
+  // Bruls M., Huizing K., van Wijk J.J. (2000) Squarified Treemaps. In: de
+  // Leeuw W.C., van Liere R. (eds) Data Visualization 2000. Eurographics.
+  // Springer, Vienna.
+  for (let rowStart = 0;  // Index of first child in the next row.
+       rowStart < children.length;) {
+    // Prefer wider rectangles, the better to fit text labels.
+    const GOLDEN_RATIO = 1.61803398875;
+    let verticalSplit = (width / height) > GOLDEN_RATIO;
+
+    let space;
+    if (verticalSplit) {
+      space = height;
+    } else {
+      space = width;
+    }
+
+    let rowMin = graph.retainedSizeOf(children[rowStart]) * scale;
+    let rowMax = rowMin;
+    let rowSum = 0;
+    let lastRatio = 0;
+
+    let rowEnd;  // One after index of last child in the next row.
+    for (rowEnd = rowStart; rowEnd < children.length; rowEnd++) {
+      let size = graph.retainedSizeOf(children[rowEnd]) * scale;
+      if (size < rowMin) rowMin = size;
+      if (size > rowMax) rowMax = size;
+      rowSum += size;
+
+      let ratio = Math.max((space * space * rowMax) / (rowSum * rowSum),
+                           (rowSum * rowSum) / (space * space * rowMin));
+      if ((lastRatio != 0) && (ratio > lastRatio)) {
+        // Adding the next child makes the aspect ratios worse: remove it and
+        // add the row.
+        rowSum -= size;
+        break;
+      }
+      lastRatio = ratio;
+    }
+
+    let rowLeft = left;
+    let rowTop = top;
+    let rowSpace = rowSum / space;
+
+    for (let i = rowStart; i < rowEnd; i++) {
+      let child = children[i];
+      let size = graph.retainedSizeOf(child) * scale;
+
+      let childWidth;
+      let childHeight;
+      if (verticalSplit) {
+        childWidth = rowSpace;
+        childHeight = size / childWidth;
+      } else {
+        childHeight = rowSpace;
+        childWidth = size / childHeight;
+      }
+
+      let childDiv = createTreemapTile(child, childWidth, childHeight, depth + 1);
+      childDiv.style.left = rowLeft + "px";
+      childDiv.style.top = rowTop + "px";
+      // Oversize the final div by kBorder to make the borders overlap.
+      childDiv.style.width = (childWidth + kBorder) + "px";
+      childDiv.style.height = (childHeight + kBorder) + "px";
+      div.appendChild(childDiv);
+
+      if (verticalSplit)
+        rowTop += childHeight;
+      else
+        rowLeft += childWidth;
+    }
+
+    if (verticalSplit) {
+      left += rowSpace;
+      width -= rowSpace;
+    } else {
+      top += rowSpace;
+      height -= rowSpace;
+    }
+
+    rowStart = rowEnd;
+  }
+
+  return div;
+}
+
+function showDominatorTree(v) {
+  let header = document.createElement("div");
+  header.textContent = "Dominator Tree";
+  header.title =
+    "Double click a box to zoom in.\n" +
+    "Double click the outermost box to zoom out.\n" +
+    "Right click a box to view successor and predecessor tables.";
+  header.className = "headerRow";
+  header.style["flex-grow"] = 0;
+  header.style["padding"] = 5;
+  header.style["border-bottom"] = "solid 1px";
+
+  let content = document.createElement("div");
+  content.style["flex-basis"] = 0;
+  content.style["flex-grow"] = 1;
+
+  let column = document.createElement("div");
+  column.style["width"] = "100%";
+  column.style["height"] = "100%";
+  column.style["border"] = "solid 2px";
+  column.style["display"] = "flex";
+  column.style["flex-direction"] = "column";
+  column.appendChild(header);
+  column.appendChild(content);
+
+  setBody(column);
+
+  // Add the content div to the document first so the browser will calculate
+  // the available width and height.
+  let w = content.offsetWidth;
+  let h = content.offsetHeight;
+
+  let topTile = createTreemapTile(v, w, h, 0);
+  topTile.style.width = w;
+  topTile.style.height = h;
+  topTile.style.border = "none";
+  content.appendChild(topTile);
+}
+
+function Group(edge, cls) {
+  this.name = "";
+  this.edge = edge;
+  this.cls = cls;
+  this.shallowSize = 0;
+  this.retainedSize = 0;
+  this.nodes = new Array();
+}
+
+Group.prototype.add = function(v, edge, cls) {
+  this.nodes.push(v);
+  if (this.edge != edge) {
+    this.edge = "<multiple>";
+  }
+  if (this.cls != cls) {
+    this.cls = "<multiple>"
+  }
+};
+
+function asGroupsByClass(labeledNodes) {
+  let map = new Map();
+  let groups = new Array();
+  for (let i = 0; i < labeledNodes.length; i++) {
+    let v = labeledNodes[i].node;
+    let edge = labeledNodes[i].name;
+    let cls = graph.classOf(v);
+    let group = map.get(cls);
+    if (group === undefined) {
+      group = new Group(edge, cls);
+      groups.push(group);
+      map.set(cls, group);
+    }
+    group.add(v, edge, cls);
+  }
+  for (let i = 0; i < groups.length; i++) {
+    let group = groups[i];
+    group.shallowSize = graph.shallowSizeOfSet(group.nodes);
+    group.retainedSize = graph.retainedSizeOfSet(group.nodes);
+    group.name = group.nodes.length + " instances of " + group.cls;
+  }
+  return groups;
+}
+
+function LabeledNode(node, name) {
+  this.node = node;
+  this.name = name;
+}
+
+LabeledNode.prototype.addName = function(name) {
+  if (this.name != name) {
+    this.name = "<multiple>";
+  }
+};
+
+function Table(title, labeledNodes, byEdges) {
+  const self = this;
+
+  this.title = title;
+  this.labeledNodes = labeledNodes;
+  this.groupsByEdge = byEdges;
+  this.groupsByClass = asGroupsByClass(labeledNodes);
+  this.grouping = 0;
+
+  this.nom = document.createElement("span");
+  this.nom.onclick = function() {
+    self.grouping = (self.grouping + 1) % 3;
+    self.refreshRows();
+  };
+  this.nom.className = "nameCell actionCell"
+  this.nom.textContent = title;
+  this.nom.title = "Toggle grouping by object, class or edge";
+
+  let edge = document.createElement("span");
+  edge.onclick = function() { self.sortByEdge(); };
+  edge.className = "edgeCell actionCell";
+  edge.textContent = "Edge";
+  edge.title = "Sort by edge";
+
+  let cls = document.createElement("span");
+  cls.onclick = function() { self.sortByClass(); };
+  cls.className = "classCell actionCell";
+  cls.textContent = "Class";
+  cls.title = "Sort by class";
+
+  let shallowSize = document.createElement("span");
+  shallowSize.onclick = function() { self.sortByShallowSize(); };
+  shallowSize.className = "sizeCell actionCell";
+  shallowSize.textContent = "Size";
+  shallowSize.title = "Sort by shallow size";
+
+  let shallowPercent = document.createElement("span");
+  shallowPercent.className = "sizePercentCell"
+
+  let retainedSize = document.createElement("span");
+  retainedSize.onclick = function() { self.sortByRetainedSize(); };
+  retainedSize.className = "sizeCell actionCell";
+  retainedSize.textContent = "Retained Size";
+  retainedSize.title = "Sort by retained size";
+
+  let retainedPercent = document.createElement("span");
+  retainedPercent.className = "sizePercentCell";
+
+  let header = document.createElement("div");
+  header.className = "headerRow";
+  header.style["display"] = "flex";
+  header.style["flex-direction"] = "row";
+  header.style["border-bottom"] = "solid 1px";
+  header.appendChild(this.nom);
+  header.appendChild(edge);
+  header.appendChild(cls);
+  header.appendChild(shallowSize);
+  header.appendChild(shallowPercent);
+  header.appendChild(retainedSize);
+  header.appendChild(retainedPercent);
+
+  this.listDiv = document.createElement("div");
+  this.listDiv.style["overflow-y"] = "scroll";
+  this.listDiv.style["flex-basis"] = "0px";
+  this.listDiv.style["flex-grow"] = 1;
+
+  this.div = document.createElement("div");
+  this.div.style["border"] = "solid 2px";
+  this.div.style["display"] = "flex";
+  this.div.style["flex-direction"] = "column";
+  this.div.style["background-color"] = "#DDDDDD";
+
+  this.div.appendChild(header);
+  this.div.appendChild(this.listDiv);
+
+  this.refreshRows();
+}
+
+Table.prototype.sortByEdge = function() {
+  this.labeledNodes.sort(function (a, b) {
+    return a.name.localeCompare(b.name);
+  });
+  this.groupsByEdge.sort(function (a, b) {
+    return a.edge.localeCompare(b.edge);
+  });
+  this.groupsByClass.sort(function (a, b) {
+    return a.edge.localeCompare(b.edge);
+  });
+  this.refreshRows();
+};
+
+Table.prototype.sortByClass = function() {
+  this.labeledNodes.sort(function (a, b) {
+    return graph.classOf(a.node).localeCompare(graph.classOf(b.node));
+  });
+  this.groupsByEdge.sort(function (a, b) {
+    return a.cls.localeCompare(b.cls);
+  });
+  this.groupsByClass.sort(function (a, b) {
+    return a.cls.localeCompare(b.cls);
+  });
+  this.refreshRows();
+};
+
+Table.prototype.sortByShallowSize = function() {
+  this.labeledNodes.sort(function (a, b) {
+    return graph.shallowSizeOf(b.node) - graph.shallowSizeOf(a.node);
+  });
+  this.groupsByEdge.sort(function (a, b) {
+    return b.shallowSize - a.shallowSize;
+  });
+  this.groupsByClass.sort(function (a, b) {
+    return b.shallowSize - a.shallowSize;
+  });
+  this.refreshRows();
+};
+
+Table.prototype.sortByRetainedSize = function() {
+  this.labeledNodes.sort(function (a, b) {
+    return graph.retainedSizeOf(b.node) - graph.retainedSizeOf(a.node);
+  });
+  this.groupsByEdge.sort(function (a, b) {
+    return b.retainedSize - a.retainedSize;
+  });
+  this.groupsByClass.sort(function (a, b) {
+    return b.retainedSize - a.retainedSize;
+  });
+  this.refreshRows();
+};
+
+Table.prototype.refreshRows = function() {
+  while (this.listDiv.firstChild) {
+    this.listDiv.removeChild(this.listDiv.firstChild);
+  }
+
+  // To prevent rendering lag.
+  const MAX_TABLE_ROWS = 500;
+
+  if (this.grouping == 0) {
+    let labeledNodes = this.labeledNodes;
+    this.nom.textContent = this.title + " (" + labeledNodes.length + " objects)";
+
+    for (let i = 0; i < labeledNodes.length; i++) {
+      if (i > MAX_TABLE_ROWS) {
+        this.listDiv.appendChild(document.createTextNode((labeledNodes.length - i) + " more objects"));
+        break;
+      }
+      this.listDiv.appendChild(createObjectRow(labeledNodes[i]));
+    }
+  } else if (this.grouping == 1) {
+    let groups = this.groupsByClass;
+    this.nom.textContent = this.title + " (" + groups.length + " classes)";
+
+    for (let i = 0; i < groups.length; i++) {
+      if (i > MAX_TABLE_ROWS) {
+        // Prevent rendering lag.
+        this.listDiv.appendChild(document.createTextNode((groups.length - i) + " more classes"));
+        break;
+      }
+      this.listDiv.appendChild(createGroupRow(groups[i]));
+    }
+  } else {
+    let groups = this.groupsByEdge;
+    this.nom.textContent = this.title + " (" + groups.length + " edges)";
+
+    for (let i = 0; i < groups.length; i++) {
+      if (i > MAX_TABLE_ROWS) {
+        // Prevent rendering lag.
+        this.listDiv.appendChild(document.createTextNode((groups.length - i) + " more edges"));
+        break;
+      }
+      this.listDiv.appendChild(createGroupRow(groups[i]));
+    }
+  }
+};
+
+function createObjectRow(labeledNode) {
+  const v = labeledNode.node;
+
+  let nom = document.createElement("span");
+  nom.onclick = function() { showTables([v]); }
+  nom.className = "nameCell actionCell";
+  nom.textContent = graph.nameOf(v);
+  nom.title = "Select this object";
+
+  let edge = document.createElement("span");
+  edge.className = "edgeCell";
+  edge.textContent = labeledNode.name;
+
+  let cls = document.createElement("span");
+  cls.className = "classCell";
+  cls.textContent = graph.classOf(v);
+
+  let shallowSize = document.createElement("span");
+  shallowSize.className = "sizeCell";
+  shallowSize.textContent = graph.shallowSizeOf(v);
+
+  let shallowPercent = document.createElement("span");
+  shallowPercent.className = "sizePercentCell";
+  shallowPercent.textContent = prettyPercent(graph.shallowSizeOf(v) / graph.getTotalSize());
+
+  let retainedSize = document.createElement("span");
+  retainedSize.onclick = function(event) { showDominatorTree(v); };
+  retainedSize.className = "sizeCell actionCell";
+  retainedSize.textContent = graph.retainedSizeOf(v);
+  retainedSize.title = "Show dominator tree";
+
+  let retainedPercent = document.createElement("span");
+  retainedPercent.onclick = function(event) { showDominatorTree(v); };
+  retainedPercent.className = "sizePercentCell actionCell";
+  retainedPercent.textContent = prettyPercent(graph.retainedSizeOf(v) / graph.getTotalSize());
+  retainedPercent.title = "Show dominator tree";
+
+  let row = document.createElement("div");
+  row.style["display"] = "flex";
+  row.style["flex-direction"] = "row";
+  row.style["border-bottom"] = "solid 1px";
+  row.appendChild(nom);
+  row.appendChild(edge);
+  row.appendChild(cls);
+  row.appendChild(shallowSize);
+  row.appendChild(shallowPercent);
+  row.appendChild(retainedSize);
+  row.appendChild(retainedPercent);
+  return row;
+}
+
+function createGroupRow(g) {
+  let nom = document.createElement("span");
+  nom.onclick = function() { showTables(g.nodes); }
+  nom.className = "nameCell actionCell";
+  nom.textContent = g.name;
+  nom.title = "Select these objects";
+
+  let cls = document.createElement("span");
+  cls.className = "classCell";
+  cls.textContent = g.cls;
+
+  let edge = document.createElement("span");
+  edge.className = "edgeCell";
+  edge.textContent = g.edge;
+
+  let shallowSize = document.createElement("span");
+  shallowSize.className = "sizeCell";
+  shallowSize.textContent = g.shallowSize;
+
+  let shallowPercent = document.createElement("span");
+  shallowPercent.className = "sizePercentCell";
+  shallowPercent.textContent = prettyPercent(g.shallowSize / graph.getTotalSize());
+
+  let retainedSize = document.createElement("span");
+  retainedSize.className = "sizeCell";
+  retainedSize.textContent = g.retainedSize;
+
+  let retainedPercent = document.createElement("span");
+  retainedPercent.className = "sizePercentCell";
+  retainedPercent.textContent = prettyPercent(g.retainedSize / graph.getTotalSize());
+
+  let row = document.createElement("div");
+  row.style["display"] = "flex";
+  row.style["flex-direction"] = "row";
+  row.style["border-bottom"] = "solid 1px";
+  row.appendChild(nom);
+  row.appendChild(edge);
+  row.appendChild(cls);
+  row.appendChild(shallowSize);
+  row.appendChild(shallowPercent);
+  row.appendChild(retainedSize);
+  row.appendChild(retainedPercent);
+  return row;
+}
+
+function mapValuesToArray(map) {
+  let array = new Array();
+  for (let element of map.values()) {
+    array.push(element);
+  }
+  return array;
+}
+
+function showTables(nodes) {
+  let labeledNodes = new Array();
+  let successors = new Map();
+  let successorEdges = new Map();
+  let successorEdgeGroups = new Array();
+  let predecessors = new Map();
+  let predecessorEdges = new Map();
+  let predecessorEdgeGroups = new Array();
+  for (let i = 0; i < nodes.length; i++) {
+    let n = nodes[i];
+    labeledNodes.push(new LabeledNode(n, "-"));
+    graph.successorsOfDo(n, function (child, edgeName) {
+      let e = successors.get(child);
+      if (e) {
+        e.addName(edgeName);
+      } else {
+        successors.set(child, new LabeledNode(child, edgeName));
+      }
+      let cls = graph.classOf(child);
+      let g = successorEdges.get(edgeName);
+      if (!g) {
+        g = new Group(edgeName, cls);
+        successorEdgeGroups.push(g);
+        successorEdges.set(edgeName, g);
+      }
+      g.add(child, edgeName, cls);
+    });
+    graph.predecessorsOfDo(n, function (parent, edgeName) {
+      let e = predecessors.get(parent);
+      if (e) {
+        e.addName(edgeName);
+      } else {
+        predecessors.set(parent, new LabeledNode(parent, edgeName));
+      }
+      let cls = graph.classOf(parent);
+      let g = predecessorEdges.get(edgeName);
+      if (!g) {
+        g = new Group(edgeName, cls);
+        predecessorEdgeGroups.push(g);
+        predecessorEdges.set(edgeName, g);
+      }
+      g.add(parent, edgeName, cls);
+    });
+  }
+
+  // Computing retained sizes here O((C + E) * N) where
+  //   N is the number of objects
+  //   C is the number of classes
+  //   E is the number of edges
+  successors = mapValuesToArray(successors);
+  for (let i = 0; i < successorEdgeGroups.length; i++) {
+    let group = successorEdgeGroups[i];
+    group.nodes = removeDuplicates(group.nodes);
+    group.shallowSize = graph.shallowSizeOfSet(group.nodes);
+    group.retainedSize = graph.retainedSizeOfSet(group.nodes);
+    group.name = group.nodes.length + " targets of " + group.edge;
+  }
+  predecessors = mapValuesToArray(predecessors);
+  for (let i = 0; i < predecessorEdgeGroups.length; i++) {
+    let group = predecessorEdgeGroups[i];
+    group.nodes = removeDuplicates(group.nodes);
+    group.shallowSize = graph.shallowSizeOfSet(group.nodes);
+    group.retainedSize = graph.retainedSizeOfSet(group.nodes);
+    group.name = group.nodes.length + " sources of " + group.edge;
+  }
+
+  let rewrite = document.createElement("input");
+  rewrite.setAttribute("type", "checkbox");
+
+  let rewriteLabel = document.createElement("span");
+  rewriteLabel.textContent = "Owners ";
+
+  let input = document.createElement("input");
+  input.setAttribute("type", "file");
+  input.setAttribute("multiple", false);
+  input.onchange = function(event) {
+    let file = event.target.files[0];
+    let reader = new FileReader();
+    reader.readAsText(file, 'UTF-8');
+    reader.onload = function(event) {
+      let data = JSON.parse(event.target.result);
+      document.title = file.name;
+      graph = new Graph();
+      graph.loadV8Profile(data, rewrite.checked);
+      data = null; // Release memory
+      showTables([graph.getRoot()]);
+    };
+  };
+
+  let selectRoot = document.createElement("button");
+  selectRoot.textContent = "Select Root";
+  selectRoot.onclick = function(event) {
+    showTables([graph.getRoot()]);
+  };
+
+  let selectAll = document.createElement("button");
+  selectAll.textContent = "Select All";
+  selectAll.onclick = function(event) {
+    showTables(graph.getAll());
+  };
+
+  let filler = document.createElement("span");
+  filler.style["flex-grow"] = 1;
+
+  let totalSize = document.createElement("span");
+  totalSize.className = "sizeCell";
+  totalSize.textContent = graph ? "" + graph.getTotalSize() : "0";
+
+  let totalPercent = document.createElement("span");
+  totalPercent.className = "sizePercentCell";
+  totalPercent.textContent = prettyPercent(1.0);
+
+  let topBar = document.createElement("div");
+  topBar.className = "headerRow";
+  topBar.style["border"] = "solid 2px";
+  topBar.style["display"] = "flex";
+  topBar.style["flex-direction"] = "row";
+  topBar.style["align-items"] = "center";
+  topBar.appendChild(rewrite);
+  topBar.appendChild(rewriteLabel);
+  topBar.appendChild(input);
+  if (graph) {
+    topBar.appendChild(selectRoot);
+    topBar.appendChild(selectAll);
+    topBar.appendChild(filler);
+    topBar.appendChild(totalSize);
+    topBar.appendChild(totalPercent);
+  }
+
+  let selectionTable = new Table("Selection", labeledNodes, []).div;
+  selectionTable.style["flex-basis"] = "0px";
+  selectionTable.style["flex-grow"] = 1;
+
+  let successorsTable = new Table("Successors", successors, successorEdgeGroups).div;
+  successorsTable.style["flex-basis"] = "0px";
+  successorsTable.style["flex-grow"] = 1;
+
+  let predecessorsTable = new Table("Predecessors", predecessors, predecessorEdgeGroups).div;
+  predecessorsTable.style["flex-basis"] = "0px";
+  predecessorsTable.style["flex-grow"] = 1;
+
+  let help = document.createElement("span");
+  help.textContent =
+      "Create a snapshot profile by passing " +
+      "--write_v8_snapshot_profile_to=example.json to gen_snapshot.";
+
+  let column = document.createElement("div");
+  column.style["height"] = "100%";
+  column.style["display"] = "flex";
+  column.style["flex-direction"] = "column";
+  column.appendChild(topBar);
+  column.appendChild(document.createElement("br"));
+  if (graph) {
+    column.appendChild(selectionTable);
+    column.appendChild(document.createElement("br"));
+    column.appendChild(successorsTable);
+    column.appendChild(document.createElement("br"));
+    column.appendChild(predecessorsTable);
+  } else {
+    column.appendChild(help);
+  }
+
+  setBody(column);
+}
+
+function setBody(div) {
+  let body = document.body;
+  while (body.firstChild) {
+    body.removeChild(body.firstChild);
+  }
+  body.appendChild(div);
+}
+
+let graph = null;
+showTables([]);
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index d018eb1..a82e940 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -64,11 +64,9 @@
     extra_deps = [
       # TODO(US-399): Remove time_service specific code when it is no longer
       # necessary.
-      "//garnet/public/lib/component/cpp",
+      "//sdk/lib/sys/cpp",
       "//sdk/fidl/fuchsia.timezone",
 
-      # TODO(zra): When the platform-specific timeline code is moved out to
-      # the embedder, this can go away.
       "//zircon/public/lib/fbl",
       "//zircon/public/lib/trace-engine",
     ]
@@ -85,6 +83,12 @@
 
 library_for_all_configs("libdart_lib") {
   target_type = "source_set"
+  if (is_fuchsia) {
+    extra_deps = [
+      "//zircon/public/lib/fbl",
+      "//zircon/public/lib/trace-engine",
+    ]
+  }
   include_dirs = [ ".." ]
   allsources =
       async_runtime_sources + collection_runtime_sources +
@@ -98,47 +102,60 @@
   nosnapshot_sources = []
 }
 
-compile_platform("vm_legacy_platform") {
-  single_root_scheme = "org-dartlang-sdk"
-  single_root_base = rebase_path("../../")
-  libraries_specification_uri = "org-dartlang-sdk:///sdk/lib/libraries.json"
-
-  outputs = [
-    "$root_out_dir/vm_platform.dill",
-    "$root_out_dir/vm_outline.dill",
-  ]
-
-  args = [
-    "--legacy-mode",
-    "dart:core",
-  ]
+template("gen_vm_platform") {
+  assert(defined(invoker.output_postfix),
+         "Must define output postfix (e.g., '_strong'")
+  compile_platform(target_name) {
+    output_postfix = invoker.output_postfix
+    if (defined(invoker.add_implicit_vm_platform_dependency)) {
+      add_implicit_vm_platform_dependency =
+          invoker.add_implicit_vm_platform_dependency
+    }
+    single_root_scheme = "org-dartlang-sdk"
+    single_root_base = rebase_path("../../")
+    libraries_specification_uri = "org-dartlang-sdk:///sdk/lib/libraries.json"
+    outputs = [
+      "$root_out_dir/vm_platform" + output_postfix + ".dill",
+      "$root_out_dir/vm_outline" + output_postfix + ".dill",
+    ]
+    args = [ "dart:core" ]
+    if (defined(invoker.exclude_source) && invoker.exclude_source) {
+      args += [ "--exclude-source" ]
+    }
+    if (defined(invoker.legacy) && invoker.legacy) {
+      args += [ "--legacy-mode" ]
+      outline = "vm_outline_strong.dill"
+    } else {
+      outline = "vm_outline" + output_postfix + ".dill"
+    }
+    if (dart_platform_bytecode) {
+      args += [ "--bytecode" ]
+    }
+  }
 }
 
-compile_platform("vm_platform") {
+gen_vm_platform("vm_legacy_platform") {
+  exclude_source = false
+  legacy = true
+  output_postfix = ""
+}
+
+gen_vm_platform("vm_platform") {
   add_implicit_vm_platform_dependency = false
+  exclude_source = false
+  output_postfix = "_strong"
+}
 
-  single_root_scheme = "org-dartlang-sdk"
-  single_root_base = rebase_path("../../")
-  libraries_specification_uri = "org-dartlang-sdk:///sdk/lib/libraries.json"
-
-  outputs = [
-    "$root_out_dir/vm_platform_strong.dill",
-    "$root_out_dir/vm_outline_strong.dill",
-  ]
-
-  args = [
-    "--exclude-source",
-    "dart:core",
-  ]
-
-  if (dart_platform_bytecode) {
-    args += [ "--bytecode" ]
-  }
+gen_vm_platform("vm_platform_stripped") {
+  add_implicit_vm_platform_dependency = false
+  exclude_source = true
+  output_postfix = "_strong_stripped"
 }
 
 group("kernel_platform_files") {
   public_deps = [
     ":vm_legacy_platform",
     ":vm_platform",
+    ":vm_platform_stripped",
   ]
 }
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index a60217b..fb88a4c 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -954,7 +954,7 @@
     field.SetFieldType(type);
     if (track_exactness && IsPotentialExactGeneric(type)) {
       field.set_static_type_exactness_state(
-          StaticTypeExactnessState::Unitialized());
+          StaticTypeExactnessState::Uninitialized());
     }
   }
   // Finalize function signatures and check for conflicts in super classes and
@@ -1532,6 +1532,7 @@
   RemapClassIds(old_to_new_cid);
   delete[] old_to_new_cid;
   RehashTypes();  // Types use cid's as part of their hashes.
+  I->RehashConstants();  // Const objects use cid's as part of their hashes.
 }
 
 class CidRewriteVisitor : public ObjectVisitor {
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index 6da5677..3aa1544 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -319,11 +319,15 @@
   pre_gc.new_size = post_gc.new_size + recent.new_size;
   pre_gc.new_external_size =
       post_gc.new_external_size + recent.new_external_size;
+  pre_gc.old_external_size =
+      post_gc.old_external_size + recent.old_external_size;
   // Accumulate allocations.
   accumulated.new_count += recent.new_count - last_reset.new_count;
   accumulated.new_size += recent.new_size - last_reset.new_size;
   accumulated.new_external_size +=
       recent.new_external_size - last_reset.new_external_size;
+  accumulated.old_external_size +=
+      recent.old_external_size - last_reset.old_external_size;
   last_reset.ResetNew();
   post_gc.ResetNew();
   recent.ResetNew();
@@ -337,11 +341,15 @@
   pre_gc.old_size = post_gc.old_size + recent.old_size;
   pre_gc.old_external_size =
       post_gc.old_external_size + recent.old_external_size;
+  pre_gc.new_external_size =
+      post_gc.new_external_size + recent.new_external_size;
   // Accumulate allocations.
   accumulated.old_count += recent.old_count - last_reset.old_count;
   accumulated.old_size += recent.old_size - last_reset.old_size;
   accumulated.old_external_size +=
       recent.old_external_size - last_reset.old_external_size;
+  accumulated.new_external_size +=
+      recent.new_external_size - last_reset.new_external_size;
   last_reset.ResetOld();
   post_gc.ResetOld();
   recent.ResetOld();
@@ -435,6 +443,13 @@
   stats->recent.AddOld(size);
 }
 
+void ClassTable::UpdateAllocatedOldGC(intptr_t cid, intptr_t size) {
+  ClassHeapStats* stats = PreliminaryStatsAt(cid);
+  ASSERT(stats != NULL);
+  ASSERT(size != 0);
+  stats->recent.AddOldGC(size);
+}
+
 void ClassTable::UpdateAllocatedExternalNew(intptr_t cid, intptr_t size) {
   ClassHeapStats* stats = PreliminaryStatsAt(cid);
   ASSERT(stats != NULL);
@@ -603,6 +618,13 @@
   stats->post_gc.AddNew(size);
 }
 
+void ClassTable::UpdateLiveNewGC(intptr_t cid, intptr_t size) {
+  ClassHeapStats* stats = PreliminaryStatsAt(cid);
+  ASSERT(stats != NULL);
+  ASSERT(size >= 0);
+  stats->post_gc.AddNewGC(size);
+}
+
 void ClassTable::UpdateLiveOldExternal(intptr_t cid, intptr_t size) {
   ClassHeapStats* stats = PreliminaryStatsAt(cid);
   ASSERT(stats != NULL);
diff --git a/runtime/vm/class_table.h b/runtime/vm/class_table.h
index bbf55b9..df71e43 100644
--- a/runtime/vm/class_table.h
+++ b/runtime/vm/class_table.h
@@ -61,6 +61,7 @@
     new_count = 0;
     new_size = 0;
     new_external_size = 0;
+    old_external_size = 0;
   }
 
   void AddNew(T size) {
@@ -68,6 +69,11 @@
     AtomicOperations::IncrementBy(&new_size, size);
   }
 
+  void AddNewGC(T size) {
+    new_count += 1;
+    new_size += size;
+  }
+
   void AddNewExternal(T size) {
     AtomicOperations::IncrementBy(&new_external_size, size);
   }
@@ -76,6 +82,7 @@
     old_count = 0;
     old_size = 0;
     old_external_size = 0;
+    new_external_size = 0;
   }
 
   void AddOld(T size, T count = 1) {
@@ -83,6 +90,11 @@
     AtomicOperations::IncrementBy(&old_size, size);
   }
 
+  void AddOldGC(T size, T count = 1) {
+    old_count += count;
+    old_size += size;
+  }
+
   void AddOldExternal(T size) {
     AtomicOperations::IncrementBy(&old_external_size, size);
   }
@@ -251,7 +263,7 @@
   // Called whenever a class is allocated in the runtime.
   void UpdateAllocatedNew(intptr_t cid, intptr_t size);
   void UpdateAllocatedOld(intptr_t cid, intptr_t size);
-
+  void UpdateAllocatedOldGC(intptr_t cid, intptr_t size);
   void UpdateAllocatedExternalNew(intptr_t cid, intptr_t size);
   void UpdateAllocatedExternalOld(intptr_t cid, intptr_t size);
 
@@ -293,9 +305,10 @@
  private:
   friend class GCMarker;
   friend class MarkingWeakVisitor;
-  friend class ScavengerVisitor;
+  friend class Scavenger;
   friend class ScavengerWeakVisitor;
   friend class ClassHeapStatsTestHelper;
+  friend class HeapTestsHelper;
   static const int initial_capacity_ = 512;
   static const int capacity_increment_ = 256;
 
@@ -316,6 +329,7 @@
   ClassHeapStats* PreliminaryStatsAt(intptr_t cid);
   void UpdateLiveOld(intptr_t cid, intptr_t size, intptr_t count = 1);
   void UpdateLiveNew(intptr_t cid, intptr_t size);
+  void UpdateLiveNewGC(intptr_t cid, intptr_t size);
   void UpdateLiveOldExternal(intptr_t cid, intptr_t size);
   void UpdateLiveNewExternal(intptr_t cid, intptr_t size);
 #endif  // !PRODUCT
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 2f07321..97e81e1 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -61,8 +61,7 @@
 
 static RawObject* AllocateUninitialized(PageSpace* old_space, intptr_t size) {
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
-  uword address =
-      old_space->TryAllocateDataBumpLocked(size, PageSpace::kForceGrowth);
+  uword address = old_space->TryAllocateDataBumpLocked(size);
   if (address == 0) {
     OUT_OF_MEMORY();
   }
@@ -72,14 +71,13 @@
 void Deserializer::InitializeHeader(RawObject* raw,
                                     intptr_t class_id,
                                     intptr_t size,
-                                    bool is_vm_isolate,
                                     bool is_canonical) {
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
   uint32_t tags = 0;
   tags = RawObject::ClassIdTag::update(class_id, tags);
   tags = RawObject::SizeTag::update(size, tags);
-  tags = RawObject::VMHeapObjectTag::update(is_vm_isolate, tags);
-  tags = RawObject::CanonicalObjectTag::update(is_canonical, tags);
+  tags = RawObject::ReadOnlyBit::update(false, tags);
+  tags = RawObject::CanonicalBit::update(is_canonical, tags);
   tags = RawObject::OldBit::update(true, tags);
   tags = RawObject::OldAndNotMarkedBit::update(true, tags);
   tags = RawObject::OldAndNotRememberedBit::update(true, tags);
@@ -225,7 +223,6 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
     ClassTable* table = d->isolate()->class_table();
 
     for (intptr_t id = predefined_start_index_; id < predefined_stop_index_;
@@ -256,8 +253,7 @@
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawClass* cls = reinterpret_cast<RawClass*>(d->Ref(id));
-      Deserializer::InitializeHeader(cls, kClassCid, Class::InstanceSize(),
-                                     is_vm_object);
+      Deserializer::InitializeHeader(cls, kClassCid, Class::InstanceSize());
       ReadFromTo(cls);
 
       intptr_t class_id = d->ReadCid();
@@ -361,8 +357,6 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawTypeArguments* type_args =
           reinterpret_cast<RawTypeArguments*>(d->Ref(id));
@@ -370,7 +364,7 @@
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(type_args, kTypeArgumentsCid,
                                      TypeArguments::InstanceSize(length),
-                                     is_vm_object, is_canonical);
+                                     is_canonical);
       type_args->ptr()->length_ = Smi::New(length);
       type_args->ptr()->hash_ = Smi::New(d->Read<int32_t>());
       type_args->ptr()->instantiations_ =
@@ -439,12 +433,10 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawPatchClass* cls = reinterpret_cast<RawPatchClass*>(d->Ref(id));
       Deserializer::InitializeHeader(cls, kPatchClassCid,
-                                     PatchClass::InstanceSize(), is_vm_object);
+                                     PatchClass::InstanceSize());
       ReadFromTo(cls);
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() != Snapshot::kFullAOT) {
@@ -541,12 +533,11 @@
 
   void ReadFill(Deserializer* d) {
     Snapshot::Kind kind = d->kind();
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawFunction* func = reinterpret_cast<RawFunction*>(d->Ref(id));
       Deserializer::InitializeHeader(func, kFunctionCid,
-                                     Function::InstanceSize(), is_vm_object);
+                                     Function::InstanceSize());
       ReadFromTo(func);
 
       if (kind == Snapshot::kFull) {
@@ -700,12 +691,10 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawClosureData* data = reinterpret_cast<RawClosureData*>(d->Ref(id));
       Deserializer::InitializeHeader(data, kClosureDataCid,
-                                     ClosureData::InstanceSize(), is_vm_object);
+                                     ClosureData::InstanceSize());
       if (d->kind() == Snapshot::kFullAOT) {
         data->ptr()->context_scope_ = ContextScope::null();
       } else {
@@ -772,12 +761,10 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawSignatureData* data = reinterpret_cast<RawSignatureData*>(d->Ref(id));
-      Deserializer::InitializeHeader(
-          data, kSignatureDataCid, SignatureData::InstanceSize(), is_vm_object);
+      Deserializer::InitializeHeader(data, kSignatureDataCid,
+                                     SignatureData::InstanceSize());
       ReadFromTo(data);
     }
   }
@@ -837,14 +824,11 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawRedirectionData* data =
           reinterpret_cast<RawRedirectionData*>(d->Ref(id));
       Deserializer::InitializeHeader(data, kRedirectionDataCid,
-                                     RedirectionData::InstanceSize(),
-                                     is_vm_object);
+                                     RedirectionData::InstanceSize());
       ReadFromTo(data);
     }
   }
@@ -882,7 +866,7 @@
       s->Push(field->ptr()->value_.offset_);
     }
     // Write out the initializer function
-    s->Push(field->ptr()->initializer_);
+    s->Push(field->ptr()->initializer_function_);
     if (kind != Snapshot::kFullAOT) {
       // Write out the saved initial value
       s->Push(field->ptr()->saved_initial_value_);
@@ -932,8 +916,8 @@
       } else {
         WriteField(field, value_.offset_);
       }
-      // Write out the initializer function or saved initial value.
-      WriteField(field, initializer_);
+      // Write out the initializer function and initial value if not in AOT.
+      WriteField(field, initializer_function_);
       if (kind != Snapshot::kFullAOT) {
         WriteField(field, saved_initial_value_);
       }
@@ -981,12 +965,10 @@
 
   void ReadFill(Deserializer* d) {
     Snapshot::Kind kind = d->kind();
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawField* field = reinterpret_cast<RawField*>(d->Ref(id));
-      Deserializer::InitializeHeader(field, kFieldCid, Field::InstanceSize(),
-                                     is_vm_object);
+      Deserializer::InitializeHeader(field, kFieldCid, Field::InstanceSize());
       ReadFromTo(field);
       if (kind != Snapshot::kFullAOT) {
         field->ptr()->token_pos_ = d->ReadTokenPosition();
@@ -1080,12 +1062,10 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawScript* script = reinterpret_cast<RawScript*>(d->Ref(id));
-      Deserializer::InitializeHeader(script, kScriptCid, Script::InstanceSize(),
-                                     is_vm_object);
+      Deserializer::InitializeHeader(script, kScriptCid,
+                                     Script::InstanceSize());
       ReadFromTo(script);
       script->ptr()->line_offset_ = d->Read<int32_t>();
       script->ptr()->col_offset_ = d->Read<int32_t>();
@@ -1156,12 +1136,9 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawLibrary* lib = reinterpret_cast<RawLibrary*>(d->Ref(id));
-      Deserializer::InitializeHeader(lib, kLibraryCid, Library::InstanceSize(),
-                                     is_vm_object);
+      Deserializer::InitializeHeader(lib, kLibraryCid, Library::InstanceSize());
       ReadFromTo(lib);
       lib->ptr()->native_entry_resolver_ = NULL;
       lib->ptr()->native_entry_symbol_resolver_ = NULL;
@@ -1232,12 +1209,10 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawNamespace* ns = reinterpret_cast<RawNamespace*>(d->Ref(id));
       Deserializer::InitializeHeader(ns, kNamespaceCid,
-                                     Namespace::InstanceSize(), is_vm_object);
+                                     Namespace::InstanceSize());
       ReadFromTo(ns);
     }
   }
@@ -1299,14 +1274,11 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawKernelProgramInfo* info =
           reinterpret_cast<RawKernelProgramInfo*>(d->Ref(id));
       Deserializer::InitializeHeader(info, kKernelProgramInfoCid,
-                                     KernelProgramInfo::InstanceSize(),
-                                     is_vm_object);
+                                     KernelProgramInfo::InstanceSize());
       ReadFromTo(info);
     }
   }
@@ -1433,8 +1405,6 @@
   ~CodeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
-    const bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
     const intptr_t count = d->ReadUnsigned();
@@ -1449,7 +1419,7 @@
       code_order = static_cast<RawArray*>(
           AllocateUninitialized(old_space, Array::InstanceSize(count)));
       Deserializer::InitializeHeader(code_order, kArrayCid,
-                                     Array::InstanceSize(count), is_vm_object,
+                                     Array::InstanceSize(count),
                                      /*is_canonical=*/false);
       code_order->ptr()->type_arguments_ = TypeArguments::null();
       code_order->ptr()->length_ = Smi::New(code_order_length);
@@ -1472,12 +1442,9 @@
   }
 
   void ReadFill(Deserializer* d) {
-    const bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawCode* code = reinterpret_cast<RawCode*>(d->Ref(id));
-      Deserializer::InitializeHeader(code, kCodeCid, Code::InstanceSize(0),
-                                     is_vm_object);
+      Deserializer::InitializeHeader(code, kCodeCid, Code::InstanceSize(0));
 
       RawInstructions* instr = d->ReadInstructions();
 
@@ -1601,12 +1568,11 @@
 
   void ReadFill(Deserializer* d) {
     ASSERT(d->kind() == Snapshot::kFullJIT);
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawBytecode* bytecode = reinterpret_cast<RawBytecode*>(d->Ref(id));
       Deserializer::InitializeHeader(bytecode, kBytecodeCid,
-                                     Bytecode::InstanceSize(), is_vm_object);
+                                     Bytecode::InstanceSize());
       bytecode->ptr()->instructions_ = 0;
       bytecode->ptr()->instructions_size_ = d->Read<int32_t>();
       ReadFromTo(bytecode);
@@ -1742,12 +1708,11 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
     for (intptr_t id = start_index_; id < stop_index_; id += 1) {
       intptr_t length = d->ReadUnsigned();
       RawObjectPool* pool = reinterpret_cast<RawObjectPool*>(d->Ref(id + 0));
-      Deserializer::InitializeHeader(
-          pool, kObjectPoolCid, ObjectPool::InstanceSize(length), is_vm_object);
+      Deserializer::InitializeHeader(pool, kObjectPoolCid,
+                                     ObjectPool::InstanceSize(length));
       pool->ptr()->length_ = length;
       for (intptr_t j = 0; j < length; j++) {
         const uint8_t entry_bits = d->Read<uint8_t>();
@@ -1796,7 +1761,7 @@
     // will be loaded into read-only memory. Extra bytes due to allocation
     // rounding need to be deterministically set for reliable deduplication in
     // shared images.
-    if (object->IsVMHeapObject()) {
+    if (object->IsReadOnly()) {
       // This object is already read-only.
     } else {
       Object::FinalizeReadOnlyObject(object);
@@ -1951,15 +1916,12 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawExceptionHandlers* handlers =
           reinterpret_cast<RawExceptionHandlers*>(d->Ref(id));
       intptr_t length = d->ReadUnsigned();
       Deserializer::InitializeHeader(handlers, kExceptionHandlersCid,
-                                     ExceptionHandlers::InstanceSize(length),
-                                     is_vm_object);
+                                     ExceptionHandlers::InstanceSize(length));
       handlers->ptr()->num_entries_ = length;
       handlers->ptr()->handled_types_data_ =
           reinterpret_cast<RawArray*>(d->ReadRef());
@@ -2042,13 +2004,11 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawContext* context = reinterpret_cast<RawContext*>(d->Ref(id));
       intptr_t length = d->ReadUnsigned();
-      Deserializer::InitializeHeader(
-          context, kContextCid, Context::InstanceSize(length), is_vm_object);
+      Deserializer::InitializeHeader(context, kContextCid,
+                                     Context::InstanceSize(length));
       context->ptr()->num_variables_ = length;
       context->ptr()->parent_ = reinterpret_cast<RawContext*>(d->ReadRef());
       for (intptr_t j = 0; j < length; j++) {
@@ -2120,14 +2080,11 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawContextScope* scope = reinterpret_cast<RawContextScope*>(d->Ref(id));
       intptr_t length = d->ReadUnsigned();
       Deserializer::InitializeHeader(scope, kContextScopeCid,
-                                     ContextScope::InstanceSize(length),
-                                     is_vm_object);
+                                     ContextScope::InstanceSize(length));
       scope->ptr()->num_variables_ = length;
       scope->ptr()->is_implicit_ = d->Read<bool>();
       ReadFromTo(scope, length);
@@ -2188,14 +2145,11 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawUnlinkedCall* unlinked =
           reinterpret_cast<RawUnlinkedCall*>(d->Ref(id));
       Deserializer::InitializeHeader(unlinked, kUnlinkedCallCid,
-                                     UnlinkedCall::InstanceSize(),
-                                     is_vm_object);
+                                     UnlinkedCall::InstanceSize());
       ReadFromTo(unlinked);
     }
   }
@@ -2258,12 +2212,9 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawICData* ic = reinterpret_cast<RawICData*>(d->Ref(id));
-      Deserializer::InitializeHeader(ic, kICDataCid, ICData::InstanceSize(),
-                                     is_vm_object);
+      Deserializer::InitializeHeader(ic, kICDataCid, ICData::InstanceSize());
       ReadFromTo(ic);
       NOT_IN_PRECOMPILED(ic->ptr()->deopt_id_ = d->Read<int32_t>());
       ic->ptr()->state_bits_ = d->Read<int32_t>();
@@ -2326,14 +2277,11 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawMegamorphicCache* cache =
           reinterpret_cast<RawMegamorphicCache*>(d->Ref(id));
       Deserializer::InitializeHeader(cache, kMegamorphicCacheCid,
-                                     MegamorphicCache::InstanceSize(),
-                                     is_vm_object);
+                                     MegamorphicCache::InstanceSize());
       ReadFromTo(cache);
       cache->ptr()->filled_entry_count_ = d->Read<int32_t>();
     }
@@ -2420,14 +2368,11 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawSubtypeTestCache* cache =
           reinterpret_cast<RawSubtypeTestCache*>(d->Ref(id));
       Deserializer::InitializeHeader(cache, kSubtypeTestCacheCid,
-                                     SubtypeTestCache::InstanceSize(),
-                                     is_vm_object);
+                                     SubtypeTestCache::InstanceSize());
       cache->ptr()->cache_ = reinterpret_cast<RawArray*>(d->ReadRef());
     }
   }
@@ -2489,13 +2434,10 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawLanguageError* error = reinterpret_cast<RawLanguageError*>(d->Ref(id));
       Deserializer::InitializeHeader(error, kLanguageErrorCid,
-                                     LanguageError::InstanceSize(),
-                                     is_vm_object);
+                                     LanguageError::InstanceSize());
       ReadFromTo(error);
       error->ptr()->token_pos_ = d->ReadTokenPosition();
       error->ptr()->report_after_token_ = d->Read<bool>();
@@ -2558,14 +2500,11 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawUnhandledException* exception =
           reinterpret_cast<RawUnhandledException*>(d->Ref(id));
       Deserializer::InitializeHeader(exception, kUnhandledExceptionCid,
-                                     UnhandledException::InstanceSize(),
-                                     is_vm_object);
+                                     UnhandledException::InstanceSize());
       ReadFromTo(exception);
     }
   }
@@ -2660,13 +2599,12 @@
     intptr_t next_field_offset = next_field_offset_in_words_ << kWordSizeLog2;
     intptr_t instance_size =
         Object::RoundedAllocationSize(instance_size_in_words_ * kWordSize);
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawInstance* instance = reinterpret_cast<RawInstance*>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(instance, cid_, instance_size,
-                                     is_vm_object, is_canonical);
+                                     is_canonical);
       intptr_t offset = Instance::NextFieldOffset();
       while (offset < next_field_offset) {
         RawObject** p = reinterpret_cast<RawObject**>(
@@ -2745,14 +2683,11 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawLibraryPrefix* prefix =
           reinterpret_cast<RawLibraryPrefix*>(d->Ref(id));
       Deserializer::InitializeHeader(prefix, kLibraryPrefixCid,
-                                     LibraryPrefix::InstanceSize(),
-                                     is_vm_object);
+                                     LibraryPrefix::InstanceSize());
       ReadFromTo(prefix);
       prefix->ptr()->num_imports_ = d->Read<uint16_t>();
       prefix->ptr()->is_deferred_load_ = d->Read<bool>();
@@ -2852,13 +2787,12 @@
   }
 
   void ReadFill(Deserializer* d) {
-    const bool is_vm_isolate = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = canonical_start_index_; id < canonical_stop_index_;
          id++) {
       RawType* type = reinterpret_cast<RawType*>(d->Ref(id));
+      bool is_canonical = true;
       Deserializer::InitializeHeader(type, kTypeCid, Type::InstanceSize(),
-                                     is_vm_isolate, true);
+                                     is_canonical);
       ReadFromTo(type);
       type->ptr()->token_pos_ = d->ReadTokenPosition();
       type->ptr()->type_state_ = d->Read<int8_t>();
@@ -2866,8 +2800,9 @@
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawType* type = reinterpret_cast<RawType*>(d->Ref(id));
+      bool is_canonical = false;
       Deserializer::InitializeHeader(type, kTypeCid, Type::InstanceSize(),
-                                     is_vm_isolate);
+                                     is_canonical);
       ReadFromTo(type);
       type->ptr()->token_pos_ = d->ReadTokenPosition();
       type->ptr()->type_state_ = d->Read<int8_t>();
@@ -2962,12 +2897,10 @@
   }
 
   void ReadFill(Deserializer* d) {
-    const bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawTypeRef* type = reinterpret_cast<RawTypeRef*>(d->Ref(id));
-      Deserializer::InitializeHeader(type, kTypeRefCid, TypeRef::InstanceSize(),
-                                     is_vm_object);
+      Deserializer::InitializeHeader(type, kTypeRefCid,
+                                     TypeRef::InstanceSize());
       ReadFromTo(type);
     }
   }
@@ -3026,7 +2959,7 @@
       s->Write<int32_t>(type->ptr()->parameterized_class_id_);
       s->WriteTokenPosition(type->ptr()->token_pos_);
       s->Write<int16_t>(type->ptr()->index_);
-      s->Write<int8_t>(type->ptr()->type_state_);
+      s->Write<uint8_t>(type->ptr()->flags_);
     }
   }
 
@@ -3052,17 +2985,15 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawTypeParameter* type = reinterpret_cast<RawTypeParameter*>(d->Ref(id));
-      Deserializer::InitializeHeader(
-          type, kTypeParameterCid, TypeParameter::InstanceSize(), is_vm_object);
+      Deserializer::InitializeHeader(type, kTypeParameterCid,
+                                     TypeParameter::InstanceSize());
       ReadFromTo(type);
       type->ptr()->parameterized_class_id_ = d->Read<int32_t>();
       type->ptr()->token_pos_ = d->ReadTokenPosition();
       type->ptr()->index_ = d->Read<int16_t>();
-      type->ptr()->type_state_ = d->Read<int8_t>();
+      type->ptr()->flags_ = d->Read<uint8_t>();
     }
   }
 
@@ -3140,14 +3071,11 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawClosure* closure = reinterpret_cast<RawClosure*>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(closure, kClosureCid,
-                                     Closure::InstanceSize(), is_vm_object,
-                                     is_canonical);
+                                     Closure::InstanceSize(), is_canonical);
       ReadFromTo(closure);
     }
   }
@@ -3204,7 +3132,6 @@
 
   void ReadAlloc(Deserializer* d) {
     PageSpace* old_space = d->heap()->old_space();
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
 
     start_index_ = d->next_index();
     intptr_t count = d->ReadUnsigned();
@@ -3217,7 +3144,7 @@
         RawMint* mint = static_cast<RawMint*>(
             AllocateUninitialized(old_space, Mint::InstanceSize()));
         Deserializer::InitializeHeader(mint, kMintCid, Mint::InstanceSize(),
-                                       is_vm_object, is_canonical);
+                                       is_canonical);
         mint->ptr()->value_ = value;
         d->AssignRef(mint);
       }
@@ -3293,13 +3220,11 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawDouble* dbl = reinterpret_cast<RawDouble*>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(dbl, kDoubleCid, Double::InstanceSize(),
-                                     is_vm_object, is_canonical);
+                                     is_canonical);
       dbl->ptr()->value_ = d->Read<double>();
     }
   }
@@ -3361,15 +3286,13 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawGrowableObjectArray* list =
           reinterpret_cast<RawGrowableObjectArray*>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(list, kGrowableObjectArrayCid,
                                      GrowableObjectArray::InstanceSize(),
-                                     is_vm_object, is_canonical);
+                                     is_canonical);
       ReadFromTo(list);
     }
   }
@@ -3439,7 +3362,6 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
     intptr_t element_size = TypedData::ElementSizeInBytes(cid_);
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
@@ -3447,9 +3369,8 @@
       intptr_t length = d->ReadUnsigned();
       bool is_canonical = d->Read<bool>();
       intptr_t length_in_bytes = length * element_size;
-      Deserializer::InitializeHeader(data, cid_,
-                                     TypedData::InstanceSize(length_in_bytes),
-                                     is_vm_object, is_canonical);
+      Deserializer::InitializeHeader(
+          data, cid_, TypedData::InstanceSize(length_in_bytes), is_canonical);
       data->ptr()->length_ = Smi::New(length);
       uint8_t* cdata = reinterpret_cast<uint8_t*>(data->ptr()->data());
       d->ReadBytes(cdata, length_in_bytes);
@@ -3520,15 +3441,14 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
     intptr_t element_size = ExternalTypedData::ElementSizeInBytes(cid_);
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawExternalTypedData* data =
           reinterpret_cast<RawExternalTypedData*>(d->Ref(id));
       intptr_t length = d->ReadUnsigned();
-      Deserializer::InitializeHeader(
-          data, cid_, ExternalTypedData::InstanceSize(), is_vm_object);
+      Deserializer::InitializeHeader(data, cid_,
+                                     ExternalTypedData::InstanceSize());
       data->ptr()->length_ = Smi::New(length);
       d->Align(ExternalTypedData::kDataSerializationAlignment);
       data->ptr()->data_ = const_cast<uint8_t*>(d->CurrentBufferAddress());
@@ -3594,12 +3514,10 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawStackTrace* trace = reinterpret_cast<RawStackTrace*>(d->Ref(id));
       Deserializer::InitializeHeader(trace, kStackTraceCid,
-                                     StackTrace::InstanceSize(), is_vm_object);
+                                     StackTrace::InstanceSize());
       ReadFromTo(trace);
     }
   }
@@ -3659,12 +3577,10 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawRegExp* regexp = reinterpret_cast<RawRegExp*>(d->Ref(id));
-      Deserializer::InitializeHeader(regexp, kRegExpCid, RegExp::InstanceSize(),
-                                     is_vm_object);
+      Deserializer::InitializeHeader(regexp, kRegExpCid,
+                                     RegExp::InstanceSize());
       ReadFromTo(regexp);
       regexp->ptr()->num_registers_ = d->Read<int32_t>();
       regexp->ptr()->type_flags_ = d->Read<int8_t>();
@@ -3725,14 +3641,11 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawWeakProperty* property =
           reinterpret_cast<RawWeakProperty*>(d->Ref(id));
       Deserializer::InitializeHeader(property, kWeakPropertyCid,
-                                     WeakProperty::InstanceSize(),
-                                     is_vm_object);
+                                     WeakProperty::InstanceSize());
       ReadFromTo(property);
     }
   }
@@ -3824,15 +3737,13 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
     PageSpace* old_space = d->heap()->old_space();
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawLinkedHashMap* map = reinterpret_cast<RawLinkedHashMap*>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
-      Deserializer::InitializeHeader(map, kLinkedHashMapCid,
-                                     LinkedHashMap::InstanceSize(),
-                                     is_vm_object, is_canonical);
+      Deserializer::InitializeHeader(
+          map, kLinkedHashMapCid, LinkedHashMap::InstanceSize(), is_canonical);
 
       map->ptr()->type_arguments_ =
           reinterpret_cast<RawTypeArguments*>(d->ReadRef());
@@ -3935,14 +3846,12 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawArray* array = reinterpret_cast<RawArray*>(d->Ref(id));
       intptr_t length = d->ReadUnsigned();
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(array, cid_, Array::InstanceSize(length),
-                                     is_vm_object, is_canonical);
+                                     is_canonical);
       array->ptr()->type_arguments_ =
           reinterpret_cast<RawTypeArguments*>(d->ReadRef());
       array->ptr()->length_ = Smi::New(length);
@@ -4017,15 +3926,13 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawOneByteString* str = reinterpret_cast<RawOneByteString*>(d->Ref(id));
       intptr_t length = d->ReadUnsigned();
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(str, kOneByteStringCid,
                                      OneByteString::InstanceSize(length),
-                                     is_vm_object, is_canonical);
+                                     is_canonical);
       str->ptr()->length_ = Smi::New(length);
       String::SetCachedHash(str, d->Read<int32_t>());
       for (intptr_t j = 0; j < length; j++) {
@@ -4096,15 +4003,13 @@
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawTwoByteString* str = reinterpret_cast<RawTwoByteString*>(d->Ref(id));
       intptr_t length = d->ReadUnsigned();
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(str, kTwoByteStringCid,
                                      TwoByteString::InstanceSize(length),
-                                     is_vm_object, is_canonical);
+                                     is_canonical);
       str->ptr()->length_ = Smi::New(length);
       String::SetCachedHash(str, d->Read<int32_t>());
       uint8_t* cdata = reinterpret_cast<uint8_t*>(str->ptr()->data());
@@ -4724,8 +4629,7 @@
   }
 }
 
-intptr_t Serializer::WriteVMSnapshot(const Array& symbols,
-                                     ZoneGrowableArray<Object*>* seeds) {
+intptr_t Serializer::WriteVMSnapshot(const Array& symbols) {
   NoSafepointScope no_safepoint;
 
   AddVMIsolateBaseObjects();
@@ -4737,11 +4641,6 @@
       Push(StubCode::EntryAt(i).raw());
     }
   }
-  if (seeds != NULL) {
-    for (intptr_t i = 0; i < seeds->length(); i++) {
-      Push((*seeds)[i]->raw());
-    }
-  }
 
   Serialize();
 
@@ -5280,92 +5179,6 @@
   Bootstrap::SetupNativeResolver();
 }
 
-// Iterates the program structure looking for objects to write into
-// the VM isolate's snapshot, causing them to be shared across isolates.
-// Duplicates will be removed by Serializer::Push.
-class SeedVMIsolateVisitor : public ClassVisitor, public FunctionVisitor {
- public:
-  SeedVMIsolateVisitor(Zone* zone, bool include_code)
-      : zone_(zone),
-        include_code_(include_code),
-        seeds_(new (zone) ZoneGrowableArray<Object*>(4 * KB)),
-        script_(Script::Handle(zone)),
-        code_(Code::Handle(zone)),
-        stack_maps_(Array::Handle(zone)),
-        library_(Library::Handle(zone)),
-        kernel_program_info_(KernelProgramInfo::Handle(zone)) {}
-
-  void Visit(const Class& cls) {
-    script_ = cls.script();
-    if (!script_.IsNull()) {
-      Visit(script_);
-    }
-
-    library_ = cls.library();
-    AddSeed(library_.kernel_data());
-
-    if (!include_code_) return;
-
-    code_ = cls.allocation_stub();
-    Visit(code_);
-  }
-
-  void Visit(const Function& function) {
-    script_ = function.script();
-    if (!script_.IsNull()) {
-      Visit(script_);
-    }
-
-    if (!include_code_) return;
-
-    code_ = function.CurrentCode();
-    Visit(code_);
-    code_ = function.unoptimized_code();
-    Visit(code_);
-  }
-
-  void Visit(const Script& script) {
-    kernel_program_info_ = script_.kernel_program_info();
-    if (!kernel_program_info_.IsNull()) {
-      AddSeed(kernel_program_info_.string_offsets());
-      AddSeed(kernel_program_info_.string_data());
-      AddSeed(kernel_program_info_.canonical_names());
-      AddSeed(kernel_program_info_.metadata_payloads());
-      AddSeed(kernel_program_info_.metadata_mappings());
-      AddSeed(kernel_program_info_.constants());
-    }
-  }
-
-  ZoneGrowableArray<Object*>* seeds() { return seeds_; }
-
- private:
-  void Visit(const Code& code) {
-    ASSERT(include_code_);
-    if (code.IsNull()) return;
-
-    AddSeed(code.pc_descriptors());
-    AddSeed(code.code_source_map());
-
-    stack_maps_ = code_.stackmaps();
-    if (!stack_maps_.IsNull()) {
-      for (intptr_t i = 0; i < stack_maps_.Length(); i++) {
-        AddSeed(stack_maps_.At(i));
-      }
-    }
-  }
-
-  void AddSeed(RawObject* seed) { seeds_->Add(&Object::Handle(zone_, seed)); }
-
-  Zone* zone_;
-  bool include_code_;
-  ZoneGrowableArray<Object*>* seeds_;
-  Script& script_;
-  Code& code_;
-  Array& stack_maps_;
-  Library& library_;
-  KernelProgramInfo& kernel_program_info_;
-};
-
 #if defined(DART_PRECOMPILER)
 DEFINE_FLAG(charp,
             write_v8_snapshot_profile_to,
@@ -5388,9 +5201,6 @@
       isolate_snapshot_size_(0),
       vm_image_writer_(vm_image_writer),
       isolate_image_writer_(isolate_image_writer),
-      seeds_(NULL),
-      saved_symbol_table_(Array::Handle(zone())),
-      new_vm_symbol_table_(Array::Handle(zone())),
       clustered_vm_size_(0),
       clustered_isolate_size_(0),
       mapped_data_size_(0),
@@ -5406,36 +5216,6 @@
   isolate()->ValidateConstants();
 #endif  // DEBUG
 
-  // TODO(rmacnak): The special case for AOT causes us to always generate the
-  // same VM isolate snapshot for every app. AOT snapshots should be cleaned up
-  // so the VM isolate snapshot is generated separately and each app is
-  // generated from a VM that has loaded this snapshots, much like app-jit
-  // snapshots.
-  if ((vm_snapshot_data_buffer != NULL) && (kind != Snapshot::kFullAOT)) {
-    TIMELINE_DURATION(thread(), Isolate, "PrepareNewVMIsolate");
-
-    SeedVMIsolateVisitor visitor(thread()->zone(),
-                                 Snapshot::IncludesCode(kind));
-    ProgramVisitor::VisitClasses(&visitor);
-    ProgramVisitor::VisitFunctions(&visitor);
-    seeds_ = visitor.seeds();
-
-    // Tuck away the current symbol table.
-    saved_symbol_table_ = object_store->symbol_table();
-
-    // Create a unified symbol table that will be written as the vm isolate's
-    // symbol table.
-    new_vm_symbol_table_ = Symbols::UnifiedSymbolTable();
-
-    // Create an empty symbol table that will be written as the isolate's symbol
-    // table.
-    Symbols::SetupSymbolTable(isolate());
-  } else {
-    // Reuse the current vm isolate.
-    saved_symbol_table_ = object_store->symbol_table();
-    new_vm_symbol_table_ = Dart::vm_isolate()->object_store()->symbol_table();
-  }
-
 #if defined(DART_PRECOMPILER)
   if (FLAG_write_v8_snapshot_profile_to != nullptr) {
     profile_writer_ = new (zone()) V8SnapshotProfileWriter(zone());
@@ -5443,14 +5223,7 @@
 #endif
 }
 
-FullSnapshotWriter::~FullSnapshotWriter() {
-  // We may run Dart code afterwards, restore the symbol table if needed.
-  if (!saved_symbol_table_.IsNull()) {
-    isolate()->object_store()->set_symbol_table(saved_symbol_table_);
-    saved_symbol_table_ = Array::null();
-  }
-  new_vm_symbol_table_ = Array::null();
-}
+FullSnapshotWriter::~FullSnapshotWriter() {}
 
 intptr_t FullSnapshotWriter::WriteVMSnapshot() {
   TIMELINE_DURATION(thread(), Isolate, "WriteVMSnapshot");
@@ -5464,10 +5237,11 @@
   serializer.WriteVersionAndFeatures(true);
   // VM snapshot roots are:
   // - the symbol table
-  // - all the token streams
   // - the stub code (App-AOT, App-JIT or Core-JIT)
-  intptr_t num_objects =
-      serializer.WriteVMSnapshot(new_vm_symbol_table_, seeds_);
+
+  const Array& symbols =
+      Array::Handle(Dart::vm_isolate()->object_store()->symbol_table());
+  intptr_t num_objects = serializer.WriteVMSnapshot(symbols);
   serializer.FillHeader(serializer.kind());
   clustered_vm_size_ = serializer.bytes_written();
 
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index 3b863bd..2233715 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -139,8 +139,7 @@
              V8SnapshotProfileWriter* profile_writer = nullptr);
   ~Serializer();
 
-  intptr_t WriteVMSnapshot(const Array& symbols,
-                           ZoneGrowableArray<Object*>* seeds);
+  intptr_t WriteVMSnapshot(const Array& symbols);
   void WriteIsolateSnapshot(intptr_t num_base_objects,
                             ObjectStore* object_store);
 
@@ -492,7 +491,6 @@
   static void InitializeHeader(RawObject* raw,
                                intptr_t cid,
                                intptr_t size,
-                               bool is_vm_isolate,
                                bool is_canonical = false);
 
   // Reads raw data (for basic types).
@@ -642,9 +640,6 @@
   ForwardList* forward_list_;
   ImageWriter* vm_image_writer_;
   ImageWriter* isolate_image_writer_;
-  ZoneGrowableArray<Object*>* seeds_;
-  Array& saved_symbol_table_;
-  Array& new_vm_symbol_table_;
 
   // Stats for benchmarking.
   intptr_t clustered_vm_size_;
diff --git a/runtime/vm/compilation_trace.cc b/runtime/vm/compilation_trace.cc
index 29cdfa2..4c4db1e 100644
--- a/runtime/vm/compilation_trace.cc
+++ b/runtime/vm/compilation_trace.cc
@@ -20,7 +20,7 @@
 DEFINE_FLAG(bool, trace_compilation_trace, false, "Trace compilation trace.");
 
 CompilationTraceSaver::CompilationTraceSaver(Zone* zone)
-    : buf_(zone, 4 * KB),
+    : buf_(zone, 1 * MB),
       func_name_(String::Handle(zone)),
       cls_(Class::Handle(zone)),
       cls_name_(String::Handle(zone)),
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index 23e66c0..d3a6504 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -544,18 +544,28 @@
       case Token::kMOD:
         replacement = TryOptimizeMod(instr, op_kind, left_value, right_value);
         if (replacement != nullptr) break;
+        FALL_THROUGH;
       case Token::kTRUNCDIV:
 #if !defined(TARGET_ARCH_X64) && !defined(TARGET_ARCH_ARM64)
         // TODO(ajcbik): 32-bit archs too?
         break;
+#else
+        FALL_THROUGH;
 #endif
       case Token::kSHL:
+        FALL_THROUGH;
       case Token::kSHR:
+        FALL_THROUGH;
       case Token::kBIT_OR:
+        FALL_THROUGH;
       case Token::kBIT_XOR:
+        FALL_THROUGH;
       case Token::kBIT_AND:
+        FALL_THROUGH;
       case Token::kADD:
+        FALL_THROUGH;
       case Token::kSUB:
+        FALL_THROUGH;
       case Token::kMUL: {
         if (FlowGraphCompiler::SupportsUnboxedInt64()) {
           if (op_kind == Token::kSHR || op_kind == Token::kSHL) {
@@ -648,6 +658,7 @@
 
     switch (op_kind) {
       case Token::kEQ:
+        FALL_THROUGH;
       case Token::kNE: {
         // TODO(dartbug.com/32166): Support EQ, NE for nullable doubles.
         // (requires null-aware comparison instruction).
@@ -662,8 +673,11 @@
         break;
       }
       case Token::kLT:
+        FALL_THROUGH;
       case Token::kLTE:
+        FALL_THROUGH;
       case Token::kGT:
+        FALL_THROUGH;
       case Token::kGTE: {
         left_value = PrepareStaticOpInput(left_value, kDoubleCid, instr);
         right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
@@ -673,8 +687,11 @@
         break;
       }
       case Token::kADD:
+        FALL_THROUGH;
       case Token::kSUB:
+        FALL_THROUGH;
       case Token::kMUL:
+        FALL_THROUGH;
       case Token::kDIV: {
         if (op_kind == Token::kDIV &&
             !FlowGraphCompiler::SupportsHardwareDivision()) {
@@ -689,10 +706,15 @@
       }
 
       case Token::kBIT_OR:
+        FALL_THROUGH;
       case Token::kBIT_XOR:
+        FALL_THROUGH;
       case Token::kBIT_AND:
+        FALL_THROUGH;
       case Token::kMOD:
+        FALL_THROUGH;
       case Token::kTRUNCDIV:
+        FALL_THROUGH;
       default:
         break;
     }
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 2187130..31b9c6b 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -126,19 +126,6 @@
   Thread::Current()->long_jump_base()->Jump(1, error);
 }
 
-TypeRangeCache::TypeRangeCache(Precompiler* precompiler,
-                               Thread* thread,
-                               intptr_t num_cids)
-    : precompiler_(precompiler),
-      thread_(thread),
-      lower_limits_(thread->zone()->Alloc<intptr_t>(num_cids)),
-      upper_limits_(thread->zone()->Alloc<intptr_t>(num_cids)) {
-  for (intptr_t i = 0; i < num_cids; i++) {
-    lower_limits_[i] = kNotComputed;
-    upper_limits_[i] = kNotComputed;
-  }
-}
-
 RawError* Precompiler::CompileAll() {
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
@@ -877,8 +864,8 @@
       // Should not be in the middle of initialization while precompiling.
       ASSERT(value.raw() != Object::transition_sentinel().raw());
 
-      if (!field.HasInitializer() ||
-          !Function::Handle(Z, field.Initializer()).HasCode()) {
+      if (!field.HasInitializerFunction() ||
+          !Function::Handle(Z, field.InitializerFunction()).HasCode()) {
         if (FLAG_trace_precompiler) {
           THR_Print("Precompiling initializer for %s\n", field.ToCString());
         }
@@ -890,7 +877,7 @@
         const Function& initializer =
             Function::Handle(Z, CompileStaticInitializer(field));
         ASSERT(!initializer.IsNull());
-        field.SetInitializer(initializer);
+        field.SetInitializerFunction(initializer);
         AddCalleesOf(initializer, gop_offset);
       }
     }
@@ -987,6 +974,7 @@
   auto& cls = Class::Handle(Z);
   auto& members = Array::Handle(Z);
   auto& function = Function::Handle(Z);
+  auto& function2 = Function::Handle(Z);
   auto& field = Field::Handle(Z);
   auto& metadata = Array::Handle(Z);
   auto& reusable_object_handle = Object::Handle(Z);
@@ -1051,13 +1039,23 @@
         if (function.has_pragma()) {
           metadata ^= lib.GetMetadata(function);
           if (metadata.IsNull()) continue;
-          if (FindEntryPointPragma(isolate(), metadata, &reusable_field_handle,
-                                   &reusable_object_handle) !=
-              EntryPointPragma::kAlways) {
-            continue;
+          auto type =
+              FindEntryPointPragma(isolate(), metadata, &reusable_field_handle,
+                                   &reusable_object_handle);
+
+          if (type == EntryPointPragma::kAlways ||
+              type == EntryPointPragma::kCallOnly) {
+            AddFunction(function);
           }
 
-          AddFunction(function);
+          if ((type == EntryPointPragma::kAlways ||
+               type == EntryPointPragma::kGetterOnly) &&
+              function.kind() != RawFunction::kConstructor &&
+              !function.IsSetterFunction()) {
+            function2 = function.ImplicitClosureFunction();
+            AddFunction(function2);
+          }
+
           if (function.IsGenerativeConstructor()) {
             AddInstantiatedClass(cls);
           }
@@ -1508,7 +1506,7 @@
   for (intptr_t i = 0; i < types.length(); i++) {
     const AbstractType& type = types.At(i);
 
-    if (type.InVMHeap()) {
+    if (type.IsReadOnly()) {
       // The only important types in the vm isolate are "dynamic"/"void", which
       // will get their optimized top-type testing stub installed at creation.
       continue;
@@ -2221,9 +2219,9 @@
   const auto pool_attachment = FLAG_use_bare_instructions
                                    ? Code::PoolAttachment::kNotAttachPool
                                    : Code::PoolAttachment::kAttachPool;
-  const Code& code =
-      Code::Handle(Code::FinalizeCode(function, graph_compiler, assembler,
-                                      pool_attachment, optimized(), stats));
+  const Code& code = Code::Handle(
+      Code::FinalizeCodeAndNotify(function, graph_compiler, assembler,
+                                  pool_attachment, optimized(), stats));
   code.set_is_optimized(optimized());
   code.set_owner(function);
   if (!function.IsOptimizable()) {
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index 28c0a67..0df81c0 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -29,25 +29,6 @@
 class FlowGraph;
 class PrecompilerEntryPointsPrinter;
 
-class TypeRangeCache : public ValueObject {
- public:
-  TypeRangeCache(Precompiler* precompiler, Thread* thread, intptr_t num_cids);
-  ~TypeRangeCache();
-
-  bool InstanceOfHasClassRange(const AbstractType& type,
-                               intptr_t* lower_limit,
-                               intptr_t* upper_limit);
-
- private:
-  static const intptr_t kNotComputed = -1;
-  static const intptr_t kNotContiguous = -2;
-
-  Precompiler* precompiler_;
-  Thread* thread_;
-  intptr_t* lower_limits_;
-  intptr_t* upper_limits_;
-};
-
 class SymbolKeyValueTrait {
  public:
   // Typedefs needed for the DirectChainedHashMap template.
diff --git a/runtime/vm/compiler/assembler/assembler_dbc_test.cc b/runtime/vm/compiler/assembler/assembler_dbc_test.cc
index c87d7aa..d577eec 100644
--- a/runtime/vm/compiler/assembler/assembler_dbc_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_dbc_test.cc
@@ -75,9 +75,9 @@
   const char* dummy_function_name = "dummy_instance_function";
   const Function& dummy_instance_function =
       Function::Handle(CreateFunction(dummy_function_name));
-  Code& code = Code::Handle(
-      Code::FinalizeCode(dummy_instance_function, nullptr, &_assembler_,
-                         Code::PoolAttachment::kAttachPool));
+  Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
+      dummy_instance_function, nullptr, &_assembler_,
+      Code::PoolAttachment::kAttachPool));
   dummy_instance_function.AttachCode(code);
 
   // Make a dummy ICData.
diff --git a/runtime/vm/compiler/assembler/disassembler_x86.cc b/runtime/vm/compiler/assembler/disassembler_x86.cc
index fb00c01..9d9b45e 100644
--- a/runtime/vm/compiler/assembler/disassembler_x86.cc
+++ b/runtime/vm/compiler/assembler/disassembler_x86.cc
@@ -435,7 +435,8 @@
         return 1;
       }
       break;
-    case 1:  // fall through
+    case 1:
+      FALL_THROUGH;
     case 2:
       if ((rm & 7) == 4) {
         uint8_t sib = *(modrmp + 1);
@@ -1613,7 +1614,8 @@
         data += 4;
         break;
 
-      case 0x69:  // fall through
+      case 0x69:
+        FALL_THROUGH;
       case 0x6B: {
         int mod, regop, rm;
         get_modrm(*(data + 1), &mod, &regop, &rm);
@@ -1626,7 +1628,8 @@
         break;
       }
 
-      case 0x81:  // fall through
+      case 0x81:
+        FALL_THROUGH;
       case 0x83:  // 0x81 with sign extension bit set
         data += PrintImmediateOp(data);
         break;
@@ -1791,7 +1794,8 @@
         data += 2;
         break;
 
-      case 0xA1:  // Fall through.
+      case 0xA1:
+        FALL_THROUGH;
       case 0xA3:
         switch (operand_size()) {
           case DOUBLEWORD_SIZE: {
@@ -1843,24 +1847,34 @@
         data += PrintImmediate(data, operand_size());
         break;
       }
-      case 0xD1:  // fall through
-      case 0xD3:  // fall through
+      case 0xD1:
+        FALL_THROUGH;
+      case 0xD3:
+        FALL_THROUGH;
       case 0xC1:
         data += ShiftInstruction(data);
         break;
-      case 0xD0:  // fall through
-      case 0xD2:  // fall through
+      case 0xD0:
+        FALL_THROUGH;
+      case 0xD2:
+        FALL_THROUGH;
       case 0xC0:
         byte_size_operand_ = true;
         data += ShiftInstruction(data);
         break;
 
-      case 0xD9:  // fall through
-      case 0xDA:  // fall through
-      case 0xDB:  // fall through
-      case 0xDC:  // fall through
-      case 0xDD:  // fall through
-      case 0xDE:  // fall through
+      case 0xD9:
+        FALL_THROUGH;
+      case 0xDA:
+        FALL_THROUGH;
+      case 0xDB:
+        FALL_THROUGH;
+      case 0xDC:
+        FALL_THROUGH;
+      case 0xDD:
+        FALL_THROUGH;
+      case 0xDE:
+        FALL_THROUGH;
       case 0xDF:
         data += FPUInstruction(data);
         break;
@@ -1870,7 +1884,8 @@
         break;
 
       case 0xF6:
-        byte_size_operand_ = true;  // fall through
+        byte_size_operand_ = true;
+        FALL_THROUGH;
       case 0xF7:
         data += F6F7Instruction(data);
         break;
diff --git a/runtime/vm/compiler/backend/compile_type.h b/runtime/vm/compiler/backend/compile_type.h
index ded5fa6..e659dbd 100644
--- a/runtime/vm/compiler/backend/compile_type.h
+++ b/runtime/vm/compiler/backend/compile_type.h
@@ -5,11 +5,13 @@
 #ifndef RUNTIME_VM_COMPILER_BACKEND_COMPILE_TYPE_H_
 #define RUNTIME_VM_COMPILER_BACKEND_COMPILE_TYPE_H_
 
-#include "vm/object.h"
-#include "vm/thread.h"
+#include "vm/allocation.h"
+#include "vm/class_id.h"
+#include "vm/compiler/runtime_api.h"
 
 namespace dart {
 
+class AbstractType;
 class BufferFormatter;
 
 // CompileType describes type of a value produced by a definition.
@@ -91,7 +93,7 @@
   }
 
   static CompileType CreateNullable(bool is_nullable, intptr_t cid) {
-    return CompileType(is_nullable, cid, NULL);
+    return CompileType(is_nullable, cid, nullptr);
   }
 
   // Create a new CompileType representing given abstract type. By default
@@ -106,7 +108,7 @@
   // Create None CompileType. It is the bottom of the lattice and is used to
   // represent type of the phi that was not yet inferred.
   static CompileType None() {
-    return CompileType(kNullable, kIllegalCid, NULL);
+    return CompileType(kNullable, kIllegalCid, nullptr);
   }
 
   // Create Dynamic CompileType. It is the top of the lattice and is used to
@@ -159,10 +161,10 @@
   bool IsEqualTo(CompileType* other) {
     return (is_nullable_ == other->is_nullable_) &&
            (ToNullableCid() == other->ToNullableCid()) &&
-           (ToAbstractType()->Equals(*other->ToAbstractType()));
+           (compiler::IsEqualType(*ToAbstractType(), *other->ToAbstractType()));
   }
 
-  bool IsNone() const { return (cid_ == kIllegalCid) && (type_ == NULL); }
+  bool IsNone() const { return (cid_ == kIllegalCid) && (type_ == nullptr); }
 
   // Return true if value of this type is a non-nullable int.
   bool IsInt() { return !is_nullable() && IsNullableInt(); }
@@ -172,11 +174,12 @@
 
   // Return true if value of this type is either int or null.
   bool IsNullableInt() {
-    if ((cid_ == kSmiCid) || (cid_ == kMintCid)) {
+    if (cid_ == kSmiCid || cid_ == kMintCid) {
       return true;
     }
-    if ((cid_ == kIllegalCid) || (cid_ == kDynamicCid)) {
-      return (type_ != NULL) && ((type_->IsIntType() || type_->IsSmiType()));
+    if (cid_ == kIllegalCid || cid_ == kDynamicCid) {
+      return type_ != nullptr &&
+             (compiler::IsIntType(*type_) || compiler::IsSmiType(*type_));
     }
     return false;
   }
@@ -186,8 +189,8 @@
     if (cid_ == kSmiCid) {
       return true;
     }
-    if ((cid_ == kIllegalCid) || (cid_ == kDynamicCid)) {
-      return type_ != nullptr && type_->IsSmiType();
+    if (cid_ == kIllegalCid || cid_ == kDynamicCid) {
+      return type_ != nullptr && compiler::IsSmiType(*type_);
     }
     return false;
   }
@@ -198,7 +201,7 @@
       return true;
     }
     if ((cid_ == kIllegalCid) || (cid_ == kDynamicCid)) {
-      return (type_ != NULL) && type_->IsDoubleType();
+      return type_ != nullptr && compiler::IsDoubleType(*type_);
     }
     return false;
   }
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 56f2a36..12b10eb 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -267,8 +267,6 @@
 
 void ConstantPropagator::VisitTailCall(TailCallInstr* instr) {}
 
-void ConstantPropagator::VisitCheckNull(CheckNullInstr* instr) {}
-
 void ConstantPropagator::VisitCheckEitherNonSmi(CheckEitherNonSmiInstr* instr) {
 }
 
@@ -354,12 +352,34 @@
   SetValue(instr, non_constant_);
 }
 
+void ConstantPropagator::VisitCheckNull(CheckNullInstr* instr) {
+  // Don't propagate constants through check, since it would eliminate
+  // the data dependence between the null check and its use.
+  // Graph finalization will expose the constant eventually.
+  SetValue(instr, non_constant_);
+}
+
 void ConstantPropagator::VisitParameter(ParameterInstr* instr) {
   SetValue(instr, non_constant_);
 }
 
 void ConstantPropagator::VisitPushArgument(PushArgumentInstr* instr) {
-  SetValue(instr, instr->value()->definition()->constant_value());
+  if (SetValue(instr, instr->value()->definition()->constant_value())) {
+    // The worklist implementation breaks down around push arguments,
+    // since these instructions do not have a direct use-link to the
+    // corresponding call. This is remedied by visiting all calls in
+    // the enviroment use list each time a push argument changes its
+    // value. Currently, this only needs to be done for static calls
+    // (the only calls involved in constant propagation).
+    // TODO(ajcbik): calls with multiple arguments may be revisited
+    //               several times; a direct use-link would be better
+    for (Value* use = instr->env_use_list(); use != nullptr;
+         use = use->next_use()) {
+      if (use->instruction()->IsStaticCall()) {
+        use->instruction()->Accept(this);
+      }
+    }
+  }
 }
 
 void ConstantPropagator::VisitAssertAssignable(AssertAssignableInstr* instr) {
@@ -410,8 +430,8 @@
 }
 
 void ConstantPropagator::VisitStaticCall(StaticCallInstr* instr) {
-  const Function& function = instr->function();
-  switch (MethodRecognizer::RecognizeKind(function)) {
+  const auto kind = MethodRecognizer::RecognizeKind(instr->function());
+  switch (kind) {
     case MethodRecognizer::kOneByteString_equality:
     case MethodRecognizer::kTwoByteString_equality: {
       ASSERT(instr->FirstArgIndex() == 0);
@@ -421,10 +441,32 @@
         SetValue(instr, Bool::True());
         return;
       }
+      // Otherwise evaluate string compare with propagated constants.
+      const Object& o1 = instr->ArgumentAt(0)->constant_value();
+      const Object& o2 = instr->ArgumentAt(1)->constant_value();
+      if (IsConstant(o1) && IsConstant(o2) && o1.IsString() && o2.IsString()) {
+        SetValue(instr, Bool::Get(String::Cast(o1).Equals(String::Cast(o2))));
+        return;
+      }
+      break;
+    }
+    case MethodRecognizer::kStringBaseLength:
+    case MethodRecognizer::kStringBaseIsEmpty: {
+      ASSERT(instr->FirstArgIndex() == 0);
+      // Otherwise evaluate string length with propagated constants.
+      const Object& o = instr->ArgumentAt(0)->constant_value();
+      if (IsConstant(o) && o.IsString()) {
+        const auto& str = String::Cast(o);
+        if (kind == MethodRecognizer::kStringBaseLength) {
+          SetValue(instr, Integer::ZoneHandle(Z, Integer::New(str.Length())));
+        } else {
+          SetValue(instr, Bool::Get(str.Length() == 0));
+        }
+        return;
+      }
       break;
     }
     default:
-      // TODO(ajcbik): consider more cases
       break;
   }
   SetValue(instr, non_constant_);
@@ -1288,10 +1330,9 @@
     if (block_worklist_.is_empty()) {
       if (definition_worklist_.IsEmpty()) break;
       Definition* definition = definition_worklist_.RemoveLast();
-      Value* use = definition->input_use_list();
-      while (use != NULL) {
+      for (Value* use = definition->input_use_list(); use != nullptr;
+           use = use->next_use()) {
         use->instruction()->Accept(this);
-        use = use->next_use();
       }
     } else {
       BlockEntryInstr* block = block_worklist_.RemoveLast();
@@ -1378,7 +1419,7 @@
 static void RemovePushArguments(StaticCallInstr* call) {
   for (intptr_t i = 0; i < call->ArgumentCount(); ++i) {
     PushArgumentInstr* push = call->PushArgumentAt(i);
-    push->ReplaceUsesWith(push->value()->definition());
+    ASSERT(push->input_use_list() == nullptr);
     push->RemoveFromGraph();
   }
 }
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index b8806bd..b6d2fd9 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -1561,7 +1561,7 @@
   RedefinitionInstr* redef = new RedefinitionInstr(new Value(original));
 
   // Don't set the constrained type when the type is None(), which denotes an
-  // unreachable value (e.g. using value null after an explicit null check).
+  // unreachable value (e.g. using value null after some form of null check).
   if (!compile_type.IsNone()) {
     redef->set_constrained_type(new CompileType(compile_type));
   }
@@ -1581,20 +1581,20 @@
     for (ForwardInstructionIterator instr_it(block_it.Current());
          !instr_it.Done(); instr_it.Advance()) {
       Instruction* instruction = instr_it.Current();
-      if (instruction->IsRedefinition()) {
-        RedefinitionInstr* redef = instruction->AsRedefinition();
+      if (auto redef = instruction->AsRedefinition()) {
         redef->ReplaceUsesWith(redef->value()->definition());
         instr_it.RemoveCurrentFromGraph();
       } else if (keep_checks) {
         continue;
-      } else if (instruction->IsCheckArrayBound()) {
-        CheckArrayBoundInstr* check = instruction->AsCheckArrayBound();
+      } else if (auto check = instruction->AsCheckArrayBound()) {
         check->ReplaceUsesWith(check->index()->definition());
         check->ClearSSATempIndex();
-      } else if (instruction->IsGenericCheckBound()) {
-        GenericCheckBoundInstr* check = instruction->AsGenericCheckBound();
+      } else if (auto check = instruction->AsGenericCheckBound()) {
         check->ReplaceUsesWith(check->index()->definition());
         check->ClearSSATempIndex();
+      } else if (auto check = instruction->AsCheckNull()) {
+        check->ReplaceUsesWith(check->value()->definition());
+        check->ClearSSATempIndex();
       }
     }
   }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index cd503e0..9313103 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -2059,7 +2059,10 @@
                                                   Label* is_subtype) {
   HierarchyInfo* hi = Thread::Current()->hierarchy_info();
   if (hi != NULL) {
-    const CidRangeVector& ranges = hi->SubtypeRangesForClass(type_class);
+    const CidRangeVector& ranges =
+        hi->SubtypeRangesForClass(type_class,
+                                  /*include_abstract=*/false,
+                                  /*exclude_null=*/false);
     if (ranges.length() <= kMaxNumberOfCidRangesToTest) {
       GenerateCidRangesCheck(assembler(), class_id_reg, ranges, is_subtype);
       return true;
@@ -2161,7 +2164,10 @@
       const bool can_use_simple_cid_range_test =
           hi->CanUseSubtypeRangeCheckFor(dst_type);
       if (can_use_simple_cid_range_test) {
-        const CidRangeVector& ranges = hi->SubtypeRangesForClass(type_class);
+        const CidRangeVector& ranges =
+            hi->SubtypeRangesForClass(type_class,
+                                      /*include_abstract=*/false,
+                                      /*exclude_null=*/false);
         if (ranges.length() <= kMaxNumberOfCidRangesToTest) {
           if (is_non_smi) {
             __ LoadClassId(scratch_reg, instance_reg);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 70f614f..16dddf6 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -33,7 +33,7 @@
 
     const auto& stub =
         Code::ZoneHandle(object_store->write_barrier_wrappers_stub());
-    if (!stub.InVMHeap()) {
+    if (!stub.IsReadOnly()) {
       assembler_->generate_invoke_write_barrier_wrapper_ =
           [&](Condition condition, Register reg) {
             const intptr_t offset_into_target =
@@ -46,7 +46,7 @@
 
     const auto& array_stub =
         Code::ZoneHandle(object_store->array_write_barrier_stub());
-    if (!array_stub.InVMHeap()) {
+    if (!array_stub.IsReadOnly()) {
       assembler_->generate_invoke_array_write_barrier_ =
           [&](Condition condition) {
             AddPcRelativeCallStubTarget(array_stub);
@@ -951,7 +951,8 @@
                                      const Code& stub,
                                      RawPcDescriptors::Kind kind,
                                      LocationSummary* locs) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions && !stub.InVMHeap()) {
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
+      !stub.IsReadOnly()) {
     AddPcRelativeCallStubTarget(stub);
     __ GenerateUnRelocatedPcRelativeCall();
     EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index b128224..d01b918 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -32,7 +32,7 @@
 
     const auto& stub =
         Code::ZoneHandle(object_store->write_barrier_wrappers_stub());
-    if (!stub.InVMHeap()) {
+    if (!stub.IsReadOnly()) {
       assembler_->generate_invoke_write_barrier_wrapper_ = [&](Register reg) {
         const intptr_t offset_into_target =
             Thread::WriteBarrierWrappersOffsetForRegister(reg);
@@ -43,7 +43,7 @@
 
     const auto& array_stub =
         Code::ZoneHandle(object_store->array_write_barrier_stub());
-    if (!array_stub.InVMHeap()) {
+    if (!array_stub.IsReadOnly()) {
       assembler_->generate_invoke_array_write_barrier_ = [&]() {
         AddPcRelativeCallStubTarget(array_stub);
         assembler_->GenerateUnRelocatedPcRelativeCall();
@@ -944,7 +944,8 @@
                                      const Code& stub,
                                      RawPcDescriptors::Kind kind,
                                      LocationSummary* locs) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions && !stub.InVMHeap()) {
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
+      !stub.IsReadOnly()) {
     AddPcRelativeCallStubTarget(stub);
     __ GenerateUnRelocatedPcRelativeCall();
     EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 0f087fa..e5c711e 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -31,7 +31,7 @@
 
     const auto& stub =
         Code::ZoneHandle(object_store->write_barrier_wrappers_stub());
-    if (!stub.InVMHeap()) {
+    if (!stub.IsReadOnly()) {
       assembler_->generate_invoke_write_barrier_wrapper_ = [&](Register reg) {
         const intptr_t offset_into_target =
             Thread::WriteBarrierWrappersOffsetForRegister(reg);
@@ -42,7 +42,7 @@
 
     const auto& array_stub =
         Code::ZoneHandle(object_store->array_write_barrier_stub());
-    if (!array_stub.InVMHeap()) {
+    if (!array_stub.IsReadOnly()) {
       assembler_->generate_invoke_array_write_barrier_ = [&]() {
         AddPcRelativeCallStubTarget(array_stub);
         assembler_->GenerateUnRelocatedPcRelativeCall();
@@ -940,7 +940,8 @@
                                      const Code& stub,
                                      RawPcDescriptors::Kind kind,
                                      LocationSummary* locs) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions && !stub.InVMHeap()) {
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
+      !stub.IsReadOnly()) {
     AddPcRelativeCallStubTarget(stub);
     __ GenerateUnRelocatedPcRelativeCall();
     EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index c8b82ed..4dbdd20 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -109,23 +109,33 @@
 
 const CidRangeVector& HierarchyInfo::SubtypeRangesForClass(
     const Class& klass,
-    bool include_abstract) {
+    bool include_abstract,
+    bool exclude_null) {
   ClassTable* table = thread()->isolate()->class_table();
   const intptr_t cid_count = table->NumCids();
-  CidRangeVector** cid_ranges =
-      include_abstract ? &cid_subtype_ranges_abstract_ : &cid_subtype_ranges_;
-  if (*cid_ranges == NULL) {
+  CidRangeVector** cid_ranges = nullptr;
+  if (include_abstract) {
+    ASSERT(!exclude_null);
+    cid_ranges = &cid_subtype_ranges_abstract_nullable_;
+  } else if (exclude_null) {
+    ASSERT(!include_abstract);
+    cid_ranges = &cid_subtype_ranges_nonnullable_;
+  } else {
+    ASSERT(!include_abstract);
+    ASSERT(!exclude_null);
+    cid_ranges = &cid_subtype_ranges_nullable_;
+  }
+  if (*cid_ranges == nullptr) {
     *cid_ranges = new CidRangeVector[cid_count];
   }
-
   CidRangeVector& ranges = (*cid_ranges)[klass.id()];
   if (ranges.length() == 0) {
     if (!FLAG_precompiled_mode) {
       BuildRangesForJIT(table, &ranges, klass, /*use_subtype_test=*/true,
-                        include_abstract);
+                        include_abstract, exclude_null);
     } else {
       BuildRangesFor(table, &ranges, klass, /*use_subtype_test=*/true,
-                     include_abstract);
+                     include_abstract, exclude_null);
     }
   }
   return ranges;
@@ -142,19 +152,29 @@
   CidRangeVector& ranges = cid_subclass_ranges_[klass.id()];
   if (ranges.length() == 0) {
     if (!FLAG_precompiled_mode) {
-      BuildRangesForJIT(table, &ranges, klass, /*use_subtype_test=*/true);
+      BuildRangesForJIT(table, &ranges, klass,
+                        /*use_subtype_test=*/true,
+                        /*include_abstract=*/false,
+                        /*exclude_null=*/false);
     } else {
-      BuildRangesFor(table, &ranges, klass, /*use_subtype_test=*/false);
+      BuildRangesFor(table, &ranges, klass,
+                     /*use_subtype_test=*/false,
+                     /*include_abstract=*/false,
+                     /*exclude_null=*/false);
     }
   }
   return ranges;
 }
 
+// Build the ranges either for:
+//    "<obj> as <Type>", or
+//    "<obj> is <Type>"
 void HierarchyInfo::BuildRangesFor(ClassTable* table,
                                    CidRangeVector* ranges,
                                    const Class& klass,
                                    bool use_subtype_test,
-                                   bool include_abstract) {
+                                   bool include_abstract,
+                                   bool exclude_null) {
   Zone* zone = thread()->zone();
   ClassTable* class_table = thread()->isolate()->class_table();
 
@@ -166,56 +186,68 @@
   AbstractType& super_type = AbstractType::Handle(zone);
   const intptr_t cid_count = table->NumCids();
 
+  // Iterate over all cids to find the ones to be included in the ranges.
   intptr_t start = -1;
+  intptr_t end = -1;
   for (intptr_t cid = kInstanceCid; cid < cid_count; ++cid) {
     // Create local zone because deep hierarchies may allocate lots of handles
     // within one iteration of this loop.
     StackZone stack_zone(thread());
     HANDLESCOPE(thread());
 
+    // Some cases are "don't care", i.e., they may or may not be included,
+    // whatever yields the least number of ranges for efficiency.
     if (!table->HasValidClassAt(cid)) continue;
     if (cid == kTypeArgumentsCid) continue;
     if (cid == kVoidCid) continue;
     if (cid == kDynamicCid) continue;
-    if (cid == kNullCid) continue;
+    if (cid == kNullCid && !exclude_null) continue;
     cls = table->At(cid);
     if (!include_abstract && cls.is_abstract()) continue;
     if (cls.is_patch()) continue;
     if (cls.IsTopLevel()) continue;
 
     // We are either interested in [CidRange]es of subclasses or subtypes.
-    bool test_succeded = false;
-    if (use_subtype_test) {
+    bool test_succeeded = false;
+    if (cid == kNullCid) {
+      ASSERT(exclude_null);
+      test_succeeded = false;
+    } else if (use_subtype_test) {
       cls_type = cls.RareType();
-      test_succeded = cls_type.IsSubtypeOf(dst_type, Heap::kNew);
+      test_succeeded = cls_type.IsSubtypeOf(dst_type, Heap::kNew);
     } else {
       while (!cls.IsObjectClass()) {
         if (cls.raw() == klass.raw()) {
-          test_succeded = true;
+          test_succeeded = true;
           break;
         }
-
         super_type = cls.super_type();
         const intptr_t type_class_id = super_type.type_class_id();
         cls = class_table->At(type_class_id);
       }
     }
 
-    if (start == -1 && test_succeded) {
-      start = cid;
-    } else if (start != -1 && !test_succeded) {
-      CidRange range(start, cid - 1);
+    if (test_succeeded) {
+      // On success, open a new or continue any open range.
+      if (start == -1) start = cid;
+      end = cid;
+    } else if (start != -1) {
+      // On failure, close any open range from start to end
+      // (the latter is the most recent succesful "do-care" cid).
+      ASSERT(start <= end);
+      CidRange range(start, end);
       ranges->Add(range);
       start = -1;
+      end = -1;
     }
   }
 
+  // Construct last range (either close open one, or add invalid).
   if (start != -1) {
-    CidRange range(start, cid_count - 1);
+    ASSERT(start <= end);
+    CidRange range(start, end);
     ranges->Add(range);
-  }
-
-  if (start == -1 && ranges->length() == 0) {
+  } else if (ranges->length() == 0) {
     CidRange range;
     ASSERT(range.IsIllegalRange());
     ranges->Add(range);
@@ -226,12 +258,14 @@
                                       CidRangeVector* ranges,
                                       const Class& dst_klass,
                                       bool use_subtype_test,
-                                      bool include_abstract) {
-  if (dst_klass.InVMHeap()) {
-    BuildRangesFor(table, ranges, dst_klass, use_subtype_test,
-                   include_abstract);
+                                      bool include_abstract,
+                                      bool exclude_null) {
+  if (dst_klass.IsReadOnly()) {
+    BuildRangesFor(table, ranges, dst_klass, use_subtype_test, include_abstract,
+                   exclude_null);
     return;
   }
+  ASSERT(!exclude_null);
 
   Zone* zone = thread()->zone();
   GrowableArray<intptr_t> cids;
@@ -417,10 +451,14 @@
 bool HierarchyInfo::InstanceOfHasClassRange(const AbstractType& type,
                                             intptr_t* lower_limit,
                                             intptr_t* upper_limit) {
+  ASSERT(FLAG_precompiled_mode);
   if (CanUseSubtypeRangeCheckFor(type)) {
     const Class& type_class =
         Class::Handle(thread()->zone(), type.type_class());
-    const CidRangeVector& ranges = SubtypeRangesForClass(type_class);
+    const CidRangeVector& ranges =
+        SubtypeRangesForClass(type_class,
+                              /*include_abstract=*/false,
+                              /*exclude_null=*/true);
     if (ranges.length() == 1) {
       const CidRange& range = ranges[0];
       if (!range.IsIllegalRange()) {
@@ -463,16 +501,19 @@
 
 Definition* Definition::OriginalDefinition() {
   Definition* defn = this;
-  while (defn->IsRedefinition() || defn->IsAssertAssignable() ||
-         defn->IsCheckArrayBound() || defn->IsGenericCheckBound()) {
-    if (defn->IsRedefinition()) {
-      defn = defn->AsRedefinition()->value()->definition();
-    } else if (defn->IsAssertAssignable()) {
-      defn = defn->AsAssertAssignable()->value()->definition();
-    } else if (defn->IsCheckArrayBound()) {
-      defn = defn->AsCheckArrayBound()->index()->definition();
+  while (true) {
+    if (auto redefinition = defn->AsRedefinition()) {
+      defn = redefinition->value()->definition();
+    } else if (auto assert_assignable = defn->AsAssertAssignable()) {
+      defn = assert_assignable->value()->definition();
+    } else if (auto check_array_bound = defn->AsCheckArrayBound()) {
+      defn = check_array_bound->index()->definition();
+    } else if (auto check_bound = defn->AsGenericCheckBound()) {
+      defn = check_bound->index()->definition();
+    } else if (auto check_null = defn->AsCheckNull()) {
+      defn = check_null->value()->definition();
     } else {
-      defn = defn->AsGenericCheckBound()->index()->definition();
+      break;
     }
   }
   return defn;
@@ -1970,9 +2011,13 @@
 static bool IsCommutative(Token::Kind op) {
   switch (op) {
     case Token::kMUL:
+      FALL_THROUGH;
     case Token::kADD:
+      FALL_THROUGH;
     case Token::kBIT_AND:
+      FALL_THROUGH;
     case Token::kBIT_OR:
+      FALL_THROUGH;
     case Token::kBIT_XOR:
       return true;
     default:
@@ -2154,26 +2199,32 @@
 
   switch (op_kind()) {
     case Token::kTRUNCDIV:
+      FALL_THROUGH;
     case Token::kMOD:
       // Check right value for zero.
       if (right.AsInt64Value() == 0) {
         break;  // Will throw.
       }
-    // Fall through.
+      FALL_THROUGH;
     case Token::kADD:
+      FALL_THROUGH;
     case Token::kSUB:
+      FALL_THROUGH;
     case Token::kMUL: {
       result = left.ArithmeticOp(op_kind(), right, Heap::kOld);
       break;
     }
     case Token::kSHL:
+      FALL_THROUGH;
     case Token::kSHR:
       if (right.AsInt64Value() >= 0) {
         result = left.ShiftOp(op_kind(), right, Heap::kOld);
       }
       break;
     case Token::kBIT_AND:
+      FALL_THROUGH;
     case Token::kBIT_OR:
+      FALL_THROUGH;
     case Token::kBIT_XOR: {
       result = left.BitOp(op_kind(), right, Heap::kOld);
       break;
@@ -2228,11 +2279,14 @@
     // range information.
     switch (op_kind()) {
       case Token::kBIT_AND:
+        FALL_THROUGH;
       case Token::kBIT_OR:
+        FALL_THROUGH;
       case Token::kBIT_XOR:
         replacement = new BinarySmiOpInstr(
             op_kind(), new Value(left()->definition()),
             new Value(right()->definition()), DeoptId::kNone);
+        FALL_THROUGH;
       default:
         break;
     }
@@ -3404,8 +3458,8 @@
   return this;
 }
 
-Instruction* CheckNullInstr::Canonicalize(FlowGraph* flow_graph) {
-  return (!value()->Type()->is_nullable()) ? NULL : this;
+Definition* CheckNullInstr::Canonicalize(FlowGraph* flow_graph) {
+  return (!value()->Type()->is_nullable()) ? value()->definition() : this;
 }
 
 BoxInstr* BoxInstr::Create(Representation from, Value* value) {
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 6241f4b..2d815ae 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -190,8 +190,9 @@
  public:
   explicit HierarchyInfo(Thread* thread)
       : ThreadStackResource(thread),
-        cid_subtype_ranges_(NULL),
-        cid_subtype_ranges_abstract_(NULL),
+        cid_subtype_ranges_nullable_(NULL),
+        cid_subtype_ranges_abstract_nullable_(NULL),
+        cid_subtype_ranges_nonnullable_(NULL),
         cid_subclass_ranges_(NULL) {
     thread->set_hierarchy_info(this);
   }
@@ -199,18 +200,22 @@
   ~HierarchyInfo() {
     thread()->set_hierarchy_info(NULL);
 
-    delete[] cid_subtype_ranges_;
-    cid_subtype_ranges_ = NULL;
+    delete[] cid_subtype_ranges_nullable_;
+    cid_subtype_ranges_nullable_ = NULL;
 
-    delete[] cid_subtype_ranges_abstract_;
-    cid_subtype_ranges_abstract_ = NULL;
+    delete[] cid_subtype_ranges_abstract_nullable_;
+    cid_subtype_ranges_abstract_nullable_ = NULL;
+
+    delete[] cid_subtype_ranges_nonnullable_;
+    cid_subtype_ranges_nonnullable_ = NULL;
 
     delete[] cid_subclass_ranges_;
     cid_subclass_ranges_ = NULL;
   }
 
   const CidRangeVector& SubtypeRangesForClass(const Class& klass,
-                                              bool include_abstract = false);
+                                              bool include_abstract,
+                                              bool exclude_null);
   const CidRangeVector& SubclassRangesForClass(const Class& klass);
 
   bool InstanceOfHasClassRange(const AbstractType& type,
@@ -237,12 +242,16 @@
 
  private:
   // Does not use any hierarchy information available in the system but computes
-  // it via O(n) class table traversal.
+  // it via O(n) class table traversal. The boolean parameters denote:
+  //   use_subtype_test : if set, IsSubtypeOf() is used to compute inclusion
+  //   include_abstract : if set, include abstract types (don't care otherwise)
+  //   exclude_null     : if set, exclude null types (don't care otherwise)
   void BuildRangesFor(ClassTable* table,
                       CidRangeVector* ranges,
                       const Class& klass,
                       bool use_subtype_test,
-                      bool include_abstract = false);
+                      bool include_abstract,
+                      bool exclude_null);
 
   // In JIT mode we use hierarchy information stored in the [RawClass]s
   // direct_subclasses_/direct_implementors_ arrays.
@@ -250,10 +259,12 @@
                          CidRangeVector* ranges,
                          const Class& klass,
                          bool use_subtype_test,
-                         bool include_abstract = false);
+                         bool include_abstract,
+                         bool exclude_null);
 
-  CidRangeVector* cid_subtype_ranges_;
-  CidRangeVector* cid_subtype_ranges_abstract_;
+  CidRangeVector* cid_subtype_ranges_nullable_;
+  CidRangeVector* cid_subtype_ranges_abstract_nullable_;
+  CidRangeVector* cid_subtype_ranges_nonnullable_;
   CidRangeVector* cid_subclass_ranges_;
 };
 
@@ -3099,7 +3110,7 @@
         argument_names_(argument_names),
         arguments_(arguments),
         token_pos_(token_pos) {
-    ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
+    ASSERT(argument_names.IsZoneHandle() || argument_names.IsReadOnly());
   }
 
   RawString* Selector() {
@@ -4793,7 +4804,11 @@
   virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
 
   virtual bool WillAllocateNewOrRemembered() const {
-    return Heap::IsAllocatableInNewSpace(cls().instance_size());
+    return WillAllocateNewOrRemembered(cls());
+  }
+
+  static bool WillAllocateNewOrRemembered(const Class& cls) {
+    return Heap::IsAllocatableInNewSpace(cls.instance_size());
   }
 
   PRINT_OPERANDS_TO_SUPPORT
@@ -4831,8 +4846,12 @@
   virtual bool HasUnknownSideEffects() const { return false; }
 
   virtual bool WillAllocateNewOrRemembered() const {
+    return WillAllocateNewOrRemembered(num_context_variables_);
+  }
+
+  static bool WillAllocateNewOrRemembered(intptr_t num_context_variables) {
     return Heap::IsAllocatableInNewSpace(
-        Context::InstanceSize(num_context_variables_));
+        Context::InstanceSize(num_context_variables));
   }
 
   virtual AliasIdentity Identity() const { return identity_; }
@@ -4985,9 +5004,9 @@
     if (!num_elements()->BindsToConstant()) return false;
     const Object& length = num_elements()->BoundConstant();
     if (!length.IsSmi()) return false;
-    intptr_t raw_length = Smi::Cast(length).Value();
-    // Compare Array::New.
-    return (raw_length >= 0) && (raw_length < Array::kMaxNewSpaceElements);
+    const intptr_t value = Smi::Cast(length).Value();
+    if (value < 0) return false;
+    return !Array::UseCardMarkingForAllocation(value);
   }
 
  private:
@@ -5222,8 +5241,12 @@
   virtual bool HasUnknownSideEffects() const { return false; }
 
   virtual bool WillAllocateNewOrRemembered() const {
+    return WillAllocateNewOrRemembered(context_variables().length());
+  }
+
+  static bool WillAllocateNewOrRemembered(intptr_t num_context_variables) {
     return Heap::IsAllocatableInNewSpace(
-        Context::InstanceSize(context_variables().length()));
+        Context::InstanceSize(num_context_variables));
   }
 
   PRINT_OPERANDS_TO_SUPPORT
@@ -7145,13 +7168,13 @@
 // CheckNull instruction takes one input (`value`) and tests it for `null`.
 // If `value` is `null`, then `NoSuchMethodError` is thrown. Otherwise,
 // execution proceeds to the next instruction.
-class CheckNullInstr : public TemplateInstruction<1, Throws, NoCSE> {
+class CheckNullInstr : public TemplateDefinition<1, Throws, Pure> {
  public:
   CheckNullInstr(Value* value,
                  const String& function_name,
                  intptr_t deopt_id,
                  TokenPosition token_pos)
-      : TemplateInstruction(deopt_id),
+      : TemplateDefinition(deopt_id),
         token_pos_(token_pos),
         function_name_(function_name) {
     ASSERT(function_name.IsNotTemporaryScopedHandle());
@@ -7168,13 +7191,14 @@
 
   DECLARE_INSTRUCTION(CheckNull)
 
+  virtual CompileType ComputeType() const;
+  virtual bool RecomputeType();
+
   // CheckNull can implicitly call Dart code (NoSuchMethodError constructor),
   // so it can lazily deopt.
   virtual bool ComputeCanDeoptimize() const { return true; }
 
-  virtual Instruction* Canonicalize(FlowGraph* flow_graph);
-
-  virtual bool HasUnknownSideEffects() const { return false; }
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
@@ -7239,6 +7263,9 @@
 
   DECLARE_INSTRUCTION(CheckArrayBound)
 
+  virtual CompileType ComputeType() const;
+  virtual bool RecomputeType();
+
   virtual bool ComputeCanDeoptimize() const { return true; }
 
   bool IsRedundant(const RangeBoundary& length);
@@ -7271,7 +7298,7 @@
 // returns the "safe" index when
 //   0 <= index < length
 // or otherwise throws an out-of-bounds exception (viz. non-speculative).
-class GenericCheckBoundInstr : public TemplateDefinition<2, Throws, NoCSE> {
+class GenericCheckBoundInstr : public TemplateDefinition<2, Throws, Pure> {
  public:
   GenericCheckBoundInstr(Value* length, Value* index, intptr_t deopt_id)
       : TemplateDefinition(deopt_id) {
@@ -7282,10 +7309,13 @@
   Value* length() const { return inputs_[kLengthPos]; }
   Value* index() const { return inputs_[kIndexPos]; }
 
-  virtual bool HasUnknownSideEffects() const { return false; }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
 
   DECLARE_INSTRUCTION(GenericCheckBound)
 
+  virtual CompileType ComputeType() const;
+  virtual bool RecomputeType();
+
   // GenericCheckBound can implicitly call Dart code (RangeError or
   // ArgumentError constructor), so it can lazily deopt.
   virtual bool ComputeCanDeoptimize() const { return true; }
@@ -7345,7 +7375,7 @@
   DISALLOW_COPY_AND_ASSIGN(CheckConditionInstr);
 };
 
-class UnboxedIntConverterInstr : public TemplateDefinition<1, NoThrow> {
+class UnboxedIntConverterInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   UnboxedIntConverterInstr(Representation from,
                            Representation to,
@@ -7382,8 +7412,6 @@
     return from();
   }
 
-  virtual bool HasUnknownSideEffects() const { return false; }
-
   virtual bool AttributesEqual(Instruction* other) const {
     ASSERT(other->IsUnboxedIntConverter());
     UnboxedIntConverterInstr* converter = other->AsUnboxedIntConverter();
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 6c3ea35..033b200 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -3083,7 +3083,7 @@
           : object_store->stack_overflow_stub_without_fpu_regs_stub());
   const bool using_shared_stub = locs()->call_on_shared_slow_path();
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-      using_shared_stub && !stub.InVMHeap()) {
+      using_shared_stub && !stub.IsReadOnly()) {
     compiler->AddPcRelativeCallStubTarget(stub);
     __ GenerateUnRelocatedPcRelativeCall(LS);
 
@@ -5778,7 +5778,7 @@
                     : object_store->null_error_stub_without_fpu_regs_stub());
   const bool using_shared_stub = locs()->call_on_shared_slow_path();
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-      using_shared_stub && !stub.InVMHeap()) {
+      using_shared_stub && !stub.IsReadOnly()) {
     compiler->AddPcRelativeCallStubTarget(stub);
     __ GenerateUnRelocatedPcRelativeCall(EQUAL);
 
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index ba567b0..64296ab 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -2727,7 +2727,7 @@
               : object_store->stack_overflow_stub_without_fpu_regs_stub());
 
       if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-          using_shared_stub && !stub.InVMHeap()) {
+          using_shared_stub && !stub.IsReadOnly()) {
         compiler->AddPcRelativeCallStubTarget(stub);
         __ GenerateUnRelocatedPcRelativeCall();
 
@@ -4995,7 +4995,7 @@
       live_fpu_regs ? object_store->null_error_stub_with_fpu_regs_stub()
                     : object_store->null_error_stub_without_fpu_regs_stub());
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-      using_shared_stub && !stub.InVMHeap()) {
+      using_shared_stub && !stub.IsReadOnly()) {
     compiler->AddPcRelativeCallStubTarget(stub);
     compiler->assembler()->GenerateUnRelocatedPcRelativeCall();
     return;
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index aa045cf..2c632c8 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -1854,7 +1854,9 @@
   }
 
   // Get the state.
-  __ LoadObject(temp, Field::ZoneHandle(compiler->zone(), field().Original()));
+  const Field& original =
+      Field::ZoneHandle(compiler->zone(), field().Original());
+  __ LoadObject(temp, original);
   __ movsxb(temp,
             FieldAddress(temp, Field::static_type_exactness_state_offset()));
 
@@ -1883,7 +1885,7 @@
     __ j(EQUAL, &ok);
 
     __ Bind(&call_runtime);
-    __ PushObject(field());
+    __ PushObject(original);
     __ pushq(value_reg);
     __ CallRuntime(kUpdateFieldCidRuntimeEntry, 2);
     __ Drop(2);
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 159a903..afde064 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -2554,19 +2554,30 @@
         break;
       }
       case kTypedDataInt8ArrayCid:
+        FALL_THROUGH;
       case kTypedDataUint8ArrayCid:
+        FALL_THROUGH;
       case kTypedDataUint8ClampedArrayCid:
+        FALL_THROUGH;
       case kExternalTypedDataUint8ArrayCid:
+        FALL_THROUGH;
       case kExternalTypedDataUint8ClampedArrayCid:
+        FALL_THROUGH;
       case kTypedDataInt16ArrayCid:
+        FALL_THROUGH;
       case kTypedDataUint16ArrayCid:
+        FALL_THROUGH;
       case kTypedDataInt32ArrayCid:
+        FALL_THROUGH;
       case kTypedDataUint32ArrayCid:
+        FALL_THROUGH;
       case kTypedDataInt64ArrayCid:
+        FALL_THROUGH;
       case kTypedDataUint64ArrayCid:
         ASSERT(value_type.IsIntType());
-      // Fall through.
+        FALL_THROUGH;
       case kTypedDataFloat32ArrayCid:
+        FALL_THROUGH;
       case kTypedDataFloat64ArrayCid: {
         type_args = flow_graph->constant_null();
         ASSERT((array_cid != kTypedDataFloat32ArrayCid &&
@@ -4091,7 +4102,7 @@
                              call->GetBlock()->try_index(), DeoptId::kNone);
       (*entry)->InheritDeoptTarget(Z, call);
       ASSERT(!call->HasUses());
-      *last = NULL;  // Empty body.
+      *last = NULL;    // Empty body.
       *result = NULL;  // Since no uses of original call, result will be unused.
       return true;
     }
diff --git a/runtime/vm/compiler/backend/loops.cc b/runtime/vm/compiler/backend/loops.cc
index f0e8a5b..f307a21 100644
--- a/runtime/vm/compiler/backend/loops.cc
+++ b/runtime/vm/compiler/backend/loops.cc
@@ -443,6 +443,10 @@
     // on the intended use of this information, clients should still test
     // dominance on the test and the initial value of the induction variable.
     x->bounds_.Add(InductionVar::Bound(branch, y));
+    // Record control induction.
+    if (branch == loop->header_->last_instruction()) {
+      loop->control_ = x;
+    }
   }
 }
 
@@ -774,6 +778,7 @@
       back_edges_(),
       induction_(),
       limit_(nullptr),
+      control_(nullptr),
       outer_(nullptr),
       inner_(nullptr),
       next_(nullptr) {}
@@ -795,6 +800,42 @@
   return false;
 }
 
+bool LoopInfo::IsAlwaysTaken(BlockEntryInstr* block) const {
+  // The loop header is always executed when executing a loop (including
+  // loop body of a do-while). Reject any other loop body block that is
+  // not directly controlled by header.
+  if (block == header_) {
+    return true;
+  } else if (block->PredecessorCount() != 1 ||
+             block->PredecessorAt(0) != header_) {
+    return false;
+  }
+  // If the loop has a control induction, make sure the condition is such
+  // that the loop body is entered at least once from the header.
+  if (control_ != nullptr) {
+    InductionVar* limit = nullptr;
+    for (auto bound : control_->bounds()) {
+      if (bound.branch_ == header_->last_instruction()) {
+        limit = bound.limit_;
+        break;
+      }
+    }
+    // Control iterates at least once?
+    if (limit != nullptr) {
+      int64_t stride = 0;
+      int64_t begin = 0;
+      int64_t end = 0;
+      if (InductionVar::IsLinear(control_, &stride) &&
+          InductionVar::IsConstant(control_->initial(), &begin) &&
+          InductionVar::IsConstant(limit, &end) &&
+          ((stride == 1 && begin < end) || (stride == -1 && begin > end))) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
 bool LoopInfo::IsHeaderPhi(Definition* def) const {
   return def != nullptr && def->IsPhi() && def->GetBlock() == header_ &&
          !def->AsPhi()->IsRedundant();  // phi(x,..,x) = x
diff --git a/runtime/vm/compiler/backend/loops.h b/runtime/vm/compiler/backend/loops.h
index 2bd3b31..215d26f 100644
--- a/runtime/vm/compiler/backend/loops.h
+++ b/runtime/vm/compiler/backend/loops.h
@@ -193,6 +193,9 @@
   // Returns true if given block is backedge of this loop.
   bool IsBackEdge(BlockEntryInstr* block) const;
 
+  // Returns true if given block is alway taken in this loop.
+  bool IsAlwaysTaken(BlockEntryInstr* block) const;
+
   // Returns true if given definition is a header phi for this loop.
   bool IsHeaderPhi(Definition* def) const;
 
@@ -220,6 +223,7 @@
   BitVector* blocks() const { return blocks_; }
   const GrowableArray<BlockEntryInstr*>& back_edges() { return back_edges_; }
   ConstraintInstr* limit() const { return limit_; }
+  InductionVar* control() const { return control_; }
   LoopInfo* outer() const { return outer_; }
   LoopInfo* inner() const { return inner_; }
   LoopInfo* next() const { return next_; }
@@ -255,6 +259,9 @@
   //               should we really store it here?
   ConstraintInstr* limit_;
 
+  // Control induction.
+  InductionVar* control_;
+
   // Loop hierarchy.
   LoopInfo* outer_;
   LoopInfo* inner_;
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index c507504..6f39110 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -202,7 +202,7 @@
         LoadIndexedInstr* load_indexed = instr->AsLoadIndexed();
         set_representation(load_indexed->representation());
         instance_ = load_indexed->array()->definition()->OriginalDefinition();
-        SetIndex(load_indexed->index()->definition(),
+        SetIndex(load_indexed->index()->definition()->OriginalDefinition(),
                  load_indexed->index_scale(), load_indexed->class_id());
         *is_load = true;
         break;
@@ -213,7 +213,7 @@
         set_representation(store_indexed->RequiredInputRepresentation(
             StoreIndexedInstr::kValuePos));
         instance_ = store_indexed->array()->definition()->OriginalDefinition();
-        SetIndex(store_indexed->index()->definition(),
+        SetIndex(store_indexed->index()->definition()->OriginalDefinition(),
                  store_indexed->index_scale(), store_indexed->class_id());
         *is_store = true;
         break;
@@ -1256,8 +1256,11 @@
   } else if (current->IsCheckEitherNonSmi()) {
     current->AsCheckEitherNonSmi()->set_licm_hoisted(true);
   } else if (current->IsCheckArrayBound()) {
-    ASSERT(!FLAG_precompiled_mode);  // AOT uses non-deopting GenericCheckBound
+    ASSERT(!FLAG_precompiled_mode);  // speculative in JIT only
     current->AsCheckArrayBound()->set_licm_hoisted(true);
+  } else if (current->IsGenericCheckBound()) {
+    ASSERT(FLAG_precompiled_mode);  // non-speculative in AOT only
+    // Does not deopt, so no need for licm_hoisted flag.
   } else if (current->IsTestCids()) {
     current->AsTestCids()->set_licm_hoisted(true);
   }
@@ -1353,27 +1356,61 @@
   }
 }
 
+// Returns true if instruction may have a "visible" effect,
+static bool MayHaveVisibleEffect(Instruction* instr) {
+  switch (instr->tag()) {
+    case Instruction::kStoreInstanceField:
+    case Instruction::kStoreStaticField:
+    case Instruction::kStoreIndexed:
+    case Instruction::kStoreIndexedUnsafe:
+      return true;
+    default:
+      return instr->HasUnknownSideEffects() || instr->MayThrow();
+  }
+}
+
 void LICM::Optimize() {
   if (flow_graph()->function().ProhibitsHoistingCheckClass()) {
     // Do not hoist any.
     return;
   }
 
+  // Compute loops and induction in flow graph.
+  const LoopHierarchy& loop_hierarchy = flow_graph()->GetLoopHierarchy();
   const ZoneGrowableArray<BlockEntryInstr*>& loop_headers =
-      flow_graph()->GetLoopHierarchy().headers();
+      loop_hierarchy.headers();
+  loop_hierarchy.ComputeInduction();
 
   ZoneGrowableArray<BitVector*>* loop_invariant_loads =
       flow_graph()->loop_invariant_loads();
 
+  // Iterate over all loops.
   for (intptr_t i = 0; i < loop_headers.length(); ++i) {
     BlockEntryInstr* header = loop_headers[i];
-    // Skip loop that don't have a pre-header block.
-    BlockEntryInstr* pre_header = header->ImmediateDominator();
-    if (pre_header == NULL) continue;
 
-    for (BitVector::Iterator loop_it(header->loop_info()->blocks());
-         !loop_it.Done(); loop_it.Advance()) {
+    // Skip loops that don't have a pre-header block.
+    BlockEntryInstr* pre_header = header->ImmediateDominator();
+    if (pre_header == nullptr) {
+      continue;
+    }
+
+    // Flag that remains true as long as the loop has not seen any instruction
+    // that may have a "visible" effect (write, throw, or other side-effect).
+    bool seen_visible_effect = false;
+
+    // Iterate over all blocks in the loop.
+    LoopInfo* loop = header->loop_info();
+    for (BitVector::Iterator loop_it(loop->blocks()); !loop_it.Done();
+         loop_it.Advance()) {
       BlockEntryInstr* block = flow_graph()->preorder()[loop_it.Current()];
+
+      // Preserve the "visible" effect flag as long as the preorder traversal
+      // sees always-taken blocks. This way, we can only hoist invariant
+      // may-throw instructions that are always seen during the first iteration.
+      if (!seen_visible_effect && !loop->IsAlwaysTaken(block)) {
+        seen_visible_effect = true;
+      }
+      // Iterate over all instructions in the block.
       for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
         Instruction* current = it.Current();
 
@@ -1382,24 +1419,35 @@
         // Otherwise we might move load past the initialization.
         if (LoadStaticFieldInstr* load = current->AsLoadStaticField()) {
           if (load->AllowsCSE() && !load->IsFieldInitialized()) {
+            seen_visible_effect = true;
             continue;
           }
         }
 
+        // Determine if we can hoist loop invariant code. Even may-throw
+        // instructions can be hoisted as long as its exception is still
+        // the very first "visible" effect of the loop.
+        bool is_loop_invariant = false;
         if ((current->AllowsCSE() ||
              IsLoopInvariantLoad(loop_invariant_loads, i, current)) &&
-            !current->MayThrow()) {
-          bool inputs_loop_invariant = true;
-          for (int i = 0; i < current->InputCount(); ++i) {
+            (!seen_visible_effect || !current->MayThrow())) {
+          is_loop_invariant = true;
+          for (intptr_t i = 0; i < current->InputCount(); ++i) {
             Definition* input_def = current->InputAt(i)->definition();
             if (!input_def->GetBlock()->Dominates(pre_header)) {
-              inputs_loop_invariant = false;
+              is_loop_invariant = false;
               break;
             }
           }
-          if (inputs_loop_invariant) {
-            Hoist(&it, pre_header, current);
-          }
+        }
+
+        // Hoist if all inputs are loop invariant. If not hoisted, any
+        // instruction that writes, may throw, or has an unknown side
+        // effect invalidates the first "visible" effect flag.
+        if (is_loop_invariant) {
+          Hoist(&it, pre_header, current);
+        } else if (!seen_visible_effect && MayHaveVisibleEffect(current)) {
+          seen_visible_effect = true;
         }
       }
     }
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 4f707cd..ca5aadb 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -192,17 +192,21 @@
   }
 }
 
+void FlowGraphTypePropagator::GrowTypes(intptr_t up_to) {
+  // Grow types array if a new redefinition was inserted.
+  for (intptr_t i = types_.length(); i <= up_to; ++i) {
+    types_.Add(nullptr);
+  }
+}
+
 void FlowGraphTypePropagator::EnsureMoreAccurateRedefinition(
     Instruction* prev,
     Definition* original,
     CompileType new_type) {
   RedefinitionInstr* redef =
       flow_graph_->EnsureRedefinition(prev, original, new_type);
-  // Grow types array if a new redefinition was inserted.
-  if (redef != NULL) {
-    for (intptr_t i = types_.length(); i <= redef->ssa_temp_index() + 1; ++i) {
-      types_.Add(NULL);
-    }
+  if (redef != nullptr) {
+    GrowTypes(redef->ssa_temp_index() + 1);
   }
 }
 
@@ -280,9 +284,21 @@
   Definition* receiver = check->value()->definition();
   CompileType* type = TypeOf(receiver);
   if (type->is_nullable()) {
-    // Insert redefinition for the receiver to guard against invalid
-    // code motion.
-    EnsureMoreAccurateRedefinition(check, receiver, type->CopyNonNullable());
+    // If the type is nullable, translate an implicit control
+    // dependence to an explicit data dependence at this point
+    // to guard against invalid code motion later. Valid code
+    // motion of the check may still enable valid code motion
+    // of the checked code.
+    if (check->ssa_temp_index() == -1) {
+      flow_graph_->AllocateSSAIndexes(check);
+      GrowTypes(check->ssa_temp_index() + 1);
+    }
+    FlowGraph::RenameDominatedUses(receiver, check, check);
+    // Set non-nullable type on check itself (but avoid None()).
+    CompileType result = type->CopyNonNullable();
+    if (!result.IsNone()) {
+      SetTypeOf(check, new (zone()) CompileType(result));
+    }
   }
 }
 
@@ -880,6 +896,37 @@
   return UpdateType(ComputeType());
 }
 
+CompileType CheckNullInstr::ComputeType() const {
+  CompileType* type = value()->Type();
+  if (type->is_nullable()) {
+    CompileType result = type->CopyNonNullable();
+    if (!result.IsNone()) {
+      return result;
+    }
+  }
+  return *type;
+}
+
+bool CheckNullInstr::RecomputeType() {
+  return UpdateType(ComputeType());
+}
+
+CompileType CheckArrayBoundInstr::ComputeType() const {
+  return *index()->Type();
+}
+
+bool CheckArrayBoundInstr::RecomputeType() {
+  return UpdateType(ComputeType());
+}
+
+CompileType GenericCheckBoundInstr::ComputeType() const {
+  return *index()->Type();
+}
+
+bool GenericCheckBoundInstr::RecomputeType() {
+  return UpdateType(ComputeType());
+}
+
 CompileType IfThenElseInstr::ComputeType() const {
   return CompileType::FromCid(kSmiCid);
 }
diff --git a/runtime/vm/compiler/backend/type_propagator.h b/runtime/vm/compiler/backend/type_propagator.h
index 28627ba..d59acf7 100644
--- a/runtime/vm/compiler/backend/type_propagator.h
+++ b/runtime/vm/compiler/backend/type_propagator.h
@@ -53,6 +53,9 @@
   // Mark definition as having given class id in all dominated instructions.
   void SetCid(Definition* value, intptr_t cid);
 
+  // Grow type array up to new index.
+  void GrowTypes(intptr_t up_to);
+
   // Ensures that redefinition with more accurate type is inserted after given
   // instruction.
   void EnsureMoreAccurateRedefinition(Instruction* prev,
diff --git a/runtime/vm/compiler/cha.cc b/runtime/vm/compiler/cha.cc
index 5a2fcdd..7856c72 100644
--- a/runtime/vm/compiler/cha.cc
+++ b/runtime/vm/compiler/cha.cc
@@ -39,7 +39,7 @@
   // read-only.
   // TODO(fschneider): Enable tracking of CHA dependent code for VM heap
   // classes.
-  if (cls.InVMHeap()) return true;
+  if (cls.IsReadOnly()) return true;
 
   if (cls.IsObjectClass()) {
     // Class Object has subclasses, although we do not keep track of them.
@@ -58,7 +58,7 @@
 
 bool CHA::ConcreteSubclasses(const Class& cls,
                              GrowableArray<intptr_t>* class_ids) {
-  if (cls.InVMHeap()) return false;
+  if (cls.IsReadOnly()) return false;
   if (cls.IsObjectClass()) return false;
 
   if (!cls.is_abstract()) {
@@ -87,7 +87,7 @@
   // read-only.
   // TODO(fschneider): Enable tracking of CHA dependent code for VM heap
   // classes.
-  if (cls.InVMHeap()) return true;
+  if (cls.IsReadOnly()) return true;
 
   return cls.is_implemented();
 }
@@ -129,7 +129,7 @@
   // read-only.
   // TODO(fschneider): Enable tracking of CHA dependent code for VM heap
   // classes.
-  if (cls.InVMHeap()) return true;
+  if (cls.IsReadOnly()) return true;
 
   // Subclasses of Object are not tracked by CHA. Safely assume that overrides
   // exist.
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index 24c985a..3829445 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -92,6 +92,8 @@
   "compiler_pass.h",
   "compiler_state.cc",
   "compiler_state.h",
+  "ffi.cc",
+  "ffi.h",
   "frontend/base_flow_graph_builder.cc",
   "frontend/base_flow_graph_builder.h",
   "frontend/bytecode_flow_graph_builder.cc",
diff --git a/runtime/vm/compiler/ffi.cc b/runtime/vm/compiler/ffi.cc
new file mode 100644
index 0000000..e343fc7
--- /dev/null
+++ b/runtime/vm/compiler/ffi.cc
@@ -0,0 +1,167 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/compiler/ffi.h"
+
+namespace dart {
+
+namespace ffi {
+
+#if defined(TARGET_ARCH_X64)
+
+static const size_t kSizeUnknown = 0;
+
+static const intptr_t kNumElementSizes = kFfiVoidCid - kFfiPointerCid + 1;
+
+static const size_t element_size_table[kNumElementSizes] = {
+    sizeof(intptr_t),  // kFfiPointerCid
+    kSizeUnknown,      // kFfiNativeFunctionCid
+    1,                 // kFfiInt8Cid
+    2,                 // kFfiInt16Cid
+    4,                 // kFfiInt32Cid
+    8,                 // kFfiInt64Cid
+    1,                 // kFfiUint8Cid
+    2,                 // kFfiUint16Cid
+    4,                 // kFfiUint32Cid
+    8,                 // kFfiUint64Cid
+    sizeof(intptr_t),  // kFfiIntPtrCid
+    4,                 // kFfiFloatCid
+    8,                 // kFfiDoubleCid
+    kSizeUnknown,      // kFfiVoidCid
+};
+
+Representation WordRep() {
+  return compiler::target::kWordSize > 4 ? kUnboxedInt64 : kUnboxedInt32;
+}
+
+size_t ElementSizeInBytes(intptr_t class_id) {
+  ASSERT(class_id != kFfiNativeFunctionCid);
+  ASSERT(class_id != kFfiVoidCid);
+  if (!RawObject::IsFfiTypeClassId(class_id)) {
+    // subtype of Pointer
+    class_id = kFfiPointerCid;
+  }
+  intptr_t index = class_id - kFfiPointerCid;
+  return element_size_table[index];
+}
+
+bool ElementIsSigned(intptr_t class_id) {
+  switch (class_id) {
+    case kFfiFloatCid:
+    case kFfiDoubleCid:
+    case kFfiInt8Cid:
+    case kFfiInt16Cid:
+    case kFfiInt32Cid:
+    case kFfiInt64Cid:
+    case kFfiIntPtrCid:
+      return true;
+    case kFfiUint8Cid:
+    case kFfiUint16Cid:
+    case kFfiUint32Cid:
+    case kFfiUint64Cid:
+    case kFfiPointerCid:
+    default:  // Subtypes of Pointer.
+      return false;
+  }
+}
+
+Representation TypeRepresentation(const AbstractType& result_type) {
+  switch (result_type.type_class_id()) {
+    case kFfiFloatCid:
+    case kFfiDoubleCid:
+      return kUnboxedDouble;
+    case kFfiInt8Cid:
+    case kFfiInt16Cid:
+    case kFfiInt32Cid:
+    case kFfiUint8Cid:
+    case kFfiUint16Cid:
+    case kFfiUint32Cid:
+      return kUnboxedInt32;
+    case kFfiInt64Cid:
+    case kFfiUint64Cid:
+      return kUnboxedInt64;
+    case kFfiIntPtrCid:
+    case kFfiPointerCid:
+    default:  // Subtypes of Pointer.
+      return WordRep();
+  }
+}
+
+// Converts a Ffi [signature] to a list of Representations.
+// Note that this ignores first argument (receiver) which is dynamic.
+ZoneGrowableArray<Representation>* ArgumentRepresentations(
+    const Function& signature) {
+  intptr_t num_arguments = signature.num_fixed_parameters() - 1;
+  auto result = new ZoneGrowableArray<Representation>(num_arguments);
+  for (intptr_t i = 0; i < num_arguments; i++) {
+    AbstractType& arg_type =
+        AbstractType::Handle(signature.ParameterTypeAt(i + 1));
+    result->Add(TypeRepresentation(arg_type));
+  }
+  return result;
+}
+
+// Takes a list of argument representations, and converts it to a list of
+// argument locations based on calling convention.
+ZoneGrowableArray<Location>* ArgumentLocations(
+    const ZoneGrowableArray<Representation>& arg_reps) {
+  intptr_t num_arguments = arg_reps.length();
+  auto result = new ZoneGrowableArray<Location>(num_arguments);
+  result->FillWith(Location(), 0, num_arguments);
+  Location* data = result->data();
+
+  // Loop through all arguments and assign a register or a stack location.
+  intptr_t regs_used = 0;
+  intptr_t xmm_regs_used = 0;
+  intptr_t nth_stack_argument = 0;
+  bool on_stack;
+  for (intptr_t i = 0; i < num_arguments; i++) {
+    on_stack = true;
+    switch (arg_reps.At(i)) {
+      case kUnboxedInt32:
+      case kUnboxedInt64:
+        if (regs_used < CallingConventions::kNumArgRegs) {
+          data[i] = Location::RegisterLocation(
+              CallingConventions::ArgumentRegisters[regs_used]);
+          regs_used++;
+          if (CallingConventions::kArgumentIntRegXorXmmReg) {
+            xmm_regs_used++;
+          }
+          on_stack = false;
+        }
+        break;
+      case kUnboxedDouble:
+        if (xmm_regs_used < CallingConventions::kNumXmmArgRegs) {
+          data[i] = Location::FpuRegisterLocation(
+              CallingConventions::XmmArgumentRegisters[xmm_regs_used]);
+          xmm_regs_used++;
+          if (CallingConventions::kArgumentIntRegXorXmmReg) {
+            regs_used++;
+          }
+          on_stack = false;
+        }
+        break;
+      default:
+        UNREACHABLE();
+    }
+    if (on_stack) {
+      // SAMIR_TODO: Is this correct?
+      data[i] = Location::StackSlot(nth_stack_argument, RSP);
+      nth_stack_argument++;
+    }
+  }
+  return result;
+}
+
+#else
+
+size_t ElementSizeInBytes(intptr_t class_id) {
+  UNREACHABLE();
+}
+
+#endif
+
+}  // namespace ffi
+
+}  // namespace dart
diff --git a/runtime/vm/compiler/ffi.h b/runtime/vm/compiler/ffi.h
new file mode 100644
index 0000000..b66818b
--- /dev/null
+++ b/runtime/vm/compiler/ffi.h
@@ -0,0 +1,39 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef RUNTIME_VM_COMPILER_FFI_H_
+#define RUNTIME_VM_COMPILER_FFI_H_
+
+#include <platform/globals.h>
+
+#include "../class_id.h"
+#include "../object.h"
+#include "../raw_object.h"
+#include "backend/locations.h"
+
+namespace dart {
+
+namespace ffi {
+
+// Native data types sizes in bytes
+
+size_t ElementSizeInBytes(intptr_t class_id);
+
+bool ElementIsSigned(intptr_t class_id);
+
+Representation TypeRepresentation(const AbstractType& result_type);
+
+Representation WordRep();
+
+ZoneGrowableArray<Representation>* ArgumentRepresentations(
+    const Function& signature);
+
+ZoneGrowableArray<Location>* ArgumentLocations(
+    const ZoneGrowableArray<Representation>& arg_reps);
+
+}  // namespace ffi
+
+}  // namespace dart
+
+#endif  // RUNTIME_VM_COMPILER_FFI_H_
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index eebb0b8..83fe857 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -325,6 +325,7 @@
 }
 
 Fragment BaseFlowGraphBuilder::LoadLocal(LocalVariable* variable) {
+  ASSERT(!variable->is_captured());
   LoadLocalInstr* load =
       new (Z) LoadLocalInstr(*variable, TokenPosition::kNoSource);
   Push(load);
@@ -470,6 +471,7 @@
 
 Fragment BaseFlowGraphBuilder::StoreLocalRaw(TokenPosition position,
                                              LocalVariable* variable) {
+  ASSERT(!variable->is_captured());
   Value* value = Pop();
   StoreLocalInstr* store = new (Z) StoreLocalInstr(*variable, value, position);
   Fragment instructions(store);
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index 3c7e344..b6e394a 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -308,8 +308,9 @@
   for (intptr_t i = 0; i < num_type_params; ++i) {
     name ^= ReadObject();
     ASSERT(name.IsSymbol());
-    parameter = TypeParameter::New(parameterized_class, parameterized_function,
-                                   i, name, bound, TokenPosition::kNoSource);
+    parameter = TypeParameter::New(
+        parameterized_class, parameterized_function, i, name, bound,
+        /* is_generic_covariant_impl = */ false, TokenPosition::kNoSource);
     type_parameters.SetTypeAt(i, parameter);
   }
 
diff --git a/runtime/vm/compiler/frontend/constant_evaluator.cc b/runtime/vm/compiler/frontend/constant_evaluator.cc
index 9c9b8ec..6733249 100644
--- a/runtime/vm/compiler/frontend/constant_evaluator.cc
+++ b/runtime/vm/compiler/frontend/constant_evaluator.cc
@@ -117,6 +117,10 @@
       case kLet:
         EvaluateLet();
         break;
+      case kBlockExpression: {
+        UNIMPLEMENTED();
+        break;
+      }
       case kInstantiation:
         EvaluatePartialTearoffInstantiation();
         break;
@@ -1033,7 +1037,7 @@
   }
 
   bool is_present = false;
-  ASSERT(!script_.InVMHeap());
+  ASSERT(!script_.IsReadOnly());
   if (script_.compile_time_constants() == Array::null()) {
     return false;
   }
@@ -1063,7 +1067,7 @@
     return;
   }
   const intptr_t kInitialConstMapSize = 16;
-  ASSERT(!script_.InVMHeap());
+  ASSERT(!script_.IsReadOnly());
   if (script_.compile_time_constants() == Array::null()) {
     const Array& array = Array::Handle(
         HashTables::New<KernelConstantsMap>(kInitialConstMapSize, Heap::kNew));
@@ -1201,6 +1205,11 @@
         temp_instance_ = H.Canonicalize(temp_array_);
         break;
       }
+      case kSetConstant:
+        // Set literals are currently desugared in the frontend and will not
+        // reach the VM. See http://dartbug.com/35124 for discussion.
+        UNREACHABLE();
+        break;
       case kInstanceConstant: {
         const NameIndex index = helper_.ReadCanonicalNameReference();
         if (ShouldSkipConstant(index)) {
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index bf8977a..7e77d3d 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -422,706 +422,30 @@
   return instructions;
 }
 
-// If no type arguments are passed to a generic function, we need to fill the
-// type arguments in with the default types stored on the TypeParameter nodes
-// in Kernel.
-Fragment StreamingFlowGraphBuilder::BuildDefaultTypeHandling(
-    const Function& function,
-    intptr_t type_parameters_offset) {
-  if (function.IsGeneric()) {
-    AlternativeReadingScope alt(&reader_);
-    SetOffset(type_parameters_offset);
-    intptr_t num_type_params = ReadListLength();
-    ASSERT(num_type_params == function.NumTypeParameters());
-    TypeArguments& default_types =
-        TypeArguments::ZoneHandle(TypeArguments::New(num_type_params));
-    for (intptr_t i = 0; i < num_type_params; ++i) {
-      TypeParameterHelper helper(this);
-      helper.ReadUntilExcludingAndSetJustRead(
-          TypeParameterHelper::kDefaultType);
-      if (ReadTag() == kSomething) {
-        default_types.SetTypeAt(i, T.BuildType());
-      } else {
-        default_types.SetTypeAt(i, Object::dynamic_type());
-      }
-      helper.Finish();
-    }
-    default_types = default_types.Canonicalize();
-
-    if (!default_types.IsNull()) {
-      Fragment then;
-      Fragment otherwise;
-
-      otherwise += TranslateInstantiatedTypeArguments(default_types);
-      otherwise += StoreLocal(TokenPosition::kNoSource,
-                              parsed_function()->function_type_arguments());
-      otherwise += Drop();
-      return B->TestAnyTypeArgs(then, otherwise);
-    }
-  }
-  return Fragment();
-}
-
-void StreamingFlowGraphBuilder::RecordUncheckedEntryPoint(
-    FunctionEntryInstr* extra_entry) {
-  // Closures always check all arguments on their checked entry-point, most
-  // call-sites are unchecked, and they're inlined less often, so it's very
-  // beneficial to build multiple entry-points for them. Regular methods however
-  // have fewer checks to begin with since they have dynamic invocation
-  // forwarders, so in AOT we implement a more conservative time-space tradeoff
-  // by only building the unchecked entry-point when inlining. We should
-  // reconsider this heuristic if we identify non-inlined type-checks in
-  // hotspots of new benchmarks.
-  if (!B->IsInlining() && (parsed_function()->function().IsClosureFunction() ||
-                           !FLAG_precompiled_mode)) {
-    B->graph_entry_->set_unchecked_entry(extra_entry);
-  } else if (B->InliningUncheckedEntry()) {
-    B->graph_entry_->set_normal_entry(extra_entry);
-  }
-}
-
-FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfImplicitClosureFunction(
+void StreamingFlowGraphBuilder::ReadDefaultFunctionTypeArguments(
     const Function& function) {
-  const Function& parent = Function::ZoneHandle(Z, function.parent_function());
-  const String& func_name = String::ZoneHandle(Z, parent.name());
-  const Class& owner = Class::ZoneHandle(Z, parent.Owner());
-  Function& target = Function::ZoneHandle(Z, owner.LookupFunction(func_name));
-
-  if (!target.IsNull() && (target.raw() != parent.raw())) {
-    DEBUG_ASSERT(Isolate::Current()->HasAttemptedReload());
-    if ((target.is_static() != parent.is_static()) ||
-        (target.kind() != parent.kind())) {
-      target = Function::null();
-    }
+  if (!function.IsGeneric()) {
+    return;
   }
-
-  if (target.IsNull() ||
-      (parent.num_fixed_parameters() != target.num_fixed_parameters())) {
-    return BuildGraphOfNoSuchMethodForwarder(function, true,
-                                             parent.is_static());
-  }
-
-  // The prologue builder needs the default parameter values.
-  SetupDefaultParameterValues();
-
-  flow_graph_builder_->graph_entry_ =
-      new (Z) GraphEntryInstr(*parsed_function(), Compiler::kNoOSRDeoptId);
-
-  auto normal_entry = flow_graph_builder_->BuildFunctionEntry(
-      flow_graph_builder_->graph_entry_);
-  flow_graph_builder_->graph_entry_->set_normal_entry(normal_entry);
-
-  PrologueInfo prologue_info(-1, -1);
-  BlockEntryInstr* instruction_cursor =
-      flow_graph_builder_->BuildPrologue(normal_entry, &prologue_info);
-
-  const Fragment prologue =
-      flow_graph_builder_->CheckStackOverflowInPrologue(function.token_pos());
-
+  AlternativeReadingScope alt(&reader_);
   FunctionNodeHelper function_node_helper(this);
   function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
-
-  const Fragment default_type_handling =
-      BuildDefaultTypeHandling(function, ReaderOffset());
-
-  const ProcedureAttributesMetadata parent_attrs =
-      procedure_attributes_metadata_helper_.GetProcedureAttributes(
-          parent.kernel_offset());
-
-  // We're going to throw away the explicit checks because the target will
-  // always check them.
-  Fragment implicit_checks;
-  if (function.NeedsArgumentTypeChecks(I)) {
-    Fragment explicit_checks_unused;
-    if (target.is_static()) {
-      // Tearoffs of static methods needs to perform arguments checks since
-      // static methods they forward to don't do it themselves.
-      AlternativeReadingScope _(&reader_);
-      BuildArgumentTypeChecks(kCheckAllTypeParameterBounds,
-                              &explicit_checks_unused, &implicit_checks,
-                              nullptr);
-    } else {
-      // Check if parent function was annotated with no-dynamic-invocations.
-      if (MethodCanSkipTypeChecksForNonCovariantArguments(parent,
-                                                          parent_attrs)) {
-        // If it was then we might need to build some checks in the
-        // tear-off.
-        AlternativeReadingScope _(&reader_);
-        BuildArgumentTypeChecks(kCheckNonCovariantTypeParameterBounds,
-                                &explicit_checks_unused, &implicit_checks,
-                                nullptr);
-      }
-    }
-  }
-
-  Fragment body;
-
-  function_node_helper.ReadUntilExcluding(
-      FunctionNodeHelper::kPositionalParameters);
-
-  intptr_t type_args_len = 0;
-  if (function.IsGeneric()) {
-    type_args_len = function.NumTypeParameters();
-    ASSERT(parsed_function()->function_type_arguments() != NULL);
-    body += LoadLocal(parsed_function()->function_type_arguments());
-    body += PushArgument();
-  }
-
-  // Load all the arguments.
-  if (!target.is_static()) {
-    // The context has a fixed shape: a single variable which is the
-    // closed-over receiver.
-    body +=
-        LoadLocal(parsed_function()->node_sequence()->scope()->VariableAt(0));
-    body += LoadNativeField(Slot::Closure_context());
-    body += LoadNativeField(
-        Slot::GetContextVariableSlotFor(thread(), *scopes()->this_variable));
-    body += PushArgument();
-  }
-
-  // Positional.
-  intptr_t positional_argument_count = ReadListLength();
-  for (intptr_t i = 0; i < positional_argument_count; ++i) {
-    body += LoadLocal(LookupVariable(
-        ReaderOffset() + data_program_offset_));  // ith variable offset.
-    body += PushArgument();
-    SkipVariableDeclaration();  // read ith variable.
-  }
-
-  // Named.
-  intptr_t named_argument_count = ReadListLength();
-  Array& argument_names = Array::ZoneHandle(Z);
-  if (named_argument_count > 0) {
-    argument_names = Array::New(named_argument_count, H.allocation_space());
-    for (intptr_t i = 0; i < named_argument_count; ++i) {
-      // ith variable offset.
-      body += LoadLocal(LookupVariable(ReaderOffset() + data_program_offset_));
-      body += PushArgument();
-
-      // read ith variable.
-      VariableDeclarationHelper helper(this);
-      helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
-
-      argument_names.SetAt(i, H.DartSymbolObfuscate(helper.name_index_));
-    }
-  }
-
-  // Forward them to the parent.
-  intptr_t argument_count = positional_argument_count + named_argument_count;
-  if (!parent.is_static()) {
-    ++argument_count;
-  }
-  body += StaticCall(TokenPosition::kNoSource, target, argument_count,
-                     argument_names, ICData::kNoRebind,
-                     /* result_type = */ NULL, type_args_len);
-
-  // Return the result.
-  body += Return(function_node_helper.end_position_);
-
-  // Setup multiple entrypoints if useful.
-  FunctionEntryInstr* extra_entry = nullptr;
-  if (function.MayHaveUncheckedEntryPoint(I)) {
-    // The prologue for a closure will always have context handling (e.g.
-    // setting up the 'this_variable'), but we don't need it on the unchecked
-    // entry because the only time we reference this is for loading the
-    // receiver, which we fetch directly from the context.
-    if (PrologueBuilder::PrologueSkippableOnUncheckedEntry(function)) {
-      // Use separate entry points since we can skip almost everything on the
-      // static entry.
-      extra_entry = BuildSeparateUncheckedEntryPoint(
-          /*normal_entry=*/instruction_cursor,
-          /*normal_prologue=*/prologue + default_type_handling +
-              implicit_checks,
-          /*extra_prologue=*/
-          B->CheckStackOverflowInPrologue(function.token_pos()),
-          /*shared_prologue=*/Fragment(),
-          /*body=*/body);
-    } else {
-      Fragment shared_prologue(normal_entry, instruction_cursor);
-      shared_prologue += prologue;
-      extra_entry = BuildSharedUncheckedEntryPoint(
-          /*shared_prologue_linked_in=*/shared_prologue,
-          /*skippable_checks=*/default_type_handling + implicit_checks,
-          /*redefinitions_if_skipped=*/Fragment(),
-          /*body=*/body);
-    }
-    RecordUncheckedEntryPoint(extra_entry);
-  } else {
-    Fragment function(instruction_cursor);
-    function += prologue;
-    function += default_type_handling;
-    function += implicit_checks;
-    function += body;
-  }
-
-  return new (Z)
-      FlowGraph(*parsed_function(), flow_graph_builder_->graph_entry_,
-                flow_graph_builder_->last_used_block_id_, prologue_info);
-}
-
-// If throw_no_such_method_error is set to true (defaults to false), an
-// instance of NoSuchMethodError is thrown. Otherwise, the instance
-// noSuchMethod is called.
-FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfNoSuchMethodForwarder(
-    const Function& function,
-    bool is_implicit_closure_function,
-    bool throw_no_such_method_error) {
-  // The prologue builder needs the default parameter values.
-  SetupDefaultParameterValues();
-
-  B->graph_entry_ =
-      new (Z) GraphEntryInstr(*parsed_function(), Compiler::kNoOSRDeoptId);
-
-  auto normal_entry = B->BuildFunctionEntry(B->graph_entry_);
-  B->graph_entry_->set_normal_entry(normal_entry);
-
-  PrologueInfo prologue_info(-1, -1);
-  BlockEntryInstr* instruction_cursor =
-      B->BuildPrologue(normal_entry, &prologue_info);
-
-  Fragment body(instruction_cursor);
-  body += B->CheckStackOverflowInPrologue(function.token_pos());
-
-  // If we are inside the tearoff wrapper function (implicit closure), we need
-  // to extract the receiver from the context. We just replace it directly on
-  // the stack to simplify the rest of the code.
-  if (is_implicit_closure_function && !function.is_static()) {
-    if (parsed_function()->has_arg_desc_var()) {
-      body += B->LoadArgDescriptor();
-      body += LoadNativeField(Slot::ArgumentsDescriptor_count());
-      body += LoadLocal(parsed_function()->current_context_var());
-      body += B->LoadNativeField(
-          Slot::GetContextVariableSlotFor(thread(), *scopes()->this_variable));
-      body += B->StoreFpRelativeSlot(
-          kWordSize * compiler::target::frame_layout.param_end_from_fp);
-    } else {
-      body += LoadLocal(parsed_function()->current_context_var());
-      body += B->LoadNativeField(
-          Slot::GetContextVariableSlotFor(thread(), *scopes()->this_variable));
-      body += B->StoreFpRelativeSlot(
-          kWordSize * (compiler::target::frame_layout.param_end_from_fp +
-                       function.NumParameters()));
-    }
-  }
-
-  FunctionNodeHelper function_node_helper(this);
-  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
-
-  if (function.NeedsArgumentTypeChecks(I)) {
-    AlternativeReadingScope _(&reader_);
-    BuildArgumentTypeChecks(kCheckAllTypeParameterBounds, &body, &body,
-                            nullptr);
-  }
-
-  function_node_helper.ReadUntilExcluding(
-      FunctionNodeHelper::kPositionalParameters);
-
-  body += MakeTemp();
-  LocalVariable* result = MakeTemporary();
-
-  // Do "++argument_count" if any type arguments were passed.
-  LocalVariable* argument_count_var = parsed_function()->expression_temp_var();
-  body += IntConstant(0);
-  body += StoreLocal(TokenPosition::kNoSource, argument_count_var);
-  body += Drop();
-  if (function.IsGeneric()) {
-    Fragment then;
-    Fragment otherwise;
-    otherwise += IntConstant(1);
-    otherwise += StoreLocal(TokenPosition::kNoSource, argument_count_var);
-    otherwise += Drop();
-    body += flow_graph_builder_->TestAnyTypeArgs(then, otherwise);
-  }
-
-  if (function.HasOptionalParameters()) {
-    body += B->LoadArgDescriptor();
-    body += LoadNativeField(Slot::ArgumentsDescriptor_count());
-  } else {
-    body += IntConstant(function.NumParameters());
-  }
-  body += LoadLocal(argument_count_var);
-  body += B->SmiBinaryOp(Token::kADD, /* truncate= */ true);
-  LocalVariable* argument_count = MakeTemporary();
-
-  // We are generating code like the following:
-  //
-  // var arguments = new Array<dynamic>(argument_count);
-  //
-  // int i = 0;
-  // if (any type arguments are passed) {
-  //   arguments[0] = function_type_arguments;
-  //   ++i;
-  // }
-  //
-  // for (; i < argument_count; ++i) {
-  //   arguments[i] = LoadFpRelativeSlot(
-  //       kWordSize * (frame_layout.param_end_from_fp + argument_count - i));
-  // }
-  body += Constant(TypeArguments::ZoneHandle(Z, TypeArguments::null()));
-  body += LoadLocal(argument_count);
-  body += CreateArray();
-  LocalVariable* arguments = MakeTemporary();
-
-  {
-    // int i = 0
-    LocalVariable* index = parsed_function()->expression_temp_var();
-    body += IntConstant(0);
-    body += StoreLocal(TokenPosition::kNoSource, index);
-    body += Drop();
-
-    // if (any type arguments are passed) {
-    //   arguments[0] = function_type_arguments;
-    //   i = 1;
-    // }
-    if (function.IsGeneric()) {
-      Fragment store;
-      store += LoadLocal(arguments);
-      store += IntConstant(0);
-      store += LoadFunctionTypeArguments();
-      store += StoreIndexed(kArrayCid);
-      store += IntConstant(1);
-      store += StoreLocal(TokenPosition::kNoSource, index);
-      store += Drop();
-      body += B->TestAnyTypeArgs(store, Fragment());
-    }
-
-    TargetEntryInstr* body_entry;
-    TargetEntryInstr* loop_exit;
-
-    Fragment condition;
-    // i < argument_count
-    condition += LoadLocal(index);
-    condition += LoadLocal(argument_count);
-    condition += B->SmiRelationalOp(Token::kLT);
-    condition += BranchIfTrue(&body_entry, &loop_exit, /*negate=*/false);
-
-    Fragment loop_body(body_entry);
-
-    // arguments[i] = LoadFpRelativeSlot(
-    //     kWordSize * (frame_layout.param_end_from_fp + argument_count - i));
-    loop_body += LoadLocal(arguments);
-    loop_body += LoadLocal(index);
-    loop_body += LoadLocal(argument_count);
-    loop_body += LoadLocal(index);
-    loop_body += B->SmiBinaryOp(Token::kSUB, /*truncate=*/true);
-    loop_body += B->LoadFpRelativeSlot(
-        kWordSize * compiler::target::frame_layout.param_end_from_fp);
-    loop_body += StoreIndexed(kArrayCid);
-
-    // ++i
-    loop_body += LoadLocal(index);
-    loop_body += IntConstant(1);
-    loop_body += B->SmiBinaryOp(Token::kADD, /*truncate=*/true);
-    loop_body += StoreLocal(TokenPosition::kNoSource, index);
-    loop_body += Drop();
-
-    JoinEntryInstr* join = BuildJoinEntry();
-    loop_body += Goto(join);
-
-    Fragment loop(join);
-    loop += condition;
-
-    Instruction* entry =
-        new (Z) GotoInstr(join, CompilerState::Current().GetNextDeoptId());
-    body += Fragment(entry, loop_exit);
-  }
-
-  // Load receiver.
-  if (is_implicit_closure_function) {
-    if (throw_no_such_method_error) {
-      const Function& parent =
-          Function::ZoneHandle(Z, function.parent_function());
-      const Class& owner = Class::ZoneHandle(Z, parent.Owner());
-      AbstractType& type = AbstractType::ZoneHandle(Z);
-      type ^= Type::New(owner, TypeArguments::Handle(Z), owner.token_pos(),
-                        Heap::kOld);
-      type ^= ClassFinalizer::FinalizeType(owner, type);
-      body += Constant(type);
-    } else {
-      body += LoadLocal(parsed_function()->current_context_var());
-      body += B->LoadNativeField(
-          Slot::GetContextVariableSlotFor(thread(), *scopes()->this_variable));
-    }
-  } else {
-    LocalScope* scope = parsed_function()->node_sequence()->scope();
-    body += LoadLocal(scope->VariableAt(0));
-  }
-  body += PushArgument();
-
-  body += Constant(String::ZoneHandle(Z, function.name()));
-  body += PushArgument();
-
-  if (!parsed_function()->has_arg_desc_var()) {
-    // If there is no variable for the arguments descriptor (this function's
-    // signature doesn't require it), then we need to create one.
-    Array& args_desc = Array::ZoneHandle(
-        Z, ArgumentsDescriptor::New(0, function.NumParameters()));
-    body += Constant(args_desc);
-  } else {
-    body += B->LoadArgDescriptor();
-  }
-  body += PushArgument();
-
-  body += LoadLocal(arguments);
-  body += PushArgument();
-
-  if (throw_no_such_method_error) {
-    const Function& parent =
-        Function::ZoneHandle(Z, function.parent_function());
-    const Class& owner = Class::ZoneHandle(Z, parent.Owner());
-    InvocationMirror::Level im_level = owner.IsTopLevel()
-                                           ? InvocationMirror::kTopLevel
-                                           : InvocationMirror::kStatic;
-    InvocationMirror::Kind im_kind;
-    if (function.IsImplicitGetterFunction() || function.IsGetterFunction()) {
-      im_kind = InvocationMirror::kGetter;
-    } else if (function.IsImplicitSetterFunction() ||
-               function.IsSetterFunction()) {
-      im_kind = InvocationMirror::kSetter;
-    } else {
-      im_kind = InvocationMirror::kMethod;
-    }
-    body += IntConstant(InvocationMirror::EncodeType(im_level, im_kind));
-  } else {
-    body += NullConstant();
-  }
-  body += PushArgument();
-
-  // Push the number of delayed type arguments.
-  if (function.IsClosureFunction()) {
-    LocalVariable* closure =
-        parsed_function()->node_sequence()->scope()->VariableAt(0);
-    Fragment then;
-    then += IntConstant(function.NumTypeParameters());
-    then += StoreLocal(TokenPosition::kNoSource, argument_count_var);
-    then += Drop();
-    Fragment otherwise;
-    otherwise += IntConstant(0);
-    otherwise += StoreLocal(TokenPosition::kNoSource, argument_count_var);
-    otherwise += Drop();
-    body += B->TestDelayedTypeArgs(closure, then, otherwise);
-    body += LoadLocal(argument_count_var);
-  } else {
-    body += IntConstant(0);
-  }
-  body += PushArgument();
-
-  const Class& mirror_class =
-      Class::Handle(Z, Library::LookupCoreClass(Symbols::InvocationMirror()));
-  ASSERT(!mirror_class.IsNull());
-  const Function& allocation_function = Function::ZoneHandle(
-      Z, mirror_class.LookupStaticFunction(Library::PrivateCoreLibName(
-             Symbols::AllocateInvocationMirrorForClosure())));
-  ASSERT(!allocation_function.IsNull());
-  body += StaticCall(TokenPosition::kMinSource, allocation_function,
-                     /* argument_count = */ 5, ICData::kStatic);
-  body += PushArgument();  // For the call to noSuchMethod.
-
-  if (throw_no_such_method_error) {
-    const Class& klass = Class::ZoneHandle(
-        Z, Library::LookupCoreClass(Symbols::NoSuchMethodError()));
-    ASSERT(!klass.IsNull());
-    const Function& throw_function = Function::ZoneHandle(
-        Z,
-        klass.LookupStaticFunctionAllowPrivate(Symbols::ThrowNewInvocation()));
-    ASSERT(!throw_function.IsNull());
-    body += StaticCall(TokenPosition::kNoSource, throw_function, 2,
-                       ICData::kStatic);
-  } else {
-    body += InstanceCall(TokenPosition::kNoSource, Symbols::NoSuchMethod(),
-                         Token::kILLEGAL, 2, 1);
-  }
-  body += StoreLocal(TokenPosition::kNoSource, result);
-  body += Drop();
-
-  body += Drop();  // arguments
-  body += Drop();  // argument count
-
-  AbstractType& return_type = AbstractType::Handle(function.result_type());
-  if (!return_type.IsDynamicType() && !return_type.IsVoidType() &&
-      !return_type.IsObjectType()) {
-    body += flow_graph_builder_->AssertAssignable(
-        TokenPosition::kNoSource, return_type, Symbols::Empty());
-  }
-  body += Return(TokenPosition::kNoSource);
-
-  return new (Z) FlowGraph(*parsed_function(), B->graph_entry_,
-                           B->last_used_block_id_, prologue_info);
-}
-
-void StreamingFlowGraphBuilder::BuildArgumentTypeChecks(
-    TypeChecksToBuild mode,
-    Fragment* explicit_checks,
-    Fragment* implicit_checks,
-    Fragment* implicit_redefinitions) {
-  if (!I->should_emit_strong_mode_checks()) return;
-
-  FunctionNodeHelper function_node_helper(this);
-  function_node_helper.SetNext(FunctionNodeHelper::kTypeParameters);
-  const Function& dart_function = parsed_function()->function();
-
-  const Function* forwarding_target = NULL;
-  if (parsed_function()->is_forwarding_stub()) {
-    NameIndex target_name = parsed_function()->forwarding_stub_super_target();
-    const String& name = dart_function.IsSetterFunction()
-                             ? H.DartSetterName(target_name)
-                             : H.DartProcedureName(target_name);
-    forwarding_target =
-        &Function::ZoneHandle(Z, H.LookupMethodByMember(target_name, name));
-    ASSERT(!forwarding_target->IsNull());
-  }
-
   intptr_t num_type_params = ReadListLength();
-  TypeArguments& forwarding_params = TypeArguments::Handle(Z);
-  if (forwarding_target != NULL) {
-    forwarding_params = forwarding_target->type_parameters();
-    ASSERT(forwarding_params.Length() == num_type_params);
-  }
-
-  TypeParameter& forwarding_param = TypeParameter::Handle(Z);
-  Fragment check_bounds;
+  ASSERT(num_type_params == function.NumTypeParameters());
+  TypeArguments& default_types =
+      TypeArguments::Handle(Z, TypeArguments::New(num_type_params));
   for (intptr_t i = 0; i < num_type_params; ++i) {
     TypeParameterHelper helper(this);
-    helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
-    String& name = H.DartSymbolObfuscate(helper.name_index_);
-    AbstractType& bound = T.BuildType();  // read bound
-    helper.Finish();
-
-    if (forwarding_target != NULL) {
-      forwarding_param ^= forwarding_params.TypeAt(i);
-      bound = forwarding_param.bound();
-    }
-
-    if (bound.IsTopType()) {
-      continue;
-    }
-
-    switch (mode) {
-      case kCheckAllTypeParameterBounds:
-        break;
-      case kCheckCovariantTypeParameterBounds:
-        if (!helper.IsGenericCovariantImpl()) {
-          continue;
-        }
-        break;
-      case kCheckNonCovariantTypeParameterBounds:
-        if (helper.IsGenericCovariantImpl()) {
-          continue;
-        }
-        break;
-    }
-
-    TypeParameter& param = TypeParameter::Handle(Z);
-    if (dart_function.IsFactory()) {
-      param ^= TypeArguments::Handle(
-                   Class::Handle(dart_function.Owner()).type_parameters())
-                   .TypeAt(i);
+    helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kDefaultType);
+    if (ReadTag() == kSomething) {
+      default_types.SetTypeAt(i, T.BuildType());
     } else {
-      param ^= TypeArguments::Handle(dart_function.type_parameters()).TypeAt(i);
+      default_types.SetTypeAt(i, Object::dynamic_type());
     }
-    ASSERT(param.IsFinalized());
-    check_bounds += CheckTypeArgumentBound(param, bound, name);
+    helper.Finish();
   }
-
-  // Type arguments passed through partial instantiation are guaranteed to be
-  // bounds-checked at the point of partial instantiation, so we don't need to
-  // check them again at the call-site.
-  if (dart_function.IsClosureFunction() && !check_bounds.is_empty() &&
-      FLAG_eliminate_type_checks) {
-    LocalVariable* closure =
-        parsed_function()->node_sequence()->scope()->VariableAt(0);
-    *implicit_checks += B->TestDelayedTypeArgs(closure, /*present=*/{},
-                                               /*absent=*/check_bounds);
-  } else {
-    *implicit_checks += check_bounds;
-  }
-
-  function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
-  function_node_helper.ReadUntilExcluding(
-      FunctionNodeHelper::kPositionalParameters);
-
-  // Positional.
-  const intptr_t num_positional_params = ReadListLength();
-  const intptr_t kFirstParameterOffset = 1;
-  for (intptr_t i = 0; i < num_positional_params; ++i) {
-    // ith variable offset.
-    const intptr_t offset = ReaderOffset();
-    VariableDeclarationHelper helper(this);
-    helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
-
-    LocalVariable* param = LookupVariable(offset + data_program_offset_);
-    if (!param->needs_type_check()) {
-      continue;
-    }
-
-    const AbstractType* target_type = &param->type();
-    if (forwarding_target != NULL) {
-      // We add 1 to the parameter index to account for the receiver.
-      target_type = &AbstractType::ZoneHandle(
-          Z, forwarding_target->ParameterTypeAt(kFirstParameterOffset + i));
-    }
-
-    if (target_type->IsTopType()) continue;
-
-    Fragment* checks = helper.IsCovariant() ? explicit_checks : implicit_checks;
-
-    *checks += LoadLocal(param);
-    *checks += CheckArgumentType(param, *target_type);
-    *checks += Drop();
-
-    if (!helper.IsCovariant() && implicit_redefinitions != nullptr &&
-        B->optimizing_) {
-      // We generate slightly different code in optimized vs. un-optimized code,
-      // which is ok since we don't allocate any deopt ids.
-      AssertNoDeoptIdsAllocatedScope no_deopt_allocation(H.thread());
-
-      *implicit_redefinitions += LoadLocal(param);
-      *implicit_redefinitions += RedefinitionWithType(*target_type);
-      *implicit_redefinitions += StoreLocal(TokenPosition::kNoSource, param);
-      *implicit_redefinitions += Drop();
-    }
-  }
-
-  // Named.
-  const intptr_t num_named_params = ReadListLength();
-  for (intptr_t i = 0; i < num_named_params; ++i) {
-    // ith variable offset.
-    const intptr_t offset = ReaderOffset();
-    VariableDeclarationHelper helper(this);
-    helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
-
-    LocalVariable* param = LookupVariable(offset + data_program_offset_);
-    if (!param->needs_type_check()) {
-      continue;
-    }
-
-    const AbstractType* target_type = &param->type();
-    if (forwarding_target != NULL) {
-      // We add 1 to the parameter index to account for the receiver.
-      target_type = &AbstractType::ZoneHandle(
-          Z, forwarding_target->ParameterTypeAt(num_positional_params + i + 1));
-    }
-
-    if (target_type->IsTopType()) continue;
-
-    Fragment* checks = helper.IsCovariant() ? explicit_checks : implicit_checks;
-
-    *checks += LoadLocal(param);
-    *checks += CheckArgumentType(param, *target_type);
-    *checks += Drop();
-
-    if (!helper.IsCovariant() && implicit_redefinitions != nullptr &&
-        B->optimizing_) {
-      // We generate slightly different code in optimized vs. un-optimized code,
-      // which is ok since we don't allocate any deopt ids.
-      AssertNoDeoptIdsAllocatedScope no_deopt_allocation(H.thread());
-
-      *implicit_redefinitions += LoadLocal(param);
-      *implicit_redefinitions += RedefinitionWithType(*target_type);
-      *implicit_redefinitions += StoreLocal(TokenPosition::kNoSource, param);
-      *implicit_redefinitions += Drop();
-    }
-  }
+  default_types = default_types.Canonicalize();
+  parsed_function()->SetDefaultFunctionTypeArguments(default_types);
 }
 
 Fragment StreamingFlowGraphBuilder::PushAllArguments(PushedArguments* pushed) {
@@ -1186,6 +510,8 @@
 
   // The prologue builder needs the default parameter values.
   SetupDefaultParameterValues();
+  // BuildDefaultTypeHandling needs default function type arguments.
+  ReadDefaultFunctionTypeArguments(dart_function);
 
   B->graph_entry_ = new (Z) GraphEntryInstr(*parsed_function(), B->osr_id_);
 
@@ -1225,7 +551,7 @@
 
   // Even if the caller did not pass argument vector we would still
   // call the target with instantiate-to-bounds type arguments.
-  body += BuildDefaultTypeHandling(dart_function, type_parameters_offset);
+  body += B->BuildDefaultTypeHandling(dart_function);
 
   String& name = String::Handle(Z, dart_function.name());
   name = Function::DemangleDynamicInvocationForwarderName(name);
@@ -1239,8 +565,9 @@
   {
     AlternativeReadingScope alt(&reader_);
     SetOffset(type_parameters_offset);
-    BuildArgumentTypeChecks(kCheckNonCovariantTypeParameterBounds, &body, &body,
-                            nullptr);
+    B->BuildArgumentTypeChecks(
+        TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds, &body, &body,
+        nullptr);
   }
 
   // Push all arguments and invoke the original method.
@@ -1338,10 +665,8 @@
 }
 
 Fragment StreamingFlowGraphBuilder::TypeArgumentsHandling(
-    const Function& dart_function,
-    intptr_t type_parameters_offset) {
-  Fragment prologue =
-      BuildDefaultTypeHandling(dart_function, type_parameters_offset);
+    const Function& dart_function) {
+  Fragment prologue = B->BuildDefaultTypeHandling(dart_function);
 
   if (dart_function.IsClosureFunction() &&
       dart_function.NumParentTypeParameters() > 0) {
@@ -1524,10 +849,10 @@
 
   AlternativeReadingScope _(&reader_);
   SetOffset(type_parameters_offset);
-  BuildArgumentTypeChecks(
+  B->BuildArgumentTypeChecks(
       MethodCanSkipTypeChecksForNonCovariantArguments(dart_function, attrs)
-          ? kCheckCovariantTypeParameterBounds
-          : kCheckAllTypeParameterBounds,
+          ? TypeChecksToBuild::kCheckCovariantTypeParameterBounds
+          : TypeChecksToBuild::kCheckAllTypeParameterBounds,
       explicit_checks, implicit_checks, implicit_redefinitions);
 }
 
@@ -1622,134 +947,7 @@
   return F;
 }
 
-// Pop the index of the current entry-point off the stack. If there is any
-// entrypoint-tracing hook registered in a pragma for the function, it is called
-// with the name of the current function and the current entry-point index.
-Fragment StreamingFlowGraphBuilder::BuildEntryPointsIntrospection() {
-  if (!FLAG_enable_testing_pragmas) return Drop();
-
-  auto& function = Function::Handle(Z, parsed_function()->function().raw());
-
-  if (function.IsImplicitClosureFunction()) {
-    const auto& parent = Function::Handle(Z, function.parent_function());
-    const auto& func_name = String::Handle(Z, parent.name());
-    const auto& owner = Class::Handle(Z, parent.Owner());
-    function = owner.LookupFunction(func_name);
-  }
-
-  auto& tmp = Object::Handle(Z);
-  tmp = function.Owner();
-  tmp = Class::Cast(tmp).library();
-  auto& library = Library::Cast(tmp);
-
-  Object& options = Object::Handle(Z);
-  if (!library.FindPragma(H.thread(), function, Symbols::vm_trace_entrypoints(),
-                          &options) ||
-      options.IsNull() || !options.IsClosure()) {
-    return Drop();
-  }
-  auto& closure = Closure::ZoneHandle(Z, Closure::Cast(options).raw());
-  LocalVariable* entry_point_num = MakeTemporary();
-
-  auto& function_name = String::ZoneHandle(
-      Z, String::New(function.ToLibNamePrefixedQualifiedCString(), Heap::kOld));
-  if (parsed_function()->function().IsImplicitClosureFunction()) {
-    function_name = String::Concat(
-        function_name, String::Handle(Z, String::New("#tearoff", Heap::kNew)),
-        Heap::kOld);
-  }
-
-  Fragment call_hook;
-  call_hook += Constant(closure);
-  call_hook += PushArgument();
-  call_hook += Constant(function_name);
-  call_hook += PushArgument();
-  call_hook += LoadLocal(entry_point_num);
-  call_hook += PushArgument();
-  call_hook += Constant(Function::ZoneHandle(Z, closure.function()));
-  call_hook += B->ClosureCall(TokenPosition::kNoSource,
-                              /*type_args_len=*/0, /*argument_count=*/3,
-                              /*argument_names=*/Array::ZoneHandle(Z));
-  call_hook += Drop();  // result of closure call
-  call_hook += Drop();  // entrypoint number
-  return call_hook;
-}
-
-FunctionEntryInstr* StreamingFlowGraphBuilder::BuildSharedUncheckedEntryPoint(
-    Fragment shared_prologue_linked_in,
-    Fragment skippable_checks,
-    Fragment redefinitions_if_skipped,
-    Fragment body) {
-  ASSERT(shared_prologue_linked_in.entry == B->graph_entry_->normal_entry());
-  ASSERT(parsed_function()->has_entry_points_temp_var());
-  Instruction* prologue_start = shared_prologue_linked_in.entry->next();
-
-  auto* join_entry = B->BuildJoinEntry();
-
-  Fragment normal_entry(shared_prologue_linked_in.entry);
-  normal_entry += IntConstant(UncheckedEntryPointStyle::kNone);
-  normal_entry += StoreLocal(TokenPosition::kNoSource,
-                             parsed_function()->entry_points_temp_var());
-  normal_entry += Drop();
-  normal_entry += Goto(join_entry);
-
-  auto* extra_target_entry = B->BuildFunctionEntry(B->graph_entry_);
-  Fragment extra_entry(extra_target_entry);
-  extra_entry += IntConstant(UncheckedEntryPointStyle::kSharedWithVariable);
-  extra_entry += StoreLocal(TokenPosition::kNoSource,
-                            parsed_function()->entry_points_temp_var());
-  extra_entry += Drop();
-  extra_entry += Goto(join_entry);
-
-  join_entry->LinkTo(prologue_start);
-
-  TargetEntryInstr *do_checks, *skip_checks;
-  shared_prologue_linked_in +=
-      LoadLocal(parsed_function()->entry_points_temp_var());
-  shared_prologue_linked_in += BuildEntryPointsIntrospection();
-  shared_prologue_linked_in +=
-      LoadLocal(parsed_function()->entry_points_temp_var());
-  shared_prologue_linked_in +=
-      IntConstant(UncheckedEntryPointStyle::kSharedWithVariable);
-  shared_prologue_linked_in +=
-      BranchIfEqual(&skip_checks, &do_checks, /*negate=*/false);
-
-  JoinEntryInstr* rest_entry = B->BuildJoinEntry();
-
-  Fragment(do_checks) + skippable_checks + Goto(rest_entry);
-  Fragment(skip_checks) + redefinitions_if_skipped + Goto(rest_entry);
-  Fragment(rest_entry) + body;
-
-  return extra_target_entry;
-}
-
-FunctionEntryInstr* StreamingFlowGraphBuilder::BuildSeparateUncheckedEntryPoint(
-    BlockEntryInstr* normal_entry,
-    Fragment normal_prologue,
-    Fragment extra_prologue,
-    Fragment shared_prologue,
-    Fragment body) {
-  auto* join_entry = BuildJoinEntry();
-  auto* extra_entry = B->BuildFunctionEntry(B->graph_entry_);
-
-  Fragment normal(normal_entry);
-  normal += IntConstant(UncheckedEntryPointStyle::kNone);
-  normal += BuildEntryPointsIntrospection();
-  normal += normal_prologue;
-  normal += Goto(join_entry);
-
-  Fragment extra(extra_entry);
-  extra += IntConstant(UncheckedEntryPointStyle::kSeparate);
-  extra += BuildEntryPointsIntrospection();
-  extra += extra_prologue;
-  extra += Goto(join_entry);
-
-  Fragment(join_entry) + shared_prologue + body;
-  return extra_entry;
-}
-
-StreamingFlowGraphBuilder::UncheckedEntryPointStyle
-StreamingFlowGraphBuilder::ChooseEntryPointStyle(
+UncheckedEntryPointStyle StreamingFlowGraphBuilder::ChooseEntryPointStyle(
     const Function& dart_function,
     const Fragment& implicit_type_checks,
     const Fragment& first_time_prologue,
@@ -1785,8 +983,13 @@
 
 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction(
     bool is_constructor) {
+  const Function& dart_function = parsed_function()->function();
+
   // The prologue builder needs the default parameter values.
   SetupDefaultParameterValues();
+  // TypeArgumentsHandling / BuildDefaultTypeHandling needs
+  // default function type arguments.
+  ReadDefaultFunctionTypeArguments(dart_function);
 
   intptr_t type_parameters_offset = 0;
   LocalVariable* first_parameter = nullptr;
@@ -1807,8 +1010,6 @@
     token_position = function_node_helper.position_;
   }
 
-  const Function& dart_function = parsed_function()->function();
-
   auto graph_entry = flow_graph_builder_->graph_entry_ =
       new (Z) GraphEntryInstr(*parsed_function(), flow_graph_builder_->osr_id_);
 
@@ -1832,8 +1033,7 @@
   // TODO(#34162): We can remove the default type handling (and
   // shorten the prologue type handling sequence) for non-dynamic invocations of
   // regular methods.
-  const Fragment type_args_handling =
-      TypeArgumentsHandling(dart_function, type_parameters_offset);
+  const Fragment type_args_handling = TypeArgumentsHandling(dart_function);
 
   Fragment explicit_type_checks;
   Fragment implicit_type_checks;
@@ -1867,7 +1067,7 @@
         const Fragment prologue_copy = BuildEveryTimePrologue(
             dart_function, token_position, type_parameters_offset);
 
-        extra_entry = BuildSeparateUncheckedEntryPoint(
+        extra_entry = B->BuildSeparateUncheckedEntryPoint(
             normal_entry,
             /*normal_prologue=*/every_time_prologue + implicit_type_checks,
             /*extra_prologue=*/prologue_copy,
@@ -1881,7 +1081,7 @@
         prologue += first_time_prologue;
         prologue += type_args_handling;
         prologue += explicit_type_checks;
-        extra_entry = BuildSharedUncheckedEntryPoint(
+        extra_entry = B->BuildSharedUncheckedEntryPoint(
             /*shared_prologue_linked_in=*/prologue,
             /*skippable_checks=*/implicit_type_checks,
             /*redefinitions_if_skipped=*/implicit_redefinitions,
@@ -1890,7 +1090,7 @@
       }
     }
     if (extra_entry != nullptr) {
-      RecordUncheckedEntryPoint(extra_entry);
+      B->RecordUncheckedEntryPoint(extra_entry);
     }
   } else {
     // If the function's body contains any yield points, build switch statement
@@ -1972,9 +1172,16 @@
         procedure_helper.ReadUntilExcluding(ProcedureHelper::kFunction);
         if (procedure_helper.IsForwardingStub() &&
             !procedure_helper.IsAbstract()) {
-          ASSERT(procedure_helper.forwarding_stub_super_target_ != -1);
-          parsed_function()->MarkForwardingStub(
-              procedure_helper.forwarding_stub_super_target_);
+          const NameIndex target_name =
+              procedure_helper.forwarding_stub_super_target_;
+          ASSERT(target_name != NameIndex::kInvalidName);
+          const String& name = function.IsSetterFunction()
+                                   ? H.DartSetterName(target_name)
+                                   : H.DartProcedureName(target_name);
+          const Function* forwarding_target = &Function::ZoneHandle(
+              Z, H.LookupMethodByMember(target_name, name));
+          ASSERT(!forwarding_target->IsNull());
+          parsed_function()->MarkForwardingStub(forwarding_target);
         }
       }
       break;
@@ -1991,15 +1198,8 @@
 
   switch (function.kind()) {
     case RawFunction::kRegularFunction:
-    case RawFunction::kImplicitClosureFunction:
     case RawFunction::kGetterFunction:
-    case RawFunction::kSetterFunction: {
-      ReadUntilFunctionNode();
-      if (function.IsImplicitClosureFunction()) {
-        return BuildGraphOfImplicitClosureFunction(function);
-      }
-    }
-    /* Falls through */
+    case RawFunction::kSetterFunction:
     case RawFunction::kClosureFunction: {
       ReadUntilFunctionNode();
       return BuildGraphOfFunction(false);
@@ -2028,6 +1228,11 @@
       return flow_graph_builder_->BuildGraphOfNoSuchMethodDispatcher(function);
     case RawFunction::kInvokeFieldDispatcher:
       return flow_graph_builder_->BuildGraphOfInvokeFieldDispatcher(function);
+    case RawFunction::kImplicitClosureFunction:
+      ReadUntilFunctionNode();
+      SetupDefaultParameterValues();
+      ReadDefaultFunctionTypeArguments(function);
+      return flow_graph_builder_->BuildGraphOfImplicitClosureFunction(function);
     case RawFunction::kSignatureFunction:
     case RawFunction::kIrregexpFunction:
     case RawFunction::kFfiTrampoline:
@@ -2126,6 +1331,10 @@
       return BuildFunctionExpression();
     case kLet:
       return BuildLet(position);
+    case kBlockExpression: {
+      UNIMPLEMENTED();
+      break;
+    }
     case kBigIntLiteral:
       return BuildBigIntLiteral(position);
     case kStringLiteral:
@@ -2616,18 +1825,22 @@
   // Save the current position and restore it afterwards.
   AlternativeReadingScope alt(&reader_);
 
-  TryFinallyBlock* const saved_block = B->try_finally_block_;
+  // Save context.
+  TryFinallyBlock* const saved_finally_block = B->try_finally_block_;
   TryCatchBlock* const saved_try_catch_block = B->CurrentTryCatchBlock();
-  const intptr_t saved_depth = B->context_depth_;
-  const intptr_t saved_try_depth = B->try_depth_;
+  const intptr_t saved_context_depth = B->context_depth_;
+  const ProgramState state(B->breakable_block_, B->switch_block_,
+                           B->loop_depth_, B->for_in_depth_, B->try_depth_,
+                           B->catch_depth_);
 
   Fragment instructions;
 
   // While translating the body of a finalizer we need to set the try-finally
   // block which is active when translating the body.
   while (B->try_finally_block_ != outer_finally) {
-    // Set correct try depth (in case there are nested try statements).
-    B->try_depth_ = B->try_finally_block_->try_depth();
+    ASSERT(B->try_finally_block_ != nullptr);
+    // Adjust program context to finalizer's position.
+    B->try_finally_block_->state().assignTo(B);
 
     // Potentially restore the context to what is expected for the finally
     // block.
@@ -2664,10 +1877,11 @@
     instructions += B->AdjustContextTo(target_context_depth);
   }
 
-  B->try_finally_block_ = saved_block;
+  // Restore.
+  B->try_finally_block_ = saved_finally_block;
   B->SetCurrentTryCatchBlock(saved_try_catch_block);
-  B->context_depth_ = saved_depth;
-  B->try_depth_ = saved_try_depth;
+  B->context_depth_ = saved_context_depth;
+  state.assignTo(B);
 
   return instructions;
 }
@@ -5540,7 +4754,7 @@
   //
   //  a) 1/2/3th case: Special control flow going out of `node->body()`:
   //
-  //   * [BreakStatement] transfers control to a [LabledStatement]
+  //   * [BreakStatement] transfers control to a [LabeledStatement]
   //   * [ContinueSwitchStatement] transfers control to a [SwitchCase]
   //   * [ReturnStatement] returns a value
   //
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 01b6693..b12d4e3 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -59,48 +59,15 @@
   FlowGraph* BuildGraphOfFieldInitializer();
   FlowGraph* BuildGraphOfFieldAccessor(LocalVariable* setter_value);
   void SetupDefaultParameterValues();
+  void ReadDefaultFunctionTypeArguments(const Function& function);
   Fragment BuildFieldInitializer(NameIndex canonical_name);
   Fragment BuildInitializers(const Class& parent_class);
-  FlowGraph* BuildGraphOfImplicitClosureFunction(const Function& function);
   FlowGraph* BuildGraphOfFunction(bool constructor);
   FlowGraph* BuildGraphOfDynamicInvocationForwarder();
-  FlowGraph* BuildGraphOfNoSuchMethodForwarder(
-      const Function& function,
-      bool is_implicit_closure_function,
-      bool throw_no_such_method_error = false);
 
   Fragment BuildExpression(TokenPosition* position = NULL);
   Fragment BuildStatement();
 
-  // Indicates which form of the unchecked entrypoint we are compiling.
-  //
-  // kNone:
-  //
-  //   There is no unchecked entrypoint: the unchecked entry is set to NULL in
-  //   the 'GraphEntryInstr'.
-  //
-  // kSeparate:
-  //
-  //   The normal and unchecked entrypoint each point to their own versions of
-  //   the prologue, containing exactly those checks which need to be performed
-  //   on either side. Both sides jump directly to the body after performing
-  //   their prologue.
-  //
-  // kSharedWithVariable:
-  //
-  //   A temporary variable is allocated and initialized to 0 on normal entry
-  //   and 2 on unchecked entry. Code which should be ommitted on the unchecked
-  //   entrypoint is made conditional on this variable being equal to 0.
-  //
-  struct UncheckedEntryPointStyle_ {
-    enum Style {
-      kNone = 0,
-      kSeparate = 1,
-      kSharedWithVariable = 2,
-    };
-  };
-  typedef UncheckedEntryPointStyle_::Style UncheckedEntryPointStyle;
-
   // Kernel offset:
   //   start of function expression -> end of function body statement
   Fragment BuildFunctionBody(const Function& dart_function,
@@ -121,27 +88,13 @@
   Fragment SetupCapturedParameters(const Function& dart_function);
   Fragment ShortcutForUserDefinedEquals(const Function& dart_function,
                                         LocalVariable* first_parameter);
-  Fragment TypeArgumentsHandling(const Function& dart_function,
-                                 intptr_t type_parameters_offset);
+  Fragment TypeArgumentsHandling(const Function& dart_function);
   void CheckArgumentTypesAsNecessary(const Function& dart_function,
                                      intptr_t type_parameters_offset,
                                      Fragment* explicit_checks,
                                      Fragment* implicit_checks,
                                      Fragment* implicit_redefinitions);
   Fragment CompleteBodyWithYieldContinuations(Fragment body);
-  FunctionEntryInstr* BuildSeparateUncheckedEntryPoint(
-      BlockEntryInstr* normal_entry,
-      Fragment normal_prologue,
-      Fragment extra_prologue,
-      Fragment shared_prologue,
-      Fragment body);
-  FunctionEntryInstr* BuildSharedUncheckedEntryPoint(
-      Fragment prologue_from_normal_entry,
-      Fragment skippable_checks,
-      Fragment redefinitions_if_skipped,
-      Fragment body);
-
-  Fragment BuildEntryPointsIntrospection();
 
   static UncheckedEntryPointStyle ChooseEntryPointStyle(
       const Function& dart_function,
@@ -150,8 +103,6 @@
       const Fragment& every_time_prologue,
       const Fragment& type_args_handling);
 
-  void RecordUncheckedEntryPoint(FunctionEntryInstr* extra_entry);
-
   void loop_depth_inc();
   void loop_depth_dec();
   intptr_t for_in_depth();
@@ -242,16 +193,6 @@
       bool use_unchecked_entry = false,
       const CallSiteAttributesMetadata* call_site_attrs = nullptr);
 
-  enum TypeChecksToBuild {
-    kCheckAllTypeParameterBounds,
-    kCheckNonCovariantTypeParameterBounds,
-    kCheckCovariantTypeParameterBounds,
-  };
-
-  // Does not move the cursor.
-  Fragment BuildDefaultTypeHandling(const Function& function,
-                                    intptr_t type_parameters_offset);
-
   struct PushedArguments {
     intptr_t type_args_len;
     intptr_t argument_count;
@@ -259,11 +200,6 @@
   };
   Fragment PushAllArguments(PushedArguments* pushed);
 
-  void BuildArgumentTypeChecks(TypeChecksToBuild mode,
-                               Fragment* explicit_checks,
-                               Fragment* implicit_checks,
-                               Fragment* implicit_redefinitions);
-
   Fragment ThrowException(TokenPosition position);
   Fragment BooleanNegate();
   Fragment TranslateInstantiatedTypeArguments(
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
index 03a4e59..58675d6 100644
--- a/runtime/vm/compiler/frontend/kernel_fingerprints.cc
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
@@ -505,6 +505,10 @@
       CalculateVariableDeclarationFingerprint();  // read variable declaration.
       CalculateExpressionFingerprint();           // read expression.
       return;
+    case kBlockExpression: {
+      UNIMPLEMENTED();
+      return;
+    }
     case kInstantiation:
       CalculateExpressionFingerprint();       // read expression.
       CalculateListOfDartTypesFingerprint();  // read type arguments.
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index dcc617c..9da71ef 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -1116,6 +1116,118 @@
   return instructions;
 }
 
+void FlowGraphBuilder::BuildArgumentTypeChecks(
+    TypeChecksToBuild mode,
+    Fragment* explicit_checks,
+    Fragment* implicit_checks,
+    Fragment* implicit_redefinitions) {
+  if (!I->should_emit_strong_mode_checks()) return;
+  const Function& dart_function = parsed_function_->function();
+
+  const Function* forwarding_target = nullptr;
+  if (parsed_function_->is_forwarding_stub()) {
+    forwarding_target = parsed_function_->forwarding_stub_super_target();
+    ASSERT(!forwarding_target->IsNull());
+  }
+
+  TypeArguments& type_parameters = TypeArguments::Handle(Z);
+  if (dart_function.IsFactory()) {
+    type_parameters = Class::Handle(Z, dart_function.Owner()).type_parameters();
+  } else {
+    type_parameters = dart_function.type_parameters();
+  }
+  intptr_t num_type_params = type_parameters.Length();
+  if (forwarding_target != nullptr) {
+    type_parameters = forwarding_target->type_parameters();
+    ASSERT(type_parameters.Length() == num_type_params);
+  }
+
+  TypeParameter& type_param = TypeParameter::Handle(Z);
+  String& name = String::Handle(Z);
+  AbstractType& bound = AbstractType::Handle(Z);
+  Fragment check_bounds;
+  for (intptr_t i = 0; i < num_type_params; ++i) {
+    type_param ^= type_parameters.TypeAt(i);
+
+    bound = type_param.bound();
+    if (bound.IsTopType()) {
+      continue;
+    }
+
+    switch (mode) {
+      case TypeChecksToBuild::kCheckAllTypeParameterBounds:
+        break;
+      case TypeChecksToBuild::kCheckCovariantTypeParameterBounds:
+        if (!type_param.IsGenericCovariantImpl()) {
+          continue;
+        }
+        break;
+      case TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds:
+        if (type_param.IsGenericCovariantImpl()) {
+          continue;
+        }
+        break;
+    }
+
+    name = type_param.name();
+
+    ASSERT(type_param.IsFinalized());
+    check_bounds +=
+        AssertSubtype(TokenPosition::kNoSource, type_param, bound, name);
+  }
+
+  // Type arguments passed through partial instantiation are guaranteed to be
+  // bounds-checked at the point of partial instantiation, so we don't need to
+  // check them again at the call-site.
+  if (dart_function.IsClosureFunction() && !check_bounds.is_empty() &&
+      FLAG_eliminate_type_checks) {
+    LocalVariable* closure =
+        parsed_function_->node_sequence()->scope()->VariableAt(0);
+    *implicit_checks += TestDelayedTypeArgs(closure, /*present=*/{},
+                                            /*absent=*/check_bounds);
+  } else {
+    *implicit_checks += check_bounds;
+  }
+
+  const intptr_t num_params = dart_function.NumParameters();
+  for (intptr_t i = dart_function.NumImplicitParameters(); i < num_params;
+       ++i) {
+    LocalVariable* param =
+        parsed_function_->node_sequence()->scope()->VariableAt(i);
+    if (!param->needs_type_check()) {
+      continue;
+    }
+
+    const AbstractType* target_type = &param->type();
+    if (forwarding_target != NULL) {
+      // We add 1 to the parameter index to account for the receiver.
+      target_type =
+          &AbstractType::ZoneHandle(Z, forwarding_target->ParameterTypeAt(i));
+    }
+
+    if (target_type->IsTopType()) continue;
+
+    const bool is_covariant = param->is_explicit_covariant_parameter();
+    Fragment* checks = is_covariant ? explicit_checks : implicit_checks;
+
+    *checks += LoadLocal(param);
+    *checks += CheckAssignable(*target_type, param->name(),
+                               AssertAssignableInstr::kParameterCheck);
+    *checks += Drop();
+
+    if (!is_covariant && implicit_redefinitions != nullptr && optimizing_) {
+      // We generate slightly different code in optimized vs. un-optimized code,
+      // which is ok since we don't allocate any deopt ids.
+      AssertNoDeoptIdsAllocatedScope no_deopt_allocation(thread_);
+
+      *implicit_redefinitions += LoadLocal(param);
+      *implicit_redefinitions += RedefinitionWithType(*target_type);
+      *implicit_redefinitions += StoreLocal(TokenPosition::kNoSource, param);
+      *implicit_redefinitions += Drop();
+    }
+  }
+}
+
 BlockEntryInstr* FlowGraphBuilder::BuildPrologue(BlockEntryInstr* normal_entry,
                                                  PrologueInfo* prologue_info) {
   const bool compiling_for_osr = IsCompiledForOsr();
@@ -1277,7 +1389,7 @@
   ASSERT(!owner.IsNull());
   const String& field_name = String::Handle(Z, function.name());
   const String& getter_name = String::ZoneHandle(
-      Z, Symbols::New(H.thread(),
+      Z, Symbols::New(thread_,
                       String::Handle(Z, Field::GetterSymbol(field_name))));
 
   // Determine if this is `class Closure { get call => this; }`
@@ -1376,6 +1488,609 @@
                            prologue_info);
 }
 
+FlowGraph* FlowGraphBuilder::BuildGraphOfNoSuchMethodForwarder(
+    const Function& function,
+    bool is_implicit_closure_function,
+    bool throw_no_such_method_error) {
+  graph_entry_ =
+      new (Z) GraphEntryInstr(*parsed_function_, Compiler::kNoOSRDeoptId);
+
+  auto normal_entry = BuildFunctionEntry(graph_entry_);
+  graph_entry_->set_normal_entry(normal_entry);
+
+  PrologueInfo prologue_info(-1, -1);
+  BlockEntryInstr* instruction_cursor =
+      BuildPrologue(normal_entry, &prologue_info);
+
+  Fragment body(instruction_cursor);
+  body += CheckStackOverflowInPrologue(function.token_pos());
+
+  // If we are inside the tearoff wrapper function (implicit closure), we need
+  // to extract the receiver from the context. We just replace it directly on
+  // the stack to simplify the rest of the code.
+  if (is_implicit_closure_function && !function.is_static()) {
+    if (parsed_function_->has_arg_desc_var()) {
+      body += LoadArgDescriptor();
+      body += LoadNativeField(Slot::ArgumentsDescriptor_count());
+      body += LoadLocal(parsed_function_->current_context_var());
+      body += LoadNativeField(
+          Slot::GetContextVariableSlotFor(thread_, *scopes_->this_variable));
+      body += StoreFpRelativeSlot(
+          kWordSize * compiler::target::frame_layout.param_end_from_fp);
+    } else {
+      body += LoadLocal(parsed_function_->current_context_var());
+      body += LoadNativeField(
+          Slot::GetContextVariableSlotFor(thread_, *scopes_->this_variable));
+      body += StoreFpRelativeSlot(
+          kWordSize * (compiler::target::frame_layout.param_end_from_fp +
+                       function.NumParameters()));
+    }
+  }
+
+  if (function.NeedsArgumentTypeChecks(I)) {
+    BuildArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
+                            &body, &body, nullptr);
+  }
+
+  body += MakeTemp();
+  LocalVariable* result = MakeTemporary();
+
+  // Do "++argument_count" if any type arguments were passed.
+  LocalVariable* argument_count_var = parsed_function_->expression_temp_var();
+  body += IntConstant(0);
+  body += StoreLocal(TokenPosition::kNoSource, argument_count_var);
+  body += Drop();
+  if (function.IsGeneric()) {
+    Fragment then;
+    Fragment otherwise;
+    otherwise += IntConstant(1);
+    otherwise += StoreLocal(TokenPosition::kNoSource, argument_count_var);
+    otherwise += Drop();
+    body += TestAnyTypeArgs(then, otherwise);
+  }
+
+  if (function.HasOptionalParameters()) {
+    body += LoadArgDescriptor();
+    body += LoadNativeField(Slot::ArgumentsDescriptor_count());
+  } else {
+    body += IntConstant(function.NumParameters());
+  }
+  body += LoadLocal(argument_count_var);
+  body += SmiBinaryOp(Token::kADD, /* truncate= */ true);
+  LocalVariable* argument_count = MakeTemporary();
+
+  // We are generating code like the following:
+  //
+  // var arguments = new Array<dynamic>(argument_count);
+  //
+  // int i = 0;
+  // if (any type arguments are passed) {
+  //   arguments[0] = function_type_arguments;
+  //   ++i;
+  // }
+  //
+  // for (; i < argument_count; ++i) {
+  //   arguments[i] = LoadFpRelativeSlot(
+  //       kWordSize * (frame_layout.param_end_from_fp + argument_count - i));
+  // }
+  body += Constant(TypeArguments::ZoneHandle(Z, TypeArguments::null()));
+  body += LoadLocal(argument_count);
+  body += CreateArray();
+  LocalVariable* arguments = MakeTemporary();
+
+  {
+    // int i = 0
+    LocalVariable* index = parsed_function_->expression_temp_var();
+    body += IntConstant(0);
+    body += StoreLocal(TokenPosition::kNoSource, index);
+    body += Drop();
+
+    // if (any type arguments are passed) {
+    //   arguments[0] = function_type_arguments;
+    //   i = 1;
+    // }
+    if (function.IsGeneric()) {
+      Fragment store;
+      store += LoadLocal(arguments);
+      store += IntConstant(0);
+      store += LoadFunctionTypeArguments();
+      store += StoreIndexed(kArrayCid);
+      store += IntConstant(1);
+      store += StoreLocal(TokenPosition::kNoSource, index);
+      store += Drop();
+      body += TestAnyTypeArgs(store, Fragment());
+    }
+
+    TargetEntryInstr* body_entry;
+    TargetEntryInstr* loop_exit;
+
+    Fragment condition;
+    // i < argument_count
+    condition += LoadLocal(index);
+    condition += LoadLocal(argument_count);
+    condition += SmiRelationalOp(Token::kLT);
+    condition += BranchIfTrue(&body_entry, &loop_exit, /*negate=*/false);
+
+    Fragment loop_body(body_entry);
+
+    // arguments[i] = LoadFpRelativeSlot(
+    //     kWordSize * (frame_layout.param_end_from_fp + argument_count - i));
+    loop_body += LoadLocal(arguments);
+    loop_body += LoadLocal(index);
+    loop_body += LoadLocal(argument_count);
+    loop_body += LoadLocal(index);
+    loop_body += SmiBinaryOp(Token::kSUB, /*truncate=*/true);
+    loop_body += LoadFpRelativeSlot(
+        kWordSize * compiler::target::frame_layout.param_end_from_fp);
+    loop_body += StoreIndexed(kArrayCid);
+
+    // ++i
+    loop_body += LoadLocal(index);
+    loop_body += IntConstant(1);
+    loop_body += SmiBinaryOp(Token::kADD, /*truncate=*/true);
+    loop_body += StoreLocal(TokenPosition::kNoSource, index);
+    loop_body += Drop();
+
+    JoinEntryInstr* join = BuildJoinEntry();
+    loop_body += Goto(join);
+
+    Fragment loop(join);
+    loop += condition;
+
+    Instruction* entry =
+        new (Z) GotoInstr(join, CompilerState::Current().GetNextDeoptId());
+    body += Fragment(entry, loop_exit);
+  }
+
+  // Load receiver.
+  if (is_implicit_closure_function) {
+    if (throw_no_such_method_error) {
+      const Function& parent =
+          Function::ZoneHandle(Z, function.parent_function());
+      const Class& owner = Class::ZoneHandle(Z, parent.Owner());
+      AbstractType& type = AbstractType::ZoneHandle(Z);
+      type ^= Type::New(owner, TypeArguments::Handle(Z), owner.token_pos(),
+                        Heap::kOld);
+      type ^= ClassFinalizer::FinalizeType(owner, type);
+      body += Constant(type);
+    } else {
+      body += LoadLocal(parsed_function_->current_context_var());
+      body += LoadNativeField(
+          Slot::GetContextVariableSlotFor(thread_, *scopes_->this_variable));
+    }
+  } else {
+    LocalScope* scope = parsed_function_->node_sequence()->scope();
+    body += LoadLocal(scope->VariableAt(0));
+  }
+  body += PushArgument();
+
+  body += Constant(String::ZoneHandle(Z, function.name()));
+  body += PushArgument();
+
+  if (!parsed_function_->has_arg_desc_var()) {
+    // If there is no variable for the arguments descriptor (this function's
+    // signature doesn't require it), then we need to create one.
+    Array& args_desc = Array::ZoneHandle(
+        Z, ArgumentsDescriptor::New(0, function.NumParameters()));
+    body += Constant(args_desc);
+  } else {
+    body += LoadArgDescriptor();
+  }
+  body += PushArgument();
+
+  body += LoadLocal(arguments);
+  body += PushArgument();
+
+  if (throw_no_such_method_error) {
+    const Function& parent =
+        Function::ZoneHandle(Z, function.parent_function());
+    const Class& owner = Class::ZoneHandle(Z, parent.Owner());
+    InvocationMirror::Level im_level = owner.IsTopLevel()
+                                           ? InvocationMirror::kTopLevel
+                                           : InvocationMirror::kStatic;
+    InvocationMirror::Kind im_kind;
+    if (function.IsImplicitGetterFunction() || function.IsGetterFunction()) {
+      im_kind = InvocationMirror::kGetter;
+    } else if (function.IsImplicitSetterFunction() ||
+               function.IsSetterFunction()) {
+      im_kind = InvocationMirror::kSetter;
+    } else {
+      im_kind = InvocationMirror::kMethod;
+    }
+    body += IntConstant(InvocationMirror::EncodeType(im_level, im_kind));
+  } else {
+    body += NullConstant();
+  }
+  body += PushArgument();
+
+  // Push the number of delayed type arguments.
+  if (function.IsClosureFunction()) {
+    LocalVariable* closure =
+        parsed_function_->node_sequence()->scope()->VariableAt(0);
+    Fragment then;
+    then += IntConstant(function.NumTypeParameters());
+    then += StoreLocal(TokenPosition::kNoSource, argument_count_var);
+    then += Drop();
+    Fragment otherwise;
+    otherwise += IntConstant(0);
+    otherwise += StoreLocal(TokenPosition::kNoSource, argument_count_var);
+    otherwise += Drop();
+    body += TestDelayedTypeArgs(closure, then, otherwise);
+    body += LoadLocal(argument_count_var);
+  } else {
+    body += IntConstant(0);
+  }
+  body += PushArgument();
+
+  const Class& mirror_class =
+      Class::Handle(Z, Library::LookupCoreClass(Symbols::InvocationMirror()));
+  ASSERT(!mirror_class.IsNull());
+  const Function& allocation_function = Function::ZoneHandle(
+      Z, mirror_class.LookupStaticFunction(Library::PrivateCoreLibName(
+             Symbols::AllocateInvocationMirrorForClosure())));
+  ASSERT(!allocation_function.IsNull());
+  body += StaticCall(TokenPosition::kMinSource, allocation_function,
+                     /* argument_count = */ 5, ICData::kStatic);
+  body += PushArgument();  // For the call to noSuchMethod.
+
+  if (throw_no_such_method_error) {
+    const Class& klass = Class::ZoneHandle(
+        Z, Library::LookupCoreClass(Symbols::NoSuchMethodError()));
+    ASSERT(!klass.IsNull());
+    const Function& throw_function = Function::ZoneHandle(
+        Z,
+        klass.LookupStaticFunctionAllowPrivate(Symbols::ThrowNewInvocation()));
+    ASSERT(!throw_function.IsNull());
+    body += StaticCall(TokenPosition::kNoSource, throw_function, 2,
+                       ICData::kStatic);
+  } else {
+    body += InstanceCall(
+        TokenPosition::kNoSource, Symbols::NoSuchMethod(), Token::kILLEGAL,
+        /*type_args_len=*/0, /*argument_count=*/2, Array::null_array(),
+        /*checked_argument_count=*/1, Function::null_function());
+  }
+  body += StoreLocal(TokenPosition::kNoSource, result);
+  body += Drop();
+
+  body += Drop();  // arguments
+  body += Drop();  // argument count
+
+  AbstractType& return_type = AbstractType::Handle(function.result_type());
+  if (!return_type.IsDynamicType() && !return_type.IsVoidType() &&
+      !return_type.IsObjectType()) {
+    body += AssertAssignable(TokenPosition::kNoSource, return_type,
+                             Symbols::Empty());
+  }
+  body += Return(TokenPosition::kNoSource);
+
+  return new (Z) FlowGraph(*parsed_function_, graph_entry_, last_used_block_id_,
+                           prologue_info);
+}
+
+Fragment FlowGraphBuilder::BuildDefaultTypeHandling(const Function& function) {
+  if (function.IsGeneric()) {
+    const TypeArguments& default_types =
+        parsed_function_->DefaultFunctionTypeArguments();
+
+    if (!default_types.IsNull()) {
+      Fragment then;
+      Fragment otherwise;
+
+      otherwise += TranslateInstantiatedTypeArguments(default_types);
+      otherwise += StoreLocal(TokenPosition::kNoSource,
+                              parsed_function_->function_type_arguments());
+      otherwise += Drop();
+      return TestAnyTypeArgs(then, otherwise);
+    }
+  }
+  return Fragment();
+}
+
+// Pop the index of the current entry-point off the stack. If there is any
+// entrypoint-tracing hook registered in a pragma for the function, it is called
+// with the name of the current function and the current entry-point index.
+Fragment FlowGraphBuilder::BuildEntryPointsIntrospection() {
+  if (!FLAG_enable_testing_pragmas) return Drop();
+
+  auto& function = Function::Handle(Z, parsed_function_->function().raw());
+
+  if (function.IsImplicitClosureFunction()) {
+    const auto& parent = Function::Handle(Z, function.parent_function());
+    const auto& func_name = String::Handle(Z, parent.name());
+    const auto& owner = Class::Handle(Z, parent.Owner());
+    function = owner.LookupFunction(func_name);
+  }
+
+  auto& tmp = Object::Handle(Z);
+  tmp = function.Owner();
+  tmp = Class::Cast(tmp).library();
+  auto& library = Library::Cast(tmp);
+
+  Object& options = Object::Handle(Z);
+  if (!library.FindPragma(thread_, function, Symbols::vm_trace_entrypoints(),
+                          &options) ||
+      options.IsNull() || !options.IsClosure()) {
+    return Drop();
+  }
+  auto& closure = Closure::ZoneHandle(Z, Closure::Cast(options).raw());
+  LocalVariable* entry_point_num = MakeTemporary();
+
+  auto& function_name = String::ZoneHandle(
+      Z, String::New(function.ToLibNamePrefixedQualifiedCString(), Heap::kOld));
+  if (parsed_function_->function().IsImplicitClosureFunction()) {
+    function_name = String::Concat(
+        function_name, String::Handle(Z, String::New("#tearoff", Heap::kNew)),
+        Heap::kOld);
+  }
+
+  Fragment call_hook;
+  call_hook += Constant(closure);
+  call_hook += PushArgument();
+  call_hook += Constant(function_name);
+  call_hook += PushArgument();
+  call_hook += LoadLocal(entry_point_num);
+  call_hook += PushArgument();
+  call_hook += Constant(Function::ZoneHandle(Z, closure.function()));
+  call_hook += ClosureCall(TokenPosition::kNoSource,
+                           /*type_args_len=*/0, /*argument_count=*/3,
+                           /*argument_names=*/Array::ZoneHandle(Z));
+  call_hook += Drop();  // result of closure call
+  call_hook += Drop();  // entrypoint number
+  return call_hook;
+}
+
+FunctionEntryInstr* FlowGraphBuilder::BuildSharedUncheckedEntryPoint(
+    Fragment shared_prologue_linked_in,
+    Fragment skippable_checks,
+    Fragment redefinitions_if_skipped,
+    Fragment body) {
+  ASSERT(shared_prologue_linked_in.entry == graph_entry_->normal_entry());
+  ASSERT(parsed_function_->has_entry_points_temp_var());
+  Instruction* prologue_start = shared_prologue_linked_in.entry->next();
+
+  auto* join_entry = BuildJoinEntry();
+
+  Fragment normal_entry(shared_prologue_linked_in.entry);
+  normal_entry +=
+      IntConstant(static_cast<intptr_t>(UncheckedEntryPointStyle::kNone));
+  normal_entry += StoreLocal(TokenPosition::kNoSource,
+                             parsed_function_->entry_points_temp_var());
+  normal_entry += Drop();
+  normal_entry += Goto(join_entry);
+
+  auto* extra_target_entry = BuildFunctionEntry(graph_entry_);
+  Fragment extra_entry(extra_target_entry);
+  extra_entry += IntConstant(
+      static_cast<intptr_t>(UncheckedEntryPointStyle::kSharedWithVariable));
+  extra_entry += StoreLocal(TokenPosition::kNoSource,
+                            parsed_function_->entry_points_temp_var());
+  extra_entry += Drop();
+  extra_entry += Goto(join_entry);
+
+  join_entry->LinkTo(prologue_start);
+
+  TargetEntryInstr *do_checks, *skip_checks;
+  shared_prologue_linked_in +=
+      LoadLocal(parsed_function_->entry_points_temp_var());
+  shared_prologue_linked_in += BuildEntryPointsIntrospection();
+  shared_prologue_linked_in +=
+      LoadLocal(parsed_function_->entry_points_temp_var());
+  shared_prologue_linked_in += IntConstant(
+      static_cast<intptr_t>(UncheckedEntryPointStyle::kSharedWithVariable));
+  shared_prologue_linked_in +=
+      BranchIfEqual(&skip_checks, &do_checks, /*negate=*/false);
+
+  JoinEntryInstr* rest_entry = BuildJoinEntry();
+
+  Fragment(do_checks) + skippable_checks + Goto(rest_entry);
+  Fragment(skip_checks) + redefinitions_if_skipped + Goto(rest_entry);
+  Fragment(rest_entry) + body;
+
+  return extra_target_entry;
+}
+
+FunctionEntryInstr* FlowGraphBuilder::BuildSeparateUncheckedEntryPoint(
+    BlockEntryInstr* normal_entry,
+    Fragment normal_prologue,
+    Fragment extra_prologue,
+    Fragment shared_prologue,
+    Fragment body) {
+  auto* join_entry = BuildJoinEntry();
+  auto* extra_entry = BuildFunctionEntry(graph_entry_);
+
+  Fragment normal(normal_entry);
+  normal += IntConstant(static_cast<intptr_t>(UncheckedEntryPointStyle::kNone));
+  normal += BuildEntryPointsIntrospection();
+  normal += normal_prologue;
+  normal += Goto(join_entry);
+
+  Fragment extra(extra_entry);
+  extra +=
+      IntConstant(static_cast<intptr_t>(UncheckedEntryPointStyle::kSeparate));
+  extra += BuildEntryPointsIntrospection();
+  extra += extra_prologue;
+  extra += Goto(join_entry);
+
+  Fragment(join_entry) + shared_prologue + body;
+  return extra_entry;
+}
+
+void FlowGraphBuilder::RecordUncheckedEntryPoint(
+    FunctionEntryInstr* extra_entry) {
+  // Closures always check all arguments on their checked entry-point, most
+  // call-sites are unchecked, and they're inlined less often, so it's very
+  // beneficial to build multiple entry-points for them. Regular methods however
+  // have fewer checks to begin with since they have dynamic invocation
+  // forwarders, so in AOT we implement a more conservative time-space tradeoff
+  // by only building the unchecked entry-point when inlining. We should
+  // reconsider this heuristic if we identify non-inlined type-checks in
+  // hotspots of new benchmarks.
+  if (!IsInlining() && (parsed_function_->function().IsClosureFunction() ||
+                        !FLAG_precompiled_mode)) {
+    graph_entry_->set_unchecked_entry(extra_entry);
+  } else if (InliningUncheckedEntry()) {
+    graph_entry_->set_normal_entry(extra_entry);
+  }
+}
+
+FlowGraph* FlowGraphBuilder::BuildGraphOfImplicitClosureFunction(
+    const Function& function) {
+  const Function& parent = Function::ZoneHandle(Z, function.parent_function());
+  const String& func_name = String::ZoneHandle(Z, parent.name());
+  const Class& owner = Class::ZoneHandle(Z, parent.Owner());
+  Function& target = Function::ZoneHandle(Z, owner.LookupFunction(func_name));
+
+  if (!target.IsNull() && (target.raw() != parent.raw())) {
+    DEBUG_ASSERT(Isolate::Current()->HasAttemptedReload());
+    if ((target.is_static() != parent.is_static()) ||
+        (target.kind() != parent.kind())) {
+      target = Function::null();
+    }
+  }
+
+  if (target.IsNull() ||
+      (parent.num_fixed_parameters() != target.num_fixed_parameters())) {
+    return BuildGraphOfNoSuchMethodForwarder(function, true,
+                                             parent.is_static());
+  }
+
+  graph_entry_ =
+      new (Z) GraphEntryInstr(*parsed_function_, Compiler::kNoOSRDeoptId);
+
+  auto normal_entry = BuildFunctionEntry(graph_entry_);
+  graph_entry_->set_normal_entry(normal_entry);
+
+  PrologueInfo prologue_info(-1, -1);
+  BlockEntryInstr* instruction_cursor =
+      BuildPrologue(normal_entry, &prologue_info);
+
+  const Fragment prologue = CheckStackOverflowInPrologue(function.token_pos());
+
+  const Fragment default_type_handling = BuildDefaultTypeHandling(function);
+
+  // We're going to throw away the explicit checks because the target will
+  // always check them.
+  Fragment implicit_checks;
+  if (function.NeedsArgumentTypeChecks(I)) {
+    Fragment explicit_checks_unused;
+    if (target.is_static()) {
+      // Tearoffs of static methods needs to perform arguments checks since
+      // static methods they forward to don't do it themselves.
+      BuildArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
+                              &explicit_checks_unused, &implicit_checks,
+                              nullptr);
+    } else {
+      if (MethodCanSkipTypeChecksForNonCovariantArguments(
+              parent, ProcedureAttributesMetadata())) {
+        // Generate checks that are skipped inside a body of a function.
+        BuildArgumentTypeChecks(
+            TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds,
+            &explicit_checks_unused, &implicit_checks, nullptr);
+      }
+    }
+  }
+
+  Fragment body;
+
+  intptr_t type_args_len = 0;
+  if (function.IsGeneric()) {
+    type_args_len = function.NumTypeParameters();
+    ASSERT(parsed_function_->function_type_arguments() != NULL);
+    body += LoadLocal(parsed_function_->function_type_arguments());
+    body += PushArgument();
+  }
+
+  // Load all the arguments.
+  auto scope = parsed_function_->node_sequence()->scope();
+
+  if (!target.is_static()) {
+    // The context has a fixed shape: a single variable which is the
+    // closed-over receiver.
+    body += LoadLocal(scope->VariableAt(0));
+    body += LoadNativeField(Slot::Closure_context());
+    body += LoadNativeField(
+        Slot::GetContextVariableSlotFor(thread_, *scopes_->this_variable));
+    body += PushArgument();
+  }
+
+  // Positional.
+  intptr_t arg_index = function.NumImplicitParameters();
+  const intptr_t named_argument_count = function.NumOptionalNamedParameters();
+  const intptr_t positional_argument_count = function.NumParameters() -
+                                             function.NumImplicitParameters() -
+                                             named_argument_count;
+  for (intptr_t i = 0; i < positional_argument_count; ++i, ++arg_index) {
+    body += LoadLocal(scope->VariableAt(arg_index));  // ith variable offset.
+    body += PushArgument();
+  }
+
+  // Named.
+  Array& argument_names = Array::ZoneHandle(Z);
+  if (named_argument_count > 0) {
+    argument_names = Array::New(named_argument_count, Heap::kOld);
+    String& name = String::Handle(Z);
+    for (intptr_t i = 0; i < named_argument_count; ++i, ++arg_index) {
+      body += LoadLocal(scope->VariableAt(arg_index));
+      body += PushArgument();
+
+      name = function.ParameterNameAt(arg_index);
+      argument_names.SetAt(i, name);
+    }
+  }
+
+  // Forward them to the parent.
+  intptr_t argument_count = positional_argument_count + named_argument_count;
+  if (!parent.is_static()) {
+    ++argument_count;
+  }
+  ASSERT(argument_count == target.NumParameters());
+  body += StaticCall(TokenPosition::kNoSource, target, argument_count,
+                     argument_names, ICData::kNoRebind,
+                     /* result_type = */ NULL, type_args_len);
+
+  // Return the result.
+  body += Return(function.end_token_pos());
+
+  // Setup multiple entrypoints if useful.
+  FunctionEntryInstr* extra_entry = nullptr;
+  if (function.MayHaveUncheckedEntryPoint(I)) {
+    // The prologue for a closure will always have context handling (e.g.
+    // setting up the 'this_variable'), but we don't need it on the unchecked
+    // entry because the only time we reference this is for loading the
+    // receiver, which we fetch directly from the context.
+    if (PrologueBuilder::PrologueSkippableOnUncheckedEntry(function)) {
+      // Use separate entry points since we can skip almost everything on the
+      // static entry.
+      extra_entry = BuildSeparateUncheckedEntryPoint(
+          /*normal_entry=*/instruction_cursor,
+          /*normal_prologue=*/prologue + default_type_handling +
+              implicit_checks,
+          /*extra_prologue=*/
+          CheckStackOverflowInPrologue(function.token_pos()),
+          /*shared_prologue=*/Fragment(),
+          /*body=*/body);
+    } else {
+      Fragment shared_prologue(normal_entry, instruction_cursor);
+      shared_prologue += prologue;
+      extra_entry = BuildSharedUncheckedEntryPoint(
+          /*shared_prologue_linked_in=*/shared_prologue,
+          /*skippable_checks=*/default_type_handling + implicit_checks,
+          /*redefinitions_if_skipped=*/Fragment(),
+          /*body=*/body);
+    }
+    RecordUncheckedEntryPoint(extra_entry);
+  } else {
+    Fragment function(instruction_cursor);
+    function += prologue;
+    function += default_type_handling;
+    function += implicit_checks;
+    function += body;
+  }
+
+  return new (Z) FlowGraph(*parsed_function_, graph_entry_, last_used_block_id_,
+                           prologue_info);
+}
+
 void FlowGraphBuilder::SetCurrentTryCatchBlock(TryCatchBlock* try_catch_block) {
   try_catch_block_ = try_catch_block;
   SetCurrentTryIndex(try_catch_block == nullptr ? kInvalidTryIndex
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 40ea70e..a2cb7ca 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -41,6 +41,38 @@
   YieldContinuation() : entry(NULL), try_index(kInvalidTryIndex) {}
 };
 
+enum class TypeChecksToBuild {
+  kCheckAllTypeParameterBounds,
+  kCheckNonCovariantTypeParameterBounds,
+  kCheckCovariantTypeParameterBounds,
+};
+
+// Indicates which form of the unchecked entrypoint we are compiling.
+//
+// kNone:
+//
+//   There is no unchecked entrypoint: the unchecked entry is set to NULL in
+//   the 'GraphEntryInstr'.
+//
+// kSeparate:
+//
+//   The normal and unchecked entrypoint each point to their own versions of
+//   the prologue, containing exactly those checks which need to be performed
+//   on either side. Both sides jump directly to the body after performing
+//   their prologue.
+//
+// kSharedWithVariable:
+//
+//   A temporary variable is allocated and initialized to 0 on normal entry
+//   and 2 on unchecked entry. Code which should be ommitted on the unchecked
+//   entrypoint is made conditional on this variable being equal to 0.
+//
+enum class UncheckedEntryPointStyle {
+  kNone = 0,
+  kSeparate = 1,
+  kSharedWithVariable = 2,
+};
+
 class FlowGraphBuilder : public BaseFlowGraphBuilder {
  public:
   FlowGraphBuilder(ParsedFunction* parsed_function,
@@ -168,6 +200,74 @@
 
   LocalVariable* LookupVariable(intptr_t kernel_offset);
 
+  // Build argument type checks for the current function.
+  // ParsedFunction should have the following information:
+  //  - is_forwarding_stub()
+  //  - forwarding_stub_super_target()
+  // Scope should be populated with parameter variables including
+  //  - needs_type_check()
+  //  - is_explicit_covariant_parameter()
+  void BuildArgumentTypeChecks(TypeChecksToBuild mode,
+                               Fragment* explicit_checks,
+                               Fragment* implicit_checks,
+                               Fragment* implicit_redefinitions);
+
+  // Builds flow graph for noSuchMethod forwarder.
+  //
+  // If throw_no_such_method_error is set to true, an
+  // instance of NoSuchMethodError is thrown. Otherwise, the instance
+  // noSuchMethod is called.
+  //
+  // ParsedFunction should have the following information:
+  //  - default_parameter_values()
+  //  - is_forwarding_stub()
+  //  - forwarding_stub_super_target()
+  //
+  // Scope should be populated with parameter variables including
+  //  - needs_type_check()
+  //  - is_explicit_covariant_parameter()
+  //
+  FlowGraph* BuildGraphOfNoSuchMethodForwarder(
+      const Function& function,
+      bool is_implicit_closure_function,
+      bool throw_no_such_method_error);
+
+  // If no type arguments are passed to a generic function, we need to fill the
+  // type arguments in with the default types stored on the TypeParameter nodes
+  // in Kernel.
+  //
+  // ParsedFunction should have the following information:
+  //  - DefaultFunctionTypeArguments()
+  //  - function_type_arguments()
+  Fragment BuildDefaultTypeHandling(const Function& function);
+
+  Fragment BuildEntryPointsIntrospection();
+  FunctionEntryInstr* BuildSharedUncheckedEntryPoint(
+      Fragment prologue_from_normal_entry,
+      Fragment skippable_checks,
+      Fragment redefinitions_if_skipped,
+      Fragment body);
+  FunctionEntryInstr* BuildSeparateUncheckedEntryPoint(
+      BlockEntryInstr* normal_entry,
+      Fragment normal_prologue,
+      Fragment extra_prologue,
+      Fragment shared_prologue,
+      Fragment body);
+  void RecordUncheckedEntryPoint(FunctionEntryInstr* extra_entry);
+
+  // Builds flow graph for implicit closure function (tear-off).
+  //
+  // ParsedFunction should have the following information:
+  //  - default_parameter_values()
+  //  - is_forwarding_stub()
+  //  - forwarding_stub_super_target()
+  //
+  // Scope should be populated with parameter variables including
+  //  - needs_type_check()
+  //  - is_explicit_covariant_parameter()
+  //
+  FlowGraph* BuildGraphOfImplicitClosureFunction(const Function& function);
+
   TranslationHelper translation_helper_;
   Thread* thread_;
   Zone* zone_;
@@ -235,6 +335,7 @@
   friend class BreakableBlock;
   friend class CatchBlock;
   friend class ConstantEvaluator;
+  friend class ProgramState;
   friend class StreamingFlowGraphBuilder;
   friend class SwitchBlock;
   friend class TryCatchBlock;
@@ -243,6 +344,43 @@
   DISALLOW_COPY_AND_ASSIGN(FlowGraphBuilder);
 };
 
+// Convenience class to save/restore program state.
+// This snapshot denotes a partial state of the flow
+// grap builder that is needed when recursing into
+// the statements and expressions of a finalizer block.
+class ProgramState {
+ public:
+  ProgramState(BreakableBlock* breakable_block,
+               SwitchBlock* switch_block,
+               intptr_t loop_depth,
+               intptr_t for_in_depth,
+               intptr_t try_depth,
+               intptr_t catch_depth)
+      : breakable_block_(breakable_block),
+        switch_block_(switch_block),
+        loop_depth_(loop_depth),
+        for_in_depth_(for_in_depth),
+        try_depth_(try_depth),
+        catch_depth_(catch_depth) {}
+
+  void assignTo(FlowGraphBuilder* builder) const {
+    builder->breakable_block_ = breakable_block_;
+    builder->switch_block_ = switch_block_;
+    builder->loop_depth_ = loop_depth_;
+    builder->for_in_depth_ = for_in_depth_;
+    builder->try_depth_ = try_depth_;
+    builder->catch_depth_ = catch_depth_;
+  }
+
+ private:
+  BreakableBlock* const breakable_block_;
+  SwitchBlock* const switch_block_;
+  const intptr_t loop_depth_;
+  const intptr_t for_in_depth_;
+  const intptr_t try_depth_;
+  const intptr_t catch_depth_;
+};
+
 class SwitchBlock {
  public:
   SwitchBlock(FlowGraphBuilder* builder, intptr_t case_count)
@@ -266,14 +404,17 @@
   }
 
   // Get destination via absolute target number (i.e. the correct destination
-  // is not not necessarily in this block.
+  // is not necessarily in this block).
   JoinEntryInstr* Destination(intptr_t target_index,
                               TryFinallyBlock** outer_finally = NULL,
                               intptr_t* context_depth = NULL) {
-    // Find corresponding [SwitchStatement].
+    // Verify consistency of program state.
+    ASSERT(builder_->switch_block_ == this);
+    // Find corresponding destination.
     SwitchBlock* block = this;
     while (block->depth_ > target_index) {
       block = block->outer_;
+      ASSERT(block != nullptr);
     }
 
     // Set the outer finally block.
@@ -355,28 +496,33 @@
         outer_(builder->try_finally_block_),
         finalizer_kernel_offset_(finalizer_kernel_offset),
         context_depth_(builder->context_depth_),
+        try_index_(builder_->CurrentTryIndex()),
         // Finalizers are executed outside of the try block hence
         // try depth of finalizers are one less than current try
-        // depth.
-        try_depth_(builder->try_depth_ - 1),
-        try_index_(builder_->CurrentTryIndex()) {
+        // depth. For others, program state is snapshot of current.
+        state_(builder_->breakable_block_,
+               builder_->switch_block_,
+               builder_->loop_depth_,
+               builder_->for_in_depth_,
+               builder_->try_depth_ - 1,
+               builder_->catch_depth_) {
     builder_->try_finally_block_ = this;
   }
   ~TryFinallyBlock() { builder_->try_finally_block_ = outer_; }
 
+  TryFinallyBlock* outer() const { return outer_; }
   intptr_t finalizer_kernel_offset() const { return finalizer_kernel_offset_; }
   intptr_t context_depth() const { return context_depth_; }
-  intptr_t try_depth() const { return try_depth_; }
   intptr_t try_index() const { return try_index_; }
-  TryFinallyBlock* outer() const { return outer_; }
+  const ProgramState& state() const { return state_; }
 
  private:
   FlowGraphBuilder* const builder_;
   TryFinallyBlock* const outer_;
-  intptr_t finalizer_kernel_offset_;
+  const intptr_t finalizer_kernel_offset_;
   const intptr_t context_depth_;
-  const intptr_t try_depth_;
   const intptr_t try_index_;
+  const ProgramState state_;
 
   DISALLOW_COPY_AND_ASSIGN(TryFinallyBlock);
 };
@@ -406,11 +552,14 @@
   JoinEntryInstr* BreakDestination(intptr_t label_index,
                                    TryFinallyBlock** outer_finally,
                                    intptr_t* context_depth) {
-    BreakableBlock* block = builder_->breakable_block_;
+    // Verify consistency of program state.
+    ASSERT(builder_->breakable_block_ == this);
+    // Find corresponding destination.
+    BreakableBlock* block = this;
     while (block->index_ != label_index) {
       block = block->outer_;
+      ASSERT(block != nullptr);
     }
-    ASSERT(block != NULL);
     *outer_finally = block->outer_finally_;
     *context_depth = block->context_depth_;
     return block->EnsureDestination();
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 082fd39..6194c70 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -25,7 +25,7 @@
     : thread_(thread),
       zone_(thread->zone()),
       isolate_(thread->isolate()),
-      allocation_space_(thread->IsMutatorThread() ? Heap::kNew : Heap::kOld),
+      allocation_space_(Heap::kNew),
       string_offsets_(TypedData::Handle(Z)),
       string_data_(ExternalTypedData::Handle(Z)),
       canonical_names_(TypedData::Handle(Z)),
@@ -598,9 +598,9 @@
     const Class& owner,
     StringIndex constructor_name) {
   GrowableHandlePtrArray<const String> pieces(Z, 3);
-  pieces.Add(DartString(String::Handle(owner.Name()).ToCString(), Heap::kOld));
+  pieces.Add(String::Handle(Z, owner.Name()));
   pieces.Add(Symbols::Dot());
-  String& name = DartString(constructor_name);
+  String& name = DartSymbolPlain(constructor_name);
   pieces.Add(ManglePrivateName(Library::Handle(owner.library()), &name));
 
   String& new_name =
@@ -760,56 +760,56 @@
       Tag tag = helper_->ReadTag();  // read tag.
       ASSERT(tag == kFunctionNode);
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kPosition:
       position_ = helper_->ReadPosition();  // read position.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kEndPosition:
       end_position_ = helper_->ReadPosition();  // read end position.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kAsyncMarker:
       async_marker_ = static_cast<AsyncMarker>(helper_->ReadByte());
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kDartAsyncMarker:
       dart_async_marker_ = static_cast<AsyncMarker>(
           helper_->ReadByte());  // read dart async marker.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kTypeParameters:
       helper_->SkipTypeParametersList();  // read type parameters.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kTotalParameterCount:
       total_parameter_count_ =
           helper_->ReadUInt();  // read total parameter count.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kRequiredParameterCount:
       required_parameter_count_ =
           helper_->ReadUInt();  // read required parameter count.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kPositionalParameters:
       helper_->SkipListOfVariableDeclarations();  // read positionals.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kNamedParameters:
       helper_->SkipListOfVariableDeclarations();  // read named.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kReturnType:
       helper_->SkipDartType();  // read return type.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kBody:
       if (helper_->ReadTag() == kSomething)
         helper_->SkipStatement();  // read body.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kEnd:
       return;
   }
@@ -849,35 +849,35 @@
     case kPosition:
       position_ = helper_->ReadPosition();  // read position.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kEqualPosition:
       equals_position_ = helper_->ReadPosition();  // read equals position.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kAnnotations:
       annotation_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
         helper_->SkipExpression();  // read ith expression.
       }
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kFlags:
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kNameIndex:
       name_index_ = helper_->ReadStringReference();  // read name index.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kType:
       helper_->SkipDartType();  // read type.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kInitializer:
       if (helper_->ReadTag() == kSomething)
         helper_->SkipExpression();  // read initializer.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kEnd:
       return;
   }
@@ -900,48 +900,48 @@
       Tag tag = helper_->ReadTag();  // read tag.
       ASSERT(tag == kField);
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kCanonicalName:
       canonical_name_ =
           helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kSourceUriIndex:
       source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
       helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kPosition:
       position_ = helper_->ReadPosition(false);  // read position.
       helper_->RecordTokenPosition(position_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kEndPosition:
       end_position_ = helper_->ReadPosition(false);  // read end position.
       helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kFlags:
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kName:
       helper_->SkipName();  // read name.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kAnnotations: {
       annotation_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
         helper_->SkipExpression();  // read ith expression.
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kType:
       helper_->SkipDartType();  // read type.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kInitializer:
       if (helper_->ReadTag() == kSomething) {
         if (detect_function_literal_initializer &&
@@ -961,7 +961,7 @@
         helper_->SkipExpression();  // read initializer.
       }
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kEnd:
       return;
   }
@@ -976,67 +976,67 @@
       Tag tag = helper_->ReadTag();  // read tag.
       ASSERT(tag == kProcedure);
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kCanonicalName:
       canonical_name_ =
           helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kSourceUriIndex:
       source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
       helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kStartPosition:
       start_position_ = helper_->ReadPosition(false);  // read position.
       helper_->RecordTokenPosition(start_position_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kPosition:
       position_ = helper_->ReadPosition(false);  // read position.
       helper_->RecordTokenPosition(position_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kEndPosition:
       end_position_ = helper_->ReadPosition(false);  // read end position.
       helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kKind:
       kind_ = static_cast<Kind>(helper_->ReadByte());
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kFlags:
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kName:
       helper_->SkipName();  // read name.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kAnnotations: {
       annotation_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
         helper_->SkipExpression();  // read ith expression.
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kForwardingStubSuperTarget:
       forwarding_stub_super_target_ = helper_->ReadCanonicalNameReference();
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kForwardingStubInterfaceTarget:
       helper_->ReadCanonicalNameReference();
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kFunction:
       if (helper_->ReadTag() == kSomething) {
         helper_->SkipFunctionNode();  // read function node.
       }
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kEnd:
       return;
   }
@@ -1051,53 +1051,53 @@
       Tag tag = helper_->ReadTag();  // read tag.
       ASSERT(tag == kConstructor);
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kCanonicalName:
       canonical_name_ =
           helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kSourceUriIndex:
       source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
       helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kStartPosition:
       start_position_ = helper_->ReadPosition();  // read position.
       helper_->RecordTokenPosition(start_position_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kPosition:
       position_ = helper_->ReadPosition();  // read position.
       helper_->RecordTokenPosition(position_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kEndPosition:
       end_position_ = helper_->ReadPosition();  // read end position.
       helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kFlags:
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kName:
       helper_->SkipName();  // read name.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kAnnotations: {
       annotation_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
         helper_->SkipExpression();  // read ith expression.
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kFunction:
       helper_->SkipFunctionNode();  // read function.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kInitializers: {
       intptr_t list_length =
           helper_->ReadListLength();  // read initializers list length.
@@ -1106,7 +1106,7 @@
       }
       if (++next_read_ == field) return;
     }
-      /* Falls through */
+      FALL_THROUGH;
     case kEnd:
       return;
   }
@@ -1121,73 +1121,73 @@
       Tag tag = helper_->ReadTag();  // read tag.
       ASSERT(tag == kClass);
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kCanonicalName:
       canonical_name_ =
           helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kSourceUriIndex:
       source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
       helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kStartPosition:
       start_position_ = helper_->ReadPosition(false);  // read position.
       helper_->RecordTokenPosition(start_position_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kPosition:
       position_ = helper_->ReadPosition(false);  // read position.
       helper_->RecordTokenPosition(position_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kEndPosition:
       end_position_ = helper_->ReadPosition();  // read end position.
       helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kFlags:
       flags_ = helper_->ReadFlags();  // read flags.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kNameIndex:
       name_index_ = helper_->ReadStringReference();  // read name index.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kAnnotations: {
       annotation_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
         helper_->SkipExpression();  // read ith expression.
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kTypeParameters:
       helper_->SkipTypeParametersList();  // read type parameters.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kSuperClass: {
       Tag type_tag = helper_->ReadTag();  // read super class type (part 1).
       if (type_tag == kSomething) {
         helper_->SkipDartType();  // read super class type (part 2).
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kMixinType: {
       Tag type_tag = helper_->ReadTag();  // read mixin type (part 1).
       if (type_tag == kSomething) {
         helper_->SkipDartType();  // read mixin type (part 2).
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kImplementedClasses:
       helper_->SkipListOfDartTypes();  // read implemented_classes.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kFields: {
       intptr_t list_length =
           helper_->ReadListLength();  // read fields list length.
@@ -1196,8 +1196,8 @@
         field_helper.ReadUntilExcluding(FieldHelper::kEnd);  // read field.
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kConstructors: {
       intptr_t list_length =
           helper_->ReadListLength();  // read constructors list length.
@@ -1207,8 +1207,8 @@
             ConstructorHelper::kEnd);  // read constructor.
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kProcedures: {
       procedure_count_ = helper_->ReadListLength();  // read procedures #.
       for (intptr_t i = 0; i < procedure_count_; i++) {
@@ -1217,8 +1217,8 @@
             ProcedureHelper::kEnd);  // read procedure.
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kClassIndex:
       // Read class index.
       for (intptr_t i = 0; i < procedure_count_; ++i) {
@@ -1227,7 +1227,7 @@
       helper_->reader_.ReadUInt32();
       helper_->reader_.ReadUInt32();
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kEnd:
       return;
   }
@@ -1241,66 +1241,66 @@
     case kFlags: {
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kCanonicalName:
       canonical_name_ =
           helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kName:
       name_index_ = helper_->ReadStringReference();  // read name index.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kSourceUriIndex:
       source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
       helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kProblemsAsJson: {
       intptr_t length = helper_->ReadUInt();  // read length of table.
       for (intptr_t i = 0; i < length; ++i) {
         helper_->SkipBytes(helper_->ReadUInt());  // read strings.
       }
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     }
     case kAnnotations:
       helper_->SkipListOfExpressions();  // read annotations.
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kDependencies: {
       intptr_t dependency_count = helper_->ReadUInt();  // read list length.
       for (intptr_t i = 0; i < dependency_count; ++i) {
         helper_->SkipLibraryDependency();
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kAdditionalExports: {
       intptr_t name_count = helper_->ReadUInt();
       for (intptr_t i = 0; i < name_count; ++i) {
         helper_->SkipCanonicalNameReference();
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kParts: {
       intptr_t part_count = helper_->ReadUInt();  // read list length.
       for (intptr_t i = 0; i < part_count; ++i) {
         helper_->SkipLibraryPart();
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kTypedefs: {
       intptr_t typedef_count = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < typedef_count; i++) {
         helper_->SkipLibraryTypedef();
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kClasses: {
       class_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < class_count_; ++i) {
@@ -1308,8 +1308,8 @@
         class_helper.ReadUntilExcluding(ClassHelper::kEnd);
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kToplevelField: {
       intptr_t field_count = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < field_count; ++i) {
@@ -1317,8 +1317,8 @@
         field_helper.ReadUntilExcluding(FieldHelper::kEnd);
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kToplevelProcedures: {
       procedure_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < procedure_count_; ++i) {
@@ -1326,8 +1326,8 @@
         procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd);
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kLibraryIndex:
       // Read library index.
       for (intptr_t i = 0; i < class_count_; ++i) {
@@ -1341,7 +1341,7 @@
       helper_->reader_.ReadUInt32();
       helper_->reader_.ReadUInt32();
       if (++next_read_ == field) return;
-      /* Falls through */
+      FALL_THROUGH;
     case kEnd:
       return;
   }
@@ -1355,31 +1355,31 @@
     case kFileOffset: {
       helper_->ReadPosition();
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kFlags: {
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kAnnotations: {
       annotation_count_ = helper_->ReadListLength();
       for (intptr_t i = 0; i < annotation_count_; ++i) {
         helper_->SkipExpression();  // read ith expression.
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kTargetLibrary: {
       target_library_canonical_name_ = helper_->ReadCanonicalNameReference();
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kName: {
       name_index_ = helper_->ReadStringReference();
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kCombinators: {
       intptr_t count = helper_->ReadListLength();
       for (intptr_t i = 0; i < count; ++i) {
@@ -1389,8 +1389,8 @@
         helper_->SkipListOfStrings();
       }
       if (++next_read_ == field) return;
+      FALL_THROUGH;
     }
-      /* Falls through */
     case kEnd:
       return;
   }
@@ -2255,6 +2255,10 @@
       SkipVariableDeclaration();  // read variable declaration.
       SkipExpression();           // read expression.
       return;
+    case kBlockExpression: {
+      UNIMPLEMENTED();
+      return;
+    }
     case kInstantiation:
       SkipExpression();       // read expression.
       SkipListOfDartTypes();  // read type arguments.
@@ -3049,7 +3053,8 @@
           set_on_class ? *active_class->klass : Class::Handle(Z),
           parameterized_function, i,
           H.DartIdentifier(lib, helper.name_index_),  // read ith name index.
-          null_bound, TokenPosition::kNoSource);
+          null_bound, helper.IsGenericCovariantImpl(),
+          TokenPosition::kNoSource);
       type_parameters.SetTypeAt(i, parameter);
     }
   }
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index d585002..71c2e61 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -832,6 +832,10 @@
       ExitScope(helper_.reader_.min_position(), helper_.reader_.max_position());
       return;
     }
+    case kBlockExpression: {
+      UNIMPLEMENTED();
+      return;
+    }
     case kBigIntLiteral:
       helper_.SkipStringReference();  // read string reference.
       return;
diff --git a/runtime/vm/compiler/graph_intrinsifier.cc b/runtime/vm/compiler/graph_intrinsifier.cc
index d537054..bac9f7e 100644
--- a/runtime/vm/compiler/graph_intrinsifier.cc
+++ b/runtime/vm/compiler/graph_intrinsifier.cc
@@ -300,7 +300,7 @@
     case kTypedDataFloat32ArrayCid:
       result = builder.AddDefinition(
           new FloatToDoubleInstr(new Value(result), DeoptId::kNone));
-    // Fall through.
+      FALL_THROUGH;
     case kTypedDataFloat64ArrayCid:
       result = builder.AddDefinition(
           BoxInstr::Create(kUnboxedDouble, new Value(result)));
@@ -369,7 +369,7 @@
     case kTypedDataInt32ArrayCid:
     case kExternalTypedDataInt32ArrayCid:
     // Use same truncating unbox-instruction for int32 and uint32.
-    // Fall-through.
+    FALL_THROUGH;
     case kTypedDataUint32ArrayCid:
     case kExternalTypedDataUint32ArrayCid:
       // Supports smi and mint, slow-case for bigints.
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 66292fa..b8e2fdb 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -386,8 +386,8 @@
   // Allocates instruction object. Since this occurs only at safepoint,
   // there can be no concurrent access to the instruction page.
   Code& code = Code::Handle(Code::FinalizeCode(
-      function, graph_compiler, assembler, Code::PoolAttachment::kAttachPool,
-      optimized(), /*stats=*/nullptr));
+      graph_compiler, assembler, Code::PoolAttachment::kAttachPool, optimized(),
+      /*stats=*/nullptr));
   code.set_is_optimized(optimized());
   code.set_owner(function);
 #if !defined(PRODUCT)
@@ -702,6 +702,10 @@
                 FinalizeCompilation(&assembler, &graph_compiler, flow_graph);
           }
         }
+
+        // We notify code observers after finalizing the code in order to be
+        // outside a [SafepointOperationScope].
+        Code::NotifyCodeObservers(function, *result, optimized());
       }
       if (!result->IsNull()) {
 #if !defined(PRODUCT)
@@ -968,8 +972,8 @@
            Function::KindToCString(function.kind()));
   }
 
-#if !defined(PRODUCT)
   VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId);
+#if defined(SUPPORT_TIMELINE)
   const char* event_name;
   if (IsBackgroundCompilation()) {
     event_name = "CompileFunctionUnoptimizedBackground";
@@ -977,7 +981,7 @@
     event_name = "CompileFunction";
   }
   TIMELINE_FUNCTION_COMPILATION_DURATION(thread, event_name, function);
-#endif  // !defined(PRODUCT)
+#endif  // defined(SUPPORT_TIMELINE)
 
   CompilationPipeline* pipeline =
       CompilationPipeline::New(thread->zone(), function);
@@ -987,12 +991,10 @@
 }
 
 RawError* Compiler::ParseFunction(Thread* thread, const Function& function) {
-  Isolate* isolate = thread->isolate();
-#if !defined(PRODUCT)
   VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId);
   TIMELINE_FUNCTION_COMPILATION_DURATION(thread, "ParseFunction", function);
-#endif  // !defined(PRODUCT)
 
+  Isolate* isolate = thread->isolate();
   if (!isolate->compilation_allowed()) {
     FATAL3("Precompilation missed function %s (%s, %s)\n",
            function.ToLibNamePrefixedQualifiedCString(),
@@ -1041,8 +1043,8 @@
 RawObject* Compiler::CompileOptimizedFunction(Thread* thread,
                                               const Function& function,
                                               intptr_t osr_id) {
-#if !defined(PRODUCT)
   VMTagScope tagScope(thread, VMTag::kCompileOptimizedTagId);
+#if defined(SUPPORT_TIMELINE)
   const char* event_name;
   if (osr_id != kNoOSRDeoptId) {
     event_name = "CompileFunctionOptimizedOSR";
@@ -1052,7 +1054,7 @@
     event_name = "CompileFunctionOptimized";
   }
   TIMELINE_FUNCTION_COMPILATION_DURATION(thread, event_name, function);
-#endif  // !defined(PRODUCT)
+#endif  // defined(SUPPORT_TIMELINE)
 
   ASSERT(function.ShouldCompilerOptimize());
 
@@ -1198,20 +1200,21 @@
     ASSERT(thread->IsMutatorThread());
     NoOOBMessageScope no_msg_scope(thread);
     NoReloadScope no_reload_scope(thread->isolate(), thread);
-    if (field.HasInitializer()) {
-      const Function& initializer = Function::Handle(field.Initializer());
+    if (field.HasInitializerFunction()) {
+      const Function& initializer =
+          Function::Handle(field.InitializerFunction());
       return DartEntry::InvokeFunction(initializer, Object::empty_array());
     }
     {
-#if defined(SUPPORT_TIMELINE)
       VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId);
+#if defined(SUPPORT_TIMELINE)
       TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
                                 "CompileStaticInitializer");
       if (tds.enabled()) {
         tds.SetNumArguments(1);
         tds.CopyArgument(0, "field", field.ToCString());
       }
-#endif  // !defined(PRODUCT)
+#endif  // defined(SUPPORT_TIMELINE)
 
       StackZone stack_zone(thread);
       Zone* zone = stack_zone.GetZone();
@@ -1704,8 +1707,8 @@
 }
 
 RawObject* Compiler::EvaluateStaticInitializer(const Field& field) {
-  ASSERT(field.HasInitializer());
-  const Function& initializer = Function::Handle(field.Initializer());
+  ASSERT(field.HasInitializerFunction());
+  const Function& initializer = Function::Handle(field.InitializerFunction());
   return DartEntry::InvokeFunction(initializer, Object::empty_array());
 }
 
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index aca31eb..ce66591 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -23,6 +23,22 @@
   return a.raw() == b.raw();
 }
 
+bool IsEqualType(const AbstractType& a, const AbstractType& b) {
+  return a.Equals(b);
+}
+
+bool IsDoubleType(const AbstractType& type) {
+  return type.IsDoubleType();
+}
+
+bool IsIntType(const AbstractType& type) {
+  return type.IsIntType();
+}
+
+bool IsSmiType(const AbstractType& type) {
+  return type.IsSmiType();
+}
+
 bool IsNotTemporaryScopedHandle(const Object& obj) {
   return obj.IsNotTemporaryScopedHandle();
 }
@@ -753,7 +769,7 @@
 }
 
 bool CanEmbedAsRawPointerInGeneratedCode(const dart::Object& obj) {
-  return obj.IsSmi() || obj.InVMHeap();
+  return obj.IsSmi() || obj.IsReadOnly();
 }
 
 word ToRawPointer(const dart::Object& a) {
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 853fac0..8df8767 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -36,7 +36,9 @@
 class RuntimeEntry;
 class Zone;
 
-#define DO(clazz) class clazz;
+#define DO(clazz)                                                              \
+  class Raw##clazz;                                                            \
+  class clazz;
 CLASS_LIST_FOR_HANDLES(DO)
 #undef DO
 
@@ -106,6 +108,18 @@
 // Returns true if [a] and [b] are the same object.
 bool IsSameObject(const Object& a, const Object& b);
 
+// Returns true if [a] and [b] represent the same type (are equal).
+bool IsEqualType(const AbstractType& a, const AbstractType& b);
+
+// Returns true if [type] is the "int" type.
+bool IsIntType(const AbstractType& type);
+
+// Returns true if [type] is the "double" type.
+bool IsDoubleType(const AbstractType& type);
+
+// Returns true if [type] is the "_Smi" type.
+bool IsSmiType(const AbstractType& type);
+
 // Returns true if the given handle is a zone handle or one of the global
 // cached handles.
 bool IsNotTemporaryScopedHandle(const Object& obj);
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index fc4b9dc..512bfe6 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -1083,9 +1083,140 @@
   __ Ret();
 }
 
+// Called when invoking compiled Dart code from interpreted Dart code.
+// Input parameters:
+//   LR : points to return address.
+//   R0 : raw code object of the Dart function to call.
+//   R1 : arguments raw descriptor array.
+//   R2 : address of first argument.
+//   R3 : current thread.
 void StubCodeCompiler::GenerateInvokeDartCodeFromBytecodeStub(
     Assembler* assembler) {
-  __ Unimplemented("Interpreter not yet supported");
+#if defined(DART_PRECOMPILED_RUNTIME)
+  __ Stop("Not using interpreter");
+#else
+  __ Push(LR);  // Marker for the profiler.
+  __ EnterFrame((1 << FP) | (1 << LR), 0);
+
+  // Push code object to PC marker slot.
+  __ ldr(IP,
+         Address(R3,
+                 target::Thread::invoke_dart_code_from_bytecode_stub_offset()));
+  __ Push(IP);
+
+  // Save new context and C++ ABI callee-saved registers.
+  __ PushList(kAbiPreservedCpuRegs);
+
+  const DRegister firstd = EvenDRegisterOf(kAbiFirstPreservedFpuReg);
+  if (TargetCPUFeatures::vfp_supported()) {
+    ASSERT(2 * kAbiPreservedFpuRegCount < 16);
+    // Save FPU registers. 2 D registers per Q register.
+    __ vstmd(DB_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
+  } else {
+    __ sub(SP, SP, Operand(kAbiPreservedFpuRegCount * kFpuRegisterSize));
+  }
+
+  // Set up THR, which caches the current thread in Dart code.
+  if (THR != R3) {
+    __ mov(THR, Operand(R3));
+  }
+
+  // Save the current VMTag on the stack.
+  __ LoadFromOffset(kWord, R9, THR, target::Thread::vm_tag_offset());
+  __ Push(R9);
+
+  // Save top resource and top exit frame info. Use R4-6 as temporary registers.
+  // StackFrameIterator reads the top exit frame info saved in this frame.
+  __ LoadFromOffset(kWord, R9, THR,
+                    target::Thread::top_exit_frame_info_offset());
+  __ LoadFromOffset(kWord, R4, THR, target::Thread::top_resource_offset());
+  __ LoadImmediate(R8, 0);
+  __ StoreToOffset(kWord, R8, THR, target::Thread::top_resource_offset());
+  __ StoreToOffset(kWord, R8, THR,
+                   target::Thread::top_exit_frame_info_offset());
+
+  // target::frame_layout.exit_link_slot_from_entry_fp must be kept in sync
+  // with the code below.
+  __ Push(R4);
+#if defined(TARGET_OS_MACOS) || defined(TARGET_OS_MACOS_IOS)
+  ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -26);
+#else
+  ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -27);
+#endif
+  __ Push(R9);
+
+  // Mark that the thread is executing Dart code. Do this after initializing the
+  // exit link for the profiler.
+  __ LoadImmediate(R9, VMTag::kDartCompiledTagId);
+  __ StoreToOffset(kWord, R9, THR, target::Thread::vm_tag_offset());
+
+  // Load arguments descriptor array into R4, which is passed to Dart code.
+  __ mov(R4, Operand(R1));
+
+  // Load number of arguments into R9 and adjust count for type arguments.
+  __ ldr(R3,
+         FieldAddress(R4, target::ArgumentsDescriptor::type_args_len_offset()));
+  __ ldr(R9, FieldAddress(R4, target::ArgumentsDescriptor::count_offset()));
+  __ cmp(R3, Operand(0));
+  __ AddImmediate(R9, R9, target::ToRawSmi(1),
+                  NE);  // Include the type arguments.
+  __ SmiUntag(R9);
+
+  // R2 points to first argument.
+  // Set up arguments for the Dart call.
+  Label push_arguments;
+  Label done_push_arguments;
+  __ CompareImmediate(R9, 0);  // check if there are arguments.
+  __ b(&done_push_arguments, EQ);
+  __ LoadImmediate(R1, 0);
+  __ Bind(&push_arguments);
+  __ ldr(R3, Address(R2));
+  __ Push(R3);
+  __ AddImmediate(R2, target::kWordSize);
+  __ AddImmediate(R1, 1);
+  __ cmp(R1, Operand(R9));
+  __ b(&push_arguments, LT);
+  __ Bind(&done_push_arguments);
+
+  // Call the Dart code entrypoint.
+  __ LoadImmediate(PP, 0);  // GC safe value into PP.
+  __ mov(CODE_REG, Operand(R0));
+  __ ldr(R0, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
+  __ blx(R0);  // R4 is the arguments descriptor array.
+
+  // Get rid of arguments pushed on the stack.
+  __ AddImmediate(
+      SP, FP,
+      target::frame_layout.exit_link_slot_from_entry_fp * target::kWordSize);
+
+  // Restore the saved top exit frame info and top resource back into the
+  // Isolate structure. Uses R9 as a temporary register for this.
+  __ Pop(R9);
+  __ StoreToOffset(kWord, R9, THR,
+                   target::Thread::top_exit_frame_info_offset());
+  __ Pop(R9);
+  __ StoreToOffset(kWord, R9, THR, target::Thread::top_resource_offset());
+
+  // Restore the current VMTag from the stack.
+  __ Pop(R4);
+  __ StoreToOffset(kWord, R4, THR, target::Thread::vm_tag_offset());
+
+  // Restore C++ ABI callee-saved registers.
+  if (TargetCPUFeatures::vfp_supported()) {
+    // Restore FPU registers. 2 D registers per Q register.
+    __ vldmd(IA_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
+  } else {
+    __ AddImmediate(SP, kAbiPreservedFpuRegCount * kFpuRegisterSize);
+  }
+  // Restore CPU registers.
+  __ PopList(kAbiPreservedCpuRegs);
+  __ set_constant_pool_allowed(false);
+
+  // Restore the frame pointer and return.
+  __ LeaveFrame((1 << FP) | (1 << LR));
+  __ Drop(1);
+  __ Ret();
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
 // Called for inline allocation of contexts.
@@ -2032,8 +2163,79 @@
   __ Branch(FieldAddress(R0, target::Function::entry_point_offset()));
 }
 
+// Stub for interpreting a function call.
+// R4: Arguments descriptor.
+// R0: Function.
 void StubCodeCompiler::GenerateInterpretCallStub(Assembler* assembler) {
-  __ Unimplemented("Interpreter not yet supported");
+#if defined(DART_PRECOMPILED_RUNTIME)
+  __ Stop("Not using interpreter")
+#else
+  __ EnterStubFrame();
+
+#if defined(DEBUG)
+  {
+    Label ok;
+    // Check that we are always entering from Dart code.
+    __ LoadFromOffset(kWord, R8, THR, target::Thread::vm_tag_offset());
+    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
+    __ b(&ok, EQ);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Adjust arguments count for type arguments vector.
+  __ LoadFieldFromOffset(kWord, R2, R4,
+                         target::ArgumentsDescriptor::count_offset());
+  __ SmiUntag(R2);
+  __ LoadFieldFromOffset(kWord, R1, R4,
+                         target::ArgumentsDescriptor::type_args_len_offset());
+  __ cmp(R1, Operand(0));
+  __ AddImmediate(R2, R2, 1, NE);  // Include the type arguments.
+
+  // Compute argv.
+  __ mov(R3, Operand(R2, LSL, 2));
+  __ add(R3, FP, Operand(R3));
+  __ AddImmediate(R3,
+                  target::frame_layout.param_end_from_fp * target::kWordSize);
+
+  // Indicate decreasing memory addresses of arguments with negative argc.
+  __ rsb(R2, R2, Operand(0));
+
+  // Align frame before entering C++ world. Fifth argument passed on the stack.
+  __ ReserveAlignedFrameSpace(1 * target::kWordSize);
+
+  // Pass arguments in registers.
+  // R0: Function.
+  __ mov(R1, Operand(R4));  // Arguments descriptor.
+  // R2: Negative argc.
+  // R3: Argv.
+  __ str(THR, Address(SP, 0));  // Fifth argument: Thread.
+
+  // Save exit frame information to enable stack walking as we are about
+  // to transition to Dart VM C++ code.
+  __ StoreToOffset(kWord, FP, THR,
+                   target::Thread::top_exit_frame_info_offset());
+
+  // Mark that the thread is executing VM code.
+  __ LoadFromOffset(kWord, R5, THR,
+                    target::Thread::interpret_call_entry_point_offset());
+  __ StoreToOffset(kWord, R5, THR, target::Thread::vm_tag_offset());
+
+  __ blx(R5);
+
+  // Mark that the thread is executing Dart code.
+  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
+  __ StoreToOffset(kWord, R2, THR, target::Thread::vm_tag_offset());
+
+  // Reset exit frame information in Isolate structure.
+  __ LoadImmediate(R2, 0);
+  __ StoreToOffset(kWord, R2, THR,
+                   target::Thread::top_exit_frame_info_offset());
+
+  __ LeaveStubFrame();
+  __ Ret();
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
 // R9: Contains an ICData.
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 30acf68..64e2cb2 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -28,7 +28,6 @@
             use_slow_path,
             false,
             "Set to true for debugging & verifying the slow paths.");
-DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(bool, precompiled_mode);
 
 namespace compiler {
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index 0fe7e81..5b366b3 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -878,9 +878,117 @@
   __ ret();
 }
 
+// Called when invoking compiled Dart code from interpreted Dart code.
+// Input parameters:
+//   ESP : points to return address.
+//   ESP + 4 : target raw code
+//   ESP + 8 : arguments raw descriptor array.
+//   ESP + 12: address of first argument.
+//   ESP + 16 : current thread.
 void StubCodeCompiler::GenerateInvokeDartCodeFromBytecodeStub(
     Assembler* assembler) {
-  __ Unimplemented("Interpreter not yet supported");
+  const intptr_t kTargetCodeOffset = 3 * target::kWordSize;
+  const intptr_t kArgumentsDescOffset = 4 * target::kWordSize;
+  const intptr_t kArgumentsOffset = 5 * target::kWordSize;
+  const intptr_t kThreadOffset = 6 * target::kWordSize;
+
+  __ pushl(Address(ESP, 0));  // Marker for the profiler.
+  __ EnterFrame(0);
+
+  // Push code object to PC marker slot.
+  __ movl(EAX, Address(EBP, kThreadOffset));
+  __ pushl(Address(EAX, target::Thread::invoke_dart_code_stub_offset()));
+
+  // Save C++ ABI callee-saved registers.
+  __ pushl(EBX);
+  __ pushl(ESI);
+  __ pushl(EDI);
+
+  // Set up THR, which caches the current thread in Dart code.
+  __ movl(THR, EAX);
+
+  // Save the current VMTag on the stack.
+  __ movl(ECX, Assembler::VMTagAddress());
+  __ pushl(ECX);
+
+  // Save top resource and top exit frame info. Use EDX as a temporary register.
+  // StackFrameIterator reads the top exit frame info saved in this frame.
+  __ movl(EDX, Address(THR, target::Thread::top_resource_offset()));
+  __ pushl(EDX);
+  __ movl(Address(THR, target::Thread::top_resource_offset()), Immediate(0));
+  // The constant target::frame_layout.exit_link_slot_from_entry_fp must be
+  // kept in sync with the code below.
+  ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -7);
+  __ movl(EDX, Address(THR, target::Thread::top_exit_frame_info_offset()));
+  __ pushl(EDX);
+  __ movl(Address(THR, target::Thread::top_exit_frame_info_offset()),
+          Immediate(0));
+
+  // Mark that the thread is executing Dart code. Do this after initializing the
+  // exit link for the profiler.
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+
+  // Load arguments descriptor array into EDX.
+  __ movl(EDX, Address(EBP, kArgumentsDescOffset));
+
+  // Load number of arguments into EBX and adjust count for type arguments.
+  __ movl(EBX, FieldAddress(EDX, target::ArgumentsDescriptor::count_offset()));
+  __ cmpl(
+      FieldAddress(EDX, target::ArgumentsDescriptor::type_args_len_offset()),
+      Immediate(0));
+  Label args_count_ok;
+  __ j(EQUAL, &args_count_ok, Assembler::kNearJump);
+  __ addl(EBX, Immediate(target::ToRawSmi(1)));  // Include the type arguments.
+  __ Bind(&args_count_ok);
+  // Save number of arguments as Smi on stack, replacing ArgumentsDesc.
+  __ movl(Address(EBP, kArgumentsDescOffset), EBX);
+  __ SmiUntag(EBX);
+
+  // Set up arguments for the dart call.
+  Label push_arguments;
+  Label done_push_arguments;
+  __ testl(EBX, EBX);  // check if there are arguments.
+  __ j(ZERO, &done_push_arguments, Assembler::kNearJump);
+  __ movl(EAX, Immediate(0));
+
+  // Compute address of 'arguments array' data area into EDI.
+  __ movl(EDI, Address(EBP, kArgumentsOffset));
+
+  __ Bind(&push_arguments);
+  __ movl(ECX, Address(EDI, EAX, TIMES_4, 0));
+  __ pushl(ECX);
+  __ incl(EAX);
+  __ cmpl(EAX, EBX);
+  __ j(LESS, &push_arguments, Assembler::kNearJump);
+  __ Bind(&done_push_arguments);
+
+  // Call the dart code entrypoint.
+  __ movl(EAX, Address(EBP, kTargetCodeOffset));
+  __ call(FieldAddress(EAX, target::Code::entry_point_offset()));
+
+  // Read the saved number of passed arguments as Smi.
+  __ movl(EDX, Address(EBP, kArgumentsDescOffset));
+  // Get rid of arguments pushed on the stack.
+  __ leal(ESP, Address(ESP, EDX, TIMES_2, 0));  // EDX is a Smi.
+
+  // Restore the saved top exit frame info and top resource back into the
+  // Isolate structure.
+  __ popl(Address(THR, target::Thread::top_exit_frame_info_offset()));
+  __ popl(Address(THR, target::Thread::top_resource_offset()));
+
+  // Restore the current VMTag from the stack.
+  __ popl(Assembler::VMTagAddress());
+
+  // Restore C++ ABI callee-saved registers.
+  __ popl(EDI);
+  __ popl(ESI);
+  __ popl(EBX);
+
+  // Restore the frame pointer.
+  __ LeaveFrame();
+  __ popl(ECX);
+
+  __ ret();
 }
 
 // Called for inline allocation of contexts.
@@ -1794,8 +1902,70 @@
   __ jmp(EBX);
 }
 
+// Stub for interpreting a function call.
+// EDX: Arguments descriptor.
+// EAX: Function.
 void StubCodeCompiler::GenerateInterpretCallStub(Assembler* assembler) {
-  __ Unimplemented("Interpreter not yet supported");
+  __ EnterStubFrame();
+
+#if defined(DEBUG)
+  {
+    Label ok;
+    // Check that we are always entering from Dart code.
+    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Adjust arguments count for type arguments vector.
+  __ movl(ECX, FieldAddress(EDX, target::ArgumentsDescriptor::count_offset()));
+  __ SmiUntag(ECX);
+  __ cmpl(
+      FieldAddress(EDX, target::ArgumentsDescriptor::type_args_len_offset()),
+      Immediate(0));
+  Label args_count_ok;
+  __ j(EQUAL, &args_count_ok, Assembler::kNearJump);
+  __ incl(ECX);
+  __ Bind(&args_count_ok);
+
+  // Compute argv.
+  __ leal(EBX,
+          Address(EBP, ECX, TIMES_4,
+                  target::frame_layout.param_end_from_fp * target::kWordSize));
+
+  // Indicate decreasing memory addresses of arguments with negative argc.
+  __ negl(ECX);
+
+  __ pushl(THR);  // Arg 4: Thread.
+  __ pushl(EBX);  // Arg 3: Argv.
+  __ pushl(ECX);  // Arg 2: Negative argc.
+  __ pushl(EDX);  // Arg 1: Arguments descriptor
+  __ pushl(EAX);  // Arg 0: Function
+
+  // Save exit frame information to enable stack walking as we are about
+  // to transition to Dart VM C++ code.
+  __ movl(Address(THR, target::Thread::top_exit_frame_info_offset()), EBP);
+
+  // Mark that the thread is executing VM code.
+  __ movl(EAX,
+          Address(THR, target::Thread::interpret_call_entry_point_offset()));
+  __ movl(Assembler::VMTagAddress(), EAX);
+
+  __ call(EAX);
+
+  __ Drop(5);
+
+  // Mark that the thread is executing Dart code.
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+
+  // Reset exit frame information in Isolate structure.
+  __ movl(Address(THR, target::Thread::top_exit_frame_info_offset()),
+          Immediate(0));
+
+  __ LeaveFrame();
+  __ ret();
 }
 
 // ECX: Contains an ICData.
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index b357b77..c0ea951 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -27,7 +27,6 @@
             use_slow_path,
             false,
             "Set to true for debugging & verifying the slow paths.");
-DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(bool, precompiled_mode);
 
 namespace compiler {
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index ad749aa..75e6353 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -166,13 +166,9 @@
 #endif
 
   if (FLAG_enable_interpreter) {
-#if defined(USING_SIMULATOR) || defined(TARGET_ARCH_DBC)
-    return strdup(
-        "--enable-interpreter is not supported when targeting "
-        "a sim* architecture.");
-#endif  // defined(USING_SIMULATOR) || defined(TARGET_ARCH_DBC)
-
-    FLAG_use_field_guards = false;
+#if defined(TARGET_ARCH_DBC)
+    return strdup("--enable-interpreter is not supported with DBC");
+#endif  // defined(TARGET_ARCH_DBC)
   }
 
   FrameLayout::Init();
@@ -525,10 +521,7 @@
   StoreBuffer::Cleanup();
   Object::Cleanup();
   SemiSpace::Cleanup();
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // Stubs are generated when not precompiled, clean them up.
   StubCode::Cleanup();
-#endif
   // Delete the current thread's TLS and set it's TLS to null.
   // If it is the last thread then the destructor would call
   // OSThread::Cleanup.
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 8e45f57..3e81020 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -38,6 +38,7 @@
 #include "vm/os_thread.h"
 #include "vm/port.h"
 #include "vm/profiler.h"
+#include "vm/profiler_service.h"
 #include "vm/program_visitor.h"
 #include "vm/resolver.h"
 #include "vm/reusable_handles.h"
@@ -358,6 +359,7 @@
 RawObject* Api::UnwrapHandle(Dart_Handle object) {
 #if defined(DEBUG)
   Thread* thread = Thread::Current();
+  ASSERT(thread->execution_state() == Thread::kThreadInVM);
   ASSERT(thread->IsMutatorThread());
   ASSERT(thread->isolate() != NULL);
   ASSERT(!FLAG_verify_handles || thread->IsValidLocalHandle(object) ||
@@ -490,7 +492,7 @@
 }
 
 static Dart_Handle InitNewReadOnlyApiHandle(RawObject* raw) {
-  ASSERT(raw->IsVMHeapObject());
+  ASSERT(raw->IsReadOnly());
   LocalHandle* ref = Dart::AllocateReadOnlyApiHandle();
   ref->set_raw(raw);
   return ref->apiHandle();
@@ -693,14 +695,20 @@
 // --- Handles ---
 
 DART_EXPORT bool Dart_IsError(Dart_Handle handle) {
+  Thread* thread = Thread::Current();
+  TransitionNativeToVM transition(thread);
   return Api::IsError(handle);
 }
 
 DART_EXPORT bool Dart_IsApiError(Dart_Handle object) {
+  Thread* thread = Thread::Current();
+  TransitionNativeToVM transition(thread);
   return Api::ClassId(object) == kApiErrorCid;
 }
 
 DART_EXPORT bool Dart_IsUnhandledExceptionError(Dart_Handle object) {
+  Thread* thread = Thread::Current();
+  TransitionNativeToVM transition(thread);
   return Api::ClassId(object) == kUnhandledExceptionCid;
 }
 
@@ -712,10 +720,15 @@
     const Instance& exc = Instance::Handle(Z, error.exception());
     return IsCompiletimeErrorObject(Z, exc);
   }
+
+  Thread* thread = Thread::Current();
+  TransitionNativeToVM transition(thread);
   return Api::ClassId(object) == kLanguageErrorCid;
 }
 
 DART_EXPORT bool Dart_IsFatalError(Dart_Handle object) {
+  Thread* thread = Thread::Current();
+  TransitionNativeToVM transition(thread);
   return Api::ClassId(object) == kUnwindErrorCid;
 }
 
@@ -1279,6 +1292,24 @@
   T->EnterSafepoint();
 }
 
+DART_EXPORT void Dart_StartProfiling() {
+#if !defined(PRODUCT)
+  if (!FLAG_profiler) {
+    FLAG_profiler = true;
+    Profiler::Init();
+  }
+#endif  // !defined(PRODUCT)
+}
+
+DART_EXPORT void Dart_StopProfiling() {
+#if !defined(PRODUCT)
+  if (FLAG_profiler) {
+    Profiler::Cleanup();
+    FLAG_profiler = false;
+  }
+#endif  // !defined(PRODUCT)
+}
+
 DART_EXPORT void Dart_ThreadDisableProfiling() {
   OSThread* os_thread = OSThread::Current();
   if (os_thread == NULL) {
@@ -1295,6 +1326,39 @@
   os_thread->EnableThreadInterrupts();
 }
 
+DART_EXPORT bool Dart_WriteProfileToTimeline(Dart_Port main_port,
+                                             char** error) {
+#if defined(PRODUCT)
+  return false;
+#else
+  if (!FLAG_profiler) {
+    if (error != NULL) {
+      *error = strdup("The profiler is not running.");
+    }
+    return false;
+  }
+
+  const intptr_t kBufferLength = 512;
+  char method[kBufferLength];
+  intptr_t method_length = snprintf(method, kBufferLength, "{"
+      "\"jsonrpc\": \"2.0\","
+      "\"method\": \"_writeCpuProfileTimeline\","
+      "\"id\": \"\","
+      "\"params\": {\"isolateId\": \"isolates/%" Pd64 "\"}"
+    "}", main_port);
+  ASSERT(method_length <= kBufferLength);
+
+  char* response = NULL;
+  intptr_t response_length;
+  bool success = Dart_InvokeVMServiceMethod(
+      reinterpret_cast<uint8_t*>(method), method_length,
+      reinterpret_cast<uint8_t**>(&response), &response_length,
+      error);
+  free(response);
+  return success;
+#endif
+}
+
 DART_EXPORT bool Dart_ShouldPauseOnStart() {
 #if defined(PRODUCT)
   return false;
@@ -1405,14 +1469,17 @@
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
   NoSafepointScope no_safepoint_scope;
-  if ((isolate->sticky_error() != Error::null()) && !::Dart_IsNull(error)) {
+  const Error& error_handle = Api::UnwrapErrorHandle(Z, error);
+  if ((isolate->sticky_error() != Error::null()) &&
+      (error_handle.raw() != Object::null())) {
     FATAL1("%s expects there to be no sticky error.", CURRENT_FUNC);
   }
-  if (!::Dart_IsUnhandledExceptionError(error) && !::Dart_IsNull(error)) {
+  if (!error_handle.IsUnhandledException() &&
+      (error_handle.raw() != Object::null())) {
     FATAL1("%s expects the error to be an unhandled exception error or null.",
            CURRENT_FUNC);
   }
-  isolate->SetStickyError(Api::UnwrapErrorHandle(Z, error).raw());
+  isolate->SetStickyError(error_handle.raw());
 }
 
 DART_EXPORT bool Dart_HasStickyError() {
@@ -1489,7 +1556,7 @@
   CHECK_NULL(isolate_snapshot_data_size);
   // Finalize all classes if needed.
   Dart_Handle state = Api::CheckAndFinalizePendingClasses(T);
-  if (::Dart_IsError(state)) {
+  if (Api::IsError(state)) {
     return state;
   }
   BackgroundCompiler::Stop(I);
@@ -1825,6 +1892,7 @@
 }
 
 DART_EXPORT bool Dart_IsNull(Dart_Handle object) {
+  TransitionNativeToVM transition(Thread::Current());
   return Api::UnwrapHandle(object) == Object::null();
 }
 
@@ -1884,6 +1952,7 @@
 DART_EXPORT bool Dart_IsInstance(Dart_Handle object) {
   Thread* thread = Thread::Current();
   CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   REUSABLE_OBJECT_HANDLESCOPE(thread);
   Object& ref = thread->ObjectHandle();
   ref = Api::UnwrapHandle(object);
@@ -1891,39 +1960,60 @@
 }
 
 DART_EXPORT bool Dart_IsNumber(Dart_Handle object) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return RawObject::IsNumberClassId(Api::ClassId(object));
 }
 
 DART_EXPORT bool Dart_IsInteger(Dart_Handle object) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return RawObject::IsIntegerClassId(Api::ClassId(object));
 }
 
 DART_EXPORT bool Dart_IsDouble(Dart_Handle object) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return Api::ClassId(object) == kDoubleCid;
 }
 
 DART_EXPORT bool Dart_IsBoolean(Dart_Handle object) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return Api::ClassId(object) == kBoolCid;
 }
 
 DART_EXPORT bool Dart_IsString(Dart_Handle object) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return RawObject::IsStringClassId(Api::ClassId(object));
 }
 
 DART_EXPORT bool Dart_IsStringLatin1(Dart_Handle object) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return RawObject::IsOneByteStringClassId(Api::ClassId(object));
 }
 
 DART_EXPORT bool Dart_IsExternalString(Dart_Handle object) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return RawObject::IsExternalStringClassId(Api::ClassId(object));
 }
 
 DART_EXPORT bool Dart_IsList(Dart_Handle object) {
+  DARTSCOPE(Thread::Current());
   if (RawObject::IsBuiltinListClassId(Api::ClassId(object))) {
     return true;
   }
 
-  DARTSCOPE(Thread::Current());
   const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object));
   return GetListInstance(Z, obj) != Instance::null();
 }
@@ -1935,26 +2025,44 @@
 }
 
 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return Api::ClassId(object) == kLibraryCid;
 }
 
 DART_EXPORT bool Dart_IsType(Dart_Handle handle) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return Api::ClassId(handle) == kTypeCid;
 }
 
 DART_EXPORT bool Dart_IsFunction(Dart_Handle handle) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return Api::ClassId(handle) == kFunctionCid;
 }
 
 DART_EXPORT bool Dart_IsVariable(Dart_Handle handle) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return Api::ClassId(handle) == kFieldCid;
 }
 
 DART_EXPORT bool Dart_IsTypeVariable(Dart_Handle handle) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return Api::ClassId(handle) == kTypeParameterCid;
 }
 
 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return Api::ClassId(object) == kClosureCid;
 }
 
@@ -1971,6 +2079,9 @@
 }
 
 DART_EXPORT bool Dart_IsTypedData(Dart_Handle handle) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   intptr_t cid = Api::ClassId(handle);
   return RawObject::IsTypedDataClassId(cid) ||
          RawObject::IsExternalTypedDataClassId(cid) ||
@@ -1978,6 +2089,9 @@
 }
 
 DART_EXPORT bool Dart_IsByteBuffer(Dart_Handle handle) {
+  Thread* thread = Thread::Current();
+  CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   return Api::ClassId(handle) == kByteBufferCid;
 }
 
@@ -2118,13 +2232,16 @@
   API_TIMELINE_DURATION(thread);
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
-  intptr_t class_id = Api::ClassId(integer);
-  if (class_id == kSmiCid || class_id == kMintCid) {
+  if (Api::IsSmi(integer)) {
     *fits = true;
     return Api::Success();
   }
-  // Slow path for type error.
+  // Slow path for mints and type error.
   DARTSCOPE(thread);
+  if (Api::ClassId(integer) == kMintCid) {
+    *fits = true;
+    return Api::Success();
+  }
   const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer);
   ASSERT(int_obj.IsNull());
   RETURN_TYPE_ERROR(Z, integer, Integer);
@@ -2550,6 +2667,7 @@
                                                intptr_t* size) {
   Thread* thread = Thread::Current();
   CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   ReusableObjectHandleScope reused_obj_handle(thread);
   const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str);
   if (str_obj.IsNull()) {
@@ -2568,6 +2686,7 @@
                                                  void** peer) {
   Thread* thread = Thread::Current();
   CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   ReusableObjectHandleScope reused_obj_handle(thread);
   const String& str = Api::UnwrapStringHandle(reused_obj_handle, object);
   if (str.IsNull()) {
@@ -2778,7 +2897,7 @@
           args.SetAt(1, index);
           Dart_Handle value =
               Api::NewHandle(T, DartEntry::InvokeFunction(function, args));
-          if (::Dart_IsError(value)) return value;
+          if (Api::IsError(value)) return value;
           result[i] = value;
         }
         return Api::Success();
@@ -3247,7 +3366,9 @@
 }
 
 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfTypedData(Dart_Handle object) {
-  API_TIMELINE_DURATION(Thread::Current());
+  Thread* thread = Thread::Current();
+  API_TIMELINE_DURATION(thread);
+  TransitionNativeToVM transition(thread);
   intptr_t class_id = Api::ClassId(object);
   if (RawObject::IsTypedDataClassId(class_id) ||
       RawObject::IsTypedDataViewClassId(class_id)) {
@@ -3258,14 +3379,16 @@
 
 DART_EXPORT Dart_TypedData_Type
 Dart_GetTypeOfExternalTypedData(Dart_Handle object) {
-  API_TIMELINE_DURATION(Thread::Current());
+  Thread* thread = Thread::Current();
+  API_TIMELINE_DURATION(thread);
+  TransitionNativeToVM transition(thread);
   intptr_t class_id = Api::ClassId(object);
   if (RawObject::IsExternalTypedDataClassId(class_id)) {
     return GetType(class_id);
   }
   if (RawObject::IsTypedDataViewClassId(class_id)) {
     // Check if data object of the view is external.
-    Zone* zone = Thread::Current()->zone();
+    Zone* zone = thread->zone();
     const Instance& view_obj = Api::UnwrapInstanceHandle(zone, object);
     ASSERT(!view_obj.IsNull());
     const Instance& data_obj =
@@ -3349,7 +3472,7 @@
   Dart_Handle ext_data =
       NewExternalTypedData(thread, kExternalTypedDataUint8ArrayCid, data,
                            length, peer, external_allocation_size, callback);
-  if (::Dart_IsError(ext_data)) {
+  if (Api::IsError(ext_data)) {
     return ext_data;
   }
   Object& result = Object::Handle(zone);
@@ -3749,7 +3872,7 @@
         current_func, constr_name.ToCString(), error_message.ToCString()));
     return ApiError::New(message);
   }
-  RawError* error = constructor.VerifyEntryPoint();
+  RawError* error = constructor.VerifyCallEntryPoint();
   if (error != Error::null()) return error;
   return constructor.raw();
 }
@@ -4043,7 +4166,7 @@
   if (!constructor.IsNull() && constructor.IsGenerativeConstructor() &&
       constructor.AreValidArgumentCounts(
           kTypeArgsLen, number_of_arguments + extra_args, 0, NULL)) {
-    CHECK_ERROR_HANDLE(constructor.VerifyEntryPoint());
+    CHECK_ERROR_HANDLE(constructor.VerifyCallEntryPoint());
     // Create the argument list.
     // Constructors get the uninitialized object.
     if (!type_arguments.IsNull()) {
@@ -4057,7 +4180,7 @@
     Array& args = Array::Handle(Z);
     result =
         SetupArguments(T, number_of_arguments, arguments, extra_args, &args);
-    if (!::Dart_IsError(result)) {
+    if (!Api::IsError(result)) {
       args.SetAt(0, instance);
       const Object& retval =
           Object::Handle(Z, DartEntry::InvokeFunction(constructor, args));
@@ -4116,7 +4239,7 @@
 
     // Setup args and check for malformed arguments in the arguments list.
     result = SetupArguments(T, number_of_arguments, arguments, 0, &args);
-    if (::Dart_IsError(result)) {
+    if (Api::IsError(result)) {
       return result;
     }
     return Api::NewHandle(
@@ -4131,7 +4254,7 @@
 
     // Setup args and check for malformed arguments in the arguments list.
     result = SetupArguments(T, number_of_arguments, arguments, 1, &args);
-    if (::Dart_IsError(result)) {
+    if (Api::IsError(result)) {
       return result;
     }
     args.SetAt(0, instance);
@@ -4154,7 +4277,7 @@
 
     // Setup args and check for malformed arguments in the arguments list.
     result = SetupArguments(T, number_of_arguments, arguments, 0, &args);
-    if (::Dart_IsError(result)) {
+    if (Api::IsError(result)) {
       return result;
     }
 
@@ -4349,7 +4472,7 @@
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
   CHECK_CALLBACK_STATE(thread);
-  if (Api::IsError(exception)) {
+  if (::Dart_IsError(exception)) {
     ::Dart_PropagateError(exception);
   }
   TransitionNativeToVM transition(thread);
@@ -4423,6 +4546,7 @@
                                                          int* count) {
   Thread* thread = Thread::Current();
   CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   ReusableObjectHandleScope reused_obj_handle(thread);
   const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj);
   if (instance.IsNull()) {
@@ -4437,6 +4561,7 @@
                                                     intptr_t* value) {
   Thread* thread = Thread::Current();
   CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   ReusableObjectHandleScope reused_obj_handle(thread);
   const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj);
   if (instance.IsNull()) {
@@ -4731,11 +4856,11 @@
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   ASSERT(arguments->thread()->isolate() == Isolate::Current());
   ASSERT_CALLBACK_STATE(arguments->thread());
+  TransitionNativeToVM transition(arguments->thread());
   if ((retval != Api::Null()) && !Api::IsInstance(retval) &&
       !Api::IsError(retval)) {
     // Print the current stack trace to make the problematic caller
     // easier to find.
-    TransitionNativeToVM transition(arguments->thread());
     const StackTrace& stacktrace = GetCurrentStackTrace(0);
     OS::PrintErr("=== Current Trace:\n%s===\n", stacktrace.ToCString());
 
@@ -4752,6 +4877,7 @@
 DART_EXPORT void Dart_SetWeakHandleReturnValue(Dart_NativeArguments args,
                                                Dart_WeakPersistentHandle rval) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+  TransitionNativeToVM transition(arguments->thread());
 #if defined(DEBUG)
   Isolate* isolate = arguments->thread()->isolate();
   ASSERT(isolate == Isolate::Current());
@@ -4863,6 +4989,7 @@
 DART_EXPORT void Dart_SetBooleanReturnValue(Dart_NativeArguments args,
                                             bool retval) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+  TransitionNativeToVM transition(arguments->thread());
   ASSERT(arguments->thread()->isolate() == Isolate::Current());
   ASSERT_CALLBACK_STATE(arguments->thread());
   arguments->SetReturn(Bool::Get(retval));
@@ -4871,14 +4998,13 @@
 DART_EXPORT void Dart_SetIntegerReturnValue(Dart_NativeArguments args,
                                             int64_t retval) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+  TransitionNativeToVM transition(arguments->thread());
   ASSERT(arguments->thread()->isolate() == Isolate::Current());
   ASSERT_CALLBACK_STATE(arguments->thread());
   if (Smi::IsValid(retval)) {
     Api::SetSmiReturnValue(arguments, static_cast<intptr_t>(retval));
   } else {
     // Slow path for Mints.
-    ASSERT_CALLBACK_STATE(arguments->thread());
-    TransitionNativeToVM transition(arguments->thread());
     Api::SetIntegerReturnValue(arguments, retval);
   }
 }
@@ -5264,7 +5390,7 @@
 
   // Finalize all classes if needed.
   Dart_Handle state = Api::CheckAndFinalizePendingClasses(T);
-  if (::Dart_IsError(state)) {
+  if (Api::IsError(state)) {
     return state;
   }
 
@@ -5364,6 +5490,7 @@
   }
   Thread* thread = Thread::Current();
   CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   REUSABLE_OBJECT_HANDLESCOPE(thread);
   Object& obj = thread->ObjectHandle();
   obj = Api::UnwrapHandle(object);
@@ -5383,6 +5510,7 @@
 DART_EXPORT Dart_Handle Dart_SetPeer(Dart_Handle object, void* peer) {
   Thread* thread = Thread::Current();
   CHECK_ISOLATE(thread->isolate());
+  TransitionNativeToVM transition(thread);
   REUSABLE_OBJECT_HANDLESCOPE(thread);
   Object& obj = thread->ObjectHandle();
   obj = Api::UnwrapHandle(object);
@@ -5498,6 +5626,15 @@
   return result;
 }
 
+DART_EXPORT void Dart_SetDartLibrarySourcesKernel(
+    const uint8_t* platform_kernel,
+    const intptr_t platform_kernel_size) {
+#if !defined(PRODUCT)
+  Service::SetDartLibraryKernelForSources(platform_kernel,
+                                          platform_kernel_size);
+#endif
+}
+
 // --- Service support ---
 
 DART_EXPORT bool Dart_IsServiceIsolate(Dart_Isolate isolate) {
@@ -5868,7 +6005,7 @@
     return Api::NewError("Flag --precompilation was not specified.");
   }
   Dart_Handle result = Api::CheckAndFinalizePendingClasses(T);
-  if (::Dart_IsError(result)) {
+  if (Api::IsError(result)) {
     return result;
   }
   CHECK_CALLBACK_STATE(T);
@@ -6090,7 +6227,7 @@
   CHECK_NULL(isolate_snapshot_instructions_size);
   // Finalize all classes if needed.
   Dart_Handle state = Api::CheckAndFinalizePendingClasses(T);
-  if (::Dart_IsError(state)) {
+  if (Api::IsError(state)) {
     return state;
   }
   BackgroundCompiler::Stop(I);
@@ -6149,7 +6286,7 @@
   CHECK_NULL(isolate_snapshot_instructions_size);
   // Finalize all classes if needed.
   Dart_Handle state = Api::CheckAndFinalizePendingClasses(T);
-  if (::Dart_IsError(state)) {
+  if (Api::IsError(state)) {
     return state;
   }
   BackgroundCompiler::Stop(I);
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 570a855..76a6b0d 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -186,11 +186,20 @@
 
   // Returns true if the handle holds a Smi.
   static bool IsSmi(Dart_Handle handle) {
-    // TODO(turnidge): Assumes RawObject* is at offset zero.  Fix.
+    // Important: we do not require current thread to be in VM state because
+    // we do not dereference the handle.
     RawObject* raw = *(reinterpret_cast<RawObject**>(handle));
     return !raw->IsHeapObject();
   }
 
+  // Returns the value of a Smi.
+  static intptr_t SmiValue(Dart_Handle handle) {
+    // Important: we do not require current thread to be in VM state because
+    // we do not dereference the handle.
+    RawObject* value = *(reinterpret_cast<RawObject**>(handle));
+    return Smi::Value(static_cast<RawSmi*>(value));
+  }
+
   // Returns true if the handle holds a Dart Instance.
   static bool IsInstance(Dart_Handle handle) {
     return (ClassId(handle) >= kInstanceCid);
@@ -204,16 +213,8 @@
     return RawObject::IsErrorClassId(ClassId(handle));
   }
 
-  // Returns the value of a Smi.
-  static intptr_t SmiValue(Dart_Handle handle) {
-    // TODO(turnidge): Assumes RawObject* is at offset zero.  Fix.
-    uword value = *(reinterpret_cast<uword*>(handle));
-    return Smi::ValueFromRaw(value);
-  }
-
   static intptr_t ClassId(Dart_Handle handle) {
-    // TODO(turnidge): Assumes RawObject* is at offset zero.  Fix.
-    RawObject* raw = *(reinterpret_cast<RawObject**>(handle));
+    RawObject* raw = UnwrapHandle(handle);
     if (!raw->IsHeapObject()) {
       return kSmiCid;
     }
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 2783bd7..487b22a 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -529,18 +529,6 @@
   uword fp_for_clearing =
       (clear_deopt_at_target ? frame_pointer + 1 : frame_pointer);
   ClearLazyDeopts(thread, fp_for_clearing);
-#if defined(USING_SIMULATOR)
-  // Unwinding of the C++ frames and destroying of their stack resources is done
-  // by the simulator, because the target stack_pointer is a simulated stack
-  // pointer and not the C++ stack pointer.
-
-  // Continue simulating at the given pc in the given frame after setting up the
-  // exception object in the kExceptionObjectReg register and the stacktrace
-  // object (may be raw null) in the kStackTraceObjectReg register.
-
-  Simulator::Current()->JumpToFrame(program_counter, stack_pointer,
-                                    frame_pointer, thread);
-#else
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   // TODO(regis): We still possibly need to unwind interpreter frames if they
@@ -554,6 +542,19 @@
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
+#if defined(USING_SIMULATOR)
+  // Unwinding of the C++ frames and destroying of their stack resources is done
+  // by the simulator, because the target stack_pointer is a simulated stack
+  // pointer and not the C++ stack pointer.
+
+  // Continue simulating at the given pc in the given frame after setting up the
+  // exception object in the kExceptionObjectReg register and the stacktrace
+  // object (may be raw null) in the kStackTraceObjectReg register.
+
+  Simulator::Current()->JumpToFrame(program_counter, stack_pointer,
+                                    frame_pointer, thread);
+#else
+
   // Prepare for unwinding frames by destroying all the stack resources
   // in the previous frames.
   StackResource::Unwind(thread);
diff --git a/runtime/vm/ffi_trampoline_stubs_x64.cc b/runtime/vm/ffi_trampoline_stubs_x64.cc
index 9374f61..1afc9b5 100644
--- a/runtime/vm/ffi_trampoline_stubs_x64.cc
+++ b/runtime/vm/ffi_trampoline_stubs_x64.cc
@@ -4,6 +4,7 @@
 
 // TODO(dacoharkes): Move this into compiler namespace.
 
+#include "vm/class_id.h"
 #include "vm/globals.h"
 
 #include "vm/stub_code.h"
@@ -13,6 +14,7 @@
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/compiler/assembler/disassembler.h"
 #include "vm/compiler/backend/flow_graph_compiler.h"
+#include "vm/compiler/ffi.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/constants_x64.h"
 #include "vm/dart_entry.h"
@@ -29,90 +31,6 @@
 
 namespace dart {
 
-static Representation TypeRepresentation(const AbstractType& result_type) {
-  switch (result_type.type_class_id()) {
-    case kFfiFloatCid:
-    case kFfiDoubleCid:
-      return kUnboxedDouble;
-    case kFfiInt8Cid:
-    case kFfiInt16Cid:
-    case kFfiInt32Cid:
-    case kFfiInt64Cid:
-    case kFfiUint8Cid:
-    case kFfiUint16Cid:
-    case kFfiUint32Cid:
-    case kFfiUint64Cid:
-    case kFfiIntPtrCid:
-    case kFfiPointerCid:
-    default:  // Subtypes of Pointer.
-      return kUnboxedInt64;
-  }
-}
-
-// Converts a Ffi [signature] to a list of Representations.
-// Note that this ignores first argument (receiver) which is dynamic.
-static ZoneGrowableArray<Representation>* ArgumentRepresentations(
-    const Function& signature) {
-  intptr_t num_arguments = signature.num_fixed_parameters() - 1;
-  auto result = new ZoneGrowableArray<Representation>(num_arguments);
-  for (intptr_t i = 0; i < num_arguments; i++) {
-    AbstractType& arg_type =
-        AbstractType::Handle(signature.ParameterTypeAt(i + 1));
-    result->Add(TypeRepresentation(arg_type));
-  }
-  return result;
-}
-
-// Takes a list of argument representations, and converts it to a list of
-// argument locations based on calling convention.
-static ZoneGrowableArray<Location>* ArgumentLocations(
-    const ZoneGrowableArray<Representation>& arg_representations) {
-  intptr_t num_arguments = arg_representations.length();
-  auto result = new ZoneGrowableArray<Location>(num_arguments);
-  result->FillWith(Location(), 0, num_arguments);
-  Location* data = result->data();
-
-  // Loop through all arguments and assign a register or a stack location.
-  intptr_t int_regs_used = 0;
-  intptr_t xmm_regs_used = 0;
-  intptr_t nth_stack_argument = 0;
-  bool on_stack;
-  for (intptr_t i = 0; i < num_arguments; i++) {
-    on_stack = true;
-    switch (arg_representations.At(i)) {
-      case kUnboxedInt64:
-        if (int_regs_used < CallingConventions::kNumArgRegs) {
-          data[i] = Location::RegisterLocation(
-              CallingConventions::ArgumentRegisters[int_regs_used]);
-          int_regs_used++;
-          if (CallingConventions::kArgumentIntRegXorXmmReg) {
-            xmm_regs_used++;
-          }
-          on_stack = false;
-        }
-        break;
-      case kUnboxedDouble:
-        if (xmm_regs_used < CallingConventions::kNumXmmArgRegs) {
-          data[i] = Location::FpuRegisterLocation(
-              CallingConventions::XmmArgumentRegisters[xmm_regs_used]);
-          xmm_regs_used++;
-          if (CallingConventions::kArgumentIntRegXorXmmReg) {
-            int_regs_used++;
-          }
-          on_stack = false;
-        }
-        break;
-      default:
-        UNREACHABLE();
-    }
-    if (on_stack) {
-      data[i] = Location::StackSlot(nth_stack_argument, RSP);
-      nth_stack_argument++;
-    }
-  }
-  return result;
-}
-
 static intptr_t NumStackArguments(
     const ZoneGrowableArray<Location>& locations) {
   intptr_t num_arguments = locations.length();
@@ -313,7 +231,8 @@
 
   // If not null but a Pointer, load the address.
   __ Bind(&not_null);
-  __ movq(reg, FieldAddress(reg, Pointer::address_offset()));
+  __ movq(reg, FieldAddress(reg, Pointer::c_memory_address_offset()));
+  GenerateMarshalInt64(assembler, reg);
   __ Bind(&done);
 }
 
@@ -338,9 +257,9 @@
   __ LoadObject(RAX, Object::null_object());
   __ jmp(&done);
 
-  // Backup result value (to avoid GC).
   __ Bind(&not_null);
-  GenerateSaveInt64GCSafe(assembler, RAX);
+  GenerateUnmarshalInt64(assembler);
+  __ pushq(RAX);
 
   // Allocate object (can call into runtime).
   __ movq(TMP, closure_dart);
@@ -351,8 +270,8 @@
   __ popq(TMP);  // Pop type arguments.
 
   // Store the result value.
-  GenerateLoadInt64GCSafe(assembler, RDX);
-  __ movq(FieldAddress(RAX, Pointer::address_offset()), RDX);
+  __ popq(RDX);
+  __ movq(FieldAddress(RAX, Pointer::c_memory_address_offset()), RDX);
   __ Bind(&done);
 }
 
@@ -391,6 +310,9 @@
                                     const AbstractType& result_type,
                                     Address closure_dart) {
   switch (result_type.type_class_id()) {
+    case kFfiVoidCid:
+      __ LoadObject(RAX, Object::null_object());
+      return;
     case kFfiInt8Cid:
     case kFfiInt16Cid:
     case kFfiInt32Cid:
@@ -441,9 +363,9 @@
 // TODO(dacoharkes): Test truncation on non 64 bits ints and floats.
 void GenerateFfiTrampoline(Assembler* assembler, const Function& signature) {
   ZoneGrowableArray<Representation>* arg_representations =
-      ArgumentRepresentations(signature);
+      ffi::ArgumentRepresentations(signature);
   ZoneGrowableArray<Location>* arg_locations =
-      ArgumentLocations(*arg_representations);
+      ffi::ArgumentLocations(*arg_representations);
 
   intptr_t num_dart_arguments = signature.num_fixed_parameters();
   intptr_t num_arguments = num_dart_arguments - 1;  // ignore closure
@@ -532,9 +454,9 @@
                                   const Function& signature,
                                   void* dart_entry_point) {
   ZoneGrowableArray<Representation>* arg_representations =
-      ArgumentRepresentations(signature);
+      ffi::ArgumentRepresentations(signature);
   ZoneGrowableArray<Location>* arg_locations =
-      ArgumentLocations(*arg_representations);
+      ffi::ArgumentLocations(*arg_representations);
 
   intptr_t num_dart_arguments = signature.num_fixed_parameters();
   intptr_t num_arguments = num_dart_arguments - 1;  // Ignore closure.
diff --git a/runtime/vm/guard_field_test.cc b/runtime/vm/guard_field_test.cc
index bc30357..be010ce 100644
--- a/runtime/vm/guard_field_test.cc
+++ b/runtime/vm/guard_field_test.cc
@@ -224,8 +224,8 @@
       "}\n";
   Dart_Handle lib = TestCase::LoadTestScript(script_chars, NULL);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  TransitionNativeToVM transition(thread);
   EXPECT_VALID(result);
+  TransitionNativeToVM transition(thread);
   Field& f1 = Field::ZoneHandle(LookupField(lib, "A", "f1"));
   Field& f2 = Field::ZoneHandle(LookupField(lib, "A", "f2"));
   Field& f3 = Field::ZoneHandle(LookupField(lib, "A", "f3"));
diff --git a/runtime/vm/handles_test.cc b/runtime/vm/handles_test.cc
index 8dcb1ba..142e147 100644
--- a/runtime/vm/handles_test.cc
+++ b/runtime/vm/handles_test.cc
@@ -92,7 +92,10 @@
     TransitionNativeToVM transition(thread);
     StackZone sz(thread);
     handle = reinterpret_cast<Dart_Handle>(&Smi::ZoneHandle(Smi::New(1)));
-    EXPECT_VALID(handle);
+    {
+      TransitionVMToNative to_native(thread);
+      EXPECT_VALID(handle);
+    }
   }
   EXPECT(!Api::IsValid(handle));
 
@@ -103,7 +106,10 @@
       TransitionNativeToVM transition(thread);
       HANDLESCOPE(thread);
       handle = reinterpret_cast<Dart_Handle>(&Smi::Handle(Smi::New(1)));
-      EXPECT_VALID(handle);
+      {
+        TransitionVMToNative to_native(thread);
+        EXPECT_VALID(handle);
+      }
     }
     Dart_ExitScope();
   }
diff --git a/runtime/vm/hash_table.h b/runtime/vm/hash_table.h
index 250a8d0..b84e35f 100644
--- a/runtime/vm/hash_table.h
+++ b/runtime/vm/hash_table.h
@@ -302,7 +302,7 @@
   }
   void UpdateCollisions(intptr_t collisions) const {
     if (KeyTraits::ReportStats()) {
-      if (data_->raw()->IsVMHeapObject()) {
+      if (data_->raw()->IsReadOnly()) {
         return;
       }
       AdjustSmiValueAt(kNumProbesIndex, collisions + 1);
diff --git a/runtime/vm/heap/become.cc b/runtime/vm/heap/become.cc
index 1b1823a..9cda40a 100644
--- a/runtime/vm/heap/become.cc
+++ b/runtime/vm/heap/become.cc
@@ -193,14 +193,14 @@
   OS::PrintErr("BEFORE ADDRESS: %p\n", before_obj);
   OS::PrintErr("BEFORE IS HEAP OBJECT: %s",
                before_obj->IsHeapObject() ? "YES" : "NO");
-  OS::PrintErr("BEFORE IS VM HEAP OBJECT: %s",
-               before_obj->IsVMHeapObject() ? "YES" : "NO");
+  OS::PrintErr("BEFORE IS READ ONLY OBJECT: %s",
+               before_obj->IsReadOnly() ? "YES" : "NO");
 
   OS::PrintErr("AFTER ADDRESS: %p\n", after_obj);
   OS::PrintErr("AFTER IS HEAP OBJECT: %s",
                after_obj->IsHeapObject() ? "YES" : "NO");
-  OS::PrintErr("AFTER IS VM HEAP OBJECT: %s",
-               after_obj->IsVMHeapObject() ? "YES" : "NO");
+  OS::PrintErr("AFTER IS READ ONLY OBJECT: %s",
+               after_obj->IsReadOnly() ? "YES" : "NO");
 
   if (before_obj->IsHeapObject()) {
     OS::PrintErr("BEFORE OBJECT CLASS ID=%" Pd "\n", before_obj->GetClassId());
@@ -240,7 +240,7 @@
       CrashDump(before_obj, after_obj);
       FATAL("become: Cannot become immediates");
     }
-    if (before_obj->IsVMHeapObject()) {
+    if (before_obj->IsReadOnly()) {
       CrashDump(before_obj, after_obj);
       FATAL("become: Cannot forward VM heap objects");
     }
diff --git a/runtime/vm/heap/freelist.cc b/runtime/vm/heap/freelist.cc
index cacb13e..9c2aca1 100644
--- a/runtime/vm/heap/freelist.cc
+++ b/runtime/vm/heap/freelist.cc
@@ -202,17 +202,6 @@
   }
 }
 
-intptr_t FreeList::IndexForSize(intptr_t size) {
-  ASSERT(size >= kObjectAlignment);
-  ASSERT(Utils::IsAligned(size, kObjectAlignment));
-
-  intptr_t index = size >> kObjectAlignmentLog2;
-  if (index >= kNumLists) {
-    index = kNumLists;
-  }
-  return index;
-}
-
 void FreeList::EnqueueElement(FreeListElement* element, intptr_t index) {
   FreeListElement* next = free_lists_[index];
   if (next == NULL && index != kNumLists) {
@@ -224,23 +213,6 @@
   free_lists_[index] = element;
 }
 
-FreeListElement* FreeList::DequeueElement(intptr_t index) {
-  FreeListElement* result = free_lists_[index];
-  FreeListElement* next = result->next();
-  if (next == NULL && index != kNumLists) {
-    intptr_t size = index << kObjectAlignmentLog2;
-    if (size == last_free_small_size_) {
-      // Note: This is -1 * kObjectAlignment if no other small sizes remain.
-      last_free_small_size_ =
-          free_map_.ClearLastAndFindPrevious(index) * kObjectAlignment;
-    } else {
-      free_map_.Set(index, false);
-    }
-  }
-  free_lists_[index] = next;
-  return result;
-}
-
 intptr_t FreeList::LengthLocked(int index) const {
   DEBUG_ASSERT(mutex_->IsOwnedByCurrentThread());
   ASSERT(index >= 0);
@@ -398,24 +370,4 @@
   return NULL;
 }
 
-uword FreeList::TryAllocateSmallLocked(intptr_t size) {
-  DEBUG_ASSERT(mutex_->IsOwnedByCurrentThread());
-  if (size > last_free_small_size_) {
-    return 0;
-  }
-  int index = IndexForSize(size);
-  if (index != kNumLists && free_map_.Test(index)) {
-    return reinterpret_cast<uword>(DequeueElement(index));
-  }
-  if ((index + 1) < kNumLists) {
-    intptr_t next_index = free_map_.Next(index + 1);
-    if (next_index != -1) {
-      FreeListElement* element = DequeueElement(next_index);
-      SplitElementAfterAndEnqueue(element, size, false);
-      return reinterpret_cast<uword>(element);
-    }
-  }
-  return 0;
-}
-
 }  // namespace dart
diff --git a/runtime/vm/heap/freelist.h b/runtime/vm/heap/freelist.h
index 552c7a2..171ff1c 100644
--- a/runtime/vm/heap/freelist.h
+++ b/runtime/vm/heap/freelist.h
@@ -96,18 +96,60 @@
 
   // Allocates locked and unprotected memory, but only from small elements
   // (i.e., fixed size lists).
-  uword TryAllocateSmallLocked(intptr_t size);
+  uword TryAllocateSmallLocked(intptr_t size) {
+    DEBUG_ASSERT(mutex_->IsOwnedByCurrentThread());
+    if (size > last_free_small_size_) {
+      return 0;
+    }
+    int index = IndexForSize(size);
+    if (index != kNumLists && free_map_.Test(index)) {
+      return reinterpret_cast<uword>(DequeueElement(index));
+    }
+    if ((index + 1) < kNumLists) {
+      intptr_t next_index = free_map_.Next(index + 1);
+      if (next_index != -1) {
+        FreeListElement* element = DequeueElement(next_index);
+        SplitElementAfterAndEnqueue(element, size, false);
+        return reinterpret_cast<uword>(element);
+      }
+    }
+    return 0;
+  }
 
  private:
   static const int kNumLists = 128;
   static const intptr_t kInitialFreeListSearchBudget = 1000;
 
-  static intptr_t IndexForSize(intptr_t size);
+  static intptr_t IndexForSize(intptr_t size) {
+    ASSERT(size >= kObjectAlignment);
+    ASSERT(Utils::IsAligned(size, kObjectAlignment));
+
+    intptr_t index = size >> kObjectAlignmentLog2;
+    if (index >= kNumLists) {
+      index = kNumLists;
+    }
+    return index;
+  }
 
   intptr_t LengthLocked(int index) const;
 
   void EnqueueElement(FreeListElement* element, intptr_t index);
-  FreeListElement* DequeueElement(intptr_t index);
+  FreeListElement* DequeueElement(intptr_t index) {
+    FreeListElement* result = free_lists_[index];
+    FreeListElement* next = result->next();
+    if (next == NULL && index != kNumLists) {
+      intptr_t size = index << kObjectAlignmentLog2;
+      if (size == last_free_small_size_) {
+        // Note: This is -1 * kObjectAlignment if no other small sizes remain.
+        last_free_small_size_ =
+            free_map_.ClearLastAndFindPrevious(index) * kObjectAlignment;
+      } else {
+        free_map_.Set(index, false);
+      }
+    }
+    free_lists_[index] = next;
+    return result;
+  }
 
   void SplitElementAfterAndEnqueue(FreeListElement* element,
                                    intptr_t size,
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index b6b1960..35675f4 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -83,8 +83,6 @@
 
 uword Heap::AllocateNew(intptr_t size) {
   ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0);
-  // Currently, only the Dart thread may allocate in new space.
-  isolate()->AssertCurrentThreadIsMutator();
   Thread* thread = Thread::Current();
   uword addr = new_space_.TryAllocateInTLAB(thread, size);
   if (addr != 0) {
@@ -210,7 +208,7 @@
 
 void Heap::PromoteExternal(intptr_t cid, intptr_t size) {
   new_space_.FreeExternal(size);
-  old_space_.AllocateExternal(cid, size);
+  old_space_.PromoteExternal(cid, size);
 }
 
 bool Heap::Contains(uword addr) const {
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index 7cdb876..5ae4083 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -400,6 +400,7 @@
   friend class HeapIterationScope;    // VisitObjects
   friend class ProgramVisitor;        // VisitObjectsImagePages
   friend class Serializer;            // VisitObjectsImagePages
+  friend class HeapTestHelper;
 
   DISALLOW_COPY_AND_ASSIGN(Heap);
 };
diff --git a/runtime/vm/heap/heap_test.cc b/runtime/vm/heap/heap_test.cc
index af5236c..c79848e 100644
--- a/runtime/vm/heap/heap_test.cc
+++ b/runtime/vm/heap/heap_test.cc
@@ -697,6 +697,49 @@
   EXPECT_EQ(size_before, size_after);
 }
 
+#if !defined(PRODUCT)
+class HeapTestHelper {
+ public:
+  static void Scavenge(Thread* thread) {
+    thread->heap()->CollectNewSpaceGarbage(thread, Heap::kDebugging);
+  }
+  static void MarkSweep(Thread* thread) {
+    thread->heap()->CollectOldSpaceGarbage(thread, Heap::kMarkSweep,
+                                           Heap::kDebugging);
+    thread->heap()->WaitForMarkerTasks(thread);
+    thread->heap()->WaitForSweeperTasks(thread);
+  }
+};
+
+ISOLATE_UNIT_TEST_CASE(ExternalAllocationStats) {
+  Isolate* isolate = thread->isolate();
+  Heap* heap = thread->heap();
+
+  Array& old = Array::Handle(Array::New(100, Heap::kOld));
+  Array& neu = Array::Handle();
+  for (intptr_t i = 0; i < 100; i++) {
+    neu = Array::New(1, Heap::kNew);
+    FinalizablePersistentHandle::New(isolate, neu, NULL, NoopFinalizer, 1 * MB);
+    old.SetAt(i, neu);
+
+    if ((i % 4) == 0) {
+      HeapTestHelper::MarkSweep(thread);
+    } else {
+      HeapTestHelper::Scavenge(thread);
+    }
+
+    ClassHeapStats* stats = ClassHeapStatsTestHelper::GetHeapStatsForCid(
+        isolate->class_table(), kArrayCid);
+    EXPECT_LE(
+        stats->post_gc.old_external_size + stats->recent.old_external_size,
+        heap->old_space()->ExternalInWords() * kWordSize);
+    EXPECT_LE(
+        stats->post_gc.new_external_size + stats->recent.new_external_size,
+        heap->new_space()->ExternalInWords() * kWordSize);
+  }
+}
+#endif  // !defined(PRODUCT)
+
 ISOLATE_UNIT_TEST_CASE(ArrayTruncationRaces) {
   // Alternate between allocating new lists and truncating.
   // For each list, the life cycle is
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index c246f43..03c9683 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -376,6 +376,7 @@
     }
   }
 
+  DART_FORCE_INLINE
   void MarkObject(RawObject* raw_obj) {
     // Fast exit if the raw object is immediate or in new space. No memory
     // access.
diff --git a/runtime/vm/heap/pages.cc b/runtime/vm/heap/pages.cc
index 4ba70ca..e1ac801 100644
--- a/runtime/vm/heap/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -548,6 +548,11 @@
       heap_->isolate()->class_table()->UpdateAllocatedExternalOld(cid, size));
 }
 
+void PageSpace::PromoteExternal(intptr_t cid, intptr_t size) {
+  intptr_t size_in_words = size >> kWordSizeLog2;
+  AtomicOperations::IncrementBy(&(usage_.external_in_words), size_in_words);
+}
+
 void PageSpace::FreeExternal(intptr_t size) {
   intptr_t size_in_words = size >> kWordSizeLog2;
   AtomicOperations::DecrementBy(&(usage_.external_in_words), size_in_words);
@@ -1274,36 +1279,28 @@
   }
 }
 
-uword PageSpace::TryAllocateDataBumpInternal(intptr_t size,
-                                             GrowthPolicy growth_policy,
-                                             bool is_locked) {
+uword PageSpace::TryAllocateDataBumpLocked(intptr_t size) {
   ASSERT(size >= kObjectAlignment);
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
   intptr_t remaining = bump_end_ - bump_top_;
-  if (remaining < size) {
+  if (UNLIKELY(remaining < size)) {
     // Checking this first would be logical, but needlessly slow.
     if (size >= kAllocatablePageSize) {
-      return is_locked ? TryAllocateDataLocked(size, growth_policy)
-                       : TryAllocate(size, HeapPage::kData, growth_policy);
+      return TryAllocateDataLocked(size, kForceGrowth);
     }
     FreeListElement* block =
-        is_locked ? freelist_[HeapPage::kData].TryAllocateLargeLocked(size)
-                  : freelist_[HeapPage::kData].TryAllocateLarge(size);
+        freelist_[HeapPage::kData].TryAllocateLargeLocked(size);
     if (block == NULL) {
       // Allocating from a new page (if growth policy allows) will have the
       // side-effect of populating the freelist with a large block. The next
       // bump allocation request will have a chance to consume that block.
       // TODO(koda): Could take freelist lock just once instead of twice.
-      return TryAllocateInFreshPage(size, HeapPage::kData, growth_policy,
-                                    is_locked);
+      return TryAllocateInFreshPage(size, HeapPage::kData, kForceGrowth,
+                                    true /* is_locked*/);
     }
     intptr_t block_size = block->HeapSize();
     if (remaining > 0) {
-      if (is_locked) {
-        freelist_[HeapPage::kData].FreeLocked(bump_top_, remaining);
-      } else {
-        freelist_[HeapPage::kData].Free(bump_top_, remaining);
-      }
+      freelist_[HeapPage::kData].FreeLocked(bump_top_, remaining);
     }
     bump_top_ = reinterpret_cast<uword>(block);
     bump_end_ = bump_top_ + block_size;
@@ -1312,8 +1309,11 @@
   ASSERT(remaining >= size);
   uword result = bump_top_;
   bump_top_ += size;
-  AtomicOperations::IncrementBy(&(usage_.used_in_words),
-                                (size >> kWordSizeLog2));
+
+  // No need for atomic operation: This is either running during a scavenge or
+  // isolate snapshot loading.
+  usage_.used_in_words += (size >> kWordSizeLog2);
+
 // Note: Remaining block is unwalkable until MakeIterable is called.
 #ifdef DEBUG
   if (bump_top_ < bump_end_) {
@@ -1325,28 +1325,17 @@
   return result;
 }
 
-uword PageSpace::TryAllocateDataBump(intptr_t size,
-                                     GrowthPolicy growth_policy) {
-  return TryAllocateDataBumpInternal(size, growth_policy, false);
-}
-
-uword PageSpace::TryAllocateDataBumpLocked(intptr_t size,
-                                           GrowthPolicy growth_policy) {
-  return TryAllocateDataBumpInternal(size, growth_policy, true);
-}
-
-uword PageSpace::TryAllocatePromoLocked(intptr_t size,
-                                        GrowthPolicy growth_policy) {
+uword PageSpace::TryAllocatePromoLocked(intptr_t size) {
   FreeList* freelist = &freelist_[HeapPage::kData];
   uword result = freelist->TryAllocateSmallLocked(size);
   if (result != 0) {
-    AtomicOperations::IncrementBy(&(usage_.used_in_words),
-                                  (size >> kWordSizeLog2));
+    // No need for atomic operation: we're at a safepoint.
+    usage_.used_in_words += (size >> kWordSizeLog2);
     return result;
   }
-  result = TryAllocateDataBumpLocked(size, growth_policy);
+  result = TryAllocateDataBumpLocked(size);
   if (result != 0) return result;
-  return TryAllocateDataLocked(size, growth_policy);
+  return TryAllocateDataLocked(size, PageSpace::kForceGrowth);
 }
 
 void PageSpace::SetupImagePage(void* pointer, uword size, bool is_executable) {
diff --git a/runtime/vm/heap/pages.h b/runtime/vm/heap/pages.h
index 321b0be..98d480f 100644
--- a/runtime/vm/heap/pages.h
+++ b/runtime/vm/heap/pages.h
@@ -360,6 +360,7 @@
   }
 
   void AllocateExternal(intptr_t cid, intptr_t size);
+  void PromoteExternal(intptr_t cid, intptr_t size);
   void FreeExternal(intptr_t size);
 
   // Bulk data allocation.
@@ -391,10 +392,9 @@
   void set_phase(Phase val) { phase_ = val; }
 
   // Attempt to allocate from bump block rather than normal freelist.
-  uword TryAllocateDataBump(intptr_t size, GrowthPolicy growth_policy);
-  uword TryAllocateDataBumpLocked(intptr_t size, GrowthPolicy growth_policy);
+  uword TryAllocateDataBumpLocked(intptr_t size);
   // Prefer small freelist blocks, then chip away at the bump block.
-  uword TryAllocatePromoLocked(intptr_t size, GrowthPolicy growth_policy);
+  uword TryAllocatePromoLocked(intptr_t size);
 
   void SetupImagePage(void* pointer, uword size, bool is_executable);
 
@@ -436,9 +436,6 @@
                                HeapPage::PageType type,
                                GrowthPolicy growth_policy,
                                bool is_locked);
-  uword TryAllocateDataBumpInternal(intptr_t size,
-                                    GrowthPolicy growth_policy,
-                                    bool is_locked);
   // Makes bump block walkable; do not call concurrently with mutator.
   void MakeIterable() const;
   HeapPage* AllocatePage(HeapPage::PageType type, bool link = true);
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index b6906ae..7abe066 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -135,14 +135,11 @@
       new_addr = ForwardedAddr(header);
     } else {
       intptr_t size = raw_obj->HeapSize();
-      NOT_IN_PRODUCT(intptr_t cid = raw_obj->GetClassId());
-      NOT_IN_PRODUCT(ClassTable* class_table = isolate()->class_table());
       // Check whether object should be promoted.
       if (scavenger_->survivor_end_ <= raw_addr) {
         // Not a survivor of a previous scavenge. Just copy the object into the
         // to space.
         new_addr = scavenger_->AllocateGC(size);
-        NOT_IN_PRODUCT(class_table->UpdateLiveNew(cid, size));
       } else {
         // TODO(iposva): Experiment with less aggressive promotion. For example
         // a coin toss determines if an object is promoted or whether it should
@@ -150,19 +147,16 @@
         //
         // This object is a survivor of a previous scavenge. Attempt to promote
         // the object.
-        new_addr =
-            page_space_->TryAllocatePromoLocked(size, PageSpace::kForceGrowth);
+        new_addr = page_space_->TryAllocatePromoLocked(size);
         if (new_addr != 0) {
           // If promotion succeeded then we need to remember it so that it can
           // be traversed later.
           scavenger_->PushToPromotedStack(new_addr);
           bytes_promoted_ += size;
-          NOT_IN_PRODUCT(class_table->UpdateAllocatedOld(cid, size));
         } else {
           // Promotion did not succeed. Copy into the to space instead.
           scavenger_->failed_to_promote_ = true;
           new_addr = scavenger_->AllocateGC(size);
-          NOT_IN_PRODUCT(class_table->UpdateLiveNew(cid, size));
         }
       }
       // During a scavenge we always succeed to at least copy all of the
@@ -646,18 +640,22 @@
 
 void Scavenger::ProcessToSpace(ScavengerVisitor* visitor) {
   Thread* thread = Thread::Current();
+  NOT_IN_PRODUCT(ClassTable* class_table = thread->isolate()->class_table());
 
   // Iterate until all work has been drained.
   while ((resolved_top_ < top_) || PromotedStackHasMore()) {
     while (resolved_top_ < top_) {
       RawObject* raw_obj = RawObject::FromAddr(resolved_top_);
       intptr_t class_id = raw_obj->GetClassId();
+      intptr_t size;
       if (class_id != kWeakPropertyCid) {
-        resolved_top_ += raw_obj->VisitPointersNonvirtual(visitor);
+        size = raw_obj->VisitPointersNonvirtual(visitor);
       } else {
         RawWeakProperty* raw_weak = reinterpret_cast<RawWeakProperty*>(raw_obj);
-        resolved_top_ += ProcessWeakProperty(raw_weak, visitor);
+        size = ProcessWeakProperty(raw_weak, visitor);
       }
+      NOT_IN_PRODUCT(class_table->UpdateLiveNewGC(class_id, size));
+      resolved_top_ += size;
     }
     {
       // Visit all the promoted objects and update/scavenge their internal
@@ -669,7 +667,12 @@
         // objects to be resolved in the to space.
         ASSERT(!raw_object->IsRemembered());
         visitor->VisitingOldObject(raw_object);
-        raw_object->VisitPointersNonvirtual(visitor);
+        intptr_t size = raw_object->VisitPointersNonvirtual(visitor);
+#if defined(PRODUCT)
+        USE(size);
+#else
+        class_table->UpdateAllocatedOldGC(raw_object->GetClassId(), size);
+#endif
         if (raw_object->IsMarked()) {
           // Complete our promise from ScavengePointer. Note that marker cannot
           // visit this object until it pops a block from the mark stack, which
diff --git a/runtime/vm/heap/scavenger.h b/runtime/vm/heap/scavenger.h
index 6867278..1a6fe0a 100644
--- a/runtime/vm/heap/scavenger.h
+++ b/runtime/vm/heap/scavenger.h
@@ -149,8 +149,6 @@
   uword TryAllocateInTLAB(Thread* thread, intptr_t size) {
     ASSERT(Utils::IsAligned(size, kObjectAlignment));
     ASSERT(heap_ != Dart::vm_isolate()->heap());
-    ASSERT(thread->IsMutatorThread());
-    ASSERT(thread->isolate()->IsMutatorThreadScheduled());
     uword top = thread->top();
     uword end = thread->end();
     uword result = top;
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 838e2b7..88e6bb9 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -331,9 +331,9 @@
     uword start = reinterpret_cast<uword>(obj.raw()) - kHeapObjectTag;
     uword end = start + obj.raw()->HeapSize();
 
-    // Write object header with the mark and VM heap bits set.
+    // Write object header with the mark and read-only bits set.
     uword marked_tags = obj.raw()->ptr()->tags_;
-    marked_tags = RawObject::VMHeapObjectTag::update(true, marked_tags);
+    marked_tags = RawObject::ReadOnlyBit::update(true, marked_tags);
     marked_tags = RawObject::OldBit::update(true, marked_tags);
     marked_tags = RawObject::OldAndNotMarkedBit::update(false, marked_tags);
     marked_tags = RawObject::OldAndNotRememberedBit::update(true, marked_tags);
@@ -482,9 +482,9 @@
       uword beginning = reinterpret_cast<uword>(insns.raw_ptr());
       uword entry = beginning + Instructions::HeaderSize();
 
-      // Write Instructions with the mark and VM heap bits set.
+      // Write Instructions with the mark and read-only bits set.
       uword marked_tags = insns.raw_ptr()->tags_;
-      marked_tags = RawObject::VMHeapObjectTag::update(true, marked_tags);
+      marked_tags = RawObject::ReadOnlyBit::update(true, marked_tags);
       marked_tags = RawObject::OldBit::update(true, marked_tags);
       marked_tags = RawObject::OldAndNotMarkedBit::update(false, marked_tags);
       marked_tags =
@@ -732,9 +732,9 @@
     ASSERT(Utils::IsAligned(beginning, sizeof(uword)));
     ASSERT(Utils::IsAligned(entry, sizeof(uword)));
 
-    // Write Instructions with the mark and VM heap bits set.
+    // Write Instructions with the mark and read-only bits set.
     uword marked_tags = insns.raw_ptr()->tags_;
-    marked_tags = RawObject::VMHeapObjectTag::update(true, marked_tags);
+    marked_tags = RawObject::ReadOnlyBit::update(true, marked_tags);
     marked_tags = RawObject::OldBit::update(true, marked_tags);
     marked_tags = RawObject::OldAndNotMarkedBit::update(false, marked_tags);
     marked_tags = RawObject::OldAndNotRememberedBit::update(true, marked_tags);
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index 1500348..49a8ddc 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -162,6 +162,51 @@
     ASSERT(GetClassId(FP[kKBCPcMarkerSlotFromFp]) == kBytecodeCid);
     return static_cast<RawBytecode*>(FP[kKBCPcMarkerSlotFromFp]);
   }
+
+  DART_FORCE_INLINE static bool FieldNeedsGuardUpdate(RawField* field,
+                                                      RawObject* value) {
+    // The interpreter should never see a cloned field.
+    ASSERT(field->ptr()->owner_->GetClassId() != kFieldCid);
+
+    const classid_t guarded_cid = field->ptr()->guarded_cid_;
+
+    if (guarded_cid == kDynamicCid) {
+      // Field is not guarded.
+      return false;
+    }
+
+    const classid_t nullability_cid = field->ptr()->is_nullable_;
+    const classid_t value_cid = InterpreterHelpers::GetClassId(value);
+
+    if (nullability_cid == value_cid) {
+      // Storing null into a nullable field.
+      return false;
+    }
+
+    if (guarded_cid != value_cid) {
+      // First assignment (guarded_cid == kIllegalCid) or
+      // field no longer monomorphic or
+      // field has become nullable.
+      return true;
+    }
+
+    intptr_t guarded_list_length =
+        Smi::Value(field->ptr()->guarded_list_length_);
+
+    if (UNLIKELY(guarded_list_length >= Field::kUnknownFixedLength)) {
+      // Guarding length, check this in the runtime.
+      return true;
+    }
+
+    if (UNLIKELY(field->ptr()->static_type_exactness_state_ >=
+                 StaticTypeExactnessState::Uninitialized().Encode())) {
+      // Guarding "exactness", check this in the runtime.
+      return true;
+    }
+
+    // Everything matches.
+    return false;
+  }
 };
 
 DART_FORCE_INLINE static uint32_t* SavedCallerPC(RawObject** FP) {
@@ -237,6 +282,10 @@
 
 Interpreter::Interpreter()
     : stack_(NULL), fp_(NULL), pp_(NULL), argdesc_(NULL), lookup_cache_() {
+#if defined(TARGET_ARCH_DBC)
+  FATAL("Interpreter is not supported when targeting DBC\n");
+#endif  // defined(USING_SIMULATOR) || defined(TARGET_ARCH_DBC)
+
   // Setup interpreter support first. Some of this information is needed to
   // setup the architecture state.
   // We allocate the stack here, the size is computed as the sum of
@@ -244,7 +293,7 @@
   // handling stack overflow exceptions. To be safe in potential
   // stack underflows we also add some underflow buffer space.
   stack_ = new uintptr_t[(OSThread::GetSpecifiedStackSize() +
-                          OSThread::kStackSizeBuffer +
+                          OSThread::kStackSizeBufferMax +
                           kInterpreterStackUnderflowSize) /
                          sizeof(uintptr_t)];
   // Low address.
@@ -253,7 +302,7 @@
   // Limit for StackOverflowError.
   overflow_stack_limit_ = stack_base_ + OSThread::GetSpecifiedStackSize();
   // High address.
-  stack_limit_ = overflow_stack_limit_ + OSThread::kStackSizeBuffer;
+  stack_limit_ = overflow_stack_limit_ + OSThread::kStackSizeBufferMax;
 
   last_setjmp_buffer_ = NULL;
 
@@ -438,10 +487,6 @@
                                                uint32_t** pc,
                                                RawObject*** FP,
                                                RawObject*** SP) {
-#if defined(USING_SIMULATOR) || defined(TARGET_ARCH_DBC)
-  // TODO(regis): Revisit.
-  UNIMPLEMENTED();
-#endif
   ASSERT(Function::HasCode(function));
   RawCode* volatile code = function->ptr()->code_;
   ASSERT(code != StubCode::LazyCompile().raw());
@@ -462,7 +507,19 @@
   {
     InterpreterSetjmpBuffer buffer(this);
     if (!setjmp(buffer.buffer_)) {
+#if defined(TARGET_ARCH_DBC)
+      USE(entrypoint);
+      UNIMPLEMENTED();
+#elif defined(USING_SIMULATOR)
+      result = bit_copy<RawObject*, int64_t>(
+          Simulator::Current()->Call(reinterpret_cast<intptr_t>(entrypoint),
+                                     reinterpret_cast<intptr_t>(code),
+                                     reinterpret_cast<intptr_t>(argdesc_),
+                                     reinterpret_cast<intptr_t>(call_base),
+                                     reinterpret_cast<intptr_t>(thread)));
+#else
       result = entrypoint(code, argdesc_, call_base, thread);
+#endif
       thread->set_top_exit_frame_info(0);
       ASSERT(thread->vm_tag() == VMTag::kDartInterpretedTagId);
       ASSERT(thread->execution_state() == Thread::kThreadInGenerated);
@@ -597,35 +654,20 @@
         instance = reinterpret_cast<RawInstance*>(call_base[0]);
         value = call_base[1];
       }
-      if (thread->isolate()->use_field_guards()) {
-        // Check value cid according to field.guarded_cid().
-        // The interpreter should never see a cloned field.
-        ASSERT(field->ptr()->owner_->GetClassId() != kFieldCid);
-        const classid_t field_guarded_cid = field->ptr()->guarded_cid_;
-        const classid_t field_nullability_cid = field->ptr()->is_nullable_;
-        const classid_t value_cid = InterpreterHelpers::GetClassId(value);
-        if (value_cid != field_guarded_cid &&
-            value_cid != field_nullability_cid) {
-          if (Smi::Value(field->ptr()->guarded_list_length_) <
-                  Field::kUnknownFixedLength &&
-              field_guarded_cid == kIllegalCid) {
-            field->ptr()->guarded_cid_ = value_cid;
-            field->ptr()->is_nullable_ = value_cid;
-          } else if (field_guarded_cid != kDynamicCid) {
-            call_top[1] = 0;  // Unused result of runtime call.
-            call_top[2] = field;
-            call_top[3] = value;
-            Exit(thread, *FP, call_top + 4, *pc);
-            NativeArguments native_args(thread, 2, call_top + 2, call_top + 1);
-            if (!InvokeRuntime(thread, this, DRT_UpdateFieldCid, native_args)) {
-              *invoked = true;
-              return false;
-            }
-            // Reload objects after the call which may trigger GC.
-            instance = reinterpret_cast<RawInstance*>(call_base[0]);
-            value = call_base[1];
-          }
+      if (thread->isolate()->use_field_guards() &&
+          InterpreterHelpers::FieldNeedsGuardUpdate(field, value)) {
+        call_top[1] = 0;  // Unused result of runtime call.
+        call_top[2] = field;
+        call_top[3] = value;
+        Exit(thread, *FP, call_top + 4, *pc);
+        NativeArguments native_args(thread, 2, call_top + 2, call_top + 1);
+        if (!InvokeRuntime(thread, this, DRT_UpdateFieldCid, native_args)) {
+          *invoked = true;
+          return false;
         }
+        // Reload objects after the call which may trigger GC.
+        instance = reinterpret_cast<RawInstance*>(call_base[0]);
+        value = call_base[1];
       }
       instance->StorePointer(
           reinterpret_cast<RawObject**>(instance->ptr()) + offset_in_words,
@@ -831,7 +873,12 @@
                                   RawObject** SP) {
   RawObject** result = top;
   top[0] = 0;  // Clean up result slot.
-  RawObject** miss_handler_args = top + 1;
+
+  // Save arguments descriptor as it may be clobbered by running Dart code
+  // during the call to miss handler (class finalization).
+  top[1] = argdesc_;
+
+  RawObject** miss_handler_args = top + 2;
   for (intptr_t i = 0; i < checked_args; i++) {
     miss_handler_args[i] = args[i];
   }
@@ -856,6 +903,8 @@
   NativeArguments native_args(thread, miss_handler_argc, miss_handler_args,
                               result);
   handler(native_args);
+
+  argdesc_ = Array::RawCast(top[1]);
 }
 
 DART_FORCE_INLINE bool Interpreter::InterfaceCall(Thread* thread,
@@ -2178,14 +2227,28 @@
 
   {
     BYTECODE(StoreFieldTOS, __D);
-    const uword offset_in_words =
-        static_cast<uword>(Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD))));
+    RawField* field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
     RawInstance* instance = reinterpret_cast<RawInstance*>(SP[-1]);
     RawObject* value = reinterpret_cast<RawObject*>(SP[0]);
     SP -= 2;  // Drop instance and value.
+    intptr_t offset_in_words = Smi::Value(field->ptr()->value_.offset_);
 
-    // TODO(regis): Implement cid guard.
-    ASSERT(!thread->isolate()->use_field_guards());
+    if (thread->isolate()->use_field_guards() &&
+        InterpreterHelpers::FieldNeedsGuardUpdate(field, value)) {
+      SP[1] = instance;  // Preserve.
+      SP[2] = 0;         // Unused result of runtime call.
+      SP[3] = field;
+      SP[4] = value;
+      Exit(thread, FP, SP + 5, pc);
+      NativeArguments args(thread, 2, /* argv */ SP + 3, /* retval */ SP + 2);
+      if (!InvokeRuntime(thread, this, DRT_UpdateFieldCid, args)) {
+        HANDLE_EXCEPTION;
+      }
+
+      // Reload objects after the call which may trigger GC.
+      instance = reinterpret_cast<RawInstance*>(SP[1]);
+      value = SP[4];
+    }
 
     instance->StorePointer(
         reinterpret_cast<RawObject**>(instance->ptr()) + offset_in_words, value,
diff --git a/runtime/vm/json_test.cc b/runtime/vm/json_test.cc
index c42d2e6..1746328 100644
--- a/runtime/vm/json_test.cc
+++ b/runtime/vm/json_test.cc
@@ -218,26 +218,35 @@
   Dart_Handle result;
   TransitionNativeToVM transition1(thread);
   String& obj = String::Handle();
-  TransitionVMToNative transition2(thread);
 
-  {
-    result = Dart_GetField(lib, NewString("ascii"));
-    EXPECT_VALID(result);
+  auto do_test = [&](const char* field_name, const char* expected) {
+    {
+      TransitionVMToNative to_native(thread);
+      result = Dart_GetField(lib, NewString(field_name));
+      EXPECT_VALID(result);
+    }
+
     obj ^= Api::UnwrapHandle(result);
 
-    JSONStream js;
     {
-      JSONObject jsobj(&js);
-      EXPECT(!jsobj.AddPropertyStr("ascii", obj));
+      JSONStream js;
+      {
+        JSONObject jsobj(&js);
+        EXPECT(!jsobj.AddPropertyStr(field_name, obj));
+      }
+      EXPECT_STREQ(expected, js.ToCString());
     }
-    EXPECT_STREQ("{\"ascii\":\"Hello, World!\"}", js.ToCString());
+  };
+
+  {
+    TransitionVMToNative to_native(thread);
+    result = Dart_GetField(lib, NewString("ascii"));
+    EXPECT_VALID(result);
   }
 
-  {
-    result = Dart_GetField(lib, NewString("ascii"));
-    EXPECT_VALID(result);
-    obj ^= Api::UnwrapHandle(result);
+  obj ^= Api::UnwrapHandle(result);
 
+  {
     JSONStream js;
     {
       JSONObject jsobj(&js);
@@ -246,58 +255,11 @@
     EXPECT_STREQ("{\"subrange\":\"ello\"}", js.ToCString());
   }
 
-  {
-    result = Dart_GetField(lib, NewString("unicode"));
-    EXPECT_VALID(result);
-    obj ^= Api::UnwrapHandle(result);
-
-    JSONStream js;
-    {
-      JSONObject jsobj(&js);
-      EXPECT(!jsobj.AddPropertyStr("unicode", obj));
-    }
-    EXPECT_STREQ("{\"unicode\":\"Îñţérñåţîöñåļîžåţîờñ\"}", js.ToCString());
-  }
-
-  {
-    result = Dart_GetField(lib, NewString("surrogates"));
-    EXPECT_VALID(result);
-    obj ^= Api::UnwrapHandle(result);
-
-    JSONStream js;
-    {
-      JSONObject jsobj(&js);
-      EXPECT(!jsobj.AddPropertyStr("surrogates", obj));
-    }
-    EXPECT_STREQ("{\"surrogates\":\"𝄞𝄞𝄞𝄞𝄞\"}", js.ToCString());
-  }
-
-  {
-    result = Dart_GetField(lib, NewString("wrongEncoding"));
-    EXPECT_VALID(result);
-    obj ^= Api::UnwrapHandle(result);
-
-    JSONStream js;
-    {
-      JSONObject jsobj(&js);
-      EXPECT(!jsobj.AddPropertyStr("wrongEncoding", obj));
-    }
-    EXPECT_STREQ("{\"wrongEncoding\":\"𝄞\\uD834𝄞\"}", js.ToCString());
-  }
-
-  {
-    result = Dart_GetField(lib, NewString("nullInMiddle"));
-    EXPECT_VALID(result);
-    obj ^= Api::UnwrapHandle(result);
-
-    JSONStream js;
-    {
-      JSONObject jsobj(&js);
-      EXPECT(!jsobj.AddPropertyStr("nullInMiddle", obj));
-    }
-    EXPECT_STREQ("{\"nullInMiddle\":\"This has\\u0000 four words.\"}",
-                 js.ToCString());
-  }
+  do_test("ascii", "{\"ascii\":\"Hello, World!\"}");
+  do_test("unicode", "{\"unicode\":\"Îñţérñåţîöñåļîžåţîờñ\"}");
+  do_test("surrogates", "{\"surrogates\":\"𝄞𝄞𝄞𝄞𝄞\"}");
+  do_test("wrongEncoding", "{\"wrongEncoding\":\"𝄞\\uD834𝄞\"}");
+  do_test("nullInMiddle", "{\"nullInMiddle\":\"This has\\u0000 four words.\"}");
 }
 
 TEST_CASE(JSON_JSONStream_Params) {
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
index 2dd239e..0824578 100644
--- a/runtime/vm/kernel_binary.cc
+++ b/runtime/vm/kernel_binary.cc
@@ -68,7 +68,8 @@
   }
 
   uint32_t formatVersion = reader->ReadUInt32();
-  if (formatVersion != kBinaryFormatVersion) {
+  if ((formatVersion < kMinSupportedKernelFormatVersion) ||
+      (formatVersion > kMaxSupportedKernelFormatVersion)) {
     if (error != nullptr) {
       *error = kKernelInvalidBinaryFormatVersion;
     }
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 85ed239..7129b5f 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -17,7 +17,10 @@
 // package:kernel/binary.md.
 
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
-static const uint32_t kBinaryFormatVersion = 18;
+
+// Both version numbers are inclusive.
+static const uint32_t kMinSupportedKernelFormatVersion = 18;
+static const uint32_t kMaxSupportedKernelFormatVersion = 20;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
@@ -77,6 +80,7 @@
   V(AwaitExpression, 51)                                                       \
   V(FunctionExpression, 52)                                                    \
   V(Let, 53)                                                                   \
+  V(BlockExpression, 82)                                                       \
   V(Instantiation, 54)                                                         \
   V(PositiveIntLiteral, 55)                                                    \
   V(NegativeIntLiteral, 56)                                                    \
@@ -143,6 +147,7 @@
   kSymbolConstant = 5,
   kMapConstant = 6,
   kListConstant = 7,
+  kSetConstant = 13,
   kInstanceConstant = 8,
   kPartialInstantiationConstant = 9,
   kTearOffConstant = 10,
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 9817832..d962d85 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -283,6 +283,24 @@
   subprogram_file_starts->Reverse();
 }
 
+RawString* KernelLoader::FindSourceForScript(const uint8_t* kernel_buffer,
+                                             intptr_t kernel_buffer_length,
+                                             const String& uri) {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  TranslationHelper translation_helper(thread);
+  KernelReaderHelper reader(zone, &translation_helper, kernel_buffer,
+                            kernel_buffer_length, 0);
+  intptr_t source_table_size = reader.SourceTableSize();
+  for (intptr_t i = 0; i < source_table_size; ++i) {
+    const String& source_uri = reader.SourceTableUriFor(i);
+    if (source_uri.EndsWith(uri)) {
+      return reader.GetSourceFor(i).raw();
+    }
+  }
+  return String::null();
+}
+
 void KernelLoader::InitializeFields() {
   const intptr_t source_table_size = helper_.SourceTableSize();
   const Array& scripts =
@@ -572,7 +590,9 @@
   Instance& constant = Instance::Handle(Z);
   String& uri_path = String::Handle(Z);
   Library& library = Library::Handle(Z);
+#if !defined(DART_PRECOMPILER)
   Object& result = Object::Handle(Z);
+#endif
 
   for (intptr_t i = 0; i < length; ++i) {
     library ^= potential_extension_libraries_.At(i);
@@ -603,6 +623,7 @@
 
       if (uri_path.IsNull()) continue;
 
+#if !defined(DART_PRECOMPILER)
       if (!I->HasTagHandler()) {
         H.ReportError("no library handler registered.");
       }
@@ -614,6 +635,16 @@
       if (result.IsError()) {
         H.ReportError(Error::Cast(result), "library handler failed");
       }
+#endif
+
+      // Create a dummy library and add it as an import to the current library.
+      // This allows later to discover and reload this native extension, e.g.
+      // when running from an app-jit snapshot.
+      // See Loader::ReloadNativeExtensions(...) which relies on
+      // Dart_GetImportsOfScheme('dart-ext').
+      const auto& native_library = Library::Handle(Library::New(uri_path));
+      library.AddImport(Namespace::Handle(Namespace::New(
+          native_library, Array::null_array(), Array::null_array())));
     }
   }
   potential_extension_libraries_ = GrowableObjectArray::null();
@@ -914,11 +945,12 @@
     loading_native_wrappers_library_ = false;
     library.SetLoadInProgress();
   }
+
   StringIndex import_uri_index =
       H.CanonicalNameString(library_helper.canonical_name_);
   library_helper.ReadUntilIncluding(LibraryHelper::kSourceUriIndex);
   const Script& script = Script::Handle(
-      Z, ScriptAt(library_helper.source_uri_index_, import_uri_index));
+      Z, ScriptAt(library_helper.source_uri_index_, library, import_uri_index));
 
   library_helper.ReadUntilExcluding(LibraryHelper::kAnnotations);
   intptr_t annotations_kernel_offset =
@@ -1299,10 +1331,10 @@
       String& tmp = String::Handle(zone_);
       url = String::SubString(url, pos + 1);
       if (inside_runtime_lib) {
-        tmp = String::New("runtime/lib", Heap::kNew);
+        tmp = String::New(kRuntimeLib, Heap::kNew);
         url = String::Concat(tmp, url);
       } else if (inside_runtime_bin) {
-        tmp = String::New("runtime/bin", Heap::kNew);
+        tmp = String::New(kRuntimeBin, Heap::kNew);
         url = String::Concat(tmp, url);
       }
       tmp = library.url();
@@ -1925,14 +1957,18 @@
   return script.raw();
 }
 
-RawScript* KernelLoader::ScriptAt(intptr_t index, StringIndex import_uri) {
-  if (import_uri != -1) {
-    const Script& script =
-        Script::Handle(Z, kernel_program_info_.ScriptAt(index));
+RawScript* KernelLoader::ScriptAt(intptr_t index,
+                                  const Library& library,
+                                  StringIndex import_uri) {
+  ASSERT(!library.IsNull());
+  const Script& script =
+      Script::Handle(Z, kernel_program_info_.ScriptAt(index));
+  if (library.is_dart_scheme()) {
+    FixCoreLibraryScriptUri(library, script);
+  } else if (import_uri != -1) {
     script.set_url(H.DartString(import_uri, Heap::kOld));
-    return script.raw();
   }
-  return kernel_program_info_.ScriptAt(index);
+  return script.raw();
 }
 
 void KernelLoader::GenerateFieldAccessors(const Class& klass,
@@ -2173,8 +2209,8 @@
 RawFunction* CreateFieldInitializerFunction(Thread* thread,
                                             Zone* zone,
                                             const Field& field) {
-  if (field.Initializer() != Function::null()) {
-    return field.Initializer();
+  if (field.InitializerFunction() != Function::null()) {
+    return field.InitializerFunction();
   }
   String& init_name = String::Handle(zone, field.name());
   init_name = Symbols::FromConcat(thread, Symbols::InitPrefix(), init_name);
@@ -2212,7 +2248,7 @@
   initializer_fun.set_is_inlinable(false);
   initializer_fun.set_token_pos(field.token_pos());
   initializer_fun.set_end_token_pos(field.end_token_pos());
-  field.SetInitializer(initializer_fun);
+  field.SetInitializerFunction(initializer_fun);
   return initializer_fun.raw();
 }
 
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index 6554706..9b176ff 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -176,6 +176,10 @@
                                     intptr_t* p_num_classes,
                                     intptr_t* p_num_procedures);
 
+  static RawString* FindSourceForScript(const uint8_t* kernel_buffer,
+                                        intptr_t kernel_buffer_length,
+                                        const String& url);
+
   RawLibrary* LoadLibrary(intptr_t index);
 
   void FinishTopLevelClassLoading(const Class& toplevel_class,
@@ -290,8 +294,12 @@
   // for klass whose script corresponds to the uri index.
   // Otherwise return klass.
   const Object& ClassForScriptAt(const Class& klass, intptr_t source_uri_index);
+  RawScript* ScriptAt(intptr_t source_uri_index) {
+    return kernel_program_info_.ScriptAt(source_uri_index);
+  }
   RawScript* ScriptAt(intptr_t source_uri_index,
-                      StringIndex import_uri = StringIndex());
+                      const Library& lib,
+                      StringIndex import_uri);
 
   void GenerateFieldAccessors(const Class& klass,
                               const Field& field,
diff --git a/runtime/vm/malloc_hooks_jemalloc.cc b/runtime/vm/malloc_hooks_jemalloc.cc
deleted file mode 100644
index 2eb1b94..0000000
--- a/runtime/vm/malloc_hooks_jemalloc.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "platform/globals.h"
-#if defined(DART_USE_JEMALLOC) && !defined(PRODUCT)
-
-#include "vm/malloc_hooks.h"
-
-#include <jemalloc/jemalloc.h>
-
-#include "vm/json_stream.h"
-
-namespace dart {
-
-void MallocHooks::Init() {
-  // Do nothing.
-}
-
-void MallocHooks::Cleanup() {
-  // Do nothing.
-}
-
-void MallocHooks::PrintToJSONObject(JSONObject* jsobj) {
-  // Here, we ignore the value of FLAG_profiler_native_memory because we can
-  // gather this information cheaply without hooking into every call to the
-  // malloc library.
-  jsobj->AddProperty("_heapAllocatedMemoryUsage",
-                     heap_allocated_memory_in_bytes());
-  jsobj->AddProperty("_heapAllocationCount", allocation_count());
-}
-
-intptr_t MallocHooks::heap_allocated_memory_in_bytes() {
-  uint64_t epoch = 1;
-  size_t epoch_sz = sizeof(epoch);
-  int result = mallctl("epoch", &epoch, &epoch_sz, &epoch, epoch_sz);
-  if (result != 0) {
-    return 0;
-  }
-
-  intptr_t allocated;
-  size_t allocated_sz = sizeof(allocated);
-  result = mallctl("stats.allocated", &allocated, &allocated_sz, NULL, 0);
-  if (result != 0) {
-    return 0;
-  }
-  return allocated;
-}
-
-intptr_t MallocHooks::allocation_count() {
-  return 0;
-}
-
-bool MallocHooks::ProfilingEnabled() {
-  return false;
-}
-
-bool MallocHooks::stack_trace_collection_enabled() {
-  return false;
-}
-
-void MallocHooks::set_stack_trace_collection_enabled(bool enabled) {
-  // Do nothing.
-}
-
-void MallocHooks::ResetStats() {
-  // Do nothing.
-}
-
-bool MallocHooks::Active() {
-  return false;
-}
-
-Sample* MallocHooks::GetSample(const void* ptr) {
-  return NULL;
-}
-
-}  // namespace dart
-
-#endif  // defined(DART_USE_JEMALLOC) && ...
diff --git a/runtime/vm/malloc_hooks_unsupported.cc b/runtime/vm/malloc_hooks_unsupported.cc
index e37ca80..b08d138 100644
--- a/runtime/vm/malloc_hooks_unsupported.cc
+++ b/runtime/vm/malloc_hooks_unsupported.cc
@@ -4,8 +4,7 @@
 
 #include "platform/globals.h"
 
-#if (!defined(DART_USE_TCMALLOC) && !defined(DART_USE_JEMALLOC)) ||            \
-    defined(PRODUCT)
+#if defined(PRODUCT) || !defined(DART_USE_TCMALLOC)
 
 #include "vm/malloc_hooks.h"
 
diff --git a/runtime/vm/message.cc b/runtime/vm/message.cc
index 82816de..7af0251 100644
--- a/runtime/vm/message.cc
+++ b/runtime/vm/message.cc
@@ -40,7 +40,7 @@
       snapshot_length_(0),
       finalizable_data_(NULL),
       priority_(priority) {
-  ASSERT(!raw_obj->IsHeapObject() || raw_obj->IsVMHeapObject());
+  ASSERT(!raw_obj->IsHeapObject() || raw_obj->IsReadOnly());
   ASSERT((priority == kNormalPriority) ||
          (delivery_failure_port == kIllegalPort));
   ASSERT(IsRaw());
diff --git a/runtime/vm/native_api_impl.cc b/runtime/vm/native_api_impl.cc
index 6f12a68..92192fd 100644
--- a/runtime/vm/native_api_impl.cc
+++ b/runtime/vm/native_api_impl.cc
@@ -185,7 +185,7 @@
   DARTSCOPE(Thread::Current());
   API_TIMELINE_DURATION(T);
   Dart_Handle result = Api::CheckAndFinalizePendingClasses(T);
-  if (::Dart_IsError(result)) {
+  if (Api::IsError(result)) {
     return result;
   }
   CHECK_CALLBACK_STATE(T);
@@ -205,7 +205,7 @@
   DARTSCOPE(Thread::Current());
   API_TIMELINE_DURATION(T);
   Dart_Handle result = Api::CheckAndFinalizePendingClasses(T);
-  if (::Dart_IsError(result)) {
+  if (Api::IsError(result)) {
     return result;
   }
   CHECK_CALLBACK_STATE(T);
diff --git a/runtime/vm/native_arguments.h b/runtime/vm/native_arguments.h
index 86d7be5..7c637b3 100644
--- a/runtime/vm/native_arguments.h
+++ b/runtime/vm/native_arguments.h
@@ -158,7 +158,12 @@
     return type_args.TypeAt(index);
   }
 
-  void SetReturn(const Object& value) const { *retval_ = value.raw(); }
+  RawObject** ReturnValueAddress() const { return retval_; }
+
+  void SetReturn(const Object& value) const {
+    ASSERT(thread_->execution_state() == Thread::kThreadInVM);
+    *retval_ = value.raw();
+  }
 
   RawObject* ReturnValue() const {
     // Tell MemorySanitizer the retval_ was initialized (by generated code).
@@ -250,7 +255,10 @@
   // exceedingly careful when we use it.  If there are any other side
   // effects in the statement that may cause GC, it could lead to
   // bugs.
-  void SetReturnUnsafe(RawObject* value) const { *retval_ = value; }
+  void SetReturnUnsafe(RawObject* value) const {
+    ASSERT(thread_->execution_state() == Thread::kThreadInVM);
+    *retval_ = value;
+  }
 
   // Returns true if the arguments are those of an instance function call.
   bool ToInstanceFunction() const {
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 318379e..864555d 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -456,7 +456,7 @@
     uword address = heap->Allocate(Instance::InstanceSize(), Heap::kOld);
     null_ = reinterpret_cast<RawInstance*>(address + kHeapObjectTag);
     // The call below is using 'null_' to initialize itself.
-    InitializeObject(address, kNullCid, Instance::InstanceSize(), true);
+    InitializeObject(address, kNullCid, Instance::InstanceSize());
   }
 }
 
@@ -502,7 +502,7 @@
     intptr_t size = Class::InstanceSize();
     uword address = heap->Allocate(size, Heap::kOld);
     class_class_ = reinterpret_cast<RawClass*>(address + kHeapObjectTag);
-    InitializeObject(address, Class::kClassId, size, true);
+    InitializeObject(address, Class::kClassId, size);
 
     Class fake;
     // Initialization from Class::New<Class>.
@@ -701,7 +701,7 @@
   // Allocate and initialize the empty_array instance.
   {
     uword address = heap->Allocate(Array::InstanceSize(0), Heap::kOld);
-    InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(0), true);
+    InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(0));
     Array::initializeHandle(
         empty_array_, reinterpret_cast<RawArray*>(address + kHeapObjectTag));
     empty_array_->StoreSmi(&empty_array_->raw_ptr()->length_, Smi::New(0));
@@ -712,7 +712,7 @@
   // Allocate and initialize the zero_array instance.
   {
     uword address = heap->Allocate(Array::InstanceSize(1), Heap::kOld);
-    InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(1), true);
+    InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(1));
     Array::initializeHandle(
         zero_array_, reinterpret_cast<RawArray*>(address + kHeapObjectTag));
     zero_array_->StoreSmi(&zero_array_->raw_ptr()->length_, Smi::New(1));
@@ -724,8 +724,7 @@
   // Allocate and initialize the canonical empty context scope object.
   {
     uword address = heap->Allocate(ContextScope::InstanceSize(0), Heap::kOld);
-    InitializeObject(address, kContextScopeCid, ContextScope::InstanceSize(0),
-                     true);
+    InitializeObject(address, kContextScopeCid, ContextScope::InstanceSize(0));
     ContextScope::initializeHandle(
         empty_context_scope_,
         reinterpret_cast<RawContextScope*>(address + kHeapObjectTag));
@@ -739,8 +738,7 @@
   // Allocate and initialize the canonical empty object pool object.
   {
     uword address = heap->Allocate(ObjectPool::InstanceSize(0), Heap::kOld);
-    InitializeObject(address, kObjectPoolCid, ObjectPool::InstanceSize(0),
-                     true);
+    InitializeObject(address, kObjectPoolCid, ObjectPool::InstanceSize(0));
     ObjectPool::initializeHandle(
         empty_object_pool_,
         reinterpret_cast<RawObjectPool*>(address + kHeapObjectTag));
@@ -752,8 +750,8 @@
   // Allocate and initialize the empty_descriptors instance.
   {
     uword address = heap->Allocate(PcDescriptors::InstanceSize(0), Heap::kOld);
-    InitializeObject(address, kPcDescriptorsCid, PcDescriptors::InstanceSize(0),
-                     true);
+    InitializeObject(address, kPcDescriptorsCid,
+                     PcDescriptors::InstanceSize(0));
     PcDescriptors::initializeHandle(
         empty_descriptors_,
         reinterpret_cast<RawPcDescriptors*>(address + kHeapObjectTag));
@@ -767,7 +765,7 @@
     uword address =
         heap->Allocate(LocalVarDescriptors::InstanceSize(0), Heap::kOld);
     InitializeObject(address, kLocalVarDescriptorsCid,
-                     LocalVarDescriptors::InstanceSize(0), true);
+                     LocalVarDescriptors::InstanceSize(0));
     LocalVarDescriptors::initializeHandle(
         empty_var_descriptors_,
         reinterpret_cast<RawLocalVarDescriptors*>(address + kHeapObjectTag));
@@ -783,7 +781,7 @@
     uword address =
         heap->Allocate(ExceptionHandlers::InstanceSize(0), Heap::kOld);
     InitializeObject(address, kExceptionHandlersCid,
-                     ExceptionHandlers::InstanceSize(0), true);
+                     ExceptionHandlers::InstanceSize(0));
     ExceptionHandlers::initializeHandle(
         empty_exception_handlers_,
         reinterpret_cast<RawExceptionHandlers*>(address + kHeapObjectTag));
@@ -795,8 +793,8 @@
   // Allocate and initialize the canonical empty type arguments object.
   {
     uword address = heap->Allocate(TypeArguments::InstanceSize(0), Heap::kOld);
-    InitializeObject(address, kTypeArgumentsCid, TypeArguments::InstanceSize(0),
-                     true);
+    InitializeObject(address, kTypeArgumentsCid,
+                     TypeArguments::InstanceSize(0));
     TypeArguments::initializeHandle(
         empty_type_arguments_,
         reinterpret_cast<RawTypeArguments*>(address + kHeapObjectTag));
@@ -1009,8 +1007,8 @@
     // No forwarding corpses in the VM isolate.
     ASSERT(!obj->IsForwardingCorpse());
     if (!obj->IsFreeListElement()) {
-      ASSERT(obj->IsVMHeapObject());
       obj->SetMarkBitUnsynchronized();
+      obj->SetReadOnlyUnsynchronized();
       Object::FinalizeReadOnlyObject(obj);
 #if defined(HASH_IN_OBJECT_HEADER)
       // These objects end up in the read-only VM isolate which is shared
@@ -1200,8 +1198,7 @@
           reinterpret_cast<RawTypedData*>(RawObject::FromAddr(addr));
       uword new_tags = RawObject::ClassIdTag::update(kTypedDataInt8ArrayCid, 0);
       new_tags = RawObject::SizeTag::update(leftover_size, new_tags);
-      new_tags = RawObject::VMHeapObjectTag::update(obj.raw()->IsVMHeapObject(),
-                                                    new_tags);
+      new_tags = RawObject::ReadOnlyBit::update(false, new_tags);
       const bool is_old = obj.raw()->IsOldObject();
       new_tags = RawObject::OldBit::update(is_old, new_tags);
       new_tags = RawObject::OldAndNotMarkedBit::update(is_old, new_tags);
@@ -1232,8 +1229,7 @@
       RawObject* raw = reinterpret_cast<RawObject*>(RawObject::FromAddr(addr));
       uword new_tags = RawObject::ClassIdTag::update(kInstanceCid, 0);
       new_tags = RawObject::SizeTag::update(leftover_size, new_tags);
-      new_tags = RawObject::VMHeapObjectTag::update(obj.raw()->IsVMHeapObject(),
-                                                    new_tags);
+      new_tags = RawObject::ReadOnlyBit::update(false, new_tags);
       const bool is_old = obj.raw()->IsOldObject();
       new_tags = RawObject::OldBit::update(is_old, new_tags);
       new_tags = RawObject::OldAndNotMarkedBit::update(is_old, new_tags);
@@ -2016,12 +2012,12 @@
 }
 
 #if defined(DEBUG)
-bool Object::InVMHeap() const {
-  if (FLAG_verify_handles && raw()->IsVMHeapObject()) {
+bool Object::IsReadOnly() const {
+  if (FLAG_verify_handles && raw()->IsReadOnly()) {
     Heap* vm_isolate_heap = Dart::vm_isolate()->heap();
     ASSERT(vm_isolate_heap->Contains(RawObject::ToAddr(raw())));
   }
-  return raw()->IsVMHeapObject();
+  return raw()->IsReadOnly();
 }
 #endif  // DEBUG
 
@@ -2033,10 +2029,7 @@
   return String::null();
 }
 
-void Object::InitializeObject(uword address,
-                              intptr_t class_id,
-                              intptr_t size,
-                              bool is_vm_object) {
+void Object::InitializeObject(uword address, intptr_t class_id, intptr_t size) {
   uword initial_value = (class_id == kInstructionsCid)
                             ? Assembler::GetBreakInstructionFiller()
                             : reinterpret_cast<uword>(null_);
@@ -2050,7 +2043,7 @@
   ASSERT(class_id != kIllegalCid);
   tags = RawObject::ClassIdTag::update(class_id, tags);
   tags = RawObject::SizeTag::update(size, tags);
-  tags = RawObject::VMHeapObjectTag::update(is_vm_object, tags);
+  tags = RawObject::ReadOnlyBit::update(false, tags);
   const bool is_old =
       (address & kNewObjectAlignmentOffset) == kOldObjectAlignmentOffset;
   tags = RawObject::OldBit::update(is_old, tags);
@@ -2061,7 +2054,6 @@
 #if defined(HASH_IN_OBJECT_HEADER)
   reinterpret_cast<RawObject*>(address)->hash_ = 0;
 #endif
-  ASSERT(is_vm_object == RawObject::IsVMHeapObject(tags));
 }
 
 void Object::CheckHandle() const {
@@ -2090,32 +2082,29 @@
 RawObject* Object::Allocate(intptr_t cls_id, intptr_t size, Heap::Space space) {
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
   Thread* thread = Thread::Current();
-  // New space allocation allowed only in mutator thread (Dart thread);
-  ASSERT(thread->IsMutatorThread() || (space != Heap::kNew));
   ASSERT(thread->execution_state() == Thread::kThreadInVM);
   ASSERT(thread->no_callback_scope_depth() == 0);
-  Isolate* isolate = thread->isolate();
-  Heap* heap = isolate->heap();
+  Heap* heap = thread->heap();
 
   uword address;
 
   // In a bump allocation scope, all allocations go into old space.
   if (thread->bump_allocate() && (space != Heap::kCode)) {
     DEBUG_ASSERT(heap->old_space()->CurrentThreadOwnsDataLock());
-    address = heap->old_space()->TryAllocateDataBumpLocked(
-        size, PageSpace::kForceGrowth);
+    address = heap->old_space()->TryAllocateDataBumpLocked(size);
   } else {
     address = heap->Allocate(size, space);
   }
-  if (address == 0) {
+  if (UNLIKELY(address == 0)) {
     // Use the preallocated out of memory exception to avoid calling
     // into dart code or allocating any code.
     const Instance& exception =
-        Instance::Handle(isolate->object_store()->out_of_memory());
+        Instance::Handle(thread->isolate()->object_store()->out_of_memory());
     Exceptions::Throw(thread, exception);
     UNREACHABLE();
   }
 #ifndef PRODUCT
+  Isolate* isolate = thread->isolate();
   ClassTable* class_table = isolate->class_table();
   if (space == Heap::kNew) {
     class_table->UpdateAllocatedNew(cls_id, size);
@@ -2128,7 +2117,7 @@
   }
 #endif  // !PRODUCT
   NoSafepointScope no_safepoint;
-  InitializeObject(address, cls_id, size, (isolate == Dart::vm_isolate()));
+  InitializeObject(address, cls_id, size);
   RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag);
   ASSERT(cls_id == RawObject::ClassIdTag::decode(raw_obj->ptr()->tags_));
   if (raw_obj->IsOldObject() && thread->is_marking()) {
@@ -3294,7 +3283,7 @@
         Function::Handle(zone, LookupStaticFunction(internal_getter_name));
 
     if (field.IsNull() && !getter.IsNull() && check_is_entrypoint) {
-      CHECK_ERROR(getter.VerifyEntryPoint());
+      CHECK_ERROR(getter.VerifyCallEntryPoint());
     }
 
     if (getter.IsNull() || (respect_reflectable && !getter.is_reflectable())) {
@@ -3302,7 +3291,7 @@
         getter = LookupStaticFunction(getter_name);
         if (!getter.IsNull()) {
           if (check_is_entrypoint) {
-            CHECK_ERROR(EntryPointClosurizationError(getter_name));
+            CHECK_ERROR(getter.VerifyClosurizedEntryPoint());
           }
           if (getter.SafeToClosurize()) {
             // Looking for a getter but found a regular method: closurize it.
@@ -3360,7 +3349,7 @@
     const Function& setter =
         Function::Handle(zone, LookupStaticFunction(internal_setter_name));
     if (!setter.IsNull() && check_is_entrypoint) {
-      CHECK_ERROR(setter.VerifyEntryPoint());
+      CHECK_ERROR(setter.VerifyCallEntryPoint());
     }
     const int kNumArgs = 1;
     const Array& args = Array::Handle(zone, Array::New(kNumArgs));
@@ -3422,7 +3411,7 @@
       Function::Handle(zone, LookupStaticFunction(function_name));
 
   if (!function.IsNull() && check_is_entrypoint) {
-    CHECK_ERROR(function.VerifyEntryPoint());
+    CHECK_ERROR(function.VerifyCallEntryPoint());
   }
 
   if (function.IsNull()) {
@@ -3432,7 +3421,7 @@
                            check_is_entrypoint));
     if (getter_result.raw() != Object::sentinel().raw()) {
       if (check_is_entrypoint) {
-        CHECK_ERROR(EntryPointClosurizationError(function_name));
+        CHECK_ERROR(EntryPointFieldInvocationError(function_name));
       }
       // Make room for the closure (receiver) in the argument list.
       const intptr_t num_args = args.Length();
@@ -6899,10 +6888,11 @@
           }
           cls = type_param.parameterized_class();
           param_name = type_param.name();
+          const bool is_generic_covariant = type_param.IsGenericCovariantImpl();
           ASSERT(type_param.IsFinalized());
           type_param ^=
               TypeParameter::New(cls, sig, type_param.index(), param_name, type,
-                                 type_param.token_pos());
+                                 is_generic_covariant, type_param.token_pos());
           type_param.SetIsFinalized();
           if (instantiated_type_params.IsNull()) {
             instantiated_type_params = TypeArguments::New(type_params.Length());
@@ -7795,8 +7785,9 @@
       uint16_t end_char = src.CharAt(end_token_pos().value());
       if ((end_char == ',') ||  // Case 1.
           (end_char == ')') ||  // Case 2.
-          (end_char == ';' && String::Handle(zone, name())
-                                  .Equals("<anonymous closure>"))) {  // Case 3.
+          (end_char == ';' &&
+           String::Handle(zone, name())
+               .Equals("<anonymous closure>"))) {  // Case 3.
         to_length = 0;
       }
     }
@@ -8008,6 +7999,9 @@
     case RawFunction::kIrregexpFunction:
       kind_str = "irregexp-function";
       break;
+    case RawFunction::kFfiTrampoline:
+      kind_str = " ffi-trampoline-function";
+      break;
     default:
       UNREACHABLE();
   }
@@ -8591,13 +8585,13 @@
   return value.raw() == Object::sentinel().raw();
 }
 
-void Field::SetInitializer(const Function& initializer) const {
+void Field::SetInitializerFunction(const Function& initializer) const {
   ASSERT(IsOriginal());
-  StorePointer(&raw_ptr()->initializer_, initializer.raw());
+  StorePointer(&raw_ptr()->initializer_function_, initializer.raw());
 }
 
-bool Field::HasInitializer() const {
-  return raw_ptr()->initializer_ != Function::null();
+bool Field::HasInitializerFunction() const {
+  return raw_ptr()->initializer_function_ != Function::null();
 }
 
 RawError* Field::EvaluateInitializer() const {
@@ -9088,6 +9082,25 @@
   return raw_ptr()->source_;
 }
 
+bool Script::IsPartOfDartColonLibrary() const {
+  const String& script_url = String::Handle(url());
+  return (script_url.StartsWith(Symbols::DartScheme()) ||
+          script_url.StartsWith(Symbols::DartSchemePrivate()));
+}
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+void Script::LoadSourceFromKernel(const uint8_t* kernel_buffer,
+                                  intptr_t kernel_buffer_len) const {
+  const char* dart_prefix = "dart:";
+  const size_t dart_prefix_len = strlen(dart_prefix);
+  String& uri = String::Handle(url());
+  uri ^= String::SubString(uri, dart_prefix_len);
+  String& source = String::Handle(kernel::KernelLoader::FindSourceForScript(
+      kernel_buffer, kernel_buffer_len, uri));
+  set_source(source);
+}
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+
 void Script::set_compile_time_constants(const Array& value) const {
   StorePointer(&raw_ptr()->compile_time_constants_, value.raw());
 }
@@ -9124,7 +9137,6 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
     Smi& value = Smi::Handle(zone);
     intptr_t line_count = line_starts_data.Length();
-    ASSERT(line_count > 0);
     const Array& debug_positions_array = Array::Handle(debug_positions());
     intptr_t token_count = debug_positions_array.Length();
     int token_index = 0;
@@ -10612,7 +10624,35 @@
 }
 
 void Library::DropDependenciesAndCaches() const {
-  StorePointer(&raw_ptr()->imports_, Object::empty_array().raw());
+  // We need to preserve the "dart-ext:" imports because they are used by
+  // Loader::ReloadNativeExtensions().
+  intptr_t native_import_count = 0;
+  Array& imports = Array::Handle(raw_ptr()->imports_);
+  Namespace& ns = Namespace::Handle();
+  Library& lib = Library::Handle();
+  String& url = String::Handle();
+  for (int i = 0; i < imports.Length(); ++i) {
+    ns = Namespace::RawCast(imports.At(i));
+    if (ns.IsNull()) continue;
+    lib = ns.library();
+    url = lib.url();
+    if (url.StartsWith(Symbols::DartExtensionScheme())) {
+      native_import_count++;
+    }
+  }
+  Array& new_imports =
+      Array::Handle(Array::New(native_import_count, Heap::kOld));
+  for (int i = 0, j = 0; i < imports.Length(); ++i) {
+    ns = Namespace::RawCast(imports.At(i));
+    if (ns.IsNull()) continue;
+    lib = ns.library();
+    url = lib.url();
+    if (url.StartsWith(Symbols::DartExtensionScheme())) {
+      new_imports.SetAt(j++, ns);
+    }
+  }
+
+  StorePointer(&raw_ptr()->imports_, new_imports.raw());
   StorePointer(&raw_ptr()->exports_, Object::empty_array().raw());
   StoreNonPointer(&raw_ptr()->num_imports_, 0);
   StorePointer(&raw_ptr()->resolved_names_, Array::null());
@@ -10831,7 +10871,7 @@
     if (obj.IsFunction()) {
       getter = Function::Cast(obj).raw();
       if (check_is_entrypoint) {
-        CHECK_ERROR(getter.VerifyEntryPoint());
+        CHECK_ERROR(getter.VerifyCallEntryPoint());
       }
     } else {
       obj = LookupLocalOrReExportObject(getter_name);
@@ -10841,7 +10881,7 @@
       if (obj.IsFunction() && check_is_entrypoint) {
         if (!getter_name.Equals(String::Handle(String::New("main"))) ||
             raw() != Isolate::Current()->object_store()->root_library()) {
-          CHECK_ERROR(EntryPointClosurizationError(getter_name));
+          CHECK_ERROR(Function::Cast(obj).VerifyClosurizedEntryPoint());
         }
       }
       if (obj.IsFunction() && Function::Cast(obj).SafeToClosurize()) {
@@ -10912,7 +10952,7 @@
   }
 
   if (!setter.IsNull() && check_is_entrypoint) {
-    CHECK_ERROR(setter.VerifyEntryPoint());
+    CHECK_ERROR(setter.VerifyCallEntryPoint());
   }
 
   const int kNumArgs = 1;
@@ -10950,7 +10990,7 @@
   }
 
   if (!function.IsNull() && check_is_entrypoint) {
-    CHECK_ERROR(function.VerifyEntryPoint());
+    CHECK_ERROR(function.VerifyCallEntryPoint());
   }
 
   if (function.IsNull()) {
@@ -10959,7 +10999,7 @@
         function_name, false, respect_reflectable, check_is_entrypoint));
     if (getter_result.raw() != Object::sentinel().raw()) {
       if (check_is_entrypoint) {
-        CHECK_ERROR(EntryPointClosurizationError(function_name));
+        CHECK_ERROR(EntryPointFieldInvocationError(function_name));
       }
       // Make room for the closure (receiver) in arguments.
       intptr_t numArgs = args.Length();
@@ -12699,28 +12739,25 @@
   const RawLocalVarDescriptors::VarInfoKind kind = info.kind();
   const int32_t index = info.index();
   if (kind == RawLocalVarDescriptors::kContextLevel) {
-    return Utils::SNPrint(buffer, len,
-                          "%2" Pd
-                          " %-13s level=%-3d"
-                          " begin=%-3d end=%d\n",
+    return Utils::SNPrint(buffer, len, "%2" Pd
+                                       " %-13s level=%-3d"
+                                       " begin=%-3d end=%d\n",
                           i, LocalVarDescriptors::KindToCString(kind), index,
                           static_cast<int>(info.begin_pos.value()),
                           static_cast<int>(info.end_pos.value()));
   } else if (kind == RawLocalVarDescriptors::kContextVar) {
     return Utils::SNPrint(
-        buffer, len,
-        "%2" Pd
-        " %-13s level=%-3d index=%-3d"
-        " begin=%-3d end=%-3d name=%s\n",
+        buffer, len, "%2" Pd
+                     " %-13s level=%-3d index=%-3d"
+                     " begin=%-3d end=%-3d name=%s\n",
         i, LocalVarDescriptors::KindToCString(kind), info.scope_id, index,
         static_cast<int>(info.begin_pos.Pos()),
         static_cast<int>(info.end_pos.Pos()), var_name.ToCString());
   } else {
     return Utils::SNPrint(
-        buffer, len,
-        "%2" Pd
-        " %-13s scope=%-3d index=%-3d"
-        " begin=%-3d end=%-3d name=%s\n",
+        buffer, len, "%2" Pd
+                     " %-13s scope=%-3d index=%-3d"
+                     " begin=%-3d end=%-3d name=%s\n",
         i, LocalVarDescriptors::KindToCString(kind), info.scope_id, index,
         static_cast<int>(info.begin_pos.Pos()),
         static_cast<int>(info.end_pos.Pos()), var_name.ToCString());
@@ -14433,15 +14470,43 @@
 }
 #endif
 
-RawCode* Code::FinalizeCode(const char* name,
-                            FlowGraphCompiler* compiler,
+RawCode* Code::FinalizeCodeAndNotify(const Function& function,
+                                     FlowGraphCompiler* compiler,
+                                     compiler::Assembler* assembler,
+                                     PoolAttachment pool_attachment,
+                                     bool optimized,
+                                     CodeStatistics* stats) {
+  DEBUG_ASSERT(IsMutatorOrAtSafepoint());
+  const auto& code = Code::Handle(
+      FinalizeCode(compiler, assembler, pool_attachment, optimized, stats));
+  NotifyCodeObservers(function, code, optimized);
+  return code.raw();
+}
+
+RawCode* Code::FinalizeCodeAndNotify(const char* name,
+                                     FlowGraphCompiler* compiler,
+                                     compiler::Assembler* assembler,
+                                     PoolAttachment pool_attachment,
+                                     bool optimized,
+                                     CodeStatistics* stats) {
+  DEBUG_ASSERT(IsMutatorOrAtSafepoint());
+  const auto& code = Code::Handle(
+      FinalizeCode(compiler, assembler, pool_attachment, optimized, stats));
+  NotifyCodeObservers(name, code, optimized);
+  return code.raw();
+}
+
+RawCode* Code::FinalizeCode(FlowGraphCompiler* compiler,
                             Assembler* assembler,
                             PoolAttachment pool_attachment,
                             bool optimized,
                             CodeStatistics* stats /* = nullptr */) {
+  DEBUG_ASSERT(IsMutatorOrAtSafepoint());
   Isolate* isolate = Isolate::Current();
   if (!isolate->compilation_allowed()) {
-    FATAL1("Precompilation missed code %s\n", name);
+    FATAL(
+        "Compilation is not allowed (precompilation might have missed a "
+        "code\n");
   }
 
   ASSERT(assembler != NULL);
@@ -14464,19 +14529,20 @@
   Instructions& instrs = Instructions::ZoneHandle(Instructions::New(
       assembler->CodeSize(), assembler->has_single_entry_point(),
       compiler == nullptr ? 0 : compiler->UncheckedEntryOffset()));
-  // Important: if GC is triggerred at any point between Instructions::New
-  // and here it would write protect instructions object that we are trying
-  // to fill in.
+
   {
+    // Important: if GC is triggerred at any point between Instructions::New
+    // and here it would write protect instructions object that we are trying
+    // to fill in.
     NoSafepointScope no_safepoint;
+
     // Copy the instructions into the instruction area and apply all fixups.
     // Embedded pointers are still in handles at this point.
     MemoryRegion region(reinterpret_cast<void*>(instrs.PayloadStart()),
                         instrs.Size());
     assembler->FinalizeInstructions(region);
 
-    const ZoneGrowableArray<intptr_t>& pointer_offsets =
-        assembler->GetPointerOffsets();
+    const auto& pointer_offsets = assembler->GetPointerOffsets();
     ASSERT(pointer_offsets.length() == pointer_offset_count);
     ASSERT(code.pointer_offsets_length() == pointer_offsets.length());
 
@@ -14512,25 +14578,20 @@
                              instrs.raw()->HeapSize(),
                              VirtualMemory::kReadExecute);
     }
-  }
-  CPU::FlushICache(instrs.PayloadStart(), instrs.Size());
 
 #if defined(DART_PRECOMPILER)
-  if (stats != nullptr) {
-    stats->Finalize();
-    instrs.set_stats(stats);
-  }
+    if (stats != nullptr) {
+      stats->Finalize();
+      instrs.set_stats(stats);
+    }
 #endif
 
-#ifndef PRODUCT
-  const Code::Comments& comments = CreateCommentsFrom(assembler);
+    CPU::FlushICache(instrs.PayloadStart(), instrs.Size());
+  }
 
+#ifndef PRODUCT
   code.set_compile_timestamp(OS::GetCurrentMonotonicMicros());
-  CodeCommentsWrapper comments_wrapper(comments);
-  CodeObservers::NotifyAll(name, instrs.PayloadStart(),
-                           assembler->prologue_offset(), instrs.Size(),
-                           optimized, &comments_wrapper);
-  code.set_comments(comments);
+  code.set_comments(CreateCommentsFrom(assembler));
   if (assembler->prologue_offset() >= 0) {
     code.SetPrologueOffset(assembler->prologue_offset());
   } else {
@@ -14542,22 +14603,33 @@
   return code.raw();
 }
 
-RawCode* Code::FinalizeCode(const Function& function,
-                            FlowGraphCompiler* compiler,
-                            Assembler* assembler,
-                            PoolAttachment pool_attachment,
-                            bool optimized /* = false */,
-                            CodeStatistics* stats /* = nullptr */) {
-// Calling ToLibNamePrefixedQualifiedCString is very expensive,
-// try to avoid it.
-#ifndef PRODUCT
+void Code::NotifyCodeObservers(const Function& function,
+                               const Code& code,
+                               bool optimized) {
+#if !defined(PRODUCT)
+  ASSERT(!Thread::Current()->IsAtSafepoint());
+  // Calling ToLibNamePrefixedQualifiedCString is very expensive,
+  // try to avoid it.
   if (CodeObservers::AreActive()) {
-    return FinalizeCode(function.ToLibNamePrefixedQualifiedCString(), compiler,
-                        assembler, pool_attachment, optimized, stats);
+    const char* name = function.ToLibNamePrefixedQualifiedCString();
+    NotifyCodeObservers(name, code, optimized);
   }
-#endif  // !PRODUCT
-  return FinalizeCode("", compiler, assembler, pool_attachment, optimized,
-                      stats);
+#endif
+}
+
+void Code::NotifyCodeObservers(const char* name,
+                               const Code& code,
+                               bool optimized) {
+#if !defined(PRODUCT)
+  ASSERT(!Thread::Current()->IsAtSafepoint());
+  if (CodeObservers::AreActive()) {
+    const auto& instrs = Instructions::Handle(code.instructions());
+    CodeCommentsWrapper comments_wrapper(code.comments());
+    CodeObservers::NotifyAll(name, instrs.PayloadStart(),
+                             code.GetPrologueOffset(), instrs.Size(), optimized,
+                             &comments_wrapper);
+  }
+#endif
 }
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -15682,7 +15754,7 @@
   Function& function = Function::Handle(
       zone, Resolver::ResolveDynamicAnyArgs(zone, klass, internal_getter_name));
 
-  if (check_is_entrypoint) {
+  if (!function.IsNull() && check_is_entrypoint) {
     // The getter must correspond to either an entry-point field or a getter
     // method explicitly marked.
     Field& field = Field::Handle(zone);
@@ -15691,8 +15763,8 @@
     }
     if (!field.IsNull()) {
       CHECK_ERROR(field.VerifyEntryPoint(EntryPointPragma::kGetterOnly));
-    } else if (!function.IsNull()) {
-      CHECK_ERROR(function.VerifyEntryPoint());
+    } else {
+      CHECK_ERROR(function.VerifyCallEntryPoint());
     }
   }
 
@@ -15701,7 +15773,7 @@
     function = Resolver::ResolveDynamicAnyArgs(zone, klass, getter_name);
 
     if (!function.IsNull() && check_is_entrypoint) {
-      CHECK_ERROR(EntryPointClosurizationError(getter_name));
+      CHECK_ERROR(function.VerifyClosurizedEntryPoint());
     }
 
     if (!function.IsNull() && function.SafeToClosurize()) {
@@ -15750,7 +15822,7 @@
     if (!field.IsNull()) {
       CHECK_ERROR(field.VerifyEntryPoint(EntryPointPragma::kSetterOnly));
     } else if (!setter.IsNull()) {
-      CHECK_ERROR(setter.VerifyEntryPoint());
+      CHECK_ERROR(setter.VerifyCallEntryPoint());
     }
   }
 
@@ -15778,7 +15850,7 @@
       zone, Resolver::ResolveDynamicAnyArgs(zone, klass, function_name));
 
   if (!function.IsNull() && check_is_entrypoint) {
-    CHECK_ERROR(function.VerifyEntryPoint());
+    CHECK_ERROR(function.VerifyCallEntryPoint());
   }
 
   // TODO(regis): Support invocation of generic functions with type arguments.
@@ -15798,7 +15870,7 @@
     function = Resolver::ResolveDynamicAnyArgs(zone, klass, getter_name);
     if (!function.IsNull()) {
       if (check_is_entrypoint) {
-        CHECK_ERROR(EntryPointClosurizationError(function_name));
+        CHECK_ERROR(EntryPointFieldInvocationError(function_name));
       }
       ASSERT(function.kind() != RawFunction::kMethodExtractor);
       // Invoke the getter.
@@ -15994,7 +16066,7 @@
       return result.raw();
     }
     if (IsNew()) {
-      ASSERT((isolate == Dart::vm_isolate()) || !InVMHeap());
+      ASSERT((isolate == Dart::vm_isolate()) || !IsReadOnly());
       // Create a canonical object in old space.
       result ^= Object::Clone(*this, Heap::kOld);
     } else {
@@ -17339,7 +17411,7 @@
     ASSERT(!IsFunctionType());
     Type& type = Type::Handle(zone, cls.declaration_type());
     if (type.IsNull()) {
-      ASSERT(!cls.raw()->IsVMHeapObject() || (isolate == Dart::vm_isolate()));
+      ASSERT(!cls.raw()->IsReadOnly() || (isolate == Dart::vm_isolate()));
       // Canonicalize the type arguments of the supertype, if any.
       TypeArguments& type_args = TypeArguments::Handle(zone, arguments());
       type_args = type_args.Canonicalize(trail);
@@ -17756,7 +17828,12 @@
 
 void TypeParameter::SetIsFinalized() const {
   ASSERT(!IsFinalized());
-  set_type_state(RawTypeParameter::kFinalizedUninstantiated);
+  set_flags(RawTypeParameter::FinalizedBit::update(true, raw_ptr()->flags_));
+}
+
+void TypeParameter::SetGenericCovariantImpl(bool value) const {
+  set_flags(RawTypeParameter::GenericCovariantImplBit::update(
+      value, raw_ptr()->flags_));
 }
 
 bool TypeParameter::IsInstantiated(Genericity genericity,
@@ -17926,6 +18003,7 @@
                                      intptr_t index,
                                      const String& name,
                                      const AbstractType& bound,
+                                     bool is_generic_covariant_impl,
                                      TokenPosition token_pos) {
   ASSERT(parameterized_class.IsNull() != parameterized_function.IsNull());
   Zone* Z = Thread::Current()->zone();
@@ -17935,10 +18013,10 @@
   result.set_index(index);
   result.set_name(name);
   result.set_bound(bound);
+  result.set_flags(0);
+  result.SetGenericCovariantImpl(is_generic_covariant_impl);
   result.SetHash(0);
   result.set_token_pos(token_pos);
-  result.StoreNonPointer(&result.raw_ptr()->type_state_,
-                         RawTypeParameter::kAllocated);
 
   result.SetTypeTestingStub(
       Code::Handle(Z, TypeTestingStubGenerator::DefaultCodeForType(result)));
@@ -17950,11 +18028,8 @@
   StoreNonPointer(&raw_ptr()->token_pos_, token_pos);
 }
 
-void TypeParameter::set_type_state(int8_t state) const {
-  ASSERT((state == RawTypeParameter::kAllocated) ||
-         (state == RawTypeParameter::kBeingFinalized) ||
-         (state == RawTypeParameter::kFinalizedUninstantiated));
-  StoreNonPointer(&raw_ptr()->type_state_, state);
+void TypeParameter::set_flags(uint8_t flags) const {
+  StoreNonPointer(&raw_ptr()->flags_, flags);
 }
 
 const char* TypeParameter::ToCString() const {
@@ -18861,6 +18936,25 @@
   return true;
 }
 
+bool String::EndsWith(const String& other) const {
+  if (other.IsNull()) {
+    return false;
+  }
+  const intptr_t len = this->Length();
+  const intptr_t other_len = other.Length();
+  const intptr_t offset = len - other_len;
+
+  if ((other_len == 0) || (other_len > len)) {
+    return false;
+  }
+  for (int i = offset; i < len; i++) {
+    if (this->CharAt(i) != other.CharAt(i - offset)) {
+      return false;
+    }
+  }
+  return true;
+}
+
 RawInstance* String::CheckAndCanonicalize(Thread* thread,
                                           const char** error_str) const {
   if (IsCanonical()) {
@@ -20111,7 +20205,7 @@
 RawArray* Array::New(intptr_t len, Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->array_class() != Class::null());
   RawArray* result = New(kClassId, len, space);
-  if (result->HeapSize() > Heap::kNewAllocatableSize) {
+  if (UseCardMarkingForAllocation(len)) {
     ASSERT(result->IsOldObject());
     result->SetCardRememberedBitUnsynchronized();
   }
@@ -20818,7 +20912,7 @@
 }
 
 RawPointer* Pointer::New(const AbstractType& type_arg,
-                         uint8_t* c_memory_address,
+                         const Integer& c_memory_address,
                          intptr_t cid,
                          Heap::Space space) {
   Thread* thread = Thread::Current();
@@ -20843,8 +20937,10 @@
 const char* Pointer::ToCString() const {
   TypeArguments& type_args = TypeArguments::Handle(GetTypeArguments());
   String& type_args_name = String::Handle(type_args.UserVisibleName());
-  return OS::SCreate(Thread::Current()->zone(), "Pointer%s: address=%p",
-                     type_args_name.ToCString(), GetCMemoryAddress());
+  return OS::SCreate(Thread::Current()->zone(), "Pointer%s: address=0x%" Px,
+                     type_args_name.ToCString(),
+                     static_cast<intptr_t>(
+                         Integer::Handle(GetCMemoryAddress()).AsInt64Value()));
 }
 
 RawDynamicLibrary* DynamicLibrary::New(void* handle, Heap::Space space) {
@@ -20882,8 +20978,8 @@
 }
 
 const char* DynamicLibrary::ToCString() const {
-  return OS::SCreate(Thread::Current()->zone(), "DynamicLibrary: handle=%p",
-                     GetHandle());
+  return OS::SCreate(Thread::Current()->zone(), "DynamicLibrary: handle=0x%" Px,
+                     reinterpret_cast<uintptr_t>(GetHandle()));
 }
 
 RawCapability* Capability::New(uint64_t id, Heap::Space space) {
@@ -21398,7 +21494,7 @@
         Object::Allocate(RegExp::kClassId, RegExp::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
-    result.set_type(kUnitialized);
+    result.set_type(kUninitialized);
     result.set_flags(0);
     result.set_num_registers(-1);
   }
@@ -21681,15 +21777,19 @@
     if (pragma->raw() == Symbols::Set().raw()) {
       return EntryPointPragma::kSetterOnly;
     }
+    if (pragma->raw() == Symbols::Call().raw()) {
+      return EntryPointPragma::kCallOnly;
+    }
   }
   return EntryPointPragma::kNever;
 }
 
 DART_WARN_UNUSED_RESULT
-RawError* VerifyEntryPoint(const Library& lib,
-                           const Object& member,
-                           const Object& annotated,
-                           EntryPointPragma kind) {
+RawError* VerifyEntryPoint(
+    const Library& lib,
+    const Object& member,
+    const Object& annotated,
+    std::initializer_list<EntryPointPragma> allowed_kinds) {
 #if defined(DART_PRECOMPILED_RUNTIME)
   // Annotations are discarded in the AOT snapshot, so we can't determine
   // precisely if this member was marked as an entry-point. Instead, we use
@@ -21713,13 +21813,23 @@
   EntryPointPragma pragma =
       FindEntryPointPragma(Isolate::Current(), Array::Cast(metadata),
                            &Field::Handle(), &Object::Handle());
-  const bool is_marked_entrypoint =
-      pragma == kind || pragma == EntryPointPragma::kAlways;
+  bool is_marked_entrypoint = pragma == EntryPointPragma::kAlways;
+  if (!is_marked_entrypoint) {
+    for (const auto allowed_kind : allowed_kinds) {
+      if (pragma == allowed_kind) {
+        is_marked_entrypoint = true;
+        break;
+      }
+    }
+  }
 #endif
   if (!is_marked_entrypoint) {
     const char* member_cstring =
         member.IsFunction()
-            ? Function::Cast(member).ToLibNamePrefixedQualifiedCString()
+            ? OS::SCreate(
+                  Thread::Current()->zone(), "%s (kind %s)",
+                  Function::Cast(member).ToLibNamePrefixedQualifiedCString(),
+                  Function::KindToCString(Function::Cast(member).kind()))
             : member.ToCString();
     char const* error = OS::SCreate(
         Thread::Current()->zone(),
@@ -21735,12 +21845,12 @@
 }
 
 DART_WARN_UNUSED_RESULT
-RawError* EntryPointClosurizationError(const String& getter_name) {
+RawError* EntryPointFieldInvocationError(const String& getter_name) {
   if (!FLAG_verify_entry_points) return Error::null();
 
   char const* error = OS::SCreate(
       Thread::Current()->zone(),
-      "ERROR: Entry-points do not allow closurizing methods "
+      "ERROR: Entry-points do not allow invoking fields "
       "(failure to resolve '%s')\n"
       "ERROR: See "
       "https://github.com/dart-lang/sdk/blob/master/runtime/docs/compiler/"
@@ -21750,50 +21860,67 @@
   return ApiError::New(String::Handle(String::New(error)));
 }
 
-RawError* Function::VerifyEntryPoint() const {
+RawError* Function::VerifyCallEntryPoint() const {
   if (!FLAG_verify_entry_points) return Error::null();
 
   const Class& cls = Class::Handle(Owner());
   const Library& lib = Library::Handle(cls.library());
   switch (kind()) {
     case RawFunction::kRegularFunction:
-    case RawFunction::kGetterFunction:
     case RawFunction::kSetterFunction:
     case RawFunction::kConstructor:
       return dart::VerifyEntryPoint(lib, *this, *this,
-                                    EntryPointPragma::kAlways);
+                                    {EntryPointPragma::kCallOnly});
       break;
-    case RawFunction::kImplicitGetter: {
-      const Field& accessed = Field::Handle(accessor_field());
-      return dart::VerifyEntryPoint(lib, *this, accessed,
-                                    EntryPointPragma::kGetterOnly);
+    case RawFunction::kGetterFunction:
+      return dart::VerifyEntryPoint(
+          lib, *this, *this,
+          {EntryPointPragma::kCallOnly, EntryPointPragma::kGetterOnly});
       break;
-    }
-    case RawFunction::kImplicitSetter: {
-      const Field& accessed = Field::Handle(accessor_field());
-      return dart::VerifyEntryPoint(lib, *this, accessed,
-                                    EntryPointPragma::kSetterOnly);
+    case RawFunction::kImplicitGetter:
+      return dart::VerifyEntryPoint(lib, *this, Field::Handle(accessor_field()),
+                                    {EntryPointPragma::kGetterOnly});
       break;
-    }
+    case RawFunction::kImplicitSetter:
+      return dart::VerifyEntryPoint(lib, *this, Field::Handle(accessor_field()),
+                                    {EntryPointPragma::kSetterOnly});
+    case RawFunction::kMethodExtractor:
+      return Function::Handle(extracted_method_closure())
+          .VerifyClosurizedEntryPoint();
+      break;
     default:
-      return dart::VerifyEntryPoint(lib, *this, Object::Handle(),
-                                    EntryPointPragma::kAlways);
+      return dart::VerifyEntryPoint(lib, *this, Object::Handle(), {});
       break;
   }
 }
 
+RawError* Function::VerifyClosurizedEntryPoint() const {
+  if (!FLAG_verify_entry_points) return Error::null();
+
+  const Class& cls = Class::Handle(Owner());
+  const Library& lib = Library::Handle(cls.library());
+  switch (kind()) {
+    case RawFunction::kRegularFunction:
+    case RawFunction::kImplicitClosureFunction:
+      return dart::VerifyEntryPoint(lib, *this, *this,
+                                    {EntryPointPragma::kGetterOnly});
+    default:
+      UNREACHABLE();
+  }
+}
+
 RawError* Field::VerifyEntryPoint(EntryPointPragma pragma) const {
   if (!FLAG_verify_entry_points) return Error::null();
   const Class& cls = Class::Handle(Owner());
   const Library& lib = Library::Handle(cls.library());
-  return dart::VerifyEntryPoint(lib, *this, *this, pragma);
+  return dart::VerifyEntryPoint(lib, *this, *this, {pragma});
 }
 
 RawError* Class::VerifyEntryPoint() const {
   if (!FLAG_verify_entry_points) return Error::null();
   const Library& lib = Library::Handle(library());
   if (!lib.IsNull()) {
-    return dart::VerifyEntryPoint(lib, *this, *this, EntryPointPragma::kAlways);
+    return dart::VerifyEntryPoint(lib, *this, *this, {});
   } else {
     return Error::null();
   }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index e426c9d0..e19f357 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -307,9 +307,9 @@
   bool IsNew() const { return raw()->IsNewObject(); }
   bool IsOld() const { return raw()->IsOldObject(); }
 #if defined(DEBUG)
-  bool InVMHeap() const;
+  bool IsReadOnly() const;
 #else
-  bool InVMHeap() const { return raw()->IsVMHeapObject(); }
+  bool IsReadOnly() const { return raw()->IsReadOnly(); }
 #endif  // DEBUG
 
   // Print the object on stdout for debugging.
@@ -637,10 +637,7 @@
     return -kWordSize;
   }
 
-  static void InitializeObject(uword address,
-                               intptr_t id,
-                               intptr_t size,
-                               bool is_vm_object);
+  static void InitializeObject(uword address, intptr_t id, intptr_t size);
 
   static void RegisterClass(const Class& cls,
                             const String& name,
@@ -2606,7 +2603,10 @@
   }
 
   DART_WARN_UNUSED_RESULT
-  RawError* VerifyEntryPoint() const;
+  RawError* VerifyCallEntryPoint() const;
+
+  DART_WARN_UNUSED_RESULT
+  RawError* VerifyClosurizedEntryPoint() const;
 
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawFunction));
@@ -2970,7 +2970,13 @@
   friend class HeapProfiler;
 };
 
-enum class EntryPointPragma { kAlways, kNever, kGetterOnly, kSetterOnly };
+enum class EntryPointPragma {
+  kAlways,
+  kNever,
+  kGetterOnly,
+  kSetterOnly,
+  kCallOnly
+};
 
 class FfiTrampolineData : public Object {
  public:
@@ -3259,9 +3265,11 @@
 
   DART_WARN_UNUSED_RESULT RawError* EvaluateInitializer() const;
 
-  RawFunction* Initializer() const { return raw_ptr()->initializer_; }
-  void SetInitializer(const Function& initializer) const;
-  bool HasInitializer() const;
+  RawFunction* InitializerFunction() const {
+    return raw_ptr()->initializer_function_;
+  }
+  void SetInitializerFunction(const Function& initializer) const;
+  bool HasInitializerFunction() const;
 
   // For static fields only. Constructs a closure that gets/sets the
   // field value.
@@ -3376,6 +3384,8 @@
   RawString* resolved_url() const { return raw_ptr()->resolved_url_; }
   bool HasSource() const;
   RawString* Source() const;
+  bool IsPartOfDartColonLibrary() const;
+
   RawGrowableObjectArray* GenerateLineNumberArray() const;
   RawScript::Kind kind() const {
     return static_cast<RawScript::Kind>(raw_ptr()->kind_);
@@ -3452,6 +3462,11 @@
                         const String& source,
                         RawScript::Kind kind);
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  void LoadSourceFromKernel(const uint8_t* kernel_buffer,
+                            intptr_t kernel_buffer_len) const;
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+
  private:
   void set_resolved_url(const String& value) const;
   void set_source(const String& value) const;
@@ -4970,18 +4985,34 @@
   // then a new [ObjectPool] will be attached to the code object as well.
   // Otherwise the caller is responsible for doing this via
   // `Object::set_object_pool()`.
-  static RawCode* FinalizeCode(const Function& function,
-                               FlowGraphCompiler* compiler,
-                               compiler::Assembler* assembler,
-                               PoolAttachment pool_attachment,
-                               bool optimized = false,
-                               CodeStatistics* stats = nullptr);
-  static RawCode* FinalizeCode(const char* name,
-                               FlowGraphCompiler* compiler,
+  static RawCode* FinalizeCode(FlowGraphCompiler* compiler,
                                compiler::Assembler* assembler,
                                PoolAttachment pool_attachment,
                                bool optimized,
-                               CodeStatistics* stats = nullptr);
+                               CodeStatistics* stats);
+
+  // Notifies all active [CodeObserver]s.
+  static void NotifyCodeObservers(const Function& function,
+                                  const Code& code,
+                                  bool optimized);
+  static void NotifyCodeObservers(const char* name,
+                                  const Code& code,
+                                  bool optimized);
+
+  // Calls [FinalizeCode] and also notifies [CodeObserver]s.
+  static RawCode* FinalizeCodeAndNotify(const Function& function,
+                                        FlowGraphCompiler* compiler,
+                                        compiler::Assembler* assembler,
+                                        PoolAttachment pool_attachment,
+                                        bool optimized = false,
+                                        CodeStatistics* stats = nullptr);
+  static RawCode* FinalizeCodeAndNotify(const char* name,
+                                        FlowGraphCompiler* compiler,
+                                        compiler::Assembler* assembler,
+                                        PoolAttachment pool_attachment,
+                                        bool optimized = false,
+                                        CodeStatistics* stats = nullptr);
+
 #endif
   static RawCode* LookupCode(uword pc);
   static RawCode* LookupCodeInVmIsolate(uword pc);
@@ -6512,11 +6543,14 @@
 class TypeParameter : public AbstractType {
  public:
   virtual bool IsFinalized() const {
-    ASSERT(raw_ptr()->type_state_ != RawTypeParameter::kFinalizedInstantiated);
-    return raw_ptr()->type_state_ == RawTypeParameter::kFinalizedUninstantiated;
+    return RawTypeParameter::FinalizedBit::decode(raw_ptr()->flags_);
   }
   virtual void SetIsFinalized() const;
   virtual bool IsBeingFinalized() const { return false; }
+  bool IsGenericCovariantImpl() const {
+    return RawTypeParameter::GenericCovariantImplBit::decode(raw_ptr()->flags_);
+  }
+  void SetGenericCovariantImpl(bool value) const;
   virtual bool HasTypeClass() const { return false; }
   virtual classid_t type_class_id() const { return kIllegalCid; }
   classid_t parameterized_class_id() const;
@@ -6568,6 +6602,7 @@
                                intptr_t index,
                                const String& name,
                                const AbstractType& bound,
+                               bool is_generic_covariant_impl,
                                TokenPosition token_pos);
 
  private:
@@ -6578,7 +6613,7 @@
   void set_parameterized_function(const Function& value) const;
   void set_name(const String& value) const;
   void set_token_pos(TokenPosition token_pos) const;
-  void set_type_state(int8_t state) const;
+  void set_flags(uint8_t flags) const;
 
   static RawTypeParameter* New();
 
@@ -6981,6 +7016,7 @@
   intptr_t CompareTo(const String& other) const;
 
   bool StartsWith(const String& other) const;
+  bool EndsWith(const String& other) const;
 
   // Strings are canonicalized using the symbol table.
   virtual RawInstance* CheckAndCanonicalize(Thread* thread,
@@ -7672,6 +7708,11 @@
   // architecture.
   static const intptr_t kHashBits = 30;
 
+  // Returns `true` if we use card marking for arrays of length [array_length].
+  static bool UseCardMarkingForAllocation(const intptr_t array_length) {
+    return Array::InstanceSize(array_length) > Heap::kNewAllocatableSize;
+  }
+
   intptr_t Length() const { return LengthOf(raw()); }
   static intptr_t LengthOf(const RawArray* array) {
     return Smi::Value(array->ptr()->length_);
@@ -8458,7 +8499,7 @@
 class Pointer : public Instance {
  public:
   static RawPointer* New(const AbstractType& type_arg,
-                         uint8_t* c_memory_address,
+                         const Integer& c_memory_address,
                          intptr_t class_id = kFfiPointerCid,
                          Heap::Space space = Heap::kNew);
 
@@ -8468,20 +8509,17 @@
 
   static bool IsPointer(const Instance& obj);
 
-  uint8_t* GetCMemoryAddress() const {
-    ASSERT(!IsNull());
-    return raw_ptr()->c_memory_address_;
-  }
+  RawInteger* GetCMemoryAddress() const { return raw_ptr()->c_memory_address_; }
 
-  void SetCMemoryAddress(uint8_t* value) const {
-    StoreNonPointer(&raw_ptr()->c_memory_address_, value);
+  void SetCMemoryAddress(const Integer& value) const {
+    StorePointer(&raw_ptr()->c_memory_address_, value.raw());
   }
 
   static intptr_t type_arguments_offset() {
     return OFFSET_OF(RawPointer, type_arguments_);
   }
 
-  static intptr_t address_offset() {
+  static intptr_t c_memory_address_offset() {
     return OFFSET_OF(RawPointer, c_memory_address_);
   }
 
@@ -8842,7 +8880,7 @@
   // kSimple: A simple pattern to match against, using string indexOf operation.
   // kComplex: A complex pattern to match.
   enum RegExType {
-    kUnitialized = 0,
+    kUninitialized = 0,
     kSimple = 1,
     kComplex = 2,
   };
@@ -8866,7 +8904,7 @@
   class TypeBits : public BitField<int8_t, RegExType, kTypePos, kTypeSize> {};
   class FlagsBits : public BitField<int8_t, intptr_t, kFlagsPos, kFlagsSize> {};
 
-  bool is_initialized() const { return (type() != kUnitialized); }
+  bool is_initialized() const { return (type() != kUninitialized); }
   bool is_simple() const { return (type() == kSimple); }
   bool is_complex() const { return (type() == kComplex); }
 
@@ -9414,7 +9452,7 @@
                                       Object* reusable_object_handle);
 
 DART_WARN_UNUSED_RESULT
-RawError* EntryPointClosurizationError(const String& getter_name);
+RawError* EntryPointFieldInvocationError(const String& getter_name);
 
 }  // namespace dart
 
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 6b7cda3..5a5e740 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -532,7 +532,7 @@
   virtual void VisitPointers(RawObject** first, RawObject** last) {
     for (RawObject** current = first; current <= last; ++current) {
       RawObject* object = *current;
-      if (!object->IsHeapObject() || object->IsVMHeapObject()) {
+      if (!object->IsHeapObject() || object->IsReadOnly()) {
         // Ignore smis and objects in the VM isolate for now.
         // TODO(koda): To track which field each pointer corresponds to,
         // we'll need to encode which fields were omitted here.
diff --git a/runtime/vm/object_id_ring_test.cc b/runtime/vm/object_id_ring_test.cc
index 23593a7..23d47a6 100644
--- a/runtime/vm/object_id_ring_test.cc
+++ b/runtime/vm/object_id_ring_test.cc
@@ -128,67 +128,70 @@
       "}\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  Dart_Handle moved_handle;
   intptr_t list_length = 0;
   EXPECT_VALID(result);
   EXPECT(!Dart_IsNull(result));
   EXPECT(Dart_IsList(result));
   EXPECT_VALID(Dart_ListLength(result, &list_length));
   EXPECT_EQ(3, list_length);
+
   Isolate* isolate = thread->isolate();
   Heap* heap = isolate->heap();
   ObjectIdRing* ring = isolate->object_id_ring();
   ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid;
-  RawObject* raw_obj = Api::UnwrapHandle(result);
-  // Located in new heap.
-  EXPECT(raw_obj->IsNewObject());
-  EXPECT_NE(Object::null(), raw_obj);
-  intptr_t raw_obj_id1 = ring->GetIdForObject(raw_obj);
-  EXPECT_EQ(0, raw_obj_id1);
-  // Get id 0 again.
-  EXPECT_EQ(raw_obj_id1, ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId));
-  // Add to ring a second time.
-  intptr_t raw_obj_id2 = ring->GetIdForObject(raw_obj);
-  EXPECT_EQ(1, raw_obj_id2);
-  // Get id 0 again.
-  EXPECT_EQ(raw_obj_id1, ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId));
-  RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind);
-  EXPECT_EQ(ObjectIdRing::kValid, kind);
-  RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind);
-  EXPECT_EQ(ObjectIdRing::kValid, kind);
-  EXPECT_NE(Object::null(), raw_obj1);
-  EXPECT_NE(Object::null(), raw_obj2);
-  EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1));
-  EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2));
+
   {
-    TransitionNativeToVM transition(thread);
+    TransitionNativeToVM to_vm(thread);
+    RawObject* raw_obj = Api::UnwrapHandle(result);
+    // Located in new heap.
+    EXPECT(raw_obj->IsNewObject());
+    EXPECT_NE(Object::null(), raw_obj);
+    intptr_t raw_obj_id1 = ring->GetIdForObject(raw_obj);
+    EXPECT_EQ(0, raw_obj_id1);
+    // Get id 0 again.
+    EXPECT_EQ(raw_obj_id1,
+              ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId));
+    // Add to ring a second time.
+    intptr_t raw_obj_id2 = ring->GetIdForObject(raw_obj);
+    EXPECT_EQ(1, raw_obj_id2);
+    // Get id 0 again.
+    EXPECT_EQ(raw_obj_id1,
+              ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId));
+    RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind);
+    EXPECT_EQ(ObjectIdRing::kValid, kind);
+    RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind);
+    EXPECT_EQ(ObjectIdRing::kValid, kind);
+    EXPECT_NE(Object::null(), raw_obj1);
+    EXPECT_NE(Object::null(), raw_obj2);
+    EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1));
+    EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2));
     // Force a scavenge.
     heap->CollectGarbage(Heap::kNew);
-  }
-  RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1, &kind);
-  EXPECT_EQ(ObjectIdRing::kValid, kind);
-  RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2, &kind);
-  EXPECT_EQ(ObjectIdRing::kValid, kind);
-  EXPECT_NE(Object::null(), raw_object_moved1);
-  EXPECT_NE(Object::null(), raw_object_moved2);
-  EXPECT_EQ(RawObject::ToAddr(raw_object_moved1),
-            RawObject::ToAddr(raw_object_moved2));
-  // Test that objects have moved.
-  EXPECT_NE(RawObject::ToAddr(raw_obj1), RawObject::ToAddr(raw_object_moved1));
-  EXPECT_NE(RawObject::ToAddr(raw_obj2), RawObject::ToAddr(raw_object_moved2));
-  // Test that we still point at the same list.
-  Dart_Handle moved_handle;
-  {
-    TransitionNativeToVM transition(thread);
+    RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1, &kind);
+    EXPECT_EQ(ObjectIdRing::kValid, kind);
+    RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2, &kind);
+    EXPECT_EQ(ObjectIdRing::kValid, kind);
+    EXPECT_NE(Object::null(), raw_object_moved1);
+    EXPECT_NE(Object::null(), raw_object_moved2);
+    EXPECT_EQ(RawObject::ToAddr(raw_object_moved1),
+              RawObject::ToAddr(raw_object_moved2));
+    // Test that objects have moved.
+    EXPECT_NE(RawObject::ToAddr(raw_obj1),
+              RawObject::ToAddr(raw_object_moved1));
+    EXPECT_NE(RawObject::ToAddr(raw_obj2),
+              RawObject::ToAddr(raw_object_moved2));
+    // Test that we still point at the same list.
     moved_handle = Api::NewHandle(thread, raw_object_moved1);
+    // Test id reuse.
+    EXPECT_EQ(raw_obj_id1,
+              ring->GetIdForObject(raw_object_moved1, ObjectIdRing::kReuseId));
   }
   EXPECT_VALID(moved_handle);
   EXPECT(!Dart_IsNull(moved_handle));
   EXPECT(Dart_IsList(moved_handle));
   EXPECT_VALID(Dart_ListLength(moved_handle, &list_length));
   EXPECT_EQ(3, list_length);
-  // Test id reuse.
-  EXPECT_EQ(raw_obj_id1,
-            ring->GetIdForObject(raw_object_moved1, ObjectIdRing::kReuseId));
 }
 
 // Test that the ring table is updated with nulls when the old GC collects.
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index cecbe27..2d080e3 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -131,18 +131,23 @@
 }
 
 void ObjectStore::InitKnownObjects() {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  Class& cls = Class::Handle(zone);
+  const Library& collection_lib = Library::Handle(collection_library());
+  cls = collection_lib.LookupClassAllowPrivate(Symbols::_LinkedHashSet());
+  ASSERT(!cls.IsNull());
+  set_linked_hash_set_class(cls);
+
 #ifdef DART_PRECOMPILED_RUNTIME
   // These objects are only needed for code generation.
   return;
 #else
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
   ASSERT(isolate != NULL && isolate->object_store() == this);
 
   const Library& async_lib = Library::Handle(async_library());
   ASSERT(!async_lib.IsNull());
-  Class& cls = Class::Handle(zone);
   cls = async_lib.LookupClass(Symbols::Future());
   ASSERT(!cls.IsNull());
   set_future_class(cls);
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index a4f0227..3b9a10b 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -76,6 +76,7 @@
   RW(Class, immutable_array_class)                                             \
   RW(Class, growable_object_array_class)                                       \
   RW(Class, linked_hash_map_class)                                             \
+  RW(Class, linked_hash_set_class)                                             \
   RW(Class, float32x4_class)                                                   \
   RW(Class, int32x4_class)                                                     \
   RW(Class, float64x2_class)                                                   \
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index cb5d990..c0d9526 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2474,7 +2474,7 @@
   Assembler _assembler_(&object_pool_builder);
   GenerateIncrement(&_assembler_);
   const Function& function = Function::Handle(CreateFunction("Test_Code"));
-  Code& code = Code::Handle(Code::FinalizeCode(
+  Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       function, nullptr, &_assembler_, Code::PoolAttachment::kAttachPool));
   function.AttachCode(code);
   const Instructions& instructions = Instructions::Handle(code.instructions());
@@ -2496,7 +2496,7 @@
   Assembler _assembler_(&object_pool_builder);
   GenerateIncrement(&_assembler_);
   const Function& function = Function::Handle(CreateFunction("Test_Code"));
-  Code& code = Code::Handle(Code::FinalizeCode(
+  Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       function, nullptr, &_assembler_, Code::PoolAttachment::kAttachPool));
   function.AttachCode(code);
   Instructions& instructions = Instructions::Handle(code.instructions());
@@ -2524,7 +2524,7 @@
   GenerateEmbedStringInCode(&_assembler_, kHello);
   const Function& function =
       Function::Handle(CreateFunction("Test_EmbedStringInCode"));
-  const Code& code = Code::Handle(Code::FinalizeCode(
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       function, nullptr, &_assembler_, Code::PoolAttachment::kAttachPool));
   function.AttachCode(code);
   const Object& result =
@@ -2547,7 +2547,7 @@
   GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
   const Function& function =
       Function::Handle(CreateFunction("Test_EmbedSmiInCode"));
-  const Code& code = Code::Handle(Code::FinalizeCode(
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       function, nullptr, &_assembler_, Code::PoolAttachment::kAttachPool));
   function.AttachCode(code);
   const Object& result =
@@ -2565,7 +2565,7 @@
   GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
   const Function& function =
       Function::Handle(CreateFunction("Test_EmbedSmiIn64BitCode"));
-  const Code& code = Code::Handle(Code::FinalizeCode(
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       function, nullptr, &_assembler_, Code::PoolAttachment::kAttachPool));
   function.AttachCode(code);
   const Object& result =
@@ -2594,9 +2594,9 @@
   ObjectPoolBuilder object_pool_builder;
   Assembler _assembler_(&object_pool_builder);
   GenerateIncrement(&_assembler_);
-  Code& code = Code::Handle(
-      Code::FinalizeCode(Function::Handle(CreateFunction("Test_Code")), nullptr,
-                         &_assembler_, Code::PoolAttachment::kAttachPool));
+  Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
+      Function::Handle(CreateFunction("Test_Code")), nullptr, &_assembler_,
+      Code::PoolAttachment::kAttachPool));
   code.set_exception_handlers(exception_handlers);
 
   // Verify the exception handler table entries by accessing them.
@@ -2636,9 +2636,9 @@
   ObjectPoolBuilder object_pool_builder;
   Assembler _assembler_(&object_pool_builder);
   GenerateIncrement(&_assembler_);
-  Code& code = Code::Handle(
-      Code::FinalizeCode(Function::Handle(CreateFunction("Test_Code")), nullptr,
-                         &_assembler_, Code::PoolAttachment::kAttachPool));
+  Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
+      Function::Handle(CreateFunction("Test_Code")), nullptr, &_assembler_,
+      Code::PoolAttachment::kAttachPool));
   code.set_pc_descriptors(descriptors);
 
   // Verify the PcDescriptor entries by accessing them.
@@ -2699,9 +2699,9 @@
   ObjectPoolBuilder object_pool_builder;
   Assembler _assembler_(&object_pool_builder);
   GenerateIncrement(&_assembler_);
-  Code& code = Code::Handle(
-      Code::FinalizeCode(Function::Handle(CreateFunction("Test_Code")), nullptr,
-                         &_assembler_, Code::PoolAttachment::kAttachPool));
+  Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
+      Function::Handle(CreateFunction("Test_Code")), nullptr, &_assembler_,
+      Code::PoolAttachment::kAttachPool));
   code.set_pc_descriptors(descriptors);
 
   // Verify the PcDescriptor entries by accessing them.
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index 6534a9b..600141e 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -8,17 +8,13 @@
 #include "vm/os.h"
 
 #include <errno.h>
-#include <lib/fdio/util.h>
+#include <fuchsia/timezone/cpp/fidl.h>
+#include <lib/sys/cpp/service_directory.h>
 #include <zircon/process.h>
 #include <zircon/syscalls.h>
 #include <zircon/syscalls/object.h>
 #include <zircon/types.h>
 
-#include <fuchsia/timezone/cpp/fidl.h>
-
-#include "lib/component/cpp/startup_context.h"
-#include "lib/svc/cpp/services.h"
-
 #include "platform/assert.h"
 #include "vm/zone.h"
 
@@ -65,15 +61,9 @@
 const char* OS::GetTimeZoneName(int64_t seconds_since_epoch) {
   // TODO(abarth): Handle time zone changes.
   static const auto* tz_name = new std::string([] {
-#ifdef USE_STD_FOR_NON_NULLABLE_FIDL_FIELDS
     std::string result;
     tz->GetTimezoneId(&result);
     return result;
-#else
-    fidl::StringPtr result;
-    tz->GetTimezoneId(&result);
-    return *result;
-#endif
   }());
   return tz_name->c_str();
 }
@@ -262,10 +252,8 @@
 }
 
 void OS::Init() {
-  auto environment_services = std::make_shared<component::Services>();
-  auto env_service_root = component::subtle::CreateStaticServiceRootHandle();
-  environment_services->Bind(std::move(env_service_root));
-  environment_services->ConnectToService(tz.NewRequest());
+  auto services = sys::ServiceDirectory::CreateFromNamespace();
+  services->Connect(tz.NewRequest());
 }
 
 void OS::Cleanup() {}
diff --git a/runtime/vm/os_thread.cc b/runtime/vm/os_thread.cc
index fa5e8ea..2cfe8fb 100644
--- a/runtime/vm/os_thread.cc
+++ b/runtime/vm/os_thread.cc
@@ -40,6 +40,7 @@
       log_(new class Log()),
       stack_base_(0),
       stack_limit_(0),
+      stack_headroom_(0),
       thread_(NULL) {
   // Try to get accurate stack bounds from pthreads, etc.
   if (!GetCurrentStackBounds(&stack_limit_, &stack_base_)) {
@@ -47,11 +48,14 @@
     RefineStackBoundsFromSP(GetCurrentStackPointer());
   }
 
+  stack_headroom_ = CalculateHeadroom(stack_base_ - stack_limit_);
+
   ASSERT(stack_base_ != 0);
   ASSERT(stack_limit_ != 0);
   ASSERT(stack_base_ > stack_limit_);
   ASSERT(stack_base_ > GetCurrentStackPointer());
   ASSERT(stack_limit_ < GetCurrentStackPointer());
+  RELEASE_ASSERT(HasStackHeadroom());
 }
 
 OSThread* OSThread::CreateOSThread() {
diff --git a/runtime/vm/os_thread.h b/runtime/vm/os_thread.h
index a82ef6f..9a95345 100644
--- a/runtime/vm/os_thread.h
+++ b/runtime/vm/os_thread.h
@@ -100,9 +100,10 @@
 
   uword stack_base() const { return stack_base_; }
   uword stack_limit() const { return stack_limit_; }
-  uword overflow_stack_limit() const { return stack_limit_ + kStackSizeBuffer; }
+  uword overflow_stack_limit() const { return stack_limit_ + stack_headroom_; }
 
-  bool HasStackHeadroom(intptr_t headroom = kStackSizeBuffer) {
+  bool HasStackHeadroom() { return HasStackHeadroom(stack_headroom_); }
+  bool HasStackHeadroom(intptr_t headroom) {
     return GetCurrentStackPointer() > (stack_limit_ + headroom);
   }
 
@@ -165,8 +166,10 @@
   // TODO(5411455): Use flag to override default value and Validate the
   // stack size by querying OS.
   static uword GetSpecifiedStackSize() {
-    ASSERT(OSThread::kStackSizeBuffer < OSThread::GetMaxStackSize());
-    uword stack_size = OSThread::GetMaxStackSize() - OSThread::kStackSizeBuffer;
+    intptr_t headroom =
+        OSThread::CalculateHeadroom(OSThread::GetMaxStackSize());
+    ASSERT(headroom < OSThread::GetMaxStackSize());
+    uword stack_size = OSThread::GetMaxStackSize() - headroom;
     return stack_size;
   }
   static BaseThread* GetCurrentTLS() {
@@ -209,7 +212,8 @@
   static void DisableOSThreadCreation();
   static void EnableOSThreadCreation();
 
-  static const intptr_t kStackSizeBuffer = (16 * KB * kWordSize);
+  static const intptr_t kStackSizeBufferMax = (16 * KB * kWordSize);
+  static constexpr float kStackSizeBufferFraction = 0.5;
 
   static const ThreadId kInvalidThreadId;
   static const ThreadJoinId kInvalidThreadJoinId;
@@ -237,6 +241,11 @@
   static void RemoveThreadFromList(OSThread* thread);
   static OSThread* CreateAndSetUnknownThread();
 
+  static uword CalculateHeadroom(uword stack_size) {
+    uword headroom = kStackSizeBufferFraction * stack_size;
+    return (headroom > kStackSizeBufferMax) ? kStackSizeBufferMax : headroom;
+  }
+
   static ThreadLocalKey thread_key_;
 
   const ThreadId id_;
@@ -260,6 +269,7 @@
   Log* log_;
   uword stack_base_;
   uword stack_limit_;
+  uword stack_headroom_;
   ThreadState* thread_;
 
   // thread_list_lock_ cannot have a static lifetime because the order in which
diff --git a/runtime/vm/os_thread_android.cc b/runtime/vm/os_thread_android.cc
index e03d9b7..093795d 100644
--- a/runtime/vm/os_thread_android.cc
+++ b/runtime/vm/os_thread_android.cc
@@ -119,6 +119,9 @@
   uword parameter = data->parameter();
   delete data;
 
+  // Set the thread name.
+  pthread_setname_np(pthread_self(), name);
+
   // Create new OSThread object and set as TLS for new thread.
   OSThread* thread = OSThread::CreateOSThread();
   if (thread != NULL) {
diff --git a/runtime/vm/os_thread_fuchsia.cc b/runtime/vm/os_thread_fuchsia.cc
index b465e07..d6fd956 100644
--- a/runtime/vm/os_thread_fuchsia.cc
+++ b/runtime/vm/os_thread_fuchsia.cc
@@ -12,9 +12,7 @@
 #include <errno.h>  // NOLINT
 #include <zircon/status.h>
 #include <zircon/syscalls.h>
-#include <zircon/syscalls/object.h>
 #include <zircon/threads.h>
-#include <zircon/tls.h>
 #include <zircon/types.h>
 
 #include "platform/address_sanitizer.h"
diff --git a/runtime/vm/os_thread_linux.cc b/runtime/vm/os_thread_linux.cc
index 8c9fa0f..0003ee2 100644
--- a/runtime/vm/os_thread_linux.cc
+++ b/runtime/vm/os_thread_linux.cc
@@ -121,6 +121,9 @@
   uword parameter = data->parameter();
   delete data;
 
+  // Set the thread name.
+  pthread_setname_np(pthread_self(), name);
+
   // Create new OSThread object and set as TLS for new thread.
   OSThread* thread = OSThread::CreateOSThread();
   if (thread != NULL) {
diff --git a/runtime/vm/os_thread_macos.cc b/runtime/vm/os_thread_macos.cc
index 0fff6fd..eecfe67 100644
--- a/runtime/vm/os_thread_macos.cc
+++ b/runtime/vm/os_thread_macos.cc
@@ -97,6 +97,9 @@
   uword parameter = data->parameter();
   delete data;
 
+  // Set the thread name.
+  pthread_setname_np(name);
+
   // Create new OSThread object and set as TLS for new thread.
   OSThread* thread = OSThread::CreateOSThread();
   if (thread != NULL) {
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index ad1c9b0..b4b4135 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -51,7 +51,6 @@
       code_(Code::Handle(zone(), function.unoptimized_code())),
       node_sequence_(NULL),
       regexp_compile_data_(NULL),
-      instantiator_(NULL),
       function_type_arguments_(NULL),
       parent_type_arguments_(NULL),
       current_context_var_(NULL),
@@ -66,7 +65,8 @@
       first_parameter_index_(),
       num_stack_locals_(0),
       have_seen_await_expr_(false),
-      kernel_scopes_(NULL) {
+      kernel_scopes_(NULL),
+      default_function_type_arguments_(TypeArguments::ZoneHandle(zone())) {
   ASSERT(function.IsZoneHandle());
   // Every function has a local variable for the current context.
   LocalVariable* temp = new (zone())
@@ -216,16 +216,20 @@
 
   raw_parameters_ = new (Z) ZoneGrowableArray<LocalVariable*>(Z, num_params);
   for (intptr_t param = 0; param < num_params; ++param) {
-    LocalVariable* raw_parameter = scope->VariableAt(param);
-    if (raw_parameter->is_captured()) {
+    LocalVariable* variable = scope->VariableAt(param);
+    LocalVariable* raw_parameter = variable;
+    if (variable->is_captured()) {
       String& tmp = String::ZoneHandle(Z);
-      tmp = Symbols::FromConcat(T, Symbols::OriginalParam(),
-                                raw_parameter->name());
+      tmp = Symbols::FromConcat(T, Symbols::OriginalParam(), variable->name());
 
       RELEASE_ASSERT(scope->LocalLookupVariable(tmp) == NULL);
-      raw_parameter = new LocalVariable(raw_parameter->declaration_token_pos(),
-                                        raw_parameter->token_pos(), tmp,
-                                        raw_parameter->type());
+      raw_parameter =
+          new LocalVariable(variable->declaration_token_pos(),
+                            variable->token_pos(), tmp, variable->type());
+      if (variable->is_explicit_covariant_parameter()) {
+        raw_parameter->set_is_explicit_covariant_parameter();
+      }
+      raw_parameter->set_type_check_mode(variable->type_check_mode());
       if (function().HasOptionalParameters()) {
         bool ok = scope->AddVariable(raw_parameter);
         ASSERT(ok);
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index da1c949..bc7b0d2 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -64,12 +64,6 @@
   }
   void SetRegExpCompileData(RegExpCompileData* regexp_compile_data);
 
-  LocalVariable* instantiator() const { return instantiator_; }
-  void set_instantiator(LocalVariable* instantiator) {
-    ASSERT(instantiator != NULL);
-    instantiator_ = instantiator;
-  }
-
   LocalVariable* function_type_arguments() const {
     return function_type_arguments_;
   }
@@ -90,7 +84,7 @@
 #if defined(DEBUG)
     if (list == NULL) return;
     for (intptr_t i = 0; i < list->length(); i++) {
-      ASSERT(list->At(i)->IsZoneHandle() || list->At(i)->InVMHeap());
+      ASSERT(list->At(i)->IsZoneHandle() || list->At(i)->IsReadOnly());
     }
 #endif
   }
@@ -167,13 +161,13 @@
   void record_await() { have_seen_await_expr_ = true; }
   bool have_seen_await() const { return have_seen_await_expr_; }
   bool is_forwarding_stub() const {
-    return forwarding_stub_super_target_ != -1;
+    return forwarding_stub_super_target_ != nullptr;
   }
-  kernel::NameIndex forwarding_stub_super_target() const {
+  const Function* forwarding_stub_super_target() const {
     return forwarding_stub_super_target_;
   }
-  void MarkForwardingStub(kernel::NameIndex target) {
-    forwarding_stub_super_target_ = target;
+  void MarkForwardingStub(const Function* forwarding_target) {
+    forwarding_stub_super_target_ = forwarding_target;
   }
 
   Thread* thread() const { return thread_; }
@@ -204,13 +198,20 @@
     return raw_parameters_->At(i);
   }
 
+  void SetDefaultFunctionTypeArguments(const TypeArguments& value) {
+    default_function_type_arguments_ = value.raw();
+  }
+
+  const TypeArguments& DefaultFunctionTypeArguments() const {
+    return default_function_type_arguments_;
+  }
+
  private:
   Thread* thread_;
   const Function& function_;
   Code& code_;
   SequenceNode* node_sequence_;
   RegExpCompileData* regexp_compile_data_;
-  LocalVariable* instantiator_;
   LocalVariable* function_type_arguments_;
   LocalVariable* parent_type_arguments_;
   LocalVariable* current_context_var_;
@@ -229,9 +230,11 @@
   int num_stack_locals_;
   bool have_seen_await_expr_;
 
-  kernel::NameIndex forwarding_stub_super_target_;
+  const Function* forwarding_stub_super_target_ = nullptr;
   kernel::ScopeBuildingResult* kernel_scopes_;
 
+  TypeArguments& default_function_type_arguments_;
+
   friend class Parser;
   DISALLOW_COPY_AND_ASSIGN(ParsedFunction);
 };
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 5ff50f6..9db291da3 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -23,6 +23,7 @@
 #include "vm/signal_handler.h"
 #include "vm/simulator.h"
 #include "vm/stack_frame.h"
+#include "vm/version.h"
 
 namespace dart {
 
@@ -1117,9 +1118,9 @@
   ASSERT(os_thread != NULL);
   Isolate* isolate = Isolate::Current();
   const char* name = isolate == NULL ? NULL : isolate->name();
-  OS::PrintErr("thread=%" Pd ", isolate=%s(%p)\n",
-               OSThread::ThreadIdToIntPtr(os_thread->trace_id()), name,
-               isolate);
+  OS::PrintErr(
+      "version=%s\nthread=%" Pd ", isolate=%s(%p)\n", Version::String(),
+      OSThread::ThreadIdToIntPtr(os_thread->trace_id()), name, isolate);
 
   if (!InitialRegisterCheck(pc, fp, sp)) {
     OS::PrintErr("Stack dump aborted because InitialRegisterCheck failed.\n");
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index cb891a5..68518e3 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -732,6 +732,11 @@
     timeline_trie_ = trie;
   }
 
+  ProfileTrieNode* timeline_code_trie() const { return timeline_code_trie_; }
+  void set_timeline_code_trie(ProfileTrieNode* trie) {
+    timeline_code_trie_ = trie;
+  }
+
  private:
   void FixupCaller(const CodeLookupTable& clt,
                    uword pc_marker,
@@ -753,6 +758,7 @@
   uword native_allocation_address_;
   uintptr_t native_allocation_size_bytes_;
   ProfileTrieNode* timeline_trie_;
+  ProfileTrieNode* timeline_code_trie_;
 
   friend class SampleBuffer;
   DISALLOW_COPY_AND_ASSIGN(ProcessedSample);
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index 4251002..0b9c746 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -4,6 +4,7 @@
 
 #include "vm/profiler_service.h"
 
+#include "platform/text_buffer.h"
 #include "vm/growable_array.h"
 #include "vm/hash_map.h"
 #include "vm/log.h"
@@ -14,6 +15,7 @@
 #include "vm/profiler.h"
 #include "vm/reusable_handles.h"
 #include "vm/scope_timer.h"
+#include "vm/timeline.h"
 
 namespace dart {
 
@@ -857,6 +859,7 @@
       exclusive_allocations_(0),
       inclusive_allocations_(0),
       children_(0),
+      parent_(NULL),
       frame_id_(-1) {
   ASSERT(table_index_ >= 0);
 }
@@ -909,6 +912,10 @@
     }
   }
 
+  const char* ToCString(Profile* profile) const {
+    return profile->GetCode(table_index())->name();
+  }
+
   ProfileCodeTrieNode* GetChild(intptr_t child_table_index) {
     const intptr_t length = NumChildren();
     intptr_t i = 0;
@@ -983,6 +990,11 @@
     }
   }
 
+  const char* ToCString(Profile* profile) const {
+    ProfileFunction* f = profile->GetFunction(table_index());
+    return f->Name();
+  }
+
   ProfileFunctionTrieNode* GetChild(intptr_t child_table_index) {
     const intptr_t length = NumChildren();
     intptr_t i = 0;
@@ -1443,6 +1455,8 @@
       if (!sample->first_frame_executing()) {
         current = AppendExitFrame(sample->vm_tag(), current, sample);
       }
+
+      sample->set_timeline_code_trie(current);
     }
   }
 
@@ -1487,6 +1501,8 @@
       if (sample->truncated()) {
         current = AppendTruncatedTag(current, sample);
       }
+
+      sample->set_timeline_code_trie(current);
     }
   }
 
@@ -2462,6 +2478,50 @@
   }
 }
 
+void Profile::AddParentTriePointers(ProfileTrieNode* current,
+                                    ProfileTrieNode* parent) {
+  if (current == NULL) {
+    ProfileTrieNode* root = GetTrieRoot(kInclusiveCode);
+    AddParentTriePointers(root, NULL);
+    return;
+  }
+
+  current->set_parent(parent);
+  for (int i = 0; i < current->NumChildren(); i++) {
+    AddParentTriePointers(current->At(i), current);
+  }
+}
+
+void Profile::PrintBacktrace(ProfileTrieNode* node, TextBuffer* buf) {
+  ProfileTrieNode* current = node;
+  while (current != NULL) {
+    buf->AddString(current->ToCString(this));
+    buf->AddString("\n");
+    current = current->parent();
+  }
+}
+
+void Profile::AddToTimeline() {
+  TimelineStream* stream = Timeline::GetProfilerStream();
+  if (stream == NULL) {
+    return;
+  }
+  AddParentTriePointers(NULL, NULL);
+  for (intptr_t sample_index = 0; sample_index < samples_->length();
+       sample_index++) {
+    TextBuffer buf(256);
+    ProcessedSample* sample = samples_->At(sample_index);
+    PrintBacktrace(sample->timeline_code_trie(), &buf);
+    TimelineEvent* event = stream->StartEvent();
+    event->Instant("Dart CPU sample", sample->timestamp());
+    event->set_owns_label(false);
+    event->SetNumArguments(1);
+    event->SetArgument(0, "backtrace", buf.Steal());
+    event->Complete();
+    event = NULL;  // Complete() deletes the event.
+  }
+}
+
 ProfileFunction* Profile::FindFunction(const Function& function) {
   return (functions_ != NULL) ? functions_->Lookup(function) : NULL;
 }
@@ -2685,7 +2745,7 @@
                                     intptr_t extra_tags,
                                     SampleFilter* filter,
                                     SampleBuffer* sample_buffer,
-                                    bool as_timeline) {
+                                    PrintKind kind) {
   Isolate* isolate = thread->isolate();
   // Disable thread interrupts while processing the buffer.
   DisableThreadInterruptsScope dtis(thread);
@@ -2700,10 +2760,12 @@
     HANDLESCOPE(thread);
     Profile profile(isolate);
     profile.Build(thread, filter, sample_buffer, tag_order, extra_tags);
-    if (as_timeline) {
+    if (kind == kAsTimeline) {
       profile.PrintTimelineJSON(stream);
-    } else {
+    } else if (kind == kAsProfile) {
       profile.PrintProfileJSON(stream);
+    } else if (kind == kAsPlatformTimeline) {
+      profile.AddToTimeline();
     }
   }
 }
@@ -2731,9 +2793,8 @@
   Isolate* isolate = thread->isolate();
   NoAllocationSampleFilter filter(isolate->main_port(), Thread::kMutatorTask,
                                   time_origin_micros, time_extent_micros);
-  const bool as_timeline = false;
   PrintJSONImpl(thread, stream, tag_order, extra_tags, &filter,
-                Profiler::sample_buffer(), as_timeline);
+                Profiler::sample_buffer(), kAsProfile);
 }
 
 class ClassAllocationSampleFilter : public SampleFilter {
@@ -2770,9 +2831,8 @@
   ClassAllocationSampleFilter filter(isolate->main_port(), cls,
                                      Thread::kMutatorTask, time_origin_micros,
                                      time_extent_micros);
-  const bool as_timeline = false;
   PrintJSONImpl(thread, stream, tag_order, kNoExtraTags, &filter,
-                Profiler::sample_buffer(), as_timeline);
+                Profiler::sample_buffer(), kAsProfile);
 }
 
 void ProfilerService::PrintNativeAllocationJSON(JSONStream* stream,
@@ -2781,9 +2841,8 @@
                                                 int64_t time_extent_micros) {
   Thread* thread = Thread::Current();
   NativeAllocationSampleFilter filter(time_origin_micros, time_extent_micros);
-  const bool as_timeline = false;
   PrintJSONImpl(thread, stream, tag_order, kNoExtraTags, &filter,
-                Profiler::allocation_sample_buffer(), as_timeline);
+                Profiler::allocation_sample_buffer(), kAsProfile);
 }
 
 void ProfilerService::PrintTimelineJSON(JSONStream* stream,
@@ -2797,9 +2856,21 @@
                                     Thread::kSweeperTask | Thread::kMarkerTask;
   NoAllocationSampleFilter filter(isolate->main_port(), thread_task_mask,
                                   time_origin_micros, time_extent_micros);
-  const bool as_timeline = true;
   PrintJSONImpl(thread, stream, tag_order, kNoExtraTags, &filter,
-                Profiler::sample_buffer(), as_timeline);
+                Profiler::sample_buffer(), kAsTimeline);
+}
+
+void ProfilerService::AddToTimeline() {
+  JSONStream stream;
+  Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
+  const intptr_t thread_task_mask = Thread::kMutatorTask |
+                                    Thread::kCompilerTask |
+                                    Thread::kSweeperTask | Thread::kMarkerTask;
+  NoAllocationSampleFilter filter(isolate->main_port(), thread_task_mask, -1,
+                                  -1);
+  PrintJSONImpl(thread, &stream, Profile::kNoTags, kNoExtraTags, &filter,
+                Profiler::sample_buffer(), kAsPlatformTimeline);
 }
 
 void ProfilerService::ClearSamples() {
diff --git a/runtime/vm/profiler_service.h b/runtime/vm/profiler_service.h
index 6e7d660..93fb9c8 100644
--- a/runtime/vm/profiler_service.h
+++ b/runtime/vm/profiler_service.h
@@ -5,6 +5,7 @@
 #ifndef RUNTIME_VM_PROFILER_SERVICE_H_
 #define RUNTIME_VM_PROFILER_SERVICE_H_
 
+#include "platform/text_buffer.h"
 #include "vm/allocation.h"
 #include "vm/code_observers.h"
 #include "vm/globals.h"
@@ -32,6 +33,7 @@
 class SampleFilter;
 class ProcessedSample;
 class ProcessedSampleBuffer;
+class Profile;
 
 class ProfileFunctionSourcePosition {
  public:
@@ -294,6 +296,8 @@
 
   virtual void PrintToJSONArray(JSONArray* array) const = 0;
 
+  virtual const char* ToCString(Profile* profile) const = 0;
+
   // Index into function or code tables.
   intptr_t table_index() const { return table_index_; }
 
@@ -316,6 +320,9 @@
 
   ProfileTrieNode* At(intptr_t i) { return children_.At(i); }
 
+  ProfileTrieNode* parent() const { return parent_; }
+  void set_parent(ProfileTrieNode* p) { parent_ = p; }
+
   intptr_t IndexOf(ProfileTrieNode* node);
 
   intptr_t frame_id() const { return frame_id_; }
@@ -339,6 +346,7 @@
   intptr_t exclusive_allocations_;
   intptr_t inclusive_allocations_;
   ZoneGrowableArray<ProfileTrieNode*> children_;
+  ProfileTrieNode* parent_;
   intptr_t frame_id_;
 
   friend class ProfileBuilder;
@@ -388,9 +396,15 @@
   void PrintProfileJSON(JSONStream* stream);
   void PrintTimelineJSON(JSONStream* stream);
 
+  // Serializes sample backtraces into arguments on Instant events and adds them
+  // directly to the timeline.
+  void AddToTimeline();
+
   ProfileFunction* FindFunction(const Function& function);
 
  private:
+  void AddParentTriePointers(ProfileTrieNode* current, ProfileTrieNode* parent);
+  void PrintBacktrace(ProfileTrieNode* node, TextBuffer* buf);
   void PrintHeaderJSON(JSONObject* obj);
   void PrintTimelineFrameJSON(JSONObject* frames,
                               ProfileTrieNode* current,
@@ -485,16 +499,24 @@
                                 int64_t time_origin_micros,
                                 int64_t time_extent_micros);
 
+  static void AddToTimeline();
+
   static void ClearSamples();
 
  private:
+  enum PrintKind {
+    kAsProfile,
+    kAsTimeline,
+    kAsPlatformTimeline,
+  };
+
   static void PrintJSONImpl(Thread* thread,
                             JSONStream* stream,
                             Profile::TagOrder tag_order,
                             intptr_t extra_tags,
                             SampleFilter* filter,
                             SampleBuffer* sample_buffer,
-                            bool as_timline);
+                            PrintKind kind);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/program_visitor.cc b/runtime/vm/program_visitor.cc
index 8260a86..3026dba 100644
--- a/runtime/vm/program_visitor.cc
+++ b/runtime/vm/program_visitor.cc
@@ -81,8 +81,8 @@
     fields_ = cls.fields();
     for (intptr_t j = 0; j < fields_.Length(); j++) {
       field_ ^= fields_.At(j);
-      if (field_.is_static() && field_.HasInitializer()) {
-        function_ ^= field_.Initializer();
+      if (field_.is_static() && field_.HasInitializerFunction()) {
+        function_ ^= field_.InitializerFunction();
         visitor_->Visit(function_);
       }
     }
@@ -653,7 +653,8 @@
         if (FLAG_precompiled_mode) {
           if (!function.IsSignatureFunction() &&
               !function.IsClosureFunction() &&
-              (function.name() != Symbols::Call().raw()) && !list_.InVMHeap()) {
+              (function.name() != Symbols::Call().raw()) &&
+              !list_.IsReadOnly()) {
             // Parameter types not needed for function type tests.
             for (intptr_t i = 0; i < list_.Length(); i++) {
               list_.SetAt(i, Object::dynamic_type());
@@ -668,7 +669,7 @@
       if (!list_.IsNull()) {
         // Preserve parameter names in case of recompilation for the JIT.
         if (FLAG_precompiled_mode) {
-          if (!function.HasOptionalNamedParameters() && !list_.InVMHeap()) {
+          if (!function.HasOptionalNamedParameters() && !list_.IsReadOnly()) {
             // Parameter names not needed for resolution.
             for (intptr_t i = 0; i < list_.Length(); i++) {
               list_.SetAt(i, Symbols::OptimizedOut());
@@ -681,7 +682,7 @@
     }
 
     RawArray* DedupList(const Array& list) {
-      if (list.InVMHeap()) {
+      if (list.IsReadOnly()) {
         // Avoid using read-only VM objects for de-duplication.
         return list.raw();
       }
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 3fecf1c..5cd9448 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -121,7 +121,7 @@
     kOldBit = 3,                  // Incremental barrier source.
     kOldAndNotRememberedBit = 4,  // Generational barrier source.
     kCanonicalBit = 5,
-    kVMHeapObjectBit = 6,
+    kReadOnlyBit = 6,
     kGraphMarkedBit = 7,  // ObjectGraph needs to mark through new space.
 
     kSizeTagPos = 8,
@@ -190,13 +190,11 @@
 
   class NewBit : public BitField<uint32_t, bool, kNewBit, 1> {};
 
-  class CanonicalObjectTag : public BitField<uint32_t, bool, kCanonicalBit, 1> {
-  };
+  class CanonicalBit : public BitField<uint32_t, bool, kCanonicalBit, 1> {};
 
   class GraphMarkedBit : public BitField<uint32_t, bool, kGraphMarkedBit, 1> {};
 
-  class VMHeapObjectTag : public BitField<uint32_t, bool, kVMHeapObjectBit, 1> {
-  };
+  class ReadOnlyBit : public BitField<uint32_t, bool, kReadOnlyBit, 1> {};
 
   class OldBit : public BitField<uint32_t, bool, kOldBit, 1> {};
 
@@ -250,7 +248,8 @@
     return (addr & kObjectAlignmentMask) != kOldObjectBits;
   }
 
-  // Support for GC marking bit.
+  // Support for GC marking bit. Marked objects are either grey (not yet
+  // visited) or black (already visited).
   bool IsMarked() const {
     ASSERT(IsOldObject());
     return !OldAndNotMarkedBit::decode(ptr()->tags_);
@@ -278,25 +277,33 @@
     return TryClearTagBit<OldAndNotMarkedBit>();
   }
 
-  // Support for object tags.
-  bool IsCanonical() const { return CanonicalObjectTag::decode(ptr()->tags_); }
-  void SetCanonical() { UpdateTagBit<CanonicalObjectTag>(true); }
-  void ClearCanonical() { UpdateTagBit<CanonicalObjectTag>(false); }
-  bool IsVMHeapObject() const { return VMHeapObjectTag::decode(ptr()->tags_); }
-  void SetVMHeapObject() { UpdateTagBit<VMHeapObjectTag>(true); }
+  // Canonical objects have the property that two canonical objects are
+  // logically equal iff they are the same object (pointer equal).
+  bool IsCanonical() const { return CanonicalBit::decode(ptr()->tags_); }
+  void SetCanonical() { UpdateTagBit<CanonicalBit>(true); }
+  void ClearCanonical() { UpdateTagBit<CanonicalBit>(false); }
 
-  // Support for ObjectGraph marking bit.
+  // Objects in the VM-isolate's heap or on an image page from an AppJIT or
+  // AppAOT snapshot are permanently read-only. They may never be modified
+  // again. In particular, they cannot be marked.
+  bool IsReadOnly() const { return ReadOnlyBit::decode(ptr()->tags_); }
+  void SetReadOnlyUnsynchronized() {
+    ptr()->tags_ = ReadOnlyBit::update(true, ptr()->tags_);
+  }
+
+  // Support for ObjectGraph marking bit, used by various tools provided by the
+  // VM-service.
   bool IsGraphMarked() const {
-    if (IsVMHeapObject()) return true;
+    if (IsReadOnly()) return true;
     return GraphMarkedBit::decode(ptr()->tags_);
   }
   void SetGraphMarked() {
-    ASSERT(!IsVMHeapObject());
+    ASSERT(!IsReadOnly());
     uint32_t tags = ptr()->tags_;
     ptr()->tags_ = GraphMarkedBit::update(true, tags);
   }
   void ClearGraphMarked() {
-    ASSERT(!IsVMHeapObject());
+    ASSERT(!IsReadOnly());
     uint32_t tags = ptr()->tags_;
     ptr()->tags_ = GraphMarkedBit::update(false, tags);
   }
@@ -316,6 +323,13 @@
     UpdateTagBit<OldAndNotRememberedBit>(true);
   }
 
+  DART_FORCE_INLINE
+  void AddToRememberedSet(Thread* thread) {
+    ASSERT(!this->IsRemembered());
+    this->SetRememberedBit();
+    thread->StoreBufferAddObject(this);
+  }
+
   bool IsCardRemembered() const {
     return CardRememberedBit::decode(ptr()->tags_);
   }
@@ -456,12 +470,10 @@
     return reinterpret_cast<uword>(raw_obj->ptr());
   }
 
-  static bool IsVMHeapObject(intptr_t value) {
-    return VMHeapObjectTag::decode(value);
-  }
+  static bool IsReadOnly(intptr_t value) { return ReadOnlyBit::decode(value); }
 
   static bool IsCanonical(intptr_t value) {
-    return CanonicalObjectTag::decode(value);
+    return CanonicalBit::decode(value);
   }
 
   // Class Id predicates.
@@ -578,9 +590,7 @@
       if (value->IsNewObject()) {
         // Generational barrier: record when a store creates an
         // old-and-not-remembered -> new reference.
-        ASSERT(!this->IsRemembered());
-        this->SetRememberedBit();
-        thread->StoreBufferAddObject(this);
+        AddToRememberedSet(thread);
       } else {
         // Incremental barrier: record when a store creates an
         // old -> old-and-not-marked reference.
@@ -907,7 +917,8 @@
   RawArray* parameter_types_;
   RawArray* parameter_names_;
   RawTypeArguments* type_parameters_;  // Array of TypeParameter.
-  RawObject* data_;  // Additional data specific to the function kind.
+  RawObject* data_;  // Additional data specific to the function kind. See
+                     // Function::set_data() for details.
   RawObject** to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
@@ -1040,7 +1051,7 @@
     RawInstance* static_value_;  // Value for static fields.
     RawSmi* offset_;             // Offset in words for instance fields.
   } value_;
-  RawFunction* initializer_;  // Static initializer function.
+  RawFunction* initializer_function_;  // Static initializer function.
   // When generating APPJIT snapshots after running the application it is
   // necessary to save the initial value of static fields so that we can
   // restore the value back to the original initial value.
@@ -1056,7 +1067,7 @@
       case Snapshot::kFullJIT:
         return reinterpret_cast<RawObject**>(&ptr()->dependent_code_);
       case Snapshot::kFullAOT:
-        return reinterpret_cast<RawObject**>(&ptr()->initializer_);
+        return reinterpret_cast<RawObject**>(&ptr()->initializer_function_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
       case Snapshot::kInvalid:
@@ -1912,6 +1923,15 @@
 };
 
 class RawTypeParameter : public RawAbstractType {
+ public:
+  enum {
+    kFinalizedBit = 0,
+    kGenericCovariantImplBit,
+  };
+  class FinalizedBit : public BitField<uint8_t, bool, kFinalizedBit, 1> {};
+  class GenericCovariantImplBit
+      : public BitField<uint8_t, bool, kGenericCovariantImplBit, 1> {};
+
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameter);
 
@@ -1924,7 +1944,7 @@
   classid_t parameterized_class_id_;
   TokenPosition token_pos_;
   int16_t index_;
-  int8_t type_state_;
+  uint8_t flags_;
 
   RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
 
@@ -2243,8 +2263,8 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(Pointer);
   VISIT_FROM(RawCompressed, type_arguments_)
   RawTypeArguments* type_arguments_;
-  VISIT_TO(RawCompressed, type_arguments_)
-  uint8_t* c_memory_address_;
+  RawInteger* c_memory_address_;
+  VISIT_TO(RawCompressed, c_memory_address_)
 
   friend class Pointer;
 };
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index 7332edb..f1dc7cc 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -56,7 +56,7 @@
   F(Field, guarded_list_length_)                                               \
   F(Field, dependent_code_)                                                    \
   F(Field, type_test_cache_)                                                   \
-  F(Field, initializer_)                                                       \
+  F(Field, initializer_function_)                                              \
   F(Script, url_)                                                              \
   F(Script, resolved_url_)                                                     \
   F(Script, compile_time_constants_)                                           \
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 2222f8d..f743ea6 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -29,10 +29,8 @@
 // allocations may happen.
 #define READ_OBJECT_FIELDS(object, from, to, as_reference)                     \
   intptr_t num_flds = (to) - (from);                                           \
-  intptr_t from_offset = OFFSET_OF_FROM(object);                               \
   for (intptr_t i = 0; i <= num_flds; i++) {                                   \
-    (*reader->PassiveObjectHandle()) =                                         \
-        reader->ReadObjectImpl(as_reference, object_id, (i + from_offset));    \
+    (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(as_reference);   \
     object.StorePointer(((from) + i), reader->PassiveObjectHandle()->raw());   \
   }
 
@@ -96,16 +94,12 @@
   ASSERT(reader != NULL);
 
   // Determine if the type class of this type is in the full snapshot.
-  bool typeclass_is_in_fullsnapshot = reader->Read<bool>();
+  reader->Read<bool>();
 
   // Allocate type object.
   Type& type = Type::ZoneHandle(reader->zone(), Type::New());
   bool is_canonical = RawObject::IsCanonical(tags);
-  bool defer_canonicalization =
-      is_canonical &&
-      ((kind == Snapshot::kMessage) ||
-       (!Snapshot::IsFull(kind) && typeclass_is_in_fullsnapshot));
-  reader->AddBackRef(object_id, &type, kIsDeserialized, defer_canonicalization);
+  reader->AddBackRef(object_id, &type, kIsDeserialized);
 
   // Set all non object fields.
   type.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
@@ -115,16 +109,15 @@
   reader->EnqueueTypePostprocessing(type);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(type, type.raw()->from(), type.raw()->to(), kAsReference);
+  READ_OBJECT_FIELDS(type, type.raw()->from(), type.raw()->to(), as_reference);
 
   // Read in the type class.
   (*reader->ClassHandle()) =
-      Class::RawCast(reader->ReadObjectImpl(kAsReference));
+      Class::RawCast(reader->ReadObjectImpl(as_reference));
   type.set_type_class(*reader->ClassHandle());
 
-  // Set the canonical bit.
-  if (!defer_canonicalization && is_canonical) {
-    type.SetCanonical();
+  if (is_canonical) {
+    type ^= type.Canonicalize();
   }
 
   // Fill in the type testing stub.
@@ -177,11 +170,11 @@
 
   // Write out all the object pointer fields.
   ASSERT(ptr()->type_class_id_ != Object::null());
-  SnapshotWriterVisitor visitor(writer, kAsReference);
+  SnapshotWriterVisitor visitor(writer, as_reference);
   visitor.VisitPointers(from(), to());
 
   // Write out the type class.
-  writer->WriteObjectImpl(type_class, kAsReference);
+  writer->WriteObjectImpl(type_class, as_reference);
 }
 
 RawTypeRef* TypeRef::ReadFrom(SnapshotReader* reader,
@@ -244,7 +237,7 @@
   type_parameter.set_token_pos(
       TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
   type_parameter.set_index(reader->Read<int16_t>());
-  type_parameter.set_type_state(reader->Read<int8_t>());
+  type_parameter.set_flags(reader->Read<uint8_t>());
 
   // Read the code object for the type testing stub and set its entrypoint.
   reader->EnqueueTypePostprocessing(type_parameter);
@@ -273,7 +266,7 @@
   ASSERT(writer != NULL);
 
   // Only finalized type parameters should be written to a snapshot.
-  ASSERT(ptr()->type_state_ == RawTypeParameter::kFinalizedUninstantiated);
+  ASSERT(FinalizedBit::decode(ptr()->flags_));
 
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
@@ -285,7 +278,7 @@
   // Write out all the non object pointer fields.
   writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode());
   writer->Write<int16_t>(ptr()->index_);
-  writer->Write<int8_t>(ptr()->type_state_);
+  writer->Write<uint8_t>(ptr()->flags_);
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer, kAsReference);
@@ -310,26 +303,20 @@
   TypeArguments& type_arguments =
       TypeArguments::ZoneHandle(reader->zone(), TypeArguments::New(len));
   bool is_canonical = RawObject::IsCanonical(tags);
-  bool defer_canonicalization = is_canonical && (!Snapshot::IsFull(kind));
-  reader->AddBackRef(object_id, &type_arguments, kIsDeserialized,
-                     defer_canonicalization);
+  reader->AddBackRef(object_id, &type_arguments, kIsDeserialized);
 
   // Set the instantiations field, which is only read from a full snapshot.
   type_arguments.set_instantiations(Object::zero_array());
 
   // Now set all the type fields.
-  intptr_t offset =
-      type_arguments.TypeAddr(0) -
-      reinterpret_cast<RawAbstractType**>(type_arguments.raw()->ptr());
   for (intptr_t i = 0; i < len; i++) {
-    *reader->TypeHandle() ^=
-        reader->ReadObjectImpl(kAsReference, object_id, (i + offset));
+    *reader->TypeHandle() ^= reader->ReadObjectImpl(as_reference);
     type_arguments.SetTypeAt(i, *reader->TypeHandle());
   }
 
   // Set the canonical bit.
-  if (!defer_canonicalization && is_canonical) {
-    type_arguments.SetCanonical();
+  if (is_canonical) {
+    type_arguments ^= type_arguments.Canonicalize();
   }
 
   return type_arguments.raw();
@@ -368,10 +355,10 @@
       if (!writer->AllowObjectsInDartLibrary(type_class->ptr()->library_)) {
         writer->WriteVMIsolateObject(kDynamicType);
       } else {
-        writer->WriteObjectImpl(ptr()->types()[i], kAsReference);
+        writer->WriteObjectImpl(ptr()->types()[i], as_reference);
       }
     } else {
-      writer->WriteObjectImpl(ptr()->types()[i], kAsReference);
+      writer->WriteObjectImpl(ptr()->types()[i], as_reference);
     }
   }
 }
@@ -1490,10 +1477,7 @@
   reader->AddBackRef(object_id, &array, kIsDeserialized);
 
   // Read type arguments of growable array object.
-  const intptr_t typeargs_offset =
-      GrowableObjectArray::type_arguments_offset() / kWordSize;
-  *reader->TypeArgumentsHandle() ^=
-      reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset);
+  *reader->TypeArgumentsHandle() ^= reader->ReadObjectImpl(kAsInlinedObject);
   array.StorePointer(&array.raw_ptr()->type_arguments_,
                      reader->TypeArgumentsHandle()->raw());
 
@@ -1544,10 +1528,7 @@
   reader->AddBackRef(object_id, &map, kIsDeserialized);
 
   // Read the type arguments.
-  const intptr_t typeargs_offset =
-      GrowableObjectArray::type_arguments_offset() / kWordSize;
-  *reader->TypeArgumentsHandle() ^=
-      reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset);
+  *reader->TypeArgumentsHandle() ^= reader->ReadObjectImpl(kAsInlinedObject);
   map.SetTypeArguments(*reader->TypeArgumentsHandle());
 
   // Read the number of key/value pairs.
diff --git a/runtime/vm/regexp.cc b/runtime/vm/regexp.cc
index 909f00a..9e7e8bb 100644
--- a/runtime/vm/regexp.cc
+++ b/runtime/vm/regexp.cc
@@ -979,7 +979,7 @@
     }
     case 4:
       macro_assembler->CheckCharacter(chars[3], &ok);
-    // Fall through!
+      FALL_THROUGH;
     case 3:
       macro_assembler->CheckCharacter(chars[0], &ok);
       macro_assembler->CheckCharacter(chars[1], &ok);
diff --git a/runtime/vm/regexp_parser.cc b/runtime/vm/regexp_parser.cc
index cbe851c..10c9c00 100644
--- a/runtime/vm/regexp_parser.cc
+++ b/runtime/vm/regexp_parser.cc
@@ -476,8 +476,8 @@
               Advance(2);
               break;
             }
+            FALL_THROUGH;
           }
-          // FALLTHROUGH
           case '0': {
             Advance();
             uint32_t octal = ParseOctalLiteral();
@@ -557,8 +557,8 @@
           ReportError("Nothing to repeat");
           UNREACHABLE();
         }
+        FALL_THROUGH;
       }
-      /* Falls through */
       default:
         builder->AddCharacter(current());
         Advance();
@@ -866,12 +866,19 @@
       return '\\';
     }
     case '0':
+      FALL_THROUGH;
     case '1':
+      FALL_THROUGH;
     case '2':
+      FALL_THROUGH;
     case '3':
+      FALL_THROUGH;
     case '4':
+      FALL_THROUGH;
     case '5':
+      FALL_THROUGH;
     case '6':
+      FALL_THROUGH;
     case '7':
       // For compatibility, we interpret a decimal escape that isn't
       // a back reference (and therefore either \0 or not valid according
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index e707f06..212b0fd 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -176,16 +176,18 @@
 
   const CodeSourceMap& map =
       CodeSourceMap::Handle(zone, code.code_source_map());
-  ASSERT(!map.IsNull());
+  String& member_name = String::Handle(zone);
+  if (!map.IsNull()) {
+    CodeSourceMapReader reader(map, Array::null_array(),
+                               Function::null_function());
+    const intptr_t name_index = reader.GetNullCheckNameIndexAt(pc_offset);
+    RELEASE_ASSERT(name_index >= 0);
 
-  CodeSourceMapReader reader(map, Array::null_array(),
-                             Function::null_function());
-  const intptr_t name_index = reader.GetNullCheckNameIndexAt(pc_offset);
-  RELEASE_ASSERT(name_index >= 0);
-
-  const ObjectPool& pool = ObjectPool::Handle(zone, code.GetObjectPool());
-  const String& member_name =
-      String::CheckedHandle(zone, pool.ObjectAt(name_index));
+    const ObjectPool& pool = ObjectPool::Handle(zone, code.GetObjectPool());
+    member_name ^= pool.ObjectAt(name_index);
+  } else {
+    member_name = Symbols::OptimizedOut().raw();
+  }
 
   NullErrorHelper(zone, member_name);
 }
@@ -217,16 +219,15 @@
   Exceptions::ThrowByType(Exceptions::kIntegerDivisionByZeroException, args);
 }
 
-static void EnsureNewOrRemembered(Isolate* isolate,
-                                  Thread* thread,
-                                  const Object& result) {
+static void EnsureNewOrRemembered(Thread* thread, const Object& result) {
   // For write barrier elimination, we need to ensure that the allocation ends
   // up in the new space if Heap::IsGuaranteedNewSpaceAllocation is true for
   // this size or else the object needs to go into the store buffer.
-  if (!isolate->heap()->new_space()->Contains(
-          reinterpret_cast<uword>(result.raw()))) {
-    result.raw()->SetRememberedBit();
-    thread->StoreBufferAddObject(result.raw());
+  NoSafepointScope no_safepoint_scope;
+
+  RawObject* object = result.raw();
+  if (!object->IsNewObject()) {
+    object->AddToRememberedSet(thread);
   }
 }
 
@@ -248,7 +249,7 @@
   }
   if (length.IsSmi()) {
     const intptr_t len = Smi::Cast(length).Value();
-    if ((len >= 0) && (len <= Array::kMaxElements)) {
+    if (len >= 0 && len <= Array::kMaxElements) {
       const Array& array = Array::Handle(zone, Array::New(len, Heap::kNew));
       arguments.SetReturn(array);
       TypeArguments& element_type =
@@ -257,10 +258,13 @@
       // vector may be longer than 1 due to a type optimization reusing the type
       // argument vector of the instantiator.
       ASSERT(element_type.IsNull() ||
-             ((element_type.Length() >= 1) && element_type.IsInstantiated()));
+             (element_type.Length() >= 1 && element_type.IsInstantiated()));
       array.SetTypeArguments(element_type);  // May be null.
+
+      ASSERT(Array::UseCardMarkingForAllocation(len) ==
+             array.raw()->IsCardRemembered());
       if (!array.raw()->IsCardRemembered()) {
-        EnsureNewOrRemembered(isolate, thread, array);
+        EnsureNewOrRemembered(thread, array);
       }
       return;
     }
@@ -296,20 +300,20 @@
   if (cls.NumTypeArguments() == 0) {
     // No type arguments required for a non-parameterized type.
     ASSERT(Instance::CheckedHandle(zone, arguments.ArgAt(1)).IsNull());
-    return;
+  } else {
+    const auto& type_arguments =
+        TypeArguments::CheckedHandle(zone, arguments.ArgAt(1));
+    // Unless null (for a raw type), the type argument vector may be longer than
+    // necessary due to a type optimization reusing the type argument vector of
+    // the instantiator.
+    ASSERT(type_arguments.IsNull() ||
+           (type_arguments.IsInstantiated() &&
+            (type_arguments.Length() >= cls.NumTypeArguments())));
+    instance.SetTypeArguments(type_arguments);
   }
-  TypeArguments& type_arguments =
-      TypeArguments::CheckedHandle(zone, arguments.ArgAt(1));
-  // Unless null (for a raw type), the type argument vector may be longer than
-  // necessary due to a type optimization reusing the type argument vector of
-  // the instantiator.
-  ASSERT(type_arguments.IsNull() ||
-         (type_arguments.IsInstantiated() &&
-          (type_arguments.Length() >= cls.NumTypeArguments())));
-  instance.SetTypeArguments(type_arguments);
 
-  if (Heap::IsAllocatableInNewSpace(cls.instance_size())) {
-    EnsureNewOrRemembered(isolate, thread, instance);
+  if (AllocateObjectInstr::WillAllocateNewOrRemembered(cls)) {
+    EnsureNewOrRemembered(thread, instance);
   }
 }
 
@@ -414,9 +418,13 @@
   const Context& context =
       Context::Handle(zone, Context::New(num_variables.Value()));
   arguments.SetReturn(context);
-  if (Heap::IsAllocatableInNewSpace(
-          Context::InstanceSize(num_variables.Value()))) {
-    EnsureNewOrRemembered(isolate, thread, context);
+
+  const intptr_t num_context_variables = num_variables.Value();
+  if (AllocateContextInstr::WillAllocateNewOrRemembered(
+          num_context_variables) ||
+      AllocateUninitializedContextInstr::WillAllocateNewOrRemembered(
+          num_context_variables)) {
+    EnsureNewOrRemembered(thread, context);
   }
 }
 
@@ -2660,7 +2668,13 @@
     reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&atan)));
 
 uword RuntimeEntry::InterpretCallEntry() {
-  return reinterpret_cast<uword>(RuntimeEntry::InterpretCall);
+  uword entry = reinterpret_cast<uword>(RuntimeEntry::InterpretCall);
+#if defined(USING_SIMULATOR) && !defined(TARGET_ARCH_DBC)
+  // DBC does not use redirections unlike other simulators.
+  entry = Simulator::RedirectExternalReference(entry,
+                                               Simulator::kLeafRuntimeCall, 5);
+#endif
+  return entry;
 }
 
 // Interpret a function call. Should be called only for non-jitted functions.
@@ -2691,12 +2705,11 @@
   RawObject* result = interpreter->Call(function, argdesc, argc, argv, thread);
   DEBUG_ASSERT(thread->top_exit_frame_info() == exit_fp);
   if (RawObject::IsErrorClassId(result->GetClassIdMayBeSmi())) {
-    // Must not allocate handles in the caller's zone.
-    StackZone stack_zone(thread);
+    // Must not leak handles in the caller's zone.
+    HANDLESCOPE(thread);
     // Protect the result in a handle before transitioning, which may trigger
     // GC.
-    const Error& error =
-        Error::Handle(stack_zone.GetZone(), static_cast<RawError*>(result));
+    const Error& error = Error::Handle(Error::RawCast(result));
     // Propagating an error may cause allocation. Check if we need to block for
     // a safepoint by switching to "in VM" execution state.
     TransitionGeneratedToVM transition(thread);
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index 91b3caa..dfdba67 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -28,7 +28,7 @@
       sibling_(NULL),
       function_level_(function_level),
       loop_level_(loop_level),
-      context_level_(LocalScope::kUnitializedContextLevel),
+      context_level_(LocalScope::kUninitializedContextLevel),
       begin_token_pos_(TokenPosition::kNoSourcePos),
       end_token_pos_(TokenPosition::kNoSourcePos),
       variables_(),
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index 38abf8f..70c6287 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -148,6 +148,7 @@
     return type_check_mode_ == kTypeCheckedByCaller;
   }
 
+  TypeCheckMode type_check_mode() const { return type_check_mode_; }
   void set_type_check_mode(TypeCheckMode mode) { type_check_mode_ = mode; }
 
   bool HasIndex() const { return index_.IsValid(); }
@@ -294,7 +295,7 @@
   // The context level is only set in a scope that is either the owner scope of
   // a captured variable or that is the owner scope of a context.
   bool HasContextLevel() const {
-    return context_level_ != kUnitializedContextLevel;
+    return context_level_ != kUninitializedContextLevel;
   }
   int context_level() const {
     ASSERT(HasContextLevel());
@@ -302,7 +303,7 @@
   }
   void set_context_level(int context_level) {
     ASSERT(!HasContextLevel());
-    ASSERT(context_level != kUnitializedContextLevel);
+    ASSERT(context_level != kUninitializedContextLevel);
     context_level_ = context_level;
   }
 
@@ -450,7 +451,7 @@
 
   NameReference* FindReference(const String& name) const;
 
-  static const int kUnitializedContextLevel = INT_MIN;
+  static const int kUninitializedContextLevel = INT_MIN;
   LocalScope* parent_;
   LocalScope* child_;
   LocalScope* sibling_;
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 93fa9c6..c866994 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -121,6 +121,9 @@
 StreamInfo Service::extension_stream("Extension");
 StreamInfo Service::timeline_stream("Timeline");
 
+const uint8_t* Service::dart_library_kernel_ = NULL;
+intptr_t Service::dart_library_kernel_len_ = 0;
+
 static StreamInfo* streams_[] = {
     &Service::vm_stream,      &Service::isolate_stream,
     &Service::debug_stream,   &Service::gc_stream,
@@ -955,6 +958,7 @@
   bool result;
   {
     TransitionVMToNative transition(thread);
+
     Dart_CObject cbytes;
     cbytes.type = Dart_CObject_kExternalTypedData;
     cbytes.value.as_external_typed_data.type = Dart_TypedData_kUint8;
@@ -974,6 +978,7 @@
     message.type = Dart_CObject_kArray;
     message.value.as_array.length = 2;
     message.value.as_array.values = elements;
+
     result = Dart_PostCObject(ServiceIsolate::Port(), &message);
   }
 
@@ -1111,6 +1116,22 @@
   ASSERT(kind != NULL);
   ASSERT(event != NULL);
 
+  if (FLAG_trace_service) {
+    if (isolate != NULL) {
+      OS::PrintErr(
+          "vm-service: Pushing ServiceEvent(isolate='%s', "
+          "isolateId='" ISOLATE_SERVICE_ID_FORMAT_STRING
+          "', kind='%s') to stream %s\n",
+          isolate->name(), static_cast<int64_t>(isolate->main_port()), kind,
+          stream_id);
+    } else {
+      OS::PrintErr(
+          "vm-service: Pushing ServiceEvent(isolate='<no current isolate>', "
+          "kind='%s') to stream %s\n",
+          kind, stream_id);
+    }
+  }
+
   // Message is of the format [<stream id>, <json string>].
   //
   // Build the event message in the C heap to avoid dart heap
@@ -1132,23 +1153,15 @@
   json_cobj.value.as_string = const_cast<char*>(event->ToCString());
   list_values[1] = &json_cobj;
 
-  if (FLAG_trace_service) {
-    if (isolate != NULL) {
-      OS::PrintErr(
-          "vm-service: Pushing ServiceEvent(isolate='%s', "
-          "isolateId='" ISOLATE_SERVICE_ID_FORMAT_STRING
-          "', kind='%s') to stream %s\n",
-          isolate->name(), static_cast<int64_t>(isolate->main_port()), kind,
-          stream_id);
-    } else {
-      OS::PrintErr(
-          "vm-service: Pushing ServiceEvent(isolate='<no current isolate>', "
-          "kind='%s') to stream %s\n",
-          kind, stream_id);
-    }
+  // In certain cases (e.g. in the implementation of Dart_IsolateMakeRunnable)
+  // we do not have a current isolate/thread.
+  auto thread = Thread::Current();
+  if (thread != nullptr) {
+    TransitionVMToNative transition(thread);
+    Dart_PostCObject(ServiceIsolate::Port(), &list_cobj);
+  } else {
+    Dart_PostCObject(ServiceIsolate::Port(), &list_cobj);
   }
-
-  Dart_PostCObject(ServiceIsolate::Port(), &list_cobj);
 }
 
 class EmbedderServiceHandler {
@@ -1318,6 +1331,12 @@
   return info.max_rss;
 }
 
+void Service::SetDartLibraryKernelForSources(const uint8_t* kernel_bytes,
+                                             intptr_t kernel_length) {
+  dart_library_kernel_ = kernel_bytes;
+  dart_library_kernel_len_ = kernel_length;
+}
+
 EmbedderServiceHandler* Service::FindRootEmbedderHandler(const char* name) {
   EmbedderServiceHandler* current = root_service_handler_head_;
   while (current != NULL) {
@@ -3787,6 +3806,11 @@
     NULL,
 };
 
+static const MethodParameter* write_cpu_profile_timeline_params[] = {
+    RUNNABLE_ISOLATE_PARAMETER,
+    NULL,
+};
+
 // TODO(johnmccutchan): Rename this to GetCpuSamples.
 static bool GetCpuProfile(Thread* thread, JSONStream* js) {
   Profile::TagOrder tag_order =
@@ -3824,6 +3848,11 @@
   return true;
 }
 
+static bool WriteCpuProfileTimeline(Thread* thread, JSONStream* js) {
+  ProfilerService::AddToTimeline();
+  return true;
+}
+
 static const MethodParameter* get_allocation_samples_params[] = {
     RUNNABLE_ISOLATE_PARAMETER,
     new EnumParameter("tags", true, tags_enum_names),
@@ -4312,9 +4341,22 @@
 
   // Handle heap objects.
   ObjectIdRing::LookupResult lookup_result;
-  const Object& obj =
-      Object::Handle(LookupHeapObject(thread, id, &lookup_result));
+  Object& obj = Object::Handle(LookupHeapObject(thread, id, &lookup_result));
   if (obj.raw() != Object::sentinel().raw()) {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    // If obj is a script from dart:* and doesn't have source loaded, try and
+    // load the source before sending the response.
+    if (obj.IsScript()) {
+      const Script& script = Script::Cast(obj);
+      if (!script.HasSource() && script.IsPartOfDartColonLibrary() &&
+          Service::HasDartLibraryKernelForSources()) {
+        const uint8_t* kernel_buffer = Service::dart_library_kernel();
+        const intptr_t kernel_buffer_len =
+            Service::dart_library_kernel_length();
+        script.LoadSourceFromKernel(kernel_buffer, kernel_buffer_len);
+      }
+    }
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
     // We found a heap object for this id.  Return it.
     obj.PrintJSON(js, false);
     return true;
@@ -4809,6 +4851,8 @@
     get_cpu_profile_params },
   { "_getCpuProfileTimeline", GetCpuProfileTimeline,
     get_cpu_profile_timeline_params },
+  { "_writeCpuProfileTimeline", WriteCpuProfileTimeline,
+    write_cpu_profile_timeline_params },
   { "getFlagList", GetFlagList,
     get_flag_list_params },
   { "_getHeapMap", GetHeapMap,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index 3e54a6c..4b05099 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -184,6 +184,18 @@
   static int64_t CurrentRSS();
   static int64_t MaxRSS();
 
+  static void SetDartLibraryKernelForSources(const uint8_t* kernel_bytes,
+                                             intptr_t kernel_length);
+  static bool HasDartLibraryKernelForSources() {
+    return (dart_library_kernel_ != NULL);
+  }
+
+  static const uint8_t* dart_library_kernel() { return dart_library_kernel_; }
+
+  static intptr_t dart_library_kernel_length() {
+    return dart_library_kernel_len_;
+  }
+
  private:
   static RawError* InvokeMethod(Isolate* isolate,
                                 const Array& message,
@@ -228,11 +240,8 @@
   static Dart_GetVMServiceAssetsArchive get_service_assets_callback_;
   static Dart_EmbedderInformationCallback embedder_information_callback_;
 
-  static bool needs_isolate_events_;
-  static bool needs_debug_events_;
-  static bool needs_gc_events_;
-  static bool needs_echo_events_;
-  static bool needs_graph_events_;
+  static const uint8_t* dart_library_kernel_;
+  static intptr_t dart_library_kernel_len_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index f8d56fe..df5e2da 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1037,7 +1037,7 @@
 ### BoundVariable
 
 ```
-class BoundVariable {
+class BoundVariable extends Response {
   string name;
   @Instance|@TypeArguments|Sentinel value;
 
@@ -2251,6 +2251,11 @@
   // A unique identifier for an Object. Passed to the
   // getObject RPC to load this Object.
   string id;
+
+  // Provided and set to true if the id of an Object is fixed. If true, the id
+  // of an Object is guaranteed not to change or expire. The object may, however,
+  // still be _Collected_.
+  bool fixedId [optional];
 }
 ```
 
@@ -2264,6 +2269,11 @@
   // Some objects may get a new id when they are reloaded.
   string id;
 
+  // Provided and set to true if the id of an Object is fixed. If true, the id
+  // of an Object is guaranteed not to change or expire. The object may, however,
+  // still be _Collected_.
+  bool fixedId [optional];
+
   // If an object is allocated in the Dart heap, it will have
   // a corresponding class object.
   //
@@ -2692,6 +2702,9 @@
 
 ```
 class VM extends Response {
+  // A name identifying this vm. Not guaranteed to be unique.
+  string name;
+
   // Word length on target architecture (e.g. 32, 64).
   int architectureBits;
 
diff --git a/runtime/vm/service/service_dev.md b/runtime/vm/service/service_dev.md
index 945d4f9..1808c86 100644
--- a/runtime/vm/service/service_dev.md
+++ b/runtime/vm/service/service_dev.md
@@ -31,7 +31,7 @@
   - [evaluateInFrame](#evaluateinframe)
   - [getFlagList](#getflaglist)
   - [getIsolate](#getisolate)
-  - [getScripts](#getisolatescripts)
+  - [getScripts](#getscripts)
   - [getObject](#getobject)
   - [getSourceReport](#getsourcereport)
   - [getStack](#getstack)
@@ -905,7 +905,7 @@
 The _streamListen_ RPC subscribes to a stream in the VM. Once
 subscribed, the client will begin receiving events from the stream.
 
-If the client is not subscribed to the stream, the _103_ (Stream already
+If the client is already subscribed to the stream, the _103_ (Stream already
 subscribed) error code is returned.
 
 The _streamId_ parameter may have the following published values:
@@ -1037,7 +1037,7 @@
 ### BoundVariable
 
 ```
-class BoundVariable {
+class BoundVariable extends Response {
   string name;
   @Instance|@TypeArguments|Sentinel value;
 
@@ -2251,6 +2251,11 @@
   // A unique identifier for an Object. Passed to the
   // getObject RPC to load this Object.
   string id;
+
+  // Provided and set to true if the id of an Object is fixed. If true, the id
+  // of an Object is guaranteed not to change or expire. The object may, however,
+  // still be _Collected_.
+  bool fixedId [optional];
 }
 ```
 
@@ -2264,6 +2269,11 @@
   // Some objects may get a new id when they are reloaded.
   string id;
 
+  // Provided and set to true if the id of an Object is fixed. If true, the id
+  // of an Object is guaranteed not to change or expire. The object may, however,
+  // still be _Collected_.
+  bool fixedId [optional];
+
   // If an object is allocated in the Dart heap, it will have
   // a corresponding class object.
   //
@@ -2692,6 +2702,9 @@
 
 ```
 class VM extends Response {
+  // A name identifying this vm. Not guaranteed to be unique.
+  string name;
+
   // Word length on target architecture (e.g. 32, 64).
   int architectureBits;
 
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 03c96f2..aeb614e 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -243,11 +243,12 @@
     TransitionVMToNative transition(thread);
     lib = TestCase::LoadTestScript(kScript, NULL);
     EXPECT_VALID(lib);
-    vmlib ^= Api::UnwrapHandle(lib);
-    EXPECT(!vmlib.IsNull());
+    EXPECT(!Dart_IsNull(lib));
     Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
     EXPECT_VALID(result);
   }
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
   const Class& class_a = Class::Handle(GetClass(vmlib, "A"));
   EXPECT(!class_a.IsNull());
   const Function& function_c = Function::Handle(GetFunction(class_a, "c"));
@@ -264,9 +265,9 @@
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
-  EXPECT_VALID(port);
   {
     TransitionVMToNative transition(thread);
+    EXPECT_VALID(port);
     EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
   }
 
@@ -367,11 +368,12 @@
     TransitionVMToNative transition(thread);
     lib = TestCase::LoadTestScript(kScript, NULL);
     EXPECT_VALID(lib);
-    vmlib ^= Api::UnwrapHandle(lib);
-    EXPECT(!vmlib.IsNull());
+    EXPECT(!Dart_IsNull(lib));
     Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
     EXPECT_VALID(result);
   }
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
   const Class& class_a = Class::Handle(GetClass(vmlib, "A"));
   EXPECT(!class_a.IsNull());
   const Function& function_c = Function::Handle(GetFunction(class_a, "c"));
@@ -389,9 +391,9 @@
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
-  EXPECT_VALID(port);
   {
     TransitionVMToNative transition(thread);
+    EXPECT_VALID(port);
     EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
   }
 
@@ -437,11 +439,12 @@
     TransitionVMToNative transition(thread);
     lib = TestCase::LoadTestScript(kScript, NULL);
     EXPECT_VALID(lib);
-    vmlib ^= Api::UnwrapHandle(lib);
-    EXPECT(!vmlib.IsNull());
+    EXPECT(!Dart_IsNull(lib));
     Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
     EXPECT_VALID(result);
   }
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
   const Class& class_a = Class::Handle(GetClass(vmlib, "A"));
   EXPECT(!class_a.IsNull());
   const Function& function_c = Function::Handle(GetFunction(class_a, "c"));
@@ -459,9 +462,9 @@
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
-  EXPECT_VALID(port);
   {
     TransitionVMToNative transition(thread);
+    EXPECT_VALID(port);
     EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
   }
 
@@ -522,9 +525,9 @@
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
-  EXPECT_VALID(port);
   {
     TransitionVMToNative transition(thread);
+    EXPECT_VALID(port);
     EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
   }
 
@@ -579,9 +582,9 @@
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
-  EXPECT_VALID(port);
   {
     TransitionVMToNative transition(thread);
+    EXPECT_VALID(port);
     EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
   }
 
@@ -668,9 +671,9 @@
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
-  EXPECT_VALID(port);
   {
     TransitionVMToNative transition(thread);
+    EXPECT_VALID(port);
     EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
   }
 
@@ -713,9 +716,9 @@
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
-  EXPECT_VALID(port);
   {
     TransitionVMToNative transition(thread);
+    EXPECT_VALID(port);
     EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
   }
 
@@ -770,9 +773,9 @@
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(thread, SendPort::New(port_id));
-  EXPECT_VALID(port);
   {
     TransitionVMToNative transition(thread);
+    EXPECT_VALID(port);
     EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
   }
 
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 1047955..ec829b9 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -670,12 +670,12 @@
   // handling stack overflow exceptions. To be safe in potential
   // stack underflows we also add some underflow buffer space.
   stack_ =
-      new char[(OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer +
-                kSimulatorStackUnderflowSize)];
+      new char[(OSThread::GetSpecifiedStackSize() +
+                OSThread::kStackSizeBufferMax + kSimulatorStackUnderflowSize)];
   // Low address.
   stack_limit_ = reinterpret_cast<uword>(stack_);
   // Limit for StackOverflowError.
-  overflow_stack_limit_ = stack_limit_ + OSThread::kStackSizeBuffer;
+  overflow_stack_limit_ = stack_limit_ + OSThread::kStackSizeBufferMax;
   // High address.
   stack_base_ = overflow_stack_limit_ + OSThread::GetSpecifiedStackSize();
 
@@ -1365,7 +1365,8 @@
 typedef int32_t (*SimulatorLeafRuntimeCall)(int32_t r0,
                                             int32_t r1,
                                             int32_t r2,
-                                            int32_t r3);
+                                            int32_t r3,
+                                            int32_t r4);
 
 // Calls to leaf float Dart runtime functions are based on this interface.
 typedef double (*SimulatorLeafFloatRuntimeCall)(double d0, double d1);
@@ -1401,14 +1402,15 @@
           set_register(R1, icount_);
         } else if (redirection->call_kind() == kLeafRuntimeCall) {
           ASSERT((0 <= redirection->argument_count()) &&
-                 (redirection->argument_count() <= 4));
+                 (redirection->argument_count() <= 5));
           int32_t r0 = get_register(R0);
           int32_t r1 = get_register(R1);
           int32_t r2 = get_register(R2);
           int32_t r3 = get_register(R3);
+          int32_t r4 = *reinterpret_cast<int32_t*>(get_register(SP));
           SimulatorLeafRuntimeCall target =
               reinterpret_cast<SimulatorLeafRuntimeCall>(external);
-          r0 = target(r0, r1, r2, r3);
+          r0 = target(r0, r1, r2, r3, r4);
           set_register(R0, r0);       // Set returned result from function.
           set_register(R1, icount_);  // Zap unused result register.
         } else if (redirection->call_kind() == kLeafFloatRuntimeCall) {
@@ -1584,8 +1586,8 @@
             // Registers rd, rn, rm, ra are encoded as rn, rm, rs, rd.
             // Format(instr, "mls'cond's 'rn, 'rm, 'rs, 'rd");
             rd_val = get_register(rd);
+            FALL_THROUGH;
           }
-          /* Falls through */
           case 0: {
             // Registers rd, rn, rm are encoded as rn, rm, rs.
             // Format(instr, "mul'cond's 'rn, 'rm, 'rs");
@@ -1642,7 +1644,7 @@
               // umaal is only in ARMv6 and above.
               UnimplementedInstruction(instr);
             }
-            /* Falls through */
+            FALL_THROUGH;
           case 5:
           // Registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
           // Format(instr, "umlal'cond's 'rd, 'rn, 'rm, 'rs");
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index d7240cb..0d9f446 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -720,12 +720,12 @@
   // handling stack overflow exceptions. To be safe in potential
   // stack underflows we also add some underflow buffer space.
   stack_ =
-      new char[(OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer +
-                kSimulatorStackUnderflowSize)];
+      new char[(OSThread::GetSpecifiedStackSize() +
+                OSThread::kStackSizeBufferMax + kSimulatorStackUnderflowSize)];
   // Low address.
   stack_limit_ = reinterpret_cast<uword>(stack_);
   // Limit for StackOverflowError.
-  overflow_stack_limit_ = stack_limit_ + OSThread::kStackSizeBuffer;
+  overflow_stack_limit_ = stack_limit_ + OSThread::kStackSizeBufferMax;
   // High address.
   stack_base_ = overflow_stack_limit_ + OSThread::GetSpecifiedStackSize();
 
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index b059dae..85e98a0 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -552,7 +552,7 @@
   // handling stack overflow exceptions. To be safe in potential
   // stack underflows we also add some underflow buffer space.
   stack_ = new uintptr_t[(OSThread::GetSpecifiedStackSize() +
-                          OSThread::kStackSizeBuffer +
+                          OSThread::kStackSizeBufferMax +
                           kSimulatorStackUnderflowSize) /
                          sizeof(uintptr_t)];
   // Low address.
@@ -560,7 +560,7 @@
   // Limit for StackOverflowError.
   overflow_stack_limit_ = stack_base_ + OSThread::GetSpecifiedStackSize();
   // High address.
-  stack_limit_ = overflow_stack_limit_ + OSThread::kStackSizeBuffer;
+  stack_limit_ = overflow_stack_limit_ + OSThread::kStackSizeBufferMax;
 
   last_setjmp_buffer_ = NULL;
 
@@ -810,7 +810,12 @@
                                 RawObject** SP) {
   RawObject** result = top;
   top[0] = 0;  // Clean up result slot.
-  RawObject** miss_handler_args = top + 1;
+
+  // Save arguments descriptor as it may be clobbered by running Dart code
+  // during the call to miss handler (class finalization).
+  top[1] = argdesc_;
+
+  RawObject** miss_handler_args = top + 2;
   for (intptr_t i = 0; i < checked_args; i++) {
     miss_handler_args[i] = args[i];
   }
@@ -833,6 +838,8 @@
   RawObject** exit_frame = miss_handler_args + miss_handler_argc;
   CallRuntime(thread, FP, exit_frame, pc, miss_handler_argc, miss_handler_args,
               result, reinterpret_cast<uword>(handler));
+
+  argdesc_ = Array::RawCast(top[1]);
 }
 
 DART_FORCE_INLINE void Simulator::InstanceCall1(Thread* thread,
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index c3d7c8e..0b9df59 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -223,6 +223,9 @@
       typed_data_(TypedData::Handle(zone_)),
       function_(Function::Handle(zone_)),
       error_(UnhandledException::Handle(zone_)),
+      set_class_(Class::ZoneHandle(
+          zone_,
+          thread_->isolate()->object_store()->linked_hash_set_class())),
       max_vm_isolate_object_id_(
           (Snapshot::IsFull(kind))
               ? Object::vm_isolate_snapshot_object_table().Length()
@@ -248,7 +251,6 @@
     }
     Object& result = Object::Handle(zone_);
     if (backward_references_->length() > 0) {
-      ProcessDeferredCanonicalizations();
       result = (*backward_references_)[0].reference()->raw();
     } else {
       result = obj.raw();
@@ -317,7 +319,7 @@
   Class& cls = Class::ZoneHandle(zone(), Class::null());
   AddBackRef(object_id, &cls, kIsDeserialized);
   // Read the library/class information and lookup the class.
-  str_ ^= ReadObjectImpl(class_header, kAsInlinedObject, kInvalidPatchIndex, 0);
+  str_ ^= ReadObjectImpl(class_header, kAsInlinedObject);
   library_ = Library::LookupLibrary(thread(), str_);
   if (library_.IsNull() || !library_.Loaded()) {
     SetReadException(
@@ -413,28 +415,22 @@
   return isolate() == Dart::vm_isolate();
 }
 
-RawObject* SnapshotReader::ReadObjectImpl(bool as_reference,
-                                          intptr_t patch_object_id,
-                                          intptr_t patch_offset) {
+RawObject* SnapshotReader::ReadObjectImpl(bool as_reference) {
   int64_t header_value = Read<int64_t>();
   if ((header_value & kSmiTagMask) == kSmiTag) {
     return NewInteger(header_value);
   }
   ASSERT((header_value <= kIntptrMax) && (header_value >= kIntptrMin));
-  return ReadObjectImpl(static_cast<intptr_t>(header_value), as_reference,
-                        patch_object_id, patch_offset);
+  return ReadObjectImpl(static_cast<intptr_t>(header_value), as_reference);
 }
 
 RawObject* SnapshotReader::ReadObjectImpl(intptr_t header_value,
-                                          bool as_reference,
-                                          intptr_t patch_object_id,
-                                          intptr_t patch_offset) {
+                                          bool as_reference) {
   if (IsVMIsolateObject(header_value)) {
     return ReadVMIsolateObject(header_value);
   }
   if (SerializedHeaderTag::decode(header_value) == kObjectId) {
-    return ReadIndexedObject(SerializedHeaderData::decode(header_value),
-                             patch_object_id, patch_offset);
+    return ReadIndexedObject(SerializedHeaderData::decode(header_value));
   }
   ASSERT(SerializedHeaderTag::decode(header_value) == kInlined);
   intptr_t object_id = SerializedHeaderData::decode(header_value);
@@ -491,12 +487,13 @@
       UNREACHABLE();
       break;
   }
-  if (!read_as_reference) {
-    AddPatchRecord(object_id, patch_object_id, patch_offset);
-  }
   return pobj_.raw();
 }
 
+void SnapshotReader::EnqueueRehashingOfSet(const Object& set) {
+  objects_to_rehash_.Add(set);
+}
+
 RawObject* SnapshotReader::ReadInstance(intptr_t object_id,
                                         intptr_t tags,
                                         bool as_reference) {
@@ -526,6 +523,9 @@
     ASSERT(!cls_.IsNull());
     instance_size = cls_.instance_size();
   }
+  if (cls_.id() == set_class_.id()) {
+    EnqueueRehashingOfSet(*result);
+  }
   if (!as_reference) {
     // Read all the individual fields for inlined objects.
     intptr_t next_field_offset = cls_.next_field_offset();
@@ -538,8 +538,7 @@
     intptr_t offset = Instance::NextFieldOffset();
     intptr_t result_cid = result->GetClassId();
     while (offset < next_field_offset) {
-      pobj_ =
-          ReadObjectImpl(read_as_reference, object_id, (offset / kWordSize));
+      pobj_ = ReadObjectImpl(read_as_reference);
       result->SetFieldAtOffset(offset, pobj_);
       if ((offset != type_argument_field_offset) &&
           (kind_ == Snapshot::kMessage) && isolate()->use_field_guards()) {
@@ -572,13 +571,12 @@
 
 void SnapshotReader::AddBackRef(intptr_t id,
                                 Object* obj,
-                                DeserializeState state,
-                                bool defer_canonicalization) {
+                                DeserializeState state) {
   intptr_t index = (id - kMaxPredefinedObjectIds);
   ASSERT(index >= max_vm_isolate_object_id_);
   index -= max_vm_isolate_object_id_;
   ASSERT(index == backward_references_->length());
-  BackRefNode node(obj, state, defer_canonicalization);
+  BackRefNode node(obj, state);
   backward_references_->Add(node);
 }
 
@@ -758,9 +756,7 @@
   return Symbols::GetPredefinedSymbol(object_id);  // return VM symbol.
 }
 
-RawObject* SnapshotReader::ReadIndexedObject(intptr_t object_id,
-                                             intptr_t patch_object_id,
-                                             intptr_t patch_offset) {
+RawObject* SnapshotReader::ReadIndexedObject(intptr_t object_id) {
   intptr_t class_id = ClassIdFromObjectId(object_id);
   if (IsObjectStoreClassId(class_id)) {
     return isolate()->class_table()->At(class_id);  // get singleton class.
@@ -773,85 +769,20 @@
   if (index < max_vm_isolate_object_id_) {
     return VmIsolateSnapshotObject(index);
   }
-  AddPatchRecord(object_id, patch_object_id, patch_offset);
   return GetBackRef(object_id)->raw();
 }
 
-void SnapshotReader::AddPatchRecord(intptr_t object_id,
-                                    intptr_t patch_object_id,
-                                    intptr_t patch_offset) {
-  if (patch_object_id != kInvalidPatchIndex) {
-    ASSERT(object_id >= kMaxPredefinedObjectIds);
-    intptr_t index = (object_id - kMaxPredefinedObjectIds);
-    ASSERT(index >= max_vm_isolate_object_id_);
-    index -= max_vm_isolate_object_id_;
-    ASSERT(index < backward_references_->length());
-    BackRefNode& ref = (*backward_references_)[index];
-    ref.AddPatchRecord(patch_object_id, patch_offset);
-  }
-}
-
-void SnapshotReader::ProcessDeferredCanonicalizations() {
-  Type& typeobj = Type::Handle();
-  TypeArguments& typeargs = TypeArguments::Handle();
-  Object& newobj = Object::Handle();
-  for (intptr_t i = 0; i < backward_references_->length(); i++) {
-    BackRefNode& backref = (*backward_references_)[i];
-    if (backref.defer_canonicalization()) {
-      Object* objref = backref.reference();
-      // Object should either be a type or a type argument.
-      if (objref->IsType()) {
-        typeobj ^= objref->raw();
-        newobj = typeobj.Canonicalize();
-      } else {
-        ASSERT(objref->IsTypeArguments());
-        typeargs ^= objref->raw();
-        newobj = typeargs.Canonicalize();
-      }
-      if (newobj.raw() != objref->raw()) {
-        ZoneGrowableArray<intptr_t>* patches = backref.patch_records();
-        ASSERT(newobj.IsNull() || newobj.IsCanonical());
-        // First we replace the back ref table with the canonical object.
-        *objref = newobj.raw();
-        if (patches != NULL) {
-          // Now go over all the patch records and patch the canonical object.
-          for (intptr_t j = 0; j < patches->length(); j += 2) {
-            NoSafepointScope no_safepoint;
-            intptr_t patch_object_id = (*patches)[j];
-            intptr_t patch_offset = (*patches)[j + 1];
-            Object* target = GetBackRef(patch_object_id);
-            // We should not backpatch an object that is canonical.
-            if (!target->IsCanonical()) {
-              RawObject** rawptr =
-                  reinterpret_cast<RawObject**>(target->raw()->ptr());
-              target->StorePointer((rawptr + patch_offset), newobj.raw());
-            }
-          }
-        }
-      } else {
-        ASSERT(objref->IsCanonical());
-      }
-    }
-  }
-}
-
 void SnapshotReader::ArrayReadFrom(intptr_t object_id,
                                    const Array& result,
                                    intptr_t len,
                                    intptr_t tags) {
   // Setup the object fields.
-  const intptr_t typeargs_offset =
-      GrowableObjectArray::type_arguments_offset() / kWordSize;
-  *TypeArgumentsHandle() ^=
-      ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset);
+  *TypeArgumentsHandle() ^= ReadObjectImpl(kAsInlinedObject);
   result.SetTypeArguments(*TypeArgumentsHandle());
 
   bool as_reference = RawObject::IsCanonical(tags) ? false : true;
-  intptr_t offset = result.raw_ptr()->data() -
-                    reinterpret_cast<RawObject**>(result.raw()->ptr());
   for (intptr_t i = 0; i < len; i++) {
-    *PassiveObjectHandle() =
-        ReadObjectImpl(as_reference, object_id, (i + offset));
+    *PassiveObjectHandle() = ReadObjectImpl(as_reference);
     result.SetAt(i, *PassiveObjectHandle());
   }
 }
@@ -1084,7 +1015,7 @@
 
   // Now check if it is an object from the VM isolate. These objects are shared
   // by all isolates.
-  if (rawobj->IsVMHeapObject() && HandleVMIsolateObject(rawobj)) {
+  if (rawobj->IsReadOnly() && HandleVMIsolateObject(rawobj)) {
     return true;
   }
 
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 736329c..5a4ab63 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -270,42 +270,21 @@
 
 class BackRefNode : public ValueObject {
  public:
-  BackRefNode(Object* reference,
-              DeserializeState state,
-              bool defer_canonicalization)
-      : reference_(reference),
-        state_(state),
-        defer_canonicalization_(defer_canonicalization),
-        patch_records_(NULL) {}
+  BackRefNode(Object* reference, DeserializeState state)
+      : reference_(reference), state_(state) {}
   Object* reference() const { return reference_; }
   bool is_deserialized() const { return state_ == kIsDeserialized; }
   void set_state(DeserializeState state) { state_ = state; }
-  bool defer_canonicalization() const { return defer_canonicalization_; }
-  ZoneGrowableArray<intptr_t>* patch_records() const { return patch_records_; }
 
   BackRefNode& operator=(const BackRefNode& other) {
     reference_ = other.reference_;
     state_ = other.state_;
-    defer_canonicalization_ = other.defer_canonicalization_;
-    patch_records_ = other.patch_records_;
     return *this;
   }
 
-  void AddPatchRecord(intptr_t patch_object_id, intptr_t patch_offset) {
-    if (defer_canonicalization_) {
-      if (patch_records_ == NULL) {
-        patch_records_ = new ZoneGrowableArray<intptr_t>();
-      }
-      patch_records_->Add(patch_object_id);
-      patch_records_->Add(patch_offset);
-    }
-  }
-
  private:
   Object* reference_;
   DeserializeState state_;
-  bool defer_canonicalization_;
-  ZoneGrowableArray<intptr_t>* patch_records_;
 };
 
 // Reads a snapshot into objects.
@@ -335,10 +314,7 @@
   RawObject* ReadObject();
 
   // Add object to backward references.
-  void AddBackRef(intptr_t id,
-                  Object* obj,
-                  DeserializeState state,
-                  bool defer_canonicalization = false);
+  void AddBackRef(intptr_t id, Object* obj, DeserializeState state);
 
   // Get an object from the backward references list.
   Object* GetBackRef(intptr_t id);
@@ -367,19 +343,15 @@
   void RunDelayedTypePostprocessing();
 
   void EnqueueRehashingOfMap(const LinkedHashMap& map);
+  void EnqueueRehashingOfSet(const Object& set);
   RawObject* RunDelayedRehashingOfMaps();
 
   RawClass* ReadClassId(intptr_t object_id);
   RawObject* ReadStaticImplicitClosure(intptr_t object_id, intptr_t cls_header);
 
   // Implementation to read an object.
-  RawObject* ReadObjectImpl(bool as_reference,
-                            intptr_t patch_object_id = kInvalidPatchIndex,
-                            intptr_t patch_offset = 0);
-  RawObject* ReadObjectImpl(intptr_t header,
-                            bool as_reference,
-                            intptr_t patch_object_id,
-                            intptr_t patch_offset);
+  RawObject* ReadObjectImpl(bool as_reference);
+  RawObject* ReadObjectImpl(intptr_t header, bool as_reference);
 
   // Read a Dart Instance object.
   RawObject* ReadInstance(intptr_t object_id, intptr_t tags, bool as_reference);
@@ -389,18 +361,7 @@
 
   // Read an object that was serialized as an Id (singleton in object store,
   // or an object that was already serialized before).
-  RawObject* ReadIndexedObject(intptr_t object_id,
-                               intptr_t patch_object_id,
-                               intptr_t patch_offset);
-
-  // Add a patch record for the object so that objects whose canonicalization
-  // is deferred can be back patched after they are canonicalized.
-  void AddPatchRecord(intptr_t object_id,
-                      intptr_t patch_object_id,
-                      intptr_t patch_offset);
-
-  // Process all the deferred canonicalization entries and patch all references.
-  void ProcessDeferredCanonicalizations();
+  RawObject* ReadIndexedObject(intptr_t object_id);
 
   // Decode class id from the header field.
   intptr_t LookupInternalClass(intptr_t class_header);
@@ -439,6 +400,7 @@
   TypedData& typed_data_;          // Temporary typed data handle.
   Function& function_;             // Temporary function handle.
   UnhandledException& error_;      // Error handle.
+  const Class& set_class_;         // The LinkedHashSet class.
   intptr_t max_vm_isolate_object_id_;
   ZoneGrowableArray<BackRefNode>* backward_references_;
   GrowableObjectArray& types_to_postprocess_;
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 52bda42..2ca95a0 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -769,7 +769,11 @@
     StackZone zone(thread);
     HandleScope scope(thread);
 
-    EXPECT_VALID(Api::CheckAndFinalizePendingClasses(thread));
+    Dart_Handle result = Api::CheckAndFinalizePendingClasses(thread);
+    {
+      TransitionVMToNative to_native(thread);
+      EXPECT_VALID(result);
+    }
     timer1.Stop();
     OS::PrintErr("Without Snapshot: %" Pd64 "us\n", timer1.TotalElapsedTime());
 
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index a1e3da2..2c1be3d 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -491,16 +491,12 @@
 }
 
 void SourceReport::VisitField(JSONArray* jsarr, const Field& field) {
-  if (ShouldSkipField(field) || !field.has_initializer()) return;
-  const Function& func =
-      Function::Handle(zone(), GetInitializerFunction(field));
-  VisitFunction(jsarr, func);
-}
-
-RawFunction* SourceReport::GetInitializerFunction(const Field& field) {
+  if (ShouldSkipField(field) || !field.HasInitializerFunction()) return;
   Thread* const thread = Thread::Current();
-  // Create a function to evaluate the initializer
-  return kernel::CreateFieldInitializerFunction(thread, thread->zone(), field);
+  const Function& func = Function::Handle(
+      zone(),
+      kernel::CreateFieldInitializerFunction(thread, thread->zone(), field));
+  VisitFunction(jsarr, func);
 }
 
 void SourceReport::VisitLibrary(JSONArray* jsarr, const Library& lib) {
diff --git a/runtime/vm/source_report.h b/runtime/vm/source_report.h
index 73a9c3d..0a3ddb1 100644
--- a/runtime/vm/source_report.h
+++ b/runtime/vm/source_report.h
@@ -86,7 +86,6 @@
   void VisitField(JSONArray* jsarr, const Field& field);
   void VisitLibrary(JSONArray* jsarr, const Library& lib);
   void VisitClosures(JSONArray* jsarr);
-  RawFunction* GetInitializerFunction(const Field& field);
   // An entry in the script table.
   struct ScriptTableEntry {
     ScriptTableEntry() : key(NULL), index(-1), script(NULL) {}
diff --git a/runtime/vm/source_report_test.cc b/runtime/vm/source_report_test.cc
index 5e37a9b..9b0070d 100644
--- a/runtime/vm/source_report_test.cc
+++ b/runtime/vm/source_report_test.cc
@@ -10,11 +10,15 @@
 
 #ifndef PRODUCT
 
-static RawObject* ExecuteScript(const char* script) {
+static RawObject* ExecuteScript(const char* script, bool allow_errors = false) {
   Dart_Handle lib;
   {
     TransitionVMToNative transition(Thread::Current());
-    lib = TestCase::LoadTestScript(script, NULL);
+    if (allow_errors) {
+      lib = TestCase::LoadTestScriptWithErrors(script, NULL);
+    } else {
+      lib = TestCase::LoadTestScript(script, NULL);
+    }
     EXPECT_VALID(lib);
     Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
     EXPECT_VALID(result);
@@ -33,7 +37,6 @@
   ASSERT(!lib.IsNull());
   const Script& script =
       Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
-
   SourceReport report(SourceReport::kCoverage);
   JSONStream js;
   report.PrintJSON(&js, script);
@@ -42,12 +45,12 @@
       "{\"type\":\"SourceReport\",\"ranges\":"
 
       // One compiled range, one hit at function declaration.
-      "[{\"scriptIndex\":0,\"startPos\":0,\"endPos\":5,\"compiled\":true,"
+      "[{\"scriptIndex\":0,\"startPos\":0,\"endPos\":9,\"compiled\":true,"
       "\"coverage\":{\"hits\":[0],\"misses\":[]}}],"
 
       // One script in the script table.
       "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
-      "\"uri\":\"test-lib\",\"_kind\":\"script\"}]}",
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
       buffer);
 }
 
@@ -79,19 +82,19 @@
       "{\"type\":\"SourceReport\",\"ranges\":["
 
       // One range compiled with one hit at function declaration (helper0).
-      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":4,\"compiled\":true,"
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":11,\"compiled\":true,"
       "\"coverage\":{\"hits\":[0],\"misses\":[]}},"
 
       // One range not compiled (helper1).
-      "{\"scriptIndex\":0,\"startPos\":6,\"endPos\":10,\"compiled\":false},"
+      "{\"scriptIndex\":0,\"startPos\":13,\"endPos\":24,\"compiled\":false},"
 
       // One range with two hits and a miss (main).
-      "{\"scriptIndex\":0,\"startPos\":12,\"endPos\":39,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[12,23],\"misses\":[32]}}],"
+      "{\"scriptIndex\":0,\"startPos\":26,\"endPos\":94,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[26,53],\"misses\":[79]}}],"
 
       // Only one script in the script table.
       "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
-      "\"uri\":\"test-lib\",\"_kind\":\"script\"}]}",
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
       buffer);
 }
 
@@ -119,24 +122,25 @@
   report.PrintJSON(&js, script);
   ElideJSONSubstring("classes", js.ToCString(), buffer);
   ElideJSONSubstring("libraries", buffer, buffer);
+
   EXPECT_STREQ(
       "{\"type\":\"SourceReport\",\"ranges\":["
 
       // One range compiled with one hit at function declaration (helper0).
-      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":4,\"compiled\":true,"
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":11,\"compiled\":true,"
       "\"coverage\":{\"hits\":[0],\"misses\":[]}},"
 
       // This range is compiled even though it wasn't called (helper1).
-      "{\"scriptIndex\":0,\"startPos\":6,\"endPos\":10,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[],\"misses\":[6]}},"
+      "{\"scriptIndex\":0,\"startPos\":13,\"endPos\":24,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[13]}},"
 
       // One range with two hits and a miss (main).
-      "{\"scriptIndex\":0,\"startPos\":12,\"endPos\":39,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[12,23],\"misses\":[32]}}],"
+      "{\"scriptIndex\":0,\"startPos\":26,\"endPos\":94,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[26,53],\"misses\":[79]}}],"
 
       // Only one script in the script table.
       "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
-      "\"uri\":\"test-lib\",\"_kind\":\"script\"}]}",
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
       buffer);
 }
 
@@ -166,19 +170,19 @@
       "{\"type\":\"SourceReport\",\"ranges\":["
 
       // UnusedClass is not compiled.
-      "{\"scriptIndex\":0,\"startPos\":6,\"endPos\":20,\"compiled\":false},"
+      "{\"scriptIndex\":0,\"startPos\":13,\"endPos\":55,\"compiled\":false},"
 
       // helper0 is compiled.
-      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":4,\"compiled\":true,"
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":11,\"compiled\":true,"
       "\"coverage\":{\"hits\":[0],\"misses\":[]}},"
 
       // One range with two hits (main).
-      "{\"scriptIndex\":0,\"startPos\":22,\"endPos\":32,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[22,27],\"misses\":[]}}],"
+      "{\"scriptIndex\":0,\"startPos\":57,\"endPos\":79,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[57,68],\"misses\":[]}}],"
 
       // Only one script in the script table.
       "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
-      "\"uri\":\"test-lib\",\"_kind\":\"script\"}]}",
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
       buffer);
 }
 
@@ -208,20 +212,20 @@
       "{\"type\":\"SourceReport\",\"ranges\":["
 
       // UnusedClass.helper1 is compiled.
-      "{\"scriptIndex\":0,\"startPos\":10,\"endPos\":18,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[],\"misses\":[10,14]}},"
+      "{\"scriptIndex\":0,\"startPos\":30,\"endPos\":53,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[30,42]}},"
 
       // helper0 is compiled.
-      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":4,\"compiled\":true,"
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":11,\"compiled\":true,"
       "\"coverage\":{\"hits\":[0],\"misses\":[]}},"
 
       // One range with two hits (main).
-      "{\"scriptIndex\":0,\"startPos\":22,\"endPos\":32,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[22,27],\"misses\":[]}}],"
+      "{\"scriptIndex\":0,\"startPos\":57,\"endPos\":79,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[57,68],\"misses\":[]}}],"
 
       // Only one script in the script table.
       "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
-      "\"uri\":\"test-lib\",\"_kind\":\"script\"}]}",
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
       buffer);
 }
 
@@ -237,7 +241,7 @@
       "}";
 
   Library& lib = Library::Handle();
-  lib ^= ExecuteScript(kScript);
+  lib ^= ExecuteScript(kScript, true);
   ASSERT(!lib.IsNull());
   const Script& script =
       Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
@@ -251,23 +255,25 @@
       "{\"type\":\"SourceReport\",\"ranges\":["
 
       // UnusedClass has a syntax error.
-      "{\"scriptIndex\":0,\"startPos\":10,\"endPos\":18,\"compiled\":false,"
+      "{\"scriptIndex\":0,\"startPos\":30,\"endPos\":53,\"compiled\":false,"
       "\"error\":{\"type\":\"@Error\",\"_vmType\":\"LanguageError\","
       "\"kind\":\"LanguageError\",\"id\":\"objects\\/0\","
-      "\"message\":\"'test-lib': error: line 3 pos 26: unexpected token '}'\\n"
-      "  helper1() { helper0()+ }\\n                         ^\\n\"}},"
+      "\"message\":\"'file:\\/\\/\\/test-lib': error: "
+      "file:\\/\\/\\/test-lib:3:26: "
+      "Error: This couldn't be parsed.\\n"
+      "  helper1() { helper0()+ }\\n                         ^\"}},"
 
       // helper0 is compiled.
-      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":4,\"compiled\":true,"
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":11,\"compiled\":true,"
       "\"coverage\":{\"hits\":[0],\"misses\":[]}},"
 
       // One range with two hits (main).
-      "{\"scriptIndex\":0,\"startPos\":22,\"endPos\":32,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[22,27],\"misses\":[]}}],"
+      "{\"scriptIndex\":0,\"startPos\":57,\"endPos\":79,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[57,68],\"misses\":[]}}],"
 
       // Only one script in the script table.
       "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
-      "\"uri\":\"test-lib\",\"_kind\":\"script\"}]}",
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
       buffer);
 }
 
@@ -299,30 +305,31 @@
   report.PrintJSON(&js, script);
   ElideJSONSubstring("classes", js.ToCString(), buffer);
   ElideJSONSubstring("libraries", buffer, buffer);
+
   EXPECT_STREQ(
       "{\"type\":\"SourceReport\",\"ranges\":["
 
       // One range compiled with one hit (helper0).
-      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":22,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[0,18],\"misses\":[]}},"
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":73,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[0,69],\"misses\":[]}},"
 
       // One range not compiled (helper1).
-      "{\"scriptIndex\":0,\"startPos\":24,\"endPos\":28,\"compiled\":false},"
+      "{\"scriptIndex\":0,\"startPos\":75,\"endPos\":86,\"compiled\":false},"
 
       // One range with two hits and a miss (main).
-      "{\"scriptIndex\":0,\"startPos\":30,\"endPos\":57,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[30,41],\"misses\":[50]}},"
+      "{\"scriptIndex\":0,\"startPos\":88,\"endPos\":156,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[88,115],\"misses\":[141]}},"
 
       // Nested range compiled (nestedHelper0).
-      "{\"scriptIndex\":0,\"startPos\":5,\"endPos\":9,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[5],\"misses\":[]}},"
+      "{\"scriptIndex\":0,\"startPos\":14,\"endPos\":31,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[14],\"misses\":[]}},"
 
       // Nested range not compiled (nestedHelper1).
-      "{\"scriptIndex\":0,\"startPos\":11,\"endPos\":15,\"compiled\":false}],"
+      "{\"scriptIndex\":0,\"startPos\":35,\"endPos\":52,\"compiled\":false}],"
 
       // Only one script in the script table.
       "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
-      "\"uri\":\"test-lib\",\"_kind\":\"script\"}]}",
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
       buffer);
 }
 
@@ -357,23 +364,24 @@
   report.PrintJSON(&js, script, helper.token_pos(), helper.end_token_pos());
   ElideJSONSubstring("classes", js.ToCString(), buffer);
   ElideJSONSubstring("libraries", buffer, buffer);
+
   EXPECT_STREQ(
       "{\"type\":\"SourceReport\",\"ranges\":["
 
       // One range compiled with one hit (helper0).
-      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":22,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[0,18],\"misses\":[]}},"
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":73,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[0,69],\"misses\":[]}},"
 
       // Nested range compiled (nestedHelper0).
-      "{\"scriptIndex\":0,\"startPos\":5,\"endPos\":9,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[5],\"misses\":[]}},"
+      "{\"scriptIndex\":0,\"startPos\":14,\"endPos\":31,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[14],\"misses\":[]}},"
 
       // Nested range not compiled (nestedHelper1).
-      "{\"scriptIndex\":0,\"startPos\":11,\"endPos\":15,\"compiled\":false}],"
+      "{\"scriptIndex\":0,\"startPos\":35,\"endPos\":52,\"compiled\":false}],"
 
       // Only one script in the script table.
       "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
-      "\"uri\":\"test-lib\",\"_kind\":\"script\"}]}",
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
       buffer);
 }
 
@@ -406,8 +414,8 @@
 
   // Make sure that the main function was found.
   EXPECT_SUBSTRING(
-      "\"startPos\":12,\"endPos\":39,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[12,23],\"misses\":[32]}",
+      "\"startPos\":26,\"endPos\":94,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[26,53],\"misses\":[79]}",
       result);
 
   // More than one script is referenced in the report.
@@ -445,8 +453,8 @@
 
   // Make sure that the main function was found.
   EXPECT_SUBSTRING(
-      "\"startPos\":12,\"endPos\":39,\"compiled\":true,"
-      "\"coverage\":{\"hits\":[12,23],\"misses\":[32]}",
+      "\"startPos\":26,\"endPos\":94,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[26,53],\"misses\":[79]}",
       result);
 
   // More than one script is referenced in the report.
@@ -479,25 +487,25 @@
       "{\"type\":\"SourceReport\",\"ranges\":["
 
       // One range compiled with no callsites (helper0).
-      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":4,\"compiled\":true,"
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":11,\"compiled\":true,"
       "\"callSites\":[]},"
 
       // One range not compiled (helper1).
-      "{\"scriptIndex\":0,\"startPos\":6,\"endPos\":10,\"compiled\":false},"
+      "{\"scriptIndex\":0,\"startPos\":13,\"endPos\":24,\"compiled\":false},"
 
       // One range compiled with one callsite (main).
-      "{\"scriptIndex\":0,\"startPos\":12,\"endPos\":22,\"compiled\":true,"
+      "{\"scriptIndex\":0,\"startPos\":26,\"endPos\":48,\"compiled\":true,"
       "\"callSites\":["
-      "{\"name\":\"helper0\",\"tokenPos\":17,\"cacheEntries\":["
+      "{\"name\":\"helper0\",\"tokenPos\":37,\"cacheEntries\":["
       "{\"target\":{\"type\":\"@Function\",\"fixedId\":true,\"id\":\"\","
       "\"name\":\"helper0\",\"owner\":{\"type\":\"@Library\",\"fixedId\":true,"
-      "\"id\":\"\",\"name\":\"\",\"uri\":\"test-lib\"},"
+      "\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"},"
       "\"_kind\":\"RegularFunction\",\"static\":true,\"const\":false,"
       "\"_intrinsic\":false,\"_native\":false},\"count\":1}]}]}],"
 
       // One script in the script table.
       "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
-      "\"uri\":\"test-lib\",\"_kind\":\"script\"}]}",
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
       buffer);
 }
 
@@ -538,10 +546,10 @@
       "{\"type\":\"SourceReport\",\"ranges\":["
 
       // One range...
-      "{\"scriptIndex\":0,\"startPos\":24,\"endPos\":37,\"compiled\":true,"
+      "{\"scriptIndex\":0,\"startPos\":60,\"endPos\":88,\"compiled\":true,"
 
       // With one call site...
-      "\"callSites\":[{\"name\":\"func\",\"tokenPos\":32,\"cacheEntries\":["
+      "\"callSites\":[{\"name\":\"dyn:func\",\"tokenPos\":80,\"cacheEntries\":["
 
       // First receiver: "Common", called twice.
       "{\"receiver\":{\"type\":\"@Class\",\"fixedId\":true,\"id\":\"\","
@@ -571,7 +579,7 @@
 
       // One script in the script table.
       "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
-      "\"uri\":\"test-lib\",\"_kind\":\"script\"}]}",
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
       buffer);
 }
 
@@ -599,27 +607,27 @@
       "{\"type\":\"SourceReport\",\"ranges\":["
 
       // One range compiled with no callsites (helper0).
-      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":4,\"compiled\":true,"
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":11,\"compiled\":true,"
       "\"callSites\":[],"
       "\"coverage\":{\"hits\":[0],\"misses\":[]}},"
 
       // One range not compiled (helper1).
-      "{\"scriptIndex\":0,\"startPos\":6,\"endPos\":10,\"compiled\":false},"
+      "{\"scriptIndex\":0,\"startPos\":13,\"endPos\":24,\"compiled\":false},"
 
       // One range compiled with one callsite (main).
-      "{\"scriptIndex\":0,\"startPos\":12,\"endPos\":22,\"compiled\":true,"
+      "{\"scriptIndex\":0,\"startPos\":26,\"endPos\":48,\"compiled\":true,"
       "\"callSites\":["
-      "{\"name\":\"helper0\",\"tokenPos\":17,\"cacheEntries\":["
+      "{\"name\":\"helper0\",\"tokenPos\":37,\"cacheEntries\":["
       "{\"target\":{\"type\":\"@Function\",\"fixedId\":true,\"id\":\"\","
       "\"name\":\"helper0\",\"owner\":{\"type\":\"@Library\",\"fixedId\":true,"
-      "\"id\":\"\",\"name\":\"\",\"uri\":\"test-lib\"},"
+      "\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"},"
       "\"_kind\":\"RegularFunction\",\"static\":true,\"const\":false,"
       "\"_intrinsic\":false,\"_native\":false},\"count\":1}]}],"
-      "\"coverage\":{\"hits\":[12,17],\"misses\":[]}}],"
+      "\"coverage\":{\"hits\":[26,37],\"misses\":[]}}],"
 
       // One script in the script table.
       "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
-      "\"uri\":\"test-lib\",\"_kind\":\"script\"}]}",
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
       buffer);
 }
 
@@ -651,19 +659,19 @@
       "{\"type\":\"SourceReport\",\"ranges\":["
 
       // helper0.
-      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":4,\"compiled\":true,"
-      "\"possibleBreakpoints\":[1,4]},"
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":11,\"compiled\":true,"
+      "\"possibleBreakpoints\":[7,11]},"
 
       // One range not compiled (helper1).
-      "{\"scriptIndex\":0,\"startPos\":6,\"endPos\":10,\"compiled\":false},"
+      "{\"scriptIndex\":0,\"startPos\":13,\"endPos\":24,\"compiled\":false},"
 
       // main.
-      "{\"scriptIndex\":0,\"startPos\":12,\"endPos\":39,\"compiled\":true,"
-      "\"possibleBreakpoints\":[13,23,32,39]}],"
+      "{\"scriptIndex\":0,\"startPos\":26,\"endPos\":94,\"compiled\":true,"
+      "\"possibleBreakpoints\":[30,53,79,94]}],"
 
       // Only one script in the script table.
       "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
-      "\"uri\":\"test-lib\",\"_kind\":\"script\"}]}",
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
       buffer);
 }
 
diff --git a/runtime/vm/static_type_exactness_state.h b/runtime/vm/static_type_exactness_state.h
index 1660eba..17e0089 100644
--- a/runtime/vm/static_type_exactness_state.h
+++ b/runtime/vm/static_type_exactness_state.h
@@ -93,7 +93,7 @@
     return StaticTypeExactnessState(kNotTracking);
   }
 
-  static inline StaticTypeExactnessState Unitialized() {
+  static inline StaticTypeExactnessState Uninitialized() {
     return StaticTypeExactnessState(kUninitialized);
   }
 
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 9171436..6b49fce 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -39,10 +39,6 @@
   UNREACHABLE();
 }
 
-void StubCode::Cleanup() {
-  // Stubs will be loaded from the snapshot.
-  UNREACHABLE();
-}
 #else
 
 #define STUB_CODE_GENERATE(name)                                               \
@@ -69,20 +65,12 @@
 #undef STUB_CODE_GENERATE
 #undef STUB_CODE_SET_OBJECT_POOL
 
-#define STUB_CODE_CLEANUP(name) entries_[k##name##Index] = nullptr;
-
-void StubCode::Cleanup() {
-  VM_STUB_CODE_LIST(STUB_CODE_CLEANUP);
-}
-
-#undef STUB_CODE_CLEANUP
-
 RawCode* StubCode::Generate(const char* name,
                             ObjectPoolBuilder* object_pool_builder,
                             void (*GenerateStub)(Assembler* assembler)) {
   Assembler assembler(object_pool_builder);
   GenerateStub(&assembler);
-  const Code& code = Code::Handle(Code::FinalizeCode(
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       name, nullptr, &assembler, Code::PoolAttachment::kNotAttachPool,
       /*optimized=*/false));
 #ifndef PRODUCT
@@ -102,6 +90,14 @@
 }
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
+#define STUB_CODE_CLEANUP(name) entries_[k##name##Index] = nullptr;
+
+void StubCode::Cleanup() {
+  VM_STUB_CODE_LIST(STUB_CODE_CLEANUP);
+}
+
+#undef STUB_CODE_CLEANUP
+
 void StubCode::VisitObjectPointers(ObjectPointerVisitor* visitor) {}
 
 bool StubCode::HasBeenInitialized() {
@@ -185,8 +181,9 @@
     compiler::StubCodeCompiler::GenerateAllocationStubForClass(&assembler, cls);
 
     if (thread->IsMutatorThread()) {
-      stub ^= Code::FinalizeCode(name, nullptr, &assembler, pool_attachment,
-                                 /*optimized1*/ false);
+      stub ^= Code::FinalizeCodeAndNotify(name, nullptr, &assembler,
+                                          pool_attachment,
+                                          /*optimized1*/ false);
       // Check if background compilation thread has not already added the stub.
       if (cls.allocation_stub() == Code::null()) {
         stub.set_owner(cls);
@@ -210,11 +207,16 @@
         // Do not Garbage collect during this stage and instead allow the
         // heap to grow.
         NoHeapGrowthControlScope no_growth_control;
-        stub ^= Code::FinalizeCode(name, nullptr, &assembler, pool_attachment,
-                                   false /* optimized */);
+        stub ^= Code::FinalizeCode(nullptr, &assembler, pool_attachment,
+                                   /*optimized=*/false, /*stats=*/nullptr);
         stub.set_owner(cls);
         cls.set_allocation_stub(stub);
       }
+
+      // We notify code observers after finalizing the code in order to be
+      // outside a [SafepointOperationScope].
+      Code::NotifyCodeObservers(nullptr, stub, /*optimized=*/false);
+
       Isolate* isolate = thread->isolate();
       if (isolate->heap()->NeedsGarbageCollection()) {
         isolate->heap()->CollectMostGarbage();
@@ -260,7 +262,7 @@
       &assembler, closure_allocation_stub, context_allocation_stub);
 
   const char* name = "BuildMethodExtractor";
-  const Code& stub = Code::Handle(Code::FinalizeCode(
+  const Code& stub = Code::Handle(Code::FinalizeCodeAndNotify(
       name, nullptr, &assembler, Code::PoolAttachment::kNotAttachPool,
       /*optimized=*/false));
 
diff --git a/runtime/vm/stub_code_arm64_test.cc b/runtime/vm/stub_code_arm64_test.cc
index 5dbe70d..4e69a5a 100644
--- a/runtime/vm/stub_code_arm64_test.cc
+++ b/runtime/vm/stub_code_arm64_test.cc
@@ -58,9 +58,9 @@
   ObjectPoolBuilder object_pool_builder;
   Assembler assembler(&object_pool_builder);
   GenerateCallToCallRuntimeStub(&assembler, length);
-  const Code& code = Code::Handle(
-      Code::FinalizeCode(*CreateFunction("Test_CallRuntimeStubCode"), nullptr,
-                         &assembler, Code::PoolAttachment::kAttachPool));
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
+      *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler,
+      Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
   Array& result = Array::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
@@ -100,7 +100,7 @@
   Assembler assembler(&object_pool_builder);
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
-  const Code& code = Code::Handle(Code::FinalizeCode(
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler,
       Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
diff --git a/runtime/vm/stub_code_arm_test.cc b/runtime/vm/stub_code_arm_test.cc
index 85224e3..2a66478 100644
--- a/runtime/vm/stub_code_arm_test.cc
+++ b/runtime/vm/stub_code_arm_test.cc
@@ -57,9 +57,9 @@
   ObjectPoolBuilder object_pool_builder;
   Assembler assembler(&object_pool_builder);
   GenerateCallToCallRuntimeStub(&assembler, length);
-  const Code& code = Code::Handle(
-      Code::FinalizeCode(*CreateFunction("Test_CallRuntimeStubCode"), nullptr,
-                         &assembler, Code::PoolAttachment::kAttachPool));
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
+      *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler,
+      Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
   Array& result = Array::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
@@ -98,7 +98,7 @@
   Assembler assembler(&object_pool_builder);
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
-  const Code& code = Code::Handle(Code::FinalizeCode(
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler,
       Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index 94bac2e..a4f79fc 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -57,9 +57,9 @@
   const char* kName = "Test_CallRuntimeStubCode";
   Assembler assembler(nullptr);
   GenerateCallToCallRuntimeStub(&assembler, length);
-  const Code& code = Code::Handle(
-      Code::FinalizeCode(*CreateFunction("Test_CallRuntimeStubCode"), nullptr,
-                         &assembler, Code::PoolAttachment::kAttachPool));
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
+      *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler,
+      Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
   Array& result = Array::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
@@ -102,7 +102,7 @@
   Assembler assembler(nullptr);
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
-  const Code& code = Code::Handle(Code::FinalizeCode(
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler,
       Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index 53917bb..a71484a 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -58,9 +58,9 @@
   ObjectPoolBuilder object_pool_builder;
   Assembler assembler(&object_pool_builder);
   GenerateCallToCallRuntimeStub(&assembler, length);
-  const Code& code = Code::Handle(
-      Code::FinalizeCode(*CreateFunction("Test_CallRuntimeStubCode"), nullptr,
-                         &assembler, Code::PoolAttachment::kAttachPool));
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
+      *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler,
+      Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
   Array& result = Array::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
@@ -100,7 +100,7 @@
   Assembler assembler(&object_pool_builder);
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
-  const Code& code = Code::Handle(Code::FinalizeCode(
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler,
       Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index b10f4e8..3a80632 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -303,48 +303,6 @@
   isolate->object_store()->set_symbol_table(array);
 }
 
-RawArray* Symbols::UnifiedSymbolTable() {
-  Thread* thread = Thread::Current();
-  Isolate* isolate = thread->isolate();
-  Zone* zone = thread->zone();
-
-  ASSERT(thread->IsMutatorThread());
-
-  SymbolTable vm_table(zone,
-                       Dart::vm_isolate()->object_store()->symbol_table());
-  SymbolTable table(zone, isolate->object_store()->symbol_table());
-  intptr_t unified_size = vm_table.NumOccupied() + table.NumOccupied();
-  SymbolTable unified_table(
-      zone, HashTables::New<SymbolTable>(unified_size, Heap::kOld));
-  String& symbol = String::Handle(zone);
-
-  SymbolTable::Iterator vm_iter(&vm_table);
-  while (vm_iter.MoveNext()) {
-    symbol ^= vm_table.GetKey(vm_iter.Current());
-    ASSERT(!symbol.IsNull());
-    bool present = unified_table.Insert(symbol);
-    ASSERT(!present);
-  }
-  vm_table.Release();
-
-  SymbolTable::Iterator iter(&table);
-  while (iter.MoveNext()) {
-    symbol ^= table.GetKey(iter.Current());
-    ASSERT(!symbol.IsNull());
-    bool present = unified_table.Insert(symbol);
-    ASSERT(!present);
-  }
-  table.Release();
-
-  // TODO(30378): The default load factor of 0.75 / 2 burns ~100KB, but
-  // increasing the load factor regresses Flutter's hot restart time.
-  // const double kMinLoad = 0.90;
-  // const double kMaxLoad = 0.90;
-  // HashTables::EnsureLoadFactor(kMinLoad, kMaxLoad, unified_table);
-
-  return unified_table.Release().raw();
-}
-
 void Symbols::Compact() {
   Thread* thread = Thread::Current();
   ASSERT(thread->isolate() != Dart::vm_isolate());
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 68c0371..7cb99ae 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -221,6 +221,7 @@
   V(_GrowableListWithData, "_GrowableList.withData")                           \
   V(_ImmutableList, "_ImmutableList")                                          \
   V(_LinkedHashMap, "_InternalLinkedHashMap")                                  \
+  V(_LinkedHashSet, "_CompactLinkedHashSet")                                   \
   V(_rehashObjects, "_rehashObjects")                                          \
   V(_String, "String")                                                         \
   V(OneByteString, "_OneByteString")                                           \
@@ -368,6 +369,7 @@
   V(Index, "index")                                                            \
   V(DartScheme, "dart:")                                                       \
   V(DartSchemePrivate, "dart:_")                                               \
+  V(DartExtensionScheme, "dart-ext:")                                          \
   V(DartInternalPackage, "package:dart_internal/")                             \
   V(DartNativeWrappers, "dart:nativewrappers")                                 \
   V(DartNativeWrappersLibName, "nativewrappers")                               \
@@ -627,8 +629,6 @@
   // Initialize and setup a symbol table for the isolate.
   static void SetupSymbolTable(Isolate* isolate);
 
-  static RawArray* UnifiedSymbolTable();
-
   // Treat the symbol table as weak and collect garbage.
   static void Compact();
 
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 866af84..78cea42 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -383,6 +383,7 @@
     thread->DeferredMarkingStackRelease();
   }
   thread->StoreBufferRelease();
+  thread->heap()->AbandonRemainingTLAB(thread);
   Isolate* isolate = thread->isolate();
   ASSERT(isolate != NULL);
   const bool kIsNotMutatorThread = false;
@@ -739,7 +740,7 @@
   // [object] is in fact a [Code] object.
   if (object.IsCode()) {
 #define COMPUTE_OFFSET(type_name, member_name, expr, default_init_value)       \
-  ASSERT((expr)->IsVMHeapObject());                                            \
+  ASSERT((expr)->IsReadOnly());                                                \
   if (object.raw() == expr) {                                                  \
     return Thread::member_name##offset();                                      \
   }
@@ -750,7 +751,6 @@
   // For non [Code] objects we check if the object equals to any of the cached
   // non-stub entries.
 #define COMPUTE_OFFSET(type_name, member_name, expr, default_init_value)       \
-  ASSERT((expr)->IsVMHeapObject());                                            \
   if (object.raw() == expr) {                                                  \
     return Thread::member_name##offset();                                      \
   }
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index 7eeb900..9a42800 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -910,4 +910,56 @@
   }
 }
 
+class AllocateGlobsOfMemoryTask : public ThreadPool::Task {
+ public:
+  AllocateGlobsOfMemoryTask(Isolate* isolate, Monitor* done_monitor, bool* done)
+      : isolate_(isolate), done_monitor_(done_monitor), done_(done) {}
+
+  virtual void Run() {
+    Thread::EnterIsolateAsHelper(isolate_, Thread::kUnknownTask);
+    {
+      Thread* thread = Thread::Current();
+      StackZone stack_zone(thread);
+      Zone* zone = stack_zone.GetZone();
+      HANDLESCOPE(thread);
+      int count = 100 * 1000;
+      while (count-- > 0) {
+        String::Handle(zone, String::New("abc"));
+      }
+    }
+    Thread::ExitIsolateAsHelper();
+    // Tell main thread that we are ready.
+    {
+      MonitorLocker ml(done_monitor_);
+      ASSERT(!*done_);
+      *done_ = true;
+      ml.Notify();
+    }
+  }
+
+ private:
+  Isolate* isolate_;
+  Monitor* done_monitor_;
+  bool* done_;
+};
+
+ISOLATE_UNIT_TEST_CASE(ExerciseTLABs) {
+  const int NUMBER_TEST_THREADS = 10;
+  Monitor done_monitor[NUMBER_TEST_THREADS];
+  bool done[NUMBER_TEST_THREADS];
+  Isolate* isolate = thread->isolate();
+  for (int i = 0; i < NUMBER_TEST_THREADS; i++) {
+    done[i] = false;
+    Dart::thread_pool()->Run(
+        new AllocateGlobsOfMemoryTask(isolate, &done_monitor[i], &done[i]));
+  }
+
+  for (int i = 0; i < NUMBER_TEST_THREADS; i++) {
+    MonitorLocker ml(&done_monitor[i]);
+    while (!done[i]) {
+      ml.WaitWithSafepointCheck(thread);
+    }
+  }
+}
+
 }  // namespace dart
diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc
index 1f96aac..158c1c3 100644
--- a/runtime/vm/timeline.cc
+++ b/runtime/vm/timeline.cc
@@ -205,8 +205,8 @@
   ASSERT(recorder_ != NULL);
   enabled_streams_ = GetEnabledByDefaultTimelineStreams();
 // Global overrides.
-#define TIMELINE_STREAM_FLAG_DEFAULT(name, not_used)                           \
-  stream_##name##_.Init(#name, HasStream(enabled_streams_, #name));
+#define TIMELINE_STREAM_FLAG_DEFAULT(name, fuchsia_name)                       \
+  stream_##name##_.set_enabled(HasStream(enabled_streams_, #name));
   TIMELINE_STREAM_LIST(TIMELINE_STREAM_FLAG_DEFAULT)
 #undef TIMELINE_STREAM_FLAG_DEFAULT
 }
@@ -221,7 +221,7 @@
 #endif
 
 // Disable global streams.
-#define TIMELINE_STREAM_DISABLE(name, not_used)                                \
+#define TIMELINE_STREAM_DISABLE(name, fuchsia_name)                            \
   Timeline::stream_##name##_.set_enabled(false);
   TIMELINE_STREAM_LIST(TIMELINE_STREAM_DISABLE)
 #undef TIMELINE_STREAM_DISABLE
@@ -270,13 +270,13 @@
   }
   {
     JSONArray availableStreams(&obj, "availableStreams");
-#define ADD_STREAM_NAME(name, not_used) availableStreams.AddValue(#name);
+#define ADD_STREAM_NAME(name, fuchsia_name) availableStreams.AddValue(#name);
     TIMELINE_STREAM_LIST(ADD_STREAM_NAME);
 #undef ADD_STREAM_NAME
   }
   {
     JSONArray recordedStreams(&obj, "recordedStreams");
-#define ADD_RECORDED_STREAM_NAME(name, not_used)                               \
+#define ADD_RECORDED_STREAM_NAME(name, fuchsia_name)                           \
   if (stream_##name##_.enabled()) {                                            \
     recordedStreams.AddValue(#name);                                           \
   }
@@ -377,8 +377,8 @@
 TimelineEventRecorder* Timeline::recorder_ = NULL;
 MallocGrowableArray<char*>* Timeline::enabled_streams_ = NULL;
 
-#define TIMELINE_STREAM_DEFINE(name, enabled_by_default)                       \
-  TimelineStream Timeline::stream_##name##_;
+#define TIMELINE_STREAM_DEFINE(name, fuchsia_name)                             \
+  TimelineStream Timeline::stream_##name##_(#name, fuchsia_name, false);
 TIMELINE_STREAM_LIST(TIMELINE_STREAM_DEFINE)
 #undef TIMELINE_STREAM_DEFINE
 
@@ -389,7 +389,7 @@
       thread_timestamp1_(-1),
       state_(0),
       label_(NULL),
-      category_(""),
+      stream_(NULL),
       thread_(OSThread::kInvalidThreadId),
       isolate_id_(ILLEGAL_PORT) {}
 
@@ -404,7 +404,7 @@
   state_ = 0;
   thread_ = OSThread::kInvalidThreadId;
   isolate_id_ = ILLEGAL_PORT;
-  category_ = "";
+  stream_ = NULL;
   label_ = NULL;
   arguments_.Free();
   set_event_type(kNone);
@@ -546,14 +546,6 @@
   }
 }
 
-void TimelineEvent::StreamInit(TimelineStream* stream) {
-  if (stream != NULL) {
-    category_ = stream->name();
-  } else {
-    category_ = "";
-  }
-}
-
 void TimelineEvent::Init(EventType event_type, const char* label) {
   ASSERT(label != NULL);
   state_ = 0;
@@ -607,7 +599,7 @@
   int64_t pid = OS::ProcessId();
   int64_t tid = OSThread::ThreadIdToIntPtr(thread_);
   obj.AddProperty("name", label_);
-  obj.AddProperty("cat", category_);
+  obj.AddProperty("cat", stream_ != NULL ? stream_->name() : NULL);
   obj.AddProperty64("tid", tid);
   obj.AddProperty64("pid", pid);
   obj.AddPropertyTimeMicros("ts", TimeOrigin());
@@ -738,11 +730,16 @@
   return thread_timestamp1_ - thread_timestamp0_;
 }
 
-TimelineStream::TimelineStream() : name_(NULL), enabled_(false) {}
-
-void TimelineStream::Init(const char* name, bool enabled) {
-  name_ = name;
-  enabled_ = enabled;
+TimelineStream::TimelineStream(const char* name,
+                               const char* fuchsia_name,
+                               bool enabled)
+    : name_(name),
+      fuchsia_name_(fuchsia_name),
+#if defined(HOST_OS_FUCHSIA)
+      enabled_(true) {  // For generated code.
+#else
+      enabled_(enabled) {
+#endif
 }
 
 TimelineEvent* TimelineStream::StartEvent() {
@@ -1111,10 +1108,13 @@
 
 int64_t TimelineEventRecorder::GetNextAsyncId() {
   // TODO(johnmccutchan): Gracefully handle wrap around.
-  // TODO(rmacnak): Use TRACE_NONCE() on Fuchsia?
+#if defined(HOST_OS_FUCHSIA)
+  return trace_generate_nonce();
+#else
   uint32_t next =
       static_cast<uint32_t>(AtomicOperations::FetchAndIncrement(&async_id_));
   return static_cast<int64_t>(next);
+#endif
 }
 
 void TimelineEventRecorder::FinishBlock(TimelineEventBlock* block) {
diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h
index 0f50fbd..1d1462a 100644
--- a/runtime/vm/timeline.h
+++ b/runtime/vm/timeline.h
@@ -9,10 +9,16 @@
 
 #include "vm/allocation.h"
 #include "vm/bitfield.h"
+#include "vm/globals.h"
 #include "vm/growable_array.h"
 #include "vm/os.h"
 #include "vm/os_thread.h"
 
+#if defined(HOST_OS_FUCHSIA)
+#include <trace-engine/context.h>
+#include <trace-engine/instrumentation.h>
+#endif
+
 namespace dart {
 
 class JSONArray;
@@ -30,29 +36,35 @@
 class VirtualMemory;
 class Zone;
 
-// (name, enabled by default for isolate).
+// (name, fuchsia_name).
 #define TIMELINE_STREAM_LIST(V)                                                \
-  V(API, false)                                                                \
-  V(Compiler, false)                                                           \
-  V(CompilerVerbose, false)                                                    \
-  V(Dart, false)                                                               \
-  V(Debugger, false)                                                           \
-  V(Embedder, false)                                                           \
-  V(GC, false)                                                                 \
-  V(Isolate, false)                                                            \
-  V(VM, false)
+  V(API, "dart:api")                                                           \
+  V(Compiler, "dart:compiler")                                                 \
+  V(CompilerVerbose, "dart:compiler.verbose")                                  \
+  V(Dart, "dart:dart")                                                         \
+  V(Debugger, "dart:debugger")                                                 \
+  V(Embedder, "dart:embedder")                                                 \
+  V(GC, "dart:gc")                                                             \
+  V(Isolate, "dart:isolate")                                                   \
+  V(Profiler, "dart:profiler")                                                 \
+  V(VM, "dart:vm")
 
 // A stream of timeline events. A stream has a name and can be enabled or
 // disabled (globally and per isolate).
 class TimelineStream {
  public:
-  TimelineStream();
-
-  void Init(const char* name, bool enabled);
+  TimelineStream(const char* name, const char* fuchsia_name, bool enabled);
 
   const char* name() const { return name_; }
+  const char* fuchsia_name() const { return fuchsia_name_; }
 
-  bool enabled() const { return enabled_ != 0; }
+  bool enabled() {
+#if defined(HOST_OS_FUCHSIA)
+    return trace_is_category_enabled(fuchsia_name_);
+#else
+    return enabled_ != 0;
+#endif
+  }
 
   void set_enabled(bool enabled) { enabled_ = enabled ? 1 : 0; }
 
@@ -66,12 +78,21 @@
     return OFFSET_OF(TimelineStream, enabled_);
   }
 
+#if defined(HOST_OS_FUCHSIA)
+  trace_site_t* trace_site() { return &trace_site_; }
+#endif
+
  private:
-  const char* name_;
+  const char* const name_;
+  const char* const fuchsia_name_;
 
   // This field is accessed by generated code (intrinsic) and expects to see
   // 0 or 1. If this becomes a BitField, the generated code must be updated.
   uintptr_t enabled_;
+
+#if defined(HOST_OS_FUCHSIA)
+  trace_site_t trace_site_ = {};
+#endif
 };
 
 class Timeline : public AllStatic {
@@ -95,12 +116,12 @@
   static void PrintFlagsToJSON(JSONStream* json);
 #endif
 
-#define TIMELINE_STREAM_ACCESSOR(name, not_used)                               \
+#define TIMELINE_STREAM_ACCESSOR(name, fuchsia_name)                           \
   static TimelineStream* Get##name##Stream() { return &stream_##name##_; }
   TIMELINE_STREAM_LIST(TIMELINE_STREAM_ACCESSOR)
 #undef TIMELINE_STREAM_ACCESSOR
 
-#define TIMELINE_STREAM_FLAGS(name, not_used)                                  \
+#define TIMELINE_STREAM_FLAGS(name, fuchsia_name)                              \
   static void SetStream##name##Enabled(bool enabled) {                         \
     stream_##name##_.set_enabled(enabled);                                     \
   }
@@ -111,8 +132,7 @@
   static TimelineEventRecorder* recorder_;
   static MallocGrowableArray<char*>* enabled_streams_;
 
-#define TIMELINE_STREAM_DECLARE(name, not_used)                                \
-  static bool stream_##name##_enabled_;                                        \
+#define TIMELINE_STREAM_DECLARE(name, fuchsia_name)                            \
   static TimelineStream stream_##name##_;
   TIMELINE_STREAM_LIST(TIMELINE_STREAM_DECLARE)
 #undef TIMELINE_STREAM_DECLARE
@@ -358,7 +378,7 @@
   intptr_t arguments_length() const { return arguments_.length(); }
 
  private:
-  void StreamInit(TimelineStream* stream);
+  void StreamInit(TimelineStream* stream) { stream_ = stream; }
   void Init(EventType event_type, const char* label);
 
   void set_event_type(EventType event_type) {
@@ -415,7 +435,7 @@
   TimelineEventArguments arguments_;
   uword state_;
   const char* label_;
-  const char* category_;
+  TimelineStream* stream_;
   ThreadId thread_;
   Dart_Port isolate_id_;
 
diff --git a/runtime/vm/timeline_android.cc b/runtime/vm/timeline_android.cc
index 5ca038b..6e5190a 100644
--- a/runtime/vm/timeline_android.cc
+++ b/runtime/vm/timeline_android.cc
@@ -51,16 +51,19 @@
     case TimelineEvent::kBegin: {
       length = Utils::SNPrint(buffer, buffer_size, "B|%" Pd64 "|%s", pid,
                               event->label());
-    } break;
+      break;
+    }
     case TimelineEvent::kEnd: {
       length = Utils::SNPrint(buffer, buffer_size, "E");
-    } break;
+      break;
+    }
     case TimelineEvent::kCounter: {
       if (event->arguments_length() > 0) {
         // We only report the first counter value.
         length = Utils::SNPrint(buffer, buffer_size, "C|%" Pd64 "|%s|%s", pid,
                                 event->label(), event->arguments()[0].value);
       }
+      break;
     }
     default:
       // Ignore event types that we cannot serialize to the Systrace format.
diff --git a/runtime/vm/timeline_fuchsia.cc b/runtime/vm/timeline_fuchsia.cc
index 9c0dab4..0110166 100644
--- a/runtime/vm/timeline_fuchsia.cc
+++ b/runtime/vm/timeline_fuchsia.cc
@@ -19,9 +19,10 @@
   if (event == NULL) {
     return;
   }
+  TimelineStream* stream = event->stream_;
   trace_string_ref_t category;
-  trace_context_t* context =
-      trace_acquire_context_for_category("dart", &category);
+  trace_context_t* context = trace_acquire_context_for_category_cached(
+      stream->fuchsia_name(), stream->trace_site(), &category);
   if (context == NULL) {
     return;
   }
diff --git a/runtime/vm/timeline_linux.cc b/runtime/vm/timeline_linux.cc
index 05ddb69..4dbad22 100644
--- a/runtime/vm/timeline_linux.cc
+++ b/runtime/vm/timeline_linux.cc
@@ -61,16 +61,19 @@
     case TimelineEvent::kBegin: {
       length = Utils::SNPrint(buffer, buffer_size, "B|%" Pd64 "|%s", pid,
                               event->label());
-    } break;
+      break;
+    }
     case TimelineEvent::kEnd: {
       length = Utils::SNPrint(buffer, buffer_size, "E");
-    } break;
+      break;
+    }
     case TimelineEvent::kCounter: {
       if (event->arguments_length() > 0) {
         // We only report the first counter value.
         length = Utils::SNPrint(buffer, buffer_size, "C|%" Pd64 "|%s|%s", pid,
                                 event->label(), event->arguments()[0].value);
       }
+      break;
     }
     default:
       // Ignore event types that we cannot serialize to the Systrace format.
diff --git a/runtime/vm/timeline_test.cc b/runtime/vm/timeline_test.cc
index 6e59425..eaf09f6 100644
--- a/runtime/vm/timeline_test.cc
+++ b/runtime/vm/timeline_test.cc
@@ -100,8 +100,7 @@
 
 TEST_CASE(TimelineEventIsValid) {
   // Create a test stream.
-  TimelineStream stream;
-  stream.Init("testStream", true);
+  TimelineStream stream("testStream", "testStream", true);
 
   TimelineEvent event;
   TimelineTestHelper::SetStream(&event, &stream);
@@ -120,8 +119,7 @@
 
 TEST_CASE(TimelineEventDuration) {
   // Create a test stream.
-  TimelineStream stream;
-  stream.Init("testStream", true);
+  TimelineStream stream("testStream", "testStream", true);
 
   // Create a test event.
   TimelineEvent event;
@@ -136,8 +134,7 @@
 
 TEST_CASE(TimelineEventDurationPrintJSON) {
   // Create a test stream.
-  TimelineStream stream;
-  stream.Init("testStream", true);
+  TimelineStream stream("testStream", "testStream", true);
 
   // Create a test event.
   TimelineEvent event;
@@ -167,8 +164,7 @@
   char buffer[kBufferLength];
 
   // Create a test stream.
-  TimelineStream stream;
-  stream.Init("testStream", true);
+  TimelineStream stream("testStream", "testStream", true);
 
   // Create a test event.
   TimelineEvent event;
@@ -212,8 +208,7 @@
 
 TEST_CASE(TimelineEventArguments) {
   // Create a test stream.
-  TimelineStream stream;
-  stream.Init("testStream", true);
+  TimelineStream stream("testStream", "testStream", true);
 
   // Create a test event.
   TimelineEvent event;
@@ -233,8 +228,7 @@
 
 TEST_CASE(TimelineEventArgumentsPrintJSON) {
   // Create a test stream.
-  TimelineStream stream;
-  stream.Init("testStream", true);
+  TimelineStream stream("testStream", "testStream", true);
 
   // Create a test event.
   TimelineEvent event;
@@ -296,8 +290,7 @@
   }
 
   // Create a test stream.
-  TimelineStream stream;
-  stream.Init("testStream", true);
+  TimelineStream stream("testStream", "testStream", true);
 
   TimelineEvent* event = NULL;
 
@@ -468,8 +461,7 @@
 }
 
 TEST_CASE(TimelineRingRecorderJSONOrder) {
-  TimelineStream stream;
-  stream.Init("testStream", true);
+  TimelineStream stream("testStream", "testStream", true);
 
   TimelineEventRingRecorder* recorder =
       new TimelineEventRingRecorder(TimelineEventBlock::kBlockSize * 2);
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 4b37b7f..f55e2d9 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -195,7 +195,7 @@
   const auto pool_attachment = FLAG_use_bare_instructions
                                    ? Code::PoolAttachment::kNotAttachPool
                                    : Code::PoolAttachment::kAttachPool;
-  const Code& code = Code::Handle(Code::FinalizeCode(
+  const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       name, nullptr, &assembler, pool_attachment, false /* optimized */));
   code.set_owner(type);
 #ifndef PRODUCT
@@ -246,7 +246,10 @@
 
   // Check the cid ranges which are a subtype of [type].
   if (hi->CanUseSubtypeRangeCheckFor(type)) {
-    const CidRangeVector& ranges = hi->SubtypeRangesForClass(type_class);
+    const CidRangeVector& ranges =
+        hi->SubtypeRangesForClass(type_class,
+                                  /*include_abstract=*/false,
+                                  /*exclude_null=*/false);
 
     const Type& int_type = Type::Handle(Type::IntType());
     const bool smi_is_ok = int_type.IsSubtypeOf(type, Heap::kNew);
@@ -410,7 +413,9 @@
     } else {
       const Class& type_class = Class::Handle(type_arg.type_class());
       const CidRangeVector& ranges =
-          hi->SubtypeRangesForClass(type_class, /*include_abstract=*/true);
+          hi->SubtypeRangesForClass(type_class,
+                                    /*include_abstract=*/true,
+                                    /*exclude_null=*/false);
 
       Label is_subtype;
       __ SmiUntag(class_id_reg);
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 50e55a0..1a28815 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -708,8 +708,8 @@
   Function& function = Function::ZoneHandle(
       Function::New(function_name, RawFunction::kRegularFunction, true, false,
                     false, false, false, cls, TokenPosition::kMinSource));
-  code_ = Code::FinalizeCode(function, nullptr, assembler_,
-                             Code::PoolAttachment::kAttachPool);
+  code_ = Code::FinalizeCodeAndNotify(function, nullptr, assembler_,
+                                      Code::PoolAttachment::kAttachPool);
   code_.set_owner(function);
   code_.set_exception_handlers(Object::empty_exception_handlers());
 #ifndef PRODUCT
diff --git a/runtime/vm/version.h b/runtime/vm/version.h
index 5f08dd3..24540c3 100644
--- a/runtime/vm/version.h
+++ b/runtime/vm/version.h
@@ -14,6 +14,9 @@
   static const char* String();
   static const char* SnapshotString();
   static const char* CommitString();
+  static int TargetAbiVersion();
+  static int CurrentAbiVersion();
+  static int OldestSupportedAbiVersion();
 
  private:
   static const char* str_;
diff --git a/runtime/vm/version_in.cc b/runtime/vm/version_in.cc
index 3a7d9c81..d59584b 100644
--- a/runtime/vm/version_in.cc
+++ b/runtime/vm/version_in.cc
@@ -5,10 +5,17 @@
 #include "vm/version.h"
 
 #include "vm/cpu.h"
+#include "vm/flags.h"
 #include "vm/os.h"
 
 namespace dart {
 
+DEFINE_FLAG(int,
+            use_abi_version,
+            Version::CurrentAbiVersion(),
+            "ABI version to use. Valid values are "
+            "{{OLDEST_SUPPORTED_ABI_VERSION}} to {{ABI_VERSION}}.");
+
 // TODO(iposva): Avoid racy initialization.
 static const char* formatted_version = NULL;
 
@@ -29,6 +36,22 @@
   return commit_;
 }
 
+int Version::TargetAbiVersion() {
+  int ver = FLAG_use_abi_version;
+  if (ver < OldestSupportedAbiVersion() || ver > CurrentAbiVersion()) {
+    ver = CurrentAbiVersion();
+  }
+  return ver;
+}
+
+int Version::CurrentAbiVersion() {
+  return {{ABI_VERSION}};
+}
+
+int Version::OldestSupportedAbiVersion() {
+  return {{OLDEST_SUPPORTED_ABI_VERSION}};
+}
+
 const char* Version::snapshot_hash_ = "{{SNAPSHOT_HASH}}";
 const char* Version::str_ = "{{VERSION_STR}} ({{COMMIT_TIME}})";
 const char* Version::commit_ = "{{VERSION_STR}}";
diff --git a/runtime/vm/vm_sources.gni b/runtime/vm/vm_sources.gni
index 198d04e..717b50c 100644
--- a/runtime/vm/vm_sources.gni
+++ b/runtime/vm/vm_sources.gni
@@ -152,7 +152,6 @@
   "malloc_hooks_arm.cc",
   "malloc_hooks_arm64.cc",
   "malloc_hooks_ia32.cc",
-  "malloc_hooks_jemalloc.cc",
   "malloc_hooks_tcmalloc.cc",
   "malloc_hooks_unsupported.cc",
   "malloc_hooks_x64.cc",
diff --git a/runtime/vm/zone_text_buffer.cc b/runtime/vm/zone_text_buffer.cc
index 5754b11..8d3032b 100644
--- a/runtime/vm/zone_text_buffer.cc
+++ b/runtime/vm/zone_text_buffer.cc
@@ -50,12 +50,7 @@
 void ZoneTextBuffer::EnsureCapacity(intptr_t len) {
   intptr_t remaining = capacity_ - length_;
   if (remaining <= len) {
-    const int kBufferSpareCapacity = 64;  // Somewhat arbitrary.
-    // TODO(turnidge): do we need to guard against overflow or other
-    // security issues here? Text buffers are used by the debugger
-    // to send user-controlled data (e.g. values of string variables) to
-    // the debugger front-end.
-    intptr_t new_capacity = capacity_ + len + kBufferSpareCapacity;
+    intptr_t new_capacity = capacity_ + Utils::Maximum(capacity_, len);
     buffer_ = zone_->Realloc<char>(buffer_, capacity_, new_capacity);
     capacity_ = new_capacity;
   }
diff --git a/samples/ffi/dylib_utils.dart b/samples/ffi/dylib_utils.dart
new file mode 100644
index 0000000..1929961
--- /dev/null
+++ b/samples/ffi/dylib_utils.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:ffi' as ffi;
+import 'dart:io' show Platform;
+
+String _platformPath(String name, {String path}) {
+  if (path == null) path = "";
+  if (Platform.isLinux) return path + "lib" + name + ".so";
+  if (Platform.isMacOS) return path + "lib" + name + ".dylib";
+  throw Exception("Platform not implemented");
+}
+
+ffi.DynamicLibrary dlopenPlatformSpecific(String name, {String path}) {
+  String fullPath = _platformPath(name, path: path);
+  return ffi.DynamicLibrary.open(fullPath);
+}
diff --git a/samples/ffi/sample_ffi_dynamic_library.dart b/samples/ffi/sample_ffi_dynamic_library.dart
index cf83400..234e3d0 100644
--- a/samples/ffi/sample_ffi_dynamic_library.dart
+++ b/samples/ffi/sample_ffi_dynamic_library.dart
@@ -4,12 +4,14 @@
 
 import 'dart:ffi' as ffi;
 
+import 'dylib_utils.dart';
+
 typedef NativeDoubleUnOp = ffi.Double Function(ffi.Double);
 
 typedef DoubleUnOp = double Function(double);
 
 main(List<String> arguments) {
-  ffi.DynamicLibrary l = ffi.DynamicLibrary.open("ffi_test_dynamic_library");
+  ffi.DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
   print(l);
   print(l.runtimeType);
 
diff --git a/samples/ffi/sample_ffi_functions.dart b/samples/ffi/sample_ffi_functions.dart
index 62b5718..4a3cf98 100644
--- a/samples/ffi/sample_ffi_functions.dart
+++ b/samples/ffi/sample_ffi_functions.dart
@@ -4,6 +4,8 @@
 
 import 'dart:ffi' as ffi;
 
+import 'dylib_utils.dart';
+
 typedef NativeUnaryOp = ffi.Int32 Function(ffi.Int32);
 typedef NativeBinaryOp = ffi.Int32 Function(ffi.Int32, ffi.Int32);
 typedef UnaryOp = int Function(int);
@@ -93,7 +95,7 @@
   print('start main');
 
   ffi.DynamicLibrary ffiTestFunctions =
-      ffi.DynamicLibrary.open("ffi_test_functions");
+      dlopenPlatformSpecific("ffi_test_functions");
 
   {
     // int32 bin op
diff --git a/samples/ffi/sample_ffi_functions_callbacks.dart b/samples/ffi/sample_ffi_functions_callbacks.dart
index ddd6840..8549377 100644
--- a/samples/ffi/sample_ffi_functions_callbacks.dart
+++ b/samples/ffi/sample_ffi_functions_callbacks.dart
@@ -4,6 +4,8 @@
 
 import 'dart:ffi' as ffi;
 
+import 'dylib_utils.dart';
+
 import 'coordinate.dart';
 
 typedef NativeCoordinateOp = Coordinate Function(Coordinate);
@@ -33,7 +35,7 @@
   print('start main');
 
   ffi.DynamicLibrary ffiTestFunctions =
-      ffi.DynamicLibrary.open("ffi_test_functions");
+      dlopenPlatformSpecific("ffi_test_functions");
 
   {
     // pass a c pointer to a c function as an argument to a c function
diff --git a/samples/ffi/sample_ffi_functions_structs.dart b/samples/ffi/sample_ffi_functions_structs.dart
index ba076e0..d2b1e41 100644
--- a/samples/ffi/sample_ffi_functions_structs.dart
+++ b/samples/ffi/sample_ffi_functions_structs.dart
@@ -4,6 +4,8 @@
 
 import 'dart:ffi' as ffi;
 
+import 'dylib_utils.dart';
+
 import 'coordinate.dart';
 
 typedef NativeCoordinateOp = Coordinate Function(Coordinate);
@@ -12,7 +14,7 @@
   print('start main');
 
   ffi.DynamicLibrary ffiTestFunctions =
-      ffi.DynamicLibrary.open("ffi_test_functions");
+      dlopenPlatformSpecific("ffi_test_functions");
 
   {
     // pass a struct to a c function and get a struct as return value
diff --git a/samples/sample_extension/sample_asynchronous_extension.dart b/samples/sample_extension/sample_asynchronous_extension.dart
index 69af1e5..6b81369 100644
--- a/samples/sample_extension/sample_asynchronous_extension.dart
+++ b/samples/sample_extension/sample_asynchronous_extension.dart
@@ -13,7 +13,7 @@
   static SendPort _port;
 
   Future<List<int>> randomArray(int seed, int length) {
-    var completer = new Completer();
+    var completer = new Completer<List<int>>();
     var replyPort = new RawReceivePort();
     var args = new List(3);
     args[0] = seed;
diff --git a/samples/samples.status b/samples/samples.status
index 3af1d7e..9ec1b23e 100644
--- a/samples/samples.status
+++ b/samples/samples.status
@@ -8,9 +8,6 @@
 [ $builder_tag == optimization_counter_threshold ]
 sample_extension/test/sample_extension_app_snapshot_test: SkipByDesign # This test is too slow for testing with low optimization counter threshold.
 
-[ $compiler == app_jit ]
-sample_extension/test/sample_extension_app_snapshot_test: RuntimeError
-
 [ $compiler == precompiler ]
 sample_extension/test/*: Skip # These tests attempt to spawn another script using the precompiled runtime.
 
@@ -26,9 +23,9 @@
 [ !$preview_dart_2 && ($runtime == dart_precompiled || $runtime == vm) ]
 *: SkipByDesign # Deprecating all Dart1 modes of execution
 
-[ $compiler == app_jitk || $compiler == dartk || $compiler == dartkb || $compiler == dartkp ]
-sample_extension/test/sample_extension_app_snapshot_test: RuntimeError
-sample_extension/test/sample_extension_test: RuntimeError
+[ $compiler == app_jitk || $compiler == dartkb || $compiler == dartkp ]
+sample_extension/test/sample_extension_app_snapshot_test: SkipByDesign
+sample_extension/test/sample_extension_test: SkipByDesign
 
 # Skip tests that use dart:io
 [ $runtime == d8 || $browser ]
diff --git a/sdk/lib/_internal/js_runtime/lib/annotations.dart b/sdk/lib/_internal/js_runtime/lib/annotations.dart
index 390024a..f53c5f3 100644
--- a/sdk/lib/_internal/js_runtime/lib/annotations.dart
+++ b/sdk/lib/_internal/js_runtime/lib/annotations.dart
@@ -4,31 +4,6 @@
 
 part of _js_helper;
 
-/// Tells the optimizing compiler that the annotated method has no
-/// side-effects. Allocations don't count as side-effects, since they can be
-/// dropped without changing the semantics of the program.
-///
-/// Requires @NoInline() to function correctly.
-class NoSideEffects {
-  const NoSideEffects();
-}
-
-/// Tells the optimizing compiler that the annotated method cannot throw.
-/// Requires @NoInline() to function correctly.
-class NoThrows {
-  const NoThrows();
-}
-
-/// Tells the optimizing compiler to not inline the annotated method.
-class NoInline {
-  const NoInline();
-}
-
-/// Tells the optimizing compiler to always inline the annotated method.
-class ForceInline {
-  const ForceInline();
-}
-
 /// Marks a class as native and defines its JavaScript name(s).
 class Native {
   final String name;
diff --git a/sdk/lib/_internal/js_runtime/lib/collection_patch.dart b/sdk/lib/_internal/js_runtime/lib/collection_patch.dart
index fc7a3bf..300d490 100644
--- a/sdk/lib/_internal/js_runtime/lib/collection_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/collection_patch.dart
@@ -7,6 +7,7 @@
 import 'dart:_js_helper'
     show
         fillLiteralMap,
+        fillLiteralSet,
         InternalMap,
         NoInline,
         NoSideEffects,
@@ -533,29 +534,29 @@
   factory LinkedHashMap.identity() = _LinkedIdentityHashMap<K, V>.es6;
 
   // Private factory constructor called by generated code for map literals.
-  @NoInline()
+  @pragma('dart2js:noInline')
   factory LinkedHashMap._literal(List keyValuePairs) {
     return fillLiteralMap(keyValuePairs, new JsLinkedHashMap<K, V>.es6());
   }
 
   // Private factory constructor called by generated code for map literals.
-  @NoThrows()
-  @NoInline()
-  @NoSideEffects()
+  @pragma('dart2js:noThrows')
+  @pragma('dart2js:noInline')
+  @pragma('dart2js:noSideEffects')
   factory LinkedHashMap._empty() {
     return new JsLinkedHashMap<K, V>.es6();
   }
 
   // Private factory static function called by generated code for map literals.
   // This version is for map literals without type parameters.
-  @NoThrows()
-  @NoInline()
-  @NoSideEffects()
+  @pragma('dart2js:noThrows')
+  @pragma('dart2js:noInline')
+  @pragma('dart2js:noSideEffects')
   static _makeEmpty() => new JsLinkedHashMap();
 
   // Private factory static function called by generated code for map literals.
   // This version is for map literals without type parameters.
-  @NoInline()
+  @pragma('dart2js:noInline')
   static _makeLiteral(keyValuePairs) =>
       fillLiteralMap(keyValuePairs, new JsLinkedHashMap());
 }
@@ -1239,6 +1240,30 @@
 
   @patch
   factory LinkedHashSet.identity() = _LinkedIdentityHashSet<E>;
+
+  // Private factory constructor called by generated code for set literals.
+  @pragma('dart2js:noThrows')
+  @pragma('dart2js:noInline')
+  @pragma('dart2js:noSideEffects')
+  factory LinkedHashSet._empty() => new _LinkedHashSet<E>();
+
+  // Private factory constructor called by generated code for set literals.
+  @pragma('dart2js:noInline')
+  factory LinkedHashSet._literal(List values) =>
+      fillLiteralSet(values, new _LinkedHashSet<E>());
+
+  // Private factory static function called by generated code for set literals.
+  // This version is for set literals without type parameters.
+  @pragma('dart2js:noThrows')
+  @pragma('dart2js:noInline')
+  @pragma('dart2js:noSideEffects')
+  static _makeEmpty() => new _LinkedHashSet();
+
+  // Private factory static function called by generated code for set literals.
+  // This version is for set literals without type parameters.
+  @pragma('dart2js:noInline')
+  static _makeLiteral(List values) =>
+      fillLiteralSet(values, new _LinkedHashSet());
 }
 
 class _LinkedHashSet<E> extends _SetBase<E> implements LinkedHashSet<E> {
diff --git a/sdk/lib/_internal/js_runtime/lib/core_patch.dart b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
index 27d7d25..045a2f1 100644
--- a/sdk/lib/_internal/js_runtime/lib/core_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
@@ -391,6 +391,22 @@
 
   @patch
   static int _now() => Primitives.timerTicks();
+
+  @patch
+  int get elapsedMicroseconds {
+    int ticks = elapsedTicks;
+    if (_frequency == 1000000) return ticks;
+    assert(_frequency == 1000);
+    return ticks * 1000;
+  }
+
+  @patch
+  int get elapsedMilliseconds {
+    int ticks = elapsedTicks;
+    if (_frequency == 1000) return ticks;
+    assert(_frequency == 1000000);
+    return ticks ~/ 1000;
+  }
 }
 
 // Patch for List implementation.
@@ -509,7 +525,7 @@
 
 @patch
 class RegExp {
-  @NoInline()
+  @pragma('dart2js:noInline')
   @patch
   factory RegExp(String source,
           {bool multiLine: false, bool caseSensitive: true}) =>
@@ -521,7 +537,8 @@
 }
 
 // Patch for 'identical' function.
-@NoInline() // No inlining since we recognize the call in optimizer.
+@pragma(
+    'dart2js:noInline') // No inlining since we recognize the call in optimizer.
 @patch
 bool identical(Object a, Object b) {
   return JS('bool', '(# == null ? # == null : # === #)', a, b, a, b);
@@ -731,7 +748,7 @@
 @patch
 class StackTrace {
   @patch
-  @NoInline()
+  @pragma('dart2js:noInline')
   static StackTrace get current {
     if (_hasErrorStackProperty) {
       return getTraceFromException(JS('', 'new Error()'));
@@ -1309,7 +1326,7 @@
   /// Shifts the digits of [xDigits] into the right place in [resultDigits].
   ///
   /// `resultDigits[ds..xUsed+ds] = xDigits[0..xUsed-1] << (n % _DIGIT_BITS)`
-  ///   where `ds = ceil(n / _DIGIT_BITS)`
+  ///   where `ds = n ~/ _DIGIT_BITS`
   ///
   /// Does *not* clear digits below ds.
   static void _lsh(
diff --git a/sdk/lib/_internal/js_runtime/lib/developer_patch.dart b/sdk/lib/_internal/js_runtime/lib/developer_patch.dart
index a1ae56c..0ff0f66 100644
--- a/sdk/lib/_internal/js_runtime/lib/developer_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/developer_patch.dart
@@ -10,7 +10,7 @@
 import 'dart:isolate';
 
 @patch
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool debugger({bool when: true, String message}) {
   if (when) {
     JS('', 'debugger');
diff --git a/sdk/lib/_internal/js_runtime/lib/interceptors.dart b/sdk/lib/_internal/js_runtime/lib/interceptors.dart
index 3344d39..b676c1b 100644
--- a/sdk/lib/_internal/js_runtime/lib/interceptors.dart
+++ b/sdk/lib/_internal/js_runtime/lib/interceptors.dart
@@ -84,7 +84,7 @@
 
 // Avoid inlining this method because inlining gives us multiple allocation
 // points for records which is bad because it leads to polymorphic access.
-@NoInline()
+@pragma('dart2js:noInline')
 makeDispatchRecord(interceptor, proto, extension, indexability) {
   // Dispatch records are stored in the prototype chain, and in some cases, on
   // instances.
diff --git a/sdk/lib/_internal/js_runtime/lib/internal_patch.dart b/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
index 9f82ae4..77884e2 100644
--- a/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
@@ -49,7 +49,7 @@
 }
 
 @patch
-@NoInline()
+@pragma('dart2js:noInline')
 Object extractTypeArguments<T>(T instance, Function extract) {
   // This function is recognized and replaced with calls to js_runtime.
 
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index 0befba60..d60398c 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -70,7 +70,7 @@
 
 /// Extracts the JavaScript-constructor name from the given isCheckProperty.
 // TODO(floitsch): move this to foreign_helper.dart or similar.
-@ForceInline()
+@pragma('dart2js:tryInline')
 String isCheckPropertyToJsConstructorName(String isCheckProperty) {
   return JS_BUILTIN('returns:String;depends:none;effects:none',
       JsBuiltin.isCheckPropertyToJsConstructorName, isCheckProperty);
@@ -78,7 +78,7 @@
 
 /// Returns true if the given [type] is a function type object.
 // TODO(floitsch): move this to foreign_helper.dart or similar.
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool isDartFunctionType(Object type) {
   // Function type test is using the `in` operator which doesn't work on
   // primitive types.
@@ -89,7 +89,7 @@
 
 /// Returns true if the given [type] is a FutureOr type object.
 // TODO(floitsch): move this to foreign_helper.dart or similar.
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool isDartFutureOrType(Object type) {
   // FutureOr test is using the `in` operator which doesn't work on primitive
   // types.
@@ -98,7 +98,7 @@
       'returns:bool;effects:none;depends:none', JsBuiltin.isFutureOrType, type);
 }
 
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool isDartVoidTypeRti(Object type) {
   return JS_BUILTIN(
       'returns:bool;effects:none;depends:none', JsBuiltin.isVoidType, type);
@@ -107,7 +107,7 @@
 /// Retrieves the class name from type information stored on the constructor of
 /// [type].
 // TODO(floitsch): move this to foreign_helper.dart or similar.
-@ForceInline()
+@pragma('dart2js:tryInline')
 String rawRtiToJsConstructorName(Object rti) {
   return JS_BUILTIN('String', JsBuiltin.rawRtiToJsConstructorName, rti);
 }
@@ -135,7 +135,7 @@
 // TODO(floitsch): move this to foreign_helper.dart or similar.
 // TODO(floitsch): we should call getInterceptor ourselves, but currently
 //    getInterceptor is not GVNed.
-@ForceInline()
+@pragma('dart2js:tryInline')
 Object getRawRuntimeType(Object o) {
   return JS_BUILTIN('', JsBuiltin.rawRuntimeType, o);
 }
@@ -144,7 +144,7 @@
 ///
 /// The argument [other] is the name of the other type, as computed by
 /// [runtimeTypeToString].
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool builtinIsSubtype(type, String other) {
   return JS_BUILTIN('returns:bool;effects:none;depends:none',
       JsBuiltin.isSubtype, other, type);
@@ -152,7 +152,7 @@
 
 /// Returns true if the given [type] is _the_ `Function` type.
 // TODO(floitsch): move this to foreign_helper.dart or similar.
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool isDartFunctionTypeRti(Object type) {
   return JS_BUILTIN(
       'returns:bool;effects:none;depends:none',
@@ -162,7 +162,7 @@
 }
 
 /// Returns true if the given [type] is _the_ `Null` type.
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool isNullType(Object type) {
   return JS_BUILTIN(
       'returns:bool;effects:none;depends:none',
@@ -173,13 +173,13 @@
 
 /// Returns whether the given type is the dynamic type.
 // TODO(floitsch): move this to foreign_helper.dart or similar.
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool isDartDynamicTypeRti(type) {
   return JS_BUILTIN(
       'returns:bool;effects:none;depends:none', JsBuiltin.isDynamicType, type);
 }
 
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool isDartJsInteropTypeArgumentRti(type) {
   return JS_BUILTIN('returns:bool;effects:none;depends:none',
       JsBuiltin.isJsInteropTypeArgument, type);
@@ -187,7 +187,7 @@
 
 /// Returns whether the given type is _the_ Dart Object type.
 // TODO(floitsch): move this to foreign_helper.dart or similar.
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool isDartObjectTypeRti(type) {
   return JS_BUILTIN(
       'returns:bool;effects:none;depends:none',
@@ -198,7 +198,7 @@
 
 /// Returns whether the given type is _the_ null type.
 // TODO(floitsch): move this to foreign_helper.dart or similar.
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool isNullTypeRti(type) {
   return JS_BUILTIN(
       'returns:bool;effects:none;depends:none',
@@ -209,7 +209,7 @@
 
 /// Returns the metadata of the given [index].
 // TODO(floitsch): move this to foreign_helper.dart or similar.
-@ForceInline()
+@pragma('dart2js:tryInline')
 getMetadata(int index) {
   return JS_BUILTIN(
       'returns:var;effects:none;depends:none', JsBuiltin.getMetadata, index);
@@ -217,7 +217,7 @@
 
 /// Returns the type of the given [index].
 // TODO(floitsch): move this to foreign_helper.dart or similar.
-@ForceInline()
+@pragma('dart2js:tryInline')
 getType(int index) {
   return JS_BUILTIN(
       'returns:var;effects:none;depends:none', JsBuiltin.getType, index);
@@ -281,7 +281,7 @@
 /// By default, whenever a method is invoked for the first time, it prints an id
 /// and the method name to the console. This can be overriden by adding a top
 /// level `dartCallInstrumentation` hook in JavaScript.
-@NoInline()
+@pragma('dart2js:noInline')
 void traceHelper(dynamic /*int*/ id, dynamic /*String*/ qualifiedName) {
   // Note: this method is written mostly in JavaScript to prevent a stack
   // overflow. In particular, we use dynamic argument types because with with
@@ -503,7 +503,7 @@
   /// Returns the type of [object] as a string (including type arguments).
   ///
   /// In minified mode, uses the unminified names if available.
-  @NoInline()
+  @pragma('dart2js:noInline')
   static String objectTypeName(Object object) {
     String className = _objectClassName(object);
     String arguments = joinArguments(getRuntimeTypeInfo(object), 0);
@@ -582,7 +582,7 @@
     return "Instance of '$name'";
   }
 
-  static num dateNow() => JS('int', r'Date.now()');
+  static int dateNow() => JS('int', r'Date.now()');
 
   static void initTicker() {
     if (timerFrequency != null) return;
@@ -799,7 +799,7 @@
   // that the result is really an integer, because the JavaScript implementation
   // may return -0.0 instead of 0.
   //
-  // They are marked as @NoThrows() because `receiver` comes from a receiver of
+  // They are marked as @pragma('dart2js:noThrows') because `receiver` comes from a receiver of
   // a method on DateTime (i.e. is not `null`).
 
   // TODO(sra): These methods are GVN-able. dart2js should implement an
@@ -809,63 +809,63 @@
   // year). Is it possible to factor them so that the `Date` is visible and can
   // be GVN-ed without a lot of code bloat?
 
-  @NoSideEffects()
-  @NoThrows()
-  @NoInline()
+  @pragma('dart2js:noSideEffects')
+  @pragma('dart2js:noThrows')
+  @pragma('dart2js:noInline')
   static getYear(DateTime receiver) {
     return (receiver.isUtc)
         ? JS('int', r'(#.getUTCFullYear() + 0)', lazyAsJsDate(receiver))
         : JS('int', r'(#.getFullYear() + 0)', lazyAsJsDate(receiver));
   }
 
-  @NoSideEffects()
-  @NoThrows()
-  @NoInline()
+  @pragma('dart2js:noSideEffects')
+  @pragma('dart2js:noThrows')
+  @pragma('dart2js:noInline')
   static getMonth(DateTime receiver) {
     return (receiver.isUtc)
         ? JS('JSUInt31', r'#.getUTCMonth() + 1', lazyAsJsDate(receiver))
         : JS('JSUInt31', r'#.getMonth() + 1', lazyAsJsDate(receiver));
   }
 
-  @NoSideEffects()
-  @NoThrows()
-  @NoInline()
+  @pragma('dart2js:noSideEffects')
+  @pragma('dart2js:noThrows')
+  @pragma('dart2js:noInline')
   static getDay(DateTime receiver) {
     return (receiver.isUtc)
         ? JS('JSUInt31', r'(#.getUTCDate() + 0)', lazyAsJsDate(receiver))
         : JS('JSUInt31', r'(#.getDate() + 0)', lazyAsJsDate(receiver));
   }
 
-  @NoSideEffects()
-  @NoThrows()
-  @NoInline()
+  @pragma('dart2js:noSideEffects')
+  @pragma('dart2js:noThrows')
+  @pragma('dart2js:noInline')
   static getHours(DateTime receiver) {
     return (receiver.isUtc)
         ? JS('JSUInt31', r'(#.getUTCHours() + 0)', lazyAsJsDate(receiver))
         : JS('JSUInt31', r'(#.getHours() + 0)', lazyAsJsDate(receiver));
   }
 
-  @NoSideEffects()
-  @NoThrows()
-  @NoInline()
+  @pragma('dart2js:noSideEffects')
+  @pragma('dart2js:noThrows')
+  @pragma('dart2js:noInline')
   static getMinutes(DateTime receiver) {
     return (receiver.isUtc)
         ? JS('JSUInt31', r'(#.getUTCMinutes() + 0)', lazyAsJsDate(receiver))
         : JS('JSUInt31', r'(#.getMinutes() + 0)', lazyAsJsDate(receiver));
   }
 
-  @NoSideEffects()
-  @NoThrows()
-  @NoInline()
+  @pragma('dart2js:noSideEffects')
+  @pragma('dart2js:noThrows')
+  @pragma('dart2js:noInline')
   static getSeconds(DateTime receiver) {
     return (receiver.isUtc)
         ? JS('JSUInt31', r'(#.getUTCSeconds() + 0)', lazyAsJsDate(receiver))
         : JS('JSUInt31', r'(#.getSeconds() + 0)', lazyAsJsDate(receiver));
   }
 
-  @NoSideEffects()
-  @NoThrows()
-  @NoInline()
+  @pragma('dart2js:noSideEffects')
+  @pragma('dart2js:noThrows')
+  @pragma('dart2js:noInline')
   static getMilliseconds(DateTime receiver) {
     return (receiver.isUtc)
         ? JS(
@@ -873,9 +873,9 @@
         : JS('JSUInt31', r'(#.getMilliseconds() + 0)', lazyAsJsDate(receiver));
   }
 
-  @NoSideEffects()
-  @NoThrows()
-  @NoInline()
+  @pragma('dart2js:noSideEffects')
+  @pragma('dart2js:noThrows')
+  @pragma('dart2js:noInline')
   static getWeekday(DateTime receiver) {
     int weekday = (receiver.isUtc)
         ? JS('int', r'#.getUTCDay() + 0', lazyAsJsDate(receiver))
@@ -1168,7 +1168,7 @@
 /// Called by generated code to throw an illegal-argument exception,
 /// for example, if a non-integer index is given to an optimized
 /// indexed access.
-@NoInline()
+@pragma('dart2js:noInline')
 iae(argument) {
   throw argumentErrorValue(argument);
 }
@@ -1178,7 +1178,7 @@
 /// also be called when the index is not an integer, in which case it throws an
 /// illegal-argument exception instead, like [iae], or when the receiver is
 /// null.
-@NoInline()
+@pragma('dart2js:noInline')
 ioore(receiver, index) {
   if (receiver == null) receiver.length; // Force a NoSuchMethodError.
   throw diagnoseIndexError(receiver, index);
@@ -1186,7 +1186,7 @@
 
 /// Diagnoses an indexing error. Returns the ArgumentError or RangeError that
 /// describes the problem.
-@NoInline()
+@pragma('dart2js:noInline')
 Error diagnoseIndexError(indexable, index) {
   if (index is! int) return new ArgumentError.value(index, 'index');
   int length = indexable.length;
@@ -1201,7 +1201,7 @@
 
 /// Diagnoses a range error. Returns the ArgumentError or RangeError that
 /// describes the problem.
-@NoInline()
+@pragma('dart2js:noInline')
 Error diagnoseRangeError(start, end, length) {
   if (start is! int) {
     return new ArgumentError.value(start, 'start');
@@ -1225,7 +1225,7 @@
     JS('int', r'#.lastIndexOf(#, #)', receiver, element, start);
 
 /// 'factory' for constructing ArgumentError.value to keep the call sites small.
-@NoInline()
+@pragma('dart2js:noInline')
 ArgumentError argumentErrorValue(object) {
   return new ArgumentError.value(object);
 }
@@ -1235,7 +1235,7 @@
   return object;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 num checkNum(value) {
   if (value is! num) throw argumentErrorValue(value);
   return value;
@@ -1260,7 +1260,7 @@
 ///
 /// The code in [unwrapException] deals with getting the original Dart
 /// object out of the wrapper again.
-@NoInline()
+@pragma('dart2js:noInline')
 wrapException(ex) {
   if (ex == null) ex = new NullThrownError();
   var wrapper = JS('', 'new Error()');
@@ -1319,19 +1319,19 @@
 //
 //     a.length == startLength || throwConcurrentModificationError(a)
 //
-// TODO(sra): We would like to annotate this as @NoSideEffects() so that loops
+// TODO(sra): We would like to annotate this as @pragma('dart2js:noSideEffects') so that loops
 // with no other effects can recognize that the array length does not
 // change. However, in the usual case where the loop does have other effects,
 // that causes the length in the loop condition to be phi(startLength,a.length),
 // which causes confusion in range analysis and the insertion of a bounds check.
-@NoInline()
+@pragma('dart2js:noInline')
 checkConcurrentModificationError(sameLength, collection) {
   if (true != sameLength) {
     throwConcurrentModificationError(collection);
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 throwConcurrentModificationError(collection) {
   throw new ConcurrentModificationError(collection);
 }
@@ -1923,6 +1923,17 @@
   return result;
 }
 
+/// Called by generated code to build a set literal.
+fillLiteralSet(values, Set result) {
+  // TODO(johnniwinther): Use JSArray to optimize this code instead of calling
+  // [getLength] and [getIndex].
+  int length = getLength(values);
+  for (int index = 0; index < length; index++) {
+    result.add(getIndex(values, index));
+  }
+  return result;
+}
+
 invokeClosure(Function closure, int numberOfArguments, var arg1, var arg2,
     var arg3, var arg4) {
   switch (numberOfArguments) {
@@ -2511,12 +2522,12 @@
         "${Primitives.objectToHumanReadableString(receiver)}";
   }
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   static selfOf(BoundClosure closure) => closure._self;
 
   static targetOf(BoundClosure closure) => closure._target;
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   static receiverOf(BoundClosure closure) => closure._receiver;
 
   static nameOf(BoundClosure closure) => closure._name;
@@ -2539,8 +2550,8 @@
     return receiverFieldNameCache;
   }
 
-  @NoInline()
-  @NoSideEffects()
+  @pragma('dart2js:noInline')
+  @pragma('dart2js:noSideEffects')
   static String computeFieldNamed(String fieldName) {
     var template = new BoundClosure('self', 'target', 'receiver', 'name');
     var names = JSArray.markFixedList(
@@ -2932,7 +2943,7 @@
 
 futureOrCast(o, futureOrRti) => subtypeOfRuntimeTypeCast(o, futureOrRti);
 
-@NoInline()
+@pragma('dart2js:noInline')
 void checkDeferredIsLoaded(String loadId, String uri) {
   if (!_loadedLibraries.contains(loadId)) {
     throw new DeferredNotLoadedError(uri);
@@ -3010,7 +3021,7 @@
 
 /// Helper function for implementing asserts without messages.
 /// The compiler treats this specially.
-@NoInline()
+@pragma('dart2js:noInline')
 void assertHelper(condition) {
   if (assertTest(condition)) throw new AssertionError();
 }
@@ -3391,7 +3402,7 @@
   String toString() => 'Assertion failed: Reached dead code';
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void assertUnreachable() {
   throw new _UnreachableError();
 }
diff --git a/sdk/lib/_internal/js_runtime/lib/js_names.dart b/sdk/lib/_internal/js_runtime/lib/js_names.dart
index 572d354..1f1fec4 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_names.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_names.dart
@@ -133,7 +133,7 @@
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 List extractKeys(victim) {
   var result = JS('', '# ? Object.keys(#) : []', victim, victim);
   return new JSArray.markFixed(result);
diff --git a/sdk/lib/_internal/js_runtime/lib/js_number.dart b/sdk/lib/_internal/js_runtime/lib/js_number.dart
index 1c030f3..940bf26 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_number.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_number.dart
@@ -53,7 +53,8 @@
     return JS('num', r'# % #', this, b);
   }
 
-  @NoInline() // Use invoke_dynamic_specializer instead of inlining.
+  // Use invoke_dynamic_specializer instead of inlining.
+  @pragma('dart2js:noInline')
   JSNumber abs() => JS(
       'returns:num;effects:none;depends:none;throws:never;gvn:true',
       r'Math.abs(#)',
@@ -452,7 +453,8 @@
   const JSInt();
 
   @override
-  @NoInline() // Use invoke_dynamic_specializer instead of inlining.
+  // Use invoke_dynamic_specializer instead of inlining.
+  @pragma('dart2js:noInline')
   JSInt abs() => JS(
       'returns:int;effects:none;depends:none;throws:never;gvn:true',
       r'Math.abs(#)',
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index bdef059..e4b0f9d 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -92,7 +92,7 @@
 /// type.
 // Don't inline.  Let the JS engine inline this.  The call expression is much
 // more compact that the inlined expansion.
-@NoInline()
+@pragma('dart2js:noInline')
 Object setRuntimeTypeInfo(Object target, var rti) {
   assert(rti == null || isJsArray(rti));
   String rtiName = JS_GET_NAME(JsGetName.RTI_NAME);
@@ -121,9 +121,9 @@
 /// [substitutionName].
 ///
 /// Called from generated code.
-@NoThrows()
-@NoSideEffects()
-@NoInline()
+@pragma('dart2js:noThrows')
+@pragma('dart2js:noSideEffects')
+@pragma('dart2js:noInline')
 getRuntimeTypeArgumentIntercepted(
     interceptor, Object target, String substitutionName, int index) {
   var arguments =
@@ -135,9 +135,9 @@
 /// [substitutionName].
 ///
 /// Called from generated code.
-@NoThrows()
-@NoSideEffects()
-@NoInline()
+@pragma('dart2js:noThrows')
+@pragma('dart2js:noSideEffects')
+@pragma('dart2js:noInline')
 getRuntimeTypeArgument(Object target, String substitutionName, int index) {
   var arguments = getRuntimeTypeArguments(target, target, substitutionName);
   return arguments == null ? null : getIndex(arguments, index);
@@ -146,9 +146,9 @@
 /// Returns the [index]th type argument of [target].
 ///
 /// Called from generated code.
-@NoThrows()
-@NoSideEffects()
-@NoInline()
+@pragma('dart2js:noThrows')
+@pragma('dart2js:noSideEffects')
+@pragma('dart2js:noInline')
 getTypeArgumentByIndex(Object target, int index) {
   var rti = getRuntimeTypeInfo(target);
   return rti == null ? null : getIndex(rti, index);
@@ -169,7 +169,7 @@
 /// Returns a human-readable representation of the type representation [rti].
 ///
 /// Called from generated code.
-@NoInline()
+@pragma('dart2js:noInline')
 String runtimeTypeToString(var rti) {
   return _runtimeTypeToString(rti, null);
 }
@@ -541,7 +541,7 @@
 
 /// Returns `true` if the runtime type representation [type] is a top type.
 /// That is, either `dynamic`, `void` or `Object`.
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool isTopType(var type) {
   return isDartDynamicTypeRti(type) ||
       isDartVoidTypeRti(type) ||
@@ -551,7 +551,7 @@
 
 /// Returns `true` if the runtime type representation [type] is a supertype of
 /// [Null].
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool isSupertypeOfNull(var type) {
   return isSupertypeOfNullBase(type) || isSupertypeOfNullRecursive(type);
 }
@@ -561,7 +561,7 @@
 ///
 /// This method doesn't handle `FutureOr<Null>`. This is handle by
 /// [isSupertypeOfNullRecursive] because it requires a recursive check.
-@ForceInline()
+@pragma('dart2js:tryInline')
 bool isSupertypeOfNullBase(var type) {
   return isDartDynamicTypeRti(type) ||
       isDartObjectTypeRti(type) ||
@@ -593,7 +593,7 @@
 /// [type].
 ///
 /// For instance `num` of `FutureOr<num>`.
-@ForceInline()
+@pragma('dart2js:tryInline')
 Object getFutureOrArgument(var type) {
   assert(isDartFutureOrType(type));
   var typeArgumentTag = JS_GET_NAME(JsGetName.FUTURE_OR_TYPE_ARGUMENT_TAG);
@@ -917,7 +917,7 @@
 /// type parameters matching the number of types in [parameters].
 ///
 /// Called from generated code.
-@NoInline()
+@pragma('dart2js:noInline')
 instantiatedGenericFunctionType(genericFunctionRti, parameters) {
   if (genericFunctionRti == null) return null;
 
diff --git a/sdk/lib/_internal/js_runtime/lib/js_string.dart b/sdk/lib/_internal/js_runtime/lib/js_string.dart
index baa47b6..b5be305 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_string.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_string.dart
@@ -11,7 +11,7 @@
 class JSString extends Interceptor implements String, JSIndexable {
   const JSString();
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   int codeUnitAt(int index) {
     if (index is! int) throw diagnoseIndexError(this, index);
     if (index < 0) throw diagnoseIndexError(this, index);
diff --git a/sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart b/sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart
index 46f945b..81fd124 100644
--- a/sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart
+++ b/sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart
@@ -43,7 +43,7 @@
   JsLinkedHashMap();
 
   /// If ES6 Maps are available returns a linked hash-map backed by an ES6 Map.
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   factory JsLinkedHashMap.es6() {
     return (_USE_ES6_MAPS && JsLinkedHashMap._supportsEs6Maps)
         ? new Es6LinkedHashMap<K, V>()
diff --git a/sdk/lib/_internal/js_runtime/lib/native_helper.dart b/sdk/lib/_internal/js_runtime/lib/native_helper.dart
index 59a3719..04e1e46 100644
--- a/sdk/lib/_internal/js_runtime/lib/native_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/native_helper.dart
@@ -143,7 +143,7 @@
 ///
 /// A dispatch record is cached according to the specification of the dispatch
 /// tag for [obj].
-@NoInline()
+@pragma('dart2js:noInline')
 lookupAndCacheInterceptor(obj) {
   assert(!isDartObject(obj));
   String tag = getTagFunction(obj);
@@ -264,14 +264,14 @@
 
 var initNativeDispatchFlag; // null or true
 
-@NoInline()
+@pragma('dart2js:noInline')
 void initNativeDispatch() {
   if (true == initNativeDispatchFlag) return;
   initNativeDispatchFlag = true;
   initNativeDispatchContinue();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void initNativeDispatchContinue() {
   dispatchRecordsForInstanceTags = JS('', 'Object.create(null)');
   interceptorsForUncacheableTags = JS('', 'Object.create(null)');
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index cb021aa..c29609d 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -746,21 +746,23 @@
     StringBuffer buffer = new StringBuffer();
     StreamSubscription subscription;
     bool first = true;
-    subscription = this.listen((T element) {
-      if (!first) {
-        buffer.write(separator);
-      }
-      first = false;
-      try {
-        buffer.write(element);
-      } catch (e, s) {
-        _cancelAndErrorWithReplacement(subscription, result, e, s);
-      }
-    }, onError: (e) {
-      result._completeError(e);
-    }, onDone: () {
-      result._complete(buffer.toString());
-    }, cancelOnError: true);
+    subscription = this.listen(
+        (T element) {
+          if (!first) {
+            buffer.write(separator);
+          }
+          first = false;
+          try {
+            buffer.write(element);
+          } catch (e, s) {
+            _cancelAndErrorWithReplacement(subscription, result, e, s);
+          }
+        },
+        onError: result._completeError,
+        onDone: () {
+          result._complete(buffer.toString());
+        },
+        cancelOnError: true);
     return result;
   }
 
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
index eb92e2b..66c9cac 100644
--- a/sdk/lib/convert/utf.dart
+++ b/sdk/lib/convert/utf.dart
@@ -306,8 +306,24 @@
 
     var length = codeUnits.length;
     end = RangeError.checkValidRange(start, end, length);
-    var buffer = StringBuffer();
+
+    // Fast case for ASCII strings avoids StringBuffer/_Utf8Decoder.
+    int oneBytes = _scanOneByteCharacters(codeUnits, start, end);
+    StringBuffer buffer;
+    bool isFirstCharacter = true;
+    if (oneBytes > 0) {
+      var firstPart = String.fromCharCodes(codeUnits, start, start + oneBytes);
+      start += oneBytes;
+      if (start == end) {
+        return firstPart;
+      }
+      buffer = StringBuffer(firstPart);
+      isFirstCharacter = false;
+    }
+
+    buffer ??= StringBuffer();
     var decoder = _Utf8Decoder(buffer, _allowMalformed);
+    decoder._isFirstCharacter = isFirstCharacter;
     decoder.convert(codeUnits, start, end);
     decoder.flush(codeUnits, end);
     return buffer.toString();
@@ -412,12 +428,6 @@
     _expectedUnits = 0;
     _extraUnits = 0;
 
-    void addSingleBytes(int from, int to) {
-      assert(from >= startIndex && from <= endIndex);
-      assert(to >= startIndex && to <= endIndex);
-      _stringSink.write(String.fromCharCodes(codeUnits, from, to));
-    }
-
     var i = startIndex;
     loop:
     while (true) {
@@ -477,7 +487,9 @@
         var oneBytes = _scanOneByteCharacters(codeUnits, i, endIndex);
         if (oneBytes > 0) {
           _isFirstCharacter = false;
-          addSingleBytes(i, i + oneBytes);
+          assert(i + oneBytes <= endIndex);
+          _stringSink.write(String.fromCharCodes(codeUnits, i, i + oneBytes));
+
           i += oneBytes;
           if (i == endIndex) break;
         }
diff --git a/sdk/lib/core/date_time.dart b/sdk/lib/core/date_time.dart
index b24c0ea..90608670 100644
--- a/sdk/lib/core/date_time.dart
+++ b/sdk/lib/core/date_time.dart
@@ -223,7 +223,8 @@
   /**
    * Constructs a new [DateTime] instance based on [formattedString].
    *
-   * Throws a [FormatException] if the input cannot be parsed.
+   * The [formattedString] must not be `null`.
+   * Throws a [FormatException] if the input string cannot be parsed.
    *
    * The function parses a subset of ISO 8601
    * which includes the subset accepted by RFC 3339.
@@ -336,6 +337,12 @@
     }
   }
 
+  /**
+   * Constructs a new [DateTime] instance based on [formattedString].
+   *
+   * Works like [parse] except that this function returns `null`
+   * where [parse] would throw a [FormatException].
+   */
   static DateTime tryParse(String formattedString) {
     // TODO: Optimize to avoid throwing.
     try {
diff --git a/sdk/lib/core/double.dart b/sdk/lib/core/double.dart
index 167e18d..61191ec 100644
--- a/sdk/lib/core/double.dart
+++ b/sdk/lib/core/double.dart
@@ -178,17 +178,17 @@
    * optionally followed by a decimal point and optionally more digits. The
    * (optional) exponent part consists of the character "e" or "E", an optional
    * sign, and one or more digits.
+   * The [source] must not be `null`.
    *
    * Leading and trailing whitespace is ignored.
    *
-   * If the [source] is not a valid double literal, the [onError]
+   * If the [source] string is not a valid double literal, the [onError]
    * is called with the [source] as argument, and its return value is
    * used instead. If no `onError` is provided, a [FormatException]
    * is thrown instead.
    *
    * The [onError] function is only invoked if [source] is a [String] with an
-   * invalid format. It is not invoked if the [source] is invalid for some
-   * other reason, for example by being `null`.
+   * invalid format. It is not invoked if [source] is `null`.
    *
    * Examples of accepted strings:
    *
@@ -212,7 +212,7 @@
    * Parse [source] as an double literal and return its value.
    *
    * Like [parse] except that this function returns `null` for invalid inputs
-   * instead of throwing.
+   * instead of throwing, and the [source] must still not be `null`.
    */
   external static double tryParse(String source);
 }
diff --git a/sdk/lib/core/int.dart b/sdk/lib/core/int.dart
index 69b3eae..2c4a3ca 100644
--- a/sdk/lib/core/int.dart
+++ b/sdk/lib/core/int.dart
@@ -278,7 +278,7 @@
   double truncateToDouble();
 
   /**
-   * Returns a String-representation of this integer.
+   * Returns a string representation of this integer.
    *
    * The returned string is parsable by [parse].
    * For any `int` `i`, it is guaranteed that
@@ -299,8 +299,9 @@
   /**
    * Parse [source] as a, possibly signed, integer literal and return its value.
    *
-   * The [source] must be either a non-empty sequence of base-[radix] digits,
+   * The [source] must be a non-empty sequence of base-[radix] digits,
    * optionally prefixed with a minus or plus sign ('-' or '+').
+   * It must not be `null`.
    *
    * The [radix] must be in the range 2..36. The digits used are
    * first the decimal digits 0..9, and then the letters 'a'..'z' with
@@ -319,7 +320,7 @@
    * For any int `n` and valid radix `r`, it is guaranteed that
    * `n == int.parse(n.toRadixString(r), radix: r)`.
    *
-   * If the [source] does not contain a valid integer literal,
+   * If the [source] string does not contain a valid integer literal,
    * optionally prefixed by a sign, a [FormatException] is thrown
    * (unless the deprecated [onError] parameter is used, see below).
    *
@@ -335,7 +336,7 @@
    * Instead of `int.parse(string, onError: (string) => ...)`,
    * you should use `int.tryParse(string) ?? (...)`.
    *
-   * When source is not valid and [onError] is provided,
+   * When the source string is not valid and [onError] is provided,
    * whenever a [FormatException] would be thrown,
    * [onError] is instead called with [source] as argument,
    * and the result of that call is returned by [parse].
@@ -347,7 +348,8 @@
    * Parse [source] as a, possibly signed, integer literal and return its value.
    *
    * Like [parse] except that this function returns `null` where a
-   * similar call to [parse] would throw a [FormatException].
+   * similar call to [parse] would throw a [FormatException],
+   * and the [source] must still not be `null`.
    */
   external static int tryParse(String source, {int radix});
 }
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index 3436b58..7283bd6 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -93,8 +93,8 @@
    *
    * If [generator] is omitted, it defaults to an identity function
    * on integers `(int x) => x`, so it may only be omitted if the type
-   * parameter allows integer values. That is, if [E] is one of
-   * `int`, `num`, `Object` or `dynamic`.
+   * parameter allows integer values. That is, if [E] is a super-type
+   * of [int].
    *
    * As an `Iterable`, `new Iterable.generate(n, generator))` is equivalent to
    * `const [0, ..., n - 1].map(generator)`.
diff --git a/sdk/lib/core/stopwatch.dart b/sdk/lib/core/stopwatch.dart
index d32e1c2..cdecaca 100644
--- a/sdk/lib/core/stopwatch.dart
+++ b/sdk/lib/core/stopwatch.dart
@@ -9,7 +9,9 @@
  */
 class Stopwatch {
   /**
-   * Cached frequency of the system. Must be initialized in [_initTicker];
+   * Cached frequency of the system in Hz (ticks per second).
+   *
+   * Must be initialized in [_initTicker];
    */
   static int _frequency;
 
@@ -100,16 +102,12 @@
   /**
    * The [elapsedTicks] counter converted to microseconds.
    */
-  int get elapsedMicroseconds {
-    return (elapsedTicks * 1000000) ~/ frequency;
-  }
+  external int get elapsedMicroseconds;
 
   /**
    * The [elapsedTicks] counter converted to milliseconds.
    */
-  int get elapsedMilliseconds {
-    return (elapsedTicks * 1000) ~/ frequency;
-  }
+  external int get elapsedMilliseconds;
 
   /**
    * Whether the [Stopwatch] is currently running.
diff --git a/sdk/lib/core/symbol.dart b/sdk/lib/core/symbol.dart
index 459aad3..025aa85 100644
--- a/sdk/lib/core/symbol.dart
+++ b/sdk/lib/core/symbol.dart
@@ -68,7 +68,7 @@
    * a private symbol literal like `#_foo`.
    * ```dart
    * const Symbol("_foo") // Invalid
-   * ``
+   * ```
    *
    * The created instance overrides [Object.==].
    *
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 2d59ad4..0c431b7 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -725,10 +725,11 @@
   /**
    * Creates a new `Uri` object by parsing a URI string.
    *
-   * If [start] and [end] are provided, only the substring from `start`
-   * to `end` is parsed as a URI.
+   * If [start] and [end] are provided, they must specify a valid substring
+   * of [uri], and only the substring from `start` to `end` is parsed as a URI.
    *
-   * If the string is not valid as a URI or URI reference,
+   * The [uri] must not be `null`.
+   * If the [uri] string is not valid as a URI or URI reference,
    * a [FormatException] is thrown.
    */
   static Uri parse(String uri, [int start = 0, int end]) {
@@ -1022,10 +1023,11 @@
   /**
    * Creates a new `Uri` object by parsing a URI string.
    *
-   * If [start] and [end] are provided, only the substring from `start`
-   * to `end` is parsed as a URI.
+   * If [start] and [end] are provided, they must specify a valid substring
+   * of [uri], and only the substring from `start` to `end` is parsed as a URI.
+   * The [uri] must not be `null`.
    *
-   * Returns `null` if the string is not valid as a URI or URI reference.
+   * Returns `null` if the [uri] string is not valid as a URI or URI reference.
    */
   static Uri tryParse(String uri, [int start = 0, int end]) {
     // TODO: Optimize to avoid throwing-and-recatching.
diff --git a/sdk/lib/developer/timeline.dart b/sdk/lib/developer/timeline.dart
index b3075bf..b18ed93 100644
--- a/sdk/lib/developer/timeline.dart
+++ b/sdk/lib/developer/timeline.dart
@@ -259,14 +259,14 @@
 
   // Emit the start event.
   void _start() {
-    _reportTaskEvent(_getTraceClock(), _taskId, 'b', category, name,
-        _argumentsAsJson(_arguments));
+    _reportTaskEvent(
+        _getTraceClock(), _taskId, 'b', category, name, _argumentsAsJson(null));
   }
 
   // Emit the finish event.
   void _finish() {
-    _reportTaskEvent(
-        _getTraceClock(), _taskId, 'e', category, name, _argumentsAsJson(null));
+    _reportTaskEvent(_getTraceClock(), _taskId, 'e', category, name,
+        _argumentsAsJson(_arguments));
   }
 }
 
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 51d104c..47f3ea9 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -9805,7 +9805,7 @@
         tag, {'prototype': customElementClass, 'extends': extendsTag});
   }
 
-  @ForceInline() // Almost all call sites have one argument.
+  @pragma('dart2js:tryInline') // Almost all call sites have one argument.
   Element createElement(String tagName, [String typeExtension]) {
     return (typeExtension == null)
         ? _createElement_2(tagName)
@@ -14869,7 +14869,7 @@
       _convertNativeToDart_EventTarget(this._get_currentTarget);
   @JSName('currentTarget')
   @Creates('Null')
-  @Returns('EventTarget|=Object')
+  @Returns('EventTarget|=Object|Null')
   final dynamic _get_currentTarget;
 
   final bool defaultPrevented;
@@ -21153,7 +21153,7 @@
       _convertNativeToDart_EventTarget(this._get_relatedTarget);
   @JSName('relatedTarget')
   @Creates('Node')
-  @Returns('EventTarget|=Object')
+  @Returns('EventTarget|=Object|Null')
   final dynamic _get_relatedTarget;
 
   @JSName('screenX')
@@ -22977,7 +22977,8 @@
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
 
   CanvasPattern createPattern(
-      /*CanvasImageSource*/ image, String repetitionType) native;
+      /*CanvasImageSource*/ image,
+      String repetitionType) native;
 
   CanvasGradient createRadialGradient(
       num x0, num y0, num r0, num x1, num y1, num r1) native;
@@ -23353,7 +23354,8 @@
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
 
   CanvasPattern createPattern(
-      /*CanvasImageSource*/ image, String repetitionType) native;
+      /*CanvasImageSource*/ image,
+      String repetitionType) native;
 
   CanvasGradient createRadialGradient(
       num x0, num y0, num r0, num x1, num y1, num r1) native;
@@ -35215,7 +35217,7 @@
     return value is String && _classListContains(_classListOf(_element), value);
   }
 
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   static bool _add(Element _element, String value) {
     DomTokenList list = _classListOf(_element);
     // Compute returned result independently of action upon the set.
@@ -35224,7 +35226,7 @@
     return added;
   }
 
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   static bool _remove(Element _element, String value) {
     DomTokenList list = _classListOf(_element);
     bool removed = _classListContainsBeforeAddOrRemove(list, value);
@@ -35560,7 +35562,7 @@
 
   // TODO(9757): Inlining should be smart and inline only when inlining would
   // enable scalar replacement of an immediately allocated receiver.
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   StreamSubscription<T> listen(void onData(T event),
       {Function onError, void onDone(), bool cancelOnError}) {
     return new _EventStreamSubscription<T>(
diff --git a/sdk/lib/io/stdio.dart b/sdk/lib/io/stdio.dart
index 1c1ce97..4086f08 100644
--- a/sdk/lib/io/stdio.dart
+++ b/sdk/lib/io/stdio.dart
@@ -394,7 +394,7 @@
 int _stdoutFD = 1;
 int _stderrFD = 2;
 
-@pragma('vm:entry-point')
+@pragma('vm:entry-point', 'call')
 void _setStdioFDs(int stdin, int stdout, int stderr) {
   _stdinFD = stdin;
   _stdoutFD = stdout;
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index 2cccb59..72db816 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -702,7 +702,7 @@
   }
 }
 
-@pragma("vm:entry-point")
+@pragma("vm:entry-point", "call")
 RawReceivePort boot() {
   // Return the port we expect isolate control messages on.
   return isolateControlPort;
diff --git a/tests/co19_2/co19_2-kernel.status b/tests/co19_2/co19_2-kernel.status
index 717b34e4..3339868 100644
--- a/tests/co19_2/co19_2-kernel.status
+++ b/tests/co19_2/co19_2-kernel.status
@@ -3,12 +3,48 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dartk ]
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A02_t01: DartkCrash
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A03_t01: DartkCrash
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A03_t02: DartkCrash
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A04_t01: DartkCrash
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A02_t01: DartkCrash
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A02_t02: DartkCrash
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A03_t01: DartkCrash
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A03_t02: DartkCrash
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A04_t01: DartkCrash
+LanguageFeatures/Control-flow-collections/dynamic_semantics_set_A02_t01: DartkCrash
+LanguageFeatures/Control-flow-collections/dynamic_semantics_set_A03_t01: DartkCrash
+LanguageFeatures/Control-flow-collections/dynamic_semantics_set_A03_t02: DartkCrash, CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_set_A04_t01: DartkCrash
 LanguageFeatures/Set-literals/semantics_A05_t02: RuntimeError
 LanguageFeatures/Set-literals/syntax_compatibility_A01_t02: RuntimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A01_t01: CompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A06_t01: CompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A07_t01: CompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A07_t02: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_List_A01_t01: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_List_A02_t01: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_List_A02_t02: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_List_A02_t03: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_List_A02_t04: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_Map_A02_t02: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_Map_A02_t03: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A01_t01: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A01_t02: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A01_t03: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A01_t04: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A02_t01: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A02_t01: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A05_t01/none: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A05_t02/none: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A01_t01: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A01_t02: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A01_t06: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A01_t07: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A02_t12: CompileTimeError
 
 [ $compiler == dartkp ]
 Language/Expressions/Instance_Creation/New/evaluation_t20: RuntimeError
-Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: DartkCrash
 Language/Libraries_and_Scripts/Imports/deferred_import_t01: RuntimeError
 Language/Metadata/before_factory_t01: RuntimeError
 Language/Metadata/before_library_t01: RuntimeError
@@ -26,12 +62,40 @@
 LanguageFeatures/Constant_update2018/NewOperators_A02_t06/none: RuntimeError
 LanguageFeatures/Constant_update2018/NewOperators_A02_t09/none: RuntimeError
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t02: RuntimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t03: CompileTimeError
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t04: RuntimeError
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t05/none: RuntimeError
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t06/none: RuntimeError
 LanguageFeatures/Set-literals/semantics_A05_t02: RuntimeError
 LanguageFeatures/Set-literals/syntax_compatibility_A01_t02: RuntimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A01_t01: DartkCrash
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/02: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/06: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/07: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/08: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A06_t01: DartkCrash
+LanguageFeatures/Spread-collections/ConstSpreads_A07_t01: DartkCrash
+LanguageFeatures/Spread-collections/ConstSpreads_A07_t02: DartkCrash
+LanguageFeatures/Spread-collections/DynamicSemantics_List_A01_t01: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_List_A02_t01: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_List_A02_t02: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_List_A02_t03: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_List_A02_t04: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_Map_A02_t02: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_Map_A02_t03: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A01_t01: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A01_t02: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A01_t03: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A01_t04: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A02_t01: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A02_t01: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A05_t01/none: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A05_t02/none: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A01_t01: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A01_t02: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A01_t05: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A01_t06: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A01_t07: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A02_t12: CompileTimeError
 LanguageFeatures/Subtyping/static/generated/left_bottom_global_variable_A02_t01: DartkCrash
 LanguageFeatures/Subtyping/static/generated/left_promoted_variable_global_variable_A02_t01: DartkCrash
 LibTest/collection/DoubleLinkedQueue/removeWhere_A02_t02: RuntimeError
@@ -73,7 +137,29 @@
 Language/Statements/For/syntax_t13: Crash # Assertion error: kernel_shadow_ast.dart: 'receiver == null': is not true.
 Language/Statements/For/syntax_t20: Crash # Assertion error: kernel_shadow_ast.dart: 'receiver == null': is not true.
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t03: Crash
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t04: Crash
+LanguageFeatures/Spread-collections/Ambiguity_A01_t05/01: MissingCompileTimeError
+LanguageFeatures/Spread-collections/Ambiguity_A01_t05/02: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A03_t02/12: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/01: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/02: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/03: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/04: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/05: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/06: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/07: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/08: MissingCompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_Map_A01_t01: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_Map_A02_t02: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_Map_A02_t03: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A01_t01: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A01_t02: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A01_t03: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A01_t04: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A04_t01/04: MissingCompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A06_t01/01: MissingCompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A06_t01/02: MissingCompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A06_t01/04: MissingCompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A06_t01/05: MissingCompileTimeError
 
 [ $runtime == vm ]
 LibTest/collection/ListBase/ListBase_class_A01_t02: Pass, Slow # Does many calls
@@ -93,17 +179,10 @@
 LibTest/io/RawDatagramSocket/where_A01_t01: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
 
 [ $fasta ]
-Language/Classes/Abstract_Instance_Members/override_default_value_t01: MissingCompileTimeError # Issue 34190
-Language/Classes/Abstract_Instance_Members/override_default_value_t02: MissingCompileTimeError # Issue 34190
-Language/Classes/Abstract_Instance_Members/override_default_value_t03: MissingCompileTimeError # Issue 34190
-Language/Classes/Abstract_Instance_Members/override_default_value_t04: MissingCompileTimeError # Issue 34190
-Language/Classes/Abstract_Instance_Members/override_default_value_t05: MissingCompileTimeError # Issue 34190
 Language/Classes/Constructors/Generative_Constructors/initializers_t15: CompileTimeError
 Language/Classes/Getters/type_object_t01: CompileTimeError
 Language/Classes/Getters/type_object_t02: CompileTimeError
 Language/Classes/Instance_Methods/Operators/return_type_t01: MissingCompileTimeError
-Language/Classes/Instance_Methods/override_different_default_values_t01: MissingCompileTimeError # Issue 34190
-Language/Classes/Instance_Methods/override_different_default_values_t02: MissingCompileTimeError # Issue 34190
 Language/Classes/Setters/return_type_not_void_t01: MissingCompileTimeError
 Language/Classes/Setters/same_name_getter_different_type_t01: MissingCompileTimeError
 Language/Classes/Setters/syntax_t04: MissingCompileTimeError
@@ -142,6 +221,8 @@
 Language/Expressions/Instance_Creation/Const/parameterized_type_t01: CompileTimeError
 Language/Expressions/Instance_Creation/Const/parameterized_type_t02: CompileTimeError
 Language/Expressions/Instance_Creation/New/syntax_t04: MissingCompileTimeError # Legal because of implicit new
+Language/Expressions/Instance_Creation/New/type_t08: CompileTimeError
+Language/Expressions/Instance_Creation/New/type_t09: CompileTimeError
 Language/Expressions/Lists/constant_list_t01: CompileTimeError
 Language/Expressions/Maps/constant_map_t02: MissingCompileTimeError
 Language/Expressions/Maps/constant_map_type_t01: CompileTimeError
@@ -162,15 +243,28 @@
 Language/Expressions/Shift/syntax_t01: CompileTimeError
 Language/Expressions/Unary_Expressions/syntax_t10: CompileTimeError
 Language/Expressions/Unary_Expressions/syntax_t27: CompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/default_value_t01: MissingCompileTimeError # 32912
-Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: MissingCompileTimeError # 32912
-Language/Generics/syntax_t02: CompileTimeError
-Language/Generics/syntax_t03: CompileTimeError
+Language/Generics/class_A01_t02/none: CompileTimeError
+Language/Generics/syntax_t21: CompileTimeError
+Language/Generics/syntax_t23: CompileTimeError
+Language/Generics/syntax_t24: CompileTimeError
+Language/Generics/syntax_t25: CompileTimeError
+Language/Generics/syntax_t26: CompileTimeError
 Language/Libraries_and_Scripts/Imports/library_name_t01: MissingCompileTimeError # Expects an error, but this is a warning in Dart 2
-Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError # Issue 30273
+Language/Mixins/Mixin_Application/abstract_t09: Crash
+Language/Mixins/Mixin_Application/abstract_t10: Crash
+Language/Mixins/Mixin_Application/abstract_t11: Crash
+Language/Mixins/Mixin_Application/abstract_t12: Crash
+Language/Mixins/Mixin_Application/abstract_t13: Crash
+Language/Mixins/Mixin_Application/deferred_t03: Crash
+Language/Mixins/Mixin_Application/implicit_constructor_t03: Crash
+Language/Mixins/Mixin_Application/implicit_constructor_t04: Crash
+Language/Mixins/Mixin_Application/initializers_t04: Crash
+Language/Mixins/Mixin_Application/initializers_t05: Crash
+Language/Mixins/Mixin_Application/initializers_t06: Crash
+Language/Mixins/Mixin_Application/interfaces_t06: Crash
+Language/Mixins/Mixin_Application/interfaces_t07: Crash
 Language/Mixins/Mixin_Application/static_warning_t01: MissingCompileTimeError # Mixin super equirement
-Language/Mixins/Mixin_Application/superclass_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/superclass_t02: MissingCompileTimeError
+Language/Mixins/Mixin_Application/superclass_t03: Crash
 Language/Mixins/Mixin_Application/superinterfaces_t07: MissingCompileTimeError
 Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Mixin constructor
 Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Mixin constructor
@@ -190,6 +284,14 @@
 Language/Statements/Continue/label_t07: MissingCompileTimeError # Issue 34206
 Language/Statements/Try/catch_scope_t01: CompileTimeError
 Language/Types/Interface_Types/subtype_t30: CompileTimeError
+Language/Types/Type_Aliases/scope_t01: CompileTimeError
+Language/Types/Type_Aliases/scope_t02/none: CompileTimeError
+Language/Types/Type_Aliases/scope_t03: CompileTimeError
+Language/Types/Type_Aliases/scope_t04/none: CompileTimeError
+Language/Types/Type_Aliases/syntax_t01: CompileTimeError
+Language/Types/Type_Aliases/syntax_t02: CompileTimeError
+Language/Types/Type_Aliases/syntax_t03: CompileTimeError
+Language/Types/Type_Aliases/syntax_t04: CompileTimeError
 LanguageFeatures/Constant_update2018/CastOperator_A01_t01: CompileTimeError
 LanguageFeatures/Constant_update2018/CastOperator_A02_t01: CompileTimeError
 LanguageFeatures/Constant_update2018/CastOperator_A02_t02: CompileTimeError
@@ -198,27 +300,39 @@
 LanguageFeatures/Constant_update2018/CastOperator_A04_t02/none: CompileTimeError
 LanguageFeatures/Constant_update2018/EqualityOperator_A01_t03/none: CompileTimeError
 LanguageFeatures/Constant_update2018/EqualityOperator_A01_t04/none: CompileTimeError
+LanguageFeatures/Constant_update2018/EqualityOperator_A01_t09: MissingCompileTimeError
+LanguageFeatures/Constant_update2018/EqualityOperator_A01_t10: MissingCompileTimeError
 LanguageFeatures/Constant_update2018/NewOperators_A01_t01: CompileTimeError
 LanguageFeatures/Constant_update2018/NewOperators_A01_t02: CompileTimeError
 LanguageFeatures/Constant_update2018/NewOperators_A02_t01: CompileTimeError
 LanguageFeatures/Constant_update2018/NewOperators_A02_t02: CompileTimeError
-LanguageFeatures/Constant_update2018/NewOperators_A02_t04: CompileTimeError
 LanguageFeatures/Constant_update2018/NewOperators_A02_t05: CompileTimeError
-LanguageFeatures/Constant_update2018/NewOperators_A02_t07: CompileTimeError
-LanguageFeatures/Constant_update2018/NewOperators_A02_t08: CompileTimeError
+LanguageFeatures/Constant_update2018/NewOperators_A02_t06: CompileTimeError
+LanguageFeatures/Constant_update2018/NewOperators_A02_t09: CompileTimeError
+LanguageFeatures/Constant_update2018/NewOperators_A02_t10: CompileTimeError
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t01: CompileTimeError
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t02/none: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t03: CompileTimeError
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t05/none: CompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t06/none: CompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t07: CompileTimeError
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t01: CompileTimeError
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t02/none: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t03: CompileTimeError
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t05/none: CompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t08: CompileTimeError
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t01: CompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t05: CompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t06: CompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t06/01: MissingCompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t07: MissingCompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t07/none: CompileTimeError
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t01: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t02: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t03/none: CompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t02/none: CompileTimeError
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t04/none: CompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t05: CompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t06/none: CompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t08/none: CompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t09: MissingCompileTimeError
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t11: MissingCompileTimeError
 LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t01: CompileTimeError
 LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t02: CompileTimeError
 LanguageFeatures/Constant_update2018/TypeTestOperator_A02_t01: CompileTimeError
@@ -229,6 +343,21 @@
 LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t04/none: CompileTimeError
 LanguageFeatures/Constant_update2018/TypeTestOperator_A04_t01/none: CompileTimeError
 LanguageFeatures/Constant_update2018/TypeTestOperator_A04_t02/none: CompileTimeError
+LanguageFeatures/Control-flow-collections/const_collections_A01_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/const_collections_A02_t03: CompileTimeError
+LanguageFeatures/Control-flow-collections/const_collections_A02_t04: CompileTimeError
+LanguageFeatures/Control-flow-collections/const_collections_A04_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/const_collections_A05_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/const_collections_A06_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/const_collections_A07_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/const_collections_A07_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/const_collections_A07_t03: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A01_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A04_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A01_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A04_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_set_A01_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_set_A04_t02: CompileTimeError
 LanguageFeatures/Control-flow-collections/scoping_A01_t01: CompileTimeError, Crash, Pass # This feature is not implemented yet
 LanguageFeatures/Control-flow-collections/scoping_A02_t01: CompileTimeError, Crash, Pass # This feature is not implemented yet
 LanguageFeatures/Control-flow-collections/static_errors_A01_t01: CompileTimeError, Crash, Pass # This feature is not implemented yet
@@ -285,6 +414,10 @@
 LanguageFeatures/Instantiate-to-bound/class/static/class_l1_t04/none: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t03/none: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t04/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t08/01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t08/02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t08/03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t08/04: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/static/class_l3_t02/none: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t02/none: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t03/01: MissingCompileTimeError
@@ -347,6 +480,7 @@
 LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/05: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/06: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/07: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t05/01: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t07/none: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t08/01: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/01: MissingCompileTimeError
@@ -516,9 +650,7 @@
 LanguageFeatures/Set-literals/constant_set_literals_A02_t03/01: MissingCompileTimeError
 LanguageFeatures/Set-literals/constant_set_literals_A02_t03/02: MissingCompileTimeError
 LanguageFeatures/Set-literals/constant_set_literals_A02_t03/03: MissingCompileTimeError
-LanguageFeatures/Set-literals/exact_types_of_literals_A01_t03: CompileTimeError
-LanguageFeatures/Set-literals/semantics_A05_t01: CompileTimeError
-LanguageFeatures/Set-literals/set_literals_A04_t01: CompileTimeError
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t03: RuntimeError
 LanguageFeatures/Simple-bounds/dynamic/class_FutureOr_l1_t02: CompileTimeError
 LanguageFeatures/Simple-bounds/static/class_FutureOr_l1_t02/none: CompileTimeError
 LanguageFeatures/Simple-bounds/static/typedef_FutureOr_l1_t02/none: CompileTimeError
@@ -527,6 +659,58 @@
 LanguageFeatures/Simple-bounds/static/typedef_typedef_l1_t04/01: MissingCompileTimeError
 LanguageFeatures/Simple-bounds/static/typedef_typedef_l1_t04/02: MissingCompileTimeError
 LanguageFeatures/Simple-bounds/static/typedef_typedef_l1_t10: CompileTimeError
+LanguageFeatures/Spread-collections/Ambiguity_A01_t01: CompileTimeError
+LanguageFeatures/Spread-collections/Ambiguity_A01_t03: CompileTimeError
+LanguageFeatures/Spread-collections/Ambiguity_A01_t05: MissingCompileTimeError
+LanguageFeatures/Spread-collections/Ambiguity_A01_t06: MissingCompileTimeError
+LanguageFeatures/Spread-collections/Ambiguity_A01_t07: CompileTimeError
+LanguageFeatures/Spread-collections/Ambiguity_A02_t01/01: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A01_t02: CompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A03_t02/12: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/01: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/02: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/03: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/04: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/05: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/06: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/07: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A04_t01/08: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A06_t02: CompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A06_t03: CompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A07_t03: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_Set_A02_t01: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_Set_A02_t02: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_Set_A02_t03: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_Set_A02_t05: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_Set_A02_t07: CompileTimeError
+LanguageFeatures/Spread-collections/DynamicSemantics_Set_A02_t08: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A02_t02: CompileTimeError
+LanguageFeatures/Spread-collections/NullAware_A02_t03: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A01_t01: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A01_t03: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A01_t05: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A01_t06: MissingCompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A02_t02: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A05_t01/none: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A05_t02/none: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A06_t01/01: MissingCompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A06_t01/02: MissingCompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A06_t01/04: MissingCompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A06_t01/05: MissingCompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A07_t01/none: CompileTimeError
+LanguageFeatures/Spread-collections/StaticSemantic_A08_t01/none: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A01_t03: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A02_t01: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A02_t02: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A02_t04: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A02_t06: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A02_t08: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A02_t09: CompileTimeError
+LanguageFeatures/Spread-collections/Syntax_A02_t10: CompileTimeError
+LanguageFeatures/Spread-collections/TypeInference_A01_t01: CompileTimeError
+LanguageFeatures/Spread-collections/TypeInference_A01_t02: CompileTimeError
+LanguageFeatures/Spread-collections/TypeInference_A02_t01: CompileTimeError
+LanguageFeatures/Spread-collections/TypeInference_A03_t01: CompileTimeError
 LanguageFeatures/Super-mixins/covariance_t03: MissingCompileTimeError # Issue 35111
 LanguageFeatures/Super-mixins/covariance_t06: MissingCompileTimeError # Issue 35111
 LanguageFeatures/Super-mixins/covariance_t07: MissingCompileTimeError # Issue 35111
@@ -543,8 +727,18 @@
 LanguageFeatures/Constant_update2018/NewOperators_A02_t02: Pass
 LanguageFeatures/Constant_update2018/NewOperators_A02_t04: Pass
 LanguageFeatures/Constant_update2018/NewOperators_A02_t05: Pass
-LanguageFeatures/Constant_update2018/NewOperators_A02_t07: Pass
-LanguageFeatures/Constant_update2018/NewOperators_A02_t08: Pass
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A02_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A03_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A03_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A04_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A02_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A02_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A03_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A03_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A04_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_set_A02_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_set_A03_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_set_A04_t01: CompileTimeError
 LibTest/collection/ListBase/ListBase_class_A01_t02: Crash # Issue http://dartbug.com/35242
 LibTest/collection/ListMixin/ListMixin_class_A01_t02: Crash # Issue http://dartbug.com/35242
 LibTest/core/List/List_class_A01_t02: Crash # Issue http://dartbug.com/35242
@@ -561,7 +755,6 @@
 LibTest/io/Stdout/writeCharCode_A01_t03: Timeout, Pass
 
 [ $arch == simdbc64 && ($compiler == dartk || $compiler == dartkb) ]
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t03: CompileTimeError
 LibTest/collection/ListBase/ListBase_class_A01_t02: Timeout, Pass # https://github.com/dart-lang/sdk/issues/35316 as well?
 LibTest/collection/ListMixin/ListMixin_class_A01_t02: Timeout, Pass # https://github.com/dart-lang/sdk/issues/35316 as well?
 LibTest/io/Link/renameSync_A02_t01: RuntimeError, Pass
@@ -626,12 +819,35 @@
 LibTest/isolate/Isolate/ping_A03_t02: RuntimeError, Pass
 LibTest/isolate/Isolate/removeErrorListener_A02_t01: Crash, Pass
 
-[ $arch != simdbc64 && $runtime == vm && ($compiler == dartk || $compiler == dartkb) ]
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t03: CompileTimeError
+[ $arch != simdbc64 && $compiler == dartk ]
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/01: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/02: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/03: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/04: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/05: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/06: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/07: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/08: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/09: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/10: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/11: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/12: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/13: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/14: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/15: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/16: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/21: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/22: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/23: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/24: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/25: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/26: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/27: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/28: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/29: DartkCrash
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/30: DartkCrash
 
 [ $compiler != dart2js && $runtime != vm && $fasta ]
-Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t01: MissingCompileTimeError # Issue 34191
-Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t02: MissingCompileTimeError # Issue 34191
 Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t02: MissingCompileTimeError # Issue 34192
 Language/Expressions/Constants/exception_t01: MissingCompileTimeError # Issue 31936
 Language/Expressions/Constants/exception_t03: MissingCompileTimeError # Issue 31936
@@ -642,7 +858,6 @@
 Language/Metadata/compilation_t03: MissingCompileTimeError # Issue 34205
 
 [ $compiler != dart2js && $fasta ]
-Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t03: MissingCompileTimeError # Issue 34191
 Language/Expressions/Constants/literal_string_t02: MissingCompileTimeError # Issue 34192
 Language/Statements/Switch/equal_operator_t01: MissingCompileTimeError # Issue 32557
 Language/Statements/Switch/equal_operator_t02: MissingCompileTimeError # Issue 32557
@@ -668,6 +883,54 @@
 LibTest/io/Stdin/readByteSync_A02_t01: RuntimeError, Pass
 LibTest/io/WebSocket/pingInterval_A01_t01: RuntimeError, Pass
 
+[ $runtime == none && $fasta ]
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t01: Crash
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t02: Crash
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t03: Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/01: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/02: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/03: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/04: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/05: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/06: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/07: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/08: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/09: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/10: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/11: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/12: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/13: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/14: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/15: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/16: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/17: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/18: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/19: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/20: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/21: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/22: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/23: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/24: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/25: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/26: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/27: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/28: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/29: Crash, Pass
+LanguageFeatures/Control-flow-collections/const_collections_A08_t01/30: Crash, Pass
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A02_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A03_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A03_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_list_A04_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A02_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A02_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A03_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A03_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_map_A04_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_set_A02_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_set_A03_t01: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_set_A03_t02: CompileTimeError
+LanguageFeatures/Control-flow-collections/dynamic_semantics_set_A04_t01: CompileTimeError
+
 [ $runtime == vm && $system == linux && ($compiler == dartk || $compiler == dartkb) ]
 LibTest/io/Link/stat_A01_t01: RuntimeError
 LibTest/isolate/Isolate/spawn_A06_t03: Crash, Pass
@@ -856,7 +1119,6 @@
 LanguageFeatures/Constant_update2018/NewOperators_A02_t04: Fail
 LanguageFeatures/Constant_update2018/NewOperators_A02_t05: DartkCrash
 LanguageFeatures/Constant_update2018/NewOperators_A02_t07: Fail
-LanguageFeatures/Constant_update2018/NewOperators_A02_t08: DartkCrash
 LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t05: Pass
 LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t01: DartkCrash
 LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t02: DartkCrash
@@ -1006,8 +1268,6 @@
 Language/Statements/Do/execution_t06: RuntimeError
 Language/Statements/For/For_Loop/execution_t11: RuntimeError
 Language/Statements/While/execution_t02: RuntimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t08: DartkCrash
-Language/Types/Type_Declarations/Typedef/self_reference_t09: DartkCrash
 LibTest/collection/LinkedList/add_A01_t01: RuntimeError
 LibTest/collection/LinkedList/forEach_A01_t01: RuntimeError
 LibTest/collection/LinkedList/map_A01_t01: RuntimeError
@@ -1156,8 +1416,6 @@
 Language/Expressions/Strings/adjacent_strings_t02: RuntimeError
 Language/Expressions/Type_Cast/syntax_t01: RuntimeError
 Language/Functions/External_Functions/not_connected_to_a_body_t01: RuntimeError
-Language/Generics/syntax_t02: DartkCrash
-Language/Generics/syntax_t03: DartkCrash
 Language/Libraries_and_Scripts/Imports/deferred_import_t01: RuntimeError
 Language/Libraries_and_Scripts/Parts/compilation_t03: RuntimeError
 Language/Libraries_and_Scripts/Parts/compilation_t05: RuntimeError
@@ -1195,7 +1453,6 @@
 Language/Types/Interface_Types/subtype_t22: RuntimeError
 Language/Types/Interface_Types/subtype_t23: RuntimeError
 Language/Types/Interface_Types/subtype_t26: RuntimeError
-Language/Types/Type_Declarations/Typedef/dynamic_param_type_t02: RuntimeError
 Language/Variables/constant_initialization_t03: RuntimeError
 Language/Variables/constant_variable_t09: RuntimeError
 LanguageFeatures/Instantiate-to-bound/class/dynamic/class_typedef_l1_t02: RuntimeError
diff --git a/tests/compiler/dart2js/allocator_analysis/kdata/simple_initializers.dart b/tests/compiler/dart2js/allocator_analysis/kdata/simple_initializers.dart
deleted file mode 100644
index be12d6c..0000000
--- a/tests/compiler/dart2js/allocator_analysis/kdata/simple_initializers.dart
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-main() {
-  new Class1();
-  new Class2();
-}
-
-const bool const1 = true;
-
-class Class1 {
-  /*element: Class1.field0:initial=NullConstant*/
-  var field0;
-
-  /*element: Class1.field1:initial=NullConstant*/
-  var field1 = null;
-
-  /*element: Class1.field2:initial=BoolConstant(true)*/
-  var field2 = true;
-
-  /*element: Class1.field3:initial=BoolConstant(false)*/
-  var field3 = false;
-
-  /*element: Class1.field4:initial=IntConstant(0)*/
-  var field4 = 0;
-
-  /*element: Class1.field5:initial=IntConstant(1)*/
-  var field5 = 1;
-
-  /*element: Class1.field6:initial=StringConstant("")*/
-  var field6 = '';
-
-  /*element: Class1.field7:initial=StringConstant("foo")*/
-  var field7 = 'foo';
-
-  /*element: Class1.field8:*/
-  var field8 = 0.5;
-
-  /*element: Class1.field9:*/
-  var field9 = const [];
-
-  /*element: Class1.field10:*/
-  var field10 = const {};
-
-  /*element: Class1.field11:*/
-  var field11 = #foo;
-
-  /*element: Class1.field12:*/
-  var field12 = 2 + 3;
-
-  /*element: Class1.field13:*/
-  var field13 = const1;
-}
-
-class Class2 {
-  /*element: Class2.field1:*/
-  var field1;
-
-  /*element: Class2.field2:*/
-  var field2;
-
-  /*element: Class2.field3:*/
-  var field3;
-
-  /*element: Class2.field4:*/
-  var field4;
-
-  /*element: Class2.field5:*/
-  var field5;
-
-  /*element: Class2.field6:*/
-  var field6;
-
-  /*element: Class2.field7:*/
-  var field7;
-
-  /*element: Class2.field8:*/
-  var field8;
-
-  /*element: Class2.field9:*/
-  var field9;
-
-  /*element: Class2.field10:*/
-  var field10;
-
-  /*element: Class2.field11:*/
-  var field11;
-
-  /*element: Class2.field12:*/
-  var field12;
-
-  /*element: Class2.field13:*/
-  var field13;
-
-  Class2()
-      : field1 = null,
-        field2 = true,
-        field3 = false,
-        field4 = 0,
-        field5 = 1,
-        field6 = '',
-        field7 = 'foo',
-        field8 = 0.5,
-        field9 = const [],
-        field10 = const {},
-        field11 = #foo,
-        field12 = 2 + 3,
-        field13 = const1;
-}
diff --git a/tests/compiler/dart2js/analyses/dart2js_allowed.json b/tests/compiler/dart2js/analyses/dart2js_allowed.json
index 5f6fdad..a095c40 100644
--- a/tests/compiler/dart2js/analyses/dart2js_allowed.json
+++ b/tests/compiler/dart2js/analyses/dart2js_allowed.json
@@ -90,6 +90,13 @@
     "Dynamic access of 'allocationNode'.": 1,
     "Dynamic access of 'allocationElement'.": 1
   },
+  "pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart": {
+    "Dynamic access of 'isNullable'.": 2,
+    "Dynamic access of 'isEmptyOrNull'.": 1,
+    "Dynamic access of 'isSet'.": 1,
+    "Dynamic access of 'elementType'.": 2,
+    "Dynamic access of 'forwardTo'.": 1
+  },
   "pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart": {
     "Dynamic access of 'isForwarding'.": 1,
     "Dynamic access of 'forwardTo'.": 1
@@ -139,17 +146,36 @@
     "Dynamic invocation of '+'.": 2,
     "Dynamic invocation of '-'.": 1
   },
-  "pkg/compiler/lib/src/js_backend/constant_system_javascript.dart": {
-    "Dynamic invocation of 'remainder'.": 1
+  "pkg/compiler/lib/src/constants/constant_system.dart": {
+    "Dynamic invocation of '&'.": 1,
+    "Dynamic invocation of '|'.": 1,
+    "Dynamic invocation of '^'.": 1,
+    "Dynamic invocation of '<<'.": 1,
+    "Dynamic invocation of '>>'.": 1,
+    "Dynamic invocation of '-'.": 1,
+    "Dynamic invocation of '*'.": 1,
+    "Dynamic invocation of '%'.": 1,
+    "Dynamic invocation of 'remainder'.": 1,
+    "Dynamic invocation of '~/'.": 1,
+    "Dynamic invocation of '/'.": 1,
+    "Dynamic invocation of '+'.": 1,
+    "Dynamic invocation of '<'.": 1,
+    "Dynamic invocation of '<='.": 1,
+    "Dynamic invocation of '>'.": 1,
+    "Dynamic invocation of '>='.": 1,
+    "Dynamic invocation of 'codeUnitAt'.": 1
   },
   "pkg/compiler/lib/src/serialization/binary_sink.dart": {
     "Dynamic access of 'index'.": 1
   },
   "third_party/pkg/dart2js_info/lib/json_info_codec.dart": {
-    "Dynamic invocation of '[]'.": 13,
-    "Dynamic invocation of 'forEach'.": 3,
+    "Dynamic invocation of '[]'.": 11,
+    "Dynamic invocation of 'forEach'.": 2,
     "Dynamic invocation of 'map'.": 2,
-    "Dynamic access of 'length'.": 1
+    "Dynamic invocation of 'compareTo'.": 1
+  },
+  "third_party/pkg/dart2js_info/lib/binary_serialization.dart": {
+    "Dynamic invocation of 'cast'.": 1
   },
   "pkg/compiler/lib/src/util/enumset.dart": {
     "Dynamic access of 'index'.": 4
@@ -190,33 +216,13 @@
     "Dynamic access of 'usedBy'.": 2,
     "Dynamic access of 'inputs'.": 1
   },
-  "pkg/compiler/lib/src/constant_system_dart.dart": {
-    "Dynamic invocation of '|'.": 1,
-    "Dynamic invocation of '&'.": 1,
-    "Dynamic invocation of '^'.": 1,
-    "Dynamic invocation of '<<'.": 1,
-    "Dynamic invocation of '>>'.": 1,
-    "Dynamic invocation of '-'.": 1,
-    "Dynamic invocation of '*'.": 1,
-    "Dynamic invocation of '%'.": 1,
-    "Dynamic invocation of 'remainder'.": 1,
-    "Dynamic invocation of '~/'.": 1,
-    "Dynamic invocation of '/'.": 1,
-    "Dynamic invocation of '+'.": 1,
-    "Dynamic invocation of '<'.": 1,
-    "Dynamic invocation of '<='.": 1,
-    "Dynamic invocation of '>'.": 1,
-    "Dynamic invocation of '>='.": 1,
-    "Dynamic invocation of 'codeUnitAt'.": 1
-  },
-  "third_party/pkg/dart2js_info/lib/src/measurements.dart": {
-    "Dynamic access of 'name'.": 1,
-    "Dynamic invocation of 'call'.": 1
-  },
   "third_party/pkg/dart2js_info/lib/src/util.dart": {
     "Dynamic access of 'name'.": 1,
     "Dynamic invocation of '-'.": 1
   },
+  "third_party/pkg/dart2js_info/lib/src/binary/sink.dart": {
+    "Dynamic access of 'index'.": 1
+  },
   "pkg/js_ast/lib/src/builder.dart": {
     "Dynamic invocation of 'call'.": 2
   },
@@ -264,6 +270,12 @@
   "pkg/compiler/lib/src/ssa/value_set.dart": {
     "Dynamic invocation of 'add'.": 2
   },
+  "pkg/compiler/lib/src/inferrer/node_tracer.dart": {
+    "Dynamic access of 'receiver'.": 1,
+    "Dynamic access of 'selector'.": 3,
+    "Dynamic access of 'isIndex'.": 1,
+    "Dynamic access of 'name'.": 2
+  },
   "pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart": {
     "Dynamic access of 'keys'.": 1,
     "Dynamic invocation of 'toSet'.": 1,
@@ -278,4 +290,4 @@
     "Dynamic access of 'superclass'.": 1,
     "Dynamic access of 'needsTearOff'.": 1
   }
-}
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/closure/data/list_literal_class.dart b/tests/compiler/dart2js/closure/data/list_literal_class.dart
index 433ef26..4384e6b 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_class.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_class.dart
@@ -7,14 +7,14 @@
 /*element: A.:hasThis*/
 class A<T> {
   /*element: A.method:hasThis*/
-  @NoInline()
+  @pragma('dart2js:noInline')
   method() {
     /*fields=[this],free=[this],hasThis*/ dynamic local() => <T>[];
     return local;
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is List<int>;
 
 main() {
diff --git a/tests/compiler/dart2js/closure/data/list_literal_method.dart b/tests/compiler/dart2js/closure/data/list_literal_method.dart
index 754fe55..03a05c8 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_method.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_method.dart
@@ -4,13 +4,13 @@
 
 import 'package:expect/expect.dart';
 
-@NoInline()
+@pragma('dart2js:noInline')
 method<T>() {
   /*fields=[T],free=[T]*/ dynamic local() => <T>[];
   return local;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is List<int>;
 
 main() {
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart
index e394d32..997fd78 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart
@@ -7,7 +7,7 @@
 /*element: A.:hasThis*/
 class A<T> {
   /*element: A.method:hasThis*/
-  @NoInline()
+  @pragma('dart2js:noInline')
   method() {
     /*omit.hasThis*/
     /*strong.fields=[this],free=[this],hasThis*/
@@ -16,7 +16,7 @@
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o == null;
 
 main() {
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart
index e6a6e1a..87a5673 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart
@@ -4,7 +4,7 @@
 
 import 'package:expect/expect.dart';
 
-@NoInline()
+@pragma('dart2js:noInline')
 method<T>() {
   /*omit.*/
   /*strong.fields=[T],free=[T]*/
@@ -12,7 +12,7 @@
   return local;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o == null;
 
 main() {
diff --git a/tests/compiler/dart2js/closure/data/map_literal_class.dart b/tests/compiler/dart2js/closure/data/map_literal_class.dart
index 08cfea6..975b5ee 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_class.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_class.dart
@@ -7,14 +7,14 @@
 /*element: A.:hasThis*/
 class A<T> {
   /*element: A.method:hasThis*/
-  @NoInline()
+  @pragma('dart2js:noInline')
   method() {
     /*fields=[this],free=[this],hasThis*/ dynamic local() => <T, int>{};
     return local;
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is Map<int, int>;
 
 main() {
diff --git a/tests/compiler/dart2js/closure/data/map_literal_method.dart b/tests/compiler/dart2js/closure/data/map_literal_method.dart
index 0347de4..51f99a9 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_method.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_method.dart
@@ -4,13 +4,13 @@
 
 import 'package:expect/expect.dart';
 
-@NoInline()
+@pragma('dart2js:noInline')
 method<T>() {
   /*fields=[T],free=[T]*/ dynamic local() => <T, int>{};
   return local;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is Map<int, int>;
 
 main() {
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart
index fe4e3ae..7161fd6 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart
@@ -7,7 +7,7 @@
 /*element: A.:hasThis*/
 class A<T> {
   /*element: A.method:hasThis*/
-  @NoInline()
+  @pragma('dart2js:noInline')
   method() {
     /*omit.hasThis*/
     /*strong.fields=[this],free=[this],hasThis*/
@@ -16,7 +16,7 @@
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o == null;
 
 main() {
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart
index d6c830b..27c33a2 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart
@@ -4,7 +4,7 @@
 
 import 'package:expect/expect.dart';
 
-@NoInline()
+@pragma('dart2js:noInline')
 method<T>() {
   /*omit.*/
   /*strong.fields=[T],free=[T]*/
@@ -12,7 +12,7 @@
   return local;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o == null;
 
 main() {
diff --git a/tests/compiler/dart2js/codegen/array_static_intercept_test.dart b/tests/compiler/dart2js/codegen/array_static_intercept_test.dart
index 3dc7b76..ee3c87a 100644
--- a/tests/compiler/dart2js/codegen/array_static_intercept_test.dart
+++ b/tests/compiler/dart2js/codegen/array_static_intercept_test.dart
@@ -7,7 +7,7 @@
 import '../helpers/compiler_helper.dart';
 
 const String TEST_ONE = r"""
-foo(a) {
+foo(List<int> a) {
   a.add(42);
   a.removeLast();
   return a.length;
@@ -15,17 +15,12 @@
 """;
 
 main() {
-  test() async {
+  asyncTest(() async {
     await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       Expect.isTrue(generated.contains(r'.add$1('));
       Expect.isTrue(generated.contains(r'.removeLast$0('));
       Expect.isTrue(generated.contains(r'.length'),
           "Unexpected code to contain '.length':\n$generated");
     });
-  }
-
-  asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
-    await test();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/expect_annotations2_test.dart b/tests/compiler/dart2js/codegen/expect_annotations2_test.dart
index 5b0ba5c..fad77c6 100644
--- a/tests/compiler/dart2js/codegen/expect_annotations2_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations2_test.dart
@@ -5,25 +5,27 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/commandline_options.dart';
 import '../helpers/memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
   'main.dart': '''
         import 'package:expect/expect.dart';
 
-        @NoInline()
+        @pragma('dart2js:noInline')
         foo(y) => 49912344 + y;
 
         class A {
+          @pragma('dart2js:noElision')
           var field;
 
-          @NoInline()
+          @pragma('dart2js:noInline')
           A([this.field = 4711]);
 
-          @NoInline()
+          @pragma('dart2js:noInline')
           static bar(x) => x + 123455;
 
-          @NoInline()
+          @pragma('dart2js:noInline')
           gee(x, y) => x + y + 81234512;
         }
 
@@ -39,7 +41,9 @@
   runTest() async {
     OutputCollector collector = new OutputCollector();
     await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        outputProvider: collector,
+        options: [Flags.testMode]);
     // Simply check that the constants of the small functions are still in the
     // output, and that we don't see the result of constant folding.
     String jsOutput = collector.getOutput('', OutputType.js);
diff --git a/tests/compiler/dart2js/codegen/expect_annotations_test.dart b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
index f4e5903..d38eba7 100644
--- a/tests/compiler/dart2js/codegen/expect_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
@@ -5,6 +5,7 @@
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
 import 'package:compiler/src/inferrer/types.dart';
@@ -18,10 +19,10 @@
 
 int method(String arg) => arg.length;
 
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 int methodAssumeDynamic(String arg) => arg.length;
 
-@NoInline()
+@pragma('dart2js:noInline')
 int methodNoInline(String arg) => arg.length;
 
 void main(List<String> args) {
@@ -39,15 +40,11 @@
 }
 
 runTest() async {
-  CompilationResult result =
-      await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
+  CompilationResult result = await runCompiler(
+      memorySourceFiles: MEMORY_SOURCE_FILES, options: [Flags.testMode]);
   Compiler compiler = result.compiler;
   JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
   Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
-  Expect.isNotNull(closedWorld.commonElements.expectNoInlineClass,
-      'NoInlineClass is unresolved.');
-  Expect.isNotNull(closedWorld.commonElements.expectAssumeDynamicClass,
-      'AssumeDynamicClass is unresolved.');
 
   void testTypeMatch(FunctionEntity function, TypeMask expectedParameterType,
       TypeMask expectedReturnType, GlobalTypeInferenceResults results) {
@@ -76,11 +73,12 @@
     Expect.equals(
         expectNoInline,
         closedWorld.annotationsData.hasNoInline(method),
-        "Unexpected annotation of @NoInline() on '$method'.");
+        "Unexpected annotation of @pragma('dart2js:noInline') on '$method'.");
     Expect.equals(
         expectAssumeDynamic,
         closedWorld.annotationsData.hasAssumeDynamic(method),
-        "Unexpected annotation of @AssumeDynamic() on '$method'.");
+        "Unexpected annotation of @pragma('dart2js:assumeDynamic') on "
+        "'$method'.");
     GlobalTypeInferenceResults results =
         compiler.globalInference.resultsForTesting;
     if (expectAssumeDynamic) {
diff --git a/tests/compiler/dart2js/codegen/gvn_test.dart b/tests/compiler/dart2js/codegen/gvn_test.dart
index 678d9fc..f8ce1a1 100644
--- a/tests/compiler/dart2js/codegen/gvn_test.dart
+++ b/tests/compiler/dart2js/codegen/gvn_test.dart
@@ -46,13 +46,17 @@
 // Check that [HCheck] instructions do not prevent GVN.
 const String TEST_FIVE = r"""
 class A {
-  var foo = 21;
+  final int foo;
+  A(this.foo);
 }
 
 class B {}
 
 main() {
-  dynamic a = [new B(), new A()][0];
+  helper([new A(32), new A(21), new B(), null][0]);
+}
+
+helper(A a) {
   var b = a.foo;
   var c = a.foo;
   if (a is B) {
@@ -65,6 +69,7 @@
 // Check that a gvn'able instruction in the loop header gets hoisted.
 const String TEST_SIX = r"""
 class A {
+  @pragma('dart2js:noElision')
   final field = 54;
 }
 
@@ -106,7 +111,7 @@
 """;
 
 main() {
-  runTests() async {
+  asyncTest(() async {
     await compile(TEST_ONE, entry: 'foo', check: (String generated) {
       RegExp regexp = RegExp(r"1 \+ [a-z]+");
       checkNumberOfMatches(regexp.allMatches(generated).iterator, 1);
@@ -122,8 +127,9 @@
     });
 
     await compileAll(TEST_FIVE).then((generated) {
+      checkNumberOfMatches(RegExp(r"\.foo;").allMatches(generated).iterator, 1);
       checkNumberOfMatches(
-          RegExp(r"get\$foo\(").allMatches(generated).iterator, 1);
+          RegExp(r"get\$foo\(").allMatches(generated).iterator, 0);
     });
     await compileAll(TEST_SIX).then((generated) {
       Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
@@ -134,10 +140,5 @@
     await compileAll(TEST_EIGHT).then((generated) {
       Expect.isTrue(generated.contains('for (; i < t1; ++i)'));
     });
-  }
-
-  asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
-    await runTests();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/interceptor_test.dart b/tests/compiler/dart2js/codegen/interceptor_test.dart
index e77058e..cba680f 100644
--- a/tests/compiler/dart2js/codegen/interceptor_test.dart
+++ b/tests/compiler/dart2js/codegen/interceptor_test.dart
@@ -16,6 +16,7 @@
 
 const String TEST_TWO = r"""
   class A {
+    @pragma('dart2js:noElision')
     var length;
   }
   foo(a) {
@@ -37,11 +38,13 @@
     // intercepted, is turned into a regular getter call or field
     // access.
     await compile(TEST_TWO, entry: 'foo', check: (String generated) {
-      Expect.isFalse(generated.contains(r'a.get$length()'));
+      Expect.isFalse(generated.contains(r'a.get$length()'),
+          'a.get\$length() not expected in\n$generated');
+      Expect.isTrue(generated.contains(new RegExp(r'[$A-Z]+\.A\$\(\)\.length')),
+          '.length expected in\n$generated');
       Expect.isTrue(
-          generated.contains(new RegExp(r'[$A-Z]+\.A\$\(\)\.length')));
-      Expect.isTrue(
-          generated.contains(new RegExp(r'[$A-Z]+\.get\$length\$as\(a\)')));
+          generated.contains(new RegExp(r'[$A-Z]+\.get\$length\$as\(a\)')),
+          '*.get\$length expected in\n$generated');
     });
   }
 
diff --git a/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart b/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
index e105f5f..8b98f7d 100644
--- a/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
+++ b/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
@@ -22,7 +22,7 @@
 const String source = '''
 import 'package:expect/expect.dart';
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o, a) => o.indexOf(a);
 main() {
   test([1, 2, 3], 2);
diff --git a/tests/compiler/dart2js/codegen/load_elimination_test.dart b/tests/compiler/dart2js/codegen/load_elimination_test.dart
index fa16f0f..822a582 100644
--- a/tests/compiler/dart2js/codegen/load_elimination_test.dart
+++ b/tests/compiler/dart2js/codegen/load_elimination_test.dart
@@ -209,9 +209,11 @@
 
 const String TEST_17 = """
 var a;
+int x = 0;
 
 main() {
-  if (main()) {
+  (print)(x++);
+  if (x == 0) {
     a = true;
   } else {
     a = false;
@@ -235,7 +237,7 @@
 
 main() {
   runTests() async {
-    test(String code, String expected) async {
+    test(String code, Pattern expected) async {
       String generated = await compile(code,
           disableInlining: false, disableTypeInference: false);
       Expect.isTrue(
@@ -250,7 +252,7 @@
     await test(TEST_4, 'return t1 + t1');
     await test(TEST_5, 'return 84');
     await test(TEST_6, 'return 84');
-    await test(TEST_7, 'return 32');
+    await test(TEST_7, RegExp('return( .* =)? 32'));
     await test(TEST_8, 'return a.a');
     await test(TEST_9, 'return a.a');
     await test(TEST_10, 'return 2');
@@ -260,7 +262,8 @@
     await test(TEST_14, 'return t1[0]');
     await test(TEST_15, 'return 42');
     await test(TEST_16, 'return \$.a');
-    await test(TEST_17, 'return t1');
+    await test(TEST_17,
+        RegExp(r'return (t1|\$\.x === 0 \? \$\.a = true : \$\.a = false);'));
     await test(TEST_18, 'return t1');
   }
 
diff --git a/tests/compiler/dart2js/codegen/model_data/constructors.dart b/tests/compiler/dart2js/codegen/model_data/constructors.dart
index 69be657..e7c0d8c 100644
--- a/tests/compiler/dart2js/codegen/model_data/constructors.dart
+++ b/tests/compiler/dart2js/codegen/model_data/constructors.dart
@@ -78,6 +78,16 @@
   /*element: Class.constructor7c:params=2*/
   @pragma('dart2js:noInline')
   Class.constructor7c(a, {b, c}) {}
+
+  /*element: Class.constructor8a:params=2*/
+  @pragma('dart2js:noInline')
+  @pragma('dart2js:noElision')
+  Class.constructor8a([a, b]) {}
+
+  /*element: Class.constructor8b:params=2*/
+  @pragma('dart2js:noInline')
+  @pragma('dart2js:noElision')
+  Class.constructor8b({a, b}) {}
 }
 
 /*element: main:
@@ -104,7 +114,9 @@
   Class$constructor6c(3),
   Class$constructor7a(1),
   Class$constructor7b(2),
-  Class$constructor7c(2)],
+  Class$constructor7c(2),
+  Class$constructor8a(2),
+  Class$constructor8b(2)],
  params=0
 */
 main() {
@@ -137,4 +149,7 @@
   new Class.constructor7a(null);
   new Class.constructor7b(null, b: null);
   new Class.constructor7c(null, c: null);
+
+  new Class.constructor8a();
+  new Class.constructor8b();
 }
diff --git a/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart b/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart
index f519f30..81c7601 100644
--- a/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart
+++ b/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart
@@ -14,10 +14,11 @@
 
 class Class1a {
   /*element: Class1a.field1:emitted*/
+  @pragma('dart2js:noElision')
   int field1;
 }
 
-/*element: method1:params=1*/
+/*element: method1:access=[field1],params=1*/
 @pragma('dart2js:noInline')
 method1(dynamic c) {
   return c.field1;
@@ -25,10 +26,11 @@
 
 class Class2a<T> {
   /*element: Class2a.field2:emitted*/
+  @pragma('dart2js:noElision')
   T field2;
 }
 
-/*element: method2:params=1*/
+/*element: method2:access=[field2],params=1*/
 @pragma('dart2js:noInline')
 method2(dynamic c) {
   return c.field2;
@@ -36,11 +38,13 @@
 
 class Class3a {
   /*element: Class3a.field3:emitted,get=simple*/
+  @pragma('dart2js:noElision')
   int field3;
 }
 
 class Class3b {
   /*element: Class3b.field3:emitted,get=simple*/
+  @pragma('dart2js:noElision')
   int field3;
 }
 
@@ -52,11 +56,13 @@
 
 class Class4a {
   /*element: Class4a.field4:emitted,get=simple*/
+  @pragma('dart2js:noElision')
   int field4;
 }
 
 class Class4b implements Class4a {
   /*element: Class4b.field4:emitted,get=simple*/
+  @pragma('dart2js:noElision')
   int field4;
 }
 
diff --git a/tests/compiler/dart2js/codegen/model_data/effectively_constant_fields.dart b/tests/compiler/dart2js/codegen/model_data/effectively_constant_fields.dart
new file mode 100644
index 0000000..f1e788e
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/model_data/effectively_constant_fields.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+/*element: _field4:params=0*/
+_field4() => 4;
+
+class Class1 {
+  /*element: Class1.field1:elided*/
+  var field1 = 0;
+
+  /*element: Class1.field2:emitted*/
+  @pragma('dart2js:noElision')
+  var field2 = 1;
+
+  /*element: Class1.field3:elided,get=simple*/
+  var field3 = 2;
+
+  /*element: Class1.field4:elided*/
+  var field4 = _field4;
+}
+
+/*element: method1:params=1*/
+@pragma('dart2js:noInline')
+method1(Class1 c) {
+  return c.field1;
+}
+
+/*element: method2:access=[field2],params=1*/
+@pragma('dart2js:noInline')
+method2(Class1 c) {
+  return c.field2;
+}
+
+class Class2 {
+  /*element: Class2.field3:elided,get=simple*/
+  final field3 = 3;
+}
+
+/*element: method3:calls=[get$field3(0)],params=1*/
+@pragma('dart2js:noInline')
+method3(c) {
+  return c.field3;
+}
+
+class Class3 extends Class1 {
+  /*element: Class3.method4:params=0*/
+  @pragma('dart2js:noInline')
+  method4() {
+    return super.field1;
+  }
+}
+
+class Class4 extends Class1 {
+  /*element: Class4.method5:calls=[_field4(0)],params=0*/
+  @pragma('dart2js:noInline')
+  method5() {
+    return super.field4();
+  }
+}
+
+/*element: method6:access=[toString],params=1*/
+@pragma('dart2js:noInline')
+method6(Class1 c) {
+  return c.field1;
+}
+
+/*element: method7:access=[toString],calls=[_field4(0)],params=1*/
+@pragma('dart2js:noInline')
+method7(Class1 c) {
+  return c.field4();
+}
+
+var field8;
+
+/*element: method8:!access,params=0*/
+@pragma('dart2js:noInline')
+method8() => field8;
+
+var field9 = 10;
+
+/*element: method9:!access,params=0*/
+@pragma('dart2js:noInline')
+method9() => field9;
+
+/*element: field10:emitted,lazy*/
+var field10 = method9() + 10;
+
+/*element: method10:calls=[$get$field10(0)],params=0*/
+@pragma('dart2js:noInline')
+method10() => field10;
+
+/*element: main:calls=*,params=0*/
+main() {
+  Expect.equals(0, method1(new Class1()));
+  Expect.equals(1, method2(new Class1()));
+  Expect.equals(2, method3(new Class1()));
+  Expect.equals(3, method3(new Class2()));
+  Expect.equals(0, new Class3().method4());
+  Expect.equals(4, new Class4().method5());
+  Expect.equals(0, method6(new Class1()));
+  Expect.throws(/*calls=[method6(1)],params=0*/ () => method6(null));
+  Expect.equals(4, method7(new Class1()));
+  Expect.throws(/*calls=[method7(1)],params=0*/ () => method7(null));
+  Expect.equals(null, method8());
+  Expect.equals(10, method9());
+  Expect.equals(20, method10());
+}
diff --git a/tests/compiler/dart2js/codegen/model_data/effectively_constant_state.dart b/tests/compiler/dart2js/codegen/model_data/effectively_constant_state.dart
new file mode 100644
index 0000000..fc33c4b
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/model_data/effectively_constant_state.dart
@@ -0,0 +1,92 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+enum Enum {
+  a,
+  b,
+  c,
+}
+
+/*element: tester1:params=0*/
+@pragma('dart2js:noInline')
+tester1() {}
+
+/*element: tester2:params=0*/
+@pragma('dart2js:noInline')
+tester2() {}
+
+/*element: tester3:params=0*/
+@pragma('dart2js:noInline')
+tester3() {}
+
+class Class {
+  /*element: Class.state1:elided*/
+  final int state1;
+
+  /*element: Class.state2:elided*/
+  final Enum state2;
+
+  Class({this.state1: 1, this.state2: Enum.c});
+
+  /*element: Class.method1a:calls=[tester2(0)],params=0*/
+  @pragma('dart2js:noInline')
+  method1a() {
+    if (state1 == 0) {
+      return tester1();
+    } else if (state1 == 1) {
+      return tester2();
+    } else if (state1 == 2) {
+      return tester3();
+    }
+  }
+
+  // TODO(johnniwinther): Inline switch cases with constant expressions.
+  /*element: Class.method1b:calls=[tester2(0)],params=0,switch*/
+  @pragma('dart2js:noInline')
+  method1b() {
+    switch (state1) {
+      case 0:
+        return tester1();
+      case 1:
+        return tester2();
+      case 2:
+        return tester3();
+    }
+  }
+
+  /*element: Class.method2a:calls=[tester3(0)],params=0*/
+  @pragma('dart2js:noInline')
+  method2a() {
+    if (state2 == Enum.a) {
+      return tester1();
+    } else if (state2 == Enum.b) {
+      return tester2();
+    } else if (state2 == Enum.c) {
+      return tester3();
+    }
+  }
+
+  /*element: Class.method2b:calls=[tester1(0),tester2(0),tester3(0)],params=0,switch*/
+  @pragma('dart2js:noInline')
+  method2b() {
+    // TODO(johnniwinther): Eliminate dead code in enum switch.
+    switch (state2) {
+      case Enum.a:
+        return tester1();
+      case Enum.b:
+        return tester2();
+      case Enum.c:
+        return tester3();
+    }
+  }
+}
+
+/*element: main:calls=*,params=0*/
+main() {
+  var c = new Class();
+  c.method1a();
+  c.method1b();
+  c.method2a();
+  c.method2b();
+}
diff --git a/tests/compiler/dart2js/codegen/model_data/field_set.dart b/tests/compiler/dart2js/codegen/model_data/field_set.dart
index 6c23abe..2c68409 100644
--- a/tests/compiler/dart2js/codegen/model_data/field_set.dart
+++ b/tests/compiler/dart2js/codegen/model_data/field_set.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*element: main:calls=*,params=0*/
+/*element: main:access=*,calls=*,params=0*/
 main() {
   method1(new Class1a());
   method2(new Class2a());
diff --git a/tests/compiler/dart2js/codegen/model_data/fields.dart b/tests/compiler/dart2js/codegen/model_data/fields.dart
index 62c3b52..7815fbe 100644
--- a/tests/compiler/dart2js/codegen/model_data/fields.dart
+++ b/tests/compiler/dart2js/codegen/model_data/fields.dart
@@ -32,6 +32,7 @@
 
 class Class {
   /*element: Class.field1a:emitted*/
+  @pragma('dart2js:noElision')
   var field1a;
 
   /*element: Class.field1b:elided*/
diff --git a/tests/compiler/dart2js/codegen/model_data/instance_method_parameters.dart b/tests/compiler/dart2js/codegen/model_data/instance_method_parameters.dart
index a861c04..aced524 100644
--- a/tests/compiler/dart2js/codegen/model_data/instance_method_parameters.dart
+++ b/tests/compiler/dart2js/codegen/model_data/instance_method_parameters.dart
@@ -83,6 +83,16 @@
   @pragma('dart2js:noInline')
   method8c(a, {b, c}) {}
 
+  /*element: Class.method9a:params=2,stubs=[method9a$0:method9a$2(2)]*/
+  @pragma('dart2js:noInline')
+  @pragma('dart2js:noElision')
+  method9a([a, b]) {}
+
+  /*element: Class.method9b:params=2,stubs=[method9b$0:method9b$2$a$b(2)]*/
+  @pragma('dart2js:noInline')
+  @pragma('dart2js:noElision')
+  method9b({a, b}) {}
+
   /*element: Class.test:calls=*,params=0*/
   @pragma('dart2js:noInline')
   test() {
@@ -117,6 +127,9 @@
     method8a(null);
     method8b(null, b: null);
     method8c(null, c: null);
+
+    method9a();
+    method9b();
   }
 }
 
diff --git a/tests/compiler/dart2js/codegen/model_data/native_unused_parameters.dart b/tests/compiler/dart2js/codegen/model_data/native_unused_parameters.dart
index 36197db..9317686 100644
--- a/tests/compiler/dart2js/codegen/model_data/native_unused_parameters.dart
+++ b/tests/compiler/dart2js/codegen/model_data/native_unused_parameters.dart
@@ -5,7 +5,7 @@
 // ignore: import_internal_library
 import 'dart:_js_helper';
 
-/*element: Class.:params=1*/
+/*element: Class.:access=[toString],params=1*/
 @Native('Class')
 class Class {
   /*element: Class.method1:calls=[method1()],params=1*/
diff --git a/tests/compiler/dart2js/codegen/model_data/static_method_parameters.dart b/tests/compiler/dart2js/codegen/model_data/static_method_parameters.dart
index 5fb0bfd..b95aa11 100644
--- a/tests/compiler/dart2js/codegen/model_data/static_method_parameters.dart
+++ b/tests/compiler/dart2js/codegen/model_data/static_method_parameters.dart
@@ -82,6 +82,16 @@
 @pragma('dart2js:noInline')
 method8c(a, {b, c}) {}
 
+/*element: method9a:params=2*/
+@pragma('dart2js:noInline')
+@pragma('dart2js:noElision')
+method9a([a, b]) {}
+
+/*element: method9b:params=2*/
+@pragma('dart2js:noInline')
+@pragma('dart2js:noElision')
+method9b({a, b}) {}
+
 /*element: main:
  calls=[
   method1(0),
@@ -107,7 +117,9 @@
   method7c(3),
   method8a(1),
   method8b(2),
-  method8c(2)],
+  method8c(2),
+  method9a(2),
+  method9b(2)],
  params=0
 */
 main() {
@@ -142,4 +154,7 @@
   method8a(null);
   method8b(null, b: null);
   method8c(null, c: null);
+
+  method9a();
+  method9b();
 }
diff --git a/tests/compiler/dart2js/codegen/model_test.dart b/tests/compiler/dart2js/codegen/model_test.dart
index e00c78d..84cda3f 100644
--- a/tests/compiler/dart2js/codegen/model_test.dart
+++ b/tests/compiler/dart2js/codegen/model_test.dart
@@ -63,6 +63,8 @@
   static const String isElided = 'elided';
   static const String assignment = 'assign';
   static const String isLazy = 'lazy';
+  static const String propertyAccess = 'access';
+  static const String switchCase = 'switch';
 }
 
 /// AST visitor for computing inference data for a member.
@@ -133,6 +135,8 @@
           features[Tags.parameterCount] = '${code.params.length}';
         }
 
+        Set<js.PropertyAccess> handledAccesses = new Set();
+
         void registerCalls(String tag, js.Node node, [String prefix = '']) {
           forEachNode(node, onCall: (js.Call node) {
             js.Node target = node.target;
@@ -159,6 +163,7 @@
                   features.addElement(
                       tag, '${prefix}${name}(${node.arguments.length})');
                 }
+                handledAccesses.add(target);
               }
             }
           });
@@ -170,6 +175,7 @@
             registerCalls(Tags.parameterStub, stub.code, '${stub.name.key}:');
           }
         }
+
         forEachNode(code, onAssignment: (js.Assignment node) {
           js.Expression leftHandSide = node.leftHandSide;
           if (leftHandSide is js.PropertyAccess) {
@@ -182,9 +188,47 @@
             }
             if (name != null) {
               features.addElement(Tags.assignment, '${name}');
+              handledAccesses.add(leftHandSide);
             }
           }
         });
+
+        forEachNode(code, onPropertyAccess: (js.PropertyAccess node) {
+          if (handledAccesses.contains(node)) {
+            return;
+          }
+
+          js.Node receiver = node.receiver;
+          String receiverName;
+          if (receiver is js.VariableUse) {
+            receiverName = receiver.name;
+            if (receiverName == receiverName.toUpperCase() &&
+                receiverName != r'$') {
+              // Skip holder access.
+              receiverName = null;
+            }
+          }
+
+          js.Node selector = node.selector;
+          String name;
+          if (selector is js.Name) {
+            name = selector.key;
+          } else if (selector is js.LiteralString) {
+            /// Call to fixed backend name, so we include the argument
+            /// values to test encoding of optional parameters in native
+            /// methods.
+            name = selector.value.substring(1, selector.value.length - 1);
+          }
+
+          if (receiverName != null && name != null) {
+            features.addElement(Tags.propertyAccess, '${name}');
+          }
+        });
+
+        forEachNode(code, onSwitch: (js.Switch node) {
+          features.add(Tags.switchCase);
+        });
+
         return features;
       }
     }
diff --git a/tests/compiler/dart2js/codegen/strength_eq_test.dart b/tests/compiler/dart2js/codegen/strength_eq_test.dart
index e0c1090d..196776b 100644
--- a/tests/compiler/dart2js/codegen/strength_eq_test.dart
+++ b/tests/compiler/dart2js/codegen/strength_eq_test.dart
@@ -8,31 +8,27 @@
 
 const String CODE = """
 class A {
-  var link;
+  var _link;
+  get link => _link;
 }
 foo(x) {
   if (new DateTime.now().millisecondsSinceEpoch == 42) return null;
   var a = new A();
   if (new DateTime.now().millisecondsSinceEpoch == 42) return a;
-  a.link = a;
+  a._link = a;
   return a;
 }
 main() {
-  var x = foo(0);
+  A x = foo(0);
   return x == x.link;
 }
 """;
 
 main() {
-  runTest() async {
+  asyncTest(() async {
     // The `==` is strengthened to a HIdentity instruction. The HIdentity
     // follows `x.link`, so x cannot be `null`.
     var compare = new RegExp(r'x === x\.get\$link\(\)');
     await compileAndMatch(CODE, 'main', compare);
-  }
-
-  asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
-    await runTest();
   });
 }
diff --git a/tests/compiler/dart2js/codegen/value_range2_test.dart b/tests/compiler/dart2js/codegen/value_range2_test.dart
index aacfc98..d8738ea 100644
--- a/tests/compiler/dart2js/codegen/value_range2_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range2_test.dart
@@ -6,9 +6,8 @@
 import "package:compiler/src/inferrer/abstract_value_domain.dart";
 import "package:compiler/src/ssa/nodes.dart";
 import "package:compiler/src/ssa/value_range_analyzer.dart";
-import "package:compiler/src/js_backend/constant_system_javascript.dart";
 
-ValueRangeInfo info = new ValueRangeInfo(JavaScriptConstantSystem.only);
+ValueRangeInfo info = new ValueRangeInfo();
 
 class AbstractValueDomainMock implements AbstractValueDomain {
   const AbstractValueDomainMock();
diff --git a/tests/compiler/dart2js/end_to_end/dump_info2_test.dart b/tests/compiler/dart2js/end_to_end/dump_info2_test.dart
index 4f99c8e..7d27bf0 100644
--- a/tests/compiler/dart2js/end_to_end/dump_info2_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dump_info2_test.dart
@@ -2,9 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// Test that parameters keep their names in the output.
-
 import 'dart:convert';
+
+import 'package:compiler/compiler_new.dart';
+import 'package:dart2js_info/info.dart';
+import 'package:dart2js_info/json_info_codec.dart';
+import 'package:dart2js_info/binary_serialization.dart' as binary;
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
@@ -96,92 +99,82 @@
    main() => funcA();
 """;
 
-typedef void JsonTaking(Map<String, dynamic> json);
+typedef InfoCheck = void Function(AllInfo);
 
-jsonTest(String program, JsonTaking testFn) async {
+infoTest(String program, bool useBinary, InfoCheck check) async {
   var options = ['--out=out.js', Flags.dumpInfo];
+  // Note: we always pass '--dump-info' because the memory-compiler does not
+  // have the logic in dart2js.dart to imply dump-info when --dump-info=binary
+  // is provided.
+  if (useBinary) options.add("${Flags.dumpInfo}=binary");
+  var collector = new OutputCollector();
   var result = await runCompiler(
-      memorySourceFiles: {'main.dart': program}, options: options);
+      memorySourceFiles: {'main.dart': program},
+      options: options,
+      outputProvider: collector);
   var compiler = result.compiler;
   Expect.isFalse(compiler.compilationFailed);
-  var dumpTask = compiler.dumpInfoTask;
-
-  StringBuffer sb = new StringBuffer();
-  dumpTask.dumpInfoJson(sb, compiler.backendClosedWorldForTesting);
-  String jsonString = sb.toString();
-  Map<String, dynamic> map = json.decode(jsonString);
-
-  testFn(map);
+  AllInfo info;
+  if (useBinary) {
+    var sink = collector.binaryOutputMap[Uri.parse('out.js.info.data')];
+    info = binary.decode(sink.list);
+  } else {
+    info = new AllInfoJsonCodec().decode(
+        json.decode(collector.getOutput("out.js", OutputType.dumpInfo)));
+  }
+  check(info);
 }
 
 main() {
   asyncTest(() async {
     print('--test from kernel------------------------------------------------');
-    await runTests();
+    await runTests(useBinary: false);
+    await runTests(useBinary: true);
   });
 }
 
-runTests() async {
-  await jsonTest(TEST_BASIC, (map) {
-    Expect.isTrue(map['elements'].isNotEmpty);
-    Expect.isTrue(map['elements']['function'].isNotEmpty);
-    Expect.isTrue(map['elements']['library'].isNotEmpty);
-    Expect.isTrue(map['elements']['library'].values.any((lib) {
-      return lib['name'] == "main";
+runTests({bool useBinary: false}) async {
+  await infoTest(TEST_BASIC, useBinary, (info) {
+    Expect.isTrue(info.functions.isNotEmpty);
+    Expect.isTrue(info.libraries.isNotEmpty);
+    Expect.isTrue(info.libraries.any((lib) => lib.name == "main"));
+    Expect.isTrue(info.classes.any((c) => c.name == 'c'));
+    Expect.isTrue(info.functions.any((f) => f.name == 'f'));
+  });
+
+  await infoTest(TEST_CLOSURES, useBinary, (info) {
+    Expect.isTrue(info.functions.any((fn) {
+      return fn.name == 'bar' && fn.closures.length == 11;
     }));
-    Expect.isTrue(map['elements']['class'].values.any((clazz) {
-      return clazz['name'] == "c";
-    }));
-    Expect.isTrue(map['elements']['function'].values.any((fun) {
-      return fun['name'] == 'f';
+    Expect.isTrue(info.functions.any((fn) {
+      return fn.name == 'foo' && fn.closures.length == 10;
     }));
   });
 
-  await jsonTest(TEST_CLOSURES, (map) {
-    var functions = map['elements']['function'].values;
-    Expect.isTrue(functions.any((fn) {
-      return fn['name'] == 'bar' && fn['children'].length == 11;
-    }));
-    Expect.isTrue(functions.any((fn) {
-      return fn['name'] == 'foo' && fn['children'].length == 10;
+  await infoTest(TEST_STATICS, useBinary, (info) {
+    Expect.isTrue(info.functions.any((fn) => fn.name == 'does_something'));
+    Expect.isTrue(info.classes.any((cls) {
+      return cls.name == 'ContainsStatics' && cls.functions.length >= 1;
     }));
   });
 
-  await jsonTest(TEST_STATICS, (map) {
-    var functions = map['elements']['function'].values;
-    var classes = map['elements']['class'].values;
-    Expect.isTrue(functions.any((fn) {
-      return fn['name'] == 'does_something';
+  await infoTest(TEST_INLINED_1, useBinary, (info) {
+    Expect.isTrue(info.functions.any((fn) {
+      return fn.name == 'double' && fn.inlinedCount == 1;
     }));
-    Expect.isTrue(classes.any((cls) {
-      return cls['name'] == 'ContainsStatics' && cls['children'].length >= 1;
+    Expect.isTrue(info.classes.any((cls) {
+      return cls.name == 'Doubler' && cls.functions.length >= 1;
     }));
   });
 
-  await jsonTest(TEST_INLINED_1, (map) {
-    var functions = map['elements']['function'].values;
-    var classes = map['elements']['class'].values;
-    Expect.isTrue(functions.any((fn) {
-      return fn['name'] == 'double' && fn['inlinedCount'] == 1;
-    }));
-    Expect.isTrue(classes.any((cls) {
-      return cls['name'] == 'Doubler' && cls['children'].length >= 1;
-    }));
-  });
-
-  await jsonTest(TEST_INLINED_2, (map) {
-    var functions = map['elements']['function'].values;
-    var deps = map['holding'];
-    var main_ = functions.firstWhere((v) => v['name'] == 'main');
-    var fn1 = functions.firstWhere((v) => v['name'] == 'funcA');
-    var fn2 = functions.firstWhere((v) => v['name'] == 'funcB');
+  await infoTest(TEST_INLINED_2, useBinary, (info) {
+    var main_ = info.functions.firstWhere((v) => v.name == 'main');
+    var fn1 = info.functions.firstWhere((v) => v.name == 'funcA');
+    var fn2 = info.functions.firstWhere((v) => v.name == 'funcB');
     Expect.isTrue(main_ != null);
     Expect.isTrue(fn1 != null);
     Expect.isTrue(fn2 != null);
-    Expect.isTrue(deps.containsKey(main_['id']));
-    Expect.isTrue(deps.containsKey(fn1['id']));
-    Expect.isTrue(deps.containsKey(fn2['id']));
-    Expect.isTrue(deps[main_['id']].any((dep) => dep['id'] == fn1['id']));
-    Expect.isTrue(deps[fn1['id']].any((dep) => dep['id'] == fn2['id']));
+    Expect.isTrue(main_.uses.any((dep) => dep.target == fn1));
+    Expect.isTrue(fn1.uses.any((dep) => dep.target == fn2));
   });
 }
diff --git a/tests/compiler/dart2js/end_to_end/dump_info_test.dart b/tests/compiler/dart2js/end_to_end/dump_info_test.dart
index ba7fd8a..19a4cfe 100644
--- a/tests/compiler/dart2js/end_to_end/dump_info_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dump_info_test.dart
@@ -30,8 +30,10 @@
   Directory tmpDir = Directory.systemTemp.createTempSync('dump_info_test_');
   Directory out1 = new Directory.fromUri(tmpDir.uri.resolve('without'));
   out1.createSync();
-  Directory out2 = new Directory.fromUri(tmpDir.uri.resolve('with'));
+  Directory out2 = new Directory.fromUri(tmpDir.uri.resolve('json'));
   out2.createSync();
+  Directory out3 = new Directory.fromUri(tmpDir.uri.resolve('binary'));
+  out3.createSync();
   Directory appDir =
       new Directory.fromUri(Uri.base.resolve('samples-dev/swarm'));
 
@@ -52,7 +54,7 @@
         .readAsStringSync();
 
     command =
-        dart2JsCommand(['--out=with/out.js', 'swarm.dart', '--dump-info']);
+        dart2JsCommand(['--out=json/out.js', 'swarm.dart', '--dump-info']);
     print('Run $command');
     result = Process.runSync(Platform.resolvedExecutable, command,
         workingDirectory: tmpDir.path);
@@ -63,10 +65,28 @@
     print(result.stderr);
     Expect.equals(0, result.exitCode);
     String output2 =
-        new File.fromUri(tmpDir.uri.resolve('with/out.js')).readAsStringSync();
+        new File.fromUri(tmpDir.uri.resolve('json/out.js')).readAsStringSync();
 
     print('Compare outputs...');
     Expect.equals(output1, output2);
+
+    command = dart2JsCommand(
+        ['--out=binary/out.js', 'swarm.dart', '--dump-info=binary']);
+    print('Run $command');
+    result = Process.runSync(Platform.resolvedExecutable, command,
+        workingDirectory: tmpDir.path);
+    print('exit code: ${result.exitCode}');
+    print('stdout:');
+    print(result.stdout);
+    print('stderr:');
+    print(result.stderr);
+    Expect.equals(0, result.exitCode);
+    String output3 = new File.fromUri(tmpDir.uri.resolve('binary/out.js'))
+        .readAsStringSync();
+
+    print('Compare outputs...');
+    Expect.equals(output1, output3);
+
     print('Done');
   } finally {
     print("Deleting '${tmpDir.path}'.");
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index 5369eb2..ba46e61 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -190,7 +190,7 @@
     return actualMaps.putIfAbsent(uri, () => <Id, ActualData<T>>{});
   }
 
-  void processMember(MemberEntity member, Map<Id, ActualData> actualMap) {
+  void processMember(MemberEntity member, Map<Id, ActualData<T>> actualMap) {
     if (member.isAbstract) {
       return;
     }
@@ -319,7 +319,7 @@
   Map<int, List<String>> computeAnnotations(Uri uri) {
     Map<Id, ActualData<T>> thisMap = actualMaps[uri];
     Map<int, List<String>> annotations = <int, List<String>>{};
-    thisMap.forEach((Id id, ActualData data1) {
+    thisMap.forEach((Id id, ActualData<T> data1) {
       String value1 = '${data1.value}';
       annotations
           .putIfAbsent(data1.offset, () => [])
@@ -332,8 +332,8 @@
       Map<Id, ActualData<T>> thisMap, Map<Id, ActualData<T>> otherMap, Uri uri,
       {bool includeMatches: false}) {
     Map<int, List<String>> annotations = <int, List<String>>{};
-    thisMap.forEach((Id id, ActualData data1) {
-      ActualData data2 = otherMap[id];
+    thisMap.forEach((Id id, ActualData<T> data1) {
+      ActualData<T> data2 = otherMap[id];
       String value1 = '${data1.value}';
       if (data1.value != data2?.value) {
         String value2 = '${data2?.value ?? '---'}';
@@ -346,7 +346,7 @@
             .add(colorizeMatch(value1));
       }
     });
-    otherMap.forEach((Id id, ActualData data2) {
+    otherMap.forEach((Id id, ActualData<T> data2) {
       if (!thisMap.containsKey(id)) {
         String value1 = '---';
         String value2 = '${data2.value}';
@@ -398,11 +398,11 @@
   Compiler get compiler => _compiledData.compiler;
   ElementEnvironment get elementEnvironment => _compiledData.elementEnvironment;
   Uri get mainUri => _compiledData.mainUri;
-  MemberAnnotations<ActualData> get actualMaps => _actualMaps;
+  MemberAnnotations<ActualData<T>> get actualMaps => _actualMaps;
 
   String actualCode(Uri uri) {
     Map<int, List<String>> annotations = <int, List<String>>{};
-    actualMaps[uri].forEach((Id id, ActualData data) {
+    actualMaps[uri].forEach((Id id, ActualData<T> data) {
       annotations
           .putIfAbsent(data.sourceSpan.begin, () => [])
           .add('${data.value}');
@@ -412,7 +412,7 @@
 
   String diffCode(Uri uri, DataInterpreter<T> dataValidator) {
     Map<int, List<String>> annotations = <int, List<String>>{};
-    actualMaps[uri].forEach((Id id, ActualData data) {
+    actualMaps[uri].forEach((Id id, ActualData<T> data) {
       IdValue expectedValue = expectedMaps[uri][id];
       T actualValue = data.value;
       String unexpectedMessage =
@@ -712,9 +712,18 @@
       Features expectedFeatures = Features.fromText(expectedData);
       Set<String> validatedFeatures = new Set<String>();
       expectedFeatures.forEach((String key, Object expectedValue) {
+        bool expectMatch = true;
+        if (key.startsWith('!')) {
+          key = key.substring(1);
+          expectMatch = false;
+        }
         validatedFeatures.add(key);
         Object actualValue = actualFeatures[key];
-        if (!actualFeatures.containsKey(key)) {
+        if (!expectMatch) {
+          if (actualFeatures.containsKey(key)) {
+            errorsFound.add('Unexpected data found for $key=$actualValue');
+          }
+        } else if (!actualFeatures.containsKey(key)) {
           errorsFound.add('No data found for $key');
         } else if (expectedValue == '') {
           if (actualValue != '') {
@@ -856,13 +865,14 @@
     }
   }
 
-  data.actualMaps.forEach((Uri uri, Map<Id, ActualData> actualMap) {
+  data.actualMaps.forEach((Uri uri, Map<Id, ActualData<T>> actualMap) {
     checkActualMap(actualMap, data.expectedMaps[uri], uri);
   });
   checkActualMap(data.actualMaps.globalData, data.expectedMaps.globalData);
 
   Set<Id> missingIds = new Set<Id>();
-  void checkMissing(Map<Id, IdValue> expectedMap, Map<Id, ActualData> actualMap,
+  void checkMissing(
+      Map<Id, IdValue> expectedMap, Map<Id, ActualData<T>> actualMap,
       [Uri uri]) {
     expectedMap.forEach((Id id, IdValue expected) {
       if (!actualMap.containsKey(id)) {
diff --git a/tests/compiler/dart2js/equivalence/show_helper.dart b/tests/compiler/dart2js/equivalence/show_helper.dart
index 0e1c800..c1bbe3f 100644
--- a/tests/compiler/dart2js/equivalence/show_helper.dart
+++ b/tests/compiler/dart2js/equivalence/show_helper.dart
@@ -23,7 +23,7 @@
   return argParser;
 }
 
-show(ArgResults argResults, DataComputer dataComputer,
+show<T>(ArgResults argResults, DataComputer<T> dataComputer,
     {bool testFrontend: false, List<String> options: const <String>[]}) async {
   dataComputer.setup();
 
@@ -48,7 +48,8 @@
   if (omitImplicitChecks) {
     options.add(Flags.omitImplicitChecks);
   }
-  CompiledData data = await computeData(entryPoint, const {}, dataComputer,
+  CompiledData<T> data = await computeData<T>(
+      entryPoint, const {}, dataComputer,
       options: options,
       testFrontend: testFrontend,
       forUserLibrariesOnly: false,
diff --git a/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart b/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart
new file mode 100644
index 0000000..b2eb74d
--- /dev/null
+++ b/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+enum Enum {
+  /*element: Enum.a:constant=ConstructedConstant(Enum(_name=StringConstant("Enum.a"),index=IntConstant(0)))*/
+  a,
+
+  /*element: Enum.b:constant=ConstructedConstant(Enum(_name=StringConstant("Enum.b"),index=IntConstant(1)))*/
+  b,
+
+  /*element: Enum.c:constant=ConstructedConstant(Enum(_name=StringConstant("Enum.c"),index=IntConstant(2)))*/
+  c,
+}
+
+@pragma('dart2js:noInline')
+tester1() {}
+
+@pragma('dart2js:noInline')
+tester2() {}
+
+@pragma('dart2js:noInline')
+tester3() {}
+
+class Class {
+  /*element: Class.state1:constant=IntConstant(1)*/
+  final int state1;
+
+  /*element: Class.state2:constant=ConstructedConstant(Enum(_name=StringConstant("Enum.c"),index=IntConstant(2)))*/
+  final Enum state2;
+
+  Class({this.state1: 1, this.state2: Enum.c});
+
+  @pragma('dart2js:noInline')
+  method1a() {
+    if (state1 == 0) {
+      return tester1();
+    } else if (state1 == 1) {
+      return tester2();
+    } else if (state1 == 2) {
+      return tester3();
+    }
+  }
+
+  @pragma('dart2js:noInline')
+  method1b() {
+    switch (state1) {
+      case 0:
+        return tester1();
+      case 1:
+        return tester2();
+      case 2:
+        return tester3();
+    }
+  }
+
+  @pragma('dart2js:noInline')
+  method2a() {
+    if (state2 == Enum.a) {
+      return tester1();
+    } else if (state2 == Enum.b) {
+      return tester2();
+    } else if (state2 == Enum.c) {
+      return tester3();
+    }
+  }
+
+  @pragma('dart2js:noInline')
+  method2b() {
+    switch (state2) {
+      case Enum.a:
+        return tester1();
+      case Enum.b:
+        return tester2();
+      case Enum.c:
+        return tester3();
+    }
+  }
+}
+
+main() {
+  var c = new Class();
+  c.method1a();
+  c.method1b();
+  c.method2a();
+  c.method2b();
+}
diff --git a/tests/compiler/dart2js/field_analysis/jdata/multi_initializers.dart b/tests/compiler/dart2js/field_analysis/jdata/multi_initializers.dart
new file mode 100644
index 0000000..d6120a4
--- /dev/null
+++ b/tests/compiler/dart2js/field_analysis/jdata/multi_initializers.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  var c = new Class1.a();
+  c.field3a = null;
+  c.field4a = null;
+  c.field5a = null;
+  new Class1.b();
+
+  print(c.field1);
+  print(c.field2);
+  print(c.field3a);
+  print(c.field3b);
+  print(c.field4a);
+  print(c.field4b);
+  print(c.field5a);
+  print(c.field5b);
+}
+
+class Class1 {
+  var field1 = 0;
+  var field2;
+
+  /*element: Class1.field3a:allocator,initial=IntConstant(3)*/
+  var field3a;
+
+  /*element: Class1.field3b:constant=IntConstant(3)*/
+  var field3b;
+
+  /*element: Class1.field4a:allocator,initial=IntConstant(4)*/
+  var field4a = 4;
+
+  /*element: Class1.field4b:constant=IntConstant(4)*/
+  var field4b = 4;
+
+  /*element: Class1.field5a:allocator,initial=IntConstant(5)*/
+  var field5a = 5;
+
+  /*element: Class1.field5b:constant=IntConstant(5)*/
+  var field5b = 5;
+
+  Class1.a()
+      : field1 = 1,
+        field2 = 1,
+        field3a = 3,
+        field3b = 3,
+        field5a = 5,
+        field5b = 5;
+
+  Class1.b()
+      : field2 = 2,
+        field3a = 3,
+        field3b = 3,
+        field5a = 5,
+        field5b = 5;
+}
diff --git a/tests/compiler/dart2js/field_analysis/jdata/optional_parameters.dart b/tests/compiler/dart2js/field_analysis/jdata/optional_parameters.dart
new file mode 100644
index 0000000..715a521
--- /dev/null
+++ b/tests/compiler/dart2js/field_analysis/jdata/optional_parameters.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  var c1a = new Class1a(0);
+  new Class1a(0, 1);
+  c1a.field1 = null;
+  c1a.field2 = null;
+  c1a.field3 = null;
+  print(c1a.field1);
+  print(c1a.field2);
+  print(c1a.field3);
+
+  var c1b = new Class1b(0);
+  new Class1b(0, 1);
+  print(c1b.field1);
+  print(c1b.field2);
+  print(c1b.field3);
+
+  var c2a = new Class2a(0);
+  new Class2a(0, field2: 1);
+  c2a.field1 = null;
+  c2a.field2 = null;
+  c2a.field3 = null;
+  print(c2a.field1);
+  print(c2a.field2);
+  print(c2a.field3);
+
+  var c2b = new Class2b(0);
+  new Class2b(0, field2: 1);
+  print(c2b.field1);
+  print(c2b.field2);
+  print(c2b.field3);
+}
+
+class Class1a {
+  /*element: Class1a.field1:*/
+  var field1;
+
+  /*element: Class1a.field2:*/
+  var field2;
+
+  /*element: Class1a.field3:allocator,initial=IntConstant(3)*/
+  var field3;
+
+  Class1a(this.field1, [this.field2 = 2, this.field3 = 3]);
+}
+
+class Class1b {
+  /*element: Class1b.field1:*/
+  var field1;
+
+  /*element: Class1b.field2:*/
+  var field2;
+
+  /*element: Class1b.field3:constant=IntConstant(3)*/
+  var field3;
+
+  Class1b(this.field1, [this.field2 = 2, this.field3 = 3]);
+}
+
+class Class2a {
+  /*element: Class2a.field1:*/
+  var field1;
+
+  /*element: Class2a.field2:*/
+  var field2;
+
+  /*element: Class2a.field3:allocator,initial=IntConstant(3)*/
+  var field3;
+
+  Class2a(this.field1, {this.field2 = 2, this.field3 = 3});
+}
+
+class Class2b {
+  /*element: Class2b.field1:*/
+  var field1;
+
+  /*element: Class2b.field2:*/
+  var field2;
+
+  /*element: Class2b.field3:constant=IntConstant(3)*/
+  var field3;
+
+  Class2b(this.field1, {this.field2 = 2, this.field3 = 3});
+}
diff --git a/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart b/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
new file mode 100644
index 0000000..f7fd886
--- /dev/null
+++ b/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
@@ -0,0 +1,339 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  use1(new Class1());
+  use2(new Class2());
+}
+
+@pragma('dart2js:noInline')
+use(Object o) {
+  print(o);
+}
+
+@pragma('dart2js:noInline')
+use1(Class1 c1) {
+  c1.field0a = null;
+  c1.field1a = null;
+  c1.field2a = null;
+  c1.field3a = null;
+  c1.field4a = null;
+  c1.field5a = null;
+  c1.field6a = null;
+  c1.field7a = null;
+  c1.field8a = null;
+  c1.field9a = null;
+  c1.field9c = null;
+  c1.field10a = null;
+  c1.field10c = null;
+  c1.field11a = null;
+  c1.field12a = null;
+  c1.field13a = null;
+  use(c1.field0a);
+  use(c1.field0b);
+  use(c1.field1a);
+  use(c1.field1b);
+  use(c1.field2a);
+  use(c1.field2b);
+  use(c1.field3a);
+  use(c1.field3b);
+  use(c1.field4a);
+  use(c1.field4b);
+  use(c1.field5a);
+  use(c1.field5b);
+  use(c1.field6a);
+  use(c1.field6b);
+  use(c1.field7a);
+  use(c1.field7b);
+  use(c1.field8a);
+  use(c1.field8b);
+  use(c1.field9a);
+  use(c1.field9b);
+  use(c1.field9c);
+  use(c1.field9d);
+  use(c1.field10a);
+  use(c1.field10b);
+  use(c1.field10c);
+  use(c1.field10d);
+  use(c1.field11a);
+  use(c1.field11b);
+  use(c1.field12a);
+  use(c1.field12b);
+  use(c1.field13a);
+  use(c1.field13b);
+}
+
+@pragma('dart2js:noInline')
+use2(Class2 c2) {
+  c2.field1a = null;
+  c2.field2a = null;
+  c2.field3a = null;
+  c2.field4a = null;
+  c2.field5a = null;
+  c2.field6a = null;
+  c2.field7a = null;
+  c2.field8a = null;
+  c2.field9a = null;
+  c2.field9c = null;
+  c2.field10a = null;
+  c2.field10c = null;
+  c2.field11a = null;
+  c2.field12a = null;
+  c2.field13a = null;
+  use(c2.field1a);
+  use(c2.field1b);
+  use(c2.field2a);
+  use(c2.field2b);
+  use(c2.field3a);
+  use(c2.field3b);
+  use(c2.field4a);
+  use(c2.field4b);
+  use(c2.field5a);
+  use(c2.field5b);
+  use(c2.field6a);
+  use(c2.field6b);
+  use(c2.field7a);
+  use(c2.field7b);
+  use(c2.field8a);
+  use(c2.field8b);
+  use(c2.field9a);
+  use(c2.field9b);
+  use(c2.field9c);
+  use(c2.field9d);
+  use(c2.field10a);
+  use(c2.field10b);
+  use(c2.field10c);
+  use(c2.field10d);
+  use(c2.field11a);
+  use(c2.field11b);
+  use(c2.field12a);
+  use(c2.field12b);
+  use(c2.field13a);
+  use(c2.field13b);
+}
+
+/*element: const1:constant=BoolConstant(true)*/
+const bool const1 = true;
+
+class Class1 {
+  /*element: Class1.field0a:allocator,initial=NullConstant*/
+  var field0a;
+
+  /*element: Class1.field0b:constant=NullConstant*/
+  var field0b;
+
+  /*element: Class1.field1a:allocator,initial=NullConstant*/
+  var field1a = null;
+
+  /*element: Class1.field1b:constant=NullConstant*/
+  var field1b = null;
+
+  /*element: Class1.field2a:allocator,initial=BoolConstant(true)*/
+  var field2a = true;
+
+  /*element: Class1.field2b:constant=BoolConstant(true)*/
+  var field2b = true;
+
+  /*element: Class1.field3a:allocator,initial=BoolConstant(false)*/
+  var field3a = false;
+
+  /*element: Class1.field3b:constant=BoolConstant(false)*/
+  var field3b = false;
+
+  /*element: Class1.field4a:allocator,initial=IntConstant(0)*/
+  var field4a = 0;
+
+  /*element: Class1.field4b:constant=IntConstant(0)*/
+  var field4b = 0;
+
+  /*element: Class1.field5a:allocator,initial=IntConstant(1)*/
+  var field5a = 1;
+
+  /*element: Class1.field5b:constant=IntConstant(1)*/
+  var field5b = 1;
+
+  /*element: Class1.field6a:allocator,initial=StringConstant("")*/
+  var field6a = '';
+
+  /*element: Class1.field6b:constant=StringConstant("")*/
+  var field6b = '';
+
+  /*element: Class1.field7a:allocator,initial=StringConstant("foo")*/
+  var field7a = 'foo';
+
+  /*element: Class1.field7b:constant=StringConstant("foo")*/
+  var field7b = 'foo';
+
+  /*element: Class1.field8a:initial=DoubleConstant(0.5)*/
+  var field8a = 0.5;
+
+  /*element: Class1.field8b:constant=DoubleConstant(0.5)*/
+  var field8b = 0.5;
+
+  /*element: Class1.field9a:initial=ListConstant([])*/
+  var field9a = const [];
+
+  /*element: Class1.field9b:constant=ListConstant([])*/
+  var field9b = const [];
+
+  /*element: Class1.field9c:initial=ListConstant(<int>[IntConstant(0), IntConstant(1)])*/
+  var field9c = const [0, 1];
+
+  /*element: Class1.field9d:constant=ListConstant(<int>[IntConstant(0), IntConstant(1), IntConstant(2)])*/
+  var field9d = const [0, 1, 2];
+
+  /*element: Class1.field10a:initial=MapConstant({})*/
+  var field10a = const {};
+
+  /*element: Class1.field10b:constant=MapConstant({})*/
+  var field10b = const {};
+
+  /*element: Class1.field10c:initial=MapConstant(<int, int>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3)})*/
+  var field10c = const {0: 1, 2: 3};
+
+  /*element: Class1.field10d:constant=MapConstant(<int, int>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3), IntConstant(4): IntConstant(5)})*/
+  var field10d = const {0: 1, 2: 3, 4: 5};
+
+  /*element: Class1.field11a:initial=ConstructedConstant(Symbol(_name=StringConstant("foo")))*/
+  var field11a = #foo;
+
+  /*element: Class1.field11b:constant=ConstructedConstant(Symbol(_name=StringConstant("foo")))*/
+  var field11b = #foo;
+
+  /*element: Class1.field12a:allocator,initial=IntConstant(5)*/
+  var field12a = 2 + 3;
+
+  /*element: Class1.field12b:constant=IntConstant(5)*/
+  var field12b = 2 + 3;
+
+  /*element: Class1.field13a:allocator,initial=BoolConstant(true)*/
+  var field13a = const1;
+
+  /*element: Class1.field13b:constant=BoolConstant(true)*/
+  var field13b = const1;
+}
+
+class Class2 {
+  /*element: Class2.field1a:allocator,initial=NullConstant*/
+  var field1a;
+
+  /*element: Class2.field1b:constant=NullConstant*/
+  var field1b;
+
+  /*element: Class2.field2a:allocator,initial=BoolConstant(true)*/
+  var field2a;
+
+  /*element: Class2.field2b:constant=BoolConstant(true)*/
+  var field2b;
+
+  /*element: Class2.field3a:allocator,initial=BoolConstant(false)*/
+  var field3a;
+
+  /*element: Class2.field3b:constant=BoolConstant(false)*/
+  var field3b;
+
+  /*element: Class2.field4a:allocator,initial=IntConstant(0)*/
+  var field4a;
+
+  /*element: Class2.field4b:constant=IntConstant(0)*/
+  var field4b;
+
+  /*element: Class2.field5a:allocator,initial=IntConstant(1)*/
+  var field5a;
+
+  /*element: Class2.field5b:constant=IntConstant(1)*/
+  var field5b;
+
+  /*element: Class2.field6a:allocator,initial=StringConstant("")*/
+  var field6a;
+
+  /*element: Class2.field6b:constant=StringConstant("")*/
+  var field6b;
+
+  /*element: Class2.field7a:allocator,initial=StringConstant("foo")*/
+  var field7a;
+
+  /*element: Class2.field7b:constant=StringConstant("foo")*/
+  var field7b;
+
+  /*element: Class2.field8a:initial=DoubleConstant(0.5)*/
+  var field8a;
+
+  /*element: Class2.field8b:constant=DoubleConstant(0.5)*/
+  var field8b;
+
+  /*element: Class2.field9a:initial=ListConstant([])*/
+  var field9a;
+
+  /*element: Class2.field9b:constant=ListConstant([])*/
+  var field9b;
+
+  /*element: Class2.field9c:initial=ListConstant(<int>[IntConstant(0), IntConstant(1)])*/
+  var field9c;
+
+  /*element: Class2.field9d:constant=ListConstant(<int>[IntConstant(0), IntConstant(1), IntConstant(2)])*/
+  var field9d;
+
+  /*element: Class2.field10a:initial=MapConstant({})*/
+  var field10a;
+
+  /*element: Class2.field10b:constant=MapConstant({})*/
+  var field10b;
+
+  /*element: Class2.field10c:initial=MapConstant(<int, int>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3)})*/
+  var field10c;
+
+  /*element: Class2.field10d:constant=MapConstant(<int, int>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3), IntConstant(4): IntConstant(5)})*/
+  var field10d;
+
+  /*element: Class2.field11a:initial=ConstructedConstant(Symbol(_name=StringConstant("foo")))*/
+  var field11a;
+
+  /*element: Class2.field11b:constant=ConstructedConstant(Symbol(_name=StringConstant("foo")))*/
+  var field11b;
+
+  /*element: Class2.field12a:allocator,initial=IntConstant(5)*/
+  var field12a;
+
+  /*element: Class2.field12b:constant=IntConstant(5)*/
+  var field12b;
+
+  /*element: Class2.field13a:allocator,initial=BoolConstant(true)*/
+  var field13a;
+
+  /*element: Class2.field13b:constant=BoolConstant(true)*/
+  var field13b;
+
+  Class2()
+      : field1a = null,
+        field1b = null,
+        field2a = true,
+        field2b = true,
+        field3a = false,
+        field3b = false,
+        field4a = 0,
+        field4b = 0,
+        field5a = 1,
+        field5b = 1,
+        field6a = '',
+        field6b = '',
+        field7a = 'foo',
+        field7b = 'foo',
+        field8a = 0.5,
+        field8b = 0.5,
+        field9a = const [],
+        field9b = const [],
+        field9c = const [0, 1],
+        field9d = const [0, 1, 2],
+        field10a = const {},
+        field10b = const {},
+        field10c = const {0: 1, 2: 3},
+        field10d = const {0: 1, 2: 3, 4: 5},
+        field11a = #foo,
+        field11b = #foo,
+        field12a = 2 + 3,
+        field12b = 2 + 3,
+        field13a = const1,
+        field13b = const1;
+}
diff --git a/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart b/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart
new file mode 100644
index 0000000..967f63c
--- /dev/null
+++ b/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  print(field1a);
+  print(field1b);
+  field1c = null;
+  print(field1c);
+
+  print(field2a);
+  print(field2b);
+  field2c = null;
+  print(field2c);
+
+  print(field3a);
+  print(field3b);
+  field3c = null;
+  print(field3c);
+}
+
+/*element: field1a:constant=IntConstant(0)*/
+final field1a = 0;
+
+/*element: field1b:constant=IntConstant(0)*/
+var field1b = 0;
+
+/*element: field1c:initial=IntConstant(0)*/
+var field1c = 0;
+
+/*element: field2a:constant=ListConstant([])*/
+final field2a = const [];
+
+/*element: field2b:constant=ListConstant([])*/
+var field2b = const [];
+
+/*element: field2c:initial=ListConstant([])*/
+var field2c = const [];
+
+/*element: field3a:*/
+final field3a = [];
+
+/*element: field3b:*/
+var field3b = [];
+
+/*element: field3c:*/
+var field3c = [];
diff --git a/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart b/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
new file mode 100644
index 0000000..1e9dfb7
--- /dev/null
+++ b/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/ir/util.dart';
+import 'package:compiler/src/js_backend/field_analysis.dart';
+import 'package:compiler/src/js_model/js_world.dart';
+import 'package:compiler/src/util/features.dart';
+import 'package:kernel/ast.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+
+main(List<String> args) {
+  asyncTest(() async {
+    Directory dataDir = new Directory.fromUri(Platform.script.resolve('jdata'));
+    await checkTests(dataDir, const JAllocatorAnalysisDataComputer(),
+        args: args, testOmit: false);
+  });
+}
+
+class Tags {
+  static const String isInitializedInAllocator = 'allocator';
+  static const String initialValue = 'initial';
+  static const String constantValue = 'constant';
+}
+
+class JAllocatorAnalysisDataComputer extends DataComputer<Features> {
+  const JAllocatorAnalysisDataComputer();
+
+  @override
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool verbose: false}) {
+    if (member.isField) {
+      JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+      JFieldAnalysis fieldAnalysis = closedWorld.fieldAnalysis;
+      ir.Member node = closedWorld.elementMap.getMemberDefinition(member).node;
+      Features features = new Features();
+      FieldAnalysisData fieldData = fieldAnalysis.getFieldData(member);
+      if (fieldData.isEffectivelyConstant) {
+        features[Tags.constantValue] =
+            fieldData.constantValue.toStructuredText();
+      } else if (fieldData.initialValue != null) {
+        features[Tags.initialValue] = fieldData.initialValue.toStructuredText();
+      }
+      if (fieldData.isInitializedInAllocator) {
+        features.add(Tags.isInitializedInAllocator);
+      }
+      Id id = computeEntityId(node);
+      actualMap[id] = new ActualData<Features>(
+          id, features, computeSourceSpanFromTreeNode(node), member);
+    }
+  }
+
+  @override
+  DataInterpreter<Features> get dataValidator =>
+      const FeaturesDataInterpreter();
+}
diff --git a/tests/compiler/dart2js/field_analysis/kdata/multi_initializers.dart b/tests/compiler/dart2js/field_analysis/kdata/multi_initializers.dart
new file mode 100644
index 0000000..0d7200d
--- /dev/null
+++ b/tests/compiler/dart2js/field_analysis/kdata/multi_initializers.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  new Class1.a();
+  new Class1.b();
+}
+
+class Class1 {
+  /*element: Class1.field1:
+    Class1.a=IntConstant(1),
+    initial=IntConstant(0)
+   */
+  var field1 = 0;
+
+  /*element: Class1.field2:
+   Class1.a=IntConstant(1),
+   Class1.b=IntConstant(2),
+   initial=NullConstant
+  */
+  var field2;
+
+  /*element: Class1.field3:
+   Class1.a=IntConstant(3),
+   Class1.b=IntConstant(3),
+   initial=NullConstant
+  */
+  var field3;
+
+  /*element: Class1.field4:initial=IntConstant(4)*/
+  var field4 = 4;
+
+  /*element: Class1.field5:
+   Class1.a=IntConstant(5),
+   Class1.b=IntConstant(5),
+   initial=IntConstant(5)
+  */
+  var field5 = 5;
+
+  Class1.a()
+      : field1 = 1,
+        field2 = 1,
+        field3 = 3,
+        field5 = 5;
+
+  Class1.b()
+      : field2 = 2,
+        field3 = 3,
+        field5 = 5;
+}
diff --git a/tests/compiler/dart2js/field_analysis/kdata/optional_parameters.dart b/tests/compiler/dart2js/field_analysis/kdata/optional_parameters.dart
new file mode 100644
index 0000000..1dbbde0
--- /dev/null
+++ b/tests/compiler/dart2js/field_analysis/kdata/optional_parameters.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  new Class1(0);
+  new Class1(0, 1);
+  new Class2(0);
+  new Class2(0, field2: 1);
+}
+
+class Class1 {
+  /*element: Class1.field1:
+   Class1.=?,
+   initial=NullConstant
+  */
+  var field1;
+
+  /*element: Class1.field2:
+   Class1.=1:IntConstant(2),
+   initial=NullConstant
+  */
+  var field2;
+
+  /*element: Class1.field3:
+   Class1.=2:IntConstant(3),
+   initial=NullConstant
+  */
+  var field3;
+
+  Class1(this.field1, [this.field2 = 2, this.field3 = 3]);
+}
+
+class Class2 {
+  /*element: Class2.field1:
+   Class2.=?,
+   initial=NullConstant
+  */
+  var field1;
+
+  /*element: Class2.field2:
+   Class2.=field2:IntConstant(2),
+   initial=NullConstant
+  */
+  var field2;
+
+  /*element: Class2.field3:
+   Class2.=field3:IntConstant(3),
+   initial=NullConstant
+  */
+  var field3;
+
+  Class2(this.field1, {this.field2 = 2, this.field3 = 3});
+}
diff --git a/tests/compiler/dart2js/field_analysis/kdata/side_effects.dart b/tests/compiler/dart2js/field_analysis/kdata/side_effects.dart
new file mode 100644
index 0000000..e65028c
--- /dev/null
+++ b/tests/compiler/dart2js/field_analysis/kdata/side_effects.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  new Class1();
+}
+
+method1() => 1;
+
+class Class1 {
+  var field1 = method1();
+  var field2 = throw 'foo';
+  var field3 = method1();
+
+  Class1() : field3 = null;
+}
diff --git a/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart b/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart
new file mode 100644
index 0000000..8bf8e47
--- /dev/null
+++ b/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  new Class1();
+  new Class2();
+}
+
+/*element: const1:complexity=constant,initial=BoolConstant(true)*/
+const bool const1 = true;
+
+class Class1 {
+  /*element: Class1.field0:initial=NullConstant*/
+  var field0;
+
+  /*element: Class1.field1:initial=NullConstant*/
+  var field1 = null;
+
+  /*element: Class1.field2:initial=BoolConstant(true)*/
+  var field2 = true;
+
+  /*element: Class1.field3:initial=BoolConstant(false)*/
+  var field3 = false;
+
+  /*element: Class1.field4:initial=IntConstant(0)*/
+  var field4 = 0;
+
+  /*element: Class1.field5:initial=IntConstant(1)*/
+  var field5 = 1;
+
+  /*element: Class1.field6:initial=StringConstant("")*/
+  var field6 = '';
+
+  /*element: Class1.field7:initial=StringConstant("foo")*/
+  var field7 = 'foo';
+
+  /*element: Class1.field8:initial=DoubleConstant(0.5)*/
+  var field8 = 0.5;
+
+  /*element: Class1.field9:initial=ListConstant([])*/
+  var field9 = const [];
+
+  /*element: Class1.field10:initial=MapConstant({})*/
+  var field10 = const {};
+
+  /*element: Class1.field11:initial=ConstructedConstant(Symbol(_name=StringConstant("foo")))*/
+  var field11 = #foo;
+
+  /*element: Class1.field12:initial=IntConstant(5)*/
+  var field12 = 2 + 3;
+
+  /*element: Class1.field13:initial=BoolConstant(true)*/
+  var field13 = const1;
+
+  /*element: Class1.field14:*/
+  var field14 = const1 is int;
+}
+
+class Class2 {
+  /*element: Class2.field1:Class2.=NullConstant,initial=NullConstant*/
+  var field1;
+
+  /*element: Class2.field2:Class2.=BoolConstant(true),initial=NullConstant*/
+  var field2;
+
+  /*element: Class2.field3:Class2.=BoolConstant(false),initial=NullConstant*/
+  var field3;
+
+  /*element: Class2.field4:Class2.=IntConstant(0),initial=NullConstant*/
+  var field4;
+
+  /*element: Class2.field5:Class2.=IntConstant(1),initial=NullConstant*/
+  var field5;
+
+  /*element: Class2.field6:Class2.=StringConstant(""),initial=NullConstant*/
+  var field6;
+
+  /*element: Class2.field7:Class2.=StringConstant("foo"),initial=NullConstant*/
+  var field7;
+
+  /*element: Class2.field8:Class2.=DoubleConstant(0.5),initial=NullConstant*/
+  var field8;
+
+  /*element: Class2.field9:Class2.=ListConstant([]),initial=NullConstant*/
+  var field9;
+
+  /*element: Class2.field10:Class2.=MapConstant({}),initial=NullConstant*/
+  var field10;
+
+  /*element: Class2.field11:Class2.=ConstructedConstant(Symbol(_name=StringConstant("foo"))),initial=NullConstant*/
+  var field11;
+
+  /*element: Class2.field12:Class2.=IntConstant(5),initial=NullConstant*/
+  var field12;
+
+  /*element: Class2.field13:Class2.=BoolConstant(true),initial=NullConstant*/
+  var field13;
+
+  /*element: Class2.field14:Class2.=?,initial=NullConstant*/
+  var field14;
+
+  Class2()
+      : field1 = null,
+        field2 = true,
+        field3 = false,
+        field4 = 0,
+        field5 = 1,
+        field6 = '',
+        field7 = 'foo',
+        field8 = 0.5,
+        field9 = const [],
+        field10 = const {},
+        field11 = #foo,
+        field12 = 2 + 3,
+        field13 = const1,
+        field14 = const1 is int;
+}
diff --git a/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart b/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart
new file mode 100644
index 0000000..fc87293
--- /dev/null
+++ b/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  print(field1a);
+  print(field1b);
+  print(field1c);
+
+  print(field2a);
+  print(field2b);
+  print(field2c);
+
+  print(field3a);
+  print(field3b);
+  print(field3c);
+
+  print(field4a);
+  print(field4b);
+  print(field4c);
+}
+
+/*element: field1a:complexity=constant,initial=IntConstant(0)*/
+final field1a = 0;
+
+/*element: field1b:complexity=constant,initial=IntConstant(0)*/
+var field1b = 0;
+
+/*element: field1c:complexity=constant,initial=IntConstant(0)*/
+const field1c = 0;
+
+/*element: field2a:complexity=constant,initial=ListConstant([])*/
+final field2a = const [];
+
+/*element: field2b:complexity=constant,initial=ListConstant([])*/
+var field2b = const [];
+
+/*element: field2c:complexity=constant,initial=ListConstant([])*/
+const field2c = const [];
+
+/*element: field3a:complexity=lazy*/
+final field3a = [];
+
+/*element: field3b:complexity=lazy*/
+var field3b = [];
+
+/*element: field3c:complexity=lazy*/
+var field3c = [];
+
+// TODO(johnniwinther): Recognize these as of constant complexity.
+/*element: field4a:complexity=lazy,initial=IntConstant(5)*/
+final field4a = 2 + 3;
+
+/*element: field4b:complexity=lazy,initial=IntConstant(5)*/
+var field4b = 2 + 3;
+
+/*element: field4c:complexity=lazy,initial=IntConstant(5)*/
+const field4c = 2 + 3;
diff --git a/tests/compiler/dart2js/allocator_analysis/kallocator_analysis_test.dart b/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
similarity index 62%
rename from tests/compiler/dart2js/allocator_analysis/kallocator_analysis_test.dart
rename to tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
index a4b8e88..dbcfcfd 100644
--- a/tests/compiler/dart2js/allocator_analysis/kallocator_analysis_test.dart
+++ b/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
@@ -5,10 +5,9 @@
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/constants/values.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/ir/util.dart';
-import 'package:compiler/src/js_backend/allocator_analysis.dart';
+import 'package:compiler/src/js_backend/field_analysis.dart';
 import 'package:compiler/src/kernel/kernel_strategy.dart';
 import 'package:compiler/src/util/features.dart';
 import 'package:kernel/ast.dart' as ir;
@@ -25,6 +24,7 @@
 
 class Tags {
   static const String initialValue = 'initial';
+  static const String complexity = 'complexity';
 }
 
 class KAllocatorAnalysisDataComputer extends DataComputer<Features> {
@@ -36,14 +36,30 @@
       {bool verbose: false}) {
     if (member.isField) {
       KernelFrontEndStrategy frontendStrategy = compiler.frontendStrategy;
-      KAllocatorAnalysis allocatorAnalysis =
-          compiler.backend.allocatorResolutionAnalysisForTesting;
+      KFieldAnalysis allocatorAnalysis =
+          compiler.backend.fieldAnalysisForTesting;
       ir.Member node = frontendStrategy.elementMap.getMemberNode(member);
-      ConstantValue initialValue =
-          allocatorAnalysis.getFixedInitializerForTesting(member);
       Features features = new Features();
-      if (initialValue != null) {
-        features[Tags.initialValue] = initialValue.toStructuredText();
+      if (member.isInstanceMember) {
+        AllocatorData data =
+            allocatorAnalysis.getAllocatorDataForTesting(member);
+        if (data != null) {
+          if (data.initialValue != null) {
+            features[Tags.initialValue] = data.initialValue.toStructuredText();
+          }
+          data.initializers.forEach((constructor, value) {
+            features['${constructor.enclosingClass.name}.${constructor.name}'] =
+                value?.shortText;
+          });
+        }
+      } else {
+        StaticFieldData staticFieldData =
+            allocatorAnalysis.getStaticFieldDataForTesting(member);
+        if (staticFieldData.initialValue != null) {
+          features[Tags.initialValue] =
+              staticFieldData.initialValue.toStructuredText();
+        }
+        features[Tags.complexity] = staticFieldData.complexity.shortText;
       }
       Id id = computeEntityId(node);
       actualMap[id] = new ActualData<Features>(
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
index bc93229..65b2146 100644
--- a/tests/compiler/dart2js/generic_methods/generic_method_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
@@ -13,9 +13,7 @@
 import '../helpers/d8_helper.dart';
 
 const String SOURCE = r'''
-import 'package:meta/dart2js.dart';
-
-@noInline
+@pragma('dart2js:noInline')
 method1<T>(T t) {
   print('method1:');
   print('$t is $T = ${t is T}');
@@ -23,7 +21,7 @@
   print('');
 }
 
-@noInline
+@pragma('dart2js:noInline')
 method2<T, S>(S s, T t) {
   print('method2:');
   print('$t is $T = ${t is T}');
@@ -33,7 +31,7 @@
   print('');
 }
 
-@tryInline
+@pragma('dart2js:tryInline')
 method3<T, S>(T t, S s) {
   print('method3:');
   print('$t is $T = ${t is T}');
@@ -65,7 +63,7 @@
 }
 
 class Class2 {
-  @tryInline
+  @pragma('dart2js:tryInline')
   method5<T>(T t) {
     print('Class2.method5:');
     print('$t is $T = ${t is T}');
@@ -73,7 +71,7 @@
     print('');
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   method6(o) {
     print('Class2.method6:');
     print('$o is int = ${o is int}');
@@ -83,7 +81,7 @@
 }
 
 class Class3 {
-  @noInline
+  @pragma('dart2js:noInline')
   method6<T>(T t) {
     print('Class3.method6:');
     print('$t is $T = ${t is T}');
diff --git a/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart b/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart
index 802c06d..850e1ff 100644
--- a/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart
+++ b/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart
@@ -13,33 +13,31 @@
 import '../helpers/memory_compiler.dart';
 
 const String code = '''
-import 'package:meta/dart2js.dart';
-
 // This needs one-arg instantiation.
-@noInline
+@pragma('dart2js:noInline')
 T f1a<T>(T t) => t;
 
 // This needs no instantiation because it is not closurized.
-@noInline
+@pragma('dart2js:noInline')
 T f1b<T>(T t1, T t2) => t1;
 
 class Class {
   // This needs two-arg instantiation.
-  @noInline
+  @pragma('dart2js:noInline')
   bool f2a<T, S>(T t, S s) => t == s;
 
   // This needs no instantiation because it is not closurized.
-  @noInline
+  @pragma('dart2js:noInline')
   bool f2b<T, S>(T t, S s1, S s2) => t == s1;
 }
 
-@noInline
+@pragma('dart2js:noInline')
 int method1(int i, int Function(int) f) => f(i);
 
-@noInline
+@pragma('dart2js:noInline')
 bool method2(int a, int b, bool Function(int, int) f) => f(a, b);
 
-@noInline
+@pragma('dart2js:noInline')
 int method3(int a, int b, int c, int Function(int, int, int) f) => f(a, b, c);
 
 main() {
diff --git a/tests/compiler/dart2js/generic_methods/world_test.dart b/tests/compiler/dart2js/generic_methods/world_test.dart
index 13c9a72..dc793c1 100644
--- a/tests/compiler/dart2js/generic_methods/world_test.dart
+++ b/tests/compiler/dart2js/generic_methods/world_test.dart
@@ -11,47 +11,45 @@
 import '../helpers/memory_compiler.dart';
 
 const String code = r'''
-import 'package:meta/dart2js.dart';
-
 class Class1 {
-  @noInline
+  @pragma('dart2js:noInline')
   method1<T>() {}
 
-  @noInline
+  @pragma('dart2js:noInline')
   method2<T>() => T;
 
-  @noInline
+  @pragma('dart2js:noInline')
   method3<T>() => T;
 
-  @noInline
+  @pragma('dart2js:noInline')
   method4<T>() => T;
 
-  @noInline
+  @pragma('dart2js:noInline')
   method5<T>() => T;
 
-  @noInline
+  @pragma('dart2js:noInline')
   method6<T>() {}
 }
 
 class Class2 {}
 
 class Class3 implements Class1 {
-  @noInline
+  @pragma('dart2js:noInline')
   method1<T>() {}
 
-  @noInline
+  @pragma('dart2js:noInline')
   method2<T>() {}
 
-  @noInline
+  @pragma('dart2js:noInline')
   method3<T>() {}
 
-  @noInline
+  @pragma('dart2js:noInline')
   method4<T>() {}
 
-  @noInline
+  @pragma('dart2js:noInline')
   method5<T>() {}
 
-  @noInline
+  @pragma('dart2js:noInline')
   method6<T>() {}
 }
 
diff --git a/tests/compiler/dart2js/helpers/d8_helper.dart b/tests/compiler/dart2js/helpers/d8_helper.dart
index 612f617..10c6444 100644
--- a/tests/compiler/dart2js/helpers/d8_helper.dart
+++ b/tests/compiler/dart2js/helpers/d8_helper.dart
@@ -68,7 +68,7 @@
   if (printSteps) print('d8 output:');
   if (printSteps) print(out);
   if (expectedOutput != null) {
-    Expect.equals(0, runResult.exitCode);
+    Expect.equals(0, runResult.exitCode, "Unexpected exit code.");
     Expect.stringEquals(expectedOutput.trim(),
         runResult.stdout.replaceAll('\r\n', '\n').trim());
   }
diff --git a/tests/compiler/dart2js/helpers/program_lookup.dart b/tests/compiler/dart2js/helpers/program_lookup.dart
index cac728c..ccbf049 100644
--- a/tests/compiler/dart2js/helpers/program_lookup.dart
+++ b/tests/compiler/dart2js/helpers/program_lookup.dart
@@ -227,11 +227,13 @@
 void forEachNode(js.Node root,
     {void Function(js.Call) onCall,
     void Function(js.PropertyAccess) onPropertyAccess,
-    void Function(js.Assignment) onAssignment}) {
+    void Function(js.Assignment) onAssignment,
+    void Function(js.Switch) onSwitch}) {
   CallbackVisitor visitor = new CallbackVisitor(
       onCall: onCall,
       onPropertyAccess: onPropertyAccess,
-      onAssignment: onAssignment);
+      onAssignment: onAssignment,
+      onSwitch: onSwitch);
   root.accept(visitor);
 }
 
@@ -239,8 +241,10 @@
   final void Function(js.Call) onCall;
   final void Function(js.PropertyAccess) onPropertyAccess;
   final void Function(js.Assignment) onAssignment;
+  final void Function(js.Switch) onSwitch;
 
-  CallbackVisitor({this.onCall, this.onPropertyAccess, this.onAssignment});
+  CallbackVisitor(
+      {this.onCall, this.onPropertyAccess, this.onAssignment, this.onSwitch});
 
   @override
   visitCall(js.Call node) {
@@ -259,4 +263,10 @@
     if (onAssignment != null) onAssignment(node);
     return super.visitAssignment(node);
   }
+
+  @override
+  visitSwitch(js.Switch node) {
+    if (onSwitch != null) onSwitch(node);
+    return super.visitSwitch(node);
+  }
 }
diff --git a/tests/compiler/dart2js/inference/data/catch.dart b/tests/compiler/dart2js/inference/data/catch.dart
index d468579..4d84e87 100644
--- a/tests/compiler/dart2js/inference/data/catch.dart
+++ b/tests/compiler/dart2js/inference/data/catch.dart
@@ -13,9 +13,9 @@
 /// Untyped catch clause.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*element: catchUntyped:[null|subclass=Object]*/
+/*element: catchUntyped:[subclass=Object]*/
 catchUntyped() {
-  var local;
+  dynamic local = 0;
   try {} catch (e) {
     local = e;
   }
@@ -39,7 +39,7 @@
 /// Catch clause with stack trace.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*element: catchStackTrace:[null|subclass=Object]*/
+/*element: catchStackTrace:[subclass=Object]*/
 catchStackTrace() {
   dynamic local = 0;
   try {} catch (_, s) {
diff --git a/tests/compiler/dart2js/inference/data/for_in.dart b/tests/compiler/dart2js/inference/data/for_in.dart
index 231c016..c622275 100644
--- a/tests/compiler/dart2js/inference/data/for_in.dart
+++ b/tests/compiler/dart2js/inference/data/for_in.dart
@@ -7,11 +7,7 @@
   forInDirect();
   forInReturn();
   forInReturnMulti();
-  forInReturnRefined();
-  forInReturnRefinedDynamic();
-  testInForIn();
-  operatorInForIn();
-  updateInForIn();
+  forInReturnNonNull();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -66,12 +62,12 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// Sequentially refine element and return it from a for-in loop on known list
-// type.
+// Sequentially refine that an element is not null and return it from a for-in
+// loop on known list type.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*element: forInReturnRefined:[null|subclass=JSInt]*/
-forInReturnRefined() {
+/*element: forInReturnNonNull:[subclass=JSInt]*/
+forInReturnNonNull() {
   /*iterator: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 3)*/
   /*current: [exact=ArrayIterator]*/
   /*moveNext: [exact=ArrayIterator]*/
@@ -82,113 +78,5 @@
     a. /*[subclass=JSInt]*/ isEven;
     return a;
   }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Sequentially refine element and return it from a for-in loop on known list
-// type with a dynamic variable.
-////////////////////////////////////////////////////////////////////////////////
-
-/*element: forInReturnRefinedDynamic:[null|subclass=JSInt]*/
-forInReturnRefinedDynamic() {
-  /*iterator: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 3)*/
-  /*current: [exact=ArrayIterator]*/
-  /*moveNext: [exact=ArrayIterator]*/
-  for (dynamic a in [1, 2, 3]) {
-    // TODO(johnniwinther): We should know the type of [a] here.
-    a.isEven;
-    a. /*[subclass=JSInt]*/ isEven;
-    return a;
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Refine element through test and return it from a for-in loop on known list
-// type.
-////////////////////////////////////////////////////////////////////////////////
-
-/*element: Class1.:[exact=Class1]*/
-class Class1 {
-  /*element: Class1.field1:[exact=JSUInt31]*/
-  var field1 = 42;
-}
-
-/*element: _testInForIn:[null|exact=Class1]*/
-_testInForIn(
-    /*Container([exact=JSExtendableArray], element: [exact=Class1], length: 2)*/ list) {
-  /*iterator: Container([exact=JSExtendableArray], element: [exact=Class1], length: 2)*/
-  /*current: [exact=ArrayIterator]*/
-  /*moveNext: [exact=ArrayIterator]*/
-  for (var t in list) {
-    if (t.field1) {
-      return t;
-    }
-  }
-}
-
-/*element: testInForIn:[null]*/
-testInForIn() {
-  _testInForIn([new Class1(), new Class1()]);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Refine element through operator and return it from a for-in loop on known
-// list type.
-////////////////////////////////////////////////////////////////////////////////
-
-/*element: Class2.:[exact=Class2]*/
-class Class2 {
-  /*element: Class2.field2a:[exact=JSUInt31]*/
-  var field2a = 42;
-  /*element: Class2.field2b:[exact=JSUInt31]*/
-  var field2b = 42;
-}
-
-/*element: _operatorInForIn:[null|exact=Class2]*/
-_operatorInForIn(
-    /*Container([exact=JSExtendableArray], element: [exact=Class2], length: 2)*/ list) {
-  /*iterator: Container([exact=JSExtendableArray], element: [exact=Class2], length: 2)*/
-  /*current: [exact=ArrayIterator]*/
-  /*moveNext: [exact=ArrayIterator]*/
-  for (var t in list) {
-    if (t.field2a /*invoke: [exact=JSUInt31]*/ <
-        t. /*[exact=Class2]*/ field2b) {
-      return t;
-    }
-  }
-}
-
-/*element: operatorInForIn:[null]*/
-operatorInForIn() {
-  _operatorInForIn([new Class2(), new Class2()]);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Refine element through operator and return it from a for-in loop on known
-// list type.
-////////////////////////////////////////////////////////////////////////////////
-
-/*element: Class3.:[exact=Class3]*/
-class Class3 {
-  /*element: Class3.field3a:[exact=JSUInt31]*/
-  var field3a = 42;
-  /*element: Class3.field3b:[exact=JSUInt31]*/
-  var field3b = 42;
-}
-
-/*element: _updateInForIn:[null]*/
-_updateInForIn(
-    /*Container([exact=JSExtendableArray], element: [exact=Class3], length: 2)*/ list) {
-  /*iterator: Container([exact=JSExtendableArray], element: [exact=Class3], length: 2)*/
-  /*current: [exact=ArrayIterator]*/
-  /*moveNext: [exact=ArrayIterator]*/
-  for (var t in list) {
-    t.field3b = t.field3a;
-    t. /*update: [exact=Class3]*/ field3a = 87;
-  }
-}
-
-/*element: updateInForIn:[null]*/
-updateInForIn() {
-  _updateInForIn([new Class3(), new Class3()]);
+  return 0;
 }
diff --git a/tests/compiler/dart2js/inference/data/general.dart b/tests/compiler/dart2js/inference/data/general.dart
index f4e11b1..a00c12b 100644
--- a/tests/compiler/dart2js/inference/data/general.dart
+++ b/tests/compiler/dart2js/inference/data/general.dart
@@ -384,7 +384,7 @@
   var c;
   L1:
   if (a /*invoke: Value([exact=JSBool], value: true)*/ > 1) {
-    if (a /*invoke: [empty]*/ == 2) {
+    if (a /*invoke: Value([exact=JSBool], value: true)*/ == 2) {
       break L1;
     }
     c = 42;
@@ -581,7 +581,7 @@
   return a;
 }
 
-/*element: testSpecialization1:[subclass=JSNumber]*/
+/*element: testSpecialization1:[subclass=Object]*/
 testSpecialization1() {
   var a = topLevelGetter();
   a - 42;
@@ -621,7 +621,7 @@
   return a;
 }
 
-/*element: testReturnNull3:[null|subclass=Object]*/
+/*element: testReturnNull3:[subclass=Object]*/
 testReturnNull3(/*[null|subclass=Object]*/ a) {
   if (a == null) return 42;
   return a;
@@ -641,7 +641,7 @@
   return a;
 }
 
-/*element: testReturnNull6:[null|subclass=Object]*/
+/*element: testReturnNull6:[subclass=Object]*/
 testReturnNull6() {
   var a = topLevelGetter();
   if (a == null) return 42;
diff --git a/tests/compiler/dart2js/inference/data/list.dart b/tests/compiler/dart2js/inference/data/list.dart
index 6592f98..85919b2 100644
--- a/tests/compiler/dart2js/inference/data/list.dart
+++ b/tests/compiler/dart2js/inference/data/list.dart
@@ -21,6 +21,7 @@
   newFloat64List();
   newInt16List();
   newInt32List();
+  newInt32List2();
   newInt8List();
   newUint16List();
   newUint32List();
@@ -77,10 +78,23 @@
 /*element: _field1:[exact=JSUInt31]*/
 var _field1 = 10;
 
-/*element: newInt32List:Container([exact=NativeInt32List], element: [subclass=JSInt], length: null)*/
+/*element: newInt32List:Container([exact=NativeInt32List], element: [subclass=JSInt], length: 10)*/
 newInt32List() => new Int32List(_field1);
 
 ////////////////////////////////////////////////////////////////////////////////
+// Create a Int32List using a changed non-final top-level field as length.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _field1b:[subclass=JSPositiveInt]*/
+var _field1b = 10;
+
+/*element: newInt32List2:Container([exact=NativeInt32List], element: [subclass=JSInt], length: null)*/
+newInt32List2() {
+  _field1b /*invoke: [subclass=JSPositiveInt]*/ ++;
+  return new Int32List(_field1b);
+}
+
+////////////////////////////////////////////////////////////////////////////////
 // Create a Int8List using a final top-level field as length.
 ////////////////////////////////////////////////////////////////////////////////
 
diff --git a/tests/compiler/dart2js/inference/data/optimizer_hints.dart b/tests/compiler/dart2js/inference/data/optimizer_hints.dart
index 4346d19..919332e 100644
--- a/tests/compiler/dart2js/inference/data/optimizer_hints.dart
+++ b/tests/compiler/dart2js/inference/data/optimizer_hints.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 /*element: main:[null]*/
 main() {
   assumeDynamic();
@@ -21,7 +19,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: _assumeDynamic:[null|subclass=Object]*/
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 _assumeDynamic(/*[null|subclass=Object]*/ o) => o;
 
 /*element: assumeDynamic:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/postfix_prefix.dart b/tests/compiler/dart2js/inference/data/postfix_prefix.dart
index 9ede9a2..92a47c2 100644
--- a/tests/compiler/dart2js/inference/data/postfix_prefix.dart
+++ b/tests/compiler/dart2js/inference/data/postfix_prefix.dart
@@ -18,7 +18,7 @@
   /*element: A.[]=:[null]*/
   operator []=(/*[empty]*/ index, /*[subclass=JSNumber]*/ value) {}
 
-  /*element: A.returnDynamic1:[exact=JSUInt31]*/
+  /*element: A.returnDynamic1:Union([exact=JSString], [exact=JSUInt31])*/
   returnDynamic1() => /*[subclass=A]*/ /*update: [subclass=A]*/ foo
       /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ --;
 
@@ -30,7 +30,7 @@
   returnNum2() => /*[subclass=A]*/ /*update: [subclass=A]*/ foo
       /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ -= 42;
 
-  /*element: A.returnDynamic2:[exact=JSUInt31]*/
+  /*element: A.returnDynamic2:Union([exact=JSString], [exact=JSUInt31])*/
   returnDynamic2() => this
           /*[subclass=A]*/ /*update: [subclass=A]*/ [index]
       /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ --;
@@ -44,12 +44,10 @@
           /*[subclass=A]*/ /*update: [subclass=A]*/ [index]
       /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ -= 42;
 
-  // TODO(johnniwinther): Investigate why implementations differ on update.
   /*element: A.returnEmpty3:[empty]*/
   returnEmpty3() {
     dynamic a = this;
-    return a. /*[subclass=A]*/
-            /*update: [empty]*/
+    return a. /*[subclass=A]*/ /*update: [subclass=A]*/
             bar
         /*invoke: [empty]*/ --;
   }
@@ -76,7 +74,7 @@
   /*element: B.[]:[exact=JSUInt31]*/
   operator [](/*[empty]*/ index) => 42;
 
-  /*element: B.returnString1:[empty]*/
+  /*element: B.returnString1:Value([exact=JSString], value: "string")*/
   returnString1() =>
       super.foo /*invoke: Value([exact=JSString], value: "string")*/ --;
 
@@ -89,7 +87,7 @@
   returnDynamic2() =>
       super.foo /*invoke: Value([exact=JSString], value: "string")*/ -= 42;
 
-  /*element: B.returnString2:[empty]*/
+  /*element: B.returnString2:Value([exact=JSString], value: "string")*/
   returnString2() => super[index]
       /*invoke: Value([exact=JSString], value: "string")*/ --;
 
diff --git a/tests/compiler/dart2js/inference/data/refine_captured_locals.dart b/tests/compiler/dart2js/inference/data/refine_captured_locals.dart
index f1695af..f11fc71 100644
--- a/tests/compiler/dart2js/inference/data/refine_captured_locals.dart
+++ b/tests/compiler/dart2js/inference/data/refine_captured_locals.dart
@@ -20,12 +20,9 @@
   method1() {}
 }
 
-/*element: Class2.:[exact=Class2]*/
-class Class2 {}
-
 /*element: _refineBeforeCapture:[exact=Class1]*/
-_refineBeforeCapture(/*Union([exact=Class1], [exact=Class2])*/ o) {
-  o. /*invoke: Union([exact=Class1], [exact=Class2])*/ method1();
+_refineBeforeCapture(/*[null|exact=Class1]*/ o) {
+  o. /*invoke: [null|exact=Class1]*/ method1();
   o. /*invoke: [exact=Class1]*/ method1();
 
   /*[exact=Class1]*/ localFunction() => o;
@@ -35,7 +32,7 @@
 /*element: refineBeforeCapture:[null]*/
 refineBeforeCapture() {
   _refineBeforeCapture(new Class1());
-  _refineBeforeCapture(new Class2());
+  _refineBeforeCapture(null);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/tests/compiler/dart2js/inference/data/refine_locals.dart b/tests/compiler/dart2js/inference/data/refine_locals.dart
index 8711587..b14eede 100644
--- a/tests/compiler/dart2js/inference/data/refine_locals.dart
+++ b/tests/compiler/dart2js/inference/data/refine_locals.dart
@@ -9,7 +9,7 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// Refine the type of a non-captured local variable through a sequence of
+// Refine nullability of a non-captured local variable through a sequence of
 // accesses and updates.
 ////////////////////////////////////////////////////////////////////////////////
 
@@ -31,141 +31,87 @@
   method0() {}
   /*element: Class2.method2:[null]*/
   method2() {}
-  /*element: Class2.field0:[null|exact=JSUInt31]*/
+  /*element: Class2.field0:[null]*/
   var field0;
-  /*element: Class2.field2:[null|exact=JSUInt31]*/
+  /*element: Class2.field2:[null]*/
   var field2;
 }
 
-/*element: _refineToClass1Invoke:[empty]*/
-_refineToClass1Invoke(/*Union([exact=Class1], [exact=Class2])*/ o) {
+/*element: _refineUnion:Union([exact=Class1], [exact=Class2])*/
+_refineUnion(/*Union([null|exact=Class1], [null|exact=Class2])*/ o) {
+  o. /*invoke: Union([null|exact=Class1], [null|exact=Class2])*/ method0();
   o. /*invoke: Union([exact=Class1], [exact=Class2])*/ method1();
-  o. /*invoke: [exact=Class1]*/ method0();
-  o. /*invoke: [exact=Class1]*/ method2();
-  return o;
-}
-
-/*element: _refineToClass2Invoke:[empty]*/
-_refineToClass2Invoke(/*Union([exact=Class1], [exact=Class2])*/ o) {
   o. /*invoke: Union([exact=Class1], [exact=Class2])*/ method2();
-  o. /*invoke: [exact=Class2]*/ method0();
-  o. /*invoke: [exact=Class2]*/ method1();
   return o;
 }
 
-/*element: _refineToEmptyInvoke:[empty]*/
-_refineToEmptyInvoke(/*Union([exact=Class1], [exact=Class2])*/ o) {
-  o. /*invoke: Union([exact=Class1], [exact=Class2])*/ method1();
-  o. /*invoke: [exact=Class1]*/ method2();
-  o. /*invoke: [empty]*/ method0();
+/*element: _refineFromMethod:[exact=Class1]*/
+_refineFromMethod(/*[null|exact=Class1]*/ o) {
+  o. /*invoke: [null|exact=Class1]*/ method0();
+  o. /*invoke: [exact=Class1]*/ method1();
   return o;
 }
 
-/*element: _refineToClass1Get:[empty]*/
-_refineToClass1Get(/*Union([exact=Class1], [exact=Class2])*/ o) {
-  o. /*Union([exact=Class1], [exact=Class2])*/ field0;
-  o. /*Union([exact=Class1], [exact=Class2])*/ field1;
-  o. /*[exact=Class1]*/ field2;
+/*element: _refineFromGetter:[exact=Class2]*/
+_refineFromGetter(/*[null|exact=Class2]*/ o) {
+  o. /*[null|exact=Class2]*/ field0;
+  o. /*[exact=Class2]*/ field2;
   return o;
 }
 
-/*element: _refineToClass2Get:[empty]*/
-_refineToClass2Get(/*Union([exact=Class1], [exact=Class2])*/ o) {
-  o. /*Union([exact=Class1], [exact=Class2])*/ field0;
-  o. /*Union([exact=Class1], [exact=Class2])*/ field2;
-  o. /*[exact=Class2]*/ field1;
+/*element: _refineFromSetter:[exact=Class1]*/
+_refineFromSetter(/*[null|exact=Class1]*/ o) {
+  o. /*update: [null|exact=Class1]*/ field0 = 0;
+  o. /*update: [exact=Class1]*/ field1 = 0;
   return o;
 }
 
-/*element: _refineToEmptyGet:[empty]*/
-_refineToEmptyGet(/*Union([exact=Class1], [exact=Class2])*/ o) {
-  o. /*Union([exact=Class1], [exact=Class2])*/ field1;
-  o. /*[exact=Class1]*/ field2;
-  o. /*[empty]*/ field0;
-  return o;
-}
-
-/*element: _refineToClass1Set:[empty]*/
-_refineToClass1Set(/*Union([exact=Class1], [exact=Class2])*/ o) {
-  o. /*update: Union([exact=Class1], [exact=Class2])*/ field0 = 0;
-  o. /*update: Union([exact=Class1], [exact=Class2])*/ field1 = 0;
-  o. /*update: [exact=Class1]*/ field2 = 0;
-  return o;
-}
-
-/*element: _refineToClass2Set:[empty]*/
-_refineToClass2Set(/*Union([exact=Class1], [exact=Class2])*/ o) {
-  o. /*update: Union([exact=Class1], [exact=Class2])*/ field0 = 0;
-  o. /*update: Union([exact=Class1], [exact=Class2])*/ field2 = 0;
-  o. /*update: [exact=Class2]*/ field1 = 0;
-  return o;
-}
-
-/*element: _refineToEmptySet:[empty]*/
-_refineToEmptySet(/*Union([exact=Class1], [exact=Class2])*/ o) {
-  o. /*update: Union([exact=Class1], [exact=Class2])*/ field1 = 0;
-  o. /*update: [exact=Class1]*/ field2 = 0;
-  o. /*update: [empty]*/ field0 = 0;
-  return o;
-}
-
-/*element: _refineToClass1InvokeIfNotNull:[null]*/
-_refineToClass1InvokeIfNotNull(
-    /*Union([exact=Class2], [null|exact=Class1])*/ o) {
+/*element: _noRefinementNullAware:[null|exact=Class1]*/
+_noRefinementNullAware(/*[null|exact=Class1]*/ o) {
   o
       ?.
-      /*invoke: Union([exact=Class1], [exact=Class2])*/
+      /*invoke: [exact=Class1]*/
       method1();
-  o
-      ?.
-      /*invoke: [exact=Class1]*/
-      method0();
-  o
-      ?.
-      /*invoke: [exact=Class1]*/
-      method2();
   return o;
 }
 
-/*element: _noRefinementToClass1InvokeSet:Union([exact=Class2], [null|exact=Class1])*/
-_noRefinementToClass1InvokeSet(
-    /*Union([exact=Class2], [null|exact=Class1])*/ o) {
-  (o = o). /*invoke: Union([exact=Class2], [null|exact=Class1])*/ method1();
-  (o = o). /*invoke: Union([exact=Class2], [null|exact=Class1])*/ method0();
-  (o = o). /*invoke: Union([exact=Class2], [null|exact=Class1])*/ method2();
+/*element: _noRefinementNullSelectors:[exact=Class2]*/
+_noRefinementNullSelectors(/*[null|exact=Class2]*/ o) {
+  o /*invoke: [null|exact=Class2]*/ == 2;
+  o. /*[null|exact=Class2]*/ hashCode;
+  o. /*[null|exact=Class2]*/ runtimeType;
+  o. /*[null|exact=Class2]*/ toString;
+  o. /*[null|exact=Class2]*/ noSuchMethod;
+  o. /*invoke: [null|exact=Class2]*/ toString();
+  o. /*invoke: [null|exact=Class2]*/ noSuchMethod(null); // assumed to throw.
+  o. /*[exact=Class2]*/ toString;
   return o;
 }
 
+/*element: _noRefinementUpdatedVariable:[null|exact=Class1]*/
+_noRefinementUpdatedVariable(/*[null|exact=Class1]*/ o) {
+  (o = o). /*invoke: [null|exact=Class1]*/ method1();
+  (o = o). /*invoke: [null|exact=Class1]*/ method0();
+  return o;
+}
+
+/*element: _condition:Value([exact=JSBool], value: false)*/
+@pragma('dart2js:assumeDynamic')
+get _condition => false;
+
 /*element: refineToClass:[null]*/
 refineToClass() {
-  _refineToClass1Invoke(new Class1());
-  _refineToClass1Invoke(new Class2());
-  _refineToClass2Invoke(new Class1());
-  _refineToClass2Invoke(new Class2());
-  _refineToEmptyInvoke(new Class1());
-  _refineToEmptyInvoke(new Class2());
+  var nullOrClass1 = _condition ? null : new Class1();
+  var nullOrClass2 = _condition ? null : new Class2();
+  _refineUnion(nullOrClass1);
+  _refineUnion(nullOrClass2);
 
-  _refineToClass1Get(new Class1());
-  _refineToClass1Get(new Class2());
-  _refineToClass2Get(new Class1());
-  _refineToClass2Get(new Class2());
-  _refineToEmptyGet(new Class1());
-  _refineToEmptyGet(new Class2());
-
-  _refineToClass1Set(new Class1());
-  _refineToClass1Set(new Class2());
-  _refineToClass2Set(new Class1());
-  _refineToClass2Set(new Class2());
-  _refineToEmptySet(new Class1());
-  _refineToEmptySet(new Class2());
-
-  _refineToClass1InvokeIfNotNull(null);
-  _refineToClass1InvokeIfNotNull(new Class1());
-  _refineToClass1InvokeIfNotNull(new Class2());
-
-  _noRefinementToClass1InvokeSet(null);
-  _noRefinementToClass1InvokeSet(new Class1());
-  _noRefinementToClass1InvokeSet(new Class2());
+  _refineFromMethod(nullOrClass1);
+  _refineFromGetter(nullOrClass2);
+  _refineFromSetter(nullOrClass1);
+  _noRefinementNullAware(nullOrClass1);
+  _noRefinementNullSelectors(nullOrClass2);
+  _noRefinementUpdatedVariable(nullOrClass1);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/tests/compiler/dart2js/inference/data/refine_order.dart b/tests/compiler/dart2js/inference/data/refine_order.dart
index c511c73..9bfe307 100644
--- a/tests/compiler/dart2js/inference/data/refine_order.dart
+++ b/tests/compiler/dart2js/inference/data/refine_order.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 /*element: Class.:[exact=Class]*/
 class Class {
   /*element: Class.field:[exact=JSUInt31]*/
@@ -34,10 +32,10 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: statementOrderFieldAccess:[null]*/
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 statementOrderFieldAccess(/*[null|subclass=Object]*/ o) {
   o.field;
-  o. /*[exact=Class]*/ field;
+  o. /*[subclass=Object]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -45,10 +43,10 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: statementOrderFieldUpdate:[null]*/
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 statementOrderFieldUpdate(/*[null|subclass=Object]*/ o) {
   o.field = 42;
-  o. /*update: [exact=Class]*/ field = 42;
+  o. /*update: [subclass=Object]*/ field = 42;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -56,10 +54,10 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: statementOrderInvocation:[null]*/
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 statementOrderInvocation(/*[null|subclass=Object]*/ o) {
   o.method(null);
-  o. /*invoke: [exact=Class]*/ method(null);
+  o. /*invoke: [subclass=Object]*/ method(null);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -67,11 +65,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: receiverVsArgument:[null]*/
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 receiverVsArgument(/*[null|subclass=Object]*/ o) {
   // TODO(johnniwinther): The arguments should refine the receiver.
   o.method(o.field);
-  o. /*[exact=Class]*/ field;
+  o. /*[subclass=Object]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -79,11 +77,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: argumentsOrder:[null]*/
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 argumentsOrder(/*[null|subclass=Object]*/ o) {
   // TODO(johnniwinther): The arguments should refine the receiver.
-  o.method(o.field, o. /*[exact=Class]*/ field);
-  o. /*[exact=Class]*/ field;
+  o.method(o.field, o. /*[subclass=Object]*/ field);
+  o. /*[subclass=Object]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -91,10 +89,10 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: operatorOrder:[null]*/
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 operatorOrder(/*[null|subclass=Object]*/ o) {
-  o.field /*invoke: [exact=JSUInt31]*/ < o. /*[exact=Class]*/ field;
-  o. /*[exact=Class]*/ field;
+  o.field /*invoke: [exact=JSUInt31]*/ < o. /*[subclass=Object]*/ field;
+  o. /*[subclass=Object]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -102,12 +100,12 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: updateVsRhs:[null]*/
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 updateVsRhs(/*[null|subclass=Object]*/ o) {
   // TODO(johnniwinther): The right-hand side should refine the left-hand side
   // receiver.
   o.field = o.field;
-  o. /*[exact=Class]*/ field;
+  o. /*[subclass=Object]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -115,10 +113,10 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: logicalOr:[null]*/
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 logicalOr(/*[null|subclass=Object]*/ o) {
-  o.field || o. /*[exact=Class]*/ field;
-  o. /*[exact=Class]*/ field;
+  o.field || o. /*[subclass=Object]*/ field;
+  o. /*[subclass=Object]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -126,10 +124,10 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: conditionalCondition:[null]*/
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 conditionalCondition(/*[null|subclass=Object]*/ o) {
-  o.field ? o. /*[exact=Class]*/ field : o. /*[exact=Class]*/ field;
-  o. /*[exact=Class]*/ field;
+  o.field ? o. /*[subclass=Object]*/ field : o. /*[subclass=Object]*/ field;
+  o. /*[subclass=Object]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -137,11 +135,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: conditionalBothBranches:[null]*/
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 conditionalBothBranches(/*[null|subclass=Object]*/ o) {
   // ignore: DEAD_CODE
   true ? o.field : o.field;
-  o. /*[exact=Class]*/ field;
+  o. /*[subclass=Object]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -149,10 +147,10 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: conditionalOneBranchOnly:[null]*/
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 conditionalOneBranchOnly(/*[null|subclass=Object]*/ o) {
   // ignore: DEAD_CODE
   true ? o.field : null;
   o.field;
-  o. /*[exact=Class]*/ field;
+  o. /*[subclass=Object]*/ field;
 }
diff --git a/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart b/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart
index 4d24402..b91c000 100644
--- a/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart
+++ b/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// ignore: import_internal_library
-import 'dart:_js_helper';
-
 main() {
   noThrows();
   noInline();
@@ -13,13 +10,14 @@
 
 // We trust the annotation.
 /*element: noThrows:no-throw*/
-@NoThrows()
-@NoInline() // Required for the @NoThrows() annotation.
+@pragma('dart2js:noThrows')
+@pragma(
+    'dart2js:noInline') // Required for the @pragma('dart2js:noThrows') annotation.
 noThrows() => throw '';
 
-// Check that the @NoInline() annotation has no impact on its own.
+// Check that the @pragma('dart2js:noInline') annotation has no impact on its own.
 /*element: noInline:*/
-@NoInline()
+@pragma('dart2js:noInline')
 noInline() {}
 
 // TODO(johnniwinther): Should we infer this?
diff --git a/tests/compiler/dart2js/inference/show.dart b/tests/compiler/dart2js/inference/show.dart
index d6ff3d4..725f6dc 100644
--- a/tests/compiler/dart2js/inference/show.dart
+++ b/tests/compiler/dart2js/inference/show.dart
@@ -18,7 +18,7 @@
   argParser.addFlag('callers', defaultsTo: false);
   ArgResults results = argParser.parse(args);
 
-  DataComputer dataComputer;
+  DataComputer<String> dataComputer;
   if (results['side-effects']) {
     dataComputer = const SideEffectsDataComputer();
   }
@@ -27,5 +27,6 @@
   } else {
     dataComputer = const TypeMaskDataComputer();
   }
-  await show(results, dataComputer, options: [/*stopAfterTypeInference*/]);
+  await show<String>(results, dataComputer,
+      options: [/*stopAfterTypeInference*/]);
 }
diff --git a/tests/compiler/dart2js/inference/side_effects/annotations.dart b/tests/compiler/dart2js/inference/side_effects/annotations.dart
index b8c9841..4337cf8 100644
--- a/tests/compiler/dart2js/inference/side_effects/annotations.dart
+++ b/tests/compiler/dart2js/inference/side_effects/annotations.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /// Static field used in tests below.
 var field;
 
@@ -13,11 +10,12 @@
 /*element: readStaticField:SideEffects(reads static; writes nothing)*/
 readStaticField() => field;
 
-/// Read a static field. If not for the `@NoSideEffects()` annotation this would
-/// add dependency of static properties to the side effects of the method.
+/// Read a static field. If not for the `@pragma('dart2js:noSideEffects')`
+/// annotation this would add dependency of static properties to the side
+/// effects of the method.
 /*element: readStaticFieldAnnotated:SideEffects(reads nothing; writes nothing)*/
-@NoInline()
-@NoSideEffects()
+@pragma('dart2js:noInline')
+@pragma('dart2js:noSideEffects')
 readStaticFieldAnnotated() => field;
 
 /*element: main:SideEffects(reads static; writes nothing)*/
diff --git a/tests/compiler/dart2js/inference/side_effects_test.dart b/tests/compiler/dart2js/inference/side_effects_test.dart
index 0e2e5cb..ec23f4e 100644
--- a/tests/compiler/dart2js/inference/side_effects_test.dart
+++ b/tests/compiler/dart2js/inference/side_effects_test.dart
@@ -32,8 +32,8 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
diff --git a/tests/compiler/dart2js/inlining/data/conditional.dart b/tests/compiler/dart2js/inlining/data/conditional.dart
index 2cb4977..c8aa00f 100644
--- a/tests/compiler/dart2js/inlining/data/conditional.dart
+++ b/tests/compiler/dart2js/inlining/data/conditional.dart
@@ -5,9 +5,6 @@
 // Tests for the heuristics on conditional expression whose condition is a
 // parameter for which the max, instead of the sum, of the branch sizes is used.
 
-// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   conditionalField();
@@ -32,7 +29,7 @@
 }
 
 /*element: conditionalField:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 conditionalField() {
   _field1 = false;
   _conditionalField();
@@ -56,7 +53,7 @@
 }
 
 /*element: conditionalParameter:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 conditionalParameter() {
   _conditionalParameter(true);
   _conditionalParameter(false);
diff --git a/tests/compiler/dart2js/inlining/data/constructor.dart b/tests/compiler/dart2js/inlining/data/constructor.dart
index d65c500..bdd20c6 100644
--- a/tests/compiler/dart2js/inlining/data/constructor.dart
+++ b/tests/compiler/dart2js/inlining/data/constructor.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   forceInlineConstructor();
@@ -19,12 +16,12 @@
 
 class Class1 {
   /*element: Class1.:[forceInlineConstructor:Class1]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   Class1();
 }
 
 /*element: forceInlineConstructor:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 forceInlineConstructor() {
   new Class1();
 }
@@ -35,14 +32,14 @@
 
 class Class2 {
   /*element: Class2.:[forceInlineConstructorBody+,forceInlineConstructorBody:Class2]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   Class2() {
     print('foo');
   }
 }
 
 /*element: forceInlineConstructorBody:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 forceInlineConstructorBody() {
   new Class2();
 }
@@ -53,12 +50,12 @@
 
 class Class3<T> {
   /*element: Class3.:[forceInlineGenericConstructor:Class3<int>]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   Class3();
 }
 
 /*element: forceInlineGenericConstructor:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 forceInlineGenericConstructor() {
   new Class3<int>();
 }
@@ -69,18 +66,18 @@
 
 class Class4a<T> implements Class4b<T> {
   /*element: Class4a.:[forceInlineGenericFactory:Class4a<int>]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   Class4a();
 }
 
 class Class4b<T> {
   /*element: Class4b.:[forceInlineGenericFactory:Class4b<int>]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   factory Class4b() => new Class4a<T>();
 }
 
 /*element: forceInlineGenericFactory:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 forceInlineGenericFactory() {
   new Class4b<int>();
 }
diff --git a/tests/compiler/dart2js/inlining/data/dynamic.dart b/tests/compiler/dart2js/inlining/data/dynamic.dart
index 99d6861..60bcb05 100644
--- a/tests/compiler/dart2js/inlining/data/dynamic.dart
+++ b/tests/compiler/dart2js/inlining/data/dynamic.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   forceInlineDynamic();
@@ -17,16 +14,16 @@
 
 class Class1 {
   /*element: Class1.:[]*/
-  @NoInline()
+  @pragma('dart2js:noInline')
   Class1();
 
   /*element: Class1.method:[forceInlineDynamic]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   method() {}
 }
 
 /*element: forceInlineDynamic:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 forceInlineDynamic() {
   new Class1().method();
 }
@@ -37,16 +34,16 @@
 
 class Class2 {
   /*element: Class2.:[]*/
-  @NoInline()
+  @pragma('dart2js:noInline')
   Class2();
 
   /*element: Class2.method:[forceInlineOptional]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   method([x]) {}
 }
 
 /*element: forceInlineOptional:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 forceInlineOptional() {
   new Class2().method();
 }
diff --git a/tests/compiler/dart2js/inlining/data/external.dart b/tests/compiler/dart2js/inlining/data/external.dart
index 9204a33..2680f31 100644
--- a/tests/compiler/dart2js/inlining/data/external.dart
+++ b/tests/compiler/dart2js/inlining/data/external.dart
@@ -2,16 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   externalFunction();
 }
 
 /*element: externalFunction:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 externalFunction() {
   _externalFunction();
 }
diff --git a/tests/compiler/dart2js/inlining/data/force_inline.dart b/tests/compiler/dart2js/inlining/data/force_inline.dart
index 3932fa2..c7e0cf0 100644
--- a/tests/compiler/dart2js/inlining/data/force_inline.dart
+++ b/tests/compiler/dart2js/inlining/data/force_inline.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   forceInlineOnce();
@@ -19,11 +16,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: _forceInlineOnce:[forceInlineOnce]*/
-@ForceInline()
+@pragma('dart2js:tryInline')
 _forceInlineOnce() {}
 
 /*element: forceInlineOnce:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 forceInlineOnce() {
   _forceInlineOnce();
 }
@@ -33,17 +30,17 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: _forceInlineTwice:[forceInlineTwice1,forceInlineTwice2]*/
-@ForceInline()
+@pragma('dart2js:tryInline')
 _forceInlineTwice() {}
 
 /*element: forceInlineTwice1:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 forceInlineTwice1() {
   _forceInlineTwice();
 }
 
 /*element: forceInlineTwice2:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 forceInlineTwice2() {
   _forceInlineTwice();
 }
@@ -53,17 +50,17 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: _forceInlineNested1:[forceInlineNested]*/
-@ForceInline()
+@pragma('dart2js:tryInline')
 _forceInlineNested1() {}
 
 /*element: _forceInlineNested2:[forceInlineNested]*/
-@ForceInline()
+@pragma('dart2js:tryInline')
 _forceInlineNested2() {
   _forceInlineNested1();
 }
 
 /*element: forceInlineNested:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 forceInlineNested() {
   _forceInlineNested2();
 }
@@ -73,11 +70,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: _forceInlineOptional:[forceInlineOptional]*/
-@ForceInline()
+@pragma('dart2js:tryInline')
 _forceInlineOptional([x]) {}
 
 /*element: forceInlineOptional:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 forceInlineOptional() {
   _forceInlineOptional();
 }
diff --git a/tests/compiler/dart2js/inlining/data/force_inline_loops.dart b/tests/compiler/dart2js/inlining/data/force_inline_loops.dart
index b2f73fe..7927b0e 100644
--- a/tests/compiler/dart2js/inlining/data/force_inline_loops.dart
+++ b/tests/compiler/dart2js/inlining/data/force_inline_loops.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   forceInlineLoops();
@@ -14,7 +11,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: _forLoop:loop,[forceInlineLoops]*/
-@ForceInline()
+@pragma('dart2js:tryInline')
 _forLoop() {
   for (int i = 0; i < 10; i++) {
     print(i);
@@ -22,7 +19,7 @@
 }
 
 /*element: _forInLoop:loop,[forceInlineLoops]*/
-@ForceInline()
+@pragma('dart2js:tryInline')
 _forInLoop() {
   for (var e in [0, 1, 2]) {
     print(e);
@@ -30,7 +27,7 @@
 }
 
 /*element: _whileLoop:loop,[forceInlineLoops]*/
-@ForceInline()
+@pragma('dart2js:tryInline')
 _whileLoop() {
   int i = 0;
   while (i < 10) {
@@ -40,7 +37,7 @@
 }
 
 /*element: _doLoop:loop,[forceInlineLoops]*/
-@ForceInline()
+@pragma('dart2js:tryInline')
 _doLoop() {
   int i = 0;
   do {
@@ -50,7 +47,7 @@
 }
 
 /*element: _hardLoop:loop,(allowLoops)code after return*/
-@ForceInline()
+@pragma('dart2js:tryInline')
 _hardLoop() {
   for (int i = 0; i < 10; i++) {
     if (i % 2 == 0) return 2;
@@ -60,7 +57,7 @@
 }
 
 /*element: forceInlineLoops:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 forceInlineLoops() {
   _forLoop();
   _forInLoop();
diff --git a/tests/compiler/dart2js/inlining/data/heuristics.dart b/tests/compiler/dart2js/inlining/data/heuristics.dart
index 6433d50..cd0bae7 100644
--- a/tests/compiler/dart2js/inlining/data/heuristics.dart
+++ b/tests/compiler/dart2js/inlining/data/heuristics.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   outsideLoopNoArgsCalledOnce();
@@ -36,7 +33,7 @@
 }
 
 /*element: outsideLoopNoArgsCalledOnce:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 outsideLoopNoArgsCalledOnce() {
   _outsideLoopNoArgsCalledOnce();
 }
@@ -68,7 +65,7 @@
 }
 
 /*element: outsideLoopNoArgsCalledTwice:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 outsideLoopNoArgsCalledTwice() {
   _outsideLoopNoArgs1();
   _outsideLoopNoArgs1();
@@ -106,7 +103,7 @@
 }
 
 /*element: outsideLoopOneArgCalledOnce:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 outsideLoopOneArgCalledOnce() {
   _outsideLoopOneArgCalledOnce(0);
 }
@@ -142,7 +139,7 @@
 }
 
 /*element: outsideLoopOneArgCalledTwice:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 outsideLoopOneArgCalledTwice() {
   _outsideLoopOneArg1(0);
   _outsideLoopOneArg1(0);
@@ -174,7 +171,7 @@
 }
 
 /*element: insideLoopNoArgsCalledOnce:loop*/
-@NoInline()
+@pragma('dart2js:noInline')
 insideLoopNoArgsCalledOnce() {
   // ignore: UNUSED_LOCAL_VARIABLE
   for (var e in [1, 2, 3, 4]) {
@@ -223,7 +220,7 @@
 }
 
 /*element: insideLoopNoArgsCalledTwice:loop*/
-@NoInline()
+@pragma('dart2js:noInline')
 insideLoopNoArgsCalledTwice() {
   // ignore: UNUSED_LOCAL_VARIABLE
   for (var e in [1, 2, 3, 4]) {
@@ -264,7 +261,7 @@
 }
 
 /*element: insideLoopOneArgCalledOnce:loop*/
-@NoInline()
+@pragma('dart2js:noInline')
 insideLoopOneArgCalledOnce() {
   for (var e in [1, 2, 3, 4]) {
     _insideLoopOneArgCalledOnce(e);
@@ -314,7 +311,7 @@
 }
 
 /*element: insideLoopOneArgCalledTwice:loop*/
-@NoInline()
+@pragma('dart2js:noInline')
 insideLoopOneArgCalledTwice() {
   for (var e in [1, 2, 3, 4]) {
     _insideLoopOneArg1(e);
diff --git a/tests/compiler/dart2js/inlining/data/map.dart b/tests/compiler/dart2js/inlining/data/map.dart
index 8206a6b..1d4589e 100644
--- a/tests/compiler/dart2js/inlining/data/map.dart
+++ b/tests/compiler/dart2js/inlining/data/map.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   passMapToNull();
@@ -16,7 +13,7 @@
 }
 
 /*element: passMapToNull:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 passMapToNull() {
   _passMapToNull(null);
 }
diff --git a/tests/compiler/dart2js/inlining/data/meta.dart b/tests/compiler/dart2js/inlining/data/meta.dart
index 7c445de..6dc7f22 100644
--- a/tests/compiler/dart2js/inlining/data/meta.dart
+++ b/tests/compiler/dart2js/inlining/data/meta.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*element: main:[]*/
 main() {
   tryInlineOnce();
@@ -16,11 +14,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: _tryInlineOnce:[tryInlineOnce]*/
-@tryInline
+@pragma('dart2js:tryInline')
 _tryInlineOnce() {}
 
 /*element: tryInlineOnce:[]*/
-@noInline
+@pragma('dart2js:noInline')
 tryInlineOnce() {
   _tryInlineOnce();
 }
@@ -30,17 +28,17 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: _tryInlineTwice:[tryInlineTwice1,tryInlineTwice2]*/
-@tryInline
+@pragma('dart2js:tryInline')
 _tryInlineTwice() {}
 
 /*element: tryInlineTwice1:[]*/
-@noInline
+@pragma('dart2js:noInline')
 tryInlineTwice1() {
   _tryInlineTwice();
 }
 
 /*element: tryInlineTwice2:[]*/
-@noInline
+@pragma('dart2js:noInline')
 tryInlineTwice2() {
   _tryInlineTwice();
 }
diff --git a/tests/compiler/dart2js/inlining/data/native.dart b/tests/compiler/dart2js/inlining/data/native.dart
index 1c907e1..6492328 100644
--- a/tests/compiler/dart2js/inlining/data/native.dart
+++ b/tests/compiler/dart2js/inlining/data/native.dart
@@ -4,9 +4,6 @@
 
 import 'dart:html';
 
-/// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   document.createElement(CustomElement.tag);
@@ -22,13 +19,13 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: newCustom:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 newCustom() {
   new CustomElement();
 }
 
 /*element: newCustomCreated:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 newCustomCreated() {
   new CustomElement.created();
 }
@@ -51,13 +48,13 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: newNormal:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 newNormal() {
   new NormalElement();
 }
 
 /*element: newNormalCreated:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 newNormalCreated() {
   new NormalElement.created();
 }
diff --git a/tests/compiler/dart2js/inlining/data/nested.dart b/tests/compiler/dart2js/inlining/data/nested.dart
index 6357ede..e85ab5c 100644
--- a/tests/compiler/dart2js/inlining/data/nested.dart
+++ b/tests/compiler/dart2js/inlining/data/nested.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   nestedGenericInlining();
@@ -17,11 +14,11 @@
 
 class Class1<T> {
   /*element: Class1.:[nestedGenericInlining:Class1<int>]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   Class1();
 
   /*element: Class1.method:[nestedGenericInlining]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   method() {
     new Class2<List<T>>().method();
   }
@@ -31,16 +28,16 @@
   // TODO(johnniwinther): Should the type have been Class<List<int>>?
   // Similarly below.
   /*element: Class2.:[nestedGenericInlining:Class2<List<Class1.T>>]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   Class2();
 
   /*element: Class2.method:[nestedGenericInlining]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   method() {}
 }
 
 /*element: nestedGenericInlining:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 nestedGenericInlining() {
   new Class1<int>().method();
 }
@@ -51,11 +48,11 @@
 
 class Class3a<T> implements Class3b<T> {
   /*element: Class3a.:[nestedGenericFactoryInlining:Class3a<int>]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   Class3a();
 
   /*element: Class3a.method:[nestedGenericFactoryInlining]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   method() {
     new Class4b<List<T>>().method();
   }
@@ -63,7 +60,7 @@
 
 abstract class Class3b<T> {
   /*element: Class3b.:[nestedGenericFactoryInlining:Class3b<int>]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   factory Class3b() => new Class3a<T>();
 
   method();
@@ -71,24 +68,24 @@
 
 class Class4a<T> implements Class4b<T> {
   /*element: Class4a.:[nestedGenericFactoryInlining:Class4a<Class4b.T>]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   Class4a();
 
   /*element: Class4a.method:[nestedGenericFactoryInlining]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   method() {}
 }
 
 abstract class Class4b<T> {
   /*element: Class4b.:[nestedGenericFactoryInlining:Class4b<List<Class3a.T>>]*/
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   factory Class4b() => new Class4a<T>();
 
   method();
 }
 
 /*element: nestedGenericFactoryInlining:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 nestedGenericFactoryInlining() {
   new Class3b<int>().method();
 }
diff --git a/tests/compiler/dart2js/inlining/data/setter.dart b/tests/compiler/dart2js/inlining/data/setter.dart
index 50f6ec9..346568f 100644
--- a/tests/compiler/dart2js/inlining/data/setter.dart
+++ b/tests/compiler/dart2js/inlining/data/setter.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   inlineSetter();
@@ -13,7 +10,7 @@
 class Class1 {
   var field;
 /*element: Class1.:[]*/
-  @NoInline()
+  @pragma('dart2js:noInline')
   Class1();
   /*element: Class1.setter=:[inlineSetter]*/
   set setter(value) {
@@ -22,7 +19,7 @@
 }
 
 /*element: inlineSetter:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 inlineSetter() {
   Class1 c = new Class1();
   c.setter = 42;
diff --git a/tests/compiler/dart2js/inlining/data/switch.dart b/tests/compiler/dart2js/inlining/data/switch.dart
index 09577d7..cf9d938 100644
--- a/tests/compiler/dart2js/inlining/data/switch.dart
+++ b/tests/compiler/dart2js/inlining/data/switch.dart
@@ -2,16 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   switchThrowing();
 }
 
 /*element: switchThrowing:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 switchThrowing() {
   switch (0) {
     case 0:
diff --git a/tests/compiler/dart2js/inlining/data/too_difficult.dart b/tests/compiler/dart2js/inlining/data/too_difficult.dart
index 446f66d..4a0b262 100644
--- a/tests/compiler/dart2js/inlining/data/too_difficult.dart
+++ b/tests/compiler/dart2js/inlining/data/too_difficult.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   asyncMethod();
@@ -39,7 +36,7 @@
 }
 
 /*element: multipleReturns:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 multipleReturns() {
   _multipleReturns(true);
   _multipleReturns(false);
@@ -52,7 +49,7 @@
 }
 
 /*element: codeAfterReturn:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 codeAfterReturn() {
   _codeAfterReturn(true);
   _codeAfterReturn(false);
@@ -67,7 +64,7 @@
 }
 
 /*element: multipleThrows:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 multipleThrows() {
   _multipleThrows(true);
   _multipleThrows(false);
@@ -82,7 +79,7 @@
 }
 
 /*element: returnAndThrow:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 returnAndThrow() {
   _returnAndThrow(true);
   _returnAndThrow(false);
@@ -177,7 +174,7 @@
 }
 
 /*element: closureInInitializer:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 closureInInitializer() {
   new Class1();
 }
diff --git a/tests/compiler/dart2js/inlining/data/type_variables.dart b/tests/compiler/dart2js/inlining/data/type_variables.dart
index 8c9366d..4641443 100644
--- a/tests/compiler/dart2js/inlining/data/type_variables.dart
+++ b/tests/compiler/dart2js/inlining/data/type_variables.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// ignore: IMPORT_INTERNAL_LIBRARY
-import 'dart:_js_helper';
-
 /*element: main:[]*/
 main() {
   inlineTypeTests();
@@ -22,7 +19,7 @@
 _inlineTypeTests(o) => o.field is dynamic Function(int);
 
 /*element: inlineTypeTests:[]*/
-@NoInline()
+@pragma('dart2js:noInline')
 void inlineTypeTests() {
   _inlineTypeTests(new Mixin1<int>());
   _inlineTypeTests(new Class1<int>());
diff --git a/tests/compiler/dart2js/inlining/meta_annotations2_test.dart b/tests/compiler/dart2js/inlining/meta_annotations2_test.dart
index 27e0277..d809601 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations2_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations2_test.dart
@@ -7,6 +7,7 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/commandline_options.dart';
 import '../helpers/memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
@@ -17,6 +18,7 @@
         foo(y) => 49912344 + y;
 
         class A {
+          @pragma('dart2js:noElision')
           var field;
 
           @noInline
@@ -41,7 +43,9 @@
   runTests() async {
     OutputCollector collector = new OutputCollector();
     await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        outputProvider: collector,
+        options: [Flags.testMode]);
     // Simply check that the constants of the small functions are still in the
     // output, and that we don't see the result of constant folding.
     String jsOutput = collector.getOutput('', OutputType.js);
diff --git a/tests/compiler/dart2js/inlining/meta_annotations_test.dart b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
index 8904107..8711d00 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
@@ -50,11 +50,11 @@
       Expect.equals(
           expectNoInline,
           closedWorld.annotationsData.hasNoInline(method),
-          "Unexpected annotation of @noInline on '$method'.");
+          "Unexpected annotation of @pragma('dart2js:noInline') on '$method'.");
       Expect.equals(
           expectTryInline,
           closedWorld.annotationsData.hasTryInline(method),
-          "Unexpected annotation of @tryInline on '$method'.");
+          "Unexpected annotation of @pragma('dart2js:tryInline') on '$method'.");
     }
 
     test('method');
diff --git a/tests/compiler/dart2js/member_usage/data/constructors.dart b/tests/compiler/dart2js/member_usage/data/constructors.dart
index fe9889d..c53d93c 100644
--- a/tests/compiler/dart2js/member_usage/data/constructors.dart
+++ b/tests/compiler/dart2js/member_usage/data/constructors.dart
@@ -59,6 +59,14 @@
 
   /*element: Class.constructor7c:invoke=(1,c)*/
   Class.constructor7c(a, {b, c}) {}
+
+  /*element: Class.constructor8a:invoke=(0)*/
+  @pragma('dart2js:noElision')
+  Class.constructor8a([a, b]) {}
+
+  /*element: Class.constructor8b:invoke=(0)*/
+  @pragma('dart2js:noElision')
+  Class.constructor8b({a, b}) {}
 }
 
 /*element: main:invoke*/
@@ -92,4 +100,7 @@
   new Class.constructor7a(null);
   new Class.constructor7b(null, b: null);
   new Class.constructor7c(null, c: null);
+
+  new Class.constructor8a();
+  new Class.constructor8b();
 }
diff --git a/tests/compiler/dart2js/member_usage/data/instance_method_parameters.dart b/tests/compiler/dart2js/member_usage/data/instance_method_parameters.dart
index 28754c5..44aa24e 100644
--- a/tests/compiler/dart2js/member_usage/data/instance_method_parameters.dart
+++ b/tests/compiler/dart2js/member_usage/data/instance_method_parameters.dart
@@ -85,6 +85,14 @@
   /*element: Class.method8d:invoke,read*/
   method8d(a, {b, c}) {}
 
+  /*element: Class.method9a:invoke=(0)*/
+  @pragma('dart2js:noElision')
+  method9a([a, b]) {}
+
+  /*element: Class.method9b:invoke=(0)*/
+  @pragma('dart2js:noElision')
+  method9b({a, b}) {}
+
   /*element: Class.test:invoke*/
   test() {
     method1();
@@ -125,6 +133,9 @@
     method8b(null, b: null);
     method8c(null, c: null);
     method8d;
+
+    method9a();
+    method9b();
   }
 }
 
diff --git a/tests/compiler/dart2js/member_usage/data/static_method_parameters.dart b/tests/compiler/dart2js/member_usage/data/static_method_parameters.dart
index bb133a2..936c819 100644
--- a/tests/compiler/dart2js/member_usage/data/static_method_parameters.dart
+++ b/tests/compiler/dart2js/member_usage/data/static_method_parameters.dart
@@ -83,6 +83,14 @@
 /*element: method8d:invoke,read*/
 method8d(a, {b, c}) {}
 
+/*element: method9a:invoke=(0)*/
+@pragma('dart2js:noElision')
+method9a([a, b]) {}
+
+/*element: method9b:invoke=(0)*/
+@pragma('dart2js:noElision')
+method9b({a, b}) {}
+
 /*element: main:invoke*/
 main() {
   method1();
@@ -123,4 +131,7 @@
   method8b(null, b: null);
   method8c(null, c: null);
   method8d;
+
+  method9a();
+  method9b();
 }
diff --git a/tests/compiler/dart2js/model/cfe_annotations_test.dart b/tests/compiler/dart2js/model/cfe_annotations_test.dart
new file mode 100644
index 0000000..b6eed0b
--- /dev/null
+++ b/tests/compiler/dart2js/model/cfe_annotations_test.dart
@@ -0,0 +1,267 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:args/args.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/ir/annotations.dart';
+import 'package:compiler/src/js_backend/native_data.dart';
+import 'package:compiler/src/kernel/kernel_strategy.dart';
+import 'package:compiler/src/kernel/element_map_impl.dart';
+import 'package:expect/expect.dart';
+import 'package:kernel/ast.dart' as ir;
+
+import '../helpers/args_helper.dart';
+import '../helpers/memory_compiler.dart';
+
+const String pathPrefix = 'sdk/tests/compiler/dart2js_native/';
+
+const Map<String, String> source = {
+  '$pathPrefix/main.dart': '''
+
+library lib;
+
+import 'jslib1.dart';
+import 'jslib2.dart';
+import 'nativelib.dart';
+
+main() {
+}
+''',
+  '$pathPrefix/jslib1.dart': '''
+
+@JS('lib1')
+library lib1;
+
+import 'package:js/js.dart';
+
+@JS('JsInteropClass1')
+class Class1 {
+  @JS('jsInteropMethod1')
+  external method1();
+  
+  external method2();
+}
+
+''',
+  '$pathPrefix/jslib2.dart': '''
+
+@JS()
+library lib2;
+
+import 'package:js/js.dart';
+
+@JS()
+@anonymous
+class Class2 {
+}
+
+@JS('jsInteropMethod3')
+external method3();
+''',
+  '$pathPrefix/nativelib.dart': '''
+import 'dart:_js_helper';
+
+@Native('NativeClass1')
+class Class1 {
+}
+
+@Native('NativeClass2,!nonleaf')
+class Class2 {
+}
+
+@Native('NativeClass3a,NativeClass3b')
+class Class3 {
+}
+
+
+''',
+};
+
+const Map<String, String> expectedNativeClassNames = {
+  '$pathPrefix/nativelib.dart::Class1': 'NativeClass1',
+  '$pathPrefix/nativelib.dart::Class2': 'NativeClass2,!nonleaf',
+  '$pathPrefix/nativelib.dart::Class3': 'NativeClass3a,NativeClass3b',
+};
+
+const Map<String, String> expectedJsInteropLibraryNames = {
+  '$pathPrefix/jslib1.dart': 'lib1',
+  '$pathPrefix/jslib2.dart': '',
+};
+
+const Map<String, String> expectedJsInteropClassNames = {
+  '$pathPrefix/jslib1.dart::Class1': 'JsInteropClass1',
+  '$pathPrefix/jslib2.dart::Class2': '',
+};
+
+const Map<String, String> expectedJsInteropMemberNames = {
+  '$pathPrefix/jslib1.dart::Class1::method1': 'jsInteropMethod1',
+  '$pathPrefix/jslib2.dart::method3': 'jsInteropMethod3',
+};
+
+const Set<String> expectedAnonymousJsInteropClasses = {
+  '$pathPrefix/jslib2.dart::Class2',
+};
+
+main(List<String> args) {
+  ArgParser argParser = createArgParser();
+
+  asyncTest(() async {
+    ArgResults argResults = argParser.parse(args);
+    Uri librariesSpecificationUri = getLibrariesSpec(argResults);
+    Uri packageConfig = getPackages(argResults);
+    List<String> options = getOptions(argResults);
+
+    runTest({bool useIr}) async {
+      CompilationResult result = await runCompiler(
+          entryPoint: Uri.parse('memory:$pathPrefix/main.dart'),
+          memorySourceFiles: source,
+          packageConfig: packageConfig,
+          librariesSpecificationUri: librariesSpecificationUri,
+          options: (useIr
+              ? ['${Flags.enableLanguageExperiments}=constant-update-2018']
+              : [])
+            ..addAll(options));
+      Expect.isTrue(result.isSuccess);
+      Compiler compiler = result.compiler;
+      KernelFrontEndStrategy frontendStrategy = compiler.frontendStrategy;
+      KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+      NativeData nativeData =
+          compiler.resolutionWorldBuilder.closedWorldForTesting.nativeData;
+      ir.Component component = elementMap.env.mainComponent;
+      IrAnnotationData annotationData;
+      if (useIr) {
+        annotationData = processAnnotations(component);
+      }
+
+      void testMember(String idPrefix, ir.Member member,
+          {bool implicitJsInteropMember}) {
+        String memberId = '$idPrefix::${member.name.name}';
+        MemberEntity memberEntity = elementMap.getMember(member);
+
+        String expectedJsInteropMemberName =
+            expectedJsInteropMemberNames[memberId];
+        if (useIr) {
+          Expect.equals(
+              expectedJsInteropMemberName,
+              annotationData.getJsInteropMemberName(member),
+              "Unexpected js interop member name from IR for $member");
+        }
+        bool isJsInteropMember =
+            (implicitJsInteropMember && member.isExternal) ||
+                expectedJsInteropMemberName != null;
+        Expect.equals(
+            isJsInteropMember,
+            nativeData.isJsInteropMember(memberEntity),
+            "Unexpected js interop member result from native data for $member");
+        Expect.equals(
+            isJsInteropMember
+                ? expectedJsInteropMemberName ?? memberEntity.name
+                : null,
+            nativeData.getJsInteropMemberName(memberEntity),
+            "Unexpected js interop member name from native data for $member");
+      }
+
+      for (ir.Library library in component.libraries) {
+        if (library.importUri.scheme == 'memory') {
+          String libraryId = library.importUri.path;
+          LibraryEntity libraryEntity = elementMap.getLibrary(library);
+
+          String expectedJsInteropLibraryName =
+              expectedJsInteropLibraryNames[libraryId];
+          if (useIr) {
+            Expect.equals(
+                expectedJsInteropLibraryName,
+                annotationData.getJsInteropLibraryName(library),
+                "Unexpected js library name from IR for $library");
+          }
+          Expect.equals(
+              expectedJsInteropLibraryName != null,
+              nativeData.isJsInteropLibrary(libraryEntity),
+              "Unexpected js library result from native data for $library");
+          Expect.equals(
+              expectedJsInteropLibraryName,
+              nativeData.getJsInteropLibraryName(libraryEntity),
+              "Unexpected js library name from native data for $library");
+
+          for (ir.Class cls in library.classes) {
+            String clsId = '$libraryId::${cls.name}';
+            ClassEntity classEntity = elementMap.getClass(cls);
+
+            String expectedNativeClassName = expectedNativeClassNames[clsId];
+            if (useIr) {
+              Expect.equals(
+                  expectedNativeClassName,
+                  annotationData.getNativeClassName(cls),
+                  "Unexpected native class name from IR for $cls");
+            }
+            bool isNativeClass = nativeData.isNativeClass(classEntity) &&
+                !nativeData.isJsInteropClass(classEntity);
+            String nativeDataClassName;
+            if (isNativeClass) {
+              nativeDataClassName =
+                  nativeData.getNativeTagsOfClass(classEntity).join(',');
+              if (nativeData.hasNativeTagsForcedNonLeaf(classEntity)) {
+                nativeDataClassName += ',!nonleaf';
+              }
+            }
+            Expect.equals(expectedNativeClassName != null, isNativeClass,
+                "Unexpected native class result from native data for $cls");
+
+            Expect.equals(expectedNativeClassName, nativeDataClassName,
+                "Unexpected native class name from native data for $cls");
+
+            String expectedJsInteropClassName =
+                expectedJsInteropClassNames[clsId];
+            if (useIr) {
+              Expect.equals(
+                  expectedJsInteropClassName,
+                  annotationData.getJsInteropClassName(cls),
+                  "Unexpected js class name from IR for $cls");
+            }
+            Expect.equals(
+                expectedJsInteropClassName != null,
+                nativeData.isJsInteropClass(classEntity),
+                "Unexpected js class result from native data for $cls");
+            Expect.equals(
+                expectedJsInteropClassName,
+                nativeData.getJsInteropClassName(classEntity),
+                "Unexpected js class name from native data for $cls");
+
+            bool expectedAnonymousJsInteropClass =
+                expectedAnonymousJsInteropClasses.contains(clsId);
+            if (useIr) {
+              Expect.equals(
+                  expectedAnonymousJsInteropClass,
+                  annotationData.isAnonymousJsInteropClass(cls),
+                  "Unexpected js anonymous class result from IR for $cls");
+            }
+            Expect.equals(
+                expectedAnonymousJsInteropClass,
+                nativeData.isAnonymousJsInteropClass(classEntity),
+                "Unexpected js anonymousclass result from native data for "
+                "$cls");
+
+            for (ir.Member member in cls.members) {
+              testMember(clsId, member,
+                  implicitJsInteropMember:
+                      nativeData.isJsInteropClass(classEntity));
+            }
+          }
+          for (ir.Member member in library.members) {
+            testMember(libraryId, member, implicitJsInteropMember: false);
+          }
+        }
+      }
+    }
+
+    print('test annotations from IR');
+    await runTest(useIr: true);
+
+    print('test annotations from K-model');
+    await runTest(useIr: false);
+  });
+}
diff --git a/tests/compiler/dart2js/model/cfe_constant_test.dart b/tests/compiler/dart2js/model/cfe_constant_test.dart
new file mode 100644
index 0000000..1a7dd18
--- /dev/null
+++ b/tests/compiler/dart2js/model/cfe_constant_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:args/args.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+
+import '../helpers/args_helper.dart';
+import '../helpers/memory_compiler.dart';
+
+main(List<String> args) {
+  ArgParser argParser = createArgParser();
+
+  asyncTest(() async {
+    ArgResults argResults = argParser.parse(args);
+    Uri entryPoint = getEntryPoint(argResults) ??
+        Uri.base.resolve('samples-dev/swarm/swarm.dart');
+    Uri librariesSpecificationUri = getLibrariesSpec(argResults);
+    Uri packageConfig = getPackages(argResults);
+    List<String> options = getOptions(argResults);
+    await runCompiler(
+        entryPoint: entryPoint,
+        packageConfig: packageConfig,
+        librariesSpecificationUri: librariesSpecificationUri,
+        options: ['${Flags.enableLanguageExperiments}=constant-update-2018']
+          ..addAll(options));
+  });
+}
diff --git a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
index c35cadf..c5c9d5b 100644
--- a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
@@ -14,7 +14,6 @@
 import 'package:compiler/src/constants/evaluation.dart';
 import 'package:compiler/src/constants/expressions.dart';
 import 'package:compiler/src/constants/values.dart';
-import 'package:compiler/src/constant_system_dart.dart';
 import 'package:compiler/src/diagnostics/messages.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
@@ -67,8 +66,6 @@
 
   bool get checkCasts => true;
 
-  bool get immediateUnderSetLiteral => _environment.immediateUnderSetLiteral;
-
   @override
   String readFromEnvironment(String name) => env[name];
 
@@ -146,7 +143,7 @@
     const ConstantData('false', 'BoolConstant(false)'),
     const ConstantData('true', 'BoolConstant(true)'),
     const ConstantData('0', 'IntConstant(0)'),
-    const ConstantData('0.0', 'DoubleConstant(0.0)'),
+    const ConstantData('0.0', 'IntConstant(0)'),
     const ConstantData('"foo"', 'StringConstant("foo")'),
     const ConstantData('1 + 2', 'IntConstant(3)'),
     const ConstantData('-(1)', 'IntConstant(-1)'),
@@ -632,8 +629,7 @@
         expectedResults.forEach((Map<String, String> env, String expectedText) {
           MemoryEnvironment environment =
               new MemoryEnvironment(getEnvironment(compiler, field), env);
-          ConstantValue value =
-              constant.evaluate(environment, DART_CONSTANT_SYSTEM);
+          ConstantValue value = constant.evaluate(environment);
 
           Expect.isNotNull(
               value,
diff --git a/tests/compiler/dart2js/optimization/data/arithmetic_simplification.dart b/tests/compiler/dart2js/optimization/data/arithmetic_simplification.dart
index c479a96..6d5ccef 100644
--- a/tests/compiler/dart2js/optimization/data/arithmetic_simplification.dart
+++ b/tests/compiler/dart2js/optimization/data/arithmetic_simplification.dart
@@ -4,9 +4,7 @@
 
 // Test constant folding on numbers.
 
-import 'package:expect/expect.dart';
-
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 @pragma('dart2js:noInline')
 int confuse(int x) => x;
 
diff --git a/tests/compiler/dart2js/optimization/data/effectively_constant_fields.dart b/tests/compiler/dart2js/optimization/data/effectively_constant_fields.dart
new file mode 100644
index 0000000..70578fc
--- /dev/null
+++ b/tests/compiler/dart2js/optimization/data/effectively_constant_fields.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class Class1 {
+  var field1 = 0;
+
+  @pragma('dart2js:noElision')
+  var field2 = 0;
+
+  var field3 = 0;
+}
+
+/*element: method1:
+ ConstantFieldGet=[name=Class1.field1&value=IntConstant(0)],
+ FieldGet=[]
+*/
+@pragma('dart2js:noInline')
+method1(Class1 c) {
+  return c.field1;
+}
+
+/*element: method2:FieldGet=[name=Class1.field2]*/
+@pragma('dart2js:noInline')
+method2(Class1 c) {
+  return c.field2;
+}
+
+class Class2 {
+  var field3 = 0;
+}
+
+@pragma('dart2js:noInline')
+method3(c) {
+  return c.field3;
+}
+
+int _field4() => 0;
+
+class Class3 {
+  int Function() field4 = _field4;
+}
+
+/*element: method4:
+ ConstantFieldCall=[name=Class3.field4&value=FunctionConstant(_field4)],
+ FieldCall=[]
+*/
+@pragma('dart2js:noInline')
+method4(Class3 c) {
+  return c.field4();
+}
+
+/*element: method6:
+ ConstantFieldGet=[name=Class1.field1&value=IntConstant(0)],
+ FieldGet=[name=<null-guard>]
+*/
+@pragma('dart2js:noInline')
+method6(Class1 c) {
+  return c.field1;
+}
+
+/*element: method7:
+ ConstantFieldCall=[name=Class3.field4&value=FunctionConstant(_field4)],
+ FieldCall=[name=<null-guard>]
+*/
+@pragma('dart2js:noInline')
+method7(Class3 c) {
+  return c.field4();
+}
+
+main() {
+  Expect.equals(0, method1(new Class1()));
+  Expect.equals(0, method2(new Class1()));
+  Expect.equals(0, method3(new Class1()));
+  Expect.equals(0, method3(new Class2()));
+  Expect.equals(0, method4(new Class3()));
+  Expect.equals(0, method6(new Class1()));
+  Expect.throws(() => method6(null));
+  Expect.equals(4, method7(new Class3()));
+  Expect.throws(() => method7(null));
+}
diff --git a/tests/compiler/dart2js/optimization/data/field_get.dart b/tests/compiler/dart2js/optimization/data/field_get.dart
index 349edca..e9101e5 100644
--- a/tests/compiler/dart2js/optimization/data/field_get.dart
+++ b/tests/compiler/dart2js/optimization/data/field_get.dart
@@ -10,9 +10,11 @@
   method3(new Class3b());
   method4(new Class4a());
   method4(new Class4b());
+  method5(new Class5a());
 }
 
 class Class1a {
+  @pragma('dart2js:noElision')
   int field1;
 }
 
@@ -23,6 +25,7 @@
 }
 
 class Class2a {
+  @pragma('dart2js:noElision')
   int field2;
 }
 
@@ -60,3 +63,14 @@
 method4(Class4a c) {
   return c.field4;
 }
+
+class Class5a {
+  @pragma('dart2js:noElision')
+  int Function() field5;
+}
+
+/*element: method5:FieldCall=[name=Class5a.field5]*/
+@pragma('dart2js:noInline')
+method5(Class5a c) {
+  return c.field5();
+}
diff --git a/tests/compiler/dart2js/rti/data/call_typed.dart b/tests/compiler/dart2js/rti/data/call_typed.dart
index 9731508..7de1bdc 100644
--- a/tests/compiler/dart2js/rti/data/call_typed.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed.dart
@@ -3,13 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 class A {
   call(int i) {}
 }
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is Function(int);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic.dart b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
index f7f5de4..972f65f 100644
--- a/tests/compiler/dart2js/rti/data/call_typed_generic.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
 /*omit.class: A:*/
@@ -13,7 +12,7 @@
   call(T t) {}
 }
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is Function(int);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart b/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
index 1e461ee..ec6a531 100644
--- a/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
+++ b/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
@@ -2,18 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 /*omit.class: A:*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   m() {
     return /**/ (T t, String s) {};
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is void Function(int);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/closure_unneeded.dart b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
index 1e461ee..ec6a531 100644
--- a/tests/compiler/dart2js/rti/data/closure_unneeded.dart
+++ b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
@@ -2,18 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 /*omit.class: A:*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   m() {
     return /**/ (T t, String s) {};
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is void Function(int);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/generic_class_is.dart b/tests/compiler/dart2js/rti/data/generic_class_is.dart
index acfcaac..fce7f39 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_is.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_is.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:implicit=[A]*/
 class A {}
 
 /*class: B:direct,explicit=[B.T],needsArgs*/
 class B<T> {
-  @noInline
+  @pragma('dart2js:noInline')
   method(T t) => t is T;
 }
 
diff --git a/tests/compiler/dart2js/rti/data/generic_class_is2.dart b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
index 8f6cc6c..7c15011 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_is2.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 /*class: A:implicit=[List<A<C2>>,List<A<C>>]*/
 class A<T> {}
@@ -14,7 +13,7 @@
 
 /*class: B:direct,explicit=[B.T],needsArgs*/
 class B<T> {
-  @noInline
+  @pragma('dart2js:noInline')
   method(var t) => t is T;
 }
 
diff --git a/tests/compiler/dart2js/rti/data/generic_instanceof4.dart b/tests/compiler/dart2js/rti/data/generic_instanceof4.dart
index 16b3327..84470da 100644
--- a/tests/compiler/dart2js/rti/data/generic_instanceof4.dart
+++ b/tests/compiler/dart2js/rti/data/generic_instanceof4.dart
@@ -2,11 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:deps=[B],direct,explicit=[A.T],needsArgs*/
 class A<T> {
-  @noInline
+  @pragma('dart2js:noInline')
   foo(x) {
     return x is T;
   }
@@ -17,7 +15,7 @@
 
 /*class: B:implicit=[B.T],indirect,needsArgs*/
 class B<T> implements BB {
-  @noInline
+  @pragma('dart2js:noInline')
   foo() {
     return new A<T>().foo(new B());
   }
diff --git a/tests/compiler/dart2js/rti/data/generic_instanceof4_unused.dart b/tests/compiler/dart2js/rti/data/generic_instanceof4_unused.dart
index 836e001..7efc3c1 100644
--- a/tests/compiler/dart2js/rti/data/generic_instanceof4_unused.dart
+++ b/tests/compiler/dart2js/rti/data/generic_instanceof4_unused.dart
@@ -2,11 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:deps=[B],direct,explicit=[A.T],needsArgs*/
 class A<T> {
-  @noInline
+  @pragma('dart2js:noInline')
   foo(x) {
     return x is T;
   }
@@ -18,7 +16,7 @@
 
 /*class: B:implicit=[B.T],indirect,needsArgs*/
 class B<T> implements BB {
-  @noInline
+  @pragma('dart2js:noInline')
   foo() {
     return new A<T>().foo(new B());
   }
diff --git a/tests/compiler/dart2js/rti/data/generic_method1.dart b/tests/compiler/dart2js/rti/data/generic_method1.dart
index 651976b..da2373a 100644
--- a/tests/compiler/dart2js/rti/data/generic_method1.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method1.dart
@@ -2,12 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
 import "package:expect/expect.dart";
 
 /*class: A:deps=[method2],direct,explicit=[A.T],needsArgs*/
 class A<T> {
-  @noInline
+  @pragma('dart2js:noInline')
   foo(x) {
     return x is T;
   }
@@ -17,19 +16,19 @@
 class BB {}
 
 /*element: method2:deps=[B],implicit=[method2.T],indirect,needsArgs*/
-@noInline
+@pragma('dart2js:noInline')
 method2<T>() => new A<T>();
 
 /*class: B:deps=[method1],implicit=[B.T],indirect,needsArgs*/
 class B<T> implements BB {
-  @noInline
+  @pragma('dart2js:noInline')
   foo() {
     return method2<T>().foo(new B());
   }
 }
 
 /*element: method1:implicit=[method1.T],indirect,needsArgs*/
-@noInline
+@pragma('dart2js:noInline')
 method1<T>() {
   return new B<T>().foo();
 }
diff --git a/tests/compiler/dart2js/rti/data/generic_method2.dart b/tests/compiler/dart2js/rti/data/generic_method2.dart
index 27a1d49..6ddb5c0 100644
--- a/tests/compiler/dart2js/rti/data/generic_method2.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method2.dart
@@ -2,12 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
 import "package:expect/expect.dart";
 
 /*class: A:deps=[B],direct,explicit=[A.T],needsArgs*/
 class A<T> {
-  @noInline
+  @pragma('dart2js:noInline')
   foo(x) {
     return x is T;
   }
@@ -18,14 +17,14 @@
 
 /*class: B:deps=[method1],implicit=[B.T],indirect,needsArgs*/
 class B<T> implements BB {
-  @noInline
+  @pragma('dart2js:noInline')
   foo() {
     return new A<T>().foo(new B());
   }
 }
 
 /*element: method1:implicit=[method1.T],indirect,needsArgs*/
-@noInline
+@pragma('dart2js:noInline')
 method1<T>() {
   return new B<T>().foo();
 }
diff --git a/tests/compiler/dart2js/rti/data/generic_method3.dart b/tests/compiler/dart2js/rti/data/generic_method3.dart
index 46ecef3c..a00bee3 100644
--- a/tests/compiler/dart2js/rti/data/generic_method3.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method3.dart
@@ -2,12 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
 import "package:expect/expect.dart";
 
 /*class: A:deps=[method2],direct,explicit=[A.T],needsArgs*/
 class A<T> {
-  @noInline
+  @pragma('dart2js:noInline')
   foo(x) {
     return x is T;
   }
@@ -17,12 +16,12 @@
 class BB {}
 
 /*element: method2:deps=[B],implicit=[method2.T],indirect,needsArgs*/
-@noInline
+@pragma('dart2js:noInline')
 method2<T>() => new A<T>();
 
 /*class: B:implicit=[B.T],indirect,needsArgs*/
 class B<T> implements BB {
-  @noInline
+  @pragma('dart2js:noInline')
   foo() {
     return method2<T>().foo(new B());
   }
diff --git a/tests/compiler/dart2js/rti/data/generic_method4.dart b/tests/compiler/dart2js/rti/data/generic_method4.dart
index 048ce79..342fcdd 100644
--- a/tests/compiler/dart2js/rti/data/generic_method4.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method4.dart
@@ -2,12 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
 import "package:expect/expect.dart";
 
 /*class: A:deps=[C.method2],direct,explicit=[A.T],needsArgs*/
 class A<T> {
-  @noInline
+  @pragma('dart2js:noInline')
   foo(x) {
     return x is T;
   }
@@ -18,7 +17,7 @@
 
 /*class: B:deps=[C.method1],implicit=[B.T],indirect,needsArgs*/
 class B<T> implements BB {
-  @noInline
+  @pragma('dart2js:noInline')
   foo(c) {
     return c.method2<T>().foo(new B());
   }
@@ -26,13 +25,13 @@
 
 class C {
   /*element: C.method1:implicit=[method1.T],indirect,needsArgs,selectors=[Selector(call, method1, arity=0, types=1)]*/
-  @noInline
+  @pragma('dart2js:noInline')
   method1<T>() {
     return new B<T>().foo(this);
   }
 
   /*element: C.method2:deps=[B],implicit=[method2.T],indirect,needsArgs,selectors=[Selector(call, method2, arity=0, types=1)]*/
-  @noInline
+  @pragma('dart2js:noInline')
   method2<T>() => new A<T>();
 }
 
diff --git a/tests/compiler/dart2js/rti/data/local_function_generic.dart b/tests/compiler/dart2js/rti/data/local_function_generic.dart
index 6963dd7..10e9a2f 100644
--- a/tests/compiler/dart2js/rti/data/local_function_generic.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_generic.dart
@@ -11,7 +11,7 @@
   return local;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is S Function<S>(S);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/local_function_list_literal.dart b/tests/compiler/dart2js/rti/data/local_function_list_literal.dart
index d58058e..7cbb508 100644
--- a/tests/compiler/dart2js/rti/data/local_function_list_literal.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_list_literal.dart
@@ -9,12 +9,12 @@
 
 /*strong.element: method:implicit=[method.T],indirect,needsArgs*/
 /*omit.element: method:needsArgs*/
-@NoInline()
+@pragma('dart2js:noInline')
 method<T>() {
   return () => <T>[];
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is List<int>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/local_function_map_literal.dart b/tests/compiler/dart2js/rti/data/local_function_map_literal.dart
index ebdd352..4084c3c 100644
--- a/tests/compiler/dart2js/rti/data/local_function_map_literal.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_map_literal.dart
@@ -9,12 +9,12 @@
 
 /*strong.element: method:implicit=[method.T],indirect,needsArgs*/
 /*omit.element: method:needsArgs*/
-@NoInline()
+@pragma('dart2js:noInline')
 method<T>() {
   return () => <T, int>{};
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is Map<int, int>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/local_function_signature2.dart b/tests/compiler/dart2js/rti/data/local_function_signature2.dart
index afb9150..ce0306e 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signature2.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signature2.dart
@@ -96,7 +96,7 @@
   return local;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is num Function(num);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures.dart b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
index 27ed472..705a077 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
@@ -52,7 +52,7 @@
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is num Function(num);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart b/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart
index 8d4dd9b..92252a3 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart
@@ -115,7 +115,7 @@
   return local;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is num Function(num);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/method_signatures.dart b/tests/compiler/dart2js/rti/data/method_signatures.dart
index 83bca5c..5a4b083 100644
--- a/tests/compiler/dart2js/rti/data/method_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/method_signatures.dart
@@ -45,7 +45,7 @@
 /*element: method9:*/
 Object method9(num n) => null;
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is num Function(num);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/method_signatures_generic.dart b/tests/compiler/dart2js/rti/data/method_signatures_generic.dart
index afca40f5..1c1cb02 100644
--- a/tests/compiler/dart2js/rti/data/method_signatures_generic.dart
+++ b/tests/compiler/dart2js/rti/data/method_signatures_generic.dart
@@ -43,7 +43,7 @@
 /*omit.element: method9:*/
 num method9<T>(num n, T t) => null;
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is num Function(num);
 
 forceInstantiation(num Function(num) f) => f;
diff --git a/tests/compiler/dart2js/rti/data/no_such_method1.dart b/tests/compiler/dart2js/rti/data/no_such_method1.dart
index 22f13c2..f2e93f1 100644
--- a/tests/compiler/dart2js/rti/data/no_such_method1.dart
+++ b/tests/compiler/dart2js/rti/data/no_such_method1.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 class C {
   /*element: C.noSuchMethod:needsArgs,selectors=[Selector(call, call, arity=0, types=2),Selector(call, foo, arity=0, types=2)]*/
   noSuchMethod(i) => i.typeArguments;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(dynamic x) {
   print(x.foo<int, String>());
 }
diff --git a/tests/compiler/dart2js/rti/data/no_such_method2.dart b/tests/compiler/dart2js/rti/data/no_such_method2.dart
index fc60960..55434cd 100644
--- a/tests/compiler/dart2js/rti/data/no_such_method2.dart
+++ b/tests/compiler/dart2js/rti/data/no_such_method2.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 class C {
   /*element: C.noSuchMethod:needsArgs,selectors=[Selector(call, call, arity=0, types=2),Selector(call, foo, arity=0, types=2)]*/
   noSuchMethod(i) => i.typeArguments;
@@ -14,7 +12,7 @@
   foo<U, V>() => [U, V];
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(dynamic x) {
   print(x.foo<int, String>());
 }
diff --git a/tests/compiler/dart2js/rti/data/no_such_method3.dart b/tests/compiler/dart2js/rti/data/no_such_method3.dart
index 98883aa..d10adf2 100644
--- a/tests/compiler/dart2js/rti/data/no_such_method3.dart
+++ b/tests/compiler/dart2js/rti/data/no_such_method3.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 class C {
   /*element: C.noSuchMethod:*/
   noSuchMethod(i) => null;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(dynamic x) {
   print(x.foo<int, String>());
 }
diff --git a/tests/compiler/dart2js/rti/emission/arguments.dart b/tests/compiler/dart2js/rti/emission/arguments.dart
index 30b4f2e..04e10ed 100644
--- a/tests/compiler/dart2js/rti/emission/arguments.dart
+++ b/tests/compiler/dart2js/rti/emission/arguments.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checkedTypeArgument,checks=[],typeArgument*/
 class A {}
 
@@ -13,7 +11,7 @@
 /*class: C:checkedInstance,checks=[],instance*/
 class C<T> {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is C<A>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/call.dart b/tests/compiler/dart2js/rti/emission/call.dart
index 51f2ee76..44f562a 100644
--- a/tests/compiler/dart2js/rti/emission/call.dart
+++ b/tests/compiler/dart2js/rti/emission/call.dart
@@ -3,14 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 /*class: A:checks=[],instance*/
 class A {
   call() {}
 }
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is Function;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/call_typed.dart b/tests/compiler/dart2js/rti/emission/call_typed.dart
index 3f70832..9688991 100644
--- a/tests/compiler/dart2js/rti/emission/call_typed.dart
+++ b/tests/compiler/dart2js/rti/emission/call_typed.dart
@@ -3,14 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 /*class: A:checks=[],instance*/
 class A {
   call(int i) {}
 }
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is Function(int);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/call_typed_generic.dart b/tests/compiler/dart2js/rti/emission/call_typed_generic.dart
index ff62703..1d3bfea 100644
--- a/tests/compiler/dart2js/rti/emission/call_typed_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/call_typed_generic.dart
@@ -3,14 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 /*class: A:checks=[],instance*/
 class A<T> {
   call(T t) {}
 }
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is Function(int);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/closure_function.dart b/tests/compiler/dart2js/rti/emission/closure_function.dart
index b09023f..86101d9 100644
--- a/tests/compiler/dart2js/rti/emission/closure_function.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_function.dart
@@ -2,9 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is Function;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/closure_function_type.dart b/tests/compiler/dart2js/rti/emission/closure_function_type.dart
index aed5de1..374d99e 100644
--- a/tests/compiler/dart2js/rti/emission/closure_function_type.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_function_type.dart
@@ -2,9 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is Function();
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/closure_signature.dart b/tests/compiler/dart2js/rti/emission/closure_signature.dart
index aedf5f6..8a4589a 100644
--- a/tests/compiler/dart2js/rti/emission/closure_signature.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_signature.dart
@@ -2,22 +2,20 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 /*class: A:checks=[],instance*/
 class A<T> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   m() {
     return /*checks=[$signature],instance*/ (T t) {};
   }
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   f() {
     return /*checks=[$signature],instance*/ (int t) {};
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is void Function(int);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart b/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
index df19f23..c292b18 100644
--- a/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
@@ -2,11 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 /*class: A:checks=[],instance*/
 class A<T> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   m() {
     // TODO(johnniwinther): The signature is not needed since the type isn't a
     // potential subtype of the checked function types.
@@ -18,7 +16,7 @@
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is void Function(int);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart b/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
index e59af18..97c2abe 100644
--- a/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
+++ b/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*strong.class: A1:checkedInstance,checks=[],instance*/
 /*omit.class: A1:checks=[],instance*/
 class A1 {}
@@ -17,7 +15,7 @@
 /*class: Test1:checks=[],instance*/
 class Test1 {
   A1 x;
-  @noInline
+  @pragma('dart2js:noInline')
   Test1(this.x);
 }
 
@@ -31,7 +29,7 @@
 
 /*class: Test2:checks=[],indirectInstance*/
 abstract class Test2 {
-  @noInline
+  @pragma('dart2js:noInline')
   Test2(A2 x) {
     print(x);
   }
diff --git a/tests/compiler/dart2js/rti/emission/dynamic_instance.dart b/tests/compiler/dart2js/rti/emission/dynamic_instance.dart
index d6b0a9a..3f455c0 100644
--- a/tests/compiler/dart2js/rti/emission/dynamic_instance.dart
+++ b/tests/compiler/dart2js/rti/emission/dynamic_instance.dart
@@ -3,24 +3,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 /*class: B:checkedInstance,checks=[],typeArgument*/
 class B {}
 
 /*class: C:checks=[],instance*/
 class C {
-  @noInline
+  @pragma('dart2js:noInline')
   method1<T>(o) => method2<T>(o);
 
-  @noInline
+  @pragma('dart2js:noInline')
   method2<T>(o) => o is T;
 }
 
 /*class: D:checks=[$isB],instance*/
 class D implements B {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => new C().method1<B>(o);
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart b/tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart
index aa1aa80..c3270bb 100644
--- a/tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 /*class: A:checkedInstance,checks=[],instance*/
 class A<T> {}
@@ -13,10 +12,10 @@
 
 /*class: C:checks=[],instance*/
 class C {
-  @noInline
+  @pragma('dart2js:noInline')
   method1<T>() => method2<T>();
 
-  @noInline
+  @pragma('dart2js:noInline')
   method2<T>() => new A<T>();
 }
 
@@ -26,7 +25,7 @@
 /*class: E:checks=[],typeArgument*/
 class E {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is A<B>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/function_type_argument.dart b/tests/compiler/dart2js/rti/emission/function_type_argument.dart
index cac5f11..3b1ae5d 100644
--- a/tests/compiler/dart2js/rti/emission/function_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/function_type_argument.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 /*strong.class: C:checkedInstance,checks=[],instance,typeArgument*/
 /*omit.class: C:checks=[],instance,typeArgument*/
@@ -17,10 +16,10 @@
   call(double i) {}
 }
 
-@noInline
+@pragma('dart2js:noInline')
 test1(o) => o is Function(int);
 
-@noInline
+@pragma('dart2js:noInline')
 test2(o) => o is List<Function(int)>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/future_or.dart b/tests/compiler/dart2js/rti/emission/future_or.dart
index e7a0cf8..4e5bf95 100644
--- a/tests/compiler/dart2js/rti/emission/future_or.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or.dart
@@ -37,7 +37,7 @@
   Future<S> then<S>(FutureOr<S> onValue(T value), {Function onError}) => null;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is FutureOr<A>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart b/tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart
index c1ca45b..402f2bc 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'package:expect/expect.dart';
 
 /*class: global#Future:checks=[],typeArgument*/
 
@@ -16,7 +15,7 @@
 /*class: C:checks=[],typeArgument*/
 class C {}
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o as A<FutureOr<B>>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/future_or_future_or.dart b/tests/compiler/dart2js/rti/emission/future_or_future_or.dart
index c667d0d..dfd18b3 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_future_or.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_future_or.dart
@@ -13,7 +13,7 @@
 /*class: B:checks=[],instance*/
 class B {}
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is FutureOr<FutureOr<A>>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart b/tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart
index 41a9baf..5a6b425 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart
@@ -9,7 +9,7 @@
 
 /*class: A:checks=[],instance*/
 class A<T> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   m(o) => o is FutureOr<B<T>>;
 }
 
diff --git a/tests/compiler/dart2js/rti/emission/future_or_generic.dart b/tests/compiler/dart2js/rti/emission/future_or_generic.dart
index 114f59e..b97e5e2 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_generic.dart
@@ -9,7 +9,7 @@
 
 /*class: A:checks=[],instance*/
 class A<T> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   m(o) => o is FutureOr<T>;
 }
 
diff --git a/tests/compiler/dart2js/rti/emission/future_or_generic2.dart b/tests/compiler/dart2js/rti/emission/future_or_generic2.dart
index efbac15..68eca4a 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_generic2.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_generic2.dart
@@ -9,7 +9,7 @@
 
 /*class: A:checks=[],instance*/
 class A<T> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   m(o) => o is FutureOr<B<T>>;
 }
 
diff --git a/tests/compiler/dart2js/rti/emission/future_or_type_argument.dart b/tests/compiler/dart2js/rti/emission/future_or_type_argument.dart
index ac9a440..374a758 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_type_argument.dart
@@ -16,7 +16,7 @@
 /*class: C:checks=[],typeArgument*/
 class C {}
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is A<FutureOr<B>>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/generic_instanceof4.dart b/tests/compiler/dart2js/rti/emission/generic_instanceof4.dart
index 46cc720..6d2b263 100644
--- a/tests/compiler/dart2js/rti/emission/generic_instanceof4.dart
+++ b/tests/compiler/dart2js/rti/emission/generic_instanceof4.dart
@@ -2,11 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checks=[],instance*/
 class A<T> {
-  @noInline
+  @pragma('dart2js:noInline')
   foo(x) {
     return x is T;
   }
@@ -17,7 +15,7 @@
 
 /*class: B:checks=[$isBB],instance*/
 class B<T> implements BB {
-  @noInline
+  @pragma('dart2js:noInline')
   foo() {
     return new A<T>().foo(new B());
   }
diff --git a/tests/compiler/dart2js/rti/emission/inherited_is.dart b/tests/compiler/dart2js/rti/emission/inherited_is.dart
index 1472e8a..e240c7d 100644
--- a/tests/compiler/dart2js/rti/emission/inherited_is.dart
+++ b/tests/compiler/dart2js/rti/emission/inherited_is.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 /*class: A:checkedInstance*/
 class A {}
@@ -17,7 +16,7 @@
 /*class: D:checks=[],instance*/
 class D extends C {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is A;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/inherited_is2.dart b/tests/compiler/dart2js/rti/emission/inherited_is2.dart
index 93e5330..95c1993 100644
--- a/tests/compiler/dart2js/rti/emission/inherited_is2.dart
+++ b/tests/compiler/dart2js/rti/emission/inherited_is2.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 /*class: A:checkedInstance*/
 class A {}
@@ -17,7 +16,7 @@
 /*class: D:checks=[],instance*/
 class D extends C {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is A;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/jsinterop.dart b/tests/compiler/dart2js/rti/emission/jsinterop.dart
index 97b0ca6..b677aba 100644
--- a/tests/compiler/dart2js/rti/emission/jsinterop.dart
+++ b/tests/compiler/dart2js/rti/emission/jsinterop.dart
@@ -8,7 +8,6 @@
 /*class: global#JavaScriptObject:checks=[$isA,$isC],instance*/
 
 import 'package:js/js.dart';
-import 'package:expect/expect.dart';
 
 /*class: A:checkedInstance,checks=[],instance*/
 @JS()
@@ -46,7 +45,7 @@
   F();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is A || o is C || o is E;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/list.dart b/tests/compiler/dart2js/rti/emission/list.dart
index fa99c20..fbe0937 100644
--- a/tests/compiler/dart2js/rti/emission/list.dart
+++ b/tests/compiler/dart2js/rti/emission/list.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*strong.class: global#JSArray:checkedInstance,checks=[$isIterable,$isList],instance*/
 /*omit.class: global#JSArray:checkedInstance,checks=[$isIterable],instance*/
 
@@ -17,7 +15,7 @@
 /*omit.class: B:checks=[],typeArgument*/
 class B {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is Iterable<A>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart b/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart
index e4ded08..c62e2c8 100644
--- a/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart
@@ -7,12 +7,12 @@
 /*strong.class: global#JSArray:checkedInstance,checks=[$isIterable,$isList],instance*/
 /*omit.class: global#JSArray:checkedInstance,checks=[$isList],instance*/
 
-@NoInline()
+@pragma('dart2js:noInline')
 method<T>() {
   return /*checks=[],instance*/ () => <T>[];
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is List<int>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/local_function_map_literal.dart b/tests/compiler/dart2js/rti/emission/local_function_map_literal.dart
index fefa55b..080f72b 100644
--- a/tests/compiler/dart2js/rti/emission/local_function_map_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/local_function_map_literal.dart
@@ -6,14 +6,14 @@
 
 /*class: global#JsLinkedHashMap:checks=[],instance*/
 
-@NoInline()
+@pragma('dart2js:noInline')
 method<T>() {
   return
       /*checks=[],instance*/
       () => <T, int>{};
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is Map<int, int>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart b/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart
index 4b56c06..1b9f2bf 100644
--- a/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart
+++ b/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart
@@ -26,7 +26,7 @@
 /*class: C:checks=[$asA,$asI,$asJ,$asM,$asS,$isA,$isI,$isJ],instance*/
 class C<T, K> = S<T> with A<T, List<K>> implements J<K>;
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(c) {
   Expect.equals("Map<int, List<bool>>", c.t().toString());
   Expect.isTrue(c is I<List<bool>>);
diff --git a/tests/compiler/dart2js/rti/emission/mixin_subtype.dart b/tests/compiler/dart2js/rti/emission/mixin_subtype.dart
index 57bbcd0..fbc9b85 100644
--- a/tests/compiler/dart2js/rti/emission/mixin_subtype.dart
+++ b/tests/compiler/dart2js/rti/emission/mixin_subtype.dart
@@ -80,7 +80,7 @@
 /*class: GD:checkedInstance,checks=[$asGI,$asGJ,$isGI,$isGJ,$isGM],typeArgument*/
 class GD<T> = GC<T> with GM<T>;
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) {}
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/native.dart b/tests/compiler/dart2js/rti/emission/native.dart
index edcf75a..02698ba 100644
--- a/tests/compiler/dart2js/rti/emission/native.dart
+++ b/tests/compiler/dart2js/rti/emission/native.dart
@@ -16,13 +16,13 @@
 @Native('QQQQ')
 class Q {}
 
-@NoInline()
+@pragma('dart2js:noInline')
 makeP() => JS('returns:;creates:Purple', 'null');
 
-@NoInline()
+@pragma('dart2js:noInline')
 makeQ() => JS('Q', 'null');
 
-@NoInline()
+@pragma('dart2js:noInline')
 testNative() {
   var x = makeP();
   Expect.isTrue(x is Purple);
diff --git a/tests/compiler/dart2js/rti/emission/regress_18713.dart b/tests/compiler/dart2js/rti/emission/regress_18713.dart
index 9b7ac50..53b012a 100644
--- a/tests/compiler/dart2js/rti/emission/regress_18713.dart
+++ b/tests/compiler/dart2js/rti/emission/regress_18713.dart
@@ -19,8 +19,8 @@
 /*class: TS:checks=[$asS0,$asT],instance*/
 class TS<A, B> = T<A> with S<B>;
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 dyn(x) => x;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart b/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart
index 5b22b5f..091258b 100644
--- a/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart
+++ b/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart
@@ -15,7 +15,7 @@
 /*class: A:checks=[],typeArgument*/
 class A {}
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => Expect.notEquals('dynamic', '$o');
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/self.dart b/tests/compiler/dart2js/rti/emission/self.dart
index 2777989..7c91d8d 100644
--- a/tests/compiler/dart2js/rti/emission/self.dart
+++ b/tests/compiler/dart2js/rti/emission/self.dart
@@ -2,12 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: C:checkedInstance,checks=[],instance,typeLiteral*/
 class C {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is C;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/self_generic.dart b/tests/compiler/dart2js/rti/emission/self_generic.dart
index ca5bc11..0d45939 100644
--- a/tests/compiler/dart2js/rti/emission/self_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/self_generic.dart
@@ -2,12 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: C:checkedInstance,checks=[],instance*/
 class C<T> {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is C<String>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/static_argument.dart b/tests/compiler/dart2js/rti/emission/static_argument.dart
index 4df0ab4..0e738ce 100644
--- a/tests/compiler/dart2js/rti/emission/static_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/static_argument.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*strong.class: I1:checkedInstance*/
 /*omit.class: I1:*/
 class I1 {}
@@ -22,10 +20,10 @@
 /*omit.class: B:checks=[$isI2],instance*/
 class B implements I1, I2 {}
 
-@noInline
+@pragma('dart2js:noInline')
 void foo(I1 x) {}
 
-@noInline
+@pragma('dart2js:noInline')
 void bar(I2 x) {}
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/superclass.dart b/tests/compiler/dart2js/rti/emission/superclass.dart
index 8c70ab7..d383f65 100644
--- a/tests/compiler/dart2js/rti/emission/superclass.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: B:checkedInstance,checks=[],indirectInstance,typeLiteral*/
 class B {}
 
 /*class: C:checks=[],instance*/
 class C extends B {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is B;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/superclass_as.dart b/tests/compiler/dart2js/rti/emission/superclass_as.dart
index 5f9a9e1..d9685dd 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_as.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_as.dart
@@ -3,21 +3,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 /*class: A:checkedInstance,checks=[],instance*/
 class A<T> {}
 
 /*class: B:checks=[],indirectInstance*/
 class B<T, S> {
-  @noInline
+  @pragma('dart2js:noInline')
   method() => new A<S>();
 }
 
 /*class: C:checks=[$asB],instance*/
 class C<T> extends B<T, T> {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is A<int>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/superclass_complex.dart b/tests/compiler/dart2js/rti/emission/superclass_complex.dart
index 5b7fa34..37c4e22 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_complex.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_complex.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checkedTypeArgument,checks=[],typeArgument*/
 class A<T> {}
 
@@ -13,7 +11,7 @@
 /*class: C:checks=[$asB],instance*/
 class C<T> extends B<A<T>> {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is B<A<String>>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/superclass_fixed.dart b/tests/compiler/dart2js/rti/emission/superclass_fixed.dart
index bc445f7..2330a1e 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_fixed.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_fixed.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: B:checkedInstance,checks=[],indirectInstance*/
 class B<T> {}
 
 /*class: C:checks=[$asB],instance*/
 class C extends B<String> {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is B<String>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype.dart
index 614192e..c9ffe06 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checks=[],indirectInstance*/
 class A {}
 
@@ -13,7 +11,7 @@
 /*class: C:checks=[$isB],instance*/
 class C extends A implements B {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is B;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart
index 32201f8..2a6c7f4 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checkedTypeArgument,checks=[],typeArgument*/
 class A<T> {}
 
@@ -16,7 +14,7 @@
 /*class: D:checks=[$asB,$isB],instance*/
 class D<T> extends C<T> implements B<A<T>> {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is B<A<String>>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart
index 2408c8c..7c660cc 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checks=[],indirectInstance*/
 class A {}
 
@@ -13,7 +11,7 @@
 /*class: C:checks=[$asB,$isB],instance*/
 class C extends A implements B<String> {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is B<String>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart
index 8a7e8fd..9affb57 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checks=[],indirectInstance*/
 class A<T> {}
 
@@ -13,7 +11,7 @@
 /*class: C:checks=[$isB],instance*/
 class C<T> extends A<T> implements B<T> {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is B<String>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/superclass_trivial.dart b/tests/compiler/dart2js/rti/emission/superclass_trivial.dart
index a9a6ec8..d89f74f 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_trivial.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: B:checkedInstance,checks=[],indirectInstance*/
 class B<T> {}
 
 /*class: C:checks=[],instance*/
 class C<T> extends B<T> {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is B<String>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart b/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart
index 2f6ccb0..5105e9c 100644
--- a/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checkedInstance,checks=[],indirectInstance*/
 class A<T> {}
 
@@ -13,7 +11,7 @@
 /*class: C:checks=[],instance*/
 class C<S, T> extends B<S, T> {} // Non-trivial substitution of A
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is A<String>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart b/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart
index 5023aad..da3622c 100644
--- a/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checkedInstance,checks=[],indirectInstance*/
 class A<T> {}
 
@@ -13,7 +11,7 @@
 /*class: C:checks=[$asA,$asB],instance*/
 class C<T> extends B<T, T> {} // Trivial substitution of A
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is A<String>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/supertype.dart b/tests/compiler/dart2js/rti/emission/supertype.dart
index 92bae3f..9eb815b 100644
--- a/tests/compiler/dart2js/rti/emission/supertype.dart
+++ b/tests/compiler/dart2js/rti/emission/supertype.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: B:checkedInstance*/
 class B {}
 
 /*class: C:checks=[$isB],instance*/
 class C implements B {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is B;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/supertype_complex.dart b/tests/compiler/dart2js/rti/emission/supertype_complex.dart
index 5ca3b0f..34104d8 100644
--- a/tests/compiler/dart2js/rti/emission/supertype_complex.dart
+++ b/tests/compiler/dart2js/rti/emission/supertype_complex.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checkedTypeArgument,checks=[],typeArgument*/
 class A<T> {}
 
@@ -13,7 +11,7 @@
 /*class: C:checks=[$asB,$isB],instance*/
 class C<T> implements B<A<T>> {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is B<A<String>>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/supertype_fixed.dart b/tests/compiler/dart2js/rti/emission/supertype_fixed.dart
index 2b14e4c..8866c90 100644
--- a/tests/compiler/dart2js/rti/emission/supertype_fixed.dart
+++ b/tests/compiler/dart2js/rti/emission/supertype_fixed.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: B:checkedInstance*/
 class B<T> {}
 
 /*class: C:checks=[$asB,$isB],instance*/
 class C implements B<String> {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is B<String>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/supertype_trivial.dart b/tests/compiler/dart2js/rti/emission/supertype_trivial.dart
index 40f9e29..6f44e13 100644
--- a/tests/compiler/dart2js/rti/emission/supertype_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/supertype_trivial.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: B:checkedInstance*/
 class B<T> {}
 
 /*class: C:checks=[$isB],instance*/
 class C<T> implements B<T> {}
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is B<String>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_extends.dart b/tests/compiler/dart2js/rti/emission/supertypes_extends.dart
index f00142c..2629ef4 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_extends.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_extends.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checkedInstance*/
 class A {}
 
@@ -13,7 +11,7 @@
 /*class: C:checks=[],instance*/
 class C extends B {} // Implements A through `extends B`.
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is A;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_extends2.dart b/tests/compiler/dart2js/rti/emission/supertypes_extends2.dart
index dc3de4e..0c59cc3 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_extends2.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_extends2.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checkedInstance*/
 class A {}
 
@@ -13,7 +11,7 @@
 /*class: C:checks=[],instance*/
 class C extends B {} // Implements A through `extends B`.
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is A;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart b/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart
index 4f56646..77dc0cb 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checkedInstance*/
 class A {}
 
@@ -16,7 +14,7 @@
 /*class: D:checks=[],instance*/
 class D extends C {} // Implements A through `extends C`.
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is A;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_implements.dart b/tests/compiler/dart2js/rti/emission/supertypes_implements.dart
index c5a92b4..f481105 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_implements.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_implements.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checkedInstance*/
 class A {}
 
@@ -13,7 +11,7 @@
 /*class: C:checks=[$isA],instance*/
 class C implements B {} // Implements A through `implements B`.
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is A;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart b/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart
index c7be77c..ad90ae4 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checkedInstance,checks=[],indirectInstance*/
 class A<T> {}
 
@@ -13,7 +11,7 @@
 /*class: C:checks=[$asA,$isA],instance*/
 class C<S, T> implements B<S, T> {} // Non-trivial substitution of A
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is A<String>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart b/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart
index 2a5e744..31ac65a 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 /*class: A:checkedInstance,checks=[],indirectInstance*/
 class A<T> {}
 
@@ -13,7 +11,7 @@
 /*class: C:checks=[$isA],instance*/
 class C<T> implements B<T, T> {} // Trivial substitution of A
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is A<String>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart b/tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart
index a3d12e2..1d38ef6 100644
--- a/tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart
+++ b/tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 /*class: A:checkedTypeArgument,checks=[],typeArgument*/
 class A {}
@@ -19,17 +18,17 @@
 
 /*class: E:checks=[],instance*/
 class E {
-  @noInline
+  @pragma('dart2js:noInline')
   m<T>() => new C<T>();
 }
 
 /*class: F:checks=[],instance*/
 class F {
-  @noInline
+  @pragma('dart2js:noInline')
   m<T>() => false;
 }
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is C<A>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/type_argument_static.dart b/tests/compiler/dart2js/rti/emission/type_argument_static.dart
index 05ba49e..f1c6b64 100644
--- a/tests/compiler/dart2js/rti/emission/type_argument_static.dart
+++ b/tests/compiler/dart2js/rti/emission/type_argument_static.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 /*class: A:checkedTypeArgument,checks=[],typeArgument*/
 class A {}
@@ -17,10 +16,10 @@
 /*class: D:checks=[],typeArgument*/
 class D {}
 
-@noInline
+@pragma('dart2js:noInline')
 m<T>() => new C<T>();
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is C<A>;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/factory_call_test.dart b/tests/compiler/dart2js/rti/factory_call_test.dart
index 9430101..5526cc0 100644
--- a/tests/compiler/dart2js/rti/factory_call_test.dart
+++ b/tests/compiler/dart2js/rti/factory_call_test.dart
@@ -15,20 +15,18 @@
 import '../helpers/memory_compiler.dart';
 
 const String code = '''
-import 'package:meta/dart2js.dart';
-
 class A<T> {
   final field;
 
-  @noInline
+  @pragma('dart2js:noInline')
   factory A.fact(t) => new A(t);
 
-  @noInline
+  @pragma('dart2js:noInline')
   A(t) : field = t is T;
 }
 
 // A call to A.fact.
-@noInline
+@pragma('dart2js:noInline')
 callAfact() => new A<int>.fact(0).runtimeType;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/instance_call_test.dart b/tests/compiler/dart2js/rti/instance_call_test.dart
index d219c0f..3b0c102 100644
--- a/tests/compiler/dart2js/rti/instance_call_test.dart
+++ b/tests/compiler/dart2js/rti/instance_call_test.dart
@@ -19,65 +19,63 @@
 import '../helpers/memory_compiler.dart';
 
 const String code = '''
-import 'package:meta/dart2js.dart';
-
 class A {
   // Both method1 implementations need type arguments.
-  @noInline
+  @pragma('dart2js:noInline')
   method1<T>(T t) => t is T;
 
   // One of the method2 implementations need type arguments.
-  @noInline
+  @pragma('dart2js:noInline')
   method2<T>(T t) => t is T;
 
   // None of the method3 implementations need type arguments.
-  @noInline
+  @pragma('dart2js:noInline')
   method3<T>(T t) => false;
 }
 
 class B {
-  @noInline
+  @pragma('dart2js:noInline')
   method1<T>(T t) => t is T;
-  @noInline
+  @pragma('dart2js:noInline')
   method2<T>(T t) => true;
-  @noInline
+  @pragma('dart2js:noInline')
   method3<T>(T t) => true;
 }
 
 // A call to either A.method1 or B.method1.
-@noInline
+@pragma('dart2js:noInline')
 call1(c) => c.method1<int>(0);
 
 // A call to A.method1.
-@noInline
+@pragma('dart2js:noInline')
 call1a() => new A().method1<int>(0);
 
 // A call to B.method1.
-@noInline
+@pragma('dart2js:noInline')
 call1b() => new B().method1<int>(0);
 
 // A call to either A.method2 or B.method2.
-@noInline
+@pragma('dart2js:noInline')
 call2(c) => c.method2<int>(0);
 
 // A call to A.method2.
-@noInline
+@pragma('dart2js:noInline')
 call2a() => new A().method2<int>(0);
 
 // A call to B.method2.
-@noInline
+@pragma('dart2js:noInline')
 call2b() => new B().method2<int>(0);
 
 // A call to either A.method3 or B.method3.
-@noInline
+@pragma('dart2js:noInline')
 call3(c) => c.method3<int>(0);
 
 // A call to A.method3.
-@noInline
+@pragma('dart2js:noInline')
 call3a() => new A().method3<int>(0);
 
 // A call to B.method3.
-@noInline
+@pragma('dart2js:noInline')
 call3b() => new B().method3<int>(0);
 
 main() {
diff --git a/tests/compiler/dart2js/serialization/data/jsinterop.dart b/tests/compiler/dart2js/serialization/data/jsinterop.dart
index 6996587..208b2a9 100644
--- a/tests/compiler/dart2js/serialization/data/jsinterop.dart
+++ b/tests/compiler/dart2js/serialization/data/jsinterop.dart
@@ -6,7 +6,6 @@
 library lib;
 
 import 'package:js/js.dart';
-import 'package:meta/dart2js.dart';
 
 @JS()
 @anonymous
@@ -20,7 +19,7 @@
   method();
 }
 
-@tryInline
+@pragma('dart2js:tryInline')
 method() {
   new GenericClass().setter = 42;
 }
diff --git a/tests/compiler/dart2js/sourcemaps/mapping_test.dart b/tests/compiler/dart2js/sourcemaps/mapping_test.dart
index a69f0a6..ed5d544 100644
--- a/tests/compiler/dart2js/sourcemaps/mapping_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/mapping_test.dart
@@ -34,7 +34,7 @@
   @{main}test();
 @{main}}
 
-@NoInline()
+@pragma('dart2js:noInline')
 @{test}test() {
 @{test}}
 ''',
diff --git a/tests/compiler/dart2js/sourcemaps/minified/is_not_a_function.dart b/tests/compiler/dart2js/sourcemaps/minified/is_not_a_function.dart
index fb87279..92087cd 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/is_not_a_function.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/is_not_a_function.dart
@@ -9,15 +9,13 @@
 // Kind of minified name: instance
 // Expected deobfuscated name: m1
 
-import 'package:expect/expect.dart';
-
 main() {
   dynamic x = confuse(new B());
   x.m1();
 }
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 confuse(x) => x;
 
 class B {
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart
index 70de964..6fcd2aa 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart
@@ -6,16 +6,14 @@
 // Kind of minified name: instance
 // Expected deobfuscated name: m1
 
-import 'package:expect/expect.dart';
-
 main() {
   confuse(new A());
   dynamic x = confuse(new B());
   x.m1();
 }
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 confuse(x) => x;
 
 class A {
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart
index eb38df3..98e56b9 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart
@@ -6,16 +6,14 @@
 // Kind of minified name: global
 // Expected deobfuscated name: B
 
-import 'package:expect/expect.dart';
-
 main() {
   confuse(new A());
   dynamic x = confuse(new B());
   x.m1();
 }
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 confuse(x) => x;
 
 class A {
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart
index f28344a..5ba0000 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart
@@ -6,8 +6,6 @@
 // Kind of minified name: instance
 // Expected deobfuscated name: g1
 
-import 'package:expect/expect.dart';
-
 main() {
   try {
     confuse(new A());
@@ -18,8 +16,8 @@
   }
 }
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 confuse(x) => x;
 
 class A {
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart
index a8949f0..9a4fdf6 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart
@@ -6,8 +6,6 @@
 // Kind of minified name: instance
 // Expected deobfuscated name: g1=
 
-import 'package:expect/expect.dart';
-
 main() {
   try {
     confuse(new A());
@@ -18,8 +16,8 @@
   }
 }
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 confuse(x) => x;
 
 class A {
diff --git a/tests/compiler/dart2js/sourcemaps/minified_names_test.dart b/tests/compiler/dart2js/sourcemaps/minified_names_test.dart
index 70a764f..8761edc 100644
--- a/tests/compiler/dart2js/sourcemaps/minified_names_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified_names_test.dart
@@ -94,7 +94,7 @@
   print('-- ${minified ? 'minified' : 'not-minified'}:');
   D8Result result = await runWithD8(
       memorySourceFiles: {'main.dart': test.code},
-      options: minified ? [Flags.minify] : []);
+      options: minified ? [Flags.minify, Flags.testMode] : [Flags.testMode]);
   String stdout = result.runResult.stdout;
   String error = _extractError(stdout);
   print('   error: $error');
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/deep_inlining.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/deep_inlining.dart
index bef5cfa..1b30119 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/deep_inlining.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/deep_inlining.dart
@@ -1,8 +1,10 @@
-import 'package:expect/expect.dart';
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
 
 class MyClass {}
 
-@NoInline()
+@pragma('dart2js:noInline')
 method3() {
   /*4:method3*/ throw new MyClass();
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field.dart
index a909569..b9a347f 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field.dart
@@ -2,17 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   /*1:main*/ test(new Class());
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(c) {
   c. /*2:test*/ field.method();
 }
 
 class Class {
+  @pragma('dart2js:noElision')
   var field;
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field_elided.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field_elided.dart
new file mode 100644
index 0000000..768d1f0
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field_elided.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  /*1:main*/ test(new Class());
+}
+
+@pragma('dart2js:noInline')
+test(c) {
+  c.field. /*2:test*/ method();
+}
+
+class Class {
+  var field;
+}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/null_interceptor_field.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/null_interceptor_field.dart
index 011af16..08a8072 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/null_interceptor_field.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/null_interceptor_field.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 class MyType {
   get length => 3; // ensures we build an interceptor for `.length`
 }
@@ -16,5 +14,5 @@
   confuse(null). /*1:main*/ length; // called through the interceptor
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 confuse(x) => x;
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart
index 4170f29..4321fea 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 main() {
   var c = new Class();
   c. /*1:main*/ instancePositional1(0);
@@ -19,55 +17,55 @@
 }
 
 class Class {
-  @noInline
+  @pragma('dart2js:noInline')
   /*2:Class.instancePositional1[function-entry$1]*/ instancePositional1(a,
       [b = 42, c = 87]) {
     print('instancePositional1($a,$b,$c)');
     /*3:Class.instancePositional1*/ instancePositional2(1, 2);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   /*4:Class.instancePositional2[function-entry$2]*/ instancePositional2(a,
       [b = 42, c = 87]) {
     print('instancePositional2($a,$b,$c)');
     /*5:Class.instancePositional2*/ instancePositional3(3, 4, 5);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   instancePositional3(a, [b = 42, c = 87]) {
     print('instancePositional3($a,$b,$c)');
     /*6:Class.instancePositional3*/ instanceNamed1(0);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   /*7:Class.instanceNamed1[function-entry$1]*/ instanceNamed1(a,
       {b: 42, c: 87, d: 735}) {
     print('instanceNamed1($a,b:$b,c:$c,d:$d)');
     /*8:Class.instanceNamed1*/ instanceNamed2(1, b: 2);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   /*9:Class.instanceNamed2[function-entry$1$b]*/ instanceNamed2(a,
       {b: 42, c: 87, d: 735}) {
     print('instanceNamed2($a,b:$b,c:$c,d:$d)');
     /*10:Class.instanceNamed2*/ instanceNamed3(3, c: 123);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   /*11:Class.instanceNamed3[function-entry$1$c]*/ instanceNamed3(a,
       {b: 42, c: 87, d: 735}) {
     print('instanceNamed3($a,b:$b,c:$c,d:$d)');
     /*12:Class.instanceNamed3*/ instanceNamed4(4, c: 45, b: 76);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   /*13:Class.instanceNamed4[function-entry$1$b$c]*/ instanceNamed4(a,
       {b: 42, c: 87, d: 735}) {
     print('instanceNamed4($a,b:$b,c:$c,d:$d)');
     /*14:Class.instanceNamed4*/ instanceNamed5(5, c: 6, b: 7, d: 8);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   instanceNamed5(a, {b: 42, c: 87, d: 735}) {
     print('instanceNamed5($a,b:$b,c:$c,d:$d)');
     /*18:Class.instanceNamed5[function-entry$0].local*/ local([e = 42]) {
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/parameters_elided.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/parameters_elided.dart
index cb0bade..b8cbd75 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/parameters_elided.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/parameters_elided.dart
@@ -2,57 +2,55 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart';
-
 main() {
   var c = new Class();
   c. /*1:main*/ instancePositional1(0);
 }
 
 class Class {
-  @noInline
+  @pragma('dart2js:noInline')
   instancePositional1(a, [b = 42, c = 87]) {
     print('instancePositional1($a,$b,$c)');
     /*2:Class.instancePositional1*/ instancePositional2(1, 2);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   instancePositional2(a, [b = 42, c = 87]) {
     print('instancePositional2($a,$b,$c)');
     /*3:Class.instancePositional2*/ instancePositional3(3, 4, 5);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   instancePositional3(a, [b = 42, c = 87]) {
     print('instancePositional3($a,$b,$c)');
     /*4:Class.instancePositional3*/ instanceNamed1(0);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   instanceNamed1(a, {b: 42, c: 87, d: 735}) {
     print('instanceNamed1($a,b:$b,c:$c,d:$d)');
     /*5:Class.instanceNamed1*/ instanceNamed2(1, b: 2);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   instanceNamed2(a, {b: 42, c: 87, d: 735}) {
     print('instanceNamed2($a,b:$b,c:$c,d:$d)');
     /*6:Class.instanceNamed2*/ instanceNamed3(3, c: 123);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   instanceNamed3(a, {b: 42, c: 87, d: 735}) {
     print('instanceNamed3($a,b:$b,c:$c,d:$d)');
     /*7:Class.instanceNamed3*/ instanceNamed4(4, c: 45, b: 76);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   instanceNamed4(a, {b: 42, c: 87, d: 735}) {
     print('instanceNamed4($a,b:$b,c:$c,d:$d)');
     /*8:Class.instanceNamed4*/ instanceNamed5(5, c: 6, b: 7, d: 8);
   }
 
-  @noInline
+  @pragma('dart2js:noInline')
   instanceNamed5(a, {b: 42, c: 87, d: 735}) {
     print('instanceNamed5($a,b:$b,c:$c,d:$d)');
     /*12:Class.instanceNamed5[function-entry$0].local*/ local([e = 42]) {
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/rethrow.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/rethrow.dart
index 81d809b..d1edabc 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/rethrow.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/rethrow.dart
@@ -2,13 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   /*1:main*/ test();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test() {
   try {
     /*2:test*/ throw '>ExceptionMarker<';
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
index 13e5ecd..3c17f40 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
@@ -2,14 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   // This call is on the stack when the error is thrown.
   /*1:main*/ test();
 }
 
-@NoInline()
-test() async /*2:test*/ {
+// TODO(34942): Step 2 should point to the body block.
+@pragma('dart2js:noInline')
+test /*2:test*/ () async {
   /*4:test*/ throw '>ExceptionMarker<';
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
index 49c7a18..46ec972 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
@@ -2,20 +2,20 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   // This call is on the stack when the error is thrown.
   /*1:main*/ test1();
 }
 
-@NoInline()
-test1() async /*3:test1*/ {
+// TODO(34942): Step 3 should point to the body block.
+@pragma('dart2js:noInline')
+test1 /*3:test1*/ () async {
   // This call is on the stack when the error is thrown.
   await /*5:test1*/ test2();
 }
 
-@NoInline()
-test2() async /*7:test2*/ {
+// TODO(34942): Step 7 should point to the body block.
+@pragma('dart2js:noInline')
+test2 /*7:test2*/ () async {
   /*9:test2*/ throw '>ExceptionMarker<';
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
index 610895a..be6c6b18 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   /*1:main*/ test();
 }
@@ -16,7 +14,7 @@
 }
 
 class Class {
-  @NoInline()
+  @pragma('dart2js:noInline')
   Class() {
     /*6:Class*/ throw '>ExceptionMarker<';
   }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
index 7ea1cf9..1ed8fd4 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
@@ -2,18 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   /*1:main*/ test1();
 }
 
-@NoInline()
-test1() async /*2:test1*/ {
+// TODO(34942): Step 2 should point to the body block.
+@pragma('dart2js:noInline')
+test1 /*2:test1*/ () async {
   /*9:test1*/ test2();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test2() {
   /*10:test2*/ throw '>ExceptionMarker<';
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_async.dart
index dba9a31..fe10b93 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_async.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   // This call is no longer on the stack when the error is thrown.
   /*:main*/ test();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test() async {
   await null;
   /*9:test*/ throw '>ExceptionMarker<';
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_awaited_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_awaited_async.dart
index 522bcf7..b9762fd 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_awaited_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_awaited_async.dart
@@ -2,19 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   test1();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test1() async {
   // This call is no longer on the stack when the error is thrown.
   await /*:test1*/ test2();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test2() async {
   await null;
   /*1:test2*/ throw '>ExceptionMarker<';
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor.dart
index 6d7a7f2..6912e7c 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   // ignore: UNUSED_LOCAL_VARIABLE
   var c = new /*1:main*/ Class();
 }
 
 class Class {
-  @NoInline()
+  @pragma('dart2js:noInline')
   Class() {
     /*3:Class*/ throw '>ExceptionMarker<';
   }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor_from_async.dart
index 7d78c18..ae6b2aa 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor_from_async.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   // This call is no longer on the stack when the error is thrown.
   /*:main*/ test();
@@ -16,7 +14,7 @@
 }
 
 class Class {
-  @NoInline()
+  @pragma('dart2js:noInline')
   Class() {
     /*2:Class*/ throw '>ExceptionMarker<';
   }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_instance_method.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_instance_method.dart
index ab73200..1accc99 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_instance_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_instance_method.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   var c = new Class();
   c. /*1:main*/ test();
 }
 
 class Class {
-  @NoInline()
+  @pragma('dart2js:noInline')
   test() {
     /*2:Class.test*/ throw '>ExceptionMarker<';
   }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_static_method.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_static_method.dart
index 8f73a1c..a86c5df 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_static_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_static_method.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   Class. /*1:main*/ test();
 }
 
 class Class {
-  @NoInline()
+  @pragma('dart2js:noInline')
   static test() {
     /*2:Class.test*/ throw '>ExceptionMarker<';
   }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method.dart
index e1f29fb..e740ca8 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method.dart
@@ -2,13 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   /*1:main*/ test();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test() {
   /*2:test*/ throw '>ExceptionMarker<';
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method_from_async.dart
index c172214..5b315c6 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method_from_async.dart
@@ -2,19 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   test1();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test1() async {
   await null;
   /*1:test1*/ test2();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test2() {
   /*2:test2*/ throw '>ExceptionMarker<';
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_catch.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_catch.dart
index 9cb808c..59ff684 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_catch.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_catch.dart
@@ -2,13 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   /*1:main*/ test();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test() {
   try {
     /*2:test*/ throw '>ExceptionMarker<';
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_finally.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_finally.dart
index 7ebaf9a..c802027 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_finally.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_finally.dart
@@ -2,13 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-
 main() {
   /*1:main*/ test();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test() {
   try {
     /*2:test*/ throw '>ExceptionMarker<';
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart b/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
index 5d4d3b7..a4a6fa0 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
@@ -8,6 +8,7 @@
 import 'package:args/args.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/dart2js.dart' as entry;
 
 import 'package:sourcemap_testing/src/stacktrace_helper.dart';
@@ -83,6 +84,7 @@
       '-o$output',
       '--libraries-spec=sdk/lib/libraries.json',
       '--packages=${Platform.packageConfig}',
+      Flags.testMode,
       input,
     ]..addAll(options);
     print("Compiling dart2js ${arguments.join(' ')}");
diff --git a/tests/compiler/dart2js_extra/22776_test.dart b/tests/compiler/dart2js_extra/22776_test.dart
index 8c355f9..80dbffd1 100644
--- a/tests/compiler/dart2js_extra/22776_test.dart
+++ b/tests/compiler/dart2js_extra/22776_test.dart
@@ -17,6 +17,6 @@
   }
 }
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 id(x) => x;
diff --git a/tests/compiler/dart2js_extra/23404_test.dart b/tests/compiler/dart2js_extra/23404_test.dart
index 65dd8fb..d3b9f46 100644
--- a/tests/compiler/dart2js_extra/23404_test.dart
+++ b/tests/compiler/dart2js_extra/23404_test.dart
@@ -11,8 +11,8 @@
 foo([a = '\u00a0']) => a;
 bar() => '';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 main() {
diff --git a/tests/compiler/dart2js_extra/23432_test.dart b/tests/compiler/dart2js_extra/23432_test.dart
index 2333edb..bbb32ff 100644
--- a/tests/compiler/dart2js_extra/23432_test.dart
+++ b/tests/compiler/dart2js_extra/23432_test.dart
@@ -15,8 +15,8 @@
   }
 }
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 get NEVER => false;
 
 main() {
diff --git a/tests/compiler/dart2js_extra/23828_test.dart b/tests/compiler/dart2js_extra/23828_test.dart
index 53c2221..be5edd5 100644
--- a/tests/compiler/dart2js_extra/23828_test.dart
+++ b/tests/compiler/dart2js_extra/23828_test.dart
@@ -6,8 +6,8 @@
 // Used to fail when methods contain a name starting with `get`
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 class MA {
diff --git a/tests/compiler/dart2js_extra/27199_test.dart b/tests/compiler/dart2js_extra/27199_test.dart
index d4150bf..b2d2fd5 100644
--- a/tests/compiler/dart2js_extra/27199_test.dart
+++ b/tests/compiler/dart2js_extra/27199_test.dart
@@ -16,8 +16,8 @@
   Map<String, ItemListFilter<T>> f = {};
 }
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 main() {
diff --git a/tests/compiler/dart2js_extra/27323_test.dart b/tests/compiler/dart2js_extra/27323_test.dart
index 8e2a919..c8439ec 100644
--- a/tests/compiler/dart2js_extra/27323_test.dart
+++ b/tests/compiler/dart2js_extra/27323_test.dart
@@ -14,7 +14,7 @@
   foo<U, V>() => [U, V];
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(dynamic x) {
   dynamic typeArguments = x.foo<int, String>();
   Expect.equals(int, typeArguments[0]);
diff --git a/tests/compiler/dart2js_extra/28749_test.dart b/tests/compiler/dart2js_extra/28749_test.dart
index 1795ea6..0735aa7 100644
--- a/tests/compiler/dart2js_extra/28749_test.dart
+++ b/tests/compiler/dart2js_extra/28749_test.dart
@@ -19,12 +19,12 @@
 
 class B<W> {
   final field = new Wrap<ConvertFactory<W>>();
-  @NoInline()
+  @pragma('dart2js:noInline')
   B();
 }
 
 class Wrap<X> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   Wrap();
 }
 
diff --git a/tests/compiler/dart2js_extra/33572_test.dart b/tests/compiler/dart2js_extra/33572_test.dart
index b8d475f..2721bf7 100644
--- a/tests/compiler/dart2js_extra/33572_test.dart
+++ b/tests/compiler/dart2js_extra/33572_test.dart
@@ -5,7 +5,6 @@
 // Regression test for issue 32853.
 
 import "package:expect/expect.dart";
-import "package:meta/dart2js.dart" show noInline;
 
 class A {
   final x = null;
@@ -20,7 +19,7 @@
   test(a2, null, 2);
 }
 
-@noInline
+@pragma('dart2js:noInline')
 test(a, expectedX, expectedY) {
   Expect.equals(expectedX, a.x);
   Expect.equals(expectedY, a.y);
diff --git a/tests/compiler/dart2js_extra/34156_test.dart b/tests/compiler/dart2js_extra/34156_test.dart
index c579faf..f4dbb81 100644
--- a/tests/compiler/dart2js_extra/34156_test.dart
+++ b/tests/compiler/dart2js_extra/34156_test.dart
@@ -2,10 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/dart2js.dart' as dart2js;
 import 'package:expect/expect.dart';
 
-@dart2js.tryInline
+@pragma('dart2js:tryInline')
 // This function should not be inlined. Multiple returns and try-catch cannot
 // currently be inlined correctly.
 method() {
diff --git a/tests/compiler/dart2js_extra/34701_test.dart b/tests/compiler/dart2js_extra/34701_test.dart
index 5612791..708024f 100644
--- a/tests/compiler/dart2js_extra/34701_test.dart
+++ b/tests/compiler/dart2js_extra/34701_test.dart
@@ -8,22 +8,21 @@
 
 import 'dart:async';
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 class A {
-  @noInline //# 01: ok
+  @pragma('dart2js:noInline') //# 01: ok
   Future<T> _foo<T>(FutureOr<T> Function() f) async {
     return await f();
   }
 
-  @noInline //# 01: continued
+  @pragma('dart2js:noInline') //# 01: continued
   Future<String> get m async => _foo(() => "a");
 }
 
 class M {}
 
 class B extends A with M {
-  @noInline //# 01: continued
+  @pragma('dart2js:noInline') //# 01: continued
   Future<T> _foo<T>(FutureOr<T> Function() f) => super._foo(f);
 }
 
diff --git a/tests/compiler/dart2js_extra/35853_test.dart b/tests/compiler/dart2js_extra/35853_test.dart
new file mode 100644
index 0000000..3fe033ac
--- /dev/null
+++ b/tests/compiler/dart2js_extra/35853_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+typedef F1 = int Function(int);
+typedef F2 = int Function(int);
+typedef F3 = int Function(double);
+
+@pragma('dart2js:noInline')
+id(x) => x;
+
+main() {
+  var f1 = F1;
+  var f2 = F2;
+  var f3 = F3;
+  Expect.isTrue(f1 == f2);
+  var result12 = identical(f1, f2);
+  Expect.isFalse(f1 == f3);
+  Expect.isFalse(identical(f1, f3));
+  Expect.isFalse(f2 == f3);
+  Expect.isFalse(identical(f2, f3));
+
+  var g1 = id(F1);
+  var g2 = id(F2);
+  var g3 = id(F3);
+  Expect.isTrue(g1 == g2);
+  Expect.equals(result12, identical(g1, g2));
+  Expect.isFalse(g1 == g3);
+  Expect.isFalse(identical(g1, g3));
+  Expect.isFalse(g2 == g3);
+  Expect.isFalse(identical(g2, g3));
+}
diff --git a/tests/compiler/dart2js_extra/35965a_test.dart b/tests/compiler/dart2js_extra/35965a_test.dart
new file mode 100644
index 0000000..56a3d7a
--- /dev/null
+++ b/tests/compiler/dart2js_extra/35965a_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for issue 35965.
+//
+// The combination of generator bodies on mixin methods with super-calls caused
+// various kinds of broken generated JavaScript.
+//
+//  - The generator body name had unescaped '&' symbols from the Kernel
+//    synthesized super-mixin-application class.
+//  - The super-mixin-application class was missing the generator body because
+//    it did not expect injected members.
+
+import 'dart:async';
+
+abstract class II {
+  bar();
+}
+
+mixin M on II {
+  // The parameter type check causes the generator to have a body.
+  //
+  // The super call causes the body to be on the super mixin application.
+  //
+  // The super call causes the body to have a name depending on the super mixin
+  // application name.
+  Future<T> foo<T>(T a) async {
+    super.bar();
+    return a;
+  }
+
+  // The parameter type check causes the generator to have a body.
+  //
+  // The super call causes 'fred' to be on the super mixin application.
+  //
+  // The super call causes the closure's call method's generator to have a name
+  // depending on the super mixin application name.
+  fred<T>() => (T a) async {
+        super.bar();
+        return a;
+      };
+}
+
+class BB implements II {
+  bar() {
+    print('BB.bar');
+  }
+}
+
+class UU extends BB with M {}
+
+main() async {
+  print('hello');
+  var uu = UU();
+
+  print(await uu.foo<int>(1));
+  print(await uu.foo<String>("one"));
+
+  print(await uu.fred<int>()(1));
+  print(await uu.fred<String>()("uno"));
+}
diff --git a/tests/compiler/dart2js_extra/assert_with_message_test.dart b/tests/compiler/dart2js_extra/assert_with_message_test.dart
index e860713..993ab11 100644
--- a/tests/compiler/dart2js_extra/assert_with_message_test.dart
+++ b/tests/compiler/dart2js_extra/assert_with_message_test.dart
@@ -4,8 +4,8 @@
 
 import "package:expect/expect.dart";
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 confuse(x) => x;
 
 testFalse(name, fault) {
diff --git a/tests/compiler/dart2js_extra/big_allocation_expression_test.dart b/tests/compiler/dart2js_extra/big_allocation_expression_test.dart
index 4c59f6d..30653a3 100644
--- a/tests/compiler/dart2js_extra/big_allocation_expression_test.dart
+++ b/tests/compiler/dart2js_extra/big_allocation_expression_test.dart
@@ -12,7 +12,7 @@
 
   factory A(a, x) = A.q;
 
-  // @NoInline()  // This annotation causes the test to compile on SSA backend.
+  // @pragma('dart2js:noInline')  // This annotation causes the test to compile on SSA backend.
   A.q(this.a, x) : b = x == null ? null : new W(x);
 }
 
diff --git a/tests/compiler/dart2js_extra/bounds_check1a_test.dart b/tests/compiler/dart2js_extra/bounds_check1a_test.dart
index 20136a7..b42ca0d 100644
--- a/tests/compiler/dart2js_extra/bounds_check1a_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check1a_test.dart
@@ -12,6 +12,6 @@
 }
 
 class Class {
-  @NoInline()
+  @pragma('dart2js:noInline')
   method<T extends num>() => null;
 }
diff --git a/tests/compiler/dart2js_extra/bounds_check2a_test.dart b/tests/compiler/dart2js_extra/bounds_check2a_test.dart
index 74bc928..654c71b 100644
--- a/tests/compiler/dart2js_extra/bounds_check2a_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check2a_test.dart
@@ -12,6 +12,6 @@
 }
 
 class Class<T> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   method<S extends T>() => null;
 }
diff --git a/tests/compiler/dart2js_extra/bounds_check3a_test.dart b/tests/compiler/dart2js_extra/bounds_check3a_test.dart
index 103ab95..482b8ed 100644
--- a/tests/compiler/dart2js_extra/bounds_check3a_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check3a_test.dart
@@ -12,6 +12,6 @@
 }
 
 class Class {
-  @NoInline()
+  @pragma('dart2js:noInline')
   method<S extends num>() => S;
 }
diff --git a/tests/compiler/dart2js_extra/bounds_check4a_test.dart b/tests/compiler/dart2js_extra/bounds_check4a_test.dart
index f230b2f..49e8d42 100644
--- a/tests/compiler/dart2js_extra/bounds_check4a_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check4a_test.dart
@@ -12,6 +12,6 @@
 }
 
 class Class<T> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   method<S extends T>() => S;
 }
diff --git a/tests/compiler/dart2js_extra/call_is_function_test.dart b/tests/compiler/dart2js_extra/call_is_function_test.dart
index 8bafb85..8907cad 100644
--- a/tests/compiler/dart2js_extra/call_is_function_test.dart
+++ b/tests/compiler/dart2js_extra/call_is_function_test.dart
@@ -3,13 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 class A {
   call() {}
 }
 
-@noInline
+@pragma('dart2js:noInline')
 test(o) => o is Function;
 
 main() {
diff --git a/tests/compiler/dart2js_extra/call_signature_test.dart b/tests/compiler/dart2js_extra/call_signature_test.dart
index d33feed..20978d5 100644
--- a/tests/compiler/dart2js_extra/call_signature_test.dart
+++ b/tests/compiler/dart2js_extra/call_signature_test.dart
@@ -13,11 +13,11 @@
 }
 
 class B<T> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   m(f) => f is Function(T);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 create() => new B<A<int>>();
 
 main() {
diff --git a/tests/compiler/dart2js_extra/checked_setter_test.dart b/tests/compiler/dart2js_extra/checked_setter_test.dart
index 2846015..60ca4fa 100644
--- a/tests/compiler/dart2js_extra/checked_setter_test.dart
+++ b/tests/compiler/dart2js_extra/checked_setter_test.dart
@@ -12,7 +12,7 @@
   int field;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 assign(d) {
   d.field = 0;
 }
diff --git a/tests/compiler/dart2js_extra/closure_signature_unneeded_test.dart b/tests/compiler/dart2js_extra/closure_signature_unneeded_test.dart
index 7712dad..88534c7 100644
--- a/tests/compiler/dart2js_extra/closure_signature_unneeded_test.dart
+++ b/tests/compiler/dart2js_extra/closure_signature_unneeded_test.dart
@@ -5,13 +5,13 @@
 import 'package:expect/expect.dart';
 
 class A<T> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   m() {
     return (T t, String s) {};
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is void Function(int);
 
 main() {
diff --git a/tests/compiler/dart2js_extra/conditional_send_test.dart b/tests/compiler/dart2js_extra/conditional_send_test.dart
index b064f2e..d1a27c1 100644
--- a/tests/compiler/dart2js_extra/conditional_send_test.dart
+++ b/tests/compiler/dart2js_extra/conditional_send_test.dart
@@ -5,8 +5,8 @@
 // SharedOptions=--enable-null-aware-operators
 import "package:expect/expect.dart";
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 class A {
diff --git a/tests/compiler/dart2js_extra/consistent_add_error_test.dart b/tests/compiler/dart2js_extra/consistent_add_error_test.dart
index 79f18f9..fd5840f 100644
--- a/tests/compiler/dart2js_extra/consistent_add_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_add_error_test.dart
@@ -6,8 +6,8 @@
 
 // Test that optimized '+' and slow path '+' produce the same error.
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 void check2(String name, name1, f1, name2, f2) {
diff --git a/tests/compiler/dart2js_extra/consistent_codeUnitAt_error_test.dart b/tests/compiler/dart2js_extra/consistent_codeUnitAt_error_test.dart
index d76bd71..536279b 100644
--- a/tests/compiler/dart2js_extra/consistent_codeUnitAt_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_codeUnitAt_error_test.dart
@@ -7,8 +7,8 @@
 // Test that optimized codeUnitAt and slow path codeUnitAt produce the same
 // error.
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 void check2(String name, name1, f1, name2, f2) {
diff --git a/tests/compiler/dart2js_extra/consistent_index_error_array_test.dart b/tests/compiler/dart2js_extra/consistent_index_error_array_test.dart
index 0a3b726..6afa8a9 100644
--- a/tests/compiler/dart2js_extra/consistent_index_error_array_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_index_error_array_test.dart
@@ -7,8 +7,8 @@
 
 // Test that optimized indexing and slow path indexing produce the same error.
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 class TooHigh {
diff --git a/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart b/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart
index 898933f..45155ff 100644
--- a/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart
@@ -7,8 +7,8 @@
 
 // Test that optimized indexing and slow path indexing produce the same error.
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 class TooHigh {
diff --git a/tests/compiler/dart2js_extra/consistent_index_error_typed_list_test.dart b/tests/compiler/dart2js_extra/consistent_index_error_typed_list_test.dart
index b086cfa..bf198c6 100644
--- a/tests/compiler/dart2js_extra/consistent_index_error_typed_list_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_index_error_typed_list_test.dart
@@ -7,8 +7,8 @@
 
 // Test that optimized indexing and slow path indexing produce the same error.
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 class TooHigh {
diff --git a/tests/compiler/dart2js_extra/consistent_null_add_error_test.dart b/tests/compiler/dart2js_extra/consistent_null_add_error_test.dart
index 5417ee0..64ad07d 100644
--- a/tests/compiler/dart2js_extra/consistent_null_add_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_null_add_error_test.dart
@@ -8,8 +8,8 @@
 //
 // They don't, sometimes we generate null.$add, sometimes JSNull_methods.$add.
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 void check2(String name, name1, f1, name2, f2) {
diff --git a/tests/compiler/dart2js_extra/consistent_subtract_error_test.dart b/tests/compiler/dart2js_extra/consistent_subtract_error_test.dart
index 2c839f7..a847937 100644
--- a/tests/compiler/dart2js_extra/consistent_subtract_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_subtract_error_test.dart
@@ -8,8 +8,8 @@
 
 // Test that optimized '-' and slow path '-' produce the same error.
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 void check2(String name, name1, f1, name2, f2) {
diff --git a/tests/compiler/dart2js_extra/deferred/interface_type_variable_test.dart b/tests/compiler/dart2js_extra/deferred/interface_type_variable_test.dart
index df522df..db4b4f2 100644
--- a/tests/compiler/dart2js_extra/deferred/interface_type_variable_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/interface_type_variable_test.dart
@@ -16,5 +16,5 @@
   });
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 dontInline(x) => x;
diff --git a/tests/compiler/dart2js_extra/deferred/type_literal_test.dart b/tests/compiler/dart2js_extra/deferred/type_literal_test.dart
index d578d8d..25e2c32 100644
--- a/tests/compiler/dart2js_extra/deferred/type_literal_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/type_literal_test.dart
@@ -17,5 +17,5 @@
   Expect.isFalse(confuse(a.A) == confuse(a.B));
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 confuse(x) => x;
diff --git a/tests/compiler/dart2js_extra/deferred/typedef_test.dart b/tests/compiler/dart2js_extra/deferred/typedef_test.dart
index 1ad34a3..fa4cc1f 100644
--- a/tests/compiler/dart2js_extra/deferred/typedef_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/typedef_test.dart
@@ -19,5 +19,5 @@
   Expect.isFalse(confuse(a.C) == confuse(a.D));
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 confuse(x) => x;
diff --git a/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_test.dart b/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_test.dart
index 17f6045..3bd8b77 100644
--- a/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_test.dart
@@ -16,5 +16,5 @@
   });
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 dontInline(x) => x;
diff --git a/tests/compiler/dart2js_extra/deferred_inheritance_test.dart b/tests/compiler/dart2js_extra/deferred_inheritance_test.dart
index ff7005c..2443682 100644
--- a/tests/compiler/dart2js_extra/deferred_inheritance_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_inheritance_test.dart
@@ -18,8 +18,8 @@
 /// If the check `y is A` is generated as `y.$isA` then the issue is not
 /// exposed. We use `AssumeDynamic` to ensure that we generate as `y instanceof
 /// A` in JS.
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 check(y) => Expect.isTrue(y is A);
 
 main() {
diff --git a/tests/compiler/dart2js_extra/dynamic_invocation_test.dart b/tests/compiler/dart2js_extra/dynamic_invocation_test.dart
index e36f6b0..28bfdb3 100644
--- a/tests/compiler/dart2js_extra/dynamic_invocation_test.dart
+++ b/tests/compiler/dart2js_extra/dynamic_invocation_test.dart
@@ -17,7 +17,7 @@
   dynamic f2 = new C2();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 id(o) => o;
 
 main() {
diff --git a/tests/compiler/dart2js_extra/effectively_constant_fields_test.dart b/tests/compiler/dart2js_extra/effectively_constant_fields_test.dart
new file mode 100644
index 0000000..6c9c18b
--- /dev/null
+++ b/tests/compiler/dart2js_extra/effectively_constant_fields_test.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+_field4() => 4;
+
+class Class1 {
+  var field1 = 0;
+
+  @pragma('dart2js:noElision')
+  var field2 = 1;
+
+  var field3 = 2;
+
+  var field4 = _field4;
+}
+
+@pragma('dart2js:noInline')
+method1(Class1 c) {
+  return c.field1;
+}
+
+@pragma('dart2js:noInline')
+method2(Class1 c) {
+  return c.field2;
+}
+
+class Class2 {
+  var field3 = 3;
+}
+
+@pragma('dart2js:noInline')
+method3(c) {
+  return c.field3;
+}
+
+class Class3 extends Class1 {
+  @pragma('dart2js:noInline')
+  method4() {
+    return super.field1;
+  }
+}
+
+class Class4 extends Class1 {
+  @pragma('dart2js:noInline')
+  method5() {
+    return super.field4();
+  }
+}
+
+@pragma('dart2js:noInline')
+method6(Class1 c) {
+  return c.field1;
+}
+
+@pragma('dart2js:noInline')
+method7(Class1 c) {
+  return c.field4();
+}
+
+main() {
+  Expect.equals(0, method1(new Class1()));
+  Expect.equals(1, method2(new Class1()));
+  Expect.equals(2, method3(new Class1()));
+  Expect.equals(3, method3(new Class2()));
+  Expect.equals(0, new Class3().method4());
+  Expect.equals(4, new Class4().method5());
+  Expect.equals(0, method6(new Class1()));
+  Expect.throws(() => method6(null));
+  Expect.equals(4, method7(new Class1()));
+  Expect.throws(() => method7(null));
+}
diff --git a/tests/compiler/dart2js_extra/generic_class_is_test.dart b/tests/compiler/dart2js_extra/generic_class_is_test.dart
index d97cb7c..6026b8d 100644
--- a/tests/compiler/dart2js_extra/generic_class_is_test.dart
+++ b/tests/compiler/dart2js_extra/generic_class_is_test.dart
@@ -3,14 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
 
 class A<T> {}
 
 class A1 implements A<C1> {}
 
 class B<T> {
-  @noInline
+  @pragma('dart2js:noInline')
   method(var t) => t is T;
 }
 
diff --git a/tests/compiler/dart2js_extra/generic_in_mixin_field_test.dart b/tests/compiler/dart2js_extra/generic_in_mixin_field_test.dart
index cb5e219..6018432 100644
--- a/tests/compiler/dart2js_extra/generic_in_mixin_field_test.dart
+++ b/tests/compiler/dart2js_extra/generic_in_mixin_field_test.dart
@@ -19,7 +19,7 @@
 
 class Class extends SuperClass<int> {}
 
-@NoInline()
+@pragma('dart2js:noInline')
 createClass() => new Class();
 
 main() {
diff --git a/tests/compiler/dart2js_extra/generic_in_redirect_test.dart b/tests/compiler/dart2js_extra/generic_in_redirect_test.dart
index 6da3750..35e4564 100644
--- a/tests/compiler/dart2js_extra/generic_in_redirect_test.dart
+++ b/tests/compiler/dart2js_extra/generic_in_redirect_test.dart
@@ -22,7 +22,7 @@
 
 class Class extends SuperClass<int> {}
 
-@NoInline()
+@pragma('dart2js:noInline')
 createClass() => new Class();
 
 main() {
diff --git a/tests/compiler/dart2js_extra/generic_in_super_test.dart b/tests/compiler/dart2js_extra/generic_in_super_test.dart
index a4f52d4..79bc8c9 100644
--- a/tests/compiler/dart2js_extra/generic_in_super_test.dart
+++ b/tests/compiler/dart2js_extra/generic_in_super_test.dart
@@ -23,7 +23,7 @@
 
 class Class extends SuperClass<int> {}
 
-@NoInline()
+@pragma('dart2js:noInline')
 createClass() => new Class();
 
 main() {
diff --git a/tests/compiler/dart2js_extra/generic_method_dynamic_is_test.dart b/tests/compiler/dart2js_extra/generic_method_dynamic_is_test.dart
index 4f3a720..ff95b2b 100644
--- a/tests/compiler/dart2js_extra/generic_method_dynamic_is_test.dart
+++ b/tests/compiler/dart2js_extra/generic_method_dynamic_is_test.dart
@@ -13,16 +13,16 @@
 class D {}
 
 class E {
-  @NoInline()
+  @pragma('dart2js:noInline')
   m<T>() => new C<T>();
 }
 
 class F {
-  @NoInline()
+  @pragma('dart2js:noInline')
   m<T>() => false;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is C<A>;
 
 main() {
diff --git a/tests/compiler/dart2js_extra/generic_method_static_is_test.dart b/tests/compiler/dart2js_extra/generic_method_static_is_test.dart
index 946fa1c..c05be8c 100644
--- a/tests/compiler/dart2js_extra/generic_method_static_is_test.dart
+++ b/tests/compiler/dart2js_extra/generic_method_static_is_test.dart
@@ -12,10 +12,10 @@
 
 class D {}
 
-@NoInline()
+@pragma('dart2js:noInline')
 m<T>() => new C<T>();
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is C<A>;
 
 main() {
diff --git a/tests/compiler/dart2js_extra/hash_code_test.dart b/tests/compiler/dart2js_extra/hash_code_test.dart
index 8de6313..cb6789c 100644
--- a/tests/compiler/dart2js_extra/hash_code_test.dart
+++ b/tests/compiler/dart2js_extra/hash_code_test.dart
@@ -7,8 +7,8 @@
 // dart2js specific test to make sure hashCode on intercepted types behaves as
 // intended.
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 class Hasher {
diff --git a/tests/compiler/dart2js_extra/if_null_test.dart b/tests/compiler/dart2js_extra/if_null_test.dart
index ed3f23a5..8b16c6b 100644
--- a/tests/compiler/dart2js_extra/if_null_test.dart
+++ b/tests/compiler/dart2js_extra/if_null_test.dart
@@ -4,8 +4,8 @@
 
 import "package:expect/expect.dart";
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 main(args) {
diff --git a/tests/compiler/dart2js_extra/instantiation_stub_test.dart b/tests/compiler/dart2js_extra/instantiation_stub_test.dart
index d62266f..23003bc 100644
--- a/tests/compiler/dart2js_extra/instantiation_stub_test.dart
+++ b/tests/compiler/dart2js_extra/instantiation_stub_test.dart
@@ -7,30 +7,30 @@
 import 'package:expect/expect.dart';
 
 // This needs one-arg instantiation.
-@NoInline()
+@pragma('dart2js:noInline')
 T f1a<T>(T t) => t;
 
 // This needs no instantiation because it is not closurized.
-@NoInline()
+@pragma('dart2js:noInline')
 T f1b<T>(T t1, T t2) => t1;
 
 class Class {
   // This needs two-arg instantiation.
-  @NoInline()
+  @pragma('dart2js:noInline')
   bool f2a<T, S>(T t, S s) => t == s;
 
   // This needs no instantiation because it is not closurized.
-  @NoInline()
+  @pragma('dart2js:noInline')
   bool f2b<T, S>(T t, S s1, S s2) => t == s1;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 int method1(int i, int Function(int) f) => f(i);
 
-@NoInline()
+@pragma('dart2js:noInline')
 bool method2(int a, int b, bool Function(int, int) f) => f(a, b);
 
-@NoInline()
+@pragma('dart2js:noInline')
 int method3(int a, int b, int c, int Function(int, int, int) f) => f(a, b, c);
 
 main() {
diff --git a/tests/compiler/dart2js_extra/interceptor_named_arguments_test.dart b/tests/compiler/dart2js_extra/interceptor_named_arguments_test.dart
index 32e9282..407ac93 100644
--- a/tests/compiler/dart2js_extra/interceptor_named_arguments_test.dart
+++ b/tests/compiler/dart2js_extra/interceptor_named_arguments_test.dart
@@ -19,27 +19,27 @@
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 bool wontTell(bool x) => x;
 
 // Ensure that we use the interceptor only once per context so that we
 // actually get a one-shot interceptor. This is a little brittle...
-@NoInline()
+@pragma('dart2js:noInline')
 testA(thing) {
   Expect.equals(0, thing.createFragment(null));
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testB(thing) {
   Expect.equals(2, thing.createFragment(null, validator: 1));
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testC(thing) {
   Expect.equals(1, thing.createFragment(null, treeSanitizer: 1));
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testD(thing) {
   Expect.equals(3, thing.createFragment(null, validator: 1, treeSanitizer: 1));
 }
diff --git a/tests/compiler/dart2js_extra/js_array_index_error_test.dart b/tests/compiler/dart2js_extra/js_array_index_error_test.dart
index be5e310..8af893a 100644
--- a/tests/compiler/dart2js_extra/js_array_index_error_test.dart
+++ b/tests/compiler/dart2js_extra/js_array_index_error_test.dart
@@ -7,8 +7,8 @@
 
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 Error getError(action(), name, part) {
diff --git a/tests/compiler/dart2js_extra/js_array_removeLast_error_test.dart b/tests/compiler/dart2js_extra/js_array_removeLast_error_test.dart
index bca0eab..5241f55 100644
--- a/tests/compiler/dart2js_extra/js_array_removeLast_error_test.dart
+++ b/tests/compiler/dart2js_extra/js_array_removeLast_error_test.dart
@@ -7,8 +7,8 @@
 
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 Error getError(action()) {
diff --git a/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart b/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart
index c7d3ec5..b622a6a 100644
--- a/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart
+++ b/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart
@@ -11,7 +11,7 @@
   return local;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is S Function<S>(S);
 
 main() {
diff --git a/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart b/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart
index d6f4f31..f1df515 100644
--- a/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart
+++ b/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart
@@ -92,7 +92,7 @@
   return local;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is num Function(num);
 
 main() {
diff --git a/tests/compiler/dart2js_extra/local_function_signatures_test.dart b/tests/compiler/dart2js_extra/local_function_signatures_test.dart
index 76ce246e..11bfb83 100644
--- a/tests/compiler/dart2js_extra/local_function_signatures_test.dart
+++ b/tests/compiler/dart2js_extra/local_function_signatures_test.dart
@@ -44,7 +44,7 @@
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is num Function(num);
 
 main() {
diff --git a/tests/compiler/dart2js_extra/local_signature_test.dart b/tests/compiler/dart2js_extra/local_signature_test.dart
index 8d39233..eac7ab0 100644
--- a/tests/compiler/dart2js_extra/local_signature_test.dart
+++ b/tests/compiler/dart2js_extra/local_signature_test.dart
@@ -4,14 +4,14 @@
 
 import 'package:expect/expect.dart';
 
-@NoInline()
+@pragma('dart2js:noInline')
 test1(o) => o is Function(int);
 
-@NoInline()
+@pragma('dart2js:noInline')
 test2(o) => o is Function<T>(T);
 
 class C<S> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   test(bool expected) {
     local1(int i) {}
     local2<T>(T t) {}
diff --git a/tests/compiler/dart2js_extra/method_signatures_strong_test.dart b/tests/compiler/dart2js_extra/method_signatures_strong_test.dart
index d23ed34..3e3f256 100644
--- a/tests/compiler/dart2js_extra/method_signatures_strong_test.dart
+++ b/tests/compiler/dart2js_extra/method_signatures_strong_test.dart
@@ -32,7 +32,7 @@
 
 num method9<T>(num n, T t) => null;
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is num Function(num);
 
 forceInstantiation(num Function(num) f) => f;
diff --git a/tests/compiler/dart2js_extra/method_signatures_test.dart b/tests/compiler/dart2js_extra/method_signatures_test.dart
index 569b329..79d0c7f 100644
--- a/tests/compiler/dart2js_extra/method_signatures_test.dart
+++ b/tests/compiler/dart2js_extra/method_signatures_test.dart
@@ -32,7 +32,7 @@
 
 Object method9(num n) => null;
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o is num Function(num);
 
 main() {
diff --git a/tests/compiler/dart2js_extra/minus_zero_test.dart b/tests/compiler/dart2js_extra/minus_zero_test.dart
index 3b52434..bc3c0b6 100644
--- a/tests/compiler/dart2js_extra/minus_zero_test.dart
+++ b/tests/compiler/dart2js_extra/minus_zero_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart";
 
-@NoInline()
+@pragma('dart2js:noInline')
 num minusZero() => -0;
 
 void main() {
diff --git a/tests/compiler/dart2js_extra/mixin_subtype_test.dart b/tests/compiler/dart2js_extra/mixin_subtype_test.dart
index c96789a..287776c 100644
--- a/tests/compiler/dart2js_extra/mixin_subtype_test.dart
+++ b/tests/compiler/dart2js_extra/mixin_subtype_test.dart
@@ -36,7 +36,7 @@
 
 class E5 extends D5 {}
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) {}
 
 main() {
@@ -50,4 +50,4 @@
   Expect.subtype<D4, M4>();
   Expect.subtype<D5, M5>();
   Expect.subtype<E5, M5>();
-}
\ No newline at end of file
+}
diff --git a/tests/compiler/dart2js_extra/named_mixin_runtime_type_test.dart b/tests/compiler/dart2js_extra/named_mixin_runtime_type_test.dart
index ec4adf2..9059803 100644
--- a/tests/compiler/dart2js_extra/named_mixin_runtime_type_test.dart
+++ b/tests/compiler/dart2js_extra/named_mixin_runtime_type_test.dart
@@ -10,7 +10,7 @@
 
 class C = B with A;
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => o.runtimeType;
 
 main() {
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong11_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong11_test.dart
index bc0a85c..ad09aef 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong11_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong11_test.dart
@@ -36,6 +36,6 @@
   Expect.equals(-1, (a._m4)());
 }
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
diff --git a/tests/compiler/dart2js_extra/operator_test.dart b/tests/compiler/dart2js_extra/operator_test.dart
index 0f757c2..65edd95 100644
--- a/tests/compiler/dart2js_extra/operator_test.dart
+++ b/tests/compiler/dart2js_extra/operator_test.dart
@@ -4,18 +4,18 @@
 
 import "package:expect/expect.dart";
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
-@NoInline()
+@pragma('dart2js:noInline')
 asNum(x) {
   var result = confuse(x);
   if (result is num) return result;
   throw new ArgumentError.value(x);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 uint31(x) {
   var result = confuse(x);
   if (x is int) {
@@ -25,7 +25,7 @@
   throw new ArgumentError('Not uint31: $x');
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 uint32(x) {
   var result = confuse(x);
   if (x is int) {
@@ -35,67 +35,67 @@
   throw new ArgumentError('Not uint32: $x');
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 int zero() {
   return 0;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 int one() {
   return 1;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 int minus1() {
   return 0 - 1;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 int minus2() {
   return 0 - 2;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 int two() {
   return 2;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 int three() {
   return 3;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 int five() {
   return 5;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 int minus5() {
   return 0 - 5;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 int ninetyNine() {
   return 99;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 int four99() {
   return 499;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 int four99times99() {
   return 499 * 99;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 int four99times99plus1() {
   return 499 * 99 + 1;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void addTest() {
   var m1 = 0 - 1;
   Expect.equals(0, 0 + 0);
@@ -111,7 +111,7 @@
   Expect.equals(2, one() + one());
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void subTest() {
   var m1 = 0 - 1;
   Expect.equals(0, 0 - 0);
@@ -123,7 +123,7 @@
   Expect.equals(0, one() - one());
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void mulTest() {
   var m1 = 0 - 1;
   Expect.equals(0, 0 * 0);
@@ -135,7 +135,7 @@
   Expect.equals(49401, four99() * 99);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void divTest() {
   var m1 = 0.0 - 1.0;
   var m2 = 0 - 2;
@@ -158,7 +158,7 @@
   Expect.equals(1.5, confuse(150) / confuse(100));
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void tdivTest() {
   var m1 = 0 - 1;
   var m2 = 0 - 2;
@@ -232,7 +232,7 @@
   Expect.throws(() => double.nan ~/ 2);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void modTest() {
   var m5 = 0 - 5;
   var m3 = 0 - 3;
@@ -250,7 +250,7 @@
   Expect.equals(2, five() % m3);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void remainderTest() {
   var m5 = 0 - 5;
   Expect.equals(2, confuse(5).remainder(3));
@@ -279,7 +279,7 @@
   Expect.equals(2, five().remainder(-3));
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void shlTest() {
   Expect.equals(2, 1 << 1);
   Expect.equals(8, 1 << 3);
@@ -298,7 +298,7 @@
   Expect.equals(24, 3 << asNum(3));
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void shrTest() {
   Expect.equals(1, 2 >> 1);
   Expect.equals(1, 8 >> 3);
@@ -318,7 +318,7 @@
   Expect.equals(0, asNum(0xffffffff) >> 32);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void andTest() {
   Expect.equals(2, 10 & 3);
   Expect.equals(7, 15 & 7);
@@ -332,7 +332,7 @@
   Expect.equals(0, asNum(0x7ffffffe) & asNum(1));
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void orTest() {
   Expect.equals(11, 10 | 3);
   Expect.equals(15, 15 | 7);
@@ -346,7 +346,7 @@
   Expect.equals(10, asNum(10) | 10);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void xorTest() {
   Expect.equals(9, 10 ^ 3);
   Expect.equals(8, 15 ^ 7);
@@ -358,12 +358,12 @@
   Expect.equals(6, minus5() ^ -3);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void notTest() {
   Expect.equals(4, ~minus5());
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void negateTest() {
   Expect.equals(minus5(), -5);
   Expect.equals(-5, -five());
@@ -377,7 +377,7 @@
   Expect.equals(3, -asNum(-3));
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void equalsTest() {
   // Equality of normal numbers is already well tested with "Expect.equals".
   Expect.equals(true, true == true);
@@ -421,7 +421,7 @@
   Expect.equals(false, null == falseValue);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void lessTest() {
   var m1 = minus1();
   Expect.equals(true, 1 < 2);
@@ -449,7 +449,7 @@
   Expect.equals(false, minus1() < minus1());
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void lessEqualTest() {
   var m1 = minus1();
   Expect.equals(true, 1 <= 2);
@@ -485,7 +485,7 @@
   Expect.equals(true, minus1() <= minus1());
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void greaterTest() {
   var m1 = minus1();
   Expect.equals(false, 1 > 2);
@@ -513,7 +513,7 @@
   Expect.equals(false, minus1() > minus1());
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void greaterEqualTest() {
   var m1 = minus1();
   Expect.equals(false, 1 >= 2);
diff --git a/tests/compiler/dart2js_extra/replaced_type_variable_test.dart b/tests/compiler/dart2js_extra/replaced_type_variable_test.dart
index f530000..e95ea81 100644
--- a/tests/compiler/dart2js_extra/replaced_type_variable_test.dart
+++ b/tests/compiler/dart2js_extra/replaced_type_variable_test.dart
@@ -13,7 +13,7 @@
 
 class A {}
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(o) => Expect.notEquals('dynamic', '$o');
 
 main() {
diff --git a/tests/compiler/dart2js_extra/round_constant_folding_test.dart b/tests/compiler/dart2js_extra/round_constant_folding_test.dart
index d07788e..9c0a1fe 100644
--- a/tests/compiler/dart2js_extra/round_constant_folding_test.dart
+++ b/tests/compiler/dart2js_extra/round_constant_folding_test.dart
@@ -65,7 +65,8 @@
 const int NI7 = -PI7;
 
 /// Ensures that the behaviour of `action()` is the same as `value.round()`.
-@NoInline() // To ensure 'value.round()' has a non-constant receiver.
+@pragma(
+    'dart2js:noInline') // To ensure 'value.round()' has a non-constant receiver.
 check(value, action) {
   var result1, result2;
   try {
@@ -90,7 +91,7 @@
   }
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 void unusedCall(num x) {
   x.round(); // This call should not be removed since it might throw.
 }
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart
index 2358d45..14aa9e3 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart
@@ -5,23 +5,21 @@
 import 'package:expect/expect.dart';
 
 class S {}
+
 class M {}
 
 class SuperC = S with M;
 
-class SuperA {
-}
+class SuperA {}
 
-class SuperB extends SuperA implements SuperC {
-}
+class SuperB extends SuperA implements SuperC {}
 
-mixin Mixin on SuperC, SuperA {
-}
+mixin Mixin on SuperC, SuperA {}
 
 class Class extends SuperB with Mixin {}
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 test(c) {
   Expect.isTrue(c is Mixin, "Unexpected result for $c is Mixin");
   Expect.isTrue(c is SuperC, "Unexpected result for $c is SuperC");
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart
index c0082fa..d29409c 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart
@@ -5,23 +5,21 @@
 import 'package:expect/expect.dart';
 
 class S {}
+
 class M {}
 
 class SuperC = S with M;
 
-class SuperA {
-}
+class SuperA {}
 
-class SuperB extends SuperA implements SuperC {
-}
+class SuperB extends SuperA implements SuperC {}
 
-mixin Mixin on SuperA, SuperC {
-}
+mixin Mixin on SuperA, SuperC {}
 
 class Class extends SuperB with Mixin {}
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 test(c) {
   Expect.isTrue(c is Mixin, "Unexpected result for $c is Mixin");
   Expect.isTrue(c is SuperC, "Unexpected result for $c is SuperC");
diff --git a/tests/compiler/dart2js_extra/switch_test.dart b/tests/compiler/dart2js_extra/switch_test.dart
index 7fbc9d0..9e5eef1 100644
--- a/tests/compiler/dart2js_extra/switch_test.dart
+++ b/tests/compiler/dart2js_extra/switch_test.dart
@@ -60,7 +60,7 @@
 
 var x = 0;
 
-@NoInline()
+@pragma('dart2js:noInline')
 switcher3(val) {
   switch (val) {
     case 1:
diff --git a/tests/compiler/dart2js_extra/truncation_errors_test.dart b/tests/compiler/dart2js_extra/truncation_errors_test.dart
index 2ede4b4..92532f2 100644
--- a/tests/compiler/dart2js_extra/truncation_errors_test.dart
+++ b/tests/compiler/dart2js_extra/truncation_errors_test.dart
@@ -7,8 +7,8 @@
 
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 void find1(expected, thunk) {
@@ -20,8 +20,8 @@
     exceptionText = '$e';
   }
   if (exceptionText == null) {
-    Expect
-        .fail('Expected exception containing "$expected", returned: $returned');
+    Expect.fail(
+        'Expected exception containing "$expected", returned: $returned');
   }
   Expect.isTrue(exceptionText.contains(expected),
       'Expected "$expected" in "$exceptionText"');
diff --git a/tests/compiler/dart2js_extra/useful_error_message_1_test.dart b/tests/compiler/dart2js_extra/useful_error_message_1_test.dart
index 69e2a26..7fbaa6b 100644
--- a/tests/compiler/dart2js_extra/useful_error_message_1_test.dart
+++ b/tests/compiler/dart2js_extra/useful_error_message_1_test.dart
@@ -7,8 +7,8 @@
 
 import "package:expect/expect.dart";
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 class CCCC {
diff --git a/tests/compiler/dart2js_native/js_constant_test.dart b/tests/compiler/dart2js_native/js_constant_test.dart
index bc9837e..40ce27c 100644
--- a/tests/compiler/dart2js_native/js_constant_test.dart
+++ b/tests/compiler/dart2js_native/js_constant_test.dart
@@ -17,7 +17,7 @@
 // `"5"`, then converts it to a number for negation, giving a number result
 // instead of a string result.
 
-@NoInline()
+@pragma('dart2js:noInline')
 checkString(r) {
   Expect.isTrue(
       r is String, 'Expected string, found ${r} of type ${r.runtimeType}');
diff --git a/tests/compiler/dart2js_native/load_elim_refinement_test.dart b/tests/compiler/dart2js_native/load_elim_refinement_test.dart
index d7a090f..ee9dfee 100644
--- a/tests/compiler/dart2js_native/load_elim_refinement_test.dart
+++ b/tests/compiler/dart2js_native/load_elim_refinement_test.dart
@@ -12,7 +12,7 @@
   int b;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 escape(v) {
   g = v;
 }
diff --git a/tests/compiler/dart2js_native/native_method_inlining_test.dart b/tests/compiler/dart2js_native/native_method_inlining_test.dart
index 9d7ddc9..ba0ee3b 100644
--- a/tests/compiler/dart2js_native/native_method_inlining_test.dart
+++ b/tests/compiler/dart2js_native/native_method_inlining_test.dart
@@ -23,7 +23,7 @@
   @pragma('dart2js:noElision')
   static var g;
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   method1(a) {
     g = '(Method1Tag)'; // Tag to identify compiled JavaScript method.
     A x = makeA();
@@ -34,7 +34,7 @@
     return x.foo(3, 10, 30);
   }
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   method2() {
     g = '(Method2Tag)';
     A x = makeA();
@@ -43,7 +43,7 @@
     return r1 + r2;
   }
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   method3() {
     g = '(Method3Tag)';
     A x = makeA();
diff --git a/tests/compiler/dart2js_native/native_mixin_field2_test.dart b/tests/compiler/dart2js_native/native_mixin_field2_test.dart
index 408bdb6..4612391 100644
--- a/tests/compiler/dart2js_native/native_mixin_field2_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_field2_test.dart
@@ -52,7 +52,7 @@
 })()""");
 }
 
-@AssumeDynamic()
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 main() {
diff --git a/tests/compiler/dart2js_native/native_null_frog_test.dart b/tests/compiler/dart2js_native/native_null_frog_test.dart
index dad284a..0abdd35 100644
--- a/tests/compiler/dart2js_native/native_null_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_null_frog_test.dart
@@ -29,7 +29,7 @@
 })()""");
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 staticTests() {
   A a = makeA();
   Expect.equals(null, a.returnNull());
@@ -43,7 +43,7 @@
   Expect.equals(0, a.returnZero());
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 dynamicTests() {
   A a = makeA();
   Expect.equals(null, confuse(a).returnNull());
diff --git a/tests/compiler/dart2js_native/native_testing.dart b/tests/compiler/dart2js_native/native_testing.dart
index 6fb363f..5dcaa24 100644
--- a/tests/compiler/dart2js_native/native_testing.dart
+++ b/tests/compiler/dart2js_native/native_testing.dart
@@ -43,6 +43,6 @@
 ''');
 }
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
diff --git a/tests/compiler/dart2js_native/optimization_hints_test.dart b/tests/compiler/dart2js_native/optimization_hints_test.dart
index f62324e..45ee3ad 100644
--- a/tests/compiler/dart2js_native/optimization_hints_test.dart
+++ b/tests/compiler/dart2js_native/optimization_hints_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:_js_helper' as js;
-
 import 'dart:_foreign_helper' show JS;
 
 import 'package:expect/expect.dart';
@@ -15,8 +13,8 @@
   c.c_field = x;
 }
 
-@js.NoSideEffects()
-@js.NoInline()
+@pragma('dart2js:noSideEffects')
+@pragma('dart2js:noInline')
 bar(d) {
   x = "in bar function";
   d.d_field = x;
@@ -32,14 +30,14 @@
   m() => d_field;
 }
 
-@js.NoSideEffects()
-@js.NoInline()
-@js.NoThrows()
+@pragma('dart2js:noSideEffects')
+@pragma('dart2js:noInline')
+@pragma('dart2js:noThrows')
 baz() {
   throw 'in baz function';
 }
 
-@js.NoInline()
+@pragma('dart2js:noInline')
 geeNoInline() {
   // Use `gee` several times, so `gee` isn't used only once (and thus inlinable
   // independently of its size).
@@ -85,7 +83,7 @@
   gee();
 }
 
-@js.ForceInline()
+@pragma('dart2js:tryInline')
 // Big function that would normally not be inlinable.
 gee([c]) {
   if (c != null) {
@@ -191,7 +189,7 @@
   check(JS('', 'arguments.callee'));
 }
 
-@js.NoInline()
+@pragma('dart2js:noInline')
 check(func) {
   JS('', 'String("in check function")');
   var source = JS('String', 'String(#)', func);
@@ -217,7 +215,7 @@
   JS('', 'String("in simple function")');
 }
 
-@js.NoInline()
+@pragma('dart2js:noInline')
 noinline() {
   JS('', 'String("in noinline function")');
 }
diff --git a/tests/corelib_2/apply_test.dart b/tests/corelib_2/apply_test.dart
index 01f2e1c..25b9ead 100644
--- a/tests/corelib_2/apply_test.dart
+++ b/tests/corelib_2/apply_test.dart
@@ -25,8 +25,8 @@
   int call(int x, int y) => x + y;
 }
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 main() {
diff --git a/tests/corelib_2/bigint_from_test.dart b/tests/corelib_2/bigint_from_test.dart
index c25e457..feb47eb 100644
--- a/tests/corelib_2/bigint_from_test.dart
+++ b/tests/corelib_2/bigint_from_test.dart
@@ -2,6 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// Testing Bigints with and without intrinsics.
+// VMOptions=--intrinsify --no-enable-asserts
+// VMOptions=--intrinsify --enable-asserts
+// VMOptions=--no-intrinsify --enable-asserts
+// VMOptions=--optimization-counter-threshold=5 --no-background-compilation
+
 import "package:expect/expect.dart";
 
 import 'dart:math' show pow;
diff --git a/tests/corelib_2/bigint_js_test.dart b/tests/corelib_2/bigint_js_test.dart
index 7b982b7..ebebc25d 100644
--- a/tests/corelib_2/bigint_js_test.dart
+++ b/tests/corelib_2/bigint_js_test.dart
@@ -2,6 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// Testing Bigints with and without intrinsics.
+// VMOptions=--intrinsify --no-enable-asserts
+// VMOptions=--intrinsify --enable-asserts
+// VMOptions=--no-intrinsify --enable-asserts
+// VMOptions=--optimization-counter-threshold=5 --no-background-compilation
+
 // Test for JavaScript specific BigInt behaviour. Any JavaScript number (double)
 // that is an integral value is a Dart 'int' value, so any BigInt that has a
 // value that is exactly a double integral value should return `true` for
diff --git a/tests/corelib_2/bigint_parse_radix_test.dart b/tests/corelib_2/bigint_parse_radix_test.dart
index ad94bbf..ad7468c 100644
--- a/tests/corelib_2/bigint_parse_radix_test.dart
+++ b/tests/corelib_2/bigint_parse_radix_test.dart
@@ -3,9 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // Testing Bigints with and without intrinsics.
-// VMOptions=
-// VMOptions=--no_intrinsify
-// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
+// VMOptions=--intrinsify --no-enable-asserts
+// VMOptions=--intrinsify --enable-asserts
+// VMOptions=--no-intrinsify --enable-asserts
+// VMOptions=--optimization-counter-threshold=5 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/corelib_2/bigint_test.dart b/tests/corelib_2/bigint_test.dart
index 7ad5309..46b69e1 100644
--- a/tests/corelib_2/bigint_test.dart
+++ b/tests/corelib_2/bigint_test.dart
@@ -3,9 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // Testing Bigints with and without intrinsics.
-// VMOptions=
-// VMOptions=--no_intrinsify
-// VMOptions=--optimization_counter_threshold=5 --no-background_compilation
+// VMOptions=--intrinsify --no-enable-asserts
+// VMOptions=--intrinsify --enable-asserts
+// VMOptions=--no-intrinsify --enable-asserts
+// VMOptions=--optimization-counter-threshold=5 --no-background-compilation
 
 import "package:expect/expect.dart";
 
diff --git a/tests/corelib_2/map_set_undefined_test.dart b/tests/corelib_2/map_set_undefined_test.dart
new file mode 100644
index 0000000..08f42bc
--- /dev/null
+++ b/tests/corelib_2/map_set_undefined_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+import 'package:expect/expect.dart';
+
+main() {
+  // Regression test for https://github.com/dart-lang/sdk/issues/36052.
+  // JS compilers shouldn't produce `undefined` when a Map/Set key is not found.
+  testMap({});
+  testMap(Map.identity());
+  testMap(LinkedHashMap(
+      equals: (x, y) => x == y,
+      hashCode: (x) => x.hashCode,
+      isValidKey: (_) => true));
+
+  testSet(Set());
+  testSet(Set.identity());
+  testSet(LinkedHashSet(
+      equals: (x, y) => x == y,
+      hashCode: (x) => x.hashCode,
+      isValidKey: (_) => true));
+}
+
+testMap(Map<Object, Object> map) {
+  var t = map.runtimeType.toString();
+  var s = ' (length ${map.length})';
+  checkUndefined('$t.[]$s', map['hi']);
+  checkUndefined('$t.putIfAbsent$s', map.putIfAbsent('hi', () {}));
+  checkUndefined('$t.remove$s', map.remove('hi'));
+  if (map.isEmpty) {
+    map['hello'] = 'there';
+    testMap(map);
+  }
+}
+
+testSet(Set<Object> set) {
+  var t = set.runtimeType.toString();
+  var s = ' (length ${set.length})';
+  checkUndefined('$t.lookup$s', set.lookup('hi'));
+  if (set.isEmpty) {
+    set.add('hello');
+    testSet(set);
+  }
+}
+
+/// Fails if [x] incorrectly uses the default argument instead of being `null`
+/// (i.e. because `x` is undefined).
+checkUndefined(String method, [Object x = 'error']) {
+  // TODO(jmesserly): this check is specific to implementation details of DDC's
+  // current calling conventions. These conventions may change.
+  // Ideally we'd have an `undefined` constant in "package:js" and use that
+  // here instead.
+  Expect.isNull(x,
+      'error in $method: result treated as missing argument (JS undefined?)');
+}
diff --git a/tests/corelib_2/string_operations_with_null_test.dart b/tests/corelib_2/string_operations_with_null_test.dart
index 2712709..8c07025 100644
--- a/tests/corelib_2/string_operations_with_null_test.dart
+++ b/tests/corelib_2/string_operations_with_null_test.dart
@@ -4,8 +4,8 @@
 
 import "package:expect/expect.dart";
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 returnStringOrNull() {
   return new DateTime.now().millisecondsSinceEpoch == 0 ? 'foo' : null;
 }
diff --git a/tests/language_2/and_operation_on_non_integer_operand_test.dart b/tests/language_2/and_operation_on_non_integer_operand_test.dart
index 43f1d50..36b4a04 100644
--- a/tests/language_2/and_operation_on_non_integer_operand_test.dart
+++ b/tests/language_2/and_operation_on_non_integer_operand_test.dart
@@ -11,8 +11,8 @@
   NotAnInt operator &(b) => this;
 }
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 id(x) => x;
 
 main() {
diff --git a/tests/language_2/async_and_or_test.dart b/tests/language_2/async_and_or_test.dart
index 6241a70..b412c17 100644
--- a/tests/language_2/async_and_or_test.dart
+++ b/tests/language_2/async_and_or_test.dart
@@ -5,8 +5,8 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) {
   return x;
 }
@@ -42,8 +42,8 @@
 
 test2() async {
   await testEvaluation(() async {
-    Expect
-        .isFalse(await confuse(traceA(false)) && await confuse(traceB(false)));
+    Expect.isFalse(
+        await confuse(traceA(false)) && await confuse(traceB(false)));
     Expect.equals("a", trace);
   });
   await testEvaluation(() async {
@@ -60,8 +60,8 @@
   });
 
   await testEvaluation(() async {
-    Expect
-        .isFalse(await confuse(traceA(false)) || await confuse(traceB(false)));
+    Expect.isFalse(
+        await confuse(traceA(false)) || await confuse(traceB(false)));
     Expect.equals("ab", trace);
   });
   await testEvaluation(() async {
diff --git a/tests/language_2/async_this_bound_test.dart b/tests/language_2/async_this_bound_test.dart
index fdbfa6c..50d31a4 100644
--- a/tests/language_2/async_this_bound_test.dart
+++ b/tests/language_2/async_this_bound_test.dart
@@ -8,7 +8,7 @@
 class A {
   int a = -1;
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   foo(ignored, val) {
     Expect.equals(val, this.a);
   }
@@ -21,8 +21,8 @@
   a.foo(await false, 0);
 }
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 class B {
diff --git a/tests/language_2/bool_condition_check_test.dart b/tests/language_2/bool_condition_check_test.dart
index 4e7b2fa..cb51127 100644
--- a/tests/language_2/bool_condition_check_test.dart
+++ b/tests/language_2/bool_condition_check_test.dart
@@ -7,7 +7,7 @@
 
 import 'package:expect/expect.dart';
 
-@NoInline()
+@pragma('dart2js:noInline')
 String check({bool a, bool b}) {
   String aString = a ? 'a' : '';
   String bString = b ? 'b' : '';
diff --git a/tests/language_2/catch_liveness_test.dart b/tests/language_2/catch_liveness_test.dart
index 59e13a7..df9a3dd 100644
--- a/tests/language_2/catch_liveness_test.dart
+++ b/tests/language_2/catch_liveness_test.dart
@@ -4,12 +4,12 @@
 
 import "package:expect/expect.dart";
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 foo() => 1;
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 throwException() => throw 'x';
 
 main() {
diff --git a/tests/language_2/const_constructor_super2_test.dart b/tests/language_2/const_constructor_super2_test.dart
index 6ec4fa3..f922769 100644
--- a/tests/language_2/const_constructor_super2_test.dart
+++ b/tests/language_2/const_constructor_super2_test.dart
@@ -16,10 +16,10 @@
   const B(a, this.b) : super(a);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 foo() => const B(1, 2);
 
-@NoInline()
+@pragma('dart2js:noInline')
 bar() => const B(2, 2);
 
 void main() {
diff --git a/tests/language_2/constructor12_test.dart b/tests/language_2/constructor12_test.dart
index 81b2525..397cb19 100644
--- a/tests/language_2/constructor12_test.dart
+++ b/tests/language_2/constructor12_test.dart
@@ -33,8 +33,8 @@
   bar() => captured2();
 }
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 main() {
diff --git a/tests/language_2/control_flow_collections/for_await_test.dart b/tests/language_2/control_flow_collections/for_await_test.dart
new file mode 100644
index 0000000..55d24ae
--- /dev/null
+++ b/tests/language_2/control_flow_collections/for_await_test.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=--enable-experiment=control-flow-collections
+
+import "package:async_helper/async_helper.dart";
+import 'package:expect/expect.dart';
+
+final list = [1, 2, 3];
+final map = {1: 1, 2: 2, 3: 3};
+final set = {1, 2, 3};
+
+void main() {
+  asyncTest(() async {
+    await testList();
+    await testMap();
+    await testSet();
+  });
+}
+
+Future<void> testList() async {
+  var future123 = Future.value([1, 2, 3]);
+  var future1 = Future.value(1);
+
+  // Await in iterable.
+  Expect.listEquals(list, [for (var i in await future123) i]);
+
+  // Await in for-in body.
+  Expect.listEquals(list, [for (var i in [1, 2, 3]) await Future.value(i)]);
+
+  // Await in initializer.
+  Expect.listEquals(list, [for (var i = await future1; i < 4; i++) i]);
+
+  // Await in condition.
+  Expect.listEquals(list,
+      [for (var i = 1; await Future.value(i < 4); i++) i]);
+
+  // Await in increment.
+  Expect.listEquals(list,
+      [for (var i = 1; i < 4; await Future(() => i++)) i]);
+
+  // Await in for body.
+  Expect.listEquals(list,
+      [for (var i = 1; i < 4; i++) await Future.value(i)]);
+}
+
+Future<void> testMap() async {
+  var future123 = Future.value([1, 2, 3]);
+  var future1 = Future.value(1);
+
+  // Await in iterable.
+  Expect.mapEquals(map, {for (var i in await future123) i: i});
+
+  // Await in for-in body key.
+  Expect.mapEquals(map,
+      {for (var i in [1, 2, 3]) await Future.value(i): i});
+
+  // Await in for-in body value.
+  Expect.mapEquals(map,
+      {for (var i in [1, 2, 3]) i: await Future.value(i)});
+
+  // Await in initializer.
+  Expect.mapEquals(map, {for (var i = await future1; i < 4; i++) i: i});
+
+  // Await in condition.
+  Expect.mapEquals(map,
+      {for (var i = 1; await Future.value(i < 4); i++) i: i});
+
+  // Await in increment.
+  Expect.mapEquals(map,
+      {for (var i = 1; i < 4; await Future(() => i++)) i: i});
+
+  // Await in for body key.
+  Expect.mapEquals(map,
+      {for (var i = 1; i < 4; i++) await Future.value(i): i});
+
+  // Await in for body value.
+  Expect.mapEquals(map,
+      {for (var i = 1; i < 4; i++) i: await Future.value(i)});
+}
+
+Future<void> testSet() async {
+  var future123 = Future.value([1, 2, 3]);
+  var future1 = Future.value(1);
+
+  // Await in iterable.
+  Expect.setEquals(set, {for (var i in await future123) i});
+
+  // Await in for-in body.
+  Expect.setEquals(set, {for (var i in [1, 2, 3]) await Future.value(i)});
+
+  // Await in initializer.
+  Expect.setEquals(set, {for (var i = await future1; i < 4; i++) i});
+
+  // Await in condition.
+  Expect.setEquals(set,
+      {for (var i = 1; await Future.value(i < 4); i++) i});
+
+  // Await in increment.
+  Expect.setEquals(set,
+      {for (var i = 1; i < 4; await Future(() => i++)) i});
+
+  // Await in for body.
+  Expect.setEquals(set,
+      {for (var i = 1; i < 4; i++) await Future.value(i)});
+}
diff --git a/tests/language_2/control_flow_collections/for_inference_test.dart b/tests/language_2/control_flow_collections/for_inference_test.dart
index 1834edb..3d9773b 100644
--- a/tests/language_2/control_flow_collections/for_inference_test.dart
+++ b/tests/language_2/control_flow_collections/for_inference_test.dart
@@ -61,10 +61,10 @@
   Expect.type<List<String>>([for (var i = 1; i < 2; i++) i.toRadixString(10)]);
 
   // Loop variable type is not pushed into iterable.
-  Expect.listEquals(<int>[1], [for (int i in expectDynamic([1]))]);
+  Expect.listEquals(<int>[1], [for (int i in expectDynamic([1])) i]);
 
   // Loop variable type is pushed into initializer.
-  Expect.listEquals(<int>[1], [for (int i = expectInt(1), i < 2; i++) i]);
+  Expect.listEquals(<int>[1], [for (int i = expectInt(1); i < 2; i++) i]);
 }
 
 void testTopDownInference() {
diff --git a/tests/language_2/control_flow_collections/for_test.dart b/tests/language_2/control_flow_collections/for_test.dart
index 108b82f..6add35f 100644
--- a/tests/language_2/control_flow_collections/for_test.dart
+++ b/tests/language_2/control_flow_collections/for_test.dart
@@ -59,9 +59,9 @@
       <int>[for (var i in <int>[0, 2]) for (var j = 1; j <= 2; j++) i + j]);
 
   // Does not flatten nested collection literal.
-  Expect.listEquals([1], [for (var i = 1; i < 2; i++) [i]].first;
-  Expect.mapEquals({1: 1}, [for (var i = 1; i < 2; i++) {i: i}].first;
-  Expect.setEquals({1}, [for (var i = 1; i < 2; i++) {i}].first;
+  Expect.listEquals([1], [for (var i = 1; i < 2; i++) [i]].first);
+  Expect.mapEquals({1: 1}, [for (var i = 1; i < 2; i++) {i: i}].first);
+  Expect.setEquals({1}, [for (var i = 1; i < 2; i++) {i}].first);
 
   // Downcast variable.
   Expect.listEquals(list, <int>[for (int n in <num>[1, 2, 3, 4]) n]);
@@ -109,7 +109,7 @@
 
   // Spread inside for.
   Expect.mapEquals(map, <int, int>{
-    for (var i in <int>[0, 2]) ...<int>{1 + i: 1 + i, 2 + i: 2 + i}
+    for (var i in <int>[0, 2]) ...<int, int>{1 + i: 1 + i, 2 + i: 2 + i}
   });
 
   // If inside for.
@@ -132,9 +132,9 @@
   Expect.mapEquals(map, <int, int>{for (num n in <num>[1, 2, 3, 4]) n: n});
 
   // Downcast condition.
-  Expect.mapEquals([1],
+  Expect.mapEquals({1 : 1},
       <int, int>{for (var i = 1; (i < 2) as dynamic; i++) i: i});
-  Expect.mapEquals([1],
+  Expect.mapEquals({1 : 1},
       <int, int>{for (var i = 1; (i < 2) as Object; i++) i: i});
 }
 
@@ -176,9 +176,9 @@
       <int>{for (var i in <int>[0, 2]) for (var j = 1; j <= 2; j++) i + j});
 
   // Does not flatten nested collection literal.
-  Expect.listEquals([1], {for (var i = 1; i < 2; i++) [i]}.first;
-  Expect.mapEquals({1: 1}, {for (var i = 1; i < 2; i++) {i: i}}.first;
-  Expect.setEquals({1}, }for (var i = 1; i < 2; i++) {i}}.first;
+  Expect.listEquals([1], {for (var i = 1; i < 2; i++) [i]}.first);
+  Expect.mapEquals({1: 1}, {for (var i = 1; i < 2; i++) {i: i}}.first);
+  Expect.setEquals({1}, {for (var i = 1; i < 2; i++) {i}}.first);
 
   // Downcast variable.
   Expect.setEquals(set, <int>{for (int n in <num>[1, 2, 3, 4]) n});
@@ -196,13 +196,15 @@
     1: 1,
     for (var i in <int>[1, 2, 3]) i: i,
     for (var i = 2; i <= 3; i++) i: i,
-    3: 3
+    3: 3,
+    4: 4
   });
   Expect.setEquals(set, <int>{
     1,
     for (var i in <int>[1, 2, 3]) i,
     for (var i = 2; i <= 3; i++) i,
-    3
+    3, 
+    4
   });
 }
 
diff --git a/tests/language_2/control_flow_collections/for_variable_test.dart b/tests/language_2/control_flow_collections/for_variable_test.dart
index 732e2ca..b7b4307 100644
--- a/tests/language_2/control_flow_collections/for_variable_test.dart
+++ b/tests/language_2/control_flow_collections/for_variable_test.dart
@@ -39,17 +39,17 @@
   Expect.equals(1, list[1]());
 
   // Close over variable in condition expression.
-  list = [for (var i = 0; capture(() => i++) < 2;) i];
+  var list2 = [for (var i = 0; capture(() => i++) < 2;) i];
   Expect.equals(1, closures[0]());
   Expect.equals(2, closures[1]());
-  Expect.listEquals([1, 2], list);
+  Expect.listEquals([1, 2], list2);
   reset();
 
   // Close over variable in increment expression.
-  list = [for (var i = 0; i < 2; capture(() => i++)) i];
+  var list3 = [for (var i = 0; i < 2; capture(() => i++)) i];
   Expect.equals(1, closures[0]());
   Expect.equals(2, closures[1]());
-  Expect.listEquals([0, 1], list);
+  Expect.listEquals([0, 1], list3);
   reset();
 }
 
diff --git a/tests/language_2/control_flow_collections/if_await_test.dart b/tests/language_2/control_flow_collections/if_await_test.dart
new file mode 100644
index 0000000..2db3f62
--- /dev/null
+++ b/tests/language_2/control_flow_collections/if_await_test.dart
@@ -0,0 +1,95 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=--enable-experiment=control-flow-collections
+
+import "package:async_helper/async_helper.dart";
+import 'package:expect/expect.dart';
+
+final list = [1, 2, 3];
+final map = {1: 1, 2: 2, 3: 3};
+final set = {1, 2, 3};
+
+void main() {
+  asyncTest(() async {
+    await testList();
+    await testMap();
+    await testSet();
+  });
+}
+
+Future<void> testList() async {
+  var futureTrue = Future.value(true);
+  var future2 = Future.value(2);
+  var future9 = Future.value(9);
+
+  // Await in condition.
+  Expect.listEquals(list, [1, if (await futureTrue) 2, 3]);
+
+  // Await in then branch.
+  Expect.listEquals(list, [1, if (true) await future2, 3]);
+
+  // Await in else branch.
+  Expect.listEquals(list, [1, if (false) 9 else await future2, 3]);
+
+  // Await in untaken then branch.
+  Expect.listEquals(list, [1, 2, if (false) await future9, 3]);
+
+  // Await in untaken else branch.
+  Expect.listEquals(list, [1, if (true) 2 else await future9, 3]);
+}
+
+Future<void> testMap() async {
+  var futureTrue = Future.value(true);
+  var future2 = Future.value(2);
+  var future9 = Future.value(9);
+
+  // Await in condition.
+  Expect.mapEquals(map, {1: 1, if (await futureTrue) 2: 2, 3: 3});
+
+  // Await in then branch key.
+  Expect.mapEquals(map, {1: 1, if (true) await future2: 2, 3: 3});
+
+  // Await in then branch value.
+  Expect.mapEquals(map, {1: 1, if (true) 2: await future2, 3: 3});
+
+  // Await in else branch key.
+  Expect.mapEquals(map, {1: 1, if (false) 9: 9 else await future2: 2, 3: 3});
+
+  // Await in else branch value.
+  Expect.mapEquals(map, {1: 1, if (false) 9: 9 else 2: await future2, 3: 3});
+
+  // Await in untaken then branch key.
+  Expect.mapEquals(map, {1: 1, 2: 2, if (false) await future9: 9, 3: 3});
+
+  // Await in untaken then branch value.
+  Expect.mapEquals(map, {1: 1, 2: 2, if (false) 9: await future9, 3: 3});
+
+  // Await in untaken else branch key.
+  Expect.mapEquals(map, {1: 1, if (true) 2: 2 else await future9: 9, 3: 3});
+
+  // Await in untaken else branch value.
+  Expect.mapEquals(map, {1: 1, if (true) 2: 2 else 9: await future9, 3: 3});
+}
+
+Future<void> testSet() async {
+  var futureTrue = Future.value(true);
+  var future2 = Future.value(2);
+  var future9 = Future.value(9);
+
+  // Await in condition.
+  Expect.setEquals(set, {1, if (await futureTrue) 2, 3});
+
+  // Await in then branch.
+  Expect.setEquals(set, {1, if (true) await future2, 3});
+
+  // Await in else branch.
+  Expect.setEquals(set, {1, if (false) 9 else await future2, 3});
+
+  // Await in untaken then branch.
+  Expect.setEquals(set, {1, 2, if (false) await future9, 3});
+
+  // Await in untaken else branch.
+  Expect.setEquals(set, {1, if (true) 2 else await future9, 3});
+}
diff --git a/tests/language_2/control_flow_collections/if_const_test.dart b/tests/language_2/control_flow_collections/if_const_test.dart
index 8ccac19..e30939cb 100644
--- a/tests/language_2/control_flow_collections/if_const_test.dart
+++ b/tests/language_2/control_flow_collections/if_const_test.dart
@@ -56,9 +56,9 @@
   Expect.identical(const [1], const <int>[if (objectTrue) 1]);
 
   // Does not flatten nested collection literal.
-  Expect.identical(const [1], const [if (true) [1]].first;
-  Expect.identical(const {1: 1}, const [if (true) {1: 1}].first;
-  Expect.identical(const {1}, const [if (true) {1}].first;
+  Expect.identical(const [1], const [if (true) [1]].first);
+  Expect.identical(const {1: 1}, const [if (true) {1: 1}].first);
+  Expect.identical(const {1}, const [if (true) {1}].first);
 
   // Nested spread.
   Expect.identical(list,
@@ -75,7 +75,7 @@
   Expect.identical(list, const <int>[if (true) for (var i in list) i]);
 
   // Nested for in else.
-  Expect.identical(list, const <int>[if (false) 9 for (var i in list) i]);
+  Expect.identical(list, const <int>[if (false) 9 else for (var i in list) i]);
 }
 
 void testMap() {
@@ -128,7 +128,7 @@
 
   // Nested for in else.
   Expect.identical(map,
-      const <int, int>{if (false) 9: 9 for (var i in list) i: i});
+      const <int, int>{if (false) 9: 9 else for (var i in list) i: i});
 }
 
 void testSet() {
@@ -162,9 +162,10 @@
   Expect.identical(const <int>{1}, const <int>{if (objectTrue) 1});
 
   // Does not flatten nested collection literal.
-  Expect.identical(const <int>[1], const <int>{if (true) [1]}.first;
-  Expect.identical(const <int, int>{1: 1}, const <int>{if (true) {1: 1}}.first;
-  Expect.identical(const <int>{1}, const <int>{if (true) {1}}.first;
+  Expect.identical(const <int>[1], const <List<int>>{if (true) [1]}.first);
+  Expect.identical(
+      const <int, int>{1: 1}, const <Map<int, int>>{if (true) {1: 1}}.first);
+  Expect.identical(const <int>{1}, const <Set<int>>{if (true) {1}}.first);
 
   // Nested spread.
   Expect.identical(set,
@@ -181,7 +182,7 @@
   Expect.identical(set, const <int>{if (true) for (var i in list) i});
 
   // Nested for in else.
-  Expect.identical(set, const <int>{if (false) 9 for (var i in list) i});
+  Expect.identical(set, const <int>{if (false) 9 else for (var i in list) i});
 }
 
 void testShortCircuit() {
@@ -201,7 +202,7 @@
     if (false) nil + 1: 9,
     if (false) 9: nil + 1
   });
-  Expect.identical(const <int, int>{1: 1, 2: 2}, const <int>{
+  Expect.identical(const <int, int>{1: 1, 2: 2}, const <int, int>{
     if (true) 1: 1 else nil + 1: 9,
     if (false) 9: nil + 1 else 2: 2
   });
@@ -229,7 +230,7 @@
     if (false) 9: nonInt else 2: 2
   });
 
-  Expect.identical(const <int>{1}, const <int>{if (true) 1, if (false) nonInt};
+  Expect.identical(const <int>{1}, const <int>{if (true) 1, if (false) nonInt});
   Expect.identical(const <int>{1, 2},
       const <int>{if (true) 1 else nonInt, if (false) nonInt else 2});
 }
diff --git a/tests/language_2/control_flow_collections/if_promotion_test.dart b/tests/language_2/control_flow_collections/if_promotion_test.dart
new file mode 100644
index 0000000..5622a47
--- /dev/null
+++ b/tests/language_2/control_flow_collections/if_promotion_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=--enable-experiment=control-flow-collections
+
+class A {
+  var a = "a";
+}
+
+class B extends A {
+  var b = "b";
+}
+
+class C extends B {
+  var c = "c";
+}
+
+void main() {
+  A a = A();
+  print(a.a);
+  print(a.b); //# 01: compile-time error
+
+  var list = [
+    a.a,
+    a.b, //# 02: compile-time error
+    a.c, //# 03: compile-time error
+
+    if (a is B) [
+      a.a,
+      a.b,
+      a.c, //# 04: compile-time error
+
+      if (a is C) [
+        a.a,
+        a.b,
+        a.c,
+      ] else [
+        a.a,
+        a.b,
+        a.c, //# 05: compile-time error
+      ],
+
+      a.a,
+      a.b,
+      a.c, //# 06: compile-time error
+    ] else [
+      a.a,
+      a.b, //# 07: compile-time error
+      a.c, //# 08: compile-time error
+    ],
+
+    a.a,
+    a.b, //# 09: compile-time error
+    a.c, //# 10: compile-time error
+  ];
+}
diff --git a/tests/language_2/control_flow_collections/if_test.dart b/tests/language_2/control_flow_collections/if_test.dart
index 8aa7ba5..d420e16 100644
--- a/tests/language_2/control_flow_collections/if_test.dart
+++ b/tests/language_2/control_flow_collections/if_test.dart
@@ -53,9 +53,9 @@
   Expect.listEquals(<int>[1], <int>[if (true as Object) 1]);
 
   // Does not flatten nested collection literal.
-  Expect.listEquals([1], [if (true) [1]].first;
-  Expect.mapEquals({1: 1}, [if (true) {1: 1}].first;
-  Expect.setEquals({1}, [if (true) {1}].first;
+  Expect.listEquals([1], [if (true) [1]].first);
+  Expect.mapEquals({1: 1}, [if (true) {1: 1}].first);
+  Expect.setEquals({1}, [if (true) {1}].first);
 
   // Nested spread.
   Expect.listEquals(list,
@@ -71,7 +71,7 @@
   Expect.listEquals(list, <int>[if (true) for (var i in list) i]);
 
   // Nested for in else.
-  Expect.listEquals(list, <int>[if (false) 9 for (var i in list) i]);
+  Expect.listEquals(list, <int>[if (false) 9 else for (var i in list) i]);
 }
 
 void testMap() {
@@ -122,7 +122,7 @@
   Expect.mapEquals(map, <int, int>{if (true) for (var i in list) i: i});
 
   // Nested for in else.
-  Expect.mapEquals(map, <int, int>{if (false) 9: 9 for (var i in list) i: i});
+  Expect.mapEquals(map, <int, int>{if (false) 9: 9 else for (var i in list) i: i});
 }
 
 void testSet() {
@@ -156,9 +156,9 @@
   Expect.setEquals({1}, <int>{if (true as Object) 1});
 
   // Does not flatten nested collection literal.
-  Expect.listEquals([1], {if (true) [1]}.first;
-  Expect.mapEquals({1: 1}, {if (true) {1: 1}}.first;
-  Expect.setEquals({1}, {if (true) {1}}.first;
+  Expect.listEquals([1], {if (true) [1]}.first);
+  Expect.mapEquals({1: 1}, {if (true) {1: 1}}.first);
+  Expect.setEquals({1}, {if (true) {1}}.first);
 
   // Nested spread.
   Expect.setEquals(set,
@@ -174,7 +174,7 @@
   Expect.setEquals(set, <int>{if (true) for (var i in list) i});
 
   // Nested for in else.
-  Expect.setEquals(set, <int>{if (false) 9 for (var i in list) i});
+  Expect.setEquals(set, <int>{if (false) 9 else for (var i in list) i});
 }
 
 void testShortCircuit() {
diff --git a/tests/language_2/control_flow_collections/syntax_test.dart b/tests/language_2/control_flow_collections/syntax_test.dart
index 48206cd2..c6de2d8 100644
--- a/tests/language_2/control_flow_collections/syntax_test.dart
+++ b/tests/language_2/control_flow_collections/syntax_test.dart
@@ -24,9 +24,9 @@
   Expect.setEquals({1}, {1, for (; false;) 2,});
 
   // Dangling else.
-  Expect.listEquals([1], [if (true) if (false) else 1]);
-  Expect.listEquals([1], [if (true) if (false) else 1 else 2]);
-  Expect.listEquals([2], [if (false) if (false) else 1 else 2]);
+  Expect.listEquals([1], [if (true) if (false) 0 else 1]);
+  Expect.listEquals([1], [if (true) if (false) 0 else 1 else 2]);
+  Expect.listEquals([2], [if (false) if (false) 0 else 1 else 2]);
 
   // Precedence of then.
   Expect.listEquals([1, 2, 3], [1, if (true) true ? 2 : 0, 3]);
@@ -35,12 +35,12 @@
 
   // Precedence of else.
   Expect.listEquals([1, 2, 3], [1, if (false) 0 else true ? 2 : 0, 3]);
-  var a = 0;
+  a = 0;
   Expect.listEquals([1, 2, 3], [1, if (false) 0 else a = 2, 3]);
 
   // Precedence of for.
   Expect.listEquals([1, 2, 3],
       [1, for (var i = 0; i < 1; i++) true ? 2 : 0, 3]);
-  var a = 0;
+  a = 0;
   Expect.listEquals([1, 2, 3], [1, for (var i = 0; i < 1; i++) a = 2, 3]);
 }
diff --git a/tests/language_2/dead_field_access_test.dart b/tests/language_2/dead_field_access_test.dart
index e3fc11b..cacaa34 100644
--- a/tests/language_2/dead_field_access_test.dart
+++ b/tests/language_2/dead_field_access_test.dart
@@ -8,7 +8,7 @@
   var field = 10;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 getField(x) {
   x.field;
   return 34;
diff --git a/tests/language_2/field_increment_bailout_test.dart b/tests/language_2/field_increment_bailout_test.dart
index cddb38c..1ee4e5a 100644
--- a/tests/language_2/field_increment_bailout_test.dart
+++ b/tests/language_2/field_increment_bailout_test.dart
@@ -45,8 +45,8 @@
 }
 
 // Use confuse to defeat type inferencing.
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) {
   return x;
 }
diff --git a/tests/language_2/field_wierd_name_test.dart b/tests/language_2/field_wierd_name_test.dart
index bb0ca00..d76eaa8 100644
--- a/tests/language_2/field_wierd_name_test.dart
+++ b/tests/language_2/field_wierd_name_test.dart
@@ -41,7 +41,7 @@
   var f50 = ++ii, f51 = ++ii, f52 = ++ii, f53 = ++ii, f54 = ++ii;
   var f55 = ++ii, f56 = ++ii, f57 = ++ii, f58 = ++ii, f59 = ++ii;
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   Thing(this._, this.$_);
   toString() {
     if (depth > 0) return 'recursion!';
diff --git a/tests/language_2/function_call_generic_test.dart b/tests/language_2/function_call_generic_test.dart
index db40488..3653c7a 100644
--- a/tests/language_2/function_call_generic_test.dart
+++ b/tests/language_2/function_call_generic_test.dart
@@ -5,14 +5,14 @@
 
 import "package:expect/expect.dart";
 
-@NoInline()
+@pragma('dart2js:noInline')
 List staticFn<T>([T a1, T a2, T a3, T a4, T a5]) => [T, a1, a2, a3, a4, a5];
 
 class C {
-  @NoInline()
+  @pragma('dart2js:noInline')
   List memberFn<T>([T a1, T a2, T a3, T a4, T a5]) => [T, a1, a2, a3, a4, a5];
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   // 'map' is implemented by native iterables. On dart2js, 'map' has interceptor
   // calling convention.
   List map<T>([T a1, T a2, T a3, T a4, T a5]) => [T, a1, a2, a3, a4, a5];
diff --git a/tests/language_2/function_subtype_typearg5_test.dart b/tests/language_2/function_subtype_typearg5_test.dart
index 018d592..bd6e2bd 100644
--- a/tests/language_2/function_subtype_typearg5_test.dart
+++ b/tests/language_2/function_subtype_typearg5_test.dart
@@ -13,8 +13,8 @@
 
 typedef Set<A> FS<A>(Set<A> arg1, Set<A> arg2);
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 dyn(x) => x;
 
 class CheckEnv<X, Y> {
diff --git a/tests/language_2/function_type/function_type0_test.dart b/tests/language_2/function_type/function_type0_test.dart
index f01e020..9bcf990 100644
--- a/tests/language_2/function_type/function_type0_test.dart
+++ b/tests/language_2/function_type/function_type0_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x);
@@ -243,8 +243,8 @@
     }
 
     Expect.isTrue(m2 is F2<T>);
-    Expect
-        .isTrue(m2 is core.List<core.int> Function(int y, {List<Function> x}));
+    Expect.isTrue(
+        m2 is core.List<core.int> Function(int y, {List<Function> x}));
     Expect.isTrue(confuse(m2) is F2<T>);
     // In checked mode, verifies the type.
     x2 = m2;
@@ -486,8 +486,8 @@
     }
 
     Expect.isTrue(m11 is F11<T>);
-    Expect
-        .isTrue(m11 is List<Function> Function(int y, [List<T> x]) Function());
+    Expect.isTrue(
+        m11 is List<Function> Function(int y, [List<T> x]) Function());
     Expect.isTrue(confuse(m11) is F11<T>);
     // In checked mode, verifies the type.
     x11 = m11;
@@ -536,8 +536,8 @@
     }
 
     Expect.isTrue(m12 is F12<T>);
-    Expect
-        .isTrue(m12 is core.List<core.int> Function([Function x1]) Function());
+    Expect.isTrue(
+        m12 is core.List<core.int> Function([Function x1]) Function());
     Expect.isTrue(confuse(m12) is F12<T>);
     // In checked mode, verifies the type.
     x12 = m12;
diff --git a/tests/language_2/function_type/function_type10_test.dart b/tests/language_2/function_type/function_type10_test.dart
index 692f44a..9ec7737 100644
--- a/tests/language_2/function_type/function_type10_test.dart
+++ b/tests/language_2/function_type/function_type10_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int y, {int x});
@@ -339,8 +339,8 @@
     }
 
     Expect.isTrue(m5 is F5<T>);
-    Expect
-        .isTrue(m5 is int Function(Function x) Function<B extends core.int>());
+    Expect.isTrue(
+        m5 is int Function(Function x) Function<B extends core.int>());
     Expect.isTrue(confuse(m5) is F5<T>);
     // In checked mode, verifies the type.
     x5 = m5;
diff --git a/tests/language_2/function_type/function_type11_test.dart b/tests/language_2/function_type/function_type11_test.dart
index 7a8216c..202a918 100644
--- a/tests/language_2/function_type/function_type11_test.dart
+++ b/tests/language_2/function_type/function_type11_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(Function x);
@@ -430,8 +430,8 @@
     }
 
     Expect.isTrue(m9 is F9<T>);
-    Expect
-        .isTrue(m9 is Function Function() Function<B extends core.int>(int x));
+    Expect.isTrue(
+        m9 is Function Function() Function<B extends core.int>(int x));
     Expect.isTrue(confuse(m9) is F9<T>);
     // In checked mode, verifies the type.
     x9 = m9;
@@ -914,8 +914,8 @@
     }
 
     Expect.isTrue(m23 is F23<T>);
-    Expect
-        .isTrue(m23 is void Function<A>() Function<B extends core.int>(int x));
+    Expect.isTrue(
+        m23 is void Function<A>() Function<B extends core.int>(int x));
     Expect.isTrue(confuse(m23) is F23<T>);
     // In checked mode, verifies the type.
     x23 = m23;
diff --git a/tests/language_2/function_type/function_type12_test.dart b/tests/language_2/function_type/function_type12_test.dart
index 2973ab9..c5eecf5 100644
--- a/tests/language_2/function_type/function_type12_test.dart
+++ b/tests/language_2/function_type/function_type12_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function([Function x]);
@@ -411,8 +411,8 @@
     }
 
     Expect.isTrue(m8 is F8<T>);
-    Expect
-        .isTrue(m8 is Function Function(int x0, {List<Function> x}) Function());
+    Expect.isTrue(
+        m8 is Function Function(int x0, {List<Function> x}) Function());
     Expect.isTrue(confuse(m8) is F8<T>);
     // In checked mode, verifies the type.
     x8 = m8;
diff --git a/tests/language_2/function_type/function_type13_test.dart b/tests/language_2/function_type/function_type13_test.dart
index c35cbcd..e97c219 100644
--- a/tests/language_2/function_type/function_type13_test.dart
+++ b/tests/language_2/function_type/function_type13_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x0, [Function x]);
@@ -536,8 +536,8 @@
     }
 
     Expect.isTrue(m13 is F13<T>);
-    Expect
-        .isTrue(m13 is core.List<core.int> Function(List<T> x) Function(int x));
+    Expect.isTrue(
+        m13 is core.List<core.int> Function(List<T> x) Function(int x));
     Expect.isTrue(confuse(m13) is F13<T>);
     // In checked mode, verifies the type.
     x13 = m13;
@@ -586,8 +586,8 @@
     }
 
     Expect.isTrue(m14 is F14<T>);
-    Expect
-        .isTrue(m14 is List<T> Function(int x1, [Function x]) Function(int x));
+    Expect.isTrue(
+        m14 is List<T> Function(int x1, [Function x]) Function(int x));
     Expect.isTrue(confuse(m14) is F14<T>);
     // In checked mode, verifies the type.
     x14 = m14;
diff --git a/tests/language_2/function_type/function_type14_test.dart b/tests/language_2/function_type/function_type14_test.dart
index 9ad9bc7..0e5cb1a 100644
--- a/tests/language_2/function_type/function_type14_test.dart
+++ b/tests/language_2/function_type/function_type14_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int y, [Function x]);
diff --git a/tests/language_2/function_type/function_type15_test.dart b/tests/language_2/function_type/function_type15_test.dart
index 1436768..b1c26fa 100644
--- a/tests/language_2/function_type/function_type15_test.dart
+++ b/tests/language_2/function_type/function_type15_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(Function x0);
diff --git a/tests/language_2/function_type/function_type16_test.dart b/tests/language_2/function_type/function_type16_test.dart
index ed1bbf9..fb657f2 100644
--- a/tests/language_2/function_type/function_type16_test.dart
+++ b/tests/language_2/function_type/function_type16_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function([Function x1]);
@@ -386,8 +386,8 @@
     }
 
     Expect.isTrue(m8 is F8<T>);
-    Expect
-        .isTrue(m8 is Function Function(int y, {List<Function> x}) Function());
+    Expect.isTrue(
+        m8 is Function Function(int y, {List<Function> x}) Function());
     Expect.isTrue(confuse(m8) is F8<T>);
     // In checked mode, verifies the type.
     x8 = m8;
@@ -459,8 +459,8 @@
     }
 
     Expect.isTrue(m11 is F11<T>);
-    Expect
-        .isTrue(m11 is List<Function> Function(int x, [List<T> x2]) Function());
+    Expect.isTrue(
+        m11 is List<Function> Function(int x, [List<T> x2]) Function());
     Expect.isTrue(confuse(m11) is F11<T>);
     // In checked mode, verifies the type.
     x11 = m11;
diff --git a/tests/language_2/function_type/function_type17_test.dart b/tests/language_2/function_type/function_type17_test.dart
index 348c477..058d1c1 100644
--- a/tests/language_2/function_type/function_type17_test.dart
+++ b/tests/language_2/function_type/function_type17_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x1, [Function x2]);
diff --git a/tests/language_2/function_type/function_type18_test.dart b/tests/language_2/function_type/function_type18_test.dart
index 235f27a..e336db6 100644
--- a/tests/language_2/function_type/function_type18_test.dart
+++ b/tests/language_2/function_type/function_type18_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x, [Function x2]);
diff --git a/tests/language_2/function_type/function_type19_test.dart b/tests/language_2/function_type/function_type19_test.dart
index d2e9c6a..2639304 100644
--- a/tests/language_2/function_type/function_type19_test.dart
+++ b/tests/language_2/function_type/function_type19_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function({Function x});
diff --git a/tests/language_2/function_type/function_type1_test.dart b/tests/language_2/function_type/function_type1_test.dart
index ce7c93f..7d3515a 100644
--- a/tests/language_2/function_type/function_type1_test.dart
+++ b/tests/language_2/function_type/function_type1_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function([int x]);
@@ -856,8 +856,8 @@
     }
 
     Expect.isTrue(m21 is F21<T>);
-    Expect
-        .isTrue(m21 is List<Function> Function<A>(Function x) Function(int x));
+    Expect.isTrue(
+        m21 is List<Function> Function<A>(Function x) Function(int x));
     Expect.isTrue(confuse(m21) is F21<T>);
     // In checked mode, verifies the type.
     x21 = m21;
@@ -905,8 +905,8 @@
     }
 
     Expect.isTrue(m23 is F23<T>);
-    Expect
-        .isTrue(m23 is void Function<A>(core.List<core.int> x) Function(int x));
+    Expect.isTrue(
+        m23 is void Function<A>(core.List<core.int> x) Function(int x));
     Expect.isTrue(confuse(m23) is F23<T>);
     // In checked mode, verifies the type.
     x23 = m23;
diff --git a/tests/language_2/function_type/function_type20_test.dart b/tests/language_2/function_type/function_type20_test.dart
index 309f554..446bf0a 100644
--- a/tests/language_2/function_type/function_type20_test.dart
+++ b/tests/language_2/function_type/function_type20_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x0, {Function x});
@@ -460,8 +460,8 @@
     }
 
     Expect.isTrue(m10 is F10<T>);
-    Expect
-        .isTrue(m10 is List<Function> Function([List<Function> x1]) Function());
+    Expect.isTrue(
+        m10 is List<Function> Function([List<Function> x1]) Function());
     Expect.isTrue(confuse(m10) is F10<T>);
     // In checked mode, verifies the type.
     x10 = m10;
diff --git a/tests/language_2/function_type/function_type21_test.dart b/tests/language_2/function_type/function_type21_test.dart
index 8032999..0e9eed4 100644
--- a/tests/language_2/function_type/function_type21_test.dart
+++ b/tests/language_2/function_type/function_type21_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int y, {Function x});
@@ -390,8 +390,8 @@
     }
 
     Expect.isTrue(m8 is F8<T>);
-    Expect
-        .isTrue(m8 is Function Function(core.List<core.int> x) Function(int x));
+    Expect.isTrue(
+        m8 is Function Function(core.List<core.int> x) Function(int x));
     Expect.isTrue(confuse(m8) is F8<T>);
     // In checked mode, verifies the type.
     x8 = m8;
@@ -415,8 +415,8 @@
     }
 
     Expect.isTrue(m9 is F9<T>);
-    Expect
-        .isTrue(m9 is List<Function> Function(int x1, [int x]) Function(int x));
+    Expect.isTrue(
+        m9 is List<Function> Function(int x1, [int x]) Function(int x));
     Expect.isTrue(confuse(m9) is F9<T>);
     // In checked mode, verifies the type.
     x9 = m9;
diff --git a/tests/language_2/function_type/function_type22_test.dart b/tests/language_2/function_type/function_type22_test.dart
index 48b6b51..a746455 100644
--- a/tests/language_2/function_type/function_type22_test.dart
+++ b/tests/language_2/function_type/function_type22_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(List<Function> x);
diff --git a/tests/language_2/function_type/function_type23_test.dart b/tests/language_2/function_type/function_type23_test.dart
index 5a15edd..da420f9 100644
--- a/tests/language_2/function_type/function_type23_test.dart
+++ b/tests/language_2/function_type/function_type23_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function([List<Function> x]);
diff --git a/tests/language_2/function_type/function_type24_test.dart b/tests/language_2/function_type/function_type24_test.dart
index a45e071..ab89f88 100644
--- a/tests/language_2/function_type/function_type24_test.dart
+++ b/tests/language_2/function_type/function_type24_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x0, [List<Function> x]);
@@ -389,8 +389,8 @@
     }
 
     Expect.isTrue(m6 is F6<T>);
-    Expect
-        .isTrue(m6 is int Function(int x, [core.List<core.int> x2]) Function());
+    Expect.isTrue(
+        m6 is int Function(int x, [core.List<core.int> x2]) Function());
     Expect.isTrue(confuse(m6) is F6<T>);
     // In checked mode, verifies the type.
     x6 = m6;
@@ -511,8 +511,8 @@
     }
 
     Expect.isTrue(m11 is F11<T>);
-    Expect
-        .isTrue(m11 is List<Function> Function(int x0, {List<T> x}) Function());
+    Expect.isTrue(
+        m11 is List<Function> Function(int x0, {List<T> x}) Function());
     Expect.isTrue(confuse(m11) is F11<T>);
     // In checked mode, verifies the type.
     x11 = m11;
diff --git a/tests/language_2/function_type/function_type25_test.dart b/tests/language_2/function_type/function_type25_test.dart
index 7d2110e..dfa26f3 100644
--- a/tests/language_2/function_type/function_type25_test.dart
+++ b/tests/language_2/function_type/function_type25_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int y, [List<Function> x]);
@@ -465,8 +465,8 @@
     }
 
     Expect.isTrue(m9 is F9<T>);
-    Expect
-        .isTrue(m9 is List<Function> Function(int y, [int x]) Function(int x));
+    Expect.isTrue(
+        m9 is List<Function> Function(int y, [int x]) Function(int x));
     Expect.isTrue(confuse(m9) is F9<T>);
     // In checked mode, verifies the type.
     x9 = m9;
diff --git a/tests/language_2/function_type/function_type26_test.dart b/tests/language_2/function_type/function_type26_test.dart
index 548f4b7..5d6141a 100644
--- a/tests/language_2/function_type/function_type26_test.dart
+++ b/tests/language_2/function_type/function_type26_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(List<Function> x0);
@@ -392,8 +392,8 @@
     }
 
     Expect.isTrue(m5 is F5<T>);
-    Expect
-        .isTrue(m5 is int Function(Function x1) Function<B extends core.int>());
+    Expect.isTrue(
+        m5 is int Function(Function x1) Function<B extends core.int>());
     Expect.isTrue(confuse(m5) is F5<T>);
     // In checked mode, verifies the type.
     x5 = m5;
@@ -774,8 +774,8 @@
     }
 
     Expect.isTrue(m16 is F16<T>);
-    Expect
-        .isTrue(m16 is Function(int y, {int x}) Function<B extends core.int>());
+    Expect.isTrue(
+        m16 is Function(int y, {int x}) Function<B extends core.int>());
     Expect.isTrue(confuse(m16) is F16<T>);
     // In checked mode, verifies the type.
     x16 = m16;
diff --git a/tests/language_2/function_type/function_type27_test.dart b/tests/language_2/function_type/function_type27_test.dart
index 47e2080..79a07bd7 100644
--- a/tests/language_2/function_type/function_type27_test.dart
+++ b/tests/language_2/function_type/function_type27_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function([List<Function> x1]);
diff --git a/tests/language_2/function_type/function_type28_test.dart b/tests/language_2/function_type/function_type28_test.dart
index eb9f027..f40ad19 100644
--- a/tests/language_2/function_type/function_type28_test.dart
+++ b/tests/language_2/function_type/function_type28_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x1, [List<Function> x2]);
@@ -510,8 +510,8 @@
     }
 
     Expect.isTrue(m11 is F11<T>);
-    Expect
-        .isTrue(m11 is List<Function> Function(int y, {List<T> x}) Function());
+    Expect.isTrue(
+        m11 is List<Function> Function(int y, {List<T> x}) Function());
     Expect.isTrue(confuse(m11) is F11<T>);
     // In checked mode, verifies the type.
     x11 = m11;
diff --git a/tests/language_2/function_type/function_type29_test.dart b/tests/language_2/function_type/function_type29_test.dart
index 0409edc..dfc8fdf 100644
--- a/tests/language_2/function_type/function_type29_test.dart
+++ b/tests/language_2/function_type/function_type29_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x, [List<Function> x2]);
@@ -639,8 +639,8 @@
     }
 
     Expect.isTrue(m14 is F14<T>);
-    Expect
-        .isTrue(m14 is List<T> Function(int x2, [Function x3]) Function(int x));
+    Expect.isTrue(
+        m14 is List<T> Function(int x2, [Function x3]) Function(int x));
     Expect.isTrue(confuse(m14) is F14<T>);
     // In checked mode, verifies the type.
     x14 = m14;
@@ -860,8 +860,8 @@
     }
 
     Expect.isTrue(m21 is F21<T>);
-    Expect
-        .isTrue(m21 is core.List<core.int> Function<A>(int x) Function(int x));
+    Expect.isTrue(
+        m21 is core.List<core.int> Function<A>(int x) Function(int x));
     Expect.isTrue(confuse(m21) is F21<T>);
     // In checked mode, verifies the type.
     x21 = m21;
diff --git a/tests/language_2/function_type/function_type2_test.dart b/tests/language_2/function_type/function_type2_test.dart
index 037aea9c..bb0b4f0 100644
--- a/tests/language_2/function_type/function_type2_test.dart
+++ b/tests/language_2/function_type/function_type2_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x0, [int x]);
diff --git a/tests/language_2/function_type/function_type30_test.dart b/tests/language_2/function_type/function_type30_test.dart
index 2566334..5662b44 100644
--- a/tests/language_2/function_type/function_type30_test.dart
+++ b/tests/language_2/function_type/function_type30_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function({List<Function> x});
@@ -818,8 +818,8 @@
     }
 
     Expect.isTrue(m18 is F18<T>);
-    Expect
-        .isTrue(m18 is void Function([int x1]) Function<B extends core.int>());
+    Expect.isTrue(
+        m18 is void Function([int x1]) Function<B extends core.int>());
     Expect.isTrue(confuse(m18) is F18<T>);
     // In checked mode, verifies the type.
     x18 = m18;
diff --git a/tests/language_2/function_type/function_type31_test.dart b/tests/language_2/function_type/function_type31_test.dart
index 316fa98..29248f9 100644
--- a/tests/language_2/function_type/function_type31_test.dart
+++ b/tests/language_2/function_type/function_type31_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x0, {List<Function> x});
diff --git a/tests/language_2/function_type/function_type32_test.dart b/tests/language_2/function_type/function_type32_test.dart
index d2ded1b..0186636 100644
--- a/tests/language_2/function_type/function_type32_test.dart
+++ b/tests/language_2/function_type/function_type32_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int y, {List<Function> x});
@@ -364,8 +364,8 @@
     }
 
     Expect.isTrue(m6 is F6<T>);
-    Expect
-        .isTrue(m6 is int Function(int x0, {core.List<core.int> x}) Function());
+    Expect.isTrue(
+        m6 is int Function(int x0, {core.List<core.int> x}) Function());
     Expect.isTrue(confuse(m6) is F6<T>);
     // In checked mode, verifies the type.
     x6 = m6;
@@ -462,8 +462,8 @@
     }
 
     Expect.isTrue(m10 is F10<T>);
-    Expect
-        .isTrue(m10 is List<Function> Function({List<Function> x}) Function());
+    Expect.isTrue(
+        m10 is List<Function> Function({List<Function> x}) Function());
     Expect.isTrue(confuse(m10) is F10<T>);
     // In checked mode, verifies the type.
     x10 = m10;
@@ -804,8 +804,8 @@
     }
 
     Expect.isTrue(m21 is F21<T>);
-    Expect
-        .isTrue(m21 is core.List<core.int> Function<A>(Function x) Function());
+    Expect.isTrue(
+        m21 is core.List<core.int> Function<A>(Function x) Function());
     Expect.isTrue(confuse(m21) is F21<T>);
     // In checked mode, verifies the type.
     x21 = m21;
diff --git a/tests/language_2/function_type/function_type33_test.dart b/tests/language_2/function_type/function_type33_test.dart
index b3f0e95..78c3361 100644
--- a/tests/language_2/function_type/function_type33_test.dart
+++ b/tests/language_2/function_type/function_type33_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(core.List<core.int> x);
@@ -590,8 +590,8 @@
     }
 
     Expect.isTrue(m14 is F14<T>);
-    Expect
-        .isTrue(m14 is List<T> Function(int x, [Function x1]) Function(int x));
+    Expect.isTrue(
+        m14 is List<T> Function(int x, [Function x1]) Function(int x));
     Expect.isTrue(confuse(m14) is F14<T>);
     // In checked mode, verifies the type.
     x14 = m14;
diff --git a/tests/language_2/function_type/function_type34_test.dart b/tests/language_2/function_type/function_type34_test.dart
index 21b2d9e..0a8f873 100644
--- a/tests/language_2/function_type/function_type34_test.dart
+++ b/tests/language_2/function_type/function_type34_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function([core.List<core.int> x]);
diff --git a/tests/language_2/function_type/function_type35_test.dart b/tests/language_2/function_type/function_type35_test.dart
index 3bf2ee8..9894b76 100644
--- a/tests/language_2/function_type/function_type35_test.dart
+++ b/tests/language_2/function_type/function_type35_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x0, [core.List<core.int> x]);
diff --git a/tests/language_2/function_type/function_type36_test.dart b/tests/language_2/function_type/function_type36_test.dart
index 5ff2a9e..fda0c2d 100644
--- a/tests/language_2/function_type/function_type36_test.dart
+++ b/tests/language_2/function_type/function_type36_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int y, [core.List<core.int> x]);
@@ -364,8 +364,8 @@
     }
 
     Expect.isTrue(m6 is F6<T>);
-    Expect
-        .isTrue(m6 is int Function(int y, {core.List<core.int> x}) Function());
+    Expect.isTrue(
+        m6 is int Function(int y, {core.List<core.int> x}) Function());
     Expect.isTrue(confuse(m6) is F6<T>);
     // In checked mode, verifies the type.
     x6 = m6;
diff --git a/tests/language_2/function_type/function_type37_test.dart b/tests/language_2/function_type/function_type37_test.dart
index b95aab2..cb342f4 100644
--- a/tests/language_2/function_type/function_type37_test.dart
+++ b/tests/language_2/function_type/function_type37_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(core.List<core.int> x0);
@@ -833,8 +833,8 @@
     }
 
     Expect.isTrue(m23 is F23<T>);
-    Expect
-        .isTrue(m23 is void Function(B x) Function<B extends core.int>(int x));
+    Expect.isTrue(
+        m23 is void Function(B x) Function<B extends core.int>(int x));
     Expect.isTrue(confuse(m23) is F23<T>);
     // In checked mode, verifies the type.
     x23 = m23;
diff --git a/tests/language_2/function_type/function_type38_test.dart b/tests/language_2/function_type/function_type38_test.dart
index 3b516f4..b21a02f 100644
--- a/tests/language_2/function_type/function_type38_test.dart
+++ b/tests/language_2/function_type/function_type38_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function([core.List<core.int> x1]);
diff --git a/tests/language_2/function_type/function_type39_test.dart b/tests/language_2/function_type/function_type39_test.dart
index e2e783b..b42345c 100644
--- a/tests/language_2/function_type/function_type39_test.dart
+++ b/tests/language_2/function_type/function_type39_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x1, [core.List<core.int> x2]);
diff --git a/tests/language_2/function_type/function_type3_test.dart b/tests/language_2/function_type/function_type3_test.dart
index dcf1fbd..5a6511e 100644
--- a/tests/language_2/function_type/function_type3_test.dart
+++ b/tests/language_2/function_type/function_type3_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int y, [int x]);
diff --git a/tests/language_2/function_type/function_type40_test.dart b/tests/language_2/function_type/function_type40_test.dart
index d2b20de..e19b28b 100644
--- a/tests/language_2/function_type/function_type40_test.dart
+++ b/tests/language_2/function_type/function_type40_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x, [core.List<core.int> x2]);
diff --git a/tests/language_2/function_type/function_type41_test.dart b/tests/language_2/function_type/function_type41_test.dart
index 16ee14a..e7cacec 100644
--- a/tests/language_2/function_type/function_type41_test.dart
+++ b/tests/language_2/function_type/function_type41_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function({core.List<core.int> x});
@@ -391,8 +391,8 @@
     }
 
     Expect.isTrue(m7 is F7<T>);
-    Expect
-        .isTrue(m7 is Function Function(int x1, [Function x]) Function(int x));
+    Expect.isTrue(
+        m7 is Function Function(int x1, [Function x]) Function(int x));
     Expect.isTrue(confuse(m7) is F7<T>);
     // In checked mode, verifies the type.
     x7 = m7;
@@ -441,8 +441,8 @@
     }
 
     Expect.isTrue(m9 is F9<T>);
-    Expect
-        .isTrue(m9 is List<Function> Function(int x, [int x1]) Function(int x));
+    Expect.isTrue(
+        m9 is List<Function> Function(int x, [int x1]) Function(int x));
     Expect.isTrue(confuse(m9) is F9<T>);
     // In checked mode, verifies the type.
     x9 = m9;
@@ -590,8 +590,8 @@
     }
 
     Expect.isTrue(m14 is F14<T>);
-    Expect
-        .isTrue(m14 is List<T> Function(int x1, {Function x}) Function(int x));
+    Expect.isTrue(
+        m14 is List<T> Function(int x1, {Function x}) Function(int x));
     Expect.isTrue(confuse(m14) is F14<T>);
     // In checked mode, verifies the type.
     x14 = m14;
diff --git a/tests/language_2/function_type/function_type42_test.dart b/tests/language_2/function_type/function_type42_test.dart
index ad22438..be92a16 100644
--- a/tests/language_2/function_type/function_type42_test.dart
+++ b/tests/language_2/function_type/function_type42_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x0, {core.List<core.int> x});
@@ -867,8 +867,8 @@
     }
 
     Expect.isTrue(m22 is F22<T>);
-    Expect
-        .isTrue(m22 is A Function<A>(List<T> x) Function<B extends core.int>());
+    Expect.isTrue(
+        m22 is A Function<A>(List<T> x) Function<B extends core.int>());
     Expect.isTrue(confuse(m22) is F22<T>);
     // In checked mode, verifies the type.
     x22 = m22;
diff --git a/tests/language_2/function_type/function_type43_test.dart b/tests/language_2/function_type/function_type43_test.dart
index 021372b..31f94f2 100644
--- a/tests/language_2/function_type/function_type43_test.dart
+++ b/tests/language_2/function_type/function_type43_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int y, {core.List<core.int> x});
diff --git a/tests/language_2/function_type/function_type44_test.dart b/tests/language_2/function_type/function_type44_test.dart
index 868ce4f..2af4fd2 100644
--- a/tests/language_2/function_type/function_type44_test.dart
+++ b/tests/language_2/function_type/function_type44_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(List<T> x);
diff --git a/tests/language_2/function_type/function_type45_test.dart b/tests/language_2/function_type/function_type45_test.dart
index 0a91c9c..70af4a7 100644
--- a/tests/language_2/function_type/function_type45_test.dart
+++ b/tests/language_2/function_type/function_type45_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function([List<T> x]);
@@ -784,8 +784,8 @@
     }
 
     Expect.isTrue(m19 is F19<T>);
-    Expect
-        .isTrue(m19 is void Function([core.List<core.int> x]) Function(int x));
+    Expect.isTrue(
+        m19 is void Function([core.List<core.int> x]) Function(int x));
     Expect.isTrue(confuse(m19) is F19<T>);
     // In checked mode, verifies the type.
     x19 = m19;
@@ -809,8 +809,8 @@
     }
 
     Expect.isTrue(m20 is F20<T>);
-    Expect
-        .isTrue(m20 is int Function<A>(core.List<core.int> x) Function(int x));
+    Expect.isTrue(
+        m20 is int Function<A>(core.List<core.int> x) Function(int x));
     Expect.isTrue(confuse(m20) is F20<T>);
     // In checked mode, verifies the type.
     x20 = m20;
diff --git a/tests/language_2/function_type/function_type46_test.dart b/tests/language_2/function_type/function_type46_test.dart
index e04969b..60760e3 100644
--- a/tests/language_2/function_type/function_type46_test.dart
+++ b/tests/language_2/function_type/function_type46_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x0, [List<T> x]);
@@ -388,8 +388,8 @@
     }
 
     Expect.isTrue(m6 is F6<T>);
-    Expect
-        .isTrue(m6 is int Function([List<T> x]) Function<B extends core.int>());
+    Expect.isTrue(
+        m6 is int Function([List<T> x]) Function<B extends core.int>());
     Expect.isTrue(confuse(m6) is F6<T>);
     // In checked mode, verifies the type.
     x6 = m6;
diff --git a/tests/language_2/function_type/function_type47_test.dart b/tests/language_2/function_type/function_type47_test.dart
index 2f45775..999e76c 100644
--- a/tests/language_2/function_type/function_type47_test.dart
+++ b/tests/language_2/function_type/function_type47_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int y, [List<T> x]);
@@ -263,8 +263,8 @@
     }
 
     Expect.isTrue(m1 is F1<T>);
-    Expect
-        .isTrue(m1 is List<Function> Function(int x0, [core.List<core.int> x]));
+    Expect.isTrue(
+        m1 is List<Function> Function(int x0, [core.List<core.int> x]));
     Expect.isTrue(confuse(m1) is F1<T>);
     // In checked mode, verifies the type.
     x1 = m1;
diff --git a/tests/language_2/function_type/function_type48_test.dart b/tests/language_2/function_type/function_type48_test.dart
index 93da37a..da44e79 100644
--- a/tests/language_2/function_type/function_type48_test.dart
+++ b/tests/language_2/function_type/function_type48_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(List<T> x0);
@@ -219,8 +219,8 @@
     }
 
     Expect.isTrue(m1 is F1<T>);
-    Expect
-        .isTrue(m1 is List<Function> Function(int y, [core.List<core.int> x]));
+    Expect.isTrue(
+        m1 is List<Function> Function(int y, [core.List<core.int> x]));
     Expect.isTrue(confuse(m1) is F1<T>);
     // In checked mode, verifies the type.
     x1 = m1;
@@ -512,8 +512,8 @@
     }
 
     Expect.isTrue(m11 is F11<T>);
-    Expect
-        .isTrue(m11 is core.List<core.int> Function(int y, [int x]) Function());
+    Expect.isTrue(
+        m11 is core.List<core.int> Function(int y, [int x]) Function());
     Expect.isTrue(confuse(m11) is F11<T>);
     // In checked mode, verifies the type.
     x11 = m11;
diff --git a/tests/language_2/function_type/function_type49_test.dart b/tests/language_2/function_type/function_type49_test.dart
index 191da6a..8e7e84b 100644
--- a/tests/language_2/function_type/function_type49_test.dart
+++ b/tests/language_2/function_type/function_type49_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function([List<T> x1]);
@@ -465,8 +465,8 @@
     }
 
     Expect.isTrue(m9 is F9<T>);
-    Expect
-        .isTrue(m9 is List<Function> Function(int x1, {int x}) Function(int x));
+    Expect.isTrue(
+        m9 is List<Function> Function(int x1, {int x}) Function(int x));
     Expect.isTrue(confuse(m9) is F9<T>);
     // In checked mode, verifies the type.
     x9 = m9;
diff --git a/tests/language_2/function_type/function_type4_test.dart b/tests/language_2/function_type/function_type4_test.dart
index a5b8533..6eafe68 100644
--- a/tests/language_2/function_type/function_type4_test.dart
+++ b/tests/language_2/function_type/function_type4_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x0);
@@ -365,8 +365,8 @@
     }
 
     Expect.isTrue(m6 is F6<T>);
-    Expect
-        .isTrue(m6 is int Function(int x0, [core.List<core.int> x]) Function());
+    Expect.isTrue(
+        m6 is int Function(int x0, [core.List<core.int> x]) Function());
     Expect.isTrue(confuse(m6) is F6<T>);
     // In checked mode, verifies the type.
     x6 = m6;
@@ -414,8 +414,8 @@
     }
 
     Expect.isTrue(m8 is F8<T>);
-    Expect
-        .isTrue(m8 is Function Function(int x, [List<Function> x2]) Function());
+    Expect.isTrue(
+        m8 is Function Function(int x, [List<Function> x2]) Function());
     Expect.isTrue(confuse(m8) is F8<T>);
     // In checked mode, verifies the type.
     x8 = m8;
@@ -488,8 +488,8 @@
     }
 
     Expect.isTrue(m10 is F10<T>);
-    Expect
-        .isTrue(m10 is List<Function> Function([List<Function> x]) Function());
+    Expect.isTrue(
+        m10 is List<Function> Function([List<Function> x]) Function());
     Expect.isTrue(confuse(m10) is F10<T>);
     // In checked mode, verifies the type.
     x10 = m10;
@@ -858,8 +858,8 @@
     }
 
     Expect.isTrue(m21 is F21<T>);
-    Expect
-        .isTrue(m21 is List<Function> Function<A>(List<Function> x) Function());
+    Expect.isTrue(
+        m21 is List<Function> Function<A>(List<Function> x) Function());
     Expect.isTrue(confuse(m21) is F21<T>);
     // In checked mode, verifies the type.
     x21 = m21;
diff --git a/tests/language_2/function_type/function_type50_test.dart b/tests/language_2/function_type/function_type50_test.dart
index e1b7cb3..ca0d344 100644
--- a/tests/language_2/function_type/function_type50_test.dart
+++ b/tests/language_2/function_type/function_type50_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x1, [List<T> x2]);
@@ -745,8 +745,8 @@
     }
 
     Expect.isTrue(m16 is F16<T>);
-    Expect
-        .isTrue(m16 is Function([Function x1]) Function<B extends core.int>());
+    Expect.isTrue(
+        m16 is Function([Function x1]) Function<B extends core.int>());
     Expect.isTrue(confuse(m16) is F16<T>);
     // In checked mode, verifies the type.
     x16 = m16;
diff --git a/tests/language_2/function_type/function_type51_test.dart b/tests/language_2/function_type/function_type51_test.dart
index 2067e2c..e642bb5 100644
--- a/tests/language_2/function_type/function_type51_test.dart
+++ b/tests/language_2/function_type/function_type51_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x, [List<T> x2]);
@@ -936,8 +936,8 @@
     }
 
     Expect.isTrue(m22 is F22<T>);
-    Expect
-        .isTrue(m22 is A Function<A>(A x) Function<B extends core.int>(int x));
+    Expect.isTrue(
+        m22 is A Function<A>(A x) Function<B extends core.int>(int x));
     Expect.isTrue(confuse(m22) is F22<T>);
     // In checked mode, verifies the type.
     x22 = m22;
diff --git a/tests/language_2/function_type/function_type52_test.dart b/tests/language_2/function_type/function_type52_test.dart
index d03a4db..3df824e 100644
--- a/tests/language_2/function_type/function_type52_test.dart
+++ b/tests/language_2/function_type/function_type52_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function({List<T> x});
@@ -215,8 +215,8 @@
     }
 
     Expect.isTrue(m1 is F1<T>);
-    Expect
-        .isTrue(m1 is List<Function> Function(int x, [core.List<core.int> x2]));
+    Expect.isTrue(
+        m1 is List<Function> Function(int x, [core.List<core.int> x2]));
     Expect.isTrue(confuse(m1) is F1<T>);
     // In checked mode, verifies the type.
     x1 = m1;
diff --git a/tests/language_2/function_type/function_type53_test.dart b/tests/language_2/function_type/function_type53_test.dart
index 6545f70..fc6c8ca 100644
--- a/tests/language_2/function_type/function_type53_test.dart
+++ b/tests/language_2/function_type/function_type53_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x0, {List<T> x});
@@ -459,8 +459,8 @@
     }
 
     Expect.isTrue(m9 is F9<T>);
-    Expect
-        .isTrue(m9 is List<Function> Function(int y, {int x}) Function(int x));
+    Expect.isTrue(
+        m9 is List<Function> Function(int y, {int x}) Function(int x));
     Expect.isTrue(confuse(m9) is F9<T>);
     // In checked mode, verifies the type.
     x9 = m9;
diff --git a/tests/language_2/function_type/function_type54_test.dart b/tests/language_2/function_type/function_type54_test.dart
index 30f30c3..a940fdc 100644
--- a/tests/language_2/function_type/function_type54_test.dart
+++ b/tests/language_2/function_type/function_type54_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int y, {List<T> x});
@@ -234,8 +234,8 @@
     }
 
     Expect.isTrue(m1 is F1<T>);
-    Expect
-        .isTrue(m1 is List<Function> Function(int x0, {core.List<core.int> x}));
+    Expect.isTrue(
+        m1 is List<Function> Function(int x0, {core.List<core.int> x}));
     Expect.isTrue(confuse(m1) is F1<T>);
     // In checked mode, verifies the type.
     x1 = m1;
@@ -888,8 +888,8 @@
     }
 
     Expect.isTrue(m22 is F22<T>);
-    Expect
-        .isTrue(m22 is A Function<A>(List<A> x) Function<B extends core.int>());
+    Expect.isTrue(
+        m22 is A Function<A>(List<A> x) Function<B extends core.int>());
     Expect.isTrue(confuse(m22) is F22<T>);
     // In checked mode, verifies the type.
     x22 = m22;
diff --git a/tests/language_2/function_type/function_type55_test.dart b/tests/language_2/function_type/function_type55_test.dart
index 6589938..333f42b 100644
--- a/tests/language_2/function_type/function_type55_test.dart
+++ b/tests/language_2/function_type/function_type55_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function();
@@ -225,8 +225,8 @@
     }
 
     Expect.isTrue(m1 is F1<T>);
-    Expect
-        .isTrue(m1 is List<Function> Function(int y, {core.List<core.int> x}));
+    Expect.isTrue(
+        m1 is List<Function> Function(int y, {core.List<core.int> x}));
     Expect.isTrue(confuse(m1) is F1<T>);
     // In checked mode, verifies the type.
     x1 = m1;
diff --git a/tests/language_2/function_type/function_type56_test.dart b/tests/language_2/function_type/function_type56_test.dart
index 521eded..622b5d5 100644
--- a/tests/language_2/function_type/function_type56_test.dart
+++ b/tests/language_2/function_type/function_type56_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x);
@@ -579,8 +579,8 @@
     }
 
     Expect.isTrue(m14 is F14<T>);
-    Expect
-        .isTrue(m14 is List<T> Function(int x0, [List<Function> x]) Function());
+    Expect.isTrue(
+        m14 is List<T> Function(int x0, [List<Function> x]) Function());
     Expect.isTrue(confuse(m14) is F14<T>);
     // In checked mode, verifies the type.
     x14 = m14;
diff --git a/tests/language_2/function_type/function_type57_test.dart b/tests/language_2/function_type/function_type57_test.dart
index d25f4ce..ecf15d4 100644
--- a/tests/language_2/function_type/function_type57_test.dart
+++ b/tests/language_2/function_type/function_type57_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function([int x]);
@@ -410,8 +410,8 @@
     }
 
     Expect.isTrue(m7 is F7<T>);
-    Expect
-        .isTrue(m7 is Function Function(int x2, [Function x3]) Function(int x));
+    Expect.isTrue(
+        m7 is Function Function(int x2, [Function x3]) Function(int x));
     Expect.isTrue(confuse(m7) is F7<T>);
     // In checked mode, verifies the type.
     x7 = m7;
@@ -509,8 +509,8 @@
     }
 
     Expect.isTrue(m11 is F11<T>);
-    Expect
-        .isTrue(m11 is core.List<core.int> Function([int x1]) Function(int x));
+    Expect.isTrue(
+        m11 is core.List<core.int> Function([int x1]) Function(int x));
     Expect.isTrue(confuse(m11) is F11<T>);
     // In checked mode, verifies the type.
     x11 = m11;
diff --git a/tests/language_2/function_type/function_type58_test.dart b/tests/language_2/function_type/function_type58_test.dart
index d1a1628..52ceae9 100644
--- a/tests/language_2/function_type/function_type58_test.dart
+++ b/tests/language_2/function_type/function_type58_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x0, [int x]);
@@ -381,8 +381,8 @@
     }
 
     Expect.isTrue(m6 is F6<T>);
-    Expect
-        .isTrue(m6 is int Function(List<T> x1) Function<B extends core.int>());
+    Expect.isTrue(
+        m6 is int Function(List<T> x1) Function<B extends core.int>());
     Expect.isTrue(confuse(m6) is F6<T>);
     // In checked mode, verifies the type.
     x6 = m6;
diff --git a/tests/language_2/function_type/function_type59_test.dart b/tests/language_2/function_type/function_type59_test.dart
index c3f76a6..4431f9b 100644
--- a/tests/language_2/function_type/function_type59_test.dart
+++ b/tests/language_2/function_type/function_type59_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int y, [int x]);
diff --git a/tests/language_2/function_type/function_type5_test.dart b/tests/language_2/function_type/function_type5_test.dart
index 2a671da..b159028 100644
--- a/tests/language_2/function_type/function_type5_test.dart
+++ b/tests/language_2/function_type/function_type5_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function([int x1]);
diff --git a/tests/language_2/function_type/function_type60_test.dart b/tests/language_2/function_type/function_type60_test.dart
index 1a897b2..dae537b 100644
--- a/tests/language_2/function_type/function_type60_test.dart
+++ b/tests/language_2/function_type/function_type60_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x0);
@@ -630,8 +630,8 @@
     }
 
     Expect.isTrue(m14 is F14<T>);
-    Expect
-        .isTrue(m14 is List<T> Function(int y, [List<Function> x]) Function());
+    Expect.isTrue(
+        m14 is List<T> Function(int y, [List<Function> x]) Function());
     Expect.isTrue(confuse(m14) is F14<T>);
     // In checked mode, verifies the type.
     x14 = m14;
diff --git a/tests/language_2/function_type/function_type61_test.dart b/tests/language_2/function_type/function_type61_test.dart
index 67ca834..3cee969 100644
--- a/tests/language_2/function_type/function_type61_test.dart
+++ b/tests/language_2/function_type/function_type61_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function([int x1]);
@@ -337,8 +337,8 @@
     }
 
     Expect.isTrue(m5 is F5<T>);
-    Expect
-        .isTrue(m5 is int Function(int x1, [List<Function> x]) Function(int x));
+    Expect.isTrue(
+        m5 is int Function(int x1, [List<Function> x]) Function(int x));
     Expect.isTrue(confuse(m5) is F5<T>);
     // In checked mode, verifies the type.
     x5 = m5;
@@ -411,8 +411,8 @@
     }
 
     Expect.isTrue(m7 is F7<T>);
-    Expect
-        .isTrue(m7 is Function Function(int x, [Function x1]) Function(int x));
+    Expect.isTrue(
+        m7 is Function Function(int x, [Function x1]) Function(int x));
     Expect.isTrue(confuse(m7) is F7<T>);
     // In checked mode, verifies the type.
     x7 = m7;
@@ -661,8 +661,8 @@
     }
 
     Expect.isTrue(m15 is F15<T>);
-    Expect
-        .isTrue(m15 is List<T> Function(int x2, [List<T> x3]) Function(int x));
+    Expect.isTrue(
+        m15 is List<T> Function(int x2, [List<T> x3]) Function(int x));
     Expect.isTrue(confuse(m15) is F15<T>);
     // In checked mode, verifies the type.
     x15 = m15;
@@ -808,8 +808,8 @@
     }
 
     Expect.isTrue(m19 is F19<T>);
-    Expect
-        .isTrue(m19 is void Function([core.List<core.int> x1]) Function(int x));
+    Expect.isTrue(
+        m19 is void Function([core.List<core.int> x1]) Function(int x));
     Expect.isTrue(confuse(m19) is F19<T>);
     // In checked mode, verifies the type.
     x19 = m19;
diff --git a/tests/language_2/function_type/function_type62_test.dart b/tests/language_2/function_type/function_type62_test.dart
index 423b84d..ac4114d 100644
--- a/tests/language_2/function_type/function_type62_test.dart
+++ b/tests/language_2/function_type/function_type62_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x1, [int x2]);
@@ -588,8 +588,8 @@
     }
 
     Expect.isTrue(m13 is F13<T>);
-    Expect
-        .isTrue(m13 is List<T> Function(int x) Function<B extends core.int>());
+    Expect.isTrue(
+        m13 is List<T> Function(int x) Function<B extends core.int>());
     Expect.isTrue(confuse(m13) is F13<T>);
     // In checked mode, verifies the type.
     x13 = m13;
diff --git a/tests/language_2/function_type/function_type63_test.dart b/tests/language_2/function_type/function_type63_test.dart
index 5c8ee24..ff72ac9 100644
--- a/tests/language_2/function_type/function_type63_test.dart
+++ b/tests/language_2/function_type/function_type63_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x, [int x2]);
@@ -783,8 +783,8 @@
     }
 
     Expect.isTrue(m17 is F17<T>);
-    Expect
-        .isTrue(m17 is Function(List<T> x) Function<B extends core.int>(int x));
+    Expect.isTrue(
+        m17 is Function(List<T> x) Function<B extends core.int>(int x));
     Expect.isTrue(confuse(m17) is F17<T>);
     // In checked mode, verifies the type.
     x17 = m17;
diff --git a/tests/language_2/function_type/function_type64_test.dart b/tests/language_2/function_type/function_type64_test.dart
index 9922617..e0a1c6d 100644
--- a/tests/language_2/function_type/function_type64_test.dart
+++ b/tests/language_2/function_type/function_type64_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function({int x});
@@ -481,8 +481,8 @@
     }
 
     Expect.isTrue(m9 is F9<T>);
-    Expect
-        .isTrue(m9 is List<Function> Function(int x0, [Function x]) Function());
+    Expect.isTrue(
+        m9 is List<Function> Function(int x0, [Function x]) Function());
     Expect.isTrue(confuse(m9) is F9<T>);
     // In checked mode, verifies the type.
     x9 = m9;
diff --git a/tests/language_2/function_type/function_type65_test.dart b/tests/language_2/function_type/function_type65_test.dart
index e197529..e479189 100644
--- a/tests/language_2/function_type/function_type65_test.dart
+++ b/tests/language_2/function_type/function_type65_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x0, {int x});
@@ -337,8 +337,8 @@
     }
 
     Expect.isTrue(m5 is F5<T>);
-    Expect
-        .isTrue(m5 is int Function(int y, [List<Function> x]) Function(int x));
+    Expect.isTrue(
+        m5 is int Function(int y, [List<Function> x]) Function(int x));
     Expect.isTrue(confuse(m5) is F5<T>);
     // In checked mode, verifies the type.
     x5 = m5;
diff --git a/tests/language_2/function_type/function_type66_test.dart b/tests/language_2/function_type/function_type66_test.dart
index 7be4bf1..c168c04 100644
--- a/tests/language_2/function_type/function_type66_test.dart
+++ b/tests/language_2/function_type/function_type66_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int y, {int x});
diff --git a/tests/language_2/function_type/function_type67_test.dart b/tests/language_2/function_type/function_type67_test.dart
index e41b790..9ca375d 100644
--- a/tests/language_2/function_type/function_type67_test.dart
+++ b/tests/language_2/function_type/function_type67_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(Function x);
@@ -324,8 +324,8 @@
     }
 
     Expect.isTrue(m4 is F4<T>);
-    Expect
-        .isTrue(m4 is int Function(int x) Function<B extends core.int>(int x));
+    Expect.isTrue(
+        m4 is int Function(int x) Function<B extends core.int>(int x));
     Expect.isTrue(confuse(m4) is F4<T>);
     // In checked mode, verifies the type.
     x4 = m4;
diff --git a/tests/language_2/function_type/function_type68_test.dart b/tests/language_2/function_type/function_type68_test.dart
index 5b5d226..feaab1f 100644
--- a/tests/language_2/function_type/function_type68_test.dart
+++ b/tests/language_2/function_type/function_type68_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function([Function x]);
@@ -456,8 +456,8 @@
     }
 
     Expect.isTrue(m9 is F9<T>);
-    Expect
-        .isTrue(m9 is List<Function> Function(int y, [Function x]) Function());
+    Expect.isTrue(
+        m9 is List<Function> Function(int y, [Function x]) Function());
     Expect.isTrue(confuse(m9) is F9<T>);
     // In checked mode, verifies the type.
     x9 = m9;
diff --git a/tests/language_2/function_type/function_type69_test.dart b/tests/language_2/function_type/function_type69_test.dart
index f2c3970..da77405 100644
--- a/tests/language_2/function_type/function_type69_test.dart
+++ b/tests/language_2/function_type/function_type69_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x0, [Function x]);
@@ -384,8 +384,8 @@
     }
 
     Expect.isTrue(m7 is F7<T>);
-    Expect
-        .isTrue(m7 is Function Function(int x1, {Function x}) Function(int x));
+    Expect.isTrue(
+        m7 is Function Function(int x1, {Function x}) Function(int x));
     Expect.isTrue(confuse(m7) is F7<T>);
     // In checked mode, verifies the type.
     x7 = m7;
diff --git a/tests/language_2/function_type/function_type6_test.dart b/tests/language_2/function_type/function_type6_test.dart
index 5ba38fb..8695a26 100644
--- a/tests/language_2/function_type/function_type6_test.dart
+++ b/tests/language_2/function_type/function_type6_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x1, [int x2]);
@@ -392,8 +392,8 @@
     }
 
     Expect.isTrue(m7 is F7<T>);
-    Expect
-        .isTrue(m7 is Function Function(int x1) Function<B extends core.int>());
+    Expect.isTrue(
+        m7 is Function Function(int x1) Function<B extends core.int>());
     Expect.isTrue(confuse(m7) is F7<T>);
     // In checked mode, verifies the type.
     x7 = m7;
diff --git a/tests/language_2/function_type/function_type70_test.dart b/tests/language_2/function_type/function_type70_test.dart
index 26e4754..369e679 100644
--- a/tests/language_2/function_type/function_type70_test.dart
+++ b/tests/language_2/function_type/function_type70_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int y, [Function x]);
diff --git a/tests/language_2/function_type/function_type71_test.dart b/tests/language_2/function_type/function_type71_test.dart
index 5d00eef..85e3986 100644
--- a/tests/language_2/function_type/function_type71_test.dart
+++ b/tests/language_2/function_type/function_type71_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(Function x0);
diff --git a/tests/language_2/function_type/function_type72_test.dart b/tests/language_2/function_type/function_type72_test.dart
index 11f438d..1f67b50 100644
--- a/tests/language_2/function_type/function_type72_test.dart
+++ b/tests/language_2/function_type/function_type72_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function([Function x1]);
diff --git a/tests/language_2/function_type/function_type73_test.dart b/tests/language_2/function_type/function_type73_test.dart
index dbe71fb..de51f95 100644
--- a/tests/language_2/function_type/function_type73_test.dart
+++ b/tests/language_2/function_type/function_type73_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x1, [Function x2]);
@@ -803,8 +803,8 @@
     }
 
     Expect.isTrue(m19 is F19<T>);
-    Expect
-        .isTrue(m19 is void Function({core.List<core.int> x}) Function(int x));
+    Expect.isTrue(
+        m19 is void Function({core.List<core.int> x}) Function(int x));
     Expect.isTrue(confuse(m19) is F19<T>);
     // In checked mode, verifies the type.
     x19 = m19;
@@ -828,8 +828,8 @@
     }
 
     Expect.isTrue(m20 is F20<T>);
-    Expect
-        .isTrue(m20 is Function Function<A>(List<Function> x) Function(int x));
+    Expect.isTrue(
+        m20 is Function Function<A>(List<Function> x) Function(int x));
     Expect.isTrue(confuse(m20) is F20<T>);
     // In checked mode, verifies the type.
     x20 = m20;
diff --git a/tests/language_2/function_type/function_type74_test.dart b/tests/language_2/function_type/function_type74_test.dart
index 500cd21..d6b9dee 100644
--- a/tests/language_2/function_type/function_type74_test.dart
+++ b/tests/language_2/function_type/function_type74_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x, [Function x2]);
@@ -359,8 +359,8 @@
     }
 
     Expect.isTrue(m6 is F6<T>);
-    Expect
-        .isTrue(m6 is int Function({List<T> x}) Function<B extends core.int>());
+    Expect.isTrue(
+        m6 is int Function({List<T> x}) Function<B extends core.int>());
     Expect.isTrue(confuse(m6) is F6<T>);
     // In checked mode, verifies the type.
     x6 = m6;
diff --git a/tests/language_2/function_type/function_type75_test.dart b/tests/language_2/function_type/function_type75_test.dart
index 2ea274d..2e277f9 100644
--- a/tests/language_2/function_type/function_type75_test.dart
+++ b/tests/language_2/function_type/function_type75_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function({Function x});
diff --git a/tests/language_2/function_type/function_type76_test.dart b/tests/language_2/function_type/function_type76_test.dart
index 6ee0cf4..b5df005 100644
--- a/tests/language_2/function_type/function_type76_test.dart
+++ b/tests/language_2/function_type/function_type76_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x0, {Function x});
@@ -505,8 +505,8 @@
     }
 
     Expect.isTrue(m11 is F11<T>);
-    Expect
-        .isTrue(m11 is core.List<core.int> Function(int y, {int x}) Function());
+    Expect.isTrue(
+        m11 is core.List<core.int> Function(int y, {int x}) Function());
     Expect.isTrue(confuse(m11) is F11<T>);
     // In checked mode, verifies the type.
     x11 = m11;
@@ -606,8 +606,8 @@
     }
 
     Expect.isTrue(m14 is F14<T>);
-    Expect
-        .isTrue(m14 is List<T> Function(int x, [List<Function> x2]) Function());
+    Expect.isTrue(
+        m14 is List<T> Function(int x, [List<Function> x2]) Function());
     Expect.isTrue(confuse(m14) is F14<T>);
     // In checked mode, verifies the type.
     x14 = m14;
@@ -827,8 +827,8 @@
     }
 
     Expect.isTrue(m20 is F20<T>);
-    Expect
-        .isTrue(m20 is Function Function<A>(core.List<core.int> x) Function());
+    Expect.isTrue(
+        m20 is Function Function<A>(core.List<core.int> x) Function());
     Expect.isTrue(confuse(m20) is F20<T>);
     // In checked mode, verifies the type.
     x20 = m20;
diff --git a/tests/language_2/function_type/function_type77_test.dart b/tests/language_2/function_type/function_type77_test.dart
index 52cee15..6ffd0bd 100644
--- a/tests/language_2/function_type/function_type77_test.dart
+++ b/tests/language_2/function_type/function_type77_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int y, {Function x});
diff --git a/tests/language_2/function_type/function_type78_test.dart b/tests/language_2/function_type/function_type78_test.dart
index 57d57ee..2d78785 100644
--- a/tests/language_2/function_type/function_type78_test.dart
+++ b/tests/language_2/function_type/function_type78_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(List<Function> x);
@@ -592,8 +592,8 @@
     }
 
     Expect.isTrue(m13 is F13<T>);
-    Expect
-        .isTrue(m13 is List<T> Function(int x1) Function<B extends core.int>());
+    Expect.isTrue(
+        m13 is List<T> Function(int x1) Function<B extends core.int>());
     Expect.isTrue(confuse(m13) is F13<T>);
     // In checked mode, verifies the type.
     x13 = m13;
diff --git a/tests/language_2/function_type/function_type79_test.dart b/tests/language_2/function_type/function_type79_test.dart
index 2207d49..3fb7995 100644
--- a/tests/language_2/function_type/function_type79_test.dart
+++ b/tests/language_2/function_type/function_type79_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function([List<Function> x]);
diff --git a/tests/language_2/function_type/function_type7_test.dart b/tests/language_2/function_type/function_type7_test.dart
index 0e12135..5a56e1e 100644
--- a/tests/language_2/function_type/function_type7_test.dart
+++ b/tests/language_2/function_type/function_type7_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x, [int x2]);
@@ -742,8 +742,8 @@
     }
 
     Expect.isTrue(m16 is F16<T>);
-    Expect
-        .isTrue(m16 is Function([int x1]) Function<B extends core.int>(int x));
+    Expect.isTrue(
+        m16 is Function([int x1]) Function<B extends core.int>(int x));
     Expect.isTrue(confuse(m16) is F16<T>);
     // In checked mode, verifies the type.
     x16 = m16;
diff --git a/tests/language_2/function_type/function_type80_test.dart b/tests/language_2/function_type/function_type80_test.dart
index 91485c1..631c3ec 100644
--- a/tests/language_2/function_type/function_type80_test.dart
+++ b/tests/language_2/function_type/function_type80_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x0, [List<Function> x]);
diff --git a/tests/language_2/function_type/function_type81_test.dart b/tests/language_2/function_type/function_type81_test.dart
index 05c8007..5803180 100644
--- a/tests/language_2/function_type/function_type81_test.dart
+++ b/tests/language_2/function_type/function_type81_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int y, [List<Function> x]);
@@ -313,8 +313,8 @@
     }
 
     Expect.isTrue(m5 is F5<T>);
-    Expect
-        .isTrue(m5 is int Function(int x, [List<Function> x1]) Function(int x));
+    Expect.isTrue(
+        m5 is int Function(int x, [List<Function> x1]) Function(int x));
     Expect.isTrue(confuse(m5) is F5<T>);
     // In checked mode, verifies the type.
     x5 = m5;
diff --git a/tests/language_2/function_type/function_type82_test.dart b/tests/language_2/function_type/function_type82_test.dart
index 71bcf1f..3b37480 100644
--- a/tests/language_2/function_type/function_type82_test.dart
+++ b/tests/language_2/function_type/function_type82_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(List<Function> x0);
@@ -957,8 +957,8 @@
     }
 
     Expect.isTrue(m22 is F22<T>);
-    Expect
-        .isTrue(m22 is List<A> Function<A>(A x) Function<B extends core.int>());
+    Expect.isTrue(
+        m22 is List<A> Function<A>(A x) Function<B extends core.int>());
     Expect.isTrue(confuse(m22) is F22<T>);
     // In checked mode, verifies the type.
     x22 = m22;
diff --git a/tests/language_2/function_type/function_type83_test.dart b/tests/language_2/function_type/function_type83_test.dart
index 20cc30b..7713741 100644
--- a/tests/language_2/function_type/function_type83_test.dart
+++ b/tests/language_2/function_type/function_type83_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function([List<Function> x1]);
@@ -316,8 +316,8 @@
     }
 
     Expect.isTrue(m4 is F4<T>);
-    Expect
-        .isTrue(m4 is int Function(int x1) Function<B extends core.int>(int x));
+    Expect.isTrue(
+        m4 is int Function(int x1) Function<B extends core.int>(int x));
     Expect.isTrue(confuse(m4) is F4<T>);
     // In checked mode, verifies the type.
     x4 = m4;
@@ -700,8 +700,8 @@
     }
 
     Expect.isTrue(m15 is F15<T>);
-    Expect
-        .isTrue(m15 is List<T> Function() Function<B extends core.int>(int x));
+    Expect.isTrue(
+        m15 is List<T> Function() Function<B extends core.int>(int x));
     Expect.isTrue(confuse(m15) is F15<T>);
     // In checked mode, verifies the type.
     x15 = m15;
diff --git a/tests/language_2/function_type/function_type84_test.dart b/tests/language_2/function_type/function_type84_test.dart
index ee8f633..12f5a59 100644
--- a/tests/language_2/function_type/function_type84_test.dart
+++ b/tests/language_2/function_type/function_type84_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x1, [List<Function> x2]);
@@ -359,8 +359,8 @@
     }
 
     Expect.isTrue(m7 is F7<T>);
-    Expect
-        .isTrue(m7 is Function Function(int x0, [List<Function> x]) Function());
+    Expect.isTrue(
+        m7 is Function Function(int x0, [List<Function> x]) Function());
     Expect.isTrue(confuse(m7) is F7<T>);
     // In checked mode, verifies the type.
     x7 = m7;
@@ -433,8 +433,8 @@
     }
 
     Expect.isTrue(m9 is F9<T>);
-    Expect
-        .isTrue(m9 is List<Function> Function(int x, [Function x2]) Function());
+    Expect.isTrue(
+        m9 is List<Function> Function(int x, [Function x2]) Function());
     Expect.isTrue(confuse(m9) is F9<T>);
     // In checked mode, verifies the type.
     x9 = m9;
@@ -581,8 +581,8 @@
     }
 
     Expect.isTrue(m14 is F14<T>);
-    Expect
-        .isTrue(m14 is List<T> Function(int x0, {List<Function> x}) Function());
+    Expect.isTrue(
+        m14 is List<T> Function(int x0, {List<Function> x}) Function());
     Expect.isTrue(confuse(m14) is F14<T>);
     // In checked mode, verifies the type.
     x14 = m14;
diff --git a/tests/language_2/function_type/function_type85_test.dart b/tests/language_2/function_type/function_type85_test.dart
index 1147e0b..34a5836 100644
--- a/tests/language_2/function_type/function_type85_test.dart
+++ b/tests/language_2/function_type/function_type85_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x, [List<Function> x2]);
diff --git a/tests/language_2/function_type/function_type86_test.dart b/tests/language_2/function_type/function_type86_test.dart
index a7f7436..62da594 100644
--- a/tests/language_2/function_type/function_type86_test.dart
+++ b/tests/language_2/function_type/function_type86_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function({List<Function> x});
@@ -784,8 +784,8 @@
     }
 
     Expect.isTrue(m19 is F19<T>);
-    Expect
-        .isTrue(m19 is void Function(List<T> x) Function<B extends core.int>());
+    Expect.isTrue(
+        m19 is void Function(List<T> x) Function<B extends core.int>());
     Expect.isTrue(confuse(m19) is F19<T>);
     // In checked mode, verifies the type.
     x19 = m19;
@@ -858,8 +858,8 @@
     }
 
     Expect.isTrue(m21 is F21<T>);
-    Expect
-        .isTrue(m21 is List<T> Function<A>(A x) Function<B extends core.int>());
+    Expect.isTrue(
+        m21 is List<T> Function<A>(A x) Function<B extends core.int>());
     Expect.isTrue(confuse(m21) is F21<T>);
     // In checked mode, verifies the type.
     x21 = m21;
diff --git a/tests/language_2/function_type/function_type87_test.dart b/tests/language_2/function_type/function_type87_test.dart
index 048c79f..b422aab 100644
--- a/tests/language_2/function_type/function_type87_test.dart
+++ b/tests/language_2/function_type/function_type87_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x0, {List<Function> x});
diff --git a/tests/language_2/function_type/function_type88_test.dart b/tests/language_2/function_type/function_type88_test.dart
index e693d08..ef7b6ed 100644
--- a/tests/language_2/function_type/function_type88_test.dart
+++ b/tests/language_2/function_type/function_type88_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int y, {List<Function> x});
@@ -358,8 +358,8 @@
     }
 
     Expect.isTrue(m7 is F7<T>);
-    Expect
-        .isTrue(m7 is Function Function(int y, [List<Function> x]) Function());
+    Expect.isTrue(
+        m7 is Function Function(int y, [List<Function> x]) Function());
     Expect.isTrue(confuse(m7) is F7<T>);
     // In checked mode, verifies the type.
     x7 = m7;
@@ -604,8 +604,8 @@
     }
 
     Expect.isTrue(m14 is F14<T>);
-    Expect
-        .isTrue(m14 is List<T> Function(int y, {List<Function> x}) Function());
+    Expect.isTrue(
+        m14 is List<T> Function(int y, {List<Function> x}) Function());
     Expect.isTrue(confuse(m14) is F14<T>);
     // In checked mode, verifies the type.
     x14 = m14;
diff --git a/tests/language_2/function_type/function_type89_test.dart b/tests/language_2/function_type/function_type89_test.dart
index 94124a3..0db0109 100644
--- a/tests/language_2/function_type/function_type89_test.dart
+++ b/tests/language_2/function_type/function_type89_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(core.List<core.int> x);
@@ -311,8 +311,8 @@
     }
 
     Expect.isTrue(m5 is F5<T>);
-    Expect
-        .isTrue(m5 is int Function(int x1, {List<Function> x}) Function(int x));
+    Expect.isTrue(
+        m5 is int Function(int x1, {List<Function> x}) Function(int x));
     Expect.isTrue(confuse(m5) is F5<T>);
     // In checked mode, verifies the type.
     x5 = m5;
@@ -385,8 +385,8 @@
     }
 
     Expect.isTrue(m8 is F8<T>);
-    Expect
-        .isTrue(m8 is Function Function(int x2, [List<T> x3]) Function(int x));
+    Expect.isTrue(
+        m8 is Function Function(int x2, [List<T> x3]) Function(int x));
     Expect.isTrue(confuse(m8) is F8<T>);
     // In checked mode, verifies the type.
     x8 = m8;
diff --git a/tests/language_2/function_type/function_type8_test.dart b/tests/language_2/function_type/function_type8_test.dart
index 3a41b6a..09a6382 100644
--- a/tests/language_2/function_type/function_type8_test.dart
+++ b/tests/language_2/function_type/function_type8_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function({int x});
@@ -340,8 +340,8 @@
     }
 
     Expect.isTrue(m6 is F6<T>);
-    Expect
-        .isTrue(m6 is int Function(int y, [core.List<core.int> x]) Function());
+    Expect.isTrue(
+        m6 is int Function(int y, [core.List<core.int> x]) Function());
     Expect.isTrue(confuse(m6) is F6<T>);
     // In checked mode, verifies the type.
     x6 = m6;
diff --git a/tests/language_2/function_type/function_type90_test.dart b/tests/language_2/function_type/function_type90_test.dart
index 72730b2..0e79526 100644
--- a/tests/language_2/function_type/function_type90_test.dart
+++ b/tests/language_2/function_type/function_type90_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function([core.List<core.int> x]);
@@ -353,8 +353,8 @@
     }
 
     Expect.isTrue(m6 is F6<T>);
-    Expect
-        .isTrue(m6 is Function Function(int x) Function<B extends core.int>());
+    Expect.isTrue(
+        m6 is Function Function(int x) Function<B extends core.int>());
     Expect.isTrue(confuse(m6) is F6<T>);
     // In checked mode, verifies the type.
     x6 = m6;
@@ -931,8 +931,8 @@
     }
 
     Expect.isTrue(m22 is F22<T>);
-    Expect
-        .isTrue(m22 is void Function<A>(int x) Function<B extends core.int>());
+    Expect.isTrue(
+        m22 is void Function<A>(int x) Function<B extends core.int>());
     Expect.isTrue(confuse(m22) is F22<T>);
     // In checked mode, verifies the type.
     x22 = m22;
diff --git a/tests/language_2/function_type/function_type91_test.dart b/tests/language_2/function_type/function_type91_test.dart
index ee66322..3470fb1 100644
--- a/tests/language_2/function_type/function_type91_test.dart
+++ b/tests/language_2/function_type/function_type91_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x0, [core.List<core.int> x]);
diff --git a/tests/language_2/function_type/function_type92_test.dart b/tests/language_2/function_type/function_type92_test.dart
index 5803358..81c3b6e 100644
--- a/tests/language_2/function_type/function_type92_test.dart
+++ b/tests/language_2/function_type/function_type92_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int y, [core.List<core.int> x]);
@@ -189,8 +189,8 @@
     }
 
     Expect.isTrue(m1 is F1<T>);
-    Expect
-        .isTrue(m1 is core.List<core.int> Function(int x0, [List<Function> x]));
+    Expect.isTrue(
+        m1 is core.List<core.int> Function(int x0, [List<Function> x]));
     Expect.isTrue(confuse(m1) is F1<T>);
     // In checked mode, verifies the type.
     x1 = m1;
@@ -407,8 +407,8 @@
     }
 
     Expect.isTrue(m9 is F9<T>);
-    Expect
-        .isTrue(m9 is List<Function> Function(int x0, {Function x}) Function());
+    Expect.isTrue(
+        m9 is List<Function> Function(int x0, {Function x}) Function());
     Expect.isTrue(confuse(m9) is F9<T>);
     // In checked mode, verifies the type.
     x9 = m9;
diff --git a/tests/language_2/function_type/function_type93_test.dart b/tests/language_2/function_type/function_type93_test.dart
index 52f9134..88541fd 100644
--- a/tests/language_2/function_type/function_type93_test.dart
+++ b/tests/language_2/function_type/function_type93_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(core.List<core.int> x0);
@@ -193,8 +193,8 @@
     }
 
     Expect.isTrue(m1 is F1<T>);
-    Expect
-        .isTrue(m1 is core.List<core.int> Function(int y, [List<Function> x]));
+    Expect.isTrue(
+        m1 is core.List<core.int> Function(int y, [List<Function> x]));
     Expect.isTrue(confuse(m1) is F1<T>);
     // In checked mode, verifies the type.
     x1 = m1;
@@ -290,8 +290,8 @@
     }
 
     Expect.isTrue(m5 is F5<T>);
-    Expect
-        .isTrue(m5 is int Function(int y, {List<Function> x}) Function(int x));
+    Expect.isTrue(
+        m5 is int Function(int y, {List<Function> x}) Function(int x));
     Expect.isTrue(confuse(m5) is F5<T>);
     // In checked mode, verifies the type.
     x5 = m5;
@@ -587,8 +587,8 @@
     }
 
     Expect.isTrue(m14 is F14<T>);
-    Expect
-        .isTrue(m14 is List<T> Function(core.List<core.int> x) Function(int x));
+    Expect.isTrue(
+        m14 is List<T> Function(core.List<core.int> x) Function(int x));
     Expect.isTrue(confuse(m14) is F14<T>);
     // In checked mode, verifies the type.
     x14 = m14;
diff --git a/tests/language_2/function_type/function_type94_test.dart b/tests/language_2/function_type/function_type94_test.dart
index 3deba73..e7ebcdf 100644
--- a/tests/language_2/function_type/function_type94_test.dart
+++ b/tests/language_2/function_type/function_type94_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function([core.List<core.int> x1]);
diff --git a/tests/language_2/function_type/function_type95_test.dart b/tests/language_2/function_type/function_type95_test.dart
index d2d8fda..16b9e08 100644
--- a/tests/language_2/function_type/function_type95_test.dart
+++ b/tests/language_2/function_type/function_type95_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x1, [core.List<core.int> x2]);
@@ -872,8 +872,8 @@
     }
 
     Expect.isTrue(m21 is F21<T>);
-    Expect
-        .isTrue(m21 is Function<A>(int x) Function<B extends core.int>(int x));
+    Expect.isTrue(
+        m21 is Function<A>(int x) Function<B extends core.int>(int x));
     Expect.isTrue(confuse(m21) is F21<T>);
     // In checked mode, verifies the type.
     x21 = m21;
diff --git a/tests/language_2/function_type/function_type96_test.dart b/tests/language_2/function_type/function_type96_test.dart
index 4c668a1..65abf5d 100644
--- a/tests/language_2/function_type/function_type96_test.dart
+++ b/tests/language_2/function_type/function_type96_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x, [core.List<core.int> x2]);
@@ -432,8 +432,8 @@
     }
 
     Expect.isTrue(m9 is F9<T>);
-    Expect
-        .isTrue(m9 is List<Function> Function(int y, {Function x}) Function());
+    Expect.isTrue(
+        m9 is List<Function> Function(int y, {Function x}) Function());
     Expect.isTrue(confuse(m9) is F9<T>);
     // In checked mode, verifies the type.
     x9 = m9;
@@ -457,8 +457,8 @@
     }
 
     Expect.isTrue(m10 is F10<T>);
-    Expect
-        .isTrue(m10 is List<Function> Function(int x0, [List<T> x]) Function());
+    Expect.isTrue(
+        m10 is List<Function> Function(int x0, [List<T> x]) Function());
     Expect.isTrue(confuse(m10) is F10<T>);
     // In checked mode, verifies the type.
     x10 = m10;
diff --git a/tests/language_2/function_type/function_type97_test.dart b/tests/language_2/function_type/function_type97_test.dart
index eaa3458..78df65f 100644
--- a/tests/language_2/function_type/function_type97_test.dart
+++ b/tests/language_2/function_type/function_type97_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function({core.List<core.int> x});
@@ -192,8 +192,8 @@
     }
 
     Expect.isTrue(m1 is F1<T>);
-    Expect
-        .isTrue(m1 is core.List<core.int> Function(int x, [List<Function> x2]));
+    Expect.isTrue(
+        m1 is core.List<core.int> Function(int x, [List<Function> x2]));
     Expect.isTrue(confuse(m1) is F1<T>);
     // In checked mode, verifies the type.
     x1 = m1;
diff --git a/tests/language_2/function_type/function_type98_test.dart b/tests/language_2/function_type/function_type98_test.dart
index b89edcb..1ea40a6 100644
--- a/tests/language_2/function_type/function_type98_test.dart
+++ b/tests/language_2/function_type/function_type98_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int x0, {core.List<core.int> x});
@@ -660,8 +660,8 @@
     }
 
     Expect.isTrue(m15 is F15<T>);
-    Expect
-        .isTrue(m15 is Function(int y, [int x]) Function<B extends core.int>());
+    Expect.isTrue(
+        m15 is Function(int y, [int x]) Function<B extends core.int>());
     Expect.isTrue(confuse(m15) is F15<T>);
     // In checked mode, verifies the type.
     x15 = m15;
@@ -860,8 +860,8 @@
     }
 
     Expect.isTrue(m21 is F21<T>);
-    Expect
-        .isTrue(m21 is Function<A>(Function x) Function<B extends core.int>());
+    Expect.isTrue(
+        m21 is Function<A>(Function x) Function<B extends core.int>());
     Expect.isTrue(confuse(m21) is F21<T>);
     // In checked mode, verifies the type.
     x21 = m21;
diff --git a/tests/language_2/function_type/function_type99_test.dart b/tests/language_2/function_type/function_type99_test.dart
index 924fbfe..3404851 100644
--- a/tests/language_2/function_type/function_type99_test.dart
+++ b/tests/language_2/function_type/function_type99_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = Function Function(int y, {core.List<core.int> x});
@@ -219,8 +219,8 @@
     }
 
     Expect.isTrue(m1 is F1<T>);
-    Expect
-        .isTrue(m1 is core.List<core.int> Function(int x0, {List<Function> x}));
+    Expect.isTrue(
+        m1 is core.List<core.int> Function(int x0, {List<Function> x}));
     Expect.isTrue(confuse(m1) is F1<T>);
     // In checked mode, verifies the type.
     x1 = m1;
diff --git a/tests/language_2/function_type/function_type9_test.dart b/tests/language_2/function_type/function_type9_test.dart
index ae7be56..bfcd9fa 100644
--- a/tests/language_2/function_type/function_type9_test.dart
+++ b/tests/language_2/function_type/function_type9_test.dart
@@ -15,8 +15,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 
 typedef F0<T> = int Function(int x0, {int x});
diff --git a/tests/language_2/function_type/test_generator.dart b/tests/language_2/function_type/test_generator.dart
index 0389209..74b1884 100644
--- a/tests/language_2/function_type/test_generator.dart
+++ b/tests/language_2/function_type/test_generator.dart
@@ -571,8 +571,8 @@
 import 'dart:core' as core;
 import 'package:expect/expect.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(f) => f;
 """;
 
diff --git a/tests/language_2/function_type3_test.dart b/tests/language_2/function_type3_test.dart
index 6c10c9f..75322bc 100644
--- a/tests/language_2/function_type3_test.dart
+++ b/tests/language_2/function_type3_test.dart
@@ -5,10 +5,10 @@
 import "package:expect/expect.dart";
 
 class A<T> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   A();
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   foo() => new B<T>();
 }
 
diff --git a/tests/language_2/function_type_in_constant_test.dart b/tests/language_2/function_type_in_constant_test.dart
index dac6dc7..53aed9c 100644
--- a/tests/language_2/function_type_in_constant_test.dart
+++ b/tests/language_2/function_type_in_constant_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// Test that consts can be created with inlined function types as type 
+/// Test that consts can be created with inlined function types as type
 /// arguments.
 
 import 'package:expect/expect.dart';
@@ -11,14 +11,19 @@
   const A();
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 test(a, b) {
   Expect.notEquals(a, b);
 }
 
-
 main() {
-  test(const A<int Function()>(), const A<String Function()>()); /// 01: ok
-  test(const A<int>(), const A<String Function()>()); /// 02: ok
-  test(const A<int Function()>(), const A<String>()); /// 03: ok
+  test(const A<int Function()>(), const A<String Function()>());
+
+  /// 01: ok
+  test(const A<int>(), const A<String Function()>());
+
+  /// 02: ok
+  test(const A<int Function()>(), const A<String>());
+
+  /// 03: ok
 }
diff --git a/tests/language_2/generic_methods_type_expression_test.dart b/tests/language_2/generic_methods_type_expression_test.dart
index c83b20a..80d4376 100644
--- a/tests/language_2/generic_methods_type_expression_test.dart
+++ b/tests/language_2/generic_methods_type_expression_test.dart
@@ -29,7 +29,7 @@
 bool f9<T>(Object o) => o is Map<T, String>;
 
 class IsMap<A> {
-  @NoInline()
+  @pragma('dart2js:noInline')
   bool check<B>(o) => o is Map<A, B>;
 }
 
diff --git a/tests/language_2/implicit_super_constructor_call_test.dart b/tests/language_2/implicit_super_constructor_call_test.dart
index c1d25d3..fca1a62 100644
--- a/tests/language_2/implicit_super_constructor_call_test.dart
+++ b/tests/language_2/implicit_super_constructor_call_test.dart
@@ -9,7 +9,7 @@
 class A {
   final x;
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   A({this.x: "foo"}) {
     Expect.equals("foo", x.toString());
   }
diff --git a/tests/language_2/inv_cse_licm.dart b/tests/language_2/inv_cse_licm.dart
new file mode 100644
index 0000000..6bb89445
--- /dev/null
+++ b/tests/language_2/inv_cse_licm.dart
@@ -0,0 +1,501 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--deterministic --enable-inlining-annotations --optimization_counter_threshold=10
+
+import 'dart:typed_data';
+import "package:expect/expect.dart";
+
+const String NeverInline = 'NeverInline';
+
+// Tests a few situations in which invariant instructions
+// can be subject to CSE and LICM.
+
+@NeverInline
+int cse1(Int32List a, int n) {
+  int x = a[0];
+  for (int i = 0; i < n; i++) {
+    // The a[0] null check, bounds check, and the actual load can be
+    // CSEed with the instructions above even if loop is not taken.
+    x += a[0] * a[i];
+  }
+  return x;
+}
+
+@NeverInline
+int cse2(Int32List a, int n) {
+  int x = a[0];
+  for (int i = 0; i < n; i++) {
+    // The a[0] null check, bounds check, but not the actual load can be
+    // CSEed with the instructions above, since the value of the load
+    // changes in the loop.
+    a[i] = a[0] + 1;
+  }
+  return x;
+}
+
+@NeverInline
+int licm1(Int32List a, int n) {
+  int x = 0;
+  for (int i = 0; i < n; i++) {
+    // The a[0] null check, bounds check, and the actual load cannot
+    // be LICMed, since the loop may be non-taken.
+    x += a[0] * a[i];
+  }
+  return x;
+}
+
+@NeverInline
+int licm2(Int32List a) {
+  int x = 0;
+  for (int i = 0; i < 16; i++) {
+    // The a[0] null check, bounds check, and the actual load can be
+    // LICMed, since the loop is always-taken.
+    x += a[0] * a[i];
+  }
+  return x;
+}
+
+@NeverInline
+int licm3(Int32List a, bool cond) {
+  int x = 0;
+  for (int i = 0; i < 16; i++) {
+    // The a[0] null check, bounds check, and the actual load cannot
+    // be LICMed, since the condition may be non-taken (and we don't
+    // hoist invariant conditions).
+    if (cond) x += a[0] * a[i];
+  }
+  return x;
+}
+
+@NeverInline
+int licm3_brk(Int32List a, bool cond) {
+  int x = 0;
+  for (int i = 0; i < 16; i++) {
+    // The a[0] null check, bounds check, and the actual load cannot
+    // be LICMed, since the condition may be taken (and we don't
+    // hoist invariant conditions).
+    if (cond) break;
+    x += a[0] * a[i];
+  }
+  return x;
+}
+
+int global;
+
+@NeverInline
+int licm4(Int32List a) {
+  int x = 0;
+  for (int i = 0; i < 16; i++) {
+    // The a[0] null check, bounds check, and the actual load cannot
+    // be LICMed, since something visible happens before an exception
+    // may be thrown.
+    global++;
+    x += a[0] * a[i];
+  }
+  return x;
+}
+
+@NeverInline
+int licm5(Int32List a) {
+  int x = 0;
+  // Anything in the loop header can be LICMed.
+  for (int i = 0; i < a[1]; i++) {
+    x++;
+  }
+  return x;
+}
+
+@NeverInline
+int licm6(Int32List a, int n) {
+  int x = 0;
+  int i = 0;
+  do {
+    // The a[0] null check, bounds check, and the actual load can be
+    // LICMed, since this "header" is always-taken.
+    x += a[0] * a[i++];
+  } while (i < n);
+  return x;
+}
+
+@NeverInline
+int licm7(Int32List a, int n) {
+  int x = 0;
+  int i = 0;
+  while (true) {
+    // The a[0] null check, bounds check, and the actual load can be
+    // LICMed, since this "header" is always-taken.
+    x += a[0] * a[i++];
+    if (i >= n) break;
+  }
+  return x;
+}
+
+@NeverInline
+int licm8(Int32List a, int n) {
+  int x = 0;
+  int i = 0;
+  while (true) {
+    if (i >= n) break;
+    // No LICM at this point, loop body may not be taken.
+    x += a[0] * a[i++];
+  }
+  return x;
+}
+
+@NeverInline
+int licm9(Int32List a) {
+  int x = 0;
+  int i = 0;
+  while (true) {
+    if (i >= 16) break;
+    // The a[0] null check, bounds check, and the actual load can be
+    // LICMed, since the loop is always-taken.
+    x += a[0] * a[i++];
+  }
+  return x;
+}
+
+@NeverInline
+int licm10(Int32List a, bool cond) {
+  int x = 0;
+  int i = 0;
+  while (true) {
+    if (i >= 16) break;
+    // The a[0] null check, bounds check, and the actual load cannot
+    // be LICMed, since the condition may be non-taken (and we don't
+    // hoist invariant conditions).
+    if (cond) x += a[0] * a[i];
+    i++;
+  }
+  return x;
+}
+
+@NeverInline
+int licm10_brk(Int32List a, bool cond) {
+  int x = 0;
+  int i = 0;
+  while (true) {
+    if (i >= 16) break;
+    // The a[0] null check, bounds check, and the actual load cannot
+    // be LICMed, since the condition may be taken (and we don't
+    // hoist invariant conditions).
+    if (cond) break;
+    x += a[0] * a[i++];
+  }
+  return x;
+}
+
+@NeverInline
+int licm11(Int32List a) {
+  int x = 0;
+  while (true) {
+    // Anything in the loop header can be LICMed.
+    if (x > a[1]) break;
+    x++;
+  }
+  return x;
+}
+
+@NeverInline
+int foo() {
+  return global--;
+}
+
+@NeverInline
+int licm12(Int32List a) {
+  int x = 0;
+  int i = 0;
+  // Side-effect loop bound.
+  for (int i = 0; i < foo(); i++) {
+    x += a[0] * a[i++];
+  }
+  return x;
+}
+
+doTests() {
+  var x = new Int32List(0);
+  var a = new Int32List(16);
+  for (int i = 0; i < 16; i++) {
+    a[i] = i + 1;
+  }
+
+  Expect.throws(() {
+    cse1(null, 0);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.throws(() {
+    cse1(null, 1);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.throws(() {
+    cse1(x, 0);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.throws(() {
+    cse1(x, 1);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(1, cse1(a, 0));
+  Expect.equals(137, cse1(a, 16));
+
+  Expect.throws(() {
+    cse2(null, 0);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.throws(() {
+    cse2(null, 1);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.throws(() {
+    cse2(x, 0);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.throws(() {
+    cse2(x, 1);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(1, cse2(a, 0));
+  Expect.equals(1, cse2(a, 16));
+  Expect.equals(2, a[0]);
+  for (int i = 1; i < 16; i++) {
+    Expect.equals(3, a[i]);
+  }
+
+  Expect.equals(0, licm1(null, 0));
+  Expect.throws(() {
+    licm1(null, 1);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.equals(0, licm1(x, 0));
+  Expect.throws(() {
+    licm1(x, 1);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(0, licm1(a, 0));
+  Expect.equals(94, licm1(a, 16));
+
+  Expect.throws(() {
+    licm2(null);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.throws(() {
+    licm2(x);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(94, licm2(a));
+
+  Expect.equals(0, licm3(null, false));
+  Expect.throws(() {
+    licm3(null, true);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.equals(0, licm3(x, false));
+  Expect.throws(() {
+    licm3(x, true);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(0, licm3(a, false));
+  Expect.equals(94, licm3(a, true));
+
+  Expect.equals(0, licm3_brk(null, true));
+  Expect.throws(() {
+    licm3_brk(null, false);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.equals(0, licm3_brk(x, true));
+  Expect.throws(() {
+    licm3_brk(x, false);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(0, licm3_brk(a, true));
+  Expect.equals(94, licm3_brk(a, false));
+
+  global = 0;
+  Expect.throws(() {
+    licm4(null);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.equals(1, global);
+  Expect.throws(() {
+    licm4(x);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(2, global);
+  Expect.equals(94, licm4(a));
+  Expect.equals(18, global);
+
+  Expect.throws(() {
+    licm5(null);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.throws(() {
+    licm5(x);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(3, licm5(a));
+
+  Expect.throws(() {
+    licm6(null, 0);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.throws(() {
+    licm6(null, 1);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.throws(() {
+    licm6(x, 0);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.throws(() {
+    licm6(x, 1);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(4, licm6(a, 0));
+  Expect.equals(94, licm6(a, 16));
+
+  Expect.throws(() {
+    licm7(null, 0);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.throws(() {
+    licm7(null, 1);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.throws(() {
+    licm7(x, 0);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.throws(() {
+    licm7(x, 1);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(4, licm7(a, 0));
+  Expect.equals(94, licm7(a, 16));
+
+  Expect.equals(0, licm8(null, 0));
+  Expect.throws(() {
+    licm8(null, 1);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.equals(0, licm8(x, 0));
+  Expect.throws(() {
+    licm8(x, 1);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(0, licm8(a, 0));
+  Expect.equals(94, licm8(a, 16));
+
+  Expect.throws(() {
+    licm9(null);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.throws(() {
+    licm9(x);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(94, licm9(a));
+
+  Expect.equals(0, licm10(null, false));
+  Expect.throws(() {
+    licm10(null, true);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.equals(0, licm10(x, false));
+  Expect.throws(() {
+    licm10(x, true);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(0, licm10(a, false));
+  Expect.equals(94, licm10(a, true));
+
+  Expect.equals(0, licm10_brk(null, true));
+  Expect.throws(() {
+    licm10_brk(null, false);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.equals(0, licm10_brk(x, true));
+  Expect.throws(() {
+    licm10_brk(x, false);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(0, licm10_brk(a, true));
+  Expect.equals(94, licm10_brk(a, false));
+
+  Expect.throws(() {
+    licm11(null);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.throws(() {
+    licm11(x);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(4, licm11(a));
+
+  global = 0;
+  Expect.equals(0, licm12(null));
+  Expect.equals(-1, global);
+  Expect.equals(0, licm12(x));
+  Expect.equals(-2, global);
+  global = 16;
+  Expect.throws(() {
+    licm12(null);
+  }, (e) {
+    return e is NoSuchMethodError;
+  });
+  Expect.equals(15, global);
+  Expect.throws(() {
+    licm12(x);
+  }, (e) {
+    return e is RangeError;
+  });
+  Expect.equals(14, global);
+  Expect.equals(28, licm12(a));
+  Expect.equals(8, global);
+}
+
+main() {
+  // Repeat to enter JIT (when applicable).
+  for (int i = 0; i < 20; i++) {
+    doTests();
+  }
+}
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index 4f4d666..88da305 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -76,8 +76,6 @@
 # errors aren't detected by fasta, but reported by back ends as compile-time
 # errors.
 [ $compiler != dart2analyzer && $compiler != dart2js && $runtime != dart_precompiled && $runtime != vm && $fasta ]
-function_type_parameter2_negative_test: Fail
-function_type_parameter_negative_test: Fail
 implicit_creation/implicit_const_not_default_values_test/e12: MissingCompileTimeError
 implicit_creation/implicit_const_not_default_values_test/e15: MissingCompileTimeError
 implicit_creation/implicit_const_not_default_values_test/e18: MissingCompileTimeError
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 310f9a1..b678948 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -177,7 +177,6 @@
 config_import_test: RuntimeError
 const_cast1_test/02: MissingCompileTimeError
 const_constructor3_test/04: MissingCompileTimeError
-const_constructor_nonconst_field_test/01: MissingCompileTimeError
 const_constructor_nonconst_param_test/01: MissingCompileTimeError
 const_dynamic_type_literal_test/02: MissingCompileTimeError
 const_map2_test/00: MissingCompileTimeError
@@ -193,8 +192,6 @@
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
 function_propagation_test: RuntimeError
-function_type_parameter2_negative_test: Fail
-function_type_parameter_negative_test: Fail
 generic_function_bounds_test: RuntimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Warning: Superclass has no method named 'foo'.
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 5b34f04..bff609c 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -37,9 +37,11 @@
 const_nested_test: RuntimeError
 const_string_test: RuntimeError
 constructor12_test: RuntimeError
+control_flow_collections/for_await_test: CompileTimeError
 control_flow_collections/for_inference_test: DartkCrash
 control_flow_collections/for_test: DartkCrash
 control_flow_collections/for_variable_test: DartkCrash
+control_flow_collections/if_await_test: CompileTimeError
 control_flow_collections/if_const_test: DartkCrash
 control_flow_collections/if_inference_test: CompileTimeError
 control_flow_collections/if_test: DartkCrash
@@ -133,6 +135,7 @@
 regress_29025_test: CompileTimeError
 regress_29405_test: CompileTimeError
 regress_30339_test: CompileTimeError
+spread_collections/await_test: CompileTimeError
 spread_collections/const_test: CompileTimeError
 spread_collections/inference_test: CompileTimeError
 spread_collections/map_set_ambiguity_test: CompileTimeError
@@ -164,9 +167,11 @@
 private_method_tearoff_test: RuntimeError
 
 [ $compiler == dartkp ]
+control_flow_collections/for_await_test: CompileTimeError
 control_flow_collections/for_inference_test: CompileTimeError
 control_flow_collections/for_test: CompileTimeError
 control_flow_collections/for_variable_test: CompileTimeError
+control_flow_collections/if_await_test: CompileTimeError
 control_flow_collections/if_const_test: CompileTimeError
 control_flow_collections/if_inference_test: CompileTimeError
 control_flow_collections/if_test: CompileTimeError
@@ -174,6 +179,20 @@
 control_flow_collections/syntax_test: CompileTimeError
 covariant_subtyping_test: RuntimeError
 generic_no_such_method_dispatcher_test: RuntimeError # Issue 31424
+spread_collections/await_test: CompileTimeError
+spread_collections/const_error_test/02: MissingCompileTimeError
+spread_collections/const_error_test/03: MissingCompileTimeError
+spread_collections/const_error_test/05: MissingCompileTimeError
+spread_collections/const_error_test/06: MissingCompileTimeError
+spread_collections/const_error_test/07: MissingCompileTimeError
+spread_collections/const_error_test/08: MissingCompileTimeError
+spread_collections/const_error_test/10: MissingCompileTimeError
+spread_collections/const_error_test/11: MissingCompileTimeError
+spread_collections/const_error_test/12: MissingCompileTimeError
+spread_collections/const_error_test/13: MissingCompileTimeError
+spread_collections/const_error_test/14: MissingCompileTimeError
+spread_collections/const_error_test/15: MissingCompileTimeError
+spread_collections/const_error_test/16: MissingCompileTimeError
 spread_collections/const_test: CompileTimeError
 spread_collections/inference_test: CompileTimeError
 spread_collections/map_set_ambiguity_test: CompileTimeError
@@ -198,12 +217,14 @@
 const_constructor_nonconst_param_test/01: MissingCompileTimeError
 constructor5_test: CompileTimeError # Verification error
 constructor6_test: CompileTimeError # Verification error
-control_flow_collections/for_inference_test: Crash
-control_flow_collections/for_test: Crash
-control_flow_collections/for_variable_test: Crash
-control_flow_collections/if_const_test: Crash
+control_flow_collections/for_await_test: CompileTimeError
+control_flow_collections/for_inference_test: CompileTimeError
+control_flow_collections/for_test: CompileTimeError
+control_flow_collections/for_variable_test: CompileTimeError
+control_flow_collections/if_await_test: CompileTimeError
+control_flow_collections/if_const_test: CompileTimeError
 control_flow_collections/if_inference_test: CompileTimeError
-control_flow_collections/if_test: Crash
+control_flow_collections/if_test: CompileTimeError
 control_flow_collections/map_set_ambiguity_test: CompileTimeError
 control_flow_collections/syntax_error_test/09: Crash
 control_flow_collections/syntax_error_test/10: Crash
@@ -229,11 +250,36 @@
 implicit_creation/implicit_const_not_default_values_test/e7: MissingCompileTimeError
 implicit_creation/implicit_const_not_default_values_test/e8: MissingCompileTimeError
 mixin_method_override_test/G4: Crash # Assertion error: mixin_full_resolution.dart': 'src.typeParameters.length == dst.typeParameters.length': is not true.
+spread_collections/await_test: Crash
+spread_collections/const_error_test/02: MissingCompileTimeError
+spread_collections/const_error_test/03: MissingCompileTimeError
+spread_collections/const_error_test/05: MissingCompileTimeError
+spread_collections/const_error_test/06: MissingCompileTimeError
+spread_collections/const_error_test/07: MissingCompileTimeError
+spread_collections/const_error_test/08: MissingCompileTimeError
+spread_collections/const_error_test/10: MissingCompileTimeError
+spread_collections/const_error_test/11: MissingCompileTimeError
+spread_collections/const_error_test/12: MissingCompileTimeError
+spread_collections/const_error_test/13: MissingCompileTimeError
+spread_collections/const_error_test/14: MissingCompileTimeError
+spread_collections/const_error_test/15: MissingCompileTimeError
+spread_collections/const_error_test/16: MissingCompileTimeError
 spread_collections/const_test: CompileTimeError
-spread_collections/inference_test: CompileTimeError
+spread_collections/map_set_ambiguity_error_test/00: MissingCompileTimeError
+spread_collections/map_set_ambiguity_error_test/01: MissingCompileTimeError
+spread_collections/map_set_ambiguity_error_test/02: MissingCompileTimeError
+spread_collections/map_set_ambiguity_error_test/03: MissingCompileTimeError
+spread_collections/map_set_ambiguity_error_test/04: MissingCompileTimeError
+spread_collections/map_set_ambiguity_error_test/05: MissingCompileTimeError
+spread_collections/map_set_ambiguity_error_test/06: MissingCompileTimeError
+spread_collections/map_set_ambiguity_error_test/07: MissingCompileTimeError
 spread_collections/map_set_ambiguity_test: CompileTimeError
 spread_collections/spread_test: CompileTimeError
 spread_collections/syntax_test: CompileTimeError
+spread_collections/type_error_test/01: MissingCompileTimeError
+spread_collections/type_error_test/04: MissingCompileTimeError
+spread_collections/type_error_test/07: MissingCompileTimeError
+spread_collections/type_error_test/08: MissingCompileTimeError
 vm/regress_33469_test/01: MissingCompileTimeError
 vm/regress_33469_test/02: MissingCompileTimeError
 vm/regress_33469_test/03: MissingCompileTimeError
@@ -247,6 +293,9 @@
 async_return_types_test/nestedFuture: MissingCompileTimeError # Issue 33068
 const_cast2_test/01: CompileTimeError # Issue 32517
 const_cast2_test/none: CompileTimeError # Issue 32517
+control_flow_collections/for_await_test: CompileTimeError
+control_flow_collections/if_await_test: CompileTimeError
+control_flow_collections/if_promotion_test/none: CompileTimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
@@ -291,9 +340,11 @@
 vm/regress_27201_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 
 [ $arch != simarm && $arch != simarm64 && $arch != simdbc64 && $compiler == dartk ]
+control_flow_collections/for_await_test: CompileTimeError
 control_flow_collections/for_inference_test: DartkCrash
 control_flow_collections/for_test: DartkCrash
 control_flow_collections/for_variable_test: DartkCrash
+control_flow_collections/if_await_test: CompileTimeError
 control_flow_collections/if_const_test: DartkCrash
 control_flow_collections/if_inference_test: CompileTimeError
 control_flow_collections/if_test: DartkCrash
@@ -301,6 +352,7 @@
 control_flow_collections/syntax_error_test/09: DartkCrash
 control_flow_collections/syntax_error_test/10: DartkCrash
 control_flow_collections/syntax_test: CompileTimeError
+spread_collections/await_test: CompileTimeError
 spread_collections/const_test: CompileTimeError
 spread_collections/inference_test: CompileTimeError
 spread_collections/map_set_ambiguity_test: CompileTimeError
@@ -308,14 +360,17 @@
 spread_collections/syntax_test: CompileTimeError
 
 [ $arch == simdbc64 && $compiler == dartk ]
+control_flow_collections/for_await_test: CompileTimeError
 control_flow_collections/for_inference_test: CompileTimeError
 control_flow_collections/for_test: CompileTimeError
 control_flow_collections/for_variable_test: CompileTimeError
+control_flow_collections/if_await_test: CompileTimeError
 control_flow_collections/if_const_test: CompileTimeError
 control_flow_collections/if_inference_test: CompileTimeError
 control_flow_collections/if_test: CompileTimeError
 control_flow_collections/map_set_ambiguity_test: CompileTimeError
 control_flow_collections/syntax_test: CompileTimeError
+spread_collections/await_test: CompileTimeError
 spread_collections/const_test: CompileTimeError
 spread_collections/inference_test: CompileTimeError
 spread_collections/map_set_ambiguity_test: CompileTimeError
@@ -356,7 +411,6 @@
 compile_time_constant_c_test/02: MissingCompileTimeError
 compile_time_constant_o_test/01: MissingCompileTimeError # Issue 32983
 compile_time_constant_o_test/02: MissingCompileTimeError # Issue 32983
-const_constructor_nonconst_field_test/01: MissingCompileTimeError
 const_dynamic_type_literal_test/02: MissingCompileTimeError # Issue 32983
 const_syntax_test/05: MissingCompileTimeError
 identical_const_test/01: MissingCompileTimeError # Issue 32983
@@ -416,9 +470,11 @@
 assertion_initializer_const_error2_test/cc10: MissingCompileTimeError # Not reporting failed assert() at compile time.
 
 [ $compiler == dartk && ($arch == simarm || $arch == simarm64) ]
+control_flow_collections/for_await_test: CompileTimeError
 control_flow_collections/for_inference_test: CompileTimeError
 control_flow_collections/for_test: CompileTimeError
 control_flow_collections/for_variable_test: CompileTimeError
+control_flow_collections/if_await_test: CompileTimeError
 control_flow_collections/if_const_test: CompileTimeError
 control_flow_collections/if_inference_test: CompileTimeError
 control_flow_collections/if_test: CompileTimeError
@@ -426,6 +482,7 @@
 control_flow_collections/syntax_error_test/09: Pass
 control_flow_collections/syntax_error_test/10: Pass
 control_flow_collections/syntax_test: CompileTimeError
+spread_collections/await_test: CompileTimeError
 spread_collections/const_test: CompileTimeError
 spread_collections/inference_test: CompileTimeError
 spread_collections/map_set_ambiguity_test: CompileTimeError
@@ -438,9 +495,11 @@
 compile_time_constant_o_test/01: Pass
 compile_time_constant_o_test/02: Pass
 const_dynamic_type_literal_test/02: Pass
+control_flow_collections/for_await_test: CompileTimeError
 control_flow_collections/for_inference_test: CompileTimeError
 control_flow_collections/for_test: CompileTimeError
 control_flow_collections/for_variable_test: CompileTimeError
+control_flow_collections/if_await_test: CompileTimeError
 control_flow_collections/if_const_test: CompileTimeError
 control_flow_collections/if_inference_test: CompileTimeError
 control_flow_collections/if_test: CompileTimeError
@@ -448,11 +507,18 @@
 control_flow_collections/syntax_test: CompileTimeError
 map_literal3_test/01: Pass
 map_literal3_test/02: Pass
+spread_collections/await_test: CompileTimeError
 spread_collections/const_test: CompileTimeError
 spread_collections/inference_test: CompileTimeError
 spread_collections/map_set_ambiguity_test: CompileTimeError
 spread_collections/spread_test: CompileTimeError
 spread_collections/syntax_test: CompileTimeError
+spread_collections/type_error_test/00: DartkCrash
+spread_collections/type_error_test/02: DartkCrash
+spread_collections/type_error_test/03: DartkCrash
+spread_collections/type_error_test/05: DartkCrash
+spread_collections/type_error_test/06: DartkCrash
+spread_collections/type_error_test/09: DartkCrash
 vm/bool_check_stack_traces_test/02: Pass
 vm/causal_async_exception_stack2_test: RuntimeError # Please triage
 vm/causal_async_exception_stack_test: RuntimeError # Please triage
diff --git a/tests/language_2/larger_implicit_getter_test.dart b/tests/language_2/larger_implicit_getter_test.dart
index b28c1e0..cfadc00 100644
--- a/tests/language_2/larger_implicit_getter_test.dart
+++ b/tests/language_2/larger_implicit_getter_test.dart
@@ -4091,8 +4091,8 @@
   [2364.4759911280776, 3842.7700224365044]
 ];
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 confuse(x) => x;
 
 main() {
diff --git a/tests/language_2/mixin_proto_test.dart b/tests/language_2/mixin_proto_test.dart
index b508718..b8b19f1 100644
--- a/tests/language_2/mixin_proto_test.dart
+++ b/tests/language_2/mixin_proto_test.dart
@@ -26,8 +26,8 @@
   bar() => 499;
 }
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 main() {
diff --git a/tests/language_2/operations_on_non_num_operand_test.dart b/tests/language_2/operations_on_non_num_operand_test.dart
index 7a5060f..8a98bb3 100644
--- a/tests/language_2/operations_on_non_num_operand_test.dart
+++ b/tests/language_2/operations_on_non_num_operand_test.dart
@@ -10,8 +10,8 @@
 
 import "package:expect/expect.dart";
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 confuse(x) => x;
 
 class Thing1 {
@@ -36,39 +36,39 @@
 }
 
 class Thing2 {
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator &(b) => this;
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator |(b) => this;
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator ^(b) => this;
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator <<(b) => this;
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator >>(b) => this;
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator +(b) => this;
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator -(b) => this;
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator *(b) => this;
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator /(b) => this;
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator ~/(b) => this;
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator %(b) => this;
-  @NoInline()
+  @pragma('dart2js:noInline')
   remainder(b) => this;
 
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator <(b) => this;
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator <=(b) => this;
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator >(b) => this;
-  @NoInline()
+  @pragma('dart2js:noInline')
   operator >=(b) => this;
 }
 
diff --git a/tests/language_2/regress_18713_test.dart b/tests/language_2/regress_18713_test.dart
index ebf484a..01f51d8 100644
--- a/tests/language_2/regress_18713_test.dart
+++ b/tests/language_2/regress_18713_test.dart
@@ -16,8 +16,8 @@
 
 class TS<A, B> = T<A> with S<B>;
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 dyn(x) => x;
 
 main() {
diff --git a/tests/language_2/spread_collections/await_test.dart b/tests/language_2/spread_collections/await_test.dart
new file mode 100644
index 0000000..886a94a
--- /dev/null
+++ b/tests/language_2/spread_collections/await_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=--enable-experiment=spread-collections
+
+import "package:async_helper/async_helper.dart";
+import 'package:expect/expect.dart';
+
+final list = [1, 2, 3, 4, 5];
+final map = {1: 1, 2: 2, 3: 3, 4: 4, 5: 5};
+final set = {1, 2, 3, 4, 5};
+
+void main() {
+  asyncTest(() async {
+    await testList();
+    await testMap();
+    await testSet();
+  });
+}
+
+Future<void> testList() async {
+  var future12 = Future.value([1, 2]);
+  var future45 = Future.value([4, 5]);
+  var futureNull = Future.value(null);
+
+  // Await in spread.
+  Expect.listEquals(list, [...await future12, 3, ...await future45]);
+
+  // Await in null-aware spread.
+  Expect.listEquals(list, [...?await future12, 3, ...?await futureNull, 4, 5]);
+}
+
+Future<void> testMap() async {
+  var future12 = Future.value({1: 1, 2: 2});
+  var future45 = Future.value({4: 4, 5: 5});
+  var futureNull = Future.value(null);
+
+  // Await in spread.
+  Expect.mapEquals(map, {...await future12, 3: 3, ...await future45});
+
+  // Await in null-aware spread.
+  Expect.mapEquals(map,
+      {...?await future12, 3: 3, ...?await futureNull, 4: 4, 5: 5});
+}
+
+Future<void> testSet() async {
+  var future12 = Future.value([1, 2]);
+  var future45 = Future.value([4, 5]);
+  var futureNull = Future.value(null);
+
+  // Await in spread.
+  Expect.setEquals(set, {...await future12, 3, ...await future45});
+
+  // Await in null-aware spread.
+  Expect.setEquals(set, {...?await future12, 3, ...?await futureNull, 4, 5});
+}
diff --git a/tests/language_2/spread_collections/const_error_test.dart b/tests/language_2/spread_collections/const_error_test.dart
index 7ea27a5..c15f791 100644
--- a/tests/language_2/spread_collections/const_error_test.dart
+++ b/tests/language_2/spread_collections/const_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=set-literals,spread-collections
+// SharedOptions=--enable-experiment=spread-collections
 
 import 'dart:collection';
 
diff --git a/tests/language_2/spread_collections/const_test.dart b/tests/language_2/spread_collections/const_test.dart
index 7ae1df2..994e904 100644
--- a/tests/language_2/spread_collections/const_test.dart
+++ b/tests/language_2/spread_collections/const_test.dart
@@ -50,7 +50,8 @@
 
   // Does not deep flatten.
   Expect.identical(
-      const <int>[1, 2, <int>[3], 4], const <int>[1, ...<int>[2, <int>[3], 4]]);
+      const <Object>[1, 2, <int>[3], 4],
+      const <Object>[1, ...<Object>[2, <int>[3], 4]]);
 
   // Establishes const context.
   Expect.identical(const <Symbol>[Symbol("sym")],
diff --git a/tests/language_2/spread_collections/spread_test.dart b/tests/language_2/spread_collections/spread_test.dart
index aab98da..8b23a48 100644
--- a/tests/language_2/spread_collections/spread_test.dart
+++ b/tests/language_2/spread_collections/spread_test.dart
@@ -51,7 +51,8 @@
   // Does not deep flatten.
   var innerList = <int>[3];
   Expect.listEquals(
-      <int>[1, 2, innerList, 4], <int>[1, ...<int>[2, innerList, 4]]);
+      <Object>[1, 2, innerList, 4],
+      <Object>[1, ...<Object>[2, innerList, 4]]);
 
   // Downcast element.
   Expect.listEquals(list, <int>[...<num>[1, 2, 3, 4]]);
diff --git a/tests/language_2/super_mixin_test.dart b/tests/language_2/super_mixin_test.dart
index 154d3e5..e76a282 100644
--- a/tests/language_2/super_mixin_test.dart
+++ b/tests/language_2/super_mixin_test.dart
@@ -8,7 +8,7 @@
 import 'package:expect/expect.dart';
 
 class Mixin {
-  @NoInline()
+  @pragma('dart2js:noInline')
   get getter => 42;
 }
 
diff --git a/tests/language_2/vm/regress_flutter_28260_test.dart b/tests/language_2/vm/regress_flutter_28260_test.dart
new file mode 100644
index 0000000..830cae5
--- /dev/null
+++ b/tests/language_2/vm/regress_flutter_28260_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--deterministic --optimization_counter_threshold=10
+
+// Bug cid ranges (https://github.com/flutter/flutter/issues/28260).
+
+import 'dart:typed_data';
+
+import "package:expect/expect.dart";
+
+foo() {
+  ByteBuffer a = null;
+  var dataMap = Map<String, dynamic>();
+  dataMap['data'] = a;
+  return (dataMap['data'] is ByteBuffer);
+}
+
+void main() {
+  for (int i = 0; i < 20; i++) {
+    Expect.equals(false, foo());
+  }
+}
diff --git a/tests/language_2/vm/regression_36076_test.dart b/tests/language_2/vm/regression_36076_test.dart
new file mode 100755
index 0000000..962a5cb
--- /dev/null
+++ b/tests/language_2/vm/regression_36076_test.dart
@@ -0,0 +1,41 @@
+// Bug found by DartFuzz (stripped down version):
+// https://github.com/dart-lang/sdk/issues/36076
+
+// Code does not do anything, but broke kernel binary flow graph builder.
+
+foo() {
+  try {
+    for (var x in [1, 2]) {
+      return;
+    }
+  } finally {
+    for (var x in [3]) {
+      break;
+    }
+  }
+}
+
+bar() {
+  try {} catch (e) {
+    try {} catch (e) {
+      for (var x in [1, 2]) {
+        if (x == 1) break;
+        return;
+      }
+      try {
+        try {} catch (e) {
+          return;
+        }
+      } catch (e) {}
+    } finally {
+      try {} catch (e) {
+        return;
+      }
+    }
+  } finally {}
+}
+
+main() {
+  foo();
+  bar();
+}
diff --git a/tests/language_2/void/void_check_test.dart b/tests/language_2/void/void_check_test.dart
index 2e42a25..8c10f70 100644
--- a/tests/language_2/void/void_check_test.dart
+++ b/tests/language_2/void/void_check_test.dart
@@ -23,7 +23,7 @@
 // Makes the typing cleaner: the return type here is `dynamic` and we are
 // guaranteed that there won't be any warnings.
 // Dart2js can still infer the type by itself.
-@NoInline()
+@pragma('dart2js:noInline')
 callFoo(A a) => a.foo();
 
 main() {
diff --git a/tests/lib_2/html/cross_domain_iframe_script.html b/tests/lib_2/html/cross_domain_iframe_script.html
index 9b8ce84..41e2ea4 100644
--- a/tests/lib_2/html/cross_domain_iframe_script.html
+++ b/tests/lib_2/html/cross_domain_iframe_script.html
@@ -8,7 +8,7 @@
 
   <body>
     <script type="application/javascript"
-            src="/root_dart/tests/html/cross_domain_iframe_script.js">
+            src="/root_dart/tests/lib_2/html/cross_domain_iframe_script.js">
     </script>
   </body>
 </html>
diff --git a/tests/lib_2/html/custom/mirrors_2_test.dart b/tests/lib_2/html/custom/mirrors_2_test.dart
index 6fa8ab3..f92022e 100644
--- a/tests/lib_2/html/custom/mirrors_2_test.dart
+++ b/tests/lib_2/html/custom/mirrors_2_test.dart
@@ -45,7 +45,7 @@
 
   A.created() : super.created() {
     // This function must not be inlined otherwise there is no reference to the
-    // interceptor constant. The `@NoInline()` annotation does not seem reliable
+    // interceptor constant. The `@pragma('dart2js:noInline')` annotation does not seem reliable
     // on generative constructor bodies.
     try {
       uninlinedMethod();
@@ -57,7 +57,7 @@
       uninlinedMethod();
     }
   }
-  @NoInline()
+  @pragma('dart2js:noInline')
   uninlinedMethod() {}
 
   token() => 'AA';
diff --git a/tests/lib_2/html/debugger_test.dart b/tests/lib_2/html/debugger_test.dart
index 8207b59..cbe043a 100644
--- a/tests/lib_2/html/debugger_test.dart
+++ b/tests/lib_2/html/debugger_test.dart
@@ -157,9 +157,10 @@
   // The verify golden match test cases does the final comparison of golden
   // to expected output.
   addGolden(String name, value) {
+    var text = format(value);
     actual.write('Test: $name\n'
         'Value:\n'
-        '${format(value)}\n'
+        '$text\n'
         '-----------------------------------\n');
   }
 
@@ -279,7 +280,7 @@
 
   group('Module formatting', () {
     var moduleNames = _debugger.getModuleNames();
-    var testModuleName = "tests_lib_2_html_debugger_test/debugger_test";
+    var testModuleName = "debugger_test";
     expect(moduleNames.contains(testModuleName), isTrue);
 
     addAllNestedFormatterGoldens(
@@ -301,7 +302,8 @@
 
   group('Class formatting', () {
     addNestedFormatterGoldens('TestClass', new TestClass(17));
-    addNestedFormatterGoldens('MouseEvent', new MouseEvent("click"));
+    // TODO(jmesserly): this includes a timeStamp, so it varies each run.
+    //addNestedFormatterGoldens('MouseEvent', new MouseEvent("click"));
     // This is a good class to test as it has statics and a deep inheritance hierarchy
     addNestedFormatterGoldens('HttpRequest', new HttpRequest());
   });
@@ -329,10 +331,8 @@
           'the diff using your favorite diff tool to make sure the custom '
           'formatting output has not regressed.';
       print(helpMessage);
-      print(actualStr);
       // Copy text to clipboard on page click. We can't copy to the clipboard
       // without a click due to Chrome security.
-      var body = document.body;
       TextAreaElement textField = new Element.tag('textarea');
       textField.maxLength = 100000000;
       textField.text = actualStr;
diff --git a/tests/lib_2/html/debugger_test_golden.txt b/tests/lib_2/html/debugger_test_golden.txt
index 5894108..1c9ec45 100644
--- a/tests/lib_2/html/debugger_test_golden.txt
+++ b/tests/lib_2/html/debugger_test_golden.txt
@@ -3,9 +3,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "JSArray<String> length 3"
+    "List<String> length 3"
 ]
 -----------------------------------
 Test: List<String> formatting body
@@ -26,7 +26,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "0: "
             ],
@@ -50,7 +50,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "1: "
             ],
@@ -74,7 +74,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "2: "
             ],
@@ -95,7 +95,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[class]]: "
         ],
@@ -122,9 +122,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "JSArray<Object> length 3"
+    "List<Object> length 3"
 ]
 -----------------------------------
 Test: List<Object> instance body
@@ -145,7 +145,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "0: "
             ],
@@ -169,7 +169,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "1: "
             ],
@@ -193,7 +193,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "2: "
             ],
@@ -214,7 +214,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[class]]: "
         ],
@@ -241,9 +241,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "JSArray<Object> implements List<Object>, JSIndexable<Object>"
+    "List<Object> implements List<Object>, JSIndexable<Object>"
 ]
 -----------------------------------
 Test: List<Object> definition formatting body
@@ -266,79 +266,6 @@
                 {
                     "style": ""
                 },
-                "[[Static members]]"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "markFixedList: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "markUnmodifiableList: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": ""
-                },
                 "[[Instance Methods]]"
             ]
         ]
@@ -351,7 +278,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "+: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "add: "
         ],
@@ -379,7 +334,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "addAll: "
         ],
@@ -407,7 +362,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "any: "
         ],
@@ -435,7 +390,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "asMap: "
         ],
@@ -463,7 +418,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "cast: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "checkGrowable: "
         ],
@@ -491,7 +474,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "checkMutable: "
         ],
@@ -519,7 +502,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "clear: "
         ],
@@ -547,7 +530,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "contains: "
         ],
@@ -575,7 +558,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "elementAt: "
         ],
@@ -603,7 +586,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "every: "
         ],
@@ -631,7 +614,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "expand: "
         ],
@@ -659,7 +642,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "fillRange: "
         ],
@@ -687,7 +670,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "firstWhere: "
         ],
@@ -715,7 +698,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "fold: "
         ],
@@ -743,7 +726,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "followedBy: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "forEach: "
         ],
@@ -771,7 +782,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "getRange: "
         ],
@@ -799,7 +810,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "indexOf: "
         ],
@@ -827,7 +838,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "indexWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "insert: "
         ],
@@ -855,7 +894,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "insertAll: "
         ],
@@ -883,7 +922,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "join: "
         ],
@@ -911,7 +950,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "lastIndexOf: "
         ],
@@ -939,7 +978,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "lastIndexWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "lastWhere: "
         ],
@@ -967,7 +1034,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "map: "
         ],
@@ -995,7 +1062,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "reduce: "
         ],
@@ -1023,7 +1090,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "remove: "
         ],
@@ -1051,7 +1118,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "removeAt: "
         ],
@@ -1079,7 +1146,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "removeLast: "
         ],
@@ -1107,7 +1174,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "removeRange: "
         ],
@@ -1135,7 +1202,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "removeWhere: "
         ],
@@ -1163,7 +1230,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "replaceRange: "
         ],
@@ -1191,7 +1258,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "retainWhere: "
         ],
@@ -1219,7 +1286,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "setAll: "
         ],
@@ -1247,7 +1314,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "setRange: "
         ],
@@ -1275,7 +1342,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "shuffle: "
         ],
@@ -1303,7 +1370,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "singleWhere: "
         ],
@@ -1331,7 +1398,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "skip: "
         ],
@@ -1359,7 +1426,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "skipWhile: "
         ],
@@ -1387,7 +1454,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "sort: "
         ],
@@ -1415,7 +1482,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "sublist: "
         ],
@@ -1443,7 +1510,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "take: "
         ],
@@ -1471,7 +1538,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "takeWhile: "
         ],
@@ -1499,7 +1566,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "toList: "
         ],
@@ -1527,7 +1594,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "toSet: "
         ],
@@ -1555,7 +1622,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "toString: "
         ],
@@ -1583,7 +1650,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "where: "
         ],
@@ -1611,7 +1678,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "whereType: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "_equals: "
         ],
@@ -1639,7 +1734,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "_get: "
         ],
@@ -1667,7 +1762,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "_removeWhere: "
         ],
@@ -1695,7 +1790,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "_set: "
         ],
@@ -1723,7 +1818,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[base class]]: "
         ],
@@ -1750,9 +1845,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "JSArray<int> length 200"
+    "List<int> length 200"
 ]
 -----------------------------------
 Test: List<int> large instance body
@@ -1812,7 +1907,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[class]]: "
         ],
@@ -1839,9 +1934,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "JSArray<int> implements List<int>, JSIndexable<int>"
+    "List<int> implements List<int>, JSIndexable<int>"
 ]
 -----------------------------------
 Test: List<int> large definition formatting body
@@ -1864,79 +1959,6 @@
                 {
                     "style": ""
                 },
-                "[[Static members]]"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "markFixedList: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "markUnmodifiableList: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": ""
-                },
                 "[[Instance Methods]]"
             ]
         ]
@@ -1949,7 +1971,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "+: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "add: "
         ],
@@ -1977,7 +2027,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "addAll: "
         ],
@@ -2005,7 +2055,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "any: "
         ],
@@ -2033,7 +2083,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "asMap: "
         ],
@@ -2061,7 +2111,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "cast: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "checkGrowable: "
         ],
@@ -2089,7 +2167,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "checkMutable: "
         ],
@@ -2117,7 +2195,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "clear: "
         ],
@@ -2145,7 +2223,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "contains: "
         ],
@@ -2173,7 +2251,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "elementAt: "
         ],
@@ -2201,7 +2279,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "every: "
         ],
@@ -2229,7 +2307,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "expand: "
         ],
@@ -2257,7 +2335,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "fillRange: "
         ],
@@ -2285,7 +2363,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "firstWhere: "
         ],
@@ -2313,7 +2391,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "fold: "
         ],
@@ -2341,7 +2419,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "followedBy: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "forEach: "
         ],
@@ -2369,7 +2475,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "getRange: "
         ],
@@ -2397,7 +2503,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "indexOf: "
         ],
@@ -2425,7 +2531,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "indexWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "insert: "
         ],
@@ -2453,7 +2587,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "insertAll: "
         ],
@@ -2481,7 +2615,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "join: "
         ],
@@ -2509,7 +2643,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "lastIndexOf: "
         ],
@@ -2537,7 +2671,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "lastIndexWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "lastWhere: "
         ],
@@ -2565,7 +2727,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "map: "
         ],
@@ -2593,7 +2755,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "reduce: "
         ],
@@ -2621,7 +2783,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "remove: "
         ],
@@ -2649,7 +2811,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "removeAt: "
         ],
@@ -2677,7 +2839,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "removeLast: "
         ],
@@ -2705,7 +2867,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "removeRange: "
         ],
@@ -2733,7 +2895,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "removeWhere: "
         ],
@@ -2761,7 +2923,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "replaceRange: "
         ],
@@ -2789,7 +2951,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "retainWhere: "
         ],
@@ -2817,7 +2979,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "setAll: "
         ],
@@ -2845,7 +3007,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "setRange: "
         ],
@@ -2873,7 +3035,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "shuffle: "
         ],
@@ -2901,7 +3063,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "singleWhere: "
         ],
@@ -2929,7 +3091,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "skip: "
         ],
@@ -2957,7 +3119,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "skipWhile: "
         ],
@@ -2985,7 +3147,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "sort: "
         ],
@@ -3013,7 +3175,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "sublist: "
         ],
@@ -3041,7 +3203,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "take: "
         ],
@@ -3069,7 +3231,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "takeWhile: "
         ],
@@ -3097,7 +3259,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "toList: "
         ],
@@ -3125,7 +3287,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "toSet: "
         ],
@@ -3153,7 +3315,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "toString: "
         ],
@@ -3181,7 +3343,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "where: "
         ],
@@ -3209,7 +3371,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "whereType: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "_equals: "
         ],
@@ -3237,7 +3427,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "_get: "
         ],
@@ -3265,7 +3455,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "_removeWhere: "
         ],
@@ -3293,7 +3483,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "_set: "
         ],
@@ -3321,7 +3511,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[base class]]: "
         ],
@@ -3348,7 +3538,7 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
     "MappedListIterable<String, String> length 3"
 ]
@@ -3371,7 +3561,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "0: "
             ],
@@ -3395,7 +3585,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "1: "
             ],
@@ -3419,7 +3609,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "2: "
             ],
@@ -3440,7 +3630,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[class]]: "
         ],
@@ -3467,7 +3657,7 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
     "MappedListIterable<String, String>"
 ]
@@ -3504,7 +3694,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "elementAt: "
         ],
@@ -3532,7 +3722,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[base class]]: "
         ],
@@ -3559,9 +3749,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "_HashSet length 3"
+    "_HashSet<dynamic> length 3"
 ]
 -----------------------------------
 Test: Set instance body
@@ -3582,7 +3772,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "0: "
             ],
@@ -3606,7 +3796,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "1: "
             ],
@@ -3630,7 +3820,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "2: "
             ],
@@ -3651,7 +3841,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[class]]: "
         ],
@@ -3678,9 +3868,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "_HashSet implements LinkedHashSet"
+    "_HashSet<dynamic> implements HashSet<dynamic>, LinkedHashSet<dynamic>"
 ]
 -----------------------------------
 Test: Set definition formatting body
@@ -3703,51 +3893,6 @@
                 {
                     "style": ""
                 },
-                "[[Static members]]"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "setToString: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": ""
-                },
                 "[[Instance Methods]]"
             ]
         ]
@@ -3760,7 +3905,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "add: "
         ],
@@ -3788,7 +3933,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "addAll: "
         ],
@@ -3816,7 +3961,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "contains: "
         ],
@@ -3844,7 +3989,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "lookup: "
         ],
@@ -3872,7 +4017,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "remove: "
         ],
@@ -3900,7 +4045,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "_newSet: "
         ],
@@ -3928,7 +4073,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_newSimilarSet: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[base class]]: "
         ],
@@ -3955,7 +4128,7 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
     "IdentityMap<String, int> length 3"
 ]
@@ -3975,7 +4148,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "0: "
         ],
@@ -4003,7 +4176,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "1: "
         ],
@@ -4031,7 +4204,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "2: "
         ],
@@ -4059,7 +4232,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[instance members]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asObject"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[class]]: "
         ],
@@ -4086,9 +4287,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "LinkedMap length 3"
+    "LinkedMap<dynamic, dynamic> length 3"
 ]
 -----------------------------------
 Test: Map<dynamic, dynamic> instance body
@@ -4106,7 +4307,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "0: "
         ],
@@ -4134,7 +4335,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "1: "
         ],
@@ -4162,7 +4363,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "2: "
         ],
@@ -4190,7 +4391,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[instance members]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asObject"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[class]]: "
         ],
@@ -4217,9 +4446,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "LinkedMap"
+    "LinkedMap<dynamic, dynamic>"
 ]
 -----------------------------------
 Test: Map<dynamic, dynamic> definition formatting body
@@ -4254,7 +4483,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "addAll: "
         ],
@@ -4282,7 +4511,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "clear: "
         ],
@@ -4310,63 +4539,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "containsKey: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "containsValue: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "putIfAbsent: "
         ],
@@ -4394,7 +4567,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "remove: "
         ],
@@ -4422,35 +4595,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "toString: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "_get: "
         ],
@@ -4478,7 +4623,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "_set: "
         ],
@@ -4506,7 +4651,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[base class]]: "
         ],
@@ -4533,9 +4678,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "(int, int) -> int"
+    "(int, int) => int"
 ]
 -----------------------------------
 Test: Function formatting body
@@ -4556,7 +4701,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "signature: "
             ],
@@ -4565,7 +4710,7 @@
                 {
                     "style": "margin-left: 13px"
                 },
-                "(int, int) -> int"
+                "(int, int) => int"
             ]
         ]
     ],
@@ -4577,7 +4722,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "JavaScript Function: "
         ],
@@ -4604,9 +4749,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "(String, (Event) -> bool) -> dynamic"
+    "(String, (Event$) => bool) => Null"
 ]
 -----------------------------------
 Test: Function with functon arguments formatting body
@@ -4627,7 +4772,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "signature: "
             ],
@@ -4636,7 +4781,7 @@
                 {
                     "style": "margin-left: 13px"
                 },
-                "(String, (Event) -> bool) -> dynamic"
+                "(String, (Event$) => bool) => Null"
             ]
         ]
     ],
@@ -4648,7 +4793,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "JavaScript Function: "
         ],
@@ -4679,7 +4824,7 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
     "TestClass"
 ]
@@ -4698,9 +4843,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "Object"
+    "Instance of 'Object'"
 ]
 -----------------------------------
 Test: Object formatting body
@@ -4718,7 +4863,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "runtimeType: "
         ],
@@ -4746,7 +4891,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[class]]: "
         ],
@@ -4773,7 +4918,7 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
     "TestClass"
 ]
@@ -4792,7 +4937,7 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
     "HttpRequest"
 ]
@@ -4811,9 +4956,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "Library Module: tests_lib_2_html_debugger_test/debugger_test"
+    "Library Module: debugger_test"
 ]
 -----------------------------------
 Test: Test library Module body
@@ -4851,7 +4996,7 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
     "<FILE>"
 ]
@@ -4871,7 +5016,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "TestClass: "
         ],
@@ -4899,9 +5044,9 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
-            "TestGenericClass: "
+            "TestGenericClass<dynamic, dynamic>: "
         ],
         [
             "span",
@@ -4927,7 +5072,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "devtoolsFormatters: "
         ],
@@ -4955,7 +5100,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "replacer: "
         ],
@@ -4983,7 +5128,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "format: "
         ],
@@ -5011,7 +5156,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "FormattedObject: "
         ],
@@ -5039,7 +5184,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "extractNestedFormattedObjects: "
         ],
@@ -5067,7 +5212,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "main: "
         ],
@@ -5094,7 +5239,7 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
     "StackTrace"
 ]
@@ -5104,7 +5249,7 @@
 [
     "ol",
     {
-        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;color: rgb(196, 26, 22);"
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;background-color: thistle;color: rgb(196, 26, 22);"
     },
     [
         "li",
@@ -5119,7 +5264,7 @@
                 {
                     "style": ""
                 },
-                "Error"
+                "Error: Instance of 'Error'"
             ]
         ]
     ],
@@ -5385,9 +5530,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "TestClass"
+    "Instance of 'TestClass'"
 ]
 -----------------------------------
 Test: TestClass instance body
@@ -5408,7 +5553,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "date: "
             ],
@@ -5432,7 +5577,7 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "name: "
             ],
@@ -5452,2548 +5597,8 @@
         },
         [
             "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "someInt: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "42"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "someObject: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "someString: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "Hello world"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "[[class]]: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
-                }
-            ]
-        ]
-    ]
-]
------------------------------------
-Test: TestClass definition formatting header
-Value:
-[
-    "span",
-    {
-        "style": "background-color: #d9edf7;"
-    },
-    "TestClass"
-]
------------------------------------
-Test: TestClass definition formatting body
-Value:
-[
-    "ol",
-    {
-        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
-    },
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": ""
-                },
-                "[[Static members]]"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "exampleStaticMethod: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": ""
-                },
-                "[[Instance Methods]]"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "addOne: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "last: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "nameAndDate: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "returnObject: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "[[base class]]: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
-                }
-            ]
-        ]
-    ]
-]
------------------------------------
-Test: MouseEvent instance header
-Value:
-[
-    "span",
-    {
-        "style": "background-color: #d9edf7;"
-    },
-    "MouseEvent"
-]
------------------------------------
-Test: MouseEvent instance body
-Value:
-[
-    "ol",
-    {
-        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
-    },
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "altKey: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "false"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "bubbles: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "true"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "button: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "buttons: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "cancelable: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "true"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "client: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "ctrlKey: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "false"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "dataTransfer: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "null"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "defaultPrevented: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "false"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "detail: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "eventPhase: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "fromElement: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "isTrusted: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "false"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "layer: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "metaKey: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "false"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "movement: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "offset: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "<Exception thrown> Unsupported operation: offsetX is only supported on elements"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "page: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "path: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "region: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "null"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "relatedTarget: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "scoped: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "null"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "screen: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "shiftKey: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "false"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "sourceCapabilities: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "timeStamp: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "5099.7300000000005"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "toElement: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "type: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "click"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "_clientX: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "_clientY: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "_get_currentTarget: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "_get_relatedTarget: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "_get_target: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "_get_view: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "_layerX: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "_layerY: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "_movementX: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "_movementY: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "_pageX: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "_pageY: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "_screenX: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "_screenY: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "_selector: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "null"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "_which: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "1"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "[[class]]: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
-                }
-            ]
-        ]
-    ]
-]
------------------------------------
-Test: MouseEvent definition formatting header
-Value:
-[
-    "span",
-    {
-        "style": "background-color: #d9edf7;"
-    },
-    "MouseEvent"
-]
------------------------------------
-Test: MouseEvent definition formatting body
-Value:
-[
-    "ol",
-    {
-        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
-    },
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": ""
-                },
-                "[[Static members]]"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "_create_1: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "_create_2: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": ""
-                },
-                "[[Instance Methods]]"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "getModifierState: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "_initMouseEvent: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "_initMouseEvent_1: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "[[base class]]: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
-                }
-            ]
-        ]
-    ]
-]
------------------------------------
-Test: HttpRequest instance header
-Value:
-[
-    "span",
-    {
-        "style": "background-color: #d9edf7;"
-    },
-    "HttpRequest"
-]
------------------------------------
-Test: HttpRequest instance body
-Value:
-[
-    "ol",
-    {
-        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
-    },
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "onReadyStateChange: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "readyState: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "response: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                ""
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "responseHeaders: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "responseText: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                ""
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "responseType: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                ""
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "responseUrl: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                ""
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "responseXml: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "status: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "statusText: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                ""
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "timeout: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "0"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "upload: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "withCredentials: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                "false"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "_get_response: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                ""
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "[[class]]: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
-                }
-            ]
-        ]
-    ]
-]
------------------------------------
-Test: HttpRequest definition formatting header
-Value:
-[
-    "span",
-    {
-        "style": "background-color: #d9edf7;"
-    },
-    "HttpRequest"
-]
------------------------------------
-Test: HttpRequest definition formatting body
-Value:
-[
-    "ol",
-    {
-        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
-    },
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": ""
-                },
-                "[[Static members]]"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "getString: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "postFormData: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "request: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "requestCrossOrigin: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "_create_1: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": ""
-                },
-                "[[Instance Methods]]"
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "abort: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "getAllResponseHeaders: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "getResponseHeader: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "open: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "overrideMimeType: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "send: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "setRequestHeader: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "[[base class]]: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
-                }
-            ]
-        ]
-    ]
-]
------------------------------------
-Test: TestGenericClass instance header
-Value:
-[
-    "span",
-    {
-        "style": "background-color: #d9edf7;"
-    },
-    "TestGenericClass<int, List>"
-]
------------------------------------
-Test: TestGenericClass instance body
-Value:
-[
-    "ol",
-    {
-        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
-    },
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "runtimeType: "
         ],
@@ -8024,7 +5629,1217 @@
             [
                 "span",
                 {
-                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "someInt: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "42"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "someObject: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "someString: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "Hello world"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: TestClass definition formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;color: black"
+    },
+    "TestClass"
+]
+-----------------------------------
+Test: TestClass definition formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Instance Methods]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "addOne: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "last: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "nameAndDate: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "returnObject: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[base class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: HttpRequest instance header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;color: black"
+    },
+    "[object XMLHttpRequest]"
+]
+-----------------------------------
+Test: HttpRequest instance body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "readyState: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "responseText: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                ""
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "responseType: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                ""
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "responseUrl: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                ""
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "responseXml: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "status: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "statusText: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                ""
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "timeout: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "upload: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "withCredentials: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "false"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_get_response: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                ""
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "on: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onAbort: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onError: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onLoad: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onLoadEnd: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onLoadStart: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onProgress: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onReadyStateChange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onTimeout: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "response: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                ""
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "responseHeaders: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "runtimeType: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: HttpRequest definition formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;color: black"
+    },
+    "HttpRequest"
+]
+-----------------------------------
+Test: HttpRequest definition formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Instance Methods]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "abort: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "getAllResponseHeaders: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "getResponseHeader: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "open: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "overrideMimeType: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "send: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "setRequestHeader: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[base class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: TestGenericClass instance header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;color: black"
+    },
+    "Instance of 'TestGenericClass<int, List<dynamic>>'"
+]
+-----------------------------------
+Test: TestGenericClass instance body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
                 "x: "
             ],
@@ -8045,7 +6860,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "runtimeType: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[class]]: "
         ],
@@ -8072,9 +6915,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "TestGenericClass<int, List>"
+    "TestGenericClass<int, List<dynamic>>"
 ]
 -----------------------------------
 Test: TestGenericClass definition formatting body
@@ -8109,7 +6952,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "noSuchMethod: "
         ],
@@ -8137,7 +6980,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "toString: "
         ],
@@ -8165,7 +7008,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "_equals: "
         ],
@@ -8193,7 +7036,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[base class]]: "
         ],
@@ -8220,9 +7063,9 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
-    "TestGenericClass<JSObject<ExampleJSClass>, int>"
+    "Instance of 'TestGenericClass<JSObject<ExampleJSClass>, int>'"
 ]
 -----------------------------------
 Test: TestGenericClassJSInterop instance body
@@ -8240,35 +7083,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "runtimeType: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "x: "
         ],
@@ -8296,7 +7111,35 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "runtimeType: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[class]]: "
         ],
@@ -8323,7 +7166,7 @@
 [
     "span",
     {
-        "style": "background-color: #d9edf7;"
+        "style": "background-color: #d9edf7;color: black"
     },
     "TestGenericClass<JSObject<ExampleJSClass>, int>"
 ]
@@ -8360,7 +7203,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "noSuchMethod: "
         ],
@@ -8388,7 +7231,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "toString: "
         ],
@@ -8416,7 +7259,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "_equals: "
         ],
@@ -8444,7 +7287,7 @@
         [
             "span",
             {
-                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
             "[[base class]]: "
         ],
@@ -8465,4 +7308,4 @@
         ]
     ]
 ]
------------------------------------
+-----------------------------------
\ No newline at end of file
diff --git a/tests/lib_2/html/js_dispatch_property_test.dart b/tests/lib_2/html/js_dispatch_property_test.dart
index 27030b0..3a75f8e 100644
--- a/tests/lib_2/html/js_dispatch_property_test.dart
+++ b/tests/lib_2/html/js_dispatch_property_test.dart
@@ -11,8 +11,8 @@
 
 import 'js_dispatch_property_test_lib.dart';
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 main() {
diff --git a/tests/lib_2/html/js_interop_constructor_name_div_test.dart b/tests/lib_2/html/js_interop_constructor_name_div_test.dart
index dfdbfac..869ff73 100644
--- a/tests/lib_2/html/js_interop_constructor_name_div_test.dart
+++ b/tests/lib_2/html/js_interop_constructor_name_div_test.dart
@@ -21,8 +21,8 @@
   external String bar();
 }
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 main() {
diff --git a/tests/lib_2/html/js_interop_constructor_name_error1_test.dart b/tests/lib_2/html/js_interop_constructor_name_error1_test.dart
index b534222..9057129 100644
--- a/tests/lib_2/html/js_interop_constructor_name_error1_test.dart
+++ b/tests/lib_2/html/js_interop_constructor_name_error1_test.dart
@@ -21,8 +21,8 @@
   external String bar();
 }
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 main() {
diff --git a/tests/lib_2/html/js_interop_constructor_name_error2_test.dart b/tests/lib_2/html/js_interop_constructor_name_error2_test.dart
index 00c8fd6..6340f63 100644
--- a/tests/lib_2/html/js_interop_constructor_name_error2_test.dart
+++ b/tests/lib_2/html/js_interop_constructor_name_error2_test.dart
@@ -21,8 +21,8 @@
   external String bar();
 }
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 main() {
diff --git a/tests/lib_2/html/js_interop_constructor_name_method_test.dart b/tests/lib_2/html/js_interop_constructor_name_method_test.dart
index 2e5b3ce..f96895a 100644
--- a/tests/lib_2/html/js_interop_constructor_name_method_test.dart
+++ b/tests/lib_2/html/js_interop_constructor_name_method_test.dart
@@ -21,8 +21,8 @@
   external String bar();
 }
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 main() {
diff --git a/tests/lib_2/html/js_typed_interop_callable_object_test.dart b/tests/lib_2/html/js_typed_interop_callable_object_test.dart
index 5abcb3b..49f58c4 100644
--- a/tests/lib_2/html/js_typed_interop_callable_object_test.dart
+++ b/tests/lib_2/html/js_typed_interop_callable_object_test.dart
@@ -13,8 +13,8 @@
 
 // This is a regression test for https://github.com/dart-lang/sdk/issues/25658
 
-@NoInline()
-@AssumeDynamic()
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
 confuse(x) => x;
 
 _injectJs() {
diff --git a/tests/lib_2/html/js_typed_interop_type1_test.dart b/tests/lib_2/html/js_typed_interop_type1_test.dart
index 6c0db32..e10aea3 100644
--- a/tests/lib_2/html/js_typed_interop_type1_test.dart
+++ b/tests/lib_2/html/js_typed_interop_type1_test.dart
@@ -18,12 +18,12 @@
   F(this.foo);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testA(A o) {
   return o.foo;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testF(F o) {
   return o.foo;
 }
diff --git a/tests/lib_2/html/js_typed_interop_type2_test.dart b/tests/lib_2/html/js_typed_interop_type2_test.dart
index 8e02b1c..aa6f3bf 100644
--- a/tests/lib_2/html/js_typed_interop_type2_test.dart
+++ b/tests/lib_2/html/js_typed_interop_type2_test.dart
@@ -27,12 +27,12 @@
   F(this.foo);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testC(C o) {
   return o.foo;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testF(F o) {
   return o.foo;
 }
diff --git a/tests/lib_2/html/js_typed_interop_type3_test.dart b/tests/lib_2/html/js_typed_interop_type3_test.dart
index 79c1930..1188571 100644
--- a/tests/lib_2/html/js_typed_interop_type3_test.dart
+++ b/tests/lib_2/html/js_typed_interop_type3_test.dart
@@ -34,22 +34,22 @@
   F(this.foo);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testA(A o) {
   return o.foo;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testC(C o) {
   return o.foo;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testD(D o) {
   return o.foo;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testF(F o) {
   return o.foo;
 }
diff --git a/tests/lib_2/html/js_typed_interop_type_test.dart b/tests/lib_2/html/js_typed_interop_type_test.dart
index cbeae32..dab7187 100644
--- a/tests/lib_2/html/js_typed_interop_type_test.dart
+++ b/tests/lib_2/html/js_typed_interop_type_test.dart
@@ -51,32 +51,32 @@
   F(this.foo);
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testA(A o) {
   return o.foo;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testB(B o) {
   return o.foo;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testC(C o) {
   return o.foo;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testD(D o) {
   return o.foo;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testE(E o) {
   return o.foo;
 }
 
-@NoInline()
+@pragma('dart2js:noInline')
 testF(F o) {
   return o.foo;
 }
diff --git a/tests/lib_2/html/websql_test.dart b/tests/lib_2/html/websql_test.dart
index 1d52d5d..07f9ff2 100644
--- a/tests/lib_2/html/websql_test.dart
+++ b/tests/lib_2/html/websql_test.dart
@@ -4,9 +4,7 @@
 import 'dart:html';
 import 'dart:web_sql';
 
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:async_helper/async_helper.dart';
+import 'package:expect/async_minitest.dart';
 
 Future<SqlResultSet> createTable(
     SqlTransaction transaction, String tableName, String columnName) async {
@@ -52,8 +50,6 @@
 }
 
 main() async {
-  useHtmlConfiguration();
-
   await setup();
 
   group('Database', () {
diff --git a/tests/lib_2/isolate/issue_21398_child_isolate1.dart b/tests/lib_2/isolate/issue_21398_child_isolate1.dart
index 1a720bd..9911733 100644
--- a/tests/lib_2/isolate/issue_21398_child_isolate1.dart
+++ b/tests/lib_2/isolate/issue_21398_child_isolate1.dart
@@ -6,7 +6,7 @@
 import "package:expect/expect.dart";
 
 main(List<String> args, message) {
-  var sendPort1 = args[0] as SendPort;
-  var sendPort2 = args[1] as SendPort;
+  var sendPort1 = message[0] as SendPort;
+  var sendPort2 = message[1] as SendPort;
   sendPort2.send(sendPort1);
 }
diff --git a/tests/lib_2/isolate/issue_21398_parent_isolate1_test.dart b/tests/lib_2/isolate/issue_21398_parent_isolate1_test.dart
index 5681cf3..9da9678 100644
--- a/tests/lib_2/isolate/issue_21398_parent_isolate1_test.dart
+++ b/tests/lib_2/isolate/issue_21398_parent_isolate1_test.dart
@@ -72,8 +72,8 @@
             // sendports over to the other.
             Isolate.spawnUri(
                 Uri.parse('issue_21398_child_isolate1.dart'),
-                [spawnFunctionIsolate1SendPort, spawnFunctionIsolate2SendPort],
-                "no-msg");
+                null,
+                [spawnFunctionIsolate1SendPort, spawnFunctionIsolate2SendPort]);
           }, onError: (e) => print('$e'));
         });
       } else if (msg == "done") {
@@ -133,8 +133,8 @@
             // sendports over to the other.
             Isolate.spawnUri(
                 Uri.parse('issue_21398_child_isolate1.dart'),
-                [spawnFunctionIsolateSendPort, spawnUriIsolateSendPort],
-                "no-msg");
+                null,
+                [spawnFunctionIsolateSendPort, spawnUriIsolateSendPort]);
           }, onError: (e) => print('$e'));
         });
       } else if (msg == "done") {
diff --git a/tests/lib_2/isolate/issue_22778_test.dart b/tests/lib_2/isolate/issue_22778_test.dart
index ed6b5c6..51f5a19 100644
--- a/tests/lib_2/isolate/issue_22778_test.dart
+++ b/tests/lib_2/isolate/issue_22778_test.dart
@@ -13,5 +13,5 @@
     Expect.isTrue(v[0] == v[1]);
     r.close();
   };
-  r.sendPort.send([func, func]);
+  r.sendPort.send(<Function>[func, func]);
 }
diff --git a/tests/lib_2/isolate/issue_35626_test.dart b/tests/lib_2/isolate/issue_35626_test.dart
new file mode 100644
index 0000000..2873d83
--- /dev/null
+++ b/tests/lib_2/isolate/issue_35626_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests that sets of enums can be set through ports.
+// https://github.com/dart-lang/sdk/issues/35626
+
+library spawn_tests;
+
+import "dart:io";
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+enum MyEnum { foo, bar, baz }
+
+void sendSetOfEnums(SendPort port) {
+  Set<MyEnum> remoteSet = Set()..add(MyEnum.bar);
+  port.send(remoteSet);
+}
+
+void main() async {
+  Set<MyEnum> localSet = Set()..add(MyEnum.foo)..add(MyEnum.bar);
+  localSet.lookup(MyEnum.foo);
+
+  final port = ReceivePort();
+  await Isolate.spawn(sendSetOfEnums, port.sendPort);
+  Set<MyEnum> remoteSet = await port.first;
+
+  print(localSet);
+  print(remoteSet);
+  Expect.setEquals([MyEnum.bar], localSet.intersection(remoteSet));
+  Expect.setEquals([MyEnum.bar], remoteSet.intersection(localSet));
+}
diff --git a/tests/lib_2/isolate/kill_self_synchronously_test.dart b/tests/lib_2/isolate/kill_self_synchronously_test.dart
index c3b5486..1a40a01 100644
--- a/tests/lib_2/isolate/kill_self_synchronously_test.dart
+++ b/tests/lib_2/isolate/kill_self_synchronously_test.dart
@@ -13,7 +13,7 @@
     throw "QQQ Should not be reached";
   } else {
     var exec = Platform.resolvedExecutable;
-    var args = new List();
+    var args = new List<String>();
     args.addAll(Platform.executableArguments);
     args.add(Platform.script.toFilePath());
     args.add("--child");
diff --git a/tests/lib_2/isolate/message_const_type_arguments_1_test.dart b/tests/lib_2/isolate/message_const_type_arguments_1_test.dart
new file mode 100644
index 0000000..48d2af1
--- /dev/null
+++ b/tests/lib_2/isolate/message_const_type_arguments_1_test.dart
@@ -0,0 +1,407 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// https://github.com/dart-lang/sdk/issues/35778
+
+import "dart:async";
+import "dart:isolate";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+void child(replyPort) {
+  print("Child start");
+
+  replyPort.send(const <List>[]);
+  replyPort.send(const <Map>[]);
+  replyPort.send(const <Null>[]);
+  replyPort.send(const <Object>[]);
+  replyPort.send(const <String>[]);
+  replyPort.send(const <bool>[]);
+  replyPort.send(const <double>[]);
+  replyPort.send(const <int>[]);
+  replyPort.send(const <num>[]);
+
+  replyPort.send(const <List, List>{});
+  replyPort.send(const <List, Map>{});
+  replyPort.send(const <List, Null>{});
+  replyPort.send(const <List, Object>{});
+  replyPort.send(const <List, String>{});
+  replyPort.send(const <List, bool>{});
+  replyPort.send(const <List, double>{});
+  replyPort.send(const <List, int>{});
+  replyPort.send(const <List, num>{});
+
+  replyPort.send(const <Map, List>{});
+  replyPort.send(const <Map, Map>{});
+  replyPort.send(const <Map, Null>{});
+  replyPort.send(const <Map, Object>{});
+  replyPort.send(const <Map, String>{});
+  replyPort.send(const <Map, bool>{});
+  replyPort.send(const <Map, double>{});
+  replyPort.send(const <Map, int>{});
+  replyPort.send(const <Map, num>{});
+
+  replyPort.send(const <Null, List>{});
+  replyPort.send(const <Null, Map>{});
+  replyPort.send(const <Null, Null>{});
+  replyPort.send(const <Null, Object>{});
+  replyPort.send(const <Null, String>{});
+  replyPort.send(const <Null, bool>{});
+  replyPort.send(const <Null, double>{});
+  replyPort.send(const <Null, int>{});
+  replyPort.send(const <Null, num>{});
+
+  replyPort.send(const <Object, List>{});
+  replyPort.send(const <Object, Map>{});
+  replyPort.send(const <Object, Null>{});
+  replyPort.send(const <Object, Object>{});
+  replyPort.send(const <Object, String>{});
+  replyPort.send(const <Object, bool>{});
+  replyPort.send(const <Object, double>{});
+  replyPort.send(const <Object, int>{});
+  replyPort.send(const <Object, num>{});
+
+  replyPort.send(const <String, List>{});
+  replyPort.send(const <String, Map>{});
+  replyPort.send(const <String, Null>{});
+  replyPort.send(const <String, Object>{});
+  replyPort.send(const <String, String>{});
+  replyPort.send(const <String, bool>{});
+  replyPort.send(const <String, double>{});
+  replyPort.send(const <String, int>{});
+  replyPort.send(const <String, num>{});
+
+  replyPort.send(const <bool, List>{});
+  replyPort.send(const <bool, Map>{});
+  replyPort.send(const <bool, Null>{});
+  replyPort.send(const <bool, Object>{});
+  replyPort.send(const <bool, String>{});
+  replyPort.send(const <bool, bool>{});
+  replyPort.send(const <bool, double>{});
+  replyPort.send(const <bool, int>{});
+  replyPort.send(const <bool, num>{});
+
+  replyPort.send(const <double, List>{});
+  replyPort.send(const <double, Map>{});
+  replyPort.send(const <double, Null>{});
+  replyPort.send(const <double, Object>{});
+  replyPort.send(const <double, String>{});
+  replyPort.send(const <double, bool>{});
+  replyPort.send(const <double, double>{});
+  replyPort.send(const <double, int>{});
+  replyPort.send(const <double, num>{});
+
+  replyPort.send(const <int, List>{});
+  replyPort.send(const <int, Map>{});
+  replyPort.send(const <int, Null>{});
+  replyPort.send(const <int, Object>{});
+  replyPort.send(const <int, String>{});
+  replyPort.send(const <int, bool>{});
+  replyPort.send(const <int, double>{});
+  replyPort.send(const <int, int>{});
+  replyPort.send(const <int, num>{});
+
+  replyPort.send(const <num, List>{});
+  replyPort.send(const <num, Map>{});
+  replyPort.send(const <num, Null>{});
+  replyPort.send(const <num, Object>{});
+  replyPort.send(const <num, String>{});
+  replyPort.send(const <num, bool>{});
+  replyPort.send(const <num, double>{});
+  replyPort.send(const <num, int>{});
+  replyPort.send(const <num, num>{});
+
+  print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+  print("Parent start");
+
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(child, port.sendPort);
+  StreamIterator<dynamic> incoming = new StreamIterator<dynamic>(port);
+
+  Expect.isTrue(await incoming.moveNext());
+  dynamic x = incoming.current;
+  Expect.isTrue(x is List<List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, num>);
+
+  port.close();
+  print("Parent done");
+}
diff --git a/tests/lib_2/isolate/message_const_type_arguments_2_test.dart b/tests/lib_2/isolate/message_const_type_arguments_2_test.dart
new file mode 100644
index 0000000..681b1c7
--- /dev/null
+++ b/tests/lib_2/isolate/message_const_type_arguments_2_test.dart
@@ -0,0 +1,317 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// https://github.com/dart-lang/sdk/issues/35778
+
+import "dart:async";
+import "dart:isolate";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+void child(replyPort) {
+  print("Child start");
+
+  replyPort.send(const <List>[]);
+  replyPort.send(const <Map>[]);
+  replyPort.send(const <Null>[]);
+  replyPort.send(const <Object>[]);
+  replyPort.send(const <String>[]);
+  replyPort.send(const <bool>[]);
+  replyPort.send(const <double>[]);
+  replyPort.send(const <int>[]);
+  replyPort.send(const <num>[]);
+
+  replyPort.send(const <List, List>{});
+  replyPort.send(const <List, Map>{});
+  replyPort.send(const <List, Null>{});
+  replyPort.send(const <List, Object>{});
+  replyPort.send(const <List, String>{});
+  replyPort.send(const <List, bool>{});
+  replyPort.send(const <List, double>{});
+  replyPort.send(const <List, int>{});
+  replyPort.send(const <List, num>{});
+
+  replyPort.send(const <Map, List>{});
+  replyPort.send(const <Map, Map>{});
+  replyPort.send(const <Map, Null>{});
+  replyPort.send(const <Map, Object>{});
+  replyPort.send(const <Map, String>{});
+  replyPort.send(const <Map, bool>{});
+  replyPort.send(const <Map, double>{});
+  replyPort.send(const <Map, int>{});
+  replyPort.send(const <Map, num>{});
+
+  replyPort.send(const <Null, List>{});
+  replyPort.send(const <Null, Map>{});
+  replyPort.send(const <Null, Null>{});
+  replyPort.send(const <Null, Object>{});
+  replyPort.send(const <Null, String>{});
+  replyPort.send(const <Null, bool>{});
+  replyPort.send(const <Null, double>{});
+  replyPort.send(const <Null, int>{});
+  replyPort.send(const <Null, num>{});
+
+  replyPort.send(const <Object, List>{});
+  replyPort.send(const <Object, Map>{});
+  replyPort.send(const <Object, Null>{});
+  replyPort.send(const <Object, Object>{});
+  replyPort.send(const <Object, String>{});
+  replyPort.send(const <Object, bool>{});
+  replyPort.send(const <Object, double>{});
+  replyPort.send(const <Object, int>{});
+  replyPort.send(const <Object, num>{});
+
+  replyPort.send(const <String, List>{});
+  replyPort.send(const <String, Map>{});
+  replyPort.send(const <String, Null>{});
+  replyPort.send(const <String, Object>{});
+  replyPort.send(const <String, String>{});
+  replyPort.send(const <String, bool>{});
+  replyPort.send(const <String, double>{});
+  replyPort.send(const <String, int>{});
+  replyPort.send(const <String, num>{});
+
+  replyPort.send(const <bool, List>{});
+  replyPort.send(const <bool, Map>{});
+  replyPort.send(const <bool, Null>{});
+  replyPort.send(const <bool, Object>{});
+  replyPort.send(const <bool, String>{});
+  replyPort.send(const <bool, bool>{});
+  replyPort.send(const <bool, double>{});
+  replyPort.send(const <bool, int>{});
+  replyPort.send(const <bool, num>{});
+
+  replyPort.send(const <double, List>{});
+  replyPort.send(const <double, Map>{});
+  replyPort.send(const <double, Null>{});
+  replyPort.send(const <double, Object>{});
+  replyPort.send(const <double, String>{});
+  replyPort.send(const <double, bool>{});
+  replyPort.send(const <double, double>{});
+  replyPort.send(const <double, int>{});
+  replyPort.send(const <double, num>{});
+
+  replyPort.send(const <int, List>{});
+  replyPort.send(const <int, Map>{});
+  replyPort.send(const <int, Null>{});
+  replyPort.send(const <int, Object>{});
+  replyPort.send(const <int, String>{});
+  replyPort.send(const <int, bool>{});
+  replyPort.send(const <int, double>{});
+  replyPort.send(const <int, int>{});
+  replyPort.send(const <int, num>{});
+
+  replyPort.send(const <num, List>{});
+  replyPort.send(const <num, Map>{});
+  replyPort.send(const <num, Null>{});
+  replyPort.send(const <num, Object>{});
+  replyPort.send(const <num, String>{});
+  replyPort.send(const <num, bool>{});
+  replyPort.send(const <num, double>{});
+  replyPort.send(const <num, int>{});
+  replyPort.send(const <num, num>{});
+
+  print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+  print("Parent start");
+
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(child, port.sendPort);
+  StreamIterator<dynamic> incoming = new StreamIterator<dynamic>(port);
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num>[]));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, num>{}));
+
+  port.close();
+  print("Parent done");
+}
diff --git a/tests/lib_2/isolate/message_test.dart b/tests/lib_2/isolate/message_test.dart
index fb1314b..70eafff 100644
--- a/tests/lib_2/isolate/message_test.dart
+++ b/tests/lib_2/isolate/message_test.dart
@@ -108,11 +108,11 @@
   test("send objects and receive them back", () {
     ReceivePort port = new ReceivePort();
     Isolate.spawn(pingPong, port.sendPort);
-    port.first.then(expectAsync((remote) {
+    port.first.then(expectAsync1((remote) {
       // Send objects and receive them back.
       for (int i = 0; i < MessageTest.elms.length; i++) {
         var sentObject = MessageTest.elms[i];
-        remoteCall(remote, sentObject).then(expectAsync((var receivedObject) {
+        remoteCall(remote, sentObject).then(expectAsync1((receivedObject) {
           MessageTest.VerifyObject(i, receivedObject);
         }));
       }
@@ -141,7 +141,7 @@
       });
 
       // Shutdown the MessageServer.
-      remoteCall(remote, -1).then(expectAsync((int message) {
+      remoteCall(remote, -1).then(expectAsync1((message) {
         expect(message, MessageTest.elms.length + 1);
       }));
     }));
diff --git a/tests/lib_2/isolate/mint_maker_test.dart b/tests/lib_2/isolate/mint_maker_test.dart
index e9f5f5b..198e3cc 100644
--- a/tests/lib_2/isolate/mint_maker_test.dart
+++ b/tests/lib_2/isolate/mint_maker_test.dart
@@ -155,7 +155,7 @@
 }
 
 _checkBalance(PurseWrapper wrapper, expected) {
-  wrapper.queryBalance(expectAsync((int balance) {
+  wrapper.queryBalance(expectAsync1((balance) {
     expect(balance, equals(expected));
   }));
 }
@@ -163,11 +163,11 @@
 void main([args, port]) {
   if (testRemote(main, port)) return;
   test("creating purse, deposit, and query balance", () {
-    MintMakerWrapper.create().then(expectAsync((mintMaker) {
-      mintMaker.makeMint(expectAsync((MintWrapper mint) {
-        mint.createPurse(100, expectAsync((PurseWrapper purse) {
+    MintMakerWrapper.create().then(expectAsync1((mintMaker) {
+      mintMaker.makeMint(expectAsync1((mint) {
+        mint.createPurse(100, expectAsync1((purse) {
           _checkBalance(purse, 100);
-          purse.sproutPurse(expectAsync((PurseWrapper sprouted) {
+          purse.sproutPurse(expectAsync1((sprouted) {
             _checkBalance(sprouted, 0);
             _checkBalance(purse, 100);
 
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 01b0058..a709997 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -14,13 +14,7 @@
 async/slow_consumer2_test: RuntimeError
 async/stream_distinct_test: RuntimeError
 async/timer_not_available_test: RuntimeError
-isolate/issue_21398_parent_isolate1_test: RuntimeError
-isolate/issue_22778_test: Crash
-isolate/kill_self_synchronously_test: RuntimeError
-isolate/message_test: RuntimeError
-isolate/mint_maker_test: RuntimeError
 isolate/ping_pause_test: Skip # Timeout
-isolate/spawn_function_custom_class_test: Skip # Timeout
 
 [ $compiler == fasta ]
 html/*: Skip # TODO(ahe): Make dart:html available.
@@ -29,16 +23,12 @@
 
 [ $fasta ]
 async/future_or_type_test: CompileTimeError # Issue 34626
-mirrors/deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
 mirrors/generic_f_bounded_mixin_application_test: CompileTimeError # Issue 34613
 mirrors/metadata_allowed_values_test/13: MissingCompileTimeError
 mirrors/metadata_allowed_values_test/14: MissingCompileTimeError
 mirrors/redirecting_factory_test/01: CompileTimeError # Issue 34714
 mirrors/redirecting_factory_test/none: CompileTimeError # Issue 34714
 
-[ $arch == simarm64 && $strong && ($compiler == dartk || $compiler == dartkb) ]
-isolate/mint_maker_test: Timeout # Please triage.
-
 [ $arch == simdbc64 && $mode == debug && $runtime == vm && $strong && ($compiler == dartk || $compiler == dartkb) ]
 isolate/isolate_complex_messages_test: Crash # http://dartbug.com/33128
 
@@ -55,7 +45,8 @@
 mirrors/invocation_fuzz_test: Skip # Because it times out, issue 29439.
 
 [ $arch == x64 && ($hot_reload || $hot_reload_rollback) ]
-isolate/int32_length_overflow_test: Timeout  # Issue 35733
+convert/base64_test/01: Pass, Crash # http://dartbug.com/35948
+isolate/int32_length_overflow_test: Timeout # Issue 35733
 
 [ $builder_tag == obfuscated && $compiler == dartkp ]
 collection/list_test: RuntimeError # Issue 34911
@@ -68,9 +59,6 @@
 mirrors/invocation_fuzz_test/smi: Crash, RuntimeError, Fail, Pass # Crashes on opt counter builder (#31838)
 mirrors/invocation_fuzz_test/string: Pass, Crash, RuntimeError # Flaky on vm-kernel-optcounter-threshold-linux-release-x64, bug #31838
 
-[ $compiler == app_jitk && $mode == product ]
-isolate/spawn_function_custom_class_test: Skip # Timeout
-
 [ $compiler == app_jitk && ($mode == product || $mode == release) ]
 isolate/spawn_uri_nested_vm_test: Skip # Timeout, Issue 33385
 
@@ -103,11 +91,7 @@
 isolate/deferred_in_isolate2_test: Skip # Times out. Deferred loading kernel issue 28335.
 isolate/deferred_in_isolate_test: Skip # Times out. Deferred loading kernel issue 28335.
 isolate/issue_21398_parent_isolate2_test/01: Skip # Times out. Deferred loading kernel issue 28335.
-isolate/issue_22778_test: Crash
-isolate/kill_self_synchronously_test: RuntimeError
-isolate/ping_pause_test: Crash
 isolate/ping_pause_test: Pass, Timeout
-isolate/spawn_function_custom_class_test: Pass, Timeout
 isolate/spawn_uri_nested_vm_test: Pass, Timeout
 mirrors/*: SkipByDesign # Mirrors are not supported in AOT mode.
 
@@ -142,12 +126,8 @@
 html/*: SkipByDesign # dart:html not supported on VM.
 isolate/deferred_in_isolate2_test: Skip # Times out. Deferred loading kernel issue 28335.
 isolate/deferred_in_isolate_test: Skip # Times out. Deferred loading kernel issue 28335.
-isolate/issue_21398_parent_isolate1_test: RuntimeError, Crash # Issue 31402 (List literal), Issue 35374.
 isolate/issue_21398_parent_isolate2_test/01: Skip # Times out. Deferred loading kernel issue 28335.
-isolate/message_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/mint_maker_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/ping_pause_test: Pass, Timeout
-isolate/spawn_function_custom_class_test: Pass, Crash, Timeout # Crashes with --no-enable-malloc-hooks vm option
 isolate/spawn_uri_nested_vm_test: Pass, Timeout
 isolate/static_function_test: Skip # Times out. Issue 31855. CompileTimeError. Issue 31402
 mirrors/apply3_test: RuntimeError
@@ -232,9 +212,6 @@
 mirrors/typedef_test: RuntimeError
 mirrors/typevariable_mirror_metadata_test: RuntimeError
 
-[ $system == windows && ($compiler == dartk || $compiler == dartkb) ]
-isolate/ping_pause_test: Skip # Issues 32137 and 32138
-
 [ $fasta && !$strong ]
 isolate/isolate_import_test/01: MissingCompileTimeError
 isolate/isolate_stress_test: CompileTimeError
@@ -254,9 +231,6 @@
 typed_data/int32x4_static_test/01: MissingCompileTimeError
 typed_data/int32x4_static_test/02: MissingCompileTimeError
 
-[ $hot_reload && ($compiler == dartk || $compiler == dartkb) ]
-isolate/issue_6610_test: RuntimeError, Crash # Sources are looked up on every reload request.
-
 [ $hot_reload_rollback && ($compiler == dartk || $compiler == dartkb) ]
 isolate/illegal_msg_function_test: Skip # Timeout
 isolate/pause_test: Skip # Timeout
@@ -272,16 +246,11 @@
 [ $strong && ($compiler == dartk || $compiler == dartkb) ]
 async/slow_consumer2_test: RuntimeError # Issue 31402 (Invocation arguments)
 async/stream_distinct_test: RuntimeError
-isolate/issue_22778_test: Crash
-isolate/kill_self_synchronously_test: RuntimeError
-isolate/message_test: RuntimeError
-isolate/mint_maker_test: RuntimeError
 isolate/ping_pause_test: RuntimeError
 isolate/request_reply_test: Pass, Timeout
 isolate/stacktrace_message_test: RuntimeError
 mirrors/constructor_optional_args_test: RuntimeError
 mirrors/constructors_test: RuntimeError
-mirrors/deferred_constraints_constants_test/default_argument2: Pass
 mirrors/fake_function_with_call_test: RuntimeError
 mirrors/instance_members_easier_test: RuntimeError
 mirrors/instance_members_test: RuntimeError
@@ -308,3 +277,9 @@
 html/*: SkipByDesign
 isolate/browser/*: SkipByDesign
 js/*: SkipByDesign
+
+[ $compiler == dartk || $compiler == dartkb ]
+isolate/ping_pause_test: Skip # Issues 32137 and 32138
+
+[ $hot_reload || $hot_reload_rollback ]
+isolate/issue_6610_test: Skip # Sources are looked up on every reload request.
diff --git a/tests/lib_2/mirrors/regress_34982_test.dart b/tests/lib_2/mirrors/regress_34982_test.dart
new file mode 100644
index 0000000..184eb17
--- /dev/null
+++ b/tests/lib_2/mirrors/regress_34982_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for http://dartbug.com/34982
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+abstract class A {
+  int c();
+}
+
+class B implements A {
+  dynamic noSuchMethod(Invocation invocation) {}
+}
+
+void main() {
+  MethodMirror method1 = reflectClass(B).declarations[#c];
+  Expect.isTrue(method1.isSynthetic);
+
+  MethodMirror method2 = reflectClass(B).declarations[#noSuchMethod];
+  Expect.isFalse(method2.isSynthetic);
+
+  MethodMirror method3 = reflectClass(A).declarations[#c];
+  Expect.isFalse(method3.isSynthetic);
+}
diff --git a/tests/lib_2/typed_data/native_interceptor_no_own_method_to_intercept_test.dart b/tests/lib_2/typed_data/native_interceptor_no_own_method_to_intercept_test.dart
index 4b5d31c..6828d6a 100644
--- a/tests/lib_2/typed_data/native_interceptor_no_own_method_to_intercept_test.dart
+++ b/tests/lib_2/typed_data/native_interceptor_no_own_method_to_intercept_test.dart
@@ -5,7 +5,7 @@
 import "package:expect/expect.dart";
 import 'dart:typed_data';
 
-@NoInline()
+@pragma('dart2js:noInline')
 use(s) => s;
 
 main() {
diff --git a/tests/lib_2/typed_data/typed_data_list_test.dart b/tests/lib_2/typed_data/typed_data_list_test.dart
index 09fb066..890f274 100644
--- a/tests/lib_2/typed_data/typed_data_list_test.dart
+++ b/tests/lib_2/typed_data/typed_data_list_test.dart
@@ -5,8 +5,8 @@
 import 'dart:typed_data';
 import 'package:expect/expect.dart';
 
-@AssumeDynamic()
-@NoInline()
+@pragma('dart2js:assumeDynamic')
+@pragma('dart2js:noInline')
 confuse(x) => x;
 
 void testListFunctions<T extends num>(
diff --git a/tests/standalone_2/io/entrypoints_verification_test.dart b/tests/standalone_2/entrypoints_verification_test.dart
similarity index 81%
rename from tests/standalone_2/io/entrypoints_verification_test.dart
rename to tests/standalone_2/entrypoints_verification_test.dart
index cf12ac1..048f1f3 100644
--- a/tests/standalone_2/io/entrypoints_verification_test.dart
+++ b/tests/standalone_2/entrypoints_verification_test.dart
@@ -37,11 +37,23 @@
   @pragma("vm:entry-point")
   void fn1() {}
 
+  @pragma("vm:entry-point", "get")
+  void fn1_get() {}
+
+  @pragma("vm:entry-point", "call")
+  void fn1_call() {}
+
   static void fn2() {}
 
   @pragma("vm:entry-point")
   static void fn3() {}
 
+  @pragma("vm:entry-point", "call")
+  static void fn3_call() {}
+
+  @pragma("vm:entry-point", "get")
+  static void fn3_get() {}
+
   void Function() fld0;
 
   @pragma("vm:entry-point")
@@ -59,6 +71,12 @@
 @pragma("vm:entry-point")
 void fn1() {}
 
+@pragma("vm:entry-point", "get")
+void fn1_get() {}
+
+@pragma("vm:entry-point", "call")
+void fn1_call() {}
+
 class E extends D {
   E.ctor();
 }
diff --git a/tests/standalone_2/ffi/data_test.dart b/tests/standalone_2/ffi/data_test.dart
index 26edd6f..27a3790 100644
--- a/tests/standalone_2/ffi/data_test.dart
+++ b/tests/standalone_2/ffi/data_test.dart
@@ -404,6 +404,8 @@
   Expect.stringEquals(
       "Pointer<Int16>: address=0x", p.toString().substring(0, 26));
   p.free();
+  ffi.Pointer<ffi.Int64> p2 = ffi.fromAddress(0x123abc);
+  Expect.stringEquals("Pointer<Int64>: address=0x123abc", p2.toString());
 }
 
 void testEquality() {
diff --git a/tests/standalone_2/ffi/dylib_utils.dart b/tests/standalone_2/ffi/dylib_utils.dart
new file mode 100644
index 0000000..1929961
--- /dev/null
+++ b/tests/standalone_2/ffi/dylib_utils.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:ffi' as ffi;
+import 'dart:io' show Platform;
+
+String _platformPath(String name, {String path}) {
+  if (path == null) path = "";
+  if (Platform.isLinux) return path + "lib" + name + ".so";
+  if (Platform.isMacOS) return path + "lib" + name + ".dylib";
+  throw Exception("Platform not implemented");
+}
+
+ffi.DynamicLibrary dlopenPlatformSpecific(String name, {String path}) {
+  String fullPath = _platformPath(name, path: path);
+  return ffi.DynamicLibrary.open(fullPath);
+}
diff --git a/tests/standalone_2/ffi/dynamic_library_test.dart b/tests/standalone_2/ffi/dynamic_library_test.dart
index 1c3c45d..0a38e9a 100644
--- a/tests/standalone_2/ffi/dynamic_library_test.dart
+++ b/tests/standalone_2/ffi/dynamic_library_test.dart
@@ -8,6 +8,8 @@
 
 import 'dart:ffi' as ffi;
 
+import 'dylib_utils.dart';
+
 import 'package:expect/expect.dart';
 
 void main() {
@@ -20,13 +22,13 @@
 }
 
 void testOpen() {
-  ffi.DynamicLibrary l = ffi.DynamicLibrary.open("ffi_test_dynamic_library");
+  ffi.DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
   Expect.notEquals(null, l);
 }
 
 void testOpenError() {
   Expect.throws(
-      () => ffi.DynamicLibrary.open("doesnotexistforsurelibrary123409876"));
+      () => dlopenPlatformSpecific("doesnotexistforsurelibrary123409876"));
 }
 
 typedef NativeDoubleUnOp = ffi.Double Function(ffi.Double);
@@ -34,30 +36,30 @@
 typedef DoubleUnOp = double Function(double);
 
 void testLookup() {
-  ffi.DynamicLibrary l = ffi.DynamicLibrary.open("ffi_test_dynamic_library");
+  ffi.DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
   var timesFour = l.lookupFunction<NativeDoubleUnOp, DoubleUnOp>("timesFour");
   Expect.approxEquals(12.0, timesFour(3));
 }
 
 void testLookupError() {
-  ffi.DynamicLibrary l = ffi.DynamicLibrary.open("ffi_test_dynamic_library");
+  ffi.DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
   Expect.throws(() => l.lookupFunction<NativeDoubleUnOp, DoubleUnOp>(
       "functionnamethatdoesnotexistforsure749237593845"));
 }
 
 void testToString() {
-  ffi.DynamicLibrary l = ffi.DynamicLibrary.open("ffi_test_dynamic_library");
+  ffi.DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
   Expect.stringEquals(
       "DynamicLibrary: handle=0x", l.toString().substring(0, 25));
 }
 
 void testEquality() {
-  ffi.DynamicLibrary l = ffi.DynamicLibrary.open("ffi_test_dynamic_library");
-  ffi.DynamicLibrary l2 = ffi.DynamicLibrary.open("ffi_test_dynamic_library");
+  ffi.DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
+  ffi.DynamicLibrary l2 = dlopenPlatformSpecific("ffi_test_dynamic_library");
   Expect.equals(l, l2);
   Expect.equals(l.hashCode, l2.hashCode);
   Expect.notEquals(l, null);
   Expect.notEquals(null, l);
-  ffi.DynamicLibrary l3 = ffi.DynamicLibrary.open("ffi_test_functions");
+  ffi.DynamicLibrary l3 = dlopenPlatformSpecific("ffi_test_functions");
   Expect.notEquals(l, l3);
 }
diff --git a/tests/standalone_2/ffi/enable_ffi_test.dart b/tests/standalone_2/ffi/enable_ffi_test.dart
index 5396312..ebe1b9b 100644
--- a/tests/standalone_2/ffi/enable_ffi_test.dart
+++ b/tests/standalone_2/ffi/enable_ffi_test.dart
@@ -8,13 +8,13 @@
 
 library FfiTest;
 
-import 'dart:ffi' as ffi;
+import 'dart:ffi' as ffi; //# 01: compile-time error
 
 import "package:expect/expect.dart";
 
 void main() {
-  ffi.Pointer<ffi.Int64> p = ffi.allocate();
-  p.store(42);
-  Expect.equals(42, p.load<int>());
-  p.free();
+  ffi.Pointer<ffi.Int64> p = ffi.allocate(); //# 01: compile-time error
+  p.store(42); //# 01: compile-time error
+  Expect.equals(42, p.load<int>()); //# 01: compile-time error
+  p.free(); //# 01: compile-time error
 }
diff --git a/tests/standalone_2/ffi/function_callbacks_test.dart b/tests/standalone_2/ffi/function_callbacks_test.dart
index 2f3212b..9817182 100644
--- a/tests/standalone_2/ffi/function_callbacks_test.dart
+++ b/tests/standalone_2/ffi/function_callbacks_test.dart
@@ -8,6 +8,8 @@
 
 import 'dart:ffi' as ffi;
 
+import 'dylib_utils.dart';
+
 import "package:expect/expect.dart";
 
 import 'coordinate.dart';
@@ -24,7 +26,7 @@
 }
 
 ffi.DynamicLibrary ffiTestFunctions =
-    ffi.DynamicLibrary.open("ffi_test_functions");
+    dlopenPlatformSpecific("ffi_test_functions");
 
 /// pass a pointer to a c function as an argument to a c function
 void testFunctionWithFunctionPointer() {
diff --git a/tests/standalone_2/ffi/function_stress_test.dart b/tests/standalone_2/ffi/function_stress_test.dart
new file mode 100644
index 0000000..2f5f02c
--- /dev/null
+++ b/tests/standalone_2/ffi/function_stress_test.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Dart test program for stress-testing boxing and GC.
+// VMOptions=--deterministic --optimization-counter-threshold=500 --verbose-gc
+// VMOptions=--deterministic --optimization-counter-threshold=-1 --verbose-gc
+//
+// NOTE: This test does not produce useful stderr when it fails because the
+// stderr is redirected to a file for reflection.
+
+import 'dart:ffi' as ffi;
+import 'dylib_utils.dart';
+import "package:expect/expect.dart";
+import 'gc_helper.dart';
+
+test(GCWatcher watcher, void Function() testee,
+    {bool mustTriggerGC: true}) async {
+  // Warmup.
+  for (int i = 0; i < 1000; ++i) {
+    testee();
+  }
+  int size = await watcher.size();
+  for (int i = 0; i < 1000000; ++i) {
+    testee();
+  }
+  int new_size = await watcher.size();
+  if (mustTriggerGC) {
+    print("Expect $new_size > $size.");
+    Expect.isTrue(new_size > size);
+  }
+}
+
+main() async {
+  final watcher = GCWatcher();
+  try {
+    await test(watcher, testBoxInt64);
+    // On 64-bit platforms this won't trigger GC because the result fits into a
+    // Smi.
+    await test(watcher, testBoxInt32, mustTriggerGC: false);
+    await test(watcher, testBoxDouble);
+    await test(watcher, testBoxPointer);
+  } finally {
+    watcher.dispose();
+  }
+}
+
+ffi.DynamicLibrary ffiTestFunctions =
+    dlopenPlatformSpecific("ffi_test_functions");
+
+typedef NativeNullaryOp64 = ffi.Int64 Function();
+typedef NativeNullaryOp32 = ffi.Int32 Function();
+typedef NativeNullaryOpDouble = ffi.Double Function();
+typedef NativeNullaryOpPtr = ffi.Pointer<ffi.Void> Function();
+typedef NullaryOp = int Function();
+typedef NullaryOpDbl = double Function();
+typedef NullaryOpPtr = ffi.Pointer<ffi.Void> Function();
+
+final minInt64 =
+    ffiTestFunctions.lookupFunction<NativeNullaryOp64, NullaryOp>("MinInt64");
+
+void testBoxInt64() {
+  Expect.equals(0x8000000000000000, minInt64());
+}
+
+NullaryOp minInt32 =
+    ffiTestFunctions.lookupFunction<NativeNullaryOp32, NullaryOp>("MinInt32");
+
+void testBoxInt32() {
+  Expect.equals(0x80000000, minInt32());
+}
+
+final smallDouble = ffiTestFunctions
+    .lookupFunction<NativeNullaryOpDouble, NullaryOpDbl>("SmallDouble");
+
+void testBoxDouble() {
+  Expect.equals(0x80000000 * -1.0, smallDouble());
+}
+
+final smallPointer = ffiTestFunctions
+    .lookupFunction<NativeNullaryOpPtr, NullaryOpPtr>("SmallPointer");
+
+void testBoxPointer() {
+  Expect.equals(-0x80000000, smallPointer().address);
+}
diff --git a/tests/standalone_2/ffi/function_structs_test.dart b/tests/standalone_2/ffi/function_structs_test.dart
index 6f74a90..ce7bd11 100644
--- a/tests/standalone_2/ffi/function_structs_test.dart
+++ b/tests/standalone_2/ffi/function_structs_test.dart
@@ -9,6 +9,8 @@
 
 import 'dart:ffi' as ffi;
 
+import 'dylib_utils.dart';
+
 import "package:expect/expect.dart";
 
 import 'coordinate.dart';
@@ -23,7 +25,7 @@
 }
 
 ffi.DynamicLibrary ffiTestFunctions =
-    ffi.DynamicLibrary.open("ffi_test_functions");
+    dlopenPlatformSpecific("ffi_test_functions");
 
 /// pass a struct to a c function and get a struct as return value
 void testFunctionWithStruct() {
diff --git a/tests/standalone_2/ffi/function_test.dart b/tests/standalone_2/ffi/function_test.dart
index bed0264..c2019f7 100644
--- a/tests/standalone_2/ffi/function_test.dart
+++ b/tests/standalone_2/ffi/function_test.dart
@@ -8,6 +8,8 @@
 
 import 'dart:ffi' as ffi;
 
+import 'dylib_utils.dart';
+
 import "package:expect/expect.dart";
 
 void main() {
@@ -26,10 +28,12 @@
   testNullManyArgs();
   testNullPointers();
   testFloatRounding();
+  testVoidReturn();
+  testNoArgs();
 }
 
 ffi.DynamicLibrary ffiTestFunctions =
-    ffi.DynamicLibrary.open("ffi_test_functions");
+    dlopenPlatformSpecific("ffi_test_functions");
 
 typedef NativeBinaryOp = ffi.Int32 Function(ffi.Int32, ffi.Int32);
 typedef UnaryOp = int Function(int);
@@ -282,3 +286,28 @@
 
   p2.free();
 }
+
+typedef NativeFloatToVoid = ffi.Void Function(ffi.Float);
+typedef DoubleToVoid = void Function(double);
+
+void testVoidReturn() {
+  DoubleToVoid devNullFloat = ffiTestFunctions
+      .lookupFunction<NativeFloatToVoid, DoubleToVoid>("DevNullFloat");
+
+  devNullFloat(1337.0);
+
+  dynamic loseSignature = devNullFloat;
+  dynamic result = loseSignature(1337.0);
+  Expect.isNull(result);
+}
+
+typedef NativeVoidToFloat = ffi.Float Function();
+typedef VoidToDouble = double Function();
+
+void testNoArgs() {
+  VoidToDouble inventFloatValue = ffiTestFunctions
+      .lookupFunction<NativeVoidToFloat, VoidToDouble>("InventFloatValue");
+
+  double result = inventFloatValue();
+  Expect.approxEquals(1337.0, result);
+}
diff --git a/tests/standalone_2/ffi/gc_helper.dart b/tests/standalone_2/ffi/gc_helper.dart
new file mode 100644
index 0000000..084a0ce
--- /dev/null
+++ b/tests/standalone_2/ffi/gc_helper.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'dart:convert';
+import 'dylib_utils.dart';
+import 'dart:ffi';
+
+DynamicLibrary ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
+
+// Requires --verbose-gc.
+class GCWatcher {
+  int _suffix;
+
+  Future<int> size() async {
+    return await File("/tmp/captured_stderr_$_suffix").length();
+  }
+
+  GCWatcher() {
+    print("Starting...");
+    _suffix = ffiTestFunctions
+        .lookupFunction<Int32 Function(), int Function()>("RedirectStderr")();
+  }
+
+  dispose() => File("/tmp/captured_stderr_$_suffix").deleteSync();
+}
diff --git a/tests/standalone_2/ffi/negative_function_test.dart b/tests/standalone_2/ffi/negative_function_test.dart
new file mode 100644
index 0000000..f716ca5
--- /dev/null
+++ b/tests/standalone_2/ffi/negative_function_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Dart test program for testing error handling with dart:ffi functions.
+
+import 'dart:ffi' as ffi;
+import 'dylib_utils.dart';
+import "package:expect/expect.dart";
+
+main() {
+  testWrongArity();
+  testWrongTypes();
+}
+
+ffi.DynamicLibrary ffiTestFunctions =
+    dlopenPlatformSpecific("ffi_test_functions");
+
+typedef NativeBinaryOp = ffi.Int32 Function(ffi.Int32, ffi.Int32);
+typedef BinaryOp = int Function(int, int);
+
+typedef NativeUnaryOp = ffi.Int64 Function(ffi.Int64);
+typedef UnaryOp = int Function(int);
+
+void testWrongArity() {
+  {
+    dynamic sumPlus42 =
+        ffiTestFunctions.lookupFunction<NativeBinaryOp, BinaryOp>("SumPlus42");
+    Expect.throwsNoSuchMethodError(() => sumPlus42(10));
+    Expect.throwsNoSuchMethodError(() => sumPlus42(10, 11, 12));
+    Expect.throwsNoSuchMethodError(() => sumPlus42(10, 11, 12, y: 13));
+  }
+
+  {
+    Function sumPlus42 =
+        ffiTestFunctions.lookupFunction<NativeBinaryOp, BinaryOp>("SumPlus42");
+    Expect.throwsNoSuchMethodError(() => sumPlus42(10));
+    Expect.throwsNoSuchMethodError(() => sumPlus42(10, 11, 12));
+    Expect.throwsNoSuchMethodError(() => sumPlus42(10, 11, 12, y: 13));
+  }
+}
+
+void testWrongTypes() {
+  {
+    dynamic sumPlus42 =
+        ffiTestFunctions.lookupFunction<NativeBinaryOp, BinaryOp>("SumPlus42");
+    Expect.throwsNoSuchMethodError(() => sumPlus42("abc", "def"));
+  }
+
+  {
+    Function sumPlus42 =
+        ffiTestFunctions.lookupFunction<NativeBinaryOp, BinaryOp>("SumPlus42");
+    Expect.throwsNoSuchMethodError(() => sumPlus42("abc", "def"));
+  }
+
+  {
+    dynamic pointerOp = ffiTestFunctions
+        .lookupFunction<NativeUnaryOp, UnaryOp>("Assign1337Index1");
+    Expect.throwsNoSuchMethodError(() => pointerOp(0));
+  }
+}
diff --git a/tests/standalone_2/ffi/static_checks_test.dart b/tests/standalone_2/ffi/static_checks_test.dart
index 422fc6f..15e162a 100644
--- a/tests/standalone_2/ffi/static_checks_test.dart
+++ b/tests/standalone_2/ffi/static_checks_test.dart
@@ -8,6 +8,8 @@
 
 import 'dart:ffi' as ffi;
 
+import 'dylib_utils.dart';
+
 void main() {
   testGetGeneric();
   testGetGeneric2();
@@ -245,7 +247,7 @@
 
 void testLookupFunctionGeneric() {
   Function generic<T extends Function>() {
-    ffi.DynamicLibrary l = ffi.DynamicLibrary.open("ffi_test_dynamic_library");
+    ffi.DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
     Function result;
     result = l.lookupFunction<T, DoubleUnOp>("cos"); //# 15: compile-time error
     return result;
@@ -256,7 +258,7 @@
 
 void testLookupFunctionGeneric2() {
   Function generic<T extends Function>() {
-    ffi.DynamicLibrary l = ffi.DynamicLibrary.open("ffi_test_dynamic_library");
+    ffi.DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
     Function result;
     result = //# 16: compile-time error
         l.lookupFunction<NativeDoubleUnOp, T>("cos"); //# 16: compile-time error
@@ -267,12 +269,12 @@
 }
 
 void testLookupFunctionWrongNativeFunctionSignature() {
-  ffi.DynamicLibrary l = ffi.DynamicLibrary.open("ffi_test_dynamic_library");
+  ffi.DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
   l.lookupFunction<IntUnOp, IntUnOp>("cos"); //# 17: compile-time error
 }
 
 void testLookupFunctionTypeMismatch() {
-  ffi.DynamicLibrary l = ffi.DynamicLibrary.open("ffi_test_dynamic_library");
+  ffi.DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
   l.lookupFunction<NativeDoubleUnOp, IntUnOp>("cos"); //# 18: compile-time error
 }
 
diff --git a/tests/standalone_2/ffi/subtype_test.dart b/tests/standalone_2/ffi/subtype_test.dart
index fd04b50..dd466ae 100644
--- a/tests/standalone_2/ffi/subtype_test.dart
+++ b/tests/standalone_2/ffi/subtype_test.dart
@@ -3,17 +3,50 @@
 // BSD-style license that can be found in the LICENSE file.
 //
 // Dart test program for testing dart:ffi Pointer subtypes.
+//
+// VMOptions=--verbose-gc
 
 library FfiTest;
 
+import 'dart:ffi' as ffi;
+
 import "package:expect/expect.dart";
 
+import 'gc_helper.dart';
 import 'cstring.dart';
 
-void main() {
+void main() async {
+  testAllocate();
+  testSizeOf();
+  await testGC();
+}
+
+class X {
+  X(this.i);
+  int i;
+}
+
+dynamic foo;
+dynamic bar;
+
+void testAllocate() {
   CString cs = CString.toUtf8("hello world!");
-
   Expect.equals("hello world!", cs.fromUtf8());
-
   cs.free();
 }
+
+Future<void> testGC() async {
+  CString cs = ffi.fromAddress<CString>(11);
+  bar = cs;
+  foo = "";
+  final watcher = GCWatcher();
+  int counts = await watcher.size();
+  for (int i = 0; i < 1000000; ++i) {
+    foo = new X(i);
+  }
+  Expect.isTrue(await watcher.size() > counts);
+}
+
+void testSizeOf() {
+  Expect.equals(true, 4 == ffi.sizeOf<CString>() || 8 == ffi.sizeOf<CString>());
+}
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 7b2cfd6..a68bdd7 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -39,8 +39,12 @@
 io/platform_resolved_executable_test/04: RuntimeError
 
 [ $compiler == dartkp ]
+io/arguments_test: Fail # Test harness passes runtime arguments to the compiler
 io/test_runner_test: SkipByDesign # Is not relevant for AOT.
 
+[ $system == android ]
+entrypoints_verification_test: Skip # Requires shared objects which the test script doesn't "adb push".
+
 [ $fasta ]
 deferred_transitive_import_error_test: CompileTimeError
 package/package1_test: CompileTimeError
@@ -222,10 +226,15 @@
 io/pipe_server_test: Skip # Timeout
 io/socket_close_test: Skip # Timeout
 io/socket_many_connections_test: Skip # Timeout
-io/test_extension_fail_test: RuntimeError
-io/test_extension_test: RuntimeError
 io/web_socket_compression_test: Skip # Timeout
 io/web_socket_test: Skip # Timeout
 
-[ $hot_reload || $hot_reload_rollback || $compiler != dartk && $compiler != dartkb ]
-io/entrypoints_verification_test: Skip # Test runs in JIT mode only
+[ $arch != x64 || $compiler != dartk || $mode == product || $system != linux && $system != macos]
+ffi/function_stress_test: SkipByDesign # FFI must be supported. Also requires --verbose-gc, which isn't included in product.
+ffi/subtype_test: SkipByDesign # FFI must be supported. Also requires --verbose-gc, which isn't included in product.
+
+[ $mode == product || $mode != product ]
+ffi/negative_function_test: Skip # Issues 36033, 36034
+
+[ $compiler != dartk && $compiler != dartkb && $compiler != dartkp || $compiler == dartkp && $system == windows ]
+entrypoints_verification_test: SkipByDesign # Requires VM to run. Cannot run in precompiled Windows because the DLL is linked against dart.exe instead of dart_precompiled_runtime.exe.
diff --git a/tests/standalone_2/standalone_2_vm.status b/tests/standalone_2/standalone_2_vm.status
index c59b66f..49b61dc 100644
--- a/tests/standalone_2/standalone_2_vm.status
+++ b/tests/standalone_2/standalone_2_vm.status
@@ -32,11 +32,9 @@
 ffi/function_test: Skip # https://github.com/dart-lang/sdk/issues/35934
 
 [ $runtime == dart_precompiled ]
-ffi: RuntimeError # https://github.com/dart-lang/sdk/issues/35765
-ffi/static_checks_test: Skip # https://github.com/dart-lang/sdk/issues/35765
+ffi: Skip # https://github.com/dart-lang/sdk/issues/35765
 
 [ $runtime == vm ]
-ffi/enable_ffi_test: Fail # test designed to fail: --enable-ffi=false with import dart:ffi
 io/test_runner_test: Skip # Spawns a process which runs in Dart2 mode.
 
 [ $system == android ]
diff --git a/tools/VERSION b/tools/VERSION
index 0226fc7..5df95eb 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -23,9 +23,17 @@
 #  * Making cherry-picks to stable channel
 #     - increase PATCH by 1
 #
+#  * Making a change to the ABI:
+#     - increase ABI_VERSION by 1
+#
+#  * Deprecating an old ABI version:
+#     - increase OLDEST_SUPPORTED_ABI_VERSION to the version that is supported.
+#
 CHANNEL dev
 MAJOR 2
 MINOR 2
 PATCH 1
-PRERELEASE 0
+PRERELEASE 1
 PRERELEASE_PATCH 0
+ABI_VERSION 0
+OLDEST_SUPPORTED_ABI_VERSION 0
diff --git a/tools/approve_results.dart b/tools/approve_results.dart
index 4962072..2279db2 100755
--- a/tools/approve_results.dart
+++ b/tools/approve_results.dart
@@ -94,6 +94,22 @@
   return contents;
 }
 
+/// TODO(https://github.com/dart-lang/sdk/issues/36015): The step name changed
+/// incompatibly, allow both temporarily to reduce the user breakage. Remove
+/// this 2019-03-25.
+Future<String> todoFallbackLoadLog(
+    String id, String primary, String secondary) async {
+  try {
+    return await loadLog(id, primary);
+  } catch (e) {
+    if (e.toString().startsWith("Exception: The log at ") &&
+        e.toString().endsWith(" doesn't exist")) {
+      return await loadLog(id, secondary);
+    }
+    rethrow;
+  }
+}
+
 /// Loads the results from the bot.
 Future<List<Test>> loadResultsFromBot(String bot, ArgResults options,
     Map<String, dynamic> changelistBuild) async {
@@ -106,8 +122,14 @@
     // The 'latest' file contains the name of the latest build that we
     // should download. When preapproving a changelist, we instead find out
     // which build the commit queue was rebased on.
+    /// TODO(https://github.com/dart-lang/sdk/issues/36015): The step name
+    /// changed incompatibly, allow both temporarily to reduce the user
+    /// breakage. Remove this 2019-03-25.
     final build = (changelistBuild != null
-            ? await loadLog(changelistBuild["id"],
+            ? await todoFallbackLoadLog(
+                changelistBuild["id"],
+                "download_previous_results/0/steps/gsutil_find_latest_build/0/logs/"
+                "raw_io.output_text_latest_/0",
                 "gsutil_find_latest_build/0/logs/raw_io.output_text_latest_/0")
             : await readFile(bot, "latest"))
         .trim();
@@ -269,6 +291,8 @@
 List tests whose results are different from the previously approved results, and
 ask whether to update the currently approved results, turning the bots green.
 
+See the documentation at https://goto.google.com/dart-status-file-free-workflow
+
 The options are as follows:
 
 ${parser.usage}""");
diff --git a/tools/bots/extend_results.dart b/tools/bots/extend_results.dart
new file mode 100644
index 0000000..ac69dd9
--- /dev/null
+++ b/tools/bots/extend_results.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Add fields with data about the test run and the commit tested, and
+// with the result on the last build tested, to the test results file.
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'results.dart';
+
+main(List<String> args) async {
+  final resultsPath = args[0];
+  final priorResultsPath = args[1];
+  final flakyPath = args[2];
+  final priorFlakyPath = args[3];
+  final builderName = args[4];
+  final buildNumber = args[5];
+  final commitTime = int.parse(args[6]);
+  final commitHash = args[7];
+  final newResultsPath = args[8];
+  // Load the input and the flakiness data if specified.
+  final results = await loadResultsMap(resultsPath);
+  final priorResults = await loadResultsMap(priorResultsPath);
+  final flakes = await loadResultsMap(flakyPath);
+  final priorFlakes = await loadResultsMap(priorFlakyPath);
+
+  for (final String key in results.keys) {
+    final Map<String, dynamic> result = results[key];
+    final Map<String, dynamic> priorResult = priorResults[key];
+    final Map<String, dynamic> flaky = flakes[key];
+    final Map<String, dynamic> priorFlaky = priorFlakes[key];
+    result['commit_hash'] = commitHash;
+    result['commit_time'] = commitTime;
+    result['build_number'] = buildNumber;
+    result['builder_name'] = builderName;
+    result['flaky'] = (flaky != null);
+    result['previous_flaky'] = (priorFlaky != null);
+    if (priorResult != null) {
+      result['previous_result'] = priorResult['result'];
+      result['previous_commit_hash'] = priorResult['commit_hash'];
+      result['previous_commit_time'] = priorResult['commit_time'];
+      result['previous_build_number'] = priorResult['build_number'];
+    }
+    result['changed'] = (result['result'] != result['previous_result'] ||
+        result['flaky'] != result['previous_flaky']);
+  }
+  final sink = new File(newResultsPath).openWrite();
+  final sorted = results.keys.toList()..sort();
+  for (final key in sorted) {
+    sink.writeln(jsonEncode(results[key]));
+  }
+  sink.close();
+}
diff --git a/tools/bots/results.dart b/tools/bots/results.dart
index 549cafe..65ae36f 100644
--- a/tools/bots/results.dart
+++ b/tools/bots/results.dart
@@ -30,10 +30,16 @@
         processResult.stderr.contains("One or more URLs matched no objects")) {
       return null;
     }
-    throw new Exception("Failed to run: python $gsutilPy $arguments\n"
+    String error = "Failed to run: python $gsutilPy $arguments\n"
         "exitCode: ${processResult.exitCode}\n"
         "stdout:\n${processResult.stdout}\n"
-        "stderr:\n${processResult.stderr}");
+        "stderr:\n${processResult.stderr}";
+    if (processResult.exitCode == 1 &&
+        processResult.stderr.contains("401 Anonymous caller")) {
+      error =
+          "\n\nYou need to authenticate by running:\npython $gsutilPy config\n";
+    }
+    throw new Exception(error);
   }
   return processResult.stdout;
 }
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 863c5af..4efcdb6 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -3,6 +3,10 @@
     "chrome": "65",
     "firefox": "61"
   },
+  "branches": [
+    "analyzer-stable",
+    "master"
+  ],
   "filesets": {
     "analyzer_unit_tests": [
       ".packages",
@@ -749,7 +753,9 @@
         {
           "name": "vm tests",
           "arguments": [
-            "-napp_jitk-linux-${mode}-x64"]
+            "-napp_jitk-linux-${mode}-x64"],
+          "shards": 6,
+          "fileset": "vm-kernel"
         }
       ]
     },
@@ -1250,6 +1256,15 @@
           "arguments": [ "api_docs" ],
           "environment": {"BUILDBOT_BUILDERNAME": "dart-sdk-linux"}
 
+        },
+        {
+          "name": "upload abi dills",
+          "script": "tools/upload_abi_dills.sh",
+          "arguments": [
+            "tools/VERSION",
+            "out/ReleaseX64"
+          ],
+          "environment": {"BUILDBOT_BUILDERNAME": "dart-sdk-linux"}
         }
       ]
     },
diff --git a/tools/bots/update_flakiness.dart b/tools/bots/update_flakiness.dart
index c1572e7..abf1aa8 100755
--- a/tools/bots/update_flakiness.dart
+++ b/tools/bots/update_flakiness.dart
@@ -50,6 +50,7 @@
       final Map<String, dynamic> testData = data.putIfAbsent(key, newMap);
       testData["configuration"] = configuration;
       testData["name"] = name;
+      testData["expected"] = resultObject["expected"];
       final outcomes = testData.putIfAbsent("outcomes", () => []);
       final time = DateTime.now().toIso8601String();
       if (!outcomes.contains(result)) {
@@ -71,6 +72,15 @@
       firstSeen.putIfAbsent(result, () => time);
       final lastSeen = testData.putIfAbsent("last_seen", newMap);
       lastSeen[result] = time;
+      final matches = testData.putIfAbsent("matches", newMap);
+      // TODO: Temporarily fill in the matches field for all other outcomes.
+      // Remove this when all the builders have run at least once.
+      for (final outcome in occurrences.keys) {
+        matches[outcome] = resultObject["expected"] == "Fail"
+            ? ["Fail", "CompileTimeError", "RuntimeError"].contains(outcome)
+            : resultObject["expected"] == outcome;
+      }
+      matches[result] = resultObject["matches"];
 
       if (options["build-id"] != null) {
         final buildIds = testData.putIfAbsent("build_ids", newMap);
@@ -92,6 +102,11 @@
   for (final key in keys) {
     final testData = data[key];
     if (testData["outcomes"].length < 2) continue;
+    // TODO: Temporarily discard entries for old tests that don't run. Remove
+    // this when all the builders have run at least once.
+    if (!testData.containsKey("matches")) {
+      continue;
+    }
     // Forgive tests that have become deterministic again. If they flake less
     // than once in a 100 (p<1%), then if they flake again, the probability of
     // them getting past 5 runs of deflaking is 1%^5 = 0.00000001%.
diff --git a/tools/diff_results.dart b/tools/diff_results.dart
new file mode 100644
index 0000000..c0107d3
--- /dev/null
+++ b/tools/diff_results.dart
@@ -0,0 +1,401 @@
+#!/usr/bin/env dart
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:convert';
+
+import 'package:args/args.dart';
+import 'package:glob/glob.dart';
+
+final parser = ArgParser()
+  ..addMultiOption('bot',
+      abbr: 'b',
+      help: 'Select the bots matching the glob pattern [option is repeatable]',
+      splitCommas: false)
+  ..addFlag('verbose', abbr: 'v', help: 'Verbose output.', negatable: false)
+  ..addFlag('help', help: 'Show the program usage.', negatable: false);
+
+void printUsage() {
+  print("""
+Usage: ${Platform.executable} ${Platform.script} [OLDER_COMMIT] [NEWER_COMMIT]
+
+The options are as follows:
+
+${parser.usage}""");
+}
+
+bool verbose;
+
+main(List<String> args) async {
+  final options = parser.parse(args);
+  if (options["help"]) {
+    printUsage();
+    return;
+  }
+
+  final commits = options.rest;
+  if (commits.length < 2) {
+    print('Need to supply at least two commits.');
+    printUsage();
+    exitCode = 1;
+    return;
+  }
+  verbose = options['verbose'] ?? false;
+
+  final globs = List<Glob>.from(options["bot"].map((pattern) => Glob(pattern)));
+  final vmBuilders = loadVmBuildersFromTestMatrix(globs);
+
+  final futures = <Future<List<Result>>>[];
+  for (final commit in commits) {
+    final DateTime date = await getDateOfCommit(commit);
+    futures.add(getResults(commit, date, vmBuilders));
+  }
+
+  final results = await Future.wait(futures);
+  for (int i = 0; i < results.length - 1; i++) {
+    final commitB = commits[i];
+    final commitA = commits[i + 1];
+
+    print('\nResult changes between $commitB -> $commitA:');
+    final commonGroups =
+        buildCommonGroups(commitA, commitB, results[i], results[i + 1]);
+    for (final commonGroup in commonGroups) {
+      final builders = commonGroup.builders;
+
+      print('');
+      for (final group in commonGroup.groups) {
+        final diff = group.diffs.first;
+        print('${group.test} ${diff.before} -> ${diff.after}');
+      }
+      for (final b in extractBuilderPattern(builders)) {
+        print('   on $b');
+      }
+    }
+  }
+}
+
+Future<DateTime> getDateOfCommit(String commit) async {
+  final result = await Process.run(
+      'git', ['show', '-s', '--format=%cd', '--date=iso-strict', commit]);
+  if (result.exitCode != 0) {
+    print('Could not determine date of commit $commit. Git reported:\n');
+    print(result.stdout);
+    print(result.stderr);
+    exit(1);
+  }
+  return DateTime.parse(result.stdout.trim());
+}
+
+Future<List<Result>> getResults(
+    String commit, DateTime dateC, Set<String> builders) async {
+  final DateTime date0 = dateC.add(const Duration(hours: 24));
+  final DateTime date2 = dateC.subtract(const Duration(hours: 24));
+  final query = '''
+      SELECT commit_time, builder_name, build_number, name, result, expected FROM `dart-ci.results.results`
+      WHERE commit_hash="$commit"
+        AND matches=false
+        AND (_PARTITIONDATE = "${formatDate(date0)}" OR
+             _PARTITIONDATE = "${formatDate(dateC)}" OR
+             _PARTITIONDATE = "${formatDate(date2)}" )
+        AND (STARTS_WITH(builder_name, "vm-") OR
+             STARTS_WITH(builder_name, "app-") OR
+             STARTS_WITH(builder_name, "cross-"))
+        AND ((flaky is NULL) OR flaky=false)
+        ORDER BY name''';
+
+  final arguments = <String>[
+    'query',
+    '--format=prettyjson',
+    '--project_id=dart-ci',
+    '--nouse_legacy_sql',
+    '-n',
+    '1000000',
+    query,
+  ];
+  if (verbose) {
+    print('Executing query:\n    bq ${arguments.join(' ')}');
+  }
+
+  final result = await Process.run('bq', arguments);
+  if (result.exitCode == 0) {
+    File('$commit.json').writeAsStringSync(result.stdout);
+    final resultsForCommit = json.decode(result.stdout);
+
+    final results = <Result>[];
+    for (final Map<String, dynamic> result in resultsForCommit) {
+      final builderName = result['builder_name'];
+      if (!builders.contains(builderName)) {
+        continue;
+      }
+
+      final failure = Result(commit, builderName, result['build_number'],
+          result['name'], result['expected'], result['result']);
+      results.add(failure);
+    }
+
+    results.sort((Result a, Result b) {
+      final c = a.name.compareTo(b.name);
+      if (c != 0) return c;
+      return a.builderName.compareTo(b.builderName);
+    });
+
+    return results;
+  } else {
+    print('Running the following query failed:\nbq ${arguments.join(' ')}');
+    print('Exit code: ${result.exitCode}');
+    final stdout = result.stdout.trim();
+    if (stdout.length > 0) {
+      print('Stdout:\n$stdout');
+    }
+    final stderr = result.stderr.trim();
+    if (stderr.length > 0) {
+      print('Stderr:\n$stderr');
+    }
+    return <Result>[];
+  }
+}
+
+List<CommonGroup> buildCommonGroups(String commitA, String commitB,
+    List<Result> commitResults, List<Result> commitResultsBefore) {
+  // If a test has same outcome across many vm builders
+  final diffs = <Diff>[];
+  int i = 0;
+  int j = 0;
+  while (i < commitResultsBefore.length && j < commitResults.length) {
+    final a = commitResultsBefore[i];
+    final b = commitResults[j];
+
+    // Is a smaller than b, then we had a failure before and no longer one.
+    if (a.name.compareTo(b.name) < 0 ||
+        (a.name.compareTo(b.name) == 0 &&
+            a.builderName.compareTo(b.builderName) < 0)) {
+      diffs.add(Diff(a, null));
+      i++;
+      continue;
+    }
+
+    // Is b smaller than a, then we had no failure before but have one now.
+    if (b.name.compareTo(a.name) < 0 ||
+        (b.name.compareTo(a.name) == 0 &&
+            b.builderName.compareTo(a.builderName) < 0)) {
+      diffs.add(Diff(null, b));
+      j++;
+      continue;
+    }
+
+    // Else we must have the same name and builder.
+    if (a.name != b.name || a.builderName != b.builderName) throw 'BUG';
+
+    if (a.expected != b.expected || a.result != b.result) {
+      diffs.add(Diff(a, b));
+    }
+    i++;
+    j++;
+  }
+
+  while (i < commitResultsBefore.length) {
+    final a = commitResultsBefore[i++];
+    diffs.add(Diff(a, null));
+  }
+
+  while (j < commitResults.length) {
+    final b = commitResults[j++];
+    diffs.add(Diff(null, b));
+  }
+
+  // If a test has same outcome across many vm builders
+  final groups = <GroupedDiff>[];
+  int h = 0;
+  while (h < diffs.length) {
+    final d = diffs[h++];
+    final builders = Set<String>()..add(d.builder);
+    final gropupDiffs = <Diff>[d];
+
+    while (h < diffs.length) {
+      final nd = diffs[h];
+      if (d.test == nd.test) {
+        if (d.sameExpectationDifferenceAs(nd)) {
+          builders.add(nd.builder);
+          gropupDiffs.add(nd);
+          h++;
+          continue;
+        }
+      }
+      break;
+    }
+
+    groups.add(GroupedDiff(d.test, builders.toList()..sort(), gropupDiffs));
+  }
+
+  final commonGroups = <String, List<GroupedDiff>>{};
+  for (final group in groups) {
+    final key = group.builders.join(' ');
+    commonGroups.putIfAbsent(key, () => <GroupedDiff>[]).add(group);
+  }
+
+  final commonGroupList = commonGroups.values
+      .map((list) => CommonGroup(list.first.builders, list))
+      .toList();
+  commonGroupList
+      .sort((a, b) => a.builders.length.compareTo(b.builders.length));
+  return commonGroupList;
+}
+
+class CommonGroup {
+  final List<String> builders;
+  final List<GroupedDiff> groups;
+  CommonGroup(this.builders, this.groups);
+}
+
+class GroupedDiff {
+  final String test;
+  final List<String> builders;
+  final List<Diff> diffs;
+
+  GroupedDiff(this.test, this.builders, this.diffs);
+}
+
+class Diff {
+  final Result before;
+  final Result after;
+
+  Diff(this.before, this.after);
+
+  String get test => before?.name ?? after?.name;
+  String get builder => before?.builderName ?? after?.builderName;
+
+  bool sameExpectationDifferenceAs(Diff other) {
+    if ((before == null) != (other.before == null)) return false;
+    if ((after == null) != (other.after == null)) return false;
+
+    if (before != null) {
+      if (!before.sameResult(other.before)) return false;
+    }
+    if (after != null) {
+      if (!after.sameResult(other.after)) return false;
+    }
+    return true;
+  }
+}
+
+class Result {
+  final String commit;
+  final String builderName;
+  final String buildNumber;
+  final String name;
+  final String expected;
+  final String result;
+
+  Result(this.commit, this.builderName, this.buildNumber, this.name,
+      this.expected, this.result);
+
+  String toString() => '(expected: $expected, actual: $result)';
+
+  bool sameResult(Result other) {
+    return name == other.name &&
+        expected == other.expected &&
+        result == other.result;
+  }
+
+  bool equals(other) {
+    if (other is Result) {
+      if (name != other.name) return false;
+      if (builderName != other.builderName) return false;
+    }
+    return false;
+  }
+
+  int get hashCode => name.hashCode ^ builderName.hashCode;
+}
+
+String currentDate() {
+  final timestamp = DateTime.now().toUtc().toIso8601String();
+  return timestamp.substring(0, timestamp.indexOf('T'));
+}
+
+Set<String> loadVmBuildersFromTestMatrix(List<Glob> globs) {
+  final contents = File('tools/bots/test_matrix.json').readAsStringSync();
+  final testMatrix = json.decode(contents);
+
+  final vmBuilders = Set<String>();
+  for (final config in testMatrix['builder_configurations']) {
+    for (final builder in config['builders']) {
+      if (builder.startsWith('vm-') || builder.startsWith('app-')) {
+        vmBuilders.add(builder);
+      }
+    }
+  }
+
+  // This one is in the test_matrix.json but we don't run it on CI.
+  vmBuilders.remove('vm-kernel-asan-linux-release-ia32');
+
+  if (!globs.isEmpty) {
+    vmBuilders.removeWhere((String builder) {
+      return !globs.any((Glob glob) => glob.matches(builder));
+    });
+  }
+
+  return vmBuilders;
+}
+
+List<String> extractBuilderPattern(List<String> builders) {
+  final all = Set<String>.from(builders);
+
+  String reduce(String builder, List<String> posibilities) {
+    for (final pos in posibilities) {
+      if (builder.contains(pos)) {
+        final existing = <String>[];
+        final available = <String>[];
+        for (final pos2 in posibilities) {
+          final builder2 = builder.replaceFirst(pos, pos2);
+          if (all.contains(builder2)) {
+            existing.add(builder2);
+            available.add(pos2);
+          }
+        }
+        if (existing.length > 1) {
+          all.removeAll(existing);
+          final replacement =
+              builder.replaceFirst(pos, '{${available.join(',')}}');
+          all.add(replacement);
+          return replacement;
+        }
+      }
+    }
+    return builder;
+  }
+
+  for (String builder in builders) {
+    if (all.contains(builder)) {
+      builder = reduce(builder, const ['debug', 'release', 'product']);
+    }
+  }
+  for (String builder in all.toList()) {
+    if (all.contains(builder)) {
+      builder = reduce(builder, const ['mac', 'linux', 'win']);
+    }
+  }
+
+  for (String builder in all.toList()) {
+    if (all.contains(builder)) {
+      builder = reduce(builder, const [
+        'ia32',
+        'x64',
+        'simarm',
+        'simarm64',
+        'arm',
+        'arm64',
+        'simdbc64'
+      ]);
+    }
+  }
+  return all.toList()..sort();
+}
+
+String formatDate(DateTime date) {
+  final s = date.toIso8601String();
+  return s.substring(0, s.indexOf('T'));
+}
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index cb81c49..a5a92f1 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -157,7 +157,7 @@
     # addEventListener on the target, so we avoid
     'Event.currentTarget': [
       "@Creates('Null')",
-      "@Returns('EventTarget|=Object')",
+      "@Returns('EventTarget|=Object|Null')",
     ],
 
     # Only nodes in the DOM bubble and have target !== currentTarget.
@@ -324,7 +324,7 @@
 
     'MouseEvent.relatedTarget': [
       "@Creates('Node')",
-      "@Returns('EventTarget|=Object')",
+      "@Returns('EventTarget|=Object|Null')",
     ],
 
     'Notification.data': [
diff --git a/tools/dom/src/EventStreamProvider.dart b/tools/dom/src/EventStreamProvider.dart
index 1732c71..23fd771 100644
--- a/tools/dom/src/EventStreamProvider.dart
+++ b/tools/dom/src/EventStreamProvider.dart
@@ -141,7 +141,7 @@
 
   // TODO(9757): Inlining should be smart and inline only when inlining would
   // enable scalar replacement of an immediately allocated receiver.
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   StreamSubscription<T> listen(void onData(T event),
       {Function onError, void onDone(), bool cancelOnError}) {
     return new _EventStreamSubscription<T>(
diff --git a/tools/dom/src/dart2js_CssClassSet.dart b/tools/dom/src/dart2js_CssClassSet.dart
index 098d28f..5ae6795 100644
--- a/tools/dom/src/dart2js_CssClassSet.dart
+++ b/tools/dom/src/dart2js_CssClassSet.dart
@@ -140,7 +140,7 @@
     return value is String && _classListContains(_classListOf(_element), value);
   }
 
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   static bool _add(Element _element, String value) {
     DomTokenList list = _classListOf(_element);
     // Compute returned result independently of action upon the set.
@@ -149,7 +149,7 @@
     return added;
   }
 
-  @ForceInline()
+  @pragma('dart2js:tryInline')
   static bool _remove(Element _element, String value) {
     DomTokenList list = _classListOf(_element);
     bool removed = _classListContainsBeforeAddOrRemove(list, value);
diff --git a/tools/dom/templates/html/impl/impl_Document.darttemplate b/tools/dom/templates/html/impl/impl_Document.darttemplate
index 838507e..193a66e 100644
--- a/tools/dom/templates/html/impl/impl_Document.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Document.darttemplate
@@ -41,7 +41,7 @@
         registerElement2(tag, {'prototype': customElementClass, 'extends': extendsTag});
   }
 
-  @ForceInline() // Almost all call sites have one argument.
+  @pragma('dart2js:tryInline') // Almost all call sites have one argument.
   Element createElement(String tagName, [String typeExtension]) {
     return (typeExtension == null)
         ? _createElement_2(tagName)
diff --git a/tools/download_abi_dills.py b/tools/download_abi_dills.py
new file mode 100644
index 0000000..e45b2ce
--- /dev/null
+++ b/tools/download_abi_dills.py
@@ -0,0 +1,20 @@
+# Downloads dill files from CIPD for each supported ABI version.
+
+import subprocess
+import sys
+import utils
+
+
+def main():
+  abi_version = int(utils.GetAbiVersion())
+  oldest_abi_version = int(utils.GetOldestSupportedAbiVersion())
+  for i in xrange(oldest_abi_version, abi_version):
+    cmd = ['cipd', 'install', 'dart/abiversions/%d' % i, 'latest']
+    result = subprocess.call(cmd)
+    if result != 0:
+      return 1
+  return 0
+
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/tools/make_version.py b/tools/make_version.py
index 634586a..d63dfa8 100755
--- a/tools/make_version.py
+++ b/tools/make_version.py
@@ -77,6 +77,11 @@
     version_time = "Unknown timestamp"
   version_cc_text = version_cc_text.replace("{{COMMIT_TIME}}",
                                             version_time)
+  abi_version = utils.GetAbiVersion()
+  version_cc_text = version_cc_text.replace("{{ABI_VERSION}}", abi_version)
+  oldest_supported_abi_version = utils.GetOldestSupportedAbiVersion()
+  version_cc_text = version_cc_text.replace("{{OLDEST_SUPPORTED_ABI_VERSION}}",
+                                            oldest_supported_abi_version)
   snapshot_hash = MakeSnapshotHashString()
   version_cc_text = version_cc_text.replace("{{SNAPSHOT_HASH}}",
                                             snapshot_hash)
diff --git a/tools/patches/flutter-engine/760a9690c22ec3f3d163173737f9949f97e6e02a.patch b/tools/patches/flutter-engine/760a9690c22ec3f3d163173737f9949f97e6e02a.patch
deleted file mode 100644
index baa7cc7..0000000
--- a/tools/patches/flutter-engine/760a9690c22ec3f3d163173737f9949f97e6e02a.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-diff --git a/frontend_server/lib/server.dart b/frontend_server/lib/server.dart
-index 804c5699e..572087e9d 100644
---- a/frontend_server/lib/server.dart
-+++ b/frontend_server/lib/server.dart
-@@ -39,6 +39,11 @@ class _FlutterFrontendCompiler implements frontend.CompilerInterface{
-     _compiler.acceptLastDelta();
-   }
- 
-+  @override
-+  Future<Null> rejectLastDelta() async {
-+    return _compiler.rejectLastDelta();
-+  }
-+
-   @override
-   void invalidate(Uri uri) {
-     _compiler.invalidate(uri);
diff --git a/tools/patches/flutter-engine/b99bcfd3099f0d32e39287160a9539e878cb0b68.patch b/tools/patches/flutter-engine/b99bcfd3099f0d32e39287160a9539e878cb0b68.patch
deleted file mode 100644
index 840c4ac..0000000
--- a/tools/patches/flutter-engine/b99bcfd3099f0d32e39287160a9539e878cb0b68.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
-index bf4b8e6fb8..1fa0d73af6 100644
---- a/runtime/BUILD.gn
-+++ b/runtime/BUILD.gn
-@@ -6,41 +6,6 @@ import("//third_party/dart/runtime/bin/vmservice/vmservice_sources.gni")
- import("$flutter_root/common/config.gni")
- import("$flutter_root/testing/testing.gni")
- 
--action("gen_embedded_resources_cc") {
--  script = "//third_party/dart/runtime/tools/create_resources.py"
--  output_file = "$target_gen_dir/embedded_resources.cc"
--  outputs = [
--    output_file,
--  ]
--
--  inputs = rebase_path(vmservice_sources,
--                       "",
--                       "//third_party/dart/runtime/bin/vmservice")
--
--  args = [
--           "--output",
--           rebase_path(output_file),
--           "--outer_namespace",
--           "flutter",
--           "--inner_namespace",
--           "runtime",
--           "--table_name",
--           "flutter_embedded_service_isolate",
--           "--root_prefix",
--           rebase_path("//third_party/dart/runtime/bin/"),
--         ] + rebase_path(inputs)
--}
--
--source_set("embedded_resources_cc") {
--  sources = [
--    "$target_gen_dir/embedded_resources.cc",
--  ]
--  deps = [
--    ":gen_embedded_resources_cc",
--  ]
--  public_configs = [ "$flutter_root:config" ]
--}
--
- source_set("test_font") {
-   sources = [
-     "test_font_data.cc",
-@@ -84,7 +49,6 @@ source_set("runtime") {
-   ]
- 
-   deps = [
--    ":embedded_resources_cc",
-     ":test_font",
-     "$flutter_root/assets",
-     "$flutter_root/common",
diff --git a/tools/patches/flutter-engine/c92d5ca288da15b54b04c0a40ffe5d94a8883d77.patch b/tools/patches/flutter-engine/c92d5ca288da15b54b04c0a40ffe5d94a8883d77.patch
new file mode 100644
index 0000000..dc6194c
--- /dev/null
+++ b/tools/patches/flutter-engine/c92d5ca288da15b54b04c0a40ffe5d94a8883d77.patch
@@ -0,0 +1,13 @@
+diff --git a/DEPS b/DEPS
+index 2af26b012..cd98d79f0 100644
+--- a/DEPS
++++ b/DEPS
+@@ -47,7 +47,7 @@ vars = {
+   'dart_convert_tag': '2.0.2',
+   'dart_crypto_tag': '2.0.6',
+   'dart_csslib_tag': '0.14.4+1',
+-  'dart_dart2js_info_tag': '0.5.15',
++  'dart_dart2js_info_tag': '0.6.0',
+   'dart_dart_style_tag': '1.2.2',
+   'dart_dartdoc_tag': 'v0.28.1+2',
+   'dart_fixnum_tag': '0.10.9',
diff --git a/tools/patches/flutter-engine/d1817ddc91fd3aea061647b2e21860c47a5a5180.flutter.patch b/tools/patches/flutter-engine/d1817ddc91fd3aea061647b2e21860c47a5a5180.flutter.patch
deleted file mode 100644
index c4dca25..0000000
--- a/tools/patches/flutter-engine/d1817ddc91fd3aea061647b2e21860c47a5a5180.flutter.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/analysis_options.yaml b/analysis_options.yaml
-index 68eea153ee0..65056568003 100644
---- a/analysis_options.yaml
-+++ b/analysis_options.yaml
-@@ -28,6 +28,8 @@ analyzer:
-     missing_return: warning
-     # allow having TODOs in the code
-     todo: ignore
-+    #
-+    sdk_version_async_exported_from_core: ignore
-   exclude:
-     - 'bin/cache/**'
-     # the following two are relative to the stocks example and the flutter package respectively
diff --git a/tools/patches/flutter-engine/ecd7a88606a4bf896316f56f1b0db6f5469c2623.patch b/tools/patches/flutter-engine/ecd7a88606a4bf896316f56f1b0db6f5469c2623.patch
deleted file mode 100644
index 60a8135..0000000
--- a/tools/patches/flutter-engine/ecd7a88606a4bf896316f56f1b0db6f5469c2623.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-diff --git a/lib/snapshot/libraries.json b/lib/snapshot/libraries.json
-index a59ae6c66..99ef4cd77 100644
---- a/lib/snapshot/libraries.json
-+++ b/lib/snapshot/libraries.json
-@@ -57,6 +57,14 @@
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/collection/collection.dart"
-       },
-+      "ffi": {
-+        "patches": [
-+          "../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart",
-+          "../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart",
-+          "../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+        ],
-+        "uri": "../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-+      },
-       "typed_data": {
-         "patches": "../../../third_party/dart/runtime/lib/typed_data_patch.dart",
-         "uri": "../../../third_party/dart/sdk/lib/typed_data/typed_data.dart"
-diff --git a/lib/snapshot/libraries.yaml b/lib/snapshot/libraries.yaml
-index 26c327705..c4244eaff 100644
---- a/lib/snapshot/libraries.yaml
-+++ b/lib/snapshot/libraries.yaml
-@@ -84,6 +84,13 @@ flutter:
-         - "../../../third_party/dart/runtime/lib/profiler.dart"
-         - "../../../third_party/dart/runtime/lib/timeline.dart"
- 
-+    ffi:
-+      uri: "../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-+      patches:
-+        - "../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart"
-+        - "../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart"
-+        - "../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+
-     _http:
-       uri: "../../../third_party/dart/sdk/lib/_http/http.dart"
- 
diff --git a/tools/patches/flutter-engine/f9ebf2129732fd2b606286fdf58e500384b8a0bc.flutter.patch b/tools/patches/flutter-engine/f9ebf2129732fd2b606286fdf58e500384b8a0bc.flutter.patch
deleted file mode 100644
index eeb725b..0000000
--- a/tools/patches/flutter-engine/f9ebf2129732fd2b606286fdf58e500384b8a0bc.flutter.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-diff --git a/dev/devicelab/pubspec.yaml b/dev/devicelab/pubspec.yaml
-index 9dee6de4a..806398855 100644
---- a/dev/devicelab/pubspec.yaml
-+++ b/dev/devicelab/pubspec.yaml
-@@ -5,7 +5,7 @@ homepage: https://github.com/flutter/flutter
-
- environment:
-   # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
--  sdk: ">=2.0.0-dev.68.0 <3.0.0"
-+  sdk: ">=2.1.0-dev.5.0 <3.0.0"
-
- dependencies:
-   args: 1.5.1
-diff --git a/packages/flutter/pubspec.yaml b/packages/flutter/pubspec.yaml
-index 81564e6a2..9f85ed7ab 100644
---- a/packages/flutter/pubspec.yaml
-+++ b/packages/flutter/pubspec.yaml
-@@ -5,7 +5,7 @@ homepage: http://flutter.io
-
- environment:
-   # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
--  sdk: ">=2.0.0-dev.68.0 <3.0.0"
-+  sdk: ">=2.1.0-dev.5.0 <3.0.0"
-
- dependencies:
-   # To update these, use "flutter update-packages --force-upgrade".
-diff --git a/packages/flutter_test/pubspec.yaml b/packages/flutter_test/pubspec.yaml
-index aa930cbdf..531d24b71 100644
---- a/packages/flutter_test/pubspec.yaml
-+++ b/packages/flutter_test/pubspec.yaml
-@@ -2,7 +2,7 @@ name: flutter_test
-
- environment:
-   # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
--  sdk: ">=2.0.0-dev.68.0 <3.0.0"
-+  sdk: ">=2.1.0-dev.5.0 <3.0.0"
-
- dependencies:
-   # To update these, use "flutter update-packages --force-upgrade".
-diff --git a/packages/flutter_tools/pubspec.yaml b/packages/flutter_tools/pubspec.yaml
-index 5f89d0f18..a869162b0 100644
---- a/packages/flutter_tools/pubspec.yaml
-+++ b/packages/flutter_tools/pubspec.yaml
-@@ -5,7 +5,7 @@ author: Flutter Authors <flutter-dev@googlegroups.com>
-
- environment:
-   # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
--  sdk: ">=2.0.0-dev.68.0 <3.0.0"
-+  sdk: ">=2.1.0-dev.5.0 <3.0.0"
-
- dependencies:
-   # To update these, use "flutter update-packages --force-upgrade".
diff --git a/tools/patches/flutter-engine/f9ebf2129732fd2b606286fdf58e500384b8a0bc.patch b/tools/patches/flutter-engine/f9ebf2129732fd2b606286fdf58e500384b8a0bc.patch
deleted file mode 100644
index f0f9e8c..0000000
--- a/tools/patches/flutter-engine/f9ebf2129732fd2b606286fdf58e500384b8a0bc.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-diff --git a/DEPS b/DEPS
-index 2f5a8532b..c4cb5da32 100644
---- a/DEPS
-+++ b/DEPS
-@@ -47,7 +47,7 @@ vars = {
-   'dart_convert_tag': '2.0.2',
-   'dart_crypto_tag': '2.0.6',
-   'dart_csslib_tag': '0.14.4+1',
--  'dart_dart2js_info_tag': '0.5.13',
-+  'dart_dart2js_info_tag': '0.5.15',
-   'dart_dart_style_tag': '1.2.0',
-   'dart_dartdoc_tag': 'v0.24.1',
-   'dart_fixnum_tag': '0.10.8',
-@@ -60,7 +60,7 @@ vars = {
-   'dart_http_throttle_tag': '1.0.2',
-   'dart_intl_tag': '0.15.7',
-   'dart_json_rpc_2_tag': '2.0.9',
--  'dart_linter_tag': '0.1.71',
-+  'dart_linter_tag': '0.1.75',
-   'dart_logging_tag': '0.11.3+2',
-   'dart_markdown_tag': '2.0.2',
-   'dart_matcher_tag': '0.12.3',
-diff --git a/lib/snapshot/BUILD.gn b/lib/snapshot/BUILD.gn
-index ef06063a2..4db8600ea 100644
---- a/lib/snapshot/BUILD.gn
-+++ b/lib/snapshot/BUILD.gn
-@@ -53,9 +53,6 @@ compiled_action("generate_snapshot_bin") {
-   ]
- 
-   args = [
--    "--strong",
--    "--sync-async",
--    "--reify-generic-functions",
-     "--snapshot_kind=core",
-     "--enable_mirrors=false",
-     "--vm_snapshot_data=" + rebase_path(vm_snapshot_data),
diff --git a/tools/patches/flutter-engine/fdfe40ea95d4e91dc9fc0d6e0a1f5215ab7c4b40.flutter.patch b/tools/patches/flutter-engine/fdfe40ea95d4e91dc9fc0d6e0a1f5215ab7c4b40.flutter.patch
deleted file mode 100644
index e0d443e..0000000
--- a/tools/patches/flutter-engine/fdfe40ea95d4e91dc9fc0d6e0a1f5215ab7c4b40.flutter.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/analysis_options.yaml b/analysis_options.yaml
-index 0f3f70d3c..97e5a6453 100644
---- a/analysis_options.yaml
-+++ b/analysis_options.yaml
-@@ -120,7 +120,6 @@ linter:
-     # - parameter_assignments # we do this commonly
-     - prefer_adjacent_string_concatenation
-     - prefer_asserts_in_initializer_lists
--    - prefer_collection_literals
-     - prefer_conditional_assignment
-     - prefer_const_constructors
-     - prefer_const_constructors_in_immutables
diff --git a/tools/patches/flutter-flutter/15f2b92cce916982b7dd8ce658bbf2a465c06ba4.patch b/tools/patches/flutter-flutter/15f2b92cce916982b7dd8ce658bbf2a465c06ba4.patch
deleted file mode 100644
index 00aee00..0000000
--- a/tools/patches/flutter-flutter/15f2b92cce916982b7dd8ce658bbf2a465c06ba4.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-diff --git a/packages/flutter/lib/src/painting/text_style.dart b/packages/flutter/lib/src/painting/text_style.dart
-index 821cb475b..c85da65b7 100644
---- a/packages/flutter/lib/src/painting/text_style.dart
-+++ b/packages/flutter/lib/src/painting/text_style.dart
-@@ -822,7 +822,7 @@ class TextStyle extends Diagnosticable {
-       fontStyle: fontStyle,
-       fontFamily: fontFamily,
-       fontSize: (fontSize ?? _defaultFontSize) * textScaleFactor,
--      lineHeight: height,
-+      height: height,
-       maxLines: maxLines,
-       ellipsis: ellipsis,
-       locale: locale,
-diff --git a/packages/flutter/lib/src/rendering/error.dart b/packages/flutter/lib/src/rendering/error.dart
-index 03ab64749..a8552b37b 100644
---- a/packages/flutter/lib/src/rendering/error.dart
-+++ b/packages/flutter/lib/src/rendering/error.dart
-@@ -95,7 +95,7 @@ class RenderErrorBox extends RenderBox {
- 
-   /// The paragraph style to use when painting [RenderErrorBox] objects.
-   static ui.ParagraphStyle paragraphStyle = ui.ParagraphStyle(
--    lineHeight: 1.0,
-+    height: 1.0,
-   );
- 
-   @override
-diff --git a/packages/flutter/test/painting/text_style_test.dart b/packages/flutter/test/painting/text_style_test.dart
-index 4d65194e9..f26570aec 100644
---- a/packages/flutter/test/painting/text_style_test.dart
-+++ b/packages/flutter/test/painting/text_style_test.dart
-@@ -169,22 +169,22 @@ void main() {
-     expect(ts2.toString(), 'TextStyle(color: Color(0xff00ff00), decoration: unspecified, decorationColor: unspecified, decorationStyle: unspecified, fontWeight: FontWeight.w800, fontStyle: unspecified, textBaseline: unspecified, fontFamily: unspecified, fontFamilyFallback: unspecified, fontSize: 10.0, letterSpacing: unspecified, wordSpacing: unspecified, height: 100.0x, locale: unspecified, background: unspecified, foreground: unspecified, shadows: unspecified)');
- 
-     final ui.ParagraphStyle ps2 = s2.getParagraphStyle(textAlign: TextAlign.center);
--    expect(ps2, equals(ui.ParagraphStyle(textAlign: TextAlign.center, fontWeight: FontWeight.w800, fontSize: 10.0, lineHeight: 100.0)));
--    expect(ps2.toString(), 'ParagraphStyle(textAlign: TextAlign.center, textDirection: unspecified, fontWeight: FontWeight.w800, fontStyle: unspecified, maxLines: unspecified, fontFamily: unspecified, fontSize: 10.0, lineHeight: 100.0x, ellipsis: unspecified, locale: unspecified)');
-+    expect(ps2, equals(ui.ParagraphStyle(textAlign: TextAlign.center, fontWeight: FontWeight.w800, fontSize: 10.0, height: 100.0)));
-+    expect(ps2.toString(), 'ParagraphStyle(textAlign: TextAlign.center, textDirection: unspecified, fontWeight: FontWeight.w800, fontStyle: unspecified, maxLines: unspecified, fontFamily: unspecified, fontSize: 10.0, height: 100.0x, ellipsis: unspecified, locale: unspecified)');
-     final ui.ParagraphStyle ps5 = s5.getParagraphStyle();
--    expect(ps5, equals(ui.ParagraphStyle(fontWeight: FontWeight.w700, fontSize: 12.0, lineHeight: 123.0)));
--    expect(ps5.toString(), 'ParagraphStyle(textAlign: unspecified, textDirection: unspecified, fontWeight: FontWeight.w700, fontStyle: unspecified, maxLines: unspecified, fontFamily: unspecified, fontSize: 12.0, lineHeight: 123.0x, ellipsis: unspecified, locale: unspecified)');
-+    expect(ps5, equals(ui.ParagraphStyle(fontWeight: FontWeight.w700, fontSize: 12.0, height: 123.0)));
-+    expect(ps5.toString(), 'ParagraphStyle(textAlign: unspecified, textDirection: unspecified, fontWeight: FontWeight.w700, fontStyle: unspecified, maxLines: unspecified, fontFamily: unspecified, fontSize: 12.0, height: 123.0x, ellipsis: unspecified, locale: unspecified)');
-   });
- 
- 
-   test('TextStyle with text direction', () {
-     final ui.ParagraphStyle ps6 = const TextStyle().getParagraphStyle(textDirection: TextDirection.ltr);
-     expect(ps6, equals(ui.ParagraphStyle(textDirection: TextDirection.ltr, fontSize: 14.0)));
--    expect(ps6.toString(), 'ParagraphStyle(textAlign: unspecified, textDirection: TextDirection.ltr, fontWeight: unspecified, fontStyle: unspecified, maxLines: unspecified, fontFamily: unspecified, fontSize: 14.0, lineHeight: unspecified, ellipsis: unspecified, locale: unspecified)');
-+    expect(ps6.toString(), 'ParagraphStyle(textAlign: unspecified, textDirection: TextDirection.ltr, fontWeight: unspecified, fontStyle: unspecified, maxLines: unspecified, fontFamily: unspecified, fontSize: 14.0, height: unspecified, ellipsis: unspecified, locale: unspecified)');
- 
-     final ui.ParagraphStyle ps7 = const TextStyle().getParagraphStyle(textDirection: TextDirection.rtl);
-     expect(ps7, equals(ui.ParagraphStyle(textDirection: TextDirection.rtl, fontSize: 14.0)));
--    expect(ps7.toString(), 'ParagraphStyle(textAlign: unspecified, textDirection: TextDirection.rtl, fontWeight: unspecified, fontStyle: unspecified, maxLines: unspecified, fontFamily: unspecified, fontSize: 14.0, lineHeight: unspecified, ellipsis: unspecified, locale: unspecified)');
-+    expect(ps7.toString(), 'ParagraphStyle(textAlign: unspecified, textDirection: TextDirection.rtl, fontWeight: unspecified, fontStyle: unspecified, maxLines: unspecified, fontFamily: unspecified, fontSize: 14.0, height: unspecified, ellipsis: unspecified, locale: unspecified)');
-   });
- 
-   test('TextStyle using package font', () {
diff --git a/tools/patches/flutter-flutter/3c118b6c3b42c89f4ef18fce4b27e328f2fd754d.patch b/tools/patches/flutter-flutter/3c118b6c3b42c89f4ef18fce4b27e328f2fd754d.patch
deleted file mode 100644
index acde0c1..0000000
--- a/tools/patches/flutter-flutter/3c118b6c3b42c89f4ef18fce4b27e328f2fd754d.patch
+++ /dev/null
@@ -1,446 +0,0 @@
-diff --git a/packages/flutter/test/widgets/text_golden_test.dart b/packages/flutter/test/widgets/text_golden_test.dart
-index 4adb60968..fe08d98e4 100644
---- a/packages/flutter/test/widgets/text_golden_test.dart
-+++ b/packages/flutter/test/widgets/text_golden_test.dart
-@@ -1,440 +1 @@
--// Copyright 2018 The Chromium Authors. All rights reserved.
--// Use of this source code is governed by a BSD-style license that can be
--// found in the LICENSE file.
--
--import 'dart:io' show Platform;
--
--import 'package:flutter_test/flutter_test.dart';
--import 'package:flutter/material.dart';
--import 'package:flutter/widgets.dart';
--
--void main() {
--  testWidgets('Centered text', (WidgetTester tester) async {
--    await tester.pumpWidget(
--      Center(
--        child: RepaintBoundary(
--          child: Container(
--            width: 200.0,
--            height: 100.0,
--            decoration: const BoxDecoration(
--              color: Color(0xff00ff00),
--            ),
--            child: const Text('Hello',
--              textDirection: TextDirection.ltr,
--              textAlign: TextAlign.center,
--              style: TextStyle(color: Color(0xffff0000)),
--            ),
--          ),
--        ),
--      ),
--    );
--
--    await expectLater(
--      find.byType(Container),
--      matchesGoldenFile('text_golden.Centered.png'),
--    );
--
--    await tester.pumpWidget(
--      Center(
--        child: RepaintBoundary(
--          child: Container(
--            width: 200.0,
--            height: 100.0,
--            decoration: const BoxDecoration(
--              color: Color(0xff00ff00),
--            ),
--            child: const Text('Hello world how are you today',
--              textDirection: TextDirection.ltr,
--              textAlign: TextAlign.center,
--              style: TextStyle(color: Color(0xffff0000)),
--            ),
--          ),
--        ),
--      ),
--    );
--
--    await expectLater(
--      find.byType(Container),
--      matchesGoldenFile('text_golden.Centered.wrap.png'),
--    );
--  }, skip: !Platform.isLinux);
--
--
--  testWidgets('Text Foreground', (WidgetTester tester) async {
--    const Color black = Color(0xFF000000);
--    const Color red = Color(0xFFFF0000);
--    const Color blue = Color(0xFF0000FF);
--    final Shader linearGradient = const LinearGradient(
--      colors: <Color>[red, blue],
--    ).createShader(Rect.fromLTWH(0.0, 0.0, 50.0, 20.0));
--
--    await tester.pumpWidget(
--      Align(
--        alignment: Alignment.topLeft,
--        child: RepaintBoundary(
--          child: Text('Hello',
--            textDirection: TextDirection.ltr,
--            style: TextStyle(
--              foreground: Paint()
--                ..color = black
--                ..shader = linearGradient
--            ),
--          ),
--        ),
--      ),
--    );
--
--    await expectLater(
--      find.byType(RepaintBoundary),
--      matchesGoldenFile('text_golden.Foreground.gradient.png'),
--    );
--
--    await tester.pumpWidget(
--      Align(
--        alignment: Alignment.topLeft,
--        child: RepaintBoundary(
--          child: Text('Hello',
--            textDirection: TextDirection.ltr,
--            style: TextStyle(
--              foreground: Paint()
--                ..color = black
--                ..style = PaintingStyle.stroke
--                ..strokeWidth = 2.0
--            ),
--          ),
--        ),
--      ),
--    );
--
--    await expectLater(
--      find.byType(RepaintBoundary),
--      matchesGoldenFile('text_golden.Foreground.stroke.png'),
--    );
--
--    await tester.pumpWidget(
--      Align(
--        alignment: Alignment.topLeft,
--        child: RepaintBoundary(
--          child: Text('Hello',
--            textDirection: TextDirection.ltr,
--            style: TextStyle(
--              foreground: Paint()
--                ..color = black
--                ..style = PaintingStyle.stroke
--                ..strokeWidth = 2.0
--                ..shader = linearGradient
--            ),
--          ),
--        ),
--      ),
--    );
--
--    await expectLater(
--      find.byType(RepaintBoundary),
--      matchesGoldenFile('text_golden.Foreground.stroke_and_gradient.png'),
--    );
--  }, skip: !Platform.isLinux);
--
--  // TODO(garyq): This test requires an update when the background
--  // drawing from the beginning of the line bug is fixed. The current
--  // tested version is not completely correct.
--  testWidgets('Text Background', (WidgetTester tester) async {
--    const Color red = Colors.red;
--    const Color blue = Colors.blue;
--    const Color translucentGreen = Color(0x5000F000);
--    const Color translucentDarkRed = Color(0x500F0000);
--    await tester.pumpWidget(
--      Align(
--        alignment: Alignment.topLeft,
--        child: RepaintBoundary(
--          child: Container(
--            width: 200.0,
--            height: 100.0,
--            decoration: const BoxDecoration(
--              color: Colors.green,
--            ),
--            child: RichText(
--              textDirection: TextDirection.ltr,
--              text: TextSpan(
--                text: 'text1 ',
--                style: TextStyle(
--                  color: translucentGreen,
--                  background: Paint()
--                    ..color = red.withOpacity(0.5)
--                ),
--                children: <TextSpan>[
--                  TextSpan(
--                    text: 'text2',
--                    style: TextStyle(
--                      color: translucentDarkRed,
--                      background: Paint()
--                        ..color = blue.withOpacity(0.5)
--                    )
--                  ),
--                ],
--              ),
--            ),
--          ),
--        ),
--      ),
--    );
--
--    await expectLater(
--      find.byType(RepaintBoundary),
--      matchesGoldenFile('text_golden.Background.png'),
--    );
--  }, skip: !Platform.isLinux);
--
--  testWidgets('Text Fade', (WidgetTester tester) async {
--    await tester.pumpWidget(
--        MaterialApp(
--          home: Scaffold(
--            backgroundColor: Colors.transparent,
--            body: RepaintBoundary(
--              child: Center(
--                child: Container(
--                  width: 200.0,
--                  height: 200.0,
--                  color: Colors.green,
--                  child: Center(
--                    child: Container(
--                      width: 100.0,
--                      color: Colors.blue,
--                      child: const Text(
--                        'Pp PPp PPPp PPPPp PPPPpp PPPPppp PPPPppppp ',
--                        style: TextStyle(color: Colors.black),
--                        maxLines: 3,
--                        overflow: TextOverflow.fade,
--                      ),
--                    ),
--                  ),
--                ),
--              ),
--            ),
--          )
--        )
--    );
--
--    await expectLater(
--      find.byType(RepaintBoundary).first,
--      matchesGoldenFile('text_golden.Fade.1.png'),
--    );
--  }, skip: !Platform.isLinux);
--
--  testWidgets('Default Strut text', (WidgetTester tester) async {
--    await tester.pumpWidget(
--      Center(
--        child: RepaintBoundary(
--          child: Container(
--            width: 200.0,
--            height: 100.0,
--            decoration: const BoxDecoration(
--              color: Color(0xff00ff00),
--            ),
--            child: const Text('Hello\nLine 2\nLine 3',
--              textDirection: TextDirection.ltr,
--              style: TextStyle(),
--              strutStyle: StrutStyle(),
--            ),
--          ),
--        ),
--      ),
--    );
--    await expectLater(
--      find.byType(Container),
--      matchesGoldenFile('text_golden.StrutDefault.png'),
--    );
--  }, skip: !Platform.isLinux);
--
--  testWidgets('Strut text 1', (WidgetTester tester) async {
--    await tester.pumpWidget(
--      Center(
--        child: RepaintBoundary(
--          child: Container(
--            width: 200.0,
--            height: 100.0,
--            decoration: const BoxDecoration(
--              color: Color(0xff00ff00),
--            ),
--            child: const Text('Hello\nLine2\nLine3',
--              textDirection: TextDirection.ltr,
--              style: TextStyle(),
--              strutStyle: StrutStyle(
--                height: 1.5,
--              ),
--            ),
--          ),
--        ),
--      ),
--    );
--    await expectLater(
--      find.byType(Container),
--      matchesGoldenFile('text_golden.Strut.1.png'),
--    );
--  }, skip: !Platform.isLinux);
--
--  testWidgets('Strut text 2', (WidgetTester tester) async {
--    await tester.pumpWidget(
--      Center(
--        child: RepaintBoundary(
--          child: Container(
--            width: 200.0,
--            height: 100.0,
--            decoration: const BoxDecoration(
--              color: Color(0xff00ff00),
--            ),
--            child: const Text('Hello\nLine 2\nLine 3',
--              textDirection: TextDirection.ltr,
--              style: TextStyle(),
--              strutStyle: StrutStyle(
--                height: 1.5,
--                fontSize: 14,
--              ),
--            ),
--          ),
--        ),
--      ),
--    );
--    await expectLater(
--      find.byType(Container),
--      matchesGoldenFile('text_golden.Strut.2.png'),
--    );
--  }, skip: !Platform.isLinux);
--
--  testWidgets('Strut text rich', (WidgetTester tester) async {
--    await tester.pumpWidget(
--      Center(
--        child: RepaintBoundary(
--          child: Container(
--            width: 200.0,
--            height: 150.0,
--            decoration: const BoxDecoration(
--              color: Color(0xff00ff00),
--            ),
--            child: const Text.rich(
--              TextSpan(
--                text: 'Hello\n',
--                style: TextStyle(
--                  color: Colors.red,
--                  fontSize: 30
--                ),
--                children: <TextSpan>[
--                  TextSpan(
--                    text: 'Second line!\n',
--                    style: TextStyle(
--                      fontSize: 5,
--                      color: Colors.blue,
--                    ),
--                  ),
--                  TextSpan(
--                    text: 'Third line!\n',
--                    style: TextStyle(
--                      fontSize: 25,
--                      color: Colors.white,
--                    ),
--                  ),
--                ],
--              ),
--              textDirection: TextDirection.ltr,
--              strutStyle: StrutStyle(
--                fontSize: 14,
--                height: 1.1,
--                leading: 0.1,
--              ),
--            ),
--          ),
--        ),
--      ),
--    );
--    await expectLater(
--      find.byType(Container),
--      matchesGoldenFile('text_golden.Strut.3.png'),
--    );
--  }, skip: !Platform.isLinux);
--
--  testWidgets('Strut text font fallback', (WidgetTester tester) async {
--    // Font Fallback
--    await tester.pumpWidget(
--      Center(
--        child: RepaintBoundary(
--          child: Container(
--            width: 200.0,
--            height: 100.0,
--            decoration: const BoxDecoration(
--              color: Color(0xff00ff00),
--            ),
--            child: const Text('Hello\nLine 2\nLine 3',
--              textDirection: TextDirection.ltr,
--              style: TextStyle(),
--              strutStyle: StrutStyle(
--                fontFamily: 'FakeFont 1',
--                fontFamilyFallback: <String>[
--                  'FakeFont 2',
--                  'EvilFont 3',
--                  'Nice Font 4',
--                  'ahem'
--                ],
--                fontSize: 14,
--              ),
--            ),
--          ),
--        ),
--      ),
--    );
--    await expectLater(
--      find.byType(Container),
--      matchesGoldenFile('text_golden.Strut.4.png'),
--    );
--  }, skip: !Platform.isLinux);
--
--  testWidgets('Strut text rich forceStrutHeight', (WidgetTester tester) async {
--    await tester.pumpWidget(
--      Center(
--        child: RepaintBoundary(
--          child: Container(
--            width: 200.0,
--            height: 100.0,
--            decoration: const BoxDecoration(
--              color: Color(0xff00ff00),
--            ),
--            child: const Text.rich(
--              TextSpan(
--                text: 'Hello\n',
--                style: TextStyle(
--                  color: Colors.red,
--                  fontSize: 30
--                ),
--                children: <TextSpan>[
--                  TextSpan(
--                    text: 'Second line!\n',
--                    style: TextStyle(
--                      fontSize: 9,
--                      color: Colors.blue,
--                    ),
--                  ),
--                  TextSpan(
--                    text: 'Third line!\n',
--                    style: TextStyle(
--                      fontSize: 27,
--                      color: Colors.white,
--                    ),
--                  ),
--                ],
--              ),
--              textDirection: TextDirection.ltr,
--              strutStyle: StrutStyle(
--                fontSize: 14,
--                height: 1.1,
--                forceStrutHeight: true,
--              ),
--            ),
--          ),
--        ),
--      ),
--    );
--    await expectLater(
--      find.byType(Container),
--      matchesGoldenFile('text_golden.StrutForce.1.png'),
--    );
--  }, skip: !Platform.isLinux);
--}
-+void main() { }
diff --git a/tools/patches/flutter-flutter/502c9c4002a6b456f829f79bfbd2ff61d075d1d7.patch b/tools/patches/flutter-flutter/502c9c4002a6b456f829f79bfbd2ff61d075d1d7.patch
new file mode 100644
index 0000000..50eb1f4ea
--- /dev/null
+++ b/tools/patches/flutter-flutter/502c9c4002a6b456f829f79bfbd2ff61d075d1d7.patch
@@ -0,0 +1,166 @@
+diff --git a/packages/flutter_tools/lib/src/base/build.dart b/packages/flutter_tools/lib/src/base/build.dart
+index 7be3b8c20..8e6012042 100644
+--- a/packages/flutter_tools/lib/src/base/build.dart
++++ b/packages/flutter_tools/lib/src/base/build.dart
+@@ -46,13 +46,11 @@ class GenSnapshot {
+ 
+   Future<int> run({
+     @required SnapshotType snapshotType,
+-    @required String packagesPath,
+     IOSArch iosArch,
+     Iterable<String> additionalArgs = const <String>[],
+   }) {
+     final List<String> args = <String>[
+       '--causal_async_stacks',
+-      '--packages=$packagesPath',
+     ]..addAll(additionalArgs);
+ 
+     final String snapshotterPath = getSnapshotterPath(snapshotType);
+@@ -193,7 +191,6 @@ class AOTSnapshotter {
+     final SnapshotType snapshotType = SnapshotType(platform, buildMode);
+     final int genSnapshotExitCode = await genSnapshot.run(
+       snapshotType: snapshotType,
+-      packagesPath: packageMap.packagesPath,
+       additionalArgs: genSnapshotArgs,
+       iosArch: iosArch,
+     );
+@@ -537,7 +534,6 @@ class JITSnapshotter {
+     final SnapshotType snapshotType = SnapshotType(platform, buildMode);
+     final int genSnapshotExitCode = await genSnapshot.run(
+       snapshotType: snapshotType,
+-      packagesPath: packagesPath,
+       additionalArgs: genSnapshotArgs,
+     );
+     if (genSnapshotExitCode != 0) {
+diff --git a/packages/flutter_tools/test/base/build_test.dart b/packages/flutter_tools/test/base/build_test.dart
+index 81653aded..4d245a33d 100644
+--- a/packages/flutter_tools/test/base/build_test.dart
++++ b/packages/flutter_tools/test/base/build_test.dart
+@@ -190,7 +190,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.ios);
+       expect(genSnapshot.snapshotType.mode, BuildMode.profile);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-aot-assembly',
+@@ -229,7 +228,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.ios);
+       expect(genSnapshot.snapshotType.mode, BuildMode.profile);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-aot-assembly',
+@@ -268,7 +266,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.android_arm);
+       expect(genSnapshot.snapshotType.mode, BuildMode.profile);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-aot-blobs',
+@@ -312,7 +309,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.android_arm64);
+       expect(genSnapshot.snapshotType.mode, BuildMode.profile);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-aot-blobs',
+@@ -352,7 +348,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.ios);
+       expect(genSnapshot.snapshotType.mode, BuildMode.release);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-aot-assembly',
+@@ -391,7 +386,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.ios);
+       expect(genSnapshot.snapshotType.mode, BuildMode.release);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-aot-assembly',
+@@ -448,7 +442,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.android_arm);
+       expect(genSnapshot.snapshotType.mode, BuildMode.release);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-aot-blobs',
+@@ -492,7 +485,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.android_arm64);
+       expect(genSnapshot.snapshotType.mode, BuildMode.release);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-aot-blobs',
+@@ -581,7 +573,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.android_arm);
+       expect(genSnapshot.snapshotType.mode, BuildMode.debug);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--enable_asserts',
+@@ -622,7 +613,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.android_arm64);
+       expect(genSnapshot.snapshotType.mode, BuildMode.debug);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--enable_asserts',
+@@ -674,7 +664,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.android_arm);
+       expect(genSnapshot.snapshotType.mode, BuildMode.profile);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-jit',
+@@ -714,7 +703,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.android_arm64);
+       expect(genSnapshot.snapshotType.mode, BuildMode.profile);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-jit',
+@@ -765,7 +753,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.android_arm);
+       expect(genSnapshot.snapshotType.mode, BuildMode.release);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-jit',
+@@ -805,7 +792,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.android_arm64);
+       expect(genSnapshot.snapshotType.mode, BuildMode.release);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-jit',
+@@ -860,7 +846,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.android_arm);
+       expect(genSnapshot.snapshotType.mode, BuildMode.release);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-jit',
+@@ -917,7 +902,6 @@ void main() {
+       expect(genSnapshot.callCount, 1);
+       expect(genSnapshot.snapshotType.platform, TargetPlatform.android_arm);
+       expect(genSnapshot.snapshotType.mode, BuildMode.release);
+-      expect(genSnapshot.packagesPath, '.packages');
+       expect(genSnapshot.additionalArgs, <String>[
+         '--deterministic',
+         '--snapshot_kind=app-jit',
diff --git a/tools/promote.py b/tools/promote.py
index f113581..8033ab9 100644
--- a/tools/promote.py
+++ b/tools/promote.py
@@ -104,6 +104,11 @@
         raise Exception(
             "InternalError: Sanity check failed on GS URI: %s" % gs_path)
 
+    def exists(gs_path):
+      (_, _, exit_code) = Gsutil(['ls', gs_path], throw_on_error=False)
+      # gsutil will exit 0 if the "directory" exists
+      return exit_code == 0
+
     # Google cloud storage has read-after-write, read-after-update,
     # and read-after-delete consistency, but not list after delete consistency.
     # Because gsutil uses list to figure out if it should do the unix styly
@@ -111,19 +116,17 @@
     # still being there (after it has been deleted) gsutil will copy
     # into the directory instead of to the directory.
     def wait_for_delete_to_be_consistent_with_list(gs_path):
-      while True:
-        if DRY_RUN:
-          break
-        (_, _, exit_code) = Gsutil(['ls', gs_path], throw_on_error=False)
-        # gsutil will exit 1 if the "directory" does not exist
-        if exit_code != 0:
-          break
+      if DRY_RUN:
+        return
+      while exists(gs_path):
         time.sleep(1)
 
     def remove_gs_directory(gs_path):
       safety_check_on_gs_path(gs_path, to_revision, channel)
-      Gsutil(['-m', 'rm', '-R', '-f', gs_path])
-      wait_for_delete_to_be_consistent_with_list(gs_path)
+      # Only delete existing directories
+      if exists(gs_path):
+        Gsutil(['-m', 'rm', '-R', '-f', gs_path])
+        wait_for_delete_to_be_consistent_with_list(gs_path)
 
     # Copy sdk directory.
     from_loc = raw_namer.sdk_directory(revision)
diff --git a/tools/test.dart b/tools/test.dart
index ebe3add..9842a06 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -6,6 +6,7 @@
 // Run tests like on the given builder.
 
 import 'dart:async';
+import 'dart:collection';
 import 'dart:convert';
 import 'dart:io';
 
@@ -132,6 +133,91 @@
   return string;
 }
 
+/// Finds the branch of a builder given the list of branches.
+String branchOfBuilder(String builder, List<String> branches) {
+  return branches.where((branch) => branch != "master").firstWhere(
+      (branch) => builder.endsWith("-$branch"),
+      orElse: () => "master");
+}
+
+/// Finds the named configuration to test according to the test matrix
+/// information and the command line options.
+bool resolveNamedConfiguration(
+    List<String> branches,
+    List<dynamic> buildersConfigurations,
+    String requestedBranch,
+    String requestedNamedConfiguration,
+    String requestedBuilder,
+    Set<String> outputNamedConfiguration,
+    Set<String> outputBuilders) {
+  bool foundBuilder = false;
+  for (final builderConfiguration in buildersConfigurations) {
+    for (final builder in builderConfiguration["builders"]) {
+      if (requestedBuilder != null && builder != requestedBuilder) {
+        continue;
+      }
+      final branch = branchOfBuilder(builder, branches);
+      if (branch != requestedBranch) {
+        if (requestedBuilder == null) {
+          continue;
+        }
+        stderr.writeln("error: Builder $requestedBuilder is on branch $branch "
+            "rather than $requestedBranch");
+        stderr.writeln("error: To compare with that branch, use: -B $branch");
+        return false;
+      }
+      foundBuilder = true;
+      final steps = (builderConfiguration["steps"] as List).cast<Map>();
+      final testSteps = steps
+          .where((step) =>
+              !step.containsKey("script") || step["script"] == "tools/test.py")
+          .toList();
+      for (final step in testSteps) {
+        final arguments = step["arguments"]
+            .map((argument) => expandVariables(argument, builder))
+            .toList();
+        final namedConfiguration = arguments
+            .firstWhere((argument) => (argument as String).startsWith("-n"))
+            .substring(2);
+        if (requestedNamedConfiguration == null ||
+            requestedNamedConfiguration == namedConfiguration) {
+          outputNamedConfiguration.add(namedConfiguration);
+          outputBuilders.add(builder);
+        }
+      }
+    }
+  }
+  if (requestedBuilder != null && !foundBuilder) {
+    stderr.writeln("error: Builder $requestedBuilder doesn't exist");
+    return false;
+  }
+  if (requestedBuilder != null &&
+      requestedNamedConfiguration == null &&
+      outputNamedConfiguration.isEmpty) {
+    stderr.writeln("error: Builder $requestedBuilder isn't testing any named "
+        "configurations");
+    return false;
+  }
+  if (requestedBuilder != null &&
+      requestedNamedConfiguration != null &&
+      outputNamedConfiguration.isEmpty) {
+    stderr.writeln("error: The builder $requestedBuilder isn't testing the "
+        "named configuration $requestedNamedConfiguration");
+    return false;
+  }
+  if (requestedNamedConfiguration != null && outputNamedConfiguration.isEmpty) {
+    stderr.writeln("error: The named configuration "
+        "$requestedNamedConfiguration doesn't exist");
+    return false;
+  }
+  if (requestedNamedConfiguration != null && outputBuilders.isEmpty) {
+    stderr.writeln("error: The named configuration "
+        "$requestedNamedConfiguration isn't tested on any builders");
+    return false;
+  }
+  return true;
+}
+
 /// Locates the merge base between head and the [branch] on the given [remote].
 /// If a particular [commit] was requested, use that.
 Future<String> findMergeBase(
@@ -191,6 +277,10 @@
       help: "Select the builders building this branch",
       defaultsTo: "master");
   parser.addOption("commit", abbr: "C", help: "Compare with this commit");
+  parser.addOption("named-configuration",
+      abbr: "n",
+      help: "The named test configuration that supplies the\nvalues for all "
+          "test options, specifying how tests\nshould be run.");
   parser.addOption("remote",
       abbr: "R",
       help: "Compare with this remote and git branch",
@@ -198,10 +288,22 @@
   parser.addFlag("help", help: "Show the program usage.", negatable: false);
 
   final options = parser.parse(args);
-  if (options["help"] || options["builder"] == null) {
+  if (options["help"] ||
+      (options["builder"] == null && options["named-configuration"] == null)) {
     print("""
-Usage: test.dart -b [BUILDER] [OPTION]...
-Run tests and compare with the results on the given builder.
+Usage: test.dart -b [BUILDER] -n [CONFIGURATION] [OPTION]... [--]
+                 [TEST.PY OPTION]... [SELECTOR]...
+
+Run tests and compare with the results on the given builder. Either the -n or
+the -b option, or both, must be used. Any options following -- and non-option
+arguments will be forwarded to test.py invocations. The results for the specified
+named configuration will be downloaded from the specified builder. If only a
+named configuration is specified, the results are downloaded from the
+appropriate builders. If only a builder is specified, the default named
+configuration is used if the builder only has a single named configuration.
+Otherwise the available named configurations are listed.
+
+See the documentation at https://goto.google.com/dart-status-file-free-workflow
 
 ${parser.usage}""");
     return;
@@ -211,138 +313,155 @@
   gsutilPy =
       Platform.script.resolve("../third_party/gsutil/gsutil.py").toFilePath();
 
-  final builder = options["builder"];
+  // Load the test matrix.
+  final scriptPath = Platform.script.toFilePath();
+  final testMatrixPath =
+      scriptPath.substring(0, scriptPath.length - "test.dart".length) +
+          "bots/test_matrix.json";
+  final testMatrix = jsonDecode(await new File(testMatrixPath).readAsString());
+  final branches = (testMatrix["branches"] as List).cast<String>();
+  final buildersConfigurations =
+      testMatrix["builder_configurations"] as List<dynamic>;
+
+  // Determine what named configuration to run and which builders to download
+  // existing results from.
+  final namedConfigurations = new SplayTreeSet<String>();
+  final builders = new SplayTreeSet<String>();
+  if (!resolveNamedConfiguration(
+      branches,
+      buildersConfigurations,
+      options["branch"],
+      options["named-configuration"],
+      options["builder"],
+      namedConfigurations,
+      builders)) {
+    exitCode = 1;
+    return;
+  }
+  if (2 <= namedConfigurations.length) {
+    final builder = builders.single;
+    stderr.writeln(
+        "error: The builder $builder is testing multiple named configurations");
+    stderr.writeln(
+        "error: Please select the desired named configuration using -n:");
+    for (final namedConfiguration in namedConfigurations) {
+      stderr.writeln("  -n $namedConfiguration");
+    }
+    exitCode = 1;
+    return;
+  }
+  final namedConfiguration = namedConfigurations.single;
+  for (final builder in builders) {
+    print("Testing the named configuration $namedConfiguration "
+        "compared with builder $builder");
+  }
 
   // Find out where the current HEAD branched.
   final commit = await findMergeBase(
       options["commit"], options["remote"], options["branch"]);
   print("Base commit is $commit");
 
-  // Use the buildbucket API to search for builds of the right rcommit.
-  print("Finding build to compare with...");
-  final buildNumber = await buildNumberOfCommit(builder, commit);
-  print("Comparing with build $buildNumber on $builder");
-
+  // Store the downloaded results and our test results in a temporary directory.
   final outDirectory = await Directory.systemTemp.createTemp("test.dart.");
   try {
-    // Download the previous results and flakiness info from cloud storage.
-    print("Downloading previous results...");
-    await cpGsutil(
-        buildFileCloudPath(builder, buildNumber.toString(), "results.json"),
-        "${outDirectory.path}/previous.json");
-    await cpGsutil(
-        buildFileCloudPath(builder, buildNumber.toString(), "flaky.json"),
-        "${outDirectory.path}/flaky.json");
-    print("Downloaded previous results");
+    final mergedResults = <String, Map<String, dynamic>>{};
+    final mergedFlaky = <String, Map<String, dynamic>>{};
 
-    // Load the test matrix.
-    final scriptPath = Platform.script.toFilePath();
-    final testMatrixPath =
-        scriptPath.substring(0, scriptPath.length - "test.dart".length) +
-            "bots/test_matrix.json";
-    final testMatrix =
-        jsonDecode(await new File(testMatrixPath).readAsString());
-
-    // Find the appropriate test.py steps.
-    final buildersConfigurations = testMatrix["builder_configurations"];
-    final builderConfiguration = buildersConfigurations.firstWhere(
-        (builderConfiguration) =>
-            (builderConfiguration["builders"] as List).contains(builder));
-    final steps = (builderConfiguration["steps"] as List).cast<Map>();
-    final testSteps = steps
-        .where((step) =>
-            !step.containsKey("script") || step["script"] == "tools/test.py")
-        .toList();
-
-    // Run each step like the builder would, deflaking tests that need it.
-    final stepResultsPaths = <String>[];
-    final stepLogsPaths = <String>[];
-    for (int stepIndex = 0; stepIndex < testSteps.length; stepIndex++) {
-      // Run the test step.
-      final testStep = testSteps[stepIndex];
-      final stepName = testStep["name"];
-      final stepDirectory = new Directory("${outDirectory.path}/$stepIndex");
-      await stepDirectory.create();
-      final stepArguments = testStep["arguments"]
-          .map((argument) => expandVariables(argument, builder))
-          .toList()
-          .cast<String>();
-      final fullArguments = <String>[]
-        ..addAll(stepArguments)
-        ..addAll([
-          "--output-directory=${stepDirectory.path}",
-          "--clean-exit",
-          "--silent-failures",
-          "--write-results",
-          "--write-logs",
-        ])
-        ..addAll(options.rest);
-      print("".padLeft(80, "="));
-      print("$stepName: Running tests");
-      print("".padLeft(80, "="));
-      await runProcessInheritStdio(
-          "python", ["tools/test.py"]..addAll(fullArguments),
-          runInShell: Platform.isWindows);
-      stepResultsPaths.add("${stepDirectory.path}/results.json");
-      stepLogsPaths.add("${stepDirectory.path}/logs.json");
-      // Find the list of tests to deflake.
-      final deflakeListOutput = await runProcess(Platform.resolvedExecutable, [
-        "tools/bots/compare_results.dart",
-        "--changed",
-        "--failing",
-        "--passing",
-        "--flakiness-data=${outDirectory.path}/flaky.json",
-        "${outDirectory.path}/previous.json",
-        "${stepDirectory.path}/results.json",
-      ]);
-      final deflakeListPath = "${stepDirectory.path}/deflake.list";
-      final deflakeListFile = new File(deflakeListPath);
-      await deflakeListFile.writeAsString(deflakeListOutput.stdout);
-      // Deflake the changed tests.
-      final deflakingResultsPaths = <String>[];
-      for (int i = 1;
-          deflakeListOutput.stdout != "" && i <= deflakingCount;
-          i++) {
-        print("".padLeft(80, "="));
-        print("$stepName: Running deflaking iteration $i");
-        print("".padLeft(80, "="));
-        final deflakeDirectory = new Directory("${stepDirectory.path}/$i");
-        await deflakeDirectory.create();
-        final deflakeArguments = <String>[]
-          ..addAll(stepArguments)
-          ..addAll([
-            "--output-directory=${deflakeDirectory.path}",
-            "--clean-exit",
-            "--silent-failures",
-            "--write-results",
-            "--test-list=$deflakeListPath",
-          ])
-          ..addAll(options.rest);
-        await runProcessInheritStdio(
-            "python", ["tools/test.py"]..addAll(deflakeArguments),
-            runInShell: Platform.isWindows);
-        deflakingResultsPaths.add("${deflakeDirectory.path}/results.json");
+    // Use the buildbucket API to search for builds of the right commit.
+    for (final builder in builders) {
+      // Download the previous results and flakiness info from cloud storage.
+      print("Finding build on builder $builder to compare with...");
+      final buildNumber = await buildNumberOfCommit(builder, commit);
+      print("Downloading results from builder $builder build $buildNumber...");
+      await cpGsutil(
+          buildFileCloudPath(builder, buildNumber.toString(), "results.json"),
+          "${outDirectory.path}/previous.json");
+      await cpGsutil(
+          buildFileCloudPath(builder, buildNumber.toString(), "flaky.json"),
+          "${outDirectory.path}/flaky.json");
+      print("Downloaded baseline results from builder $builder");
+      // Merge the results for the builders.
+      if (2 <= builders.length) {
+        mergedResults
+            .addAll(await loadResultsMap("${outDirectory.path}/previous.json"));
+        mergedFlaky
+            .addAll(await loadResultsMap("${outDirectory.path}/flaky.json"));
       }
-      // Update the flakiness information based on what we've learned.
-      print("$stepName: Updating flakiness information");
-      await runProcess(
-          Platform.resolvedExecutable,
-          [
-            "tools/bots/update_flakiness.dart",
-            "--input=${outDirectory.path}/flaky.json",
-            "--output=${outDirectory.path}/flaky.json",
-            "${stepDirectory.path}/results.json",
-          ]..addAll(deflakingResultsPaths));
     }
-    // Collect all the results from all the steps.
-    await new File("${outDirectory.path}/results.json").writeAsString(
-        stepResultsPaths
-            .map((path) => new File(path).readAsStringSync())
-            .join(""));
-    // Collect all the logs from all the steps.
-    await new File("${outDirectory.path}/logs.json").writeAsString(stepLogsPaths
-        .map((path) => new File(path).readAsStringSync())
-        .join(""));
+
+    // Write out the merged results for the builders.
+    if (2 <= builders.length) {
+      print("Merging downloaded results from the builders...");
+      await new File("${outDirectory.path}/previous.json").writeAsString(
+          mergedResults.values.map((data) => jsonEncode(data) + "\n").join(""));
+      await new File("${outDirectory.path}/flaky.json").writeAsString(
+          mergedFlaky.values.map((data) => jsonEncode(data) + "\n").join(""));
+    }
+
+    // Run the tests.
+    final arguments = [
+      "--named-configuration=$namedConfiguration",
+      "--output-directory=${outDirectory.path}",
+      "--clean-exit",
+      "--silent-failures",
+      "--write-results",
+      "--write-logs",
+    ]..addAll(options.rest);
+    print("".padLeft(80, "="));
+    print("Running tests");
+    print("".padLeft(80, "="));
+    await runProcessInheritStdio("python", ["tools/test.py"]..addAll(arguments),
+        runInShell: Platform.isWindows);
+
+    // Find the list of tests to deflake.
+    final deflakeListOutput = await runProcess(Platform.resolvedExecutable, [
+      "tools/bots/compare_results.dart",
+      "--changed",
+      "--failing",
+      "--passing",
+      "--flakiness-data=${outDirectory.path}/flaky.json",
+      "${outDirectory.path}/previous.json",
+      "${outDirectory.path}/results.json",
+    ]);
+    final deflakeListPath = "${outDirectory.path}/deflake.list";
+    final deflakeListFile = new File(deflakeListPath);
+    await deflakeListFile.writeAsString(deflakeListOutput.stdout);
+
+    // Deflake the changed tests.
+    final deflakingResultsPaths = <String>[];
+    for (int i = 1;
+        deflakeListOutput.stdout != "" && i <= deflakingCount;
+        i++) {
+      print("".padLeft(80, "="));
+      print("Running deflaking iteration $i");
+      print("".padLeft(80, "="));
+      final deflakeDirectory = new Directory("${outDirectory.path}/$i");
+      await deflakeDirectory.create();
+      final deflakeArguments = <String>[
+        "--named-configuration=$namedConfiguration",
+        "--output-directory=${deflakeDirectory.path}",
+        "--clean-exit",
+        "--silent-failures",
+        "--write-results",
+        "--test-list=$deflakeListPath",
+      ]..addAll(options.rest);
+      await runProcessInheritStdio(
+          "python", ["tools/test.py"]..addAll(deflakeArguments),
+          runInShell: Platform.isWindows);
+      deflakingResultsPaths.add("${deflakeDirectory.path}/results.json");
+    }
+
+    // Update the flakiness information based on what we've learned.
+    print("Updating flakiness information...");
+    await runProcess(
+        Platform.resolvedExecutable,
+        [
+          "tools/bots/update_flakiness.dart",
+          "--input=${outDirectory.path}/flaky.json",
+          "--output=${outDirectory.path}/flaky.json",
+          "${outDirectory.path}/results.json",
+        ]..addAll(deflakingResultsPaths));
+
     // Write out the final comparison.
     print("".padLeft(80, "="));
     print("Test Results");
diff --git a/tools/testing/dart/browser_test.dart b/tools/testing/dart/browser_test.dart
index 1faea9e..b7f51ca 100644
--- a/tools/testing/dart/browser_test.dart
+++ b/tools/testing/dart/browser_test.dart
@@ -200,7 +200,7 @@
   };
 
   let pendingCallbacks = 0;
-  let waitForDone = false;
+  let waitForDone = false, isDone = false;
 
   sdk.dart.addAsyncCallback = function() {
     pendingCallbacks++;
@@ -214,14 +214,30 @@
 
   sdk.dart.removeAsyncCallback = function() {
     if (--pendingCallbacks <= 0) {
-      // We might be done with async callbacks. Schedule a microtask to check.
-      Promise.resolve().then(function() {
-        if (pendingCallbacks <= 0) dartPrint('unittest-suite-done');
-      });
+      // We might be done with async callbacks. Schedule a task to check.
+      // Note: can't use a Promise here, because the unhandled rejection event
+      // is fired as a task, rather than a microtask. `setTimeout` will create a
+      // task, giving an unhandled promise reject time to fire before this does.
+      setTimeout(() => {
+        if (pendingCallbacks <= 0 && !isDone) {
+          isDone = true;
+          dartPrint('unittest-suite-done');
+        }
+      }, 0);
     }
   };
-  
-  dartMainRunner($testId.$testId.main);
+
+  dartMainRunner(function testMainWrapper() {
+    // Some callbacks are not scheduled with timers/microtasks, so they don't
+    // go through our async tracking (e.g. DOM events). For those tests, check
+    // if the result of calling `main()` is a Future, and if so, wait for it.
+    let result = $testId.$testId.main();
+    if (sdk.async.Future.is(result)) {
+      sdk.dart.addAsyncCallback();
+      result.whenComplete(sdk.dart.removeAsyncCallback);
+    }
+    return result;
+  });
 });
 </script>
 </body>
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 54dcc46..85c6336 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -146,7 +146,9 @@
       List<String> dart2jsOptions,
       List<String> ddcOptions,
       List<String> args) {
-    return sharedOptions.toList()..addAll(args);
+    return sharedOptions.toList()
+      ..addAll(_configuration.sharedOptions)
+      ..addAll(args);
   }
 
   List<String> computeRuntimeArguments(
@@ -202,6 +204,7 @@
     return args
       ..addAll(vmOptions)
       ..addAll(sharedOptions)
+      ..addAll(_configuration.sharedOptions)
       ..addAll(originalArguments);
   }
 }
@@ -242,7 +245,10 @@
       List<String> dart2jsOptions,
       List<String> ddcOptions,
       List<String> args) {
-    return sharedOptions.toList()..addAll(vmOptions)..addAll(args);
+    return sharedOptions.toList()
+      ..addAll(_configuration.sharedOptions)
+      ..addAll(vmOptions)
+      ..addAll(args);
   }
 
   List<String> computeRuntimeArguments(
@@ -264,6 +270,7 @@
     return args
       ..addAll(vmOptions)
       ..addAll(sharedOptions)
+      ..addAll(_configuration.sharedOptions)
       ..addAll(_replaceDartFiles(originalArguments, artifact.filename));
   }
 }
@@ -351,7 +358,11 @@
       vmOptions, sharedOptions, dart2jsOptions, ddcOptions, args) {
     // The result will be passed as an input to [extractArguments]
     // (i.e. the arguments to the [PipelineCommand]).
-    return <String>[]..addAll(vmOptions)..addAll(sharedOptions)..addAll(args);
+    return <String>[]
+      ..addAll(vmOptions)
+      ..addAll(sharedOptions)
+      ..addAll(_configuration.sharedOptions)
+      ..addAll(args);
   }
 
   List<String> computeRuntimeArguments(
@@ -448,6 +459,7 @@
       List<String> args) {
     return <String>[]
       ..addAll(sharedOptions)
+      ..addAll(_configuration.sharedOptions)
       ..addAll(dart2jsOptions)
       ..addAll(args);
   }
@@ -496,7 +508,9 @@
       List<String> dart2jsOptions,
       List<String> ddcOptions,
       List<String> args) {
-    var result = sharedOptions.toList()..addAll(ddcOptions);
+    var result = sharedOptions.toList()
+      ..addAll(_configuration.sharedOptions)
+      ..addAll(ddcOptions);
     // The file being compiled is the last argument.
     result.add(args.last);
 
@@ -528,6 +542,7 @@
       args.addAll(["--dart-sdk-summary", sdkSummary]);
     }
     args.addAll(sharedOptions);
+    args.addAll(_configuration.sharedOptions);
     if (!useKernel) {
       // TODO(jmesserly): library-root needs to be removed.
       args.addAll(
@@ -808,6 +823,7 @@
     return args
       ..addAll(filterVmOptions(vmOptions))
       ..addAll(sharedOptions)
+      ..addAll(_configuration.sharedOptions)
       ..addAll(originalArguments);
   }
 
@@ -845,6 +861,7 @@
     return args
       ..addAll(vmOptions)
       ..addAll(sharedOptions)
+      ..addAll(_configuration.sharedOptions)
       ..addAll(originalArguments);
   }
 }
@@ -897,6 +914,7 @@
     return args
       ..addAll(vmOptions)
       ..addAll(sharedOptions)
+      ..addAll(_configuration.sharedOptions)
       ..addAll(originalArguments);
   }
 
@@ -925,6 +943,7 @@
     args
       ..addAll(vmOptions)
       ..addAll(sharedOptions)
+      ..addAll(_configuration.sharedOptions)
       ..addAll(_replaceDartFiles(originalArguments, artifact.filename));
     return args;
   }
@@ -1200,6 +1219,7 @@
       List<String> ddcOptions,
       List<String> args) {
     List<String> arguments = new List<String>.from(sharedOptions);
+    arguments.addAll(_configuration.sharedOptions);
     for (String argument in args) {
       if (argument == "--ignore-unrecognized-flags") continue;
       arguments.add(argument);
diff --git a/tools/testing/dart/configuration.dart b/tools/testing/dart/configuration.dart
index 526edff..89ba917 100644
--- a/tools/testing/dart/configuration.dart
+++ b/tools/testing/dart/configuration.dart
@@ -60,6 +60,7 @@
       this.localIP,
       this.keepGeneratedFiles,
       this.dart2jsOptions,
+      this.sharedOptions,
       String packages,
       this.packageRoot,
       this.suiteDirectory,
@@ -147,6 +148,9 @@
   /// Extra VM options passed to the testing script.
   List<String> get vmOptions => configuration.vmOptions;
 
+  /// Extra general options passed to the testing script.
+  final List<String> sharedOptions;
+
   String _packages;
 
   String get packages {
diff --git a/tools/testing/dart/multitest.dart b/tools/testing/dart/multitest.dart
index 319c4b8..258ed6d 100644
--- a/tools/testing/dart/multitest.dart
+++ b/tools/testing/dart/multitest.dart
@@ -130,8 +130,8 @@
             outcomes[annotation.key].add(nextOutcome);
           } else {
             DebugLogger.warning(
-                "Warning: Invalid expectation '$nextOutcome' on line "
-                "$lineCount:\n${annotation.rest} ");
+                "${filePath.toNativePath()}: Invalid expectation "
+                "'$nextOutcome' on line $lineCount: $line");
           }
         }
       }
@@ -152,7 +152,8 @@
       .where((test) => test != 'none' && outcomes[test].isEmpty)
       .toList();
   for (var test in invalidTests) {
-    DebugLogger.warning("Warning: Test $test has no valid expectation.\n"
+    DebugLogger.warning(
+        "${filePath.toNativePath()}: Test $test has no valid expectation. "
         "Expected one of: ${_multitestOutcomes.toString()}");
 
     outcomes.remove(test);
@@ -301,7 +302,8 @@
         // This is just for safety reasons, we don't want to unintentionally
         // clobber files relative to the destination dir when copying them
         // over.
-        print("Relative import in multitest containing '..' is not allowed.");
+        DebugLogger.error("${filePath.toNativePath()}: "
+            "Relative import in multitest containing '..' is not allowed.");
         exit(1);
       }
 
diff --git a/tools/testing/dart/options.dart b/tools/testing/dart/options.dart
index 8593b59..e462b42 100644
--- a/tools/testing/dart/options.dart
+++ b/tools/testing/dart/options.dart
@@ -303,6 +303,7 @@
     new _Option(
         'dart2js_options', 'Extra options for dart2js compilation step.',
         hide: true),
+    new _Option('shared_options', 'Extra shared options.', hide: true),
     new _Option(
         'suite_dir', 'Additional directory to add to the testing matrix.',
         hide: true),
@@ -344,6 +345,7 @@
     'local_ip',
     'output_directory',
     'progress',
+    'repeat',
     'report',
     'safari',
     'shard',
@@ -351,6 +353,7 @@
     'silent_failures',
     'step_name',
     'tasks',
+    'tests',
     'time',
     'verbose',
     'write_debug_log',
@@ -606,6 +609,7 @@
 
     var dart2jsOptions = listOption("dart2js_options");
     var vmOptions = listOption("vm_options");
+    var sharedOptions = listOption("shared_options");
 
     // JSON reporting implies listing and reporting.
     if (data['report_in_json'] as bool) {
@@ -731,6 +735,7 @@
                 testDriverErrorPort: data["test_driver_error_port"] as int,
                 localIP: data["local_ip"] as String,
                 dart2jsOptions: dart2jsOptions,
+                sharedOptions: sharedOptions,
                 packages: data["packages"] as String,
                 packageRoot: data["package_root"] as String,
                 suiteDirectory: data["suite_dir"] as String,
diff --git a/tools/testing/dart/test_controller.js b/tools/testing/dart/test_controller.js
index 8a82fce..8515ddf 100644
--- a/tools/testing/dart/test_controller.js
+++ b/tools/testing/dart/test_controller.js
@@ -103,6 +103,17 @@
   notifyDone('FAIL');
 };
 
+window.onunhandledrejection = function (e) {
+  var reason = e.reason != null ? e.reason.stack : null;
+  var message = ('window.onunhandledrejection called: \n\n' + reason + '\n\n');
+  if (testExpectsGlobalError) {
+    testSuppressedGlobalErrors.push({message: message});
+    return;
+  }
+  recordEvent('window_onerror', message);
+  notifyDone('FAIL');
+};
+
 var waitForDone = false;
 
 var driverWindowCached = false;
diff --git a/tools/testing/dart/test_progress.dart b/tools/testing/dart/test_progress.dart
index 29117e8..25dd879 100644
--- a/tools/testing/dart/test_progress.dart
+++ b/tools/testing/dart/test_progress.dart
@@ -128,6 +128,9 @@
         test.result == Expectation.crash &&
         test.lastCommandExecuted is ProcessCommand &&
         test.lastCommandOutput.hasCoreDump) {
+      final mode = test.configuration.mode.name;
+      final arch = test.configuration.architecture.name;
+
       var pid = "${test.lastCommandOutput.pid}";
       var lastCommand = test.lastCommandExecuted as ProcessCommand;
 
@@ -139,13 +142,11 @@
       // To simplify the archiving code we simply copy binaries into current
       // folder next to core dumps and name them
       // `binary.${mode}_${arch}_${binary_name}`.
-      var binName = lastCommand.executable;
-      var binFile = new File(binName);
-      var binBaseName = new Path(binName).filename;
+      final binName = lastCommand.executable;
+      final binFile = new File(binName);
+      final binBaseName = new Path(binName).filename;
       if (!archivedBinaries.containsKey(binName) && binFile.existsSync()) {
-        var mode = test.configuration.mode.name;
-        var arch = test.configuration.architecture.name;
-        var archived = "binary.${mode}_${arch}_${binBaseName}";
+        final archived = "binary.${mode}_${arch}_${binBaseName}";
         TestUtils.copyFile(new Path(binName), new Path(archived));
         // On Windows also copy PDB file for the binary.
         if (Platform.isWindows) {
@@ -157,14 +158,31 @@
         archivedBinaries[binName] = archived;
       }
 
-      if (archivedBinaries.containsKey(binName)) {
+      final kernelServiceBaseName = 'kernel-service.dart.snapshot';
+      final kernelService =
+          new File('${binFile.parent.path}/$kernelServiceBaseName');
+      if (!archivedBinaries.containsKey(kernelService) &&
+          kernelService.existsSync()) {
+        final archived = "binary.${mode}_${arch}_${kernelServiceBaseName}";
+        TestUtils.copyFile(new Path(kernelService.path), new Path(archived));
+        archivedBinaries[kernelServiceBaseName] = archived;
+      }
+
+      final binaryPath = archivedBinaries[binName];
+      if (binaryPath != null) {
+        final binaries = <String>[binaryPath];
+        final kernelServiceBinaryPath = archivedBinaries[kernelServiceBaseName];
+        if (kernelServiceBinaryPath != null) {
+          binaries.add(kernelServiceBinaryPath);
+        }
+
         // We have found and copied the binary.
         RandomAccessFile unexpectedCrashesFile;
         try {
           unexpectedCrashesFile =
               new File('unexpected-crashes').openSync(mode: FileMode.append);
           unexpectedCrashesFile.writeStringSync(
-              "${test.displayName},${pid},${archivedBinaries[binName]}\n");
+              "${test.displayName},${pid},${binaries.join(',')}\n");
         } catch (e) {
           print('Failed to add crash to unexpected-crashes list: ${e}');
         } finally {
diff --git a/tools/upload_abi_dills.sh b/tools/upload_abi_dills.sh
new file mode 100755
index 0000000..166acc1
--- /dev/null
+++ b/tools/upload_abi_dills.sh
@@ -0,0 +1,60 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Uploads the following dill files to CIPD, indexed by the current ABI version:
+#   $build_dir/vm_platform_strong.dill
+#   $build_dir/gen/kernel_service.dill
+#   $build_dir/gen_kernel_bytecode.dill
+# This script is a no-op unless $BUILDBOT_BUILDERNAME is "dart-sdk-linux-be".
+# It's also a no-op if dill files were already uploaded today.
+set -e
+set -x
+
+if [ -z "$2" ]; then
+  echo "Usage: upload_abi_dills.sh version_file build_dir"
+  exit 1
+fi
+
+if [ "$BUILDBOT_BUILDERNAME" != "dart-sdk-linux-be" ]; then
+  echo "This script only works on the dart-sdk-linux-be buildbot"
+  exit 0
+fi
+
+abi_version=$(sed -n "s/^ABI_VERSION \([0-9]*\)$/\1/p" "$1")
+git_revision=$(git rev-parse HEAD)
+current_date=$(date +%F)
+search_results=$(cipd search \
+  "dart/abiversions/$abi_version" \
+  -tag "date:$current_date" | grep "Instances:" || echo "")
+
+if [ ! -z "$search_results" ]; then
+  exit 0
+fi
+
+sdk_dir=$(pwd)
+tmpdir=$(mktemp -d)
+chmod 755 $tmpdir
+cleanup() {
+  rm -rf "$tmpdir"
+}
+trap cleanup EXIT HUP INT QUIT TERM PIPE
+pushd "$tmpdir"
+
+mkdir abiversions
+cp "$sdk_dir/$2/vm_platform_strong.dill" "abiversions/vm_platform_strong.dill"
+cp "$sdk_dir/$2/gen/kernel_service.dill" "abiversions/kernel_service.dill"
+
+cipd create \
+  -name dart/abiversions/$abi_version \
+  -in abiversions \
+  -install-mode copy \
+  -tag version:$abi_version \
+  -tag date:$current_date \
+  -tag git_revision:$git_revision \
+  -ref latest \
+  -ref version_$abi_version
+
+popd
diff --git a/tools/utils.py b/tools/utils.py
index ac9dcbf..a897eb1 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -43,13 +43,15 @@
 
 class Version(object):
   def __init__(self, channel, major, minor, patch, prerelease,
-               prerelease_patch):
+               prerelease_patch, abi_version, oldest_supported_abi_version):
     self.channel = channel
     self.major = major
     self.minor = minor
     self.patch = patch
     self.prerelease = prerelease
     self.prerelease_patch = prerelease_patch
+    self.abi_version = abi_version
+    self.oldest_supported_abi_version = oldest_supported_abi_version
 
 
 # Try to guess the host operating system.
@@ -385,6 +387,16 @@
   return os.environ.get(key, '')
 
 
+def GetAbiVersion():
+  version = ReadVersionFile()
+  return version.abi_version
+
+
+def GetOldestSupportedAbiVersion():
+  version = ReadVersionFile()
+  return version.oldest_supported_abi_version
+
+
 def ReadVersionFile():
   def match_against(pattern, file_content):
     match = re.search(pattern, file_content, flags=re.MULTILINE)
@@ -406,10 +418,15 @@
   patch = match_against('^PATCH (\d+)$', content)
   prerelease = match_against('^PRERELEASE (\d+)$', content)
   prerelease_patch = match_against('^PRERELEASE_PATCH (\d+)$', content)
+  abi_version = match_against('^ABI_VERSION (\d+)$', content)
+  oldest_supported_abi_version = match_against(
+      '^OLDEST_SUPPORTED_ABI_VERSION (\d+)$', content)
 
-  if channel and major and minor and prerelease and prerelease_patch:
+  if channel and major and minor and prerelease and prerelease_patch and \
+      abi_version and oldest_supported_abi_version:
     return Version(
-        channel, major, minor, patch, prerelease, prerelease_patch)
+        channel, major, minor, patch, prerelease, prerelease_patch, abi_version,
+        oldest_supported_abi_version)
   else:
     print "Warning: VERSION file (%s) has wrong format" % VERSION_FILE
     return None
@@ -734,13 +751,13 @@
 
 
 class UnexpectedCrash(object):
-  def __init__(self, test, pid, binary):
+  def __init__(self, test, pid, *binaries):
     self.test = test
     self.pid = pid
-    self.binary = binary
+    self.binaries = binaries
 
   def __str__(self):
-    return "Crash(%s: %s %s)" % (self.test, self.binary, self.pid)
+    return "Crash(%s: %s %s)" % (self.test, self.pid, ', '.join(self.binaries))
 
 
 class PosixCoreDumpEnabler(object):
@@ -854,7 +871,7 @@
     files = set()
     missing = []
     for crash in crashes:
-      files.add(crash.binary)
+      files.update(crash.binaries)
       core = self._find_coredump_file(crash)
       if core:
         files.add(core)
@@ -955,7 +972,7 @@
   def _find_unexpected_crashes(self):
     """Load coredumps file. Each line has the following format:
 
-        test-name,pid,binary-file
+        test-name,pid,binary-file1,binary-file2,...
     """
     try:
       with open(BaseCoreDumpArchiver._UNEXPECTED_CRASHES_FILE) as f:
diff --git a/utils/application_snapshot.gni b/utils/application_snapshot.gni
index 67749bb..e577331 100644
--- a/utils/application_snapshot.gni
+++ b/utils/application_snapshot.gni
@@ -197,11 +197,6 @@
   if (defined(invoker.inputs)) {
     extra_inputs += invoker.inputs
   }
-  if (defined(invoker.dot_packages)) {
-    dot_packages = invoker.dot_packages
-  } else {
-    dot_packages = rebase_path("$_dart_root/.packages")
-  }
   output = "$root_gen_dir/$name.dart.S"
   if (defined(invoker.output)) {
     output = invoker.output
@@ -220,7 +215,6 @@
 
     vm_args = [
       "--deterministic",
-      "--packages=$dot_packages",
       "--snapshot-kind=app-aot-assembly",
       "--assembly=$abs_output",
     ] + aot_vm_args
diff --git a/utils/compile_platform.gni b/utils/compile_platform.gni
index 94bce50..1d30b6f 100644
--- a/utils/compile_platform.gni
+++ b/utils/compile_platform.gni
@@ -34,6 +34,11 @@
         invoker.add_implicit_vm_platform_dependency
   }
 
+  outline = "vm_outline_strong.dill"
+  if (defined(invoker.outline)) {
+    outline = invoker.outline
+  }
+
   prebuilt_dart_action(target_name) {
     script = "$_dart_root/pkg/front_end/tool/_fasta/compile_platform.dart"
 
@@ -44,7 +49,6 @@
     inputs = []
     deps = []
     args = []
-
     if (defined(invoker.deps)) {
       deps += invoker.deps
     }
@@ -54,7 +58,7 @@
     }
 
     if (add_implicit_vm_platform_dependency) {
-      inputs += [ "$root_out_dir/vm_outline_strong.dill" ]
+      inputs += [ "$root_out_dir/$outline" ]
       deps += [ "$_dart_root/runtime/vm:vm_platform" ]
     }
     depfile = outputs[0] + ".d"
@@ -73,7 +77,7 @@
           [ rebase_path(invoker.libraries_specification_uri, root_build_dir) ]
     }
     args +=
-        [ rebase_path("$root_out_dir/vm_outline_strong.dill", root_build_dir) ]
+        [ rebase_path("$root_out_dir/$outline", root_build_dir) ]
     args += rebase_path(outputs, root_build_dir)
   }
 }
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 039604a..767bdb9 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -19,8 +19,7 @@
     rebase_path("../../sdk"),
     "--dart-sdk-summary",
     rebase_path(sdk_summary),
-    "--library-root",
-    rebase_path("../../pkg/dev_compiler"),
+    "-k",
     "-o",
     "dartdevc.js",
     rebase_path("../../pkg/dev_compiler/bin/dartdevc.dart"),
@@ -347,6 +346,6 @@
     "--output",
     rebase_path(sdk_dill),
     "--libraries",
-    rebase_path("//sdk/lib/libraries.json"),
+    rebase_path("../../sdk/lib/libraries.json"),
   ]
 }
diff --git a/utils/kernel-service/BUILD.gn b/utils/kernel-service/BUILD.gn
index 3d9a72a..e20ade7 100644
--- a/utils/kernel-service/BUILD.gn
+++ b/utils/kernel-service/BUILD.gn
@@ -62,8 +62,8 @@
 
 prebuilt_dart_action("kernel_service_dill") {
   deps = [
-    "../../runtime/vm:vm_platform",
     "../../runtime/vm:kernel_platform_files($dart_host_toolchain)",
+    "../../runtime/vm:vm_platform",
   ]
   kernel_service_script = "../../pkg/vm/bin/kernel_service.dart"
   gen_kernel_script = "../../pkg/vm/bin/gen_kernel.dart"
@@ -80,7 +80,7 @@
 
   depfile = "$root_gen_dir/kernel_service_dill.d"
   abs_depfile = rebase_path(depfile)
-  rebased_output = rebase_path(output, root_out_dir)
+  rebased_output = rebase_path(output, root_build_dir)
   vm_args = [
     "--depfile=$abs_depfile",
     "--depfile_output_filename=$rebased_output",