Version 2.11.0-277.0.dev

Merge commit '619e388a1d8ba8263b93cd4e9e5e6c98a00fe0f2' into 'dev'
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 4fb7696..f30ff8e 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 0.41.0 (Not yet released - breaking changes)
+* Replaced `Scope.lookup({id, setter})` with `lookup(id)`.
+* Deprecated `Scope.lookup2(id)`, use `lookup()` instead.
+* Removed deprecated `Member.baseElement`.
+* Removed deprecated `package:analyzer/analyzer.dart` library.
+* Removed deprecated `ElementAnnotation.constantValue`.
+* Removed deprecated `VariableElement.constantValue`.
+* Removed deprecated `VariableElement.initializer`.
+* Removed deprecated `auxiliaryElements`.
+* The value of`FunctionType.element` for types created from a `typedef`
+  is now `FunctionTypeAliasElement`, not its function element.
+* Removed deprecated `GenericTypeAliasElement`.
+
 ## 0.40.5
 * Deprecated `GenericTypeAliasElement`. Use `FunctionTypeAliasElement`.
 * Read imports, exports, and parts on demand in `AnalysisDriver`.
diff --git a/pkg/analyzer/lib/analyzer.dart b/pkg/analyzer/lib/analyzer.dart
deleted file mode 100644
index c38b4a3..0000000
--- a/pkg/analyzer/lib/analyzer.dart
+++ /dev/null
@@ -1,191 +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.
-
-/// This library is no longer supported, but most of the functionality it
-/// provides is available through supported analyzer APIs.  See specific methods
-/// below for more information about their supported replacements.
-@Deprecated('See package:analyzer/analyzer.dart file for details')
-library analyzer;
-
-import 'dart:io';
-
-import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/dart/scanner/reader.dart';
-import 'package:analyzer/src/dart/scanner/scanner.dart';
-import 'package:analyzer/src/error.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
-import 'package:analyzer/src/generated/parser.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/string_source.dart';
-import 'package:path/path.dart' as pathos;
-
-export 'package:analyzer/dart/ast/ast.dart';
-export 'package:analyzer/dart/ast/visitor.dart';
-export 'package:analyzer/error/error.dart';
-export 'package:analyzer/error/listener.dart';
-export 'package:analyzer/src/dart/ast/utilities.dart';
-export 'package:analyzer/src/error.dart';
-export 'package:analyzer/src/error/codes.dart';
-export 'package:analyzer/src/generated/utilities_dart.dart';
-
-/// Parses a string of Dart code into an AST.
-///
-/// If [name] is passed, it's used in error messages as the name of the code
-/// being parsed.
-///
-/// Throws an [AnalyzerErrorGroup] if any errors occurred, unless
-/// [suppressErrors] is `true`, in which case any errors are discarded.
-///
-/// If [parseFunctionBodies] is [false] then only function signatures will be
-/// parsed.  (Currently broken; function bodies are always parsed).
-///
-/// Deprecated - please use the `parseString` function
-/// (from package:analyzer/dart/analysis/utilities.dart) instead.
-///
-/// Note that `parseString` does not support the `parseFunctionBodies` option;
-/// callers that don't require function bodies should simply ignore them.
-@Deprecated('Please use parseString instead')
-CompilationUnit parseCompilationUnit(String contents,
-    {String name,
-    bool suppressErrors = false,
-    bool parseFunctionBodies = true,
-    FeatureSet featureSet}) {
-  // TODO(paulberry): make featureSet a required parameter
-  featureSet ??= FeatureSet.fromEnableFlags([]);
-  Source source = StringSource(contents, name);
-  return _parseSource(contents, source, featureSet,
-      suppressErrors: suppressErrors, parseFunctionBodies: parseFunctionBodies);
-}
-
-/// Parses a Dart file into an AST.
-///
-/// Throws an [AnalyzerErrorGroup] if any errors occurred, unless
-/// [suppressErrors] is `true`, in which case any errors are discarded.
-///
-/// If [parseFunctionBodies] is [false] then only function signatures will be
-/// parsed.  (Currently broken; function bodies are always parsed).
-///
-/// Deprecated - please use the `parseFile` function
-/// (from package:analyzer/dart/analysis/utilities.dart) instead.
-///
-/// Note that `parseFile` does not support the `parseFunctionBodies` option;
-/// callers that don't require function bodies should simply ignore them.
-@Deprecated('Please use parseFile instead')
-CompilationUnit parseDartFile(String path,
-    {bool suppressErrors = false,
-    bool parseFunctionBodies = true,
-    FeatureSet featureSet}) {
-  // TODO(paulberry): Make featureSet a required parameter
-  featureSet ??= FeatureSet.fromEnableFlags([]);
-  String contents = File(path).readAsStringSync();
-  var sourceFactory =
-      SourceFactory([ResourceUriResolver(PhysicalResourceProvider.INSTANCE)]);
-
-  var absolutePath = pathos.absolute(path);
-  var source = sourceFactory.forUri(pathos.toUri(absolutePath).toString());
-  if (source == null) {
-    throw ArgumentError("Can't get source for path $path");
-  }
-  if (!source.exists()) {
-    throw ArgumentError("Source $source doesn't exist");
-  }
-
-  return _parseSource(contents, source, featureSet,
-      suppressErrors: suppressErrors, parseFunctionBodies: parseFunctionBodies);
-}
-
-/// Parses the script tag and directives in a string of Dart code into an AST.
-/// (Currently broken; the entire file is parsed).
-///
-/// Stops parsing when the first non-directive is encountered. The rest of the
-/// string will not be parsed.
-///
-/// If [name] is passed, it's used in error messages as the name of the code
-/// being parsed.
-///
-/// Throws an [AnalyzerErrorGroup] if any errors occurred, unless
-/// [suppressErrors] is `true`, in which case any errors are discarded.
-///
-/// Deprecated - please use the `parseString` function
-/// (from package:analyzer/dart/analysis/utilities.dart) instead.
-///
-/// Note that `parseString` parses the whole file; callers that only require
-/// directives should simply ignore the rest of the parse result.
-@Deprecated('Please use parseString instead')
-CompilationUnit parseDirectives(String contents,
-    {String name, bool suppressErrors = false, FeatureSet featureSet}) {
-  // TODO(paulberry): make featureSet a required parameter.
-  featureSet ??= FeatureSet.fromEnableFlags([]);
-  var source = StringSource(contents, name);
-  var errorCollector = _ErrorCollector();
-  var reader = CharSequenceReader(contents);
-  var scanner = Scanner(source, reader, errorCollector)
-    ..configureFeatures(
-      featureSetForOverriding: featureSet,
-      featureSet: featureSet,
-    );
-  var token = scanner.tokenize();
-  var parser = Parser(
-    source,
-    errorCollector,
-    featureSet: featureSet,
-  );
-  var unit = parser.parseDirectives(token);
-  unit.lineInfo = LineInfo(scanner.lineStarts);
-
-  if (errorCollector.hasErrors && !suppressErrors) throw errorCollector.group;
-
-  return unit;
-}
-
-/// Converts an AST node representing a string literal into a [String].
-@Deprecated('Please use StringLiteral.stringValue instead')
-String stringLiteralToString(StringLiteral literal) {
-  return literal.stringValue;
-}
-
-CompilationUnit _parseSource(
-    String contents, Source source, FeatureSet featureSet,
-    {bool suppressErrors = false, bool parseFunctionBodies = true}) {
-  var reader = CharSequenceReader(contents);
-  var errorCollector = _ErrorCollector();
-  var scanner = Scanner(source, reader, errorCollector)
-    ..configureFeatures(
-      featureSetForOverriding: featureSet,
-      featureSet: featureSet,
-    );
-  var token = scanner.tokenize();
-  var parser = Parser(
-    source,
-    errorCollector,
-    featureSet: featureSet,
-  )..parseFunctionBodies = parseFunctionBodies;
-  var unit = parser.parseCompilationUnit(token)
-    ..lineInfo = LineInfo(scanner.lineStarts);
-
-  if (errorCollector.hasErrors && !suppressErrors) throw errorCollector.group;
-
-  return unit;
-}
-
-/// A simple error listener that collects errors into an [AnalyzerErrorGroup].
-class _ErrorCollector extends AnalysisErrorListener {
-  final _errors = <AnalysisError>[];
-
-  _ErrorCollector();
-
-  /// The group of errors collected.
-  AnalyzerErrorGroup get group =>
-      AnalyzerErrorGroup.fromAnalysisErrors(_errors);
-
-  /// Whether any errors where collected.
-  bool get hasErrors => _errors.isNotEmpty;
-
-  @override
-  void onError(AnalysisError error) => _errors.add(error);
-}
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index aa20e8b..7ee7034 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -38,7 +38,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/element/element.dart' show AuxiliaryElements;
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart' show LineInfo, Source;
 import 'package:analyzer/src/generated/utilities_dart.dart';
@@ -3235,23 +3234,6 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class IndexExpression
     implements NullShortableExpression, MethodReferenceExpression {
-  /// Return the auxiliary elements associated with this identifier, or `null`
-  /// if this identifier is not in both a getter and setter context.
-  ///
-  /// The auxiliary elements hold the static and propagated elements associated
-  /// with the getter context.
-  // TODO(brianwilkerson) Replace this API.
-  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
-      'CompoundAssignmentExpression.writeElement')
-  AuxiliaryElements get auxiliaryElements;
-
-  /// Set the auxiliary elements associated with this identifier to the given
-  /// [elements].
-  // TODO(brianwilkerson) Replace this API.
-  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
-      'CompoundAssignmentExpression.writeElement')
-  set auxiliaryElements(AuxiliaryElements elements);
-
   /// Return the expression used to compute the index.
   Expression get index;
 
@@ -4597,23 +4579,6 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class SimpleIdentifier implements Identifier {
-  /// Return the auxiliary elements associated with this identifier, or `null`
-  /// if this identifier is not in both a getter and setter context.
-  ///
-  /// The auxiliary elements hold the static and propagated elements associated
-  /// with the getter context.
-  // TODO(brianwilkerson) Replace this API.
-  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
-      'CompoundAssignmentExpression.writeElement')
-  AuxiliaryElements get auxiliaryElements;
-
-  /// Set the auxiliary elements associated with this identifier to the given
-  /// [elements].
-  // TODO(brianwilkerson) Replace this API.
-  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
-      'CompoundAssignmentExpression.writeElement')
-  set auxiliaryElements(AuxiliaryElements elements);
-
   /// Return `true` if this identifier is the "name" part of a prefixed
   /// identifier or a method invocation.
   bool get isQualified;
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 4e47272..be7a1eb 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -691,12 +691,6 @@
   /// produced but no errors were generated, then the list will be empty.
   List<AnalysisError> get constantEvaluationErrors;
 
-  /// Return a representation of the value of this annotation, or `null` if the
-  /// value of this annotation has not been computed or if the value could not
-  /// be computed because of errors.
-  @Deprecated('Use computeConstantValue() instead')
-  DartObject get constantValue;
-
   /// Return the element referenced by this annotation.
   ///
   /// In valid code this element can be a [PropertyAccessorElement] getter
@@ -1199,12 +1193,6 @@
 /// Clients may not extend, implement, or mix-in this class.
 abstract class GenericFunctionTypeElement implements FunctionTypedElement {}
 
-/// A synonym for [FunctionTypeAliasElement].
-///
-/// Clients may not extend, implement, or mix-in this class.
-@Deprecated('Use FunctionTypeAliasElement instead')
-abstract class GenericTypeAliasElement implements FunctionTypeAliasElement {}
-
 /// A combinator that causes some of the names in a namespace to be hidden when
 /// being imported.
 ///
@@ -1755,14 +1743,6 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class VariableElement implements Element, ConstantEvaluationTarget {
-  /// Return a representation of the value of this variable.
-  ///
-  /// Return `null` if either this variable was not declared with the 'const'
-  /// modifier or if the value of this variable could not be computed because of
-  /// errors.
-  @Deprecated('Use computeConstantValue() instead')
-  DartObject get constantValue;
-
   @override
   VariableElement get declaration;
 
@@ -1770,13 +1750,6 @@
   /// specified for it.
   bool get hasImplicitType;
 
-  /// Return a synthetic function representing this variable's initializer, or
-  /// `null` if this variable does not have an initializer. The function will
-  /// have no parameters. The return type of the function will be the
-  /// compile-time type of the initialization expression.
-  @deprecated
-  FunctionElement get initializer;
-
   /// Return `true` if this variable was declared with the 'const' modifier.
   bool get isConst;
 
diff --git a/pkg/analyzer/lib/dart/element/scope.dart b/pkg/analyzer/lib/dart/element/scope.dart
index ee35529..2129a4e 100644
--- a/pkg/analyzer/lib/dart/element/scope.dart
+++ b/pkg/analyzer/lib/dart/element/scope.dart
@@ -3,20 +3,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/element/element.dart';
-import 'package:meta/meta.dart';
 
 /// Scopes are used to resolve names to elements.
 abstract class Scope {
-  /// Return the element with the name `id` or `id=` (if [setter] is `true`),
-  /// `null` if the name is not defined within this scope.
-  @Deprecated('Use lookup2() that is closer to the language specification')
-  Element lookup({@required String id, @required bool setter});
+  /// Return the result of lexical lookup for the given [id], not `null`.
+  ///
+  /// Getters and setters are bundled, when we found one or another, we are
+  /// done with the lookup, and return both the getter and the setter, if
+  /// available.
+  ScopeLookupResult lookup(String id);
 
   /// Return the result of lexical lookup for the given [id], not `null`.
   ///
   /// Getters and setters are bundled, when we found one or another, we are
   /// done with the lookup, and return both the getter and the setter, if
   /// available.
+  @Deprecated('Use lookup() instead')
   ScopeLookupResult lookup2(String id);
 }
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index d614322..428ee8a 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -15,7 +15,6 @@
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/dart/ast/to_source_visitor.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/fasta/token_utils.dart' as util show findPrevious;
 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
 import 'package:analyzer/src/generated/engine.dart';
@@ -5814,14 +5813,6 @@
   @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.
-  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
-      'CompoundAssignmentExpression.writeElement')
-  @override
-  AuxiliaryElements auxiliaryElements;
-
   /// Initialize a newly created index expression that is a child of a cascade
   /// expression.
   IndexExpressionImpl.forCascade(this.period, this.question, this.leftBracket,
@@ -8834,14 +8825,6 @@
   /// 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.
-  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
-      'CompoundAssignmentExpression.writeElement')
-  @override
-  AuxiliaryElements auxiliaryElements;
-
   @override
   List<DartType> tearOffTypeArgumentTypes;
 
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 4a4bd24..3648e1e 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -4738,8 +4738,6 @@
         _isEqualTokens(node.leftBracket, toNode.leftBracket),
         _isEqualNodes(node.index, toNode.index),
         _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
-      // ignore: deprecated_member_use_from_same_package
-      toNode.auxiliaryElements = node.auxiliaryElements;
       toNode.staticElement = node.staticElement;
       toNode.staticType = node.staticType;
       return true;
@@ -5137,8 +5135,6 @@
     if (_isEqualTokens(node.token, toNode.token)) {
       toNode.staticElement = node.staticElement;
       toNode.staticType = node.staticType;
-      // ignore: deprecated_member_use_from_same_package
-      toNode.auxiliaryElements = node.auxiliaryElements;
       (toNode as SimpleIdentifierImpl).tearOffTypeArgumentTypes =
           node.tearOffTypeArgumentTypes;
       return true;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 990cac0..edbdcfa 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -439,17 +439,6 @@
   }
 }
 
-/// For AST nodes that could be in both the getter and setter contexts
-/// ([IndexExpression]s and [SimpleIdentifier]s), the additional resolved
-/// element (getter) is stored in the AST node, in an [AuxiliaryElements].
-class AuxiliaryElements {
-  /// The element based on static type information, or `null` if the AST
-  /// structure has not been resolved or if the node could not be resolved.
-  final ExecutableElement staticElement;
-
-  AuxiliaryElements(this.staticElement);
-}
-
 /// An [AbstractClassElementImpl] which is a class.
 class ClassElementImpl extends AbstractClassElementImpl
     with TypeParameterizedElementMixin {
@@ -2422,10 +2411,6 @@
   List<AnalysisError> get constantEvaluationErrors =>
       evaluationResult?.errors ?? const <AnalysisError>[];
 
-  @Deprecated('Use computeConstantValue() instead')
-  @override
-  DartObject get constantValue => evaluationResult?.value;
-
   @override
   AnalysisContext get context => compilationUnit.library.context;
 
@@ -4440,11 +4425,8 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class FunctionTypeAliasElementImpl extends ElementImpl
-    with
-        TypeParameterizedElementMixin
-    implements
-        // ignore: deprecated_member_use_from_same_package
-        GenericTypeAliasElement {
+    with TypeParameterizedElementMixin
+    implements FunctionTypeAliasElement {
   /// The element representing the generic function type.
   GenericFunctionTypeElementImpl _function;
 
@@ -6284,24 +6266,6 @@
     return linkedNode != null && linkedContext.hasInitializer(linkedNode);
   }
 
-  @deprecated
-  @override
-  FunctionElement get initializer {
-    if (hasInitializer) {
-      return FunctionElementImpl('', -1)
-        ..enclosingElement = this
-        ..isSynthetic = true
-        ..returnType = type
-        .._type = FunctionTypeImpl(
-          typeFormals: const [],
-          parameters: const [],
-          returnType: type,
-          nullabilitySuffix: NullabilitySuffix.star,
-        );
-    }
-    return null;
-  }
-
   @override
   String get name {
     if (linkedNode != null) {
@@ -7627,10 +7591,6 @@
   /// initializers.
   Expression get constantInitializer => null;
 
-  @Deprecated('Use computeConstantValue() instead')
-  @override
-  DartObject get constantValue => evaluationResult?.value;
-
   @override
   VariableElement get declaration => this;
 
@@ -7659,10 +7619,6 @@
     setModifier(Modifier.IMPLICIT_TYPE, hasImplicitType);
   }
 
-  @deprecated
-  @override
-  FunctionElement get initializer => null;
-
   @override
   bool get isConst {
     if (linkedNode != null) {
@@ -7718,11 +7674,4 @@
 
   @override
   DartObject computeConstantValue() => null;
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    super.visitChildren(visitor);
-    // ignore: deprecated_member_use_from_same_package
-    initializer?.accept(visitor);
-  }
 }
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index db5240f..9816e56 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -34,10 +34,6 @@
   ) : super(typeProvider, declaration, substitution, isLegacy,
             const <TypeParameterElement>[]);
 
-  @deprecated
-  @override
-  ConstructorElement get baseElement => declaration;
-
   @override
   ConstructorElement get declaration => super.declaration as ConstructorElement;
 
@@ -152,10 +148,6 @@
     this.typeParameters,
   ) : super(typeProvider, declaration, substitution, isLegacy);
 
-  @deprecated
-  @override
-  ExecutableElement get baseElement => declaration;
-
   @override
   ExecutableElement get declaration => super.declaration as ExecutableElement;
 
@@ -334,10 +326,6 @@
     bool isLegacy,
   ) : super(typeProvider, declaration, substitution, isLegacy);
 
-  @deprecated
-  @override
-  FieldElement get baseElement => declaration;
-
   @override
   FieldElement get declaration => super.declaration as FieldElement;
 
@@ -458,10 +446,6 @@
     }
   }
 
-  /// Return the element on which the parameterized element was created.
-  @Deprecated('Use Element.declaration instead')
-  Element get baseElement => _declaration;
-
   @override
   AnalysisContext get context => _declaration.context;
 
@@ -732,10 +716,6 @@
     List<TypeParameterElement> typeParameters,
   ) : super(typeProvider, declaration, substitution, isLegacy, typeParameters);
 
-  @deprecated
-  @override
-  MethodElement get baseElement => declaration;
-
   @override
   MethodElement get declaration => super.declaration as MethodElement;
 
@@ -813,10 +793,6 @@
     this.typeParameters,
   ) : super(typeProvider, declaration, substitution, isLegacy);
 
-  @deprecated
-  @override
-  ParameterElement get baseElement => declaration;
-
   @override
   ParameterElement get declaration => super.declaration as ParameterElement;
 
@@ -903,10 +879,6 @@
     List<TypeParameterElement> typeParameters,
   ) : super(typeProvider, declaration, substitution, isLegacy, typeParameters);
 
-  @deprecated
-  @override
-  PropertyAccessorElement get baseElement => declaration;
-
   @override
   PropertyAccessorElement get correspondingGetter {
     var baseGetter = declaration.correspondingGetter;
@@ -1044,14 +1016,6 @@
     bool isLegacy,
   ) : super(typeProvider, declaration, substitution, isLegacy);
 
-  @deprecated
-  @override
-  VariableElement get baseElement => declaration;
-
-  @Deprecated('Use computeConstantValue() instead')
-  @override
-  DartObject get constantValue => declaration.constantValue;
-
   @override
   VariableElement get declaration => super.declaration as VariableElement;
 
@@ -1059,16 +1023,6 @@
   bool get hasImplicitType => declaration.hasImplicitType;
 
   @override
-  FunctionElement get initializer {
-    //
-    // Elements within this element should have type parameters substituted,
-    // just like this element.
-    //
-    throw UnsupportedError('initializer');
-    //    return getBaseElement().getInitializer();
-  }
-
-  @override
   bool get isConst => declaration.isConst;
 
   @override
@@ -1099,13 +1053,6 @@
 
   @override
   DartObject computeConstantValue() => declaration.computeConstantValue();
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    super.visitChildren(visitor);
-    // ignore: deprecated_member_use_from_same_package
-    declaration.initializer?.accept(visitor);
-  }
 }
 
 class _SubstitutedTypeParameters {
diff --git a/pkg/analyzer/lib/src/dart/element/scope.dart b/pkg/analyzer/lib/src/dart/element/scope.dart
index 2bcc9f2..2e1daa0 100644
--- a/pkg/analyzer/lib/src/dart/element/scope.dart
+++ b/pkg/analyzer/lib/src/dart/element/scope.dart
@@ -35,22 +35,21 @@
 
   Scope get parent => _parent;
 
-  @Deprecated('Use lookup2() that is closer to the language specification')
   @override
-  Element lookup({@required String id, @required bool setter}) {
-    var result = lookup2(id);
-    return setter ? result.setter : result.getter;
-  }
-
-  @override
-  ScopeLookupResult lookup2(String id) {
+  ScopeLookupResult lookup(String id) {
     var getter = _getters[id];
     var setter = _setters[id];
     if (getter != null || setter != null) {
       return ScopeLookupResult(getter, setter);
     }
 
-    return _parent.lookup2(id);
+    return _parent.lookup(id);
+  }
+
+  @Deprecated('Use lookup() instead')
+  @override
+  ScopeLookupResult lookup2(String id) {
+    return lookup(id);
   }
 
   void _addGetter(Element element) {
@@ -208,15 +207,8 @@
     }
   }
 
-  @Deprecated('Use lookup2() that is closer to the language specification')
   @override
-  Element lookup({@required String id, @required bool setter}) {
-    var result = lookup2(id);
-    return setter ? result.setter : result.getter;
-  }
-
-  @override
-  ScopeLookupResult lookup2(String id) {
+  ScopeLookupResult lookup(String id) {
     if (_deferredLibrary != null && id == FunctionElement.LOAD_LIBRARY_NAME) {
       return ScopeLookupResult(_deferredLibrary.loadLibraryFunction, null);
     }
@@ -226,6 +218,12 @@
     return ScopeLookupResult(getter, setter);
   }
 
+  @Deprecated('Use lookup() instead')
+  @override
+  ScopeLookupResult lookup2(String id) {
+    return lookup(id);
+  }
+
   void _add(Element element) {
     if (element is PropertyAccessorElement && element.isSetter) {
       _addTo(map: _setters, element: element);
@@ -323,14 +321,14 @@
     }.toList();
   }
 
-  @Deprecated('Use lookup2() that is closer to the language specification')
   @override
-  Element lookup({@required String id, @required bool setter}) {
-    throw UnimplementedError();
+  ScopeLookupResult lookup(String id) {
+    return _nullPrefixScope.lookup(id);
   }
 
+  @Deprecated('Use lookup() instead')
   @override
   ScopeLookupResult lookup2(String id) {
-    return _nullPrefixScope.lookup2(id);
+    return lookup(id);
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index 6fd621d..ebe7c47 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -70,12 +70,6 @@
     _resolver.migrationResolutionHooks
         ?.setCompoundAssignmentExpressionTypes(node);
 
-    _resolver.setAssignmentBackwardCompatibility(
-      assignment: node,
-      left: left,
-      hasRead: hasRead,
-    );
-
     _resolveOperator(node);
 
     {
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
index 40f9dcf..9daaea2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -32,7 +32,7 @@
         // This isn't a constructor invocation because it's in a cascade.
         return node;
       }
-      Element element = nameScope.lookup2(methodName.name).getter;
+      Element element = nameScope.lookup(methodName.name).getter;
       if (element is ClassElement) {
         TypeName typeName = astFactory.typeName(methodName, node.typeArguments);
         ConstructorName constructorName =
@@ -56,7 +56,7 @@
         // This isn't a constructor invocation because a null aware operator is
         // being used.
       }
-      Element element = nameScope.lookup2(target.name).getter;
+      Element element = nameScope.lookup(target.name).getter;
       if (element is ClassElement) {
         // Possible case: C.n()
         var constructorElement = element.getNamedConstructor(methodName.name);
@@ -81,7 +81,7 @@
         }
       } else if (element is PrefixElement) {
         // Possible cases: p.C() or p.C<>()
-        Element prefixedElement = element.scope.lookup2(methodName.name).getter;
+        Element prefixedElement = element.scope.lookup(methodName.name).getter;
         if (prefixedElement is ClassElement) {
           TypeName typeName = astFactory.typeName(
               astFactory.prefixedIdentifier(target, node.operator, methodName),
@@ -106,11 +106,11 @@
       }
     } else if (target is PrefixedIdentifier) {
       // Possible case: p.C.n()
-      Element prefixElement = nameScope.lookup2(target.prefix.name).getter;
+      Element prefixElement = nameScope.lookup(target.prefix.name).getter;
       target.prefix.staticElement = prefixElement;
       if (prefixElement is PrefixElement) {
         Element element =
-            prefixElement.scope.lookup2(target.identifier.name).getter;
+            prefixElement.scope.lookup(target.identifier.name).getter;
         if (element is ClassElement) {
           var constructorElement = element.getNamedConstructor(methodName.name);
           if (constructorElement != null) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/lexical_lookup.dart b/pkg/analyzer/lib/src/dart/resolver/lexical_lookup.dart
index 9e2cd18..6417634 100644
--- a/pkg/analyzer/lib/src/dart/resolver/lexical_lookup.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/lexical_lookup.dart
@@ -18,7 +18,7 @@
     @required bool setter,
   }) {
     var id = node.name;
-    var scopeResult = _resolver.nameScope.lookup2(id);
+    var scopeResult = _resolver.nameScope.lookup(id);
     var scopeGetter = scopeResult.getter;
     var scopeSetter = scopeResult.setter;
     if (scopeGetter != null || scopeSetter != null) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 2344a75..32e61ba 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -490,7 +490,7 @@
 
   void _resolveReceiverNull(
       MethodInvocation node, SimpleIdentifier nameNode, String name) {
-    var element = nameScope.lookup2(name).getter;
+    var element = nameScope.lookup(name).getter;
     if (element != null) {
       element = _resolver.toLegacyElement(element);
       nameNode.staticElement = element;
@@ -557,7 +557,7 @@
       }
     }
 
-    var element = prefix.scope.lookup2(name).getter;
+    var element = prefix.scope.lookup(name).getter;
     element = _resolver.toLegacyElement(element);
     nameNode.staticElement = element;
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
index dbc01c0..2f7d76f 100644
--- a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
@@ -65,12 +65,6 @@
     _resolver.migrationResolutionHooks
         ?.setCompoundAssignmentExpressionTypes(node);
 
-    _resolver.setAssignmentBackwardCompatibility(
-      assignment: node,
-      left: operand,
-      hasRead: true,
-    );
-
     // TODO(scheglov) Use VariableElement and do in resolveForWrite() ?
     _assignmentShared.checkFinalAlreadyAssigned(operand);
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
index 34ab569..cfaaf15 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
@@ -68,12 +68,6 @@
       _resolver.migrationResolutionHooks
           ?.setCompoundAssignmentExpressionTypes(node);
 
-      _resolver.setAssignmentBackwardCompatibility(
-        assignment: node,
-        left: operand,
-        hasRead: true,
-      );
-
       _assignmentShared.checkFinalAlreadyAssigned(node.operand);
     } else {
       node.operand.accept(_resolver);
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index 48c20cd..23023c0 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -547,7 +547,7 @@
     @required bool hasWrite,
     @required bool forAnnotation,
   }) {
-    var lookupResult = target.scope.lookup2(identifier.name);
+    var lookupResult = target.scope.lookup(identifier.name);
 
     var readElement = _resolver.toLegacyElement(lookupResult.getter);
     var writeElement = _resolver.toLegacyElement(lookupResult.setter);
diff --git a/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
index 29f8498..a880d32 100644
--- a/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
@@ -71,7 +71,7 @@
     if (typeIdentifier is PrefixedIdentifier) {
       var prefix = typeIdentifier.prefix;
       var prefixName = prefix.name;
-      var prefixElement = nameScope.lookup2(prefixName).getter;
+      var prefixElement = nameScope.lookup(prefixName).getter;
       prefix.staticElement = prefixElement;
 
       if (prefixElement == null) {
@@ -88,7 +88,7 @@
         var nameNode = typeIdentifier.identifier;
         var name = nameNode.name;
 
-        var element = prefixElement.scope.lookup2(name).getter;
+        var element = prefixElement.scope.lookup(name).getter;
         nameNode.staticElement = element;
         _resolveToElement(node, element);
         return;
@@ -109,7 +109,7 @@
         return;
       }
 
-      var element = nameScope.lookup2(name).getter;
+      var element = nameScope.lookup(name).getter;
       nameNode.staticElement = element;
       _resolveToElement(node, element);
     }
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 9939ed4..8a09582 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -176,7 +176,7 @@
 
       if (prefixElement is PrefixElement) {
         var prefixScope = prefixElement.scope;
-        var lookupResult = prefixScope.lookup2(name.name);
+        var lookupResult = prefixScope.lookup(name.name);
         var element = lookupResult.getter ?? lookupResult.setter;
         element = _resolver.toLegacyElement(element);
         name.staticElement = element;
@@ -640,7 +640,7 @@
   /// which it could be resolved, or `null` if it could not be resolved. This
   /// does not record the results of the resolution.
   Element _resolveSimpleIdentifier(SimpleIdentifier identifier) {
-    var lookupResult = _resolver.nameScope.lookup2(identifier.name);
+    var lookupResult = _resolver.nameScope.lookup(identifier.name);
 
     Element element = lookupResult.getter;
     element = _resolver.toLegacyElement(element);
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 2097005..aa631a8 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -658,55 +658,6 @@
     }
   }
 
-  /// TODO(scheglov) This is mostly necessary for backward compatibility.
-  /// Although we also use `staticElement` for `getType(left)` below.
-  void setAssignmentBackwardCompatibility({
-    @required CompoundAssignmentExpression assignment,
-    @required AstNode left,
-    @required bool hasRead,
-  }) {
-    if (left is IndexExpression) {
-      if (hasRead) {
-        left.staticElement = assignment.writeElement;
-        // ignore: deprecated_member_use_from_same_package
-        left.auxiliaryElements = AuxiliaryElements(assignment.readElement);
-      } else {
-        left.staticElement = assignment.writeElement;
-      }
-      inferenceHelper.recordStaticType(left, assignment.writeType);
-      return;
-    }
-
-    SimpleIdentifier leftIdentifier;
-    if (left is PrefixedIdentifier) {
-      leftIdentifier = left.identifier;
-      inferenceHelper.recordStaticType(left, assignment.writeType);
-    } else if (left is PropertyAccess) {
-      leftIdentifier = left.propertyName;
-      inferenceHelper.recordStaticType(left, assignment.writeType);
-    } else if (left is SimpleIdentifier) {
-      leftIdentifier = left;
-    } else {
-      return;
-    }
-
-    if (hasRead) {
-      var readElement = assignment.readElement;
-      if (readElement is PropertyAccessorElement) {
-        // ignore: deprecated_member_use_from_same_package
-        leftIdentifier.auxiliaryElements = AuxiliaryElements(readElement);
-      }
-    }
-
-    leftIdentifier.staticElement = assignment.writeElement;
-    if (assignment.readElement is VariableElement) {
-      var leftType = localVariableTypeProvider.getType(leftIdentifier);
-      inferenceHelper.recordStaticType(leftIdentifier, leftType);
-    } else {
-      inferenceHelper.recordStaticType(leftIdentifier, assignment.writeType);
-    }
-  }
-
   void setReadElement(Expression node, Element element) {
     DartType readType = DynamicTypeImpl.instance;
     if (node is IndexExpression) {
@@ -3209,7 +3160,7 @@
       return;
     }
     // Prepare VariableElement.
-    Element element = nameScope.lookup2(node.name).getter;
+    Element element = nameScope.lookup(node.name).getter;
     if (element is! VariableElement) {
       return;
     }
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index abd18b1..d28ca62 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -383,7 +383,7 @@
     }
 
     if (scope != null) {
-      var lookupResult = scope.lookup2(id);
+      var lookupResult = scope.lookup(id);
       var idElement = lookupResult.getter;
       var idEqElement = lookupResult.setter;
 
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index d142a4c..451dcb1 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -443,14 +443,14 @@
     if (typeIdentifier is PrefixedIdentifier) {
       var prefix = typeIdentifier.prefix;
       var prefixName = prefix.name;
-      var prefixElement = scope.lookup2(prefixName).getter;
+      var prefixElement = scope.lookup(prefixName).getter;
       prefix.staticElement = prefixElement;
 
       if (prefixElement is PrefixElement) {
         var nameNode = typeIdentifier.identifier;
         var name = nameNode.name;
 
-        element = prefixElement.scope.lookup2(name).getter;
+        element = prefixElement.scope.lookup(name).getter;
         nameNode.staticElement = element;
       }
     } else {
@@ -462,7 +462,7 @@
         return;
       }
 
-      element = scope.lookup2(name).getter;
+      element = scope.lookup(name).getter;
       nameNode.staticElement = element;
     }
 
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index bd53e0e..0ad2ec6 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.40.5
+version: 0.41.0
 description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
 
diff --git a/pkg/analyzer/test/parse_compilation_unit_test.dart b/pkg/analyzer/test/parse_compilation_unit_test.dart
deleted file mode 100644
index 4bb1920..0000000
--- a/pkg/analyzer/test/parse_compilation_unit_test.dart
+++ /dev/null
@@ -1,96 +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.
-
-// ignore: deprecated_member_use_from_same_package
-import 'package:analyzer/analyzer.dart';
-import 'package:test/test.dart';
-
-void main() {
-  test("parses a valid compilation unit successfully", () {
-    // ignore: deprecated_member_use_from_same_package
-    var unit = parseCompilationUnit("void main() => print('Hello, world!');");
-    expect(unit.toString(), equals("void main() => print('Hello, world!');"));
-  });
-
-  group('Supports spread collections', () {
-    var contents = 'var x = [...[]];';
-    void checkCompilationUnit(CompilationUnit unit) {
-      var declaration = unit.declarations.single as TopLevelVariableDeclaration;
-      var listLiteral =
-          declaration.variables.variables.single.initializer as ListLiteral;
-      var spread = listLiteral.elements.single as SpreadElement;
-      expect(spread.expression, TypeMatcher<ListLiteral>());
-    }
-
-    test('with errors suppressed', () {
-      checkCompilationUnit(
-          // ignore: deprecated_member_use_from_same_package
-          parseCompilationUnit(contents, suppressErrors: true));
-    });
-    test('with errors enabled', () {
-      // ignore: deprecated_member_use_from_same_package
-      checkCompilationUnit(parseCompilationUnit(contents));
-    });
-  });
-
-  group('Supports control flow collections', () {
-    var contents = 'var x = [if (true) 0 else "foo"];';
-    void checkCompilationUnit(CompilationUnit unit) {
-      var declaration = unit.declarations.single as TopLevelVariableDeclaration;
-      var listLiteral =
-          declaration.variables.variables.single.initializer as ListLiteral;
-      var ifElement = listLiteral.elements.single as IfElement;
-      expect(ifElement.condition, TypeMatcher<BooleanLiteral>());
-      expect(ifElement.thenElement, TypeMatcher<IntegerLiteral>());
-      expect(ifElement.elseElement, TypeMatcher<StringLiteral>());
-    }
-
-    test('with errors suppressed', () {
-      checkCompilationUnit(
-          // ignore: deprecated_member_use_from_same_package
-          parseCompilationUnit(contents, suppressErrors: true));
-    });
-    test('with errors enabled', () {
-      // ignore: deprecated_member_use_from_same_package
-      checkCompilationUnit(parseCompilationUnit(contents));
-    });
-  });
-
-  test("throws errors for an invalid compilation unit", () {
-    expect(() {
-      // ignore: deprecated_member_use_from_same_package
-      parseCompilationUnit("void main() => print('Hello, world!')",
-          name: 'test.dart');
-    }, throwsA(predicate((error) {
-      return error is AnalyzerErrorGroup &&
-          error.toString().contains("Error in test.dart: Expected to find ';'");
-    })));
-  });
-
-  test("defaults to '<unknown source>' if no name is provided", () {
-    expect(() {
-      // ignore: deprecated_member_use_from_same_package
-      parseCompilationUnit("void main() => print('Hello, world!')");
-    }, throwsA(predicate((error) {
-      return error is AnalyzerErrorGroup &&
-          error
-              .toString()
-              .contains("Error in <unknown source>: Expected to find ';'");
-    })));
-  });
-
-  test("allows you to specify whether or not to parse function bodies", () {
-    // ignore: deprecated_member_use_from_same_package
-    var unit = parseCompilationUnit("void main() => print('Hello, world!');",
-        parseFunctionBodies: false);
-    expect(unit.toString(), equals("void main();"));
-  });
-
-  test("allows you to specify whether or not to parse function bodies 2", () {
-    // ignore: deprecated_member_use_from_same_package
-    var unit = parseCompilationUnit("void main() { print('Hello, world!'); }",
-        parseFunctionBodies: false);
-    expect(unit.toString(), equals("void main();"));
-  });
-}
diff --git a/pkg/analyzer/test/src/dart/ast/utilities_test.dart b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
index 0e1dca2..7ffec93 100644
--- a/pkg/analyzer/test/src/dart/ast/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
@@ -567,9 +567,6 @@
     );
     MethodElement staticElement = ElementFactory.methodElement(
         "m", interfaceTypeStar(ElementFactory.classElement2('C')));
-    AuxiliaryElements auxiliaryElements = AuxiliaryElements(staticElement);
-    // ignore: deprecated_member_use_from_same_package
-    fromNode.auxiliaryElements = auxiliaryElements;
     fromNode.staticElement = staticElement;
     DartType staticType = interfaceTypeStar(ElementFactory.classElement2('C'));
     fromNode.staticType = staticType;
@@ -578,8 +575,6 @@
       index: AstTestFactory.integer(0),
     );
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    // ignore: deprecated_member_use_from_same_package
-    expect(toNode.auxiliaryElements, same(auxiliaryElements));
     expect(toNode.staticElement, same(staticElement));
     expect(toNode.staticType, same(staticType));
   }
@@ -851,16 +846,11 @@
     SimpleIdentifier fromNode = AstTestFactory.identifier3("x");
     MethodElement staticElement = ElementFactory.methodElement(
         "m", interfaceTypeStar(ElementFactory.classElement2('C')));
-    AuxiliaryElements auxiliaryElements = AuxiliaryElements(staticElement);
-    // ignore: deprecated_member_use_from_same_package
-    fromNode.auxiliaryElements = auxiliaryElements;
     fromNode.staticElement = staticElement;
     DartType staticType = interfaceTypeStar(ElementFactory.classElement2('C'));
     fromNode.staticType = staticType;
     SimpleIdentifier toNode = AstTestFactory.identifier3("x");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    // ignore: deprecated_member_use_from_same_package
-    expect(toNode.auxiliaryElements, same(auxiliaryElements));
     expect(toNode.staticElement, same(staticElement));
     expect(toNode.staticType, same(staticType));
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/library_element_test.dart b/pkg/analyzer/test/src/dart/resolution/library_element_test.dart
index 1b4e874..c5edca5 100644
--- a/pkg/analyzer/test/src/dart/resolution/library_element_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/library_element_test.dart
@@ -290,7 +290,7 @@
 
 @reflectiveTest
 class LibraryElementTest_scope extends PubPackageResolutionTest {
-  test_lookup2() async {
+  test_lookup() async {
     await assertNoErrorsInCode(r'''
 int foo;
 ''');
@@ -298,160 +298,37 @@
     var scope = result.libraryElement.scope;
 
     assertElement(
-      scope.lookup2('foo').getter,
+      scope.lookup('foo').getter,
       findElement.topGet('foo'),
     );
     assertElement(
-      scope.lookup2('foo').setter,
+      scope.lookup('foo').setter,
       findElement.topSet('foo'),
     );
   }
 
-  test_lookup2_implicitCoreImport() async {
-    await assertNoErrorsInCode('');
-
-    var scope = result.libraryElement.scope;
-
-    assertElement(
-      scope.lookup2('int').getter,
-      intElement,
-    );
-  }
-
-  test_lookup2_notFound() async {
-    await assertNoErrorsInCode('');
-
-    var scope = result.libraryElement.scope;
-
-    assertElementNull(
-      scope.lookup2('noSuchGetter').getter,
-    );
-
-    assertElementNull(
-      scope.lookup2('noSuchSetter').setter,
-    );
-  }
-
-  test_lookup2_prefersLocal() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math';
-
-int sin() => 3;
-''');
-
-    var scope = result.libraryElement.scope;
-
-    assertElement(
-      scope.lookup2('sin').getter,
-      findElement.topFunction('sin'),
-    );
-
-    assertElement(
-      scope.lookup2('cos').getter,
-      findElement.importFind('dart:math').topFunction('cos'),
-    );
-  }
-
-  test_lookup2_prefix() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' as math;
-''');
-
-    var scope = result.libraryElement.scope;
-
-    assertElement(
-      scope.lookup2('math').getter,
-      findElement.prefix('math'),
-    );
-  }
-
-  test_lookup2_respectsCombinator_hide() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' hide sin;
-''');
-
-    var scope = result.libraryElement.scope;
-
-    assertElementNull(
-      scope.lookup2('sin').getter,
-    );
-
-    var mathFind = findElement.importFind('dart:math');
-    assertElement(
-      scope.lookup2('cos').getter,
-      mathFind.topFunction('cos'),
-    );
-    assertElement(
-      scope.lookup2('tan').getter,
-      mathFind.topFunction('tan'),
-    );
-  }
-
-  test_lookup2_respectsCombinator_show() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' show sin;
-''');
-
-    var scope = result.libraryElement.scope;
-
-    assertElement(
-      scope.lookup2('sin').getter,
-      findElement.importFind('dart:math').topFunction('sin'),
-    );
-
-    assertElementNull(
-      scope.lookup2('cos').getter,
-    );
-  }
-
   test_lookup_implicitCoreImport() async {
     await assertNoErrorsInCode('');
 
     var scope = result.libraryElement.scope;
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'int', setter: false),
+      scope.lookup('int').getter,
       intElement,
     );
   }
 
-  test_lookup_lookup() async {
-    await assertNoErrorsInCode(r'''
-int foo;
-''');
-
-    var scope = result.libraryElement.scope;
-
-    assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: false),
-      findElement.topGet('foo'),
-    );
-    assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: true),
-      findElement.topSet('foo'),
-    );
-  }
-
   test_lookup_notFound() async {
     await assertNoErrorsInCode('');
 
     var scope = result.libraryElement.scope;
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'noSuchGetter', setter: false),
+      scope.lookup('noSuchGetter').getter,
     );
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'noSuchSetter', setter: true),
+      scope.lookup('noSuchSetter').setter,
     );
   }
 
@@ -466,14 +343,12 @@
     var scope = result.libraryElement.scope;
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'sin', setter: false),
+      scope.lookup('sin').getter,
       findElement.topFunction('sin'),
     );
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'cos', setter: false),
+      scope.lookup('cos').getter,
       findElement.importFind('dart:math').topFunction('cos'),
     );
   }
@@ -487,8 +362,7 @@
     var scope = result.libraryElement.scope;
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'math', setter: false),
+      scope.lookup('math').getter,
       findElement.prefix('math'),
     );
   }
@@ -502,19 +376,16 @@
     var scope = result.libraryElement.scope;
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'sin', setter: false),
+      scope.lookup('sin').getter,
     );
 
     var mathFind = findElement.importFind('dart:math');
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'cos', setter: false),
+      scope.lookup('cos').getter,
       mathFind.topFunction('cos'),
     );
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'tan', setter: false),
+      scope.lookup('tan').getter,
       mathFind.topFunction('tan'),
     );
   }
@@ -528,14 +399,12 @@
     var scope = result.libraryElement.scope;
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'sin', setter: false),
+      scope.lookup('sin').getter,
       findElement.importFind('dart:math').topFunction('sin'),
     );
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'cos', setter: false),
+      scope.lookup('cos').getter,
     );
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/prefix_element_test.dart b/pkg/analyzer/test/src/dart/resolution/prefix_element_test.dart
index fbf0c0c..dfdc7a4 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefix_element_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefix_element_test.dart
@@ -31,252 +31,16 @@
     var importFind = findElement.importFind('package:test/a.dart');
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: false),
+      scope.lookup('foo').getter,
       importFind.topGet('foo'),
     );
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: true),
+      scope.lookup('foo').setter,
       importFind.topSet('foo'),
     );
   }
 
-  test_scope_lookup2() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-var foo = 0;
-''');
-
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'a.dart' as prefix;
-''');
-
-    var scope = findElement.prefix('prefix').scope;
-    var importFind = findElement.importFind('package:test/a.dart');
-
-    assertElement(
-      scope.lookup2('foo').getter,
-      importFind.topGet('foo'),
-    );
-
-    assertElement(
-      scope.lookup2('foo').setter,
-      importFind.topSet('foo'),
-    );
-  }
-
-  test_scope_lookup2_ambiguous_notSdk_both() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-var foo = 0;
-''');
-
-    newFile('$testPackageLibPath/b.dart', content: r'''
-var foo = 1.2;
-''');
-
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'a.dart' as prefix;
-
-// ignore:unused_import
-import 'b.dart' as prefix;
-''');
-
-    var scope = findElement.prefix('prefix').scope;
-
-    var aImport = findElement.importFind('package:test/a.dart');
-    var bImport = findElement.importFind('package:test/b.dart');
-
-    _assertMultiplyDefinedElement(
-      scope.lookup2('foo').getter,
-      [
-        aImport.topGet('foo'),
-        bImport.topGet('foo'),
-      ],
-    );
-
-    _assertMultiplyDefinedElement(
-      scope.lookup2('foo').setter,
-      [
-        aImport.topSet('foo'),
-        bImport.topSet('foo'),
-      ],
-    );
-  }
-
-  test_scope_lookup2_ambiguous_notSdk_first() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-var pi = 4;
-''');
-
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'a.dart' as prefix;
-
-// ignore:unused_import
-import 'dart:math' as prefix;
-''');
-
-    var scope = findElement.prefix('prefix').scope;
-    var aImport = findElement.importFind('package:test/a.dart');
-
-    assertElement(
-      scope.lookup2('pi').getter,
-      aImport.topGet('pi'),
-    );
-  }
-
-  test_scope_lookup2_ambiguous_notSdk_second() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-var pi = 4;
-''');
-
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' as prefix;
-
-// ignore:unused_import
-import 'a.dart' as prefix;
-''');
-
-    var scope = findElement.prefix('prefix').scope;
-    var aImport = findElement.importFind('package:test/a.dart');
-
-    assertElement(
-      scope.lookup2('pi').getter,
-      aImport.topGet('pi'),
-    );
-  }
-
-  test_scope_lookup2_ambiguous_same() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-var foo = 0;
-''');
-
-    newFile('$testPackageLibPath/b.dart', content: r'''
-export 'a.dart';
-''');
-
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'a.dart' as prefix;
-
-// ignore:unused_import
-import 'b.dart' as prefix;
-''');
-
-    var scope = findElement.prefix('prefix').scope;
-    var importFind = findElement.importFind('package:test/a.dart');
-
-    assertElement(
-      scope.lookup2('foo').getter,
-      importFind.topGet('foo'),
-    );
-
-    assertElement(
-      scope.lookup2('foo').setter,
-      importFind.topSet('foo'),
-    );
-  }
-
-  test_scope_lookup2_differentPrefix() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-var foo = 0;
-''');
-
-    newFile('$testPackageLibPath/b.dart', content: r'''
-var bar = 0;
-''');
-
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'a.dart' as prefix;
-
-// ignore:unused_import
-import 'b.dart' as prefix2;
-''');
-
-    var scope = findElement.prefix('prefix').scope;
-    var importFind = findElement.importFind('package:test/a.dart');
-
-    assertElement(
-      scope.lookup2('foo').getter,
-      importFind.topGet('foo'),
-    );
-    assertElement(
-      scope.lookup2('foo').setter,
-      importFind.topSet('foo'),
-    );
-
-    assertElementNull(
-      scope.lookup2('bar').getter,
-    );
-    assertElementNull(
-      scope.lookup2('bar').setter,
-    );
-  }
-
-  test_scope_lookup2_notFound() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' as math;
-''');
-
-    var scope = findElement.prefix('math').scope;
-
-    assertElementNull(
-      scope.lookup2('noSuchGetter').getter,
-    );
-
-    assertElementNull(
-      scope.lookup2('noSuchSetter').setter,
-    );
-  }
-
-  test_scope_lookup2_respectsCombinator_hide() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' as math hide sin;
-''');
-
-    var scope = findElement.prefix('math').scope;
-    var mathFind = findElement.importFind('dart:math');
-
-    assertElementNull(
-      scope.lookup2('sin').getter,
-    );
-
-    assertElement(
-      scope.lookup2('cos').getter,
-      mathFind.topFunction('cos'),
-    );
-    assertElement(
-      scope.lookup2('tan').getter,
-      mathFind.topFunction('tan'),
-    );
-  }
-
-  test_scope_lookup2_respectsCombinator_show() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' as math show sin;
-''');
-
-    var scope = findElement.prefix('math').scope;
-    var mathFind = findElement.importFind('dart:math');
-
-    assertElement(
-      scope.lookup2('sin').getter,
-      mathFind.topFunction('sin'),
-    );
-
-    assertElementNull(
-      scope.lookup2('cos').getter,
-    );
-  }
-
   test_scope_lookup_ambiguous_notSdk_both() async {
     newFile('$testPackageLibPath/a.dart', content: r'''
 var foo = 0;
@@ -300,8 +64,7 @@
     var bImport = findElement.importFind('package:test/b.dart');
 
     _assertMultiplyDefinedElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: false),
+      scope.lookup('foo').getter,
       [
         aImport.topGet('foo'),
         bImport.topGet('foo'),
@@ -309,8 +72,7 @@
     );
 
     _assertMultiplyDefinedElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: true),
+      scope.lookup('foo').setter,
       [
         aImport.topSet('foo'),
         bImport.topSet('foo'),
@@ -335,8 +97,7 @@
     var aImport = findElement.importFind('package:test/a.dart');
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'pi', setter: false),
+      scope.lookup('pi').getter,
       aImport.topGet('pi'),
     );
   }
@@ -358,8 +119,7 @@
     var aImport = findElement.importFind('package:test/a.dart');
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'pi', setter: false),
+      scope.lookup('pi').getter,
       aImport.topGet('pi'),
     );
   }
@@ -385,14 +145,12 @@
     var importFind = findElement.importFind('package:test/a.dart');
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: false),
+      scope.lookup('foo').getter,
       importFind.topGet('foo'),
     );
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: true),
+      scope.lookup('foo').setter,
       importFind.topSet('foo'),
     );
   }
@@ -418,23 +176,19 @@
     var importFind = findElement.importFind('package:test/a.dart');
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: false),
+      scope.lookup('foo').getter,
       importFind.topGet('foo'),
     );
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: true),
+      scope.lookup('foo').setter,
       importFind.topSet('foo'),
     );
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'bar', setter: false),
+      scope.lookup('bar').getter,
     );
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'bar', setter: true),
+      scope.lookup('bar').setter,
     );
   }
 
@@ -447,13 +201,11 @@
     var scope = findElement.prefix('math').scope;
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'noSuchGetter', setter: false),
+      scope.lookup('noSuchGetter').getter,
     );
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'noSuchSetter', setter: true),
+      scope.lookup('noSuchSetter').setter,
     );
   }
 
@@ -467,18 +219,15 @@
     var mathFind = findElement.importFind('dart:math');
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'sin', setter: false),
+      scope.lookup('sin').getter,
     );
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'cos', setter: false),
+      scope.lookup('cos').getter,
       mathFind.topFunction('cos'),
     );
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'tan', setter: false),
+      scope.lookup('tan').getter,
       mathFind.topFunction('tan'),
     );
   }
@@ -493,14 +242,12 @@
     var mathFind = findElement.importFind('dart:math');
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'sin', setter: false),
+      scope.lookup('sin').getter,
       mathFind.topFunction('sin'),
     );
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'cos', setter: false),
+      scope.lookup('cos').getter,
     );
   }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index e4d6162..b91cab9 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -51,7 +51,7 @@
   ClassElement get futureElement => typeProvider.futureElement;
 
   /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
-  bool get hasAssignmentLeftResolution => true;
+  bool get hasAssignmentLeftResolution => false;
 
   ClassElement get intElement => typeProvider.intType.element;
 
@@ -383,8 +383,6 @@
     var isRead = node.inGetterContext();
     var isWrite = node.inSetterContext();
     if (isRead && isWrite) {
-      // ignore: deprecated_member_use_from_same_package
-      assertElement(node.auxiliaryElements?.staticElement, readElement);
       assertElement(node.staticElement, writeElement);
     } else if (isRead) {
       assertElement(node.staticElement, readElement);
diff --git a/pkg/analyzer/test/test_all.dart b/pkg/analyzer/test/test_all.dart
index 1daab29..b62b2e4 100644
--- a/pkg/analyzer/test/test_all.dart
+++ b/pkg/analyzer/test/test_all.dart
@@ -9,7 +9,6 @@
 import 'file_system/test_all.dart' as file_system;
 import 'generated/test_all.dart' as generated;
 import 'instrumentation/test_all.dart' as instrumentation;
-import 'parse_compilation_unit_test.dart' as parse_compilation_unit;
 import 'source/test_all.dart' as source;
 import 'src/test_all.dart' as src;
 import 'verify_diagnostics_test.dart' as verify_diagnostics;
@@ -23,7 +22,6 @@
     file_system.main();
     generated.main();
     instrumentation.main();
-    parse_compilation_unit.main();
     source.main();
     src.main();
     verify_diagnostics.main();
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
index 902fdd1..ecc1198 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
@@ -206,6 +206,93 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateArgumentTypeNotAssignableNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The argument type '#type' can't be assigned to the parameter type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments: _withArgumentsArgumentTypeNotAssignableNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeArgumentTypeNotAssignableNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "ArgumentTypeNotAssignableNullability",
+        templateArgumentTypeNotAssignableNullability,
+        analyzerCodes: <String>["ARGUMENT_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsArgumentTypeNotAssignableNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeArgumentTypeNotAssignableNullability,
+      message:
+          """The argument type '${type}' can't be assigned to the parameter type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateArgumentTypeNotAssignablePartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The argument type '#type' can't be assigned to the parameter type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments: _withArgumentsArgumentTypeNotAssignablePartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeArgumentTypeNotAssignablePartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "ArgumentTypeNotAssignablePartNullability",
+        templateArgumentTypeNotAssignablePartNullability,
+        analyzerCodes: <String>["ARGUMENT_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsArgumentTypeNotAssignablePartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeArgumentTypeNotAssignablePartNullability,
+      message:
+          """The argument type '${type}' can't be assigned to the parameter type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
         Message Function(Constant _constant, bool isNonNullableByDefault)>
     templateConstEvalCaseImplementsEqual = const Template<
             Message Function(Constant _constant, bool isNonNullableByDefault)>(
@@ -967,6 +1054,99 @@
 const Template<
         Message Function(
             DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateForInLoopElementTypeNotAssignableNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        tipTemplate: r"""Try changing the type of the variable.""",
+        withArguments:
+            _withArgumentsForInLoopElementTypeNotAssignableNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeForInLoopElementTypeNotAssignableNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "ForInLoopElementTypeNotAssignableNullability",
+        templateForInLoopElementTypeNotAssignableNullability,
+        analyzerCodes: <String>["FOR_IN_OF_INVALID_ELEMENT_TYPE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsForInLoopElementTypeNotAssignableNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeForInLoopElementTypeNotAssignableNullability,
+      message:
+          """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      tip: """Try changing the type of the variable.""",
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateForInLoopElementTypeNotAssignablePartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        tipTemplate: r"""Try changing the type of the variable.""",
+        withArguments:
+            _withArgumentsForInLoopElementTypeNotAssignablePartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeForInLoopElementTypeNotAssignablePartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "ForInLoopElementTypeNotAssignablePartNullability",
+        templateForInLoopElementTypeNotAssignablePartNullability,
+        analyzerCodes: <String>["FOR_IN_OF_INVALID_ELEMENT_TYPE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsForInLoopElementTypeNotAssignablePartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeForInLoopElementTypeNotAssignablePartNullability,
+      message:
+          """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      tip: """Try changing the type of the variable.""",
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
     templateForInLoopTypeNotIterable = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
@@ -1000,6 +1180,93 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateForInLoopTypeNotIterableNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The type '#type' used in the 'for' loop must implement '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments: _withArgumentsForInLoopTypeNotIterableNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeForInLoopTypeNotIterableNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "ForInLoopTypeNotIterableNullability",
+        templateForInLoopTypeNotIterableNullability,
+        analyzerCodes: <String>["FOR_IN_OF_INVALID_TYPE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsForInLoopTypeNotIterableNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeForInLoopTypeNotIterableNullability,
+      message:
+          """The type '${type}' used in the 'for' loop must implement '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateForInLoopTypeNotIterablePartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The type '#type' used in the 'for' loop must implement '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments: _withArgumentsForInLoopTypeNotIterablePartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeForInLoopTypeNotIterablePartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "ForInLoopTypeNotIterablePartNullability",
+        templateForInLoopTypeNotIterablePartNullability,
+        analyzerCodes: <String>["FOR_IN_OF_INVALID_TYPE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsForInLoopTypeNotIterablePartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeForInLoopTypeNotIterablePartNullability,
+      message:
+          """The type '${type}' used in the 'for' loop must implement '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateGenericFunctionTypeInferredAsActualTypeArgument = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
@@ -1675,6 +1942,93 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateInvalidAssignmentErrorNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments: _withArgumentsInvalidAssignmentErrorNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeInvalidAssignmentErrorNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "InvalidAssignmentErrorNullability",
+        templateInvalidAssignmentErrorNullability,
+        analyzerCodes: <String>["INVALID_ASSIGNMENT"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidAssignmentErrorNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeInvalidAssignmentErrorNullability,
+      message:
+          """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateInvalidAssignmentErrorPartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments: _withArgumentsInvalidAssignmentErrorPartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeInvalidAssignmentErrorPartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "InvalidAssignmentErrorPartNullability",
+        templateInvalidAssignmentErrorPartNullability,
+        analyzerCodes: <String>["INVALID_ASSIGNMENT"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidAssignmentErrorPartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeInvalidAssignmentErrorPartNullability,
+      message:
+          """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
     Message Function(
         DartType _type,
         DartType _type2,
@@ -2780,6 +3134,180 @@
 const Template<
         Message Function(
             DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateInvalidReturnAsyncNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be returned from an async function with return type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments: _withArgumentsInvalidReturnAsyncNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeInvalidReturnAsyncNullability = const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+  "InvalidReturnAsyncNullability",
+  templateInvalidReturnAsyncNullability,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidReturnAsyncNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeInvalidReturnAsyncNullability,
+      message:
+          """A value of type '${type}' can't be returned from an async function with return type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateInvalidReturnAsyncPartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be returned from an async function with return type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments: _withArgumentsInvalidReturnAsyncPartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeInvalidReturnAsyncPartNullability = const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>(
+  "InvalidReturnAsyncPartNullability",
+  templateInvalidReturnAsyncPartNullability,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidReturnAsyncPartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeInvalidReturnAsyncPartNullability,
+      message:
+          """A value of type '${type}' can't be returned from an async function with return type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateInvalidReturnNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be returned from a function with return type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments: _withArgumentsInvalidReturnNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeInvalidReturnNullability = const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+  "InvalidReturnNullability",
+  templateInvalidReturnNullability,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidReturnNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeInvalidReturnNullability,
+      message:
+          """A value of type '${type}' can't be returned from a function with return type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateInvalidReturnPartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be returned from a function with return type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments: _withArgumentsInvalidReturnPartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeInvalidReturnPartNullability = const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>(
+  "InvalidReturnPartNullability",
+  templateInvalidReturnPartNullability,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidReturnPartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeInvalidReturnPartNullability,
+      message:
+          """A value of type '${type}' can't be returned from a function with return type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
     templateMainWrongParameterType = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
@@ -3458,6 +3986,93 @@
 const Template<
         Message Function(
             DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateSpreadElementTypeMismatchNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""Can't assign spread elements of type '#type' to collection elements of type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments: _withArgumentsSpreadElementTypeMismatchNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeSpreadElementTypeMismatchNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "SpreadElementTypeMismatchNullability",
+        templateSpreadElementTypeMismatchNullability,
+        analyzerCodes: <String>["LIST_ELEMENT_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadElementTypeMismatchNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeSpreadElementTypeMismatchNullability,
+      message:
+          """Can't assign spread elements of type '${type}' to collection elements of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateSpreadElementTypeMismatchPartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""Can't assign spread elements of type '#type' to collection elements of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments: _withArgumentsSpreadElementTypeMismatchPartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeSpreadElementTypeMismatchPartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "SpreadElementTypeMismatchPartNullability",
+        templateSpreadElementTypeMismatchPartNullability,
+        analyzerCodes: <String>["LIST_ELEMENT_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadElementTypeMismatchPartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeSpreadElementTypeMismatchPartNullability,
+      message:
+          """Can't assign spread elements of type '${type}' to collection elements of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
     templateSpreadMapEntryElementKeyTypeMismatch = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
@@ -3495,6 +4110,96 @@
 const Template<
         Message Function(
             DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateSpreadMapEntryElementKeyTypeMismatchNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""Can't assign spread entry keys of type '#type' to map entry keys of type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments:
+            _withArgumentsSpreadMapEntryElementKeyTypeMismatchNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeSpreadMapEntryElementKeyTypeMismatchNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "SpreadMapEntryElementKeyTypeMismatchNullability",
+        templateSpreadMapEntryElementKeyTypeMismatchNullability,
+        analyzerCodes: <String>["MAP_KEY_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadMapEntryElementKeyTypeMismatchNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeSpreadMapEntryElementKeyTypeMismatchNullability,
+      message:
+          """Can't assign spread entry keys of type '${type}' to map entry keys of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateSpreadMapEntryElementKeyTypeMismatchPartNullability =
+    const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""Can't assign spread entry keys of type '#type' to map entry keys of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments:
+            _withArgumentsSpreadMapEntryElementKeyTypeMismatchPartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeSpreadMapEntryElementKeyTypeMismatchPartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "SpreadMapEntryElementKeyTypeMismatchPartNullability",
+        templateSpreadMapEntryElementKeyTypeMismatchPartNullability,
+        analyzerCodes: <String>["MAP_KEY_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadMapEntryElementKeyTypeMismatchPartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeSpreadMapEntryElementKeyTypeMismatchPartNullability,
+      message:
+          """Can't assign spread entry keys of type '${type}' to map entry keys of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
     templateSpreadMapEntryElementValueTypeMismatch = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
@@ -3529,6 +4234,96 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateSpreadMapEntryElementValueTypeMismatchNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""Can't assign spread entry values of type '#type' to map entry values of type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments:
+            _withArgumentsSpreadMapEntryElementValueTypeMismatchNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeSpreadMapEntryElementValueTypeMismatchNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "SpreadMapEntryElementValueTypeMismatchNullability",
+        templateSpreadMapEntryElementValueTypeMismatchNullability,
+        analyzerCodes: <String>["MAP_VALUE_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadMapEntryElementValueTypeMismatchNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeSpreadMapEntryElementValueTypeMismatchNullability,
+      message:
+          """Can't assign spread entry values of type '${type}' to map entry values of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateSpreadMapEntryElementValueTypeMismatchPartNullability =
+    const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""Can't assign spread entry values of type '#type' to map entry values of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments:
+            _withArgumentsSpreadMapEntryElementValueTypeMismatchPartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeSpreadMapEntryElementValueTypeMismatchPartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "SpreadMapEntryElementValueTypeMismatchPartNullability",
+        templateSpreadMapEntryElementValueTypeMismatchPartNullability,
+        analyzerCodes: <String>["MAP_VALUE_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadMapEntryElementValueTypeMismatchPartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeSpreadMapEntryElementValueTypeMismatchPartNullability,
+      message:
+          """Can't assign spread entry values of type '${type}' to map entry values of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateSpreadMapEntryTypeMismatch = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
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 7d827d0..79b0476 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -841,7 +841,11 @@
     Expression implicitDowncast = inferrer.ensureAssignable(
         variable.type, inferredType, variableGet,
         fileOffset: parent.fileOffset,
-        errorTemplate: templateForInLoopElementTypeNotAssignable);
+        errorTemplate: templateForInLoopElementTypeNotAssignable,
+        nullabilityErrorTemplate:
+            templateForInLoopElementTypeNotAssignableNullability,
+        nullabilityPartErrorTemplate:
+            templateForInLoopElementTypeNotAssignablePartNullability);
     Statement expressionEffect;
     if (!identical(implicitDowncast, variableGet)) {
       variable.initializer = implicitDowncast..parent = variable;
@@ -884,7 +888,10 @@
             const DynamicType(), iterableClass, inferrer.library.nonNullable),
         inferredExpressionType,
         iterable,
-        errorTemplate: templateForInLoopTypeNotIterable);
+        errorTemplate: templateForInLoopTypeNotIterable,
+        nullabilityErrorTemplate: templateForInLoopTypeNotIterableNullability,
+        nullabilityPartErrorTemplate:
+            templateForInLoopTypeNotIterablePartNullability);
     DartType inferredType;
     if (typeNeeded) {
       inferredType = const DynamicType();
@@ -1396,13 +1403,51 @@
           }
         } else if (spreadTypeBound is InterfaceType) {
           if (!inferrer.isAssignable(inferredTypeArgument, spreadElementType)) {
-            replacement = inferrer.helper.buildProblem(
-                templateSpreadElementTypeMismatch.withArguments(
-                    spreadElementType,
-                    inferredTypeArgument,
-                    inferrer.isNonNullableByDefault),
-                element.expression.fileOffset,
-                1);
+            if (inferrer.isNonNullableByDefault) {
+              IsSubtypeOf subtypeCheckResult = inferrer.typeSchemaEnvironment
+                  .performNullabilityAwareSubtypeCheck(
+                      spreadElementType, inferredTypeArgument);
+              if (subtypeCheckResult.isSubtypeWhenIgnoringNullabilities()) {
+                if (spreadElementType == subtypeCheckResult.subtype &&
+                    inferredTypeArgument == subtypeCheckResult.supertype) {
+                  replacement = inferrer.helper.buildProblem(
+                      templateSpreadElementTypeMismatchNullability
+                          .withArguments(
+                              spreadElementType,
+                              inferredTypeArgument,
+                              inferrer.isNonNullableByDefault),
+                      element.expression.fileOffset,
+                      1);
+                } else {
+                  replacement = inferrer.helper.buildProblem(
+                      templateSpreadElementTypeMismatchPartNullability
+                          .withArguments(
+                              spreadElementType,
+                              inferredTypeArgument,
+                              subtypeCheckResult.subtype,
+                              subtypeCheckResult.supertype,
+                              inferrer.isNonNullableByDefault),
+                      element.expression.fileOffset,
+                      1);
+                }
+              } else {
+                replacement = inferrer.helper.buildProblem(
+                    templateSpreadElementTypeMismatch.withArguments(
+                        spreadElementType,
+                        inferredTypeArgument,
+                        inferrer.isNonNullableByDefault),
+                    element.expression.fileOffset,
+                    1);
+              }
+            } else {
+              replacement = inferrer.helper.buildProblem(
+                  templateSpreadElementTypeMismatch.withArguments(
+                      spreadElementType,
+                      inferredTypeArgument,
+                      inferrer.isNonNullableByDefault),
+                  element.expression.fileOffset,
+                  1);
+            }
           }
           if (inferrer.isNonNullableByDefault &&
               spreadType.isPotentiallyNullable &&
@@ -1855,22 +1900,95 @@
           Expression keyError;
           Expression valueError;
           if (!inferrer.isAssignable(inferredKeyType, actualKeyType)) {
-            keyError = inferrer.helper.buildProblem(
-                templateSpreadMapEntryElementKeyTypeMismatch.withArguments(
-                    actualKeyType,
-                    inferredKeyType,
-                    inferrer.isNonNullableByDefault),
-                entry.expression.fileOffset,
-                1);
+            if (inferrer.isNonNullableByDefault) {
+              IsSubtypeOf subtypeCheckResult = inferrer.typeSchemaEnvironment
+                  .performNullabilityAwareSubtypeCheck(
+                      actualKeyType, inferredKeyType);
+              if (subtypeCheckResult.isSubtypeWhenIgnoringNullabilities()) {
+                if (actualKeyType == subtypeCheckResult.subtype &&
+                    inferredKeyType == subtypeCheckResult.supertype) {
+                  keyError = inferrer.helper.buildProblem(
+                      templateSpreadMapEntryElementKeyTypeMismatchNullability
+                          .withArguments(actualKeyType, inferredKeyType,
+                              inferrer.isNonNullableByDefault),
+                      entry.expression.fileOffset,
+                      1);
+                } else {
+                  keyError = inferrer.helper.buildProblem(
+                      // ignore: lines_longer_than_80_chars
+                      templateSpreadMapEntryElementKeyTypeMismatchPartNullability
+                          .withArguments(
+                              actualKeyType,
+                              inferredKeyType,
+                              subtypeCheckResult.subtype,
+                              subtypeCheckResult.supertype,
+                              inferrer.isNonNullableByDefault),
+                      entry.expression.fileOffset,
+                      1);
+                }
+              } else {
+                keyError = inferrer.helper.buildProblem(
+                    templateSpreadMapEntryElementKeyTypeMismatch.withArguments(
+                        actualKeyType,
+                        inferredKeyType,
+                        inferrer.isNonNullableByDefault),
+                    entry.expression.fileOffset,
+                    1);
+              }
+            } else {
+              keyError = inferrer.helper.buildProblem(
+                  templateSpreadMapEntryElementKeyTypeMismatch.withArguments(
+                      actualKeyType,
+                      inferredKeyType,
+                      inferrer.isNonNullableByDefault),
+                  entry.expression.fileOffset,
+                  1);
+            }
           }
           if (!inferrer.isAssignable(inferredValueType, actualValueType)) {
-            valueError = inferrer.helper.buildProblem(
-                templateSpreadMapEntryElementValueTypeMismatch.withArguments(
-                    actualValueType,
-                    inferredValueType,
-                    inferrer.isNonNullableByDefault),
-                entry.expression.fileOffset,
-                1);
+            if (inferrer.isNonNullableByDefault) {
+              IsSubtypeOf subtypeCheckResult = inferrer.typeSchemaEnvironment
+                  .performNullabilityAwareSubtypeCheck(
+                      actualValueType, inferredValueType);
+              if (subtypeCheckResult.isSubtypeWhenIgnoringNullabilities()) {
+                if (actualValueType == subtypeCheckResult.subtype &&
+                    inferredValueType == subtypeCheckResult.supertype) {
+                  valueError = inferrer.helper.buildProblem(
+                      templateSpreadMapEntryElementValueTypeMismatchNullability
+                          .withArguments(actualValueType, inferredValueType,
+                              inferrer.isNonNullableByDefault),
+                      entry.expression.fileOffset,
+                      1);
+                } else {
+                  valueError = inferrer.helper.buildProblem(
+                      // ignore: lines_longer_than_80_chars
+                      templateSpreadMapEntryElementValueTypeMismatchPartNullability
+                          .withArguments(
+                              actualValueType,
+                              inferredValueType,
+                              subtypeCheckResult.subtype,
+                              subtypeCheckResult.supertype,
+                              inferrer.isNonNullableByDefault),
+                      entry.expression.fileOffset,
+                      1);
+                }
+              } else {
+                valueError = inferrer.helper.buildProblem(
+                    templateSpreadMapEntryElementValueTypeMismatch
+                        .withArguments(actualValueType, inferredValueType,
+                            inferrer.isNonNullableByDefault),
+                    entry.expression.fileOffset,
+                    1);
+              }
+            } else {
+              valueError = inferrer.helper.buildProblem(
+                  templateSpreadMapEntryElementValueTypeMismatch.withArguments(
+                      actualValueType,
+                      inferredValueType,
+                      inferrer.isNonNullableByDefault),
+                  entry.expression.fileOffset,
+                  1);
+            }
           }
           if (inferrer.isNonNullableByDefault &&
               spreadType.isPotentiallyNullable &&
@@ -3621,7 +3739,10 @@
     right = inferrer.ensureAssignableResult(
         rightType.withDeclaredNullability(inferrer.library.nullable),
         rightResult,
-        errorTemplate: templateArgumentTypeNotAssignable);
+        errorTemplate: templateArgumentTypeNotAssignable,
+        nullabilityErrorTemplate: templateArgumentTypeNotAssignableNullability,
+        nullabilityPartErrorTemplate:
+            templateArgumentTypeNotAssignablePartNullability);
 
     Expression equals = new MethodInvocation(
         left,
@@ -6233,11 +6354,15 @@
   }
 
   Expression inferAssignment(TypeInferrerImpl inferrer, DartType rhsType) {
+    DartType variableType =
+        inferrer.computeGreatestClosure(variableSet.variable.type);
     Expression rhs = inferrer.ensureAssignable(
-        inferrer.computeGreatestClosure(variableSet.variable.type),
-        rhsType,
-        variableSet.value,
+        variableType, rhsType, variableSet.value,
         errorTemplate: templateForInLoopElementTypeNotAssignable,
+        nullabilityErrorTemplate:
+            templateForInLoopElementTypeNotAssignableNullability,
+        nullabilityPartErrorTemplate:
+            templateForInLoopElementTypeNotAssignablePartNullability,
         isVoidAllowed: true);
 
     variableSet.value = rhs..parent = variableSet;
@@ -6296,6 +6421,10 @@
     Expression rhs = inferrer.ensureAssignable(
         inferrer.computeGreatestClosure(_writeType), rhsType, _rhs,
         errorTemplate: templateForInLoopElementTypeNotAssignable,
+        nullabilityErrorTemplate:
+            templateForInLoopElementTypeNotAssignableNullability,
+        nullabilityPartErrorTemplate:
+            templateForInLoopElementTypeNotAssignablePartNullability,
         isVoidAllowed: true);
 
     propertySet.value = rhs..parent = propertySet;
@@ -6332,6 +6461,10 @@
         rhsType,
         superPropertySet.value,
         errorTemplate: templateForInLoopElementTypeNotAssignable,
+        nullabilityErrorTemplate:
+            templateForInLoopElementTypeNotAssignableNullability,
+        nullabilityPartErrorTemplate:
+            templateForInLoopElementTypeNotAssignablePartNullability,
         isVoidAllowed: true);
     superPropertySet.value = rhs..parent = superPropertySet;
     ExpressionInferenceResult result = inferrer.inferExpression(
@@ -6352,11 +6485,15 @@
 
   @override
   Expression inferAssignment(TypeInferrerImpl inferrer, DartType rhsType) {
+    DartType setterType =
+        inferrer.computeGreatestClosure(staticSet.target.setterType);
     Expression rhs = inferrer.ensureAssignable(
-        inferrer.computeGreatestClosure(staticSet.target.setterType),
-        rhsType,
-        staticSet.value,
+        setterType, rhsType, staticSet.value,
         errorTemplate: templateForInLoopElementTypeNotAssignable,
+        nullabilityErrorTemplate:
+            templateForInLoopElementTypeNotAssignableNullability,
+        nullabilityPartErrorTemplate:
+            templateForInLoopElementTypeNotAssignablePartNullability,
         isVoidAllowed: true);
 
     staticSet.value = rhs..parent = staticSet;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart b/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
index c641616..9ca2af0 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
@@ -199,7 +199,10 @@
               _returnContext, expressionType, statement.expression,
               fileOffset: statement.expression.fileOffset,
               isVoidAllowed: true,
-              errorTemplate: templateInvalidReturn);
+              errorTemplate: templateInvalidReturn,
+              nullabilityErrorTemplate: templateInvalidReturnNullability,
+              nullabilityPartErrorTemplate:
+                  templateInvalidReturnPartNullability);
           statement.expression = expression..parent = statement;
         }
       }
@@ -552,7 +555,10 @@
                   inferrer.computeGreatestClosure2(_returnContext),
               declaredContextType: returnType,
               isVoidAllowed: false,
-              errorTemplate: templateInvalidReturnAsync)
+              errorTemplate: templateInvalidReturnAsync,
+              nullabilityErrorTemplate: templateInvalidReturnAsyncNullability,
+              nullabilityPartErrorTemplate:
+                  templateInvalidReturnAsyncPartNullability)
             ..parent = statement;
         }
       }
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 0c37435..ff5fd50 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
@@ -392,12 +392,18 @@
       DartType expectedType, ExpressionInferenceResult result,
       {int fileOffset,
       bool isVoidAllowed: false,
-      Template<Message Function(DartType, DartType, bool)> errorTemplate}) {
+      Template<Message Function(DartType, DartType, bool)> errorTemplate,
+      Template<Message Function(DartType, DartType, bool)>
+          nullabilityErrorTemplate,
+      Template<Message Function(DartType, DartType, DartType, DartType, bool)>
+          nullabilityPartErrorTemplate}) {
     return ensureAssignable(
         expectedType, result.inferredType, result.expression,
         fileOffset: fileOffset,
         isVoidAllowed: isVoidAllowed,
-        errorTemplate: errorTemplate);
+        errorTemplate: errorTemplate,
+        nullabilityErrorTemplate: nullabilityErrorTemplate,
+        nullabilityPartErrorTemplate: nullabilityPartErrorTemplate);
   }
 
   /// Ensures that [expressionType] is assignable to [contextType].
@@ -424,9 +430,23 @@
       DartType declaredContextType,
       DartType runtimeCheckedType,
       bool isVoidAllowed: false,
-      Template<Message Function(DartType, DartType, bool)> errorTemplate}) {
+      Template<Message Function(DartType, DartType, bool)> errorTemplate,
+      Template<Message Function(DartType, DartType, bool)>
+          nullabilityErrorTemplate,
+      Template<Message Function(DartType, DartType, DartType, DartType, bool)>
+          nullabilityPartErrorTemplate}) {
     assert(contextType != null);
 
+    // [errorTemplate], [nullabilityErrorTemplate], and
+    // [nullabilityPartErrorTemplate] should be provided together.
+    assert((errorTemplate == null) == (nullabilityErrorTemplate == null) &&
+        (nullabilityErrorTemplate == null) ==
+            (nullabilityPartErrorTemplate == null));
+    errorTemplate ??= templateInvalidAssignmentError;
+    nullabilityErrorTemplate ??= templateInvalidAssignmentErrorNullability;
+    nullabilityPartErrorTemplate ??=
+        templateInvalidAssignmentErrorPartNullability;
+
     // We don't need to insert assignability checks when doing top level type
     // inference since top level type inference only cares about the type that
     // is inferred (the kernel code is discarded).
@@ -439,14 +459,14 @@
 
     Template<Message Function(DartType, DartType, bool)>
         preciseTypeErrorTemplate = _getPreciseTypeErrorTemplate(expression);
-    AssignabilityKind kind = _computeAssignabilityKind(
+    AssignabilityResult assignabilityResult = _computeAssignabilityKind(
         contextType, expressionType,
         isNonNullableByDefault: isNonNullableByDefault,
         isVoidAllowed: isVoidAllowed,
         isExpressionTypePrecise: preciseTypeErrorTemplate != null);
 
     Expression result;
-    switch (kind) {
+    switch (assignabilityResult.kind) {
       case AssignabilityKind.assignable:
         result = expression;
         break;
@@ -471,8 +491,13 @@
         break;
       case AssignabilityKind.unassignable:
         // Error: not assignable.  Perform error recovery.
-        result = _wrapUnassignableExpression(expression, expressionType,
-            contextType, declaredContextType, errorTemplate);
+        result = _wrapUnassignableExpression(
+            expression,
+            expressionType,
+            contextType,
+            errorTemplate.withArguments(expressionType,
+                declaredContextType ?? contextType, isNonNullableByDefault));
+
         break;
       case AssignabilityKind.unassignableVoid:
         // Error: not assignable.  Perform error recovery.
@@ -496,15 +521,63 @@
             typedTearoff.tearoff,
             typedTearoff.tearoffType,
             contextType,
-            declaredContextType,
-            errorTemplate);
+            errorTemplate.withArguments(typedTearoff.tearoffType,
+                declaredContextType ?? contextType, isNonNullableByDefault));
+
         break;
       case AssignabilityKind.unassignableCantTearoff:
         result = _wrapTearoffErrorExpression(
             expression, contextType, templateNullableTearoffError);
         break;
+      case AssignabilityKind.unassignableNullability:
+        if (expressionType == assignabilityResult.subtype &&
+            contextType == assignabilityResult.supertype) {
+          result = _wrapUnassignableExpression(
+              expression,
+              expressionType,
+              contextType,
+              nullabilityErrorTemplate.withArguments(expressionType,
+                  declaredContextType ?? contextType, isNonNullableByDefault));
+        } else {
+          result = _wrapUnassignableExpression(
+              expression,
+              expressionType,
+              contextType,
+              nullabilityPartErrorTemplate.withArguments(
+                  expressionType,
+                  declaredContextType ?? contextType,
+                  assignabilityResult.subtype,
+                  assignabilityResult.supertype,
+                  isNonNullableByDefault));
+        }
+        break;
+      case AssignabilityKind.unassignableNullabilityTearoff:
+        TypedTearoff typedTearoff =
+            _tearOffCall(expression, expressionType, fileOffset);
+        if (expressionType == assignabilityResult.subtype &&
+            contextType == assignabilityResult.supertype) {
+          result = _wrapUnassignableExpression(
+              typedTearoff.tearoff,
+              typedTearoff.tearoffType,
+              contextType,
+              nullabilityErrorTemplate.withArguments(typedTearoff.tearoffType,
+                  declaredContextType ?? contextType, isNonNullableByDefault));
+        } else {
+          result = _wrapUnassignableExpression(
+              typedTearoff.tearoff,
+              typedTearoff.tearoffType,
+              contextType,
+              nullabilityPartErrorTemplate.withArguments(
+                  typedTearoff.tearoffType,
+                  declaredContextType ?? contextType,
+                  assignabilityResult.subtype,
+                  assignabilityResult.supertype,
+                  isNonNullableByDefault));
+        }
+        break;
       default:
-        return unhandled("${kind}", "ensureAssignable", fileOffset, helper.uri);
+        return unhandled("${assignabilityResult}", "ensureAssignable",
+            fileOffset, helper.uri);
     }
 
     return result;
@@ -532,12 +605,8 @@
     return errorNode;
   }
 
-  Expression _wrapUnassignableExpression(
-      Expression expression,
-      DartType expressionType,
-      DartType contextType,
-      DartType declaredContextType,
-      Template<Message Function(DartType, DartType, bool)> template) {
+  Expression _wrapUnassignableExpression(Expression expression,
+      DartType expressionType, DartType contextType, Message message) {
     Expression errorNode = new AsExpression(
         expression,
         // TODO(ahe): The outline phase doesn't correctly remove invalid
@@ -550,13 +619,7 @@
       ..fileOffset = expression.fileOffset;
     if (contextType is! InvalidType && expressionType is! InvalidType) {
       errorNode = helper.wrapInProblem(
-          errorNode,
-          (template ?? templateInvalidAssignmentError).withArguments(
-              expressionType,
-              declaredContextType ?? contextType,
-              isNonNullableByDefault),
-          errorNode.fileOffset,
-          noLength);
+          errorNode, message, errorNode.fileOffset, noLength);
     }
     return errorNode;
   }
@@ -590,7 +653,7 @@
   /// Computes the assignability kind of [expressionType] to [contextType].
   ///
   /// The computation is side-effect free.
-  AssignabilityKind _computeAssignabilityKind(
+  AssignabilityResult _computeAssignabilityKind(
       DartType contextType, DartType expressionType,
       {bool isNonNullableByDefault,
       bool isVoidAllowed,
@@ -611,7 +674,8 @@
         if (_shouldTearOffCall(contextType, expressionType)) {
           needsTearoff = true;
           if (isNonNullableByDefault && expressionType.isPotentiallyNullable) {
-            return AssignabilityKind.unassignableCantTearoff;
+            return const AssignabilityResult(
+                AssignabilityKind.unassignableCantTearoff);
           }
           expressionType =
               getGetterTypeForMemberTarget(callMember, expressionType)
@@ -621,20 +685,18 @@
     }
 
     if (expressionType is VoidType && !isVoidAllowed) {
-      return AssignabilityKind.unassignableVoid;
+      return const AssignabilityResult(AssignabilityKind.unassignableVoid);
     }
 
-    {
-      IsSubtypeOf result = typeSchemaEnvironment
-          .performNullabilityAwareSubtypeCheck(expressionType, contextType);
-      bool isDirectlyAssignable = isNonNullableByDefault
-          ? result.isSubtypeWhenUsingNullabilities()
-          : result.isSubtypeWhenIgnoringNullabilities();
-      if (isDirectlyAssignable) {
-        return needsTearoff
-            ? AssignabilityKind.assignableTearoff
-            : AssignabilityKind.assignable;
-      }
+    IsSubtypeOf isDirectSubtypeResult = typeSchemaEnvironment
+        .performNullabilityAwareSubtypeCheck(expressionType, contextType);
+    bool isDirectlyAssignable = isNonNullableByDefault
+        ? isDirectSubtypeResult.isSubtypeWhenUsingNullabilities()
+        : isDirectSubtypeResult.isSubtypeWhenIgnoringNullabilities();
+    if (isDirectlyAssignable) {
+      return needsTearoff
+          ? const AssignabilityResult(AssignabilityKind.assignableTearoff)
+          : const AssignabilityResult(AssignabilityKind.assignable);
     }
 
     bool isIndirectlyAssignable = isNonNullableByDefault
@@ -643,19 +705,32 @@
             .performNullabilityAwareSubtypeCheck(contextType, expressionType)
             .isSubtypeWhenIgnoringNullabilities();
     if (!isIndirectlyAssignable) {
-      return needsTearoff
-          ? AssignabilityKind.unassignableTearoff
-          : AssignabilityKind.unassignable;
+      if (isNonNullableByDefault &&
+          isDirectSubtypeResult.isSubtypeWhenIgnoringNullabilities()) {
+        return needsTearoff
+            ? new AssignabilityResult.withTypes(
+                AssignabilityKind.unassignableNullabilityTearoff,
+                isDirectSubtypeResult.subtype,
+                isDirectSubtypeResult.supertype)
+            : new AssignabilityResult.withTypes(
+                AssignabilityKind.unassignableNullability,
+                isDirectSubtypeResult.subtype,
+                isDirectSubtypeResult.supertype);
+      } else {
+        return needsTearoff
+            ? const AssignabilityResult(AssignabilityKind.unassignableTearoff)
+            : const AssignabilityResult(AssignabilityKind.unassignable);
+      }
     }
     if (isExpressionTypePrecise) {
       // The type of the expression is known precisely, so an implicit
       // downcast is guaranteed to fail.  Insert a compile-time error.
-      return AssignabilityKind.unassignablePrecise;
+      return const AssignabilityResult(AssignabilityKind.unassignablePrecise);
     }
     // Insert an implicit downcast.
     return needsTearoff
-        ? AssignabilityKind.assignableTearoffCast
-        : AssignabilityKind.assignableCast;
+        ? const AssignabilityResult(AssignabilityKind.assignableTearoffCast)
+        : const AssignabilityResult(AssignabilityKind.assignableCast);
   }
 
   bool isNull(DartType type) {
@@ -2050,7 +2125,11 @@
               isVoidAllowed: expectedType is VoidType,
               // TODO(johnniwinther): Specialize message for operator
               // invocations.
-              errorTemplate: templateArgumentTypeNotAssignable);
+              errorTemplate: templateArgumentTypeNotAssignable,
+              nullabilityErrorTemplate:
+                  templateArgumentTypeNotAssignableNullability,
+              nullabilityPartErrorTemplate:
+                  templateArgumentTypeNotAssignablePartNullability);
           if (namedExpression == null) {
             arguments.positional[positionalShift + i] = expression
               ..parent = arguments;
@@ -4238,6 +4317,25 @@
 
   /// Unassignable because the tear-off can't be done on the nullable receiver.
   unassignableCantTearoff,
+
+  /// Unassignable only because of nullability modifiers.
+  unassignableNullability,
+
+  /// Unassignable because of nullability and needs a tearoff of "call" for
+  /// better error reporting.
+  unassignableNullabilityTearoff,
+}
+
+class AssignabilityResult {
+  final AssignabilityKind kind;
+  final DartType subtype; // Can be null.
+  final DartType supertype; // Can be null.
+
+  const AssignabilityResult(this.kind)
+      : subtype = null,
+        supertype = null;
+
+  AssignabilityResult.withTypes(this.kind, this.subtype, this.supertype);
 }
 
 /// Convenient way to return both a tear-off expression and its type.
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index e45107d..5dad4ce 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -6,10 +6,10 @@
 # always be fixed by either spelling correctly or updating the dictionary.
 
 AbstractClassInstantiation/example: Fail
-AbstractFieldConstructorInitializer/analyzerCode: Fail
-AbstractFieldInitializer/analyzerCode: Fail
 AbstractExtensionField/analyzerCode: Fail
 AbstractExtensionField/example: Fail
+AbstractFieldConstructorInitializer/analyzerCode: Fail
+AbstractFieldInitializer/analyzerCode: Fail
 AbstractNotSync/example: Fail
 AbstractRedirectedClassInstantiation/example: Fail
 AccessError/analyzerCode: Fail
@@ -24,7 +24,6 @@
 AnonymousBreakTargetOutsideFunction/statement: Fail # Duplicated error as parser also complains.
 AnonymousContinueTargetOutsideFunction/part_wrapped_statement: Fail
 AnonymousContinueTargetOutsideFunction/statement: Fail # Duplicated error as parser also complains.
-ArgumentTypeNotAssignable/example: Fail
 AssertAsExpression/analyzerCode: Fail
 AssertAsExpression/example: Fail
 AssertExtraneousArgument/analyzerCode: Fail
@@ -118,10 +117,10 @@
 ConstEvalNegativeShift/analyzerCode: Fail # http://dartbug.com/33481
 ConstEvalNegativeShift/example: Fail
 ConstEvalNonConstantVariableGet/example: Fail
-ConstEvalNotListOrSetInSpread/example: Fail
-ConstEvalNotMapInSpread/example: Fail
 ConstEvalNonNull/analyzerCode: Fail
 ConstEvalNonNull/example: Fail
+ConstEvalNotListOrSetInSpread/example: Fail
+ConstEvalNotMapInSpread/example: Fail
 ConstEvalNullValue/example: Fail
 ConstEvalStartingPoint/analyzerCode: Fail # This is just used for displaying the starting point.
 ConstEvalStartingPoint/example: Fail # This is just used for displaying the starting point.
@@ -168,6 +167,8 @@
 DirectiveAfterDeclaration/part_wrapped_script2: Fail
 DirectiveAfterDeclaration/script1: Fail
 DirectiveAfterDeclaration/script2: Fail
+DuplicateDeferred/example: Fail
+DuplicatePrefix/example: Fail
 DuplicatedDeclarationUse/analyzerCode: Fail # No corresponding analyzer code.
 DuplicatedDeclarationUse/part_wrapped_script1: Fail
 DuplicatedDeclarationUse/part_wrapped_script2: Fail
@@ -175,7 +176,6 @@
 DuplicatedDeclarationUse/script2: Fail # Wrong error.
 DuplicatedDefinition/analyzerCode: Fail
 DuplicatedDefinition/example: Fail
-DuplicateDeferred/example: Fail
 DuplicatedExport/part_wrapped_script: Fail # Exporting file in the (now) part.
 DuplicatedExportInType/analyzerCode: Fail
 DuplicatedExportInType/example: Fail
@@ -187,9 +187,6 @@
 DuplicatedName/example: Fail
 DuplicatedNamedArgument/example: Fail
 DuplicatedParameterName/example: Fail
-DuplicatePrefix/example: Fail
-ExceptionReadingFile/analyzerCode: Fail
-ExceptionReadingFile/example: Fail
 Encoding/analyzerCode: Fail
 EnumConstantSameNameAsEnclosing/example: Fail
 EnumInstantiation/example: Fail
@@ -197,6 +194,8 @@
 EqualityCannotBeEqualityOperand/part_wrapped_script2: Fail
 EqualityCannotBeEqualityOperand/script1: Fail
 EqualityCannotBeEqualityOperand/script2: Fail
+ExceptionReadingFile/analyzerCode: Fail
+ExceptionReadingFile/example: Fail
 ExpectedBlock/part_wrapped_script: Fail
 ExpectedBlock/script: Fail
 ExpectedBlockToSkip/part_wrapped_script: Fail
@@ -267,7 +266,6 @@
 ExternalFactoryWithBody/script1: Fail
 ExternalFieldConstructorInitializer/analyzerCode: Fail
 ExternalFieldInitializer/analyzerCode: Fail
-ExtraneousModifier/part_wrapped_script1: Fail
 ExtraneousModifier/part_wrapped_script10: Fail
 ExtraneousModifier/part_wrapped_script11: Fail
 ExtraneousModifier/part_wrapped_script12: Fail
@@ -276,17 +274,16 @@
 ExtraneousModifier/part_wrapped_script17: Fail
 ExtraneousModifier/part_wrapped_script18: Fail
 ExtraneousModifier/part_wrapped_script19: Fail
-ExtraneousModifier/part_wrapped_script2: Fail
+ExtraneousModifier/part_wrapped_script1: Fail
 ExtraneousModifier/part_wrapped_script20: Fail
+ExtraneousModifier/part_wrapped_script2: Fail
 ExtraneousModifier/part_wrapped_script3: Fail
 ExtraneousModifier/part_wrapped_script4: Fail
 ExtraneousModifier/part_wrapped_script5: Fail
 ExtraneousModifier/part_wrapped_script6: Fail # Fails because two errors are given. Only one should be given though.
-ExtraneousModifier/script6: Fail # Fails because two errors are given. Only one should be given though.
 ExtraneousModifier/part_wrapped_script7: Fail
 ExtraneousModifier/part_wrapped_script8: Fail
 ExtraneousModifier/part_wrapped_script9: Fail
-ExtraneousModifier/script1: Fail
 ExtraneousModifier/script10: Fail
 ExtraneousModifier/script11: Fail
 ExtraneousModifier/script12: Fail
@@ -295,11 +292,13 @@
 ExtraneousModifier/script17: Fail
 ExtraneousModifier/script18: Fail
 ExtraneousModifier/script19: Fail
-ExtraneousModifier/script2: Fail
+ExtraneousModifier/script1: Fail
 ExtraneousModifier/script20: Fail
+ExtraneousModifier/script2: Fail
 ExtraneousModifier/script3: Fail
 ExtraneousModifier/script4: Fail
 ExtraneousModifier/script5: Fail
+ExtraneousModifier/script6: Fail # Fails because two errors are given. Only one should be given though.
 ExtraneousModifier/script7: Fail
 ExtraneousModifier/script8: Fail
 ExtraneousModifier/script9: Fail
@@ -339,14 +338,13 @@
 FinalAndCovariant/part_wrapped_script2: Fail
 FinalAndCovariant/script2: Fail
 FinalFieldWithoutInitializer/example: Fail
-ForInLoopElementTypeNotAssignable/example: Fail
 ForInLoopExactlyOneVariable/analyzerCode: Fail # The analyzer doesn't recover well.
 ForInLoopExactlyOneVariable/part_wrapped_statement: Fail
 ForInLoopExactlyOneVariable/statement: Fail # Fasta reports too many errors.
 ForInLoopNotAssignable/analyzerCode: Fail # The analyzer reports a different error.
 ForInLoopNotAssignable/part_wrapped_statement: Fail
 ForInLoopNotAssignable/statement: Fail
-ForInLoopTypeNotIterable/example: Fail
+ForInLoopTypeNotIterablePartNullability/example: Fail # Cannot occur but needed for symmetry with ForInLoopTypeNotIterableNullability
 ForInLoopWithConstVariable/example: Fail
 FunctionTypeDefaultValue/example: Fail
 FunctionTypedParameterVar/part_wrapped_script1: Fail
@@ -391,10 +389,10 @@
 IncompatibleRedirecteeFunctionType/part_wrapped_script6: Fail
 IncompatibleRedirecteeFunctionType/script6: Fail # Triggers multiple errors.
 IncompatibleRedirecteeFunctionTypeWarning/example: Fail
-IncorrectTypeArgumentInferredWarning/example: Fail
 IncorrectTypeArgumentInReturnTypeWarning/example: Fail
 IncorrectTypeArgumentInSupertypeInferredWarning/example: Fail
 IncorrectTypeArgumentInSupertypeWarning/example: Fail
+IncorrectTypeArgumentInferredWarning/example: Fail
 IncorrectTypeArgumentQualifiedInferredWarning/example: Fail
 IncorrectTypeArgumentQualifiedWarning/example: Fail
 IncorrectTypeArgumentWarning/example: Fail
@@ -444,6 +442,10 @@
 InvalidPackageUri/example: Fail
 InvalidReturn/analyzerCode: Fail
 InvalidReturnAsync/analyzerCode: Fail
+InvalidReturnAsyncNullability/analyzerCode: Fail
+InvalidReturnAsyncPartNullability/analyzerCode: Fail
+InvalidReturnNullability/analyzerCode: Fail
+InvalidReturnPartNullability/analyzerCode: Fail
 InvalidSuperInInitializer/example: Fail
 InvalidThisInInitializer/example: Fail
 InvalidTypeVariableInSupertype/analyzerCode: Fail
@@ -547,6 +549,9 @@
 NeverValueWarning/analyzerCode: Fail
 NeverValueWarning/example: Fail
 NoFormals/example: Fail
+NoSuchNamedParameter/example: Fail
+NoUnnamedConstructorInObject/analyzerCode: Fail
+NoUnnamedConstructorInObject/example: Fail
 NonAgnosticConstant/analyzerCode: Fail
 NonAgnosticConstant/example: Fail
 NonAsciiIdentifier/expression: Fail
@@ -554,6 +559,7 @@
 NonConstConstructor/example: Fail
 NonConstFactory/example: Fail
 NonInstanceTypeVariableUse/example: Fail
+NonNullAwareSpreadIsNull/analyzerCode: Fail # There's no analyzer code for that error yet.
 NonNullableInNullAware/analyzerCode: Fail
 NonNullableInNullAware/example: Fail
 NonNullableNotAssignedError/analyzerCode: Fail
@@ -563,17 +569,14 @@
 NonNullableOptOutExplicit/example: Fail
 NonNullableOptOutImplicit/analyzerCode: Fail
 NonNullableOptOutImplicit/example: Fail
-NonNullAwareSpreadIsNull/analyzerCode: Fail # There's no analyzer code for that error yet.
 NonPartOfDirectiveInPart/part_wrapped_script1: Fail
 NonPartOfDirectiveInPart/script1: Fail
-NoSuchNamedParameter/example: Fail
 NotAConstantExpression/example: Fail
-NotAnLvalue/example: Fail
 NotAType/example: Fail
+NotAnLvalue/example: Fail
 NotBinaryOperator/analyzerCode: Fail
 NotConstantExpression/example: Fail
-NoUnnamedConstructorInObject/analyzerCode: Fail
-NoUnnamedConstructorInObject/example: Fail
+NullAwareCascadeOutOfOrder/example: Fail
 NullableExpressionCallError/analyzerCode: Fail
 NullableExpressionCallError/example: Fail
 NullableExpressionCallWarning/analyzerCode: Fail
@@ -608,7 +611,6 @@
 NullableTearoffError/example: Fail
 NullableTearoffWarning/analyzerCode: Fail
 NullableTearoffWarning/example: Fail
-NullAwareCascadeOutOfOrder/example: Fail
 OperatorMinusParameterMismatch/example: Fail
 OperatorParameterMismatch0/analyzerCode: Fail
 OperatorParameterMismatch0/example: Fail
@@ -705,13 +707,13 @@
 StrongModeNNBDPackageOptOut/example: Fail
 SuperAsExpression/example: Fail
 SuperAsIdentifier/example: Fail
+SuperNullAware/example: Fail
 SuperclassHasNoDefaultConstructor/example: Fail
 SuperclassHasNoGetter/example: Fail
 SuperclassHasNoMethod/example: Fail
 SuperclassHasNoSetter/example: Fail
 SuperclassMethodArgumentMismatch/analyzerCode: Fail
 SuperclassMethodArgumentMismatch/example: Fail
-SuperNullAware/example: Fail
 SupertypeIsFunction/analyzerCode: Fail
 SupertypeIsFunction/example: Fail
 SupertypeIsIllegal/example: Fail
@@ -736,14 +738,14 @@
 TypeArgumentMismatch/example: Fail
 TypeArgumentsOnTypeVariable/part_wrapped_script1: Fail
 TypeArgumentsOnTypeVariable/script1: Fail
+TypeNotFound/example: Fail
+TypeVariableDuplicatedName/example: Fail
+TypeVariableSameNameAsEnclosing/example: Fail
 TypedefNotFunction/example: Fail
 TypedefNotType/example: Fail # Feature not yet enabled by default.
 TypedefNullableType/analyzerCode: Fail
 TypedefTypeVariableNotConstructor/analyzerCode: Fail # Feature not yet enabled by default.
 TypedefTypeVariableNotConstructor/example: Fail # Feature not yet enabled by default.
-TypeNotFound/example: Fail
-TypeVariableDuplicatedName/example: Fail
-TypeVariableSameNameAsEnclosing/example: Fail
 UnexpectedToken/part_wrapped_script1: Fail
 UnexpectedToken/script1: Fail
 UnmatchedToken/part_wrapped_script1: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 53df438..cb15a5f 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -3275,6 +3275,33 @@
 ArgumentTypeNotAssignable:
   template: "The argument type '#type' can't be assigned to the parameter type '#type2'."
   analyzerCode: ARGUMENT_TYPE_NOT_ASSIGNABLE
+  script: >
+    method(int i) {}
+    main() {
+      method(1.5);
+    }
+
+ArgumentTypeNotAssignableNullability:
+  template: "The argument type '#type' can't be assigned to the parameter type '#type2' because '#type' is nullable and '#type2' isn't."
+  analyzerCode: ARGUMENT_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    method(int i) {}
+    main() {
+      int? j = null;
+      method(j);
+    }
+
+ArgumentTypeNotAssignablePartNullability:
+  template: "The argument type '#type' can't be assigned to the parameter type '#type2' because '#type3' is nullable and '#type4' isn't."
+  analyzerCode: ARGUMENT_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    method(List<int> i) {}
+    main() {
+      List<int?> j = [null];
+      method(j);
+    }
 
 InvalidAssignmentError:
   template: "A value of type '#type' can't be assigned to a variable of type '#type2'."
@@ -3285,6 +3312,28 @@
       i = 1.5;
     }
 
+InvalidAssignmentErrorNullability:
+  template: "A value of type '#type' can't be assigned to a variable of type '#type2' because '#type' is nullable and '#type2' isn't."
+  analyzerCode: INVALID_ASSIGNMENT
+  configuration: nnbd-strong
+  script: >
+    main() {
+      int i = 0;
+      int? j;
+      i = j;
+    }
+
+InvalidAssignmentErrorPartNullability:
+  template: "A value of type '#type' can't be assigned to a variable of type '#type2' because '#type3' is nullable and '#type4' isn't."
+  analyzerCode: INVALID_ASSIGNMENT
+  configuration: nnbd-strong
+  script: >
+    main() {
+      List<int> i = [];
+      List<int?> j = [null];
+      i = j;
+    }
+
 PatchClassTypeVariablesMismatch:
   template: "A patch class must have the same number of type variables as its origin class."
 
@@ -3540,10 +3589,59 @@
   template: "A value of type '#type' can't be assigned to a variable of type '#type2'."
   tip: "Try changing the type of the variable."
   analyzerCode: FOR_IN_OF_INVALID_ELEMENT_TYPE
+  script: |
+    method() {
+      List<String> list = [];
+      for (int i in list) {}
+    }
+
+ForInLoopElementTypeNotAssignableNullability:
+  template: "A value of type '#type' can't be assigned to a variable of type '#type2' because '#type' is nullable and '#type2' isn't."
+  tip: "Try changing the type of the variable."
+  analyzerCode: FOR_IN_OF_INVALID_ELEMENT_TYPE
+  configuration: nnbd-strong
+  script: |
+    method() {
+      List<int?> list = [];
+      for (int i in list) {}
+    }
+
+ForInLoopElementTypeNotAssignablePartNullability:
+  template: "A value of type '#type' can't be assigned to a variable of type '#type2' because '#type3' is nullable and '#type4' isn't."
+  tip: "Try changing the type of the variable."
+  analyzerCode: FOR_IN_OF_INVALID_ELEMENT_TYPE
+  configuration: nnbd-strong
+  script: |
+    method() {
+      List<List<int?>> list = [[]];
+      for (List<int> i in list) {}
+    }
 
 ForInLoopTypeNotIterable:
   template: "The type '#type' used in the 'for' loop must implement '#type2'."
   analyzerCode: FOR_IN_OF_INVALID_TYPE
+  script: |
+    method() {
+      String list = '';
+      for (int i in list) {}
+    }
+
+ForInLoopTypeNotIterableNullability:
+  template: "The type '#type' used in the 'for' loop must implement '#type2' because '#type' is nullable and '#type2' isn't."
+  analyzerCode: FOR_IN_OF_INVALID_TYPE
+  configuration: nnbd-strong
+  script: |
+    method() {
+      List<int>? list = null;
+      for (int i in list) {}
+    }
+
+# This cannot never occur since the iterable is checked to be assignable to `Iterable<dynamic>` so nullability can
+# only be a problem at the immediate level as in [ForInLoopTypeNotIterableNullability]. The message is needed for
+# symmetry in the call site.
+ForInLoopTypeNotIterablePartNullability:
+  template: "The type '#type' used in the 'for' loop must implement '#type2' because '#type3' is nullable and '#type4' isn't."
+  analyzerCode: FOR_IN_OF_INVALID_TYPE
 
 InitializingFormalTypeMismatch:
   template: "The type of parameter '#name', '#type' is not a subtype of the corresponding field's type, '#type2'."
@@ -3759,11 +3857,31 @@
   configuration: nnbd-strong
   declaration: "int foo() { return true; }"
 
+InvalidReturnNullability:
+  template: "A value of type '#type' can't be returned from a function with return type '#type2' because '#type' is nullable and '#type2' isn't."
+  configuration: nnbd-strong
+  declaration: "int foo(int? i) { return i; }"
+
+InvalidReturnPartNullability:
+  template: "A value of type '#type' can't be returned from a function with return type '#type2' because '#type3' is nullable and '#type4' isn't."
+  configuration: nnbd-strong
+  declaration: "List<int> foo(List<int?> list) { return list; }"
+
 InvalidReturnAsync:
   template: "A value of type '#type' can't be returned from an async function with return type '#type2'."
   configuration: nnbd-strong
   declaration: "Future<int> foo() async { return true; }"
 
+InvalidReturnAsyncNullability:
+  template: "A value of type '#type' can't be returned from an async function with return type '#type2' because '#type' is nullable and '#type2' isn't."
+  configuration: nnbd-strong
+  declaration: "Future<int> foo(int? i) async { return i; }"
+
+InvalidReturnAsyncPartNullability:
+  template: "A value of type '#type' can't be returned from an async function with return type '#type2' because '#type3' is nullable and '#type4' isn't."
+  configuration: nnbd-strong
+  declaration: "Future<List<int>> foo(List<int?> list) async { return list; }"
+
 ImplicitReturnNull:
   template: "A non-null value must be returned since the return type '#type' doesn't allow null."
   configuration: nnbd-strong
@@ -4119,6 +4237,26 @@
       List<int> b = <int>[...a];
     }
 
+SpreadElementTypeMismatchNullability:
+  template: "Can't assign spread elements of type '#type' to collection elements of type '#type2' because '#type' is nullable and '#type2' isn't."
+  analyzerCode: LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    main() {
+      List<int?> a = <int?>[0, null];
+      List<int> b = <int>[...a];
+    }
+
+SpreadElementTypeMismatchPartNullability:
+  template: "Can't assign spread elements of type '#type' to collection elements of type '#type2' because '#type3' is nullable and '#type4' isn't."
+  analyzerCode: LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    main() {
+      List<List<int?>> a = <List<int?>>[[0, null]];
+      List<List<int>> b = <List<int>>[...a];
+    }
+
 SpreadMapEntryTypeMismatch:
   template: "Unexpected type '#type' of a map spread entry.  Expected 'dynamic' or a Map."
   script:
@@ -4142,6 +4280,26 @@
       Map<int, int> b = <int, int>{...a};
     }
 
+SpreadMapEntryElementKeyTypeMismatchNullability:
+  template: "Can't assign spread entry keys of type '#type' to map entry keys of type '#type2' because '#type' is nullable and '#type2' isn't."
+  analyzerCode: MAP_KEY_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    main() {
+      Map<String?, int> a = <String?, int>{"foo": 42, null: 87};
+      Map<String, int> b = <String, int>{...a};
+    }
+
+SpreadMapEntryElementKeyTypeMismatchPartNullability:
+  template: "Can't assign spread entry keys of type '#type' to map entry keys of type '#type2' because '#type3' is nullable and '#type4' isn't."
+  analyzerCode: MAP_KEY_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    main() {
+      Map<List<String?>, int> a = <List<String?>, int>{["foo"]: 42, [null]: 87};
+      Map<List<String>, int> b = <List<String>, int>{...a};
+    }
+
 SpreadMapEntryElementValueTypeMismatch:
   template: "Can't assign spread entry values of type '#type' to map entry values of type '#type2'."
   analyzerCode: MAP_VALUE_TYPE_NOT_ASSIGNABLE
@@ -4151,6 +4309,26 @@
       Map<String, String> b = <String, String>{...a};
     }
 
+SpreadMapEntryElementValueTypeMismatchNullability:
+  template: "Can't assign spread entry values of type '#type' to map entry values of type '#type2' because '#type' is nullable and '#type2' isn't."
+  analyzerCode: MAP_VALUE_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    main() {
+      Map<String, int?> a = <String, int?>{"foo": 42, "bar": null};
+      Map<String, int> b = <String, int>{...a};
+    }
+
+SpreadMapEntryElementValueTypeMismatchPartNullability:
+  template: "Can't assign spread entry values of type '#type' to map entry values of type '#type2' because '#type3' is nullable and '#type4' isn't."
+  analyzerCode: MAP_VALUE_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    main() {
+      Map<String, List<int?>> a = <String, List<int?>>{"foo": [42], "bar": [null]};
+      Map<String, List<int>> b = <String, List<int>>{...a};
+    }
+
 CantDisambiguateNotEnoughInformation:
   template: "Not enough type information to disambiguate between literal set and literal map."
   tip: "Try providing type arguments for the literal explicitly to disambiguate it."
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index f3a1c47..d9b9520 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -1861,6 +1861,7 @@
 misleading
 mismatch
 mismatches
+mismatching
 missing
 misused
 mix
@@ -2305,6 +2306,7 @@
 promotion
 promotions
 propagate
+propagated
 propagates
 propagating
 propagation
@@ -2428,6 +2430,7 @@
 refinement
 refinements
 reflecting
+reflects
 regardless
 region
 regions
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect
index dadacc5..67c9729 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect
@@ -206,7 +206,7 @@
   synthetic constructor •() → self::A0*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A1&S&M1*
@@ -217,7 +217,7 @@
   synthetic constructor •() → self::A1*
     : super self::_A1&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A2&S&M1*
@@ -233,13 +233,13 @@
   synthetic constructor •() → self::A2*
     : super self::_A2&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A0X&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class A0X = self::_A0X&S&M with self::MX {
   synthetic constructor •() → self::A0X*
@@ -255,7 +255,7 @@
   synthetic constructor •() → self::_A1X&S&M1&M*
     : super self::_A1X&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class A1X = self::_A1X&S&M1&M with self::MX {
   synthetic constructor •() → self::A1X*
@@ -276,7 +276,7 @@
   synthetic constructor •() → self::_A2X&S&M1&M2&M*
     : super self::_A2X&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class A2X = self::_A2X&S&M1&M2&M with self::MX {
   synthetic constructor •() → self::A2X*
@@ -287,7 +287,7 @@
   synthetic constructor •() → self::_B0&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class B0 extends self::_B0&S&M {
   synthetic constructor •() → self::B0*
@@ -303,7 +303,7 @@
   synthetic constructor •() → self::_B1&S&M1&M*
     : super self::_B1&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class B1 extends self::_B1&S&M1&M {
   synthetic constructor •() → self::B1*
@@ -324,7 +324,7 @@
   synthetic constructor •() → self::_B2&S&M1&M2&M*
     : super self::_B2&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class B2 extends self::_B2&S&M1&M2&M {
   synthetic constructor •() → self::B2*
@@ -335,7 +335,7 @@
   synthetic constructor •() → self::_B0X&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B0X&S&M&MX*
@@ -356,7 +356,7 @@
   synthetic constructor •() → self::_B1X&S&M1&M*
     : super self::_B1X&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B1X&S&M1&M&MX*
@@ -382,7 +382,7 @@
   synthetic constructor •() → self::_B2X&S&M1&M2&M*
     : super self::_B2X&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B2X&S&M1&M2&M&MX*
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect b/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect
index 9c3d453..3ca69a3 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect
@@ -2,69 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   Object objectVar = objectNullableArg;
 //                      ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = numNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = doubleNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
 //  - 'Function' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = toVoidNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = tearoffableNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullNullableArg;
 //               ^
@@ -79,15 +79,15 @@
 //   numVar = objectNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
 //   numVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
 //   numVar = intNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
 //   numVar = doubleNullableArg;
 //            ^
 //
@@ -169,7 +169,7 @@
 //   intVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   intVar = intNullableArg;
 //            ^
 //
@@ -267,7 +267,7 @@
 //   doubleVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
 //   doubleVar = doubleNullableArg;
 //               ^
 //
@@ -373,12 +373,12 @@
 //   functionVar = doubleNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = functionNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = toVoidNullableArg;
 //                 ^
@@ -471,7 +471,7 @@
 //   toVoidVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
 //   toVoidVar = toVoidNullableArg;
 //               ^
 //
@@ -575,7 +575,7 @@
 //   tearoffableVar = toVoidNullableArg;
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   tearoffableVar = tearoffableNullableArg;
 //                    ^
@@ -682,7 +682,7 @@
 //   xNonNullVar = tearoffableNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = xNonNullNullableArg;
 //                 ^
 //
@@ -694,7 +694,7 @@
 //   xNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -776,7 +776,7 @@
 //   xPotentiallyNullVar = xNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = xPotentiallyNullNullableArg;
 //                         ^
 //
@@ -788,7 +788,7 @@
 //   xPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -870,7 +870,7 @@
 //   yNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
 //   yNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -968,7 +968,7 @@
 //   yPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
 //   yPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -1032,57 +1032,57 @@
   yPotentiallyNullVar = yPotentiallyNullArg;
 }
 static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
-  core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+  core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   Object objectVar = objectNullableArg;
                      ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = numNullableArg;
               ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = doubleNullableArg;
               ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
  - 'Function' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
   objectVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = toVoidNullableArg;
               ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
  - 'Object' is from 'dart:core'.
   objectVar = tearoffableNullableArg;
               ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xNonNullNullableArg;
               ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullArg;
               ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullNullableArg;
               ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yNonNullNullableArg;
               ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullArg;
               ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullNullableArg;
               ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
@@ -1094,13 +1094,13 @@
  - 'Object' is from 'dart:core'.
   numVar = objectNullableArg;
            ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
   numVar = numNullableArg;
            ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
   numVar = intNullableArg;
            ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
   numVar = doubleNullableArg;
            ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::num;
   numVar = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
@@ -1163,7 +1163,7 @@
   intVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
   intVar = numNullableArg;
            ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   intVar = intNullableArg;
            ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::int;
   intVar = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -1238,7 +1238,7 @@
   doubleVar = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
   doubleVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
   doubleVar = doubleNullableArg;
               ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::double;
   doubleVar = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
@@ -1321,11 +1321,11 @@
  - 'Function' is from 'dart:core'.
   functionVar = doubleNullableArg;
                 ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = functionNullableArg;
                 ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = toVoidNullableArg;
                 ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
@@ -1398,7 +1398,7 @@
  - 'Function' is from 'dart:core'.
   toVoidVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
   toVoidVar = toVoidNullableArg;
               ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} () → void;
   toVoidVar = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
@@ -1480,7 +1480,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = toVoidNullableArg;
                    ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = tearoffableNullableArg;
                    ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
@@ -1564,7 +1564,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xNonNullVar = tearoffableNullableArg;
                 ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = xNonNullNullableArg;
                 ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1573,7 +1573,7 @@
   xNonNullVar = let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t155 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1636,7 +1636,7 @@
   xPotentiallyNullVar = let final<BottomType> #t172 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = xNonNullNullableArg;
                         ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = xPotentiallyNullNullableArg;
                         ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xPotentiallyNullVar = let final<BottomType> #t174 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
@@ -1645,7 +1645,7 @@
   xPotentiallyNullVar = let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   self::error::YnonNull yNonNullVar = let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
@@ -1708,7 +1708,7 @@
   yNonNullVar = let final<BottomType> #t194 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
   yNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   yNonNullVar = let final<BottomType> #t196 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
@@ -1783,7 +1783,7 @@
   yPotentiallyNullVar = let final<BottomType> #t217 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
   yPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
 }
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect
index 25a4dd1..fc7fd3d 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect
@@ -2,69 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   Object objectVar = objectNullableArg;
 //                      ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = numNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = doubleNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
 //  - 'Function' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = toVoidNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = tearoffableNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullNullableArg;
 //               ^
@@ -79,15 +79,15 @@
 //   numVar = objectNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
 //   numVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
 //   numVar = intNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
 //   numVar = doubleNullableArg;
 //            ^
 //
@@ -169,7 +169,7 @@
 //   intVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   intVar = intNullableArg;
 //            ^
 //
@@ -267,7 +267,7 @@
 //   doubleVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
 //   doubleVar = doubleNullableArg;
 //               ^
 //
@@ -373,12 +373,12 @@
 //   functionVar = doubleNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = functionNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = toVoidNullableArg;
 //                 ^
@@ -471,7 +471,7 @@
 //   toVoidVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
 //   toVoidVar = toVoidNullableArg;
 //               ^
 //
@@ -575,7 +575,7 @@
 //   tearoffableVar = toVoidNullableArg;
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   tearoffableVar = tearoffableNullableArg;
 //                    ^
@@ -682,7 +682,7 @@
 //   xNonNullVar = tearoffableNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = xNonNullNullableArg;
 //                 ^
 //
@@ -694,7 +694,7 @@
 //   xNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -776,7 +776,7 @@
 //   xPotentiallyNullVar = xNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = xPotentiallyNullNullableArg;
 //                         ^
 //
@@ -788,7 +788,7 @@
 //   xPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -870,7 +870,7 @@
 //   yNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
 //   yNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -968,7 +968,7 @@
 //   yPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
 //   yPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -1032,57 +1032,57 @@
   yPotentiallyNullVar = yPotentiallyNullArg;
 }
 static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
-  core::Object objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+  core::Object objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   Object objectVar = objectNullableArg;
                      ^" in let core::Object? #t5 = objectNullableArg in #t5.==(null) ?{core::Object} #t5 as{TypeError,ForNonNullableByDefault} core::Object : #t5{core::Object};
-  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = numNullableArg;
               ^" in let core::num? #t7 = numNullableArg in #t7.==(null) ?{core::Object} #t7 as{TypeError,ForNonNullableByDefault} core::Object : #t7{core::Object};
-  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = intNullableArg;
               ^" in let core::int? #t9 = intNullableArg in #t9.==(null) ?{core::Object} #t9 as{TypeError,ForNonNullableByDefault} core::Object : #t9{core::Object};
-  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = doubleNullableArg;
               ^" in let core::double? #t11 = doubleNullableArg in #t11.==(null) ?{core::Object} #t11 as{TypeError,ForNonNullableByDefault} core::Object : #t11{core::Object};
-  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
  - 'Function' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
   objectVar = functionNullableArg;
               ^" in let core::Function? #t13 = functionNullableArg in #t13.==(null) ?{core::Object} #t13 as{TypeError,ForNonNullableByDefault} core::Object : #t13{core::Object};
-  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = toVoidNullableArg;
               ^" in let () →? void #t15 = toVoidNullableArg in #t15.==(null) ?{core::Object} #t15 as{TypeError,ForNonNullableByDefault} core::Object : #t15{core::Object};
-  objectVar = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
  - 'Object' is from 'dart:core'.
   objectVar = tearoffableNullableArg;
               ^" in let self::Tearoffable? #t17 = tearoffableNullableArg in #t17.==(null) ?{core::Object} #t17 as{TypeError,ForNonNullableByDefault} core::Object : #t17{core::Object};
-  objectVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xNonNullNullableArg;
               ^" in let self::error::XnonNull? #t19 = xNonNullNullableArg in #t19.==(null) ?{core::Object} #t19 as{TypeError,ForNonNullableByDefault} core::Object : #t19{core::Object};
-  objectVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullArg;
               ^" in let self::error::XpotentiallyNull% #t21 = xPotentiallyNullArg in #t21.==(null) ?{core::Object} #t21 as{TypeError,ForNonNullableByDefault} core::Object : #t21{core::Object};
-  objectVar = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullNullableArg;
               ^" in let self::error::XpotentiallyNull? #t23 = xPotentiallyNullNullableArg in #t23.==(null) ?{core::Object} #t23 as{TypeError,ForNonNullableByDefault} core::Object : #t23{core::Object};
-  objectVar = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yNonNullNullableArg;
               ^" in let self::error::YnonNull? #t25 = yNonNullNullableArg in #t25.==(null) ?{core::Object} #t25 as{TypeError,ForNonNullableByDefault} core::Object : #t25{core::Object};
-  objectVar = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullArg;
               ^" in let self::error::YpotentiallyNull% #t27 = yPotentiallyNullArg in #t27.==(null) ?{core::Object} #t27 as{TypeError,ForNonNullableByDefault} core::Object : #t27{core::Object};
-  objectVar = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullNullableArg;
               ^" in let self::error::YpotentiallyNull? #t29 = yPotentiallyNullNullableArg in #t29.==(null) ?{core::Object} #t29 as{TypeError,ForNonNullableByDefault} core::Object : #t29{core::Object};
@@ -1094,13 +1094,13 @@
  - 'Object' is from 'dart:core'.
   numVar = objectNullableArg;
            ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
   numVar = numNullableArg;
            ^" in let core::num? #t33 = numNullableArg in #t33.==(null) ?{core::num} #t33 as{TypeError,ForNonNullableByDefault} core::num : #t33{core::num};
-  numVar = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
   numVar = intNullableArg;
            ^" in let core::int? #t35 = intNullableArg in #t35.==(null) ?{core::num} #t35 as{TypeError,ForNonNullableByDefault} core::num : #t35{core::num};
-  numVar = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
   numVar = doubleNullableArg;
            ^" in let core::double? #t37 = doubleNullableArg in #t37.==(null) ?{core::num} #t37 as{TypeError,ForNonNullableByDefault} core::num : #t37{core::num};
   numVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
@@ -1163,7 +1163,7 @@
   intVar = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
   intVar = numNullableArg;
            ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   intVar = intNullableArg;
            ^" in let core::int? #t57 = intNullableArg in #t57.==(null) ?{core::int} #t57 as{TypeError,ForNonNullableByDefault} core::int : #t57{core::int};
   intVar = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -1238,7 +1238,7 @@
   doubleVar = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
   doubleVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
   doubleVar = doubleNullableArg;
               ^" in let core::double? #t81 = doubleNullableArg in #t81.==(null) ?{core::double} #t81 as{TypeError,ForNonNullableByDefault} core::double : #t81{core::double};
   doubleVar = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
@@ -1321,11 +1321,11 @@
  - 'Function' is from 'dart:core'.
   functionVar = doubleNullableArg;
                 ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = functionNullableArg;
                 ^" in let core::Function? #t105 = functionNullableArg in #t105.==(null) ?{core::Function} #t105 as{TypeError,ForNonNullableByDefault} core::Function : #t105{core::Function};
-  functionVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = toVoidNullableArg;
                 ^" in let () →? void #t107 = toVoidNullableArg in #t107.==(null) ?{core::Function} #t107 as{TypeError,ForNonNullableByDefault} core::Function : #t107{core::Function};
@@ -1398,7 +1398,7 @@
  - 'Function' is from 'dart:core'.
   toVoidVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
   toVoidVar = toVoidNullableArg;
               ^" in let () →? void #t128 = toVoidNullableArg in #t128.==(null) ?{() → void} #t128 as{TypeError,ForNonNullableByDefault} () → void : #t128{() → void};
   toVoidVar = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
@@ -1480,7 +1480,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = toVoidNullableArg;
                    ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = tearoffableNullableArg;
                    ^" in let self::Tearoffable? #t151 = tearoffableNullableArg in #t151.==(null) ?{self::Tearoffable} #t151 as{TypeError,ForNonNullableByDefault} self::Tearoffable : #t151{self::Tearoffable};
@@ -1564,7 +1564,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xNonNullVar = tearoffableNullableArg;
                 ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t174 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t174 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = xNonNullNullableArg;
                 ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1573,7 +1573,7 @@
   xNonNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1636,7 +1636,7 @@
   xPotentiallyNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = xNonNullNullableArg;
                         ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t196 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t196 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = xPotentiallyNullNullableArg;
                         ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xPotentiallyNullVar = let final<BottomType> #t197 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
@@ -1645,7 +1645,7 @@
   xPotentiallyNullVar = let final<BottomType> #t198 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t199 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t199 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   self::error::YnonNull yNonNullVar = let final<BottomType> #t200 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
@@ -1708,7 +1708,7 @@
   yNonNullVar = let final<BottomType> #t217 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
   yNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   yNonNullVar = let final<BottomType> #t219 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
@@ -1783,7 +1783,7 @@
   yPotentiallyNullVar = let final<BottomType> #t240 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
   yPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
 }
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect b/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
index 9c3d453..3ca69a3 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
@@ -2,69 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   Object objectVar = objectNullableArg;
 //                      ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = numNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = doubleNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
 //  - 'Function' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = toVoidNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = tearoffableNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullNullableArg;
 //               ^
@@ -79,15 +79,15 @@
 //   numVar = objectNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
 //   numVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
 //   numVar = intNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
 //   numVar = doubleNullableArg;
 //            ^
 //
@@ -169,7 +169,7 @@
 //   intVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   intVar = intNullableArg;
 //            ^
 //
@@ -267,7 +267,7 @@
 //   doubleVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
 //   doubleVar = doubleNullableArg;
 //               ^
 //
@@ -373,12 +373,12 @@
 //   functionVar = doubleNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = functionNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = toVoidNullableArg;
 //                 ^
@@ -471,7 +471,7 @@
 //   toVoidVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
 //   toVoidVar = toVoidNullableArg;
 //               ^
 //
@@ -575,7 +575,7 @@
 //   tearoffableVar = toVoidNullableArg;
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   tearoffableVar = tearoffableNullableArg;
 //                    ^
@@ -682,7 +682,7 @@
 //   xNonNullVar = tearoffableNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = xNonNullNullableArg;
 //                 ^
 //
@@ -694,7 +694,7 @@
 //   xNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -776,7 +776,7 @@
 //   xPotentiallyNullVar = xNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = xPotentiallyNullNullableArg;
 //                         ^
 //
@@ -788,7 +788,7 @@
 //   xPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -870,7 +870,7 @@
 //   yNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
 //   yNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -968,7 +968,7 @@
 //   yPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
 //   yPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -1032,57 +1032,57 @@
   yPotentiallyNullVar = yPotentiallyNullArg;
 }
 static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
-  core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+  core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   Object objectVar = objectNullableArg;
                      ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = numNullableArg;
               ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = doubleNullableArg;
               ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
  - 'Function' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
   objectVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = toVoidNullableArg;
               ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
  - 'Object' is from 'dart:core'.
   objectVar = tearoffableNullableArg;
               ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xNonNullNullableArg;
               ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullArg;
               ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullNullableArg;
               ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yNonNullNullableArg;
               ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullArg;
               ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullNullableArg;
               ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
@@ -1094,13 +1094,13 @@
  - 'Object' is from 'dart:core'.
   numVar = objectNullableArg;
            ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
   numVar = numNullableArg;
            ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
   numVar = intNullableArg;
            ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
   numVar = doubleNullableArg;
            ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::num;
   numVar = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
@@ -1163,7 +1163,7 @@
   intVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
   intVar = numNullableArg;
            ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   intVar = intNullableArg;
            ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::int;
   intVar = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -1238,7 +1238,7 @@
   doubleVar = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
   doubleVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
   doubleVar = doubleNullableArg;
               ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::double;
   doubleVar = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
@@ -1321,11 +1321,11 @@
  - 'Function' is from 'dart:core'.
   functionVar = doubleNullableArg;
                 ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = functionNullableArg;
                 ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = toVoidNullableArg;
                 ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
@@ -1398,7 +1398,7 @@
  - 'Function' is from 'dart:core'.
   toVoidVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
   toVoidVar = toVoidNullableArg;
               ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} () → void;
   toVoidVar = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
@@ -1480,7 +1480,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = toVoidNullableArg;
                    ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = tearoffableNullableArg;
                    ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
@@ -1564,7 +1564,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xNonNullVar = tearoffableNullableArg;
                 ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = xNonNullNullableArg;
                 ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1573,7 +1573,7 @@
   xNonNullVar = let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t155 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1636,7 +1636,7 @@
   xPotentiallyNullVar = let final<BottomType> #t172 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = xNonNullNullableArg;
                         ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = xPotentiallyNullNullableArg;
                         ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xPotentiallyNullVar = let final<BottomType> #t174 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
@@ -1645,7 +1645,7 @@
   xPotentiallyNullVar = let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   self::error::YnonNull yNonNullVar = let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
@@ -1708,7 +1708,7 @@
   yNonNullVar = let final<BottomType> #t194 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
   yNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   yNonNullVar = let final<BottomType> #t196 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
@@ -1783,7 +1783,7 @@
   yPotentiallyNullVar = let final<BottomType> #t217 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
   yPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
 }
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
index c141b93..45a8006 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
@@ -2,69 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   Object objectVar = objectNullableArg;
 //                      ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = numNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = doubleNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
 //  - 'Function' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = toVoidNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = tearoffableNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullNullableArg;
 //               ^
@@ -79,15 +79,15 @@
 //   numVar = objectNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
 //   numVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
 //   numVar = intNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
 //   numVar = doubleNullableArg;
 //            ^
 //
@@ -169,7 +169,7 @@
 //   intVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   intVar = intNullableArg;
 //            ^
 //
@@ -267,7 +267,7 @@
 //   doubleVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
 //   doubleVar = doubleNullableArg;
 //               ^
 //
@@ -373,12 +373,12 @@
 //   functionVar = doubleNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = functionNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = toVoidNullableArg;
 //                 ^
@@ -471,7 +471,7 @@
 //   toVoidVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
 //   toVoidVar = toVoidNullableArg;
 //               ^
 //
@@ -575,7 +575,7 @@
 //   tearoffableVar = toVoidNullableArg;
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   tearoffableVar = tearoffableNullableArg;
 //                    ^
@@ -682,7 +682,7 @@
 //   xNonNullVar = tearoffableNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = xNonNullNullableArg;
 //                 ^
 //
@@ -694,7 +694,7 @@
 //   xNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -776,7 +776,7 @@
 //   xPotentiallyNullVar = xNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = xPotentiallyNullNullableArg;
 //                         ^
 //
@@ -788,7 +788,7 @@
 //   xPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -870,7 +870,7 @@
 //   yNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
 //   yNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -968,7 +968,7 @@
 //   yPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
 //   yPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -1032,57 +1032,57 @@
   yPotentiallyNullVar = yPotentiallyNullArg;
 }
 static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
-  core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+  core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   Object objectVar = objectNullableArg;
                      ^" in objectNullableArg;
-  objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = numNullableArg;
               ^" in numNullableArg;
-  objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = intNullableArg;
               ^" in intNullableArg;
-  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = doubleNullableArg;
               ^" in doubleNullableArg;
-  objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
  - 'Function' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
   objectVar = functionNullableArg;
               ^" in functionNullableArg;
-  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = toVoidNullableArg;
               ^" in toVoidNullableArg;
-  objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
  - 'Object' is from 'dart:core'.
   objectVar = tearoffableNullableArg;
               ^" in tearoffableNullableArg;
-  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xNonNullNullableArg;
               ^" in xNonNullNullableArg;
-  objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullArg;
               ^" in xPotentiallyNullArg;
-  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullNullableArg;
               ^" in xPotentiallyNullNullableArg;
-  objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yNonNullNullableArg;
               ^" in yNonNullNullableArg;
-  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullArg;
               ^" in yPotentiallyNullArg;
-  objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullNullableArg;
               ^" in yPotentiallyNullNullableArg;
@@ -1094,13 +1094,13 @@
  - 'Object' is from 'dart:core'.
   numVar = objectNullableArg;
            ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
   numVar = numNullableArg;
            ^" in numNullableArg;
-  numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
   numVar = intNullableArg;
            ^" in intNullableArg;
-  numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
   numVar = doubleNullableArg;
            ^" in doubleNullableArg;
   numVar = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
@@ -1163,7 +1163,7 @@
   intVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
   intVar = numNullableArg;
            ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   intVar = intNullableArg;
            ^" in intNullableArg;
   intVar = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -1238,7 +1238,7 @@
   doubleVar = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
   doubleVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
   doubleVar = doubleNullableArg;
               ^" in doubleNullableArg;
   doubleVar = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
@@ -1321,11 +1321,11 @@
  - 'Function' is from 'dart:core'.
   functionVar = doubleNullableArg;
                 ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = functionNullableArg;
                 ^" in functionNullableArg;
-  functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = toVoidNullableArg;
                 ^" in toVoidNullableArg;
@@ -1398,7 +1398,7 @@
  - 'Function' is from 'dart:core'.
   toVoidVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
   toVoidVar = toVoidNullableArg;
               ^" in toVoidNullableArg;
   toVoidVar = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
@@ -1480,7 +1480,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = toVoidNullableArg;
                    ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = tearoffableNullableArg;
                    ^" in tearoffableNullableArg;
@@ -1564,7 +1564,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xNonNullVar = tearoffableNullableArg;
                 ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = xNonNullNullableArg;
                 ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1573,7 +1573,7 @@
   xNonNullVar = let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t155 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1636,7 +1636,7 @@
   xPotentiallyNullVar = let final<BottomType> #t172 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = xNonNullNullableArg;
                         ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = xPotentiallyNullNullableArg;
                         ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xPotentiallyNullVar = let final<BottomType> #t174 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
@@ -1645,7 +1645,7 @@
   xPotentiallyNullVar = let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   self::error::YnonNull yNonNullVar = let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
@@ -1708,7 +1708,7 @@
   yNonNullVar = let final<BottomType> #t194 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
   yNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   yNonNullVar = let final<BottomType> #t196 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
@@ -1783,7 +1783,7 @@
   yPotentiallyNullVar = let final<BottomType> #t217 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
   yPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
 }
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart
new file mode 100644
index 0000000..495a9cc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2020, 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.
+
+// The test checks that if one type isn't assignable to the other only because
+// of the nullability modifiers, the error message reflects that.
+
+class A {
+  const A();
+}
+
+class B extends A {}
+
+class C {
+  num? call() {}
+}
+
+void fooContext(A x) {}
+
+void barContext(List<A> x) {}
+
+void bazContext(num Function() f) {}
+
+A foo(B? x, List<B?> l, Map<B?, B?> m, List<B>? l2, Map<B, B>? m2) {
+  fooContext(x); // Error.
+  A a = x; // Error.
+  <A>[...l]; // Error.
+  <A>[...l2]; // Error.
+  <A, A>{...m}; // Error.
+  <A, A>{...m2}; // Error.
+  for (A y in l) {} // Error.
+  for (A y in l2) {} // Error.
+  switch (x) /*  Error. */ {
+    case const A():
+      break;
+    default:
+      break;
+  }
+  return x; // Error.
+}
+
+List<A> bar(List<B?> x, List<List<B?>> l, Map<List<B?>, List<B?>> m) {
+  barContext(x); // Error.
+  List<A> y = x; // Error.
+  <List<A>>[...l]; // Error.
+  <List<A>, List<A>>{...m}; // Error.
+  for (List<A> y in l) {} // Error.
+  return x; // Error.
+}
+
+void baz(C c) {
+  bazContext(c);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.outline.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.outline.expect
new file mode 100644
index 0000000..b4c79d9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.outline.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    ;
+  method call() → core::num?
+    ;
+}
+static method fooContext(self::A x) → void
+  ;
+static method barContext(core::List<self::A> x) → void
+  ;
+static method bazContext(() → core::num f) → void
+  ;
+static method foo(self::B? x, core::List<self::B?> l, core::Map<self::B?, self::B?> m, core::List<self::B>? l2, core::Map<self::B, self::B>? m2) → self::A
+  ;
+static method bar(core::List<self::B?> x, core::List<core::List<self::B?>> l, core::Map<core::List<self::B?>, core::List<self::B?>> m) → core::List<self::A>
+  ;
+static method baz(self::C c) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.expect
new file mode 100644
index 0000000..d89eb7f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.expect
@@ -0,0 +1,268 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:25:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:26:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a = x; // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A>[...l]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A>[...l2]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A, A>{...m2}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (A y in l) {} // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (A y in l2) {} // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:16: Error: Type 'A' of the case expression is not a subtype of type 'B?' of this switch expression.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     case const A():
+//                ^
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:11: Context: The switch expression is here.
+//   switch (x) /*  Error. */ {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:39:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   barContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:44:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   List<A> y = x; // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>>[...l]; // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:47:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (List<A> y in l) {} // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:48:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:52:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+//   bazContext(c);
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method call() → core::num? {}
+}
+static method fooContext(self::A x) → void {}
+static method barContext(core::List<self::A> x) → void {}
+static method bazContext(() → core::num f) → void {}
+static method foo(self::B? x, core::List<self::B?> l, core::Map<self::B?, self::B?> m, core::List<self::B>? l2, core::Map<self::B, self::B>? m2) → self::A {
+  self::fooContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:25:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} self::A);
+  self::A a = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:26:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a = x; // Error.
+        ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A>[...l]; // Error.
+         ^"];
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A>[...l2]; // Error.
+         ^"];
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^"};
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A, A>{...m2}; // Error.
+            ^": null};
+  for (final self::B? #t3 in l) {
+    self::A y = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (A y in l) {} // Error.
+         ^" in #t3 as{TypeError,ForNonNullableByDefault} self::A;
+  }
+  for (self::A y in let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'Iterable' is from 'dart:core'.
+  for (A y in l2) {} // Error.
+              ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+  }
+  #L1:
+  switch(x) {
+    #L2:
+    case #C1:
+      {
+        break #L1;
+      }
+    #L3:
+    default:
+      {
+        break #L1;
+      }
+  }
+  return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:39:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+}
+static method bar(core::List<self::B?> x, core::List<core::List<self::B?>> l, core::Map<core::List<self::B?>, core::List<self::B?>> m) → core::List<self::A> {
+  self::barContext(let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  barContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>);
+  core::List<self::A> y = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:44:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  List<A> y = x; // Error.
+              ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+  <core::List<self::A>>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>>[...l]; // Error.
+               ^"];
+  <core::List<self::A>, core::List<self::A>>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^"};
+  for (final core::List<self::B?> #t9 in l) {
+    core::List<self::A> y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:47:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (List<A> y in l) {} // Error.
+               ^" in #t9 as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+  }
+  return let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:48:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+}
+static method baz(self::C c) → void {
+  self::bazContext(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:52:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+  bazContext(c);
+             ^" in (let final self::C #t13 = c in #t13.==(null) ?{() → core::num?} null : #t13.{self::C::call}) as{TypeError,ForNonNullableByDefault} () → core::num);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.transformed.expect
new file mode 100644
index 0000000..6125077
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.transformed.expect
@@ -0,0 +1,285 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:25:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:26:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a = x; // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A>[...l]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A>[...l2]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A, A>{...m2}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (A y in l) {} // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (A y in l2) {} // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:16: Error: Type 'A' of the case expression is not a subtype of type 'B?' of this switch expression.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     case const A():
+//                ^
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:11: Context: The switch expression is here.
+//   switch (x) /*  Error. */ {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:39:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   barContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:44:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   List<A> y = x; // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>>[...l]; // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:47:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (List<A> y in l) {} // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:48:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:52:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+//   bazContext(c);
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method call() → core::num? {}
+}
+static method fooContext(self::A x) → void {}
+static method barContext(core::List<self::A> x) → void {}
+static method bazContext(() → core::num f) → void {}
+static method foo(self::B? x, core::List<self::B?> l, core::Map<self::B?, self::B?> m, core::List<self::B>? l2, core::Map<self::B, self::B>? m2) → self::A {
+  self::fooContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:25:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in let self::B? #t2 = x in #t2.==(null) ?{self::A} #t2 as{TypeError,ForNonNullableByDefault} self::A : #t2{self::A});
+  self::A a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:26:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a = x; // Error.
+        ^" in let self::B? #t4 = x in #t4.==(null) ?{self::A} #t4 as{TypeError,ForNonNullableByDefault} self::A : #t4{self::A};
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A>[...l]; // Error.
+         ^"];
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A>[...l2]; // Error.
+         ^"];
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^"};
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A, A>{...m2}; // Error.
+            ^": null};
+  {
+    core::Iterator<self::B?> :sync-for-iterator = l.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final self::B? #t5 = :sync-for-iterator.{core::Iterator::current};
+      {
+        self::A y = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (A y in l) {} // Error.
+         ^" in let self::B? #t7 = #t5 in #t7.==(null) ?{self::A} #t7 as{TypeError,ForNonNullableByDefault} self::A : #t7{self::A};
+      }
+    }
+  }
+  {
+    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'Iterable' is from 'dart:core'.
+  for (A y in l2) {} // Error.
+              ^" in let core::List<self::B>? #t9 = l2 in #t9.==(null) ?{core::Iterable<dynamic>} #t9 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic> : #t9{core::Iterable<dynamic>}).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      self::A y = :sync-for-iterator.{core::Iterator::current};
+      {}
+    }
+  }
+  #L1:
+  switch(x) {
+    #L2:
+    case #C1:
+      {
+        break #L1;
+      }
+    #L3:
+    default:
+      {
+        break #L1;
+      }
+  }
+  return let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:39:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in let self::B? #t11 = x in #t11.==(null) ?{self::A} #t11 as{TypeError,ForNonNullableByDefault} self::A : #t11{self::A};
+}
+static method bar(core::List<self::B?> x, core::List<core::List<self::B?>> l, core::Map<core::List<self::B?>, core::List<self::B?>> m) → core::List<self::A> {
+  self::barContext(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  barContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>);
+  core::List<self::A> y = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:44:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  List<A> y = x; // Error.
+              ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+  <core::List<self::A>>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>>[...l]; // Error.
+               ^"];
+  <core::List<self::A>, core::List<self::A>>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^"};
+  {
+    core::Iterator<core::List<self::B?>> :sync-for-iterator = l.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final core::List<self::B?> #t14 = :sync-for-iterator.{core::Iterator::current};
+      {
+        core::List<self::A> y = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:47:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (List<A> y in l) {} // Error.
+               ^" in #t14 as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+      }
+    }
+  }
+  return let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:48:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+}
+static method baz(self::C c) → void {
+  self::bazContext(let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:52:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+  bazContext(c);
+             ^" in (let final self::C #t18 = c in #t18.==(null) ?{() → core::num?} null : #t18.{self::C::call}) as{TypeError,ForNonNullableByDefault} () → core::num);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.textual_outline.expect
new file mode 100644
index 0000000..1447977
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.textual_outline.expect
@@ -0,0 +1,17 @@
+class A {
+  const A();
+}
+
+class B extends A {}
+
+class C {
+  num? call() {}
+}
+
+void fooContext(A x) {}
+void barContext(List<A> x) {}
+void bazContext(num Function() f) {}
+A foo(B? x, List<B?> l, Map<B?, B?> m, List<B>? l2, Map<B, B>? m2) {}
+List<A> bar(List<B?> x, List<List<B?>> l, Map<List<B?>, List<B?>> m) {}
+void baz(C c) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..d624308
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.textual_outline_modelled.expect
@@ -0,0 +1,18 @@
+A foo(B? x, List<B?> l, Map<B?, B?> m, List<B>? l2, Map<B, B>? m2) {}
+List<A> bar(List<B?> x, List<List<B?>> l, Map<List<B?>, List<B?>> m) {}
+
+class A {
+  const A();
+}
+
+class B extends A {}
+
+class C {
+  num? call() {}
+}
+
+main() {}
+void barContext(List<A> x) {}
+void baz(C c) {}
+void bazContext(num Function() f) {}
+void fooContext(A x) {}
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.expect
new file mode 100644
index 0000000..d89eb7f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.expect
@@ -0,0 +1,268 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:25:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:26:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a = x; // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A>[...l]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A>[...l2]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A, A>{...m2}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (A y in l) {} // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (A y in l2) {} // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:16: Error: Type 'A' of the case expression is not a subtype of type 'B?' of this switch expression.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     case const A():
+//                ^
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:11: Context: The switch expression is here.
+//   switch (x) /*  Error. */ {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:39:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   barContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:44:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   List<A> y = x; // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>>[...l]; // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:47:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (List<A> y in l) {} // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:48:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:52:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+//   bazContext(c);
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method call() → core::num? {}
+}
+static method fooContext(self::A x) → void {}
+static method barContext(core::List<self::A> x) → void {}
+static method bazContext(() → core::num f) → void {}
+static method foo(self::B? x, core::List<self::B?> l, core::Map<self::B?, self::B?> m, core::List<self::B>? l2, core::Map<self::B, self::B>? m2) → self::A {
+  self::fooContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:25:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} self::A);
+  self::A a = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:26:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a = x; // Error.
+        ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A>[...l]; // Error.
+         ^"];
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A>[...l2]; // Error.
+         ^"];
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^"};
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A, A>{...m2}; // Error.
+            ^": null};
+  for (final self::B? #t3 in l) {
+    self::A y = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (A y in l) {} // Error.
+         ^" in #t3 as{TypeError,ForNonNullableByDefault} self::A;
+  }
+  for (self::A y in let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'Iterable' is from 'dart:core'.
+  for (A y in l2) {} // Error.
+              ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+  }
+  #L1:
+  switch(x) {
+    #L2:
+    case #C1:
+      {
+        break #L1;
+      }
+    #L3:
+    default:
+      {
+        break #L1;
+      }
+  }
+  return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:39:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+}
+static method bar(core::List<self::B?> x, core::List<core::List<self::B?>> l, core::Map<core::List<self::B?>, core::List<self::B?>> m) → core::List<self::A> {
+  self::barContext(let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  barContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>);
+  core::List<self::A> y = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:44:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  List<A> y = x; // Error.
+              ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+  <core::List<self::A>>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>>[...l]; // Error.
+               ^"];
+  <core::List<self::A>, core::List<self::A>>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^"};
+  for (final core::List<self::B?> #t9 in l) {
+    core::List<self::A> y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:47:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (List<A> y in l) {} // Error.
+               ^" in #t9 as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+  }
+  return let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:48:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+}
+static method baz(self::C c) → void {
+  self::bazContext(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:52:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+  bazContext(c);
+             ^" in (let final self::C #t13 = c in #t13.==(null) ?{() → core::num?} null : #t13.{self::C::call}) as{TypeError,ForNonNullableByDefault} () → core::num);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.transformed.expect
new file mode 100644
index 0000000..56534e7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.transformed.expect
@@ -0,0 +1,285 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:25:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:26:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a = x; // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A>[...l]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A>[...l2]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A, A>{...m2}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (A y in l) {} // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (A y in l2) {} // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:16: Error: Type 'A' of the case expression is not a subtype of type 'B?' of this switch expression.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     case const A():
+//                ^
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:11: Context: The switch expression is here.
+//   switch (x) /*  Error. */ {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:39:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   barContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:44:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   List<A> y = x; // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>>[...l]; // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:47:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (List<A> y in l) {} // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:48:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:52:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+//   bazContext(c);
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method call() → core::num? {}
+}
+static method fooContext(self::A x) → void {}
+static method barContext(core::List<self::A> x) → void {}
+static method bazContext(() → core::num f) → void {}
+static method foo(self::B? x, core::List<self::B?> l, core::Map<self::B?, self::B?> m, core::List<self::B>? l2, core::Map<self::B, self::B>? m2) → self::A {
+  self::fooContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:25:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in x);
+  self::A a = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:26:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a = x; // Error.
+        ^" in x;
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A>[...l]; // Error.
+         ^"];
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A>[...l2]; // Error.
+         ^"];
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^"};
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A, A>{...m2}; // Error.
+            ^": null};
+  {
+    core::Iterator<self::B?> :sync-for-iterator = l.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final self::B? #t3 = :sync-for-iterator.{core::Iterator::current};
+      {
+        self::A y = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (A y in l) {} // Error.
+         ^" in #t3;
+      }
+    }
+  }
+  {
+    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'Iterable' is from 'dart:core'.
+  for (A y in l2) {} // Error.
+              ^" in l2).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      self::A y = :sync-for-iterator.{core::Iterator::current};
+      {}
+    }
+  }
+  #L1:
+  switch(x) {
+    #L2:
+    case #C1:
+      {
+        break #L1;
+      }
+    #L3:
+    default:
+      {
+        break #L1;
+      }
+  }
+  return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:39:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x;
+}
+static method bar(core::List<self::B?> x, core::List<core::List<self::B?>> l, core::Map<core::List<self::B?>, core::List<self::B?>> m) → core::List<self::A> {
+  self::barContext(let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  barContext(x); // Error.
+             ^" in x);
+  core::List<self::A> y = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:44:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  List<A> y = x; // Error.
+              ^" in x;
+  <core::List<self::A>>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>>[...l]; // Error.
+               ^"];
+  <core::List<self::A>, core::List<self::A>>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:46:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^"};
+  {
+    core::Iterator<core::List<self::B?>> :sync-for-iterator = l.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final core::List<self::B?> #t9 = :sync-for-iterator.{core::Iterator::current};
+      {
+        core::List<self::A> y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:47:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (List<A> y in l) {} // Error.
+               ^" in #t9;
+      }
+    }
+  }
+  return let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:48:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x;
+}
+static method baz(self::C c) → void {
+  self::bazContext(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:52:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+  bazContext(c);
+             ^" in let final self::C #t13 = c in #t13.==(null) ?{() → core::num?} null : #t13.{self::C::call});
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.strong.expect b/pkg/front_end/testcases/nnbd/forin.dart.strong.expect
index d6e6324..d772415 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.strong.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in i2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in i2) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in l2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in l2) x];
@@ -52,20 +52,20 @@
 import "dart:core" as core;
 
 static method error(core::Iterable<core::int>? i2, core::List<core::int>? l2, core::Object o1, core::Object? o2) → dynamic {
-  for (core::int x in let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  for (core::int x in let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   for (int x in i2) x;
                 ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
     x;
   block {
     final core::List<core::int> #t2 = <core::int>[];
-    for (core::int x in let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    for (core::int x in let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   [for (int x in i2) x];
                  ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
       #t2.{core::List::add}(x);
   } =>#t2;
-  for (core::int x in let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  for (core::int x in let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   for (int x in l2) x;
@@ -73,7 +73,7 @@
     x;
   block {
     final core::List<core::int> #t5 = <core::int>[];
-    for (core::int x in let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    for (core::int x in let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   [for (int x in l2) x];
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/forin.dart.strong.transformed.expect
index b470efa..46e52d4 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.strong.transformed.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in i2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in i2) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in l2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in l2) x];
@@ -53,7 +53,7 @@
 
 static method error(core::Iterable<core::int>? i2, core::List<core::int>? l2, core::Object o1, core::Object? o2) → dynamic {
   {
-    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   for (int x in i2) x;
                 ^" in let core::Iterable<core::int>? #t2 = i2 in #t2.==(null) ?{core::Iterable<dynamic>} #t2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic> : #t2{core::Iterable<dynamic>}).{core::Iterable::iterator};
@@ -65,7 +65,7 @@
   block {
     final core::List<core::int> #t3 = <core::int>[];
     {
-      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   [for (int x in i2) x];
                  ^" in let core::Iterable<core::int>? #t5 = i2 in #t5.==(null) ?{core::Iterable<dynamic>} #t5 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic> : #t5{core::Iterable<dynamic>}).{core::Iterable::iterator};
@@ -76,7 +76,7 @@
     }
   } =>#t3;
   {
-    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   for (int x in l2) x;
@@ -89,7 +89,7 @@
   block {
     final core::List<core::int> #t8 = <core::int>[];
     {
-      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   [for (int x in l2) x];
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.weak.expect b/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
index d6e6324..d772415 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in i2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in i2) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in l2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in l2) x];
@@ -52,20 +52,20 @@
 import "dart:core" as core;
 
 static method error(core::Iterable<core::int>? i2, core::List<core::int>? l2, core::Object o1, core::Object? o2) → dynamic {
-  for (core::int x in let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  for (core::int x in let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   for (int x in i2) x;
                 ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
     x;
   block {
     final core::List<core::int> #t2 = <core::int>[];
-    for (core::int x in let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    for (core::int x in let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   [for (int x in i2) x];
                  ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
       #t2.{core::List::add}(x);
   } =>#t2;
-  for (core::int x in let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  for (core::int x in let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   for (int x in l2) x;
@@ -73,7 +73,7 @@
     x;
   block {
     final core::List<core::int> #t5 = <core::int>[];
-    for (core::int x in let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    for (core::int x in let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   [for (int x in l2) x];
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
index 3882876..b8054bf 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in i2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in i2) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in l2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in l2) x];
@@ -53,7 +53,7 @@
 
 static method error(core::Iterable<core::int>? i2, core::List<core::int>? l2, core::Object o1, core::Object? o2) → dynamic {
   {
-    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   for (int x in i2) x;
                 ^" in i2).{core::Iterable::iterator};
@@ -65,7 +65,7 @@
   block {
     final core::List<core::int> #t2 = <core::int>[];
     {
-      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   [for (int x in i2) x];
                  ^" in i2).{core::Iterable::iterator};
@@ -76,7 +76,7 @@
     }
   } =>#t2;
   {
-    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   for (int x in l2) x;
@@ -89,7 +89,7 @@
   block {
     final core::List<core::int> #t5 = <core::int>[];
     {
-      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   [for (int x in l2) x];
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect
index 778d86e..62a6e70 100644
--- a/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //   List y = await l(); // should be a List?
 //            ^
@@ -12,7 +12,7 @@
 import "dart:async" as asy;
 
 static method test() → dynamic async {
-  core::List<dynamic> y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+  core::List<dynamic> y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
  - 'List' is from 'dart:core'.
   List y = await l(); // should be a List?
            ^" in await self::l() as{TypeError,ForNonNullableByDefault} core::List<dynamic>;
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect
index 87e1bf1..9d772b9 100644
--- a/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //   List y = await l(); // should be a List?
 //            ^
@@ -25,7 +25,7 @@
     try {
       #L1:
       {
-        final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+        final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
  - 'List' is from 'dart:core'.
   List y = await l(); // should be a List?
            ^";
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect
index 778d86e..62a6e70 100644
--- a/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //   List y = await l(); // should be a List?
 //            ^
@@ -12,7 +12,7 @@
 import "dart:async" as asy;
 
 static method test() → dynamic async {
-  core::List<dynamic> y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+  core::List<dynamic> y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
  - 'List' is from 'dart:core'.
   List y = await l(); // should be a List?
            ^" in await self::l() as{TypeError,ForNonNullableByDefault} core::List<dynamic>;
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect
index 255b564..c2e4964 100644
--- a/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //   List y = await l(); // should be a List?
 //            ^
@@ -25,7 +25,7 @@
     try {
       #L1:
       {
-        final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+        final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
  - 'List' is from 'dart:core'.
   List y = await l(); // should be a List?
            ^";
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.expect
index 79e8633..f71f62c 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
+// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
 //  - 'Null/*1*/' is from 'dart:core'.
 //  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 //   Null x = null;
@@ -29,7 +29,7 @@
     ;
 }
 static method test() → dynamic {
-  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
+  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
  - 'Null/*1*/' is from 'dart:core'.
  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
   Null x = null;
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
index 46f2af9..ac0d6f4 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
+// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
 //  - 'Null/*1*/' is from 'dart:core'.
 //  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 //   Null x = null;
@@ -29,7 +29,7 @@
     ;
 }
 static method test() → dynamic {
-  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
+  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
  - 'Null/*1*/' is from 'dart:core'.
  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
   Null x = null;
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.expect
index 79e8633..f71f62c 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
+// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
 //  - 'Null/*1*/' is from 'dart:core'.
 //  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 //   Null x = null;
@@ -29,7 +29,7 @@
     ;
 }
 static method test() → dynamic {
-  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
+  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
  - 'Null/*1*/' is from 'dart:core'.
  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
   Null x = null;
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.transformed.expect
index 69120e0..fc3fc98 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
+// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
 //  - 'Null/*1*/' is from 'dart:core'.
 //  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 //   Null x = null;
@@ -29,7 +29,7 @@
     ;
 }
 static method test() → dynamic {
-  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
+  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
  - 'Null/*1*/' is from 'dart:core'.
  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
   Null x = null;
diff --git a/pkg/front_end/testcases/nnbd/issue42089.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42089.dart.strong.expect
index 36f7b96..21e3af9 100644
--- a/pkg/front_end/testcases/nnbd/issue42089.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42089.dart.strong.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     Object o = x;
 //                ^
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     o = x;
 //         ^
@@ -17,11 +17,11 @@
 
 static method test<X extends core::Object? = dynamic>(self::test::X? x) → dynamic {
   if(x is{ForNonNullableByDefault} core::String?) {
-    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     Object o = x;
                ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */} as{TypeError,ForNonNullableByDefault} core::Object;
-    o = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    o = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     o = x;
         ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */} as{TypeError,ForNonNullableByDefault} core::Object;
diff --git a/pkg/front_end/testcases/nnbd/issue42089.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42089.dart.strong.transformed.expect
index e118a5c..25cda95 100644
--- a/pkg/front_end/testcases/nnbd/issue42089.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42089.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     Object o = x;
 //                ^
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     o = x;
 //         ^
@@ -17,11 +17,11 @@
 
 static method test<X extends core::Object? = dynamic>(self::test::X? x) → dynamic {
   if(x is{ForNonNullableByDefault} core::String?) {
-    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     Object o = x;
                ^" in let self::test::X? & core::String? /* '?' & '?' = '?' */ #t2 = x{self::test::X? & core::String? /* '?' & '?' = '?' */} in #t2.==(null) ?{core::Object} #t2 as{TypeError,ForNonNullableByDefault} core::Object : #t2{core::Object};
-    o = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    o = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     o = x;
         ^" in let self::test::X? & core::String? /* '?' & '?' = '?' */ #t4 = x{self::test::X? & core::String? /* '?' & '?' = '?' */} in #t4.==(null) ?{core::Object} #t4 as{TypeError,ForNonNullableByDefault} core::Object : #t4{core::Object};
diff --git a/pkg/front_end/testcases/nnbd/issue42089.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42089.dart.weak.expect
index 36f7b96..21e3af9 100644
--- a/pkg/front_end/testcases/nnbd/issue42089.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42089.dart.weak.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     Object o = x;
 //                ^
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     o = x;
 //         ^
@@ -17,11 +17,11 @@
 
 static method test<X extends core::Object? = dynamic>(self::test::X? x) → dynamic {
   if(x is{ForNonNullableByDefault} core::String?) {
-    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     Object o = x;
                ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */} as{TypeError,ForNonNullableByDefault} core::Object;
-    o = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    o = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     o = x;
         ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */} as{TypeError,ForNonNullableByDefault} core::Object;
diff --git a/pkg/front_end/testcases/nnbd/issue42089.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42089.dart.weak.transformed.expect
index e75b74f..60c8103 100644
--- a/pkg/front_end/testcases/nnbd/issue42089.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42089.dart.weak.transformed.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     Object o = x;
 //                ^
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     o = x;
 //         ^
@@ -17,11 +17,11 @@
 
 static method test<X extends core::Object? = dynamic>(self::test::X? x) → dynamic {
   if(x is{ForNonNullableByDefault} core::String?) {
-    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     Object o = x;
                ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */};
-    o = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    o = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     o = x;
         ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */};
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect
index 212d75b..62f2fb2 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect
@@ -66,19 +66,19 @@
 //   factory C.factory9({int i}) => new C.constructor4(); // error
 //                           ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor5([int? i]) : this.i = i; // error
 //                                       ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor6({int? i}) : this.i = i; // error
 //                                       ^
 //
@@ -101,12 +101,12 @@
     : self::A::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::A
-    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::A
-    : self::A::i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
@@ -168,12 +168,12 @@
     : self::C::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::C
-    : self::C::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor5([int? i]) : this.i = i; // error
                                       ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::C
-    : self::C::i = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor6({int? i}) : this.i = i; // error
                                       ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect
index b0359f3..a58e129 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect
@@ -66,19 +66,19 @@
 //   factory C.factory9({int i}) => new C.constructor4(); // error
 //                           ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor5([int? i]) : this.i = i; // error
 //                                       ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor6({int? i}) : this.i = i; // error
 //                                       ^
 //
@@ -101,12 +101,12 @@
     : self::A::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::A
-    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in let core::int? #t2 = i in #t2.==(null) ?{core::int} #t2 as{TypeError,ForNonNullableByDefault} core::int : #t2{core::int}, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::A
-    : self::A::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in let core::int? #t4 = i in #t4.==(null) ?{core::int} #t4 as{TypeError,ForNonNullableByDefault} core::int : #t4{core::int}, super core::Object::•()
     ;
@@ -168,12 +168,12 @@
     : self::C::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::C
-    : self::C::i = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor5([int? i]) : this.i = i; // error
                                       ^" in let core::int? #t6 = i in #t6.==(null) ?{core::int} #t6 as{TypeError,ForNonNullableByDefault} core::int : #t6{core::int}, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::C
-    : self::C::i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor6({int? i}) : this.i = i; // error
                                       ^" in let core::int? #t8 = i in #t8.==(null) ?{core::int} #t8 as{TypeError,ForNonNullableByDefault} core::int : #t8{core::int}, super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect
index 212d75b..62f2fb2 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect
@@ -66,19 +66,19 @@
 //   factory C.factory9({int i}) => new C.constructor4(); // error
 //                           ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor5([int? i]) : this.i = i; // error
 //                                       ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor6({int? i}) : this.i = i; // error
 //                                       ^
 //
@@ -101,12 +101,12 @@
     : self::A::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::A
-    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::A
-    : self::A::i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
@@ -168,12 +168,12 @@
     : self::C::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::C
-    : self::C::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor5([int? i]) : this.i = i; // error
                                       ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::C
-    : self::C::i = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor6({int? i}) : this.i = i; // error
                                       ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect
index 6b13d7b..33d6b11 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect
@@ -66,19 +66,19 @@
 //   factory C.factory9({int i}) => new C.constructor4(); // error
 //                           ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor5([int? i]) : this.i = i; // error
 //                                       ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor6({int? i}) : this.i = i; // error
 //                                       ^
 //
@@ -101,12 +101,12 @@
     : self::A::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::A
-    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::A
-    : self::A::i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i, super core::Object::•()
     ;
@@ -168,12 +168,12 @@
     : self::C::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::C
-    : self::C::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor5([int? i]) : this.i = i; // error
                                       ^" in i, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::C
-    : self::C::i = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor6({int? i}) : this.i = i; // error
                                       ^" in i, super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.expect
index f415c03..30657ed 100644
--- a/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     return z.x; // Error.
 //              ^
@@ -19,7 +19,7 @@
     self::C<core::Object?, core::Object?>? z = self::b ?{self::C<core::Object?, core::Object?>?} x : y;
     if(z.{core::Object::==}(null))
       throw 0;
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     return z.x; // Error.
              ^" in z{self::C<core::Object?, core::Object?>}.{self::C::x} as{TypeError,ForNonNullableByDefault} core::Object;
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.transformed.expect
index 06894de..f4523d0 100644
--- a/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     return z.x; // Error.
 //              ^
@@ -19,7 +19,7 @@
     self::C<core::Object?, core::Object?>? z = self::b ?{self::C<core::Object?, core::Object?>?} x : y;
     if(z.{core::Object::==}(null))
       throw 0;
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     return z.x; // Error.
              ^" in let core::Object? #t2 = z{self::C<core::Object?, core::Object?>}.{self::C::x} in #t2.==(null) ?{core::Object} #t2 as{TypeError,ForNonNullableByDefault} core::Object : #t2{core::Object};
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.expect
index f415c03..30657ed 100644
--- a/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     return z.x; // Error.
 //              ^
@@ -19,7 +19,7 @@
     self::C<core::Object?, core::Object?>? z = self::b ?{self::C<core::Object?, core::Object?>?} x : y;
     if(z.{core::Object::==}(null))
       throw 0;
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     return z.x; // Error.
              ^" in z{self::C<core::Object?, core::Object?>}.{self::C::x} as{TypeError,ForNonNullableByDefault} core::Object;
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.transformed.expect
index 2b40d28..63594f2 100644
--- a/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     return z.x; // Error.
 //              ^
@@ -19,7 +19,7 @@
     self::C<core::Object?, core::Object?>? z = self::b ?{self::C<core::Object?, core::Object?>?} x : y;
     if(z.{core::Object::==}(null))
       throw 0;
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     return z.x; // Error.
              ^" in z{self::C<core::Object?, core::Object?>}.{self::C::x};
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.strong.expect
index a293187..f2b4df9 100644
--- a/pkg/front_end/testcases/nnbd/issue43721.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.strong.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   foo(z); // Error.
 //       ^
@@ -17,7 +17,7 @@
   FutureOr<core::int?>x = null;
   core::num n = 1;
   FutureOr<core::num?>z = condition ?{FutureOr<core::num?>} x : n;
-  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   foo(z); // Error.
       ^" in z as{TypeError,ForNonNullableByDefault} core::Object);
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.strong.transformed.expect
index 7d5061d..8b07b75 100644
--- a/pkg/front_end/testcases/nnbd/issue43721.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   foo(z); // Error.
 //       ^
@@ -17,7 +17,7 @@
   FutureOr<core::int?>x = null;
   core::num n = 1;
   FutureOr<core::num?>z = condition ?{FutureOr<core::num?>} x : n;
-  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   foo(z); // Error.
       ^" in let FutureOr<core::num?>#t2 = z in #t2.==(null) ?{core::Object} #t2 as{TypeError,ForNonNullableByDefault} core::Object : #t2{core::Object});
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.expect
index a293187..f2b4df9 100644
--- a/pkg/front_end/testcases/nnbd/issue43721.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   foo(z); // Error.
 //       ^
@@ -17,7 +17,7 @@
   FutureOr<core::int?>x = null;
   core::num n = 1;
   FutureOr<core::num?>z = condition ?{FutureOr<core::num?>} x : n;
-  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   foo(z); // Error.
       ^" in z as{TypeError,ForNonNullableByDefault} core::Object);
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.transformed.expect
index 7619193..530420f 100644
--- a/pkg/front_end/testcases/nnbd/issue43721.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   foo(z); // Error.
 //       ^
@@ -17,7 +17,7 @@
   FutureOr<core::int?>x = null;
   core::num n = 1;
   FutureOr<core::num?>z = condition ?{FutureOr<core::num?>} x : n;
-  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   foo(z); // Error.
       ^" in z);
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
index 99136f1..e6382ed 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
@@ -6,11 +6,11 @@
 // String returnImplicit() /*error*/ {
 //        ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //   return null; // error
 //          ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //     return null; // error
 //            ^
 //
@@ -31,11 +31,11 @@
 //   String returnImplicit() /* error */ {
 //   ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //     return null; // error
 //            ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //       return null; // error
 //              ^
 //
@@ -78,14 +78,14 @@
 }
 static method returnExplicit() → core::String {
   core::print("foo");
-  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
   return null; // error
          ^" in null as{TypeError,ForNonNullableByDefault} core::String;
 }
 static method returnMixed(core::bool b) → core::String {
   if(b) {
     core::print("foo");
-    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
     return null; // error
            ^" in null as{TypeError,ForNonNullableByDefault} core::String;
   }
@@ -147,14 +147,14 @@
   }
   function returnExplicit() → core::String {
     core::print("foo");
-    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
     return null; // error
            ^" in null as{TypeError,ForNonNullableByDefault} core::String;
   }
   function returnMixed(core::bool b) → core::String {
     if(b) {
       core::print("foo");
-      return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+      return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
       return null; // error
              ^" in null as{TypeError,ForNonNullableByDefault} core::String;
     }
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
index 68cae46..5865ae7 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
@@ -6,11 +6,11 @@
 // String returnImplicit() /*error*/ {
 //        ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //   return null; // error
 //          ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //     return null; // error
 //            ^
 //
@@ -31,11 +31,11 @@
 //   String returnImplicit() /* error */ {
 //   ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //     return null; // error
 //            ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //       return null; // error
 //              ^
 //
@@ -78,14 +78,14 @@
 }
 static method returnExplicit() → core::String {
   core::print("foo");
-  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
   return null; // error
          ^" in let core::Null? #t3 = null in #t3.==(null) ?{core::String} #t3 as{TypeError,ForNonNullableByDefault} core::String : #t3{core::String};
 }
 static method returnMixed(core::bool b) → core::String {
   if(b) {
     core::print("foo");
-    return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
     return null; // error
            ^" in let core::Null? #t5 = null in #t5.==(null) ?{core::String} #t5 as{TypeError,ForNonNullableByDefault} core::String : #t5{core::String};
   }
@@ -348,14 +348,14 @@
   }
   function returnExplicit() → core::String {
     core::print("foo");
-    return let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
     return null; // error
            ^" in let core::Null? #t11 = null in #t11.==(null) ?{core::String} #t11 as{TypeError,ForNonNullableByDefault} core::String : #t11{core::String};
   }
   function returnMixed(core::bool b) → core::String {
     if(b) {
       core::print("foo");
-      return let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+      return let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
       return null; // error
              ^" in let core::Null? #t13 = null in #t13.==(null) ?{core::String} #t13 as{TypeError,ForNonNullableByDefault} core::String : #t13{core::String};
     }
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
index 75221ed..4c3a28a 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
@@ -6,11 +6,11 @@
 // String returnImplicit() /*error*/ {
 //        ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //   return null; // error
 //          ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //     return null; // error
 //            ^
 //
@@ -31,11 +31,11 @@
 //   String returnImplicit() /* error */ {
 //   ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //     return null; // error
 //            ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //       return null; // error
 //              ^
 //
@@ -79,14 +79,14 @@
 }
 static method returnExplicit() → core::String {
   core::print("foo");
-  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
   return null; // error
          ^" in null as{TypeError,ForNonNullableByDefault} core::String;
 }
 static method returnMixed(core::bool b) → core::String {
   if(b) {
     core::print("foo");
-    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
     return null; // error
            ^" in null as{TypeError,ForNonNullableByDefault} core::String;
   }
@@ -151,14 +151,14 @@
   }
   function returnExplicit() → core::String {
     core::print("foo");
-    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
     return null; // error
            ^" in null as{TypeError,ForNonNullableByDefault} core::String;
   }
   function returnMixed(core::bool b) → core::String {
     if(b) {
       core::print("foo");
-      return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+      return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
       return null; // error
              ^" in null as{TypeError,ForNonNullableByDefault} core::String;
     }
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
index eb7d09f..db4f23d 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
@@ -6,11 +6,11 @@
 // String returnImplicit() /*error*/ {
 //        ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //   return null; // error
 //          ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //     return null; // error
 //            ^
 //
@@ -31,11 +31,11 @@
 //   String returnImplicit() /* error */ {
 //   ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //     return null; // error
 //            ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
 //       return null; // error
 //              ^
 //
@@ -79,14 +79,14 @@
 }
 static method returnExplicit() → core::String {
   core::print("foo");
-  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
   return null; // error
          ^" in null;
 }
 static method returnMixed(core::bool b) → core::String {
   if(b) {
     core::print("foo");
-    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
     return null; // error
            ^" in null;
   }
@@ -352,14 +352,14 @@
   }
   function returnExplicit() → core::String {
     core::print("foo");
-    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
     return null; // error
            ^" in null;
   }
   function returnMixed(core::bool b) → core::String {
     if(b) {
       core::print("foo");
-      return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+      return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
       return null; // error
              ^" in null;
     }
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect
index 6cfbab4..24a30ca 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+// pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)' because 'Null' is nullable and 'int Function(int)' isn't.
 //   F f = null; // Static error
 //         ^
 //
@@ -14,7 +14,7 @@
 static method f1(core::int x) → core::int?
   return x;
 static method test() → void {
-  (core::int*) → core::int* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+  (core::int*) → core::int* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)' because 'Null' is nullable and 'int Function(int)' isn't.
   F f = null; // Static error
         ^" in null as{TypeError,ForNonNullableByDefault} (core::int*) → core::int*;
   f = #C1;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect
index 87f79f9..8be5681 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+// pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)' because 'Null' is nullable and 'int Function(int)' isn't.
 //   F f = null; // Static error
 //         ^
 //
@@ -14,7 +14,7 @@
 static method f1(core::int x) → core::int?
   return x;
 static method test() → void {
-  (core::int*) → core::int* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+  (core::int*) → core::int* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)' because 'Null' is nullable and 'int Function(int)' isn't.
   F f = null; // Static error
         ^" in null;
   f = #C1;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.expect
index 13d2fb8..d9547c4 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
 //   FutureOr<AAlias> foLegacyNonNullable = null; // error
 //                                          ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
 //   FutureOr<AAliasNonNullable> foNonNullable = null; // error
 //                                               ^
@@ -21,12 +21,12 @@
 typedef AAliasNonNullable = opt::A;
 typedef AAliasNullable = opt::A?;
 static method test() → dynamic {
-  FutureOr<opt::A>foLegacyNonNullable = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+  FutureOr<opt::A>foLegacyNonNullable = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
   FutureOr<AAlias> foLegacyNonNullable = null; // error
                                          ^" in null as{TypeError,ForNonNullableByDefault} FutureOr<opt::A>;
   FutureOr<opt::A?>foLegacyNullable = null;
-  FutureOr<opt::A>foNonNullable = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+  FutureOr<opt::A>foNonNullable = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
   FutureOr<AAliasNonNullable> foNonNullable = null; // error
                                               ^" in null as{TypeError,ForNonNullableByDefault} FutureOr<opt::A>;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.transformed.expect
index 027a85d..d3ace70 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.transformed.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
 //   FutureOr<AAlias> foLegacyNonNullable = null; // error
 //                                          ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
 //   FutureOr<AAliasNonNullable> foNonNullable = null; // error
 //                                               ^
@@ -21,12 +21,12 @@
 typedef AAliasNonNullable = opt::A;
 typedef AAliasNullable = opt::A?;
 static method test() → dynamic {
-  FutureOr<opt::A>foLegacyNonNullable = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+  FutureOr<opt::A>foLegacyNonNullable = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
   FutureOr<AAlias> foLegacyNonNullable = null; // error
                                          ^" in null;
   FutureOr<opt::A?>foLegacyNullable = null;
-  FutureOr<opt::A>foNonNullable = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+  FutureOr<opt::A>foNonNullable = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
   FutureOr<AAliasNonNullable> foNonNullable = null; // error
                                               ^" in null;
diff --git a/pkg/front_end/tool/_fasta/generate_messages.dart b/pkg/front_end/tool/_fasta/generate_messages.dart
index 1cf0539..b50bee9 100644
--- a/pkg/front_end/tool/_fasta/generate_messages.dart
+++ b/pkg/front_end/tool/_fasta/generate_messages.dart
@@ -306,6 +306,7 @@
       case "type":
       case "type2":
       case "type3":
+      case "type4":
         parameters.add("DartType _${name}");
         ensureLabeler();
         conversions
diff --git a/pkg/kernel/lib/src/types.dart b/pkg/kernel/lib/src/types.dart
index 2ab1891..326062f 100644
--- a/pkg/kernel/lib/src/types.dart
+++ b/pkg/kernel/lib/src/types.dart
@@ -509,8 +509,8 @@
             /// From the NNBD spec: For each j such that r0j is required, then
             /// there exists an i in n+1...q such that xj = yi, and r1i is
             /// required
-            result =
-                result.and(const IsSubtypeOf.onlyIfIgnoringNullabilities());
+            result = result.and(new IsSubtypeOf.onlyIfIgnoringNullabilities(
+                subtype: s, supertype: t));
           }
         }
         if (sCount == sNamedParameters.length) return const IsSubtypeOf.never();
@@ -526,7 +526,8 @@
         /// From the NNBD spec: For each j such that r0j is required, then there
         /// exists an i in n+1...q such that xj = yi, and r1i is required
         if (sNamedParameter.isRequired && !tNamedParameter.isRequired) {
-          result = result.and(const IsSubtypeOf.onlyIfIgnoringNullabilities());
+          result = result.and(new IsSubtypeOf.onlyIfIgnoringNullabilities(
+              subtype: s, supertype: t));
         }
       }
       for (; sCount < sNamedParameters.length; sCount++) {
@@ -535,7 +536,8 @@
           /// From the NNBD spec: For each j such that r0j is required, then
           /// there exists an i in n+1...q such that xj = yi, and r1i is
           /// required
-          result = result.and(const IsSubtypeOf.onlyIfIgnoringNullabilities());
+          result = result.and(new IsSubtypeOf.onlyIfIgnoringNullabilities(
+              subtype: s, supertype: t));
         }
       }
     }
@@ -928,7 +930,8 @@
         return const IsSubtypeOf.always();
       }
       if (t.nullability == Nullability.nonNullable) {
-        return const IsSubtypeOf.onlyIfIgnoringNullabilities();
+        return new IsSubtypeOf.onlyIfIgnoringNullabilities(
+            subtype: s, supertype: t);
       }
       throw new StateError(
           "Unexpected nullability '$t.nullability' of type Never");
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index 4ccf611..076f46e 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -270,7 +270,8 @@
                 SubtypeCheckMode.withNullabilities) &&
             isSubtypeOf(type3, coreTypes.intNonNullableRawType,
                 SubtypeCheckMode.withNullabilities)) {
-          // If T1, T2 and T3 are all subtypes of int, the static type of e is int.
+          // If T1, T2 and T3 are all subtypes of int, the static type of e is
+          // int.
           return coreTypes.intNonNullableRawType;
         } else if (isSubtypeOf(type1, coreTypes.doubleNonNullableRawType,
                 SubtypeCheckMode.withNullabilities) &&
@@ -278,7 +279,8 @@
                 SubtypeCheckMode.withNullabilities) &&
             isSubtypeOf(type3, coreTypes.doubleNonNullableRawType,
                 SubtypeCheckMode.withNullabilities)) {
-          // If T1, T2 and T3 are all subtypes of double, the static type of e is double.
+          // If T1, T2 and T3 are all subtypes of double, the static type of e
+          // is double.
           return coreTypes.doubleNonNullableRawType;
         }
       }
@@ -343,10 +345,15 @@
   /// The only state of an [IsSubtypeOf] object.
   final int _value;
 
-  const IsSubtypeOf._internal(int value) : _value = value;
+  final DartType subtype;
+
+  final DartType supertype;
+
+  const IsSubtypeOf._internal(int value, this.subtype, this.supertype)
+      : _value = value;
 
   /// Subtype check succeeds in both modes.
-  const IsSubtypeOf.always() : this._internal(_valueAlways);
+  const IsSubtypeOf.always() : this._internal(_valueAlways, null, null);
 
   /// Subtype check succeeds only if the nullability markers are ignored.
   ///
@@ -356,11 +363,12 @@
   /// mode).  By contraposition, if a subtype check fails for two types when the
   /// nullability markers are ignored, it should also fail for those types in
   /// full-NNBD mode.
-  const IsSubtypeOf.onlyIfIgnoringNullabilities()
-      : this._internal(_valueOnlyIfIgnoringNullabilities);
+  const IsSubtypeOf.onlyIfIgnoringNullabilities(
+      {DartType subtype, DartType supertype})
+      : this._internal(_valueOnlyIfIgnoringNullabilities, subtype, supertype);
 
   /// Subtype check fails in both modes.
-  const IsSubtypeOf.never() : this._internal(_valueNever);
+  const IsSubtypeOf.never() : this._internal(_valueNever, null, null);
 
   /// Checks if two types are in relation based solely on their nullabilities.
   ///
@@ -378,10 +386,12 @@
       if (supertype is InvalidType) {
         return const IsSubtypeOf.always();
       }
-      return const IsSubtypeOf.onlyIfIgnoringNullabilities();
+      return new IsSubtypeOf.onlyIfIgnoringNullabilities(
+          subtype: subtype, supertype: supertype);
     }
     if (supertype is InvalidType) {
-      return const IsSubtypeOf.onlyIfIgnoringNullabilities();
+      return new IsSubtypeOf.onlyIfIgnoringNullabilities(
+          subtype: subtype, supertype: supertype);
     }
 
     if (subtype.isPotentiallyNullable && supertype.isPotentiallyNonNullable) {
@@ -406,7 +416,8 @@
           return const IsSubtypeOf.always();
         }
       }
-      return const IsSubtypeOf.onlyIfIgnoringNullabilities();
+      return new IsSubtypeOf.onlyIfIgnoringNullabilities(
+          subtype: subtype, supertype: supertype);
     }
     return const IsSubtypeOf.always();
   }
@@ -421,7 +432,21 @@
   /// `Rb.and(Rc)` where `Rb` is the result of `B1 <: B2`, `Rc` is the result
   /// of `C1 <: C2`.
   IsSubtypeOf and(IsSubtypeOf other) {
-    return _all[_andValues(_value, other._value)];
+    int resultValue = _andValues(_value, other._value);
+    if (resultValue == IsSubtypeOf._valueOnlyIfIgnoringNullabilities) {
+      // If the type mismatch is due to nullabilities, the mismatching parts are
+      // remembered in either 'this' or [other].  In that case we need to return
+      // exactly one of those objects, so that the information about mismatching
+      // parts is propagated upwards.
+      if (_value == IsSubtypeOf._valueOnlyIfIgnoringNullabilities) {
+        return this;
+      } else {
+        assert(other._value == IsSubtypeOf._valueOnlyIfIgnoringNullabilities);
+        return other;
+      }
+    } else {
+      return _all[resultValue];
+    }
   }
 
   /// Shorts the computation of [and] if `this` is [IsSubtypeOf.never].
@@ -448,7 +473,21 @@
   /// as `Rs.or(Rf)` where `Rs` is the result of `T <: S`, `Rf` is the result of
   /// `T <: Future<S>`.
   IsSubtypeOf or(IsSubtypeOf other) {
-    return _all[_orValues(_value, other._value)];
+    int resultValue = _orValues(_value, other._value);
+    if (resultValue == IsSubtypeOf._valueOnlyIfIgnoringNullabilities) {
+      // If the type mismatch is due to nullabilities, the mismatching parts are
+      // remembered in either 'this' or [other].  In that case we need to return
+      // exactly one of those objects, so that the information about mismatching
+      // parts is propagated upwards.
+      if (_value == IsSubtypeOf._valueOnlyIfIgnoringNullabilities) {
+        return this;
+      } else {
+        assert(other._value == IsSubtypeOf._valueOnlyIfIgnoringNullabilities);
+        return other;
+      }
+    } else {
+      return _all[resultValue];
+    }
   }
 
   /// Shorts the computation of [or] if `this` is [IsSubtypeOf.always].
diff --git a/pkg/nnbd_migration/lib/src/front_end/migration_summary.dart b/pkg/nnbd_migration/lib/src/front_end/migration_summary.dart
index 08ff005..3d74d30 100644
--- a/pkg/nnbd_migration/lib/src/front_end/migration_summary.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/migration_summary.dart
@@ -62,82 +62,56 @@
     switch (kind) {
       case NullabilityFixKind.addImport:
         return 'addImport';
-        break;
       case NullabilityFixKind.addLate:
         return 'addLate';
-        break;
       case NullabilityFixKind.addLateDueToHint:
         return 'addLateDueToHint';
-        break;
       case NullabilityFixKind.addLateDueToTestSetup:
         return 'addLateDueToTestSetup';
-        break;
       case NullabilityFixKind.addLateFinalDueToHint:
         return 'addLateFinalDueToHint';
-        break;
       case NullabilityFixKind.addRequired:
         return 'addRequired';
-        break;
       case NullabilityFixKind.addType:
         return 'addType';
-        break;
       case NullabilityFixKind.changeMethodName:
         return 'changeMethodName';
-        break;
       case NullabilityFixKind.checkExpression:
         return 'checkExpression';
-        break;
       case NullabilityFixKind.checkExpressionDueToHint:
         return 'checkExpressionDueToHint';
-        break;
       case NullabilityFixKind.compoundAssignmentHasNullableSource:
         return 'compoundAssignmentHasNullableSource';
-        break;
       case NullabilityFixKind.compoundAssignmentHasBadCombinedType:
         return 'compoundAssignmentHasBadCombinedType';
-        break;
       case NullabilityFixKind.conditionFalseInStrongMode:
         return 'conditionFalseInStrongMode';
-        break;
       case NullabilityFixKind.conditionTrueInStrongMode:
         return 'conditionTrueInStrongMode';
-        break;
       case NullabilityFixKind.downcastExpression:
         return 'downcastExpression';
-        break;
       case NullabilityFixKind.makeTypeNullable:
         return 'makeTypeNullable';
-        break;
       case NullabilityFixKind.makeTypeNullableDueToHint:
         return 'makeTypeNullableDueToHint';
-        break;
       case NullabilityFixKind.nullAwarenessUnnecessaryInStrongMode:
         return 'nullAwarenessUnnecessaryInStrongMode';
-        break;
       case NullabilityFixKind.nullAwareAssignmentUnnecessaryInStrongMode:
         return 'nullAwareAssignmentUnnecessaryInStrongMode';
-        break;
       case NullabilityFixKind.otherCastExpression:
         return 'otherCastExpression';
-        break;
       case NullabilityFixKind.removeAs:
         return 'removeAs';
-        break;
       case NullabilityFixKind.removeDeadCode:
         return 'removeDeadCode';
-        break;
       case NullabilityFixKind.removeLanguageVersionComment:
         return 'removeLanguageVersionComment';
-        break;
       case NullabilityFixKind.replaceVar:
         return 'replaceVar';
-        break;
       case NullabilityFixKind.typeNotMadeNullable:
         return 'typeNotMadeNullable';
-        break;
       case NullabilityFixKind.typeNotMadeNullableDueToHint:
         return 'typeNotMadeNullableDueToHint';
-        break;
     }
     return '???';
   }
diff --git a/pkg/nnbd_migration/lib/src/front_end/resources/migration.css b/pkg/nnbd_migration/lib/src/front_end/resources/migration.css
index bfc3858..0e752ea 100644
--- a/pkg/nnbd_migration/lib/src/front_end/resources/migration.css
+++ b/pkg/nnbd_migration/lib/src/front_end/resources/migration.css
@@ -387,7 +387,6 @@
   display: inline-block;
   height: 15px;
   position: relative;
-  top: 2px;
 }
 
 .target {
diff --git a/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart b/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
index eb2dbfa..0ae2d82 100644
--- a/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
@@ -7487,7 +7487,7 @@
 ''';
 
 String _migration_css;
-// migration_css md5 is '4ac5ade325313a97e2be6aca39327fb0'
+// migration_css md5 is '091ec5ef4e9fd6f11ad8bda81bdd26e4'
 String _migration_css_base64 = '''
 LyogQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUg
 dGhlIEFVVEhPUlMgZmlsZSAgKi8KLyogZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVz
@@ -7596,95 +7596,95 @@
 a2dyb3VuZC1jb2xvcjogI0ZBNTU3ZDsgLyogJGRhcmstcGluayAqLwogIGNvbG9yOiAjZmZmOwp9Cgou
 cmVnaW9uLmluZm9ybWF0aXZlLXJlZ2lvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzI2Mzk1MjsKICBj
 b2xvcjogI2ZmZjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgaGVpZ2h0OiAxNXB4OwogIHBvc2l0
-aW9uOiByZWxhdGl2ZTsKICB0b3A6IDJweDsKfQoKLnRhcmdldCB7CiAgYmFja2dyb3VuZC1jb2xvcjog
-IzQ0NDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICBmb250LXdl
-aWdodDogNjAwOwp9CgouaW5mby1wYW5lbCB7CiAgZmxleDogMSAyMDBweDsKICBtYXJnaW46IDA7CiAg
-aGVpZ2h0OiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoK
-LmluZm8tcGFuZWwgLmVkaXQtcGFuZWwgewogIGJhY2tncm91bmQtY29sb3I6ICMxMjIwMmY7CiAgb3Zl
-cmZsb3c6IGF1dG87Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250ZW50IHsKICBwYWRkaW5nOiA3cHg7
-Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250ZW50PiA6Zmlyc3QtY2hpbGQgewogIG1hcmdpbi10b3A6
-IDA7Cn0KCi5pbmZvLXBhbmVsIC5ub3dyYXAgewogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5pbmZv
-LXBhbmVsIHVsLAouaW5mby1wYW5lbCBvbCB7CiAgcGFkZGluZy1sZWZ0OiAyMHB4Owp9CgouaW5mby1w
-YW5lbCBsaSB7CiAgbWFyZ2luOiAwIDAgNXB4IDA7Cn0KCi5pbmZvLXBhbmVsIGEgewogIGNvbG9yOiAj
-MTM5YmI1Owp9CgouaW5mby1wYW5lbCBhOmhvdmVyIHsKICBjb2xvcjogIzFlYzdlNzsgLyogIzEzOWJi
-NSBsaWdodGVuZWQgMjAlICovCn0KCi5pbmZvLXBhbmVsIC5lZGl0LWxpc3QgewogIGJhY2tncm91bmQt
-Y29sb3I6ICMxMjIwMmY7CiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi5lZGl0LXBhbmVsIHsKICBtYXJnaW4t
-dG9wOiA2cHg7CiAgZmxleDogMSAxMDBweDsKfQoKLmVkaXQtbGlzdCB7CiAgZmxleDogMiAxMDBweDsK
-fQoKLmVkaXQtbGlzdCAuZWRpdCB7CiAgbWFyZ2luOiAzcHggMDsKfQoKLmVkaXQtbGlzdCAuZWRpdC1s
-aW5rIHsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5wb3B1cC1wYW5lIHsKICBkaXNwbGF5OiBub25lOwog
-IHBvc2l0aW9uOiBmaXhlZDsKICB0b3A6IDE1MHB4OwogIGxlZnQ6IDE1MHB4OwogIHJpZ2h0OiAxNTBw
-eDsKICBib3R0b206IDE1MHB4OwogIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOwogIGJvcmRlci10b3A6
-IDJweCBzb2xpZCBibGFjazsKICBib3JkZXItcmFkaXVzOiA3cHg7CiAgYm94LXNoYWRvdzogMHB4IDBw
-eCAyMHB4IDJweCAjYjRiZmNiMjI7CiAgei1pbmRleDogNDAwOwogIGJhY2tncm91bmQ6ICMyYjMwMzY7
-CiAgcGFkZGluZzogMjBweDsKfQoKLnBvcHVwLXBhbmUgLmNsb3NlIHsKICBwb3NpdGlvbjogYWJzb2x1
-dGU7CiAgcmlnaHQ6IDEwcHg7CiAgdG9wOiAxMHB4OwogIGN1cnNvcjogcG9pbnRlcjsKICB0ZXh0LXNo
-YWRvdzogMXB4IDFweCAycHggIzg4ODsKICBib3gtc2hhZG93OiAxcHggMXB4IDJweCAjMTExOwp9Cgou
-cG9wdXAtcGFuZSBoMiB7CiAgcGFkZGluZzogMjFweDsKICBoZWlnaHQ6IDEwJTsKICBtYXJnaW46IDBw
-eDsKICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoucG9wdXAtcGFuZSBwIHsKICBoZWlnaHQ6IDEw
-JTsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIHBhZGRpbmc6IDBweCAyMHB4Owp9CgoucG9wdXAt
-cGFuZSBwcmUgewogIGJhY2tncm91bmQ6ICMxMjIwMmY7CiAgcGFkZGluZzogMjBweDsKICBib3R0b206
-IDBweDsKICBvdmVyZmxvdzogYXV0byBzY3JvbGw7CiAgaGVpZ2h0OiA2NSU7CiAgbWFyZ2luOiAwcHg7
-CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKLnBvcHVwLXBhbmUgLmJ1dHRvbi5ib3R0b20gewog
-IG1hcmdpbjogMjBweCAwcHg7CiAgZGlzcGxheTogYmxvY2s7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9
-CgoucmVydW5uaW5nLXBhbmUgewogIGRpc3BsYXk6IG5vbmU7Cn0KCmJvZHkucmVydW5uaW5nIC5yZXJ1
-bm5pbmctcGFuZSB7CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IGZpeGVkOwogIHRvcDogMHB4
-OwogIGJvdHRvbTogMHB4OwogIGxlZnQ6IDBweDsKICByaWdodDogMHB4OwogIGJhY2tncm91bmQtY29s
-b3I6ICMwMDAwMDBBQTsgLyogdHJhbnNsdWNlbnQgYmxhY2sgKi8KICB6LWluZGV4OiA0MDA7Cn0KCi5y
-ZXJ1bm5pbmctcGFuZSBoMSB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogNTAlOwogIGxlZnQ6
-IDUwJTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKfQoKLmVkaXQtcGFuZWwgLnR5
-cGUtZGVzY3JpcHRpb24gewogIC8qIEZyb20gRGFydFBhZCAkZGFyay1vcmFuZ2UgKi8KICBjb2xvcjog
-I2ZmOTE2ZTsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwp9Cgp1bC50cmFjZSB7CiAgZm9udC1zaXpl
-OiAxM3B4OwogIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICBwYWRkaW5nLWxlZnQ6IDBweDsKfQoKdWwu
-dHJhY2UgbGkgewogIGNvbG9yOiB3aGl0ZTsKfQoKdWwudHJhY2UgbGkgLmZ1bmN0aW9uIHsKICAvKiBm
-cm9tIC5obGpzLXZhcmlhYmxlICovCiAgY29sb3I6ICMxNmFkY2E7CiAgZm9udC1mYW1pbHk6IG1vbm9z
-cGFjZTsKICBmb250LXdlaWdodDogNjAwOwp9Cgp1bC50cmFjZSBsaSBwLmRyYXdlciB7CiAgbWFyZ2lu
-OiAzcHggMHB4OwogIHBhZGRpbmc6IDBweCAwcHggMHB4IDE0cHg7Cn0KCnVsLnRyYWNlIGxpIHAuZHJh
-d2VyIGJ1dHRvbiB7CiAgbWFyZ2luLXJpZ2h0OiAzcHg7Cn0KCi5lbGV2YXRpb24tejQgewogIGJveC1z
-aGFkb3c6IDBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLAogICAgICAwcHggNHB4IDVw
-eCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAs
-IDAsIC4xMik7Cn0KCmEgewogIGNvbG9yOiAjY2NjOwogIGZpbGw6ICNjY2M7CiAgdGV4dC1kZWNvcmF0
-aW9uOiBub25lOwp9CgphOmhvdmVyIHsKICBjb2xvcjogI2RiZGJkYjsgLyogI2NjYyBsaWdodGVudGVk
-IDMwJSovCiAgZmlsbDogI2ZmZjsKfQoKLmFkZC1oaW50LWxpbmsgewogIGRpc3BsYXk6IGlubGluZS1i
-bG9jazsKICBtYXJnaW46IDNweDsKfQoKLmFkZC1oaW50LWxpbms6aG92ZXIgewogIGNvbG9yOiAjZmZm
-Owp9CgpoZWFkZXIgYnV0dG9uIHsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgpoZWFkZXIg
-YSB7CiAgbWFyZ2luOiAwOwp9CgovKiBDYXJlZnVsIGhlcmUuIGBhLmJ1dHRvbmAgaXMgcmVwZXRpdGl2
-ZSBidXQgcmVxdWlyZWQgdG8gZ2V0IGNvcnJlY3QKICogc3BlY2lmaWNpdHkgKi8KYnV0dG9uLCAuYnV0
-dG9uLCBhLmJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMiwgMTM4LCAyNTMsIDAuMTUp
-OwogIGJvcmRlcjogbm9uZTsKICBib3JkZXItcmFkaXVzOiAzcHg7CiAgcGFkZGluZzogM3B4IDEwcHg7
-CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBmb250LWZvbnQ6IFJvYm90bywgc2Fucy1zZXJpZjsKICBjb2xv
-cjogI2ZmZjsKfQoKYnV0dG9uOmhvdmVyLCAuYnV0dG9uOmhvdmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9y
-OiByZ2JhKDIyLCAxMzgsIDI1MywgMC4yOSk7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgpidXR0b25bZGlz
-YWJsZWRdIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LC4xMik7CiAgY29sb3I6
-IHJnYmEoMjU1LDI1NSwyNTUsLjM3KTsKICBjdXJzb3I6IG5vdC1hbGxvd2VkOwp9CgovKiBDaGFuZ2Ug
-ZWRpdCBwYW5lbCBidXR0b24gY29sb3JzICovCi5lZGl0LXBhbmVsIC5idXR0b24sIC5lZGl0LXBhbmVs
-IGJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg2MywgMTA0LCAxNDgsIDAuNik7CiAgY29s
-b3I6IHdoaXRlOwp9Ci5lZGl0LXBhbmVsIC5idXR0b246aG92ZXIsIC5lZGl0LXBhbmVsIGJ1dHRvbjpo
-b3ZlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMDEsIDE1MywgMjA4LCAwLjYpOwogIGNvbG9y
-OiB3aGl0ZTsKfQoKLyoKICogQWRqdXN0bWVudHMgdG8gYWxpZ24gbWF0ZXJpYWwgaWNvbnMgaW4gdGhl
-IHRvb2xiYXIgYnV0dG9ucy4KKi8KLmFjdGlvbi1idXR0b24gPiBzcGFuIHsKICBwb3NpdGlvbjpyZWxh
-dGl2ZTsKICB0b3A6IC0zcHg7Cn0KCi5hY3Rpb24tYnV0dG9uIC5tYXRlcmlhbC1pY29ucyB7CiAgdG9w
-OiA0cHg7Cn0KCi8qIERvbid0IHNoaWZ0IHRoZSBpY29uIHdoZW4gaXQncyBhIGRpcmVjdCBjaGlsZCBv
-ZiB0aGUgYnV0dG9uICovCi5hY3Rpb24tYnV0dG9uID4gLm1hdGVyaWFsLWljb25zIHsKICB0b3A6IDFw
-eDsKfQoKLyogU2hpZnQgdGhlIHRleHQgdG8gY2VudGVyIHdpdGggdGhlIGljb24uICovCi5hY3Rpb24t
-YnV0dG9uID4gc3Bhbi5sYWJlbCB7CiAgcG9zaXRpb246cmVsYXRpdmU7CiAgdG9wOiAtNHB4Owp9Cgou
-YWN0aW9uLWJ1dHRvbiAubWF0ZXJpYWwtaWNvbnMgewogIGZvbnQtc2l6ZTogMjBweDsKICBwb3NpdGlv
-bjogcmVsYXRpdmU7Cn0KCi5wbGFjZWhvbGRlciB7CiAgY29sb3I6ICM3Nzc7CiAgdGV4dC1hbGlnbjog
-Y2VudGVyOwogIG1hcmdpbi10b3A6IDNlbSAhaW1wb3J0YW50Owp9CgovKioKICogSExKUyBPdmVycmlk
-ZXMKICovCi5obGpzIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTIyMDJmOyAvKiAkZGFyay1jb2RlLWJh
-Y2tncm91bmQtY29sb3IgKi8KICBjb2xvcjogI2MwYzJjNTsgLyogJGRhcmstZWRpdG9yLXRleHQgKi8K
-ICBkaXNwbGF5OiBibG9jazsKICBvdmVyZmxvdy14OiBhdXRvOwogIHBhZGRpbmc6IDAuNWVtOwogIC8q
-KgogICAqIFRoaXMgYWxsb3dzIHRoZSBwZXItbGluZSBoaWdobGlnaHRzIHRvIHNob3cuCiAgICovCiAg
-YmFja2dyb3VuZDogbm9uZTsKfQoKLmhsanMta2V5d29yZCwKLmhsanMtc2VsZWN0b3ItdGFnLAouaGxq
-cy1kZWxldGlvbiB7CiAgY29sb3I6ICM1MWM2ODY7IC8qIGNtLWtleXdvcmQgKi8KfQoKLmhsanMtbnVt
-YmVyIHsKICBjb2xvcjogIzYyNzk3ODsgLyogY20tbnVtYmVyICovCn0KCi5obGpzLWNvbW1lbnQgewog
-IGNvbG9yOiAjOTE5OGI0OyAvKiBjbS1jb21tZW50ICovCn0KCi5obGpzLWxpdGVyYWwgewogIGNvbG9y
-OiAjZWU4NjY2OyAvKiBjbS1hdG9tICovCn0KCi5obGpzLXN0cmluZyB7CiAgY29sb3I6ICNlNTUwNzQ7
-IC8qIGNtLXN0cmluZyAqLwp9CgouaGxqcy12YXJpYWJsZSB7CiAgY29sb3I6ICMxNmFkY2E7IC8qIGNt
-LXZhcmlhYmxlICovCn0KCi5obGpzLWxpbmsgewogIGNvbG9yOiAjZTU1MDc0OyAvKiBjbS1zdHJpbmcg
-Ki8KfQouaGxqcy1zZWN0aW9uLAouaGxqcy10eXBlLAouaGxqcy1idWlsdF9pbiwKLmhsanMtdGl0bGUg
-ewogIGNvbG9yOiAjZWU4NjY2OyAvKiBjbS12YXJpYWJsZS0yICovCn0KCi5obGpzLWFkZGl0aW9uIHsK
-ICBjb2xvcjogIzI2Mzk1MjsgLyogJGRhcmstc2VsZWN0aW9uLWNvbG9yICovCn0KCi5obGpzLW1ldGEg
-ewogIGNvbG9yOiAjNjI3OTc4Owp9Cg==
+aW9uOiByZWxhdGl2ZTsKfQoKLnRhcmdldCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKICBwb3Np
+dGlvbjogcmVsYXRpdmU7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICBmb250LXdlaWdodDogNjAwOwp9
+CgouaW5mby1wYW5lbCB7CiAgZmxleDogMSAyMDBweDsKICBtYXJnaW46IDA7CiAgaGVpZ2h0OiAxMDAl
+OwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmluZm8tcGFuZWwg
+LmVkaXQtcGFuZWwgewogIGJhY2tncm91bmQtY29sb3I6ICMxMjIwMmY7CiAgb3ZlcmZsb3c6IGF1dG87
+Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250ZW50IHsKICBwYWRkaW5nOiA3cHg7Cn0KCi5pbmZvLXBh
+bmVsIC5wYW5lbC1jb250ZW50PiA6Zmlyc3QtY2hpbGQgewogIG1hcmdpbi10b3A6IDA7Cn0KCi5pbmZv
+LXBhbmVsIC5ub3dyYXAgewogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5pbmZvLXBhbmVsIHVsLAou
+aW5mby1wYW5lbCBvbCB7CiAgcGFkZGluZy1sZWZ0OiAyMHB4Owp9CgouaW5mby1wYW5lbCBsaSB7CiAg
+bWFyZ2luOiAwIDAgNXB4IDA7Cn0KCi5pbmZvLXBhbmVsIGEgewogIGNvbG9yOiAjMTM5YmI1Owp9Cgou
+aW5mby1wYW5lbCBhOmhvdmVyIHsKICBjb2xvcjogIzFlYzdlNzsgLyogIzEzOWJiNSBsaWdodGVuZWQg
+MjAlICovCn0KCi5pbmZvLXBhbmVsIC5lZGl0LWxpc3QgewogIGJhY2tncm91bmQtY29sb3I6ICMxMjIw
+MmY7CiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi5lZGl0LXBhbmVsIHsKICBtYXJnaW4tdG9wOiA2cHg7CiAg
+ZmxleDogMSAxMDBweDsKfQoKLmVkaXQtbGlzdCB7CiAgZmxleDogMiAxMDBweDsKfQoKLmVkaXQtbGlz
+dCAuZWRpdCB7CiAgbWFyZ2luOiAzcHggMDsKfQoKLmVkaXQtbGlzdCAuZWRpdC1saW5rIHsKICBjdXJz
+b3I6IHBvaW50ZXI7Cn0KCi5wb3B1cC1wYW5lIHsKICBkaXNwbGF5OiBub25lOwogIHBvc2l0aW9uOiBm
+aXhlZDsKICB0b3A6IDE1MHB4OwogIGxlZnQ6IDE1MHB4OwogIHJpZ2h0OiAxNTBweDsKICBib3R0b206
+IDE1MHB4OwogIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOwogIGJvcmRlci10b3A6IDJweCBzb2xpZCBi
+bGFjazsKICBib3JkZXItcmFkaXVzOiA3cHg7CiAgYm94LXNoYWRvdzogMHB4IDBweCAyMHB4IDJweCAj
+YjRiZmNiMjI7CiAgei1pbmRleDogNDAwOwogIGJhY2tncm91bmQ6ICMyYjMwMzY7CiAgcGFkZGluZzog
+MjBweDsKfQoKLnBvcHVwLXBhbmUgLmNsb3NlIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6
+IDEwcHg7CiAgdG9wOiAxMHB4OwogIGN1cnNvcjogcG9pbnRlcjsKICB0ZXh0LXNoYWRvdzogMXB4IDFw
+eCAycHggIzg4ODsKICBib3gtc2hhZG93OiAxcHggMXB4IDJweCAjMTExOwp9CgoucG9wdXAtcGFuZSBo
+MiB7CiAgcGFkZGluZzogMjFweDsKICBoZWlnaHQ6IDEwJTsKICBtYXJnaW46IDBweDsKICBib3gtc2l6
+aW5nOiBib3JkZXItYm94Owp9CgoucG9wdXAtcGFuZSBwIHsKICBoZWlnaHQ6IDEwJTsKICBib3gtc2l6
+aW5nOiBib3JkZXItYm94OwogIHBhZGRpbmc6IDBweCAyMHB4Owp9CgoucG9wdXAtcGFuZSBwcmUgewog
+IGJhY2tncm91bmQ6ICMxMjIwMmY7CiAgcGFkZGluZzogMjBweDsKICBib3R0b206IDBweDsKICBvdmVy
+ZmxvdzogYXV0byBzY3JvbGw7CiAgaGVpZ2h0OiA2NSU7CiAgbWFyZ2luOiAwcHg7CiAgYm94LXNpemlu
+ZzogYm9yZGVyLWJveDsKfQoKLnBvcHVwLXBhbmUgLmJ1dHRvbi5ib3R0b20gewogIG1hcmdpbjogMjBw
+eCAwcHg7CiAgZGlzcGxheTogYmxvY2s7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoucmVydW5uaW5n
+LXBhbmUgewogIGRpc3BsYXk6IG5vbmU7Cn0KCmJvZHkucmVydW5uaW5nIC5yZXJ1bm5pbmctcGFuZSB7
+CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IGZpeGVkOwogIHRvcDogMHB4OwogIGJvdHRvbTog
+MHB4OwogIGxlZnQ6IDBweDsKICByaWdodDogMHB4OwogIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDBB
+QTsgLyogdHJhbnNsdWNlbnQgYmxhY2sgKi8KICB6LWluZGV4OiA0MDA7Cn0KCi5yZXJ1bm5pbmctcGFu
+ZSBoMSB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogNTAlOwogIGxlZnQ6IDUwJTsKICB0cmFu
+c2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKfQoKLmVkaXQtcGFuZWwgLnR5cGUtZGVzY3JpcHRp
+b24gewogIC8qIEZyb20gRGFydFBhZCAkZGFyay1vcmFuZ2UgKi8KICBjb2xvcjogI2ZmOTE2ZTsKICBm
+b250LWZhbWlseTogbW9ub3NwYWNlOwp9Cgp1bC50cmFjZSB7CiAgZm9udC1zaXplOiAxM3B4OwogIGxp
+c3Qtc3R5bGUtdHlwZTogbm9uZTsKICBwYWRkaW5nLWxlZnQ6IDBweDsKfQoKdWwudHJhY2UgbGkgewog
+IGNvbG9yOiB3aGl0ZTsKfQoKdWwudHJhY2UgbGkgLmZ1bmN0aW9uIHsKICAvKiBmcm9tIC5obGpzLXZh
+cmlhYmxlICovCiAgY29sb3I6ICMxNmFkY2E7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250
+LXdlaWdodDogNjAwOwp9Cgp1bC50cmFjZSBsaSBwLmRyYXdlciB7CiAgbWFyZ2luOiAzcHggMHB4Owog
+IHBhZGRpbmc6IDBweCAwcHggMHB4IDE0cHg7Cn0KCnVsLnRyYWNlIGxpIHAuZHJhd2VyIGJ1dHRvbiB7
+CiAgbWFyZ2luLXJpZ2h0OiAzcHg7Cn0KCi5lbGV2YXRpb24tejQgewogIGJveC1zaGFkb3c6IDBweCAy
+cHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLAogICAgICAwcHggNHB4IDVweCAwcHggcmdiYSgw
+LCAwLCAwLCAwLjE0KSwKICAgICAgMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIC4xMik7Cn0K
+CmEgewogIGNvbG9yOiAjY2NjOwogIGZpbGw6ICNjY2M7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9
+CgphOmhvdmVyIHsKICBjb2xvcjogI2RiZGJkYjsgLyogI2NjYyBsaWdodGVudGVkIDMwJSovCiAgZmls
+bDogI2ZmZjsKfQoKLmFkZC1oaW50LWxpbmsgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBtYXJn
+aW46IDNweDsKfQoKLmFkZC1oaW50LWxpbms6aG92ZXIgewogIGNvbG9yOiAjZmZmOwp9CgpoZWFkZXIg
+YnV0dG9uIHsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgpoZWFkZXIgYSB7CiAgbWFyZ2lu
+OiAwOwp9CgovKiBDYXJlZnVsIGhlcmUuIGBhLmJ1dHRvbmAgaXMgcmVwZXRpdGl2ZSBidXQgcmVxdWly
+ZWQgdG8gZ2V0IGNvcnJlY3QKICogc3BlY2lmaWNpdHkgKi8KYnV0dG9uLCAuYnV0dG9uLCBhLmJ1dHRv
+biB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMiwgMTM4LCAyNTMsIDAuMTUpOwogIGJvcmRlcjog
+bm9uZTsKICBib3JkZXItcmFkaXVzOiAzcHg7CiAgcGFkZGluZzogM3B4IDEwcHg7CiAgZm9udC13ZWln
+aHQ6IDUwMDsKICBmb250LWZvbnQ6IFJvYm90bywgc2Fucy1zZXJpZjsKICBjb2xvcjogI2ZmZjsKfQoK
+YnV0dG9uOmhvdmVyLCAuYnV0dG9uOmhvdmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIyLCAx
+MzgsIDI1MywgMC4yOSk7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgpidXR0b25bZGlzYWJsZWRdIHsKICBi
+YWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LC4xMik7CiAgY29sb3I6IHJnYmEoMjU1LDI1
+NSwyNTUsLjM3KTsKICBjdXJzb3I6IG5vdC1hbGxvd2VkOwp9CgovKiBDaGFuZ2UgZWRpdCBwYW5lbCBi
+dXR0b24gY29sb3JzICovCi5lZGl0LXBhbmVsIC5idXR0b24sIC5lZGl0LXBhbmVsIGJ1dHRvbiB7CiAg
+YmFja2dyb3VuZC1jb2xvcjogcmdiYSg2MywgMTA0LCAxNDgsIDAuNik7CiAgY29sb3I6IHdoaXRlOwp9
+Ci5lZGl0LXBhbmVsIC5idXR0b246aG92ZXIsIC5lZGl0LXBhbmVsIGJ1dHRvbjpob3ZlciB7CiAgYmFj
+a2dyb3VuZC1jb2xvcjogcmdiYSgxMDEsIDE1MywgMjA4LCAwLjYpOwogIGNvbG9yOiB3aGl0ZTsKfQoK
+LyoKICogQWRqdXN0bWVudHMgdG8gYWxpZ24gbWF0ZXJpYWwgaWNvbnMgaW4gdGhlIHRvb2xiYXIgYnV0
+dG9ucy4KKi8KLmFjdGlvbi1idXR0b24gPiBzcGFuIHsKICBwb3NpdGlvbjpyZWxhdGl2ZTsKICB0b3A6
+IC0zcHg7Cn0KCi5hY3Rpb24tYnV0dG9uIC5tYXRlcmlhbC1pY29ucyB7CiAgdG9wOiA0cHg7Cn0KCi8q
+IERvbid0IHNoaWZ0IHRoZSBpY29uIHdoZW4gaXQncyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgYnV0dG9u
+ICovCi5hY3Rpb24tYnV0dG9uID4gLm1hdGVyaWFsLWljb25zIHsKICB0b3A6IDFweDsKfQoKLyogU2hp
+ZnQgdGhlIHRleHQgdG8gY2VudGVyIHdpdGggdGhlIGljb24uICovCi5hY3Rpb24tYnV0dG9uID4gc3Bh
+bi5sYWJlbCB7CiAgcG9zaXRpb246cmVsYXRpdmU7CiAgdG9wOiAtNHB4Owp9CgouYWN0aW9uLWJ1dHRv
+biAubWF0ZXJpYWwtaWNvbnMgewogIGZvbnQtc2l6ZTogMjBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7
+Cn0KCi5wbGFjZWhvbGRlciB7CiAgY29sb3I6ICM3Nzc7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1h
+cmdpbi10b3A6IDNlbSAhaW1wb3J0YW50Owp9CgovKioKICogSExKUyBPdmVycmlkZXMKICovCi5obGpz
+IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTIyMDJmOyAvKiAkZGFyay1jb2RlLWJhY2tncm91bmQtY29s
+b3IgKi8KICBjb2xvcjogI2MwYzJjNTsgLyogJGRhcmstZWRpdG9yLXRleHQgKi8KICBkaXNwbGF5OiBi
+bG9jazsKICBvdmVyZmxvdy14OiBhdXRvOwogIHBhZGRpbmc6IDAuNWVtOwogIC8qKgogICAqIFRoaXMg
+YWxsb3dzIHRoZSBwZXItbGluZSBoaWdobGlnaHRzIHRvIHNob3cuCiAgICovCiAgYmFja2dyb3VuZDog
+bm9uZTsKfQoKLmhsanMta2V5d29yZCwKLmhsanMtc2VsZWN0b3ItdGFnLAouaGxqcy1kZWxldGlvbiB7
+CiAgY29sb3I6ICM1MWM2ODY7IC8qIGNtLWtleXdvcmQgKi8KfQoKLmhsanMtbnVtYmVyIHsKICBjb2xv
+cjogIzYyNzk3ODsgLyogY20tbnVtYmVyICovCn0KCi5obGpzLWNvbW1lbnQgewogIGNvbG9yOiAjOTE5
+OGI0OyAvKiBjbS1jb21tZW50ICovCn0KCi5obGpzLWxpdGVyYWwgewogIGNvbG9yOiAjZWU4NjY2OyAv
+KiBjbS1hdG9tICovCn0KCi5obGpzLXN0cmluZyB7CiAgY29sb3I6ICNlNTUwNzQ7IC8qIGNtLXN0cmlu
+ZyAqLwp9CgouaGxqcy12YXJpYWJsZSB7CiAgY29sb3I6ICMxNmFkY2E7IC8qIGNtLXZhcmlhYmxlICov
+Cn0KCi5obGpzLWxpbmsgewogIGNvbG9yOiAjZTU1MDc0OyAvKiBjbS1zdHJpbmcgKi8KfQouaGxqcy1z
+ZWN0aW9uLAouaGxqcy10eXBlLAouaGxqcy1idWlsdF9pbiwKLmhsanMtdGl0bGUgewogIGNvbG9yOiAj
+ZWU4NjY2OyAvKiBjbS12YXJpYWJsZS0yICovCn0KCi5obGpzLWFkZGl0aW9uIHsKICBjb2xvcjogIzI2
+Mzk1MjsgLyogJGRhcmstc2VsZWN0aW9uLWNvbG9yICovCn0KCi5obGpzLW1ldGEgewogIGNvbG9yOiAj
+NjI3OTc4Owp9Cg==
 ''';
 
 String _migration_js;
@@ -8445,3258 +8445,3257 @@
 ZihhLmNvbnN0cnVjdG9yPT1BcnJheSlyZXR1cm4gSi5qZC5wcm90b3R5cGUKaWYodHlwZW9mIGEhPSJv
 YmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJu
 IGF9aWYoYSBpbnN0YW5jZW9mIFAuTWgpcmV0dXJuIGEKcmV0dXJuIEoua3MoYSl9LApBNTpmdW5jdGlv
-bihhLGIpe3JldHVybiBKLncxKGEpLmVSKGEsYil9LApDTTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4g
-Si5ZRShhKS5kdShhLGIsYyxkKX0sCkVoOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5ZRShhKS5tSyhh
-LGIsYyl9LApFbDpmdW5jdGlvbihhLGIpe3JldHVybiBKLncxKGEpLmRyKGEsYil9LApGNzpmdW5jdGlv
-bihhKXtyZXR1cm4gSi5VNihhKS5nb3IoYSl9LApGTDpmdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEp
-LmRkKGEsYil9LApHQTpmdW5jdGlvbihhLGIpe3JldHVybiBKLncxKGEpLkUoYSxiKX0sCkhtOmZ1bmN0
-aW9uKGEpe3JldHVybiBKLlU2KGEpLmdBKGEpfSwKSVQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudzEoYSku
-Z20oYSl9LApKeTpmdW5jdGlvbihhLGIpe3JldHVybiBKLmlhKGEpLmU3KGEsYil9LApLVjpmdW5jdGlv
-bihhLGIpe3JldHVybiBKLnJZKGEpLkcoYSxiKX0sCkx0OmZ1bmN0aW9uKGEpe3JldHVybiBKLllFKGEp
-LndnKGEpfSwKTTE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLncxKGEpLkUyKGEsYixjKX0sCk11OmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIEouWUUoYSkuc0QoYSxiKX0sClF6OmZ1bmN0aW9uKGEsYil7cmV0dXJu
-IEouclkoYSkuVyhhLGIpfSwKUk06ZnVuY3Rpb24oYSxiKXtpZihhPT1udWxsKXJldHVybiBiPT1udWxs
-CmlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gYiE9bnVsbCYmYT09PWIKcmV0dXJuIEouaWEoYSku
-RE4oYSxiKX0sClJYOmZ1bmN0aW9uKGEpe3JldHVybiBKLncxKGEpLmJyKGEpfSwKVDA6ZnVuY3Rpb24o
-YSl7cmV0dXJuIEouclkoYSkuYlMoYSl9LApWdTpmdW5jdGlvbihhKXtyZXR1cm4gSi52ZChhKS56UShh
-KX0sCmE2OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouclkoYSkuTzIoYSxiKX0sCmJUOmZ1bmN0aW9uKGEp
-e3JldHVybiBKLllFKGEpLkQ0KGEpfSwKYmI6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09Im51bWJl
-ciImJnR5cGVvZiBiPT0ibnVtYmVyIilyZXR1cm4gYStiCnJldHVybiBKLlRKKGEpLmgoYSxiKX0sCmNI
-OmZ1bmN0aW9uKGEpe3JldHVybiBKLnJZKGEpLmhjKGEpfSwKZFI6ZnVuY3Rpb24oYSl7cmV0dXJuIEou
-WUUoYSkuZ0QoYSl9LApkWjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5ZRShhKS5PbihhLGIsYyxk
-KX0sCmRnOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBKLnJZKGEpLmk3KGEsYixjLGQpfSwKZGg6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIEouWUUoYSkuRkYoYSl9LApkcjpmdW5jdGlvbihhLGIpe3JldHVybiBKLllF
-KGEpLnNhNChhLGIpfSwKaGY6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaWEoYSkuZ2lPKGEpfSwKaWc6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIEouWUUoYSkuZ1FnKGEpfSwKajpmdW5jdGlvbihhKXtyZXR1cm4gSi5pYShh
-KS53KGEpfSwKbDU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5ZRShhKS5zaGYoYSxiKX0sCmxkOmZ1bmN0
-aW9uKGEsYixjKXtyZXR1cm4gSi5yWShhKS5OaihhLGIsYyl9LApwNDpmdW5jdGlvbihhLGIpe3JldHVy
-biBKLnJZKGEpLlRjKGEsYil9LApxMDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouclkoYSkuUWkoYSxi
-LGMpfSwKcUY6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWUUoYSkuZ1ZsKGEpfSwKdEg6ZnVuY3Rpb24oYSxi
-LGMpe3JldHVybiBKLllFKGEpLnBrKGEsYixjKX0sCnU5OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi53
-MShhKS5ZKGEsYixjKX0sCnVVOmZ1bmN0aW9uKGEpe3JldHVybiBKLlU2KGEpLmdsMChhKX0sCndmOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIEouWUUoYSkuc1JOKGEsYil9LAp4OTpmdW5jdGlvbihhLGIpe2lmKHR5
-cGVvZiBiPT09Im51bWJlciIpaWYoYS5jb25zdHJ1Y3Rvcj09QXJyYXl8fHR5cGVvZiBhPT0ic3RyaW5n
-Inx8SC53VihhLGFbdi5kaXNwYXRjaFByb3BlcnR5TmFtZV0pKWlmKGI+Pj4wPT09YiYmYjxhLmxlbmd0
-aClyZXR1cm4gYVtiXQpyZXR1cm4gSi5VNihhKS5xKGEsYil9LAp6bDpmdW5jdGlvbihhLGIpe3JldHVy
-biBKLlU2KGEpLnRnKGEsYil9LAp2QjpmdW5jdGlvbiB2Qigpe30sCnlFOmZ1bmN0aW9uIHlFKCl7fSwK
-d2U6ZnVuY3Rpb24gd2UoKXt9LApNRjpmdW5jdGlvbiBNRigpe30sCmlDOmZ1bmN0aW9uIGlDKCl7fSwK
-a2Q6ZnVuY3Rpb24ga2QoKXt9LApjNTpmdW5jdGlvbiBjNSgpe30sCmpkOmZ1bmN0aW9uIGpkKGEpe3Ro
-aXMuJHRpPWF9LApQbzpmdW5jdGlvbiBQbyhhKXt0aGlzLiR0aT1hfSwKbTE6ZnVuY3Rpb24gbTEoYSxi
-LGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPTAKXy5kPW51bGwKXy4kdGk9Y30sCnFJOmZ1bmN0
-aW9uIHFJKCl7fSwKYlU6ZnVuY3Rpb24gYlUoKXt9LApWQTpmdW5jdGlvbiBWQSgpe30sCkRyOmZ1bmN0
-aW9uIERyKCl7fX0sUD17Ck9qOmZ1bmN0aW9uKCl7dmFyIHMscixxPXt9CmlmKHNlbGYuc2NoZWR1bGVJ
-bW1lZGlhdGUhPW51bGwpcmV0dXJuIFAuRVgoKQppZihzZWxmLk11dGF0aW9uT2JzZXJ2ZXIhPW51bGwm
-JnNlbGYuZG9jdW1lbnQhPW51bGwpe3M9c2VsZi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQpy
-PXNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpCnEuYT1udWxsCm5ldyBzZWxmLk11dGF0
-aW9uT2JzZXJ2ZXIoSC50UihuZXcgUC50aChxKSwxKSkub2JzZXJ2ZShzLHtjaGlsZExpc3Q6dHJ1ZX0p
-CnJldHVybiBuZXcgUC5oYShxLHMscil9ZWxzZSBpZihzZWxmLnNldEltbWVkaWF0ZSE9bnVsbClyZXR1
-cm4gUC55dCgpCnJldHVybiBQLnFXKCl9LApaVjpmdW5jdGlvbihhKXtzZWxmLnNjaGVkdWxlSW1tZWRp
-YXRlKEgudFIobmV3IFAuVnModC5NLmEoYSkpLDApKX0sCm9BOmZ1bmN0aW9uKGEpe3NlbGYuc2V0SW1t
-ZWRpYXRlKEgudFIobmV3IFAuRnQodC5NLmEoYSkpLDApKX0sCkJ6OmZ1bmN0aW9uKGEpe3QuTS5hKGEp
-ClAuUU4oMCxhKX0sClFOOmZ1bmN0aW9uKGEsYil7dmFyIHM9bmV3IFAuVzMoKQpzLkNZKGEsYikKcmV0
-dXJuIHN9LApGWDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuaWgobmV3IFAudnMoJC5YMyxhLkMoInZz
-PDA+IikpLGEuQygiaWg8MD4iKSl9LApESTpmdW5jdGlvbihhLGIpe2EuJDIoMCxudWxsKQpiLmI9ITAK
-cmV0dXJuIGIuYX0sCmpROmZ1bmN0aW9uKGEsYil7UC5KZShhLGIpfSwKeUM6ZnVuY3Rpb24oYSxiKXti
-LmFNKDAsYSl9LApmMzpmdW5jdGlvbihhLGIpe2IudzAoSC5SdShhKSxILnRzKGEpKX0sCkplOmZ1bmN0
-aW9uKGEsYil7dmFyIHMscixxPW5ldyBQLldNKGIpLHA9bmV3IFAuU1goYikKaWYoYSBpbnN0YW5jZW9m
-IFAudnMpYS5RZChxLHAsdC56KQplbHNle3M9dC56CmlmKHQuZC5iKGEpKWEuU3EocSxwLHMpCmVsc2V7
-cj1uZXcgUC52cygkLlgzLHQuYykKci5hPTQKci5jPWEKci5RZChxLHAscyl9fX0sCmx6OmZ1bmN0aW9u
-KGEpe3ZhciBzPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQsZSl7d2hpbGUodHJ1ZSl0cnl7
-YihkLGUpCmJyZWFrfWNhdGNoKHIpe2U9cgpkPWN9fX0oYSwxKQpyZXR1cm4gJC5YMy5MaihuZXcgUC5H
-cyhzKSx0LkgsdC5TLHQueil9LApHUTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuRnkoYSwxKX0sClRo
-OmZ1bmN0aW9uKCl7cmV0dXJuIEMud1F9LApZbTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuRnkoYSwz
-KX0sCmwwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLnE0KGEsYi5DKCJxNDwwPiIpKX0sCmszOmZ1
-bmN0aW9uKGEsYil7dmFyIHMscixxCmIuYT0xCnRyeXthLlNxKG5ldyBQLnBWKGIpLG5ldyBQLlU3KGIp
-LHQuUCl9Y2F0Y2gocSl7cz1ILlJ1KHEpCnI9SC50cyhxKQpQLnJiKG5ldyBQLnZyKGIscyxyKSl9fSwK
-QTk6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEKZm9yKHM9dC5jO3I9YS5hLHI9PT0yOylhPXMuYShhLmMp
-CmlmKHI+PTQpe3E9Yi5haCgpCmIuYT1hLmEKYi5jPWEuYwpQLkhaKGIscSl9ZWxzZXtxPXQuRi5hKGIu
-YykKYi5hPTIKYi5jPWEKYS5qUShxKX19LApIWjpmdW5jdGlvbihhMCxhMSl7dmFyIHMscixxLHAsbyxu
-LG0sbCxrLGosaSxoLGcsZixlLGQsYz1udWxsLGI9e30sYT1iLmE9YTAKZm9yKHM9dC5uLHI9dC5GLHE9
-dC5kOyEwOyl7cD17fQpvPWEuYT09PTgKaWYoYTE9PW51bGwpe2lmKG8pe249cy5hKGEuYykKUC5MMihj
-LGMsYS5iLG4uYSxuLmIpfXJldHVybn1wLmE9YTEKbT1hMS5hCmZvcihhPWExO20hPW51bGw7YT1tLG09
-bCl7YS5hPW51bGwKUC5IWihiLmEsYSkKcC5hPW0KbD1tLmF9az1iLmEKaj1rLmMKcC5iPW8KcC5jPWoK
-aT0hbwppZihpKXtoPWEuYwpoPShoJjEpIT09MHx8KGgmMTUpPT09OH1lbHNlIGg9ITAKaWYoaCl7Zz1h
-LmIuYgppZihvKXtoPWsuYj09PWcKaD0hKGh8fGgpfWVsc2UgaD0hMQppZihoKXtzLmEoaikKUC5MMihj
-LGMsay5iLGouYSxqLmIpCnJldHVybn1mPSQuWDMKaWYoZiE9PWcpJC5YMz1nCmVsc2UgZj1jCmE9YS5j
-CmlmKChhJjE1KT09PTgpbmV3IFAuUlQocCxiLG8pLiQwKCkKZWxzZSBpZihpKXtpZigoYSYxKSE9PTAp
-bmV3IFAucnEocCxqKS4kMCgpfWVsc2UgaWYoKGEmMikhPT0wKW5ldyBQLlJXKGIscCkuJDAoKQppZihm
-IT1udWxsKSQuWDM9ZgphPXAuYwppZihxLmIoYSkpe2U9cC5hLmIKaWYoYS5hPj00KXtkPXIuYShlLmMp
-CmUuYz1udWxsCmExPWUuTjgoZCkKZS5hPWEuYQplLmM9YS5jCmIuYT1hCmNvbnRpbnVlfWVsc2UgUC5B
-OShhLGUpCnJldHVybn19ZT1wLmEuYgpkPXIuYShlLmMpCmUuYz1udWxsCmExPWUuTjgoZCkKYT1wLmIK
-az1wLmMKaWYoIWEpe2UuJHRpLmMuYShrKQplLmE9NAplLmM9a31lbHNle3MuYShrKQplLmE9OAplLmM9
-a31iLmE9ZQphPWV9fSwKVkg6ZnVuY3Rpb24oYSxiKXt2YXIgcwppZih0LmFnLmIoYSkpcmV0dXJuIGIu
-TGooYSx0LnosdC5LLHQubCkKcz10LmJJCmlmKHMuYihhKSlyZXR1cm4gcy5hKGEpCnRocm93IEguYihQ
-LkwzKGEsIm9uRXJyb3IiLCJFcnJvciBoYW5kbGVyIG11c3QgYWNjZXB0IG9uZSBPYmplY3Qgb3Igb25l
-IE9iamVjdCBhbmQgYSBTdGFja1RyYWNlIGFzIGFyZ3VtZW50cywgYW5kIHJldHVybiBhIGEgdmFsaWQg
-cmVzdWx0IikpfSwKcHU6ZnVuY3Rpb24oKXt2YXIgcyxyCmZvcihzPSQuUzY7cyE9bnVsbDtzPSQuUzYp
-eyQubWc9bnVsbApyPXMuYgokLlM2PXIKaWYocj09bnVsbCkkLms4PW51bGwKcy5hLiQwKCl9fSwKZU46
-ZnVuY3Rpb24oKXskLlVEPSEwCnRyeXtQLnB1KCl9ZmluYWxseXskLm1nPW51bGwKJC5VRD0hMQppZigk
-LlM2IT1udWxsKSQudXQoKS4kMShQLlY5KCkpfX0sCmVXOmZ1bmN0aW9uKGEpe3ZhciBzPW5ldyBQLk9N
-KGEpLHI9JC5rOAppZihyPT1udWxsKXskLlM2PSQuazg9cwppZighJC5VRCkkLnV0KCkuJDEoUC5WOSgp
-KX1lbHNlICQuazg9ci5iPXN9LApyUjpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD0kLlM2CmlmKHA9PW51
-bGwpe1AuZVcoYSkKJC5tZz0kLms4CnJldHVybn1zPW5ldyBQLk9NKGEpCnI9JC5tZwppZihyPT1udWxs
-KXtzLmI9cAokLlM2PSQubWc9c31lbHNle3E9ci5iCnMuYj1xCiQubWc9ci5iPXMKaWYocT09bnVsbCkk
-Lms4PXN9fSwKcmI6ZnVuY3Rpb24oYSl7dmFyIHM9bnVsbCxyPSQuWDMKaWYoQy5OVT09PXIpe1AuVGso
-cyxzLEMuTlUsYSkKcmV0dXJufVAuVGsocyxzLHIsdC5NLmEoci5HWShhKSkpfSwKUXc6ZnVuY3Rpb24o
-YSxiKXtQLlVJKGEsInN0cmVhbSIsdC5SKQpyZXR1cm4gbmV3IFAueEkoYi5DKCJ4STwwPiIpKX0sClRs
-OmZ1bmN0aW9uKGEsYil7dmFyIHM9Yj09bnVsbD9QLnYwKGEpOmIKUC5VSShhLCJlcnJvciIsdC5LKQpy
-ZXR1cm4gbmV3IFAuQ3coYSxzKX0sCnYwOmZ1bmN0aW9uKGEpe3ZhciBzCmlmKHQuci5iKGEpKXtzPWEu
-Z0lJKCkKaWYocyE9bnVsbClyZXR1cm4gc31yZXR1cm4gQy5wZH0sCkwyOmZ1bmN0aW9uKGEsYixjLGQs
-ZSl7UC5yUihuZXcgUC5wSyhkLGUpKX0sClQ4OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHMscj0kLlgz
-CmlmKHI9PT1jKXJldHVybiBkLiQwKCkKJC5YMz1jCnM9cgp0cnl7cj1kLiQwKCkKcmV0dXJuIHJ9Zmlu
-YWxseXskLlgzPXN9fSwKeXY6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHMscj0kLlgzCmlmKHI9
-PT1jKXJldHVybiBkLiQxKGUpCiQuWDM9YwpzPXIKdHJ5e3I9ZC4kMShlKQpyZXR1cm4gcn1maW5hbGx5
-eyQuWDM9c319LApReDpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7dmFyIHMscj0kLlgzCmlmKHI9
-PT1jKXJldHVybiBkLiQyKGUsZikKJC5YMz1jCnM9cgp0cnl7cj1kLiQyKGUsZikKcmV0dXJuIHJ9Zmlu
-YWxseXskLlgzPXN9fSwKVGs6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMKdC5NLmEoZCkKcz1DLk5VIT09
-YwppZihzKWQ9ISghc3x8ITEpP2MuR1koZCk6Yy5SVChkLHQuSCkKUC5lVyhkKX0sCnRoOmZ1bmN0aW9u
-IHRoKGEpe3RoaXMuYT1hfSwKaGE6ZnVuY3Rpb24gaGEoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRo
-aXMuYz1jfSwKVnM6ZnVuY3Rpb24gVnMoYSl7dGhpcy5hPWF9LApGdDpmdW5jdGlvbiBGdChhKXt0aGlz
-LmE9YX0sClczOmZ1bmN0aW9uIFczKCl7fSwKeUg6ZnVuY3Rpb24geUgoYSxiKXt0aGlzLmE9YQp0aGlz
-LmI9Yn0sCmloOmZ1bmN0aW9uIGloKGEsYil7dGhpcy5hPWEKdGhpcy5iPSExCnRoaXMuJHRpPWJ9LApX
-TTpmdW5jdGlvbiBXTShhKXt0aGlzLmE9YX0sClNYOmZ1bmN0aW9uIFNYKGEpe3RoaXMuYT1hfSwKR3M6
-ZnVuY3Rpb24gR3MoYSl7dGhpcy5hPWF9LApGeTpmdW5jdGlvbiBGeShhLGIpe3RoaXMuYT1hCnRoaXMu
-Yj1ifSwKR1Y6ZnVuY3Rpb24gR1YoYSxiKXt2YXIgXz10aGlzCl8uYT1hCl8uZD1fLmM9Xy5iPW51bGwK
-Xy4kdGk9Yn0sCnE0OmZ1bmN0aW9uIHE0KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sClBmOmZ1bmN0
-aW9uIFBmKCl7fSwKWmY6ZnVuY3Rpb24gWmYoYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKRmU6ZnVu
-Y3Rpb24gRmUoYSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uYT1udWxsCl8uYj1hCl8uYz1iCl8uZD1jCl8u
-ZT1kCl8uJHRpPWV9LAp2czpmdW5jdGlvbiB2cyhhLGIpe3ZhciBfPXRoaXMKXy5hPTAKXy5iPWEKXy5j
-PW51bGwKXy4kdGk9Yn0sCmRhOmZ1bmN0aW9uIGRhKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApvUTpm
-dW5jdGlvbiBvUShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKcFY6ZnVuY3Rpb24gcFYoYSl7dGhpcy5h
-PWF9LApVNzpmdW5jdGlvbiBVNyhhKXt0aGlzLmE9YX0sCnZyOmZ1bmN0aW9uIHZyKGEsYixjKXt0aGlz
-LmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCnJ0OmZ1bmN0aW9uIHJ0KGEsYil7dGhpcy5hPWEKdGhpcy5i
-PWJ9LApLRjpmdW5jdGlvbiBLRihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKWkw6ZnVuY3Rpb24gWkwo
-YSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKUlQ6ZnVuY3Rpb24gUlQoYSxiLGMpe3Ro
-aXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKalo6ZnVuY3Rpb24galooYSl7dGhpcy5hPWF9LApycTpm
-dW5jdGlvbiBycShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKUlc6ZnVuY3Rpb24gUlcoYSxiKXt0aGlz
-LmE9YQp0aGlzLmI9Yn0sCk9NOmZ1bmN0aW9uIE9NKGEpe3RoaXMuYT1hCnRoaXMuYj1udWxsfSwKcWg6
-ZnVuY3Rpb24gcWgoKXt9LApCNTpmdW5jdGlvbiBCNShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKdU86
-ZnVuY3Rpb24gdU8oYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk1POmZ1bmN0aW9uIE1PKCl7fSwKa1Q6
-ZnVuY3Rpb24ga1QoKXt9LAp4STpmdW5jdGlvbiB4SShhKXt0aGlzLiR0aT1hfSwKQ3c6ZnVuY3Rpb24g
-Q3coYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCm0wOmZ1bmN0aW9uIG0wKCl7fSwKcEs6ZnVuY3Rpb24g
-cEsoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkppOmZ1bmN0aW9uIEppKCl7fSwKaGo6ZnVuY3Rpb24g
-aGooYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnA6ZnVuY3Rpb24gVnAoYSxiKXt0
-aGlzLmE9YQp0aGlzLmI9Yn0sCk9SOmZ1bmN0aW9uIE9SKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0
-aGlzLmM9Y30sCkVGOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYi5DKCJAPDA+IikuS3EoYykuQygiRm88
-MSwyPiIpLmEoSC5CNyhhLG5ldyBILk41KGIuQygiQDwwPiIpLktxKGMpLkMoIk41PDEsMj4iKSkpKX0s
-CkZsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILk41KGEuQygiQDwwPiIpLktxKGIpLkMoIk41PDEs
-Mj4iKSl9LApMczpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuYjYoYS5DKCJiNjwwPiIpKX0sClQyOmZ1
-bmN0aW9uKCl7dmFyIHM9T2JqZWN0LmNyZWF0ZShudWxsKQpzWyI8bm9uLWlkZW50aWZpZXIta2V5PiJd
-PXMKZGVsZXRlIHNbIjxub24taWRlbnRpZmllci1rZXk+Il0KcmV0dXJuIHN9LApyajpmdW5jdGlvbihh
-LGIsYyl7dmFyIHM9bmV3IFAubG0oYSxiLGMuQygibG08MD4iKSkKcy5jPWEuZQpyZXR1cm4gc30sCkVQ
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyCmlmKFAuaEIoYSkpe2lmKGI9PT0iKCImJmM9PT0iKSIpcmV0
-dXJuIiguLi4pIgpyZXR1cm4gYisiLi4uIitjfXM9SC5WTShbXSx0LnMpCkMuTm0uaSgkLnhnLGEpCnRy
-eXtQLlZyKGEscyl9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQok
-LnhnLnBvcCgpfXI9UC52ZyhiLHQudS5hKHMpLCIsICIpK2MKcmV0dXJuIHIuY2hhckNvZGVBdCgwKT09
-MD9yOnJ9LApXRTpmdW5jdGlvbihhLGIsYyl7dmFyIHMscgppZihQLmhCKGEpKXJldHVybiBiKyIuLi4i
-K2MKcz1uZXcgUC5SbihiKQpDLk5tLmkoJC54ZyxhKQp0cnl7cj1zCnIuYT1QLnZnKHIuYSxhLCIsICIp
-fWZpbmFsbHl7aWYoMD49JC54Zy5sZW5ndGgpcmV0dXJuIEguT0goJC54ZywtMSkKJC54Zy5wb3AoKX1z
-LmErPWMKcj1zLmEKcmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9LApoQjpmdW5jdGlvbihhKXt2
-YXIgcyxyCmZvcihzPSQueGcubGVuZ3RoLHI9MDtyPHM7KytyKWlmKGE9PT0kLnhnW3JdKXJldHVybiEw
-CnJldHVybiExfSwKVnI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsPWEuZ20oYSksaz0w
-LGo9MAp3aGlsZSghMCl7aWYoIShrPDgwfHxqPDMpKWJyZWFrCmlmKCFsLkYoKSlyZXR1cm4Kcz1ILkVq
-KGwuZ2woKSkKQy5ObS5pKGIscykKays9cy5sZW5ndGgrMjsrK2p9aWYoIWwuRigpKXtpZihqPD01KXJl
-dHVybgppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQpyPWIucG9wKCkKaWYoMD49Yi5sZW5n
-dGgpcmV0dXJuIEguT0goYiwtMSkKcT1iLnBvcCgpfWVsc2V7cD1sLmdsKCk7KytqCmlmKCFsLkYoKSl7
-aWYoajw9NCl7Qy5ObS5pKGIsSC5FaihwKSkKcmV0dXJufXI9SC5FaihwKQppZigwPj1iLmxlbmd0aCly
-ZXR1cm4gSC5PSChiLC0xKQpxPWIucG9wKCkKays9ci5sZW5ndGgrMn1lbHNle289bC5nbCgpOysragpm
-b3IoO2wuRigpO3A9byxvPW4pe249bC5nbCgpOysragppZihqPjEwMCl7d2hpbGUoITApe2lmKCEoaz43
-NSYmaj4zKSlicmVhawppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQprLT1iLnBvcCgpLmxl
-bmd0aCsyOy0tan1DLk5tLmkoYiwiLi4uIikKcmV0dXJufX1xPUguRWoocCkKcj1ILkVqKG8pCmsrPXIu
-bGVuZ3RoK3EubGVuZ3RoKzR9fWlmKGo+Yi5sZW5ndGgrMil7ays9NQptPSIuLi4ifWVsc2UgbT1udWxs
-CndoaWxlKCEwKXtpZighKGs+ODAmJmIubGVuZ3RoPjMpKWJyZWFrCmlmKDA+PWIubGVuZ3RoKXJldHVy
-biBILk9IKGIsLTEpCmstPWIucG9wKCkubGVuZ3RoKzIKaWYobT09bnVsbCl7ays9NQptPSIuLi4ifX1p
-ZihtIT1udWxsKUMuTm0uaShiLG0pCkMuTm0uaShiLHEpCkMuTm0uaShiLHIpfSwKdE06ZnVuY3Rpb24o
-YSxiKXt2YXIgcyxyLHE9UC5McyhiKQpmb3Iocz1hLmxlbmd0aCxyPTA7cjxhLmxlbmd0aDthLmxlbmd0
-aD09PXN8fCgwLEgubGspKGEpLCsrcilxLmkoMCxiLmEoYVtyXSkpCnJldHVybiBxfSwKbk86ZnVuY3Rp
-b24oYSl7dmFyIHMscj17fQppZihQLmhCKGEpKXJldHVybiJ7Li4ufSIKcz1uZXcgUC5SbigiIikKdHJ5
-e0MuTm0uaSgkLnhnLGEpCnMuYSs9InsiCnIuYT0hMAphLksoMCxuZXcgUC5yYShyLHMpKQpzLmErPSJ9
-In1maW5hbGx5e2lmKDA+PSQueGcubGVuZ3RoKXJldHVybiBILk9IKCQueGcsLTEpCiQueGcucG9wKCl9
-cj1zLmEKcmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9LApiNjpmdW5jdGlvbiBiNihhKXt2YXIg
-Xz10aGlzCl8uYT0wCl8uZj1fLmU9Xy5kPV8uYz1fLmI9bnVsbApfLnI9MApfLiR0aT1hfSwKYm46ZnVu
-Y3Rpb24gYm4oYSl7dGhpcy5hPWEKdGhpcy5jPXRoaXMuYj1udWxsfSwKbG06ZnVuY3Rpb24gbG0oYSxi
-LGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5kPV8uYz1udWxsCl8uJHRpPWN9LAptVzpmdW5jdGlv
-biBtVygpe30sCnV5OmZ1bmN0aW9uIHV5KCl7fSwKbEQ6ZnVuY3Rpb24gbEQoKXt9LAppbDpmdW5jdGlv
-biBpbCgpe30sCnJhOmZ1bmN0aW9uIHJhKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApZazpmdW5jdGlv
-biBZaygpe30sCnlROmZ1bmN0aW9uIHlRKGEpe3RoaXMuYT1hfSwKS1A6ZnVuY3Rpb24gS1AoKXt9LApQ
-bjpmdW5jdGlvbiBQbigpe30sCkdqOmZ1bmN0aW9uIEdqKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0s
-CmxmOmZ1bmN0aW9uIGxmKCl7fSwKVmo6ZnVuY3Rpb24gVmooKXt9LApYdjpmdW5jdGlvbiBYdigpe30s
-Cm5ZOmZ1bmN0aW9uIG5ZKCl7fSwKV1k6ZnVuY3Rpb24gV1koKXt9LApSVTpmdW5jdGlvbiBSVSgpe30s
-CnBSOmZ1bmN0aW9uIHBSKCl7fSwKQlM6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscAppZih0eXBlb2Yg
-YSE9InN0cmluZyIpdGhyb3cgSC5iKEgudEwoYSkpCnM9bnVsbAp0cnl7cz1KU09OLnBhcnNlKGEpfWNh
-dGNoKHEpe3I9SC5SdShxKQpwPVAucnIoU3RyaW5nKHIpLG51bGwsbnVsbCkKdGhyb3cgSC5iKHApfXA9
-UC5RZShzKQpyZXR1cm4gcH0sClFlOmZ1bmN0aW9uKGEpe3ZhciBzCmlmKGE9PW51bGwpcmV0dXJuIG51
-bGwKaWYodHlwZW9mIGEhPSJvYmplY3QiKXJldHVybiBhCmlmKE9iamVjdC5nZXRQcm90b3R5cGVPZihh
-KSE9PUFycmF5LnByb3RvdHlwZSlyZXR1cm4gbmV3IFAudXcoYSxPYmplY3QuY3JlYXRlKG51bGwpKQpm
-b3Iocz0wO3M8YS5sZW5ndGg7KytzKWFbc109UC5RZShhW3NdKQpyZXR1cm4gYX0sCmt5OmZ1bmN0aW9u
-KGEsYixjLGQpe3ZhciBzLHIKaWYoYiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe3M9YgpkPXMubGVuZ3Ro
-CmlmKGQtYzwxNSlyZXR1cm4gbnVsbApyPVAuQ0coYSxzLGMsZCkKaWYociE9bnVsbCYmYSlpZihyLmlu
-ZGV4T2YoIlx1ZmZmZCIpPj0wKXJldHVybiBudWxsCnJldHVybiByfXJldHVybiBudWxsfSwKQ0c6ZnVu
-Y3Rpb24oYSxiLGMsZCl7dmFyIHM9YT8kLkhHKCk6JC5yZigpCmlmKHM9PW51bGwpcmV0dXJuIG51bGwK
-aWYoMD09PWMmJmQ9PT1iLmxlbmd0aClyZXR1cm4gUC5SYihzLGIpCnJldHVybiBQLlJiKHMsYi5zdWJh
-cnJheShjLFAuakIoYyxkLGIubGVuZ3RoKSkpfSwKUmI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCnRyeXtz
-PWEuZGVjb2RlKGIpCnJldHVybiBzfWNhdGNoKHIpe0guUnUocil9cmV0dXJuIG51bGx9LAp4TTpmdW5j
-dGlvbihhLGIsYyxkLGUsZil7aWYoQy5qbi56WShmLDQpIT09MCl0aHJvdyBILmIoUC5ycigiSW52YWxp
-ZCBiYXNlNjQgcGFkZGluZywgcGFkZGVkIGxlbmd0aCBtdXN0IGJlIG11bHRpcGxlIG9mIGZvdXIsIGlz
-ICIrZixhLGMpKQppZihkK2UhPT1mKXRocm93IEguYihQLnJyKCJJbnZhbGlkIGJhc2U2NCBwYWRkaW5n
-LCAnPScgbm90IGF0IHRoZSBlbmQiLGEsYikpCmlmKGU+Mil0aHJvdyBILmIoUC5ycigiSW52YWxpZCBi
-YXNlNjQgcGFkZGluZywgbW9yZSB0aGFuIHR3byAnPScgY2hhcmFjdGVycyIsYSxiKSl9LApHeTpmdW5j
-dGlvbihhLGIsYyl7cmV0dXJuIG5ldyBQLlVkKGEsYil9LApOQzpmdW5jdGlvbihhKXtyZXR1cm4gYS5M
-dCgpfSwKVWc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFAudHUoYSxbXSxQLkN5KCkpfSwKdVg6ZnVu
-Y3Rpb24oYSxiLGMpe3ZhciBzLHI9bmV3IFAuUm4oIiIpLHE9UC5VZyhyLGIpCnEuaVUoYSkKcz1yLmEK
-cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LApqNDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2Fz
-ZSA2NTpyZXR1cm4iTWlzc2luZyBleHRlbnNpb24gYnl0ZSIKY2FzZSA2NzpyZXR1cm4iVW5leHBlY3Rl
-ZCBleHRlbnNpb24gYnl0ZSIKY2FzZSA2OTpyZXR1cm4iSW52YWxpZCBVVEYtOCBieXRlIgpjYXNlIDcx
-OnJldHVybiJPdmVybG9uZyBlbmNvZGluZyIKY2FzZSA3MzpyZXR1cm4iT3V0IG9mIHVuaWNvZGUgcmFu
-Z2UiCmNhc2UgNzU6cmV0dXJuIkVuY29kZWQgc3Vycm9nYXRlIgpjYXNlIDc3OnJldHVybiJVbmZpbmlz
-aGVkIFVURi04IG9jdGV0IHNlcXVlbmNlIgpkZWZhdWx0OnJldHVybiIifX0sCmp5OmZ1bmN0aW9uKGEs
-YixjKXt2YXIgcyxyLHEscD1jLWIsbz1uZXcgVWludDhBcnJheShwKQpmb3Iocz1KLlU2KGEpLHI9MDty
-PHA7KytyKXtxPXMucShhLGIrcikKaWYodHlwZW9mIHEhPT0ibnVtYmVyIilyZXR1cm4gcS56TSgpCmlm
-KChxJjQyOTQ5NjcwNDApPj4+MCE9PTApcT0yNTUKaWYocj49cClyZXR1cm4gSC5PSChvLHIpCm9bcl09
-cX1yZXR1cm4gb30sCnV3OmZ1bmN0aW9uIHV3KGEsYil7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPW51
-bGx9LAppODpmdW5jdGlvbiBpOChhKXt0aGlzLmE9YX0sCnBnOmZ1bmN0aW9uIHBnKCl7fSwKYzI6ZnVu
-Y3Rpb24gYzIoKXt9LApDVjpmdW5jdGlvbiBDVigpe30sClU4OmZ1bmN0aW9uIFU4KCl7fSwKVWs6ZnVu
-Y3Rpb24gVWsoKXt9LAp3STpmdW5jdGlvbiB3SSgpe30sClppOmZ1bmN0aW9uIFppKCl7fSwKVWQ6ZnVu
-Y3Rpb24gVWQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCks4OmZ1bmN0aW9uIEs4KGEsYil7dGhpcy5h
-PWEKdGhpcy5iPWJ9LApieTpmdW5jdGlvbiBieSgpe30sCm9qOmZ1bmN0aW9uIG9qKGEpe3RoaXMuYj1h
-fSwKTXg6ZnVuY3Rpb24gTXgoYSl7dGhpcy5hPWF9LApTaDpmdW5jdGlvbiBTaCgpe30sCnRpOmZ1bmN0
-aW9uIHRpKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp0dTpmdW5jdGlvbiB0dShhLGIsYyl7dGhpcy5j
-PWEKdGhpcy5hPWIKdGhpcy5iPWN9LAp1NTpmdW5jdGlvbiB1NSgpe30sCkUzOmZ1bmN0aW9uIEUzKCl7
-fSwKUnc6ZnVuY3Rpb24gUncoYSl7dGhpcy5iPTAKdGhpcy5jPWF9LApHWTpmdW5jdGlvbiBHWShhKXt0
-aGlzLmE9YX0sCmJ6OmZ1bmN0aW9uIGJ6KGEpe3RoaXMuYT1hCnRoaXMuYj0xNgp0aGlzLmM9MH0sClFB
-OmZ1bmN0aW9uKGEsYil7dmFyIHM9SC5IcChhLGIpCmlmKHMhPW51bGwpcmV0dXJuIHMKdGhyb3cgSC5i
-KFAucnIoYSxudWxsLG51bGwpKX0sCm9zOmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBILlRwKXJl
-dHVybiBhLncoMCkKcmV0dXJuIkluc3RhbmNlIG9mICciK0guRWooSC5NKGEpKSsiJyJ9LApPODpmdW5j
-dGlvbihhLGIsYyxkKXt2YXIgcyxyPWM/Si5LaChhLGQpOkouUWkoYSxkKQppZihhIT09MCYmYiE9bnVs
-bClmb3Iocz0wO3M8ci5sZW5ndGg7KytzKXJbc109YgpyZXR1cm4gcn0sCkNIOmZ1bmN0aW9uKGEsYixj
-KXt2YXIgcyxyPUguVk0oW10sYy5DKCJqZDwwPiIpKQpmb3Iocz1KLklUKGEpO3MuRigpOylDLk5tLmko
-cixjLmEocy5nbCgpKSkKaWYoYilyZXR1cm4gcgpyZXR1cm4gSi5FcChyLGMpfSwKZEg6ZnVuY3Rpb24o
-YSxiLGMpe3ZhciBzLHI9Si5LaChhLGMpCmZvcihzPTA7czxhOysrcylDLk5tLlkocixzLGIuJDEocykp
-CnJldHVybiByfSwKQUY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi56QyhQLkNIKGEsITEsYikpfSwKSE06
-ZnVuY3Rpb24oYSxiLGMpe2lmKHQuYm0uYihhKSlyZXR1cm4gSC5mdyhhLGIsUC5qQihiLGMsYS5sZW5n
-dGgpKQpyZXR1cm4gUC5idyhhLGIsYyl9LApPbzpmdW5jdGlvbihhKXtyZXR1cm4gSC5MdyhhKX0sCmJ3
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG49bnVsbAppZihiPDApdGhyb3cgSC5iKFAuVEUo
-YiwwLGEubGVuZ3RoLG4sbikpCnM9Yz09bnVsbAppZighcyYmYzxiKXRocm93IEguYihQLlRFKGMsYixh
-Lmxlbmd0aCxuLG4pKQpyPW5ldyBILmE3KGEsYS5sZW5ndGgsSC56KGEpLkMoImE3PGxELkU+IikpCmZv
-cihxPTA7cTxiOysrcSlpZighci5GKCkpdGhyb3cgSC5iKFAuVEUoYiwwLHEsbixuKSkKcD1bXQppZihz
-KWZvcig7ci5GKCk7KXtvPXIuZApwLnB1c2gobyl9ZWxzZSBmb3IocT1iO3E8YzsrK3Epe2lmKCFyLkYo
-KSl0aHJvdyBILmIoUC5URShjLGIscSxuLG4pKQpvPXIuZApwLnB1c2gobyl9cmV0dXJuIEguZVQocCl9
-LApudTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguVlIoYSxILnY0KGEsITEsITAsITEsITEsITEpKX0s
-CnZnOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1KLklUKGIpCmlmKCFzLkYoKSlyZXR1cm4gYQppZihjLmxl
-bmd0aD09PTApe2RvIGErPUguRWoocy5nbCgpKQp3aGlsZShzLkYoKSl9ZWxzZXthKz1ILkVqKHMuZ2wo
-KSkKZm9yKDtzLkYoKTspYT1hK2MrSC5FaihzLmdsKCkpfXJldHVybiBhfSwKbHI6ZnVuY3Rpb24oYSxi
-LGMsZCl7cmV0dXJuIG5ldyBQLm1wKGEsYixjLGQpfSwKdW86ZnVuY3Rpb24oKXt2YXIgcz1ILk0wKCkK
-aWYocyE9bnVsbClyZXR1cm4gUC5oSyhzKQp0aHJvdyBILmIoUC5MNCgiJ1VyaS5iYXNlJyBpcyBub3Qg
-c3VwcG9ydGVkIikpfSwKZVA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG09IjAxMjM0
-NTY3ODlBQkNERUYiCmlmKGM9PT1DLnhNKXtzPSQuejQoKS5iCmlmKHR5cGVvZiBiIT0ic3RyaW5nIilI
-LnYoSC50TChiKSkKcz1zLnRlc3QoYil9ZWxzZSBzPSExCmlmKHMpcmV0dXJuIGIKSC5MaChjKS5DKCJV
-ay5TIikuYShiKQpyPWMuZ1pFKCkuV0ooYikKZm9yKHM9ci5sZW5ndGgscT0wLHA9IiI7cTxzOysrcSl7
-bz1yW3FdCmlmKG88MTI4KXtuPW8+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goYSxuKQpuPShhW25dJjE8
-PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihuKXArPUguTHcobykKZWxzZSBwPWQmJm89PT0zMj9wKyIr
-IjpwKyIlIittW28+Pj40JjE1XSttW28mMTVdfXJldHVybiBwLmNoYXJDb2RlQXQoMCk9PTA/cDpwfSwK
-R3E6ZnVuY3Rpb24oYSl7dmFyIHM9TWF0aC5hYnMoYSkscj1hPDA/Ii0iOiIiCmlmKHM+PTEwMDApcmV0
-dXJuIiIrYQppZihzPj0xMDApcmV0dXJuIHIrIjAiK3MKaWYocz49MTApcmV0dXJuIHIrIjAwIitzCnJl
-dHVybiByKyIwMDAiK3N9LApWeDpmdW5jdGlvbihhKXtpZihhPj0xMDApcmV0dXJuIiIrYQppZihhPj0x
-MClyZXR1cm4iMCIrYQpyZXR1cm4iMDAiK2F9LApoMDpmdW5jdGlvbihhKXtpZihhPj0xMClyZXR1cm4i
-IithCnJldHVybiIwIithfSwKaGw6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIifHxILmwo
-YSl8fG51bGw9PWEpcmV0dXJuIEouaihhKQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIEpTT04u
-c3RyaW5naWZ5KGEpCnJldHVybiBQLm9zKGEpfSwKaFY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkM2
-KGEpfSwKeFk6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLnUoITEsbnVsbCxudWxsLGEpfSwKTDM6ZnVu
-Y3Rpb24oYSxiLGMpe3JldHVybiBuZXcgUC51KCEwLGEsYixjKX0sClVJOmZ1bmN0aW9uKGEsYixjKXtp
-ZihhPT1udWxsKXRocm93IEguYihuZXcgUC51KCExLG51bGwsYiwiTXVzdCBub3QgYmUgbnVsbCIpKQpy
-ZXR1cm4gYX0sCk83OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLmJKKG51bGwsbnVsbCwhMCxhLGIs
-IlZhbHVlIG5vdCBpbiByYW5nZSIpfSwKVEU6ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gbmV3IFAu
-YkooYixjLCEwLGEsZCwiSW52YWxpZCB2YWx1ZSIpfSwKd0E6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYTxi
-fHxhPmMpdGhyb3cgSC5iKFAuVEUoYSxiLGMsZCxudWxsKSkKcmV0dXJuIGF9LApqQjpmdW5jdGlvbihh
-LGIsYyl7aWYoMD5hfHxhPmMpdGhyb3cgSC5iKFAuVEUoYSwwLGMsInN0YXJ0IixudWxsKSkKaWYoYiE9
-bnVsbCl7aWYoYT5ifHxiPmMpdGhyb3cgSC5iKFAuVEUoYixhLGMsImVuZCIsbnVsbCkpCnJldHVybiBi
-fXJldHVybiBjfSwKazE6ZnVuY3Rpb24oYSxiKXtpZihhPDApdGhyb3cgSC5iKFAuVEUoYSwwLG51bGws
-YixudWxsKSkKcmV0dXJuIGF9LApDZjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzPUgudVAoZT09bnVs
-bD9KLkhtKGIpOmUpCnJldHVybiBuZXcgUC5lWShzLCEwLGEsYywiSW5kZXggb3V0IG9mIHJhbmdlIil9
-LApMNDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAudWIoYSl9LApTWTpmdW5jdGlvbihhKXtyZXR1cm4g
-bmV3IFAuZHMoYSl9LApQVjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAubGooYSl9LAphNDpmdW5jdGlv
-bihhKXtyZXR1cm4gbmV3IFAuVVYoYSl9LApycjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBQLmFF
-KGEsYixjKX0sCmhLOmZ1bmN0aW9uKGE1KXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUs
-ZCxjLGIsYSxhMCxhMSxhMixhMz1udWxsLGE0PWE1Lmxlbmd0aAppZihhND49NSl7cz0oKEouUXooYTUs
-NCleNTgpKjN8Qy54Qi5XKGE1LDApXjEwMHxDLnhCLlcoYTUsMSleOTd8Qy54Qi5XKGE1LDIpXjExNnxD
-LnhCLlcoYTUsMyleOTcpPj4+MAppZihzPT09MClyZXR1cm4gUC5LRChhNDxhND9DLnhCLk5qKGE1LDAs
-YTQpOmE1LDUsYTMpLmdsUigpCmVsc2UgaWYocz09PTMyKXJldHVybiBQLktEKEMueEIuTmooYTUsNSxh
-NCksMCxhMykuZ2xSKCl9cj1QLk84KDgsMCwhMSx0LlMpCkMuTm0uWShyLDAsMCkKQy5ObS5ZKHIsMSwt
-MSkKQy5ObS5ZKHIsMiwtMSkKQy5ObS5ZKHIsNywtMSkKQy5ObS5ZKHIsMywwKQpDLk5tLlkociw0LDAp
-CkMuTm0uWShyLDUsYTQpCkMuTm0uWShyLDYsYTQpCmlmKFAuVUIoYTUsMCxhNCwwLHIpPj0xNClDLk5t
-Llkociw3LGE0KQpxPXJbMV0KaWYocT49MClpZihQLlVCKGE1LDAscSwyMCxyKT09PTIwKXJbN109cQpw
-PXJbMl0rMQpvPXJbM10Kbj1yWzRdCm09cls1XQpsPXJbNl0KaWYobDxtKW09bAppZihuPHApbj1tCmVs
-c2UgaWYobjw9cSluPXErMQppZihvPHApbz1uCms9cls3XTwwCmlmKGspaWYocD5xKzMpe2o9YTMKaz0h
-MX1lbHNle2k9bz4wCmlmKGkmJm8rMT09PW4pe2o9YTMKaz0hMX1lbHNle2lmKCEobTxhNCYmbT09PW4r
-MiYmSi5xMChhNSwiLi4iLG4pKSloPW0+bisyJiZKLnEwKGE1LCIvLi4iLG0tMykKZWxzZSBoPSEwCmlm
-KGgpe2o9YTMKaz0hMX1lbHNle2lmKHE9PT00KWlmKEoucTAoYTUsImZpbGUiLDApKXtpZihwPD0wKXtp
-ZighQy54Qi5RaShhNSwiLyIsbikpe2c9ImZpbGU6Ly8vIgpzPTN9ZWxzZXtnPSJmaWxlOi8vIgpzPTJ9
-YTU9ZytDLnhCLk5qKGE1LG4sYTQpCnEtPTAKaT1zLTAKbSs9aQpsKz1pCmE0PWE1Lmxlbmd0aApwPTcK
-bz03Cm49N31lbHNlIGlmKG49PT1tKXsrK2wKZj1tKzEKYTU9Qy54Qi5pNyhhNSxuLG0sIi8iKTsrK2E0
-Cm09Zn1qPSJmaWxlIn1lbHNlIGlmKEMueEIuUWkoYTUsImh0dHAiLDApKXtpZihpJiZvKzM9PT1uJiZD
-LnhCLlFpKGE1LCI4MCIsbysxKSl7bC09MwplPW4tMwptLT0zCmE1PUMueEIuaTcoYTUsbyxuLCIiKQph
-NC09MwpuPWV9aj0iaHR0cCJ9ZWxzZSBqPWEzCmVsc2UgaWYocT09PTUmJkoucTAoYTUsImh0dHBzIiww
-KSl7aWYoaSYmbys0PT09biYmSi5xMChhNSwiNDQzIixvKzEpKXtsLT00CmU9bi00Cm0tPTQKYTU9Si5k
-ZyhhNSxvLG4sIiIpCmE0LT0zCm49ZX1qPSJodHRwcyJ9ZWxzZSBqPWEzCms9ITB9fX1lbHNlIGo9YTMK
-aWYoayl7aT1hNS5sZW5ndGgKaWYoYTQ8aSl7YTU9Si5sZChhNSwwLGE0KQpxLT0wCnAtPTAKby09MApu
-LT0wCm0tPTAKbC09MH1yZXR1cm4gbmV3IFAuVWYoYTUscSxwLG8sbixtLGwsail9aWYoaj09bnVsbClp
-ZihxPjApaj1QLlBpKGE1LDAscSkKZWxzZXtpZihxPT09MCl7UC5SMyhhNSwwLCJJbnZhbGlkIGVtcHR5
-IHNjaGVtZSIpCkguQmkodS5nKX1qPSIifWlmKHA+MCl7ZD1xKzMKYz1kPHA/UC56UihhNSxkLHAtMSk6
-IiIKYj1QLk9lKGE1LHAsbywhMSkKaT1vKzEKaWYoaTxuKXthPUguSHAoSi5sZChhNSxpLG4pLGEzKQph
-MD1QLndCKGE9PW51bGw/SC52KFAucnIoIkludmFsaWQgcG9ydCIsYTUsaSkpOmEsail9ZWxzZSBhMD1h
-M31lbHNle2EwPWEzCmI9YTAKYz0iIn1hMT1QLmthKGE1LG4sbSxhMyxqLGIhPW51bGwpCmEyPW08bD9Q
-LmxlKGE1LG0rMSxsLGEzKTphMwpyZXR1cm4gbmV3IFAuRG4oaixjLGIsYTAsYTEsYTIsbDxhND9QLnRH
-KGE1LGwrMSxhNCk6YTMpfSwKTXQ6ZnVuY3Rpb24oYSl7SC5oKGEpCnJldHVybiBQLmt1KGEsMCxhLmxl
-bmd0aCxDLnhNLCExKX0sCldYOmZ1bmN0aW9uKGEpe3ZhciBzPXQuTgpyZXR1cm4gQy5ObS5OMChILlZN
-KGEuc3BsaXQoIiYiKSx0LnMpLFAuRmwocyxzKSxuZXcgUC5uMShDLnhNKSx0LkopfSwKSGg6ZnVuY3Rp
-b24oYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtPSJJUHY0IGFkZHJlc3Mgc2hvdWxkIGNvbnRhaW4gZXhh
-Y3RseSA0IHBhcnRzIixsPSJlYWNoIHBhcnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMC4uMjU1IixrPW5l
-dyBQLmNTKGEpLGo9bmV3IFVpbnQ4QXJyYXkoNCkKZm9yKHM9YixyPXMscT0wO3M8YzsrK3Mpe3A9Qy54
-Qi5PMihhLHMpCmlmKHAhPT00Nil7aWYoKHBeNDgpPjkpay4kMigiaW52YWxpZCBjaGFyYWN0ZXIiLHMp
-fWVsc2V7aWYocT09PTMpay4kMihtLHMpCm89UC5RQShDLnhCLk5qKGEscixzKSxudWxsKQppZihvPjI1
-NSlrLiQyKGwscikKbj1xKzEKaWYocT49NClyZXR1cm4gSC5PSChqLHEpCmpbcV09bwpyPXMrMQpxPW59
-fWlmKHEhPT0zKWsuJDIobSxjKQpvPVAuUUEoQy54Qi5OaihhLHIsYyksbnVsbCkKaWYobz4yNTUpay4k
-MihsLHIpCmlmKHE+PTQpcmV0dXJuIEguT0goaixxKQpqW3FdPW8KcmV0dXJuIGp9LAplZzpmdW5jdGlv
-bihhLGIsYTApe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkPW5ldyBQLlZDKGEpLGM9
-bmV3IFAuSlQoZCxhKQppZihhLmxlbmd0aDwyKWQuJDEoImFkZHJlc3MgaXMgdG9vIHNob3J0IikKcz1I
-LlZNKFtdLHQuYSkKZm9yKHI9YixxPXIscD0hMSxvPSExO3I8YTA7KytyKXtuPUMueEIuTzIoYSxyKQpp
-ZihuPT09NTgpe2lmKHI9PT1iKXsrK3IKaWYoQy54Qi5PMihhLHIpIT09NTgpZC4kMigiaW52YWxpZCBz
-dGFydCBjb2xvbi4iLHIpCnE9cn1pZihyPT09cSl7aWYocClkLiQyKCJvbmx5IG9uZSB3aWxkY2FyZCBg
-OjpgIGlzIGFsbG93ZWQiLHIpCkMuTm0uaShzLC0xKQpwPSEwfWVsc2UgQy5ObS5pKHMsYy4kMihxLHIp
-KQpxPXIrMX1lbHNlIGlmKG49PT00NilvPSEwfWlmKHMubGVuZ3RoPT09MClkLiQxKCJ0b28gZmV3IHBh
-cnRzIikKbT1xPT09YTAKbD1DLk5tLmdyWihzKQppZihtJiZsIT09LTEpZC4kMigiZXhwZWN0ZWQgYSBw
-YXJ0IGFmdGVyIGxhc3QgYDpgIixhMCkKaWYoIW0paWYoIW8pQy5ObS5pKHMsYy4kMihxLGEwKSkKZWxz
-ZXtrPVAuSGgoYSxxLGEwKQpDLk5tLmkocywoa1swXTw8OHxrWzFdKT4+PjApCkMuTm0uaShzLChrWzJd
-PDw4fGtbM10pPj4+MCl9aWYocCl7aWYocy5sZW5ndGg+NylkLiQxKCJhbiBhZGRyZXNzIHdpdGggYSB3
-aWxkY2FyZCBtdXN0IGhhdmUgbGVzcyB0aGFuIDcgcGFydHMiKX1lbHNlIGlmKHMubGVuZ3RoIT09OClk
-LiQxKCJhbiBhZGRyZXNzIHdpdGhvdXQgYSB3aWxkY2FyZCBtdXN0IGNvbnRhaW4gZXhhY3RseSA4IHBh
-cnRzIikKaj1uZXcgVWludDhBcnJheSgxNikKZm9yKGw9cy5sZW5ndGgsaT05LWwscj0wLGg9MDtyPGw7
-KytyKXtnPXNbcl0KaWYoZz09PS0xKWZvcihmPTA7ZjxpOysrZil7aWYoaDwwfHxoPj0xNilyZXR1cm4g
-SC5PSChqLGgpCmpbaF09MAplPWgrMQppZihlPj0xNilyZXR1cm4gSC5PSChqLGUpCmpbZV09MApoKz0y
-fWVsc2V7ZT1DLmpuLndHKGcsOCkKaWYoaDwwfHxoPj0xNilyZXR1cm4gSC5PSChqLGgpCmpbaF09ZQpl
-PWgrMQppZihlPj0xNilyZXR1cm4gSC5PSChqLGUpCmpbZV09ZyYyNTUKaCs9Mn19cmV0dXJuIGp9LApL
-TDpmdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgcyxyLHEscCxvLG4KZj1mPT1udWxsPyIiOlAuUGko
-ZiwwLGYubGVuZ3RoKQpnPVAuelIoZywwLGc9PW51bGw/MDpnLmxlbmd0aCkKYT1QLk9lKGEsMCxhPT1u
-dWxsPzA6YS5sZW5ndGgsITEpCnM9UC5sZShudWxsLDAsMCxlKQpyPVAudEcobnVsbCwwLDApCmQ9UC53
-QihkLGYpCnE9Zj09PSJmaWxlIgppZihhPT1udWxsKXA9Zy5sZW5ndGghPT0wfHxkIT1udWxsfHxxCmVs
-c2UgcD0hMQppZihwKWE9IiIKcD1hPT1udWxsCm89IXAKYj1QLmthKGIsMCxiPT1udWxsPzA6Yi5sZW5n
-dGgsYyxmLG8pCm49Zi5sZW5ndGg9PT0wCmlmKG4mJnAmJiFDLnhCLm4oYiwiLyIpKWI9UC53RihiLCFu
-fHxvKQplbHNlIGI9UC54ZShiKQpyZXR1cm4gbmV3IFAuRG4oZixnLHAmJkMueEIubihiLCIvLyIpPyIi
-OmEsZCxiLHMscil9LAp3SzpmdW5jdGlvbihhKXtpZihhPT09Imh0dHAiKXJldHVybiA4MAppZihhPT09
-Imh0dHBzIilyZXR1cm4gNDQzCnJldHVybiAwfSwKUjM6ZnVuY3Rpb24oYSxiLGMpe3Rocm93IEguYihQ
-LnJyKGMsYSxiKSl9LApYZDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixp
-LGg9bnVsbCxnPWIubGVuZ3RoCmlmKGchPT0wKXtxPTAKd2hpbGUoITApe2lmKCEocTxnKSl7cz0iIgpy
-PTAKYnJlYWt9aWYoQy54Qi5XKGIscSk9PT02NCl7cz1DLnhCLk5qKGIsMCxxKQpyPXErMQpicmVha30r
-K3F9aWYocjxnJiZDLnhCLlcoYixyKT09PTkxKXtmb3IocD1yLG89LTE7cDxnOysrcCl7bj1DLnhCLlco
-YixwKQppZihuPT09MzcmJm88MCl7bT1DLnhCLlFpKGIsIjI1IixwKzEpP3ArMjpwCm89cApwPW19ZWxz
-ZSBpZihuPT09OTMpYnJlYWt9aWYocD09PWcpdGhyb3cgSC5iKFAucnIoIkludmFsaWQgSVB2NiBob3N0
-IGVudHJ5LiIsYixyKSkKbD1vPDA/cDpvClAuZWcoYixyKzEsbCk7KytwCmlmKHAhPT1nJiZDLnhCLlco
-YixwKSE9PTU4KXRocm93IEguYihQLnJyKCJJbnZhbGlkIGVuZCBvZiBhdXRob3JpdHkiLGIscCkpfWVs
-c2UgcD1yCndoaWxlKCEwKXtpZighKHA8Zykpe2s9aApicmVha31pZihDLnhCLlcoYixwKT09PTU4KXtq
-PUMueEIuRyhiLHArMSkKaz1qLmxlbmd0aCE9PTA/UC5RQShqLGgpOmgKYnJlYWt9KytwfWk9Qy54Qi5O
-aihiLHIscCl9ZWxzZXtrPWgKaT1rCnM9IiJ9cmV0dXJuIFAuS0woaSxoLEguVk0oYy5zcGxpdCgiLyIp
-LHQucyksayxkLGEscyl9LAprRTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8KZm9yKHM9YS5sZW5n
-dGgscj0wO3I8czsrK3Ipe3E9YVtyXQpxLnRvU3RyaW5nCnA9Si5VNihxKQpvPXAuZ0EocSkKaWYoMD5v
-KUgudihQLlRFKDAsMCxwLmdBKHEpLG51bGwsbnVsbCkpCmlmKEguU1EocSwiLyIsMCkpe3M9UC5MNCgi
-SWxsZWdhbCBwYXRoIGNoYXJhY3RlciAiK0guRWoocSkpCnRocm93IEguYihzKX19fSwKSE46ZnVuY3Rp
-b24oYSxiLGMpe3ZhciBzLHIscQpmb3Iocz1ILnFDKGEsYyxudWxsLEgudDYoYSkuYykscz1uZXcgSC5h
-NyhzLHMuZ0Eocykscy4kdGkuQygiYTc8YUwuRT4iKSk7cy5GKCk7KXtyPXMuZApxPVAubnUoJ1siKi86
-PD4/XFxcXHxdJykKci50b1N0cmluZwppZihILlNRKHIscSwwKSl7cz1QLkw0KCJJbGxlZ2FsIGNoYXJh
-Y3RlciBpbiBwYXRoOiAiK3IpCnRocm93IEguYihzKX19fSwKcmc6ZnVuY3Rpb24oYSxiKXt2YXIgcwpp
-ZighKDY1PD1hJiZhPD05MCkpcz05Nzw9YSYmYTw9MTIyCmVsc2Ugcz0hMAppZihzKXJldHVybgpzPVAu
-TDQoIklsbGVnYWwgZHJpdmUgbGV0dGVyICIrUC5PbyhhKSkKdGhyb3cgSC5iKHMpfSwKd0I6ZnVuY3Rp
-b24oYSxiKXtpZihhIT1udWxsJiZhPT09UC53SyhiKSlyZXR1cm4gbnVsbApyZXR1cm4gYX0sCk9lOmZ1
-bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxwLG8sbgppZihhPT1udWxsKXJldHVybiBudWxsCmlmKGI9
-PT1jKXJldHVybiIiCmlmKEMueEIuTzIoYSxiKT09PTkxKXtzPWMtMQppZihDLnhCLk8yKGEscykhPT05
-Myl7UC5SMyhhLGIsIk1pc3NpbmcgZW5kIGBdYCB0byBtYXRjaCBgW2AgaW4gaG9zdCIpCkguQmkodS5n
-KX1yPWIrMQpxPVAudG8oYSxyLHMpCmlmKHE8cyl7cD1xKzEKbz1QLk9BKGEsQy54Qi5RaShhLCIyNSIs
-cCk/cSszOnAscywiJTI1Iil9ZWxzZSBvPSIiClAuZWcoYSxyLHEpCnJldHVybiBDLnhCLk5qKGEsYixx
-KS50b0xvd2VyQ2FzZSgpK28rIl0ifWZvcihuPWI7bjxjOysrbilpZihDLnhCLk8yKGEsbik9PT01OCl7
-cT1DLnhCLlhVKGEsIiUiLGIpCnE9cT49YiYmcTxjP3E6YwppZihxPGMpe3A9cSsxCm89UC5PQShhLEMu
-eEIuUWkoYSwiMjUiLHApP3ErMzpwLGMsIiUyNSIpfWVsc2Ugbz0iIgpQLmVnKGEsYixxKQpyZXR1cm4i
-WyIrQy54Qi5OaihhLGIscSkrbysiXSJ9cmV0dXJuIFAuT0woYSxiLGMpfSwKdG86ZnVuY3Rpb24oYSxi
-LGMpe3ZhciBzPUMueEIuWFUoYSwiJSIsYikKcmV0dXJuIHM+PWImJnM8Yz9zOmN9LApPQTpmdW5jdGlv
-bihhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpPWQhPT0iIj9uZXcgUC5SbihkKTpudWxs
-CmZvcihzPWIscj1zLHE9ITA7czxjOyl7cD1DLnhCLk8yKGEscykKaWYocD09PTM3KXtvPVAucnYoYSxz
-LCEwKQpuPW89PW51bGwKaWYobiYmcSl7cys9Mwpjb250aW51ZX1pZihpPT1udWxsKWk9bmV3IFAuUm4o
-IiIpCm09aS5hKz1DLnhCLk5qKGEscixzKQppZihuKW89Qy54Qi5OaihhLHMscyszKQplbHNlIGlmKG89
-PT0iJSIpe1AuUjMoYSxzLCJab25lSUQgc2hvdWxkIG5vdCBjb250YWluICUgYW55bW9yZSIpCkguQmko
-dS5nKX1pLmE9bStvCnMrPTMKcj1zCnE9ITB9ZWxzZXtpZihwPDEyNyl7bj1wPj4+NAppZihuPj04KXJl
-dHVybiBILk9IKEMuRjMsbikKbj0oQy5GM1tuXSYxPDwocCYxNSkpIT09MH1lbHNlIG49ITEKaWYobil7
-aWYocSYmNjU8PXAmJjkwPj1wKXtpZihpPT1udWxsKWk9bmV3IFAuUm4oIiIpCmlmKHI8cyl7aS5hKz1D
-LnhCLk5qKGEscixzKQpyPXN9cT0hMX0rK3N9ZWxzZXtpZigocCY2NDUxMik9PT01NTI5NiYmcysxPGMp
-e2w9Qy54Qi5PMihhLHMrMSkKaWYoKGwmNjQ1MTIpPT09NTYzMjApe3A9KHAmMTAyMyk8PDEwfGwmMTAy
-M3w2NTUzNgprPTJ9ZWxzZSBrPTF9ZWxzZSBrPTEKaj1DLnhCLk5qKGEscixzKQppZihpPT1udWxsKXtp
-PW5ldyBQLlJuKCIiKQpuPWl9ZWxzZSBuPWkKbi5hKz1qCm4uYSs9UC56WChwKQpzKz1rCnI9c319fWlm
-KGk9PW51bGwpcmV0dXJuIEMueEIuTmooYSxiLGMpCmlmKHI8YylpLmErPUMueEIuTmooYSxyLGMpCm49
-aS5hCnJldHVybiBuLmNoYXJDb2RlQXQoMCk9PTA/bjpufSwKT0w6ZnVuY3Rpb24oYSxiLGMpe3ZhciBz
-LHIscSxwLG8sbixtLGwsayxqLGkKZm9yKHM9YixyPXMscT1udWxsLHA9ITA7czxjOyl7bz1DLnhCLk8y
-KGEscykKaWYobz09PTM3KXtuPVAucnYoYSxzLCEwKQptPW49PW51bGwKaWYobSYmcCl7cys9Mwpjb250
-aW51ZX1pZihxPT1udWxsKXE9bmV3IFAuUm4oIiIpCmw9Qy54Qi5OaihhLHIscykKaz1xLmErPSFwP2wu
-dG9Mb3dlckNhc2UoKTpsCmlmKG0pe249Qy54Qi5OaihhLHMscyszKQpqPTN9ZWxzZSBpZihuPT09IiUi
-KXtuPSIlMjUiCmo9MX1lbHNlIGo9MwpxLmE9aytuCnMrPWoKcj1zCnA9ITB9ZWxzZXtpZihvPDEyNyl7
-bT1vPj4+NAppZihtPj04KXJldHVybiBILk9IKEMuZWEsbSkKbT0oQy5lYVttXSYxPDwobyYxNSkpIT09
-MH1lbHNlIG09ITEKaWYobSl7aWYocCYmNjU8PW8mJjkwPj1vKXtpZihxPT1udWxsKXE9bmV3IFAuUm4o
-IiIpCmlmKHI8cyl7cS5hKz1DLnhCLk5qKGEscixzKQpyPXN9cD0hMX0rK3N9ZWxzZXtpZihvPD05Myl7
-bT1vPj4+NAppZihtPj04KXJldHVybiBILk9IKEMuYWssbSkKbT0oQy5ha1ttXSYxPDwobyYxNSkpIT09
-MH1lbHNlIG09ITEKaWYobSl7UC5SMyhhLHMsIkludmFsaWQgY2hhcmFjdGVyIikKSC5CaSh1LmcpfWVs
-c2V7aWYoKG8mNjQ1MTIpPT09NTUyOTYmJnMrMTxjKXtpPUMueEIuTzIoYSxzKzEpCmlmKChpJjY0NTEy
-KT09PTU2MzIwKXtvPShvJjEwMjMpPDwxMHxpJjEwMjN8NjU1MzYKaj0yfWVsc2Ugaj0xfWVsc2Ugaj0x
-Cmw9Qy54Qi5OaihhLHIscykKaWYoIXApbD1sLnRvTG93ZXJDYXNlKCkKaWYocT09bnVsbCl7cT1uZXcg
-UC5SbigiIikKbT1xfWVsc2UgbT1xCm0uYSs9bAptLmErPVAuelgobykKcys9agpyPXN9fX19aWYocT09
-bnVsbClyZXR1cm4gQy54Qi5OaihhLGIsYykKaWYocjxjKXtsPUMueEIuTmooYSxyLGMpCnEuYSs9IXA/
-bC50b0xvd2VyQ2FzZSgpOmx9bT1xLmEKcmV0dXJuIG0uY2hhckNvZGVBdCgwKT09MD9tOm19LApQaTpm
-dW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAsbz11LmcKaWYoYj09PWMpcmV0dXJuIiIKaWYoIVAuRXQo
-Si5yWShhKS5XKGEsYikpKXtQLlIzKGEsYiwiU2NoZW1lIG5vdCBzdGFydGluZyB3aXRoIGFscGhhYmV0
-aWMgY2hhcmFjdGVyIikKSC5CaShvKX1mb3Iocz1iLHI9ITE7czxjOysrcyl7cT1DLnhCLlcoYSxzKQpp
-ZihxPDEyOCl7cD1xPj4+NAppZihwPj04KXJldHVybiBILk9IKEMubUsscCkKcD0oQy5tS1twXSYxPDwo
-cSYxNSkpIT09MH1lbHNlIHA9ITEKaWYoIXApe1AuUjMoYSxzLCJJbGxlZ2FsIHNjaGVtZSBjaGFyYWN0
-ZXIiKQpILkJpKG8pfWlmKDY1PD1xJiZxPD05MClyPSEwfWE9Qy54Qi5OaihhLGIsYykKcmV0dXJuIFAu
-WWEocj9hLnRvTG93ZXJDYXNlKCk6YSl9LApZYTpmdW5jdGlvbihhKXtpZihhPT09Imh0dHAiKXJldHVy
-biJodHRwIgppZihhPT09ImZpbGUiKXJldHVybiJmaWxlIgppZihhPT09Imh0dHBzIilyZXR1cm4iaHR0
-cHMiCmlmKGE9PT0icGFja2FnZSIpcmV0dXJuInBhY2thZ2UiCnJldHVybiBhfSwKelI6ZnVuY3Rpb24o
-YSxiLGMpe2lmKGE9PW51bGwpcmV0dXJuIiIKcmV0dXJuIFAuUEkoYSxiLGMsQy50bywhMSl9LAprYTpm
-dW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIHMscixxPWU9PT0iZmlsZSIscD1xfHxmCmlmKGE9PW51bGwp
-e2lmKGQ9PW51bGwpcmV0dXJuIHE/Ii8iOiIiCnM9SC50NihkKQpyPW5ldyBILmxKKGQscy5DKCJxVSgx
-KSIpLmEobmV3IFAuUlooKSkscy5DKCJsSjwxLHFVPiIpKS5IKDAsIi8iKX1lbHNlIGlmKGQhPW51bGwp
-dGhyb3cgSC5iKFAueFkoIkJvdGggcGF0aCBhbmQgcGF0aFNlZ21lbnRzIHNwZWNpZmllZCIpKQplbHNl
-IHI9UC5QSShhLGIsYyxDLldkLCEwKQppZihyLmxlbmd0aD09PTApe2lmKHEpcmV0dXJuIi8ifWVsc2Ug
-aWYocCYmIUMueEIubihyLCIvIikpcj0iLyIrcgpyZXR1cm4gUC5KcihyLGUsZil9LApKcjpmdW5jdGlv
-bihhLGIsYyl7dmFyIHM9Yi5sZW5ndGg9PT0wCmlmKHMmJiFjJiYhQy54Qi5uKGEsIi8iKSlyZXR1cm4g
-UC53RihhLCFzfHxjKQpyZXR1cm4gUC54ZShhKX0sCmxlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHI9
-e30KaWYoYSE9bnVsbCl7aWYoZCE9bnVsbCl0aHJvdyBILmIoUC54WSgiQm90aCBxdWVyeSBhbmQgcXVl
-cnlQYXJhbWV0ZXJzIHNwZWNpZmllZCIpKQpyZXR1cm4gUC5QSShhLGIsYyxDLlZDLCEwKX1pZihkPT1u
-dWxsKXJldHVybiBudWxsCnM9bmV3IFAuUm4oIiIpCnIuYT0iIgpkLksoMCxuZXcgUC55NShuZXcgUC5N
-RShyLHMpKSkKcj1zLmEKcmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9LAp0RzpmdW5jdGlvbihh
-LGIsYyl7aWYoYT09bnVsbClyZXR1cm4gbnVsbApyZXR1cm4gUC5QSShhLGIsYyxDLlZDLCEwKX0sCnJ2
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG49YisyCmlmKG4+PWEubGVuZ3RoKXJldHVybiIl
-IgpzPUMueEIuTzIoYSxiKzEpCnI9Qy54Qi5PMihhLG4pCnE9SC5vbyhzKQpwPUgub28ocikKaWYocTww
-fHxwPDApcmV0dXJuIiUiCm89cSoxNitwCmlmKG88MTI3KXtuPUMuam4ud0cobyw0KQppZihuPj04KXJl
-dHVybiBILk9IKEMuRjMsbikKbj0oQy5GM1tuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEKaWYobily
-ZXR1cm4gSC5MdyhjJiY2NTw9byYmOTA+PW8/KG98MzIpPj4+MDpvKQppZihzPj05N3x8cj49OTcpcmV0
-dXJuIEMueEIuTmooYSxiLGIrMykudG9VcHBlckNhc2UoKQpyZXR1cm4gbnVsbH0sCnpYOmZ1bmN0aW9u
-KGEpe3ZhciBzLHIscSxwLG8sbixtLGwsaz0iMDEyMzQ1Njc4OUFCQ0RFRiIKaWYoYTwxMjgpe3M9bmV3
-IFVpbnQ4QXJyYXkoMykKc1swXT0zNwpzWzFdPUMueEIuVyhrLGE+Pj40KQpzWzJdPUMueEIuVyhrLGEm
-MTUpfWVsc2V7aWYoYT4yMDQ3KWlmKGE+NjU1MzUpe3I9MjQwCnE9NH1lbHNle3I9MjI0CnE9M31lbHNl
-e3I9MTkyCnE9Mn1wPTMqcQpzPW5ldyBVaW50OEFycmF5KHApCmZvcihvPTA7LS1xLHE+PTA7cj0xMjgp
-e249Qy5qbi5iZihhLDYqcSkmNjN8cgppZihvPj1wKXJldHVybiBILk9IKHMsbykKc1tvXT0zNwptPW8r
-MQpsPUMueEIuVyhrLG4+Pj40KQppZihtPj1wKXJldHVybiBILk9IKHMsbSkKc1ttXT1sCmw9bysyCm09
-Qy54Qi5XKGssbiYxNSkKaWYobD49cClyZXR1cm4gSC5PSChzLGwpCnNbbF09bQpvKz0zfX1yZXR1cm4g
-UC5ITShzLDAsbnVsbCl9LApQSTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzPVAuVWwoYSxiLGMsZCxl
-KQpyZXR1cm4gcz09bnVsbD9DLnhCLk5qKGEsYixjKTpzfSwKVWw6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2
-YXIgcyxyLHEscCxvLG4sbSxsLGssaj1udWxsCmZvcihzPSFlLHI9YixxPXIscD1qO3I8Yzspe289Qy54
-Qi5PMihhLHIpCmlmKG88MTI3KXtuPW8+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goZCxuKQpuPShkW25d
-JjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihuKSsrcgplbHNle2lmKG89PT0zNyl7bT1QLnJ2KGEs
-ciwhMSkKaWYobT09bnVsbCl7cis9Mwpjb250aW51ZX1pZigiJSI9PT1tKXttPSIlMjUiCmw9MX1lbHNl
-IGw9M31lbHNle2lmKHMpaWYobzw9OTMpe249bz4+PjQKaWYobj49OClyZXR1cm4gSC5PSChDLmFrLG4p
-Cm49KEMuYWtbbl0mMTw8KG8mMTUpKSE9PTB9ZWxzZSBuPSExCmVsc2Ugbj0hMQppZihuKXtQLlIzKGEs
-ciwiSW52YWxpZCBjaGFyYWN0ZXIiKQpILkJpKHUuZykKbD1qCm09bH1lbHNle2lmKChvJjY0NTEyKT09
-PTU1Mjk2KXtuPXIrMQppZihuPGMpe2s9Qy54Qi5PMihhLG4pCmlmKChrJjY0NTEyKT09PTU2MzIwKXtv
-PShvJjEwMjMpPDwxMHxrJjEwMjN8NjU1MzYKbD0yfWVsc2UgbD0xfWVsc2UgbD0xfWVsc2UgbD0xCm09
-UC56WChvKX19aWYocD09bnVsbCl7cD1uZXcgUC5SbigiIikKbj1wfWVsc2Ugbj1wCm4uYSs9Qy54Qi5O
-aihhLHEscikKbi5hKz1ILkVqKG0pCmlmKHR5cGVvZiBsIT09Im51bWJlciIpcmV0dXJuIEgucFkobCkK
-cis9bApxPXJ9fWlmKHA9PW51bGwpcmV0dXJuIGoKaWYocTxjKXAuYSs9Qy54Qi5OaihhLHEsYykKcz1w
-LmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LAp5QjpmdW5jdGlvbihhKXtpZihDLnhCLm4o
-YSwiLiIpKXJldHVybiEwCnJldHVybiBDLnhCLk9ZKGEsIi8uIikhPT0tMX0sCnhlOmZ1bmN0aW9uKGEp
-e3ZhciBzLHIscSxwLG8sbixtCmlmKCFQLnlCKGEpKXJldHVybiBhCnM9SC5WTShbXSx0LnMpCmZvcihy
-PWEuc3BsaXQoIi8iKSxxPXIubGVuZ3RoLHA9ITEsbz0wO288cTsrK28pe249cltvXQppZihKLlJNKG4s
-Ii4uIikpe209cy5sZW5ndGgKaWYobSE9PTApe2lmKDA+PW0pcmV0dXJuIEguT0gocywtMSkKcy5wb3Ao
-KQppZihzLmxlbmd0aD09PTApQy5ObS5pKHMsIiIpfXA9ITB9ZWxzZSBpZigiLiI9PT1uKXA9ITAKZWxz
-ZXtDLk5tLmkocyxuKQpwPSExfX1pZihwKUMuTm0uaShzLCIiKQpyZXR1cm4gQy5ObS5IKHMsIi8iKX0s
-CndGOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuCmlmKCFQLnlCKGEpKXJldHVybiFiP1AuQzEo
-YSk6YQpzPUguVk0oW10sdC5zKQpmb3Iocj1hLnNwbGl0KCIvIikscT1yLmxlbmd0aCxwPSExLG89MDtv
-PHE7KytvKXtuPXJbb10KaWYoIi4uIj09PW4paWYocy5sZW5ndGghPT0wJiZDLk5tLmdyWihzKSE9PSIu
-LiIpe2lmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcD0hMH1lbHNle0MuTm0u
-aShzLCIuLiIpCnA9ITF9ZWxzZSBpZigiLiI9PT1uKXA9ITAKZWxzZXtDLk5tLmkocyxuKQpwPSExfX1y
-PXMubGVuZ3RoCmlmKHIhPT0wKWlmKHI9PT0xKXtpZigwPj1yKXJldHVybiBILk9IKHMsMCkKcj1zWzBd
-Lmxlbmd0aD09PTB9ZWxzZSByPSExCmVsc2Ugcj0hMAppZihyKXJldHVybiIuLyIKaWYocHx8Qy5ObS5n
-cloocyk9PT0iLi4iKUMuTm0uaShzLCIiKQppZighYil7aWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0go
-cywwKQpDLk5tLlkocywwLFAuQzEoc1swXSkpfXJldHVybiBDLk5tLkgocywiLyIpfSwKQzE6ZnVuY3Rp
-b24oYSl7dmFyIHMscixxLHA9YS5sZW5ndGgKaWYocD49MiYmUC5FdChKLlF6KGEsMCkpKWZvcihzPTE7
-czxwOysrcyl7cj1DLnhCLlcoYSxzKQppZihyPT09NTgpcmV0dXJuIEMueEIuTmooYSwwLHMpKyIlM0Ei
-K0MueEIuRyhhLHMrMSkKaWYocjw9MTI3KXtxPXI+Pj40CmlmKHE+PTgpcmV0dXJuIEguT0goQy5tSyxx
-KQpxPShDLm1LW3FdJjE8PChyJjE1KSk9PT0wfWVsc2UgcT0hMAppZihxKWJyZWFrfXJldHVybiBhfSwK
-bW46ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9YS5nRmooKSxvPXAubGVuZ3RoCmlmKG8+MCYmSi5IbShw
-WzBdKT09PTImJkouYTYocFswXSwxKT09PTU4KXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkKUC5yZyhK
-LmE2KHBbMF0sMCksITEpClAuSE4ocCwhMSwxKQpzPSEwfWVsc2V7UC5ITihwLCExLDApCnM9ITF9cj1h
-Lmd0VCgpJiYhcz8iXFwiOiIiCmlmKGEuZ2NqKCkpe3E9YS5nSmYoYSkKaWYocS5sZW5ndGghPT0wKXI9
-cisiXFwiK3ErIlxcIn1yPVAudmcocixwLCJcXCIpCm89cyYmbz09PTE/cisiXFwiOnIKcmV0dXJuIG8u
-Y2hhckNvZGVBdCgwKT09MD9vOm99LApJaDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscQpmb3Iocz0wLHI9
-MDtyPDI7KytyKXtxPUMueEIuVyhhLGIrcikKaWYoNDg8PXEmJnE8PTU3KXM9cyoxNitxLTQ4CmVsc2V7
-cXw9MzIKaWYoOTc8PXEmJnE8PTEwMilzPXMqMTYrcS04NwplbHNlIHRocm93IEguYihQLnhZKCJJbnZh
-bGlkIFVSTCBlbmNvZGluZyIpKX19cmV0dXJuIHN9LAprdTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBz
-LHIscSxwLG89Si5yWShhKSxuPWIKd2hpbGUoITApe2lmKCEobjxjKSl7cz0hMApicmVha31yPW8uVyhh
-LG4pCmlmKHI8PTEyNylpZihyIT09MzcpcT1lJiZyPT09NDMKZWxzZSBxPSEwCmVsc2UgcT0hMAppZihx
-KXtzPSExCmJyZWFrfSsrbn1pZihzKXtpZihDLnhNIT09ZClxPSExCmVsc2UgcT0hMAppZihxKXJldHVy
-biBvLk5qKGEsYixjKQplbHNlIHA9bmV3IEgucWooby5OaihhLGIsYykpfWVsc2V7cD1ILlZNKFtdLHQu
-YSkKZm9yKG49YjtuPGM7KytuKXtyPW8uVyhhLG4pCmlmKHI+MTI3KXRocm93IEguYihQLnhZKCJJbGxl
-Z2FsIHBlcmNlbnQgZW5jb2RpbmcgaW4gVVJJIikpCmlmKHI9PT0zNyl7aWYobiszPmEubGVuZ3RoKXRo
-cm93IEguYihQLnhZKCJUcnVuY2F0ZWQgVVJJIikpCkMuTm0uaShwLFAuSWgoYSxuKzEpKQpuKz0yfWVs
-c2UgaWYoZSYmcj09PTQzKUMuTm0uaShwLDMyKQplbHNlIEMuTm0uaShwLHIpfX10LkwuYShwKQpyZXR1
-cm4gQy5vRS5XSihwKX0sCkV0OmZ1bmN0aW9uKGEpe3ZhciBzPWF8MzIKcmV0dXJuIDk3PD1zJiZzPD0x
-MjJ9LApLRDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAsbyxuLG0sbCxrPSJJbnZhbGlkIE1JTUUg
-dHlwZSIsaj1ILlZNKFtiLTFdLHQuYSkKZm9yKHM9YS5sZW5ndGgscj1iLHE9LTEscD1udWxsO3I8czsr
-K3Ipe3A9Qy54Qi5XKGEscikKaWYocD09PTQ0fHxwPT09NTkpYnJlYWsKaWYocD09PTQ3KXtpZihxPDAp
-e3E9cgpjb250aW51ZX10aHJvdyBILmIoUC5ycihrLGEscikpfX1pZihxPDAmJnI+Yil0aHJvdyBILmIo
-UC5ycihrLGEscikpCmZvcig7cCE9PTQ0Oyl7Qy5ObS5pKGoscik7KytyCmZvcihvPS0xO3I8czsrK3Ip
-e3A9Qy54Qi5XKGEscikKaWYocD09PTYxKXtpZihvPDApbz1yfWVsc2UgaWYocD09PTU5fHxwPT09NDQp
-YnJlYWt9aWYobz49MClDLk5tLmkoaixvKQplbHNle249Qy5ObS5nclooaikKaWYocCE9PTQ0fHxyIT09
-bis3fHwhQy54Qi5RaShhLCJiYXNlNjQiLG4rMSkpdGhyb3cgSC5iKFAucnIoIkV4cGVjdGluZyAnPSci
-LGEscikpCmJyZWFrfX1DLk5tLmkoaixyKQptPXIrMQppZigoai5sZW5ndGgmMSk9PT0xKWE9Qy5oOS55
-cihhLG0scykKZWxzZXtsPVAuVWwoYSxtLHMsQy5WQywhMCkKaWYobCE9bnVsbClhPUMueEIuaTcoYSxt
-LHMsbCl9cmV0dXJuIG5ldyBQLlBFKGEsaixjKX0sCktOOmZ1bmN0aW9uKCl7dmFyIHM9IjAxMjM0NTY3
-ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LS5ffiEk
-JicoKSorLDs9IixyPSIuIixxPSI6IixwPSIvIixvPSI/IixuPSIjIixtPXQuZ2MsbD1QLmRIKDIyLG5l
-dyBQLnEzKCksbSksaz1uZXcgUC55SShsKSxqPW5ldyBQLmM2KCksaT1uZXcgUC5xZCgpLGg9bS5hKGsu
-JDIoMCwyMjUpKQpqLiQzKGgscywxKQpqLiQzKGgsciwxNCkKai4kMyhoLHEsMzQpCmouJDMoaCxwLDMp
-CmouJDMoaCxvLDE3MikKai4kMyhoLG4sMjA1KQpoPW0uYShrLiQyKDE0LDIyNSkpCmouJDMoaCxzLDEp
-CmouJDMoaCxyLDE1KQpqLiQzKGgscSwzNCkKai4kMyhoLHAsMjM0KQpqLiQzKGgsbywxNzIpCmouJDMo
-aCxuLDIwNSkKaD1tLmEoay4kMigxNSwyMjUpKQpqLiQzKGgscywxKQpqLiQzKGgsIiUiLDIyNSkKai4k
-MyhoLHEsMzQpCmouJDMoaCxwLDkpCmouJDMoaCxvLDE3MikKai4kMyhoLG4sMjA1KQpoPW0uYShrLiQy
-KDEsMjI1KSkKai4kMyhoLHMsMSkKai4kMyhoLHEsMzQpCmouJDMoaCxwLDEwKQpqLiQzKGgsbywxNzIp
-CmouJDMoaCxuLDIwNSkKaD1tLmEoay4kMigyLDIzNSkpCmouJDMoaCxzLDEzOSkKai4kMyhoLHAsMTMx
-KQpqLiQzKGgsciwxNDYpCmouJDMoaCxvLDE3MikKai4kMyhoLG4sMjA1KQpoPW0uYShrLiQyKDMsMjM1
-KSkKai4kMyhoLHMsMTEpCmouJDMoaCxwLDY4KQpqLiQzKGgsciwxOCkKai4kMyhoLG8sMTcyKQpqLiQz
-KGgsbiwyMDUpCmg9bS5hKGsuJDIoNCwyMjkpKQpqLiQzKGgscyw1KQppLiQzKGgsIkFaIiwyMjkpCmou
-JDMoaCxxLDEwMikKai4kMyhoLCJAIiw2OCkKai4kMyhoLCJbIiwyMzIpCmouJDMoaCxwLDEzOCkKai4k
-MyhoLG8sMTcyKQpqLiQzKGgsbiwyMDUpCmg9bS5hKGsuJDIoNSwyMjkpKQpqLiQzKGgscyw1KQppLiQz
-KGgsIkFaIiwyMjkpCmouJDMoaCxxLDEwMikKai4kMyhoLCJAIiw2OCkKai4kMyhoLHAsMTM4KQpqLiQz
-KGgsbywxNzIpCmouJDMoaCxuLDIwNSkKaD1tLmEoay4kMig2LDIzMSkpCmkuJDMoaCwiMTkiLDcpCmou
-JDMoaCwiQCIsNjgpCmouJDMoaCxwLDEzOCkKai4kMyhoLG8sMTcyKQpqLiQzKGgsbiwyMDUpCmg9bS5h
-KGsuJDIoNywyMzEpKQppLiQzKGgsIjA5Iiw3KQpqLiQzKGgsIkAiLDY4KQpqLiQzKGgscCwxMzgpCmou
-JDMoaCxvLDE3MikKai4kMyhoLG4sMjA1KQpqLiQzKG0uYShrLiQyKDgsOCkpLCJdIiw1KQpoPW0uYShr
-LiQyKDksMjM1KSkKai4kMyhoLHMsMTEpCmouJDMoaCxyLDE2KQpqLiQzKGgscCwyMzQpCmouJDMoaCxv
-LDE3MikKai4kMyhoLG4sMjA1KQpoPW0uYShrLiQyKDE2LDIzNSkpCmouJDMoaCxzLDExKQpqLiQzKGgs
-ciwxNykKai4kMyhoLHAsMjM0KQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKaD1tLmEoay4kMigx
-NywyMzUpKQpqLiQzKGgscywxMSkKai4kMyhoLHAsOSkKai4kMyhoLG8sMTcyKQpqLiQzKGgsbiwyMDUp
-Cmg9bS5hKGsuJDIoMTAsMjM1KSkKai4kMyhoLHMsMTEpCmouJDMoaCxyLDE4KQpqLiQzKGgscCwyMzQp
-CmouJDMoaCxvLDE3MikKai4kMyhoLG4sMjA1KQpoPW0uYShrLiQyKDE4LDIzNSkpCmouJDMoaCxzLDEx
-KQpqLiQzKGgsciwxOSkKai4kMyhoLHAsMjM0KQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKaD1t
-LmEoay4kMigxOSwyMzUpKQpqLiQzKGgscywxMSkKai4kMyhoLHAsMjM0KQpqLiQzKGgsbywxNzIpCmou
-JDMoaCxuLDIwNSkKaD1tLmEoay4kMigxMSwyMzUpKQpqLiQzKGgscywxMSkKai4kMyhoLHAsMTApCmou
-JDMoaCxvLDE3MikKai4kMyhoLG4sMjA1KQpoPW0uYShrLiQyKDEyLDIzNikpCmouJDMoaCxzLDEyKQpq
-LiQzKGgsbywxMikKai4kMyhoLG4sMjA1KQpoPW0uYShrLiQyKDEzLDIzNykpCmouJDMoaCxzLDEzKQpq
-LiQzKGgsbywxMykKaS4kMyhtLmEoay4kMigyMCwyNDUpKSwiYXoiLDIxKQprPW0uYShrLiQyKDIxLDI0
-NSkpCmkuJDMoaywiYXoiLDIxKQppLiQzKGssIjA5IiwyMSkKai4kMyhrLCIrLS4iLDIxKQpyZXR1cm4g
-bH0sClVCOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHMscixxLHAsbyxuPSQudlooKQpmb3Iocz1KLnJZ
-KGEpLHI9YjtyPGM7KytyKXtuLmxlbmd0aAppZihkPDB8fGQ+PTIyKXJldHVybiBILk9IKG4sZCkKcT1u
-W2RdCnA9cy5XKGEscileOTYKaWYocD45NSlwPTMxCmlmKHA+PXEubGVuZ3RoKXJldHVybiBILk9IKHEs
-cCkKbz1xW3BdCmQ9byYzMQpDLk5tLlkoZSxvPj4+NSxyKX1yZXR1cm4gZH0sCldGOmZ1bmN0aW9uIFdG
-KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAppUDpmdW5jdGlvbiBpUChhLGIpe3RoaXMuYT1hCnRoaXMu
-Yj1ifSwKWFM6ZnVuY3Rpb24gWFMoKXt9LApDNjpmdW5jdGlvbiBDNihhKXt0aGlzLmE9YX0sCkV6OmZ1
-bmN0aW9uIEV6KCl7fSwKRjpmdW5jdGlvbiBGKCl7fSwKdTpmdW5jdGlvbiB1KGEsYixjLGQpe3ZhciBf
-PXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LApiSjpmdW5jdGlvbiBiSihhLGIsYyxkLGUsZil7
-dmFyIF89dGhpcwpfLmU9YQpfLmY9YgpfLmE9YwpfLmI9ZApfLmM9ZQpfLmQ9Zn0sCmVZOmZ1bmN0aW9u
-IGVZKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmY9YQpfLmE9YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCm1w
-OmZ1bmN0aW9uIG1wKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LAp1
-YjpmdW5jdGlvbiB1YihhKXt0aGlzLmE9YX0sCmRzOmZ1bmN0aW9uIGRzKGEpe3RoaXMuYT1hfSwKbGo6
-ZnVuY3Rpb24gbGooYSl7dGhpcy5hPWF9LApVVjpmdW5jdGlvbiBVVihhKXt0aGlzLmE9YX0sCms1OmZ1
-bmN0aW9uIGs1KCl7fSwKS1k6ZnVuY3Rpb24gS1koKXt9LApwOmZ1bmN0aW9uIHAoYSl7dGhpcy5hPWF9
-LApDRDpmdW5jdGlvbiBDRChhKXt0aGlzLmE9YX0sCmFFOmZ1bmN0aW9uIGFFKGEsYixjKXt0aGlzLmE9
-YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCmNYOmZ1bmN0aW9uIGNYKCl7fSwKQW46ZnVuY3Rpb24gQW4oKXt9
-LApOMzpmdW5jdGlvbiBOMyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30sCmM4OmZ1
-bmN0aW9uIGM4KCl7fSwKTWg6ZnVuY3Rpb24gTWgoKXt9LApaZDpmdW5jdGlvbiBaZCgpe30sClJuOmZ1
-bmN0aW9uIFJuKGEpe3RoaXMuYT1hfSwKbjE6ZnVuY3Rpb24gbjEoYSl7dGhpcy5hPWF9LApjUzpmdW5j
-dGlvbiBjUyhhKXt0aGlzLmE9YX0sClZDOmZ1bmN0aW9uIFZDKGEpe3RoaXMuYT1hfSwKSlQ6ZnVuY3Rp
-b24gSlQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkRuOmZ1bmN0aW9uIERuKGEsYixjLGQsZSxmLGcp
-e3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy54PW51
-bGwKXy55PSExCl8uej1udWxsCl8uUT0hMQpfLmNoPW51bGwKXy5jeD0hMQpfLmN5PW51bGwKXy5kYj0h
-MX0sClJaOmZ1bmN0aW9uIFJaKCl7fSwKTUU6ZnVuY3Rpb24gTUUoYSxiKXt0aGlzLmE9YQp0aGlzLmI9
-Yn0sCnk1OmZ1bmN0aW9uIHk1KGEpe3RoaXMuYT1hfSwKUEU6ZnVuY3Rpb24gUEUoYSxiLGMpe3RoaXMu
-YT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKcTM6ZnVuY3Rpb24gcTMoKXt9LAp5STpmdW5jdGlvbiB5SShh
-KXt0aGlzLmE9YX0sCmM2OmZ1bmN0aW9uIGM2KCl7fSwKcWQ6ZnVuY3Rpb24gcWQoKXt9LApVZjpmdW5j
-dGlvbiBVZihhLGIsYyxkLGUsZixnLGgpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQK
-Xy5lPWUKXy5mPWYKXy5yPWcKXy54PWgKXy55PW51bGx9LApxZTpmdW5jdGlvbiBxZShhLGIsYyxkLGUs
-ZixnKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mCl8ucj1nCl8u
-eD1udWxsCl8ueT0hMQpfLno9bnVsbApfLlE9ITEKXy5jaD1udWxsCl8uY3g9ITEKXy5jeT1udWxsCl8u
-ZGI9ITF9LAppSjpmdW5jdGlvbiBpSigpe30sCmpnOmZ1bmN0aW9uIGpnKGEsYil7dGhpcy5hPWEKdGhp
-cy5iPWJ9LApUYTpmdW5jdGlvbiBUYShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQmY6ZnVuY3Rpb24g
-QmYoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkFzOmZ1bmN0aW9uIEFzKCl7fSwKR0U6ZnVuY3Rpb24g
-R0UoYSl7dGhpcy5hPWF9LApONzpmdW5jdGlvbiBONyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKdVE6
-ZnVuY3Rpb24gdVEoKXt9LApoRjpmdW5jdGlvbiBoRigpe30sClI0OmZ1bmN0aW9uKGEsYixjLGQpe3Zh
-ciBzLHIscQpILnk4KGIpCnQuai5hKGQpCmlmKEgub1QoYikpe3M9W2NdCkMuTm0uRlYocyxkKQpkPXN9
-cj10LnoKcT1QLkNIKEouTTEoZCxQLncwKCksciksITAscikKdC5ZLmEoYSkKcmV0dXJuIFAud1koSC5F
-ayhhLHEsbnVsbCkpfSwKRG06ZnVuY3Rpb24oYSxiLGMpe3ZhciBzCnRyeXtpZihPYmplY3QuaXNFeHRl
-bnNpYmxlKGEpJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpe09iamVj
-dC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOmN9KQpyZXR1cm4hMH19Y2F0Y2gocyl7SC5SdShzKX1y
-ZXR1cm4hMX0sCk9tOmZ1bmN0aW9uKGEsYil7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0
-eS5jYWxsKGEsYikpcmV0dXJuIGFbYl0KcmV0dXJuIG51bGx9LAp3WTpmdW5jdGlvbihhKXtpZihhPT1u
-dWxsfHx0eXBlb2YgYT09InN0cmluZyJ8fHR5cGVvZiBhPT0ibnVtYmVyInx8SC5sKGEpKXJldHVybiBh
-CmlmKGEgaW5zdGFuY2VvZiBQLkU0KXJldHVybiBhLmEKaWYoSC5SOShhKSlyZXR1cm4gYQppZih0LmFr
-LmIoYSkpcmV0dXJuIGEKaWYoYSBpbnN0YW5jZW9mIFAuaVApcmV0dXJuIEgubzIoYSkKaWYodC5ZLmIo
-YSkpcmV0dXJuIFAuaEUoYSwiJGRhcnRfanNGdW5jdGlvbiIsbmV3IFAuUEMoKSkKcmV0dXJuIFAuaEUo
-YSwiXyRkYXJ0X2pzT2JqZWN0IixuZXcgUC5tdCgkLmtJKCkpKX0sCmhFOmZ1bmN0aW9uKGEsYixjKXt2
-YXIgcz1QLk9tKGEsYikKaWYocz09bnVsbCl7cz1jLiQxKGEpClAuRG0oYSxiLHMpfXJldHVybiBzfSwK
-ZFU6ZnVuY3Rpb24oYSl7dmFyIHMscgppZihhPT1udWxsfHx0eXBlb2YgYT09InN0cmluZyJ8fHR5cGVv
-ZiBhPT0ibnVtYmVyInx8dHlwZW9mIGE9PSJib29sZWFuIilyZXR1cm4gYQplbHNlIGlmKGEgaW5zdGFu
-Y2VvZiBPYmplY3QmJkguUjkoYSkpcmV0dXJuIGEKZWxzZSBpZihhIGluc3RhbmNlb2YgT2JqZWN0JiZ0
-LmFrLmIoYSkpcmV0dXJuIGEKZWxzZSBpZihhIGluc3RhbmNlb2YgRGF0ZSl7cz1ILnVQKGEuZ2V0VGlt
-ZSgpKQppZihNYXRoLmFicyhzKTw9ODY0ZTEzKXI9ITEKZWxzZSByPSEwCmlmKHIpSC52KFAueFkoIkRh
-dGVUaW1lIGlzIG91dHNpZGUgdmFsaWQgcmFuZ2U6ICIrcykpClAuVUkoITEsImlzVXRjIix0LnkpCnJl
-dHVybiBuZXcgUC5pUChzLCExKX1lbHNlIGlmKGEuY29uc3RydWN0b3I9PT0kLmtJKCkpcmV0dXJuIGEu
-bwplbHNlIHJldHVybiBQLk5EKGEpfSwKTkQ6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJmdW5jdGlv
-biIpcmV0dXJuIFAuaVEoYSwkLncoKSxuZXcgUC5OeigpKQppZihhIGluc3RhbmNlb2YgQXJyYXkpcmV0
-dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAuUVMoKSkKcmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAubnAo
-KSl9LAppUTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9UC5PbShhLGIpCmlmKHM9PW51bGx8fCEoYSBpbnN0
-YW5jZW9mIE9iamVjdCkpe3M9Yy4kMShhKQpQLkRtKGEsYixzKX1yZXR1cm4gc30sClBDOmZ1bmN0aW9u
-IFBDKCl7fSwKbXQ6ZnVuY3Rpb24gbXQoYSl7dGhpcy5hPWF9LApOejpmdW5jdGlvbiBOeigpe30sClFT
-OmZ1bmN0aW9uIFFTKCl7fSwKbnA6ZnVuY3Rpb24gbnAoKXt9LApFNDpmdW5jdGlvbiBFNChhKXt0aGlz
-LmE9YX0sCnI3OmZ1bmN0aW9uIHI3KGEpe3RoaXMuYT1hfSwKVHo6ZnVuY3Rpb24gVHooYSxiKXt0aGlz
-LmE9YQp0aGlzLiR0aT1ifSwKY286ZnVuY3Rpb24gY28oKXt9LApuZDpmdW5jdGlvbiBuZCgpe30sCktl
-OmZ1bmN0aW9uIEtlKGEpe3RoaXMuYT1hfSwKaGk6ZnVuY3Rpb24gaGkoKXt9fSxXPXsKeDM6ZnVuY3Rp
-b24oKXtyZXR1cm4gd2luZG93fSwKWnI6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnR9LApKNjpmdW5j
-dGlvbihhKXt2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKaWYoYSE9bnVsbClDLnhuLnNM
-VShzLGEpCnJldHVybiBzfSwKVTk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHI9ZG9jdW1lbnQuYm9keQpy
-LnRvU3RyaW5nCnM9Qy5SWS5yNihyLGEsYixjKQpzLnRvU3RyaW5nCnI9dC5hYwpyPW5ldyBILlU1KG5l
-dyBXLmU3KHMpLHIuQygiYTIobEQuRSkiKS5hKG5ldyBXLkN2KCkpLHIuQygiVTU8bEQuRT4iKSkKcmV0
-dXJuIHQuaC5hKHIuZ3I4KHIpKX0sCnJTOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT0iZWxlbWVudCB0YWcg
-dW5hdmFpbGFibGUiCnRyeXtzPUouWUUoYSkKaWYodHlwZW9mIHMuZ25zKGEpPT0ic3RyaW5nIilxPXMu
-Z25zKGEpfWNhdGNoKHIpe0guUnUocil9cmV0dXJuIHF9LApDMDpmdW5jdGlvbihhLGIpe2E9YStiJjUz
-Njg3MDkxMQphPWErKChhJjUyNDI4Nyk8PDEwKSY1MzY4NzA5MTEKcmV0dXJuIGFeYT4+PjZ9LApyRTpm
-dW5jdGlvbihhLGIsYyxkKXt2YXIgcz1XLkMwKFcuQzAoVy5DMChXLkMwKDAsYSksYiksYyksZCkscj1z
-KygocyY2NzEwODg2Myk8PDMpJjUzNjg3MDkxMQpyXj1yPj4+MTEKcmV0dXJuIHIrKChyJjE2MzgzKTw8
-MTUpJjUzNjg3MDkxMX0sClROOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPWEuY2xhc3NMaXN0CmZvcihz
-PWIubGVuZ3RoLHI9MDtyPGIubGVuZ3RoO2IubGVuZ3RoPT09c3x8KDAsSC5saykoYiksKytyKXEuYWRk
-KGJbcl0pfSwKSkU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcz1XLmFGKG5ldyBXLnZOKGMpLHQuQikK
-aWYocyE9bnVsbCYmITApSi5kWihhLGIscywhMSkKcmV0dXJuIG5ldyBXLnhDKGEsYixzLCExLGUuQygi
-eEM8MD4iKSl9LApUdzpmdW5jdGlvbihhKXt2YXIgcz1XLko2KG51bGwpLHI9d2luZG93LmxvY2F0aW9u
-CnM9bmV3IFcuSlEobmV3IFcubWsocyxyKSkKcy5DWShhKQpyZXR1cm4gc30sCnFEOmZ1bmN0aW9uKGEs
-YixjLGQpe3QuaC5hKGEpCkguaChiKQpILmgoYykKdC5jci5hKGQpCnJldHVybiEwfSwKUVc6ZnVuY3Rp
-b24oYSxiLGMsZCl7dmFyIHMscixxCnQuaC5hKGEpCkguaChiKQpILmgoYykKcz10LmNyLmEoZCkuYQpy
-PXMuYQpDLnhuLnNMVShyLGMpCnE9ci5ob3N0bmFtZQpzPXMuYgppZighKHE9PXMuaG9zdG5hbWUmJnIu
-cG9ydD09cy5wb3J0JiZyLnByb3RvY29sPT1zLnByb3RvY29sKSlpZihxPT09IiIpaWYoci5wb3J0PT09
-IiIpe3M9ci5wcm90b2NvbApzPXM9PT0iOiJ8fHM9PT0iIn1lbHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ug
-cz0hMApyZXR1cm4gc30sCkJsOmZ1bmN0aW9uKCl7dmFyIHM9dC5OLHI9UC50TShDLlF4LHMpLHE9dC5k
-MC5hKG5ldyBXLklBKCkpLHA9SC5WTShbIlRFTVBMQVRFIl0sdC5zKQpzPW5ldyBXLmN0KHIsUC5Mcyhz
-KSxQLkxzKHMpLFAuTHMocyksbnVsbCkKcy5DWShudWxsLG5ldyBILmxKKEMuUXgscSx0LmZqKSxwLG51
-bGwpCnJldHVybiBzfSwKcWM6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoYT09bnVsbClyZXR1cm4gbnVsbApp
-ZigicG9zdE1lc3NhZ2UiIGluIGEpe3M9Vy5QMShhKQppZih0LmFTLmIocykpcmV0dXJuIHMKcmV0dXJu
-IG51bGx9ZWxzZSByZXR1cm4gdC5jaC5hKGEpfSwKUDE6ZnVuY3Rpb24oYSl7aWYoYT09PXdpbmRvdyly
-ZXR1cm4gdC5jaS5hKGEpCmVsc2UgcmV0dXJuIG5ldyBXLmRXKCl9LAphRjpmdW5jdGlvbihhLGIpe3Zh
-ciBzPSQuWDMKaWYocz09PUMuTlUpcmV0dXJuIGEKcmV0dXJuIHMuUHkoYSxiKX0sCnFFOmZ1bmN0aW9u
-IHFFKCl7fSwKR2g6ZnVuY3Rpb24gR2goKXt9LApmWTpmdW5jdGlvbiBmWSgpe30sCm5COmZ1bmN0aW9u
-IG5CKCl7fSwKQXo6ZnVuY3Rpb24gQXooKXt9LApRUDpmdW5jdGlvbiBRUCgpe30sCm54OmZ1bmN0aW9u
-IG54KCl7fSwKb0o6ZnVuY3Rpb24gb0ooKXt9LAppZDpmdW5jdGlvbiBpZCgpe30sClFGOmZ1bmN0aW9u
-IFFGKCl7fSwKTmg6ZnVuY3Rpb24gTmgoKXt9LAphZTpmdW5jdGlvbiBhZSgpe30sCklCOmZ1bmN0aW9u
-IElCKCl7fSwKbjc6ZnVuY3Rpb24gbjcoKXt9LAp3ejpmdW5jdGlvbiB3eihhLGIpe3RoaXMuYT1hCnRo
-aXMuJHRpPWJ9LApjdjpmdW5jdGlvbiBjdigpe30sCkN2OmZ1bmN0aW9uIEN2KCl7fSwKZWE6ZnVuY3Rp
-b24gZWEoKXt9LApEMDpmdW5jdGlvbiBEMCgpe30sCmhIOmZ1bmN0aW9uIGhIKCl7fSwKaDQ6ZnVuY3Rp
-b24gaDQoKXt9LApicjpmdW5jdGlvbiBicigpe30sClZiOmZ1bmN0aW9uIFZiKCl7fSwKZko6ZnVuY3Rp
-b24gZkooKXt9LAp3YTpmdW5jdGlvbiB3YSgpe30sClNnOmZ1bmN0aW9uIFNnKCl7fSwKdTg6ZnVuY3Rp
-b24gdTgoKXt9LApBajpmdW5jdGlvbiBBaigpe30sCmU3OmZ1bmN0aW9uIGU3KGEpe3RoaXMuYT1hfSwK
-dUg6ZnVuY3Rpb24gdUgoKXt9LApCSDpmdW5jdGlvbiBCSCgpe30sClNOOmZ1bmN0aW9uIFNOKCl7fSwK
-ZXc6ZnVuY3Rpb24gZXcoKXt9LApscDpmdW5jdGlvbiBscCgpe30sClRiOmZ1bmN0aW9uIFRiKCl7fSwK
-SXY6ZnVuY3Rpb24gSXYoKXt9LApXUDpmdW5jdGlvbiBXUCgpe30sCnlZOmZ1bmN0aW9uIHlZKCl7fSwK
-dzY6ZnVuY3Rpb24gdzYoKXt9LApLNTpmdW5jdGlvbiBLNSgpe30sCkNtOmZ1bmN0aW9uIENtKCl7fSwK
-Q1E6ZnVuY3Rpb24gQ1EoKXt9LAp3NDpmdW5jdGlvbiB3NCgpe30sCnJoOmZ1bmN0aW9uIHJoKCl7fSwK
-Y2Y6ZnVuY3Rpb24gY2YoKXt9LAppNzpmdW5jdGlvbiBpNyhhKXt0aGlzLmE9YX0sClN5OmZ1bmN0aW9u
-IFN5KGEpe3RoaXMuYT1hfSwKS1M6ZnVuY3Rpb24gS1MoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkEz
-OmZ1bmN0aW9uIEEzKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApJNDpmdW5jdGlvbiBJNChhKXt0aGlz
-LmE9YX0sCkZrOmZ1bmN0aW9uIEZrKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sClJPOmZ1bmN0aW9u
-IFJPKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sCmV1OmZ1bmN0
-aW9uIGV1KGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sCnhDOmZ1
-bmN0aW9uIHhDKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmI9YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLiR0
-aT1lfSwKdk46ZnVuY3Rpb24gdk4oYSl7dGhpcy5hPWF9LApKUTpmdW5jdGlvbiBKUShhKXt0aGlzLmE9
-YX0sCkdtOmZ1bmN0aW9uIEdtKCl7fSwKdkQ6ZnVuY3Rpb24gdkQoYSl7dGhpcy5hPWF9LApVdjpmdW5j
-dGlvbiBVdihhKXt0aGlzLmE9YX0sCkVnOmZ1bmN0aW9uIEVnKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
-Ygp0aGlzLmM9Y30sCm02OmZ1bmN0aW9uIG02KCl7fSwKRW86ZnVuY3Rpb24gRW8oKXt9LApXazpmdW5j
-dGlvbiBXaygpe30sCmN0OmZ1bmN0aW9uIGN0KGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmU9YQpfLmE9
-YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCklBOmZ1bmN0aW9uIElBKCl7fSwKT3c6ZnVuY3Rpb24gT3coKXt9
-LApXOTpmdW5jdGlvbiBXOShhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9LTEKXy5kPW51
-bGwKXy4kdGk9Y30sCmRXOmZ1bmN0aW9uIGRXKCl7fSwKbWs6ZnVuY3Rpb24gbWsoYSxiKXt0aGlzLmE9
-YQp0aGlzLmI9Yn0sCktvOmZ1bmN0aW9uIEtvKGEpe3RoaXMuYT1hCnRoaXMuYj0hMX0sCmZtOmZ1bmN0
-aW9uIGZtKGEpe3RoaXMuYT1hfSwKTGU6ZnVuY3Rpb24gTGUoKXt9LApLNzpmdW5jdGlvbiBLNygpe30s
-CnJCOmZ1bmN0aW9uIHJCKCl7fSwKWFc6ZnVuY3Rpb24gWFcoKXt9LApvYTpmdW5jdGlvbiBvYSgpe319
-LE09ewpPWDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSBDLkFkOnJldHVybiJBZGQgLyo/Ki8gaGlu
-dCIKY2FzZSBDLm5lOnJldHVybiJBZGQgLyohKi8gaGludCIKY2FzZSBDLndWOnJldHVybiJSZW1vdmUg
-Lyo/Ki8gaGludCIKY2FzZSBDLmZSOnJldHVybiJSZW1vdmUgLyohKi8gaGludCIKY2FzZSBDLm15OnJl
-dHVybiJDaGFuZ2UgdG8gLyo/Ki8gaGludCIKY2FzZSBDLnJ4OnJldHVybiJDaGFuZ2UgdG8gLyohKi8g
-aGludCJ9cmV0dXJuIG51bGx9LApINzpmdW5jdGlvbiBINyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwK
-WUY6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsCmZvcihzPWIubGVuZ3RoLHI9MTtyPHM7
-KytyKXtpZihiW3JdPT1udWxsfHxiW3ItMV0hPW51bGwpY29udGludWUKZm9yKDtzPj0xO3M9cSl7cT1z
-LTEKaWYoYltxXSE9bnVsbClicmVha31wPW5ldyBQLlJuKCIiKQpvPWErIigiCnAuYT1vCm49SC50Nihi
-KQptPW4uQygibkg8MT4iKQpsPW5ldyBILm5IKGIsMCxzLG0pCmwuSGQoYiwwLHMsbi5jKQptPW8rbmV3
-IEgubEoobCxtLkMoInFVKGFMLkUpIikuYShuZXcgTS5ObygpKSxtLkMoImxKPGFMLkUscVU+IikpLkgo
-MCwiLCAiKQpwLmE9bQpwLmE9bSsoIik6IHBhcnQgIisoci0xKSsiIHdhcyBudWxsLCBidXQgcGFydCAi
-K3IrIiB3YXMgbm90LiIpCnRocm93IEguYihQLnhZKHAudygwKSkpfX0sCmxJOmZ1bmN0aW9uIGxJKGEp
-e3RoaXMuYT1hfSwKcTc6ZnVuY3Rpb24gcTcoKXt9LApObzpmdW5jdGlvbiBObygpe319LFU9ewpuejpm
-dW5jdGlvbihhKXt2YXIgcz1ILnVQKGEucSgwLCJub2RlSWQiKSkKcmV0dXJuIG5ldyBVLkxMKEMuTm0u
-SHQoQy5yayxuZXcgVS5NRChhKSkscyl9LApMTDpmdW5jdGlvbiBMTChhLGIpe3RoaXMuYT1hCnRoaXMu
-Yj1ifSwKTUQ6ZnVuY3Rpb24gTUQoYSl7dGhpcy5hPWF9LApqZjpmdW5jdGlvbihhKXt2YXIgcyxyLHEs
-cAppZihhPT1udWxsKXM9bnVsbAplbHNle3M9SC5WTShbXSx0LmQ3KQpmb3Iocj1KLklUKHQuVS5hKGEp
-KTtyLkYoKTspe3E9ci5nbCgpCnA9Si5VNihxKQpDLk5tLmkocyxuZXcgVS5TZShILmgocC5xKHEsImRl
-c2NyaXB0aW9uIikpLEguaChwLnEocSwiaHJlZiIpKSkpfX1yZXR1cm4gc30sCk5kOmZ1bmN0aW9uKGEp
-e3ZhciBzLHIKaWYoYT09bnVsbClzPW51bGwKZWxzZXtzPUguVk0oW10sdC5hQSkKZm9yKHI9Si5JVCh0
-LlUuYShhKSk7ci5GKCk7KUMuTm0uaShzLFUuTmYoci5nbCgpKSl9cmV0dXJuIHN9LApOZjpmdW5jdGlv
-bihhKXt2YXIgcz1KLlU2KGEpLHI9SC5oKHMucShhLCJkZXNjcmlwdGlvbiIpKSxxPUguVk0oW10sdC5h
-SikKZm9yKHM9Si5JVCh0LlUuYShzLnEoYSwiZW50cmllcyIpKSk7cy5GKCk7KUMuTm0uaShxLFUuUmoo
-cy5nbCgpKSkKcmV0dXJuIG5ldyBVLnlEKHIscSl9LApSajpmdW5jdGlvbihhKXt2YXIgcyxyPUouVTYo
-YSkscT1ILmgoci5xKGEsImRlc2NyaXB0aW9uIikpLHA9SC5oKHIucShhLCJmdW5jdGlvbiIpKSxvPXIu
-cShhLCJsaW5rIikKaWYobz09bnVsbClvPW51bGwKZWxzZXtzPUouVTYobykKbz1uZXcgVS5NbChILmgo
-cy5xKG8sImhyZWYiKSksSC51UChzLnEobywibGluZSIpKSxILmgocy5xKG8sInBhdGgiKSkpfXI9dC5m
-Sy5hKHIucShhLCJoaW50QWN0aW9ucyIpKQpyPXI9PW51bGw/bnVsbDpKLk0xKHIsbmV3IFUuYU4oKSx0
-LmFYKQpyPXI9PW51bGw/bnVsbDpyLmJyKDApCnJldHVybiBuZXcgVS53YihxLHAsbyxyPT1udWxsP0Mu
-ZG46cil9LApkMjpmdW5jdGlvbiBkMihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmE9YQpfLmI9Ygpf
-LmM9YwpfLmQ9ZApfLmU9ZQpfLmY9Zn0sClNlOmZ1bmN0aW9uIFNlKGEsYil7dGhpcy5hPWEKdGhpcy5i
-PWJ9LApNbDpmdW5jdGlvbiBNbChhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAp5RDpm
-dW5jdGlvbiB5RChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKd2I6ZnVuY3Rpb24gd2IoYSxiLGMsZCl7
-dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCmFOOmZ1bmN0aW9uIGFOKCl7fSwKYjA6
-ZnVuY3Rpb24gYjAoKXt9fSxCPXsKd1I6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEIucXAoIiIsIiIsIiIs
-Qy5EeCl9LApZZjpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9SC5oKGEucSgwLCJyZWdp
-b25zIikpLGo9SC5oKGEucSgwLCJuYXZpZ2F0aW9uQ29udGVudCIpKSxpPUguaChhLnEoMCwic291cmNl
-Q29kZSIpKSxoPVAuRmwodC5YLHQuZF8pCmZvcihzPXQudC5hKGEucSgwLCJlZGl0cyIpKSxzPXMuZ1B1
-KHMpLHM9cy5nbShzKSxyPXQuVSxxPXQuaDQ7cy5GKCk7KXtwPXMuZ2woKQpvPXAuYQpuPUguVk0oW10s
-cSkKZm9yKHA9Si5JVChyLmEocC5iKSk7cC5GKCk7KXttPXAuZ2woKQpsPUouVTYobSkKQy5ObS5pKG4s
-bmV3IEIuajgoSC51UChsLnEobSwibGluZSIpKSxILmgobC5xKG0sImV4cGxhbmF0aW9uIikpLEgudVAo
-bC5xKG0sIm9mZnNldCIpKSkpfWguWSgwLG8sbil9cmV0dXJuIG5ldyBCLnFwKGssaixpLGgpfSwKajg6
-ZnVuY3Rpb24gajgoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKcXA6ZnVuY3Rpb24g
-cXAoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCmZ2OmZ1bmN0aW9u
-IGZ2KCl7fSwKT1M6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoIShhPj02NSYmYTw9OTApKXM9YT49OTcmJmE8
-PTEyMgplbHNlIHM9ITAKcmV0dXJuIHN9LApZdTpmdW5jdGlvbihhLGIpe3ZhciBzPWEubGVuZ3RoLHI9
-YisyCmlmKHM8cilyZXR1cm4hMQppZighQi5PUyhDLnhCLk8yKGEsYikpKXJldHVybiExCmlmKEMueEIu
-TzIoYSxiKzEpIT09NTgpcmV0dXJuITEKaWYocz09PXIpcmV0dXJuITAKcmV0dXJuIEMueEIuTzIoYSxy
-KT09PTQ3fX0sVD17bVE6ZnVuY3Rpb24gbVEoKXt9fSxMPXsKSXE6ZnVuY3Rpb24oKXtDLkJaLkIoZG9j
-dW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQiLG5ldyBMLmUoKSkKQy5vbC5CKHdpbmRvdywicG9wc3RhdGUi
-LG5ldyBMLkwoKSl9LAprejpmdW5jdGlvbihhKXt2YXIgcyxyPXQuZy5hKGEucGFyZW50Tm9kZSkucXVl
-cnlTZWxlY3RvcigiOnNjb3BlID4gdWwiKSxxPXIuc3R5bGUscD0iIitDLkNELnpRKHIub2Zmc2V0SGVp
-Z2h0KSoyKyJweCIKcS5tYXhIZWlnaHQ9cApxPUoucUYoYSkKcD1xLiR0aQpzPXAuQygifigxKT8iKS5h
-KG5ldyBMLld4KHIsYSkpCnQuWi5hKG51bGwpClcuSkUocS5hLHEuYixzLCExLHAuYyl9LAp5WDpmdW5j
-dGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtPSJxdWVyeVNlbGVjdG9yQWxsIixsPWRvY3VtZW50LnF1
-ZXJ5U2VsZWN0b3IoYSksaz10LmcKbC50b1N0cmluZwpzPXQuaApILkRoKGsscywiVCIsbSkKcj10LlcK
-cT1uZXcgVy53eihsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5uYXYtbGluayIpLHIpCnEuSyhxLG5ldyBMLkFP
-KGIpKQpILkRoKGsscywiVCIsbSkKcD1uZXcgVy53eihsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5yZWdpb24i
-KSxyKQppZighcC5nbDAocCkpe289bC5xdWVyeVNlbGVjdG9yKCJ0YWJsZVtkYXRhLXBhdGhdIikKby50
-b1N0cmluZwpwLksocCxuZXcgTC5IbyhvLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBX
-Lmk3KG8pKS5PKCJwYXRoIikpKSl9SC5EaChrLHMsIlQiLG0pCm49bmV3IFcud3oobC5xdWVyeVNlbGVj
-dG9yQWxsKCIuYWRkLWhpbnQtbGluayIpLHIpCm4uSyhuLG5ldyBMLklDKCkpfSwKUTY6ZnVuY3Rpb24o
-YSxiLGMpe3ZhciBzPW5ldyBYTUxIdHRwUmVxdWVzdCgpCkMuRHQuZW8ocywiR0VUIixMLlE0KGEsYiks
-ITApCnMuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24vanNvbjsgY2hh
-cnNldD1VVEYtOCIpCnJldHVybiBMLkxVKHMsbnVsbCxjLkMoIjAqIikpfSwKdHk6ZnVuY3Rpb24oYSxi
-KXt2YXIgcz1uZXcgWE1MSHR0cFJlcXVlc3QoKSxyPXQuWApDLkR0LmVvKHMsIlBPU1QiLEwuUTQoYSxQ
-LkZsKHIscikpLCEwKQpzLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsImFwcGxpY2F0aW9u
-L2pzb247IGNoYXJzZXQ9VVRGLTgiKQpyZXR1cm4gTC5MVShzLGIsdC50KX0sCkxVOmZ1bmN0aW9uKGEs
-YixjKXtyZXR1cm4gTC5UZyhhLGIsYyxjLkMoIjAqIikpfSwKVGc6ZnVuY3Rpb24oYSxiLGMsZCl7dmFy
-IHM9MCxyPVAuRlgoZCkscSxwPTIsbyxuPVtdLG0sbCxrLGosaSxoLGcsZgp2YXIgJGFzeW5jJExVPVAu
-bHooZnVuY3Rpb24oZSxhMCl7aWYoZT09PTEpe289YTAKcz1wfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nh
-c2UgMDppPW5ldyBQLlpmKG5ldyBQLnZzKCQuWDMsdC5nViksdC5iQykKaD10LmViCmc9aC5hKG5ldyBM
-LmZDKGksYSkpCnQuWi5hKG51bGwpCmw9dC5lUQpXLkpFKGEsImxvYWQiLGcsITEsbCkKVy5KRShhLCJl
-cnJvciIsaC5hKGkuZ1lKKCkpLCExLGwpCmEuc2VuZChiPT1udWxsP251bGw6Qy5DdC5PQihiLG51bGwp
-KQpwPTQKcz03CnJldHVybiBQLmpRKGkuYSwkYXN5bmMkTFUpCmNhc2UgNzpwPTIKcz02CmJyZWFrCmNh
-c2UgNDpwPTMKZj1vCkguUnUoZikKbT1ILnRzKGYpCmg9UC5UbCgiRXJyb3IgcmVhY2hpbmcgbWlncmF0
-aW9uIHByZXZpZXcgc2VydmVyLiIsbSkKdGhyb3cgSC5iKGgpCnM9NgpicmVhawpjYXNlIDM6cz0yCmJy
-ZWFrCmNhc2UgNjpqPUMuQ3QucFcoMCxhLnJlc3BvbnNlVGV4dCxudWxsKQppZihhLnN0YXR1cz09PTIw
-MCl7cT1jLkMoIjAqIikuYShqKQpzPTEKYnJlYWt9ZWxzZSB0aHJvdyBILmIoaikKY2FzZSAxOnJldHVy
-biBQLnlDKHEscikKY2FzZSAyOnJldHVybiBQLmYzKG8scil9fSkKcmV0dXJuIFAuREkoJGFzeW5jJExV
-LHIpfSwKYUs6ZnVuY3Rpb24oYSl7dmFyIHM9UC5oSyhhKS5naFkoKS5xKDAsImxpbmUiKQpyZXR1cm4g
-cz09bnVsbD9udWxsOkguSHAocyxudWxsKX0sCkc2OmZ1bmN0aW9uKGEpe3ZhciBzPVAuaEsoYSkuZ2hZ
-KCkucSgwLCJvZmZzZXQiKQpyZXR1cm4gcz09bnVsbD9udWxsOkguSHAocyxudWxsKX0sCmk2OmZ1bmN0
-aW9uKGEpe3JldHVybiBMLm5XKHQuTy5hKGEpKX0sCm5XOmZ1bmN0aW9uKGEpe3ZhciBzPTAscj1QLkZY
-KHQueikscT0xLHAsbz1bXSxuLG0sbCxrLGosaSxoCnZhciAkYXN5bmMkaTY9UC5seihmdW5jdGlvbihi
-LGMpe2lmKGI9PT0xKXtwPWMKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDppPXQuZy5hKFcu
-cWMoYS5jdXJyZW50VGFyZ2V0KSkuZ2V0QXR0cmlidXRlKCJocmVmIikKYS5wcmV2ZW50RGVmYXVsdCgp
-CnE9MwprPWRvY3VtZW50Cm49Qy5DRC56UShrLnF1ZXJ5U2VsZWN0b3IoIi5jb250ZW50Iikuc2Nyb2xs
-VG9wKQpzPTYKcmV0dXJuIFAualEoTC50eShpLG51bGwpLCRhc3luYyRpNikKY2FzZSA2OnM9NwpyZXR1
-cm4gUC5qUShMLkc3KHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSxudWxsLG51bGwsITEsbnVsbCksJGFz
-eW5jJGk2KQpjYXNlIDc6az1rLnF1ZXJ5U2VsZWN0b3IoIi5jb250ZW50IikKay50b1N0cmluZwprLnNj
-cm9sbFRvcD1KLlZ1KG4pCnE9MQpzPTUKYnJlYWsKY2FzZSAzOnE9MgpoPXAKbT1ILlJ1KGgpCmw9SC50
-cyhoKQpMLkMyKCJDb3VsZCBub3QgYWRkL3JlbW92ZSBoaW50IixtLGwpCnM9NQpicmVhawpjYXNlIDI6
-cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIp
-fX0pCnJldHVybiBQLkRJKCRhc3luYyRpNixyKX0sCkMyOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEs
-cD0iZXhjZXB0aW9uIixvPSJzdGFja1RyYWNlIixuPXQudC5iKGIpJiZKLlJNKGIucSgwLCJzdWNjZXNz
-IiksITEpJiZiLng0KHApJiZiLng0KG8pLG09Si5pYShiKQppZihuKXtzPUguaChtLnEoYixwKSkKYz1t
-LnEoYixvKX1lbHNlIHM9bS53KGIpCm49ZG9jdW1lbnQKcj1uLnF1ZXJ5U2VsZWN0b3IoIi5wb3B1cC1w
-YW5lIikKci5xdWVyeVNlbGVjdG9yKCJoMiIpLmlubmVyVGV4dD1hCnIucXVlcnlTZWxlY3RvcigicCIp
-LmlubmVyVGV4dD1zCnIucXVlcnlTZWxlY3RvcigicHJlIikuaW5uZXJUZXh0PUouaihjKQpxPXQuZGQu
-YShyLnF1ZXJ5U2VsZWN0b3IoImEuYm90dG9tIikpCm09dC5YOyhxJiZDLnhuKS5zTFUocSxQLlhkKCJo
-dHRwcyIsImdpdGh1Yi5jb20iLCJkYXJ0LWxhbmcvc2RrL2lzc3Vlcy9uZXciLFAuRUYoWyJ0aXRsZSIs
-IkN1c3RvbWVyLXJlcG9ydGVkIGlzc3VlIHdpdGggTk5CRCBtaWdyYXRpb24gdG9vbDogIithLCJsYWJl
-bHMiLHUuZCwiYm9keSIsYSsiXG5cbkVycm9yOiAiK0guRWoocykrIlxuXG5QbGVhc2UgZmlsbCBpbiB0
-aGUgZm9sbG93aW5nOlxuXG4qKk5hbWUgb2YgcGFja2FnZSBiZWluZyBtaWdyYXRlZCAoaWYgcHVibGlj
-KSoqOlxuKipXaGF0IEkgd2FzIGRvaW5nIHdoZW4gdGhpcyBpc3N1ZSBvY2N1cnJlZCoqOlxuKipJcyBp
-dCBwb3NzaWJsZSB0byB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlKio6XG4qKkhhcyB0aGlzIGlzc3VlIGhh
-cHBlbmVkIGJlZm9yZSwgYW5kIGlmIHNvLCBob3cgb2Z0ZW4qKjpcbioqRGFydCBTREsgdmVyc2lvbioq
-OiAiK0guRWoobi5nZXRFbGVtZW50QnlJZCgic2RrLXZlcnNpb24iKS50ZXh0Q29udGVudCkrIlxuKipB
-ZGRpdGlvbmFsIGRldGFpbHMqKjpcblxuVGhhbmtzIGZvciBmaWxpbmchXG5cblN0YWNrdHJhY2U6IF9h
-dXRvIHBvcHVsYXRlZCBieSBtaWdyYXRpb24gcHJldmlldyB0b29sLl9cblxuYGBgXG4iK0guRWooYykr
-IlxuYGBgXG4iXSxtLG0pKS5nbkQoKSkKbT1xLnN0eWxlCm0uZGlzcGxheT0iaW5pdGlhbCIKbj1yLnN0
-eWxlCm4uZGlzcGxheT0iaW5pdGlhbCIKbj1hKyI6ICIrSC5FaihiKQp3aW5kb3cKaWYodHlwZW9mIGNv
-bnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLmVycm9yKG4pCndpbmRvdwpuPUguRWooYykK
-aWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLmVycm9yKG4pfSwKdDI6
-ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG89dC5nLmEoVy5xYyhhLmN1cnJlbnRUYXJnZXQpKQph
-LnByZXZlbnREZWZhdWx0KCkKcz1vLmdldEF0dHJpYnV0ZSgiaHJlZiIpCnI9TC5VcyhzKQpxPUwuRzYo
-cykKcD1MLmFLKHMpCmlmKHEhPW51bGwpTC5hZihyLHEscCxiLG5ldyBMLm5UKHIscSxwKSkKZWxzZSBM
-LmFmKHIsbnVsbCxudWxsLGIsbmV3IEwuTlkocikpfSwKSzA6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9
-ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBvcHVwLXBhbmUiKQpwLnF1ZXJ5U2VsZWN0b3IoImgyIiku
-aW5uZXJUZXh0PSJGYWlsZWQgdG8gcmVydW4gZnJvbSBzb3VyY2VzIgpwLnF1ZXJ5U2VsZWN0b3IoInAi
-KS5pbm5lclRleHQ9IlNvdXJjZXMgY29udGFpbiBzdGF0aWMgYW5hbHlzaXMgZXJyb3JzOiIKcz1wLnF1
-ZXJ5U2VsZWN0b3IoInByZSIpCnI9Si5FbChhLHQuYXcpCnE9SC5MaChyKQpzLmlubmVyVGV4dD1uZXcg
-SC5sSihyLHEuQygicVUqKGxELkUpIikuYShuZXcgTC51ZSgpKSxxLkMoImxKPGxELkUscVUqPiIpKS5I
-KDAsIlxuIikKcT1wLnF1ZXJ5U2VsZWN0b3IoImEuYm90dG9tIikuc3R5bGUKcS5kaXNwbGF5PSJub25l
-IgpzPXAuc3R5bGUKcy5kaXNwbGF5PSJpbml0aWFsIn0sCnZVOmZ1bmN0aW9uKCl7dmFyIHM9ZG9jdW1l
-bnQKSC5EaCh0LmcsdC5oLCJUIiwicXVlcnlTZWxlY3RvckFsbCIpCnM9bmV3IFcud3oocy5xdWVyeVNl
-bGVjdG9yQWxsKCIuY29kZSIpLHQuVykKcy5LKHMsbmV3IEwuZVgoKSl9LApoWDpmdW5jdGlvbihhLGIs
-Yyl7cmV0dXJuIEwuWXcoYSxiLGMpfSwKWXc6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPTAscj1QLkZYKHQu
-eikscT0xLHAsbz1bXSxuLG0sbCxrLGosaSxoLGcKdmFyICRhc3luYyRoWD1QLmx6KGZ1bmN0aW9uKGQs
-ZSl7aWYoZD09PTEpe3A9ZQpzPXF9d2hpbGUodHJ1ZSlzd2l0Y2gocyl7Y2FzZSAwOnE9MwpqPXQuWApz
-PTYKcmV0dXJuIFAualEoTC5RNihhLFAuRUYoWyJyZWdpb24iLCJyZWdpb24iLCJvZmZzZXQiLEguRWoo
-YildLGosaiksdC50KSwkYXN5bmMkaFgpCmNhc2UgNjpuPWUKaj1uCmk9Si5VNihqKQptPW5ldyBVLmQy
-KFUuamYoaS5xKGosImVkaXRzIikpLEguaChpLnEoaiwiZXhwbGFuYXRpb24iKSksSC51UChpLnEoaiwi
-bGluZSIpKSxILmgoaS5xKGosImRpc3BsYXlQYXRoIikpLEguaChpLnEoaiwidXJpUGF0aCIpKSxVLk5k
-KGkucShqLCJ0cmFjZXMiKSkpCkwuVDEobSkKTC5GcihhLGIsYykKTC55WCgiLmVkaXQtcGFuZWwgLnBh
-bmVsLWNvbnRlbnQiLCExKQpxPTEKcz01CmJyZWFrCmNhc2UgMzpxPTIKZz1wCmw9SC5SdShnKQprPUgu
-dHMoZykKTC5DMigiQ291bGQgbm90IGxvYWQgZWRpdCBkZXRhaWxzIixsLGspCnM9NQpicmVhawpjYXNl
-IDI6cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhw
-LHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyRoWCxyKX0sCkc3OmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0
-dXJuIEwuTDUoYSxiLGMsZCxlKX0sCkw1OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHM9MCxyPVAuRlgo
-dC5IKSxxLHA9MixvLG49W10sbSxsLGssaixpLGgsZwp2YXIgJGFzeW5jJEc3PVAubHooZnVuY3Rpb24o
-ZixhMCl7aWYoZj09PTEpe289YTAKcz1wfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDppZighSi5w
-NChhLCIuZGFydCIpKXtMLkJFKGEsQi53UigpLGQpCkwuQlgoYSxudWxsKQppZihlIT1udWxsKWUuJDAo
-KQpzPTEKYnJlYWt9cD00Cmk9dC5YCnM9NwpyZXR1cm4gUC5qUShMLlE2KGEsUC5FRihbImlubGluZSIs
-InRydWUiXSxpLGkpLHQudCksJGFzeW5jJEc3KQpjYXNlIDc6bT1hMApMLkJFKGEsQi5ZZihtKSxkKQpM
-LmZHKGIsYykKbD1MLlVzKGEpCkwuQlgobCxiKQppZihlIT1udWxsKWUuJDAoKQpwPTIKcz02CmJyZWFr
-CmNhc2UgNDpwPTMKZz1vCms9SC5SdShnKQpqPUgudHMoZykKTC5DMigiQ291bGQgbm90IGxvYWQgZGFy
-dCBmaWxlICIrYSxrLGopCnM9NgpicmVhawpjYXNlIDM6cz0yCmJyZWFrCmNhc2UgNjpjYXNlIDE6cmV0
-dXJuIFAueUMocSxyKQpjYXNlIDI6cmV0dXJuIFAuZjMobyxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMk
-Rzcscil9LApHZTpmdW5jdGlvbigpe3ZhciBzPTAscj1QLkZYKHQueikscT0xLHAsbz1bXSxuLG0sbCxr
-LGosaSxoCnZhciAkYXN5bmMkR2U9UC5seihmdW5jdGlvbihhLGIpe2lmKGE9PT0xKXtwPWIKcz1xfXdo
-aWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDppPSIvX3ByZXZpZXcvbmF2aWdhdGlvblRyZWUuanNvbiIK
-cT0zCnM9NgpyZXR1cm4gUC5qUShMLlE2KGksQy5DTSx0Lm0pLCRhc3luYyRHZSkKY2FzZSA2Om49Ygpt
-PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5uYXYtdHJlZSIpCkoubDUobSwiIikKTC50WChtLEwubUso
-bikpCnE9MQpzPTUKYnJlYWsKY2FzZSAzOnE9MgpoPXAKbD1ILlJ1KGgpCms9SC50cyhoKQpMLkMyKCJD
-b3VsZCBub3QgbG9hZCBuYXZpZ2F0aW9uIHRyZWUiLGwsaykKcz01CmJyZWFrCmNhc2UgMjpzPTEKYnJl
-YWsKY2FzZSA1OnJldHVybiBQLnlDKG51bGwscikKY2FzZSAxOnJldHVybiBQLmYzKHAscil9fSkKcmV0
-dXJuIFAuREkoJGFzeW5jJEdlLHIpfSwKcU86ZnVuY3Rpb24oYSl7dmFyIHMscj1hLmdldEJvdW5kaW5n
-Q2xpZW50UmVjdCgpLHE9Qy5DRC56USgkLmZpKCkub2Zmc2V0SGVpZ2h0KSxwPXdpbmRvdy5pbm5lckhl
-aWdodCxvPUMuQ0QuelEoJC5EVygpLm9mZnNldEhlaWdodCkKaWYodHlwZW9mIHAhPT0ibnVtYmVyIily
-ZXR1cm4gcC5ITigpCnM9ci5ib3R0b20Kcy50b1N0cmluZwppZihzPnAtKG8rMTQpKUouZGgoYSkKZWxz
-ZXtwPXIudG9wCnAudG9TdHJpbmcKaWYocDxxKzE0KUouZGgoYSl9fSwKZkc6ZnVuY3Rpb24oYSxiKXt2
-YXIgcyxyLHEscCxvCmlmKGEhPW51bGwpe3M9ZG9jdW1lbnQKcj1zLmdldEVsZW1lbnRCeUlkKCJvIitI
-LkVqKGEpKQpxPXMucXVlcnlTZWxlY3RvcigiLmxpbmUtIitILkVqKGIpKQppZihyIT1udWxsKXtMLnFP
-KHIpCkouZFIocikuaSgwLCJ0YXJnZXQiKX1lbHNlIGlmKHEhPW51bGwpTC5xTyhxLnBhcmVudEVsZW1l
-bnQpCmlmKHEhPW51bGwpSi5kUih0LmcuYShxLnBhcmVudE5vZGUpKS5pKDAsImhpZ2hsaWdodCIpfWVs
-c2V7cz1kb2N1bWVudApwPXQuZwpILkRoKHAsdC5oLCJUIiwicXVlcnlTZWxlY3RvckFsbCIpCnM9cy5x
-dWVyeVNlbGVjdG9yQWxsKCIubGluZS1ubyIpCm89bmV3IFcud3oocyx0LlcpCmlmKG8uZ0Eobyk9PT0w
-KXJldHVybgpMLnFPKHAuYShDLnQ1Lmd0SChzKSkpfX0sCmFmOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFy
-IHMscixxPUwuRzYod2luZG93LmxvY2F0aW9uLmhyZWYpLHA9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJl
-ZikKaWYocSE9bnVsbCl7cz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibyIrSC5FaihxKSkKaWYocyE9
-bnVsbClKLmRSKHMpLlIoMCwidGFyZ2V0Iil9aWYocCE9bnVsbCl7cj1kb2N1bWVudC5xdWVyeVNlbGVj
-dG9yKCIubGluZS0iK0guRWoocCkpCmlmKHIhPW51bGwpSi5kUihyLnBhcmVudEVsZW1lbnQpLlIoMCwi
-aGlnaGxpZ2h0Iil9aWYoYT09d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKXtMLmZHKGIsYykKZS4kMCgp
-fWVsc2UgTC5HNyhhLGIsYyxkLGUpfSwKUTQ6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9UC5oSyhhKSxw
-PXQuWApwPVAuRmwocCxwKQpmb3Iocz1xLmdoWSgpLHM9cy5nUHUocykscz1zLmdtKHMpO3MuRigpOyl7
-cj1zLmdsKCkKcC5ZKDAsci5hLHIuYil9Zm9yKHM9Yi5nUHUoYikscz1zLmdtKHMpO3MuRigpOyl7cj1z
-LmdsKCkKcC5ZKDAsci5hLHIuYil9cC5ZKDAsImF1dGhUb2tlbiIsJC5VRSgpKQpyZXR1cm4gcS5ubSgw
-LHApLmduRCgpfSwKVDE6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGo9JC5oTCgpCkou
-bDUoaiwiIikKaWYoYT09bnVsbCl7cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIikKQy5MdC5zYTQo
-cywiU2VlIGRldGFpbHMgYWJvdXQgYSBwcm9wb3NlZCBlZGl0LiIpCkMuTHQuc0QocyxILlZNKFsicGxh
-Y2Vob2xkZXIiXSx0LmkpKQpqLmFwcGVuZENoaWxkKHMpCkMuTHQuRkYocykKcmV0dXJufXI9YS5kCnE9
-JC5uVSgpCnA9cS56ZihyKQpvPWEuYgpuPWRvY3VtZW50Cm09cS5IUChyLEouVDAobi5xdWVyeVNlbGVj
-dG9yKCIucm9vdCIpLnRleHRDb250ZW50KSkKbD1hLmMKaz1uLmNyZWF0ZUVsZW1lbnQoInAiKQpqLmFw
-cGVuZENoaWxkKGspCmsuYXBwZW5kQ2hpbGQobi5jcmVhdGVUZXh0Tm9kZShILkVqKG8pKyIgYXQgIikp
-CnE9dC5YCnE9Vy5KNihMLlE0KGEuZSxQLkVGKFsibGluZSIsSi5qKGwpXSxxLHEpKSkKcS5hcHBlbmRD
-aGlsZChuLmNyZWF0ZVRleHROb2RlKEguRWoobSkrIjoiK0guRWoobCkrIi4iKSkKay5hcHBlbmRDaGls
-ZChxKQpKLmRoKGspCkwuQ0MoYSxqLHApCkwuRnooYSxqKX0sCkxIOmZ1bmN0aW9uKGEsYixjKXt2YXIg
-cyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGU9JC55UCgpCkoubDUoZSwiIikKaWYoYi5nQShiKT09
-PTApe3M9ZG9jdW1lbnQKcj1zLmNyZWF0ZUVsZW1lbnQoInAiKQplLmFwcGVuZENoaWxkKHIpCnIuYXBw
-ZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiTm8gcHJvcG9zZWQgZWRpdHMiKSl9ZWxzZSBmb3IoZT1i
-LmdQdShiKSxlPWUuZ20oZSkscz10LlgscT10LmsscD1xLkMoIn4oMSk/Iiksbz10LloscT1xLmM7ZS5G
-KCk7KXtuPWUuZ2woKQptPWRvY3VtZW50CnI9bS5jcmVhdGVFbGVtZW50KCJwIikKbD0kLnlQKCkKbC5h
-cHBlbmRDaGlsZChyKQpyLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoSC5FaihuLmEpKyI6Iikp
-Cms9bS5jcmVhdGVFbGVtZW50KCJ1bCIpCmwuYXBwZW5kQ2hpbGQoaykKZm9yKG49Si5JVChuLmIpO24u
-RigpOyl7bD1uLmdsKCkKaj1tLmNyZWF0ZUVsZW1lbnQoImxpIikKay5hcHBlbmRDaGlsZChqKQpKLmRS
-KGopLmkoMCwiZWRpdCIpCmk9bS5jcmVhdGVFbGVtZW50KCJhIikKai5hcHBlbmRDaGlsZChpKQppLmNs
-YXNzTGlzdC5hZGQoImVkaXQtbGluayIpCmg9bC5jCmc9SC5FaihoKQppLnNldEF0dHJpYnV0ZSgiZGF0
-YS0iK25ldyBXLlN5KG5ldyBXLmk3KGkpKS5PKCJvZmZzZXQiKSxnKQpmPWwuYQpnPUguRWooZikKaS5z
-ZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhpKSkuTygibGluZSIpLGcpCmkuYXBw
-ZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgibGluZSAiK0guRWooZikpKQppLnNldEF0dHJpYnV0ZSgi
-aHJlZiIsTC5RNCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsUC5FRihbImxpbmUiLEguRWooZiksIm9m
-ZnNldCIsSC5FaihoKV0scyxzKSkpCmc9cC5hKG5ldyBMLkVFKGgsZixhKSkKby5hKG51bGwpClcuSkUo
-aSwiY2xpY2siLGcsITEscSkKai5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKCI6ICIrSC5Faihs
-LmIpKSl9fWlmKGMpTC5UMShudWxsKX0sCkZyOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHE9d2luZG93
-LmxvY2F0aW9uLHA9UC5oSygocSYmQy5FeCkuZ0RyKHEpK0guRWooYSkpCnE9dC5YCnE9UC5GbChxLHEp
-CmlmKGIhPW51bGwpcS5ZKDAsIm9mZnNldCIsSC5FaihiKSkKaWYoYyE9bnVsbClxLlkoMCwibGluZSIs
-SC5FaihjKSkKcS5ZKDAsImF1dGhUb2tlbiIsJC5VRSgpKQpwPXAubm0oMCxxKQpxPXdpbmRvdy5oaXN0
-b3J5CnM9dC56CnI9cC5nbkQoKQpxLnRvU3RyaW5nCnEucHVzaFN0YXRlKG5ldyBQLkJmKFtdLFtdKS5Q
-dihQLkZsKHMscykpLCIiLHIpfSwKRW46ZnVuY3Rpb24oYSl7dmFyIHM9Si5iYihkb2N1bWVudC5xdWVy
-eVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50LCIvIikKaWYoQy54Qi5uKGEscykpcmV0dXJuIEMu
-eEIuRyhhLHMubGVuZ3RoKQplbHNlIHJldHVybiBhfSwKQlg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXt9
-CnIuYT1hCmE9TC5FbihhKQpyLmE9YQpKLmRyKCQuRDkoKSxhKQpzPWRvY3VtZW50CkguRGgodC5nLHQu
-aCwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpzPW5ldyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgiLm5h
-di1wYW5lbCAubmF2LWxpbmsiKSx0LlcpCnMuSyhzLG5ldyBMLlZTKHIpKX0sCkJFOmZ1bmN0aW9uKGEs
-YixjKXt2YXIgcz0iLnJlZ2lvbnMiLHI9ZG9jdW1lbnQscT1yLnF1ZXJ5U2VsZWN0b3IocykscD1yLnF1
-ZXJ5U2VsZWN0b3IoIi5jb2RlIikKSi50SChxLGIuYSwkLktHKCkpCkoudEgocCxiLmIsJC5LRygpKQpM
-LkxIKGEsYi5kLGMpCkwudlUoKQpMLnlYKCIuY29kZSIsITApCkwueVgocywhMCl9LAp0WDpmdW5jdGlv
-bihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZT1kb2N1bWVudCxkPWUuY3JlYXRl
-RWxlbWVudCgidWwiKQphLmFwcGVuZENoaWxkKGQpCmZvcihzPWIubGVuZ3RoLHI9dC5YLHE9dC5aLHA9
-MDtwPGIubGVuZ3RoO2IubGVuZ3RoPT09c3x8KDAsSC5saykoYiksKytwKXtvPWJbcF0Kbj1lLmNyZWF0
-ZUVsZW1lbnQoImxpIikKZC5hcHBlbmRDaGlsZChuKQptPUouWUUobikKaWYoby5hPT09Qy5ZMil7bS5n
-RChuKS5pKDAsImRpciIpCmw9ZS5jcmVhdGVFbGVtZW50KCJzcGFuIikKbi5hcHBlbmRDaGlsZChsKQpt
-PUouWUUobCkKbS5nRChsKS5pKDAsImFycm93IikKbS5zaGYobCwiJiN4MjVCQzsiKQprPWUuY3JlYXRl
-RWxlbWVudCgic3BhbiIpCm4uYXBwZW5kQ2hpbGQoaykKSi5sNShrLCc8c3BhbiBjbGFzcz0ibWF0ZXJp
-YWwtaWNvbnMiPmZvbGRlcl9vcGVuPC9zcGFuPicpCm4uYXBwZW5kQ2hpbGQoZS5jcmVhdGVUZXh0Tm9k
-ZShvLmIpKQpMLnRYKG4sby5jKQpMLmt6KGwpfWVsc2V7bS5zaGYobiwnPHNwYW4gY2xhc3M9Im1hdGVy
-aWFsLWljb25zIj5pbnNlcnRfZHJpdmVfZmlsZTwvc3Bhbj4nKQpqPWUuY3JlYXRlRWxlbWVudCgiYSIp
-Cm4uYXBwZW5kQ2hpbGQoaikKbT1KLllFKGopCm0uZ0QoaikuaSgwLCJuYXYtbGluayIpCmouc2V0QXR0
-cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcoaikpLk8oIm5hbWUiKSxvLmQpCmouc2V0QXR0
-cmlidXRlKCJocmVmIixMLlE0KG8uZSxQLkZsKHIscikpKQpqLmFwcGVuZENoaWxkKGUuY3JlYXRlVGV4
-dE5vZGUoby5iKSkKbT1tLmdWbChqKQppPW0uJHRpCmg9aS5DKCJ+KDEpPyIpLmEobmV3IEwuVEQoKSkK
-cS5hKG51bGwpClcuSkUobS5hLG0uYixoLCExLGkuYykKZz1vLmYKaWYodHlwZW9mIGchPT0ibnVtYmVy
-IilyZXR1cm4gZy5vcygpCmlmKGc+MCl7Zj1lLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpuLmFwcGVuZENo
-aWxkKGYpCkouZFIoZikuaSgwLCJlZGl0LWNvdW50IikKbT0iIitnKyIgIgppZihnPT09MSlpPSJlZGl0
-IgplbHNlIGk9ImVkaXRzIgpmLnNldEF0dHJpYnV0ZSgidGl0bGUiLG0raSkKZi5hcHBlbmRDaGlsZChl
-LmNyZWF0ZVRleHROb2RlKEMuam4udyhnKSkpfX19fSwKdXo6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPWRv
-Y3VtZW50LHI9cy5jcmVhdGVFbGVtZW50KCJidXR0b24iKSxxPXQuayxwPXEuQygifigxKT8iKS5hKG5l
-dyBMLm0yKGEsYykpCnQuWi5hKG51bGwpClcuSkUociwiY2xpY2siLHAsITEscS5jKQpyLmFwcGVuZENo
-aWxkKHMuY3JlYXRlVGV4dE5vZGUoTS5PWChhLmEpKSkKYi5hcHBlbmRDaGlsZChyKX0sCkZ6OmZ1bmN0
-aW9uKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoPWEuYQppZihoPT1udWxsKXJldHVybgpz
-PWRvY3VtZW50CnI9cy5jcmVhdGVFbGVtZW50KCJwIikKcT1iLmFwcGVuZENoaWxkKHIpCnI9cy5jcmVh
-dGVFbGVtZW50KCJzcGFuIikKcD10LmkKSi5NdShyLEguVk0oWyJ0eXBlLWRlc2NyaXB0aW9uIl0scCkp
-CnIuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiQWN0aW9ucyIpKQpxLmFwcGVuZENoaWxkKHIp
-CnEuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiOiIpKQpvPXMuY3JlYXRlRWxlbWVudCgicCIp
-CmIuYXBwZW5kQ2hpbGQobykKZm9yKHI9aC5sZW5ndGgsbj10LlEsbT0wO208aC5sZW5ndGg7aC5sZW5n
-dGg9PT1yfHwoMCxILmxrKShoKSwrK20pe2w9aFttXQprPXMuY3JlYXRlRWxlbWVudCgiYSIpCm8uYXBw
-ZW5kQ2hpbGQoaykKay5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKGwuYSkpCmsuc2V0QXR0cmli
-dXRlKCJocmVmIixsLmIpCmo9bi5hKEguVk0oWyJhZGQtaGludC1saW5rIiwiYmVmb3JlLWFwcGx5Iiwi
-YnV0dG9uIl0scCkpCmk9Si5kUihrKQppLlYxKDApCmkuRlYoMCxqKX19LApDQzpmdW5jdGlvbihhNCxh
-NSxhNil7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQsYyxiLGEsYTAsYTEsYTIsYTMK
-Zm9yKHM9YTQuZixyPXMubGVuZ3RoLHE9dC5pLHA9dC5RLG89MDtvPHMubGVuZ3RoO3MubGVuZ3RoPT09
-cnx8KDAsSC5saykocyksKytvKXtuPXNbb10KbT1kb2N1bWVudApsPW0uY3JlYXRlRWxlbWVudCgicCIp
-Cms9cC5hKEguVk0oWyJ0cmFjZSJdLHEpKQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykKaT1hNS5h
-cHBlbmRDaGlsZChsKQpsPW0uY3JlYXRlRWxlbWVudCgic3BhbiIpCms9cC5hKEguVk0oWyJ0eXBlLWRl
-c2NyaXB0aW9uIl0scSkpCmo9Si5kUihsKQpqLlYxKDApCmouRlYoMCxrKQpsLmFwcGVuZENoaWxkKG0u
-Y3JlYXRlVGV4dE5vZGUobi5hKSkKaS5hcHBlbmRDaGlsZChsKQppLmFwcGVuZENoaWxkKG0uY3JlYXRl
-VGV4dE5vZGUoIjoiKSkKbD1tLmNyZWF0ZUVsZW1lbnQoInVsIikKaz1wLmEoSC5WTShbInRyYWNlIl0s
-cSkpCmo9Si5kUihsKQpqLlYxKDApCmouRlYoMCxrKQpoPWkuYXBwZW5kQ2hpbGQobCkKZm9yKGw9bi5i
-LGs9bC5sZW5ndGgsZz0wO2c8bC5sZW5ndGg7bC5sZW5ndGg9PT1rfHwoMCxILmxrKShsKSwrK2cpe2Y9
-bFtnXQplPW0uY3JlYXRlRWxlbWVudCgibGkiKQpoLmFwcGVuZENoaWxkKGUpCmQ9bS5jcmVhdGVFbGVt
-ZW50KCJzcGFuIikKYz1wLmEoSC5WTShbImZ1bmN0aW9uIl0scSkpCmo9Si5kUihkKQpqLlYxKDApCmou
-RlYoMCxjKQpjPWYuYgpMLmtEKGQsYz09bnVsbD8idW5rbm93biI6YykKZS5hcHBlbmRDaGlsZChkKQpi
-PWYuYwppZihiIT1udWxsKXtlLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoIiAoIikpCmE9Yi5i
-CmEwPW0uY3JlYXRlRWxlbWVudCgiYSIpCmEwLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoSC5F
-aihiLmMpKyI6IitILkVqKGEpKSkKYTAuc2V0QXR0cmlidXRlKCJocmVmIixiLmEpCmEwLmNsYXNzTGlz
-dC5hZGQoIm5hdi1saW5rIikKZS5hcHBlbmRDaGlsZChhMCkKZS5hcHBlbmRDaGlsZChtLmNyZWF0ZVRl
-eHROb2RlKCIpIikpfWUuYXBwZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgiOiAiKSkKZD1mLmEKTC5r
-RChlLGQ9PW51bGw/InVua25vd24iOmQpCmQ9Zi5kCmlmKGQubGVuZ3RoIT09MCl7Yz1tLmNyZWF0ZUVs
-ZW1lbnQoInAiKQphMT1wLmEoSC5WTShbImRyYXdlciIsImJlZm9yZS1hcHBseSJdLHEpKQpqPUouZFIo
-YykKai5WMSgwKQpqLkZWKDAsYTEpCmEyPWUuYXBwZW5kQ2hpbGQoYykKZm9yKGM9ZC5sZW5ndGgsYTM9
-MDthMzxkLmxlbmd0aDtkLmxlbmd0aD09PWN8fCgwLEgubGspKGQpLCsrYTMpTC51eihkW2EzXSxhMixi
-KX19fX0sClVzOmZ1bmN0aW9uKGEpe3JldHVybiBKLlU2KGEpLnRnKGEsIj8iKT9DLnhCLk5qKGEsMCxD
-LnhCLk9ZKGEsIj8iKSk6YX0sCmtEOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPUguVk0oYi5zcGxpdCgi
-LiIpLHQucykscD1DLk5tLmd0SChxKSxvPWRvY3VtZW50CmEuYXBwZW5kQ2hpbGQoby5jcmVhdGVUZXh0
-Tm9kZShwKSkKZm9yKHA9SC5xQyhxLDEsbnVsbCx0Lk4pLHA9bmV3IEguYTcocCxwLmdBKHApLHAuJHRp
-LkMoImE3PGFMLkU+IikpLHM9Si5ZRShhKTtwLkYoKTspe3I9cC5kCnMubnooYSwiYmVmb3JlZW5kIiwi
-JiM4MjAzOy4iLG51bGwsbnVsbCkKYS5hcHBlbmRDaGlsZChvLmNyZWF0ZVRleHROb2RlKHIpKX19LApl
-OmZ1bmN0aW9uIGUoKXt9LApWVzpmdW5jdGlvbiBWVyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhp
-cy5jPWN9LApvWjpmdW5jdGlvbiBvWigpe30sCmpyOmZ1bmN0aW9uIGpyKCl7fSwKcWw6ZnVuY3Rpb24g
-cWwoKXt9LApIaTpmdW5jdGlvbiBIaSgpe30sCkJUOmZ1bmN0aW9uIEJUKCl7fSwKUFk6ZnVuY3Rpb24g
-UFkoKXt9LApMOmZ1bmN0aW9uIEwoKXt9LApXeDpmdW5jdGlvbiBXeChhLGIpe3RoaXMuYT1hCnRoaXMu
-Yj1ifSwKQU86ZnVuY3Rpb24gQU8oYSl7dGhpcy5hPWF9LApkTjpmdW5jdGlvbiBkTihhKXt0aGlzLmE9
-YX0sCkhvOmZ1bmN0aW9uIEhvKGEpe3RoaXMuYT1hfSwKeHo6ZnVuY3Rpb24geHooYSxiKXt0aGlzLmE9
-YQp0aGlzLmI9Yn0sCklDOmZ1bmN0aW9uIElDKCl7fSwKZkM6ZnVuY3Rpb24gZkMoYSxiKXt0aGlzLmE9
-YQp0aGlzLmI9Yn0sCm5UOmZ1bmN0aW9uIG5UKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9
-Y30sCk5ZOmZ1bmN0aW9uIE5ZKGEpe3RoaXMuYT1hfSwKdWU6ZnVuY3Rpb24gdWUoKXt9LAplWDpmdW5j
-dGlvbiBlWCgpe30sCkVFOmZ1bmN0aW9uIEVFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9
-Y30sClFMOmZ1bmN0aW9uIFFMKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApWUzpmdW5jdGlvbiBWUyhh
-KXt0aGlzLmE9YX0sClREOmZ1bmN0aW9uIFREKCl7fSwKbTI6ZnVuY3Rpb24gbTIoYSxiKXt0aGlzLmE9
-YQp0aGlzLmI9Yn0sClhBOmZ1bmN0aW9uIFhBKCl7fSwKbUs6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAs
-byxuLG09SC5WTShbXSx0LmNRKQpmb3Iocz1KLklUKHQuVS5hKGEpKTtzLkYoKTspe3I9cy5nbCgpCnE9
-Si5VNihyKQpwPUwucDIoSC5oKHEucShyLCJ0eXBlIikpKQpvPUguaChxLnEociwibmFtZSIpKQpuPXEu
-cShyLCJzdWJ0cmVlIikKbj1uPT1udWxsP251bGw6TC5tSyhuKQpDLk5tLmkobSxuZXcgTC5aWihwLG8s
-bixILmgocS5xKHIsInBhdGgiKSksSC5oKHEucShyLCJocmVmIikpLEgudVAocS5xKHIsImVkaXRDb3Vu
-dCIpKSkpfXJldHVybiBtfSwKVkQ6ZnVuY3Rpb24oYSl7dmFyIHMscixxPUguVk0oW10sdC5HKQpmb3Io
-cz1hLmxlbmd0aCxyPTA7cjxhLmxlbmd0aDthLmxlbmd0aD09PXN8fCgwLEgubGspKGEpLCsrcilDLk5t
-LmkocSxhW3JdLkx0KCkpCnJldHVybiBxfSwKcDI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UiZGly
-ZWN0b3J5IjpyZXR1cm4gQy5ZMgpjYXNlImZpbGUiOnJldHVybiBDLnJmCmRlZmF1bHQ6dGhyb3cgSC5i
-KFAuUFYoIlVucmVjb2duaXplZCBuYXZpZ2F0aW9uIHRyZWUgbm9kZSB0eXBlOiAiK0guRWooYSkpKX19
-LAp2eTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSBDLlkyOnJldHVybiJkaXJlY3RvcnkiCmNhc2Ug
-Qy5yZjpyZXR1cm4iZmlsZSJ9dGhyb3cgSC5iKFAuUFYoIlVucmVjb2duaXplZCBuYXZpZ2F0aW9uIHRy
-ZWUgbm9kZSB0eXBlOiAiK2EudygwKSkpfSwKWlo6ZnVuY3Rpb24gWlooYSxiLGMsZCxlLGYpe3ZhciBf
-PXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWZ9LApPOTpmdW5jdGlvbiBPOShh
-KXt0aGlzLmI9YX0sCklWOmZ1bmN0aW9uIElWKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5kPWEKXy5lPWIK
-Xy5mPWMKXy5yPWR9fSxYPXsKQ0w6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG49Yi54WihhKQpi
-LmhLKGEpCmlmKG4hPW51bGwpYT1KLktWKGEsbi5sZW5ndGgpCnM9dC5zCnI9SC5WTShbXSxzKQpxPUgu
-Vk0oW10scykKcz1hLmxlbmd0aAppZihzIT09MCYmYi5yNChDLnhCLlcoYSwwKSkpe2lmKDA+PXMpcmV0
-dXJuIEguT0goYSwwKQpDLk5tLmkocSxhWzBdKQpwPTF9ZWxzZXtDLk5tLmkocSwiIikKcD0wfWZvcihv
-PXA7bzxzOysrbylpZihiLnI0KEMueEIuVyhhLG8pKSl7Qy5ObS5pKHIsQy54Qi5OaihhLHAsbykpCkMu
-Tm0uaShxLGFbb10pCnA9bysxfWlmKHA8cyl7Qy5ObS5pKHIsQy54Qi5HKGEscCkpCkMuTm0uaShxLCIi
-KX1yZXR1cm4gbmV3IFguV0QoYixuLHIscSl9LApXRDpmdW5jdGlvbiBXRChhLGIsYyxkKXt2YXIgXz10
-aGlzCl8uYT1hCl8uYj1iCl8uZD1jCl8uZT1kfSwKSTc6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBYLmR2
-KGEpfSwKZHY6ZnVuY3Rpb24gZHYoYSl7dGhpcy5hPWF9fSxPPXsKUmg6ZnVuY3Rpb24oKXt2YXIgcyxy
-PW51bGwKaWYoUC51bygpLmdGaSgpIT09ImZpbGUiKXJldHVybiAkLkViKCkKcz1QLnVvKCkKaWYoIUMu
-eEIuVGMocy5nSWkocyksIi8iKSlyZXR1cm4gJC5FYigpCmlmKFAuS0wociwiYS9iIixyLHIscixyLHIp
-LnQ0KCk9PT0iYVxcYiIpcmV0dXJuICQuS2soKQpyZXR1cm4gJC5iRCgpfSwKekw6ZnVuY3Rpb24gekwo
-KXt9fSxFPXtPRjpmdW5jdGlvbiBPRihhLGIsYyl7dGhpcy5kPWEKdGhpcy5lPWIKdGhpcy5mPWN9fSxG
-PXtydTpmdW5jdGlvbiBydShhLGIsYyxkKXt2YXIgXz10aGlzCl8uZD1hCl8uZT1iCl8uZj1jCl8ucj1k
-fX0sRD17CmFiOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbz1udWxsCnRyeXtvPVAudW8oKX1jYXRjaChz
-KXtpZih0Lmc4LmIoSC5SdShzKSkpe3I9JC5GZgppZihyIT1udWxsKXJldHVybiByCnRocm93IHN9ZWxz
-ZSB0aHJvdyBzfWlmKEouUk0obywkLkk2KSl7cj0kLkZmCnIudG9TdHJpbmcKcmV0dXJuIHJ9JC5JNj1v
-CmlmKCQuSGsoKT09JC5FYigpKXI9JC5GZj1vLlpJKCIuIikudygwKQplbHNle3E9by50NCgpCnA9cS5s
-ZW5ndGgtMQpyPSQuRmY9cD09PTA/cTpDLnhCLk5qKHEsMCxwKX1yLnRvU3RyaW5nCnJldHVybiByfX0K
-dmFyIHc9W0MsSCxKLFAsVyxNLFUsQixULEwsWCxPLEUsRixEXQpodW5rSGVscGVycy5zZXRGdW5jdGlv
-bk5hbWVzSWZOZWNlc3NhcnkodykKdmFyICQ9e30KSC5GSy5wcm90b3R5cGU9e30KSi52Qi5wcm90b3R5
-cGU9ewpETjpmdW5jdGlvbihhLGIpe3JldHVybiBhPT09Yn0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4g
-SC5lUShhKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkluc3RhbmNlIG9mICciK0guRWooSC5NKGEpKSsi
-JyJ9LAplNzpmdW5jdGlvbihhLGIpe3Quby5hKGIpCnRocm93IEguYihQLmxyKGEsYi5nV2EoKSxiLmdu
-ZCgpLGIuZ1ZtKCkpKX19CkoueUUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5n
-KGEpfSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBhPzUxOTAxODoyMTgxNTl9LAokaWEyOjF9Ckoud2Uu
-cHJvdG90eXBlPXsKRE46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09Yn0sCnc6ZnVuY3Rpb24oYSl7
-cmV0dXJuIm51bGwifSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfSwKZTc6ZnVuY3Rpb24oYSxiKXty
-ZXR1cm4gdGhpcy5TaihhLHQuby5hKGIpKX0sCiRpYzg6MX0KSi5NRi5wcm90b3R5cGU9ewpnaU86ZnVu
-Y3Rpb24oYSl7cmV0dXJuIDB9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAokaXZtOjF9
-CkouaUMucHJvdG90eXBlPXt9Ckoua2QucHJvdG90eXBlPXt9CkouYzUucHJvdG90eXBlPXsKdzpmdW5j
-dGlvbihhKXt2YXIgcz1hWyQudygpXQppZihzPT1udWxsKXJldHVybiB0aGlzLnQoYSkKcmV0dXJuIkph
-dmFTY3JpcHQgZnVuY3Rpb24gZm9yICIrSC5FaihKLmoocykpfSwKJGlFSDoxfQpKLmpkLnByb3RvdHlw
-ZT17CmRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILmpWKGEsSC50NihhKS5DKCJAPDE+IikuS3Eo
-YikuQygialY8MSwyPiIpKX0sCmk6ZnVuY3Rpb24oYSxiKXtILnQ2KGEpLmMuYShiKQppZighIWEuZml4
-ZWQkbGVuZ3RoKUgudihQLkw0KCJhZGQiKSkKYS5wdXNoKGIpfSwKVzQ6ZnVuY3Rpb24oYSxiKXt2YXIg
-cwppZighIWEuZml4ZWQkbGVuZ3RoKUgudihQLkw0KCJyZW1vdmVBdCIpKQpzPWEubGVuZ3RoCmlmKGI+
-PXMpdGhyb3cgSC5iKFAuTzcoYixudWxsKSkKcmV0dXJuIGEuc3BsaWNlKGIsMSlbMF19LApVRzpmdW5j
-dGlvbihhLGIsYyl7dmFyIHMscgpILnQ2KGEpLkMoImNYPDE+IikuYShjKQppZighIWEuZml4ZWQkbGVu
-Z3RoKUgudihQLkw0KCJpbnNlcnRBbGwiKSkKUC53QShiLDAsYS5sZW5ndGgsImluZGV4IikKaWYoIXQu
-Yi5iKGMpKWM9Si5SWChjKQpzPUouSG0oYykKYS5sZW5ndGg9YS5sZW5ndGgrcwpyPWIrcwp0aGlzLllX
-KGEscixhLmxlbmd0aCxhLGIpCnRoaXMudmcoYSxiLHIsYyl9LApGVjpmdW5jdGlvbihhLGIpe3ZhciBz
-CkgudDYoYSkuQygiY1g8MT4iKS5hKGIpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52KFAuTDQoImFkZEFs
-bCIpKQpmb3Iocz1KLklUKGIpO3MuRigpOylhLnB1c2gocy5nbCgpKX0sCkUyOmZ1bmN0aW9uKGEsYixj
-KXt2YXIgcz1ILnQ2KGEpCnJldHVybiBuZXcgSC5sSihhLHMuS3EoYykuQygiMSgyKSIpLmEoYikscy5D
-KCJAPDE+IikuS3EoYykuQygibEo8MSwyPiIpKX0sCkg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPVAuTzgo
-YS5sZW5ndGgsIiIsITEsdC5OKQpmb3Iocz0wO3M8YS5sZW5ndGg7KytzKXRoaXMuWShyLHMsSC5Faihh
-W3NdKSkKcmV0dXJuIHIuam9pbihiKX0sCmVSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEgucUMoYSxiLG51
-bGwsSC50NihhKS5jKX0sCk4wOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscQpkLmEoYikKSC50Nihh
-KS5LcShkKS5DKCIxKDEsMikiKS5hKGMpCnM9YS5sZW5ndGgKZm9yKHI9YixxPTA7cTxzOysrcSl7cj1j
-LiQyKHIsYVtxXSkKaWYoYS5sZW5ndGghPT1zKXRocm93IEguYihQLmE0KGEpKX1yZXR1cm4gcn0sCkh0
-OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbwpILnQ2KGEpLkMoImEyKDEpIikuYShiKQpzPWEubGVu
-Z3RoCmZvcihyPW51bGwscT0hMSxwPTA7cDxzOysrcCl7bz1hW3BdCmlmKEgub1QoYi4kMShvKSkpe2lm
-KHEpdGhyb3cgSC5iKEguQW0oKSkKcj1vCnE9ITB9aWYocyE9PWEubGVuZ3RoKXRocm93IEguYihQLmE0
-KGEpKX1pZihxKXJldHVybiByCnRocm93IEguYihILldwKCkpfSwKRTpmdW5jdGlvbihhLGIpe2lmKGI8
-MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpyZXR1cm4gYVtiXX0sCmd0SDpmdW5jdGlvbihh
-KXtpZihhLmxlbmd0aD4wKXJldHVybiBhWzBdCnRocm93IEguYihILldwKCkpfSwKZ3JaOmZ1bmN0aW9u
-KGEpe3ZhciBzPWEubGVuZ3RoCmlmKHM+MClyZXR1cm4gYVtzLTFdCnRocm93IEguYihILldwKCkpfSwK
-WVc6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcyxyLHEscCxvCkgudDYoYSkuQygiY1g8MT4iKS5hKGQp
-CmlmKCEhYS5pbW11dGFibGUkbGlzdClILnYoUC5MNCgic2V0UmFuZ2UiKSkKUC5qQihiLGMsYS5sZW5n
-dGgpCnM9Yy1iCmlmKHM9PT0wKXJldHVybgpQLmsxKGUsInNraXBDb3VudCIpCmlmKHQuai5iKGQpKXty
-PWQKcT1lfWVsc2V7cj1KLkE1KGQsZSkudHQoMCwhMSkKcT0wfXA9Si5VNihyKQppZihxK3M+cC5nQShy
-KSl0aHJvdyBILmIoSC5hcigpKQppZihxPGIpZm9yKG89cy0xO28+PTA7LS1vKWFbYitvXT1wLnEocixx
-K28pCmVsc2UgZm9yKG89MDtvPHM7KytvKWFbYitvXT1wLnEocixxK28pfSwKdmc6ZnVuY3Rpb24oYSxi
-LGMsZCl7cmV0dXJuIHRoaXMuWVcoYSxiLGMsZCwwKX0sClZyOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpI
-LnQ2KGEpLkMoImEyKDEpIikuYShiKQpzPWEubGVuZ3RoCmZvcihyPTA7cjxzOysrcil7aWYoSC5vVChi
-LiQxKGFbcl0pKSlyZXR1cm4hMAppZihhLmxlbmd0aCE9PXMpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVy
-biExfSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIgcwpmb3Iocz0wO3M8YS5sZW5ndGg7KytzKWlmKEouUk0o
-YVtzXSxiKSlyZXR1cm4hMApyZXR1cm4hMX0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGg9
-PT0wfSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aCE9PTB9LAp3OmZ1bmN0aW9uKGEpe3Jl
-dHVybiBQLldFKGEsIlsiLCJdIil9LAp0dDpmdW5jdGlvbihhLGIpe3ZhciBzPUguVk0oYS5zbGljZSgw
-KSxILnQ2KGEpKQpyZXR1cm4gc30sCmJyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnR0KGEsITApfSwK
-Z206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBKLm0xKGEsYS5sZW5ndGgsSC50NihhKS5DKCJtMTwxPiIp
-KX0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gSC5lUShhKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBh
-Lmxlbmd0aH0sCnNBOmZ1bmN0aW9uKGEsYil7aWYoISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgic2V0
-IGxlbmd0aCIpKQppZihiPDApdGhyb3cgSC5iKFAuVEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVsbCkp
-CmEubGVuZ3RoPWJ9LApxOmZ1bmN0aW9uKGEsYil7SC51UChiKQppZihiPj1hLmxlbmd0aHx8YjwwKXRo
-cm93IEguYihILkhZKGEsYikpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC50NihhKS5j
-LmEoYykKaWYoISFhLmltbXV0YWJsZSRsaXN0KUgudihQLkw0KCJpbmRleGVkIHNldCIpKQppZihiPj1h
-Lmxlbmd0aHx8YjwwKXRocm93IEguYihILkhZKGEsYikpCmFbYl09Y30sCiRpYlE6MSwKJGljWDoxLAok
-aXpNOjF9CkouUG8ucHJvdG90eXBlPXt9CkoubTEucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1
-cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPXIuYSxwPXEubGVuZ3RoCmlmKHIu
-YiE9PXApdGhyb3cgSC5iKEgubGsocSkpCnM9ci5jCmlmKHM+PXApe3Iuc00obnVsbCkKcmV0dXJuITF9
-ci5zTShxW3NdKTsrK3IuYwpyZXR1cm4hMH0sCnNNOmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5D
-KCIxPyIpLmEoYSl9LAokaUFuOjF9CkoucUkucHJvdG90eXBlPXsKelE6ZnVuY3Rpb24oYSl7aWYoYT4w
-KXtpZihhIT09MS8wKXJldHVybiBNYXRoLnJvdW5kKGEpfWVsc2UgaWYoYT4tMS8wKXJldHVybiAwLU1h
-dGgucm91bmQoMC1hKQp0aHJvdyBILmIoUC5MNCgiIithKyIucm91bmQoKSIpKX0sCnc6ZnVuY3Rpb24o
-YSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiItMC4wIgplbHNlIHJldHVybiIiK2F9LApnaU86ZnVuY3Rp
-b24oYSl7dmFyIHMscixxLHAsbz1hfDAKaWYoYT09PW8pcmV0dXJuIG8mNTM2ODcwOTExCnM9TWF0aC5h
-YnMoYSkKcj1NYXRoLmxvZyhzKS8wLjY5MzE0NzE4MDU1OTk0NTN8MApxPU1hdGgucG93KDIscikKcD1z
-PDE/cy9xOnEvcwpyZXR1cm4oKHAqOTAwNzE5OTI1NDc0MDk5MnwwKSsocCozNTQyMjQzMTgxMTc2NTIx
-fDApKSo1OTkxOTcrcioxMjU5JjUzNjg3MDkxMX0sCnpZOmZ1bmN0aW9uKGEsYil7dmFyIHM9YSViCmlm
-KHM9PT0wKXJldHVybiAwCmlmKHM+MClyZXR1cm4gcwppZihiPDApcmV0dXJuIHMtYgplbHNlIHJldHVy
-biBzK2J9LApCVTpmdW5jdGlvbihhLGIpe3JldHVybihhfDApPT09YT9hL2J8MDp0aGlzLkRKKGEsYil9
-LApESjpmdW5jdGlvbihhLGIpe3ZhciBzPWEvYgppZihzPj0tMjE0NzQ4MzY0OCYmczw9MjE0NzQ4MzY0
-NylyZXR1cm4gc3wwCmlmKHM+MCl7aWYocyE9PTEvMClyZXR1cm4gTWF0aC5mbG9vcihzKX1lbHNlIGlm
-KHM+LTEvMClyZXR1cm4gTWF0aC5jZWlsKHMpCnRocm93IEguYihQLkw0KCJSZXN1bHQgb2YgdHJ1bmNh
-dGluZyBkaXZpc2lvbiBpcyAiK0guRWoocykrIjogIitILkVqKGEpKyIgfi8gIitiKSl9LAp3RzpmdW5j
-dGlvbihhLGIpe3ZhciBzCmlmKGE+MClzPXRoaXMucDMoYSxiKQplbHNle3M9Yj4zMT8zMTpiCnM9YT4+
-cz4+PjB9cmV0dXJuIHN9LApiZjpmdW5jdGlvbihhLGIpe2lmKGI8MCl0aHJvdyBILmIoSC50TChiKSkK
-cmV0dXJuIHRoaXMucDMoYSxiKX0sCnAzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI+MzE/MDphPj4+Yn0s
-CiRpQ1A6MSwKJGlMWjoxfQpKLmJVLnByb3RvdHlwZT17JGlJZjoxfQpKLlZBLnByb3RvdHlwZT17fQpK
-LkRyLnByb3RvdHlwZT17Ck8yOmZ1bmN0aW9uKGEsYil7aWYoYjwwKXRocm93IEguYihILkhZKGEsYikp
-CmlmKGI+PWEubGVuZ3RoKUgudihILkhZKGEsYikpCnJldHVybiBhLmNoYXJDb2RlQXQoYil9LApXOmZ1
-bmN0aW9uKGEsYil7aWYoYj49YS5sZW5ndGgpdGhyb3cgSC5iKEguSFkoYSxiKSkKcmV0dXJuIGEuY2hh
-ckNvZGVBdChiKX0sCmRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILnVuKGIsYSwwKX0sCmg6ZnVu
-Y3Rpb24oYSxiKXtpZih0eXBlb2YgYiE9InN0cmluZyIpdGhyb3cgSC5iKFAuTDMoYixudWxsLG51bGwp
-KQpyZXR1cm4gYStifSwKVGM6ZnVuY3Rpb24oYSxiKXt2YXIgcz1iLmxlbmd0aCxyPWEubGVuZ3RoCmlm
-KHM+cilyZXR1cm4hMQpyZXR1cm4gYj09PXRoaXMuRyhhLHItcyl9LAppNzpmdW5jdGlvbihhLGIsYyxk
-KXt2YXIgcz1QLmpCKGIsYyxhLmxlbmd0aCkscj1hLnN1YnN0cmluZygwLGIpLHE9YS5zdWJzdHJpbmco
-cykKcmV0dXJuIHIrZCtxfSwKUWk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzCmlmKGM8MHx8Yz5hLmxlbmd0
-aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKcz1jK2IubGVuZ3RoCmlmKHM+
-YS5sZW5ndGgpcmV0dXJuITEKcmV0dXJuIGI9PT1hLnN1YnN0cmluZyhjLHMpfSwKbjpmdW5jdGlvbihh
-LGIpe3JldHVybiB0aGlzLlFpKGEsYiwwKX0sCk5qOmZ1bmN0aW9uKGEsYixjKXtpZihjPT1udWxsKWM9
-YS5sZW5ndGgKaWYoYjwwKXRocm93IEguYihQLk83KGIsbnVsbCkpCmlmKGI+Yyl0aHJvdyBILmIoUC5P
-NyhiLG51bGwpKQppZihjPmEubGVuZ3RoKXRocm93IEguYihQLk83KGMsbnVsbCkpCnJldHVybiBhLnN1
-YnN0cmluZyhiLGMpfSwKRzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLk5qKGEsYixudWxsKX0sCmhj
-OmZ1bmN0aW9uKGEpe3JldHVybiBhLnRvTG93ZXJDYXNlKCl9LApiUzpmdW5jdGlvbihhKXt2YXIgcyxy
-LHEscD1hLnRyaW0oKSxvPXAubGVuZ3RoCmlmKG89PT0wKXJldHVybiBwCmlmKHRoaXMuVyhwLDApPT09
-MTMzKXtzPUoubW0ocCwxKQppZihzPT09bylyZXR1cm4iIn1lbHNlIHM9MApyPW8tMQpxPXRoaXMuTzIo
-cCxyKT09PTEzMz9KLmMxKHAscik6bwppZihzPT09MCYmcT09PW8pcmV0dXJuIHAKcmV0dXJuIHAuc3Vi
-c3RyaW5nKHMscSl9LApJeDpmdW5jdGlvbihhLGIpe3ZhciBzLHIKaWYoMD49YilyZXR1cm4iIgppZihi
-PT09MXx8YS5sZW5ndGg9PT0wKXJldHVybiBhCmlmKGIhPT1iPj4+MCl0aHJvdyBILmIoQy5FcSkKZm9y
-KHM9YSxyPSIiOyEwOyl7aWYoKGImMSk9PT0xKXI9cytyCmI9Yj4+PjEKaWYoYj09PTApYnJlYWsKcys9
-c31yZXR1cm4gcn0sClhVOmZ1bmN0aW9uKGEsYixjKXt2YXIgcwppZihjPDB8fGM+YS5sZW5ndGgpdGhy
-b3cgSC5iKFAuVEUoYywwLGEubGVuZ3RoLG51bGwsbnVsbCkpCnM9YS5pbmRleE9mKGIsYykKcmV0dXJu
-IHN9LApPWTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlhVKGEsYiwwKX0sClBrOmZ1bmN0aW9uKGEs
-YixjKXt2YXIgcyxyCmlmKGM9PW51bGwpYz1hLmxlbmd0aAplbHNlIGlmKGM8MHx8Yz5hLmxlbmd0aCl0
-aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKcz1iLmxlbmd0aApyPWEubGVuZ3Ro
-CmlmKGMrcz5yKWM9ci1zCnJldHVybiBhLmxhc3RJbmRleE9mKGIsYyl9LApjbjpmdW5jdGlvbihhLGIp
-e3JldHVybiB0aGlzLlBrKGEsYixudWxsKX0sCklzOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1hLmxlbmd0
-aAppZihjPnMpdGhyb3cgSC5iKFAuVEUoYywwLHMsbnVsbCxudWxsKSkKcmV0dXJuIEguU1EoYSxiLGMp
-fSwKdGc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5JcyhhLGIsMCl9LAp3OmZ1bmN0aW9uKGEpe3Jl
-dHVybiBhfSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBzLHIscQpmb3Iocz1hLmxlbmd0aCxyPTAscT0wO3E8
-czsrK3Epe3I9cithLmNoYXJDb2RlQXQocSkmNTM2ODcwOTExCnI9cisoKHImNTI0Mjg3KTw8MTApJjUz
-Njg3MDkxMQpyXj1yPj42fXI9cisoKHImNjcxMDg4NjMpPDwzKSY1MzY4NzA5MTEKcl49cj4+MTEKcmV0
-dXJuIHIrKChyJjE2MzgzKTw8MTUpJjUzNjg3MDkxMX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxl
-bmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCmlmKGI+PWEubGVuZ3RofHwhMSl0aHJvdyBILmIo
-SC5IWShhLGIpKQpyZXR1cm4gYVtiXX0sCiRpdlg6MSwKJGlxVToxfQpILkJSLnByb3RvdHlwZT17Cmdt
-OmZ1bmN0aW9uKGEpe3ZhciBzPUguTGgodGhpcykKcmV0dXJuIG5ldyBILkU3KEouSVQodGhpcy5nT04o
-KSkscy5DKCJAPDE+IikuS3Eocy5RWzFdKS5DKCJFNzwxLDI+IikpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0
-dXJuIEouSG0odGhpcy5nT04oKSl9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudVUodGhpcy5nT04o
-KSl9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRjcodGhpcy5nT04oKSl9LAplUjpmdW5jdGlvbihh
-LGIpe3ZhciBzPUguTGgodGhpcykKcmV0dXJuIEguR0ooSi5BNSh0aGlzLmdPTigpLGIpLHMuYyxzLlFb
-MV0pfSwKRTpmdW5jdGlvbihhLGIpe3JldHVybiBILkxoKHRoaXMpLlFbMV0uYShKLkdBKHRoaXMuZ09O
-KCksYikpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gSi5qKHRoaXMuZ09OKCkpfX0KSC5FNy5wcm90b3R5
-cGU9ewpGOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5GKCl9LApnbDpmdW5jdGlvbigpe3JldHVybiB0
-aGlzLiR0aS5RWzFdLmEodGhpcy5hLmdsKCkpfSwKJGlBbjoxfQpILlp5LnByb3RvdHlwZT17CmdPTjpm
-dW5jdGlvbigpe3JldHVybiB0aGlzLmF9fQpILm9sLnByb3RvdHlwZT17JGliUToxfQpILlVxLnByb3Rv
-dHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy4kdGkuUVsxXS5hKEoueDkodGhpcy5hLEgu
-dVAoYikpKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPXRoaXMuJHRpCkoudTkodGhpcy5hLGIscy5j
-LmEocy5RWzFdLmEoYykpKX0sCiRpYlE6MSwKJGl6TToxfQpILmpWLnByb3RvdHlwZT17CmRyOmZ1bmN0
-aW9uKGEsYil7cmV0dXJuIG5ldyBILmpWKHRoaXMuYSx0aGlzLiR0aS5DKCJAPDE+IikuS3EoYikuQygi
-alY8MSwyPiIpKX0sCmdPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF9fQpILm4ucHJvdG90eXBlPXsK
-dzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMhPW51bGw/IkxhdGVJbml0aWFsaXphdGlv
-bkVycm9yOiAiK3M6IkxhdGVJbml0aWFsaXphdGlvbkVycm9yIn19CkgucjMucHJvdG90eXBlPXsKdzpm
-dW5jdGlvbihhKXt2YXIgcz0iUmVhY2hhYmlsaXR5RXJyb3I6ICIrdGhpcy5hCnJldHVybiBzfX0KSC5x
-ai5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCnE6ZnVuY3Rp
-b24oYSxiKXtyZXR1cm4gQy54Qi5PMih0aGlzLmEsSC51UChiKSl9fQpILmJRLnByb3RvdHlwZT17fQpI
-LmFMLnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMKcmV0dXJuIG5ldyBILmE3KHMs
-cy5nQShzKSxILkxoKHMpLkMoImE3PGFMLkU+IikpfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlz
-LmdBKHRoaXMpPT09MH0sCkg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscD10aGlzLG89cC5nQShwKQpp
-ZihiLmxlbmd0aCE9PTApe2lmKG89PT0wKXJldHVybiIiCnM9SC5FaihwLkUoMCwwKSkKaWYobyE9PXAu
-Z0EocCkpdGhyb3cgSC5iKFAuYTQocCkpCmZvcihyPXMscT0xO3E8bzsrK3Epe3I9citiK0guRWoocC5F
-KDAscSkpCmlmKG8hPT1wLmdBKHApKXRocm93IEguYihQLmE0KHApKX1yZXR1cm4gci5jaGFyQ29kZUF0
-KDApPT0wP3I6cn1lbHNle2ZvcihxPTAscj0iIjtxPG87KytxKXtyKz1ILkVqKHAuRSgwLHEpKQppZihv
-IT09cC5nQShwKSl0aHJvdyBILmIoUC5hNChwKSl9cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9
-fSwKZXY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5HRygwLEguTGgodGhpcykuQygiYTIoYUwuRSki
-KS5hKGIpKX0sCkUyOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5s
-Sih0aGlzLHMuS3EoYykuQygiMShhTC5FKSIpLmEoYikscy5DKCJAPGFMLkU+IikuS3EoYykuQygibEo8
-MSwyPiIpKX0sCmVSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEgucUModGhpcyxiLG51bGwsSC5MaCh0aGlz
-KS5DKCJhTC5FIikpfSwKdHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUC5DSCh0aGlzLCEwLEguTGgodGhp
-cykuQygiYUwuRSIpKX0sCmJyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnR0KGEsITApfX0KSC5uSC5w
-cm90b3R5cGU9ewpIZDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyPXRoaXMuYgpQLmsxKHIsInN0YXJ0
-IikKcz10aGlzLmMKaWYocyE9bnVsbCl7UC5rMShzLCJlbmQiKQppZihyPnMpdGhyb3cgSC5iKFAuVEUo
-ciwwLHMsInN0YXJ0IixudWxsKSl9fSwKZ1VEOmZ1bmN0aW9uKCl7dmFyIHM9Si5IbSh0aGlzLmEpLHI9
-dGhpcy5jCmlmKHI9PW51bGx8fHI+cylyZXR1cm4gcwpyZXR1cm4gcn0sCmdBczpmdW5jdGlvbigpe3Zh
-ciBzPUouSG0odGhpcy5hKSxyPXRoaXMuYgppZihyPnMpcmV0dXJuIHMKcmV0dXJuIHJ9LApnQTpmdW5j
-dGlvbihhKXt2YXIgcyxyPUouSG0odGhpcy5hKSxxPXRoaXMuYgppZihxPj1yKXJldHVybiAwCnM9dGhp
-cy5jCmlmKHM9PW51bGx8fHM+PXIpcmV0dXJuIHItcQppZih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVy
-biBzLkhOKCkKcmV0dXJuIHMtcX0sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLHI9cy5nQXMoKSti
-CmlmKGI8MHx8cj49cy5nVUQoKSl0aHJvdyBILmIoUC5DZihiLHMsImluZGV4IixudWxsLG51bGwpKQpy
-ZXR1cm4gSi5HQShzLmEscil9LAplUjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT10aGlzClAuazEoYiwi
-Y291bnQiKQpzPXEuYitiCnI9cS5jCmlmKHIhPW51bGwmJnM+PXIpcmV0dXJuIG5ldyBILk1CKHEuJHRp
-LkMoIk1CPDE+IikpCnJldHVybiBILnFDKHEuYSxzLHIscS4kdGkuYyl9LAp0dDpmdW5jdGlvbihhLGIp
-e3ZhciBzLHIscSxwPXRoaXMsbz1wLmIsbj1wLmEsbT1KLlU2KG4pLGw9bS5nQShuKSxrPXAuYwppZihr
-IT1udWxsJiZrPGwpbD1rCmlmKHR5cGVvZiBsIT09Im51bWJlciIpcmV0dXJuIGwuSE4oKQpzPWwtbwpp
-ZihzPD0wKXtuPUouUWkoMCxwLiR0aS5jKQpyZXR1cm4gbn1yPVAuTzgocyxtLkUobixvKSwhMSxwLiR0
-aS5jKQpmb3IocT0xO3E8czsrK3Epe0MuTm0uWShyLHEsbS5FKG4sbytxKSkKaWYobS5nQShuKTxsKXRo
-cm93IEguYihQLmE0KHApKX1yZXR1cm4gcn19CkguYTcucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXt2
-YXIgcz10aGlzLmQKcmV0dXJuIHN9LApGOmZ1bmN0aW9uKCl7dmFyIHMscj10aGlzLHE9ci5hLHA9Si5V
-NihxKSxvPXAuZ0EocSkKaWYoci5iIT09byl0aHJvdyBILmIoUC5hNChxKSkKcz1yLmMKaWYocz49byl7
-ci5zSShudWxsKQpyZXR1cm4hMX1yLnNJKHAuRShxLHMpKTsrK3IuYwpyZXR1cm4hMH0sCnNJOmZ1bmN0
-aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIpLmEoYSl9LAokaUFuOjF9CkguaTEucHJvdG90eXBl
-PXsKZ206ZnVuY3Rpb24oYSl7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gbmV3IEguTUgoSi5JVCh0aGlz
-LmEpLHRoaXMuYixzLkMoIkA8MT4iKS5LcShzLlFbMV0pLkMoIk1IPDEsMj4iKSl9LApnQTpmdW5jdGlv
-bihhKXtyZXR1cm4gSi5IbSh0aGlzLmEpfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiBKLnVVKHRoaXMu
-YSl9LApFOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYi4kMShKLkdBKHRoaXMuYSxiKSl9fQpILnh5
-LnByb3RvdHlwZT17JGliUToxfQpILk1ILnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgcz10aGlz
-LHI9cy5iCmlmKHIuRigpKXtzLnNJKHMuYy4kMShyLmdsKCkpKQpyZXR1cm4hMH1zLnNJKG51bGwpCnJl
-dHVybiExfSwKZ2w6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLmEKcmV0dXJuIHN9LApzSTpmdW5jdGlvbihh
-KXt0aGlzLmE9dGhpcy4kdGkuQygiMj8iKS5hKGEpfX0KSC5sSi5wcm90b3R5cGU9ewpnQTpmdW5jdGlv
-bihhKXtyZXR1cm4gSi5IbSh0aGlzLmEpfSwKRTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmIuJDEo
-Si5HQSh0aGlzLmEsYikpfX0KSC5VNS5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3
-IEguU08oSi5JVCh0aGlzLmEpLHRoaXMuYix0aGlzLiR0aS5DKCJTTzwxPiIpKX19CkguU08ucHJvdG90
-eXBlPXsKRjpmdW5jdGlvbigpe3ZhciBzLHIKZm9yKHM9dGhpcy5hLHI9dGhpcy5iO3MuRigpOylpZihI
-Lm9UKHIuJDEocy5nbCgpKSkpcmV0dXJuITAKcmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0
-aGlzLmEuZ2woKX19CkguQU0ucHJvdG90eXBlPXsKZVI6ZnVuY3Rpb24oYSxiKXtQLlVJKGIsImNvdW50
-Iix0LlMpClAuazEoYiwiY291bnQiKQpyZXR1cm4gbmV3IEguQU0odGhpcy5hLHRoaXMuYitiLEguTGgo
-dGhpcykuQygiQU08MT4iKSl9LApnbTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguVTEoSi5JVCh0aGlz
-LmEpLHRoaXMuYixILkxoKHRoaXMpLkMoIlUxPDE+IikpfX0KSC5kNS5wcm90b3R5cGU9ewpnQTpmdW5j
-dGlvbihhKXt2YXIgcz1KLkhtKHRoaXMuYSktdGhpcy5iCmlmKHM+PTApcmV0dXJuIHMKcmV0dXJuIDB9
-LAplUjpmdW5jdGlvbihhLGIpe1AuVUkoYiwiY291bnQiLHQuUykKUC5rMShiLCJjb3VudCIpCnJldHVy
-biBuZXcgSC5kNSh0aGlzLmEsdGhpcy5iK2IsdGhpcy4kdGkpfSwKJGliUToxfQpILlUxLnByb3RvdHlw
-ZT17CkY6ZnVuY3Rpb24oKXt2YXIgcyxyCmZvcihzPXRoaXMuYSxyPTA7cjx0aGlzLmI7KytyKXMuRigp
-CnRoaXMuYj0wCnJldHVybiBzLkYoKX0sCmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5nbCgpfX0K
-SC5NQi5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXtyZXR1cm4gQy5Hd30sCmdsMDpmdW5jdGlvbihh
-KXtyZXR1cm4hMH0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiAwfSwKRTpmdW5jdGlvbihhLGIpe3Rocm93
-IEguYihQLlRFKGIsMCwwLCJpbmRleCIsbnVsbCkpfSwKZVI6ZnVuY3Rpb24oYSxiKXtQLmsxKGIsImNv
-dW50IikKcmV0dXJuIHRoaXN9fQpILkZ1LnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXtyZXR1cm4hMX0s
-CmdsOmZ1bmN0aW9uKCl7dGhyb3cgSC5iKEguV3AoKSl9LAokaUFuOjF9CkgudTYucHJvdG90eXBlPXsK
-Z206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILkpCKEouSVQodGhpcy5hKSx0aGlzLiR0aS5DKCJKQjwx
-PiIpKX19CkguSkIucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3ZhciBzLHIKZm9yKHM9dGhpcy5hLHI9
-dGhpcy4kdGkuYztzLkYoKTspaWYoci5iKHMuZ2woKSkpcmV0dXJuITAKcmV0dXJuITF9LApnbDpmdW5j
-dGlvbigpe3JldHVybiB0aGlzLiR0aS5jLmEodGhpcy5hLmdsKCkpfSwKJGlBbjoxfQpILlNVLnByb3Rv
-dHlwZT17fQpILlJlLnByb3RvdHlwZT17Clk6ZnVuY3Rpb24oYSxiLGMpe0guTGgodGhpcykuQygiUmUu
-RSIpLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3Qi
-KSl9fQpILncyLnByb3RvdHlwZT17fQpILnd2LnByb3RvdHlwZT17CmdpTzpmdW5jdGlvbihhKXt2YXIg
-cz10aGlzLl9oYXNoQ29kZQppZihzIT1udWxsKXJldHVybiBzCnM9NjY0NTk3KkouaGYodGhpcy5hKSY1
-MzY4NzA5MTEKdGhpcy5faGFzaENvZGU9cwpyZXR1cm4gc30sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuJ1N5
-bWJvbCgiJytILkVqKHRoaXMuYSkrJyIpJ30sCkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1
-cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIEgud3YmJnRoaXMuYT09Yi5hfSwKJGlHRDoxfQpILlFDLnBy
-b3RvdHlwZT17fQpILlBELnByb3RvdHlwZT17fQpILldVLnByb3RvdHlwZT17CmdsMDpmdW5jdGlvbihh
-KXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09PTB9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5PKHRoaXMp
-fSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpzLmMuYShiKQpzLlFbMV0uYShjKQpI
-LmRjKCkKSC5CaSh1LmcpfSwKZ1B1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnE0KGEsSC5MaCh0aGlz
-KS5DKCJOMzwxLDI+IikpfSwKcTQ6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzCnJldHVybiBQLmwwKGZ1
-bmN0aW9uKCl7dmFyIHI9YQp2YXIgcT0wLHA9MSxvLG4sbSxsLGsKcmV0dXJuIGZ1bmN0aW9uICRhc3lu
-YyRnUHUoYyxkKXtpZihjPT09MSl7bz1kCnE9cH13aGlsZSh0cnVlKXN3aXRjaChxKXtjYXNlIDA6bj1z
-LmdWKCksbj1uLmdtKG4pLG09SC5MaChzKSxtPW0uQygiQDwxPiIpLktxKG0uUVsxXSkuQygiTjM8MSwy
-PiIpCmNhc2UgMjppZighbi5GKCkpe3E9MwpicmVha31sPW4uZ2woKQprPXMucSgwLGwpCmsudG9TdHJp
-bmcKcT00CnJldHVybiBuZXcgUC5OMyhsLGssbSkKY2FzZSA0OnE9MgpicmVhawpjYXNlIDM6cmV0dXJu
-IFAuVGgoKQpjYXNlIDE6cmV0dXJuIFAuWW0obyl9fX0sYil9LAokaVowOjF9CkguTFAucHJvdG90eXBl
-PXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYX0sCng0OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBh
-IT0ic3RyaW5nIilyZXR1cm4hMQppZigiX19wcm90b19fIj09PWEpcmV0dXJuITEKcmV0dXJuIHRoaXMu
-Yi5oYXNPd25Qcm9wZXJ0eShhKX0sCnE6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy54NChiKSlyZXR1cm4g
-bnVsbApyZXR1cm4gdGhpcy5xUChiKX0sCnFQOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJbSC5oKGEp
-XX0sCks6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvPUguTGgodGhpcykKby5DKCJ+KDEsMikiKS5h
-KGIpCnM9dGhpcy5jCmZvcihyPXMubGVuZ3RoLG89by5RWzFdLHE9MDtxPHI7KytxKXtwPXNbcV0KYi4k
-MihwLG8uYSh0aGlzLnFQKHApKSl9fSwKZ1Y6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEguWFIodGhpcyxI
-LkxoKHRoaXMpLkMoIlhSPDE+IikpfX0KSC5YUi5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXt2YXIg
-cz10aGlzLmEuYwpyZXR1cm4gbmV3IEoubTEocyxzLmxlbmd0aCxILnQ2KHMpLkMoIm0xPDE+IikpfSwK
-Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5jLmxlbmd0aH19CkguTEkucHJvdG90eXBlPXsKZ1dh
-OmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5hCnJldHVybiBzfSwKZ25kOmZ1bmN0aW9uKCl7dmFyIHMscixx
-LHAsbz10aGlzCmlmKG8uYz09PTEpcmV0dXJuIEMuaFUKcz1vLmQKcj1zLmxlbmd0aC1vLmUubGVuZ3Ro
-LW8uZgppZihyPT09MClyZXR1cm4gQy5oVQpxPVtdCmZvcihwPTA7cDxyOysrcCl7aWYocD49cy5sZW5n
-dGgpcmV0dXJuIEguT0gocyxwKQpxLnB1c2goc1twXSl9cmV0dXJuIEouekMocSl9LApnVm06ZnVuY3Rp
-b24oKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9dGhpcwppZihrLmMhPT0wKXJldHVybiBDLldPCnM9ay5l
-CnI9cy5sZW5ndGgKcT1rLmQKcD1xLmxlbmd0aC1yLWsuZgppZihyPT09MClyZXR1cm4gQy5XTwpvPW5l
-dyBILk41KHQuZW8pCmZvcihuPTA7bjxyOysrbil7aWYobj49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxu
-KQptPXNbbl0KbD1wK24KaWYobDwwfHxsPj1xLmxlbmd0aClyZXR1cm4gSC5PSChxLGwpCm8uWSgwLG5l
-dyBILnd2KG0pLHFbbF0pfXJldHVybiBuZXcgSC5QRChvLHQuZ0YpfSwKJGl2UToxfQpILkNqLnByb3Rv
-dHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHMKSC5oKGEpCnM9dGhpcy5hCnMuYj1zLmIrIiQiK0gu
-RWooYSkKQy5ObS5pKHRoaXMuYixhKQpDLk5tLmkodGhpcy5jLGIpOysrcy5hfSwKJFM6MTN9CkguZjku
-cHJvdG90eXBlPXsKcVM6ZnVuY3Rpb24oYSl7dmFyIHMscixxPXRoaXMscD1uZXcgUmVnRXhwKHEuYSku
-ZXhlYyhhKQppZihwPT1udWxsKXJldHVybiBudWxsCnM9T2JqZWN0LmNyZWF0ZShudWxsKQpyPXEuYgpp
-ZihyIT09LTEpcy5hcmd1bWVudHM9cFtyKzFdCnI9cS5jCmlmKHIhPT0tMSlzLmFyZ3VtZW50c0V4cHI9
-cFtyKzFdCnI9cS5kCmlmKHIhPT0tMSlzLmV4cHI9cFtyKzFdCnI9cS5lCmlmKHIhPT0tMSlzLm1ldGhv
-ZD1wW3IrMV0Kcj1xLmYKaWYociE9PS0xKXMucmVjZWl2ZXI9cFtyKzFdCnJldHVybiBzfX0KSC5XMC5w
-cm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYgppZihzPT1udWxsKXJldHVybiJOb1N1
-Y2hNZXRob2RFcnJvcjogIitILkVqKHRoaXMuYSkKcmV0dXJuIk5vU3VjaE1ldGhvZEVycm9yOiBtZXRo
-b2Qgbm90IGZvdW5kOiAnIitzKyInIG9uIG51bGwifX0KSC5hei5wcm90b3R5cGU9ewp3OmZ1bmN0aW9u
-KGEpe3ZhciBzLHI9dGhpcyxxPSJOb1N1Y2hNZXRob2RFcnJvcjogbWV0aG9kIG5vdCBmb3VuZDogJyIs
-cD1yLmIKaWYocD09bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6ICIrSC5FaihyLmEpCnM9ci5j
-CmlmKHM9PW51bGwpcmV0dXJuIHErcCsiJyAoIitILkVqKHIuYSkrIikiCnJldHVybiBxK3ArIicgb24g
-JyIrcysiJyAoIitILkVqKHIuYSkrIikifX0KSC52Vi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3Zh
-ciBzPXRoaXMuYQpyZXR1cm4gcy5sZW5ndGg9PT0wPyJFcnJvciI6IkVycm9yOiAiK3N9fQpILnRlLnBy
-b3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlRocm93IG9mIG51bGwgKCciKyh0aGlzLmE9PT1u
-dWxsPyJudWxsIjoidW5kZWZpbmVkIikrIicgZnJvbSBKYXZhU2NyaXB0KSJ9LAokaVJ6OjF9CkguYnEu
-cHJvdG90eXBlPXt9CkguWE8ucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMuYgpp
-ZihyIT1udWxsKXJldHVybiByCnI9dGhpcy5hCnM9ciE9PW51bGwmJnR5cGVvZiByPT09Im9iamVjdCI/
-ci5zdGFjazpudWxsCnJldHVybiB0aGlzLmI9cz09bnVsbD8iIjpzfSwKJGlHejoxfQpILlRwLnByb3Rv
-dHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5jb25zdHJ1Y3RvcixyPXM9PW51bGw/bnVsbDpz
-Lm5hbWUKcmV0dXJuIkNsb3N1cmUgJyIrSC5OUShyPT1udWxsPyJ1bmtub3duIjpyKSsiJyJ9LAokaUVI
-OjEsCmdLdTpmdW5jdGlvbigpe3JldHVybiB0aGlzfSwKJEM6IiQxIiwKJFI6MSwKJEQ6bnVsbH0KSC5s
-Yy5wcm90b3R5cGU9e30KSC56eC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuJHN0
-YXRpY19uYW1lCmlmKHM9PW51bGwpcmV0dXJuIkNsb3N1cmUgb2YgdW5rbm93biBzdGF0aWMgbWV0aG9k
-IgpyZXR1cm4iQ2xvc3VyZSAnIitILk5RKHMpKyInIn19CkguclQucHJvdG90eXBlPXsKRE46ZnVuY3Rp
-b24oYSxiKXt2YXIgcz10aGlzCmlmKGI9PW51bGwpcmV0dXJuITEKaWYocz09PWIpcmV0dXJuITAKaWYo
-IShiIGluc3RhbmNlb2YgSC5yVCkpcmV0dXJuITEKcmV0dXJuIHMuYT09PWIuYSYmcy5iPT09Yi5iJiZz
-LmM9PT1iLmN9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLmMKaWYocj09bnVsbClzPUguZVEo
-dGhpcy5hKQplbHNlIHM9dHlwZW9mIHIhPT0ib2JqZWN0Ij9KLmhmKHIpOkguZVEocikKcj1ILmVRKHRo
-aXMuYikKaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy53TygpCnJldHVybihzXnIpPj4+MH0s
-Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5jCmlmKHM9PW51bGwpcz10aGlzLmEKcmV0dXJuIkNsb3N1
-cmUgJyIrSC5Faih0aGlzLmQpKyInIG9mICIrKCJJbnN0YW5jZSBvZiAnIitILkVqKEguTShzKSkrIici
-KX19CkguRXEucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iUnVudGltZUVycm9yOiAiK3Ro
-aXMuYX19Ckgua1kucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iQXNzZXJ0aW9uIGZhaWxl
-ZDogIitQLmhsKHRoaXMuYSl9fQpILmtyLnByb3RvdHlwZT17fQpILk41LnByb3RvdHlwZT17CmdBOmZ1
-bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYT09PTB9
-LApnVjpmdW5jdGlvbigpe3JldHVybiBuZXcgSC5pNSh0aGlzLEguTGgodGhpcykuQygiaTU8MT4iKSl9
-LAp4NDpmdW5jdGlvbihhKXt2YXIgcyxyCmlmKHR5cGVvZiBhPT0ic3RyaW5nIil7cz10aGlzLmIKaWYo
-cz09bnVsbClyZXR1cm4hMQpyZXR1cm4gdGhpcy5YdShzLGEpfWVsc2V7cj10aGlzLkNYKGEpCnJldHVy
-biByfX0sCkNYOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuZAppZihzPT1udWxsKXJldHVybiExCnJldHVy
-biB0aGlzLkZoKHRoaXMuQnQocyxKLmhmKGEpJjB4M2ZmZmZmZiksYSk+PTB9LApxOmZ1bmN0aW9uKGEs
-Yil7dmFyIHMscixxLHAsbz10aGlzLG49bnVsbAppZih0eXBlb2YgYj09InN0cmluZyIpe3M9by5iCmlm
-KHM9PW51bGwpcmV0dXJuIG4Kcj1vLmoyKHMsYikKcT1yPT1udWxsP246ci5iCnJldHVybiBxfWVsc2Ug
-aWYodHlwZW9mIGI9PSJudW1iZXIiJiYoYiYweDNmZmZmZmYpPT09Yil7cD1vLmMKaWYocD09bnVsbCly
-ZXR1cm4gbgpyPW8uajIocCxiKQpxPXI9PW51bGw/bjpyLmIKcmV0dXJuIHF9ZWxzZSByZXR1cm4gby5h
-YShiKX0sCmFhOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT10aGlzLmQKaWYocT09bnVsbClyZXR1cm4gbnVs
-bApzPXRoaXMuQnQocSxKLmhmKGEpJjB4M2ZmZmZmZikKcj10aGlzLkZoKHMsYSkKaWYocjwwKXJldHVy
-biBudWxsCnJldHVybiBzW3JdLmJ9LApZOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbT10
-aGlzLGw9SC5MaChtKQpsLmMuYShiKQpsLlFbMV0uYShjKQppZih0eXBlb2YgYj09InN0cmluZyIpe3M9
-bS5iCm0uRUgocz09bnVsbD9tLmI9bS56SygpOnMsYixjKX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVy
-IiYmKGImMHgzZmZmZmZmKT09PWIpe3I9bS5jCm0uRUgocj09bnVsbD9tLmM9bS56SygpOnIsYixjKX1l
-bHNle3E9bS5kCmlmKHE9PW51bGwpcT1tLmQ9bS56SygpCnA9Si5oZihiKSYweDNmZmZmZmYKbz1tLkJ0
-KHEscCkKaWYobz09bnVsbCltLkVJKHEscCxbbS5IbihiLGMpXSkKZWxzZXtuPW0uRmgobyxiKQppZihu
-Pj0wKW9bbl0uYj1jCmVsc2Ugby5wdXNoKG0uSG4oYixjKSl9fX0sCks6ZnVuY3Rpb24oYSxiKXt2YXIg
-cyxyLHE9dGhpcwpILkxoKHEpLkMoIn4oMSwyKSIpLmEoYikKcz1xLmUKcj1xLnIKZm9yKDtzIT1udWxs
-Oyl7Yi4kMihzLmEscy5iKQppZihyIT09cS5yKXRocm93IEguYihQLmE0KHEpKQpzPXMuY319LApFSDpm
-dW5jdGlvbihhLGIsYyl7dmFyIHMscj10aGlzLHE9SC5MaChyKQpxLmMuYShiKQpxLlFbMV0uYShjKQpz
-PXIuajIoYSxiKQppZihzPT1udWxsKXIuRUkoYSxiLHIuSG4oYixjKSkKZWxzZSBzLmI9Y30sCmtzOmZ1
-bmN0aW9uKCl7dGhpcy5yPXRoaXMucisxJjY3MTA4ODYzfSwKSG46ZnVuY3Rpb24oYSxiKXt2YXIgcz10
-aGlzLHI9SC5MaChzKSxxPW5ldyBILnZoKHIuYy5hKGEpLHIuUVsxXS5hKGIpKQppZihzLmU9PW51bGwp
-cy5lPXMuZj1xCmVsc2V7cj1zLmYKci50b1N0cmluZwpxLmQ9cgpzLmY9ci5jPXF9KytzLmEKcy5rcygp
-CnJldHVybiBxfSwKRmg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmlmKGE9PW51bGwpcmV0dXJuLTEKcz1h
-Lmxlbmd0aApmb3Iocj0wO3I8czsrK3IpaWYoSi5STShhW3JdLmEsYikpcmV0dXJuIHIKcmV0dXJuLTF9
-LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5PKHRoaXMpfSwKajI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
-YVtiXX0sCkJ0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbYl19LApFSTpmdW5jdGlvbihhLGIsYyl7YVti
-XT1jfSwKcm46ZnVuY3Rpb24oYSxiKXtkZWxldGUgYVtiXX0sClh1OmZ1bmN0aW9uKGEsYil7cmV0dXJu
-IHRoaXMuajIoYSxiKSE9bnVsbH0sCnpLOmZ1bmN0aW9uKCl7dmFyIHM9Ijxub24taWRlbnRpZmllci1r
-ZXk+IixyPU9iamVjdC5jcmVhdGUobnVsbCkKdGhpcy5FSShyLHMscikKdGhpcy5ybihyLHMpCnJldHVy
-biByfSwKJGlGbzoxfQpILnZoLnByb3RvdHlwZT17fQpILmk1LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9u
-KGEpe3JldHVybiB0aGlzLmEuYX0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmE9PT0wfSwK
-Z206ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hLHI9bmV3IEguTjYocyxzLnIsdGhpcy4kdGkuQygiTjY8
-MT4iKSkKci5jPXMuZQpyZXR1cm4gcn0sCnRnOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS54NChi
-KX19CkguTjYucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlv
-bigpe3ZhciBzLHI9dGhpcyxxPXIuYQppZihyLmIhPT1xLnIpdGhyb3cgSC5iKFAuYTQocSkpCnM9ci5j
-CmlmKHM9PW51bGwpe3Iuc3FZKG51bGwpCnJldHVybiExfWVsc2V7ci5zcVkocy5hKQpyLmM9cy5jCnJl
-dHVybiEwfX0sCnNxWTpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKJGlB
-bjoxfQpILmRDLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEoYSl9LAokUzo0
-fQpILndOLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYShhLGIpfSwKJFM6
-NDJ9CkguVlgucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYShILmgoYSkpfSwK
-JFM6MzV9CkguVlIucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iUmVnRXhwLyIrdGhpcy5h
-KyIvIit0aGlzLmIuZmxhZ3N9LApnSGM6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLHI9cy5jCmlmKHIhPW51
-bGwpcmV0dXJuIHIKcj1zLmIKcmV0dXJuIHMuYz1ILnY0KHMuYSxyLm11bHRpbGluZSwhci5pZ25vcmVD
-YXNlLHIudW5pY29kZSxyLmRvdEFsbCwhMCl9LApkZDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5L
-Vyh0aGlzLGIsMCl9LApVWjpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcy5nSGMoKQpyLmxhc3RJbmRl
-eD1iCnM9ci5leGVjKGEpCmlmKHM9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIG5ldyBILkVLKHMpfSwK
-JGl2WDoxLAokaXdMOjF9CkguRUsucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3ZhciBzCkgudVAo
-YikKcz10aGlzLmIKaWYoYj49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxiKQpyZXR1cm4gc1tiXX0sCiRp
-T2Q6MSwKJGlpYjoxfQpILktXLnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5Q
-Yih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9fQpILlBiLnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0
-dXJuIHRoaXMuZH0sCkY6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9bS5iCmlmKGw9
-PW51bGwpcmV0dXJuITEKcz1tLmMKcj1sLmxlbmd0aAppZihzPD1yKXtxPW0uYQpwPXEuVVoobCxzKQpp
-ZihwIT1udWxsKXttLmQ9cApzPXAuYgpvPXMuaW5kZXgKbj1vK3NbMF0ubGVuZ3RoCmlmKG89PT1uKXtp
-ZihxLmIudW5pY29kZSl7cz1tLmMKcT1zKzEKaWYocTxyKXtzPUMueEIuTzIobCxzKQppZihzPj01NTI5
-NiYmczw9NTYzMTkpe3M9Qy54Qi5PMihsLHEpCnM9cz49NTYzMjAmJnM8PTU3MzQzfWVsc2Ugcz0hMX1l
-bHNlIHM9ITF9ZWxzZSBzPSExCm49KHM/bisxOm4pKzF9bS5jPW4KcmV0dXJuITB9fW0uYj1tLmQ9bnVs
-bApyZXR1cm4hMX0sCiRpQW46MX0KSC50US5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC51UChi
-KQppZihiIT09MClILnYoUC5PNyhiLG51bGwpKQpyZXR1cm4gdGhpcy5jfSwKJGlPZDoxfQpILnVuLnBy
-b3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5TZCh0aGlzLmEsdGhpcy5iLHRoaXMu
-Yyl9fQpILlNkLnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgcyxyLHE9dGhpcyxwPXEuYyxvPXEu
-YixuPW8ubGVuZ3RoLG09cS5hLGw9bS5sZW5ndGgKaWYocCtuPmwpe3EuZD1udWxsCnJldHVybiExfXM9
-bS5pbmRleE9mKG8scCkKaWYoczwwKXtxLmM9bCsxCnEuZD1udWxsCnJldHVybiExfXI9cytuCnEuZD1u
-ZXcgSC50UShzLG8pCnEuYz1yPT09cS5jP3IrMTpyCnJldHVybiEwfSwKZ2w6ZnVuY3Rpb24oKXt2YXIg
-cz10aGlzLmQKcy50b1N0cmluZwpyZXR1cm4gc30sCiRpQW46MX0KSC5FVC5wcm90b3R5cGU9eyRpRVQ6
-MSwkaUFTOjF9CkguWEgucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwK
-JGlYajoxfQpILkRnLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCkgub2QoYixhLGEu
-bGVuZ3RoKQpyZXR1cm4gYVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMpe0guR0goYykKSC5vZChiLGEsYS5s
-ZW5ndGgpCmFbYl09Y30sCiRpYlE6MSwKJGljWDoxLAokaXpNOjF9CkguUGcucHJvdG90eXBlPXsKWTpm
-dW5jdGlvbihhLGIsYyl7SC51UChjKQpILm9kKGIsYSxhLmxlbmd0aCkKYVtiXT1jfSwKJGliUToxLAok
-aWNYOjEsCiRpek06MX0KSC54ai5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC51UChiKQpILm9k
-KGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILmRFLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxi
-KXtILnVQKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguWkEucHJvdG90eXBlPXsK
-cTpmdW5jdGlvbihhLGIpe0gudVAoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5k
-VC5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC51UChiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0
-dXJuIGFbYl19fQpILlBxLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCkgub2QoYixh
-LGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguZUUucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0
-dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0gudVAoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJl
-dHVybiBhW2JdfX0KSC5WNi5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9
-LApxOmZ1bmN0aW9uKGEsYil7SC51UChiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19LAok
-aVY2OjEsCiRpbjY6MX0KSC5SRy5wcm90b3R5cGU9e30KSC5WUC5wcm90b3R5cGU9e30KSC5XQi5wcm90
-b3R5cGU9e30KSC5aRy5wcm90b3R5cGU9e30KSC5KYy5wcm90b3R5cGU9ewpDOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBILmNFKHYudHlwZVVuaXZlcnNlLHRoaXMsYSl9LApLcTpmdW5jdGlvbihhKXtyZXR1cm4gSC52
-NSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfX0KSC5HLnByb3RvdHlwZT17fQpILmtTLnByb3RvdHlwZT17
-Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYX19CkguaU0ucHJvdG90eXBlPXt9ClAudGgucHJvdG90
-eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hLHI9cy5hCnMuYT1udWxsCnIuJDAoKX0sCiRT
-Ojl9ClAuaGEucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMscgp0aGlzLmEuYT10Lk0uYShh
-KQpzPXRoaXMuYgpyPXRoaXMuYwpzLmZpcnN0Q2hpbGQ/cy5yZW1vdmVDaGlsZChyKTpzLmFwcGVuZENo
-aWxkKHIpfSwKJFM6NTN9ClAuVnMucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuJDAoKX0s
-CiRDOiIkMCIsCiRSOjAsCiRTOjF9ClAuRnQucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEu
-JDAoKX0sCiRDOiIkMCIsCiRSOjAsCiRTOjF9ClAuVzMucHJvdG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSxi
-KXtpZihzZWxmLnNldFRpbWVvdXQhPW51bGwpc2VsZi5zZXRUaW1lb3V0KEgudFIobmV3IFAueUgodGhp
-cyxiKSwwKSxhKQplbHNlIHRocm93IEguYihQLkw0KCJgc2V0VGltZW91dCgpYCBub3QgZm91bmQuIikp
-fX0KUC55SC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYi4kMCgpfSwKJEM6IiQwIiwKJFI6
-MCwKJFM6MH0KUC5paC5wcm90b3R5cGU9ewphTTpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcyxxPXIu
-JHRpCnEuQygiMS8/IikuYShiKQppZighci5iKXIuYS5YZihiKQplbHNle3M9ci5hCmlmKHEuQygiYjg8
-MT4iKS5iKGIpKXMuY1UoYikKZWxzZSBzLlgyKHEuYy5hKGIpKX19LAp3MDpmdW5jdGlvbihhLGIpe3Zh
-ciBzCmlmKGI9PW51bGwpYj1QLnYwKGEpCnM9dGhpcy5hCmlmKHRoaXMuYilzLlpMKGEsYikKZWxzZSBz
-Lk5rKGEsYil9fQpQLldNLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuJDIo
-MCxhKX0sCiRTOjQ3fQpQLlNYLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLiQyKDEs
-bmV3IEguYnEoYSx0LmwuYShiKSkpfSwKJEM6IiQyIiwKJFI6MiwKJFM6Mjd9ClAuR3MucHJvdG90eXBl
-PXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEoSC51UChhKSxiKX0sCiRTOjI1fQpQLkZ5LnByb3RvdHlw
-ZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkl0ZXJhdGlvbk1hcmtlcigiK3RoaXMuYisiLCAiK0guRWoo
-dGhpcy5hKSsiKSJ9fQpQLkdWLnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5jCmlm
-KHM9PW51bGwpcmV0dXJuIHRoaXMuJHRpLmMuYSh0aGlzLmIpCnJldHVybiBzLmdsKCl9LApGOmZ1bmN0
-aW9uKCl7dmFyIHMscixxLHAsbyxuLG09dGhpcwpmb3Iocz1tLiR0aS5DKCJBbjwxPiIpOyEwOyl7cj1t
-LmMKaWYociE9bnVsbClpZihyLkYoKSlyZXR1cm4hMAplbHNlIG0uc1g5KG51bGwpCnE9ZnVuY3Rpb24o
-YSxiLGMpe3ZhciBsLGs9Ygp3aGlsZSh0cnVlKXRyeXtyZXR1cm4gYShrLGwpfWNhdGNoKGope2w9agpr
-PWN9fShtLmEsMCwxKQppZihxIGluc3RhbmNlb2YgUC5GeSl7cD1xLmIKaWYocD09PTIpe289bS5kCmlm
-KG89PW51bGx8fG8ubGVuZ3RoPT09MCl7bS5zRUMobnVsbCkKcmV0dXJuITF9aWYoMD49by5sZW5ndGgp
-cmV0dXJuIEguT0gobywtMSkKbS5hPW8ucG9wKCkKY29udGludWV9ZWxzZXtyPXEuYQppZihwPT09Myl0
-aHJvdyByCmVsc2V7bj1zLmEoSi5JVChyKSkKaWYobiBpbnN0YW5jZW9mIFAuR1Ype3I9bS5kCmlmKHI9
-PW51bGwpcj1tLmQ9W10KQy5ObS5pKHIsbS5hKQptLmE9bi5hCmNvbnRpbnVlfWVsc2V7bS5zWDkobikK
-Y29udGludWV9fX19ZWxzZXttLnNFQyhxKQpyZXR1cm4hMH19cmV0dXJuITF9LApzRUM6ZnVuY3Rpb24o
-YSl7dGhpcy5iPXRoaXMuJHRpLkMoIjE/IikuYShhKX0sCnNYOTpmdW5jdGlvbihhKXt0aGlzLmM9dGhp
-cy4kdGkuQygiQW48MT4/IikuYShhKX0sCiRpQW46MX0KUC5xNC5wcm90b3R5cGU9ewpnbTpmdW5jdGlv
-bihhKXtyZXR1cm4gbmV3IFAuR1YodGhpcy5hKCksdGhpcy4kdGkuQygiR1Y8MT4iKSl9fQpQLlBmLnBy
-b3RvdHlwZT17CncwOmZ1bmN0aW9uKGEsYil7dmFyIHMKUC5VSShhLCJlcnJvciIsdC5LKQpzPXRoaXMu
-YQppZihzLmEhPT0wKXRocm93IEguYihQLlBWKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKaWYo
-Yj09bnVsbCliPVAudjAoYSkKcy5OayhhLGIpfSwKcG06ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudzAo
-YSxudWxsKX19ClAuWmYucHJvdG90eXBlPXsKYU06ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRoaXMuJHRp
-CnIuQygiMS8/IikuYShiKQpzPXRoaXMuYQppZihzLmEhPT0wKXRocm93IEguYihQLlBWKCJGdXR1cmUg
-YWxyZWFkeSBjb21wbGV0ZWQiKSkKcy5YZihyLkMoIjEvIikuYShiKSl9fQpQLkZlLnByb3RvdHlwZT17
-CkhSOmZ1bmN0aW9uKGEpe2lmKCh0aGlzLmMmMTUpIT09NilyZXR1cm4hMApyZXR1cm4gdGhpcy5iLmIu
-YnYodC5hbC5hKHRoaXMuZCksYS5hLHQueSx0LkspfSwKS3c6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5l
-LHI9dC56LHE9dC5LLHA9dGhpcy4kdGkuQygiMi8iKSxvPXRoaXMuYi5iCmlmKHQuYWcuYihzKSlyZXR1
-cm4gcC5hKG8ucnAocyxhLmEsYS5iLHIscSx0LmwpKQplbHNlIHJldHVybiBwLmEoby5idih0LmJJLmEo
-cyksYS5hLHIscSkpfX0KUC52cy5wcm90b3R5cGU9ewpTcTpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixx
-LHA9dGhpcy4kdGkKcC5LcShjKS5DKCIxLygyKSIpLmEoYSkKcz0kLlgzCmlmKHMhPT1DLk5VKXtjLkMo
-IkA8MC8+IikuS3EocC5jKS5DKCIxKDIpIikuYShhKQppZihiIT1udWxsKWI9UC5WSChiLHMpfXI9bmV3
-IFAudnMocyxjLkMoInZzPDA+IikpCnE9Yj09bnVsbD8xOjMKdGhpcy54ZihuZXcgUC5GZShyLHEsYSxi
-LHAuQygiQDwxPiIpLktxKGMpLkMoIkZlPDEsMj4iKSkpCnJldHVybiByfSwKVzc6ZnVuY3Rpb24oYSxi
-KXtyZXR1cm4gdGhpcy5TcShhLG51bGwsYil9LApRZDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscj10aGlz
-LiR0aQpyLktxKGMpLkMoIjEvKDIpIikuYShhKQpzPW5ldyBQLnZzKCQuWDMsYy5DKCJ2czwwPiIpKQp0
-aGlzLnhmKG5ldyBQLkZlKHMsMTksYSxiLHIuQygiQDwxPiIpLktxKGMpLkMoIkZlPDEsMj4iKSkpCnJl
-dHVybiBzfSwKeGY6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLHE9ci5hCmlmKHE8PTEpe2EuYT10LkYu
-YShyLmMpCnIuYz1hfWVsc2V7aWYocT09PTIpe3M9dC5jLmEoci5jKQpxPXMuYQppZihxPDQpe3MueGYo
-YSkKcmV0dXJufXIuYT1xCnIuYz1zLmN9UC5UayhudWxsLG51bGwsci5iLHQuTS5hKG5ldyBQLmRhKHIs
-YSkpKX19LApqUTpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9e30KbC5hPWEKaWYo
-YT09bnVsbClyZXR1cm4Kcz1tLmEKaWYoczw9MSl7cj10LkYuYShtLmMpCm0uYz1hCmlmKHIhPW51bGwp
-e3E9YS5hCmZvcihwPWE7cSE9bnVsbDtwPXEscT1vKW89cS5hCnAuYT1yfX1lbHNle2lmKHM9PT0yKXtu
-PXQuYy5hKG0uYykKcz1uLmEKaWYoczw0KXtuLmpRKGEpCnJldHVybn1tLmE9cwptLmM9bi5jfWwuYT1t
-Lk44KGEpClAuVGsobnVsbCxudWxsLG0uYix0Lk0uYShuZXcgUC5vUShsLG0pKSl9fSwKYWg6ZnVuY3Rp
-b24oKXt2YXIgcz10LkYuYSh0aGlzLmMpCnRoaXMuYz1udWxsCnJldHVybiB0aGlzLk44KHMpfSwKTjg6
-ZnVuY3Rpb24oYSl7dmFyIHMscixxCmZvcihzPWEscj1udWxsO3MhPW51bGw7cj1zLHM9cSl7cT1zLmEK
-cy5hPXJ9cmV0dXJuIHJ9LApISDpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMscT1yLiR0aQpxLkMoIjEv
-IikuYShhKQppZihxLkMoImI4PDE+IikuYihhKSlpZihxLmIoYSkpUC5BOShhLHIpCmVsc2UgUC5rMyhh
-LHIpCmVsc2V7cz1yLmFoKCkKcS5jLmEoYSkKci5hPTQKci5jPWEKUC5IWihyLHMpfX0sClgyOmZ1bmN0
-aW9uKGEpe3ZhciBzLHI9dGhpcwpyLiR0aS5jLmEoYSkKcz1yLmFoKCkKci5hPTQKci5jPWEKUC5IWihy
-LHMpfSwKWkw6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9dGhpcwp0LmwuYShiKQpzPXEuYWgoKQpyPVAu
-VGwoYSxiKQpxLmE9OApxLmM9cgpQLkhaKHEscyl9LApYZjpmdW5jdGlvbihhKXt2YXIgcz10aGlzLiR0
-aQpzLkMoIjEvIikuYShhKQppZihzLkMoImI4PDE+IikuYihhKSl7dGhpcy5jVShhKQpyZXR1cm59dGhp
-cy53VShzLmMuYShhKSl9LAp3VTpmdW5jdGlvbihhKXt2YXIgcz10aGlzCnMuJHRpLmMuYShhKQpzLmE9
-MQpQLlRrKG51bGwsbnVsbCxzLmIsdC5NLmEobmV3IFAucnQocyxhKSkpfSwKY1U6ZnVuY3Rpb24oYSl7
-dmFyIHM9dGhpcyxyPXMuJHRpCnIuQygiYjg8MT4iKS5hKGEpCmlmKHIuYihhKSl7aWYoYS5hPT09OCl7
-cy5hPTEKUC5UayhudWxsLG51bGwscy5iLHQuTS5hKG5ldyBQLktGKHMsYSkpKX1lbHNlIFAuQTkoYSxz
-KQpyZXR1cm59UC5rMyhhLHMpfSwKTms6ZnVuY3Rpb24oYSxiKXt0aGlzLmE9MQpQLlRrKG51bGwsbnVs
-bCx0aGlzLmIsdC5NLmEobmV3IFAuWkwodGhpcyxhLGIpKSl9LAokaWI4OjF9ClAuZGEucHJvdG90eXBl
-PXsKJDA6ZnVuY3Rpb24oKXtQLkhaKHRoaXMuYSx0aGlzLmIpfSwKJFM6MH0KUC5vUS5wcm90b3R5cGU9
-ewokMDpmdW5jdGlvbigpe1AuSFoodGhpcy5iLHRoaXMuYS5hKX0sCiRTOjB9ClAucFYucHJvdG90eXBl
-PXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCnMuYT0wCnMuSEgoYSl9LAokUzo5fQpQLlU3LnBy
-b3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLlpMKGEsdC5sLmEoYikpfSwKJEM6IiQyIiwK
-JFI6MiwKJFM6MzB9ClAudnIucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuWkwodGhpcy5i
-LHRoaXMuYyl9LAokUzowfQpQLnJ0LnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLlgyKHRo
-aXMuYil9LAokUzowfQpQLktGLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7UC5BOSh0aGlzLmIsdGhp
-cy5hKX0sCiRTOjB9ClAuWkwucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuWkwodGhpcy5i
-LHRoaXMuYyl9LAokUzowfQpQLlJULnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAs
-byxuLG09dGhpcyxsPW51bGwKdHJ5e3E9bS5hLmEKbD1xLmIuYi56eih0LmZPLmEocS5kKSx0LnopfWNh
-dGNoKHApe3M9SC5SdShwKQpyPUgudHMocCkKaWYobS5jKXtxPXQubi5hKG0uYi5hLmMpLmEKbz1zCm89
-cT09bnVsbD9vPT1udWxsOnE9PT1vCnE9b31lbHNlIHE9ITEKbz1tLmEKaWYocSlvLmM9dC5uLmEobS5i
-LmEuYykKZWxzZSBvLmM9UC5UbChzLHIpCm8uYj0hMApyZXR1cm59aWYobCBpbnN0YW5jZW9mIFAudnMm
-JmwuYT49NCl7aWYobC5hPT09OCl7cT1tLmEKcS5jPXQubi5hKGwuYykKcS5iPSEwfXJldHVybn1pZih0
-LmQuYihsKSl7bj1tLmIuYQpxPW0uYQpxLmM9bC5XNyhuZXcgUC5qWihuKSx0LnopCnEuYj0hMX19LAok
-UzowfQpQLmpaLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LAokUzozM30K
-UC5ycS5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbixtLGwKdHJ5e3E9dGhp
-cy5hCnA9cS5hCm89cC4kdGkKbj1vLmMKbT1uLmEodGhpcy5iKQpxLmM9cC5iLmIuYnYoby5DKCIyLygx
-KSIpLmEocC5kKSxtLG8uQygiMi8iKSxuKX1jYXRjaChsKXtzPUguUnUobCkKcj1ILnRzKGwpCnE9dGhp
-cy5hCnEuYz1QLlRsKHMscikKcS5iPSEwfX0sCiRTOjB9ClAuUlcucHJvdG90eXBlPXsKJDA6ZnVuY3Rp
-b24oKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9dGhpcwp0cnl7cz10Lm4uYShrLmEuYS5jKQpwPWsuYgpp
-ZihILm9UKHAuYS5IUihzKSkmJnAuYS5lIT1udWxsKXtwLmM9cC5hLkt3KHMpCnAuYj0hMX19Y2F0Y2go
-byl7cj1ILlJ1KG8pCnE9SC50cyhvKQpwPXQubi5hKGsuYS5hLmMpCm49cC5hCm09cgpsPWsuYgppZihu
-PT1udWxsP209PW51bGw6bj09PW0pbC5jPXAKZWxzZSBsLmM9UC5UbChyLHEpCmwuYj0hMH19LAokUzow
-fQpQLk9NLnByb3RvdHlwZT17fQpQLnFoLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3ZhciBzLHIs
-cT10aGlzLHA9e30sbz1uZXcgUC52cygkLlgzLHQuZkopCnAuYT0wCnM9SC5MaChxKQpyPXMuQygifigx
-KT8iKS5hKG5ldyBQLkI1KHAscSkpCnQuWi5hKG5ldyBQLnVPKHAsbykpClcuSkUocS5hLHEuYixyLCEx
-LHMuYykKcmV0dXJuIG99fQpQLkI1LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe0guTGgodGhpcy5i
-KS5jLmEoYSk7Kyt0aGlzLmEuYX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIEguTGgodGhpcy5iKS5DKCJ+
-KDEpIil9fQpQLnVPLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5iLkhIKHRoaXMuYS5hKX0s
-CiRTOjB9ClAuTU8ucHJvdG90eXBlPXt9ClAua1QucHJvdG90eXBlPXt9ClAueEkucHJvdG90eXBlPXt9
-ClAuQ3cucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gSC5Faih0aGlzLmEpfSwKJGlYUzox
-LApnSUk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ifX0KUC5tMC5wcm90b3R5cGU9eyRpUW06MX0KUC5w
-Sy5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciBzPUguYih0aGlzLmEpCnMuc3RhY2s9Si5qKHRo
-aXMuYikKdGhyb3cgc30sCiRTOjB9ClAuSmkucHJvdG90eXBlPXsKYkg6ZnVuY3Rpb24oYSl7dmFyIHMs
-cixxLHA9bnVsbAp0Lk0uYShhKQp0cnl7aWYoQy5OVT09PSQuWDMpe2EuJDAoKQpyZXR1cm59UC5UOChw
-LHAsdGhpcyxhLHQuSCl9Y2F0Y2gocSl7cz1ILlJ1KHEpCnI9SC50cyhxKQpQLkwyKHAscCx0aGlzLHMs
-dC5sLmEocikpfX0sCkRsOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscD1udWxsCmMuQygifigwKSIp
-LmEoYSkKYy5hKGIpCnRyeXtpZihDLk5VPT09JC5YMyl7YS4kMShiKQpyZXR1cm59UC55dihwLHAsdGhp
-cyxhLGIsdC5ILGMpfWNhdGNoKHEpe3M9SC5SdShxKQpyPUgudHMocSkKUC5MMihwLHAsdGhpcyxzLHQu
-bC5hKHIpKX19LApSVDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5oaih0aGlzLGIuQygiMCgpIiku
-YShhKSxiKX0sCkdZOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5WcCh0aGlzLHQuTS5hKGEpKX0sClB5
-OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLk9SKHRoaXMsYi5DKCJ+KDApIikuYShhKSxiKX0sCnE6
-ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbH0sCnp6OmZ1bmN0aW9uKGEsYil7Yi5DKCIwKCkiKS5hKGEp
-CmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQwKCkKcmV0dXJuIFAuVDgobnVsbCxudWxsLHRoaXMsYSxi
-KX0sCmJ2OmZ1bmN0aW9uKGEsYixjLGQpe2MuQygiQDwwPiIpLktxKGQpLkMoIjEoMikiKS5hKGEpCmQu
-YShiKQppZigkLlgzPT09Qy5OVSlyZXR1cm4gYS4kMShiKQpyZXR1cm4gUC55dihudWxsLG51bGwsdGhp
-cyxhLGIsYyxkKX0sCnJwOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXtkLkMoIkA8MD4iKS5LcShlKS5LcShm
-KS5DKCIxKDIsMykiKS5hKGEpCmUuYShiKQpmLmEoYykKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEuJDIo
-YixjKQpyZXR1cm4gUC5ReChudWxsLG51bGwsdGhpcyxhLGIsYyxkLGUsZil9LApMajpmdW5jdGlvbihh
-LGIsYyxkKXtyZXR1cm4gYi5DKCJAPDA+IikuS3EoYykuS3EoZCkuQygiMSgyLDMpIikuYShhKX19ClAu
-aGoucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLnp6KHRoaXMuYix0aGlzLmMp
-fSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jLkMoIjAoKSIpfX0KUC5WcC5wcm90b3R5cGU9ewok
-MDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuYkgodGhpcy5iKX0sCiRTOjB9ClAuT1IucHJvdG90eXBl
-PXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5jCnJldHVybiB0aGlzLmEuRGwodGhpcy5iLHMuYShh
-KSxzKX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYy5DKCJ+KDApIil9fQpQLmI2LnByb3RvdHlw
-ZT17CmdtOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMscj1uZXcgUC5sbShzLHMucixILkxoKHMpLkMoImxt
-PDE+IikpCnIuYz1zLmUKcmV0dXJuIHJ9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKZ2ww
-OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmE9PT0wfSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlz
-LmEhPT0wfSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9
-PSJfX3Byb3RvX18iKXtzPXRoaXMuYgppZihzPT1udWxsKXJldHVybiExCnJldHVybiB0LmUuYShzW2Jd
-KSE9bnVsbH1lbHNle3I9dGhpcy5QUihiKQpyZXR1cm4gcn19LApQUjpmdW5jdGlvbihhKXt2YXIgcz10
-aGlzLmQKaWYocz09bnVsbClyZXR1cm4hMQpyZXR1cm4gdGhpcy5ERihzW3RoaXMuTihhKV0sYSk+PTB9
-LAppOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPXRoaXMKSC5MaChxKS5jLmEoYikKaWYodHlwZW9mIGI9
-PSJzdHJpbmciJiZiIT09Il9fcHJvdG9fXyIpe3M9cS5iCnJldHVybiBxLmJRKHM9PW51bGw/cS5iPVAu
-VDIoKTpzLGIpfWVsc2UgaWYodHlwZW9mIGI9PSJudW1iZXIiJiYoYiYxMDczNzQxODIzKT09PWIpe3I9
-cS5jCnJldHVybiBxLmJRKHI9PW51bGw/cS5jPVAuVDIoKTpyLGIpfWVsc2UgcmV0dXJuIHEuQjcoYil9
-LApCNzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD10aGlzCkguTGgocCkuYy5hKGEpCnM9cC5kCmlmKHM9
-PW51bGwpcz1wLmQ9UC5UMigpCnI9cC5OKGEpCnE9c1tyXQppZihxPT1udWxsKXNbcl09W3AueW8oYSld
-CmVsc2V7aWYocC5ERihxLGEpPj0wKXJldHVybiExCnEucHVzaChwLnlvKGEpKX1yZXR1cm4hMH0sClI6
-ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzCmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3Rv
-X18iKXJldHVybiBzLkwocy5iLGIpCmVsc2UgaWYodHlwZW9mIGI9PSJudW1iZXIiJiYoYiYxMDczNzQx
-ODIzKT09PWIpcmV0dXJuIHMuTChzLmMsYikKZWxzZSByZXR1cm4gcy5xZyhiKX0sCnFnOmZ1bmN0aW9u
-KGEpe3ZhciBzLHIscSxwLG89dGhpcyxuPW8uZAppZihuPT1udWxsKXJldHVybiExCnM9by5OKGEpCnI9
-bltzXQpxPW8uREYocixhKQppZihxPDApcmV0dXJuITEKcD1yLnNwbGljZShxLDEpWzBdCmlmKDA9PT1y
-Lmxlbmd0aClkZWxldGUgbltzXQpvLkdTKHApCnJldHVybiEwfSwKYlE6ZnVuY3Rpb24oYSxiKXtILkxo
-KHRoaXMpLmMuYShiKQppZih0LmUuYShhW2JdKSE9bnVsbClyZXR1cm4hMQphW2JdPXRoaXMueW8oYikK
-cmV0dXJuITB9LApMOmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYoYT09bnVsbClyZXR1cm4hMQpzPXQuZS5h
-KGFbYl0pCmlmKHM9PW51bGwpcmV0dXJuITEKdGhpcy5HUyhzKQpkZWxldGUgYVtiXQpyZXR1cm4hMH0s
-ClM6ZnVuY3Rpb24oKXt0aGlzLnI9dGhpcy5yKzEmMTA3Mzc0MTgyM30sCnlvOmZ1bmN0aW9uKGEpe3Zh
-ciBzLHI9dGhpcyxxPW5ldyBQLmJuKEguTGgocikuYy5hKGEpKQppZihyLmU9PW51bGwpci5lPXIuZj1x
-CmVsc2V7cz1yLmYKcy50b1N0cmluZwpxLmM9cwpyLmY9cy5iPXF9KytyLmEKci5TKCkKcmV0dXJuIHF9
-LApHUzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLHI9YS5jLHE9YS5iCmlmKHI9PW51bGwpcy5lPXEKZWxz
-ZSByLmI9cQppZihxPT1udWxsKXMuZj1yCmVsc2UgcS5jPXI7LS1zLmEKcy5TKCl9LApOOmZ1bmN0aW9u
-KGEpe3JldHVybiBKLmhmKGEpJjEwNzM3NDE4MjN9LApERjpmdW5jdGlvbihhLGIpe3ZhciBzLHIKaWYo
-YT09bnVsbClyZXR1cm4tMQpzPWEubGVuZ3RoCmZvcihyPTA7cjxzOysrcilpZihKLlJNKGFbcl0uYSxi
-KSlyZXR1cm4gcgpyZXR1cm4tMX19ClAuYm4ucHJvdG90eXBlPXt9ClAubG0ucHJvdG90eXBlPXsKZ2w6
-ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciBzPXRoaXMscj1zLmMscT1z
-LmEKaWYocy5iIT09cS5yKXRocm93IEguYihQLmE0KHEpKQplbHNlIGlmKHI9PW51bGwpe3Muc2oobnVs
-bCkKcmV0dXJuITF9ZWxzZXtzLnNqKHMuJHRpLkMoIjE/IikuYShyLmEpKQpzLmM9ci5iCnJldHVybiEw
-fX0sCnNqOmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIpLmEoYSl9LAokaUFuOjF9ClAu
-bVcucHJvdG90eXBlPXt9ClAudXkucHJvdG90eXBlPXskaWJROjEsJGljWDoxLCRpek06MX0KUC5sRC5w
-cm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguYTcoYSx0aGlzLmdBKGEpLEgueihh
-KS5DKCJhNzxsRC5FPiIpKX0sCkU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5xKGEsYil9LApLOmZ1
-bmN0aW9uKGEsYil7dmFyIHMscgpILnooYSkuQygifihsRC5FKSIpLmEoYikKcz10aGlzLmdBKGEpCmZv
-cihyPTA7cjxzOysrcil7Yi4kMSh0aGlzLnEoYSxyKSkKaWYocyE9PXRoaXMuZ0EoYSkpdGhyb3cgSC5i
-KFAuYTQoYSkpfX0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nQShhKT09PTB9LApnb3I6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIXRoaXMuZ2wwKGEpfSwKRTI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPUgueihh
-KQpyZXR1cm4gbmV3IEgubEooYSxzLktxKGMpLkMoIjEobEQuRSkiKS5hKGIpLHMuQygiQDxsRC5FPiIp
-LktxKGMpLkMoImxKPDEsMj4iKSl9LAplUjpmdW5jdGlvbihhLGIpe3JldHVybiBILnFDKGEsYixudWxs
-LEgueihhKS5DKCJsRC5FIikpfSwKZHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEgualYoYSxILnoo
-YSkuQygiQDxsRC5FPiIpLktxKGIpLkMoImpWPDEsMj4iKSl9LApkdTpmdW5jdGlvbihhLGIsYyxkKXt2
-YXIgcwpILnooYSkuQygibEQuRT8iKS5hKGQpClAuakIoYixjLHRoaXMuZ0EoYSkpCmZvcihzPWI7czxj
-Oysrcyl0aGlzLlkoYSxzLGQpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5XRShhLCJbIiwiXSIpfX0K
-UC5pbC5wcm90b3R5cGU9e30KUC5yYS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHI9
-dGhpcy5hCmlmKCFyLmEpdGhpcy5iLmErPSIsICIKci5hPSExCnI9dGhpcy5iCnM9ci5hKz1ILkVqKGEp
-CnIuYT1zKyI6ICIKci5hKz1ILkVqKGIpfSwKJFM6MTF9ClAuWWsucHJvdG90eXBlPXsKSzpmdW5jdGlv
-bihhLGIpe3ZhciBzLHIKSC5MaCh0aGlzKS5DKCJ+KFlrLkssWWsuVikiKS5hKGIpCmZvcihzPUouSVQo
-dGhpcy5nVigpKTtzLkYoKTspe3I9cy5nbCgpCmIuJDIocix0aGlzLnEoMCxyKSl9fSwKZ1B1OmZ1bmN0
-aW9uKGEpe3JldHVybiBKLk0xKHRoaXMuZ1YoKSxuZXcgUC55USh0aGlzKSxILkxoKHRoaXMpLkMoIk4z
-PFlrLkssWWsuVj4iKSl9LAp4NDpmdW5jdGlvbihhKXtyZXR1cm4gSi56bCh0aGlzLmdWKCksYSl9LApn
-QTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IbSh0aGlzLmdWKCkpfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVy
-biBKLnVVKHRoaXMuZ1YoKSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5PKHRoaXMpfSwKJGlaMDox
-fQpQLnlRLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYSxyPUguTGgocykKci5D
-KCJZay5LIikuYShhKQpyZXR1cm4gbmV3IFAuTjMoYSxzLnEoMCxhKSxyLkMoIkA8WWsuSz4iKS5LcShy
-LkMoIllrLlYiKSkuQygiTjM8MSwyPiIpKX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIEguTGgodGhpcy5h
-KS5DKCJOMzxZay5LLFlrLlY+KFlrLkspIil9fQpQLktQLnByb3RvdHlwZT17Clk6ZnVuY3Rpb24oYSxi
-LGMpe3ZhciBzPUguTGgodGhpcykKcy5jLmEoYikKcy5RWzFdLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNh
-bm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1hcCIpKX19ClAuUG4ucHJvdG90eXBlPXsKcTpmdW5jdGlv
-bihhLGIpe3JldHVybiB0aGlzLmEucSgwLGIpfSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9SC5MaCh0
-aGlzKQp0aGlzLmEuWSgwLHMuYy5hKGIpLHMuUVsxXS5hKGMpKX0sCng0OmZ1bmN0aW9uKGEpe3JldHVy
-biB0aGlzLmEueDQoYSl9LApLOmZ1bmN0aW9uKGEsYil7dGhpcy5hLksoMCxILkxoKHRoaXMpLkMoIn4o
-MSwyKSIpLmEoYikpfSwKZ2wwOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4gcy5nbDAocyl9
-LApnQTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ0Eocyl9LAp3OmZ1bmN0aW9uKGEp
-e3JldHVybiBKLmoodGhpcy5hKX0sCmdQdTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMu
-Z1B1KHMpfSwKJGlaMDoxfQpQLkdqLnByb3RvdHlwZT17fQpQLmxmLnByb3RvdHlwZT17CmdsMDpmdW5j
-dGlvbihhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09PTB9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRo
-aXMuZ0EodGhpcykhPT0wfSwKRlY6ZnVuY3Rpb24oYSxiKXt2YXIgcwpmb3Iocz1KLklUKEguTGgodGhp
-cykuQygiY1g8bGYuRT4iKS5hKGIpKTtzLkYoKTspdGhpcy5pKDAscy5nbCgpKX0sCnc6ZnVuY3Rpb24o
-YSl7cmV0dXJuIFAuV0UodGhpcywieyIsIn0iKX0sCkg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRoaXMu
-Z20odGhpcykKaWYoIXIuRigpKXJldHVybiIiCmlmKGI9PT0iIil7cz0iIgpkbyBzKz1ILkVqKHIuZCkK
-d2hpbGUoci5GKCkpfWVsc2V7cz1ILkVqKHIuZCkKZm9yKDtyLkYoKTspcz1zK2IrSC5FaihyLmQpfXJl
-dHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5iSyh0
-aGlzLGIsSC5MaCh0aGlzKS5DKCJsZi5FIikpfSwKRTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwPSJp
-bmRleCIKUC5VSShiLHAsdC5TKQpQLmsxKGIscCkKZm9yKHM9dGhpcy5nbSh0aGlzKSxyPTA7cy5GKCk7
-KXtxPXMuZAppZihiPT09cilyZXR1cm4gcTsrK3J9dGhyb3cgSC5iKFAuQ2YoYix0aGlzLHAsbnVsbCxy
-KSl9fQpQLlZqLnByb3RvdHlwZT17JGliUToxLCRpY1g6MSwkaXh1OjF9ClAuWHYucHJvdG90eXBlPXsk
-aWJROjEsJGljWDoxLCRpeHU6MX0KUC5uWS5wcm90b3R5cGU9e30KUC5XWS5wcm90b3R5cGU9e30KUC5S
-VS5wcm90b3R5cGU9e30KUC5wUi5wcm90b3R5cGU9e30KUC51dy5wcm90b3R5cGU9ewpxOmZ1bmN0aW9u
-KGEsYil7dmFyIHMscj10aGlzLmIKaWYocj09bnVsbClyZXR1cm4gdGhpcy5jLnEoMCxiKQplbHNlIGlm
-KHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gbnVsbAplbHNle3M9cltiXQpyZXR1cm4gdHlwZW9mIHM9
-PSJ1bmRlZmluZWQiP3RoaXMuZmIoYik6c319LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iPT1u
-dWxsP3RoaXMuYy5hOnRoaXMuQ2YoKS5sZW5ndGh9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
-Z0EodGhpcyk9PT0wfSwKZ1Y6ZnVuY3Rpb24oKXtpZih0aGlzLmI9PW51bGwpe3ZhciBzPXRoaXMuYwpy
-ZXR1cm4gbmV3IEguaTUocyxILkxoKHMpLkMoImk1PDE+IikpfXJldHVybiBuZXcgUC5pOCh0aGlzKX0s
-Clk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscT10aGlzCmlmKHEuYj09bnVsbClxLmMuWSgwLGIsYykK
-ZWxzZSBpZihxLng0KGIpKXtzPXEuYgpzW2JdPWMKcj1xLmEKaWYocj09bnVsbD9zIT1udWxsOnIhPT1z
-KXJbYl09bnVsbH1lbHNlIHEuWEsoKS5ZKDAsYixjKX0sCng0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYj09
-bnVsbClyZXR1cm4gdGhpcy5jLng0KGEpCnJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3Bl
-cnR5LmNhbGwodGhpcy5hLGEpfSwKSzpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG89dGhpcwp0LmNB
-LmEoYikKaWYoby5iPT1udWxsKXJldHVybiBvLmMuSygwLGIpCnM9by5DZigpCmZvcihyPTA7cjxzLmxl
-bmd0aDsrK3Ipe3E9c1tyXQpwPW8uYltxXQppZih0eXBlb2YgcD09InVuZGVmaW5lZCIpe3A9UC5RZShv
-LmFbcV0pCm8uYltxXT1wfWIuJDIocSxwKQppZihzIT09by5jKXRocm93IEguYihQLmE0KG8pKX19LApD
-ZjpmdW5jdGlvbigpe3ZhciBzPXQuYk0uYSh0aGlzLmMpCmlmKHM9PW51bGwpcz10aGlzLmM9SC5WTShP
-YmplY3Qua2V5cyh0aGlzLmEpLHQucykKcmV0dXJuIHN9LApYSzpmdW5jdGlvbigpe3ZhciBzLHIscSxw
-LG8sbj10aGlzCmlmKG4uYj09bnVsbClyZXR1cm4gbi5jCnM9UC5GbCh0Lk4sdC56KQpyPW4uQ2YoKQpm
-b3IocT0wO3A9ci5sZW5ndGgscTxwOysrcSl7bz1yW3FdCnMuWSgwLG8sbi5xKDAsbykpfWlmKHA9PT0w
-KUMuTm0uaShyLCIiKQplbHNlIEMuTm0uc0EociwwKQpuLmE9bi5iPW51bGwKcmV0dXJuIG4uYz1zfSwK
-ZmI6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2Fs
-bCh0aGlzLmEsYSkpcmV0dXJuIG51bGwKcz1QLlFlKHRoaXMuYVthXSkKcmV0dXJuIHRoaXMuYlthXT1z
-fX0KUC5pOC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ0Eo
-cyl9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcy5hCmlmKHMuYj09bnVsbClzPXMuZ1YoKS5FKDAs
-YikKZWxzZXtzPXMuQ2YoKQppZihiPDB8fGI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsYikKcz1zW2Jd
-fXJldHVybiBzfSwKZ206ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCmlmKHMuYj09bnVsbCl7cz1zLmdW
-KCkKcz1zLmdtKHMpfWVsc2V7cz1zLkNmKCkKcz1uZXcgSi5tMShzLHMubGVuZ3RoLEgudDYocykuQygi
-bTE8MT4iKSl9cmV0dXJuIHN9LAp0ZzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEueDQoYil9fQpQ
-LnBnLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHMscgp0cnl7cz1uZXcgVGV4dERlY29kZXIo
-InV0Zi04Iix7ZmF0YWw6dHJ1ZX0pCnJldHVybiBzfWNhdGNoKHIpe0guUnUocil9cmV0dXJuIG51bGx9
-LAokUzoxMn0KUC5jMi5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciBzLHIKdHJ5e3M9bmV3IFRl
-eHREZWNvZGVyKCJ1dGYtOCIse2ZhdGFsOmZhbHNlfSkKcmV0dXJuIHN9Y2F0Y2gocil7SC5SdShyKX1y
-ZXR1cm4gbnVsbH0sCiRTOjEyfQpQLkNWLnByb3RvdHlwZT17CnlyOmZ1bmN0aW9uKGEwLGExLGEyKXt2
-YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIsYT0iSW52YWxpZCBiYXNlNjQgZW5j
-b2RpbmcgbGVuZ3RoICIKYTI9UC5qQihhMSxhMixhMC5sZW5ndGgpCnM9JC5WNygpCmZvcihyPWExLHE9
-cixwPW51bGwsbz0tMSxuPS0xLG09MDtyPGEyO3I9bCl7bD1yKzEKaz1DLnhCLlcoYTAscikKaWYoaz09
-PTM3KXtqPWwrMgppZihqPD1hMil7aT1ILm9vKEMueEIuVyhhMCxsKSkKaD1ILm9vKEMueEIuVyhhMCxs
-KzEpKQpnPWkqMTYraC0oaCYyNTYpCmlmKGc9PT0zNylnPS0xCmw9an1lbHNlIGc9LTF9ZWxzZSBnPWsK
-aWYoMDw9ZyYmZzw9MTI3KXtpZihnPDB8fGc+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsZykKZj1zW2dd
-CmlmKGY+PTApe2c9Qy54Qi5PMigiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xt
-bm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsZikKaWYoZz09PWspY29udGludWUKaz1nfWVsc2V7aWYo
-Zj09PS0xKXtpZihvPDApe2U9cD09bnVsbD9udWxsOnAuYS5sZW5ndGgKaWYoZT09bnVsbCllPTAKbz1l
-KyhyLXEpCm49cn0rK20KaWYoaz09PTYxKWNvbnRpbnVlfWs9Z31pZihmIT09LTIpe2lmKHA9PW51bGwp
-e3A9bmV3IFAuUm4oIiIpCmU9cH1lbHNlIGU9cAplLmErPUMueEIuTmooYTAscSxyKQplLmErPUguTHco
-aykKcT1sCmNvbnRpbnVlfX10aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgZGF0YSIsYTAscikp
-fWlmKHAhPW51bGwpe2U9cC5hKz1DLnhCLk5qKGEwLHEsYTIpCmQ9ZS5sZW5ndGgKaWYobz49MClQLnhN
-KGEwLG4sYTIsbyxtLGQpCmVsc2V7Yz1DLmpuLnpZKGQtMSw0KSsxCmlmKGM9PT0xKXRocm93IEguYihQ
-LnJyKGEsYTAsYTIpKQpmb3IoO2M8NDspe2UrPSI9IgpwLmE9ZTsrK2N9fWU9cC5hCnJldHVybiBDLnhC
-Lmk3KGEwLGExLGEyLGUuY2hhckNvZGVBdCgwKT09MD9lOmUpfWI9YTItYTEKaWYobz49MClQLnhNKGEw
-LG4sYTIsbyxtLGIpCmVsc2V7Yz1DLmpuLnpZKGIsNCkKaWYoYz09PTEpdGhyb3cgSC5iKFAucnIoYSxh
-MCxhMikpCmlmKGM+MSlhMD1DLnhCLmk3KGEwLGEyLGEyLGM9PT0yPyI9PSI6Ij0iKX1yZXR1cm4gYTB9
-fQpQLlU4LnByb3RvdHlwZT17fQpQLlVrLnByb3RvdHlwZT17fQpQLndJLnByb3RvdHlwZT17fQpQLlpp
-LnByb3RvdHlwZT17fQpQLlVkLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9UC5obCh0aGlz
-LmEpCnJldHVybih0aGlzLmIhPW51bGw/IkNvbnZlcnRpbmcgb2JqZWN0IHRvIGFuIGVuY29kYWJsZSBv
-YmplY3QgZmFpbGVkOiI6IkNvbnZlcnRpbmcgb2JqZWN0IGRpZCBub3QgcmV0dXJuIGFuIGVuY29kYWJs
-ZSBvYmplY3Q6IikrIiAiK3N9fQpQLks4LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkN5
-Y2xpYyBlcnJvciBpbiBKU09OIHN0cmluZ2lmeSJ9fQpQLmJ5LnByb3RvdHlwZT17CnBXOmZ1bmN0aW9u
-KGEsYixjKXt2YXIgcwp0LmZWLmEoYykKcz1QLkJTKGIsdGhpcy5nSGUoKS5hKQpyZXR1cm4gc30sCk9C
-OmZ1bmN0aW9uKGEsYil7dmFyIHMKdC5kQS5hKGIpCnM9UC51WChhLHRoaXMuZ1pFKCkuYixudWxsKQpy
-ZXR1cm4gc30sCmdaRTpmdW5jdGlvbigpe3JldHVybiBDLm5YfSwKZ0hlOmZ1bmN0aW9uKCl7cmV0dXJu
-IEMuQTN9fQpQLm9qLnByb3RvdHlwZT17fQpQLk14LnByb3RvdHlwZT17fQpQLlNoLnByb3RvdHlwZT17
-CnZwOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8sbixtLGw9YS5sZW5ndGgKZm9yKHM9Si5yWShhKSxy
-PXRoaXMuYyxxPTAscD0wO3A8bDsrK3Ape289cy5XKGEscCkKaWYobz45Mil7aWYobz49NTUyOTYpe249
-byY2NDUxMgppZihuPT09NTUyOTYpe209cCsxCm09IShtPGwmJihDLnhCLlcoYSxtKSY2NDUxMik9PT01
-NjMyMCl9ZWxzZSBtPSExCmlmKCFtKWlmKG49PT01NjMyMCl7bj1wLTEKbj0hKG4+PTAmJihDLnhCLk8y
-KGEsbikmNjQ1MTIpPT09NTUyOTYpfWVsc2Ugbj0hMQplbHNlIG49ITAKaWYobil7aWYocD5xKXIuYSs9
-Qy54Qi5OaihhLHEscCkKcT1wKzEKci5hKz1ILkx3KDkyKQpyLmErPUguTHcoMTE3KQpyLmErPUguTHco
-MTAwKQpuPW8+Pj44JjE1CnIuYSs9SC5MdyhuPDEwPzQ4K246ODcrbikKbj1vPj4+NCYxNQpyLmErPUgu
-THcobjwxMD80OCtuOjg3K24pCm49byYxNQpyLmErPUguTHcobjwxMD80OCtuOjg3K24pfX1jb250aW51
-ZX1pZihvPDMyKXtpZihwPnEpci5hKz1DLnhCLk5qKGEscSxwKQpxPXArMQpyLmErPUguTHcoOTIpCnN3
-aXRjaChvKXtjYXNlIDg6ci5hKz1ILkx3KDk4KQpicmVhawpjYXNlIDk6ci5hKz1ILkx3KDExNikKYnJl
-YWsKY2FzZSAxMDpyLmErPUguTHcoMTEwKQpicmVhawpjYXNlIDEyOnIuYSs9SC5MdygxMDIpCmJyZWFr
-CmNhc2UgMTM6ci5hKz1ILkx3KDExNCkKYnJlYWsKZGVmYXVsdDpyLmErPUguTHcoMTE3KQpyLmErPUgu
-THcoNDgpCnIuYSs9SC5Mdyg0OCkKbj1vPj4+NCYxNQpyLmErPUguTHcobjwxMD80OCtuOjg3K24pCm49
-byYxNQpyLmErPUguTHcobjwxMD80OCtuOjg3K24pCmJyZWFrfX1lbHNlIGlmKG89PT0zNHx8bz09PTky
-KXtpZihwPnEpci5hKz1DLnhCLk5qKGEscSxwKQpxPXArMQpyLmErPUguTHcoOTIpCnIuYSs9SC5Mdyhv
-KX19aWYocT09PTApci5hKz1ILkVqKGEpCmVsc2UgaWYocTxsKXIuYSs9cy5OaihhLHEsbCl9LApKbjpm
-dW5jdGlvbihhKXt2YXIgcyxyLHEscApmb3Iocz10aGlzLmEscj1zLmxlbmd0aCxxPTA7cTxyOysrcSl7
-cD1zW3FdCmlmKGE9PW51bGw/cD09bnVsbDphPT09cCl0aHJvdyBILmIobmV3IFAuSzgoYSxudWxsKSl9
-Qy5ObS5pKHMsYSl9LAppVTpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoby50TShhKSly
-ZXR1cm4Kby5KbihhKQp0cnl7cz1vLmIuJDEoYSkKaWYoIW8udE0ocykpe3E9UC5HeShhLG51bGwsby5n
-VksoKSkKdGhyb3cgSC5iKHEpfXE9by5hCmlmKDA+PXEubGVuZ3RoKXJldHVybiBILk9IKHEsLTEpCnEu
-cG9wKCl9Y2F0Y2gocCl7cj1ILlJ1KHApCnE9UC5HeShhLHIsby5nVksoKSkKdGhyb3cgSC5iKHEpfX0s
-CnRNOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT10aGlzCmlmKHR5cGVvZiBhPT0ibnVtYmVyIil7aWYoIWlz
-RmluaXRlKGEpKXJldHVybiExCnEuYy5hKz1DLkNELncoYSkKcmV0dXJuITB9ZWxzZSBpZihhPT09ITAp
-e3EuYy5hKz0idHJ1ZSIKcmV0dXJuITB9ZWxzZSBpZihhPT09ITEpe3EuYy5hKz0iZmFsc2UiCnJldHVy
-biEwfWVsc2UgaWYoYT09bnVsbCl7cS5jLmErPSJudWxsIgpyZXR1cm4hMH1lbHNlIGlmKHR5cGVvZiBh
-PT0ic3RyaW5nIil7cz1xLmMKcy5hKz0nIicKcS52cChhKQpzLmErPSciJwpyZXR1cm4hMH1lbHNlIGlm
-KHQuai5iKGEpKXtxLkpuKGEpCnEubEsoYSkKcz1xLmEKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0go
-cywtMSkKcy5wb3AoKQpyZXR1cm4hMH1lbHNlIGlmKHQuZi5iKGEpKXtxLkpuKGEpCnI9cS5qdyhhKQpz
-PXEuYQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnJldHVybiByfWVsc2Ug
-cmV0dXJuITF9LApsSzpmdW5jdGlvbihhKXt2YXIgcyxyLHE9dGhpcy5jCnEuYSs9IlsiCnM9Si5VNihh
-KQppZihzLmdvcihhKSl7dGhpcy5pVShzLnEoYSwwKSkKZm9yKHI9MTtyPHMuZ0EoYSk7KytyKXtxLmEr
-PSIsIgp0aGlzLmlVKHMucShhLHIpKX19cS5hKz0iXSJ9LApqdzpmdW5jdGlvbihhKXt2YXIgcyxyLHEs
-cCxvLG4sbT10aGlzLGw9e30KaWYoYS5nbDAoYSkpe20uYy5hKz0ie30iCnJldHVybiEwfXM9YS5nQShh
-KSoyCnI9UC5POChzLG51bGwsITEsdC5SKQpxPWwuYT0wCmwuYj0hMAphLksoMCxuZXcgUC50aShsLHIp
-KQppZighbC5iKXJldHVybiExCnA9bS5jCnAuYSs9InsiCmZvcihvPSciJztxPHM7cSs9MixvPScsIicp
-e3AuYSs9bwptLnZwKEguaChyW3FdKSkKcC5hKz0nIjonCm49cSsxCmlmKG4+PXMpcmV0dXJuIEguT0go
-cixuKQptLmlVKHJbbl0pfXAuYSs9In0iCnJldHVybiEwfX0KUC50aS5wcm90b3R5cGU9ewokMjpmdW5j
-dGlvbihhLGIpe3ZhciBzLHIKaWYodHlwZW9mIGEhPSJzdHJpbmciKXRoaXMuYS5iPSExCnM9dGhpcy5i
-CnI9dGhpcy5hCkMuTm0uWShzLHIuYSsrLGEpCkMuTm0uWShzLHIuYSsrLGIpfSwKJFM6MTF9ClAudHUu
-cHJvdG90eXBlPXsKZ1ZLOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5jLmEKcmV0dXJuIHMuY2hhckNvZGVB
-dCgwKT09MD9zOnN9fQpQLnU1LnByb3RvdHlwZT17CmdaRTpmdW5jdGlvbigpe3JldHVybiBDLlFrfX0K
-UC5FMy5wcm90b3R5cGU9ewpXSjpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD1QLmpCKDAsbnVsbCxhLmxl
-bmd0aCksbz1wLTAKaWYobz09PTApcmV0dXJuIG5ldyBVaW50OEFycmF5KDApCnM9byozCnI9bmV3IFVp
-bnQ4QXJyYXkocykKcT1uZXcgUC5SdyhyKQppZihxLkd4KGEsMCxwKSE9PXApe0ouYTYoYSxwLTEpCnEu
-Uk8oKX1yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoci5zdWJhcnJheSgwLEguck0oMCxxLmIscykpKX19ClAu
-UncucHJvdG90eXBlPXsKUk86ZnVuY3Rpb24oKXt2YXIgcz10aGlzLHI9cy5jLHE9cy5iLHA9cy5iPXEr
-MSxvPXIubGVuZ3RoCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTIzOQpxPXMuYj1wKzEKaWYo
-cD49bylyZXR1cm4gSC5PSChyLHApCnJbcF09MTkxCnMuYj1xKzEKaWYocT49bylyZXR1cm4gSC5PSChy
-LHEpCnJbcV09MTg5fSwKTzY6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG49dGhpcwppZigoYiY2
-NDUxMik9PT01NjMyMCl7cz02NTUzNisoKGEmMTAyMyk8PDEwKXxiJjEwMjMKcj1uLmMKcT1uLmIKcD1u
-LmI9cSsxCm89ci5sZW5ndGgKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09cz4+PjE4fDI0MApx
-PW4uYj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChyLHApCnJbcF09cz4+PjEyJjYzfDEyOApwPW4uYj1x
-KzEKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09cz4+PjYmNjN8MTI4Cm4uYj1wKzEKaWYocD49
-bylyZXR1cm4gSC5PSChyLHApCnJbcF09cyY2M3wxMjgKcmV0dXJuITB9ZWxzZXtuLlJPKCkKcmV0dXJu
-ITF9fSwKR3g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcwppZihiIT09YyYm
-KEMueEIuTzIoYSxjLTEpJjY0NTEyKT09PTU1Mjk2KS0tYwpmb3Iocz1sLmMscj1zLmxlbmd0aCxxPWI7
-cTxjOysrcSl7cD1DLnhCLlcoYSxxKQppZihwPD0xMjcpe289bC5iCmlmKG8+PXIpYnJlYWsKbC5iPW8r
-MQpzW29dPXB9ZWxzZXtvPXAmNjQ1MTIKaWYobz09PTU1Mjk2KXtpZihsLmIrND5yKWJyZWFrCm49cSsx
-CmlmKGwuTzYocCxDLnhCLlcoYSxuKSkpcT1ufWVsc2UgaWYobz09PTU2MzIwKXtpZihsLmIrMz5yKWJy
-ZWFrCmwuUk8oKX1lbHNlIGlmKHA8PTIwNDcpe289bC5iCm09bysxCmlmKG0+PXIpYnJlYWsKbC5iPW0K
-aWYobz49cilyZXR1cm4gSC5PSChzLG8pCnNbb109cD4+PjZ8MTkyCmwuYj1tKzEKc1ttXT1wJjYzfDEy
-OH1lbHNle289bC5iCmlmKG8rMj49cilicmVhawptPWwuYj1vKzEKaWYobz49cilyZXR1cm4gSC5PSChz
-LG8pCnNbb109cD4+PjEyfDIyNApvPWwuYj1tKzEKaWYobT49cilyZXR1cm4gSC5PSChzLG0pCnNbbV09
-cD4+PjYmNjN8MTI4CmwuYj1vKzEKaWYobz49cilyZXR1cm4gSC5PSChzLG8pCnNbb109cCY2M3wxMjh9
-fX1yZXR1cm4gcX19ClAuR1kucHJvdG90eXBlPXsKV0o6ZnVuY3Rpb24oYSl7dmFyIHMscgp0LkwuYShh
-KQpzPXRoaXMuYQpyPVAua3kocyxhLDAsbnVsbCkKaWYociE9bnVsbClyZXR1cm4gcgpyZXR1cm4gbmV3
-IFAuYnoocykuTmUoYSwwLG51bGwsITApfX0KUC5iei5wcm90b3R5cGU9ewpOZTpmdW5jdGlvbihhLGIs
-YyxkKXt2YXIgcyxyLHEscCxvLG49dGhpcwp0LkwuYShhKQpzPVAuakIoYixjLEouSG0oYSkpCmlmKGI9
-PT1zKXJldHVybiIiCnI9UC5qeShhLGIscykKcT1uLmhPKHIsMCxzLWIsITApCnA9bi5iCmlmKChwJjEp
-IT09MCl7bz1QLmo0KHApCm4uYj0wCnRocm93IEguYihQLnJyKG8sYSxiK24uYykpfXJldHVybiBxfSwK
-aE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxPXRoaXMKaWYoYy1iPjEwMDApe3M9Qy5qbi5CVShi
-K2MsMikKcj1xLmhPKGEsYixzLCExKQppZigocS5iJjEpIT09MClyZXR1cm4gcgpyZXR1cm4gcitxLmhP
-KGEscyxjLGQpfXJldHVybiBxLkVoKGEsYixjLGQpfSwKRWg6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMs
-cixxLHAsbyxuLG0sbCxrPXRoaXMsaj02NTUzMyxpPWsuYixoPWsuYyxnPW5ldyBQLlJuKCIiKSxmPWIr
-MSxlPWEubGVuZ3RoCmlmKGI8MHx8Yj49ZSlyZXR1cm4gSC5PSChhLGIpCnM9YVtiXQokbGFiZWwwJDA6
-Zm9yKHI9ay5hOyEwOyl7Zm9yKDshMDtmPW8pe3E9Qy54Qi5XKCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
+bihhLGIpe3JldHVybiBKLncxKGEpLmVSKGEsYil9LApFaDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEou
+WUUoYSkubUsoYSxiLGMpfSwKRWw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5kcihhLGIpfSwK
+Rjc6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVTYoYSkuZ29yKGEpfSwKRkw6ZnVuY3Rpb24oYSxiKXtyZXR1
+cm4gSi5yWShhKS5kZChhLGIpfSwKR0E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5FKGEsYil9
+LApIbTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VNihhKS5nQShhKX0sCklUOmZ1bmN0aW9uKGEpe3JldHVy
+biBKLncxKGEpLmdtKGEpfSwKSnk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5pYShhKS5lNyhhLGIpfSwK
+S1Y6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5HKGEsYil9LApMdDpmdW5jdGlvbihhKXtyZXR1
+cm4gSi5ZRShhKS53ZyhhKX0sCk0xOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi53MShhKS5FMihhLGIs
+Yyl9LApNdTpmdW5jdGlvbihhLGIpe3JldHVybiBKLllFKGEpLnNEKGEsYil9LApRejpmdW5jdGlvbihh
+LGIpe3JldHVybiBKLnJZKGEpLlcoYSxiKX0sClJNOmZ1bmN0aW9uKGEsYil7aWYoYT09bnVsbClyZXR1
+cm4gYj09bnVsbAppZih0eXBlb2YgYSE9Im9iamVjdCIpcmV0dXJuIGIhPW51bGwmJmE9PT1iCnJldHVy
+biBKLmlhKGEpLkROKGEsYil9LApSWDpmdW5jdGlvbihhKXtyZXR1cm4gSi53MShhKS5icihhKX0sClQw
+OmZ1bmN0aW9uKGEpe3JldHVybiBKLnJZKGEpLmJTKGEpfSwKVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIEou
+dmQoYSkuelEoYSl9LAphNjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEpLk8yKGEsYil9LApiVDpm
+dW5jdGlvbihhKXtyZXR1cm4gSi5ZRShhKS5ENChhKX0sCmJiOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9m
+IGE9PSJudW1iZXIiJiZ0eXBlb2YgYj09Im51bWJlciIpcmV0dXJuIGErYgpyZXR1cm4gSi5USihhKS5o
+KGEsYil9LApjSDpmdW5jdGlvbihhKXtyZXR1cm4gSi5yWShhKS5oYyhhKX0sCmRSOmZ1bmN0aW9uKGEp
+e3JldHVybiBKLllFKGEpLmdEKGEpfSwKZFo6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEouWUUoYSku
+T24oYSxiLGMsZCl9LApkZzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5yWShhKS5pNyhhLGIsYyxk
+KX0sCmRoOmZ1bmN0aW9uKGEpe3JldHVybiBKLllFKGEpLkZGKGEpfSwKZHI6ZnVuY3Rpb24oYSxiKXty
+ZXR1cm4gSi5ZRShhKS5zYTQoYSxiKX0sCmhmOmZ1bmN0aW9uKGEpe3JldHVybiBKLmlhKGEpLmdpTyhh
+KX0sCmlnOmZ1bmN0aW9uKGEpe3JldHVybiBKLllFKGEpLmdRZyhhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0
+dXJuIEouaWEoYSkudyhhKX0sCmw1OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouWUUoYSkuc2hmKGEsYil9
+LApsZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouclkoYSkuTmooYSxiLGMpfSwKcDQ6ZnVuY3Rpb24o
+YSxiKXtyZXR1cm4gSi5yWShhKS5UYyhhLGIpfSwKcTA6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLnJZ
+KGEpLlFpKGEsYixjKX0sCnFGOmZ1bmN0aW9uKGEpe3JldHVybiBKLllFKGEpLmdWbChhKX0sCnRIOmZ1
+bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5ZRShhKS5wayhhLGIsYyl9LAp1OTpmdW5jdGlvbihhLGIsYyl7
+cmV0dXJuIEoudzEoYSkuWShhLGIsYyl9LAp1VTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VNihhKS5nbDAo
+YSl9LAp3ZjpmdW5jdGlvbihhLGIpe3JldHVybiBKLllFKGEpLnNSTihhLGIpfSwKeDk6ZnVuY3Rpb24o
+YSxiKXtpZih0eXBlb2YgYj09PSJudW1iZXIiKWlmKGEuY29uc3RydWN0b3I9PUFycmF5fHx0eXBlb2Yg
+YT09InN0cmluZyJ8fEgud1YoYSxhW3YuZGlzcGF0Y2hQcm9wZXJ0eU5hbWVdKSlpZihiPj4+MD09PWIm
+JmI8YS5sZW5ndGgpcmV0dXJuIGFbYl0KcmV0dXJuIEouVTYoYSkucShhLGIpfSwKemw6ZnVuY3Rpb24o
+YSxiKXtyZXR1cm4gSi5VNihhKS50ZyhhLGIpfSwKdkI6ZnVuY3Rpb24gdkIoKXt9LAp5RTpmdW5jdGlv
+biB5RSgpe30sCndlOmZ1bmN0aW9uIHdlKCl7fSwKTUY6ZnVuY3Rpb24gTUYoKXt9LAppQzpmdW5jdGlv
+biBpQygpe30sCmtkOmZ1bmN0aW9uIGtkKCl7fSwKYzU6ZnVuY3Rpb24gYzUoKXt9LApqZDpmdW5jdGlv
+biBqZChhKXt0aGlzLiR0aT1hfSwKUG86ZnVuY3Rpb24gUG8oYSl7dGhpcy4kdGk9YX0sCm0xOmZ1bmN0
+aW9uIG0xKGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz0wCl8uZD1udWxsCl8uJHRpPWN9
+LApxSTpmdW5jdGlvbiBxSSgpe30sCmJVOmZ1bmN0aW9uIGJVKCl7fSwKVkE6ZnVuY3Rpb24gVkEoKXt9
+LApEcjpmdW5jdGlvbiBEcigpe319LFA9ewpPajpmdW5jdGlvbigpe3ZhciBzLHIscT17fQppZihzZWxm
+LnNjaGVkdWxlSW1tZWRpYXRlIT1udWxsKXJldHVybiBQLkVYKCkKaWYoc2VsZi5NdXRhdGlvbk9ic2Vy
+dmVyIT1udWxsJiZzZWxmLmRvY3VtZW50IT1udWxsKXtzPXNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVu
+dCgiZGl2IikKcj1zZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpxLmE9bnVsbApuZXcg
+c2VsZi5NdXRhdGlvbk9ic2VydmVyKEgudFIobmV3IFAudGgocSksMSkpLm9ic2VydmUocyx7Y2hpbGRM
+aXN0OnRydWV9KQpyZXR1cm4gbmV3IFAuaGEocSxzLHIpfWVsc2UgaWYoc2VsZi5zZXRJbW1lZGlhdGUh
+PW51bGwpcmV0dXJuIFAueXQoKQpyZXR1cm4gUC5xVygpfSwKWlY6ZnVuY3Rpb24oYSl7c2VsZi5zY2hl
+ZHVsZUltbWVkaWF0ZShILnRSKG5ldyBQLlZzKHQuTS5hKGEpKSwwKSl9LApvQTpmdW5jdGlvbihhKXtz
+ZWxmLnNldEltbWVkaWF0ZShILnRSKG5ldyBQLkZ0KHQuTS5hKGEpKSwwKSl9LApCejpmdW5jdGlvbihh
+KXt0Lk0uYShhKQpQLlFOKDAsYSl9LApRTjpmdW5jdGlvbihhLGIpe3ZhciBzPW5ldyBQLlczKCkKcy5D
+WShhLGIpCnJldHVybiBzfSwKRlg6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmloKG5ldyBQLnZzKCQu
+WDMsYS5DKCJ2czwwPiIpKSxhLkMoImloPDA+IikpfSwKREk6ZnVuY3Rpb24oYSxiKXthLiQyKDAsbnVs
+bCkKYi5iPSEwCnJldHVybiBiLmF9LApqUTpmdW5jdGlvbihhLGIpe1AuSmUoYSxiKX0sCnlDOmZ1bmN0
+aW9uKGEsYil7Yi5hTSgwLGEpfSwKZjM6ZnVuY3Rpb24oYSxiKXtiLncwKEguUnUoYSksSC50cyhhKSl9
+LApKZTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT1uZXcgUC5XTShiKSxwPW5ldyBQLlNYKGIpCmlmKGEg
+aW5zdGFuY2VvZiBQLnZzKWEuUWQocSxwLHQueikKZWxzZXtzPXQuegppZih0LmQuYihhKSlhLlNxKHEs
+cCxzKQplbHNle3I9bmV3IFAudnMoJC5YMyx0LmMpCnIuYT00CnIuYz1hCnIuUWQocSxwLHMpfX19LAps
+ejpmdW5jdGlvbihhKXt2YXIgcz1mdW5jdGlvbihiLGMpe3JldHVybiBmdW5jdGlvbihkLGUpe3doaWxl
+KHRydWUpdHJ5e2IoZCxlKQpicmVha31jYXRjaChyKXtlPXIKZD1jfX19KGEsMSkKcmV0dXJuICQuWDMu
+TGoobmV3IFAuR3MocyksdC5ILHQuUyx0LnopfSwKR1E6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkZ5
+KGEsMSl9LApUaDpmdW5jdGlvbigpe3JldHVybiBDLndRfSwKWW06ZnVuY3Rpb24oYSl7cmV0dXJuIG5l
+dyBQLkZ5KGEsMyl9LApsMDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5xNChhLGIuQygicTQ8MD4i
+KSl9LAprMzpmdW5jdGlvbihhLGIpe3ZhciBzLHIscQpiLmE9MQp0cnl7YS5TcShuZXcgUC5wVihiKSxu
+ZXcgUC5VNyhiKSx0LlApfWNhdGNoKHEpe3M9SC5SdShxKQpyPUgudHMocSkKUC5yYihuZXcgUC52cihi
+LHMscikpfX0sCkE5OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxCmZvcihzPXQuYztyPWEuYSxyPT09Mjsp
+YT1zLmEoYS5jKQppZihyPj00KXtxPWIuYWgoKQpiLmE9YS5hCmIuYz1hLmMKUC5IWihiLHEpfWVsc2V7
+cT10LkYuYShiLmMpCmIuYT0yCmIuYz1hCmEualEocSl9fSwKSFo6ZnVuY3Rpb24oYTAsYTEpe3ZhciBz
+LHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGM9bnVsbCxiPXt9LGE9Yi5hPWEwCmZvcihzPXQu
+bixyPXQuRixxPXQuZDshMDspe3A9e30Kbz1hLmE9PT04CmlmKGExPT1udWxsKXtpZihvKXtuPXMuYShh
+LmMpClAuTDIoYyxjLGEuYixuLmEsbi5iKX1yZXR1cm59cC5hPWExCm09YTEuYQpmb3IoYT1hMTttIT1u
+dWxsO2E9bSxtPWwpe2EuYT1udWxsClAuSFooYi5hLGEpCnAuYT1tCmw9bS5hfWs9Yi5hCmo9ay5jCnAu
+Yj1vCnAuYz1qCmk9IW8KaWYoaSl7aD1hLmMKaD0oaCYxKSE9PTB8fChoJjE1KT09PTh9ZWxzZSBoPSEw
+CmlmKGgpe2c9YS5iLmIKaWYobyl7aD1rLmI9PT1nCmg9IShofHxoKX1lbHNlIGg9ITEKaWYoaCl7cy5h
+KGopClAuTDIoYyxjLGsuYixqLmEsai5iKQpyZXR1cm59Zj0kLlgzCmlmKGYhPT1nKSQuWDM9ZwplbHNl
+IGY9YwphPWEuYwppZigoYSYxNSk9PT04KW5ldyBQLlJUKHAsYixvKS4kMCgpCmVsc2UgaWYoaSl7aWYo
+KGEmMSkhPT0wKW5ldyBQLnJxKHAsaikuJDAoKX1lbHNlIGlmKChhJjIpIT09MCluZXcgUC5SVyhiLHAp
+LiQwKCkKaWYoZiE9bnVsbCkkLlgzPWYKYT1wLmMKaWYocS5iKGEpKXtlPXAuYS5iCmlmKGEuYT49NCl7
+ZD1yLmEoZS5jKQplLmM9bnVsbAphMT1lLk44KGQpCmUuYT1hLmEKZS5jPWEuYwpiLmE9YQpjb250aW51
+ZX1lbHNlIFAuQTkoYSxlKQpyZXR1cm59fWU9cC5hLmIKZD1yLmEoZS5jKQplLmM9bnVsbAphMT1lLk44
+KGQpCmE9cC5iCms9cC5jCmlmKCFhKXtlLiR0aS5jLmEoaykKZS5hPTQKZS5jPWt9ZWxzZXtzLmEoaykK
+ZS5hPTgKZS5jPWt9Yi5hPWUKYT1lfX0sClZIOmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYodC5hZy5iKGEp
+KXJldHVybiBiLkxqKGEsdC56LHQuSyx0LmwpCnM9dC5iSQppZihzLmIoYSkpcmV0dXJuIHMuYShhKQp0
+aHJvdyBILmIoUC5MMyhhLCJvbkVycm9yIiwiRXJyb3IgaGFuZGxlciBtdXN0IGFjY2VwdCBvbmUgT2Jq
+ZWN0IG9yIG9uZSBPYmplY3QgYW5kIGEgU3RhY2tUcmFjZSBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm4g
+YSBhIHZhbGlkIHJlc3VsdCIpKX0sCnB1OmZ1bmN0aW9uKCl7dmFyIHMscgpmb3Iocz0kLlM2O3MhPW51
+bGw7cz0kLlM2KXskLm1nPW51bGwKcj1zLmIKJC5TNj1yCmlmKHI9PW51bGwpJC5rOD1udWxsCnMuYS4k
+MCgpfX0sCmVOOmZ1bmN0aW9uKCl7JC5VRD0hMAp0cnl7UC5wdSgpfWZpbmFsbHl7JC5tZz1udWxsCiQu
+VUQ9ITEKaWYoJC5TNiE9bnVsbCkkLnV0KCkuJDEoUC5WOSgpKX19LAplVzpmdW5jdGlvbihhKXt2YXIg
+cz1uZXcgUC5PTShhKSxyPSQuazgKaWYocj09bnVsbCl7JC5TNj0kLms4PXMKaWYoISQuVUQpJC51dCgp
+LiQxKFAuVjkoKSl9ZWxzZSAkLms4PXIuYj1zfSwKclI6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9JC5T
+NgppZihwPT1udWxsKXtQLmVXKGEpCiQubWc9JC5rOApyZXR1cm59cz1uZXcgUC5PTShhKQpyPSQubWcK
+aWYocj09bnVsbCl7cy5iPXAKJC5TNj0kLm1nPXN9ZWxzZXtxPXIuYgpzLmI9cQokLm1nPXIuYj1zCmlm
+KHE9PW51bGwpJC5rOD1zfX0sCnJiOmZ1bmN0aW9uKGEpe3ZhciBzPW51bGwscj0kLlgzCmlmKEMuTlU9
+PT1yKXtQLlRrKHMscyxDLk5VLGEpCnJldHVybn1QLlRrKHMscyxyLHQuTS5hKHIuR1koYSkpKX0sClF3
+OmZ1bmN0aW9uKGEsYil7UC5VSShhLCJzdHJlYW0iLHQuUikKcmV0dXJuIG5ldyBQLnhJKGIuQygieEk8
+MD4iKSl9LApUbDpmdW5jdGlvbihhLGIpe3ZhciBzPWI9PW51bGw/UC52MChhKTpiClAuVUkoYSwiZXJy
+b3IiLHQuSykKcmV0dXJuIG5ldyBQLkN3KGEscyl9LAp2MDpmdW5jdGlvbihhKXt2YXIgcwppZih0LnIu
+YihhKSl7cz1hLmdJSSgpCmlmKHMhPW51bGwpcmV0dXJuIHN9cmV0dXJuIEMucGR9LApMMjpmdW5jdGlv
+bihhLGIsYyxkLGUpe1AuclIobmV3IFAucEsoZCxlKSl9LApUODpmdW5jdGlvbihhLGIsYyxkLGUpe3Zh
+ciBzLHI9JC5YMwppZihyPT09YylyZXR1cm4gZC4kMCgpCiQuWDM9YwpzPXIKdHJ5e3I9ZC4kMCgpCnJl
+dHVybiByfWZpbmFsbHl7JC5YMz1zfX0sCnl2OmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBzLHI9
+JC5YMwppZihyPT09YylyZXR1cm4gZC4kMShlKQokLlgzPWMKcz1yCnRyeXtyPWQuJDEoZSkKcmV0dXJu
+IHJ9ZmluYWxseXskLlgzPXN9fSwKUXg6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe3ZhciBzLHI9
+JC5YMwppZihyPT09YylyZXR1cm4gZC4kMihlLGYpCiQuWDM9YwpzPXIKdHJ5e3I9ZC4kMihlLGYpCnJl
+dHVybiByfWZpbmFsbHl7JC5YMz1zfX0sClRrOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzCnQuTS5hKGQp
+CnM9Qy5OVSE9PWMKaWYocylkPSEoIXN8fCExKT9jLkdZKGQpOmMuUlQoZCx0LkgpClAuZVcoZCl9LAp0
+aDpmdW5jdGlvbiB0aChhKXt0aGlzLmE9YX0sCmhhOmZ1bmN0aW9uIGhhKGEsYixjKXt0aGlzLmE9YQp0
+aGlzLmI9Ygp0aGlzLmM9Y30sClZzOmZ1bmN0aW9uIFZzKGEpe3RoaXMuYT1hfSwKRnQ6ZnVuY3Rpb24g
+RnQoYSl7dGhpcy5hPWF9LApXMzpmdW5jdGlvbiBXMygpe30sCnlIOmZ1bmN0aW9uIHlIKGEsYil7dGhp
+cy5hPWEKdGhpcy5iPWJ9LAppaDpmdW5jdGlvbiBpaChhLGIpe3RoaXMuYT1hCnRoaXMuYj0hMQp0aGlz
+LiR0aT1ifSwKV006ZnVuY3Rpb24gV00oYSl7dGhpcy5hPWF9LApTWDpmdW5jdGlvbiBTWChhKXt0aGlz
+LmE9YX0sCkdzOmZ1bmN0aW9uIEdzKGEpe3RoaXMuYT1hfSwKRnk6ZnVuY3Rpb24gRnkoYSxiKXt0aGlz
+LmE9YQp0aGlzLmI9Yn0sCkdWOmZ1bmN0aW9uIEdWKGEsYil7dmFyIF89dGhpcwpfLmE9YQpfLmQ9Xy5j
+PV8uYj1udWxsCl8uJHRpPWJ9LApxNDpmdW5jdGlvbiBxNChhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9
+LApQZjpmdW5jdGlvbiBQZigpe30sClpmOmZ1bmN0aW9uIFpmKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9
+Yn0sCkZlOmZ1bmN0aW9uIEZlKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmE9bnVsbApfLmI9YQpfLmM9
+YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwKdnM6ZnVuY3Rpb24gdnMoYSxiKXt2YXIgXz10aGlzCl8uYT0w
+Cl8uYj1hCl8uYz1udWxsCl8uJHRpPWJ9LApkYTpmdW5jdGlvbiBkYShhLGIpe3RoaXMuYT1hCnRoaXMu
+Yj1ifSwKb1E6ZnVuY3Rpb24gb1EoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnBWOmZ1bmN0aW9uIHBW
+KGEpe3RoaXMuYT1hfSwKVTc6ZnVuY3Rpb24gVTcoYSl7dGhpcy5hPWF9LAp2cjpmdW5jdGlvbiB2cihh
+LGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApydDpmdW5jdGlvbiBydChhLGIpe3RoaXMu
+YT1hCnRoaXMuYj1ifSwKS0Y6ZnVuY3Rpb24gS0YoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClpMOmZ1
+bmN0aW9uIFpMKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClJUOmZ1bmN0aW9uIFJU
+KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCmpaOmZ1bmN0aW9uIGpaKGEpe3RoaXMu
+YT1hfSwKcnE6ZnVuY3Rpb24gcnEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClJXOmZ1bmN0aW9uIFJX
+KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApPTTpmdW5jdGlvbiBPTShhKXt0aGlzLmE9YQp0aGlzLmI9
+bnVsbH0sCnFoOmZ1bmN0aW9uIHFoKCl7fSwKQjU6ZnVuY3Rpb24gQjUoYSxiKXt0aGlzLmE9YQp0aGlz
+LmI9Yn0sCnVPOmZ1bmN0aW9uIHVPKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNTzpmdW5jdGlvbiBN
+Tygpe30sCmtUOmZ1bmN0aW9uIGtUKCl7fSwKeEk6ZnVuY3Rpb24geEkoYSl7dGhpcy4kdGk9YX0sCkN3
+OmZ1bmN0aW9uIEN3KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAptMDpmdW5jdGlvbiBtMCgpe30sCnBL
+OmZ1bmN0aW9uIHBLKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApKaTpmdW5jdGlvbiBKaSgpe30sCmhq
+OmZ1bmN0aW9uIGhqKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClZwOmZ1bmN0aW9u
+IFZwKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApPUjpmdW5jdGlvbiBPUihhLGIsYyl7dGhpcy5hPWEK
+dGhpcy5iPWIKdGhpcy5jPWN9LApFRjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGIuQygiQDwwPiIpLktx
+KGMpLkMoIkZvPDEsMj4iKS5hKEguQjcoYSxuZXcgSC5ONShiLkMoIkA8MD4iKS5LcShjKS5DKCJONTwx
+LDI+IikpKSl9LApGbDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5ONShhLkMoIkA8MD4iKS5LcShi
+KS5DKCJONTwxLDI+IikpfSwKTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmI2KGEuQygiYjY8MD4i
+KSl9LApUMjpmdW5jdGlvbigpe3ZhciBzPU9iamVjdC5jcmVhdGUobnVsbCkKc1siPG5vbi1pZGVudGlm
+aWVyLWtleT4iXT1zCmRlbGV0ZSBzWyI8bm9uLWlkZW50aWZpZXIta2V5PiJdCnJldHVybiBzfSwKcmo6
+ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPW5ldyBQLmxtKGEsYixjLkMoImxtPDA+IikpCnMuYz1hLmUKcmV0
+dXJuIHN9LApFUDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscgppZihQLmhCKGEpKXtpZihiPT09IigiJiZj
+PT09IikiKXJldHVybiIoLi4uKSIKcmV0dXJuIGIrIi4uLiIrY31zPUguVk0oW10sdC5zKQpDLk5tLmko
+JC54ZyxhKQp0cnl7UC5WcihhLHMpfWZpbmFsbHl7aWYoMD49JC54Zy5sZW5ndGgpcmV0dXJuIEguT0go
+JC54ZywtMSkKJC54Zy5wb3AoKX1yPVAudmcoYix0LnUuYShzKSwiLCAiKStjCnJldHVybiByLmNoYXJD
+b2RlQXQoMCk9PTA/cjpyfSwKV0U6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIKaWYoUC5oQihhKSlyZXR1
+cm4gYisiLi4uIitjCnM9bmV3IFAuUm4oYikKQy5ObS5pKCQueGcsYSkKdHJ5e3I9cwpyLmE9UC52Zyhy
+LmEsYSwiLCAiKX1maW5hbGx5e2lmKDA+PSQueGcubGVuZ3RoKXJldHVybiBILk9IKCQueGcsLTEpCiQu
+eGcucG9wKCl9cy5hKz1jCnI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwKaEI6ZnVu
+Y3Rpb24oYSl7dmFyIHMscgpmb3Iocz0kLnhnLmxlbmd0aCxyPTA7cjxzOysrcilpZihhPT09JC54Z1ty
+XSlyZXR1cm4hMApyZXR1cm4hMX0sClZyOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbD1h
+LmdtKGEpLGs9MCxqPTAKd2hpbGUoITApe2lmKCEoazw4MHx8ajwzKSlicmVhawppZighbC5GKCkpcmV0
+dXJuCnM9SC5FaihsLmdsKCkpCkMuTm0uaShiLHMpCmsrPXMubGVuZ3RoKzI7KytqfWlmKCFsLkYoKSl7
+aWYoajw9NSlyZXR1cm4KaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKcj1iLnBvcCgpCmlm
+KDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCnE9Yi5wb3AoKX1lbHNle3A9bC5nbCgpOysragpp
+ZighbC5GKCkpe2lmKGo8PTQpe0MuTm0uaShiLEguRWoocCkpCnJldHVybn1yPUguRWoocCkKaWYoMD49
+Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKcT1iLnBvcCgpCmsrPXIubGVuZ3RoKzJ9ZWxzZXtvPWwu
+Z2woKTsrK2oKZm9yKDtsLkYoKTtwPW8sbz1uKXtuPWwuZ2woKTsrK2oKaWYoaj4xMDApe3doaWxlKCEw
+KXtpZighKGs+NzUmJmo+MykpYnJlYWsKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKay09
+Yi5wb3AoKS5sZW5ndGgrMjstLWp9Qy5ObS5pKGIsIi4uLiIpCnJldHVybn19cT1ILkVqKHApCnI9SC5F
+aihvKQprKz1yLmxlbmd0aCtxLmxlbmd0aCs0fX1pZihqPmIubGVuZ3RoKzIpe2srPTUKbT0iLi4uIn1l
+bHNlIG09bnVsbAp3aGlsZSghMCl7aWYoIShrPjgwJiZiLmxlbmd0aD4zKSlicmVhawppZigwPj1iLmxl
+bmd0aClyZXR1cm4gSC5PSChiLC0xKQprLT1iLnBvcCgpLmxlbmd0aCsyCmlmKG09PW51bGwpe2srPTUK
+bT0iLi4uIn19aWYobSE9bnVsbClDLk5tLmkoYixtKQpDLk5tLmkoYixxKQpDLk5tLmkoYixyKX0sCnRN
+OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPVAuTHMoYikKZm9yKHM9YS5sZW5ndGgscj0wO3I8YS5sZW5n
+dGg7YS5sZW5ndGg9PT1zfHwoMCxILmxrKShhKSwrK3IpcS5pKDAsYi5hKGFbcl0pKQpyZXR1cm4gcX0s
+Cm5POmZ1bmN0aW9uKGEpe3ZhciBzLHI9e30KaWYoUC5oQihhKSlyZXR1cm4iey4uLn0iCnM9bmV3IFAu
+Um4oIiIpCnRyeXtDLk5tLmkoJC54ZyxhKQpzLmErPSJ7IgpyLmE9ITAKYS5LKDAsbmV3IFAucmEocixz
+KSkKcy5hKz0ifSJ9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQok
+LnhnLnBvcCgpfXI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwKYjY6ZnVuY3Rpb24g
+YjYoYSl7dmFyIF89dGhpcwpfLmE9MApfLmY9Xy5lPV8uZD1fLmM9Xy5iPW51bGwKXy5yPTAKXy4kdGk9
+YX0sCmJuOmZ1bmN0aW9uIGJuKGEpe3RoaXMuYT1hCnRoaXMuYz10aGlzLmI9bnVsbH0sCmxtOmZ1bmN0
+aW9uIGxtKGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVsbApfLiR0aT1jfSwK
+bVc6ZnVuY3Rpb24gbVcoKXt9LAp1eTpmdW5jdGlvbiB1eSgpe30sCmxEOmZ1bmN0aW9uIGxEKCl7fSwK
+aWw6ZnVuY3Rpb24gaWwoKXt9LApyYTpmdW5jdGlvbiByYShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwK
+WWs6ZnVuY3Rpb24gWWsoKXt9LAp5UTpmdW5jdGlvbiB5UShhKXt0aGlzLmE9YX0sCktQOmZ1bmN0aW9u
+IEtQKCl7fSwKUG46ZnVuY3Rpb24gUG4oKXt9LApHajpmdW5jdGlvbiBHaihhLGIpe3RoaXMuYT1hCnRo
+aXMuJHRpPWJ9LApsZjpmdW5jdGlvbiBsZigpe30sClZqOmZ1bmN0aW9uIFZqKCl7fSwKWHY6ZnVuY3Rp
+b24gWHYoKXt9LApuWTpmdW5jdGlvbiBuWSgpe30sCldZOmZ1bmN0aW9uIFdZKCl7fSwKUlU6ZnVuY3Rp
+b24gUlUoKXt9LApwUjpmdW5jdGlvbiBwUigpe30sCkJTOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAK
+aWYodHlwZW9mIGEhPSJzdHJpbmciKXRocm93IEguYihILnRMKGEpKQpzPW51bGwKdHJ5e3M9SlNPTi5w
+YXJzZShhKX1jYXRjaChxKXtyPUguUnUocSkKcD1QLnJyKFN0cmluZyhyKSxudWxsLG51bGwpCnRocm93
+IEguYihwKX1wPVAuUWUocykKcmV0dXJuIHB9LApRZTpmdW5jdGlvbihhKXt2YXIgcwppZihhPT1udWxs
+KXJldHVybiBudWxsCmlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gYQppZihPYmplY3QuZ2V0UHJv
+dG90eXBlT2YoYSkhPT1BcnJheS5wcm90b3R5cGUpcmV0dXJuIG5ldyBQLnV3KGEsT2JqZWN0LmNyZWF0
+ZShudWxsKSkKZm9yKHM9MDtzPGEubGVuZ3RoOysrcylhW3NdPVAuUWUoYVtzXSkKcmV0dXJuIGF9LApr
+eTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyCmlmKGIgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtzPWIK
+ZD1zLmxlbmd0aAppZihkLWM8MTUpcmV0dXJuIG51bGwKcj1QLkNHKGEscyxjLGQpCmlmKHIhPW51bGwm
+JmEpaWYoci5pbmRleE9mKCJcdWZmZmQiKT49MClyZXR1cm4gbnVsbApyZXR1cm4gcn1yZXR1cm4gbnVs
+bH0sCkNHOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzPWE/JC5IRygpOiQucmYoKQppZihzPT1udWxsKXJl
+dHVybiBudWxsCmlmKDA9PT1jJiZkPT09Yi5sZW5ndGgpcmV0dXJuIFAuUmIocyxiKQpyZXR1cm4gUC5S
+YihzLGIuc3ViYXJyYXkoYyxQLmpCKGMsZCxiLmxlbmd0aCkpKX0sClJiOmZ1bmN0aW9uKGEsYil7dmFy
+IHMscgp0cnl7cz1hLmRlY29kZShiKQpyZXR1cm4gc31jYXRjaChyKXtILlJ1KHIpfXJldHVybiBudWxs
+fSwKeE06ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKEMuam4uelkoZiw0KSE9PTApdGhyb3cgSC5iKFAu
+cnIoIkludmFsaWQgYmFzZTY0IHBhZGRpbmcsIHBhZGRlZCBsZW5ndGggbXVzdCBiZSBtdWx0aXBsZSBv
+ZiBmb3VyLCBpcyAiK2YsYSxjKSkKaWYoZCtlIT09Zil0aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNl
+NjQgcGFkZGluZywgJz0nIG5vdCBhdCB0aGUgZW5kIixhLGIpKQppZihlPjIpdGhyb3cgSC5iKFAucnIo
+IkludmFsaWQgYmFzZTY0IHBhZGRpbmcsIG1vcmUgdGhhbiB0d28gJz0nIGNoYXJhY3RlcnMiLGEsYikp
+fSwKR3k6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgUC5VZChhLGIpfSwKTkM6ZnVuY3Rpb24oYSl7
+cmV0dXJuIGEuTHQoKX0sClVnOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLnR1KGEsW10sUC5DeSgp
+KX0sCnVYOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPW5ldyBQLlJuKCIiKSxxPVAuVWcocixiKQpxLmlV
+KGEpCnM9ci5hCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKajQ6ZnVuY3Rpb24oYSl7c3dp
+dGNoKGEpe2Nhc2UgNjU6cmV0dXJuIk1pc3NpbmcgZXh0ZW5zaW9uIGJ5dGUiCmNhc2UgNjc6cmV0dXJu
+IlVuZXhwZWN0ZWQgZXh0ZW5zaW9uIGJ5dGUiCmNhc2UgNjk6cmV0dXJuIkludmFsaWQgVVRGLTggYnl0
+ZSIKY2FzZSA3MTpyZXR1cm4iT3ZlcmxvbmcgZW5jb2RpbmciCmNhc2UgNzM6cmV0dXJuIk91dCBvZiB1
+bmljb2RlIHJhbmdlIgpjYXNlIDc1OnJldHVybiJFbmNvZGVkIHN1cnJvZ2F0ZSIKY2FzZSA3NzpyZXR1
+cm4iVW5maW5pc2hlZCBVVEYtOCBvY3RldCBzZXF1ZW5jZSIKZGVmYXVsdDpyZXR1cm4iIn19LApqeTpm
+dW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHA9Yy1iLG89bmV3IFVpbnQ4QXJyYXkocCkKZm9yKHM9Si5V
+NihhKSxyPTA7cjxwOysrcil7cT1zLnEoYSxiK3IpCmlmKHR5cGVvZiBxIT09Im51bWJlciIpcmV0dXJu
+IHEuek0oKQppZigocSY0Mjk0OTY3MDQwKT4+PjAhPT0wKXE9MjU1CmlmKHI+PXApcmV0dXJuIEguT0go
+byxyKQpvW3JdPXF9cmV0dXJuIG99LAp1dzpmdW5jdGlvbiB1dyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
+CnRoaXMuYz1udWxsfSwKaTg6ZnVuY3Rpb24gaTgoYSl7dGhpcy5hPWF9LApwZzpmdW5jdGlvbiBwZygp
+e30sCmMyOmZ1bmN0aW9uIGMyKCl7fSwKQ1Y6ZnVuY3Rpb24gQ1YoKXt9LApVODpmdW5jdGlvbiBVOCgp
+e30sClVrOmZ1bmN0aW9uIFVrKCl7fSwKd0k6ZnVuY3Rpb24gd0koKXt9LApaaTpmdW5jdGlvbiBaaSgp
+e30sClVkOmZ1bmN0aW9uIFVkKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApLODpmdW5jdGlvbiBLOChh
+LGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKYnk6ZnVuY3Rpb24gYnkoKXt9LApvajpmdW5jdGlvbiBvaihh
+KXt0aGlzLmI9YX0sCk14OmZ1bmN0aW9uIE14KGEpe3RoaXMuYT1hfSwKU2g6ZnVuY3Rpb24gU2goKXt9
+LAp0aTpmdW5jdGlvbiB0aShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKdHU6ZnVuY3Rpb24gdHUoYSxi
+LGMpe3RoaXMuYz1hCnRoaXMuYT1iCnRoaXMuYj1jfSwKdTU6ZnVuY3Rpb24gdTUoKXt9LApFMzpmdW5j
+dGlvbiBFMygpe30sClJ3OmZ1bmN0aW9uIFJ3KGEpe3RoaXMuYj0wCnRoaXMuYz1hfSwKR1k6ZnVuY3Rp
+b24gR1koYSl7dGhpcy5hPWF9LApiejpmdW5jdGlvbiBieihhKXt0aGlzLmE9YQp0aGlzLmI9MTYKdGhp
+cy5jPTB9LApRQTpmdW5jdGlvbihhLGIpe3ZhciBzPUguSHAoYSxiKQppZihzIT1udWxsKXJldHVybiBz
+CnRocm93IEguYihQLnJyKGEsbnVsbCxudWxsKSl9LApvczpmdW5jdGlvbihhKXtpZihhIGluc3RhbmNl
+b2YgSC5UcClyZXR1cm4gYS53KDApCnJldHVybiJJbnN0YW5jZSBvZiAnIitILkVqKEguTShhKSkrIici
+fSwKTzg6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscj1jP0ouS2goYSxkKTpKLlFpKGEsZCkKaWYoYSE9
+PTAmJmIhPW51bGwpZm9yKHM9MDtzPHIubGVuZ3RoOysrcylyW3NdPWIKcmV0dXJuIHJ9LApDSDpmdW5j
+dGlvbihhLGIsYyl7dmFyIHMscj1ILlZNKFtdLGMuQygiamQ8MD4iKSkKZm9yKHM9Si5JVChhKTtzLkYo
+KTspQy5ObS5pKHIsYy5hKHMuZ2woKSkpCmlmKGIpcmV0dXJuIHIKcmV0dXJuIEouRXAocixjKX0sCmRI
+OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPUouS2goYSxjKQpmb3Iocz0wO3M8YTsrK3MpQy5ObS5ZKHIs
+cyxiLiQxKHMpKQpyZXR1cm4gcn0sCkFGOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouekMoUC5DSChhLCEx
+LGIpKX0sCkhNOmZ1bmN0aW9uKGEsYixjKXtpZih0LmJtLmIoYSkpcmV0dXJuIEguZncoYSxiLFAuakIo
+YixjLGEubGVuZ3RoKSkKcmV0dXJuIFAuYncoYSxiLGMpfSwKT286ZnVuY3Rpb24oYSl7cmV0dXJuIEgu
+THcoYSl9LApidzpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAsbyxuPW51bGwKaWYoYjwwKXRocm93
+IEguYihQLlRFKGIsMCxhLmxlbmd0aCxuLG4pKQpzPWM9PW51bGwKaWYoIXMmJmM8Yil0aHJvdyBILmIo
+UC5URShjLGIsYS5sZW5ndGgsbixuKSkKcj1uZXcgSC5hNyhhLGEubGVuZ3RoLEgueihhKS5DKCJhNzxs
+RC5FPiIpKQpmb3IocT0wO3E8YjsrK3EpaWYoIXIuRigpKXRocm93IEguYihQLlRFKGIsMCxxLG4sbikp
+CnA9W10KaWYocylmb3IoO3IuRigpOyl7bz1yLmQKcC5wdXNoKG8pfWVsc2UgZm9yKHE9YjtxPGM7Kytx
+KXtpZighci5GKCkpdGhyb3cgSC5iKFAuVEUoYyxiLHEsbixuKSkKbz1yLmQKcC5wdXNoKG8pfXJldHVy
+biBILmVUKHApfSwKbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlZSKGEsSC52NChhLCExLCEwLCEx
+LCExLCExKSl9LAp2ZzpmdW5jdGlvbihhLGIsYyl7dmFyIHM9Si5JVChiKQppZighcy5GKCkpcmV0dXJu
+IGEKaWYoYy5sZW5ndGg9PT0wKXtkbyBhKz1ILkVqKHMuZ2woKSkKd2hpbGUocy5GKCkpfWVsc2V7YSs9
+SC5FaihzLmdsKCkpCmZvcig7cy5GKCk7KWE9YStjK0guRWoocy5nbCgpKX1yZXR1cm4gYX0sCmxyOmZ1
+bmN0aW9uKGEsYixjLGQpe3JldHVybiBuZXcgUC5tcChhLGIsYyxkKX0sCnVvOmZ1bmN0aW9uKCl7dmFy
+IHM9SC5NMCgpCmlmKHMhPW51bGwpcmV0dXJuIFAuaEsocykKdGhyb3cgSC5iKFAuTDQoIidVcmkuYmFz
+ZScgaXMgbm90IHN1cHBvcnRlZCIpKX0sCmVQOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxwLG8s
+bixtPSIwMTIzNDU2Nzg5QUJDREVGIgppZihjPT09Qy54TSl7cz0kLno0KCkuYgppZih0eXBlb2YgYiE9
+InN0cmluZyIpSC52KEgudEwoYikpCnM9cy50ZXN0KGIpfWVsc2Ugcz0hMQppZihzKXJldHVybiBiCkgu
+TGgoYykuQygiVWsuUyIpLmEoYikKcj1jLmdaRSgpLldKKGIpCmZvcihzPXIubGVuZ3RoLHE9MCxwPSIi
+O3E8czsrK3Epe289cltxXQppZihvPDEyOCl7bj1vPj4+NAppZihuPj04KXJldHVybiBILk9IKGEsbikK
+bj0oYVtuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEKaWYobilwKz1ILkx3KG8pCmVsc2UgcD1kJiZv
+PT09MzI/cCsiKyI6cCsiJSIrbVtvPj4+NCYxNV0rbVtvJjE1XX1yZXR1cm4gcC5jaGFyQ29kZUF0KDAp
+PT0wP3A6cH0sCkdxOmZ1bmN0aW9uKGEpe3ZhciBzPU1hdGguYWJzKGEpLHI9YTwwPyItIjoiIgppZihz
+Pj0xMDAwKXJldHVybiIiK2EKaWYocz49MTAwKXJldHVybiByKyIwIitzCmlmKHM+PTEwKXJldHVybiBy
+KyIwMCIrcwpyZXR1cm4gcisiMDAwIitzfSwKVng6ZnVuY3Rpb24oYSl7aWYoYT49MTAwKXJldHVybiIi
+K2EKaWYoYT49MTApcmV0dXJuIjAiK2EKcmV0dXJuIjAwIithfSwKaDA6ZnVuY3Rpb24oYSl7aWYoYT49
+MTApcmV0dXJuIiIrYQpyZXR1cm4iMCIrYX0sCmhsOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVt
+YmVyInx8SC5sKGEpfHxudWxsPT1hKXJldHVybiBKLmooYSkKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJl
+dHVybiBKU09OLnN0cmluZ2lmeShhKQpyZXR1cm4gUC5vcyhhKX0sCmhWOmZ1bmN0aW9uKGEpe3JldHVy
+biBuZXcgUC5DNihhKX0sCnhZOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC51KCExLG51bGwsbnVsbCxh
+KX0sCkwzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFAudSghMCxhLGIsYyl9LApVSTpmdW5jdGlv
+bihhLGIsYyl7aWYoYT09bnVsbCl0aHJvdyBILmIobmV3IFAudSghMSxudWxsLGIsIk11c3Qgbm90IGJl
+IG51bGwiKSkKcmV0dXJuIGF9LApPNzpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5iSihudWxsLG51
+bGwsITAsYSxiLCJWYWx1ZSBub3QgaW4gcmFuZ2UiKX0sClRFOmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0
+dXJuIG5ldyBQLmJKKGIsYywhMCxhLGQsIkludmFsaWQgdmFsdWUiKX0sCndBOmZ1bmN0aW9uKGEsYixj
+LGQpe2lmKGE8Ynx8YT5jKXRocm93IEguYihQLlRFKGEsYixjLGQsbnVsbCkpCnJldHVybiBhfSwKakI6
+ZnVuY3Rpb24oYSxiLGMpe2lmKDA+YXx8YT5jKXRocm93IEguYihQLlRFKGEsMCxjLCJzdGFydCIsbnVs
+bCkpCmlmKGIhPW51bGwpe2lmKGE+Ynx8Yj5jKXRocm93IEguYihQLlRFKGIsYSxjLCJlbmQiLG51bGwp
+KQpyZXR1cm4gYn1yZXR1cm4gY30sCmsxOmZ1bmN0aW9uKGEsYil7aWYoYTwwKXRocm93IEguYihQLlRF
+KGEsMCxudWxsLGIsbnVsbCkpCnJldHVybiBhfSwKQ2Y6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcz1I
+LnVQKGU9PW51bGw/Si5IbShiKTplKQpyZXR1cm4gbmV3IFAuZVkocywhMCxhLGMsIkluZGV4IG91dCBv
+ZiByYW5nZSIpfSwKTDQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLnViKGEpfSwKU1k6ZnVuY3Rpb24o
+YSl7cmV0dXJuIG5ldyBQLmRzKGEpfSwKUFY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmxqKGEpfSwK
+YTQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLlVWKGEpfSwKcnI6ZnVuY3Rpb24oYSxiLGMpe3JldHVy
+biBuZXcgUC5hRShhLGIsYyl9LApoSzpmdW5jdGlvbihhNSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGos
+aSxoLGcsZixlLGQsYyxiLGEsYTAsYTEsYTIsYTM9bnVsbCxhND1hNS5sZW5ndGgKaWYoYTQ+PTUpe3M9
+KChKLlF6KGE1LDQpXjU4KSozfEMueEIuVyhhNSwwKV4xMDB8Qy54Qi5XKGE1LDEpXjk3fEMueEIuVyhh
+NSwyKV4xMTZ8Qy54Qi5XKGE1LDMpXjk3KT4+PjAKaWYocz09PTApcmV0dXJuIFAuS0QoYTQ8YTQ/Qy54
+Qi5OaihhNSwwLGE0KTphNSw1LGEzKS5nbFIoKQplbHNlIGlmKHM9PT0zMilyZXR1cm4gUC5LRChDLnhC
+Lk5qKGE1LDUsYTQpLDAsYTMpLmdsUigpfXI9UC5POCg4LDAsITEsdC5TKQpDLk5tLlkociwwLDApCkMu
+Tm0uWShyLDEsLTEpCkMuTm0uWShyLDIsLTEpCkMuTm0uWShyLDcsLTEpCkMuTm0uWShyLDMsMCkKQy5O
+bS5ZKHIsNCwwKQpDLk5tLlkociw1LGE0KQpDLk5tLlkociw2LGE0KQppZihQLlVCKGE1LDAsYTQsMCxy
+KT49MTQpQy5ObS5ZKHIsNyxhNCkKcT1yWzFdCmlmKHE+PTApaWYoUC5VQihhNSwwLHEsMjAscik9PT0y
+MClyWzddPXEKcD1yWzJdKzEKbz1yWzNdCm49cls0XQptPXJbNV0KbD1yWzZdCmlmKGw8bSltPWwKaWYo
+bjxwKW49bQplbHNlIGlmKG48PXEpbj1xKzEKaWYobzxwKW89bgprPXJbN108MAppZihrKWlmKHA+cSsz
+KXtqPWEzCms9ITF9ZWxzZXtpPW8+MAppZihpJiZvKzE9PT1uKXtqPWEzCms9ITF9ZWxzZXtpZighKG08
+YTQmJm09PT1uKzImJkoucTAoYTUsIi4uIixuKSkpaD1tPm4rMiYmSi5xMChhNSwiLy4uIixtLTMpCmVs
+c2UgaD0hMAppZihoKXtqPWEzCms9ITF9ZWxzZXtpZihxPT09NClpZihKLnEwKGE1LCJmaWxlIiwwKSl7
+aWYocDw9MCl7aWYoIUMueEIuUWkoYTUsIi8iLG4pKXtnPSJmaWxlOi8vLyIKcz0zfWVsc2V7Zz0iZmls
+ZTovLyIKcz0yfWE1PWcrQy54Qi5OaihhNSxuLGE0KQpxLT0wCmk9cy0wCm0rPWkKbCs9aQphND1hNS5s
+ZW5ndGgKcD03Cm89NwpuPTd9ZWxzZSBpZihuPT09bSl7KytsCmY9bSsxCmE1PUMueEIuaTcoYTUsbixt
+LCIvIik7KythNAptPWZ9aj0iZmlsZSJ9ZWxzZSBpZihDLnhCLlFpKGE1LCJodHRwIiwwKSl7aWYoaSYm
+byszPT09biYmQy54Qi5RaShhNSwiODAiLG8rMSkpe2wtPTMKZT1uLTMKbS09MwphNT1DLnhCLmk3KGE1
+LG8sbiwiIikKYTQtPTMKbj1lfWo9Imh0dHAifWVsc2Ugaj1hMwplbHNlIGlmKHE9PT01JiZKLnEwKGE1
+LCJodHRwcyIsMCkpe2lmKGkmJm8rND09PW4mJkoucTAoYTUsIjQ0MyIsbysxKSl7bC09NAplPW4tNApt
+LT00CmE1PUouZGcoYTUsbyxuLCIiKQphNC09MwpuPWV9aj0iaHR0cHMifWVsc2Ugaj1hMwprPSEwfX19
+ZWxzZSBqPWEzCmlmKGspe2k9YTUubGVuZ3RoCmlmKGE0PGkpe2E1PUoubGQoYTUsMCxhNCkKcS09MApw
+LT0wCm8tPTAKbi09MAptLT0wCmwtPTB9cmV0dXJuIG5ldyBQLlVmKGE1LHEscCxvLG4sbSxsLGopfWlm
+KGo9PW51bGwpaWYocT4wKWo9UC5QaShhNSwwLHEpCmVsc2V7aWYocT09PTApe1AuUjMoYTUsMCwiSW52
+YWxpZCBlbXB0eSBzY2hlbWUiKQpILkJpKHUuZyl9aj0iIn1pZihwPjApe2Q9cSszCmM9ZDxwP1AuelIo
+YTUsZCxwLTEpOiIiCmI9UC5PZShhNSxwLG8sITEpCmk9bysxCmlmKGk8bil7YT1ILkhwKEoubGQoYTUs
+aSxuKSxhMykKYTA9UC53QihhPT1udWxsP0gudihQLnJyKCJJbnZhbGlkIHBvcnQiLGE1LGkpKTphLGop
+fWVsc2UgYTA9YTN9ZWxzZXthMD1hMwpiPWEwCmM9IiJ9YTE9UC5rYShhNSxuLG0sYTMsaixiIT1udWxs
+KQphMj1tPGw/UC5sZShhNSxtKzEsbCxhMyk6YTMKcmV0dXJuIG5ldyBQLkRuKGosYyxiLGEwLGExLGEy
+LGw8YTQ/UC50RyhhNSxsKzEsYTQpOmEzKX0sCk10OmZ1bmN0aW9uKGEpe0guaChhKQpyZXR1cm4gUC5r
+dShhLDAsYS5sZW5ndGgsQy54TSwhMSl9LApXWDpmdW5jdGlvbihhKXt2YXIgcz10Lk4KcmV0dXJuIEMu
+Tm0uTjAoSC5WTShhLnNwbGl0KCImIiksdC5zKSxQLkZsKHMscyksbmV3IFAubjEoQy54TSksdC5KKX0s
+CkhoOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbT0iSVB2NCBhZGRyZXNzIHNob3VsZCBj
+b250YWluIGV4YWN0bHkgNCBwYXJ0cyIsbD0iZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAu
+LjI1NSIsaz1uZXcgUC5jUyhhKSxqPW5ldyBVaW50OEFycmF5KDQpCmZvcihzPWIscj1zLHE9MDtzPGM7
+KytzKXtwPUMueEIuTzIoYSxzKQppZihwIT09NDYpe2lmKChwXjQ4KT45KWsuJDIoImludmFsaWQgY2hh
+cmFjdGVyIixzKX1lbHNle2lmKHE9PT0zKWsuJDIobSxzKQpvPVAuUUEoQy54Qi5OaihhLHIscyksbnVs
+bCkKaWYobz4yNTUpay4kMihsLHIpCm49cSsxCmlmKHE+PTQpcmV0dXJuIEguT0goaixxKQpqW3FdPW8K
+cj1zKzEKcT1ufX1pZihxIT09MylrLiQyKG0sYykKbz1QLlFBKEMueEIuTmooYSxyLGMpLG51bGwpCmlm
+KG8+MjU1KWsuJDIobCxyKQppZihxPj00KXJldHVybiBILk9IKGoscSkKaltxXT1vCnJldHVybiBqfSwK
+ZWc6ZnVuY3Rpb24oYSxiLGEwKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZD1uZXcg
+UC5WQyhhKSxjPW5ldyBQLkpUKGQsYSkKaWYoYS5sZW5ndGg8MilkLiQxKCJhZGRyZXNzIGlzIHRvbyBz
+aG9ydCIpCnM9SC5WTShbXSx0LmEpCmZvcihyPWIscT1yLHA9ITEsbz0hMTtyPGEwOysrcil7bj1DLnhC
+Lk8yKGEscikKaWYobj09PTU4KXtpZihyPT09Yil7KytyCmlmKEMueEIuTzIoYSxyKSE9PTU4KWQuJDIo
+ImludmFsaWQgc3RhcnQgY29sb24uIixyKQpxPXJ9aWYocj09PXEpe2lmKHApZC4kMigib25seSBvbmUg
+d2lsZGNhcmQgYDo6YCBpcyBhbGxvd2VkIixyKQpDLk5tLmkocywtMSkKcD0hMH1lbHNlIEMuTm0uaShz
+LGMuJDIocSxyKSkKcT1yKzF9ZWxzZSBpZihuPT09NDYpbz0hMH1pZihzLmxlbmd0aD09PTApZC4kMSgi
+dG9vIGZldyBwYXJ0cyIpCm09cT09PWEwCmw9Qy5ObS5ncloocykKaWYobSYmbCE9PS0xKWQuJDIoImV4
+cGVjdGVkIGEgcGFydCBhZnRlciBsYXN0IGA6YCIsYTApCmlmKCFtKWlmKCFvKUMuTm0uaShzLGMuJDIo
+cSxhMCkpCmVsc2V7az1QLkhoKGEscSxhMCkKQy5ObS5pKHMsKGtbMF08PDh8a1sxXSk+Pj4wKQpDLk5t
+Lmkocywoa1syXTw8OHxrWzNdKT4+PjApfWlmKHApe2lmKHMubGVuZ3RoPjcpZC4kMSgiYW4gYWRkcmVz
+cyB3aXRoIGEgd2lsZGNhcmQgbXVzdCBoYXZlIGxlc3MgdGhhbiA3IHBhcnRzIil9ZWxzZSBpZihzLmxl
+bmd0aCE9PTgpZC4kMSgiYW4gYWRkcmVzcyB3aXRob3V0IGEgd2lsZGNhcmQgbXVzdCBjb250YWluIGV4
+YWN0bHkgOCBwYXJ0cyIpCmo9bmV3IFVpbnQ4QXJyYXkoMTYpCmZvcihsPXMubGVuZ3RoLGk9OS1sLHI9
+MCxoPTA7cjxsOysrcil7Zz1zW3JdCmlmKGc9PT0tMSlmb3IoZj0wO2Y8aTsrK2Ype2lmKGg8MHx8aD49
+MTYpcmV0dXJuIEguT0goaixoKQpqW2hdPTAKZT1oKzEKaWYoZT49MTYpcmV0dXJuIEguT0goaixlKQpq
+W2VdPTAKaCs9Mn1lbHNle2U9Qy5qbi53RyhnLDgpCmlmKGg8MHx8aD49MTYpcmV0dXJuIEguT0goaixo
+KQpqW2hdPWUKZT1oKzEKaWYoZT49MTYpcmV0dXJuIEguT0goaixlKQpqW2VdPWcmMjU1CmgrPTJ9fXJl
+dHVybiBqfSwKS0w6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHMscixxLHAsbyxuCmY9Zj09bnVs
+bD8iIjpQLlBpKGYsMCxmLmxlbmd0aCkKZz1QLnpSKGcsMCxnPT1udWxsPzA6Zy5sZW5ndGgpCmE9UC5P
+ZShhLDAsYT09bnVsbD8wOmEubGVuZ3RoLCExKQpzPVAubGUobnVsbCwwLDAsZSkKcj1QLnRHKG51bGws
+MCwwKQpkPVAud0IoZCxmKQpxPWY9PT0iZmlsZSIKaWYoYT09bnVsbClwPWcubGVuZ3RoIT09MHx8ZCE9
+bnVsbHx8cQplbHNlIHA9ITEKaWYocClhPSIiCnA9YT09bnVsbApvPSFwCmI9UC5rYShiLDAsYj09bnVs
+bD8wOmIubGVuZ3RoLGMsZixvKQpuPWYubGVuZ3RoPT09MAppZihuJiZwJiYhQy54Qi5uKGIsIi8iKSli
+PVAud0YoYiwhbnx8bykKZWxzZSBiPVAueGUoYikKcmV0dXJuIG5ldyBQLkRuKGYsZyxwJiZDLnhCLm4o
+YiwiLy8iKT8iIjphLGQsYixzLHIpfSwKd0s6ZnVuY3Rpb24oYSl7aWYoYT09PSJodHRwIilyZXR1cm4g
+ODAKaWYoYT09PSJodHRwcyIpcmV0dXJuIDQ0MwpyZXR1cm4gMH0sClIzOmZ1bmN0aW9uKGEsYixjKXt0
+aHJvdyBILmIoUC5ycihjLGEsYikpfSwKWGQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbyxu
+LG0sbCxrLGosaSxoPW51bGwsZz1iLmxlbmd0aAppZihnIT09MCl7cT0wCndoaWxlKCEwKXtpZighKHE8
+Zykpe3M9IiIKcj0wCmJyZWFrfWlmKEMueEIuVyhiLHEpPT09NjQpe3M9Qy54Qi5OaihiLDAscSkKcj1x
+KzEKYnJlYWt9KytxfWlmKHI8ZyYmQy54Qi5XKGIscik9PT05MSl7Zm9yKHA9cixvPS0xO3A8ZzsrK3Ap
+e249Qy54Qi5XKGIscCkKaWYobj09PTM3JiZvPDApe209Qy54Qi5RaShiLCIyNSIscCsxKT9wKzI6cApv
+PXAKcD1tfWVsc2UgaWYobj09PTkzKWJyZWFrfWlmKHA9PT1nKXRocm93IEguYihQLnJyKCJJbnZhbGlk
+IElQdjYgaG9zdCBlbnRyeS4iLGIscikpCmw9bzwwP3A6bwpQLmVnKGIscisxLGwpOysrcAppZihwIT09
+ZyYmQy54Qi5XKGIscCkhPT01OCl0aHJvdyBILmIoUC5ycigiSW52YWxpZCBlbmQgb2YgYXV0aG9yaXR5
+IixiLHApKX1lbHNlIHA9cgp3aGlsZSghMCl7aWYoIShwPGcpKXtrPWgKYnJlYWt9aWYoQy54Qi5XKGIs
+cCk9PT01OCl7aj1DLnhCLkcoYixwKzEpCms9ai5sZW5ndGghPT0wP1AuUUEoaixoKTpoCmJyZWFrfSsr
+cH1pPUMueEIuTmooYixyLHApfWVsc2V7az1oCmk9awpzPSIifXJldHVybiBQLktMKGksaCxILlZNKGMu
+c3BsaXQoIi8iKSx0LnMpLGssZCxhLHMpfSwKa0U6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvCmZv
+cihzPWEubGVuZ3RoLHI9MDtyPHM7KytyKXtxPWFbcl0KcS50b1N0cmluZwpwPUouVTYocSkKbz1wLmdB
+KHEpCmlmKDA+bylILnYoUC5URSgwLDAscC5nQShxKSxudWxsLG51bGwpKQppZihILlNRKHEsIi8iLDAp
+KXtzPVAuTDQoIklsbGVnYWwgcGF0aCBjaGFyYWN0ZXIgIitILkVqKHEpKQp0aHJvdyBILmIocyl9fX0s
+CkhOOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEKZm9yKHM9SC5xQyhhLGMsbnVsbCxILnQ2KGEpLmMp
+LHM9bmV3IEguYTcocyxzLmdBKHMpLHMuJHRpLkMoImE3PGFMLkU+IikpO3MuRigpOyl7cj1zLmQKcT1Q
+Lm51KCdbIiovOjw+P1xcXFx8XScpCnIudG9TdHJpbmcKaWYoSC5TUShyLHEsMCkpe3M9UC5MNCgiSWxs
+ZWdhbCBjaGFyYWN0ZXIgaW4gcGF0aDogIityKQp0aHJvdyBILmIocyl9fX0sCnJnOmZ1bmN0aW9uKGEs
+Yil7dmFyIHMKaWYoISg2NTw9YSYmYTw9OTApKXM9OTc8PWEmJmE8PTEyMgplbHNlIHM9ITAKaWYocyly
+ZXR1cm4Kcz1QLkw0KCJJbGxlZ2FsIGRyaXZlIGxldHRlciAiK1AuT28oYSkpCnRocm93IEguYihzKX0s
+CndCOmZ1bmN0aW9uKGEsYil7aWYoYSE9bnVsbCYmYT09PVAud0soYikpcmV0dXJuIG51bGwKcmV0dXJu
+IGF9LApPZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4KaWYoYT09bnVsbClyZXR1cm4g
+bnVsbAppZihiPT09YylyZXR1cm4iIgppZihDLnhCLk8yKGEsYik9PT05MSl7cz1jLTEKaWYoQy54Qi5P
+MihhLHMpIT09OTMpe1AuUjMoYSxiLCJNaXNzaW5nIGVuZCBgXWAgdG8gbWF0Y2ggYFtgIGluIGhvc3Qi
+KQpILkJpKHUuZyl9cj1iKzEKcT1QLnRvKGEscixzKQppZihxPHMpe3A9cSsxCm89UC5PQShhLEMueEIu
+UWkoYSwiMjUiLHApP3ErMzpwLHMsIiUyNSIpfWVsc2Ugbz0iIgpQLmVnKGEscixxKQpyZXR1cm4gQy54
+Qi5OaihhLGIscSkudG9Mb3dlckNhc2UoKStvKyJdIn1mb3Iobj1iO248YzsrK24paWYoQy54Qi5PMihh
+LG4pPT09NTgpe3E9Qy54Qi5YVShhLCIlIixiKQpxPXE+PWImJnE8Yz9xOmMKaWYocTxjKXtwPXErMQpv
+PVAuT0EoYSxDLnhCLlFpKGEsIjI1IixwKT9xKzM6cCxjLCIlMjUiKX1lbHNlIG89IiIKUC5lZyhhLGIs
+cSkKcmV0dXJuIlsiK0MueEIuTmooYSxiLHEpK28rIl0ifXJldHVybiBQLk9MKGEsYixjKX0sCnRvOmZ1
+bmN0aW9uKGEsYixjKXt2YXIgcz1DLnhCLlhVKGEsIiUiLGIpCnJldHVybiBzPj1iJiZzPGM/czpjfSwK
+T0E6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaT1kIT09IiI/bmV3IFAu
+Um4oZCk6bnVsbApmb3Iocz1iLHI9cyxxPSEwO3M8Yzspe3A9Qy54Qi5PMihhLHMpCmlmKHA9PT0zNyl7
+bz1QLnJ2KGEscywhMCkKbj1vPT1udWxsCmlmKG4mJnEpe3MrPTMKY29udGludWV9aWYoaT09bnVsbClp
+PW5ldyBQLlJuKCIiKQptPWkuYSs9Qy54Qi5OaihhLHIscykKaWYobilvPUMueEIuTmooYSxzLHMrMykK
+ZWxzZSBpZihvPT09IiUiKXtQLlIzKGEscywiWm9uZUlEIHNob3VsZCBub3QgY29udGFpbiAlIGFueW1v
+cmUiKQpILkJpKHUuZyl9aS5hPW0rbwpzKz0zCnI9cwpxPSEwfWVsc2V7aWYocDwxMjcpe249cD4+PjQK
+aWYobj49OClyZXR1cm4gSC5PSChDLkYzLG4pCm49KEMuRjNbbl0mMTw8KHAmMTUpKSE9PTB9ZWxzZSBu
+PSExCmlmKG4pe2lmKHEmJjY1PD1wJiY5MD49cCl7aWYoaT09bnVsbClpPW5ldyBQLlJuKCIiKQppZihy
+PHMpe2kuYSs9Qy54Qi5OaihhLHIscykKcj1zfXE9ITF9KytzfWVsc2V7aWYoKHAmNjQ1MTIpPT09NTUy
+OTYmJnMrMTxjKXtsPUMueEIuTzIoYSxzKzEpCmlmKChsJjY0NTEyKT09PTU2MzIwKXtwPShwJjEwMjMp
+PDwxMHxsJjEwMjN8NjU1MzYKaz0yfWVsc2Ugaz0xfWVsc2Ugaz0xCmo9Qy54Qi5OaihhLHIscykKaWYo
+aT09bnVsbCl7aT1uZXcgUC5SbigiIikKbj1pfWVsc2Ugbj1pCm4uYSs9agpuLmErPVAuelgocCkKcys9
+awpyPXN9fX1pZihpPT1udWxsKXJldHVybiBDLnhCLk5qKGEsYixjKQppZihyPGMpaS5hKz1DLnhCLk5q
+KGEscixjKQpuPWkuYQpyZXR1cm4gbi5jaGFyQ29kZUF0KDApPT0wP246bn0sCk9MOmZ1bmN0aW9uKGEs
+YixjKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpCmZvcihzPWIscj1zLHE9bnVsbCxwPSEwO3M8Yzsp
+e289Qy54Qi5PMihhLHMpCmlmKG89PT0zNyl7bj1QLnJ2KGEscywhMCkKbT1uPT1udWxsCmlmKG0mJnAp
+e3MrPTMKY29udGludWV9aWYocT09bnVsbClxPW5ldyBQLlJuKCIiKQpsPUMueEIuTmooYSxyLHMpCms9
+cS5hKz0hcD9sLnRvTG93ZXJDYXNlKCk6bAppZihtKXtuPUMueEIuTmooYSxzLHMrMykKaj0zfWVsc2Ug
+aWYobj09PSIlIil7bj0iJTI1IgpqPTF9ZWxzZSBqPTMKcS5hPWsrbgpzKz1qCnI9cwpwPSEwfWVsc2V7
+aWYobzwxMjcpe209bz4+PjQKaWYobT49OClyZXR1cm4gSC5PSChDLmVhLG0pCm09KEMuZWFbbV0mMTw8
+KG8mMTUpKSE9PTB9ZWxzZSBtPSExCmlmKG0pe2lmKHAmJjY1PD1vJiY5MD49byl7aWYocT09bnVsbClx
+PW5ldyBQLlJuKCIiKQppZihyPHMpe3EuYSs9Qy54Qi5OaihhLHIscykKcj1zfXA9ITF9KytzfWVsc2V7
+aWYobzw9OTMpe209bz4+PjQKaWYobT49OClyZXR1cm4gSC5PSChDLmFrLG0pCm09KEMuYWtbbV0mMTw8
+KG8mMTUpKSE9PTB9ZWxzZSBtPSExCmlmKG0pe1AuUjMoYSxzLCJJbnZhbGlkIGNoYXJhY3RlciIpCkgu
+QmkodS5nKX1lbHNle2lmKChvJjY0NTEyKT09PTU1Mjk2JiZzKzE8Yyl7aT1DLnhCLk8yKGEscysxKQpp
+ZigoaSY2NDUxMik9PT01NjMyMCl7bz0obyYxMDIzKTw8MTB8aSYxMDIzfDY1NTM2Cmo9Mn1lbHNlIGo9
+MX1lbHNlIGo9MQpsPUMueEIuTmooYSxyLHMpCmlmKCFwKWw9bC50b0xvd2VyQ2FzZSgpCmlmKHE9PW51
+bGwpe3E9bmV3IFAuUm4oIiIpCm09cX1lbHNlIG09cQptLmErPWwKbS5hKz1QLnpYKG8pCnMrPWoKcj1z
+fX19fWlmKHE9PW51bGwpcmV0dXJuIEMueEIuTmooYSxiLGMpCmlmKHI8Yyl7bD1DLnhCLk5qKGEscixj
+KQpxLmErPSFwP2wudG9Mb3dlckNhc2UoKTpsfW09cS5hCnJldHVybiBtLmNoYXJDb2RlQXQoMCk9PTA/
+bTptfSwKUGk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG89dS5nCmlmKGI9PT1jKXJldHVybiIi
+CmlmKCFQLkV0KEouclkoYSkuVyhhLGIpKSl7UC5SMyhhLGIsIlNjaGVtZSBub3Qgc3RhcnRpbmcgd2l0
+aCBhbHBoYWJldGljIGNoYXJhY3RlciIpCkguQmkobyl9Zm9yKHM9YixyPSExO3M8YzsrK3Mpe3E9Qy54
+Qi5XKGEscykKaWYocTwxMjgpe3A9cT4+PjQKaWYocD49OClyZXR1cm4gSC5PSChDLm1LLHApCnA9KEMu
+bUtbcF0mMTw8KHEmMTUpKSE9PTB9ZWxzZSBwPSExCmlmKCFwKXtQLlIzKGEscywiSWxsZWdhbCBzY2hl
+bWUgY2hhcmFjdGVyIikKSC5CaShvKX1pZig2NTw9cSYmcTw9OTApcj0hMH1hPUMueEIuTmooYSxiLGMp
+CnJldHVybiBQLllhKHI/YS50b0xvd2VyQ2FzZSgpOmEpfSwKWWE6ZnVuY3Rpb24oYSl7aWYoYT09PSJo
+dHRwIilyZXR1cm4iaHR0cCIKaWYoYT09PSJmaWxlIilyZXR1cm4iZmlsZSIKaWYoYT09PSJodHRwcyIp
+cmV0dXJuImh0dHBzIgppZihhPT09InBhY2thZ2UiKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gYX0sCnpS
+OmZ1bmN0aW9uKGEsYixjKXtpZihhPT1udWxsKXJldHVybiIiCnJldHVybiBQLlBJKGEsYixjLEMudG8s
+ITEpfSwKa2E6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBzLHIscT1lPT09ImZpbGUiLHA9cXx8Zgpp
+ZihhPT1udWxsKXtpZihkPT1udWxsKXJldHVybiBxPyIvIjoiIgpzPUgudDYoZCkKcj1uZXcgSC5sSihk
+LHMuQygicVUoMSkiKS5hKG5ldyBQLlJaKCkpLHMuQygibEo8MSxxVT4iKSkuSCgwLCIvIil9ZWxzZSBp
+ZihkIT1udWxsKXRocm93IEguYihQLnhZKCJCb3RoIHBhdGggYW5kIHBhdGhTZWdtZW50cyBzcGVjaWZp
+ZWQiKSkKZWxzZSByPVAuUEkoYSxiLGMsQy5XZCwhMCkKaWYoci5sZW5ndGg9PT0wKXtpZihxKXJldHVy
+biIvIn1lbHNlIGlmKHAmJiFDLnhCLm4ociwiLyIpKXI9Ii8iK3IKcmV0dXJuIFAuSnIocixlLGYpfSwK
+SnI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPWIubGVuZ3RoPT09MAppZihzJiYhYyYmIUMueEIubihhLCIv
+IikpcmV0dXJuIFAud0YoYSwhc3x8YykKcmV0dXJuIFAueGUoYSl9LApsZTpmdW5jdGlvbihhLGIsYyxk
+KXt2YXIgcyxyPXt9CmlmKGEhPW51bGwpe2lmKGQhPW51bGwpdGhyb3cgSC5iKFAueFkoIkJvdGggcXVl
+cnkgYW5kIHF1ZXJ5UGFyYW1ldGVycyBzcGVjaWZpZWQiKSkKcmV0dXJuIFAuUEkoYSxiLGMsQy5WQywh
+MCl9aWYoZD09bnVsbClyZXR1cm4gbnVsbApzPW5ldyBQLlJuKCIiKQpyLmE9IiIKZC5LKDAsbmV3IFAu
+eTUobmV3IFAuTUUocixzKSkpCnI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwKdEc6
+ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIFAuUEkoYSxiLGMsQy5W
+QywhMCl9LApydjpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAsbyxuPWIrMgppZihuPj1hLmxlbmd0
+aClyZXR1cm4iJSIKcz1DLnhCLk8yKGEsYisxKQpyPUMueEIuTzIoYSxuKQpxPUgub28ocykKcD1ILm9v
+KHIpCmlmKHE8MHx8cDwwKXJldHVybiIlIgpvPXEqMTYrcAppZihvPDEyNyl7bj1DLmpuLndHKG8sNCkK
+aWYobj49OClyZXR1cm4gSC5PSChDLkYzLG4pCm49KEMuRjNbbl0mMTw8KG8mMTUpKSE9PTB9ZWxzZSBu
+PSExCmlmKG4pcmV0dXJuIEguTHcoYyYmNjU8PW8mJjkwPj1vPyhvfDMyKT4+PjA6bykKaWYocz49OTd8
+fHI+PTk3KXJldHVybiBDLnhCLk5qKGEsYixiKzMpLnRvVXBwZXJDYXNlKCkKcmV0dXJuIG51bGx9LAp6
+WDpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9IjAxMjM0NTY3ODlBQkNERUYiCmlmKGE8
+MTI4KXtzPW5ldyBVaW50OEFycmF5KDMpCnNbMF09MzcKc1sxXT1DLnhCLlcoayxhPj4+NCkKc1syXT1D
+LnhCLlcoayxhJjE1KX1lbHNle2lmKGE+MjA0NylpZihhPjY1NTM1KXtyPTI0MApxPTR9ZWxzZXtyPTIy
+NApxPTN9ZWxzZXtyPTE5MgpxPTJ9cD0zKnEKcz1uZXcgVWludDhBcnJheShwKQpmb3Iobz0wOy0tcSxx
+Pj0wO3I9MTI4KXtuPUMuam4uYmYoYSw2KnEpJjYzfHIKaWYobz49cClyZXR1cm4gSC5PSChzLG8pCnNb
+b109MzcKbT1vKzEKbD1DLnhCLlcoayxuPj4+NCkKaWYobT49cClyZXR1cm4gSC5PSChzLG0pCnNbbV09
+bApsPW8rMgptPUMueEIuVyhrLG4mMTUpCmlmKGw+PXApcmV0dXJuIEguT0gocyxsKQpzW2xdPW0Kbys9
+M319cmV0dXJuIFAuSE0ocywwLG51bGwpfSwKUEk6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcz1QLlVs
+KGEsYixjLGQsZSkKcmV0dXJuIHM9PW51bGw/Qy54Qi5OaihhLGIsYyk6c30sClVsOmZ1bmN0aW9uKGEs
+YixjLGQsZSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGo9bnVsbApmb3Iocz0hZSxyPWIscT1yLHA9ajty
+PGM7KXtvPUMueEIuTzIoYSxyKQppZihvPDEyNyl7bj1vPj4+NAppZihuPj04KXJldHVybiBILk9IKGQs
+bikKbj0oZFtuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEKaWYobikrK3IKZWxzZXtpZihvPT09Mzcp
+e209UC5ydihhLHIsITEpCmlmKG09PW51bGwpe3IrPTMKY29udGludWV9aWYoIiUiPT09bSl7bT0iJTI1
+IgpsPTF9ZWxzZSBsPTN9ZWxzZXtpZihzKWlmKG88PTkzKXtuPW8+Pj40CmlmKG4+PTgpcmV0dXJuIEgu
+T0goQy5hayxuKQpuPShDLmFrW25dJjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQplbHNlIG49ITEKaWYo
+bil7UC5SMyhhLHIsIkludmFsaWQgY2hhcmFjdGVyIikKSC5CaSh1LmcpCmw9agptPWx9ZWxzZXtpZigo
+byY2NDUxMik9PT01NTI5Nil7bj1yKzEKaWYobjxjKXtrPUMueEIuTzIoYSxuKQppZigoayY2NDUxMik9
+PT01NjMyMCl7bz0obyYxMDIzKTw8MTB8ayYxMDIzfDY1NTM2Cmw9Mn1lbHNlIGw9MX1lbHNlIGw9MX1l
+bHNlIGw9MQptPVAuelgobyl9fWlmKHA9PW51bGwpe3A9bmV3IFAuUm4oIiIpCm49cH1lbHNlIG49cApu
+LmErPUMueEIuTmooYSxxLHIpCm4uYSs9SC5FaihtKQppZih0eXBlb2YgbCE9PSJudW1iZXIiKXJldHVy
+biBILnBZKGwpCnIrPWwKcT1yfX1pZihwPT1udWxsKXJldHVybiBqCmlmKHE8YylwLmErPUMueEIuTmoo
+YSxxLGMpCnM9cC5hCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKeUI6ZnVuY3Rpb24oYSl7
+aWYoQy54Qi5uKGEsIi4iKSlyZXR1cm4hMApyZXR1cm4gQy54Qi5PWShhLCIvLiIpIT09LTF9LAp4ZTpm
+dW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbQppZighUC55QihhKSlyZXR1cm4gYQpzPUguVk0oW10s
+dC5zKQpmb3Iocj1hLnNwbGl0KCIvIikscT1yLmxlbmd0aCxwPSExLG89MDtvPHE7KytvKXtuPXJbb10K
+aWYoSi5STShuLCIuLiIpKXttPXMubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1tKXJldHVybiBILk9IKHMs
+LTEpCnMucG9wKCkKaWYocy5sZW5ndGg9PT0wKUMuTm0uaShzLCIiKX1wPSEwfWVsc2UgaWYoIi4iPT09
+bilwPSEwCmVsc2V7Qy5ObS5pKHMsbikKcD0hMX19aWYocClDLk5tLmkocywiIikKcmV0dXJuIEMuTm0u
+SChzLCIvIil9LAp3RjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbgppZighUC55QihhKSlyZXR1
+cm4hYj9QLkMxKGEpOmEKcz1ILlZNKFtdLHQucykKZm9yKHI9YS5zcGxpdCgiLyIpLHE9ci5sZW5ndGgs
+cD0hMSxvPTA7bzxxOysrbyl7bj1yW29dCmlmKCIuLiI9PT1uKWlmKHMubGVuZ3RoIT09MCYmQy5ObS5n
+cloocykhPT0iLi4iKXtpZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnA9ITB9
+ZWxzZXtDLk5tLmkocywiLi4iKQpwPSExfWVsc2UgaWYoIi4iPT09bilwPSEwCmVsc2V7Qy5ObS5pKHMs
+bikKcD0hMX19cj1zLmxlbmd0aAppZihyIT09MClpZihyPT09MSl7aWYoMD49cilyZXR1cm4gSC5PSChz
+LDApCnI9c1swXS5sZW5ndGg9PT0wfWVsc2Ugcj0hMQplbHNlIHI9ITAKaWYocilyZXR1cm4iLi8iCmlm
+KHB8fEMuTm0uZ3JaKHMpPT09Ii4uIilDLk5tLmkocywiIikKaWYoIWIpe2lmKDA+PXMubGVuZ3RoKXJl
+dHVybiBILk9IKHMsMCkKQy5ObS5ZKHMsMCxQLkMxKHNbMF0pKX1yZXR1cm4gQy5ObS5IKHMsIi8iKX0s
+CkMxOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPWEubGVuZ3RoCmlmKHA+PTImJlAuRXQoSi5ReihhLDAp
+KSlmb3Iocz0xO3M8cDsrK3Mpe3I9Qy54Qi5XKGEscykKaWYocj09PTU4KXJldHVybiBDLnhCLk5qKGEs
+MCxzKSsiJTNBIitDLnhCLkcoYSxzKzEpCmlmKHI8PTEyNyl7cT1yPj4+NAppZihxPj04KXJldHVybiBI
+Lk9IKEMubUsscSkKcT0oQy5tS1txXSYxPDwociYxNSkpPT09MH1lbHNlIHE9ITAKaWYocSlicmVha31y
+ZXR1cm4gYX0sCm1uOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPWEuZ0ZqKCksbz1wLmxlbmd0aAppZihv
+PjAmJkouSG0ocFswXSk9PT0yJiZKLmE2KHBbMF0sMSk9PT01OCl7aWYoMD49bylyZXR1cm4gSC5PSChw
+LDApClAucmcoSi5hNihwWzBdLDApLCExKQpQLkhOKHAsITEsMSkKcz0hMH1lbHNle1AuSE4ocCwhMSww
+KQpzPSExfXI9YS5ndFQoKSYmIXM/IlxcIjoiIgppZihhLmdjaigpKXtxPWEuZ0pmKGEpCmlmKHEubGVu
+Z3RoIT09MClyPXIrIlxcIitxKyJcXCJ9cj1QLnZnKHIscCwiXFwiKQpvPXMmJm89PT0xP3IrIlxcIjpy
+CnJldHVybiBvLmNoYXJDb2RlQXQoMCk9PTA/bzpvfSwKSWg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEK
+Zm9yKHM9MCxyPTA7cjwyOysrcil7cT1DLnhCLlcoYSxiK3IpCmlmKDQ4PD1xJiZxPD01NylzPXMqMTYr
+cS00OAplbHNle3F8PTMyCmlmKDk3PD1xJiZxPD0xMDIpcz1zKjE2K3EtODcKZWxzZSB0aHJvdyBILmIo
+UC54WSgiSW52YWxpZCBVUkwgZW5jb2RpbmciKSl9fXJldHVybiBzfSwKa3U6ZnVuY3Rpb24oYSxiLGMs
+ZCxlKXt2YXIgcyxyLHEscCxvPUouclkoYSksbj1iCndoaWxlKCEwKXtpZighKG48Yykpe3M9ITAKYnJl
+YWt9cj1vLlcoYSxuKQppZihyPD0xMjcpaWYociE9PTM3KXE9ZSYmcj09PTQzCmVsc2UgcT0hMAplbHNl
+IHE9ITAKaWYocSl7cz0hMQpicmVha30rK259aWYocyl7aWYoQy54TSE9PWQpcT0hMQplbHNlIHE9ITAK
+aWYocSlyZXR1cm4gby5OaihhLGIsYykKZWxzZSBwPW5ldyBILnFqKG8uTmooYSxiLGMpKX1lbHNle3A9
+SC5WTShbXSx0LmEpCmZvcihuPWI7bjxjOysrbil7cj1vLlcoYSxuKQppZihyPjEyNyl0aHJvdyBILmIo
+UC54WSgiSWxsZWdhbCBwZXJjZW50IGVuY29kaW5nIGluIFVSSSIpKQppZihyPT09Mzcpe2lmKG4rMz5h
+Lmxlbmd0aCl0aHJvdyBILmIoUC54WSgiVHJ1bmNhdGVkIFVSSSIpKQpDLk5tLmkocCxQLkloKGEsbisx
+KSkKbis9Mn1lbHNlIGlmKGUmJnI9PT00MylDLk5tLmkocCwzMikKZWxzZSBDLk5tLmkocCxyKX19dC5M
+LmEocCkKcmV0dXJuIEMub0UuV0oocCl9LApFdDpmdW5jdGlvbihhKXt2YXIgcz1hfDMyCnJldHVybiA5
+Nzw9cyYmczw9MTIyfSwKS0Q6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGwsaz0iSW52
+YWxpZCBNSU1FIHR5cGUiLGo9SC5WTShbYi0xXSx0LmEpCmZvcihzPWEubGVuZ3RoLHI9YixxPS0xLHA9
+bnVsbDtyPHM7KytyKXtwPUMueEIuVyhhLHIpCmlmKHA9PT00NHx8cD09PTU5KWJyZWFrCmlmKHA9PT00
+Nyl7aWYocTwwKXtxPXIKY29udGludWV9dGhyb3cgSC5iKFAucnIoayxhLHIpKX19aWYocTwwJiZyPmIp
+dGhyb3cgSC5iKFAucnIoayxhLHIpKQpmb3IoO3AhPT00NDspe0MuTm0uaShqLHIpOysrcgpmb3Iobz0t
+MTtyPHM7KytyKXtwPUMueEIuVyhhLHIpCmlmKHA9PT02MSl7aWYobzwwKW89cn1lbHNlIGlmKHA9PT01
+OXx8cD09PTQ0KWJyZWFrfWlmKG8+PTApQy5ObS5pKGosbykKZWxzZXtuPUMuTm0uZ3JaKGopCmlmKHAh
+PT00NHx8ciE9PW4rN3x8IUMueEIuUWkoYSwiYmFzZTY0IixuKzEpKXRocm93IEguYihQLnJyKCJFeHBl
+Y3RpbmcgJz0nIixhLHIpKQpicmVha319Qy5ObS5pKGoscikKbT1yKzEKaWYoKGoubGVuZ3RoJjEpPT09
+MSlhPUMuaDkueXIoYSxtLHMpCmVsc2V7bD1QLlVsKGEsbSxzLEMuVkMsITApCmlmKGwhPW51bGwpYT1D
+LnhCLmk3KGEsbSxzLGwpfXJldHVybiBuZXcgUC5QRShhLGosYyl9LApLTjpmdW5jdGlvbigpe3ZhciBz
+PSIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2
+d3h5ei0uX34hJCYnKCkqKyw7PSIscj0iLiIscT0iOiIscD0iLyIsbz0iPyIsbj0iIyIsbT10LmdjLGw9
+UC5kSCgyMixuZXcgUC5xMygpLG0pLGs9bmV3IFAueUkobCksaj1uZXcgUC5jNigpLGk9bmV3IFAucWQo
+KSxoPW0uYShrLiQyKDAsMjI1KSkKai4kMyhoLHMsMSkKai4kMyhoLHIsMTQpCmouJDMoaCxxLDM0KQpq
+LiQzKGgscCwzKQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKaD1tLmEoay4kMigxNCwyMjUpKQpq
+LiQzKGgscywxKQpqLiQzKGgsciwxNSkKai4kMyhoLHEsMzQpCmouJDMoaCxwLDIzNCkKai4kMyhoLG8s
+MTcyKQpqLiQzKGgsbiwyMDUpCmg9bS5hKGsuJDIoMTUsMjI1KSkKai4kMyhoLHMsMSkKai4kMyhoLCIl
+IiwyMjUpCmouJDMoaCxxLDM0KQpqLiQzKGgscCw5KQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkK
+aD1tLmEoay4kMigxLDIyNSkpCmouJDMoaCxzLDEpCmouJDMoaCxxLDM0KQpqLiQzKGgscCwxMCkKai4k
+MyhoLG8sMTcyKQpqLiQzKGgsbiwyMDUpCmg9bS5hKGsuJDIoMiwyMzUpKQpqLiQzKGgscywxMzkpCmou
+JDMoaCxwLDEzMSkKai4kMyhoLHIsMTQ2KQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKaD1tLmEo
+ay4kMigzLDIzNSkpCmouJDMoaCxzLDExKQpqLiQzKGgscCw2OCkKai4kMyhoLHIsMTgpCmouJDMoaCxv
+LDE3MikKai4kMyhoLG4sMjA1KQpoPW0uYShrLiQyKDQsMjI5KSkKai4kMyhoLHMsNSkKaS4kMyhoLCJB
+WiIsMjI5KQpqLiQzKGgscSwxMDIpCmouJDMoaCwiQCIsNjgpCmouJDMoaCwiWyIsMjMyKQpqLiQzKGgs
+cCwxMzgpCmouJDMoaCxvLDE3MikKai4kMyhoLG4sMjA1KQpoPW0uYShrLiQyKDUsMjI5KSkKai4kMyho
+LHMsNSkKaS4kMyhoLCJBWiIsMjI5KQpqLiQzKGgscSwxMDIpCmouJDMoaCwiQCIsNjgpCmouJDMoaCxw
+LDEzOCkKai4kMyhoLG8sMTcyKQpqLiQzKGgsbiwyMDUpCmg9bS5hKGsuJDIoNiwyMzEpKQppLiQzKGgs
+IjE5Iiw3KQpqLiQzKGgsIkAiLDY4KQpqLiQzKGgscCwxMzgpCmouJDMoaCxvLDE3MikKai4kMyhoLG4s
+MjA1KQpoPW0uYShrLiQyKDcsMjMxKSkKaS4kMyhoLCIwOSIsNykKai4kMyhoLCJAIiw2OCkKai4kMyho
+LHAsMTM4KQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKai4kMyhtLmEoay4kMig4LDgpKSwiXSIs
+NSkKaD1tLmEoay4kMig5LDIzNSkpCmouJDMoaCxzLDExKQpqLiQzKGgsciwxNikKai4kMyhoLHAsMjM0
+KQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKaD1tLmEoay4kMigxNiwyMzUpKQpqLiQzKGgscywx
+MSkKai4kMyhoLHIsMTcpCmouJDMoaCxwLDIzNCkKai4kMyhoLG8sMTcyKQpqLiQzKGgsbiwyMDUpCmg9
+bS5hKGsuJDIoMTcsMjM1KSkKai4kMyhoLHMsMTEpCmouJDMoaCxwLDkpCmouJDMoaCxvLDE3MikKai4k
+MyhoLG4sMjA1KQpoPW0uYShrLiQyKDEwLDIzNSkpCmouJDMoaCxzLDExKQpqLiQzKGgsciwxOCkKai4k
+MyhoLHAsMjM0KQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKaD1tLmEoay4kMigxOCwyMzUpKQpq
+LiQzKGgscywxMSkKai4kMyhoLHIsMTkpCmouJDMoaCxwLDIzNCkKai4kMyhoLG8sMTcyKQpqLiQzKGgs
+biwyMDUpCmg9bS5hKGsuJDIoMTksMjM1KSkKai4kMyhoLHMsMTEpCmouJDMoaCxwLDIzNCkKai4kMyho
+LG8sMTcyKQpqLiQzKGgsbiwyMDUpCmg9bS5hKGsuJDIoMTEsMjM1KSkKai4kMyhoLHMsMTEpCmouJDMo
+aCxwLDEwKQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKaD1tLmEoay4kMigxMiwyMzYpKQpqLiQz
+KGgscywxMikKai4kMyhoLG8sMTIpCmouJDMoaCxuLDIwNSkKaD1tLmEoay4kMigxMywyMzcpKQpqLiQz
+KGgscywxMykKai4kMyhoLG8sMTMpCmkuJDMobS5hKGsuJDIoMjAsMjQ1KSksImF6IiwyMSkKaz1tLmEo
+ay4kMigyMSwyNDUpKQppLiQzKGssImF6IiwyMSkKaS4kMyhrLCIwOSIsMjEpCmouJDMoaywiKy0uIiwy
+MSkKcmV0dXJuIGx9LApVQjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG8sbj0kLnZaKCkK
+Zm9yKHM9Si5yWShhKSxyPWI7cjxjOysrcil7bi5sZW5ndGgKaWYoZDwwfHxkPj0yMilyZXR1cm4gSC5P
+SChuLGQpCnE9bltkXQpwPXMuVyhhLHIpXjk2Cm89cVtwPjk1PzMxOnBdCmQ9byYzMQpDLk5tLlkoZSxv
+Pj4+NSxyKX1yZXR1cm4gZH0sCldGOmZ1bmN0aW9uIFdGKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApp
+UDpmdW5jdGlvbiBpUChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKWFM6ZnVuY3Rpb24gWFMoKXt9LApD
+NjpmdW5jdGlvbiBDNihhKXt0aGlzLmE9YX0sCkV6OmZ1bmN0aW9uIEV6KCl7fSwKRjpmdW5jdGlvbiBG
+KCl7fSwKdTpmdW5jdGlvbiB1KGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5k
+PWR9LApiSjpmdW5jdGlvbiBiSihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmU9YQpfLmY9YgpfLmE9
+YwpfLmI9ZApfLmM9ZQpfLmQ9Zn0sCmVZOmZ1bmN0aW9uIGVZKGEsYixjLGQsZSl7dmFyIF89dGhpcwpf
+LmY9YQpfLmE9YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCm1wOmZ1bmN0aW9uIG1wKGEsYixjLGQpe3ZhciBf
+PXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LAp1YjpmdW5jdGlvbiB1YihhKXt0aGlzLmE9YX0s
+CmRzOmZ1bmN0aW9uIGRzKGEpe3RoaXMuYT1hfSwKbGo6ZnVuY3Rpb24gbGooYSl7dGhpcy5hPWF9LApV
+VjpmdW5jdGlvbiBVVihhKXt0aGlzLmE9YX0sCms1OmZ1bmN0aW9uIGs1KCl7fSwKS1k6ZnVuY3Rpb24g
+S1koKXt9LApwOmZ1bmN0aW9uIHAoYSl7dGhpcy5hPWF9LApDRDpmdW5jdGlvbiBDRChhKXt0aGlzLmE9
+YX0sCmFFOmZ1bmN0aW9uIGFFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCmNYOmZ1
+bmN0aW9uIGNYKCl7fSwKQW46ZnVuY3Rpb24gQW4oKXt9LApOMzpmdW5jdGlvbiBOMyhhLGIsYyl7dGhp
+cy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30sCmM4OmZ1bmN0aW9uIGM4KCl7fSwKTWg6ZnVuY3Rpb24g
+TWgoKXt9LApaZDpmdW5jdGlvbiBaZCgpe30sClJuOmZ1bmN0aW9uIFJuKGEpe3RoaXMuYT1hfSwKbjE6
+ZnVuY3Rpb24gbjEoYSl7dGhpcy5hPWF9LApjUzpmdW5jdGlvbiBjUyhhKXt0aGlzLmE9YX0sClZDOmZ1
+bmN0aW9uIFZDKGEpe3RoaXMuYT1hfSwKSlQ6ZnVuY3Rpb24gSlQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9
+Yn0sCkRuOmZ1bmN0aW9uIERuKGEsYixjLGQsZSxmLGcpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5j
+PWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy54PW51bGwKXy55PSExCl8uej1udWxsCl8uUT0hMQpf
+LmNoPW51bGwKXy5jeD0hMQpfLmN5PW51bGwKXy5kYj0hMX0sClJaOmZ1bmN0aW9uIFJaKCl7fSwKTUU6
+ZnVuY3Rpb24gTUUoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnk1OmZ1bmN0aW9uIHk1KGEpe3RoaXMu
+YT1hfSwKUEU6ZnVuY3Rpb24gUEUoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKcTM6
+ZnVuY3Rpb24gcTMoKXt9LAp5STpmdW5jdGlvbiB5SShhKXt0aGlzLmE9YX0sCmM2OmZ1bmN0aW9uIGM2
+KCl7fSwKcWQ6ZnVuY3Rpb24gcWQoKXt9LApVZjpmdW5jdGlvbiBVZihhLGIsYyxkLGUsZixnLGgpe3Zh
+ciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy54PWgKXy55
+PW51bGx9LApxZTpmdW5jdGlvbiBxZShhLGIsYyxkLGUsZixnKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1i
+Cl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mCl8ucj1nCl8ueD1udWxsCl8ueT0hMQpfLno9bnVsbApfLlE9
+ITEKXy5jaD1udWxsCl8uY3g9ITEKXy5jeT1udWxsCl8uZGI9ITF9LAppSjpmdW5jdGlvbiBpSigpe30s
+CmpnOmZ1bmN0aW9uIGpnKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApUYTpmdW5jdGlvbiBUYShhLGIp
+e3RoaXMuYT1hCnRoaXMuYj1ifSwKQmY6ZnVuY3Rpb24gQmYoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
+CkFzOmZ1bmN0aW9uIEFzKCl7fSwKR0U6ZnVuY3Rpb24gR0UoYSl7dGhpcy5hPWF9LApONzpmdW5jdGlv
+biBONyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKdVE6ZnVuY3Rpb24gdVEoKXt9LApoRjpmdW5jdGlv
+biBoRigpe30sClI0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscQpILnk4KGIpCnQuai5hKGQpCmlm
+KEgub1QoYikpe3M9W2NdCkMuTm0uRlYocyxkKQpkPXN9cj10LnoKcT1QLkNIKEouTTEoZCxQLncwKCks
+ciksITAscikKdC5ZLmEoYSkKcmV0dXJuIFAud1koSC5FayhhLHEsbnVsbCkpfSwKRG06ZnVuY3Rpb24o
+YSxiLGMpe3ZhciBzCnRyeXtpZihPYmplY3QuaXNFeHRlbnNpYmxlKGEpJiYhT2JqZWN0LnByb3RvdHlw
+ZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVl
+OmN9KQpyZXR1cm4hMH19Y2F0Y2gocyl7SC5SdShzKX1yZXR1cm4hMX0sCk9tOmZ1bmN0aW9uKGEsYil7
+aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpcmV0dXJuIGFbYl0KcmV0
+dXJuIG51bGx9LAp3WTpmdW5jdGlvbihhKXtpZihhPT1udWxsfHx0eXBlb2YgYT09InN0cmluZyJ8fHR5
+cGVvZiBhPT0ibnVtYmVyInx8SC5sKGEpKXJldHVybiBhCmlmKGEgaW5zdGFuY2VvZiBQLkU0KXJldHVy
+biBhLmEKaWYoSC5SOShhKSlyZXR1cm4gYQppZih0LmFrLmIoYSkpcmV0dXJuIGEKaWYoYSBpbnN0YW5j
+ZW9mIFAuaVApcmV0dXJuIEgubzIoYSkKaWYodC5ZLmIoYSkpcmV0dXJuIFAuaEUoYSwiJGRhcnRfanNG
+dW5jdGlvbiIsbmV3IFAuUEMoKSkKcmV0dXJuIFAuaEUoYSwiXyRkYXJ0X2pzT2JqZWN0IixuZXcgUC5t
+dCgkLmtJKCkpKX0sCmhFOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1QLk9tKGEsYikKaWYocz09bnVsbCl7
+cz1jLiQxKGEpClAuRG0oYSxiLHMpfXJldHVybiBzfSwKZFU6ZnVuY3Rpb24oYSl7dmFyIHMscgppZihh
+PT1udWxsfHx0eXBlb2YgYT09InN0cmluZyJ8fHR5cGVvZiBhPT0ibnVtYmVyInx8dHlwZW9mIGE9PSJi
+b29sZWFuIilyZXR1cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBPYmplY3QmJkguUjkoYSkpcmV0dXJu
+IGEKZWxzZSBpZihhIGluc3RhbmNlb2YgT2JqZWN0JiZ0LmFrLmIoYSkpcmV0dXJuIGEKZWxzZSBpZihh
+IGluc3RhbmNlb2YgRGF0ZSl7cz1ILnVQKGEuZ2V0VGltZSgpKQppZihNYXRoLmFicyhzKTw9ODY0ZTEz
+KXI9ITEKZWxzZSByPSEwCmlmKHIpSC52KFAueFkoIkRhdGVUaW1lIGlzIG91dHNpZGUgdmFsaWQgcmFu
+Z2U6ICIrcykpClAuVUkoITEsImlzVXRjIix0LnkpCnJldHVybiBuZXcgUC5pUChzLCExKX1lbHNlIGlm
+KGEuY29uc3RydWN0b3I9PT0kLmtJKCkpcmV0dXJuIGEubwplbHNlIHJldHVybiBQLk5EKGEpfSwKTkQ6
+ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIFAuaVEoYSwkLncoKSxuZXcg
+UC5OeigpKQppZihhIGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAuUVMo
+KSkKcmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAubnAoKSl9LAppUTpmdW5jdGlvbihhLGIsYyl7dmFy
+IHM9UC5PbShhLGIpCmlmKHM9PW51bGx8fCEoYSBpbnN0YW5jZW9mIE9iamVjdCkpe3M9Yy4kMShhKQpQ
+LkRtKGEsYixzKX1yZXR1cm4gc30sClBDOmZ1bmN0aW9uIFBDKCl7fSwKbXQ6ZnVuY3Rpb24gbXQoYSl7
+dGhpcy5hPWF9LApOejpmdW5jdGlvbiBOeigpe30sClFTOmZ1bmN0aW9uIFFTKCl7fSwKbnA6ZnVuY3Rp
+b24gbnAoKXt9LApFNDpmdW5jdGlvbiBFNChhKXt0aGlzLmE9YX0sCnI3OmZ1bmN0aW9uIHI3KGEpe3Ro
+aXMuYT1hfSwKVHo6ZnVuY3Rpb24gVHooYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKY286ZnVuY3Rp
+b24gY28oKXt9LApuZDpmdW5jdGlvbiBuZCgpe30sCktlOmZ1bmN0aW9uIEtlKGEpe3RoaXMuYT1hfSwK
+aGk6ZnVuY3Rpb24gaGkoKXt9fSxXPXsKeDM6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93fSwKWnI6ZnVu
+Y3Rpb24oKXtyZXR1cm4gZG9jdW1lbnR9LApKNjpmdW5jdGlvbihhKXt2YXIgcz1kb2N1bWVudC5jcmVh
+dGVFbGVtZW50KCJhIikKaWYoYSE9bnVsbClDLnhuLnNMVShzLGEpCnJldHVybiBzfSwKVTk6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciBzLHI9ZG9jdW1lbnQuYm9keQpyLnRvU3RyaW5nCnM9Qy5SWS5yNihyLGEsYixj
+KQpzLnRvU3RyaW5nCnI9dC5hYwpyPW5ldyBILlU1KG5ldyBXLmU3KHMpLHIuQygiYTIobEQuRSkiKS5h
+KG5ldyBXLkN2KCkpLHIuQygiVTU8bEQuRT4iKSkKcmV0dXJuIHQuaC5hKHIuZ3I4KHIpKX0sCnJTOmZ1
+bmN0aW9uKGEpe3ZhciBzLHIscT0iZWxlbWVudCB0YWcgdW5hdmFpbGFibGUiCnRyeXtzPUouWUUoYSkK
+aWYodHlwZW9mIHMuZ25zKGEpPT0ic3RyaW5nIilxPXMuZ25zKGEpfWNhdGNoKHIpe0guUnUocil9cmV0
+dXJuIHF9LApDMDpmdW5jdGlvbihhLGIpe2E9YStiJjUzNjg3MDkxMQphPWErKChhJjUyNDI4Nyk8PDEw
+KSY1MzY4NzA5MTEKcmV0dXJuIGFeYT4+PjZ9LApyRTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcz1XLkMw
+KFcuQzAoVy5DMChXLkMwKDAsYSksYiksYyksZCkscj1zKygocyY2NzEwODg2Myk8PDMpJjUzNjg3MDkx
+MQpyXj1yPj4+MTEKcmV0dXJuIHIrKChyJjE2MzgzKTw8MTUpJjUzNjg3MDkxMX0sClROOmZ1bmN0aW9u
+KGEsYil7dmFyIHMscixxPWEuY2xhc3NMaXN0CmZvcihzPWIubGVuZ3RoLHI9MDtyPGIubGVuZ3RoO2Iu
+bGVuZ3RoPT09c3x8KDAsSC5saykoYiksKytyKXEuYWRkKGJbcl0pfSwKSkU6ZnVuY3Rpb24oYSxiLGMs
+ZCxlKXt2YXIgcz1XLmFGKG5ldyBXLnZOKGMpLHQuQikKaWYocyE9bnVsbCYmITApSi5kWihhLGIscywh
+MSkKcmV0dXJuIG5ldyBXLnhDKGEsYixzLCExLGUuQygieEM8MD4iKSl9LApUdzpmdW5jdGlvbihhKXt2
+YXIgcz1XLko2KG51bGwpLHI9d2luZG93LmxvY2F0aW9uCnM9bmV3IFcuSlEobmV3IFcubWsocyxyKSkK
+cy5DWShhKQpyZXR1cm4gc30sCnFEOmZ1bmN0aW9uKGEsYixjLGQpe3QuaC5hKGEpCkguaChiKQpILmgo
+YykKdC5jci5hKGQpCnJldHVybiEwfSwKUVc6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxCnQuaC5h
+KGEpCkguaChiKQpILmgoYykKcz10LmNyLmEoZCkuYQpyPXMuYQpDLnhuLnNMVShyLGMpCnE9ci5ob3N0
+bmFtZQpzPXMuYgppZighKHE9PXMuaG9zdG5hbWUmJnIucG9ydD09cy5wb3J0JiZyLnByb3RvY29sPT1z
+LnByb3RvY29sKSlpZihxPT09IiIpaWYoci5wb3J0PT09IiIpe3M9ci5wcm90b2NvbApzPXM9PT0iOiJ8
+fHM9PT0iIn1lbHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ugcz0hMApyZXR1cm4gc30sCkJsOmZ1bmN0aW9u
+KCl7dmFyIHM9dC5OLHI9UC50TShDLlF4LHMpLHE9dC5kMC5hKG5ldyBXLklBKCkpLHA9SC5WTShbIlRF
+TVBMQVRFIl0sdC5zKQpzPW5ldyBXLmN0KHIsUC5McyhzKSxQLkxzKHMpLFAuTHMocyksbnVsbCkKcy5D
+WShudWxsLG5ldyBILmxKKEMuUXgscSx0LmZqKSxwLG51bGwpCnJldHVybiBzfSwKcWM6ZnVuY3Rpb24o
+YSl7dmFyIHMKaWYoYT09bnVsbClyZXR1cm4gbnVsbAppZigicG9zdE1lc3NhZ2UiIGluIGEpe3M9Vy5Q
+MShhKQppZih0LmFTLmIocykpcmV0dXJuIHMKcmV0dXJuIG51bGx9ZWxzZSByZXR1cm4gdC5jaC5hKGEp
+fSwKUDE6ZnVuY3Rpb24oYSl7aWYoYT09PXdpbmRvdylyZXR1cm4gdC5jaS5hKGEpCmVsc2UgcmV0dXJu
+IG5ldyBXLmRXKCl9LAphRjpmdW5jdGlvbihhLGIpe3ZhciBzPSQuWDMKaWYocz09PUMuTlUpcmV0dXJu
+IGEKcmV0dXJuIHMuUHkoYSxiKX0sCnFFOmZ1bmN0aW9uIHFFKCl7fSwKR2g6ZnVuY3Rpb24gR2goKXt9
+LApmWTpmdW5jdGlvbiBmWSgpe30sCm5COmZ1bmN0aW9uIG5CKCl7fSwKQXo6ZnVuY3Rpb24gQXooKXt9
+LApRUDpmdW5jdGlvbiBRUCgpe30sCm54OmZ1bmN0aW9uIG54KCl7fSwKb0o6ZnVuY3Rpb24gb0ooKXt9
+LAppZDpmdW5jdGlvbiBpZCgpe30sClFGOmZ1bmN0aW9uIFFGKCl7fSwKTmg6ZnVuY3Rpb24gTmgoKXt9
+LAphZTpmdW5jdGlvbiBhZSgpe30sCklCOmZ1bmN0aW9uIElCKCl7fSwKbjc6ZnVuY3Rpb24gbjcoKXt9
+LAp3ejpmdW5jdGlvbiB3eihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApjdjpmdW5jdGlvbiBjdigp
+e30sCkN2OmZ1bmN0aW9uIEN2KCl7fSwKZWE6ZnVuY3Rpb24gZWEoKXt9LApEMDpmdW5jdGlvbiBEMCgp
+e30sCmhIOmZ1bmN0aW9uIGhIKCl7fSwKaDQ6ZnVuY3Rpb24gaDQoKXt9LApicjpmdW5jdGlvbiBicigp
+e30sClZiOmZ1bmN0aW9uIFZiKCl7fSwKZko6ZnVuY3Rpb24gZkooKXt9LAp3YTpmdW5jdGlvbiB3YSgp
+e30sClNnOmZ1bmN0aW9uIFNnKCl7fSwKdTg6ZnVuY3Rpb24gdTgoKXt9LApBajpmdW5jdGlvbiBBaigp
+e30sCmU3OmZ1bmN0aW9uIGU3KGEpe3RoaXMuYT1hfSwKdUg6ZnVuY3Rpb24gdUgoKXt9LApCSDpmdW5j
+dGlvbiBCSCgpe30sClNOOmZ1bmN0aW9uIFNOKCl7fSwKZXc6ZnVuY3Rpb24gZXcoKXt9LApscDpmdW5j
+dGlvbiBscCgpe30sClRiOmZ1bmN0aW9uIFRiKCl7fSwKSXY6ZnVuY3Rpb24gSXYoKXt9LApXUDpmdW5j
+dGlvbiBXUCgpe30sCnlZOmZ1bmN0aW9uIHlZKCl7fSwKdzY6ZnVuY3Rpb24gdzYoKXt9LApLNTpmdW5j
+dGlvbiBLNSgpe30sCkNtOmZ1bmN0aW9uIENtKCl7fSwKQ1E6ZnVuY3Rpb24gQ1EoKXt9LAp3NDpmdW5j
+dGlvbiB3NCgpe30sCnJoOmZ1bmN0aW9uIHJoKCl7fSwKY2Y6ZnVuY3Rpb24gY2YoKXt9LAppNzpmdW5j
+dGlvbiBpNyhhKXt0aGlzLmE9YX0sClN5OmZ1bmN0aW9uIFN5KGEpe3RoaXMuYT1hfSwKS1M6ZnVuY3Rp
+b24gS1MoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkEzOmZ1bmN0aW9uIEEzKGEsYil7dGhpcy5hPWEK
+dGhpcy5iPWJ9LApJNDpmdW5jdGlvbiBJNChhKXt0aGlzLmE9YX0sCkZrOmZ1bmN0aW9uIEZrKGEsYil7
+dGhpcy5hPWEKdGhpcy4kdGk9Yn0sClJPOmZ1bmN0aW9uIFJPKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5h
+PWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sCmV1OmZ1bmN0aW9uIGV1KGEsYixjLGQpe3ZhciBfPXRoaXMK
+Xy5hPWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sCnhDOmZ1bmN0aW9uIHhDKGEsYixjLGQsZSl7dmFyIF89
+dGhpcwpfLmI9YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwKdk46ZnVuY3Rpb24gdk4oYSl7dGhp
+cy5hPWF9LApKUTpmdW5jdGlvbiBKUShhKXt0aGlzLmE9YX0sCkdtOmZ1bmN0aW9uIEdtKCl7fSwKdkQ6
+ZnVuY3Rpb24gdkQoYSl7dGhpcy5hPWF9LApVdjpmdW5jdGlvbiBVdihhKXt0aGlzLmE9YX0sCkVnOmZ1
+bmN0aW9uIEVnKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCm02OmZ1bmN0aW9uIG02
+KCl7fSwKRW86ZnVuY3Rpb24gRW8oKXt9LApXazpmdW5jdGlvbiBXaygpe30sCmN0OmZ1bmN0aW9uIGN0
+KGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmU9YQpfLmE9YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCklBOmZ1
+bmN0aW9uIElBKCl7fSwKT3c6ZnVuY3Rpb24gT3coKXt9LApXOTpmdW5jdGlvbiBXOShhLGIsYyl7dmFy
+IF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9LTEKXy5kPW51bGwKXy4kdGk9Y30sCmRXOmZ1bmN0aW9uIGRX
+KCl7fSwKbWs6ZnVuY3Rpb24gbWsoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCktvOmZ1bmN0aW9uIEtv
+KGEpe3RoaXMuYT1hCnRoaXMuYj0hMX0sCmZtOmZ1bmN0aW9uIGZtKGEpe3RoaXMuYT1hfSwKTGU6ZnVu
+Y3Rpb24gTGUoKXt9LApLNzpmdW5jdGlvbiBLNygpe30sCnJCOmZ1bmN0aW9uIHJCKCl7fSwKWFc6ZnVu
+Y3Rpb24gWFcoKXt9LApvYTpmdW5jdGlvbiBvYSgpe319LE09ewpPWDpmdW5jdGlvbihhKXtzd2l0Y2go
+YSl7Y2FzZSBDLkFkOnJldHVybiJBZGQgLyo/Ki8gaGludCIKY2FzZSBDLm5lOnJldHVybiJBZGQgLyoh
+Ki8gaGludCIKY2FzZSBDLndWOnJldHVybiJSZW1vdmUgLyo/Ki8gaGludCIKY2FzZSBDLmZSOnJldHVy
+biJSZW1vdmUgLyohKi8gaGludCIKY2FzZSBDLm15OnJldHVybiJDaGFuZ2UgdG8gLyo/Ki8gaGludCIK
+Y2FzZSBDLnJ4OnJldHVybiJDaGFuZ2UgdG8gLyohKi8gaGludCJ9cmV0dXJuIG51bGx9LApINzpmdW5j
+dGlvbiBINyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKWUY6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEs
+cCxvLG4sbSxsCmZvcihzPWIubGVuZ3RoLHI9MTtyPHM7KytyKXtpZihiW3JdPT1udWxsfHxiW3ItMV0h
+PW51bGwpY29udGludWUKZm9yKDtzPj0xO3M9cSl7cT1zLTEKaWYoYltxXSE9bnVsbClicmVha31wPW5l
+dyBQLlJuKCIiKQpvPWErIigiCnAuYT1vCm49SC50NihiKQptPW4uQygibkg8MT4iKQpsPW5ldyBILm5I
+KGIsMCxzLG0pCmwuSGQoYiwwLHMsbi5jKQptPW8rbmV3IEgubEoobCxtLkMoInFVKGFMLkUpIikuYShu
+ZXcgTS5ObygpKSxtLkMoImxKPGFMLkUscVU+IikpLkgoMCwiLCAiKQpwLmE9bQpwLmE9bSsoIik6IHBh
+cnQgIisoci0xKSsiIHdhcyBudWxsLCBidXQgcGFydCAiK3IrIiB3YXMgbm90LiIpCnRocm93IEguYihQ
+LnhZKHAudygwKSkpfX0sCmxJOmZ1bmN0aW9uIGxJKGEpe3RoaXMuYT1hfSwKcTc6ZnVuY3Rpb24gcTco
+KXt9LApObzpmdW5jdGlvbiBObygpe319LFU9ewpuejpmdW5jdGlvbihhKXt2YXIgcz1ILnVQKGEucSgw
+LCJub2RlSWQiKSkKcmV0dXJuIG5ldyBVLkxMKEMuTm0uSHQoQy5yayxuZXcgVS5NRChhKSkscyl9LApM
+TDpmdW5jdGlvbiBMTChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKTUQ6ZnVuY3Rpb24gTUQoYSl7dGhp
+cy5hPWF9LApqZjpmdW5jdGlvbihhKXt2YXIgcyxyLHEscAppZihhPT1udWxsKXM9bnVsbAplbHNle3M9
+SC5WTShbXSx0LmQ3KQpmb3Iocj1KLklUKHQuVS5hKGEpKTtyLkYoKTspe3E9ci5nbCgpCnA9Si5VNihx
+KQpDLk5tLmkocyxuZXcgVS5TZShILmgocC5xKHEsImRlc2NyaXB0aW9uIikpLEguaChwLnEocSwiaHJl
+ZiIpKSkpfX1yZXR1cm4gc30sCk5kOmZ1bmN0aW9uKGEpe3ZhciBzLHIKaWYoYT09bnVsbClzPW51bGwK
+ZWxzZXtzPUguVk0oW10sdC5hQSkKZm9yKHI9Si5JVCh0LlUuYShhKSk7ci5GKCk7KUMuTm0uaShzLFUu
+TmYoci5nbCgpKSl9cmV0dXJuIHN9LApOZjpmdW5jdGlvbihhKXt2YXIgcz1KLlU2KGEpLHI9SC5oKHMu
+cShhLCJkZXNjcmlwdGlvbiIpKSxxPUguVk0oW10sdC5hSikKZm9yKHM9Si5JVCh0LlUuYShzLnEoYSwi
+ZW50cmllcyIpKSk7cy5GKCk7KUMuTm0uaShxLFUuUmoocy5nbCgpKSkKcmV0dXJuIG5ldyBVLnlEKHIs
+cSl9LApSajpmdW5jdGlvbihhKXt2YXIgcyxyPUouVTYoYSkscT1ILmgoci5xKGEsImRlc2NyaXB0aW9u
+IikpLHA9SC5oKHIucShhLCJmdW5jdGlvbiIpKSxvPXIucShhLCJsaW5rIikKaWYobz09bnVsbClvPW51
+bGwKZWxzZXtzPUouVTYobykKbz1uZXcgVS5NbChILmgocy5xKG8sImhyZWYiKSksSC51UChzLnEobywi
+bGluZSIpKSxILmgocy5xKG8sInBhdGgiKSkpfXI9dC5mSy5hKHIucShhLCJoaW50QWN0aW9ucyIpKQpy
+PXI9PW51bGw/bnVsbDpKLk0xKHIsbmV3IFUuYU4oKSx0LmFYKQpyPXI9PW51bGw/bnVsbDpyLmJyKDAp
+CnJldHVybiBuZXcgVS53YihxLHAsbyxyPT1udWxsP0MuZG46cil9LApkMjpmdW5jdGlvbiBkMihhLGIs
+YyxkLGUsZil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9Zn0sClNl
+OmZ1bmN0aW9uIFNlKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNbDpmdW5jdGlvbiBNbChhLGIsYyl7
+dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAp5RDpmdW5jdGlvbiB5RChhLGIpe3RoaXMuYT1hCnRo
+aXMuYj1ifSwKd2I6ZnVuY3Rpb24gd2IoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9
+YwpfLmQ9ZH0sCmFOOmZ1bmN0aW9uIGFOKCl7fSwKYjA6ZnVuY3Rpb24gYjAoKXt9fSxCPXsKd1I6ZnVu
+Y3Rpb24oKXtyZXR1cm4gbmV3IEIucXAoIiIsIiIsIiIsQy5EeCl9LApZZjpmdW5jdGlvbihhKXt2YXIg
+cyxyLHEscCxvLG4sbSxsLGs9SC5oKGEucSgwLCJyZWdpb25zIikpLGo9SC5oKGEucSgwLCJuYXZpZ2F0
+aW9uQ29udGVudCIpKSxpPUguaChhLnEoMCwic291cmNlQ29kZSIpKSxoPVAuRmwodC5YLHQuZF8pCmZv
+cihzPXQudC5hKGEucSgwLCJlZGl0cyIpKSxzPXMuZ1B1KHMpLHM9cy5nbShzKSxyPXQuVSxxPXQuaDQ7
+cy5GKCk7KXtwPXMuZ2woKQpvPXAuYQpuPUguVk0oW10scSkKZm9yKHA9Si5JVChyLmEocC5iKSk7cC5G
+KCk7KXttPXAuZ2woKQpsPUouVTYobSkKQy5ObS5pKG4sbmV3IEIuajgoSC51UChsLnEobSwibGluZSIp
+KSxILmgobC5xKG0sImV4cGxhbmF0aW9uIikpLEgudVAobC5xKG0sIm9mZnNldCIpKSkpfWguWSgwLG8s
+bil9cmV0dXJuIG5ldyBCLnFwKGssaixpLGgpfSwKajg6ZnVuY3Rpb24gajgoYSxiLGMpe3RoaXMuYT1h
+CnRoaXMuYj1iCnRoaXMuYz1jfSwKcXA6ZnVuY3Rpb24gcXAoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9
+YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCmZ2OmZ1bmN0aW9uIGZ2KCl7fSwKT1M6ZnVuY3Rpb24oYSl7dmFy
+IHMKaWYoIShhPj02NSYmYTw9OTApKXM9YT49OTcmJmE8PTEyMgplbHNlIHM9ITAKcmV0dXJuIHN9LApZ
+dTpmdW5jdGlvbihhLGIpe3ZhciBzPWEubGVuZ3RoLHI9YisyCmlmKHM8cilyZXR1cm4hMQppZighQi5P
+UyhDLnhCLk8yKGEsYikpKXJldHVybiExCmlmKEMueEIuTzIoYSxiKzEpIT09NTgpcmV0dXJuITEKaWYo
+cz09PXIpcmV0dXJuITAKcmV0dXJuIEMueEIuTzIoYSxyKT09PTQ3fX0sVD17bVE6ZnVuY3Rpb24gbVEo
+KXt9fSxMPXsKSXE6ZnVuY3Rpb24oKXtDLkJaLkIoZG9jdW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQiLG5l
+dyBMLmUoKSkKQy5vbC5CKHdpbmRvdywicG9wc3RhdGUiLG5ldyBMLkwoKSl9LAprejpmdW5jdGlvbihh
+KXt2YXIgcyxyPXQuZy5hKGEucGFyZW50Tm9kZSkucXVlcnlTZWxlY3RvcigiOnNjb3BlID4gdWwiKSxx
+PXIuc3R5bGUscD0iIitDLkNELnpRKHIub2Zmc2V0SGVpZ2h0KSoyKyJweCIKcS5tYXhIZWlnaHQ9cApx
+PUoucUYoYSkKcD1xLiR0aQpzPXAuQygifigxKT8iKS5hKG5ldyBMLld4KHIsYSkpCnQuWi5hKG51bGwp
+ClcuSkUocS5hLHEuYixzLCExLHAuYyl9LAp5WDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixt
+PSJxdWVyeVNlbGVjdG9yQWxsIixsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYSksaz10LmcKbC50b1N0
+cmluZwpzPXQuaApILkRoKGsscywiVCIsbSkKcj10LlcKcT1uZXcgVy53eihsLnF1ZXJ5U2VsZWN0b3JB
+bGwoIi5uYXYtbGluayIpLHIpCnEuSyhxLG5ldyBMLkFPKGIpKQpILkRoKGsscywiVCIsbSkKcD1uZXcg
+Vy53eihsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5yZWdpb24iKSxyKQppZighcC5nbDAocCkpe289bC5xdWVy
+eVNlbGVjdG9yKCJ0YWJsZVtkYXRhLXBhdGhdIikKby50b1N0cmluZwpwLksocCxuZXcgTC5IbyhvLmdl
+dEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KG8pKS5PKCJwYXRoIikpKSl9SC5EaChr
+LHMsIlQiLG0pCm49bmV3IFcud3oobC5xdWVyeVNlbGVjdG9yQWxsKCIuYWRkLWhpbnQtbGluayIpLHIp
+Cm4uSyhuLG5ldyBMLklDKCkpfSwKUTY6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPW5ldyBYTUxIdHRwUmVx
+dWVzdCgpCkMuRHQuZW8ocywiR0VUIixMLlE0KGEsYiksITApCnMuc2V0UmVxdWVzdEhlYWRlcigiQ29u
+dGVudC1UeXBlIiwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCIpCnJldHVybiBMLkxVKHMs
+bnVsbCxjLkMoIjAqIikpfSwKdHk6ZnVuY3Rpb24oYSxiKXt2YXIgcz1uZXcgWE1MSHR0cFJlcXVlc3Qo
+KSxyPXQuWApDLkR0LmVvKHMsIlBPU1QiLEwuUTQoYSxQLkZsKHIscikpLCEwKQpzLnNldFJlcXVlc3RI
+ZWFkZXIoIkNvbnRlbnQtVHlwZSIsImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiKQpyZXR1
+cm4gTC5MVShzLGIsdC50KX0sCkxVOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gTC5UZyhhLGIsYyxjLkMo
+IjAqIikpfSwKVGc6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHM9MCxyPVAuRlgoZCkscSxwPTIsbyxuPVtd
+LG0sbCxrLGosaSxoLGcsZgp2YXIgJGFzeW5jJExVPVAubHooZnVuY3Rpb24oZSxhMCl7aWYoZT09PTEp
+e289YTAKcz1wfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDppPW5ldyBQLlpmKG5ldyBQLnZzKCQu
+WDMsdC5nViksdC5iQykKaD10LmViCmc9aC5hKG5ldyBMLmZDKGksYSkpCnQuWi5hKG51bGwpCmw9dC5l
+UQpXLkpFKGEsImxvYWQiLGcsITEsbCkKVy5KRShhLCJlcnJvciIsaC5hKGkuZ1lKKCkpLCExLGwpCmEu
+c2VuZChiPT1udWxsP251bGw6Qy5DdC5PQihiLG51bGwpKQpwPTQKcz03CnJldHVybiBQLmpRKGkuYSwk
+YXN5bmMkTFUpCmNhc2UgNzpwPTIKcz02CmJyZWFrCmNhc2UgNDpwPTMKZj1vCkguUnUoZikKbT1ILnRz
+KGYpCmg9UC5UbCgiRXJyb3IgcmVhY2hpbmcgbWlncmF0aW9uIHByZXZpZXcgc2VydmVyLiIsbSkKdGhy
+b3cgSC5iKGgpCnM9NgpicmVhawpjYXNlIDM6cz0yCmJyZWFrCmNhc2UgNjpqPUMuQ3QucFcoMCxhLnJl
+c3BvbnNlVGV4dCxudWxsKQppZihhLnN0YXR1cz09PTIwMCl7cT1jLkMoIjAqIikuYShqKQpzPTEKYnJl
+YWt9ZWxzZSB0aHJvdyBILmIoaikKY2FzZSAxOnJldHVybiBQLnlDKHEscikKY2FzZSAyOnJldHVybiBQ
+LmYzKG8scil9fSkKcmV0dXJuIFAuREkoJGFzeW5jJExVLHIpfSwKYUs6ZnVuY3Rpb24oYSl7dmFyIHM9
+UC5oSyhhKS5naFkoKS5xKDAsImxpbmUiKQpyZXR1cm4gcz09bnVsbD9udWxsOkguSHAocyxudWxsKX0s
+Ckc2OmZ1bmN0aW9uKGEpe3ZhciBzPVAuaEsoYSkuZ2hZKCkucSgwLCJvZmZzZXQiKQpyZXR1cm4gcz09
+bnVsbD9udWxsOkguSHAocyxudWxsKX0sCmk2OmZ1bmN0aW9uKGEpe3JldHVybiBMLm5XKHQuTy5hKGEp
+KX0sCm5XOmZ1bmN0aW9uKGEpe3ZhciBzPTAscj1QLkZYKHQueikscT0xLHAsbz1bXSxuLG0sbCxrLGos
+aSxoCnZhciAkYXN5bmMkaTY9UC5seihmdW5jdGlvbihiLGMpe2lmKGI9PT0xKXtwPWMKcz1xfXdoaWxl
+KHRydWUpc3dpdGNoKHMpe2Nhc2UgMDppPXQuZy5hKFcucWMoYS5jdXJyZW50VGFyZ2V0KSkuZ2V0QXR0
+cmlidXRlKCJocmVmIikKYS5wcmV2ZW50RGVmYXVsdCgpCnE9MwprPWRvY3VtZW50Cm49Qy5DRC56UShr
+LnF1ZXJ5U2VsZWN0b3IoIi5jb250ZW50Iikuc2Nyb2xsVG9wKQpzPTYKcmV0dXJuIFAualEoTC50eShp
+LG51bGwpLCRhc3luYyRpNikKY2FzZSA2OnM9NwpyZXR1cm4gUC5qUShMLkc3KHdpbmRvdy5sb2NhdGlv
+bi5wYXRobmFtZSxudWxsLG51bGwsITEsbnVsbCksJGFzeW5jJGk2KQpjYXNlIDc6az1rLnF1ZXJ5U2Vs
+ZWN0b3IoIi5jb250ZW50IikKay50b1N0cmluZwprLnNjcm9sbFRvcD1KLlZ1KG4pCnE9MQpzPTUKYnJl
+YWsKY2FzZSAzOnE9MgpoPXAKbT1ILlJ1KGgpCmw9SC50cyhoKQpMLkMyKCJDb3VsZCBub3QgYWRkL3Jl
+bW92ZSBoaW50IixtLGwpCnM9NQpicmVhawpjYXNlIDI6cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55
+QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyRpNixy
+KX0sCkMyOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscD0iZXhjZXB0aW9uIixvPSJzdGFja1RyYWNl
+IixuPXQudC5iKGIpJiZKLlJNKGIucSgwLCJzdWNjZXNzIiksITEpJiZiLng0KHApJiZiLng0KG8pLG09
+Si5pYShiKQppZihuKXtzPUguaChtLnEoYixwKSkKYz1tLnEoYixvKX1lbHNlIHM9bS53KGIpCm49ZG9j
+dW1lbnQKcj1uLnF1ZXJ5U2VsZWN0b3IoIi5wb3B1cC1wYW5lIikKci5xdWVyeVNlbGVjdG9yKCJoMiIp
+LmlubmVyVGV4dD1hCnIucXVlcnlTZWxlY3RvcigicCIpLmlubmVyVGV4dD1zCnIucXVlcnlTZWxlY3Rv
+cigicHJlIikuaW5uZXJUZXh0PUouaihjKQpxPXQuZGQuYShyLnF1ZXJ5U2VsZWN0b3IoImEuYm90dG9t
+IikpCm09dC5YOyhxJiZDLnhuKS5zTFUocSxQLlhkKCJodHRwcyIsImdpdGh1Yi5jb20iLCJkYXJ0LWxh
+bmcvc2RrL2lzc3Vlcy9uZXciLFAuRUYoWyJ0aXRsZSIsIkN1c3RvbWVyLXJlcG9ydGVkIGlzc3VlIHdp
+dGggTk5CRCBtaWdyYXRpb24gdG9vbDogIithLCJsYWJlbHMiLHUuZCwiYm9keSIsYSsiXG5cbkVycm9y
+OiAiK0guRWoocykrIlxuXG5QbGVhc2UgZmlsbCBpbiB0aGUgZm9sbG93aW5nOlxuXG4qKk5hbWUgb2Yg
+cGFja2FnZSBiZWluZyBtaWdyYXRlZCAoaWYgcHVibGljKSoqOlxuKipXaGF0IEkgd2FzIGRvaW5nIHdo
+ZW4gdGhpcyBpc3N1ZSBvY2N1cnJlZCoqOlxuKipJcyBpdCBwb3NzaWJsZSB0byB3b3JrIGFyb3VuZCB0
+aGlzIGlzc3VlKio6XG4qKkhhcyB0aGlzIGlzc3VlIGhhcHBlbmVkIGJlZm9yZSwgYW5kIGlmIHNvLCBo
+b3cgb2Z0ZW4qKjpcbioqRGFydCBTREsgdmVyc2lvbioqOiAiK0guRWoobi5nZXRFbGVtZW50QnlJZCgi
+c2RrLXZlcnNpb24iKS50ZXh0Q29udGVudCkrIlxuKipBZGRpdGlvbmFsIGRldGFpbHMqKjpcblxuVGhh
+bmtzIGZvciBmaWxpbmchXG5cblN0YWNrdHJhY2U6IF9hdXRvIHBvcHVsYXRlZCBieSBtaWdyYXRpb24g
+cHJldmlldyB0b29sLl9cblxuYGBgXG4iK0guRWooYykrIlxuYGBgXG4iXSxtLG0pKS5nbkQoKSkKbT1x
+LnN0eWxlCm0uZGlzcGxheT0iaW5pdGlhbCIKbj1yLnN0eWxlCm4uZGlzcGxheT0iaW5pdGlhbCIKbj1h
+KyI6ICIrSC5FaihiKQp3aW5kb3cKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5j
+b25zb2xlLmVycm9yKG4pCndpbmRvdwpuPUguRWooYykKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmlu
+ZWQiKXdpbmRvdy5jb25zb2xlLmVycm9yKG4pfSwKdDI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxw
+LG89dC5nLmEoVy5xYyhhLmN1cnJlbnRUYXJnZXQpKQphLnByZXZlbnREZWZhdWx0KCkKcz1vLmdldEF0
+dHJpYnV0ZSgiaHJlZiIpCnI9TC5VcyhzKQpxPUwuRzYocykKcD1MLmFLKHMpCmlmKHEhPW51bGwpTC5h
+ZihyLHEscCxiLG5ldyBMLm5UKHIscSxwKSkKZWxzZSBMLmFmKHIsbnVsbCxudWxsLGIsbmV3IEwuTlko
+cikpfSwKSzA6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBv
+cHVwLXBhbmUiKQpwLnF1ZXJ5U2VsZWN0b3IoImgyIikuaW5uZXJUZXh0PSJGYWlsZWQgdG8gcmVydW4g
+ZnJvbSBzb3VyY2VzIgpwLnF1ZXJ5U2VsZWN0b3IoInAiKS5pbm5lclRleHQ9IlNvdXJjZXMgY29udGFp
+biBzdGF0aWMgYW5hbHlzaXMgZXJyb3JzOiIKcz1wLnF1ZXJ5U2VsZWN0b3IoInByZSIpCnI9Si5FbChh
+LHQuYXcpCnE9SC5MaChyKQpzLmlubmVyVGV4dD1uZXcgSC5sSihyLHEuQygicVUqKGxELkUpIikuYShu
+ZXcgTC51ZSgpKSxxLkMoImxKPGxELkUscVUqPiIpKS5IKDAsIlxuIikKcT1wLnF1ZXJ5U2VsZWN0b3Io
+ImEuYm90dG9tIikuc3R5bGUKcS5kaXNwbGF5PSJub25lIgpzPXAuc3R5bGUKcy5kaXNwbGF5PSJpbml0
+aWFsIn0sCnZVOmZ1bmN0aW9uKCl7dmFyIHM9ZG9jdW1lbnQKSC5EaCh0LmcsdC5oLCJUIiwicXVlcnlT
+ZWxlY3RvckFsbCIpCnM9bmV3IFcud3oocy5xdWVyeVNlbGVjdG9yQWxsKCIuY29kZSIpLHQuVykKcy5L
+KHMsbmV3IEwuZVgoKSl9LApoWDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEwuWXcoYSxiLGMpfSwKWXc6
+ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPTAscj1QLkZYKHQueikscT0xLHAsbz1bXSxuLG0sbCxrLGosaSxo
+LGcKdmFyICRhc3luYyRoWD1QLmx6KGZ1bmN0aW9uKGQsZSl7aWYoZD09PTEpe3A9ZQpzPXF9d2hpbGUo
+dHJ1ZSlzd2l0Y2gocyl7Y2FzZSAwOnE9MwpqPXQuWApzPTYKcmV0dXJuIFAualEoTC5RNihhLFAuRUYo
+WyJyZWdpb24iLCJyZWdpb24iLCJvZmZzZXQiLEguRWooYildLGosaiksdC50KSwkYXN5bmMkaFgpCmNh
+c2UgNjpuPWUKaj1uCmk9Si5VNihqKQptPW5ldyBVLmQyKFUuamYoaS5xKGosImVkaXRzIikpLEguaChp
+LnEoaiwiZXhwbGFuYXRpb24iKSksSC51UChpLnEoaiwibGluZSIpKSxILmgoaS5xKGosImRpc3BsYXlQ
+YXRoIikpLEguaChpLnEoaiwidXJpUGF0aCIpKSxVLk5kKGkucShqLCJ0cmFjZXMiKSkpCkwuVDEobSkK
+TC5GcihhLGIsYykKTC55WCgiLmVkaXQtcGFuZWwgLnBhbmVsLWNvbnRlbnQiLCExKQpxPTEKcz01CmJy
+ZWFrCmNhc2UgMzpxPTIKZz1wCmw9SC5SdShnKQprPUgudHMoZykKTC5DMigiQ291bGQgbm90IGxvYWQg
+ZWRpdCBkZXRhaWxzIixsLGspCnM9NQpicmVhawpjYXNlIDI6cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4g
+UC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyRo
+WCxyKX0sCkc3OmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIEwuTDUoYSxiLGMsZCxlKX0sCkw1OmZ1
+bmN0aW9uKGEsYixjLGQsZSl7dmFyIHM9MCxyPVAuRlgodC5IKSxxLHA9MixvLG49W10sbSxsLGssaixp
+LGgsZwp2YXIgJGFzeW5jJEc3PVAubHooZnVuY3Rpb24oZixhMCl7aWYoZj09PTEpe289YTAKcz1wfXdo
+aWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDppZighSi5wNChhLCIuZGFydCIpKXtMLkJFKGEsQi53Uigp
+LGQpCkwuQlgoYSxudWxsKQppZihlIT1udWxsKWUuJDAoKQpzPTEKYnJlYWt9cD00Cmk9dC5YCnM9Nwpy
+ZXR1cm4gUC5qUShMLlE2KGEsUC5FRihbImlubGluZSIsInRydWUiXSxpLGkpLHQudCksJGFzeW5jJEc3
+KQpjYXNlIDc6bT1hMApMLkJFKGEsQi5ZZihtKSxkKQpMLmZHKGIsYykKbD1MLlVzKGEpCkwuQlgobCxi
+KQppZihlIT1udWxsKWUuJDAoKQpwPTIKcz02CmJyZWFrCmNhc2UgNDpwPTMKZz1vCms9SC5SdShnKQpq
+PUgudHMoZykKTC5DMigiQ291bGQgbm90IGxvYWQgZGFydCBmaWxlICIrYSxrLGopCnM9NgpicmVhawpj
+YXNlIDM6cz0yCmJyZWFrCmNhc2UgNjpjYXNlIDE6cmV0dXJuIFAueUMocSxyKQpjYXNlIDI6cmV0dXJu
+IFAuZjMobyxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMkRzcscil9LApHZTpmdW5jdGlvbigpe3ZhciBz
+PTAscj1QLkZYKHQueikscT0xLHAsbz1bXSxuLG0sbCxrLGosaSxoCnZhciAkYXN5bmMkR2U9UC5seihm
+dW5jdGlvbihhLGIpe2lmKGE9PT0xKXtwPWIKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDpp
+PSIvX3ByZXZpZXcvbmF2aWdhdGlvblRyZWUuanNvbiIKcT0zCnM9NgpyZXR1cm4gUC5qUShMLlE2KGks
+Qy5DTSx0Lm0pLCRhc3luYyRHZSkKY2FzZSA2Om49YgptPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5u
+YXYtdHJlZSIpCkoubDUobSwiIikKTC50WChtLEwubUsobikpCnE9MQpzPTUKYnJlYWsKY2FzZSAzOnE9
+MgpoPXAKbD1ILlJ1KGgpCms9SC50cyhoKQpMLkMyKCJDb3VsZCBub3QgbG9hZCBuYXZpZ2F0aW9uIHRy
+ZWUiLGwsaykKcz01CmJyZWFrCmNhc2UgMjpzPTEKYnJlYWsKY2FzZSA1OnJldHVybiBQLnlDKG51bGws
+cikKY2FzZSAxOnJldHVybiBQLmYzKHAscil9fSkKcmV0dXJuIFAuREkoJGFzeW5jJEdlLHIpfSwKcU86
+ZnVuY3Rpb24oYSl7dmFyIHMscj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHE9Qy5DRC56USgkLmZp
+KCkub2Zmc2V0SGVpZ2h0KSxwPXdpbmRvdy5pbm5lckhlaWdodCxvPUMuQ0QuelEoJC5EVygpLm9mZnNl
+dEhlaWdodCkKaWYodHlwZW9mIHAhPT0ibnVtYmVyIilyZXR1cm4gcC5ITigpCnM9ci5ib3R0b20Kcy50
+b1N0cmluZwppZihzPnAtKG8rMTQpKUouZGgoYSkKZWxzZXtwPXIudG9wCnAudG9TdHJpbmcKaWYocDxx
+KzE0KUouZGgoYSl9fSwKZkc6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvCmlmKGEhPW51bGwpe3M9
+ZG9jdW1lbnQKcj1zLmdldEVsZW1lbnRCeUlkKCJvIitILkVqKGEpKQpxPXMucXVlcnlTZWxlY3Rvcigi
+LmxpbmUtIitILkVqKGIpKQppZihyIT1udWxsKXtMLnFPKHIpCkouZFIocikuaSgwLCJ0YXJnZXQiKX1l
+bHNlIGlmKHEhPW51bGwpTC5xTyhxLnBhcmVudEVsZW1lbnQpCmlmKHEhPW51bGwpSi5kUih0LmcuYShx
+LnBhcmVudE5vZGUpKS5pKDAsImhpZ2hsaWdodCIpfWVsc2V7cz1kb2N1bWVudApwPXQuZwpILkRoKHAs
+dC5oLCJUIiwicXVlcnlTZWxlY3RvckFsbCIpCnM9cy5xdWVyeVNlbGVjdG9yQWxsKCIubGluZS1ubyIp
+Cm89bmV3IFcud3oocyx0LlcpCmlmKG8uZ0Eobyk9PT0wKXJldHVybgpMLnFPKHAuYShDLnQ1Lmd0SChz
+KSkpfX0sCmFmOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHMscixxPUwuRzYod2luZG93LmxvY2F0aW9u
+LmhyZWYpLHA9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKaWYocSE9bnVsbCl7cz1kb2N1bWVudC5n
+ZXRFbGVtZW50QnlJZCgibyIrSC5FaihxKSkKaWYocyE9bnVsbClKLmRSKHMpLlIoMCwidGFyZ2V0Iil9
+aWYocCE9bnVsbCl7cj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubGluZS0iK0guRWoocCkpCmlmKHIh
+PW51bGwpSi5kUihyLnBhcmVudEVsZW1lbnQpLlIoMCwiaGlnaGxpZ2h0Iil9aWYoYT09d2luZG93Lmxv
+Y2F0aW9uLnBhdGhuYW1lKXtMLmZHKGIsYykKZS4kMCgpfWVsc2UgTC5HNyhhLGIsYyxkLGUpfSwKUTQ6
+ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9UC5oSyhhKSxwPXQuWApwPVAuRmwocCxwKQpmb3Iocz1xLmdo
+WSgpLHM9cy5nUHUocykscz1zLmdtKHMpO3MuRigpOyl7cj1zLmdsKCkKcC5ZKDAsci5hLHIuYil9Zm9y
+KHM9Yi5nUHUoYikscz1zLmdtKHMpO3MuRigpOyl7cj1zLmdsKCkKcC5ZKDAsci5hLHIuYil9cC5ZKDAs
+ImF1dGhUb2tlbiIsJC5VRSgpKQpyZXR1cm4gcS5ubSgwLHApLmduRCgpfSwKVDE6ZnVuY3Rpb24oYSl7
+dmFyIHMscixxLHAsbyxuLG0sbCxrLGo9JC5oTCgpCkoubDUoaiwiIikKaWYoYT09bnVsbCl7cz1kb2N1
+bWVudC5jcmVhdGVFbGVtZW50KCJwIikKQy5MdC5zYTQocywiU2VlIGRldGFpbHMgYWJvdXQgYSBwcm9w
+b3NlZCBlZGl0LiIpCkMuTHQuc0QocyxILlZNKFsicGxhY2Vob2xkZXIiXSx0LmkpKQpqLmFwcGVuZENo
+aWxkKHMpCkMuTHQuRkYocykKcmV0dXJufXI9YS5kCnE9JC5uVSgpCnA9cS56ZihyKQpvPWEuYgpuPWRv
+Y3VtZW50Cm09cS5IUChyLEouVDAobi5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50KSkK
+bD1hLmMKaz1uLmNyZWF0ZUVsZW1lbnQoInAiKQpqLmFwcGVuZENoaWxkKGspCmsuYXBwZW5kQ2hpbGQo
+bi5jcmVhdGVUZXh0Tm9kZShILkVqKG8pKyIgYXQgIikpCnE9dC5YCnE9Vy5KNihMLlE0KGEuZSxQLkVG
+KFsibGluZSIsSi5qKGwpXSxxLHEpKSkKcS5hcHBlbmRDaGlsZChuLmNyZWF0ZVRleHROb2RlKEguRWoo
+bSkrIjoiK0guRWoobCkrIi4iKSkKay5hcHBlbmRDaGlsZChxKQpKLmRoKGspCkwuQ0MoYSxqLHApCkwu
+RnooYSxqKX0sCkxIOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxm
+LGU9JC55UCgpCkoubDUoZSwiIikKaWYoYi5nQShiKT09PTApe3M9ZG9jdW1lbnQKcj1zLmNyZWF0ZUVs
+ZW1lbnQoInAiKQplLmFwcGVuZENoaWxkKHIpCnIuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgi
+Tm8gcHJvcG9zZWQgZWRpdHMiKSl9ZWxzZSBmb3IoZT1iLmdQdShiKSxlPWUuZ20oZSkscz10LlgscT10
+LmsscD1xLkMoIn4oMSk/Iiksbz10LloscT1xLmM7ZS5GKCk7KXtuPWUuZ2woKQptPWRvY3VtZW50CnI9
+bS5jcmVhdGVFbGVtZW50KCJwIikKbD0kLnlQKCkKbC5hcHBlbmRDaGlsZChyKQpyLmFwcGVuZENoaWxk
+KG0uY3JlYXRlVGV4dE5vZGUoSC5FaihuLmEpKyI6IikpCms9bS5jcmVhdGVFbGVtZW50KCJ1bCIpCmwu
+YXBwZW5kQ2hpbGQoaykKZm9yKG49Si5JVChuLmIpO24uRigpOyl7bD1uLmdsKCkKaj1tLmNyZWF0ZUVs
+ZW1lbnQoImxpIikKay5hcHBlbmRDaGlsZChqKQpKLmRSKGopLmkoMCwiZWRpdCIpCmk9bS5jcmVhdGVF
+bGVtZW50KCJhIikKai5hcHBlbmRDaGlsZChpKQppLmNsYXNzTGlzdC5hZGQoImVkaXQtbGluayIpCmg9
+bC5jCmc9SC5FaihoKQppLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGkpKS5P
+KCJvZmZzZXQiKSxnKQpmPWwuYQpnPUguRWooZikKaS5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5T
+eShuZXcgVy5pNyhpKSkuTygibGluZSIpLGcpCmkuYXBwZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgi
+bGluZSAiK0guRWooZikpKQppLnNldEF0dHJpYnV0ZSgiaHJlZiIsTC5RNCh3aW5kb3cubG9jYXRpb24u
+cGF0aG5hbWUsUC5FRihbImxpbmUiLEguRWooZiksIm9mZnNldCIsSC5FaihoKV0scyxzKSkpCmc9cC5h
+KG5ldyBMLkVFKGgsZixhKSkKby5hKG51bGwpClcuSkUoaSwiY2xpY2siLGcsITEscSkKai5hcHBlbmRD
+aGlsZChtLmNyZWF0ZVRleHROb2RlKCI6ICIrSC5FaihsLmIpKSl9fWlmKGMpTC5UMShudWxsKX0sCkZy
+OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHE9d2luZG93LmxvY2F0aW9uLHA9UC5oSygocSYmQy5FeCku
+Z0RyKHEpK0guRWooYSkpCnE9dC5YCnE9UC5GbChxLHEpCmlmKGIhPW51bGwpcS5ZKDAsIm9mZnNldCIs
+SC5FaihiKSkKaWYoYyE9bnVsbClxLlkoMCwibGluZSIsSC5FaihjKSkKcS5ZKDAsImF1dGhUb2tlbiIs
+JC5VRSgpKQpwPXAubm0oMCxxKQpxPXdpbmRvdy5oaXN0b3J5CnM9dC56CnI9cC5nbkQoKQpxLnRvU3Ry
+aW5nCnEucHVzaFN0YXRlKG5ldyBQLkJmKFtdLFtdKS5QdihQLkZsKHMscykpLCIiLHIpfSwKRW46ZnVu
+Y3Rpb24oYSl7dmFyIHM9Si5iYihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250
+ZW50LCIvIikKaWYoQy54Qi5uKGEscykpcmV0dXJuIEMueEIuRyhhLHMubGVuZ3RoKQplbHNlIHJldHVy
+biBhfSwKQlg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXt9CnIuYT1hCmE9TC5FbihhKQpyLmE9YQpKLmRy
+KCQuRDkoKSxhKQpzPWRvY3VtZW50CkguRGgodC5nLHQuaCwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpz
+PW5ldyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgiLm5hdi1wYW5lbCAubmF2LWxpbmsiKSx0LlcpCnMu
+SyhzLG5ldyBMLlZTKHIpKX0sCkJFOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz0iLnJlZ2lvbnMiLHI9ZG9j
+dW1lbnQscT1yLnF1ZXJ5U2VsZWN0b3IocykscD1yLnF1ZXJ5U2VsZWN0b3IoIi5jb2RlIikKSi50SChx
+LGIuYSwkLktHKCkpCkoudEgocCxiLmIsJC5LRygpKQpMLkxIKGEsYi5kLGMpCkwudlUoKQpMLnlYKCIu
+Y29kZSIsITApCkwueVgocywhMCl9LAp0WDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGws
+ayxqLGksaCxnLGYsZT1kb2N1bWVudCxkPWUuY3JlYXRlRWxlbWVudCgidWwiKQphLmFwcGVuZENoaWxk
+KGQpCmZvcihzPWIubGVuZ3RoLHI9dC5YLHE9dC5aLHA9MDtwPGIubGVuZ3RoO2IubGVuZ3RoPT09c3x8
+KDAsSC5saykoYiksKytwKXtvPWJbcF0Kbj1lLmNyZWF0ZUVsZW1lbnQoImxpIikKZC5hcHBlbmRDaGls
+ZChuKQptPUouWUUobikKaWYoby5hPT09Qy5ZMil7bS5nRChuKS5pKDAsImRpciIpCmw9ZS5jcmVhdGVF
+bGVtZW50KCJzcGFuIikKbi5hcHBlbmRDaGlsZChsKQptPUouWUUobCkKbS5nRChsKS5pKDAsImFycm93
+IikKbS5zaGYobCwiJiN4MjVCQzsiKQprPWUuY3JlYXRlRWxlbWVudCgic3BhbiIpCm4uYXBwZW5kQ2hp
+bGQoaykKSi5sNShrLCc8c3BhbiBjbGFzcz0ibWF0ZXJpYWwtaWNvbnMiPmZvbGRlcl9vcGVuPC9zcGFu
+PicpCm4uYXBwZW5kQ2hpbGQoZS5jcmVhdGVUZXh0Tm9kZShvLmIpKQpMLnRYKG4sby5jKQpMLmt6KGwp
+fWVsc2V7bS5zaGYobiwnPHNwYW4gY2xhc3M9Im1hdGVyaWFsLWljb25zIj5pbnNlcnRfZHJpdmVfZmls
+ZTwvc3Bhbj4nKQpqPWUuY3JlYXRlRWxlbWVudCgiYSIpCm4uYXBwZW5kQ2hpbGQoaikKbT1KLllFKGop
+Cm0uZ0QoaikuaSgwLCJuYXYtbGluayIpCmouc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3
+IFcuaTcoaikpLk8oIm5hbWUiKSxvLmQpCmouc2V0QXR0cmlidXRlKCJocmVmIixMLlE0KG8uZSxQLkZs
+KHIscikpKQpqLmFwcGVuZENoaWxkKGUuY3JlYXRlVGV4dE5vZGUoby5iKSkKbT1tLmdWbChqKQppPW0u
+JHRpCmg9aS5DKCJ+KDEpPyIpLmEobmV3IEwuVEQoKSkKcS5hKG51bGwpClcuSkUobS5hLG0uYixoLCEx
+LGkuYykKZz1vLmYKaWYodHlwZW9mIGchPT0ibnVtYmVyIilyZXR1cm4gZy5vcygpCmlmKGc+MCl7Zj1l
+LmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpuLmFwcGVuZENoaWxkKGYpCkouZFIoZikuaSgwLCJlZGl0LWNv
+dW50IikKbT0iIitnKyIgIgppZihnPT09MSlpPSJlZGl0IgplbHNlIGk9ImVkaXRzIgpmLnNldEF0dHJp
+YnV0ZSgidGl0bGUiLG0raSkKZi5hcHBlbmRDaGlsZChlLmNyZWF0ZVRleHROb2RlKEMuam4udyhnKSkp
+fX19fSwKdXo6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPWRvY3VtZW50LHI9cy5jcmVhdGVFbGVtZW50KCJi
+dXR0b24iKSxxPXQuayxwPXEuQygifigxKT8iKS5hKG5ldyBMLm0yKGEsYykpCnQuWi5hKG51bGwpClcu
+SkUociwiY2xpY2siLHAsITEscS5jKQpyLmFwcGVuZENoaWxkKHMuY3JlYXRlVGV4dE5vZGUoTS5PWChh
+LmEpKSkKYi5hcHBlbmRDaGlsZChyKX0sCkZ6OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuLG0s
+bCxrLGosaSxoPWEuYQppZihoPT1udWxsKXJldHVybgpzPWRvY3VtZW50CnI9cy5jcmVhdGVFbGVtZW50
+KCJwIikKcT1iLmFwcGVuZENoaWxkKHIpCnI9cy5jcmVhdGVFbGVtZW50KCJzcGFuIikKcD10LmkKSi5N
+dShyLEguVk0oWyJ0eXBlLWRlc2NyaXB0aW9uIl0scCkpCnIuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0
+Tm9kZSgiQWN0aW9ucyIpKQpxLmFwcGVuZENoaWxkKHIpCnEuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0
+Tm9kZSgiOiIpKQpvPXMuY3JlYXRlRWxlbWVudCgicCIpCmIuYXBwZW5kQ2hpbGQobykKZm9yKHI9aC5s
+ZW5ndGgsbj10LlEsbT0wO208aC5sZW5ndGg7aC5sZW5ndGg9PT1yfHwoMCxILmxrKShoKSwrK20pe2w9
+aFttXQprPXMuY3JlYXRlRWxlbWVudCgiYSIpCm8uYXBwZW5kQ2hpbGQoaykKay5hcHBlbmRDaGlsZChz
+LmNyZWF0ZVRleHROb2RlKGwuYSkpCmsuc2V0QXR0cmlidXRlKCJocmVmIixsLmIpCmo9bi5hKEguVk0o
+WyJhZGQtaGludC1saW5rIiwiYmVmb3JlLWFwcGx5IiwiYnV0dG9uIl0scCkpCmk9Si5kUihrKQppLlYx
+KDApCmkuRlYoMCxqKX19LApDQzpmdW5jdGlvbihhNCxhNSxhNil7dmFyIHMscixxLHAsbyxuLG0sbCxr
+LGosaSxoLGcsZixlLGQsYyxiLGEsYTAsYTEsYTIsYTMKZm9yKHM9YTQuZixyPXMubGVuZ3RoLHE9dC5p
+LHA9dC5RLG89MDtvPHMubGVuZ3RoO3MubGVuZ3RoPT09cnx8KDAsSC5saykocyksKytvKXtuPXNbb10K
+bT1kb2N1bWVudApsPW0uY3JlYXRlRWxlbWVudCgicCIpCms9cC5hKEguVk0oWyJ0cmFjZSJdLHEpKQpq
+PUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykKaT1hNS5hcHBlbmRDaGlsZChsKQpsPW0uY3JlYXRlRWxl
+bWVudCgic3BhbiIpCms9cC5hKEguVk0oWyJ0eXBlLWRlc2NyaXB0aW9uIl0scSkpCmo9Si5kUihsKQpq
+LlYxKDApCmouRlYoMCxrKQpsLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUobi5hKSkKaS5hcHBl
+bmRDaGlsZChsKQppLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoIjoiKSkKbD1tLmNyZWF0ZUVs
+ZW1lbnQoInVsIikKaz1wLmEoSC5WTShbInRyYWNlIl0scSkpCmo9Si5kUihsKQpqLlYxKDApCmouRlYo
+MCxrKQpoPWkuYXBwZW5kQ2hpbGQobCkKZm9yKGw9bi5iLGs9bC5sZW5ndGgsZz0wO2c8bC5sZW5ndGg7
+bC5sZW5ndGg9PT1rfHwoMCxILmxrKShsKSwrK2cpe2Y9bFtnXQplPW0uY3JlYXRlRWxlbWVudCgibGki
+KQpoLmFwcGVuZENoaWxkKGUpCmQ9bS5jcmVhdGVFbGVtZW50KCJzcGFuIikKYz1wLmEoSC5WTShbImZ1
+bmN0aW9uIl0scSkpCmo9Si5kUihkKQpqLlYxKDApCmouRlYoMCxjKQpjPWYuYgpMLmtEKGQsYz09bnVs
+bD8idW5rbm93biI6YykKZS5hcHBlbmRDaGlsZChkKQpiPWYuYwppZihiIT1udWxsKXtlLmFwcGVuZENo
+aWxkKG0uY3JlYXRlVGV4dE5vZGUoIiAoIikpCmE9Yi5iCmEwPW0uY3JlYXRlRWxlbWVudCgiYSIpCmEw
+LmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoSC5FaihiLmMpKyI6IitILkVqKGEpKSkKYTAuc2V0
+QXR0cmlidXRlKCJocmVmIixiLmEpCmEwLmNsYXNzTGlzdC5hZGQoIm5hdi1saW5rIikKZS5hcHBlbmRD
+aGlsZChhMCkKZS5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKCIpIikpfWUuYXBwZW5kQ2hpbGQo
+bS5jcmVhdGVUZXh0Tm9kZSgiOiAiKSkKZD1mLmEKTC5rRChlLGQ9PW51bGw/InVua25vd24iOmQpCmQ9
+Zi5kCmlmKGQubGVuZ3RoIT09MCl7Yz1tLmNyZWF0ZUVsZW1lbnQoInAiKQphMT1wLmEoSC5WTShbImRy
+YXdlciIsImJlZm9yZS1hcHBseSJdLHEpKQpqPUouZFIoYykKai5WMSgwKQpqLkZWKDAsYTEpCmEyPWUu
+YXBwZW5kQ2hpbGQoYykKZm9yKGM9ZC5sZW5ndGgsYTM9MDthMzxkLmxlbmd0aDtkLmxlbmd0aD09PWN8
+fCgwLEgubGspKGQpLCsrYTMpTC51eihkW2EzXSxhMixiKX19fX0sClVzOmZ1bmN0aW9uKGEpe3JldHVy
+biBKLlU2KGEpLnRnKGEsIj8iKT9DLnhCLk5qKGEsMCxDLnhCLk9ZKGEsIj8iKSk6YX0sCmtEOmZ1bmN0
+aW9uKGEsYil7dmFyIHMscixxPUguVk0oYi5zcGxpdCgiLiIpLHQucykscD1DLk5tLmd0SChxKSxvPWRv
+Y3VtZW50CmEuYXBwZW5kQ2hpbGQoby5jcmVhdGVUZXh0Tm9kZShwKSkKZm9yKHA9SC5xQyhxLDEsbnVs
+bCx0Lk4pLHA9bmV3IEguYTcocCxwLmdBKHApLHAuJHRpLkMoImE3PGFMLkU+IikpLHM9Si5ZRShhKTtw
+LkYoKTspe3I9cC5kCnMubnooYSwiYmVmb3JlZW5kIiwiJiM4MjAzOy4iLG51bGwsbnVsbCkKYS5hcHBl
+bmRDaGlsZChvLmNyZWF0ZVRleHROb2RlKHIpKX19LAplOmZ1bmN0aW9uIGUoKXt9LApWVzpmdW5jdGlv
+biBWVyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApvWjpmdW5jdGlvbiBvWigpe30s
+CmpyOmZ1bmN0aW9uIGpyKCl7fSwKcWw6ZnVuY3Rpb24gcWwoKXt9LApIaTpmdW5jdGlvbiBIaSgpe30s
+CkJUOmZ1bmN0aW9uIEJUKCl7fSwKUFk6ZnVuY3Rpb24gUFkoKXt9LApMOmZ1bmN0aW9uIEwoKXt9LApX
+eDpmdW5jdGlvbiBXeChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQU86ZnVuY3Rpb24gQU8oYSl7dGhp
+cy5hPWF9LApkTjpmdW5jdGlvbiBkTihhKXt0aGlzLmE9YX0sCkhvOmZ1bmN0aW9uIEhvKGEpe3RoaXMu
+YT1hfSwKeHo6ZnVuY3Rpb24geHooYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCklDOmZ1bmN0aW9uIElD
+KCl7fSwKZkM6ZnVuY3Rpb24gZkMoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCm5UOmZ1bmN0aW9uIG5U
+KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCk5ZOmZ1bmN0aW9uIE5ZKGEpe3RoaXMu
+YT1hfSwKdWU6ZnVuY3Rpb24gdWUoKXt9LAplWDpmdW5jdGlvbiBlWCgpe30sCkVFOmZ1bmN0aW9uIEVF
+KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClFMOmZ1bmN0aW9uIFFMKGEsYil7dGhp
+cy5hPWEKdGhpcy5iPWJ9LApWUzpmdW5jdGlvbiBWUyhhKXt0aGlzLmE9YX0sClREOmZ1bmN0aW9uIFRE
+KCl7fSwKbTI6ZnVuY3Rpb24gbTIoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClhBOmZ1bmN0aW9uIFhB
+KCl7fSwKbUs6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG09SC5WTShbXSx0LmNRKQpmb3Iocz1K
+LklUKHQuVS5hKGEpKTtzLkYoKTspe3I9cy5nbCgpCnE9Si5VNihyKQpwPUwucDIoSC5oKHEucShyLCJ0
+eXBlIikpKQpvPUguaChxLnEociwibmFtZSIpKQpuPXEucShyLCJzdWJ0cmVlIikKbj1uPT1udWxsP251
+bGw6TC5tSyhuKQpDLk5tLmkobSxuZXcgTC5aWihwLG8sbixILmgocS5xKHIsInBhdGgiKSksSC5oKHEu
+cShyLCJocmVmIikpLEgudVAocS5xKHIsImVkaXRDb3VudCIpKSkpfXJldHVybiBtfSwKVkQ6ZnVuY3Rp
+b24oYSl7dmFyIHMscixxPUguVk0oW10sdC5HKQpmb3Iocz1hLmxlbmd0aCxyPTA7cjxhLmxlbmd0aDth
+Lmxlbmd0aD09PXN8fCgwLEgubGspKGEpLCsrcilDLk5tLmkocSxhW3JdLkx0KCkpCnJldHVybiBxfSwK
+cDI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UiZGlyZWN0b3J5IjpyZXR1cm4gQy5ZMgpjYXNlImZp
+bGUiOnJldHVybiBDLnJmCmRlZmF1bHQ6dGhyb3cgSC5iKFAuUFYoIlVucmVjb2duaXplZCBuYXZpZ2F0
+aW9uIHRyZWUgbm9kZSB0eXBlOiAiK0guRWooYSkpKX19LAp2eTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7
+Y2FzZSBDLlkyOnJldHVybiJkaXJlY3RvcnkiCmNhc2UgQy5yZjpyZXR1cm4iZmlsZSJ9dGhyb3cgSC5i
+KFAuUFYoIlVucmVjb2duaXplZCBuYXZpZ2F0aW9uIHRyZWUgbm9kZSB0eXBlOiAiK2EudygwKSkpfSwK
+Wlo6ZnVuY3Rpb24gWlooYSxiLGMsZCxlLGYpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5k
+PWQKXy5lPWUKXy5mPWZ9LApPOTpmdW5jdGlvbiBPOShhKXt0aGlzLmI9YX0sCklWOmZ1bmN0aW9uIElW
+KGEsYixjLGQpe3ZhciBfPXRoaXMKXy5kPWEKXy5lPWIKXy5mPWMKXy5yPWR9fSxYPXsKQ0w6ZnVuY3Rp
+b24oYSxiKXt2YXIgcyxyLHEscCxvLG49Yi54WihhKQpiLmhLKGEpCmlmKG4hPW51bGwpYT1KLktWKGEs
+bi5sZW5ndGgpCnM9dC5zCnI9SC5WTShbXSxzKQpxPUguVk0oW10scykKcz1hLmxlbmd0aAppZihzIT09
+MCYmYi5yNChDLnhCLlcoYSwwKSkpe2lmKDA+PXMpcmV0dXJuIEguT0goYSwwKQpDLk5tLmkocSxhWzBd
+KQpwPTF9ZWxzZXtDLk5tLmkocSwiIikKcD0wfWZvcihvPXA7bzxzOysrbylpZihiLnI0KEMueEIuVyhh
+LG8pKSl7Qy5ObS5pKHIsQy54Qi5OaihhLHAsbykpCkMuTm0uaShxLGFbb10pCnA9bysxfWlmKHA8cyl7
+Qy5ObS5pKHIsQy54Qi5HKGEscCkpCkMuTm0uaShxLCIiKX1yZXR1cm4gbmV3IFguV0QoYixuLHIscSl9
+LApXRDpmdW5jdGlvbiBXRChhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1jCl8uZT1k
+fSwKSTc6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBYLmR2KGEpfSwKZHY6ZnVuY3Rpb24gZHYoYSl7dGhp
+cy5hPWF9fSxPPXsKUmg6ZnVuY3Rpb24oKXt2YXIgcyxyPW51bGwKaWYoUC51bygpLmdGaSgpIT09ImZp
+bGUiKXJldHVybiAkLkViKCkKcz1QLnVvKCkKaWYoIUMueEIuVGMocy5nSWkocyksIi8iKSlyZXR1cm4g
+JC5FYigpCmlmKFAuS0wociwiYS9iIixyLHIscixyLHIpLnQ0KCk9PT0iYVxcYiIpcmV0dXJuICQuS2so
+KQpyZXR1cm4gJC5iRCgpfSwKekw6ZnVuY3Rpb24gekwoKXt9fSxFPXtPRjpmdW5jdGlvbiBPRihhLGIs
+Yyl7dGhpcy5kPWEKdGhpcy5lPWIKdGhpcy5mPWN9fSxGPXtydTpmdW5jdGlvbiBydShhLGIsYyxkKXt2
+YXIgXz10aGlzCl8uZD1hCl8uZT1iCl8uZj1jCl8ucj1kfX0sRD17CmFiOmZ1bmN0aW9uKCl7dmFyIHMs
+cixxLHAsbz1udWxsCnRyeXtvPVAudW8oKX1jYXRjaChzKXtpZih0Lmc4LmIoSC5SdShzKSkpe3I9JC5G
+ZgppZihyIT1udWxsKXJldHVybiByCnRocm93IHN9ZWxzZSB0aHJvdyBzfWlmKEouUk0obywkLkk2KSl7
+cj0kLkZmCnIudG9TdHJpbmcKcmV0dXJuIHJ9JC5JNj1vCmlmKCQuSGsoKT09JC5FYigpKXI9JC5GZj1v
+LlpJKCIuIikudygwKQplbHNle3E9by50NCgpCnA9cS5sZW5ndGgtMQpyPSQuRmY9cD09PTA/cTpDLnhC
+Lk5qKHEsMCxwKX1yLnRvU3RyaW5nCnJldHVybiByfX0KdmFyIHc9W0MsSCxKLFAsVyxNLFUsQixULEws
+WCxPLEUsRixEXQpodW5rSGVscGVycy5zZXRGdW5jdGlvbk5hbWVzSWZOZWNlc3NhcnkodykKdmFyICQ9
+e30KSC5GSy5wcm90b3R5cGU9e30KSi52Qi5wcm90b3R5cGU9ewpETjpmdW5jdGlvbihhLGIpe3JldHVy
+biBhPT09Yn0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gSC5lUShhKX0sCnc6ZnVuY3Rpb24oYSl7cmV0
+dXJuIkluc3RhbmNlIG9mICciK0guRWooSC5NKGEpKSsiJyJ9LAplNzpmdW5jdGlvbihhLGIpe3Quby5h
+KGIpCnRocm93IEguYihQLmxyKGEsYi5nV2EoKSxiLmduZCgpLGIuZ1ZtKCkpKX19CkoueUUucHJvdG90
+eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVy
+biBhPzUxOTAxODoyMTgxNTl9LAokaWEyOjF9Ckoud2UucHJvdG90eXBlPXsKRE46ZnVuY3Rpb24oYSxi
+KXtyZXR1cm4gbnVsbD09Yn0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIm51bGwifSwKZ2lPOmZ1bmN0aW9u
+KGEpe3JldHVybiAwfSwKZTc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5TaihhLHQuby5hKGIpKX0s
+CiRpYzg6MX0KSi5NRi5wcm90b3R5cGU9ewpnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIDB9LAp3OmZ1bmN0
+aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAokaXZtOjF9CkouaUMucHJvdG90eXBlPXt9Ckoua2QucHJv
+dG90eXBlPXt9CkouYzUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz1hWyQudygpXQppZihz
+PT1udWxsKXJldHVybiB0aGlzLnQoYSkKcmV0dXJuIkphdmFTY3JpcHQgZnVuY3Rpb24gZm9yICIrSC5F
+aihKLmoocykpfSwKJGlFSDoxfQpKLmpkLnByb3RvdHlwZT17CmRyOmZ1bmN0aW9uKGEsYil7cmV0dXJu
+IG5ldyBILmpWKGEsSC50NihhKS5DKCJAPDE+IikuS3EoYikuQygialY8MSwyPiIpKX0sCmk6ZnVuY3Rp
+b24oYSxiKXtILnQ2KGEpLmMuYShiKQppZighIWEuZml4ZWQkbGVuZ3RoKUgudihQLkw0KCJhZGQiKSkK
+YS5wdXNoKGIpfSwKVzQ6ZnVuY3Rpb24oYSxiKXt2YXIgcwppZighIWEuZml4ZWQkbGVuZ3RoKUgudihQ
+Lkw0KCJyZW1vdmVBdCIpKQpzPWEubGVuZ3RoCmlmKGI+PXMpdGhyb3cgSC5iKFAuTzcoYixudWxsKSkK
+cmV0dXJuIGEuc3BsaWNlKGIsMSlbMF19LApVRzpmdW5jdGlvbihhLGIsYyl7dmFyIHMscgpILnQ2KGEp
+LkMoImNYPDE+IikuYShjKQppZighIWEuZml4ZWQkbGVuZ3RoKUgudihQLkw0KCJpbnNlcnRBbGwiKSkK
+UC53QShiLDAsYS5sZW5ndGgsImluZGV4IikKaWYoIXQuYi5iKGMpKWM9Si5SWChjKQpzPUouSG0oYykK
+YS5sZW5ndGg9YS5sZW5ndGgrcwpyPWIrcwp0aGlzLllXKGEscixhLmxlbmd0aCxhLGIpCnRoaXMudmco
+YSxiLHIsYyl9LApGVjpmdW5jdGlvbihhLGIpe3ZhciBzCkgudDYoYSkuQygiY1g8MT4iKS5hKGIpCmlm
+KCEhYS5maXhlZCRsZW5ndGgpSC52KFAuTDQoImFkZEFsbCIpKQpmb3Iocz1KLklUKGIpO3MuRigpOylh
+LnB1c2gocy5nbCgpKX0sCkUyOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1ILnQ2KGEpCnJldHVybiBuZXcg
+SC5sSihhLHMuS3EoYykuQygiMSgyKSIpLmEoYikscy5DKCJAPDE+IikuS3EoYykuQygibEo8MSwyPiIp
+KX0sCkg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPVAuTzgoYS5sZW5ndGgsIiIsITEsdC5OKQpmb3Iocz0w
+O3M8YS5sZW5ndGg7KytzKXRoaXMuWShyLHMsSC5FaihhW3NdKSkKcmV0dXJuIHIuam9pbihiKX0sCmVS
+OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEgucUMoYSxiLG51bGwsSC50NihhKS5jKX0sCk4wOmZ1bmN0aW9u
+KGEsYixjLGQpe3ZhciBzLHIscQpkLmEoYikKSC50NihhKS5LcShkKS5DKCIxKDEsMikiKS5hKGMpCnM9
+YS5sZW5ndGgKZm9yKHI9YixxPTA7cTxzOysrcSl7cj1jLiQyKHIsYVtxXSkKaWYoYS5sZW5ndGghPT1z
+KXRocm93IEguYihQLmE0KGEpKX1yZXR1cm4gcn0sCkh0OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAs
+bwpILnQ2KGEpLkMoImEyKDEpIikuYShiKQpzPWEubGVuZ3RoCmZvcihyPW51bGwscT0hMSxwPTA7cDxz
+OysrcCl7bz1hW3BdCmlmKEgub1QoYi4kMShvKSkpe2lmKHEpdGhyb3cgSC5iKEguQW0oKSkKcj1vCnE9
+ITB9aWYocyE9PWEubGVuZ3RoKXRocm93IEguYihQLmE0KGEpKX1pZihxKXJldHVybiByCnRocm93IEgu
+YihILldwKCkpfSwKRTpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0go
+YSxiKQpyZXR1cm4gYVtiXX0sCmd0SDpmdW5jdGlvbihhKXtpZihhLmxlbmd0aD4wKXJldHVybiBhWzBd
+CnRocm93IEguYihILldwKCkpfSwKZ3JaOmZ1bmN0aW9uKGEpe3ZhciBzPWEubGVuZ3RoCmlmKHM+MCly
+ZXR1cm4gYVtzLTFdCnRocm93IEguYihILldwKCkpfSwKWVc6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIg
+cyxyLHEscCxvCkgudDYoYSkuQygiY1g8MT4iKS5hKGQpCmlmKCEhYS5pbW11dGFibGUkbGlzdClILnYo
+UC5MNCgic2V0UmFuZ2UiKSkKUC5qQihiLGMsYS5sZW5ndGgpCnM9Yy1iCmlmKHM9PT0wKXJldHVybgpQ
+LmsxKGUsInNraXBDb3VudCIpCmlmKHQuai5iKGQpKXtyPWQKcT1lfWVsc2V7cj1KLkE1KGQsZSkudHQo
+MCwhMSkKcT0wfXA9Si5VNihyKQppZihxK3M+cC5nQShyKSl0aHJvdyBILmIoSC5hcigpKQppZihxPGIp
+Zm9yKG89cy0xO28+PTA7LS1vKWFbYitvXT1wLnEocixxK28pCmVsc2UgZm9yKG89MDtvPHM7KytvKWFb
+YitvXT1wLnEocixxK28pfSwKdmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuWVcoYSxiLGMs
+ZCwwKX0sClZyOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpILnQ2KGEpLkMoImEyKDEpIikuYShiKQpzPWEu
+bGVuZ3RoCmZvcihyPTA7cjxzOysrcil7aWYoSC5vVChiLiQxKGFbcl0pKSlyZXR1cm4hMAppZihhLmxl
+bmd0aCE9PXMpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVybiExfSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIg
+cwpmb3Iocz0wO3M8YS5sZW5ndGg7KytzKWlmKEouUk0oYVtzXSxiKSlyZXR1cm4hMApyZXR1cm4hMX0s
+CmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGg9PT0wfSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVy
+biBhLmxlbmd0aCE9PTB9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLldFKGEsIlsiLCJdIil9LAp0dDpm
+dW5jdGlvbihhLGIpe3ZhciBzPUguVk0oYS5zbGljZSgwKSxILnQ2KGEpKQpyZXR1cm4gc30sCmJyOmZ1
+bmN0aW9uKGEpe3JldHVybiB0aGlzLnR0KGEsITApfSwKZ206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBK
+Lm0xKGEsYS5sZW5ndGgsSC50NihhKS5DKCJtMTwxPiIpKX0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4g
+SC5lUShhKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnNBOmZ1bmN0aW9uKGEsYil7
+aWYoISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgic2V0IGxlbmd0aCIpKQppZihiPDApdGhyb3cgSC5i
+KFAuVEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVsbCkpCmEubGVuZ3RoPWJ9LApxOmZ1bmN0aW9uKGEs
+Yil7SC51UChiKQppZihiPj1hLmxlbmd0aHx8YjwwKXRocm93IEguYihILkhZKGEsYikpCnJldHVybiBh
+W2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC50NihhKS5jLmEoYykKaWYoISFhLmltbXV0YWJsZSRsaXN0
+KUgudihQLkw0KCJpbmRleGVkIHNldCIpKQppZihiPj1hLmxlbmd0aHx8YjwwKXRocm93IEguYihILkhZ
+KGEsYikpCmFbYl09Y30sCiRpYlE6MSwKJGljWDoxLAokaXpNOjF9CkouUG8ucHJvdG90eXBlPXt9Ckou
+bTEucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3Zh
+ciBzLHI9dGhpcyxxPXIuYSxwPXEubGVuZ3RoCmlmKHIuYiE9PXApdGhyb3cgSC5iKEgubGsocSkpCnM9
+ci5jCmlmKHM+PXApe3Iuc00obnVsbCkKcmV0dXJuITF9ci5zTShxW3NdKTsrK3IuYwpyZXR1cm4hMH0s
+CnNNOmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIpLmEoYSl9LAokaUFuOjF9CkoucUku
+cHJvdG90eXBlPXsKelE6ZnVuY3Rpb24oYSl7aWYoYT4wKXtpZihhIT09MS8wKXJldHVybiBNYXRoLnJv
+dW5kKGEpfWVsc2UgaWYoYT4tMS8wKXJldHVybiAwLU1hdGgucm91bmQoMC1hKQp0aHJvdyBILmIoUC5M
+NCgiIithKyIucm91bmQoKSIpKX0sCnc6ZnVuY3Rpb24oYSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiIt
+MC4wIgplbHNlIHJldHVybiIiK2F9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbz1hfDAKaWYo
+YT09PW8pcmV0dXJuIG8mNTM2ODcwOTExCnM9TWF0aC5hYnMoYSkKcj1NYXRoLmxvZyhzKS8wLjY5MzE0
+NzE4MDU1OTk0NTN8MApxPU1hdGgucG93KDIscikKcD1zPDE/cy9xOnEvcwpyZXR1cm4oKHAqOTAwNzE5
+OTI1NDc0MDk5MnwwKSsocCozNTQyMjQzMTgxMTc2NTIxfDApKSo1OTkxOTcrcioxMjU5JjUzNjg3MDkx
+MX0sCnpZOmZ1bmN0aW9uKGEsYil7dmFyIHM9YSViCmlmKHM9PT0wKXJldHVybiAwCmlmKHM+MClyZXR1
+cm4gcwppZihiPDApcmV0dXJuIHMtYgplbHNlIHJldHVybiBzK2J9LApCVTpmdW5jdGlvbihhLGIpe3Jl
+dHVybihhfDApPT09YT9hL2J8MDp0aGlzLkRKKGEsYil9LApESjpmdW5jdGlvbihhLGIpe3ZhciBzPWEv
+YgppZihzPj0tMjE0NzQ4MzY0OCYmczw9MjE0NzQ4MzY0NylyZXR1cm4gc3wwCmlmKHM+MCl7aWYocyE9
+PTEvMClyZXR1cm4gTWF0aC5mbG9vcihzKX1lbHNlIGlmKHM+LTEvMClyZXR1cm4gTWF0aC5jZWlsKHMp
+CnRocm93IEguYihQLkw0KCJSZXN1bHQgb2YgdHJ1bmNhdGluZyBkaXZpc2lvbiBpcyAiK0guRWoocykr
+IjogIitILkVqKGEpKyIgfi8gIitiKSl9LAp3RzpmdW5jdGlvbihhLGIpe3ZhciBzCmlmKGE+MClzPXRo
+aXMucDMoYSxiKQplbHNle3M9Yj4zMT8zMTpiCnM9YT4+cz4+PjB9cmV0dXJuIHN9LApiZjpmdW5jdGlv
+bihhLGIpe2lmKGI8MCl0aHJvdyBILmIoSC50TChiKSkKcmV0dXJuIHRoaXMucDMoYSxiKX0sCnAzOmZ1
+bmN0aW9uKGEsYil7cmV0dXJuIGI+MzE/MDphPj4+Yn0sCiRpQ1A6MSwKJGlMWjoxfQpKLmJVLnByb3Rv
+dHlwZT17JGlJZjoxfQpKLlZBLnByb3RvdHlwZT17fQpKLkRyLnByb3RvdHlwZT17Ck8yOmZ1bmN0aW9u
+KGEsYil7aWYoYjwwKXRocm93IEguYihILkhZKGEsYikpCmlmKGI+PWEubGVuZ3RoKUgudihILkhZKGEs
+YikpCnJldHVybiBhLmNoYXJDb2RlQXQoYil9LApXOmZ1bmN0aW9uKGEsYil7aWYoYj49YS5sZW5ndGgp
+dGhyb3cgSC5iKEguSFkoYSxiKSkKcmV0dXJuIGEuY2hhckNvZGVBdChiKX0sCmRkOmZ1bmN0aW9uKGEs
+Yil7cmV0dXJuIG5ldyBILnVuKGIsYSwwKX0sCmg6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYiE9InN0
+cmluZyIpdGhyb3cgSC5iKFAuTDMoYixudWxsLG51bGwpKQpyZXR1cm4gYStifSwKVGM6ZnVuY3Rpb24o
+YSxiKXt2YXIgcz1iLmxlbmd0aCxyPWEubGVuZ3RoCmlmKHM+cilyZXR1cm4hMQpyZXR1cm4gYj09PXRo
+aXMuRyhhLHItcyl9LAppNzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcz1QLmpCKGIsYyxhLmxlbmd0aCks
+cj1hLnN1YnN0cmluZygwLGIpLHE9YS5zdWJzdHJpbmcocykKcmV0dXJuIHIrZCtxfSwKUWk6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciBzCmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5n
+dGgsbnVsbCxudWxsKSkKcz1jK2IubGVuZ3RoCmlmKHM+YS5sZW5ndGgpcmV0dXJuITEKcmV0dXJuIGI9
+PT1hLnN1YnN0cmluZyhjLHMpfSwKbjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlFpKGEsYiwwKX0s
+Ck5qOmZ1bmN0aW9uKGEsYixjKXtpZihjPT1udWxsKWM9YS5sZW5ndGgKaWYoYjwwKXRocm93IEguYihQ
+Lk83KGIsbnVsbCkpCmlmKGI+Yyl0aHJvdyBILmIoUC5PNyhiLG51bGwpKQppZihjPmEubGVuZ3RoKXRo
+cm93IEguYihQLk83KGMsbnVsbCkpCnJldHVybiBhLnN1YnN0cmluZyhiLGMpfSwKRzpmdW5jdGlvbihh
+LGIpe3JldHVybiB0aGlzLk5qKGEsYixudWxsKX0sCmhjOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRvTG93
+ZXJDYXNlKCl9LApiUzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD1hLnRyaW0oKSxvPXAubGVuZ3RoCmlm
+KG89PT0wKXJldHVybiBwCmlmKHRoaXMuVyhwLDApPT09MTMzKXtzPUoubW0ocCwxKQppZihzPT09byly
+ZXR1cm4iIn1lbHNlIHM9MApyPW8tMQpxPXRoaXMuTzIocCxyKT09PTEzMz9KLmMxKHAscik6bwppZihz
+PT09MCYmcT09PW8pcmV0dXJuIHAKcmV0dXJuIHAuc3Vic3RyaW5nKHMscSl9LApJeDpmdW5jdGlvbihh
+LGIpe3ZhciBzLHIKaWYoMD49YilyZXR1cm4iIgppZihiPT09MXx8YS5sZW5ndGg9PT0wKXJldHVybiBh
+CmlmKGIhPT1iPj4+MCl0aHJvdyBILmIoQy5FcSkKZm9yKHM9YSxyPSIiOyEwOyl7aWYoKGImMSk9PT0x
+KXI9cytyCmI9Yj4+PjEKaWYoYj09PTApYnJlYWsKcys9c31yZXR1cm4gcn0sClhVOmZ1bmN0aW9uKGEs
+YixjKXt2YXIgcwppZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYywwLGEubGVuZ3RoLG51
+bGwsbnVsbCkpCnM9YS5pbmRleE9mKGIsYykKcmV0dXJuIHN9LApPWTpmdW5jdGlvbihhLGIpe3JldHVy
+biB0aGlzLlhVKGEsYiwwKX0sClBrOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyCmlmKGM9PW51bGwpYz1h
+Lmxlbmd0aAplbHNlIGlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgs
+bnVsbCxudWxsKSkKcz1iLmxlbmd0aApyPWEubGVuZ3RoCmlmKGMrcz5yKWM9ci1zCnJldHVybiBhLmxh
+c3RJbmRleE9mKGIsYyl9LApjbjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlBrKGEsYixudWxsKX0s
+CklzOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1hLmxlbmd0aAppZihjPnMpdGhyb3cgSC5iKFAuVEUoYyww
+LHMsbnVsbCxudWxsKSkKcmV0dXJuIEguU1EoYSxiLGMpfSwKdGc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
+dGhpcy5JcyhhLGIsMCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBhfSwKZ2lPOmZ1bmN0aW9uKGEpe3Zh
+ciBzLHIscQpmb3Iocz1hLmxlbmd0aCxyPTAscT0wO3E8czsrK3Epe3I9cithLmNoYXJDb2RlQXQocSkm
+NTM2ODcwOTExCnI9cisoKHImNTI0Mjg3KTw8MTApJjUzNjg3MDkxMQpyXj1yPj42fXI9cisoKHImNjcx
+MDg4NjMpPDwzKSY1MzY4NzA5MTEKcl49cj4+MTEKcmV0dXJuIHIrKChyJjE2MzgzKTw8MTUpJjUzNjg3
+MDkxMX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILnVQ
+KGIpCmlmKGI+PWEubGVuZ3RofHwhMSl0aHJvdyBILmIoSC5IWShhLGIpKQpyZXR1cm4gYVtiXX0sCiRp
+dlg6MSwKJGlxVToxfQpILkJSLnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEpe3ZhciBzPUguTGgodGhp
+cykKcmV0dXJuIG5ldyBILkU3KEouSVQodGhpcy5nT04oKSkscy5DKCJAPDE+IikuS3Eocy5RWzFdKS5D
+KCJFNzwxLDI+IikpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSG0odGhpcy5nT04oKSl9LApnbDA6
+ZnVuY3Rpb24oYSl7cmV0dXJuIEoudVUodGhpcy5nT04oKSl9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJu
+IEouRjcodGhpcy5nT04oKSl9LAplUjpmdW5jdGlvbihhLGIpe3ZhciBzPUguTGgodGhpcykKcmV0dXJu
+IEguR0ooSi5BNSh0aGlzLmdPTigpLGIpLHMuYyxzLlFbMV0pfSwKRTpmdW5jdGlvbihhLGIpe3JldHVy
+biBILkxoKHRoaXMpLlFbMV0uYShKLkdBKHRoaXMuZ09OKCksYikpfSwKdzpmdW5jdGlvbihhKXtyZXR1
+cm4gSi5qKHRoaXMuZ09OKCkpfX0KSC5FNy5wcm90b3R5cGU9ewpGOmZ1bmN0aW9uKCl7cmV0dXJuIHRo
+aXMuYS5GKCl9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR0aS5RWzFdLmEodGhpcy5hLmdsKCkp
+fSwKJGlBbjoxfQpILlp5LnByb3RvdHlwZT17CmdPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF9fQpI
+Lm9sLnByb3RvdHlwZT17JGliUToxfQpILlVxLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtyZXR1
+cm4gdGhpcy4kdGkuUVsxXS5hKEoueDkodGhpcy5hLEgudVAoYikpKX0sClk6ZnVuY3Rpb24oYSxiLGMp
+e3ZhciBzPXRoaXMuJHRpCkoudTkodGhpcy5hLGIscy5jLmEocy5RWzFdLmEoYykpKX0sCiRpYlE6MSwK
+JGl6TToxfQpILmpWLnByb3RvdHlwZT17CmRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILmpWKHRo
+aXMuYSx0aGlzLiR0aS5DKCJAPDE+IikuS3EoYikuQygialY8MSwyPiIpKX0sCmdPTjpmdW5jdGlvbigp
+e3JldHVybiB0aGlzLmF9fQpILm4ucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEK
+cmV0dXJuIHMhPW51bGw/IkxhdGVJbml0aWFsaXphdGlvbkVycm9yOiAiK3M6IkxhdGVJbml0aWFsaXph
+dGlvbkVycm9yIn19CkgucjMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz0iUmVhY2hhYmls
+aXR5RXJyb3I6ICIrdGhpcy5hCnJldHVybiBzfX0KSC5xai5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihh
+KXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gQy54Qi5PMih0aGlz
+LmEsSC51UChiKSl9fQpILmJRLnByb3RvdHlwZT17fQpILmFMLnByb3RvdHlwZT17CmdtOmZ1bmN0aW9u
+KGEpe3ZhciBzPXRoaXMKcmV0dXJuIG5ldyBILmE3KHMscy5nQShzKSxILkxoKHMpLkMoImE3PGFMLkU+
+IikpfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdBKHRoaXMpPT09MH0sCkg6ZnVuY3Rpb24o
+YSxiKXt2YXIgcyxyLHEscD10aGlzLG89cC5nQShwKQppZihiLmxlbmd0aCE9PTApe2lmKG89PT0wKXJl
+dHVybiIiCnM9SC5FaihwLkUoMCwwKSkKaWYobyE9PXAuZ0EocCkpdGhyb3cgSC5iKFAuYTQocCkpCmZv
+cihyPXMscT0xO3E8bzsrK3Epe3I9citiK0guRWoocC5FKDAscSkpCmlmKG8hPT1wLmdBKHApKXRocm93
+IEguYihQLmE0KHApKX1yZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn1lbHNle2ZvcihxPTAscj0i
+IjtxPG87KytxKXtyKz1ILkVqKHAuRSgwLHEpKQppZihvIT09cC5nQShwKSl0aHJvdyBILmIoUC5hNChw
+KSl9cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9fSwKZXY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
+dGhpcy5HRygwLEguTGgodGhpcykuQygiYTIoYUwuRSkiKS5hKGIpKX0sCkUyOmZ1bmN0aW9uKGEsYixj
+KXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5sSih0aGlzLHMuS3EoYykuQygiMShhTC5FKSIp
+LmEoYikscy5DKCJAPGFMLkU+IikuS3EoYykuQygibEo8MSwyPiIpKX0sCmVSOmZ1bmN0aW9uKGEsYil7
+cmV0dXJuIEgucUModGhpcyxiLG51bGwsSC5MaCh0aGlzKS5DKCJhTC5FIikpfSwKdHQ6ZnVuY3Rpb24o
+YSxiKXtyZXR1cm4gUC5DSCh0aGlzLCEwLEguTGgodGhpcykuQygiYUwuRSIpKX0sCmJyOmZ1bmN0aW9u
+KGEpe3JldHVybiB0aGlzLnR0KGEsITApfX0KSC5uSC5wcm90b3R5cGU9ewpIZDpmdW5jdGlvbihhLGIs
+YyxkKXt2YXIgcyxyPXRoaXMuYgpQLmsxKHIsInN0YXJ0IikKcz10aGlzLmMKaWYocyE9bnVsbCl7UC5r
+MShzLCJlbmQiKQppZihyPnMpdGhyb3cgSC5iKFAuVEUociwwLHMsInN0YXJ0IixudWxsKSl9fSwKZ1VE
+OmZ1bmN0aW9uKCl7dmFyIHM9Si5IbSh0aGlzLmEpLHI9dGhpcy5jCmlmKHI9PW51bGx8fHI+cylyZXR1
+cm4gcwpyZXR1cm4gcn0sCmdBczpmdW5jdGlvbigpe3ZhciBzPUouSG0odGhpcy5hKSxyPXRoaXMuYgpp
+ZihyPnMpcmV0dXJuIHMKcmV0dXJuIHJ9LApnQTpmdW5jdGlvbihhKXt2YXIgcyxyPUouSG0odGhpcy5h
+KSxxPXRoaXMuYgppZihxPj1yKXJldHVybiAwCnM9dGhpcy5jCmlmKHM9PW51bGx8fHM+PXIpcmV0dXJu
+IHItcQppZih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVybiBzLkhOKCkKcmV0dXJuIHMtcX0sCkU6ZnVu
+Y3Rpb24oYSxiKXt2YXIgcz10aGlzLHI9cy5nQXMoKStiCmlmKGI8MHx8cj49cy5nVUQoKSl0aHJvdyBI
+LmIoUC5DZihiLHMsImluZGV4IixudWxsLG51bGwpKQpyZXR1cm4gSi5HQShzLmEscil9LAplUjpmdW5j
+dGlvbihhLGIpe3ZhciBzLHIscT10aGlzClAuazEoYiwiY291bnQiKQpzPXEuYitiCnI9cS5jCmlmKHIh
+PW51bGwmJnM+PXIpcmV0dXJuIG5ldyBILk1CKHEuJHRpLkMoIk1CPDE+IikpCnJldHVybiBILnFDKHEu
+YSxzLHIscS4kdGkuYyl9LAp0dDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwPXRoaXMsbz1wLmIsbj1w
+LmEsbT1KLlU2KG4pLGw9bS5nQShuKSxrPXAuYwppZihrIT1udWxsJiZrPGwpbD1rCmlmKHR5cGVvZiBs
+IT09Im51bWJlciIpcmV0dXJuIGwuSE4oKQpzPWwtbwppZihzPD0wKXtuPUouUWkoMCxwLiR0aS5jKQpy
+ZXR1cm4gbn1yPVAuTzgocyxtLkUobixvKSwhMSxwLiR0aS5jKQpmb3IocT0xO3E8czsrK3Epe0MuTm0u
+WShyLHEsbS5FKG4sbytxKSkKaWYobS5nQShuKTxsKXRocm93IEguYihQLmE0KHApKX1yZXR1cm4gcn19
+CkguYTcucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLmQKcmV0dXJuIHN9LApGOmZ1
+bmN0aW9uKCl7dmFyIHMscj10aGlzLHE9ci5hLHA9Si5VNihxKSxvPXAuZ0EocSkKaWYoci5iIT09byl0
+aHJvdyBILmIoUC5hNChxKSkKcz1yLmMKaWYocz49byl7ci5zSShudWxsKQpyZXR1cm4hMX1yLnNJKHAu
+RShxLHMpKTsrK3IuYwpyZXR1cm4hMH0sCnNJOmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIx
+PyIpLmEoYSl9LAokaUFuOjF9CkguaTEucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7dmFyIHM9SC5M
+aCh0aGlzKQpyZXR1cm4gbmV3IEguTUgoSi5JVCh0aGlzLmEpLHRoaXMuYixzLkMoIkA8MT4iKS5LcShz
+LlFbMV0pLkMoIk1IPDEsMj4iKSl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IbSh0aGlzLmEpfSwK
+Z2wwOmZ1bmN0aW9uKGEpe3JldHVybiBKLnVVKHRoaXMuYSl9LApFOmZ1bmN0aW9uKGEsYil7cmV0dXJu
+IHRoaXMuYi4kMShKLkdBKHRoaXMuYSxiKSl9fQpILnh5LnByb3RvdHlwZT17JGliUToxfQpILk1ILnBy
+b3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLHI9cy5iCmlmKHIuRigpKXtzLnNJKHMuYy4k
+MShyLmdsKCkpKQpyZXR1cm4hMH1zLnNJKG51bGwpCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24oKXt2YXIg
+cz10aGlzLmEKcmV0dXJuIHN9LApzSTpmdW5jdGlvbihhKXt0aGlzLmE9dGhpcy4kdGkuQygiMj8iKS5h
+KGEpfX0KSC5sSi5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IbSh0aGlzLmEpfSwK
+RTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmIuJDEoSi5HQSh0aGlzLmEsYikpfX0KSC5VNS5wcm90
+b3R5cGU9ewpnbTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguU08oSi5JVCh0aGlzLmEpLHRoaXMuYix0
+aGlzLiR0aS5DKCJTTzwxPiIpKX19CkguU08ucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3ZhciBzLHIK
+Zm9yKHM9dGhpcy5hLHI9dGhpcy5iO3MuRigpOylpZihILm9UKHIuJDEocy5nbCgpKSkpcmV0dXJuITAK
+cmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuZ2woKX19CkguQU0ucHJvdG90eXBl
+PXsKZVI6ZnVuY3Rpb24oYSxiKXtQLlVJKGIsImNvdW50Iix0LlMpClAuazEoYiwiY291bnQiKQpyZXR1
+cm4gbmV3IEguQU0odGhpcy5hLHRoaXMuYitiLEguTGgodGhpcykuQygiQU08MT4iKSl9LApnbTpmdW5j
+dGlvbihhKXtyZXR1cm4gbmV3IEguVTEoSi5JVCh0aGlzLmEpLHRoaXMuYixILkxoKHRoaXMpLkMoIlUx
+PDE+IikpfX0KSC5kNS5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXt2YXIgcz1KLkhtKHRoaXMuYSkt
+dGhpcy5iCmlmKHM+PTApcmV0dXJuIHMKcmV0dXJuIDB9LAplUjpmdW5jdGlvbihhLGIpe1AuVUkoYiwi
+Y291bnQiLHQuUykKUC5rMShiLCJjb3VudCIpCnJldHVybiBuZXcgSC5kNSh0aGlzLmEsdGhpcy5iK2Is
+dGhpcy4kdGkpfSwKJGliUToxfQpILlUxLnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgcyxyCmZv
+cihzPXRoaXMuYSxyPTA7cjx0aGlzLmI7KytyKXMuRigpCnRoaXMuYj0wCnJldHVybiBzLkYoKX0sCmds
+OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5nbCgpfX0KSC5NQi5wcm90b3R5cGU9ewpnbTpmdW5jdGlv
+bihhKXtyZXR1cm4gQy5Hd30sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4hMH0sCmdBOmZ1bmN0aW9uKGEp
+e3JldHVybiAwfSwKRTpmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLlRFKGIsMCwwLCJpbmRleCIsbnVs
+bCkpfSwKZVI6ZnVuY3Rpb24oYSxiKXtQLmsxKGIsImNvdW50IikKcmV0dXJuIHRoaXN9fQpILkZ1LnBy
+b3RvdHlwZT17CkY6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sCmdsOmZ1bmN0aW9uKCl7dGhyb3cgSC5iKEgu
+V3AoKSl9LAokaUFuOjF9CkgudTYucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBI
+LkpCKEouSVQodGhpcy5hKSx0aGlzLiR0aS5DKCJKQjwxPiIpKX19CkguSkIucHJvdG90eXBlPXsKRjpm
+dW5jdGlvbigpe3ZhciBzLHIKZm9yKHM9dGhpcy5hLHI9dGhpcy4kdGkuYztzLkYoKTspaWYoci5iKHMu
+Z2woKSkpcmV0dXJuITAKcmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR0aS5jLmEo
+dGhpcy5hLmdsKCkpfSwKJGlBbjoxfQpILlNVLnByb3RvdHlwZT17fQpILlJlLnByb3RvdHlwZT17Clk6
+ZnVuY3Rpb24oYSxiLGMpe0guTGgodGhpcykuQygiUmUuRSIpLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNh
+bm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKSl9fQpILncyLnByb3RvdHlwZT17fQpILnd2
+LnByb3RvdHlwZT17CmdpTzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLl9oYXNoQ29kZQppZihzIT1udWxs
+KXJldHVybiBzCnM9NjY0NTk3KkouaGYodGhpcy5hKSY1MzY4NzA5MTEKdGhpcy5faGFzaENvZGU9cwpy
+ZXR1cm4gc30sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuJ1N5bWJvbCgiJytILkVqKHRoaXMuYSkrJyIpJ30s
+CkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIEgu
+d3YmJnRoaXMuYT09Yi5hfSwKJGlHRDoxfQpILlFDLnByb3RvdHlwZT17fQpILlBELnByb3RvdHlwZT17
+fQpILldVLnByb3RvdHlwZT17CmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09PTB9
+LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5PKHRoaXMpfSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9
+SC5MaCh0aGlzKQpzLmMuYShiKQpzLlFbMV0uYShjKQpILmRjKCkKSC5CaSh1LmcpfSwKZ1B1OmZ1bmN0
+aW9uKGEpe3JldHVybiB0aGlzLnE0KGEsSC5MaCh0aGlzKS5DKCJOMzwxLDI+IikpfSwKcTQ6ZnVuY3Rp
+b24oYSxiKXt2YXIgcz10aGlzCnJldHVybiBQLmwwKGZ1bmN0aW9uKCl7dmFyIHI9YQp2YXIgcT0wLHA9
+MSxvLG4sbSxsLGsKcmV0dXJuIGZ1bmN0aW9uICRhc3luYyRnUHUoYyxkKXtpZihjPT09MSl7bz1kCnE9
+cH13aGlsZSh0cnVlKXN3aXRjaChxKXtjYXNlIDA6bj1zLmdWKCksbj1uLmdtKG4pLG09SC5MaChzKSxt
+PW0uQygiQDwxPiIpLktxKG0uUVsxXSkuQygiTjM8MSwyPiIpCmNhc2UgMjppZighbi5GKCkpe3E9Mwpi
+cmVha31sPW4uZ2woKQprPXMucSgwLGwpCmsudG9TdHJpbmcKcT00CnJldHVybiBuZXcgUC5OMyhsLGss
+bSkKY2FzZSA0OnE9MgpicmVhawpjYXNlIDM6cmV0dXJuIFAuVGgoKQpjYXNlIDE6cmV0dXJuIFAuWW0o
+byl9fX0sYil9LAokaVowOjF9CkguTFAucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRo
+aXMuYX0sCng0OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4hMQppZigiX19w
+cm90b19fIj09PWEpcmV0dXJuITEKcmV0dXJuIHRoaXMuYi5oYXNPd25Qcm9wZXJ0eShhKX0sCnE6ZnVu
+Y3Rpb24oYSxiKXtpZighdGhpcy54NChiKSlyZXR1cm4gbnVsbApyZXR1cm4gdGhpcy5xUChiKX0sCnFQ
+OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJbSC5oKGEpXX0sCks6ZnVuY3Rpb24oYSxiKXt2YXIgcyxy
+LHEscCxvPUguTGgodGhpcykKby5DKCJ+KDEsMikiKS5hKGIpCnM9dGhpcy5jCmZvcihyPXMubGVuZ3Ro
+LG89by5RWzFdLHE9MDtxPHI7KytxKXtwPXNbcV0KYi4kMihwLG8uYSh0aGlzLnFQKHApKSl9fSwKZ1Y6
+ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEguWFIodGhpcyxILkxoKHRoaXMpLkMoIlhSPDE+IikpfX0KSC5Y
+Ui5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEuYwpyZXR1cm4gbmV3IEoubTEo
+cyxzLmxlbmd0aCxILnQ2KHMpLkMoIm0xPDE+IikpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
+YS5jLmxlbmd0aH19CkguTEkucHJvdG90eXBlPXsKZ1dhOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5hCnJl
+dHVybiBzfSwKZ25kOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbz10aGlzCmlmKG8uYz09PTEpcmV0dXJu
+IEMuaFUKcz1vLmQKcj1zLmxlbmd0aC1vLmUubGVuZ3RoLW8uZgppZihyPT09MClyZXR1cm4gQy5oVQpx
+PVtdCmZvcihwPTA7cDxyOysrcCl7aWYocD49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxwKQpxLnB1c2go
+c1twXSl9cmV0dXJuIEouekMocSl9LApnVm06ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9
+dGhpcwppZihrLmMhPT0wKXJldHVybiBDLldPCnM9ay5lCnI9cy5sZW5ndGgKcT1rLmQKcD1xLmxlbmd0
+aC1yLWsuZgppZihyPT09MClyZXR1cm4gQy5XTwpvPW5ldyBILk41KHQuZW8pCmZvcihuPTA7bjxyOysr
+bil7aWYobj49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxuKQptPXNbbl0KbD1wK24KaWYobDwwfHxsPj1x
+Lmxlbmd0aClyZXR1cm4gSC5PSChxLGwpCm8uWSgwLG5ldyBILnd2KG0pLHFbbF0pfXJldHVybiBuZXcg
+SC5QRChvLHQuZ0YpfSwKJGl2UToxfQpILkNqLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFy
+IHMKSC5oKGEpCnM9dGhpcy5hCnMuYj1zLmIrIiQiK0guRWooYSkKQy5ObS5pKHRoaXMuYixhKQpDLk5t
+LmkodGhpcy5jLGIpOysrcy5hfSwKJFM6MTN9CkguZjkucHJvdG90eXBlPXsKcVM6ZnVuY3Rpb24oYSl7
+dmFyIHMscixxPXRoaXMscD1uZXcgUmVnRXhwKHEuYSkuZXhlYyhhKQppZihwPT1udWxsKXJldHVybiBu
+dWxsCnM9T2JqZWN0LmNyZWF0ZShudWxsKQpyPXEuYgppZihyIT09LTEpcy5hcmd1bWVudHM9cFtyKzFd
+CnI9cS5jCmlmKHIhPT0tMSlzLmFyZ3VtZW50c0V4cHI9cFtyKzFdCnI9cS5kCmlmKHIhPT0tMSlzLmV4
+cHI9cFtyKzFdCnI9cS5lCmlmKHIhPT0tMSlzLm1ldGhvZD1wW3IrMV0Kcj1xLmYKaWYociE9PS0xKXMu
+cmVjZWl2ZXI9cFtyKzFdCnJldHVybiBzfX0KSC5XMC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3Zh
+ciBzPXRoaXMuYgppZihzPT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIitILkVqKHRoaXMu
+YSkKcmV0dXJuIk5vU3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIitzKyInIG9uIG51
+bGwifX0KSC5hei5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcyxxPSJOb1N1Y2hN
+ZXRob2RFcnJvcjogbWV0aG9kIG5vdCBmb3VuZDogJyIscD1yLmIKaWYocD09bnVsbClyZXR1cm4iTm9T
+dWNoTWV0aG9kRXJyb3I6ICIrSC5FaihyLmEpCnM9ci5jCmlmKHM9PW51bGwpcmV0dXJuIHErcCsiJyAo
+IitILkVqKHIuYSkrIikiCnJldHVybiBxK3ArIicgb24gJyIrcysiJyAoIitILkVqKHIuYSkrIikifX0K
+SC52Vi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4gcy5sZW5ndGg9
+PT0wPyJFcnJvciI6IkVycm9yOiAiK3N9fQpILnRlLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0
+dXJuIlRocm93IG9mIG51bGwgKCciKyh0aGlzLmE9PT1udWxsPyJudWxsIjoidW5kZWZpbmVkIikrIicg
+ZnJvbSBKYXZhU2NyaXB0KSJ9LAokaVJ6OjF9CkguYnEucHJvdG90eXBlPXt9CkguWE8ucHJvdG90eXBl
+PXsKdzpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMuYgppZihyIT1udWxsKXJldHVybiByCnI9dGhpcy5h
+CnM9ciE9PW51bGwmJnR5cGVvZiByPT09Im9iamVjdCI/ci5zdGFjazpudWxsCnJldHVybiB0aGlzLmI9
+cz09bnVsbD8iIjpzfSwKJGlHejoxfQpILlRwLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9
+dGhpcy5jb25zdHJ1Y3RvcixyPXM9PW51bGw/bnVsbDpzLm5hbWUKcmV0dXJuIkNsb3N1cmUgJyIrSC5O
+UShyPT1udWxsPyJ1bmtub3duIjpyKSsiJyJ9LAokaUVIOjEsCmdLdTpmdW5jdGlvbigpe3JldHVybiB0
+aGlzfSwKJEM6IiQxIiwKJFI6MSwKJEQ6bnVsbH0KSC5sYy5wcm90b3R5cGU9e30KSC56eC5wcm90b3R5
+cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuJHN0YXRpY19uYW1lCmlmKHM9PW51bGwpcmV0dXJu
+IkNsb3N1cmUgb2YgdW5rbm93biBzdGF0aWMgbWV0aG9kIgpyZXR1cm4iQ2xvc3VyZSAnIitILk5RKHMp
+KyInIn19CkguclQucHJvdG90eXBlPXsKRE46ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzCmlmKGI9PW51
+bGwpcmV0dXJuITEKaWYocz09PWIpcmV0dXJuITAKaWYoIShiIGluc3RhbmNlb2YgSC5yVCkpcmV0dXJu
+ITEKcmV0dXJuIHMuYT09PWIuYSYmcy5iPT09Yi5iJiZzLmM9PT1iLmN9LApnaU86ZnVuY3Rpb24oYSl7
+dmFyIHMscj10aGlzLmMKaWYocj09bnVsbClzPUguZVEodGhpcy5hKQplbHNlIHM9dHlwZW9mIHIhPT0i
+b2JqZWN0Ij9KLmhmKHIpOkguZVEocikKcj1ILmVRKHRoaXMuYikKaWYodHlwZW9mIHMhPT0ibnVtYmVy
+IilyZXR1cm4gcy53TygpCnJldHVybihzXnIpPj4+MH0sCnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5j
+CmlmKHM9PW51bGwpcz10aGlzLmEKcmV0dXJuIkNsb3N1cmUgJyIrSC5Faih0aGlzLmQpKyInIG9mICIr
+KCJJbnN0YW5jZSBvZiAnIitILkVqKEguTShzKSkrIiciKX19CkguRXEucHJvdG90eXBlPXsKdzpmdW5j
+dGlvbihhKXtyZXR1cm4iUnVudGltZUVycm9yOiAiK3RoaXMuYX19Ckgua1kucHJvdG90eXBlPXsKdzpm
+dW5jdGlvbihhKXtyZXR1cm4iQXNzZXJ0aW9uIGZhaWxlZDogIitQLmhsKHRoaXMuYSl9fQpILmtyLnBy
+b3RvdHlwZT17fQpILk41LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LApn
+bDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYT09PTB9LApnVjpmdW5jdGlvbigpe3JldHVybiBuZXcg
+SC5pNSh0aGlzLEguTGgodGhpcykuQygiaTU8MT4iKSl9LAp4NDpmdW5jdGlvbihhKXt2YXIgcyxyCmlm
+KHR5cGVvZiBhPT0ic3RyaW5nIil7cz10aGlzLmIKaWYocz09bnVsbClyZXR1cm4hMQpyZXR1cm4gdGhp
+cy5YdShzLGEpfWVsc2V7cj10aGlzLkNYKGEpCnJldHVybiByfX0sCkNYOmZ1bmN0aW9uKGEpe3ZhciBz
+PXRoaXMuZAppZihzPT1udWxsKXJldHVybiExCnJldHVybiB0aGlzLkZoKHRoaXMuQnQocyxKLmhmKGEp
+JjB4M2ZmZmZmZiksYSk+PTB9LApxOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbz10aGlzLG49bnVs
+bAppZih0eXBlb2YgYj09InN0cmluZyIpe3M9by5iCmlmKHM9PW51bGwpcmV0dXJuIG4Kcj1vLmoyKHMs
+YikKcT1yPT1udWxsP246ci5iCnJldHVybiBxfWVsc2UgaWYodHlwZW9mIGI9PSJudW1iZXIiJiYoYiYw
+eDNmZmZmZmYpPT09Yil7cD1vLmMKaWYocD09bnVsbClyZXR1cm4gbgpyPW8uajIocCxiKQpxPXI9PW51
+bGw/bjpyLmIKcmV0dXJuIHF9ZWxzZSByZXR1cm4gby5hYShiKX0sCmFhOmZ1bmN0aW9uKGEpe3ZhciBz
+LHIscT10aGlzLmQKaWYocT09bnVsbClyZXR1cm4gbnVsbApzPXRoaXMuQnQocSxKLmhmKGEpJjB4M2Zm
+ZmZmZikKcj10aGlzLkZoKHMsYSkKaWYocjwwKXJldHVybiBudWxsCnJldHVybiBzW3JdLmJ9LApZOmZ1
+bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9SC5MaChtKQpsLmMuYShiKQpsLlFb
+MV0uYShjKQppZih0eXBlb2YgYj09InN0cmluZyIpe3M9bS5iCm0uRUgocz09bnVsbD9tLmI9bS56Sygp
+OnMsYixjKX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMHgzZmZmZmZmKT09PWIpe3I9bS5j
+Cm0uRUgocj09bnVsbD9tLmM9bS56SygpOnIsYixjKX1lbHNle3E9bS5kCmlmKHE9PW51bGwpcT1tLmQ9
+bS56SygpCnA9Si5oZihiKSYweDNmZmZmZmYKbz1tLkJ0KHEscCkKaWYobz09bnVsbCltLkVJKHEscCxb
+bS5IbihiLGMpXSkKZWxzZXtuPW0uRmgobyxiKQppZihuPj0wKW9bbl0uYj1jCmVsc2Ugby5wdXNoKG0u
+SG4oYixjKSl9fX0sCks6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9dGhpcwpILkxoKHEpLkMoIn4oMSwy
+KSIpLmEoYikKcz1xLmUKcj1xLnIKZm9yKDtzIT1udWxsOyl7Yi4kMihzLmEscy5iKQppZihyIT09cS5y
+KXRocm93IEguYihQLmE0KHEpKQpzPXMuY319LApFSDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscj10aGlz
+LHE9SC5MaChyKQpxLmMuYShiKQpxLlFbMV0uYShjKQpzPXIuajIoYSxiKQppZihzPT1udWxsKXIuRUko
+YSxiLHIuSG4oYixjKSkKZWxzZSBzLmI9Y30sCmtzOmZ1bmN0aW9uKCl7dGhpcy5yPXRoaXMucisxJjY3
+MTA4ODYzfSwKSG46ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLHI9SC5MaChzKSxxPW5ldyBILnZoKHIu
+Yy5hKGEpLHIuUVsxXS5hKGIpKQppZihzLmU9PW51bGwpcy5lPXMuZj1xCmVsc2V7cj1zLmYKci50b1N0
+cmluZwpxLmQ9cgpzLmY9ci5jPXF9KytzLmEKcy5rcygpCnJldHVybiBxfSwKRmg6ZnVuY3Rpb24oYSxi
+KXt2YXIgcyxyCmlmKGE9PW51bGwpcmV0dXJuLTEKcz1hLmxlbmd0aApmb3Iocj0wO3I8czsrK3IpaWYo
+Si5STShhW3JdLmEsYikpcmV0dXJuIHIKcmV0dXJuLTF9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5P
+KHRoaXMpfSwKajI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVtiXX0sCkJ0OmZ1bmN0aW9uKGEsYil7cmV0
+dXJuIGFbYl19LApFSTpmdW5jdGlvbihhLGIsYyl7YVtiXT1jfSwKcm46ZnVuY3Rpb24oYSxiKXtkZWxl
+dGUgYVtiXX0sClh1OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuajIoYSxiKSE9bnVsbH0sCnpLOmZ1
+bmN0aW9uKCl7dmFyIHM9Ijxub24taWRlbnRpZmllci1rZXk+IixyPU9iamVjdC5jcmVhdGUobnVsbCkK
+dGhpcy5FSShyLHMscikKdGhpcy5ybihyLHMpCnJldHVybiByfSwKJGlGbzoxfQpILnZoLnByb3RvdHlw
+ZT17fQpILmk1LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuYX0sCmdsMDpm
+dW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmE9PT0wfSwKZ206ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5h
+LHI9bmV3IEguTjYocyxzLnIsdGhpcy4kdGkuQygiTjY8MT4iKSkKci5jPXMuZQpyZXR1cm4gcn0sCnRn
+OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS54NChiKX19CkguTjYucHJvdG90eXBlPXsKZ2w6ZnVu
+Y3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPXIuYQppZihy
+LmIhPT1xLnIpdGhyb3cgSC5iKFAuYTQocSkpCnM9ci5jCmlmKHM9PW51bGwpe3Iuc3FZKG51bGwpCnJl
+dHVybiExfWVsc2V7ci5zcVkocy5hKQpyLmM9cy5jCnJldHVybiEwfX0sCnNxWTpmdW5jdGlvbihhKXt0
+aGlzLmQ9dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpILmRDLnByb3RvdHlwZT17CiQxOmZ1
+bmN0aW9uKGEpe3JldHVybiB0aGlzLmEoYSl9LAokUzo0fQpILndOLnByb3RvdHlwZT17CiQyOmZ1bmN0
+aW9uKGEsYil7cmV0dXJuIHRoaXMuYShhLGIpfSwKJFM6NDJ9CkguVlgucHJvdG90eXBlPXsKJDE6ZnVu
+Y3Rpb24oYSl7cmV0dXJuIHRoaXMuYShILmgoYSkpfSwKJFM6MzV9CkguVlIucHJvdG90eXBlPXsKdzpm
+dW5jdGlvbihhKXtyZXR1cm4iUmVnRXhwLyIrdGhpcy5hKyIvIit0aGlzLmIuZmxhZ3N9LApnSGM6ZnVu
+Y3Rpb24oKXt2YXIgcz10aGlzLHI9cy5jCmlmKHIhPW51bGwpcmV0dXJuIHIKcj1zLmIKcmV0dXJuIHMu
+Yz1ILnY0KHMuYSxyLm11bHRpbGluZSwhci5pZ25vcmVDYXNlLHIudW5pY29kZSxyLmRvdEFsbCwhMCl9
+LApkZDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5LVyh0aGlzLGIsMCl9LApVWjpmdW5jdGlvbihh
+LGIpe3ZhciBzLHI9dGhpcy5nSGMoKQpyLmxhc3RJbmRleD1iCnM9ci5leGVjKGEpCmlmKHM9PW51bGwp
+cmV0dXJuIG51bGwKcmV0dXJuIG5ldyBILkVLKHMpfSwKJGl2WDoxLAokaXdMOjF9CkguRUsucHJvdG90
+eXBlPXsKcTpmdW5jdGlvbihhLGIpe3ZhciBzCkgudVAoYikKcz10aGlzLmIKaWYoYj49cy5sZW5ndGgp
+cmV0dXJuIEguT0gocyxiKQpyZXR1cm4gc1tiXX0sCiRpT2Q6MSwKJGlpYjoxfQpILktXLnByb3RvdHlw
+ZT17CmdtOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5QYih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9fQpI
+LlBiLnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCkY6ZnVuY3Rpb24oKXt2
+YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9bS5iCmlmKGw9PW51bGwpcmV0dXJuITEKcz1tLmMKcj1sLmxl
+bmd0aAppZihzPD1yKXtxPW0uYQpwPXEuVVoobCxzKQppZihwIT1udWxsKXttLmQ9cApzPXAuYgpvPXMu
+aW5kZXgKbj1vK3NbMF0ubGVuZ3RoCmlmKG89PT1uKXtpZihxLmIudW5pY29kZSl7cz1tLmMKcT1zKzEK
+aWYocTxyKXtzPUMueEIuTzIobCxzKQppZihzPj01NTI5NiYmczw9NTYzMTkpe3M9Qy54Qi5PMihsLHEp
+CnM9cz49NTYzMjAmJnM8PTU3MzQzfWVsc2Ugcz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSExCm49KHM/bisx
+Om4pKzF9bS5jPW4KcmV0dXJuITB9fW0uYj1tLmQ9bnVsbApyZXR1cm4hMX0sCiRpQW46MX0KSC50US5w
+cm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC51UChiKQppZihiIT09MClILnYoUC5PNyhiLG51bGwp
+KQpyZXR1cm4gdGhpcy5jfSwKJGlPZDoxfQpILnVuLnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBuZXcgSC5TZCh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9fQpILlNkLnByb3RvdHlwZT17CkY6ZnVu
+Y3Rpb24oKXt2YXIgcyxyLHE9dGhpcyxwPXEuYyxvPXEuYixuPW8ubGVuZ3RoLG09cS5hLGw9bS5sZW5n
+dGgKaWYocCtuPmwpe3EuZD1udWxsCnJldHVybiExfXM9bS5pbmRleE9mKG8scCkKaWYoczwwKXtxLmM9
+bCsxCnEuZD1udWxsCnJldHVybiExfXI9cytuCnEuZD1uZXcgSC50UShzLG8pCnEuYz1yPT09cS5jP3Ir
+MTpyCnJldHVybiEwfSwKZ2w6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLmQKcy50b1N0cmluZwpyZXR1cm4g
+c30sCiRpQW46MX0KSC5FVC5wcm90b3R5cGU9eyRpRVQ6MSwkaUFTOjF9CkguWEgucHJvdG90eXBlPXsK
+Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKJGlYajoxfQpILkRnLnByb3RvdHlwZT17CnE6
+ZnVuY3Rpb24oYSxiKXtILnVQKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX0sClk6ZnVu
+Y3Rpb24oYSxiLGMpe0guR0goYykKSC5vZChiLGEsYS5sZW5ndGgpCmFbYl09Y30sCiRpYlE6MSwKJGlj
+WDoxLAokaXpNOjF9CkguUGcucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7SC51UChjKQpILm9k
+KGIsYSxhLmxlbmd0aCkKYVtiXT1jfSwKJGliUToxLAokaWNYOjEsCiRpek06MX0KSC54ai5wcm90b3R5
+cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC51UChiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19
+fQpILmRFLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCkgub2QoYixhLGEubGVuZ3Ro
+KQpyZXR1cm4gYVtiXX19CkguWkEucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0gudVAoYikKSC5v
+ZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5kVC5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEs
+Yil7SC51UChiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILlBxLnByb3RvdHlwZT17
+CnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19Ckgu
+ZUUucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihh
+LGIpe0gudVAoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5WNi5wcm90b3R5cGU9
+ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC51UChiKQpI
+Lm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19LAokaVY2OjEsCiRpbjY6MX0KSC5SRy5wcm90b3R5
+cGU9e30KSC5WUC5wcm90b3R5cGU9e30KSC5XQi5wcm90b3R5cGU9e30KSC5aRy5wcm90b3R5cGU9e30K
+SC5KYy5wcm90b3R5cGU9ewpDOmZ1bmN0aW9uKGEpe3JldHVybiBILmNFKHYudHlwZVVuaXZlcnNlLHRo
+aXMsYSl9LApLcTpmdW5jdGlvbihhKXtyZXR1cm4gSC52NSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfX0K
+SC5HLnByb3RvdHlwZT17fQpILmtTLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
+YX19CkguaU0ucHJvdG90eXBlPXt9ClAudGgucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9
+dGhpcy5hLHI9cy5hCnMuYT1udWxsCnIuJDAoKX0sCiRTOjl9ClAuaGEucHJvdG90eXBlPXsKJDE6ZnVu
+Y3Rpb24oYSl7dmFyIHMscgp0aGlzLmEuYT10Lk0uYShhKQpzPXRoaXMuYgpyPXRoaXMuYwpzLmZpcnN0
+Q2hpbGQ/cy5yZW1vdmVDaGlsZChyKTpzLmFwcGVuZENoaWxkKHIpfSwKJFM6NTN9ClAuVnMucHJvdG90
+eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuJDAoKX0sCiRDOiIkMCIsCiRSOjAsCiRTOjF9ClAuRnQu
+cHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuJDAoKX0sCiRDOiIkMCIsCiRSOjAsCiRTOjF9
+ClAuVzMucHJvdG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSxiKXtpZihzZWxmLnNldFRpbWVvdXQhPW51bGwp
+c2VsZi5zZXRUaW1lb3V0KEgudFIobmV3IFAueUgodGhpcyxiKSwwKSxhKQplbHNlIHRocm93IEguYihQ
+Lkw0KCJgc2V0VGltZW91dCgpYCBub3QgZm91bmQuIikpfX0KUC55SC5wcm90b3R5cGU9ewokMDpmdW5j
+dGlvbigpe3RoaXMuYi4kMCgpfSwKJEM6IiQwIiwKJFI6MCwKJFM6MH0KUC5paC5wcm90b3R5cGU9ewph
+TTpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcyxxPXIuJHRpCnEuQygiMS8/IikuYShiKQppZighci5i
+KXIuYS5YZihiKQplbHNle3M9ci5hCmlmKHEuQygiYjg8MT4iKS5iKGIpKXMuY1UoYikKZWxzZSBzLlgy
+KHEuYy5hKGIpKX19LAp3MDpmdW5jdGlvbihhLGIpe3ZhciBzCmlmKGI9PW51bGwpYj1QLnYwKGEpCnM9
+dGhpcy5hCmlmKHRoaXMuYilzLlpMKGEsYikKZWxzZSBzLk5rKGEsYil9fQpQLldNLnByb3RvdHlwZT17
+CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuJDIoMCxhKX0sCiRTOjQ3fQpQLlNYLnByb3RvdHlw
+ZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLiQyKDEsbmV3IEguYnEoYSx0LmwuYShiKSkpfSwKJEM6
+IiQyIiwKJFI6MiwKJFM6Mjd9ClAuR3MucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEo
+SC51UChhKSxiKX0sCiRTOjI1fQpQLkZ5LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkl0
+ZXJhdGlvbk1hcmtlcigiK3RoaXMuYisiLCAiK0guRWoodGhpcy5hKSsiKSJ9fQpQLkdWLnByb3RvdHlw
+ZT17CmdsOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5jCmlmKHM9PW51bGwpcmV0dXJuIHRoaXMuJHRpLmMu
+YSh0aGlzLmIpCnJldHVybiBzLmdsKCl9LApGOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbyxuLG09dGhp
+cwpmb3Iocz1tLiR0aS5DKCJBbjwxPiIpOyEwOyl7cj1tLmMKaWYociE9bnVsbClpZihyLkYoKSlyZXR1
+cm4hMAplbHNlIG0uc1g5KG51bGwpCnE9ZnVuY3Rpb24oYSxiLGMpe3ZhciBsLGs9Ygp3aGlsZSh0cnVl
+KXRyeXtyZXR1cm4gYShrLGwpfWNhdGNoKGope2w9agprPWN9fShtLmEsMCwxKQppZihxIGluc3RhbmNl
+b2YgUC5GeSl7cD1xLmIKaWYocD09PTIpe289bS5kCmlmKG89PW51bGx8fG8ubGVuZ3RoPT09MCl7bS5z
+RUMobnVsbCkKcmV0dXJuITF9aWYoMD49by5sZW5ndGgpcmV0dXJuIEguT0gobywtMSkKbS5hPW8ucG9w
+KCkKY29udGludWV9ZWxzZXtyPXEuYQppZihwPT09Myl0aHJvdyByCmVsc2V7bj1zLmEoSi5JVChyKSkK
+aWYobiBpbnN0YW5jZW9mIFAuR1Ype3I9bS5kCmlmKHI9PW51bGwpcj1tLmQ9W10KQy5ObS5pKHIsbS5h
+KQptLmE9bi5hCmNvbnRpbnVlfWVsc2V7bS5zWDkobikKY29udGludWV9fX19ZWxzZXttLnNFQyhxKQpy
+ZXR1cm4hMH19cmV0dXJuITF9LApzRUM6ZnVuY3Rpb24oYSl7dGhpcy5iPXRoaXMuJHRpLkMoIjE/Iiku
+YShhKX0sCnNYOTpmdW5jdGlvbihhKXt0aGlzLmM9dGhpcy4kdGkuQygiQW48MT4/IikuYShhKX0sCiRp
+QW46MX0KUC5xNC5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuR1YodGhpcy5h
+KCksdGhpcy4kdGkuQygiR1Y8MT4iKSl9fQpQLlBmLnByb3RvdHlwZT17CncwOmZ1bmN0aW9uKGEsYil7
+dmFyIHMKUC5VSShhLCJlcnJvciIsdC5LKQpzPXRoaXMuYQppZihzLmEhPT0wKXRocm93IEguYihQLlBW
+KCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKaWYoYj09bnVsbCliPVAudjAoYSkKcy5OayhhLGIp
+fSwKcG06ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudzAoYSxudWxsKX19ClAuWmYucHJvdG90eXBlPXsK
+YU06ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRoaXMuJHRpCnIuQygiMS8/IikuYShiKQpzPXRoaXMuYQpp
+ZihzLmEhPT0wKXRocm93IEguYihQLlBWKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKcy5YZihy
+LkMoIjEvIikuYShiKSl9fQpQLkZlLnByb3RvdHlwZT17CkhSOmZ1bmN0aW9uKGEpe2lmKCh0aGlzLmMm
+MTUpIT09NilyZXR1cm4hMApyZXR1cm4gdGhpcy5iLmIuYnYodC5hbC5hKHRoaXMuZCksYS5hLHQueSx0
+LkspfSwKS3c6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5lLHI9dC56LHE9dC5LLHA9dGhpcy4kdGkuQygi
+Mi8iKSxvPXRoaXMuYi5iCmlmKHQuYWcuYihzKSlyZXR1cm4gcC5hKG8ucnAocyxhLmEsYS5iLHIscSx0
+LmwpKQplbHNlIHJldHVybiBwLmEoby5idih0LmJJLmEocyksYS5hLHIscSkpfX0KUC52cy5wcm90b3R5
+cGU9ewpTcTpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHA9dGhpcy4kdGkKcC5LcShjKS5DKCIxLygy
+KSIpLmEoYSkKcz0kLlgzCmlmKHMhPT1DLk5VKXtjLkMoIkA8MC8+IikuS3EocC5jKS5DKCIxKDIpIiku
+YShhKQppZihiIT1udWxsKWI9UC5WSChiLHMpfXI9bmV3IFAudnMocyxjLkMoInZzPDA+IikpCnE9Yj09
+bnVsbD8xOjMKdGhpcy54ZihuZXcgUC5GZShyLHEsYSxiLHAuQygiQDwxPiIpLktxKGMpLkMoIkZlPDEs
+Mj4iKSkpCnJldHVybiByfSwKVzc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5TcShhLG51bGwsYil9
+LApRZDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscj10aGlzLiR0aQpyLktxKGMpLkMoIjEvKDIpIikuYShh
+KQpzPW5ldyBQLnZzKCQuWDMsYy5DKCJ2czwwPiIpKQp0aGlzLnhmKG5ldyBQLkZlKHMsMTksYSxiLHIu
+QygiQDwxPiIpLktxKGMpLkMoIkZlPDEsMj4iKSkpCnJldHVybiBzfSwKeGY6ZnVuY3Rpb24oYSl7dmFy
+IHMscj10aGlzLHE9ci5hCmlmKHE8PTEpe2EuYT10LkYuYShyLmMpCnIuYz1hfWVsc2V7aWYocT09PTIp
+e3M9dC5jLmEoci5jKQpxPXMuYQppZihxPDQpe3MueGYoYSkKcmV0dXJufXIuYT1xCnIuYz1zLmN9UC5U
+ayhudWxsLG51bGwsci5iLHQuTS5hKG5ldyBQLmRhKHIsYSkpKX19LApqUTpmdW5jdGlvbihhKXt2YXIg
+cyxyLHEscCxvLG4sbT10aGlzLGw9e30KbC5hPWEKaWYoYT09bnVsbClyZXR1cm4Kcz1tLmEKaWYoczw9
+MSl7cj10LkYuYShtLmMpCm0uYz1hCmlmKHIhPW51bGwpe3E9YS5hCmZvcihwPWE7cSE9bnVsbDtwPXEs
+cT1vKW89cS5hCnAuYT1yfX1lbHNle2lmKHM9PT0yKXtuPXQuYy5hKG0uYykKcz1uLmEKaWYoczw0KXtu
+LmpRKGEpCnJldHVybn1tLmE9cwptLmM9bi5jfWwuYT1tLk44KGEpClAuVGsobnVsbCxudWxsLG0uYix0
+Lk0uYShuZXcgUC5vUShsLG0pKSl9fSwKYWg6ZnVuY3Rpb24oKXt2YXIgcz10LkYuYSh0aGlzLmMpCnRo
+aXMuYz1udWxsCnJldHVybiB0aGlzLk44KHMpfSwKTjg6ZnVuY3Rpb24oYSl7dmFyIHMscixxCmZvcihz
+PWEscj1udWxsO3MhPW51bGw7cj1zLHM9cSl7cT1zLmEKcy5hPXJ9cmV0dXJuIHJ9LApISDpmdW5jdGlv
+bihhKXt2YXIgcyxyPXRoaXMscT1yLiR0aQpxLkMoIjEvIikuYShhKQppZihxLkMoImI4PDE+IikuYihh
+KSlpZihxLmIoYSkpUC5BOShhLHIpCmVsc2UgUC5rMyhhLHIpCmVsc2V7cz1yLmFoKCkKcS5jLmEoYSkK
+ci5hPTQKci5jPWEKUC5IWihyLHMpfX0sClgyOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcwpyLiR0aS5j
+LmEoYSkKcz1yLmFoKCkKci5hPTQKci5jPWEKUC5IWihyLHMpfSwKWkw6ZnVuY3Rpb24oYSxiKXt2YXIg
+cyxyLHE9dGhpcwp0LmwuYShiKQpzPXEuYWgoKQpyPVAuVGwoYSxiKQpxLmE9OApxLmM9cgpQLkhaKHEs
+cyl9LApYZjpmdW5jdGlvbihhKXt2YXIgcz10aGlzLiR0aQpzLkMoIjEvIikuYShhKQppZihzLkMoImI4
+PDE+IikuYihhKSl7dGhpcy5jVShhKQpyZXR1cm59dGhpcy53VShzLmMuYShhKSl9LAp3VTpmdW5jdGlv
+bihhKXt2YXIgcz10aGlzCnMuJHRpLmMuYShhKQpzLmE9MQpQLlRrKG51bGwsbnVsbCxzLmIsdC5NLmEo
+bmV3IFAucnQocyxhKSkpfSwKY1U6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPXMuJHRpCnIuQygiYjg8
+MT4iKS5hKGEpCmlmKHIuYihhKSl7aWYoYS5hPT09OCl7cy5hPTEKUC5UayhudWxsLG51bGwscy5iLHQu
+TS5hKG5ldyBQLktGKHMsYSkpKX1lbHNlIFAuQTkoYSxzKQpyZXR1cm59UC5rMyhhLHMpfSwKTms6ZnVu
+Y3Rpb24oYSxiKXt0aGlzLmE9MQpQLlRrKG51bGwsbnVsbCx0aGlzLmIsdC5NLmEobmV3IFAuWkwodGhp
+cyxhLGIpKSl9LAokaWI4OjF9ClAuZGEucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkhaKHRoaXMu
+YSx0aGlzLmIpfSwKJFM6MH0KUC5vUS5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe1AuSFoodGhpcy5i
+LHRoaXMuYS5hKX0sCiRTOjB9ClAucFYucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9dGhp
+cy5hCnMuYT0wCnMuSEgoYSl9LAokUzo5fQpQLlU3LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7
+dGhpcy5hLlpMKGEsdC5sLmEoYikpfSwKJEM6IiQyIiwKJFI6MiwKJFM6MzB9ClAudnIucHJvdG90eXBl
+PXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuWkwodGhpcy5iLHRoaXMuYyl9LAokUzowfQpQLnJ0LnByb3Rv
+dHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLlgyKHRoaXMuYil9LAokUzowfQpQLktGLnByb3RvdHlw
+ZT17CiQwOmZ1bmN0aW9uKCl7UC5BOSh0aGlzLmIsdGhpcy5hKX0sCiRTOjB9ClAuWkwucHJvdG90eXBl
+PXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuWkwodGhpcy5iLHRoaXMuYyl9LAokUzowfQpQLlJULnByb3Rv
+dHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbyxuLG09dGhpcyxsPW51bGwKdHJ5e3E9bS5h
+LmEKbD1xLmIuYi56eih0LmZPLmEocS5kKSx0LnopfWNhdGNoKHApe3M9SC5SdShwKQpyPUgudHMocCkK
+aWYobS5jKXtxPXQubi5hKG0uYi5hLmMpLmEKbz1zCm89cT09bnVsbD9vPT1udWxsOnE9PT1vCnE9b31l
+bHNlIHE9ITEKbz1tLmEKaWYocSlvLmM9dC5uLmEobS5iLmEuYykKZWxzZSBvLmM9UC5UbChzLHIpCm8u
+Yj0hMApyZXR1cm59aWYobCBpbnN0YW5jZW9mIFAudnMmJmwuYT49NCl7aWYobC5hPT09OCl7cT1tLmEK
+cS5jPXQubi5hKGwuYykKcS5iPSEwfXJldHVybn1pZih0LmQuYihsKSl7bj1tLmIuYQpxPW0uYQpxLmM9
+bC5XNyhuZXcgUC5qWihuKSx0LnopCnEuYj0hMX19LAokUzowfQpQLmpaLnByb3RvdHlwZT17CiQxOmZ1
+bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LAokUzozM30KUC5ycS5wcm90b3R5cGU9ewokMDpmdW5jdGlv
+bigpe3ZhciBzLHIscSxwLG8sbixtLGwKdHJ5e3E9dGhpcy5hCnA9cS5hCm89cC4kdGkKbj1vLmMKbT1u
+LmEodGhpcy5iKQpxLmM9cC5iLmIuYnYoby5DKCIyLygxKSIpLmEocC5kKSxtLG8uQygiMi8iKSxuKX1j
+YXRjaChsKXtzPUguUnUobCkKcj1ILnRzKGwpCnE9dGhpcy5hCnEuYz1QLlRsKHMscikKcS5iPSEwfX0s
+CiRTOjB9ClAuUlcucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9
+dGhpcwp0cnl7cz10Lm4uYShrLmEuYS5jKQpwPWsuYgppZihILm9UKHAuYS5IUihzKSkmJnAuYS5lIT1u
+dWxsKXtwLmM9cC5hLkt3KHMpCnAuYj0hMX19Y2F0Y2gobyl7cj1ILlJ1KG8pCnE9SC50cyhvKQpwPXQu
+bi5hKGsuYS5hLmMpCm49cC5hCm09cgpsPWsuYgppZihuPT1udWxsP209PW51bGw6bj09PW0pbC5jPXAK
+ZWxzZSBsLmM9UC5UbChyLHEpCmwuYj0hMH19LAokUzowfQpQLk9NLnByb3RvdHlwZT17fQpQLnFoLnBy
+b3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT10aGlzLHA9e30sbz1uZXcgUC52cygkLlgz
+LHQuZkopCnAuYT0wCnM9SC5MaChxKQpyPXMuQygifigxKT8iKS5hKG5ldyBQLkI1KHAscSkpCnQuWi5h
+KG5ldyBQLnVPKHAsbykpClcuSkUocS5hLHEuYixyLCExLHMuYykKcmV0dXJuIG99fQpQLkI1LnByb3Rv
+dHlwZT17CiQxOmZ1bmN0aW9uKGEpe0guTGgodGhpcy5iKS5jLmEoYSk7Kyt0aGlzLmEuYX0sCiRTOmZ1
+bmN0aW9uKCl7cmV0dXJuIEguTGgodGhpcy5iKS5DKCJ+KDEpIil9fQpQLnVPLnByb3RvdHlwZT17CiQw
+OmZ1bmN0aW9uKCl7dGhpcy5iLkhIKHRoaXMuYS5hKX0sCiRTOjB9ClAuTU8ucHJvdG90eXBlPXt9ClAu
+a1QucHJvdG90eXBlPXt9ClAueEkucHJvdG90eXBlPXt9ClAuQ3cucHJvdG90eXBlPXsKdzpmdW5jdGlv
+bihhKXtyZXR1cm4gSC5Faih0aGlzLmEpfSwKJGlYUzoxLApnSUk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp
+cy5ifX0KUC5tMC5wcm90b3R5cGU9eyRpUW06MX0KUC5wSy5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigp
+e3ZhciBzPUguYih0aGlzLmEpCnMuc3RhY2s9Si5qKHRoaXMuYikKdGhyb3cgc30sCiRTOjB9ClAuSmku
+cHJvdG90eXBlPXsKYkg6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9bnVsbAp0Lk0uYShhKQp0cnl7aWYo
+Qy5OVT09PSQuWDMpe2EuJDAoKQpyZXR1cm59UC5UOChwLHAsdGhpcyxhLHQuSCl9Y2F0Y2gocSl7cz1I
+LlJ1KHEpCnI9SC50cyhxKQpQLkwyKHAscCx0aGlzLHMsdC5sLmEocikpfX0sCkRsOmZ1bmN0aW9uKGEs
+YixjKXt2YXIgcyxyLHEscD1udWxsCmMuQygifigwKSIpLmEoYSkKYy5hKGIpCnRyeXtpZihDLk5VPT09
+JC5YMyl7YS4kMShiKQpyZXR1cm59UC55dihwLHAsdGhpcyxhLGIsdC5ILGMpfWNhdGNoKHEpe3M9SC5S
+dShxKQpyPUgudHMocSkKUC5MMihwLHAsdGhpcyxzLHQubC5hKHIpKX19LApSVDpmdW5jdGlvbihhLGIp
+e3JldHVybiBuZXcgUC5oaih0aGlzLGIuQygiMCgpIikuYShhKSxiKX0sCkdZOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBuZXcgUC5WcCh0aGlzLHQuTS5hKGEpKX0sClB5OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQ
+Lk9SKHRoaXMsYi5DKCJ+KDApIikuYShhKSxiKX0sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbH0s
+Cnp6OmZ1bmN0aW9uKGEsYil7Yi5DKCIwKCkiKS5hKGEpCmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQw
+KCkKcmV0dXJuIFAuVDgobnVsbCxudWxsLHRoaXMsYSxiKX0sCmJ2OmZ1bmN0aW9uKGEsYixjLGQpe2Mu
+QygiQDwwPiIpLktxKGQpLkMoIjEoMikiKS5hKGEpCmQuYShiKQppZigkLlgzPT09Qy5OVSlyZXR1cm4g
+YS4kMShiKQpyZXR1cm4gUC55dihudWxsLG51bGwsdGhpcyxhLGIsYyxkKX0sCnJwOmZ1bmN0aW9uKGEs
+YixjLGQsZSxmKXtkLkMoIkA8MD4iKS5LcShlKS5LcShmKS5DKCIxKDIsMykiKS5hKGEpCmUuYShiKQpm
+LmEoYykKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEuJDIoYixjKQpyZXR1cm4gUC5ReChudWxsLG51bGws
+dGhpcyxhLGIsYyxkLGUsZil9LApMajpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYi5DKCJAPDA+Iiku
+S3EoYykuS3EoZCkuQygiMSgyLDMpIikuYShhKX19ClAuaGoucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24o
+KXtyZXR1cm4gdGhpcy5hLnp6KHRoaXMuYix0aGlzLmMpfSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp
+cy5jLkMoIjAoKSIpfX0KUC5WcC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEu
+YkgodGhpcy5iKX0sCiRTOjB9ClAuT1IucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9dGhp
+cy5jCnJldHVybiB0aGlzLmEuRGwodGhpcy5iLHMuYShhKSxzKX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJu
+IHRoaXMuYy5DKCJ+KDApIil9fQpQLmI2LnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEpe3ZhciBzPXRo
+aXMscj1uZXcgUC5sbShzLHMucixILkxoKHMpLkMoImxtPDE+IikpCnIuYz1zLmUKcmV0dXJuIHJ9LApn
+QTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmE9
+PT0wfSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEhPT0wfSwKdGc6ZnVuY3Rpb24oYSxiKXt2
+YXIgcyxyCmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXtzPXRoaXMuYgppZihz
+PT1udWxsKXJldHVybiExCnJldHVybiB0LmUuYShzW2JdKSE9bnVsbH1lbHNle3I9dGhpcy5QUihiKQpy
+ZXR1cm4gcn19LApQUjpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmQKaWYocz09bnVsbClyZXR1cm4hMQpy
+ZXR1cm4gdGhpcy5ERihzW3RoaXMuTihhKV0sYSk+PTB9LAppOmZ1bmN0aW9uKGEsYil7dmFyIHMscixx
+PXRoaXMKSC5MaChxKS5jLmEoYikKaWYodHlwZW9mIGI9PSJzdHJpbmciJiZiIT09Il9fcHJvdG9fXyIp
+e3M9cS5iCnJldHVybiBxLmJRKHM9PW51bGw/cS5iPVAuVDIoKTpzLGIpfWVsc2UgaWYodHlwZW9mIGI9
+PSJudW1iZXIiJiYoYiYxMDczNzQxODIzKT09PWIpe3I9cS5jCnJldHVybiBxLmJRKHI9PW51bGw/cS5j
+PVAuVDIoKTpyLGIpfWVsc2UgcmV0dXJuIHEuQjcoYil9LApCNzpmdW5jdGlvbihhKXt2YXIgcyxyLHEs
+cD10aGlzCkguTGgocCkuYy5hKGEpCnM9cC5kCmlmKHM9PW51bGwpcz1wLmQ9UC5UMigpCnI9cC5OKGEp
+CnE9c1tyXQppZihxPT1udWxsKXNbcl09W3AueW8oYSldCmVsc2V7aWYocC5ERihxLGEpPj0wKXJldHVy
+biExCnEucHVzaChwLnlvKGEpKX1yZXR1cm4hMH0sClI6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzCmlm
+KHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXJldHVybiBzLkwocy5iLGIpCmVsc2Ug
+aWYodHlwZW9mIGI9PSJudW1iZXIiJiYoYiYxMDczNzQxODIzKT09PWIpcmV0dXJuIHMuTChzLmMsYikK
+ZWxzZSByZXR1cm4gcy5xZyhiKX0sCnFnOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG89dGhpcyxuPW8u
+ZAppZihuPT1udWxsKXJldHVybiExCnM9by5OKGEpCnI9bltzXQpxPW8uREYocixhKQppZihxPDApcmV0
+dXJuITEKcD1yLnNwbGljZShxLDEpWzBdCmlmKDA9PT1yLmxlbmd0aClkZWxldGUgbltzXQpvLkdTKHAp
+CnJldHVybiEwfSwKYlE6ZnVuY3Rpb24oYSxiKXtILkxoKHRoaXMpLmMuYShiKQppZih0LmUuYShhW2Jd
+KSE9bnVsbClyZXR1cm4hMQphW2JdPXRoaXMueW8oYikKcmV0dXJuITB9LApMOmZ1bmN0aW9uKGEsYil7
+dmFyIHMKaWYoYT09bnVsbClyZXR1cm4hMQpzPXQuZS5hKGFbYl0pCmlmKHM9PW51bGwpcmV0dXJuITEK
+dGhpcy5HUyhzKQpkZWxldGUgYVtiXQpyZXR1cm4hMH0sClM6ZnVuY3Rpb24oKXt0aGlzLnI9dGhpcy5y
+KzEmMTA3Mzc0MTgyM30sCnlvOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcyxxPW5ldyBQLmJuKEguTGgo
+cikuYy5hKGEpKQppZihyLmU9PW51bGwpci5lPXIuZj1xCmVsc2V7cz1yLmYKcy50b1N0cmluZwpxLmM9
+cwpyLmY9cy5iPXF9KytyLmEKci5TKCkKcmV0dXJuIHF9LApHUzpmdW5jdGlvbihhKXt2YXIgcz10aGlz
+LHI9YS5jLHE9YS5iCmlmKHI9PW51bGwpcy5lPXEKZWxzZSByLmI9cQppZihxPT1udWxsKXMuZj1yCmVs
+c2UgcS5jPXI7LS1zLmEKcy5TKCl9LApOOmZ1bmN0aW9uKGEpe3JldHVybiBKLmhmKGEpJjEwNzM3NDE4
+MjN9LApERjpmdW5jdGlvbihhLGIpe3ZhciBzLHIKaWYoYT09bnVsbClyZXR1cm4tMQpzPWEubGVuZ3Ro
+CmZvcihyPTA7cjxzOysrcilpZihKLlJNKGFbcl0uYSxiKSlyZXR1cm4gcgpyZXR1cm4tMX19ClAuYm4u
+cHJvdG90eXBlPXt9ClAubG0ucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwK
+RjpmdW5jdGlvbigpe3ZhciBzPXRoaXMscj1zLmMscT1zLmEKaWYocy5iIT09cS5yKXRocm93IEguYihQ
+LmE0KHEpKQplbHNlIGlmKHI9PW51bGwpe3Muc2oobnVsbCkKcmV0dXJuITF9ZWxzZXtzLnNqKHMuJHRp
+LkMoIjE/IikuYShyLmEpKQpzLmM9ci5iCnJldHVybiEwfX0sCnNqOmZ1bmN0aW9uKGEpe3RoaXMuZD10
+aGlzLiR0aS5DKCIxPyIpLmEoYSl9LAokaUFuOjF9ClAubVcucHJvdG90eXBlPXt9ClAudXkucHJvdG90
+eXBlPXskaWJROjEsJGljWDoxLCRpek06MX0KUC5sRC5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXty
+ZXR1cm4gbmV3IEguYTcoYSx0aGlzLmdBKGEpLEgueihhKS5DKCJhNzxsRC5FPiIpKX0sCkU6ZnVuY3Rp
+b24oYSxiKXtyZXR1cm4gdGhpcy5xKGEsYil9LApLOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpILnooYSku
+QygifihsRC5FKSIpLmEoYikKcz10aGlzLmdBKGEpCmZvcihyPTA7cjxzOysrcil7Yi4kMSh0aGlzLnEo
+YSxyKSkKaWYocyE9PXRoaXMuZ0EoYSkpdGhyb3cgSC5iKFAuYTQoYSkpfX0sCmdsMDpmdW5jdGlvbihh
+KXtyZXR1cm4gdGhpcy5nQShhKT09PTB9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIXRoaXMuZ2wwKGEp
+fSwKRTI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPUgueihhKQpyZXR1cm4gbmV3IEgubEooYSxzLktxKGMp
+LkMoIjEobEQuRSkiKS5hKGIpLHMuQygiQDxsRC5FPiIpLktxKGMpLkMoImxKPDEsMj4iKSl9LAplUjpm
+dW5jdGlvbihhLGIpe3JldHVybiBILnFDKGEsYixudWxsLEgueihhKS5DKCJsRC5FIikpfSwKZHI6ZnVu
+Y3Rpb24oYSxiKXtyZXR1cm4gbmV3IEgualYoYSxILnooYSkuQygiQDxsRC5FPiIpLktxKGIpLkMoImpW
+PDEsMj4iKSl9LApkdTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcwpILnooYSkuQygibEQuRT8iKS5hKGQp
+ClAuakIoYixjLHRoaXMuZ0EoYSkpCmZvcihzPWI7czxjOysrcyl0aGlzLlkoYSxzLGQpfSwKdzpmdW5j
+dGlvbihhKXtyZXR1cm4gUC5XRShhLCJbIiwiXSIpfX0KUC5pbC5wcm90b3R5cGU9e30KUC5yYS5wcm90
+b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcy5hCmlmKCFyLmEpdGhpcy5iLmErPSIs
+ICIKci5hPSExCnI9dGhpcy5iCnM9ci5hKz1ILkVqKGEpCnIuYT1zKyI6ICIKci5hKz1ILkVqKGIpfSwK
+JFM6MTF9ClAuWWsucHJvdG90eXBlPXsKSzpmdW5jdGlvbihhLGIpe3ZhciBzLHIKSC5MaCh0aGlzKS5D
+KCJ+KFlrLkssWWsuVikiKS5hKGIpCmZvcihzPUouSVQodGhpcy5nVigpKTtzLkYoKTspe3I9cy5nbCgp
+CmIuJDIocix0aGlzLnEoMCxyKSl9fSwKZ1B1OmZ1bmN0aW9uKGEpe3JldHVybiBKLk0xKHRoaXMuZ1Yo
+KSxuZXcgUC55USh0aGlzKSxILkxoKHRoaXMpLkMoIk4zPFlrLkssWWsuVj4iKSl9LAp4NDpmdW5jdGlv
+bihhKXtyZXR1cm4gSi56bCh0aGlzLmdWKCksYSl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IbSh0
+aGlzLmdWKCkpfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiBKLnVVKHRoaXMuZ1YoKSl9LAp3OmZ1bmN0
+aW9uKGEpe3JldHVybiBQLm5PKHRoaXMpfSwKJGlaMDoxfQpQLnlRLnByb3RvdHlwZT17CiQxOmZ1bmN0
+aW9uKGEpe3ZhciBzPXRoaXMuYSxyPUguTGgocykKci5DKCJZay5LIikuYShhKQpyZXR1cm4gbmV3IFAu
+TjMoYSxzLnEoMCxhKSxyLkMoIkA8WWsuSz4iKS5LcShyLkMoIllrLlYiKSkuQygiTjM8MSwyPiIpKX0s
+CiRTOmZ1bmN0aW9uKCl7cmV0dXJuIEguTGgodGhpcy5hKS5DKCJOMzxZay5LLFlrLlY+KFlrLkspIil9
+fQpQLktQLnByb3RvdHlwZT17Clk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPUguTGgodGhpcykKcy5jLmEo
+YikKcy5RWzFdLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1h
+cCIpKX19ClAuUG4ucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEucSgwLGIp
+fSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQp0aGlzLmEuWSgwLHMuYy5hKGIpLHMu
+UVsxXS5hKGMpKX0sCng0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEueDQoYSl9LApLOmZ1bmN0aW9u
+KGEsYil7dGhpcy5hLksoMCxILkxoKHRoaXMpLkMoIn4oMSwyKSIpLmEoYikpfSwKZ2wwOmZ1bmN0aW9u
+KGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4gcy5nbDAocyl9LApnQTpmdW5jdGlvbihhKXt2YXIgcz10aGlz
+LmEKcmV0dXJuIHMuZ0Eocyl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBKLmoodGhpcy5hKX0sCmdQdTpm
+dW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ1B1KHMpfSwKJGlaMDoxfQpQLkdqLnByb3Rv
+dHlwZT17fQpQLmxmLnByb3RvdHlwZT17CmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nQSh0aGlz
+KT09PTB9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ0EodGhpcykhPT0wfSwKRlY6ZnVuY3Rp
+b24oYSxiKXt2YXIgcwpmb3Iocz1KLklUKEguTGgodGhpcykuQygiY1g8bGYuRT4iKS5hKGIpKTtzLkYo
+KTspdGhpcy5pKDAscy5nbCgpKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UodGhpcywieyIsIn0i
+KX0sCkg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRoaXMuZ20odGhpcykKaWYoIXIuRigpKXJldHVybiIi
+CmlmKGI9PT0iIil7cz0iIgpkbyBzKz1ILkVqKHIuZCkKd2hpbGUoci5GKCkpfWVsc2V7cz1ILkVqKHIu
+ZCkKZm9yKDtyLkYoKTspcz1zK2IrSC5FaihyLmQpfXJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpz
+fSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5iSyh0aGlzLGIsSC5MaCh0aGlzKS5DKCJsZi5FIikp
+fSwKRTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwPSJpbmRleCIKUC5VSShiLHAsdC5TKQpQLmsxKGIs
+cCkKZm9yKHM9dGhpcy5nbSh0aGlzKSxyPTA7cy5GKCk7KXtxPXMuZAppZihiPT09cilyZXR1cm4gcTsr
+K3J9dGhyb3cgSC5iKFAuQ2YoYix0aGlzLHAsbnVsbCxyKSl9fQpQLlZqLnByb3RvdHlwZT17JGliUTox
+LCRpY1g6MSwkaXh1OjF9ClAuWHYucHJvdG90eXBlPXskaWJROjEsJGljWDoxLCRpeHU6MX0KUC5uWS5w
+cm90b3R5cGU9e30KUC5XWS5wcm90b3R5cGU9e30KUC5SVS5wcm90b3R5cGU9e30KUC5wUi5wcm90b3R5
+cGU9e30KUC51dy5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7dmFyIHMscj10aGlzLmIKaWYocj09
+bnVsbClyZXR1cm4gdGhpcy5jLnEoMCxiKQplbHNlIGlmKHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4g
+bnVsbAplbHNle3M9cltiXQpyZXR1cm4gdHlwZW9mIHM9PSJ1bmRlZmluZWQiP3RoaXMuZmIoYik6c319
+LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iPT1udWxsP3RoaXMuYy5hOnRoaXMuQ2YoKS5sZW5n
+dGh9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKZ1Y6ZnVuY3Rpb24o
+KXtpZih0aGlzLmI9PW51bGwpe3ZhciBzPXRoaXMuYwpyZXR1cm4gbmV3IEguaTUocyxILkxoKHMpLkMo
+Imk1PDE+IikpfXJldHVybiBuZXcgUC5pOCh0aGlzKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIs
+cT10aGlzCmlmKHEuYj09bnVsbClxLmMuWSgwLGIsYykKZWxzZSBpZihxLng0KGIpKXtzPXEuYgpzW2Jd
+PWMKcj1xLmEKaWYocj09bnVsbD9zIT1udWxsOnIhPT1zKXJbYl09bnVsbH1lbHNlIHEuWEsoKS5ZKDAs
+YixjKX0sCng0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYj09bnVsbClyZXR1cm4gdGhpcy5jLng0KGEpCnJl
+dHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hLGEpfSwKSzpmdW5j
+dGlvbihhLGIpe3ZhciBzLHIscSxwLG89dGhpcwp0LmNBLmEoYikKaWYoby5iPT1udWxsKXJldHVybiBv
+LmMuSygwLGIpCnM9by5DZigpCmZvcihyPTA7cjxzLmxlbmd0aDsrK3Ipe3E9c1tyXQpwPW8uYltxXQpp
+Zih0eXBlb2YgcD09InVuZGVmaW5lZCIpe3A9UC5RZShvLmFbcV0pCm8uYltxXT1wfWIuJDIocSxwKQpp
+ZihzIT09by5jKXRocm93IEguYihQLmE0KG8pKX19LApDZjpmdW5jdGlvbigpe3ZhciBzPXQuYk0uYSh0
+aGlzLmMpCmlmKHM9PW51bGwpcz10aGlzLmM9SC5WTShPYmplY3Qua2V5cyh0aGlzLmEpLHQucykKcmV0
+dXJuIHN9LApYSzpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbj10aGlzCmlmKG4uYj09bnVsbClyZXR1
+cm4gbi5jCnM9UC5GbCh0Lk4sdC56KQpyPW4uQ2YoKQpmb3IocT0wO3A9ci5sZW5ndGgscTxwOysrcSl7
+bz1yW3FdCnMuWSgwLG8sbi5xKDAsbykpfWlmKHA9PT0wKUMuTm0uaShyLCIiKQplbHNlIEMuTm0uc0Eo
+ciwwKQpuLmE9bi5iPW51bGwKcmV0dXJuIG4uYz1zfSwKZmI6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoIU9i
+amVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYSkpcmV0dXJuIG51bGwKcz1Q
+LlFlKHRoaXMuYVthXSkKcmV0dXJuIHRoaXMuYlthXT1zfX0KUC5pOC5wcm90b3R5cGU9ewpnQTpmdW5j
+dGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ0Eocyl9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHM9
+dGhpcy5hCmlmKHMuYj09bnVsbClzPXMuZ1YoKS5FKDAsYikKZWxzZXtzPXMuQ2YoKQppZihiPDB8fGI+
+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsYikKcz1zW2JdfXJldHVybiBzfSwKZ206ZnVuY3Rpb24oYSl7
+dmFyIHM9dGhpcy5hCmlmKHMuYj09bnVsbCl7cz1zLmdWKCkKcz1zLmdtKHMpfWVsc2V7cz1zLkNmKCkK
+cz1uZXcgSi5tMShzLHMubGVuZ3RoLEgudDYocykuQygibTE8MT4iKSl9cmV0dXJuIHN9LAp0ZzpmdW5j
+dGlvbihhLGIpe3JldHVybiB0aGlzLmEueDQoYil9fQpQLnBnLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9u
+KCl7dmFyIHMscgp0cnl7cz1uZXcgVGV4dERlY29kZXIoInV0Zi04Iix7ZmF0YWw6dHJ1ZX0pCnJldHVy
+biBzfWNhdGNoKHIpe0guUnUocil9cmV0dXJuIG51bGx9LAokUzoxMn0KUC5jMi5wcm90b3R5cGU9ewok
+MDpmdW5jdGlvbigpe3ZhciBzLHIKdHJ5e3M9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2ZhdGFsOmZh
+bHNlfSkKcmV0dXJuIHN9Y2F0Y2gocil7SC5SdShyKX1yZXR1cm4gbnVsbH0sCiRTOjEyfQpQLkNWLnBy
+b3RvdHlwZT17CnlyOmZ1bmN0aW9uKGEwLGExLGEyKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgs
+ZyxmLGUsZCxjLGIsYT0iSW52YWxpZCBiYXNlNjQgZW5jb2RpbmcgbGVuZ3RoICIKYTI9UC5qQihhMSxh
+MixhMC5sZW5ndGgpCnM9JC5WNygpCmZvcihyPWExLHE9cixwPW51bGwsbz0tMSxuPS0xLG09MDtyPGEy
+O3I9bCl7bD1yKzEKaz1DLnhCLlcoYTAscikKaWYoaz09PTM3KXtqPWwrMgppZihqPD1hMil7aT1ILm9v
+KEMueEIuVyhhMCxsKSkKaD1ILm9vKEMueEIuVyhhMCxsKzEpKQpnPWkqMTYraC0oaCYyNTYpCmlmKGc9
+PT0zNylnPS0xCmw9an1lbHNlIGc9LTF9ZWxzZSBnPWsKaWYoMDw9ZyYmZzw9MTI3KXtpZihnPDB8fGc+
+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsZykKZj1zW2ddCmlmKGY+PTApe2c9Qy54Qi5PMigiQUJDREVG
+R0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIs
+ZikKaWYoZz09PWspY29udGludWUKaz1nfWVsc2V7aWYoZj09PS0xKXtpZihvPDApe2U9cD09bnVsbD9u
+dWxsOnAuYS5sZW5ndGgKaWYoZT09bnVsbCllPTAKbz1lKyhyLXEpCm49cn0rK20KaWYoaz09PTYxKWNv
+bnRpbnVlfWs9Z31pZihmIT09LTIpe2lmKHA9PW51bGwpe3A9bmV3IFAuUm4oIiIpCmU9cH1lbHNlIGU9
+cAplLmErPUMueEIuTmooYTAscSxyKQplLmErPUguTHcoaykKcT1sCmNvbnRpbnVlfX10aHJvdyBILmIo
+UC5ycigiSW52YWxpZCBiYXNlNjQgZGF0YSIsYTAscikpfWlmKHAhPW51bGwpe2U9cC5hKz1DLnhCLk5q
+KGEwLHEsYTIpCmQ9ZS5sZW5ndGgKaWYobz49MClQLnhNKGEwLG4sYTIsbyxtLGQpCmVsc2V7Yz1DLmpu
+LnpZKGQtMSw0KSsxCmlmKGM9PT0xKXRocm93IEguYihQLnJyKGEsYTAsYTIpKQpmb3IoO2M8NDspe2Ur
+PSI9IgpwLmE9ZTsrK2N9fWU9cC5hCnJldHVybiBDLnhCLmk3KGEwLGExLGEyLGUuY2hhckNvZGVBdCgw
+KT09MD9lOmUpfWI9YTItYTEKaWYobz49MClQLnhNKGEwLG4sYTIsbyxtLGIpCmVsc2V7Yz1DLmpuLnpZ
+KGIsNCkKaWYoYz09PTEpdGhyb3cgSC5iKFAucnIoYSxhMCxhMikpCmlmKGM+MSlhMD1DLnhCLmk3KGEw
+LGEyLGEyLGM9PT0yPyI9PSI6Ij0iKX1yZXR1cm4gYTB9fQpQLlU4LnByb3RvdHlwZT17fQpQLlVrLnBy
+b3RvdHlwZT17fQpQLndJLnByb3RvdHlwZT17fQpQLlppLnByb3RvdHlwZT17fQpQLlVkLnByb3RvdHlw
+ZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9UC5obCh0aGlzLmEpCnJldHVybih0aGlzLmIhPW51bGw/IkNv
+bnZlcnRpbmcgb2JqZWN0IHRvIGFuIGVuY29kYWJsZSBvYmplY3QgZmFpbGVkOiI6IkNvbnZlcnRpbmcg
+b2JqZWN0IGRpZCBub3QgcmV0dXJuIGFuIGVuY29kYWJsZSBvYmplY3Q6IikrIiAiK3N9fQpQLks4LnBy
+b3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkN5Y2xpYyBlcnJvciBpbiBKU09OIHN0cmluZ2lm
+eSJ9fQpQLmJ5LnByb3RvdHlwZT17CnBXOmZ1bmN0aW9uKGEsYixjKXt2YXIgcwp0LmZWLmEoYykKcz1Q
+LkJTKGIsdGhpcy5nSGUoKS5hKQpyZXR1cm4gc30sCk9COmZ1bmN0aW9uKGEsYil7dmFyIHMKdC5kQS5h
+KGIpCnM9UC51WChhLHRoaXMuZ1pFKCkuYixudWxsKQpyZXR1cm4gc30sCmdaRTpmdW5jdGlvbigpe3Jl
+dHVybiBDLm5YfSwKZ0hlOmZ1bmN0aW9uKCl7cmV0dXJuIEMuQTN9fQpQLm9qLnByb3RvdHlwZT17fQpQ
+Lk14LnByb3RvdHlwZT17fQpQLlNoLnByb3RvdHlwZT17CnZwOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxw
+LG8sbixtLGw9YS5sZW5ndGgKZm9yKHM9Si5yWShhKSxyPXRoaXMuYyxxPTAscD0wO3A8bDsrK3Ape289
+cy5XKGEscCkKaWYobz45Mil7aWYobz49NTUyOTYpe249byY2NDUxMgppZihuPT09NTUyOTYpe209cCsx
+Cm09IShtPGwmJihDLnhCLlcoYSxtKSY2NDUxMik9PT01NjMyMCl9ZWxzZSBtPSExCmlmKCFtKWlmKG49
+PT01NjMyMCl7bj1wLTEKbj0hKG4+PTAmJihDLnhCLk8yKGEsbikmNjQ1MTIpPT09NTUyOTYpfWVsc2Ug
+bj0hMQplbHNlIG49ITAKaWYobil7aWYocD5xKXIuYSs9Qy54Qi5OaihhLHEscCkKcT1wKzEKci5hKz1I
+Lkx3KDkyKQpyLmErPUguTHcoMTE3KQpyLmErPUguTHcoMTAwKQpuPW8+Pj44JjE1CnIuYSs9SC5Mdyhu
+PDEwPzQ4K246ODcrbikKbj1vPj4+NCYxNQpyLmErPUguTHcobjwxMD80OCtuOjg3K24pCm49byYxNQpy
+LmErPUguTHcobjwxMD80OCtuOjg3K24pfX1jb250aW51ZX1pZihvPDMyKXtpZihwPnEpci5hKz1DLnhC
+Lk5qKGEscSxwKQpxPXArMQpyLmErPUguTHcoOTIpCnN3aXRjaChvKXtjYXNlIDg6ci5hKz1ILkx3KDk4
+KQpicmVhawpjYXNlIDk6ci5hKz1ILkx3KDExNikKYnJlYWsKY2FzZSAxMDpyLmErPUguTHcoMTEwKQpi
+cmVhawpjYXNlIDEyOnIuYSs9SC5MdygxMDIpCmJyZWFrCmNhc2UgMTM6ci5hKz1ILkx3KDExNCkKYnJl
+YWsKZGVmYXVsdDpyLmErPUguTHcoMTE3KQpyLmErPUguTHcoNDgpCnIuYSs9SC5Mdyg0OCkKbj1vPj4+
+NCYxNQpyLmErPUguTHcobjwxMD80OCtuOjg3K24pCm49byYxNQpyLmErPUguTHcobjwxMD80OCtuOjg3
+K24pCmJyZWFrfX1lbHNlIGlmKG89PT0zNHx8bz09PTkyKXtpZihwPnEpci5hKz1DLnhCLk5qKGEscSxw
+KQpxPXArMQpyLmErPUguTHcoOTIpCnIuYSs9SC5MdyhvKX19aWYocT09PTApci5hKz1ILkVqKGEpCmVs
+c2UgaWYocTxsKXIuYSs9cy5OaihhLHEsbCl9LApKbjpmdW5jdGlvbihhKXt2YXIgcyxyLHEscApmb3Io
+cz10aGlzLmEscj1zLmxlbmd0aCxxPTA7cTxyOysrcSl7cD1zW3FdCmlmKGE9PW51bGw/cD09bnVsbDph
+PT09cCl0aHJvdyBILmIobmV3IFAuSzgoYSxudWxsKSl9Qy5ObS5pKHMsYSl9LAppVTpmdW5jdGlvbihh
+KXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoby50TShhKSlyZXR1cm4Kby5KbihhKQp0cnl7cz1vLmIuJDEo
+YSkKaWYoIW8udE0ocykpe3E9UC5HeShhLG51bGwsby5nVksoKSkKdGhyb3cgSC5iKHEpfXE9by5hCmlm
+KDA+PXEubGVuZ3RoKXJldHVybiBILk9IKHEsLTEpCnEucG9wKCl9Y2F0Y2gocCl7cj1ILlJ1KHApCnE9
+UC5HeShhLHIsby5nVksoKSkKdGhyb3cgSC5iKHEpfX0sCnRNOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT10
+aGlzCmlmKHR5cGVvZiBhPT0ibnVtYmVyIil7aWYoIWlzRmluaXRlKGEpKXJldHVybiExCnEuYy5hKz1D
+LkNELncoYSkKcmV0dXJuITB9ZWxzZSBpZihhPT09ITApe3EuYy5hKz0idHJ1ZSIKcmV0dXJuITB9ZWxz
+ZSBpZihhPT09ITEpe3EuYy5hKz0iZmFsc2UiCnJldHVybiEwfWVsc2UgaWYoYT09bnVsbCl7cS5jLmEr
+PSJudWxsIgpyZXR1cm4hMH1lbHNlIGlmKHR5cGVvZiBhPT0ic3RyaW5nIil7cz1xLmMKcy5hKz0nIicK
+cS52cChhKQpzLmErPSciJwpyZXR1cm4hMH1lbHNlIGlmKHQuai5iKGEpKXtxLkpuKGEpCnEubEsoYSkK
+cz1xLmEKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpyZXR1cm4hMH1lbHNl
+IGlmKHQuZi5iKGEpKXtxLkpuKGEpCnI9cS5qdyhhKQpzPXEuYQppZigwPj1zLmxlbmd0aClyZXR1cm4g
+SC5PSChzLC0xKQpzLnBvcCgpCnJldHVybiByfWVsc2UgcmV0dXJuITF9LApsSzpmdW5jdGlvbihhKXt2
+YXIgcyxyLHE9dGhpcy5jCnEuYSs9IlsiCnM9Si5VNihhKQppZihzLmdvcihhKSl7dGhpcy5pVShzLnEo
+YSwwKSkKZm9yKHI9MTtyPHMuZ0EoYSk7KytyKXtxLmErPSIsIgp0aGlzLmlVKHMucShhLHIpKX19cS5h
+Kz0iXSJ9LApqdzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9e30KaWYoYS5nbDAo
+YSkpe20uYy5hKz0ie30iCnJldHVybiEwfXM9YS5nQShhKSoyCnI9UC5POChzLG51bGwsITEsdC5SKQpx
+PWwuYT0wCmwuYj0hMAphLksoMCxuZXcgUC50aShsLHIpKQppZighbC5iKXJldHVybiExCnA9bS5jCnAu
+YSs9InsiCmZvcihvPSciJztxPHM7cSs9MixvPScsIicpe3AuYSs9bwptLnZwKEguaChyW3FdKSkKcC5h
+Kz0nIjonCm49cSsxCmlmKG4+PXMpcmV0dXJuIEguT0gocixuKQptLmlVKHJbbl0pfXAuYSs9In0iCnJl
+dHVybiEwfX0KUC50aS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHIKaWYodHlwZW9m
+IGEhPSJzdHJpbmciKXRoaXMuYS5iPSExCnM9dGhpcy5iCnI9dGhpcy5hCkMuTm0uWShzLHIuYSsrLGEp
+CkMuTm0uWShzLHIuYSsrLGIpfSwKJFM6MTF9ClAudHUucHJvdG90eXBlPXsKZ1ZLOmZ1bmN0aW9uKCl7
+dmFyIHM9dGhpcy5jLmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9fQpQLnU1LnByb3RvdHlw
+ZT17CmdaRTpmdW5jdGlvbigpe3JldHVybiBDLlFrfX0KUC5FMy5wcm90b3R5cGU9ewpXSjpmdW5jdGlv
+bihhKXt2YXIgcyxyLHEscD1QLmpCKDAsbnVsbCxhLmxlbmd0aCksbz1wLTAKaWYobz09PTApcmV0dXJu
+IG5ldyBVaW50OEFycmF5KDApCnM9byozCnI9bmV3IFVpbnQ4QXJyYXkocykKcT1uZXcgUC5SdyhyKQpp
+ZihxLkd4KGEsMCxwKSE9PXApe0ouYTYoYSxwLTEpCnEuUk8oKX1yZXR1cm4gbmV3IFVpbnQ4QXJyYXko
+ci5zdWJhcnJheSgwLEguck0oMCxxLmIscykpKX19ClAuUncucHJvdG90eXBlPXsKUk86ZnVuY3Rpb24o
+KXt2YXIgcz10aGlzLHI9cy5jLHE9cy5iLHA9cy5iPXErMSxvPXIubGVuZ3RoCmlmKHE+PW8pcmV0dXJu
+IEguT0gocixxKQpyW3FdPTIzOQpxPXMuYj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChyLHApCnJbcF09
+MTkxCnMuYj1xKzEKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09MTg5fSwKTzY6ZnVuY3Rpb24o
+YSxiKXt2YXIgcyxyLHEscCxvLG49dGhpcwppZigoYiY2NDUxMik9PT01NjMyMCl7cz02NTUzNisoKGEm
+MTAyMyk8PDEwKXxiJjEwMjMKcj1uLmMKcT1uLmIKcD1uLmI9cSsxCm89ci5sZW5ndGgKaWYocT49byly
+ZXR1cm4gSC5PSChyLHEpCnJbcV09cz4+PjE4fDI0MApxPW4uYj1wKzEKaWYocD49bylyZXR1cm4gSC5P
+SChyLHApCnJbcF09cz4+PjEyJjYzfDEyOApwPW4uYj1xKzEKaWYocT49bylyZXR1cm4gSC5PSChyLHEp
+CnJbcV09cz4+PjYmNjN8MTI4Cm4uYj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChyLHApCnJbcF09cyY2
+M3wxMjgKcmV0dXJuITB9ZWxzZXtuLlJPKCkKcmV0dXJuITF9fSwKR3g6ZnVuY3Rpb24oYSxiLGMpe3Zh
+ciBzLHIscSxwLG8sbixtLGw9dGhpcwppZihiIT09YyYmKEMueEIuTzIoYSxjLTEpJjY0NTEyKT09PTU1
+Mjk2KS0tYwpmb3Iocz1sLmMscj1zLmxlbmd0aCxxPWI7cTxjOysrcSl7cD1DLnhCLlcoYSxxKQppZihw
+PD0xMjcpe289bC5iCmlmKG8+PXIpYnJlYWsKbC5iPW8rMQpzW29dPXB9ZWxzZXtvPXAmNjQ1MTIKaWYo
+bz09PTU1Mjk2KXtpZihsLmIrND5yKWJyZWFrCm49cSsxCmlmKGwuTzYocCxDLnhCLlcoYSxuKSkpcT1u
+fWVsc2UgaWYobz09PTU2MzIwKXtpZihsLmIrMz5yKWJyZWFrCmwuUk8oKX1lbHNlIGlmKHA8PTIwNDcp
+e289bC5iCm09bysxCmlmKG0+PXIpYnJlYWsKbC5iPW0KaWYobz49cilyZXR1cm4gSC5PSChzLG8pCnNb
+b109cD4+PjZ8MTkyCmwuYj1tKzEKc1ttXT1wJjYzfDEyOH1lbHNle289bC5iCmlmKG8rMj49cilicmVh
+awptPWwuYj1vKzEKaWYobz49cilyZXR1cm4gSC5PSChzLG8pCnNbb109cD4+PjEyfDIyNApvPWwuYj1t
+KzEKaWYobT49cilyZXR1cm4gSC5PSChzLG0pCnNbbV09cD4+PjYmNjN8MTI4CmwuYj1vKzEKaWYobz49
+cilyZXR1cm4gSC5PSChzLG8pCnNbb109cCY2M3wxMjh9fX1yZXR1cm4gcX19ClAuR1kucHJvdG90eXBl
+PXsKV0o6ZnVuY3Rpb24oYSl7dmFyIHMscgp0LkwuYShhKQpzPXRoaXMuYQpyPVAua3kocyxhLDAsbnVs
+bCkKaWYociE9bnVsbClyZXR1cm4gcgpyZXR1cm4gbmV3IFAuYnoocykuTmUoYSwwLG51bGwsITApfX0K
+UC5iei5wcm90b3R5cGU9ewpOZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG49dGhpcwp0
+LkwuYShhKQpzPVAuakIoYixjLEouSG0oYSkpCmlmKGI9PT1zKXJldHVybiIiCnI9UC5qeShhLGIscykK
+cT1uLmhPKHIsMCxzLWIsITApCnA9bi5iCmlmKChwJjEpIT09MCl7bz1QLmo0KHApCm4uYj0wCnRocm93
+IEguYihQLnJyKG8sYSxiK24uYykpfXJldHVybiBxfSwKaE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMs
+cixxPXRoaXMKaWYoYy1iPjEwMDApe3M9Qy5qbi5CVShiK2MsMikKcj1xLmhPKGEsYixzLCExKQppZigo
+cS5iJjEpIT09MClyZXR1cm4gcgpyZXR1cm4gcitxLmhPKGEscyxjLGQpfXJldHVybiBxLkVoKGEsYixj
+LGQpfSwKRWg6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG0sbCxrPXRoaXMsaj02NTUz
+MyxpPWsuYixoPWsuYyxnPW5ldyBQLlJuKCIiKSxmPWIrMSxlPWEubGVuZ3RoCmlmKGI8MHx8Yj49ZSly
+ZXR1cm4gSC5PSChhLGIpCnM9YVtiXQokbGFiZWwwJDA6Zm9yKHI9ay5hOyEwOyl7Zm9yKDshMDtmPW8p
+e3E9Qy54Qi5XKCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
 QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
-QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUZGRkZGRkZGRkZGRkZG
-RkZHR0dHR0dHR0dHR0dHR0dHSEhISEhISEhISEhISEhISEhISEhISEhISEhISUhISEpFRUJCQkJCQkJC
-QkJCQkJCQkJCQkJCQkJCQkJCQkJCQktDQ0NDQ0NDQ0NDQ0NEQ0xPTk5OTUVFRUVFRUVFRUVFIixzKSYz
-MQpoPWk8PTMyP3MmNjE2OTQ+Pj5xOihzJjYzfGg8PDYpPj4+MAppPUMueEIuVygiIFx4MDAwOlhFQ0ND
-Q0NOOmxEYiBceDAwMDpYRUNDQ0NDTnZsRGIgXHgwMDA6WEVDQ0NDQ046bERiIEFBQUFBXHgwMFx4MDBc
-eDAwXHgwMFx4MDBBQUFBQTAwMDAwQUFBQUE6Ojo6OkFBQUFBR0cwMDBBQUFBQTAwS0tLQUFBQUFHOjo6
-OkFBQUFBOklJSUlBQUFBQTAwMFx4ODAwQUFBQUFceDAwXHgwMFx4MDBceDAwIEFBQUFBIixpK3EpCmlm
-KGk9PT0wKXtnLmErPUguTHcoaCkKaWYoZj09PWMpYnJlYWsgJGxhYmVsMCQwCmJyZWFrfWVsc2UgaWYo
-KGkmMSkhPT0wKXtpZihyKXN3aXRjaChpKXtjYXNlIDY5OmNhc2UgNjc6Zy5hKz1ILkx3KGopCmJyZWFr
-CmNhc2UgNjU6Zy5hKz1ILkx3KGopOy0tZgpicmVhawpkZWZhdWx0OnA9Zy5hKz1ILkx3KGopCmcuYT1w
-K0guTHcoaikKYnJlYWt9ZWxzZXtrLmI9aQprLmM9Zi0xCnJldHVybiIifWk9MH1pZihmPT09YylicmVh
-ayAkbGFiZWwwJDAKbz1mKzEKaWYoZjwwfHxmPj1lKXJldHVybiBILk9IKGEsZikKcz1hW2ZdfW89Zisx
-CmlmKGY8MHx8Zj49ZSlyZXR1cm4gSC5PSChhLGYpCnM9YVtmXQppZihzPDEyOCl7d2hpbGUoITApe2lm
-KCEobzxjKSl7bj1jCmJyZWFrfW09bysxCmlmKG88MHx8bz49ZSlyZXR1cm4gSC5PSChhLG8pCnM9YVtv
-XQppZihzPj0xMjgpe249bS0xCm89bQpicmVha31vPW19aWYobi1mPDIwKWZvcihsPWY7bDxuOysrbCl7
-aWYobD49ZSlyZXR1cm4gSC5PSChhLGwpCmcuYSs9SC5MdyhhW2xdKX1lbHNlIGcuYSs9UC5ITShhLGYs
-bikKaWYobj09PWMpYnJlYWsgJGxhYmVsMCQwCmY9b31lbHNlIGY9b31pZihkJiZpPjMyKWlmKHIpZy5h
-Kz1ILkx3KGopCmVsc2V7ay5iPTc3CmsuYz1jCnJldHVybiIifWsuYj1pCmsuYz1oCmU9Zy5hCnJldHVy
-biBlLmNoYXJDb2RlQXQoMCk9PTA/ZTplfX0KUC5XRi5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIp
-e3ZhciBzLHIscQp0LmZvLmEoYSkKcz10aGlzLmIKcj10aGlzLmEKcy5hKz1yLmEKcT1zLmErPUguRWoo
-YS5hKQpzLmE9cSsiOiAiCnMuYSs9UC5obChiKQpyLmE9IiwgIn0sCiRTOjQzfQpQLmlQLnByb3RvdHlw
-ZT17CkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9m
-IFAuaVAmJnRoaXMuYT09PWIuYSYmITB9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCnJldHVy
-bihzXkMuam4ud0cocywzMCkpJjEwNzM3NDE4MjN9LAp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMscj1Q
-LkdxKEgudEoocykpLHE9UC5oMChILk5TKHMpKSxwPVAuaDAoSC5qQShzKSksbz1QLmgwKEguSVgocykp
-LG49UC5oMChILmNoKHMpKSxtPVAuaDAoSC5KZChzKSksbD1QLlZ4KEgubzEocykpLGs9cisiLSIrcSsi
-LSIrcCsiICIrbysiOiIrbisiOiIrbSsiLiIrbApyZXR1cm4ga319ClAuWFMucHJvdG90eXBlPXsKZ0lJ
-OmZ1bmN0aW9uKCl7cmV0dXJuIEgudHModGhpcy4kdGhyb3duSnNFcnJvcil9fQpQLkM2LnByb3RvdHlw
-ZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCmlmKHMhPW51bGwpcmV0dXJuIkFzc2VydGlvbiBm
-YWlsZWQ6ICIrUC5obChzKQpyZXR1cm4iQXNzZXJ0aW9uIGZhaWxlZCJ9fQpQLkV6LnByb3RvdHlwZT17
-fQpQLkYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iVGhyb3cgb2YgbnVsbC4ifX0KUC51
-LnByb3RvdHlwZT17CmdaOmZ1bmN0aW9uKCl7cmV0dXJuIkludmFsaWQgYXJndW1lbnQiKyghdGhpcy5h
-PyIocykiOiIiKX0sCmd1OmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LAp3OmZ1bmN0aW9uKGEpe3ZhciBzLHIs
-cT10aGlzLHA9cS5jLG89cD09bnVsbD8iIjoiICgiK3ArIikiLG49cS5kLG09bj09bnVsbD8iIjoiOiAi
-K0guRWoobiksbD1xLmdaKCkrbyttCmlmKCFxLmEpcmV0dXJuIGwKcz1xLmd1KCkKcj1QLmhsKHEuYikK
-cmV0dXJuIGwrcysiOiAiK3J9fQpQLmJKLnByb3RvdHlwZT17CmdaOmZ1bmN0aW9uKCl7cmV0dXJuIlJh
-bmdlRXJyb3IifSwKZ3U6ZnVuY3Rpb24oKXt2YXIgcyxyPXRoaXMuZSxxPXRoaXMuZgppZihyPT1udWxs
-KXM9cSE9bnVsbD8iOiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIrSC5FaihxKToiIgplbHNlIGlm
-KHE9PW51bGwpcz0iOiBOb3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIrSC5FaihyKQplbHNlIGlm
-KHE+cilzPSI6IE5vdCBpbiBpbmNsdXNpdmUgcmFuZ2UgIitILkVqKHIpKyIuLiIrSC5FaihxKQplbHNl
-IHM9cTxyPyI6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVtcHR5IjoiOiBPbmx5IHZhbGlkIHZhbHVlIGlz
-ICIrSC5FaihyKQpyZXR1cm4gc319ClAuZVkucHJvdG90eXBlPXsKZ1o6ZnVuY3Rpb24oKXtyZXR1cm4i
-UmFuZ2VFcnJvciJ9LApndTpmdW5jdGlvbigpe3ZhciBzLHI9SC51UCh0aGlzLmIpCmlmKHR5cGVvZiBy
-IT09Im51bWJlciIpcmV0dXJuIHIuSigpCmlmKHI8MClyZXR1cm4iOiBpbmRleCBtdXN0IG5vdCBiZSBu
-ZWdhdGl2ZSIKcz10aGlzLmYKaWYocz09PTApcmV0dXJuIjogbm8gaW5kaWNlcyBhcmUgdmFsaWQiCnJl
-dHVybiI6IGluZGV4IHNob3VsZCBiZSBsZXNzIHRoYW4gIitILkVqKHMpfSwKZ0E6ZnVuY3Rpb24oYSl7
-cmV0dXJuIHRoaXMuZn19ClAubXAucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxv
-LG4sbSxsLGs9dGhpcyxqPXt9LGk9bmV3IFAuUm4oIiIpCmouYT0iIgpzPWsuYwpmb3Iocj1zLmxlbmd0
-aCxxPTAscD0iIixvPSIiO3E8cjsrK3Esbz0iLCAiKXtuPXNbcV0KaS5hPXArbwpwPWkuYSs9UC5obChu
-KQpqLmE9IiwgIn1rLmQuSygwLG5ldyBQLldGKGosaSkpCm09UC5obChrLmEpCmw9aS53KDApCnI9Ik5v
-U3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIitILkVqKGsuYi5hKSsiJ1xuUmVjZWl2
-ZXI6ICIrbSsiXG5Bcmd1bWVudHM6IFsiK2wrIl0iCnJldHVybiByfX0KUC51Yi5wcm90b3R5cGU9ewp3
-OmZ1bmN0aW9uKGEpe3JldHVybiJVbnN1cHBvcnRlZCBvcGVyYXRpb246ICIrdGhpcy5hfX0KUC5kcy5w
-cm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4gcyE9bnVsbD8iVW5pbXBs
-ZW1lbnRlZEVycm9yOiAiK3M6IlVuaW1wbGVtZW50ZWRFcnJvciJ9fQpQLmxqLnByb3RvdHlwZT17Cnc6
-ZnVuY3Rpb24oYSl7cmV0dXJuIkJhZCBzdGF0ZTogIit0aGlzLmF9fQpQLlVWLnByb3RvdHlwZT17Cnc6
-ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCmlmKHM9PW51bGwpcmV0dXJuIkNvbmN1cnJlbnQgbW9kaWZp
-Y2F0aW9uIGR1cmluZyBpdGVyYXRpb24uIgpyZXR1cm4iQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVy
-aW5nIGl0ZXJhdGlvbjogIitQLmhsKHMpKyIuIn19ClAuazUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihh
-KXtyZXR1cm4iT3V0IG9mIE1lbW9yeSJ9LApnSUk6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sCiRpWFM6
-MX0KUC5LWS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJTdGFjayBPdmVyZmxvdyJ9LApn
-SUk6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sCiRpWFM6MX0KUC5wLnByb3RvdHlwZT17Cnc6ZnVuY3Rp
-b24oYSl7dmFyIHM9dGhpcy5hCnJldHVybiBzPT1udWxsPyJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSBk
-dXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIjoiUmVhZGluZyBzdGF0aWMgdmFyaWFibGUgJyIrcysiJyBk
-dXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIn19ClAuQ0QucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXty
-ZXR1cm4iRXhjZXB0aW9uOiAiK3RoaXMuYX0sCiRpUno6MX0KUC5hRS5wcm90b3R5cGU9ewp3OmZ1bmN0
-aW9uKGEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnPXRoaXMuYSxmPWchPW51bGwmJiIiIT09
-Zz8iRm9ybWF0RXhjZXB0aW9uOiAiK0guRWooZyk6IkZvcm1hdEV4Y2VwdGlvbiIsZT10aGlzLmMsZD10
-aGlzLmIKaWYodHlwZW9mIGQ9PSJzdHJpbmciKXtpZihlIT1udWxsKXM9ZTwwfHxlPmQubGVuZ3RoCmVs
-c2Ugcz0hMQppZihzKWU9bnVsbAppZihlPT1udWxsKXtpZihkLmxlbmd0aD43OClkPUMueEIuTmooZCww
-LDc1KSsiLi4uIgpyZXR1cm4gZisiXG4iK2R9Zm9yKHI9MSxxPTAscD0hMSxvPTA7bzxlOysrbyl7bj1D
-LnhCLlcoZCxvKQppZihuPT09MTApe2lmKHEhPT1vfHwhcCkrK3IKcT1vKzEKcD0hMX1lbHNlIGlmKG49
-PT0xMyl7KytyCnE9bysxCnA9ITB9fWY9cj4xP2YrKCIgKGF0IGxpbmUgIityKyIsIGNoYXJhY3RlciAi
-KyhlLXErMSkrIilcbiIpOmYrKCIgKGF0IGNoYXJhY3RlciAiKyhlKzEpKyIpXG4iKQptPWQubGVuZ3Ro
-CmZvcihvPWU7bzxtOysrbyl7bj1DLnhCLk8yKGQsbykKaWYobj09PTEwfHxuPT09MTMpe209bwpicmVh
-a319aWYobS1xPjc4KWlmKGUtcTw3NSl7bD1xKzc1Cms9cQpqPSIiCmk9Ii4uLiJ9ZWxzZXtpZihtLWU8
-NzUpe2s9bS03NQpsPW0KaT0iIn1lbHNle2s9ZS0zNgpsPWUrMzYKaT0iLi4uIn1qPSIuLi4ifWVsc2V7
-bD1tCms9cQpqPSIiCmk9IiJ9aD1DLnhCLk5qKGQsayxsKQpyZXR1cm4gZitqK2graSsiXG4iK0MueEIu
-SXgoIiAiLGUtaytqLmxlbmd0aCkrIl5cbiJ9ZWxzZSByZXR1cm4gZSE9bnVsbD9mKygiIChhdCBvZmZz
-ZXQgIitILkVqKGUpKyIpIik6Zn0sCiRpUno6MX0KUC5jWC5wcm90b3R5cGU9ewpkcjpmdW5jdGlvbihh
-LGIpe3JldHVybiBILkdKKHRoaXMsSC5MaCh0aGlzKS5DKCJjWC5FIiksYil9LApFMjpmdW5jdGlvbihh
-LGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gSC5LMSh0aGlzLHMuS3EoYykuQygiMShjWC5FKSIp
-LmEoYikscy5DKCJjWC5FIiksYyl9LApldjpmdW5jdGlvbihhLGIpe3ZhciBzPUguTGgodGhpcykKcmV0
-dXJuIG5ldyBILlU1KHRoaXMscy5DKCJhMihjWC5FKSIpLmEoYikscy5DKCJVNTxjWC5FPiIpKX0sCnR0
-OmZ1bmN0aW9uKGEsYil7cmV0dXJuIFAuQ0godGhpcyxiLEguTGgodGhpcykuQygiY1guRSIpKX0sCmJy
-OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnR0KGEsITApfSwKZ0E6ZnVuY3Rpb24oYSl7dmFyIHMscj10
-aGlzLmdtKHRoaXMpCmZvcihzPTA7ci5GKCk7KSsrcwpyZXR1cm4gc30sCmdsMDpmdW5jdGlvbihhKXty
-ZXR1cm4hdGhpcy5nbSh0aGlzKS5GKCl9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIXRoaXMuZ2wwKHRo
-aXMpfSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5iSyh0aGlzLGIsSC5MaCh0aGlzKS5DKCJjWC5F
-IikpfSwKZ3I4OmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5nbSh0aGlzKQppZighci5GKCkpdGhyb3cg
-SC5iKEguV3AoKSkKcz1yLmdsKCkKaWYoci5GKCkpdGhyb3cgSC5iKEguQW0oKSkKcmV0dXJuIHN9LApF
-OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxClAuazEoYiwiaW5kZXgiKQpmb3Iocz10aGlzLmdtKHRoaXMp
-LHI9MDtzLkYoKTspe3E9cy5nbCgpCmlmKGI9PT1yKXJldHVybiBxOysrcn10aHJvdyBILmIoUC5DZihi
-LHRoaXMsImluZGV4IixudWxsLHIpKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuRVAodGhpcywiKCIs
-IikiKX19ClAuQW4ucHJvdG90eXBlPXt9ClAuTjMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1
-cm4iTWFwRW50cnkoIitILkVqKEouaih0aGlzLmEpKSsiOiAiK0guRWooSi5qKHRoaXMuYikpKyIpIn19
-ClAuYzgucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBQLk1oLnByb3RvdHlwZS5naU8u
-Y2FsbChDLmpOLHRoaXMpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4ibnVsbCJ9fQpQLk1oLnByb3RvdHlw
-ZT17Y29uc3RydWN0b3I6UC5NaCwkaU1oOjEsCkROOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXM9PT1i
-fSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBILmVRKHRoaXMpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4i
-SW5zdGFuY2Ugb2YgJyIrSC5FaihILk0odGhpcykpKyInIn0sCmU3OmZ1bmN0aW9uKGEsYil7dC5vLmEo
-YikKdGhyb3cgSC5iKFAubHIodGhpcyxiLmdXYSgpLGIuZ25kKCksYi5nVm0oKSkpfSwKdG9TdHJpbmc6
-ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53KHRoaXMpfX0KUC5aZC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9u
-KGEpe3JldHVybiIifSwKJGlHejoxfQpQLlJuLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVy
-biB0aGlzLmEubGVuZ3RofSwKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuY2hhckNv
-ZGVBdCgwKT09MD9zOnN9LAokaUJMOjF9ClAubjEucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2
-YXIgcyxyLHEscAp0LkouYShhKQpILmgoYikKcz1KLnJZKGIpLk9ZKGIsIj0iKQppZihzPT09LTEpe2lm
-KGIhPT0iIilhLlkoMCxQLmt1KGIsMCxiLmxlbmd0aCx0aGlzLmEsITApLCIiKX1lbHNlIGlmKHMhPT0w
-KXtyPUMueEIuTmooYiwwLHMpCnE9Qy54Qi5HKGIscysxKQpwPXRoaXMuYQphLlkoMCxQLmt1KHIsMCxy
-Lmxlbmd0aCxwLCEwKSxQLmt1KHEsMCxxLmxlbmd0aCxwLCEwKSl9cmV0dXJuIGF9LAokUzo0NX0KUC5j
-Uy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLnJyKCJJbGxlZ2FsIElQdjQg
-YWRkcmVzcywgIithLHRoaXMuYSxiKSl9LAokUzoyMX0KUC5WQy5wcm90b3R5cGU9ewokMjpmdW5jdGlv
-bihhLGIpe3Rocm93IEguYihQLnJyKCJJbGxlZ2FsIElQdjYgYWRkcmVzcywgIithLHRoaXMuYSxiKSl9
-LAokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy4kMihhLG51bGwpfSwKJFM6NTB9ClAuSlQucHJvdG90
-eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcwppZihiLWE+NCl0aGlzLmEuJDIoImFuIElQdjYgcGFy
-dCBjYW4gb25seSBjb250YWluIGEgbWF4aW11bSBvZiA0IGhleCBkaWdpdHMiLGEpCnM9UC5RQShDLnhC
-Lk5qKHRoaXMuYixhLGIpLDE2KQppZihzPDB8fHM+NjU1MzUpdGhpcy5hLiQyKCJlYWNoIHBhcnQgbXVz
-dCBiZSBpbiB0aGUgcmFuZ2Ugb2YgYDB4MC4uMHhGRkZGYCIsYSkKcmV0dXJuIHN9LAokUzo1Mn0KUC5E
-bi5wcm90b3R5cGU9ewpnbkQ6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoIW8ueSl7cz1v
-LmEKcj1zLmxlbmd0aCE9PTA/cysiOiI6IiIKcT1vLmMKcD1xPT1udWxsCmlmKCFwfHxzPT09ImZpbGUi
-KXtzPXIrIi8vIgpyPW8uYgppZihyLmxlbmd0aCE9PTApcz1zK3IrIkAiCmlmKCFwKXMrPXEKcj1vLmQK
-aWYociE9bnVsbClzPXMrIjoiK0guRWoocil9ZWxzZSBzPXIKcys9by5lCnI9by5mCmlmKHIhPW51bGwp
-cz1zKyI/IityCnI9by5yCmlmKHIhPW51bGwpcz1zKyIjIityCmlmKG8ueSl0aHJvdyBILmIoSC5jKCJG
-aWVsZCAnX3RleHQnIGhhcyBiZWVuIGFzc2lnbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4iKSkKby54
-PXMuY2hhckNvZGVBdCgwKT09MD9zOnMKby55PSEwfXJldHVybiBvLnh9LApnRmo6ZnVuY3Rpb24oKXt2
-YXIgcyxyLHE9dGhpcwppZighcS5RKXtzPXEuZQppZihzLmxlbmd0aCE9PTAmJkMueEIuVyhzLDApPT09
-NDcpcz1DLnhCLkcocywxKQpyPXMubGVuZ3RoPT09MD9DLnhEOlAuQUYobmV3IEgubEooSC5WTShzLnNw
-bGl0KCIvIiksdC5zKSx0LmRPLmEoUC5QSCgpKSx0LmRvKSx0Lk4pCmlmKHEuUSl0aHJvdyBILmIoSC5j
-KCJGaWVsZCAncGF0aFNlZ21lbnRzJyBoYXMgYmVlbiBhc3NpZ25lZCBkdXJpbmcgaW5pdGlhbGl6YXRp
-b24uIikpCnEuc0twKHIpCnEuUT0hMH1yZXR1cm4gcS56fSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBzLHI9
-dGhpcwppZighci5jeCl7cz1KLmhmKHIuZ25EKCkpCmlmKHIuY3gpdGhyb3cgSC5iKEguYygiRmllbGQg
-J2hhc2hDb2RlJyBoYXMgYmVlbiBhc3NpZ25lZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIikpCnIuY2g9
-cwpyLmN4PSEwfXJldHVybiByLmNofSwKZ2hZOmZ1bmN0aW9uKCl7dmFyIHMscj10aGlzCmlmKCFyLmRi
-KXtzPVAuV1goci5ndFAoKSkKaWYoci5kYil0aHJvdyBILmIoSC5jKCJGaWVsZCAncXVlcnlQYXJhbWV0
-ZXJzJyBoYXMgYmVlbiBhc3NpZ25lZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIikpCnIuc05NKG5ldyBQ
-LkdqKHMsdC5kdykpCnIuZGI9ITB9cmV0dXJuIHIuY3l9LApna3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp
-cy5ifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYwppZihzPT1udWxsKXJldHVybiIiCmlmKEMu
-eEIubihzLCJbIikpcmV0dXJuIEMueEIuTmoocywxLHMubGVuZ3RoLTEpCnJldHVybiBzfSwKZ3RwOmZ1
-bmN0aW9uKGEpe3ZhciBzPXRoaXMuZApyZXR1cm4gcz09bnVsbD9QLndLKHRoaXMuYSk6c30sCmd0UDpm
-dW5jdGlvbigpe3ZhciBzPXRoaXMuZgpyZXR1cm4gcz09bnVsbD8iIjpzfSwKZ0thOmZ1bmN0aW9uKCl7
-dmFyIHM9dGhpcy5yCnJldHVybiBzPT1udWxsPyIiOnN9LApubTpmdW5jdGlvbihhLGIpe3ZhciBzLHIs
-cSxwLG8sbixtLGwsayxqPXRoaXMKdC5jOS5hKGIpCnM9ai5hCnI9cz09PSJmaWxlIgpxPWouYgpwPWou
-ZApvPWouYwppZighKG8hPW51bGwpKW89cS5sZW5ndGghPT0wfHxwIT1udWxsfHxyPyIiOm51bGwKbj1q
-LmUKaWYoIXIpbT1vIT1udWxsJiZuLmxlbmd0aCE9PTAKZWxzZSBtPSEwCmlmKG0mJiFDLnhCLm4obiwi
-LyIpKW49Ii8iK24KbD1uCms9UC5sZShudWxsLDAsMCxiKQpyZXR1cm4gbmV3IFAuRG4ocyxxLG8scCxs
-LGssai5yKX0sCkpoOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuCmZvcihzPTAscj0wO0MueEIu
-UWkoYiwiLi4vIixyKTspe3IrPTM7KytzfXE9Qy54Qi5jbihhLCIvIikKd2hpbGUoITApe2lmKCEocT4w
-JiZzPjApKWJyZWFrCnA9Qy54Qi5QayhhLCIvIixxLTEpCmlmKHA8MClicmVhawpvPXEtcApuPW8hPT0y
-CmlmKCFufHxvPT09MylpZihDLnhCLk8yKGEscCsxKT09PTQ2KW49IW58fEMueEIuTzIoYSxwKzIpPT09
-NDYKZWxzZSBuPSExCmVsc2Ugbj0hMQppZihuKWJyZWFrOy0tcwpxPXB9cmV0dXJuIEMueEIuaTcoYSxx
-KzEsbnVsbCxDLnhCLkcoYixyLTMqcykpfSwKWkk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubVMoUC5o
-SyhhKSl9LAptUzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaj10aGlzLGk9bnVsbApp
-ZihhLmdGaSgpLmxlbmd0aCE9PTApe3M9YS5nRmkoKQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdK
-ZihhKQpwPWEuZ3hBKCk/YS5ndHAoYSk6aX1lbHNle3A9aQpxPXAKcj0iIn1vPVAueGUoYS5nSWkoYSkp
-Cm49YS5nUUQoKT9hLmd0UCgpOml9ZWxzZXtzPWouYQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdK
-ZihhKQpwPVAud0IoYS5neEEoKT9hLmd0cChhKTppLHMpCm89UC54ZShhLmdJaShhKSkKbj1hLmdRRCgp
-P2EuZ3RQKCk6aX1lbHNle3I9ai5iCnE9ai5jCnA9ai5kCmlmKGEuZ0lpKGEpPT09IiIpe289ai5lCm49
-YS5nUUQoKT9hLmd0UCgpOmouZn1lbHNle2lmKGEuZ3RUKCkpbz1QLnhlKGEuZ0lpKGEpKQplbHNle209
-ai5lCmlmKG0ubGVuZ3RoPT09MClpZihxPT1udWxsKW89cy5sZW5ndGg9PT0wP2EuZ0lpKGEpOlAueGUo
-YS5nSWkoYSkpCmVsc2Ugbz1QLnhlKCIvIithLmdJaShhKSkKZWxzZXtsPWouSmgobSxhLmdJaShhKSkK
-az1zLmxlbmd0aD09PTAKaWYoIWt8fHEhPW51bGx8fEMueEIubihtLCIvIikpbz1QLnhlKGwpCmVsc2Ug
-bz1QLndGKGwsIWt8fHEhPW51bGwpfX1uPWEuZ1FEKCk/YS5ndFAoKTppfX19cmV0dXJuIG5ldyBQLkRu
-KHMscixxLHAsbyxuLGEuZ1o4KCk/YS5nS2EoKTppKX0sCmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlz
-LmMhPW51bGx9LApneEE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kIT1udWxsfSwKZ1FEOmZ1bmN0aW9u
-KCl7cmV0dXJuIHRoaXMuZiE9bnVsbH0sCmdaODpmdW5jdGlvbigpe3JldHVybiB0aGlzLnIhPW51bGx9
-LApndFQ6ZnVuY3Rpb24oKXtyZXR1cm4gQy54Qi5uKHRoaXMuZSwiLyIpfSwKdDQ6ZnVuY3Rpb24oKXt2
-YXIgcyxyPXRoaXMscT1yLmEKaWYocSE9PSIiJiZxIT09ImZpbGUiKXRocm93IEguYihQLkw0KCJDYW5u
-b3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgIitxKyIgVVJJIikpCmlmKHIuZ3RQKCkhPT0iIil0
-aHJvdyBILmIoUC5MNCh1LmkpKQppZihyLmdLYSgpIT09IiIpdGhyb3cgSC5iKFAuTDQodS5sKSkKcT0k
-LndRKCkKaWYoSC5vVChxKSlxPVAubW4ocikKZWxzZXtpZihyLmMhPW51bGwmJnIuZ0pmKHIpIT09IiIp
-SC52KFAuTDQodS5qKSkKcz1yLmdGaigpClAua0UocywhMSkKcT1QLnZnKEMueEIubihyLmUsIi8iKT8i
-LyI6IiIscywiLyIpCnE9cS5jaGFyQ29kZUF0KDApPT0wP3E6cX1yZXR1cm4gcX0sCnc6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMuZ25EKCl9LApETjpmdW5jdGlvbihhLGIpe3ZhciBzPXRoaXMKaWYoYj09bnVs
-bClyZXR1cm4hMQppZihzPT09YilyZXR1cm4hMApyZXR1cm4gdC5kRC5iKGIpJiZzLmE9PT1iLmdGaSgp
-JiZzLmMhPW51bGw9PT1iLmdjaigpJiZzLmI9PT1iLmdrdSgpJiZzLmdKZihzKT09PWIuZ0pmKGIpJiZz
-Lmd0cChzKT09PWIuZ3RwKGIpJiZzLmU9PT1iLmdJaShiKSYmcy5mIT1udWxsPT09Yi5nUUQoKSYmcy5n
-dFAoKT09PWIuZ3RQKCkmJnMuciE9bnVsbD09PWIuZ1o4KCkmJnMuZ0thKCk9PT1iLmdLYSgpfSwKc0tw
-OmZ1bmN0aW9uKGEpe3RoaXMuej10LmJrLmEoYSl9LApzTk06ZnVuY3Rpb24oYSl7dGhpcy5jeT10LmNa
-LmEoYSl9LAokaWlEOjEsCmdGaTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF9LApnSWk6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMuZX19ClAuUloucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIFAu
-ZVAoQy5aSixILmgoYSksQy54TSwhMSl9LAokUzo1fQpQLk1FLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9u
-KGEsYil7dmFyIHM9dGhpcy5iLHI9dGhpcy5hCnMuYSs9ci5hCnIuYT0iJiIKcj1zLmErPUguRWooUC5l
-UChDLkYzLGEsQy54TSwhMCkpCmlmKGIhPW51bGwmJmIubGVuZ3RoIT09MCl7cy5hPXIrIj0iCnMuYSs9
-SC5FaihQLmVQKEMuRjMsYixDLnhNLCEwKSl9fSwKJFM6MjJ9ClAueTUucHJvdG90eXBlPXsKJDI6ZnVu
-Y3Rpb24oYSxiKXt2YXIgcyxyCkguaChhKQppZihiPT1udWxsfHx0eXBlb2YgYj09InN0cmluZyIpdGhp
-cy5hLiQyKGEsSC5rKGIpKQplbHNlIGZvcihzPUouSVQodC51LmEoYikpLHI9dGhpcy5hO3MuRigpOyly
-LiQyKGEsSC5oKHMuZ2woKSkpfSwKJFM6MTN9ClAuUEUucHJvdG90eXBlPXsKZ2xSOmZ1bmN0aW9uKCl7
-dmFyIHMscixxLHAsbz10aGlzLG49bnVsbCxtPW8uYwppZihtPT1udWxsKXttPW8uYgppZigwPj1tLmxl
-bmd0aClyZXR1cm4gSC5PSChtLDApCnM9by5hCm09bVswXSsxCnI9Qy54Qi5YVShzLCI/IixtKQpxPXMu
-bGVuZ3RoCmlmKHI+PTApe3A9UC5QSShzLHIrMSxxLEMuVkMsITEpCnE9cn1lbHNlIHA9bgptPW8uYz1u
-ZXcgUC5xZSgiZGF0YSIsIiIsbixuLFAuUEkocyxtLHEsQy5XZCwhMSkscCxuKX1yZXR1cm4gbX0sCnc6
-ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLmIKaWYoMD49ci5sZW5ndGgpcmV0dXJuIEguT0gociwwKQpz
-PXRoaXMuYQpyZXR1cm4gclswXT09PS0xPyJkYXRhOiIrczpzfX0KUC5xMy5wcm90b3R5cGU9ewokMTpm
-dW5jdGlvbihhKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoOTYpfSwKJFM6MjN9ClAueUkucHJvdG90eXBl
-PXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLmEKaWYoYT49MjIpcmV0dXJuIEguT0gocyxhKQpz
-PXNbYV0KSi5DTShzLDAsOTYsYikKcmV0dXJuIHN9LAokUzoyNH0KUC5jNi5wcm90b3R5cGU9ewokMzpm
-dW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAKZm9yKHM9Yi5sZW5ndGgscj1hLmxlbmd0aCxxPTA7cTxz
-OysrcSl7cD1DLnhCLlcoYixxKV45NgppZihwPj1yKXJldHVybiBILk9IKGEscCkKYVtwXT1jfX0sCiRT
-OjE0fQpQLnFkLnByb3RvdHlwZT17CiQzOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscApmb3Iocz1D
-LnhCLlcoYiwwKSxyPUMueEIuVyhiLDEpLHE9YS5sZW5ndGg7czw9cjsrK3Mpe3A9KHNeOTYpPj4+MApp
-ZihwPj1xKXJldHVybiBILk9IKGEscCkKYVtwXT1jfX0sCiRTOjE0fQpQLlVmLnByb3RvdHlwZT17Cmdj
-ajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmM+MH0sCmd4QTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmM+
-MCYmdGhpcy5kKzE8dGhpcy5lfSwKZ1FEOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZjx0aGlzLnJ9LApn
-Wjg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yPHRoaXMuYS5sZW5ndGh9LApnTnc6ZnVuY3Rpb24oKXty
-ZXR1cm4gdGhpcy5iPT09NCYmQy54Qi5uKHRoaXMuYSwiZmlsZSIpfSwKZ1daOmZ1bmN0aW9uKCl7cmV0
-dXJuIHRoaXMuYj09PTQmJkMueEIubih0aGlzLmEsImh0dHAiKX0sCmdSZTpmdW5jdGlvbigpe3JldHVy
-biB0aGlzLmI9PT01JiZDLnhCLm4odGhpcy5hLCJodHRwcyIpfSwKZ3RUOmZ1bmN0aW9uKCl7cmV0dXJu
-IEMueEIuUWkodGhpcy5hLCIvIix0aGlzLmUpfSwKZ0ZpOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy54CnJl
-dHVybiBzPT1udWxsP3RoaXMueD10aGlzLlUyKCk6c30sClUyOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcyxy
-PXMuYgppZihyPD0wKXJldHVybiIiCmlmKHMuZ1daKCkpcmV0dXJuImh0dHAiCmlmKHMuZ1JlKCkpcmV0
-dXJuImh0dHBzIgppZihzLmdOdygpKXJldHVybiJmaWxlIgppZihyPT09NyYmQy54Qi5uKHMuYSwicGFj
-a2FnZSIpKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gQy54Qi5OaihzLmEsMCxyKX0sCmdrdTpmdW5jdGlv
-bigpe3ZhciBzPXRoaXMuYyxyPXRoaXMuYiszCnJldHVybiBzPnI/Qy54Qi5Oaih0aGlzLmEscixzLTEp
-OiIifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYwpyZXR1cm4gcz4wP0MueEIuTmoodGhpcy5h
-LHMsdGhpcy5kKToiIn0sCmd0cDpmdW5jdGlvbihhKXt2YXIgcz10aGlzCmlmKHMuZ3hBKCkpcmV0dXJu
-IFAuUUEoQy54Qi5OaihzLmEscy5kKzEscy5lKSxudWxsKQppZihzLmdXWigpKXJldHVybiA4MAppZihz
-LmdSZSgpKXJldHVybiA0NDMKcmV0dXJuIDB9LApnSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIuTmoo
-dGhpcy5hLHRoaXMuZSx0aGlzLmYpfSwKZ3RQOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5mLHI9dGhpcy5y
-CnJldHVybiBzPHI/Qy54Qi5Oaih0aGlzLmEscysxLHIpOiIifSwKZ0thOmZ1bmN0aW9uKCl7dmFyIHM9
-dGhpcy5yLHI9dGhpcy5hCnJldHVybiBzPHIubGVuZ3RoP0MueEIuRyhyLHMrMSk6IiJ9LApnRmo6ZnVu
-Y3Rpb24oKXt2YXIgcyxyLHE9dGhpcy5lLHA9dGhpcy5mLG89dGhpcy5hCmlmKEMueEIuUWkobywiLyIs
-cSkpKytxCmlmKHE9PT1wKXJldHVybiBDLnhECnM9SC5WTShbXSx0LnMpCmZvcihyPXE7cjxwOysrcilp
-ZihDLnhCLk8yKG8scik9PT00Nyl7Qy5ObS5pKHMsQy54Qi5OaihvLHEscikpCnE9cisxfUMuTm0uaShz
-LEMueEIuTmoobyxxLHApKQpyZXR1cm4gUC5BRihzLHQuTil9LApnaFk6ZnVuY3Rpb24oKXtpZih0aGlz
-LmY+PXRoaXMucilyZXR1cm4gQy5DTQpyZXR1cm4gbmV3IFAuR2ooUC5XWCh0aGlzLmd0UCgpKSx0LmR3
-KX0sCmtYOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuZCsxCnJldHVybiBzK2EubGVuZ3RoPT09dGhpcy5l
-JiZDLnhCLlFpKHRoaXMuYSxhLHMpfSwKTjk6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLHI9cy5yLHE9cy5h
-CmlmKHI+PXEubGVuZ3RoKXJldHVybiBzCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKHEsMCxyKSxzLmIs
-cy5jLHMuZCxzLmUscy5mLHIscy54KX0sCm5tOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuLG0s
-bCxrLGosaT10aGlzLGg9bnVsbAp0LmM5LmEoYikKcz1pLmdGaSgpCnI9cz09PSJmaWxlIgpxPWkuYwpw
-PXE+MD9DLnhCLk5qKGkuYSxpLmIrMyxxKToiIgpvPWkuZ3hBKCk/aS5ndHAoaSk6aApxPWkuYwppZihx
-PjApbj1DLnhCLk5qKGkuYSxxLGkuZCkKZWxzZSBuPXAubGVuZ3RoIT09MHx8byE9bnVsbHx8cj8iIjpo
-CnE9aS5hCm09Qy54Qi5OaihxLGkuZSxpLmYpCmlmKCFyKWw9biE9bnVsbCYmbS5sZW5ndGghPT0wCmVs
-c2UgbD0hMAppZihsJiYhQy54Qi5uKG0sIi8iKSltPSIvIittCms9UC5sZShoLDAsMCxiKQpsPWkucgpq
-PWw8cS5sZW5ndGg/Qy54Qi5HKHEsbCsxKTpoCnJldHVybiBuZXcgUC5EbihzLHAsbixvLG0sayxqKX0s
-ClpJOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVM6ZnVuY3Rpb24oYSl7aWYo
-YSBpbnN0YW5jZW9mIFAuVWYpcmV0dXJuIHRoaXMudTEodGhpcyxhKQpyZXR1cm4gdGhpcy52cygpLm1T
-KGEpfSwKdTE6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZz1iLmIKaWYo
-Zz4wKXJldHVybiBiCnM9Yi5jCmlmKHM+MCl7cj1hLmIKaWYocjw9MClyZXR1cm4gYgppZihhLmdOdygp
-KXE9Yi5lIT09Yi5mCmVsc2UgaWYoYS5nV1ooKSlxPSFiLmtYKCI4MCIpCmVsc2UgcT0hYS5nUmUoKXx8
-IWIua1goIjQ0MyIpCmlmKHEpe3A9cisxCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSwwLHApK0Mu
-eEIuRyhiLmEsZysxKSxyLHMrcCxiLmQrcCxiLmUrcCxiLmYrcCxiLnIrcCxhLngpfWVsc2UgcmV0dXJu
-IHRoaXMudnMoKS5tUyhiKX1vPWIuZQpnPWIuZgppZihvPT09Zyl7cz1iLnIKaWYoZzxzKXtyPWEuZgpw
-PXItZwpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLkcoYi5hLGcpLGEuYixhLmMs
-YS5kLGEuZSxnK3AscytwLGEueCl9Zz1iLmEKaWYoczxnLmxlbmd0aCl7cj1hLnIKcmV0dXJuIG5ldyBQ
-LlVmKEMueEIuTmooYS5hLDAscikrQy54Qi5HKGcscyksYS5iLGEuYyxhLmQsYS5lLGEuZixzKyhyLXMp
-LGEueCl9cmV0dXJuIGEuTjkoKX1zPWIuYQppZihDLnhCLlFpKHMsIi8iLG8pKXtyPWEuZQpwPXItbwpy
-ZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLkcocyxvKSxhLmIsYS5jLGEuZCxyLGcr
-cCxiLnIrcCxhLngpfW49YS5lCm09YS5mCmlmKG49PT1tJiZhLmM+MCl7Zm9yKDtDLnhCLlFpKHMsIi4u
-LyIsbyk7KW8rPTMKcD1uLW8rMQpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxuKSsiLyIrQy54
-Qi5HKHMsbyksYS5iLGEuYyxhLmQsbixnK3AsYi5yK3AsYS54KX1sPWEuYQpmb3Ioaz1uO0MueEIuUWko
-bCwiLi4vIixrKTspays9MwpqPTAKd2hpbGUoITApe2k9byszCmlmKCEoaTw9ZyYmQy54Qi5RaShzLCIu
-Li8iLG8pKSlicmVhazsrK2oKbz1pfWZvcihoPSIiO20+azspey0tbQppZihDLnhCLk8yKGwsbSk9PT00
-Nyl7aWYoaj09PTApe2g9Ii8iCmJyZWFrfS0tagpoPSIvIn19aWYobT09PWsmJmEuYjw9MCYmIUMueEIu
-UWkobCwiLyIsbikpe28tPWoqMwpoPSIifXA9bS1vK2gubGVuZ3RoCnJldHVybiBuZXcgUC5VZihDLnhC
-Lk5qKGwsMCxtKStoK0MueEIuRyhzLG8pLGEuYixhLmMsYS5kLG4sZytwLGIucitwLGEueCl9LAp0NDpm
-dW5jdGlvbigpe3ZhciBzLHIscSxwPXRoaXMKaWYocC5iPj0wJiYhcC5nTncoKSl0aHJvdyBILmIoUC5M
-NCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhICIrcC5nRmkoKSsiIFVSSSIpKQpzPXAu
-ZgpyPXAuYQppZihzPHIubGVuZ3RoKXtpZihzPHAucil0aHJvdyBILmIoUC5MNCh1LmkpKQp0aHJvdyBI
-LmIoUC5MNCh1LmwpKX1xPSQud1EoKQppZihILm9UKHEpKXM9UC5tbihwKQplbHNle2lmKHAuYzxwLmQp
-SC52KFAuTDQodS5qKSkKcz1DLnhCLk5qKHIscC5lLHMpfXJldHVybiBzfSwKZ2lPOmZ1bmN0aW9uKGEp
-e3ZhciBzPXRoaXMueQpyZXR1cm4gcz09bnVsbD90aGlzLnk9Qy54Qi5naU8odGhpcy5hKTpzfSwKRE46
-ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCmlmKHRoaXM9PT1iKXJldHVybiEwCnJldHVy
-biB0LmRELmIoYikmJnRoaXMuYT09PWIudygwKX0sCnZzOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcyxyPW51
-bGwscT1zLmdGaSgpLHA9cy5na3UoKSxvPXMuYz4wP3MuZ0pmKHMpOnIsbj1zLmd4QSgpP3MuZ3RwKHMp
-OnIsbT1zLmEsbD1zLmYsaz1DLnhCLk5qKG0scy5lLGwpLGo9cy5yCmw9bDxqP3MuZ3RQKCk6cgpyZXR1
-cm4gbmV3IFAuRG4ocSxwLG8sbixrLGwsajxtLmxlbmd0aD9zLmdLYSgpOnIpfSwKdzpmdW5jdGlvbihh
-KXtyZXR1cm4gdGhpcy5hfSwKJGlpRDoxfQpQLnFlLnByb3RvdHlwZT17fQpXLnFFLnByb3RvdHlwZT17
-fQpXLkdoLnByb3RvdHlwZT17CnNMVTpmdW5jdGlvbihhLGIpe2EuaHJlZj1ifSwKdzpmdW5jdGlvbihh
-KXtyZXR1cm4gU3RyaW5nKGEpfSwKJGlHaDoxfQpXLmZZLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7
-cmV0dXJuIFN0cmluZyhhKX19ClcubkIucHJvdG90eXBlPXskaW5COjF9ClcuQXoucHJvdG90eXBlPXsk
-aUF6OjF9ClcuUVAucHJvdG90eXBlPXskaVFQOjF9ClcubngucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24o
-YSl7cmV0dXJuIGEubGVuZ3RofX0KVy5vSi5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4g
-YS5sZW5ndGh9fQpXLmlkLnByb3RvdHlwZT17fQpXLlFGLnByb3RvdHlwZT17fQpXLk5oLnByb3RvdHlw
-ZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX19ClcuYWUucHJvdG90eXBlPXsKRGM6ZnVu
-Y3Rpb24oYSxiKXtyZXR1cm4gYS5jcmVhdGVIVE1MRG9jdW1lbnQoYil9fQpXLklCLnByb3RvdHlwZT17
-Cnc6ZnVuY3Rpb24oYSl7dmFyIHMscj1hLmxlZnQKci50b1N0cmluZwpyPSJSZWN0YW5nbGUgKCIrSC5F
-aihyKSsiLCAiCnM9YS50b3AKcy50b1N0cmluZwpzPXIrSC5FaihzKSsiKSAiCnI9YS53aWR0aApyLnRv
-U3RyaW5nCnI9cytILkVqKHIpKyIgeCAiCnM9YS5oZWlnaHQKcy50b1N0cmluZwpyZXR1cm4gcitILkVq
-KHMpfSwKRE46ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmlmKGI9PW51bGwpcmV0dXJuITEKaWYodC5xLmIo
-Yikpe3M9YS5sZWZ0CnMudG9TdHJpbmcKcj1iLmxlZnQKci50b1N0cmluZwppZihzPT09cil7cz1hLnRv
-cApzLnRvU3RyaW5nCnI9Yi50b3AKci50b1N0cmluZwppZihzPT09cil7cz1hLndpZHRoCnMudG9TdHJp
-bmcKcj1iLndpZHRoCnIudG9TdHJpbmcKaWYocz09PXIpe3M9YS5oZWlnaHQKcy50b1N0cmluZwpyPWIu
-aGVpZ2h0CnIudG9TdHJpbmcKcj1zPT09cgpzPXJ9ZWxzZSBzPSExfWVsc2Ugcz0hMX1lbHNlIHM9ITF9
-ZWxzZSBzPSExCnJldHVybiBzfSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPWEubGVmdApwLnRv
-U3RyaW5nCnA9Qy5DRC5naU8ocCkKcz1hLnRvcApzLnRvU3RyaW5nCnM9Qy5DRC5naU8ocykKcj1hLndp
-ZHRoCnIudG9TdHJpbmcKcj1DLkNELmdpTyhyKQpxPWEuaGVpZ2h0CnEudG9TdHJpbmcKcmV0dXJuIFcu
-ckUocCxzLHIsQy5DRC5naU8ocSkpfSwKJGl0bjoxfQpXLm43LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9u
-KGEpe3JldHVybiBhLmxlbmd0aH19Clcud3oucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJu
-IHRoaXMuYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7dmFyIHMKSC51UChiKQpzPXRoaXMuYQppZihi
-PDB8fGI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsYikKcmV0dXJuIHRoaXMuJHRpLmMuYShzW2JdKX0s
-Clk6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJHRpLmMuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1v
-ZGlmeSBsaXN0IikpfX0KVy5jdi5wcm90b3R5cGU9ewpnUWc6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBX
-Lmk3KGEpfSwKZ0Q6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBXLkk0KGEpfSwKc0Q6ZnVuY3Rpb24oYSxi
-KXt2YXIgcwp0LlEuYShiKQpzPXRoaXMuZ0QoYSkKcy5WMSgwKQpzLkZWKDAsYil9LAp3OmZ1bmN0aW9u
-KGEpe3JldHVybiBhLmxvY2FsTmFtZX0sCkZGOmZ1bmN0aW9uKGEpe3ZhciBzPSEhYS5zY3JvbGxJbnRv
-Vmlld0lmTmVlZGVkCmlmKHMpYS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCkKZWxzZSBhLnNjcm9sbElu
-dG9WaWV3KCl9LApuejpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzLHI9dGhpcy5yNihhLGMsZCxlKQpz
-d2l0Y2goYi50b0xvd2VyQ2FzZSgpKXtjYXNlImJlZm9yZWJlZ2luIjpzPWEucGFyZW50Tm9kZQpzLnRv
-U3RyaW5nCkouRWgocyxyLGEpCmJyZWFrCmNhc2UiYWZ0ZXJiZWdpbiI6cz1hLmNoaWxkTm9kZXMKdGhp
-cy5tSyhhLHIscy5sZW5ndGg+MD9zWzBdOm51bGwpCmJyZWFrCmNhc2UiYmVmb3JlZW5kIjphLmFwcGVu
-ZENoaWxkKHIpCmJyZWFrCmNhc2UiYWZ0ZXJlbmQiOnM9YS5wYXJlbnROb2RlCnMudG9TdHJpbmcKSi5F
-aChzLHIsYS5uZXh0U2libGluZykKYnJlYWsKZGVmYXVsdDpILnYoUC54WSgiSW52YWxpZCBwb3NpdGlv
-biAiK2IpKX19LApyNjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscAppZihjPT1udWxsKXtpZihk
-PT1udWxsKXtzPSQubHQKaWYocz09bnVsbCl7cz1ILlZNKFtdLHQudikKcj1uZXcgVy52RChzKQpDLk5t
-LmkocyxXLlR3KG51bGwpKQpDLk5tLmkocyxXLkJsKCkpCiQubHQ9cgpkPXJ9ZWxzZSBkPXN9cz0kLkVV
-CmlmKHM9PW51bGwpe3M9bmV3IFcuS28oZCkKJC5FVT1zCmM9c31lbHNle3MuYT1kCmM9c319ZWxzZSBp
-ZihkIT1udWxsKXRocm93IEguYihQLnhZKCJ2YWxpZGF0b3IgY2FuIG9ubHkgYmUgcGFzc2VkIGlmIHRy
-ZWVTYW5pdGl6ZXIgaXMgbnVsbCIpKQppZigkLnhvPT1udWxsKXtzPWRvY3VtZW50CnI9cy5pbXBsZW1l
-bnRhdGlvbgpyLnRvU3RyaW5nCnI9Qy5tSC5EYyhyLCIiKQokLnhvPXIKJC5CTz1yLmNyZWF0ZVJhbmdl
-KCkKcj0kLnhvLmNyZWF0ZUVsZW1lbnQoImJhc2UiKQp0LmNSLmEocikKcz1zLmJhc2VVUkkKcy50b1N0
-cmluZwpyLmhyZWY9cwokLnhvLmhlYWQuYXBwZW5kQ2hpbGQocil9cz0kLnhvCmlmKHMuYm9keT09bnVs
-bCl7cj1zLmNyZWF0ZUVsZW1lbnQoImJvZHkiKQpDLkJaLnNYRyhzLHQucC5hKHIpKX1zPSQueG8KaWYo
-dC5wLmIoYSkpe3M9cy5ib2R5CnMudG9TdHJpbmcKcT1zfWVsc2V7cy50b1N0cmluZwpxPXMuY3JlYXRl
-RWxlbWVudChhLnRhZ05hbWUpCiQueG8uYm9keS5hcHBlbmRDaGlsZChxKX1pZigiY3JlYXRlQ29udGV4
-dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBlJiYhQy5ObS50ZyhDLlNxLGEudGFn
-TmFtZSkpeyQuQk8uc2VsZWN0Tm9kZUNvbnRlbnRzKHEpCnM9JC5CTwpzLnRvU3RyaW5nCnA9cy5jcmVh
-dGVDb250ZXh0dWFsRnJhZ21lbnQoYj09bnVsbD8ibnVsbCI6Yil9ZWxzZXtKLndmKHEsYikKcD0kLnhv
-LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpmb3IoO3M9cS5maXJzdENoaWxkLHMhPW51bGw7KXAuYXBw
-ZW5kQ2hpbGQocyl9aWYocSE9PSQueG8uYm9keSlKLkx0KHEpCmMuUG4ocCkKZG9jdW1lbnQuYWRvcHRO
-b2RlKHApCnJldHVybiBwfSwKQUg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLnI2KGEsYixjLG51
-bGwpfSwKc2hmOmZ1bmN0aW9uKGEsYil7dGhpcy5ZQyhhLGIpfSwKcGs6ZnVuY3Rpb24oYSxiLGMpe3Ro
-aXMuc2E0KGEsbnVsbCkKYS5hcHBlbmRDaGlsZCh0aGlzLnI2KGEsYixudWxsLGMpKX0sCllDOmZ1bmN0
-aW9uKGEsYil7cmV0dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKc1JOOmZ1bmN0aW9uKGEsYil7YS5pbm5l
-ckhUTUw9Yn0sCmduczpmdW5jdGlvbihhKXtyZXR1cm4gYS50YWdOYW1lfSwKZ1ZsOmZ1bmN0aW9uKGEp
-e3JldHVybiBuZXcgVy5ldShhLCJjbGljayIsITEsdC5rKX0sCiRpY3Y6MX0KVy5Ddi5wcm90b3R5cGU9
-ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdC5oLmIodC5BLmEoYSkpfSwKJFM6MjZ9ClcuZWEucHJvdG90
-eXBlPXskaWVhOjF9ClcuRDAucHJvdG90eXBlPXsKT246ZnVuY3Rpb24oYSxiLGMsZCl7dC5idy5hKGMp
-CmlmKGMhPW51bGwpdGhpcy52KGEsYixjLGQpfSwKQjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMu
-T24oYSxiLGMsbnVsbCl9LAp2OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLmFkZEV2ZW50TGlzdGVu
-ZXIoYixILnRSKHQuYncuYShjKSwxKSxkKX0sCiRpRDA6MX0KVy5oSC5wcm90b3R5cGU9eyRpaEg6MX0K
-Vy5oNC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLmJyLnByb3Rv
-dHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19ClcuVmIucHJvdG90eXBlPXsKc1hH
-OmZ1bmN0aW9uKGEsYil7YS5ib2R5PWJ9fQpXLmZKLnByb3RvdHlwZT17CmVvOmZ1bmN0aW9uKGEsYixj
-LGQpe3JldHVybiBhLm9wZW4oYixjLCEwKX0sCiRpZko6MX0KVy53YS5wcm90b3R5cGU9e30KVy5TZy5w
-cm90b3R5cGU9eyRpU2c6MX0KVy51OC5wcm90b3R5cGU9ewpnRHI6ZnVuY3Rpb24oYSl7aWYoIm9yaWdp
-biIgaW4gYSlyZXR1cm4gYS5vcmlnaW4KcmV0dXJuIEguRWooYS5wcm90b2NvbCkrIi8vIitILkVqKGEu
-aG9zdCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAokaXU4OjF9ClcuQWoucHJvdG90
-eXBlPXskaUFqOjF9ClcuZTcucHJvdG90eXBlPXsKZ3I4OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYSxy
-PXMuY2hpbGROb2Rlcy5sZW5ndGgKaWYocj09PTApdGhyb3cgSC5iKFAuUFYoIk5vIGVsZW1lbnRzIikp
-CmlmKHI+MSl0aHJvdyBILmIoUC5QVigiTW9yZSB0aGFuIG9uZSBlbGVtZW50IikpCnM9cy5maXJzdENo
-aWxkCnMudG9TdHJpbmcKcmV0dXJuIHN9LApGVjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8KdC5l
-aC5hKGIpCmlmKGIgaW5zdGFuY2VvZiBXLmU3KXtzPWIuYQpyPXRoaXMuYQppZihzIT09cilmb3IocT1z
-LmNoaWxkTm9kZXMubGVuZ3RoLHA9MDtwPHE7KytwKXtvPXMuZmlyc3RDaGlsZApvLnRvU3RyaW5nCnIu
-YXBwZW5kQ2hpbGQobyl9cmV0dXJufWZvcihzPWIuZ20oYikscj10aGlzLmE7cy5GKCk7KXIuYXBwZW5k
-Q2hpbGQocy5nbCgpKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIKdC5BLmEoYykKcz10aGlzLmEK
-cj1zLmNoaWxkTm9kZXMKaWYoYjwwfHxiPj1yLmxlbmd0aClyZXR1cm4gSC5PSChyLGIpCnMucmVwbGFj
-ZUNoaWxkKGMscltiXSl9LApnbTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEuY2hpbGROb2RlcwpyZXR1
-cm4gbmV3IFcuVzkocyxzLmxlbmd0aCxILnoocykuQygiVzk8R20uRT4iKSl9LApnQTpmdW5jdGlvbihh
-KXtyZXR1cm4gdGhpcy5hLmNoaWxkTm9kZXMubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe3ZhciBzCkgu
-dVAoYikKcz10aGlzLmEuY2hpbGROb2RlcwppZihiPDB8fGI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMs
-YikKcmV0dXJuIHNbYl19fQpXLnVILnByb3RvdHlwZT17CndnOmZ1bmN0aW9uKGEpe3ZhciBzPWEucGFy
-ZW50Tm9kZQppZihzIT1udWxsKXMucmVtb3ZlQ2hpbGQoYSl9LApENDpmdW5jdGlvbihhKXt2YXIgcwpm
-b3IoO3M9YS5maXJzdENoaWxkLHMhPW51bGw7KWEucmVtb3ZlQ2hpbGQocyl9LAp3OmZ1bmN0aW9uKGEp
-e3ZhciBzPWEubm9kZVZhbHVlCnJldHVybiBzPT1udWxsP3RoaXMuVShhKTpzfSwKc2E0OmZ1bmN0aW9u
-KGEsYil7YS50ZXh0Q29udGVudD1ifSwKbUs6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmluc2VydEJl
-Zm9yZShiLGMpfSwKJGl1SDoxfQpXLkJILnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBh
-Lmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCmlmKGI+Pj4wIT09Ynx8Yj49YS5sZW5ndGgp
-dGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxsKSkKcmV0dXJuIGFbYl19LApZOmZ1bmN0aW9u
-KGEsYixjKXt0LkEuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBlbGVtZW50IG9mIGlt
-bXV0YWJsZSBMaXN0LiIpKX0sCmd0SDpmdW5jdGlvbihhKXtpZihhLmxlbmd0aD4wKXJldHVybiBhWzBd
-CnRocm93IEguYihQLlBWKCJObyBlbGVtZW50cyIpKX0sCkU6ZnVuY3Rpb24oYSxiKXtpZihiPDB8fGI+
-PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJuIGFbYl19LAokaWJROjEsCiRpWGo6MSwKJGlj
-WDoxLAokaXpNOjF9ClcuU04ucHJvdG90eXBlPXt9ClcuZXcucHJvdG90eXBlPXskaWV3OjF9ClcubHAu
-cHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5UYi5wcm90b3R5cGU9
-ewpyNjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQi
-IGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKcz1XLlU5KCI8
-dGFibGU+IitILkVqKGIpKyI8L3RhYmxlPiIsYyxkKQpyPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJh
-Z21lbnQoKQpyLnRvU3RyaW5nCnMudG9TdHJpbmcKbmV3IFcuZTcocikuRlYoMCxuZXcgVy5lNyhzKSkK
-cmV0dXJuIHJ9fQpXLkl2LnByb3RvdHlwZT17CnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxw
-CmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0
-dXJuIHRoaXMuRFcoYSxiLGMsZCkKcz1kb2N1bWVudApyPXMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgp
-CnM9Qy5JZS5yNihzLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpCnMudG9TdHJpbmcKcz1uZXcg
-Vy5lNyhzKQpxPXMuZ3I4KHMpCnEudG9TdHJpbmcKcz1uZXcgVy5lNyhxKQpwPXMuZ3I4KHMpCnIudG9T
-dHJpbmcKcC50b1N0cmluZwpuZXcgVy5lNyhyKS5GVigwLG5ldyBXLmU3KHApKQpyZXR1cm4gcn19Clcu
-V1AucHJvdG90eXBlPXsKcjY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxCmlmKCJjcmVhdGVDb250
-ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxi
-LGMsZCkKcz1kb2N1bWVudApyPXMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnM9Qy5JZS5yNihzLmNy
-ZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpCnMudG9TdHJpbmcKcz1uZXcgVy5lNyhzKQpxPXMuZ3I4
-KHMpCnIudG9TdHJpbmcKcS50b1N0cmluZwpuZXcgVy5lNyhyKS5GVigwLG5ldyBXLmU3KHEpKQpyZXR1
-cm4gcn19ClcueVkucHJvdG90eXBlPXsKcGs6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIKdGhpcy5zYTQo
-YSxudWxsKQpzPWEuY29udGVudApzLnRvU3RyaW5nCkouYlQocykKcj10aGlzLnI2KGEsYixudWxsLGMp
-CmEuY29udGVudC5hcHBlbmRDaGlsZChyKX0sCllDOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucGso
-YSxiLG51bGwpfSwKJGl5WToxfQpXLnc2LnByb3RvdHlwZT17fQpXLks1LnByb3RvdHlwZT17ClBvOmZ1
-bmN0aW9uKGEsYixjKXt2YXIgcz1XLlAxKGEub3BlbihiLGMpKQpyZXR1cm4gc30sCmdtVzpmdW5jdGlv
-bihhKXtyZXR1cm4gYS5sb2NhdGlvbn0sCnVzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuY29uZmlybShi
-KX0sCiRpSzU6MSwKJGl2NjoxfQpXLkNtLnByb3RvdHlwZT17JGlDbToxfQpXLkNRLnByb3RvdHlwZT17
-JGlDUToxfQpXLnc0LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHMscj1hLmxlZnQKci50b1N0
-cmluZwpyPSJSZWN0YW5nbGUgKCIrSC5FaihyKSsiLCAiCnM9YS50b3AKcy50b1N0cmluZwpzPXIrSC5F
-aihzKSsiKSAiCnI9YS53aWR0aApyLnRvU3RyaW5nCnI9cytILkVqKHIpKyIgeCAiCnM9YS5oZWlnaHQK
-cy50b1N0cmluZwpyZXR1cm4gcitILkVqKHMpfSwKRE46ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmlmKGI9
-PW51bGwpcmV0dXJuITEKaWYodC5xLmIoYikpe3M9YS5sZWZ0CnMudG9TdHJpbmcKcj1iLmxlZnQKci50
-b1N0cmluZwppZihzPT09cil7cz1hLnRvcApzLnRvU3RyaW5nCnI9Yi50b3AKci50b1N0cmluZwppZihz
-PT09cil7cz1hLndpZHRoCnMudG9TdHJpbmcKcj1iLndpZHRoCnIudG9TdHJpbmcKaWYocz09PXIpe3M9
-YS5oZWlnaHQKcy50b1N0cmluZwpyPWIuaGVpZ2h0CnIudG9TdHJpbmcKcj1zPT09cgpzPXJ9ZWxzZSBz
-PSExfWVsc2Ugcz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSExCnJldHVybiBzfSwKZ2lPOmZ1bmN0aW9uKGEp
-e3ZhciBzLHIscSxwPWEubGVmdApwLnRvU3RyaW5nCnA9Qy5DRC5naU8ocCkKcz1hLnRvcApzLnRvU3Ry
-aW5nCnM9Qy5DRC5naU8ocykKcj1hLndpZHRoCnIudG9TdHJpbmcKcj1DLkNELmdpTyhyKQpxPWEuaGVp
-Z2h0CnEudG9TdHJpbmcKcmV0dXJuIFcuckUocCxzLHIsQy5DRC5naU8ocSkpfX0KVy5yaC5wcm90b3R5
-cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC51UChi
-KQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93IEguYihQLkNmKGIsYSxudWxsLG51bGwsbnVs
-bCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7dC5BLmEoYykKdGhyb3cgSC5iKFAuTDQo
-IkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlzdC4iKSl9LApFOmZ1bmN0aW9uKGEs
-Yil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIpCnJldHVybiBhW2JdfSwKJGliUTox
-LAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpXLmNmLnByb3RvdHlwZT17Cks6ZnVuY3Rpb24oYSxiKXt2
-YXIgcyxyLHEscCxvCnQuZUEuYShiKQpmb3Iocz10aGlzLmdWKCkscj1zLmxlbmd0aCxxPXRoaXMuYSxw
-PTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcCl7bz1zW3BdCmIuJDIobyxx
-LmdldEF0dHJpYnV0ZShvKSl9fSwKZ1Y6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLmEu
-YXR0cmlidXRlcwptLnRvU3RyaW5nCnM9SC5WTShbXSx0LnMpCmZvcihyPW0ubGVuZ3RoLHE9dC5oOSxw
-PTA7cDxyOysrcCl7aWYocD49bS5sZW5ndGgpcmV0dXJuIEguT0gobSxwKQpvPXEuYShtW3BdKQppZihv
-Lm5hbWVzcGFjZVVSST09bnVsbCl7bj1vLm5hbWUKbi50b1N0cmluZwpDLk5tLmkocyxuKX19cmV0dXJu
-IHN9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ1YoKS5sZW5ndGg9PT0wfX0KVy5pNy5wcm90
-b3R5cGU9ewp4NDpmdW5jdGlvbihhKXt2YXIgcz1ILm9UKHRoaXMuYS5oYXNBdHRyaWJ1dGUoYSkpCnJl
-dHVybiBzfSwKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEuZ2V0QXR0cmlidXRlKEguaChiKSl9
-LApZOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmEuc2V0QXR0cmlidXRlKGIsYyl9LApnQTpmdW5jdGlvbihh
-KXtyZXR1cm4gdGhpcy5nVigpLmxlbmd0aH19ClcuU3kucHJvdG90eXBlPXsKeDQ6ZnVuY3Rpb24oYSl7
-dmFyIHM9SC5vVCh0aGlzLmEuYS5oYXNBdHRyaWJ1dGUoImRhdGEtIit0aGlzLk8oYSkpKQpyZXR1cm4g
-c30sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5hLmEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrdGhp
-cy5PKEguaChiKSkpfSwKWTpmdW5jdGlvbihhLGIsYyl7dGhpcy5hLmEuc2V0QXR0cmlidXRlKCJkYXRh
-LSIrdGhpcy5PKGIpLGMpfSwKSzpmdW5jdGlvbihhLGIpe3RoaXMuYS5LKDAsbmV3IFcuS1ModGhpcyx0
-LmVBLmEoYikpKX0sCmdWOmZ1bmN0aW9uKCl7dmFyIHM9SC5WTShbXSx0LnMpCnRoaXMuYS5LKDAsbmV3
-IFcuQTModGhpcyxzKSkKcmV0dXJuIHN9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nVigpLmxl
-bmd0aH0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nVigpLmxlbmd0aD09PTB9LAprOmZ1bmN0
-aW9uKGEpe3ZhciBzLHIscT1ILlZNKGEuc3BsaXQoIi0iKSx0LnMpCmZvcihzPTE7czxxLmxlbmd0aDsr
-K3Mpe3I9cVtzXQppZihyLmxlbmd0aD4wKUMuTm0uWShxLHMsclswXS50b1VwcGVyQ2FzZSgpK0ouS1Yo
-ciwxKSl9cmV0dXJuIEMuTm0uSChxLCIiKX0sCk86ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbwpmb3Io
-cz1hLmxlbmd0aCxyPTAscT0iIjtyPHM7KytyKXtwPWFbcl0Kbz1wLnRvTG93ZXJDYXNlKCkKcT0ocCE9
-PW8mJnI+MD9xKyItIjpxKStvfXJldHVybiBxLmNoYXJDb2RlQXQoMCk9PTA/cTpxfX0KVy5LUy5wcm90
-b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclkoYSkubihhLCJkYXRhLSIpKXRoaXMuYi4kMih0
-aGlzLmEuayhDLnhCLkcoYSw1KSksYil9LAokUzoxMH0KVy5BMy5wcm90b3R5cGU9ewokMjpmdW5jdGlv
-bihhLGIpe2lmKEouclkoYSkubihhLCJkYXRhLSIpKUMuTm0uaSh0aGlzLmIsdGhpcy5hLmsoQy54Qi5H
-KGEsNSkpKX0sCiRTOjEwfQpXLkk0LnByb3RvdHlwZT17ClA6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxv
-PVAuTHModC5OKQpmb3Iocz10aGlzLmEuY2xhc3NOYW1lLnNwbGl0KCIgIikscj1zLmxlbmd0aCxxPTA7
-cTxyOysrcSl7cD1KLlQwKHNbcV0pCmlmKHAubGVuZ3RoIT09MClvLmkoMCxwKX1yZXR1cm4gb30sClg6
-ZnVuY3Rpb24oYSl7dGhpcy5hLmNsYXNzTmFtZT10LkMuYShhKS5IKDAsIiAiKX0sCmdBOmZ1bmN0aW9u
-KGEpe3JldHVybiB0aGlzLmEuY2xhc3NMaXN0Lmxlbmd0aH0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4g
-dGhpcy5hLmNsYXNzTGlzdC5sZW5ndGg9PT0wfSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEu
-Y2xhc3NMaXN0Lmxlbmd0aCE9PTB9LApWMTpmdW5jdGlvbihhKXt0aGlzLmEuY2xhc3NOYW1lPSIifSwK
-dGc6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLmEuY2xhc3NMaXN0LmNvbnRhaW5zKGIpCnJldHVybiBz
-fSwKaTpmdW5jdGlvbihhLGIpe3ZhciBzLHIKSC5oKGIpCnM9dGhpcy5hLmNsYXNzTGlzdApyPXMuY29u
-dGFpbnMoYikKcy5hZGQoYikKcmV0dXJuIXJ9LApSOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxCmlmKHR5
-cGVvZiBiPT0ic3RyaW5nIil7cz10aGlzLmEuY2xhc3NMaXN0CnI9cy5jb250YWlucyhiKQpzLnJlbW92
-ZShiKQpxPXJ9ZWxzZSBxPSExCnJldHVybiBxfSwKRlY6ZnVuY3Rpb24oYSxiKXtXLlROKHRoaXMuYSx0
-LlEuYShiKSl9fQpXLkZrLnByb3RvdHlwZT17fQpXLlJPLnByb3RvdHlwZT17fQpXLmV1LnByb3RvdHlw
-ZT17fQpXLnhDLnByb3RvdHlwZT17fQpXLnZOLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVy
-biB0aGlzLmEuJDEodC5CLmEoYSkpfSwKJFM6Mjh9ClcuSlEucHJvdG90eXBlPXsKQ1k6ZnVuY3Rpb24o
-YSl7dmFyIHMKaWYoJC5vci5hPT09MCl7Zm9yKHM9MDtzPDI2MjsrK3MpJC5vci5ZKDAsQy5jbVtzXSxX
-LnBTKCkpCmZvcihzPTA7czwxMjsrK3MpJC5vci5ZKDAsQy5CSVtzXSxXLlY0KCkpfX0sCmkwOmZ1bmN0
-aW9uKGEpe3JldHVybiAkLkFOKCkudGcoMCxXLnJTKGEpKX0sCkViOmZ1bmN0aW9uKGEsYixjKXt2YXIg
-cz0kLm9yLnEoMCxILkVqKFcuclMoYSkpKyI6OiIrYikKaWYocz09bnVsbClzPSQub3IucSgwLCIqOjoi
-K2IpCmlmKHM9PW51bGwpcmV0dXJuITEKcmV0dXJuIEgueTgocy4kNChhLGIsYyx0aGlzKSl9LAokaWtG
-OjF9ClcuR20ucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBXLlc5KGEsdGhpcy5n
-QShhKSxILnooYSkuQygiVzk8R20uRT4iKSl9fQpXLnZELnByb3RvdHlwZT17CmkwOmZ1bmN0aW9uKGEp
-e3JldHVybiBDLk5tLlZyKHRoaXMuYSxuZXcgVy5VdihhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7cmV0
-dXJuIEMuTm0uVnIodGhpcy5hLG5ldyBXLkVnKGEsYixjKSl9LAokaWtGOjF9ClcuVXYucHJvdG90eXBl
-PXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuZjYuYShhKS5pMCh0aGlzLmEpfSwKJFM6MTV9ClcuRWcu
-cHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuZjYuYShhKS5FYih0aGlzLmEsdGhpcy5i
-LHRoaXMuYyl9LAokUzoxNX0KVy5tNi5wcm90b3R5cGU9ewpDWTpmdW5jdGlvbihhLGIsYyxkKXt2YXIg
-cyxyLHEKdGhpcy5hLkZWKDAsYykKcz1iLmV2KDAsbmV3IFcuRW8oKSkKcj1iLmV2KDAsbmV3IFcuV2so
-KSkKdGhpcy5iLkZWKDAscykKcT10aGlzLmMKcS5GVigwLEMueEQpCnEuRlYoMCxyKX0sCmkwOmZ1bmN0
-aW9uKGEpe3JldHVybiB0aGlzLmEudGcoMCxXLnJTKGEpKX0sCkViOmZ1bmN0aW9uKGEsYixjKXt2YXIg
-cz10aGlzLHI9Vy5yUyhhKSxxPXMuYwppZihxLnRnKDAsSC5FaihyKSsiOjoiK2IpKXJldHVybiBzLmQu
-RHQoYykKZWxzZSBpZihxLnRnKDAsIio6OiIrYikpcmV0dXJuIHMuZC5EdChjKQplbHNle3E9cy5iCmlm
-KHEudGcoMCxILkVqKHIpKyI6OiIrYikpcmV0dXJuITAKZWxzZSBpZihxLnRnKDAsIio6OiIrYikpcmV0
-dXJuITAKZWxzZSBpZihxLnRnKDAsSC5FaihyKSsiOjoqIikpcmV0dXJuITAKZWxzZSBpZihxLnRnKDAs
-Iio6OioiKSlyZXR1cm4hMH1yZXR1cm4hMX0sCiRpa0Y6MX0KVy5Fby5wcm90b3R5cGU9ewokMTpmdW5j
-dGlvbihhKXtyZXR1cm4hQy5ObS50ZyhDLkJJLEguaChhKSl9LAokUzo2fQpXLldrLnByb3RvdHlwZT17
-CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBDLk5tLnRnKEMuQkksSC5oKGEpKX0sCiRTOjZ9ClcuY3QucHJv
-dG90eXBlPXsKRWI6ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuakYoYSxiLGMpKXJldHVybiEwCmlmKGI9
-PT0idGVtcGxhdGUiJiZjPT09IiIpcmV0dXJuITAKaWYoYS5nZXRBdHRyaWJ1dGUoInRlbXBsYXRlIik9
-PT0iIilyZXR1cm4gdGhpcy5lLnRnKDAsYikKcmV0dXJuITF9fQpXLklBLnByb3RvdHlwZT17CiQxOmZ1
-bmN0aW9uKGEpe3JldHVybiJURU1QTEFURTo6IitILkVqKEguaChhKSl9LAokUzo1fQpXLk93LnByb3Rv
-dHlwZT17CmkwOmZ1bmN0aW9uKGEpe3ZhciBzCmlmKHQuZXcuYihhKSlyZXR1cm4hMQpzPXQuZzcuYihh
-KQppZihzJiZXLnJTKGEpPT09ImZvcmVpZ25PYmplY3QiKXJldHVybiExCmlmKHMpcmV0dXJuITAKcmV0
-dXJuITF9LApFYjpmdW5jdGlvbihhLGIsYyl7aWYoYj09PSJpcyJ8fEMueEIubihiLCJvbiIpKXJldHVy
-biExCnJldHVybiB0aGlzLmkwKGEpfSwKJGlrRjoxfQpXLlc5LnByb3RvdHlwZT17CkY6ZnVuY3Rpb24o
-KXt2YXIgcz10aGlzLHI9cy5jKzEscT1zLmIKaWYocjxxKXtzLnNwKEoueDkocy5hLHIpKQpzLmM9cgpy
-ZXR1cm4hMH1zLnNwKG51bGwpCnMuYz1xCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp
-cy5kfSwKc3A6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLkMoIjE/IikuYShhKX0sCiRpQW46MX0K
-Vy5kVy5wcm90b3R5cGU9eyRpRDA6MSwkaXY2OjF9ClcubWsucHJvdG90eXBlPXskaXkwOjF9ClcuS28u
-cHJvdG90eXBlPXsKUG46ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPW5ldyBXLmZtKHMpCnMuYj0hMQpy
-LiQyKGEsbnVsbCkKZm9yKDtzLmI7KXtzLmI9ITEKci4kMihhLG51bGwpfX0sCkVQOmZ1bmN0aW9uKGEs
-Yil7dmFyIHM9dGhpcy5iPSEwCmlmKGIhPW51bGw/YiE9PWEucGFyZW50Tm9kZTpzKUouTHQoYSkKZWxz
-ZSBiLnJlbW92ZUNoaWxkKGEpfSwKSTQ6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG49ITAsbT1u
-dWxsLGw9bnVsbAp0cnl7bT1KLmlnKGEpCmw9bS5hLmdldEF0dHJpYnV0ZSgiaXMiKQp0LmguYShhKQpz
-PWZ1bmN0aW9uKGMpe2lmKCEoYy5hdHRyaWJ1dGVzIGluc3RhbmNlb2YgTmFtZWROb2RlTWFwKSlyZXR1
-cm4gdHJ1ZQppZihjLmlkPT0nbGFzdENoaWxkJ3x8Yy5uYW1lPT0nbGFzdENoaWxkJ3x8Yy5pZD09J3By
-ZXZpb3VzU2libGluZyd8fGMubmFtZT09J3ByZXZpb3VzU2libGluZyd8fGMuaWQ9PSdjaGlsZHJlbid8
-fGMubmFtZT09J2NoaWxkcmVuJylyZXR1cm4gdHJ1ZQp2YXIgaz1jLmNoaWxkTm9kZXMKaWYoYy5sYXN0
-Q2hpbGQmJmMubGFzdENoaWxkIT09a1trLmxlbmd0aC0xXSlyZXR1cm4gdHJ1ZQppZihjLmNoaWxkcmVu
-KWlmKCEoYy5jaGlsZHJlbiBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9ufHxjLmNoaWxkcmVuIGluc3Rh
-bmNlb2YgTm9kZUxpc3QpKXJldHVybiB0cnVlCnZhciBqPTAKaWYoYy5jaGlsZHJlbilqPWMuY2hpbGRy
-ZW4ubGVuZ3RoCmZvcih2YXIgaT0wO2k8ajtpKyspe3ZhciBoPWMuY2hpbGRyZW5baV0KaWYoaC5pZD09
-J2F0dHJpYnV0ZXMnfHxoLm5hbWU9PSdhdHRyaWJ1dGVzJ3x8aC5pZD09J2xhc3RDaGlsZCd8fGgubmFt
-ZT09J2xhc3RDaGlsZCd8fGguaWQ9PSdwcmV2aW91c1NpYmxpbmcnfHxoLm5hbWU9PSdwcmV2aW91c1Np
-YmxpbmcnfHxoLmlkPT0nY2hpbGRyZW4nfHxoLm5hbWU9PSdjaGlsZHJlbicpcmV0dXJuIHRydWV9cmV0
-dXJuIGZhbHNlfShhKQpuPUgub1Qocyk/ITA6IShhLmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5v
-ZGVNYXApfWNhdGNoKHApe0guUnUocCl9cj0iZWxlbWVudCB1bnByaW50YWJsZSIKdHJ5e3I9Si5qKGEp
-fWNhdGNoKHApe0guUnUocCl9dHJ5e3E9Vy5yUyhhKQp0aGlzLmtSKHQuaC5hKGEpLGIsbixyLHEsdC5m
-LmEobSksSC5rKGwpKX1jYXRjaChwKXtpZihILlJ1KHApIGluc3RhbmNlb2YgUC51KXRocm93IHAKZWxz
-ZXt0aGlzLkVQKGEsYikKd2luZG93Cm89IlJlbW92aW5nIGNvcnJ1cHRlZCBlbGVtZW50ICIrSC5Faihy
-KQppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihvKX19fSwK
-a1I6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHMscixxLHAsbyxuLG09dGhpcwppZihjKXttLkVQ
-KGEsYikKd2luZG93CnM9IlJlbW92aW5nIGVsZW1lbnQgZHVlIHRvIGNvcnJ1cHRlZCBhdHRyaWJ1dGVz
-IG9uIDwiK2QrIj4iCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53
-YXJuKHMpCnJldHVybn1pZighbS5hLmkwKGEpKXttLkVQKGEsYikKd2luZG93CnM9IlJlbW92aW5nIGRp
-c2FsbG93ZWQgZWxlbWVudCA8IitILkVqKGUpKyI+IGZyb20gIitILkVqKGIpCmlmKHR5cGVvZiBjb25z
-b2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKHMpCnJldHVybn1pZihnIT1udWxsKWlm
-KCFtLmEuRWIoYSwiaXMiLGcpKXttLkVQKGEsYikKd2luZG93CnM9IlJlbW92aW5nIGRpc2FsbG93ZWQg
-dHlwZSBleHRlbnNpb24gPCIrSC5FaihlKSsnIGlzPSInK2crJyI+JwppZih0eXBlb2YgY29uc29sZSE9
-InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihzKQpyZXR1cm59cz1mLmdWKCkKcj1ILlZNKHMu
-c2xpY2UoMCksSC50NihzKSkKZm9yKHE9Zi5nVigpLmxlbmd0aC0xLHM9Zi5hO3E+PTA7LS1xKXtpZihx
-Pj1yLmxlbmd0aClyZXR1cm4gSC5PSChyLHEpCnA9cltxXQpvPW0uYQpuPUouY0gocCkKSC5oKHApCmlm
-KCFvLkViKGEsbixzLmdldEF0dHJpYnV0ZShwKSkpe3dpbmRvdwpvPSJSZW1vdmluZyBkaXNhbGxvd2Vk
-IGF0dHJpYnV0ZSA8IitILkVqKGUpKyIgIitwKyc9IicrSC5FaihzLmdldEF0dHJpYnV0ZShwKSkrJyI+
-JwppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihvKQpzLnJl
-bW92ZUF0dHJpYnV0ZShwKX19aWYodC5hVy5iKGEpKXtzPWEuY29udGVudApzLnRvU3RyaW5nCm0uUG4o
-cyl9fSwKJGlvbjoxfQpXLmZtLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAs
-byxuLG09dGhpcy5hCnN3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6bS5JNChhLGIpCmJyZWFrCmNhc2Ug
-ODpjYXNlIDExOmNhc2UgMzpjYXNlIDQ6YnJlYWsKZGVmYXVsdDptLkVQKGEsYil9cz1hLmxhc3RDaGls
-ZApmb3IocT10LkE7bnVsbCE9czspe3I9bnVsbAp0cnl7cj1zLnByZXZpb3VzU2libGluZwppZihyIT1u
-dWxsKXtwPXIubmV4dFNpYmxpbmcKbz1zCm89cD09bnVsbD9vIT1udWxsOnAhPT1vCnA9b31lbHNlIHA9
-ITEKaWYocCl7cD1QLlBWKCJDb3JydXB0IEhUTUwiKQp0aHJvdyBILmIocCl9fWNhdGNoKG4pe0guUnUo
-bikKcD1xLmEocykKbS5iPSEwCm89cC5wYXJlbnROb2RlCm89YT09bnVsbD9vIT1udWxsOmEhPT1vCmlm
-KG8pe289cC5wYXJlbnROb2RlCmlmKG8hPW51bGwpby5yZW1vdmVDaGlsZChwKX1lbHNlIGEucmVtb3Zl
-Q2hpbGQocCkKcz1udWxsCnI9YS5sYXN0Q2hpbGR9aWYocyE9bnVsbCl0aGlzLiQyKHMsYSkKcz1yfX0s
-CiRTOjMxfQpXLkxlLnByb3RvdHlwZT17fQpXLks3LnByb3RvdHlwZT17fQpXLnJCLnByb3RvdHlwZT17
-fQpXLlhXLnByb3RvdHlwZT17fQpXLm9hLnByb3RvdHlwZT17fQpQLmlKLnByb3RvdHlwZT17ClZIOmZ1
-bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5hLHE9ci5sZW5ndGgKZm9yKHM9MDtzPHE7KytzKWlmKHJbc109
-PT1hKXJldHVybiBzCkMuTm0uaShyLGEpCkMuTm0uaSh0aGlzLmIsbnVsbCkKcmV0dXJuIHF9LApQdjpm
-dW5jdGlvbihhKXt2YXIgcyxyLHEscD10aGlzLG89e30KaWYoYT09bnVsbClyZXR1cm4gYQppZihILmwo
-YSkpcmV0dXJuIGEKaWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKHR5cGVvZiBhPT0ic3Ry
-aW5nIilyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5pUClyZXR1cm4gbmV3IERhdGUoYS5hKQppZih0
-LmZ2LmIoYSkpdGhyb3cgSC5iKFAuU1koInN0cnVjdHVyZWQgY2xvbmUgb2YgUmVnRXhwIikpCmlmKHQu
-YzguYihhKSlyZXR1cm4gYQppZih0LncuYihhKSlyZXR1cm4gYQppZih0LkkuYihhKSlyZXR1cm4gYQpz
-PXQuZEUuYihhKXx8ITEKaWYocylyZXR1cm4gYQppZih0LmYuYihhKSl7cj1wLlZIKGEpCnM9cC5iCmlm
-KHI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscikKcT1vLmE9c1tyXQppZihxIT1udWxsKXJldHVybiBx
-CnE9e30Kby5hPXEKQy5ObS5ZKHMscixxKQphLksoMCxuZXcgUC5qZyhvLHApKQpyZXR1cm4gby5hfWlm
-KHQuai5iKGEpKXtyPXAuVkgoYSkKbz1wLmIKaWYocj49by5sZW5ndGgpcmV0dXJuIEguT0gobyxyKQpx
-PW9bcl0KaWYocSE9bnVsbClyZXR1cm4gcQpyZXR1cm4gcC5layhhLHIpfWlmKHQuZUguYihhKSl7cj1w
-LlZIKGEpCnM9cC5iCmlmKHI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscikKcT1vLmI9c1tyXQppZihx
-IT1udWxsKXJldHVybiBxCnE9e30Kby5iPXEKQy5ObS5ZKHMscixxKQpwLmltKGEsbmV3IFAuVGEobyxw
-KSkKcmV0dXJuIG8uYn10aHJvdyBILmIoUC5TWSgic3RydWN0dXJlZCBjbG9uZSBvZiBvdGhlciB0eXBl
-IikpfSwKZWs6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPUouVTYoYSkscT1yLmdBKGEpLHA9bmV3IEFycmF5
-KHEpCkMuTm0uWSh0aGlzLmIsYixwKQpmb3Iocz0wO3M8cTsrK3MpQy5ObS5ZKHAscyx0aGlzLlB2KHIu
-cShhLHMpKSkKcmV0dXJuIHB9fQpQLmpnLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5h
-LmFbYV09dGhpcy5iLlB2KGIpfSwKJFM6MzJ9ClAuVGEucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxi
-KXt0aGlzLmEuYlthXT10aGlzLmIuUHYoYil9LAokUzoxNn0KUC5CZi5wcm90b3R5cGU9ewppbTpmdW5j
-dGlvbihhLGIpe3ZhciBzLHIscSxwCnQuYjguYShiKQpmb3Iocz1PYmplY3Qua2V5cyhhKSxyPXMubGVu
-Z3RoLHE9MDtxPHI7KytxKXtwPXNbcV0KYi4kMihwLGFbcF0pfX19ClAuQXMucHJvdG90eXBlPXsKVDpm
-dW5jdGlvbihhKXt2YXIgcwpILmgoYSkKcz0kLmhHKCkuYgppZih0eXBlb2YgYSE9InN0cmluZyIpSC52
-KEgudEwoYSkpCmlmKHMudGVzdChhKSlyZXR1cm4gYQp0aHJvdyBILmIoUC5MMyhhLCJ2YWx1ZSIsIk5v
-dCBhIHZhbGlkIGNsYXNzIHRva2VuIikpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QKCkuSCgw
-LCIgIil9LApnbTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLlAoKQpyZXR1cm4gUC5yaihzLHMucixILkxo
-KHMpLmMpfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlAoKS5hPT09MH0sCmdvcjpmdW5jdGlv
-bihhKXtyZXR1cm4gdGhpcy5QKCkuYSE9PTB9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QKCku
-YX0sCnRnOmZ1bmN0aW9uKGEsYil7dGhpcy5UKGIpCnJldHVybiB0aGlzLlAoKS50ZygwLGIpfSwKaTpm
-dW5jdGlvbihhLGIpe3ZhciBzCkguaChiKQp0aGlzLlQoYikKcz10aGlzLk9TKG5ldyBQLkdFKGIpKQpy
-ZXR1cm4gSC55OChzPT1udWxsPyExOnMpfSwKUjpmdW5jdGlvbihhLGIpe3ZhciBzLHIKaWYodHlwZW9m
-IGIhPSJzdHJpbmciKXJldHVybiExCnRoaXMuVChiKQpzPXRoaXMuUCgpCnI9cy5SKDAsYikKdGhpcy5Y
-KHMpCnJldHVybiByfSwKRlY6ZnVuY3Rpb24oYSxiKXt0aGlzLk9TKG5ldyBQLk43KHRoaXMsdC5RLmEo
-YikpKX0sCmVSOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcy5QKCkKcmV0dXJuIEguYksocyxiLEguTGgo
-cykuQygibGYuRSIpKX0sCkU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5QKCkuRSgwLGIpfSwKVjE6
-ZnVuY3Rpb24oYSl7dGhpcy5PUyhuZXcgUC51USgpKX0sCk9TOmZ1bmN0aW9uKGEpe3ZhciBzLHIKdC5i
-VS5hKGEpCnM9dGhpcy5QKCkKcj1hLiQxKHMpCnRoaXMuWChzKQpyZXR1cm4gcn19ClAuR0UucHJvdG90
-eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuQy5hKGEpLmkoMCx0aGlzLmEpfSwKJFM6MzR9ClAu
-TjcucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5iLHI9SC50NihzKQpyZXR1cm4g
-dC5DLmEoYSkuRlYoMCxuZXcgSC5sSihzLHIuQygicVUoMSkiKS5hKHRoaXMuYS5ndU0oKSksci5DKCJs
-SjwxLHFVPiIpKSl9LAokUzoxN30KUC51US5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt0LkMuYShh
-KQppZihhLmE+MCl7YS5iPWEuYz1hLmQ9YS5lPWEuZj1udWxsCmEuYT0wCmEuUygpfXJldHVybiBudWxs
-fSwKJFM6MTd9ClAuaEYucHJvdG90eXBlPXskaWhGOjF9ClAuUEMucHJvdG90eXBlPXsKJDE6ZnVuY3Rp
-b24oYSl7dmFyIHMKdC5ZLmEoYSkKcz1mdW5jdGlvbihiLGMsZCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0
-dXJuIGIoYyxkLHRoaXMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpfX0oUC5S
-NCxhLCExKQpQLkRtKHMsJC53KCksYSkKcmV0dXJuIHN9LAokUzo0fQpQLm10LnByb3RvdHlwZT17CiQx
-OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgdGhpcy5hKGEpfSwKJFM6NH0KUC5Oei5wcm90b3R5cGU9ewok
-MTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAucjcoYSl9LAokUzo1NX0KUC5RUy5wcm90b3R5cGU9ewok
-MTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuVHooYSx0LmFtKX0sCiRTOjM3fQpQLm5wLnByb3RvdHlw
-ZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5FNChhKX0sCiRTOjM4fQpQLkU0LnByb3RvdHlw
-ZT17CnE6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYiE9InN0cmluZyImJnR5cGVvZiBiIT0ibnVtYmVy
-Iil0aHJvdyBILmIoUC54WSgicHJvcGVydHkgaXMgbm90IGEgU3RyaW5nIG9yIG51bSIpKQpyZXR1cm4g
-UC5kVSh0aGlzLmFbYl0pfSwKWTpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIhPSJzdHJpbmciJiZ0
-eXBlb2YgYiE9Im51bWJlciIpdGhyb3cgSC5iKFAueFkoInByb3BlcnR5IGlzIG5vdCBhIFN0cmluZyBv
-ciBudW0iKSkKdGhpcy5hW2JdPVAud1koYyl9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0
-dXJuITEKcmV0dXJuIGIgaW5zdGFuY2VvZiBQLkU0JiZ0aGlzLmE9PT1iLmF9LAp3OmZ1bmN0aW9uKGEp
-e3ZhciBzLHIKdHJ5e3M9U3RyaW5nKHRoaXMuYSkKcmV0dXJuIHN9Y2F0Y2gocil7SC5SdShyKQpzPXRo
-aXMueGIoMCkKcmV0dXJuIHN9fSwKVjc6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRoaXMuYQppZihiPT1u
-dWxsKXM9bnVsbAplbHNle3M9SC50NihiKQpzPVAuQ0gobmV3IEgubEooYixzLkMoIkAoMSkiKS5hKFAu
-aUcoKSkscy5DKCJsSjwxLEA+IikpLCEwLHQueil9cmV0dXJuIFAuZFUoclthXS5hcHBseShyLHMpKX0s
-CmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gMH19ClAucjcucHJvdG90eXBlPXt9ClAuVHoucHJvdG90eXBl
-PXsKY1A6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPWE8MHx8YT49cy5nQShzKQppZihyKXRocm93IEgu
-YihQLlRFKGEsMCxzLmdBKHMpLG51bGwsbnVsbCkpfSwKcTpmdW5jdGlvbihhLGIpe2lmKEgub2soYikp
-dGhpcy5jUChiKQpyZXR1cm4gdGhpcy4kdGkuYy5hKHRoaXMuVXIoMCxiKSl9LApZOmZ1bmN0aW9uKGEs
-YixjKXt0aGlzLmNQKGIpCnRoaXMuZTQoMCxiLGMpfSwKZ0E6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5h
-Lmxlbmd0aAppZih0eXBlb2Ygcz09PSJudW1iZXIiJiZzPj4+MD09PXMpcmV0dXJuIHMKdGhyb3cgSC5i
-KFAuUFYoIkJhZCBKc0FycmF5IGxlbmd0aCIpKX0sCiRpYlE6MSwKJGljWDoxLAokaXpNOjF9ClAuY28u
-cHJvdG90eXBlPXt9ClAubmQucHJvdG90eXBlPXskaW5kOjF9ClAuS2UucHJvdG90eXBlPXsKUDpmdW5j
-dGlvbigpe3ZhciBzLHIscSxwLG89dGhpcy5hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSxuPVAuTHModC5O
-KQppZihvPT1udWxsKXJldHVybiBuCmZvcihzPW8uc3BsaXQoIiAiKSxyPXMubGVuZ3RoLHE9MDtxPHI7
-KytxKXtwPUouVDAoc1txXSkKaWYocC5sZW5ndGghPT0wKW4uaSgwLHApfXJldHVybiBufSwKWDpmdW5j
-dGlvbihhKXt0aGlzLmEuc2V0QXR0cmlidXRlKCJjbGFzcyIsYS5IKDAsIiAiKSl9fQpQLmhpLnByb3Rv
-dHlwZT17CmdEOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5LZShhKX0sCnNoZjpmdW5jdGlvbihhLGIp
-e3RoaXMuWUMoYSxiKX0sCnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxwLG8sbgppZihkPT1u
-dWxsKXtzPUguVk0oW10sdC52KQpkPW5ldyBXLnZEKHMpCkMuTm0uaShzLFcuVHcobnVsbCkpCkMuTm0u
-aShzLFcuQmwoKSkKQy5ObS5pKHMsbmV3IFcuT3coKSl9Yz1uZXcgVy5LbyhkKQpyPSc8c3ZnIHZlcnNp
-b249IjEuMSI+JytILkVqKGIpKyI8L3N2Zz4iCnM9ZG9jdW1lbnQKcT1zLmJvZHkKcS50b1N0cmluZwpw
-PUMuUlkuQUgocSxyLGMpCm89cy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKcC50b1N0cmluZwpzPW5l
-dyBXLmU3KHApCm49cy5ncjgocykKZm9yKDtzPW4uZmlyc3RDaGlsZCxzIT1udWxsOylvLmFwcGVuZENo
-aWxkKHMpCnJldHVybiBvfSwKbno6ZnVuY3Rpb24oYSxiLGMsZCxlKXt0aHJvdyBILmIoUC5MNCgiQ2Fu
-bm90IGludm9rZSBpbnNlcnRBZGphY2VudEh0bWwgb24gU1ZHLiIpKX0sCmdWbDpmdW5jdGlvbihhKXty
-ZXR1cm4gbmV3IFcuZXUoYSwiY2xpY2siLCExLHQuayl9LAokaWhpOjF9Ck0uSDcucHJvdG90eXBlPXsK
-dzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ifX0KVS5MTC5wcm90b3R5cGU9ewpMdDpmdW5jdGlvbigp
-e3JldHVybiBQLkVGKFsibm9kZUlkIix0aGlzLmIsImtpbmQiLHRoaXMuYS5hXSx0LlgsdC5fKX19ClUu
-TUQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuZkUuYShhKS5hPT09dGhpcy5hLnEo
-MCwia2luZCIpfSwKJFM6Mzl9ClUuZDIucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24oKXt2YXIgcyxyLHEs
-cCxvPXRoaXMsbj10LlgsbT10Ll8sbD1QLkZsKG4sbSksaz1vLmEKaWYoayE9bnVsbCl7cz1ILlZNKFtd
-LHQuRykKZm9yKHI9ay5sZW5ndGgscT0wO3E8ay5sZW5ndGg7ay5sZW5ndGg9PT1yfHwoMCxILmxrKShr
-KSwrK3Epe3A9a1txXQpDLk5tLmkocyxQLkVGKFsiZGVzY3JpcHRpb24iLHAuYSwiaHJlZiIscC5iXSxu
-LG0pKX1sLlkoMCwiZWRpdHMiLHMpfWwuWSgwLCJleHBsYW5hdGlvbiIsby5iKQpsLlkoMCwibGluZSIs
-by5jKQpsLlkoMCwiZGlzcGxheVBhdGgiLG8uZCkKbC5ZKDAsInVyaVBhdGgiLG8uZSkKbj1vLmYKaWYo
-biE9bnVsbCl7bT1ILlZNKFtdLHQuRykKZm9yKGs9bi5sZW5ndGgscT0wO3E8bi5sZW5ndGg7bi5sZW5n
-dGg9PT1rfHwoMCxILmxrKShuKSwrK3EpQy5ObS5pKG0sbltxXS5MdCgpKQpsLlkoMCwidHJhY2VzIixt
-KX1yZXR1cm4gbH19ClUuU2UucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24oKXtyZXR1cm4gUC5FRihbImRl
-c2NyaXB0aW9uIix0aGlzLmEsImhyZWYiLHRoaXMuYl0sdC5YLHQuXyl9fQpVLk1sLnByb3RvdHlwZT17
-Ckx0OmZ1bmN0aW9uKCl7cmV0dXJuIFAuRUYoWyJocmVmIix0aGlzLmEsImxpbmUiLHRoaXMuYiwicGF0
-aCIsdGhpcy5jXSx0LlgsdC5fKX19ClUueUQucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24oKXt2YXIgcyxy
-LHEscD1ILlZNKFtdLHQuRykKZm9yKHM9dGhpcy5iLHI9cy5sZW5ndGgscT0wO3E8cy5sZW5ndGg7cy5s
-ZW5ndGg9PT1yfHwoMCxILmxrKShzKSwrK3EpQy5ObS5pKHAsc1txXS5MdCgpKQpyZXR1cm4gUC5FRihb
-ImRlc2NyaXB0aW9uIix0aGlzLmEsImVudHJpZXMiLHBdLHQuWCx0Ll8pfX0KVS53Yi5wcm90b3R5cGU9
-ewpMdDpmdW5jdGlvbigpe3ZhciBzLHIscSxwPXRoaXMsbz1QLkZsKHQuWCx0Ll8pCm8uWSgwLCJkZXNj
-cmlwdGlvbiIscC5hKQpzPXAuYgppZihzIT1udWxsKW8uWSgwLCJmdW5jdGlvbiIscykKcz1wLmMKaWYo
-cyE9bnVsbClvLlkoMCwibGluayIscy5MdCgpKQpzPXAuZAppZihzLmxlbmd0aCE9PTApe3I9SC50Nihz
-KQpxPXIuQygibEo8MSxaMDxxVSosTWgqPio+IikKby5ZKDAsImhpbnRBY3Rpb25zIixQLkNIKG5ldyBI
-LmxKKHMsci5DKCJaMDxxVSosTWgqPiooMSkiKS5hKG5ldyBVLmIwKCkpLHEpLCEwLHEuQygiYUwuRSIp
-KSl9cmV0dXJuIG99fQpVLmFOLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBVLm56KHQu
-dC5hKGEpKX0sCiRTOjQwfQpVLmIwLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0LmFY
-LmEoYSkuTHQoKX0sCiRTOjQxfQpCLmo4LnByb3RvdHlwZT17Ckx0OmZ1bmN0aW9uKCl7cmV0dXJuIFAu
-RUYoWyJsaW5lIix0aGlzLmEsImV4cGxhbmF0aW9uIix0aGlzLmIsIm9mZnNldCIsdGhpcy5jXSx0Llgs
-dC5fKX19CkIucXAucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbSxsPXRo
-aXMsaz10Llgsaj1QLkZsKGssdC5kcCkKZm9yKHM9bC5kLHM9cy5nUHUocykscz1zLmdtKHMpLHI9dC5f
-LHE9dC5HO3MuRigpOyl7cD1zLmdsKCkKbz1wLmEKbj1ILlZNKFtdLHEpCmZvcihwPUouSVQocC5iKTtw
-LkYoKTspe209cC5nbCgpCkMuTm0uaShuLFAuRUYoWyJsaW5lIixtLmEsImV4cGxhbmF0aW9uIixtLmIs
-Im9mZnNldCIsbS5jXSxrLHIpKX1qLlkoMCxvLG4pfXJldHVybiBQLkVGKFsicmVnaW9ucyIsbC5hLCJu
-YXZpZ2F0aW9uQ29udGVudCIsbC5iLCJzb3VyY2VDb2RlIixsLmMsImVkaXRzIixqXSxrLHIpfX0KVC5t
-US5wcm90b3R5cGU9e30KTC5lLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8s
-bixtCnQuYUwuYShhKQpzPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQpyPUwuRzYod2luZG93LmxvY2F0
-aW9uLmhyZWYpCnE9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKTC5HZSgpCmlmKHMhPT0iLyImJnMh
-PT1KLlQwKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQpKUwuRzcocyxy
-LHEsITAsbmV3IEwuVlcocyxyLHEpKQpwPWRvY3VtZW50Cm89Si5xRihwLnF1ZXJ5U2VsZWN0b3IoIi5h
-cHBseS1taWdyYXRpb24iKSkKbj1vLiR0aQptPW4uQygifigxKT8iKS5hKG5ldyBMLm9aKCkpCnQuWi5h
-KG51bGwpClcuSkUoby5hLG8uYixtLCExLG4uYykKbj1KLnFGKHAucXVlcnlTZWxlY3RvcigiLnJlcnVu
-LW1pZ3JhdGlvbiIpKQptPW4uJHRpClcuSkUobi5hLG4uYixtLkMoIn4oMSk/IikuYShuZXcgTC5IaSgp
-KSwhMSxtLmMpCm09Si5xRihwLnF1ZXJ5U2VsZWN0b3IoIi5yZXBvcnQtcHJvYmxlbSIpKQpuPW0uJHRp
-ClcuSkUobS5hLG0uYixuLkMoIn4oMSk/IikuYShuZXcgTC5CVCgpKSwhMSxuLmMpCnA9Si5xRihwLnF1
-ZXJ5U2VsZWN0b3IoIi5wb3B1cC1wYW5lIC5jbG9zZSIpKQpuPXAuJHRpClcuSkUocC5hLHAuYixuLkMo
-In4oMSk/IikuYShuZXcgTC5QWSgpKSwhMSxuLmMpfSwKJFM6MTh9CkwuVlcucHJvdG90eXBlPXsKJDA6
-ZnVuY3Rpb24oKXtMLkZyKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0sCiRTOjF9Ckwub1oucHJvdG90eXBl
-PXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAKdC5PLmEoYSkKaWYoSC5vVChDLm9sLnVzKHdpbmRv
-dywiVGhpcyB3aWxsIGFwcGx5IHRoZSBjaGFuZ2VzIHlvdSd2ZSBwcmV2aWV3ZWQgdG8geW91ciB3b3Jr
-aW5nIGRpcmVjdG9yeS4gSXQgaXMgcmVjb21tZW5kZWQgeW91IGNvbW1pdCBhbnkgY2hhbmdlcyB5b3Ug
-bWFkZSBiZWZvcmUgZG9pbmcgdGhpcy4iKSkpe3M9TC50eSgiL2FwcGx5LW1pZ3JhdGlvbiIsbnVsbCku
-VzcobmV3IEwuanIoKSx0LlApCnI9bmV3IEwucWwoKQp0LmI3LmEobnVsbCkKcT1zLiR0aQpwPSQuWDMK
-aWYocCE9PUMuTlUpcj1QLlZIKHIscCkKcy54ZihuZXcgUC5GZShuZXcgUC52cyhwLHEpLDIsbnVsbCxy
-LHEuQygiQDwxPiIpLktxKHEuYykuQygiRmU8MSwyPiIpKSl9fSwKJFM6Mn0KTC5qci5wcm90b3R5cGU9
-ewokMTpmdW5jdGlvbihhKXt2YXIgcwp0LnQuYShhKQpzPWRvY3VtZW50LmJvZHkKcy5jbGFzc0xpc3Qu
-cmVtb3ZlKCJwcm9wb3NlZCIpCnMuY2xhc3NMaXN0LmFkZCgiYXBwbGllZCIpfSwKJFM6NDR9CkwucWwu
-cHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtMLkMyKCJDb3VsZCBub3QgYXBwbHkgbWlncmF0aW9u
-IixhLGIpfSwKJEM6IiQyIiwKJFI6MiwKJFM6MTZ9CkwuSGkucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMueG4odC5PLmEoYSkpfSwKeG46ZnVuY3Rpb24oYSl7dmFyIHM9MCxyPVAuRlgo
-dC5QKSxxPTEscCxvPVtdLG4sbSxsLGssagp2YXIgJGFzeW5jJCQxPVAubHooZnVuY3Rpb24oYixjKXtp
-ZihiPT09MSl7cD1jCnM9cX13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6cT0zCmRvY3VtZW50LmJv
-ZHkuY2xhc3NMaXN0LmFkZCgicmVydW5uaW5nIikKcz02CnJldHVybiBQLmpRKEwudHkoIi9yZXJ1bi1t
-aWdyYXRpb24iLG51bGwpLCRhc3luYyQkMSkKY2FzZSA2Om49YwppZihILm9UKEgueTgoSi54OShuLCJz
-dWNjZXNzIikpKSl3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkKZWxzZSBMLkswKHQubS5hKEoueDkobiwi
-ZXJyb3JzIikpKQpvLnB1c2goNSkKcz00CmJyZWFrCmNhc2UgMzpxPTIKaj1wCm09SC5SdShqKQpsPUgu
-dHMoaikKTC5DMigiRmFpbGVkIHRvIHJlcnVuIG1pZ3JhdGlvbiIsbSxsKQpvLnB1c2goNSkKcz00CmJy
-ZWFrCmNhc2UgMjpvPVsxXQpjYXNlIDQ6cT0xCmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgi
-cmVydW5uaW5nIikKcz1vLnBvcCgpCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNhc2Ug
-MTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyQkMSxyKX0sCiRTOjE5fQpMLkJU
-LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzCnQuTy5hKGEpCnM9dC5YCkMub2wuUG8od2lu
-ZG93LFAuWGQoImh0dHBzIiwiZ2l0aHViLmNvbSIsImRhcnQtbGFuZy9zZGsvaXNzdWVzL25ldyIsUC5F
-RihbInRpdGxlIiwiQ3VzdG9tZXItcmVwb3J0ZWQgaXNzdWUgd2l0aCBOTkJEIG1pZ3JhdGlvbiB0b29s
-IiwibGFiZWxzIix1LmQsImJvZHkiLCIjIyMjIFN0ZXBzIHRvIHJlcHJvZHVjZVxuXG4jIyMjIFdoYXQg
-ZGlkIHlvdSBleHBlY3QgdG8gaGFwcGVuP1xuXG4jIyMjIFdoYXQgYWN0dWFsbHkgaGFwcGVuZWQ/XG5c
-bl9TY3JlZW5zaG90cyBhcmUgYXBwcmVjaWF0ZWRfXG5cbioqRGFydCBTREsgdmVyc2lvbioqOiAiK0gu
-RWooZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNkay12ZXJzaW9uIikudGV4dENvbnRlbnQpKyJcblxu
-VGhhbmtzIGZvciBmaWxpbmchXG4iXSxzLHMpKS5nbkQoKSwicmVwb3J0LXByb2JsZW0iKX0sCiRTOjJ9
-CkwuUFkucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMKdC5PLmEoYSkKcz1kb2N1bWVudC5x
-dWVyeVNlbGVjdG9yKCIucG9wdXAtcGFuZSIpLnN0eWxlCnMuZGlzcGxheT0ibm9uZSIKcmV0dXJuIm5v
-bmUifSwKJFM6NDZ9CkwuTC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcyxyLHEKdC5hTC5h
-KGEpCnM9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCnI9TC5HNih3aW5kb3cubG9jYXRpb24uaHJlZikK
-cT1MLmFLKHdpbmRvdy5sb2NhdGlvbi5ocmVmKQppZihzLmxlbmd0aD4xKUwuRzcocyxyLHEsITEsbnVs
-bCkKZWxzZXtMLkJFKHMsQi53UigpLCEwKQpMLkJYKCImbmJzcDsiLG51bGwpfX0sCiRTOjE4fQpMLld4
-LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPSJjb2xsYXBzZWQiCnQuTy5hKGEp
-CnM9dGhpcy5hCnI9Si5ZRShzKQpxPXRoaXMuYgppZighci5nRChzKS50ZygwLHApKXtyLmdEKHMpLmko
-MCxwKQpKLmRSKHEpLmkoMCxwKX1lbHNle3IuZ0QocykuUigwLHApCkouZFIocSkuUigwLHApfX0sCiRT
-OjJ9CkwuQU8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9Si5xRih0LmcuYShhKSkscj1z
-LiR0aSxxPXIuQygifigxKT8iKS5hKG5ldyBMLmROKHRoaXMuYSkpCnQuWi5hKG51bGwpClcuSkUocy5h
-LHMuYixxLCExLHIuYyl9LAokUzozfQpMLmROLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBz
-CnQuTy5hKGEpCnM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGFibGVbZGF0YS1wYXRoXSIpCnMudG9T
-dHJpbmcKTC50MihhLHRoaXMuYSxzLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3
-KHMpKS5PKCJwYXRoIikpKX0sCiRTOjJ9CkwuSG8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFy
-IHMscixxCnQuZy5hKGEpCnM9Si5xRihhKQpyPXMuJHRpCnE9ci5DKCJ+KDEpPyIpLmEobmV3IEwueHoo
-YSx0aGlzLmEpKQp0LlouYShudWxsKQpXLkpFKHMuYSxzLmIscSwhMSxyLmMpfSwKJFM6M30KTC54ei5w
-cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcwp0Lk8uYShhKQpzPXRoaXMuYQpMLmhYKHRoaXMu
-YixQLlFBKHMuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcocykpLk8oIm9mZnNl
-dCIpKSxudWxsKSxQLlFBKHMuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcocykp
-Lk8oImxpbmUiKSksbnVsbCkpfSwKJFM6Mn0KTC5JQy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2
-YXIgcz1KLnFGKHQuZy5hKGEpKSxyPXMuJHRpCnIuQygifigxKT8iKS5hKEwuaVMoKSkKdC5aLmEobnVs
-bCkKVy5KRShzLmEscy5iLEwuaVMoKSwhMSxyLmMpfSwKJFM6M30KTC5mQy5wcm90b3R5cGU9ewokMTpm
-dW5jdGlvbihhKXt0LmVRLmEoYSkKdGhpcy5hLmFNKDAsdGhpcy5iKX0sCiRTOjQ4fQpMLm5ULnByb3Rv
-dHlwZT17CiQwOmZ1bmN0aW9uKCl7TC5Gcih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LAokUzoxfQpMLk5Z
-LnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7TC5Gcih0aGlzLmEsbnVsbCxudWxsKX0sCiRTOjF9Ckwu
-dWUucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dC5hdy5hKGEpCnJldHVybiBILkVqKGEucSgwLCJz
-ZXZlcml0eSIpKSsiIC0gIitILkVqKGEucSgwLCJtZXNzYWdlIikpKyIgYXQgIitILkVqKGEucSgwLCJs
-b2NhdGlvbiIpKSsiIC0gKCIrSC5FaihhLnEoMCwiY29kZSIpKSsiKSJ9LAokUzo0OX0KTC5lWC5wcm90
-b3R5cGU9ewokMTpmdW5jdGlvbihhKXt0LmcuYShhKQokLnpCKCkudG9TdHJpbmcKdC5kSC5hKCQub3co
-KS5xKDAsImhsanMiKSkuVjcoImhpZ2hsaWdodEJsb2NrIixbYV0pfSwKJFM6M30KTC5FRS5wcm90b3R5
-cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcyxyCnQuTy5hKGEpLnByZXZlbnREZWZhdWx0KCkKcz10aGlz
-LmEKcj10aGlzLmIKTC5hZih3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUscyxyLCEwLG5ldyBMLlFMKHMs
-cikpCkwuaFgodGhpcy5jLHMscil9LAokUzoyfQpMLlFMLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7
-TC5Gcih3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsdGhpcy5hLHRoaXMuYil9LAokUzoxfQpMLlZTLnBy
-b3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHI9InNlbGVjdGVkLWZpbGUiCnQuZy5hKGEpCmEu
-dG9TdHJpbmcKcz1KLllFKGEpCmlmKGEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcu
-aTcoYSkpLk8oIm5hbWUiKSk9PT10aGlzLmEuYSlzLmdEKGEpLmkoMCxyKQplbHNlIHMuZ0QoYSkuUigw
-LHIpfSwKJFM6M30KTC5URC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gTC50Mih0Lk8u
-YShhKSwhMCxudWxsKX0sCiRTOjIwfQpMLm0yLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVy
-biB0aGlzLlJJKHQuTy5hKGEpKX0sClJJOmZ1bmN0aW9uKGEpe3ZhciBzPTAscj1QLkZYKHQuUCkscT0x
-LHAsbz1bXSxuPXRoaXMsbSxsLGssaixpLGgsZyxmCnZhciAkYXN5bmMkJDE9UC5seihmdW5jdGlvbihi
-LGMpe2lmKGI9PT0xKXtwPWMKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDpxPTMKaT1kb2N1
-bWVudAptPUMuQ0QuelEoaS5xdWVyeVNlbGVjdG9yKCIuY29udGVudCIpLnNjcm9sbFRvcCkKaD10LlgK
-cz02CnJldHVybiBQLmpRKEwudHkoTC5RNCgiL2FwcGx5LWhpbnQiLFAuRmwoaCxoKSksbi5hLkx0KCkp
-LCRhc3luYyQkMSkKY2FzZSA2Omg9bi5iCmw9TC5VcyhoLmEpCnM9NwpyZXR1cm4gUC5qUShMLkc3KGws
-bnVsbCxoLmIsITEsbnVsbCksJGFzeW5jJCQxKQpjYXNlIDc6aS5ib2R5LmNsYXNzTGlzdC5hZGQoIm5l
-ZWRzLXJlcnVuIikKaT1pLnF1ZXJ5U2VsZWN0b3IoIi5jb250ZW50IikKaS50b1N0cmluZwppLnNjcm9s
-bFRvcD1KLlZ1KG0pCnE9MQpzPTUKYnJlYWsKY2FzZSAzOnE9MgpmPXAKaz1ILlJ1KGYpCmo9SC50cyhm
-KQpMLkMyKCJDb3VsZCBub3QgYXBwbHkgaGludCIsayxqKQpzPTUKYnJlYWsKY2FzZSAyOnM9MQpicmVh
-awpjYXNlIDU6cmV0dXJuIFAueUMobnVsbCxyKQpjYXNlIDE6cmV0dXJuIFAuZjMocCxyKX19KQpyZXR1
-cm4gUC5ESSgkYXN5bmMkJDEscil9LAokUzoxOX0KTC5YQS5wcm90b3R5cGU9ewpFYjpmdW5jdGlvbihh
-LGIsYyl7cmV0dXJuITB9LAppMDpmdW5jdGlvbihhKXtyZXR1cm4hMH0sCiRpa0Y6MX0KTC5aWi5wcm90
-b3R5cGU9ewpMdDpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPVAuRmwodC5YLHQuXykKcS5ZKDAsInR5
-cGUiLEwudnkoci5hKSkKcS5ZKDAsIm5hbWUiLHIuYikKcz1yLmMKaWYocyE9bnVsbClxLlkoMCwic3Vi
-dHJlZSIsTC5WRChzKSkKcz1yLmQKaWYocyE9bnVsbClxLlkoMCwicGF0aCIscykKcz1yLmUKaWYocyE9
-bnVsbClxLlkoMCwiaHJlZiIscykKcz1yLmYKaWYocyE9bnVsbClxLlkoMCwiZWRpdENvdW50IixzKQpy
-ZXR1cm4gcX19CkwuTzkucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ifX0KTS5s
-SS5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigpe3ZhciBzPUQuYWIoKQpyZXR1cm4gc30sCldPOmZ1bmN0
-aW9uKGEsYil7dmFyIHMscixxPXQuZDQKTS5ZRigiYWJzb2x1dGUiLEguVk0oW2IsbnVsbCxudWxsLG51
-bGwsbnVsbCxudWxsLG51bGxdLHEpKQpzPXRoaXMuYQpzPXMuWXIoYik+MCYmIXMuaEsoYikKaWYocyly
-ZXR1cm4gYgpyPUguVk0oW3RoaXMuZ2woKSxiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSxx
-KQpNLllGKCJqb2luIixyKQpyZXR1cm4gdGhpcy5JUChuZXcgSC51NihyLHQuZUopKX0sCnpmOmZ1bmN0
-aW9uKGEpe3ZhciBzLHIscT1YLkNMKGEsdGhpcy5hKQpxLklWKCkKcz1xLmQKcj1zLmxlbmd0aAppZihy
-PT09MCl7cz1xLmIKcmV0dXJuIHM9PW51bGw/Ii4iOnN9aWYocj09PTEpe3M9cS5iCnJldHVybiBzPT1u
-dWxsPyIuIjpzfWlmKDA+PXIpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpzPXEuZQppZigwPj1zLmxl
-bmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnEuSVYoKQpyZXR1cm4gcS53KDApfSwKSVA6ZnVu
-Y3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGoKdC5RLmEoYSkKZm9yKHM9YS4kdGkscj1zLkMo
-ImEyKGNYLkUpIikuYShuZXcgTS5xNygpKSxxPWEuZ20oYSkscz1uZXcgSC5TTyhxLHIscy5DKCJTTzxj
-WC5FPiIpKSxyPXRoaXMuYSxwPSExLG89ITEsbj0iIjtzLkYoKTspe209cS5nbCgpCmlmKHIuaEsobSkm
-Jm8pe2w9WC5DTChtLHIpCms9bi5jaGFyQ29kZUF0KDApPT0wP246bgpuPUMueEIuTmooaywwLHIuU3Ao
-aywhMCkpCmwuYj1uCmlmKHIuZHMobikpQy5ObS5ZKGwuZSwwLHIuZ21JKCkpCm49bC53KDApfWVsc2Ug
-aWYoci5ZcihtKT4wKXtvPSFyLmhLKG0pCm49SC5FaihtKX1lbHNle2o9bS5sZW5ndGgKaWYoaiE9PTAp
-e2lmKDA+PWopcmV0dXJuIEguT0gobSwwKQpqPXIuVWQobVswXSl9ZWxzZSBqPSExCmlmKCFqKWlmKHAp
-bis9ci5nbUkoKQpuKz1tfXA9ci5kcyhtKX1yZXR1cm4gbi5jaGFyQ29kZUF0KDApPT0wP246bn0sCm81
-OmZ1bmN0aW9uKGEpe3ZhciBzCmlmKCF0aGlzLnkzKGEpKXJldHVybiBhCnM9WC5DTChhLHRoaXMuYSkK
-cy5yUigpCnJldHVybiBzLncoMCl9LAp5MzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGss
-agphLnRvU3RyaW5nCnM9dGhpcy5hCnI9cy5ZcihhKQppZihyIT09MCl7aWYocz09PSQuS2soKSlmb3Io
-cT0wO3E8cjsrK3EpaWYoQy54Qi5XKGEscSk9PT00NylyZXR1cm4hMApwPXIKbz00N31lbHNle3A9MApv
-PW51bGx9Zm9yKG49bmV3IEgucWooYSkuYSxtPW4ubGVuZ3RoLHE9cCxsPW51bGw7cTxtOysrcSxsPW8s
-bz1rKXtrPUMueEIuTzIobixxKQppZihzLnI0KGspKXtpZihzPT09JC5LaygpJiZrPT09NDcpcmV0dXJu
-ITAKaWYobyE9bnVsbCYmcy5yNChvKSlyZXR1cm4hMAppZihvPT09NDYpaj1sPT1udWxsfHxsPT09NDZ8
-fHMucjQobCkKZWxzZSBqPSExCmlmKGopcmV0dXJuITB9fWlmKG89PW51bGwpcmV0dXJuITAKaWYocy5y
-NChvKSlyZXR1cm4hMAppZihvPT09NDYpcz1sPT1udWxsfHxzLnI0KGwpfHxsPT09NDYKZWxzZSBzPSEx
-CmlmKHMpcmV0dXJuITAKcmV0dXJuITF9LApIUDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixt
-LGw9dGhpcyxrPSdVbmFibGUgdG8gZmluZCBhIHBhdGggdG8gIicKYj1sLldPKDAsYikKcz1sLmEKaWYo
-cy5ZcihiKTw9MCYmcy5ZcihhKT4wKXJldHVybiBsLm81KGEpCmlmKHMuWXIoYSk8PTB8fHMuaEsoYSkp
-YT1sLldPKDAsYSkKaWYocy5ZcihhKTw9MCYmcy5ZcihiKT4wKXRocm93IEguYihYLkk3KGsrSC5Faihh
-KSsnIiBmcm9tICInK0guRWooYikrJyIuJykpCnI9WC5DTChiLHMpCnIuclIoKQpxPVguQ0woYSxzKQpx
-LnJSKCkKcD1yLmQKbz1wLmxlbmd0aAppZihvIT09MCl7aWYoMD49bylyZXR1cm4gSC5PSChwLDApCnA9
-Si5STShwWzBdLCIuIil9ZWxzZSBwPSExCmlmKHApcmV0dXJuIHEudygwKQpwPXIuYgpvPXEuYgppZihw
-IT1vKXA9cD09bnVsbHx8bz09bnVsbHx8IXMuTmMocCxvKQplbHNlIHA9ITEKaWYocClyZXR1cm4gcS53
-KDApCndoaWxlKCEwKXtwPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtuPXEuZAptPW4ubGVuZ3RoCmlm
-KG0hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkKcD1wWzBdCmlmKDA+PW0pcmV0dXJuIEguT0go
-biwwKQpuPXMuTmMocCxuWzBdKQpwPW59ZWxzZSBwPSExfWVsc2UgcD0hMQppZighcClicmVhawpDLk5t
-Llc0KHIuZCwwKQpDLk5tLlc0KHIuZSwxKQpDLk5tLlc0KHEuZCwwKQpDLk5tLlc0KHEuZSwxKX1wPXIu
-ZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkKcD1KLlJNKHBbMF0s
-Ii4uIil9ZWxzZSBwPSExCmlmKHApdGhyb3cgSC5iKFguSTcoaytILkVqKGEpKyciIGZyb20gIicrSC5F
-aihiKSsnIi4nKSkKcD10Lk4KQy5ObS5VRyhxLmQsMCxQLk84KHIuZC5sZW5ndGgsIi4uIiwhMSxwKSkK
-Qy5ObS5ZKHEuZSwwLCIiKQpDLk5tLlVHKHEuZSwxLFAuTzgoci5kLmxlbmd0aCxzLmdtSSgpLCExLHAp
-KQpzPXEuZApwPXMubGVuZ3RoCmlmKHA9PT0wKXJldHVybiIuIgppZihwPjEmJkouUk0oQy5ObS5ncloo
-cyksIi4iKSl7cz1xLmQKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpzPXEu
-ZQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCmlmKDA+PXMubGVuZ3RoKXJl
-dHVybiBILk9IKHMsLTEpCnMucG9wKCkKQy5ObS5pKHMsIiIpfXEuYj0iIgpxLklWKCkKcmV0dXJuIHEu
-dygwKX19Ck0ucTcucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEguaChhKSE9PSIifSwK
-JFM6Nn0KTS5Oby5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtILmsoYSkKcmV0dXJuIGE9PW51bGw/
-Im51bGwiOiciJythKyciJ30sCiRTOjUxfQpCLmZ2LnByb3RvdHlwZT17CnhaOmZ1bmN0aW9uKGEpe3Zh
-ciBzLHI9dGhpcy5ZcihhKQppZihyPjApcmV0dXJuIEoubGQoYSwwLHIpCmlmKHRoaXMuaEsoYSkpe2lm
-KDA+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsMCkKcz1hWzBdfWVsc2Ugcz1udWxsCnJldHVybiBzfSwK
-TmM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09Yn19ClguV0QucHJvdG90eXBlPXsKSVY6ZnVuY3Rpb24o
-KXt2YXIgcyxyLHE9dGhpcwp3aGlsZSghMCl7cz1xLmQKaWYoIShzLmxlbmd0aCE9PTAmJkouUk0oQy5O
-bS5ncloocyksIiIpKSlicmVhawpzPXEuZAppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpz
-LnBvcCgpCnM9cS5lCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCl9cz1xLmUK
-cj1zLmxlbmd0aAppZihyIT09MClDLk5tLlkocyxyLTEsIiIpfSwKclI6ZnVuY3Rpb24oKXt2YXIgcyxy
-LHEscCxvLG4sbT10aGlzLGw9SC5WTShbXSx0LnMpCmZvcihzPW0uZCxyPXMubGVuZ3RoLHE9MCxwPTA7
-cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcCl7bz1zW3BdCm49Si5pYShvKQpp
-ZighKG4uRE4obywiLiIpfHxuLkROKG8sIiIpKSlpZihuLkROKG8sIi4uIikpe249bC5sZW5ndGgKaWYo
-biE9PTApe2lmKDA+PW4pcmV0dXJuIEguT0gobCwtMSkKbC5wb3AoKX1lbHNlICsrcX1lbHNlIEMuTm0u
-aShsLG8pfWlmKG0uYj09bnVsbClDLk5tLlVHKGwsMCxQLk84KHEsIi4uIiwhMSx0Lk4pKQppZihsLmxl
-bmd0aD09PTAmJm0uYj09bnVsbClDLk5tLmkobCwiLiIpCm0uc25KKGwpCnM9bS5hCm0uc1BoKFAuTzgo
-bC5sZW5ndGgrMSxzLmdtSSgpLCEwLHQuTikpCnI9bS5iCmlmKHI9PW51bGx8fGwubGVuZ3RoPT09MHx8
-IXMuZHMocikpQy5ObS5ZKG0uZSwwLCIiKQpyPW0uYgppZihyIT1udWxsJiZzPT09JC5LaygpKXtyLnRv
-U3RyaW5nCm0uYj1ILnlzKHIsIi8iLCJcXCIpfW0uSVYoKX0sCnc6ZnVuY3Rpb24oYSl7dmFyIHMscixx
-PXRoaXMscD1xLmIKcD1wIT1udWxsP3A6IiIKZm9yKHM9MDtzPHEuZC5sZW5ndGg7KytzKXtyPXEuZQpp
-ZihzPj1yLmxlbmd0aClyZXR1cm4gSC5PSChyLHMpCnI9cCtILkVqKHJbc10pCnA9cS5kCmlmKHM+PXAu
-bGVuZ3RoKXJldHVybiBILk9IKHAscykKcD1yK0guRWoocFtzXSl9cCs9SC5FaihDLk5tLmdyWihxLmUp
-KQpyZXR1cm4gcC5jaGFyQ29kZUF0KDApPT0wP3A6cH0sCnNuSjpmdW5jdGlvbihhKXt0aGlzLmQ9dC5F
-LmEoYSl9LApzUGg6ZnVuY3Rpb24oYSl7dGhpcy5lPXQuRS5hKGEpfX0KWC5kdi5wcm90b3R5cGU9ewp3
-OmZ1bmN0aW9uKGEpe3JldHVybiJQYXRoRXhjZXB0aW9uOiAiK3RoaXMuYX0sCiRpUno6MX0KTy56TC5w
-cm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdvYyh0aGlzKX19CkUuT0YucHJvdG90
-eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIudGcoYSwiLyIpfSwKcjQ6ZnVuY3Rpb24oYSl7
-cmV0dXJuIGE9PT00N30sCmRzOmZ1bmN0aW9uKGEpe3ZhciBzPWEubGVuZ3RoCnJldHVybiBzIT09MCYm
-Qy54Qi5PMihhLHMtMSkhPT00N30sClNwOmZ1bmN0aW9uKGEsYil7aWYoYS5sZW5ndGghPT0wJiZDLnhC
-LlcoYSwwKT09PTQ3KXJldHVybiAxCnJldHVybiAwfSwKWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
-U3AoYSwhMSl9LApoSzpmdW5jdGlvbihhKXtyZXR1cm4hMX0sCmdvYzpmdW5jdGlvbigpe3JldHVybiJw
-b3NpeCJ9LApnbUk6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9fQpGLnJ1LnByb3RvdHlwZT17ClVkOmZ1bmN0
-aW9uKGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0sCnI0OmZ1bmN0aW9uKGEpe3JldHVybiBhPT09NDd9
-LApkczpmdW5jdGlvbihhKXt2YXIgcz1hLmxlbmd0aAppZihzPT09MClyZXR1cm4hMQppZihDLnhCLk8y
-KGEscy0xKSE9PTQ3KXJldHVybiEwCnJldHVybiBDLnhCLlRjKGEsIjovLyIpJiZ0aGlzLllyKGEpPT09
-c30sClNwOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbz1hLmxlbmd0aAppZihvPT09MClyZXR1cm4g
-MAppZihDLnhCLlcoYSwwKT09PTQ3KXJldHVybiAxCmZvcihzPTA7czxvOysrcyl7cj1DLnhCLlcoYSxz
-KQppZihyPT09NDcpcmV0dXJuIDAKaWYocj09PTU4KXtpZihzPT09MClyZXR1cm4gMApxPUMueEIuWFUo
-YSwiLyIsQy54Qi5RaShhLCIvLyIscysxKT9zKzM6cykKaWYocTw9MClyZXR1cm4gbwppZighYnx8bzxx
-KzMpcmV0dXJuIHEKaWYoIUMueEIubihhLCJmaWxlOi8vIikpcmV0dXJuIHEKaWYoIUIuWXUoYSxxKzEp
-KXJldHVybiBxCnA9cSszCnJldHVybiBvPT09cD9wOnErNH19cmV0dXJuIDB9LApZcjpmdW5jdGlvbihh
-KXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhLOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aCE9PTAm
-JkMueEIuVyhhLDApPT09NDd9LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4idXJsIn0sCmdtSTpmdW5jdGlv
-bigpe3JldHVybiIvIn19CkwuSVYucHJvdG90eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIu
-dGcoYSwiLyIpfSwKcjQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT00N3x8YT09PTkyfSwKZHM6ZnVuY3Rp
-b24oYSl7dmFyIHM9YS5sZW5ndGgKaWYocz09PTApcmV0dXJuITEKcz1DLnhCLk8yKGEscy0xKQpyZXR1
-cm4hKHM9PT00N3x8cz09PTkyKX0sClNwOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPWEubGVuZ3RoCmlm
-KHE9PT0wKXJldHVybiAwCnM9Qy54Qi5XKGEsMCkKaWYocz09PTQ3KXJldHVybiAxCmlmKHM9PT05Mil7
-aWYocTwyfHxDLnhCLlcoYSwxKSE9PTkyKXJldHVybiAxCnI9Qy54Qi5YVShhLCJcXCIsMikKaWYocj4w
-KXtyPUMueEIuWFUoYSwiXFwiLHIrMSkKaWYocj4wKXJldHVybiByfXJldHVybiBxfWlmKHE8MylyZXR1
-cm4gMAppZighQi5PUyhzKSlyZXR1cm4gMAppZihDLnhCLlcoYSwxKSE9PTU4KXJldHVybiAwCnE9Qy54
-Qi5XKGEsMikKaWYoIShxPT09NDd8fHE9PT05MikpcmV0dXJuIDAKcmV0dXJuIDN9LApZcjpmdW5jdGlv
-bihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhLOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLllyKGEp
-PT09MX0sCk90OmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYoYT09PWIpcmV0dXJuITAKaWYoYT09PTQ3KXJl
-dHVybiBiPT09OTIKaWYoYT09PTkyKXJldHVybiBiPT09NDcKaWYoKGFeYikhPT0zMilyZXR1cm4hMQpz
-PWF8MzIKcmV0dXJuIHM+PTk3JiZzPD0xMjJ9LApOYzpmdW5jdGlvbihhLGIpe3ZhciBzLHIscQppZihh
-PT1iKXJldHVybiEwCnM9YS5sZW5ndGgKaWYocyE9PWIubGVuZ3RoKXJldHVybiExCmZvcihyPUouclko
-YikscT0wO3E8czsrK3EpaWYoIXRoaXMuT3QoQy54Qi5XKGEscSksci5XKGIscSkpKXJldHVybiExCnJl
-dHVybiEwfSwKZ29jOmZ1bmN0aW9uKCl7cmV0dXJuIndpbmRvd3MifSwKZ21JOmZ1bmN0aW9uKCl7cmV0
-dXJuIlxcIn19OyhmdW5jdGlvbiBhbGlhc2VzKCl7dmFyIHM9Si52Qi5wcm90b3R5cGUKcy5VPXMudwpz
-LlNqPXMuZTcKcz1KLk1GLnByb3RvdHlwZQpzLnQ9cy53CnM9UC5jWC5wcm90b3R5cGUKcy5HRz1zLmV2
-CnM9UC5NaC5wcm90b3R5cGUKcy54Yj1zLncKcz1XLmN2LnByb3RvdHlwZQpzLkRXPXMucjYKcz1XLm02
-LnByb3RvdHlwZQpzLmpGPXMuRWIKcz1QLkU0LnByb3RvdHlwZQpzLlVyPXMucQpzLmU0PXMuWX0pKCk7
-KGZ1bmN0aW9uIGluc3RhbGxUZWFyT2Zmcygpe3ZhciBzPWh1bmtIZWxwZXJzLl9zdGF0aWNfMSxyPWh1
-bmtIZWxwZXJzLl9zdGF0aWNfMCxxPWh1bmtIZWxwZXJzLmluc3RhbGxJbnN0YW5jZVRlYXJPZmYscD1o
-dW5rSGVscGVycy5pbnN0YWxsU3RhdGljVGVhck9mZixvPWh1bmtIZWxwZXJzLl9pbnN0YW5jZV8xdQpz
-KFAsIkVYIiwiWlYiLDcpCnMoUCwieXQiLCJvQSIsNykKcyhQLCJxVyIsIkJ6Iiw3KQpyKFAsIlY5Iiwi
-ZU4iLDApCnEoUC5QZi5wcm90b3R5cGUsImdZSiIsMCwxLG51bGwsWyIkMiIsIiQxIl0sWyJ3MCIsInBt
-Il0sMjksMCkKcyhQLCJDeSIsIk5DIiw0KQpzKFAsIlBIIiwiTXQiLDUpCnAoVywicFMiLDQsbnVsbCxb
-IiQ0Il0sWyJxRCJdLDgsMCkKcChXLCJWNCIsNCxudWxsLFsiJDQiXSxbIlFXIl0sOCwwKQpvKFAuQXMu
-cHJvdG90eXBlLCJndU0iLCJUIiw1KQpzKFAsImlHIiwid1kiLDU0KQpzKFAsIncwIiwiZFUiLDM2KQpz
-KEwsImlTIiwiaTYiLDIwKX0pKCk7KGZ1bmN0aW9uIGluaGVyaXRhbmNlKCl7dmFyIHM9aHVua0hlbHBl
-cnMubWl4aW4scj1odW5rSGVscGVycy5pbmhlcml0LHE9aHVua0hlbHBlcnMuaW5oZXJpdE1hbnkKcihQ
-Lk1oLG51bGwpCnEoUC5NaCxbSC5GSyxKLnZCLEoubTEsUC5jWCxILkU3LFAuWFMsUC5uWSxILmE3LFAu
-QW4sSC5GdSxILkpCLEguU1UsSC5SZSxILnd2LFAuUG4sSC5XVSxILkxJLEguVHAsSC5mOSxILnRlLEgu
-YnEsSC5YTyxILmtyLFAuWWssSC52aCxILk42LEguVlIsSC5FSyxILlBiLEgudFEsSC5TZCxILkpjLEgu
-RyxQLlczLFAuaWgsUC5GeSxQLkdWLFAuUGYsUC5GZSxQLnZzLFAuT00sUC5xaCxQLk1PLFAua1QsUC54
-SSxQLkN3LFAubTAsUC5wUixQLmJuLFAubG0sUC5sRCxQLktQLFAubGYsUC5XWSxQLlVrLFAuU2gsUC5S
-dyxQLmJ6LFAuaVAsUC5rNSxQLktZLFAuQ0QsUC5hRSxQLk4zLFAuYzgsUC5aZCxQLlJuLFAuRG4sUC5Q
-RSxQLlVmLFcuaWQsVy5GayxXLkpRLFcuR20sVy52RCxXLm02LFcuT3csVy5XOSxXLmRXLFcubWssVy5L
-byxQLmlKLFAuRTQsTS5INyxVLkxMLFUuZDIsVS5TZSxVLk1sLFUueUQsVS53YixCLmo4LEIucXAsVC5t
-USxMLlhBLEwuWlosTC5POSxNLmxJLE8uekwsWC5XRCxYLmR2XSkKcShKLnZCLFtKLnlFLEoud2UsSi5N
-RixKLmpkLEoucUksSi5EcixILkVULFcuRDAsVy5BeixXLkxlLFcuTmgsVy5hZSxXLklCLFcubjcsVy5l
-YSxXLmJyLFcuU2csVy51OCxXLks3LFcuWFcsUC5oRl0pCnEoSi5NRixbSi5pQyxKLmtkLEouYzVdKQpy
-KEouUG8sSi5qZCkKcShKLnFJLFtKLmJVLEouVkFdKQpxKFAuY1gsW0guQlIsSC5iUSxILmkxLEguVTUs
-SC5BTSxILnU2LEguWFIsUC5tVyxILnVuXSkKcShILkJSLFtILlp5LEguUUNdKQpyKEgub2wsSC5aeSkK
-cihILlVxLEguUUMpCnIoSC5qVixILlVxKQpxKFAuWFMsW0gubixILnIzLFAuRXosSC5heixILnZWLEgu
-RXEsUC5DNixILmtTLFAuVWQsUC5GLFAudSxQLm1wLFAudWIsUC5kcyxQLmxqLFAuVVYsUC5wXSkKcihQ
-LnV5LFAublkpCnEoUC51eSxbSC53MixXLnd6LFcuZTddKQpyKEgucWosSC53MikKcShILmJRLFtILmFM
-LEguTUIsSC5pNV0pCnEoSC5hTCxbSC5uSCxILmxKLFAuaThdKQpyKEgueHksSC5pMSkKcShQLkFuLFtI
-Lk1ILEguU08sSC5VMV0pCnIoSC5kNSxILkFNKQpyKFAuUlUsUC5QbikKcihQLkdqLFAuUlUpCnIoSC5Q
-RCxQLkdqKQpyKEguTFAsSC5XVSkKcShILlRwLFtILkNqLEgubGMsSC5kQyxILndOLEguVlgsUC50aCxQ
-LmhhLFAuVnMsUC5GdCxQLnlILFAuV00sUC5TWCxQLkdzLFAuZGEsUC5vUSxQLnBWLFAuVTcsUC52cixQ
-LnJ0LFAuS0YsUC5aTCxQLlJULFAualosUC5ycSxQLlJXLFAuQjUsUC51TyxQLnBLLFAuaGosUC5WcCxQ
-Lk9SLFAucmEsUC55USxQLnBnLFAuYzIsUC50aSxQLldGLFAubjEsUC5jUyxQLlZDLFAuSlQsUC5SWixQ
-Lk1FLFAueTUsUC5xMyxQLnlJLFAuYzYsUC5xZCxXLkN2LFcuS1MsVy5BMyxXLnZOLFcuVXYsVy5FZyxX
-LkVvLFcuV2ssVy5JQSxXLmZtLFAuamcsUC5UYSxQLkdFLFAuTjcsUC51USxQLlBDLFAubXQsUC5OeixQ
-LlFTLFAubnAsVS5NRCxVLmFOLFUuYjAsTC5lLEwuVlcsTC5vWixMLmpyLEwucWwsTC5IaSxMLkJULEwu
-UFksTC5MLEwuV3gsTC5BTyxMLmROLEwuSG8sTC54eixMLklDLEwuZkMsTC5uVCxMLk5ZLEwudWUsTC5l
-WCxMLkVFLEwuUUwsTC5WUyxMLlRELEwubTIsTS5xNyxNLk5vXSkKcihILlcwLFAuRXopCnEoSC5sYyxb
-SC56eCxILnJUXSkKcihILmtZLFAuQzYpCnIoUC5pbCxQLllrKQpxKFAuaWwsW0guTjUsUC51dyxXLmNm
-LFcuU3ldKQpxKFAubVcsW0guS1csUC5xNF0pCnIoSC5YSCxILkVUKQpxKEguWEgsW0guUkcsSC5XQl0p
-CnIoSC5WUCxILlJHKQpyKEguRGcsSC5WUCkKcihILlpHLEguV0IpCnIoSC5QZyxILlpHKQpxKEguUGcs
-W0gueGosSC5kRSxILlpBLEguZFQsSC5QcSxILmVFLEguVjZdKQpyKEguaU0sSC5rUykKcihQLlpmLFAu
-UGYpCnIoUC5KaSxQLm0wKQpyKFAuWHYsUC5wUikKcihQLmI2LFAuWHYpCnIoUC5WaixQLldZKQpxKFAu
-VWssW1AuQ1YsUC5aaSxQLmJ5XSkKcihQLndJLFAua1QpCnEoUC53SSxbUC5VOCxQLm9qLFAuTXgsUC5F
-MyxQLkdZXSkKcihQLks4LFAuVWQpCnIoUC50dSxQLlNoKQpyKFAudTUsUC5aaSkKcShQLnUsW1AuYkos
-UC5lWV0pCnIoUC5xZSxQLkRuKQpxKFcuRDAsW1cudUgsVy53YSxXLks1LFcuQ21dKQpxKFcudUgsW1cu
-Y3YsVy5ueCxXLlFGLFcuQ1FdKQpxKFcuY3YsW1cucUUsUC5oaV0pCnEoVy5xRSxbVy5HaCxXLmZZLFcu
-bkIsVy5RUCxXLmg0LFcuU04sVy5scCxXLlRiLFcuSXYsVy5XUCxXLnlZXSkKcihXLm9KLFcuTGUpCnIo
-Vy5oSCxXLkF6KQpyKFcuVmIsVy5RRikKcihXLmZKLFcud2EpCnEoVy5lYSxbVy53NixXLmV3XSkKcihX
-LkFqLFcudzYpCnIoVy5yQixXLks3KQpyKFcuQkgsVy5yQikKcihXLnc0LFcuSUIpCnIoVy5vYSxXLlhX
-KQpyKFcucmgsVy5vYSkKcihXLmk3LFcuY2YpCnIoUC5BcyxQLlZqKQpxKFAuQXMsW1cuSTQsUC5LZV0p
-CnIoVy5STyxQLnFoKQpyKFcuZXUsVy5STykKcihXLnhDLFAuTU8pCnIoVy5jdCxXLm02KQpyKFAuQmYs
-UC5pSikKcShQLkU0LFtQLnI3LFAuY29dKQpyKFAuVHosUC5jbykKcihQLm5kLFAuaGkpCnIoQi5mdixP
-LnpMKQpxKEIuZnYsW0UuT0YsRi5ydSxMLklWXSkKcyhILncyLEguUmUpCnMoSC5RQyxQLmxEKQpzKEgu
-UkcsUC5sRCkKcyhILlZQLEguU1UpCnMoSC5XQixQLmxEKQpzKEguWkcsSC5TVSkKcyhQLm5ZLFAubEQp
-CnMoUC5XWSxQLmxmKQpzKFAuUlUsUC5LUCkKcyhQLnBSLFAubGYpCnMoVy5MZSxXLmlkKQpzKFcuSzcs
-UC5sRCkKcyhXLnJCLFcuR20pCnMoVy5YVyxQLmxEKQpzKFcub2EsVy5HbSkKcyhQLmNvLFAubEQpfSko
-KQp2YXIgdj17dHlwZVVuaXZlcnNlOntlQzpuZXcgTWFwKCksdFI6e30sZVQ6e30sdFBWOnt9LHNFQTpb
-XX0sbWFuZ2xlZEdsb2JhbE5hbWVzOntJZjoiaW50IixDUDoiZG91YmxlIixMWjoibnVtIixxVToiU3Ry
-aW5nIixhMjoiYm9vbCIsYzg6Ik51bGwiLHpNOiJMaXN0In0sbWFuZ2xlZE5hbWVzOnt9LGdldFR5cGVG
-cm9tTmFtZTpnZXRHbG9iYWxGcm9tTmFtZSxtZXRhZGF0YTpbXSx0eXBlczpbIn4oKSIsImM4KCkiLCJj
-OChBaiopIiwiYzgoY3YqKSIsIkAoQCkiLCJxVShxVSkiLCJhMihxVSkiLCJ+KH4oKSkiLCJhMihjdixx
-VSxxVSxKUSkiLCJjOChAKSIsIn4ocVUscVUpIiwifihNaD8sTWg/KSIsIkAoKSIsIn4ocVUsQCkiLCJ+
-KG42LHFVLElmKSIsImEyKGtGKSIsImM4KEAsQCkiLCJ+KHh1PHFVPikiLCJjOChlYSopIiwiYjg8Yzg+
-KihBaiopIiwifihBaiopIiwifihxVSxJZikiLCJ+KHFVLHFVPykiLCJuNihJZikiLCJuNihALEApIiwi
-fihJZixAKSIsImEyKHVIKSIsImM4KEAsR3opIiwifihlYSkiLCJ+KE1oW0d6P10pIiwiYzgoTWgsR3op
-Iiwifih1SCx1SD8pIiwifihALEApIiwidnM8QD4oQCkiLCJhMih4dTxxVT4pIiwiQChxVSkiLCJNaD8o
-QCkiLCJUejxAPihAKSIsIkU0KEApIiwiYTIqKEg3KikiLCJMTCooQCkiLCJaMDxxVSosTWgqPiooTEwq
-KSIsIkAoQCxxVSkiLCJ+KEdELEApIiwiYzgoWjA8cVUqLE1oKj4qKSIsIlowPHFVLHFVPihaMDxxVSxx
-VT4scVUpIiwicVUqKEFqKikiLCJ+KEApIiwiYzgoZXcqKSIsInFVKihaMDxALEA+KikiLCJ+KHFVW0Bd
-KSIsInFVKHFVPykiLCJJZihJZixJZikiLCJjOCh+KCkpIiwiTWg/KE1oPykiLCJyNyhAKSJdLGludGVy
-Y2VwdG9yc0J5VGFnOm51bGwsbGVhZlRhZ3M6bnVsbCxhcnJheVJ0aTp0eXBlb2YgU3ltYm9sPT0iZnVu
-Y3Rpb24iJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiP1N5bWJvbCgiJHRpIik6IiR0aSJ9CkgueGIo
-di50eXBlVW5pdmVyc2UsSlNPTi5wYXJzZSgneyJjNSI6Ik1GIiwiaUMiOiJNRiIsImtkIjoiTUYiLCJy
-eCI6ImVhIiwiZTUiOiJlYSIsIlkwIjoiaGkiLCJ0cCI6ImhpIiwiRzgiOiJldyIsIk1yIjoicUUiLCJl
-TCI6InFFIiwiSTAiOiJ1SCIsImhzIjoidUgiLCJYZyI6IlFGIiwibnIiOiJBaiIsInk0IjoidzYiLCJh
-UCI6IkNtIiwieGMiOiJueCIsImtKIjoibngiLCJ6VSI6IkRnIiwiZGYiOiJFVCIsInlFIjp7ImEyIjpb
-XX0sIndlIjp7ImM4IjpbXX0sIk1GIjp7InZtIjpbXSwiRUgiOltdfSwiamQiOnsiek0iOlsiMSJdLCJi
-USI6WyIxIl0sImNYIjpbIjEiXX0sIlBvIjp7ImpkIjpbIjEiXSwiek0iOlsiMSJdLCJiUSI6WyIxIl0s
-ImNYIjpbIjEiXX0sIm0xIjp7IkFuIjpbIjEiXX0sInFJIjp7IkNQIjpbXSwiTFoiOltdfSwiYlUiOnsi
-Q1AiOltdLCJJZiI6W10sIkxaIjpbXX0sIlZBIjp7IkNQIjpbXSwiTFoiOltdfSwiRHIiOnsicVUiOltd
-LCJ2WCI6W119LCJCUiI6eyJjWCI6WyIyIl19LCJFNyI6eyJBbiI6WyIyIl19LCJaeSI6eyJCUiI6WyIx
-IiwiMiJdLCJjWCI6WyIyIl0sImNYLkUiOiIyIn0sIm9sIjp7Ilp5IjpbIjEiLCIyIl0sIkJSIjpbIjEi
-LCIyIl0sImJRIjpbIjIiXSwiY1giOlsiMiJdLCJjWC5FIjoiMiJ9LCJVcSI6eyJsRCI6WyIyIl0sInpN
-IjpbIjIiXSwiQlIiOlsiMSIsIjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl19LCJqViI6eyJVcSI6WyIx
-IiwiMiJdLCJsRCI6WyIyIl0sInpNIjpbIjIiXSwiQlIiOlsiMSIsIjIiXSwiYlEiOlsiMiJdLCJjWCI6
-WyIyIl0sImxELkUiOiIyIiwiY1guRSI6IjIifSwibiI6eyJYUyI6W119LCJyMyI6eyJYUyI6W119LCJx
-aiI6eyJsRCI6WyJJZiJdLCJSZSI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJiUSI6WyJJZiJdLCJjWCI6WyJJ
-ZiJdLCJsRC5FIjoiSWYiLCJSZS5FIjoiSWYifSwiYlEiOnsiY1giOlsiMSJdfSwiYUwiOnsiYlEiOlsi
-MSJdLCJjWCI6WyIxIl19LCJuSCI6eyJhTCI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdLCJhTC5F
-IjoiMSIsImNYLkUiOiIxIn0sImE3Ijp7IkFuIjpbIjEiXX0sImkxIjp7ImNYIjpbIjIiXSwiY1guRSI6
-IjIifSwieHkiOnsiaTEiOlsiMSIsIjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl0sImNYLkUiOiIyIn0s
-Ik1IIjp7IkFuIjpbIjIiXX0sImxKIjp7ImFMIjpbIjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl0sImFM
-LkUiOiIyIiwiY1guRSI6IjIifSwiVTUiOnsiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJTTyI6eyJBbiI6
-WyIxIl19LCJBTSI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sImQ1Ijp7IkFNIjpbIjEiXSwiYlEiOlsi
-MSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIlUxIjp7IkFuIjpbIjEiXX0sIk1CIjp7ImJRIjpbIjEi
-XSwiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJGdSI6eyJBbiI6WyIxIl19LCJ1NiI6eyJjWCI6WyIxIl0s
-ImNYLkUiOiIxIn0sIkpCIjp7IkFuIjpbIjEiXX0sIncyIjp7ImxEIjpbIjEiXSwiUmUiOlsiMSJdLCJ6
-TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwid3YiOnsiR0QiOltdfSwiUEQiOnsiR2oiOlsi
-MSIsIjIiXSwiUlUiOlsiMSIsIjIiXSwiUG4iOlsiMSIsIjIiXSwiS1AiOlsiMSIsIjIiXSwiWjAiOlsi
-MSIsIjIiXX0sIldVIjp7IlowIjpbIjEiLCIyIl19LCJMUCI6eyJXVSI6WyIxIiwiMiJdLCJaMCI6WyIx
-IiwiMiJdfSwiWFIiOnsiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJMSSI6eyJ2USI6W119LCJXMCI6eyJY
-UyI6W119LCJheiI6eyJYUyI6W119LCJ2ViI6eyJYUyI6W119LCJ0ZSI6eyJSeiI6W119LCJYTyI6eyJH
-eiI6W119LCJUcCI6eyJFSCI6W119LCJsYyI6eyJFSCI6W119LCJ6eCI6eyJFSCI6W119LCJyVCI6eyJF
-SCI6W119LCJFcSI6eyJYUyI6W119LCJrWSI6eyJYUyI6W119LCJONSI6eyJZayI6WyIxIiwiMiJdLCJG
-byI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdLCJZay5LIjoiMSIsIllrLlYiOiIyIn0sImk1Ijp7ImJR
-IjpbIjEiXSwiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJONiI6eyJBbiI6WyIxIl19LCJWUiI6eyJ3TCI6
-W10sInZYIjpbXX0sIkVLIjp7ImliIjpbXSwiT2QiOltdfSwiS1ciOnsiY1giOlsiaWIiXSwiY1guRSI6
-ImliIn0sIlBiIjp7IkFuIjpbImliIl19LCJ0USI6eyJPZCI6W119LCJ1biI6eyJjWCI6WyJPZCJdLCJj
-WC5FIjoiT2QifSwiU2QiOnsiQW4iOlsiT2QiXX0sIkVUIjp7IkFTIjpbXX0sIlhIIjp7IlhqIjpbIjEi
-XSwiRVQiOltdLCJBUyI6W119LCJEZyI6eyJsRCI6WyJDUCJdLCJYaiI6WyJDUCJdLCJ6TSI6WyJDUCJd
-LCJFVCI6W10sImJRIjpbIkNQIl0sIkFTIjpbXSwiY1giOlsiQ1AiXSwiU1UiOlsiQ1AiXSwibEQuRSI6
-IkNQIn0sIlBnIjp7ImxEIjpbIklmIl0sIlhqIjpbIklmIl0sInpNIjpbIklmIl0sIkVUIjpbXSwiYlEi
-OlsiSWYiXSwiQVMiOltdLCJjWCI6WyJJZiJdLCJTVSI6WyJJZiJdfSwieGoiOnsibEQiOlsiSWYiXSwi
-WGoiOlsiSWYiXSwiek0iOlsiSWYiXSwiRVQiOltdLCJiUSI6WyJJZiJdLCJBUyI6W10sImNYIjpbIklm
-Il0sIlNVIjpbIklmIl0sImxELkUiOiJJZiJ9LCJkRSI6eyJsRCI6WyJJZiJdLCJYaiI6WyJJZiJdLCJ6
-TSI6WyJJZiJdLCJFVCI6W10sImJRIjpbIklmIl0sIkFTIjpbXSwiY1giOlsiSWYiXSwiU1UiOlsiSWYi
-XSwibEQuRSI6IklmIn0sIlpBIjp7ImxEIjpbIklmIl0sIlhqIjpbIklmIl0sInpNIjpbIklmIl0sIkVU
-IjpbXSwiYlEiOlsiSWYiXSwiQVMiOltdLCJjWCI6WyJJZiJdLCJTVSI6WyJJZiJdLCJsRC5FIjoiSWYi
-fSwiZFQiOnsibEQiOlsiSWYiXSwiWGoiOlsiSWYiXSwiek0iOlsiSWYiXSwiRVQiOltdLCJiUSI6WyJJ
-ZiJdLCJBUyI6W10sImNYIjpbIklmIl0sIlNVIjpbIklmIl0sImxELkUiOiJJZiJ9LCJQcSI6eyJsRCI6
-WyJJZiJdLCJYaiI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJFVCI6W10sImJRIjpbIklmIl0sIkFTIjpbXSwi
-Y1giOlsiSWYiXSwiU1UiOlsiSWYiXSwibEQuRSI6IklmIn0sImVFIjp7ImxEIjpbIklmIl0sIlhqIjpb
-IklmIl0sInpNIjpbIklmIl0sIkVUIjpbXSwiYlEiOlsiSWYiXSwiQVMiOltdLCJjWCI6WyJJZiJdLCJT
-VSI6WyJJZiJdLCJsRC5FIjoiSWYifSwiVjYiOnsibEQiOlsiSWYiXSwibjYiOltdLCJYaiI6WyJJZiJd
-LCJ6TSI6WyJJZiJdLCJFVCI6W10sImJRIjpbIklmIl0sIkFTIjpbXSwiY1giOlsiSWYiXSwiU1UiOlsi
-SWYiXSwibEQuRSI6IklmIn0sImtTIjp7IlhTIjpbXX0sImlNIjp7IlhTIjpbXX0sIkdWIjp7IkFuIjpb
-IjEiXX0sInE0Ijp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiWmYiOnsiUGYiOlsiMSJdfSwidnMiOnsi
-YjgiOlsiMSJdfSwiQ3ciOnsiWFMiOltdfSwibTAiOnsiUW0iOltdfSwiSmkiOnsibTAiOltdLCJRbSI6
-W119LCJiNiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImxmLkUi
-OiIxIn0sImxtIjp7IkFuIjpbIjEiXX0sIm1XIjp7ImNYIjpbIjEiXX0sInV5Ijp7ImxEIjpbIjEiXSwi
-ek0iOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sImlsIjp7IllrIjpbIjEiLCIyIl0sIlowIjpb
-IjEiLCIyIl19LCJZayI6eyJaMCI6WyIxIiwiMiJdfSwiUG4iOnsiWjAiOlsiMSIsIjIiXX0sIkdqIjp7
-IlJVIjpbIjEiLCIyIl0sIlBuIjpbIjEiLCIyIl0sIktQIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19
-LCJWaiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJYdiI6eyJs
-ZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ1dyI6eyJZayI6WyJxVSIs
-IkAiXSwiWjAiOlsicVUiLCJAIl0sIllrLksiOiJxVSIsIllrLlYiOiJAIn0sImk4Ijp7ImFMIjpbInFV
-Il0sImJRIjpbInFVIl0sImNYIjpbInFVIl0sImFMLkUiOiJxVSIsImNYLkUiOiJxVSJ9LCJDViI6eyJV
-ayI6WyJ6TTxJZj4iLCJxVSJdLCJVay5TIjoiek08SWY+In0sIlU4Ijp7IndJIjpbInpNPElmPiIsInFV
-Il19LCJaaSI6eyJVayI6WyJxVSIsInpNPElmPiJdfSwiVWQiOnsiWFMiOltdfSwiSzgiOnsiWFMiOltd
-fSwiYnkiOnsiVWsiOlsiTWg/IiwicVUiXSwiVWsuUyI6Ik1oPyJ9LCJvaiI6eyJ3SSI6WyJNaD8iLCJx
-VSJdfSwiTXgiOnsid0kiOlsicVUiLCJNaD8iXX0sInU1Ijp7IlVrIjpbInFVIiwiek08SWY+Il0sIlVr
-LlMiOiJxVSJ9LCJFMyI6eyJ3SSI6WyJxVSIsInpNPElmPiJdfSwiR1kiOnsid0kiOlsiek08SWY+Iiwi
-cVUiXX0sIkNQIjp7IkxaIjpbXX0sIklmIjp7IkxaIjpbXX0sInpNIjp7ImJRIjpbIjEiXSwiY1giOlsi
-MSJdfSwiaWIiOnsiT2QiOltdfSwieHUiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJxVSI6eyJ2WCI6
-W119LCJDNiI6eyJYUyI6W119LCJFeiI6eyJYUyI6W119LCJGIjp7IlhTIjpbXX0sInUiOnsiWFMiOltd
-fSwiYkoiOnsiWFMiOltdfSwiZVkiOnsiWFMiOltdfSwibXAiOnsiWFMiOltdfSwidWIiOnsiWFMiOltd
-fSwiZHMiOnsiWFMiOltdfSwibGoiOnsiWFMiOltdfSwiVVYiOnsiWFMiOltdfSwiazUiOnsiWFMiOltd
-fSwiS1kiOnsiWFMiOltdfSwicCI6eyJYUyI6W119LCJDRCI6eyJSeiI6W119LCJhRSI6eyJSeiI6W119
-LCJaZCI6eyJHeiI6W119LCJSbiI6eyJCTCI6W119LCJEbiI6eyJpRCI6W119LCJVZiI6eyJpRCI6W119
-LCJxZSI6eyJpRCI6W119LCJxRSI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiR2giOnsiY3YiOltd
-LCJ1SCI6W10sIkQwIjpbXX0sImZZIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJuQiI6eyJjdiI6
-W10sInVIIjpbXSwiRDAiOltdfSwiUVAiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIm54Ijp7InVI
-IjpbXSwiRDAiOltdfSwiUUYiOnsidUgiOltdLCJEMCI6W119LCJJQiI6eyJ0biI6WyJMWiJdfSwid3oi
-OnsibEQiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdLCJsRC5FIjoiMSJ9LCJj
-diI6eyJ1SCI6W10sIkQwIjpbXX0sImhIIjp7IkF6IjpbXX0sImg0Ijp7ImN2IjpbXSwidUgiOltdLCJE
-MCI6W119LCJWYiI6eyJ1SCI6W10sIkQwIjpbXX0sImZKIjp7IkQwIjpbXX0sIndhIjp7IkQwIjpbXX0s
-IkFqIjp7ImVhIjpbXX0sImU3Ijp7ImxEIjpbInVIIl0sInpNIjpbInVIIl0sImJRIjpbInVIIl0sImNY
-IjpbInVIIl0sImxELkUiOiJ1SCJ9LCJ1SCI6eyJEMCI6W119LCJCSCI6eyJsRCI6WyJ1SCJdLCJHbSI6
-WyJ1SCJdLCJ6TSI6WyJ1SCJdLCJYaiI6WyJ1SCJdLCJiUSI6WyJ1SCJdLCJjWCI6WyJ1SCJdLCJsRC5F
-IjoidUgiLCJHbS5FIjoidUgifSwiU04iOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sImV3Ijp7ImVh
-IjpbXX0sImxwIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJUYiI6eyJjdiI6W10sInVIIjpbXSwi
-RDAiOltdfSwiSXYiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIldQIjp7ImN2IjpbXSwidUgiOltd
-LCJEMCI6W119LCJ5WSI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwidzYiOnsiZWEiOltdfSwiSzUi
-OnsidjYiOltdLCJEMCI6W119LCJDbSI6eyJEMCI6W119LCJDUSI6eyJ1SCI6W10sIkQwIjpbXX0sInc0
-Ijp7InRuIjpbIkxaIl19LCJyaCI6eyJsRCI6WyJ1SCJdLCJHbSI6WyJ1SCJdLCJ6TSI6WyJ1SCJdLCJY
-aiI6WyJ1SCJdLCJiUSI6WyJ1SCJdLCJjWCI6WyJ1SCJdLCJsRC5FIjoidUgiLCJHbS5FIjoidUgifSwi
-Y2YiOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJxVSIsInFVIl19LCJpNyI6eyJZayI6WyJxVSIsInFV
-Il0sIlowIjpbInFVIiwicVUiXSwiWWsuSyI6InFVIiwiWWsuViI6InFVIn0sIlN5Ijp7IllrIjpbInFV
-IiwicVUiXSwiWjAiOlsicVUiLCJxVSJdLCJZay5LIjoicVUiLCJZay5WIjoicVUifSwiSTQiOnsibGYi
-OlsicVUiXSwieHUiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUiXSwibGYuRSI6InFVIn0sIlJP
-Ijp7InFoIjpbIjEiXX0sImV1Ijp7IlJPIjpbIjEiXSwicWgiOlsiMSJdfSwieEMiOnsiTU8iOlsiMSJd
-fSwiSlEiOnsia0YiOltdfSwidkQiOnsia0YiOltdfSwibTYiOnsia0YiOltdfSwiY3QiOnsia0YiOltd
-fSwiT3ciOnsia0YiOltdfSwiVzkiOnsiQW4iOlsiMSJdfSwiZFciOnsidjYiOltdLCJEMCI6W119LCJt
-ayI6eyJ5MCI6W119LCJLbyI6eyJvbiI6W119LCJBcyI6eyJsZiI6WyJxVSJdLCJ4dSI6WyJxVSJdLCJi
-USI6WyJxVSJdLCJjWCI6WyJxVSJdfSwicjciOnsiRTQiOltdfSwiVHoiOnsibEQiOlsiMSJdLCJ6TSI6
-WyIxIl0sImJRIjpbIjEiXSwiRTQiOltdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sIm5kIjp7ImhpIjpb
-XSwiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIktlIjp7ImxmIjpbInFVIl0sInh1IjpbInFVIl0sImJR
-IjpbInFVIl0sImNYIjpbInFVIl0sImxmLkUiOiJxVSJ9LCJoaSI6eyJjdiI6W10sInVIIjpbXSwiRDAi
-OltdfSwiWEEiOnsia0YiOltdfSwiZHYiOnsiUnoiOltdfSwiT0YiOnsiZnYiOltdfSwicnUiOnsiZnYi
-OltdfSwiSVYiOnsiZnYiOltdfSwibjYiOnsiek0iOlsiSWYiXSwiYlEiOlsiSWYiXSwiY1giOlsiSWYi
-XSwiQVMiOltdfX0nKSkKSC5GRih2LnR5cGVVbml2ZXJzZSxKU09OLnBhcnNlKCd7IncyIjoxLCJRQyI6
-MiwiWEgiOjEsImtUIjoyLCJtVyI6MSwidXkiOjEsImlsIjoyLCJWaiI6MSwiWHYiOjEsIm5ZIjoxLCJX
-WSI6MSwicFIiOjEsImNvIjoxfScpKQp2YXIgdT17bDoiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGgg
-ZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQgY29tcG9uZW50IixpOiJDYW5ub3QgZXh0cmFjdCBhIGZp
-bGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBxdWVyeSBjb21wb25lbnQiLGo6IkNhbm5vdCBleHRyYWN0
-IGEgbm9uLVdpbmRvd3MgZmlsZSBwYXRoIGZyb20gYSBmaWxlIFVSSSB3aXRoIGFuIGF1dGhvcml0eSIs
-ZzoiYG51bGxgIGVuY291bnRlcmVkIGFzIHRoZSByZXN1bHQgZnJvbSBleHByZXNzaW9uIHdpdGggdHlw
-ZSBgTmV2ZXJgLiIsZDoiYXJlYS1hbmFseXplcixhbmFseXplci1ubmJkLW1pZ3JhdGlvbix0eXBlLWJ1
-ZyJ9CnZhciB0PShmdW5jdGlvbiBydGlpKCl7dmFyIHM9SC5OMApyZXR1cm57bjpzKCJDdyIpLGNSOnMo
-Im5CIiksdzpzKCJBeiIpLHA6cygiUVAiKSxnRjpzKCJQRDxHRCxAPiIpLGI6cygiYlE8QD4iKSxoOnMo
-ImN2IikscjpzKCJYUyIpLEI6cygiZWEiKSxhUzpzKCJEMCIpLGc4OnMoIlJ6IiksYzg6cygiaEgiKSxZ
-OnMoIkVIIiksZDpzKCJiODxAPiIpLEk6cygiU2ciKSxvOnMoInZRIiksZWg6cygiY1g8dUg+IiksUTpz
-KCJjWDxxVT4iKSx1OnMoImNYPEA+IiksdjpzKCJqZDxrRj4iKSxzOnMoImpkPHFVPiIpLHg6cygiamQ8
-QD4iKSxhOnMoImpkPElmPiIpLGQ3OnMoImpkPFNlKj4iKSxoNDpzKCJqZDxqOCo+IiksRzpzKCJqZDxa
-MDxxVSosTWgqPio+IiksY1E6cygiamQ8WloqPiIpLGk6cygiamQ8cVUqPiIpLGFBOnMoImpkPHlEKj4i
-KSxhSjpzKCJqZDx3Yio+IiksVjpzKCJqZDxJZio+IiksZDQ6cygiamQ8cVU/PiIpLFQ6cygid2UiKSxl
-SDpzKCJ2bSIpLEQ6cygiYzUiKSxhVTpzKCJYajxAPiIpLGFtOnMoIlR6PEA+IiksZW86cygiTjU8R0Qs
-QD4iKSxkejpzKCJoRiIpLEU6cygiek08cVU+IiksajpzKCJ6TTxAPiIpLEw6cygiek08SWY+IiksSjpz
-KCJaMDxxVSxxVT4iKSxmOnMoIlowPEAsQD4iKSxkbzpzKCJsSjxxVSxAPiIpLGZqOnMoImxKPHFVKixx
-VT4iKSxkRTpzKCJFVCIpLGJtOnMoIlY2IiksQTpzKCJ1SCIpLGY2OnMoImtGIiksUDpzKCJjOCIpLEs6
-cygiTWgiKSxxOnMoInRuPExaPiIpLGZ2OnMoIndMIiksZXc6cygibmQiKSxDOnMoInh1PHFVPiIpLGw6
-cygiR3oiKSxOOnMoInFVIiksZDA6cygicVUocVUqKSIpLGc3OnMoImhpIiksZm86cygiR0QiKSxhVzpz
-KCJ5WSIpLGFrOnMoIkFTIiksZ2M6cygibjYiKSxiSjpzKCJrZCIpLGR3OnMoIkdqPHFVLHFVPiIpLGRE
-OnMoImlEIiksZUo6cygidTY8cVU+IiksZzQ6cygiSzUiKSxjaTpzKCJ2NiIpLGcyOnMoIkNtIiksYkM6
-cygiWmY8ZkoqPiIpLGg5OnMoIkNRIiksYWM6cygiZTciKSxrOnMoImV1PEFqKj4iKSxXOnMoInd6PGN2
-Kj4iKSxjOnMoInZzPEA+IiksZko6cygidnM8SWY+IiksZ1Y6cygidnM8ZkoqPiIpLGNyOnMoIkpRIiks
-eTpzKCJhMiIpLGFsOnMoImEyKE1oKSIpLGdSOnMoIkNQIiksejpzKCJAIiksZk86cygiQCgpIiksYkk6
-cygiQChNaCkiKSxhZzpzKCJAKE1oLEd6KSIpLGJVOnMoIkAoeHU8cVU+KSIpLGRPOnMoIkAocVUpIiks
-Yjg6cygiQChALEApIiksUzpzKCJJZiIpLGRkOnMoIkdoKiIpLGc6cygiY3YqIiksYUw6cygiZWEqIiks
-YVg6cygiTEwqIiksZkU6cygiSDcqIiksVTpzKCJjWDxAPioiKSxkSDpzKCJFNCoiKSxmSzpzKCJ6TTxA
-PioiKSxkXzpzKCJ6TTxqOCo+KiIpLGRwOnMoInpNPFowPHFVKixNaCo+Kj4qIiksbTpzKCJ6TTxNaCo+
-KiIpLGF3OnMoIlowPEAsQD4qIiksdDpzKCJaMDxxVSosTWgqPioiKSxPOnMoIkFqKiIpLGNGOnMoIjAm
-KiIpLF86cygiTWgqIiksZVE6cygiZXcqIiksWDpzKCJxVSoiKSxjaDpzKCJEMD8iKSxiRzpzKCJiODxj
-OD4/IiksYms6cygiek08cVU+PyIpLGJNOnMoInpNPEA+PyIpLGNaOnMoIlowPHFVLHFVPj8iKSxjOTpz
-KCJaMDxxVSxAPj8iKSxSOnMoIk1oPyIpLEY6cygiRmU8QCxAPj8iKSxlOnMoImJuPyIpLGI3OnMoImEy
-KE1oKT8iKSxidzpzKCJAKGVhKT8iKSxmVjpzKCJNaD8oTWg/LE1oPyk/IiksZEE6cygiTWg/KEApPyIp
-LFo6cygifigpPyIpLGViOnMoIn4oZXcqKT8iKSxkaTpzKCJMWiIpLEg6cygifiIpLE06cygifigpIiks
-ZUE6cygifihxVSxxVSkiKSxjQTpzKCJ+KHFVLEApIil9fSkoKTsoZnVuY3Rpb24gY29uc3RhbnRzKCl7
-dmFyIHM9aHVua0hlbHBlcnMubWFrZUNvbnN0TGlzdApDLnhuPVcuR2gucHJvdG90eXBlCkMuUlk9Vy5R
-UC5wcm90b3R5cGUKQy5tSD1XLmFlLnByb3RvdHlwZQpDLkJaPVcuVmIucHJvdG90eXBlCkMuRHQ9Vy5m
-Si5wcm90b3R5cGUKQy5Paz1KLnZCLnByb3RvdHlwZQpDLk5tPUouamQucHJvdG90eXBlCkMuam49Si5i
-VS5wcm90b3R5cGUKQy5qTj1KLndlLnByb3RvdHlwZQpDLkNEPUoucUkucHJvdG90eXBlCkMueEI9Si5E
-ci5wcm90b3R5cGUKQy5ERz1KLmM1LnByb3RvdHlwZQpDLkV4PVcudTgucHJvdG90eXBlCkMudDU9Vy5C
-SC5wcm90b3R5cGUKQy5MdD1XLlNOLnByb3RvdHlwZQpDLlpRPUouaUMucHJvdG90eXBlCkMuSWU9Vy5U
-Yi5wcm90b3R5cGUKQy52Qj1KLmtkLnByb3RvdHlwZQpDLm9sPVcuSzUucHJvdG90eXBlCkMueTg9bmV3
-IFAuVTgoKQpDLmg5PW5ldyBQLkNWKCkKQy5Hdz1uZXcgSC5GdShILk4wKCJGdTxjOD4iKSkKQy5PND1m
-dW5jdGlvbiBnZXRUYWdGYWxsYmFjayhvKSB7CiAgdmFyIHMgPSBPYmplY3QucHJvdG90eXBlLnRvU3Ry
-aW5nLmNhbGwobyk7CiAgcmV0dXJuIHMuc3Vic3RyaW5nKDgsIHMubGVuZ3RoIC0gMSk7Cn0KQy5ZcT1m
-dW5jdGlvbigpIHsKICB2YXIgdG9TdHJpbmdGdW5jdGlvbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJp
-bmc7CiAgZnVuY3Rpb24gZ2V0VGFnKG8pIHsKICAgIHZhciBzID0gdG9TdHJpbmdGdW5jdGlvbi5jYWxs
-KG8pOwogICAgcmV0dXJuIHMuc3Vic3RyaW5nKDgsIHMubGVuZ3RoIC0gMSk7CiAgfQogIGZ1bmN0aW9u
-IGdldFVua25vd25UYWcob2JqZWN0LCB0YWcpIHsKICAgIGlmICgvXkhUTUxbQS1aXS4qRWxlbWVudCQv
-LnRlc3QodGFnKSkgewogICAgICB2YXIgbmFtZSA9IHRvU3RyaW5nRnVuY3Rpb24uY2FsbChvYmplY3Qp
-OwogICAgICBpZiAobmFtZSA9PSAiW29iamVjdCBPYmplY3RdIikgcmV0dXJuIG51bGw7CiAgICAgIHJl
-dHVybiAiSFRNTEVsZW1lbnQiOwogICAgfQogIH0KICBmdW5jdGlvbiBnZXRVbmtub3duVGFnR2VuZXJp
-Y0Jyb3dzZXIob2JqZWN0LCB0YWcpIHsKICAgIGlmIChzZWxmLkhUTUxFbGVtZW50ICYmIG9iamVjdCBp
-bnN0YW5jZW9mIEhUTUxFbGVtZW50KSByZXR1cm4gIkhUTUxFbGVtZW50IjsKICAgIHJldHVybiBnZXRV
-bmtub3duVGFnKG9iamVjdCwgdGFnKTsKICB9CiAgZnVuY3Rpb24gcHJvdG90eXBlRm9yVGFnKHRhZykg
-ewogICAgaWYgKHR5cGVvZiB3aW5kb3cgPT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgaWYg
-KHR5cGVvZiB3aW5kb3dbdGFnXSA9PSAidW5kZWZpbmVkIikgcmV0dXJuIG51bGw7CiAgICB2YXIgY29u
-c3RydWN0b3IgPSB3aW5kb3dbdGFnXTsKICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT0gImZ1bmN0
-aW9uIikgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlOwogIH0KICBm
-dW5jdGlvbiBkaXNjcmltaW5hdG9yKHRhZykgeyByZXR1cm4gbnVsbDsgfQogIHZhciBpc0Jyb3dzZXIg
-PSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiOwogIHJldHVybiB7CiAgICBnZXRUYWc6IGdldFRh
-ZywKICAgIGdldFVua25vd25UYWc6IGlzQnJvd3NlciA/IGdldFVua25vd25UYWdHZW5lcmljQnJvd3Nl
-ciA6IGdldFVua25vd25UYWcsCiAgICBwcm90b3R5cGVGb3JUYWc6IHByb3RvdHlwZUZvclRhZywKICAg
-IGRpc2NyaW1pbmF0b3I6IGRpc2NyaW1pbmF0b3IgfTsKfQpDLndiPWZ1bmN0aW9uKGdldFRhZ0ZhbGxi
-YWNrKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGhvb2tzKSB7CiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAh
-PSAib2JqZWN0IikgcmV0dXJuIGhvb2tzOwogICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsK
-ICAgIGlmICh1YS5pbmRleE9mKCJEdW1wUmVuZGVyVHJlZSIpID49IDApIHJldHVybiBob29rczsKICAg
-IGlmICh1YS5pbmRleE9mKCJDaHJvbWUiKSA+PSAwKSB7CiAgICAgIGZ1bmN0aW9uIGNvbmZpcm0ocCkg
-ewogICAgICAgIHJldHVybiB0eXBlb2Ygd2luZG93ID09ICJvYmplY3QiICYmIHdpbmRvd1twXSAmJiB3
-aW5kb3dbcF0ubmFtZSA9PSBwOwogICAgICB9CiAgICAgIGlmIChjb25maXJtKCJXaW5kb3ciKSAmJiBj
-b25maXJtKCJIVE1MRWxlbWVudCIpKSByZXR1cm4gaG9va3M7CiAgICB9CiAgICBob29rcy5nZXRUYWcg
-PSBnZXRUYWdGYWxsYmFjazsKICB9Owp9CkMuS1U9ZnVuY3Rpb24oaG9va3MpIHsKICBpZiAodHlwZW9m
-IGRhcnRFeHBlcmltZW50YWxGaXh1cEdldFRhZyAhPSAiZnVuY3Rpb24iKSByZXR1cm4gaG9va3M7CiAg
-aG9va3MuZ2V0VGFnID0gZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFnKGhvb2tzLmdldFRhZyk7Cn0K
-Qy5mUT1mdW5jdGlvbihob29rcykgewogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAgdmFyIHBy
-b3RvdHlwZUZvclRhZyA9IGhvb2tzLnByb3RvdHlwZUZvclRhZzsKICBmdW5jdGlvbiBnZXRUYWdGaXhl
-ZChvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgaWYgKHRhZyA9PSAiRG9jdW1lbnQiKSB7
-CiAgICAgIGlmICghIW8ueG1sVmVyc2lvbikgcmV0dXJuICIhRG9jdW1lbnQiOwogICAgICByZXR1cm4g
-IiFIVE1MRG9jdW1lbnQiOwogICAgfQogICAgcmV0dXJuIHRhZzsKICB9CiAgZnVuY3Rpb24gcHJvdG90
-eXBlRm9yVGFnRml4ZWQodGFnKSB7CiAgICBpZiAodGFnID09ICJEb2N1bWVudCIpIHJldHVybiBudWxs
-OwogICAgcmV0dXJuIHByb3RvdHlwZUZvclRhZyh0YWcpOwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRU
-YWdGaXhlZDsKICBob29rcy5wcm90b3R5cGVGb3JUYWcgPSBwcm90b3R5cGVGb3JUYWdGaXhlZDsKfQpD
-LmRrPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIHVzZXJBZ2VudCA9IHR5cGVvZiBuYXZpZ2F0b3IgPT0g
-Im9iamVjdCIgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogIiI7CiAgaWYgKHVzZXJBZ2VudC5pbmRleE9m
-KCJGaXJlZm94IikgPT0gLTEpIHJldHVybiBob29rczsKICB2YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFn
-OwogIHZhciBxdWlja01hcCA9IHsKICAgICJCZWZvcmVVbmxvYWRFdmVudCI6ICJFdmVudCIsCiAgICAi
-RGF0YVRyYW5zZmVyIjogIkNsaXBib2FyZCIsCiAgICAiR2VvR2VvbG9jYXRpb24iOiAiR2VvbG9jYXRp
-b24iLAogICAgIkxvY2F0aW9uIjogIiFMb2NhdGlvbiIsCiAgICAiV29ya2VyTWVzc2FnZUV2ZW50Ijog
-Ik1lc3NhZ2VFdmVudCIsCiAgICAiWE1MRG9jdW1lbnQiOiAiIURvY3VtZW50In07CiAgZnVuY3Rpb24g
-Z2V0VGFnRmlyZWZveChvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgcmV0dXJuIHF1aWNr
-TWFwW3RhZ10gfHwgdGFnOwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRUYWdGaXJlZm94Owp9CkMueGk9
-ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciA9PSAib2Jq
-ZWN0IiA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAiIjsKICBpZiAodXNlckFnZW50LmluZGV4T2YoIlRy
-aWRlbnQvIikgPT0gLTEpIHJldHVybiBob29rczsKICB2YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFnOwog
-IHZhciBxdWlja01hcCA9IHsKICAgICJCZWZvcmVVbmxvYWRFdmVudCI6ICJFdmVudCIsCiAgICAiRGF0
-YVRyYW5zZmVyIjogIkNsaXBib2FyZCIsCiAgICAiSFRNTERERWxlbWVudCI6ICJIVE1MRWxlbWVudCIs
-CiAgICAiSFRNTERURWxlbWVudCI6ICJIVE1MRWxlbWVudCIsCiAgICAiSFRNTFBocmFzZUVsZW1lbnQi
-OiAiSFRNTEVsZW1lbnQiLAogICAgIlBvc2l0aW9uIjogIkdlb3Bvc2l0aW9uIgogIH07CiAgZnVuY3Rp
-b24gZ2V0VGFnSUUobykgewogICAgdmFyIHRhZyA9IGdldFRhZyhvKTsKICAgIHZhciBuZXdUYWcgPSBx
-dWlja01hcFt0YWddOwogICAgaWYgKG5ld1RhZykgcmV0dXJuIG5ld1RhZzsKICAgIGlmICh0YWcgPT0g
-Ik9iamVjdCIpIHsKICAgICAgaWYgKHdpbmRvdy5EYXRhVmlldyAmJiAobyBpbnN0YW5jZW9mIHdpbmRv
-dy5EYXRhVmlldykpIHJldHVybiAiRGF0YVZpZXciOwogICAgfQogICAgcmV0dXJuIHRhZzsKICB9CiAg
-ZnVuY3Rpb24gcHJvdG90eXBlRm9yVGFnSUUodGFnKSB7CiAgICB2YXIgY29uc3RydWN0b3IgPSB3aW5k
-b3dbdGFnXTsKICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVy
-biBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRhZ0lFOwogIGhv
-b2tzLnByb3RvdHlwZUZvclRhZyA9IHByb3RvdHlwZUZvclRhZ0lFOwp9CkMuaTc9ZnVuY3Rpb24oaG9v
-a3MpIHsgcmV0dXJuIGhvb2tzOyB9CgpDLkN0PW5ldyBQLmJ5KCkKQy5FcT1uZXcgUC5rNSgpCkMueE09
-bmV3IFAudTUoKQpDLlFrPW5ldyBQLkUzKCkKQy5Odj1uZXcgSC5rcigpCkMuTlU9bmV3IFAuSmkoKQpD
-LnBkPW5ldyBQLlpkKCkKQy5BZD1uZXcgTS5INygwLCJIaW50QWN0aW9uS2luZC5hZGROdWxsYWJsZUhp
-bnQiKQpDLm5lPW5ldyBNLkg3KDEsIkhpbnRBY3Rpb25LaW5kLmFkZE5vbk51bGxhYmxlSGludCIpCkMu
-bXk9bmV3IE0uSDcoMiwiSGludEFjdGlvbktpbmQuY2hhbmdlVG9OdWxsYWJsZUhpbnQiKQpDLnJ4PW5l
-dyBNLkg3KDMsIkhpbnRBY3Rpb25LaW5kLmNoYW5nZVRvTm9uTnVsbGFibGVIaW50IikKQy53Vj1uZXcg
-TS5INyg0LCJIaW50QWN0aW9uS2luZC5yZW1vdmVOdWxsYWJsZUhpbnQiKQpDLmZSPW5ldyBNLkg3KDUs
-IkhpbnRBY3Rpb25LaW5kLnJlbW92ZU5vbk51bGxhYmxlSGludCIpCkMuQTM9bmV3IFAuTXgobnVsbCkK
-Qy5uWD1uZXcgUC5vaihudWxsKQpDLmFrPUguVk0ocyhbMCwwLDMyNzc2LDMzNzkyLDEsMTAyNDAsMCww
-XSksdC5WKQpDLmNtPUguVk0ocyhbIio6OmNsYXNzIiwiKjo6ZGlyIiwiKjo6ZHJhZ2dhYmxlIiwiKjo6
-aGlkZGVuIiwiKjo6aWQiLCIqOjppbmVydCIsIio6Oml0ZW1wcm9wIiwiKjo6aXRlbXJlZiIsIio6Oml0
-ZW1zY29wZSIsIio6OmxhbmciLCIqOjpzcGVsbGNoZWNrIiwiKjo6dGl0bGUiLCIqOjp0cmFuc2xhdGUi
-LCJBOjphY2Nlc3NrZXkiLCJBOjpjb29yZHMiLCJBOjpocmVmbGFuZyIsIkE6Om5hbWUiLCJBOjpzaGFw
-ZSIsIkE6OnRhYmluZGV4IiwiQTo6dGFyZ2V0IiwiQTo6dHlwZSIsIkFSRUE6OmFjY2Vzc2tleSIsIkFS
-RUE6OmFsdCIsIkFSRUE6OmNvb3JkcyIsIkFSRUE6Om5vaHJlZiIsIkFSRUE6OnNoYXBlIiwiQVJFQTo6
-dGFiaW5kZXgiLCJBUkVBOjp0YXJnZXQiLCJBVURJTzo6Y29udHJvbHMiLCJBVURJTzo6bG9vcCIsIkFV
-RElPOjptZWRpYWdyb3VwIiwiQVVESU86Om11dGVkIiwiQVVESU86OnByZWxvYWQiLCJCRE86OmRpciIs
-IkJPRFk6OmFsaW5rIiwiQk9EWTo6Ymdjb2xvciIsIkJPRFk6OmxpbmsiLCJCT0RZOjp0ZXh0IiwiQk9E
-WTo6dmxpbmsiLCJCUjo6Y2xlYXIiLCJCVVRUT046OmFjY2Vzc2tleSIsIkJVVFRPTjo6ZGlzYWJsZWQi
-LCJCVVRUT046Om5hbWUiLCJCVVRUT046OnRhYmluZGV4IiwiQlVUVE9OOjp0eXBlIiwiQlVUVE9OOjp2
-YWx1ZSIsIkNBTlZBUzo6aGVpZ2h0IiwiQ0FOVkFTOjp3aWR0aCIsIkNBUFRJT046OmFsaWduIiwiQ09M
-OjphbGlnbiIsIkNPTDo6Y2hhciIsIkNPTDo6Y2hhcm9mZiIsIkNPTDo6c3BhbiIsIkNPTDo6dmFsaWdu
-IiwiQ09MOjp3aWR0aCIsIkNPTEdST1VQOjphbGlnbiIsIkNPTEdST1VQOjpjaGFyIiwiQ09MR1JPVVA6
-OmNoYXJvZmYiLCJDT0xHUk9VUDo6c3BhbiIsIkNPTEdST1VQOjp2YWxpZ24iLCJDT0xHUk9VUDo6d2lk
-dGgiLCJDT01NQU5EOjpjaGVja2VkIiwiQ09NTUFORDo6Y29tbWFuZCIsIkNPTU1BTkQ6OmRpc2FibGVk
-IiwiQ09NTUFORDo6bGFiZWwiLCJDT01NQU5EOjpyYWRpb2dyb3VwIiwiQ09NTUFORDo6dHlwZSIsIkRB
-VEE6OnZhbHVlIiwiREVMOjpkYXRldGltZSIsIkRFVEFJTFM6Om9wZW4iLCJESVI6OmNvbXBhY3QiLCJE
-SVY6OmFsaWduIiwiREw6OmNvbXBhY3QiLCJGSUVMRFNFVDo6ZGlzYWJsZWQiLCJGT05UOjpjb2xvciIs
-IkZPTlQ6OmZhY2UiLCJGT05UOjpzaXplIiwiRk9STTo6YWNjZXB0IiwiRk9STTo6YXV0b2NvbXBsZXRl
-IiwiRk9STTo6ZW5jdHlwZSIsIkZPUk06Om1ldGhvZCIsIkZPUk06Om5hbWUiLCJGT1JNOjpub3ZhbGlk
-YXRlIiwiRk9STTo6dGFyZ2V0IiwiRlJBTUU6Om5hbWUiLCJIMTo6YWxpZ24iLCJIMjo6YWxpZ24iLCJI
-Mzo6YWxpZ24iLCJINDo6YWxpZ24iLCJINTo6YWxpZ24iLCJINjo6YWxpZ24iLCJIUjo6YWxpZ24iLCJI
-Ujo6bm9zaGFkZSIsIkhSOjpzaXplIiwiSFI6OndpZHRoIiwiSFRNTDo6dmVyc2lvbiIsIklGUkFNRTo6
-YWxpZ24iLCJJRlJBTUU6OmZyYW1lYm9yZGVyIiwiSUZSQU1FOjpoZWlnaHQiLCJJRlJBTUU6Om1hcmdp
-bmhlaWdodCIsIklGUkFNRTo6bWFyZ2lud2lkdGgiLCJJRlJBTUU6OndpZHRoIiwiSU1HOjphbGlnbiIs
-IklNRzo6YWx0IiwiSU1HOjpib3JkZXIiLCJJTUc6OmhlaWdodCIsIklNRzo6aHNwYWNlIiwiSU1HOjpp
-c21hcCIsIklNRzo6bmFtZSIsIklNRzo6dXNlbWFwIiwiSU1HOjp2c3BhY2UiLCJJTUc6OndpZHRoIiwi
-SU5QVVQ6OmFjY2VwdCIsIklOUFVUOjphY2Nlc3NrZXkiLCJJTlBVVDo6YWxpZ24iLCJJTlBVVDo6YWx0
-IiwiSU5QVVQ6OmF1dG9jb21wbGV0ZSIsIklOUFVUOjphdXRvZm9jdXMiLCJJTlBVVDo6Y2hlY2tlZCIs
-IklOUFVUOjpkaXNhYmxlZCIsIklOUFVUOjppbnB1dG1vZGUiLCJJTlBVVDo6aXNtYXAiLCJJTlBVVDo6
-bGlzdCIsIklOUFVUOjptYXgiLCJJTlBVVDo6bWF4bGVuZ3RoIiwiSU5QVVQ6Om1pbiIsIklOUFVUOjpt
-dWx0aXBsZSIsIklOUFVUOjpuYW1lIiwiSU5QVVQ6OnBsYWNlaG9sZGVyIiwiSU5QVVQ6OnJlYWRvbmx5
-IiwiSU5QVVQ6OnJlcXVpcmVkIiwiSU5QVVQ6OnNpemUiLCJJTlBVVDo6c3RlcCIsIklOUFVUOjp0YWJp
-bmRleCIsIklOUFVUOjp0eXBlIiwiSU5QVVQ6OnVzZW1hcCIsIklOUFVUOjp2YWx1ZSIsIklOUzo6ZGF0
-ZXRpbWUiLCJLRVlHRU46OmRpc2FibGVkIiwiS0VZR0VOOjprZXl0eXBlIiwiS0VZR0VOOjpuYW1lIiwi
-TEFCRUw6OmFjY2Vzc2tleSIsIkxBQkVMOjpmb3IiLCJMRUdFTkQ6OmFjY2Vzc2tleSIsIkxFR0VORDo6
-YWxpZ24iLCJMSTo6dHlwZSIsIkxJOjp2YWx1ZSIsIkxJTks6OnNpemVzIiwiTUFQOjpuYW1lIiwiTUVO
-VTo6Y29tcGFjdCIsIk1FTlU6OmxhYmVsIiwiTUVOVTo6dHlwZSIsIk1FVEVSOjpoaWdoIiwiTUVURVI6
-OmxvdyIsIk1FVEVSOjptYXgiLCJNRVRFUjo6bWluIiwiTUVURVI6OnZhbHVlIiwiT0JKRUNUOjp0eXBl
-bXVzdG1hdGNoIiwiT0w6OmNvbXBhY3QiLCJPTDo6cmV2ZXJzZWQiLCJPTDo6c3RhcnQiLCJPTDo6dHlw
-ZSIsIk9QVEdST1VQOjpkaXNhYmxlZCIsIk9QVEdST1VQOjpsYWJlbCIsIk9QVElPTjo6ZGlzYWJsZWQi
-LCJPUFRJT046OmxhYmVsIiwiT1BUSU9OOjpzZWxlY3RlZCIsIk9QVElPTjo6dmFsdWUiLCJPVVRQVVQ6
-OmZvciIsIk9VVFBVVDo6bmFtZSIsIlA6OmFsaWduIiwiUFJFOjp3aWR0aCIsIlBST0dSRVNTOjptYXgi
-LCJQUk9HUkVTUzo6bWluIiwiUFJPR1JFU1M6OnZhbHVlIiwiU0VMRUNUOjphdXRvY29tcGxldGUiLCJT
-RUxFQ1Q6OmRpc2FibGVkIiwiU0VMRUNUOjptdWx0aXBsZSIsIlNFTEVDVDo6bmFtZSIsIlNFTEVDVDo6
-cmVxdWlyZWQiLCJTRUxFQ1Q6OnNpemUiLCJTRUxFQ1Q6OnRhYmluZGV4IiwiU09VUkNFOjp0eXBlIiwi
-VEFCTEU6OmFsaWduIiwiVEFCTEU6OmJnY29sb3IiLCJUQUJMRTo6Ym9yZGVyIiwiVEFCTEU6OmNlbGxw
-YWRkaW5nIiwiVEFCTEU6OmNlbGxzcGFjaW5nIiwiVEFCTEU6OmZyYW1lIiwiVEFCTEU6OnJ1bGVzIiwi
-VEFCTEU6OnN1bW1hcnkiLCJUQUJMRTo6d2lkdGgiLCJUQk9EWTo6YWxpZ24iLCJUQk9EWTo6Y2hhciIs
-IlRCT0RZOjpjaGFyb2ZmIiwiVEJPRFk6OnZhbGlnbiIsIlREOjphYmJyIiwiVEQ6OmFsaWduIiwiVEQ6
-OmF4aXMiLCJURDo6Ymdjb2xvciIsIlREOjpjaGFyIiwiVEQ6OmNoYXJvZmYiLCJURDo6Y29sc3BhbiIs
-IlREOjpoZWFkZXJzIiwiVEQ6OmhlaWdodCIsIlREOjpub3dyYXAiLCJURDo6cm93c3BhbiIsIlREOjpz
-Y29wZSIsIlREOjp2YWxpZ24iLCJURDo6d2lkdGgiLCJURVhUQVJFQTo6YWNjZXNza2V5IiwiVEVYVEFS
-RUE6OmF1dG9jb21wbGV0ZSIsIlRFWFRBUkVBOjpjb2xzIiwiVEVYVEFSRUE6OmRpc2FibGVkIiwiVEVY
-VEFSRUE6OmlucHV0bW9kZSIsIlRFWFRBUkVBOjpuYW1lIiwiVEVYVEFSRUE6OnBsYWNlaG9sZGVyIiwi
-VEVYVEFSRUE6OnJlYWRvbmx5IiwiVEVYVEFSRUE6OnJlcXVpcmVkIiwiVEVYVEFSRUE6OnJvd3MiLCJU
-RVhUQVJFQTo6dGFiaW5kZXgiLCJURVhUQVJFQTo6d3JhcCIsIlRGT09UOjphbGlnbiIsIlRGT09UOjpj
-aGFyIiwiVEZPT1Q6OmNoYXJvZmYiLCJURk9PVDo6dmFsaWduIiwiVEg6OmFiYnIiLCJUSDo6YWxpZ24i
-LCJUSDo6YXhpcyIsIlRIOjpiZ2NvbG9yIiwiVEg6OmNoYXIiLCJUSDo6Y2hhcm9mZiIsIlRIOjpjb2xz
-cGFuIiwiVEg6OmhlYWRlcnMiLCJUSDo6aGVpZ2h0IiwiVEg6Om5vd3JhcCIsIlRIOjpyb3dzcGFuIiwi
-VEg6OnNjb3BlIiwiVEg6OnZhbGlnbiIsIlRIOjp3aWR0aCIsIlRIRUFEOjphbGlnbiIsIlRIRUFEOjpj
-aGFyIiwiVEhFQUQ6OmNoYXJvZmYiLCJUSEVBRDo6dmFsaWduIiwiVFI6OmFsaWduIiwiVFI6OmJnY29s
-b3IiLCJUUjo6Y2hhciIsIlRSOjpjaGFyb2ZmIiwiVFI6OnZhbGlnbiIsIlRSQUNLOjpkZWZhdWx0Iiwi
-VFJBQ0s6OmtpbmQiLCJUUkFDSzo6bGFiZWwiLCJUUkFDSzo6c3JjbGFuZyIsIlVMOjpjb21wYWN0Iiwi
-VUw6OnR5cGUiLCJWSURFTzo6Y29udHJvbHMiLCJWSURFTzo6aGVpZ2h0IiwiVklERU86Omxvb3AiLCJW
-SURFTzo6bWVkaWFncm91cCIsIlZJREVPOjptdXRlZCIsIlZJREVPOjpwcmVsb2FkIiwiVklERU86Ondp
-ZHRoIl0pLHQuaSkKQy5WQz1ILlZNKHMoWzAsMCw2NTQ5MCw0NTA1NSw2NTUzNSwzNDgxNSw2NTUzNCwx
-ODQzMV0pLHQuVikKQy5tSz1ILlZNKHMoWzAsMCwyNjYyNCwxMDIzLDY1NTM0LDIwNDcsNjU1MzQsMjA0
-N10pLHQuVikKQy5TcT1ILlZNKHMoWyJIRUFEIiwiQVJFQSIsIkJBU0UiLCJCQVNFRk9OVCIsIkJSIiwi
-Q09MIiwiQ09MR1JPVVAiLCJFTUJFRCIsIkZSQU1FIiwiRlJBTUVTRVQiLCJIUiIsIklNQUdFIiwiSU1H
-IiwiSU5QVVQiLCJJU0lOREVYIiwiTElOSyIsIk1FVEEiLCJQQVJBTSIsIlNPVVJDRSIsIlNUWUxFIiwi
-VElUTEUiLCJXQlIiXSksdC5pKQpDLmhVPUguVk0ocyhbXSksdC54KQpDLmRuPUguVk0ocyhbXSksSC5O
-MCgiamQ8TEwqPiIpKQpDLnhEPUguVk0ocyhbXSksdC5pKQpDLnRvPUguVk0ocyhbMCwwLDMyNzIyLDEy
-Mjg3LDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC5WKQpDLnJrPUguVk0ocyhbQy5BZCxDLm5lLEMu
-bXksQy5yeCxDLndWLEMuZlJdKSxILk4wKCJqZDxINyo+IikpCkMuRjM9SC5WTShzKFswLDAsMjQ1NzYs
-MTAyMyw2NTUzNCwzNDgxNSw2NTUzNCwxODQzMV0pLHQuVikKQy5lYT1ILlZNKHMoWzAsMCwzMjc1NCwx
-MTI2Myw2NTUzNCwzNDgxNSw2NTUzNCwxODQzMV0pLHQuVikKQy5aSj1ILlZNKHMoWzAsMCwzMjcyMiwx
-MjI4Nyw2NTUzNSwzNDgxNSw2NTUzNCwxODQzMV0pLHQuVikKQy5XZD1ILlZNKHMoWzAsMCw2NTQ5MCwx
-MjI4Nyw2NTUzNSwzNDgxNSw2NTUzNCwxODQzMV0pLHQuVikKQy5ReD1ILlZNKHMoWyJiaW5kIiwiaWYi
-LCJyZWYiLCJyZXBlYXQiLCJzeW50YXgiXSksdC5pKQpDLkJJPUguVk0ocyhbIkE6OmhyZWYiLCJBUkVB
-OjpocmVmIiwiQkxPQ0tRVU9URTo6Y2l0ZSIsIkJPRFk6OmJhY2tncm91bmQiLCJDT01NQU5EOjppY29u
-IiwiREVMOjpjaXRlIiwiRk9STTo6YWN0aW9uIiwiSU1HOjpzcmMiLCJJTlBVVDo6c3JjIiwiSU5TOjpj
-aXRlIiwiUTo6Y2l0ZSIsIlZJREVPOjpwb3N0ZXIiXSksdC5pKQpDLkR4PW5ldyBILkxQKDAse30sQy54
-RCxILk4wKCJMUDxxVSosek08ajgqPio+IikpCkMuQ009bmV3IEguTFAoMCx7fSxDLnhELEguTjAoIkxQ
-PHFVKixxVSo+IikpCkMuaUg9SC5WTShzKFtdKSxILk4wKCJqZDxHRCo+IikpCkMuV089bmV3IEguTFAo
-MCx7fSxDLmlILEguTjAoIkxQPEdEKixAPiIpKQpDLlkyPW5ldyBMLk85KCJOYXZpZ2F0aW9uVHJlZU5v
-ZGVUeXBlLmRpcmVjdG9yeSIpCkMucmY9bmV3IEwuTzkoIk5hdmlnYXRpb25UcmVlTm9kZVR5cGUuZmls
-ZSIpCkMuVGU9bmV3IEgud3YoImNhbGwiKQpDLm9FPW5ldyBQLkdZKCExKQpDLndRPW5ldyBQLkZ5KG51
-bGwsMil9KSgpOyhmdW5jdGlvbiBzdGF0aWNGaWVsZHMoKXskLnptPW51bGwKJC55aj0wCiQubUo9bnVs
-bAokLlA0PW51bGwKJC5ORj1udWxsCiQuVFg9bnVsbAokLng3PW51bGwKJC5udz1udWxsCiQudnY9bnVs
-bAokLkJ2PW51bGwKJC5TNj1udWxsCiQuazg9bnVsbAokLm1nPW51bGwKJC5VRD0hMQokLlgzPUMuTlUK
-JC54Zz1ILlZNKFtdLEguTjAoImpkPE1oPiIpKQokLnhvPW51bGwKJC5CTz1udWxsCiQubHQ9bnVsbAok
-LkVVPW51bGwKJC5vcj1QLkZsKHQuTix0LlkpCiQuSTY9bnVsbAokLkZmPW51bGx9KSgpOyhmdW5jdGlv
-biBsYXp5SW5pdGlhbGl6ZXJzKCl7dmFyIHM9aHVua0hlbHBlcnMubGF6eUZpbmFsLHI9aHVua0hlbHBl
-cnMubGF6eU9sZApzKCQsImZhIiwidyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5ZZygiXyRkYXJ0X2RhcnRD
-bG9zdXJlIil9KQpzKCQsIlUyIiwiU24iLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oSC5TNyh7CnRvU3Ry
-aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNlaXZlciQifX0pKX0pCnMoJCwieHEiLCJscSIsZnVuY3Rp
-b24oKXtyZXR1cm4gSC5jTShILlM3KHskbWV0aG9kJDpudWxsLAp0b1N0cmluZzpmdW5jdGlvbigpe3Jl
-dHVybiIkcmVjZWl2ZXIkIn19KSl9KQpzKCQsIlIxIiwiTjkiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00o
-SC5TNyhudWxsKSl9KQpzKCQsImZOIiwiaUkiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oZnVuY3Rpb24o
-KXt2YXIgJGFyZ3VtZW50c0V4cHIkPSckYXJndW1lbnRzJCcKdHJ5e251bGwuJG1ldGhvZCQoJGFyZ3Vt
-ZW50c0V4cHIkKX1jYXRjaChxKXtyZXR1cm4gcS5tZXNzYWdlfX0oKSl9KQpzKCQsInFpIiwiVU4iLGZ1
-bmN0aW9uKCl7cmV0dXJuIEguY00oSC5TNyh2b2lkIDApKX0pCnMoJCwicloiLCJaaCIsZnVuY3Rpb24o
-KXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3ZhciAkYXJndW1lbnRzRXhwciQ9JyRhcmd1bWVudHMkJwp0
-cnl7KHZvaWQgMCkuJG1ldGhvZCQoJGFyZ3VtZW50c0V4cHIkKX1jYXRjaChxKXtyZXR1cm4gcS5tZXNz
-YWdlfX0oKSl9KQpzKCQsImtxIiwick4iLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oSC5NaihudWxsKSl9
-KQpzKCQsInR0IiwiYzMiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oZnVuY3Rpb24oKXt0cnl7bnVsbC4k
-bWV0aG9kJH1jYXRjaChxKXtyZXR1cm4gcS5tZXNzYWdlfX0oKSl9KQpzKCQsImR0IiwiSEsiLGZ1bmN0
-aW9uKCl7cmV0dXJuIEguY00oSC5Naih2b2lkIDApKX0pCnMoJCwiQTciLCJyMSIsZnVuY3Rpb24oKXty
-ZXR1cm4gSC5jTShmdW5jdGlvbigpe3RyeXsodm9pZCAwKS4kbWV0aG9kJH1jYXRjaChxKXtyZXR1cm4g
-cS5tZXNzYWdlfX0oKSl9KQpzKCQsIldjIiwidXQiLGZ1bmN0aW9uKCl7cmV0dXJuIFAuT2ooKX0pCnMo
-JCwia2giLCJyZiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFAucGcoKS4kMCgpfSkKcygkLCJhWCIsIkhH
-IixmdW5jdGlvbigpe3JldHVybiBuZXcgUC5jMigpLiQwKCl9KQpzKCQsImJ0IiwiVjciLGZ1bmN0aW9u
-KCl7cmV0dXJuIG5ldyBJbnQ4QXJyYXkoSC5YRihILlZNKFstMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwt
-MiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwt
-MiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMSwtMiwtMiwtMiwtMiwtMiw2MiwtMiw2MiwtMiw2Myw1
-Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSwtMiwtMiwtMiwtMSwtMiwtMiwtMiwwLDEsMiwzLDQs
-NSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LC0y
-LC0yLC0yLC0yLDYzLC0yLDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQw
-LDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLC0yLC0yLC0yLC0yLC0yXSx0LmEpKSl9KQpz
-KCQsIk01Iiwid1EiLGZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBwcm9jZXNzIT0idW5kZWZpbmVkIiYm
-T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpPT0iW29iamVjdCBwcm9jZXNzXSIm
-JnByb2Nlc3MucGxhdGZvcm09PSJ3aW4zMiJ9KQpzKCQsIm1mIiwiejQiLGZ1bmN0aW9uKCl7cmV0dXJu
-IFAubnUoIl5bXFwtXFwuMC05QS1aX2Eten5dKiQiKX0pCnMoJCwiT1EiLCJ2WiIsZnVuY3Rpb24oKXty
-ZXR1cm4gUC5LTigpfSkKcygkLCJTQyIsIkFOIixmdW5jdGlvbigpe3JldHVybiBQLnRNKFsiQSIsIkFC
-QlIiLCJBQ1JPTllNIiwiQUREUkVTUyIsIkFSRUEiLCJBUlRJQ0xFIiwiQVNJREUiLCJBVURJTyIsIkIi
-LCJCREkiLCJCRE8iLCJCSUciLCJCTE9DS1FVT1RFIiwiQlIiLCJCVVRUT04iLCJDQU5WQVMiLCJDQVBU
-SU9OIiwiQ0VOVEVSIiwiQ0lURSIsIkNPREUiLCJDT0wiLCJDT0xHUk9VUCIsIkNPTU1BTkQiLCJEQVRB
-IiwiREFUQUxJU1QiLCJERCIsIkRFTCIsIkRFVEFJTFMiLCJERk4iLCJESVIiLCJESVYiLCJETCIsIkRU
-IiwiRU0iLCJGSUVMRFNFVCIsIkZJR0NBUFRJT04iLCJGSUdVUkUiLCJGT05UIiwiRk9PVEVSIiwiRk9S
-TSIsIkgxIiwiSDIiLCJIMyIsIkg0IiwiSDUiLCJINiIsIkhFQURFUiIsIkhHUk9VUCIsIkhSIiwiSSIs
-IklGUkFNRSIsIklNRyIsIklOUFVUIiwiSU5TIiwiS0JEIiwiTEFCRUwiLCJMRUdFTkQiLCJMSSIsIk1B
-UCIsIk1BUksiLCJNRU5VIiwiTUVURVIiLCJOQVYiLCJOT0JSIiwiT0wiLCJPUFRHUk9VUCIsIk9QVElP
-TiIsIk9VVFBVVCIsIlAiLCJQUkUiLCJQUk9HUkVTUyIsIlEiLCJTIiwiU0FNUCIsIlNFQ1RJT04iLCJT
-RUxFQ1QiLCJTTUFMTCIsIlNPVVJDRSIsIlNQQU4iLCJTVFJJS0UiLCJTVFJPTkciLCJTVUIiLCJTVU1N
-QVJZIiwiU1VQIiwiVEFCTEUiLCJUQk9EWSIsIlREIiwiVEVYVEFSRUEiLCJURk9PVCIsIlRIIiwiVEhF
-QUQiLCJUSU1FIiwiVFIiLCJUUkFDSyIsIlRUIiwiVSIsIlVMIiwiVkFSIiwiVklERU8iLCJXQlIiXSx0
-Lk4pfSkKcygkLCJYNCIsImhHIixmdW5jdGlvbigpe3JldHVybiBQLm51KCJeXFxTKyQiKX0pCnMoJCwi
-d08iLCJvdyIsZnVuY3Rpb24oKXtyZXR1cm4gUC5ORChzZWxmKX0pCnMoJCwia3QiLCJSOCIsZnVuY3Rp
-b24oKXtyZXR1cm4gSC5ZZygiXyRkYXJ0X2RhcnRPYmplY3QiKX0pCnMoJCwiZksiLCJrSSIsZnVuY3Rp
-b24oKXtyZXR1cm4gZnVuY3Rpb24gRGFydE9iamVjdChhKXt0aGlzLm89YX19KQpyKCQsInF0IiwiekIi
-LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBULm1RKCl9KQpyKCQsIk9sIiwiVUUiLGZ1bmN0aW9uKCl7cmV0
-dXJuIFAuaEsoQy5vbC5nbVcoVy54MygpKS5ocmVmKS5naFkoKS5xKDAsImF1dGhUb2tlbiIpfSkKcigk
-LCJoVCIsInlQIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiLmVkaXQtbGlz
-dCAucGFuZWwtY29udGVudCIpfSkKcigkLCJXNiIsImhMIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCku
-cXVlcnlTZWxlY3RvcigiLmVkaXQtcGFuZWwgLnBhbmVsLWNvbnRlbnQiKX0pCnIoJCwiVFIiLCJEVyIs
-ZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoImZvb3RlciIpfSkKcigkLCJFWSIs
-ImZpIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiaGVhZGVyIil9KQpyKCQs
-ImF2IiwiRDkiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIjdW5pdC1uYW1l
-Iil9KQpyKCQsImZlIiwiS0ciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMLlhBKCl9KQpzKCQsImVvIiwi
-blUiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNLmxJKCQuSGsoKSl9KQpzKCQsInlyIiwiYkQiLGZ1bmN0
-aW9uKCl7cmV0dXJuIG5ldyBFLk9GKFAubnUoIi8iKSxQLm51KCJbXi9dJCIpLFAubnUoIl4vIikpfSkK
-cygkLCJNayIsIktrIixmdW5jdGlvbigpe3JldHVybiBuZXcgTC5JVihQLm51KCJbL1xcXFxdIiksUC5u
-dSgiW14vXFxcXF0kIiksUC5udSgiXihcXFxcXFxcXFteXFxcXF0rXFxcXFteXFxcXC9dK3xbYS16QS1a
-XTpbL1xcXFxdKSIpLFAubnUoIl5bL1xcXFxdKD8hWy9cXFxcXSkiKSl9KQpzKCQsImFrIiwiRWIiLGZ1
-bmN0aW9uKCl7cmV0dXJuIG5ldyBGLnJ1KFAubnUoIi8iKSxQLm51KCIoXlthLXpBLVpdWy0rLmEtekEt
-WlxcZF0qOi8vfFteL10pJCIpLFAubnUoIlthLXpBLVpdWy0rLmEtekEtWlxcZF0qOi8vW14vXSoiKSxQ
-Lm51KCJeLyIpKX0pCnMoJCwibHMiLCJIayIsZnVuY3Rpb24oKXtyZXR1cm4gTy5SaCgpfSl9KSgpOyhm
-dW5jdGlvbiBuYXRpdmVTdXBwb3J0KCl7IWZ1bmN0aW9uKCl7dmFyIHM9ZnVuY3Rpb24oYSl7dmFyIG09
-e30KbVthXT0xCnJldHVybiBPYmplY3Qua2V5cyhodW5rSGVscGVycy5jb252ZXJ0VG9GYXN0T2JqZWN0
-KG0pKVswXX0Kdi5nZXRJc29sYXRlVGFnPWZ1bmN0aW9uKGEpe3JldHVybiBzKCJfX19kYXJ0XyIrYSt2
-Lmlzb2xhdGVUYWcpfQp2YXIgcj0iX19fZGFydF9pc29sYXRlX3RhZ3NfIgp2YXIgcT1PYmplY3Rbcl18
-fChPYmplY3Rbcl09T2JqZWN0LmNyZWF0ZShudWxsKSkKdmFyIHA9Il9aeFl4WCIKZm9yKHZhciBvPTA7
-O28rKyl7dmFyIG49cyhwKyJfIitvKyJfIikKaWYoIShuIGluIHEpKXtxW25dPTEKdi5pc29sYXRlVGFn
-PW4KYnJlYWt9fXYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWU9di5nZXRJc29sYXRlVGFnKCJkaXNwYXRjaF9y
-ZWNvcmQiKX0oKQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFnKHtET01FcnJv
-cjpKLnZCLE1lZGlhRXJyb3I6Si52QixOYXZpZ2F0b3I6Si52QixOYXZpZ2F0b3JDb25jdXJyZW50SGFy
-ZHdhcmU6Si52QixOYXZpZ2F0b3JVc2VyTWVkaWFFcnJvcjpKLnZCLE92ZXJjb25zdHJhaW5lZEVycm9y
-OkoudkIsUG9zaXRpb25FcnJvcjpKLnZCLFJhbmdlOkoudkIsU1FMRXJyb3I6Si52QixEYXRhVmlldzpI
-LkVULEFycmF5QnVmZmVyVmlldzpILkVULEZsb2F0MzJBcnJheTpILkRnLEZsb2F0NjRBcnJheTpILkRn
-LEludDE2QXJyYXk6SC54aixJbnQzMkFycmF5OkguZEUsSW50OEFycmF5OkguWkEsVWludDE2QXJyYXk6
-SC5kVCxVaW50MzJBcnJheTpILlBxLFVpbnQ4Q2xhbXBlZEFycmF5OkguZUUsQ2FudmFzUGl4ZWxBcnJh
-eTpILmVFLFVpbnQ4QXJyYXk6SC5WNixIVE1MQXVkaW9FbGVtZW50OlcucUUsSFRNTEJSRWxlbWVudDpX
-LnFFLEhUTUxCdXR0b25FbGVtZW50OlcucUUsSFRNTENhbnZhc0VsZW1lbnQ6Vy5xRSxIVE1MQ29udGVu
-dEVsZW1lbnQ6Vy5xRSxIVE1MRExpc3RFbGVtZW50OlcucUUsSFRNTERhdGFFbGVtZW50OlcucUUsSFRN
-TERhdGFMaXN0RWxlbWVudDpXLnFFLEhUTUxEZXRhaWxzRWxlbWVudDpXLnFFLEhUTUxEaWFsb2dFbGVt
-ZW50OlcucUUsSFRNTERpdkVsZW1lbnQ6Vy5xRSxIVE1MRW1iZWRFbGVtZW50OlcucUUsSFRNTEZpZWxk
-U2V0RWxlbWVudDpXLnFFLEhUTUxIUkVsZW1lbnQ6Vy5xRSxIVE1MSGVhZEVsZW1lbnQ6Vy5xRSxIVE1M
-SGVhZGluZ0VsZW1lbnQ6Vy5xRSxIVE1MSHRtbEVsZW1lbnQ6Vy5xRSxIVE1MSUZyYW1lRWxlbWVudDpX
-LnFFLEhUTUxJbWFnZUVsZW1lbnQ6Vy5xRSxIVE1MSW5wdXRFbGVtZW50OlcucUUsSFRNTExJRWxlbWVu
-dDpXLnFFLEhUTUxMYWJlbEVsZW1lbnQ6Vy5xRSxIVE1MTGVnZW5kRWxlbWVudDpXLnFFLEhUTUxMaW5r
-RWxlbWVudDpXLnFFLEhUTUxNYXBFbGVtZW50OlcucUUsSFRNTE1lZGlhRWxlbWVudDpXLnFFLEhUTUxN
-ZW51RWxlbWVudDpXLnFFLEhUTUxNZXRhRWxlbWVudDpXLnFFLEhUTUxNZXRlckVsZW1lbnQ6Vy5xRSxI
-VE1MTW9kRWxlbWVudDpXLnFFLEhUTUxPTGlzdEVsZW1lbnQ6Vy5xRSxIVE1MT2JqZWN0RWxlbWVudDpX
-LnFFLEhUTUxPcHRHcm91cEVsZW1lbnQ6Vy5xRSxIVE1MT3B0aW9uRWxlbWVudDpXLnFFLEhUTUxPdXRw
-dXRFbGVtZW50OlcucUUsSFRNTFBhcmFtRWxlbWVudDpXLnFFLEhUTUxQaWN0dXJlRWxlbWVudDpXLnFF
-LEhUTUxQcmVFbGVtZW50OlcucUUsSFRNTFByb2dyZXNzRWxlbWVudDpXLnFFLEhUTUxRdW90ZUVsZW1l
-bnQ6Vy5xRSxIVE1MU2NyaXB0RWxlbWVudDpXLnFFLEhUTUxTaGFkb3dFbGVtZW50OlcucUUsSFRNTFNs
-b3RFbGVtZW50OlcucUUsSFRNTFNvdXJjZUVsZW1lbnQ6Vy5xRSxIVE1MU3BhbkVsZW1lbnQ6Vy5xRSxI
-VE1MU3R5bGVFbGVtZW50OlcucUUsSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVD
-ZWxsRWxlbWVudDpXLnFFLEhUTUxUYWJsZURhdGFDZWxsRWxlbWVudDpXLnFFLEhUTUxUYWJsZUhlYWRl
-ckNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlQ29sRWxlbWVudDpXLnFFLEhUTUxUZXh0QXJlYUVsZW1l
-bnQ6Vy5xRSxIVE1MVGltZUVsZW1lbnQ6Vy5xRSxIVE1MVGl0bGVFbGVtZW50OlcucUUsSFRNTFRyYWNr
-RWxlbWVudDpXLnFFLEhUTUxVTGlzdEVsZW1lbnQ6Vy5xRSxIVE1MVW5rbm93bkVsZW1lbnQ6Vy5xRSxI
-VE1MVmlkZW9FbGVtZW50OlcucUUsSFRNTERpcmVjdG9yeUVsZW1lbnQ6Vy5xRSxIVE1MRm9udEVsZW1l
-bnQ6Vy5xRSxIVE1MRnJhbWVFbGVtZW50OlcucUUsSFRNTEZyYW1lU2V0RWxlbWVudDpXLnFFLEhUTUxN
-YXJxdWVlRWxlbWVudDpXLnFFLEhUTUxFbGVtZW50OlcucUUsSFRNTEFuY2hvckVsZW1lbnQ6Vy5HaCxI
-VE1MQXJlYUVsZW1lbnQ6Vy5mWSxIVE1MQmFzZUVsZW1lbnQ6Vy5uQixCbG9iOlcuQXosSFRNTEJvZHlF
-bGVtZW50OlcuUVAsQ0RBVEFTZWN0aW9uOlcubngsQ2hhcmFjdGVyRGF0YTpXLm54LENvbW1lbnQ6Vy5u
-eCxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246Vy5ueCxUZXh0OlcubngsQ1NTU3R5bGVEZWNsYXJhdGlvbjpX
-Lm9KLE1TU3R5bGVDU1NQcm9wZXJ0aWVzOlcub0osQ1NTMlByb3BlcnRpZXM6Vy5vSixYTUxEb2N1bWVu
-dDpXLlFGLERvY3VtZW50OlcuUUYsRE9NRXhjZXB0aW9uOlcuTmgsRE9NSW1wbGVtZW50YXRpb246Vy5h
-ZSxET01SZWN0UmVhZE9ubHk6Vy5JQixET01Ub2tlbkxpc3Q6Vy5uNyxFbGVtZW50OlcuY3YsQWJvcnRQ
-YXltZW50RXZlbnQ6Vy5lYSxBbmltYXRpb25FdmVudDpXLmVhLEFuaW1hdGlvblBsYXliYWNrRXZlbnQ6
-Vy5lYSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaENsaWNrRXZl
-bnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaEZhaWxFdmVudDpX
-LmVhLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6Vy5lYSxCZWZvcmVJbnN0YWxsUHJvbXB0RXZlbnQ6Vy5l
-YSxCZWZvcmVVbmxvYWRFdmVudDpXLmVhLEJsb2JFdmVudDpXLmVhLENhbk1ha2VQYXltZW50RXZlbnQ6
-Vy5lYSxDbGlwYm9hcmRFdmVudDpXLmVhLENsb3NlRXZlbnQ6Vy5lYSxDdXN0b21FdmVudDpXLmVhLERl
-dmljZU1vdGlvbkV2ZW50OlcuZWEsRGV2aWNlT3JpZW50YXRpb25FdmVudDpXLmVhLEVycm9yRXZlbnQ6
-Vy5lYSxFeHRlbmRhYmxlRXZlbnQ6Vy5lYSxFeHRlbmRhYmxlTWVzc2FnZUV2ZW50OlcuZWEsRmV0Y2hF
-dmVudDpXLmVhLEZvbnRGYWNlU2V0TG9hZEV2ZW50OlcuZWEsRm9yZWlnbkZldGNoRXZlbnQ6Vy5lYSxH
-YW1lcGFkRXZlbnQ6Vy5lYSxIYXNoQ2hhbmdlRXZlbnQ6Vy5lYSxJbnN0YWxsRXZlbnQ6Vy5lYSxNZWRp
-YUVuY3J5cHRlZEV2ZW50OlcuZWEsTWVkaWFLZXlNZXNzYWdlRXZlbnQ6Vy5lYSxNZWRpYVF1ZXJ5TGlz
-dEV2ZW50OlcuZWEsTWVkaWFTdHJlYW1FdmVudDpXLmVhLE1lZGlhU3RyZWFtVHJhY2tFdmVudDpXLmVh
-LE1lc3NhZ2VFdmVudDpXLmVhLE1JRElDb25uZWN0aW9uRXZlbnQ6Vy5lYSxNSURJTWVzc2FnZUV2ZW50
-OlcuZWEsTXV0YXRpb25FdmVudDpXLmVhLE5vdGlmaWNhdGlvbkV2ZW50OlcuZWEsUGFnZVRyYW5zaXRp
-b25FdmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0RXZlbnQ6Vy5lYSxQYXltZW50UmVxdWVzdFVwZGF0ZUV2
-ZW50OlcuZWEsUG9wU3RhdGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25BdmFpbGFibGVF
-dmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZUV2ZW50OlcuZWEsUHJvbWlzZVJlamVj
-dGlvbkV2ZW50OlcuZWEsUHVzaEV2ZW50OlcuZWEsUlRDRGF0YUNoYW5uZWxFdmVudDpXLmVhLFJUQ0RU
-TUZUb25lQ2hhbmdlRXZlbnQ6Vy5lYSxSVENQZWVyQ29ubmVjdGlvbkljZUV2ZW50OlcuZWEsUlRDVHJh
-Y2tFdmVudDpXLmVhLFNlY3VyaXR5UG9saWN5VmlvbGF0aW9uRXZlbnQ6Vy5lYSxTZW5zb3JFcnJvckV2
-ZW50OlcuZWEsU3BlZWNoUmVjb2duaXRpb25FcnJvcjpXLmVhLFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6
-Vy5lYSxTcGVlY2hTeW50aGVzaXNFdmVudDpXLmVhLFN0b3JhZ2VFdmVudDpXLmVhLFN5bmNFdmVudDpX
-LmVhLFRyYWNrRXZlbnQ6Vy5lYSxUcmFuc2l0aW9uRXZlbnQ6Vy5lYSxXZWJLaXRUcmFuc2l0aW9uRXZl
-bnQ6Vy5lYSxWUkRldmljZUV2ZW50OlcuZWEsVlJEaXNwbGF5RXZlbnQ6Vy5lYSxWUlNlc3Npb25FdmVu
-dDpXLmVhLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZlbnQ6Vy5lYSxVU0JDb25uZWN0aW9uRXZlbnQ6Vy5l
-YSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6Vy5lYSxBdWRpb1Byb2Nlc3NpbmdFdmVudDpXLmVhLE9mZmxp
-bmVBdWRpb0NvbXBsZXRpb25FdmVudDpXLmVhLFdlYkdMQ29udGV4dEV2ZW50OlcuZWEsRXZlbnQ6Vy5l
-YSxJbnB1dEV2ZW50OlcuZWEsU3VibWl0RXZlbnQ6Vy5lYSxFdmVudFRhcmdldDpXLkQwLEZpbGU6Vy5o
-SCxIVE1MRm9ybUVsZW1lbnQ6Vy5oNCxIaXN0b3J5OlcuYnIsSFRNTERvY3VtZW50OlcuVmIsWE1MSHR0
-cFJlcXVlc3Q6Vy5mSixYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0Olcud2EsSW1hZ2VEYXRhOlcuU2cs
-TG9jYXRpb246Vy51OCxNb3VzZUV2ZW50OlcuQWosRHJhZ0V2ZW50OlcuQWosUG9pbnRlckV2ZW50Olcu
-QWosV2hlZWxFdmVudDpXLkFqLERvY3VtZW50RnJhZ21lbnQ6Vy51SCxTaGFkb3dSb290OlcudUgsRG9j
-dW1lbnRUeXBlOlcudUgsTm9kZTpXLnVILE5vZGVMaXN0OlcuQkgsUmFkaW9Ob2RlTGlzdDpXLkJILEhU
-TUxQYXJhZ3JhcGhFbGVtZW50OlcuU04sUHJvZ3Jlc3NFdmVudDpXLmV3LFJlc291cmNlUHJvZ3Jlc3NF
-dmVudDpXLmV3LEhUTUxTZWxlY3RFbGVtZW50OlcubHAsSFRNTFRhYmxlRWxlbWVudDpXLlRiLEhUTUxU
-YWJsZVJvd0VsZW1lbnQ6Vy5JdixIVE1MVGFibGVTZWN0aW9uRWxlbWVudDpXLldQLEhUTUxUZW1wbGF0
-ZUVsZW1lbnQ6Vy55WSxDb21wb3NpdGlvbkV2ZW50OlcudzYsRm9jdXNFdmVudDpXLnc2LEtleWJvYXJk
-RXZlbnQ6Vy53NixUZXh0RXZlbnQ6Vy53NixUb3VjaEV2ZW50OlcudzYsVUlFdmVudDpXLnc2LFdpbmRv
-dzpXLks1LERPTVdpbmRvdzpXLks1LERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sU2Vydmlj
-ZVdvcmtlckdsb2JhbFNjb3BlOlcuQ20sU2hhcmVkV29ya2VyR2xvYmFsU2NvcGU6Vy5DbSxXb3JrZXJH
-bG9iYWxTY29wZTpXLkNtLEF0dHI6Vy5DUSxDbGllbnRSZWN0OlcudzQsRE9NUmVjdDpXLnc0LE5hbWVk
-Tm9kZU1hcDpXLnJoLE1vek5hbWVkQXR0ck1hcDpXLnJoLElEQktleVJhbmdlOlAuaEYsU1ZHU2NyaXB0
-RWxlbWVudDpQLm5kLFNWR0FFbGVtZW50OlAuaGksU1ZHQW5pbWF0ZUVsZW1lbnQ6UC5oaSxTVkdBbmlt
-YXRlTW90aW9uRWxlbWVudDpQLmhpLFNWR0FuaW1hdGVUcmFuc2Zvcm1FbGVtZW50OlAuaGksU1ZHQW5p
-bWF0aW9uRWxlbWVudDpQLmhpLFNWR0NpcmNsZUVsZW1lbnQ6UC5oaSxTVkdDbGlwUGF0aEVsZW1lbnQ6
-UC5oaSxTVkdEZWZzRWxlbWVudDpQLmhpLFNWR0Rlc2NFbGVtZW50OlAuaGksU1ZHRGlzY2FyZEVsZW1l
-bnQ6UC5oaSxTVkdFbGxpcHNlRWxlbWVudDpQLmhpLFNWR0ZFQmxlbmRFbGVtZW50OlAuaGksU1ZHRkVD
-b2xvck1hdHJpeEVsZW1lbnQ6UC5oaSxTVkdGRUNvbXBvbmVudFRyYW5zZmVyRWxlbWVudDpQLmhpLFNW
-R0ZFQ29tcG9zaXRlRWxlbWVudDpQLmhpLFNWR0ZFQ29udm9sdmVNYXRyaXhFbGVtZW50OlAuaGksU1ZH
-RkVEaWZmdXNlTGlnaHRpbmdFbGVtZW50OlAuaGksU1ZHRkVEaXNwbGFjZW1lbnRNYXBFbGVtZW50OlAu
-aGksU1ZHRkVEaXN0YW50TGlnaHRFbGVtZW50OlAuaGksU1ZHRkVGbG9vZEVsZW1lbnQ6UC5oaSxTVkdG
-RUZ1bmNBRWxlbWVudDpQLmhpLFNWR0ZFRnVuY0JFbGVtZW50OlAuaGksU1ZHRkVGdW5jR0VsZW1lbnQ6
-UC5oaSxTVkdGRUZ1bmNSRWxlbWVudDpQLmhpLFNWR0ZFR2F1c3NpYW5CbHVyRWxlbWVudDpQLmhpLFNW
-R0ZFSW1hZ2VFbGVtZW50OlAuaGksU1ZHRkVNZXJnZUVsZW1lbnQ6UC5oaSxTVkdGRU1lcmdlTm9kZUVs
-ZW1lbnQ6UC5oaSxTVkdGRU1vcnBob2xvZ3lFbGVtZW50OlAuaGksU1ZHRkVPZmZzZXRFbGVtZW50OlAu
-aGksU1ZHRkVQb2ludExpZ2h0RWxlbWVudDpQLmhpLFNWR0ZFU3BlY3VsYXJMaWdodGluZ0VsZW1lbnQ6
-UC5oaSxTVkdGRVNwb3RMaWdodEVsZW1lbnQ6UC5oaSxTVkdGRVRpbGVFbGVtZW50OlAuaGksU1ZHRkVU
-dXJidWxlbmNlRWxlbWVudDpQLmhpLFNWR0ZpbHRlckVsZW1lbnQ6UC5oaSxTVkdGb3JlaWduT2JqZWN0
-RWxlbWVudDpQLmhpLFNWR0dFbGVtZW50OlAuaGksU1ZHR2VvbWV0cnlFbGVtZW50OlAuaGksU1ZHR3Jh
-cGhpY3NFbGVtZW50OlAuaGksU1ZHSW1hZ2VFbGVtZW50OlAuaGksU1ZHTGluZUVsZW1lbnQ6UC5oaSxT
-VkdMaW5lYXJHcmFkaWVudEVsZW1lbnQ6UC5oaSxTVkdNYXJrZXJFbGVtZW50OlAuaGksU1ZHTWFza0Vs
-ZW1lbnQ6UC5oaSxTVkdNZXRhZGF0YUVsZW1lbnQ6UC5oaSxTVkdQYXRoRWxlbWVudDpQLmhpLFNWR1Bh
-dHRlcm5FbGVtZW50OlAuaGksU1ZHUG9seWdvbkVsZW1lbnQ6UC5oaSxTVkdQb2x5bGluZUVsZW1lbnQ6
-UC5oaSxTVkdSYWRpYWxHcmFkaWVudEVsZW1lbnQ6UC5oaSxTVkdSZWN0RWxlbWVudDpQLmhpLFNWR1Nl
-dEVsZW1lbnQ6UC5oaSxTVkdTdG9wRWxlbWVudDpQLmhpLFNWR1N0eWxlRWxlbWVudDpQLmhpLFNWR1NW
-R0VsZW1lbnQ6UC5oaSxTVkdTd2l0Y2hFbGVtZW50OlAuaGksU1ZHU3ltYm9sRWxlbWVudDpQLmhpLFNW
-R1RTcGFuRWxlbWVudDpQLmhpLFNWR1RleHRDb250ZW50RWxlbWVudDpQLmhpLFNWR1RleHRFbGVtZW50
-OlAuaGksU1ZHVGV4dFBhdGhFbGVtZW50OlAuaGksU1ZHVGV4dFBvc2l0aW9uaW5nRWxlbWVudDpQLmhp
-LFNWR1RpdGxlRWxlbWVudDpQLmhpLFNWR1VzZUVsZW1lbnQ6UC5oaSxTVkdWaWV3RWxlbWVudDpQLmhp
-LFNWR0dyYWRpZW50RWxlbWVudDpQLmhpLFNWR0NvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50
-OlAuaGksU1ZHRkVEcm9wU2hhZG93RWxlbWVudDpQLmhpLFNWR01QYXRoRWxlbWVudDpQLmhpLFNWR0Vs
-ZW1lbnQ6UC5oaX0pCmh1bmtIZWxwZXJzLnNldE9yVXBkYXRlTGVhZlRhZ3Moe0RPTUVycm9yOnRydWUs
-TWVkaWFFcnJvcjp0cnVlLE5hdmlnYXRvcjp0cnVlLE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTp0
-cnVlLE5hdmlnYXRvclVzZXJNZWRpYUVycm9yOnRydWUsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6dHJ1ZSxQ
-b3NpdGlvbkVycm9yOnRydWUsUmFuZ2U6dHJ1ZSxTUUxFcnJvcjp0cnVlLERhdGFWaWV3OnRydWUsQXJy
-YXlCdWZmZXJWaWV3OmZhbHNlLEZsb2F0MzJBcnJheTp0cnVlLEZsb2F0NjRBcnJheTp0cnVlLEludDE2
-QXJyYXk6dHJ1ZSxJbnQzMkFycmF5OnRydWUsSW50OEFycmF5OnRydWUsVWludDE2QXJyYXk6dHJ1ZSxV
-aW50MzJBcnJheTp0cnVlLFVpbnQ4Q2xhbXBlZEFycmF5OnRydWUsQ2FudmFzUGl4ZWxBcnJheTp0cnVl
-LFVpbnQ4QXJyYXk6ZmFsc2UsSFRNTEF1ZGlvRWxlbWVudDp0cnVlLEhUTUxCUkVsZW1lbnQ6dHJ1ZSxI
-VE1MQnV0dG9uRWxlbWVudDp0cnVlLEhUTUxDYW52YXNFbGVtZW50OnRydWUsSFRNTENvbnRlbnRFbGVt
-ZW50OnRydWUsSFRNTERMaXN0RWxlbWVudDp0cnVlLEhUTUxEYXRhRWxlbWVudDp0cnVlLEhUTUxEYXRh
-TGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGV0YWlsc0VsZW1lbnQ6dHJ1ZSxIVE1MRGlhbG9nRWxlbWVudDp0
-cnVlLEhUTUxEaXZFbGVtZW50OnRydWUsSFRNTEVtYmVkRWxlbWVudDp0cnVlLEhUTUxGaWVsZFNldEVs
-ZW1lbnQ6dHJ1ZSxIVE1MSFJFbGVtZW50OnRydWUsSFRNTEhlYWRFbGVtZW50OnRydWUsSFRNTEhlYWRp
-bmdFbGVtZW50OnRydWUsSFRNTEh0bWxFbGVtZW50OnRydWUsSFRNTElGcmFtZUVsZW1lbnQ6dHJ1ZSxI
-VE1MSW1hZ2VFbGVtZW50OnRydWUsSFRNTElucHV0RWxlbWVudDp0cnVlLEhUTUxMSUVsZW1lbnQ6dHJ1
-ZSxIVE1MTGFiZWxFbGVtZW50OnRydWUsSFRNTExlZ2VuZEVsZW1lbnQ6dHJ1ZSxIVE1MTGlua0VsZW1l
-bnQ6dHJ1ZSxIVE1MTWFwRWxlbWVudDp0cnVlLEhUTUxNZWRpYUVsZW1lbnQ6dHJ1ZSxIVE1MTWVudUVs
-ZW1lbnQ6dHJ1ZSxIVE1MTWV0YUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0ZXJFbGVtZW50OnRydWUsSFRNTE1v
-ZEVsZW1lbnQ6dHJ1ZSxIVE1MT0xpc3RFbGVtZW50OnRydWUsSFRNTE9iamVjdEVsZW1lbnQ6dHJ1ZSxI
-VE1MT3B0R3JvdXBFbGVtZW50OnRydWUsSFRNTE9wdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MT3V0cHV0RWxl
-bWVudDp0cnVlLEhUTUxQYXJhbUVsZW1lbnQ6dHJ1ZSxIVE1MUGljdHVyZUVsZW1lbnQ6dHJ1ZSxIVE1M
-UHJlRWxlbWVudDp0cnVlLEhUTUxQcm9ncmVzc0VsZW1lbnQ6dHJ1ZSxIVE1MUXVvdGVFbGVtZW50OnRy
-dWUsSFRNTFNjcmlwdEVsZW1lbnQ6dHJ1ZSxIVE1MU2hhZG93RWxlbWVudDp0cnVlLEhUTUxTbG90RWxl
-bWVudDp0cnVlLEhUTUxTb3VyY2VFbGVtZW50OnRydWUsSFRNTFNwYW5FbGVtZW50OnRydWUsSFRNTFN0
-eWxlRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OnRydWUsSFRNTFRhYmxlQ2VsbEVs
-ZW1lbnQ6dHJ1ZSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVIZWFkZXJDZWxs
-RWxlbWVudDp0cnVlLEhUTUxUYWJsZUNvbEVsZW1lbnQ6dHJ1ZSxIVE1MVGV4dEFyZWFFbGVtZW50OnRy
-dWUsSFRNTFRpbWVFbGVtZW50OnRydWUsSFRNTFRpdGxlRWxlbWVudDp0cnVlLEhUTUxUcmFja0VsZW1l
-bnQ6dHJ1ZSxIVE1MVUxpc3RFbGVtZW50OnRydWUsSFRNTFVua25vd25FbGVtZW50OnRydWUsSFRNTFZp
-ZGVvRWxlbWVudDp0cnVlLEhUTUxEaXJlY3RvcnlFbGVtZW50OnRydWUsSFRNTEZvbnRFbGVtZW50OnRy
-dWUsSFRNTEZyYW1lRWxlbWVudDp0cnVlLEhUTUxGcmFtZVNldEVsZW1lbnQ6dHJ1ZSxIVE1MTWFycXVl
-ZUVsZW1lbnQ6dHJ1ZSxIVE1MRWxlbWVudDpmYWxzZSxIVE1MQW5jaG9yRWxlbWVudDp0cnVlLEhUTUxB
-cmVhRWxlbWVudDp0cnVlLEhUTUxCYXNlRWxlbWVudDp0cnVlLEJsb2I6ZmFsc2UsSFRNTEJvZHlFbGVt
-ZW50OnRydWUsQ0RBVEFTZWN0aW9uOnRydWUsQ2hhcmFjdGVyRGF0YTp0cnVlLENvbW1lbnQ6dHJ1ZSxQ
-cm9jZXNzaW5nSW5zdHJ1Y3Rpb246dHJ1ZSxUZXh0OnRydWUsQ1NTU3R5bGVEZWNsYXJhdGlvbjp0cnVl
-LE1TU3R5bGVDU1NQcm9wZXJ0aWVzOnRydWUsQ1NTMlByb3BlcnRpZXM6dHJ1ZSxYTUxEb2N1bWVudDp0
-cnVlLERvY3VtZW50OmZhbHNlLERPTUV4Y2VwdGlvbjp0cnVlLERPTUltcGxlbWVudGF0aW9uOnRydWUs
-RE9NUmVjdFJlYWRPbmx5OmZhbHNlLERPTVRva2VuTGlzdDp0cnVlLEVsZW1lbnQ6ZmFsc2UsQWJvcnRQ
-YXltZW50RXZlbnQ6dHJ1ZSxBbmltYXRpb25FdmVudDp0cnVlLEFuaW1hdGlvblBsYXliYWNrRXZlbnQ6
-dHJ1ZSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaENsaWNrRXZl
-bnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaEZhaWxFdmVudDp0
-cnVlLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6dHJ1ZSxCZWZvcmVJbnN0YWxsUHJvbXB0RXZlbnQ6dHJ1
-ZSxCZWZvcmVVbmxvYWRFdmVudDp0cnVlLEJsb2JFdmVudDp0cnVlLENhbk1ha2VQYXltZW50RXZlbnQ6
-dHJ1ZSxDbGlwYm9hcmRFdmVudDp0cnVlLENsb3NlRXZlbnQ6dHJ1ZSxDdXN0b21FdmVudDp0cnVlLERl
-dmljZU1vdGlvbkV2ZW50OnRydWUsRGV2aWNlT3JpZW50YXRpb25FdmVudDp0cnVlLEVycm9yRXZlbnQ6
-dHJ1ZSxFeHRlbmRhYmxlRXZlbnQ6dHJ1ZSxFeHRlbmRhYmxlTWVzc2FnZUV2ZW50OnRydWUsRmV0Y2hF
-dmVudDp0cnVlLEZvbnRGYWNlU2V0TG9hZEV2ZW50OnRydWUsRm9yZWlnbkZldGNoRXZlbnQ6dHJ1ZSxH
-YW1lcGFkRXZlbnQ6dHJ1ZSxIYXNoQ2hhbmdlRXZlbnQ6dHJ1ZSxJbnN0YWxsRXZlbnQ6dHJ1ZSxNZWRp
-YUVuY3J5cHRlZEV2ZW50OnRydWUsTWVkaWFLZXlNZXNzYWdlRXZlbnQ6dHJ1ZSxNZWRpYVF1ZXJ5TGlz
-dEV2ZW50OnRydWUsTWVkaWFTdHJlYW1FdmVudDp0cnVlLE1lZGlhU3RyZWFtVHJhY2tFdmVudDp0cnVl
-LE1lc3NhZ2VFdmVudDp0cnVlLE1JRElDb25uZWN0aW9uRXZlbnQ6dHJ1ZSxNSURJTWVzc2FnZUV2ZW50
-OnRydWUsTXV0YXRpb25FdmVudDp0cnVlLE5vdGlmaWNhdGlvbkV2ZW50OnRydWUsUGFnZVRyYW5zaXRp
-b25FdmVudDp0cnVlLFBheW1lbnRSZXF1ZXN0RXZlbnQ6dHJ1ZSxQYXltZW50UmVxdWVzdFVwZGF0ZUV2
-ZW50OnRydWUsUG9wU3RhdGVFdmVudDp0cnVlLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25BdmFpbGFibGVF
-dmVudDp0cnVlLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZUV2ZW50OnRydWUsUHJvbWlzZVJlamVj
-dGlvbkV2ZW50OnRydWUsUHVzaEV2ZW50OnRydWUsUlRDRGF0YUNoYW5uZWxFdmVudDp0cnVlLFJUQ0RU
-TUZUb25lQ2hhbmdlRXZlbnQ6dHJ1ZSxSVENQZWVyQ29ubmVjdGlvbkljZUV2ZW50OnRydWUsUlRDVHJh
-Y2tFdmVudDp0cnVlLFNlY3VyaXR5UG9saWN5VmlvbGF0aW9uRXZlbnQ6dHJ1ZSxTZW5zb3JFcnJvckV2
-ZW50OnRydWUsU3BlZWNoUmVjb2duaXRpb25FcnJvcjp0cnVlLFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6
-dHJ1ZSxTcGVlY2hTeW50aGVzaXNFdmVudDp0cnVlLFN0b3JhZ2VFdmVudDp0cnVlLFN5bmNFdmVudDp0
-cnVlLFRyYWNrRXZlbnQ6dHJ1ZSxUcmFuc2l0aW9uRXZlbnQ6dHJ1ZSxXZWJLaXRUcmFuc2l0aW9uRXZl
-bnQ6dHJ1ZSxWUkRldmljZUV2ZW50OnRydWUsVlJEaXNwbGF5RXZlbnQ6dHJ1ZSxWUlNlc3Npb25FdmVu
-dDp0cnVlLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZlbnQ6dHJ1ZSxVU0JDb25uZWN0aW9uRXZlbnQ6dHJ1
-ZSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6dHJ1ZSxBdWRpb1Byb2Nlc3NpbmdFdmVudDp0cnVlLE9mZmxp
-bmVBdWRpb0NvbXBsZXRpb25FdmVudDp0cnVlLFdlYkdMQ29udGV4dEV2ZW50OnRydWUsRXZlbnQ6ZmFs
-c2UsSW5wdXRFdmVudDpmYWxzZSxTdWJtaXRFdmVudDpmYWxzZSxFdmVudFRhcmdldDpmYWxzZSxGaWxl
-OnRydWUsSFRNTEZvcm1FbGVtZW50OnRydWUsSGlzdG9yeTp0cnVlLEhUTUxEb2N1bWVudDp0cnVlLFhN
-TEh0dHBSZXF1ZXN0OnRydWUsWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpmYWxzZSxJbWFnZURhdGE6
-dHJ1ZSxMb2NhdGlvbjp0cnVlLE1vdXNlRXZlbnQ6dHJ1ZSxEcmFnRXZlbnQ6dHJ1ZSxQb2ludGVyRXZl
-bnQ6dHJ1ZSxXaGVlbEV2ZW50OnRydWUsRG9jdW1lbnRGcmFnbWVudDp0cnVlLFNoYWRvd1Jvb3Q6dHJ1
-ZSxEb2N1bWVudFR5cGU6dHJ1ZSxOb2RlOmZhbHNlLE5vZGVMaXN0OnRydWUsUmFkaW9Ob2RlTGlzdDp0
-cnVlLEhUTUxQYXJhZ3JhcGhFbGVtZW50OnRydWUsUHJvZ3Jlc3NFdmVudDp0cnVlLFJlc291cmNlUHJv
-Z3Jlc3NFdmVudDp0cnVlLEhUTUxTZWxlY3RFbGVtZW50OnRydWUsSFRNTFRhYmxlRWxlbWVudDp0cnVl
-LEhUTUxUYWJsZVJvd0VsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVTZWN0aW9uRWxlbWVudDp0cnVlLEhUTUxU
-ZW1wbGF0ZUVsZW1lbnQ6dHJ1ZSxDb21wb3NpdGlvbkV2ZW50OnRydWUsRm9jdXNFdmVudDp0cnVlLEtl
-eWJvYXJkRXZlbnQ6dHJ1ZSxUZXh0RXZlbnQ6dHJ1ZSxUb3VjaEV2ZW50OnRydWUsVUlFdmVudDpmYWxz
-ZSxXaW5kb3c6dHJ1ZSxET01XaW5kb3c6dHJ1ZSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTp0cnVl
-LFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOnRydWUs
-V29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxBdHRyOnRydWUsQ2xpZW50UmVjdDp0cnVlLERPTVJlY3Q6dHJ1
-ZSxOYW1lZE5vZGVNYXA6dHJ1ZSxNb3pOYW1lZEF0dHJNYXA6dHJ1ZSxJREJLZXlSYW5nZTp0cnVlLFNW
-R1NjcmlwdEVsZW1lbnQ6dHJ1ZSxTVkdBRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVFbGVtZW50OnRydWUs
-U1ZHQW5pbWF0ZU1vdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDp0cnVl
-LFNWR0FuaW1hdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdDaXJjbGVFbGVtZW50OnRydWUsU1ZHQ2xpcFBhdGhF
-bGVtZW50OnRydWUsU1ZHRGVmc0VsZW1lbnQ6dHJ1ZSxTVkdEZXNjRWxlbWVudDp0cnVlLFNWR0Rpc2Nh
-cmRFbGVtZW50OnRydWUsU1ZHRWxsaXBzZUVsZW1lbnQ6dHJ1ZSxTVkdGRUJsZW5kRWxlbWVudDp0cnVl
-LFNWR0ZFQ29sb3JNYXRyaXhFbGVtZW50OnRydWUsU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6
-dHJ1ZSxTVkdGRUNvbXBvc2l0ZUVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDp0
-cnVlLFNWR0ZFRGlmZnVzZUxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxl
-bWVudDp0cnVlLFNWR0ZFRGlzdGFudExpZ2h0RWxlbWVudDp0cnVlLFNWR0ZFRmxvb2RFbGVtZW50OnRy
-dWUsU1ZHRkVGdW5jQUVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNCRWxlbWVudDp0cnVlLFNWR0ZFRnVuY0dF
-bGVtZW50OnRydWUsU1ZHRkVGdW5jUkVsZW1lbnQ6dHJ1ZSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6
-dHJ1ZSxTVkdGRUltYWdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VFbGVtZW50OnRydWUsU1ZHRkVNZXJn
-ZU5vZGVFbGVtZW50OnRydWUsU1ZHRkVNb3JwaG9sb2d5RWxlbWVudDp0cnVlLFNWR0ZFT2Zmc2V0RWxl
-bWVudDp0cnVlLFNWR0ZFUG9pbnRMaWdodEVsZW1lbnQ6dHJ1ZSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdF
-bGVtZW50OnRydWUsU1ZHRkVTcG90TGlnaHRFbGVtZW50OnRydWUsU1ZHRkVUaWxlRWxlbWVudDp0cnVl
-LFNWR0ZFVHVyYnVsZW5jZUVsZW1lbnQ6dHJ1ZSxTVkdGaWx0ZXJFbGVtZW50OnRydWUsU1ZHRm9yZWln
-bk9iamVjdEVsZW1lbnQ6dHJ1ZSxTVkdHRWxlbWVudDp0cnVlLFNWR0dlb21ldHJ5RWxlbWVudDp0cnVl
-LFNWR0dyYXBoaWNzRWxlbWVudDp0cnVlLFNWR0ltYWdlRWxlbWVudDp0cnVlLFNWR0xpbmVFbGVtZW50
-OnRydWUsU1ZHTGluZWFyR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHTWFya2VyRWxlbWVudDp0cnVlLFNW
-R01hc2tFbGVtZW50OnRydWUsU1ZHTWV0YWRhdGFFbGVtZW50OnRydWUsU1ZHUGF0aEVsZW1lbnQ6dHJ1
-ZSxTVkdQYXR0ZXJuRWxlbWVudDp0cnVlLFNWR1BvbHlnb25FbGVtZW50OnRydWUsU1ZHUG9seWxpbmVF
-bGVtZW50OnRydWUsU1ZHUmFkaWFsR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHUmVjdEVsZW1lbnQ6dHJ1
-ZSxTVkdTZXRFbGVtZW50OnRydWUsU1ZHU3RvcEVsZW1lbnQ6dHJ1ZSxTVkdTdHlsZUVsZW1lbnQ6dHJ1
-ZSxTVkdTVkdFbGVtZW50OnRydWUsU1ZHU3dpdGNoRWxlbWVudDp0cnVlLFNWR1N5bWJvbEVsZW1lbnQ6
-dHJ1ZSxTVkdUU3BhbkVsZW1lbnQ6dHJ1ZSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0
-RWxlbWVudDp0cnVlLFNWR1RleHRQYXRoRWxlbWVudDp0cnVlLFNWR1RleHRQb3NpdGlvbmluZ0VsZW1l
-bnQ6dHJ1ZSxTVkdUaXRsZUVsZW1lbnQ6dHJ1ZSxTVkdVc2VFbGVtZW50OnRydWUsU1ZHVmlld0VsZW1l
-bnQ6dHJ1ZSxTVkdHcmFkaWVudEVsZW1lbnQ6dHJ1ZSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9u
-RWxlbWVudDp0cnVlLFNWR0ZFRHJvcFNoYWRvd0VsZW1lbnQ6dHJ1ZSxTVkdNUGF0aEVsZW1lbnQ6dHJ1
-ZSxTVkdFbGVtZW50OmZhbHNlfSkKSC5YSC4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJW
-aWV3IgpILlJHLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguVlAuJG5hdGl2
-ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5EZy4kbmF0aXZlU3VwZXJjbGFzc1RhZz0i
-QXJyYXlCdWZmZXJWaWV3IgpILldCLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXci
-CkguWkcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5QZy4kbmF0aXZlU3Vw
-ZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3In0pKCkKY29udmVydEFsbFRvRmFzdE9iamVjdCh3KQpj
-b252ZXJ0VG9GYXN0T2JqZWN0KCQpOyhmdW5jdGlvbihhKXtpZih0eXBlb2YgZG9jdW1lbnQ9PT0idW5k
-ZWZpbmVkIil7YShudWxsKQpyZXR1cm59aWYodHlwZW9mIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQhPSd1
-bmRlZmluZWQnKXthKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpCnJldHVybn12YXIgcz1kb2N1bWVudC5z
-Y3JpcHRzCmZ1bmN0aW9uIG9uTG9hZChiKXtmb3IodmFyIHE9MDtxPHMubGVuZ3RoOysrcSlzW3FdLnJl
-bW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLG9uTG9hZCxmYWxzZSkKYShiLnRhcmdldCl9Zm9yKHZhciBy
-PTA7cjxzLmxlbmd0aDsrK3Ipc1tyXS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixvbkxvYWQsZmFsc2Up
-fSkoZnVuY3Rpb24oYSl7di5jdXJyZW50U2NyaXB0PWEKaWYodHlwZW9mIGRhcnRNYWluUnVubmVyPT09
-ImZ1bmN0aW9uIilkYXJ0TWFpblJ1bm5lcihMLklxLFtdKQplbHNlIEwuSXEoW10pfSl9KSgpCi8vIyBz
-b3VyY2VNYXBwaW5nVVJMPW1pZ3JhdGlvbi5qcy5tYXAK
+QUFBQUFBQUFBQUFBQUFBQUFBQUZGRkZGRkZGRkZGRkZGRkZHR0dHR0dHR0dHR0dHR0dHSEhISEhISEhI
+SEhISEhISEhISEhISEhISEhISUhISEpFRUJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQktDQ0ND
+Q0NDQ0NDQ0NEQ0xPTk5OTUVFRUVFRUVFRUVFIixzKSYzMQpoPWk8PTMyP3MmNjE2OTQ+Pj5xOihzJjYz
+fGg8PDYpPj4+MAppPUMueEIuVygiIFx4MDAwOlhFQ0NDQ0NOOmxEYiBceDAwMDpYRUNDQ0NDTnZsRGIg
+XHgwMDA6WEVDQ0NDQ046bERiIEFBQUFBXHgwMFx4MDBceDAwXHgwMFx4MDBBQUFBQTAwMDAwQUFBQUE6
+Ojo6OkFBQUFBR0cwMDBBQUFBQTAwS0tLQUFBQUFHOjo6OkFBQUFBOklJSUlBQUFBQTAwMFx4ODAwQUFB
+QUFceDAwXHgwMFx4MDBceDAwIEFBQUFBIixpK3EpCmlmKGk9PT0wKXtnLmErPUguTHcoaCkKaWYoZj09
+PWMpYnJlYWsgJGxhYmVsMCQwCmJyZWFrfWVsc2UgaWYoKGkmMSkhPT0wKXtpZihyKXN3aXRjaChpKXtj
+YXNlIDY5OmNhc2UgNjc6Zy5hKz1ILkx3KGopCmJyZWFrCmNhc2UgNjU6Zy5hKz1ILkx3KGopOy0tZgpi
+cmVhawpkZWZhdWx0OnA9Zy5hKz1ILkx3KGopCmcuYT1wK0guTHcoaikKYnJlYWt9ZWxzZXtrLmI9aQpr
+LmM9Zi0xCnJldHVybiIifWk9MH1pZihmPT09YylicmVhayAkbGFiZWwwJDAKbz1mKzEKaWYoZjwwfHxm
+Pj1lKXJldHVybiBILk9IKGEsZikKcz1hW2ZdfW89ZisxCmlmKGY8MHx8Zj49ZSlyZXR1cm4gSC5PSChh
+LGYpCnM9YVtmXQppZihzPDEyOCl7d2hpbGUoITApe2lmKCEobzxjKSl7bj1jCmJyZWFrfW09bysxCmlm
+KG88MHx8bz49ZSlyZXR1cm4gSC5PSChhLG8pCnM9YVtvXQppZihzPj0xMjgpe249bS0xCm89bQpicmVh
+a31vPW19aWYobi1mPDIwKWZvcihsPWY7bDxuOysrbCl7aWYobD49ZSlyZXR1cm4gSC5PSChhLGwpCmcu
+YSs9SC5MdyhhW2xdKX1lbHNlIGcuYSs9UC5ITShhLGYsbikKaWYobj09PWMpYnJlYWsgJGxhYmVsMCQw
+CmY9b31lbHNlIGY9b31pZihkJiZpPjMyKWlmKHIpZy5hKz1ILkx3KGopCmVsc2V7ay5iPTc3CmsuYz1j
+CnJldHVybiIifWsuYj1pCmsuYz1oCmU9Zy5hCnJldHVybiBlLmNoYXJDb2RlQXQoMCk9PTA/ZTplfX0K
+UC5XRi5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscQp0LmZvLmEoYSkKcz10aGlz
+LmIKcj10aGlzLmEKcy5hKz1yLmEKcT1zLmErPUguRWooYS5hKQpzLmE9cSsiOiAiCnMuYSs9UC5obChi
+KQpyLmE9IiwgIn0sCiRTOjQzfQpQLmlQLnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7aWYoYj09
+bnVsbClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIFAuaVAmJnRoaXMuYT09PWIuYSYmITB9LApn
+aU86ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCnJldHVybihzXkMuam4ud0cocywzMCkpJjEwNzM3NDE4
+MjN9LAp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMscj1QLkdxKEgudEoocykpLHE9UC5oMChILk5TKHMp
+KSxwPVAuaDAoSC5qQShzKSksbz1QLmgwKEguSVgocykpLG49UC5oMChILmNoKHMpKSxtPVAuaDAoSC5K
+ZChzKSksbD1QLlZ4KEgubzEocykpLGs9cisiLSIrcSsiLSIrcCsiICIrbysiOiIrbisiOiIrbSsiLiIr
+bApyZXR1cm4ga319ClAuWFMucHJvdG90eXBlPXsKZ0lJOmZ1bmN0aW9uKCl7cmV0dXJuIEgudHModGhp
+cy4kdGhyb3duSnNFcnJvcil9fQpQLkM2LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhp
+cy5hCmlmKHMhPW51bGwpcmV0dXJuIkFzc2VydGlvbiBmYWlsZWQ6ICIrUC5obChzKQpyZXR1cm4iQXNz
+ZXJ0aW9uIGZhaWxlZCJ9fQpQLkV6LnByb3RvdHlwZT17fQpQLkYucHJvdG90eXBlPXsKdzpmdW5jdGlv
+bihhKXtyZXR1cm4iVGhyb3cgb2YgbnVsbC4ifX0KUC51LnByb3RvdHlwZT17CmdaOmZ1bmN0aW9uKCl7
+cmV0dXJuIkludmFsaWQgYXJndW1lbnQiKyghdGhpcy5hPyIocykiOiIiKX0sCmd1OmZ1bmN0aW9uKCl7
+cmV0dXJuIiJ9LAp3OmZ1bmN0aW9uKGEpe3ZhciBzLHIscT10aGlzLHA9cS5jLG89cD09bnVsbD8iIjoi
+ICgiK3ArIikiLG49cS5kLG09bj09bnVsbD8iIjoiOiAiK0guRWoobiksbD1xLmdaKCkrbyttCmlmKCFx
+LmEpcmV0dXJuIGwKcz1xLmd1KCkKcj1QLmhsKHEuYikKcmV0dXJuIGwrcysiOiAiK3J9fQpQLmJKLnBy
+b3RvdHlwZT17CmdaOmZ1bmN0aW9uKCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3U6ZnVuY3Rpb24oKXt2
+YXIgcyxyPXRoaXMuZSxxPXRoaXMuZgppZihyPT1udWxsKXM9cSE9bnVsbD8iOiBOb3QgbGVzcyB0aGFu
+IG9yIGVxdWFsIHRvICIrSC5FaihxKToiIgplbHNlIGlmKHE9PW51bGwpcz0iOiBOb3QgZ3JlYXRlciB0
+aGFuIG9yIGVxdWFsIHRvICIrSC5FaihyKQplbHNlIGlmKHE+cilzPSI6IE5vdCBpbiBpbmNsdXNpdmUg
+cmFuZ2UgIitILkVqKHIpKyIuLiIrSC5FaihxKQplbHNlIHM9cTxyPyI6IFZhbGlkIHZhbHVlIHJhbmdl
+IGlzIGVtcHR5IjoiOiBPbmx5IHZhbGlkIHZhbHVlIGlzICIrSC5FaihyKQpyZXR1cm4gc319ClAuZVku
+cHJvdG90eXBlPXsKZ1o6ZnVuY3Rpb24oKXtyZXR1cm4iUmFuZ2VFcnJvciJ9LApndTpmdW5jdGlvbigp
+e3ZhciBzLHI9SC51UCh0aGlzLmIpCmlmKHR5cGVvZiByIT09Im51bWJlciIpcmV0dXJuIHIuSigpCmlm
+KHI8MClyZXR1cm4iOiBpbmRleCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIKcz10aGlzLmYKaWYocz09PTAp
+cmV0dXJuIjogbm8gaW5kaWNlcyBhcmUgdmFsaWQiCnJldHVybiI6IGluZGV4IHNob3VsZCBiZSBsZXNz
+IHRoYW4gIitILkVqKHMpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZn19ClAubXAucHJvdG90
+eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9dGhpcyxqPXt9LGk9bmV3IFAu
+Um4oIiIpCmouYT0iIgpzPWsuYwpmb3Iocj1zLmxlbmd0aCxxPTAscD0iIixvPSIiO3E8cjsrK3Esbz0i
+LCAiKXtuPXNbcV0KaS5hPXArbwpwPWkuYSs9UC5obChuKQpqLmE9IiwgIn1rLmQuSygwLG5ldyBQLldG
+KGosaSkpCm09UC5obChrLmEpCmw9aS53KDApCnI9Ik5vU3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90
+IGZvdW5kOiAnIitILkVqKGsuYi5hKSsiJ1xuUmVjZWl2ZXI6ICIrbSsiXG5Bcmd1bWVudHM6IFsiK2wr
+Il0iCnJldHVybiByfX0KUC51Yi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJVbnN1cHBv
+cnRlZCBvcGVyYXRpb246ICIrdGhpcy5hfX0KUC5kcy5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3Zh
+ciBzPXRoaXMuYQpyZXR1cm4gcyE9bnVsbD8iVW5pbXBsZW1lbnRlZEVycm9yOiAiK3M6IlVuaW1wbGVt
+ZW50ZWRFcnJvciJ9fQpQLmxqLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkJhZCBzdGF0
+ZTogIit0aGlzLmF9fQpQLlVWLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCmlm
+KHM9PW51bGwpcmV0dXJuIkNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb24uIgpy
+ZXR1cm4iQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbjogIitQLmhsKHMpKyIu
+In19ClAuazUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iT3V0IG9mIE1lbW9yeSJ9LApn
+SUk6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sCiRpWFM6MX0KUC5LWS5wcm90b3R5cGU9ewp3OmZ1bmN0
+aW9uKGEpe3JldHVybiJTdGFjayBPdmVyZmxvdyJ9LApnSUk6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0s
+CiRpWFM6MX0KUC5wLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCnJldHVybiBz
+PT1udWxsPyJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIjoi
+UmVhZGluZyBzdGF0aWMgdmFyaWFibGUgJyIrcysiJyBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIn19
+ClAuQ0QucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iRXhjZXB0aW9uOiAiK3RoaXMuYX0s
+CiRpUno6MX0KUC5hRS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8sbixtLGws
+ayxqLGksaCxnPXRoaXMuYSxmPWchPW51bGwmJiIiIT09Zz8iRm9ybWF0RXhjZXB0aW9uOiAiK0guRWoo
+Zyk6IkZvcm1hdEV4Y2VwdGlvbiIsZT10aGlzLmMsZD10aGlzLmIKaWYodHlwZW9mIGQ9PSJzdHJpbmci
+KXtpZihlIT1udWxsKXM9ZTwwfHxlPmQubGVuZ3RoCmVsc2Ugcz0hMQppZihzKWU9bnVsbAppZihlPT1u
+dWxsKXtpZihkLmxlbmd0aD43OClkPUMueEIuTmooZCwwLDc1KSsiLi4uIgpyZXR1cm4gZisiXG4iK2R9
+Zm9yKHI9MSxxPTAscD0hMSxvPTA7bzxlOysrbyl7bj1DLnhCLlcoZCxvKQppZihuPT09MTApe2lmKHEh
+PT1vfHwhcCkrK3IKcT1vKzEKcD0hMX1lbHNlIGlmKG49PT0xMyl7KytyCnE9bysxCnA9ITB9fWY9cj4x
+P2YrKCIgKGF0IGxpbmUgIityKyIsIGNoYXJhY3RlciAiKyhlLXErMSkrIilcbiIpOmYrKCIgKGF0IGNo
+YXJhY3RlciAiKyhlKzEpKyIpXG4iKQptPWQubGVuZ3RoCmZvcihvPWU7bzxtOysrbyl7bj1DLnhCLk8y
+KGQsbykKaWYobj09PTEwfHxuPT09MTMpe209bwpicmVha319aWYobS1xPjc4KWlmKGUtcTw3NSl7bD1x
+Kzc1Cms9cQpqPSIiCmk9Ii4uLiJ9ZWxzZXtpZihtLWU8NzUpe2s9bS03NQpsPW0KaT0iIn1lbHNle2s9
+ZS0zNgpsPWUrMzYKaT0iLi4uIn1qPSIuLi4ifWVsc2V7bD1tCms9cQpqPSIiCmk9IiJ9aD1DLnhCLk5q
+KGQsayxsKQpyZXR1cm4gZitqK2graSsiXG4iK0MueEIuSXgoIiAiLGUtaytqLmxlbmd0aCkrIl5cbiJ9
+ZWxzZSByZXR1cm4gZSE9bnVsbD9mKygiIChhdCBvZmZzZXQgIitILkVqKGUpKyIpIik6Zn0sCiRpUno6
+MX0KUC5jWC5wcm90b3R5cGU9ewpkcjpmdW5jdGlvbihhLGIpe3JldHVybiBILkdKKHRoaXMsSC5MaCh0
+aGlzKS5DKCJjWC5FIiksYil9LApFMjpmdW5jdGlvbihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpyZXR1
+cm4gSC5LMSh0aGlzLHMuS3EoYykuQygiMShjWC5FKSIpLmEoYikscy5DKCJjWC5FIiksYyl9LApldjpm
+dW5jdGlvbihhLGIpe3ZhciBzPUguTGgodGhpcykKcmV0dXJuIG5ldyBILlU1KHRoaXMscy5DKCJhMihj
+WC5FKSIpLmEoYikscy5DKCJVNTxjWC5FPiIpKX0sCnR0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIFAuQ0go
+dGhpcyxiLEguTGgodGhpcykuQygiY1guRSIpKX0sCmJyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnR0
+KGEsITApfSwKZ0E6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLmdtKHRoaXMpCmZvcihzPTA7ci5GKCk7
+KSsrcwpyZXR1cm4gc30sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4hdGhpcy5nbSh0aGlzKS5GKCl9LApn
+b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIXRoaXMuZ2wwKHRoaXMpfSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1
+cm4gSC5iSyh0aGlzLGIsSC5MaCh0aGlzKS5DKCJjWC5FIikpfSwKZ3I4OmZ1bmN0aW9uKGEpe3ZhciBz
+LHI9dGhpcy5nbSh0aGlzKQppZighci5GKCkpdGhyb3cgSC5iKEguV3AoKSkKcz1yLmdsKCkKaWYoci5G
+KCkpdGhyb3cgSC5iKEguQW0oKSkKcmV0dXJuIHN9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxClAu
+azEoYiwiaW5kZXgiKQpmb3Iocz10aGlzLmdtKHRoaXMpLHI9MDtzLkYoKTspe3E9cy5nbCgpCmlmKGI9
+PT1yKXJldHVybiBxOysrcn10aHJvdyBILmIoUC5DZihiLHRoaXMsImluZGV4IixudWxsLHIpKX0sCnc6
+ZnVuY3Rpb24oYSl7cmV0dXJuIFAuRVAodGhpcywiKCIsIikiKX19ClAuQW4ucHJvdG90eXBlPXt9ClAu
+TjMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iTWFwRW50cnkoIitILkVqKEouaih0aGlz
+LmEpKSsiOiAiK0guRWooSi5qKHRoaXMuYikpKyIpIn19ClAuYzgucHJvdG90eXBlPXsKZ2lPOmZ1bmN0
+aW9uKGEpe3JldHVybiBQLk1oLnByb3RvdHlwZS5naU8uY2FsbChDLmpOLHRoaXMpfSwKdzpmdW5jdGlv
+bihhKXtyZXR1cm4ibnVsbCJ9fQpQLk1oLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UC5NaCwkaU1oOjEs
+CkROOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXM9PT1ifSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBI
+LmVRKHRoaXMpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5FaihILk0odGhp
+cykpKyInIn0sCmU3OmZ1bmN0aW9uKGEsYil7dC5vLmEoYikKdGhyb3cgSC5iKFAubHIodGhpcyxiLmdX
+YSgpLGIuZ25kKCksYi5nVm0oKSkpfSwKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53KHRo
+aXMpfX0KUC5aZC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiIifSwKJGlHejoxfQpQLlJu
+LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwKdzpmdW5jdGlv
+bihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LAokaUJMOjF9ClAu
+bjEucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscAp0LkouYShhKQpILmgoYikK
+cz1KLnJZKGIpLk9ZKGIsIj0iKQppZihzPT09LTEpe2lmKGIhPT0iIilhLlkoMCxQLmt1KGIsMCxiLmxl
+bmd0aCx0aGlzLmEsITApLCIiKX1lbHNlIGlmKHMhPT0wKXtyPUMueEIuTmooYiwwLHMpCnE9Qy54Qi5H
+KGIscysxKQpwPXRoaXMuYQphLlkoMCxQLmt1KHIsMCxyLmxlbmd0aCxwLCEwKSxQLmt1KHEsMCxxLmxl
+bmd0aCxwLCEwKSl9cmV0dXJuIGF9LAokUzo0NX0KUC5jUy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihh
+LGIpe3Rocm93IEguYihQLnJyKCJJbGxlZ2FsIElQdjQgYWRkcmVzcywgIithLHRoaXMuYSxiKSl9LAok
+UzoyMX0KUC5WQy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLnJyKCJJbGxl
+Z2FsIElQdjYgYWRkcmVzcywgIithLHRoaXMuYSxiKSl9LAokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
+cy4kMihhLG51bGwpfSwKJFM6NTB9ClAuSlQucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIg
+cwppZihiLWE+NCl0aGlzLmEuJDIoImFuIElQdjYgcGFydCBjYW4gb25seSBjb250YWluIGEgbWF4aW11
+bSBvZiA0IGhleCBkaWdpdHMiLGEpCnM9UC5RQShDLnhCLk5qKHRoaXMuYixhLGIpLDE2KQppZihzPDB8
+fHM+NjU1MzUpdGhpcy5hLiQyKCJlYWNoIHBhcnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2Ugb2YgYDB4MC4u
+MHhGRkZGYCIsYSkKcmV0dXJuIHN9LAokUzo1Mn0KUC5Ebi5wcm90b3R5cGU9ewpnbkQ6ZnVuY3Rpb24o
+KXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoIW8ueSl7cz1vLmEKcj1zLmxlbmd0aCE9PTA/cysiOiI6IiIK
+cT1vLmMKcD1xPT1udWxsCmlmKCFwfHxzPT09ImZpbGUiKXtzPXIrIi8vIgpyPW8uYgppZihyLmxlbmd0
+aCE9PTApcz1zK3IrIkAiCmlmKCFwKXMrPXEKcj1vLmQKaWYociE9bnVsbClzPXMrIjoiK0guRWoocil9
+ZWxzZSBzPXIKcys9by5lCnI9by5mCmlmKHIhPW51bGwpcz1zKyI/IityCnI9by5yCmlmKHIhPW51bGwp
+cz1zKyIjIityCmlmKG8ueSl0aHJvdyBILmIoSC5jKCJGaWVsZCAnX3RleHQnIGhhcyBiZWVuIGFzc2ln
+bmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4iKSkKby54PXMuY2hhckNvZGVBdCgwKT09MD9zOnMKby55
+PSEwfXJldHVybiBvLnh9LApnRmo6ZnVuY3Rpb24oKXt2YXIgcyxyLHE9dGhpcwppZighcS5RKXtzPXEu
+ZQppZihzLmxlbmd0aCE9PTAmJkMueEIuVyhzLDApPT09NDcpcz1DLnhCLkcocywxKQpyPXMubGVuZ3Ro
+PT09MD9DLnhEOlAuQUYobmV3IEgubEooSC5WTShzLnNwbGl0KCIvIiksdC5zKSx0LmRPLmEoUC5QSCgp
+KSx0LmRvKSx0Lk4pCmlmKHEuUSl0aHJvdyBILmIoSC5jKCJGaWVsZCAncGF0aFNlZ21lbnRzJyBoYXMg
+YmVlbiBhc3NpZ25lZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIikpCnEuc0twKHIpCnEuUT0hMH1yZXR1
+cm4gcS56fSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcwppZighci5jeCl7cz1KLmhmKHIuZ25E
+KCkpCmlmKHIuY3gpdGhyb3cgSC5iKEguYygiRmllbGQgJ2hhc2hDb2RlJyBoYXMgYmVlbiBhc3NpZ25l
+ZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIikpCnIuY2g9cwpyLmN4PSEwfXJldHVybiByLmNofSwKZ2hZ
+OmZ1bmN0aW9uKCl7dmFyIHMscj10aGlzCmlmKCFyLmRiKXtzPVAuV1goci5ndFAoKSkKaWYoci5kYil0
+aHJvdyBILmIoSC5jKCJGaWVsZCAncXVlcnlQYXJhbWV0ZXJzJyBoYXMgYmVlbiBhc3NpZ25lZCBkdXJp
+bmcgaW5pdGlhbGl6YXRpb24uIikpCnIuc05NKG5ldyBQLkdqKHMsdC5kdykpCnIuZGI9ITB9cmV0dXJu
+IHIuY3l9LApna3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciBz
+PXRoaXMuYwppZihzPT1udWxsKXJldHVybiIiCmlmKEMueEIubihzLCJbIikpcmV0dXJuIEMueEIuTmoo
+cywxLHMubGVuZ3RoLTEpCnJldHVybiBzfSwKZ3RwOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuZApyZXR1
+cm4gcz09bnVsbD9QLndLKHRoaXMuYSk6c30sCmd0UDpmdW5jdGlvbigpe3ZhciBzPXRoaXMuZgpyZXR1
+cm4gcz09bnVsbD8iIjpzfSwKZ0thOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5yCnJldHVybiBzPT1udWxs
+PyIiOnN9LApubTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqPXRoaXMKdC5jOS5h
+KGIpCnM9ai5hCnI9cz09PSJmaWxlIgpxPWouYgpwPWouZApvPWouYwppZighKG8hPW51bGwpKW89cS5s
+ZW5ndGghPT0wfHxwIT1udWxsfHxyPyIiOm51bGwKbj1qLmUKaWYoIXIpbT1vIT1udWxsJiZuLmxlbmd0
+aCE9PTAKZWxzZSBtPSEwCmlmKG0mJiFDLnhCLm4obiwiLyIpKW49Ii8iK24KbD1uCms9UC5sZShudWxs
+LDAsMCxiKQpyZXR1cm4gbmV3IFAuRG4ocyxxLG8scCxsLGssai5yKX0sCkpoOmZ1bmN0aW9uKGEsYil7
+dmFyIHMscixxLHAsbyxuCmZvcihzPTAscj0wO0MueEIuUWkoYiwiLi4vIixyKTspe3IrPTM7KytzfXE9
+Qy54Qi5jbihhLCIvIikKd2hpbGUoITApe2lmKCEocT4wJiZzPjApKWJyZWFrCnA9Qy54Qi5QayhhLCIv
+IixxLTEpCmlmKHA8MClicmVhawpvPXEtcApuPW8hPT0yCmlmKCFufHxvPT09MylpZihDLnhCLk8yKGEs
+cCsxKT09PTQ2KW49IW58fEMueEIuTzIoYSxwKzIpPT09NDYKZWxzZSBuPSExCmVsc2Ugbj0hMQppZihu
+KWJyZWFrOy0tcwpxPXB9cmV0dXJuIEMueEIuaTcoYSxxKzEsbnVsbCxDLnhCLkcoYixyLTMqcykpfSwK
+Wkk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubVMoUC5oSyhhKSl9LAptUzpmdW5jdGlvbihhKXt2YXIg
+cyxyLHEscCxvLG4sbSxsLGssaj10aGlzLGk9bnVsbAppZihhLmdGaSgpLmxlbmd0aCE9PTApe3M9YS5n
+RmkoKQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdKZihhKQpwPWEuZ3hBKCk/YS5ndHAoYSk6aX1l
+bHNle3A9aQpxPXAKcj0iIn1vPVAueGUoYS5nSWkoYSkpCm49YS5nUUQoKT9hLmd0UCgpOml9ZWxzZXtz
+PWouYQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdKZihhKQpwPVAud0IoYS5neEEoKT9hLmd0cChh
+KTppLHMpCm89UC54ZShhLmdJaShhKSkKbj1hLmdRRCgpP2EuZ3RQKCk6aX1lbHNle3I9ai5iCnE9ai5j
+CnA9ai5kCmlmKGEuZ0lpKGEpPT09IiIpe289ai5lCm49YS5nUUQoKT9hLmd0UCgpOmouZn1lbHNle2lm
+KGEuZ3RUKCkpbz1QLnhlKGEuZ0lpKGEpKQplbHNle209ai5lCmlmKG0ubGVuZ3RoPT09MClpZihxPT1u
+dWxsKW89cy5sZW5ndGg9PT0wP2EuZ0lpKGEpOlAueGUoYS5nSWkoYSkpCmVsc2Ugbz1QLnhlKCIvIith
+LmdJaShhKSkKZWxzZXtsPWouSmgobSxhLmdJaShhKSkKaz1zLmxlbmd0aD09PTAKaWYoIWt8fHEhPW51
+bGx8fEMueEIubihtLCIvIikpbz1QLnhlKGwpCmVsc2Ugbz1QLndGKGwsIWt8fHEhPW51bGwpfX1uPWEu
+Z1FEKCk/YS5ndFAoKTppfX19cmV0dXJuIG5ldyBQLkRuKHMscixxLHAsbyxuLGEuZ1o4KCk/YS5nS2Eo
+KTppKX0sCmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmMhPW51bGx9LApneEE6ZnVuY3Rpb24oKXty
+ZXR1cm4gdGhpcy5kIT1udWxsfSwKZ1FEOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZiE9bnVsbH0sCmda
+ODpmdW5jdGlvbigpe3JldHVybiB0aGlzLnIhPW51bGx9LApndFQ6ZnVuY3Rpb24oKXtyZXR1cm4gQy54
+Qi5uKHRoaXMuZSwiLyIpfSwKdDQ6ZnVuY3Rpb24oKXt2YXIgcyxyPXRoaXMscT1yLmEKaWYocSE9PSIi
+JiZxIT09ImZpbGUiKXRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9t
+IGEgIitxKyIgVVJJIikpCmlmKHIuZ3RQKCkhPT0iIil0aHJvdyBILmIoUC5MNCh1LmkpKQppZihyLmdL
+YSgpIT09IiIpdGhyb3cgSC5iKFAuTDQodS5sKSkKcT0kLndRKCkKaWYoSC5vVChxKSlxPVAubW4ocikK
+ZWxzZXtpZihyLmMhPW51bGwmJnIuZ0pmKHIpIT09IiIpSC52KFAuTDQodS5qKSkKcz1yLmdGaigpClAu
+a0UocywhMSkKcT1QLnZnKEMueEIubihyLmUsIi8iKT8iLyI6IiIscywiLyIpCnE9cS5jaGFyQ29kZUF0
+KDApPT0wP3E6cX1yZXR1cm4gcX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ25EKCl9LApETjpm
+dW5jdGlvbihhLGIpe3ZhciBzPXRoaXMKaWYoYj09bnVsbClyZXR1cm4hMQppZihzPT09YilyZXR1cm4h
+MApyZXR1cm4gdC5kRC5iKGIpJiZzLmE9PT1iLmdGaSgpJiZzLmMhPW51bGw9PT1iLmdjaigpJiZzLmI9
+PT1iLmdrdSgpJiZzLmdKZihzKT09PWIuZ0pmKGIpJiZzLmd0cChzKT09PWIuZ3RwKGIpJiZzLmU9PT1i
+LmdJaShiKSYmcy5mIT1udWxsPT09Yi5nUUQoKSYmcy5ndFAoKT09PWIuZ3RQKCkmJnMuciE9bnVsbD09
+PWIuZ1o4KCkmJnMuZ0thKCk9PT1iLmdLYSgpfSwKc0twOmZ1bmN0aW9uKGEpe3RoaXMuej10LmJrLmEo
+YSl9LApzTk06ZnVuY3Rpb24oYSl7dGhpcy5jeT10LmNaLmEoYSl9LAokaWlEOjEsCmdGaTpmdW5jdGlv
+bigpe3JldHVybiB0aGlzLmF9LApnSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZX19ClAuUloucHJv
+dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuZVAoQy5aSixILmgoYSksQy54TSwhMSl9LAok
+Uzo1fQpQLk1FLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcy5iLHI9dGhpcy5h
+CnMuYSs9ci5hCnIuYT0iJiIKcj1zLmErPUguRWooUC5lUChDLkYzLGEsQy54TSwhMCkpCmlmKGIhPW51
+bGwmJmIubGVuZ3RoIT09MCl7cy5hPXIrIj0iCnMuYSs9SC5FaihQLmVQKEMuRjMsYixDLnhNLCEwKSl9
+fSwKJFM6MjJ9ClAueTUucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCkguaChhKQpp
+ZihiPT1udWxsfHx0eXBlb2YgYj09InN0cmluZyIpdGhpcy5hLiQyKGEsSC5rKGIpKQplbHNlIGZvcihz
+PUouSVQodC51LmEoYikpLHI9dGhpcy5hO3MuRigpOylyLiQyKGEsSC5oKHMuZ2woKSkpfSwKJFM6MTN9
+ClAuUEUucHJvdG90eXBlPXsKZ2xSOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbz10aGlzLG49bnVsbCxt
+PW8uYwppZihtPT1udWxsKXttPW8uYgppZigwPj1tLmxlbmd0aClyZXR1cm4gSC5PSChtLDApCnM9by5h
+Cm09bVswXSsxCnI9Qy54Qi5YVShzLCI/IixtKQpxPXMubGVuZ3RoCmlmKHI+PTApe3A9UC5QSShzLHIr
+MSxxLEMuVkMsITEpCnE9cn1lbHNlIHA9bgptPW8uYz1uZXcgUC5xZSgiZGF0YSIsIiIsbixuLFAuUEko
+cyxtLHEsQy5XZCwhMSkscCxuKX1yZXR1cm4gbX0sCnc6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLmIK
+aWYoMD49ci5sZW5ndGgpcmV0dXJuIEguT0gociwwKQpzPXRoaXMuYQpyZXR1cm4gclswXT09PS0xPyJk
+YXRhOiIrczpzfX0KUC5xMy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFVpbnQ4
+QXJyYXkoOTYpfSwKJFM6MjN9ClAueUkucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcz10
+aGlzLmEKaWYoYT49MjIpcmV0dXJuIEguT0gocyxhKQpzPXNbYV0KQy5OQS5kdShzLDAsOTYsYikKcmV0
+dXJuIHN9LAokUzoyNH0KUC5jNi5wcm90b3R5cGU9ewokMzpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixx
+CmZvcihzPWIubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUMueEIuVyhiLHIpXjk2CmlmKHE+PTk2KXJldHVy
+biBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE0fQpQLnFkLnByb3RvdHlwZT17CiQzOmZ1bmN0aW9uKGEs
+YixjKXt2YXIgcyxyLHEKZm9yKHM9Qy54Qi5XKGIsMCkscj1DLnhCLlcoYiwxKTtzPD1yOysrcyl7cT0o
+c145Nik+Pj4wCmlmKHE+PTk2KXJldHVybiBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE0fQpQLlVmLnBy
+b3RvdHlwZT17CmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmM+MH0sCmd4QTpmdW5jdGlvbigpe3Jl
+dHVybiB0aGlzLmM+MCYmdGhpcy5kKzE8dGhpcy5lfSwKZ1FEOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu
+Zjx0aGlzLnJ9LApnWjg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yPHRoaXMuYS5sZW5ndGh9LApnTnc6
+ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iPT09NCYmQy54Qi5uKHRoaXMuYSwiZmlsZSIpfSwKZ1daOmZ1
+bmN0aW9uKCl7cmV0dXJuIHRoaXMuYj09PTQmJkMueEIubih0aGlzLmEsImh0dHAiKX0sCmdSZTpmdW5j
+dGlvbigpe3JldHVybiB0aGlzLmI9PT01JiZDLnhCLm4odGhpcy5hLCJodHRwcyIpfSwKZ3RUOmZ1bmN0
+aW9uKCl7cmV0dXJuIEMueEIuUWkodGhpcy5hLCIvIix0aGlzLmUpfSwKZ0ZpOmZ1bmN0aW9uKCl7dmFy
+IHM9dGhpcy54CnJldHVybiBzPT1udWxsP3RoaXMueD10aGlzLlUyKCk6c30sClUyOmZ1bmN0aW9uKCl7
+dmFyIHM9dGhpcyxyPXMuYgppZihyPD0wKXJldHVybiIiCmlmKHMuZ1daKCkpcmV0dXJuImh0dHAiCmlm
+KHMuZ1JlKCkpcmV0dXJuImh0dHBzIgppZihzLmdOdygpKXJldHVybiJmaWxlIgppZihyPT09NyYmQy54
+Qi5uKHMuYSwicGFja2FnZSIpKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gQy54Qi5OaihzLmEsMCxyKX0s
+CmdrdTpmdW5jdGlvbigpe3ZhciBzPXRoaXMuYyxyPXRoaXMuYiszCnJldHVybiBzPnI/Qy54Qi5Oaih0
+aGlzLmEscixzLTEpOiIifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYwpyZXR1cm4gcz4wP0Mu
+eEIuTmoodGhpcy5hLHMsdGhpcy5kKToiIn0sCmd0cDpmdW5jdGlvbihhKXt2YXIgcz10aGlzCmlmKHMu
+Z3hBKCkpcmV0dXJuIFAuUUEoQy54Qi5OaihzLmEscy5kKzEscy5lKSxudWxsKQppZihzLmdXWigpKXJl
+dHVybiA4MAppZihzLmdSZSgpKXJldHVybiA0NDMKcmV0dXJuIDB9LApnSWk6ZnVuY3Rpb24oYSl7cmV0
+dXJuIEMueEIuTmoodGhpcy5hLHRoaXMuZSx0aGlzLmYpfSwKZ3RQOmZ1bmN0aW9uKCl7dmFyIHM9dGhp
+cy5mLHI9dGhpcy5yCnJldHVybiBzPHI/Qy54Qi5Oaih0aGlzLmEscysxLHIpOiIifSwKZ0thOmZ1bmN0
+aW9uKCl7dmFyIHM9dGhpcy5yLHI9dGhpcy5hCnJldHVybiBzPHIubGVuZ3RoP0MueEIuRyhyLHMrMSk6
+IiJ9LApnRmo6ZnVuY3Rpb24oKXt2YXIgcyxyLHE9dGhpcy5lLHA9dGhpcy5mLG89dGhpcy5hCmlmKEMu
+eEIuUWkobywiLyIscSkpKytxCmlmKHE9PT1wKXJldHVybiBDLnhECnM9SC5WTShbXSx0LnMpCmZvcihy
+PXE7cjxwOysrcilpZihDLnhCLk8yKG8scik9PT00Nyl7Qy5ObS5pKHMsQy54Qi5OaihvLHEscikpCnE9
+cisxfUMuTm0uaShzLEMueEIuTmoobyxxLHApKQpyZXR1cm4gUC5BRihzLHQuTil9LApnaFk6ZnVuY3Rp
+b24oKXtpZih0aGlzLmY+PXRoaXMucilyZXR1cm4gQy5DTQpyZXR1cm4gbmV3IFAuR2ooUC5XWCh0aGlz
+Lmd0UCgpKSx0LmR3KX0sCmtYOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuZCsxCnJldHVybiBzK2EubGVu
+Z3RoPT09dGhpcy5lJiZDLnhCLlFpKHRoaXMuYSxhLHMpfSwKTjk6ZnVuY3Rpb24oKXt2YXIgcz10aGlz
+LHI9cy5yLHE9cy5hCmlmKHI+PXEubGVuZ3RoKXJldHVybiBzCnJldHVybiBuZXcgUC5VZihDLnhCLk5q
+KHEsMCxyKSxzLmIscy5jLHMuZCxzLmUscy5mLHIscy54KX0sCm5tOmZ1bmN0aW9uKGEsYil7dmFyIHMs
+cixxLHAsbyxuLG0sbCxrLGosaT10aGlzLGg9bnVsbAp0LmM5LmEoYikKcz1pLmdGaSgpCnI9cz09PSJm
+aWxlIgpxPWkuYwpwPXE+MD9DLnhCLk5qKGkuYSxpLmIrMyxxKToiIgpvPWkuZ3hBKCk/aS5ndHAoaSk6
+aApxPWkuYwppZihxPjApbj1DLnhCLk5qKGkuYSxxLGkuZCkKZWxzZSBuPXAubGVuZ3RoIT09MHx8byE9
+bnVsbHx8cj8iIjpoCnE9aS5hCm09Qy54Qi5OaihxLGkuZSxpLmYpCmlmKCFyKWw9biE9bnVsbCYmbS5s
+ZW5ndGghPT0wCmVsc2UgbD0hMAppZihsJiYhQy54Qi5uKG0sIi8iKSltPSIvIittCms9UC5sZShoLDAs
+MCxiKQpsPWkucgpqPWw8cS5sZW5ndGg/Qy54Qi5HKHEsbCsxKTpoCnJldHVybiBuZXcgUC5EbihzLHAs
+bixvLG0sayxqKX0sClpJOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVM6ZnVu
+Y3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIFAuVWYpcmV0dXJuIHRoaXMudTEodGhpcyxhKQpyZXR1cm4g
+dGhpcy52cygpLm1TKGEpfSwKdTE6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixp
+LGgsZz1iLmIKaWYoZz4wKXJldHVybiBiCnM9Yi5jCmlmKHM+MCl7cj1hLmIKaWYocjw9MClyZXR1cm4g
+YgppZihhLmdOdygpKXE9Yi5lIT09Yi5mCmVsc2UgaWYoYS5nV1ooKSlxPSFiLmtYKCI4MCIpCmVsc2Ug
+cT0hYS5nUmUoKXx8IWIua1goIjQ0MyIpCmlmKHEpe3A9cisxCnJldHVybiBuZXcgUC5VZihDLnhCLk5q
+KGEuYSwwLHApK0MueEIuRyhiLmEsZysxKSxyLHMrcCxiLmQrcCxiLmUrcCxiLmYrcCxiLnIrcCxhLngp
+fWVsc2UgcmV0dXJuIHRoaXMudnMoKS5tUyhiKX1vPWIuZQpnPWIuZgppZihvPT09Zyl7cz1iLnIKaWYo
+ZzxzKXtyPWEuZgpwPXItZwpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLkcoYi5h
+LGcpLGEuYixhLmMsYS5kLGEuZSxnK3AscytwLGEueCl9Zz1iLmEKaWYoczxnLmxlbmd0aCl7cj1hLnIK
+cmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAscikrQy54Qi5HKGcscyksYS5iLGEuYyxhLmQsYS5l
+LGEuZixzKyhyLXMpLGEueCl9cmV0dXJuIGEuTjkoKX1zPWIuYQppZihDLnhCLlFpKHMsIi8iLG8pKXty
+PWEuZQpwPXItbwpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLkcocyxvKSxhLmIs
+YS5jLGEuZCxyLGcrcCxiLnIrcCxhLngpfW49YS5lCm09YS5mCmlmKG49PT1tJiZhLmM+MCl7Zm9yKDtD
+LnhCLlFpKHMsIi4uLyIsbyk7KW8rPTMKcD1uLW8rMQpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEs
+MCxuKSsiLyIrQy54Qi5HKHMsbyksYS5iLGEuYyxhLmQsbixnK3AsYi5yK3AsYS54KX1sPWEuYQpmb3Io
+az1uO0MueEIuUWkobCwiLi4vIixrKTspays9MwpqPTAKd2hpbGUoITApe2k9byszCmlmKCEoaTw9ZyYm
+Qy54Qi5RaShzLCIuLi8iLG8pKSlicmVhazsrK2oKbz1pfWZvcihoPSIiO20+azspey0tbQppZihDLnhC
+Lk8yKGwsbSk9PT00Nyl7aWYoaj09PTApe2g9Ii8iCmJyZWFrfS0tagpoPSIvIn19aWYobT09PWsmJmEu
+Yjw9MCYmIUMueEIuUWkobCwiLyIsbikpe28tPWoqMwpoPSIifXA9bS1vK2gubGVuZ3RoCnJldHVybiBu
+ZXcgUC5VZihDLnhCLk5qKGwsMCxtKStoK0MueEIuRyhzLG8pLGEuYixhLmMsYS5kLG4sZytwLGIucitw
+LGEueCl9LAp0NDpmdW5jdGlvbigpe3ZhciBzLHIscSxwPXRoaXMKaWYocC5iPj0wJiYhcC5nTncoKSl0
+aHJvdyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhICIrcC5nRmkoKSsi
+IFVSSSIpKQpzPXAuZgpyPXAuYQppZihzPHIubGVuZ3RoKXtpZihzPHAucil0aHJvdyBILmIoUC5MNCh1
+LmkpKQp0aHJvdyBILmIoUC5MNCh1LmwpKX1xPSQud1EoKQppZihILm9UKHEpKXM9UC5tbihwKQplbHNl
+e2lmKHAuYzxwLmQpSC52KFAuTDQodS5qKSkKcz1DLnhCLk5qKHIscC5lLHMpfXJldHVybiBzfSwKZ2lP
+OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMueQpyZXR1cm4gcz09bnVsbD90aGlzLnk9Qy54Qi5naU8odGhp
+cy5hKTpzfSwKRE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCmlmKHRoaXM9PT1iKXJl
+dHVybiEwCnJldHVybiB0LmRELmIoYikmJnRoaXMuYT09PWIudygwKX0sCnZzOmZ1bmN0aW9uKCl7dmFy
+IHM9dGhpcyxyPW51bGwscT1zLmdGaSgpLHA9cy5na3UoKSxvPXMuYz4wP3MuZ0pmKHMpOnIsbj1zLmd4
+QSgpP3MuZ3RwKHMpOnIsbT1zLmEsbD1zLmYsaz1DLnhCLk5qKG0scy5lLGwpLGo9cy5yCmw9bDxqP3Mu
+Z3RQKCk6cgpyZXR1cm4gbmV3IFAuRG4ocSxwLG8sbixrLGwsajxtLmxlbmd0aD9zLmdLYSgpOnIpfSwK
+dzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKJGlpRDoxfQpQLnFlLnByb3RvdHlwZT17fQpXLnFF
+LnByb3RvdHlwZT17fQpXLkdoLnByb3RvdHlwZT17CnNMVTpmdW5jdGlvbihhLGIpe2EuaHJlZj1ifSwK
+dzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwKJGlHaDoxfQpXLmZZLnByb3RvdHlwZT17Cnc6
+ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX19ClcubkIucHJvdG90eXBlPXskaW5COjF9ClcuQXou
+cHJvdG90eXBlPXskaUF6OjF9ClcuUVAucHJvdG90eXBlPXskaVFQOjF9ClcubngucHJvdG90eXBlPXsK
+Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5vSi5wcm90b3R5cGU9ewpnQTpmdW5jdGlv
+bihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLmlkLnByb3RvdHlwZT17fQpXLlFGLnByb3RvdHlwZT17fQpX
+Lk5oLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX19ClcuYWUucHJvdG90
+eXBlPXsKRGM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jcmVhdGVIVE1MRG9jdW1lbnQoYil9fQpXLklC
+LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHMscj1hLmxlZnQKci50b1N0cmluZwpyPSJSZWN0
+YW5nbGUgKCIrSC5FaihyKSsiLCAiCnM9YS50b3AKcy50b1N0cmluZwpzPXIrSC5FaihzKSsiKSAiCnI9
+YS53aWR0aApyLnRvU3RyaW5nCnI9cytILkVqKHIpKyIgeCAiCnM9YS5oZWlnaHQKcy50b1N0cmluZwpy
+ZXR1cm4gcitILkVqKHMpfSwKRE46ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmlmKGI9PW51bGwpcmV0dXJu
+ITEKaWYodC5xLmIoYikpe3M9YS5sZWZ0CnMudG9TdHJpbmcKcj1iLmxlZnQKci50b1N0cmluZwppZihz
+PT09cil7cz1hLnRvcApzLnRvU3RyaW5nCnI9Yi50b3AKci50b1N0cmluZwppZihzPT09cil7cz1hLndp
+ZHRoCnMudG9TdHJpbmcKcj1iLndpZHRoCnIudG9TdHJpbmcKaWYocz09PXIpe3M9YS5oZWlnaHQKcy50
+b1N0cmluZwpyPWIuaGVpZ2h0CnIudG9TdHJpbmcKcj1zPT09cgpzPXJ9ZWxzZSBzPSExfWVsc2Ugcz0h
+MX1lbHNlIHM9ITF9ZWxzZSBzPSExCnJldHVybiBzfSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxw
+PWEubGVmdApwLnRvU3RyaW5nCnA9Qy5DRC5naU8ocCkKcz1hLnRvcApzLnRvU3RyaW5nCnM9Qy5DRC5n
+aU8ocykKcj1hLndpZHRoCnIudG9TdHJpbmcKcj1DLkNELmdpTyhyKQpxPWEuaGVpZ2h0CnEudG9TdHJp
+bmcKcmV0dXJuIFcuckUocCxzLHIsQy5DRC5naU8ocSkpfSwKJGl0bjoxfQpXLm43LnByb3RvdHlwZT17
+CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19Clcud3oucHJvdG90eXBlPXsKZ0E6ZnVuY3Rp
+b24oYSl7cmV0dXJuIHRoaXMuYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7dmFyIHMKSC51UChiKQpz
+PXRoaXMuYQppZihiPDB8fGI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsYikKcmV0dXJuIHRoaXMuJHRp
+LmMuYShzW2JdKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJHRpLmMuYShjKQp0aHJvdyBILmIoUC5M
+NCgiQ2Fubm90IG1vZGlmeSBsaXN0IikpfX0KVy5jdi5wcm90b3R5cGU9ewpnUWc6ZnVuY3Rpb24oYSl7
+cmV0dXJuIG5ldyBXLmk3KGEpfSwKZ0Q6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBXLkk0KGEpfSwKc0Q6
+ZnVuY3Rpb24oYSxiKXt2YXIgcwp0LlEuYShiKQpzPXRoaXMuZ0QoYSkKcy5WMSgwKQpzLkZWKDAsYil9
+LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBhLmxvY2FsTmFtZX0sCkZGOmZ1bmN0aW9uKGEpe3ZhciBzPSEh
+YS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkCmlmKHMpYS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCkKZWxz
+ZSBhLnNjcm9sbEludG9WaWV3KCl9LApuejpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzLHI9dGhpcy5y
+NihhLGMsZCxlKQpzd2l0Y2goYi50b0xvd2VyQ2FzZSgpKXtjYXNlImJlZm9yZWJlZ2luIjpzPWEucGFy
+ZW50Tm9kZQpzLnRvU3RyaW5nCkouRWgocyxyLGEpCmJyZWFrCmNhc2UiYWZ0ZXJiZWdpbiI6cz1hLmNo
+aWxkTm9kZXMKdGhpcy5tSyhhLHIscy5sZW5ndGg+MD9zWzBdOm51bGwpCmJyZWFrCmNhc2UiYmVmb3Jl
+ZW5kIjphLmFwcGVuZENoaWxkKHIpCmJyZWFrCmNhc2UiYWZ0ZXJlbmQiOnM9YS5wYXJlbnROb2RlCnMu
+dG9TdHJpbmcKSi5FaChzLHIsYS5uZXh0U2libGluZykKYnJlYWsKZGVmYXVsdDpILnYoUC54WSgiSW52
+YWxpZCBwb3NpdGlvbiAiK2IpKX19LApyNjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscAppZihj
+PT1udWxsKXtpZihkPT1udWxsKXtzPSQubHQKaWYocz09bnVsbCl7cz1ILlZNKFtdLHQudikKcj1uZXcg
+Vy52RChzKQpDLk5tLmkocyxXLlR3KG51bGwpKQpDLk5tLmkocyxXLkJsKCkpCiQubHQ9cgpkPXJ9ZWxz
+ZSBkPXN9cz0kLkVVCmlmKHM9PW51bGwpe3M9bmV3IFcuS28oZCkKJC5FVT1zCmM9c31lbHNle3MuYT1k
+CmM9c319ZWxzZSBpZihkIT1udWxsKXRocm93IEguYihQLnhZKCJ2YWxpZGF0b3IgY2FuIG9ubHkgYmUg
+cGFzc2VkIGlmIHRyZWVTYW5pdGl6ZXIgaXMgbnVsbCIpKQppZigkLnhvPT1udWxsKXtzPWRvY3VtZW50
+CnI9cy5pbXBsZW1lbnRhdGlvbgpyLnRvU3RyaW5nCnI9Qy5tSC5EYyhyLCIiKQokLnhvPXIKJC5CTz1y
+LmNyZWF0ZVJhbmdlKCkKcj0kLnhvLmNyZWF0ZUVsZW1lbnQoImJhc2UiKQp0LmNSLmEocikKcz1zLmJh
+c2VVUkkKcy50b1N0cmluZwpyLmhyZWY9cwokLnhvLmhlYWQuYXBwZW5kQ2hpbGQocil9cz0kLnhvCmlm
+KHMuYm9keT09bnVsbCl7cj1zLmNyZWF0ZUVsZW1lbnQoImJvZHkiKQpDLkJaLnNYRyhzLHQucC5hKHIp
+KX1zPSQueG8KaWYodC5wLmIoYSkpe3M9cy5ib2R5CnMudG9TdHJpbmcKcT1zfWVsc2V7cy50b1N0cmlu
+ZwpxPXMuY3JlYXRlRWxlbWVudChhLnRhZ05hbWUpCiQueG8uYm9keS5hcHBlbmRDaGlsZChxKX1pZigi
+Y3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBlJiYhQy5ObS50
+ZyhDLlNxLGEudGFnTmFtZSkpeyQuQk8uc2VsZWN0Tm9kZUNvbnRlbnRzKHEpCnM9JC5CTwpzLnRvU3Ry
+aW5nCnA9cy5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoYj09bnVsbD8ibnVsbCI6Yil9ZWxzZXtKLndm
+KHEsYikKcD0kLnhvLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpmb3IoO3M9cS5maXJzdENoaWxkLHMh
+PW51bGw7KXAuYXBwZW5kQ2hpbGQocyl9aWYocSE9PSQueG8uYm9keSlKLkx0KHEpCmMuUG4ocCkKZG9j
+dW1lbnQuYWRvcHROb2RlKHApCnJldHVybiBwfSwKQUg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlz
+LnI2KGEsYixjLG51bGwpfSwKc2hmOmZ1bmN0aW9uKGEsYil7dGhpcy5ZQyhhLGIpfSwKcGs6ZnVuY3Rp
+b24oYSxiLGMpe3RoaXMuc2E0KGEsbnVsbCkKYS5hcHBlbmRDaGlsZCh0aGlzLnI2KGEsYixudWxsLGMp
+KX0sCllDOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKc1JOOmZ1bmN0aW9u
+KGEsYil7YS5pbm5lckhUTUw9Yn0sCmduczpmdW5jdGlvbihhKXtyZXR1cm4gYS50YWdOYW1lfSwKZ1Zs
+OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgVy5ldShhLCJjbGljayIsITEsdC5rKX0sCiRpY3Y6MX0KVy5D
+di5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdC5oLmIodC5BLmEoYSkpfSwKJFM6MjZ9
+ClcuZWEucHJvdG90eXBlPXskaWVhOjF9ClcuRDAucHJvdG90eXBlPXsKT246ZnVuY3Rpb24oYSxiLGMs
+ZCl7dC5idy5hKGMpCmlmKGMhPW51bGwpdGhpcy52KGEsYixjLGQpfSwKQjpmdW5jdGlvbihhLGIsYyl7
+cmV0dXJuIHRoaXMuT24oYSxiLGMsbnVsbCl9LAp2OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLmFk
+ZEV2ZW50TGlzdGVuZXIoYixILnRSKHQuYncuYShjKSwxKSxkKX0sCiRpRDA6MX0KVy5oSC5wcm90b3R5
+cGU9eyRpaEg6MX0KVy5oNC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9
+fQpXLmJyLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19ClcuVmIucHJv
+dG90eXBlPXsKc1hHOmZ1bmN0aW9uKGEsYil7YS5ib2R5PWJ9fQpXLmZKLnByb3RvdHlwZT17CmVvOmZ1
+bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLm9wZW4oYixjLCEwKX0sCiRpZko6MX0KVy53YS5wcm90b3R5
+cGU9e30KVy5TZy5wcm90b3R5cGU9eyRpU2c6MX0KVy51OC5wcm90b3R5cGU9ewpnRHI6ZnVuY3Rpb24o
+YSl7aWYoIm9yaWdpbiIgaW4gYSlyZXR1cm4gYS5vcmlnaW4KcmV0dXJuIEguRWooYS5wcm90b2NvbCkr
+Ii8vIitILkVqKGEuaG9zdCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAokaXU4OjF9
+ClcuQWoucHJvdG90eXBlPXskaUFqOjF9ClcuZTcucHJvdG90eXBlPXsKZ3I4OmZ1bmN0aW9uKGEpe3Zh
+ciBzPXRoaXMuYSxyPXMuY2hpbGROb2Rlcy5sZW5ndGgKaWYocj09PTApdGhyb3cgSC5iKFAuUFYoIk5v
+IGVsZW1lbnRzIikpCmlmKHI+MSl0aHJvdyBILmIoUC5QVigiTW9yZSB0aGFuIG9uZSBlbGVtZW50Iikp
+CnM9cy5maXJzdENoaWxkCnMudG9TdHJpbmcKcmV0dXJuIHN9LApGVjpmdW5jdGlvbihhLGIpe3ZhciBz
+LHIscSxwLG8KdC5laC5hKGIpCmlmKGIgaW5zdGFuY2VvZiBXLmU3KXtzPWIuYQpyPXRoaXMuYQppZihz
+IT09cilmb3IocT1zLmNoaWxkTm9kZXMubGVuZ3RoLHA9MDtwPHE7KytwKXtvPXMuZmlyc3RDaGlsZApv
+LnRvU3RyaW5nCnIuYXBwZW5kQ2hpbGQobyl9cmV0dXJufWZvcihzPWIuZ20oYikscj10aGlzLmE7cy5G
+KCk7KXIuYXBwZW5kQ2hpbGQocy5nbCgpKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIKdC5BLmEo
+YykKcz10aGlzLmEKcj1zLmNoaWxkTm9kZXMKaWYoYjwwfHxiPj1yLmxlbmd0aClyZXR1cm4gSC5PSChy
+LGIpCnMucmVwbGFjZUNoaWxkKGMscltiXSl9LApnbTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEuY2hp
+bGROb2RlcwpyZXR1cm4gbmV3IFcuVzkocyxzLmxlbmd0aCxILnoocykuQygiVzk8R20uRT4iKSl9LApn
+QTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmNoaWxkTm9kZXMubGVuZ3RofSwKcTpmdW5jdGlvbihh
+LGIpe3ZhciBzCkgudVAoYikKcz10aGlzLmEuY2hpbGROb2RlcwppZihiPDB8fGI+PXMubGVuZ3RoKXJl
+dHVybiBILk9IKHMsYikKcmV0dXJuIHNbYl19fQpXLnVILnByb3RvdHlwZT17CndnOmZ1bmN0aW9uKGEp
+e3ZhciBzPWEucGFyZW50Tm9kZQppZihzIT1udWxsKXMucmVtb3ZlQ2hpbGQoYSl9LApENDpmdW5jdGlv
+bihhKXt2YXIgcwpmb3IoO3M9YS5maXJzdENoaWxkLHMhPW51bGw7KWEucmVtb3ZlQ2hpbGQocyl9LAp3
+OmZ1bmN0aW9uKGEpe3ZhciBzPWEubm9kZVZhbHVlCnJldHVybiBzPT1udWxsP3RoaXMuVShhKTpzfSwK
+c2E0OmZ1bmN0aW9uKGEsYil7YS50ZXh0Q29udGVudD1ifSwKbUs6ZnVuY3Rpb24oYSxiLGMpe3JldHVy
+biBhLmluc2VydEJlZm9yZShiLGMpfSwKJGl1SDoxfQpXLkJILnByb3RvdHlwZT17CmdBOmZ1bmN0aW9u
+KGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCmlmKGI+Pj4wIT09Ynx8
+Yj49YS5sZW5ndGgpdGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxsKSkKcmV0dXJuIGFbYl19
+LApZOmZ1bmN0aW9uKGEsYixjKXt0LkEuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBl
+bGVtZW50IG9mIGltbXV0YWJsZSBMaXN0LiIpKX0sCmd0SDpmdW5jdGlvbihhKXtpZihhLmxlbmd0aD4w
+KXJldHVybiBhWzBdCnRocm93IEguYihQLlBWKCJObyBlbGVtZW50cyIpKX0sCkU6ZnVuY3Rpb24oYSxi
+KXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJuIGFbYl19LAokaWJROjEs
+CiRpWGo6MSwKJGljWDoxLAokaXpNOjF9ClcuU04ucHJvdG90eXBlPXt9ClcuZXcucHJvdG90eXBlPXsk
+aWV3OjF9ClcubHAucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5U
+Yi5wcm90b3R5cGU9ewpyNjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyCmlmKCJjcmVhdGVDb250ZXh0
+dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMs
+ZCkKcz1XLlU5KCI8dGFibGU+IitILkVqKGIpKyI8L3RhYmxlPiIsYyxkKQpyPWRvY3VtZW50LmNyZWF0
+ZURvY3VtZW50RnJhZ21lbnQoKQpyLnRvU3RyaW5nCnMudG9TdHJpbmcKbmV3IFcuZTcocikuRlYoMCxu
+ZXcgVy5lNyhzKSkKcmV0dXJuIHJ9fQpXLkl2LnByb3RvdHlwZT17CnI2OmZ1bmN0aW9uKGEsYixjLGQp
+e3ZhciBzLHIscSxwCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5w
+cm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKcz1kb2N1bWVudApyPXMuY3JlYXRlRG9jdW1l
+bnRGcmFnbWVudCgpCnM9Qy5JZS5yNihzLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpCnMudG9T
+dHJpbmcKcz1uZXcgVy5lNyhzKQpxPXMuZ3I4KHMpCnEudG9TdHJpbmcKcz1uZXcgVy5lNyhxKQpwPXMu
+Z3I4KHMpCnIudG9TdHJpbmcKcC50b1N0cmluZwpuZXcgVy5lNyhyKS5GVigwLG5ldyBXLmU3KHApKQpy
+ZXR1cm4gcn19ClcuV1AucHJvdG90eXBlPXsKcjY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxCmlm
+KCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJu
+IHRoaXMuRFcoYSxiLGMsZCkKcz1kb2N1bWVudApyPXMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnM9
+Qy5JZS5yNihzLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpCnMudG9TdHJpbmcKcz1uZXcgVy5l
+NyhzKQpxPXMuZ3I4KHMpCnIudG9TdHJpbmcKcS50b1N0cmluZwpuZXcgVy5lNyhyKS5GVigwLG5ldyBX
+LmU3KHEpKQpyZXR1cm4gcn19ClcueVkucHJvdG90eXBlPXsKcGs6ZnVuY3Rpb24oYSxiLGMpe3ZhciBz
+LHIKdGhpcy5zYTQoYSxudWxsKQpzPWEuY29udGVudApzLnRvU3RyaW5nCkouYlQocykKcj10aGlzLnI2
+KGEsYixudWxsLGMpCmEuY29udGVudC5hcHBlbmRDaGlsZChyKX0sCllDOmZ1bmN0aW9uKGEsYil7cmV0
+dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKJGl5WToxfQpXLnc2LnByb3RvdHlwZT17fQpXLks1LnByb3Rv
+dHlwZT17ClBvOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1XLlAxKGEub3BlbihiLGMpKQpyZXR1cm4gc30s
+CmdtVzpmdW5jdGlvbihhKXtyZXR1cm4gYS5sb2NhdGlvbn0sCnVzOmZ1bmN0aW9uKGEsYil7cmV0dXJu
+IGEuY29uZmlybShiKX0sCiRpSzU6MSwKJGl2NjoxfQpXLkNtLnByb3RvdHlwZT17JGlDbToxfQpXLkNR
+LnByb3RvdHlwZT17JGlDUToxfQpXLnc0LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHMscj1h
+LmxlZnQKci50b1N0cmluZwpyPSJSZWN0YW5nbGUgKCIrSC5FaihyKSsiLCAiCnM9YS50b3AKcy50b1N0
+cmluZwpzPXIrSC5FaihzKSsiKSAiCnI9YS53aWR0aApyLnRvU3RyaW5nCnI9cytILkVqKHIpKyIgeCAi
+CnM9YS5oZWlnaHQKcy50b1N0cmluZwpyZXR1cm4gcitILkVqKHMpfSwKRE46ZnVuY3Rpb24oYSxiKXt2
+YXIgcyxyCmlmKGI9PW51bGwpcmV0dXJuITEKaWYodC5xLmIoYikpe3M9YS5sZWZ0CnMudG9TdHJpbmcK
+cj1iLmxlZnQKci50b1N0cmluZwppZihzPT09cil7cz1hLnRvcApzLnRvU3RyaW5nCnI9Yi50b3AKci50
+b1N0cmluZwppZihzPT09cil7cz1hLndpZHRoCnMudG9TdHJpbmcKcj1iLndpZHRoCnIudG9TdHJpbmcK
+aWYocz09PXIpe3M9YS5oZWlnaHQKcy50b1N0cmluZwpyPWIuaGVpZ2h0CnIudG9TdHJpbmcKcj1zPT09
+cgpzPXJ9ZWxzZSBzPSExfWVsc2Ugcz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSExCnJldHVybiBzfSwKZ2lP
+OmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPWEubGVmdApwLnRvU3RyaW5nCnA9Qy5DRC5naU8ocCkKcz1h
+LnRvcApzLnRvU3RyaW5nCnM9Qy5DRC5naU8ocykKcj1hLndpZHRoCnIudG9TdHJpbmcKcj1DLkNELmdp
+TyhyKQpxPWEuaGVpZ2h0CnEudG9TdHJpbmcKcmV0dXJuIFcuckUocCxzLHIsQy5DRC5naU8ocSkpfX0K
+Vy5yaC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9u
+KGEsYil7SC51UChiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93IEguYihQLkNmKGIsYSxu
+dWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7dC5BLmEoYykKdGhy
+b3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlzdC4iKSl9LApF
+OmZ1bmN0aW9uKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIpCnJldHVybiBh
+W2JdfSwKJGliUToxLAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpXLmNmLnByb3RvdHlwZT17Cks6ZnVu
+Y3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvCnQuZUEuYShiKQpmb3Iocz10aGlzLmdWKCkscj1zLmxlbmd0
+aCxxPXRoaXMuYSxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcCl7bz1z
+W3BdCmIuJDIobyxxLmdldEF0dHJpYnV0ZShvKSl9fSwKZ1Y6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxv
+LG4sbT10aGlzLmEuYXR0cmlidXRlcwptLnRvU3RyaW5nCnM9SC5WTShbXSx0LnMpCmZvcihyPW0ubGVu
+Z3RoLHE9dC5oOSxwPTA7cDxyOysrcCl7aWYocD49bS5sZW5ndGgpcmV0dXJuIEguT0gobSxwKQpvPXEu
+YShtW3BdKQppZihvLm5hbWVzcGFjZVVSST09bnVsbCl7bj1vLm5hbWUKbi50b1N0cmluZwpDLk5tLmko
+cyxuKX19cmV0dXJuIHN9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ1YoKS5sZW5ndGg9PT0w
+fX0KVy5pNy5wcm90b3R5cGU9ewp4NDpmdW5jdGlvbihhKXt2YXIgcz1ILm9UKHRoaXMuYS5oYXNBdHRy
+aWJ1dGUoYSkpCnJldHVybiBzfSwKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEuZ2V0QXR0cmli
+dXRlKEguaChiKSl9LApZOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmEuc2V0QXR0cmlidXRlKGIsYyl9LApn
+QTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nVigpLmxlbmd0aH19ClcuU3kucHJvdG90eXBlPXsKeDQ6
+ZnVuY3Rpb24oYSl7dmFyIHM9SC5vVCh0aGlzLmEuYS5oYXNBdHRyaWJ1dGUoImRhdGEtIit0aGlzLk8o
+YSkpKQpyZXR1cm4gc30sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5hLmEuZ2V0QXR0cmlidXRl
+KCJkYXRhLSIrdGhpcy5PKEguaChiKSkpfSwKWTpmdW5jdGlvbihhLGIsYyl7dGhpcy5hLmEuc2V0QXR0
+cmlidXRlKCJkYXRhLSIrdGhpcy5PKGIpLGMpfSwKSzpmdW5jdGlvbihhLGIpe3RoaXMuYS5LKDAsbmV3
+IFcuS1ModGhpcyx0LmVBLmEoYikpKX0sCmdWOmZ1bmN0aW9uKCl7dmFyIHM9SC5WTShbXSx0LnMpCnRo
+aXMuYS5LKDAsbmV3IFcuQTModGhpcyxzKSkKcmV0dXJuIHN9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4g
+dGhpcy5nVigpLmxlbmd0aH0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nVigpLmxlbmd0aD09
+PTB9LAprOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT1ILlZNKGEuc3BsaXQoIi0iKSx0LnMpCmZvcihzPTE7
+czxxLmxlbmd0aDsrK3Mpe3I9cVtzXQppZihyLmxlbmd0aD4wKUMuTm0uWShxLHMsclswXS50b1VwcGVy
+Q2FzZSgpK0ouS1YociwxKSl9cmV0dXJuIEMuTm0uSChxLCIiKX0sCk86ZnVuY3Rpb24oYSl7dmFyIHMs
+cixxLHAsbwpmb3Iocz1hLmxlbmd0aCxyPTAscT0iIjtyPHM7KytyKXtwPWFbcl0Kbz1wLnRvTG93ZXJD
+YXNlKCkKcT0ocCE9PW8mJnI+MD9xKyItIjpxKStvfXJldHVybiBxLmNoYXJDb2RlQXQoMCk9PTA/cTpx
+fX0KVy5LUy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclkoYSkubihhLCJkYXRhLSIp
+KXRoaXMuYi4kMih0aGlzLmEuayhDLnhCLkcoYSw1KSksYil9LAokUzoxMH0KVy5BMy5wcm90b3R5cGU9
+ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclkoYSkubihhLCJkYXRhLSIpKUMuTm0uaSh0aGlzLmIsdGhp
+cy5hLmsoQy54Qi5HKGEsNSkpKX0sCiRTOjEwfQpXLkk0LnByb3RvdHlwZT17ClA6ZnVuY3Rpb24oKXt2
+YXIgcyxyLHEscCxvPVAuTHModC5OKQpmb3Iocz10aGlzLmEuY2xhc3NOYW1lLnNwbGl0KCIgIikscj1z
+Lmxlbmd0aCxxPTA7cTxyOysrcSl7cD1KLlQwKHNbcV0pCmlmKHAubGVuZ3RoIT09MClvLmkoMCxwKX1y
+ZXR1cm4gb30sClg6ZnVuY3Rpb24oYSl7dGhpcy5hLmNsYXNzTmFtZT10LkMuYShhKS5IKDAsIiAiKX0s
+CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuY2xhc3NMaXN0Lmxlbmd0aH0sCmdsMDpmdW5jdGlv
+bihhKXtyZXR1cm4gdGhpcy5hLmNsYXNzTGlzdC5sZW5ndGg9PT0wfSwKZ29yOmZ1bmN0aW9uKGEpe3Jl
+dHVybiB0aGlzLmEuY2xhc3NMaXN0Lmxlbmd0aCE9PTB9LApWMTpmdW5jdGlvbihhKXt0aGlzLmEuY2xh
+c3NOYW1lPSIifSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLmEuY2xhc3NMaXN0LmNvbnRhaW5z
+KGIpCnJldHVybiBzfSwKaTpmdW5jdGlvbihhLGIpe3ZhciBzLHIKSC5oKGIpCnM9dGhpcy5hLmNsYXNz
+TGlzdApyPXMuY29udGFpbnMoYikKcy5hZGQoYikKcmV0dXJuIXJ9LApSOmZ1bmN0aW9uKGEsYil7dmFy
+IHMscixxCmlmKHR5cGVvZiBiPT0ic3RyaW5nIil7cz10aGlzLmEuY2xhc3NMaXN0CnI9cy5jb250YWlu
+cyhiKQpzLnJlbW92ZShiKQpxPXJ9ZWxzZSBxPSExCnJldHVybiBxfSwKRlY6ZnVuY3Rpb24oYSxiKXtX
+LlROKHRoaXMuYSx0LlEuYShiKSl9fQpXLkZrLnByb3RvdHlwZT17fQpXLlJPLnByb3RvdHlwZT17fQpX
+LmV1LnByb3RvdHlwZT17fQpXLnhDLnByb3RvdHlwZT17fQpXLnZOLnByb3RvdHlwZT17CiQxOmZ1bmN0
+aW9uKGEpe3JldHVybiB0aGlzLmEuJDEodC5CLmEoYSkpfSwKJFM6Mjh9ClcuSlEucHJvdG90eXBlPXsK
+Q1k6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoJC5vci5hPT09MCl7Zm9yKHM9MDtzPDI2MjsrK3MpJC5vci5Z
+KDAsQy5jbVtzXSxXLnBTKCkpCmZvcihzPTA7czwxMjsrK3MpJC5vci5ZKDAsQy5CSVtzXSxXLlY0KCkp
+fX0sCmkwOmZ1bmN0aW9uKGEpe3JldHVybiAkLkFOKCkudGcoMCxXLnJTKGEpKX0sCkViOmZ1bmN0aW9u
+KGEsYixjKXt2YXIgcz0kLm9yLnEoMCxILkVqKFcuclMoYSkpKyI6OiIrYikKaWYocz09bnVsbClzPSQu
+b3IucSgwLCIqOjoiK2IpCmlmKHM9PW51bGwpcmV0dXJuITEKcmV0dXJuIEgueTgocy4kNChhLGIsYyx0
+aGlzKSl9LAokaWtGOjF9ClcuR20ucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBX
+Llc5KGEsdGhpcy5nQShhKSxILnooYSkuQygiVzk8R20uRT4iKSl9fQpXLnZELnByb3RvdHlwZT17Cmkw
+OmZ1bmN0aW9uKGEpe3JldHVybiBDLk5tLlZyKHRoaXMuYSxuZXcgVy5VdihhKSl9LApFYjpmdW5jdGlv
+bihhLGIsYyl7cmV0dXJuIEMuTm0uVnIodGhpcy5hLG5ldyBXLkVnKGEsYixjKSl9LAokaWtGOjF9Clcu
+VXYucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuZjYuYShhKS5pMCh0aGlzLmEpfSwK
+JFM6MTV9ClcuRWcucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuZjYuYShhKS5FYih0
+aGlzLmEsdGhpcy5iLHRoaXMuYyl9LAokUzoxNX0KVy5tNi5wcm90b3R5cGU9ewpDWTpmdW5jdGlvbihh
+LGIsYyxkKXt2YXIgcyxyLHEKdGhpcy5hLkZWKDAsYykKcz1iLmV2KDAsbmV3IFcuRW8oKSkKcj1iLmV2
+KDAsbmV3IFcuV2soKSkKdGhpcy5iLkZWKDAscykKcT10aGlzLmMKcS5GVigwLEMueEQpCnEuRlYoMCxy
+KX0sCmkwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEudGcoMCxXLnJTKGEpKX0sCkViOmZ1bmN0aW9u
+KGEsYixjKXt2YXIgcz10aGlzLHI9Vy5yUyhhKSxxPXMuYwppZihxLnRnKDAsSC5FaihyKSsiOjoiK2Ip
+KXJldHVybiBzLmQuRHQoYykKZWxzZSBpZihxLnRnKDAsIio6OiIrYikpcmV0dXJuIHMuZC5EdChjKQpl
+bHNle3E9cy5iCmlmKHEudGcoMCxILkVqKHIpKyI6OiIrYikpcmV0dXJuITAKZWxzZSBpZihxLnRnKDAs
+Iio6OiIrYikpcmV0dXJuITAKZWxzZSBpZihxLnRnKDAsSC5FaihyKSsiOjoqIikpcmV0dXJuITAKZWxz
+ZSBpZihxLnRnKDAsIio6OioiKSlyZXR1cm4hMH1yZXR1cm4hMX0sCiRpa0Y6MX0KVy5Fby5wcm90b3R5
+cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4hQy5ObS50ZyhDLkJJLEguaChhKSl9LAokUzo2fQpXLldr
+LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBDLk5tLnRnKEMuQkksSC5oKGEpKX0sCiRT
+OjZ9ClcuY3QucHJvdG90eXBlPXsKRWI6ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuakYoYSxiLGMpKXJl
+dHVybiEwCmlmKGI9PT0idGVtcGxhdGUiJiZjPT09IiIpcmV0dXJuITAKaWYoYS5nZXRBdHRyaWJ1dGUo
+InRlbXBsYXRlIik9PT0iIilyZXR1cm4gdGhpcy5lLnRnKDAsYikKcmV0dXJuITF9fQpXLklBLnByb3Rv
+dHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiJURU1QTEFURTo6IitILkVqKEguaChhKSl9LAokUzo1
+fQpXLk93LnByb3RvdHlwZT17CmkwOmZ1bmN0aW9uKGEpe3ZhciBzCmlmKHQuZXcuYihhKSlyZXR1cm4h
+MQpzPXQuZzcuYihhKQppZihzJiZXLnJTKGEpPT09ImZvcmVpZ25PYmplY3QiKXJldHVybiExCmlmKHMp
+cmV0dXJuITAKcmV0dXJuITF9LApFYjpmdW5jdGlvbihhLGIsYyl7aWYoYj09PSJpcyJ8fEMueEIubihi
+LCJvbiIpKXJldHVybiExCnJldHVybiB0aGlzLmkwKGEpfSwKJGlrRjoxfQpXLlc5LnByb3RvdHlwZT17
+CkY6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLHI9cy5jKzEscT1zLmIKaWYocjxxKXtzLnNwKEoueDkocy5h
+LHIpKQpzLmM9cgpyZXR1cm4hMH1zLnNwKG51bGwpCnMuYz1xCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24o
+KXtyZXR1cm4gdGhpcy5kfSwKc3A6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLkMoIjE/IikuYShh
+KX0sCiRpQW46MX0KVy5kVy5wcm90b3R5cGU9eyRpRDA6MSwkaXY2OjF9ClcubWsucHJvdG90eXBlPXsk
+aXkwOjF9ClcuS28ucHJvdG90eXBlPXsKUG46ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPW5ldyBXLmZt
+KHMpCnMuYj0hMQpyLiQyKGEsbnVsbCkKZm9yKDtzLmI7KXtzLmI9ITEKci4kMihhLG51bGwpfX0sCkVQ
+OmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcy5iPSEwCmlmKGIhPW51bGw/YiE9PWEucGFyZW50Tm9kZTpz
+KUouTHQoYSkKZWxzZSBiLnJlbW92ZUNoaWxkKGEpfSwKSTQ6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEs
+cCxvLG49ITAsbT1udWxsLGw9bnVsbAp0cnl7bT1KLmlnKGEpCmw9bS5hLmdldEF0dHJpYnV0ZSgiaXMi
+KQp0LmguYShhKQpzPWZ1bmN0aW9uKGMpe2lmKCEoYy5hdHRyaWJ1dGVzIGluc3RhbmNlb2YgTmFtZWRO
+b2RlTWFwKSlyZXR1cm4gdHJ1ZQppZihjLmlkPT0nbGFzdENoaWxkJ3x8Yy5uYW1lPT0nbGFzdENoaWxk
+J3x8Yy5pZD09J3ByZXZpb3VzU2libGluZyd8fGMubmFtZT09J3ByZXZpb3VzU2libGluZyd8fGMuaWQ9
+PSdjaGlsZHJlbid8fGMubmFtZT09J2NoaWxkcmVuJylyZXR1cm4gdHJ1ZQp2YXIgaz1jLmNoaWxkTm9k
+ZXMKaWYoYy5sYXN0Q2hpbGQmJmMubGFzdENoaWxkIT09a1trLmxlbmd0aC0xXSlyZXR1cm4gdHJ1ZQpp
+ZihjLmNoaWxkcmVuKWlmKCEoYy5jaGlsZHJlbiBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9ufHxjLmNo
+aWxkcmVuIGluc3RhbmNlb2YgTm9kZUxpc3QpKXJldHVybiB0cnVlCnZhciBqPTAKaWYoYy5jaGlsZHJl
+bilqPWMuY2hpbGRyZW4ubGVuZ3RoCmZvcih2YXIgaT0wO2k8ajtpKyspe3ZhciBoPWMuY2hpbGRyZW5b
+aV0KaWYoaC5pZD09J2F0dHJpYnV0ZXMnfHxoLm5hbWU9PSdhdHRyaWJ1dGVzJ3x8aC5pZD09J2xhc3RD
+aGlsZCd8fGgubmFtZT09J2xhc3RDaGlsZCd8fGguaWQ9PSdwcmV2aW91c1NpYmxpbmcnfHxoLm5hbWU9
+PSdwcmV2aW91c1NpYmxpbmcnfHxoLmlkPT0nY2hpbGRyZW4nfHxoLm5hbWU9PSdjaGlsZHJlbicpcmV0
+dXJuIHRydWV9cmV0dXJuIGZhbHNlfShhKQpuPUgub1Qocyk/ITA6IShhLmF0dHJpYnV0ZXMgaW5zdGFu
+Y2VvZiBOYW1lZE5vZGVNYXApfWNhdGNoKHApe0guUnUocCl9cj0iZWxlbWVudCB1bnByaW50YWJsZSIK
+dHJ5e3I9Si5qKGEpfWNhdGNoKHApe0guUnUocCl9dHJ5e3E9Vy5yUyhhKQp0aGlzLmtSKHQuaC5hKGEp
+LGIsbixyLHEsdC5mLmEobSksSC5rKGwpKX1jYXRjaChwKXtpZihILlJ1KHApIGluc3RhbmNlb2YgUC51
+KXRocm93IHAKZWxzZXt0aGlzLkVQKGEsYikKd2luZG93Cm89IlJlbW92aW5nIGNvcnJ1cHRlZCBlbGVt
+ZW50ICIrSC5FaihyKQppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUu
+d2FybihvKX19fSwKa1I6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHMscixxLHAsbyxuLG09dGhp
+cwppZihjKXttLkVQKGEsYikKd2luZG93CnM9IlJlbW92aW5nIGVsZW1lbnQgZHVlIHRvIGNvcnJ1cHRl
+ZCBhdHRyaWJ1dGVzIG9uIDwiK2QrIj4iCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5k
+b3cuY29uc29sZS53YXJuKHMpCnJldHVybn1pZighbS5hLmkwKGEpKXttLkVQKGEsYikKd2luZG93CnM9
+IlJlbW92aW5nIGRpc2FsbG93ZWQgZWxlbWVudCA8IitILkVqKGUpKyI+IGZyb20gIitILkVqKGIpCmlm
+KHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKHMpCnJldHVybn1p
+ZihnIT1udWxsKWlmKCFtLmEuRWIoYSwiaXMiLGcpKXttLkVQKGEsYikKd2luZG93CnM9IlJlbW92aW5n
+IGRpc2FsbG93ZWQgdHlwZSBleHRlbnNpb24gPCIrSC5FaihlKSsnIGlzPSInK2crJyI+JwppZih0eXBl
+b2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihzKQpyZXR1cm59cz1mLmdW
+KCkKcj1ILlZNKHMuc2xpY2UoMCksSC50NihzKSkKZm9yKHE9Zi5nVigpLmxlbmd0aC0xLHM9Zi5hO3E+
+PTA7LS1xKXtpZihxPj1yLmxlbmd0aClyZXR1cm4gSC5PSChyLHEpCnA9cltxXQpvPW0uYQpuPUouY0go
+cCkKSC5oKHApCmlmKCFvLkViKGEsbixzLmdldEF0dHJpYnV0ZShwKSkpe3dpbmRvdwpvPSJSZW1vdmlu
+ZyBkaXNhbGxvd2VkIGF0dHJpYnV0ZSA8IitILkVqKGUpKyIgIitwKyc9IicrSC5FaihzLmdldEF0dHJp
+YnV0ZShwKSkrJyI+JwppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUu
+d2FybihvKQpzLnJlbW92ZUF0dHJpYnV0ZShwKX19aWYodC5hVy5iKGEpKXtzPWEuY29udGVudApzLnRv
+U3RyaW5nCm0uUG4ocyl9fSwKJGlvbjoxfQpXLmZtLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7
+dmFyIHMscixxLHAsbyxuLG09dGhpcy5hCnN3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6bS5JNChhLGIp
+CmJyZWFrCmNhc2UgODpjYXNlIDExOmNhc2UgMzpjYXNlIDQ6YnJlYWsKZGVmYXVsdDptLkVQKGEsYil9
+cz1hLmxhc3RDaGlsZApmb3IocT10LkE7bnVsbCE9czspe3I9bnVsbAp0cnl7cj1zLnByZXZpb3VzU2li
+bGluZwppZihyIT1udWxsKXtwPXIubmV4dFNpYmxpbmcKbz1zCm89cD09bnVsbD9vIT1udWxsOnAhPT1v
+CnA9b31lbHNlIHA9ITEKaWYocCl7cD1QLlBWKCJDb3JydXB0IEhUTUwiKQp0aHJvdyBILmIocCl9fWNh
+dGNoKG4pe0guUnUobikKcD1xLmEocykKbS5iPSEwCm89cC5wYXJlbnROb2RlCm89YT09bnVsbD9vIT1u
+dWxsOmEhPT1vCmlmKG8pe289cC5wYXJlbnROb2RlCmlmKG8hPW51bGwpby5yZW1vdmVDaGlsZChwKX1l
+bHNlIGEucmVtb3ZlQ2hpbGQocCkKcz1udWxsCnI9YS5sYXN0Q2hpbGR9aWYocyE9bnVsbCl0aGlzLiQy
+KHMsYSkKcz1yfX0sCiRTOjMxfQpXLkxlLnByb3RvdHlwZT17fQpXLks3LnByb3RvdHlwZT17fQpXLnJC
+LnByb3RvdHlwZT17fQpXLlhXLnByb3RvdHlwZT17fQpXLm9hLnByb3RvdHlwZT17fQpQLmlKLnByb3Rv
+dHlwZT17ClZIOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5hLHE9ci5sZW5ndGgKZm9yKHM9MDtzPHE7
+KytzKWlmKHJbc109PT1hKXJldHVybiBzCkMuTm0uaShyLGEpCkMuTm0uaSh0aGlzLmIsbnVsbCkKcmV0
+dXJuIHF9LApQdjpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD10aGlzLG89e30KaWYoYT09bnVsbClyZXR1
+cm4gYQppZihILmwoYSkpcmV0dXJuIGEKaWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKHR5
+cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5pUClyZXR1cm4gbmV3IERh
+dGUoYS5hKQppZih0LmZ2LmIoYSkpdGhyb3cgSC5iKFAuU1koInN0cnVjdHVyZWQgY2xvbmUgb2YgUmVn
+RXhwIikpCmlmKHQuYzguYihhKSlyZXR1cm4gYQppZih0LncuYihhKSlyZXR1cm4gYQppZih0LkkuYihh
+KSlyZXR1cm4gYQpzPXQuZEUuYihhKXx8ITEKaWYocylyZXR1cm4gYQppZih0LmYuYihhKSl7cj1wLlZI
+KGEpCnM9cC5iCmlmKHI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscikKcT1vLmE9c1tyXQppZihxIT1u
+dWxsKXJldHVybiBxCnE9e30Kby5hPXEKQy5ObS5ZKHMscixxKQphLksoMCxuZXcgUC5qZyhvLHApKQpy
+ZXR1cm4gby5hfWlmKHQuai5iKGEpKXtyPXAuVkgoYSkKbz1wLmIKaWYocj49by5sZW5ndGgpcmV0dXJu
+IEguT0gobyxyKQpxPW9bcl0KaWYocSE9bnVsbClyZXR1cm4gcQpyZXR1cm4gcC5layhhLHIpfWlmKHQu
+ZUguYihhKSl7cj1wLlZIKGEpCnM9cC5iCmlmKHI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscikKcT1v
+LmI9c1tyXQppZihxIT1udWxsKXJldHVybiBxCnE9e30Kby5iPXEKQy5ObS5ZKHMscixxKQpwLmltKGEs
+bmV3IFAuVGEobyxwKSkKcmV0dXJuIG8uYn10aHJvdyBILmIoUC5TWSgic3RydWN0dXJlZCBjbG9uZSBv
+ZiBvdGhlciB0eXBlIikpfSwKZWs6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPUouVTYoYSkscT1yLmdBKGEp
+LHA9bmV3IEFycmF5KHEpCkMuTm0uWSh0aGlzLmIsYixwKQpmb3Iocz0wO3M8cTsrK3MpQy5ObS5ZKHAs
+cyx0aGlzLlB2KHIucShhLHMpKSkKcmV0dXJuIHB9fQpQLmpnLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9u
+KGEsYil7dGhpcy5hLmFbYV09dGhpcy5iLlB2KGIpfSwKJFM6MzJ9ClAuVGEucHJvdG90eXBlPXsKJDI6
+ZnVuY3Rpb24oYSxiKXt0aGlzLmEuYlthXT10aGlzLmIuUHYoYil9LAokUzoxNn0KUC5CZi5wcm90b3R5
+cGU9ewppbTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwCnQuYjguYShiKQpmb3Iocz1PYmplY3Qua2V5
+cyhhKSxyPXMubGVuZ3RoLHE9MDtxPHI7KytxKXtwPXNbcV0KYi4kMihwLGFbcF0pfX19ClAuQXMucHJv
+dG90eXBlPXsKVDpmdW5jdGlvbihhKXt2YXIgcwpILmgoYSkKcz0kLmhHKCkuYgppZih0eXBlb2YgYSE9
+InN0cmluZyIpSC52KEgudEwoYSkpCmlmKHMudGVzdChhKSlyZXR1cm4gYQp0aHJvdyBILmIoUC5MMyhh
+LCJ2YWx1ZSIsIk5vdCBhIHZhbGlkIGNsYXNzIHRva2VuIikpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4g
+dGhpcy5QKCkuSCgwLCIgIil9LApnbTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLlAoKQpyZXR1cm4gUC5y
+aihzLHMucixILkxoKHMpLmMpfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlAoKS5hPT09MH0s
+CmdvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QKCkuYSE9PTB9LApnQTpmdW5jdGlvbihhKXtyZXR1
+cm4gdGhpcy5QKCkuYX0sCnRnOmZ1bmN0aW9uKGEsYil7dGhpcy5UKGIpCnJldHVybiB0aGlzLlAoKS50
+ZygwLGIpfSwKaTpmdW5jdGlvbihhLGIpe3ZhciBzCkguaChiKQp0aGlzLlQoYikKcz10aGlzLk9TKG5l
+dyBQLkdFKGIpKQpyZXR1cm4gSC55OChzPT1udWxsPyExOnMpfSwKUjpmdW5jdGlvbihhLGIpe3ZhciBz
+LHIKaWYodHlwZW9mIGIhPSJzdHJpbmciKXJldHVybiExCnRoaXMuVChiKQpzPXRoaXMuUCgpCnI9cy5S
+KDAsYikKdGhpcy5YKHMpCnJldHVybiByfSwKRlY6ZnVuY3Rpb24oYSxiKXt0aGlzLk9TKG5ldyBQLk43
+KHRoaXMsdC5RLmEoYikpKX0sCmVSOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcy5QKCkKcmV0dXJuIEgu
+YksocyxiLEguTGgocykuQygibGYuRSIpKX0sCkU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5QKCku
+RSgwLGIpfSwKVjE6ZnVuY3Rpb24oYSl7dGhpcy5PUyhuZXcgUC51USgpKX0sCk9TOmZ1bmN0aW9uKGEp
+e3ZhciBzLHIKdC5iVS5hKGEpCnM9dGhpcy5QKCkKcj1hLiQxKHMpCnRoaXMuWChzKQpyZXR1cm4gcn19
+ClAuR0UucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuQy5hKGEpLmkoMCx0aGlzLmEp
+fSwKJFM6MzR9ClAuTjcucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5iLHI9SC50
+NihzKQpyZXR1cm4gdC5DLmEoYSkuRlYoMCxuZXcgSC5sSihzLHIuQygicVUoMSkiKS5hKHRoaXMuYS5n
+dU0oKSksci5DKCJsSjwxLHFVPiIpKSl9LAokUzoxN30KUC51US5wcm90b3R5cGU9ewokMTpmdW5jdGlv
+bihhKXt0LkMuYShhKQppZihhLmE+MCl7YS5iPWEuYz1hLmQ9YS5lPWEuZj1udWxsCmEuYT0wCmEuUygp
+fXJldHVybiBudWxsfSwKJFM6MTd9ClAuaEYucHJvdG90eXBlPXskaWhGOjF9ClAuUEMucHJvdG90eXBl
+PXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMKdC5ZLmEoYSkKcz1mdW5jdGlvbihiLGMsZCl7cmV0dXJuIGZ1
+bmN0aW9uKCl7cmV0dXJuIGIoYyxkLHRoaXMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3Vt
+ZW50cykpfX0oUC5SNCxhLCExKQpQLkRtKHMsJC53KCksYSkKcmV0dXJuIHN9LAokUzo0fQpQLm10LnBy
+b3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgdGhpcy5hKGEpfSwKJFM6NH0KUC5Oei5w
+cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAucjcoYSl9LAokUzo1NX0KUC5RUy5w
+cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuVHooYSx0LmFtKX0sCiRTOjM3fQpQ
+Lm5wLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5FNChhKX0sCiRTOjM4fQpQ
+LkU0LnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYiE9InN0cmluZyImJnR5cGVv
+ZiBiIT0ibnVtYmVyIil0aHJvdyBILmIoUC54WSgicHJvcGVydHkgaXMgbm90IGEgU3RyaW5nIG9yIG51
+bSIpKQpyZXR1cm4gUC5kVSh0aGlzLmFbYl0pfSwKWTpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIh
+PSJzdHJpbmciJiZ0eXBlb2YgYiE9Im51bWJlciIpdGhyb3cgSC5iKFAueFkoInByb3BlcnR5IGlzIG5v
+dCBhIFN0cmluZyBvciBudW0iKSkKdGhpcy5hW2JdPVAud1koYyl9LApETjpmdW5jdGlvbihhLGIpe2lm
+KGI9PW51bGwpcmV0dXJuITEKcmV0dXJuIGIgaW5zdGFuY2VvZiBQLkU0JiZ0aGlzLmE9PT1iLmF9LAp3
+OmZ1bmN0aW9uKGEpe3ZhciBzLHIKdHJ5e3M9U3RyaW5nKHRoaXMuYSkKcmV0dXJuIHN9Y2F0Y2gocil7
+SC5SdShyKQpzPXRoaXMueGIoMCkKcmV0dXJuIHN9fSwKVjc6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRo
+aXMuYQppZihiPT1udWxsKXM9bnVsbAplbHNle3M9SC50NihiKQpzPVAuQ0gobmV3IEgubEooYixzLkMo
+IkAoMSkiKS5hKFAuaUcoKSkscy5DKCJsSjwxLEA+IikpLCEwLHQueil9cmV0dXJuIFAuZFUoclthXS5h
+cHBseShyLHMpKX0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gMH19ClAucjcucHJvdG90eXBlPXt9ClAu
+VHoucHJvdG90eXBlPXsKY1A6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPWE8MHx8YT49cy5nQShzKQpp
+ZihyKXRocm93IEguYihQLlRFKGEsMCxzLmdBKHMpLG51bGwsbnVsbCkpfSwKcTpmdW5jdGlvbihhLGIp
+e2lmKEgub2soYikpdGhpcy5jUChiKQpyZXR1cm4gdGhpcy4kdGkuYy5hKHRoaXMuVXIoMCxiKSl9LApZ
+OmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNQKGIpCnRoaXMuZTQoMCxiLGMpfSwKZ0E6ZnVuY3Rpb24oYSl7
+dmFyIHM9dGhpcy5hLmxlbmd0aAppZih0eXBlb2Ygcz09PSJudW1iZXIiJiZzPj4+MD09PXMpcmV0dXJu
+IHMKdGhyb3cgSC5iKFAuUFYoIkJhZCBKc0FycmF5IGxlbmd0aCIpKX0sCiRpYlE6MSwKJGljWDoxLAok
+aXpNOjF9ClAuY28ucHJvdG90eXBlPXt9ClAubmQucHJvdG90eXBlPXskaW5kOjF9ClAuS2UucHJvdG90
+eXBlPXsKUDpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG89dGhpcy5hLmdldEF0dHJpYnV0ZSgiY2xhc3Mi
+KSxuPVAuTHModC5OKQppZihvPT1udWxsKXJldHVybiBuCmZvcihzPW8uc3BsaXQoIiAiKSxyPXMubGVu
+Z3RoLHE9MDtxPHI7KytxKXtwPUouVDAoc1txXSkKaWYocC5sZW5ndGghPT0wKW4uaSgwLHApfXJldHVy
+biBufSwKWDpmdW5jdGlvbihhKXt0aGlzLmEuc2V0QXR0cmlidXRlKCJjbGFzcyIsYS5IKDAsIiAiKSl9
+fQpQLmhpLnByb3RvdHlwZT17CmdEOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5LZShhKX0sCnNoZjpm
+dW5jdGlvbihhLGIpe3RoaXMuWUMoYSxiKX0sCnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxw
+LG8sbgppZihkPT1udWxsKXtzPUguVk0oW10sdC52KQpkPW5ldyBXLnZEKHMpCkMuTm0uaShzLFcuVHco
+bnVsbCkpCkMuTm0uaShzLFcuQmwoKSkKQy5ObS5pKHMsbmV3IFcuT3coKSl9Yz1uZXcgVy5LbyhkKQpy
+PSc8c3ZnIHZlcnNpb249IjEuMSI+JytILkVqKGIpKyI8L3N2Zz4iCnM9ZG9jdW1lbnQKcT1zLmJvZHkK
+cS50b1N0cmluZwpwPUMuUlkuQUgocSxyLGMpCm89cy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKcC50
+b1N0cmluZwpzPW5ldyBXLmU3KHApCm49cy5ncjgocykKZm9yKDtzPW4uZmlyc3RDaGlsZCxzIT1udWxs
+OylvLmFwcGVuZENoaWxkKHMpCnJldHVybiBvfSwKbno6ZnVuY3Rpb24oYSxiLGMsZCxlKXt0aHJvdyBI
+LmIoUC5MNCgiQ2Fubm90IGludm9rZSBpbnNlcnRBZGphY2VudEh0bWwgb24gU1ZHLiIpKX0sCmdWbDpm
+dW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuZXUoYSwiY2xpY2siLCExLHQuayl9LAokaWhpOjF9Ck0uSDcu
+cHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ifX0KVS5MTC5wcm90b3R5cGU9ewpM
+dDpmdW5jdGlvbigpe3JldHVybiBQLkVGKFsibm9kZUlkIix0aGlzLmIsImtpbmQiLHRoaXMuYS5hXSx0
+LlgsdC5fKX19ClUuTUQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuZkUuYShhKS5h
+PT09dGhpcy5hLnEoMCwia2luZCIpfSwKJFM6Mzl9ClUuZDIucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24o
+KXt2YXIgcyxyLHEscCxvPXRoaXMsbj10LlgsbT10Ll8sbD1QLkZsKG4sbSksaz1vLmEKaWYoayE9bnVs
+bCl7cz1ILlZNKFtdLHQuRykKZm9yKHI9ay5sZW5ndGgscT0wO3E8ay5sZW5ndGg7ay5sZW5ndGg9PT1y
+fHwoMCxILmxrKShrKSwrK3Epe3A9a1txXQpDLk5tLmkocyxQLkVGKFsiZGVzY3JpcHRpb24iLHAuYSwi
+aHJlZiIscC5iXSxuLG0pKX1sLlkoMCwiZWRpdHMiLHMpfWwuWSgwLCJleHBsYW5hdGlvbiIsby5iKQps
+LlkoMCwibGluZSIsby5jKQpsLlkoMCwiZGlzcGxheVBhdGgiLG8uZCkKbC5ZKDAsInVyaVBhdGgiLG8u
+ZSkKbj1vLmYKaWYobiE9bnVsbCl7bT1ILlZNKFtdLHQuRykKZm9yKGs9bi5sZW5ndGgscT0wO3E8bi5s
+ZW5ndGg7bi5sZW5ndGg9PT1rfHwoMCxILmxrKShuKSwrK3EpQy5ObS5pKG0sbltxXS5MdCgpKQpsLlko
+MCwidHJhY2VzIixtKX1yZXR1cm4gbH19ClUuU2UucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24oKXtyZXR1
+cm4gUC5FRihbImRlc2NyaXB0aW9uIix0aGlzLmEsImhyZWYiLHRoaXMuYl0sdC5YLHQuXyl9fQpVLk1s
+LnByb3RvdHlwZT17Ckx0OmZ1bmN0aW9uKCl7cmV0dXJuIFAuRUYoWyJocmVmIix0aGlzLmEsImxpbmUi
+LHRoaXMuYiwicGF0aCIsdGhpcy5jXSx0LlgsdC5fKX19ClUueUQucHJvdG90eXBlPXsKTHQ6ZnVuY3Rp
+b24oKXt2YXIgcyxyLHEscD1ILlZNKFtdLHQuRykKZm9yKHM9dGhpcy5iLHI9cy5sZW5ndGgscT0wO3E8
+cy5sZW5ndGg7cy5sZW5ndGg9PT1yfHwoMCxILmxrKShzKSwrK3EpQy5ObS5pKHAsc1txXS5MdCgpKQpy
+ZXR1cm4gUC5FRihbImRlc2NyaXB0aW9uIix0aGlzLmEsImVudHJpZXMiLHBdLHQuWCx0Ll8pfX0KVS53
+Yi5wcm90b3R5cGU9ewpMdDpmdW5jdGlvbigpe3ZhciBzLHIscSxwPXRoaXMsbz1QLkZsKHQuWCx0Ll8p
+Cm8uWSgwLCJkZXNjcmlwdGlvbiIscC5hKQpzPXAuYgppZihzIT1udWxsKW8uWSgwLCJmdW5jdGlvbiIs
+cykKcz1wLmMKaWYocyE9bnVsbClvLlkoMCwibGluayIscy5MdCgpKQpzPXAuZAppZihzLmxlbmd0aCE9
+PTApe3I9SC50NihzKQpxPXIuQygibEo8MSxaMDxxVSosTWgqPio+IikKby5ZKDAsImhpbnRBY3Rpb25z
+IixQLkNIKG5ldyBILmxKKHMsci5DKCJaMDxxVSosTWgqPiooMSkiKS5hKG5ldyBVLmIwKCkpLHEpLCEw
+LHEuQygiYUwuRSIpKSl9cmV0dXJuIG99fQpVLmFOLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBVLm56KHQudC5hKGEpKX0sCiRTOjQwfQpVLmIwLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
+e3JldHVybiB0LmFYLmEoYSkuTHQoKX0sCiRTOjQxfQpCLmo4LnByb3RvdHlwZT17Ckx0OmZ1bmN0aW9u
+KCl7cmV0dXJuIFAuRUYoWyJsaW5lIix0aGlzLmEsImV4cGxhbmF0aW9uIix0aGlzLmIsIm9mZnNldCIs
+dGhpcy5jXSx0LlgsdC5fKX19CkIucXAucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24oKXt2YXIgcyxyLHEs
+cCxvLG4sbSxsPXRoaXMsaz10Llgsaj1QLkZsKGssdC5kcCkKZm9yKHM9bC5kLHM9cy5nUHUocykscz1z
+LmdtKHMpLHI9dC5fLHE9dC5HO3MuRigpOyl7cD1zLmdsKCkKbz1wLmEKbj1ILlZNKFtdLHEpCmZvcihw
+PUouSVQocC5iKTtwLkYoKTspe209cC5nbCgpCkMuTm0uaShuLFAuRUYoWyJsaW5lIixtLmEsImV4cGxh
+bmF0aW9uIixtLmIsIm9mZnNldCIsbS5jXSxrLHIpKX1qLlkoMCxvLG4pfXJldHVybiBQLkVGKFsicmVn
+aW9ucyIsbC5hLCJuYXZpZ2F0aW9uQ29udGVudCIsbC5iLCJzb3VyY2VDb2RlIixsLmMsImVkaXRzIixq
+XSxrLHIpfX0KVC5tUS5wcm90b3R5cGU9e30KTC5lLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3Zh
+ciBzLHIscSxwLG8sbixtCnQuYUwuYShhKQpzPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQpyPUwuRzYo
+d2luZG93LmxvY2F0aW9uLmhyZWYpCnE9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKTC5HZSgpCmlm
+KHMhPT0iLyImJnMhPT1KLlQwKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRl
+bnQpKUwuRzcocyxyLHEsITAsbmV3IEwuVlcocyxyLHEpKQpwPWRvY3VtZW50Cm89Si5xRihwLnF1ZXJ5
+U2VsZWN0b3IoIi5hcHBseS1taWdyYXRpb24iKSkKbj1vLiR0aQptPW4uQygifigxKT8iKS5hKG5ldyBM
+Lm9aKCkpCnQuWi5hKG51bGwpClcuSkUoby5hLG8uYixtLCExLG4uYykKbj1KLnFGKHAucXVlcnlTZWxl
+Y3RvcigiLnJlcnVuLW1pZ3JhdGlvbiIpKQptPW4uJHRpClcuSkUobi5hLG4uYixtLkMoIn4oMSk/Iiku
+YShuZXcgTC5IaSgpKSwhMSxtLmMpCm09Si5xRihwLnF1ZXJ5U2VsZWN0b3IoIi5yZXBvcnQtcHJvYmxl
+bSIpKQpuPW0uJHRpClcuSkUobS5hLG0uYixuLkMoIn4oMSk/IikuYShuZXcgTC5CVCgpKSwhMSxuLmMp
+CnA9Si5xRihwLnF1ZXJ5U2VsZWN0b3IoIi5wb3B1cC1wYW5lIC5jbG9zZSIpKQpuPXAuJHRpClcuSkUo
+cC5hLHAuYixuLkMoIn4oMSk/IikuYShuZXcgTC5QWSgpKSwhMSxuLmMpfSwKJFM6MTh9CkwuVlcucHJv
+dG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0sCiRTOjF9Ckwu
+b1oucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAKdC5PLmEoYSkKaWYoSC5vVChD
+Lm9sLnVzKHdpbmRvdywiVGhpcyB3aWxsIGFwcGx5IHRoZSBjaGFuZ2VzIHlvdSd2ZSBwcmV2aWV3ZWQg
+dG8geW91ciB3b3JraW5nIGRpcmVjdG9yeS4gSXQgaXMgcmVjb21tZW5kZWQgeW91IGNvbW1pdCBhbnkg
+Y2hhbmdlcyB5b3UgbWFkZSBiZWZvcmUgZG9pbmcgdGhpcy4iKSkpe3M9TC50eSgiL2FwcGx5LW1pZ3Jh
+dGlvbiIsbnVsbCkuVzcobmV3IEwuanIoKSx0LlApCnI9bmV3IEwucWwoKQp0LmI3LmEobnVsbCkKcT1z
+LiR0aQpwPSQuWDMKaWYocCE9PUMuTlUpcj1QLlZIKHIscCkKcy54ZihuZXcgUC5GZShuZXcgUC52cyhw
+LHEpLDIsbnVsbCxyLHEuQygiQDwxPiIpLktxKHEuYykuQygiRmU8MSwyPiIpKSl9fSwKJFM6Mn0KTC5q
+ci5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcwp0LnQuYShhKQpzPWRvY3VtZW50LmJvZHkK
+cy5jbGFzc0xpc3QucmVtb3ZlKCJwcm9wb3NlZCIpCnMuY2xhc3NMaXN0LmFkZCgiYXBwbGllZCIpfSwK
+JFM6NDR9CkwucWwucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtMLkMyKCJDb3VsZCBub3QgYXBw
+bHkgbWlncmF0aW9uIixhLGIpfSwKJEM6IiQyIiwKJFI6MiwKJFM6MTZ9CkwuSGkucHJvdG90eXBlPXsK
+JDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueG4odC5PLmEoYSkpfSwKeG46ZnVuY3Rpb24oYSl7dmFy
+IHM9MCxyPVAuRlgodC5QKSxxPTEscCxvPVtdLG4sbSxsLGssagp2YXIgJGFzeW5jJCQxPVAubHooZnVu
+Y3Rpb24oYixjKXtpZihiPT09MSl7cD1jCnM9cX13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6cT0z
+CmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgicmVydW5uaW5nIikKcz02CnJldHVybiBQLmpRKEwu
+dHkoIi9yZXJ1bi1taWdyYXRpb24iLG51bGwpLCRhc3luYyQkMSkKY2FzZSA2Om49YwppZihILm9UKEgu
+eTgoSi54OShuLCJzdWNjZXNzIikpKSl3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkKZWxzZSBMLkswKHQu
+bS5hKEoueDkobiwiZXJyb3JzIikpKQpvLnB1c2goNSkKcz00CmJyZWFrCmNhc2UgMzpxPTIKaj1wCm09
+SC5SdShqKQpsPUgudHMoaikKTC5DMigiRmFpbGVkIHRvIHJlcnVuIG1pZ3JhdGlvbiIsbSxsKQpvLnB1
+c2goNSkKcz00CmJyZWFrCmNhc2UgMjpvPVsxXQpjYXNlIDQ6cT0xCmRvY3VtZW50LmJvZHkuY2xhc3NM
+aXN0LnJlbW92ZSgicmVydW5uaW5nIikKcz1vLnBvcCgpCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55Qyhu
+dWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyQkMSxyKX0s
+CiRTOjE5fQpMLkJULnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzCnQuTy5hKGEpCnM9dC5Y
+CkMub2wuUG8od2luZG93LFAuWGQoImh0dHBzIiwiZ2l0aHViLmNvbSIsImRhcnQtbGFuZy9zZGsvaXNz
+dWVzL25ldyIsUC5FRihbInRpdGxlIiwiQ3VzdG9tZXItcmVwb3J0ZWQgaXNzdWUgd2l0aCBOTkJEIG1p
+Z3JhdGlvbiB0b29sIiwibGFiZWxzIix1LmQsImJvZHkiLCIjIyMjIFN0ZXBzIHRvIHJlcHJvZHVjZVxu
+XG4jIyMjIFdoYXQgZGlkIHlvdSBleHBlY3QgdG8gaGFwcGVuP1xuXG4jIyMjIFdoYXQgYWN0dWFsbHkg
+aGFwcGVuZWQ/XG5cbl9TY3JlZW5zaG90cyBhcmUgYXBwcmVjaWF0ZWRfXG5cbioqRGFydCBTREsgdmVy
+c2lvbioqOiAiK0guRWooZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNkay12ZXJzaW9uIikudGV4dENv
+bnRlbnQpKyJcblxuVGhhbmtzIGZvciBmaWxpbmchXG4iXSxzLHMpKS5nbkQoKSwicmVwb3J0LXByb2Js
+ZW0iKX0sCiRTOjJ9CkwuUFkucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMKdC5PLmEoYSkK
+cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucG9wdXAtcGFuZSIpLnN0eWxlCnMuZGlzcGxheT0ibm9u
+ZSIKcmV0dXJuIm5vbmUifSwKJFM6NDZ9CkwuTC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIg
+cyxyLHEKdC5hTC5hKGEpCnM9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCnI9TC5HNih3aW5kb3cubG9j
+YXRpb24uaHJlZikKcT1MLmFLKHdpbmRvdy5sb2NhdGlvbi5ocmVmKQppZihzLmxlbmd0aD4xKUwuRzco
+cyxyLHEsITEsbnVsbCkKZWxzZXtMLkJFKHMsQi53UigpLCEwKQpMLkJYKCImbmJzcDsiLG51bGwpfX0s
+CiRTOjE4fQpMLld4LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPSJjb2xsYXBz
+ZWQiCnQuTy5hKGEpCnM9dGhpcy5hCnI9Si5ZRShzKQpxPXRoaXMuYgppZighci5nRChzKS50ZygwLHAp
+KXtyLmdEKHMpLmkoMCxwKQpKLmRSKHEpLmkoMCxwKX1lbHNle3IuZ0QocykuUigwLHApCkouZFIocSku
+UigwLHApfX0sCiRTOjJ9CkwuQU8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9Si5xRih0
+LmcuYShhKSkscj1zLiR0aSxxPXIuQygifigxKT8iKS5hKG5ldyBMLmROKHRoaXMuYSkpCnQuWi5hKG51
+bGwpClcuSkUocy5hLHMuYixxLCExLHIuYyl9LAokUzozfQpMLmROLnByb3RvdHlwZT17CiQxOmZ1bmN0
+aW9uKGEpe3ZhciBzCnQuTy5hKGEpCnM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGFibGVbZGF0YS1w
+YXRoXSIpCnMudG9TdHJpbmcKTC50MihhLHRoaXMuYSxzLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBX
+LlN5KG5ldyBXLmk3KHMpKS5PKCJwYXRoIikpKX0sCiRTOjJ9CkwuSG8ucHJvdG90eXBlPXsKJDE6ZnVu
+Y3Rpb24oYSl7dmFyIHMscixxCnQuZy5hKGEpCnM9Si5xRihhKQpyPXMuJHRpCnE9ci5DKCJ+KDEpPyIp
+LmEobmV3IEwueHooYSx0aGlzLmEpKQp0LlouYShudWxsKQpXLkpFKHMuYSxzLmIscSwhMSxyLmMpfSwK
+JFM6M30KTC54ei5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcwp0Lk8uYShhKQpzPXRoaXMu
+YQpMLmhYKHRoaXMuYixQLlFBKHMuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTco
+cykpLk8oIm9mZnNldCIpKSxudWxsKSxQLlFBKHMuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3ko
+bmV3IFcuaTcocykpLk8oImxpbmUiKSksbnVsbCkpfSwKJFM6Mn0KTC5JQy5wcm90b3R5cGU9ewokMTpm
+dW5jdGlvbihhKXt2YXIgcz1KLnFGKHQuZy5hKGEpKSxyPXMuJHRpCnIuQygifigxKT8iKS5hKEwuaVMo
+KSkKdC5aLmEobnVsbCkKVy5KRShzLmEscy5iLEwuaVMoKSwhMSxyLmMpfSwKJFM6M30KTC5mQy5wcm90
+b3R5cGU9ewokMTpmdW5jdGlvbihhKXt0LmVRLmEoYSkKdGhpcy5hLmFNKDAsdGhpcy5iKX0sCiRTOjQ4
+fQpMLm5ULnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7TC5Gcih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9
+LAokUzoxfQpMLk5ZLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7TC5Gcih0aGlzLmEsbnVsbCxudWxs
+KX0sCiRTOjF9CkwudWUucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dC5hdy5hKGEpCnJldHVybiBI
+LkVqKGEucSgwLCJzZXZlcml0eSIpKSsiIC0gIitILkVqKGEucSgwLCJtZXNzYWdlIikpKyIgYXQgIitI
+LkVqKGEucSgwLCJsb2NhdGlvbiIpKSsiIC0gKCIrSC5FaihhLnEoMCwiY29kZSIpKSsiKSJ9LAokUzo0
+OX0KTC5lWC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt0LmcuYShhKQokLnpCKCkudG9TdHJpbmcK
+dC5kSC5hKCQub3coKS5xKDAsImhsanMiKSkuVjcoImhpZ2hsaWdodEJsb2NrIixbYV0pfSwKJFM6M30K
+TC5FRS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcyxyCnQuTy5hKGEpLnByZXZlbnREZWZh
+dWx0KCkKcz10aGlzLmEKcj10aGlzLmIKTC5hZih3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUscyxyLCEw
+LG5ldyBMLlFMKHMscikpCkwuaFgodGhpcy5jLHMscil9LAokUzoyfQpMLlFMLnByb3RvdHlwZT17CiQw
+OmZ1bmN0aW9uKCl7TC5Gcih3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsdGhpcy5hLHRoaXMuYil9LAok
+UzoxfQpMLlZTLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHI9InNlbGVjdGVkLWZpbGUi
+CnQuZy5hKGEpCmEudG9TdHJpbmcKcz1KLllFKGEpCmlmKGEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3
+IFcuU3kobmV3IFcuaTcoYSkpLk8oIm5hbWUiKSk9PT10aGlzLmEuYSlzLmdEKGEpLmkoMCxyKQplbHNl
+IHMuZ0QoYSkuUigwLHIpfSwKJFM6M30KTC5URC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1
+cm4gTC50Mih0Lk8uYShhKSwhMCxudWxsKX0sCiRTOjIwfQpMLm0yLnByb3RvdHlwZT17CiQxOmZ1bmN0
+aW9uKGEpe3JldHVybiB0aGlzLlJJKHQuTy5hKGEpKX0sClJJOmZ1bmN0aW9uKGEpe3ZhciBzPTAscj1Q
+LkZYKHQuUCkscT0xLHAsbz1bXSxuPXRoaXMsbSxsLGssaixpLGgsZyxmCnZhciAkYXN5bmMkJDE9UC5s
+eihmdW5jdGlvbihiLGMpe2lmKGI9PT0xKXtwPWMKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2Ug
+MDpxPTMKaT1kb2N1bWVudAptPUMuQ0QuelEoaS5xdWVyeVNlbGVjdG9yKCIuY29udGVudCIpLnNjcm9s
+bFRvcCkKaD10LlgKcz02CnJldHVybiBQLmpRKEwudHkoTC5RNCgiL2FwcGx5LWhpbnQiLFAuRmwoaCxo
+KSksbi5hLkx0KCkpLCRhc3luYyQkMSkKY2FzZSA2Omg9bi5iCmw9TC5VcyhoLmEpCnM9NwpyZXR1cm4g
+UC5qUShMLkc3KGwsbnVsbCxoLmIsITEsbnVsbCksJGFzeW5jJCQxKQpjYXNlIDc6aS5ib2R5LmNsYXNz
+TGlzdC5hZGQoIm5lZWRzLXJlcnVuIikKaT1pLnF1ZXJ5U2VsZWN0b3IoIi5jb250ZW50IikKaS50b1N0
+cmluZwppLnNjcm9sbFRvcD1KLlZ1KG0pCnE9MQpzPTUKYnJlYWsKY2FzZSAzOnE9MgpmPXAKaz1ILlJ1
+KGYpCmo9SC50cyhmKQpMLkMyKCJDb3VsZCBub3QgYXBwbHkgaGludCIsayxqKQpzPTUKYnJlYWsKY2Fz
+ZSAyOnM9MQpicmVhawpjYXNlIDU6cmV0dXJuIFAueUMobnVsbCxyKQpjYXNlIDE6cmV0dXJuIFAuZjMo
+cCxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMkJDEscil9LAokUzoxOX0KTC5YQS5wcm90b3R5cGU9ewpF
+YjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuITB9LAppMDpmdW5jdGlvbihhKXtyZXR1cm4hMH0sCiRpa0Y6
+MX0KTC5aWi5wcm90b3R5cGU9ewpMdDpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPVAuRmwodC5YLHQu
+XykKcS5ZKDAsInR5cGUiLEwudnkoci5hKSkKcS5ZKDAsIm5hbWUiLHIuYikKcz1yLmMKaWYocyE9bnVs
+bClxLlkoMCwic3VidHJlZSIsTC5WRChzKSkKcz1yLmQKaWYocyE9bnVsbClxLlkoMCwicGF0aCIscykK
+cz1yLmUKaWYocyE9bnVsbClxLlkoMCwiaHJlZiIscykKcz1yLmYKaWYocyE9bnVsbClxLlkoMCwiZWRp
+dENvdW50IixzKQpyZXR1cm4gcX19CkwuTzkucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4g
+dGhpcy5ifX0KTS5sSS5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigpe3ZhciBzPUQuYWIoKQpyZXR1cm4g
+c30sCldPOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPXQuZDQKTS5ZRigiYWJzb2x1dGUiLEguVk0oW2Is
+bnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLHEpKQpzPXRoaXMuYQpzPXMuWXIoYik+MCYmIXMu
+aEsoYikKaWYocylyZXR1cm4gYgpyPUguVk0oW3RoaXMuZ2woKSxiLG51bGwsbnVsbCxudWxsLG51bGws
+bnVsbCxudWxsXSxxKQpNLllGKCJqb2luIixyKQpyZXR1cm4gdGhpcy5JUChuZXcgSC51NihyLHQuZUop
+KX0sCnpmOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT1YLkNMKGEsdGhpcy5hKQpxLklWKCkKcz1xLmQKcj1z
+Lmxlbmd0aAppZihyPT09MCl7cz1xLmIKcmV0dXJuIHM9PW51bGw/Ii4iOnN9aWYocj09PTEpe3M9cS5i
+CnJldHVybiBzPT1udWxsPyIuIjpzfWlmKDA+PXIpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpzPXEu
+ZQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnEuSVYoKQpyZXR1cm4gcS53
+KDApfSwKSVA6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGoKdC5RLmEoYSkKZm9yKHM9
+YS4kdGkscj1zLkMoImEyKGNYLkUpIikuYShuZXcgTS5xNygpKSxxPWEuZ20oYSkscz1uZXcgSC5TTyhx
+LHIscy5DKCJTTzxjWC5FPiIpKSxyPXRoaXMuYSxwPSExLG89ITEsbj0iIjtzLkYoKTspe209cS5nbCgp
+CmlmKHIuaEsobSkmJm8pe2w9WC5DTChtLHIpCms9bi5jaGFyQ29kZUF0KDApPT0wP246bgpuPUMueEIu
+TmooaywwLHIuU3AoaywhMCkpCmwuYj1uCmlmKHIuZHMobikpQy5ObS5ZKGwuZSwwLHIuZ21JKCkpCm49
+bC53KDApfWVsc2UgaWYoci5ZcihtKT4wKXtvPSFyLmhLKG0pCm49SC5FaihtKX1lbHNle2o9bS5sZW5n
+dGgKaWYoaiE9PTApe2lmKDA+PWopcmV0dXJuIEguT0gobSwwKQpqPXIuVWQobVswXSl9ZWxzZSBqPSEx
+CmlmKCFqKWlmKHApbis9ci5nbUkoKQpuKz1tfXA9ci5kcyhtKX1yZXR1cm4gbi5jaGFyQ29kZUF0KDAp
+PT0wP246bn0sCm81OmZ1bmN0aW9uKGEpe3ZhciBzCmlmKCF0aGlzLnkzKGEpKXJldHVybiBhCnM9WC5D
+TChhLHRoaXMuYSkKcy5yUigpCnJldHVybiBzLncoMCl9LAp5MzpmdW5jdGlvbihhKXt2YXIgcyxyLHEs
+cCxvLG4sbSxsLGssagphLnRvU3RyaW5nCnM9dGhpcy5hCnI9cy5ZcihhKQppZihyIT09MCl7aWYocz09
+PSQuS2soKSlmb3IocT0wO3E8cjsrK3EpaWYoQy54Qi5XKGEscSk9PT00NylyZXR1cm4hMApwPXIKbz00
+N31lbHNle3A9MApvPW51bGx9Zm9yKG49bmV3IEgucWooYSkuYSxtPW4ubGVuZ3RoLHE9cCxsPW51bGw7
+cTxtOysrcSxsPW8sbz1rKXtrPUMueEIuTzIobixxKQppZihzLnI0KGspKXtpZihzPT09JC5LaygpJiZr
+PT09NDcpcmV0dXJuITAKaWYobyE9bnVsbCYmcy5yNChvKSlyZXR1cm4hMAppZihvPT09NDYpaj1sPT1u
+dWxsfHxsPT09NDZ8fHMucjQobCkKZWxzZSBqPSExCmlmKGopcmV0dXJuITB9fWlmKG89PW51bGwpcmV0
+dXJuITAKaWYocy5yNChvKSlyZXR1cm4hMAppZihvPT09NDYpcz1sPT1udWxsfHxzLnI0KGwpfHxsPT09
+NDYKZWxzZSBzPSExCmlmKHMpcmV0dXJuITAKcmV0dXJuITF9LApIUDpmdW5jdGlvbihhLGIpe3ZhciBz
+LHIscSxwLG8sbixtLGw9dGhpcyxrPSdVbmFibGUgdG8gZmluZCBhIHBhdGggdG8gIicKYj1sLldPKDAs
+YikKcz1sLmEKaWYocy5ZcihiKTw9MCYmcy5ZcihhKT4wKXJldHVybiBsLm81KGEpCmlmKHMuWXIoYSk8
+PTB8fHMuaEsoYSkpYT1sLldPKDAsYSkKaWYocy5ZcihhKTw9MCYmcy5ZcihiKT4wKXRocm93IEguYihY
+Lkk3KGsrSC5FaihhKSsnIiBmcm9tICInK0guRWooYikrJyIuJykpCnI9WC5DTChiLHMpCnIuclIoKQpx
+PVguQ0woYSxzKQpxLnJSKCkKcD1yLmQKbz1wLmxlbmd0aAppZihvIT09MCl7aWYoMD49bylyZXR1cm4g
+SC5PSChwLDApCnA9Si5STShwWzBdLCIuIil9ZWxzZSBwPSExCmlmKHApcmV0dXJuIHEudygwKQpwPXIu
+YgpvPXEuYgppZihwIT1vKXA9cD09bnVsbHx8bz09bnVsbHx8IXMuTmMocCxvKQplbHNlIHA9ITEKaWYo
+cClyZXR1cm4gcS53KDApCndoaWxlKCEwKXtwPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtuPXEuZApt
+PW4ubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkKcD1wWzBdCmlmKDA+PW0p
+cmV0dXJuIEguT0gobiwwKQpuPXMuTmMocCxuWzBdKQpwPW59ZWxzZSBwPSExfWVsc2UgcD0hMQppZigh
+cClicmVhawpDLk5tLlc0KHIuZCwwKQpDLk5tLlc0KHIuZSwxKQpDLk5tLlc0KHEuZCwwKQpDLk5tLlc0
+KHEuZSwxKX1wPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkK
+cD1KLlJNKHBbMF0sIi4uIil9ZWxzZSBwPSExCmlmKHApdGhyb3cgSC5iKFguSTcoaytILkVqKGEpKyci
+IGZyb20gIicrSC5FaihiKSsnIi4nKSkKcD10Lk4KQy5ObS5VRyhxLmQsMCxQLk84KHIuZC5sZW5ndGgs
+Ii4uIiwhMSxwKSkKQy5ObS5ZKHEuZSwwLCIiKQpDLk5tLlVHKHEuZSwxLFAuTzgoci5kLmxlbmd0aCxz
+LmdtSSgpLCExLHApKQpzPXEuZApwPXMubGVuZ3RoCmlmKHA9PT0wKXJldHVybiIuIgppZihwPjEmJkou
+Uk0oQy5ObS5ncloocyksIi4iKSl7cz1xLmQKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkK
+cy5wb3AoKQpzPXEuZQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCmlmKDA+
+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKQy5ObS5pKHMsIiIpfXEuYj0iIgpxLklW
+KCkKcmV0dXJuIHEudygwKX19Ck0ucTcucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEgu
+aChhKSE9PSIifSwKJFM6Nn0KTS5Oby5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtILmsoYSkKcmV0
+dXJuIGE9PW51bGw/Im51bGwiOiciJythKyciJ30sCiRTOjUxfQpCLmZ2LnByb3RvdHlwZT17CnhaOmZ1
+bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5ZcihhKQppZihyPjApcmV0dXJuIEoubGQoYSwwLHIpCmlmKHRo
+aXMuaEsoYSkpe2lmKDA+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsMCkKcz1hWzBdfWVsc2Ugcz1udWxs
+CnJldHVybiBzfSwKTmM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09Yn19ClguV0QucHJvdG90eXBlPXsK
+SVY6ZnVuY3Rpb24oKXt2YXIgcyxyLHE9dGhpcwp3aGlsZSghMCl7cz1xLmQKaWYoIShzLmxlbmd0aCE9
+PTAmJkouUk0oQy5ObS5ncloocyksIiIpKSlicmVhawpzPXEuZAppZigwPj1zLmxlbmd0aClyZXR1cm4g
+SC5PSChzLC0xKQpzLnBvcCgpCnM9cS5lCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMu
+cG9wKCl9cz1xLmUKcj1zLmxlbmd0aAppZihyIT09MClDLk5tLlkocyxyLTEsIiIpfSwKclI6ZnVuY3Rp
+b24oKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9SC5WTShbXSx0LnMpCmZvcihzPW0uZCxyPXMubGVu
+Z3RoLHE9MCxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcCl7bz1zW3Bd
+Cm49Si5pYShvKQppZighKG4uRE4obywiLiIpfHxuLkROKG8sIiIpKSlpZihuLkROKG8sIi4uIikpe249
+bC5sZW5ndGgKaWYobiE9PTApe2lmKDA+PW4pcmV0dXJuIEguT0gobCwtMSkKbC5wb3AoKX1lbHNlICsr
+cX1lbHNlIEMuTm0uaShsLG8pfWlmKG0uYj09bnVsbClDLk5tLlVHKGwsMCxQLk84KHEsIi4uIiwhMSx0
+Lk4pKQppZihsLmxlbmd0aD09PTAmJm0uYj09bnVsbClDLk5tLmkobCwiLiIpCm0uc25KKGwpCnM9bS5h
+Cm0uc1BoKFAuTzgobC5sZW5ndGgrMSxzLmdtSSgpLCEwLHQuTikpCnI9bS5iCmlmKHI9PW51bGx8fGwu
+bGVuZ3RoPT09MHx8IXMuZHMocikpQy5ObS5ZKG0uZSwwLCIiKQpyPW0uYgppZihyIT1udWxsJiZzPT09
+JC5LaygpKXtyLnRvU3RyaW5nCm0uYj1ILnlzKHIsIi8iLCJcXCIpfW0uSVYoKX0sCnc6ZnVuY3Rpb24o
+YSl7dmFyIHMscixxPXRoaXMscD1xLmIKcD1wIT1udWxsP3A6IiIKZm9yKHM9MDtzPHEuZC5sZW5ndGg7
+KytzKXtyPXEuZQppZihzPj1yLmxlbmd0aClyZXR1cm4gSC5PSChyLHMpCnI9cCtILkVqKHJbc10pCnA9
+cS5kCmlmKHM+PXAubGVuZ3RoKXJldHVybiBILk9IKHAscykKcD1yK0guRWoocFtzXSl9cCs9SC5FaihD
+Lk5tLmdyWihxLmUpKQpyZXR1cm4gcC5jaGFyQ29kZUF0KDApPT0wP3A6cH0sCnNuSjpmdW5jdGlvbihh
+KXt0aGlzLmQ9dC5FLmEoYSl9LApzUGg6ZnVuY3Rpb24oYSl7dGhpcy5lPXQuRS5hKGEpfX0KWC5kdi5w
+cm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJQYXRoRXhjZXB0aW9uOiAiK3RoaXMuYX0sCiRp
+Uno6MX0KTy56TC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdvYyh0aGlzKX19
+CkUuT0YucHJvdG90eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIudGcoYSwiLyIpfSwKcjQ6
+ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT00N30sCmRzOmZ1bmN0aW9uKGEpe3ZhciBzPWEubGVuZ3RoCnJl
+dHVybiBzIT09MCYmQy54Qi5PMihhLHMtMSkhPT00N30sClNwOmZ1bmN0aW9uKGEsYil7aWYoYS5sZW5n
+dGghPT0wJiZDLnhCLlcoYSwwKT09PTQ3KXJldHVybiAxCnJldHVybiAwfSwKWXI6ZnVuY3Rpb24oYSl7
+cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSzpmdW5jdGlvbihhKXtyZXR1cm4hMX0sCmdvYzpmdW5jdGlv
+bigpe3JldHVybiJwb3NpeCJ9LApnbUk6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9fQpGLnJ1LnByb3RvdHlw
+ZT17ClVkOmZ1bmN0aW9uKGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0sCnI0OmZ1bmN0aW9uKGEpe3Jl
+dHVybiBhPT09NDd9LApkczpmdW5jdGlvbihhKXt2YXIgcz1hLmxlbmd0aAppZihzPT09MClyZXR1cm4h
+MQppZihDLnhCLk8yKGEscy0xKSE9PTQ3KXJldHVybiEwCnJldHVybiBDLnhCLlRjKGEsIjovLyIpJiZ0
+aGlzLllyKGEpPT09c30sClNwOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbz1hLmxlbmd0aAppZihv
+PT09MClyZXR1cm4gMAppZihDLnhCLlcoYSwwKT09PTQ3KXJldHVybiAxCmZvcihzPTA7czxvOysrcyl7
+cj1DLnhCLlcoYSxzKQppZihyPT09NDcpcmV0dXJuIDAKaWYocj09PTU4KXtpZihzPT09MClyZXR1cm4g
+MApxPUMueEIuWFUoYSwiLyIsQy54Qi5RaShhLCIvLyIscysxKT9zKzM6cykKaWYocTw9MClyZXR1cm4g
+bwppZighYnx8bzxxKzMpcmV0dXJuIHEKaWYoIUMueEIubihhLCJmaWxlOi8vIikpcmV0dXJuIHEKaWYo
+IUIuWXUoYSxxKzEpKXJldHVybiBxCnA9cSszCnJldHVybiBvPT09cD9wOnErNH19cmV0dXJuIDB9LApZ
+cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhLOmZ1bmN0aW9uKGEpe3JldHVybiBh
+Lmxlbmd0aCE9PTAmJkMueEIuVyhhLDApPT09NDd9LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4idXJsIn0s
+CmdtSTpmdW5jdGlvbigpe3JldHVybiIvIn19CkwuSVYucHJvdG90eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7
+cmV0dXJuIEMueEIudGcoYSwiLyIpfSwKcjQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT00N3x8YT09PTky
+fSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHM9YS5sZW5ndGgKaWYocz09PTApcmV0dXJuITEKcz1DLnhCLk8y
+KGEscy0xKQpyZXR1cm4hKHM9PT00N3x8cz09PTkyKX0sClNwOmZ1bmN0aW9uKGEsYil7dmFyIHMscixx
+PWEubGVuZ3RoCmlmKHE9PT0wKXJldHVybiAwCnM9Qy54Qi5XKGEsMCkKaWYocz09PTQ3KXJldHVybiAx
+CmlmKHM9PT05Mil7aWYocTwyfHxDLnhCLlcoYSwxKSE9PTkyKXJldHVybiAxCnI9Qy54Qi5YVShhLCJc
+XCIsMikKaWYocj4wKXtyPUMueEIuWFUoYSwiXFwiLHIrMSkKaWYocj4wKXJldHVybiByfXJldHVybiBx
+fWlmKHE8MylyZXR1cm4gMAppZighQi5PUyhzKSlyZXR1cm4gMAppZihDLnhCLlcoYSwxKSE9PTU4KXJl
+dHVybiAwCnE9Qy54Qi5XKGEsMikKaWYoIShxPT09NDd8fHE9PT05MikpcmV0dXJuIDAKcmV0dXJuIDN9
+LApZcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhLOmZ1bmN0aW9uKGEpe3JldHVy
+biB0aGlzLllyKGEpPT09MX0sCk90OmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYoYT09PWIpcmV0dXJuITAK
+aWYoYT09PTQ3KXJldHVybiBiPT09OTIKaWYoYT09PTkyKXJldHVybiBiPT09NDcKaWYoKGFeYikhPT0z
+MilyZXR1cm4hMQpzPWF8MzIKcmV0dXJuIHM+PTk3JiZzPD0xMjJ9LApOYzpmdW5jdGlvbihhLGIpe3Zh
+ciBzLHIscQppZihhPT1iKXJldHVybiEwCnM9YS5sZW5ndGgKaWYocyE9PWIubGVuZ3RoKXJldHVybiEx
+CmZvcihyPUouclkoYikscT0wO3E8czsrK3EpaWYoIXRoaXMuT3QoQy54Qi5XKGEscSksci5XKGIscSkp
+KXJldHVybiExCnJldHVybiEwfSwKZ29jOmZ1bmN0aW9uKCl7cmV0dXJuIndpbmRvd3MifSwKZ21JOmZ1
+bmN0aW9uKCl7cmV0dXJuIlxcIn19OyhmdW5jdGlvbiBhbGlhc2VzKCl7dmFyIHM9Si52Qi5wcm90b3R5
+cGUKcy5VPXMudwpzLlNqPXMuZTcKcz1KLk1GLnByb3RvdHlwZQpzLnQ9cy53CnM9UC5jWC5wcm90b3R5
+cGUKcy5HRz1zLmV2CnM9UC5NaC5wcm90b3R5cGUKcy54Yj1zLncKcz1XLmN2LnByb3RvdHlwZQpzLkRX
+PXMucjYKcz1XLm02LnByb3RvdHlwZQpzLmpGPXMuRWIKcz1QLkU0LnByb3RvdHlwZQpzLlVyPXMucQpz
+LmU0PXMuWX0pKCk7KGZ1bmN0aW9uIGluc3RhbGxUZWFyT2Zmcygpe3ZhciBzPWh1bmtIZWxwZXJzLl9z
+dGF0aWNfMSxyPWh1bmtIZWxwZXJzLl9zdGF0aWNfMCxxPWh1bmtIZWxwZXJzLmluc3RhbGxJbnN0YW5j
+ZVRlYXJPZmYscD1odW5rSGVscGVycy5pbnN0YWxsU3RhdGljVGVhck9mZixvPWh1bmtIZWxwZXJzLl9p
+bnN0YW5jZV8xdQpzKFAsIkVYIiwiWlYiLDcpCnMoUCwieXQiLCJvQSIsNykKcyhQLCJxVyIsIkJ6Iiw3
+KQpyKFAsIlY5IiwiZU4iLDApCnEoUC5QZi5wcm90b3R5cGUsImdZSiIsMCwxLG51bGwsWyIkMiIsIiQx
+Il0sWyJ3MCIsInBtIl0sMjksMCkKcyhQLCJDeSIsIk5DIiw0KQpzKFAsIlBIIiwiTXQiLDUpCnAoVywi
+cFMiLDQsbnVsbCxbIiQ0Il0sWyJxRCJdLDgsMCkKcChXLCJWNCIsNCxudWxsLFsiJDQiXSxbIlFXIl0s
+OCwwKQpvKFAuQXMucHJvdG90eXBlLCJndU0iLCJUIiw1KQpzKFAsImlHIiwid1kiLDU0KQpzKFAsIncw
+IiwiZFUiLDM2KQpzKEwsImlTIiwiaTYiLDIwKX0pKCk7KGZ1bmN0aW9uIGluaGVyaXRhbmNlKCl7dmFy
+IHM9aHVua0hlbHBlcnMubWl4aW4scj1odW5rSGVscGVycy5pbmhlcml0LHE9aHVua0hlbHBlcnMuaW5o
+ZXJpdE1hbnkKcihQLk1oLG51bGwpCnEoUC5NaCxbSC5GSyxKLnZCLEoubTEsUC5jWCxILkU3LFAuWFMs
+UC5uWSxILmE3LFAuQW4sSC5GdSxILkpCLEguU1UsSC5SZSxILnd2LFAuUG4sSC5XVSxILkxJLEguVHAs
+SC5mOSxILnRlLEguYnEsSC5YTyxILmtyLFAuWWssSC52aCxILk42LEguVlIsSC5FSyxILlBiLEgudFEs
+SC5TZCxILkpjLEguRyxQLlczLFAuaWgsUC5GeSxQLkdWLFAuUGYsUC5GZSxQLnZzLFAuT00sUC5xaCxQ
+Lk1PLFAua1QsUC54SSxQLkN3LFAubTAsUC5wUixQLmJuLFAubG0sUC5sRCxQLktQLFAubGYsUC5XWSxQ
+LlVrLFAuU2gsUC5SdyxQLmJ6LFAuaVAsUC5rNSxQLktZLFAuQ0QsUC5hRSxQLk4zLFAuYzgsUC5aZCxQ
+LlJuLFAuRG4sUC5QRSxQLlVmLFcuaWQsVy5GayxXLkpRLFcuR20sVy52RCxXLm02LFcuT3csVy5XOSxX
+LmRXLFcubWssVy5LbyxQLmlKLFAuRTQsTS5INyxVLkxMLFUuZDIsVS5TZSxVLk1sLFUueUQsVS53YixC
+Lmo4LEIucXAsVC5tUSxMLlhBLEwuWlosTC5POSxNLmxJLE8uekwsWC5XRCxYLmR2XSkKcShKLnZCLFtK
+LnlFLEoud2UsSi5NRixKLmpkLEoucUksSi5EcixILkVULFcuRDAsVy5BeixXLkxlLFcuTmgsVy5hZSxX
+LklCLFcubjcsVy5lYSxXLmJyLFcuU2csVy51OCxXLks3LFcuWFcsUC5oRl0pCnEoSi5NRixbSi5pQyxK
+LmtkLEouYzVdKQpyKEouUG8sSi5qZCkKcShKLnFJLFtKLmJVLEouVkFdKQpxKFAuY1gsW0guQlIsSC5i
+USxILmkxLEguVTUsSC5BTSxILnU2LEguWFIsUC5tVyxILnVuXSkKcShILkJSLFtILlp5LEguUUNdKQpy
+KEgub2wsSC5aeSkKcihILlVxLEguUUMpCnIoSC5qVixILlVxKQpxKFAuWFMsW0gubixILnIzLFAuRXos
+SC5heixILnZWLEguRXEsUC5DNixILmtTLFAuVWQsUC5GLFAudSxQLm1wLFAudWIsUC5kcyxQLmxqLFAu
+VVYsUC5wXSkKcihQLnV5LFAublkpCnEoUC51eSxbSC53MixXLnd6LFcuZTddKQpyKEgucWosSC53MikK
+cShILmJRLFtILmFMLEguTUIsSC5pNV0pCnEoSC5hTCxbSC5uSCxILmxKLFAuaThdKQpyKEgueHksSC5p
+MSkKcShQLkFuLFtILk1ILEguU08sSC5VMV0pCnIoSC5kNSxILkFNKQpyKFAuUlUsUC5QbikKcihQLkdq
+LFAuUlUpCnIoSC5QRCxQLkdqKQpyKEguTFAsSC5XVSkKcShILlRwLFtILkNqLEgubGMsSC5kQyxILndO
+LEguVlgsUC50aCxQLmhhLFAuVnMsUC5GdCxQLnlILFAuV00sUC5TWCxQLkdzLFAuZGEsUC5vUSxQLnBW
+LFAuVTcsUC52cixQLnJ0LFAuS0YsUC5aTCxQLlJULFAualosUC5ycSxQLlJXLFAuQjUsUC51TyxQLnBL
+LFAuaGosUC5WcCxQLk9SLFAucmEsUC55USxQLnBnLFAuYzIsUC50aSxQLldGLFAubjEsUC5jUyxQLlZD
+LFAuSlQsUC5SWixQLk1FLFAueTUsUC5xMyxQLnlJLFAuYzYsUC5xZCxXLkN2LFcuS1MsVy5BMyxXLnZO
+LFcuVXYsVy5FZyxXLkVvLFcuV2ssVy5JQSxXLmZtLFAuamcsUC5UYSxQLkdFLFAuTjcsUC51USxQLlBD
+LFAubXQsUC5OeixQLlFTLFAubnAsVS5NRCxVLmFOLFUuYjAsTC5lLEwuVlcsTC5vWixMLmpyLEwucWws
+TC5IaSxMLkJULEwuUFksTC5MLEwuV3gsTC5BTyxMLmROLEwuSG8sTC54eixMLklDLEwuZkMsTC5uVCxM
+Lk5ZLEwudWUsTC5lWCxMLkVFLEwuUUwsTC5WUyxMLlRELEwubTIsTS5xNyxNLk5vXSkKcihILlcwLFAu
+RXopCnEoSC5sYyxbSC56eCxILnJUXSkKcihILmtZLFAuQzYpCnIoUC5pbCxQLllrKQpxKFAuaWwsW0gu
+TjUsUC51dyxXLmNmLFcuU3ldKQpxKFAubVcsW0guS1csUC5xNF0pCnIoSC5YSCxILkVUKQpxKEguWEgs
+W0guUkcsSC5XQl0pCnIoSC5WUCxILlJHKQpyKEguRGcsSC5WUCkKcihILlpHLEguV0IpCnIoSC5QZyxI
+LlpHKQpxKEguUGcsW0gueGosSC5kRSxILlpBLEguZFQsSC5QcSxILmVFLEguVjZdKQpyKEguaU0sSC5r
+UykKcihQLlpmLFAuUGYpCnIoUC5KaSxQLm0wKQpyKFAuWHYsUC5wUikKcihQLmI2LFAuWHYpCnIoUC5W
+aixQLldZKQpxKFAuVWssW1AuQ1YsUC5aaSxQLmJ5XSkKcihQLndJLFAua1QpCnEoUC53SSxbUC5VOCxQ
+Lm9qLFAuTXgsUC5FMyxQLkdZXSkKcihQLks4LFAuVWQpCnIoUC50dSxQLlNoKQpyKFAudTUsUC5aaSkK
+cShQLnUsW1AuYkosUC5lWV0pCnIoUC5xZSxQLkRuKQpxKFcuRDAsW1cudUgsVy53YSxXLks1LFcuQ21d
+KQpxKFcudUgsW1cuY3YsVy5ueCxXLlFGLFcuQ1FdKQpxKFcuY3YsW1cucUUsUC5oaV0pCnEoVy5xRSxb
+Vy5HaCxXLmZZLFcubkIsVy5RUCxXLmg0LFcuU04sVy5scCxXLlRiLFcuSXYsVy5XUCxXLnlZXSkKcihX
+Lm9KLFcuTGUpCnIoVy5oSCxXLkF6KQpyKFcuVmIsVy5RRikKcihXLmZKLFcud2EpCnEoVy5lYSxbVy53
+NixXLmV3XSkKcihXLkFqLFcudzYpCnIoVy5yQixXLks3KQpyKFcuQkgsVy5yQikKcihXLnc0LFcuSUIp
+CnIoVy5vYSxXLlhXKQpyKFcucmgsVy5vYSkKcihXLmk3LFcuY2YpCnIoUC5BcyxQLlZqKQpxKFAuQXMs
+W1cuSTQsUC5LZV0pCnIoVy5STyxQLnFoKQpyKFcuZXUsVy5STykKcihXLnhDLFAuTU8pCnIoVy5jdCxX
+Lm02KQpyKFAuQmYsUC5pSikKcShQLkU0LFtQLnI3LFAuY29dKQpyKFAuVHosUC5jbykKcihQLm5kLFAu
+aGkpCnIoQi5mdixPLnpMKQpxKEIuZnYsW0UuT0YsRi5ydSxMLklWXSkKcyhILncyLEguUmUpCnMoSC5R
+QyxQLmxEKQpzKEguUkcsUC5sRCkKcyhILlZQLEguU1UpCnMoSC5XQixQLmxEKQpzKEguWkcsSC5TVSkK
+cyhQLm5ZLFAubEQpCnMoUC5XWSxQLmxmKQpzKFAuUlUsUC5LUCkKcyhQLnBSLFAubGYpCnMoVy5MZSxX
+LmlkKQpzKFcuSzcsUC5sRCkKcyhXLnJCLFcuR20pCnMoVy5YVyxQLmxEKQpzKFcub2EsVy5HbSkKcyhQ
+LmNvLFAubEQpfSkoKQp2YXIgdj17dHlwZVVuaXZlcnNlOntlQzpuZXcgTWFwKCksdFI6e30sZVQ6e30s
+dFBWOnt9LHNFQTpbXX0sbWFuZ2xlZEdsb2JhbE5hbWVzOntJZjoiaW50IixDUDoiZG91YmxlIixMWjoi
+bnVtIixxVToiU3RyaW5nIixhMjoiYm9vbCIsYzg6Ik51bGwiLHpNOiJMaXN0In0sbWFuZ2xlZE5hbWVz
+Ont9LGdldFR5cGVGcm9tTmFtZTpnZXRHbG9iYWxGcm9tTmFtZSxtZXRhZGF0YTpbXSx0eXBlczpbIn4o
+KSIsImM4KCkiLCJjOChBaiopIiwiYzgoY3YqKSIsIkAoQCkiLCJxVShxVSkiLCJhMihxVSkiLCJ+KH4o
+KSkiLCJhMihjdixxVSxxVSxKUSkiLCJjOChAKSIsIn4ocVUscVUpIiwifihNaD8sTWg/KSIsIkAoKSIs
+In4ocVUsQCkiLCJ+KG42LHFVLElmKSIsImEyKGtGKSIsImM4KEAsQCkiLCJ+KHh1PHFVPikiLCJjOChl
+YSopIiwiYjg8Yzg+KihBaiopIiwifihBaiopIiwifihxVSxJZikiLCJ+KHFVLHFVPykiLCJuNihJZiki
+LCJuNihALEApIiwifihJZixAKSIsImEyKHVIKSIsImM4KEAsR3opIiwifihlYSkiLCJ+KE1oW0d6P10p
+IiwiYzgoTWgsR3opIiwifih1SCx1SD8pIiwifihALEApIiwidnM8QD4oQCkiLCJhMih4dTxxVT4pIiwi
+QChxVSkiLCJNaD8oQCkiLCJUejxAPihAKSIsIkU0KEApIiwiYTIqKEg3KikiLCJMTCooQCkiLCJaMDxx
+VSosTWgqPiooTEwqKSIsIkAoQCxxVSkiLCJ+KEdELEApIiwiYzgoWjA8cVUqLE1oKj4qKSIsIlowPHFV
+LHFVPihaMDxxVSxxVT4scVUpIiwicVUqKEFqKikiLCJ+KEApIiwiYzgoZXcqKSIsInFVKihaMDxALEA+
+KikiLCJ+KHFVW0BdKSIsInFVKHFVPykiLCJJZihJZixJZikiLCJjOCh+KCkpIiwiTWg/KE1oPykiLCJy
+NyhAKSJdLGludGVyY2VwdG9yc0J5VGFnOm51bGwsbGVhZlRhZ3M6bnVsbCxhcnJheVJ0aTp0eXBlb2Yg
+U3ltYm9sPT0iZnVuY3Rpb24iJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiP1N5bWJvbCgiJHRpIik6
+IiR0aSJ9CkgueGIodi50eXBlVW5pdmVyc2UsSlNPTi5wYXJzZSgneyJjNSI6Ik1GIiwiaUMiOiJNRiIs
+ImtkIjoiTUYiLCJyeCI6ImVhIiwiZTUiOiJlYSIsIlkwIjoiaGkiLCJ0cCI6ImhpIiwiRzgiOiJldyIs
+Ik1yIjoicUUiLCJlTCI6InFFIiwiSTAiOiJ1SCIsImhzIjoidUgiLCJYZyI6IlFGIiwibnIiOiJBaiIs
+Ink0IjoidzYiLCJhUCI6IkNtIiwieGMiOiJueCIsImtKIjoibngiLCJ6VSI6IkRnIiwiZGYiOiJFVCIs
+InlFIjp7ImEyIjpbXX0sIndlIjp7ImM4IjpbXX0sIk1GIjp7InZtIjpbXSwiRUgiOltdfSwiamQiOnsi
+ek0iOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sIlBvIjp7ImpkIjpbIjEiXSwiek0iOlsiMSJd
+LCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sIm0xIjp7IkFuIjpbIjEiXX0sInFJIjp7IkNQIjpbXSwiTFoi
+OltdfSwiYlUiOnsiQ1AiOltdLCJJZiI6W10sIkxaIjpbXX0sIlZBIjp7IkNQIjpbXSwiTFoiOltdfSwi
+RHIiOnsicVUiOltdLCJ2WCI6W119LCJCUiI6eyJjWCI6WyIyIl19LCJFNyI6eyJBbiI6WyIyIl19LCJa
+eSI6eyJCUiI6WyIxIiwiMiJdLCJjWCI6WyIyIl0sImNYLkUiOiIyIn0sIm9sIjp7Ilp5IjpbIjEiLCIy
+Il0sIkJSIjpbIjEiLCIyIl0sImJRIjpbIjIiXSwiY1giOlsiMiJdLCJjWC5FIjoiMiJ9LCJVcSI6eyJs
+RCI6WyIyIl0sInpNIjpbIjIiXSwiQlIiOlsiMSIsIjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl19LCJq
+ViI6eyJVcSI6WyIxIiwiMiJdLCJsRCI6WyIyIl0sInpNIjpbIjIiXSwiQlIiOlsiMSIsIjIiXSwiYlEi
+OlsiMiJdLCJjWCI6WyIyIl0sImxELkUiOiIyIiwiY1guRSI6IjIifSwibiI6eyJYUyI6W119LCJyMyI6
+eyJYUyI6W119LCJxaiI6eyJsRCI6WyJJZiJdLCJSZSI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJiUSI6WyJJ
+ZiJdLCJjWCI6WyJJZiJdLCJsRC5FIjoiSWYiLCJSZS5FIjoiSWYifSwiYlEiOnsiY1giOlsiMSJdfSwi
+YUwiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJuSCI6eyJhTCI6WyIxIl0sImJRIjpbIjEiXSwiY1gi
+OlsiMSJdLCJhTC5FIjoiMSIsImNYLkUiOiIxIn0sImE3Ijp7IkFuIjpbIjEiXX0sImkxIjp7ImNYIjpb
+IjIiXSwiY1guRSI6IjIifSwieHkiOnsiaTEiOlsiMSIsIjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl0s
+ImNYLkUiOiIyIn0sIk1IIjp7IkFuIjpbIjIiXX0sImxKIjp7ImFMIjpbIjIiXSwiYlEiOlsiMiJdLCJj
+WCI6WyIyIl0sImFMLkUiOiIyIiwiY1guRSI6IjIifSwiVTUiOnsiY1giOlsiMSJdLCJjWC5FIjoiMSJ9
+LCJTTyI6eyJBbiI6WyIxIl19LCJBTSI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sImQ1Ijp7IkFNIjpb
+IjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIlUxIjp7IkFuIjpbIjEiXX0sIk1C
+Ijp7ImJRIjpbIjEiXSwiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJGdSI6eyJBbiI6WyIxIl19LCJ1NiI6
+eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkpCIjp7IkFuIjpbIjEiXX0sIncyIjp7ImxEIjpbIjEiXSwi
+UmUiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwid3YiOnsiR0QiOltdfSwi
+UEQiOnsiR2oiOlsiMSIsIjIiXSwiUlUiOlsiMSIsIjIiXSwiUG4iOlsiMSIsIjIiXSwiS1AiOlsiMSIs
+IjIiXSwiWjAiOlsiMSIsIjIiXX0sIldVIjp7IlowIjpbIjEiLCIyIl19LCJMUCI6eyJXVSI6WyIxIiwi
+MiJdLCJaMCI6WyIxIiwiMiJdfSwiWFIiOnsiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJMSSI6eyJ2USI6
+W119LCJXMCI6eyJYUyI6W119LCJheiI6eyJYUyI6W119LCJ2ViI6eyJYUyI6W119LCJ0ZSI6eyJSeiI6
+W119LCJYTyI6eyJHeiI6W119LCJUcCI6eyJFSCI6W119LCJsYyI6eyJFSCI6W119LCJ6eCI6eyJFSCI6
+W119LCJyVCI6eyJFSCI6W119LCJFcSI6eyJYUyI6W119LCJrWSI6eyJYUyI6W119LCJONSI6eyJZayI6
+WyIxIiwiMiJdLCJGbyI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdLCJZay5LIjoiMSIsIllrLlYiOiIy
+In0sImk1Ijp7ImJRIjpbIjEiXSwiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJONiI6eyJBbiI6WyIxIl19
+LCJWUiI6eyJ3TCI6W10sInZYIjpbXX0sIkVLIjp7ImliIjpbXSwiT2QiOltdfSwiS1ciOnsiY1giOlsi
+aWIiXSwiY1guRSI6ImliIn0sIlBiIjp7IkFuIjpbImliIl19LCJ0USI6eyJPZCI6W119LCJ1biI6eyJj
+WCI6WyJPZCJdLCJjWC5FIjoiT2QifSwiU2QiOnsiQW4iOlsiT2QiXX0sIkVUIjp7IkFTIjpbXX0sIlhI
+Ijp7IlhqIjpbIjEiXSwiRVQiOltdLCJBUyI6W119LCJEZyI6eyJsRCI6WyJDUCJdLCJYaiI6WyJDUCJd
+LCJ6TSI6WyJDUCJdLCJFVCI6W10sImJRIjpbIkNQIl0sIkFTIjpbXSwiY1giOlsiQ1AiXSwiU1UiOlsi
+Q1AiXSwibEQuRSI6IkNQIn0sIlBnIjp7ImxEIjpbIklmIl0sIlhqIjpbIklmIl0sInpNIjpbIklmIl0s
+IkVUIjpbXSwiYlEiOlsiSWYiXSwiQVMiOltdLCJjWCI6WyJJZiJdLCJTVSI6WyJJZiJdfSwieGoiOnsi
+bEQiOlsiSWYiXSwiWGoiOlsiSWYiXSwiek0iOlsiSWYiXSwiRVQiOltdLCJiUSI6WyJJZiJdLCJBUyI6
+W10sImNYIjpbIklmIl0sIlNVIjpbIklmIl0sImxELkUiOiJJZiJ9LCJkRSI6eyJsRCI6WyJJZiJdLCJY
+aiI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJFVCI6W10sImJRIjpbIklmIl0sIkFTIjpbXSwiY1giOlsiSWYi
+XSwiU1UiOlsiSWYiXSwibEQuRSI6IklmIn0sIlpBIjp7ImxEIjpbIklmIl0sIlhqIjpbIklmIl0sInpN
+IjpbIklmIl0sIkVUIjpbXSwiYlEiOlsiSWYiXSwiQVMiOltdLCJjWCI6WyJJZiJdLCJTVSI6WyJJZiJd
+LCJsRC5FIjoiSWYifSwiZFQiOnsibEQiOlsiSWYiXSwiWGoiOlsiSWYiXSwiek0iOlsiSWYiXSwiRVQi
+OltdLCJiUSI6WyJJZiJdLCJBUyI6W10sImNYIjpbIklmIl0sIlNVIjpbIklmIl0sImxELkUiOiJJZiJ9
+LCJQcSI6eyJsRCI6WyJJZiJdLCJYaiI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJFVCI6W10sImJRIjpbIklm
+Il0sIkFTIjpbXSwiY1giOlsiSWYiXSwiU1UiOlsiSWYiXSwibEQuRSI6IklmIn0sImVFIjp7ImxEIjpb
+IklmIl0sIlhqIjpbIklmIl0sInpNIjpbIklmIl0sIkVUIjpbXSwiYlEiOlsiSWYiXSwiQVMiOltdLCJj
+WCI6WyJJZiJdLCJTVSI6WyJJZiJdLCJsRC5FIjoiSWYifSwiVjYiOnsibEQiOlsiSWYiXSwibjYiOltd
+LCJYaiI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJFVCI6W10sImJRIjpbIklmIl0sIkFTIjpbXSwiY1giOlsi
+SWYiXSwiU1UiOlsiSWYiXSwibEQuRSI6IklmIn0sImtTIjp7IlhTIjpbXX0sImlNIjp7IlhTIjpbXX0s
+IkdWIjp7IkFuIjpbIjEiXX0sInE0Ijp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiWmYiOnsiUGYiOlsi
+MSJdfSwidnMiOnsiYjgiOlsiMSJdfSwiQ3ciOnsiWFMiOltdfSwibTAiOnsiUW0iOltdfSwiSmkiOnsi
+bTAiOltdLCJRbSI6W119LCJiNiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6
+WyIxIl0sImxmLkUiOiIxIn0sImxtIjp7IkFuIjpbIjEiXX0sIm1XIjp7ImNYIjpbIjEiXX0sInV5Ijp7
+ImxEIjpbIjEiXSwiek0iOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sImlsIjp7IllrIjpbIjEi
+LCIyIl0sIlowIjpbIjEiLCIyIl19LCJZayI6eyJaMCI6WyIxIiwiMiJdfSwiUG4iOnsiWjAiOlsiMSIs
+IjIiXX0sIkdqIjp7IlJVIjpbIjEiLCIyIl0sIlBuIjpbIjEiLCIyIl0sIktQIjpbIjEiLCIyIl0sIlow
+IjpbIjEiLCIyIl19LCJWaiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIx
+Il19LCJYdiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ1dyI6
+eyJZayI6WyJxVSIsIkAiXSwiWjAiOlsicVUiLCJAIl0sIllrLksiOiJxVSIsIllrLlYiOiJAIn0sImk4
+Ijp7ImFMIjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl0sImFMLkUiOiJxVSIsImNYLkUiOiJx
+VSJ9LCJDViI6eyJVayI6WyJ6TTxJZj4iLCJxVSJdLCJVay5TIjoiek08SWY+In0sIlU4Ijp7IndJIjpb
+InpNPElmPiIsInFVIl19LCJaaSI6eyJVayI6WyJxVSIsInpNPElmPiJdfSwiVWQiOnsiWFMiOltdfSwi
+SzgiOnsiWFMiOltdfSwiYnkiOnsiVWsiOlsiTWg/IiwicVUiXSwiVWsuUyI6Ik1oPyJ9LCJvaiI6eyJ3
+SSI6WyJNaD8iLCJxVSJdfSwiTXgiOnsid0kiOlsicVUiLCJNaD8iXX0sInU1Ijp7IlVrIjpbInFVIiwi
+ek08SWY+Il0sIlVrLlMiOiJxVSJ9LCJFMyI6eyJ3SSI6WyJxVSIsInpNPElmPiJdfSwiR1kiOnsid0ki
+Olsiek08SWY+IiwicVUiXX0sIkNQIjp7IkxaIjpbXX0sIklmIjp7IkxaIjpbXX0sInpNIjp7ImJRIjpb
+IjEiXSwiY1giOlsiMSJdfSwiaWIiOnsiT2QiOltdfSwieHUiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl19
+LCJxVSI6eyJ2WCI6W119LCJDNiI6eyJYUyI6W119LCJFeiI6eyJYUyI6W119LCJGIjp7IlhTIjpbXX0s
+InUiOnsiWFMiOltdfSwiYkoiOnsiWFMiOltdfSwiZVkiOnsiWFMiOltdfSwibXAiOnsiWFMiOltdfSwi
+dWIiOnsiWFMiOltdfSwiZHMiOnsiWFMiOltdfSwibGoiOnsiWFMiOltdfSwiVVYiOnsiWFMiOltdfSwi
+azUiOnsiWFMiOltdfSwiS1kiOnsiWFMiOltdfSwicCI6eyJYUyI6W119LCJDRCI6eyJSeiI6W119LCJh
+RSI6eyJSeiI6W119LCJaZCI6eyJHeiI6W119LCJSbiI6eyJCTCI6W119LCJEbiI6eyJpRCI6W119LCJV
+ZiI6eyJpRCI6W119LCJxZSI6eyJpRCI6W119LCJxRSI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwi
+R2giOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sImZZIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119
+LCJuQiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiUVAiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpb
+XX0sIm54Ijp7InVIIjpbXSwiRDAiOltdfSwiUUYiOnsidUgiOltdLCJEMCI6W119LCJJQiI6eyJ0biI6
+WyJMWiJdfSwid3oiOnsibEQiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdLCJs
+RC5FIjoiMSJ9LCJjdiI6eyJ1SCI6W10sIkQwIjpbXX0sImhIIjp7IkF6IjpbXX0sImg0Ijp7ImN2Ijpb
+XSwidUgiOltdLCJEMCI6W119LCJWYiI6eyJ1SCI6W10sIkQwIjpbXX0sImZKIjp7IkQwIjpbXX0sIndh
+Ijp7IkQwIjpbXX0sIkFqIjp7ImVhIjpbXX0sImU3Ijp7ImxEIjpbInVIIl0sInpNIjpbInVIIl0sImJR
+IjpbInVIIl0sImNYIjpbInVIIl0sImxELkUiOiJ1SCJ9LCJ1SCI6eyJEMCI6W119LCJCSCI6eyJsRCI6
+WyJ1SCJdLCJHbSI6WyJ1SCJdLCJ6TSI6WyJ1SCJdLCJYaiI6WyJ1SCJdLCJiUSI6WyJ1SCJdLCJjWCI6
+WyJ1SCJdLCJsRC5FIjoidUgiLCJHbS5FIjoidUgifSwiU04iOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpb
+XX0sImV3Ijp7ImVhIjpbXX0sImxwIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJUYiI6eyJjdiI6
+W10sInVIIjpbXSwiRDAiOltdfSwiSXYiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIldQIjp7ImN2
+IjpbXSwidUgiOltdLCJEMCI6W119LCJ5WSI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwidzYiOnsi
+ZWEiOltdfSwiSzUiOnsidjYiOltdLCJEMCI6W119LCJDbSI6eyJEMCI6W119LCJDUSI6eyJ1SCI6W10s
+IkQwIjpbXX0sInc0Ijp7InRuIjpbIkxaIl19LCJyaCI6eyJsRCI6WyJ1SCJdLCJHbSI6WyJ1SCJdLCJ6
+TSI6WyJ1SCJdLCJYaiI6WyJ1SCJdLCJiUSI6WyJ1SCJdLCJjWCI6WyJ1SCJdLCJsRC5FIjoidUgiLCJH
+bS5FIjoidUgifSwiY2YiOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJxVSIsInFVIl19LCJpNyI6eyJZ
+ayI6WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXSwiWWsuSyI6InFVIiwiWWsuViI6InFVIn0sIlN5
+Ijp7IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdLCJZay5LIjoicVUiLCJZay5WIjoicVUi
+fSwiSTQiOnsibGYiOlsicVUiXSwieHUiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUiXSwibGYu
+RSI6InFVIn0sIlJPIjp7InFoIjpbIjEiXX0sImV1Ijp7IlJPIjpbIjEiXSwicWgiOlsiMSJdfSwieEMi
+OnsiTU8iOlsiMSJdfSwiSlEiOnsia0YiOltdfSwidkQiOnsia0YiOltdfSwibTYiOnsia0YiOltdfSwi
+Y3QiOnsia0YiOltdfSwiT3ciOnsia0YiOltdfSwiVzkiOnsiQW4iOlsiMSJdfSwiZFciOnsidjYiOltd
+LCJEMCI6W119LCJtayI6eyJ5MCI6W119LCJLbyI6eyJvbiI6W119LCJBcyI6eyJsZiI6WyJxVSJdLCJ4
+dSI6WyJxVSJdLCJiUSI6WyJxVSJdLCJjWCI6WyJxVSJdfSwicjciOnsiRTQiOltdfSwiVHoiOnsibEQi
+OlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiRTQiOltdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0s
+Im5kIjp7ImhpIjpbXSwiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIktlIjp7ImxmIjpbInFVIl0sInh1
+IjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl0sImxmLkUiOiJxVSJ9LCJoaSI6eyJjdiI6W10s
+InVIIjpbXSwiRDAiOltdfSwiWEEiOnsia0YiOltdfSwiZHYiOnsiUnoiOltdfSwiT0YiOnsiZnYiOltd
+fSwicnUiOnsiZnYiOltdfSwiSVYiOnsiZnYiOltdfSwibjYiOnsiek0iOlsiSWYiXSwiYlEiOlsiSWYi
+XSwiY1giOlsiSWYiXSwiQVMiOltdfX0nKSkKSC5GRih2LnR5cGVVbml2ZXJzZSxKU09OLnBhcnNlKCd7
+IncyIjoxLCJRQyI6MiwiWEgiOjEsImtUIjoyLCJtVyI6MSwidXkiOjEsImlsIjoyLCJWaiI6MSwiWHYi
+OjEsIm5ZIjoxLCJXWSI6MSwicFIiOjEsImNvIjoxfScpKQp2YXIgdT17bDoiQ2Fubm90IGV4dHJhY3Qg
+YSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQgY29tcG9uZW50IixpOiJDYW5ub3Qg
+ZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBxdWVyeSBjb21wb25lbnQiLGo6IkNh
+bm5vdCBleHRyYWN0IGEgbm9uLVdpbmRvd3MgZmlsZSBwYXRoIGZyb20gYSBmaWxlIFVSSSB3aXRoIGFu
+IGF1dGhvcml0eSIsZzoiYG51bGxgIGVuY291bnRlcmVkIGFzIHRoZSByZXN1bHQgZnJvbSBleHByZXNz
+aW9uIHdpdGggdHlwZSBgTmV2ZXJgLiIsZDoiYXJlYS1hbmFseXplcixhbmFseXplci1ubmJkLW1pZ3Jh
+dGlvbix0eXBlLWJ1ZyJ9CnZhciB0PShmdW5jdGlvbiBydGlpKCl7dmFyIHM9SC5OMApyZXR1cm57bjpz
+KCJDdyIpLGNSOnMoIm5CIiksdzpzKCJBeiIpLHA6cygiUVAiKSxnRjpzKCJQRDxHRCxAPiIpLGI6cygi
+YlE8QD4iKSxoOnMoImN2IikscjpzKCJYUyIpLEI6cygiZWEiKSxhUzpzKCJEMCIpLGc4OnMoIlJ6Iiks
+Yzg6cygiaEgiKSxZOnMoIkVIIiksZDpzKCJiODxAPiIpLEk6cygiU2ciKSxvOnMoInZRIiksZWg6cygi
+Y1g8dUg+IiksUTpzKCJjWDxxVT4iKSx1OnMoImNYPEA+IiksdjpzKCJqZDxrRj4iKSxzOnMoImpkPHFV
+PiIpLHg6cygiamQ8QD4iKSxhOnMoImpkPElmPiIpLGQ3OnMoImpkPFNlKj4iKSxoNDpzKCJqZDxqOCo+
+IiksRzpzKCJqZDxaMDxxVSosTWgqPio+IiksY1E6cygiamQ8WloqPiIpLGk6cygiamQ8cVUqPiIpLGFB
+OnMoImpkPHlEKj4iKSxhSjpzKCJqZDx3Yio+IiksVjpzKCJqZDxJZio+IiksZDQ6cygiamQ8cVU/PiIp
+LFQ6cygid2UiKSxlSDpzKCJ2bSIpLEQ6cygiYzUiKSxhVTpzKCJYajxAPiIpLGFtOnMoIlR6PEA+Iiks
+ZW86cygiTjU8R0QsQD4iKSxkejpzKCJoRiIpLEU6cygiek08cVU+IiksajpzKCJ6TTxAPiIpLEw6cygi
+ek08SWY+IiksSjpzKCJaMDxxVSxxVT4iKSxmOnMoIlowPEAsQD4iKSxkbzpzKCJsSjxxVSxAPiIpLGZq
+OnMoImxKPHFVKixxVT4iKSxkRTpzKCJFVCIpLGJtOnMoIlY2IiksQTpzKCJ1SCIpLGY2OnMoImtGIiks
+UDpzKCJjOCIpLEs6cygiTWgiKSxxOnMoInRuPExaPiIpLGZ2OnMoIndMIiksZXc6cygibmQiKSxDOnMo
+Inh1PHFVPiIpLGw6cygiR3oiKSxOOnMoInFVIiksZDA6cygicVUocVUqKSIpLGc3OnMoImhpIiksZm86
+cygiR0QiKSxhVzpzKCJ5WSIpLGFrOnMoIkFTIiksZ2M6cygibjYiKSxiSjpzKCJrZCIpLGR3OnMoIkdq
+PHFVLHFVPiIpLGREOnMoImlEIiksZUo6cygidTY8cVU+IiksZzQ6cygiSzUiKSxjaTpzKCJ2NiIpLGcy
+OnMoIkNtIiksYkM6cygiWmY8ZkoqPiIpLGg5OnMoIkNRIiksYWM6cygiZTciKSxrOnMoImV1PEFqKj4i
+KSxXOnMoInd6PGN2Kj4iKSxjOnMoInZzPEA+IiksZko6cygidnM8SWY+IiksZ1Y6cygidnM8ZkoqPiIp
+LGNyOnMoIkpRIikseTpzKCJhMiIpLGFsOnMoImEyKE1oKSIpLGdSOnMoIkNQIiksejpzKCJAIiksZk86
+cygiQCgpIiksYkk6cygiQChNaCkiKSxhZzpzKCJAKE1oLEd6KSIpLGJVOnMoIkAoeHU8cVU+KSIpLGRP
+OnMoIkAocVUpIiksYjg6cygiQChALEApIiksUzpzKCJJZiIpLGRkOnMoIkdoKiIpLGc6cygiY3YqIiks
+YUw6cygiZWEqIiksYVg6cygiTEwqIiksZkU6cygiSDcqIiksVTpzKCJjWDxAPioiKSxkSDpzKCJFNCoi
+KSxmSzpzKCJ6TTxAPioiKSxkXzpzKCJ6TTxqOCo+KiIpLGRwOnMoInpNPFowPHFVKixNaCo+Kj4qIiks
+bTpzKCJ6TTxNaCo+KiIpLGF3OnMoIlowPEAsQD4qIiksdDpzKCJaMDxxVSosTWgqPioiKSxPOnMoIkFq
+KiIpLGNGOnMoIjAmKiIpLF86cygiTWgqIiksZVE6cygiZXcqIiksWDpzKCJxVSoiKSxjaDpzKCJEMD8i
+KSxiRzpzKCJiODxjOD4/IiksYms6cygiek08cVU+PyIpLGJNOnMoInpNPEA+PyIpLGNaOnMoIlowPHFV
+LHFVPj8iKSxjOTpzKCJaMDxxVSxAPj8iKSxSOnMoIk1oPyIpLEY6cygiRmU8QCxAPj8iKSxlOnMoImJu
+PyIpLGI3OnMoImEyKE1oKT8iKSxidzpzKCJAKGVhKT8iKSxmVjpzKCJNaD8oTWg/LE1oPyk/IiksZEE6
+cygiTWg/KEApPyIpLFo6cygifigpPyIpLGViOnMoIn4oZXcqKT8iKSxkaTpzKCJMWiIpLEg6cygifiIp
+LE06cygifigpIiksZUE6cygifihxVSxxVSkiKSxjQTpzKCJ+KHFVLEApIil9fSkoKTsoZnVuY3Rpb24g
+Y29uc3RhbnRzKCl7dmFyIHM9aHVua0hlbHBlcnMubWFrZUNvbnN0TGlzdApDLnhuPVcuR2gucHJvdG90
+eXBlCkMuUlk9Vy5RUC5wcm90b3R5cGUKQy5tSD1XLmFlLnByb3RvdHlwZQpDLkJaPVcuVmIucHJvdG90
+eXBlCkMuRHQ9Vy5mSi5wcm90b3R5cGUKQy5Paz1KLnZCLnByb3RvdHlwZQpDLk5tPUouamQucHJvdG90
+eXBlCkMuam49Si5iVS5wcm90b3R5cGUKQy5qTj1KLndlLnByb3RvdHlwZQpDLkNEPUoucUkucHJvdG90
+eXBlCkMueEI9Si5Eci5wcm90b3R5cGUKQy5ERz1KLmM1LnByb3RvdHlwZQpDLkV4PVcudTgucHJvdG90
+eXBlCkMuTkE9SC5WNi5wcm90b3R5cGUKQy50NT1XLkJILnByb3RvdHlwZQpDLkx0PVcuU04ucHJvdG90
+eXBlCkMuWlE9Si5pQy5wcm90b3R5cGUKQy5JZT1XLlRiLnByb3RvdHlwZQpDLnZCPUoua2QucHJvdG90
+eXBlCkMub2w9Vy5LNS5wcm90b3R5cGUKQy55OD1uZXcgUC5VOCgpCkMuaDk9bmV3IFAuQ1YoKQpDLkd3
+PW5ldyBILkZ1KEguTjAoIkZ1PGM4PiIpKQpDLk80PWZ1bmN0aW9uIGdldFRhZ0ZhbGxiYWNrKG8pIHsK
+ICB2YXIgcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTsKICByZXR1cm4gcy5zdWJz
+dHJpbmcoOCwgcy5sZW5ndGggLSAxKTsKfQpDLllxPWZ1bmN0aW9uKCkgewogIHZhciB0b1N0cmluZ0Z1
+bmN0aW9uID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICBmdW5jdGlvbiBnZXRUYWcobykgewog
+ICAgdmFyIHMgPSB0b1N0cmluZ0Z1bmN0aW9uLmNhbGwobyk7CiAgICByZXR1cm4gcy5zdWJzdHJpbmco
+OCwgcy5sZW5ndGggLSAxKTsKICB9CiAgZnVuY3Rpb24gZ2V0VW5rbm93blRhZyhvYmplY3QsIHRhZykg
+ewogICAgaWYgKC9eSFRNTFtBLVpdLipFbGVtZW50JC8udGVzdCh0YWcpKSB7CiAgICAgIHZhciBuYW1l
+ID0gdG9TdHJpbmdGdW5jdGlvbi5jYWxsKG9iamVjdCk7CiAgICAgIGlmIChuYW1lID09ICJbb2JqZWN0
+IE9iamVjdF0iKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuICJIVE1MRWxlbWVudCI7CiAgICB9CiAg
+fQogIGZ1bmN0aW9uIGdldFVua25vd25UYWdHZW5lcmljQnJvd3NlcihvYmplY3QsIHRhZykgewogICAg
+aWYgKHNlbGYuSFRNTEVsZW1lbnQgJiYgb2JqZWN0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHJldHVy
+biAiSFRNTEVsZW1lbnQiOwogICAgcmV0dXJuIGdldFVua25vd25UYWcob2JqZWN0LCB0YWcpOwogIH0K
+ICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWcodGFnKSB7CiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAi
+dW5kZWZpbmVkIikgcmV0dXJuIG51bGw7CiAgICBpZiAodHlwZW9mIHdpbmRvd1t0YWddID09ICJ1bmRl
+ZmluZWQiKSByZXR1cm4gbnVsbDsKICAgIHZhciBjb25zdHJ1Y3RvciA9IHdpbmRvd1t0YWddOwogICAg
+aWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPSAiZnVuY3Rpb24iKSByZXR1cm4gbnVsbDsKICAgIHJldHVy
+biBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgfQogIGZ1bmN0aW9uIGRpc2NyaW1pbmF0b3IodGFnKSB7
+IHJldHVybiBudWxsOyB9CiAgdmFyIGlzQnJvd3NlciA9IHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVj
+dCI7CiAgcmV0dXJuIHsKICAgIGdldFRhZzogZ2V0VGFnLAogICAgZ2V0VW5rbm93blRhZzogaXNCcm93
+c2VyID8gZ2V0VW5rbm93blRhZ0dlbmVyaWNCcm93c2VyIDogZ2V0VW5rbm93blRhZywKICAgIHByb3Rv
+dHlwZUZvclRhZzogcHJvdG90eXBlRm9yVGFnLAogICAgZGlzY3JpbWluYXRvcjogZGlzY3JpbWluYXRv
+ciB9Owp9CkMud2I9ZnVuY3Rpb24oZ2V0VGFnRmFsbGJhY2spIHsKICByZXR1cm4gZnVuY3Rpb24oaG9v
+a3MpIHsKICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9ICJvYmplY3QiKSByZXR1cm4gaG9va3M7CiAg
+ICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgaWYgKHVhLmluZGV4T2YoIkR1bXBSZW5k
+ZXJUcmVlIikgPj0gMCkgcmV0dXJuIGhvb2tzOwogICAgaWYgKHVhLmluZGV4T2YoIkNocm9tZSIpID49
+IDApIHsKICAgICAgZnVuY3Rpb24gY29uZmlybShwKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB3aW5k
+b3cgPT0gIm9iamVjdCIgJiYgd2luZG93W3BdICYmIHdpbmRvd1twXS5uYW1lID09IHA7CiAgICAgIH0K
+ICAgICAgaWYgKGNvbmZpcm0oIldpbmRvdyIpICYmIGNvbmZpcm0oIkhUTUxFbGVtZW50IikpIHJldHVy
+biBob29rczsKICAgIH0KICAgIGhvb2tzLmdldFRhZyA9IGdldFRhZ0ZhbGxiYWNrOwogIH07Cn0KQy5L
+VT1mdW5jdGlvbihob29rcykgewogIGlmICh0eXBlb2YgZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFn
+ICE9ICJmdW5jdGlvbiIpIHJldHVybiBob29rczsKICBob29rcy5nZXRUYWcgPSBkYXJ0RXhwZXJpbWVu
+dGFsRml4dXBHZXRUYWcoaG9va3MuZ2V0VGFnKTsKfQpDLmZRPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFy
+IGdldFRhZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcHJvdG90eXBlRm9yVGFnID0gaG9va3MucHJvdG90
+eXBlRm9yVGFnOwogIGZ1bmN0aW9uIGdldFRhZ0ZpeGVkKG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWco
+byk7CiAgICBpZiAodGFnID09ICJEb2N1bWVudCIpIHsKICAgICAgaWYgKCEhby54bWxWZXJzaW9uKSBy
+ZXR1cm4gIiFEb2N1bWVudCI7CiAgICAgIHJldHVybiAiIUhUTUxEb2N1bWVudCI7CiAgICB9CiAgICBy
+ZXR1cm4gdGFnOwogIH0KICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWdGaXhlZCh0YWcpIHsKICAgIGlm
+ICh0YWcgPT0gIkRvY3VtZW50IikgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gcHJvdG90eXBlRm9yVGFn
+KHRhZyk7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRhZ0ZpeGVkOwogIGhvb2tzLnByb3RvdHlwZUZv
+clRhZyA9IHByb3RvdHlwZUZvclRhZ0ZpeGVkOwp9CkMuZGs9ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIg
+dXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciA9PSAib2JqZWN0IiA/IG5hdmlnYXRvci51c2VyQWdl
+bnQgOiAiIjsKICBpZiAodXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSA9PSAtMSkgcmV0dXJuIGhv
+b2tzOwogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAgdmFyIHF1aWNrTWFwID0gewogICAgIkJl
+Zm9yZVVubG9hZEV2ZW50IjogIkV2ZW50IiwKICAgICJEYXRhVHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwK
+ICAgICJHZW9HZW9sb2NhdGlvbiI6ICJHZW9sb2NhdGlvbiIsCiAgICAiTG9jYXRpb24iOiAiIUxvY2F0
+aW9uIiwKICAgICJXb3JrZXJNZXNzYWdlRXZlbnQiOiAiTWVzc2FnZUV2ZW50IiwKICAgICJYTUxEb2N1
+bWVudCI6ICIhRG9jdW1lbnQifTsKICBmdW5jdGlvbiBnZXRUYWdGaXJlZm94KG8pIHsKICAgIHZhciB0
+YWcgPSBnZXRUYWcobyk7CiAgICByZXR1cm4gcXVpY2tNYXBbdGFnXSB8fCB0YWc7CiAgfQogIGhvb2tz
+LmdldFRhZyA9IGdldFRhZ0ZpcmVmb3g7Cn0KQy54aT1mdW5jdGlvbihob29rcykgewogIHZhciB1c2Vy
+QWdlbnQgPSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6
+ICIiOwogIGlmICh1c2VyQWdlbnQuaW5kZXhPZigiVHJpZGVudC8iKSA9PSAtMSkgcmV0dXJuIGhvb2tz
+OwogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAgdmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9y
+ZVVubG9hZEV2ZW50IjogIkV2ZW50IiwKICAgICJEYXRhVHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAg
+ICJIVE1MRERFbGVtZW50IjogIkhUTUxFbGVtZW50IiwKICAgICJIVE1MRFRFbGVtZW50IjogIkhUTUxF
+bGVtZW50IiwKICAgICJIVE1MUGhyYXNlRWxlbWVudCI6ICJIVE1MRWxlbWVudCIsCiAgICAiUG9zaXRp
+b24iOiAiR2VvcG9zaXRpb24iCiAgfTsKICBmdW5jdGlvbiBnZXRUYWdJRShvKSB7CiAgICB2YXIgdGFn
+ID0gZ2V0VGFnKG8pOwogICAgdmFyIG5ld1RhZyA9IHF1aWNrTWFwW3RhZ107CiAgICBpZiAobmV3VGFn
+KSByZXR1cm4gbmV3VGFnOwogICAgaWYgKHRhZyA9PSAiT2JqZWN0IikgewogICAgICBpZiAod2luZG93
+LkRhdGFWaWV3ICYmIChvIGluc3RhbmNlb2Ygd2luZG93LkRhdGFWaWV3KSkgcmV0dXJuICJEYXRhVmll
+dyI7CiAgICB9CiAgICByZXR1cm4gdGFnOwogIH0KICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWdJRSh0
+YWcpIHsKICAgIHZhciBjb25zdHJ1Y3RvciA9IHdpbmRvd1t0YWddOwogICAgaWYgKGNvbnN0cnVjdG9y
+ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICB9
+CiAgaG9va3MuZ2V0VGFnID0gZ2V0VGFnSUU7CiAgaG9va3MucHJvdG90eXBlRm9yVGFnID0gcHJvdG90
+eXBlRm9yVGFnSUU7Cn0KQy5pNz1mdW5jdGlvbihob29rcykgeyByZXR1cm4gaG9va3M7IH0KCkMuQ3Q9
+bmV3IFAuYnkoKQpDLkVxPW5ldyBQLms1KCkKQy54TT1uZXcgUC51NSgpCkMuUWs9bmV3IFAuRTMoKQpD
+Lk52PW5ldyBILmtyKCkKQy5OVT1uZXcgUC5KaSgpCkMucGQ9bmV3IFAuWmQoKQpDLkFkPW5ldyBNLkg3
+KDAsIkhpbnRBY3Rpb25LaW5kLmFkZE51bGxhYmxlSGludCIpCkMubmU9bmV3IE0uSDcoMSwiSGludEFj
+dGlvbktpbmQuYWRkTm9uTnVsbGFibGVIaW50IikKQy5teT1uZXcgTS5INygyLCJIaW50QWN0aW9uS2lu
+ZC5jaGFuZ2VUb051bGxhYmxlSGludCIpCkMucng9bmV3IE0uSDcoMywiSGludEFjdGlvbktpbmQuY2hh
+bmdlVG9Ob25OdWxsYWJsZUhpbnQiKQpDLndWPW5ldyBNLkg3KDQsIkhpbnRBY3Rpb25LaW5kLnJlbW92
+ZU51bGxhYmxlSGludCIpCkMuZlI9bmV3IE0uSDcoNSwiSGludEFjdGlvbktpbmQucmVtb3ZlTm9uTnVs
+bGFibGVIaW50IikKQy5BMz1uZXcgUC5NeChudWxsKQpDLm5YPW5ldyBQLm9qKG51bGwpCkMuYWs9SC5W
+TShzKFswLDAsMzI3NzYsMzM3OTIsMSwxMDI0MCwwLDBdKSx0LlYpCkMuY209SC5WTShzKFsiKjo6Y2xh
+c3MiLCIqOjpkaXIiLCIqOjpkcmFnZ2FibGUiLCIqOjpoaWRkZW4iLCIqOjppZCIsIio6OmluZXJ0Iiwi
+Kjo6aXRlbXByb3AiLCIqOjppdGVtcmVmIiwiKjo6aXRlbXNjb3BlIiwiKjo6bGFuZyIsIio6OnNwZWxs
+Y2hlY2siLCIqOjp0aXRsZSIsIio6OnRyYW5zbGF0ZSIsIkE6OmFjY2Vzc2tleSIsIkE6OmNvb3JkcyIs
+IkE6OmhyZWZsYW5nIiwiQTo6bmFtZSIsIkE6OnNoYXBlIiwiQTo6dGFiaW5kZXgiLCJBOjp0YXJnZXQi
+LCJBOjp0eXBlIiwiQVJFQTo6YWNjZXNza2V5IiwiQVJFQTo6YWx0IiwiQVJFQTo6Y29vcmRzIiwiQVJF
+QTo6bm9ocmVmIiwiQVJFQTo6c2hhcGUiLCJBUkVBOjp0YWJpbmRleCIsIkFSRUE6OnRhcmdldCIsIkFV
+RElPOjpjb250cm9scyIsIkFVRElPOjpsb29wIiwiQVVESU86Om1lZGlhZ3JvdXAiLCJBVURJTzo6bXV0
+ZWQiLCJBVURJTzo6cHJlbG9hZCIsIkJETzo6ZGlyIiwiQk9EWTo6YWxpbmsiLCJCT0RZOjpiZ2NvbG9y
+IiwiQk9EWTo6bGluayIsIkJPRFk6OnRleHQiLCJCT0RZOjp2bGluayIsIkJSOjpjbGVhciIsIkJVVFRP
+Tjo6YWNjZXNza2V5IiwiQlVUVE9OOjpkaXNhYmxlZCIsIkJVVFRPTjo6bmFtZSIsIkJVVFRPTjo6dGFi
+aW5kZXgiLCJCVVRUT046OnR5cGUiLCJCVVRUT046OnZhbHVlIiwiQ0FOVkFTOjpoZWlnaHQiLCJDQU5W
+QVM6OndpZHRoIiwiQ0FQVElPTjo6YWxpZ24iLCJDT0w6OmFsaWduIiwiQ09MOjpjaGFyIiwiQ09MOjpj
+aGFyb2ZmIiwiQ09MOjpzcGFuIiwiQ09MOjp2YWxpZ24iLCJDT0w6OndpZHRoIiwiQ09MR1JPVVA6OmFs
+aWduIiwiQ09MR1JPVVA6OmNoYXIiLCJDT0xHUk9VUDo6Y2hhcm9mZiIsIkNPTEdST1VQOjpzcGFuIiwi
+Q09MR1JPVVA6OnZhbGlnbiIsIkNPTEdST1VQOjp3aWR0aCIsIkNPTU1BTkQ6OmNoZWNrZWQiLCJDT01N
+QU5EOjpjb21tYW5kIiwiQ09NTUFORDo6ZGlzYWJsZWQiLCJDT01NQU5EOjpsYWJlbCIsIkNPTU1BTkQ6
+OnJhZGlvZ3JvdXAiLCJDT01NQU5EOjp0eXBlIiwiREFUQTo6dmFsdWUiLCJERUw6OmRhdGV0aW1lIiwi
+REVUQUlMUzo6b3BlbiIsIkRJUjo6Y29tcGFjdCIsIkRJVjo6YWxpZ24iLCJETDo6Y29tcGFjdCIsIkZJ
+RUxEU0VUOjpkaXNhYmxlZCIsIkZPTlQ6OmNvbG9yIiwiRk9OVDo6ZmFjZSIsIkZPTlQ6OnNpemUiLCJG
+T1JNOjphY2NlcHQiLCJGT1JNOjphdXRvY29tcGxldGUiLCJGT1JNOjplbmN0eXBlIiwiRk9STTo6bWV0
+aG9kIiwiRk9STTo6bmFtZSIsIkZPUk06Om5vdmFsaWRhdGUiLCJGT1JNOjp0YXJnZXQiLCJGUkFNRTo6
+bmFtZSIsIkgxOjphbGlnbiIsIkgyOjphbGlnbiIsIkgzOjphbGlnbiIsIkg0OjphbGlnbiIsIkg1Ojph
+bGlnbiIsIkg2OjphbGlnbiIsIkhSOjphbGlnbiIsIkhSOjpub3NoYWRlIiwiSFI6OnNpemUiLCJIUjo6
+d2lkdGgiLCJIVE1MOjp2ZXJzaW9uIiwiSUZSQU1FOjphbGlnbiIsIklGUkFNRTo6ZnJhbWVib3JkZXIi
+LCJJRlJBTUU6OmhlaWdodCIsIklGUkFNRTo6bWFyZ2luaGVpZ2h0IiwiSUZSQU1FOjptYXJnaW53aWR0
+aCIsIklGUkFNRTo6d2lkdGgiLCJJTUc6OmFsaWduIiwiSU1HOjphbHQiLCJJTUc6OmJvcmRlciIsIklN
+Rzo6aGVpZ2h0IiwiSU1HOjpoc3BhY2UiLCJJTUc6OmlzbWFwIiwiSU1HOjpuYW1lIiwiSU1HOjp1c2Vt
+YXAiLCJJTUc6OnZzcGFjZSIsIklNRzo6d2lkdGgiLCJJTlBVVDo6YWNjZXB0IiwiSU5QVVQ6OmFjY2Vz
+c2tleSIsIklOUFVUOjphbGlnbiIsIklOUFVUOjphbHQiLCJJTlBVVDo6YXV0b2NvbXBsZXRlIiwiSU5Q
+VVQ6OmF1dG9mb2N1cyIsIklOUFVUOjpjaGVja2VkIiwiSU5QVVQ6OmRpc2FibGVkIiwiSU5QVVQ6Omlu
+cHV0bW9kZSIsIklOUFVUOjppc21hcCIsIklOUFVUOjpsaXN0IiwiSU5QVVQ6Om1heCIsIklOUFVUOjpt
+YXhsZW5ndGgiLCJJTlBVVDo6bWluIiwiSU5QVVQ6Om11bHRpcGxlIiwiSU5QVVQ6Om5hbWUiLCJJTlBV
+VDo6cGxhY2Vob2xkZXIiLCJJTlBVVDo6cmVhZG9ubHkiLCJJTlBVVDo6cmVxdWlyZWQiLCJJTlBVVDo6
+c2l6ZSIsIklOUFVUOjpzdGVwIiwiSU5QVVQ6OnRhYmluZGV4IiwiSU5QVVQ6OnR5cGUiLCJJTlBVVDo6
+dXNlbWFwIiwiSU5QVVQ6OnZhbHVlIiwiSU5TOjpkYXRldGltZSIsIktFWUdFTjo6ZGlzYWJsZWQiLCJL
+RVlHRU46OmtleXR5cGUiLCJLRVlHRU46Om5hbWUiLCJMQUJFTDo6YWNjZXNza2V5IiwiTEFCRUw6OmZv
+ciIsIkxFR0VORDo6YWNjZXNza2V5IiwiTEVHRU5EOjphbGlnbiIsIkxJOjp0eXBlIiwiTEk6OnZhbHVl
+IiwiTElOSzo6c2l6ZXMiLCJNQVA6Om5hbWUiLCJNRU5VOjpjb21wYWN0IiwiTUVOVTo6bGFiZWwiLCJN
+RU5VOjp0eXBlIiwiTUVURVI6OmhpZ2giLCJNRVRFUjo6bG93IiwiTUVURVI6Om1heCIsIk1FVEVSOjpt
+aW4iLCJNRVRFUjo6dmFsdWUiLCJPQkpFQ1Q6OnR5cGVtdXN0bWF0Y2giLCJPTDo6Y29tcGFjdCIsIk9M
+OjpyZXZlcnNlZCIsIk9MOjpzdGFydCIsIk9MOjp0eXBlIiwiT1BUR1JPVVA6OmRpc2FibGVkIiwiT1BU
+R1JPVVA6OmxhYmVsIiwiT1BUSU9OOjpkaXNhYmxlZCIsIk9QVElPTjo6bGFiZWwiLCJPUFRJT046OnNl
+bGVjdGVkIiwiT1BUSU9OOjp2YWx1ZSIsIk9VVFBVVDo6Zm9yIiwiT1VUUFVUOjpuYW1lIiwiUDo6YWxp
+Z24iLCJQUkU6OndpZHRoIiwiUFJPR1JFU1M6Om1heCIsIlBST0dSRVNTOjptaW4iLCJQUk9HUkVTUzo6
+dmFsdWUiLCJTRUxFQ1Q6OmF1dG9jb21wbGV0ZSIsIlNFTEVDVDo6ZGlzYWJsZWQiLCJTRUxFQ1Q6Om11
+bHRpcGxlIiwiU0VMRUNUOjpuYW1lIiwiU0VMRUNUOjpyZXF1aXJlZCIsIlNFTEVDVDo6c2l6ZSIsIlNF
+TEVDVDo6dGFiaW5kZXgiLCJTT1VSQ0U6OnR5cGUiLCJUQUJMRTo6YWxpZ24iLCJUQUJMRTo6Ymdjb2xv
+ciIsIlRBQkxFOjpib3JkZXIiLCJUQUJMRTo6Y2VsbHBhZGRpbmciLCJUQUJMRTo6Y2VsbHNwYWNpbmci
+LCJUQUJMRTo6ZnJhbWUiLCJUQUJMRTo6cnVsZXMiLCJUQUJMRTo6c3VtbWFyeSIsIlRBQkxFOjp3aWR0
+aCIsIlRCT0RZOjphbGlnbiIsIlRCT0RZOjpjaGFyIiwiVEJPRFk6OmNoYXJvZmYiLCJUQk9EWTo6dmFs
+aWduIiwiVEQ6OmFiYnIiLCJURDo6YWxpZ24iLCJURDo6YXhpcyIsIlREOjpiZ2NvbG9yIiwiVEQ6OmNo
+YXIiLCJURDo6Y2hhcm9mZiIsIlREOjpjb2xzcGFuIiwiVEQ6OmhlYWRlcnMiLCJURDo6aGVpZ2h0Iiwi
+VEQ6Om5vd3JhcCIsIlREOjpyb3dzcGFuIiwiVEQ6OnNjb3BlIiwiVEQ6OnZhbGlnbiIsIlREOjp3aWR0
+aCIsIlRFWFRBUkVBOjphY2Nlc3NrZXkiLCJURVhUQVJFQTo6YXV0b2NvbXBsZXRlIiwiVEVYVEFSRUE6
+OmNvbHMiLCJURVhUQVJFQTo6ZGlzYWJsZWQiLCJURVhUQVJFQTo6aW5wdXRtb2RlIiwiVEVYVEFSRUE6
+Om5hbWUiLCJURVhUQVJFQTo6cGxhY2Vob2xkZXIiLCJURVhUQVJFQTo6cmVhZG9ubHkiLCJURVhUQVJF
+QTo6cmVxdWlyZWQiLCJURVhUQVJFQTo6cm93cyIsIlRFWFRBUkVBOjp0YWJpbmRleCIsIlRFWFRBUkVB
+Ojp3cmFwIiwiVEZPT1Q6OmFsaWduIiwiVEZPT1Q6OmNoYXIiLCJURk9PVDo6Y2hhcm9mZiIsIlRGT09U
+Ojp2YWxpZ24iLCJUSDo6YWJiciIsIlRIOjphbGlnbiIsIlRIOjpheGlzIiwiVEg6OmJnY29sb3IiLCJU
+SDo6Y2hhciIsIlRIOjpjaGFyb2ZmIiwiVEg6OmNvbHNwYW4iLCJUSDo6aGVhZGVycyIsIlRIOjpoZWln
+aHQiLCJUSDo6bm93cmFwIiwiVEg6OnJvd3NwYW4iLCJUSDo6c2NvcGUiLCJUSDo6dmFsaWduIiwiVEg6
+OndpZHRoIiwiVEhFQUQ6OmFsaWduIiwiVEhFQUQ6OmNoYXIiLCJUSEVBRDo6Y2hhcm9mZiIsIlRIRUFE
+Ojp2YWxpZ24iLCJUUjo6YWxpZ24iLCJUUjo6Ymdjb2xvciIsIlRSOjpjaGFyIiwiVFI6OmNoYXJvZmYi
+LCJUUjo6dmFsaWduIiwiVFJBQ0s6OmRlZmF1bHQiLCJUUkFDSzo6a2luZCIsIlRSQUNLOjpsYWJlbCIs
+IlRSQUNLOjpzcmNsYW5nIiwiVUw6OmNvbXBhY3QiLCJVTDo6dHlwZSIsIlZJREVPOjpjb250cm9scyIs
+IlZJREVPOjpoZWlnaHQiLCJWSURFTzo6bG9vcCIsIlZJREVPOjptZWRpYWdyb3VwIiwiVklERU86Om11
+dGVkIiwiVklERU86OnByZWxvYWQiLCJWSURFTzo6d2lkdGgiXSksdC5pKQpDLlZDPUguVk0ocyhbMCww
+LDY1NDkwLDQ1MDU1LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdC5WKQpDLm1LPUguVk0ocyhbMCww
+LDI2NjI0LDEwMjMsNjU1MzQsMjA0Nyw2NTUzNCwyMDQ3XSksdC5WKQpDLlNxPUguVk0ocyhbIkhFQUQi
+LCJBUkVBIiwiQkFTRSIsIkJBU0VGT05UIiwiQlIiLCJDT0wiLCJDT0xHUk9VUCIsIkVNQkVEIiwiRlJB
+TUUiLCJGUkFNRVNFVCIsIkhSIiwiSU1BR0UiLCJJTUciLCJJTlBVVCIsIklTSU5ERVgiLCJMSU5LIiwi
+TUVUQSIsIlBBUkFNIiwiU09VUkNFIiwiU1RZTEUiLCJUSVRMRSIsIldCUiJdKSx0LmkpCkMuaFU9SC5W
+TShzKFtdKSx0LngpCkMuZG49SC5WTShzKFtdKSxILk4wKCJqZDxMTCo+IikpCkMueEQ9SC5WTShzKFtd
+KSx0LmkpCkMudG89SC5WTShzKFswLDAsMzI3MjIsMTIyODcsNjU1MzQsMzQ4MTUsNjU1MzQsMTg0MzFd
+KSx0LlYpCkMucms9SC5WTShzKFtDLkFkLEMubmUsQy5teSxDLnJ4LEMud1YsQy5mUl0pLEguTjAoImpk
+PEg3Kj4iKSkKQy5GMz1ILlZNKHMoWzAsMCwyNDU3NiwxMDIzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMx
+XSksdC5WKQpDLmVhPUguVk0ocyhbMCwwLDMyNzU0LDExMjYzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMx
+XSksdC5WKQpDLlpKPUguVk0ocyhbMCwwLDMyNzIyLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMx
+XSksdC5WKQpDLldkPUguVk0ocyhbMCwwLDY1NDkwLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMx
+XSksdC5WKQpDLlF4PUguVk0ocyhbImJpbmQiLCJpZiIsInJlZiIsInJlcGVhdCIsInN5bnRheCJdKSx0
+LmkpCkMuQkk9SC5WTShzKFsiQTo6aHJlZiIsIkFSRUE6OmhyZWYiLCJCTE9DS1FVT1RFOjpjaXRlIiwi
+Qk9EWTo6YmFja2dyb3VuZCIsIkNPTU1BTkQ6Omljb24iLCJERUw6OmNpdGUiLCJGT1JNOjphY3Rpb24i
+LCJJTUc6OnNyYyIsIklOUFVUOjpzcmMiLCJJTlM6OmNpdGUiLCJROjpjaXRlIiwiVklERU86OnBvc3Rl
+ciJdKSx0LmkpCkMuRHg9bmV3IEguTFAoMCx7fSxDLnhELEguTjAoIkxQPHFVKix6TTxqOCo+Kj4iKSkK
+Qy5DTT1uZXcgSC5MUCgwLHt9LEMueEQsSC5OMCgiTFA8cVUqLHFVKj4iKSkKQy5pSD1ILlZNKHMoW10p
+LEguTjAoImpkPEdEKj4iKSkKQy5XTz1uZXcgSC5MUCgwLHt9LEMuaUgsSC5OMCgiTFA8R0QqLEA+Iikp
+CkMuWTI9bmV3IEwuTzkoIk5hdmlnYXRpb25UcmVlTm9kZVR5cGUuZGlyZWN0b3J5IikKQy5yZj1uZXcg
+TC5POSgiTmF2aWdhdGlvblRyZWVOb2RlVHlwZS5maWxlIikKQy5UZT1uZXcgSC53digiY2FsbCIpCkMu
+b0U9bmV3IFAuR1koITEpCkMud1E9bmV3IFAuRnkobnVsbCwyKX0pKCk7KGZ1bmN0aW9uIHN0YXRpY0Zp
+ZWxkcygpeyQuem09bnVsbAokLnlqPTAKJC5tSj1udWxsCiQuUDQ9bnVsbAokLk5GPW51bGwKJC5UWD1u
+dWxsCiQueDc9bnVsbAokLm53PW51bGwKJC52dj1udWxsCiQuQnY9bnVsbAokLlM2PW51bGwKJC5rOD1u
+dWxsCiQubWc9bnVsbAokLlVEPSExCiQuWDM9Qy5OVQokLnhnPUguVk0oW10sSC5OMCgiamQ8TWg+Iikp
+CiQueG89bnVsbAokLkJPPW51bGwKJC5sdD1udWxsCiQuRVU9bnVsbAokLm9yPVAuRmwodC5OLHQuWSkK
+JC5JNj1udWxsCiQuRmY9bnVsbH0pKCk7KGZ1bmN0aW9uIGxhenlJbml0aWFsaXplcnMoKXt2YXIgcz1o
+dW5rSGVscGVycy5sYXp5RmluYWwscj1odW5rSGVscGVycy5sYXp5T2xkCnMoJCwiZmEiLCJ3IixmdW5j
+dGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfZGFydENsb3N1cmUiKX0pCnMoJCwiVTIiLCJTbiIsZnVu
+Y3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHsKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iJHJlY2Vp
+dmVyJCJ9fSkpfSkKcygkLCJ4cSIsImxxIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoeyRtZXRo
+b2QkOm51bGwsCnRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNlaXZlciQifX0pKX0pCnMoJCwi
+UjEiLCJOOSIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KG51bGwpKX0pCnMoJCwiZk4iLCJpSSIs
+ZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3ZhciAkYXJndW1lbnRzRXhwciQ9JyRhcmd1
+bWVudHMkJwp0cnl7bnVsbC4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHEpe3JldHVybiBx
+Lm1lc3NhZ2V9fSgpKX0pCnMoJCwicWkiLCJVTiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHZv
+aWQgMCkpfSkKcygkLCJyWiIsIlpoIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dmFy
+ICRhcmd1bWVudHNFeHByJD0nJGFyZ3VtZW50cyQnCnRyeXsodm9pZCAwKS4kbWV0aG9kJCgkYXJndW1l
+bnRzRXhwciQpfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwia3EiLCJyTiIsZnVu
+Y3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKG51bGwpKX0pCnMoJCwidHQiLCJjMyIsZnVuY3Rpb24oKXty
+ZXR1cm4gSC5jTShmdW5jdGlvbigpe3RyeXtudWxsLiRtZXRob2QkfWNhdGNoKHEpe3JldHVybiBxLm1l
+c3NhZ2V9fSgpKX0pCnMoJCwiZHQiLCJISyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKHZvaWQg
+MCkpfSkKcygkLCJBNyIsInIxIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5eyh2
+b2lkIDApLiRtZXRob2QkfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwiV2MiLCJ1
+dCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5PaigpfSkKcygkLCJraCIsInJmIixmdW5jdGlvbigpe3JldHVy
+biBuZXcgUC5wZygpLiQwKCl9KQpzKCQsImFYIiwiSEciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLmMy
+KCkuJDAoKX0pCnMoJCwiYnQiLCJWNyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEludDhBcnJheShILlhG
+KEguVk0oWy0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0y
+LC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0x
+LC0yLC0yLC0yLC0yLC0yLDYyLC0yLDYyLC0yLDYzLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYx
+LC0yLC0yLC0yLC0xLC0yLC0yLC0yLDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUs
+MTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTIsLTIsLTIsLTIsNjMsLTIsMjYsMjcsMjgsMjks
+MzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDks
+NTAsNTEsLTIsLTIsLTIsLTIsLTJdLHQuYSkpKX0pCnMoJCwiTTUiLCJ3USIsZnVuY3Rpb24oKXtyZXR1
+cm4gdHlwZW9mIHByb2Nlc3MhPSJ1bmRlZmluZWQiJiZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNh
+bGwocHJvY2Vzcyk9PSJbb2JqZWN0IHByb2Nlc3NdIiYmcHJvY2Vzcy5wbGF0Zm9ybT09IndpbjMyIn0p
+CnMoJCwibWYiLCJ6NCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5udSgiXltcXC1cXC4wLTlBLVpfYS16fl0q
+JCIpfSkKcygkLCJPUSIsInZaIixmdW5jdGlvbigpe3JldHVybiBQLktOKCl9KQpzKCQsIlNDIiwiQU4i
+LGZ1bmN0aW9uKCl7cmV0dXJuIFAudE0oWyJBIiwiQUJCUiIsIkFDUk9OWU0iLCJBRERSRVNTIiwiQVJF
+QSIsIkFSVElDTEUiLCJBU0lERSIsIkFVRElPIiwiQiIsIkJESSIsIkJETyIsIkJJRyIsIkJMT0NLUVVP
+VEUiLCJCUiIsIkJVVFRPTiIsIkNBTlZBUyIsIkNBUFRJT04iLCJDRU5URVIiLCJDSVRFIiwiQ09ERSIs
+IkNPTCIsIkNPTEdST1VQIiwiQ09NTUFORCIsIkRBVEEiLCJEQVRBTElTVCIsIkREIiwiREVMIiwiREVU
+QUlMUyIsIkRGTiIsIkRJUiIsIkRJViIsIkRMIiwiRFQiLCJFTSIsIkZJRUxEU0VUIiwiRklHQ0FQVElP
+TiIsIkZJR1VSRSIsIkZPTlQiLCJGT09URVIiLCJGT1JNIiwiSDEiLCJIMiIsIkgzIiwiSDQiLCJINSIs
+Ikg2IiwiSEVBREVSIiwiSEdST1VQIiwiSFIiLCJJIiwiSUZSQU1FIiwiSU1HIiwiSU5QVVQiLCJJTlMi
+LCJLQkQiLCJMQUJFTCIsIkxFR0VORCIsIkxJIiwiTUFQIiwiTUFSSyIsIk1FTlUiLCJNRVRFUiIsIk5B
+ViIsIk5PQlIiLCJPTCIsIk9QVEdST1VQIiwiT1BUSU9OIiwiT1VUUFVUIiwiUCIsIlBSRSIsIlBST0dS
+RVNTIiwiUSIsIlMiLCJTQU1QIiwiU0VDVElPTiIsIlNFTEVDVCIsIlNNQUxMIiwiU09VUkNFIiwiU1BB
+TiIsIlNUUklLRSIsIlNUUk9ORyIsIlNVQiIsIlNVTU1BUlkiLCJTVVAiLCJUQUJMRSIsIlRCT0RZIiwi
+VEQiLCJURVhUQVJFQSIsIlRGT09UIiwiVEgiLCJUSEVBRCIsIlRJTUUiLCJUUiIsIlRSQUNLIiwiVFQi
+LCJVIiwiVUwiLCJWQVIiLCJWSURFTyIsIldCUiJdLHQuTil9KQpzKCQsIlg0IiwiaEciLGZ1bmN0aW9u
+KCl7cmV0dXJuIFAubnUoIl5cXFMrJCIpfSkKcygkLCJ3TyIsIm93IixmdW5jdGlvbigpe3JldHVybiBQ
+Lk5EKHNlbGYpfSkKcygkLCJrdCIsIlI4IixmdW5jdGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfZGFy
+dE9iamVjdCIpfSkKcygkLCJmSyIsImtJIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBEYXJ0T2Jq
+ZWN0KGEpe3RoaXMubz1hfX0pCnIoJCwicXQiLCJ6QiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFQubVEo
+KX0pCnIoJCwiT2wiLCJVRSIsZnVuY3Rpb24oKXtyZXR1cm4gUC5oSyhDLm9sLmdtVyhXLngzKCkpLmhy
+ZWYpLmdoWSgpLnEoMCwiYXV0aFRva2VuIil9KQpyKCQsImhUIiwieVAiLGZ1bmN0aW9uKCl7cmV0dXJu
+IFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIuZWRpdC1saXN0IC5wYW5lbC1jb250ZW50Iil9KQpyKCQsIlc2
+IiwiaEwiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIuZWRpdC1wYW5lbCAu
+cGFuZWwtY29udGVudCIpfSkKcigkLCJUUiIsIkRXIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVl
+cnlTZWxlY3RvcigiZm9vdGVyIil9KQpyKCQsIkVZIiwiZmkiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIo
+KS5xdWVyeVNlbGVjdG9yKCJoZWFkZXIiKX0pCnIoJCwiYXYiLCJEOSIsZnVuY3Rpb24oKXtyZXR1cm4g
+Vy5acigpLnF1ZXJ5U2VsZWN0b3IoIiN1bml0LW5hbWUiKX0pCnIoJCwiZmUiLCJLRyIsZnVuY3Rpb24o
+KXtyZXR1cm4gbmV3IEwuWEEoKX0pCnMoJCwiZW8iLCJuVSIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0u
+bEkoJC5IaygpKX0pCnMoJCwieXIiLCJiRCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEUuT0YoUC5udSgi
+LyIpLFAubnUoIlteL10kIiksUC5udSgiXi8iKSl9KQpzKCQsIk1rIiwiS2siLGZ1bmN0aW9uKCl7cmV0
+dXJuIG5ldyBMLklWKFAubnUoIlsvXFxcXF0iKSxQLm51KCJbXi9cXFxcXSQiKSxQLm51KCJeKFxcXFxc
+XFxcW15cXFxcXStcXFxcW15cXFxcL10rfFthLXpBLVpdOlsvXFxcXF0pIiksUC5udSgiXlsvXFxcXF0o
+PyFbL1xcXFxdKSIpKX0pCnMoJCwiYWsiLCJFYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEYucnUoUC5u
+dSgiLyIpLFAubnUoIiheW2EtekEtWl1bLSsuYS16QS1aXFxkXSo6Ly98W14vXSkkIiksUC5udSgiW2Et
+ekEtWl1bLSsuYS16QS1aXFxkXSo6Ly9bXi9dKiIpLFAubnUoIl4vIikpfSkKcygkLCJscyIsIkhrIixm
+dW5jdGlvbigpe3JldHVybiBPLlJoKCl9KX0pKCk7KGZ1bmN0aW9uIG5hdGl2ZVN1cHBvcnQoKXshZnVu
+Y3Rpb24oKXt2YXIgcz1mdW5jdGlvbihhKXt2YXIgbT17fQptW2FdPTEKcmV0dXJuIE9iamVjdC5rZXlz
+KGh1bmtIZWxwZXJzLmNvbnZlcnRUb0Zhc3RPYmplY3QobSkpWzBdfQp2LmdldElzb2xhdGVUYWc9ZnVu
+Y3Rpb24oYSl7cmV0dXJuIHMoIl9fX2RhcnRfIithK3YuaXNvbGF0ZVRhZyl9CnZhciByPSJfX19kYXJ0
+X2lzb2xhdGVfdGFnc18iCnZhciBxPU9iamVjdFtyXXx8KE9iamVjdFtyXT1PYmplY3QuY3JlYXRlKG51
+bGwpKQp2YXIgcD0iX1p4WXhYIgpmb3IodmFyIG89MDs7bysrKXt2YXIgbj1zKHArIl8iK28rIl8iKQpp
+ZighKG4gaW4gcSkpe3Fbbl09MQp2Lmlzb2xhdGVUYWc9bgpicmVha319di5kaXNwYXRjaFByb3BlcnR5
+TmFtZT12LmdldElzb2xhdGVUYWcoImRpc3BhdGNoX3JlY29yZCIpfSgpCmh1bmtIZWxwZXJzLnNldE9y
+VXBkYXRlSW50ZXJjZXB0b3JzQnlUYWcoe0RPTUVycm9yOkoudkIsTWVkaWFFcnJvcjpKLnZCLE5hdmln
+YXRvcjpKLnZCLE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTpKLnZCLE5hdmlnYXRvclVzZXJNZWRp
+YUVycm9yOkoudkIsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6Si52QixQb3NpdGlvbkVycm9yOkoudkIsUmFu
+Z2U6Si52QixTUUxFcnJvcjpKLnZCLERhdGFWaWV3OkguRVQsQXJyYXlCdWZmZXJWaWV3OkguRVQsRmxv
+YXQzMkFycmF5OkguRGcsRmxvYXQ2NEFycmF5OkguRGcsSW50MTZBcnJheTpILnhqLEludDMyQXJyYXk6
+SC5kRSxJbnQ4QXJyYXk6SC5aQSxVaW50MTZBcnJheTpILmRULFVpbnQzMkFycmF5OkguUHEsVWludDhD
+bGFtcGVkQXJyYXk6SC5lRSxDYW52YXNQaXhlbEFycmF5OkguZUUsVWludDhBcnJheTpILlY2LEhUTUxB
+dWRpb0VsZW1lbnQ6Vy5xRSxIVE1MQlJFbGVtZW50OlcucUUsSFRNTEJ1dHRvbkVsZW1lbnQ6Vy5xRSxI
+VE1MQ2FudmFzRWxlbWVudDpXLnFFLEhUTUxDb250ZW50RWxlbWVudDpXLnFFLEhUTUxETGlzdEVsZW1l
+bnQ6Vy5xRSxIVE1MRGF0YUVsZW1lbnQ6Vy5xRSxIVE1MRGF0YUxpc3RFbGVtZW50OlcucUUsSFRNTERl
+dGFpbHNFbGVtZW50OlcucUUsSFRNTERpYWxvZ0VsZW1lbnQ6Vy5xRSxIVE1MRGl2RWxlbWVudDpXLnFF
+LEhUTUxFbWJlZEVsZW1lbnQ6Vy5xRSxIVE1MRmllbGRTZXRFbGVtZW50OlcucUUsSFRNTEhSRWxlbWVu
+dDpXLnFFLEhUTUxIZWFkRWxlbWVudDpXLnFFLEhUTUxIZWFkaW5nRWxlbWVudDpXLnFFLEhUTUxIdG1s
+RWxlbWVudDpXLnFFLEhUTUxJRnJhbWVFbGVtZW50OlcucUUsSFRNTEltYWdlRWxlbWVudDpXLnFFLEhU
+TUxJbnB1dEVsZW1lbnQ6Vy5xRSxIVE1MTElFbGVtZW50OlcucUUsSFRNTExhYmVsRWxlbWVudDpXLnFF
+LEhUTUxMZWdlbmRFbGVtZW50OlcucUUsSFRNTExpbmtFbGVtZW50OlcucUUsSFRNTE1hcEVsZW1lbnQ6
+Vy5xRSxIVE1MTWVkaWFFbGVtZW50OlcucUUsSFRNTE1lbnVFbGVtZW50OlcucUUsSFRNTE1ldGFFbGVt
+ZW50OlcucUUsSFRNTE1ldGVyRWxlbWVudDpXLnFFLEhUTUxNb2RFbGVtZW50OlcucUUsSFRNTE9MaXN0
+RWxlbWVudDpXLnFFLEhUTUxPYmplY3RFbGVtZW50OlcucUUsSFRNTE9wdEdyb3VwRWxlbWVudDpXLnFF
+LEhUTUxPcHRpb25FbGVtZW50OlcucUUsSFRNTE91dHB1dEVsZW1lbnQ6Vy5xRSxIVE1MUGFyYW1FbGVt
+ZW50OlcucUUsSFRNTFBpY3R1cmVFbGVtZW50OlcucUUsSFRNTFByZUVsZW1lbnQ6Vy5xRSxIVE1MUHJv
+Z3Jlc3NFbGVtZW50OlcucUUsSFRNTFF1b3RlRWxlbWVudDpXLnFFLEhUTUxTY3JpcHRFbGVtZW50Olcu
+cUUsSFRNTFNoYWRvd0VsZW1lbnQ6Vy5xRSxIVE1MU2xvdEVsZW1lbnQ6Vy5xRSxIVE1MU291cmNlRWxl
+bWVudDpXLnFFLEhUTUxTcGFuRWxlbWVudDpXLnFFLEhUTUxTdHlsZUVsZW1lbnQ6Vy5xRSxIVE1MVGFi
+bGVDYXB0aW9uRWxlbWVudDpXLnFFLEhUTUxUYWJsZUNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlRGF0
+YUNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVD
+b2xFbGVtZW50OlcucUUsSFRNTFRleHRBcmVhRWxlbWVudDpXLnFFLEhUTUxUaW1lRWxlbWVudDpXLnFF
+LEhUTUxUaXRsZUVsZW1lbnQ6Vy5xRSxIVE1MVHJhY2tFbGVtZW50OlcucUUsSFRNTFVMaXN0RWxlbWVu
+dDpXLnFFLEhUTUxVbmtub3duRWxlbWVudDpXLnFFLEhUTUxWaWRlb0VsZW1lbnQ6Vy5xRSxIVE1MRGly
+ZWN0b3J5RWxlbWVudDpXLnFFLEhUTUxGb250RWxlbWVudDpXLnFFLEhUTUxGcmFtZUVsZW1lbnQ6Vy5x
+RSxIVE1MRnJhbWVTZXRFbGVtZW50OlcucUUsSFRNTE1hcnF1ZWVFbGVtZW50OlcucUUsSFRNTEVsZW1l
+bnQ6Vy5xRSxIVE1MQW5jaG9yRWxlbWVudDpXLkdoLEhUTUxBcmVhRWxlbWVudDpXLmZZLEhUTUxCYXNl
+RWxlbWVudDpXLm5CLEJsb2I6Vy5BeixIVE1MQm9keUVsZW1lbnQ6Vy5RUCxDREFUQVNlY3Rpb246Vy5u
+eCxDaGFyYWN0ZXJEYXRhOlcubngsQ29tbWVudDpXLm54LFByb2Nlc3NpbmdJbnN0cnVjdGlvbjpXLm54
+LFRleHQ6Vy5ueCxDU1NTdHlsZURlY2xhcmF0aW9uOlcub0osTVNTdHlsZUNTU1Byb3BlcnRpZXM6Vy5v
+SixDU1MyUHJvcGVydGllczpXLm9KLFhNTERvY3VtZW50OlcuUUYsRG9jdW1lbnQ6Vy5RRixET01FeGNl
+cHRpb246Vy5OaCxET01JbXBsZW1lbnRhdGlvbjpXLmFlLERPTVJlY3RSZWFkT25seTpXLklCLERPTVRv
+a2VuTGlzdDpXLm43LEVsZW1lbnQ6Vy5jdixBYm9ydFBheW1lbnRFdmVudDpXLmVhLEFuaW1hdGlvbkV2
+ZW50OlcuZWEsQW5pbWF0aW9uUGxheWJhY2tFdmVudDpXLmVhLEFwcGxpY2F0aW9uQ2FjaGVFcnJvckV2
+ZW50OlcuZWEsQmFja2dyb3VuZEZldGNoQ2xpY2tFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaEV2ZW50
+OlcuZWEsQmFja2dyb3VuZEZldGNoRmFpbEV2ZW50OlcuZWEsQmFja2dyb3VuZEZldGNoZWRFdmVudDpX
+LmVhLEJlZm9yZUluc3RhbGxQcm9tcHRFdmVudDpXLmVhLEJlZm9yZVVubG9hZEV2ZW50OlcuZWEsQmxv
+YkV2ZW50OlcuZWEsQ2FuTWFrZVBheW1lbnRFdmVudDpXLmVhLENsaXBib2FyZEV2ZW50OlcuZWEsQ2xv
+c2VFdmVudDpXLmVhLEN1c3RvbUV2ZW50OlcuZWEsRGV2aWNlTW90aW9uRXZlbnQ6Vy5lYSxEZXZpY2VP
+cmllbnRhdGlvbkV2ZW50OlcuZWEsRXJyb3JFdmVudDpXLmVhLEV4dGVuZGFibGVFdmVudDpXLmVhLEV4
+dGVuZGFibGVNZXNzYWdlRXZlbnQ6Vy5lYSxGZXRjaEV2ZW50OlcuZWEsRm9udEZhY2VTZXRMb2FkRXZl
+bnQ6Vy5lYSxGb3JlaWduRmV0Y2hFdmVudDpXLmVhLEdhbWVwYWRFdmVudDpXLmVhLEhhc2hDaGFuZ2VF
+dmVudDpXLmVhLEluc3RhbGxFdmVudDpXLmVhLE1lZGlhRW5jcnlwdGVkRXZlbnQ6Vy5lYSxNZWRpYUtl
+eU1lc3NhZ2VFdmVudDpXLmVhLE1lZGlhUXVlcnlMaXN0RXZlbnQ6Vy5lYSxNZWRpYVN0cmVhbUV2ZW50
+OlcuZWEsTWVkaWFTdHJlYW1UcmFja0V2ZW50OlcuZWEsTWVzc2FnZUV2ZW50OlcuZWEsTUlESUNvbm5l
+Y3Rpb25FdmVudDpXLmVhLE1JRElNZXNzYWdlRXZlbnQ6Vy5lYSxNdXRhdGlvbkV2ZW50OlcuZWEsTm90
+aWZpY2F0aW9uRXZlbnQ6Vy5lYSxQYWdlVHJhbnNpdGlvbkV2ZW50OlcuZWEsUGF5bWVudFJlcXVlc3RF
+dmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0VXBkYXRlRXZlbnQ6Vy5lYSxQb3BTdGF0ZUV2ZW50OlcuZWEs
+UHJlc2VudGF0aW9uQ29ubmVjdGlvbkF2YWlsYWJsZUV2ZW50OlcuZWEsUHJlc2VudGF0aW9uQ29ubmVj
+dGlvbkNsb3NlRXZlbnQ6Vy5lYSxQcm9taXNlUmVqZWN0aW9uRXZlbnQ6Vy5lYSxQdXNoRXZlbnQ6Vy5l
+YSxSVENEYXRhQ2hhbm5lbEV2ZW50OlcuZWEsUlRDRFRNRlRvbmVDaGFuZ2VFdmVudDpXLmVhLFJUQ1Bl
+ZXJDb25uZWN0aW9uSWNlRXZlbnQ6Vy5lYSxSVENUcmFja0V2ZW50OlcuZWEsU2VjdXJpdHlQb2xpY3lW
+aW9sYXRpb25FdmVudDpXLmVhLFNlbnNvckVycm9yRXZlbnQ6Vy5lYSxTcGVlY2hSZWNvZ25pdGlvbkVy
+cm9yOlcuZWEsU3BlZWNoUmVjb2duaXRpb25FdmVudDpXLmVhLFNwZWVjaFN5bnRoZXNpc0V2ZW50Olcu
+ZWEsU3RvcmFnZUV2ZW50OlcuZWEsU3luY0V2ZW50OlcuZWEsVHJhY2tFdmVudDpXLmVhLFRyYW5zaXRp
+b25FdmVudDpXLmVhLFdlYktpdFRyYW5zaXRpb25FdmVudDpXLmVhLFZSRGV2aWNlRXZlbnQ6Vy5lYSxW
+UkRpc3BsYXlFdmVudDpXLmVhLFZSU2Vzc2lvbkV2ZW50OlcuZWEsTW9qb0ludGVyZmFjZVJlcXVlc3RF
+dmVudDpXLmVhLFVTQkNvbm5lY3Rpb25FdmVudDpXLmVhLElEQlZlcnNpb25DaGFuZ2VFdmVudDpXLmVh
+LEF1ZGlvUHJvY2Vzc2luZ0V2ZW50OlcuZWEsT2ZmbGluZUF1ZGlvQ29tcGxldGlvbkV2ZW50OlcuZWEs
+V2ViR0xDb250ZXh0RXZlbnQ6Vy5lYSxFdmVudDpXLmVhLElucHV0RXZlbnQ6Vy5lYSxTdWJtaXRFdmVu
+dDpXLmVhLEV2ZW50VGFyZ2V0OlcuRDAsRmlsZTpXLmhILEhUTUxGb3JtRWxlbWVudDpXLmg0LEhpc3Rv
+cnk6Vy5icixIVE1MRG9jdW1lbnQ6Vy5WYixYTUxIdHRwUmVxdWVzdDpXLmZKLFhNTEh0dHBSZXF1ZXN0
+RXZlbnRUYXJnZXQ6Vy53YSxJbWFnZURhdGE6Vy5TZyxMb2NhdGlvbjpXLnU4LE1vdXNlRXZlbnQ6Vy5B
+aixEcmFnRXZlbnQ6Vy5BaixQb2ludGVyRXZlbnQ6Vy5BaixXaGVlbEV2ZW50OlcuQWosRG9jdW1lbnRG
+cmFnbWVudDpXLnVILFNoYWRvd1Jvb3Q6Vy51SCxEb2N1bWVudFR5cGU6Vy51SCxOb2RlOlcudUgsTm9k
+ZUxpc3Q6Vy5CSCxSYWRpb05vZGVMaXN0OlcuQkgsSFRNTFBhcmFncmFwaEVsZW1lbnQ6Vy5TTixQcm9n
+cmVzc0V2ZW50OlcuZXcsUmVzb3VyY2VQcm9ncmVzc0V2ZW50OlcuZXcsSFRNTFNlbGVjdEVsZW1lbnQ6
+Vy5scCxIVE1MVGFibGVFbGVtZW50OlcuVGIsSFRNTFRhYmxlUm93RWxlbWVudDpXLkl2LEhUTUxUYWJs
+ZVNlY3Rpb25FbGVtZW50OlcuV1AsSFRNTFRlbXBsYXRlRWxlbWVudDpXLnlZLENvbXBvc2l0aW9uRXZl
+bnQ6Vy53NixGb2N1c0V2ZW50OlcudzYsS2V5Ym9hcmRFdmVudDpXLnc2LFRleHRFdmVudDpXLnc2LFRv
+dWNoRXZlbnQ6Vy53NixVSUV2ZW50OlcudzYsV2luZG93OlcuSzUsRE9NV2luZG93OlcuSzUsRGVkaWNh
+dGVkV29ya2VyR2xvYmFsU2NvcGU6Vy5DbSxTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU6Vy5DbSxTaGFy
+ZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sQXR0cjpXLkNRLENs
+aWVudFJlY3Q6Vy53NCxET01SZWN0OlcudzQsTmFtZWROb2RlTWFwOlcucmgsTW96TmFtZWRBdHRyTWFw
+OlcucmgsSURCS2V5UmFuZ2U6UC5oRixTVkdTY3JpcHRFbGVtZW50OlAubmQsU1ZHQUVsZW1lbnQ6UC5o
+aSxTVkdBbmltYXRlRWxlbWVudDpQLmhpLFNWR0FuaW1hdGVNb3Rpb25FbGVtZW50OlAuaGksU1ZHQW5p
+bWF0ZVRyYW5zZm9ybUVsZW1lbnQ6UC5oaSxTVkdBbmltYXRpb25FbGVtZW50OlAuaGksU1ZHQ2lyY2xl
+RWxlbWVudDpQLmhpLFNWR0NsaXBQYXRoRWxlbWVudDpQLmhpLFNWR0RlZnNFbGVtZW50OlAuaGksU1ZH
+RGVzY0VsZW1lbnQ6UC5oaSxTVkdEaXNjYXJkRWxlbWVudDpQLmhpLFNWR0VsbGlwc2VFbGVtZW50OlAu
+aGksU1ZHRkVCbGVuZEVsZW1lbnQ6UC5oaSxTVkdGRUNvbG9yTWF0cml4RWxlbWVudDpQLmhpLFNWR0ZF
+Q29tcG9uZW50VHJhbnNmZXJFbGVtZW50OlAuaGksU1ZHRkVDb21wb3NpdGVFbGVtZW50OlAuaGksU1ZH
+RkVDb252b2x2ZU1hdHJpeEVsZW1lbnQ6UC5oaSxTVkdGRURpZmZ1c2VMaWdodGluZ0VsZW1lbnQ6UC5o
+aSxTVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6UC5oaSxTVkdGRURpc3RhbnRMaWdodEVsZW1lbnQ6
+UC5oaSxTVkdGRUZsb29kRWxlbWVudDpQLmhpLFNWR0ZFRnVuY0FFbGVtZW50OlAuaGksU1ZHRkVGdW5j
+QkVsZW1lbnQ6UC5oaSxTVkdGRUZ1bmNHRWxlbWVudDpQLmhpLFNWR0ZFRnVuY1JFbGVtZW50OlAuaGks
+U1ZHRkVHYXVzc2lhbkJsdXJFbGVtZW50OlAuaGksU1ZHRkVJbWFnZUVsZW1lbnQ6UC5oaSxTVkdGRU1l
+cmdlRWxlbWVudDpQLmhpLFNWR0ZFTWVyZ2VOb2RlRWxlbWVudDpQLmhpLFNWR0ZFTW9ycGhvbG9neUVs
+ZW1lbnQ6UC5oaSxTVkdGRU9mZnNldEVsZW1lbnQ6UC5oaSxTVkdGRVBvaW50TGlnaHRFbGVtZW50OlAu
+aGksU1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDpQLmhpLFNWR0ZFU3BvdExpZ2h0RWxlbWVudDpQ
+LmhpLFNWR0ZFVGlsZUVsZW1lbnQ6UC5oaSxTVkdGRVR1cmJ1bGVuY2VFbGVtZW50OlAuaGksU1ZHRmls
+dGVyRWxlbWVudDpQLmhpLFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50OlAuaGksU1ZHR0VsZW1lbnQ6UC5o
+aSxTVkdHZW9tZXRyeUVsZW1lbnQ6UC5oaSxTVkdHcmFwaGljc0VsZW1lbnQ6UC5oaSxTVkdJbWFnZUVs
+ZW1lbnQ6UC5oaSxTVkdMaW5lRWxlbWVudDpQLmhpLFNWR0xpbmVhckdyYWRpZW50RWxlbWVudDpQLmhp
+LFNWR01hcmtlckVsZW1lbnQ6UC5oaSxTVkdNYXNrRWxlbWVudDpQLmhpLFNWR01ldGFkYXRhRWxlbWVu
+dDpQLmhpLFNWR1BhdGhFbGVtZW50OlAuaGksU1ZHUGF0dGVybkVsZW1lbnQ6UC5oaSxTVkdQb2x5Z29u
+RWxlbWVudDpQLmhpLFNWR1BvbHlsaW5lRWxlbWVudDpQLmhpLFNWR1JhZGlhbEdyYWRpZW50RWxlbWVu
+dDpQLmhpLFNWR1JlY3RFbGVtZW50OlAuaGksU1ZHU2V0RWxlbWVudDpQLmhpLFNWR1N0b3BFbGVtZW50
+OlAuaGksU1ZHU3R5bGVFbGVtZW50OlAuaGksU1ZHU1ZHRWxlbWVudDpQLmhpLFNWR1N3aXRjaEVsZW1l
+bnQ6UC5oaSxTVkdTeW1ib2xFbGVtZW50OlAuaGksU1ZHVFNwYW5FbGVtZW50OlAuaGksU1ZHVGV4dENv
+bnRlbnRFbGVtZW50OlAuaGksU1ZHVGV4dEVsZW1lbnQ6UC5oaSxTVkdUZXh0UGF0aEVsZW1lbnQ6UC5o
+aSxTVkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OlAuaGksU1ZHVGl0bGVFbGVtZW50OlAuaGksU1ZHVXNl
+RWxlbWVudDpQLmhpLFNWR1ZpZXdFbGVtZW50OlAuaGksU1ZHR3JhZGllbnRFbGVtZW50OlAuaGksU1ZH
+Q29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6UC5oaSxTVkdGRURyb3BTaGFkb3dFbGVtZW50
+OlAuaGksU1ZHTVBhdGhFbGVtZW50OlAuaGksU1ZHRWxlbWVudDpQLmhpfSkKaHVua0hlbHBlcnMuc2V0
+T3JVcGRhdGVMZWFmVGFncyh7RE9NRXJyb3I6dHJ1ZSxNZWRpYUVycm9yOnRydWUsTmF2aWdhdG9yOnRy
+dWUsTmF2aWdhdG9yQ29uY3VycmVudEhhcmR3YXJlOnRydWUsTmF2aWdhdG9yVXNlck1lZGlhRXJyb3I6
+dHJ1ZSxPdmVyY29uc3RyYWluZWRFcnJvcjp0cnVlLFBvc2l0aW9uRXJyb3I6dHJ1ZSxSYW5nZTp0cnVl
+LFNRTEVycm9yOnRydWUsRGF0YVZpZXc6dHJ1ZSxBcnJheUJ1ZmZlclZpZXc6ZmFsc2UsRmxvYXQzMkFy
+cmF5OnRydWUsRmxvYXQ2NEFycmF5OnRydWUsSW50MTZBcnJheTp0cnVlLEludDMyQXJyYXk6dHJ1ZSxJ
+bnQ4QXJyYXk6dHJ1ZSxVaW50MTZBcnJheTp0cnVlLFVpbnQzMkFycmF5OnRydWUsVWludDhDbGFtcGVk
+QXJyYXk6dHJ1ZSxDYW52YXNQaXhlbEFycmF5OnRydWUsVWludDhBcnJheTpmYWxzZSxIVE1MQXVkaW9F
+bGVtZW50OnRydWUsSFRNTEJSRWxlbWVudDp0cnVlLEhUTUxCdXR0b25FbGVtZW50OnRydWUsSFRNTENh
+bnZhc0VsZW1lbnQ6dHJ1ZSxIVE1MQ29udGVudEVsZW1lbnQ6dHJ1ZSxIVE1MRExpc3RFbGVtZW50OnRy
+dWUsSFRNTERhdGFFbGVtZW50OnRydWUsSFRNTERhdGFMaXN0RWxlbWVudDp0cnVlLEhUTUxEZXRhaWxz
+RWxlbWVudDp0cnVlLEhUTUxEaWFsb2dFbGVtZW50OnRydWUsSFRNTERpdkVsZW1lbnQ6dHJ1ZSxIVE1M
+RW1iZWRFbGVtZW50OnRydWUsSFRNTEZpZWxkU2V0RWxlbWVudDp0cnVlLEhUTUxIUkVsZW1lbnQ6dHJ1
+ZSxIVE1MSGVhZEVsZW1lbnQ6dHJ1ZSxIVE1MSGVhZGluZ0VsZW1lbnQ6dHJ1ZSxIVE1MSHRtbEVsZW1l
+bnQ6dHJ1ZSxIVE1MSUZyYW1lRWxlbWVudDp0cnVlLEhUTUxJbWFnZUVsZW1lbnQ6dHJ1ZSxIVE1MSW5w
+dXRFbGVtZW50OnRydWUsSFRNTExJRWxlbWVudDp0cnVlLEhUTUxMYWJlbEVsZW1lbnQ6dHJ1ZSxIVE1M
+TGVnZW5kRWxlbWVudDp0cnVlLEhUTUxMaW5rRWxlbWVudDp0cnVlLEhUTUxNYXBFbGVtZW50OnRydWUs
+SFRNTE1lZGlhRWxlbWVudDp0cnVlLEhUTUxNZW51RWxlbWVudDp0cnVlLEhUTUxNZXRhRWxlbWVudDp0
+cnVlLEhUTUxNZXRlckVsZW1lbnQ6dHJ1ZSxIVE1MTW9kRWxlbWVudDp0cnVlLEhUTUxPTGlzdEVsZW1l
+bnQ6dHJ1ZSxIVE1MT2JqZWN0RWxlbWVudDp0cnVlLEhUTUxPcHRHcm91cEVsZW1lbnQ6dHJ1ZSxIVE1M
+T3B0aW9uRWxlbWVudDp0cnVlLEhUTUxPdXRwdXRFbGVtZW50OnRydWUsSFRNTFBhcmFtRWxlbWVudDp0
+cnVlLEhUTUxQaWN0dXJlRWxlbWVudDp0cnVlLEhUTUxQcmVFbGVtZW50OnRydWUsSFRNTFByb2dyZXNz
+RWxlbWVudDp0cnVlLEhUTUxRdW90ZUVsZW1lbnQ6dHJ1ZSxIVE1MU2NyaXB0RWxlbWVudDp0cnVlLEhU
+TUxTaGFkb3dFbGVtZW50OnRydWUsSFRNTFNsb3RFbGVtZW50OnRydWUsSFRNTFNvdXJjZUVsZW1lbnQ6
+dHJ1ZSxIVE1MU3BhbkVsZW1lbnQ6dHJ1ZSxIVE1MU3R5bGVFbGVtZW50OnRydWUsSFRNTFRhYmxlQ2Fw
+dGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVDZWxsRWxlbWVudDp0cnVlLEhUTUxUYWJsZURhdGFDZWxs
+RWxlbWVudDp0cnVlLEhUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50OnRydWUsSFRNTFRhYmxlQ29sRWxl
+bWVudDp0cnVlLEhUTUxUZXh0QXJlYUVsZW1lbnQ6dHJ1ZSxIVE1MVGltZUVsZW1lbnQ6dHJ1ZSxIVE1M
+VGl0bGVFbGVtZW50OnRydWUsSFRNTFRyYWNrRWxlbWVudDp0cnVlLEhUTUxVTGlzdEVsZW1lbnQ6dHJ1
+ZSxIVE1MVW5rbm93bkVsZW1lbnQ6dHJ1ZSxIVE1MVmlkZW9FbGVtZW50OnRydWUsSFRNTERpcmVjdG9y
+eUVsZW1lbnQ6dHJ1ZSxIVE1MRm9udEVsZW1lbnQ6dHJ1ZSxIVE1MRnJhbWVFbGVtZW50OnRydWUsSFRN
+TEZyYW1lU2V0RWxlbWVudDp0cnVlLEhUTUxNYXJxdWVlRWxlbWVudDp0cnVlLEhUTUxFbGVtZW50OmZh
+bHNlLEhUTUxBbmNob3JFbGVtZW50OnRydWUsSFRNTEFyZWFFbGVtZW50OnRydWUsSFRNTEJhc2VFbGVt
+ZW50OnRydWUsQmxvYjpmYWxzZSxIVE1MQm9keUVsZW1lbnQ6dHJ1ZSxDREFUQVNlY3Rpb246dHJ1ZSxD
+aGFyYWN0ZXJEYXRhOnRydWUsQ29tbWVudDp0cnVlLFByb2Nlc3NpbmdJbnN0cnVjdGlvbjp0cnVlLFRl
+eHQ6dHJ1ZSxDU1NTdHlsZURlY2xhcmF0aW9uOnRydWUsTVNTdHlsZUNTU1Byb3BlcnRpZXM6dHJ1ZSxD
+U1MyUHJvcGVydGllczp0cnVlLFhNTERvY3VtZW50OnRydWUsRG9jdW1lbnQ6ZmFsc2UsRE9NRXhjZXB0
+aW9uOnRydWUsRE9NSW1wbGVtZW50YXRpb246dHJ1ZSxET01SZWN0UmVhZE9ubHk6ZmFsc2UsRE9NVG9r
+ZW5MaXN0OnRydWUsRWxlbWVudDpmYWxzZSxBYm9ydFBheW1lbnRFdmVudDp0cnVlLEFuaW1hdGlvbkV2
+ZW50OnRydWUsQW5pbWF0aW9uUGxheWJhY2tFdmVudDp0cnVlLEFwcGxpY2F0aW9uQ2FjaGVFcnJvckV2
+ZW50OnRydWUsQmFja2dyb3VuZEZldGNoQ2xpY2tFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaEV2ZW50
+OnRydWUsQmFja2dyb3VuZEZldGNoRmFpbEV2ZW50OnRydWUsQmFja2dyb3VuZEZldGNoZWRFdmVudDp0
+cnVlLEJlZm9yZUluc3RhbGxQcm9tcHRFdmVudDp0cnVlLEJlZm9yZVVubG9hZEV2ZW50OnRydWUsQmxv
+YkV2ZW50OnRydWUsQ2FuTWFrZVBheW1lbnRFdmVudDp0cnVlLENsaXBib2FyZEV2ZW50OnRydWUsQ2xv
+c2VFdmVudDp0cnVlLEN1c3RvbUV2ZW50OnRydWUsRGV2aWNlTW90aW9uRXZlbnQ6dHJ1ZSxEZXZpY2VP
+cmllbnRhdGlvbkV2ZW50OnRydWUsRXJyb3JFdmVudDp0cnVlLEV4dGVuZGFibGVFdmVudDp0cnVlLEV4
+dGVuZGFibGVNZXNzYWdlRXZlbnQ6dHJ1ZSxGZXRjaEV2ZW50OnRydWUsRm9udEZhY2VTZXRMb2FkRXZl
+bnQ6dHJ1ZSxGb3JlaWduRmV0Y2hFdmVudDp0cnVlLEdhbWVwYWRFdmVudDp0cnVlLEhhc2hDaGFuZ2VF
+dmVudDp0cnVlLEluc3RhbGxFdmVudDp0cnVlLE1lZGlhRW5jcnlwdGVkRXZlbnQ6dHJ1ZSxNZWRpYUtl
+eU1lc3NhZ2VFdmVudDp0cnVlLE1lZGlhUXVlcnlMaXN0RXZlbnQ6dHJ1ZSxNZWRpYVN0cmVhbUV2ZW50
+OnRydWUsTWVkaWFTdHJlYW1UcmFja0V2ZW50OnRydWUsTWVzc2FnZUV2ZW50OnRydWUsTUlESUNvbm5l
+Y3Rpb25FdmVudDp0cnVlLE1JRElNZXNzYWdlRXZlbnQ6dHJ1ZSxNdXRhdGlvbkV2ZW50OnRydWUsTm90
+aWZpY2F0aW9uRXZlbnQ6dHJ1ZSxQYWdlVHJhbnNpdGlvbkV2ZW50OnRydWUsUGF5bWVudFJlcXVlc3RF
+dmVudDp0cnVlLFBheW1lbnRSZXF1ZXN0VXBkYXRlRXZlbnQ6dHJ1ZSxQb3BTdGF0ZUV2ZW50OnRydWUs
+UHJlc2VudGF0aW9uQ29ubmVjdGlvbkF2YWlsYWJsZUV2ZW50OnRydWUsUHJlc2VudGF0aW9uQ29ubmVj
+dGlvbkNsb3NlRXZlbnQ6dHJ1ZSxQcm9taXNlUmVqZWN0aW9uRXZlbnQ6dHJ1ZSxQdXNoRXZlbnQ6dHJ1
+ZSxSVENEYXRhQ2hhbm5lbEV2ZW50OnRydWUsUlRDRFRNRlRvbmVDaGFuZ2VFdmVudDp0cnVlLFJUQ1Bl
+ZXJDb25uZWN0aW9uSWNlRXZlbnQ6dHJ1ZSxSVENUcmFja0V2ZW50OnRydWUsU2VjdXJpdHlQb2xpY3lW
+aW9sYXRpb25FdmVudDp0cnVlLFNlbnNvckVycm9yRXZlbnQ6dHJ1ZSxTcGVlY2hSZWNvZ25pdGlvbkVy
+cm9yOnRydWUsU3BlZWNoUmVjb2duaXRpb25FdmVudDp0cnVlLFNwZWVjaFN5bnRoZXNpc0V2ZW50OnRy
+dWUsU3RvcmFnZUV2ZW50OnRydWUsU3luY0V2ZW50OnRydWUsVHJhY2tFdmVudDp0cnVlLFRyYW5zaXRp
+b25FdmVudDp0cnVlLFdlYktpdFRyYW5zaXRpb25FdmVudDp0cnVlLFZSRGV2aWNlRXZlbnQ6dHJ1ZSxW
+UkRpc3BsYXlFdmVudDp0cnVlLFZSU2Vzc2lvbkV2ZW50OnRydWUsTW9qb0ludGVyZmFjZVJlcXVlc3RF
+dmVudDp0cnVlLFVTQkNvbm5lY3Rpb25FdmVudDp0cnVlLElEQlZlcnNpb25DaGFuZ2VFdmVudDp0cnVl
+LEF1ZGlvUHJvY2Vzc2luZ0V2ZW50OnRydWUsT2ZmbGluZUF1ZGlvQ29tcGxldGlvbkV2ZW50OnRydWUs
+V2ViR0xDb250ZXh0RXZlbnQ6dHJ1ZSxFdmVudDpmYWxzZSxJbnB1dEV2ZW50OmZhbHNlLFN1Ym1pdEV2
+ZW50OmZhbHNlLEV2ZW50VGFyZ2V0OmZhbHNlLEZpbGU6dHJ1ZSxIVE1MRm9ybUVsZW1lbnQ6dHJ1ZSxI
+aXN0b3J5OnRydWUsSFRNTERvY3VtZW50OnRydWUsWE1MSHR0cFJlcXVlc3Q6dHJ1ZSxYTUxIdHRwUmVx
+dWVzdEV2ZW50VGFyZ2V0OmZhbHNlLEltYWdlRGF0YTp0cnVlLExvY2F0aW9uOnRydWUsTW91c2VFdmVu
+dDp0cnVlLERyYWdFdmVudDp0cnVlLFBvaW50ZXJFdmVudDp0cnVlLFdoZWVsRXZlbnQ6dHJ1ZSxEb2N1
+bWVudEZyYWdtZW50OnRydWUsU2hhZG93Um9vdDp0cnVlLERvY3VtZW50VHlwZTp0cnVlLE5vZGU6ZmFs
+c2UsTm9kZUxpc3Q6dHJ1ZSxSYWRpb05vZGVMaXN0OnRydWUsSFRNTFBhcmFncmFwaEVsZW1lbnQ6dHJ1
+ZSxQcm9ncmVzc0V2ZW50OnRydWUsUmVzb3VyY2VQcm9ncmVzc0V2ZW50OnRydWUsSFRNTFNlbGVjdEVs
+ZW1lbnQ6dHJ1ZSxIVE1MVGFibGVFbGVtZW50OnRydWUsSFRNTFRhYmxlUm93RWxlbWVudDp0cnVlLEhU
+TUxUYWJsZVNlY3Rpb25FbGVtZW50OnRydWUsSFRNTFRlbXBsYXRlRWxlbWVudDp0cnVlLENvbXBvc2l0
+aW9uRXZlbnQ6dHJ1ZSxGb2N1c0V2ZW50OnRydWUsS2V5Ym9hcmRFdmVudDp0cnVlLFRleHRFdmVudDp0
+cnVlLFRvdWNoRXZlbnQ6dHJ1ZSxVSUV2ZW50OmZhbHNlLFdpbmRvdzp0cnVlLERPTVdpbmRvdzp0cnVl
+LERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlOnRydWUsU2VydmljZVdvcmtlckdsb2JhbFNjb3BlOnRy
+dWUsU2hhcmVkV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxXb3JrZXJHbG9iYWxTY29wZTp0cnVlLEF0dHI6
+dHJ1ZSxDbGllbnRSZWN0OnRydWUsRE9NUmVjdDp0cnVlLE5hbWVkTm9kZU1hcDp0cnVlLE1vek5hbWVk
+QXR0ck1hcDp0cnVlLElEQktleVJhbmdlOnRydWUsU1ZHU2NyaXB0RWxlbWVudDp0cnVlLFNWR0FFbGVt
+ZW50OnRydWUsU1ZHQW5pbWF0ZUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRlTW90aW9uRWxlbWVudDp0cnVl
+LFNWR0FuaW1hdGVUcmFuc2Zvcm1FbGVtZW50OnRydWUsU1ZHQW5pbWF0aW9uRWxlbWVudDp0cnVlLFNW
+R0NpcmNsZUVsZW1lbnQ6dHJ1ZSxTVkdDbGlwUGF0aEVsZW1lbnQ6dHJ1ZSxTVkdEZWZzRWxlbWVudDp0
+cnVlLFNWR0Rlc2NFbGVtZW50OnRydWUsU1ZHRGlzY2FyZEVsZW1lbnQ6dHJ1ZSxTVkdFbGxpcHNlRWxl
+bWVudDp0cnVlLFNWR0ZFQmxlbmRFbGVtZW50OnRydWUsU1ZHRkVDb2xvck1hdHJpeEVsZW1lbnQ6dHJ1
+ZSxTVkdGRUNvbXBvbmVudFRyYW5zZmVyRWxlbWVudDp0cnVlLFNWR0ZFQ29tcG9zaXRlRWxlbWVudDp0
+cnVlLFNWR0ZFQ29udm9sdmVNYXRyaXhFbGVtZW50OnRydWUsU1ZHRkVEaWZmdXNlTGlnaHRpbmdFbGVt
+ZW50OnRydWUsU1ZHRkVEaXNwbGFjZW1lbnRNYXBFbGVtZW50OnRydWUsU1ZHRkVEaXN0YW50TGlnaHRF
+bGVtZW50OnRydWUsU1ZHRkVGbG9vZEVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNBRWxlbWVudDp0cnVlLFNW
+R0ZFRnVuY0JFbGVtZW50OnRydWUsU1ZHRkVGdW5jR0VsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNSRWxlbWVu
+dDp0cnVlLFNWR0ZFR2F1c3NpYW5CbHVyRWxlbWVudDp0cnVlLFNWR0ZFSW1hZ2VFbGVtZW50OnRydWUs
+U1ZHRkVNZXJnZUVsZW1lbnQ6dHJ1ZSxTVkdGRU1lcmdlTm9kZUVsZW1lbnQ6dHJ1ZSxTVkdGRU1vcnBo
+b2xvZ3lFbGVtZW50OnRydWUsU1ZHRkVPZmZzZXRFbGVtZW50OnRydWUsU1ZHRkVQb2ludExpZ2h0RWxl
+bWVudDp0cnVlLFNWR0ZFU3BlY3VsYXJMaWdodGluZ0VsZW1lbnQ6dHJ1ZSxTVkdGRVNwb3RMaWdodEVs
+ZW1lbnQ6dHJ1ZSxTVkdGRVRpbGVFbGVtZW50OnRydWUsU1ZHRkVUdXJidWxlbmNlRWxlbWVudDp0cnVl
+LFNWR0ZpbHRlckVsZW1lbnQ6dHJ1ZSxTVkdGb3JlaWduT2JqZWN0RWxlbWVudDp0cnVlLFNWR0dFbGVt
+ZW50OnRydWUsU1ZHR2VvbWV0cnlFbGVtZW50OnRydWUsU1ZHR3JhcGhpY3NFbGVtZW50OnRydWUsU1ZH
+SW1hZ2VFbGVtZW50OnRydWUsU1ZHTGluZUVsZW1lbnQ6dHJ1ZSxTVkdMaW5lYXJHcmFkaWVudEVsZW1l
+bnQ6dHJ1ZSxTVkdNYXJrZXJFbGVtZW50OnRydWUsU1ZHTWFza0VsZW1lbnQ6dHJ1ZSxTVkdNZXRhZGF0
+YUVsZW1lbnQ6dHJ1ZSxTVkdQYXRoRWxlbWVudDp0cnVlLFNWR1BhdHRlcm5FbGVtZW50OnRydWUsU1ZH
+UG9seWdvbkVsZW1lbnQ6dHJ1ZSxTVkdQb2x5bGluZUVsZW1lbnQ6dHJ1ZSxTVkdSYWRpYWxHcmFkaWVu
+dEVsZW1lbnQ6dHJ1ZSxTVkdSZWN0RWxlbWVudDp0cnVlLFNWR1NldEVsZW1lbnQ6dHJ1ZSxTVkdTdG9w
+RWxlbWVudDp0cnVlLFNWR1N0eWxlRWxlbWVudDp0cnVlLFNWR1NWR0VsZW1lbnQ6dHJ1ZSxTVkdTd2l0
+Y2hFbGVtZW50OnRydWUsU1ZHU3ltYm9sRWxlbWVudDp0cnVlLFNWR1RTcGFuRWxlbWVudDp0cnVlLFNW
+R1RleHRDb250ZW50RWxlbWVudDp0cnVlLFNWR1RleHRFbGVtZW50OnRydWUsU1ZHVGV4dFBhdGhFbGVt
+ZW50OnRydWUsU1ZHVGV4dFBvc2l0aW9uaW5nRWxlbWVudDp0cnVlLFNWR1RpdGxlRWxlbWVudDp0cnVl
+LFNWR1VzZUVsZW1lbnQ6dHJ1ZSxTVkdWaWV3RWxlbWVudDp0cnVlLFNWR0dyYWRpZW50RWxlbWVudDp0
+cnVlLFNWR0NvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50OnRydWUsU1ZHRkVEcm9wU2hhZG93
+RWxlbWVudDp0cnVlLFNWR01QYXRoRWxlbWVudDp0cnVlLFNWR0VsZW1lbnQ6ZmFsc2V9KQpILlhILiRu
+YXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguUkcuJG5hdGl2ZVN1cGVyY2xhc3NU
+YWc9IkFycmF5QnVmZmVyVmlldyIKSC5WUC4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJW
+aWV3IgpILkRnLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguV0IuJG5hdGl2
+ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5aRy4kbmF0aXZlU3VwZXJjbGFzc1RhZz0i
+QXJyYXlCdWZmZXJWaWV3IgpILlBnLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXci
+fSkoKQpjb252ZXJ0QWxsVG9GYXN0T2JqZWN0KHcpCmNvbnZlcnRUb0Zhc3RPYmplY3QoJCk7KGZ1bmN0
+aW9uKGEpe2lmKHR5cGVvZiBkb2N1bWVudD09PSJ1bmRlZmluZWQiKXthKG51bGwpCnJldHVybn1pZih0
+eXBlb2YgZG9jdW1lbnQuY3VycmVudFNjcmlwdCE9J3VuZGVmaW5lZCcpe2EoZG9jdW1lbnQuY3VycmVu
+dFNjcmlwdCkKcmV0dXJufXZhciBzPWRvY3VtZW50LnNjcmlwdHMKZnVuY3Rpb24gb25Mb2FkKGIpe2Zv
+cih2YXIgcT0wO3E8cy5sZW5ndGg7KytxKXNbcV0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsb25M
+b2FkLGZhbHNlKQphKGIudGFyZ2V0KX1mb3IodmFyIHI9MDtyPHMubGVuZ3RoOysrcilzW3JdLmFkZEV2
+ZW50TGlzdGVuZXIoImxvYWQiLG9uTG9hZCxmYWxzZSl9KShmdW5jdGlvbihhKXt2LmN1cnJlbnRTY3Jp
+cHQ9YQppZih0eXBlb2YgZGFydE1haW5SdW5uZXI9PT0iZnVuY3Rpb24iKWRhcnRNYWluUnVubmVyKEwu
+SXEsW10pCmVsc2UgTC5JcShbXSl9KX0pKCkKLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWlncmF0aW9uLmpz
+Lm1hcAo=
 ''';
diff --git a/tests/language/const/syntax_test.dart b/tests/language/const/syntax_test.dart
index aa33723..355535a 100644
--- a/tests/language/const/syntax_test.dart
+++ b/tests/language/const/syntax_test.dart
@@ -63,7 +63,7 @@
 //        ^
 // [cfe] The const variable 'F3' must be initialized.
 //          ^
-// [cfe] A value of type 'Null' can't be assigned to a variable of type 'int'.
+// [cfe] A value of type 'Null' can't be assigned to a variable of type 'int' because 'Null' is nullable and 'int' isn't.
 
 class Point {
   final x, y;
diff --git a/tests/language/control_flow_collections/await_for_null_test.dart b/tests/language/control_flow_collections/await_for_null_test.dart
index 61fd04c..bd4b28a 100644
--- a/tests/language/control_flow_collections/await_for_null_test.dart
+++ b/tests/language/control_flow_collections/await_for_null_test.dart
@@ -9,13 +9,13 @@
   var a = <int>[await for (var i in nullStream) 1];
   //                                ^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>'.
+  // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>' because 'Stream<int>?' is nullable and 'Stream<dynamic>' isn't.
   var b = <int, int>{await for (var i in nullStream) 1: 1};
   //                                     ^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>'.
+  // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>' because 'Stream<int>?' is nullable and 'Stream<dynamic>' isn't.
   var c = <int>{await for (var i in nullStream) 1};
   //                                ^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>'.
+  // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>' because 'Stream<int>?' is nullable and 'Stream<dynamic>' isn't.
 }
diff --git a/tests/language/control_flow_collections/for_downcast_test.dart b/tests/language/control_flow_collections/for_downcast_test.dart
index a9eda1d..a2d2620 100644
--- a/tests/language/control_flow_collections/for_downcast_test.dart
+++ b/tests/language/control_flow_collections/for_downcast_test.dart
@@ -118,13 +118,13 @@
   var a = <int>[for (var i in nullIterable) 1];
   //                          ^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
   var b = {for (var i in nullIterable) 1: 1};
   //                     ^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
   var c = <int>{for (var i in nullIterable) 1};
   //                          ^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 }
diff --git a/tests/language/control_flow_collections/for_null_condition_test.dart b/tests/language/control_flow_collections/for_null_condition_test.dart
index ebddf4c..018f74a 100644
--- a/tests/language/control_flow_collections/for_null_condition_test.dart
+++ b/tests/language/control_flow_collections/for_null_condition_test.dart
@@ -10,13 +10,13 @@
   var a = <int>[for (; nullBool;) 1];
   //                   ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   var b = <int, int>{for (; nullBool;) 1: 1};
   //                        ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   var c = <int>{for (; nullBool;) 1};
   //                   ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
diff --git a/tests/language/control_flow_collections/if_null_condition_test.dart b/tests/language/control_flow_collections/if_null_condition_test.dart
index bec649f..ca7aa5c 100644
--- a/tests/language/control_flow_collections/if_null_condition_test.dart
+++ b/tests/language/control_flow_collections/if_null_condition_test.dart
@@ -7,15 +7,15 @@
   var a = <int>[if (nullBool) 1];
   //                ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   var b = <int, int>{if (nullBool) 1: 1};
   //                     ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   var c = <int>{if (nullBool) 1};
   //                ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
diff --git a/tests/language/if_null/precedence_test.dart b/tests/language/if_null/precedence_test.dart
index abc0755..574e616 100644
--- a/tests/language/if_null/precedence_test.dart
+++ b/tests/language/if_null/precedence_test.dart
@@ -56,7 +56,7 @@
   // [cfe] Operand of null-aware operation '??' has type 'bool' which excludes null.
   //                                         ^^^^
   // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
-  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'Null' is nullable and 'bool' isn't.
   //                                                 ^^^^
   // [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
 }
diff --git a/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart b/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart
index a0bdcf7..018a408 100644
--- a/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart
+++ b/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart
@@ -57,47 +57,47 @@
     if (nil) {}
     //  ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'Null' is nullable and 'bool' isn't.
     [if (nil) 3];
     //   ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'Null' is nullable and 'bool' isn't.
     nil ? 3 : 4;
 //  ^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'Null' is nullable and 'bool' isn't.
     while (nil) {}
     //     ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'Null' is nullable and 'bool' isn't.
     do {} while (nil);
     //           ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'Null' is nullable and 'bool' isn't.
     nil || true;
 //  ^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
-// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'Null' is nullable and 'bool' isn't.
     nil && true;
 //  ^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
-// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'Null' is nullable and 'bool' isn't.
     true || nil;
     //      ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'Null' is nullable and 'bool' isn't.
     true && nil;
     //      ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'Null' is nullable and 'bool' isn't.
     for (int i = 0; nil; i++) {}
     //              ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'Null' is nullable and 'bool' isn't.
     [for (int i = 0; nil; i++) 3];
     //               ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'Null' is nullable and 'bool' isn't.
   }
   {
     // Check that values of type `Object` are not usable as booleans.
diff --git a/tests/language/nnbd/experiment_release_version/opt_in_test.dart b/tests/language/nnbd/experiment_release_version/opt_in_test.dart
index f715e5f..8152f3d 100644
--- a/tests/language/nnbd/experiment_release_version/opt_in_test.dart
+++ b/tests/language/nnbd/experiment_release_version/opt_in_test.dart
@@ -11,5 +11,5 @@
   int x = null;
   //      ^^^^
   // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'int'.
+  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'int' because 'Null' is nullable and 'int' isn't.
 }
diff --git a/tests/language/nnbd/never/never_null_assignability_error_test.dart b/tests/language/nnbd/never/never_null_assignability_error_test.dart
index a598dfd..cb1a99b 100644
--- a/tests/language/nnbd/never/never_null_assignability_error_test.dart
+++ b/tests/language/nnbd/never/never_null_assignability_error_test.dart
@@ -7,6 +7,7 @@
 
 // This test validates that in a null safe (opted in) library which calls out
 // to another null safe (opted in) library, the static errors around `Never`
+
 // and `Null` that are suppressed when calling out a null safe library from
 // a **legacy** library are correctly reported.  This file is derived from
 // never_null_assignability_weak_test.dart and validates that calls to a
@@ -28,7 +29,7 @@
     takesNever(nil);
     //         ^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'Null' can't be assigned to the parameter type 'Never'.
+    // [cfe] The argument type 'Null' can't be assigned to the parameter type 'Never' because 'Null' is nullable and 'Never' isn't.
     takesNever(never);
     takesNever(3 as dynamic);
     (takesNever as dynamic)(3);
@@ -40,7 +41,7 @@
     takesInt(nil);
     //       ^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'Null' can't be assigned to the parameter type 'int'.
+    // [cfe] The argument type 'Null' can't be assigned to the parameter type 'int' because 'Null' is nullable and 'int' isn't.
     takesInt(nil as dynamic);
     (takesInt as dynamic)(nil);
     (takesInt as dynamic)("hello");
@@ -52,7 +53,7 @@
     takesObject(nil);
     //          ^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'Null' can't be assigned to the parameter type 'Object'.
+    // [cfe] The argument type 'Null' can't be assigned to the parameter type 'Object' because 'Null' is nullable and 'Object' isn't.
     takesObject(nil as dynamic);
     (takesObject as dynamic)(nil);
   }
@@ -74,17 +75,17 @@
     applyTakesNull(takesNever, nil);
     //             ^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Never' isn't.
     applyTakesNull(takesAny, nil);
 
     applyTakesNull(takesInt, nil);
     //             ^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'int' isn't.
     applyTakesNull(takesObject, nil);
     //             ^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Object' isn't.
   }
 
   // Test applying a null safe function of static type void Function(Null)
@@ -95,15 +96,15 @@
     applyTakesNull(takesNever, 3);
     //             ^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Never' isn't.
     applyTakesNull(takesInt, 3);
     //             ^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'int' isn't.
     applyTakesNull(takesObject, 3);
     //             ^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Object' isn't.
     applyTakesNull(takesAny, 3);
   }
 
@@ -139,16 +140,16 @@
     applyTakesNullDynamically(takesNever, nil);
     //                        ^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Never' isn't.
     applyTakesNullDynamically(takesAny, nil);
     applyTakesNullDynamically(takesInt, nil);
     //                        ^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'int' isn't.
     applyTakesNullDynamically(takesObject, nil);
     //                        ^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Object' isn't.
   }
 
   // Test dynamically applying a null safe function of static type
@@ -159,19 +160,19 @@
     applyTakesNullDynamically(takesNever, 3);
     //                        ^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Never' isn't.
     applyTakesNullDynamically(takesInt, 3);
     //                        ^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'int' isn't.
     applyTakesNullDynamically(takesInt, "hello");
     //                        ^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'int' isn't.
     applyTakesNullDynamically(takesObject, 3);
     //                        ^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Object' isn't.
     applyTakesNullDynamically(takesAny, 3);
   }
 
@@ -204,12 +205,12 @@
   // ^
   // [analyzer] unspecified
   //      ^
-  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'Never'.
+  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'Never' because 'Null' is nullable and 'Never' isn't.
   never = nil;
   // ^
   // [analyzer] unspecified
   //      ^
-  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'Never'.
+  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'Never' because 'Null' is nullable and 'Never' isn't.
   nil = never;
   testNullSafeCalls();
   testNullSafeApply();
diff --git a/tests/language/nnbd/operator_type_test.dart b/tests/language/nnbd/operator_type_test.dart
index d9024fc..436ddda 100644
--- a/tests/language/nnbd/operator_type_test.dart
+++ b/tests/language/nnbd/operator_type_test.dart
@@ -27,52 +27,52 @@
   _ = bq && b;
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = b && bq;
   //       ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = bq || b;
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = b || bq;
   //       ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = !bq;
   //   ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = bq ? "a" : "b";
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   if (bq) {}
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   while (bq) {}
   //     ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   do {} while (bq);
   //           ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   for (; bq;) {}
   //     ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   try {
     throw bq;
@@ -84,24 +84,24 @@
   assert(bq);
   //     ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = [if (bq) 1];
   //       ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = [for (; bq;) 1];
   //         ^^
   // [analyzer] unspecified
   //          ^
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   Iterable<int>? iq = maybeNullable([1]);
   for (var v in iq) {}
   //            ^^
   // [analyzer] unspecified
-  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 
   _ = [...iq];
   //      ^
@@ -114,12 +114,12 @@
     await for (var v in sq) {}
     //                  ^^
     // [analyzer] unspecified
-    // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>'.
+    // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>' because 'Stream<int>?' is nullable and 'Stream<dynamic>' isn't.
 
     yield* sq;
     //     ^^
     // [analyzer] unspecified
-    // [cfe] A value of type 'Stream<int>?' can't be assigned to a variable of type 'Stream<Object?>'.
+    // [cfe] A value of type 'Stream<int>?' can't be assigned to a variable of type 'Stream<Object?>' because 'Stream<int>?' is nullable and 'Stream<Object?>' isn't.
   }
 
   foo().toList();
@@ -140,52 +140,52 @@
   _ = bq && b;
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = b && bq;
   //       ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = bq || b;
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = b || bq;
   //       ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = !bq;
   //   ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = bq ? "a" : "b";
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   if (bq) {}
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   while (bq) {}
   //     ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   do {} while (bq);
   //           ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   for (; bq;) {}
   //     ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   try {
     throw bq;
@@ -197,24 +197,24 @@
   assert(bq);
   //     ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = [if (bq) 1];
   //       ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = [for (; bq;) 1];
   //         ^^
   // [analyzer] unspecified
   //          ^
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   Iterable<int>? iq = maybeNullable([1]);
   for (var v in iq) {}
   //            ^^
   // [analyzer] unspecified
-  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 
   _ = [...iq];
   //      ^^
@@ -226,12 +226,12 @@
     await for (var v in sq) {}
     //                  ^^
     // [analyzer] unspecified
-    // [cfe] The type 'Stream<Object?>?' used in the 'for' loop must implement 'Stream<dynamic>'.
+    // [cfe] The type 'Stream<Object?>?' used in the 'for' loop must implement 'Stream<dynamic>' because 'Stream<Object?>?' is nullable and 'Stream<dynamic>' isn't.
 
     yield* sq;
     //     ^^
     // [analyzer] unspecified
-    // [cfe] A value of type 'SQ' can't be assigned to a variable of type 'Stream<Object?>'.
+    // [cfe] A value of type 'SQ' can't be assigned to a variable of type 'Stream<Object?>' because 'Stream<Object?>?' is nullable and 'Stream<Object?>' isn't.
   }
 
   foo<Stream<Object?>>().toList();
@@ -253,7 +253,7 @@
     return cq;
     //     ^^
     // [analyzer] unspecified
-    // [cfe] A value of type 'C?' can't be returned from a function with return type 'C'.
+    // [cfe] A value of type 'C?' can't be returned from a function with return type 'C' because 'C?' is nullable and 'C' isn't.
   }
 }
 
diff --git a/tests/language/nnbd/syntax/class_member_declarations_error_test.dart b/tests/language/nnbd/syntax/class_member_declarations_error_test.dart
index 607e46f..e1fcf51 100644
--- a/tests/language/nnbd/syntax/class_member_declarations_error_test.dart
+++ b/tests/language/nnbd/syntax/class_member_declarations_error_test.dart
@@ -34,7 +34,7 @@
   // [cfe] The modifier 'late' should be before the modifier 'final'.
   //                        ^^^^
   // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'A'.
+  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'A' because 'Null' is nullable and 'A' isn't.
 
   covariant late x15;
   //        ^^^^
diff --git a/tests/language/nnbd/typedef/typedef_error_test.dart b/tests/language/nnbd/typedef/typedef_error_test.dart
index 17488a5..e6e1a82 100644
--- a/tests/language/nnbd/typedef/typedef_error_test.dart
+++ b/tests/language/nnbd/typedef/typedef_error_test.dart
@@ -14,7 +14,7 @@
   F f = null; // typedefs from opted out libraries are treated as non-nullable
   //    ^^^^
   // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'int Function(int)' because 'Null' is nullable and 'int Function(int)' isn't.
 
   f = takesNonNullable; // F is int* Function(int*)
   f(null); // F is int* Function(int*)
diff --git a/tests/language/string/multiline_newline_test.dart b/tests/language/string/multiline_newline_test.dart
index 75bf78c..cafa05e 100644
--- a/tests/language/string/multiline_newline_test.dart
+++ b/tests/language/string/multiline_newline_test.dart
@@ -69,37 +69,37 @@
   const c4 = c1 ? 1 : 2;
   //         ^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   Expect.equals(1, c4);
 
   const c5 = c2 ? 2 : 3;
   //         ^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   Expect.equals(2, c5);
 
   const c6 = c3 ? 3 : 4;
   //         ^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   Expect.equals(3, c6);
 
   const c4r = c1r ? 1 : 2;
   //          ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   Expect.equals(1, c4r);
 
   const c5r = c2r ? 2 : 3;
   //          ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   Expect.equals(2, c5r);
 
   const c6r = c3r ? 3 : 4;
   //          ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   Expect.equals(3, c6r);
 
   const c7 =
@@ -136,38 +136,38 @@
   const c10 = c7 ? 1 : 2;
   //          ^^
   // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   //          ^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   const c11 = c8 ? 2 : 3;
   //          ^^
   // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   //          ^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   const c12 = c9 ? 3 : 4;
   //          ^^
   // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   //          ^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
 
   const c10r = c7r ? 1 : 2;
   //           ^^^
   // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   //           ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   const c11r = c8r ? 2 : 3;
   //           ^^^
   // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   //           ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   const c12r = c9r ? 3 : 4;
   //           ^^^
   // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   //           ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
 }
diff --git a/tools/VERSION b/tools/VERSION
index e61b6da..4e8ed30 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 276
+PRERELEASE 277
 PRERELEASE_PATCH 0
\ No newline at end of file